<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kengo Hakomori</title>
    <description>The latest articles on Forem by Kengo Hakomori (@kengo_hakomori_1116).</description>
    <link>https://forem.com/kengo_hakomori_1116</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1945453%2F0646b593-b276-41e2-b0da-ac809f32fada.png</url>
      <title>Forem: Kengo Hakomori</title>
      <link>https://forem.com/kengo_hakomori_1116</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kengo_hakomori_1116"/>
    <language>en</language>
    <item>
      <title>Publishing OAS-Based API Doc on GitHub Pages</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Sun, 15 Mar 2026 22:00:22 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/publishing-oas-based-api-doc-on-github-pages-2gb6</link>
      <guid>https://forem.com/kengo_hakomori_1116/publishing-oas-based-api-doc-on-github-pages-2gb6</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mac&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU: Apple M4&lt;/li&gt;
&lt;li&gt;OS: Sequoia 15.1.1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://www.zsh.org" rel="noopener noreferrer"&gt;Zsh&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version: 5.9&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;cURL&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version: &lt;a href="https://github.com/curl/curl/tree/curl-8_11_1" rel="noopener noreferrer"&gt;8.11.1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Docker Desktop&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/desktop/release-notes" rel="noopener noreferrer"&gt;Version&lt;/a&gt;: 4.37.2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/ja/rest" rel="noopener noreferrer"&gt;GitHub API&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/rest/about-the-rest-api/api-versions" rel="noopener noreferrer"&gt;Version&lt;/a&gt;: 2022-11-28&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dir Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── docker
│   ├── .env
│   └── docker-compose.yml
├── index.html
├── nginx.conf
└── openapi
    └── openapi.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  openapi/openapi.yml
&lt;/h3&gt;

&lt;p&gt;* Just a sample.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sample API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/hello&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hello World Request&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;text/plain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;World!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  index.html
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Swagger UI
&lt;/h4&gt;

&lt;p&gt;Most of the content is the same as what is written &lt;a href="https://github.com/swagger-api/swagger-ui/blob/v5.18.2/docs/usage/installation.md" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"SwaggerUI"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;SwaggerUI&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"swagger-ui"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui-bundle.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SwaggerUIBundle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./openapi/openapi.yml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;dom_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#swagger-ui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Updated &lt;strong&gt;url&lt;/strong&gt; to the relative path of the OAS file.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SwaggerUIBundle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="c1"&gt;// before&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://petstore3.swagger.io/api/v3/openapi.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="c1"&gt;// after&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./openapi/openapi.yml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://registry.npmjs.org/swagger-ui-dist" rel="noopener noreferrer"&gt;Using &lt;code&gt;latest&lt;/code&gt; for version specification is also acceptable.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- before --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- after --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@latest/swagger-ui.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- before --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui-bundle.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- after --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@latest/swagger-ui-bundle.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ReDoc
&lt;/h4&gt;

&lt;p&gt;Most of the content is the same as what is written &lt;a href="https://redocly.com/docs/redoc/deployment/html" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Redoc&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- needed for adaptive design --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!--
    Redoc doesn't change outer page styles
    --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;redoc&lt;/span&gt; &lt;span class="na"&gt;spec-url=&lt;/span&gt;&lt;span class="s"&gt;'./openapi/openapi.yml'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/redoc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Updated &lt;strong&gt;spec-url&lt;/strong&gt; to the relative path of the OAS file.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- before --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;redoc&lt;/span&gt; &lt;span class="na"&gt;spec-url=&lt;/span&gt;&lt;span class="s"&gt;'http://petstore.swagger.io/v2/swagger.json'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/redoc&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- after --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;redoc&lt;/span&gt; &lt;span class="na"&gt;spec-url=&lt;/span&gt;&lt;span class="s"&gt;'./openapi/openapi.yml'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/redoc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/Redocly/redoc/blob/v2.2.0/README.md#releases" rel="noopener noreferrer"&gt;Specifying a specific version is also acceptable.&lt;/a&gt;&lt;br&gt;
The list of acceptable versions should match what is written &lt;a href="https://registry.npmjs.org/redoc" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- before --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- after --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.redoc.ly/redoc/v2.0.0/bundles/redoc.standalone.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  nginx.conf
&lt;/h3&gt;

&lt;p&gt;This file is used to serve a preview of the OAS file via Nginx.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/usr/share/nginx/html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nginx.org/en/docs/beginners_guide.html" rel="noopener noreferrer"&gt;The default port used by Nginx is &lt;strong&gt;80&lt;/strong&gt;&lt;/a&gt;, which is the standard port for HTTP.

&lt;ul&gt;
&lt;li&gt;We will continue to use this port even after overriding the config file.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  docker
&lt;/h3&gt;

&lt;p&gt;The Nginx server runs inside a Docker container.&lt;/p&gt;

&lt;h4&gt;
  
  
  ./.env
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HOST_PORT={host-port}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ./docker-compose.yml
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:1.28.2&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${HOST_PORT}:80"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Serve the preview page.&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;../index.html:/usr/share/nginx/html/index.html:ro&lt;/span&gt;
      &lt;span class="c1"&gt;# Serve the OAS file.&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;../openapi:/usr/share/nginx/html/openapi:ro&lt;/span&gt;
      &lt;span class="c1"&gt;# Override the default Nginx configuration.&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;../nginx.conf:/etc/nginx/conf.d/default.conf:ro&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As &lt;a href="https://docs.docker.com/reference/compose-file/services/#image" rel="noopener noreferrer"&gt;image&lt;/a&gt;, we specify &lt;a href="https://hub.docker.com/_/nginx" rel="noopener noreferrer"&gt;the one provided by the official.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.docker.com/engine/storage/volumes/#use-a-read-only-volume" rel="noopener noreferrer"&gt;&lt;code&gt;ro&lt;/code&gt; stands for &lt;strong&gt;read-only&lt;/strong&gt;.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Previewing the OAS file
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the terminal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move the current-dir to the location where &lt;code&gt;docker-compose.yml&lt;/code&gt; is located.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/compose/up/" rel="noopener noreferrer"&gt;Create and start the container.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;The &lt;code&gt;-d&lt;/code&gt; option runs the container in &lt;strong&gt;detached mode&lt;/strong&gt;, allowing the terminal to remain available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the preview page: &lt;code&gt;http://localhost:{host-port}&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check until satisfied.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Close the preview page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/compose/down/" rel="noopener noreferrer"&gt;Stop and remove the container.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Preparation for publication
&lt;/h2&gt;

&lt;p&gt;In order to send some GitHub API requests from a terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personal Access Token
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic" rel="noopener noreferrer"&gt;Create a Personal Access Token (Classic).&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;repo&lt;/code&gt; scope is always required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declaring some variables
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;PERSONAL_ACCESS_TOKEN&amp;gt;&lt;/code&gt;&lt;br&gt;
The personal access token we created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;OWNER&amp;gt;&lt;/code&gt;&lt;br&gt;
The account owner of the repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;REPO&amp;gt;&lt;/code&gt;&lt;br&gt;
The name of the repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;BRANCH&amp;gt;&lt;/code&gt;&lt;br&gt;
The branch name used to publish.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;PERSONAL_ACCESS_TOKEN&amp;gt;"&lt;/span&gt;
&lt;span class="nv"&gt;OWNER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;OWNER&amp;gt;"&lt;/span&gt;
&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REPO&amp;gt;"&lt;/span&gt;
&lt;span class="nv"&gt;BRANCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;BRANCH&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Publishing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Changing repository from private to public
&lt;/h3&gt;

&lt;p&gt;In a free plan account, we cannot publish GitHub Pages from a private repository. Therefore, in this case, &lt;a href="https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#update-a-repository" rel="noopener noreferrer"&gt;we need to update the repository from private to public.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/vnd.github+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-GitHub-Api-Version: 2022-11-28"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.github.com/repos/&lt;/span&gt;&lt;span class="nv"&gt;$OWNER&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "private": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/vnd.github+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-GitHub-Api-Version: 2022-11-28"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.github.com/repos/&lt;/span&gt;&lt;span class="nv"&gt;$OWNER&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "visibility": "public"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://docs.github.com/en/rest/pages/pages?apiVersion=2022-11-28#create-a-github-pages-site" rel="noopener noreferrer"&gt;Activating GitHub Pages&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/vnd.github+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-GitHub-Api-Version: 2022-11-28"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.github.com/repos/&lt;/span&gt;&lt;span class="nv"&gt;$OWNER&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/pages"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{
       &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;build_type&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;legacy&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,
       &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;source&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: {
         &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;branch&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$BRANCH&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,
         &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;
       }
     }"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After GitHub Pages is enabled, the site based on &lt;code&gt;index.html&lt;/code&gt; will be built and deployed. We can check the progress of the build by sending &lt;a href="https://docs.github.com/en/rest/pages/pages?apiVersion=2022-11-28#get-latest-pages-build" rel="noopener noreferrer"&gt;the following request.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/vnd.github+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-GitHub-Api-Version: 2022-11-28"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.github.com/repos/&lt;/span&gt;&lt;span class="nv"&gt;$OWNER&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/pages/builds/latest"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If GitHub Pages is already enabled, the 409 conflict error will be returned.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since the &lt;code&gt;BRANCH&lt;/code&gt; variable is used to specify the branch, the single quotes in the request body must be changed to double quotes. Assuming &lt;code&gt;BRANCH="main"&lt;/code&gt;, the differences are as follows:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BRANCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;

curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="c"&gt;# soft&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{
       &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;build_type&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;legacy&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,
       &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;source&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: {
         &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;branch&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$BRANCH&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,
         &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;
       }
     }"&lt;/span&gt;
  &lt;span class="c"&gt;# hard&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "build_type": "legacy",
    "source": {
      "branch": "main",
      "path": "/"
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The GitHub Pages URL is included in the &lt;code&gt;html_url&lt;/code&gt; property of the response.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://docs.github.com/en/rest/pages/pages?apiVersion=2022-11-28#get-a-github-pages-site" rel="noopener noreferrer"&gt;Retrieving GitHub Pages URL&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/vnd.github+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-GitHub-Api-Version: 2022-11-28"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.github.com/repos/&lt;/span&gt;&lt;span class="nv"&gt;$OWNER&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/pages"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The URL is included in the &lt;code&gt;html_url&lt;/code&gt; property of the response.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.github.com/en/rest/pages/pages?apiVersion=2022-11-28#delete-a-github-pages-site" rel="noopener noreferrer"&gt;Unpublishing&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/vnd.github+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-GitHub-Api-Version: 2022-11-28"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.github.com/repos/&lt;/span&gt;&lt;span class="nv"&gt;$OWNER&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/pages"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Republishing
&lt;/h2&gt;

&lt;p&gt;We just need to send &lt;a href="https://docs.github.com/en/rest/pages/pages?apiVersion=2022-11-28#create-a-github-pages-site" rel="noopener noreferrer"&gt;the same request as when activating the site.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sample Repositories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kengo-hakomori/publishing-oas-based-api-doc-on-github-pages-swagger-ui" rel="noopener noreferrer"&gt;Swagger UI&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kengo-hakomori.github.io/publishing-oas-based-api-doc-on-github-pages-swagger-ui/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/kengo-hakomori/publishing-oas-based-api-doc-on-github-pages-redoc" rel="noopener noreferrer"&gt;ReDoc&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kengo-hakomori.github.io/publishing-oas-based-api-doc-on-github-pages-redoc/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Remark
&lt;/h2&gt;

&lt;p&gt;This publishing procedure does not depend on the number of OAS files. i.e. even if a OAS file is split into multiple files, we can follow this procedure to publish.&lt;/p&gt;

</description>
      <category>swagger</category>
      <category>redoc</category>
      <category>openapi</category>
      <category>github</category>
    </item>
    <item>
      <title>Using cURL Inside a Docker Container</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Mon, 20 Jan 2025 01:05:46 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/using-curl-inside-a-docker-container-302m</link>
      <guid>https://forem.com/kengo_hakomori_1116/using-curl-inside-a-docker-container-302m</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mac&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU: Apple M4&lt;/li&gt;
&lt;li&gt;OS: Sequoia 15.1.1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://www.zsh.org" rel="noopener noreferrer"&gt;Zsh&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version: 5.9&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Docker Desktop&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/desktop/release-notes" rel="noopener noreferrer"&gt;Version&lt;/a&gt;: 4.37.2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open a terminal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move to the dir containing the files used by cURL, if necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the container with cURL installed and enter it.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/work"&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; /work curlimages/curl:latest sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use cURL until satisfied.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exit the container.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/image/rm" rel="noopener noreferrer"&gt;Remove the Docker Image&lt;/a&gt;, if necessary.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker rmi curlimages/curl:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://docs.docker.com/reference/cli/docker/container/run" rel="noopener noreferrer"&gt;Start the container with cURL installed and enter it.&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://docs.docker.com/reference/cli/docker/container/run/#rm" rel="noopener noreferrer"&gt;--rm&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This option is used to automatically remove the container (and its associated anonymous volumes) after it stops running. Since a container created to execute cURL does not need to be retained after execution, this option ensures the system is kept clean.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;-it&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This option consists of &lt;a href="https://docs.docker.com/reference/cli/docker/container/run/#interactive" rel="noopener noreferrer"&gt;-i&lt;/a&gt; and &lt;a href="https://docs.docker.com/reference/cli/docker/container/run/#tty" rel="noopener noreferrer"&gt;-t&lt;/a&gt;. &lt;code&gt;-i&lt;/code&gt; option enables STDIN within a container, and &lt;code&gt;-t&lt;/code&gt; option attaches a pseudo-TTY to the container.&lt;/p&gt;

&lt;p&gt;If we run the command without &lt;code&gt;-i&lt;/code&gt; option (i.e. with only &lt;code&gt;-t&lt;/code&gt; option), a pseudo-TTY will be allocated and the shell will start, but no commands can be accepted and we cannot continue the operation because STDIN is disabled. To forcefully exit from a container in this state, &lt;a href="https://github.com/moby/moby/blob/v27.5.0/cmd/dockerd/trap/trap.go" rel="noopener noreferrer"&gt;we need to send three consecutive &lt;code&gt;SIGINT&lt;/code&gt; signals by pressing &lt;code&gt;cmd + .&lt;/code&gt; same times.&lt;/a&gt;  And this exiting does not trigger the automatic container removal provided by &lt;code&gt;--rm&lt;/code&gt; option, so we need to trigger it by &lt;a href="https://docs.docker.com/reference/cli/docker/container/stop" rel="noopener noreferrer"&gt;stopping the container&lt;/a&gt; or &lt;a href="https://docs.docker.com/reference/cli/docker/container/rm" rel="noopener noreferrer"&gt;remove the container directly.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we run the command without &lt;code&gt;-t&lt;/code&gt; option (i.e. with only &lt;code&gt;-i&lt;/code&gt; option), we can run commands using STDIN, but operations that rely on interpreting ANSI escape sequences cannot be performed because a pseudo-TTY is not attached. For example, we will be unable to move the cursor using keyboard, and output results will not be colorized.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://docs.docker.com/reference/cli/docker/container/run/#volume" rel="noopener noreferrer"&gt;-v&lt;/a&gt; "$PWD:/work"
&lt;/h3&gt;

&lt;p&gt;This option is used to mount a dir from the host machine into a container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-v&lt;/span&gt; &amp;lt;host-dir-path&amp;gt;:&amp;lt;container-dir-path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$PWD&lt;/code&gt; is an env variable supported by POSIX-compliant shells, representing the &lt;strong&gt;P&lt;/strong&gt;resent &lt;strong&gt;W&lt;/strong&gt;orking &lt;strong&gt;D&lt;/strong&gt;irectory on the host machine. In this article, the command is executed in Zsh, which also supports this env variable.&lt;/p&gt;

&lt;p&gt;The purpose of using this option is to allow the container to access files located on the host machine. For instance, when transferring files with the &lt;code&gt;-T&lt;/code&gt; option in cURL, it ensures that host files can be referenced directly from the container.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://docs.docker.com/reference/cli/docker/container/run/#workdir" rel="noopener noreferrer"&gt;-w&lt;/a&gt; /work
&lt;/h3&gt;

&lt;p&gt;By specifying this option, we can set the dir, mounted from the host dir, as the current dir.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://hub.docker.com/r/curlimages/curl" rel="noopener noreferrer"&gt;curlimages/curl&lt;/a&gt;:latest
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;official docker image for curl&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  sh
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sh&lt;/code&gt; command is executed in a container when explicitly specified in &lt;code&gt;docker run&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS] IMAGE &lt;span class="o"&gt;[&lt;/span&gt;COMMAND] &lt;span class="o"&gt;[&lt;/span&gt;ARG...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By specifying &lt;code&gt;sh&lt;/code&gt; in the &lt;code&gt;[COMMAND]&lt;/code&gt; section, a shell is launched immediately after the container starts, allowing us to execute subsequent commands interactively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test
&lt;/h2&gt;

&lt;p&gt;For example, If we want to test sending HTTP requests, we can use the service &lt;a href="https://httpbin.org" rel="noopener noreferrer"&gt;httpbin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>curl</category>
      <category>docker</category>
    </item>
    <item>
      <title>Display Dir Structure in Tree Format.</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Mon, 09 Dec 2024 01:05:31 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/display-dir-structure-in-tree-format-4j04</link>
      <guid>https://forem.com/kengo_hakomori_1116/display-dir-structure-in-tree-format-4j04</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mac&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU: Apple M4&lt;/li&gt;
&lt;li&gt;OS: Sequoia 15.1.1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://www.zsh.org" rel="noopener noreferrer"&gt;Zsh&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version: 5.9&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://brew.sh" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version: 4.4.10&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sample
&lt;/h2&gt;

&lt;p&gt;Run the following command to create the sample directories and files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ./dir1/dir2
&lt;span class="nb"&gt;touch&lt;/span&gt; ./file0.txt ./dir1/file1.txt ./dir1/dir2/file2.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;a href="https://formulae.brew.sh/formula/tree" rel="noopener noreferrer"&gt;&lt;code&gt;tree&lt;/code&gt; command.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;tree
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;We can check the version of this command by running the following command.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;As of the time of writing, the version is &lt;strong&gt;2.2.1&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the command.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;The result is as follow.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── dir1
│   ├── dir2
│   │   └── file2.txt
│   └── file1.txt
└── file0.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Manual
&lt;/h2&gt;

&lt;p&gt;Running the following command will display the manual page for the &lt;code&gt;tree&lt;/code&gt; command in Zsh.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;man tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After reading, press the &lt;code&gt;q&lt;/code&gt; key to return to Zsh.&lt;/p&gt;

&lt;p&gt;The source for &lt;code&gt;tree&lt;/code&gt; v2.2.1 manual is &lt;a href="https://github.com/Old-Man-Programmer/tree/blob/d501b58ff9cbfd64272c8cbcad0bda36a3fada06/doc/tree.1" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zsh</category>
      <category>cli</category>
    </item>
    <item>
      <title>Swagger UI + Docker: Initial Setup</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Mon, 14 Oct 2024 01:54:52 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/swagger-ui-docker-initial-setup-11np</link>
      <guid>https://forem.com/kengo_hakomori_1116/swagger-ui-docker-initial-setup-11np</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mac&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU: Apple M1&lt;/li&gt;
&lt;li&gt;OS: Sonoma 14.6.1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Docker Desktop&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/desktop/release-notes" rel="noopener noreferrer"&gt;Version&lt;/a&gt;: 4.34.2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dir Structure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xfkrbrzp07ixs4mw6i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xfkrbrzp07ixs4mw6i3.png" alt="dir-structure" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;* Drawn by &lt;a href="https://mermaid.js.org/" rel="noopener noreferrer"&gt;mermaid&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD;
    subgraph top["top"]
        subgraph docker["docker"]
            env[".env"]
            docker_compose["docker-compose.yml"]
        end
        subgraph openapi["openapi"]
            openapi_file["openapi.yml"]
        end
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  docker/.env
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SWAGGER_UI_HOST_PORT={host-port}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  docker/docker-compose.yml
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;swagger-ui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;swaggerapi/swagger-ui:v5.17.14&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;SWAGGER_JSON&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/oas/openapi.yml&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${SWAGGER_UI_HOST_PORT}:8080"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;../openapi:/oas&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As &lt;a href="https://docs.docker.com/reference/compose-file/services/#image" rel="noopener noreferrer"&gt;image&lt;/a&gt;, We specify &lt;a href="https://hub.docker.com/r/swaggerapi/swagger-ui" rel="noopener noreferrer"&gt;the one provided by the official.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hub.docker.com/layers/swaggerapi/swagger-ui/latest/images/sha256-b51a2fae1e215d40a262bc4ddf33ea1c557530b6b2adf88ef3ab097cd284ff95" rel="noopener noreferrer"&gt;If the version is specified as &lt;code&gt;latest&lt;/code&gt;, the image will be created based on the latest version.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As &lt;a href="https://docs.docker.com/reference/compose-file/services/#environment" rel="noopener noreferrer"&gt;environment&lt;/a&gt;, we specify the absolute path of the OAS file mounted inside the Docker container.&lt;br&gt;
The reason why &lt;a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/installation/#docker" rel="noopener noreferrer"&gt;the property name&lt;/a&gt; contains the string 'JSON' is that in the early days, only the &lt;code&gt;.json&lt;/code&gt; extension was used for the file.&lt;br&gt;
Now that &lt;code&gt;.yml&lt;/code&gt; can also be used, even if the property name does not include the string 'YAML', we can still specify the path of a &lt;code&gt;.yml&lt;/code&gt; file there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As &lt;a href="https://docs.docker.com/reference/compose-file/services/#ports" rel="noopener noreferrer"&gt;ports&lt;/a&gt;, we specify port &lt;code&gt;8080&lt;/code&gt; mentioned in &lt;a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/installation/#docker" rel="noopener noreferrer"&gt;the documentation&lt;/a&gt; as the container port.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As &lt;a href="https://docs.docker.com/reference/compose-file/services/#volumes" rel="noopener noreferrer"&gt;volumes&lt;/a&gt;, we share the OAS file between the host machine and the Docker container.&lt;br&gt;
This mapping allows the file on the host machine to be accessible inside the container.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  openapi/openapi.yml
&lt;/h3&gt;

&lt;p&gt;Define a minimal API documentation conforming to &lt;a href="https://spec.openapis.org/oas/v3.0.3.html" rel="noopener noreferrer"&gt;OAS 3.0.3&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sample API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/hello&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hello World Request&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;text/plain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;World!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create Container and Image.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the terminal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move the current-dir to the location where &lt;code&gt;docker-compose.yml&lt;/code&gt; is located.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute &lt;a href="https://docs.docker.com/reference/cli/docker/compose/create/" rel="noopener noreferrer"&gt;docker compose create.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose create
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Open Swagger UI.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Start the container.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose start
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open &lt;code&gt;http://localhost:{SWAGGER_UI_HOST_PORT}&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop the container once satisfied.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>swagger</category>
      <category>openapi</category>
      <category>docker</category>
    </item>
    <item>
      <title>MySQL + Docker: Initial Setup</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Mon, 30 Sep 2024 11:24:16 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/mysql-docker-initial-setup-43n6</link>
      <guid>https://forem.com/kengo_hakomori_1116/mysql-docker-initial-setup-43n6</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mac&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU: Apple M1&lt;/li&gt;
&lt;li&gt;OS: Sonoma 14.6.1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Docker Desktop&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/desktop/release-notes" rel="noopener noreferrer"&gt;Version&lt;/a&gt;: 4.34.2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dir Structure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvjdn0sae0pjeygos8me.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvjdn0sae0pjeygos8me.png" alt="dir-structure" width="800" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;* Drawn by &lt;a href="https://mermaid.js.org/" rel="noopener noreferrer"&gt;mermaid&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TB;
    subgraph "top"
        A["docker-compose.yml"]
        B[".env"]
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  docker-compose.yml
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0.39&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${MYSQL_HOST_PORT}:3306"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db-data:/var/lib/mysql&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Structure
&lt;/h4&gt;

&lt;p&gt;First, &lt;strong&gt;Define required attributes.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0.39&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As &lt;a href="https://docs.docker.com/reference/compose-file/services/#image" rel="noopener noreferrer"&gt;image&lt;/a&gt;, we specify &lt;a href="https://hub.docker.com/_/mysql/" rel="noopener noreferrer"&gt;MySQL Docker Official Image&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://hub.docker.com/layers/library/mysql/latest/images/sha256-0cf8b60f74e235c4dd4beb762b10ec6da3dce30265f5f1d40c2c11fa7872ebd9" rel="noopener noreferrer"&gt;If the version of MySQL is specified as &lt;code&gt;latest&lt;/code&gt;, the image will be created based on the latest version.&lt;/a&gt;&lt;br&gt;
The latest version as of this writing is &lt;a href="https://dev.mysql.com/doc/relnotes/mysql/9.0/en/news-9-0-1.html" rel="noopener noreferrer"&gt;9.0.1.&lt;/a&gt;&lt;br&gt;
The reason for specifying version &lt;a href="https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-39.html" rel="noopener noreferrer"&gt;8.0.39&lt;/a&gt; is that &lt;a href="https://www.mysql.com/support/supportedplatforms/workbench.html" rel="noopener noreferrer"&gt;it is the most recent version compatible with MySQL Workbench.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As &lt;a href="https://docs.docker.com/reference/compose-file/services/#environment" rel="noopener noreferrer"&gt;environment&lt;/a&gt;, we set the root user password.&lt;br&gt;
&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/default-privileges.html" rel="noopener noreferrer"&gt;The root user is automatically created when MySQL is installed.&lt;/a&gt;&lt;br&gt;
The list of environment variables that can be specified is written in &lt;a href="https://hub.docker.com/_/mysql/" rel="noopener noreferrer"&gt;docker hub&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, &lt;strong&gt;Mapping ports.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0.39&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;
    &lt;span class="c1"&gt;# new attribute.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${MYSQL_HOST_PORT}:3306"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_port" rel="noopener noreferrer"&gt;&lt;code&gt;3306&lt;/code&gt; is the default port number for MySQL to listen on for TCP/IP.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This port is used by &lt;a href="https://www.mysql.com/jp/products/workbench/" rel="noopener noreferrer"&gt;MySQL Workbench&lt;/a&gt; to connect to the container.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, &lt;strong&gt;Make DB data persistent.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0.39&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${MYSQL_HOST_PORT}:3306"&lt;/span&gt;
    &lt;span class="c1"&gt;# new attribute.&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db-data:/var/lib/mysql&lt;/span&gt;

&lt;span class="c1"&gt;# new element.&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create persistent data stores by defining &lt;a href="https://docs.docker.com/reference/compose-file/volumes/" rel="noopener noreferrer"&gt;volumes element.&lt;/a&gt;&lt;br&gt;
In this case, we create the volume named &lt;code&gt;db-data&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/selinux-file-context.html" rel="noopener noreferrer"&gt;The default data-dir for MySQL is &lt;code&gt;/var/lib/mysql&lt;/code&gt;&lt;/a&gt; and we mount it to &lt;a href="https://docs.docker.com/reference/compose-file/services/#volumes" rel="noopener noreferrer"&gt;the volume.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  .env
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MYSQL_HOST_PORT={host-port}
MYSQL_ROOT_PASSWORD={root-user-password}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create Container, Image, and Volume.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the terminal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move the current-dir to the location where &lt;code&gt;docker-compose.yml&lt;/code&gt; is located.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute &lt;a href="https://docs.docker.com/reference/cli/docker/compose/create/" rel="noopener noreferrer"&gt;docker compose create.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose create
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Check the Version of MySQL.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/compose/start/" rel="noopener noreferrer"&gt;Start the container.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose start
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/container/ls/" rel="noopener noreferrer"&gt;Check the name of the container.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;The &lt;code&gt;Names&lt;/code&gt; column corresponds to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_version" rel="noopener noreferrer"&gt;the version&lt;/a&gt; &lt;a href="https://docs.docker.com/reference/cli/docker/container/exec/" rel="noopener noreferrer"&gt;in the container.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;container-name&amp;gt; mysql &lt;span class="nt"&gt;-V&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;For example, the following response is returned.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql  Ver 8.0.39 for Linux on aarch64 (MySQL Community Server - GPL)
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/compose/stop/" rel="noopener noreferrer"&gt;Stop the container.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  MySQL Workbench
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Download.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://dev.mysql.com/downloads/workbench/" rel="noopener noreferrer"&gt;Download.&lt;/a&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9azd6q1p9tatpzstn8jt.png" alt="workbench_download" width="800" height="446"&gt;
The version to be downloaded is &lt;code&gt;8.0.38&lt;/code&gt;.
The M1 chip uses the ARM architecture, so the appropriate one is &lt;code&gt;macOS (ARM, 64-bit), DMG Archive&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Add Connection.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Start the container to connect to MySQL.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose start
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open it and Click the PLUS button.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryw3tvgy2t2en1k5gpdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryw3tvgy2t2en1k5gpdp.png" alt="Workbench_top" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The following dialog opens.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2r3uthx85tg4moxk34v8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2r3uthx85tg4moxk34v8.png" alt="workbench_setup-new-connection" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter any value for &lt;strong&gt;Connection Name&lt;/strong&gt;, and update &lt;strong&gt;Port&lt;/strong&gt; with &lt;code&gt;.env.MYSQL_HOST_PORT&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the Test Connection button.&lt;br&gt;
After entering &lt;code&gt;.env.MYSQL_ROOT_PASSWORD&lt;/code&gt;, a connection test will be conducted.&lt;br&gt;
If successful, click the OK button to close this dialog.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop the container.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Operate.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Start the container.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose start
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the connection.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdykim9ja2c8ma0c6m3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdykim9ja2c8ma0c6m3e.png" alt="workbench_top_after" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter &lt;code&gt;.env.MYSQL_ROOT_PASSWORD&lt;/code&gt; if not saved in keychain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Operate until satisfied.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkf2tc33esruxlbzoeac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkf2tc33esruxlbzoeac.png" alt="workbench_main" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop the container.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>mysql</category>
      <category>docker</category>
      <category>macos</category>
    </item>
    <item>
      <title>Optimize Huge Virtual Hard Disk.</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Mon, 16 Sep 2024 04:10:38 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/optimize-huge-virtual-hard-disk-2ji</link>
      <guid>https://forem.com/kengo_hakomori_1116/optimize-huge-virtual-hard-disk-2ji</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/desktop/install/windows-install" rel="noopener noreferrer"&gt;Docker Desktop for Windows&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/desktop/release-notes" rel="noopener noreferrer"&gt;Version&lt;/a&gt;: 4.29.0?
(I accidentally upgraded it before writing this article.)&lt;/li&gt;
&lt;li&gt;Used backend: WSL2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Windows&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edition: 11 Pro&lt;/li&gt;
&lt;li&gt;Version: 23H2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Target File Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Users\{user}\AppData\Local\Docker\wsl\data\ext4.vhdx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Docker Desktop for Windows uses a virtual machine (typically virtualization technologies like &lt;a href="https://learn.microsoft.com/en-us/windows/wsl" rel="noopener noreferrer"&gt;WSL&lt;/a&gt; or &lt;a href="https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows" rel="noopener noreferrer"&gt;Hyper-V&lt;/a&gt;) to run Linux containers on Windows.&lt;br&gt;
The file system used within this virtual machine is generally in the &lt;strong&gt;ext4&lt;/strong&gt; format, which is commonly used in Linux.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VHDX&lt;/strong&gt; is a type of virtual hard disk format developed by Microsoft, used as a disk image for virtual machines in virtualized environments.&lt;br&gt;
Docker Desktop for Windows uses this format files to provide storage for Linux containers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ext4.vhdx&lt;/strong&gt; is a virtual hard disk in VHDX format that hosts the ext4 file system.&lt;br&gt;
Docker Desktop for Windows uses this file to store data such as containers, images, and volumes that are mounted.&lt;br&gt;
This file will grow as the disk usage by WSL2 (i.e. Docker Desktop for Windows) increases, but &lt;strong&gt;it will not automatically shrink even if the disk usage decreases.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Remove Dangling Docker Objects.
&lt;/h2&gt;

&lt;p&gt;As written above, doing this does not reduce the size of &lt;code&gt;ext4.vhdx&lt;/code&gt;.&lt;br&gt;
However, doing this makes optimization more efficient.&lt;/p&gt;

&lt;p&gt;We simply open PowerShell and execute following commands.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/image/prune" rel="noopener noreferrer"&gt;Remove dangling images.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prune&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/reference/cli/docker/builder/prune" rel="noopener noreferrer"&gt;Remove dangling build cache.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prune&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Optimizing with &lt;a href="https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/diskpart" rel="noopener noreferrer"&gt;diskpart&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open PowerShell as admin.&lt;br&gt;
The reason for admin is that &lt;a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/user-account-control" rel="noopener noreferrer"&gt;UAC&lt;/a&gt; pops up and Command Prompt opens if we start diskpart as a normal user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shut down WSL to block access from it to a virtual hard disk.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--shutdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter diskpart.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;diskpart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Specify the virtual hard disk to be optimized.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"C:\Users\{user}\AppData\Local\Docker\wsl\data\ext4.vhdx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attach the specified virtual hard disk.&lt;br&gt;
Since there is no need to change that data, we do it as read-only to prevent operational errors.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;attach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;readonly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimize.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;compact&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Detach the specified virtual hard disk.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;detach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exit diskpart.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;exit&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Optimizing with &lt;a href="https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows" rel="noopener noreferrer"&gt;Hyper-V&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;* &lt;a href="https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v#check-requirements" rel="noopener noreferrer"&gt;The Hyper-V does not exist on Home Edition.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to activate Hyper-V before we optimize.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open &lt;code&gt;Turn Windows features on or off&lt;/code&gt; dialog.&lt;br&gt;
We just press the &lt;code&gt;Windows&lt;/code&gt; key and the &lt;code&gt;R&lt;/code&gt; key at the same time, then input &lt;code&gt;optionalfeatures&lt;/code&gt; and click &lt;code&gt;OK&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ewm43o9ejrok58brygr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ewm43o9ejrok58brygr.png" alt="optionalfeatures" width="572" height="338"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Turn on Hyper-V.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fww5d4pz3m91gmpigq0bv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fww5d4pz3m91gmpigq0bv.png" alt="Turn-on_Hyper-V" width="462" height="407"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now we can execute the command to optimize it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open PowerShell as admin.&lt;br&gt;
This is because the command can only be executed by admin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shut down WSL to block access from it to a virtual hard disk.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--shutdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Move current dir to the location where &lt;code&gt;ext4.vhdx&lt;/code&gt; is located.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Users\&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="n"&gt;\AppData\Local\Docker\wsl\data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/powershell/module/hyper-v/optimize-vhd" rel="noopener noreferrer"&gt;Optimize.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/powershell/module/hyper-v/optimize-vhd#-mode" rel="noopener noreferrer"&gt;Since VHDX is optimized in &lt;code&gt;Quick&lt;/code&gt; mode by default, we will specify &lt;code&gt;Full&lt;/code&gt; mode explicitly for maximum optimization.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Optimize-VHD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\ext4.vhdx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Full&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>docker</category>
      <category>windows</category>
    </item>
    <item>
      <title>Identify Which Files are Large.</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Sat, 07 Sep 2024 12:17:15 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/identify-which-files-are-large-2gbo</link>
      <guid>https://forem.com/kengo_hakomori_1116/identify-which-files-are-large-2gbo</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edition: 11 Pro&lt;/li&gt;
&lt;li&gt;Version: 23H2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_editions" rel="noopener noreferrer"&gt;PowerShell&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edition: Desktop&lt;/li&gt;
&lt;li&gt;Version: 5.1.22621.4111&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Target Dir Example
&lt;/h2&gt;

&lt;p&gt;C drive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open PowerShell as administrator.&lt;br&gt;
Some files require admin auth to retrieve info.&lt;br&gt;
Thus, by doing so, these are more accurate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute the following command.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="bp"&gt;$null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the result.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5crb8q1hzy335pl8ier.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5crb8q1hzy335pl8ier.png" alt="result" width="703" height="128"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Execute the Most Basic Command.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem" rel="noopener noreferrer"&gt;Get-ChildItem&lt;/a&gt; is a &lt;a href="https://learn.microsoft.com/en-us/powershell/scripting/powershell-commands" rel="noopener noreferrer"&gt;cmdlet&lt;/a&gt; that specifies a dir path and retrieves information about files and directories at that path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem#-path" rel="noopener noreferrer"&gt;Specifying nothing is the same as specifying current dir.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our target is C drive in this example, so we of course specify it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Include Hidden Items as well.
&lt;/h3&gt;

&lt;p&gt;Hidden files are not reduced to zero size.&lt;br&gt;
Thus, &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem#-force" rel="noopener noreferrer"&gt;we need to retrieve those as well.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Select Information We Want.
&lt;/h3&gt;

&lt;p&gt;As I write this, the default output properties do not include file size.&lt;br&gt;
So we will use &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object" rel="noopener noreferrer"&gt;Select-Object&lt;/a&gt; to include it in the output.&lt;br&gt;
&lt;code&gt;Name&lt;/code&gt; property is included in the default output, so we will include that as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-member" rel="noopener noreferrer"&gt;Get-Member&lt;/a&gt; to find out the names of the properties we can specify.&lt;br&gt;
We can also add &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-member#-membertype" rel="noopener noreferrer"&gt;-MemberType&lt;/a&gt; to remove non-properties, and if we want to know the meaning of each element we can specify as &lt;code&gt;-MemberType&lt;/code&gt;, we can check &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.psmembertypes" rel="noopener noreferrer"&gt;the other page&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sort by Size.
&lt;/h3&gt;

&lt;p&gt;Our goal is to identify files that are large.&lt;br&gt;
For this purpose, &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/sort-object" rel="noopener noreferrer"&gt;the output should be ordered by size.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Filter Only Larger.
&lt;/h3&gt;

&lt;p&gt;It is enough for us to check only large files.&lt;br&gt;
In other words, we do not need to check small ones.&lt;/p&gt;

&lt;p&gt;In this example, we consider displaying the top 3 files.&lt;br&gt;
And we can use &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object#-first" rel="noopener noreferrer"&gt;&lt;code&gt;-First&lt;/code&gt; option of &lt;code&gt;Select-Oblect&lt;/code&gt;.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By applying this after &lt;code&gt;Sort-Object&lt;/code&gt;, we can retrieve the first elements for the array after it has been ordered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search Recursively.
&lt;/h3&gt;

&lt;p&gt;Targeting the C drive means, of course, targeting within the folders on the C drive as well.&lt;br&gt;
We can do it by adding option &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem#-recurse" rel="noopener noreferrer"&gt;-Recurse&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Index can save PowerShell from overwork.&lt;br&gt;
This is why we did not add this option in first step.&lt;/p&gt;
&lt;h3&gt;
  
  
  Get Absolute Path.
&lt;/h3&gt;

&lt;p&gt;Since it is a recursive search, without the absolute path of the file, we cannot arrive to it.&lt;br&gt;
To do so, we can replace &lt;code&gt;Name&lt;/code&gt; with &lt;code&gt;FullName&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Supress Premission Denied.
&lt;/h3&gt;

&lt;p&gt;There are some items that cannot be retrieved.&lt;br&gt;
Their absolute paths are revealed by the error stream, but the size is not written of course.&lt;br&gt;
So it is natural for us to try to hide them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection#redirectable-output-streams" rel="noopener noreferrer"&gt;Error stream is assigned the number &lt;code&gt;2&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection#powershell-redirection-operators" rel="noopener noreferrer"&gt;we can have them sent to a specified file by the &lt;code&gt;&amp;gt;&lt;/code&gt; redirection operator.&lt;/a&gt;&lt;br&gt;
Furthermore &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection#example-5-suppress-all-write-host-and-information-stream-data" rel="noopener noreferrer"&gt;we can discard them by specifying &lt;code&gt;$null&lt;/code&gt; as specified file.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="bp"&gt;$null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>windows</category>
      <category>powershell</category>
    </item>
    <item>
      <title>Git Command Cheat Sheet</title>
      <dc:creator>Kengo Hakomori</dc:creator>
      <pubDate>Sun, 01 Sep 2024 14:28:18 +0000</pubDate>
      <link>https://forem.com/kengo_hakomori_1116/git-commands-cheat-sheet-33ij</link>
      <guid>https://forem.com/kengo_hakomori_1116/git-commands-cheat-sheet-33ij</guid>
      <description>&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Git

&lt;ul&gt;
&lt;li&gt;Version: 2.45.0&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  git add
&lt;/h3&gt;

&lt;p&gt;Add file contents to staging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &amp;lt;pathspec&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can specify a file path for &lt;code&gt;&amp;lt;pathspec&amp;gt;&lt;/code&gt;.&lt;br&gt;
Or we can add all files insted of a specific file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-add" rel="noopener noreferrer"&gt;Git - git-add Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git branch
&lt;/h3&gt;

&lt;p&gt;List local branches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use option &lt;code&gt;--remotes&lt;/code&gt; in order to list remote branches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;--remotes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-r&lt;/code&gt; instead of &lt;code&gt;--remotes&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-branch" rel="noopener noreferrer"&gt;Git - git-branch Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  delete
&lt;/h4&gt;

&lt;p&gt;Option &lt;code&gt;--delete&lt;/code&gt; can be used to delete a branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;--delete&lt;/span&gt; &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-d&lt;/code&gt; instead of &lt;code&gt;--delete&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;-d&lt;/span&gt; &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a branch has not been fully merged into its upstream branch, we cannot delete it.&lt;br&gt;
However, combined with option &lt;code&gt;--force&lt;/code&gt;, we can delete it irrespective of its merged status.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;--delete&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt; &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-f&lt;/code&gt; instead of &lt;code&gt;--force&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Furthermore, we can use &lt;code&gt;-D&lt;/code&gt; instead of &lt;code&gt;-d -f&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;-D&lt;/span&gt; &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git checkout
&lt;/h3&gt;

&lt;p&gt;Switch current branch to another branch on local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the branch specified by &lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt; does not exist, the switching will fail of course.&lt;br&gt;
However, with option &lt;code&gt;-b&lt;/code&gt;, a new branch is created based on current branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; &amp;lt;new-branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or we can explicitly specify a base branch or commit hash as &lt;code&gt;&amp;lt;start-point&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; &amp;lt;new-branch&amp;gt; &amp;lt;start-point&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also specify a remote branch as base branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; &amp;lt;new-branch&amp;gt; origin/&amp;lt;remote-branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-checkout" rel="noopener noreferrer"&gt;Git - git-checkout Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git clone
&lt;/h3&gt;

&lt;p&gt;Clone a repository into current directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;repository&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cloned repository is named &lt;code&gt;origin&lt;/code&gt;, and we specify that name as &lt;code&gt;&amp;lt;repository&amp;gt;&lt;/code&gt; when we execute &lt;code&gt;git push&lt;/code&gt;.&lt;br&gt;
Instead of the name &lt;code&gt;origin&lt;/code&gt;, we can give it another name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--origin&lt;/span&gt; &amp;lt;name&amp;gt; &amp;lt;repository&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-o&lt;/code&gt; instead of &lt;code&gt;--origin&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;-o&lt;/span&gt; &amp;lt;name&amp;gt; &amp;lt;repository&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-clone" rel="noopener noreferrer"&gt;Git - git-clone Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git commit
&lt;/h3&gt;

&lt;p&gt;Apply changes to the repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use option &lt;code&gt;--message&lt;/code&gt; in order to write commit message.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;--message&lt;/span&gt; &amp;lt;msg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-m&lt;/code&gt; instead of &lt;code&gt;--message&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &amp;lt;msg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-commit" rel="noopener noreferrer"&gt;Git - git-commit Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git log
&lt;/h3&gt;

&lt;p&gt;Show commit logs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-log" rel="noopener noreferrer"&gt;Git - git-log Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git merge
&lt;/h3&gt;

&lt;p&gt;Merge the commit history of a branch to current branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-merge" rel="noopener noreferrer"&gt;Git - git-merge Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git push
&lt;/h3&gt;

&lt;p&gt;Update remote branch using local branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &amp;lt;repository&amp;gt; &amp;lt;refspec&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;lt;refspec&amp;gt;&lt;/code&gt; can be specified in the format &lt;code&gt;&amp;lt;src&amp;gt;:&amp;lt;dst&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &amp;lt;repository&amp;gt; &amp;lt;src&amp;gt;:&amp;lt;dst&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can specify local branch for &lt;code&gt;&amp;lt;src&amp;gt;&lt;/code&gt; and remote branch for &lt;code&gt;&amp;lt;dst&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &amp;lt;repository&amp;gt; &amp;lt;local-branch&amp;gt;:&amp;lt;remote-branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the names &lt;code&gt;&amp;lt;local-branch&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;remote-branch&amp;gt;&lt;/code&gt; are the same, we can be written once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &amp;lt;repository&amp;gt; &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-push" rel="noopener noreferrer"&gt;Git - git-push Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  force
&lt;/h4&gt;

&lt;p&gt;If the commit history has been updated by &lt;code&gt;git rebase&lt;/code&gt;, the push might fail.&lt;br&gt;
In this case, option &lt;code&gt;--force-with-lease&lt;/code&gt; can be used to overwrite the commit history of the remote branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--force-with-lease&lt;/span&gt; &amp;lt;repository&amp;gt; &amp;lt;refspec&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If someone else had updated the remote branch, even if we used &lt;code&gt;--force-with-lease&lt;/code&gt;, the push will fail.&lt;br&gt;
Even if someone else has done, using option &lt;code&gt;--force&lt;/code&gt; instead of &lt;code&gt;--force-with-lease&lt;/code&gt;, we can update if we want.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--force&lt;/span&gt; &amp;lt;repository&amp;gt; &amp;lt;refspec&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-f&lt;/code&gt; instead of &lt;code&gt;--force&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;repository&amp;gt; &amp;lt;refspec&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git pull
&lt;/h3&gt;

&lt;p&gt;Incorporate changes from a remote repository into the current branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-pull" rel="noopener noreferrer"&gt;Git - git-pull Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git rebase
&lt;/h3&gt;

&lt;p&gt;Reapply commits on the commit history of the specified branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &amp;lt;base-branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-rebase" rel="noopener noreferrer"&gt;Git - git-rebase Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git reset
&lt;/h3&gt;

&lt;p&gt;Reset file contents from staging.&lt;br&gt;
This command is opposite of &lt;code&gt;git add&lt;/code&gt;.&lt;br&gt;
We can specify a file path for &lt;code&gt;&amp;lt;pathspec&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &amp;lt;pathspec&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use this command to roll back the current branch head as well.&lt;/p&gt;

&lt;p&gt;The current branch head is represented as &lt;code&gt;HEAD&lt;/code&gt;.&lt;br&gt;
Using this notation, we can specify the commit we want to roll back to relatively.&lt;/p&gt;

&lt;p&gt;One method is to use the format &lt;code&gt;HEAD~\d+&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;\d+&lt;/code&gt; indicates the number of generations relative to the current branch head.&lt;br&gt;
For example, &lt;code&gt;HEAD~2&lt;/code&gt; refers to the commit 2 generations prior to the current branch head, and &lt;code&gt;HEAD~0&lt;/code&gt; has the same meaning as &lt;code&gt;HEAD&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset HEAD~2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another method is to use the format &lt;code&gt;HEAD\^+&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;^&lt;/code&gt; represents the parent commit of the starting commit.&lt;br&gt;
For instance, &lt;code&gt;HEAD^^&lt;/code&gt; refers to the parent of the parent commit of the current branch head.&lt;br&gt;
This is equivalent to &lt;code&gt;HEAD~2&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset HEAD^^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The changed files are removed from staging and returned to the working tree.&lt;br&gt;
This is the same as specifying &lt;code&gt;--mixed&lt;/code&gt; option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--mixed&lt;/span&gt;  HEAD^^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we want to leave them in staging, use &lt;code&gt;--soft&lt;/code&gt; option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt;  HEAD^^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we want to discard them, use &lt;code&gt;--hard&lt;/code&gt; option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--hard&lt;/span&gt;  HEAD^^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-reset" rel="noopener noreferrer"&gt;Git - git-reset Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git revert
&lt;/h3&gt;

&lt;p&gt;Revert changes in a commit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert &amp;lt;commit&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We specify &lt;strong&gt;a commit hash&lt;/strong&gt; as &lt;code&gt;&amp;lt;commit&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-revert" rel="noopener noreferrer"&gt;Git - git-revert Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git stash
&lt;/h3&gt;

&lt;p&gt;Save uncommitted changes and revert working dir to match the HEAD commit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;push&lt;/code&gt; can be omitted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To save paths that are not tracked in Git (e.g. newly added ones) as well, we can use option &lt;code&gt;--include-untracked&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash --include-untracked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-u&lt;/code&gt; instead of &lt;code&gt;--include-untracked&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash -u
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saved changes can be displayed by executing with &lt;code&gt;list&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saved changes are named &lt;code&gt;stash@{n}&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;n&lt;/code&gt; is an index starting from 0 and &lt;strong&gt;newer saved change has smaller index.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We can restore a change by specifying the name above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash pop stash@{n}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A restored change is deleted from stash list.&lt;br&gt;
If we want to keep that in the list, use &lt;code&gt;apply&lt;/code&gt; instead of &lt;code&gt;pop&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash apply stash@{n}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we delete it when we want.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash drop stash@{n}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-stash" rel="noopener noreferrer"&gt;Git - git-stash Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git status
&lt;/h3&gt;

&lt;p&gt;Show the working tree status include following.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Changes to be committed.&lt;br&gt;
paths that have differences between the staging file and the current HEAD commit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changed not staged for commit.&lt;br&gt;
paths that have differences between the working tree and the staging file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Untracked files.&lt;br&gt;
paths in the working tree that are not tracked by Git.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The former one is committed when &lt;code&gt;git commit&lt;/code&gt; is executed, but the latter two are not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git-status" rel="noopener noreferrer"&gt;Git - git-status Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  git --version
&lt;/h3&gt;

&lt;p&gt;Show the version of Git installed in a local environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use &lt;code&gt;-v&lt;/code&gt; instead of &lt;code&gt;--version&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;cf. &lt;a href="https://git-scm.com/docs/git#Documentation/git.txt--v" rel="noopener noreferrer"&gt;Git - git Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
    </item>
  </channel>
</rss>
