<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[swfz[:memo]'s RSS Feed]]></title><description><![CDATA[Today I Learned]]></description><link>https://til.swfz.io</link><generator>GatsbyJS</generator><lastBuildDate>Sun, 19 Apr 2026 00:30:49 GMT</lastBuildDate><item><title><![CDATA[スプレッドシートのエディタ内でコメント的な文字列を残す]]></title><description><![CDATA[あるていど定期的には使うが、データの公開範囲をコントロールしたいとか、BigQueryなどのサービスにデータを入れてまでやるほどではない簡単な集計や分析などでは、スプレッドシートに関数をいろいろ書いて済ませてしまうことがよくある そもそも読めないほど複雑になるのであればGAS…]]></description><link>https://til.swfz.io/entries/spreadsheet_comment/</link><guid isPermaLink="false">https://til.swfz.io/entries/spreadsheet_comment/</guid><pubDate>Sun, 26 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;あるていど定期的には使うが、データの公開範囲をコントロールしたいとか、BigQueryなどのサービスにデータを入れてまでやるほどではない簡単な集計や分析などでは、スプレッドシートに関数をいろいろ書いて済ませてしまうことがよくある&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;そもそも読めないほど複雑になるのであればGASなりスクリプトなりでコード書いて処理したほうがよい場合もあるが…&lt;/p&gt;
&lt;p&gt;コメント機能があるといくらか楽になるなーって場面に結構遭遇しているのでそういう機能がないかちょっと調べたら見つかった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://support.google.com/docs/answer/3094138?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;T - Google ドキュメント エディタ ヘルプ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://support.google.com/docs/answer/3093357?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;N - Google ドキュメント エディタ ヘルプ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2つを組み合わせることでコメント的なもの（セルの内容に影響を与えず、メモ的な感じ）を残すことが可能になる&lt;/p&gt;
&lt;h2&gt;例&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;=SUM(A1:A)&amp;amp;T(N(&quot;A列の値をすべて足した値&quot;))&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;各関数の詳細な挙動はドキュメントを読むのが一番良いがポイントだけピックアップすると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;N&lt;/code&gt;は指定された引数を数値として返すが、文字列を渡すと&lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;を返す&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;T&lt;/code&gt;は指定された引数をテキストとして返すが、&lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;などの数字を渡すと何もない空白を返す、&lt;code class=&quot;language-text&quot;&gt;FALSE&lt;/code&gt;などの真偽値でも空白を返す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この2つの特性を利用する&lt;/p&gt;
&lt;p&gt;これらの関数を組み合わせ、本来の計算結果と結合させてしまえば特にセルの内容には影響なくテキストを残すことが可能になる&lt;/p&gt;
&lt;p&gt;複数行に渡る関数の組み合わせの処理を書いたりした場合など、行末にこれらを結合させておけばそれこそコメントっぽくなる&lt;/p&gt;
&lt;p&gt;かなり便利！&lt;/p&gt;
&lt;h2&gt;もう少し複雑な例&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f90f220067a7b9044feccdeba3a1810e/5eb90/spreadsheet_comment01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.21621621621622%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABWklEQVR42o2RyY6bQBRF+f9PyirLpJVVos4kG0NDTZihMBSzffKgI0XKyk+6XFQl7j3oRdu2sc80TdRVRR96hjkwTIF5mRjnQXzm8XjwzET7436/s64bU5CQUUKmkW68iVq6oWXbVp6dI3BvvwvpP4rHf3p+oi4MbOtK4wd+XDyZ6/G3kdqPNO10aH/3beDWBdpbLwrvans5G+Tu3fu+J0qU5+WrExlef77xO7aktuakHKmriY24bUnzmjw3JKkifdNkueWSZBhbcjolaFPKvSKyRcuHz4pP3yzTOLAuy7GEYzFLIMwd07IKZcCYXGRQKqcoCtI0oa5rkiShkoUqpYnM38CPLxeMECmh064h1xV7mdLSbGoyIdZayUeKLMuw1hLH8RF0Pp+5Xq9CmBO5wvPle8HrL03ra5yzlOVVfkVLeyVE4lUpAUbOy4PMOXcE7QXee3FN0zRH6B/N5GJFJYiKYQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f90f220067a7b9044feccdeba3a1810e/cbe2e/spreadsheet_comment01.webp 148w,
/static/f90f220067a7b9044feccdeba3a1810e/3084c/spreadsheet_comment01.webp 295w,
/static/f90f220067a7b9044feccdeba3a1810e/5ca24/spreadsheet_comment01.webp 590w,
/static/f90f220067a7b9044feccdeba3a1810e/dad35/spreadsheet_comment01.webp 885w,
/static/f90f220067a7b9044feccdeba3a1810e/2baf0/spreadsheet_comment01.webp 1180w,
/static/f90f220067a7b9044feccdeba3a1810e/68d4c/spreadsheet_comment01.webp 1612w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f90f220067a7b9044feccdeba3a1810e/12f09/spreadsheet_comment01.png 148w,
/static/f90f220067a7b9044feccdeba3a1810e/e4a3f/spreadsheet_comment01.png 295w,
/static/f90f220067a7b9044feccdeba3a1810e/fcda8/spreadsheet_comment01.png 590w,
/static/f90f220067a7b9044feccdeba3a1810e/efc66/spreadsheet_comment01.png 885w,
/static/f90f220067a7b9044feccdeba3a1810e/c83ae/spreadsheet_comment01.png 1180w,
/static/f90f220067a7b9044feccdeba3a1810e/5eb90/spreadsheet_comment01.png 1612w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f90f220067a7b9044feccdeba3a1810e/fcda8/spreadsheet_comment01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;結果が数値を期待する箇所では、コメント処理を結合させてしまうと文字列として扱われてしまうため、見た目が数値用の右寄せから左寄せになってしまったりするので注意が必要&lt;/p&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;スプレッドシート内で配列処理とかを書いていると「あれ?この列はFだっけ?Gだっけ?」など座標と文字列や数字をマッピングさせるのがいちいちたいへんで読むたびに脳内で変換処理を入れるのでかなり時間を使う&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;ある程度定型な処理であれば名前付き関数を用意してわかりやすいように定義してしまうのもありだが、やはりその場にコメントとして「この処理はこの列（◯◯の数値）を△している」というのが残っているだけでかなり負担が減る&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;まぁ、コメントと実態が乖離しているとまたそれはそれでたいへんなので適切な用法用量で使うのが良さそう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[plasmo使っているリポジトリでCIとローカル型チェックの結果が合わない]]></title><description><![CDATA[Plasmo使ってCrome拡張を開発している時の話 CIで型チェックを入れたらCI…]]></description><link>https://til.swfz.io/entries/typecheck_failed_in_ci_with_plasmo/</link><guid isPermaLink="false">https://til.swfz.io/entries/typecheck_failed_in_ci_with_plasmo/</guid><pubDate>Tue, 14 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Plasmo使ってCrome拡張を開発している時の話&lt;/p&gt;
&lt;p&gt;CIで型チェックを入れたらCIだと落ちるがローカルだと通る状態になっていた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;型チェックのコマンド&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;tsc &lt;span class=&quot;token parameter variable&quot;&gt;--noEmit&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/88dc2a41c5ff2746dbee82b85129a669/9937c/typecheck_failed_in_ci_with_plasmo01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 45.27027027027027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABK0lEQVR42mWRa1KEMBCEucmWwgIh5Am41mp5/1uN3UOCUX90ZRg6X3qS7t2sEkyQHHZJflPFNUmgbEKddQ2l55dw+tyG76g9Ozkx/SxmMNI9JyvJeNlhqtpclmSxEZszNmQbdY2EoT7CcfYhehbCXidV95ytRAAzkuxIeUCsuTEWYKJsAUI8cGNKeCg3rT/ATwAzTTAQtjdGhXG1SVV7PHjDyPX/Otq/QI58mqgW2IoJOe4eTg+9fnYyv4z/ExKoUCS80mA0jt8C1afXkhTIB/0F/KjAOobLTapcwOlKXSep/10zrgK/zDmy3h8vm8AyLmv2jvLyG8CPeMgbVPthXvHK06UuAeZxkveHpPSQgNXB6JBiWaL0vZFhWFS1HsdVhn6R+2C1d7vdL30D2hUT9hfb334AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/88dc2a41c5ff2746dbee82b85129a669/cbe2e/typecheck_failed_in_ci_with_plasmo01.webp 148w,
/static/88dc2a41c5ff2746dbee82b85129a669/3084c/typecheck_failed_in_ci_with_plasmo01.webp 295w,
/static/88dc2a41c5ff2746dbee82b85129a669/5ca24/typecheck_failed_in_ci_with_plasmo01.webp 590w,
/static/88dc2a41c5ff2746dbee82b85129a669/dad35/typecheck_failed_in_ci_with_plasmo01.webp 885w,
/static/88dc2a41c5ff2746dbee82b85129a669/df6ba/typecheck_failed_in_ci_with_plasmo01.webp 1156w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/88dc2a41c5ff2746dbee82b85129a669/12f09/typecheck_failed_in_ci_with_plasmo01.png 148w,
/static/88dc2a41c5ff2746dbee82b85129a669/e4a3f/typecheck_failed_in_ci_with_plasmo01.png 295w,
/static/88dc2a41c5ff2746dbee82b85129a669/fcda8/typecheck_failed_in_ci_with_plasmo01.png 590w,
/static/88dc2a41c5ff2746dbee82b85129a669/efc66/typecheck_failed_in_ci_with_plasmo01.png 885w,
/static/88dc2a41c5ff2746dbee82b85129a669/9937c/typecheck_failed_in_ci_with_plasmo01.png 1156w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/88dc2a41c5ff2746dbee82b85129a669/fcda8/typecheck_failed_in_ci_with_plasmo01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一部抜粋&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Error: src/components/sample.tsx(17,7): error TS2322: Type &apos;string&apos; is not assignable to type &apos;never&apos;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;すべて&lt;code class=&quot;language-text&quot;&gt;sendToBackground&lt;/code&gt;の引数で&lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt;を指定している部分&lt;/p&gt;
&lt;p&gt;最初全然意味がわからなかったがいろいろみていったら納得行くまでには落とし込めたのでメモ&lt;/p&gt;
&lt;h2&gt;tsconfig.json&lt;/h2&gt;
&lt;p&gt;これはどこかの記事から引っ張ってきたやつだったはず…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;extends&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;plasmo/templates/tsconfig.base&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;exclude&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;node_modules&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;include&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.plasmo/index.d.ts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./**/*.ts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./**/*.tsx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;compilerOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;jsx&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react-jsx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;strict&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;forceConsistentCasingInFileNames&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;noUnusedLocals&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;noUnusedParameters&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;isolatedModules&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;verbatimModuleSyntax&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;noUncheckedIndexedAccess&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;paths&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;~*&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;baseUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;よく見ると、&lt;code class=&quot;language-text&quot;&gt;include&lt;/code&gt;に&lt;code class=&quot;language-text&quot;&gt;.plasmo/index.d.ts&lt;/code&gt;という指定がある…&lt;/p&gt;
&lt;p&gt;で、これは何かというと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.plasmo/index.d.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./process.env&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./messaging&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;追う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.plasmo/messaging.d.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@plasmohq/messaging&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MmMetadata&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token string-property property&quot;&gt;&quot;batchConnector&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token string-property property&quot;&gt;&quot;connector&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token string-property property&quot;&gt;&quot;forwarder&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MpMetadata&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@plasmohq/messaging&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MessagesMetadata&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MmMetadata&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PortsMetadata&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MpMetadata&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;plasmoにより自動生成されているファイル&lt;/p&gt;
&lt;p&gt;なるほどー…&lt;/p&gt;
&lt;p&gt;型定義をしている&lt;/p&gt;
&lt;h2&gt;.plasmoディレクトリ&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;.plasmo&lt;/code&gt;ディレクトリは、plasmo devなりbuildなり何かしらコマンドを打つと生成される&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;.gitignore&lt;/code&gt;にも記載されていたのでバージョン管理的には除外したいディレクトリのよう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.gitignore&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.plasmo&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ローカルとCIで差分が出る原因&lt;/h3&gt;
&lt;p&gt;CIでは事前にbuildやdevなどのコマンドは実行せず&lt;code class=&quot;language-text&quot;&gt;tsc --noEmit&lt;/code&gt;を実行しているため、先の型定義が生成されないから結果が異なりエラーとなると…&lt;/p&gt;
&lt;p&gt;plasmoでは特定ディレクトリにMessaging系のハンドラを置く、など規約が決まっていてその規約をもとにこの&lt;code class=&quot;language-text&quot;&gt;interface MmMetadata&lt;/code&gt;などの内容が生成されるよう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;plasmohq/messaging&lt;/code&gt;の型定義を拡張させる記述がある(&lt;code class=&quot;language-text&quot;&gt;declare module&lt;/code&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;現在の対象ディレクトリのファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ ls src/background/messages/
batchConnector.ts connector.ts forwarder.ts&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Mm&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;messages&lt;/code&gt;、おそらく&lt;code class=&quot;language-text&quot;&gt;Mp&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;ports&lt;/code&gt;だと思われる、自分は現在Portsによるメッセージングは使っていないので追加記述はない&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;sendToBackground&lt;/code&gt;を使うときに&lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt;プロパティを存在しないファイル名にすると型チェックで怒られていたのはこういうことをしていたから&lt;/p&gt;
&lt;p&gt;対象ディレクトリを見に行って存在するファイル名から型定義に落とし込んでいるっていうことみたい&lt;/p&gt;
&lt;h3&gt;どこで型定義ファイルを作っているのか&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/PlasmoHQ/plasmo/blob/484d2b99ade2094ebb677d6fe4f6ec97422fe260/cli/plasmo/src/features/background-service-worker/bgsw-messaging-declaration.ts#L22&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;plasmo/cli/plasmo/src/features/background-service-worker/bgsw-messaging-declaration.ts at 484d2b99ade2094ebb677d6fe4f6ec97422fe260 · PlasmoHQ/plasmo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この辺っぽい&lt;/p&gt;
&lt;p&gt;環境変数なりオプションなりで何かしら差し込んでやれる余地はあるか確認したが、何か差し込めそうなものもなさそう&lt;/p&gt;
&lt;h2&gt;解決方法&lt;/h2&gt;
&lt;p&gt;ということで、不本意ではあるが&lt;code class=&quot;language-text&quot;&gt;.gitignore&lt;/code&gt;を修正して都度生成される型定義だけGit管理する運用にした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.gitignore&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;# plasmo  
&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;.plasmo  
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;.plasmo/*  
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;!.plasmo/  
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;!.plasmo/index.d.ts  
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;!.plasmo/messaging.d.ts&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;その後ドキュメント読み直してたら書いてあった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.plasmo.com/framework/messaging#3-generate-static-types&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Messaging API – Plasmo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;読んだ気がするが実際にそういう場面に遭遇しないとピンとこないものだな…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[denoでインストールしたコマンドのリストを見たい]]></title><description><![CDATA[コマンドはなさそうだった helpを見ると次のような記述があった この順序で指定のあるディレクトリに保存される 自分の環境だとに指定があった miseを使っているのでそこで設定されているみたい Denoのバージョンが上がるとディレクトリも変わるのでとなる なのでDeno…]]></description><link>https://til.swfz.io/entries/deno_installed_commandlist/</link><guid isPermaLink="false">https://til.swfz.io/entries/deno_installed_commandlist/</guid><pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;コマンドはなさそうだった&lt;/p&gt;
&lt;p&gt;helpを見ると次のような記述があった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ deno &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
The installation root is determined, &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; order of precedence:
  - &lt;span class=&quot;token parameter variable&quot;&gt;--root&lt;/span&gt; option
  - DENO_INSTALL_ROOT environment variable
  - &lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.deno&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この順序で指定のあるディレクトリに保存される&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$DENO_INSTALL_ROOT&lt;/span&gt;
/home/user/.local/share/mise/installs/deno/2.0.6/.deno

$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;
/home/user&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;自分の環境だと&lt;code class=&quot;language-text&quot;&gt;DENO_INSTALL_ROOT&lt;/code&gt;に指定があった&lt;/p&gt;
&lt;p&gt;miseを使っているのでそこで設定されているみたい&lt;/p&gt;
&lt;p&gt;Denoのバージョンが上がるとディレクトリも変わるので&lt;code class=&quot;language-text&quot;&gt;command not found&lt;/code&gt;となる&lt;/p&gt;
&lt;p&gt;なのでDenoのバージョンが上がればインストールし直すって感じか&lt;/p&gt;
&lt;h2&gt;コマンドリストの確認&lt;/h2&gt;
&lt;p&gt;指定があったディレクトリの&lt;code class=&quot;language-text&quot;&gt;bin&lt;/code&gt;ディレクトリを見にいけば良い&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; ~/.local/share/mise/installs/deno/*/.deno/bin
/home/user/.local/share/mise/installs/deno/2.0.6/.deno/bin:
deployctl*  logviewer*

/home/user/.local/share/mise/installs/deno/2.0/.deno/bin:
deployctl*  logviewer*

/home/user/.local/share/mise/installs/deno/2/.deno/bin:
deployctl*  logviewer*

/home/user/.local/share/mise/installs/deno/latest/.deno/bin:
deployctl*  logviewer*&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;全バージョンでのリスト&lt;/p&gt;
&lt;p&gt;現状使っているDenoバージョンでのコマンドリストを見たい場合は&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$DENO_INSTALL_ROOT&lt;/span&gt;/bin&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で良い&lt;/p&gt;
&lt;h3&gt;蛇足&lt;/h3&gt;
&lt;p&gt;miseの仕様っぽいが、&lt;code class=&quot;language-text&quot;&gt;latest&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;2&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;2.0&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;2.0.6&lt;/code&gt;へのシンボリックリンクだった&lt;/p&gt;
&lt;p&gt;そして過去にインストールしたバージョンのコマンドも見ることができるかと思っていたができなかった&lt;/p&gt;
&lt;p&gt;古いバージョンのディレクトリはmiseにより削除されている模様&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;miseのバージョン&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mise &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2024.11&lt;/span&gt;.37 linux-x64 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;7ac5ab3 &lt;span class=&quot;token number&quot;&gt;2024&lt;/span&gt;-11-30&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;まぁ必要なものだけ入れ直してねって話ではあるけど、&lt;code class=&quot;language-text&quot;&gt;upgrade&lt;/code&gt;まえに確認はしておきたいやつ&lt;/p&gt;
&lt;h2&gt;環境変数指定がない場合&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.deno/bin&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[GitHub GraphQL APIのContributionの仕様を調べてみた]]></title><description><![CDATA[Kusa Imageではサーバ側でGitHubのGraphQL APIを利用している 勝手に1年分?のデータがしっかり返ってくるんだろうと思っていたが、いくつか出力した画像を確認したらGitHubで閲覧できる草と微妙に差がありそう…とういことで調べてみた よく調べてみると正確に…]]></description><link>https://til.swfz.io/entries/github_contribution_api_spec/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_contribution_api_spec/</guid><pubDate>Tue, 24 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://kusa-image.deno.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kusa Image&lt;/a&gt;ではサーバ側でGitHubのGraphQL APIを利用している&lt;/p&gt;
&lt;p&gt;勝手に1年分?のデータがしっかり返ってくるんだろうと思っていたが、いくつか出力した画像を確認したらGitHubで閲覧できる草と微妙に差がありそう…とういことで調べてみた&lt;/p&gt;
&lt;p&gt;よく調べてみると正確に1年分ではなさそうという話&lt;/p&gt;
&lt;h2&gt;公式Doc&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/graphql/reference/objects#contributionscollection&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;オブジェクト - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一応読んだうえで調べた&lt;/p&gt;
&lt;h2&gt;GraphQLのQuery&lt;/h2&gt;
&lt;p&gt;下記のクエリを叩いている&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    query($user:String!) {
      user(login: $user){
        contributionsCollection&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;to &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;(to:&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;to&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;T00:00:00&quot;)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; {
          contributionCalendar {
            totalContributions
            colors
            isHalloween
            weeks {
              contributionDays {
                color
                contributionCount
                contributionLevel
                date
              }
            }
          }
        }
      }
    }
  &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;to&lt;/code&gt;には&lt;code class=&quot;language-text&quot;&gt;YYYY-MM-DD&lt;/code&gt;の形式で日付が渡される&lt;/p&gt;
&lt;h2&gt;デバッグしてみた&lt;/h2&gt;
&lt;p&gt;このデバッグ結果を出すまでにもかなりいろいろためしたがメモ残してなかったのでこれだけ&lt;/p&gt;
&lt;p&gt;上記のクエリで受け取ったレスポンスを数年分集計してログに出してみた&lt;/p&gt;
&lt;h3&gt;検証コード&lt;/h3&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;一部抜粋なので全然何のこと?って感じだと思うけど一応載せておく&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; weeks &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionsCollection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionCalendar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;weeks&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; weeks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionDays&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;to:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;year&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;-12-31&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;, 日数: &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; len&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;, 週数: &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; weeks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;, 最後&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; weeks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionDays&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;: &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; weeks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionDays&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionCount&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;, 最初&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; weeks&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionDays&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;: &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; weeks&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionDays&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionCount&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;, 最終週: &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; weeks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contributionDays&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2044&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2040&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2036&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2032&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2028&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2024&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2020&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2016&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2012&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2008&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2004&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1996&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;year&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;閏年&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;出力の内容&lt;/h3&gt;
&lt;p&gt;「to」は上記クエリに渡しているパラメータ&lt;/p&gt;
&lt;p&gt;「日数」は返ってきたレスポンスの総日数&lt;/p&gt;
&lt;p&gt;「週数」は返ってきたレスポンスの総週数&lt;/p&gt;
&lt;p&gt;「最初」の項目は各コントリビューションのデータの最初の日付とcontributionCount&lt;/p&gt;
&lt;p&gt;「最後」の項目は各コントリビューションのデータの最後の日付とcontributionCount&lt;/p&gt;
&lt;p&gt;「最終週」の項目は最終週の配列のlength、1なら日曜で終わり、2なら月曜日で終わり、要は今のクエリだと&lt;code class=&quot;language-text&quot;&gt;to&lt;/code&gt;の日付が何曜日か、1が日曜で7が土曜&lt;/p&gt;
&lt;p&gt;最後にうるう年かどうかのフラグ、これは調べて決め打ちでチェックした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;to: 2024-12-31 , 日数: 367 , 週数: 53 , 最後 2024-12-31 : 0 , 最初 2023-12-31 : 10 , 最終週: 3 閏年  
to: 2023-12-31 , 日数: 365 , 週数: 53 , 最後 2023-12-31 : 10 , 最初 2023-01-01 : 3 , 最終週: 1  
to: 2022-12-31 , 日数: 366 , 週数: 53 , 最後 2022-12-31 : 15 , 最初 2021-12-31 : 11 , 最終週: 7  
to: 2021-12-31 , 日数: 366 , 週数: 53 , 最後 2021-12-31 : 11 , 最初 2020-12-31 : 4 , 最終週: 6  
to: 2020-12-31 , 日数: 367 , 週数: 53 , 最後 2020-12-31 : 4 , 最初 2019-12-31 : 0 , 最終週: 5 閏年  
to: 2019-12-31 , 日数: 366 , 週数: 53 , 最後 2019-12-31 : 0 , 最初 2018-12-31 : 0 , 最終週: 3  
to: 2018-12-31 , 日数: 366 , 週数: 53 , 最後 2018-12-31 : 0 , 最初 2017-12-31 : 2 , 最終週: 2  
to: 2017-12-31 , 日数: 365 , 週数: 53 , 最後 2017-12-31 : 2 , 最初 2017-01-01 : 0 , 最終週: 1  
to: 2016-12-31 , 日数: 367 , 週数: 53 , 最後 2016-12-31 : 0 , 最初 2015-12-31 : 4 , 最終週: 7 閏年  
to: 2015-12-31 , 日数: 366 , 週数: 53 , 最後 2015-12-31 : 4 , 最初 2014-12-31 : 0 , 最終週: 5  
to: 2014-12-31 , 日数: 366 , 週数: 53 , 最後 2014-12-31 : 0 , 最初 2013-12-31 : 0 , 最終週: 4  
to: 2013-12-31 , 日数: 366 , 週数: 53 , 最後 2013-12-31 : 0 , 最初 2012-12-31 : 0 , 最終週: 3  
to: 2012-12-31 , 日数: 366 , 週数: 53 , 最後 2012-12-31 : 0 , 最初 2012-01-01 : 0 , 最終週: 2 閏年  
to: 2011-12-31 , 日数: 366 , 週数: 53 , 最後 2011-12-31 : 0 , 最初 2010-12-31 : 0 , 最終週: 7  
to: 2010-12-31 , 日数: 366 , 週数: 53 , 最後 2010-12-31 : 0 , 最初 2009-12-31 : 0 , 最終週: 6  
to: 2009-12-31 , 日数: 366 , 週数: 53 , 最後 2009-12-31 : 0 , 最初 2008-12-31 : 0 , 最終週: 5  
to: 2008-12-31 , 日数: 367 , 週数: 53 , 最後 2008-12-31 : 0 , 最初 2007-12-31 : 0 , 最終週: 4 閏年  
to: 2007-12-31 , 日数: 366 , 週数: 53 , 最後 2007-12-31 : 0 , 最初 2006-12-31 : 0 , 最終週: 2  
to: 2006-12-31 , 日数: 365 , 週数: 53 , 最後 2006-12-31 : 0 , 最初 2006-01-01 : 0 , 最終週: 1  
to: 2005-12-31 , 日数: 366 , 週数: 53 , 最後 2005-12-31 : 0 , 最初 2004-12-31 : 0 , 最終週: 7  
to: 2004-12-31 , 日数: 367 , 週数: 53 , 最後 2004-12-31 : 0 , 最初 2003-12-31 : 0 , 最終週: 6 閏年  
to: 2003-12-31 , 日数: 366 , 週数: 53 , 最後 2003-12-31 : 0 , 最初 2002-12-31 : 0 , 最終週: 4  
to: 2002-12-31 , 日数: 366 , 週数: 53 , 最後 2002-12-31 : 0 , 最初 2001-12-31 : 0 , 最終週: 3  
to: 2001-12-31 , 日数: 366 , 週数: 53 , 最後 2001-12-31 : 0 , 最初 2000-12-31 : 0 , 最終週: 2  
to: 2000-12-31 , 日数: 365 , 週数: 53 , 最後 2000-12-31 : 0 , 最初 2000-01-02 : 0 , 最終週: 1 閏年  
to: 1999-12-31 , 日数: 366 , 週数: 53 , 最後 1999-12-31 : 0 , 最初 1998-12-31 : 0 , 最終週: 6  
to: 1998-12-31 , 日数: 366 , 週数: 53 , 最後 1998-12-31 : 0 , 最初 1997-12-31 : 0 , 最終週: 5  
to: 1997-12-31 , 日数: 366 , 週数: 53 , 最後 1997-12-31 : 0 , 最初 1996-12-31 : 0 , 最終週: 4  
to: 1996-12-31 , 日数: 367 , 週数: 53 , 最後 1996-12-31 : 0 , 最初 1995-12-31 : 0 , 最終週: 3 閏年  
to: 1995-12-31 , 日数: 365 , 週数: 53 , 最後 1995-12-31 : 0 , 最初 1995-01-01 : 0 , 最終週: 1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;仕様の考察&lt;/h2&gt;
&lt;p&gt;なんとか勝手に納得いくところまで来た&lt;/p&gt;
&lt;p&gt;APIの仕様を推察すると&lt;/p&gt;
&lt;p&gt;与えられた範囲パラメータを元に&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;53週分表示（これは固定）&lt;/li&gt;
&lt;li&gt;366日分（うるう年の場合は367）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を返すようにしているっぽい&lt;/p&gt;
&lt;h3&gt;365日分の年は?&lt;/h3&gt;
&lt;p&gt;2023年、2017年は12/31が日曜の年&lt;/p&gt;
&lt;p&gt;日曜が最終日なので週のレコード数は1&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3289c9d8973ebf18ed15362c993882ce/20c85/github_contribution_api_spec01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.945945945945947%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAABB0lEQVR42iWQbU+CYBSG+f+/w96mLpVlhkLLXC/LOcqkGWAzXx4YyBSQUFtXT/Th7Nz3dc59Phwl3saIlccyWBLGYVHrbE26T4nzmHT337f7jGSXECURm2wjWUL+nZPmKYnUfzuHnwPKQAw4so6pjc/piDbd4AbD07n2DHphD22moQud++iumJffKqiOKlkHQxg0p01uwy6tRQv/y0fpz/uUJ2XUzwZtIcO+jiauqEhW+6hRdSrFofqkTum1JIOXaEuNU/ekYFW7SnNxwZl1huu5KEEW8DTtY3omVmjhblzGqzHO2i68Hb1L7WAFFubcZJbOsFc2L/6QkTfiIXik8awyXAyLl/wC850Z/2h6PXYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/3289c9d8973ebf18ed15362c993882ce/cbe2e/github_contribution_api_spec01.webp 148w,
/static/3289c9d8973ebf18ed15362c993882ce/3084c/github_contribution_api_spec01.webp 295w,
/static/3289c9d8973ebf18ed15362c993882ce/5ca24/github_contribution_api_spec01.webp 590w,
/static/3289c9d8973ebf18ed15362c993882ce/dad35/github_contribution_api_spec01.webp 885w,
/static/3289c9d8973ebf18ed15362c993882ce/5375e/github_contribution_api_spec01.webp 999w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/3289c9d8973ebf18ed15362c993882ce/12f09/github_contribution_api_spec01.png 148w,
/static/3289c9d8973ebf18ed15362c993882ce/e4a3f/github_contribution_api_spec01.png 295w,
/static/3289c9d8973ebf18ed15362c993882ce/fcda8/github_contribution_api_spec01.png 590w,
/static/3289c9d8973ebf18ed15362c993882ce/efc66/github_contribution_api_spec01.png 885w,
/static/3289c9d8973ebf18ed15362c993882ce/20c85/github_contribution_api_spec01.png 999w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/3289c9d8973ebf18ed15362c993882ce/fcda8/github_contribution_api_spec01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;この画像の右端部分&lt;/p&gt;
&lt;p&gt;そこを起点に366日分並べていくと54週になってしまうためカットされているので365日分のレスポンスが返ってくると思われる&lt;/p&gt;
&lt;p&gt;カットしても1/1スタートになるため1年分は担保できているっていう感じっぽい?&lt;/p&gt;
&lt;p&gt;それなら閏年かつ12/31が日曜日のときはどうなるの?と思い対象期間を伸ばしてだしてみたところやはりビンゴだった&lt;/p&gt;
&lt;p&gt;2000年は1/2が最初のデータになっていたのでそういうことですねって感じで納得＋スッキリ&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;このときはGitHubなかったと思う?ので問題ないのかな&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;GitHubがスタートしたのは2008年かららしいのでまぁ範囲外だった、何年かに一度は問題起きるけど通常は問題起きないよねっていうケースのよう&lt;/p&gt;
&lt;p&gt;次いつ来るんだろうか…見てみたい&lt;/p&gt;
&lt;p&gt;未来の期間もクエリはできたので将来いつ起きるのかな?と調べてみた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;to: 2044-12-31 , 日数: 367 , 週数: 53 , 最後 2044-12-31 : 0 , 最初 2043-12-31 : 0 , 最終週: 7 閏年  
to: 2043-12-31 , 日数: 366 , 週数: 53 , 最後 2043-12-31 : 0 , 最初 2042-12-31 : 0 , 最終週: 5  
to: 2042-12-31 , 日数: 366 , 週数: 53 , 最後 2042-12-31 : 0 , 最初 2041-12-31 : 0 , 最終週: 4  
to: 2041-12-31 , 日数: 366 , 週数: 53 , 最後 2041-12-31 : 0 , 最初 2040-12-31 : 0 , 最終週: 3  
to: 2040-12-31 , 日数: 366 , 週数: 53 , 最後 2040-12-31 : 0 , 最初 2040-01-01 : 0 , 最終週: 2 閏年  
to: 2039-12-31 , 日数: 366 , 週数: 53 , 最後 2039-12-31 : 0 , 最初 2038-12-31 : 0 , 最終週: 7  
to: 2038-12-31 , 日数: 366 , 週数: 53 , 最後 2038-12-31 : 0 , 最初 2037-12-31 : 0 , 最終週: 6  
to: 2037-12-31 , 日数: 366 , 週数: 53 , 最後 2037-12-31 : 0 , 最初 2036-12-31 : 0 , 最終週: 5  
to: 2036-12-31 , 日数: 367 , 週数: 53 , 最後 2036-12-31 : 0 , 最初 2035-12-31 : 0 , 最終週: 4 閏年  
to: 2035-12-31 , 日数: 366 , 週数: 53 , 最後 2035-12-31 : 0 , 最初 2034-12-31 : 0 , 最終週: 2  
to: 2034-12-31 , 日数: 365 , 週数: 53 , 最後 2034-12-31 : 0 , 最初 2034-01-01 : 0 , 最終週: 1  
to: 2033-12-31 , 日数: 366 , 週数: 53 , 最後 2033-12-31 : 0 , 最初 2032-12-31 : 0 , 最終週: 7  
to: 2032-12-31 , 日数: 367 , 週数: 53 , 最後 2032-12-31 : 0 , 最初 2031-12-31 : 0 , 最終週: 6 閏年  
to: 2031-12-31 , 日数: 366 , 週数: 53 , 最後 2031-12-31 : 0 , 最初 2030-12-31 : 0 , 最終週: 4  
to: 2030-12-31 , 日数: 366 , 週数: 53 , 最後 2030-12-31 : 0 , 最初 2029-12-31 : 0 , 最終週: 3  
to: 2029-12-31 , 日数: 366 , 週数: 53 , 最後 2029-12-31 : 0 , 最初 2028-12-31 : 0 , 最終週: 2  
to: 2028-12-31 , 日数: 365 , 週数: 53 , 最後 2028-12-31 : 0 , 最初 2028-01-02 : 0 , 最終週: 1 閏年  
to: 2027-12-31 , 日数: 366 , 週数: 53 , 最後 2027-12-31 : 0 , 最初 2026-12-31 : 0 , 最終週: 6  
to: 2026-12-31 , 日数: 366 , 週数: 53 , 最後 2026-12-31 : 0 , 最初 2025-12-31 : 0 , 最終週: 5  
to: 2025-12-31 , 日数: 366 , 週数: 53 , 最後 2025-12-31 : 0 , 最初 2024-12-31 : 0 , 最終週: 4&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;近い将来だと次の閏年じゃんw&lt;/p&gt;
&lt;p&gt;2028年はこの現象が起きるはず!&lt;/p&gt;
&lt;h3&gt;367日分の年は?&lt;/h3&gt;
&lt;p&gt;これも53週までしか返さないという仕様によるものかと思われる&lt;/p&gt;
&lt;p&gt;うるう年の年は基本367日分のデータが返っているが、年の最終日が2（月曜日）の年は366日分が返ってきている&lt;/p&gt;
&lt;p&gt;これは最初の週は7つデータが入っているのでこれ以上入らないという感じで説明が付きそう&lt;/p&gt;
&lt;h2&gt;おまけ&lt;/h2&gt;
&lt;p&gt;contributionsCollectionの&lt;code class=&quot;language-text&quot;&gt;to&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;from&lt;/code&gt;はDateTime型を期待されているようだったので、変えたらどうなるんだろうと思い調べてみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;contributions.graphql&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$userName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token scalar&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;DateTime&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$to&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;DateTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property-query&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$userName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property-query&quot;&gt;contributionsCollection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$to&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token object&quot;&gt;contributionCalendar&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;totalContributions&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;colors&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;isHalloween&lt;/span&gt;
        &lt;span class=&quot;token object&quot;&gt;weeks&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token object&quot;&gt;contributionDays&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;contributionCount&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;contributionLevel&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;date&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;最初と最後のデータを出力&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gh api graphql &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; contributions.graphql&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;userName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;swfz &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token string&quot;&gt;&apos;.data.user.contributionsCollection.contributionCalendar.weeks|[.[0].contributionDays[0],(.[length-1].contributionDays|.[length-1])]&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#40c463&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SECOND_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-12-17&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#40c463&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SECOND_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-12-18&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;2022&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gh api graphql &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; contributions.graphql&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;userName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;swfz &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-01-01T00:00:00Z &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-12-31T23:59:59Z &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token string&quot;&gt;&apos;.data.user.contributionsCollection.contributionCalendar.weeks|[.[0].contributionDays[0],(.[length-1].contributionDays|.[length-1])]&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#40c463&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SECOND_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-01-01&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#9be9a8&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FIRST_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-12-31&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;toの時刻を&lt;code class=&quot;language-text&quot;&gt;00:00:00&lt;/code&gt;にした場合&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gh api graphql &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; contributions.graphql&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;userName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;swfz &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-01-01T00:00:00Z &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-12-31T00:00:00Z &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token string&quot;&gt;&apos;.data.user.contributionsCollection.contributionCalendar.weeks|[.[0].contributionDays[0],(.[length-1].contributionDays|.[length-1])]&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#40c463&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SECOND_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-01-01&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#9be9a8&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FIRST_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-12-31&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;fromのとき刻を&lt;code class=&quot;language-text&quot;&gt;23:59:59&lt;/code&gt;にした&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gh api graphql &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; contributions.graphql&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;userName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;swfz &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-01-01T23:59:59Z &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-12-31T00:00:00Z &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token string&quot;&gt;&apos;.data.user.contributionsCollection.contributionCalendar.weeks|[.[0].contributionDays[0],(.[length-1].contributionDays|.[length-1])]&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#40c463&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SECOND_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-01-01&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#9be9a8&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionCount&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;contributionLevel&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FIRST_QUARTILE&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-12-31&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;両方ContributionCountの数は変わらず&lt;/p&gt;
&lt;p&gt;ということで日付部分しか見てなさそう、データ量を考慮してもサマリーされたテーブルを参照するだろうしDateTimeで問い合わせる理由なさそうなんだけどな&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;何か理由があるかもしれないが、推測くらいしかできないのでここで終わり、日付だけで投げさせてもらいたい感がある…&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[Deno Web Cacheを使ってGitHub APIへのリクエストをキャッシュする]]></title><description><![CDATA[DenoのWeb Cache APIが使えるようになっていた 待望っちゃ待望なのでどこかで使ってみたいなと思っていたがちょうどGitHubのコントリビューションを過去数年分さかのぼって1つの画像にまとめるAPIの記事で紹介したような機能に使えそうということでやってみた Web…]]></description><link>https://til.swfz.io/entries/deno_webcache_using_external_api/</link><guid isPermaLink="false">https://til.swfz.io/entries/deno_webcache_using_external_api/</guid><pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;DenoのWeb Cache APIが使えるようになっていた&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;待望っちゃ待望なのでどこかで使ってみたいなと思っていたがちょうど&lt;a href=&quot;https://swfz.hatenablog.com/entry/2024/12/22/172826&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHubのコントリビューションを過去数年分さかのぼって1つの画像にまとめるAPI&lt;/a&gt;の記事で紹介したような機能に使えそうということでやってみた&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;h2&gt;Web Cache API&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://deno.com/blog/deploy-cache-api&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Introducing Web Cache API support on Deno Deploy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Denoから外部APIへのリクエストのキャッシュ例があったのでケースとしてはまんまこのパターン&lt;/p&gt;
&lt;h2&gt;対象機能&lt;/h2&gt;
&lt;p&gt;参照記事の実装の概要や仕様&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub GraphQLのクエリで受けたユーザーのコントリビューションデータ（草のもととなるデータ）を取得&lt;/li&gt;
&lt;li&gt;レスポンスとして、&lt;code class=&quot;language-text&quot;&gt;from&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;to&lt;/code&gt;で指定した最大366日分（ほぼ1年分）のコントリビューションデータが返ってくる&lt;/li&gt;
&lt;li&gt;複数年にわたりデータを取得する必要がある
&lt;ul&gt;
&lt;li&gt;現在だと最大16年ほどなので最大16回ほどAPIへリクエストが発生する&lt;/li&gt;
&lt;li&gt;対象データはコントリビューションのデータなので過去データは基本的には変わらない（はず）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コントリビューションデータへクエリする際のノード消費量は1
&lt;ul&gt;
&lt;li&gt;ratelimit的には5000/1時間の制限がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;経緯&lt;/h2&gt;
&lt;p&gt;過去データに対してのAPIリクエストはCacheを使いAPIリクエスト自体発生しないようにすることでパフォーマンスの改善を狙う&lt;/p&gt;
&lt;p&gt;最初実装を考えたときに最初からキャッシュするか迷ったがノード消費量1だしアクセスが結構あったとしてもratelimitに引っかかる心配はほぼない&lt;/p&gt;
&lt;p&gt;なのでいったんは都度リクエストで大丈夫と判断してリリースした&lt;/p&gt;
&lt;p&gt;実際にリリースしたらratelimitに引っかかることはないが期間が長くなると遅いなっていうのが正直なところだった&lt;/p&gt;
&lt;p&gt;Slackとかに貼った場合、一定時間が経過するとリクエストが飛ぶっぽいのでそのたびに時間が掛かる、その都度遅く感じるっていうのが普通にストレス&lt;/p&gt;
&lt;p&gt;ということでさっそくWebキャッシュを導入する&lt;/p&gt;
&lt;h2&gt;実装&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;contributions.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;const getContributions = async (user: string, from?: string, to?: string) =&gt; {
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;const getContributions = async (useCache: boolean, user: string, from?: string, to?: string) =&gt; {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  const cache = await caches.open(&quot;gh-api&quot;);
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  const cacheKey = `${API_URL}/${user}/${from}/${to}`;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  const cached = await cache.match(cacheKey);
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  if (useCache &amp;amp;&amp;amp; cached) return await cached.json();
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;  const token = Deno.env.get(&quot;GH_READ_USER_TOKEN&quot;);
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;  const query = `
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    query($user:String! $from:DateTime $to:DateTime) {
&lt;/span&gt;
.....
.....
.....

&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    body: JSON.stringify(json),
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;  });
&lt;/span&gt;
&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;  return await res.json();
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  if (useCache &amp;amp;&amp;amp; res.ok &amp;amp;&amp;amp; from &amp;amp;&amp;amp; to) {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    await cache.put(cacheKey, res.clone());
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  }
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  return await res.json();
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;};&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;cacheの使用箇所はこんな感じ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;cacheKey&lt;/code&gt;はURL形式にする必要があった（http,httpsで始まる文字列）ため、APIのエンドポイントURL＋ユニークの単位を担保できるようパラメータをつなげた文字列にした&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;useCache&lt;/code&gt;でcacheを使うかのフラグを外から渡すようにした&lt;/p&gt;
&lt;p&gt;これは、今年のコントリビューション数は時間の経過で変化する可能性が高く、cacheは使わず都度リクエストを送るため渡す側で判断してコントロールするようにした&lt;/p&gt;
&lt;h2&gt;結果&lt;/h2&gt;
&lt;p&gt;アクセスログとか取っていなく、レスポンス時間を実測していないのは非常に残念ではあるが、実際12年とか13年とかの期間を試してみたら明らかに差が出た&lt;/p&gt;
&lt;p&gt;Cache導入前は普通に体感30秒くらいかな?は時間かかっていたが一度アクセスしたあとは1~3秒くらいで返ってくる（体感）&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WSL2のデフォルトユーザーではないユーザーでホストのコマンドを使う]]></title><description><![CDATA[WSLにおいて、複数ユーザーを作ってプライベート用と仕事用のアカウント認証情報などを分けられないかと考えた WSLは初回起動時にデフォルトユーザーを作成するが、このデフォルトユーザー以外にもインスタンス起動後にユーザーを作成してみた そして wslu…]]></description><link>https://til.swfz.io/entries/wslview_not_default_user/</link><guid isPermaLink="false">https://til.swfz.io/entries/wslview_not_default_user/</guid><pubDate>Sat, 21 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WSLにおいて、複数ユーザーを作ってプライベート用と仕事用のアカウント認証情報などを分けられないかと考えた&lt;/p&gt;
&lt;p&gt;WSLは初回起動時にデフォルトユーザーを作成するが、このデフォルトユーザー以外にもインスタンス起動後にユーザーを作成してみた&lt;/p&gt;
&lt;p&gt;そして&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wsluの&lt;code class=&quot;language-text&quot;&gt;wslview&lt;/code&gt;コマンドでブラウザを起動&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;copy.exe&lt;/code&gt;でクリップボードコピー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などをしようとしたが、うまくいかなかったのでやったログだけ残す&lt;/p&gt;
&lt;p&gt;以降デフォルトユーザーは&lt;code class=&quot;language-text&quot;&gt;hoge&lt;/code&gt;、新たに作成したユーザーは&lt;code class=&quot;language-text&quot;&gt;newuser&lt;/code&gt;として話を進める&lt;/p&gt;
&lt;h2&gt;wsluを入れてブラウザ起動する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt install wslu&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wslview https://google.com&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;エラー…&lt;/p&gt;
&lt;h2&gt;ユーザー違い&lt;/h2&gt;
&lt;p&gt;動いたのはデフォルトユーザーの&lt;code class=&quot;language-text&quot;&gt;hoge&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;newuser&lt;/code&gt;では動かなかった…&lt;/p&gt;
&lt;p&gt;wslviewがというより普通のコマンドも使えない…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラー出力の抜粋&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/mnt/c/WINDOWS/system32/clip.exe: Invalid argument&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;権限問題のよう…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt;  
&lt;span class=&quot;token assign-left variable&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newuser&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;gid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newuser&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;groups&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newuser&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;,27&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sudo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;,100&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;users&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
  
~/memo &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;-&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;master&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  
$ &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; /mnt/c/WINDOWS/system32/clip.exe  
-r-xr-xr-x &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; hoge hoge &lt;span class=&quot;token number&quot;&gt;32768&lt;/span&gt; Dec &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2019&lt;/span&gt; /mnt/c/WINDOWS/system32/clip.exe*&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;なるほどねぇ…&lt;code class=&quot;language-text&quot;&gt;/mnt/c/&lt;/code&gt;以下（Windows領域へのアクセスはデフォルトユーザー、もしくはそのグループから）という権限設定がなされているのか…&lt;/p&gt;
&lt;p&gt;ちょっと気持ち悪いが…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ sudo usermod -aG hoge newuser&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;でデフォルトユーザーのグループに新規のユーザーを追加させた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ groups newuser  
newuser : newuser sudo users hoge&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wsl --shutdown&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;再起動してから確認&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ wslview https://google.com  
&quot;GetEncoding&quot; のオーバーロードで、引数の数が &quot;0&quot; であるものが見つかりません。  
発生場所 行:1 文字:59  
+ ... ing]::UTF8; [Console]::InputEncoding = [System.Text.Encoding]::GetEnc ...  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
+ CategoryInfo : NotSpecified: (:) [], MethodException  
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;何かいわれたけど起動はした…&lt;/p&gt;
&lt;h2&gt;WSLでのWindows領域の権限&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WSL での詳細設定の構成 | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この辺を見てみる…&lt;/p&gt;
&lt;p&gt;usersグループに権限付けたほうがよいかな&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/etc/wsl.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[automount]  
options = &quot;uid=1000,gid=100&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;1000はhoge&lt;/p&gt;
&lt;p&gt;100はusers&lt;/p&gt;
&lt;p&gt;インスタンスを落として再度確認する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ホスト側&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wsl -t Ubuntu-24.04&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;確認&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ ls -al /mnt/c/WINDOWS/system32/clip.exe  
-r-xr-xr-x 2 hoge users 32768 Dec 7 2019 /mnt/c/WINDOWS/system32/clip.exe*
$ echo &apos;hoge&apos; | iconv -f UTF-8 -t CP932 | /mnt/c/WINDOWS/system32/clip.exe 
  
$ hoge&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;期待通り&lt;/p&gt;
&lt;p&gt;やはり読むべきは公式ドキュメント…&lt;/p&gt;
&lt;h2&gt;reg.exeはまだ使えず&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;hoge&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wslview -v  
wslu v4.1.3-1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;newuser&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wslview -v  
/mnt/c/Windows/System32/reg.exe: Invalid argument  
wslu v4.1.3-1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;reg.exeは&lt;code class=&quot;language-text&quot;&gt;users&lt;/code&gt;でも実行できないよう…&lt;/p&gt;
&lt;p&gt;ターミナルの出力結果を&lt;code class=&quot;language-text&quot;&gt;clip.exe&lt;/code&gt;に渡してコピーする運用にしていたのでなんとかしないと…と思っていたが&lt;/p&gt;
&lt;p&gt;そもそもtmuxでxclip, xcopyが使えていたのでそちらを使うようにした…&lt;/p&gt;
&lt;h2&gt;metadata付与&lt;/h2&gt;
&lt;p&gt;そして、時間が経つと権限ない系の話になってブラウザが起動しない事態に…正直良くわからん&lt;/p&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://qiita.com/yuinore/items/281d7b5aca08cbb58473&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WSL2 でパーミッション変更できるかやってみた #Linux - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;権限周りなのでこのへんかな&lt;/p&gt;
&lt;p&gt;metadata付与してみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/etc/wsl.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ini line-numbers&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;automount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;  
&lt;span class=&quot;token key attr-name&quot;&gt;options&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;&quot;&lt;span class=&quot;token inner-value&quot;&gt;metadata,uid=1000,gid=100&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;再起動後確認&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-al&lt;/span&gt; /mnt/c/Windows/System32/reg.exe
-r-xr-xr-x &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; hoge &lt;span class=&quot;token function&quot;&gt;users&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;77312&lt;/span&gt; Dec  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;2019&lt;/span&gt; /mnt/c/Windows/System32/reg.exe*&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; hoge &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; /mnt/c/WINDOWS/system32/clip.exe&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;動いた…&lt;/p&gt;
&lt;h2&gt;再発&lt;/h2&gt;
&lt;p&gt;しかし、時間が経つと動かなくなるみたい?だった…&lt;/p&gt;
&lt;p&gt;これWinのスリープと関係あるのかな&lt;/p&gt;
&lt;h2&gt;結論&lt;/h2&gt;
&lt;p&gt;しばらく試行錯誤してみたが動かないパターンがどうしても発生するため諦めた&lt;/p&gt;
&lt;p&gt;WSLのインスタンスにはデフォルトユーザーのみで操作する&lt;/p&gt;
&lt;p&gt;ユーザーの切り分けをする場合は別のインスタンスを立てる、という対応にした&lt;/p&gt;
&lt;p&gt;同じディストリビューションだったとしても別名をつけることはできたので今のところの運用は別インスタンスにしてそれぞれのケースで利用するという形に落ち着いた&lt;/p&gt;
&lt;p&gt;残念…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DuckDB + YouPlotでCUIのグラフ表示]]></title><description><![CDATA[DuckDBの公式ドキュメントにCUIでの可視化ツールの紹介が載っていた CLI Charting with YouPlot – DuckDB YouPlot red-data-tools/YouPlot: A command line tool that draw plots…]]></description><link>https://til.swfz.io/entries/duckdb_youplot/</link><guid isPermaLink="false">https://til.swfz.io/entries/duckdb_youplot/</guid><pubDate>Fri, 20 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;DuckDBの公式ドキュメントにCUIでの可視化ツールの紹介が載っていた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://duckdb.org/docs/guides/data_viewers/youplot.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CLI Charting with YouPlot – DuckDB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;YouPlot&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/red-data-tools/YouPlot&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;red-data-tools/YouPlot: A command line tool that draw plots on the terminal.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ruby製らしい&lt;/p&gt;
&lt;p&gt;内部的にUnicodePlotを使っているらしい、どちらもPlotライブラリなので役割がどう違うのかイメージが付いていない…&lt;/p&gt;
&lt;p&gt;サンプルでは次の流れでCUIのグラフ化を行っている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APIを叩いてデータを取得&lt;/li&gt;
&lt;li&gt;DuckDBに流して集計&lt;/li&gt;
&lt;li&gt;結果をCSVフォーマットにしてstdoutへ出力&lt;/li&gt;
&lt;li&gt;youplotで可視化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こういうの好きなんだよなー、とりあえず試してみる&lt;/p&gt;
&lt;h2&gt;install&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gem &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; youplot&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;試す&lt;/h2&gt;
&lt;p&gt;GitHubのイベントデータのサンプルを実行してみた&lt;/p&gt;
&lt;p&gt;これは!!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sL&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://api.github.com/users/swfz/events?per_page=100&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; duckdb &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;COPY (SELECT type, count(*) AS event_count FROM read_json_auto(&apos;/dev/stdin&apos;) GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO &apos;/dev/stdout&apos; WITH (FORMAT &apos;csv&apos;, HEADER)&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; uplot bar -d, &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GitHub Events for @swfz&quot;&lt;/span&gt;  
                             GitHub Events &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; @swfz
                    ┌                                        ┐
   PullRequestEvent ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ &lt;span class=&quot;token number&quot;&gt;34.0&lt;/span&gt;
          PushEvent ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ &lt;span class=&quot;token number&quot;&gt;32.0&lt;/span&gt;
        DeleteEvent ┤■■■■■■■■■■■■■■■■■■ &lt;span class=&quot;token number&quot;&gt;18.0&lt;/span&gt;
        CreateEvent ┤■■■■■■■■■■■■■■■■ &lt;span class=&quot;token number&quot;&gt;16.0&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/3a58d6e5f8a39a4c78f18303f7745182/duckdb_youplot01.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;
&lt;h3&gt;CSV出力&lt;/h3&gt;
&lt;p&gt;途中出力のCSV形式はこんな感じ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sL&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://api.github.com/users/swfz/events?per_page=100&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; duckdb &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;COPY (SELECT type, count(*) AS event_count FROM read_json_auto(&apos;/dev/stdin&apos;) GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO &apos;/dev/stdout&apos; WITH (FORMAT &apos;csv&apos;, HEADER)&quot;&lt;/span&gt;

type,event_count
PullRequestEvent,34
PushEvent,32
DeleteEvent,18
CreateEvent,16&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;まぁわかりやすい&lt;/p&gt;
&lt;p&gt;YouPlotのチャート種別によっても必要な形式は異なる&lt;/p&gt;
&lt;p&gt;GitHubのREADMEに各種チャートのサンプルコマンドが載っているがやはりローカルでワンショットの可視化とかの使い方がよさそう&lt;/p&gt;
&lt;p&gt;使い方習熟したらログ調査とかは捗りそう&lt;/p&gt;
&lt;p&gt;たまに見たいパターンの場合でも、わざわざデータをBQに入れてLookerStudioで可視化して…とまでやるには重いよな…って場合、簡易的なツールとして使えそう&lt;/p&gt;
&lt;p&gt;ただ、timeseriesデータは扱えないみたい…これが一番欲しい感ある…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/red-data-tools/YouPlot/issues/52&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Feature suggestion: Support for timeseries data · Issue #52 · red-data-tools/YouPlot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rubyなら自分でコード書いてPR出せるかな?&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;余裕ができたらやってみたいと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[miseのubi backend]]></title><description><![CDATA[miseのbackend機能のひとつ Backends | mise-en-place pipxとかnpmとかもある、本来であればだったりを挟むべきものをmiseの設定ファイルに記述すればやってくれるというもの pipやnpm…]]></description><link>https://til.swfz.io/entries/mise_ubi_backend/</link><guid isPermaLink="false">https://til.swfz.io/entries/mise_ubi_backend/</guid><pubDate>Thu, 19 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;miseのbackend機能のひとつ&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mise.jdx.dev/dev-tools/backends/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Backends | mise-en-place&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;pipxとかnpmとかもある、本来であれば&lt;code class=&quot;language-text&quot;&gt;npm install&lt;/code&gt;だったり&lt;code class=&quot;language-text&quot;&gt;pipx install&lt;/code&gt;を挟むべきものをmiseの設定ファイルに記述すればやってくれるというもの&lt;/p&gt;
&lt;p&gt;pipやnpmなどでコマンドラインツールを提供してたりするものならbackend機能でインストールできる&lt;/p&gt;
&lt;p&gt;goやcargo,gemもあるのでまぁほぼなんでも入れられるよなって感じ&lt;/p&gt;
&lt;p&gt;その中にubi backendがあった&lt;/p&gt;
&lt;p&gt;ubiについては&lt;a href=&quot;https://til.swfz.io//entries/universal_binary_installer/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Universal Binary Installer&lt;/a&gt;に書いた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mise.config.toml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[tools]
&quot;ubi:duckdb/duckdb&quot; = &apos;latest&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これを書いた時点ではDuckDBはmiseのregistory.tomlには入っていなかったのでubiバックエンドでインストールする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;install&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ mise i  
mise Installed binary into /home/user/.local/share/mise/installs/ubi-duckdb-duckdb/1.1.3/bin/duckdb  
mise ubi:duckdb/duckdb@1.1.3 ✓ installed&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;確認&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ duckdb --version  
v1.1.3 19864453f7&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;楽すぎる…&lt;/p&gt;
&lt;p&gt;指定方法は&lt;code class=&quot;language-text&quot;&gt;owner/repo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ubiコマンドで指定する方法と同様&lt;/p&gt;
&lt;p&gt;バージョン指定する場合も同様かな&lt;/p&gt;
&lt;p&gt;これ楽すぎるな&lt;/p&gt;
&lt;p&gt;最初おためしで使ってみるときはubiバックエンドでインストールしておきつつ、本家の&lt;code class=&quot;language-text&quot;&gt;registory.toml&lt;/code&gt;になければコントリビュートチャンス!&lt;/p&gt;
&lt;p&gt;というかバックエンド機能があるからかなりの範囲のツールをカバーできるよな…って感じた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Web Worker使ってみる]]></title><description><![CDATA[なんとなく知ってはいたが使ってみたことがなかったので使ってみた ドキュメント ウェブワーカー API - Web API | MDN…]]></description><link>https://til.swfz.io/entries/web_worker/</link><guid isPermaLink="false">https://til.swfz.io/entries/web_worker/</guid><pubDate>Wed, 18 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;なんとなく知ってはいたが使ってみたことがなかったので使ってみた&lt;/p&gt;
&lt;h3&gt;ドキュメント&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/API/Web_Workers_API&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ウェブワーカー API - Web API | MDN&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ウェブアプリケーションにおけるスクリプトの処理をメインとは別のスレッドに移し、バックグラウンドでの実行を可能にする仕組みのことです。時間のかかる処理を別のスレッドに移すことが出来るため、 UI を担当するメインスレッドの処理を中断・遅延させずに実行できるという利点があります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ドキュメント内に書いてあったが、サービスワーカはWebWorkerの一種のよう、それは知らなかった…&lt;/p&gt;
&lt;h2&gt;タイマー&lt;/h2&gt;
&lt;p&gt;NextでWeb Workerを使ったタイマーを実装してみた&lt;/p&gt;
&lt;p&gt;Worker部分では受け取ったカウントに対して&lt;code class=&quot;language-text&quot;&gt;setInterval&lt;/code&gt;で1秒ごとにカウントを減らしてメインスレッドに値を返す&lt;/p&gt;
&lt;p&gt;ポーズ、再開の機能も入れてみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public/timer-worker.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; count &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; interval &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onmessage&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; command&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; payload &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;command &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;start&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    count &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; payload&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    interval &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; payload&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;interval &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      count &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;tick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;count &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;done&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; interval&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;command &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;pause&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;command &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;resume&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        count &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;count &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;done&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;tick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; interval&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;command &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;reset&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    count &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;reset&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;pages/sample-timer/index.tsx&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; NextPage &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;next&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Head &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;next/head&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useEffect&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useState&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ChangeEvent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StrictMode&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useRef &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; SampleTimer&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;NextPage&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; workerRef &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Worker &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setCount&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;paused&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setPaused&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Boolean &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;started&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setStarted&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;handleCountChange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ChangeEvent&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;HTMLInputElement&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;startTimer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setStarted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setPaused&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    workerRef&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; command&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;start&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; payload&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; count&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; interval&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;pauseTimer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setPaused&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;workerRef&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      workerRef&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Worker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/timer-worker.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; worker &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; workerRef&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    worker&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onmessage&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;count &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token function&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;worker&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        worker&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;terminate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        workerRef&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workerRef&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; worker &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; workerRef&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      worker&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; command&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;paused &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;resume&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;pause&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;paused&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;StrictMode&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Head&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Web Worker Timer&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Head&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;p-3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;divide-y divide-gray-300&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;

            &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex flex-row p-1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;grow p-1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
                  &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;number&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-10 w-16 rounded text-sm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token attr-name&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token attr-name&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3600&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;handleCountChange&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                秒
              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;

              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex flex-row p-1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt;
                    &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mx-1 flex items-center rounded border border-gray-400 bg-white p-2 font-semibold text-gray-800 shadow hover:bg-gray-100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                    &lt;span class=&quot;token attr-name&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;startTimer&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                    Start
                  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt;
                    &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mx-1 flex items-center rounded border border-gray-400 bg-white p-2 font-semibold text-gray-800 shadow hover:bg-gray-100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                    &lt;span class=&quot;token attr-name&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pauseTimer&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                    Pause
                  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;StrictMode&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; SampleTimer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;useRef&lt;/code&gt;で変数を保持できるようにし、初期処理で&lt;code class=&quot;language-text&quot;&gt;new Worker(&apos;/timer-worker.js&apos;);&lt;/code&gt;を使ってWorkerに処理させるスクリプトを読ませる&lt;/p&gt;
&lt;p&gt;準備ができたらお互いにメッセージの送信、受信のやりとりをする&lt;/p&gt;
&lt;h3&gt;メッセージの送信&lt;/h3&gt;
&lt;p&gt;postMessageで必要な情報を変数に入れて渡す&lt;/p&gt;
&lt;h3&gt;メッセージの受信&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;フロントエンド&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;worker.onmessage&lt;/code&gt;にコールバック関数を代入する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;worker&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onmessage&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;count &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Worker&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;self.onmessage&lt;/code&gt;でコールバック関数を代入する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onmessage&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 処理&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;イメージ&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 460px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/160de7461b8b6a5ab95741c12539a390/08a84/web_worker01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.45945945945946%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAAA+0lEQVR42r2S227CMAyGef93Y6Bxw7KKtgFGw6oeYKRtmuRfbKg0iXbbBVukyHacfD7EMzx4zf4MWBYFmqa9u+C9/9a+Aw4XougVRVmx7pwHHTvnGEA6yxuQ/OS7+icy7PseJuyuM5yp1g2f53mOJE6glEKapihDUA54gxpjxoEEU1mG43vOdhZ0IQSDls8rbJIt5G4PKSU2cQoRxdgGmxIYB4ZI1Me6rrkskqfzGYe3A+bzJyyWK6xfBHYBkqkj1iJCnEg0bTcOHHpirQvlW960tNYoqwqXyweqINsAGHpLpVtrfz82Uz96/Sg/6v9xDr8+noL8z2A/CvgJLJGwM7OV5YYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/160de7461b8b6a5ab95741c12539a390/cbe2e/web_worker01.webp 148w,
/static/160de7461b8b6a5ab95741c12539a390/3084c/web_worker01.webp 295w,
/static/160de7461b8b6a5ab95741c12539a390/bc10c/web_worker01.webp 460w&quot;
              sizes=&quot;(max-width: 460px) 100vw, 460px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/160de7461b8b6a5ab95741c12539a390/12f09/web_worker01.png 148w,
/static/160de7461b8b6a5ab95741c12539a390/e4a3f/web_worker01.png 295w,
/static/160de7461b8b6a5ab95741c12539a390/08a84/web_worker01.png 460w&quot;
            sizes=&quot;(max-width: 460px) 100vw, 460px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/160de7461b8b6a5ab95741c12539a390/08a84/web_worker01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;雑な部分も結構あるけどサンプル実装ということで…&lt;/p&gt;
&lt;p&gt;なにはともあれWeb Workerを使って何かしらの処理をバックグラウンドへ投げる方法がわかった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[zinitでStarshipいれてみた]]></title><description><![CDATA[Dotfiles盆栽として、ansibleをいじったりzshの設定をいじったりしている プロンプトもそろそろ変えようかなということで以前話題になっていたStarshipを入れてみた 特に難しいことはなかったのでただの作業ログ zinit…]]></description><link>https://til.swfz.io/entries/introduction_starship/</link><guid isPermaLink="false">https://til.swfz.io/entries/introduction_starship/</guid><pubDate>Tue, 17 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dotfiles盆栽として、ansibleをいじったりzshの設定をいじったりしている&lt;/p&gt;
&lt;p&gt;プロンプトもそろそろ変えようかなということで以前話題になっていたStarshipを入れてみた&lt;/p&gt;
&lt;p&gt;特に難しいことはなかったのでただの作業ログ&lt;/p&gt;
&lt;p&gt;zinitでインストールするようにした&lt;/p&gt;
&lt;h2&gt;インストール設定&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/zdharma-continuum/zinit&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;zdharma-continuum/zinit: 🌻 Flexible and fast ZSH plugin manager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ここに設定方法が書いてある&lt;/p&gt;
&lt;p&gt;Starshipについても記述があるのでこれ通りにするので良さそう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;zinit ice as&lt;span class=&quot;token string&quot;&gt;&quot;command&quot;&lt;/span&gt; from&lt;span class=&quot;token string&quot;&gt;&quot;gh-r&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
          atclone&lt;span class=&quot;token string&quot;&gt;&quot;./starship init zsh &gt; init.zsh; ./starship completions zsh &gt; _starship&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
          atpull&lt;span class=&quot;token string&quot;&gt;&quot;%atclone&quot;&lt;/span&gt; src&lt;span class=&quot;token string&quot;&gt;&quot;init.zsh&quot;&lt;/span&gt;
zinit light starship/starship&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;zinitは初回起動時に各種プラグインがなければインストールするという挙動にしている&lt;/p&gt;
&lt;p&gt;Starthipは既存のツール管理に利用しているmiseで管理しようか迷ったがmiseにするとAnsibleとの組み合わせがそんなに良くないなと思ったのでzinitでインストールするようにした&lt;/p&gt;
&lt;p&gt;とりあえずこれでシェル起動したらStarshipをインストールして適用してくれる&lt;/p&gt;
&lt;h3&gt;zinitのplugin&lt;/h3&gt;
&lt;p&gt;インストールしたStarshipはどこにあるのか&lt;/p&gt;
&lt;p&gt;気になったので見てみた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd .zinit/plugins/starship---starship
init.zsh _starship starship*&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ここにいろいろ入っているのね&lt;/p&gt;
&lt;p&gt;zinitのプラグインごとにディレクトリ切ってある、&lt;code class=&quot;language-text&quot;&gt;org---repo&lt;/code&gt;っていう命名規則かな&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/zdharma-continuum/zinit?tab=readme-ov-file#more-examples&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;zdharma-continuum/zinit: 🌻 Flexible and fast ZSH plugin manager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;てかこの例で、Pluginの中にfzfとかも入っていて、miseと同様zinitも開発に使うツール管理していく世界線を目指しているのか?と思った&lt;/p&gt;
&lt;h3&gt;pluginの更新&lt;/h3&gt;
&lt;p&gt;まず現状を確認&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;status&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ zinit status
Assuming --all is passed
Already up-to-date.
Note: status done also for unloaded plugins

Status for plugin agkozak/zhooks
On branch master
Your branch is up to date with &apos;origin/master&apos;.

Status for plugin zsh-users/zsh-completions
On branch master
Your branch is up to date with &apos;origin/master&apos;.

nothing to commit, working tree clean

Status for plugin zsh-users/zsh-syntax-highlighting
On branch master
Your branch is up to date with &apos;origin/master&apos;.

nothing to commit, working tree clean
The update took 0.06 seconds&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;一部省略したがこのように現状の状態を表示してくれる&lt;/p&gt;
&lt;p&gt;statusみたらほとんど&lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt;ブランチを参照していてワロタ…&lt;/p&gt;
&lt;p&gt;バージョン管理っていうよりGitの最新を取ってくるって感じのよう&lt;/p&gt;
&lt;p&gt;そして下記で更新できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ zinit update
Assuming --all is passed
Already up-to-date.
Note: updating also unloaded plugins
Updating agkozak/zhooks
Updating sindresorhus/pure
Updating starship/starship
[gh-r] latest version (v1.21.1) already installed
Updating zdharma-continuum/z-a-as-monitor
Updating zdharma-continuum/z-a-bin-gem-node
Updating zdharma-continuum/z-a-patch-dl
Updating zsh-users/zsh-completions
2024-12-23 c160d09 Merge pull request #1116 from Mic92/typos
2024-12-22 59184db fix typos
2024-12-11 6ff1a67 Merge pull request #1115 from zsh-users/update_node
2024-12-11 3f00e7c Update node.js completion to version 23.4
2024-12-11 a169722 fix typos
2024-12-11 97804d9 Merge pull request #1114 from egorlem/diplodoc
2024-12-11 375d578 Update authors block
2024-12-11 bb6d6ba Update completion according to the help documents
2024-12-11 1ae4ab5 Remove needless configurations
2024-12-11 e7068f9 Set argument parameter to options that take an argument
2024-12-11 a9c9c72 Fix according to coding convention
2024-12-10 8f1b90c Add help argument
2024-12-10 b97fdbd Fix typo
2024-12-10 a0effab Remove unused file_types var
2024-12-10 1b16b6c Add completion script for yfm (diplodoc cli)
2024-11-26 874917f Merge pull request #1113 from kyanagi/update-rspec
2024-11-26 509d844 Update rspec completion
2024-11-20 f607e94 Merge pull request #1112 from hydrargyrum/age
2024-11-19 8d42717 Fix options that can be specified many times
2024-11-19 610aef9 Don&apos;t complete options when &apos;--help&apos; is specified
2024-11-19 692e96c Add format information
2024-11-19 360ee98 Fix comment
2024-11-19 6dec488 add completion for age
2024-11-17 df14fc4 Merge pull request #1111 from zsh-users/add-util-linux
2024-11-17 fdc290d Consider BSD distributions
2024-11-14 2c2d878 Consider macOS&apos;s uuidgen
2024-11-13 8f3baa3 Add lscpu completion
2024-11-12 c791de1 Add uuidgen
Updating 9df3345..c160d09
Fast-forward
==&gt; Compiling zsh-completions.plugin.zsh [OK]
Updating zsh-users/zsh-syntax-highlighting
2024-11-21 5eb677b &apos;main&apos; tests: Don&apos;t assume ps(1) is available.
Updating e0165ea..5eb677b
Fast-forward
==&gt; Compiling zsh-syntax-highlighting.plugin.zsh [OK]
The update took 10.12 seconds&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Starshipのテーマ変更&lt;/h2&gt;
&lt;p&gt;特にこだわりがなければ下記のpresetから選んで設定ファイルとして特定ディレクトリに置けば良い&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://starship.rs/presets/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Presets | Starship&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;設定情報の出力は下記コマンドで&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;starship preset tokyo-night -o ~/.config/starship.toml&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;アイコンが表示されなかったので調べたらNERD FONTSの中から何かしらインストールする必要があるらしい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nerdfonts.com/font-downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Nerd Fonts - Iconic font aggregator, glyphs/icons collection, &amp;#x26; fonts patcher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;とりあえず適当にJetBrains Monoを入れた&lt;/p&gt;
&lt;p&gt;で、WindowsTerminalの外観設定でNerdFontのフォントを設定した&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8ee19a82f69c58f8ed0c72e7ec996458/30c92/introduction_starship01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 14.864864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA10lEQVR42iWOzU7CQBhF+xxSNMX6ExloC2KBKUNbmrEoAoosjDEIK2MkYcOGLRtXvoU73/E41sXNzTm5+fJZk6cNq49PFrtv3vY/PLx/EeVzkukSNZwTyAGik+OrCdUwox7d4qkxNdNCaq6yKV09Q3Q1p+kj1vP9lvjmlfZsTfyyo5kvuJDXCDVC9IachSluqHFbGU5DcdwacNLWRc7N4Wp/jGu8E/Q4bKZYR5cJthEHXoeSkSVfYvumPVmk3IjNMPnn+h/3KRt2pPnwbkVFjgpvexF2oPgFlXlnliW5DkgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/8ee19a82f69c58f8ed0c72e7ec996458/cbe2e/introduction_starship01.webp 148w,
/static/8ee19a82f69c58f8ed0c72e7ec996458/3084c/introduction_starship01.webp 295w,
/static/8ee19a82f69c58f8ed0c72e7ec996458/5ca24/introduction_starship01.webp 590w,
/static/8ee19a82f69c58f8ed0c72e7ec996458/02c22/introduction_starship01.webp 874w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/8ee19a82f69c58f8ed0c72e7ec996458/12f09/introduction_starship01.png 148w,
/static/8ee19a82f69c58f8ed0c72e7ec996458/e4a3f/introduction_starship01.png 295w,
/static/8ee19a82f69c58f8ed0c72e7ec996458/fcda8/introduction_starship01.png 590w,
/static/8ee19a82f69c58f8ed0c72e7ec996458/30c92/introduction_starship01.png 874w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/8ee19a82f69c58f8ed0c72e7ec996458/fcda8/introduction_starship01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;表示された、あとは細かいところ調整かな&lt;/p&gt;
&lt;h3&gt;設定&lt;/h3&gt;
&lt;p&gt;プリセットをいくつか試したがしっくり来なかったのでカスタマイズする…&lt;/p&gt;
&lt;p&gt;ここから沼が始まるきっかけになりうるので、できるだけ最小限にしたい…&lt;/p&gt;
&lt;h4&gt;icon&lt;/h4&gt;
&lt;p&gt;設定上にアイコンを入れることで表示にもアイコンを反映できる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nerdfonts.com/cheat-sheet&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Nerd Fonts - Iconic font aggregator, glyphs/icons collection, &amp;#x26; fonts patcher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これで検索しながら設定ファイルにコピーしていく感じかな…&lt;/p&gt;
&lt;h3&gt;モジュール&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://starship.rs/config/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Configuration | Starship&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;結構な種類のモジュールがある&lt;/p&gt;
&lt;p&gt;それぞれのモジュールで、どのようなフォーマットで表示するか?スタイルはどうするか?などの項目をそれぞれ指定する&lt;/p&gt;
&lt;p&gt;ドキュメント全体をざっくり読んでみて良さそうなのを試してみるっていうのを繰り返した&lt;/p&gt;
&lt;p&gt;最終的にコマンドの実行時間、コマンドのExitCode、Gitのステータス、差分の行数などを入れた&lt;/p&gt;
&lt;h3&gt;config&lt;/h3&gt;
&lt;p&gt;いろいろあるが現時点の最終的な設定は次のようになっている&lt;/p&gt;
&lt;p&gt;試行錯誤の過程で使わなくなったものも含まれている&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;toml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-toml line-numbers&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token key property&quot;&gt;&quot;$schema&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://starship.rs/config-schema.json&apos;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&quot;
[░▒▓](bg:color_fg0 fg:color_bg1)\
$directory\
[](fg:color_bg1 bg:color_bg3)\
[](fg:color_bg3 bg:color_bg1)\
$git_branch\
$git_status\
[](fg:color_bg1 bg:color_bg3)\
$docker_context\
[](fg:color_bg3)\
$git_metrics\
$status\
$cmd_duration\
$line_break$character&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;palette&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;custom&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;palettes.custom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_fg0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#eeeeee&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_bg1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#00005f&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_bg2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#090cb5&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_bg3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#0074D9&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_blue&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#3a6ab3&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_aqua&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#8bb8f5&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_green&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#3ff1b0&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_orange&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#f13f5b&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_purple&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#9f68c9&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_red&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#b22b6b&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_yellow&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#f3c13f&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;color_accent&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#d700d7&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_orange fg:color_fg0&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;os.symbols&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Windows&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰍲&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Ubuntu&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰕈&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;SUSE&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Raspbian&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰐿&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Mint&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰣭&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Macos&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰀵&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Manjaro&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Linux&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰌽&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Gentoo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰣨&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Fedora&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰣛&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Alpine&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Amazon&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Android&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Arch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰣇&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Artix&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰣇&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;EndeavourOS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;CentOS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Debian&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰣚&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Redhat&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󱄛&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;RedHatEnterprise&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󱄛&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;Pop&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;show_always&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style_user&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_orange fg:color_fg0&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style_root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_orange fg:color_fg0&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[ $user ]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fg:color_fg0 bg:color_bg1&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;[ $path ]($style)&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;truncation_length&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;truncation_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;…/&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;directory.substitutions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;&quot;Documents&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰈙 &quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;&quot;Downloads&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;&quot;Music&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰝚 &quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;&quot;Pictures&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;&quot;Developer&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;󰲋 &quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;git_branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;[](fg:color_accent bg:color_bg1)&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_aqua&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[[ $symbol $branch ](fg:color_fg0 bg:color_bg1)]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;git_status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_aqua&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[[($all_status$ahead_behind )](fg:color_accent bg:color_bg1)]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;git_metrics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;nodejs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fg:#3c873a&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[ $symbol( $version) ]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;rust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_blue&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;golang&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fg:#29beb0&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[ $symbol( $version) ]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;python&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fg:#306998&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[ $symbol( $version) ]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;ruby&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fg:#a91401&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[ $symbol( $version) ]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;docker_context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_bg3&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;time_format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;%R&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bg:color_bg1&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[[  $time ](fg:color_fg0 bg:color_bg1)]($style)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;line_break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;character&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;success_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[❯](bold fg:green)&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;error_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[❯](bold fg:red)&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;vimcmd_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[❯](bold fg:green)&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;vimcmd_replace_one_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[❯](bold fg:purple)&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;vimcmd_replace_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[❯](bold fg:purple)&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;vimcmd_visual_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[❯](bold fg:yellow)&apos;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;pipestatus&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;map_symbol&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;cmd_duration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[$duration]($style)&apos;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;min_time&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;結局かなり長くなってしまった&lt;/p&gt;
&lt;p&gt;見た目はこんな感じ&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 552px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4436a26f2d94aaabdefae91d5a8770d5/08c0b/introduction_starship02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.405405405405407%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABhklEQVR42jWQ3U/TYBSHd+eFAUVhkikNW9u1K6Mfa7v2bdloG9jqheFmTrK4TSBkFmdUuDLRG//xx3dEr845v9/Jcz5q13d/COMHtl/MEIMHXOczT+0f7Gn3GLs3eOKb9L+j6Dc0nsx4rt+jvpN6WuAGI5K45DR5y0CUqF5ObXr5leFohZ8tGcgo0lt23SUNc0lLmWD3F9jhAsV4T6N+Qf1oiZZPOYpyusEZUTQmike44RnaBvi6HdIRCWGZY6UpnfgUywswgwAtjmk6fQ6dkHYYY6QJlt9HtxKpFzQlQLEz6We0ZK73JPDy6iddUbGzN8ULK6zOJ7btL+zra4z6QgJucfwVB/qCN1sfeGmuUcs5jiiwg3NENqYbbbYrJLCgdr36xZX3m4PDj0Qna3wJeGbfUdcrmvszfDnMjysUbc6rrQk7ZoU2nnMs8kdgkpXY4lz+7x+w7Q6ZqBcYvSEtJ5VGiuklsk7QgwGqm9JyZd47od0fYPZS9GPZ6xaPZzbluf+32/zwLyHyyFC0zK3lAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/4436a26f2d94aaabdefae91d5a8770d5/cbe2e/introduction_starship02.webp 148w,
/static/4436a26f2d94aaabdefae91d5a8770d5/3084c/introduction_starship02.webp 295w,
/static/4436a26f2d94aaabdefae91d5a8770d5/dd35b/introduction_starship02.webp 552w&quot;
              sizes=&quot;(max-width: 552px) 100vw, 552px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/4436a26f2d94aaabdefae91d5a8770d5/12f09/introduction_starship02.png 148w,
/static/4436a26f2d94aaabdefae91d5a8770d5/e4a3f/introduction_starship02.png 295w,
/static/4436a26f2d94aaabdefae91d5a8770d5/08c0b/introduction_starship02.png 552w&quot;
            sizes=&quot;(max-width: 552px) 100vw, 552px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/4436a26f2d94aaabdefae91d5a8770d5/08c0b/introduction_starship02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;各種言語のランタイム&lt;/h2&gt;
&lt;p&gt;蛇足&lt;/p&gt;
&lt;p&gt;最初は設定して表示するようにしてたがなんかしっくり来なかったのと常に表示しておく必要ないよねということで消した&lt;/p&gt;
&lt;p&gt;代わりに次のようなコマンドを用意し実行したら現在のディレクトリでの言語ランタイムのバージョンが分かるようにした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bin/runtimes&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/sh

starship module ruby; starship module nodejs; starship module python; starship module golang;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2cb8c92547b741942187ff0f436c18ce/1bba8/introduction_starship03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 16.216216216216214%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA10lEQVR42h2Oy06DUAAFWbvQxJjoQqO0IEJ5FG5BKBTKuwXUlW76AZpoatLY3/CXR+JiklmcTI70efhFMb7Q53uS1ZFz68CpfES7fEeEP8ycby5Odpxd7bkdPhBRjggakrxFdXPU+RplRHYyVK9Acpc1cdGSbnqyfsCMahSvRPNLjMcGTZTcu/U4Hn3R8CAqVL9mGm9R/Ap5jOtxh8iemYxhyTNCEm2BZ0Q4xhJdrDGTCjursVYV+vjIDvt/zKBjFmyZhhtuujcm6cB1/oLdvlI87bizUv4ACCtksW8f8NYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2cb8c92547b741942187ff0f436c18ce/cbe2e/introduction_starship03.webp 148w,
/static/2cb8c92547b741942187ff0f436c18ce/3084c/introduction_starship03.webp 295w,
/static/2cb8c92547b741942187ff0f436c18ce/5ca24/introduction_starship03.webp 590w,
/static/2cb8c92547b741942187ff0f436c18ce/7eb86/introduction_starship03.webp 642w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2cb8c92547b741942187ff0f436c18ce/12f09/introduction_starship03.png 148w,
/static/2cb8c92547b741942187ff0f436c18ce/e4a3f/introduction_starship03.png 295w,
/static/2cb8c92547b741942187ff0f436c18ce/fcda8/introduction_starship03.png 590w,
/static/2cb8c92547b741942187ff0f436c18ce/1bba8/introduction_starship03.png 642w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2cb8c92547b741942187ff0f436c18ce/fcda8/introduction_starship03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[MutationObserverで対象要素がコールバック実行時に存在するかのチェック]]></title><description><![CDATA[特定のDOMの変更を監視して変更があったらあらかじめセットしたコールバックを実行させることができるMutationObserverという便利なAPIがある MutationObserver - Web API | MDN…]]></description><link>https://til.swfz.io/entries/mutation_observer_element_connected/</link><guid isPermaLink="false">https://til.swfz.io/entries/mutation_observer_element_connected/</guid><pubDate>Mon, 16 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;特定のDOMの変更を監視して変更があったらあらかじめセットしたコールバックを実行させることができるMutationObserverという便利なAPIがある&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/API/MutationObserver&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MutationObserver - Web API | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;かなり便利なんだけど、昨今のインタラクティブにレイアウトがいろいろ変わるUIだと、一度監視を開始したはずがいつの間にか対象のDOMが削除されてしまってたみたいなことがよくある&lt;/p&gt;
&lt;p&gt;監視が効いているかチェックできれば良いなと調べたらやはりあった&lt;/p&gt;
&lt;h2&gt;isConnected&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/API/Node/isConnected&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Node: isConnected プロパティ - Web API | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Node.isConnected&lt;/p&gt;
&lt;p&gt;対象ノードがドキュメントツリーに接続されているかを判定するための真偽値&lt;/p&gt;
&lt;p&gt;ドキュメント内に対象が存在しているか確認する際に使われるもの&lt;/p&gt;
&lt;p&gt;これを活用すると一度Observeした要素が何かしらの理由で削除された場合に検知が可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サンプルコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; observeElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; observer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MutationObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  records&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; MutationRecord&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;observeElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isConnected&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Document内に存在している場合の処理&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 変更を検知して行う処理&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 何らかの理由でDocument内に存在しない状態&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// エラーハンドリングなり再度Observeするなりの処理&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;observeElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; subtree&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; childList&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;isConnected&lt;/code&gt;は対象Nodeがドキュメント内に存在する間は&lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;が返ってくるので対象要素以下のDOMの変更を検知して何かしらの処理をする&lt;/p&gt;
&lt;p&gt;DOMに変更があり監視対象のNodeが削除された場合、その変更もObserve対象に入るのでその段階で&lt;code class=&quot;language-text&quot;&gt;else&lt;/code&gt;に通り何かしらのハンドリングを行える&lt;/p&gt;</content:encoded></item><item><title><![CDATA[適用されているすべてのスタイルを打ち消す]]></title><description><![CDATA[Chrome…]]></description><link>https://til.swfz.io/entries/css_reset/</link><guid isPermaLink="false">https://til.swfz.io/entries/css_reset/</guid><pubDate>Sat, 14 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;Chrome拡張で&lt;code class=&quot;language-text&quot;&gt;document.createElement&lt;/code&gt;などでタグを生成して既存のコンテンツページに追加するというような操作はよくあるかと思うが&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;あらかじめそのサイトで設定されていたスタイルが適用されてしまうケースが存在する（&lt;code class=&quot;language-text&quot;&gt;div&lt;/code&gt;など特定のタグ粒度に対してのスタイル設定など）&lt;/p&gt;
&lt;p&gt;これが意図したものではなく、スタイル未適用のほうが望ましい&lt;/p&gt;
&lt;p&gt;ブラウザ拡張でタグを突っ込む場合は下手にユーザーエージェントスタイルシートの影響を受けたくない&lt;/p&gt;
&lt;p&gt;そんな場合に使える&lt;code class=&quot;language-text&quot;&gt;all&lt;/code&gt;プロパティ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unset&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; この要素はデフォルトのスタイルが解除されています &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; initial&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; この要素はすべてのスタイルが初期値にリセットされています &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;initialはすべてリセット&lt;/p&gt;
&lt;p&gt;unsetは親要素から一部プロパティを継承するらしい&lt;/p&gt;
&lt;p&gt;継承されるプロパティ&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3e2fab87b24234fa2d8130990668ceb0/46e30/css_reset01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 97.2972972972973%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABrElEQVR42o2U6Y6CQBCEff/Hw/jDGBPxQAW8FZCrd7/eNBk5FidphZ6ZmuqqHibyO5bLpXieJ77vy3q91vfn8yl1XUue51IUhUZVVRplWepc35jw836/5Xa7yf1+1/8wDGW73cput5PZbKYHbTYbzZ/PZw0OGgR8vV66gYVBEMh0Om0A2xthNhQfgJweRZGCrlYrDd45wFhTwdhQQEDm87myYuN+v1cgcpRLjvfD4SBxHMvpdOoE+SzL/gAfj4duhpHpSCwWCz2EHCaRu16vvXG5XNQLBUQnWLjO8ZwkSSMFi8cGexqXKQcmgJvISEEeCQAfM4WWahiiEU6jA4NJAGGIad+43AE8Ho+atEm0RWz0S9NUgckPgX8AUhZ9Z6W5gOYs5QMOMHPcnkFAFlOy9ZoLiLvozGHkcJWcq3dvydxjFtsCnmEOiFvqVyUDSMkwtQX0FoCYY21jrfWVKdwK12X6z/oQlmjHPDq29esAwo4wJgZorK2F0JhuwPU2094+dE0xZwE2gP/6sQGkDO4sphggCwAijzkAEm1newHRwz6e7gI0oz2sVYixK/gD0tC/6qpj2uMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/3e2fab87b24234fa2d8130990668ceb0/cbe2e/css_reset01.webp 148w,
/static/3e2fab87b24234fa2d8130990668ceb0/3084c/css_reset01.webp 295w,
/static/3e2fab87b24234fa2d8130990668ceb0/5ca24/css_reset01.webp 590w,
/static/3e2fab87b24234fa2d8130990668ceb0/dad35/css_reset01.webp 885w,
/static/3e2fab87b24234fa2d8130990668ceb0/2baf0/css_reset01.webp 1180w,
/static/3e2fab87b24234fa2d8130990668ceb0/78953/css_reset01.webp 1303w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/3e2fab87b24234fa2d8130990668ceb0/12f09/css_reset01.png 148w,
/static/3e2fab87b24234fa2d8130990668ceb0/e4a3f/css_reset01.png 295w,
/static/3e2fab87b24234fa2d8130990668ceb0/fcda8/css_reset01.png 590w,
/static/3e2fab87b24234fa2d8130990668ceb0/efc66/css_reset01.png 885w,
/static/3e2fab87b24234fa2d8130990668ceb0/c83ae/css_reset01.png 1180w,
/static/3e2fab87b24234fa2d8130990668ceb0/46e30/css_reset01.png 1303w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/3e2fab87b24234fa2d8130990668ceb0/fcda8/css_reset01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;なるほど&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拡張内での一例&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;p&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;all &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;initial&quot;&lt;/span&gt;
  element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;テスト&quot;&lt;/span&gt;
  &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;all: initial&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じで出してみた&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b4327a67ac2b3c0e6ad6aded9fbf4852/cc418/css_reset02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.2972972972973%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABrElEQVR42m1UyZbCMAzj/39xoDTdF5amKQw9BUt2Spk3Bz9nlS3ZyWGenrFpp1h1S+zGZ+wvT45rm3eD2PiIdf+ITa9+vP5yXDRBbI555eOpmLh+mOY15nWIp9LHs2zg0LmaaUUbZG+m/TeHx3l4J/5yewmgX2PZBm5kpbeoYQPGnkPAwvMiss9kHWs69htwMzzi4T6tsqkXYTiUc75sGRUGmlsAzdDznttlywwBiIhlpwBONKn7hYAATz7Z33nSsSBl0fAmgEehU1lGmlVgAOpmVKCRMwYaMLBwXDfAAUW53l9cTJstLteqYaLHLADWI+jCYM72YUlrzVAAC4uMoiC6s6KoX7Yq5o1qlQBRqMqkAihajpRLo4rWSQccaYetsmmd0jC7T9GSJAMA737dMqgsMqI5u7SnlO00RfDPHc0cbLWxd723b9aztQ/GoJcAECCr/NcdgI7QEI19lGeTqO0zo4619afRY3X7hZ1A6hYAhhYk4PaUjOo3bX1BsKQbgmB+KtNT9fHHTaphAnSkBS8X5QAePz8LsVY+B1QQ2qGt4PFhwKOVMMY6WvANB8gWn2BdkS8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b4327a67ac2b3c0e6ad6aded9fbf4852/cbe2e/css_reset02.webp 148w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/3084c/css_reset02.webp 295w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/5ca24/css_reset02.webp 590w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/dad35/css_reset02.webp 885w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/2baf0/css_reset02.webp 1180w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/75f48/css_reset02.webp 1992w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b4327a67ac2b3c0e6ad6aded9fbf4852/12f09/css_reset02.png 148w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/e4a3f/css_reset02.png 295w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/fcda8/css_reset02.png 590w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/efc66/css_reset02.png 885w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/c83ae/css_reset02.png 1180w,
/static/b4327a67ac2b3c0e6ad6aded9fbf4852/cc418/css_reset02.png 1992w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b4327a67ac2b3c0e6ad6aded9fbf4852/fcda8/css_reset02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;この記述方法だとすべてのプロパティに対して&lt;code class=&quot;language-text&quot;&gt;initial&lt;/code&gt;がセットされるみたい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[element.click()を特定要素が取得できるまで待つ]]></title><description><![CDATA[chrome拡張を作っていて、たとえばSlackに自動で投稿するみたいな機能を作っていた SlackのUIは テキストエリアに何か入力したら送信ボタンのdisableが消えて送信可能な状態になる Enter…]]></description><link>https://til.swfz.io/entries/element_click_with_wait_for_selector/</link><guid isPermaLink="false">https://til.swfz.io/entries/element_click_with_wait_for_selector/</guid><pubDate>Fri, 13 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;chrome拡張を作っていて、たとえばSlackに自動で投稿するみたいな機能を作っていた&lt;/p&gt;
&lt;p&gt;SlackのUIは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テキストエリアに何か入力したら送信ボタンのdisableが消えて送信可能な状態になる&lt;/li&gt;
&lt;li&gt;Enterキー押下もしくは送信ボタンをクリックでテキストを投稿できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;単純にテキストエリアにテキストを入れ込み、送信ボタンをクリックする処理を行えば行けるよねと思っていた&lt;/p&gt;
&lt;p&gt;が、devtoolで確認するときは1つの処理ごとコンソールに入力し動作するが、いざ組み合わせて実行するとうまくいかない&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;1度目の実行でテキストが入力された状態になる&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;2度目実行すると送信される&lt;/p&gt;
&lt;p&gt;ということは送信ボタンがクリックされていない…&lt;/p&gt;
&lt;p&gt;devtoolで確認したときは手動なので気付かなかったが、入力からクリックまでの時間が短いと、UI側が入力を検知して送信ボタンのdisableを解除する前にクリックしてしまっている状態のようだった&lt;/p&gt;
&lt;p&gt;なので自動で処理させる場合はクリックする対象の要素のdisable状態とクリック可能な状態を把握し押下可能な状態のセレクタで要素が取得できるまで待つ必要がある&lt;/p&gt;
&lt;p&gt;puppeteerでスクレイピングしてたときは普通にwaitForとか使っていたし、まぁよく考えてみれば当たり前ではあるんだけど…&lt;/p&gt;
&lt;p&gt;ということで指定のセレクタの要素が出現するまで待つ関数を用意し、出現してクリック可能な状態の要素を取得してクリックするようにする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実装&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; waitForSelector &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  selector&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  timeout &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;resolve&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; reject&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; interval &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; elapsed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;checkExistence&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selector&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; element &lt;span class=&quot;token keyword&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elapsed &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; timeout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Timeout: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;selector&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; not found&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        elapsed &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; interval
        &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;checkExistence&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; interval&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;checkExistence&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;呼び出し側&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; textInput &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;HTMLParagraphElement&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.editor p&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
textInput&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; comment
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; submitSelector &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;button.send&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; submitButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;waitForSelector&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;HTMLButtonElement&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;submitSelector&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
submitButton&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;waitForSelector&lt;/code&gt;に渡すセレクタは、入力によって変化した部分を指定する必要がある&lt;/p&gt;
&lt;p&gt;そうしないと、実際にはクリックできない要素を取得してしまうことになるので&lt;code class=&quot;language-text&quot;&gt;disable&lt;/code&gt;時には取得できないようなセレクタを指定する&lt;/p&gt;
&lt;p&gt;差分がない…場合はまた考えないといけないが、たいていどこかしらには変化があるはずなのでそれをうまく取り入れれば行ける&lt;/p&gt;
&lt;p&gt;これで特定要素の出現を待ってからクリックできる&lt;/p&gt;
&lt;p&gt;勉強になりました&lt;/p&gt;</content:encoded></item><item><title><![CDATA[OllamaをWSLで使い、コミットメッセージを考えてもらう]]></title><description><![CDATA[環境 /etc/wsl.conf Ollama Ollama 前にもちょっとだけDockerで触ってみたけど再度触ってみる ClaudeからMCPが出てきたのでOllama…]]></description><link>https://til.swfz.io/entries/ollama_in_wsl_using_opencommit/</link><guid isPermaLink="false">https://til.swfz.io/entries/ollama_in_wsl_using_opencommit/</guid><pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;環境&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;WSL2
Ubuntu24.04&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;/etc/wsl.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ini line-numbers&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;boot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;systemd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;wsl2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;16G&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;swap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;localhostForwarding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;nestedVirtualization&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;interop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;appendWindowsPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Ollama&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ollama.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ollama&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;前にもちょっとだけDockerで触ってみたけど再度触ってみる&lt;/p&gt;
&lt;p&gt;ClaudeからMCPが出てきたのでOllamaと組み合わせたらローカルでいろいろできるかも?と思ったのがきっかけ&lt;/p&gt;
&lt;p&gt;機密な情報を扱ってもローカル内で収まるので使いやすい&lt;/p&gt;
&lt;p&gt;ということで試してみる&lt;/p&gt;
&lt;h3&gt;install&lt;/h3&gt;
&lt;p&gt;brewも行けるみたいだがmiseでも行けた、もはやすべてのツール類はubiで対応できるようにしてくれたらみんな幸せだよな&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.config/mise/config.toml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;toml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-toml line-numbers&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;tools&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;ollama&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;latest&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mise i&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Ollamaサーバの起動&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ollama serve&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;サーバは&lt;code class=&quot;language-text&quot;&gt;127.0.0.1:11434&lt;/code&gt;で起動する&lt;/p&gt;
&lt;h3&gt;モデルのPull&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ollama pull llama3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;llama3を使ってみる&lt;/p&gt;
&lt;p&gt;リストを確認&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ollama list
NAME             ID              SIZE      MODIFIED
llama3:latest    365c0bd3c000    &lt;span class=&quot;token number&quot;&gt;4.7&lt;/span&gt; GB    &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; weeks ago&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;実行&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ollama run llama3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;対話的UIが起動してチャットできる&lt;/p&gt;
&lt;p&gt;一部抜粋&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt;&gt;&gt; 日本語喋れるの？
(konnichiwa!) I&apos;d be happy to chat with you in Japanese! 💬 What would you like to talk about? 🤔

&gt;&gt;&gt; 日本語で返信してみて
😊
私は日本語での返信をします！何か質問や話題がありましたら、聞きます！

(Translation: I&apos;ll respond in Japanese! If you have any questions or topics, please let me know!) 😊&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;なんともフレンドリー&lt;/p&gt;
&lt;p&gt;このくらいのやりとりであれば、そこまで待つことはなくサクサク返信が返ってくる&lt;/p&gt;
&lt;h3&gt;APIの実行&lt;/h3&gt;
&lt;p&gt;パラメータとかは下記&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-completion&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ollama/docs/api.md at main · ollama/ollama&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl http://localhost:11434/api/chat -d &apos;{  
  &quot;model&quot;: &quot;llama3&quot;,
  &quot;stream&quot;: false,  
  &quot;messages&quot;: [  
    { &quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;why is the sky blue?&quot; }  
  ]  
}&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;stream&lt;/code&gt;ありだと順々レスポンスが返ってくる&lt;/p&gt;
&lt;p&gt;CLI作ったりするならfalseのほうが楽かな&lt;/p&gt;
&lt;p&gt;Ollama側の準備は整った&lt;/p&gt;
&lt;h2&gt;コミットメッセージをローカルLLMで&lt;/h2&gt;
&lt;p&gt;opencommitを使ってみる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/di-sukharev/opencommit&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;di-sukharev/opencommit: just a GPT wrapper for git — generate commit messages by an LLM in 1 sec — works best with Claude 3.5 — supports local models too&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;インストール&lt;/h3&gt;
&lt;p&gt;こちらもmiseでいれた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.config/mise/config.toml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;toml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-toml line-numbers&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;tools&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;&quot;npm:opencommit&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;latest&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mise i&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;APIエンドポイントの設定&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oco config set OCO_AI_PROVIDER=&apos;ollama&apos; OCO_MODEL=&apos;llama3&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デフォルトだとcommit確定したらpushもさせようとするらしい、それをOFFする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oco config set OCO_GITPUSH=false&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;APIエンドポイントの設定、ローカルのOllamaが起動しているサーバを指定する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oco config set OCO_API_URL=&apos;http://127.0.0.1:11434/api/chat&apos;  &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;指定がないと次のようなエラーが出てくる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oco  
┌ open-commit  
│  
◇ 1 staged files:  
config/mise/config.toml  
│  
◇ ✖ Failed to generate the commit message  
Error: Ollama provider error: Invalid URL  
at OllamaEngine.generateCommitMessage (/home/user/.local/share/mise/installs/npm-opencommit/3.2.2/lib/node_modules/opencommit/out/cli.cjs:40212:13)  
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)  
at async generateCommitMessageByDiff (/home/user/.local/share/mise/installs/npm-opencommit/3.2.2/lib/node_modules/opencommit/out/cli.cjs:45082:27)  
at async generateCommitMessageFromGitDiff (/home/user/.local/share/mise/installs/npm-opencommit/3.2.2/lib/node_modules/opencommit/out/cli.cjs:45293:25)  
at async trytm (/home/user/.local/share/mise/installs/npm-opencommit/3.2.2/lib/node_modules/opencommit/out/cli.cjs:45261:18)  
at async commit (/home/user/.local/share/mise/installs/npm-opencommit/3.2.2/lib/node_modules/opencommit/out/cli.cjs:45458:35)  
│  
└ ✖ Ollama provider error: Invalid URL&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;テンプレート化&lt;/h3&gt;
&lt;p&gt;たとえばissue番号を含めたい場合とかこうするみたい&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oco &apos;#205: $msg’&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;実行&lt;/h3&gt;
&lt;p&gt;適当なリポジトリで適当にステージして実行してみる&lt;/p&gt;
&lt;p&gt;実際の差分は下記&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/dotfiles/pull/1209/commits/78eede5880f204f16e3602e81c4a0e8d68c3ece5&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;chore(config/mise/config.toml): add opencommit and rust dependencies to the configuration file by swfz · Pull Request #1209 · swfz/dotfiles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;miseで管理するツールを増やしただけ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oco  
┌ open-commit  
│  
◇ 1 staged files:  
config/mise/config.toml  
│  
◇ 📝 Commit message generated  
│  
└ Generated commit message:  
—————————————————— chore(config/mise/config.toml): add opencommit and rust dependencies to the configuration file  
——————————————————  
│  
◇ Confirm the commit message?  
│ Yes  
│  
◇ ✔ Successfully committed  
│  
└ [feature/add-tools 78eede5] chore(config/mise/config.toml): add opencommit and rust dependencies to the configuration file  
1 file changed, 2 insertions(+)  
  
│  
◇ Do you want to run `git push`?  
│ No  
│  
└ `git push` aborted&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;文言もYes/Noで選択できるみたい&lt;/p&gt;
&lt;p&gt;メッセージはあっている&lt;/p&gt;
&lt;p&gt;しかし結構時間かかった…（3m17s）&lt;/p&gt;
&lt;p&gt;短文のメッセージやりとりはそれなりの速度だったけどopencommitになったら結構時間がかかってしまった&lt;/p&gt;
&lt;p&gt;どのようなやりとりをしているかまで追っていないのでわからないが、このままだと厳しいなぁという印象だった&lt;/p&gt;
&lt;p&gt;WSLだとチューニングしないと厳しい時間、コミットに3分待たされるのはさすがに苦痛&lt;/p&gt;
&lt;p&gt;題材としてコミットメッセージを取り上げてみたが自分の環境だと全然速度が出なかったので環境変わったら再度試してみようかな…という感じだった&lt;/p&gt;
&lt;p&gt;他の活用パターンを模索してみたいところ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CSS Keyframesでのアニメーションとアニメーション後の処理]]></title><description><![CDATA[Chrome拡張で画面上にテキストを流す処理を書いていた テキストを流す処理自体はCSSのKeyframeでサクッと実現できたがアニメーションしたあとは消したい（非表示にさせたい） @keyframes @keyframes - CSS…]]></description><link>https://til.swfz.io/entries/keyframes_animation_animationend/</link><guid isPermaLink="false">https://til.swfz.io/entries/keyframes_animation_animationend/</guid><pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chrome拡張で画面上にテキストを流す処理を書いていた&lt;/p&gt;
&lt;p&gt;テキストを流す処理自体はCSSのKeyframeでサクッと実現できたがアニメーションしたあとは消したい（非表示にさせたい）&lt;/p&gt;
&lt;h2&gt;@keyframes&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/CSS/@keyframes&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@keyframes - CSS: カスケーディングスタイルシート | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;開始（from）から終了（to）、または中間の地点（&lt;code class=&quot;language-text&quot;&gt;50%&lt;/code&gt;など）それぞれにスタイルを定義し、アニメーションにする&lt;/p&gt;
&lt;h2&gt;KeyframesによるCSSアニメーション&lt;/h2&gt;
&lt;h3&gt;アニメーション定義&lt;/h3&gt;
&lt;p&gt;右端見えないところから左へX座標を-150vh分までずらす&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-css line-numbers&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; slideLeft&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-150vw&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;styleの指定&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;
element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;right &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-30%&quot;&lt;/span&gt;
element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;animation &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;slideLeft 4s linear&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;初期位置が右端から&lt;code class=&quot;language-text&quot;&gt;-30%&lt;/code&gt;の位置&lt;/p&gt;
&lt;h3&gt;指定方法&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/animation&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;animation - CSS: Cascading Style Sheets | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;種類がたくさんある、バリエーションを調べるにはドキュメントを読むのが一番早い&lt;/p&gt;
&lt;p&gt;あとはGPTに聞くなりで使えれば良いかな…&lt;/p&gt;
&lt;p&gt;今回は&lt;code class=&quot;language-text&quot;&gt;animation: ${Keyframesで定義した名前} ${アニメーションの実行時間は4秒} ${一定速度でアニメーションを実行}&lt;/code&gt;という感じで指定した&lt;/p&gt;
&lt;h2&gt;JavaScript側&lt;/h2&gt;
&lt;h3&gt;animationend&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/API/Element/animationend_event&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Element: animationend イベント - Web API | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CSSアニメーションが完了したときに発生するイベント&lt;/p&gt;
&lt;p&gt;イベントのコールバックを指定できる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;
element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;right &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-30%&quot;&lt;/span&gt;
element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;animation &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;slideLeft 4s linear&quot;&lt;/span&gt;
element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onanimationend&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; slideLeftElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; HTMLParagraphElement
  slideLeftElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;none&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;アニメーションが終了したら&lt;code class=&quot;language-text&quot;&gt;display: none&lt;/code&gt;になる&lt;/p&gt;
&lt;p&gt;これがないと、初期位置に要素が残ったままになってしまう、今回の仕様だとスクロールが必要な感じになってしまう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;animation-fill-mode&lt;/code&gt;でもできそうかな?と思ったけど読んでみたらやりたいこととは違いそうだった&lt;/p&gt;
&lt;p&gt;なにはともあれこれで「テキストを流してそのあと非表示にさせる」を実現できた&lt;/p&gt;
&lt;p&gt;JavaScriptで座標を計算して移動RequestAnimationframeでアニメーションさせるという方法もあるが、こういうのはCSSに任せられたほうが全体としてスッキリするかなと感じている&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GatsbyでESlint flat config(v9)対応のメモ]]></title><description><![CDATA[供養の意味のメモ 前提説明足りないとか全然ありそうだがどこかの誰かの役に立てれば… Gatsby製の本サイトでRenovate対応の際に試行錯誤したのでそのログの断片 そもそもflat configの対応から必要だった migration guide FlatConfig…]]></description><link>https://til.swfz.io/entries/eslint_flatconfig/</link><guid isPermaLink="false">https://til.swfz.io/entries/eslint_flatconfig/</guid><pubDate>Tue, 10 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;供養の意味のメモ&lt;/p&gt;
&lt;p&gt;前提説明足りないとか全然ありそうだがどこかの誰かの役に立てれば…&lt;/p&gt;
&lt;p&gt;Gatsby製の本サイトでRenovate対応の際に試行錯誤したのでそのログの断片&lt;/p&gt;
&lt;p&gt;そもそもflat configの対応から必要だった&lt;/p&gt;
&lt;h2&gt;migration guide&lt;/h2&gt;
&lt;p&gt;FlatConfigへのマイグレーションは基本下記読めば良いっぽい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://eslint.org/docs/latest/use/configure/migration-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Configuration Migration Guide - ESLint - Pluggable JavaScript Linter&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;migrate&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;migraterを実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ npx @eslint/migrate-config .eslintrc.json

Need to &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; the following packages:  
@eslint/migrate-config@1.3.0  
Ok to proceed? &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; y  
  
  
Migrating .eslintrc.json  
  
Wrote new config to ./eslint.config.mjs  
  
You will need to &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; the following packages to use the new config:  
- @eslint/compat  
- globals  
- @eslint/js  
- @eslint/eslintrc  
  
You can &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; them using the following command:  
  
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; @eslint/compat globals @eslint/js @eslint/eslintrc &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これらが必要だからインストールしてねって話らしいのでインストールする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; @eslint/compat globals @eslint/js @eslint/eslintrc &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;設定ファイルを&lt;code class=&quot;language-text&quot;&gt;eslint.config.mjs&lt;/code&gt;に変えてlint実行!&lt;/p&gt;
&lt;p&gt;怒られた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;TypeError: Key &quot;rules&quot;: Key &quot;valid-jsdoc&quot;: Could not find &quot;valid-jsdoc&quot; in plugin &quot;@&quot;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://eslint.org/docs/latest/rules/valid-jsdoc&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;valid-jsdoc - ESLint - Pluggable JavaScript Linter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;valid-jsdoc&lt;/code&gt;は非推奨になったらしい&lt;/p&gt;
&lt;p&gt;valid-jsdoc -&gt; eslint-plugin-jsdoc&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; eslint-plugin-jsdoc&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で再度試すもだめだった&lt;/p&gt;
&lt;p&gt;どこかに&lt;code class=&quot;language-text&quot;&gt;valid-jsdoc&lt;/code&gt;が残っている&lt;/p&gt;
&lt;p&gt;GPTに聞いたら&lt;code class=&quot;language-text&quot;&gt;extends&lt;/code&gt;で指定しているもので内部的に使っているものがあるかもということだったので…&lt;/p&gt;
&lt;p&gt;すべて除外してひとつずつ確認したら&lt;code class=&quot;language-text&quot;&gt;google&lt;/code&gt;ってのが原因のよう&lt;/p&gt;
&lt;p&gt;そもそも何のために入れたかすら覚えてないので消しても良い気がする…ということで消した&lt;/p&gt;
&lt;h2&gt;各種プラグインでの対応&lt;/h2&gt;
&lt;p&gt;とりあえず実行はできるようになったがかなりエラーが出てきた&lt;/p&gt;
&lt;p&gt;一部抜粋&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;3:35 error Parse errors in imported module &apos;gatsby&apos;: parserPath or languageOptions.parser is required! (undefined:undefined) import/namespace&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;import系が多い&lt;/p&gt;
&lt;p&gt;これ一個ずつ設定方法見に行かないといけないのか…？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/import-js/eslint-plugin-import&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;import-js/eslint-plugin-import: ESLint plugin with rules that help validate proper imports.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2024-09-20現在、eslint-plugin-import自体はflat config対応しているようなのでparserが見つからないのは個別設定をちゃんとしろって話かな&lt;/p&gt;
&lt;p&gt;違った…&lt;/p&gt;
&lt;p&gt;未対応プラグインの方っぽい次の消したらほとんどなくなった&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;compat.extends&lt;/code&gt;している下記設定&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// &quot;plugin:import/recommended&quot;,
// &quot;plugin:import/typescript&quot;,&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;てことはこれの話になってくるのか…&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;ul&gt;
&lt;li&gt;参考: &lt;a href=&quot;https://scrapbox.io/elecdeer-pub/eslint-plugin-import%E3%82%92flat_config%E3%81%A7%E4%BD%BF%E3%81%86%E3%81%A8parserPath_or_languageOptions.parser_is_required!%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;eslint-plugin-importをflat configで使うとparserPath or languageOptions.parser is required!エラーが発生する - elecdeer-pub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;実行して中身見てみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sample.mjs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; importPlugin &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eslint-plugin-import&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;importPlugin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;flatConfigs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recommended&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  &lt;span class=&quot;token literal-property property&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/no-unresolved&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/named&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/namespace&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/default&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/export&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/no-named-as-default&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;warn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/no-named-as-default-member&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;warn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;import/no-duplicates&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;warn&apos;&lt;/span&gt;  
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
  &lt;span class=&quot;token literal-property property&quot;&gt;languageOptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;ecmaVersion&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2018&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;sourceType&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;module&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;import/recommended&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Object&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Object&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;fixupPluginRulesで引っ張ってきているのは分かるが、recommendedやTypeScriptの設定はどこに入っているんだ…？ プリセットなのか？&lt;/p&gt;
&lt;p&gt;ちょっと調べる気力がなくなってしまったので両方消した&lt;/p&gt;
&lt;h2&gt;開発サーバ立ち上げ時のエラー&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR #98123 WEBPACK.DEVELOP  
  
Generating development JavaScript bundle failed  
  
[eslint]  
/home/user/til/gatsby-browser.tsx  
1:1 error Definition for rule &apos;valid-jsdoc&apos; was not found valid-jsdoc  
1:1 error Definition for rule &apos;require-jsdoc&apos; was not found require-jsdoc  
  
/home/user/til/src/components/archive.tsx  
1:1 error Definition for rule &apos;valid-jsdoc&apos; was not found valid-jsdoc  
1:1 error Definition for rule &apos;require-jsdoc&apos; was not found require-jsdoc&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;しばらく記事書いていなかったので開発サーバ立てなかったが立てたらエラーが発生するようになっていた…&lt;/p&gt;
&lt;h3&gt;Gatsby pluginがあった…&lt;/h3&gt;
&lt;p&gt;CIが成功しているのはおかしいと思って、CIのコマンドを試したら&lt;/p&gt;
&lt;p&gt;gatsby buildは成功する&lt;/p&gt;
&lt;p&gt;eslint個別実行も成功する&lt;/p&gt;
&lt;p&gt;ということで&lt;code class=&quot;language-text&quot;&gt;yarn dev&lt;/code&gt;だけで起きる問題っぽい&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gatsby-config&lt;/code&gt;を見に行ったら&lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-eslint&lt;/code&gt;を使っていた…&lt;/p&gt;
&lt;p&gt;develop時にlinter結果表示してくれるのありがたいけど必須ではないよな&lt;/p&gt;
&lt;p&gt;外すか?と考えたが一度見てみることにした&lt;/p&gt;
&lt;p&gt;試しに設定を外してyarn devしたら開発サーバを起動できた…ということで出どころは把握&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;h3&gt;webpackのloaderを変えてみる&lt;/h3&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;pluginの中身を読んだらただのコールバックの中身を設定するくんだったので変えてみる&lt;/p&gt;
&lt;p&gt;ESLintのOptionの渡し方を変えればOKかな？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/webpack-contrib/eslint-webpack-plugin&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/webpack-contrib/eslint-webpack-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この辺読んで設定する必要がありそう&lt;/p&gt;
&lt;p&gt;pluginのコードをそのまま持ってきていったん試す&lt;/p&gt;
&lt;p&gt;動かすところまではできた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/webpack-contrib/eslint-webpack-plugin?tab=readme-ov-file#configtype&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;webpack-contrib/eslint-webpack-plugin: A ESLint plugin for webpack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;よく見ると&lt;code class=&quot;language-text&quot;&gt;configType: &apos;flat&apos;&lt;/code&gt;とすることでflatconfigに対応してくれるよう&lt;/p&gt;
&lt;p&gt;そして&lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-eslint&lt;/code&gt;が他オプションをそのまま渡すような作りになっているのでconfigの項目として渡してもOKそう&lt;/p&gt;
&lt;h3&gt;rulesPaths&lt;/h3&gt;
&lt;p&gt;いくつか試したがだめだった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR #98123 WEBPACK.DEVELOP  
  
Generating development JavaScript bundle failed  
  
[eslint] Invalid Options:  
- Unknown options: rulePaths  
- &apos;rulePaths&apos; has been removed. Please define your rules using plugins.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もう少し調べたら、plugin側に&lt;code class=&quot;language-text&quot;&gt;rulePaths&lt;/code&gt;の設定があった&lt;/p&gt;
&lt;p&gt;中身見てみたらGatsby用にカスタムルールが作られているよう…&lt;/p&gt;
&lt;h3&gt;custom ruleを読み込ませる&lt;/h3&gt;
&lt;p&gt;pluginからカスタムルールを読み込ませていたがそれを自前でやればOKって話になる&lt;/p&gt;
&lt;p&gt;試行錯誤の末動いた…&lt;/p&gt;
&lt;p&gt;下記設定ファイルを用意し&lt;code class=&quot;language-text&quot;&gt;eslint.config.mjs&lt;/code&gt;の各種設定項目に反映させる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-eslint-custom-rules.mjs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; limitedExports &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./node_modules/gatsby/dist/utils/eslint-rules/limited-exports-page-templates.js&apos;&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; noAnonymousExports &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./node_modules/gatsby/dist/utils/eslint-rules/no-anonymous-exports-page-templates.js&apos;&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; plugin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  meta&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;gatsby-custom-rules&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    version&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;1.0.0&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  rules&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;limited-exports&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; limitedExports&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;no-anonymous-exports&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; noAnonymousExports&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; plugin&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;次の2つのCommitで動くようになった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/swfz/til/commit/ab7b4b4cbf14b324f2dd3b6666d5f4eb87035d80&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;fix: for eslint-webpack-plugin · swfz/til@ab7b4b4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/swfz/til/commit/080f1a685f5941ebff606acb2054e2a05824abd6&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;feat: add gatsby required rule · swfz/til@080f1a6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gatsbyの開発が活発でrequired ruleの追加されたりしたらそれは検知できないが…まぁないだろう！ と踏んでこのまま決め打ちで行くことにした&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;Branch作ったつもりで作業してpushしたらmaster fource push野郎になってしまった…疲れている&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;</content:encoded></item><item><title><![CDATA[zsh history searchからの改行の扱い]]></title><description><![CDATA[自分はzshrc上でpecoを使ってzsh_history…]]></description><link>https://til.swfz.io/entries/peco_include_newline_history/</link><guid isPermaLink="false">https://til.swfz.io/entries/peco_include_newline_history/</guid><pubDate>Mon, 09 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;自分はzshrc上でpecoを使ってzsh_historyからの検索しているが、実行コマンドに改行が含まれていた場合にうまく実行できない状態だった&lt;/p&gt;
&lt;p&gt;いろいろ調べて対応してみた記録&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;とりあえずいったんこうしたって感じなので今のところはベストだがまたうまくいかないケース出てくるかもしれない&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;h2&gt;前提となる設定（before）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;zshrc&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;peco-select-history&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tac&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tac&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token assign-left variable&quot;&gt;tac&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tac&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;token assign-left variable&quot;&gt;tac&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tail -r&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;BUFFER&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;history &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; $tac &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
        peco &lt;span class=&quot;token parameter variable&quot;&gt;--query&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$LBUFFER&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;CURSOR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$#&lt;/span&gt;BUFFER
    zle clear-screen
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
zle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; peco-select-history
bindkey &lt;span class=&quot;token string&quot;&gt;&apos;^r&apos;&lt;/span&gt; peco-select-history&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;よくある&lt;code class=&quot;language-text&quot;&gt;Ctrl+r&lt;/code&gt;で履歴検索して実行するやつ&lt;/p&gt;
&lt;h2&gt;改行が含まれるケース&lt;/h2&gt;
&lt;h3&gt;行継続&lt;/h3&gt;
&lt;p&gt;バックスラッシュで行を継続させるよとシェル上では指示して改行して可読性あげるパターン&lt;/p&gt;
&lt;p&gt;Actionsとかでワンショットのコマンド考えるときとかこういうのよくやる&lt;/p&gt;
&lt;p&gt;例&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;This is a long line hoge&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;long&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $NF}&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;履歴上はこのようになる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;echo &quot;This is a long line&quot; \\n| grep &quot;long&quot; \\n| awk &apos;{print $NF}&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で、普通に実行するとエラーになってしまう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;grep: \n: No such file or directory&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;対応は履歴呼び出し時に置換させる&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; s&lt;span class=&quot;token string&quot;&gt;&apos;/ \\\\n/ /g&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;かなり決め打ちではあるがしょうがない…&lt;/p&gt;
&lt;h3&gt;スクリプト&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;行の内容: &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; /path/to/file&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;シェルスクリプトをそのまま貼り付けて実行するパターン&lt;/p&gt;
&lt;p&gt;履歴呼び出し時&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;while read -r line; do\n echo &quot;行の内容: $line&quot;\ndone &amp;lt; /path/to/file&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実際は下記じゃないと動かない&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;while read -r line; do echo &quot;行の内容: $line&quot;; done &amp;lt; /path/to/file&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;行末に&lt;code class=&quot;language-text&quot;&gt;;&lt;/code&gt;が入るパターンと入らないパターンがあり、入らなくても改行を入れればよしなに解釈してくれるパターンが存在する&lt;/p&gt;
&lt;p&gt;そのため決め打ちで変換すると微妙だな…ということで&lt;code class=&quot;language-text&quot;&gt;zle redisplay&lt;/code&gt;+&lt;code class=&quot;language-text&quot;&gt;printf&lt;/code&gt;の組み合わせで、BUFFERに改行込みの表示をさせて貼り付けなり入力した状態と同じ状態を保つことに成功した&lt;/p&gt;
&lt;h2&gt;結果&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/12b6c13c0aad591feecd88d9a1cfe23d/peco_include_newline_history01.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;
&lt;h2&gt;最終的な設定（after）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;zshrc&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;peco-select-history&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tac&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tac&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token assign-left variable&quot;&gt;tac&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tac&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;token assign-left variable&quot;&gt;tac&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tail -r&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;selected&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;history &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; $tac &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
        peco &lt;span class=&quot;token parameter variable&quot;&gt;--query&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$LBUFFER&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; s&lt;span class=&quot;token string&quot;&gt;&apos;/ \\\\n/ /g&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;BUFFER&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${selected}&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    zle redisplay
    &lt;span class=&quot;token assign-left variable&quot;&gt;CURSOR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$#&lt;/span&gt;BUFFER
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
zle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; peco-select-history
bindkey &lt;span class=&quot;token string&quot;&gt;&apos;^r&apos;&lt;/span&gt; peco-select-history&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;1つ目の行継続の方も&lt;code class=&quot;language-text&quot;&gt;zle redisplay&lt;/code&gt;+&lt;code class=&quot;language-text&quot;&gt;printf&lt;/code&gt;パターンで解決したかったが、いろいろ試してもBUFFER上に&lt;code class=&quot;language-text&quot;&gt;\&lt;/code&gt;をどうしても表示させられなかったため断念&lt;/p&gt;
&lt;p&gt;とりあえずは改行含めたコマンドも履歴から再現できるようになったので快適度は上がった&lt;/p&gt;
&lt;p&gt;誰かよい方法知っていたら教えてほしいです…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub GraphQL API Explorerをフルスクリーンで見たい]]></title><description><![CDATA[GitHubのGraphQL APIにクエリする場合、まず下記のExplorerを使ってクエリの調整することが多いと思う エクスプローラー - GitHub Docs ただ、Explorer自体の可視範囲が狭くもっと広くしてくれ…と常々思っていた CSS…]]></description><link>https://til.swfz.io/entries/github_graphql_explorer_fullscreen/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_graphql_explorer_fullscreen/</guid><pubDate>Sat, 07 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;GitHubのGraphQL APIにクエリする場合、まず下記のExplorerを使ってクエリの調整することが多いと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/graphql/overview/explorer&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;エクスプローラー - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ただ、Explorer自体の可視範囲が狭くもっと広くしてくれ…と常々思っていた&lt;/p&gt;
&lt;p&gt;CSSちょっといじったらなんとかならないかな?と調べたら同じことを思っていた人がいたようですでに解決されていた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cazzulino.com/gh-graphql.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub GraphQL API Full Screen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ほぼこの参考記事の通り&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://microsoftedge.microsoft.com/addons/detail/custom-style-script/eocdolakkgkbmnfojgicnicdnmimfhoo&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Custom Style Script - Microsoft Edge Addons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;っていう特定のURLにカスタムのJavaScriptやCSSを差し込めるというChrome拡張を使ってGitHub GraphQL ExplorerようにCSSを設定する&lt;/p&gt;
&lt;p&gt;CSSに記事書いた人が用意してくれているGistのCSSを読ませる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/kzu/8a205bebfd0a88eab3b5bf66e37a4e77&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub GraphQL API Explorer Full Screen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;設定を済まし、Explorerを再読込したらできた！&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/71fd907d98ab0199bd069a6ebbcf3c6c/4586f/github_graphql_explorer_fullscreen01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.70270270270271%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABEklEQVR42q2Q3U7CQBCF+1bKj0aKD2HClSbe+RAaiD9XCgI1htSCJgLe+QwqEIrou9iC+3ecLk10qTGGdLJfdncm5+RkrOzmNiIyG0Vk8jbW8wXCNsnZyV7MWq5AuuLind2CNRxNMBj6mpfBGP7kHWN/avL6Sy8m0j89j0j3hsrxGSy304N310Pj2kOTcFptuJ0uvNv+gnYXbtP7/id4wA3d9/1H7O0fwPoIAwjJIaWAVBESRik6cqm3VDKeH5VPYQXBDIpEQkgaKI0QwoALnuj9hDGmDQ/LJ2QYzslQaVYtI2EYRglleoafcdz0Es7meumc/72nf++QMZ5ewgolPK86qNWvUL1cnYuag4bTwk5pF192BvX8FVg23gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/71fd907d98ab0199bd069a6ebbcf3c6c/cbe2e/github_graphql_explorer_fullscreen01.webp 148w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/3084c/github_graphql_explorer_fullscreen01.webp 295w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/5ca24/github_graphql_explorer_fullscreen01.webp 590w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/dad35/github_graphql_explorer_fullscreen01.webp 885w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/2baf0/github_graphql_explorer_fullscreen01.webp 1180w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/a4c4d/github_graphql_explorer_fullscreen01.webp 3731w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/71fd907d98ab0199bd069a6ebbcf3c6c/12f09/github_graphql_explorer_fullscreen01.png 148w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/e4a3f/github_graphql_explorer_fullscreen01.png 295w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/fcda8/github_graphql_explorer_fullscreen01.png 590w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/efc66/github_graphql_explorer_fullscreen01.png 885w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/c83ae/github_graphql_explorer_fullscreen01.png 1180w,
/static/71fd907d98ab0199bd069a6ebbcf3c6c/4586f/github_graphql_explorer_fullscreen01.png 3731w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/71fd907d98ab0199bd069a6ebbcf3c6c/fcda8/github_graphql_explorer_fullscreen01.png&quot;
            alt=&quot;image&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;これは快適&lt;/p&gt;</content:encoded></item><item><title><![CDATA[chrome拡張が動かなくなってた]]></title><description><![CDATA[90秒で拡張が作れる!で結構知られた感じがあるだが、最近ビルドが通らなくなってしまった で、GitHubに行って調べてみると crxjs/chrome-extension-tools: Bundling Chrome Extensions can be pretty…]]></description><link>https://til.swfz.io/entries/chrome_extension_vite_plugin_beta/</link><guid isPermaLink="false">https://til.swfz.io/entries/chrome_extension_vite_plugin_beta/</guid><pubDate>Fri, 06 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;90秒で拡張が作れる!で結構知られた感じがある&lt;code class=&quot;language-text&quot;&gt;rollup-plugin-chrome-extension&lt;/code&gt;だが、最近ビルドが通らなくなってしまった&lt;/p&gt;
&lt;p&gt;で、GitHubに行って調べてみると&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/crxjs/chrome-extension-tools&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;crxjs/chrome-extension-tools: Bundling Chrome Extensions can be pretty complex. It doesn’t have to be.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新たに&lt;code class=&quot;language-text&quot;&gt;@crxjs/vite-plugin&lt;/code&gt;というのが出てた、以前気付かなかっただけかはわからないがのりで変更してみるかということで変えてみた&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;@crxjs/vite-plugin&lt;/code&gt;に変更&lt;/p&gt;
&lt;p&gt;そしたらviteとのかみ合わせが悪いようだったので&lt;/p&gt;
&lt;p&gt;viteを4-&gt;5に上げた、そしたら違うエラーが出てきた&lt;/p&gt;
&lt;h2&gt;buildが失敗する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;2024-11-21T11:59:00.4021417Z [31m[crx:content-script-resources] Error: vite manifest is missing
2024-11-21T11:59:00.4025323Z     at Object.renderCrxManifest (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/@crxjs+vite-plugin@1.0.14_vite@5.4.11_@types+node@20.14.15_/node_modules/@crxjs/vite-plugin/dist/index.mjs:3240:21)
2024-11-21T11:59:00.4029735Z     at Object.generateBundle (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/@crxjs+vite-plugin@1.0.14_vite@5.4.11_@types+node@20.14.15_/node_modules/@crxjs/vite-plugin/dist/index.mjs:2922:60)
2024-11-21T11:59:00.4031840Z     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
2024-11-21T11:59:00.4033813Z     at async Bundle.generate (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/rollup@4.27.3/node_modules/rollup/dist/es/shared/node-entry.js:19094:9)
2024-11-21T11:59:00.4036458Z     at async file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/rollup@4.27.3/node_modules/rollup/dist/es/shared/node-entry.js:21773:27
2024-11-21T11:59:00.4039250Z     at async catchUnfinishedHookActions (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/rollup@4.27.3/node_modules/rollup/dist/es/shared/node-entry.js:21155:16)
2024-11-21T11:59:00.4042071Z     at async build (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/vite@5.4.11_@types+node@20.14.15/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:65449:16)
2024-11-21T11:59:00.4044894Z     at async CAC.&amp;lt;anonymous&gt; (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/vite@5.4.11_@types+node@20.14.15/node_modules/vite/dist/node/cli.js:828:5)[39m
2024-11-21T11:59:00.4046518Z [31mx[39m Build failed in 760ms
2024-11-21T11:59:00.4046960Z [31merror during build:
2024-11-21T11:59:00.4047806Z [31m[crx:manifest-post] Error in crx:content-script-resources.renderCrxManifest[31m
2024-11-21T11:59:00.4049948Z     at Object.generateBundle (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/@crxjs+vite-plugin@1.0.14_vite@5.4.11_@types+node@20.14.15_/node_modules/@crxjs/vite-plugin/dist/index.mjs:2933:19)
2024-11-21T11:59:00.4051747Z     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
2024-11-21T11:59:00.4053966Z     at async Bundle.generate (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/rollup@4.27.3/node_modules/rollup/dist/es/shared/node-entry.js:19094:9)
2024-11-21T11:59:00.4057465Z     at async file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/rollup@4.27.3/node_modules/rollup/dist/es/shared/node-entry.js:21773:27
2024-11-21T11:59:00.4061411Z     at async catchUnfinishedHookActions (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/rollup@4.27.3/node_modules/rollup/dist/es/shared/node-entry.js:21155:16)
2024-11-21T11:59:00.4064389Z     at async build (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/vite@5.4.11_@types+node@20.14.15/node_modules/vite/dist/node/chunks/dep-CB_7IfJ-.js:65449:16)
2024-11-21T11:59:00.4067164Z     at async CAC.&amp;lt;anonymous&gt; (file:///home/runner/work/chrome-extension-google-slide-usertool-comment-stream/chrome-extension-google-slide-usertool-comment-stream/node_modules/.pnpm/vite@5.4.11_@types+node@20.14.15/node_modules/vite/dist/node/cli.js:828:5)[39m
2024-11-21T11:59:00.4185705Z  ELIFECYCLE  Command failed with exit code 1.
2024-11-21T11:59:00.4391698Z ##[error]Process completed with exit code 1.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/naokikobashi/items/9becd14d3693d6f760f5&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;【CRSJS 】vite5でcontent_scriptsを書くとエラーになったので調べてみた #vite - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;同じ状況で調査してくれたほうがいたよう&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/crxjs/chrome-extension-tools/issues/836&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Build error [crx:web-accessible-resources] TypeError: OutputBundle[“manifest.json”] is undefined · Issue #836 · crxjs/chrome-extension-tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;issue見に行ったら現在はCloseされているよう…？&lt;/p&gt;
&lt;p&gt;releaseみたらStableなバージョンは2022-10-16の&lt;code class=&quot;language-text&quot;&gt;1.0.14&lt;/code&gt;で止まっている…&lt;/p&gt;
&lt;p&gt;Betaのほうは更新されているようなのでやむなくBetaを入れて動かした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pn i -D @crxjs/vite-plugin@beta&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で&lt;code class=&quot;language-text&quot;&gt;dev&lt;/code&gt;起動したらでなくなった&lt;/p&gt;
&lt;p&gt;このケースに限らずだが、JavaScript周りは少し時間が経つとメンテナンス滞る→依存関係が複雑になる→ビルドすら通らなくなるというケースが多いなぁ&lt;/p&gt;
&lt;p&gt;場合によっては別のツール選定をするかパッチ当てて直すかとかしかなくなってくる状況だし&lt;/p&gt;
&lt;p&gt;なかなか厳しい…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DuckDBでコンソールから直接コマンドの実行結果を扱いたい]]></title><description><![CDATA[通常のユースケースなら、API叩いて返ってきたJSONをローカルに保存してDuckDBでする もしくはAPI叩いてその結果をパイプで渡してで標準出力に結果を出力するといった使い方になる 今回はDuckDB…]]></description><link>https://til.swfz.io/entries/duckdb_shellfs/</link><guid isPermaLink="false">https://til.swfz.io/entries/duckdb_shellfs/</guid><pubDate>Thu, 05 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;通常のユースケースなら、API叩いて返ってきたJSONをローカルに保存してDuckDBで&lt;code class=&quot;language-text&quot;&gt;read_json&lt;/code&gt;する&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;もしくはAPI叩いてその結果をパイプで渡して&lt;code class=&quot;language-text&quot;&gt;duckdb -c &quot;SELECT * FROM read_json_auto(&apos;/dev/stdin&apos;, ignore_errors=true)&quot;&lt;/code&gt;で標準出力に結果を出力するといった使い方になる&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;今回はDuckDB上でコマンドの結果をワンショットでとりあえず使いたいみたいなケース（ファイルに残したくないが、クエリは何度か叩いてデータを見たい）&lt;/p&gt;
&lt;p&gt;調べてみたがDuckDBのコマンドラインオプションのみでは難しそうだった&lt;/p&gt;
&lt;p&gt;サードパーティの拡張で次のような拡張があったのでこの拡張を使って実現する&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://duckdb.org/community_extensions/extensions/shellfs.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;shellfs – DuckDB Community Extensions&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンソール起動&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;duckdb&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;インメモリモードで起動&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プラグインの読み込み&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;D INSTALL shellfs FROM community;  
D LOAD shellfs;  &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;いくつかサンプルでクエリしてみる&lt;/h2&gt;
&lt;h3&gt;GitHubのリポジトリのデータ&lt;/h3&gt;
&lt;p&gt;GitHub CLIでデータ出力、JSONで出力してそれをそのままクエリする&lt;/p&gt;
&lt;p&gt;APIアクセスをする場合はDuckDB内でテーブルを作成（CTAS）してそちらに対してクエリするようにすると親切かな&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;D &lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; repositories  &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; EXCLUDE&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;watchers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; watchers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;totalCount &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; watchers &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; read_json_auto&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;gh repo list --visibility public --limit 200 --json name,stargazerCount,forkCount,watchers |&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
D &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; repositories&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
┌───────────┬──────────────────────────────────────────────────────────┬────────────────┬──────────┐
│ forkCount │                           name                           │ stargazerCount │ watchers │
│   int64   │                         &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;                          │     int64      │  int64   │
├───────────┼──────────────────────────────────────────────────────────┼────────────────┼──────────┤
│         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │ tools                                                    │              &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ dotfiles                                                 │              &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ chrome&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;extension&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;copy&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;markdown&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;hatenablog&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;embed&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;link │              &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ article&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;search                                           │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ chrome&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;extension&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;google&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;slide&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;usertool&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;stream    │              &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │ til                                                      │              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ deno&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;kusa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;image                                          │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ chrome&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;extension&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;slide&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;stream                    │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ failed&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;slack&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;action&lt;/span&gt;                               │              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ git&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;hooks                                                │              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ deno&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;terminal&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;image                                      │              &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ slack&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;obsidian&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;memos&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;merge&lt;/span&gt;                            │              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; │ hatenablog_publisher                                     │              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │ gh&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;annotations                                           │             &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ crx&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;message&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;sample                                       │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ mise                                                     │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ sandbox                                                  │              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ obsidian&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;opener                                          │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ deno&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;deploy&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;sample                                       │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ deno&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;kv&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;logviewer                                        │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │
│         · │         ·                                                │              · │        · │
│         · │         ·                                                │              · │        · │
│         · │         ·                                                │              · │        · │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;role&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rbenv                                       │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;role&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;git                                         │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ mkdocs_sample                                            │              &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ playbooks                                                │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;role&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ojava8                                      │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ sw_push_notification                                     │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ js&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;api                                                   │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;playbook&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;sqs2slack                               │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;role&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mongodb                                     │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;role&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;percona55                                   │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;role&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;cassandra                                   │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;elasticsearch&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;kibana4                            │              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ cleaver&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;theme                                            │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;role&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mysql55                                     │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ ansible&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;playbook&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rundeck                                 │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ five_programming_problems_scala                          │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ angular&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;elasticsearch&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mdl                                │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ gf_cli                                                   │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ myApp                                                    │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
│         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │ test                                                     │              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; │        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │
├───────────┴──────────────────────────────────────────────────────────┴────────────────┴──────────┤
│ &lt;span class=&quot;token number&quot;&gt;126&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;rows&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt; shown&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                                                                    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;columns&lt;/span&gt; │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;カレントディレクトリ直下のファイル一覧&lt;/h3&gt;
&lt;p&gt;各種コマンドとjcを組み合わせてJSON化すればいろいろ活用できそう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;D &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; read_json_auto&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ls -al --color=no | jc --ls |&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
┌────────────────────────────────┬────────────┬───────┬─────────┬─────────┬────────┬──────────────┐
│            filename            │   flags    │ links │  owner  │  &lt;span class=&quot;token keyword&quot;&gt;group&lt;/span&gt;  │  size  │     &lt;span class=&quot;token keyword&quot;&gt;date&lt;/span&gt;     │
│            &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;             │  &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;   │ int64 │ &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt; │ &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt; │ int64  │   &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;    │
├────────────────────────────────┼────────────┼───────┼─────────┼─────────┼────────┼──────────────┤
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;                              │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │    &lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ &lt;span class=&quot;token keyword&quot;&gt;Dec&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt; │
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;                             │ drwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x&lt;span class=&quot;token comment&quot;&gt;--- │    35 │ swfz    │ swfz    │  12288 │ Dec 20 09:43 │&lt;/span&gt;
│ bin                            │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cache                         │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │    &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ &lt;span class=&quot;token keyword&quot;&gt;Dec&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;59&lt;/span&gt; │
│ CHANGELOG&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;md                   │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │ 144320 │ Nov 1 20:58  │&lt;/span&gt;
│ content                        │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ custom_word_prh&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yml            │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    814 │ Nov 1 20:58  │&lt;/span&gt;
│ deploy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sh                      │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;1231&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;devcontainer                  │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ eslint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mjs              │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   3097 │ Nov 1 20:58  │&lt;/span&gt;
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;eslintrc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json                 │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   1713 │ Nov 1 20:58  │&lt;/span&gt;
│ functions                      │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ gatsby&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;browser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tsx             │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    276 │ Nov 1 20:58  │&lt;/span&gt;
│ gatsby&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts               │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   4647 │ Nov 1 20:58  │&lt;/span&gt;
│ gatsby&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;eslint&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;custom&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rules&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mjs │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    447 │ Nov 1 20:58  │&lt;/span&gt;
│ gatsby&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;node&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts                 │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   5421 │ Nov 1 20:58  │&lt;/span&gt;
│ gatsby&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ssr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tsx                 │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    154 │ Nov 1 20:58  │&lt;/span&gt;
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;git                           │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ &lt;span class=&quot;token keyword&quot;&gt;Dec&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;09&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt; │
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;github                        │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;gitignore                     │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   1112 │ Nov 1 20:58  │&lt;/span&gt;
│     ·                          │     ·      │     · │  ·      │  ·      │     ·  │      ·       │
│     ·                          │     ·      │     · │  ·      │  ·      │     ·  │      ·       │
│     ·                          │     ·      │     · │  ·      │  ·      │     ·  │      ·       │
│ package&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json                   │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   5275 │ Dec 19 20:36 │&lt;/span&gt;
│ patches                        │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ playwright&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts           │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   1735 │ Nov 1 20:58  │&lt;/span&gt;
│ postcss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cjs             │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │     82 │ Nov 1 20:58  │&lt;/span&gt;
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prettierignore                │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │     95 │ Nov 1 20:58  │&lt;/span&gt;
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prettierrc                    │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │     93 │ Nov 1 20:58  │&lt;/span&gt;
│ &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt;                         │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │    &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ &lt;span class=&quot;token keyword&quot;&gt;Dec&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;45&lt;/span&gt; │
│ README&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;md                      │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   2323 │ Nov 1 20:58  │&lt;/span&gt;
│ renovate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json                  │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    242 │ Nov 1 20:58  │&lt;/span&gt;
│ &lt;span class=&quot;token keyword&quot;&gt;schema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;sql&lt;/span&gt;                     │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    106 │ Nov 1 20:58  │&lt;/span&gt;
│ setup&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js              │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │     35 │ Nov 1 20:58  │&lt;/span&gt;
│ src                            │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ static                         │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt; │
│ tailwind&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cjs            │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    641 │ Nov 1 20:58  │&lt;/span&gt;
│ &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textlintrc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yml                │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │   2177 │ Nov 1 20:58  │&lt;/span&gt;
│ tsconfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json                  │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    464 │ Nov 1 20:58  │&lt;/span&gt;
│ vitest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts               │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    186 │ Nov 1 20:58  │&lt;/span&gt;
│ vrt                            │ drwxrwxr&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;x │     &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; │ swfz    │ swfz    │   &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; │ Nov &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;:&lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;  │
│ wrangler&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toml                  │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │    109 │ Nov 1 20:58  │&lt;/span&gt;
│ yarn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lock&lt;/span&gt;                      │ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rw&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;r&lt;span class=&quot;token comment&quot;&gt;-- │     1 │ swfz    │ swfz    │ 845328 │ Dec 19 20:36 │&lt;/span&gt;
├────────────────────────────────┴────────────┴───────┴─────────┴─────────┴────────┴──────────────┤
│ &lt;span class=&quot;token number&quot;&gt;47&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;rows&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt; shown&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                                                                    &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;columns&lt;/span&gt; │
└─────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最後にパイプ&lt;code class=&quot;language-text&quot;&gt;|&lt;/code&gt;をつけてその結果を受け取って&lt;code class=&quot;language-text&quot;&gt;read_json_auto&lt;/code&gt;で読み込むよう&lt;/p&gt;
&lt;p&gt;起動ユーザーの権限でコマンド実行しているようなのでいろいろできるかも&lt;/p&gt;
&lt;p&gt;コンソール起動時、インメモリでDuckDBを起動しているためどこかにファイルが残るということがない&lt;/p&gt;
&lt;p&gt;ローカルを汚したくない場合の手段の1つとして&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Chrome拡張でOptionページの開き方]]></title><description><![CDATA[Chrome拡張のオプションページを開く方法 通常はアイコンを右クリックすれば「オプション」項目があるのでそれをクリックしてオプションページへ遷移する よくそういうことやっている拡張あると思うが Chrome拡張の開発でpopup…]]></description><link>https://til.swfz.io/entries/chrome_extension_open_optionpage/</link><guid isPermaLink="false">https://til.swfz.io/entries/chrome_extension_open_optionpage/</guid><pubDate>Wed, 04 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Chrome拡張のオプションページを開く方法&lt;/h2&gt;
&lt;p&gt;通常はアイコンを右クリックすれば「オプション」項目があるのでそれをクリックしてオプションページへ遷移する&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;よくそういうことやっている拡張あると思うが&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;Chrome拡張の開発でpopupのページからリンクやボタンを用意して「クリックされたらオプションページへ遷移する」というのをやりたかった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;chrome&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;runtime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;openOptionsPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;tsx&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;border p-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; chrome&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;runtime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;openOptionsPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Open Option&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;オプションページを用意している前提だが、これでOK&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Universal Binary Installer]]></title><description><![CDATA[houseabsolute/ubi: The Universal Binary Installer miseの内部で使っているパッケージマネージャーの中で、のほかにという文字列を見つけて何のことか気になったので調べてみた 簡単に言うと現環境に適切なバイナリを判断してGitHub…]]></description><link>https://til.swfz.io/entries/universal_binary_installer/</link><guid isPermaLink="false">https://til.swfz.io/entries/universal_binary_installer/</guid><pubDate>Tue, 03 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/houseabsolute/ubi&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;houseabsolute/ubi: The Universal Binary Installer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;miseの内部で使っているパッケージマネージャーの中で、&lt;code class=&quot;language-text&quot;&gt;asdf&lt;/code&gt;のほかに&lt;code class=&quot;language-text&quot;&gt;ubi&lt;/code&gt;という文字列を見つけて何のことか気になったので調べてみた&lt;/p&gt;
&lt;p&gt;簡単に言うと現環境に適切なバイナリを判断してGitHub Releasesからインストールしてくれるくん&lt;/p&gt;
&lt;p&gt;最近だとGoやRustで作られたコマンドは各種OSやアーキテクチャ用にバイナリをビルドしてGitHubのReleasesにおいてくれているところが多い（ように感じる）&lt;/p&gt;
&lt;p&gt;バイナリ持ってくるだけだからその時点で結構楽ではあるが、ubiは&lt;code class=&quot;language-text&quot;&gt;org/repo&lt;/code&gt;を指定するだけで持ってこれますよっていう感じ&lt;/p&gt;
&lt;h2&gt;インストール&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--silent&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--location&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    https://raw.githubusercontent.com/houseabsolute/ubi/master/bootstrap/bootstrap-ubi.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$HOME/bin&lt;/code&gt;にインストールされる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; bin
ubi&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;option&lt;/h3&gt;
&lt;p&gt;2つだけピック&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-p --project&lt;/code&gt;がリポジトリ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--tag&lt;/code&gt;指定もあるのでバージョン指定も可能&lt;/p&gt;
&lt;h3&gt;試しにvividを入れてみる&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ./bin/ubi &lt;span class=&quot;token parameter variable&quot;&gt;--project&lt;/span&gt; sharkdp/vivid&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; bin
ubi vivid&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;インストールできた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ./bin/vivid
error: &lt;span class=&quot;token string&quot;&gt;&apos;vivid&apos;&lt;/span&gt; requires a subcommand but one was not provided
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;subcommands: generate, preview, themes, help&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

Usage: vivid &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;OPTIONS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;COMMAND&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

For &lt;span class=&quot;token function&quot;&gt;more&lt;/span&gt; information, try &lt;span class=&quot;token string&quot;&gt;&apos;--help&apos;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;簡単&lt;/p&gt;
&lt;h2&gt;miseでの利用&lt;/h2&gt;
&lt;p&gt;mise内部でubiを使っているようだが、そもそもubiをmise管理化においてubiコマンドを使うことも可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mise.config.toml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[tools]
ubi = &apos;latest&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;自分はこの方法にした&lt;/p&gt;
&lt;p&gt;何か試したいツールが発生したらとりあえずubiでインストールしてみて良さそうであればmise管理移行、なければPR作るみたいな流れができる&lt;/p&gt;
&lt;p&gt;その流れでmiseへ&lt;code class=&quot;language-text&quot;&gt;vivid&lt;/code&gt;コマンドを管理できるようPRを作った&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jdx/mise/pull/3089&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;feat: add vivid by swfz · Pull Request #3089 · jdx/mise&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;現時点だとかなりmiseの開発が活発で数時間でマージしてくれてスピード感すごかった&lt;/p&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;一昔前は何かインストールするにもビルドが必要、ビルドがコケていろいろ調べて解決してたらかなり時間使ってしまったみたいなことが結構あった&lt;/p&gt;
&lt;p&gt;最近はそういうのがなくなってきている&lt;/p&gt;
&lt;p&gt;よい時代になったものだなぁ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub ActionsのSlack Actionがメジャーバージョン更新されていた(v2)]]></title><description><![CDATA[下記はActionsの実行ログから いつも通りにRenovateで来たPRをマージしていたらいつの間にかWorkflowでエラーが発生していた（メールで気付いた） Release Slack Send v2.0.0 · slackapi/slack-github-action…]]></description><link>https://til.swfz.io/entries/github_actions_slack_actions_major_to_v2/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_actions_slack_actions_major_to_v2/</guid><pubDate>Mon, 02 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下記はActionsの実行ログから&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Run slackapi/slack-github-action@v2.0.0
  with:
    payload: {
    &quot;text&quot;: &quot;Algolia Index&quot;,
    &quot;blocks&quot;: [
      {
        &quot;type&quot;: &quot;section&quot;,
        &quot;text&quot;: {
          &quot;type&quot;: &quot;mrkdwn&quot;,
          &quot;text&quot;: &quot;hatenablog(486) 2024-11-24T21:06:29.404Z\nmemo(197) 2024-11-14T21:07:11.449Z\nobsidian(426) 2024-11-22T21:06:31.679Z\nsandbox(1) 2024-09-18T05:45:57.228Z\ntil(209) 2024-11-21T21:09:12.200Z&quot;
        }
      }
    ]
  }
  
    errors: false
    payload-templated: false
    retries: 5
  env:
    SLACK_WEBHOOK_URL: ***
    SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

file:///home/runner/work/_actions/slackapi/slack-github-action/v2.0.0/src/config.js:160
          throw new SlackError(
^
SlackError: Missing input! The webhook type must be &apos;incoming-webhook&apos; or &apos;webhook-trigger&apos;.
    at Config.validate (file:///home/runner/work/_actions/slackapi/slack-github-action/v2.0.0/src/config.js:160:1)
    at new Config (file:///home/runner/work/_actions/slackapi/slack-github-action/v2.0.0/src/config.js:113:1)
    at send (file:///home/runner/work/_actions/slackapi/slack-github-action/v2.0.0/src/send.js:13:1)
    at file:///home/runner/work/_actions/slackapi/slack-github-action/v2.0.0/src/index.js:9:1
    at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
    at ModuleLoader.import (node:internal/modules/esm/loader:316:24)
    at asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:123:5)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;いつも通りにRenovateで来たPRをマージしていたらいつの間にかWorkflowでエラーが発生していた（メールで気付いた）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/slackapi/slack-github-action/releases/tag/v2.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Release Slack Send v2.0.0 · slackapi/slack-github-action&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;変更点は上記&lt;/p&gt;
&lt;p&gt;WorkflowBuilder、SlackAPI、IncommingWebhookの3点で破壊的変更があったよう&lt;/p&gt;
&lt;p&gt;今までの設定で動かないケースが多くありそう&lt;/p&gt;
&lt;p&gt;自分はIncommingWebhookのみしか使っていなかったので次の変更点があった&lt;/p&gt;
&lt;h2&gt;Webhook-typeの明示&lt;/h2&gt;
&lt;p&gt;今までは省略できたが、明示的にタイプを指定してねという話らしい&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;webhook-type: incoming-webhook&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Webhook urlの指定方法&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;webhook: ${{ secrets.SLACK_WEBHOOK_URL }}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;今までは環境変数にセットして読ませてた、推奨設定は上記のように直接指定することらしい&lt;/p&gt;
&lt;p&gt;こちらは今までの環境変数から読ませる設定でも動いた&lt;/p&gt;
&lt;p&gt;でも推奨設定にしたほうがよいだろうな&lt;/p&gt;
&lt;p&gt;自分はそこまで変更量多くなかったけどたくさん使っている人はたいへんそう…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub Actions+Gitでのマルチバイト文字列表示]]></title><description><![CDATA[マルチバイト文字列をActionsの中で扱う場合に気を付けようという話 で出力される内容からマルチバイト文字列を含むファイル名をgrepで検索して後続につなげるような処理をしたかった というイメージ ローカルではうまく動いたのでActions…]]></description><link>https://til.swfz.io/entries/multibyte_string_using_github_actions/</link><guid isPermaLink="false">https://til.swfz.io/entries/multibyte_string_using_github_actions/</guid><pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;マルチバイト文字列をActionsの中で扱う場合に気を付けようという話&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;git diff --name-only&lt;/code&gt;で出力される内容からマルチバイト文字列を含むファイル名をgrepで検索して後続につなげるような処理をしたかった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; --name-only &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--color&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;no &lt;span class=&quot;token string&quot;&gt;&apos;ファイル名&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;というイメージ&lt;/p&gt;
&lt;p&gt;ローカルではうまく動いたのでActionsの環境でも動かしてみたが期待通りの動作をせず&lt;/p&gt;
&lt;p&gt;pipefail使っていなかったからってのもあるけど原因を突きとめるまで時間をとってしまった&lt;/p&gt;
&lt;p&gt;で、追っていったら&lt;code class=&quot;language-text&quot;&gt;git diff --name-only&lt;/code&gt;の結果が下記のようになっていた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&apos;\262\267\343\201\206\343\202\202\343\201\256.md&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;UTF-8エンコーディングされたバイト列が表示されていた…なるほどね…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;\262\267\343\201\206\343\202\202\343\201\256.md&apos;&lt;/span&gt;
買うもの.md&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;pipeの後続でこの値ありきの処理をしていたのでgrepに引っかからずそれ以降の処理がされなかったというもの&lt;/p&gt;
&lt;p&gt;あんまりマルチバイト文字列をそのまま扱うっていうパターンがなかったのもあるが…&lt;/p&gt;
&lt;h2&gt;対応&lt;/h2&gt;
&lt;p&gt;下記どちらかで対応できる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git config --global core.quotepath false&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git -c core.quotepath=false diff --name-only&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;気を付けよう&lt;/p&gt;
&lt;p&gt;よく見たらローカルの&lt;code class=&quot;language-text&quot;&gt;.gitconfig&lt;/code&gt;には設定がしっかり入っていた&lt;/p&gt;
&lt;h3&gt;pipefail&lt;/h3&gt;
&lt;p&gt;蛇足だが基本的にActionsに限らずシェルスクリプトではpipefail入れておいたほうがどこで問題があるか気付きやすいので入れておいたほうが良いといのをあらためて実感した&lt;/p&gt;
&lt;p&gt;Actionsで設定するには下記&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#custom-shell&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Workflow syntax for GitHub Actions - GitHub Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zenn.dev/shunsuke_suzuki/scraps/172683d8bad652&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub Actions の shell option&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Actions+Gitでマルチバイト文字を扱う場合は&lt;code class=&quot;language-text&quot;&gt;core.auotepath&lt;/code&gt;を設定する&lt;/li&gt;
&lt;li&gt;基本的にpipefailを有効にする&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[CSSでレイアウトに影響を与えず見えない要素を指定する]]></title><description><![CDATA[document picture in pictureのときだけ特定要素を表示させるというのをしたかった 参考 「動画」だけでなく、すべての要素でピクチャー イン ピクチャーで使用可能  |  Web Platform  |  Chrome for Developers…]]></description><link>https://til.swfz.io/entries/css_visiblity/</link><guid isPermaLink="false">https://til.swfz.io/entries/css_visiblity/</guid><pubDate>Thu, 21 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;document picture in pictureのときだけ特定要素を表示させるというのをしたかった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/docs/web-platform/document-picture-in-picture?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;「動画」だけでなく、すべての要素でピクチャー イン ピクチャーで使用可能  |  Web Platform  |  Chrome for Developers&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;document picture in pictureの一部コード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#dpinp&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pipWindow &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; documentPictureInPicture&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;requestWindow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; content&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;clientWidth&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   height&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; content&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;clientHeight&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   copyStyleSheets&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 pipWindow&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dpinp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;コンテンツ&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meter&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;meter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pause-button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;PauseIcon&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;見た目のため簡略化したが&lt;code class=&quot;language-text&quot;&gt;pause-button&lt;/code&gt;をdocument picture in picture時は表示、通常時は非表示にさせたい&lt;/p&gt;
&lt;p&gt;参考にあるようにdocument picture in picture時のスタイルはメディアクエリで指定できるのでそちらでやる&lt;/p&gt;
&lt;p&gt;通常時の状態では非表示要素で用意しておきたい&lt;/p&gt;
&lt;p&gt;Tailwind CSSを利用していたのでいつものように&lt;code class=&quot;language-text&quot;&gt;hidden&lt;/code&gt;かな?と思い&lt;code class=&quot;language-text&quot;&gt;content&lt;/code&gt;の中のタグにスタイルを設定した&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/docs/display&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Display - Tailwind CSS&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hidden&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;display: none;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;contents&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;display: contents;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;が、pinpウィンドウのサイズを指定する際に、対象要素を表示するしないで&lt;code class=&quot;language-text&quot;&gt;clientHeight&lt;/code&gt;が変わってしまうようだった、なのでpinp対象の要素と同じサイズにならない&lt;/p&gt;
&lt;p&gt;そういうケースには&lt;code class=&quot;language-text&quot;&gt;visiblity&lt;/code&gt;というプロパティを使えば良いらしい&lt;/p&gt;
&lt;p&gt;調べたらすぐ出てきたが知らなかった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;visible&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;visibility: visible;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;invisible&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;visiblity: hidden;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/docs/visibility&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Visibility - Tailwind CSS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;「要素を「見えない状態」にしますが、DOM上のレイアウトには影響を与えません」とのこと&lt;/p&gt;
&lt;p&gt;これだよこれ&lt;/p&gt;
&lt;p&gt;しらなかった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;component.tsx&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dpinp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;コンテンツ&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meter&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;meter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pause-button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;invisible&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;PauseIcon&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;styles/tailwind.css&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-css line-numbers&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; all &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;display-mode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; picture-in-picture&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;#pause-button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@apply&lt;/span&gt; visible&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通常時は&lt;code class=&quot;language-text&quot;&gt;invisible&lt;/code&gt;、picture in picture時は&lt;code class=&quot;language-text&quot;&gt;visible&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;これは良き&lt;/p&gt;</content:encoded></item><item><title><![CDATA[欲しかったのはREADMEのコードブロック実行ではなかった]]></title><description><![CDATA[いつも使っているすぐには出てこないくらいの量のオプションを指定したコマンドを新しい環境で実行したい が、履歴に残っていないので他の環境からコピーしてくるなどしないといけないケースが発生して不便に感じていた ということで、Markdown…]]></description><link>https://til.swfz.io/entries/command_from_filtering_readme/</link><guid isPermaLink="false">https://til.swfz.io/entries/command_from_filtering_readme/</guid><pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;いつも使っているすぐには出てこないくらいの量のオプションを指定したコマンドを新しい環境で実行したい&lt;/p&gt;
&lt;p&gt;が、履歴に残っていないので他の環境からコピーしてくるなどしないといけないケースが発生して不便に感じていた&lt;/p&gt;
&lt;p&gt;ということで、Markdownからコードブロックを実行するみたいなツールがあったので試してみた&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;zx&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;xc&lt;/code&gt;あたり&lt;/p&gt;
&lt;p&gt;で、試していたら結局コマンドではなく次のような項目を満たせれば何でも良かったということに気がついた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ある程度書いたREADME&lt;/li&gt;
&lt;li&gt;フィルタリングしてコンソール上に出力させる何か&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pecoでフィルタリングしてコンソール上に出力するだけでOKだった&lt;/p&gt;
&lt;h2&gt;設定&lt;/h2&gt;
&lt;p&gt;zshの設定に下記を加える&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;peco-p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;selected&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$selected&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;BUFFER&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${BUFFER}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${selected}&lt;/span&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# カーソル位置を末尾に移動&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;CURSOR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$#&lt;/span&gt;BUFFER
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;peco-file-line&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; README.md &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; peco&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
  peco-p &lt;span class=&quot;token variable&quot;&gt;${line}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
zle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; peco-file-line
bindkey &lt;span class=&quot;token string&quot;&gt;&apos;^gm&apos;&lt;/span&gt; peco-file-line&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでREADMEがあるディレクトリで&lt;code class=&quot;language-text&quot;&gt;Ctrl+g&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;m&lt;/code&gt; を押下すればREADMEからフィルタリングができる&lt;/p&gt;
&lt;p&gt;こんな感じ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/ab092388db0811822c67ba41d0f08a02/command_from_filtering_readme01.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;
&lt;p&gt;この手の話は履歴から持ってくるでも良いのでは?ってはなしもあるが、デバイスまたいだ場合などで初回実行で困る&lt;/p&gt;
&lt;p&gt;これならREADMEにしっかり残しておこうという動機づけにもなる&lt;/p&gt;
&lt;p&gt;もっと汎用的なコマンドや使い方だったらcheatとかを使えば良いかなと思っていたけどリポジトリ特有のものとかそういうのはこれでよい感&lt;/p&gt;
&lt;p&gt;今度はタスクランナーとの比較っていう話になってきそうだけど今のところは個人プロジェクトだったらこれで十分&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;まぁ仕事だとTaskfileとかその辺なのかなー周りで最近聞くしなーとちょっと気になっている、そのうち触ってみようと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[Spreadsheetで日付からQ単位、半期単位の文字列を生成する]]></title><description><![CDATA[Qごとや半期ごとに集計するみたいな際、日付情報からその日のQや上期、下期みたいなのを出力させる Qごと 半期ごと が上期、が下期 イメージ]]></description><link>https://til.swfz.io/entries/spreadsheet_date2quarter/</link><guid isPermaLink="false">https://til.swfz.io/entries/spreadsheet_date2quarter/</guid><pubDate>Wed, 02 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Qごとや半期ごとに集計するみたいな際、日付情報からその日のQや上期、下期みたいなのを出力させる&lt;/p&gt;
&lt;h2&gt;Qごと&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;=ARRAYFORMULA(IF(A2:A=&quot;&quot;,&quot;&quot;,YEAR(A2:A)&amp;amp;&quot;-&quot;&amp;amp;CEILING(MONTH(A2:A)/3)&amp;amp;&quot;Q&quot;))&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;半期ごと&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;=ARRAYFORMULA(IF(A2:A=&quot;&quot;,&quot;&quot;,YEAR(A2:A)&amp;amp;&quot;-&quot;&amp;amp;CEILING(MONTH(A2:A)/6)&amp;amp;&quot;期&quot;))&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;1&lt;/code&gt;が上期、&lt;code class=&quot;language-text&quot;&gt;2&lt;/code&gt;が下期&lt;/p&gt;
&lt;h2&gt;イメージ&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a6f7377a90f6a937f43200233b4e8356/84a90/spreadsheet_date2quarter01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.51351351351351%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABjklEQVR42p2T63KbQAyFef+Hy48mdhwTwMCCW2wuyy6XxcYnklzbnTYzJWFGc4QYSZ+0rNe2FvN8gXMOfd+jrBpk+wPSvEDdaEy9xTQ5tMbANDXGzkK3LaqyQlEUotNgwXWMNfC0bujFYDqdcLnM2Jc9NonBVnU4NgMmN0ijYRyksHMj6SQA4ziKcvz6zcGL9hbFkbr9+om6qvD8GuHphw/dzYhUidXLCnES4yQNL2LzPIv97Z/PZ3hN2wldnudQSiGKFfxAQVuH/UEjeA9Q1zX44QROZv3M56Yej8JOHMd4p+SENApDik0wrcZqtUZ5PErBz6j+Iey6TnaSZ0yYISNN01RiLS0/CIiwqu8J/yccBgo8CFm5CBfUWmOz2aCi3S4mtNZeCfMr4ZVUScwQYUjj8w4XE/LItx2GYSS62+3+IHz7JiGRZWKZ2I3wyzvkgmdyFB1EHCdyykEQ/j4UjfX6FWVZLic0dKUeO1REp5Am6Z3Q930ZeTEhXyt25KeOdqSp7PFWcLvd3n/sJYQfDu7pUbpbdm8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/a6f7377a90f6a937f43200233b4e8356/cbe2e/spreadsheet_date2quarter01.webp 148w,
/static/a6f7377a90f6a937f43200233b4e8356/3084c/spreadsheet_date2quarter01.webp 295w,
/static/a6f7377a90f6a937f43200233b4e8356/5ca24/spreadsheet_date2quarter01.webp 590w,
/static/a6f7377a90f6a937f43200233b4e8356/dad35/spreadsheet_date2quarter01.webp 885w,
/static/a6f7377a90f6a937f43200233b4e8356/4c092/spreadsheet_date2quarter01.webp 982w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/a6f7377a90f6a937f43200233b4e8356/12f09/spreadsheet_date2quarter01.png 148w,
/static/a6f7377a90f6a937f43200233b4e8356/e4a3f/spreadsheet_date2quarter01.png 295w,
/static/a6f7377a90f6a937f43200233b4e8356/fcda8/spreadsheet_date2quarter01.png 590w,
/static/a6f7377a90f6a937f43200233b4e8356/efc66/spreadsheet_date2quarter01.png 885w,
/static/a6f7377a90f6a937f43200233b4e8356/84a90/spreadsheet_date2quarter01.png 982w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/a6f7377a90f6a937f43200233b4e8356/fcda8/spreadsheet_date2quarter01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[deno installでGitHub上のスクリプトを指定する]]></title><description><![CDATA[ただ単にGitHub上でファイル開いてURLコピーしてそれをインストールするという感じではなかった 下記Issueでも話題になっているが How to import module from Github · Issue #5543 · denoland/deno…]]></description><link>https://til.swfz.io/entries/deno_install_from_github/</link><guid isPermaLink="false">https://til.swfz.io/entries/deno_install_from_github/</guid><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ただ単にGitHub上でファイル開いてURLコピーしてそれをインストールするという感じではなかった&lt;/p&gt;
&lt;p&gt;下記Issueでも話題になっているが&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/denoland/deno/issues/5543&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to import module from Github · Issue #5543 · denoland/deno&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;フォーマット&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://github.com/{username}/{reponame}/raw/{branch}/{filepath}&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;例&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://github.com/swfz/deno-kv-logviewer/blob/main/logviewer.ts&lt;/code&gt;で表示されるスクリプトをインストールする場合&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;deno &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --allow-net --allow-env --unstable-kv https://github.com/swfz/deno-kv-logviewer/raw/main/logviewer.ts&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で使えるようになる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[画像をbase64化してimgタグで読み込む]]></title><description><![CDATA[denoでサイト作っていて、サンプル画像を伴うREADME的なページを作っていた publicディレクトリを作りそこに画像を配置し、ホストしてしまうと画像レスポンスを返す用の処理も書かないといけないし、アクセスログにも乗ってくるので微妙だなーと思って埋め込むことにした base…]]></description><link>https://til.swfz.io/entries/image_src_base64/</link><guid isPermaLink="false">https://til.swfz.io/entries/image_src_base64/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;denoでサイト作っていて、サンプル画像を伴うREADME的なページを作っていた&lt;/p&gt;
&lt;p&gt;publicディレクトリを作りそこに画像を配置し、ホストしてしまうと画像レスポンスを返す用の処理も書かないといけないし、アクセスログにも乗ってくるので微妙だなーと思って埋め込むことにした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;base64&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;base64 &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; hoge.png&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-w&lt;/code&gt;は改行までの文字数指定&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-w 0&lt;/code&gt;で改行なしのテキストを表示してくれる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;manの結果&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;-w, --wrap=COLS  
wrap encoded lines after COLS character (default 76). Use 0 to disable line wrapping&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;画像の表示&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data:image/png;base64,{base64化したテキスト}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでOK&lt;/p&gt;</content:encoded></item><item><title><![CDATA[URL SchemeでSlackの特定チャンネルへ遷移する]]></title><description><![CDATA[PCからだとそんなに旨味はないが、モバイルにおいてはショートカットと組み合わせたりすれば活用の幅が広がると思っている よくつぶやき的に使う何でもポストチャンネルへの遷移をURL Schemeで行う 公式 Reference: Deep linking into Slack…]]></description><link>https://til.swfz.io/entries/navigate_to_slack_channel_using_url_scheme/</link><guid isPermaLink="false">https://til.swfz.io/entries/navigate_to_slack_channel_using_url_scheme/</guid><pubDate>Tue, 06 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PCからだとそんなに旨味はないが、モバイルにおいてはショートカットと組み合わせたりすれば活用の幅が広がると思っている&lt;/p&gt;
&lt;p&gt;よくつぶやき的に使う何でもポストチャンネルへの遷移をURL Schemeで行う&lt;/p&gt;
&lt;h2&gt;公式&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://api.slack.com/reference/deep-linking&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Reference: Deep linking into Slack | Slack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;公式にもちゃんと書いてある&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;slack://channel?team={TEAM_ID}&amp;amp;id={CHANNEL_ID}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;team&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt;のパラメータが必要&lt;/p&gt;
&lt;h3&gt;team IDを取得する&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://slack.com/intl/ja-jp/help/articles/221769328-Slack-URL-%E3%81%BE%E3%81%9F%E3%81%AF-ID-%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Slack URL または ID を確認する | Slack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ブラウザで特定のURLを開いて&lt;code class=&quot;language-text&quot;&gt;T&lt;/code&gt;から始まる部分がteamのID&lt;/p&gt;
&lt;h3&gt;channel idを取得する&lt;/h3&gt;
&lt;p&gt;チャンネル設定からチャンネル情報を閲覧すると下の方にコピー項目があるのでコピーする&lt;/p&gt;
&lt;p&gt;これで作成したURLを開くと特定のチャンネルへ遷移させられる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[jqで一般的なJSONフォーマットをCSVへ変換するエイリアス]]></title><description><![CDATA[手元でさっとデータ出しや調査をしたい場合、とりあえずスプレッドシートに落としていろいろ見てみることが多く、その場合CSVをアップロードすることになる 手元でスクリプト書いたりする場合はなんだかんだでJSONに出力することが多いのでJSONからCSV…]]></description><link>https://til.swfz.io/entries/jq_to_csv_alias/</link><guid isPermaLink="false">https://til.swfz.io/entries/jq_to_csv_alias/</guid><pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;手元でさっとデータ出しや調査をしたい場合、とりあえずスプレッドシートに落としていろいろ見てみることが多く、その場合CSVをアップロードすることになる&lt;/p&gt;
&lt;p&gt;手元でスクリプト書いたりする場合はなんだかんだでJSONに出力することが多いのでJSONからCSVへの変換をよく実施する&lt;/p&gt;
&lt;h2&gt;サンプル&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;sample.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;city&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;New York&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;city&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Los Angeles&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Charlie&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;city&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Chicago&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;jqコマンド&lt;/h2&gt;
&lt;p&gt;こんな感じ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.json &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;(.[0]|to_entries|map(.key)),(.[]|[.[]])|@csv&apos;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;city&quot;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;,30,&lt;span class=&quot;token string&quot;&gt;&quot;New York&quot;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;,25,&lt;span class=&quot;token string&quot;&gt;&quot;Los Angeles&quot;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;Charlie&quot;&lt;/span&gt;,35,&lt;span class=&quot;token string&quot;&gt;&quot;Chicago&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ヘッダ部分&lt;/h3&gt;
&lt;p&gt;JSONのキー部分の値を取得する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.json&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;(.[0]|to_entries|map(.key))&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;city&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;順を追ってみる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.json&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.[0]&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;city&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;New York&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.json&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.[0]|to_entries&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;city&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;New York&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.json&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.[0]|to_entries|map(.key)&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;city&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;2行目以降のデータ部分&lt;/h3&gt;
&lt;p&gt;各JSONオブジェクトの値を抽出&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.json&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;(.[]|[.[]])&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;,
  &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;New York&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;,
  &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;Los Angeles&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;Charlie&quot;&lt;/span&gt;,
  &lt;span class=&quot;token number&quot;&gt;35&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;Chicago&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;行ごとにしてから各行の値をリストにしている&lt;/p&gt;
&lt;h2&gt;aliasに&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;jtoc&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;jq -r &apos;(.[0]|to_entries|map(.key)),(.[]|[.[]])|@csv&apos;&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;結果&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.json &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jtoc
&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;city&quot;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;,30,&lt;span class=&quot;token string&quot;&gt;&quot;New York&quot;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;,25,&lt;span class=&quot;token string&quot;&gt;&quot;Los Angeles&quot;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;Charlie&quot;&lt;/span&gt;,35,&lt;span class=&quot;token string&quot;&gt;&quot;Chicago&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;よく使うかなということでアイリエスに追加しておいた&lt;/p&gt;
&lt;p&gt;手元でさっとJSONデータをCSVに変換できる&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;たとえば、スプレッドシートにデータをインポートしたり、CSV形式で保存して、他のツールと連携したりする場合に非常に便利&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;</content:encoded></item><item><title><![CDATA[LookerStudioで表示する指標を選べるようにする]]></title><description><![CDATA[最近またLookerStudio…]]></description><link>https://til.swfz.io/entries/looker_studio_metrics_selector/</link><guid isPermaLink="false">https://til.swfz.io/entries/looker_studio_metrics_selector/</guid><pubDate>Fri, 28 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;最近またLookerStudioで頻繁にダッシュボードをいじることが増えて発見してよいなと思った機能&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;オプション指標&lt;/code&gt;という設定がほぼどのグラフにもついていて、通常表示する指標のほかにプラスで指定できるというもの&lt;/p&gt;
&lt;p&gt;グラフの種類によっては複数選択可能になっている（単一指標しか選択できないグラフもある）&lt;/p&gt;
&lt;h2&gt;設定箇所&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 333px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d514c07b649727256f568d013c8c860b/24c7e/looker_studio_metrics_selector01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 95.94594594594595%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAABYlAAAWJQFJUiTwAAACPklEQVR42q1UXY/SQBTtn/UH+OCzP8LERxMfTDYxUd9WN0bYFV0gy6cuy0cplAIbgV2E0na+Osc7LSi7ohh3b3J677TTM+fOnNaKtYaJOI7vBdZkOkO320UQBLiPsNzBAPVaFb6/TG5oHd+NME47hqJCEZeisaDL/8BwWJXeAgcfGjhuzHBUHeGwPEbODlFwJfJ9ThB7USB8cgQ6UwWr7FzjZaaOk+YV3lVGeHPaQ64bIu8KnBLhv8AsnHM4EUpYy1DCmWiETGIVMiyDKMEq4vADhiASiLhMnpu8Xf+8x9KaCSL86nI8fCYwnkn07QuUSiXYdgftVhMtAqdJ6WFttl3vQBpCCFgBMbsTmbzIOKPVGNWkKoqSWkgJKdWtnEJsxkpCqfS5ZcwIrRCrtV1Iil5DKZXkfWGmxOvXLc8boGPb8Lwh+q6L4WiEZvMCxUIe2WwWi+XGn/o3EhPeNMbjF9d48OQyad8S1KqkFmNSE4UhOLVt9oJRy5xFexUyAdScCMd1P1UoSaoxt1ibWq3rDZjUf4WZo9eKpTH25+YMT18X8bY2xSvy4MFJF1lbINOJCIxqvheZDsdRk6HxjWzTGPl4X+6h2PPxkcydOZ+gMtYoDSXKI4UzT+BscAveTZQIBfoQnCs65UWg8GWgE4MGwQrz+RyLxYJ+Fj6WdCBmP81pG5uYvF1v5w2s8wHHo+cSl8TuOi1UqlX0HAddY+52e4ex/xwJISNlk+8bo/5Swzm/Md6lZtfY2rWyvsP/8Aczg7FeW1OyDwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d514c07b649727256f568d013c8c860b/cbe2e/looker_studio_metrics_selector01.webp 148w,
/static/d514c07b649727256f568d013c8c860b/3084c/looker_studio_metrics_selector01.webp 295w,
/static/d514c07b649727256f568d013c8c860b/f885a/looker_studio_metrics_selector01.webp 333w&quot;
              sizes=&quot;(max-width: 333px) 100vw, 333px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d514c07b649727256f568d013c8c860b/12f09/looker_studio_metrics_selector01.png 148w,
/static/d514c07b649727256f568d013c8c860b/e4a3f/looker_studio_metrics_selector01.png 295w,
/static/d514c07b649727256f568d013c8c860b/24c7e/looker_studio_metrics_selector01.png 333w&quot;
            sizes=&quot;(max-width: 333px) 100vw, 333px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d514c07b649727256f568d013c8c860b/24c7e/looker_studio_metrics_selector01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;たとえば、Togglの作業記録を取っていて可視化した場合に、分と時間という異なる単位の指標を切り分ける&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;h2&gt;週と曜日のピボットテーブルでの作業時間&lt;/h2&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;h3&gt;時間で表示&lt;/h3&gt;
&lt;p&gt;読書時間をフィルタした結果&lt;/p&gt;
&lt;p&gt;1未満が多くしっくり来ない…&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c40e79d5d417e1bfe60f2d901143017e/227ba/looker_studio_metrics_selector02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAChUlEQVR42pVTS0/VQBjtr3Pl1qU/xoWJboiJCYqCMSoiLmTB6yIQAcWAeDFceQqRSy99d25ft9NOp+1xZgqXGFdOctrpfN98c843p1qWZfivUV+9Y4aLW++QrP5GKT55wVFVFTTHcXAN13UVbNtRcF3vn5gj1h05N21cTO7gaOMH9g46ODw4hGEY0GzbRhiGiOMYcu55HjKaIE0C+K6JJIkQRjFMy4Yl4pGYk34A/dJAVFG4xIOu62i32/B9H5o8ta4bHVJ+URQ4tWt8O2VYaTvQ/VLFeMFQctaoFvl5RpVEOeS72+2Ccw5NspMLpUiSiVVVY3Ynw5NWjEcfTKx2KHSP48zMcW7ncIIStoBJCgSJOKyu1H7LskAphSYff3VcFDVIiROjwEkvxd45w6s1imctD5OfCKa/5ni+HGNkxsHafnbFsEa/328YSt1lWYGXtUIhUNVXqOR6BcpqpAKl+J7+kuLhTIx7by3M7yRNQcEjCALVMi1LY/RIhYXdHHPbfbS+h2D8hnHP5xhbTjE672F8ieBC9NQNC5z1AoSDYaKSrAoWLMcgq3EpEg2x2SRcMJEymkRTyH+zkeLlCsHUeoDNY4b1fYq5LQ+Heja8JEKIulBN2uXGrRgmyL6IsorhxCrF0wUXLz76OLNKcbhgaFB4gqncK3OlB/M8h1ayFMcGx/jKAK/XYkx9jlXProe0zehSisezHsYWCfZ1jlOzwM8uFZfHhz+PtJ8qWBcJWrsUt+8T3Hlg4O6Ihf6gVmmcN9bY+iVkdkJsHUVY7jC83xxgYtHA9knjEHlZsiBjrDH29Qj6HuIoUHMZ7PUuhZzG2EkSIwqbmDzIsU3VM+kECfmXSYZ/AOTUzzehfoKsAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c40e79d5d417e1bfe60f2d901143017e/cbe2e/looker_studio_metrics_selector02.webp 148w,
/static/c40e79d5d417e1bfe60f2d901143017e/3084c/looker_studio_metrics_selector02.webp 295w,
/static/c40e79d5d417e1bfe60f2d901143017e/5ca24/looker_studio_metrics_selector02.webp 590w,
/static/c40e79d5d417e1bfe60f2d901143017e/85eee/looker_studio_metrics_selector02.webp 769w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c40e79d5d417e1bfe60f2d901143017e/12f09/looker_studio_metrics_selector02.png 148w,
/static/c40e79d5d417e1bfe60f2d901143017e/e4a3f/looker_studio_metrics_selector02.png 295w,
/static/c40e79d5d417e1bfe60f2d901143017e/fcda8/looker_studio_metrics_selector02.png 590w,
/static/c40e79d5d417e1bfe60f2d901143017e/227ba/looker_studio_metrics_selector02.png 769w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c40e79d5d417e1bfe60f2d901143017e/fcda8/looker_studio_metrics_selector02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ハイライト部分をクリックすると設定で指定した指標が選べる&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/05dafd16bd4b3a75b7902cfb63514da3/b2cef/looker_studio_metrics_selector03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.75675675675676%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAACIklEQVR42lWT727TMBTF+5J85D14BkAgdS8A2j6BJsQqxocN2NAEGhVjQ3QwNq3ruiSNS5s4cf7YsXO41107iHTjxHZ+OefcpJNlGcqyhDHGV9MYaH1bpqFazjersa5rpGm6esZaC+ecX+uEYYggCLAcx+Mx4jiCiENMohtEUYSbmwCj0TUC3kN1eTlEkiQewvDlobVGZzabIc9zP8GLRVGg0MBkVuMqSNA4oHUWKpd+D0MymUKIGFJKeqZC27Z3QJbOEEdzlk9osXNSo9tLsbYV4+fYQBYW07RBXlqU2iEvGnIUYzoVmJNSZrAoVt3hi39lM3D8x+J4WON0pLA30Fj/oLCxG+PVYYXn7xW6WwJfz3NYU1I8wsflnVF1FnRFb26RVw6Kytp2YYMqKx2ixCIllfuDCt03GR5uChxdLkQYahw3dnl0OIeyqnB4brDdl3jbTyDLdqX24JfG2rZE9/UE34YGU9ngbJTSixq/IyOH3IcVkOnc7oZUcRnqgqMs3W2e/QvjbT7bEdj7UePgtELvs8BIaA/gyNjlCsg3nCFblWSPLXJzFo1rsX+q8bQn8XgzxPGVhqpbUknNqZ0HKKUwn8/vgDkpzFWJB+sS9x4J3H8S4CJqPIw+EpxcGbz8pPDio8Dud1LXL7DxboLfwUJhluX/A4fDof9TrqcOR2cJvgxiaOJVVemzqZsWqTK4Dqc0WojEYHAeQt1myJa5D0vgXwyJPqqFwFj5AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/05dafd16bd4b3a75b7902cfb63514da3/cbe2e/looker_studio_metrics_selector03.webp 148w,
/static/05dafd16bd4b3a75b7902cfb63514da3/3084c/looker_studio_metrics_selector03.webp 295w,
/static/05dafd16bd4b3a75b7902cfb63514da3/5ca24/looker_studio_metrics_selector03.webp 590w,
/static/05dafd16bd4b3a75b7902cfb63514da3/8a8c4/looker_studio_metrics_selector03.webp 847w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/05dafd16bd4b3a75b7902cfb63514da3/12f09/looker_studio_metrics_selector03.png 148w,
/static/05dafd16bd4b3a75b7902cfb63514da3/e4a3f/looker_studio_metrics_selector03.png 295w,
/static/05dafd16bd4b3a75b7902cfb63514da3/fcda8/looker_studio_metrics_selector03.png 590w,
/static/05dafd16bd4b3a75b7902cfb63514da3/b2cef/looker_studio_metrics_selector03.png 847w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/05dafd16bd4b3a75b7902cfb63514da3/fcda8/looker_studio_metrics_selector03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;複数表示&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/19564254a844b2a21e3fc3c590e5c45a/41d3b/looker_studio_metrics_selector04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACWUlEQVR42p1T2W4TUQydD+cPeEHigUcQSIAoUAkVUB+qIpWiFlAIKW1KGjqZTLbZ1zvrnTnYLgEeEZZuHN/l+BzbY5Rlif+1KIpQVRWapoHWGn3fw1itVnBdF47jiPc8759i9sPhEKPRCBcXF5hMJpjNZjDSNEUcx0iSRDKuKQH7KE4QBCGWFIcU8z3eZwJBEAjgfD6XmD0DL5dLGHVdC1Wm3HWdALPv+xsJGcUtSWpbLTLDMBKJKlcSs2R+a9s2uHzGer0GgyqlBKhQOTJV4WwawfZLfN94cDKFuiKAvkNJ97RuCahAR57Z8VtmnOc5jD+Melo3xV6HDW4/d/HkQ4iH36Y4WoYoKiApNBQxzWvyVU9LE2M6KwqpK7M1eKMjpFYkE2inkZUdTsYpzu0cX+YLDOYx7u6u8PTYx4vxFG+vPDzY3+DdWQ7fc5BlmTBlYIOpMsPf9MgYuKg7VA2tluS1nSTJqw4N1dYKGtx6tMGz4xxlkZNUJU0ThnmWwI1bvDn1MZgpvJ8tcB1lN8C/koSZxuPDEPtfExyYC3xcxjj7kWDh1Yip89saci+MNIkl++g6g+XXmAYRXFUKY62JOXo4UYM7L1fYOYmwcz7BwbWLo6GDS1ths1nLZPAMimT+Yev/kry17Z6Xatx77WP3U4JXVyYOTR+nlwpju0QSRwRUyuCLZN/35WFBbeRZa5pWasqzxv/RtfDTFvf3Hex9DrE3MTFwY0qjZXy4u9wUHj8B5IFksyxLDph+S43gjPwF8VfBCaIoREpnPBVcBsuy6X4uteN7pmmK5J+Hg9hjRvnodAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/19564254a844b2a21e3fc3c590e5c45a/cbe2e/looker_studio_metrics_selector04.webp 148w,
/static/19564254a844b2a21e3fc3c590e5c45a/3084c/looker_studio_metrics_selector04.webp 295w,
/static/19564254a844b2a21e3fc3c590e5c45a/5ca24/looker_studio_metrics_selector04.webp 590w,
/static/19564254a844b2a21e3fc3c590e5c45a/9b58d/looker_studio_metrics_selector04.webp 774w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/19564254a844b2a21e3fc3c590e5c45a/12f09/looker_studio_metrics_selector04.png 148w,
/static/19564254a844b2a21e3fc3c590e5c45a/e4a3f/looker_studio_metrics_selector04.png 295w,
/static/19564254a844b2a21e3fc3c590e5c45a/fcda8/looker_studio_metrics_selector04.png 590w,
/static/19564254a844b2a21e3fc3c590e5c45a/41d3b/looker_studio_metrics_selector04.png 774w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/19564254a844b2a21e3fc3c590e5c45a/fcda8/looker_studio_metrics_selector04.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;分のみ表示&lt;/h3&gt;
&lt;p&gt;あまり多くないので分表示のほうがしっくり頭に入ってくる&lt;/p&gt;
&lt;p&gt;逆に大まかな分類の場合は時間での表示のほうが頭に入ってきやすい&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/227ba/looker_studio_metrics_selector05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACeklEQVR42p1Ta08TQRTd/6j+I436wRDjIzFCMJEYQ3wiKESwCsFEiA0NYoCCdNtu99nd2efs7OzscWZaip+9yelOM3vPPffes0ZRFPjf8H0feZ6jqirUdQ0hBAzHceB5HlzX1U8Fx3E1PM/Xz3/v1FlBkVmWBdM00W63cXJygm63C8O2bURRhDRNZy8XeYoiIxj7NpI4AokTOK4Ha2Trc0Ri9AdDmUd0br/fR6fTwWAwmBAqqSrKkoFzBjNosNetsPXTxemI6TvOK/CKzdotaQ4h21TRNA16vR4opTDCMNT915JUyAtA4MthiYdrMeZeD7Gyl6Lvc5yNSgkKj9RwohpWwBDElSZT+Uqd6tLIsmxaRf9quETgeFjh6CLG736JpW2K+Y0ACxs+3v4oMb+Z4t4rC6v7qc5VHapRlWUJw5VL4bwGr5sJ+ESpQtMIWV2gYA1yCS4arLcp7rxJcPOlg+WdRAtQKgkheuNGmhCpqMbGAcPHPYK1vRAxvbJGlNaY38rxeNXF/fcOuk6NKBM4NcfwSTmbodq4nmFJC1BZ3Qr4FBUYvxwBQGTyi50CS18TLG6O8f2YYeeIYmXXRvssn7WsljtbymWVy1BnISbzDKXCxRbF0/UAjz64OLZk0bFckpXDDpmurAiVH9U+DJon6Etlz1oZnreIRAw/uSIPpcInn3M8WPEw985FpyfJbI5fJoXpVVOFDUaj0bTlnGC/y3DtboDrty5w47aJri20fSrpu4zW0pMMrYMxvnUCbP9mWN7NsPBpiNZhOvUox3A4nCxFSZ20KRCFAWIS6f9KvjIrYxMz2yMLvvz0VDBWwuz9kTYpZu+en59rwr/kQc58HcgiKgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/cbe2e/looker_studio_metrics_selector05.webp 148w,
/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/3084c/looker_studio_metrics_selector05.webp 295w,
/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/5ca24/looker_studio_metrics_selector05.webp 590w,
/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/85eee/looker_studio_metrics_selector05.webp 769w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/12f09/looker_studio_metrics_selector05.png 148w,
/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/e4a3f/looker_studio_metrics_selector05.png 295w,
/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/fcda8/looker_studio_metrics_selector05.png 590w,
/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/227ba/looker_studio_metrics_selector05.png 769w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/a4fc131da44bcc8a1e314e7ec0ddc9ce/fcda8/looker_studio_metrics_selector05.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;他にも時系列グラフでも指定可能なのでバリエーションは結構広がる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Looker Studioで画像からテーマを生成する]]></title><description><![CDATA[…]]></description><link>https://til.swfz.io/entries/looker_studio_theme_from_image/</link><guid isPermaLink="false">https://til.swfz.io/entries/looker_studio_theme_from_image/</guid><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;「テーマとレイアウト」の一番下&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 477px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2cd2df8b3bd7c665cdb3538a86f05190/d743b/looker_studio_theme_from_image01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.75675675675676%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABlklEQVR42p1S207CQBDlE8QXXhQUFBM/wic/w1d/SAkvJH4BIaBc9B8ol0RDINBusVxKK9IL95Rjd4HaVhMTTzKd2dmZ07O7E+A4DhSJRBKHwRCipxc4iZwjEnYZW58hfBzD8VEU0Vgcl9c3iF7dIhyO2z1xBA9CuL9LIlCtVhlhp8Mjm31EqfiCfL6IQqH00/LPO19CPpfDUzaDYrGEdDqDVOoBgiAiUKvXYVkWdF1jxJvNxvHu2A33HsV6vWYcFA6hYRiYTqfgeZ4VKIoCVVUdPxwOIcsjjMdj28uQJAmqokLTNNZHbUtYqzECXdfZX1erlaPAr9CvbK9qNpsxo3sehTRBySmWy6UT/4X5fI7FYuE9MpVMSZvNJlu32x0MBgNHiVu15TuBh7DuUvhfeAi5SoUF9OIJIeh2uxBFER2eoNUm4O1RIERkOeppnuYEgexyBFKvx66IEVKC/Z1tX9q0H8hA+U1F+VWFKE1A3ifoj3T0ZQ0t4RPVxgca/NiuN2GaJlPojI1hJ36fNfr5jv1mecud/i84/xvXIFvG6gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2cd2df8b3bd7c665cdb3538a86f05190/cbe2e/looker_studio_theme_from_image01.webp 148w,
/static/2cd2df8b3bd7c665cdb3538a86f05190/3084c/looker_studio_theme_from_image01.webp 295w,
/static/2cd2df8b3bd7c665cdb3538a86f05190/78ba5/looker_studio_theme_from_image01.webp 477w&quot;
              sizes=&quot;(max-width: 477px) 100vw, 477px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2cd2df8b3bd7c665cdb3538a86f05190/12f09/looker_studio_theme_from_image01.png 148w,
/static/2cd2df8b3bd7c665cdb3538a86f05190/e4a3f/looker_studio_theme_from_image01.png 295w,
/static/2cd2df8b3bd7c665cdb3538a86f05190/d743b/looker_studio_theme_from_image01.png 477w&quot;
            sizes=&quot;(max-width: 477px) 100vw, 477px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2cd2df8b3bd7c665cdb3538a86f05190/d743b/looker_studio_theme_from_image01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ここから画像を読ませると、読ませた画像にあったテーマを生成してくれる&lt;/p&gt;
&lt;p&gt;試しに下記スクショを保存してアップロードしてみた&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7ffce860dd91db81e0e58f171f0c584e/5d72a/looker_studio_theme_from_image02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.567567567567565%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAmklEQVR42o2PwQvBcACF9+eIYY6GLZE1GzZTZA4TTi6SFDugqaVYKf/v5ze5b4ev16uvV0+qaiOyGf7JdqU8kqK7Ao9yc4jcsCmpKdaPtBdFVvIMKrqDrJq0Z0dG2w9qf4FmzemOl/S8FR03oGX5GJMVNeFmDtY0h0LLZm1uiO09frDjcH0QRgnhPeESvzndnpyjF3VjKh4M+AKgEpKnN4ld/AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/7ffce860dd91db81e0e58f171f0c584e/cbe2e/looker_studio_theme_from_image02.webp 148w,
/static/7ffce860dd91db81e0e58f171f0c584e/3084c/looker_studio_theme_from_image02.webp 295w,
/static/7ffce860dd91db81e0e58f171f0c584e/5ca24/looker_studio_theme_from_image02.webp 590w,
/static/7ffce860dd91db81e0e58f171f0c584e/e1262/looker_studio_theme_from_image02.webp 834w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/7ffce860dd91db81e0e58f171f0c584e/12f09/looker_studio_theme_from_image02.png 148w,
/static/7ffce860dd91db81e0e58f171f0c584e/e4a3f/looker_studio_theme_from_image02.png 295w,
/static/7ffce860dd91db81e0e58f171f0c584e/fcda8/looker_studio_theme_from_image02.png 590w,
/static/7ffce860dd91db81e0e58f171f0c584e/5d72a/looker_studio_theme_from_image02.png 834w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/7ffce860dd91db81e0e58f171f0c584e/fcda8/looker_studio_theme_from_image02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;提案されたテーマは下記&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e2ca093508cc401313ce1f6a5dd08d10/c2d9c/looker_studio_theme_from_image03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.24324324324324%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAACGUlEQVR42nWS3UuTYRjG3z8gz6Q8U6RIoSSNOlgfjCCMDu2kOoqo06DzoES0D4SCVBa2pszpJJ1OtFi6Nt2nzYZpsWILvz86yAPd67b3Y7+evZKZ1A0X93Xfz3PxPHBd0tbWFrIso6gqhcrn8wI7XTf4n3k/dF3/C4WdpCoKuqaRy2bJZLbJ5XIoYqeKB34LVXVnLvS94n+V5A9E8Qcn8Y6HGRd9PDRJLD5D7OMn3CPvGH47hnvYI7iHvsERQtEYY74JnH1u47x/6A2vB4dxuoaYX1xCCoYizMx+IfE1iWfUR1d3L/HpWRqbHnKs6gRnz5u5cfM2rZZ2Hjc/penRE2ovXaa0rJziQyVUVRznoukClaVHsXfakcKRKLGpOEvLK0x+mKLT7mB5ZRWLxWIIr167zoP6ehw9vVhtnbyyWqmru4LpzDmOVFRiPm3i3q071JrMdNu7kKZnPjMVn+ZbMkUy8Z2Gxuek5TQu1wCjXh+BUBSf30/Hyx6an1kYcPVTc/IUxQdLKCs/zIGiIu7fbaC6pprWtjakghHrP9b5ubHByuIaydQC2WyG+bk5IuEw4UiEYCDAe28Q/0SQRCKB2z1IS2sLHTYb7S+sOJ0uHDaH0KaQ8sKxdFomU3BZzoj4aLsOZsVOlreNBKg5Tbib342WpulGnBDQhAa9QEVs+E/tz5xxfU/2FEUjva2Syalsbm6yur4mPpbmF06KWThBokhbAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e2ca093508cc401313ce1f6a5dd08d10/cbe2e/looker_studio_theme_from_image03.webp 148w,
/static/e2ca093508cc401313ce1f6a5dd08d10/3084c/looker_studio_theme_from_image03.webp 295w,
/static/e2ca093508cc401313ce1f6a5dd08d10/5ca24/looker_studio_theme_from_image03.webp 590w,
/static/e2ca093508cc401313ce1f6a5dd08d10/dad35/looker_studio_theme_from_image03.webp 885w,
/static/e2ca093508cc401313ce1f6a5dd08d10/2baf0/looker_studio_theme_from_image03.webp 1180w,
/static/e2ca093508cc401313ce1f6a5dd08d10/bfc0a/looker_studio_theme_from_image03.webp 1326w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e2ca093508cc401313ce1f6a5dd08d10/12f09/looker_studio_theme_from_image03.png 148w,
/static/e2ca093508cc401313ce1f6a5dd08d10/e4a3f/looker_studio_theme_from_image03.png 295w,
/static/e2ca093508cc401313ce1f6a5dd08d10/fcda8/looker_studio_theme_from_image03.png 590w,
/static/e2ca093508cc401313ce1f6a5dd08d10/efc66/looker_studio_theme_from_image03.png 885w,
/static/e2ca093508cc401313ce1f6a5dd08d10/c83ae/looker_studio_theme_from_image03.png 1180w,
/static/e2ca093508cc401313ce1f6a5dd08d10/c2d9c/looker_studio_theme_from_image03.png 1326w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e2ca093508cc401313ce1f6a5dd08d10/fcda8/looker_studio_theme_from_image03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;雰囲気はある&lt;/p&gt;
&lt;p&gt;エディタとかターミナルのテーマのカラーパレットを上げたら良い感じになるんじゃないかな&lt;/p&gt;
&lt;p&gt;試しにSolarized darkのパレットを探して上げてみた&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9555a781b4493c0fe400646c79c40da0/3d405/looker_studio_theme_from_image04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.567567567567565%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAACJUlEQVR42nWSXUiTYRTHX7qK8m4QQd2YId2kECQ1yrKELiLEvmTZB9KiQDQrrIYhRJeRMaKPYbVSJ1nRKi2WNgU/YozJXM4alctmukQohvt833f79Wy28iIP/Hn+POec5zmc/1+amwsTiURQVJV0pLJIpUgmkxlkefpciGx+YZ2UiCdQZJloNEokHCYWixGPxVGzH4iiNFdVBVVR5hsFRIL/heT0enGOenF4PAwL7vKO8mF8nDdv7TQZb3Dn7j1umZox3rzN1etGXtlsPLVaaTY/oMXSjrm1TaAV030zX0SfNOrpJzAxwvTUGIMOOy+7X+D75ObU+QaWry1gaV4By/IK2bxnL+uKSynXV3OxyYi+8TK6+gZ2HdNTvE+HtvwgPYPvxIROO573Q+LBjziHB7A86yA45aOu8Qr52hJyi7axolDLodpzlFQcRVdTj+GakROGS1ScrqfsZC2Hz15gR2UVfU4X0mTAw1f/CLMzPj57HRgaDaTkGSqrzyDlrCRHTChpctldtp81m3ZSWlHFlgNHWLIqH836IlZv3M7xmjo0G7bS2duPFA3/5Pukn28BP9OTEwTH3WL5YVweL6a2DsyPntBi7cLS/piW9ocMDbvFzsd43iPWY7fT1TuE7XUn3QN9zP4KIaVVTAiV4wkZWRHyCzVTiyg4b6h/7G9dUjgipWaElxbpRBXWUP/4K2MbcSoL7mRFJRpTickKoVCIYPBHxs+/AQj4Taml+9vbAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/9555a781b4493c0fe400646c79c40da0/cbe2e/looker_studio_theme_from_image04.webp 148w,
/static/9555a781b4493c0fe400646c79c40da0/3084c/looker_studio_theme_from_image04.webp 295w,
/static/9555a781b4493c0fe400646c79c40da0/5ca24/looker_studio_theme_from_image04.webp 590w,
/static/9555a781b4493c0fe400646c79c40da0/dad35/looker_studio_theme_from_image04.webp 885w,
/static/9555a781b4493c0fe400646c79c40da0/2baf0/looker_studio_theme_from_image04.webp 1180w,
/static/9555a781b4493c0fe400646c79c40da0/4d989/looker_studio_theme_from_image04.webp 1348w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/9555a781b4493c0fe400646c79c40da0/12f09/looker_studio_theme_from_image04.png 148w,
/static/9555a781b4493c0fe400646c79c40da0/e4a3f/looker_studio_theme_from_image04.png 295w,
/static/9555a781b4493c0fe400646c79c40da0/fcda8/looker_studio_theme_from_image04.png 590w,
/static/9555a781b4493c0fe400646c79c40da0/efc66/looker_studio_theme_from_image04.png 885w,
/static/9555a781b4493c0fe400646c79c40da0/c83ae/looker_studio_theme_from_image04.png 1180w,
/static/9555a781b4493c0fe400646c79c40da0/3d405/looker_studio_theme_from_image04.png 1348w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/9555a781b4493c0fe400646c79c40da0/fcda8/looker_studio_theme_from_image04.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ベースとなるテーマを画像から生成して細かいところは自分で調整も可能&lt;/p&gt;
&lt;p&gt;自分の好きな色合いをとりあえず集めてアップロード、細かいところは自分で調整するだけでカスタマイズしたカラーテーマにできる&lt;/p&gt;
&lt;p&gt;良い&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ShellScript内で実行するコマンドのJSON引数をよしなにあつかいたい]]></title><description><![CDATA[gcloudコマンドを実行する例 gcloud pubsubでpublishする際にJSONをメッセージとして渡す場合 素直にやるとエスケープする必要があり面倒… jqを使う方法 jqを通すだけで解決できる で新しいJSONオブジェクトを作成 オプションでjq…]]></description><link>https://til.swfz.io/entries/command_args_with_jq_and_heredoc/</link><guid isPermaLink="false">https://til.swfz.io/entries/command_args_with_jq_and_heredoc/</guid><pubDate>Mon, 29 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;gcloudコマンドを実行する例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;gcloud pubsubでpublishする際にJSONをメッセージとして渡す場合&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;score&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2024-04-23&quot;&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;val&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;: &lt;span class=&quot;token variable&quot;&gt;$val&lt;/span&gt;, &lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;key&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;: &lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;, &lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;date&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;: &lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$date&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;}&quot;&lt;/span&gt;

gcloud pubsub topics publish metrics &lt;span class=&quot;token parameter variable&quot;&gt;--message&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$message&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--attribute&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;source=obsidian-dailynote-metadata&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;素直にやるとエスケープする必要があり面倒…&lt;/p&gt;
&lt;h2&gt;jqを使う方法&lt;/h2&gt;
&lt;p&gt;jqを通すだけで解決できる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;jq &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--arg&lt;/span&gt; val &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$val&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--arg&lt;/span&gt; key &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$key&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--arg&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$date&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;{val: ($val | tonumber), key: $key, date: $date}&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;jq -n&lt;/code&gt;で新しいJSONオブジェクトを作成&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--arg&lt;/code&gt;オプションでjqに変数を渡し、JSONオブジェクト内でこれらの変数を使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ヒアドキュメントを使う方法&lt;/h2&gt;
&lt;p&gt;ヒアドキュメントでも解決できる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;EOF
{
  &quot;val&quot;: &lt;span class=&quot;token variable&quot;&gt;$val&lt;/span&gt;,
  &quot;key&quot;: &quot;&lt;span class=&quot;token variable&quot;&gt;$key&lt;/span&gt;&quot;,
  &quot;date&quot;: &quot;&lt;span class=&quot;token variable&quot;&gt;$date&lt;/span&gt;&quot;
}
EOF&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ヒアドキュメントで定義されたテキストを&lt;code class=&quot;language-text&quot;&gt;cat&lt;/code&gt;コマンドで取得し&lt;code class=&quot;language-text&quot;&gt;message&lt;/code&gt;に代入している&lt;/p&gt;
&lt;p&gt;覚えておいて損はないはず&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Windows Terminalでコピー時のフォーマット]]></title><description><![CDATA[Windows Terminal Interaction Settings | Microsoft Learn  RTF、HTML、もしくは両方でもコピーできる Terminalの出力結果を色付きでGoogleSlideに貼り付けたかったので調べた GoogleSlide…]]></description><link>https://til.swfz.io/entries/copy_format_in_windows_terminal/</link><guid isPermaLink="false">https://til.swfz.io/entries/copy_format_in_windows_terminal/</guid><pubDate>Tue, 19 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/terminal/customize-settings/interaction&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Windows Terminal Interaction Settings | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7a4bf796d29744a1096a566e1ccab558/aae30/copy_format_in_windows_terminal01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.2972972972973%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAvElEQVR42m2OTQrCMBCFc5u2pqRJ/xtaeiWhCzfuCl3Wri2IIHoW9Rx1rZ7gyQxkIbr4CDMZvvdEVVUwxkAphSiKEAQBz03ToK5rJkmSH+I4Rp7n6Pse4zhinmd0XQdBQikliwjP8/jYCYui4ADaOUiotUZZlrje7ngsC56vN07nCwR9hmHIIt/3+aVd27aMtfZL5qCQLMswDAOmaYf94Yj1ZguRpik3I5kTunRqTw3/CR1URq5WUNpAZxYfXyWOGQzjQj8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/7a4bf796d29744a1096a566e1ccab558/cbe2e/copy_format_in_windows_terminal01.webp 148w,
/static/7a4bf796d29744a1096a566e1ccab558/3084c/copy_format_in_windows_terminal01.webp 295w,
/static/7a4bf796d29744a1096a566e1ccab558/5ca24/copy_format_in_windows_terminal01.webp 590w,
/static/7a4bf796d29744a1096a566e1ccab558/dad35/copy_format_in_windows_terminal01.webp 885w,
/static/7a4bf796d29744a1096a566e1ccab558/2baf0/copy_format_in_windows_terminal01.webp 1180w,
/static/7a4bf796d29744a1096a566e1ccab558/cea02/copy_format_in_windows_terminal01.webp 2080w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/7a4bf796d29744a1096a566e1ccab558/12f09/copy_format_in_windows_terminal01.png 148w,
/static/7a4bf796d29744a1096a566e1ccab558/e4a3f/copy_format_in_windows_terminal01.png 295w,
/static/7a4bf796d29744a1096a566e1ccab558/fcda8/copy_format_in_windows_terminal01.png 590w,
/static/7a4bf796d29744a1096a566e1ccab558/efc66/copy_format_in_windows_terminal01.png 885w,
/static/7a4bf796d29744a1096a566e1ccab558/c83ae/copy_format_in_windows_terminal01.png 1180w,
/static/7a4bf796d29744a1096a566e1ccab558/aae30/copy_format_in_windows_terminal01.png 2080w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/7a4bf796d29744a1096a566e1ccab558/fcda8/copy_format_in_windows_terminal01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;RTF、HTML、もしくは両方でもコピーできる&lt;/p&gt;
&lt;p&gt;Terminalの出力結果を色付きでGoogleSlideに貼り付けたかったので調べた&lt;/p&gt;
&lt;p&gt;GoogleSlideに貼り付けたら、HTMLだと書式がコピーされた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub Actionsで自作のActionsのIconを決めるためのリスト]]></title><description><![CDATA[せっかく自作でActionを作ったのでアイコンも設定したい そもそも、どんなリストがあるのかわからなかったので調べてみた 公式には設定方法は書いてある Metadata syntax for GitHub Actions - GitHub Docs…]]></description><link>https://til.swfz.io/entries/github_actions_iconlist/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_actions_iconlist/</guid><pubDate>Mon, 04 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;せっかく自作でActionを作ったのでアイコンも設定したい&lt;/p&gt;
&lt;p&gt;そもそも、どんなリストがあるのかわからなかったので調べてみた&lt;/p&gt;
&lt;p&gt;公式には設定方法は書いてある&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#branding&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Metadata syntax for GitHub Actions - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;が、自分が欲しかったのは実際にどんな色とアイコンがあるか確認したうえで選択したかった&lt;/p&gt;
&lt;p&gt;というわけで下記に行き着いた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://haya14busa.github.io/github-action-brandings/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub Actions Branding Cheat Sheet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;色を選択したらアイコンのリストが表示される&lt;/p&gt;
&lt;p&gt;便利&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Macのhomebrewでtmux3.3aから3.2aへバージョンを下げる]]></title><description><![CDATA[Homebrewで管理しているtmuxのバージョンを上げたら起動しなくなった 少し前のバージョンにして固定したのでそのときの記録 バージョンを下げて固定する brewはインストールするときにFormulaというファイルを読んでインストールしている で、そのFormula…]]></description><link>https://til.swfz.io/entries/tmux_3_3a_to_3_2a/</link><guid isPermaLink="false">https://til.swfz.io/entries/tmux_3_3a_to_3_2a/</guid><pubDate>Wed, 14 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Homebrewで管理しているtmuxのバージョンを上げたら起動しなくなった&lt;/p&gt;
&lt;p&gt;少し前のバージョンにして固定したのでそのときの記録&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ tmux
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;exited&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
~ ❯❯❯
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;0c&lt;span class=&quot;token operator&quot;&gt;&gt;|&lt;/span&gt;iTerm2 &lt;span class=&quot;token number&quot;&gt;3.4&lt;/span&gt;.2&lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;iTerm2 &lt;span class=&quot;token number&quot;&gt;3.4&lt;/span&gt;.2&lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;iTerm2 &lt;span class=&quot;token number&quot;&gt;3.4&lt;/span&gt;.22&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ tmux &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt;
tmux &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;.3a&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;バージョンを下げて固定する&lt;/h2&gt;
&lt;p&gt;brewはインストールするときにFormulaというファイルを読んでインストールしている&lt;/p&gt;
&lt;p&gt;で、そのFormulaにどのバージョンをインストールするか記述しているので、Gitで追ってコミットハッシュを指定してあげれば特定バージョンをインストールできるらしい&lt;/p&gt;
&lt;p&gt;という記事をよく見たので試してみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;対象コミット&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Homebrew/homebrew-core/commit/e44425df5a8b3c8c24073486fa7e355f3ac19657&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;tmux: update 3.2a_1 bottle. · Homebrew/homebrew-core@e44425d&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/e44425df5a8b3c8c24073486fa7e355f3ac19657/Formula/tmux.rb
Error: Installation of tmux from a GitHub commit URL is unsupported! `brew extract tmux` to a stable tap on GitHub instead.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;だめだった、Homebrewのv4からこの手法は使えないよう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;brew extract&lt;/code&gt;を使えと&lt;/p&gt;
&lt;p&gt;下記のスクリプトを参考にした&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/muratayusuke/dotfiles/blob/master/mac/setup.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;dotfiles/mac/setup.sh at master · muratayusuke/dotfiles&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;tap&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ brew extract tmux swfz/taps &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;.2a
Error: No available formula with the name &lt;span class=&quot;token string&quot;&gt;&quot;homebrew/core/tmux&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
Please tap it and &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; try again: brew tap homebrew/core

$ brew tap homebrew/core
Error: Tapping homebrew/core is no longer typically necessary.
Add &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; you are sure you need it &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

$ brew tap &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt; homebrew/core&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;深く追っていないが、いきなり&lt;code class=&quot;language-text&quot;&gt;extract&lt;/code&gt;を実行できなかったのでエラーが案内するとおりにまず&lt;code class=&quot;language-text&quot;&gt;homebrew/core&lt;/code&gt;を取得した&lt;/p&gt;
&lt;h3&gt;tap-new&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ brew tap-new swfz/taps
Initialized empty Git repository &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; /usr/local/Homebrew/Library/Taps/swfz/homebrew-taps/.git/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;extract&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ brew extract tmux swfz/taps &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;.2a
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Searching repository &lt;span class=&quot;token function&quot;&gt;history&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Writing formula &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; tmux from revision e44425d to:
/usr/local/Homebrew/Library/Taps/swfz/homebrew-taps/Formula/tmux@3.2a.rb&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;install&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; swfz/taps/tmux@3.2a&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;確認&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ tmux &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt;
tmux &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;.2a&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでOKそう…&lt;/p&gt;
&lt;h3&gt;pin&lt;/h3&gt;
&lt;p&gt;ふとしたときに更新されてしまわないようにpinしておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ brew pin swfz/taps/tmux@3.2a
$ brew list &lt;span class=&quot;token parameter variable&quot;&gt;--pinned&lt;/span&gt;
tmux@3.2a&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[JIRAのAPIを使ってIssueの情報を取得する]]></title><description><![CDATA[主にドキュメントはこの辺 The Jira Cloud platform REST API JIRAのIssueデータを取得するコード は該当プロジェクトページで確認して指定する 環境変数 リクエストに必要な環境変数 ATLASSIAN_DOMAIN 利用中のATLASSIAN…]]></description><link>https://til.swfz.io/entries/jira_issues_using_rest_api/</link><guid isPermaLink="false">https://til.swfz.io/entries/jira_issues_using_rest_api/</guid><pubDate>Fri, 02 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;主にドキュメントはこの辺&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-search/#api-rest-api-3-search-get&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;The Jira Cloud platform REST API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;JIRAのIssueデータを取得するコード&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;fs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dayjs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dayjs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; username &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CONFLUENCE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; buffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;username&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;token&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; auth &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;base64&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; projectName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;HOGE&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PAST_DAYS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;160&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; params&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ATLASSIAN_DOMAIN&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;path&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;GET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Authorization&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Basic &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;auth&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Accept&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/json&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;fetchIssues&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;startAt &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;rest/api/3/search&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;jql&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;project = &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;projectName&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; AND status = Done AND updated &gt;= -&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PAST_DAYS&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    startAt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;changelog&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;startAt: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startAt&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, maxResults: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;maxResults&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, total: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; issues &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;issues&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;issue&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;timeestimate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timeestimate&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;timespent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timespent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;summary&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;created&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;created&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;updated&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;updated&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;storypoint&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;customfield_10001 &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;assignee&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;assignee&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;displayName &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;issueType&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;issuetype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;statusChanges&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; issue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;changelog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;histories&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; minutes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timespent &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timeestimate &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;NaN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hours &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;minutes &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ATLASSIAN_DOMAIN&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/browse/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;key&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      minutes&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      hours&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startAt &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;maxResults &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;issues&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchIssues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startAt &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;maxResults&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; issues
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; issues &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchIssues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeFileSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;./issues.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;issues&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;utf8&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;projectName&lt;/code&gt;は該当プロジェクトページで確認して指定する&lt;/p&gt;
&lt;h2&gt;環境変数&lt;/h2&gt;
&lt;p&gt;リクエストに必要な環境変数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ATLASSIAN_DOMAIN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;利用中のATLASSIANドメイン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CONFLUENCE_API_TOKEN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personal Access Tokenの値&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EMAIL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personal Access Tokenを発行したユーザーのEmail&lt;/p&gt;
&lt;h2&gt;リクエストパラメータ&lt;/h2&gt;
&lt;p&gt;基本的にドキュメント読めばよいが今回のコードのメモと所感を残しておく&lt;/p&gt;
&lt;h3&gt;jql&lt;/h3&gt;
&lt;p&gt;JIRAのQueryLanguage&lt;/p&gt;
&lt;p&gt;SQLライクにクエリを書ける&lt;/p&gt;
&lt;p&gt;今回はProject名もしくはキーとステータス、更新日時を指定した&lt;/p&gt;
&lt;h3&gt;expand&lt;/h3&gt;
&lt;p&gt;Issueに紐づくデータで取得したいものを指定する、指定がない場合はレスポンスに含まれない&lt;/p&gt;
&lt;p&gt;今回だと&lt;code class=&quot;language-text&quot;&gt;changelog&lt;/code&gt;を取得している（Issueの変更履歴、いつどのカラムがどう変わったかなど）&lt;/p&gt;
&lt;p&gt;RESTなのにGraphQL的な使い方だなと感じるが気は効いている&lt;/p&gt;
&lt;p&gt;この機能がなかったら結局Issue毎にchangelogのエンドポイントへリクエストすることになるので…&lt;/p&gt;
&lt;h3&gt;startAt&lt;/h3&gt;
&lt;p&gt;データのオフセットを指定できるため、一度のリクエストで取得した件数分上乗せして再帰的に特定範囲のデータを取得する&lt;/p&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;いろいろ雑な部分はあるが最低限こんな感じでデータは取れるようになる&lt;/p&gt;
&lt;p&gt;生データは未加工でどこかにおいたほうがよいのでは？ という話もあるが、単発で雑にまずデータ取ってみて分析とかするならまずはここからという感じ&lt;/p&gt;
&lt;p&gt;サンプルなので一部のデータしか載せていないが実際にはレスポンスの中身をみて利用するデータを選定して整形処理なども含める&lt;/p&gt;
&lt;p&gt;自分のケースだとステータスの移動のリードタイムを算出したりした&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;fields.customfield_xxxxx&lt;/code&gt;というようなカラムはJIRAで設定できるフィールドのようなのでこれも実際のレスポンス見て必要か判断する&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub CLIの選択肢移動でVimのキーを使いたい]]></title><description><![CDATA[GitHub CLIでは各種コマンドで選択肢を選ぶときにというパッケージを用いている で、このパッケージを使って選択肢を移動するときにVimモードで移動できたら良いなと思っていた ,で上下移動的な感じ で、いろいろ探していたらすでにVim…]]></description><link>https://til.swfz.io/entries/gh_cli_vim_keybind/</link><guid isPermaLink="false">https://til.swfz.io/entries/gh_cli_vim_keybind/</guid><pubDate>Tue, 30 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHub CLIでは各種コマンドで選択肢を選ぶときに&lt;code class=&quot;language-text&quot;&gt;survery&lt;/code&gt;というパッケージを用いている&lt;/p&gt;
&lt;p&gt;で、このパッケージを使って選択肢を移動するときにVimモードで移動できたら良いなと思っていた&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Ctrl+j&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;Ctrl+k&lt;/code&gt;で上下移動的な感じ&lt;/p&gt;
&lt;p&gt;で、いろいろ探していたらすでにVimモードがあるらしく、選択肢が表示された時点で&lt;code class=&quot;language-text&quot;&gt;Esc&lt;/code&gt;キーを押下するとその後は&lt;code class=&quot;language-text&quot;&gt;j&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;k&lt;/code&gt;で上下移動できる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cli/cli/issues/1483&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Document survey’s VimMode · Issue #1483 · cli/cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;しらなかった!!!&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;ターミナル上でのインタラクティブフィルタツールの移動は&lt;code class=&quot;language-text&quot;&gt;Ctrl+j&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;Ctrl+k&lt;/code&gt;なので若干違和感は残るが、以前より全然操作しやすくなった&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;ただ、survery自体はメンテナンス終了してた…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/AlecAivazis/survey&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AlecAivazis/survey: A golang library for building interactive and accessible prompts with full support for windows and posix terminals.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これからどうなるのかは…ちょっとわかりません&lt;/p&gt;</content:encoded></item><item><title><![CDATA[mswでzipレスポンスを返す]]></title><description><![CDATA[mswでモックする対象としてや動画などバイナリファイルも扱える 次の例はGitHub Actionsの各ジョブのログをあらかじめDLしておきそれを読み込みレスポンスとして返す処理 handler…]]></description><link>https://til.swfz.io/entries/zip_response_using_msw/</link><guid isPermaLink="false">https://til.swfz.io/entries/zip_response_using_msw/</guid><pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mswでモックする対象として&lt;code class=&quot;language-text&quot;&gt;zip&lt;/code&gt;や動画などバイナリファイルも扱える&lt;/p&gt;
&lt;p&gt;次の例はGitHub Actionsの各ジョブのログをあらかじめDLしておきそれを読み込みレスポンスとして返す処理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;handlerの例&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; handlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://api.github.com/repos/*/*/actions/runs/*/logs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; buffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readFileSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cwd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./src/mocks/responses/failed_log.zip&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; HttpResponse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;arrayBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;buffer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      status&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      headers&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&apos;Content-Type&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/zip&apos;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;公式の例では&lt;code class=&quot;language-text&quot;&gt;mp4&lt;/code&gt;をバイナリとして返している&lt;/p&gt;
&lt;p&gt;基本的にはこの方法でバイナリファイルでもレスポンスをモックすることが可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mswjs.io/docs/recipes/responding-with-binary/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Responding with binary - Mock Service Worker&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Jestでslackのwebhook.sendの検証]]></title><description><![CDATA[バージョン を用いてWebhook経由のSlack通知を実装した際のテストコードの話 メソッドがどんな引数で呼ばれたかをチェックする アプリケーションコード テストコード こんな感じで、引数の検証とレスポンスのモック両方行える mswでもSlack…]]></description><link>https://til.swfz.io/entries/jest_called_with_slack_webhook_send/</link><guid isPermaLink="false">https://til.swfz.io/entries/jest_called_with_slack_webhook_send/</guid><pubDate>Fri, 19 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;バージョン&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;@slack/webhook@7.0.2
jest@29.7.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;@slack/webhook&lt;/code&gt;を用いてWebhook経由のSlack通知を実装した際のテストコードの話&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;send&lt;/code&gt;メソッドがどんな引数で呼ばれたかをチェックする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  IncomingWebhook&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  IncomingWebhookResult&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  IncomingWebhookSendArguments
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@slack/webhook&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;notify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  webhookUrl&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  params&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; IncomingWebhookSendArguments
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;IncomingWebhookResult&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; webhook &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IncomingWebhook&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;webhookUrl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; webhook&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;テストコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; webhookSendMock

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    webhookSendMock &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; jest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;spyOn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;IncomingWebhook&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;send&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mockImplementation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;IncomingWebhookResult&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;text&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ok&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;run&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// mainからアプリケーションコードを呼んでいる&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;webhookSendMock&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toHaveBeenCalledWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;expect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;objectContaining&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      text&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; expect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringContaining&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Workflow: test-workflow&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      blocks&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; expect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;anything&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じで、引数の検証とレスポンスのモック両方行える&lt;/p&gt;
&lt;p&gt;mswでもSlackへの通信をモックしてたが、&lt;code class=&quot;language-text&quot;&gt;spyOn&lt;/code&gt;によって上書きされるので、レスポンスを返すところまで&lt;code class=&quot;language-text&quot;&gt;mockImplementation&lt;/code&gt;で書いてあげる必要がある&lt;/p&gt;
&lt;p&gt;使う側からみると&lt;code class=&quot;language-text&quot;&gt;new IncomingWebhook&lt;/code&gt;して返ってきたインスタンスをモックするにはどうすればよいのかと思ってたけど、prototypeを指定すればよいのね&lt;/p&gt;
&lt;p&gt;たしかに、納得&lt;/p&gt;
&lt;h2&gt;やっていること&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;toHaveBeenCalledWith&lt;/code&gt;で呼ばれた際の引数のチェックを行える&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/ja/docs/expect#tohavebeencalledwitharg1-arg2-&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;toHaveBeenCalledWith&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;expect.objectContaining&lt;/code&gt;で再帰的に受け取ったオブジェクトの中身をチェックできる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/ja/docs/expect#expectobjectcontainingobject&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;objectContaining&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;中身の指定は固定の値や&lt;code class=&quot;language-text&quot;&gt;expect.anything&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;expect.stringContaining&lt;/code&gt;などのマッチャも指定できる&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;expect.stringContaining()&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;expect.anything()&lt;/code&gt;を用いることで部分一致や特定のキー以下は何でもよいというようなチェックができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/ja/docs/expect#expectstringcontainingstring&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;stringContaining&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/ja/docs/expect#expectanything&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;anything&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回の場合下記のようなパラメータで&lt;code class=&quot;language-text&quot;&gt;send&lt;/code&gt;メソッドにパラメータを送っている&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Workflow: test-workflow&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;blocks&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;色々…&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;他にも&lt;code class=&quot;language-text&quot;&gt;Containing&lt;/code&gt;系のマッチャはあるので場面によって使い分けする&lt;/p&gt;
&lt;p&gt;ここだけは担保しておきたいというような場合にも検証ができるのとネストした場所でも使用できるので便利&lt;/p&gt;
&lt;h2&gt;テスト失敗時の差分表示&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;toHaveBeenCalledWith&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;objectContaining&lt;/code&gt;を用いたテストだと、差分があったときのdiff表示がprettyな表示にならないようで&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e7b5228dd70902c5d83161c8da623bed/bd3d5/jest_called_with_slack_webhook_send01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 38.513513513513516%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB3klEQVR42iWSWW/aQBSF+R99qdSXKmpUFFUs3gBjICQ2Hq8BG+w6Yd9C0lZV+9Kf/vWmfTg6M6M7R9+9M7V6w+Bas2mNAm6Tkv58hZUuccoXBtV3+uUFu7gwWv/GqV6xF2fxF8y4wooKzCATn6N7AbrrU2u6Do17GyOcEOw3hPstwfFI9usP8eUH0emZ9NtPovMLk9WG+Hwhfn4VP6F2OyabLe5jyW0e4zwk1DqGRaOhoXeHeNOKsNyhygOqOBIUJ9Gbn1HzPePkEf/hCTf5SlTucWdP9LwEJ5gyinNsP6LWb1pcfW7yqe1gqQXdsMJOlnSiJVb4JFrST7ZyvqIjezte0Qsf6Xi5aIodLugFOcOkoDsJqd1qXZpfdHRjwL3KGcts7otnaeEgM11L4Zq+hI6SDaN0K74WolLIhCoV2uKAE2ZSuxDCmFpLHuWm3kBr29y5KSqRtjNpeyaKJSjd4MyODGcHhtMdg2RFVxV0/Jyeyuj5QhnMGL61rGSGH26avK83udId2m6CLpRmVGFKUCc7oker/xLCN2lBRcvLaLlTtInIS2mNfbkbYPgS+O6qzseWxbU5wJQCQ8kXUCWmkPQk0JQQI16Lb/+tTaHWJnNRJrU5htzR3ZD22BNX/AWhgDZliZ2JsgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e7b5228dd70902c5d83161c8da623bed/cbe2e/jest_called_with_slack_webhook_send01.webp 148w,
/static/e7b5228dd70902c5d83161c8da623bed/3084c/jest_called_with_slack_webhook_send01.webp 295w,
/static/e7b5228dd70902c5d83161c8da623bed/5ca24/jest_called_with_slack_webhook_send01.webp 590w,
/static/e7b5228dd70902c5d83161c8da623bed/dad35/jest_called_with_slack_webhook_send01.webp 885w,
/static/e7b5228dd70902c5d83161c8da623bed/2baf0/jest_called_with_slack_webhook_send01.webp 1180w,
/static/e7b5228dd70902c5d83161c8da623bed/5167a/jest_called_with_slack_webhook_send01.webp 2143w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e7b5228dd70902c5d83161c8da623bed/12f09/jest_called_with_slack_webhook_send01.png 148w,
/static/e7b5228dd70902c5d83161c8da623bed/e4a3f/jest_called_with_slack_webhook_send01.png 295w,
/static/e7b5228dd70902c5d83161c8da623bed/fcda8/jest_called_with_slack_webhook_send01.png 590w,
/static/e7b5228dd70902c5d83161c8da623bed/efc66/jest_called_with_slack_webhook_send01.png 885w,
/static/e7b5228dd70902c5d83161c8da623bed/c83ae/jest_called_with_slack_webhook_send01.png 1180w,
/static/e7b5228dd70902c5d83161c8da623bed/bd3d5/jest_called_with_slack_webhook_send01.png 2143w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e7b5228dd70902c5d83161c8da623bed/fcda8/jest_called_with_slack_webhook_send01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;検証対象の量が多いとどこに差分があるか探すのがつらくなってくる&lt;/p&gt;
&lt;p&gt;一方この手の確認で有用なのはSnapshotテストが挙げられる&lt;/p&gt;
&lt;p&gt;Snapshotテストは差分があった場合prettyな表示をしてくれるのでどこで差分があったか把握しやすい&lt;/p&gt;
&lt;p&gt;なのでそもそも引数のオブジェクトのデータ量が多い場合はSnapshotテストに変更したほうが体験はよい&lt;/p&gt;
&lt;p&gt;Snapshotテストだと基本的にはオブジェクトの中身すべて完全一致している必要があるので、このあたりもケースによって使い分けが必要&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Octokitで扱うAPIのレスポンスの型定義]]></title><description><![CDATA[Octokitを使ってGitHubのAPIを叩いてデータを取得する TypeScriptで開発してたのでしっかり型付けを行いたい octokit/types.ts: Shared TypeScript definitions for Octokit projects…]]></description><link>https://til.swfz.io/entries/octokit_typescript/</link><guid isPermaLink="false">https://til.swfz.io/entries/octokit_typescript/</guid><pubDate>Mon, 15 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Octokitを使ってGitHubのAPIを叩いてデータを取得する&lt;/p&gt;
&lt;p&gt;TypeScriptで開発してたのでしっかり型付けを行いたい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/octokit/types.ts&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;octokit/types.ts: Shared TypeScript definitions for Octokit projects&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これ参照するのがよい?&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; i &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; @octokit/types&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;README読んだが&lt;code class=&quot;language-text&quot;&gt;octokit&lt;/code&gt;を変数化して&lt;code class=&quot;language-text&quot;&gt;octokit&lt;/code&gt;に生えているメソッドから返ってくる型を特定する方法だった&lt;/p&gt;
&lt;p&gt;できれば変数から型情報を抜き出すのはやりたくないので少し調べた&lt;/p&gt;
&lt;p&gt;使い方のバリエーションとしてほかにもありそうかなということで、GitHub検索で探したら参考になりそうなコードが出てきた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/thdk/cloud-build-monitor/blob/7ab37b33e3c72d3ad109a49ab04bbbae57bf8e1c/packages/app/components/repo-list/repo-list.tsx#L14&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;参考&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;import type { Octokit } from &quot;@octokit/rest&quot;;&lt;/code&gt;とあるように&lt;code class=&quot;language-text&quot;&gt;Octokit&lt;/code&gt;の型情報が存在するようなのでそこからたどって行けそう&lt;/p&gt;
&lt;p&gt;結局下記のような感じでデータの取得方法と対応した型定義の呼び出し方で定義できた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一部抜粋&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Octokit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ReturnType&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; getOctokit&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Jobs&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GetResponseDataTypeFromEndpointMethod&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
  Octokit&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;rest&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;actions&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;listJobsForWorkflowRun&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;jobs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Annotations&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GetResponseDataTypeFromEndpointMethod&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
  Octokit&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;rest&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;checks&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;listAnnotations&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getFailedJobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  octokit&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Octokit&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  runId&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Jobs&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; octokit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;actions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;listJobsForWorkflowRun&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    owner&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    repo&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    run_id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; runId
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; completedJobs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;jobs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;j &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; j&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;completed&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; failedJobs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; completedJobs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;j &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; j&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conclusion &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;failure&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; failedJobs &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getJobAnnotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  octokit&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Octokit&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  jobId&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Annotations&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; octokit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;checks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;listAnnotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    owner&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    repo&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    check_run_id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; jobId
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;GetResponseDataTypeFromEndpointMethod&lt;/code&gt;が便利&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub ActionsのOctokitでfetchを使いリクエストする]]></title><description><![CDATA[GitHub Actionsのカスタムアクションの開発をしていてエラーに遭遇したのでメモ のを使ってoctokitを呼び出して使うとによるAPI通信のモックが行えない 動作環境 テスト対象コード テストコード一部抜粋 mswのhandler一部抜粋 msw…]]></description><link>https://til.swfz.io/entries/octokit_using_fetch/</link><guid isPermaLink="false">https://til.swfz.io/entries/octokit_using_fetch/</guid><pubDate>Wed, 10 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHub Actionsのカスタムアクションの開発をしていてエラーに遭遇したのでメモ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;@actions/github&lt;/code&gt;の&lt;code class=&quot;language-text&quot;&gt;getOctokit&lt;/code&gt;を使ってoctokitを呼び出して使うと&lt;code class=&quot;language-text&quot;&gt;msw&lt;/code&gt;によるAPI通信のモックが行えない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;動作環境&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;@actions/github@6.0.0
msw@2.0.14
node@21.2.0
octokit@3.1.2&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;テスト対象コード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getWorkflowRun&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  octokit&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Octokit&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  runId&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;WorkflowRun&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; octokit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;actions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getWorkflowRun&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    owner&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    repo&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    run_id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; runId
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  core&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;fetched workflow run&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;テストコード一部抜粋&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; getOctokit &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@actions/github&apos;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; octokit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getOctokit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dummy&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;getWorkflowRun&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; workflowRun &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getWorkflowRun&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;octokit&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workflowRun&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30433642&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;mswのhandler一部抜粋&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; workflowRun &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./responses/workflow_run.json&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; handlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://api.github.com/repos/*/*/actions/runs/*&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; HttpResponse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workflowRun&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;mswのモックの設定を行いテストを実行してみたが下記のようにエラーが発生する状態だった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; typescript-action@0.0.0 &lt;span class=&quot;token builtin class-name&quot;&gt;test&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; jest __tests__/main.test.ts

  console.warn
    Deprecation: &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;@octokit/request-error&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;error.code&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt; is deprecated, use &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;error.status&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
        at RequestError.get &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/@octokit/request-error/dist-node/index.js:70:11&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at isAssertionError &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/formatNodeAssertErrors.js:179:13&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at /home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/formatNodeAssertErrors.js:58:14
        at Array.map &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;anonymous&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at formatNodeAssertErrors &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/formatNodeAssertErrors.js:39:43&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at dispatch &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/state.js:67:11&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at processTicksAndRejections &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;node:internal/process/task_queues:95:5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at _runTest &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/run.js:264:3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at _runTestsForDescribeBlock &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/run.js:126:9&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at _runTestsForDescribeBlock &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/run.js:121:9&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at run &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/run.js:71:3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at runAndTransformResultsToJestFormat &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at jestAdapter &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at runTestInternal &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-runner/build/runTest.js:367:16&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        at runTest &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/home/user/gh/self/failed-log-to-slack-action/node_modules/jest-runner/build/runTest.js:444:34&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

      at node_modules/@octokit/request-error/dist-node/index.js:38:69
      at f &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;node_modules/once/once.js:25:25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      at RequestError.get &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;node_modules/@octokit/request-error/dist-node/index.js:69:9&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          at Array.map &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;anonymous&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

 FAIL  __tests__/main.test.ts &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5.021&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  sample
    ✓ hoge &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt; ms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    ✕ github &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;269&lt;/span&gt; ms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  action
    ○ skipped sets the &lt;span class=&quot;token function&quot;&gt;time&lt;/span&gt; output
    ○ skipped sets a failed status

  ● sample › github

    HttpError: Bad credentials

      &lt;span class=&quot;token number&quot;&gt;34&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   runId: number
      &lt;span class=&quot;token number&quot;&gt;35&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Promise&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;WorkflowRun&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   const &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; await octokit.rest.actions.getWorkflowRun&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
         &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                    ^
      &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     owner: context.repo.owner,
      &lt;span class=&quot;token number&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     repo: context.repo.repo,
      &lt;span class=&quot;token number&quot;&gt;39&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     run_id: runId

      at node_modules/@octokit/request/dist-node/index.js:124:21
      at getWorkflowRun &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;src/github.ts:36:20&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      at Object.&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;anonymous&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__tests__/main.test.ts:48:20&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Bad credentials&lt;/code&gt;といわれていて、mswでモックしているはずなのにGitHubに通信が行ってしまっている&lt;/p&gt;
&lt;p&gt;調べてみると、下記の参考Issueが見つかった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/actions/toolkit/issues/1115&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Unit testing: Bad credentials error · Issue #1115 · actions/toolkit&lt;/a&gt;&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;defaultではfetchやaxiosではないラッパーライブラリを使ってリクエストしているのでmswやnockなどはモックできない&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;Issueに掲載されている例とは若干違うが次のようにしたらモックできた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;github&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; octokit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getOctokit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dummy&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;request&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; fetch&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getWorkflowRun&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;octokit&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;getOctokit(&apos;dummy&apos;, {request: fetch})&lt;/code&gt;でrequestに使うモジュールを指定できる&lt;/p&gt;
&lt;p&gt;fetchでAPIへリクエストするようにOptionを渡すことでmswが通信をモックできるようになる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gitの-Cオプション]]></title><description><![CDATA[nodenvで特定のバージョンをインストールする際に指定バージョンがない場合にエラーが出る 普段は読み飛ばしてたがよく見るとこのコマンドで更新してねと書いてあった これで更新できるのかと思ったが  ん？ man見たら 知らなかったー!!! これは楽 CI/CD…]]></description><link>https://til.swfz.io/entries/git_large_c_option/</link><guid isPermaLink="false">https://til.swfz.io/entries/git_large_c_option/</guid><pubDate>Wed, 20 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;nodenvで特定のバージョンをインストールする際に指定バージョンがない場合にエラーが出る&lt;/p&gt;
&lt;p&gt;普段は読み飛ばしてたがよく見るとこのコマンドで更新してねと書いてあった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;node-build: definition not found: &lt;span class=&quot;token number&quot;&gt;18.18&lt;/span&gt;.0

See all available versions with `nodenv &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --list&apos;.

If the version you need is missing, try upgrading node-build:

  &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; /home/user/.anyenv/envs/nodenv/plugins/node-build pull&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで更新できるのかと思ったが&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;git -C&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ん？&lt;/p&gt;
&lt;p&gt;man見たら&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;       -C &amp;lt;path&gt;
           Run as if git was started in &amp;lt;path&gt; instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C &amp;lt;path&gt; is interpreted relative
           to the preceding -C &amp;lt;path&gt;. If &amp;lt;path&gt; is present but empty, e.g.  -C &quot;&quot;, then the current working directory is left unchanged.

           This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made relative to the working directory
           caused by the -C option. For example the following invocations are equivalent:

               git --git-dir=a.git --work-tree=b -C c status
               git --git-dir=c/a.git --work-tree=c/b status&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git が現在の作業ディレクトリではなく &amp;lt;path&gt; で起動されたかのように実行します&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;知らなかったー!!!&lt;/p&gt;
&lt;p&gt;これは楽&lt;/p&gt;
&lt;p&gt;CI/CDとかのスクリプト内でも使えそう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WSL2からホスト（Windows）上に立てたProxy経由で通信したい]]></title><description><![CDATA[諸般の事情によりWSLから外への通信をWSL以外の何かしらを経由して通信するという要件が発生した WSL以外の何かしらにプロキシを設置する Virtualboxでプロキシ用VMを起動するという選択肢が提示されたがそのためだけにVirtualBox…]]></description><link>https://til.swfz.io/entries/proxy_from_wsl2/</link><guid isPermaLink="false">https://til.swfz.io/entries/proxy_from_wsl2/</guid><pubDate>Wed, 13 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;諸般の事情によりWSLから外への通信をWSL以外の何かしらを経由して通信するという要件が発生した&lt;/p&gt;
&lt;p&gt;WSL以外の何かしらにプロキシを設置する&lt;/p&gt;
&lt;p&gt;Virtualboxでプロキシ用VMを起動するという選択肢が提示されたがそのためだけにVirtualBox起動するのはな…ということで、結局GitBashで&lt;code class=&quot;language-text&quot;&gt;pproxy&lt;/code&gt;を起動することにした&lt;/p&gt;
&lt;h2&gt;Windows側&lt;/h2&gt;
&lt;h3&gt;Pythonのインストール&lt;/h3&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://qiita.com/Haruka-Ogawa/items/b37d0a2b48d14e29e802&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Windows PC へのPython3 導入手順 #Python - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;環境変数PATHにも追加チェックボックにチェックした&lt;/p&gt;
&lt;p&gt;これでWindows側で&lt;code class=&quot;language-text&quot;&gt;py.exe&lt;/code&gt;が使えるようになるらしい&lt;/p&gt;
&lt;h3&gt;pproxyのインストール&lt;/h3&gt;
&lt;p&gt;GitBashを入れているのでGitBashから下記実行した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ py &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; pproxy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;pproxyの実行&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ py &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pproxy
Serving on :8080 by http,socks4,socks5&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これだけでOKっぽい、簡単&lt;/p&gt;
&lt;p&gt;カスタマイズしようと思えばいろいろできるみたいだが今回は不要だったのでこのまま&lt;/p&gt;
&lt;h2&gt;WSL2側&lt;/h2&gt;
&lt;h3&gt;ホスト（Windows）側IPの特定&lt;/h3&gt;
&lt;p&gt;まずWindows側で立てたプロキシがどこかを判断する必要がある&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; route &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;default via&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $3}&apos;&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;172.1&lt;/span&gt;.1.1

$ &lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; route &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;default via&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--color&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;no &lt;span class=&quot;token parameter variable&quot;&gt;-Eo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}&apos;&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;172.1&lt;/span&gt;.1.1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;どちらかが良さそう&lt;/p&gt;
&lt;p&gt;このIPがWSLから見えるホスト側のIPなのでこの場合&lt;code class=&quot;language-text&quot;&gt;172.1.1.1:8080&lt;/code&gt;をプロキシとして指定する&lt;/p&gt;
&lt;h3&gt;httpでアクセス&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; http://172.1.1.1:8080 https://&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;proxyが必要なアクセス先URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ssh設定&lt;/h3&gt;
&lt;p&gt;プロキシを通したいホストに対して下記設定を追加&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ssh/config&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ProxyCommand nc -X 5 -x 172.1.1.1:8080 %h %p&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;SOCKS5プロトコルでプロキシ通す設定&lt;/p&gt;
&lt;h3&gt;SOCKS4,5の違い&lt;/h3&gt;
&lt;p&gt;そもそもSOCKS4,5は&lt;/p&gt;
&lt;p&gt;Socket Secure version 4,5の略らしい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nordvpn.com/ja/blog/socks5-proxy-vpn/#:~:text=SOCKS5%E3%81%A8SOCKS4%E3%81%AE%E9%81%95%E3%81%84,%E3%81%8C%E8%A7%A3%E6%B1%BA%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;SOCKS5プロキシのメリットとは？ | NordVPN&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SOCKS5とSOCKS4はともにSOCKSプロトコルですが、SOCKS4は「UDP接続には利用できない」「プロキシ側に名前解決させることができない」「わずかな認証機能しかサポートしていない」という問題を抱えているのに対し、SOCKS5ではそれらの問題が解決されています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;基本的にSOCKS5を使ったほうが良さそう&lt;/p&gt;
&lt;h3&gt;HTTPプロキシとSOCKSプロキシの違い&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTPプロキシはHTTPおよび &lt;a href=&quot;https://nordvpn.com/ja/blog/what-is-https/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;HTTPS&lt;/a&gt;ウェブページのみで動作するのに対し、SOCKS5プロキシはあらゆるトラフィックに対応しています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTPプロキシとは、通常、特定のプロトコル用に設計された高レベルのプロキシを指します。これにより接続速度は向上しますが、SOCKSプロキシほど柔軟性や安全性は高くありません。SOCKSプロキシはHTTPプロキシよりも低レベルで動作するため、あらゆるプログラムやプロトコル、あらゆるトラフィックを制限なく扱うことができます。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[TailwindCSSでレスポンシブレイアウト]]></title><description><![CDATA[本ブログのスタイルをTailwindCSSへ差し替えるついでにモバイル対応的なものもやることにした 以前は若干崩れているところがあり正直なにも対応してなかったのでこれを機に対応した 構成はheader、メインコンテンツ（記事本文とサイドバー）、そしてfooterの…]]></description><link>https://til.swfz.io/entries/tailwind_responsive_layout/</link><guid isPermaLink="false">https://til.swfz.io/entries/tailwind_responsive_layout/</guid><pubDate>Tue, 21 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本ブログのスタイルをTailwindCSSへ差し替えるついでにモバイル対応的なものもやることにした&lt;/p&gt;
&lt;p&gt;以前は若干崩れているところがあり正直なにも対応してなかったのでこれを機に対応した&lt;/p&gt;
&lt;p&gt;構成はheader、メインコンテンツ（記事本文とサイドバー）、そしてfooterの3つの主要セクションから成り立っている&lt;/p&gt;
&lt;p&gt;メインコンテンツのレイアウトが、画面のサイズ（特に、中間のブレークポイントであるmd）に応じて変化するようになっている&lt;/p&gt;
&lt;p&gt;具体的には、小さい画面ではメインコンテンツが縦に積み重なり、大きい画面では横並びになるように設定した&lt;/p&gt;
&lt;h2&gt;デモ&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/f9f80689d323a1e8209f7324abadc6ad/tailwind_responsive_layout01.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実際のコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex min-h-screen flex-col justify-between bg-gray-100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-10 bg-blue-200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bg-gray-200 flex grow flex-col md:flex-row&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;basis-0 md:basis-3/12&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;basis-6/12 bg-white border-b-4 md:border-0 border-zinc-100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;記事本文&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;basis-2/12 divide-y divide-gray-300 bg-white md:bg-red-200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-24&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        Profile
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-24&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        Account
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-32&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        Archive
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-10 bg-blue-200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Footer&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;細かい指定はこのコードからさらに追加しているがおおむねこの通りにした&lt;/p&gt;
&lt;p&gt;こちらで大枠は説明済み&lt;/p&gt;
&lt;h3&gt;メインコンテンツ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;flex-col md:flex-row&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;モバイルでは縦並び、mdブレークポイント以上では横並び&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;余白のあるスペースをすべて埋めるために拡大&lt;/p&gt;
&lt;p&gt;メインの記事のコンテンツ量が少ない場合にこれを指定しないとheader,footerとの間に隙間が空いてしまう&lt;/p&gt;
&lt;h3&gt;メインコンテンツ内の左側の余白&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;basis-0 md:basis-3/12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;モバイルでは基本的に幅を取らず、mdブレークポイント以上では全体の3分の1の幅&lt;/p&gt;
&lt;h3&gt;インコンテンツ内の中央の記事本文&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;basis-6/12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全体の半分の幅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;border-b-4 md:border-0 border-zinc-100&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;画面サイズが小さい場合には記事本文セクションの下に境界線を表示&lt;/p&gt;
&lt;p&gt;画面が大きい場合には境界線は表示されない&lt;/p&gt;
&lt;p&gt;これにより、異なる画面サイズでの視覚的な区別が付きやすいようにしている&lt;/p&gt;
&lt;h3&gt;メインコンテンツ内の右側のサイドバー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;divide-y divide-gray-300&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;縦に区切り線を入れ、線の色を薄いグレーに設定&lt;/p&gt;
&lt;p&gt;子要素の間に線を入れてくれる、今まで専用のコンポーネント作ってたがクラス名指定するだけでよいのめちゃ楽&lt;/p&gt;
&lt;h2&gt;Playground&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://play.tailwindcss.com/FJeX8sOhMD?size=1338x625&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailwind Play&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[コンテンツが足りない場合もfooterを下に維持する]]></title><description><![CDATA[どうやるんだって調べたシリーズ header,contents,footerとあった場合に画面の縦幅に対しcontentsが少なかった場合でもfooterを画面の一番下に表示させたい 中央のボディセクションが動的に伸縮してコンテンツの量に応じてサイズが変わる状態 デモ alt…]]></description><link>https://til.swfz.io/entries/tailwind_keep_bottom_not_enough_content/</link><guid isPermaLink="false">https://til.swfz.io/entries/tailwind_keep_bottom_not_enough_content/</guid><pubDate>Mon, 13 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;どうやるんだって調べたシリーズ&lt;/p&gt;
&lt;p&gt;header,contents,footerとあった場合に画面の縦幅に対しcontentsが少なかった場合でもfooterを画面の一番下に表示させたい&lt;/p&gt;
&lt;p&gt;中央のボディセクションが動的に伸縮してコンテンツの量に応じてサイズが変わる状態&lt;/p&gt;
&lt;h2&gt;デモ&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/28b80f4eacbc97af431c644e98189628/tailwind_keep_bottom_not_enough_content01.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実際のコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex min-h-screen flex-col justify-between bg-gray-100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-10 bg-blue-200 text-gray-500&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;grow bg-green-100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Content&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;a&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;b&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;c&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;d&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;e&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;f&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;g&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;h&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;j&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;l&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;m&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;n&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-10 bg-blue-200 text-gray-500&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Footer&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;各クラスの処理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;flex-col&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flexboxの子要素を縦列に配置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;justify-between&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;子要素をコンテナの縦方向の始端と終端に配置（上下）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;min-h-screen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コンテナの最小の高さをビューポートの高さにする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;余白のあるスペースをすべて埋めるために拡大&lt;/p&gt;
&lt;p&gt;これにより、headerとfooterの間の残りのスペースを占有&lt;/p&gt;
&lt;p&gt;Contentsの内容が少なかったとしても&lt;code class=&quot;language-text&quot;&gt;grow&lt;/code&gt;を指定したItemスペースを専有する&lt;/p&gt;
&lt;h2&gt;Playground&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://play.tailwindcss.com/bbIqEGk7jD?size=820x580&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailwind Play&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ナビゲーションリンクのレスポンシブな対応]]></title><description><![CDATA[TailwindCSS…]]></description><link>https://til.swfz.io/entries/tailwind_right_and_left_aligned/</link><guid isPermaLink="false">https://til.swfz.io/entries/tailwind_right_and_left_aligned/</guid><pubDate>Thu, 09 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TailwindCSSでどうやるんだって調べたシリーズ&lt;/p&gt;
&lt;p&gt;ブログサイトで直前直後の記事へのリンクを用意するパターン&lt;/p&gt;
&lt;p&gt;画面サイズが十分に大きい場合は、リンクが一行に両端へ配置&lt;/p&gt;
&lt;p&gt;画面が狭くなるとリンクが折り返されて上下に配置される&lt;/p&gt;
&lt;p&gt;ただし、文字列の位置は左右に寄せる状態を維持&lt;/p&gt;
&lt;h2&gt;デモ&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/4dc747474e11e10df4d3e6d9143bd0e8/tailwind_right_and_left_aligned01.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実際のコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex flex-row flex-wrap justify-between bg-gray-100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bg-blue-200 text-gray-500&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;◀直前の記事へのリンク&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;grow bg-green-200 text-right text-gray-500&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;直後の記事へのリンク▶&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;各クラスの処理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;flex-row&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;子要素を水平方向に並べる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;flex-wrap&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;子要素がコンテナをオーバーフローする際に、新しい行に折り返す&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;justify-between&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;子要素をコンテナの両端に配置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要素が利用可能な追加のスペースを取る&lt;/p&gt;
&lt;p&gt;これにより、右の要素が余分なスペースを埋める&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;text-right&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要素内のテキストを右そろえ&lt;/p&gt;
&lt;h2&gt;Playground&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://play.tailwindcss.com/Fjx2LMKH5h?size=338x626&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailwind Play&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Denoでファイルの読み書き]]></title><description><![CDATA[開発中に、よく実際にAPIを叩いた結果を読ませたり書き込んだりする処理を入れたくなる時があるのでそのときのためのメモ 読み込み readFile, readFileSync, readTextFile, readTextFileSyncなどがある はdeno deploy…]]></description><link>https://til.swfz.io/entries/deno_file_read_write/</link><guid isPermaLink="false">https://til.swfz.io/entries/deno_file_read_write/</guid><pubDate>Wed, 01 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;開発中に、よく実際にAPIを叩いた結果を読ませたり書き込んだりする処理を入れたくなる時があるのでそのときのためのメモ&lt;/p&gt;
&lt;h2&gt;読み込み&lt;/h2&gt;
&lt;p&gt;readFile, readFileSync, readTextFile, readTextFileSyncなどがある&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Sync&lt;/code&gt;はdeno deployには対応していないらしいのでdeploy使う場合は&lt;code class=&quot;language-text&quot;&gt;Sync&lt;/code&gt;を使わないほうが良い&lt;/p&gt;
&lt;p&gt;便利コマンドとかの場合はSyncつかっても問題ない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;readFile&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; decoder &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;TextDecoder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Deno&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;contributions.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;decoder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;radFile, readTextFileの違い&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;readFile&lt;/code&gt;は戻り値が&lt;code class=&quot;language-text&quot;&gt;Unit8Array&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;テキストファイルを読む場合decoderを挟む必要がある&lt;/p&gt;
&lt;h3&gt;ただのテキストを読む場合&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Deno&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readTextFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;contributions.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;1行で書ける&lt;/p&gt;
&lt;p&gt;どれを使うにしても実行時に&lt;code class=&quot;language-text&quot;&gt;--allow-read&lt;/code&gt;オプションが必要&lt;/p&gt;
&lt;h2&gt;書き込み&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getContributions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Deno&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeTextFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;contributions.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;テキスト書き込むだけならこれでOK&lt;/p&gt;
&lt;p&gt;実行時に&lt;code class=&quot;language-text&quot;&gt;--allow-write&lt;/code&gt;オプションが必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/access3151fq/items/48e17d1363de39d01ad1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;【Deno1.16～】ローカルファイルの読み込み方法4種 #JavaScript - Qiita&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[react-instantsearch-hooks-webが新たに書き換えられたらしい]]></title><description><![CDATA[AlgoliaのReactクライアントを使っているプロジェクトで、開発サーバ立ち上げたら下記のようなログが… 見に行ったらマイグレーションガイドが出てた Upgrading React InstantSearch | Algolia…]]></description><link>https://til.swfz.io/entries/react_instantsearch_hooks_web_was_changed/</link><guid isPermaLink="false">https://til.swfz.io/entries/react_instantsearch_hooks_web_was_changed/</guid><pubDate>Wed, 18 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AlgoliaのReactクライアントを使っているプロジェクトで、開発サーバ立ち上げたら下記のようなログが…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[InstantSearch] The package `react-instantsearch-hooks` is replaced by `react-instantsearch-core`. The API is the same, but the package name has changed. Please update your dependencies and follow the migration guide: https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;見に行ったらマイグレーションガイドが出てた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Upgrading React InstantSearch | Algolia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;書き直したらしい…&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;react-instantsearch-hooks-web&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;react-instantsearch&lt;/code&gt;になります、とのこと&lt;/p&gt;
&lt;p&gt;codemodsがあるからということで試してみたが差し替えてくれなかった…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ npx @codeshift/cli --packages &apos;instantsearch-codemods#ris-v6-to-v7&apos; pages
Need to install the following packages:
@codeshift/cli@0.19.3
Ok to proceed? (y) y
⚠ Unable to locate Hypermod package: @hypermod/mod-instantsearch-codemods
ℹ Attempting to download npm package: instantsearch-codemods
✔ Found remote Hypermod package: instantsearch-codemods
Running transform: /home/user/.npm/_npx/f341b6febc846893/node_modules/@hypermod/cli/node_modules/instantsearch-codemods#ris-v6-to-v7
No files selected, nothing to do.
All done.
Results:
0 errors
0 unmodified
0 skipped
0 ok
Time elapsed: 0.008seconds&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;codemodsは平たく言うとマイグレーションガイドの操作やある程度規則に沿った変更を自動でやってくれるくん&lt;/p&gt;
&lt;p&gt;ASTからASTに変換する、特定の条件に合うコードはこう変換するというルールをコード定義することで単純作業を自動化する&lt;/p&gt;
&lt;p&gt;Angularは結構前からマイグレーション時にこういうことやってくれてたので多分これ使っているのかな&lt;/p&gt;
&lt;p&gt;npmから&lt;code class=&quot;language-text&quot;&gt;instantsearch-codemods&lt;/code&gt;で調べたらほかにも情報が出てきた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/instantsearch-codemods&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;instantsearch-codemods - npm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;そこにドキュメント以外のものも載ってたので試してみる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ npx @codeshift/cli --packages &apos;instantsearch-codemods#rish-to-ris&apos; pages
Need to install the following packages:
@codeshift/cli@0.19.3
Ok to proceed? (y) y
⚠ Unable to locate Hypermod package: @hypermod/mod-instantsearch-codemods
ℹ Attempting to download npm package: instantsearch-codemods
✔ Found remote Hypermod package: instantsearch-codemods
Running transform: /home/user/.npm/_npx/f341b6febc846893/node_modules/@hypermod/cli/node_modules/instantsearch-codemods#rish-to-ris
No files selected, nothing to do.
All done.
Results:
0 errors
0 unmodified
0 skipped
0 ok
Time elapsed: 0.009seconds&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでも変わらず&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Running transform&lt;/code&gt; でコードの場所が出力されるので見に行って中身読んだら、コード量は少ないしやっていることも分かるには分かる&lt;/p&gt;
&lt;p&gt;ASTさえ把握してしまえば追うことはできそう&lt;/p&gt;
&lt;p&gt;幸いペライチのプロジェクトなので一ヵ所しか変更なかったので、手動で対応して終わらせたw&lt;/p&gt;
&lt;p&gt;で開発サーバが起動した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Starting from the next major version, InstantSearch will change how widgets state is preserved when they are removed. InstantSearch will keep the state of unmounted widgets to be usable by other widgets with the same attribute.

We recommend setting `future.preserveSharedStateOnUnmount` to true to adopt this change today.
To stay with the current behaviour and remove this warning, set the option to false.

See documentation: https://www.algolia.com/doc/api-reference/widgets/instantsearch/js/#widget-param-future&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;なんかまたいわれている…&lt;/p&gt;
&lt;p&gt;挙動変更があるよって言っているっぽい&lt;/p&gt;
&lt;p&gt;majorバージョンでって言っているのでそのとき対応しよう…&lt;/p&gt;
&lt;h3&gt;対応PR&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/swfz/article-search/pull/199&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;migrate react-instantsearch-hooks-web to react-instantsearch by swfz · Pull Request #199 · swfz/article-search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[pnpmでyarn.lockからimportしてロックファイルを生成する]]></title><description><![CDATA[最近yarnをv1のまま使っていていろいろ不具合を踏むことが多くなってきたので移行先としてpnpmを使い始めている ローカルでpnpm…]]></description><link>https://til.swfz.io/entries/pnpm_import/</link><guid isPermaLink="false">https://til.swfz.io/entries/pnpm_import/</guid><pubDate>Fri, 13 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近yarnをv1のまま使っていていろいろ不具合を踏むことが多くなってきたので移行先としてpnpmを使い始めている&lt;/p&gt;
&lt;p&gt;ローカルでpnpmをとりあえず入れてみたものの、依存関係が変わり今まで通り動かなくなってしまい時間を溶かしていた&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;pnpm import&lt;/code&gt;を知ってればサクッと行く話だったのでメモ&lt;/p&gt;
&lt;h2&gt;import&lt;/h2&gt;
&lt;p&gt;特定のロックファイルからpnpm-lock.yamlを生成するコマンドが用意されている&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pnpm.io/cli/import&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pnpm import | pnpm&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;import&lt;/span&gt; yarn.lock
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; i --frozen-lockfile&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで既存のyarn.lockと内容変えずにインストールできるはず&lt;/p&gt;
&lt;h2&gt;個別にインストール&lt;/h2&gt;
&lt;p&gt;今回の個別の話&lt;/p&gt;
&lt;p&gt;次のリポジトリでpnpmを使うようにした&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/article-search&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;swfz/article-search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;yarnの場合フラットなnode_modulesになっていて明示的にpackage.jsonになかったとしても、どこかのモジュールの依存の中に存在するモジュールを呼び出すことができた&lt;/p&gt;
&lt;p&gt;pnpmにしたことによって今までのような使い方ができなくなるので使いたい場合は明示的にpackage.jsonに追加してあげる必要がある&lt;/p&gt;
&lt;p&gt;下記は依存の中のライブラリだがコード中で呼び出していたためインストールし直す必要があった（ビルド時に「ないよ！」と怒られる）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&quot;instantsearch.js&quot;: &quot;4.58.0&quot;
&quot;@testing-library/dom&quot;: &quot;9.3.3&quot; // dev&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;インストールし直すときにyarn.lockの中からバージョンを探してバージョンを固定してインストールした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; why instantsearch.js
$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; why @testing-library/dom&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; i instantsearch.js@4.58.0
$ &lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; i &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; @testing-library/dom@9.3.3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;algolia系のモジュールは結構破壊的変更が入っているイメージがある&lt;/p&gt;
&lt;p&gt;だいたいバージョン上げるとうまく動かない&lt;/p&gt;
&lt;p&gt;今回何も考えず移行したらテストが通らずいろいろ試してたが、結局この辺のバージョンがうまく噛み合っていなかったのが原因のよう&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;最初から一通りドキュメントを読んでおけばそんなに時間を溶かすことなかったのに案件&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;</content:encoded></item><item><title><![CDATA[diffから後で適用するためのPatchを作成し充てる]]></title><description><![CDATA[差分からpatchファイルを作成 適用 あまり良くないがローカルでは変更したいみたいなことがたまにあるのでメモ]]></description><link>https://til.swfz.io/entries/patch/</link><guid isPermaLink="false">https://til.swfz.io/entries/patch/</guid><pubDate>Tue, 03 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;差分からpatchファイルを作成&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; --no-prefix path/to/filename &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; diff.patch&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;適用&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ patch &lt;span class=&quot;token parameter variable&quot;&gt;-p1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; diff.patch
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
File to patch: path/to/filename&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;あまり良くないがローカルでは変更したいみたいなことがたまにあるのでメモ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[管理下のリポジトリリストからRenovateのPRを集計する]]></title><description><![CDATA[リポジトリごとのRenovatePR数を集計する リポジトリのリスト まず自身の管理化のリポジトリリストを出す 各リポジトリごとにPullRequestのリストを出す とりあえずタイトルとURL…]]></description><link>https://til.swfz.io/entries/github_search_pr_by_renovate/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_search_pr_by_renovate/</guid><pubDate>Wed, 20 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;リポジトリごとのRenovatePR数を集計する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gh repo list &lt;span class=&quot;token parameter variable&quot;&gt;--limit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--json&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;nameWithOwner&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-rc&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.[]|.nameWithOwner&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-lc&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gh pr list -R {} -S &apos;author:app/renovate&apos; --json &apos;title,url&apos;| jq &apos;.[]|.repo|=&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;{}&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;&apos;&quot;&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt; pull_requests.json
$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; pull_requests.json &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;group_by(.repo)|map({&quot;repo&quot;: .[0].repo, &quot;count&quot;: [.[]]|length}) | sort_by(.count)&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;リポジトリのリスト&lt;/h2&gt;
&lt;p&gt;まず自身の管理化のリポジトリリストを出す&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gh repo list &lt;span class=&quot;token parameter variable&quot;&gt;--limit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--json&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;nameWithOwner&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-rc&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.[]|.nameWithOwner&apos;&lt;/span&gt;
swfz/tools
swfz/memo
swfz/deno-kusa-image
swfz/article-search
swfz/chrome-extension-google-slide-usertool-comment-stream
swfz/deno-terminal-image
swfz/til
swfz/dotfiles&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;各リポジトリごとにPullRequestのリストを出す&lt;/h2&gt;
&lt;p&gt;とりあえずタイトルとURLは必要かなということで出力&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gh pr list&lt;/code&gt;の&lt;code class=&quot;language-text&quot;&gt;-S&lt;/code&gt;オプションでブラウザでの検索条件と同様のクエリを指定できる、GitHub Appのユーザーは&lt;code class=&quot;language-text&quot;&gt;app/renovate&lt;/code&gt;のように指定するみたい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests#search-by-author&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Searching issues and pull requests - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;author:app/renovate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;これは知らなかった&lt;/p&gt;
&lt;p&gt;repoの値だけ&lt;code class=&quot;language-text&quot;&gt;gh pr list&lt;/code&gt;のJSON出力するオプションがなさそうだったのでxargsで受け取った引数を無理やり入れ込んでる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pull_requests.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chore(deps): update gatsby monorepo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/swfz/til/pull/1585&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz/til&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chore(deps): update dependency @types/node to v20.7.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/swfz/deno-kusa-image/pull/15&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz/deno-kusa-image&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chore(deps): update dependency @babel/core to v7.23.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/swfz/tools/pull/658&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz/tools&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;集計する&lt;/h2&gt;
&lt;p&gt;後半はgroup by count的なことをしている&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;pull_requests.json&lt;/code&gt;の状態のJSONファイル（厳密にはJSONではないが）をjqで読み込む際は&lt;code class=&quot;language-text&quot;&gt;-s&lt;/code&gt;をつけて全体を配列として扱う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一部抜粋した結果&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; pull_requests.json &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;group_by(.repo)|map({&quot;repo&quot;: .[0].repo, &quot;count&quot;: [.[]]|length}) | sort_by(.count)&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz/gh-annotations&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz/chrome-extension-copy-markdown-and-hatenablog-embed-link&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz/tools&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz/dotfiles&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;PullRequest数の昇順&lt;/p&gt;</content:encoded></item><item><title><![CDATA[特定ディレクトリ以下のGit管理されてるディレクトリがあるかチェックする]]></title><description><![CDATA[とかそういう感じのディレクトリを作ってその下に何かしらのHelloWorldやお試しでプロジェクトを作るということをよくやっている で、その中で形になりそうなものはGitHub…]]></description><link>https://til.swfz.io/entries/check_under_git_control/</link><guid isPermaLink="false">https://til.swfz.io/entries/check_under_git_control/</guid><pubDate>Sat, 09 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;sandbox&lt;/code&gt;とかそういう感じのディレクトリを作ってその下に何かしらのHelloWorldやお試しでプロジェクトを作るということをよくやっている&lt;/p&gt;
&lt;p&gt;で、その中で形になりそうなものはGitHubに上げておく場合が多いが、途中で飽きてそのままというのもある&lt;/p&gt;
&lt;p&gt;たまには精査しておきたいと思い調べて書いた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gitcontrol.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;base_dir&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;target_directory&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.git&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;dir&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$base_dir&lt;/span&gt;&quot;&lt;/span&gt;/*/
&lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${dir}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${target_directory}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${dir}&lt;/span&gt; does not have &lt;span class=&quot;token variable&quot;&gt;${target_directory}&lt;/span&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;直下のディレクトリを対象にチェックする&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;.git&lt;/code&gt;ディレクトリがない場合は出力する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ sh gitcontrol.sh
./confluence/ does not have .git
./gas-ga4-to-pixela/ does not have .git
./react-sample/ does not have .git
./sentry/ does not have .git
./slack-notification/ does not have .git
./sql-parse/ does not have .git
./terraform-aurora-serverless-lambda/ does not have .git
./terraform-workflows-test/ does not have .git&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じ&lt;/p&gt;
&lt;p&gt;懐かしいディレクトリが出てきた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gsutilで特定バケット以下のすべてのファイルを別バケットへコピーする]]></title><description><![CDATA[はgsutilのオプションで並列実行 を入れないと同じディレクトリ構成にならない（シェルでの操作と同様） という感じでディレクトリが作成されてしまう]]></description><link>https://til.swfz.io/entries/gsutil_move_bucket/</link><guid isPermaLink="false">https://til.swfz.io/entries/gsutil_move_bucket/</guid><pubDate>Thu, 07 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;gsutil &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;gs://old-bucket/*&apos;&lt;/span&gt; gs://new-bucket&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-m&lt;/code&gt;はgsutilのオプションで並列実行&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt;を入れないと同じディレクトリ構成にならない（シェルでの操作と同様）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;new-bucket/old-bucket&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;という感じでディレクトリが作成されてしまう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DenoでRenovateを使う]]></title><description><![CDATA[下記参考にした Renovate で Deno の依存関係を自動で更新する [https://blog.s2n.tech/articles/renovate-deno:embed:cite] Renovate…]]></description><link>https://til.swfz.io/entries/deno_renovate/</link><guid isPermaLink="false">https://til.swfz.io/entries/deno_renovate/</guid><pubDate>Tue, 29 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下記参考にした&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.s2n.tech/articles/renovate-deno&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Renovate で Deno の依存関係を自動で更新する&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://blog.s2n.tech/articles/renovate-deno:embed:cite&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://blog.s2n.tech/articles/renovate-deno:embed:cite&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Renovateは正規表現を使って対象のファイル、モジュール、バージョンを特定できる機能がある&lt;/p&gt;
&lt;p&gt;それを使ってDenoのモジュールのバージョン更新を検知してRenovate経由で更新できるようにする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;renovate.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://docs.renovatebot.com/renovate-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;extends&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;config:base&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;regexManagers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;fileMatch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\\.tsx?$&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;matchStrings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;(?:im|ex)port(?:.|\\s)+?from\\s*[&apos;\&quot;](?&amp;lt;depName&gt;https://deno.land/.+?)@v?(?&amp;lt;currentValue&gt;\\d+?\\.\\d+?\\.\\d+?).*?[&apos;\&quot;]&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;datasourceTemplate&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deno&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;fileMatch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\\.tsx?$&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;matchStrings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;(?:im|ex)port(?:.|\\s)+?from\\s*[&apos;\&quot;](?&amp;lt;depName&gt;https://deno.land/x/.+?)@v?(?&amp;lt;currentValue&gt;\\d+?\\.\\d+?\\.\\d+?).*?[&apos;\&quot;]&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;datasourceTemplate&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deno&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;fileMatch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\\.tsx?$&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;matchStrings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;(?:im|ex)port(?:.|\\s)+?from\\s*[&apos;\&quot;]https://esm.sh/(?&amp;lt;depName&gt;.+?)@v?(?&amp;lt;currentValue&gt;\\d+?\\.\\d+?\\.\\d+?).*?[&apos;\&quot;]&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;datasourceTemplate&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npm&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;プロジェクト自体雑に作ってしまったため参考記事のように&lt;code class=&quot;language-text&quot;&gt;import_map&lt;/code&gt;ないし、Denoの流儀にも沿っていないところがありそう…&lt;/p&gt;
&lt;p&gt;下記のパターンがあったのでそれぞれ追加した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deno std
&lt;ul&gt;
&lt;li&gt;参考そのまま&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;deno.land/x
&lt;ul&gt;
&lt;li&gt;サードパーティモジュール、参考の正規表現の内容に&lt;code class=&quot;language-text&quot;&gt;x/&lt;/code&gt;を加えただけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;esm.sh
&lt;ul&gt;
&lt;li&gt;正規表現は参考サイトから少しだけ変更した&lt;/li&gt;
&lt;li&gt;datasourceはnpm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;結果、反映された&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/86de81d9b534c91ce002d2305965898b/4d08a/deno_renovate01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 76.35135135135135%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABbElEQVR42pVU2XaCMBT0U+qGskOCJOCGWpe2//89tzNBe7Snp8aHIVdIJjN3cTCepZIUVszqXcK0kmGQynCa/IFYRvg2nmX/YsDHHERJaaVqdqKBTLWS66VDdkWuVxJE5VNSRziLlUzCQlIQlfVGSrOVYoG1xurQv+M+L8J5oiWGbRKmqpG0bNzhIFJOVcAL57mfZW7k4SkUarMTuz6LWZ+Q0xPi67q5OLUv5TDKFhICtzz9Bvfxci9CKqRtsz7Kcv8lbXeRdgt0n8CHNIiJBKkYoeJPLd9ypGwHe2dnkStJuJJU49szdQ9FibJa4ty4XhwHd5uusU/+HixTZdXspYE6FsWujn1RWCQXn3Fx5d82N7BVaP8HYY4OYFy8oBBEtLpoD1JDDaelsjunWBOICabkpUlh6/AQ8xnlhOkbHtVlhXmxp+XKHWQlFUYscQS2J4m1vE0i9wfhPSlUxx8cPWU6Z5mTUSL2sXlP+A3Q88nB2AKNGgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/86de81d9b534c91ce002d2305965898b/cbe2e/deno_renovate01.webp 148w,
/static/86de81d9b534c91ce002d2305965898b/3084c/deno_renovate01.webp 295w,
/static/86de81d9b534c91ce002d2305965898b/5ca24/deno_renovate01.webp 590w,
/static/86de81d9b534c91ce002d2305965898b/99968/deno_renovate01.webp 709w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/86de81d9b534c91ce002d2305965898b/12f09/deno_renovate01.png 148w,
/static/86de81d9b534c91ce002d2305965898b/e4a3f/deno_renovate01.png 295w,
/static/86de81d9b534c91ce002d2305965898b/fcda8/deno_renovate01.png 590w,
/static/86de81d9b534c91ce002d2305965898b/4d08a/deno_renovate01.png 709w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/86de81d9b534c91ce002d2305965898b/fcda8/deno_renovate01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gitでステージされていないファイルを削除する]]></title><description><![CDATA[知らなかったー、都度調べて使ってた気もするけどぱっと出てこなかった ファイル ファイルとディレクトリ dry run…]]></description><link>https://til.swfz.io/entries/git_clean/</link><guid isPermaLink="false">https://til.swfz.io/entries/git_clean/</guid><pubDate>Wed, 23 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;知らなかったー、都度調べて使ってた気もするけどぱっと出てこなかった&lt;/p&gt;
&lt;h2&gt;ファイル&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clean -f&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ファイルとディレクトリ&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clean -fd&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;dry run&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clean -n&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;試してみる&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git status
## master...origin/master
?? .hoge/
?? fuga.txt
?? hoge.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clean -n
Would remove fuga.txt
Would remove hoge.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;削除される対象がリストアップされる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clean -nd
Would remove .hoge/
Would remove fuga.txt
Would remove hoge.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ディレクトリもリストアップ対象に含まれる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clean -d
fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-d&lt;/code&gt;以外のオプションと組み合わせてね、具体的には&lt;code class=&quot;language-text&quot;&gt;-i&lt;/code&gt;:(対話的に削除), &lt;code class=&quot;language-text&quot;&gt;-n&lt;/code&gt;:(Dry Run), &lt;code class=&quot;language-text&quot;&gt;-f&lt;/code&gt;:(ファイル)と組み合わせてね&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clean -df
Removing .hoge/
Removing fuga.txt
Removing hoge.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ディレクトリも削除される&lt;/p&gt;
&lt;h2&gt;対話的に削除する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clean -id
Would remove the following items:
  .hoge/    fuga.txt  hoge.txt
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each             5: quit                 6: help
What now&gt; c
Removing .hoge/
Removing fuga.txt
Removing hoge.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-i&lt;/code&gt;オプションで対話的にどのファイルを削除するか選択する&lt;/p&gt;
&lt;p&gt;実際の画面だと、&lt;code class=&quot;language-text&quot;&gt;clean&lt;/code&gt;の&lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;部分に色がついていて文言の頭文字を入力してねと言うようなUIになっている&lt;/p&gt;
&lt;p&gt;いろいろ選択肢がある&lt;/p&gt;
&lt;h3&gt;正規表現でフィルタ&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clean &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt;
Would remove the following items:
  fuga.txt  hoge.txt
*** Commands ***
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;: clean                &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;: filter by pattern    &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;: &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; by numbers    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;: ask each             &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;: quit                 &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;: &lt;span class=&quot;token builtin class-name&quot;&gt;help&lt;/span&gt;
What now&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; f
  fuga.txt  hoge.txt
Input ignore patterns&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; hoge.*
  fuga.txt
Input ignore patterns&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;
Would remove the following item:
  fuga.txt
*** Commands ***
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;: clean                &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;: filter by pattern    &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;: &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; by numbers    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;: ask each             &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;: quit                 &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;: &lt;span class=&quot;token builtin class-name&quot;&gt;help&lt;/span&gt;
What now&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c
Removing fuga.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;f&lt;/code&gt;入力&lt;/li&gt;
&lt;li&gt;削除するファイルのパターン入力&lt;/li&gt;
&lt;li&gt;対象の決定（エンター）&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;で削除&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;番号指定&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clean &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt;
Would remove the following items:
  fuga.txt  hoge.txt
*** Commands ***
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;: clean                &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;: filter by pattern    &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;: &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; by numbers    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;: ask each             &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;: quit                 &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;: &lt;span class=&quot;token builtin class-name&quot;&gt;help&lt;/span&gt;
What now&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; s
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;: fuga.txt    &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;: hoge.txt
Select items to delete&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;: fuga.txt  * &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;: hoge.txt
Select items to delete&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;
Would remove the following item:
  hoge.txt
*** Commands ***
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;: clean                &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;: filter by pattern    &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;: &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; by numbers    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;: ask each             &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;: quit                 &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;: &lt;span class=&quot;token builtin class-name&quot;&gt;help&lt;/span&gt;
What now&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; c
Removing hoge.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;s&lt;/code&gt;入力&lt;/li&gt;
&lt;li&gt;削除するファイルに振られた番号を入力&lt;/li&gt;
&lt;li&gt;対象の決定（エンター）&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;で削除&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[URLSearchParamsで配列を扱いたい]]></title><description><![CDATA[URLのパラメータでみたいな文字列を作りたい URLSearchParamsのドキュメント URLSearchParams - Web API | MDN…]]></description><link>https://til.swfz.io/entries/javascript_urlsearchparams/</link><guid isPermaLink="false">https://til.swfz.io/entries/javascript_urlsearchparams/</guid><pubDate>Fri, 04 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;URLのパラメータで&lt;code class=&quot;language-text&quot;&gt;id=1&amp;amp;id=2&lt;/code&gt;みたいな文字列を作りたい&lt;/p&gt;
&lt;h2&gt;URLSearchParamsのドキュメント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;URLSearchParams - Web API | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;重複する検索パラメータ&lt;/code&gt;の項で同じキーの値が複数ある場合、クエリ文字列からパースして値を取得する方法は載っていたがクエリ文字列を生成する方法は載っていなかった&lt;/p&gt;
&lt;p&gt;普通に配列渡したらよしなにやってくれるかと思ったらそうはいかなかった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; ids &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; search &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ids&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
URLSearchParams &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ids&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;1,2,3&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; search&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;ids=1%2C2%2C3&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;カンマ区切りにされてしまうのね&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/38797509/passing-array-into-urlsearchparams-while-consuming-http-call-for-get-request&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;javascript - Passing array into URLSearchParams while consuming http call for get request - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; ids &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; search &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ids&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
URLSearchParams &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;3&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; search&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;id=1&amp;amp;id=2&amp;amp;id=3&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで良いらしい&lt;/p&gt;
&lt;p&gt;他のパラメータも含める場合&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; ids &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; search &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ids&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
URLSearchParams &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;3&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; search&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;id=1&amp;amp;id=2&amp;amp;id=3&amp;amp;a=a&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;勉強になりました&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JavaScriptで辞書不要の分かち書きを行う]]></title><description><![CDATA[分かち書きをしたくて少し調べてみたら辞書を使わず機械学習で検出するライブラリがあるということで使ってみた 辞書が不要なので未知の語句に対しても精度保てそうって感じらしい leungwensen/tiny-segmenter: Mirror of TinySegmenter…]]></description><link>https://til.swfz.io/entries/tiny_segmenter/</link><guid isPermaLink="false">https://til.swfz.io/entries/tiny_segmenter/</guid><pubDate>Thu, 27 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;分かち書きをしたくて少し調べてみたら辞書を使わず機械学習で検出するライブラリがあるということで使ってみた&lt;/p&gt;
&lt;p&gt;辞書が不要なので未知の語句に対しても精度保てそうって感じらしい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/leungwensen/tiny-segmenter&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;leungwensen/tiny-segmenter: Mirror of TinySegmenter, the super compact Japanese tokenizer in JavaScript.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;README通りに書けばOKだったのですぐ動いた&lt;/p&gt;
&lt;p&gt;npmに上がってるのでdenoから使う場合は&lt;code class=&quot;language-text&quot;&gt;esm.sh&lt;/code&gt;でimportして使用した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tiny_segmenter_sample.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; TinySegmenter &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://esm.sh/tiny-segmenter@0.2.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Slack APIで特定チャンネルの会話履歴を取得する&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segmenter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;TinySegmenter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; segmenter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;直近の記事タイトルを拝借してきた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;deno run tiny_segmenter_sample.ts
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;Slack&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;API&quot;&lt;/span&gt;,   &lt;span class=&quot;token string&quot;&gt;&quot;で&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;特定&quot;&lt;/span&gt;,  &lt;span class=&quot;token string&quot;&gt;&quot;チャンネル&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;の&quot;&lt;/span&gt;,    &lt;span class=&quot;token string&quot;&gt;&quot;会話&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;履歴&quot;&lt;/span&gt;,  &lt;span class=&quot;token string&quot;&gt;&quot;を&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;取得&quot;&lt;/span&gt;,  &lt;span class=&quot;token string&quot;&gt;&quot;する&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;少なくともここで区切ってしまう?みたいなのが多くなければOKなので大丈夫そう&lt;/p&gt;
&lt;p&gt;ライブラリ読み込みするだけで使えるので気軽に使えて良い&lt;/p&gt;
&lt;p&gt;ただ、メンテナンスはされてなさそうなので若干の不安が残るが個人使用なら…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Slack APIで特定チャンネルの会話履歴を取得する]]></title><description><![CDATA[やったのでメモ ただただ投稿された内容をAPIで取得するだけ トークンの取得 Slack | Bolt for JavaScript Boltを使うわけじゃないが、Botトークンとユーザートークンの違いなど、あとはチュートリアルも含め日本語で解説があるので参考になる Bot…]]></description><link>https://til.swfz.io/entries/slack_get_posts/</link><guid isPermaLink="false">https://til.swfz.io/entries/slack_get_posts/</guid><pubDate>Wed, 12 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;やったのでメモ&lt;/p&gt;
&lt;p&gt;ただただ投稿された内容をAPIで取得するだけ&lt;/p&gt;
&lt;h2&gt;トークンの取得&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://slack.dev/bolt-js/ja-jp/tutorial/getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Slack | Bolt for JavaScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Boltを使うわけじゃないが、Botトークンとユーザートークンの違いなど、あとはチュートリアルも含め日本語で解説があるので参考になる&lt;/p&gt;
&lt;p&gt;Botアクセストークンを使うのが通常っぽい&lt;/p&gt;
&lt;h2&gt;必要権限&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;channels.read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;channels.history&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;groups:history&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の権限を入れた&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Features &gt; OAuth &amp;amp; Permissions&lt;/code&gt;の画面で権限を追加する&lt;/p&gt;
&lt;h2&gt;テスター&lt;/h2&gt;
&lt;p&gt;ドキュメントとサンプルコードとテスターがついているページ、これよい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://api.slack.com/methods/conversations.history&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://api.slack.com/methods/conversations.history&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;tokenは&lt;code class=&quot;language-text&quot;&gt;xoxb-xxxxxx&lt;/code&gt;ってやつをつかう、Botトークン&lt;/p&gt;
&lt;p&gt;ChannelIDとトークンを入れて実行し、レスポンスが返ってくれば疎通はOK&lt;/p&gt;
&lt;p&gt;Botユーザーを対象チャンネルに招待しないと見えないので招待はしておく&lt;/p&gt;
&lt;p&gt;招待していない状態で叩いても404になる&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;@bot名&lt;/code&gt;でメンションつけて「いないけど招待する？」って聞かれるので招待した&lt;/p&gt;
&lt;h2&gt;サンプルコード&lt;/h2&gt;
&lt;p&gt;サンプルコードを使って実際にCLIから取得してみる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yarn add @slack/web-api&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;サンプルコードだけだと動かせなかったのでいくつか修正して次のような感じで実行できるようにした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;get-posts.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Require the Node Slack SDK package (github.com/slackapi/node-slack-sdk)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; WebClient&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; LogLevel &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@slack/web-api&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dayjs &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;dayjs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SLACK_BOT_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; channelId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SLACK_CHANNEL_ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; targetDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dayjs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;YYYY-MM-DD&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WebClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// LogLevel can be imported and used to make debugging simpler&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// logLevel: LogLevel.DEBUG&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;transformer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ts&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; time &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dayjs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;HH:mm&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;time&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;text&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversations&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;history&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; channelId
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; conversationHistory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; groupByDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; conversationHistory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; message&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; date &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dayjs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;YYYY-MM-DD&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    acc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; acc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; groupByDate&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;targetDate&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;transformer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;特定日付のポストを表示できるようにした、用途的にこれで十分だったのでスレッドとかは考慮してない&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;node get-posts.js 2023-07-17
[
  &apos;05:37 寝てしまった、、、&apos;,
  &apos;09:07 クーラーつけてお布団かぶって寝るの最高&apos;,
  &apos;16:46 水遊び&apos;
]&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;dayjsでunixtimeを変換する&lt;/h3&gt;
&lt;p&gt;レスポンスに入っている&lt;code class=&quot;language-text&quot;&gt;ts&lt;/code&gt;はUNIXタイムスタンプ&lt;/p&gt;
&lt;p&gt;dayjsで読み込む&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;1688893846.297589&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; time &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dayjs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; timeStr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;YYYY-MM-DD HH:mm:ss&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;2023-07-09 18:10:46&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;他参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/sampo-cure/items/6b57d8503e37a0d2d1f6&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Slack APIでチャンネルのメッセージを取り出してみる - Qiita&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SpreadsheetのQueryで日付セルの値をWHEREに含める]]></title><description><![CDATA[いつも忘れるのでメモ QUERY…]]></description><link>https://til.swfz.io/entries/spreadsheet_query_with_dynamic_cell/</link><guid isPermaLink="false">https://til.swfz.io/entries/spreadsheet_query_with_dynamic_cell/</guid><pubDate>Fri, 02 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;いつも忘れるのでメモ&lt;/p&gt;
&lt;p&gt;QUERYでシート内のセルの値を使うときのパターンいくつか&lt;/p&gt;
&lt;h2&gt;普通の文字列が対象&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;=QUERY(A1:C5,&quot;SELECT B WHERE A = &apos;&quot;&amp;amp;E2&amp;amp;&quot;&apos;&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2af46ab333f986e3a04bd11395aa2972/d6a46/spreadsheet_query_with_dynamic_cell02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.2972972972973%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAp0lEQVR42k2PSw7DIAxEc/8zllW6C0kVwMR8pzYtaS1ZjKzhjb0QEbZtg76lFhzHCzFGlJJhrYVzDvG6kHOWWRk9dRV/IIYLjMgyLxWLfg4+QKu1Noxa+25xniee6wpjDJgZvffhSSmj1Sa6I1KQAB6vshYS4b0XMySx/oD2A1wF+HgYkJgVqB6Fak+tpYwB1OSU0r3hNKTE47Tre4EGzQ21by3Q//kbwLU4ASj7u7AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2af46ab333f986e3a04bd11395aa2972/cbe2e/spreadsheet_query_with_dynamic_cell02.webp 148w,
/static/2af46ab333f986e3a04bd11395aa2972/3084c/spreadsheet_query_with_dynamic_cell02.webp 295w,
/static/2af46ab333f986e3a04bd11395aa2972/5ca24/spreadsheet_query_with_dynamic_cell02.webp 590w,
/static/2af46ab333f986e3a04bd11395aa2972/dad35/spreadsheet_query_with_dynamic_cell02.webp 885w,
/static/2af46ab333f986e3a04bd11395aa2972/6e1e4/spreadsheet_query_with_dynamic_cell02.webp 1008w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2af46ab333f986e3a04bd11395aa2972/12f09/spreadsheet_query_with_dynamic_cell02.png 148w,
/static/2af46ab333f986e3a04bd11395aa2972/e4a3f/spreadsheet_query_with_dynamic_cell02.png 295w,
/static/2af46ab333f986e3a04bd11395aa2972/fcda8/spreadsheet_query_with_dynamic_cell02.png 590w,
/static/2af46ab333f986e3a04bd11395aa2972/efc66/spreadsheet_query_with_dynamic_cell02.png 885w,
/static/2af46ab333f986e3a04bd11395aa2972/d6a46/spreadsheet_query_with_dynamic_cell02.png 1008w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2af46ab333f986e3a04bd11395aa2972/fcda8/spreadsheet_query_with_dynamic_cell02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a480b87a0c2dd3dac175cf33d9072203/8c381/spreadsheet_query_with_dynamic_cell01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 24.324324324324326%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA50lEQVR42k2QbW/DIAyE8/9/4L6tW9usS7OsIRBeAoZnkK5SkE4++fBZ5y7GjXU1LPOD5C3WaVarcX7Fe49dLTlnSikkKWiXWawguey9J/I/Cl0Mjq0ZmYUUw27s6oLNG0QSkqRqjuAC98nydlKces11NPQ/esfw67gOhsfi6QqQUiJXd60NSi18ni+MwxclS9WkLvCkkJjrwDAZvoeJflTcZ8vtoZlUqH2HWrdqmDZkcyARPU9oNXH5eOd+O9eossd9RW61vRDqghh33qLCM3LTuzbUouWcePEmirQ7PT81fqxHHLWGP4DJhM/xLGJjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/a480b87a0c2dd3dac175cf33d9072203/cbe2e/spreadsheet_query_with_dynamic_cell01.webp 148w,
/static/a480b87a0c2dd3dac175cf33d9072203/3084c/spreadsheet_query_with_dynamic_cell01.webp 295w,
/static/a480b87a0c2dd3dac175cf33d9072203/5ca24/spreadsheet_query_with_dynamic_cell01.webp 590w,
/static/a480b87a0c2dd3dac175cf33d9072203/dad35/spreadsheet_query_with_dynamic_cell01.webp 885w,
/static/a480b87a0c2dd3dac175cf33d9072203/2baf0/spreadsheet_query_with_dynamic_cell01.webp 1180w,
/static/a480b87a0c2dd3dac175cf33d9072203/6094c/spreadsheet_query_with_dynamic_cell01.webp 1267w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/a480b87a0c2dd3dac175cf33d9072203/12f09/spreadsheet_query_with_dynamic_cell01.png 148w,
/static/a480b87a0c2dd3dac175cf33d9072203/e4a3f/spreadsheet_query_with_dynamic_cell01.png 295w,
/static/a480b87a0c2dd3dac175cf33d9072203/fcda8/spreadsheet_query_with_dynamic_cell01.png 590w,
/static/a480b87a0c2dd3dac175cf33d9072203/efc66/spreadsheet_query_with_dynamic_cell01.png 885w,
/static/a480b87a0c2dd3dac175cf33d9072203/c83ae/spreadsheet_query_with_dynamic_cell01.png 1180w,
/static/a480b87a0c2dd3dac175cf33d9072203/8c381/spreadsheet_query_with_dynamic_cell01.png 1267w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/a480b87a0c2dd3dac175cf33d9072203/fcda8/spreadsheet_query_with_dynamic_cell01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;固定(&lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt;)も使える&lt;/p&gt;
&lt;h2&gt;数値が対象&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;=QUERY(A1:C5,&quot;SELECT A WHERE B &gt; &quot;&amp;amp;E2&amp;amp;&quot; AND B &amp;lt; &quot;&amp;amp;E3)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/5bd27/spreadsheet_query_with_dynamic_cell05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.567567567567565%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAyElEQVR42kWPiW7DIBBE/f9fWKlpo0Rx2mJjTnPE4FdwUpXV7Oyl3WGIYUWIH7xR5OjxweFWQ0wR5zwhdkTytrGmncUVQuN9rzR38IFuLR/qlrF6IcWV4C1Kzjj7XN4HcsqkkPE28HaWvF8Ul2/NOBmuYuE+W+7CMc6G2+QYdqCUSqkVpRRSLnycTnin6W8NCeMzX5PmfJMok5h1QOiIUIFJJyaVXnnqChPlEQ9YJTEN4/WzqTU8jxVqU9oPlrK1yuu7R/c//uNfWGQ1Pdcq+9sAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/cbe2e/spreadsheet_query_with_dynamic_cell05.webp 148w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/3084c/spreadsheet_query_with_dynamic_cell05.webp 295w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/5ca24/spreadsheet_query_with_dynamic_cell05.webp 590w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/dad35/spreadsheet_query_with_dynamic_cell05.webp 885w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/2baf0/spreadsheet_query_with_dynamic_cell05.webp 1180w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/275cb/spreadsheet_query_with_dynamic_cell05.webp 1432w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/12f09/spreadsheet_query_with_dynamic_cell05.png 148w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/e4a3f/spreadsheet_query_with_dynamic_cell05.png 295w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/fcda8/spreadsheet_query_with_dynamic_cell05.png 590w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/efc66/spreadsheet_query_with_dynamic_cell05.png 885w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/c83ae/spreadsheet_query_with_dynamic_cell05.png 1180w,
/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/5bd27/spreadsheet_query_with_dynamic_cell05.png 1432w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0062cbe58f9d05d9d7ea89bbd7a92f0c/fcda8/spreadsheet_query_with_dynamic_cell05.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;条件が最後に来る場合は&lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt;でセル指定するだけで良い&lt;/p&gt;
&lt;p&gt;これを見るとセル指定の後の&lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;&quot;&lt;/code&gt;をエスケープするための記述っていうことが分かる&lt;/p&gt;
&lt;h2&gt;日付が対象&lt;/h2&gt;
&lt;h3&gt;単純な固定値として日付をQUERYする&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;=QUERY(A1:C5,&quot;SELECT B WHERE C = date &apos;2023-05-01&apos;&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/849b06cf48bc283e3f788a070280135d/52ab5/spreadsheet_query_with_dynamic_cell03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.945945945945947%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAyElEQVR42jVP2W7DMAzL/3/gXtoFe2jXoW2cw4fk2DLHOChgQpAI8xhSjMhZISJYlxm7RsTkkTScdxVECdj3DMmG11rhpQGt8RFmnATOfbg93gh+RT0+pIhEzG6Cez+hFDJrqKVSwHB/Bnx9vzDeZlx/D0z4+dswPhZc7q7zw7atKBQzq93Bc3fThPF6QdgW+gKlFPKGvBc2UTg3M+3OFrlP0QMZSn7QlJhOYEU7skQm9fCLQ2Zdo0mttQtar9e6OT51P5Xbyf0D5fY2fSJHvekAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/849b06cf48bc283e3f788a070280135d/cbe2e/spreadsheet_query_with_dynamic_cell03.webp 148w,
/static/849b06cf48bc283e3f788a070280135d/3084c/spreadsheet_query_with_dynamic_cell03.webp 295w,
/static/849b06cf48bc283e3f788a070280135d/5ca24/spreadsheet_query_with_dynamic_cell03.webp 590w,
/static/849b06cf48bc283e3f788a070280135d/dad35/spreadsheet_query_with_dynamic_cell03.webp 885w,
/static/849b06cf48bc283e3f788a070280135d/2baf0/spreadsheet_query_with_dynamic_cell03.webp 1180w,
/static/849b06cf48bc283e3f788a070280135d/9427e/spreadsheet_query_with_dynamic_cell03.webp 1420w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/849b06cf48bc283e3f788a070280135d/12f09/spreadsheet_query_with_dynamic_cell03.png 148w,
/static/849b06cf48bc283e3f788a070280135d/e4a3f/spreadsheet_query_with_dynamic_cell03.png 295w,
/static/849b06cf48bc283e3f788a070280135d/fcda8/spreadsheet_query_with_dynamic_cell03.png 590w,
/static/849b06cf48bc283e3f788a070280135d/efc66/spreadsheet_query_with_dynamic_cell03.png 885w,
/static/849b06cf48bc283e3f788a070280135d/c83ae/spreadsheet_query_with_dynamic_cell03.png 1180w,
/static/849b06cf48bc283e3f788a070280135d/52ab5/spreadsheet_query_with_dynamic_cell03.png 1420w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/849b06cf48bc283e3f788a070280135d/fcda8/spreadsheet_query_with_dynamic_cell03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;日付のセルを指定してQUERYで使う&lt;/h3&gt;
&lt;p&gt;一度テキストで特定フォーマットにしてからQUERY内の&lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt;で日付ですよと教えてあげる必要がある&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;=QUERY(A1:C5,&quot;SELECT B WHERE C = date &apos;&quot;&amp;amp; TEXT(E2, &quot;yyyy-mm-dd&quot;)&amp;amp;&quot;&apos;&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/94fb24199f3a974c5cae9d83383db044/098c1/spreadsheet_query_with_dynamic_cell04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 18.243243243243242%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAwklEQVR42mWO4W7DMAiE8/5vOK3S1nZStzVd7NjGBkyuxKv6p5Y+ncBwx9RaRSXCsvyBa0YuKwol1EYgJ6eMVglzyDh+J6ylo3eDqkG0D/SJYYpx8QFx0zIWgxuH29XNCfsrycPmBR9fEYdzwOfF+dmJOF//Q06XjNNvwtF7E/sV1ju2zZDWiNs84/D+hryGYSgiA2bxwIoYo1+lYGG/aFf1/11l9CflCtOGLg3KBG4FlH3Ja7PtEeZqhs0Z+lLbc+4OdPI2SGAyL+cAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/94fb24199f3a974c5cae9d83383db044/cbe2e/spreadsheet_query_with_dynamic_cell04.webp 148w,
/static/94fb24199f3a974c5cae9d83383db044/3084c/spreadsheet_query_with_dynamic_cell04.webp 295w,
/static/94fb24199f3a974c5cae9d83383db044/5ca24/spreadsheet_query_with_dynamic_cell04.webp 590w,
/static/94fb24199f3a974c5cae9d83383db044/dad35/spreadsheet_query_with_dynamic_cell04.webp 885w,
/static/94fb24199f3a974c5cae9d83383db044/2baf0/spreadsheet_query_with_dynamic_cell04.webp 1180w,
/static/94fb24199f3a974c5cae9d83383db044/6f21e/spreadsheet_query_with_dynamic_cell04.webp 1578w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/94fb24199f3a974c5cae9d83383db044/12f09/spreadsheet_query_with_dynamic_cell04.png 148w,
/static/94fb24199f3a974c5cae9d83383db044/e4a3f/spreadsheet_query_with_dynamic_cell04.png 295w,
/static/94fb24199f3a974c5cae9d83383db044/fcda8/spreadsheet_query_with_dynamic_cell04.png 590w,
/static/94fb24199f3a974c5cae9d83383db044/efc66/spreadsheet_query_with_dynamic_cell04.png 885w,
/static/94fb24199f3a974c5cae9d83383db044/c83ae/spreadsheet_query_with_dynamic_cell04.png 1180w,
/static/94fb24199f3a974c5cae9d83383db044/098c1/spreadsheet_query_with_dynamic_cell04.png 1578w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/94fb24199f3a974c5cae9d83383db044/fcda8/spreadsheet_query_with_dynamic_cell04.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;どうしてもクオートとかガンガン出てくるので覚えられない&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gatsby-plugin-algoliaのメジャーバージョンアップに伴う色々]]></title><description><![CDATA[本ブログで使っているplugin、普通にバージョンを上げただけだとビルドが通らなかったので調べていろいろ対応した 対象 主な変更点 chore(release): 1.0.0 · algolia/gatsby-plugin-algolia@c04512c BREAKING…]]></description><link>https://til.swfz.io/entries/gatsby-plugin-algolia-v1/</link><guid isPermaLink="false">https://til.swfz.io/entries/gatsby-plugin-algolia-v1/</guid><pubDate>Fri, 12 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本ブログで使っているplugin、普通にバージョンを上げただけだとビルドが通らなかったので調べていろいろ対応した&lt;/p&gt;
&lt;h2&gt;対象&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-algolia 0.26.0 -&gt; 1.0.3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;主な変更点&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/algolia/gatsby-plugin-algolia/commit/c04512cd67cb6a8effd5c1fa80609db1f8dfb22b&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;chore(release): 1.0.0 · algolia/gatsby-plugin-algolia@c04512c&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;BREAKING CHANGESで書いてあった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;* indexing:**enablePartialUpdatesをtrueにし、オプションを削除しました。  
* **indexing:** matchFields については contentDigest にのみ依存し、オプションを削除しました。  
* インデックス作成：** skipIndexingフラグを削除し、dryRunまたはcontinueOnFailureのいずれかを使用します。&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;毎度ビルド時に実行したとしてもプラグイン側でしっかり差分だけ見つけてIndexingしますよっていう感じみたい&lt;/p&gt;
&lt;p&gt;CD側で気を利かせてこの場合はAlgoliaのデータ更新で、みたいなことをしなくてもよくなるのかな&lt;/p&gt;
&lt;p&gt;今まではデプロイ時、Algoliaに毎度更新掛けるとAPIオペレーション数が結構消費するということで&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;ブランチかつ記事コンテンツに変更があるときのみpluginが動くようにし、それ以外のときは&lt;code class=&quot;language-text&quot;&gt;skipIndexing&lt;/code&gt;で処理させないようにしていた&lt;/p&gt;
&lt;p&gt;毎度全件更新掛けるような設定にしていたのでpartialUpdatesによってAPIオペレーション数も節約できるはず&lt;/p&gt;
&lt;p&gt;良さそう!&lt;/p&gt;
&lt;h2&gt;APIへのアクセス&lt;/h2&gt;
&lt;p&gt;しかし問題が1つあった&lt;/p&gt;
&lt;p&gt;メジャーバージョンアップに伴い&lt;code class=&quot;language-text&quot;&gt;skipIndexing&lt;/code&gt;オプションがなくなり&lt;code class=&quot;language-text&quot;&gt;dryRun&lt;/code&gt;だと次のような処理でAPIへのアクセスが発生してしまうようになった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既存のIndexがあるかのチェック&lt;/li&gt;
&lt;li&gt;既存のドキュメントと差分が発生しているかチェック
&lt;ul&gt;
&lt;li&gt;contentDigestをチェックしている&lt;/li&gt;
&lt;li&gt;記事の中身に変更があった場合はこのcontentDigestが変化し、差分が発生したと判断するよう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なので記事の更新がないパターンで&lt;code class=&quot;language-text&quot;&gt;dryRun&lt;/code&gt;を使ったとしてもAPIアクセスが必要になってしまった&lt;/p&gt;
&lt;p&gt;執筆時の自分の状況だと記事に変更がない場合でも下記のオペレーションが消費された&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;index operation: 3&lt;/li&gt;
&lt;li&gt;search operation: 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;記事に変更があると上記プラスアルファで変更分の&lt;code class=&quot;language-text&quot;&gt;record operation&lt;/code&gt;が発生する&lt;/p&gt;
&lt;p&gt;自分の環境だとGitHub ActionsでCIを回していてそのときはAlgoliaへの登録処理はする必要がないのでそもそもAlgoliaのAdmin APIキーのSecretを登録していない&lt;/p&gt;
&lt;p&gt;デプロイはCloudflare Pagesで行っているのでAlgoliaのAdmin APIキーをCloudflareには登録している&lt;/p&gt;
&lt;p&gt;バージョンアップでCIでもAPIアクセスが発生するためエラーとなってしまう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;continueOnFailure&lt;/code&gt;で良いのでは？&lt;/p&gt;
&lt;p&gt;とも考えたが常に失敗を無視すると、本来気付くべきエラーが発生した際に気付けない可能性がある&lt;/p&gt;
&lt;p&gt;それは嫌だなということで採用しなかった&lt;/p&gt;
&lt;p&gt;だからといってAPIキーを登録するのもPRのたびにAPIたたかれたらオペレーション数をそれなりに消費するし、そのためだけにGitHubにシークレット登録したくないということでどうしようと悩んだ&lt;/p&gt;
&lt;p&gt;悩んだ結果、だいたいプラグイン中でやっていることはわかったので&lt;code class=&quot;language-text&quot;&gt;patch-package&lt;/code&gt;でパッチを当てて&lt;code class=&quot;language-text&quot;&gt;skipIndex&lt;/code&gt;の処理をいれてしまうことにした&lt;/p&gt;
&lt;h2&gt;gatsby-pluginの作法&lt;/h2&gt;
&lt;p&gt;コード読んだ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt;のライフサイクルフックを書けばOKのよう&lt;/p&gt;
&lt;p&gt;algoliaのpluginは&lt;code class=&quot;language-text&quot;&gt;onPostBuild&lt;/code&gt;でいろいろ処理をやっている&lt;/p&gt;
&lt;p&gt;で、&lt;code class=&quot;language-text&quot;&gt;gatsby-config&lt;/code&gt;の内容を各pluginのライフサイクルの引数&lt;code class=&quot;language-text&quot;&gt;config&lt;/code&gt;で読めるみたい&lt;/p&gt;
&lt;p&gt;どうしてそうなっているかまでは追えてない（gatsbyのソース読まないといけなそうなので読んでない）&lt;/p&gt;
&lt;p&gt;ということで0.26であった&lt;code class=&quot;language-text&quot;&gt;skipIndexing&lt;/code&gt;オプションを復活させた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;対象のPullRequest&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/til/pull/1425&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Renovate/patched gatsby plugin algolia 1.x by swfz · Pull Request #1425 · swfz/til&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;最後に&lt;/h2&gt;
&lt;p&gt;記事書きながら思ったこととしては結局CI/CD側でも記事に更新や新規があるかはチェックするのでその値を&lt;code class=&quot;language-text&quot;&gt;dryRun&lt;/code&gt;+&lt;code class=&quot;language-text&quot;&gt;ontinueOnFailure&lt;/code&gt;両方に設定すればよいかも? と思った&lt;/p&gt;
&lt;p&gt;次のバージョンアップの機会に検討する&lt;/p&gt;</content:encoded></item><item><title><![CDATA[go-ghでCurrentRepositoryが返す値を差し替える]]></title><description><![CDATA[書いたときのバージョン v2のリリースもされているがまだ移行していない… 自分で作ったGitHubCLI…]]></description><link>https://til.swfz.io/entries/go_gh_current_repository/</link><guid isPermaLink="false">https://til.swfz.io/entries/go_gh_current_repository/</guid><pubDate>Sun, 07 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;書いたときのバージョン&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;go-gh: v1.2.1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;v2のリリースもされているがまだ移行していない…&lt;/p&gt;
&lt;p&gt;自分で作ったGitHubCLI拡張の中で&lt;code class=&quot;language-text&quot;&gt;go-gh&lt;/code&gt;というライブラリの&lt;code class=&quot;language-text&quot;&gt;CurrentRepository()&lt;/code&gt;を使っている&lt;/p&gt;
&lt;p&gt;この関数は今いるディレクトリのリポジトリの情報を取得するもの&lt;/p&gt;
&lt;p&gt;拡張の機能上必要だったので使っているが、環境によって値が変わるのでテストを書き始めるとこの辺をうまくしないと環境依存でテストが失敗してしまう&lt;/p&gt;
&lt;p&gt;どうしようかと調べたらすぐ出てきた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pkg.go.dev/github.com/cli/go-gh#section-readme&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gh package - github.com/cli/go-gh - Go Packages&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;CurrentRepository()は、環境変数GH_REPOの値を尊重し、フォールバックとしてgitリモート設定から読み込む。&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;いつもはフォールバックとしてのGitリモート設定から読んでいたわけだ&lt;/p&gt;
&lt;p&gt;環境変数で&lt;code class=&quot;language-text&quot;&gt;GH_REPO&lt;/code&gt;を指定すれば指定した値に差し替えられる&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;swfz/gh-annotations&lt;/code&gt;のディレクトリで適当なファイルを作って試してみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repo.go&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-go line-numbers&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;github.com/cli/go-gh&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	repo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; gh&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;CurrentRepository&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%#v\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; repo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;GH_REPOなし&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ go run repo.go
repository.repo&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;host:&lt;span class=&quot;token string&quot;&gt;&quot;github.com&quot;&lt;/span&gt;, owner:&lt;span class=&quot;token string&quot;&gt;&quot;swfz&quot;&lt;/span&gt;, name:&lt;span class=&quot;token string&quot;&gt;&quot;gh-annotations&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;GH_REPOあり&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token assign-left variable&quot;&gt;GH_REPO&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;cli/cli go run repo.go
repository.repo&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;host:&lt;span class=&quot;token string&quot;&gt;&quot;github.com&quot;&lt;/span&gt;, owner:&lt;span class=&quot;token string&quot;&gt;&quot;cli&quot;&lt;/span&gt;, name:&lt;span class=&quot;token string&quot;&gt;&quot;cli&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;テスト書くならモックしないとなーとは思っていたものの先延ばしにしていたが思ったより簡単だった&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[Denoでインストールしたモジュールのバージョンを更新する]]></title><description><![CDATA[何度インストールし直してもバージョンが変わらないなーと思ってたらキャッシュを参照していたっぽい すればOK 手元でCLIツールを更新してみた]]></description><link>https://til.swfz.io/entries/deno_install_reload/</link><guid isPermaLink="false">https://til.swfz.io/entries/deno_install_reload/</guid><pubDate>Tue, 02 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;何度インストールし直してもバージョンが変わらないなーと思ってたらキャッシュを参照していたっぽい&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--reload&lt;/code&gt;すればOK&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ deno &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;
  -r, --reload&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;CACHE_BLOCKLIST&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
          Reload &lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; code cache &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;recompile TypeScript&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token parameter variable&quot;&gt;--reload&lt;/span&gt; Reload everything
          &lt;span class=&quot;token parameter variable&quot;&gt;--reload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://deno.land/std
            Reload only standard modules
          &lt;span class=&quot;token parameter variable&quot;&gt;--reload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://deno.land/std/fs/utils.ts,https://deno.land/std/fmt/colors.ts
            Reloads specific modules
          &lt;span class=&quot;token parameter variable&quot;&gt;--reload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;npm:
            Reload all &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; modules
          &lt;span class=&quot;token parameter variable&quot;&gt;--reload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;npm:chalk
            Reload specific &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; module
  -f, &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt;
          Forcefully overwrite existing installation&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;手元でCLIツールを更新してみた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ cg &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;
cg v0.2.0

$ deno &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; --allow-env --allow-run --allow-net https://deno.land/x/commit_genius/cg.ts

$ cg &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;
cg v0.3.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Gatsbyのバージョンを5に上げた]]></title><description><![CDATA[本ブログがGatsbyv4を使用していたのでv5に上げた 合わせてNode18とも依存があるので18にもした（CloudflareにデプロイしているのでNode18対応を待ってた しっかり読まずに雰囲気で始めてしまったので時間かけてしまったが、基本的にMigration…]]></description><link>https://til.swfz.io/entries/gatsby_migrate_v5/</link><guid isPermaLink="false">https://til.swfz.io/entries/gatsby_migrate_v5/</guid><pubDate>Wed, 26 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本ブログがGatsbyv4を使用していたのでv5に上げた&lt;/p&gt;
&lt;p&gt;合わせてNode18とも依存があるので18にもした（CloudflareにデプロイしているのでNode18対応を待ってた&lt;/p&gt;
&lt;p&gt;しっかり読まずに雰囲気で始めてしまったので時間かけてしまったが、基本的にMigrationガイド見ながら進めれば問題なさそう&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/docs/reference/release-notes/migrating-from-v4-to-v5/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Migrating from v4 to v5 | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下やったこと&lt;/p&gt;
&lt;h2&gt;依存モジュールの更新&lt;/h2&gt;
&lt;p&gt;node_modules削除、yarn.lock削除で再インストール&lt;/p&gt;
&lt;p&gt;renovateだけだと各モジュール依存モジュールのバージョンまでは更新してくれないのでいろいろ不整合が発生した&lt;/p&gt;
&lt;p&gt;ひとつずつ潰していく前にとりあえず試してみるで良い気がする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; yarn.lock
$ &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rf&lt;/span&gt; node_modules
$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;結構lockファイルに差が出た&lt;/p&gt;
&lt;h2&gt;GraphQLのクエリ更新&lt;/h2&gt;
&lt;p&gt;groupとsortのフィールド指定の方法が変わったよう&lt;/p&gt;
&lt;p&gt;マイグレーションガイドみたら下記実行しろとのこと&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx gatsby-codemods@latest sort-and-aggr-graphql .&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;codemodsがBRAKING CHANGESの修正をしてくれる&lt;/p&gt;
&lt;p&gt;便利…&lt;/p&gt;
&lt;p&gt;結構時間かけてしまったけど完全にドキュメント読め案件&lt;/p&gt;
&lt;h2&gt;型エラーの解消&lt;/h2&gt;
&lt;p&gt;これは自分のコードの問題だが一応合わせて対応したので残しておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ tsc --noEmit
gatsby-browser.tsx:28:11 - error TS2559: Type &apos;{ children: ReactNode; }&apos; has no properties in common with type &apos;IntrinsicAttributes&apos;.

28   return &amp;lt;Layout {...props}&gt;{element}&amp;lt;/Layout&gt;
             ~~~~~~

src/components/layout.tsx:9:29 - error TS2339: Property &apos;children&apos; does not exist on type &apos;{}&apos;.

9 const Layout: React.FC = ({ children }) =&gt; {&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://bobbyhadz.com/blog/react-type-children-has-no-properties-in-common&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;React: Type {children: Element} has no properties in common with type IntrinsicAttributes | bobbyhadz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ここを参考にした&lt;/p&gt;
&lt;p&gt;ようはpropsを受け取らないコンポーネントに&lt;code class=&quot;language-text&quot;&gt;props&lt;/code&gt;渡すなって話らしい&lt;/p&gt;
&lt;p&gt;しかしながら&lt;code class=&quot;language-text&quot;&gt;children&lt;/code&gt;は必要なのでLayout側ではReactNodeの型定義を用意した&lt;/p&gt;
&lt;p&gt;他にもwarningはいくつか残っているがGatsby5で動作させられるところまで持っていけた&lt;/p&gt;
&lt;h2&gt;該当PR&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/til/pull/1408&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;feature/gatsby v5 and node18 by swfz · Pull Request #1408 · swfz/til&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PythonのSoundcardで音声の入出力、ファイルでのやり取りをする]]></title><description><![CDATA[Pythonのsoundcard,soundfileを使って音声ファイルを扱う 前提としてWSL2（Ubuntu）を使っている WSLgが使えるようになったのでWSL上で音声のやりとりができるようになった WSLgが用意してくれているサウンドデバイスは…]]></description><link>https://til.swfz.io/entries/python_soundcard/</link><guid isPermaLink="false">https://til.swfz.io/entries/python_soundcard/</guid><pubDate>Tue, 18 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pythonのsoundcard,soundfileを使って音声ファイルを扱う&lt;/p&gt;
&lt;p&gt;前提としてWSL2（Ubuntu）を使っている&lt;/p&gt;
&lt;p&gt;WSLgが使えるようになったのでWSL上で音声のやりとりができるようになった&lt;/p&gt;
&lt;p&gt;WSLgが用意してくれているサウンドデバイスは1つっぽいので&lt;code class=&quot;language-text&quot;&gt;default_speaker&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;default_mic&lt;/code&gt;で読み込める&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;動作環境&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ wsl --version
WSL バージョン: 1.2.0.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.2846&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ファイルをコマンドライン引数から受け取り、読み込んで音声を出力&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; soundcard &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sc
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; soundfile &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sf
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys

samplerate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48000&lt;/span&gt;
read_wave_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

default_speaker &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;default_speaker&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; default_speaker&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;player&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;samplerate&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;samplerate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sp&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Reading...(&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;read_wave_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;read_wave_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Playing...\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;play&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;音声入力からファイルへ保存&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; soundcard &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sc
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; soundfile &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; sf

samplerate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48000&lt;/span&gt;
recording_sec &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
filename &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;outfile.wav&apos;&lt;/span&gt;

default_mic &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;default_microphone&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; default_mic&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recorder&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;samplerate&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;samplerate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; mic&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Recording...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mic&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;record&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numframes&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;samplerate&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;recording_sec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Saving...\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    sf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filename&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; samplerate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[スプレッドシートで月計算]]></title><description><![CDATA[どうやるんだろうと調べたらという月計算をするための関数があった EDATE - Google ドキュメント エディタ ヘルプ こんな感じ   他にもあるんだろうかと調べてみたら月末日を算出する関数もあった EOMONTH - Google…]]></description><link>https://til.swfz.io/entries/spreadsheet_month_calc/</link><guid isPermaLink="false">https://til.swfz.io/entries/spreadsheet_month_calc/</guid><pubDate>Wed, 15 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;どうやるんだろうと調べたら&lt;code class=&quot;language-text&quot;&gt;EDATE&lt;/code&gt;という月計算をするための関数があった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://support.google.com/docs/answer/3092974?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;EDATE - Google ドキュメント エディタ ヘルプ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こんな感じ&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 499px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/99aeabecd089608860536e8d3c7527f0/119c7/spreadsheet_month_calc01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.78378378378378%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABRUlEQVR42nVSa2/CMAzk//+vSZv2pBVQYALUsW6FtvSRNomT9mZn8GlapIutxD6fncymCfB+hLUE5zzatgOxfz4XKMoSqqkxWg1tXIj5bwmPYDbx7pyDMSagqiqorkWafiDPc9TlCW5o0XYaw6BBXNTSX4iYcRwxE3ZxlFIc7EI1Szacyer7AYPWwZfCSTogPhDmuwF30RmLlPC2s/guJYYJ/cTs3oGIQoL3HsaaQCo+sXWO4LkAsb10hkEBZWNRK4cLQw2G4x0rnH4rW2uDFWKjDSucMF5nK3eWx9FzUn4hFK1HXpmAL1aWFRpVa8MQQ8tZliGKIhz2e2w3WxyPn9d2e8RxjHWSIFktES/fsc8tlPZ4jTe4f1rgeb7Gw8sKj6sy5IRHkdZE3Q2iUs5kjrcx3GKKhn9A43GqieGuvsP22IdH+QFmRRvlcN9PxgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/99aeabecd089608860536e8d3c7527f0/cbe2e/spreadsheet_month_calc01.webp 148w,
/static/99aeabecd089608860536e8d3c7527f0/3084c/spreadsheet_month_calc01.webp 295w,
/static/99aeabecd089608860536e8d3c7527f0/f002d/spreadsheet_month_calc01.webp 499w&quot;
              sizes=&quot;(max-width: 499px) 100vw, 499px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/99aeabecd089608860536e8d3c7527f0/12f09/spreadsheet_month_calc01.png 148w,
/static/99aeabecd089608860536e8d3c7527f0/e4a3f/spreadsheet_month_calc01.png 295w,
/static/99aeabecd089608860536e8d3c7527f0/119c7/spreadsheet_month_calc01.png 499w&quot;
            sizes=&quot;(max-width: 499px) 100vw, 499px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/99aeabecd089608860536e8d3c7527f0/119c7/spreadsheet_month_calc01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 472px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/eb410967c621ec18b6824f666274c330/3c5de/spreadsheet_month_calc02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABWklEQVR42n1SCU7DMBDM/x/FA1ChB9CqtGmcxAWag6S5fQ5rQytAgpVGXts7o1mvA2MBqTQ0JUKqK/p+QD+MENMErRTVGF/j6v9DAIq+76GIVFUVirJA/V5ivdmAxRGKE4fpSzpvIKVw5bDW/onAGOPFJnLicms06lbg8CaRFhZP0RmrsAbLFPavAkU9EdGQG+poEhBCeCGttc8DqSTGcUTTkgMSVrTPqw7PfCRRgeWuxHybIzpJbPmAU9lBaelrXWfDMHhDTszl3uEl7Nfq3rAdiDAZSA2PSVkCrUL6Tr7zLmQnHDhlFjEcOUeW5Xg5cqwPJfLGgmc9ZqsQi3WMJWH2EGHHW8/vqCPGGNI09dwkST4dOsFDeEASx+B0kdLFllUkCC94u9hj/shwR2KzVYSb+9ILNs0ZIfFi4jlukqR+DoF70N+h6BtN0lKrbnI/v8W5k9eJ/g43mA84rmfk9KzZvQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/eb410967c621ec18b6824f666274c330/cbe2e/spreadsheet_month_calc02.webp 148w,
/static/eb410967c621ec18b6824f666274c330/3084c/spreadsheet_month_calc02.webp 295w,
/static/eb410967c621ec18b6824f666274c330/ef93e/spreadsheet_month_calc02.webp 472w&quot;
              sizes=&quot;(max-width: 472px) 100vw, 472px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/eb410967c621ec18b6824f666274c330/12f09/spreadsheet_month_calc02.png 148w,
/static/eb410967c621ec18b6824f666274c330/e4a3f/spreadsheet_month_calc02.png 295w,
/static/eb410967c621ec18b6824f666274c330/3c5de/spreadsheet_month_calc02.png 472w&quot;
            sizes=&quot;(max-width: 472px) 100vw, 472px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/eb410967c621ec18b6824f666274c330/3c5de/spreadsheet_month_calc02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;他にもあるんだろうかと調べてみたら月末日を算出する関数もあった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://support.google.com/docs/answer/3093044?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;EOMONTH - Google ドキュメント エディタ ヘルプ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 358px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/87a863c15e2a0e9b9f8e25ffdea6db7c/39185/spreadsheet_month_calc03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAByUlEQVR42m2Si27aQBBF/f8/0x+oqqZqGoVIBUoIBBubhw0GbMdQ/Fzvnu7aMU2ljnS9s6OZ65m5a4lG0kNKhTAwvoJGf6RSaPeGNq5jQp8mX77n97D4YGmaUlWVTpL4vk9ZlsRRxPRlzs/REMdZMJ/ZOnaA3yFRkhOESVur3jksU9yjKArqum5JgyBoCc1P1pstS9cl3O/YBSFpEiEuJ+Lkyik6o9RfDksIcbsYslyTKjOm6oaMzyXuQbI+STYRTNwzIzvFPYIbCpy94PSW61SpVyS7DnvrOzJmdmMsjDNGbsmvVcXMl3x5Cvg8CJgHksm6YuxVHPTo7di6xDJjmhENWVlWbZed3+GaZWRFpTuvyHIdq8xKarKsINd3A5NjOAz+6fB/VlSCayHJSkVRK/SVUqNuoDLQfl6IW77eYd0qdDwesO0F2+0Wz/PYaCGC7Yr78Z7VsSaIa8Yzn2+DVx6GS+4eXngce3x9fGXkXNp9Gz0s2XTsu13AdDrF1Wo6ts1y6bHz1wwXCYe0Ibkqnucbvg+mPI0dfuhz+Oxy/zTn013Y7V19ULmTXt0U7lW+5jXRWRBfDKnkLVMtzoVGrtrYZHmhabpn8weVNf4nj+2XeAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/87a863c15e2a0e9b9f8e25ffdea6db7c/cbe2e/spreadsheet_month_calc03.webp 148w,
/static/87a863c15e2a0e9b9f8e25ffdea6db7c/3084c/spreadsheet_month_calc03.webp 295w,
/static/87a863c15e2a0e9b9f8e25ffdea6db7c/44bcf/spreadsheet_month_calc03.webp 358w&quot;
              sizes=&quot;(max-width: 358px) 100vw, 358px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/87a863c15e2a0e9b9f8e25ffdea6db7c/12f09/spreadsheet_month_calc03.png 148w,
/static/87a863c15e2a0e9b9f8e25ffdea6db7c/e4a3f/spreadsheet_month_calc03.png 295w,
/static/87a863c15e2a0e9b9f8e25ffdea6db7c/39185/spreadsheet_month_calc03.png 358w&quot;
            sizes=&quot;(max-width: 358px) 100vw, 358px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/87a863c15e2a0e9b9f8e25ffdea6db7c/39185/spreadsheet_month_calc03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;プログラムだと結構月末日出したいっていうパターンはよくあるがSpreadsheetだとあんまり機会がないかも&lt;/p&gt;
&lt;p&gt;とはいえ両方めちゃくちゃはかどる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub CLI拡張upgrade時のエラー対応]]></title><description><![CDATA[動作環境 GitHubのprojectsのCLI拡張がいろいろできるよという記事を見て使ってみるかと思い（すでに以前インストールしてた）更新したら エラーが出てきた GitHub CLI拡張のうちGo…]]></description><link>https://til.swfz.io/entries/github_cli_extension_projects_upgrade/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_cli_extension_projects_upgrade/</guid><pubDate>Fri, 03 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;動作環境&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.5 LTS
Release:        20.04
Codename:       focal&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;GitHubのprojectsのCLI拡張がいろいろできるよという記事を見て使ってみるかと思い（すでに以前インストールしてた）更新したら&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gh extension upgrade github/gh-projects
[projects]: upgraded from v0.7.0 to v0.8.1
✓ Successfully upgraded extension&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;エラーが出てきた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gh projects
/home/user/.local/share/gh/extensions/gh-projects/gh-projects: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32&apos; not found (required by /home/user/.local/share/gh/extensions/gh-projects/gh-projects)
/home/user/.local/share/gh/extensions/gh-projects/gh-projects: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34&apos; not found (required by /home/user/.local/share/gh/extensions/gh-projects/gh-projects)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;GitHub CLI拡張のうちGo言語で作られているものはインストール時にビルドされるという話だったはずなので&lt;/p&gt;
&lt;p&gt;下記参考サイトにしたがって環境変数をセットしてインストールし直した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://ebc-2in2crc.hatenablog.jp/entry/2020/10/14/030150&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;go build&lt;/code&gt; した Go のバイナリを実行すると「/lib/x86_64-linux-gnu/libc.so.6: version &lt;code class=&quot;language-text&quot;&gt;GLIBC_2.32&apos; not found&lt;/code&gt;」を出力して止まるときにやったこと。 - 全力で怠けたい&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ CGO_ENABLED=0 gh extension  install github/gh-projects
✓ Installed extension github/gh-projects&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gh projects
Work with GitHub Projects. Note that the token you are using must have &apos;project&apos; scope, which is not set by default. You can verify your token scope by running &apos;gh auth status&apos; and add the project scope by running &apos;gh auth refresh -s project&apos;.

Usage:
  projects [command]

Available Commands:
  close        Close a project
  completion   Generate the autocompletion script for the specified shell
  copy         Copy a project
  create       Create a project
  delete       Delete a project
  edit         Edit a project
  field-create Create a field in a project
  field-delete Delete a field in a project by ID
  field-list   List the fields in a project
  help         Help about any command
  item-add     Add a pull request or an issue to a project
  item-archive Archive an item in a project
  item-create  Create a draft issue item in a project
  item-delete  Delete an item from a project by ID
  item-edit    Edit a draft issue in a project by ID
  item-list    List the items in a project
  list         List the projects for an owner
  view         View a project

Flags:
  -h, --help   help for projects

Use &quot;projects [command] --help&quot; for more information about a command.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;使えるようになった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ObsidianのDataviewプラグインのTABLEリストでfileカラムを除外する]]></title><description><![CDATA[とりあえず何かしらのノートたちをを使ってリストを出力させてみようという感じでやるとこんな感じ  特にカラム指定せずともに関しては表示された状態になっている なんとなくファイル名に日本語を含めるのに抵抗があるので、できればfrontmatter…]]></description><link>https://til.swfz.io/entries/obsidian_dataview_without_id/</link><guid isPermaLink="false">https://til.swfz.io/entries/obsidian_dataview_without_id/</guid><pubDate>Mon, 20 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;とりあえず何かしらのノートたちを&lt;code class=&quot;language-text&quot;&gt;TABLE&lt;/code&gt;を使ってリストを出力させてみようという感じでやるとこんな感じ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;TABLE
published,
file.tags AS tags
FROM &quot;tech&quot;
SORT file.mtime DESC&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6ff8ae9ac50d258a41bf04235ea1c2d4/25260/obsidian_dataview_without_id01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.567567567567565%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABk0lEQVR42nWR207iUBiF+xzGKAoCasvB6kgVD4lYWmAcEasOCvGYEBMlVSGKISYQTYiJV87NZF5BbyY+3+euIFqiF1/2TrP+1X+tLc0ni2hLeYIT6S6BDiMRk8mFDRIrh8T1AnNCK2tr9AUTDIzp9AsG5CQexcAfTQtMpMhsjshMDmV6FbmDElslpGXfiMZzqPMW6pwl7hb2yRm3tStuKhVa9RrNqyo120ZbtPCLJaTwjzTKVArndAgJ5MkU3lCyy7CivzE4rtOo2Pz/e8fTY4OH+gXr2d9Ep1P4w22tFJgwCYhVg53zHV/YcDEi8ChJGtVzrssn/FrZEj9J0D+awCPreDs6qXfQwfvFN8dwOGRQzO9xWNhn0ypi5QqiZ7dO8grRR7yvzd4Nh0T59/VLnv80yW8WiS9m8Yk5l2E4lkHVfhKJtVGmMi5T56U/IhvcnNtcHJcwzA3SmS1G1XbfXUO/GPhMb4TeDVvXVV7+tbg8PWV3Z59x1RRVfDL0fRPxuw5Le0c0K2XKpWO28wdiu2VX5Fenkjxm2ArTIQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/6ff8ae9ac50d258a41bf04235ea1c2d4/cbe2e/obsidian_dataview_without_id01.webp 148w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/3084c/obsidian_dataview_without_id01.webp 295w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/5ca24/obsidian_dataview_without_id01.webp 590w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/dad35/obsidian_dataview_without_id01.webp 885w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/9bbd4/obsidian_dataview_without_id01.webp 1113w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/6ff8ae9ac50d258a41bf04235ea1c2d4/12f09/obsidian_dataview_without_id01.png 148w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/e4a3f/obsidian_dataview_without_id01.png 295w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/fcda8/obsidian_dataview_without_id01.png 590w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/efc66/obsidian_dataview_without_id01.png 885w,
/static/6ff8ae9ac50d258a41bf04235ea1c2d4/25260/obsidian_dataview_without_id01.png 1113w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/6ff8ae9ac50d258a41bf04235ea1c2d4/fcda8/obsidian_dataview_without_id01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;特にカラム指定せずとも&lt;code class=&quot;language-text&quot;&gt;file&lt;/code&gt;に関しては表示された状態になっている&lt;/p&gt;
&lt;p&gt;なんとなくファイル名に日本語を含めるのに抵抗があるので、できればfrontmatterに&lt;code class=&quot;language-text&quot;&gt;title&lt;/code&gt;を別で用意してそいつを参照させるようにしたい（もちろんノートへのリンクもつけておきたい）&lt;/p&gt;
&lt;h2&gt;Markdownファイルの前提&lt;/h2&gt;
&lt;p&gt;今回扱うノートにはすべてfrontmatterを書いている&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-markdown line-numbers&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;title: dataviewのTABLEリストでfileカラムを除外する
tags:
- tech/Obsidian/Plugin/dataview&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じ、そしてリンクにするのをファイル名ではなく&lt;code class=&quot;language-text&quot;&gt;title&lt;/code&gt;にしたい&lt;/p&gt;
&lt;h2&gt;fileの除外&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;WITHOUT ID&lt;/code&gt;で除外できる&lt;/p&gt;
&lt;p&gt;これはIDがこの場合は&lt;code class=&quot;language-text&quot;&gt;file&lt;/code&gt;という扱いってことなのかな（詳しく追ってはいない）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;TABLE WITHOUT ID
link(file.link, title) AS &quot;Title&quot;,
published,
file.tags AS tags
FROM &quot;tech&quot;
SORT file.mtime DESC&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2行目、代替となるカラムを用意する(&lt;code class=&quot;language-text&quot;&gt;Title&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;link&lt;/code&gt;でリンク表示にできる、表示する文字列をfrontmatterの&lt;code class=&quot;language-text&quot;&gt;title&lt;/code&gt;にする&lt;/p&gt;
&lt;p&gt;求めている感じになってきた&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2b222d529b50c95d922f1f3150bb9f5d/8ae78/obsidian_dataview_without_id02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.567567567567565%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABrElEQVR42oVRWy8DYRDdf+FRdauodq8t2hUal62vu60uDRqNFiEhoiESdWkbQdIKTUR44UXw6i8e821Rl4iHszPZmTnfmTPCmL0CfWQOfjWJHs36hVFWgDm9BmMyj3iyCL+eQmfQRFcoAU8wAVFm8CkMvbpFHAyCasxCM2agxDgcqLFWrr7/k6OtGBpyYIzn0Kge4bJ2hIvKAW7Oqmgcl7FfKtGc4woQwrEUpAHLRUBnCEUsBMMW5EEL/RS9pEQMmfD0T0IZSuOhUcHr3TlemlVUdrYQH8ugT231iFICQoCGRHkKvn/AV1RjGVyflFFcLCA+7qDDN4pOeshDtY8+QZRaifiOvwi99HowYmNjZQ25uSXkc0XY9gJtYH7rE/inh8zk6NWYa6xfmaI86UZe71a4QhO64eCpeYLb0zIsIhsYTv8mjI5kyJsUwkYakeFpaNEU+WdTniYPk18IE9Bo5ft6BatLy2BWDiabd2vfCAM05JXaK7fR9qVbbhM+XtXw3Kxhc3Ud89k8fNIPhdyb/w7CCfm1Zbpy/XAP9YNd7G+XkM0W6PoTpJJ9Er4B15496AX/aGEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2b222d529b50c95d922f1f3150bb9f5d/cbe2e/obsidian_dataview_without_id02.webp 148w,
/static/2b222d529b50c95d922f1f3150bb9f5d/3084c/obsidian_dataview_without_id02.webp 295w,
/static/2b222d529b50c95d922f1f3150bb9f5d/5ca24/obsidian_dataview_without_id02.webp 590w,
/static/2b222d529b50c95d922f1f3150bb9f5d/dad35/obsidian_dataview_without_id02.webp 885w,
/static/2b222d529b50c95d922f1f3150bb9f5d/7f3f2/obsidian_dataview_without_id02.webp 1096w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2b222d529b50c95d922f1f3150bb9f5d/12f09/obsidian_dataview_without_id02.png 148w,
/static/2b222d529b50c95d922f1f3150bb9f5d/e4a3f/obsidian_dataview_without_id02.png 295w,
/static/2b222d529b50c95d922f1f3150bb9f5d/fcda8/obsidian_dataview_without_id02.png 590w,
/static/2b222d529b50c95d922f1f3150bb9f5d/efc66/obsidian_dataview_without_id02.png 885w,
/static/2b222d529b50c95d922f1f3150bb9f5d/8ae78/obsidian_dataview_without_id02.png 1096w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2b222d529b50c95d922f1f3150bb9f5d/fcda8/obsidian_dataview_without_id02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;Obsidianのdataviewプラグインに関してはやりたいことを単語で探すとIssueにたどり着いてたいていのやりたいことは解決策が書いてあるので助かる…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/blacksmithgu/obsidian-dataview/issues/102&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Omit “File” column in TABLE results · Issue #102 · blacksmithgu/obsidian-dataview&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[MUI TextFieldのInputPropsとinputPropsの違い]]></title><description><![CDATA[仕事でMUIを使ったコードを読んでたらTextFieldのプロパティに, と,で両方あることに気付いた 違いは何だと言うことで調べた TextField API - Material UI InputProps Input要素に適用されるプロパティ variant prop…]]></description><link>https://til.swfz.io/entries/mui_inputprops/</link><guid isPermaLink="false">https://til.swfz.io/entries/mui_inputprops/</guid><pubDate>Thu, 16 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;仕事でMUIを使ったコードを読んでたらTextFieldのプロパティに&lt;code class=&quot;language-text&quot;&gt;inputProps&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;InputProps&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;i&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;I&lt;/code&gt;で両方あることに気付いた&lt;/p&gt;
&lt;p&gt;違いは何だと言うことで調べた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mui.com/material-ui/api/text-field/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TextField API - Material UI&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;InputProps&lt;/h2&gt;
&lt;p&gt;Input要素に適用されるプロパティ&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;variant prop の値に応じて、FilledInput、OutlinedInput、Inputコンポーネントのいずれかになる&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;なるほど、TextFieldはFilledInput,OutlinedInput,Inputをより抽象化したコンポーネントで、この3つのコンポーネントのどれかに適用させるプロパティを指定するということのよう&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;試しにFilledInputのAPIドキュメントを見に行くと&lt;code class=&quot;language-text&quot;&gt;inputProps&lt;/code&gt;のみしかないのでなるほどとなった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mui.com/material-ui/api/filled-input/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;FilledInput API - Material UI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このページでのPropsの中で指定したいものがあれば指定するとういことと理解した&lt;/p&gt;
&lt;p&gt;たとえば&lt;code class=&quot;language-text&quot;&gt;color&lt;/code&gt;とか&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;あとはTextFieldを使って汎用的なカスタムコンポーネントを作った場合なども&lt;code class=&quot;language-text&quot;&gt;InputProps&lt;/code&gt;を受け取ってそのまま&lt;code class=&quot;language-text&quot;&gt;TextField&lt;/code&gt;に流すことでカスタマイズ可能で汎用的なカスタムコンポーネントを作れる&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;h2&gt;inputProps&lt;/h2&gt;
&lt;p&gt;input要素に適用するプロパティを指定する&lt;/p&gt;
&lt;p&gt;お馴染みの&lt;code class=&quot;language-text&quot;&gt;input&lt;/code&gt;タグに指定するプロパティを指定する&lt;/p&gt;
&lt;p&gt;たとえば&lt;code class=&quot;language-text&quot;&gt;value&lt;/code&gt;とか&lt;/p&gt;
&lt;p&gt;どのタグやコンポーネントに作用させたいかでPropsの大文字小文字を切り替えると理解した&lt;/p&gt;
&lt;p&gt;よく考えられているなーと感じたが初見ではとっつきづらいしややこしいな…と感じた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[特定文字列でファイルを分割する]]></title><description><![CDATA[背景 もともとToDoリストをひとつのMarkdown+VS Codeで管理していた そして最近ObsidianのDailyNoteでToDoを管理するように変更したので、どうせなら過去のToDoをObsidian管理下にうつしてしまおうとした work_todo.md…]]></description><link>https://til.swfz.io/entries/csplit/</link><guid isPermaLink="false">https://til.swfz.io/entries/csplit/</guid><pubDate>Tue, 07 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;もともとToDoリストをひとつのMarkdown+VS Codeで管理していた&lt;/p&gt;
&lt;p&gt;そして最近ObsidianのDailyNoteでToDoを管理するように変更したので、どうせなら過去のToDoをObsidian管理下にうつしてしまおうとした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;work_todo.md&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-markdown line-numbers&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; 2022-08-02&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [x] 依頼1
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [x] 依頼2

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; 2022-08-03&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [x] タスクA
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; [x] タスクB&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;分割&lt;/h2&gt;
&lt;p&gt;特定文字列でファイルを分割できないかと思って調べたらちょうどやりたいコマンドがあった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/a072csplit.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;テキストファイルを任意の文字列で分割するには － ＠IT&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;csplit -z  work_todo.md &quot;/^## 2022/&quot; &quot;{*}&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で&lt;code class=&quot;language-text&quot;&gt;xx01&lt;/code&gt;とか&lt;code class=&quot;language-text&quot;&gt;xx02&lt;/code&gt;…というようにファイルができた&lt;/p&gt;
&lt;p&gt;分けたファイルを2022-11-23.mdといった形式にしたい&lt;/p&gt;
&lt;p&gt;ファイル名を制御するようなオプションはなさそうだったのでやむなく下記のスクリプトで別名保存した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rename.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;md_filelname&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/## //&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;.md&quot;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${file}&lt;/span&gt; /path/to/obsidian/daily_note/&lt;span class=&quot;token variable&quot;&gt;${md_filelname}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-name&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;xx*&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt; rename.sh &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Obsidianのdataviewプラグインで特定ヘッダー以下のタスクリストを取得する]]></title><description><![CDATA[前提 デイリーノートをディレクトリ以下に保存している ポッドキャストを聞いたら、途中でもというヘッダ以下にタスクリストを書くようにしている  で、今回は聞き終わったタスクリストを表示したい 特定ヘッダ以下のタスクリストなんて出せるのか?と思っていたができるよう task…]]></description><link>https://til.swfz.io/entries/obsidian_dataview_tasklist_under_header/</link><guid isPermaLink="false">https://til.swfz.io/entries/obsidian_dataview_tasklist_under_header/</guid><pubDate>Tue, 24 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;デイリーノートを&lt;code class=&quot;language-text&quot;&gt;daily_note&lt;/code&gt;ディレクトリ以下に保存している&lt;/li&gt;
&lt;li&gt;ポッドキャストを聞いたら、途中でも&lt;code class=&quot;language-text&quot;&gt;## Podcast&lt;/code&gt;というヘッダ以下にタスクリストを書くようにしている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 531px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/101758e134bec007558e1c00f9ef5afc/d4713/obsidian_dataview_tasklist_under_header01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.78378378378378%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABNklEQVR42o2RWU/CQBSF+SNKi4rK0sWqLYuE0lJKO+wUKgjBxvTBR/9/crwzEwKamPjw5czcuTlzz0zhWg+h1AdQiZImVT3fE7znvxRKWohHZwTLYTBtJvWZQX+KUbEioWVjiBtBeLY+UTalCsNibYDDLMV2nKDVGiGJlnifrrAm3bAEi+ECZT2AUgugEsWKh2LVh1LtQyUUWl/c98S+RKkK3JW7a40ZzPYSRnsBu5vCdtekK+jNGaxOAqM5F/oy2KMT7tHwNmj6W3SjA+LkE+1gB82ZngxtN6XmnWjqsQxunAnldV5r9d+EiT/+QDDN4dGZN8oQznMk+y8Ek5zOt9KQc0WPz+PwSRjd6PReRRReV2s8zjGyL2IqIq7k8ndkOaXk9iFG3Z7gzmI4Tv/zA6I/a/xTvgHsP+0YawYW+gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/101758e134bec007558e1c00f9ef5afc/cbe2e/obsidian_dataview_tasklist_under_header01.webp 148w,
/static/101758e134bec007558e1c00f9ef5afc/3084c/obsidian_dataview_tasklist_under_header01.webp 295w,
/static/101758e134bec007558e1c00f9ef5afc/a33a1/obsidian_dataview_tasklist_under_header01.webp 531w&quot;
              sizes=&quot;(max-width: 531px) 100vw, 531px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/101758e134bec007558e1c00f9ef5afc/12f09/obsidian_dataview_tasklist_under_header01.png 148w,
/static/101758e134bec007558e1c00f9ef5afc/e4a3f/obsidian_dataview_tasklist_under_header01.png 295w,
/static/101758e134bec007558e1c00f9ef5afc/d4713/obsidian_dataview_tasklist_under_header01.png 531w&quot;
            sizes=&quot;(max-width: 531px) 100vw, 531px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/101758e134bec007558e1c00f9ef5afc/d4713/obsidian_dataview_tasklist_under_header01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;で、今回は聞き終わったタスクリストを表示したい&lt;/p&gt;
&lt;p&gt;特定ヘッダ以下のタスクリストなんて出せるのか?と思っていたができるよう&lt;/p&gt;
&lt;h2&gt;taskリスト&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;TASK
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;daily_note&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;meta&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;section&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subpath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Podcast&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; completed
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;day&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; this&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;day&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;結果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 424px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/87e2f4fb08e8db95734212ec2007ace7/1cfa9/obsidian_dataview_tasklist_under_header02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABcklEQVR42o2S6U7CUBCFeRAV2cu+gyCgUCiUogEpRXZS0SAxroSQqPHRj9MLLSiJ8uPLTOfOPZ2ZOyZ7sAINW2CD/r0d1/P+w6Q7XLRq4AiLzNqDZbgiVTjDK/YStPrL8CZrUJ9n6M3u0CcueyPm8/UO2Qna6iN6N0vEzxRYfCU4QuLfFTpCFbjjEriYBDfhiddWJFYE0w2EMzLFLqj9MhPcFt32jZatlGgnbAEBh1zB4MCVx5GbfMLs4WGjjiw+ARa/wKrV0X5kpZgh6KB5yeMFcuIIyvAVje4T2uM5lNEbxOYULYpJ8j3kwQuE+i0mD18YT9+JD3TUBfqTJdTZ50ZQI8V3ET5tIl3s46TQQUboI1sZIpG/pvm1Ec21WDyQaiCZ76xzBoift9ndbHn4U9Ds5tk8lNGc5nbF2tXaPPYWidKaImtNs2YNT9GIa7mm36/kpJWJUSVcRNoZ+O5j6Ofi+qyyK8geiCrQhrzvMm+vzTe4ylKmWB8LSgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/87e2f4fb08e8db95734212ec2007ace7/cbe2e/obsidian_dataview_tasklist_under_header02.webp 148w,
/static/87e2f4fb08e8db95734212ec2007ace7/3084c/obsidian_dataview_tasklist_under_header02.webp 295w,
/static/87e2f4fb08e8db95734212ec2007ace7/96b95/obsidian_dataview_tasklist_under_header02.webp 424w&quot;
              sizes=&quot;(max-width: 424px) 100vw, 424px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/87e2f4fb08e8db95734212ec2007ace7/12f09/obsidian_dataview_tasklist_under_header02.png 148w,
/static/87e2f4fb08e8db95734212ec2007ace7/e4a3f/obsidian_dataview_tasklist_under_header02.png 295w,
/static/87e2f4fb08e8db95734212ec2007ace7/1cfa9/obsidian_dataview_tasklist_under_header02.png 424w&quot;
            sizes=&quot;(max-width: 424px) 100vw, 424px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/87e2f4fb08e8db95734212ec2007ace7/1cfa9/obsidian_dataview_tasklist_under_header02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;特定ヘッダ以下のタスクリストを取得する&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.obsidian.md/t/filtering-tasks-by-heading-in-dataview/50915/4&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Filtering tasks by heading in dataview - Help - Obsidian Forum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;meta&lt;/code&gt;を挟むことで判定できるようになる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blacksmithgu.github.io/obsidian-dataview/reference/functions/#metalinksubpath&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Functions - Dataview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ドキュメントでは&lt;code class=&quot;language-text&quot;&gt;link&lt;/code&gt;に対して使っているが&lt;code class=&quot;language-text&quot;&gt;section&lt;/code&gt;に対しても使える&lt;/p&gt;
&lt;p&gt;「自身のプロパティへアクセスしたい場合にmetaを使う」と書いてあった&lt;/p&gt;
&lt;p&gt;活用方法はいろいろありそう&lt;/p&gt;
&lt;h3&gt;直近○日とかの範囲でフィルタする&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.obsidian.md/t/dataview-list-based-on-previous-month/23213/7&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dataview list based on PREVIOUS month - Resolved help - Obsidian Forum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;比較対象にする値は&lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;でそのファイルの値から-○日とかそういう書き方が必要&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;を入れるのがポイントっぽい&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;day&lt;/code&gt;の他にも&lt;code class=&quot;language-text&quot;&gt;file.cday.month&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;file.cday.year&lt;/code&gt;もある&lt;/p&gt;
&lt;p&gt;JavaScript書かずに済ませられたので良かった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub CLIでStarのカウント集計を出す]]></title><description><![CDATA[GitHubで自分のリポジトリにStarやWatch、Forkなどのイベントがあると励みになる たまに全体を見渡してみたらどんな感じなんだろうということでGitHub CLIのコマンドとjq…]]></description><link>https://til.swfz.io/entries/github_cli_repo_stats/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_cli_repo_stats/</guid><pubDate>Sat, 14 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHubで自分のリポジトリにStarやWatch、Forkなどのイベントがあると励みになる&lt;/p&gt;
&lt;p&gt;たまに全体を見渡してみたらどんな感じなんだろうということでGitHub CLIのコマンドとjqでリストを出したりするのでその際のコマンドのメモ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--limit 200&lt;/code&gt;の値の部分は対象リポジトリすべてを出せるくらいの数値にする（default: 30）&lt;/p&gt;
&lt;h2&gt;リポジトリごとのwatchしている人カウント（自分含む）&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gh repo list &lt;span class=&quot;token parameter variable&quot;&gt;--limit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--json&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name,watchers&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token string&quot;&gt;&apos;reduce .[] as $row ({}; .[$row.name] += $row.watchers.totalCount)&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;til&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;hatenablog_publisher&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;gh-annotations&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;リポジトリごとのStarカウント&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gh repo list &lt;span class=&quot;token parameter variable&quot;&gt;--limit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--json&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name,stargazerCount&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token string&quot;&gt;&apos;reduce .[] as $row ({}; .[$row.name] += $row.stargazerCount)&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;tools&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;dotfiles&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;gh-annotations&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;,
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;各種数値でソートと出力結果の整形&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;star&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gh repo list &lt;span class=&quot;token parameter variable&quot;&gt;--limit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--json&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name,stargazerCount,watchers,forkCount&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-cr&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;sort_by(.stargazerCount)|reverse|.[]|{star: .stargazerCount, name: .name}&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;star&quot;&lt;/span&gt;:4,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dotfiles&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;star&quot;&lt;/span&gt;:3,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tools&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;star&quot;&lt;/span&gt;:3,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;til&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;star&quot;&lt;/span&gt;:2,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mkdocs_sample&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;star&quot;&lt;/span&gt;:2,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;docker-mkdocs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;star&quot;&lt;/span&gt;:2,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;gh-annotations&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;fork&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gh repo list &lt;span class=&quot;token parameter variable&quot;&gt;--limit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--json&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name,stargazerCount,watchers,forkCount&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-cr&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;sort_by(.forkCount)|reverse|.[]|{fork: .forkCount, name: .name}&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fork&quot;&lt;/span&gt;:3,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hatenablog_publisher&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fork&quot;&lt;/span&gt;:2,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ansible-plenv&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fork&quot;&lt;/span&gt;:2,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;angular2-es-raw-search&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fork&quot;&lt;/span&gt;:2,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shared-count&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fork&quot;&lt;/span&gt;:2,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tools&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;watch&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;gh repo list &lt;span class=&quot;token parameter variable&quot;&gt;--limit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--json&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name,stargazerCount,watchers,forkCount&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-cr&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;sort_by(.watchers.totalCount)|reverse|.[]|{watch: .watchers.totalCount, name: .name}&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;watch&quot;&lt;/span&gt;:4,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;docker-mkdocs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;watch&quot;&lt;/span&gt;:3,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;twitter2slack&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;watch&quot;&lt;/span&gt;:3,&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bookmarklets&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[GA4のBigQueryにエクスポートしたデータのevent値の格納カラムがイベントによって違う]]></title><description><![CDATA[GA4のデータをBigQueryにエクスポートして、DataformでゴニョゴニョしてからLookerStudioで可視化するということをやってた そもそもGA4のデータはがREPEATEDなのでLookerStudio…]]></description><link>https://til.swfz.io/entries/ga4_exported_session_engagement_value/</link><guid isPermaLink="false">https://til.swfz.io/entries/ga4_exported_session_engagement_value/</guid><pubDate>Wed, 04 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GA4のデータをBigQueryにエクスポートして、DataformでゴニョゴニョしてからLookerStudioで可視化するということをやってた&lt;/p&gt;
&lt;p&gt;そもそもGA4のデータは&lt;code class=&quot;language-text&quot;&gt;event_params&lt;/code&gt;がREPEATEDなのでLookerStudioなどで可視化する場合はひと手間入れてあげるほうが使いやすい&lt;/p&gt;
&lt;p&gt;ということで&lt;code class=&quot;language-text&quot;&gt;event_params&lt;/code&gt;をフラットにして各イベントのキーをカラムとして扱うようにしてた&lt;/p&gt;
&lt;p&gt;下記を参考にとりあえずはイベントの名前(event_params.key)は決め打ちで進めた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.marketechlabo.com/ga4-bigquery-export-spec/#UNNEST&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Googleアナリティクス4のBigQueryエクスポート仕様 – marketechlabo&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;イメージ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;before&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/abf78ce273672e77db31db78ebac5b9c/3f919/ga4_exported_session_engagement_value01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.32432432432432%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA6klEQVR42pWS6QqEMAyEff/HFH+oeN93li8wRdyF3Q3EJjWdzDSNyrK0bdts33cjrqrK2ra14zhsmiaL49iGYfCaLMssTVP/zz/2+763ruvCGtnNrusKjq3ranmee36epzfEaU5DrYqxaJ7nALIsi4Owh5HDsGkaP0TOQRyG1CpHAU0jPjJiuRgiUSwkmYbUCEzuDJ+S7wajJEkcGIBxHH1P9/tk+CaZWLLFUEMDpK7rAP5kGCTfWT2HAjgydflMkabEnwC/StaUdQjJqiO+S/75DmHICgOmLWl6Kn8zBFAAPPqiKLzBJ1AAX5xRD80snTxGAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/abf78ce273672e77db31db78ebac5b9c/cbe2e/ga4_exported_session_engagement_value01.webp 148w,
/static/abf78ce273672e77db31db78ebac5b9c/3084c/ga4_exported_session_engagement_value01.webp 295w,
/static/abf78ce273672e77db31db78ebac5b9c/5ca24/ga4_exported_session_engagement_value01.webp 590w,
/static/abf78ce273672e77db31db78ebac5b9c/dad35/ga4_exported_session_engagement_value01.webp 885w,
/static/abf78ce273672e77db31db78ebac5b9c/2baf0/ga4_exported_session_engagement_value01.webp 1180w,
/static/abf78ce273672e77db31db78ebac5b9c/a1693/ga4_exported_session_engagement_value01.webp 1771w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/abf78ce273672e77db31db78ebac5b9c/12f09/ga4_exported_session_engagement_value01.png 148w,
/static/abf78ce273672e77db31db78ebac5b9c/e4a3f/ga4_exported_session_engagement_value01.png 295w,
/static/abf78ce273672e77db31db78ebac5b9c/fcda8/ga4_exported_session_engagement_value01.png 590w,
/static/abf78ce273672e77db31db78ebac5b9c/efc66/ga4_exported_session_engagement_value01.png 885w,
/static/abf78ce273672e77db31db78ebac5b9c/c83ae/ga4_exported_session_engagement_value01.png 1180w,
/static/abf78ce273672e77db31db78ebac5b9c/3f919/ga4_exported_session_engagement_value01.png 1771w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/abf78ce273672e77db31db78ebac5b9c/fcda8/ga4_exported_session_engagement_value01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;after&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e8ef3e63fff26f1802ee8903effbdc24/799f3/ga4_exported_session_engagement_value02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 8.783783783783782%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAXElEQVR42jWOCQoAIQwD/f87FS88wYIKZmnZDgyUEEjNOQdszhnOOcQYUUqB5iklWGsx50RrTay1goiw90YIQeR8rQWDHy333kWFbx5h7r0yorz3MMaA914e4oEPdS2ZzZi3/S4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e8ef3e63fff26f1802ee8903effbdc24/cbe2e/ga4_exported_session_engagement_value02.webp 148w,
/static/e8ef3e63fff26f1802ee8903effbdc24/3084c/ga4_exported_session_engagement_value02.webp 295w,
/static/e8ef3e63fff26f1802ee8903effbdc24/5ca24/ga4_exported_session_engagement_value02.webp 590w,
/static/e8ef3e63fff26f1802ee8903effbdc24/dad35/ga4_exported_session_engagement_value02.webp 885w,
/static/e8ef3e63fff26f1802ee8903effbdc24/2baf0/ga4_exported_session_engagement_value02.webp 1180w,
/static/e8ef3e63fff26f1802ee8903effbdc24/ee7fd/ga4_exported_session_engagement_value02.webp 1642w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e8ef3e63fff26f1802ee8903effbdc24/12f09/ga4_exported_session_engagement_value02.png 148w,
/static/e8ef3e63fff26f1802ee8903effbdc24/e4a3f/ga4_exported_session_engagement_value02.png 295w,
/static/e8ef3e63fff26f1802ee8903effbdc24/fcda8/ga4_exported_session_engagement_value02.png 590w,
/static/e8ef3e63fff26f1802ee8903effbdc24/efc66/ga4_exported_session_engagement_value02.png 885w,
/static/e8ef3e63fff26f1802ee8903effbdc24/c83ae/ga4_exported_session_engagement_value02.png 1180w,
/static/e8ef3e63fff26f1802ee8903effbdc24/799f3/ga4_exported_session_engagement_value02.png 1642w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e8ef3e63fff26f1802ee8903effbdc24/fcda8/ga4_exported_session_engagement_value02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;実際のSQLはこんな感じ（一部抜粋）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  event_date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  event_timestamp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  event_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;int_value &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ga_session_id&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e_ga_session_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;int_value &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ga_session_number&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e_ga_session_number&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;string_value &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;session_engaged&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e_session_engaged&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;string_value &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;page_title&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e_page_title
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token identifier&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;project.dataset.events_20230103&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;各種valueは&lt;code class=&quot;language-text&quot;&gt;event_params.value.string_value&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;event_params.value.int_value&lt;/code&gt;… といったように&lt;code class=&quot;language-text&quot;&gt;event_params.key&lt;/code&gt;によって値の型が異なるのでどのカラムにデータが格納されるかが変わる&lt;/p&gt;
&lt;p&gt;しかし、いくつか確認してみたところ&lt;code class=&quot;language-text&quot;&gt;session_engaged&lt;/code&gt;の場合、&lt;code class=&quot;language-text&quot;&gt;event_name&lt;/code&gt;の値によって格納されるカラム（&lt;code class=&quot;language-text&quot;&gt;int_value&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;string_value&lt;/code&gt;）が違うようだった&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f3c62e170848a95a7eb2c365769f37c3/799f3/ga4_exported_session_engagement_value03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 6.081081081081082%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAP0lEQVR42h2MQQrAQAgD+/+PipcV6iqKYFo9DIFJyENEMDN0N845YOblVV0nIphNZiIioL+frCq4+2L37sd0Hx7NTO3/H7yvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f3c62e170848a95a7eb2c365769f37c3/cbe2e/ga4_exported_session_engagement_value03.webp 148w,
/static/f3c62e170848a95a7eb2c365769f37c3/3084c/ga4_exported_session_engagement_value03.webp 295w,
/static/f3c62e170848a95a7eb2c365769f37c3/5ca24/ga4_exported_session_engagement_value03.webp 590w,
/static/f3c62e170848a95a7eb2c365769f37c3/dad35/ga4_exported_session_engagement_value03.webp 885w,
/static/f3c62e170848a95a7eb2c365769f37c3/2baf0/ga4_exported_session_engagement_value03.webp 1180w,
/static/f3c62e170848a95a7eb2c365769f37c3/ee7fd/ga4_exported_session_engagement_value03.webp 1642w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f3c62e170848a95a7eb2c365769f37c3/12f09/ga4_exported_session_engagement_value03.png 148w,
/static/f3c62e170848a95a7eb2c365769f37c3/e4a3f/ga4_exported_session_engagement_value03.png 295w,
/static/f3c62e170848a95a7eb2c365769f37c3/fcda8/ga4_exported_session_engagement_value03.png 590w,
/static/f3c62e170848a95a7eb2c365769f37c3/efc66/ga4_exported_session_engagement_value03.png 885w,
/static/f3c62e170848a95a7eb2c365769f37c3/c83ae/ga4_exported_session_engagement_value03.png 1180w,
/static/f3c62e170848a95a7eb2c365769f37c3/799f3/ga4_exported_session_engagement_value03.png 1642w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f3c62e170848a95a7eb2c365769f37c3/fcda8/ga4_exported_session_engagement_value03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  event_date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  event_timestamp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  event_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;
  &lt;span class=&quot;token identifier&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;project.dataset.events_20230103&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; event
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;session_engaged&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;なんと…&lt;/p&gt;
&lt;p&gt;迷った末いったん実際のSQLは&lt;code class=&quot;language-text&quot;&gt;session_engagement&lt;/code&gt;のみ次のような書き方でお茶を濁した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;string_value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SAFE_CAST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;int_value &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; STRING&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;session_engaged&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; e_session_engaged&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;とりあえず統一して扱えるようにはなった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ObsidianのDataviewプラグインでブログネタリストを収集する]]></title><description><![CDATA[Obsidianでメモを残し始めている 技術的な内容のメモを書いていると「これはブログネタになるかも」みたいなのが湧いてくることがある そういう時にさっと内部リンクをつけてメモを残しておく+その内容をまとめてどこかで閲覧できると良いなと思ったのでDataview…]]></description><link>https://til.swfz.io/entries/obsidian_dataview_list_with_outlink/</link><guid isPermaLink="false">https://til.swfz.io/entries/obsidian_dataview_list_with_outlink/</guid><pubDate>Sat, 17 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Obsidianでメモを残し始めている&lt;/p&gt;
&lt;p&gt;技術的な内容のメモを書いていると「これはブログネタになるかも」みたいなのが湧いてくることがある&lt;/p&gt;
&lt;p&gt;そういう時にさっと内部リンクをつけてメモを残しておく+その内容をまとめてどこかで閲覧できると良いなと思ったのでDataviewプラグインでやってみた&lt;/p&gt;
&lt;h2&gt;Dataviewプラグイン&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blacksmithgu.github.io/obsidian-dataview/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dataview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;記事のfrontmatterやタグ、ディレクトリなどの情報をもとにテーブル表示してくれるプラグイン&lt;/p&gt;
&lt;p&gt;コードブロックに&lt;code class=&quot;language-text&quot;&gt;dataview&lt;/code&gt;を指定することで表示してくれる&lt;/p&gt;
&lt;p&gt;クエリはSQLライクな書き方で問い合わせする&lt;/p&gt;
&lt;p&gt;FROMにはページのリストの単位、特定のタグやディレクトリなどを指定する&lt;/p&gt;
&lt;p&gt;条件などにファイルの更新日、ファイル名などファイルのメタデータも含められるためある程度なんでもできそう&lt;/p&gt;
&lt;p&gt;またSQLライクな書き方以外にもJavaScriptを書くこともできる&lt;/p&gt;
&lt;p&gt;その場合はコードブロックに&lt;code class=&quot;language-text&quot;&gt;dataviewjs&lt;/code&gt;を指定する&lt;/p&gt;
&lt;h2&gt;ブログネタのリストをタスクリストとして表示させる&lt;/h2&gt;
&lt;p&gt;サンプル用に次のようなメモを用意した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2022-11-29.md&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;## ToDo
- [x] [[blog]] netaA
- [ ] [[blog]] netaB
- [ ] netaC&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;sample.md&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- [ ] [[blog]] xをyしてzする&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;コードブロックの中身&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;taskList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[[blog]]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ctime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;desc&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tasks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;completed &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;outlinks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;blog&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;dv.pages&lt;/code&gt;で&lt;code class=&quot;language-text&quot;&gt;[[blog]]&lt;/code&gt;の内部リンクが存在するページを取得&lt;/li&gt;
&lt;li&gt;最新のファイルから走査するようにソート&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;file.tasks.where&lt;/code&gt;でチェックボックスのリストから特定条件のタスクを取得
&lt;ul&gt;
&lt;li&gt;未チェック&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;file.outlinks&lt;/code&gt;の中から&lt;code class=&quot;language-text&quot;&gt;display&lt;/code&gt;プロパティが&lt;code class=&quot;language-text&quot;&gt;blog&lt;/code&gt;なタスクをチェックする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;dv.taskList&lt;/code&gt;は第2引数でページごとにグループ化するかどうかのオプションを渡せる（defaultは&lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;）、&lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;を渡すと単純にページをまたいでまとめたリストとして表示できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;fileオブジェクトの中身&lt;/h3&gt;
&lt;p&gt;確かプラグインのドキュメントにも乗っていた気がするが確かめながらでもできる&lt;/p&gt;
&lt;p&gt;こんな感じのクエリを書くと&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tasks
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;blog&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
SORT &lt;span class=&quot;token keyword&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ctime &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f3c492ffd74e6d8f1b6858ae87676548/71ee9/obsidian_dataview_list_with_outlink01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 141.2162162162162%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAACXBIWXMAABYlAAAWJQFJUiTwAAACWElEQVR42q1W63qaQBDlUdrgPYoIgoJI0HgBRagJSYy552vf/xGmM4vkE3ettfTHfrqsc+bMmbODkjN7BuPqHtrWGuzJM3Td+6/9/lL6P0BzEhgvP9g57ffPVfsG6t0QpFLbh7IagIyfFOAt3kF379izcxdhMUBasjKHzuAWRsELtHoruMB9dnbOkvY3je4KDDeB8j8AcYDEsNmLoY1alNrz4oAXrTnowzswvQf4djn9PwyJHYFS6ZnIhTQstQOoakvWnCxJQUAfavoKrPEGNDuCSmfBkhQCvDQjGEy2oA/WyPQGasj4HKYcYMNAhtdbKDN2fvGSCfAqeIe6HgqZ1fA5aVw5kpDXEEsk6zTNmAuiBASoDxNoGqkUh0l5hmgZGgAaBokA63juTJ/A8hIcCGtMkNdYWPIk+vk1IESANG0IiL4fJs0BZlPDnjyhyddcObSnhMP5K7ohFmrMAVY6AdOwYURCQNLQun482jSuZCrD9d+gZYbcj+Vd02wEpKQ1AWie4U7DETZFd3DqCBhSwnH4CV3UUXTfpZa5xKxBzmcESEGKlddRVnzWDG/xho15EAOWd8wokISmidMZJOydQddQZF6qQsOpdNLY1BAqScU7LCsz+N6ccQGscdoCeqMNejY8bezUuFswnBg7uRSWlU12+e/ucsTGl2qlQdWDaVNWU3lMb8Nem6evHupj4/iqYlkin1GC/vgRr92tuCkihq7/KgTMbEMuUPuR8GUmiRjQv4dj04bK9BYfYOOAoPM/lkw+I6tM419sRFU5wNSnw9kL8yl58ZDhb+jyluJC2JjHAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f3c492ffd74e6d8f1b6858ae87676548/cbe2e/obsidian_dataview_list_with_outlink01.webp 148w,
/static/f3c492ffd74e6d8f1b6858ae87676548/3084c/obsidian_dataview_list_with_outlink01.webp 295w,
/static/f3c492ffd74e6d8f1b6858ae87676548/5ca24/obsidian_dataview_list_with_outlink01.webp 590w,
/static/f3c492ffd74e6d8f1b6858ae87676548/dad35/obsidian_dataview_list_with_outlink01.webp 885w,
/static/f3c492ffd74e6d8f1b6858ae87676548/c5fc0/obsidian_dataview_list_with_outlink01.webp 1081w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f3c492ffd74e6d8f1b6858ae87676548/12f09/obsidian_dataview_list_with_outlink01.png 148w,
/static/f3c492ffd74e6d8f1b6858ae87676548/e4a3f/obsidian_dataview_list_with_outlink01.png 295w,
/static/f3c492ffd74e6d8f1b6858ae87676548/fcda8/obsidian_dataview_list_with_outlink01.png 590w,
/static/f3c492ffd74e6d8f1b6858ae87676548/efc66/obsidian_dataview_list_with_outlink01.png 885w,
/static/f3c492ffd74e6d8f1b6858ae87676548/71ee9/obsidian_dataview_list_with_outlink01.png 1081w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f3c492ffd74e6d8f1b6858ae87676548/fcda8/obsidian_dataview_list_with_outlink01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;このようにオブジェクトの中身を表示できる&lt;/p&gt;
&lt;p&gt;もしくは、&lt;code class=&quot;language-text&quot;&gt;dataviewjs&lt;/code&gt;のコードブロックのJavaScript中に&lt;code class=&quot;language-text&quot;&gt;console.log()&lt;/code&gt;を仕込み、DeveloperToolsでオブジェクトの中身を覗くことができる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;taskList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[[blog]]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ctime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;desc&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tasks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;completed &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;outlinks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;display &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;blog&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8cf948188ee5d1b8505830edb25746c9/5c744/obsidian_dataview_list_with_outlink02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.75675675675677%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABZElEQVR42q1U2U7DMBDM//8g8IBApVKOJr7PxPawG0pB4ommltaOs/Jkdj2TrpSC+bxATQbWZWzrim3b9lgpCkeKqDmh0sr5daVczkhrwVYaeKzXc11rDcPzgPNTDynpYMWh0VVCWD4W6IuG0Q7RBRRnkROxTQmFmIUYkZkR7WNMtOZ9H4lxCMy4/AAyw+ntgmWU2Aic94cY8mRGg5lYOmVQSzkOKHuF+dTDLpe9rEOAXKIY5Ff/qFeHAXlSo8L4PsErjUZXfxgwmoSZAAMBlkf00GuP6TTBGg3nHOoBMXakE+hZQ10EgjHw3u+KvxuwbAXT6wTRC5KNQgwB0RoSdtrL556y1b7teLMm5XZ7sv22+sspjZxyEiQZc/Mu+7Zcn/8PWCr6lwFGWDxidK02GGJnhUSQAtlatHy/Fjs2uhCCRB1g6FKk1PDUR+c8/c48cqAQM1Ylkei9oQ9KKf/Ii9XBF/oJf//r+7Xf/pkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/8cf948188ee5d1b8505830edb25746c9/cbe2e/obsidian_dataview_list_with_outlink02.webp 148w,
/static/8cf948188ee5d1b8505830edb25746c9/3084c/obsidian_dataview_list_with_outlink02.webp 295w,
/static/8cf948188ee5d1b8505830edb25746c9/5ca24/obsidian_dataview_list_with_outlink02.webp 590w,
/static/8cf948188ee5d1b8505830edb25746c9/dad35/obsidian_dataview_list_with_outlink02.webp 885w,
/static/8cf948188ee5d1b8505830edb25746c9/2baf0/obsidian_dataview_list_with_outlink02.webp 1180w,
/static/8cf948188ee5d1b8505830edb25746c9/b732a/obsidian_dataview_list_with_outlink02.webp 1206w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/8cf948188ee5d1b8505830edb25746c9/12f09/obsidian_dataview_list_with_outlink02.png 148w,
/static/8cf948188ee5d1b8505830edb25746c9/e4a3f/obsidian_dataview_list_with_outlink02.png 295w,
/static/8cf948188ee5d1b8505830edb25746c9/fcda8/obsidian_dataview_list_with_outlink02.png 590w,
/static/8cf948188ee5d1b8505830edb25746c9/efc66/obsidian_dataview_list_with_outlink02.png 885w,
/static/8cf948188ee5d1b8505830edb25746c9/c83ae/obsidian_dataview_list_with_outlink02.png 1180w,
/static/8cf948188ee5d1b8505830edb25746c9/5c744/obsidian_dataview_list_with_outlink02.png 1206w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/8cf948188ee5d1b8505830edb25746c9/fcda8/obsidian_dataview_list_with_outlink02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;こんな感じで中身見ながらやるとある程度クエリが書けるようになる気がする&lt;/p&gt;
&lt;h2&gt;表示&lt;/h2&gt;
&lt;p&gt;ほぼ同じクエリで&lt;code class=&quot;language-text&quot;&gt;t.completed&lt;/code&gt;に条件を変えた（チェックした）リストも追加するとこんな感じで表示できる&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 379px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6a73e4153b39fc63ae44d338dbda942b/811d1/obsidian_dataview_list_with_outlink03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 76.35135135135135%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB0UlEQVR42pWS21PaQBjF/T9aEVEKJojBXEiAcEnIDRLSaLhKGxxbO53pdPrSh05f/b+P367ypEJ8OLO72clvzn7nHJxe+DghfZICGK0J7H6CVmeCy+YYqhHCsxOY5gQ63UnaGF0zRlnywf57TQfbDYNeBylukwXu0xXXjymtpN/LNf5++YoN3T18v90PfHLow+p/hiiP4FoJl0luJC2E3o5gtJ9cakaEUj2HQ6bjcw8lUrHmchVEBwVhyPdHtD96PpfO3TxAD1VlAlGLIZMLqRmiOZijF2RotK8gd1Po1oqf1d4cJ3VvP7BCQEGlQAiodWK07CWs8A5Kb0aQGdrOGl0/g2Gv8gB9VOSIAxsEvCCHzJlOUK0/x3HN4SqKQ1rdfDM8I4c1erLKAqBA9MGCnrhB01ry+zIT1Ytpf20ouYLo4aPo4oPgcB0KW0fOm4BXgawGAtVlFk4xoOrorQgdXu6QKrXb0QtgmQM91JURL/L/TYZfizX+ZRnS0RSH5HhXkXfOkCXNusiez1R6I8ncwEojQPUy4I62AWzn+y4g+7Eo2PCvf8JP7mH2Y1huCif+hqubPxhGdzitv9MhK6qgUg+VkJz6EGmmVXnMv50pUW6Hj75G9A1iLLIvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/6a73e4153b39fc63ae44d338dbda942b/cbe2e/obsidian_dataview_list_with_outlink03.webp 148w,
/static/6a73e4153b39fc63ae44d338dbda942b/3084c/obsidian_dataview_list_with_outlink03.webp 295w,
/static/6a73e4153b39fc63ae44d338dbda942b/8a4f3/obsidian_dataview_list_with_outlink03.webp 379w&quot;
              sizes=&quot;(max-width: 379px) 100vw, 379px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/6a73e4153b39fc63ae44d338dbda942b/12f09/obsidian_dataview_list_with_outlink03.png 148w,
/static/6a73e4153b39fc63ae44d338dbda942b/e4a3f/obsidian_dataview_list_with_outlink03.png 295w,
/static/6a73e4153b39fc63ae44d338dbda942b/811d1/obsidian_dataview_list_with_outlink03.png 379w&quot;
            sizes=&quot;(max-width: 379px) 100vw, 379px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/6a73e4153b39fc63ae44d338dbda942b/811d1/obsidian_dataview_list_with_outlink03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ObsidianのDataviewプラグインで終わったタスクリストを表示する]]></title><description><![CDATA[自分はObsidianを使っていて、タグでデイリーノートを取っている その中でToDoという項目を用意し、その日やるタスクのToDoリストを毎日作っている デイリーノートは毎日新しいファイルが作成されるので、…]]></description><link>https://til.swfz.io/entries/obsidian_dataview_done_tasklist/</link><guid isPermaLink="false">https://til.swfz.io/entries/obsidian_dataview_done_tasklist/</guid><pubDate>Wed, 14 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;自分はObsidianを使っていて、&lt;code class=&quot;language-text&quot;&gt;#daily&lt;/code&gt;タグでデイリーノートを取っている&lt;/p&gt;
&lt;p&gt;その中でToDoという項目を用意し、その日やるタスクのToDoリストを毎日作っている&lt;/p&gt;
&lt;p&gt;デイリーノートは毎日新しいファイルが作成されるので、1週間を振り返る時に毎日分のファイルを見に行かないと行けないのは不便&lt;/p&gt;
&lt;p&gt;ということでDataviewプラグインを使ってさっと確認できるようにしたい&lt;/p&gt;
&lt;h2&gt;Dataviewプラグイン&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blacksmithgu.github.io/obsidian-dataview/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dataview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;記事のfrontmatterやタグ、ディレクトリなどの情報をもとにテーブル表示してくれるプラグイン&lt;/p&gt;
&lt;p&gt;コードブロックに&lt;code class=&quot;language-text&quot;&gt;dataview&lt;/code&gt;を指定することで表示してくれる&lt;/p&gt;
&lt;p&gt;クエリはSQLライクな書き方で問い合わせする&lt;/p&gt;
&lt;p&gt;FROMにはページのリストの単位、特定のタグやディレクトリなどを指定する&lt;/p&gt;
&lt;p&gt;条件などにファイルの更新日、ファイル名などファイルのメタデータも含められるためある程度なんでもできそう&lt;/p&gt;
&lt;p&gt;またSQLライクな書き方以外にもJavaScriptを書くこともできる&lt;/p&gt;
&lt;p&gt;その場合はコードブロックに&lt;code class=&quot;language-text&quot;&gt;dataviewjs&lt;/code&gt;を指定する&lt;/p&gt;
&lt;p&gt;いくつか使いそうなのを書いてみた&lt;/p&gt;
&lt;h2&gt;ToDoリストの直近1週間やったことをリストにする&lt;/h2&gt;
&lt;p&gt;dailyタグでページのリミットを7にしただけ&lt;/p&gt;
&lt;p&gt;本当は&lt;code class=&quot;language-text&quot;&gt;where(page =&gt; page.file.ctime)&lt;/code&gt; みたいな感じでフィルタリングしたかったがうまくいかなかったのでいったんこれでお茶を濁した…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コードブロックの中身&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;taskList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#daily&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; dv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ctime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;desc&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tasks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;completed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;表示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2132907e84d73f47ad80449605bfb96a/3996e/obsidian_dataview_done_tasklist01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABMklEQVR42p2SS0/CQBSF+0tUHj4o0FoK1QIFBdvplBZpHYryjCTqQhNiXLn0lx8vE+O6ZfHlzmJy8s09o6hmgIYdQbNC1CUjIsKFGaKs+7lR7N4ESfwE5gvceQKum4CPN2i7SxTrXv7AosbowHHeCFFpRlCtexhdAc2e4PSSHxBIFqYjMAi38OM3xPMdXnc/mK6/0KDgvJZKiQxPah4K9b9JHKlDSVlnh+0wFQsEoxkYT8GDKaJkC49sq9aYDFmupysVannfcJWmanJUTB9qk5q+nuDMCOST95S0bLZKgS5rdgzHXyNM3xHNPrB8+Uafb9Chprve6p8soXKHGtlYNzMZ4LC15GrwiNvgGUbnAdUWtU8/IHPLejuBPZzT31tIk1Y/pdAVxOoTzV6KY1lQth3+AqIGT47+L4A0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2132907e84d73f47ad80449605bfb96a/cbe2e/obsidian_dataview_done_tasklist01.webp 148w,
/static/2132907e84d73f47ad80449605bfb96a/3084c/obsidian_dataview_done_tasklist01.webp 295w,
/static/2132907e84d73f47ad80449605bfb96a/5ca24/obsidian_dataview_done_tasklist01.webp 590w,
/static/2132907e84d73f47ad80449605bfb96a/f623b/obsidian_dataview_done_tasklist01.webp 648w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2132907e84d73f47ad80449605bfb96a/12f09/obsidian_dataview_done_tasklist01.png 148w,
/static/2132907e84d73f47ad80449605bfb96a/e4a3f/obsidian_dataview_done_tasklist01.png 295w,
/static/2132907e84d73f47ad80449605bfb96a/fcda8/obsidian_dataview_done_tasklist01.png 590w,
/static/2132907e84d73f47ad80449605bfb96a/3996e/obsidian_dataview_done_tasklist01.png 648w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2132907e84d73f47ad80449605bfb96a/fcda8/obsidian_dataview_done_tasklist01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;dv.pages&lt;/code&gt;で対象のファイルを取得、ソートして最新から7件取得するので過去1週間分のデイリーノートを取得できる&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;file.tasks.where&lt;/code&gt;の中の関数でチェック済みなチェックリストのアイテムのみを返す&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Obsidianのtwohop-links PluginにCSSを当てる]]></title><description><![CDATA[2ホップリンクっていうのを入れてみたかったのでプラグインを入れた tokuhirom/obsidian-2hop-links-plugin が、編集画面でレイアウト崩れが起きてしまっていた 環境  ということで無理やりだがCSS…]]></description><link>https://til.swfz.io/entries/obsidian_twohop_links_css/</link><guid isPermaLink="false">https://til.swfz.io/entries/obsidian_twohop_links_css/</guid><pubDate>Sat, 26 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2ホップリンクっていうのを入れてみたかったのでプラグインを入れた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tokuhirom/obsidian-2hop-links-plugin&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;tokuhirom/obsidian-2hop-links-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;が、編集画面でレイアウト崩れが起きてしまっていた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;環境&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Obsidian Version: v1.0.3
OS: Windows
Plugin Version: 0.9.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/92fb2bae634ee9d108e3c92aa77ce92d/71ee9/obsidian_twohop_links_css02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAADcElEQVR42oWTbVCUVRTH+d633masJmARBAUXzBCl3Rpsd1uImIaBGcLMl2UHPlDLsqHJm2awE2C8uQtI7UwzNjqJL9Fq2wLRoiOgBmUIQ4C7GC7OSIWomZH9us+DGDGMffjPOc+5z/zO/95zb0D0hlQiY1NYrnyF0Gg9wZEvk5ieT05BI1tyq9n6do2s7aZaDHm1ctz6jhTr5vL76/MKkECyVutkKaK0QiJX6uUG843mv6PjU1m9/nXWqtNQihgWkyjX5xUQEqUhRECkuFypJeK5JPGTBNERqtTJueRaIdYV8r+aB7kickF+X7LDUCHJWYzovtm4k+T0HF7Uv4k+1Ui8JlPuvOr5ZFaufZUIoRVrEnmws0UKWFxQROkJitQRuEpHkCwtz0Zs5JnwBFlPr0gQNY1o8hCg5DBYnJsyLonC4rcoL9+G1WqgqsrA5u2Z2GwNnGg5RMvhz3B9eYxc0y6Whb4kn9/SQNFNchWnTqbdaab72wLOdBTQf3YHez/IZtI3APf8zN7yAb/RdOAAjwa+QLg474cC16uScR4x0XYqH1drHl1t+RSVZOEdvMDdX35iekKAf79Cfd1+HgtSEb7mf4DrBPDkURMdLgtuZ75waaGk1IhvqI+/pkeZmRyEuxPsr7fxZIhaHpQ0IElhMfqlt3zqhIlOt4V24fJsp4XS3UaujnwPt7zcuT4stj6J3WbnkWXrCFypEYPayFNhCXIucRZcGzGU2CQseVsofM/Arh0GdhdlkZ7xBmXllQJio7amDkdzM9uMZhISN5GakU1KWhZpmTmoNBnivmoXOtQSp0rBc/h9Ljor6G/9kNG2fViL8ug548Y/eg7vULd8lo0NdnpOf8XNawNc834Hd8ZpamzkCYX6X2CguG8b1Cn0tVoZbt/HgKuScU81lXvMjFzqFaBhpv1iKLd9OD5upr+ngz+mhpm68gN/z4zRYLcvAgqH8QJ4/ng5Q19XcfFkBd5vPqKi1MzY4Hlmfx1hxi+GcntcBg5c8HDvxhg3/JfkWlPDEg7jBHDIXcXPXbVc7qxmqreemrJ3uer7Ef6cYPbmZXEPr3Pw4KeMDvbKA5qdmas5HJ/weLDqv1OOjX+NQ3U7OdpUzOf2QpyOEsy52XxxvIWeLheedid93R3s2WvliHg150678bTN1YpLy+TX8w9prdwNgi3y1gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/92fb2bae634ee9d108e3c92aa77ce92d/cbe2e/obsidian_twohop_links_css02.webp 148w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/3084c/obsidian_twohop_links_css02.webp 295w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/5ca24/obsidian_twohop_links_css02.webp 590w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/dad35/obsidian_twohop_links_css02.webp 885w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/c5fc0/obsidian_twohop_links_css02.webp 1081w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/92fb2bae634ee9d108e3c92aa77ce92d/12f09/obsidian_twohop_links_css02.png 148w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/e4a3f/obsidian_twohop_links_css02.png 295w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/fcda8/obsidian_twohop_links_css02.png 590w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/efc66/obsidian_twohop_links_css02.png 885w,
/static/92fb2bae634ee9d108e3c92aa77ce92d/71ee9/obsidian_twohop_links_css02.png 1081w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/92fb2bae634ee9d108e3c92aa77ce92d/fcda8/obsidian_twohop_links_css02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ということで無理やりだがCSSスニペットで上書きしてなんとかしてみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.obsidian/snippets/twohop-links.css&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-css line-numbers&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* カード */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.twohop-links-box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; gray&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.twohop-links-tag-header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; plum&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.twohop-links-back-links .twohop-links-connected-links-header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; orchid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.twohop-links-forward-links .twohop-links-connected-links-header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mediumvioletred&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.twohop-links-resolved .twohop-links-twohop-header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; plum&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* プレビューのテキスト */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.twohop-links-box-preview&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; whitesmoke&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 編集モードでレイアウトが崩れてしまうので直接書き換え */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.markdown-source-view.mod-cm6 .cm-content&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.markdown-source-view.mod-cm6 .cm-contentContainer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow-x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; visible&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;flex-direction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; column&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;適用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/cbda4389fdb1864ac2df93a3cec41a53/33d1d/obsidian_twohop_links_css01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 16.216216216216214%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkElEQVR42nWOzQ6CMBCE+yJeBGILFhtbkBj1ZCLSH9QEoy/g+7/BuO0VPXyZZGZ3dpk+TtCnJ2R3Q765zsjqPmmhhp/kxGprwU1ARnNM7e+Ipes2kGkhtIMwDmXjwbWFbEdUlBUqHuhnRH8hznD+jen1AauagJq+k7sxlcbl0viknMpTRvwrjCzlBarz0IcHvshBY2MD+wCPAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/cbda4389fdb1864ac2df93a3cec41a53/cbe2e/obsidian_twohop_links_css01.webp 148w,
/static/cbda4389fdb1864ac2df93a3cec41a53/3084c/obsidian_twohop_links_css01.webp 295w,
/static/cbda4389fdb1864ac2df93a3cec41a53/5ca24/obsidian_twohop_links_css01.webp 590w,
/static/cbda4389fdb1864ac2df93a3cec41a53/dad35/obsidian_twohop_links_css01.webp 885w,
/static/cbda4389fdb1864ac2df93a3cec41a53/7ed5b/obsidian_twohop_links_css01.webp 1150w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/cbda4389fdb1864ac2df93a3cec41a53/12f09/obsidian_twohop_links_css01.png 148w,
/static/cbda4389fdb1864ac2df93a3cec41a53/e4a3f/obsidian_twohop_links_css01.png 295w,
/static/cbda4389fdb1864ac2df93a3cec41a53/fcda8/obsidian_twohop_links_css01.png 590w,
/static/cbda4389fdb1864ac2df93a3cec41a53/efc66/obsidian_twohop_links_css01.png 885w,
/static/cbda4389fdb1864ac2df93a3cec41a53/33d1d/obsidian_twohop_links_css01.png 1150w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/cbda4389fdb1864ac2df93a3cec41a53/fcda8/obsidian_twohop_links_css01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;せっかくなのでカードの色も個人の好みに変えた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;適用後&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/79910edbe5183e0ec4593f87960b6a64/3dde1/obsidian_twohop_links_css03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 110.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAABYlAAAWJQFJUiTwAAADrElEQVR42o2U609bZRzH+1+oe7HNAqXQ62m5DMwQXAulhWa2BQZsFkovtHZzQNcLnF7O6Wkh1c1tbF5eGbJk1sXMxGw2mpgsM74y8TLDJM4tc/GF8Z/4+jsPMk6pxr745Dz5PT2f53d5elT99jmY+jzo7Haj3eKChnPCcOx1+OPvIJr6AAtLmwguX2NEEtcRXrnOYsq4ElWb2QGZFuMwo9U4wtBwo9BanOypRGt1wXLcB3O/Bz2DU+Be8VIi+79T7Yn2OKq342UZg52t1QaKH6DNRIcyHOxw5Z6KBf9BbXTAafdiaPAkRm0enBqfhLl3DGqTXMUoWvdQvNNqUsQJVf2mA8YuF3RWJ0zdLnCEhmUht2SkKRqEarmHdKqclZqeLDPWH1dT1AspE9bwPi+6eyYoQx9MXR509U7SgMbZLfg/6oQtJNT1uNFhHYOeG0eHeQxaswt6kjVbdkPJLezaOPanKMdoLZdejwMH35VpFLLejdQhC+XeKmkxNiGUZXoqscfsRrcCHfXG2Oemf9Qu5n5qC92Gf5M+F2poooeMNkR6Q6jZ3sZNjkfVkkXVwOMNWxD59RIyGR6p9Cqy2Rzcvnkc0dl3b8F/Ck02xM1B3OPKuMuJqFmKqBlELNhC4KU8xIKAQqGAclmC91QQRzqbEMZI+DVXwuecgDsWEXcMAuZPhLAq5lHIFZDL5SEVi/BMNSmMcyHcs67jrpWy65JQMxURsIcpw0Jjhrph9nVSTv+A0I6Ifg5faLP4tCOD252ruN2WgX8ogHSeR47PgeezEEUBJycDeKltkLK04XDHLkepp8+Fsv2w3obxE0Fkp0tI+gpITQhI+QQM2/zwng5hYiYM30wIvukgBoanMDAyDdvYLF5zzmJodBrHhrz7wnZK/QXNcaydu4pntb/woPoY27eeYPuTpzi3KKJysYIrly+jUqlgY2MdZwJvQipv4P33rlH8XVyi/bPnL9QLX2wfQDpyEY8+forvP9rGj1sP8WBrB7EAj7UcT8OQIAgiyqUSZueiWFpJQZIk5PMFlEoSwrGlRmFm8RJ+u/UMP2z9gp9u7ODnG48QJWF6LUMDEdiU5R7O+BdJmGRr+V5KRRHh6FuNJfOxK/jjsz/x8OZj7FSf4Nfq74iHaBg0lJJUJIHIpnx6PopEMsPWgiBQG0pYjC8rpkzCQ9pXEZ+TcP/D71C7eh9fbn6Drza/hX82gbNLK0hcyGA5kUYyuUrXZgGR6Hm2lktPpddwZj6GvwGwFVGwX/epPgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/79910edbe5183e0ec4593f87960b6a64/cbe2e/obsidian_twohop_links_css03.webp 148w,
/static/79910edbe5183e0ec4593f87960b6a64/3084c/obsidian_twohop_links_css03.webp 295w,
/static/79910edbe5183e0ec4593f87960b6a64/5ca24/obsidian_twohop_links_css03.webp 590w,
/static/79910edbe5183e0ec4593f87960b6a64/dad35/obsidian_twohop_links_css03.webp 885w,
/static/79910edbe5183e0ec4593f87960b6a64/5304f/obsidian_twohop_links_css03.webp 1018w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/79910edbe5183e0ec4593f87960b6a64/12f09/obsidian_twohop_links_css03.png 148w,
/static/79910edbe5183e0ec4593f87960b6a64/e4a3f/obsidian_twohop_links_css03.png 295w,
/static/79910edbe5183e0ec4593f87960b6a64/fcda8/obsidian_twohop_links_css03.png 590w,
/static/79910edbe5183e0ec4593f87960b6a64/efc66/obsidian_twohop_links_css03.png 885w,
/static/79910edbe5183e0ec4593f87960b6a64/3dde1/obsidian_twohop_links_css03.png 1018w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/79910edbe5183e0ec4593f87960b6a64/fcda8/obsidian_twohop_links_css03.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TypeScriptでvaluesのUnionを取り出す]]></title><description><![CDATA[で値の方を取り出す 与えられたオブジェクトのvalueのUnion型を作る]]></description><link>https://til.swfz.io/entries/typescript_valueof/</link><guid isPermaLink="false">https://til.swfz.io/entries/typescript_valueof/</guid><pubDate>Mon, 21 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;keyof&lt;/code&gt;で値の方を取り出す&lt;/p&gt;
&lt;p&gt;与えられたオブジェクトのvalueのUnion型を作る&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ValueOf&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;keyof&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; test &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  hoge&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  fuga&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test2&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;TestValues&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ValueOf&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; test&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// &apos;test&apos; | &apos;test2&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[JSONから構造体へ変換する]]></title><description><![CDATA[トップレベルが配列とマップの場合のUnmarshal サンプル 実行 変数宣言の部分で型を用意しているとそんなに違和感ない になるとこんがらがってしまったがまとめながら見たら特につまずきポイントもない… マップ 配列 実行]]></description><link>https://til.swfz.io/entries/go_json_unmarshal/</link><guid isPermaLink="false">https://til.swfz.io/entries/go_json_unmarshal/</guid><pubDate>Sat, 05 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;トップレベルが配列&lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt;とマップ&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;の場合のUnmarshal&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サンプル&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-go line-numbers&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;encoding/json&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; Sample &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	Hoge &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;`json:&quot;hoge&quot;`&lt;/span&gt;
	Fuga &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;`json:&quot;fuga&quot;`&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mapJson&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	str &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;`{&quot;hoge&quot;:1,&quot;fuga&quot;:&quot;piyo&quot;}`&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; data Sample
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Unmarshal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%#v\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sliceJson&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	str &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;`[{&quot;hoge&quot;:1,&quot;fuga&quot;:&quot;piyo&quot;},{&quot;hoge&quot;:2,&quot;fuga&quot;:&quot;piyopiyo&quot;}]`&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;Sample
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Unmarshal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%#v\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;mapJson&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;sliceJson&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ go run json.go
main.Sample&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Hoge:1, Fuga:&lt;span class=&quot;token string&quot;&gt;&quot;piyo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;main.Sample&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;main.Sample&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Hoge:1, Fuga:&lt;span class=&quot;token string&quot;&gt;&quot;piyo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;, main.Sample&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Hoge:2, Fuga:&lt;span class=&quot;token string&quot;&gt;&quot;piyopiyo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;変数宣言の部分で型を用意しているとそんなに違和感ない&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;interface{}&lt;/code&gt;になるとこんがらがってしまったがまとめながら見たら特につまずきポイントもない…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マップ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;var data map[string]interface{}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;配列&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;var data []map[string]interface{}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ go run json.go
map[string]interface {}{&quot;fuga&quot;:&quot;piyo&quot;, &quot;hoge&quot;:1}
[]map[string]interface {}{map[string]interface {}{&quot;fuga&quot;:&quot;piyo&quot;, &quot;hoge&quot;:1}, map[string]interface {}{&quot;fuga&quot;:&quot;piyopiyo&quot;, &quot;hoge&quot;:2}}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[文字列からgithubv4.Dateに変換する]]></title><description><![CDATA[GoでGitHub CLIの拡張を作っている際 GraphQLでProjectV2のデータ更新しようとしていた しかし、ProjectV2の日付フィールドを更新しようといろいろやったが全然うまくいかずかなり時間を溶かしてしまったので残しておく GraphQLのmutation…]]></description><link>https://til.swfz.io/entries/githubv4_date_assign/</link><guid isPermaLink="false">https://til.swfz.io/entries/githubv4_date_assign/</guid><pubDate>Sat, 29 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GoでGitHub CLIの拡張を作っている際&lt;/p&gt;
&lt;p&gt;GraphQLでProjectV2のデータ更新しようとしていた&lt;/p&gt;
&lt;p&gt;しかし、ProjectV2の日付フィールドを更新しようといろいろやったが全然うまくいかずかなり時間を溶かしてしまったので残しておく&lt;/p&gt;
&lt;h2&gt;GraphQLのmutationとパラメータを指定する部分&lt;/h2&gt;
&lt;p&gt;一部抜き出した（このコードじゃ動かない）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-go line-numbers&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mutation &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		UpdateProjectV2ItemFieldValue &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			ClientMutationID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;`graphql:&quot;updateProjectV2ItemFieldValue(input: {projectId: $projectId itemId: $itemId fieldId: $fieldId value: {date: $value}})&quot;`&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	dateString &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-10-01&quot;&lt;/span&gt;
	variables &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;projectId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;projectId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;itemId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;    graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;itemId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;fieldId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;   graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fieldId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;     dateString&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gqlclient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Mutate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Assign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;mutation&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; variables&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;DATE型のフィールド&lt;/h2&gt;
&lt;p&gt;GitHubのドキュメント&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/graphql/reference/scalars#date&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;スカラー - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上記のように文字列で投げたら怒られる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Message: Type mismatch on variable $value and argument date (ID! / Date), Locations: [{Line:1 Column:168}]&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$value&lt;/code&gt;はDate型が必要ですよと&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/shurcooL/githubv4/blob/master/scalar.go&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;githubv4/scalar.go at master · shurcooL/githubv4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;githubv4.Date&lt;/code&gt;の定義を見に行くと&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-go line-numbers&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;Date &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Time &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;となっている&lt;/p&gt;
&lt;h2&gt;型キャスト&lt;/h2&gt;
&lt;p&gt;ということで、普通にキャストすればよいかと思ったがだめだった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-go line-numbers&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mutation &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		UpdateProjectV2ItemFieldValue &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			ClientMutationID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;`graphql:&quot;updateProjectV2ItemFieldValue(input: {projectId: $projectId itemId: $itemId fieldId: $fieldId value: {date: $value}})&quot;`&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	dateString &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-09-01T00:00:00Z&quot;&lt;/span&gt;
	t&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2006-01-02T15:04:05Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dateString&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	variables &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;projectId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;projectId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;itemId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;    graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;itemId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;fieldId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;   graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fieldId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;     githubv4&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gqlclient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Mutate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Assign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;mutation&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; variables&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;型エラーで怒られる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cannot convert t (variable of type time.Time) to type githubv4.Date&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;動くコード&lt;/h2&gt;
&lt;p&gt;結局下記のようなコードで動かした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-go line-numbers&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;encoding/json&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;github.com/cli/go-gh&quot;&lt;/span&gt;
	graphql &lt;span class=&quot;token string&quot;&gt;&quot;github.com/cli/shurcooL-graphql&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;github.com/shurcool/githubv4&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;log&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; NamedDateValue &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	Date githubv4&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Date &lt;span class=&quot;token string&quot;&gt;`json:&quot;date,omitempty&quot;`&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	projectId &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;適当なIDを入れる&quot;&lt;/span&gt;
	itemId &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;適当なIDを入れる&quot;&lt;/span&gt;
	fieldId &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;適当なIDを入れる&quot;&lt;/span&gt;

	gqlclient&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; gh&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GQLClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Fatal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mutation &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		UpdateProjectV2ItemFieldValue &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			ClientMutationID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;`graphql:&quot;updateProjectV2ItemFieldValue(input: {projectId: $projectId itemId: $itemId fieldId: $fieldId value: {date: $value}})&quot;`&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	b &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;`{&quot;date&quot;:&quot;2022-09-01T00:00:00Z&quot;}`&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; v NamedDateValue
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Unmarshal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	variables &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;projectId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;projectId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;itemId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;    graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;itemId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;fieldId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;   graphql&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fieldId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;     v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gqlclient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Mutate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Assign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;mutation&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; variables&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Fatal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mutation&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;NamedDateValue&lt;/code&gt;という型を定義して&lt;code class=&quot;language-text&quot;&gt;json.Unmarshal&lt;/code&gt;で変換する&lt;/p&gt;
&lt;p&gt;この構造体は&lt;code class=&quot;language-text&quot;&gt;githubv4.Date&lt;/code&gt;型の&lt;code class=&quot;language-text&quot;&gt;Date&lt;/code&gt;フィールドを持っている&lt;/p&gt;
&lt;p&gt;GraphQLのパラメータを渡す際に&lt;code class=&quot;language-text&quot;&gt;v.Date&lt;/code&gt;で型を合うようにした&lt;/p&gt;
&lt;p&gt;もっとよい方法がありそうだが今の自分の力ではこれが限界だった&lt;/p&gt;
&lt;p&gt;ただこれを解決しないと進めなかったのでいろいろ調べて勉強にはなった&lt;/p&gt;
&lt;p&gt;ということで&lt;code class=&quot;language-text&quot;&gt;json.Unmarshal&lt;/code&gt;すごい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[シェルスクリプトで日付情報を引数から指定するorデフォルトを用いる]]></title><description><![CDATA[引数がある場合は引数を、ない場合は実行した日（または特定の日数前など）を使って後続の処理を行いたい場合のスニペット default_date.sh]]></description><link>https://til.swfz.io/entries/shellscript_default_date/</link><guid isPermaLink="false">https://til.swfz.io/entries/shellscript_default_date/</guid><pubDate>Tue, 25 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;引数がある場合は引数を、ない場合は実行した日（または特定の日数前など）を使って後続の処理を行いたい場合のスニペット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;default_date.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;arg&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${arg}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;target_date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;target_date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${arg}&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$target_date&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;❯ date +&quot;%Y-%m-%d&quot;
2022-10-24

❯ sh default_date.sh 2022-10-20
2022-10-20

❯ sh default_date.sh
2022-10-24&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[GitHub CLI拡張を作ってみる]]></title><description><![CDATA[GitHub CLI 拡張機能の作成 - GitHub Docs これを読みながら作成する 今回はGoでHelloWorld…]]></description><link>https://til.swfz.io/entries/gh_cli_extension_with_go/</link><guid isPermaLink="false">https://til.swfz.io/entries/gh_cli_extension_with_go/</guid><pubDate>Wed, 19 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/github-cli/github-cli/creating-github-cli-extensions&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub CLI 拡張機能の作成 - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これを読みながら作成する&lt;/p&gt;
&lt;p&gt;今回はGoでHelloWorldまで&lt;/p&gt;
&lt;h2&gt;ひな型の作成&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gh extension create&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--precompiled=go&lt;/code&gt;オプションや拡張名などをつけないと対話型モードでやりとりすることになる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拡張名を入力する&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? Extension name:&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;種別を選ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What kind of extension?  [Use arrows to move, type to filter]
  Script (Bash, Ruby, Python, etc)
&gt; Go
  Other Precompiled (C++, Rust, etc)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;決定するとディレクトリが作られるのでそこで開発する&lt;/p&gt;
&lt;h2&gt;ローカルインストール&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gh extension install .&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これだけで&lt;code class=&quot;language-text&quot;&gt;gh ~~~&lt;/code&gt;でコマンドが使えるようになる&lt;/p&gt;
&lt;h2&gt;中身&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;main.go&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-go line-numbers&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;github.com/cli/go-gh&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hi world, this is the gh-hoge extension!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	client&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; gh&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;RESTClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	response &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Login &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;running as %s\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Login&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// For more examples of using go-gh, see:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// https://github.com/cli/go-gh/blob/trunk/example_gh_test.go&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ちょっとした使い方と詳しくはここ見てねというリンクまで張ってくれていて親切&lt;/p&gt;
&lt;p&gt;なんとなく「こういう感じなのね」というのが把握できた&lt;/p&gt;
&lt;h2&gt;変更して実行してみる&lt;/h2&gt;
&lt;p&gt;試しにメッセージ部分の&lt;code class=&quot;language-text&quot;&gt;!&lt;/code&gt;を増やした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビルド&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;go mod tidy
go build&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gh ap
hi world, this is the gh-ap extension!!!
running as swfz&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;変更が反映された&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SlackにGitHubの更新通知を行う]]></title><description><![CDATA[SlackApp を読めばOK さらに詳しく知る場合はドキュメントを当たる integrations/slack: Bring your code to the conversations you care about with the GitHub and Slack…]]></description><link>https://til.swfz.io/entries/github_notification/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_notification/</guid><pubDate>Fri, 14 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;SlackApp&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/github help&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;を読めばOK&lt;/p&gt;
&lt;p&gt;さらに詳しく知る場合はドキュメントを当たる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/integrations/slack#subscribe-to-an-organization-or-a-repository&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;integrations/slack: Bring your code to the conversations you care about with the GitHub and Slack integration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;いくつかやったことを残しておく&lt;/p&gt;
&lt;h3&gt;特定のラベルがついたPull Requestを通知&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/github subscribe swfz/til pulls +label:&quot;article&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2022-10-15現在、ラベルは1つしかサポートしていないよう&lt;/p&gt;
&lt;h3&gt;特定ブランチへのコミットを通知&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/github subscribe swfz/til commits:master&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;デフォルトで対象になっているイベントを解除&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/github unsubscribe swfz/til issues,commits,releases,deployments&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;複数ある場合はカンマでつなげる&lt;/p&gt;
&lt;h2&gt;RSS Feed&lt;/h2&gt;
&lt;p&gt;GitHubが用意しているRSSフィードでもある程度フィルタリングした情報を購読できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特定ブランチの特定ファイルやディレクトリ（以下）の更新を取得するURL&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;https://github.com/${user}/${repo}/commits/${branch}/${path}.atom&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;ブランチの&lt;code class=&quot;language-text&quot;&gt;content/blog/entries&lt;/code&gt;以下の更新のみ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;https://github.com/swfz/til/commits/master/content/blog/entries.atom&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このあたりを&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/feed subscribe ${feedUrl}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で登録する&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/sawanoboly/items/eddc1e230657184d5121&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Githubが結構色々なatomフィードを出せるので、連携で役に立ったりする - Qiita&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[BigQueryで特定データセットに権限を付与する]]></title><description><![CDATA[特定のデータセット、特定サービスアカウントにREADやWRITE権限を与える で対象データセットの設定を出力、中身のに対象サービスアカウントのメールアドレスをと権限を追加して sample.json 確認 対象サービスアカウントで実行した bq ls…]]></description><link>https://til.swfz.io/entries/bigquery_sa_permission_from_cli/</link><guid isPermaLink="false">https://til.swfz.io/entries/bigquery_sa_permission_from_cli/</guid><pubDate>Wed, 12 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;特定のデータセット、特定サービスアカウントにREADやWRITE権限を与える&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;bq show&lt;/code&gt;で対象データセットの設定を出力、中身の&lt;code class=&quot;language-text&quot;&gt;access&lt;/code&gt;に対象サービスアカウントのメールアドレスをと権限を追加して&lt;code class=&quot;language-text&quot;&gt;bq update&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;bq show &lt;span class=&quot;token parameter variable&quot;&gt;--format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;prettyjson memo-111111:sample  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; sample.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;sample.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;access&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  ...
  ...
  ...
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;READER&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;userByEmail&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;github-actions-sample-nokey@memo-111111.iam.gserviceaccount.com&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;bq update &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; sample.json sample&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;確認&lt;/h2&gt;
&lt;p&gt;対象サービスアカウントで実行した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bq ls&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-txt line-numbers&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;  datasetId  
 ----------- 
  sample     &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;クエリ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;bq query &lt;span class=&quot;token parameter variable&quot;&gt;--nouse_legacy_sql&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;select * from sample.summary&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;+------+-------+----+
| view | title | id |
+------+-------+----+
|    3 | fuga  |  2 |
|    3 | foo   |  4 |
|    4 | piyo  |  3 |
|    5 | hoge  |  1 |
|    5 | bar   |  5 |
+------+-------+----+&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;できた&lt;/p&gt;
&lt;p&gt;最近GitHubActionsのOIDC認証でCI用のサービスアカウントに対してクエリできるようにする + データセット単位で権限を絞るところまで行ったのでメモ&lt;/p&gt;
&lt;p&gt;個人使用ならこれで問題ないかなーという感じ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[StorybookでTailwindcssを適用させる]]></title><description><![CDATA[Next.jsのアプリケーションにStorybookを入れて動かしてみたがスタイルがあたっていなかったので調べて対応した storybookのアドオンを追加する version addonの追加 .storybook/main.js .storybook/preview.js…]]></description><link>https://til.swfz.io/entries/storybook-with-tailwindcss/</link><guid isPermaLink="false">https://til.swfz.io/entries/storybook-with-tailwindcss/</guid><pubDate>Fri, 07 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Next.jsのアプリケーションにStorybookを入れて動かしてみたがスタイルがあたっていなかったので調べて対応した&lt;/p&gt;
&lt;p&gt;storybookのアドオン&lt;code class=&quot;language-text&quot;&gt;addon-postcss&lt;/code&gt;を追加する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;version&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&quot;storybook&quot;: &quot;6.5.12&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;addonの追加&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yarn add -D @storybook/addon-postcss&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;.storybook/main.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &quot;addons&quot;: [
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &quot;@storybook/addon-links&quot;,
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &quot;@storybook/addon-essentials&quot;,
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &quot;@storybook/addon-interactions&quot;,
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      name: &apos;@storybook/addon-postcss&apos;,
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      options: {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        postcssLoaderOptions: {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          implementation: require(&apos;postcss&apos;),
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        },
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      },
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    }&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;.storybook/preview.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; import &apos;../styles/globals.css&apos;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このcssファイルはTailwindcssを読み込んでいるCSSファイルを指定する&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Nodeのsharpでsvgをpngへ変換する]]></title><description><![CDATA[SVG出力されたレスポンスをPNGに変換する sharpという画像処理をやってくれるライブラリを使用した 簡単 ただdenoやCloudFlare Workersで使おうとすると使えなさそうだった]]></description><link>https://til.swfz.io/entries/svg2png_with_sharp/</link><guid isPermaLink="false">https://til.swfz.io/entries/svg2png_with_sharp/</guid><pubDate>Thu, 29 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;SVG出力されたレスポンスをPNGに変換する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token hashbang comment&quot;&gt;#!/usr/bin/env zx&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; sharp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sharp&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; svgText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://localhost:8081/sample.svg&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sharp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;svgText&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample.png&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;sharpという画像処理をやってくれるライブラリを使用した&lt;/p&gt;
&lt;p&gt;簡単&lt;/p&gt;
&lt;p&gt;ただdenoやCloudFlare Workersで使おうとすると使えなさそうだった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[react-use/useMediaを使ったときのhydrationエラー対応]]></title><description><![CDATA[Next.jsで、react-use/useMediaを使ってたらエラーがでた console 開発サーバ ググってhydrationが失敗しているのはわかった Hydrationについては下記がなるほどって感じだったので参考として貼っておく (4) React…]]></description><link>https://til.swfz.io/entries/nextjs_usemedia_hydration/</link><guid isPermaLink="false">https://til.swfz.io/entries/nextjs_usemedia_hydration/</guid><pubDate>Tue, 27 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Next.jsで、react-use/useMediaを使ってたらエラーがでた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;console&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Warning: Prop `className` did not match. Server:&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;開発サーバ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;`useMedia` When server side rendering, defaultState should be defined to prevent a hydration mismatches.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ググってhydrationが失敗しているのはわかった&lt;/p&gt;
&lt;p&gt;Hydrationについては下記がなるほどって感じだったので参考として貼っておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jp.quora.com/React%E3%81%A7%E3%81%82%E3%82%8B-Hydrate-%E3%81%A3%E3%81%A6%E4%BD%95%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;(4) Reactである「Hydrate」って何でしょうか？ - Quora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;本来やりたかったこと&lt;/h2&gt;
&lt;p&gt;PCでの表示とモバイルでの表示で&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PCでのアクセス時はサイドメニュー表示状態&lt;/li&gt;
&lt;li&gt;モバイルでのアクセス時はサイドメニュー非表示状態&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を実現したかった&lt;/p&gt;
&lt;p&gt;この文脈ではPC=画面幅640px以上、モバイル=画面幅640px以下のことを指す&lt;/p&gt;
&lt;h2&gt;該当箇所のやっていたこと&lt;/h2&gt;
&lt;p&gt;該当箇所はサイドメニューのopen/closeを&lt;code class=&quot;language-text&quot;&gt;useMedia&lt;/code&gt;で得られる値をもとに実現していた&lt;/p&gt;
&lt;p&gt;useMediaで640pxをしきい値にしてその値をサイドメニューのopen/closeに使う&lt;/p&gt;
&lt;p&gt;具体的には次のようなコード&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useState&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ReactNode&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MouseEvent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useEffect &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useMedia &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react-use&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isWide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;(min-width: 640px)&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;isOpen&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setIsOpen&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isWide&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;togglOpen&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; MouseEvent&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SVGElement&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setIsOpen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;isOpen&lt;/code&gt;でメニューが開いている状態&lt;/p&gt;
&lt;h2&gt;useMediaについて&lt;/h2&gt;
&lt;p&gt;useMediaについてGitHubを見に行くと&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/streamich/react-use/blob/master/docs/useMedia.md&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;react-use/useMedia.md at master · streamich/react-use&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;defaultStateパラメータは、サーバーサイドレンダリングのフォールバックとしてのみ使用されます。
サーバーサイドレンダリングでは、このパラメータを設定することが重要です。このパラメータを設定しないと、サーバーの初期状態が false にフォールバックしますが、クライアントはメディアクエリの結果で初期化されるからです。Reactがサーバレンダリングをハイドレートする際、クライアントの状態と一致しない場合があります。これがなぜ高価なバグにつながるかについては、Reactのドキュメントを参照してください&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;なるほどこれが原因でhydrationエラーが発生しているのかということはわかった&lt;/p&gt;
&lt;p&gt;ドキュメント読んどけ案件…&lt;/p&gt;
&lt;p&gt;が、デフォルト値を指定すると（false）PCモバイルどちらも同じ挙動になってしまう…&lt;/p&gt;
&lt;h2&gt;対策&lt;/h2&gt;
&lt;p&gt;具体的なコードで言うと下記のようにすることで対応した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useState&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ReactNode&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MouseEvent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useEffect &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useMedia &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react-use&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isWide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;(min-width: 640px)&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;isOpen&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setIsOpen&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isWide&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setIsOpen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isWide&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;isWide&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;togglOpen&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; MouseEvent&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SVGElement&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setIsOpen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;差分は下記2つのPR&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/tools/pull/256/files&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;fix: Detects changes in useMedia hook and switches menu toggle by swfz · Pull Request #256 · swfz/tools&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/tools/pull/255/files&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;fix: following hydration mismatch by swfz · Pull Request #255 · swfz/tools&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;useMediaは&lt;code class=&quot;language-text&quot;&gt;defaultState: false&lt;/code&gt;でデフォルト値を指定、指定することでhydration時にはエラーが起きなくなる&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;PCの場合（幅640px以上の場合）、クライアントサイドでレンダリングされた後にuseMediaで取得する&lt;code class=&quot;language-text&quot;&gt;isWide&lt;/code&gt;の値が変わるのでuseEffectで変更を検知して再レンダリングでメニューのopen/closeを反映するようにした…&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;最近本件以外でもReactを使っているプロジェクトでhydrationエラーが出て対応しないと…って感じでこの辺のしくみや流れを把握していないといけないの結構たいへんだな…&lt;/p&gt;
&lt;p&gt;前提として知っておくべき知識が結構あるかもな…という感想を持ちました&lt;/p&gt;</content:encoded></item><item><title><![CDATA[自分のリポジトリからリリースがあるリポジトリを取得する]]></title><description><![CDATA[GitHubのプロフィールのREADMEを自動生成したいと思ってawesome profileとか眺めてた その中で「自身の管理下にあるリポジトリのreleases…]]></description><link>https://til.swfz.io/entries/gh_cli_released/</link><guid isPermaLink="false">https://til.swfz.io/entries/gh_cli_released/</guid><pubDate>Sat, 24 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHubのプロフィールのREADMEを自動生成したいと思ってawesome profileとか眺めてた&lt;/p&gt;
&lt;p&gt;その中で「自身の管理下にあるリポジトリのreleases一覧を取ってきて自分のプロダクトの直近リリース」として、リスト化しているコードを見かけた&lt;/p&gt;
&lt;p&gt;なるほどそういう利用方法もあるなーと思ったのでとりあえず自分でもリリース一覧を出してみた（そんなに多くなかった…）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$endCursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token object&quot;&gt;viewer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property-query&quot;&gt;repositories&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;privacy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PUBLIC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;after&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$endCursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token object&quot;&gt;pageInfo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;hasNextPage&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;endCursor&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;url&lt;/span&gt;
        &lt;span class=&quot;token property-query&quot;&gt;releases&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;totalCount&lt;/span&gt;
          &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;publishedAt&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;url&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ gh api graphql &lt;span class=&quot;token parameter variable&quot;&gt;--paginate&lt;/span&gt;  &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; graphql/releases.graphql&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; releases.json
$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; releases.json&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;jq &lt;span class=&quot;token string&quot;&gt;&apos;.data.viewer.repositories.nodes|.[]|select(.releases.totalCount&gt;0)|{repo: .name, url: .url, version: .releases.nodes[0].name, published: .releases.nodes[0].publishedAt}&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hatenablog_publisher&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/swfz/hatenablog_publisher&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;v0.3.0&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;published&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-05-07T18:34:07Z&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chrome-extension-google-slide-usertool-comment-stream&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/swfz/chrome-extension-google-slide-usertool-comment-stream&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;v2.0.2&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;published&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-08-31T01:38:49Z&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;repo&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chrome-extension-copy-markdown-and-hatenablog-embed-link&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/swfz/chrome-extension-copy-markdown-and-hatenablog-embed-link&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;v1.0.0&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;published&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-08-24T11:17:08Z&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--paginate&lt;/code&gt;を入れているのは、リリースが多くなかったとしてもリポジトリ一覧を呼び出すクエリのため100件以上リポジトリがある場合はページングさせる必要がある&lt;/p&gt;
&lt;p&gt;その中から、jqでリリースがあるリポジトリだけ抜き出している&lt;/p&gt;
&lt;p&gt;かなり簡単にデータを取ってこれた&lt;/p&gt;
&lt;p&gt;GitHub CLI便利だが、CI/CD用途で使うにはチェック対象のリポジトリすべてReadできる権限が必要&lt;/p&gt;
&lt;p&gt;Appsで対象リポジトリを限定するとかしないといけないので少し面倒…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[querySelectorで対象要素以下の要素を取得する]]></title><description><![CDATA[XPathでいうのような指定方法 直下の子要素を指定するしか知らなかったが下記のようにスペース区切りにするだけで孫要素以下も含めた子要素を対象にできる 子孫結合子 - CSS: カスケーディングスタイルシート | MDN ということでXPathでのをquerySelector…]]></description><link>https://til.swfz.io/entries/queryselector_descendant_combinator/</link><guid isPermaLink="false">https://til.swfz.io/entries/queryselector_descendant_combinator/</guid><pubDate>Fri, 16 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;XPathでいう&lt;code class=&quot;language-text&quot;&gt;div//span&lt;/code&gt;のような指定方法&lt;/p&gt;
&lt;p&gt;直下の子要素を指定する&lt;code class=&quot;language-text&quot;&gt;&gt;&lt;/code&gt;しか知らなかったが下記のようにスペース区切りにするだけで孫要素以下も含めた子要素を対象にできる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/CSS/Descendant_combinator&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;子孫結合子 - CSS: カスケーディングスタイルシート | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ということでXPathでの&lt;code class=&quot;language-text&quot;&gt;div//span&lt;/code&gt;をquerySelectorで表すと&lt;code class=&quot;language-text&quot;&gt;div span&lt;/code&gt;でOK&lt;/p&gt;
&lt;p&gt;ちなみにXPathでの&lt;code class=&quot;language-text&quot;&gt;div/span&lt;/code&gt;がquerySelectorでは&lt;code class=&quot;language-text&quot;&gt;div &gt; span&lt;/code&gt;にあたる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Next.jsで静的ファイルだけ使えるようにする]]></title><description><![CDATA[Next.jsでbuildした後ホスティングサービスへ配信する際の成果物指定の方法 デフォルトの挙動として、ではSSRなどサーバ側も含めてビルドした成果物をに配置する Advanced Features: Static HTML Export | Next.js…]]></description><link>https://til.swfz.io/entries/nextjs_export/</link><guid isPermaLink="false">https://til.swfz.io/entries/nextjs_export/</guid><pubDate>Sun, 11 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Next.jsでbuildした後ホスティングサービスへ配信する際の成果物指定の方法&lt;/p&gt;
&lt;p&gt;デフォルトの挙動として、&lt;code class=&quot;language-text&quot;&gt;next build&lt;/code&gt;ではSSRなどサーバ側も含めてビルドした成果物を&lt;code class=&quot;language-text&quot;&gt;.next&lt;/code&gt;に配置する&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nextjs.org/docs/advanced-features/static-html-export&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Advanced Features: Static HTML Export | Next.js&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;静的ファイルのみをホストしたい場合、デフォルトの&lt;code class=&quot;language-text&quot;&gt;.next&lt;/code&gt;を指定しても静的ファイルを配信できる状態ではないので配信できない&lt;/p&gt;
&lt;p&gt;しらなかった…&lt;/p&gt;
&lt;h2&gt;静的ファイルだけでOKな場合（SSG）&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;next export&lt;/code&gt;で静的ファイルを&lt;code class=&quot;language-text&quot;&gt;out&lt;/code&gt;に置き、&lt;code class=&quot;language-text&quot;&gt;out&lt;/code&gt;ディレクトリをサーブすることでページを閲覧できるようになる&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;なのでサーバサイドでの処理が不要な場合は公式の通り&lt;code class=&quot;language-text&quot;&gt;next build &amp;amp;&amp;amp; next export&lt;/code&gt;で静的ファイルだけを&lt;code class=&quot;language-text&quot;&gt;out&lt;/code&gt;ディレクトリに置き、ホスティングサービスのGit連携で成果物があるディレクトリを指定する&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;今までNext.jsで作成したサイトはVercelでしか配信したことなかったのでVercelがよしなにやってくれていたようだ&lt;/p&gt;
&lt;p&gt;今回Cloudflare Pagesで配信する際にこれを知らずにつまずいた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[next-pwaの設定方法が5.6で変わった]]></title><description><![CDATA[Renovate対応してたらビルドエラーが発生してたので調べて対応した が5.5.5 -> 5.6.0の更新でコケていた エラーとしては次のような文言 RenovateのPRからリリースの差分に飛んでみたらREADMEにも変更あるし使い方が変わったよう Renovate Bot…]]></description><link>https://til.swfz.io/entries/next_pwa_changed_configuration_for_5-6/</link><guid isPermaLink="false">https://til.swfz.io/entries/next_pwa_changed_configuration_for_5-6/</guid><pubDate>Wed, 07 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Renovate対応してたらビルドエラーが発生してたので調べて対応した&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;next-pwa&lt;/code&gt;が5.5.5 -&gt; 5.6.0の更新でコケていた&lt;/p&gt;
&lt;p&gt;エラーとしては次のような文言&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Failed to compile.

Please check your GenerateSW plugin configuration:
[WebpackGenerateSW] &apos;reactStrictMode&apos; property is not expected to be here. Did you mean property &apos;exclude&apos;? &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Failed to compile.

Please check your GenerateSW plugin configuration:
[WebpackGenerateSW] &apos;pwa&apos; property is not expected to be here.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;RenovateのPRからリリースの差分に飛んでみたらREADMEにも変更あるし使い方が変わったよう&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://app.renovatebot.com/package-diff?name=next-pwa&amp;#x26;from=5.5.5&amp;#x26;to=5.6.0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Renovate Bot Package Diff&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ということでREADMEを見ながら設定を変えた&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;runtimeCaching&lt;/code&gt;はデフォルトで使用するらしいのと特に設定をカスタムしているわけではなかったので外した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;/** @type {import(&apos;next&apos;).NextConfig} */
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;const withPWA = require(&apos;next-pwa&apos;);
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;const runtimeCaching = require(&apos;next-pwa/cache&apos;);
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;const withPWA = require(&apos;next-pwa&apos;)({
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  dest: &apos;public&apos;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;})
&lt;/span&gt;
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;module.exports = withPWA({
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;  reactStrictMode: true,
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;  pwa: {
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;    dest: &apos;public&apos;,
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;    runtimeCaching,
&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;  },
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  reactStrictMode: true
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;});&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;無事ビルドできるようになった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub ProjectsのItemを一括Archive]]></title><description><![CDATA[Projects自体はItemが1200件までしか作れない、それ以上扱いたい場合は既存のItemをDelete or Archiveしなければならない なのでArchiveするという選択肢になるが、今度は2022-08-31時点ではArchiveするAPI（mutation…]]></description><link>https://til.swfz.io/entries/github_projects_batch_archive/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_projects_batch_archive/</guid><pubDate>Sun, 04 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Projects自体はItemが1200件までしか作れない、それ以上扱いたい場合は既存のItemをDelete or Archiveしなければならない&lt;/p&gt;
&lt;p&gt;なのでArchiveするという選択肢になるが、今度は2022-08-31時点ではArchiveするAPI（mutation）がない&lt;/p&gt;
&lt;p&gt;GUIの中でBoardViewだと各リストに一括Archiveできる機能もあるがStatusかIteration単位でしかグループ化できない&lt;/p&gt;
&lt;p&gt;なのでIterationを設定する前のItemについては一括で扱うしかない状態になってしまう&lt;/p&gt;
&lt;p&gt;Iteration設定されていないものを一括でArchiveするのもなんとなく嫌だなと思ったので&lt;/p&gt;
&lt;p&gt;雑だが簡単なコードを書いた&lt;/p&gt;
&lt;h2&gt;consoleでの一回の操作&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.menu-trigger&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;[data-test-id=&quot;row-menu-archive&quot;]&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;//button[text()=&quot;Archive&quot;]&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;メニューを出して&lt;/li&gt;
&lt;li&gt;Archiveをクリックして&lt;/li&gt;
&lt;li&gt;Confirmする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というながれを一番上のItemで行うためのコード&lt;/p&gt;
&lt;h2&gt;まとめて操作&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;archive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.menu-trigger&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;[data-test-id=&quot;row-menu-archive&quot;]&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;//button[text()=&quot;Archive&quot;]&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; XPathResult&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;FIRST_ORDERED_NODE_TYPE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;singleNodeValue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;一番上のItemをArchiveする操作を関数にまとめ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;archive&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;定期実行することでたまっているItemを自動でArchiveする&lt;/p&gt;
&lt;p&gt;使い方としてはある程度フィルタリングして全件Archive&lt;/p&gt;
&lt;p&gt;あと全部ArchiveされるとItemがない状態になるので実行時エラーになる&lt;/p&gt;
&lt;p&gt;丁寧にやるならエラーをキャッチしてclearIntervalまでしてあげれば良さそうだが…&lt;/p&gt;
&lt;h2&gt;XPath周りでの差分&lt;/h2&gt;
&lt;p&gt;関数化するとdevtoolで便利な&lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt;が使えないので一部修正した&lt;/p&gt;
&lt;p&gt;さらにXPath周りはちょっと勝手が違った&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/XPath/Introduction_to_using_XPath_in_JavaScript&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;JavaScript での XPath の利用の手引き - XPath | MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ただ単に&lt;code class=&quot;language-text&quot;&gt;document.evaluate&lt;/code&gt;するだけだと&lt;code class=&quot;language-text&quot;&gt;click()&lt;/code&gt;できるNodeが返却値に含まれない&lt;/p&gt;
&lt;p&gt;オプションで返却値の指定をしてNodeを取れるようにしてからノードを取得、クリックといった処理になった&lt;/p&gt;
&lt;p&gt;今回は初回に見つかったNodeだけを取得したいので&lt;code class=&quot;language-text&quot;&gt;FIRST_ORDERED_NODE_TYPE&lt;/code&gt;を指定し&lt;code class=&quot;language-text&quot;&gt;sinbleNodeValue&lt;/code&gt;でNodeを取得した&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hiveパーティショニングモードでbq load]]></title><description><![CDATA[Lakeにデータを置いた日付をBQ上でカラムとして扱いたかったのでHiveパーティショニングモードでbq loadした時のメモ , は適宜読み替える 最初に環境変数へ入れておいたりしておくとよいかも GCS…]]></description><link>https://til.swfz.io/entries/bq_load_with_hive_partition/</link><guid isPermaLink="false">https://til.swfz.io/entries/bq_load_with_hive_partition/</guid><pubDate>Wed, 31 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lakeにデータを置いた日付をBQ上でカラムとして扱いたかったのでHiveパーティショニングモードでbq loadした時のメモ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;${BUCKET_NAME}&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;${GOOGLE_PROJECT}&lt;/code&gt;は適宜読み替える&lt;/p&gt;
&lt;p&gt;最初に環境変数へ入れておいたりしておくとよいかも&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;BUCKET_NAME&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;hoge
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;GOOGLE_PROJECT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sample-project&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;GCS側のディレクトリ構造&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gsutil &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/
gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/dt&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-02-15/
gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/dt&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-02-25/
gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/dt&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-02-26/
gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/dt&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-02-27/
gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/dt&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-03-04/
gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/dt&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-04-01/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;xx=yy&lt;/code&gt;という形式でオブジェクトを配置することでよしなにパーティショニングしてくれる&lt;/p&gt;
&lt;p&gt;各ディレクトリにはCSVが置いてある&lt;/p&gt;
&lt;p&gt;今回の例ではresponseというカラムにAPIのレスポンスがすべて入っているという感じ（JSON型を使ってみたかった）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;schema.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NULLABLE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JSON&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;load&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;bq load &lt;span class=&quot;token parameter variable&quot;&gt;--replace&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--source_format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;CSV &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--hive_partitioning_mode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;AUTO &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--hive_partitioning_source_uri_prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/ &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;${GOOGLE_PROJECT}&lt;/span&gt;:sample_datalake.test_raw_items &lt;span class=&quot;token string&quot;&gt;&quot;gs://&lt;span class=&quot;token variable&quot;&gt;${BUCKET_NAME}&lt;/span&gt;/items/*.csv&quot;&lt;/span&gt; ./schema.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;結果&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ bq show &lt;span class=&quot;token parameter variable&quot;&gt;--format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;prettyjson sample_datalake.test_raw_items
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;creationTime&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1661458822114&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;etag&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hODI6PUMYlQYOpdjjEYedQ==&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sample-project:sample_datalake.test_raw_items&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bigquery#table&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;lastModifiedTime&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1661458822114&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;location&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;asia-northeast1&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;numActiveLogicalBytes&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;27655304&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;numBytes&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;27655304&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;numLongTermBytes&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;numLongTermLogicalBytes&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;numRows&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;471&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;numTotalLogicalBytes&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;27655304&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;schema&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;fields&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NULLABLE&quot;&lt;/span&gt;,
        &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;response&quot;&lt;/span&gt;,
        &lt;span class=&quot;token string&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JSON&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NULLABLE&quot;&lt;/span&gt;,
        &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dt&quot;&lt;/span&gt;,
        &lt;span class=&quot;token string&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;DATE&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;selfLink&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://bigquery.googleapis.com/bigquery/v2/projects/sample-project/datasets/sample_datalake/tables/test_raw_items&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;tableReference&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;datasetId&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sample_datalake&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;projectId&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sample-project&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;tableId&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test_raw_items&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;TABLE&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでOK&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;dt&lt;/code&gt;を日付としてクエリできるようになった&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/bigquery/docs/hive-partitioned-loads-gcs?hl=ja#bq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;外部パーティション分割データの読み込み  |  BigQuery  |  Google Cloud&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub APIのRateLimit]]></title><description><![CDATA[GitHubのAPIを使いだすと割と早くRateLimitに引っかかる rate limit そしてRateLimitにあたってしまったときに、いつ使えるようになるのか?が知りたい GitHubのCLI…]]></description><link>https://til.swfz.io/entries/github_rate_limit/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_rate_limit/</guid><pubDate>Sat, 27 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHubのAPIを使いだすと割と早くRateLimitに引っかかる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rate limit&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gh: API rate limit exceeded for user ID xxxxxxxx.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;そしてRateLimitにあたってしまったときに、いつ使えるようになるのか?が知りたい&lt;/p&gt;
&lt;p&gt;GitHubのCLIにずばりそのものの機能がある&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gh api rate_limit
{
  &quot;resources&quot;: {
    &quot;core&quot;: {
      &quot;limit&quot;: 5000,
      &quot;used&quot;: 58,
      &quot;remaining&quot;: 4942,
      &quot;reset&quot;: 1661532628
    },
    &quot;search&quot;: {
      &quot;limit&quot;: 30,
      &quot;used&quot;: 0,
      &quot;remaining&quot;: 30,
      &quot;reset&quot;: 1661531080
    },
    &quot;graphql&quot;: {
      &quot;limit&quot;: 5000,
      &quot;used&quot;: 4888,
      &quot;remaining&quot;: 112,
      &quot;reset&quot;: 1661532952
    },
    &quot;integration_manifest&quot;: {
      &quot;limit&quot;: 5000,
      &quot;used&quot;: 0,
      &quot;remaining&quot;: 5000,
      &quot;reset&quot;: 1661534620
    },
    &quot;source_import&quot;: {
      &quot;limit&quot;: 100,
      &quot;used&quot;: 0,
      &quot;remaining&quot;: 100,
      &quot;reset&quot;: 1661531080
    },
    &quot;code_scanning_upload&quot;: {
      &quot;limit&quot;: 1000,
      &quot;used&quot;: 0,
      &quot;remaining&quot;: 1000,
      &quot;reset&quot;: 1661534620
    },
    &quot;actions_runner_registration&quot;: {
      &quot;limit&quot;: 10000,
      &quot;used&quot;: 0,
      &quot;remaining&quot;: 10000,
      &quot;reset&quot;: 1661534620
    },
    &quot;scim&quot;: {
      &quot;limit&quot;: 15000,
      &quot;used&quot;: 0,
      &quot;remaining&quot;: 15000,
      &quot;reset&quot;: 1661534620
    },
    &quot;dependency_snapshots&quot;: {
      &quot;limit&quot;: 100,
      &quot;used&quot;: 0,
      &quot;remaining&quot;: 100,
      &quot;reset&quot;: 1661531080
    }
  },
  &quot;rate&quot;: {
    &quot;limit&quot;: 5000,
    &quot;used&quot;: 58,
    &quot;remaining&quot;: 4942,
    &quot;reset&quot;: 1661532628
  }
}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;各リソースごとにどのような状況かが返ってくる&lt;/p&gt;
&lt;p&gt;各リソース部分の&lt;code class=&quot;language-text&quot;&gt;reset&lt;/code&gt;がいつリセットされるかのエポック秒となっている&lt;/p&gt;
&lt;p&gt;なので&lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt;コマンドで変換して見てあげるといつか分かる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ date -d @1661532952 +&quot;%Y-%m-%d %H:%M:%S&quot;
2022-08-27 01:55:52&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;つなげるとこんな感じ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gh api rate_limit | jq &apos;.resources.graphql.reset&apos; | xargs -i date -d @{} +&quot;%Y-%m-%d %H:%M:%S&quot;
2022-08-27 01:55:52&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;大人しく待ちましょう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Jestのスナップショットテスト]]></title><description><![CDATA[Jestのスナップショットテストの話 検索するといろいろ方法が出てくるがを使って行う記事が多いように思う Jestの公式ドキュメントにもそういう例が書いてあった 最初は素直に真似ていたがほかにも方法があるようだったのでメモを残しておく react-test-enderer…]]></description><link>https://til.swfz.io/entries/jest_snapshottest/</link><guid isPermaLink="false">https://til.swfz.io/entries/jest_snapshottest/</guid><pubDate>Mon, 22 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jestのスナップショットテストの話&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;検索するといろいろ方法が出てくるが&lt;code class=&quot;language-text&quot;&gt;react-test-renderer&lt;/code&gt;を使って行う記事が多いように思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;Jestの公式ドキュメントにもそういう例が書いてあった&lt;/p&gt;
&lt;p&gt;最初は素直に真似ていたがほかにも方法があるようだったのでメモを残しておく&lt;/p&gt;
&lt;h2&gt;react-test-endererを使う方法&lt;/h2&gt;
&lt;p&gt;よく記事で出てくるパターン&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;renderer&lt;/code&gt;をimportして&lt;code class=&quot;language-text&quot;&gt;renderer.create()&lt;/code&gt;+&lt;code class=&quot;language-text&quot;&gt;toJSON()&lt;/code&gt;で生成した値を使用する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; renderer &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react-test-renderer&quot;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; tree &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; renderer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Archive&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Archive&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toJSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tree&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Snapshot Testのドキュメント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://jestjs.io/docs/snapshot-testing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Snapshot Testing · Jest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ドキュメントを読んだ&lt;/p&gt;
&lt;p&gt;次の箇所&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jestjs.io/docs/snapshot-testing#does-snapshot-testing-only-work-with-react-components&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Snapshot Testing · Jest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;スナップショットテストの対象について&lt;/p&gt;
&lt;p&gt;要はシリアライズされた値であれば何を渡してもOKっぽい&lt;/p&gt;
&lt;p&gt;例としてUIテストがケースとして良いので使っているだけってことのよう&lt;/p&gt;
&lt;p&gt;スナップショットテストとしては、変更によってスナップショットと差分が出たかどうかだけをチェックしているということ&lt;/p&gt;
&lt;p&gt;なので&lt;/p&gt;
&lt;p&gt;Testing Libraryの&lt;code class=&quot;language-text&quot;&gt;getBy....&lt;/code&gt;で取得できる要素を直接渡してもOK&lt;/p&gt;
&lt;p&gt;Testing Libraryのrenderで返ってくる変数の&lt;code class=&quot;language-text&quot;&gt;container&lt;/code&gt;をそのまま使用してもOK&lt;/p&gt;
&lt;p&gt;オブジェクトを渡してもOK&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;なるほど!これなら活用範囲はほかにもありそうだなという感想を持ったので覚えておこうと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;h2&gt;Testing Libraryのrenderの返却値で行う方法&lt;/h2&gt;
&lt;p&gt;本題に戻り、今回はReactのUIテストでクリックだったりイベントをいくつか発行させた後の状態をスナップショットテストしたかった&lt;/p&gt;
&lt;p&gt;なのでTesting Libraryで使う値を使ってスナップショットテストを行った&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@testing-library/react&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; userEvent &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@testing-library/user-event&quot;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; userEvent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      container&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      getByTestId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      getAllByTestId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Search&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Search&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; searchInput &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getByPlaceholderText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Search&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;searchInput&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;container&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;例だと&lt;code class=&quot;language-text&quot;&gt;container&lt;/code&gt;をスナップショットテストに使用した&lt;/p&gt;
&lt;p&gt;イベント発行後のDOMの内容に差分が出てないかをチェックしている&lt;/p&gt;</content:encoded></item><item><title><![CDATA[mswのモックをjestのテストでも使う]]></title><description><![CDATA[開発用に定義したmswの設定をJestでも使いたい案件 参考のまんまだけどめちゃくちゃ簡単だった テスト用のファイルに下記のように書くだけ search.tsx handler.ts…]]></description><link>https://til.swfz.io/entries/jest_with_msw/</link><guid isPermaLink="false">https://til.swfz.io/entries/jest_with_msw/</guid><pubDate>Fri, 19 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;開発用に定義したmswの設定をJestでも使いたい案件&lt;/p&gt;
&lt;p&gt;参考のまんまだけどめちゃくちゃ簡単だった&lt;/p&gt;
&lt;p&gt;テスト用のファイルに下記のように書くだけ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;search.tsx&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; handlers &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;../../mocks/handler&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Search&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; userEvent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; server &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setupServer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;handlers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;検索UIのテスト&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// mswでのモックレスポンスが適用される&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;handler.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; rest &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;msw&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; setupServer &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;msw/node&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; handlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://example.com/*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;setupServer&lt;/code&gt;で事前定義した&lt;code class=&quot;language-text&quot;&gt;handlers&lt;/code&gt;を読ませ&lt;code class=&quot;language-text&quot;&gt;beforeEach&lt;/code&gt;で各テストの実行前にサーバ起動する&lt;/p&gt;
&lt;p&gt;終わったら落とすようにしている&lt;/p&gt;
&lt;p&gt;これだけでよい&lt;/p&gt;
&lt;p&gt;とても楽&lt;/p&gt;
&lt;p&gt;開発時とテスト時で同じ設定を使えるのもメンテナンス上とてもよい&lt;/p&gt;
&lt;p&gt;外部へのリクエストが発生する機能はどんどん活用していくモチベーションが上がった&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/shibukawa/items/4d431ee4f98c80b682ec&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Jest + @testing-library/react + mswのtips - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Algoliaのレスポンスをmswでモックして開発ではダミーレスポンスを扱う]]></title><description><![CDATA[Algoliaの検索リクエストをmswでモックした 開発時は検索用のAPIキーを登録せずにインデックスへのアクセスもしないようにすれば良くない？ 空レスポンスを返すようにしておけば良くない？ みたいな話はあるものの、検索にかかるUI…]]></description><link>https://til.swfz.io/entries/algolia_mock_with_msw/</link><guid isPermaLink="false">https://til.swfz.io/entries/algolia_mock_with_msw/</guid><pubDate>Fri, 12 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Algoliaの検索リクエストをmswでモックした&lt;/p&gt;
&lt;p&gt;開発時は検索用のAPIキーを登録せずにインデックスへのアクセスもしないようにすれば良くない？&lt;/p&gt;
&lt;p&gt;空レスポンスを返すようにしておけば良くない？&lt;/p&gt;
&lt;p&gt;みたいな話はあるものの、検索にかかるUI部分を開発するならある程度実際にリクエストした時のレスポンスが欲しくなる&lt;/p&gt;
&lt;p&gt;かと言ってAlgoliaに毎度リクエストさせてしまうと無料枠がどんどん減っていく…&lt;/p&gt;
&lt;p&gt;ということで、mswで解決した&lt;/p&gt;
&lt;h2&gt;やっていること&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;実際のレスポンスデータをdev toolsのNetworkからレスポンス内容を取得してきてJSONに保存
&lt;ul&gt;
&lt;li&gt;特定文字列(&lt;code class=&quot;language-text&quot;&gt;BigQuery&lt;/code&gt;)を順次入力した場合のレスポンスを逐次取得
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;B&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Bi&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Big&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;BigQ&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;BigQu&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;BigQue&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;BigQuer&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;BigQuery&lt;/code&gt;と入力した際のレスポンス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;先工程で保存したJSONをmswを用いて返すように設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「検索文字列の変化によっって返ってくる件数や内容が変わる」というのを再現したかったので固定値ではあるが検索文字列が変化した場合は文字数にあったレスポンスがmsw経由で返るようにした&lt;/p&gt;
&lt;p&gt;実際のコードは下記&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;handler.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; rest &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;msw&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query0Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-0-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query1Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-1-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query2Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-2-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query3Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-3-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query4Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-4-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query5Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-5-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query6Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-6-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query7Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-7-words.json&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; query8Words &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./algolia-search-response-8-words.json&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; handlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://*.algolia.net/1/indexes/*/queries&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; empty &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; query0Words

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wordCountResponseMap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      empty&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;// 空&lt;/span&gt;
      query1Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// B&lt;/span&gt;
      query2Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Bi&lt;/span&gt;
      query3Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Big&lt;/span&gt;
      query4Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// BigQ&lt;/span&gt;
      query5Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// BigQu&lt;/span&gt;
      query6Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// BigQue&lt;/span&gt;
      query7Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// BigQuer&lt;/span&gt;
      query8Words&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// BigQuery&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; bodyString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bodyString&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;empty&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; body &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bodyString&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;requests&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; query&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;query &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
      params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
      params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; wordCountResponseMap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;empty&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wordCountResponseMap&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;import&lt;/code&gt;している実際のレスポンスを保存したJSONはAlgoliaでの設定などにより変わるのでここでは割愛する&lt;/p&gt;
&lt;p&gt;Algoliaのレスポンスを完全再現はできないので次のような挙動にしている&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;ul&gt;
&lt;li&gt;どの文字列を入力したとしても開発時は&lt;code class=&quot;language-text&quot;&gt;BigQuery&lt;/code&gt;と入力した場合のレスポンスを返す&lt;/li&gt;
&lt;li&gt;検索文字列の入力文字数によってモック用のレスポンスを返す
&lt;ul&gt;
&lt;li&gt;1文字入力時は&lt;code class=&quot;language-text&quot;&gt;B&lt;/code&gt;が入力された時のモック用レスポンスを返す&lt;/li&gt;
&lt;li&gt;2文字入力時は&lt;code class=&quot;language-text&quot;&gt;Bi&lt;/code&gt;が入力された時のモック用レスポンスを返す&lt;/li&gt;
&lt;li&gt;3文字入力時は&lt;code class=&quot;language-text&quot;&gt;Big&lt;/code&gt;が入力された時のモック用レスポンスを返す&lt;/li&gt;
&lt;li&gt;8文字まで同様&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索文字列が用意している文字列以上入力された場合は何も文字を入力していない場合のレスポンスを返す(&lt;code class=&quot;language-text&quot;&gt;query0Words&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;これで検索UIの開発はかなり捗ったのでメモとして残しておく&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ReactTestingLibraryでデバッグする]]></title><description><![CDATA[React Testing LibraryでReactのコンポーネントのテストを書いていた 今どのような状況だっけ? みたいなときにレンダリングされているHTMLを実際に見たい そういうときにReact Testing Libraryのを使ってHTML…]]></description><link>https://til.swfz.io/entries/debug_with_react_testing_library/</link><guid isPermaLink="false">https://til.swfz.io/entries/debug_with_react_testing_library/</guid><pubDate>Wed, 10 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;React Testing LibraryでReactのコンポーネントのテストを書いていた&lt;/p&gt;
&lt;p&gt;今どのような状況だっけ?&lt;/p&gt;
&lt;p&gt;みたいなときにレンダリングされているHTMLを実際に見たい&lt;/p&gt;
&lt;p&gt;そういうときにReact Testing Libraryの&lt;code class=&quot;language-text&quot;&gt;debug&lt;/code&gt;を使ってHTMLを表示する&lt;/p&gt;
&lt;p&gt;普通に&lt;code class=&quot;language-text&quot;&gt;import&lt;/code&gt;で呼べばOKかなと思って調べてみたら&lt;code class=&quot;language-text&quot;&gt;render&lt;/code&gt;でいろいろ返ってくる中にも入っていたためそっちを使うようにしてみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サンプル&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@testing-library/react&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; baseElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; container&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getByTestId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getAllByTestId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getByTitle&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getByPlaceholderText &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Hoge&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Hoge&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;型定義を見に行ったら&lt;code class=&quot;language-text&quot;&gt;container&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;baseElement&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;debug&lt;/code&gt;なども返却値に含まれていた&lt;/p&gt;
&lt;p&gt;このあたりを活用すれば中身を見ることができそう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@testing-library/react&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; baseElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; container&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getByTestId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getAllByTestId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getByTitle&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getByPlaceholderText &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Hoge&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Hoge&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;baseElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;container&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;baseElement&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  .....

  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;baseElement&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;body&lt;/code&gt;で囲われている、このタグはデフォルトは&lt;code class=&quot;language-text&quot;&gt;document.body&lt;/code&gt;で&lt;code class=&quot;language-text&quot;&gt;render&lt;/code&gt;時に指定した場合は指定したタグになるらしい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;container&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  .....
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;テスト対象の要素外へのイベント発行&lt;/h2&gt;
&lt;p&gt;要素外をクリックしたら非表示になるか&lt;/p&gt;
&lt;p&gt;みたいなテストを今回は含めたかったので&lt;code class=&quot;language-text&quot;&gt;baseElement&lt;/code&gt;をクリックすることで実現できた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-tsx line-numbers&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@testing-library/react&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;baseElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getByTitle &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Hoge&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Hoge&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;baseElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// click後DOMが変わっているか確認する&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で、この辺調べたら&lt;code class=&quot;language-text&quot;&gt;render&lt;/code&gt;で返ってくる値のドキュメントがあった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://testing-library.com/docs/react-testing-library/api/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;API | Testing Library&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;何か1つ単語が分かると芋づる式に把握することが増えていくがそれらを調べていくと結局ドキュメント読むのが一番だよねとうい結論にたどり着くなー&lt;/p&gt;
&lt;p&gt;最初からドキュメントを読みましょう案件&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub CLIのAPIでpagenationした結果を表示する]]></title><description><![CDATA[ドキュメント gh api | GitHub CLI  では、レスポンスの量が多い場合はオプションを渡すことでページングして全件取得した結果を返してくれる GraphQLの場合 変数を用意する ページングさせたいConnection（edges…]]></description><link>https://til.swfz.io/entries/github_cli_pagenate/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_cli_pagenate/</guid><pubDate>Thu, 04 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;ドキュメント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://cli.github.com/manual/gh_api&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gh api | GitHub CLI&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;In --paginate mode, all pages of results will sequentially be requested until there are no more pages of results. For GraphQL requests, this requires that the original query accepts an $endCursor: String variable and that it fetches the pageInfo{ hasNextPage, endCursor } set of fields from a collection.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gh api&lt;/code&gt; では、レスポンスの量が多い場合は&lt;code class=&quot;language-text&quot;&gt;--paginate&lt;/code&gt;オプションを渡すことでページングして全件取得した結果を返してくれる&lt;/p&gt;
&lt;h2&gt;GraphQLの場合&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$endCursor&lt;/code&gt;変数を用意する&lt;/p&gt;
&lt;p&gt;ページングさせたいConnection（edges）に対して次のようにクエリを書く&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;after: $endCursor&lt;/code&gt;とcursor指定をする&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;pageInfo.endCursor&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;pageInfo.hasNextPage&lt;/code&gt;を取得する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そして&lt;code class=&quot;language-text&quot;&gt;--paginate&lt;/code&gt;オプションを渡すと自動で全件取得してくれる…すごい&lt;/p&gt;
&lt;p&gt;もともとできたのかー!!!って感じだった&lt;/p&gt;
&lt;p&gt;今までシェルスクリプトを使って自前で&lt;code class=&quot;language-text&quot;&gt;endCursor&lt;/code&gt;取得して…とやってたので無駄だった&lt;/p&gt;
&lt;h2&gt;ことの発端&lt;/h2&gt;
&lt;p&gt;コミット履歴をGraphQLのAPIを使用して取ろうとして調べていたが&lt;code class=&quot;language-text&quot;&gt;pageInfo.endCursor&lt;/code&gt;の値が&lt;code class=&quot;language-text&quot;&gt;hash 99&lt;/code&gt;というようにスペースが入ってしまっている状態だった&lt;/p&gt;
&lt;p&gt;これをそのままCLI経由で渡すとうまくいかなかった&lt;/p&gt;
&lt;p&gt;シェルスクリプト側の問題のはずだったが一応回避策などないか調べてたらオプションあるやんけ!となった次第&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラー内容&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;accepts 1 arg(s), received 2&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;サンプルのGraphQLクエリ&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$endCursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$org&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$repo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property-query&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$org&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$repo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
    &lt;span class=&quot;token object&quot;&gt;defaultBranchRef&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
      &lt;span class=&quot;token object&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Commit&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property-query&quot;&gt;history&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;after&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$endCursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token object&quot;&gt;pageInfo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;startCursor&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;hasNextPage&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;endCursor&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;pushedDate&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;message&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;結果&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;repository&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hogehoge&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;defaultBranchRef&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;master&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;history&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;pageInfo&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;startCursor&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hogehoge 0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;hasNextPage&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;endCursor&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hogehoge 99&quot;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;nodes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;C_aaaaa&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;pushedDate&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-08-01T06:44:36Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Merge branch &apos;feature/fuga&quot;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              .....
              .....
              .....
              .....
              .....
            &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;repository&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      .....
      .....
      .....
      .....
      .....
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;jqで展開するとこんな感じ&lt;/p&gt;
&lt;p&gt;実際は改行なしでレスポンスのデータをつなげた状態で出力される&lt;/p&gt;</content:encoded></item><item><title><![CDATA[setTimeoutの型注釈とReactでの実装例]]></title><description><![CDATA[よく考えずに実装するとこんな感じで怒られる 参考というか答え TypeScript - use correct version of setTimeout (node vs window) - Stack Overflow…]]></description><link>https://til.swfz.io/entries/typescript_settimeout_return_value/</link><guid isPermaLink="false">https://til.swfz.io/entries/typescript_settimeout_return_value/</guid><pubDate>Mon, 01 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;よく考えずに実装するとこんな感じで怒られる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  Type &apos;Timeout&apos; is not assignable to type &apos;(prevState: number | undefined) =&gt; number | undefined&apos;.
    Type &apos;Timeout&apos; provides no match for the signature &apos;(prevState: number | undefined): number | undefined&apos;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;参考というか答え&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/45802988/typescript-use-correct-version-of-settimeout-node-vs-window&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TypeScript - use correct version of setTimeout (node vs window) - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;次のようにして解決する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; timerId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ReturnType&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; setTimeout&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;clearTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timerId&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

timerId&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ReturnType&amp;lt;typeof ...&gt;&lt;/code&gt;はよく使えるパターンだと思うので覚えておく&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;ReactだとuseStateを使ってtimerIdを管理するかと思ったがuseStateだとうまく想定通りの挙動をしてくれなかったためuseRefで実装した&lt;/p&gt;
&lt;p&gt;下記の実装を参考にした&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/streamich/react-use/blob/master/src/useTimeoutFn.ts&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;react-use/useTimeoutFn.ts at master · streamich/react-use&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;場合によってはそのまま上記の&lt;code class=&quot;language-text&quot;&gt;useTimeoutFn&lt;/code&gt;を使うのもあり&lt;/p&gt;</content:encoded></item><item><title><![CDATA[markdownlintを使ってみた]]></title><description><![CDATA[DavidAnson/markdownlint: A Node.js style checker and lint tool for Markdown/CommonMark files. Markdownのlinter インデントは○で! Headingの後は改行入れて!…]]></description><link>https://til.swfz.io/entries/markdownlint/</link><guid isPermaLink="false">https://til.swfz.io/entries/markdownlint/</guid><pubDate>Tue, 26 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/DavidAnson/markdownlint&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DavidAnson/markdownlint: A Node.js style checker and lint tool for Markdown/CommonMark files.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Markdownのlinter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インデントは○で!&lt;/li&gt;
&lt;li&gt;Headingの後は改行入れて!&lt;/li&gt;
&lt;li&gt;1行の文字数どのくらいまで&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などいろいろ指摘してくれる&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;CLIも用意されているのでCI用途でも使えるし、エディタの拡張をつかってエディタ上にほかのlinterと同様警告を表示できる&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;プライベートの記事執筆環境で、デフォルトの2だと警告が出ているためリストのインデントを4に設定した&lt;/p&gt;
&lt;p&gt;VS Codeだとショートカット&lt;code class=&quot;language-text&quot;&gt;F8&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Shift+F8&lt;/code&gt;で警告箇所へジャンプできるが&lt;/p&gt;
&lt;p&gt;textlintの警告（本来ジャンプして直したい箇所）と合わせてジャンプ対象になってしてしまう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.markdownlint.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;MD007&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;indent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;地味に邪魔だったので今の自分の環境に合わせて警告が出ないようにした&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CloudSchedulerの料金]]></title><description><![CDATA[料金  |  Cloud Scheduler  |  Google Cloud これがすべてなんだけどしっかり把握していなかったので個人で毎月料金掛かっているものがあった 2022-07-24時点 ジョブの稼働ではなく作った段階で課金対象となる アカウントにつき…]]></description><link>https://til.swfz.io/entries/cloud_scheduler_price/</link><guid isPermaLink="false">https://til.swfz.io/entries/cloud_scheduler_price/</guid><pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/scheduler/pricing?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;料金  |  Cloud Scheduler  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これがすべてなんだけどしっかり把握していなかったので個人で毎月料金掛かっているものがあった&lt;/p&gt;
&lt;h2&gt;2022-07-24時点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ジョブの稼働ではなく作った段階で課金対象となる&lt;/li&gt;
&lt;li&gt;アカウントにつき3つまで無料（プロジェクト単位ではない）&lt;/li&gt;
&lt;li&gt;それ移行は&lt;code class=&quot;language-text&quot;&gt;$0.10/月&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Terraformでサンプル作ったりしてそのまま放置しているのが結構あったので馬鹿にならない感じ&lt;/p&gt;
&lt;p&gt;サンプルとかで使ったら後片付けをしましょうね、気を付けます&lt;/p&gt;</content:encoded></item><item><title><![CDATA[BigQueryでStringの空配列を生成する]]></title><description><![CDATA[配列関数  |  BigQuery  |  Google Cloud GENERATE_ARRAYで作るとINT64の空配列になってしまう UNIONなどで文字列の配列と結合させようとすると型が合わなくなってしまう 例 結果 Create empty string array…]]></description><link>https://til.swfz.io/entries/bigquery_empty_string_array/</link><guid isPermaLink="false">https://til.swfz.io/entries/bigquery_empty_string_array/</guid><pubDate>Fri, 22 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;配列関数  |  BigQuery  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GENERATE_ARRAYで作るとINT64の空配列になってしまう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; GENERATE_ARRAY&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; tags&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;UNIONなどで文字列の配列と結合させようとすると型が合わなくなってしまう&lt;/p&gt;
&lt;h2&gt;例&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; tags
&lt;span class=&quot;token keyword&quot;&gt;UNION&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ALL&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; GENERATE_ARRAY&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; tags&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;結果&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; Column 1 in UNION ALL has incompatible types: ARRAY&amp;lt;STRING&gt;, ARRAY&amp;lt;INT64&gt; at [3:1] &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/58504188/create-empty-string-array-bigquery&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Create empty string array BigQuery - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こまったときのstackoverflow、答えが書いてありました&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; ARRAY&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;STRING&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; tags&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;でSTRINGの空配列を生成できる&lt;/p&gt;
&lt;p&gt;解決！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TypeScript+JestでDateのモックをするときの型定義]]></title><description><![CDATA[Jestでテストをする時の話、Dateをモックして特定の日付を返したいといったよくあるパターン ちょうどGatsby…]]></description><link>https://til.swfz.io/entries/as-unknown-as-string/</link><guid isPermaLink="false">https://til.swfz.io/entries/as-unknown-as-string/</guid><pubDate>Wed, 20 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jestでテストをする時の話、Dateをモックして特定の日付を返したいといったよくあるパターン&lt;/p&gt;
&lt;p&gt;ちょうどGatsbyで作った本ブログのテストでも使用していて、エディタ上では赤くなっていたので対応しようと重い腰を上げた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;もともと書いていたコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;beforeAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// 2021-03-10T15:00:00.000Z&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; mockDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1615388400000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  jest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;spyOn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;global&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mockImplementation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; mockDate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;型のエラー内容&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;src/components/__tests__/archive.tsx:11:49 - error TS2345: Argument of type &apos;() =&gt; Date&apos; is not assignable to parameter of type &apos;() =&gt; string&apos;.
  Type &apos;Date&apos; is not assignable to type &apos;string&apos;.

11   jest.spyOn(global, &quot;Date&quot;).mockImplementation(() =&gt; mockDate)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さっと調べるとでてくるstackoverflow、読んでみるとさまざまな解決方法があるよう&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/60912023/jest-typescript-mock-date-constructor&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;unit testing - jest typescript - Mock Date constructor - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;単純に&lt;code class=&quot;language-text&quot;&gt;as string&lt;/code&gt;でキャストしようとするとそう簡単には許してくれない&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;src/components/__tests__/archive.tsx:13:31 - error TS2352: Conversion of type &apos;Date&apos; to type &apos;string&apos; may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to &apos;unknown&apos; first.

13     .mockImplementation(() =&gt; mockDate as string)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このエラーにも書いてあるが「型が合いません、意図的なものならまず&lt;code class=&quot;language-text&quot;&gt;unknown&lt;/code&gt;にしてください」とのこと&lt;/p&gt;
&lt;p&gt;結局下記のように書くことにした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;jest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;spyOn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;global&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mockImplementation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockDate &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こういう回避方法があるのね…&lt;/p&gt;
&lt;p&gt;一度&lt;code class=&quot;language-text&quot;&gt;unknown&lt;/code&gt;にキャストしてさらに&lt;code class=&quot;language-text&quot;&gt;string&lt;/code&gt;にキャストすると&lt;/p&gt;
&lt;p&gt;そもそもキャスト自体もあまり推奨されるやり方じゃないと思っていたが今回のケースではやむを得ず…&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;// @ts-ignore&lt;/code&gt;で握りつぶすよりかは良いか…という感じ&lt;/p&gt;
&lt;h2&gt;2022-11-06追記&lt;/h2&gt;
&lt;p&gt;“@types/jest”: “29.2.2”,からこのハックは必要なくなった&lt;/p&gt;
&lt;p&gt;使い続けていると怒られる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Argument of type &apos;() =&gt; string&apos; is not assignable to parameter of type &apos;(value: string | number | Date) =&gt; Date&apos;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dateを直接渡せるようになったみたい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Cloudflare Insightsの独自ドメイン設定時のエラー対応]]></title><description><![CDATA[Cloudflare Insightsが本番でエラーが起きてた Analytics tag not loading due to Cross-Origin Request Blocked - Security - Cloudflare Community…]]></description><link>https://til.swfz.io/entries/cloudflare_insights_error/</link><guid isPermaLink="false">https://til.swfz.io/entries/cloudflare_insights_error/</guid><pubDate>Fri, 15 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cloudflare Insightsが本番でエラーが起きてた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Access to resource at &apos;https://cloudflareinsights.com/cdn-cgi/rum&apos; from origin &apos;https://til.swfz.io&apos; has been blocked by CORS policy: No &apos;Access-Control-Allow-Origin&apos; header is present on the requested resource.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://community.cloudflare.com/t/analytics-tag-not-loading-due-to-cross-origin-request-blocked/261058/9&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Analytics tag not loading due to Cross-Origin Request Blocked - Security - Cloudflare Community&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ちょっと古いがカスタムドメインを指定すると起きるよう？&lt;/p&gt;
&lt;p&gt;WebAnalyticsを無効化して再度有効化すると正常に読み込めるようになるとのこと&lt;/p&gt;
&lt;p&gt;なので設定を変えて再デプロイ、設定を戻して再デプロイ、でエラーが出なくなった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitのLogフォーマットを指定し、日付を表示する]]></title><description><![CDATA[コミットの日付をみたい人生だった って感じ 参考:
Git - pretty-formats Documentation]]></description><link>https://til.swfz.io/entries/git_log_format/</link><guid isPermaLink="false">https://til.swfz.io/entries/git_log_format/</guid><pubDate>Tue, 12 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;コミットの日付をみたい人生だった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git log --pretty=format:&apos;%H [%ai] %an %s&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sha [日時] author コメント&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;dff11aca396f7b6550cdb7c7c490e9066ef79513 &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-06-17 03:35:26 +0900&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; swfz memo
d365f46b1455ab1c6a7b00084784a7be72f04fa8 &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-06-17 03:33:20 +0900&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; swfz hoge
b7de206695c37193be32042ffd6e4b5c96980dd2 &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-06-17 03:29:24 +0900&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; swfz fuga
0672cbf90775a79d27c80bfbe27b1eff2f76d6d1 &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-06-17 02:58:40 +0900&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; swfz sample&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;って感じ&lt;/p&gt;
&lt;p&gt;参考:
&lt;a href=&quot;https://git-scm.com/docs/pretty-formats&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Git - pretty-formats Documentation&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JavaScriptで配列の最後の要素を取得する]]></title><description><![CDATA[よくあるのは だが、そもそも上記の例でのを定義せずよしなにしたいケースが発生した org/repoの文字列からリポジトリ名のみを抜き出すケース ES2022を使えるならで良い 参考 javascript - Getting the last element of a split…]]></description><link>https://til.swfz.io/entries/javascript_array_last/</link><guid isPermaLink="false">https://til.swfz.io/entries/javascript_array_last/</guid><pubDate>Thu, 07 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;よくあるのは&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; lastValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; list&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;だが、そもそも上記の例での&lt;code class=&quot;language-text&quot;&gt;list&lt;/code&gt;を定義せずよしなにしたいケースが発生した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;org/repoの文字列からリポジトリ名のみを抜き出すケース&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge/fuga&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; repo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// fuga&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ES2022を使えるなら&lt;code class=&quot;language-text&quot;&gt;at&lt;/code&gt;で良い&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge/fuga&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; repo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// fuga&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;参考&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/651563/getting-the-last-element-of-a-split-string-array&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;javascript - Getting the last element of a split string array - Stack Overflow&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub CLIコマンドでアカウントを切り替えたい]]></title><description><![CDATA[version 同一マシン上でGitHubのアカウントを切り替えてコマンドを使いたいというケースが発生した 普段使っているアカウントと別アカウントの認証情報を参照できれば問題ないはずということでちょっと調べてみた GitHub CLI…]]></description><link>https://til.swfz.io/entries/gh_cli_per_user/</link><guid isPermaLink="false">https://til.swfz.io/entries/gh_cli_per_user/</guid><pubDate>Tue, 05 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;version&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gh &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;
gh version &lt;span class=&quot;token number&quot;&gt;2.13&lt;/span&gt;.0 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-06-22&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
https://github.com/cli/cli/releases/tag/v2.13.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;同一マシン上でGitHubのアカウントを切り替えて&lt;code class=&quot;language-text&quot;&gt;gh&lt;/code&gt;コマンドを使いたいというケースが発生した&lt;/p&gt;
&lt;p&gt;普段使っているアカウントと別アカウントの認証情報を参照できれば問題ないはずということでちょっと調べてみた&lt;/p&gt;
&lt;p&gt;GitHub CLIで&lt;code class=&quot;language-text&quot;&gt;gh auth login&lt;/code&gt;後にどんなファイルが生成されるか調べてみたが、見つけられたのは下記&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.local/state/gh/state.yml
.config/gh/hosts.yml&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この情報を持ってればOKそう&lt;/p&gt;
&lt;p&gt;いったんDockerコンテナなど普段使いとは違う環境で&lt;code class=&quot;language-text&quot;&gt;gh auth login&lt;/code&gt;して別アカウントの&lt;code class=&quot;language-text&quot;&gt;oauth_token&lt;/code&gt;をメモ&lt;/p&gt;
&lt;p&gt;環境変数&lt;code class=&quot;language-text&quot;&gt;GITHUB_TOKEN&lt;/code&gt;に&lt;code class=&quot;language-text&quot;&gt;hosts.yml&lt;/code&gt;の&lt;code class=&quot;language-text&quot;&gt;oauth_token&lt;/code&gt;の値を入れてコマンドをたたけばアカウント切り替えた状態でCLIを実行できる&lt;/p&gt;
&lt;p&gt;他の方法もありそうだがやりたいことはこれで実現できた&lt;/p&gt;
&lt;p&gt;参考:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cli.github.com/manual/gh_auth_login&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gh auth login | GitHub CLI&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub CLIコマンドでscopeを設定する]]></title><description><![CDATA[gh auth login | GitHub CLI ghコマンドの権限周りで何か怒られた場合はこの操作で権限を追加する 変更するためには再度ログインが必要 プロジェクトへのread権限、codespaceへのread/write権限を追加する図 GraphQL…]]></description><link>https://til.swfz.io/entries/gh_cli_add_scope/</link><guid isPermaLink="false">https://til.swfz.io/entries/gh_cli_add_scope/</guid><pubDate>Mon, 04 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cli.github.com/manual/gh_auth_login&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gh auth login | GitHub CLI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ghコマンドの権限周りで何か怒られた場合はこの操作で権限を追加する&lt;/p&gt;
&lt;p&gt;変更するためには再度ログインが必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクトへのread権限、codespaceへのread/write権限を追加する図&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gh auth login --scopes &apos;read:project,codespace&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;GraphQLでいうProjectV2（GitHub Issues beta）へのアクセスには&lt;code class=&quot;language-text&quot;&gt;project&lt;/code&gt;への権限が必要&lt;/p&gt;
&lt;p&gt;GitHub CLI自体はOAuthで認証しているのでスコープの指定方法は次のドキュメントを参照すればよさそう&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/developers/apps/building-oauth-apps/scopes-for-oauth-apps&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OAuth Appのスコープ - GitHub Docs&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GoogleSlideのプレゼンテーションモードでレーザーポインタ風表示のショートカットキー]]></title><description><![CDATA[…]]></description><link>https://til.swfz.io/entries/googleslide_pointer/</link><guid isPermaLink="false">https://til.swfz.io/entries/googleslide_pointer/</guid><pubDate>Tue, 28 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;プレゼンテーションモードでマウスポインタをレーザーポインタ風の表示にできる&lt;/p&gt;
&lt;p&gt;ショートカットキーだと&lt;code class=&quot;language-text&quot;&gt;l&lt;/code&gt;ボタンで切り替えが可能&lt;/p&gt;
&lt;p&gt;ショートカット以外だと、左下のハンバーガーメニューからでも切り替え可能&lt;/p&gt;
&lt;p&gt;蛇足だが、自分がいつも使っているスピーカーノートのショートカットも用意されていて&lt;code class=&quot;language-text&quot;&gt;s&lt;/code&gt;キーで表示切り替えを行える&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 519px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d86e8970335a96d823774a080f03547a/b23ad/googleslide_pointer01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAABYlAAAWJQFJUiTwAAACU0lEQVR42oWTTW8SQRyHp9T4FfwCXjTGo6FEPakorS+A3j16UGgMsNAIJh7KxUONSVuUIm29eEZo2njwoLEXk9a03cLC7s7u7Nssy/KqTaHRARpeKsbkyWQP8+zv95/dAcD5rI8rDKaC4IYP2H3tdRD7AHdnjvf3TEvHvOSf9yfSnjcpb7zPdPyj922qy3Q8deZhFNyZGXMNyOPuCHlr5P16o1ySVU3FGOtFs1w2DDOXY4yS2fh1UK016rXa5eAicFAWd/ikHFzOaLiYg1JBVPKi3F1pFrJIJQ+cjGXdsAbm27LrLzm0skYiicPLGoeUPEQMj/YYlhXlLCdARdcMc2KUHAZ2P/UuLSK0V+C3dvd3snkWKZpZJYhaMS9I+6yANN1GLYxM9pPaWNezPMqykOFFTlKhggkIG4KqQ1IbGxOB0bKvK+cgKogyQzpDROc5usATWdJNXsGigif+mZzMVKrVAlJJYRJFnC6kNkFQizIuWv2jD6w9M0neYbjv27tZTpSLpqSXeojYgJIyMrlzYMk0hAJdgD9ohnQ+IbdbqNrQzGOuMOHU/Qi4GaCSGRFJNCts0zkyOeqk9RBIc0WzDh2YgwK3AuOTQXDVE0qkj1pNVdPJBytXa7XGz2q90aNcq5dKxpVQDDgC7T+MtL3ofW2jYrZg7ILn1eyHT5+3sovpL/G1r0vrm4mNIZba67ezj16C2yFSFpx/MmeY5ebh4VGrValUfjcPljc2wfWnFnK9HIERTFL9W3X6wfNr4bgzunpvdmXqRdIdXT33eO740jj/wx/NjiCu/QhKBwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d86e8970335a96d823774a080f03547a/cbe2e/googleslide_pointer01.webp 148w,
/static/d86e8970335a96d823774a080f03547a/3084c/googleslide_pointer01.webp 295w,
/static/d86e8970335a96d823774a080f03547a/ad2dd/googleslide_pointer01.webp 519w&quot;
              sizes=&quot;(max-width: 519px) 100vw, 519px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d86e8970335a96d823774a080f03547a/12f09/googleslide_pointer01.png 148w,
/static/d86e8970335a96d823774a080f03547a/e4a3f/googleslide_pointer01.png 295w,
/static/d86e8970335a96d823774a080f03547a/b23ad/googleslide_pointer01.png 519w&quot;
            sizes=&quot;(max-width: 519px) 100vw, 519px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d86e8970335a96d823774a080f03547a/b23ad/googleslide_pointer01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;レーザーポインタ風表示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/da26e0b9dd8f7898e11801adb959f797/googleslide_pointer02.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;
&lt;p&gt;発表のときとか「ここです！」って示すのにレーザーポインタ風だとみやすい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JSON.stringifyでundefinedな値は省かれる]]></title><description><![CDATA[zxでAPI叩いて整形して整えたJSONをGCSに上げてbq loadする みたいなごく簡単な作業をしていたときに雑にを使っていたらカラムが合わないとエラーで怒られた よく調べるとJSONの中身からあるはずのキーが抜けていた REPLで確認 知らなかった… 調べたらMDN…]]></description><link>https://til.swfz.io/entries/javascript_json_stringify_with_undefined/</link><guid isPermaLink="false">https://til.swfz.io/entries/javascript_json_stringify_with_undefined/</guid><pubDate>Fri, 24 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;zxでAPI叩いて整形して整えたJSONをGCSに上げてbq loadする&lt;/p&gt;
&lt;p&gt;みたいなごく簡単な作業をしていたときに雑に&lt;code class=&quot;language-text&quot;&gt;bq load --autodetect&lt;/code&gt;を使っていたらカラムが合わないとエラーで怒られた&lt;/p&gt;
&lt;p&gt;よく調べるとJSONの中身からあるはずのキーが抜けていた&lt;/p&gt;
&lt;p&gt;REPLで確認&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt; const hoge = {a: undefined, b: 1, c: 3}
undefined
&gt; hoge
{ a: undefined, b: 1, c: 3 }
&gt; JSON.stringify(hoge)
&apos;{&quot;b&quot;:1,&quot;c&quot;:3}&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;知らなかった…&lt;/p&gt;
&lt;p&gt;調べたらMDNにもしっかり書いてあった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;JSON.stringify() - JavaScript | MDN&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;undefined、 関数 (Function)、シンボル (Symbol) は有効な JSON 値ではありません。変換中にそのような値に遭遇した場合は、 (オブジェクトの中で発見された場合は) 省略されたり、 (配列の中で見つかった場合は) null に変換されたりします。 JSON.stringify は JSON.stringify(function(){}) や JSON.stringify(undefined) のように「純粋」な値を渡した場合に undefined を返すことがあります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;なのでzxやJavaScriptでJSONを生成する際はundefinedな値が入らないように整形処理を書くか次のようにreplacerで変換してあげるなどの方法がある&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt; hoge = {a: undefined, b: 1, c: 3}
{ a: undefined, b: 1, c: 3 }
&gt; JSON.stringify(hoge, (k,v) =&gt; {
  return v === undefined ? null : v;
});
&apos;{&quot;a&quot;:null,&quot;b&quot;:1,&quot;c&quot;:3}&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[zx使用時のコマンドライン引数のリスト]]></title><description><![CDATA[普通のnodeスクリプトだとでコマンドライン引数のリストを取得するが、zxの場合にはになる]]></description><link>https://til.swfz.io/entries/zx_arguments/</link><guid isPermaLink="false">https://til.swfz.io/entries/zx_arguments/</guid><pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;zx query.mjs hoge
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;/home/user/.anyenv/envs/nodenv/versions/16.13.0/bin/node&apos;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&apos;/home/user/.anyenv/envs/nodenv/versions/16.13.0/bin/zx&apos;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&apos;query.mjs&apos;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;普通のnodeスクリプトだと&lt;code class=&quot;language-text&quot;&gt;process.argv.slice(2)&lt;/code&gt;でコマンドライン引数のリストを取得するが、zxの場合には&lt;code class=&quot;language-text&quot;&gt;process.argv.slice(3)&lt;/code&gt;になる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JavaScriptで時刻と文字列の変換を行う]]></title><description><![CDATA[zxを使っていて、ライブラリを使わずよしなにしたかった 変数には一度宣言する必要があった の戻り値は数値（1970年1月1日の深夜0時から経過したミリ秒を表す数値） 実行環境によるようでJSTでparseしてくれるよう ではUTC…]]></description><link>https://til.swfz.io/entries/javascript_date_transform/</link><guid isPermaLink="false">https://til.swfz.io/entries/javascript_date_transform/</guid><pubDate>Fri, 17 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;zxを使っていて、ライブラリを使わずよしなにしたかった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; unixtime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2022-06-15T00:00:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;unixtime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; d &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;unixtime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toISOString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token number&quot;&gt;1655218800000&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-06-14T15:00:00.000Z&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;変数&lt;code class=&quot;language-text&quot;&gt;d&lt;/code&gt;には一度宣言する必要があった&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Date.parse&lt;/code&gt;の戻り値は数値（1970年1月1日の深夜0時から経過したミリ秒を表す数値）&lt;/p&gt;
&lt;p&gt;実行環境によるようでJSTでparseしてくれるよう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;toISOString()&lt;/code&gt;ではUTC時刻が表示される&lt;/p&gt;
&lt;p&gt;数値に変換してから時間計算して戻すとかそういう使い方をしたいときに参照する&lt;/p&gt;</content:encoded></item><item><title><![CDATA[vite rollup-pluginでChrome拡張内のJSのみから参照されているイメージをどうするか]]></title><description><![CDATA[背景 vite+rollup-plugin-chrome-extensionを用いてChrome拡張を作っていた 拡張を作っていく中でJSのみから参照されるイメージ（SVG…]]></description><link>https://til.swfz.io/entries/vite_rollup_plugin_copy/</link><guid isPermaLink="false">https://til.swfz.io/entries/vite_rollup_plugin_copy/</guid><pubDate>Wed, 15 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;vite+rollup-plugin-chrome-extensionを用いてChrome拡張を作っていた&lt;/p&gt;
&lt;p&gt;拡張を作っていく中でJSのみから参照されるイメージ（SVG）がビルド後のディレクトリに含まれていないことに気付いて調べた&lt;/p&gt;
&lt;h2&gt;調査した結果&lt;/h2&gt;
&lt;p&gt;公式ドキュメントから&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.extend-chrome.dev/rollup-plugin&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Untitled – Extend Chrome&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What about the assets? Like images, icons, or CSS files?&lt;/p&gt;
&lt;p&gt;HTMLに表示されているイメージは自動で&lt;code class=&quot;language-text&quot;&gt;web_accessible_resources&lt;/code&gt;に追加されるのと配信用のディレクトリに自動でコピーされる&lt;/p&gt;
&lt;p&gt;が、JSで呼び出しているものは別途プラグインが必要とのこと&lt;/p&gt;
&lt;p&gt;調べてみると&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/FaithnhMaster/items/2b8f3e6a5b502a67e444&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;typescript + vite + reactを使ったChrome拡張機能の土台を作って検証してみた&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この中で&lt;code class=&quot;language-text&quot;&gt;rollup-plugin-copy&lt;/code&gt;を使用すればOKそう&lt;/p&gt;
&lt;p&gt;ということで使ってみた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インストール&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; rollup-plugin-copy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;vite.config.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;export default defineConfig({
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;  plugins: [react(), chromeExtension({ manifest })],
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  plugins: [
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    react(),
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    chromeExtension({ manifest }),
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    copy({
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      verbose: true,
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      hook: &apos;writeBundle&apos;,
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      targets: [
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          src: &apos;images/sign_language_black_24dp.svg&apos;,
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          dest: &apos;dist/images&apos;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        }
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      ],
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    }),
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;  ],
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;});&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記でイメージの配信用ディレクトリへのコピーはできたが&lt;code class=&quot;language-text&quot;&gt;web_accessible_resources&lt;/code&gt;には自動で設定が追加されなかった&lt;/p&gt;
&lt;p&gt;完全にworkaroundだがビルド後にスクリプトを挟んで&lt;code class=&quot;language-text&quot;&gt;web_accessible_resources&lt;/code&gt;に追加するという処理を追加した…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;package.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tsc &amp;amp;&amp;amp; vite build &amp;amp;&amp;amp; node script/patch_manifest.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;script/patch_manifest.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;fs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; manifest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readFileSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dist/manifest.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; resources &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; manifest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;web_accessible_resources&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resources&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;flat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; patchedManifest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;manifest&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;web_accessible_resources&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;all_urls&gt;&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;resources&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;images/sign_language_black_24dp.svg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;use_dynamic_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeFileSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dist/manifest.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;patchedManifest&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このworkaroundの処理自体が&lt;a href=&quot;https://github.com/swfz/chrome-extension-google-slide-usertool-comment-stream/issues/2&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;他の問題&lt;/a&gt;も解決しているが&lt;/p&gt;
&lt;p&gt;今回のスコープで言うと&lt;/p&gt;
&lt;p&gt;Chrome拡張のJSのみで参照されている”images/sign_language_black_24dp.svg”を&lt;code class=&quot;language-text&quot;&gt;web_accessible_resources&lt;/code&gt;にも追加する&lt;/p&gt;
&lt;p&gt;ということを行っている&lt;/p&gt;
&lt;p&gt;これで無事Chrome拡張を動作させることが可能となった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[該当日付以降の変更差分をまとめてみる]]></title><description><![CDATA[ぱっと調べてよく出てくるのは下記のようにで見る方法 ただ、上記方法だとコミットが別れた状態になっている ざっくり期間を絞ってどんな差分があったか把握したいときは次のようにコマンドを組み合わせる 2022-05-01以降の差分を見る 2022-05-01に入った変更も含め202…]]></description><link>https://til.swfz.io/entries/git_diff_since/</link><guid isPermaLink="false">https://til.swfz.io/entries/git_diff_since/</guid><pubDate>Mon, 13 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ぱっと調べてよく出てくるのは下記のように&lt;code class=&quot;language-text&quot;&gt;whatchanged&lt;/code&gt;で見る方法&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; whatchanged &lt;span class=&quot;token parameter variable&quot;&gt;--since&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2022-04-29&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ただ、上記方法だとコミットが別れた状態になっている&lt;/p&gt;
&lt;p&gt;ざっくり期間を絞ってどんな差分があったか把握したいときは次のようにコマンドを組み合わせる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2022-05-01以降の差分を見る&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; log &lt;span class=&quot;token parameter variable&quot;&gt;--before&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-05-01 00:00:00&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--oneline&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $1}&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;HEAD&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2022-05-01に入った変更も含め2022-05-01以降の差分を出すコマンドとなる&lt;/p&gt;
&lt;p&gt;まず&lt;code class=&quot;language-text&quot;&gt;2022-05-01 00:00:00&lt;/code&gt;以前で最初のコミットのSHA-1を取り出している&lt;/p&gt;
&lt;p&gt;そのコミットのSHA-1と現在のHEADを比較すれば指定日以降の差分をまとめて表示できる&lt;/p&gt;
&lt;h2&gt;余談&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;git log&lt;/code&gt;のオプションで&lt;code class=&quot;language-text&quot;&gt;--after&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;--since&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;--before&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;--until&lt;/code&gt;などあるが&lt;/p&gt;
&lt;p&gt;日付のみ指定した場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--after&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;--since&lt;/code&gt;は当日を含まない&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--before&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;--until&lt;/code&gt;は当日を含む&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という挙動だった（2.36.1時点）&lt;/p&gt;
&lt;p&gt;自分は&lt;code class=&quot;language-text&quot;&gt;2022-05-01&lt;/code&gt;に入った変更も含めたいと感じたので結局&lt;code class=&quot;language-text&quot;&gt;2022-05-01 00:00:00&lt;/code&gt;と指定して厳密に2022-05-01に入った修正もdiffの対象とすることにした&lt;/p&gt;
&lt;p&gt;この辺の日付の扱い難しい…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[NetlifyからCloudflare Pagesに移行する]]></title><description><![CDATA[Netlifyでビルド時間の制限で$7/月掛かることが増えてきてしまったのでCloudflarePagesに乗り換えた 親切なことに移行方法がドキュメントにまとめられている Migrating from Netlify to Pages · Cloudflare Pages…]]></description><link>https://til.swfz.io/entries/netlify_to_cloudflarepages/</link><guid isPermaLink="false">https://til.swfz.io/entries/netlify_to_cloudflarepages/</guid><pubDate>Mon, 30 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Netlifyでビルド時間の制限で$7/月掛かることが増えてきてしまったのでCloudflarePagesに乗り換えた&lt;/p&gt;
&lt;p&gt;親切なことに移行方法がドキュメントにまとめられている&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/migrations/migrating-from-netlify/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Migrating from Netlify to Pages · Cloudflare Pages docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ビルドからデプロイまでは上記にしたがってやれば特に問題なくデプロイまではできるはず&lt;/p&gt;
&lt;h2&gt;カスタムドメイン&lt;/h2&gt;
&lt;p&gt;自分はAWSのRoute53でtilのドメインを管理している&lt;/p&gt;
&lt;p&gt;なのでAWS側でCNAMEのレコードを変更することで対応する&lt;/p&gt;
&lt;h3&gt;Cloudflare側&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pages→CustomDomainsのタブ&lt;/li&gt;
&lt;li&gt;サブドメイン込みで入力&lt;/li&gt;
&lt;li&gt;CluodFlareのDNSか独自のDNSどっち使うの？ と聞かれるのでMyDNSProviderを選択
&lt;ul&gt;
&lt;li&gt;管理はAWSのRoute53で行っているので&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AWS側&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS側のAレコードを削除（Netlifyの設定では必要だったらしい）&lt;/li&gt;
&lt;li&gt;CNAMEをNetlifyからCloudflareのものに変更
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;${適当な文字列}.pages.dev&lt;/code&gt;←のような値&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しばらくすると検証が終わりカスタムドメインでアクセスできるようになる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ nslookup til.swfz.io
Server:         172.27.112.1
Address:        172.27.112.1#53

Non-authoritative answer:
til.swfz.io     canonical name = til-5tb.pages.dev.
Name:   til-5tb.pages.dev
Address: 172.66.44.99
Name:   til-5tb.pages.dev
Address: 172.66.47.157
Name:   til-5tb.pages.dev
Address: 2606:4700:310c::ac42:2c63
Name:   til-5tb.pages.dev
Address: 2606:4700:310c::ac42:2f9d&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;CNAMEが変わっていることを確認&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://zenn.dev/aumy/scraps/a49b6cab86bb08&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ブログをCloudflare Pagesに引っ越し&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SVG iconに色を付ける]]></title><description><![CDATA[ページ中に表示したSVNのアイコンに対して、色をつけたいというケースがあった とりあえずcolorプロパティを変更しても反映されなかったため、調べたら filterプロパティというものがありそれを適切に設定すると色を付けることが可能だった 個々で指定している数値はRGB…]]></description><link>https://til.swfz.io/entries/svg_color/</link><guid isPermaLink="false">https://til.swfz.io/entries/svg_color/</guid><pubDate>Wed, 25 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;ページ中に表示したSVNのアイコンに対して、色をつけたいというケースがあった&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;とりあえずcolorプロパティを変更しても反映されなかったため、調べたら&lt;/p&gt;
&lt;p&gt;filterプロパティというものがありそれを適切に設定すると色を付けることが可能だった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hoge.svg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;red&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-css line-numbers&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.red&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;invert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;13%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sepia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;94%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;saturate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;7466%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hue-rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;brightness&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;94%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;115%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;個々で指定している数値はRGBから変換できるとうれしいなと思っていたら&lt;/p&gt;
&lt;p&gt;下記のようなページで変換するのが良さそう&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://angel-rs.github.io/css-color-filter-generator/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CSS Color Filter Generator&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GatsbyでGistの埋め込みを行う]]></title><description><![CDATA[Gistのページの埋めこみタグだと表示されなかったので調べたら下記のプラグインを使用すれば埋め込みが可能 gatsby-remark-embed-gist | Gatsby gatsby-config.js より前に設定を書く必要があるよう]]></description><link>https://til.swfz.io/entries/gatsby-using-gist/</link><guid isPermaLink="false">https://til.swfz.io/entries/gatsby-using-gist/</guid><pubDate>Mon, 23 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gistのページの埋めこみタグだと表示されなかったので調べたら下記のプラグインを使用すれば埋め込みが可能&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/plugins/gatsby-remark-embed-gist/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gatsby-remark-embed-gist | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-config.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            resolve: &quot;gatsby-remark-embed-gist&quot;,
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            options: {}
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          },&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gatsby-remark-prismjs&lt;/code&gt;より前に設定を書く必要があるよう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Jest28への更新に必要だった作業]]></title><description><![CDATA[本ブログで使っているJestがRenovateにより自動でバージョンアップしていたが28系にあげる際、いつくか詰まったのでメモ jest-environment-jsdomの分割 エラー内容 最後の文が言っているとおり、Jest2…]]></description><link>https://til.swfz.io/entries/upgrade_jest28/</link><guid isPermaLink="false">https://til.swfz.io/entries/upgrade_jest28/</guid><pubDate>Thu, 05 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本ブログで使っているJestがRenovateにより自動でバージョンアップしていたが28系にあげる際、いつくか詰まったのでメモ&lt;/p&gt;
&lt;h2&gt;jest-environment-jsdomの分割&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;エラー内容&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ jest --config ./jest.config.js
● Validation Error:

  Test environment jest-environment-jsdom cannot be found. Make sure the testEnvironment configuration option points to an existing node module.

  Configuration Documentation:
  https://jestjs.io/docs/configuration


As of Jest 28 &quot;jest-environment-jsdom&quot; is no longer shipped by default, make sure to install it separately.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最後の文が言っているとおり、Jest28以降は&lt;code class=&quot;language-text&quot;&gt;jsdom&lt;/code&gt;を使いたい場合別途インストールしてねということらしい&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yarn add -D jest-environment-jsdom&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;でOK&lt;/p&gt;
&lt;h2&gt;trailing-slash-optionのWorkaroundな設定を削除&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;エラー内容&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; FAIL  src/components/__tests__/line.tsx
  ● Test suite failed to run

    ENOENT: no such file or directory, open &apos;/workspaces/til/node_modules/gatsby-page-utils/dist/dist/apply-trailing-slash-option.js&apos;

      at Runtime.readFile (node_modules/jest-runtime/build/index.js:2552:21)
      at Object.&amp;lt;anonymous&gt; (node_modules/gatsby-link/rewrite-link-path.js:8:33)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;下記のworkaroundを使っていたがそれが解決されたっぽい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/issues/34784#issuecomment-1034695025&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cannot find module ‘gatsby-page-utils/apply-trailing-slash-option’ since Gatsby 4.7 · Issue #34784 · gatsbyjs/gatsby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大本のIssueは次のIssue&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/facebook/jest/issues/9771&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Support package exports in &lt;code class=&quot;language-text&quot;&gt;jest-resolve&lt;/code&gt; · Issue #9771 · facebook/jest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;gatsbyの&lt;code class=&quot;language-text&quot;&gt;trailing-slash-option&lt;/code&gt;を使用したときにモジュール読み込みのパス指定がうまくいかずに設定でなんとかしていたところの部分を削除した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jest.config.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;moduleNameMapper: {
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &quot;.+\\.(css|styl|less|sass|scss)$&quot;: `identity-obj-proxy`,
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &quot;.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$&quot;: `&amp;lt;rootDir&gt;/__mocks__/file-mock.js`,
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   &quot;^gatsby-page-utils/(.*)$&quot;: `gatsby-page-utils/dist/$1`, // Workaround for https://github.com/facebook/jest/issues/9771
&lt;/span&gt;}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[CloudFrontのキャッシュをクリアする]]></title><description><![CDATA[メモ は実行時適切なものに割り当てる]]></description><link>https://til.swfz.io/entries/cloudfront_cache_clear/</link><guid isPermaLink="false">https://til.swfz.io/entries/cloudfront_cache_clear/</guid><pubDate>Sun, 01 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;メモ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hogehoge.cloudfront.net&lt;/code&gt;は実行時適切なものに割り当てる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# DISTRIBUTION_IDの取得
$ export DISTRIBUTION_ID=$(aws cloudfront list-distributions --query &apos;DistributionList.Items[]&apos; | jq -r &apos;.[]|select(.DomainName=&quot;hogehoge.cloudfront.net&quot;)|.Id&apos;)
# INVALIDATION_IDの取得、invalidationでキャッシュの削除を行う、非同期処理のためIDを取得しておく
$ export INVALIDATION_ID=$(aws cloudfront create-invalidation --distribution-id ${DISTRIBUTION_ID} --paths &quot;/*&quot; | jq -r &apos;.Invalidation.Id&apos;)
# チェック、Completeになっていれば完了
$ aws cloudfront get-invalidation --distribution-id ${DISTRIBUTION_ID} --id ${INVALIDATION_ID}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[thinでサーバ起動できなくなっていたのでSSL証明書を発行して対応した]]></title><description><![CDATA[ブックマークレットの開発時、ローカルのサーバにSSL接続する必要があったのでRubyのthin…]]></description><link>https://til.swfz.io/entries/thin_ssl_error/</link><guid isPermaLink="false">https://til.swfz.io/entries/thin_ssl_error/</guid><pubDate>Wed, 27 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ブックマークレットの開発時、ローカルのサーバにSSL接続する必要があったのでRubyのthinというサーバを使っていた&lt;/p&gt;
&lt;p&gt;久しぶりに起動したらアクセス時のエラーで立ち上げたサーバにアクセスできなくなっていた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラー&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;SSL routines:SSL_CTX_use_certificate:ee key too small:../ssl/ssl_rsa.c:310:
thin start --ssl -R app.ru -p 3001 -D -V: ssl.cpp:203: SslContext_t::SslContext_t(bool, const string&amp;amp;, const string&amp;amp;, const string&amp;amp;, const string&amp;amp;, const string&amp;amp;, int): Assertion `e &gt; 0&apos;
failed.
zsh: abort      bundle exec thin start --ssl -R app.ru -p 3001 -D -V&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この現象自体は鍵長短すぎる!と言っているよう&lt;/p&gt;
&lt;p&gt;デフォルトで使う鍵が条件を満たしていないので条件を満たす鍵とその鍵をもとに自己証明書を作成してあげる必要がある&lt;/p&gt;
&lt;p&gt;なので長さ2048で鍵を作って自前でやる&lt;/p&gt;
&lt;p&gt;ローカルでの動作だしと詳しいオプションは調べていない…&lt;/p&gt;
&lt;p&gt;あと留意点としては証明書を発行する段階で対話的にいろいろ入力するが&lt;code class=&quot;language-text&quot;&gt;Common Name&lt;/code&gt;の箇所を自ホスト名にする必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ openssl genrsa 2048 &gt; localhost.key
$ openssl req -new -x509 -nodes -sha256 -days 365 -key localhost.key -out localhost.crt

Country Name (2 letter code) [AU]:
...
Common Name: localhost
...

$ thin start --ssl --ssl-disable-verify --ssl-key-file=localhost.key --ssl-cert-file=localhost.crt -R app.ru -p 3001 -D -V&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;生成した鍵と証明書をthinの起動時に指定して上げれば無事サーバが起動できブラウザから接続できるようになった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SlackのWebhookURLを発行するための順序]]></title><description><![CDATA[https://api.slack.com/apps このリンクから→→をクリックしURLを発行もしくは取得する とりあえずいつもたどり着けないのでメモ 書いた時点ではこの手順でたどり着ける]]></description><link>https://til.swfz.io/entries/slack_apps_url/</link><guid isPermaLink="false">https://til.swfz.io/entries/slack_apps_url/</guid><pubDate>Thu, 21 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://api.slack.com/apps&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://api.slack.com/apps&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このリンクから&lt;code class=&quot;language-text&quot;&gt;アプリ&lt;/code&gt;→&lt;code class=&quot;language-text&quot;&gt;Add features and functionality&lt;/code&gt;→&lt;code class=&quot;language-text&quot;&gt;Incomming Webhooks&lt;/code&gt;をクリックしURLを発行もしくは取得する&lt;/p&gt;
&lt;p&gt;とりあえずいつもたどり着けないのでメモ&lt;/p&gt;
&lt;p&gt;書いた時点ではこの手順でたどり着ける&lt;/p&gt;</content:encoded></item><item><title><![CDATA[testing-library-user-eventの更新13.5 to 14]]></title><description><![CDATA[RenovateのPRで本ブログのリポジトリのテストがこけていた 参考にはならなそうだが一応ログ残しておく PRを見るとv13からv14の変更で結構なBREAKING CHANGESがある模様 公式を見に行くと こっちが以前のv13 user-event v1…]]></description><link>https://til.swfz.io/entries/upgrade-testing-library-user-event/</link><guid isPermaLink="false">https://til.swfz.io/entries/upgrade-testing-library-user-event/</guid><pubDate>Thu, 14 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;RenovateのPRで本ブログのリポジトリのテストがこけていた&lt;/p&gt;
&lt;p&gt;参考にはならなそうだが一応ログ残しておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; FAIL  src/components/__tests__/archive.tsx (8.923 s)
  ● Archive › renders correctly
    expect(element).not.toBeVisible()
    Received element is visible:
      &amp;lt;li aria-label=&quot;month-link&quot; /&gt;

      49 |     userEvent.click(plusText2021)
      50 |
    &gt; 51 |     expect(monthLInkList[0]).not.toBeVisible() &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;PRを見るとv13からv14の変更で結構なBREAKING CHANGESがある模様&lt;/p&gt;
&lt;p&gt;公式を見に行くと&lt;/p&gt;
&lt;p&gt;こっちが以前のv13&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://testing-library.com/docs/ecosystem-user-event/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;user-event v13 | Testing Library&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;そもそも使い方がガッツリ変わったようで、そういうアナウンスがあった&lt;/p&gt;
&lt;p&gt;こちらが新しいバージョンのドキュメント&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://testing-library.com/docs/user-event/intro&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Introduction | Testing Library&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ということで、公式ドキュメントにしたがって&lt;/p&gt;
&lt;p&gt;使い方を変えて解決&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; userEvent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hogeButton&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;setup()&lt;/code&gt;の戻り値を変数定義しそこから&lt;code class=&quot;language-text&quot;&gt;click()&lt;/code&gt;を呼ぶように変更&lt;/p&gt;
&lt;p&gt;clickの戻り値がPromiseになったみたいなので&lt;code class=&quot;language-text&quot;&gt;await&lt;/code&gt;が必要、それに付随してテストの関数部分に&lt;code class=&quot;language-text&quot;&gt;async&lt;/code&gt;も付与&lt;/p&gt;
&lt;p&gt;詳しい差分は下記へ&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/til/pull/722/commits/bb4fec24cc32ce35fb442f340182ef4e857c38a5&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;chore(deps): update dependency @testing-library/user-event to v14 by renovate · Pull Request #722 · swfz/til&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こういうのたまにあるのでやはりテスト少しでも書いておくと良いなと感じる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WSL2上でDockerDesktopを使わなくなった後のエラー対応]]></title><description><![CDATA[DockerDesktopが有償化されてから使わないようにアンインストールしてUbuntu上のDockerを動かすようにしていたが先日下記のようなエラーが発生した そりゃアンインストールしていたらないだろっていう話ではあるがどこかでdockerを使うのにdesktop…]]></description><link>https://til.swfz.io/entries/docker-error-in-wsl/</link><guid isPermaLink="false">https://til.swfz.io/entries/docker-error-in-wsl/</guid><pubDate>Fri, 08 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;DockerDesktopが有償化されてから使わないようにアンインストールしてUbuntu上のDockerを動かすようにしていたが先日下記のようなエラーが発生した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker.credentials.errors.InitializationError: docker-credential-desktop.exe not installed or not available in PATH&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;そりゃアンインストールしていたらないだろっていう話ではあるがどこかでdockerを使うのにdesktop使うよっていう設定が残っているのかといろいろ調べた&lt;/p&gt;
&lt;p&gt;調べた結果下記の参考ページのCredentialStoreの設定を削除する必要があった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://zenn.dev/taiga533/articles/11f1b21ef4a5ff&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DockerDesktopからWSL2上のみで動くDockerに移行する&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;~/.docker/config.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;credsStore&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;desktop.exe&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記設定を削除して再度実行したらエラーが出なくなった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[BigQueryの日付を扱う際のメモ]]></title><description><![CDATA[よく使うと思われるクエリをメモしておく DATE_TRUNC, LAST_DAYが便利]]></description><link>https://til.swfz.io/entries/bigquery_date_function/</link><guid isPermaLink="false">https://til.swfz.io/entries/bigquery_date_function/</guid><pubDate>Fri, 25 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;よく使うと思われるクエリをメモしておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
DATE_TRUNC&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CURRENT_DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;MONTH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; first_day&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 月初&lt;/span&gt;
LAST_DAY&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CURRENT_DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;MONTH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; last_day&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 月末&lt;/span&gt;
DATE_TRUNC&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DATE_SUB&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CURRENT_DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTERVAL&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DAY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;MONTH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; first_day_of_yesterday&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 前日起算の月初&lt;/span&gt;
LAST_DAY&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DATE_SUB&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CURRENT_DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTERVAL&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DAY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;MONTH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; last_day_of_yesterday&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 前日起算の月末&lt;/span&gt;
DATE_TRUNC&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DATE_SUB&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CURRENT_DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTERVAL&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;MONTH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;MONTH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; first_day_of_last_three_month &lt;span class=&quot;token comment&quot;&gt;# 3ヶ月前の月初&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;DATE_TRUNC, LAST_DAYが便利&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WSL2でクリップボードへコピーする]]></title><description><![CDATA[WSLであれば直接Windows側のをたたけるのでという形で直接たたける 適当にaliasに設定する（実行ファイルの場所は環境に合わせて記載する） 自分の環境だと上記だった それぞれ クリップボードへコピー Explorer…]]></description><link>https://til.swfz.io/entries/call_clip_from_wsl/</link><guid isPermaLink="false">https://til.swfz.io/entries/call_clip_from_wsl/</guid><pubDate>Sat, 19 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WSLであれば直接Windows側の&lt;code class=&quot;language-text&quot;&gt;exe&lt;/code&gt;をたたけるので&lt;code class=&quot;language-text&quot;&gt;/mnt/c/...&lt;/code&gt;という形で直接たたける&lt;/p&gt;
&lt;p&gt;適当にaliasに設定する（実行ファイルの場所は環境に合わせて記載する）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;alias clip=&apos;/mnt/c/WINDOWS/system32/clip.exe&apos;
alias explorer=&apos;/mnt/c/Windows/explorer.exe&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;自分の環境だと上記だった&lt;/p&gt;
&lt;p&gt;それぞれ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クリップボードへコピー&lt;/li&gt;
&lt;li&gt;Explorerを開く&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;に対応している&lt;/p&gt;
&lt;p&gt;たとえば、何かしらのコマンドの結果をクリップボードに直接コピーするといった感じの使い方ができる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ sh hoge.sh | clip&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;地味に便利&lt;/p&gt;
&lt;p&gt;クリップボードの話だけで言うとXを使って連携する方法もあるようだが常にXを起動しておくのもなーと思いこの方法を取っている&lt;/p&gt;
&lt;p&gt;今のところ不便はしていない&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JSONファイルをBigQueryに読ませJSON型で扱うためにそのままCSVで保存する]]></title><description><![CDATA[Working with JSON data in Standard SQL  |  BigQuery  |  Google Cloud 先日BigQueryでnative JSON型がプレビューでサポートされた 執筆時点ではloadはCSV…]]></description><link>https://til.swfz.io/entries/json_to_csv/</link><guid isPermaLink="false">https://til.swfz.io/entries/json_to_csv/</guid><pubDate>Mon, 28 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/bigquery/docs/reference/standard-sql/json-data&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Working with JSON data in Standard SQL  |  BigQuery  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;先日BigQueryでnative JSON型がプレビューでサポートされた&lt;/p&gt;
&lt;p&gt;執筆時点ではloadはCSVしか対応していないようだったのでJSONのファイルはCSVに変換する必要がある&lt;/p&gt;
&lt;p&gt;とりあえず使ってみるためにJSONを返すAPIのレスポンスをまるまるCSVにして突っ込んでみることにした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cat hoge.json| jq -r &apos;[.|tostring]|@csv&apos; &gt; hoge.csv&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;schema.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NULLABLE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JSON&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;load&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bq load --replace --source_format=CSV ${GOOGLE_PROJECT}:sample.content_text hoge.csv ./schema.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでJSON型を使えるようになった&lt;/p&gt;
&lt;p&gt;1ファイル1レコードという力技だが扱う容量が多くなければこの方法でもいける&lt;/p&gt;
&lt;p&gt;何度かSQLたたいてみたけどSTRUCTやREPEATEDなど今まで型でサポートしてくれていた部分を考慮してあげないといけない&lt;/p&gt;
&lt;p&gt;なのでいったん特定のカラムを抜き出す工程みたいなのが必要&lt;/p&gt;
&lt;p&gt;配列も&lt;code class=&quot;language-text&quot;&gt;JSON_QUERY_ARRAY&lt;/code&gt;を挟んであげる必要があるなどまぁそうだよなという感じ&lt;/p&gt;
&lt;p&gt;load対象がJSONファイルで特定のキー以下をJSON型として扱うということができるようになってほしいと感じた&lt;/p&gt;
&lt;p&gt;現状だと上記のようにひと手間かけないといけないのでデータレイク的なところから一次整形処理を挟む必要が出てくるのでまだちょっと使いづらいなーという感じ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ansible-lintの特定ルール除外方法]]></title><description><![CDATA[dotfilesのAnsibleでansible-lintを走らせているがいつの間にか失敗するようになっていたので少し調べた エラー自体はルールが追加されたようだった 以前はID(やなど)指定で除外していたがlintを実行しても結果にID…]]></description><link>https://til.swfz.io/entries/ansiblelint_noqa_ids_to_name/</link><guid isPermaLink="false">https://til.swfz.io/entries/ansiblelint_noqa_ids_to_name/</guid><pubDate>Fri, 25 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;dotfilesのAnsibleでansible-lintを走らせているがいつの間にか失敗するようになっていたので少し調べた&lt;/p&gt;
&lt;p&gt;エラー自体はルールが追加されたようだった&lt;/p&gt;
&lt;p&gt;以前はID(&lt;code class=&quot;language-text&quot;&gt;301&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;201&lt;/code&gt;など)指定で除外していたがlintを実行しても結果にIDが見つからないのでソースを調べに行った&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hoeg&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# noqa 301&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;下記コメントにIDでの指定が非推奨というコメントを発見した&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ansible-community/ansible-lint/blob/main/src/ansiblelint/constants.py&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ansible-lint/constants.py at main · ansible-community/ansible-lint&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今後は名前で指定していくよう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;- name: install diff-so-fancy # noqa 301
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;- name: install diff-so-fancy # noqa no-changed-when&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;このほうがわかりやすいので良いと思います&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;IDでの除外指定も試してみたらまだID指定でも除外できるようなのですぐ影響はないが変えておくと良さそう&lt;/p&gt;
&lt;p&gt;ちなみに、デフォルトのルールは下記から探すことができる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ansible-lint.readthedocs.io/en/latest/default_rules.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Default Rules — Ansible Lint Documentation&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHubのコミットコメントでIssueを自動でCloseさせる]]></title><description><![CDATA[プライベートのリポジトリで、デフォルトブランチに対してというようにコミット時にコメントを書いてpushしたら対象Issueが自動でCloseされた ちょっと調べてみたがデフォルトでそういう機能があるっぽい Autolinked references and URLs…]]></description><link>https://til.swfz.io/entries/github_autoaction_from_commit_comment/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_autoaction_from_commit_comment/</guid><pubDate>Wed, 16 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;プライベートのリポジトリで、デフォルトブランチに対して&lt;code class=&quot;language-text&quot;&gt;fix: #number&lt;/code&gt;というようにコミット時にコメントを書いてpushしたら対象Issueが自動でCloseされた&lt;/p&gt;
&lt;p&gt;ちょっと調べてみたがデフォルトでそういう機能があるっぽい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/autolinked-references-and-urls#issues-and-pull-requests&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Autolinked references and URLs - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;autolinkは知っていた、commitログにいつも含めてたし活用していた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Linking a pull request to an issue - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;close&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;fix&lt;/code&gt;というキーワードに反応して自動で閉じてくれるのは知らなかった&lt;/p&gt;
&lt;p&gt;デフォルトブランチのコミットログに対して発動するみたいなので&lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;直pushやPR中のコミットログをMergeしたりしたらそのタイミングでCloseされる&lt;/p&gt;
&lt;p&gt;ドキュメントには&lt;code class=&quot;language-text&quot;&gt;close #number&lt;/code&gt;とあったが&lt;code class=&quot;language-text&quot;&gt;fix: #number&lt;/code&gt;でもクローズされたので結構マッチする範囲が広いのかな&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;なんにせよ便利ではあるので覚えておこうと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[dayjsをTypeScriptで使う]]></title><description><![CDATA[コンパイルエラーで動かん!と何度か調べてたがドキュメントちゃんと読め案件だった ドキュメント Typescript · Day.js なんとなく最初の方だけ読んでコピーして動かしてみたらコンパイルエラーで「なんで!!!」と言ってたがよく読んだらtsconfig…]]></description><link>https://til.swfz.io/entries/typescript_dayjs/</link><guid isPermaLink="false">https://til.swfz.io/entries/typescript_dayjs/</guid><pubDate>Sat, 12 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;コンパイルエラーで動かん!と何度か調べてたがドキュメントちゃんと読め案件だった&lt;/p&gt;
&lt;h3&gt;ドキュメント&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://day.js.org/docs/en/installation/typescript&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Typescript · Day.js&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なんとなく最初の方だけ読んでコピーして動かしてみたらコンパイルエラーで「なんで!!!」と言ってたがよく読んだらtsconfigの中身によって読み込み方法を変えてねと書いてあった&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;esModuleInterop&lt;/code&gt;がtrueになっている場合は&lt;code class=&quot;language-text&quot;&gt;import dayjs from &quot;dayjs&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;falseの場合は&lt;code class=&quot;language-text&quot;&gt;import * as &quot;dayjs&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;dayjsに関してはとりあえず毎度調べて困ることはなくなった&lt;/p&gt;
&lt;p&gt;この辺のES ModulesとCommonJSがーっていうのとオプションの有無によるモジュール読み込み方法が変わることに対する理解は正直あまり深まっていない&lt;/p&gt;
&lt;p&gt;いくつか記事読んでみたが説明できるほど理解できなかったのでまた別の機会で…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub Projects(beta)のデータを収集する]]></title><description><![CDATA[GitHubのProjects（Beta）を使って自動化や集計をするなどしたい場合のメモ APIの基本的な使い方に関しては下記を参照し、1つずつ実行していけばイメージはつかめる APIを使ったプロジェクト（ベータ）の管理 - GitHub Docs 事前にProjectのID…]]></description><link>https://til.swfz.io/entries/github_projects_data_from_graphql/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_projects_data_from_graphql/</guid><pubDate>Fri, 21 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHubのProjects（Beta）を使って自動化や集計をするなどしたい場合のメモ&lt;/p&gt;
&lt;p&gt;APIの基本的な使い方に関しては下記を参照し、1つずつ実行していけばイメージはつかめる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/issues/trying-out-the-new-projects-experience/using-the-api-to-manage-projects&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;APIを使ったプロジェクト（ベータ）の管理 - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;事前にProjectのIDだけ取得しメモしておく&lt;/p&gt;
&lt;p&gt;次のクエリ一発でだいたい必要なデータは取れそう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$project_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property-query&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$project_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ProjectNext&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property-query&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;title&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;createdAt&lt;/span&gt;
          &lt;span class=&quot;token property-query&quot;&gt;fieldValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;value&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;createdAt&lt;/span&gt;
              &lt;span class=&quot;token object&quot;&gt;projectField&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;settings&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token object&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Issue&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;number&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;url&lt;/span&gt;
              &lt;span class=&quot;token object&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token object&quot;&gt;milestone&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;title&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;createdAt&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;closed&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;closedAt&lt;/span&gt;
              &lt;span class=&quot;token property-query&quot;&gt;assignees&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PullRequest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;number&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;url&lt;/span&gt;
              &lt;span class=&quot;token property-query&quot;&gt;assignees&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token object&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;createdAt&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;closed&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;closedAt&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;merged&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;mergedAt&lt;/span&gt;
              &lt;span class=&quot;token property-query&quot;&gt;reviewRequests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token object&quot;&gt;requestedReviewer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                      &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;updatedAt&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;project_idは事前にメモしておいた値&lt;/p&gt;
&lt;p&gt;どのカラムが必要かなどは下記で&lt;code class=&quot;language-text&quot;&gt;Explorer&lt;/code&gt;を展開して1つずつ見ていけば把握できる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/graphql/overview/explorer&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Explorer - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Explorerのiframeの範囲が狭くて見づらいのがちょっと不満ではあるがそれ以外は便利に使える&lt;/p&gt;
&lt;p&gt;カードに紐づくIssueやPullRequestなどの情報も取ってこれるのでフラットにして集計する前のデータとして使える&lt;/p&gt;
&lt;p&gt;とりあえずプロジェクトのデータ使って云々やりたい場合はこのくらいデータが有れば十分かなと感じる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;結果（一部抜粋）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;items&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;nodes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;timerの時刻がブラウザの負荷状況によってずれる&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PNI_xxxxxxxxxxxxxxxxxxxx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-01-19T06:12:59Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;fieldValues&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;nodes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;timerの時刻がブラウザの負荷状況によってずれる&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;projectField&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Title&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{\&quot;width\&quot;:319}&quot;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;98236657&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;projectField&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Status&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{\&quot;width\&quot;:125,\&quot;options\&quot;:[{\&quot;id\&quot;:\&quot;xxxxxxx1\&quot;,\&quot;name\&quot;:\&quot;New\&quot;,\&quot;name_html\&quot;:\&quot;New\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxx2\&quot;,\&quot;name\&quot;:\&quot;Epic\&quot;,\&quot;name_html\&quot;:\&quot;Epic\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxx3\&quot;,\&quot;name\&quot;:\&quot;Idea\&quot;,\&quot;name_html\&quot;:\&quot;Idea\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxx4\&quot;,\&quot;name\&quot;:\&quot;Todo\&quot;,\&quot;name_html\&quot;:\&quot;Todo\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxx5\&quot;,\&quot;name\&quot;:\&quot;In Progress\&quot;,\&quot;name_html\&quot;:\&quot;In Progress\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxx6\&quot;,\&quot;name\&quot;:\&quot;Review\&quot;,\&quot;name_html\&quot;:\&quot;Review\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxx7\&quot;,\&quot;name\&quot;:\&quot;Done\&quot;,\&quot;name_html\&quot;:\&quot;Done\&quot;}]}&quot;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;projectField&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Point&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{\&quot;width\&quot;:69}&quot;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-01-01T00:00:00+00:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;projectField&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Month&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;null&quot;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;e9bbecfa&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;token property&quot;&gt;&quot;projectField&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Iteration&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{\&quot;configuration\&quot;:{\&quot;duration\&quot;:14,\&quot;start_day\&quot;:1,\&quot;iterations\&quot;:[{\&quot;id\&quot;:\&quot;xxxxxxa\&quot;,\&quot;title\&quot;:\&quot;2022-01_2\&quot;,\&quot;duration\&quot;:14,\&quot;start_date\&quot;:\&quot;2022-01-17\&quot;,\&quot;title_html\&quot;:\&quot;2022-01_2\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxb\&quot;,\&quot;title\&quot;:\&quot;2022-02_1\&quot;,\&quot;duration\&quot;:14,\&quot;start_date\&quot;:\&quot;2022-01-31\&quot;,\&quot;title_html\&quot;:\&quot;2022-02_1\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxc\&quot;,\&quot;title\&quot;:\&quot;2022-02_2\&quot;,\&quot;duration\&quot;:14,\&quot;start_date\&quot;:\&quot;2022-02-14\&quot;,\&quot;title_html\&quot;:\&quot;2022-02_2\&quot;}],\&quot;completed_iterations\&quot;:[{\&quot;id\&quot;:\&quot;xxxxxxd\&quot;,\&quot;title\&quot;:\&quot;2022-01_1\&quot;,\&quot;duration\&quot;:14,\&quot;start_date\&quot;:\&quot;2022-01-03\&quot;,\&quot;title_html\&quot;:\&quot;2022-01_1\&quot;},{\&quot;id\&quot;:\&quot;xxxxxxe\&quot;,\&quot;title\&quot;:\&quot;Iteration 1\&quot;,\&quot;duration\&quot;:7,\&quot;start_date\&quot;:\&quot;2021-12-27\&quot;,\&quot;title_html\&quot;:\&quot;Iteration 1\&quot;}]}}&quot;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;I_xxxxxxxxxxxxxxxx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;number&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;56&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/swfz/tools/issues/56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;closed&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;closedAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-01-20T16:27:38Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-01-19T06:12:59Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;repository&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tools&quot;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;milestone&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;assignees&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;nodes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swfz&quot;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          .....
          .....
          .....
          .....&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;また、実際にこのデータを用いて何かやるなら100件以上のデータが存在することのほうが多いはずなのでページングにも対応したクエリにする必要があるが今回はここまで&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker環境でAnsibleのget_url実行が失敗する]]></title><description><![CDATA[新しい開発環境ではAnsibleでローカル環境を作るようにしているが次のようにansibleの実行に失敗してしまっていた 名前解決ができていないという状態のようだったのでDNSサーバを指定してあげれば良い docker-compose.yml 上記のようにを指定することで解決した]]></description><link>https://til.swfz.io/entries/docker_compose_dns/</link><guid isPermaLink="false">https://til.swfz.io/entries/docker_compose_dns/</guid><pubDate>Mon, 10 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;新しい開発環境ではAnsibleでローカル環境を作るようにしているが次のようにansibleの&lt;code class=&quot;language-text&quot;&gt;get_url&lt;/code&gt;実行に失敗してしまっていた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;fatal: [localhost]: FAILED! =&gt; {&quot;changed&quot;: false, &quot;msg&quot;: &quot;Failed to connect to objects.githubusercontent.com at port 443: [Errno -5] No address associated with hostname&quot;}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;名前解決ができていないという状態のようだったのでDNSサーバを指定してあげれば良い&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docker-compose.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./ansible
    &lt;span class=&quot;token key atrule&quot;&gt;dns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 8.8.8.8&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記のように&lt;code class=&quot;language-text&quot;&gt;dns&lt;/code&gt;を指定することで解決した&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub CLIでGraphQLのオプショナルな引数を扱う]]></title><description><![CDATA[GitHubのCLIからGitHubのAPIをたたくことができる 最近知って便利でよく使っているが、GitHub CLIのオプションを使って特定のパラメータを渡す場合と渡さない場合どちらも同じGraphQLのクエリを使いたいというパターンの話 具体的に言うと件数が10…]]></description><link>https://til.swfz.io/entries/graphql_optional_in_gh_cli/</link><guid isPermaLink="false">https://til.swfz.io/entries/graphql_optional_in_gh_cli/</guid><pubDate>Sat, 08 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHubのCLIからGitHubのAPIをたたくことができる&lt;/p&gt;
&lt;p&gt;最近知って便利でよく使っているが、GitHub CLIのオプションを使って特定のパラメータを渡す場合と渡さない場合どちらも同じGraphQLのクエリを使いたいというパターンの話&lt;/p&gt;
&lt;p&gt;具体的に言うと件数が100件以上ある場合、GitHubのAPIだと100件が上限なので2回目以降のリクエストで&lt;code class=&quot;language-text&quot;&gt;endCursor&lt;/code&gt;の値を渡して&lt;code class=&quot;language-text&quot;&gt;after&lt;/code&gt;に指定する必要がある&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;cursor&lt;/code&gt;の値を渡す場合と渡さない場合でもクエリは統一して扱いたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;projects.graphql&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$projectId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token scalar&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property-query&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$projectId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ProjectNext&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property-query&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;after&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token object&quot;&gt;pageInfo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;hasNextPage&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;endCursor&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;title&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;updatedAt&lt;/span&gt;
          &lt;span class=&quot;token property-query&quot;&gt;fieldValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token object&quot;&gt;nodes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;value&lt;/span&gt;
              &lt;span class=&quot;token object&quot;&gt;projectField&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;値が必須かどうかは&lt;code class=&quot;language-text&quot;&gt;!&lt;/code&gt;をつけるかで変わる&lt;/p&gt;
&lt;p&gt;この場合&lt;code class=&quot;language-text&quot;&gt;ID!&lt;/code&gt;となっているので&lt;code class=&quot;language-text&quot;&gt;$projectId&lt;/code&gt;は必須パラメータ、&lt;code class=&quot;language-text&quot;&gt;$cursor&lt;/code&gt;はオプショナルなパラメータ（null許容）&lt;/p&gt;
&lt;p&gt;実際のコマンドは下記(環境変数として&lt;code class=&quot;language-text&quot;&gt;GITHUB_PROJECT_ID&lt;/code&gt;を定義済みの前提)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引数あり（cursor付き）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token property&quot;&gt;gh&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;api&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;graphql&lt;/span&gt; -&lt;span class=&quot;token property&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;$(cat projects.graphql)&quot;&lt;/span&gt; -&lt;span class=&quot;token property&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;projectId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;GITHUB_PROJECT_ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; -&lt;span class=&quot;token property&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;hogehoge&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;引数なし（cursorなし）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token property&quot;&gt;gh&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;api&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;graphql&lt;/span&gt; -&lt;span class=&quot;token property&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;$(cat projects.graphql)&quot;&lt;/span&gt; -&lt;span class=&quot;token property&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;projectId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;GITHUB_PROJECT_ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;どちらもエラーにならず結果が返ってくる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gatsbyでnode-sassの依存と戦ってたら不要になっていた]]></title><description><![CDATA[本ブログ（gatsby）でnode-sassをなんとなく使っていたがrenovateで毎度対応が必要になっていてどうしたものかなーと思っていた 毎度のごとく調べていたら次のような記事を見つけた さらば Error: Node Sass version X.X.X is…]]></description><link>https://til.swfz.io/entries/gatsby_node_sass_to_sass/</link><guid isPermaLink="false">https://til.swfz.io/entries/gatsby_node_sass_to_sass/</guid><pubDate>Tue, 04 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本ブログ（gatsby）でnode-sassをなんとなく使っていたがrenovateで毎度対応が必要になっていてどうしたものかなーと思っていた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Module Error (from ./node_modules/sass-loader/dist/cjs.js):
Node Sass version 7.0.1 is incompatible with ^4.0.0 || ^5.0.0 || ^6.0.0.
error Command failed with exit code 1.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;毎度のごとく調べていたら次のような記事を見つけた&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/slangsoft/items/acd66675e5e46febfa8d&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;さらば Error: Node Sass version X.X.X is incompatible with ^X.X.X. - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なるほど!node-sassは非推奨!&lt;/p&gt;
&lt;p&gt;gatsbyのプラグイン側ではどうしているのかということでドキュメントを見に行った&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/plugins/gatsby-plugin-sass/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gatsby-plugin-sass | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gatsbyの公式でも次のように言及している&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By default, the Dart implementation of Sass (sass) is used. To use the implementation written in Node (node-sass), you can install node-sass instead of sass and pass it into the options as the implementation:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;デフォルトではsass（dart-sass）を使用するらしい&lt;/p&gt;
&lt;p&gt;gatsbyのv2から使っていたので少なくともそのときはnode-sassが非推奨ではなかったのかな？&lt;/p&gt;
&lt;p&gt;そこまで追えてないがあえてnode-sassを入れる必要はないようだ&lt;/p&gt;
&lt;p&gt;このあたりを見てみたが、自分のプロジェクトはsassではなくnode-sassを入れていた&lt;/p&gt;
&lt;p&gt;そしてsassは依存に入っていなかった&lt;/p&gt;
&lt;p&gt;ドキュメントでは&lt;code class=&quot;language-text&quot;&gt;node-sass&lt;/code&gt;を使用するときは明示的に指定するようにって感じのことを書いてあった&lt;/p&gt;
&lt;p&gt;しかし、&lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt;でオプションを何も指定していなかったとしても気を利かして&lt;code class=&quot;language-text&quot;&gt;node-sass&lt;/code&gt;を読んでくれていたよう&lt;/p&gt;
&lt;h2&gt;node-sass -&gt; sass&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; remove node-sass
&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; sass&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で解決&lt;/p&gt;</content:encoded></item><item><title><![CDATA[mswでSVGをモックする]]></title><description><![CDATA[本ブログでPixelaのグラフを表示させるようにした 表示するだけなら下記にあるようにiframeで呼び出すだけでOK 草グラフを iframe タグで簡単に埋め込む（Pixela v1.12.1） - えいのうにっき が、Gatsby…]]></description><link>https://til.swfz.io/entries/msw_mock_svg/</link><guid isPermaLink="false">https://til.swfz.io/entries/msw_mock_svg/</guid><pubDate>Wed, 29 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本ブログでPixelaのグラフを表示させるようにした&lt;/p&gt;
&lt;p&gt;表示するだけなら下記にあるようにiframeで呼び出すだけでOK&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.a-know.me/entry/2019/06/16/210915&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;草グラフを iframe タグで簡単に埋め込む（Pixela v1.12.1） - えいのうにっき&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;が、Gatsbyなどで開発しているときなどは特にリクエストを外部に送る必要がないためURLを出し分けするなりモックするなどできたら良いなと思っていた&lt;/p&gt;
&lt;p&gt;これができていればuseEffectでミスって無限ループしてしまったときなども特に心配せずに開発できる&lt;/p&gt;
&lt;p&gt;mswを使えば外部リクエストをモックできるので行けそう?だったがiframeの中身のコンテンツのモックはできないようなのでSVGを表示する方法にする&lt;/p&gt;
&lt;p&gt;ということでmswを使ってSVGをモックするようにしてみた&lt;/p&gt;
&lt;h2&gt;install&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mswjs.io/docs/getting-started/install&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Install - Getting Started - Mock Service Worker Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;基本的にはドキュメントを見て進めるでOKそう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--dev&lt;/span&gt; msw
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; src/mocks
&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; src/mocks/handlers.ts&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;publicディレクトリに作成する&lt;/p&gt;
&lt;p&gt;gatsbyなので&lt;code class=&quot;language-text&quot;&gt;static/&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx msw init static/ --save&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;すると&lt;code class=&quot;language-text&quot;&gt;static/mockServiceWorker.js&lt;/code&gt;というファイルが生成される&lt;/p&gt;
&lt;h2&gt;svgファイルをモックする&lt;/h2&gt;
&lt;p&gt;必要な修正をする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-browser.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;startWorker&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; worker &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./src/mocks/browser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; worker&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;ServiceWorker&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/pixela-mock&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;onClientEntry&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NODE_ENV&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;development&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;startWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Gatsbyのレンダリング初期にモック処理ができるか調べてみた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kiotera-tech.com/gatsby_doc_recipes_summary&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Gatsbyドキュメント Doc -&gt; Recipes ざっくりまとめ - 奇をてらったテクノロジー&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://kiotera-tech.com/gatsby_doc_recipes_summary:embed:cite&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://kiotera-tech.com/gatsby_doc_recipes_summary:embed:cite&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Gatsbyのライフサイクル&lt;code class=&quot;language-text&quot;&gt;onClientEntry&lt;/code&gt;を使うことで可能っぽい&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;onClientEntry&lt;/code&gt;の処理時に&lt;code class=&quot;language-text&quot;&gt;startWorker&lt;/code&gt;を動かすようにした&lt;/p&gt;
&lt;p&gt;このライフサイクルを考慮せず&lt;code class=&quot;language-text&quot;&gt;startWorker&lt;/code&gt;を書いてしまうとタイミングによってはモックされたりされなかったり…という現象に見舞われた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;src/mocks/browser.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// src/mocks/browser.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; setupWorker &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;msw&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; handlers &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./handler&apos;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// This configures a Service Worker with the given request handlers.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; worker &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setupWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;handlers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;src/mocks/handler.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; rest &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;msw&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; svgImage &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./pixela.svg&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; handlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://pixe.la/v1/users/swfz/graphs/til-pageviews&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; svgBuffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;svgImage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;arrayBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;svgBuffer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://undefined-1.algolianet.com/1/indexes/*/queries&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;results&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;hits&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;svgファイルは一度curlなり何なりでローカルに持ってきて保存しておく→&lt;code class=&quot;language-text&quot;&gt;./pixela.svg&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;おまけでalgoliaへのリクエストも開発時はほとんど使わないので定義した&lt;/p&gt;
&lt;h2&gt;SVGのモック処理&lt;/h2&gt;
&lt;p&gt;svgをモックするのどうすれば良いのかと思ったが&lt;/p&gt;
&lt;p&gt;画像と同じような感じでOKだったので&lt;code class=&quot;language-text&quot;&gt;arrayBuffer&lt;/code&gt;を使う&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mswjs/msw/issues/461&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Possible to mock an img src url? · Issue #461 · mswjs/msw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;モックできているかどうかの確認はモック用のSVGはPixelaの色を変えてからローカルに保存したのでdev用は赤、本番は青といった感じで別れている&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;mswを使って開発時はpixelaへのSVGリクエストをモックして開発時はアクセスが行かないようにした&lt;/p&gt;
&lt;p&gt;リクエスト先のURLを出し分けせずにモックできるのは非常に体験が良い&lt;/p&gt;
&lt;p&gt;外部のサービスやツールを使っていてsandbox用とかで分けられていない場合などいろんな用途に使えそう&lt;/p&gt;
&lt;p&gt;他にも用途いろいろありそうなので使っていこうと思った&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GASでよく使いそうなスニペット]]></title><description><![CDATA[二次元配列のデータをそのままスプレッドシートに記入する 2次元配列のままデータを追記できる 結構便利 ただ追記するデータとレンジが一致していないといけないので空文字で埋めたりする必要がある エラー 3行目のデータが1つ足りない エラー 3行目にデータがない Forms…]]></description><link>https://til.swfz.io/entries/gas_snippet/</link><guid isPermaLink="false">https://til.swfz.io/entries/gas_snippet/</guid><pubDate>Fri, 17 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;二次元配列のデータをそのままスプレッドシートに記入する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;cosnt data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
targetSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;A2:C4&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2次元配列のままデータを追記できる&lt;/p&gt;
&lt;p&gt;結構便利&lt;/p&gt;
&lt;p&gt;ただ追記するデータとレンジが一致していないといけないので空文字で埋めたりする必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラー&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;cosnt data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
targetSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;A2:C4&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;3行目のデータが1つ足りない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラー&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;cosnt data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
targetSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;A2:C4&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;3行目にデータがない&lt;/p&gt;
&lt;p&gt;Formsによるアンケートなどを集計したりする場合、列数がそろっていないことが往々にしてある&lt;/p&gt;
&lt;p&gt;そういう場合、データの行数、各行の最大カラム数を計算して足りない分を空文字で埋める必要がある&lt;/p&gt;
&lt;h2&gt;リストから空文字を排除する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;数が合わないな?とデバッグしてみると&lt;code class=&quot;language-text&quot;&gt;空文字が入ってた&lt;/code&gt;みたいなパターン&lt;/p&gt;
&lt;p&gt;スプレッドシートで一度でも入力があるセルは空文字になったりするのでそういうデータを除外する&lt;/p&gt;
&lt;h2&gt;要素数分だけ繰り返し処理する&lt;/h2&gt;
&lt;p&gt;要素数などを動的に取得して反復処理させたい場合など&lt;/p&gt;
&lt;p&gt;直近だとスプレッドシートのリストからFormの項目を生成するみたいなときに使った&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pageSize &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pageSize&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 何かしら&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;範囲データの中で最大列数を取得する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDataRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cur&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; cur&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; acc &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; cur&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;列数が動的な場合に最大値を取得してそれをカバーできるようにデータを整形するときに使う&lt;/p&gt;
&lt;h2&gt;対象データ範囲の中からユニークなリストを取得する&lt;/h2&gt;
&lt;p&gt;スプレッドシートのデータをRangeで取得すると2次元配列になっている&lt;/p&gt;
&lt;p&gt;flatにしてSet型でユニークな値のリストを取得する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDataRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;flat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[gh cliでCodespace上のインスタンスにファイルをコピーする]]></title><description><![CDATA[やりたい機会があったので調べてみた Using Codespaces with GitHub CLI - GitHub Docs ドキュメントを見れば解決ではある ファイルのコピー どのcodespaceに接続するか選択する、もしくは事前に調べておいてオプションで指定する gh…]]></description><link>https://til.swfz.io/entries/codespace_instance_access/</link><guid isPermaLink="false">https://til.swfz.io/entries/codespace_instance_access/</guid><pubDate>Tue, 07 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;やりたい機会があったので調べてみた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/codespaces/developing-in-codespaces/using-codespaces-with-github-cli&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Using Codespaces with GitHub CLI - GitHub Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ドキュメントを見れば解決ではある&lt;/p&gt;
&lt;h2&gt;ファイルのコピー&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gh codespace cp -e ~/memo/hoge.png &apos;remote:/workspaces/til/&apos;
? Choose codespace: swfz/til: master* [swfz-til-xxxxxxxxxxxx]
hoge.png                                                                                                      100%   51KB 220.8KB/s   00:00&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;どのcodespaceに接続するか選択する、もしくは事前に調べておいて&lt;code class=&quot;language-text&quot;&gt;-c&lt;/code&gt;オプションで指定する&lt;/p&gt;
&lt;p&gt;gh_codespace_cp01.png&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-e&lt;/code&gt;はヘルプを見れば分かるがexpand&lt;/p&gt;
&lt;p&gt;”で囲った中身をremote側で展開するためのもの&lt;/p&gt;
&lt;p&gt;なので↑のような書き方になっている&lt;/p&gt;
&lt;p&gt;GitHubのCLIが使えればOKなのでWSL2の中から特定のファイルをコピーする、といった使い方もできる&lt;/p&gt;
&lt;h2&gt;SSH接続&lt;/h2&gt;
&lt;p&gt;sshもできる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ gh codespace &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; swfz-til-xxxxxxxxxxxx&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-c&lt;/code&gt;で対象のcodespaceを指定しない場合はインタラクティブに選択させてくれる&lt;/p&gt;
&lt;p&gt;VS Codeのターミナルだと一部ショートカットが競合してしまったりすることがあるのでSSH接続していろいろやったほうが何も気にしなくてよいこともある&lt;/p&gt;
&lt;h2&gt;おわり&lt;/h2&gt;
&lt;p&gt;あらためてGitHubのCLI便利だな!と感じた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[VS Codeのターミナルプロファイル設定]]></title><description><![CDATA[前提のバージョン情報 settings.json 上記のようにlinuxの場合はdefaultでtmuxを起動させたかったのでそういう設定をしていた が、設定ファイル上で下線が出ていた  と出てきた Integrated Terminal in Visual Studio…]]></description><link>https://til.swfz.io/entries/vscode_terminal_profile/</link><guid isPermaLink="false">https://til.swfz.io/entries/vscode_terminal_profile/</guid><pubDate>Tue, 30 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;前提のバージョン情報&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;バージョン: 1.62.3 (user setup)
コミット: ccbaa2d27e38e5afa3e5c21c1c7bef4657064247
日付: 2021-11-17T08:11:14.551Z
Electron: 13.5.2
Chrome: 91.0.4472.164
Node.js: 14.16.0
V8: 9.1.269.39-electron.0
OS: Windows_NT x64 10.0.19041&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;settings.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.shell.linux&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/bin/tmux&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記のようにlinuxの場合はdefaultでtmuxを起動させたかったのでそういう設定をしていた&lt;/p&gt;
&lt;p&gt;が、設定ファイル上で下線が出ていた&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/46d3dae0b8c21e3088e0e0116d8a5f22/f1d1f/vscode_terminal_profile01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.45945945945946%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABhklEQVR42jVQa1eCQBDlN5WGdcoevhEKgXUF11ACRExRJNNOp770v2/DWh/uubNzd2bujNIaRuDzAt5ij76Xwpi8wvTX6PAYLNqh5yZosghuUhDeoIsUT/4K9ssGHXcOsTzI+p6XoNbzoNjBRn7Wxil4vINI32HNMrg0oNRYlIOFW5kr2QlzWJQf0Nv605fHHzyvjmiTCaVMDqnR4/OKitYwpysplHmbinSxhOYt0KeBJRosJHdbGTvEBull7ZAGdUfUsEdrOuGG3BXg/26CTK5cnuPemuF+MMONMUHd9NFwAjpBiAcnRJP0Np/jsi9Q04RkxaEGLTdDg79KGNMdzPCAvr9DV5CD4Ah9+oaOyKH5BVjyBSs60h3XtPZaurzSBS66LtTyho3xO65GX6gxYv4B1dlD5d9Q2QHqY4yqEaGqxxQnuKC4YixQ0UNUOi7OWxxnbQ5VG5PDE5Rr7xPXoz25yWDHe+lQ93PiHHZUwPAz1AcvuDEDyfXBie+cBe5YKnFL8T9+ASywH/dp+vgzAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/46d3dae0b8c21e3088e0e0116d8a5f22/cbe2e/vscode_terminal_profile01.webp 148w,
/static/46d3dae0b8c21e3088e0e0116d8a5f22/3084c/vscode_terminal_profile01.webp 295w,
/static/46d3dae0b8c21e3088e0e0116d8a5f22/5ca24/vscode_terminal_profile01.webp 590w,
/static/46d3dae0b8c21e3088e0e0116d8a5f22/26073/vscode_terminal_profile01.webp 739w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/46d3dae0b8c21e3088e0e0116d8a5f22/12f09/vscode_terminal_profile01.png 148w,
/static/46d3dae0b8c21e3088e0e0116d8a5f22/e4a3f/vscode_terminal_profile01.png 295w,
/static/46d3dae0b8c21e3088e0e0116d8a5f22/fcda8/vscode_terminal_profile01.png 590w,
/static/46d3dae0b8c21e3088e0e0116d8a5f22/f1d1f/vscode_terminal_profile01.png 739w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/46d3dae0b8c21e3088e0e0116d8a5f22/fcda8/vscode_terminal_profile01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;と出てきた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Integrated Terminal in Visual Studio Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;へ遷移すると&lt;/p&gt;
&lt;p&gt;profilesを設定してdefaultProfileで指定するようにしてねとのこと&lt;/p&gt;
&lt;p&gt;直接指定する方法はそのうちなくなるようなので変更した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.defaultProfile.linux&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tmux&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.profiles.osx&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;tmux&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tmux&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.profiles.linux&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;zsh_login&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;zsh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-l&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;tmux&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tmux&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable ja-technical-writing/sentence-length --&gt;
&lt;p&gt;ディストリビューションが違う場合はデフォルトも変えられる（osx, linux, Windows）、今の所WSL2とCodespaceはlinuxなのでCodespaceの方は個別スペースの設定をいじって&lt;code class=&quot;language-text&quot;&gt;zsh_login&lt;/code&gt;を適用させている（tmuxが入っていない場合があるため）&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/sentence-length --&gt;</content:encoded></item><item><title><![CDATA[NotionのAPIでページにコンテンツを追加する]]></title><description><![CDATA[ページにコンテンツ（block）を追加する pageエンドポイントに対してリクエストするのかと思っていたけど 公式ドキュメントに Block object A block object represents content within Notion. Blocks can be…]]></description><link>https://til.swfz.io/entries/notion_api_append_text_to_page/</link><guid isPermaLink="false">https://til.swfz.io/entries/notion_api_append_text_to_page/</guid><pubDate>Wed, 24 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ページにコンテンツ（block）を追加する&lt;/p&gt;
&lt;p&gt;pageエンドポイントに対してリクエストするのかと思っていたけど&lt;/p&gt;
&lt;p&gt;公式ドキュメントに&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.notion.com/reference/block&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Block object&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A block object represents content within Notion. Blocks can be text, lists, media, and more. A page is a type of block, too!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とありページもブロックと同等に扱うとあった&lt;/p&gt;
&lt;p&gt;なるほど、だからblockのエンドポイントしかみつからなかったのか&lt;/p&gt;
&lt;p&gt;ドキュメントの&lt;code class=&quot;language-text&quot;&gt;block_id&lt;/code&gt;を&lt;code class=&quot;language-text&quot;&gt;page_id&lt;/code&gt;に置き換えてAPIをたたくとpage直下のコンテンツにテキストを追加できるという感じ&lt;/p&gt;
&lt;p&gt;ほとんど公式と一緒だがとりあえずサンプル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;append.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;page_id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dummy_page_id&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hello world&quot;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; PATCH &lt;span class=&quot;token string&quot;&gt;&quot;https://api.notion.com/v1/blocks/&lt;span class=&quot;token variable&quot;&gt;${page_id}&lt;/span&gt;/children&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Authorization: Bearer &apos;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NOTION_API_KEY&lt;/span&gt;&quot;&lt;/span&gt;&apos;&apos; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Notion-Version: 2021-08-16&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--data&lt;/span&gt; @- &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOS
{
  &quot;children&quot;: [
  {
    &quot;object&quot;: &quot;block&quot;,
    &quot;type&quot;: &quot;paragraph&quot;,
    &quot;paragraph&quot;: {
      &quot;text&quot;: [{&quot;type&quot;: &quot;text&quot;, &quot;text&quot;: {&quot;content&quot;: &quot;Hi! Text &lt;span class=&quot;token variable&quot;&gt;${text}&lt;/span&gt;&quot;}}]
    }
  }]
}
EOS&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notion上でテキストが追加されたことを確認できた&lt;/p&gt;
&lt;p&gt;ある程度触ってみたけど割と扱いやすい気がしてきた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CentOS7でAnsible実行時にCERTIFICATE_VERIFY_FAILED]]></title><description><![CDATA[CentOS7のイメージ中でAnsibleを使ってでGitをソースからインストールしている処理があったがそこで問題が発生していた 証明書関連かーというのはすぐ分かるが、じゃどうすれば良いのってことで Ansibleだとrequestsかcertificate…]]></description><link>https://til.swfz.io/entries/require_ca_certificate_in_ansible_centos7/</link><guid isPermaLink="false">https://til.swfz.io/entries/require_ca_certificate_in_ansible_centos7/</guid><pubDate>Wed, 10 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CentOS7のイメージ中でAnsibleを使って&lt;code class=&quot;language-text&quot;&gt;get_url&lt;/code&gt;でGitをソースからインストールしている処理があったがそこで問題が発生していた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;fatal: [localhost]: FAILED! =&gt; {&quot;changed&quot;: false, &quot;dest&quot;: &quot;/tmp/git-2.33.0.tar.gz&quot;, &quot;elapsed&quot;: 0, &quot;msg&quot;: &quot;Request failed: &amp;lt;urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:618)&gt;&quot;, &quot;url&quot;: &quot;https://www.kernel.org/pub/software/scm/git/git-2.33.0.tar.gz&quot;}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;証明書関連かーというのはすぐ分かるが、じゃどうすれば良いのってことで&lt;/p&gt;
&lt;p&gt;Ansibleだとrequestsかcertificateモジュールを更新すればよいのかと思って更新してみたものの解決されず&lt;/p&gt;
&lt;p&gt;証明書リストを追加すればOK?みたいな感じで探していたら次の記事に助けられた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.walbrix.co.jp/article/openssl-102-letsencrypt-crisis.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Let’s EncryptのルートCA期限切れで OpenSSL 1.0.2が思わぬ事故を起こす件 | ワルブリックス株式会社&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;www.kernel.org&lt;/code&gt;を見に行ったらLet’s Encryptと&lt;code class=&quot;language-text&quot;&gt;ISRG Root X1&lt;/code&gt;の組み合わせだった&lt;/p&gt;
&lt;p&gt;最新のOSバージョンでは解決しているとのことだったので今一度更新してから試そうとしてみた&lt;/p&gt;
&lt;p&gt;dockerでイメージビルドするときは最新を指定してたはずなのでどうかなと思ったもののいったん&lt;code class=&quot;language-text&quot;&gt;yum update&lt;/code&gt;で更新して試してみた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ yum update
===============================================================================================================================================================================
 Package                                       Arch                              Version                                              Repository                          Size
===============================================================================================================================================================================
Updating:
 bind-license                                  noarch                            32:9.11.4-26.P2.el7_9.7                              updates                             91 k
 ca-certificates                               noarch                            2021.2.50-72.el7_9                                   updates                            379 k
 centos-release                                x86_64                            7-9.2009.1.el7.centos                                updates                             27 k
 coreutils                                     x86_64                            8.22-24.el7_9.2                                      updates                            3.3 M
 device-mapper                                 x86_64                            7:1.02.170-6.el7_9.5                                 updates                            297 k
 device-mapper-libs                            x86_64                            7:1.02.170-6.el7_9.5                                 updates                            325 k
 epel-release                                  noarch                            7-14                                                 epel                                15 k
 glib2                                         x86_64                            2.56.1-9.el7_9                                       updates                            2.5 M
 glibc                                         x86_64                            2.17-325.el7_9                                       updates                            3.6 M
 glibc-common                                  x86_64                            2.17-325.el7_9                                       updates                             12 M
 glibc-devel                                   x86_64                            2.17-325.el7_9                                       updates                            1.1 M
 glibc-headers                                 x86_64                            2.17-325.el7_9                                       updates                            691 k
 kernel-headers                                x86_64                            3.10.0-1160.45.1.el7                                 updates                            9.0 M
 kpartx                                        x86_64                            0.4.9-135.el7_9                                      updates                             81 k
 libblkid                                      x86_64                            2.23.2-65.el7_9.1                                    updates                            183 k
 libmount                                      x86_64                            2.23.2-65.el7_9.1                                    updates                            185 k
 libsmartcols                                  x86_64                            2.23.2-65.el7_9.1                                    updates                            143 k
 libuuid                                       x86_64                            2.23.2-65.el7_9.1                                    updates                             84 k
 nspr                                          x86_64                            4.32.0-1.el7_9                                       updates                            127 k
 nss                                           x86_64                            3.67.0-3.el7_9                                       updates                            882 k
 nss-softokn                                   x86_64                            3.67.0-3.el7_9                                       updates                            358 k
 nss-softokn-freebl                            x86_64                            3.67.0-3.el7_9                                       updates                            337 k
 nss-sysinit                                   x86_64                            3.67.0-3.el7_9                                       updates                             66 k
 nss-tools                                     x86_64                            3.67.0-3.el7_9                                       updates                            549 k
 nss-util                                      x86_64                            3.67.0-1.el7_9                                       updates                             79 k
 openldap                                      x86_64                            2.4.44-24.el7_9                                      updates                            356 k
 python                                        x86_64                            2.7.5-90.el7                                         updates                             96 k
 python-libs                                   x86_64                            2.7.5-90.el7                                         updates                            5.6 M
 rpm                                           x86_64                            4.11.3-46.el7_9                                      updates                            1.2 M
 rpm-build-libs                                x86_64                            4.11.3-46.el7_9                                      updates                            108 k
 rpm-libs                                      x86_64                            4.11.3-46.el7_9                                      updates                            279 k
 rpm-python                                    x86_64                            4.11.3-46.el7_9                                      updates                             84 k
 sudo                                          x86_64                            1.8.23-10.el7_9.2                                    updates                            843 k
 systemd                                       x86_64                            219-78.el7_9.3                                       updates                            5.1 M
 systemd-libs                                  x86_64                            219-78.el7_9.3                                       updates                            418 k
 tzdata                                        noarch                            2021c-1.el7                                          updates                            502 k
 util-linux                                    x86_64                            2.23.2-65.el7_9.1                                    updates                            2.0 M
 vim-minimal                                   x86_64                            2:7.4.629-8.el7_9                                    updates                            443 k

Transaction Summary
===============================================================================================================================================================================
Upgrade  38 Packages&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このあとでのansible実行は問題なく実行できた&lt;/p&gt;
&lt;p&gt;ということでこの中のどれかのパッケージを更新すれば問題なさそうという感じ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ca-certificates&lt;/code&gt;かな?CA証明書のリスト&lt;/p&gt;
&lt;p&gt;ということで&lt;code class=&quot;language-text&quot;&gt;ca-certificates&lt;/code&gt;のみlatestにするようなAnsibleを書いて再実行したところ無事成功した&lt;/p&gt;
&lt;p&gt;※参考の記事中にもよく読んだら&lt;code class=&quot;language-text&quot;&gt;ca-certificate&lt;/code&gt;パッケージを上げると書いてあった&lt;/p&gt;
&lt;p&gt;パッケージすべてlatestだと勝手に更新されて失敗してしまったりしたら困るよねっていう認識だったが逆にlatestのほうが良いものもあるんだなというのが今回の気付きでした&lt;/p&gt;
&lt;p&gt;最近ちょいちょいこのパータンにはまっている気がするので残しておく&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GoogleAppsScriptのスケジュール実行をコードで表現する]]></title><description><![CDATA[GASのコードをGit管理するならスケジューリング設定などもGit管理したい GAS自体にTrigger…]]></description><link>https://til.swfz.io/entries/gas_time_trigger/</link><guid isPermaLink="false">https://til.swfz.io/entries/gas_time_trigger/</guid><pubDate>Wed, 03 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GASのコードをGit管理するならスケジューリング設定などもGit管理したい&lt;/p&gt;
&lt;p&gt;GAS自体にTriggerを設定する関数が存在するのでそれを使ってコードを書けば初回は手動実行になってしまうが一応管理することが可能&lt;/p&gt;
&lt;p&gt;ということで調べた&lt;/p&gt;
&lt;p&gt;変更がある場合スケジューリングの作り直しになるのでどちらにしても既存のスケジュールの手動削除が必要そう&lt;/p&gt;
&lt;p&gt;まぁこういうスケジュールを設定していますっていうのをコードに残しておくという意味ではメリットがあるくらいだがやらないよりは良いかなって感じ&lt;/p&gt;
&lt;p&gt;スケジュールでのTriggerBuilderのドキュメントは下記&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/apps-script/reference/script/clock-trigger-builder&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Class ClockTriggerBuilder  |  Apps Script  |  Google Developers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;結局今回はこんな感じにした&lt;/p&gt;
&lt;p&gt;良くある毎日9:30に実行しますって感じのやつ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setScheduleTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;mainFunction&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;timeBased&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;atHour&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nearMinute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;everyDays&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;inTimezone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Asia/Tokyo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mainFunction&lt;/code&gt;はスケジュールで実行させたい関数名&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nearMinute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドキュメントから引用&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;トリガーが実行される分を指定します（プラスまたはマイナス15分）。 nearMinute（）が呼び出されない場合、ランダムな分の値が使用されます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とのこと&lt;/p&gt;
&lt;p&gt;なのでこの記述だと&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;毎日9:15~9:45の間に実行するというようなスケジュールトリガーをセットする&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;完全に固定はできないみたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;inTimezone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スクリプトのタイムゾーンがデフォルトだが指定もできる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DataPortalでDatetime的な文字列から10秒ごと、30秒ごと、分ごとの値を計算する]]></title><description><![CDATA[seconds 分ごと 10秒ごと 30秒ごと  albのログから秒数ごとのサーバの状況を把握したいパターンがあったので頑張った 別途SQLでよしなに頑張るものの頑張った後は上記のようにpivot…]]></description><link>https://til.swfz.io/entries/dataportal_per10seconds_field/</link><guid isPermaLink="false">https://til.swfz.io/entries/dataportal_per10seconds_field/</guid><pubDate>Sat, 23 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;seconds&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;2021-10-15 03:04:30&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;分ごと&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;FORMAT_DATETIME(&quot;%Y-%m-%d %H:%M:00&quot;, seconds)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;10秒ごと&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CONCAT(FORMAT_DATETIME(&quot;%Y-%m-%d %H:%M:&quot;, seconds), SUBSTR( FORMAT_DATETIME(&quot;%S&quot;, seconds),1,1),&quot;0&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;30秒ごと&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CONCAT(FORMAT_DATETIME(&quot;%Y-%m-%d %H:%M:&quot;, seconds), IF(SECOND(seconds) &gt; 30, &quot;30&quot;, &quot;00&quot;))&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 546px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d47c83bcb63c4f607241aa1a44c7083f/76aed/dataportal_per10seconds_field01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 127.70270270270272%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAABYlAAAWJQFJUiTwAAAB10lEQVR42pWViY7DIAwF8/8fWqn3fR+sxtJELoXubiT0EgueB0NgWK/XZTqdltls9tHm83lTv7Vhu91Gx8Vi8dFI1DPt6fB6vUrrIX65XEKv12vo7XYrz+cz9PF4lPv9PqptgGIymZTlchlEdOBh4Pl8Dj2dThFHGUQcUxKiJKTxPdBptVoVakkDnQEMpByQYdpTGsnU4Xg8ls1mE4N3u12QSkKMTmTmW4VGQmdjmYIwG0KpId8MRDHZ7/dhcjgcYhYoZtYyCGtD3p0y3ygDMWY2GDMGY/oR41sdCNaEGkKE0rlnSPM9FoVOmGBIs4YYkAhtTVUqyYzFlKWrCa0hnSGrCVEpjYUhJk47rzJkEmrMIIw10dRY1FBCBrrKbAHaX2s4EpIVKjY3lGxsYm5cDEhGZ/RfNYQQUwndYy6Svxzqr2YbV9lfT0KUrBp+29jSvRG2akgsE1pDBlhDtLkP/1JDEuYaklgqyd4IpSPYImzVMFP5TvL4Uzy+IOTUrWtIst9qOP7LrdMmE7r/6hp29+E3Qo4jrwg6S5r3nqZvf0quocdXPpnz6ZzPQa+FLqFXQK6hhpK6KD7NVfbogtLDIU+5vktyyyseq5wvKUytYX1XZO3FuVN+AEEP4Klk8Pw4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d47c83bcb63c4f607241aa1a44c7083f/cbe2e/dataportal_per10seconds_field01.webp 148w,
/static/d47c83bcb63c4f607241aa1a44c7083f/3084c/dataportal_per10seconds_field01.webp 295w,
/static/d47c83bcb63c4f607241aa1a44c7083f/a3666/dataportal_per10seconds_field01.webp 546w&quot;
              sizes=&quot;(max-width: 546px) 100vw, 546px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d47c83bcb63c4f607241aa1a44c7083f/12f09/dataportal_per10seconds_field01.png 148w,
/static/d47c83bcb63c4f607241aa1a44c7083f/e4a3f/dataportal_per10seconds_field01.png 295w,
/static/d47c83bcb63c4f607241aa1a44c7083f/76aed/dataportal_per10seconds_field01.png 546w&quot;
            sizes=&quot;(max-width: 546px) 100vw, 546px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d47c83bcb63c4f607241aa1a44c7083f/76aed/dataportal_per10seconds_field01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;albのログから秒数ごとのサーバの状況を把握したいパターンがあったので頑張った&lt;/p&gt;
&lt;p&gt;別途SQLでよしなに頑張るものの頑張った後は上記のようにpivotの行を計算フィールドとして設定する&lt;/p&gt;
&lt;p&gt;分以下の細かな粒度でどのリクエストがいつ始まっていつ終わったか、ステータスコードは何かみたいなのがさっと閲覧できるようになった&lt;/p&gt;
&lt;p&gt;レコードが多すぎるとかなり重くなるので気を付ける必要はある&lt;/p&gt;
&lt;p&gt;ここまでやっておいて、この辺はAPM入れたほうが良さそうな気もしてきた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[VS Code Remote WSLが起動しない]]></title><description><![CDATA[PCをセットアップし直してWSLも入れ直していざVS Codeを起動したらWSLに接続できなかった エラーログ 一部文字化けしていたので該当箇所は削除した 使用しているWSLのディストリビューションがデフォルトでなくなってしまっていた模様 Developing in the…]]></description><link>https://til.swfz.io/entries/vscode_wsl_failed/</link><guid isPermaLink="false">https://til.swfz.io/entries/vscode_wsl_failed/</guid><pubDate>Thu, 14 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PCをセットアップし直してWSLも入れ直していざVS Codeを起動したらWSLに接続できなかった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラーログ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[2021-10-08 17:49:31.526] Resolving wsl+Ubuntu, resolveAttempt: 1
[2021-10-08 17:49:31.649] Starting VS Code Server inside WSL (Ubuntu)
[2021-10-08 17:49:31.649] Extension version: 0.58.2, Windows build: 19041. Multi distro support: available. WSL path support: enabled
[2021-10-08 17:49:31.650] No shell environment set or found for current distro.
[2021-10-08 17:49:31.887] Probing if server is already installed: C:\Windows\System32\wsl.exe -d Ubuntu -e sh -c &quot;[ -d ~/.vscode-server/bin/69755771804a4f5097277cbbb50dff67 ] &amp;amp;&amp;amp; printf found || ([ -f /etc/alpine-release ] &amp;amp;&amp;amp; printf alpine-; uname -m)&quot;
[2021-10-08 17:49:32.000] Unable to detect if server is already installed: Error: Command failed: C:\Windows\System32\wsl.exe -d Ubuntu -e sh -c &quot;[ -d ~/.vscode-server/bin/69755771804a4f5097277cbbb50dff67 ] &amp;amp;&amp;amp; printf found || ([ -f /etc/alpine-release ] &amp;amp;&amp;amp; printf alpine-; uname -m)&quot;
[2021-10-08 17:49:32.000] 指定されたファイルが見つかりません。
[2021-10-08 17:49:32.000] 
[2021-10-08 17:49:32.001] Launching C:\Windows\System32\wsl.exe -d Ubuntu sh -c &apos;&quot;$VSCODE_WSL_EXT_LOCATION/scripts/wslServer.sh&quot; 69755771804a4f5097277cbbb50dff67 stable .vscode-server 0  &apos;}
[2021-10-08 17:49:32.080] 
[2021-10-08 17:49:32.081] VS Code Server for WSL closed unexpectedly.
[2021-10-08 17:49:32.082] For help with startup problems, go to
[2021-10-08 17:49:32.082] https://code.visualstudio.com/docs/remote/troubleshooting#_wsl-tips
[2021-10-08 17:49:32.102] WSL Daemon exited with code 0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;一部文字化けしていたので該当箇所は削除した&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;使用しているWSLのディストリビューションがデフォルトでなくなってしまっていた模様&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/remote/wsl#_why-am-i-asked-to-change-the-default-distro&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Developing in the Windows Subsystem for Linux with Visual Studio Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;現在使っているのは&lt;code class=&quot;language-text&quot;&gt;Ubuntu-20.04&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;確認してみる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; wslconfig /l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;既定&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
docker-desktop
Ubuntu-20.04
docker-desktop-data

&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; wslconfig /setdefault Ubuntu-20.04

&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; wslconfig /l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;既定&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Ubuntu
docker-desktop
docker-desktop-data&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Ubuntu&lt;/code&gt;のディストリビューションはPC移行以前に使っていたが新しいPCにWSLのデータを移行できなかったので起動できなかったと推測できる&lt;/p&gt;
&lt;p&gt;VS CodeのRemote WSLではデフォルトのディストリビューションに接続する仕様なのでホスト側でデフォルトのWSLのディストリビューションを決めてあげる必要がある&lt;/p&gt;
&lt;p&gt;無事VS CodeでRemoteWSL拡張が使えるようになった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[tmuxで新規window/paneを起動したときの設定]]></title><description><![CDATA[開発環境を作り直すことになってしまったので作り直していたらいくつか不具合にぶつかったのでそのうちの1つのメモ 新たに起動したセッションをzshで起動したかったが起動せずbashで起動される状態になってしまった 書いたときのバージョン デフォルトのシェルはzsh…]]></description><link>https://til.swfz.io/entries/tmux_default_shell/</link><guid isPermaLink="false">https://til.swfz.io/entries/tmux_default_shell/</guid><pubDate>Sun, 10 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;開発環境を作り直すことになってしまったので作り直していたらいくつか不具合にぶつかったのでそのうちの1つのメモ&lt;/p&gt;
&lt;p&gt;新たに起動したセッションをzshで起動したかったが起動せずbashで起動される状態になってしまった&lt;/p&gt;
&lt;p&gt;書いたときのバージョン&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Ubuntu: 20.04
tmux: 3.2a&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デフォルトのシェルはzshなのになぜ…と調べてみると&lt;/p&gt;
&lt;p&gt;同じ人が大勢いたよう&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://superuser.com/questions/253786/how-can-i-make-tmux-use-my-default-shell&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;zsh - How can I make tmux use my default shell? - Super User&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;↑に解決方法が載っていた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tmux.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;set-option -g default-shell $SHELL&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;いつからかこのオプションを指定しないといけないようになったのかとは思うものの明示的に指定しておいたほうが良いのは確かなので設定を追加した&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[Windows TerminalでWSL(Ubuntu)の初期ディレクトリの指定]]></title><description><![CDATA[WSLでデフォルトのディレクトリ指定をする 書いた時点での環境 WSLのprofile設定の中のcommandlineでを指定すればOK の後に開始ディレクトリを指定できる なしだとWindowsTerminal…]]></description><link>https://til.swfz.io/entries/windows_terminal_default_directory_in_wsl/</link><guid isPermaLink="false">https://til.swfz.io/entries/windows_terminal_default_directory_in_wsl/</guid><pubDate>Sat, 09 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WSLでデフォルトのディレクトリ指定をする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;書いた時点での環境&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Windows Terminal(Preview): 1.8.1032.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;WSLのprofile設定の中のcommandlineで&lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt;を指定すればOK&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;wsl.exe&lt;/code&gt;の後に開始ディレクトリを指定できる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;commandline&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wsl.exe ~ -d Ubuntu-20.04&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;startingDirectory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt;なしだとWindowsTerminal側の設定が有効になるのかな&lt;/p&gt;
&lt;p&gt;上記設定だと&lt;code class=&quot;language-text&quot;&gt;親プロセスディレクトリの使用&lt;/code&gt;にチェックが付き、自分の環境だとWindows側のディレクトリになった&lt;code class=&quot;language-text&quot;&gt;/mnt/c/Windows/System32&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;これで解決！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/hideki0145/items/04582a26baf3d81632c1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Windows Terminalをカスタマイズしよう！(v1.0.1401.0版) - Qiita&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHubのコントリビュート一覧に飛ぶためのブックマークレット]]></title><description><![CDATA[以前Twitterでみたいなのを見かけた とりあえずそのうち見るときのためにタブをそのままにしていたが、いろいろな人のも見られるとおもしろいかもと思ってブックマークレットを書いた ユーザーページもしくは対象ユーザーのどこかのリポジトリなど、ユーザー名がURL…]]></description><link>https://til.swfz.io/entries/github_contribute_bookmarklet/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_contribute_bookmarklet/</guid><pubDate>Sat, 25 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;以前Twitterで&lt;code class=&quot;language-text&quot;&gt;採用などでGitHubアカウントもらったらこのクエリでコントリビューションみますね&lt;/code&gt;みたいなのを見かけた&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;とりあえずそのうち見るときのためにタブをそのままにしていたが、いろいろな人のも見られるとおもしろいかもと思ってブックマークレットを書いた&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;ユーザーページもしくは対象ユーザーのどこかのリポジトリなど、ユーザー名がURLに存在すれば実行可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;github_contribute.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; excludeOrgs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; excludeOrgQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; excludeOrgs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;-org%3A&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;o&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;+&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://github.com/pulls?q=involves%3A&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;user&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;+-user%3A&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;user&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;excludeOrgQuery&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;ブックマークバーへの貼り付け用出力&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; github_contribute.js &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;  &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;:loop;N;$!b loop;s/\n/ /g&apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/ \+/%20/g&apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/^/javascript:/&apos;&lt;/span&gt;
javascript:&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function-name function&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;%20const%20user%20&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;%20window.location.href.split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;%20const%20excludeOrgs%20&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;%20&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;%20const%20w%20&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;%20window.open&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;%20const%20excludeOrgQuery%20&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;%20excludeOrgs.map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;o%20&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;%20&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;-org%3A$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;o&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;+&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;%20w.location.href%20&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;%20&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;https://github.com/pulls?q&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;involves%3A$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;+-user%3A$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;+$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;excludeOrgQuery&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;%20&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;excludeOrgs&lt;/code&gt;は自分が所属している組織へのPRやissueは除外するための記述&lt;/p&gt;
&lt;p&gt;GitHubで仕事の開発している場合は対象組織のPRなども表示されてしまうのでその除外&lt;/p&gt;
&lt;p&gt;感想としては自分はあんまりコントリビュートできてません!ということがわかりました。まる。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ConfluenceにAPI経由で投稿する]]></title><description><![CDATA[下準備 アカウント管理ページでAPIトークンを作成する api-tokens APIをたたく 参考にするのはこの辺 The Confluence Cloud REST API…]]></description><link>https://til.swfz.io/entries/confluence_post_via_api/</link><guid isPermaLink="false">https://til.swfz.io/entries/confluence_post_via_api/</guid><pubDate>Sat, 18 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;下準備&lt;/h2&gt;
&lt;p&gt;アカウント管理ページでAPIトークンを作成する&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://id.atlassian.com/manage/api-tokens&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;api-tokens&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;APIをたたく&lt;/h2&gt;
&lt;p&gt;参考にするのはこの辺&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.atlassian.com/cloud/confluence/rest/api-group-content/#api-api-content-post&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;The Confluence Cloud REST API&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本系&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; GET &lt;span class=&quot;token string&quot;&gt;&quot;https://&lt;span class=&quot;token variable&quot;&gt;${ATLASSIAN_DOMAIN}&lt;/span&gt;/wiki/rest/api/content&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${EMAIL}&lt;/span&gt;:&lt;span class=&quot;token variable&quot;&gt;${CONFLUENCE_API_TOKEN}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Accept: application/json&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記をもとにブログポストを生成するスクリプトを用意した&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;CONFLUENCE_API_TOKEN&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;ATLASSIAN_DOMAIN&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;EMAIL&lt;/code&gt;は環境変数に適切な値を入れておく&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;CONFLUENCE_API_TOKEN&lt;/code&gt;は下準備で生成したAPIトークン&lt;/p&gt;
&lt;p&gt;最低限だとこんな感じで投稿できるはず&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;blogpost.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;From API Test&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;space_key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;~username&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;body_value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hoge&quot;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;token string&quot;&gt;&quot;https://&lt;span class=&quot;token variable&quot;&gt;${ATLASSIAN_DOMAIN}&lt;/span&gt;/wiki/rest/api/content&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${EMAIL}&lt;/span&gt;:&lt;span class=&quot;token variable&quot;&gt;${CONFLUENCE_API_TOKEN}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Accept: application/json&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; @- &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOS
{
  &quot;title&quot;: &quot;&lt;span class=&quot;token variable&quot;&gt;${title}&lt;/span&gt;&quot;,
  &quot;type&quot;: &quot;blogpost&quot;,
  &quot;space&quot;: {
    &quot;key&quot;: &quot;&lt;span class=&quot;token variable&quot;&gt;${space_key}&lt;/span&gt;&quot;
  },
  &quot;status&quot;: &quot;current&quot;,
  &quot;body&quot;: {
    &quot;storage&quot;: {
      &quot;value&quot;: &quot;&lt;span class=&quot;token variable&quot;&gt;${body_value}&lt;/span&gt;&quot;,
      &quot;representation&quot;: &quot;storage&quot;
    }
  }
}
EOS&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;試行錯誤&lt;/h3&gt;
&lt;p&gt;最初&lt;code class=&quot;language-text&quot;&gt;body.storage&lt;/code&gt;の部分を&lt;code class=&quot;language-text&quot;&gt;body.view&lt;/code&gt;にしていたら投稿はできるがコンテンツが空の状態になってしまっていた&lt;/p&gt;
&lt;p&gt;ライブラリはどうやってんだと思い次のソースをよんだ&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/johnpduane/confluence-api/blob/master/lib/confluence.js&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;confluence-api/confluence.js at master · johnpduane/confluence-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://github.com/johnpduane/confluence-api/blob/master/lib/confluence.js:embed:cite&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/johnpduane/confluence-api/blob/master/lib/confluence.js:embed:cite&lt;/a&gt;]&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;{
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &quot;title&quot;: &quot;${title}&quot;,
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &quot;type&quot;: &quot;blogpost&quot;,
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &quot;space&quot;: {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &quot;key&quot;: &quot;${space_key}&quot;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; },
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &quot;status&quot;: &quot;current&quot;,
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &quot;body&quot;: {
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;    &quot;view&quot;: {
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    &quot;storage&quot;: {
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &quot;value&quot;: &quot;${body_value}&quot;,
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;      &quot;representation&quot;: &quot;view&quot;
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;      &quot;representation&quot;: &quot;storage&quot;
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   }
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; }
&lt;/span&gt;}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じの差分で投稿できるようになった&lt;/p&gt;
&lt;p&gt;representationが何を意味するのかまでちゃんと読んでないが無事コンテンツの中身も反映されるようになった&lt;/p&gt;
&lt;p&gt;APIでのやりとりではHTMLをそのまま投げるという感じ&lt;/p&gt;
&lt;p&gt;markdown2confluenceなど使えばMarkdownで書いた文書をコンフルに同期とかできるかと思ったけどそもそも記法が違うので今回は使わなかった&lt;/p&gt;
&lt;h2&gt;更新を伴う投稿&lt;/h2&gt;
&lt;p&gt;新規投稿ならPOSTだけでOKだが更新処理を含める場合はversion番号が必要なため複数APIをたたかないといけない&lt;/p&gt;
&lt;p&gt;jsonで定義した値をフォーマットして定期的に更新するスクリプトを書いた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;scrap.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;リプレイスとかバージョンアップとかの記事&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;https://blog.cybozu.io/entry/2021/06/16/080000&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;https://developers.cyberagent.co.jp/blog/archives/30257/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;https://buildersbox.corp-sansan.com/entry/2021/06/24/110000&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;comment: リプレイスとかやりました！その後の話は結構ありかも&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;エンジニアブログ系&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;https://tech.classi.jp/entry/2021/06/18/120000&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;comment: こんな感じで運営してますってのは運営の価値観が垣間見れてよい、他のも見てみたい感ある&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;https://tech.pepabo.com/2021/07/14/pepabo-tech-blog-2021/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;comment: ブログの執筆ふろーの自動化周りの話と思想、おもしろい&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;scrap.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;node-fetch&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;fs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pageId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1111111111&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;formatTitle&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;p&gt;&amp;lt;h2&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;value&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/h2&gt;&amp;lt;/p&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;formatLink&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;p&gt;&amp;lt;a href=\&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;\&quot; data-card-appearance=\&quot;inline\&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/a&gt;&amp;lt;/p&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;formatComment&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;p&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;value&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/p&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;generateBody&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; scraps &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readFileSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;./scrap.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scraps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; scraps&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;http&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatLink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;comment:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatComment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatTitle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;authString&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; username &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CONFLUENCE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; buffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;username&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;token&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;base64&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;putText&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;authString&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pageId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; versionNumber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;記事スクラップ&apos;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; spaceKey &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;~username&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;page&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; bodyData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;number&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; versionNumber
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; title&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; pageId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;space&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; spaceKey
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;current&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;body&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;storage&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;generateBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;representation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;storage&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ATLASSIAN_DOMAIN&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/wiki/rest/api/content/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;pageId&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;PUT&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Accept&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Content-Type&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Authorization&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Basic &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;authString&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bodyData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getVersion&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;authString&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pageId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ATLASSIAN_DOMAIN&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/wiki/rest/api/content/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;pageId&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;?expand=version&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;GET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Accept&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Authorization&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Basic &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;authString&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; versionResponse &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;authString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pageId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; putResponse &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;putText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;authString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pageId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; versionResponse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;version&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;number &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;putResponse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;spaceKey&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;pageId&lt;/code&gt;は環境によって記述を変える必要がある&lt;/p&gt;
&lt;p&gt;さっと書いたのでいろいろ考慮足りない部分もあるが投稿までのしくみはこんな感じでOKそう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[AWSの請求書の金額と同じ値を取得するためのワンライナー]]></title><description><![CDATA[と同じ値を出す で、8月分のAWSサービス料金が取得できる get-cost-and-usage コストエクスプローラで閲覧できる値をCLIからたたける ドキュメントは下記 get-cost-and-usage — AWS CLI 1.20.36 Command…]]></description><link>https://til.swfz.io/entries/aws_ce_get_cost_and_usage/</link><guid isPermaLink="false">https://til.swfz.io/entries/aws_ce_get_cost_and_usage/</guid><pubDate>Wed, 08 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;AWSのサービスの料金&lt;/code&gt;と同じ値を出す&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;last_month&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-08-01
&lt;span class=&quot;token assign-left variable&quot;&gt;this_month&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-09-01
aws ce get-cost-and-usage &lt;span class=&quot;token parameter variable&quot;&gt;--granularity&lt;/span&gt; MONTHLY &lt;span class=&quot;token parameter variable&quot;&gt;--metrics&lt;/span&gt; UnblendedCost &lt;span class=&quot;token parameter variable&quot;&gt;--region&lt;/span&gt; us-east-1  --time-period &lt;span class=&quot;token assign-left variable&quot;&gt;Start&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${last_month}&lt;/span&gt;,End&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${this_month}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.ResultsByTime[0].Total.UnblendedCost.Amount&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%.2f&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で、8月分のAWSサービス料金が取得できる&lt;/p&gt;
&lt;h2&gt;get-cost-and-usage&lt;/h2&gt;
&lt;p&gt;コストエクスプローラで閲覧できる値をCLIからたたける&lt;/p&gt;
&lt;p&gt;ドキュメントは下記&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/reference/ce/get-cost-and-usage.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;get-cost-and-usage — AWS CLI 1.20.36 Command Reference&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;気を付けるのはregionが&lt;code class=&quot;language-text&quot;&gt;us-east-1&lt;/code&gt;で固定なことくらい&lt;/p&gt;
&lt;h2&gt;bashで小数点第2位で四捨五入する&lt;/h2&gt;
&lt;p&gt;printfはCの書式でフォーマットを記述する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%.2f&apos;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.222&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2.22&lt;/span&gt;
$ &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%.2f&apos;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.225&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2.23&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;四捨五入なら上記でOK&lt;/p&gt;
&lt;h2&gt;pipeで受け取った値をprintfする&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.225&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%.2f&apos;&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2.22&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ん?…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.2251&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%.2f&apos;&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2.23&lt;/span&gt;
$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.2250000000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%.2f&apos;&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2.22&lt;/span&gt;
$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.22500000001&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%.2f&apos;&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2.23&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;printfだと精度の問題があるみたい&lt;/p&gt;
&lt;p&gt;小数点第2位で四捨五入するパターンの場合&lt;/p&gt;
&lt;p&gt;小数点第3位がちょうど5の場合は期待する値にならない&lt;/p&gt;
&lt;p&gt;なので別の方法を検討する必要がある&lt;/p&gt;
&lt;p&gt;が、今回はcliで取得できる値を見た感じこの減少にほぼ当たらないだろうと判断してこのままやることにした&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Lambdaのソースコード差分を取得する]]></title><description><![CDATA[プロダクションとステージングでコード差分がーとかそういうのを検知する目的でスクリプトを書いてた そういえばこんなものも書いたなと言うことで供養がてら残しておく lambda-diff ファイルが複数存在する場合の考慮はしていない（できるかもためしていない） Nodeだとindex…]]></description><link>https://til.swfz.io/entries/lambda_diff/</link><guid isPermaLink="false">https://til.swfz.io/entries/lambda_diff/</guid><pubDate>Sun, 05 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;プロダクションとステージングでコード差分がーとかそういうのを検知する目的でスクリプトを書いてた&lt;/p&gt;
&lt;p&gt;そういえばこんなものも書いたなと言うことで供養がてら残しておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lambda-diff&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# lambda-diff profile FunctionName1 FunctionName2&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;get_lambda_zip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; /tmp/&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;.zip &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;aws &lt;span class=&quot;token parameter variable&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;$1 lambda get-function --function-name $2 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.Code.Location&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;unzip_lambda_code&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;unzip&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /tmp/&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;.zip &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; -
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

get_lambda_zip &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;
get_lambda_zip &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$3&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;unzip_lambda_code &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;unzip_lambda_code &lt;span class=&quot;token variable&quot;&gt;$3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ファイルが複数存在する場合の考慮はしていない（できるかもためしていない）&lt;/p&gt;
&lt;p&gt;Nodeだとindex.jsだけで完結する場合に差分を検出できる&lt;/p&gt;
&lt;p&gt;Lambdaの設定差分だけであればコマンド一発で書ける（当時は自動化するためにスクリプト化してた）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lambda-config-diff&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# lambda-config-diff profile FunctionName1 FunctionName2&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;aws &lt;span class=&quot;token parameter variable&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; lambda get-function-configuration --function-name &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;aws &lt;span class=&quot;token parameter variable&quot;&gt;--profile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; lambda get-function-configuration --function-name &lt;span class=&quot;token variable&quot;&gt;$3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このスクリプトを定期的に実行して差分があればメールなりSlackなりに通知したりして差分が出た!みたいなのを検知できる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Python環境でencode系のエラーが出たときの対応例]]></title><description><![CDATA[Dockerコンテナのビルド時にコマンド実行時、次のようなエラーが出た encoding指定が必要な模様 PYTHONENCODINGで文字コード指定するという記事もあったがそちらの方法ではうまく行かず… 次の記事を参考に環境変数を指定するようにした Python…]]></description><link>https://til.swfz.io/entries/python_error_encoding/</link><guid isPermaLink="false">https://til.swfz.io/entries/python_error_encoding/</guid><pubDate>Mon, 16 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dockerコンテナのビルド時に&lt;code class=&quot;language-text&quot;&gt;pip3 install ansible ansible-lint yamllint&lt;/code&gt;コマンド実行時、次のようなエラーが出た&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR: Exception:
Traceback (most recent call last):
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/cli/base_command.py&quot;, line 173, in _main
    status = self.run(options, args)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/cli/req_command.py&quot;, line 203, in wrapper
    return func(self, options, args)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/commands/install.py&quot;, line 316, in run
    reqs, check_supported_wheels=not options.target_dir
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/resolver.py&quot;, line 95, in resolve
    collected.requirements, max_rounds=try_to_avoid_resolution_too_deep
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_vendor/resolvelib/resolvers.py&quot;, line 472, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_vendor/resolvelib/resolvers.py&quot;, line 366, in resolve
    failure_causes = self._attempt_to_pin_criterion(name)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_vendor/resolvelib/resolvers.py&quot;, line 212, in _attempt_to_pin_criterion
    criteria = self._get_updated_criteria(candidate)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_vendor/resolvelib/resolvers.py&quot;, line 203, in _get_updated_criteria
    self._add_to_criteria(criteria, requirement, parent=candidate)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_vendor/resolvelib/resolvers.py&quot;, line 172, in _add_to_criteria
    if not criterion.candidates:
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_vendor/resolvelib/structs.py&quot;, line 151, in __bool__
    return bool(self._sequence)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py&quot;, line 140, in __bool__
    return any(self)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py&quot;, line 128, in &amp;lt;genexpr&gt;
    return (c for c in iterator if id(c) not in self._incompatible_ids)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py&quot;, line 32, in _iter_built
    candidate = func()
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/factory.py&quot;, line 209, in _make_candidate_from_link
    version=version,
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/candidates.py&quot;, line 301, in __init__
    version=version,
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/candidates.py&quot;, line 156, in __init__
    self.dist = self._prepare()
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/candidates.py&quot;, line 227, in _prepare
    dist = self._prepare_distribution()
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/candidates.py&quot;, line 306, in _prepare_distribution
    self._ireq, parallel_builds=True
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/operations/prepare.py&quot;, line 508, in prepare_linked_requirement
    return self._prepare_linked_requirement(req, parallel_builds)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/operations/prepare.py&quot;, line 552, in _prepare_linked_requirement
    self.download_dir, hashes
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/operations/prepare.py&quot;, line 249, in unpack_url
    unpack_file(file.path, location, file.content_type)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/utils/unpacking.py&quot;, line 256, in unpack_file
    untar_file(filename, location)
  File &quot;/usr/local/lib/python3.6/site-packages/pip/_internal/utils/unpacking.py&quot;, line 226, in untar_file
    with open(path, &quot;wb&quot;) as destfp:
UnicodeEncodeError: &apos;ascii&apos; codec can&apos;t encode character &apos;\xe9&apos; in position 117: ordinal not in range(128)
Service &apos;centos&apos; failed to build : The command &apos;/bin/sh -c pip3 install ansible ansible-lint yamllint&apos; returned a non-zero code: 2&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;encoding指定が必要な模様&lt;/p&gt;
&lt;p&gt;PYTHONENCODINGで文字コード指定するという記事もあったがそちらの方法ではうまく行かず…&lt;/p&gt;
&lt;p&gt;次の記事を参考に環境変数を指定するようにした&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kaworu.jpn.org/python/Python%E3%81%AEUnicodeDecodeError%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PythonのUnicodeDecodeErrorの対処方法 - Python入門&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;LC_ALL=en_US.UTF-8 pip3 install ansible ansible-lint yamllint&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で無事ビルドできるようになった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[yqがバージョンアップで構文変更された]]></title><description><![CDATA[とある自動化プロセス上で次のようなエラーが発生していた yqのバージョンが4に上がって構文が変わったみたい よりjqの構文に近い書き方へ変わったとのこと たしかにv…]]></description><link>https://til.swfz.io/entries/yq_version4/</link><guid isPermaLink="false">https://til.swfz.io/entries/yq_version4/</guid><pubDate>Sun, 15 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;とある自動化プロセス上で次のようなエラーが発生していた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Error: unknown command &quot;r&quot; for &quot;yq&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;yqのバージョンが4に上がって構文が変わったみたい&lt;/p&gt;
&lt;p&gt;よりjqの構文に近い書き方へ変わったとのこと&lt;/p&gt;
&lt;p&gt;たしかにv3のときはちょっと書いていて違和感あったのでよさそう&lt;/p&gt;
&lt;p&gt;従来のバージョンとの比較があるので移行は難しくないだろう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mikefarah.gitbook.io/yq/upgrading-from-v3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Upgrading from V3 - yq&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドキュメント&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mikefarah.gitbook.io/yq/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;yq - yq&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitHubActionsのworkflowファイルで実際に変更したときの差分&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;actions.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;          got=`yq r ./ansible/versions_vars.yml ${{ matrix.role.name }}_version`
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          got=`yq e .${{ matrix.role.name }}_version ./ansible/versions_vars.yml`
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;          latest=`./.github/workflows/bin/latest-version-${{ matrix.role.type }}.sh ${{ matrix.role.repo }}`
&lt;/span&gt;
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;          echo ::set-output name=got::$got
&lt;/span&gt;@@ -60,7 +60,8 @@ jobs:

&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;          if [[ &quot;$got&quot; != &quot;$latest&quot; ]]; then
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;            echo &quot;found ahead versions&quot;
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;            yq w -i ./ansible/versions_vars.yml ${{ matrix.role.name }}_version $latest
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            yq e &quot;.${{ matrix.role.name }}_version=\&quot;$latest\&quot;&quot; ./ansible/versions_vars.yml &gt; versions.yml
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            cp versions.yml ./ansible/versions_vars.yml&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[JavaScriptの分割代入]]></title><description><![CDATA[分割代入 - JavaScript | MDN 連想配列 できるのは知ってたけどGatsby…]]></description><link>https://til.swfz.io/entries/javascript_destructuring_assignment/</link><guid isPermaLink="false">https://til.swfz.io/entries/javascript_destructuring_assignment/</guid><pubDate>Thu, 12 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;分割代入 - JavaScript | MDN&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;連想配列&lt;/h2&gt;
&lt;p&gt;できるのは知ってたけどGatsbyのチュートリアル動画を見てたら下記のような代入をしていてなるほどとなったのでメモ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; response
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body
&lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; name
&lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 下記と同様&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; name2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name
&lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; name2
&lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;例のパターンだとどちらでも良いといえば良いが多少スッキリする&lt;/p&gt;
&lt;p&gt;また、複数代入したいみたいなときは有効かなと感じる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;rest&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; a
&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; b
&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; rest
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;...rest&lt;/code&gt;で残りの連想配列も代入できるのが地味に良い&lt;/p&gt;
&lt;h2&gt;配列&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;rest&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; a
&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; b
&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; rest
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こちらも&lt;code class=&quot;language-text&quot;&gt;...rest&lt;/code&gt;で残りの要素を代入できる&lt;/p&gt;
&lt;p&gt;直近だとGoogleFormsの解答結果を集計する際に相性が良かった&lt;/p&gt;
&lt;p&gt;スプレッドシートのデータ扱う場合は基本的に2次元配列であることと、A列のデータは○、B列のデータは△みたいに固定になっていることが多いのでそれを分割代入で代入してよしなにやるパターンでサッと書ける&lt;/p&gt;
&lt;p&gt;便利さを実感したので今後意識しておこうと思った&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GoogleAppsScriptでリストの変換作業を行う]]></title><description><![CDATA[完全に事例なのであまり流用できなそうな気がするけど残しておく 管理職的なことを始めるとこういうのをサクッとかけると割と便利そう 対象を選定する場合は上の表で、展開するときは下の表が見やすいよねっていう感じ こういう表を x x 被評価者 評価者1 評価者2 評価者3 評価者4 x…]]></description><link>https://til.swfz.io/entries/convert_list_gas/</link><guid isPermaLink="false">https://til.swfz.io/entries/convert_list_gas/</guid><pubDate>Wed, 04 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;完全に事例なのであまり流用できなそうな気がするけど残しておく&lt;/p&gt;
&lt;p&gt;管理職的なことを始めるとこういうのをサクッとかけると割と便利そう&lt;/p&gt;
&lt;p&gt;対象を選定する場合は上の表で、展開するときは下の表が見やすいよねっていう感じ&lt;/p&gt;
&lt;p&gt;こういう表を&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;x&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;x&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;被評価者&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;評価者1&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;評価者2&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;評価者3&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;評価者4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;A&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;B&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;B&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;A&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;A&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;B&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;D&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;D&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;A&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;x&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;E&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;B&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;こういう感じに変換するGASスクリプトを書いた&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;評価者&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;被評価者1&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;被評価者2&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;被評価者3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;B&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;A&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;A&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;B&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;A&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;B&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;D&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;E&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;C&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Code.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;convertEvaluatorList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; curLine&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;evaluators&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; curLine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  evaluators&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;evaluator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; targetLine &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; acc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; evaluator&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;targetLine &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      acc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;evaluator&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      targetLine&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; acc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;myFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// config ================================================================&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; masterSheetName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;シート1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; convertSheetName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;シート2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; startColumnNumber &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// C = 2&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; startRowNumber &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 2 - 1 = 1&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// config ================================================================&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; columns &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ABCDEFGHIJKLMNOPQRSTUVWXYZ&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getActiveSpreadsheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; masterSheet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSheetByName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;masterSheetName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; convertedList &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; masterSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDataRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;startRowNumber&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;startColumnNumber&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;convertEvaluatorList&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; maxColumns &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; convertedList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lines&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; filledList &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; convertedList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;lines&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fillNum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; maxColumns &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fillValues &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fillNum&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;lines&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;fillValues&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; targetSheet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSheetByName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;convertSheetName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ヘッダー行を除くので+1&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; lines &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filledList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Aから埋めていくのでカラム数-1&lt;/span&gt;
  targetSheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;A2:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;columns&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;maxColumns &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;lines&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filledList&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;スプレッド演算子を駆使してimmutableに…とは行かなかった&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;</content:encoded></item><item><title><![CDATA[NodeのDockerイメージでPuppeteerを使えるようにする]]></title><description><![CDATA[使用したイメージは 普通にNodeのイメージにnpmインストールして実行するだけでOKだろうと思ったらそうは行かなかった ElectronをWindowsのBash(WSL)で試してみて成功しなかった - いがにんのぼやき 上記記事と似た感じだったので  をDockerfile…]]></description><link>https://til.swfz.io/entries/puppeteer_in_node_docker_image/</link><guid isPermaLink="false">https://til.swfz.io/entries/puppeteer_in_node_docker_image/</guid><pubDate>Wed, 28 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;使用したイメージは&lt;code class=&quot;language-text&quot;&gt;node:14.17.3&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;普通にNodeのイメージにnpmインストールして実行するだけでOKだろうと思ったらそうは行かなかった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/home/user/project/node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux/chrome: error while loading shared libraries: libX11-xcb.so.1: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://igatea.hatenablog.com/entry/2018/02/11/004142&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ElectronをWindowsのBash(WSL)で試してみて成功しなかった - いがにんのぼやき&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上記記事と似た感じだったので&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;apt -y install  libx11-xcb-dev libxtst6 libxss1 libgconf-2-4 libnss3-dev libasound2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;をDockerfileに追加してPuppeteerを実行しようとしたがまだ足りなかった&lt;/p&gt;
&lt;p&gt;動く様になるまでパッケージを追加していく&lt;/p&gt;
&lt;p&gt;結果的には追加で下記2つのパッケージが必要だった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;libatk-bridge2.0-0
libgtk-3-dev&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;おわり&lt;/p&gt;</content:encoded></item><item><title><![CDATA[S3のpresigned_url発行時にキー以外の名前のファイルをDL可能にする]]></title><description><![CDATA[S3でpresigned_urlを発行してファイルをDLさせる場合（サンプルはAWS-SDKのRubyクライアントを使用） S3にあるファイルを別名でダウンロードさせるためにはの指定を良しなにする 上記の場合はDL時というファイル名でDLされる また、S…]]></description><link>https://til.swfz.io/entries/s3_content_disposition_with_metadata/</link><guid isPermaLink="false">https://til.swfz.io/entries/s3_content_disposition_with_metadata/</guid><pubDate>Sun, 25 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;S3でpresigned_urlを発行してファイルをDLさせる場合（サンプルはAWS-SDKのRubyクライアントを使用）&lt;/p&gt;
&lt;p&gt;S3にあるファイルを別名でダウンロードさせるためには&lt;code class=&quot;language-text&quot;&gt;response_content_disposition&lt;/code&gt;の指定を良しなにする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  response_content_disposition: &quot;attachment; filename=hoge.txt&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記の場合はDL時&lt;code class=&quot;language-text&quot;&gt;hoge.txt&lt;/code&gt;というファイル名でDLされる&lt;/p&gt;
&lt;p&gt;また、S3へのファイル作成時に&lt;code class=&quot;language-text&quot;&gt;metadata&lt;/code&gt;というキーで任意のパラメータ指定が可能&lt;/p&gt;
&lt;p&gt;下記のようにファイル生成時の情報を元にファイル名を決めたいと言うようなケースにも対応できる&lt;/p&gt;
&lt;p&gt;以下例&lt;/p&gt;
&lt;h2&gt;ファイル作成時&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;s3client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Aws&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;S3&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;
s3client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;put_object&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample-bucket&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample-key&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filename&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;content_type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;text/csv&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token symbol&quot;&gt;hoge&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;fuga&apos;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;presigned url生成時&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;s3client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Aws&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;S3&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;

object &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; s3client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;head_object&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample-bucket&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample-key&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
metadata &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;metadata

signer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Aws&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;S3&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Presigner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;
signer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;presigned_url&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;:get_object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample-bucket&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample-key&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;expires_in&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token symbol&quot;&gt;response_content_disposition&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;attachment; filename=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;metadata&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.txt&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ファイル生成時に&lt;code class=&quot;language-text&quot;&gt;metadata.hoge&lt;/code&gt;の値&lt;code class=&quot;language-text&quot;&gt;fuga&lt;/code&gt;をファイル名に含めることができた&lt;/p&gt;
&lt;p&gt;上記例だと&lt;code class=&quot;language-text&quot;&gt;fuga.txt&lt;/code&gt;というファイル名でダウンロードできる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gatsbyのブログにjestとreact-testing-libraryを入れてテスト可能にする]]></title><description><![CDATA[基本的には下記を見ながら進めることで問題なかった Unit Testing | Gatsby Testing React Components | Gatsby 進めていたら途中で詰まった src/components/tests/header.ts…]]></description><link>https://til.swfz.io/entries/introduction_jest_and_testing_library_to_gatsby/</link><guid isPermaLink="false">https://til.swfz.io/entries/introduction_jest_and_testing_library_to_gatsby/</guid><pubDate>Mon, 19 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;基本的には下記を見ながら進めることで問題なかった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/docs/how-to/testing/unit-testing/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Unit Testing | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/docs/how-to/testing/testing-react-components/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Testing React Components | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;進めていたら途中で詰まった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;src/components/&lt;strong&gt;tests&lt;/strong&gt;/header.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;render&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; screen&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@testing-library/react&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@testing-library/jest-dom/extend-expect&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Title&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h1 data&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;testid&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hero-title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Gatsby &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; awesome&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;h1&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Bio&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;renders correctly&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; getByTestId &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Title &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getByTestId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hero-title&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toHaveTextContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Gatsby is awesome!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;❯ yarn test
yarn run v1.22.10
$ jest --config ./jest.config.js
 FAIL  src/components/__tests__/header.ts
  ● Test suite failed to run

    SyntaxError: /home/user/til/src/components/__tests__/header.ts: Unexpected token, expected &quot;,&quot; (7:25)

       6 |
    &gt;  7 | const Title = () =&gt; (&amp;lt;h1 data-testid=&quot;hero-title&quot;&gt;Gatsby is awesome!&amp;lt;/h1&gt;);
         |                          ^
       8 |
       9 | describe(&quot;Bio&quot;, () =&gt; {&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;タグの解釈がうまく行かない？&lt;/p&gt;
&lt;p&gt;TypeScript関連のようだがよくわからんということでうだうだ調べていた&lt;/p&gt;
&lt;p&gt;よく考えれば分かることだがTypeScriptなのにReactの記法が書いてあるのでそりゃそうなるよねって感じだった&lt;/p&gt;
&lt;p&gt;拡張子を&lt;code class=&quot;language-text&quot;&gt;ts&lt;/code&gt; -&gt; &lt;code class=&quot;language-text&quot;&gt;tsx&lt;/code&gt;にして次に進めた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; FAIL  src/components/__tests__/header.tsx
  Bio
    ✕ renders correctly (2 ms)

  ● Bio › renders correctly
                                                                                                                                                                                                    The error below may be caused by using the wrong test environment, see https://jestjs.io/docs/configuration#testenvironment-string.
    Consider using the &quot;jsdom&quot; test environment.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デフォルトのテスト環境が&lt;code class=&quot;language-text&quot;&gt;node&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;レンダリングなどをするテストの場合は&lt;code class=&quot;language-text&quot;&gt;jsdom&lt;/code&gt;環境に変更してあげる必要がある&lt;/p&gt;
&lt;p&gt;変更はテストファイルの先頭にコメントを入れることで可能&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jestjs.io/ja/docs/configuration#testenvironment-string&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Jestの設定 · Jest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;全体に適用する場合は &lt;code class=&quot;language-text&quot;&gt;jest.config.js&lt;/code&gt;に項目を追加する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jest.config.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;testEnvironment&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jsdom&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ yarn test
yarn run v1.22.10
$ jest --config ./jest.config.js
 PASS  src/components/__tests__/header.tsx
  Bio
    ✓ renders correctly (23 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.013 s, estimated 2 s
Ran all test suites.
Done in 2.31s.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで動くところまで持っていけたのでテスト書くぞ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Workflowsで Memory usage limit exeeded]]></title><description><![CDATA[はてなブログのAPIなど公開のAPIをたたいてそのレスポンスをそのままBigQueryに突っ込むみたいなやつ プライベートなのと規模感が小さいのでちょっと冒険的な感じでやってみようと次のような構成で試みた Workflowsではてなブックマークの公開API…]]></description><link>https://til.swfz.io/entries/workflows_logging_bigquery_failed/</link><guid isPermaLink="false">https://til.swfz.io/entries/workflows_logging_bigquery_failed/</guid><pubDate>Tue, 13 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;はてなブログのAPIなど公開のAPIをたたいてそのレスポンスをそのままBigQueryに突っ込むみたいなやつ&lt;/p&gt;
&lt;p&gt;プライベートなのと規模感が小さいのでちょっと冒険的な感じでやってみようと次のような構成で試みた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workflowsではてなブックマークの公開APIをたたく&lt;/li&gt;
&lt;li&gt;WorkflowsのログにAPIのレスポンスをそのまま流す&lt;/li&gt;
&lt;li&gt;Logging→集約シンクでBigQueryにレコードを追加する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Functionsを新たに作らなくても良いしとりあえずの生データも保存できるしわりと省力で実現できるかと考えた&lt;/p&gt;
&lt;p&gt;ある程度動作確認して問題なかったので自分のブログの全URLで実行したら次のようなエラーが出てしまった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;Execution failed or cancelled.
&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; step &lt;span class=&quot;token string&quot;&gt;&quot;call_workflow_api&quot;&lt;/span&gt;, routine &lt;span class=&quot;token string&quot;&gt;&quot;call_workflow&quot;&lt;/span&gt;, line: &lt;span class=&quot;token number&quot;&gt;88&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; step &lt;span class=&quot;token string&quot;&gt;&quot;collect_hatena_bookmark_workflow&quot;&lt;/span&gt;, routine &lt;span class=&quot;token string&quot;&gt;&quot;main&quot;&lt;/span&gt;, line: &lt;span class=&quot;token number&quot;&gt;35&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Execution failed or cancelled.&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;operation&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;argument&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;target_url&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;:&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;https://swfz.hatenablog.com/entry/2018/12/22/080733&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;}&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;endTime&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2021-07-10T12:01:03.749667278Z&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;payload&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;message&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;:&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;ResourceLimitError: Memory usage limit exceeded&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;,&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;tags&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;:[&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;ResourceLimitError&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;]}&quot;&lt;/span&gt;,
      &lt;span class=&quot;token string&quot;&gt;&quot;stackTrace&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;projects/1111111111111/locations/us-central1/workflows/collect_hatena_bookmark_metrics/executions/c4a686eb-4d92-4e95-94f6-4257438131e0&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;startTime&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2021-07-10T12:01:02.693637032Z&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FAILED&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;workflowRevisionId&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;000001-331&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;tags&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;OperationError&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;バズって300前後のブックマークが付いたURLのレスポンスで発生した&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/workflows/quotas&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;割り当てと上限  |  ワークフロー  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;変数のメモリ割り当てにも上限があり64KBまでらしい&lt;/p&gt;
&lt;p&gt;なのでAPIのレスポンスが64KB以上ある場合はエラーになってしまう…&lt;/p&gt;
&lt;p&gt;Functionsは経由するがFunctionsからLoggingへ直接流すようにするか?と思ったが&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/logging/quotas?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;割り当てと上限  |  Cloud Logging  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;同じようにLoggingにも割り当て上限があるのでこの辺も考慮できていないといけない&lt;/p&gt;
&lt;p&gt;この辺まで調べて面倒になってきてしまいこの手法は諦めた&lt;/p&gt;
&lt;p&gt;メモリリミットに達してしまったため回避方法はなさそう…APIのレスポンスをそのままWorkflows上でよしなにやるパターンは厳しいという結論になりました&lt;/p&gt;
&lt;p&gt;Workflowsはあくまで各処理のオーケストレーションなのでWorkflows内にあまり処理を持ち込むべきではないっていう考え方なのかなと推測&lt;/p&gt;
&lt;p&gt;結局こういうパターンはFunctionsでGCSにデータ置く+BigQueryへloadってパターンがベターなのかな&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Netlifyに手動でデプロイする]]></title><description><![CDATA[割と月の早い段階でAlgoliaの使用制限で継続的デプロイができなくなってしまったのでCLI経由でデプロイできないか調べて試した 前提 Netlifyでビルドとデプロイを行っていてビルド時に都度Algoliaのインデックス更新している DependabotやRenovate…]]></description><link>https://til.swfz.io/entries/netlify_manual_deploy/</link><guid isPermaLink="false">https://til.swfz.io/entries/netlify_manual_deploy/</guid><pubDate>Sat, 03 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;割と月の早い段階でAlgoliaの使用制限で継続的デプロイができなくなってしまったのでCLI経由でデプロイできないか調べて試した&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Netlifyでビルドとデプロイを行っていてビルド時に都度Algoliaのインデックス更新している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DependabotやRenovateなどのパッケージの更新でも上記処理が走ってしまっていたので利用上限に達してしまったよう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build時エラーログ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR

failed to index to Algolia Operations quota exceeded. Change plan to get more Operations.
Error: Operations quota exceeded. Change plan to get more Operations.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;途中で落ちてしまいデプロイできないのでIndexの再生成だけ除外して記事をデプロイする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Netlify-cliのインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; netlify-cli&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;ログイン&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yarn netlify login&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ブラウザに遷移して&lt;code class=&quot;language-text&quot;&gt;Authorize&lt;/code&gt;をクリックして認証する&lt;/p&gt;
&lt;p&gt;configファイルにtokenが出力される&lt;/p&gt;
&lt;p&gt;ファイルの場所は &lt;code class=&quot;language-text&quot;&gt;~/.config/netlify/config.json&lt;/code&gt;に置かれる（OSによる）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;.env.production&lt;/code&gt;にはデプロイに必要な環境変数が入っている&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ envfile .env.production yarn netlify deploy
yarn run v1.22.10
$ /home/user/til/node_modules/.bin/netlify deploy
This folder isn&apos;t linked to a site yet
? What would you like to do? Link this directory to an existing site

netlify link will connect this folder to a site on Netlify

? How do you want to link this folder to a site? Use current git remote origin (https://github.com/swfz/til)

Looking for sites connected to &apos;https://github.com/swfz/til&apos;...


Directory Linked

Site url:  https://til.swfz.io

Site id saved to /home/user/til/.netlify/state.json

You can now run other `netlify` cli commands in this directory
Deploy path: /home/user/til/public
Deploying to draft URL...
✔ Finished hashing 641 files
✔ CDN requesting 377 files
✔ Finished uploading 377 assets
✔ Deploy is live!

Logs:              https://app.netlify.com/sites/hoge/deploys/xxxxxxxxxxxxxxxxxxxxxxxxxxx
Website Draft URL: https://xxxxxxxxxxxxxxxxxxxxxxxxxxxx--hoge.netlify.app

If everything looks good on your draft URL, deploy it to your main site URL with the --prod flag.
netlify deploy --prod

Done in 118.77s.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--prod&lt;/code&gt;オプションを付けない場合はデプロイプレビュー用のよう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本番デプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ envfile .env.production yarn build
$ envfile .env.production yarn netlify deploy --prod
Deploy path: /home/user/deploy-til/public
Deploying to main site URL...
✔ Finished hashing 450 files
✔ CDN requesting 249 files
✔ Finished uploading 249 assets
✔ Deploy is live!

Logs:              https://app.netlify.com/sites/.....
Unique Deploy URL: https://......netlify.app
Website URL:       https://til.swfz.io
Done in 51.37s.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;public以下のファイル群をNetlifyにアップロードする&lt;/p&gt;
&lt;p&gt;これで無事デプロイできた&lt;/p&gt;
&lt;p&gt;CLIのドキュメントは下記&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.netlify.com/cli/get-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Get started with Netlify CLI | Netlify Docs&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Algoliaのインデックス更新のコントロール&lt;/h2&gt;
&lt;p&gt;とりあえず手動デプロイで当座はしのげるようになったが来月も同じ様になってしまうと困るので対策する&lt;/p&gt;
&lt;p&gt;AlgoliaのIndexingが必要なのは記事の更新があったときのみなので条件によって挙動を分ける&lt;/p&gt;
&lt;p&gt;ドキュメントでは&lt;code class=&quot;language-text&quot;&gt;netlify.toml&lt;/code&gt;に設定書けば良いよ、となっているがGUIからの基本的な設定（主にシークレットなどの情報）とうまい具合にマージしてくれるわけではないらしい&lt;/p&gt;
&lt;p&gt;そうなると各種キーがデプロイ時に必要なのでパブリックなリポジトリでは&lt;code class=&quot;language-text&quot;&gt;netlify.toml&lt;/code&gt;を使って設定は行えない&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.netlify.com/configure-builds/file-based-configuration/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;File-based configuration | Netlify Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://docs.netlify.com/configure-builds/file-based-configuration/:embed:cite&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://docs.netlify.com/configure-builds/file-based-configuration/:embed:cite&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;ドキュメントを眺めていると&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$CACHED_COMMIT_REF&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;$COMMIT_REF&lt;/code&gt;という環境変数が用意されているようなのでそれを用いてラップするコマンドを書いてデプロイするようにした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deploy.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$CACHED_COMMIT_REF&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$COMMIT_REF&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 差分があると終了コード1&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--quiet&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$CACHED_COMMIT_REF&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$COMMIT_REF&lt;/span&gt; content/blog/entries/

&lt;span class=&quot;token assign-left variable&quot;&gt;rc&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$rc&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;content changed.&quot;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;CONTENT_CHANGED&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true gatsby build
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;content not changed.&quot;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;CONTENT_CHANGED&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;false gatsby build
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;記事のディレクトリに変更があるかどうかで&lt;code class=&quot;language-text&quot;&gt;CONTENT_CHANGED&lt;/code&gt;環境変数を切り分ける&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-config.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;skipIndexing&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;BRANCH&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CONTENT_CHANGED&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;false&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでAlgoliaへのインデックス情報の更新は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;ブランチのとき&lt;/li&gt;
&lt;li&gt;記事情報が更新されたとき&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;が満たされて初めて更新されるようになった&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;ここまでやっていまさらだが、ざっとしか調べてないのでもし検索でリミットに達していたのなら来月も手動デプロイが発生するかもw&lt;/p&gt;</content:encoded></item><item><title><![CDATA[graphql-codegenのアップグレードに関するエラー対応]]></title><description><![CDATA[Gatsbyで使っているのバージョンを上げるにあたってビルドエラーに遭遇したのでその対応のメモ バージョン 単純には上げさせてもらえなかった エラー1 に追加で回避 gatsby-config.js この辺を見て設定方法を把握して解決 gatsby-plugin-graphql…]]></description><link>https://til.swfz.io/entries/upgrade_graphql_codegen/</link><guid isPermaLink="false">https://til.swfz.io/entries/upgrade_graphql_codegen/</guid><pubDate>Tue, 29 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gatsbyで使っている&lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-graphql-codegen&lt;/code&gt;のバージョンを上げるにあたってビルドエラーに遭遇したのでその対応のメモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バージョン&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;2.7.1 -&gt; 3.0.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;単純には上げさせてもらえなかった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラー1&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Objects are not valid as a React child (found: Error: Type &quot;Node&quot; is missing a &quot;__resolveType&quot; resolver. Pass false into &quot;resolverValidationOptions.requireResolversForResolveType&quot; to disable this error.). If you meant to render a collection of children, use an array instead.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;codegenConfig&lt;/code&gt;に追加で回避&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-config.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     resolve: &quot;gatsby-plugin-graphql-codegen&quot;,
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     options: {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       fileName: `types/graphql-types.d.ts`,
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        codegenConfig: {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          resolverValidationOptions: {
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            requireResolversForResolveType: false
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;          }
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       }&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この辺を見て設定方法を把握して解決&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/plugins/gatsby-plugin-graphql-codegen/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gatsby-plugin-graphql-codegen | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エラー2&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR
GraphQLDocumentError: Unknown fragment &quot;GatsbyImageSharpFixed&quot;. at /home/user/til/src/components/bio.tsx:5:12
AggregateError: GraphQLDocumentError: Unknown fragment &quot;GatsbyImageSharpFixed&quot;.

error Command failed with exit code 1. &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;GatsbyImageSharpFixed&lt;/code&gt;がないとのこと&lt;/p&gt;
&lt;p&gt;次のissueをさっと読んだところ個別に書けとのこと&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/issues/9882&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Why …GatsbyImageSharpFixed is unknown fragment in GraphiQL? · Issue #9882 · gatsbyjs/gatsby&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      avatar: file(absolutePath: { regex: &quot;/profile-pic.png/&quot; }) {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;        childImageSharp {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;          fixed(width: 50, height: 50) {
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;            ...GatsbyImageSharpFixed
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            base64
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            width
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            height
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            src
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;            srcSet
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;          }
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;        }
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      }&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;無事バージョンを上げることができた&lt;/p&gt;</content:encoded></item><item><title><![CDATA[iframe以下のコンテンツをquerySelectorで取得する]]></title><description><![CDATA[知らずに結構時間を浪費したので残しておく 見た目に表示されているからといって直接で指定しても取得できない 上記のようにquerySelectorでiframeの要素を指定してからでiframeの中のコンテンツを対象にしてあげる必要がある それ移行はいつものの要領で要素を取得できる]]></description><link>https://til.swfz.io/entries/get_iframe_contents_with_queryselector/</link><guid isPermaLink="false">https://til.swfz.io/entries/get_iframe_contents_with_queryselector/</guid><pubDate>Sun, 27 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;知らずに結構時間を浪費したので残しておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.iframe&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contentWindow&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.viewer-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;見た目に表示されているからといって直接&lt;code class=&quot;language-text&quot;&gt;document.querySelector&lt;/code&gt;で指定しても取得できない&lt;/p&gt;
&lt;p&gt;上記のようにquerySelectorでiframeの要素を指定してから&lt;code class=&quot;language-text&quot;&gt;contentWindow&lt;/code&gt;でiframeの中のコンテンツを対象にしてあげる必要がある&lt;/p&gt;
&lt;p&gt;それ移行はいつもの&lt;code class=&quot;language-text&quot;&gt;querySelector&lt;/code&gt;の要領で要素を取得できる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[node-fetchでBasicAuthする]]></title><description><![CDATA[auth用の文字列の生成 今どきはではないらしい 次のようなWarningが出力される ということで下記のように認証用の文字列を生成する リクエスト headersのにユーザー名とTOKENやパスワードをでつなげbase64した文字列を入れる それだけ]]></description><link>https://til.swfz.io/entries/basic_auth_in_node_fetch/</link><guid isPermaLink="false">https://til.swfz.io/entries/basic_auth_in_node_fetch/</guid><pubDate>Tue, 22 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;auth用の文字列の生成&lt;/h2&gt;
&lt;p&gt;今どきは&lt;code class=&quot;language-text&quot;&gt;new Buffer&lt;/code&gt;ではないらしい&lt;/p&gt;
&lt;p&gt;次のようなWarningが出力される&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;(node:22161) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
(Use `node --trace-deprecation ...` to show where the warning was created)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ということで下記のように認証用の文字列を生成する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; buffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;username:token&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; authString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;base64&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;リクエスト&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://example.com&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;GET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Accept&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Authorization&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Basic &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;authString&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; json &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;headersの&lt;code class=&quot;language-text&quot;&gt;Authorization&lt;/code&gt;にユーザー名とTOKENやパスワードを&lt;code class=&quot;language-text&quot;&gt;:&lt;/code&gt;でつなげbase64した文字列を入れる&lt;/p&gt;
&lt;p&gt;それだけ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Dataportalで時間の単位をよしなに扱う計算フィールド]]></title><description><![CDATA[0.5単位で表示する よくある0.5時間で丸めるやり方 厳密に0.2だよねとか0.4だよねと言ってもピンとこないといえばピンと来ないので0.…]]></description><link>https://til.swfz.io/entries/dataportal_time_calc_field/</link><guid isPermaLink="false">https://til.swfz.io/entries/dataportal_time_calc_field/</guid><pubDate>Fri, 18 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;0.5単位で表示する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Round(hour / 0.5, 0) * 0.5&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;よくある0.5時間で丸めるやり方&lt;/p&gt;
&lt;p&gt;厳密に0.2だよねとか0.4だよねと言ってもピンとこないといえばピンと来ないので0.5刻みで良いよねという感じの表現&lt;/p&gt;
&lt;p&gt;ざっとどのくらい時間つかっているのかなみたいなのが知りたいのであればこのパターンで問題ない気がしている&lt;/p&gt;
&lt;h2&gt;時間 + 分を60進数で表示する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;FLOOR(SUM(hour)) + ((sum(hour) - FLOOR(SUM(hour))) * 60.0 / 100)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;1.7 -&gt; 1.42&lt;/p&gt;
&lt;p&gt;1時間42分という感じ&lt;/p&gt;
&lt;p&gt;グラフで見た場合時間単位のみで表示するとどうしても「あぁ0.7だから…42分ね」みたいな脳内変換をしがち&lt;/p&gt;
&lt;p&gt;そのへんの認知負荷を下げるためにこういう感じで計算フィールドを用意するとそれっぽく表示してくれる&lt;/p&gt;
&lt;p&gt;ビポットで使っても合計の計算もしっかり行われているので問題なさそう&lt;/p&gt;
&lt;p&gt;うまくはまらないパターン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;前期間との比較&lt;/code&gt;がある場合はうまく計算できない
&lt;ul&gt;
&lt;li&gt;比較が10進数を前提としているため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;グラフ表示だと&lt;code class=&quot;language-text&quot;&gt;60&lt;/code&gt;～&lt;code class=&quot;language-text&quot;&gt;100&lt;/code&gt;までの数値を取ることがなくなるので不自然な増減が起きる
&lt;ul&gt;
&lt;li&gt;こちらも10進数を前提としているため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;使える部分は表やピボットでの数値表示のときくらい&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;</content:encoded></item><item><title><![CDATA[GatsbyにAlgoliaを導入する]]></title><description><![CDATA[一応ログとして残すがやったのは下記プラグインを入れただけ gatsby-plugin-algolia | Gatsby インデックスの更新 記事の内容をAlgoliaのインデックスに登録するための設定 インデックスの登録はbuild時に行われる こちらはAlgolia…]]></description><link>https://til.swfz.io/entries/gatsby_algolia/</link><guid isPermaLink="false">https://til.swfz.io/entries/gatsby_algolia/</guid><pubDate>Tue, 15 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一応ログとして残すがやったのは下記プラグインを入れただけ&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/plugins/gatsby-plugin-algolia/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gatsby-plugin-algolia | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;インデックスの更新&lt;/h2&gt;
&lt;p&gt;記事の内容をAlgoliaのインデックスに登録するための設定&lt;/p&gt;
&lt;p&gt;インデックスの登録はbuild時に行われる&lt;/p&gt;
&lt;p&gt;こちらはAlgoliaの管理画面からAdminのAPI Keyが必要&lt;/p&gt;
&lt;p&gt;graphqlのクエリに関しては自分の設定に合わせる必要があるので&lt;code class=&quot;language-text&quot;&gt;/__graphql&lt;/code&gt;でよしなにできるようにクエリを確かめる&lt;/p&gt;
&lt;p&gt;とりあえずデータが登録できるところまでを確認&lt;/p&gt;
&lt;h2&gt;UIの実装&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.algolia.com/doc/api-reference/widgets/react/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;React InstantSearch Widgets | React InstantSearch | API Reference | Algolia Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gatsbyのブログ見てとりあえずコピー&amp;#x26;ペーストしてIndexNameだけ変更すれば動くものは作れた&lt;/p&gt;
&lt;p&gt;あとは細かく必要そうなものを足したり調整したりするくらいでOKそう&lt;/p&gt;
&lt;h2&gt;参考と若干変えた部分&lt;/h2&gt;
&lt;h3&gt;デプロイ時のみインデックス情報を設定するようにした&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-config.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;skipIndexing&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;BRANCH&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// default: false, useful for e.g. preview deploys or local development&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デプロイ時のみAlgoliaにデータ更新すればよいのでこうした&lt;/p&gt;
&lt;h3&gt;AlgoliaへのSearchクエリ部分&lt;/h3&gt;
&lt;p&gt;edgesの内容に次の2項目を足した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rawMarkdownBody
timeToRead&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでMarkdownBodyも検索対象に含まれるのかな?そこまで確認してないがいったん突っ込めるので突っ込んだ&lt;/p&gt;
&lt;h3&gt;.envについて&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;dotenv&lt;/code&gt;を入れているがこれを使っているのは開発時のみで&lt;code class=&quot;language-text&quot;&gt;.env.development&lt;/code&gt;を用意して環境変数を読み込ませている&lt;/p&gt;
&lt;p&gt;デプロイ時はすでに環境変数に各種キーを入れているので&lt;code class=&quot;language-text&quot;&gt;.env&lt;/code&gt;を使用していない&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;取り急ぎ検索は可能になった&lt;/p&gt;
&lt;p&gt;が若干もっさり感が残っていて、とりあえず使えるようになりました!って感じなのでそのあたりチューニングしたい&lt;/p&gt;
&lt;p&gt;あと検索対象や検索結果の見た目もカスタマイズしたいところ&lt;/p&gt;
&lt;p&gt;どっかで時間作ってやる…&lt;/p&gt;
&lt;p&gt;あとgraphqlのエディタが項目チェックするだけでクエリ作ってくれる感じになっていてとても使いやすかった&lt;/p&gt;
&lt;h3&gt;全体の参考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gatsbyjs.com/docs/adding-search-with-algolia/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Adding Search with Algolia | Gatsby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gatsbyjs.com/plugins/gatsby-plugin-algolia/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gatsby-plugin-algolia | Gatsby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/atomyah/items/b772a63fc70bf8e7dbdd&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Gatsby+microCMSサイトにAlgolia全文検索機能を実装 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[TOCを抽出するためのブックマークレット]]></title><description><![CDATA[他の記事はどのような構成なんだろう？ 記事書くときにどのような流れが良いのかなー？ と考えることがあったのでTOCを収集して傾向などを見つけてみようと思ったので掲題のブックマークレットを書いた toc.js ブックマークに登録するときは次のように…]]></description><link>https://til.swfz.io/entries/toc_bookmarklet/</link><guid isPermaLink="false">https://til.swfz.io/entries/toc_bookmarklet/</guid><pubDate>Thu, 10 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;他の記事はどのような構成なんだろう？&lt;/p&gt;
&lt;p&gt;記事書くときにどのような流れが良いのかなー？&lt;/p&gt;
&lt;p&gt;と考えることがあったのでTOCを収集して傾向などを見つけてみようと思ったので掲題のブックマークレットを書いた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;toc.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;log&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;start extract toc&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; d &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;TOC&amp;lt;br /&gt;&amp;lt;textarea cols=&quot;100&quot; rows=&quot;30&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; body &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;/textarea&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; toc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h1,h2,h3,h4&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tagName&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;H&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ブックマークに登録するときは次のように1行にしてスペースはエスケープする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20const&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20log&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;start%20extract%20toc&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20const&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20o&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20const&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20d&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;TOC&amp;lt;br%20/&gt;&amp;lt;textarea%20cols=&quot;100&quot;%20rows=&quot;30&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20body&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;/textarea&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20const&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20toc&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h1,h2,h3,h4&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20const&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20n&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tagName&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;H&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;20return&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;%20&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じの出力が得られる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;## WSL側
## Xlaunch
## WSL側
### 参考：&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;なお、対象ページでタイトル以外にも&lt;code class=&quot;language-text&quot;&gt;h2&lt;/code&gt;などを付けているとその情報も入ってきてしまう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[grepでマッチした行以降の値を表示する]]></title><description><![CDATA[マッチした行以降の表示行数を指定するのはで行えるが対象のファイルの行数すべてをカバーしたい sample.txt の値を動的にすればカバーできるということで こんな感じで対象ファイルの行数を最大とするようにすれば取りこぼしがなくなる]]></description><link>https://til.swfz.io/entries/grep_a_wc_l/</link><guid isPermaLink="false">https://til.swfz.io/entries/grep_a_wc_l/</guid><pubDate>Sun, 30 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;マッチした行以降の表示行数を指定するのは&lt;code class=&quot;language-text&quot;&gt;-A&lt;/code&gt;で行えるが対象のファイルの行数すべてをカバーしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sample.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hoge
fuga
pyo

separator
itemA
itemB
itemC
itemD
itemE&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-A&lt;/code&gt;の値を動的にすればカバーできるということで&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; sample.txt &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; sample.txt &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $1}&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;separator&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じで対象ファイルの行数を最大とするようにすれば取りこぼしがなくなる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WSL2でXLaunchを使ってGUIアプリを起動する]]></title><description><![CDATA[WSL側 DISPLAY環境変数をセットする WSLの起動ごとにIPが変わるらしいのでこんな感じの処理を毎度読ませないといけないよう Xlaunch の項目にを追加 WSL側 これで無事起動できた 参考： WSL2におけるVcXsrvの設定 - Qiita WSL2＋Ubuntu…]]></description><link>https://til.swfz.io/entries/wsl2_with_x/</link><guid isPermaLink="false">https://til.swfz.io/entries/wsl2_with_x/</guid><pubDate>Mon, 24 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;WSL側&lt;/h2&gt;
&lt;p&gt;DISPLAY環境変数をセットする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;DISPLAY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /etc/resolv.conf &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; nameserver &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $2}&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;:0 &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;WSLの起動ごとにIPが変わるらしいのでこんな感じの処理を毎度読ませないといけないよう&lt;/p&gt;
&lt;h2&gt;Xlaunch&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;additional parameter&lt;/code&gt;の項目に&lt;code class=&quot;language-text&quot;&gt;-ac&lt;/code&gt;を追加&lt;/p&gt;
&lt;h2&gt;WSL側&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;xeyes&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで無事起動できた&lt;/p&gt;
&lt;h3&gt;参考：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/ryoi084/items/0dff11134592d0bb895c&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WSL2におけるVcXsrvの設定 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WSL2＋Ubuntu 20.04でGUIアプリを動かす | AsTechLog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[sedで特定箇所の数値を抜き出す]]></title><description><![CDATA[sedでURLの数値部分だけを抜き出したい みたいなことをやっていて これで（855305996）を抜き出せるかとやってみてたが何も反応がない それで調べてみたところstackoverflowが引っかかった sedはPerl…]]></description><link>https://til.swfz.io/entries/sed_number/</link><guid isPermaLink="false">https://til.swfz.io/entries/sed_number/</guid><pubDate>Thu, 20 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;sedでURLの数値部分だけを抜き出したい&lt;/p&gt;
&lt;p&gt;みたいなことをやっていて&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ echo -n &quot;https://api.github.com/repos/swfz/github-actions-playground/actions/runs/855305996/cancel&quot; | sed -e &apos;s/runs\/\(\d+\)\/cancel/\1/g&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで&lt;code class=&quot;language-text&quot;&gt;run_id&lt;/code&gt;（855305996）を抜き出せるかとやってみてたが何も反応がない&lt;/p&gt;
&lt;p&gt;それで調べてみたところstackoverflowが引っかかった&lt;/p&gt;
&lt;p&gt;sedはPerlではない!ということで数値の正規表現として&lt;code class=&quot;language-text&quot;&gt;\d&lt;/code&gt;は使えない&lt;/p&gt;
&lt;p&gt;数値をマッチさせたい場合は&lt;code class=&quot;language-text&quot;&gt;[[:digit:]]&lt;/code&gt; か &lt;code class=&quot;language-text&quot;&gt;[0-9]&lt;/code&gt;と表現するよう&lt;/p&gt;
&lt;p&gt;知らなかった…&lt;/p&gt;
&lt;p&gt;ということで、sedを用いてrun_idの部分を抜き出したい場合は次のようにする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ echo -n &quot;https://api.github.com/repos/swfz/github-actions-playground/actions/runs/855305996/cancel&quot; | sed -e &apos;s/https.*runs\/\([0-9]*\)\/cancel/\1/g&apos;
855305996&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://superuser.com/questions/513412/how-to-match-digits-followed-by-a-dot-using-sed&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;regex - How to match digits followed by a dot using sed? - Super User&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gcloudのActionsを差し替える]]></title><description><![CDATA[普段のGitHubActionsでログを見ていたら次のようなメッセージが出ていた ということで、既存のをに移行する 既存でしている部分を書き換えるだけでOK before after]]></description><link>https://til.swfz.io/entries/github_actions_replace_setup_gcloud/</link><guid isPermaLink="false">https://til.swfz.io/entries/github_actions_replace_setup_gcloud/</guid><pubDate>Fri, 14 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;普段のGitHubActionsでログを見ていたら次のようなメッセージが出ていた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Thank you for using setup-gcloud Action. GoogleCloudPlatform/github-actions/setup-gcloud has been deprecated, please switch to google-github-actions/setup-gcloud.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ということで、既存の&lt;code class=&quot;language-text&quot;&gt;setup-gcloud&lt;/code&gt;を&lt;code class=&quot;language-text&quot;&gt;google-github-actions/setup-gcloud&lt;/code&gt;に移行する&lt;/p&gt;
&lt;p&gt;既存で&lt;code class=&quot;language-text&quot;&gt;uses&lt;/code&gt;している部分を書き換えるだけでOK&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;before&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;GoogleCloudPlatform/github-actions/setup-gcloud@v0.2.1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;after&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;google-github-actions/setup-gcloud@v0.2.1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Twitterで共有されたURLから自分のブログのURLを特定したい]]></title><description><![CDATA[TwitterでURLが共有されると短縮URL化されてという形式のURLになる ブログなどのエゴサをしていると検索には引っかかるが データ収集を自動化するとどの記事かというひも付けがデータ上できないのでの先の記事URLが欲しい よく考えたらでOK…]]></description><link>https://til.swfz.io/entries/curl_redirect_url/</link><guid isPermaLink="false">https://til.swfz.io/entries/curl_redirect_url/</guid><pubDate>Wed, 12 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TwitterでURLが共有されると短縮URL化されて&lt;code class=&quot;language-text&quot;&gt;t.co...&lt;/code&gt;という形式のURLになる&lt;/p&gt;
&lt;p&gt;ブログなどのエゴサをしていると検索には引っかかるが&lt;/p&gt;
&lt;p&gt;データ収集を自動化するとどの記事かというひも付けがデータ上できないので&lt;code class=&quot;language-text&quot;&gt;t.co...&lt;/code&gt;の先の記事URLが欲しい&lt;/p&gt;
&lt;p&gt;よく考えたら&lt;code class=&quot;language-text&quot;&gt;curl&lt;/code&gt;でOKっていうところでやってみた&lt;/p&gt;
&lt;h2&gt;リダイレクト先を表示するオプション&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;--write-out &quot;%{redirect_url}&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;でリダイレクト先のURLを表示してくれるのでそれを記録すれば良い&lt;/p&gt;
&lt;p&gt;実際にたたいてみると&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://t.co/...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://htn.to/...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://b.hatena.ne.jp/-/redirect?code=&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;を経由してやっと目的のURLへたどり着くことができた&lt;/p&gt;
&lt;p&gt;たどり着くことが可能なら特定も可能ということでさくっとスクリプトを書いた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;target_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--silent&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; /dev/null --write-out &lt;span class=&quot;token string&quot;&gt;&quot;%{redirect_url}&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${target_url}&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token assign-left variable&quot;&gt;redirected&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; http &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${redirected}&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${url}&lt;/span&gt;,&lt;span class=&quot;token variable&quot;&gt;${target_url}&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

  &lt;span class=&quot;token assign-left variable&quot;&gt;matched&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;^https\?://swfz.hatenablog.com&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${matched}&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    query &lt;span class=&quot;token variable&quot;&gt;${result}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;formatted&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/\?.*//&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${url}&lt;/span&gt;,&lt;span class=&quot;token variable&quot;&gt;${formatted}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

query &lt;span class=&quot;token variable&quot;&gt;${url}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;一応リダイレクト先がない場合無限ループにならないよう実装した&lt;/p&gt;
&lt;p&gt;あと自分の記事のURLのPVとしてはカウントされないが経由するサービスのPVとしてはカウントされてしまうはずなので乱用は厳禁&lt;/p&gt;
&lt;p&gt;これでめでたく記事と言及ツイートのひも付けができそう&lt;/p&gt;
&lt;p&gt;過去のデータもよしなにやってしまおうと思い実行してみたら経由するURLの中にすでに運営終了しているサービスが存在し、たどれないみたいなパターンがぼちぼちあった&lt;/p&gt;
&lt;p&gt;そういうのはツイートに遷移してタイトルなりで判断して手動でデータ埋めるしかないなーという運びとなった&lt;/p&gt;
&lt;p&gt;完全に自動化って難しいですね…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[BigQueryのbq load時にautodetectを使えない場合]]></title><description><![CDATA[PocketのデータをAPIで取得してBigQueryに突っ込もうとしたときの話 GCSにJSONを置いてCLIからでデータをloadしようとしたらエラーで怒られた 前提 現状あるデータは次の3つ（bucket名はサンプル） 原因の切り分け raw-03.json raw-0…]]></description><link>https://til.swfz.io/entries/bigquery_cant_use_autodetect/</link><guid isPermaLink="false">https://til.swfz.io/entries/bigquery_cant_use_autodetect/</guid><pubDate>Sat, 08 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PocketのデータをAPIで取得してBigQueryに突っ込もうとしたときの話&lt;/p&gt;
&lt;p&gt;GCSにJSONを置いてCLIから&lt;code class=&quot;language-text&quot;&gt;bq load --autodetect&lt;/code&gt;でデータをloadしようとしたらエラーで怒られた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;BigQuery error in load operation: Error processing job
&apos;project-111111:bqjob_r70118be7bda78ce4_000001793f9c2946_1&apos;: Error while reading
data, error message: JSON table encountered too many errors, giving up. Rows: 1;
errors: 1. Please look into the errors[] collection for more details.
Failure details:
- Error while reading data, error message: JSON processing
encountered too many errors, giving up. Rows: 1; errors: 1; max
bad: 0; error percent: 0
- gs://sample-bucket/preprocessed_rawdata/month=2021-05-01/raw-04.json: Error
while reading data, error message: JSON parsing error in row
starting at position 0: JSON object specified for non-record field:
list.videos&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;p&gt;現状あるデータは次の3つ（bucket名はサンプル）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gs://sample-bucket/preprocessed_rawdata/month=2021-05-01/raw-03.json
gs://sample-bucket/preprocessed_rawdata/month=2021-05-01/raw-04.json
gs://sample-bucket/preprocessed_rawdata/month=2021-05-01/raw-05.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;原因の切り分け&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;raw-03.json&lt;/li&gt;
&lt;li&gt;raw-04.json&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のときは問題なくloadできている&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;raw-05.json&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;が追加されてから上記エラーになってしまった&lt;/p&gt;
&lt;p&gt;05と03,04のJSONの中身を比べてみたところ05には&lt;code class=&quot;language-text&quot;&gt;list.videos&lt;/code&gt;がすべて&lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt;になっていた&lt;/p&gt;
&lt;p&gt;03,04に関してはどこかのレコードでオブジェクトが入っていたので&lt;code class=&quot;language-text&quot;&gt;RECORD&lt;/code&gt;と判断された模様&lt;/p&gt;
&lt;p&gt;このことから&lt;code class=&quot;language-text&quot;&gt;--autodetect&lt;/code&gt;は最初のファイルをautodetectで読み込んで順番にその他ファイルも読み込んでいると考えられる&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/bigquery/docs/schema-detect?hl=ja#auto-detect&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;スキーマの自動検出&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ここに説明が書いてあった&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自動検出を有効にすると、BigQuery はデータソース内でランダムにファイルを選択します。ファイルの最大 100 行をスキャンして代表的なサンプルとして使用し、推定プロセスを開始します。BigQuery は、各フィールドを検証し、そのサンプル内の値に基づいてそのフィールドにデータ型を割り当てようとします。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ランダムでファイルを読み込むとあるので全パターンを網羅したデータがあるファイルじゃないファイルがサンプルに選定されてしまった場合にこういうことが起きる&lt;/p&gt;
&lt;p&gt;そうなると&lt;code class=&quot;language-text&quot;&gt;autodetect&lt;/code&gt;は使えないのでテーブル作成→loadの手順を踏む必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;schemaの取り出し&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;うまく行ったパターンで生成したテーブルのスキーマを取得する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;bq show &lt;span class=&quot;token parameter variable&quot;&gt;--schema&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;prettyjson pocket.rawdata &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; pocket-rawdata.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;テーブル作成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;別のテーブルを用意して試してみる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;bq mk &lt;span class=&quot;token parameter variable&quot;&gt;--table&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--time_partitioning_field&lt;/span&gt; month &lt;span class=&quot;token parameter variable&quot;&gt;--time_partitioning_type&lt;/span&gt; MONTH sample.pocket_rawdata pocket-rawdata.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;load&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;bq load &lt;span class=&quot;token parameter variable&quot;&gt;--source_format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;NEWLINE_DELIMITED_JSON &lt;span class=&quot;token parameter variable&quot;&gt;--replace&lt;/span&gt; sample.pocket_rawdata &lt;span class=&quot;token string&quot;&gt;&apos;gs://sample-bucket/preprocessed_rawdata/*&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;今のところこんな感じでなんとかなっている&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;取り込み対象のデータにばらつきがある（あるデータではRECORD、あるデータでは&lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt;のようなとき）とサンプリング次第で取り込めない場合がある&lt;/p&gt;
&lt;p&gt;さらに&lt;code class=&quot;language-text&quot;&gt;--autodetect&lt;/code&gt;+&lt;code class=&quot;language-text&quot;&gt;--replace&lt;/code&gt;を用いると毎回ロード時に自動検出するので失敗する可能性がある&lt;/p&gt;
&lt;p&gt;そのためスキーマを定義してテーブルの作成+&lt;code class=&quot;language-text&quot;&gt;bq load&lt;/code&gt;と手順を踏む必要がある&lt;/p&gt;
&lt;h2&gt;所感&lt;/h2&gt;
&lt;p&gt;本来だったら&lt;code class=&quot;language-text&quot;&gt;autodetect&lt;/code&gt;で生成したスキーマからさらに精査して本当に&lt;code class=&quot;language-text&quot;&gt;NULLABLE&lt;/code&gt;?みたいな話も考えたほうが良いが今回は趣味プロジェクトなので…&lt;/p&gt;
&lt;p&gt;autodetectは便利だけどこういうパターンに対応できないのでやはりPOCやお試しのときくらいしか使えないよなーとあらためて感じた&lt;/p&gt;
&lt;p&gt;まぁでも気軽に試せるのはとても良いことなので使い分けが大事&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PocketのデータをAPI経由でBigQueryに取り込む]]></title><description><![CDATA[まずからでアプリケーションを作成してを取得する 取得したを環境変数に入れておく request tokenの発行 適当なリダイレクト先を指定してrequest token…]]></description><link>https://til.swfz.io/entries/start_pocket_api/</link><guid isPermaLink="false">https://til.swfz.io/entries/start_pocket_api/</guid><pubDate>Fri, 07 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;まず&lt;code class=&quot;language-text&quot;&gt;My Applications&lt;/code&gt;から&lt;code class=&quot;language-text&quot;&gt;CREATE APP&lt;/code&gt;でアプリケーションを作成して&lt;code class=&quot;language-text&quot;&gt;consumer key&lt;/code&gt;を取得する&lt;/p&gt;
&lt;p&gt;取得した&lt;code class=&quot;language-text&quot;&gt;consumer key&lt;/code&gt;を環境変数に入れておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CONSUMER_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxxx&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;request tokenの発行&lt;/h2&gt;
&lt;p&gt;適当なリダイレクト先を指定してrequest tokenを生成する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json; charset=UTF-8&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
   https://getpocket.com/v3/oauth/request &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
   &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; @-&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOS
{
  &quot;consumer_key&quot; : &quot;&lt;span class=&quot;token variable&quot;&gt;${CONSUMER_KEY}&lt;/span&gt;&quot;,
  &quot;redirect_uri&quot;:&quot;http://localhost:8001/&quot;
}
EOS&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxxx&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;結果を環境変数に入れておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;REQUEST_TOKEN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxxx&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ブラウザへ遷移してアプリケーションのアクセス許可を行う&lt;/h2&gt;
&lt;p&gt;リダイレクト先は適当に&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://getpocket.com/auth/authorize?request_token=&lt;span class=&quot;token variable&quot;&gt;${REQUEST_TOKEN}&lt;/span&gt;&amp;amp;redirect_uri=http://localhost:8001/&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;access tokenの発行&lt;/h2&gt;
&lt;p&gt;先の手順で得たrequest tokenを用いてaccess tokenの発行する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json; charset=UTF-8&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
https://getpocket.com/v3/oauth/authorize &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; @-&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOS
{
  &quot;consumer_key&quot;:&quot;&lt;span class=&quot;token variable&quot;&gt;${CONSUMER_KEY}&lt;/span&gt;&quot;,
  &quot;code&quot;:&quot;&lt;span class=&quot;token variable&quot;&gt;${REQUEST_TOKEN}&lt;/span&gt;&quot;
}
EOS&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;access_token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxxx&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;hoge&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;access_token=&lt;/code&gt;の部分を環境変数に入れておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxxx&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで準備が完了した&lt;/p&gt;
&lt;h2&gt;何かしら問い合わせてみる&lt;/h2&gt;
&lt;p&gt;記事データを取得してみる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; res.json &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json; charset=UTF-8&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
https://getpocket.com/v3/get &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; @-&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOS
{
  &quot;consumer_key&quot;:&quot;&lt;span class=&quot;token variable&quot;&gt;${CONSUMER_KEY}&lt;/span&gt;&quot;,
  &quot;access_token&quot;:&quot;&lt;span class=&quot;token variable&quot;&gt;${ACCESS_TOKEN}&lt;/span&gt;&quot;,
  &quot;state&quot;:&quot;unread&quot;,
  &quot;detailType&quot;:&quot;complete&quot;,
  &quot;count&quot;:3
}
EOS&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://getpocket.com/developer/docs/v3/retrieve&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pocket API: Retrieving a User’s Pocket Data&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;retrieveのAPIの仕様についてはこの辺&lt;/p&gt;
&lt;h2&gt;おまけ&lt;/h2&gt;
&lt;p&gt;ここで得たJSONをBigQueryに放り込んでよしなにやろうとしたが一筋縄では行かなかった&lt;/p&gt;
&lt;p&gt;次のエラーはレスポンスのJSONファイルをそのままGCSにあげて&lt;code class=&quot;language-text&quot;&gt;bq load&lt;/code&gt;しようとした結果&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Error in query string: Error processing job &apos;project-111111:bqjob_r75b06933ac2f4481_0000017942c36b05_1&apos;: Invalid field name &quot;3292257344&quot;. Fields must contain only letters, numbers, and
underscores, start with a letter or underscore, and be at most 300 characters long. Table: sample_8bb5a901_3d95_41f4_9512_e7f4fad8a737_source&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;エラー文言自体は&lt;code class=&quot;language-text&quot;&gt;文字またはアンダースコアで始まり&lt;/code&gt;の部分に違反しているのでエラーがでているがそもそもこのキーがIDなので記事によって可変であるためスキーマ定義ができない&lt;/p&gt;
&lt;p&gt;json形式が微妙すぎるのでどうしてもフォーマットしてあげないとダメそう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;complete&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;3324677936&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;item_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677936&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;resolved_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677936&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      .....
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;3324677937&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;item_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677937&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;resolved_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677937&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      .....
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    .....&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じで数値キーのハッシュとして出力されている&lt;/p&gt;
&lt;p&gt;配列で表現してほしかった…&lt;/p&gt;
&lt;p&gt;ということで数値キーになっている要素を数値キーを削除した形で保持させる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;complete&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;item_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677936&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;resolved_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677936&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      .....
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;item_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677937&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;resolved_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3324677937&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      .....
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    .....
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じ&lt;/p&gt;
&lt;p&gt;中身を見た感じ&lt;code class=&quot;language-text&quot;&gt;.list&lt;/code&gt;以外にも同様の形式だったのでそちらも同様に配列に変更する必要がある&lt;/p&gt;
&lt;h3&gt;ハッシュ→配列にする必要がある要素&lt;/h3&gt;
&lt;p&gt;執筆時点で把握しているのは下記&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.list&lt;/li&gt;
&lt;li&gt;.list.images&lt;/li&gt;
&lt;li&gt;.list.videos&lt;/li&gt;
&lt;li&gt;.list.authors&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;jqでよしなにやる&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cat res.json| jq  -cr &apos;.list=(.list|to_entries|map(.value)|map(.images=if has(&quot;images&quot;) then .images|to_entries|map(.value) else [] end)|map(.videos=if has(&quot;videos&quot;) then .videos|to_entries|map(.value) else [] end)|map(.authors=if has(&quot;authors&quot;) then .authors|to_entries|map(.value) else [] end))&apos; &gt; list.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;キー自体がそもそもない場合もあったのでその場合は空配列にする&lt;/p&gt;
&lt;h3&gt;BigQueryに入れ込む&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bq load --replace --autodetect --source_format=NEWLINE_DELIMITED_JSON sample_dataset.sample list.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでOK&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Dataportalで月毎に日平均値を計算する]]></title><description><![CDATA[こういうのはどうしてもView側で用意しないと計算できないのでメモしておく 計算フィールドを用意する 月ごとで1日あたりの時間数を取りたいのでこんな感じになる SQLと一緒といえば一緒なので割と把握しやすい]]></description><link>https://til.swfz.io/entries/dataportal_custom_field_count_distinct/</link><guid isPermaLink="false">https://til.swfz.io/entries/dataportal_custom_field_count_distinct/</guid><pubDate>Fri, 30 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;こういうのはどうしてもView側で用意しないと計算できないのでメモしておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;計算フィールドを用意する&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sum(hour)/count_distinct(start_date)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;月ごとで1日あたりの時間数を取りたいのでこんな感じになる&lt;/p&gt;
&lt;p&gt;SQLと一緒といえば一緒なので割と把握しやすい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WSL2でDockerForWindowsのコマンドを叩く]]></title><description><![CDATA[がたたけるようになったらしいのでWSL2からもたたいてみようということで 前提 自分はWSL側からWindowsのコマンドを使うことはできるがPATHは読み込ませないようにしている（シェルの起動速度が遅かったため） /etc/wsl.conf しらべた WSLからWindows…]]></description><link>https://til.swfz.io/entries/wsl_docker_for_windows/</link><guid isPermaLink="false">https://til.swfz.io/entries/wsl_docker_for_windows/</guid><pubDate>Tue, 27 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;docker compose&lt;/code&gt;がたたけるようになったらしいのでWSL2からもたたいてみようということで&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;p&gt;自分はWSL側からWindowsのコマンドを使うことはできるがPATHは読み込ませないようにしている（シェルの起動速度が遅かったため）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/etc/wsl.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ini line-numbers&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;interop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;appendWindowsPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;しらべた&lt;/h2&gt;
&lt;p&gt;WSLからWindows側のDocker関連のコマンドをたたく場合&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;/mnt/c/Program\ Files/Docker/Docker/resources/bin/&lt;/code&gt;以下にコマンド群がある&lt;/p&gt;
&lt;p&gt;しかし&lt;code class=&quot;language-text&quot;&gt;docker-compose&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;docker-compose&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;docker-compose.exe&lt;/code&gt;と両方あるのに&lt;code class=&quot;language-text&quot;&gt;docker&lt;/code&gt;に関しては&lt;code class=&quot;language-text&quot;&gt;docker.exe&lt;/code&gt;しかなかった&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;docker-compose&lt;/code&gt;の中身を見たら環境によってたたくプログラムを変えているようだったので&lt;code class=&quot;language-text&quot;&gt;docker&lt;/code&gt;でも同じようなスクリプトを用意した&lt;/p&gt;
&lt;p&gt;参考にしたファイルはいくつか分岐があったが自分が使う環境は条件分岐しなくても良いので決め打ちにした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/mnt/c/Program\ Files/Docker/Docker/resources/bin/docker&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env sh&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;binary&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$binary&lt;/span&gt;.exe&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行してみる&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ /mnt/c/Program\ Files/Docker/Docker/resources/bin/docker compose --help
Docker Compose

Usage:
  docker compose [command]

Available Commands:
  build       Build or rebuild services
  convert     Converts the compose file to platform&apos;s canonical format
  create      Creates containers for a service.
  down        Stop and remove containers, networks
  events      Receive real time events from containers.
  exec        Execute a command in a running container.
  kill        Force stop service containers.
  logs        View output from containers
  ls          List running compose projects
  pause       pause services
  port        Print the public port for a port binding.
  ps          List containers
  pull        Pull service images
  push        Push service images
  restart     Restart containers
  rm          Removes stopped service containers
  run         Run a one-off command on a service.
  start       Start services
  stop        Stop services
  top         Display the running processes
  unpause     unpause services
  up          Create and start containers

Flags:
      --ansi string                Control when to print ANSI control characters (&quot;never&quot;|&quot;always&quot;|&quot;auto&quot;) (default &quot;auto&quot;)
      --env-file string            Specify an alternate environment file.
  -f, --file stringArray           Compose configuration files
  -h, --help                       help for compose
      --profile stringArray        Specify a profile to enable
      --project-directory string   Specify an alternate working directory
                                   (default: the path of the Compose file)
  -p, --project-name string        Project name

Use &quot;docker compose [command] --help&quot; for more information about a command.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでWSL2側からWindowsの&lt;code class=&quot;language-text&quot;&gt;docker&lt;/code&gt;コマンドをたたけるようになった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[BigQueryで日付を扱うときはTimezoneを意識する]]></title><description><![CDATA[dataformでsourceテーブルから中間テーブルを生成してassertionを書いていた 検算したら件数が合わないなーということで調べた 次のようなSQLで,を指定して単月分のレコードのみ抜き出すというパターン SQLX…]]></description><link>https://til.swfz.io/entries/bigquery_date_timezone/</link><guid isPermaLink="false">https://til.swfz.io/entries/bigquery_date_timezone/</guid><pubDate>Wed, 21 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;dataformでsourceテーブルから中間テーブルを生成してassertionを書いていた&lt;/p&gt;
&lt;p&gt;検算したら件数が合わないなーということで調べた&lt;/p&gt;
&lt;p&gt;次のようなSQLで&lt;code class=&quot;language-text&quot;&gt;from&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;to&lt;/code&gt;を指定して単月分のレコードのみ抜き出すというパターン&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;private&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; workspace
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;
  &lt;span class=&quot;token identifier&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;sample.rawdata-private&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; d
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;BETWEEN&lt;/span&gt; ${target_date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt;}
  &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; ${target_date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;to&lt;/span&gt;}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;SQLXなので&lt;code class=&quot;language-text&quot;&gt;target_date.to&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;target_date.from&lt;/code&gt;はその時々によって変化する&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;今回は&lt;code class=&quot;language-text&quot;&gt;2021-04-01&lt;/code&gt; ～ &lt;code class=&quot;language-text&quot;&gt;2021-04-30&lt;/code&gt;をという感じ&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;rawdata-private&lt;/code&gt;はAPIのレスポンスをそのまま保存していて1行に&lt;code class=&quot;language-text&quot;&gt;total_count&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;data&lt;/code&gt;列に実際のレコードがあるので&lt;code class=&quot;language-text&quot;&gt;UNNEST&lt;/code&gt;してレコード数と比較することで確認している&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;rawdata-private&lt;/code&gt;のレコードを追ってみると&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2021-04-01T04:57:39+09:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;のデータが&lt;code class=&quot;language-text&quot;&gt;DATE(start)&lt;/code&gt;を通すことで&lt;code class=&quot;language-text&quot;&gt;2021-03-31&lt;/code&gt;になっていた&lt;/p&gt;
&lt;p&gt;なるほどUTC&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;DATE(start, &apos;Asia/Tokyo&apos;),&lt;/code&gt;でタイムゾーン指定の日付データに変換できるのでこれで対応&lt;/p&gt;
&lt;p&gt;BigQueryがDATEでよしなにやってくれた結果UTCで解釈すると&lt;code class=&quot;language-text&quot;&gt;2021-03-31&lt;/code&gt;となってしまうためフィルタ対象から外れてしまい、件数が合わない状態になっていた&lt;/p&gt;
&lt;p&gt;正直assertion書いてなかったら気付かなかったのでassertion大事w&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DataPortalで9時区切りの日付カラムを計算フィールドで作成する]]></title><description><![CDATA[ただのメモ TogglからBigQueryにデータを突っ込んでいてそれをDataPortal経由でグラフ化している （実際計測している時刻UTCではなくAsia/TokyoだがToggl側のAPIが返す値は時刻+UTC…]]></description><link>https://til.swfz.io/entries/dataportal_experience_date/</link><guid isPermaLink="false">https://til.swfz.io/entries/dataportal_experience_date/</guid><pubDate>Sat, 10 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ただのメモ&lt;/p&gt;
&lt;p&gt;TogglからBigQueryにデータを突っ込んでいてそれをDataPortal経由でグラフ化している&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;start: 2020-12-25 21:52:30 UTC&lt;/code&gt;（実際計測している時刻UTCではなくAsia/TokyoだがToggl側のAPIが返す値は時刻+UTCという値が返ってきている）&lt;/p&gt;
&lt;p&gt;上記のようなフォーマットのカラムを午前9時を堺にグルーピングしたいという要件が出てきた&lt;/p&gt;
&lt;h2&gt;経緯&lt;/h2&gt;
&lt;p&gt;単にグラフ化した場合&lt;code class=&quot;language-text&quot;&gt;start&lt;/code&gt;を基準にして日付単位でグループ化すると&lt;/p&gt;
&lt;p&gt;睡眠時間によっては日の合計時間が24時間を超えてしまうためグラフを眺めていて違和感がある&lt;/p&gt;
&lt;p&gt;そのため現在は0時をまたいで睡眠をとった場合は0時を境に分割して記録している&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;睡眠: 2021-04-09 22:00:00 ～ 2021-04-10 07:00:00
Toggl上での記録: 
- 2021-04-09 22:00:00 ～ 2021-04-10 00:00:00
- 2021-04-10 00:00:00 ～ 2021-04-10 07:00:00&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;そうすると正確な日付としては分割して結果を閲覧できるが自分の体感としての日の睡眠時間がずれてグラフ化されてしまう&lt;/p&gt;
&lt;p&gt;そこで、冒頭のように午前9時開始を堺に日付を分割して0-9時のデータは前日分としてグラフ上では扱えるようにする&lt;/p&gt;
&lt;p&gt;そのための計算フィールドの計算式が下記&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  parse_datetime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%dT%H&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    format_datetime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%dT%H&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; parse_datetime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%dT%H&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    format_datetime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%dT09&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  parse_date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;format_datetime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; datetime_sub&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTERVAL&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DAY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  parse_date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;format_datetime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;つまずきポイント&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DataPortalで日付カラムとして扱う場合はDate型かDateTime型になっている必要があるので結果に&lt;code class=&quot;language-text&quot;&gt;parse_date&lt;/code&gt;などパース処理が必要&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;start&lt;/code&gt;自体も日付・時刻カラムだったのでまず&lt;code class=&quot;language-text&quot;&gt;format_datetime&lt;/code&gt;でフォーマットしてからさらに&lt;code class=&quot;language-text&quot;&gt;parse_datetime&lt;/code&gt;で比較させて上げる必要があった&lt;/li&gt;
&lt;li&gt;よく考えれば分かるはずだったがDataPortal上のテーブルで可視化すると別のフォーマットで出力されてしまい若干混乱した&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こんな感じで午前9時を境に日付を変更できた&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 481px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/faee9d410e6f5731ad397797548a49c0/d024a/dataportal_experience_date01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 45.27027027027027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABpUlEQVR42n2Ry24UMRBF+6dAAws2oxBYEDIKbEIEm0hBQmIR8bVISWiGGfrpZ7vbdtt9KVsZoizAUqlcpevjehSr4zM8e/UOH66usT49x9P1CVYvN2SnWB1vcHT2Ec9fv8+a1dFbZD3ln6zf4OT8Ep++fMPF52tcXH3Fi80liq5r0XQMVVWhLH+g/Flmv9/vwLnAdrfH7d0Nfm23YIxlbd8zsL6HlBLTOEIPGt4afC8bFCEE+LBACEkCAa01BjLnHNKR2uT8MAw5TtplwaNziBvhUXjnYX3MQM45eZEtASMJhRpyNcYYerjAzRGBoDE+WIoJi0o4FMPk4UnE70FKqeyttUiyBOScPQImSLofLMUJuOstCud9FgmaxwEopfoLTC0LqlwpTY8jfb78E1hxqjA9dNRy23VomoYG3qNtW5j7mfVMoq7rnI/xf0DgN5toKTO1HCINnZahJEYzEIyWYqcs0tSq0ZIWpXKFc15KpIIi+UBzDhmaKmwkVWjcAjUFjB6w84NNfsFgA9mCkWLjUy6SNkJTouMadSfQ9PTZNMO6GXf1iD8o65MbU4w2bQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/faee9d410e6f5731ad397797548a49c0/cbe2e/dataportal_experience_date01.webp 148w,
/static/faee9d410e6f5731ad397797548a49c0/3084c/dataportal_experience_date01.webp 295w,
/static/faee9d410e6f5731ad397797548a49c0/1c567/dataportal_experience_date01.webp 481w&quot;
              sizes=&quot;(max-width: 481px) 100vw, 481px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/faee9d410e6f5731ad397797548a49c0/12f09/dataportal_experience_date01.png 148w,
/static/faee9d410e6f5731ad397797548a49c0/e4a3f/dataportal_experience_date01.png 295w,
/static/faee9d410e6f5731ad397797548a49c0/d024a/dataportal_experience_date01.png 481w&quot;
            sizes=&quot;(max-width: 481px) 100vw, 481px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/faee9d410e6f5731ad397797548a49c0/d024a/dataportal_experience_date01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Terraformの配列で複数CloudRunのURLをOutPutする]]></title><description><![CDATA[0.12以降ではresourceに対しても繰り返しの構文が使えるようなので使ってみた一例 CloudRunを複数作ってEndpointのURLをOutPutに設定する CloudRun単一の場合URLは次のように取得する 複数ある場合は次のようにしてmapにする output…]]></description><link>https://til.swfz.io/entries/terraform_tomap/</link><guid isPermaLink="false">https://til.swfz.io/entries/terraform_tomap/</guid><pubDate>Thu, 08 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;0.12以降ではresourceに対しても繰り返しの構文が使えるようなので使ってみた一例&lt;/p&gt;
&lt;p&gt;CloudRunを複数作ってEndpointのURLをOutPutに設定する&lt;/p&gt;
&lt;p&gt;CloudRun単一の場合URLは次のように取得する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;google_cloud_run_service.app.status[0].url&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;複数ある場合は次のようにしてmapにする&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-hcl line-numbers&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;output&lt;span class=&quot;token type variable&quot;&gt; url &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; tomap(&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; for k,v in google_cloud_run_service.app : &lt;span class=&quot;token property&quot;&gt;k&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&gt; v.status&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;.url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;)
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;outputはこんな感じ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;url = {
  &quot;hoge&quot; = &quot;https://sample-cloudrun-hoge-hogehoge-an.a.run.app&quot;
  &quot;fuga&quot; = &quot;https://sample-cloudrun-fuga-hogehoge-an.a.run.app&quot;
}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;という感じで取得できる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Terraform+GCSでバックエンドの設定をCLIで行う]]></title><description><![CDATA[環境ごとにバックエンドの設定を変えたりする場合などに有効 backend.tf ファイルから設定する backend-config.tfvars コマンドラインから設定する]]></description><link>https://til.swfz.io/entries/terraform_gcs_backend/</link><guid isPermaLink="false">https://til.swfz.io/entries/terraform_gcs_backend/</guid><pubDate>Wed, 07 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;環境ごとにバックエンドの設定を変えたりする場合などに有効&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;backend.tf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-hcl line-numbers&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;terraform&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;backend&lt;span class=&quot;token type variable&quot;&gt; &quot;gcs&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ファイルから設定する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;backend-config.tfvars&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-hcl line-numbers&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token property&quot;&gt;bucket&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hoge-tfstate&quot;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;prefix&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;prefix-hoge&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;terraform init -backend-config&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;backend-config.tfvars&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コマンドラインから設定する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;terraform init -backend-config&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bucket=hoge-tfstate&quot;&lt;/span&gt; -backend-config&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;prefix=prefix-hoge&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[SecretManagerの作成や更新をCLIで行う]]></title><description><![CDATA[作成はだけど更新はに対しての操作が必要 シークレットの作成 シークレットの更新 echoのみだと末尾の改行も含まれてしまうのでが必要]]></description><link>https://til.swfz.io/entries/secret_manager_with_cli/</link><guid isPermaLink="false">https://til.swfz.io/entries/secret_manager_with_cli/</guid><pubDate>Tue, 06 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;作成は&lt;code class=&quot;language-text&quot;&gt;secrets&lt;/code&gt;だけど更新は&lt;code class=&quot;language-text&quot;&gt;secrets versions&lt;/code&gt;に対しての操作が必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シークレットの作成&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$TOKEN&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; gcloud secrets create HOGE_TOKEN --replication-policy&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;automatic --data-file&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;シークレットの更新&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$TOKEN&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; gcloud secrets versions &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; HOGE_TOKEN --data-file&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;echoのみだと末尾の改行も含まれてしまうので&lt;code class=&quot;language-text&quot;&gt;-n&lt;/code&gt;が必要&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; -n     do not output the trailing newline&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[CloudWatchLogsで複数行またいだログを適切に扱う]]></title><description><![CDATA[CloudWatchLogsエージェントを使ってログを集める際のはなし Railsのログから,などのログだけ抽出してSlackに投げようというような運用はよくある CloudWatchLogsにログを集めて行う場合はLogs…]]></description><link>https://til.swfz.io/entries/cloudwatch_logs_multi_line_log/</link><guid isPermaLink="false">https://til.swfz.io/entries/cloudwatch_logs_multi_line_log/</guid><pubDate>Fri, 02 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CloudWatchLogsエージェントを使ってログを集める際のはなし&lt;/p&gt;
&lt;p&gt;Railsのログから&lt;code class=&quot;language-text&quot;&gt;FATAL&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;ERROR&lt;/code&gt;などのログだけ抽出してSlackに投げようというような運用はよくある&lt;/p&gt;
&lt;p&gt;CloudWatchLogsにログを集めて行う場合はLogsのサブスクリプションフィルタを使って対象を絞ってLambdaなどを介して通知する&lt;/p&gt;
&lt;p&gt;が、スタックトレースを伴うエラーなどのログは改行が含まれているのでデフォルトの設定だと1行1行が別々のログとして扱われてしまう&lt;/p&gt;
&lt;p&gt;複数行のログでも1つのまとまりとして扱いたい&lt;/p&gt;
&lt;p&gt;そこで&lt;code class=&quot;language-text&quot;&gt;multi_line_start_pattern&lt;/code&gt;の設定をする&lt;/p&gt;
&lt;h2&gt;設定&lt;/h2&gt;
&lt;p&gt;オプションはこの正規表現にマッチする行がスタートですよという意味合い&lt;/p&gt;
&lt;p&gt;Fluentdとかでもこういうのあったね&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CloudWatch Logs エージェントのリファレンス - Amazon CloudWatch Logs&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/opt/aws/amazon-cloudwatch-agent/bin/config.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;logs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;logs_collected&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;files&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;collect_list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;file_path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/path/to/log/hoge.log&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;log_group_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/cwl-test/dev/rails&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;log_stream_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{instance_id}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;multi_line_start_pattern&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;[F|E|W|I|D], .*&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Rails.logger&lt;/code&gt;を通してログを出力した場合は基本的にログ1件の単位が上記の正規表現で対応できる状態になる&lt;/p&gt;
&lt;p&gt;こんなログが1件として扱われる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;F, [2021-04-02T17:40:01.079206 #21599] FATAL -- : 
ActionController::RoutingError (No route matches [GET] &quot;/hoge&quot;):
.....
.....
.....&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[gcloudコマンドでTerraformが使用する認証情報のセットをサービスアカウント以外で行う]]></title><description><![CDATA[忘れてしまうのでメモ gcloud auth login  |  Cloud SDK のドキュメント  |  Google Cloud URLのリンクへ飛ぶと「○を許可しますか?」と聞かれる 許可すると認証コードを発行されるのでそれをコンソールに戻って入力すればOK…]]></description><link>https://til.swfz.io/entries/gcloud_application_default_login/</link><guid isPermaLink="false">https://til.swfz.io/entries/gcloud_application_default_login/</guid><pubDate>Wed, 31 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;忘れてしまうのでメモ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gcloud auth application-default login&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/sdk/gcloud/reference/auth/login?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;gcloud auth login  |  Cloud SDK のドキュメント  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;URLのリンクへ飛ぶと「○を許可しますか?」と聞かれる&lt;/p&gt;
&lt;p&gt;許可すると認証コードを発行されるのでそれをコンソールに戻って入力すればOK&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Go to the following link in your browser:


    https://accounts.google.com/o/oauth2/auth?response_type=code&amp;amp;...........

Enter verification code: &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Credentials saved to file: [/home/user/.config/gcloud/application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).
/home/sawafuji/google-cloud-sdk/lib/third_party/google/auth/_default.py:70: UserWarning: Your application has authenticated using end user credentials from Google Cloud SDK without a quota project. You might receive a &quot;quota exceeded&quot; or &quot;API not enabled&quot; error. We recommend you rerun `gcloud auth application-default login` and make sure a quota project is added. Or you can use service accounts instead. For more information about service accounts, see https://cloud.google.com/docs/authentication/
  warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)

Quota project &quot;sample-project-111111&quot; was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;別のアカウントで実行したら上書きされるようなので複数アカウントにまたいで作業をするマシンの場合は一応注意が必要ではある&lt;/p&gt;
&lt;p&gt;認証情報のデフォルト設定を任意の場所に置く&lt;/p&gt;
&lt;p&gt;確認したら下記だった&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$HOME/.config/gcloud/application_default_credentials.json&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;そしてそこで生成された認証情報を使ってTerraformも実行できるようになる&lt;/p&gt;
&lt;p&gt;なのでサービスアカウントではなくてもTerraformをたたくことができる&lt;/p&gt;
&lt;p&gt;わざわざサービスアカウントでIAMの調整をしなくて良いので便利&lt;/p&gt;
&lt;p&gt;CDでTerraformたたく感じでなければこの方法が楽で良さそう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Cloud Workflowsの実行をCloudScheduler経由で行う(パラメータ付き)]]></title><description><![CDATA[CloudSchedulerからCloudWorkflowsを実行するためのTips Cloud Scheduler の使用によるワークフローのスケジュール設定  |  Google Cloud に単純に実行するだけのパターンは載っていたがWorkflows…]]></description><link>https://til.swfz.io/entries/gcp_scheduler_to_workflows/</link><guid isPermaLink="false">https://til.swfz.io/entries/gcp_scheduler_to_workflows/</guid><pubDate>Tue, 30 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CloudSchedulerからCloudWorkflowsを実行するためのTips&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/workflows/docs/schedule-workflow&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cloud Scheduler の使用によるワークフローのスケジュール設定  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;に単純に実行するだけのパターンは載っていたがWorkflowsの実行時にパラメータを渡すときどうするのかは書いていなかった&lt;/p&gt;
&lt;p&gt;そのため単純に渡したいJSONを突っ込んだだけでは&lt;code class=&quot;language-text&quot;&gt;INVALID_ARGUMENTS&lt;/code&gt;で怒られた&lt;/p&gt;
&lt;p&gt;そこで下記APIドキュメントを見てWorkflowをたたくためのJSONの中身を調べた&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/workflows/docs/reference/executions/rest/v1beta/projects.locations.workflows.executions?hl=ja#Execution&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;REST Resource: projects.locations.workflows.executions  |  ワークフロー&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;argument&lt;/code&gt;というキーにencodeしたJSON文字列をいれてたたくと意図通りパラメータが渡されるよう&lt;/p&gt;
&lt;p&gt;ということでそういうJSONパラメータを作成してたたけるようにした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;argument&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{\&quot;graph_id\&quot;:\&quot;reading\&quot;,\&quot;project_id\&quot;:156548296}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じ&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Functions framework Rubyを試す]]></title><description><![CDATA[環境 Gemfile app.rb Sinatraを入れて簡単なサーバを立ち上げられるようにした ローカルでサーバを起動する たたいてみる 返ってきた deployする 確認 OIDC認証もバッチリ ドキュメント File: Deploying Functions…]]></description><link>https://til.swfz.io/entries/functions_framework_ruby/</link><guid isPermaLink="false">https://til.swfz.io/entries/functions_framework_ruby/</guid><pubDate>Thu, 25 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;環境&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ruby: 2.7.1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Gemfile&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;source &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://rubygems.org&quot;&lt;/span&gt;&lt;/span&gt;

gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;functions_framework&quot;&lt;/span&gt;&lt;/span&gt;
gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;activesupport&quot;&lt;/span&gt;&lt;/span&gt;
gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;awesome_print&quot;&lt;/span&gt;&lt;/span&gt;
gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sinatra&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;app.rb&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;functions_framework&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;active_support/all&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sinatra/base&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;json&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Router&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; Sinatra&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Base

  before &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;zone&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;present&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;
      &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zone &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;zone&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

  get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    content_type &lt;span class=&quot;token symbol&quot;&gt;:json&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;slash&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

  get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/yesterday&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    content_type &lt;span class=&quot;token symbol&quot;&gt;:json&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token symbol&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token symbol&quot;&gt;ymd&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y%m%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y%m%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token symbol&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%dT00:00:00&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%dT23:59:59&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

  get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/last_week&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    content_type &lt;span class=&quot;token symbol&quot;&gt;:json&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token symbol&quot;&gt;recent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.&lt;/span&gt;week&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ago&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.&lt;/span&gt;week&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ago&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%dT00:00:00&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yesterday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%dT23:59:59&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

  get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/this_month&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    content_type &lt;span class=&quot;token symbol&quot;&gt;:json&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token symbol&quot;&gt;last_month_in_first_day&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ago&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1.&lt;/span&gt;day&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;beginning_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ago&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1.&lt;/span&gt;day&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;end_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;beginning_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d 00:00:00&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;end_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d 23:59:59&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token symbol&quot;&gt;this_month_in_first_day&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;beginning_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;end_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token symbol&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;beginning_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d 00:00:00&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;end_of_month&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d 23:59:59&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;


  not_found &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Not Found.&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

FunctionsFramework&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;http&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;datetime&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;request&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  Router&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;call&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sinatraを入れて簡単なサーバを立ち上げられるようにした&lt;/p&gt;
&lt;h2&gt;ローカルでサーバを起動する&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ bundle &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; functions-framework-ruby &lt;span class=&quot;token parameter variable&quot;&gt;--target&lt;/span&gt; datetime
I, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-03-25T14:23:00.382244 &lt;span class=&quot;token comment&quot;&gt;#28918]  INFO -- : FunctionsFramework v0.9.0&lt;/span&gt;
I, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-03-25T14:23:00.383176 &lt;span class=&quot;token comment&quot;&gt;#28918]  INFO -- : FunctionsFramework: Loading functions from &quot;./app.rb&quot;...&lt;/span&gt;
I, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-03-25T14:23:01.533809 &lt;span class=&quot;token comment&quot;&gt;#28918]  INFO -- : FunctionsFramework: Looking for function name &quot;datetime&quot;...&lt;/span&gt;
I, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-03-25T14:23:01.534009 &lt;span class=&quot;token comment&quot;&gt;#28918]  INFO -- : FunctionsFramework: Starting server...&lt;/span&gt;
I, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-03-25T14:23:01.643239 &lt;span class=&quot;token comment&quot;&gt;#28918]  INFO -- : FunctionsFramework: Serving function &quot;datetime&quot; on port 8080...&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;たたいてみる&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;http://localhost:8080/yesterday?zone=Asia%2FTokyo&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;ymd&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;20210324&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;20210324&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;time&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24T00:00:00&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24T23:59:59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;返ってきた&lt;/p&gt;
&lt;h2&gt;deployする&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gcloud functions deploy datetime \
    --project=sample-project \
    --runtime=ruby27 \
    --trigger-http \
    --entry-point=datetime&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;確認&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; GET &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Authorization: Bearer &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;gcloud auth print-identity-token&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://us-central1-sample-project.cloudfunctions.net/datetime/yesterday?zone=Asia%2FTokyo&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;ymd&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;20210324&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;20210324&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;time&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24T00:00:00&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2021-03-24T23:59:59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OIDC認証もバッチリ&lt;/p&gt;
&lt;h2&gt;ドキュメント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://googlecloudplatform.github.io/functions-framework-ruby/v0.9.0/file.deploying-functions.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;File: Deploying Functions — Functions&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[はてなブログにSentryを入れてみる]]></title><description><![CDATA[これで一発OKだった Lazy-Loading Sentry for JavaScript | Sentry Documentation CDN…]]></description><link>https://til.swfz.io/entries/snetyr_for_hatenablog/</link><guid isPermaLink="false">https://til.swfz.io/entries/snetyr_for_hatenablog/</guid><pubDate>Sat, 20 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;これで一発OKだった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.sentry.io/platforms/javascript/install/lazy-load-sentry/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Lazy-Loading Sentry for JavaScript | Sentry Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CDNへのリンクを&lt;code class=&quot;language-text&quot;&gt;カスタマイズ&lt;/code&gt;から&lt;code class=&quot;language-text&quot;&gt;フッター&lt;/code&gt;でタグなどを入力できる箇所で入力するだけ&lt;/p&gt;
&lt;p&gt;しばらく放置してたらイベントが発生した&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f37ad3b33ca125cd4d245062341f7a74/8c381/sentry_for_hatenablog01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 98.64864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADMElEQVR42o1U2W4jNxCcr89PBHlJkC9Y5N0IghxPwTpGAMeWLY2sOTQnh+SQc1aqObalLILdJVBoHs1is69oHB2cfUFvXYB3A67HOExYlgWu9+Hc9Zue7L2NdV3Cel1XRNb2aNoKXWep6GGpPPgxEHvKaZwwTwvlHMjlTDByf5rmgHneCJeFhOfDCX/d/I7T/T9I4xPifYL4WeQJh6cjiryCajvUVYuqaMJDF2KZz2iLW+TJEWlSIhoMLSSRVwpd26IsarRNh07pQJRnBZq6JRQ0fyFkYu0FCwan6DYLaxwirS0a1cEIcaWgSGY570hmlIUhSddqWErfD7C6J1zY18oEEqs9132wOqqKDlnS0ncj2pZEnYemguJc1kYPtMwR9K/xgXQQ/zJIQixrR9/3ZvN9JN97OZVIC4u8tMgoy4YkbkXXr+iHDTK3/iqyhARhDtgivDA40UrfTfTd1DZBjs0m505hVlyH/Qar0aCJWLVAv4JzY0B/UVdRVyGakwRqf0D99IxW5O4Z1e4J5eMuyC6OoeMjpvMZa1X+L1CXGPMMLssQgRY1hxjV8x49N/o0hT6dUO9jmCTFKtaK1XX1Wcx1HUDCGkosKPkSLwtGzh0tkq8PVfXVGMtqs1AdjnBphpUvLDzwJOtopaY7giQMz925wCjnRRkwlK9Er4QTEcmXFpIuDa1jEGQdvlk3G5oLRGehDhM0YGXg1lZtdxgU0Ykk1KPzzC0f8iuAObbMM1aevUOaAZuA7yckR430aJjwknu8NwyBY2blRDOLOz9XyLIS57xEcS6RpWd6gv4bxkvOrVv+5VmPH797wA/fPuDvO357YNKzwmy/daBI9IY8gXnZI80qvp6G+j1RCnGe5Uwzc5XOK676Ftw0orvbwX98BP9EC7lvs5QOz3hRanUrcqlna2xoX9M0vbenN4xsadK2NJNb4B9eMLH1Rf+ppS+Ma8LNwPWTc375l+MdPtz/Cl13SJKcjXPzm/Y97m5+gkp2rPUznHPvRPL6N/cDbo5sLKwu54cL4Z/ZI36Ob8PGW5EHwnHAbw9/YDQ5tJH234fu/Da+j0fclh6T1PHrQ0L4L5G8Aiq3Xvk4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f37ad3b33ca125cd4d245062341f7a74/cbe2e/sentry_for_hatenablog01.webp 148w,
/static/f37ad3b33ca125cd4d245062341f7a74/3084c/sentry_for_hatenablog01.webp 295w,
/static/f37ad3b33ca125cd4d245062341f7a74/5ca24/sentry_for_hatenablog01.webp 590w,
/static/f37ad3b33ca125cd4d245062341f7a74/dad35/sentry_for_hatenablog01.webp 885w,
/static/f37ad3b33ca125cd4d245062341f7a74/2baf0/sentry_for_hatenablog01.webp 1180w,
/static/f37ad3b33ca125cd4d245062341f7a74/6094c/sentry_for_hatenablog01.webp 1267w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f37ad3b33ca125cd4d245062341f7a74/12f09/sentry_for_hatenablog01.png 148w,
/static/f37ad3b33ca125cd4d245062341f7a74/e4a3f/sentry_for_hatenablog01.png 295w,
/static/f37ad3b33ca125cd4d245062341f7a74/fcda8/sentry_for_hatenablog01.png 590w,
/static/f37ad3b33ca125cd4d245062341f7a74/efc66/sentry_for_hatenablog01.png 885w,
/static/f37ad3b33ca125cd4d245062341f7a74/c83ae/sentry_for_hatenablog01.png 1180w,
/static/f37ad3b33ca125cd4d245062341f7a74/8c381/sentry_for_hatenablog01.png 1267w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f37ad3b33ca125cd4d245062341f7a74/fcda8/sentry_for_hatenablog01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;まぁだからといって何ができるというわけではないのだが…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GoogleColabでjsonのデータをプロットする]]></title><description><![CDATA[整形済みデータは次のようなフォーマット sample_data/sorted_array.json JSONファイルのアップロード GUIで行う ファイルをやりとりするには事前にしておく必要がある  実行 コードは次のような感じ それっぽくなった  colab…]]></description><link>https://til.swfz.io/entries/colab_plot_from_json/</link><guid isPermaLink="false">https://til.swfz.io/entries/colab_plot_from_json/</guid><pubDate>Wed, 17 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;整形済みデータは次のようなフォーマット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sample_data/sorted_array.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;2021-02-01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;169&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;2021-02-02&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;746&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;2021-02-03&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;1267&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;2021-02-04&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;632&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;2021-02-05&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;401&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;2021-02-06&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;288&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;JSONファイルのアップロード&lt;/h2&gt;
&lt;p&gt;GUIで行う&lt;/p&gt;
&lt;p&gt;ファイルをやりとりするには事前に&lt;code class=&quot;language-text&quot;&gt;接続&lt;/code&gt;しておく必要がある&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9c7048438647dbe824e19347a4a9adb9/7388e/colab_plot_from_json01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 83.1081081081081%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACbUlEQVR42pVUaU/iUBR9fwQSnclMxjEsDSC00JYubAFhEFGMUaJsYflKAvz4M+9cLcHqfJgPh94+7jv33K1q0rvEsJZGuR7gT7+HwWCAXq+H6+treJ4Hy7JQKBRwdXX1AUWNQuyMfmrevcBDmELFC9BqNtHpdHB/f49Ou4N6vY5arYZyuQLf91CtVrVdhuM4MHWg6L1SqcDVNv2VkTeRK5goawfTNDUsOLatHS1xJnhu6zPXdcUmEW3HsREEvhDxjFA8YMTIKZfLwTCMD2nSJjFLQPstsBaSy2t1Nmx9P5/Pw8gaUKxREASSarvdRqPRwOPjoxAUi8VPYMDz83ONM1z8/onLH9/x69sZkskkEokEFPNnOqwVn5HNy1RzikhtOp0WRaVSEdlMGkYmg1QqJVCU3mq1sFwuhYypswQReRxRIArxtK90/CQD5erCjkYPOBwOWK1WWCwWmM/nGA6H6Pf7uLm5EXCcwjDUqky5SIXZbEbqfQo18POoNVqabCmk4/FYCPkkYbfblbkkqe+/NZDEnlcVlXEoz7bQ1ClvNhvsdjs8PT3h9fUVLy8vYrNBo9FICMMgPJKSUOZRl4yNjaAs3c3WO+F+vxdlk8lECGezGabTqdi3t7cyNqGeCBIFfgBbK4pvkSq/E67X62PKEQmV3d3dCVhDEpKMWxHotNnA+FgdCdnl7XYrKZLs+flZwDVkHVlPDj473WjU0dRryg35RMifUql03MnTmvDMOq6kKX6u48oicAlYT96P/idUxBz/mhy/KifReYFpk5BqGTA+p+qr9foXGOCU7Csh/0XIjkqa+iJ3Or6a/B7+BT65WXwpj7CEAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/9c7048438647dbe824e19347a4a9adb9/cbe2e/colab_plot_from_json01.webp 148w,
/static/9c7048438647dbe824e19347a4a9adb9/3084c/colab_plot_from_json01.webp 295w,
/static/9c7048438647dbe824e19347a4a9adb9/5ca24/colab_plot_from_json01.webp 590w,
/static/9c7048438647dbe824e19347a4a9adb9/dad35/colab_plot_from_json01.webp 885w,
/static/9c7048438647dbe824e19347a4a9adb9/ff749/colab_plot_from_json01.webp 1104w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/9c7048438647dbe824e19347a4a9adb9/12f09/colab_plot_from_json01.png 148w,
/static/9c7048438647dbe824e19347a4a9adb9/e4a3f/colab_plot_from_json01.png 295w,
/static/9c7048438647dbe824e19347a4a9adb9/fcda8/colab_plot_from_json01.png 590w,
/static/9c7048438647dbe824e19347a4a9adb9/efc66/colab_plot_from_json01.png 885w,
/static/9c7048438647dbe824e19347a4a9adb9/7388e/colab_plot_from_json01.png 1104w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/9c7048438647dbe824e19347a4a9adb9/fcda8/colab_plot_from_json01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;コードは次のような感じ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; matplotlib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pyplot &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; plt
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; json
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; pandas &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pd

df &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sample_data/sorted_array.json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
df&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_index&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; inplace&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

ax &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; df&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;plot&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;kind&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;bar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; title&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Error Count By Date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; figsize&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#00AAAA&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
ax&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_xlabel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
ax&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_ylabel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Count&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
ax&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;legend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Errors&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;それっぽくなった&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1b75229dd210eba32e5d5afa7f4b662a/e9d87/colab_plot_from_json02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.891891891891895%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABkklEQVR42oWQzUrDQBDH17OfFy9ePOrBhxJfwqMPIYIo6k0QRDERD4rGqlWsQm1LTWsLJbTdQkzUNk2aj52ss5tUSi8O/LKTmdmZ/yzJZrOLQRBcMcZuwzC8QTRBgMSMaZbn3eiWdT9wnEd3MLgb5kcBxq4d33+ktr1HdF1fwmYhTyzmYw71fZ7/+ZE+xH/pcQPxwT5FUigUlgBgkPaI4jhmArzMRA31PJb/+pI+pLlxsJsUhErzRNO0lQggSGf/acBC3meMG67L89/fMoZ1PP5PYa9SWW72+/57rydjItmPImi5LlS7XbigFDKmKS7As21DiOukDSSQnJEcGEVvhLfby+edTrhPqRRW9zz+gm9WREqOw7cMgz/YNm/hW550OtwMAimpixu46T6QDEkUfhrGwmapdLqmaRcHlYqyXSyqh9Wq8kSpsl0uq6uZjHpUrys75bKy8fqqHNdq6nmjoa7ncuqurqs1y1K0ZvMs22pdfpjmJkGbQKZnCZnDc2aekCkBSZhJEf70SGxu5H+YE7HJXwhAAx36wPk1AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1b75229dd210eba32e5d5afa7f4b662a/cbe2e/colab_plot_from_json02.webp 148w,
/static/1b75229dd210eba32e5d5afa7f4b662a/3084c/colab_plot_from_json02.webp 295w,
/static/1b75229dd210eba32e5d5afa7f4b662a/5ca24/colab_plot_from_json02.webp 590w,
/static/1b75229dd210eba32e5d5afa7f4b662a/dad35/colab_plot_from_json02.webp 885w,
/static/1b75229dd210eba32e5d5afa7f4b662a/c9586/colab_plot_from_json02.webp 1176w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1b75229dd210eba32e5d5afa7f4b662a/12f09/colab_plot_from_json02.png 148w,
/static/1b75229dd210eba32e5d5afa7f4b662a/e4a3f/colab_plot_from_json02.png 295w,
/static/1b75229dd210eba32e5d5afa7f4b662a/fcda8/colab_plot_from_json02.png 590w,
/static/1b75229dd210eba32e5d5afa7f4b662a/efc66/colab_plot_from_json02.png 885w,
/static/1b75229dd210eba32e5d5afa7f4b662a/e9d87/colab_plot_from_json02.png 1176w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1b75229dd210eba32e5d5afa7f4b662a/fcda8/colab_plot_from_json02.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;!-- textlint-disable prh --&gt;
&lt;p&gt;colab初めて触ったけどjupyter notebookがブラウザから簡単に使えるのかなり良い&lt;/p&gt;
&lt;!-- textlint-enable prh --&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Ctrl+Enterで実行&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;Shift+Enterで次のコードへ遷移&lt;/code&gt;などjupyter notebookと同じ使い心地&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;あまりさわれる機会が多くないがしばらく使ってみようと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[Kindle for PC(Windows)のショートカットを無効にする]]></title><description><![CDATA[Kindle for PCのショートカットキー デフォルトだとでKindleが起動する ショートカットキーを無効にするためにはショートカットのアイコンのプロパティから欄を消すことで行える 自分はデスクトップにショートカットを置くようにしたのでそこだけ消せばOK…]]></description><link>https://til.swfz.io/entries/kindle_deny_shortcut/</link><guid isPermaLink="false">https://til.swfz.io/entries/kindle_deny_shortcut/</guid><pubDate>Fri, 05 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Kindle for PCのショートカットキー&lt;/h2&gt;
&lt;p&gt;デフォルトだと&lt;code class=&quot;language-text&quot;&gt;Ctrl+Alt+k&lt;/code&gt;でKindleが起動する&lt;/p&gt;
&lt;p&gt;ショートカットキーを無効にするためにはショートカットのアイコンのプロパティから&lt;code class=&quot;language-text&quot;&gt;ショートカット&lt;/code&gt;欄を消すことで行える&lt;/p&gt;
&lt;p&gt;自分はデスクトップにショートカットを置くようにしたのでそこだけ消せばOKだと思っていた&lt;/p&gt;
&lt;p&gt;しかし、消してもまだ治らず&lt;/p&gt;
&lt;p&gt;ディスク内で検索したら&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;C:\Users\hoge\Desktop
C:\Users\hoge\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Amazon\Amazon Kindle&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2つ存在した!!!&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Start Menu&lt;/code&gt;にも配置される模様…&lt;/p&gt;
&lt;p&gt;両方解除することでショートカットが発動しないようになる&lt;/p&gt;
&lt;p&gt;これに気付かずアプリケーションのアップデートのタイミングでショートカットが更新されてしまい毎度探すということをやっていたのでメモとして残しておく&lt;/p&gt;</content:encoded></item><item><title><![CDATA[MySQLのgenerallogから特定のSQLを抜き出す]]></title><description><![CDATA[AWSで稼働しているRDSからgeneral logを取ってきてそのクエリログから特定のクエリを抽出してExplain…]]></description><link>https://til.swfz.io/entries/filter_by_explain_result/</link><guid isPermaLink="false">https://til.swfz.io/entries/filter_by_explain_result/</guid><pubDate>Fri, 26 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AWSで稼働しているRDSからgeneral logを取ってきてそのクエリログから特定のクエリを抽出してExplainの結果を判定するということをやったのでそのときやったことをメモしておく&lt;/p&gt;
&lt;p&gt;単発だったのでいくつか簡単なスクリプトを書いて対応したがしくみ化するならいろいろおもしろいかも&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;p&gt;ローカルからのフォワーディングや本番サーバなどから実行するなど本番のDBに接続できる必要がある&lt;/p&gt;
&lt;p&gt;general logをファイルに出力する設定をしておく必要がある&lt;/p&gt;
&lt;h2&gt;やること&lt;/h2&gt;
&lt;h3&gt;general logの取得&lt;/h3&gt;
&lt;p&gt;APIのドキュメントは下記&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Accessing Amazon RDS database log files - Amazon Relational Database Service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;直近24時間分のログが取れる&lt;/p&gt;
&lt;p&gt;数値はUTC時刻の範囲で出力されるっぽいので&lt;code class=&quot;language-text&quot;&gt;general/mysql-general.log.0&lt;/code&gt;はJSTでは&lt;code class=&quot;language-text&quot;&gt;09:00&lt;/code&gt;台の内容&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.0  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.1  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.2  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.3  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.4  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.5  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.6  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.7  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.8  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.9  &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.10 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.11 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.12 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.13 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.14 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.15 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.16 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.17 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.18 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.19 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.20 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.21 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.22 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;.log
aws rds download-db-log-file-portion --db-instance-identifier hoge-db --starting-token &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--output&lt;/span&gt; text --log-file-name general/mysql-general.log.23 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;.log&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;クエリのフォーマット、フィルタリング&lt;/h3&gt;
&lt;p&gt;general logの形式が次のような感じなのでクエリ部分を抜き出す必要がある&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Time                 Id Command    Argument
                946458 Query    SELECT hoge FROM fuga....&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/httpdss/948386&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Mysql general log parser&lt;/a&gt;&lt;/p&gt;
&lt;!-- textlint-disable prh,spellcheck-tech-word --&gt;
&lt;p&gt;からパーススクリプトを持ってきて配置し（mysql-general-log-parser.pl）次のようなシェルを書いた&lt;/p&gt;
&lt;!-- textlint-enable prh,spellcheck-tech-word  --&gt;
&lt;ul&gt;
&lt;li&gt;filter_general_log.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;

perl mysql-general-log-parser.pl &lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Your log message was truncated&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rds_heartbeat2&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rds_configuration&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;mysql-connector-java&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;EXPLAIN &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;uniq&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;.query_list.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0,1&lt;/span&gt;,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;.log &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $9}&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; ./filter_general_log.sh &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;生成したファイルをマージする&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cat *.query_list.txt &gt; query_list.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;特定クエリの抽出&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;GROUP BY&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;DISTINCT&lt;/code&gt;を使用しているクエリを拾う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;filter_group_by_query.py&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-python line-numbers&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sqlparse
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys

filepath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

f &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filepath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
lines &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;readlines&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;close&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; line &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    parsed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sqlparse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    tokens &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parsed&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;flatten&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    is_grouped &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sqlparse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tokens&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Keyword&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GROUP\s+BY&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; regex&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tokens&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    is_distinct &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sqlparse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tokens&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;DISTINCT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tokens&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;is_grouped&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;is_distinct &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; sqlparse
python filter_group_by_query.py query_list.txt &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; group_by_query.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;チェック&lt;/h3&gt;
&lt;p&gt;explainの結果に&lt;code class=&quot;language-text&quot;&gt;Using index for group-by&lt;/code&gt;が含まれるものを抜き出す&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;check_group_by_query.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;cnt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; line
&lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;cnt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;expr&lt;/span&gt; $cnt + &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$cnt&lt;/span&gt;
  mysql &lt;span class=&quot;token parameter variable&quot;&gt;-uhoge&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-P&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13306&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt; localhost &lt;span class=&quot;token parameter variable&quot;&gt;-ppass&lt;/span&gt; dbname &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;EXPLAIN &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Using index for group-by&apos;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Found Query&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; result.txt
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sh check_group_by_query.sh group_by_query.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;という感じでいくつかのクエリを探すようなことをした&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WSL2に移行した]]></title><description><![CDATA[下記参考にWSL→WSL2へ移行した際の記録 Windows Subsystem for Linux (WSL) を Windows 10 にインストールする | Microsoft Docs 上記を参考に各種設定を行い次のコマンドを打ったが何も変わらず… BIOS…]]></description><link>https://til.swfz.io/entries/wsl2_installed/</link><guid isPermaLink="false">https://til.swfz.io/entries/wsl2_installed/</guid><pubDate>Wed, 17 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下記参考にWSL→WSL2へ移行した際の記録&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/ja-jp/windows/wsl/install-win10&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Windows Subsystem for Linux (WSL) を Windows 10 にインストールする | Microsoft Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上記を参考に各種設定を行い次のコマンドを打ったが何も変わらず…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ wsl --set-version Ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
Windows の仮想マシン プラットフォーム機能を有効にして、BIOS で仮想化が有効になっていることを確認してください。
詳細については、https://aka.ms/wsl2-install を参照してください&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu                 Running         1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;BIOSでの確認もしてみたが仮想化機能も有効になっていそう…&lt;/p&gt;
&lt;p&gt;何度か一連の手順を踏んでみたが変わらず&lt;/p&gt;
&lt;p&gt;最終的にはDockerForWindowsを入れてそちらの方で「仮想化機能をEnableにする」ダイアログをクリックして再起動したらWSL2側も使えるようになった&lt;/p&gt;
&lt;!-- textlint-disable ja-hiragana-fukushi --&gt;
&lt;p&gt;というか仮想化機能自体が「Windowsの機能の有効化または無効化」の設定やPowershellのコマンドからだと正しくONにできなかったように見える&lt;/p&gt;
&lt;!-- textlint-enable ja-hiragana-fukushi --&gt;
&lt;p&gt;もしくはほかにも設定変更をするべき項目が存在したか…&lt;/p&gt;
&lt;p&gt;正直良くわからないが無事にWSL2+Dockerを使えるようになった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;docker-desktop&lt;/code&gt;も出力されるよう&lt;/p&gt;
&lt;p&gt;以前から使っていたVagrant+VirtualBox（v6.1.16）のVMも問題なく起動して動かせたので良き&lt;/p&gt;
&lt;p&gt;今までDockerを使うリポジトリは全部VMの中で開発していたがこれでWSL側でも開発できる&lt;/p&gt;</content:encoded></item><item><title><![CDATA[tfenvを使いTerraformのバージョンを切り替える]]></title><description><![CDATA[tfutils/tfenv: Terraform version manager Terraformのバージョンを切り替えて使用するためのツール インストール PATHへの追加 .bashrc 当たり前だが既存のパスより前にtfenvのパスが先にないと既存でterraform…]]></description><link>https://til.swfz.io/entries/tfenv/</link><guid isPermaLink="false">https://til.swfz.io/entries/tfenv/</guid><pubDate>Sat, 13 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/tfutils/tfenv&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;tfutils/tfenv: Terraform version manager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Terraformのバージョンを切り替えて使用するためのツール&lt;/p&gt;
&lt;h3&gt;インストール&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/tfutils/tfenv.git ~/.tfenv
$ &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; ~/.local/bin
$ &lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; ~/.tfenv/bin/* ~/.local/bin&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;PATHへの追加&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;.bashrc&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;export PATH=&quot;$HOME/.tfenv/bin:$PATH&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;当たり前だが既存のパスより前にtfenvのパスが先にないと既存でterraformを使っている場合そっちが先に見つかってしまうのでtfenvのパスを先にする&lt;/p&gt;
&lt;h3&gt;切り替え、使用&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ tfenv install 0.14.6
$ tfenv use 0.14.6
$ terraform --version
Terraform v0.14.6&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[CloudSQLへの接続方法]]></title><description><![CDATA[CloudShellからの接続 CloudShellから接続する場合は簡単 該当プロジェクトでcloud shellを起動しで接続するだけ  これだけでOK ローカルからの接続 cloud_sql_proxyを使ってforwardingする Cloud SQL Proxy…]]></description><link>https://til.swfz.io/entries/cloud_sql_proxy/</link><guid isPermaLink="false">https://til.swfz.io/entries/cloud_sql_proxy/</guid><pubDate>Mon, 08 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;CloudShellからの接続&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CloudShellから接続する場合は簡単&lt;/li&gt;
&lt;li&gt;該当プロジェクトでcloud shellを起動し&lt;code class=&quot;language-text&quot;&gt;gcloud sql connect&lt;/code&gt;で接続するだけ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gcloud sql connect mysql-instance --user=root
Allowlisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 351117
Server version: 5.7.25-google-log (Google)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type &apos;help;&apos; or &apos;\h&apos; for help. Type &apos;\c&apos; to clear the current input statement.
mysql&gt; show databases;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gcloud sql connect ${instance name} --user=root&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;これだけでOK&lt;/p&gt;
&lt;h2&gt;ローカルからの接続&lt;/h2&gt;
&lt;p&gt;cloud_sql_proxyを使ってforwardingする&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja#install&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cloud SQL Proxy について  |  Cloud SQL for MySQL  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;インストール&lt;/h3&gt;
&lt;p&gt;Linux64ビットにしたがってやっていく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-LO&lt;/span&gt; https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
$ &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x ./cloud_sql_proxy
$ &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; ./cloud_sql_proxy /usr/local/bin/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;実行&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ cloud_sql_proxy &lt;span class=&quot;token parameter variable&quot;&gt;-instances&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sample-project:us-west1:mysql-instance&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;tcp:13306&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;フォーマット&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;-instances=${project name}:${region}:${instance name}=tcp:${forward port}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ローカルの&lt;code class=&quot;language-text&quot;&gt;13306&lt;/code&gt;ポートで接続できるようにした&lt;/p&gt;
&lt;h3&gt;接続&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mysql -uroot -h 127.0.0.1  -P 13306 -p&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これだけでOK&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gcloudコマンド自体のタイムアウト設定]]></title><description><![CDATA[cloud functionsでタイムアウトを最大の540秒に設定していたがで手動実行していたら次のようなエラーが出た gcloudのコマンド自体（APIコール）のタイムアウトはを設定すればよさそう デフォルトだと30…]]></description><link>https://til.swfz.io/entries/gcloud_http_timeout/</link><guid isPermaLink="false">https://til.swfz.io/entries/gcloud_http_timeout/</guid><pubDate>Fri, 05 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;cloud functionsでタイムアウトを最大の540秒に設定していたが&lt;code class=&quot;language-text&quot;&gt;gcloud functions call&lt;/code&gt;で手動実行していたら次のようなエラーが出た&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR: (gcloud.functions.call) (&apos;The read operation timed out&apos;,)
This may be due to network connectivity issues. Please check your network settings, and the status of the service you are trying to reach.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;gcloudのコマンド自体（APIコール）のタイムアウトは&lt;code class=&quot;language-text&quot;&gt;--http-timeout&lt;/code&gt;を設定すればよさそう&lt;/p&gt;
&lt;p&gt;デフォルトだと300秒だった（気がする）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;gcloud functions call sample_function --http-timeout &lt;span class=&quot;token number&quot;&gt;540&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;でよい&lt;/p&gt;
&lt;p&gt;ドキュメントを見つけられなかったが…とりあえずこれでOKそう&lt;/p&gt;</content:encoded></item><item><title><![CDATA[VagrantのVMが立ち上がらなくなってしまったときの対処方いくつか]]></title><description><![CDATA[ホスト機がフリーズしてしまったとかVMを正常に終了させられないまま再起動してしまったときなど ごくたまにVagrantで使っているVMが起動しなくなる いくつか試してみたのでその記録 本記事ではというVM名で進める lock…]]></description><link>https://til.swfz.io/entries/vagrant_boot_failed/</link><guid isPermaLink="false">https://til.swfz.io/entries/vagrant_boot_failed/</guid><pubDate>Tue, 26 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ホスト機がフリーズしてしまったとかVMを正常に終了させられないまま再起動してしまったときなど&lt;/p&gt;
&lt;p&gt;ごくたまにVagrantで使っているVMが起動しなくなる&lt;/p&gt;
&lt;p&gt;いくつか試してみたのでその記録&lt;/p&gt;
&lt;p&gt;本記事では&lt;code class=&quot;language-text&quot;&gt;dev4&lt;/code&gt;というVM名で進める&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ vagrant up
Bringing machine &lt;span class=&quot;token string&quot;&gt;&apos;default&apos;&lt;/span&gt; up with &lt;span class=&quot;token string&quot;&gt;&apos;virtualbox&apos;&lt;/span&gt; provider&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; default: Checking &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; box &lt;span class=&quot;token string&quot;&gt;&apos;bento/centos-7.4&apos;&lt;/span&gt; version &lt;span class=&quot;token string&quot;&gt;&apos;201803.24.0&apos;&lt;/span&gt; is up to date&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; default: Clearing any previously &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; forwarded ports&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
There was an error &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; executing &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;VBoxManage&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;, a CLI used by Vagrant
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; controlling VirtualBox. The &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; and stderr is shown below.

Command: &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;modifyvm&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;d4c26ea5-e507-4049-878a-2c89a841f9e6&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;--natpf1&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;delete&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1tcp22396&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;--natpf1&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;delete&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1tcp9200&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;--natpf1&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;delete&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1tcp9300&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;--natpf1&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;delete&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;ssh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

Stderr: VBoxManage.exe: error: The machine &lt;span class=&quot;token string&quot;&gt;&apos;dev4&apos;&lt;/span&gt; is already locked &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; a session &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;or being unlocked&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
VBoxManage.exe: error: Details: code VBOX_E_INVALID_OBJECT_STATE &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x80bb0007&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, component MachineWrap, interface IMachine, callee IUnknown
VBoxManage.exe: error: Context: &lt;span class=&quot;token string&quot;&gt;&quot;LockMachine(a-&gt;session, LockType_Write)&quot;&lt;/span&gt; at line &lt;span class=&quot;token number&quot;&gt;554&lt;/span&gt; of &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; VBoxManageModifyVM.cpp&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;lockされてます&lt;/p&gt;
&lt;p&gt;いくつか調べたら&lt;code class=&quot;language-text&quot;&gt;poweroff&lt;/code&gt;にすればよいとあったので実行してみる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /c/Program&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt; Files/Oracle/VirtualBox
$ ./VBoxManage.exe controlvm dev4 poweroff
VBoxManage.exe: error: The virtual machine is being powered down
VBoxManage.exe: error: Details: code VBOX_E_INVALID_VM_STATE &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x80bb0002&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, component ConsoleWrap, interface IConsole, callee IUnknown
VBoxManage.exe: error: Context: &lt;span class=&quot;token string&quot;&gt;&quot;PowerDown(progress.asOutParam())&quot;&lt;/span&gt; at line &lt;span class=&quot;token number&quot;&gt;619&lt;/span&gt; of &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; VBoxManageControlVM.cpp&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もう止まっているよということのよう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ vagrant status
Current machine states:

default                   stopping (virtualbox)

The VM is stopping.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/Ikumi/items/557808a232a0c12d3027&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;VirtualBoxで仮想コンピュータが反応しなくなった時( = _ = )&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;を参考に強制的に落とす&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt; ./VBoxManage.exe startvm dev4 &lt;span class=&quot;token parameter variable&quot;&gt;--type&lt;/span&gt; emergencystop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;abortedになった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ vagrant status
Current machine states:

default                   aborted &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;virtualbox&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

The VM is &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; an aborted state. This means that it was abruptly
stopped without properly closing the session. Run &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;vagrant up&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
to resume this virtual machine. If any problems persist, you may
have to destroy and restart the virtual machine.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ここから&lt;code class=&quot;language-text&quot;&gt;vagrant up&lt;/code&gt;して無事立ち上げることができた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ vagrant up
.....
.....
.....
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured (&quot;config.vm.boot_timeout&quot; value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you&apos;re using a custom box, make sure that networking is properly
working and you&apos;re able to connect to the machine. It is a common
problem that networking isn&apos;t setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout (&quot;config.vm.boot_timeout&quot;) value.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;が、立ち上がったは良いがsshできないという感じになってしまった&lt;/p&gt;
&lt;p&gt;VirtualBoxからものぞいてみようと試みたがVMが完全に立ち上がらない状態で操作できず&lt;/p&gt;
&lt;p&gt;結局ホストのWindowsを完全シャットダウン（shift+シャットダウン）&amp;#x26;起動してVM起動したら動くようになっていた&lt;/p&gt;
&lt;p&gt;ただの徒労…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gcloud buildsでログが見れない時]]></title><description><![CDATA[CloudRunでCDやろうと思ったらつまずいた サービスアカウントにコンテナのイメージをビルドさせたいときの話 サービスアカウントにはは付いているのに… ビルド結果の表示  |  Cloud Build のドキュメント  |  Google Cloud…]]></description><link>https://til.swfz.io/entries/gcloud_project_iam/</link><guid isPermaLink="false">https://til.swfz.io/entries/gcloud_project_iam/</guid><pubDate>Mon, 25 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CloudRunでCDやろうと思ったらつまずいた&lt;/p&gt;
&lt;p&gt;サービスアカウントにコンテナのイメージをビルドさせたいときの話&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gcloud builds submit --tag gcr.io/${project-id}/${name}
Check the gcloud log [/home/circleci/.config/gcloud/logs/2020.12.10/18.23.37.852071.log] to see which files and the contents of the default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn                                                                           more).
.....
.....
.....
ERROR: (gcloud.builds.submit) HTTPError 403: &amp;lt;?xml version=&apos;1.0&apos; encoding=&apos;UTF-8&apos;?&gt;&amp;lt;Error&gt;&amp;lt;Code&gt;AccessDenied&amp;lt;/Code&gt;&amp;lt;Message&gt;Access denied.&amp;lt;/Message&gt;&amp;lt;Details&gt;name-run-invoker@project-id.iam.gserviceaccount.com does not have storage.objects.get access to the Google Cloud Storage object.&amp;lt;/Details&gt;&amp;lt;/Error&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;サービスアカウントには&lt;code class=&quot;language-text&quot;&gt;storage.objects.get&lt;/code&gt;は付いているのに…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/cloud-build/docs/view-build-results#gcloud&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ビルド結果の表示  |  Cloud Build のドキュメント  |  Google Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;特にログのバケットを指定してないため、ログを表示するにはプロジェクト＞閲覧者の権限も必要なよう&lt;/p&gt;
&lt;p&gt;いわゆる&lt;code class=&quot;language-text&quot;&gt;roles/viewer&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;projectの閲覧者権限の追加&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/rodotan/items/9a97dbffd8cd0bbd3ae9&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;個人的によく使うgcloudコマンドまとめ ~ IAM・サービスアカウント関連 ~&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;gcloud projects add-iam-policy-binding &lt;span class=&quot;token variable&quot;&gt;${project-id}&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--member&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;serviceAccount:&lt;span class=&quot;token variable&quot;&gt;${name}&lt;/span&gt;-run-invoker@&lt;span class=&quot;token variable&quot;&gt;${project-id}&lt;/span&gt;.iam.gserviceaccount.com &lt;span class=&quot;token parameter variable&quot;&gt;--role&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;roles/viewer&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで解決した&lt;/p&gt;
&lt;p&gt;なんとなくプロジェクトにまつわる権限の話がわかってきた気がするがはっきり説明できるほどにはなっていない…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rubyで進捗表示のスクリプトを書くとき]]></title><description><![CDATA[書き捨てスクリプトなどで進捗を表示させたいときなどを末尾に付けることで再描画できるので進捗が進んでいるような見え方をさせられる alt]]></description><link>https://til.swfz.io/entries/ruby_progress_bar/ruby_progress_bar/</link><guid isPermaLink="false">https://til.swfz.io/entries/ruby_progress_bar/ruby_progress_bar/</guid><pubDate>Sat, 23 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1.&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; print &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; n&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;-&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;% \r&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; sleep &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;書き捨てスクリプトなどで進捗を表示させたいときなど&lt;code class=&quot;language-text&quot;&gt;\r&lt;/code&gt;を末尾に付けることで再描画できるので進捗が進んでいるような見え方をさせられる&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/3b7051ac24ba3ee2ee788c426fb961bf/ruby_progress_bar01.gif&quot; alt=&quot;alt&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[MySQLでgzipをそのまま流し込む]]></title><description><![CDATA[dump 一時的にファイルを生成せず圧縮したファイルを生成する リストア gzファイルから直接MySQLに流し込む]]></description><link>https://til.swfz.io/entries/mysql_direct_gz/</link><guid isPermaLink="false">https://til.swfz.io/entries/mysql_direct_gz/</guid><pubDate>Fri, 22 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;dump&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一時的にファイルを生成せず圧縮したファイルを生成する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;mysqldump &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; user &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; password dbname &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gzip&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; dump.gz &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;リストア&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;gzファイルから直接MySQLに流し込む&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;zcat dump.gz &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; mysql &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; user &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; password dbname &lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Ansibleでsystemdの設定を一部変更して反映させる]]></title><description><![CDATA[AnsibleでCloudWatchAgentのデーモンを起動する処理を書いていてsystemdの設定ファイルを少しだけいじりたいパターンがあったのでそのメモ なお今回はamazon-linux…]]></description><link>https://til.swfz.io/entries/ansible_systemd_daemon_reload/</link><guid isPermaLink="false">https://til.swfz.io/entries/ansible_systemd_daemon_reload/</guid><pubDate>Fri, 15 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AnsibleでCloudWatchAgentのデーモンを起動する処理を書いていてsystemdの設定ファイルを少しだけいじりたいパターンがあったのでそのメモ&lt;/p&gt;
&lt;p&gt;なお今回はamazon-linux2を想定している&lt;/p&gt;
&lt;p&gt;具体的には&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Restart=on-failure&lt;/code&gt; から &lt;code class=&quot;language-text&quot;&gt;Restart=always&lt;/code&gt;へ変更するだけ&lt;/p&gt;
&lt;p&gt;ファイルの中身を一部書き換えるのはAnsibleの&lt;code class=&quot;language-text&quot;&gt;lineinfile&lt;/code&gt;モジュールで行える&lt;/p&gt;
&lt;p&gt;config.json.j2は適当なテンプレートを用意する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tasks/main.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Install agent
  &lt;span class=&quot;token key atrule&quot;&gt;yum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudwatch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;agent
    &lt;span class=&quot;token key atrule&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; present

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; collectd exist
  &lt;span class=&quot;token key atrule&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /usr/share/collectd/types.db
  &lt;span class=&quot;token key atrule&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; collectd_exist

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; install collectd
  &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;linux&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;extras install &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;y collectd
  &lt;span class=&quot;token key atrule&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; not collectd_exist.stat.exists

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; systemd configuration restart always
  &lt;span class=&quot;token key atrule&quot;&gt;lineinfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /etc/systemd/system/amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudwatch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;agent.service
    &lt;span class=&quot;token key atrule&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;^Restart=&apos;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Restart=always&apos;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;notify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; systemd reload

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; set config file
  &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; config.json.j2
    &lt;span class=&quot;token key atrule&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /opt/aws/amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudwatch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;agent/bin/config.json
    &lt;span class=&quot;token key atrule&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0644&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;notify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Restart cloudwatch agent&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;handlers/main.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Restart cloudwatch agent
  &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /opt/aws/amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudwatch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;agent/bin/amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudwatch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;agent&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ctl &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;a fetch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;config &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;m ec2 &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;s &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;c file&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/opt/aws/amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudwatch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;agent/bin/config.json

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; systemd reload
  &lt;span class=&quot;token key atrule&quot;&gt;systemd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudwatch&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;agent
    &lt;span class=&quot;token key atrule&quot;&gt;daemon_reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yes&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;lineinefileで変更があればdaemon-reloadすることでsystemdの設定を読み込み直してくれる&lt;/p&gt;
&lt;p&gt;参考&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ansible.builtin.lineinfile – Manage lines in text files — Ansible Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://tekunabe.hatenablog.jp/entry/2019/02/24/ansible_lineinfile_intro&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;[Ansible] lineinfile モジュールの基本的な使い方（テキストファイルの行単位の編集） - てくなべ (tekunabe)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[はてなフォトライフのフォーマットについて]]></title><description><![CDATA[はてなフォトライフに上げた画像のはてなブログ上での表示について はてなブログの編集画面上でフォトライフに上げた画像は次のように変換されてエディタ領域に出力される 一方フォトライフAPI…]]></description><link>https://til.swfz.io/entries/hatenaphotolife_format/</link><guid isPermaLink="false">https://til.swfz.io/entries/hatenaphotolife_format/</guid><pubDate>Tue, 05 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;はてなフォトライフに上げた画像のはてなブログ上での表示について&lt;/p&gt;
&lt;p&gt;はてなブログの編集画面上でフォトライフに上げた画像は次のように変換されてエディタ領域に出力される&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[f:id:swfz:20201229025422p:plain]&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;一方フォトライフAPIに投げた場合同じ形式の値を探すと次のような値が返ってくる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;f:id:swfz:20201229025422p:image&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;コロン区切りで意味があるように見えるが最後の項目に違いがある&lt;/p&gt;
&lt;p&gt;特に意識していなかったがこの違いが記事上で画像クリック時の挙動に影響しているよう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;plain&lt;/code&gt;はクリックするとオーバーレイ表示されるのに対し、&lt;code class=&quot;language-text&quot;&gt;image&lt;/code&gt;ではフォトライフの該当画像へ遷移する仕様のよう&lt;/p&gt;
&lt;p&gt;なので投稿者以外の人が記事上の画像をクリックすると該当画像とは無関係の画像が表示されたフォトライフの画面へ遷移してしまう&lt;/p&gt;
&lt;p&gt;はてなブログのエディタはそんな気の効かせ方をしていたのね…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gemのメンテ時などで使用するコマンドの覚書]]></title><description><![CDATA[毎度忘れるので自分用のメモとして を例として上げておく swfz/hatenablog_publisher: hatenablog publish with imagefile CD…]]></description><link>https://til.swfz.io/entries/gem_maintenance/</link><guid isPermaLink="false">https://til.swfz.io/entries/gem_maintenance/</guid><pubDate>Mon, 04 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;毎度忘れるので自分用のメモとして&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hatenablog_publisher&lt;/code&gt;を例として上げておく&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/hatenablog_publisher&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;swfz/hatenablog_publisher: hatenablog publish with imagefile&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CDとかで自動化しているわけではないのでそのうち…&lt;/p&gt;
&lt;h2&gt;ローカルでの修正&lt;/h2&gt;
&lt;p&gt;適当なディレクトリにチェックアウトして使う側のGemfileを正&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;# gem &apos;hatenablog_publisher&apos;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;gem &apos;hatenablog_publisher&apos;, path: &apos;/home/vagrant/sandbox/hatenablog_publisher&apos;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;動作確認&lt;/h2&gt;
&lt;p&gt;デバッグしたりして動作確認する&lt;/p&gt;
&lt;h2&gt;リリース&lt;/h2&gt;
&lt;p&gt;version.rbを修正（パッチ、マイナーなど上げる）&lt;/p&gt;
&lt;p&gt;Gemfile.lockはbuildすると自動でバージョン変えてくれる&lt;/p&gt;
&lt;h3&gt;ありがちエラー&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;There are files that need to be committed first.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;未コミットがない状態だと実行できるのでstashなりcommitなりしておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rake build
rake release&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;前提&lt;/h3&gt;
&lt;p&gt;前提としてRubyGemsのcredentialsが&lt;code class=&quot;language-text&quot;&gt;~/.gem/credentials&lt;/code&gt;に必要&lt;/p&gt;
&lt;h2&gt;使う側で更新&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bundle update hatenablog_publisher&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bundle update --source hatenablog_publisher&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;2022-05-07追記&lt;/h3&gt;
&lt;p&gt;対象のGemだけ更新する場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://scrapbox.io/10nin/bundle_update%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AEgem%E3%81%AE%E3%81%BF%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%B9%E3%81%8D%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;bundle updateで特定のgemのみ更新する時に気をつけるべきポイント - 10nin blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;sourceで指定するより&lt;code class=&quot;language-text&quot;&gt;--conservative&lt;/code&gt;のほうが良いらしい&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bundle update --conservative activesupport&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Redisに対してGemからpingする]]></title><description><![CDATA[Redisの疎通確認するときなどに 小規模であればで良いのでは感もあるがこちらのほうが目的にマッチしていて良さそう Redisのみ使っている場合 Resque使っている場合はResqueに生えているのでそちらから使っても良い Resqueから使う場合 ちょっと中身読んだらNode…]]></description><link>https://til.swfz.io/entries/redis_ping/</link><guid isPermaLink="false">https://til.swfz.io/entries/redis_ping/</guid><pubDate>Mon, 28 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Redisの疎通確認するときなどに&lt;/p&gt;
&lt;p&gt;小規模であれば&lt;code class=&quot;language-text&quot;&gt;keys *&lt;/code&gt;で良いのでは感もあるがこちらのほうが目的にマッチしていて良さそう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redisのみ使っている場合&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;redis&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;Redis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ping &lt;span class=&quot;token comment&quot;&gt;# &quot;PONG&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Resque使っている場合はResqueに生えているのでそちらから使っても良い&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resqueから使う場合&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;resque&apos;&lt;/span&gt;&lt;/span&gt;
Resque&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;redis&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ping &lt;span class=&quot;token comment&quot;&gt;# &quot;PONG&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ちょっと中身読んだらNodeごとにpingだしているっぽいのでクラスタ組んでる場合は要件が変わってくるかも&lt;/p&gt;</content:encoded></item><item><title><![CDATA[RailsのRoutingでmountするアプリに制限を掛ける]]></title><description><![CDATA[今までRailsではDeviseを使って認証していたので たとえばなどmountするアプリケーションを追加したい場合 次のようなコードをに追記すれば特定ロールのユーザーに対してのみ公開できるようにできていた config/routes.rb を使用して条件付きでmount…]]></description><link>https://til.swfz.io/entries/rails_routing_constraints/</link><guid isPermaLink="false">https://til.swfz.io/entries/rails_routing_constraints/</guid><pubDate>Wed, 23 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今までRailsではDeviseを使って認証していたので&lt;/p&gt;
&lt;p&gt;たとえば&lt;code class=&quot;language-text&quot;&gt;Resque::Server&lt;/code&gt;などmountするアプリケーションを追加したい場合&lt;/p&gt;
&lt;p&gt;次のようなコードを&lt;code class=&quot;language-text&quot;&gt;config/routes.rb&lt;/code&gt;に追記すれば特定ロールのユーザーに対してのみ公開できるようにできていた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;config/routes.rb&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;resque/server&apos;&lt;/span&gt;&lt;/span&gt;
authenticate &lt;span class=&quot;token symbol&quot;&gt;:user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;admin&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  mount Resque&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:at&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/resque&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;authenticate&lt;/code&gt;を使用して条件付きでmountさせるという感じ&lt;/p&gt;
&lt;p&gt;ただ、deviseを使っていない場合はどうすれば良いんだろうこということで、どのような方法があるか調べた&lt;/p&gt;
&lt;h2&gt;constraints&lt;/h2&gt;
&lt;p&gt;特定のルーティングに対して制限を掛けられる&lt;/p&gt;
&lt;p&gt;詳しい実装方法やパターンは次のドキュメントに載っている&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://guides.rubyonrails.org/routing.html#advanced-constraints&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Rails Routing from the Outside In — Ruby on Rails Guides&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://guides.rubyonrails.org/routing.html#advanced-constraints:embed:cite&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://guides.rubyonrails.org/routing.html#advanced-constraints:embed:cite&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;クラスを定義する場合は&lt;code class=&quot;language-text&quot;&gt;matches?&lt;/code&gt;メソッドを用意して真偽値を返す&lt;/p&gt;
&lt;p&gt;引数にrequestが渡ってくるのでその中に&lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt;なり何なりをもたせておけばそれをもとにUserを持ってきてAdminか?みたいなチェックを行うことで制限を掛けられる&lt;/p&gt;
&lt;!-- textlint-disable aws-spellcheck --&gt;
&lt;p&gt;lambdaでその場に直接処理を書いてしまうことも可能&lt;/p&gt;
&lt;!-- textlint-enable aws-spellcheck --&gt;
&lt;p&gt;セッションにUserのIDなどをもたせておけばログイン時かつそのユーザーが管理者であればページを公開するといったことがサクッと書ける&lt;/p&gt;
&lt;p&gt;サンプル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;config/routes.rb&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;resque/server&apos;&lt;/span&gt;&lt;/span&gt;
mount Resque&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:at&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/resque&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;constraints&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; lambda &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;req&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;session&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;user_id&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;present&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; User&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_by&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;session&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;user_id&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;admin&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;今まで思考停止でやっていたので勉強になりました&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TypeScriptの組み込み型関数Recordの覚書]]></title><description><![CDATA[…]]></description><link>https://til.swfz.io/entries/typescript_types_record/</link><guid isPermaLink="false">https://til.swfz.io/entries/typescript_types_record/</guid><pubDate>Tue, 22 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;よくあるパターンだとは思うけどいざ書いているとなかなか出てこないので残す時間を作って書いている&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;type&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;interface&lt;/code&gt;を定義せず変数定義時に型も定義する場合などよくやりがちなのが次のような書き方&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; summary&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;を書き換えると次のように書き換えられる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; summary&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;集計ロジックの中の中間の変数などでよくやりがち&lt;/p&gt;
&lt;p&gt;少し要素を追加してサンプルコードを書いてみる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サンプルコード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Row&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rows&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;bar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;baz&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;bar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; summary &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rows&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Row&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;summary&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { foo: { value: 1 }, bar: { value: 4 }, baz: { value: 3 } }&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;reduceの型定義&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;callbackfn&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;previousValue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; currentValue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; currentIndex&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; array&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;callbackfn&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;previousValue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; currentValue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; currentIndex&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; array&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; initialValue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;reduce&amp;lt;T&gt;&lt;/code&gt;というようにデフォルトだと&lt;code class=&quot;language-text&quot;&gt;previousValue&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;currentValue&lt;/code&gt;の型が一緒だが型引数に独自の型を与えてあげることで&lt;code class=&quot;language-text&quot;&gt;initialValue&lt;/code&gt;の型を定義できる&lt;/p&gt;
&lt;p&gt;この辺の使い方など普段から使っていないと忘れてしまうので意識して使えるようにしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/kei-nakoshi/items/6b1ed11741b90e71e1bd&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TypeScriptの組み込み型関数 Recordの使いどころ - Qiita&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Disallow empty functions (no-empty-function)]]></title><description><![CDATA[ESLintで怒られたときの対応 次のような形で何もしない関数をコールバックとして渡していて怒られた でくくって対応する 出典どこだったか忘れてしまったのでメモ残しておく]]></description><link>https://til.swfz.io/entries/eslint_disallow_empty_function/</link><guid isPermaLink="false">https://til.swfz.io/entries/eslint_disallow_empty_function/</guid><pubDate>Mon, 21 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ESLintで怒られたときの対応&lt;/p&gt;
&lt;p&gt;次のような形で何もしない関数をコールバックとして渡していて怒られた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/tmp/hoge.txt&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Disallow empty functions (no-empty-function)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;()&lt;/code&gt;でくくって対応する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/tmp/hoge.txt&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;出典どこだったか忘れてしまったのでメモ残しておく&lt;/p&gt;</content:encoded></item><item><title><![CDATA[curl: (3) [globbing] error: bad range specification after pos 3]]></title><description><![CDATA[tflintを入れてみようと思いREADMEにしたがいワンライナーで落としてこようと思ったら思わぬところでつまずいた glob…どこかでや使っているか?という感じだったがが悪さをしていた 自分のシェル環境だとデフォルトでgrep…]]></description><link>https://til.swfz.io/entries/curl_with_grep_color/</link><guid isPermaLink="false">https://til.swfz.io/entries/curl_with_grep_color/</guid><pubDate>Sat, 12 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;tflintを入れてみようと思いREADMEにしたがいワンライナーで落としてこようと思ったら思わぬところでつまずいた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Ls&lt;/span&gt; https://api.github.com/repos/terraform-linters/tflint/releases/latest &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://.+?_linux_amd64.zip&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; tflint.zip &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;unzip&lt;/span&gt; tflint.zip &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; tflint.zip
curl: &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;globbing&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; error: bad range specification after pos &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;glob…どこかで&lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;使っているか?という感じだったが&lt;code class=&quot;language-text&quot;&gt;grep&lt;/code&gt;が悪さをしていた&lt;/p&gt;
&lt;p&gt;自分のシェル環境だとデフォルトでgrepの結果に色をつけるようにしていたのでその結果に対して&lt;code class=&quot;language-text&quot;&gt;curl&lt;/code&gt;しようとすることでエスケープシーケンスも含まれてしまっていた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ curl  -Ls https://api.github.com/repos/terraform-linters/tflint/releases/latest | grep -o -E &quot;https://.+?_linux_amd64.zip&quot; &gt; url.txt
$ cat -v url.txt
^[[01;31m^[[Khttps://github.com/terraform-linters/tflint/releases/download/v0.22.0/tflint_linux_amd64.zip^[[m^[[K&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もともとURLに&lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;が含まれているパターンではないのでこの場合の対応は&lt;code class=&quot;language-text&quot;&gt;--globoff&lt;/code&gt;ではだめだった&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;grep --color=no&lt;/code&gt;を追加することでcurl対象のURLがプレーンなテキストになるのでcurlできるようになった&lt;/p&gt;
&lt;p&gt;エスケープシーケンスはよくやるので気を付けたい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ansibleのデバッグ]]></title><description><![CDATA[毎度ググっているので残しておく 本当にこれだけw]]></description><link>https://til.swfz.io/entries/ansible_debug/</link><guid isPermaLink="false">https://til.swfz.io/entries/ansible_debug/</guid><pubDate>Fri, 11 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;毎度ググっているので残しておく&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; var=hoge&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;本当にこれだけw&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Caller does not have permission]]></title><description><![CDATA[GCRへのpushで次のようなエラーに遭遇した 「バケット管理者」は付けているしなんでだろう…としばらく悩んだが docker push to Google Container Registry errors “Caller does not have permission…]]></description><link>https://til.swfz.io/entries/gcp_specific_project/</link><guid isPermaLink="false">https://til.swfz.io/entries/gcp_specific_project/</guid><pubDate>Thu, 10 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GCRへのpushで次のようなエラーに遭遇した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; Token exchange failed for project &apos;terraform-sample-111111&apos;. Caller does not have permission &apos;storage.buckets.create&apos;. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;「バケット管理者」は付けているしなんでだろう…としばらく悩んだが&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/54496809/docker-push-to-google-container-registry-errors-caller-does-not-have-permission&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;docker push to Google Container Registry errors “Caller does not have permission ‘storage.buckets.create’”&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;で言及されているようにプロジェクトを指定しろっていうだけの話だった&lt;/p&gt;
&lt;p&gt;ちゃんとエラーググりましょう案件&lt;/p&gt;</content:encoded></item><item><title><![CDATA[BigQueryでサンプルデータをサクッと作る]]></title><description><![CDATA[簡易的にでもサンプルデータが欲しい場合、わざわざデータを入れ込まなくてもサンプルデータを生成できる 結果 start_date end_date item sales 2020-08-01 2020-11-30 hoge 100 2020-10-01 2020-10-3…]]></description><link>https://til.swfz.io/entries/bigquery_sample_data/</link><guid isPermaLink="false">https://til.swfz.io/entries/bigquery_sample_data/</guid><pubDate>Wed, 09 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;簡易的にでもサンプルデータが欲しい場合、わざわざデータを入れ込まなくてもサンプルデータを生成できる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-sql line-numbers&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; sample &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; UNNEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ARRAY&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;STRUCT&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;start_date &lt;span class=&quot;token keyword&quot;&gt;DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end_date &lt;span class=&quot;token keyword&quot;&gt;DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; item STRING&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sales INT64&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2020-08-01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2020-11-30&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hoge&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2020-10-01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2020-10-31&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fuga&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; sample&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;結果&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;start_date&lt;/th&gt;
&lt;th&gt;end_date&lt;/th&gt;
&lt;th&gt;item&lt;/th&gt;
&lt;th&gt;sales&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2020-08-01&lt;/td&gt;
&lt;td&gt;2020-11-30&lt;/td&gt;
&lt;td&gt;hoge&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-10-01&lt;/td&gt;
&lt;td&gt;2020-10-31&lt;/td&gt;
&lt;td&gt;fuga&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;記事書くときや説明とかに使える&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Puppeteerのデバッグ用のテンプレート]]></title><description><![CDATA[最初の数行が定型文で貼り付けるだけにしたいので残しておく REPL起動 toplevelでawaitを使えるようになるオプションをつける（node12以降） REPL]]></description><link>https://til.swfz.io/entries/puppeteer_debug/</link><guid isPermaLink="false">https://til.swfz.io/entries/puppeteer_debug/</guid><pubDate>Mon, 07 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最初の数行が定型文で貼り付けるだけにしたいので残しておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;REPL起動&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;node --experimental-repl-await&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;toplevelでawaitを使えるようになるオプションをつける（node12以降）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;REPL&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; puppeteer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;puppeteer&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; browser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; puppeteer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;launch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;--no-sandbox&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;--disable-setuid-sandbox&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; page &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; browser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// この辺からはその時時に合わせて変える&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; requestUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://example.com&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;goto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestUrl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; rows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;//article&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; rows&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;textContent&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;jsonValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; rows&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.//a[contains(@role, &quot;link&quot;) and contains(@data-focusable, &quot;true&quot;)]/time&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;textContent&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;jsonValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Error: React-Hot-Loader: AppContainer should be patched]]></title><description><![CDATA[次のリンクとまったく同じ状態になった Gatsby doesn’t work with React 17 RC (Error: React-Hot-Loader: AppContainer should be patched) · Issue #26979 · gatsbyjs…]]></description><link>https://til.swfz.io/entries/react_hot_loader_should_be_patched/</link><guid isPermaLink="false">https://til.swfz.io/entries/react_hot_loader_should_be_patched/</guid><pubDate>Sun, 15 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;次のリンクとまったく同じ状態になった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/issues/26979&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Gatsby doesn’t work with React 17 RC (Error: React-Hot-Loader: AppContainer should be patched) · Issue #26979 · gatsbyjs/gatsby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/issues/26979#issuecomment-696702777&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/gatsbyjs/gatsby/issues/26979#issuecomment-696702777&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;のコメントにあるようにパッケージのバージョンを上げればOKのよう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;react-hot-loader&lt;/code&gt;自体はgatsbyの依存モジュールで&lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;には含まれていなかったため&lt;/p&gt;
&lt;p&gt;気にせず&lt;code class=&quot;language-text&quot;&gt;yarn add&lt;/code&gt;したら解決するかと思ったら解決せず…&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;yarn why&lt;/code&gt;で確認すると2つのバージョンが混在する状態になっていた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; why react-hot-loader
&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; why v1.22.5
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;/4&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Why &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; we have the module &lt;span class=&quot;token string&quot;&gt;&quot;react-hot-loader&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.?
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;/4&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Initialising dependency graph&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;/4&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Finding dependency&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;/4&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Calculating &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; sizes&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Found &lt;span class=&quot;token string&quot;&gt;&quot;react-hot-loader@4.13.0&quot;&lt;/span&gt;
info Has been hoisted to &lt;span class=&quot;token string&quot;&gt;&quot;react-hot-loader&quot;&lt;/span&gt;
info This module exists because it&apos;s specified &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
info Disk size without dependencies: &lt;span class=&quot;token string&quot;&gt;&quot;652KB&quot;&lt;/span&gt;
info Disk size with unique dependencies: &lt;span class=&quot;token string&quot;&gt;&quot;1.96MB&quot;&lt;/span&gt;
info Disk size with transitive dependencies: &lt;span class=&quot;token string&quot;&gt;&quot;2.8MB&quot;&lt;/span&gt;
info Number of shared dependencies: &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Found &lt;span class=&quot;token string&quot;&gt;&quot;gatsby#react-hot-loader@4.12.21&quot;&lt;/span&gt;
info This module exists because &lt;span class=&quot;token string&quot;&gt;&quot;gatsby&quot;&lt;/span&gt; depends on it.
info Disk size without dependencies: &lt;span class=&quot;token string&quot;&gt;&quot;288KB&quot;&lt;/span&gt;
info Disk size with unique dependencies: &lt;span class=&quot;token string&quot;&gt;&quot;1.61MB&quot;&lt;/span&gt;
info Disk size with transitive dependencies: &lt;span class=&quot;token string&quot;&gt;&quot;2.45MB&quot;&lt;/span&gt;
info Number of shared dependencies: &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;
Done &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;.94s.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;新たにインストールしたほうは呼ばれていないっぽい&lt;/p&gt;
&lt;p&gt;ということで次の記事を参考にして&lt;code class=&quot;language-text&quot;&gt;yarn.lock&lt;/code&gt;の&lt;code class=&quot;language-text&quot;&gt;gatsby#react-hot-loader&lt;/code&gt;の部分を削除して再度&lt;code class=&quot;language-text&quot;&gt;yarn install&lt;/code&gt;で解決した&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/uasi/items/ca440a750a77ca62321b&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;yarn upgrade で更新できない間接的な依存パッケージだけをアップグレードするには - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://qiita.com/uasi/items/ca440a750a77ca62321b:embed:cite&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://qiita.com/uasi/items/ca440a750a77ca62321b:embed:cite&lt;/a&gt;]&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;直接&lt;code class=&quot;language-text&quot;&gt;yarn.lock&lt;/code&gt;触るのはちょっと気が引けたので別の機会で他の方法がないか調べてみようと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;</content:encoded></item><item><title><![CDATA[RubyでAPIレスポンスを直接クラウドストレージにputする]]></title><description><![CDATA[いまさら感はあるがよくどうだったっけーみたいな感じでググっているのでここらで残しておく よくあるケースだと思うが次のようなパターンのとき APIからデータを取得 データをストレージに保存 ファイルを生成してそれをS3やGCSへPUT…]]></description><link>https://til.swfz.io/entries/ruby_direct_put_storage/</link><guid isPermaLink="false">https://til.swfz.io/entries/ruby_direct_put_storage/</guid><pubDate>Sat, 14 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;いまさら感はあるがよくどうだったっけーみたいな感じでググっているのでここらで残しておく&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;よくあるケースだと思うが次のようなパターンのとき&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;ul&gt;
&lt;li&gt;APIからデータを取得&lt;/li&gt;
&lt;li&gt;データをストレージに保存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ファイルを生成してそれをS3やGCSへPUTみたいなのはよく見るがわざわざ一時的にファイルへ保存しなくても良い場合&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;StringIO.new&lt;/code&gt;した値を渡すことで直接PUTできる&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;StringIO&lt;/code&gt;が&lt;code class=&quot;language-text&quot;&gt;IO&lt;/code&gt;のinterfaceを扱える(&lt;code class=&quot;language-text&quot;&gt;read&lt;/code&gt;できる)のでファイルを扱っているのと同様に扱える&lt;/p&gt;
&lt;p&gt;サンプルでTooglのAPIレスポンスをGCSへPUTするスクリプトを書いた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;app.rb&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;json&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;net/https&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;base64&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;google/cloud/storage&apos;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;put_object&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  bucket_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dev-raw-data&apos;&lt;/span&gt;&lt;/span&gt;
  path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hoge/res.json&apos;&lt;/span&gt;&lt;/span&gt;
  client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Google&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Cloud&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Storage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;
  bucket &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bucket bucket_name
  io &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;StringIO&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; data

  bucket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;create_file io&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; path
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;/span&gt;
  token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;TOGGL_API_TOKEN&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  workspace_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ARGV&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  from &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-01-01&apos;&lt;/span&gt;&lt;/span&gt;
  to   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-02-01&apos;&lt;/span&gt;&lt;/span&gt;

  params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token symbol&quot;&gt;workspace_id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; workspace_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token symbol&quot;&gt;since&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; from&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token symbol&quot;&gt;until&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token symbol&quot;&gt;user_agent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;api_test&apos;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  uri &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;URI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://toggl.com/reports/api/v2/details&apos;&lt;/span&gt;&lt;/span&gt;
  uri&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;URI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;encode_www_form params

  http &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Net&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; uri&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;host&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; uri&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;port
  http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;use_ssl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;verify_mode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; OpenSSL&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SSL&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;VERIFY_NONE&lt;/span&gt;

  headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Basic #{Base64.encode64(&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:api_token&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&quot; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request_get uri&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; headers
  put_object res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

main&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[TerraformでGCSのバケットを作ってみる]]></title><description><![CDATA[とりあえず動かすところから GCPでやってみる サービスアカウントの作成 GUIからある程度の権限をもたせて作成した キーファイルのパスを環境変数に格納する ディレクトリ構成 とりあえずのサンプルとしてフラットにした version.tf provider.tf storage…]]></description><link>https://til.swfz.io/entries/terraform_gcs/</link><guid isPermaLink="false">https://til.swfz.io/entries/terraform_gcs/</guid><pubDate>Tue, 10 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;とりあえず動かすところから&lt;/p&gt;
&lt;p&gt;GCPでやってみる&lt;/p&gt;
&lt;h2&gt;サービスアカウントの作成&lt;/h2&gt;
&lt;p&gt;GUIからある程度の権限をもたせて作成した&lt;/p&gt;
&lt;p&gt;キーファイルのパスを&lt;code class=&quot;language-text&quot;&gt;GOOGLE_CLOUD_KEYFILE_JSON&lt;/code&gt;環境変数に格納する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;GOOGLE_CLOUD_KEYFILE_JSON&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;path_to/account.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;ディレクトリ構成&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── provider.tf
├── README.md
├── storage.tf
└── version.tf

0 directories, 4 files&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;とりあえずのサンプルとしてフラットにした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;version.tf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-hcl line-numbers&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;terraform&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;required_version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~&gt;0.13.5&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;provider.tf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-hcl line-numbers&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;provider&lt;span class=&quot;token type variable&quot;&gt; &quot;google&quot; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~&gt; 3.45.0&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;project&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;terraform-sample-1111111&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;region&lt;/span&gt;      &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;asia-northeast1&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;storage.tf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;hcl&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-hcl line-numbers&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;google_storage_bucket&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;private-bucket&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;          &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test-bucket-1234&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;location&lt;/span&gt;      &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;asia-northeast1&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;storage_class&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;REGIONAL&quot;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;labels&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test-app&quot;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ terraform init&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ terraform plan
Refreshing Terraform state in-memory prior to plan&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
The refreshed state will be used to calculate this plan, but will not be
persisted to &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  &lt;span class=&quot;token comment&quot;&gt;# google_storage_bucket.private-bucket will be created&lt;/span&gt;
  + resource &lt;span class=&quot;token string&quot;&gt;&quot;google_storage_bucket&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;private-bucket&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      + bucket_policy_only          &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + force_destroy               &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
      + &lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt;                          &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + labels                      &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          + &lt;span class=&quot;token string&quot;&gt;&quot;app&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test-app&quot;&lt;/span&gt;
          + &lt;span class=&quot;token string&quot;&gt;&quot;env&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      + location                    &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ASIA-NORTHEAST1&quot;&lt;/span&gt;
      + name                        &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test-bucket-1111111&quot;&lt;/span&gt;
      + project                     &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + self_link                   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + storage_class               &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;REGIONAL&quot;&lt;/span&gt;
      + uniform_bucket_level_access &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + url                         &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

Plan: &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; to add, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; to change, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; to destroy.

------------------------------------------------------------------------

Note: You didn&lt;span class=&quot;token string&quot;&gt;&apos;t specify an &quot;-out&quot; parameter to save this plan, so Terraform
can&apos;&lt;/span&gt;t guarantee that exactly these actions will be performed &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;terraform apply&quot;&lt;/span&gt; is subsequently run.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  &lt;span class=&quot;token comment&quot;&gt;# google_storage_bucket.private-bucket will be created                                                                                               + resource &quot;google_storage_bucket&quot; &quot;private-bucket&quot; {&lt;/span&gt;
      + bucket_policy_only          &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + force_destroy               &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
      + &lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt;                          &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + labels                      &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          + &lt;span class=&quot;token string&quot;&gt;&quot;app&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test-app&quot;&lt;/span&gt;
          + &lt;span class=&quot;token string&quot;&gt;&quot;env&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      + location                    &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ASIA-NORTHEAST1&quot;&lt;/span&gt;
      + name                        &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test-bucket-1234&quot;&lt;/span&gt;
      + project                     &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + self_link                   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      + storage_class               &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;REGIONAL&quot;&lt;/span&gt;
      + uniform_bucket_level_access &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                                                                                                  + url                         &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;known after apply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

Plan: &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; to add, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; to change, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only &lt;span class=&quot;token string&quot;&gt;&apos;yes&apos;&lt;/span&gt; will be accepted to approve.

  Enter a value: &lt;span class=&quot;token function&quot;&gt;yes&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;GUI上で確認して完了&lt;/p&gt;
&lt;p&gt;単品であればドキュメント見ながら書くだけでOKなので簡単&lt;/p&gt;
&lt;p&gt;個人的にはIAM周りがまだ良くわかっていないので素振りして理解を進めたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.devsamurai.com/ja/gcp-terraform-101/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Terraformツールを使ってGCPリソース管理 | DevSamurai&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gcloudでデフォルトリージョンの設定]]></title><description><![CDATA[コマンドでいろいろ試していたりすると毎度リージョンを指定しわすれてUSになったりすることがあって面倒だったので調べた 設定の変更 確認 デフォルト リージョンまたはゾーンの変更]]></description><link>https://til.swfz.io/entries/gcloud_default_region/</link><guid isPermaLink="false">https://til.swfz.io/entries/gcloud_default_region/</guid><pubDate>Mon, 09 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;gcloud&lt;/code&gt;コマンドでいろいろ試していたりすると毎度リージョンを指定しわすれてUSになったりすることがあって面倒だったので調べた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定の変更&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ gcloud compute project-info add-metadata &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--metadata&lt;/span&gt; google-compute-default-region&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;asia-northeast1,google-compute-default-zone&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;asia-northeast1-a&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;確認&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ gcloud compute project-info describe --project sample-project-1111111
commonInstanceMetadata:
  fingerprint: 4HM7BFP53kU=
  items:
  - key: google-compute-default-region
    value: asia-northeast1
  - key: google-compute-default-zone
    value: asia-northeast1-a
  kind: compute#metadata
.....
.....
.....&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/compute/docs/regions-zones/changing-default-zone-region?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;デフォルト リージョンまたはゾーンの変更&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Vim起動時のPowerlineのエラー]]></title><description><![CDATA[何かのタイミングでVimの起動時にエラーが出るようになってしまった つけてインストールし直したら解決した]]></description><link>https://til.swfz.io/entries/vim_python3_powerline/</link><guid isPermaLink="false">https://til.swfz.io/entries/vim_python3_powerline/</guid><pubDate>Sun, 08 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;何かのタイミングでVimの起動時にエラーが出るようになってしまった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;You need vim compiled with Python 2.6, 2.7 or 3.2 and later support
for Powerline to work. Please consult the documentation for more
details.
Press ENTER or type command to continue&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--enable-pythoninterp&lt;/code&gt;つけてインストールし直したら解決した&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/vim/vim.git /tmp/vim
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /tmp/vim

./configure &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-fail-if-missing &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --with-features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;huge &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-gpm &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --disable-selinux &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-perlinterp &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-pythoninterp &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-cscope &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-fontset &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-multibyte

&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[digest-crc gemがインストールできない]]></title><description><![CDATA[CloudRun Rubyのチュートリアルを進めた後にのGemを使っていろいろやってみようとインストールして見たら怒られた Dockerfile Gemfile ちょっと調べただけだとわからなかった ruby2.7-slim -> ruby2.…]]></description><link>https://til.swfz.io/entries/install_digest_crc_in_docker_image/</link><guid isPermaLink="false">https://til.swfz.io/entries/install_digest_crc_in_docker_image/</guid><pubDate>Sat, 07 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CloudRun Rubyのチュートリアルを進めた後に&lt;code class=&quot;language-text&quot;&gt;google-cloud&lt;/code&gt;のGemを使っていろいろやってみようとインストールして見たら怒られた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dockerfile&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;dockerfile&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-dockerfile line-numbers&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ruby:2.7-slim&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /usr/src/app&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; Gemfile Gemfile.lock ./&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; BUNDLE_FROZEN=true&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; gem install bundler &amp;amp;&amp;amp; bundle install --without test&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; . ./&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;ruby&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;./app.rb&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Gemfile&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;source &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://rubygems.org&quot;&lt;/span&gt;&lt;/span&gt;

gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;google-cloud-storage&quot;&lt;/span&gt;&lt;/span&gt;
gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;google-cloud-secret_manager&quot;&lt;/span&gt;&lt;/span&gt;
gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sinatra&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;~&gt;2.0&quot;&lt;/span&gt;&lt;/span&gt;

group &lt;span class=&quot;token symbol&quot;&gt;:test&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rack-test&quot;&lt;/span&gt;&lt;/span&gt;
  gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rest-client&quot;&lt;/span&gt;&lt;/span&gt;
  gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rspec&quot;&lt;/span&gt;&lt;/span&gt;
  gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rspec_junit_formatter&quot;&lt;/span&gt;&lt;/span&gt;
  gem &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rubysl-securerandom&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Installing digest-crc 0.6.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /usr/local/bundle/gems/digest-crc-0.6.1/ext/digest
/usr/local/bin/ruby -I/usr/local/lib/ruby/2.7.0/rubygems -rrubygems
/usr/local/lib/ruby/gems/2.7.0/gems/rake-13.0.1/exe/rake
RUBYARCHDIR\=/usr/local/bundle/extensions/x86_64-linux/2.7.0/digest-crc-0.6.1
RUBYLIBDIR\=/usr/local/bundle/extensions/x86_64-linux/2.7.0/digest-crc-0.6.1
/usr/local/bin/ruby -S extconf.rb
checking for stdint.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/$(RUBY_BASE_NAME)
        --with-stdint-dir
        --without-stdint-dir
        --with-stdint-include
        --without-stdint-include=${stdint-dir}/include
        --with-stdint-lib
        --without-stdint-lib=${stdint-dir}/lib
/usr/local/lib/ruby/2.7.0/mkmf.rb:471:in `try_do&apos;: The compiler failed to
generate an executable file. (RuntimeError)
You have to install development tools first.
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:613:in `try_cpp&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:1124:in `block in have_header&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:971:in `block in checking_for&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:361:in `block (2 levels) in postpone&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:331:in `open&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:361:in `block in postpone&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:331:in `open&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:357:in `postpone&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:970:in `checking_for&apos;
        from /usr/local/lib/ruby/2.7.0/mkmf.rb:1123:in `have_header&apos;
        from extconf.rb:3:in `&amp;lt;main&gt;&apos;
rake aborted!
Command failed with status (1): [/usr/local/bin/ruby -S extconf.rb...]
/usr/local/bundle/gems/digest-crc-0.6.1/ext/digest/Rakefile:32:in `block (3
levels) in &amp;lt;top (required)&gt;&apos;
/usr/local/bundle/gems/digest-crc-0.6.1/ext/digest/Rakefile:31:in `chdir&apos;
/usr/local/bundle/gems/digest-crc-0.6.1/ext/digest/Rakefile:31:in `block (2
levels) in &amp;lt;top (required)&gt;&apos;
Tasks: TOP =&gt; default =&gt; crc15/crc15_ext.so =&gt; crc15/Makefile
(See full trace by running task with --trace)

rake failed, exit code 1

Gem files will remain installed in /usr/local/bundle/gems/digest-crc-0.6.1 for
inspection.
Results logged to
/usr/local/bundle/extensions/x86_64-linux/2.7.0/digest-crc-0.6.1/gem_make.out

An error occurred while installing digest-crc (0.6.1), and Bundler cannot
continue.
Make sure that `gem install digest-crc -v &apos;0.6.1&apos; --source
&apos;https://rubygems.org/&apos;` succeeds before bundling.

In Gemfile:
  google-cloud-storage was resolved to 1.29.1, which depends on
    digest-crc
The command &apos;/bin/sh -c gem install bundler &amp;amp;&amp;amp; bundle install --without test&apos; returned a non-zero code: 5
ERROR
ERROR: build step 0 &quot;gcr.io/cloud-builders/docker&quot; failed: step exited with non-zero status: 5

-----------------------------------------------------------------------------------------------------------------------------------------------------

ERROR: (gcloud.builds.submit) build 57e77985-ae0b-40b7-b0d7-04ce7bcbd099 completed with status &quot;FAILURE&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ちょっと調べただけだとわからなかった&lt;/p&gt;
&lt;p&gt;ruby2.7-slim -&gt; ruby2.7にしたらインストールできたのでいったんそれでも良いかと思ったがよく読んだら&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;You have to install development tools first.&lt;/code&gt;ということで次の対応でインストールできるようにした&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;COPY Gemfile Gemfile.lock ./
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;ENV BUNDLE_FROZEN=true
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    build-essential&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もっと詳しい中身までは追っていない…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[gcloudコマンドのインストール]]></title><description><![CDATA[以前はyumでインストールしていたが更新しようとしたらエラーに阻まれ困ってしまったので調べたらインストーラがあるらしい Google Cloud SDK インストーラの使用  |  Cloud SDK…]]></description><link>https://til.swfz.io/entries/install_gcloud/</link><guid isPermaLink="false">https://til.swfz.io/entries/install_gcloud/</guid><pubDate>Fri, 30 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;以前はyumでインストールしていたが更新しようとしたらエラーに阻まれ困ってしまったので調べたらインストーラがあるらしい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/sdk/docs/downloads-interactive?hl=ja&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Cloud SDK インストーラの使用  |  Cloud SDK のドキュメント&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;既存のパッケージマネージャーで使っているものを削除してから次のようにコマンドをたたくだけ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; https://sdk.cloud.google.com &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$SHELL&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;別途インストールされたディレクトリへのパスを追加する必要がある&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;特にエラーに阻まれることなくインストールできたので今後この方法で行こうと思う&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-weak-phrase --&gt;
&lt;p&gt;本当インストールに時間掛けるの無駄以外の何物でもないので…&lt;/p&gt;
&lt;h2&gt;追記（2020-12-03）&lt;/h2&gt;
&lt;p&gt;上記だけだと&lt;code class=&quot;language-text&quot;&gt;bq&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;gsutil&lt;/code&gt;が入らなかったので次の方法のほうが良いかも&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/sdk/docs/install?hl=JA#installation_instructions&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Cloud SDK のインストール  |  Cloud SDK のドキュメント&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-O&lt;/span&gt; https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-319.0.0-linux-x86_64.tar.gz
$ &lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; zxvf google-cloud-sdk-319.0.0-linux-x86_64.tar.gz
$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; google-cloud-sdk
$ ./google-cloud-sdk/install.sh&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;追記（2022-06-25）&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;version 391&lt;/code&gt;ではインストールスクリプトの置き場所が変わってた&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-O&lt;/span&gt; https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-391.0.0-linux-x86_64.tar.gz
$ &lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; zxvf google-cloud-sdk-391.0.0-linux-x86_64.tar.gz
$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; google-cloud-sdk
$ ./install.sh&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[特定の容量のダミーファイルを生成する]]></title><description><![CDATA[ディスク的には4KBで固定のよう というファイル名にnull文字で埋める、1KBで1ファイル作成する 容量によって確認したいことが変わる場合など容量を合わせていくの意外と面倒だったりするのでそういうときに使える]]></description><link>https://til.swfz.io/entries/dd/</link><guid isPermaLink="false">https://til.swfz.io/entries/dd/</guid><pubDate>Fri, 23 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/dev/zero &lt;span class=&quot;token assign-left variable&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1K_M.out &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1K &lt;span class=&quot;token assign-left variable&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;+0 records &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;+0 records out
&lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; bytes &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1.0&lt;/span&gt; kB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; copied, &lt;span class=&quot;token number&quot;&gt;0.000412943&lt;/span&gt; s, &lt;span class=&quot;token number&quot;&gt;2.5&lt;/span&gt; MB/s&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ ls -al 1K_M.out
-rw-rw-r-- 1 vagrant vagrant 1024 Oct 24 04:46 1K_M.out&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ディスク的には4KBで固定のよう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ du -sh 1K_M.out
4.0K    1K_M.out&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;1K_M.out&lt;/code&gt;というファイル名にnull文字で埋める、1KBで1ファイル作成する&lt;/p&gt;
&lt;p&gt;容量によって確認したいことが変わる場合など容量を合わせていくの意外と面倒だったりするのでそういうときに使える&lt;/p&gt;</content:encoded></item><item><title><![CDATA[AnsibleでAWS CLI v2をインストールする]]></title><description><![CDATA[dotfilesをAnsibleで管理していてAWS CLI v2もインストールできるようにroleを追加した 動作対象はCentOSやUbuntu roles/awscli/vars/main.yml roles/awscli/tasks/main.yml…]]></description><link>https://til.swfz.io/entries/ansible_install_awscliv2/</link><guid isPermaLink="false">https://til.swfz.io/entries/ansible_install_awscliv2/</guid><pubDate>Thu, 15 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;dotfilesをAnsibleで管理していてAWS CLI v2もインストールできるようにroleを追加した&lt;/p&gt;
&lt;p&gt;動作対象はCentOSやUbuntu&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;roles/awscli/vars/main.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;awscli_version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2.0.50
&lt;span class=&quot;token key atrule&quot;&gt;awscli&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//awscli.amazonaws.com/awscli&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;exe&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;linux&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;x86_64&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; awscli_version &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;.zip
  &lt;span class=&quot;token key atrule&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; awscli&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; awscli_version &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;.zip&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;roles/awscli/tasks/main.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; exist awscli v2
  &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; which aws
  &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/bin:{{ ansible_env.PATH }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; exist_awscli
  &lt;span class=&quot;token key atrule&quot;&gt;changed_when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ignore_errors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; get awscli version
  &lt;span class=&quot;token key atrule&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aws --version 2&gt;&amp;amp;1 | grep -oP &apos;(?&amp;lt;=aws-cli\\/)\\d+\\.\\d+\\.\\d+&apos; &quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/bin:{{ ansible_env.PATH }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; version_in_awscli
  &lt;span class=&quot;token key atrule&quot;&gt;changed_when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ignore_errors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    exist_awscli.rc == 0

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; get zip
    &lt;span class=&quot;token key atrule&quot;&gt;get_url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ awscli.src }}&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/tmp/{{ awscli.zip }}&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unarchive zip
    &lt;span class=&quot;token key atrule&quot;&gt;unarchive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /tmp/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; awscli.zip &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /tmp/
      &lt;span class=&quot;token key atrule&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; install
    &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./aws/install &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;update
      &lt;span class=&quot;token key atrule&quot;&gt;chdir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /tmp

  &lt;span class=&quot;token key atrule&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    exist_awscli.rc &lt;span class=&quot;token tag&quot;&gt;!=&lt;/span&gt; 0
    or ( version_in_awscli is defined and version_in_awscli.stdout.find(awscli_version) == &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;1 )&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ここのコードをroleとして呼び出せば実行できる&lt;/p&gt;
&lt;p&gt;コマンドの存在確認だけでなくバージョンまで見て指定バージョンでなければ再度インストールするようにしている&lt;/p&gt;
&lt;p&gt;このrole単体で使う場合は&lt;code class=&quot;language-text&quot;&gt;unzip&lt;/code&gt;がないはずなので別途どこかでインストールさせておく必要がある&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;aws --version&lt;/code&gt;の出力先が標準エラーだったのでリダイレクトしてバージョン番号を抽出している&lt;/p&gt;
&lt;p&gt;また次のサイトでgrepを使い特定の箇所だけを抜き出すというのをやった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://greymd.hatenablog.com/entry/2014/09/27/154305&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;grepの-oオプションと-Pオプションの組み合わせが便利 - Gre’s Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こういう感じの処理はよくやるので覚えておきたい&lt;/p&gt;
&lt;p&gt;実際の差分は次のPRにある&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/swfz/dotfiles/pull/222/files&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Feature/ansible awscli v2 by swfz · Pull Request #222 · swfz/dotfiles&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PixelaのデータをExportする]]></title><description><![CDATA[ただただデータをためて習慣化とかまでは良いんだけどいくつかのデータを使ってゴニョゴニョしたいときにExportしたいなと思った APIのエンドポイントとしては提供されていないが組み合わせれば取得できそうだったので書いてみた clientライブラリは下記を使った sue44…]]></description><link>https://til.swfz.io/entries/pixela_export_ruby/</link><guid isPermaLink="false">https://til.swfz.io/entries/pixela_export_ruby/</guid><pubDate>Thu, 01 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ただただデータをためて習慣化とかまでは良いんだけどいくつかのデータを使ってゴニョゴニョしたいときにExportしたいなと思った&lt;/p&gt;
&lt;p&gt;APIのエンドポイントとしては提供されていないが組み合わせれば取得できそうだったので書いてみた&lt;/p&gt;
&lt;p&gt;clientライブラリは下記を使った&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sue445/pixela&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sue445/pixela: Pixela API client for Ruby&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;pixela&apos;&lt;/span&gt;&lt;/span&gt;

client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Pixela&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;swfz&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;PIXELA_TOKEN&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# dates&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ap client.graph(&apos;m-issue-activity&apos;).pixel_dates&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# pixel&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ap client.graph(&apos;m-issue-activity&apos;).pixel(Date.today).get&lt;/span&gt;

id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;m-issue-activity&apos;&lt;/span&gt;&lt;/span&gt;
from &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;today &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
to &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;today &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
pixels &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;graph&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pixel_dates&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; from&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;date&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;graph&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pixel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;%Y%m%d&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;quantity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; value &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;token builtin&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.json&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pixels&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;m-issue-activity&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200919&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200920&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200921&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200922&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;17&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200923&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;12&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200924&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;27&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200925&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;33&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;20200926&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[SlackのAPI経由でリンク文字列を生成する]]></title><description><![CDATA[忘れるので備忘録 Formatting text for app surfaces | Slack SlackのAPI経由でtextを生成において、Markdown…]]></description><link>https://til.swfz.io/entries/slack_link_string/</link><guid isPermaLink="false">https://til.swfz.io/entries/slack_link_string/</guid><pubDate>Thu, 24 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;忘れるので備忘録&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://api.slack.com/reference/surfaces/formatting#linking_to_urls&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Formatting text for app surfaces | Slack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SlackのAPI経由でtextを生成において、Markdown記法が使えるもののリンクなどは独自の記法になっている&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;url|文字列&gt;&lt;/code&gt;という感じ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;blocks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;elements&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mrkdwn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Location: *Dogpatch* &amp;lt;https://github.com/swfz|swfz&gt;)&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;めちゃめちゃ細かい話だがスペースとかが入ると変換してくれない&lt;/p&gt;
&lt;h2&gt;失敗パターン&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt; https://github.com/swfz | swfz&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;成功パターン&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;https://github.com/swfz | swfz&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 257px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5e379da05f9c80f242996f26fb8b575e/96e35/slack_link_string01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABQ0lEQVR42lWQu0oDURCG9y0Cutlc9pasZzdubmvcXNxsbhJNYrJItJFo0BewUZA0IqKVloKdlZVFwHewsBMsLSNYCda/k0UMKX5mzgzzz3eGq+0e42R0gdHZKVKZHFbsEgprFVirBZgpC2nLhlttwHHriC0loLFlsEQSqqYjIsUQleNz4q7GE7x9AR+f39jo9rG3P8RgeITBwSG87R0UybzV8bDebCFhZpCjhfmSC4PysKiSybwp9/w6wdM78Pjyg6zXAm9KCPKksOQPhKIKhIiMEOXTmkDvGRnFGIOoaDPD69t7nN+NcXnzgOSWA9UxUbRdOJWaT1WuNHzKzXYXXa9PsYd2pwe7XIeQb0KpemBm9o9WA7fIh7DACwgEghDTDHLGgKLo/r1UzfAlE8X0ZmbaAjOS1KNaXEc0bkAkSSr7//ovUlGwLgvXdGkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/5e379da05f9c80f242996f26fb8b575e/cbe2e/slack_link_string01.webp 148w,
/static/5e379da05f9c80f242996f26fb8b575e/a93a3/slack_link_string01.webp 257w&quot;
              sizes=&quot;(max-width: 257px) 100vw, 257px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/5e379da05f9c80f242996f26fb8b575e/12f09/slack_link_string01.png 148w,
/static/5e379da05f9c80f242996f26fb8b575e/96e35/slack_link_string01.png 257w&quot;
            sizes=&quot;(max-width: 257px) 100vw, 257px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/5e379da05f9c80f242996f26fb8b575e/96e35/slack_link_string01.png&quot;
            alt=&quot;alt&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[LocalStackを使う(SSMパラメータストア)]]></title><description><![CDATA[準備 SSM パラメータストアのモックにも対応している この機能を開発環境でモックできるのはうれしい SecureStringも作れるっぽいが暗号化まではしてくれてない模様 AWSだとget-parametersで取得したValueは暗号化された値が出力される 参考 Secure…]]></description><link>https://til.swfz.io/entries/localstack_ssm/</link><guid isPermaLink="false">https://til.swfz.io/entries/localstack_ssm/</guid><pubDate>Mon, 21 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;準備&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clone https://github.com/localstack/localstack.git
cd localstack
docker-compose up -d&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;SSM&lt;/h2&gt;
&lt;p&gt;パラメータストアのモックにも対応している&lt;/p&gt;
&lt;p&gt;この機能を開発環境でモックできるのはうれしい&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ aws &lt;span class=&quot;token parameter variable&quot;&gt;--profile&lt;/span&gt; localstack --endpoint-url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;http://192.168.30.94:4583 ssm put-parameter &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test&apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--type&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--value&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hello&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--region&lt;/span&gt; ap-northeast-1
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Version&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ aws &lt;span class=&quot;token parameter variable&quot;&gt;--profile&lt;/span&gt; localstack --endpoint-url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;http://192.168.30.94:4583 ssm get-parameters &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test&apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--region&lt;/span&gt; ap-northeast-1
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;Parameters&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;Name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;,
      &lt;span class=&quot;token string&quot;&gt;&quot;Type&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;,
      &lt;span class=&quot;token string&quot;&gt;&quot;Value&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hello&quot;&lt;/span&gt;,
      &lt;span class=&quot;token string&quot;&gt;&quot;Version&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;InvalidParameters&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;SecureStringも作れるっぽいが暗号化まではしてくれてない模様&lt;/p&gt;
&lt;p&gt;AWSだとget-parametersで取得したValueは暗号化された値が出力される&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ aws &lt;span class=&quot;token parameter variable&quot;&gt;--profile&lt;/span&gt; localstack --endpoint-url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;http://192.168.30.94:4583 ssm put-parameter &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; secure_key &lt;span class=&quot;token parameter variable&quot;&gt;--type&lt;/span&gt; SecureString &lt;span class=&quot;token parameter variable&quot;&gt;--value&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;XXXXXXXXXX&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--region&lt;/span&gt; ap-northeast-1
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Version&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ aws &lt;span class=&quot;token parameter variable&quot;&gt;--profile&lt;/span&gt; localstack --endpoint-url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;http://192.168.30.94:4583 ssm get-parameters &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; secure_key  &lt;span class=&quot;token parameter variable&quot;&gt;--region&lt;/span&gt; ap-northeast-1
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Parameters&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;Name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secure_key&quot;&lt;/span&gt;,
            &lt;span class=&quot;token string&quot;&gt;&quot;Type&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SecureString&quot;&lt;/span&gt;,
            &lt;span class=&quot;token string&quot;&gt;&quot;Value&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;kms:default:XXXXXXXXXX&quot;&lt;/span&gt;,
            &lt;span class=&quot;token string&quot;&gt;&quot;Version&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;InvalidParameters&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-paramstore-securestring.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Secure String パラメータについて - AWS Systems Manager&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[docker-composeからmysqldumpコマンドを実行する]]></title><description><![CDATA[docker-composeからmysqldumpやdumpファイルの入れ込みを行う dump 入れ込み  がポイント]]></description><link>https://til.swfz.io/entries/mysqldump_in_docker_compose/</link><guid isPermaLink="false">https://til.swfz.io/entries/mysqldump_in_docker_compose/</guid><pubDate>Fri, 18 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;docker-composeからmysqldumpやdumpファイルの入れ込みを行う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dump&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker-compose&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; database mysqldump &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; root &lt;span class=&quot;token parameter variable&quot;&gt;-phoge&lt;/span&gt; hoge &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; develop.sql&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;入れ込み&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker-compose&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-T&lt;/span&gt; database mysql &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; root &lt;span class=&quot;token parameter variable&quot;&gt;-phoge&lt;/span&gt; hoge &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; hoge_dump.sql&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-T&lt;/code&gt; がポイント&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    -T                Disable pseudo-tty allocation. By default `docker-compose exec`
                      allocates a TTY.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Rubyでmarkdownのmetadata(front_matter)をパースする]]></title><description><![CDATA[metadata Gatsbyなどでも使っているMarkdownにタイトルなどの情報を付与するための構文 front_matterと言うらしい RubyでMarkdownをパースしてはてなブログにPOSTするためのスクリプトを書いていてこのfront_matter…]]></description><link>https://til.swfz.io/entries/ruby_front_matter_parser/</link><guid isPermaLink="false">https://til.swfz.io/entries/ruby_front_matter_parser/</guid><pubDate>Mon, 14 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;metadata&lt;/h2&gt;
&lt;p&gt;Gatsbyなどでも使っているMarkdownにタイトルなどの情報を付与するための構文&lt;/p&gt;
&lt;p&gt;front_matterと言うらしい&lt;/p&gt;
&lt;p&gt;RubyでMarkdownをパースしてはてなブログにPOSTするためのスクリプトを書いていてこのfront_matterにも対応させるかーという流れになった&lt;/p&gt;
&lt;p&gt;YAMLのGemでパースできるかと思ってちょっと調べてみたがそうでもなかった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/538650/how-to-include-metadata-in-a-template-file&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ruby - How to include metadata in a template file? - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上記試してみたが&lt;code class=&quot;language-text&quot;&gt;Psych::SyntaxError&lt;/code&gt;が出てしまい面倒になったのでGemを探すことにした&lt;/p&gt;
&lt;p&gt;結局こっちを使うことに&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/waiting-for-dev/front_matter_parser&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;waiting-for-dev/front_matter_parser: Ruby library to parse files or strings with a front matter. It has automatic syntax detection.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;中身的には結構愚直にやってた&lt;/p&gt;
&lt;h2&gt;サンプル&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;hoge.md&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
title: サンプルタイトル
date: 2020-09-14
description: &quot;front_matter_parser&quot;
tags:
  - Ruby
  - Markdown
---


## sub title1
- list1
- list2
- list2

## sub title2

hoge fuga&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;parse&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; yaml_loader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FrontMatterParser&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Loader&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Yaml&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;whitelist_classes&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Date&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#&amp;lt;FrontMatterParser::Loader::Yaml:0x00007fffdb031d20 @whitelist_classes=[Time, Date]&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; parsed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FrontMatterParser&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse_file&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hoge.md&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; yaml_loader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#&amp;lt;FrontMatterParser::Parsed:0x00007fffdaac8c58&lt;/span&gt;
 &lt;span class=&quot;token variable&quot;&gt;@content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;## sub title1\n- list1\n- list2\n- list2\n\n## sub title2\n\nhoge fuga\n\n&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;token variable&quot;&gt;@front_matter&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;サンプルタイトル&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;#&amp;lt;Date: 2020-09-14 ((2459107j,0s,0n),+0s,2299161j)&gt;,&lt;/span&gt;
   &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;front_matter_parser&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tags&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Ruby&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Markdown&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;yaml_loaderでwhitelistにDateやTimeなど日付関連のクラスをwhitelistに追加している&lt;/p&gt;
&lt;p&gt;これを追加していないと日付や時間のフォーマットが入っていた場合に下記のように怒られてしまう&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Psych::DisallowedClass: Tried to load unspecified class: Date&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;とりあえず使うならこのくらいでOKそう&lt;/p&gt;
&lt;h2&gt;2022-05-08追記&lt;/h2&gt;
&lt;p&gt;追記時点では執筆時と違いallowlistとして指定する必要がある&lt;/p&gt;
&lt;p&gt;READMEもそういう記述になっている&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/waiting-for-dev/front_matter_parser&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;waiting-for-dev/front_matter_parser: Ruby library to parse files or strings with a front matter. It has automatic syntax detection.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;差分としては下記のようになる&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt; yaml_loader = FrontMatterParser::Loader::Yaml.new(whitelist_classes: [Time, Date])
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; yaml_loader = FrontMatterParser::Loader::Yaml.new(allowlist_classes: [Time, Date])&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[GatsbyでpageQueryに任意のパラメータを渡す]]></title><description><![CDATA[Gatsbyで動的ページを生成する際にGraphQLで問い合わせするクエリも変数を渡したいというパターンはよくある ググっても出てこないなーなんて思ってたらよく読むとドキュメントに書いてあった Gatsby Node APIs | Gatsby…]]></description><link>https://til.swfz.io/entries/gatsby_createpage_argument/</link><guid isPermaLink="false">https://til.swfz.io/entries/gatsby_createpage_argument/</guid><pubDate>Thu, 10 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gatsbyで動的ページを生成する際にGraphQLで問い合わせするクエリも変数を渡したいというパターンはよくある&lt;/p&gt;
&lt;p&gt;ググっても出てこないなーなんて思ってたらよく読むとドキュメントに書いてあった&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/docs/node-apis/#createPages&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Gatsby Node APIs | Gatsby&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;          &lt;span class=&quot;token comment&quot;&gt;// The context data can also be used as&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;// arguments to the page GraphQL query.&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;とあり、&lt;code class=&quot;language-text&quot;&gt;createPage&lt;/code&gt;でページを生成するときに&lt;code class=&quot;language-text&quot;&gt;context&lt;/code&gt;としてデータを渡してあげるとその変数をGraphQLのクエリでも参照できる&lt;/p&gt;
&lt;p&gt;サンプルを一部抜粋する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-node.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; startDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;year&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;-01-01&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;YYYY-MM-DD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; endDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;year&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;-01-01&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;years&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;YYYY-MM-DD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;createPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/archives/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;year&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; archiveTemplate&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;year&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; year&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;startDate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; startDate&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;endDate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; endDate
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;archive.tsx&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pageQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; graphql&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
  query($startDate: Date, $endDate: Date) {
    site {
      siteMetadata {
        title
      }
    }
    allMarkdownRemark(
      limit: 1000
      sort: { fields: [frontmatter___date], order: DESC }
      filter: { frontmatter: { date: { gte: $startDate, lt: $endDate }}}
    ) {
      totalCount
      edges {
        node {
          fields {
            slug
          }
          frontmatter {
            title
            date(formatString: &quot;YYYY-MM-DD&quot;)
            tags
          }
        }
      }
    }
  }
&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;context.startDate, context.endDateをpageQueryで参照している&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Null合体演算子]]></title><description><![CDATA[Null合体演算子 しらなかったのでメモ よくあるデフォルト値を代入するときなどに使うやつ との違い || 左辺がfalsyな値なら右辺を返す falsyな値とは,,と空文字列など ?? 左辺がまたはの場合に右の値を返す…]]></description><link>https://til.swfz.io/entries/nullish_coalescing_operator/</link><guid isPermaLink="false">https://til.swfz.io/entries/nullish_coalescing_operator/</guid><pubDate>Fri, 14 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Null合体演算子&lt;/h2&gt;
&lt;p&gt;しらなかったのでメモ&lt;/p&gt;
&lt;p&gt;よくあるデフォルト値を代入するときなどに使うやつ&lt;/p&gt;
&lt;h2&gt;&lt;code class=&quot;language-text&quot;&gt;||&lt;/code&gt;との違い&lt;/h2&gt;
&lt;h3&gt;||&lt;/h3&gt;
&lt;p&gt;左辺がfalsyな値なら右辺を返す&lt;/p&gt;
&lt;p&gt;falsyな値とは&lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;と空文字列など&lt;/p&gt;
&lt;h3&gt;??&lt;/h3&gt;
&lt;p&gt;左辺が&lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;または&lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;の場合に右の値を返す&lt;/p&gt;
&lt;p&gt;0や空文字列の場合はそちらを返したい場合などに有効&lt;/p&gt;
&lt;h2&gt;実行例&lt;/h2&gt;
&lt;h3&gt;??&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;default string&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: &quot;default string&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;default string&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: &quot;default string&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;default string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: &quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value4 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value4&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: 0&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value5 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: []&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value6 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{a: &apos;b&apos;}&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: {}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;||&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;default string&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: &quot;default string&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;default string&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: &quot;default string&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;default string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: &quot;default string&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value4 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value4&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: 42&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value5 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: []&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; value6 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{a: &apos;b&apos;}&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// expected output: {}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Null合体演算子 - JavaScript | MDN&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TypeScriptのOptionalChaining]]></title><description><![CDATA[TypeScript3.7からOptional Chainingが使えるようになっていた Ruby…]]></description><link>https://til.swfz.io/entries/typescript_chaining/</link><guid isPermaLink="false">https://til.swfz.io/entries/typescript_chaining/</guid><pubDate>Thu, 13 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TypeScript3.7からOptional Chainingが使えるようになっていた&lt;/p&gt;
&lt;p&gt;Rubyでいうボッチ演算子&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;?.&lt;/code&gt;を挟むことで&lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;の可能性があっても毎度チェックせずともよしなにやってくれる&lt;/p&gt;
&lt;p&gt;関数呼び出しも同様に書くことができ次のようなパターンで記述可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hoge?.fuga&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hoge?.[0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hoge?.(args)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ネストの深いJSONなどで存在チェックをする際に楽に書けるようになる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GAのAPIレスポンスの特定のレコードを取得する&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;    if (response &amp;amp;&amp;amp; response.data &amp;amp;&amp;amp; response.data.reports &amp;amp;&amp;amp; response.data.reports[0] &amp;amp;&amp;amp; response.data.reports[0].data &amp;amp;&amp;amp; response.data.reports[0].data.rows) {
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    if (response?.data?.reports?.[0]?.data?.rows) {
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      return response.data.reports[0].data.rows;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    }
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    else {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      return [];
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    }&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Null合体演算子と組み合わせると次のように書くことができ、さらにスッキリする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;左辺がnullやundefinedの場合はから配列を返す&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-typescript line-numbers&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;data&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;reports&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;data&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;rows &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Optional chaining - JavaScript | MDN&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WindowsのエクスプローラからWSLなどのファイルを扱う]]></title><description><![CDATA[Windows <-> WSL間でのファイルのやりとり Windows -> WSL上ファイルへのアクセス エクスプローラでと入力するとファイル群を閲覧できる Windows -> VM + sambaへのアクセス エクスプローラでと入力するとファイル群を閲覧できる WSL…]]></description><link>https://til.swfz.io/entries/windows_file_access/</link><guid isPermaLink="false">https://til.swfz.io/entries/windows_file_access/</guid><pubDate>Thu, 30 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Windows &amp;#x3C;-&gt; WSL間でのファイルのやりとり&lt;/p&gt;
&lt;h2&gt;Windows -&gt; WSL上ファイルへのアクセス&lt;/h2&gt;
&lt;p&gt;エクスプローラで&lt;code class=&quot;language-text&quot;&gt;\\wsl$&lt;/code&gt;と入力するとファイル群を閲覧できる&lt;/p&gt;
&lt;h2&gt;Windows -&gt; VM + sambaへのアクセス&lt;/h2&gt;
&lt;p&gt;エクスプローラで&lt;code class=&quot;language-text&quot;&gt;\\192.168.30.11\...&lt;/code&gt;と入力するとファイル群を閲覧できる&lt;/p&gt;
&lt;h2&gt;WSL -&gt; Windows上ファイルへのアクセス&lt;/h2&gt;
&lt;p&gt;Windows上のファイルへのアクセスは次のように行う&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; /mnt/c/Users/&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[S3利用料をバケット毎に詳細に出すための情報]]></title><description><![CDATA[かなり面倒で分かりづらかったのでメモ程度に残しておく 手順 使用状況レポートをDLする 使用状況レポートのダウンロード 次の項目を指定する サービス 使用タイプ オペレーション 期間 詳細度（粒度） 列にバケット名が入ってくるので区別する 次の…]]></description><link>https://til.swfz.io/entries/s3_price_per_bucket/</link><guid isPermaLink="false">https://til.swfz.io/entries/s3_price_per_bucket/</guid><pubDate>Sat, 18 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;かなり面倒で分かりづらかったのでメモ程度に残しておく&lt;/p&gt;
&lt;h2&gt;手順&lt;/h2&gt;
&lt;h3&gt;使用状況レポートをDLする&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://console.aws.amazon.com/billing/home#/reports/usage&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;使用状況レポートのダウンロード&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;次の項目を指定する
&lt;ul&gt;
&lt;li&gt;サービス&lt;/li&gt;
&lt;li&gt;使用タイプ&lt;/li&gt;
&lt;li&gt;オペレーション&lt;/li&gt;
&lt;li&gt;期間&lt;/li&gt;
&lt;li&gt;詳細度（粒度）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Resource&lt;/code&gt;列にバケット名が入ってくるので区別する&lt;/p&gt;
&lt;h3&gt;次の3点に関してそれぞれ使用状況レポートから計算する&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ストレージ容量
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;TimedStorage-ByteHrs&lt;/code&gt;などを対象&lt;/li&gt;
&lt;li&gt;バイト時間を課金GB月に変換する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リクエストカウント
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Requests-Tier2&lt;/code&gt;などを対象
&lt;ul&gt;
&lt;li&gt;Tier1&lt;/li&gt;
&lt;li&gt;Tier2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リクエストのタイプにより料金が違うのでそれぞれ集計し、1000リクエストごとの料金を掛け合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;データ転送量
&lt;ul&gt;
&lt;li&gt;次の3点を考慮して計算する
&lt;ul&gt;
&lt;li&gt;Outに関して料金が発生する&lt;/li&gt;
&lt;li&gt;月の使用量によってレートが変わる&lt;/li&gt;
&lt;li&gt;インターネットかリージョンかでもレートが変わる
&lt;ul&gt;
&lt;li&gt;インターネット -&gt; &lt;code class=&quot;language-text&quot;&gt;DataTransfer-Out-Bytes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;リージョン間 -&gt; &lt;code class=&quot;language-text&quot;&gt;AWS-Out-Bytes&lt;/code&gt;,&lt;code class=&quot;language-text&quot;&gt;C3DataTransfer-Out-Bytes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;S3G-DataTransfer-Out-Bytes&lt;/code&gt;はリージョン間に該当すると思われる&lt;/li&gt;
&lt;li&gt;Cloudfrontへの転送は料金がかからない
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;CloudFront-Out-Bytes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;使用レポート&lt;/code&gt;の項目を読み込んで必要な項目だけ抜き出して計算する必要がある&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/aws-usage-report-understand.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AWS の Amazon S3 請求および使用状況レポートを理解する - Amazon Simple Storage Service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/BucketBilling.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;S3 バケットの請求および使用状況レポート - Amazon Simple Storage Service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/aws-usage-report.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Amazon S3 用の AWS 使用状況レポート - Amazon Simple Storage Service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aws.amazon.com/jp/s3/pricing/?nc1=h_ls&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;料金 - Amazon S3 ｜AWS&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CentOS7系でのrmagickのインストール]]></title><description><![CDATA[サクッとrmagickインストールできなかったので覚え書き ImageMagickインストールするだけではダメだった ほかにが必要みたい それでもダメだった というパッケージも必要だった 参考 file-devel]]></description><link>https://til.swfz.io/entries/ruby_rmagick_install/</link><guid isPermaLink="false">https://til.swfz.io/entries/ruby_rmagick_install/</guid><pubDate>Wed, 15 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;サクッとrmagickインストールできなかったので覚え書き&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/rmagick-2.15.4/ext/RMagick
/home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/bin/ruby -r ./siteconf20200715-2470-bpwp3n.rb extconf.rb
checking for gcc... yes
checking for Magick-config... no
checking for pkg-config... yes
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc&apos;
to the PKG_CONFIG_PATH environment variable
No package &apos;MagickCore&apos; found
checking for outdated ImageMagick version (&amp;lt;= 6.4.9)... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/bin/$(RUBY_BASE_NAME)

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/rmagick-2.15.4/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/rmagick-2.15.4 for inspection.
Results logged to /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/rmagick-2.15.4/gem_make.out

An error occurred while installing rmagick (2.15.4), and Bundler cannot continue.
Make sure that `gem install rmagick -v &apos;2.15.4&apos; --source &apos;https://rubygems.org/&apos;` succeeds before bundling.

In Gemfile:
  rmagick&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ImageMagickインストールするだけではダメだった&lt;/p&gt;
&lt;p&gt;ほかに&lt;code class=&quot;language-text&quot;&gt;ImageMAgicka-c++&lt;/code&gt;が必要みたい&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo yum install ImageMagick-c++-devel&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;それでもダメだった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/ruby-filemagic-0.7.0/ext/filemagic
/home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/bin/ruby -r ./siteconf20200715-5698-19exkam.rb extconf.rb
checking for -lgnurx... no
checking for magic_open() in -lmagic... no
*** ERROR: missing required library to compile this module
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/bin/$(RUBY_BASE_NAME)
        --with-magic-dir
        --without-magic-dir
        --with-magic-include
        --without-magic-include=${magic-dir}/include
        --with-magic-lib
        --without-magic-lib=${magic-dir}/lib
        --with-gnurx-dir
        --without-gnurx-dir
        --with-gnurx-include
        --without-gnurx-include=${gnurx-dir}/include
        --with-gnurx-lib
        --without-gnurx-lib=${gnurx-dir}/lib
        --with-gnurxlib
        --without-gnurxlib
        --with-magiclib
        --without-magiclib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/ruby-filemagic-0.7.0/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/ruby-filemagic-0.7.0 for inspection.
Results logged to /home/vagrant/.anyenv/envs/rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/ruby-filemagic-0.7.0/gem_make.out

An error occurred while installing ruby-filemagic (0.7.0), and Bundler cannot continue.
Make sure that `gem install ruby-filemagic -v &apos;0.7.0&apos; --source &apos;https://rubygems.org/&apos;` succeeds before bundling.

In Gemfile:
  ruby-filemagic&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;file-devel&lt;/code&gt;というパッケージも必要だった&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo yum install file-devel&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;参考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://en.it1352.com/article/e29b2d3fec8b45389fba33ad61ab0553.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;file-devel&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DOCKER_HOSTを指定してVM外からdockerを操作できるようにする]]></title><description><![CDATA[前提環境 Windows 10 CentOS7 IntelliJ 2020.1.2 ホストのIntelliJでVM上のdockerを使って開発する場合 dockerのAPIをたたくためにTCP接続を可能にする必要がある CentOSの場合、docker service…]]></description><link>https://til.swfz.io/entries/docker_host/</link><guid isPermaLink="false">https://til.swfz.io/entries/docker_host/</guid><pubDate>Tue, 14 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前提環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;CentOS7&lt;/li&gt;
&lt;li&gt;IntelliJ 2020.1.2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ホストのIntelliJでVM上のdockerを使って開発する場合&lt;/p&gt;
&lt;p&gt;dockerのAPIをたたくためにTCP接続を可能にする必要がある&lt;/p&gt;
&lt;p&gt;CentOSの場合、docker serviceの起動オプションを変える&lt;/p&gt;
&lt;h3&gt;設定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/usr/lib/systemd/system/docker.service&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;[Service]
&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt; ExecStart=/usr/bin/dockerd -H unix://
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;リロード&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-shell line-numbers&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;systemctl daemon-reload
&lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; start&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Project Structure&lt;/code&gt; -&gt; &lt;code class=&quot;language-text&quot;&gt;+&lt;/code&gt; -&gt; &lt;code class=&quot;language-text&quot;&gt;Add Ruby SDK&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b4669f83fd36249fe54eac24c122d354/d0d8c/docker_host02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABZElEQVR42n1R2XLCMAz0n/QijmNyk5vEEFpKH/r/v7NdmWSmlLYPO/LIkna1UsHOISwa6LzxMZSYVjBFi+dtgQeT3OExSu/wZDNskgIq3PVI+gO27YRsOMJ0E8JpRtI5xMxH9d7/CaKGb/4HZXsLitgQmiKUb2hGmGqArUcEVQ/djrBsjjnE1hKdr7G+Zs9NOg+dt35I3B8RU4wQKlEnCHcDQjaIYp01MJKf37E9nJGcLoimE15IJNhQ5YqgHpBNbyiOF8TcSlkyr0Ovq1MlWUMWxvvZMyeMEZs1cz8hInz9ot4PtA3ZeBDxQj512XnvUg4TVoHkRP1/CLIaSorzcaYy5wcIgWekBZGQiY8kNNX+FvUtombyvisZktBUidl4Qk6vhESuKsP+Uib5dZtg2UiOqO6Kl8NINOv7Fxg2p+6V3joSu+uVxUNdCsuCYkH5Lf4G+m17h/bjE/HIDYcZuTv7lb8Awfc9T7D01xYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b4669f83fd36249fe54eac24c122d354/cbe2e/docker_host02.webp 148w,
/static/b4669f83fd36249fe54eac24c122d354/3084c/docker_host02.webp 295w,
/static/b4669f83fd36249fe54eac24c122d354/5ca24/docker_host02.webp 590w,
/static/b4669f83fd36249fe54eac24c122d354/117a4/docker_host02.webp 609w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b4669f83fd36249fe54eac24c122d354/12f09/docker_host02.png 148w,
/static/b4669f83fd36249fe54eac24c122d354/e4a3f/docker_host02.png 295w,
/static/b4669f83fd36249fe54eac24c122d354/fcda8/docker_host02.png 590w,
/static/b4669f83fd36249fe54eac24c122d354/d0d8c/docker_host02.png 609w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b4669f83fd36249fe54eac24c122d354/fcda8/docker_host02.png&quot;
            alt=&quot;add sdk&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Docker Composeを選んで&lt;code class=&quot;language-text&quot;&gt;New&lt;/code&gt;ボタンを押下&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 452px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/84dfa4a469fbda56983273a67572af3b/fcb94/docker_host01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 114.86486486486487%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACKUlEQVR42rVV2XKjMBDkS1KpDZjbGDCHOEwwjpNNnrf2/79kMj0Cm3jXR1LJQ5eEYFo9o9ZgOOqV3LQkO1rTnR18GfdOSGYQk2FGOS2SUmBGGZmrfIZMr90KjjHcrKa4HQhj0j2RVzSHDRaJEthpdQVKgG8NRwh3FKqOlnUv5GH1SPFmoIifMZ8CzmINVCLCwALUBUyI4CVDiPjZLze0bLbkY34BbtEeCaf0VgpkPfn8MqofZXTzhgmHqwg41lnXI2FcksWS7zvUsdFEvBsKLDUca6NRfsC8jtOaKLQQ1PaibMUpopYOk1pxIaOX1+Tn2KzheUMOb+ohzZMNjoQc6LM61A51C5VO2WKVdtOTu92T2+/JG555/kT27oXHZ3qoO/o1g8VncaghdozbLZNCIStt9SkvkkKnnY4qUjVLebJLqcUwh9gGacIuKXzIKZmrQlQfg6oztfvXQgYCkSLIoDDrX9iDO0oYE4EFF/Cmycn64b1wdGI/SVn8xmnCi4JSexDewqEgC7yHTwNed6b1E9j6UJSQQAEkwy5WnB9SlhT548nwi/+crCjkjVCu8ZTLDwTngs59g5IgXanhJZKv4BsJ1Q8SXqrPpwlRSJyO3NGxY1xFPMOsEQshPBbxfYVtYM5bCGEjK9VN1T65ikYgzaCjB/4nXFdWkJ1VlOx/U//nL0XDngLuoenwRmtGyHMDPdAd070F0jMr/l1wu/PURro1bhYuh5e39A6bZdiFMoA56QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/84dfa4a469fbda56983273a67572af3b/cbe2e/docker_host01.webp 148w,
/static/84dfa4a469fbda56983273a67572af3b/3084c/docker_host01.webp 295w,
/static/84dfa4a469fbda56983273a67572af3b/97d89/docker_host01.webp 452w&quot;
              sizes=&quot;(max-width: 452px) 100vw, 452px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/84dfa4a469fbda56983273a67572af3b/12f09/docker_host01.png 148w,
/static/84dfa4a469fbda56983273a67572af3b/e4a3f/docker_host01.png 295w,
/static/84dfa4a469fbda56983273a67572af3b/fcb94/docker_host01.png 452w&quot;
            sizes=&quot;(max-width: 452px) 100vw, 452px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/84dfa4a469fbda56983273a67572af3b/fcb94/docker_host01.png&quot;
            alt=&quot;add sdk&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;API URLを指定する箇所があるのでVMのURLを設定する&lt;/p&gt;
&lt;h2&gt;VMからの操作&lt;/h2&gt;
&lt;p&gt;そのままコマンド実行するとdocker daemonの起動オプションを変えたのでエラーが出る&lt;/p&gt;
&lt;h3&gt;エラー&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR: Couldn&apos;t connect to Docker daemon at http+docker://localhost - is it running?

If it&apos;s at a non-standard location, specify the URL with the DOCKER_HOST environment variable.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;対応&lt;/h3&gt;
&lt;p&gt;実行時に&lt;code class=&quot;language-text&quot;&gt;DOCKER_HOST&lt;/code&gt;の値を読みに行き、設定があれば問い合わせるようになっている&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;export DOCKER_HOST=192.168.30.95:2375&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでVMからのdockerコマンドの実行も問題なく実行できるようになった&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ES2015のMap,Setで重複カット]]></title><description><![CDATA[Set,Mapを使うことで今までごにょごにょしてた部分がスッキリ書けるようになる Set Map あまり観測範囲で使っているの見ないが便利なので使っていきたい]]></description><link>https://til.swfz.io/entries/node_map/</link><guid isPermaLink="false">https://til.swfz.io/entries/node_map/</guid><pubDate>Mon, 29 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Set,Mapを使うことで今までごにょごにょしてた部分がスッキリ書けるようになる&lt;/p&gt;
&lt;h2&gt;Set&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; allNames &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;d&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; names &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;allNames&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [&apos;a&apos;,&apos;b&apos;,&apos;c&apos;,&apos;d&apos;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Map&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; uniq &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; users &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;aaa&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;aaa&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;bbb&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;fuga&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; u &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; users&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  uniq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; u&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uniq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  { id: &apos;aaa&apos;, name: &apos;hoge&apos; },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  { id: &apos;bbb&apos;, name: &apos;fuga&apos; },&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uniq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [Map Entries] {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   [ &apos;aaa&apos;, { id: &apos;aaa&apos;, name: &apos;hoge&apos; } ],&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   [ &apos;bbb&apos;, { id: &apos;bbb&apos;, name: &apos;fuga&apos; } ]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// }&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uniq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 2&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;あまり観測範囲で使っているの見ないが便利なので使っていきたい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Python3でAnsibleを実行する際のエラー対応]]></title><description><![CDATA[なんとなくAnsibleの実行環境をPython3にして実行してみたら見事エラーで死亡したのでその際の対応ログ has_keyがない ということで Python3での実行に対応するには もしくは の対応が必要]]></description><link>https://til.swfz.io/entries/ansible_with_python3/</link><guid isPermaLink="false">https://til.swfz.io/entries/ansible_with_python3/</guid><pubDate>Wed, 24 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;なんとなくAnsibleの実行環境をPython3にして実行してみたら見事エラーで死亡したのでその際の対応ログ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;fatal: [localhost]: FAILED! =&gt; {&quot;msg&quot;: &quot;The conditional check &apos;ansible_env.has_key(&apos;CI&apos;) and ansible_env.CI != \&quot;true\&quot;&apos; failed. The error was: error while evaluating conditional (ansible_env.has_key(&apos;CI&apos;) and ansible_env.CI != \&quot;true\&quot;): &apos;dict object&apos; has no attribute &apos;has_key&apos;\n\nThe error appears to be in &apos;/usr/local/src/ansible/roles/common/tasks/redhat.yml&apos;: line 63, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: disable SELinux\n  ^ here\n&quot;}&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;has_keyがない&lt;/p&gt;
&lt;p&gt;ということで&lt;/p&gt;
&lt;p&gt;Python3での実行に対応するには&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt; ansible_env.has_key(&apos;CI&apos;)
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; &apos;CI&apos; in ansible_env&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もしくは&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-diff line-numbers&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt; ansible_env.has_key(&apos;CI&apos;)
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; ansible_env.get(&apos;CI&apos;, None)&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;の対応が必要&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gatsby v2でwrapPageElementを使う]]></title><description><![CDATA[的なコンポーネントを一ヵ所で設定したくて調べてみると Gatsby Browser APIs | GatsbyJS…]]></description><link>https://til.swfz.io/entries/gatsby_v2_wrap_page_element/</link><guid isPermaLink="false">https://til.swfz.io/entries/gatsby_v2_wrap_page_element/</guid><pubDate>Tue, 23 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Layout&lt;/code&gt;的なコンポーネントを一ヵ所で設定したくて調べてみると&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.org/docs/browser-apis/#wrapPageElement&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Gatsby Browser APIs | GatsbyJS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ここで&lt;code class=&quot;language-text&quot;&gt;wrapPageElement&lt;/code&gt;を定義すればよしなにやってくれるようなのでそれっとコピって実行したらエラーが出た&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;success open and validate gatsby-configs - 0.196s

 ERROR

This plugin file is using both CommonJS and ES6 module systems together which we don&apos;t support.
You&apos;ll need to edit the file to use just one or the other.

plugin: /mnt/c/Users/hoge/from-wsl/til/gatsby-browser.js

This didn&apos;t cause a problem in Gatsby v1 so you might want to review the migration doc for this:
https://gatsby.dev/no-mixed-modules&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;書いてあるとおり&lt;code class=&quot;language-text&quot;&gt;require&lt;/code&gt;使う場合は&lt;code class=&quot;language-text&quot;&gt;module.exports&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;import&lt;/code&gt;使う場合は&lt;code class=&quot;language-text&quot;&gt;export default&lt;/code&gt;を使えということらしい&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.org/docs/migrating-from-v1-to-v2/#convert-to-either-pure-commonjs-or-pure-es6&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Migrating from v1 to v2 | GatsbyJS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ということで次のように変えてエラー回避した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gatsby-browser.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-javascript line-numbers&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Layout &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./src/components/layout&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;wrapElement&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Layout &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;Layout&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; wrapElement &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; wrapPageElement &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;対応ページそのまま&lt;code class=&quot;language-text&quot;&gt;export default&lt;/code&gt;でexportしてしまうと呼び出し側で&lt;code class=&quot;language-text&quot;&gt;wrapPageElement&lt;/code&gt;を区別できないので読み込まれない&lt;/p&gt;
&lt;p&gt;named exportで&lt;code class=&quot;language-text&quot;&gt;wrapPageElement&lt;/code&gt;と名前を付けてexportしてあげる&lt;/p&gt;
&lt;p&gt;エラーでも公式へのリンクで対応方法が示されていることが多く進めやすい&lt;/p&gt;
&lt;p&gt;Gatsby今の所やりやすい&lt;/p&gt;</content:encoded></item><item><title><![CDATA[多段SSHをワンライナーで行う]]></title><description><![CDATA[Step Server x.x.x.x VPC内のEC2 10.0.1.2]]></description><link>https://til.swfz.io/entries/multi_ssh_command/</link><guid isPermaLink="false">https://til.swfz.io/entries/multi_ssh_command/</guid><pubDate>Sat, 20 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Step Server&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;x.x.x.x&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;VPC内のEC2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;10.0.1.2&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ssh -i ~/.ssh/hoge.pem  ec2-user@10.0.1.2 -o ProxyCommand=&apos;ssh -i ~/.ssh/hoge.pem -W %h:%p ec2-user@x.x.x.x&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[textlint-filterで使う除外パターン]]></title><description><![CDATA[記事を書いていて良く引っかかるが今のところ自分のスタイルに合っていないので除外している設定を抜粋して残しておく 使っているプラグインは下記 textlint/textlint-filter-rule-node-types textlint/textlint-filter-rule…]]></description><link>https://til.swfz.io/entries/textlint_exclude_rule_pattern/</link><guid isPermaLink="false">https://til.swfz.io/entries/textlint_exclude_rule_pattern/</guid><pubDate>Thu, 18 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;記事を書いていて良く引っかかるが今のところ自分のスタイルに合っていないので除外している設定を抜粋して残しておく&lt;/p&gt;
&lt;p&gt;使っているプラグインは下記&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/textlint/textlint-filter-rule-node-types&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;textlint/textlint-filter-rule-node-types&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/textlint/textlint-filter-rule-whitelist&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;textlint/textlint-filter-rule-whitelist&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.textlintrc.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;node-types&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;nodeTypes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; Link
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; Image
  &lt;span class=&quot;token key atrule&quot;&gt;whitelist&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;allow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# はてな記法のイメージ&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /\&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;(.+&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt;)&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;embed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;cite\&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;/
      &lt;span class=&quot;token comment&quot;&gt;# ファイル名のリストは除外&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /.&lt;span class=&quot;token important&quot;&gt;*\.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;js&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;ts&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;yml&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;rb&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;rake&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;/
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /\/etc\/.&lt;span class=&quot;token important&quot;&gt;*/&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;node-types&lt;/h2&gt;
&lt;p&gt;リンク記法と画像の記法の中身は引用などで記事タイトルだったりする場合もあるので除外&lt;/p&gt;
&lt;h2&gt;whitelist&lt;/h2&gt;
&lt;p&gt;whitelistで正規表現を用いてはてな記法での画像も除外&lt;/p&gt;
&lt;p&gt;よく&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;- hoge.html&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;のようにリスト形式でファイル名を表したりする&lt;/p&gt;
&lt;p&gt;ここで技術用語などで引っかかると困るのでこのあたりも特定できる範囲で拡張子を追加して除外&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rubyのitselfメソッド]]></title><description><![CDATA[自分自身を返すというメソッドがある 2.2から追加されたよう Object.itself と組み合わせると要素数などのカウントしたい時とかに簡潔に書くことが出来る からはメソッドが用意されているので文字数カウント的な用途であればこちらを使うほうが簡潔に書ける]]></description><link>https://til.swfz.io/entries/ruby_itself/</link><guid isPermaLink="false">https://til.swfz.io/entries/ruby_itself/</guid><pubDate>Wed, 10 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;自分自身を返す&lt;code class=&quot;language-text&quot;&gt;itself&lt;/code&gt;というメソッドがある&lt;/p&gt;
&lt;p&gt;2.2から追加されたよう&lt;/p&gt;
&lt;p&gt;Object.itself&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;group_by&lt;/code&gt;と組み合わせると要素数などのカウントしたい時とかに簡潔に書くことが出来る&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;group_by&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:itself&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transform_values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# {&quot;a&quot;=&gt;1, &quot;b&quot;=&gt;2, &quot;c&quot;=&gt;1}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Ruby2.7&lt;/code&gt;からは&lt;code class=&quot;language-text&quot;&gt;tally&lt;/code&gt;メソッドが用意されているので文字数カウント的な用途であればこちらを使うほうが簡潔に書ける&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ruby line-numbers&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tally
&lt;span class=&quot;token comment&quot;&gt;# {&quot;a&quot;=&gt;1, &quot;b&quot;=&gt;2, &quot;c&quot;=&gt;1}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item></channel></rss>