<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on あまブログ</title><link>https://ama-blog.com/posts/</link><description>Recent content in Posts on あまブログ</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Fri, 25 Nov 2022 09:39:29 +0900</lastBuildDate><atom:link href="https://ama-blog.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>【Git】git commit --amendで直前のコミットを修正する</title><link>https://ama-blog.com/75/</link><pubDate>Fri, 25 Nov 2022 09:39:29 +0900</pubDate><guid>https://ama-blog.com/75/</guid><description>&lt;p>この記事では、&lt;code>git commit --amend&lt;/code>の使い方を紹介します。&lt;/p>
&lt;ul>
&lt;li>&lt;code>git commit --amend&lt;/code>：直前のコミットの修正
&lt;ul>
&lt;li>現在のステージングエリアの状態を元に、直前のコミットを作り直す&lt;/li>
&lt;li>修正されたコミットは実際は新しいコミットのため、リモートにpush済みのコミットへの使用には注意が必要&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="1-コミットメッセージの修正">1. コミットメッセージの修正&lt;/h2>
&lt;p>ステージングエリアの変更がない状態で&lt;code>git commit --amend&lt;/code>を実行すると、直前のコミットのコミットメッセージだけを修正できます(コミットの内容は変更されない)。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>$ git add hello.rb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git commit -m &lt;span style="color:#e6db74">&amp;#34;コミットメッセージ&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git commit --amend -m &lt;span style="color:#e6db74">&amp;#34;修正後のコミットメッセージ&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>git commit --amend&lt;/code>する前(上記2行目と3行目の間)に作業ディレクトリ(ステージングエリアに追加していない)のファイルの修正があっても問題ない&lt;/li>
&lt;/ul>
&lt;h2 id="2-コミットの修正">2. コミットの修正&lt;/h2>
&lt;h3 id="2-1-git-addし忘れた場合">2-1. &lt;code>git add&lt;/code>し忘れた場合&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># hello.rbとmain.rbを修正&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git add hello.rb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git commit -m &lt;span style="color:#e6db74">&amp;#34;hello.rbとmain.rbを修正&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># main.rbをaddし忘れたことに気付く&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git add main.rb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git commit --amend --no-edit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>--no-edit&lt;/code>でコミットメッセージを変更せずにコミットを修正&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-ファイルの修正">2-2. ファイルの修正&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># hello.txtを修正&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ echo &lt;span style="color:#e6db74">&amp;#34;hello&amp;#34;&lt;/span> &amp;gt; hello.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git add hello.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git commit -m &lt;span style="color:#e6db74">&amp;#34;helloに修正&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># hello worldに修正すべきだったことに気付く&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ echo &lt;span style="color:#e6db74">&amp;#34;hello world&amp;#34;&lt;/span> &amp;gt; hello.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git add hello.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git commit --amend -m &lt;span style="color:#e6db74">&amp;#34;hello worldに修正&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>不要なコミットを追加しないで済む&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>Node.jsでESモジュールを使う</title><link>https://ama-blog.com/74/</link><pubDate>Wed, 23 Nov 2022 20:52:06 +0900</pubDate><guid>https://ama-blog.com/74/</guid><description>&lt;p>この記事では、Node.jsでESモジュール(ECMAScriptモジュール, JavaScriptモジュール)を使う方法を紹介します。&lt;/p>
&lt;ul>
&lt;li>バージョン情報
&lt;ul>
&lt;li>node：v16.18.0&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="方法1モジュールファイルの拡張子をmjsにする">方法1：モジュールファイルの拡張子を&lt;code>mjs&lt;/code>にする&lt;/h2>
&lt;p>&lt;code>foo.mjs&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">export&lt;/span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">foo&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;foo&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>main.mjs&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">import&lt;/span> { &lt;span style="color:#a6e22e">foo&lt;/span> } &lt;span style="color:#a6e22e">from&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./foo.mjs&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">foo&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre tabindex="0">&lt;code>$ node main.mjs
foo
&lt;/code>&lt;/pre>&lt;h2 id="方法2packagejsonにtype-moduleを指定する">方法2：&lt;code>package.json&lt;/code>に&lt;code>&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code>を指定する&lt;/h2>
&lt;pre tabindex="0">&lt;code>$ tree
.
├── foo.js
├── main.js
└── package.json
&lt;/code>&lt;/pre>&lt;p>&lt;code>package.json&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;module&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>foo.js&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">export&lt;/span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">foo&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;foo&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>main.js&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">import&lt;/span> { &lt;span style="color:#a6e22e">foo&lt;/span> } &lt;span style="color:#a6e22e">from&lt;/span> &lt;span style="color:#e6db74">&amp;#34;./foo.js&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">foo&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre tabindex="0">&lt;code>$ node main.js
foo
&lt;/code>&lt;/pre>&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://nodejs.org/api/esm.html#enabling">Modules: ECMAScript modules - Enabling | Node.js v19.1.0 Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://nodejs.org/api/packages.html#determining-module-system">Modules: Packages - Determining module system | Node.js v19.1.0 Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stackoverflow.com/questions/58384179/syntaxerror-cannot-use-import-statement-outside-a-module">javascript - SyntaxError: Cannot use import statement outside a module - Stack Overflow&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://dmitripavlutin.com/ecmascript-modules-nodejs/">How to Use ES Modules in Node.js&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【ES2015】JavaScriptの関数の書き方</title><link>https://ama-blog.com/73/</link><pubDate>Mon, 14 Nov 2022 12:39:15 +0900</pubDate><guid>https://ama-blog.com/73/</guid><description>&lt;h2 id="1-関数宣言function-declaration">1. 関数宣言(Function declaration)&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">calcRectArea&lt;/span>(&lt;span style="color:#a6e22e">width&lt;/span>, &lt;span style="color:#a6e22e">height&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">width&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">height&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">calcRectArea&lt;/span>(&lt;span style="color:#ae81ff">5&lt;/span>, &lt;span style="color:#ae81ff">6&lt;/span>)); &lt;span style="color:#75715e">// =&amp;gt; 30
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="1-1-関数宣言の巻き上げ">1-1. 関数宣言の巻き上げ&lt;/h3>
&lt;p>関数宣言は巻き上げられる&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">hello&lt;/span>(); &lt;span style="color:#75715e">// =&amp;gt; &amp;#34;Hello&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">hello&lt;/span>(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Hello&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>関数式は巻き上げられない&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">hello&lt;/span>(); &lt;span style="color:#75715e">// =&amp;gt; TypeError: hello is not a function
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">hello&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span>(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Hello&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="2-関数式function-expression">2. 関数式(Function expression)&lt;/h2>
&lt;h3 id="2-1-名前付き関数named-function">2-1. 名前付き関数(Named function)&lt;/h3>
&lt;ul>
&lt;li>名前付き関数は再帰的に関数を呼び出す際などに利用する&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// factorialは関数の外から呼び出せる名前
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// innerFactは関数の外から呼び出せない名前
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">factorial&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">innerFact&lt;/span>(&lt;span style="color:#a6e22e">n&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">n&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// innerFactを再帰的に呼び出している
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">n&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">innerFact&lt;/span>(&lt;span style="color:#a6e22e">n&lt;/span> &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">factorial&lt;/span>(&lt;span style="color:#ae81ff">3&lt;/span>)); &lt;span style="color:#75715e">// =&amp;gt; 6
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-2-無名関数anonymous-function">2-2. 無名関数(Anonymous Function)&lt;/h3>
&lt;ul>
&lt;li>無名関数はコールバック関数としてよく使われる&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="3-アロー関数arrow-function-expression">3. アロー関数(Arrow function expression)&lt;/h2>
&lt;ul>
&lt;li>アロー関数は関数式の代替構文(機能的な違いはいくつかある)&lt;/li>
&lt;li>ES2015から追加された&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-1-アロー関数の省略記法">3-1. アロー関数の省略記法&lt;/h3>
&lt;ul>
&lt;li>関数の仮引数が1つのときは&lt;code>()&lt;/code>を省略できる&lt;/li>
&lt;li>関数の処理が1つの式である場合に、ブロック(&lt;code>{}&lt;/code>)と&lt;code>return&lt;/code>文を省略できる
&lt;ul>
&lt;li>その式の評価結果を&lt;code>return&lt;/code>の返り値とする&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 仮引数の数と定義
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">fnA&lt;/span> &lt;span style="color:#f92672">=&lt;/span> () =&amp;gt; { &lt;span style="color:#75715e">/* 仮引数がないとき */&lt;/span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">fnB&lt;/span> &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#a6e22e">x&lt;/span>) =&amp;gt; { &lt;span style="color:#75715e">/* 仮引数が1つのみのとき */&lt;/span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">fnC&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> =&amp;gt; { &lt;span style="color:#75715e">/* 仮引数が1つのみのときは()を省略可能 */&lt;/span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">fnD&lt;/span> &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#a6e22e">x&lt;/span>, &lt;span style="color:#a6e22e">y&lt;/span>) =&amp;gt; { &lt;span style="color:#75715e">/* 仮引数が複数のとき */&lt;/span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 値の返し方
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">fnE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> =&amp;gt; { &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span>; }; &lt;span style="color:#75715e">// ブロックの中でreturn
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">fnF&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> =&amp;gt; &lt;span style="color:#a6e22e">x&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span>; &lt;span style="color:#75715e">// 1行のみの場合はreturnとブロックを省略できる
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">fnG&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">y&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">x&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">y&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}; &lt;span style="color:#75715e">// 関数の処理が複数行ある場合はreturnとブロックは省略できない
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-メソッド定義method-definition">4. メソッド定義(Method definition)&lt;/h2>
&lt;ul>
&lt;li>オブジェクトのプロパティである関数をメソッドと呼ぶ&lt;/li>
&lt;li>JavaScriptにおいて関数とメソッドの機能的な違いはない&lt;/li>
&lt;li>&lt;code>オブジェクト.メソッド名()&lt;/code>でメソッドを呼び出す&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">obj&lt;/span> &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">method1&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#34;this is method1&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }, &lt;span style="color:#75715e">// `function`キーワードでのメソッド
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">method2&lt;/span>&lt;span style="color:#f92672">:&lt;/span> () =&amp;gt; &lt;span style="color:#e6db74">&amp;#34;this is method2&amp;#34;&lt;/span> &lt;span style="color:#75715e">// Arrow Functionでのメソッド
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">method1&lt;/span>()); &lt;span style="color:#75715e">// =&amp;gt; &amp;#34;this is method1&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">obj&lt;/span>.&lt;span style="color:#a6e22e">method2&lt;/span>()); &lt;span style="color:#75715e">// =&amp;gt; &amp;#34;this is method2&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>次のように空オブジェクトの&lt;code>obj&lt;/code>を定義してから、&lt;code>method&lt;/code>プロパティへ関数を代入してもメソッドを定義できる&lt;/p></description></item><item><title>【Git】複数のコミットを一つにまとめる(rebase -i で squash)</title><link>https://ama-blog.com/72/</link><pubDate>Fri, 11 Nov 2022 22:24:57 +0900</pubDate><guid>https://ama-blog.com/72/</guid><description>&lt;p>この記事では、&lt;code>git rebase -i&lt;/code>を使って複数のコミットを一つにまとめる方法を紹介します。&lt;/p>
&lt;h2 id="1-連続したコミットの場合">1. 連続したコミットの場合&lt;/h2>
&lt;p>以下の&lt;code>edit2&lt;/code>, &lt;code>edit3&lt;/code>, &lt;code>edit4&lt;/code>を一つにまとめて、&lt;code>edit 2 &amp;amp; 3 &amp;amp; 4&lt;/code>にします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ git log --oneline
96a8b1e (HEAD -&amp;gt; main) edit4
30600dd edit3
452c39e edit2
ac56720 edit1
&lt;/code>&lt;/pre>&lt;p>&lt;code>ac56720&lt;/code>以降のコミットを表示させたいので、以下のコマンドを実行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>$ git rebase -i ac56720
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># git rebase -i HEAD~3でも可&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>テキストエディタに以下が表示される(古いコミットが上)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>pick 452c39e edit2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pick 30600dd edit3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pick 96a8b1e edit4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>edit3&lt;/code>と&lt;code>edit4&lt;/code>の&lt;code>pick&lt;/code>を&lt;code>s&lt;/code>(または&lt;code>squash&lt;/code>)に変更して、ファイルを保存して閉じる。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>pick 452c39e edit2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>s 30600dd edit3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>s 96a8b1e edit4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>f&lt;/code>(&lt;code>fixup&lt;/code>)にするとコミットメッセージの編集画面は表示されず、まとめられたコミットのコミットメッセージが&lt;code>edit2&lt;/code>になる(&lt;code>squash&lt;/code>と&lt;code>fixup&lt;/code>の違いはこれだけ)&lt;/li>
&lt;/ul>
&lt;p>以下のコミットメッセージの編集画面が表示される&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># This is a combination of 3 commits.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># This is the 1st commit message:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>edit &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># This is the commit message #2:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>edit &lt;span style="color:#ae81ff">3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># This is the commit message #3:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>edit &lt;span style="color:#ae81ff">4&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>コミットメッセージを&lt;code>edit 2 &amp;amp; 3 &amp;amp; 4&lt;/code>に変更してファイルを保存して閉じる。(他のコミットメッセージは消しても消さなくてもいい)&lt;/p></description></item><item><title>【Git】git reset --soft、--mixed、--hardで変更を取り消す</title><link>https://ama-blog.com/71/</link><pubDate>Sun, 06 Nov 2022 21:35:41 +0900</pubDate><guid>https://ama-blog.com/71/</guid><description>&lt;h2 id="1-git-reset">1. git reset&lt;/h2>
&lt;pre tabindex="0">&lt;code>git reset [&amp;lt;mode&amp;gt;] [&amp;lt;commit&amp;gt;]
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>mode&lt;/code>
&lt;ul>
&lt;li>&lt;code>--soft&lt;/code>：HEADの移動&lt;/li>
&lt;li>&lt;code>--mixed&lt;/code>：HEADの移動、インデックスの更新&lt;/li>
&lt;li>&lt;code>--hard&lt;/code>：HEADの移動、インデックスの更新、作業ディレクトリの更新&lt;/li>
&lt;li>デフォルトで&lt;code>--mixed&lt;/code>が指定される&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>commit&lt;/code>
&lt;ul>
&lt;li>巻き戻したいcommitを指定&lt;/li>
&lt;li>デフォルトでHEADが指定される&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="2-git-resetの各モードについて">2. git resetの各モードについて&lt;/h2>
&lt;h3 id="2-1-soft-headの移動">2-1. &amp;ndash;soft (HEADの移動)&lt;/h3>
&lt;pre tabindex="0">&lt;code>git reset --soft HEAD~
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>直近の&lt;code>git commit&lt;/code>を取り消す&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-mixed-インデックスの更新">2-2. &amp;ndash;mixed (インデックスの更新)&lt;/h3>
&lt;pre tabindex="0">&lt;code>git reset --mixed HEAD~
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>直近の&lt;code>git commit&lt;/code>と&lt;code>git add&lt;/code>を取り消す&lt;/li>
&lt;/ul>
&lt;h3 id="2-3-hard-作業ディレクトリの更新">2-3. &amp;ndash;hard (作業ディレクトリの更新)&lt;/h3>
&lt;pre tabindex="0">&lt;code>git reset --hard HEAD~
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>直近の&lt;code>git commit&lt;/code>と&lt;code>git add&lt;/code>と作業ディレクトリの変更を取り消す&lt;/li>
&lt;/ul>
&lt;h2 id="3-まとめ">3. まとめ&lt;/h2>
&lt;ul>
&lt;li>&lt;code>--soft&lt;/code> ：HEAD が指し示すブランチを移動する (&lt;code>--soft&lt;/code> を使うと処理はここで終了)&lt;/li>
&lt;li>&lt;code>--mixed&lt;/code>：&lt;code>--soft&lt;/code> + インデックスの内容を HEAD と同じにする (&lt;code>--mixed&lt;/code>を使うと処理はここで終了)&lt;/li>
&lt;li>&lt;code>--hard&lt;/code>：&lt;code>--soft&lt;/code> + &lt;code>--mixed&lt;/code> + 作業ディレクトリの内容をインデックスと同じにする&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-emgitresetemltmodegtltcommitgt">Git - git-reset&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.atlassian.com/ja/git/tutorials/undoing-changes/git-reset">Git reset | アトラシアンの Git チュートリアル&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E8%A9%B3%E8%AA%AC">Git - リセットコマンド詳説&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.r-staffing.co.jp/engineer/entry/20191129_1">第6話 git reset 3種類をどこよりもわかりやすい図解で解説！【連載】マンガでわかるGit ～コマンド編～ - itstaffing エンジニアスタイル&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【RuboCopエラー】Use a guard clause instead of wrapping the code inside a conditional expression.</title><link>https://ama-blog.com/70/</link><pubDate>Tue, 01 Nov 2022 22:37:08 +0900</pubDate><guid>https://ama-blog.com/70/</guid><description>&lt;h2 id="バージョン情報">バージョン情報&lt;/h2>
&lt;ul>
&lt;li>rubocop 1.34.1&lt;/li>
&lt;li>Ruby 3.1.2&lt;/li>
&lt;/ul>
&lt;h2 id="エラー内容">エラー内容&lt;/h2>
&lt;pre tabindex="0">&lt;code>Use a guard clause instead of wrapping the code inside a conditional expression.
&lt;/code>&lt;/pre>&lt;p>→例外処理の条件分岐のネストが深くなるのを防ぐためにGuard Clause(ガード節)を使いましょう。&lt;/p>
&lt;h2 id="エラー対処">エラー対処&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># これを&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">image_check&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">unless&lt;/span> avatar&lt;span style="color:#f92672">.&lt;/span>image?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> errors&lt;span style="color:#f92672">.&lt;/span>add(&lt;span style="color:#e6db74">:avatar&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;エラーメッセージ&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># こうする&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">image_check&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> avatar&lt;span style="color:#f92672">.&lt;/span>image?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> errors&lt;span style="color:#f92672">.&lt;/span>add(&lt;span style="color:#e6db74">:avatar&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;エラーメッセージ&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/rubocop/ruby-style-guide#no-nested-conditionals">Ruby Style Guide: Nested Conditionals&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/GuardClause">Class: RuboCop::Cop::Style::GuardClause&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stackoverflow.com/questions/31153934/guard-clause-instead-of-wrapping-the-code-inside-a-conditional-expression-rails">Guard clause instead of wrapping the code inside a conditional expression Rails - Stack Overflow&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://techracho.bpsinc.jp/hachi8833/2016_10_11/26950">[Ruby/Rails] 例外で深くなったネストをGuard Clauseですっきりさせる｜TechRacho by BPS株式会社&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【Ruby】Minitestの使い方</title><link>https://ama-blog.com/69/</link><pubDate>Mon, 31 Oct 2022 23:39:15 +0900</pubDate><guid>https://ama-blog.com/69/</guid><description>&lt;p>この記事では、minitestを使ってRubyのコードをテストする方法を紹介します。&lt;/p>
&lt;p>Rubyのテストフレームワーク、Test::Unit・test-unit・minitestの違いについては以下を参照ください。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://qiita.com/jnchito/items/ff4f7a23addbd8dbc460">Ruby標準のテスティングフレームワークで手軽にテストコードを書く方法 #RSpec - Qiita&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.clear-code.com/blog/2014/11/6.html">Rubyのテスティングフレームワークの歴史（2014年版） - 2014-11-06 - ククログ&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="minitestの使い方">minitestの使い方&lt;/h2>
&lt;p>minitestを使うための基本的なルールは以下です。&lt;/p>
&lt;ol>
&lt;li>&lt;code>require 'minitest/autorun'&lt;/code>を書く&lt;/li>
&lt;li>&lt;code>Minitest::Test&lt;/code>を継承するクラス内にテストを書く&lt;/li>
&lt;li>メソッド名を&lt;code>test_&lt;/code>から始める&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>$ tree
.
├── sample.rb
└── sample_test.rb
&lt;/code>&lt;/pre>&lt;p>&lt;code>sample.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Sample&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">self&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">hello&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;Hello!&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>sample_test.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;minitest/autorun&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require_relative &lt;span style="color:#e6db74">&amp;#39;sample&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">SampleTest&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#66d9ef">Minitest&lt;/span>&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#66d9ef">Test&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">test_hello&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert_equal &lt;span style="color:#e6db74">&amp;#39;Hello!&amp;#39;&lt;/span>, &lt;span style="color:#66d9ef">Sample&lt;/span>&lt;span style="color:#f92672">.&lt;/span>hello
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre tabindex="0">&lt;code>$ ruby sample_test.rb
Run options: --seed 20412
# Running:
.
Finished in 0.001143s, 874.8906 runs/s, 874.8906 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
&lt;/code>&lt;/pre>&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/library/minitest=2funit.html">minitest/unit&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rubydoc.info/gems/minitest/Minitest/Assertions">Module: Minitest::Assertions&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【Ruby3.1】ボウリングのスコア計算プログラムをオブジェクト指向で作る</title><link>https://ama-blog.com/68/</link><pubDate>Mon, 31 Oct 2022 12:25:00 +0900</pubDate><guid>https://ama-blog.com/68/</guid><description>&lt;p>非OOP版はこちら↓&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/34/">【Ruby 3.1】ボウリングのスコア計算プログラムを作る | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.6&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-ソースコード">2. ソースコード&lt;/h2>
&lt;p>&lt;code>bowling.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># frozen_string_literal: true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require_relative &lt;span style="color:#e6db74">&amp;#39;game&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>shots &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">].&lt;/span>split(&lt;span style="color:#e6db74">&amp;#39;,&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>game &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Game&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(shots)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts game&lt;span style="color:#f92672">.&lt;/span>score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>game.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># frozen_string_literal: true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require_relative &lt;span style="color:#e6db74">&amp;#39;frame&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Game&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">initialize&lt;/span>(shots)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> @shots &lt;span style="color:#f92672">=&lt;/span> shots
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">score&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> @frames &lt;span style="color:#f92672">=&lt;/span> build_frames
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> game_score &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">..&lt;/span>&lt;span style="color:#ae81ff">9&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>idx&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Frame&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(@frames&lt;span style="color:#f92672">[&lt;/span>idx&lt;span style="color:#f92672">]&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> game_score &lt;span style="color:#f92672">+=&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>score
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> @frames&lt;span style="color:#f92672">[&lt;/span>idx &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> @frames&lt;span style="color:#f92672">[&lt;/span>idx &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> game_score &lt;span style="color:#f92672">+=&lt;/span> calc_bonus_point(idx, frame)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> game_score
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_frames&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> @shots&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frames&lt;span style="color:#f92672">.&lt;/span>length &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>length &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">||&lt;/span> s &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;X&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>dup
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame&lt;span style="color:#f92672">.&lt;/span>clear
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames&lt;span style="color:#f92672">.&lt;/span>last &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">calc_bonus_point&lt;/span>(idx, frame)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>strike?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> next_two_shots &lt;span style="color:#f92672">=&lt;/span> (@frames&lt;span style="color:#f92672">[&lt;/span>idx &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">+&lt;/span> @frames&lt;span style="color:#f92672">[&lt;/span>idx &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">]&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>slice(&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bonus_point &lt;span style="color:#f92672">=&lt;/span> next_two_shots&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">Shot&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(s)&lt;span style="color:#f92672">.&lt;/span>score }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elsif&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>spare?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> next_shot &lt;span style="color:#f92672">=&lt;/span> @frames&lt;span style="color:#f92672">[&lt;/span>idx &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bonus_point &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Shot&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(next_shot)&lt;span style="color:#f92672">.&lt;/span>score
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bonus_point &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>frame.rb&lt;/code>&lt;/p></description></item><item><title>【Rails】gemのアンインストール方法</title><link>https://ama-blog.com/67/</link><pubDate>Sun, 30 Oct 2022 11:18:18 +0900</pubDate><guid>https://ama-blog.com/67/</guid><description>&lt;p>この記事では、RailsアプリでBundlerを使ってインストールしたgemを削除する方法を紹介します。&lt;/p>
&lt;h2 id="手順">手順&lt;/h2>
&lt;pre tabindex="0">&lt;code>$ bundle exec gem uninstall &amp;lt;gem名&amp;gt;
↓
Gemfileから該当のgemの行を削除
↓
$ bundle install
&lt;/code>&lt;/pre>&lt;p>上記により&lt;code>Gemfile.lock&lt;/code>からも削除されます。&lt;/p>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://guides.rubygems.org/command-reference/#gem-uninstall">gem uninstall&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://guides.rubygems.org/command-reference/#gem-install">gem install&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bundler.io/v2.4/man/bundle-exec.1.html">bundle exec&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://qiita.com/manbolila/items/f412a29782e4352d1168">【Rails】gemのアンインストール・バージョン変更 #Rails5 - Qiita&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.techscore.com/blog/2012/10/30/gem%E3%82%92%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/">あえて言うほどではないけれどもGemを一括削除する方法 | TECHSCORE BLOG&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【Bundler】Gemfileのバージョン指定の書き方</title><link>https://ama-blog.com/66/</link><pubDate>Sat, 29 Oct 2022 23:42:30 +0900</pubDate><guid>https://ama-blog.com/66/</guid><description>&lt;p>GemfileはBundlerでgemの依存関係を管理するために必要な設定ファイルです。&lt;/p>
&lt;p>Gemfileにはgem名とバージョンを&lt;code>gem 'rails', '~&amp;gt; 6.1.5'&lt;/code>のようなフォーマットで記述します。&lt;/p>
&lt;p>&lt;strong>&lt;code>~&amp;gt; 6.1.5&lt;/code>の正確な意味わかりますか？&lt;/strong>&lt;/p>
&lt;p>&lt;strong>&lt;code>~&amp;gt;&lt;/code>の呼び方知ってますか？&lt;/strong>(&lt;span style="color: red;">&lt;strong>トゥウィドルワッカ&lt;/strong>&lt;/span>と呼びます)&lt;/p>
&lt;p>この記事ではGemfileのバージョン指定の書き方を解説していきます。&lt;/p>
&lt;h2 id="1-gemfileのバージョン指定子の意味">1. Gemfileのバージョン指定子の意味&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>バージョン指定&lt;/th>
&lt;th>意味&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;td>1.0のみ&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>&amp;gt;= 1.0&lt;/code>&lt;/td>
&lt;td>1.0以上&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>~&amp;gt; 1.0&lt;/code>&lt;/td>
&lt;td>1.0以上2.0未満&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>~&amp;gt; 1.0.0&lt;/code>&lt;/td>
&lt;td>1.0.0以上1.1未満&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>指定なし&lt;/td>
&lt;td>最新版&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>&lt;code>~&amp;gt; 1.0&lt;/code>はマイナーバージョン(0.x.0)は上がってもいいがメジャーバージョン(x.0.0)は上げたくないことを意味する&lt;/li>
&lt;li>&lt;code>~&amp;gt; 1.0.0&lt;/code>はパッチバージョン(0.0.x)は上がってもいいがマイナーバージョン(0.x.0)は上げたくないことを意味する&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 以下二つは同じ意味&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#e6db74">&amp;#39;rails&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;~&amp;gt; 6.1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#e6db74">&amp;#39;rails&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;gt;= 6.1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;lt; 7.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 以下二つは同じ意味&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#e6db74">&amp;#39;rails&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;~&amp;gt; 6.1.5&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#e6db74">&amp;#39;rails&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;gt;= 6.1.5&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;lt; 6.2&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="2-twiddle-wakkaトゥウィドルワッカとは">2. twiddle wakka(トゥウィドルワッカ)とは&lt;/h2>
&lt;p>&lt;code>~&amp;gt;&lt;/code>がtwiddle wakkaです。&lt;/p>
&lt;p>Gemfileのバージョン指定にはoptimistic version constraint(楽観的なバージョン指定)とpessimistic version constraint(悲観的なバージョン指定)があります。&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;ul>
&lt;li>optimistic version constraint
&lt;ul>
&lt;li>&lt;code>gem 'library', '&amp;gt;= 2.2.0'&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>pessimistic version constraint
&lt;ul>
&lt;li>&lt;code>gem 'library', '&amp;gt;= 2.2.0', '&amp;lt; 3.0'&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>このpessimistic version constraintの省略記法としてできたのが&lt;code>~&amp;gt;&lt;/code>(twiddle wakka)です。&lt;/p></description></item><item><title>【Rails】ポリモーフィック関連付けを使ってコメント投稿機能を実装する</title><link>https://ama-blog.com/65/</link><pubDate>Tue, 25 Oct 2022 21:21:15 +0900</pubDate><guid>https://ama-blog.com/65/</guid><description>&lt;p>この記事では、Railsの&lt;a href="https://railsguides.jp/association_basics.html#%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91">ポリモーフィック関連付け&lt;/a>を使ってコメント投稿機能を実装する際のポイントを紹介します。&lt;/p>
&lt;h2 id="1-バージョン情報">1. バージョン情報&lt;/h2>
&lt;ul>
&lt;li>macOS：12.6&lt;/li>
&lt;li>Ruby：3.1.2&lt;/li>
&lt;li>Rails：6.1.6&lt;/li>
&lt;/ul>
&lt;h2 id="2-前提条件">2. 前提条件&lt;/h2>
&lt;ul>
&lt;li>Userモデル(ユーザー)&lt;/li>
&lt;li>Bookモデル(本)のCRUD&lt;/li>
&lt;li>Userモデルに紐づいたReportモデル(日報)のCRUD&lt;/li>
&lt;/ul>
&lt;h2 id="3-実装時のポイント">3. 実装時のポイント&lt;/h2>
&lt;h3 id="3-1-ポリモーフィック関連付け">3-1. ポリモーフィック関連付け&lt;/h3>
&lt;p>&lt;strong>BookモデルとReportモデルに従属するCommentモデルの作成&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ rails g model comment user:references commentable:references{polymorphic} content:text --no-test-framework
&lt;/code>&lt;/pre>&lt;p>&lt;code>app/models/comment.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Comment&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#66d9ef">ApplicationRecord&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> belongs_to &lt;span style="color:#e6db74">:user&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> belongs_to &lt;span style="color:#e6db74">:commentable&lt;/span>, &lt;span style="color:#e6db74">polymorphic&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> validates &lt;span style="color:#e6db74">:content&lt;/span>, &lt;span style="color:#e6db74">presence&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span> &lt;span style="color:#75715e"># 追記&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>db/migrate/XXXX_create_comments.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">CreateComments&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#66d9ef">ActiveRecord&lt;/span>&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#66d9ef">Migration&lt;/span>&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#ae81ff">6&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">change&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> create_table &lt;span style="color:#e6db74">:comments&lt;/span> &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>t&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>references &lt;span style="color:#e6db74">:user&lt;/span>, &lt;span style="color:#e6db74">null&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>, &lt;span style="color:#e6db74">foreign_key&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>references &lt;span style="color:#e6db74">:commentable&lt;/span>, &lt;span style="color:#e6db74">polymorphic&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>, &lt;span style="color:#e6db74">null&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>text &lt;span style="color:#e6db74">:content&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>timestamps
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>マイグレーションを実行&lt;/p>
&lt;pre tabindex="0">&lt;code>$ rails db:migrate
&lt;/code>&lt;/pre>&lt;p>&lt;code>db/schema.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span> create_table &lt;span style="color:#e6db74">&amp;#34;comments&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">force&lt;/span>: &lt;span style="color:#e6db74">:cascade&lt;/span> &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>t&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>integer &lt;span style="color:#e6db74">&amp;#34;user_id&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">null&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>string &lt;span style="color:#e6db74">&amp;#34;commentable_type&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">null&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>integer &lt;span style="color:#e6db74">&amp;#34;commentable_id&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">null&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>text &lt;span style="color:#e6db74">&amp;#34;content&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>datetime &lt;span style="color:#e6db74">&amp;#34;created_at&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">precision&lt;/span>: &lt;span style="color:#ae81ff">6&lt;/span>, &lt;span style="color:#e6db74">null&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>datetime &lt;span style="color:#e6db74">&amp;#34;updated_at&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">precision&lt;/span>: &lt;span style="color:#ae81ff">6&lt;/span>, &lt;span style="color:#e6db74">null&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>index &lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;commentable_type&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;commentable_id&amp;#34;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>, name: &lt;span style="color:#e6db74">&amp;#34;index_comments_on_commentable&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t&lt;span style="color:#f92672">.&lt;/span>index &lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;user_id&amp;#34;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>, name: &lt;span style="color:#e6db74">&amp;#34;index_comments_on_user_id&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>commentable_type&lt;/code>カラムにセットされるのは参照する親モデルのクラス名(&lt;code>Book&lt;/code>または&lt;code>Report&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>&lt;code>app/models/book.rb&lt;/code>&lt;/p></description></item><item><title>【Rails】ユーザーフォロー機能を実装する</title><link>https://ama-blog.com/64/</link><pubDate>Wed, 19 Oct 2022 20:46:45 +0900</pubDate><guid>https://ama-blog.com/64/</guid><description>&lt;p>この記事では、RailsでTwitterやInstagramのようなユーザーフォロー機能を実装する際のポイントを紹介します。&lt;/p>
&lt;h2 id="1-バージョン情報">1. バージョン情報&lt;/h2>
&lt;ul>
&lt;li>macOS：12.6&lt;/li>
&lt;li>Ruby：3.1.2&lt;/li>
&lt;li>Rails：6.1.6&lt;/li>
&lt;/ul>
&lt;h2 id="2-実装時のポイント">2. 実装時のポイント&lt;/h2>
&lt;h3 id="2-1-モデルの関連">2-1. モデルの関連&lt;/h3>
&lt;h4 id="friendshipモデルの作成">Friendshipモデルの作成&lt;/h4>
&lt;pre tabindex="0">&lt;code>$ rails g model Friendship follower_id:integer followed_id:integer --no-fixture --no-test-framework
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>follower_id&lt;/code>：フォロー(という行為)をしているユーザーのid
&lt;ul>
&lt;li>自分にとってのフォロワーじゃなくてフォローをしている人という意味のフォロワー(⇄フォロイー)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>followed_id&lt;/code>：フォローされてるユーザーのid
&lt;ul>
&lt;li>意味的には&lt;code>followee_id&lt;/code>でもいい&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>生成された&lt;code>db/migrate/XXXX_create_friendships.rb&lt;/code>に以下を追記。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>add_index &lt;span style="color:#e6db74">:friendships&lt;/span>, &lt;span style="color:#e6db74">:followed_id&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>add_index &lt;span style="color:#e6db74">:friendships&lt;/span>, &lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:follower_id&lt;/span>, &lt;span style="color:#e6db74">:followed_id&lt;/span>&lt;span style="color:#f92672">]&lt;/span>, &lt;span style="color:#e6db74">unique&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>add_index :friendships, [:follower_id, :followed_id], unique: true&lt;/code>が&lt;code>:follower_id&lt;/code>で始まっているため、&lt;code>add_index :friendships, :follower_id&lt;/code>は定義不要&lt;/li>
&lt;li>&lt;code>unique: true&lt;/code>でデータベース側からユニーク制約をつけ、あるユーザーが同じユーザーを2回以上フォローすることを防ぐ(モデル側のバリデーションによる一意性チェックは後述)&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>$ rails db:migrate
&lt;/code>&lt;/pre>&lt;h4 id="userfriendshipの関連付け">User/Friendshipの関連付け&lt;/h4>
&lt;p>&lt;code>app/models/friendship.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Friendship&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#66d9ef">ApplicationRecord&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> belongs_to &lt;span style="color:#e6db74">:follower&lt;/span>, &lt;span style="color:#e6db74">class_name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;User&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> belongs_to &lt;span style="color:#e6db74">:followed&lt;/span>, &lt;span style="color:#e6db74">class_name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;User&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> validates &lt;span style="color:#e6db74">:follower_id&lt;/span>, &lt;span style="color:#e6db74">uniqueness&lt;/span>: { &lt;span style="color:#e6db74">scope&lt;/span>: &lt;span style="color:#e6db74">:followed_id&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>validates :follower_id, uniqueness: { scope: :followed_id }&lt;/code>
&lt;ul>
&lt;li>モデル側のバリデーションによる一意性チェック&lt;/li>
&lt;li>&lt;code>scope&lt;/code>を指定することで&lt;code>follower_id&lt;/code>と&lt;code>followed_id&lt;/code>の組み合わせの一意性を保つ(あるユーザーが同じユーザーを2回以上フォローすることを防ぐ)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;code>app/models/user.rb&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">User&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#66d9ef">ApplicationRecord&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> has_many &lt;span style="color:#e6db74">:active_friendships&lt;/span>, &lt;span style="color:#e6db74">class_name&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Friendship&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">foreign_key&lt;/span>: &lt;span style="color:#e6db74">:follower_id&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">dependent&lt;/span>: &lt;span style="color:#e6db74">:destroy&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">inverse_of&lt;/span>: &lt;span style="color:#e6db74">:follower&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> has_many &lt;span style="color:#e6db74">:passive_friendships&lt;/span>, &lt;span style="color:#e6db74">class_name&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Friendship&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">foreign_key&lt;/span>: &lt;span style="color:#e6db74">:followed_id&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">dependent&lt;/span>: &lt;span style="color:#e6db74">:destroy&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">inverse_of&lt;/span>: &lt;span style="color:#e6db74">:followed&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>class_name&lt;/code>
&lt;ul>
&lt;li>&lt;code>class_name&lt;/code>オプションは&lt;code>has_many&lt;/code>で指定した関連付け名と実際のモデル名が違う場合に使用するもの。今回のように一つの&lt;code>Friendship&lt;/code>モデルに対して二つの関連(&lt;code>active_friendships&lt;/code>と&lt;code>passive_friendships&lt;/code>)を持たせたい場合、&lt;code>has_many :friendships&lt;/code>(で&lt;code>user.friendships&lt;/code>)だとどちらの関連か区別できない。なので&lt;code>has_many :active_friendships&lt;/code>(で&lt;code>user.active_friendships&lt;/code>)とする。ただこのままだとRailsは存在しない&lt;code>active_friendships&lt;/code>テーブルを探しに行くことになるので、実際に存在する&lt;code>friendships&lt;/code>テーブルを使うには&lt;code>has_many :active_friendships, class_name: 'Friendship'&lt;/code>とする。以上により&lt;code>active_friendships&lt;/code>という関連を実際のモデル名の&lt;code>Friendship&lt;/code>と対応付けることができる。&lt;/li>
&lt;li>&lt;a href="https://railsguides.jp/association_basics.html#belongs-to%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-class-name">Railsガイド: Active Record の関連付け - 4.1.2.2 :class_name&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>foreign_key&lt;/code>
&lt;ul>
&lt;li>今回の場合、Railsは自動的に&lt;code>friendships&lt;/code>テーブルの&lt;code>user_id&lt;/code>を探しに行くが、&lt;code>friendships&lt;/code>テーブルに&lt;code>user_id&lt;/code>カラムはないので、&lt;code>foreign_key&lt;/code>オプションで明示的に&lt;code>follower_id&lt;/code>(または&lt;code>followed_id&lt;/code>)を指定する必要がある&lt;/li>
&lt;li>&lt;a href="https://railsguides.jp/association_basics.html#belongs-to%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-foreign-key">Railsガイド: Active Record の関連付け - 4.1.2.5 :foreign_key
&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>dependent: :destroy&lt;/code>
&lt;ul>
&lt;li>Userモデルのデータリソースが削除されるとそれに紐づくFriendshipモデルのデータリソースも同時に削除される&lt;/li>
&lt;li>&lt;a href="https://railsguides.jp/association_basics.html#belongs-to%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-dependent">Railsガイド: Active Record の関連付け - 4.1.2.4 :dependent&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>inverse_of&lt;/code>
&lt;ul>
&lt;li>&lt;a href="https://railsguides.jp/association_basics.html#%E5%8F%8C%E6%96%B9%E5%90%91%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91">Railsガイド: Active Record の関連付け - 3.5 双方向関連付け&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># inverse_ofの挙動&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#f92672">&amp;gt;&lt;/span> a &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">User&lt;/span>&lt;span style="color:#f92672">.&lt;/span>first
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#f92672">&amp;gt;&lt;/span> b &lt;span style="color:#f92672">=&lt;/span> a&lt;span style="color:#f92672">.&lt;/span>active_friendships&lt;span style="color:#f92672">.&lt;/span>first
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#f92672">&amp;gt;&lt;/span> a&lt;span style="color:#f92672">.&lt;/span>name &lt;span style="color:#f92672">==&lt;/span> b&lt;span style="color:#f92672">.&lt;/span>follower&lt;span style="color:#f92672">.&lt;/span>name
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#f92672">&amp;gt;&lt;/span> a&lt;span style="color:#f92672">.&lt;/span>name &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;David&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#f92672">&amp;gt;&lt;/span> a&lt;span style="color:#f92672">.&lt;/span>name &lt;span style="color:#f92672">==&lt;/span> b&lt;span style="color:#f92672">.&lt;/span>follower&lt;span style="color:#f92672">.&lt;/span>name
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">=&amp;gt;&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span> &lt;span style="color:#75715e"># inverse_ofを指定しないとfalse&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># user(自分)が相手をフォローした場合&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user&lt;span style="color:#f92672">.&lt;/span>active_friendships&lt;span style="color:#f92672">.&lt;/span>first&lt;span style="color:#f92672">.&lt;/span>follower &lt;span style="color:#75715e">#=&amp;gt; 自分&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user&lt;span style="color:#f92672">.&lt;/span>active_friendships&lt;span style="color:#f92672">.&lt;/span>first&lt;span style="color:#f92672">.&lt;/span>followed &lt;span style="color:#75715e">#=&amp;gt; 相手&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user&lt;span style="color:#f92672">.&lt;/span>passive_friendships&lt;span style="color:#f92672">.&lt;/span>first&lt;span style="color:#f92672">.&lt;/span>follower &lt;span style="color:#75715e">#=&amp;gt; 相手&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user&lt;span style="color:#f92672">.&lt;/span>passive_friendships&lt;span style="color:#f92672">.&lt;/span>first&lt;span style="color:#f92672">.&lt;/span>followed &lt;span style="color:#75715e">#=&amp;gt; 自分&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-2-フォロー数フォロワー数の表示">2-2. フォロー数・フォロワー数の表示&lt;/h3>
&lt;p>&lt;code>app/models/user.rb&lt;/code>&lt;/p></description></item><item><title>【Rails】ActiveStorageで画像アップロード機能を実装する</title><link>https://ama-blog.com/63/</link><pubDate>Wed, 12 Oct 2022 21:22:05 +0900</pubDate><guid>https://ama-blog.com/63/</guid><description>&lt;p>この記事では、Rails 5.2からの標準機能であるActiveStorageを使って画像アップロード機能を実装するポイントを紹介します。&lt;/p>
&lt;h2 id="1-バージョン情報">1. バージョン情報&lt;/h2>
&lt;ul>
&lt;li>macOS：12.6&lt;/li>
&lt;li>Ruby：3.1.2&lt;/li>
&lt;li>Rails：6.1.6&lt;/li>
&lt;li>image_processing：1.12.2&lt;/li>
&lt;li>active_storage_validations：0.9.8&lt;/li>
&lt;/ul>
&lt;h2 id="2-実装時のポイント">2. 実装時のポイント&lt;/h2>
&lt;h3 id="2-1-active-storageのセットアップ">2-1. Active Storageのセットアップ&lt;/h3>
&lt;p>以下を実行して、migrationファイルを作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ rails active_storage:install
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>db/migrate/XXXX_create_active_storage_tables.active_storage.rb&lt;/code>が作成される&lt;/li>
&lt;/ul>
&lt;p>migrationを実行します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ rails db:migrate
&lt;/code>&lt;/pre>&lt;h3 id="2-2-画像アップロードと表示">2-2. 画像アップロードと表示&lt;/h3>
&lt;p>各userにアバター画像を添付したい場合は、以下のようにUserモデルを定義します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">User&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#66d9ef">ApplicationRecord&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> has_one_attached &lt;span style="color:#e6db74">:avatar&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下のように書くことでフォームからアバター画像をアップロードできます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;field&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>%= f.label :avatar %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>%= f.file_field :avatar %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>ストロングパラメータに&lt;code>avatar&lt;/code>の追加が必要&lt;/li>
&lt;/ul>
&lt;p>以下のように書くことでアバター画像を表示できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>%= image_tag user.avatar if user.avatar.attached? %&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>avatar.attached?&lt;/code>で特定のuserがアバター画像を持っているかどうかを調べられます。&lt;/li>
&lt;/ul>
&lt;h3 id="2-3-画像のリサイズ">2-3. 画像のリサイズ&lt;/h3>
&lt;p>画像のリサイズのために&lt;a href="https://rubygems.org/gems/image_processing/versions/1.9.0?locale=ja">image_processing&lt;/a> gemが必要です。&lt;/p>
&lt;p>&lt;code>Gemfile&lt;/code>の&lt;code>image_processing&lt;/code> gemのコメントを解除します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Use Active Storage variant&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#e6db74">&amp;#39;image_processing&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;~&amp;gt; 1.2&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>image_processing&lt;/code> gemを使うために、macに&lt;code>imagemagick&lt;/code>と&lt;code>vips&lt;/code>をインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ brew install imagemagick vips
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;a href="https://github.com/janko/image_processing#installation">GitHub - image_processing - Installation&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;code>variant&lt;/code>メソッドで、添付ファイルごとに特定のサイズ違いの画像を生成できます。&lt;/p></description></item><item><title>【Rails】deviseでユーザー認証機能を実装する</title><link>https://ama-blog.com/62/</link><pubDate>Thu, 22 Sep 2022 13:56:54 +0900</pubDate><guid>https://ama-blog.com/62/</guid><description>&lt;p>この記事では、devise gemを使ってRailsアプリケーションにユーザー認証機能を実装する方法を紹介します。&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.5.1&lt;/li>
&lt;li>Ruby：3.1.2&lt;/li>
&lt;li>Rails：6.1.7&lt;/li>
&lt;li>devise：4.8.1&lt;/li>
&lt;li>devise-i18n：1.10.2&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-サンプルアプリの作成">2-1. サンプルアプリの作成&lt;/h3>
&lt;p>以下のコマンドを実行して、サンプルアプリを作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ rails new sample_app
$ cd sample_app
$ rails generate scaffold book title:string memo:text
$ rails db:migrate
&lt;/code>&lt;/pre>&lt;h3 id="2-2-deviseのセットアップ">2-2. deviseのセットアップ&lt;/h3>
&lt;p>&lt;code>Gemfile&lt;/code>に以下を追記して、&lt;code>bundle install&lt;/code>を実行します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#e6db74">&amp;#39;devise&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>アプリケーションのルートディレクトリで以下のコマンドを実行して、deviseをセットアップします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ rails generate devise:install
&lt;/code>&lt;/pre>&lt;p>&lt;code>config/environments/development.rb&lt;/code>に以下を追記して、デフォルトの url オプションを定義します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>config&lt;span style="color:#f92672">.&lt;/span>action_mailer&lt;span style="color:#f92672">.&lt;/span>default_url_options &lt;span style="color:#f92672">=&lt;/span> { &lt;span style="color:#e6db74">host&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;localhost&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">port&lt;/span>: &lt;span style="color:#ae81ff">3000&lt;/span> }
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-3-ルートルーティングの設定">2-3. ルートルーティングの設定&lt;/h3>
&lt;p>&lt;code>config/routes.rb&lt;/code>に以下を追記して、ルートルーティングを設定します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">Rails&lt;/span>&lt;span style="color:#f92672">.&lt;/span>application&lt;span style="color:#f92672">.&lt;/span>routes&lt;span style="color:#f92672">.&lt;/span>draw &lt;span style="color:#66d9ef">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root &lt;span style="color:#e6db74">to&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;books#index&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>deviseはサインインやパスワード変更などを行った後のデフォルトのリダイレクト先にルート(&lt;code>/&lt;/code>)を使用します。&lt;/p>
&lt;p>上記の設定により、リダイレクト先が&lt;code>/&lt;/code>から&lt;code>/books&lt;/code>に変更されます。&lt;/p>
&lt;h3 id="2-4-フラッシュメッセージの表示">2-4. フラッシュメッセージの表示&lt;/h3>
&lt;p>&lt;code>app/views/layouts/application.html.erb&lt;/code>を以下のように編集します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>%# 省略 %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>% if notice.present? %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">p&lt;/span> &lt;span style="color:#a6e22e">id&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;notice&amp;#34;&lt;/span>&amp;gt;&lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>%= notice %&amp;gt;&amp;lt;/&lt;span style="color:#f92672">p&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>% end %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>% if alert.present? %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">p&lt;/span> &lt;span style="color:#a6e22e">id&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;alert&amp;#34;&lt;/span>&amp;gt;&lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>%= alert %&amp;gt;&amp;lt;/&lt;span style="color:#f92672">p&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>% end %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;&lt;/span>%= yield %&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>app/views/books/index.html.erb&lt;/code>と&lt;code>app/views/books/show.html.erb&lt;/code>の以下の行を削除します。&lt;/p></description></item><item><title>VSCodeでRailsをデバッグする【Rails + vscode-rdbg(debug.gem)】</title><link>https://ama-blog.com/61/</link><pubDate>Sat, 17 Sep 2022 11:24:09 +0900</pubDate><guid>https://ama-blog.com/61/</guid><description>&lt;p>この記事では、Ruby 3.1で標準ライブラリとなった&lt;a href="https://rubygems.org/gems/debug">debug.gem&lt;/a>を使って、VSCode上でRailsアプリのデバッグを行う方法を紹介します。&lt;/p>
&lt;h2 id="1-設定方法">1. 設定方法&lt;/h2>
&lt;p>Railsアプリのデバッグを行うために必要な設定を行います。&lt;/p>
&lt;h3 id="1-1-debuggemのインストール">1-1. debug.gemのインストール&lt;/h3>
&lt;p>※ Rails 7以降ではデフォルトでdebug.gemが使われるため以下の設定は不要&lt;/p>
&lt;p>Gemfileに以下を記述します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>group &lt;span style="color:#e6db74">:development&lt;/span>, &lt;span style="color:#e6db74">:test&lt;/span> &lt;span style="color:#66d9ef">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gem &lt;span style="color:#e6db74">&amp;#34;debug&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">platforms&lt;/span>: &lt;span style="color:#f92672">%&lt;/span>i&lt;span style="color:#f92672">[&lt;/span> mri mingw x64_mingw &lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>bundle install&lt;/code>を実行してdebug.gemをインストールします。&lt;/p>
&lt;h3 id="1-2-vscode-rdbgのインストール">1-2. vscode-rdbgのインストール&lt;/h3>
&lt;p>VSCodeの拡張機能「VSCode rdbg Ruby Debugger」を追加します。&lt;/p>
&lt;p>&lt;a href="https://marketplace.visualstudio.com/items?itemName=KoichiSasada.vscode-rdbg">VSCode rdbg Ruby Debugger - Visual Studio Marketplace&lt;/a>&lt;/p>
&lt;h3 id="1-3-launchjsonファイルの作成">1-3. launch.jsonファイルの作成&lt;/h3>
&lt;p>VSCodeの&lt;a href="https://code.visualstudio.com/api/ux-guidelines/activity-bar">アクティビティバー&lt;/a>から「実行とデバッグ(Run and Debug)」を選択し、「launch.jsonファイルを作成します(create a launch.json file)」を選択します。&lt;/p>
&lt;p>次に、「デバッガーの選択(Select debugger)」で「Ruby(rdbg)」を選択します。&lt;/p>
&lt;p>するとプロジェクトのルートフォルダに&lt;code>.vscode/launch.json&lt;/code>が作成されます。&lt;/p>
&lt;p>作成された&lt;code>.vscode/launch.json&lt;/code>を以下のように編集してください。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;version&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;0.2.0&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;configurations&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;rdbg&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Debug Rails&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;request&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;launch&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;cwd&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;${workspaceRoot}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;script&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;bin/rails server&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;args&amp;#34;&lt;/span>: [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;askParameters&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;useBundler&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以上で設定は終了です。&lt;/p></description></item><item><title>【Git】グローバルなgitignoreの設定方法</title><link>https://ama-blog.com/60/</link><pubDate>Fri, 16 Sep 2022 21:12:44 +0900</pubDate><guid>https://ama-blog.com/60/</guid><description>&lt;p>この記事では、グローバルなgitignoreの設定方法を紹介します。&lt;/p>
&lt;p>グローバルなgitignoreファイル(&lt;code>~/.config/git/ignore&lt;/code>)を作成し、全てのリポジトリでGitの追跡対象外とするファイルを定義します。&lt;/p>
&lt;h2 id="1-gitignoreとは">1. gitignoreとは&lt;/h2>
&lt;ul>
&lt;li>意図的に未追跡のファイルを指定して、それらをGitが追跡しないようにするためのもの&lt;/li>
&lt;li>すでに Git に追跡されているファイルは影響を受けない
&lt;ul>
&lt;li>現在追跡しているファイルの追跡を止めるには、&lt;code>git rm --cached&lt;/code> を使う&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="2-gitignoreの使い分け">2. gitignoreの使い分け&lt;/h2>
&lt;ul>
&lt;li>&lt;code>.gitignore&lt;/code>：特定のリポジトリで全ての人が無視したいファイル&lt;/li>
&lt;li>&lt;code>$GIT_DIR/info/exclude&lt;/code>：特定のリポジトリで自分だけが無視したいファイル&lt;/li>
&lt;li>&lt;code>$XDG_CONFIG_HOME/git/ignore&lt;/code>：全てのリポジトリで自分だけが無視したいファイル&lt;/li>
&lt;/ul>
&lt;h2 id="3-グローバルなgitignoreの設定">3. グローバルなgitignoreの設定&lt;/h2>
&lt;p>グローバルなgitignoreの設定には&lt;code>$XDG_CONFIG_HOME/git/ignore&lt;/code>を使用します。&lt;/p>
&lt;h3 id="3-1-xdg_config_homegitignoreとは">3-1. $XDG_CONFIG_HOME/git/ignoreとは&lt;/h3>
&lt;ul>
&lt;li>&lt;code>core.excludesfile&lt;/code>のデフォルト値&lt;/li>
&lt;li>&lt;code>$XDG_CONFIG_HOME&lt;/code>が未設定の場合、代わりに&lt;code>$HOME/.config/git/ignore&lt;/code>が使用される&lt;/li>
&lt;/ul>
&lt;p>つまり&lt;/p>
&lt;p>&lt;code>$ git config --global core.excludesfile ~/.gitignore_global&lt;/code>して&lt;code>~/.gitignore_global&lt;/code>を作成する必要はなく、代わりに&lt;code>~/.config/git/ignore&lt;/code>を作成すればok。&lt;/p>
&lt;p>※&lt;code>~/.config/git/ignore&lt;/code>を使用する場合、&lt;code>core.excludesfile&lt;/code>の設定の削除が必要&lt;/p>
&lt;h3 id="3-2-設定方法">3-2. 設定方法&lt;/h3>
&lt;p>&lt;code>~/.config/git/ignore&lt;/code>を作成し、無視したいファイルを追加するだけです。&lt;/p>
&lt;ul>
&lt;li>gitignoreテンプレート：&lt;a href="https://github.com/github/gitignore">github/gitignore&lt;/a>&lt;/li>
&lt;li>gitignore作成：&lt;a href="https://www.toptal.com/developers/gitignore">gitignore.io&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://git-scm.com/docs/gitignore">Git - gitignore Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.github.com/ja/get-started/git-basics/ignoring-files">ファイルを無視する - GitHub ドキュメント&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://kmyk.github.io/blog/blog/2020/11/08/man-gitignore/">gitignore を正しく理解したい - うさぎ小屋&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://zenn.dev/qnighy/articles/1a756f2857dc20">~/.gitignore_global を指定するのをやめ、デフォルトの置き場に置こう&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ikmbear.hatenablog.com/entry/2021/01/02/104829">「$HOME/git/ignore」と 「$GIT_DIR/info/exclude」と「.gitignore」の使い分け - セットプチフォッカ&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://git-scm.com/docs/git-rm">Git - git-rm Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.archlinux.jp/index.php/XDG_Base_Directory">XDG Base Directory - ArchWiki&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://kiririmode.hatenablog.jp/entry/20180404/1522843531">最近目にする$HOME/.configというディレクトリ - 理系学生日記&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tech.nitoyon.com/ja/blog/2013/04/05/sourcetree/">SourceTree が Git のグローバルな無視リストを書き換えて困った話 - てっく煮ブログ&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://alaki.co.jp/blog/?p=2582">.gitignorがないのにファイルがコミットできないときの対処方法&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【Rails】kaminariでページング処理を実装する</title><link>https://ama-blog.com/59/</link><pubDate>Fri, 16 Sep 2022 12:26:45 +0900</pubDate><guid>https://ama-blog.com/59/</guid><description>&lt;p>この記事では、kaminari gemを使ってページング処理(ページネーション)を実装する方法を紹介します。&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.5.1&lt;/li>
&lt;li>Ruby：3.1.2&lt;/li>
&lt;li>Rails：6.1.7&lt;/li>
&lt;li>kaminari：1.2.2&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-kaminari-gemのインストール">2-1. kaminari gemのインストール&lt;/h3>
&lt;p>Gemfileに以下を追記します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#e6db74">&amp;#39;kaminari&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下のコマンドを実行してkaminari gemをインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code>bundle install
&lt;/code>&lt;/pre>&lt;h3 id="2-2-ページネーションを実装">2-2. ページネーションを実装&lt;/h3>
&lt;p>コントローラーに以下を追記します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">index&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> @books &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Book&lt;/span>&lt;span style="color:#f92672">.&lt;/span>order(&lt;span style="color:#e6db74">:id&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>page(params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:page&lt;/span>&lt;span style="color:#f92672">]&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>デフォルトで25件/ページ&lt;/li>
&lt;li>Book.page(params[:page])だと並び順が変わることがあるため、必ず&lt;code>order&lt;/code>をつける
&lt;ul>
&lt;li>&lt;a href="https://railsguides.jp/active_record_querying.html#%E4%B8%A6%E3%81%B3%E9%A0%86">Active Record クエリインターフェイス - 4 並び順&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-order">order - ActiveRecord::QueryMethods&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>ビューファイルに以下を追記します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;%=&lt;/span> paginate @books &lt;span style="color:#f92672">%&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以上でページネーションの実装は完了です。&lt;/p>
&lt;h3 id="2-3-日本語化">2-3. 日本語化&lt;/h3>
&lt;p>kaminariが表示する&amp;quot;First&amp;quot;や&amp;quot;Last&amp;quot;のような表示を日本語化します。&lt;/p>
&lt;p>&lt;code>config/locales/ja.yml&lt;/code>に以下を追記します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">ja&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">views&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">pagination&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">first&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;最初&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">last&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;最後&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">previous&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;前&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">next&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;次&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">truncate&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;...&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a href="https://github.com/amatsuda/kaminari#i18n-and-labels">I18n and Labels - GitHub - amatsuda/kaminari&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/amatsuda/kaminari">GitHub - amatsuda/kaminari&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://qiita.com/nysalor/items/77b9d6bc5baa41ea01f3">kaminari徹底入門 #Ruby - Qiita&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://pikawaka.com/rails/kaminari">【Rails】 kaminariの使い方を理解してページネーションを実装しよう | Pikawaka&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【Rails】i18nで日本語化する方法</title><link>https://ama-blog.com/58/</link><pubDate>Thu, 15 Sep 2022 22:44:50 +0900</pubDate><guid>https://ama-blog.com/58/</guid><description>&lt;p>この記事では、Railsに同梱されているi18n gemを使ってアプリケーションを多言語化する方法を紹介します。&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.5.1&lt;/li>
&lt;li>Ruby：3.1.2&lt;/li>
&lt;li>Rails：6.1.7&lt;/li>
&lt;li>i18n：1.12.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-i18nモジュールの設定">2-1. i18nモジュールの設定&lt;/h3>
&lt;p>使用する言語のリストとデフォルトで使用する言語を設定します。&lt;/p>
&lt;p>&lt;code>config/initializers/locale.rb&lt;/code>に以下を追記します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 英語と日本語の利用を許可する&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">I18n&lt;/span>&lt;span style="color:#f92672">.&lt;/span>available_locales &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:en&lt;/span>, &lt;span style="color:#e6db74">:ja&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># デフォルトの言語を日本語にする&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">I18n&lt;/span>&lt;span style="color:#f92672">.&lt;/span>default_locale &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">:ja&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-2-ロケールファイルのダウンロード">2-2. ロケールファイルのダウンロード&lt;/h3>
&lt;p>使用する言語のデフォルトのロケールファイルを&lt;a href="https://github.com/svenfuchs/rails-i18n/">svenfuchs/rails-i18n&lt;/a>からダウンロードします。&lt;/p>
&lt;p>&lt;strong>日本語&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -o config/locales/ja.yml
&lt;/code>&lt;/pre>&lt;p>&lt;strong>英語&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/en.yml -o config/locales/en.yml
&lt;/code>&lt;/pre>&lt;p>上記のコマンドにより&lt;code>config/locales/ja.yml&lt;/code>と&lt;code>config/locales/en.yml&lt;/code>が作成されます。&lt;/p>
&lt;p>以降はこれらのファイルに翻訳を追加していきます。&lt;/p>
&lt;h3 id="2-3-active-recordモデルで翻訳を行なう">2-3. Active Recordモデルで翻訳を行なう&lt;/h3>
&lt;p>&lt;code>config/locales/ja.yml&lt;/code>に以下を追記します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">ja&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">activerecord&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">models&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">book&lt;/span>: &lt;span style="color:#ae81ff">本&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">attributes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">book&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">title&lt;/span>: &lt;span style="color:#ae81ff">タイトル&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">memo&lt;/span>: &lt;span style="color:#ae81ff">メモ&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>model_name.human&lt;/code>と&lt;code>human_attribute_name&lt;/code>を使ってモデル名とカラム名の訳語を表示します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">Book&lt;/span>&lt;span style="color:#f92672">.&lt;/span>model_name&lt;span style="color:#f92672">.&lt;/span>human &lt;span style="color:#75715e">#=&amp;gt; 本&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">Book&lt;/span>&lt;span style="color:#f92672">.&lt;/span>human_attribute_name(&lt;span style="color:#e6db74">:title&lt;/span>) &lt;span style="color:#75715e">#=&amp;gt; タイトル&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">Book&lt;/span>&lt;span style="color:#f92672">.&lt;/span>human_attribute_name(&lt;span style="color:#e6db74">:memo&lt;/span>) &lt;span style="color:#75715e">#=&amp;gt; メモ&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a href="https://railsguides.jp/i18n.html#active-model%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89">Rails 国際化（i18n）API - 4.7.2 Active Modelのメソッド&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;code>config/locales/en.yml&lt;/code>に英訳を追加します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">en&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">activerecord&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">models&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">book&lt;/span>: &lt;span style="color:#ae81ff">Book&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">attributes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">book&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">title&lt;/span>: &lt;span style="color:#ae81ff">Title&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">memo&lt;/span>: &lt;span style="color:#ae81ff">Memo&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-4-その他の翻訳">2-4. その他の翻訳&lt;/h3>
&lt;p>&lt;code>config/locales/ja.yml&lt;/code>に以下を追記します。&lt;/p></description></item><item><title>【Git】コミット済みファイルを管理対象から除外する方法</title><link>https://ama-blog.com/57/</link><pubDate>Wed, 14 Sep 2022 23:09:12 +0900</pubDate><guid>https://ama-blog.com/57/</guid><description>&lt;p>Gitは一度ファイルを追跡すると、&lt;code>.gitignore&lt;/code>に追加しても追跡は継続されます。&lt;/p>
&lt;ul>
&lt;li>&lt;code>.gitignore&lt;/code>に追加する前にコミットしてしまった。&lt;/li>
&lt;li>リモートリポジトリにすでに追跡されているファイルの追跡をやめたい。&lt;/li>
&lt;/ul>
&lt;p>このような既にGitの管理対象になっているファイルの追跡を止めるには以下のコマンドを実行します。&lt;/p>
&lt;p>&lt;strong>ファイルの場合&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>git rm --cached &amp;lt;ファイル&amp;gt;
&lt;/code>&lt;/pre>&lt;p>&lt;strong>ディレクトリの場合&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>git rm -r --cached &amp;lt;ディレクトリ&amp;gt;
&lt;/code>&lt;/pre>&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://git-scm.com/docs/git-rm">Git - git-rm Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stackoverflow.com/questions/1274057/how-do-i-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore">How do I make Git forget about a file that was tracked, but is now in .gitignore? - Stack Overflow&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stackabuse.com/git-stop-tracking-file-after-adding-to-gitignore/">Git: Stop Tracking File After Adding to .gitignore&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://alphaefficiency.com/git-stop-tracking-file">How to Stop Git Tracking a File | Alpha Efficiency.™&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://qiita.com/ytkt/items/a2afd6be8e4f06c1ea25">gitの管理対象から特定のファイル、ディレクトリを削除する #Git - Qiita&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【iTerm2】現在のディレクトリのまま新規タブを開く</title><link>https://ama-blog.com/56/</link><pubDate>Mon, 12 Sep 2022 23:02:49 +0900</pubDate><guid>https://ama-blog.com/56/</guid><description>&lt;p>iTerm2のデフォルトでは、ホームディレクトリで新規タブが開かれます。&lt;/p>
&lt;p>これを、元のタブと同じディレクトリで新規タブを開くように設定します。&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>iTerm2：3.4.16&lt;/li>
&lt;/ul>
&lt;h2 id="2-設定方法">2. 設定方法&lt;/h2>
&lt;ul>
&lt;li>Preference &amp;gt; Profile &amp;gt; Working Directory &amp;gt; Reuse previous session&amp;rsquo;s directory&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="設定画面" loading="lazy" src="https://ama-blog.com/56/images/1.jpg">&lt;/p>
&lt;p>以上で設定は終了です。&lt;/p>
&lt;h3 id="2-1-追加設定">2-1. 追加設定&lt;/h3>
&lt;ul>
&lt;li>Advanced Configuration &amp;gt; Edit&amp;hellip;
&lt;ul>
&lt;li>新規タブのほかに、新規ウィンドウとパネル分割時のディレクトリ設定が可能&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>【Ruby】Sinatraでメモアプリを作る(DB編)</title><link>https://ama-blog.com/55/</link><pubDate>Fri, 19 Aug 2022 21:35:50 +0900</pubDate><guid>https://ama-blog.com/55/</guid><description>&lt;p>この記事では、RubyのWebアプリケーションフレームワークであるSinatraを使って、シンプルなメモアプリを作成します。&lt;/p>
&lt;p>データ保存先のDBにはPostgreSQLを使用します。&lt;/p>
&lt;p>今回は、以下の記事で作成したメモアプリのデータ保存先をPostgreSQLに変更します。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/51/">【Ruby】Sinatraでメモアプリを作る(JSONファイル編) | あまブログ&lt;/a>&lt;/p>
&lt;p>PostgreSQLのインストール方法は以下を参照ください。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/22/">【macOS】PostgreSQLの基本操作 | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.5&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;li>Bundler：2.3.12&lt;/li>
&lt;li>PostgreSQL：14.3&lt;/li>
&lt;li>sinatra：2.2.2&lt;/li>
&lt;li>webrick：1.7.0&lt;/li>
&lt;li>sinatra-contrib：2.2.2&lt;/li>
&lt;li>pg：1.4.3&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-pgのインストール">2-1. pgのインストール&lt;/h3>
&lt;p>RubyからPostgreSQLを使うために必要なgem、&lt;a href="https://github.com/ged/ruby-pg">pg&lt;/a>をインストールします。&lt;/p>
&lt;p>&lt;code>Gemfile&lt;/code>に以下を追加します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">+&lt;/span> gem &lt;span style="color:#e6db74">&amp;#34;pg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gem &lt;span style="color:#e6db74">&amp;#34;sinatra&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下のコマンドを実行してgemをインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ bundle install
&lt;/code>&lt;/pre>&lt;h3 id="2-2-db接続とテーブル定義">2-2. DB接続とテーブル定義&lt;/h3>
&lt;p>&lt;code>memo.rb&lt;/code>でpgを使えるようにします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">-&lt;/span> require &lt;span style="color:#e6db74">&amp;#39;json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">+&lt;/span> require &lt;span style="color:#e6db74">&amp;#39;pg&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>memo.rb&lt;/code>の以下の部分を削除します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">FILE_PATH&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;public/memos.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">get_memos&lt;/span>(file_path)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">.&lt;/span>open(file_path) { &lt;span style="color:#f92672">|&lt;/span>f&lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">JSON&lt;/span>&lt;span style="color:#f92672">.&lt;/span>parse(f&lt;span style="color:#f92672">.&lt;/span>read) }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">set_memos&lt;/span>(file_path, memos)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">.&lt;/span>open(file_path, &lt;span style="color:#e6db74">&amp;#39;w&amp;#39;&lt;/span>) { &lt;span style="color:#f92672">|&lt;/span>f&lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">JSON&lt;/span>&lt;span style="color:#f92672">.&lt;/span>dump(memos, f) }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>memo.rb&lt;/code>に以下を追加します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">conn&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> @conn &lt;span style="color:#f92672">||=&lt;/span> &lt;span style="color:#66d9ef">PG&lt;/span>&lt;span style="color:#f92672">.&lt;/span>connect(&lt;span style="color:#e6db74">dbname&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;postgres&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>configure &lt;span style="color:#66d9ef">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result &lt;span style="color:#f92672">=&lt;/span> conn&lt;span style="color:#f92672">.&lt;/span>exec(&lt;span style="color:#e6db74">&amp;#34;SELECT * FROM information_schema.tables WHERE table_name = &amp;#39;memos&amp;#39;&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn&lt;span style="color:#f92672">.&lt;/span>exec(&lt;span style="color:#e6db74">&amp;#39;CREATE TABLE memos (id serial, title varchar(255), content text)&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> result&lt;span style="color:#f92672">.&lt;/span>values&lt;span style="color:#f92672">.&lt;/span>empty?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a href="https://deveiate.org/code/pg/PG.html#method-c-connect">PG.connect&lt;/a>でDBに接続し、インスタンス変数&lt;code>@conn&lt;/code>に接続情報をキャッシュ&lt;/li>
&lt;li>&lt;a href="https://github.com/sinatra/sinatra#configuration">configuration&lt;/a>にはアプリ起動時に一度だけ行う処理を記述&lt;/li>
&lt;li>PostgreSQLのシステムテーブル&lt;a href="https://www.postgresql.org/docs/current/infoschema-tables.html">tables&lt;/a>からmemosテーブルの存在を確認&lt;/li>
&lt;li>&lt;code>if result.values.empty?&lt;/code>でmemosテーブルがなければテーブルを作成&lt;/li>
&lt;/ul>
&lt;h3 id="2-3-メモ一覧の表示">2-3. メモ一覧の表示&lt;/h3>
&lt;p>&lt;code>memo.rb&lt;/code>に以下を追加します。&lt;/p></description></item><item><title>【Ruby3.1】wcコマンドを作る</title><link>https://ama-blog.com/54/</link><pubDate>Thu, 18 Aug 2022 22:00:26 +0900</pubDate><guid>https://ama-blog.com/54/</guid><description>&lt;p>この記事では、RubyでLinuxのwcコマンドを実装する方法を解説します。&lt;/p>
&lt;p>gemを使わずにRubyの標準ライブラリのみで実装します。&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.5&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-作成するwcコマンドの要件">2. 作成するwcコマンドの要件&lt;/h2>
&lt;ul>
&lt;li>オプションなし
&lt;ul>
&lt;li>標準入力とファイルの入力を受け取る&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-c&lt;/code>オプション&lt;/li>
&lt;li>&lt;code>-l&lt;/code>オプション&lt;/li>
&lt;li>&lt;code>-w&lt;/code>オプション
&lt;ul>
&lt;li>単語の区切り文字は半角スペース、タブ、改行のみに対応&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>以下の機能は実装の対象外とします。&lt;/p>
&lt;ul>
&lt;li>ノーブレークスペースを含むマルチバイト文字の対応&lt;/li>
&lt;/ul>
&lt;h2 id="3-wcコマンドの仕様">3. wcコマンドの仕様&lt;/h2>
&lt;p>macOS標準のwcコマンドの仕様は以下の通りです。(ソースコードは&lt;a href="https://opensource.apple.com/source/text_cmds/text_cmds-99/wc/wc.c.auto.html">こちら&lt;/a>)&lt;/p>
&lt;p>(今回の要件に必要な箇所のみ)&lt;/p>
&lt;ul>
&lt;li>引数なし
&lt;ul>
&lt;li>標準入力を受け取る&lt;/li>
&lt;li>Ctrl + D(EOF)を受け取るまで入力を受け付ける&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>引数にファイルを指定
&lt;ul>
&lt;li>ファイルを受け取る&lt;/li>
&lt;li>複数ファイルを指定した場合、出力の最終行に各ファイルの合計を表示
&lt;ul>
&lt;li>&lt;code>&amp;lt;合計の行数&amp;gt; &amp;lt;合計の単語数&amp;gt; &amp;lt;合計のバイト数&amp;gt; total&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>オプションなし
&lt;ul>
&lt;li>&lt;code>&amp;lt;行数&amp;gt; &amp;lt;単語数&amp;gt; &amp;lt;バイト数&amp;gt; &amp;lt;ファイル名&amp;gt;&lt;/code>の順で表示&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-c&lt;/code>オプション
&lt;ul>
&lt;li>バイト数を表示する&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-l&lt;/code>オプション
&lt;ul>
&lt;li>行数を表示する(改行コードの数)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-w&lt;/code>オプション
&lt;ul>
&lt;li>単語数を表示する&lt;/li>
&lt;li>半角スペース、タブ、改行で区切られた文字列の数(全角スペースはmacOS標準のwcコマンドも非対応)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="4-ソースコード">4. ソースコード&lt;/h2>
&lt;ul>
&lt;li>ver1：自作→レビュー反映&lt;/li>
&lt;li>ver2：ver1→他の人のコードを反映&lt;/li>
&lt;/ul>
&lt;h3 id="4-1-ver1">4-1. ver1&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># frozen_string_literal: true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;optparse&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">exec&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options &lt;span style="color:#f92672">=&lt;/span> parse_options
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options &lt;span style="color:#f92672">=&lt;/span> { &lt;span style="color:#e6db74">c&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>, &lt;span style="color:#e6db74">l&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>, &lt;span style="color:#e6db74">w&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span> } &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">.&lt;/span>empty?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> paths &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> paths&lt;span style="color:#f92672">.&lt;/span>empty? ? display_word_count_from_stdin(options) : display_word_count_from_files(paths, options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">parse_options&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">OptionParser&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options &lt;span style="color:#f92672">=&lt;/span> {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>on(&lt;span style="color:#e6db74">&amp;#39;-c&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>on(&lt;span style="color:#e6db74">&amp;#39;-l&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>on(&lt;span style="color:#e6db74">&amp;#39;-w&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>parse!(&lt;span style="color:#66d9ef">ARGV&lt;/span>, &lt;span style="color:#e6db74">into&lt;/span>: options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">display_word_count_from_stdin&lt;/span>(options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lines &lt;span style="color:#f92672">=&lt;/span> $stdin&lt;span style="color:#f92672">.&lt;/span>readlines
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_count_map &lt;span style="color:#f92672">=&lt;/span> build_word_count_map(lines)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> display_word_count(word_count_map, options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_word_count_map&lt;/span>(lines, path &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">number_of_lines&lt;/span>: count_line(lines),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">number_of_words&lt;/span>: count_word(lines),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">bytesize&lt;/span>: count_bytesize(lines),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">path&lt;/span>: path
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">count_line&lt;/span>(lines)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lines&lt;span style="color:#f92672">.&lt;/span>size
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">count_word&lt;/span>(lines)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lines&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>line&lt;span style="color:#f92672">|&lt;/span> line&lt;span style="color:#f92672">.&lt;/span>split(&lt;span style="color:#e6db74">/[ \t\n]+/&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>size }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">count_bytesize&lt;/span>(lines)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lines&lt;span style="color:#f92672">.&lt;/span>sum(&lt;span style="color:#f92672">&amp;amp;&lt;/span>&lt;span style="color:#e6db74">:bytesize&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">display_word_count&lt;/span>(word_count_map, options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_counts &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> format_word_count(word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:number_of_lines&lt;/span>&lt;span style="color:#f92672">]&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:l&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> format_word_count(word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:number_of_words&lt;/span>&lt;span style="color:#f92672">]&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:w&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> format_word_count(word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:bytesize&lt;/span>&lt;span style="color:#f92672">]&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:c&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#34; &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:path&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">unless&lt;/span> word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:path&lt;/span>&lt;span style="color:#f92672">].&lt;/span>empty?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts word_counts&lt;span style="color:#f92672">.&lt;/span>join
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">format_word_count&lt;/span>(word_count)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_count&lt;span style="color:#f92672">.&lt;/span>to_s&lt;span style="color:#f92672">.&lt;/span>rjust(&lt;span style="color:#ae81ff">8&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">display_word_count_from_files&lt;/span>(paths, options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_count_maps &lt;span style="color:#f92672">=&lt;/span> build_word_count_maps(paths)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> word_count_maps&lt;span style="color:#f92672">.&lt;/span>map { &lt;span style="color:#f92672">|&lt;/span>word_count_map&lt;span style="color:#f92672">|&lt;/span> display_word_count(word_count_map, options) }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> display_total_word_count(word_count_maps, options) &lt;span style="color:#66d9ef">if&lt;/span> paths&lt;span style="color:#f92672">.&lt;/span>size &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_word_count_maps&lt;/span>(paths)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> paths&lt;span style="color:#f92672">.&lt;/span>map &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>path&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lines &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">.&lt;/span>readlines(path)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> build_word_count_map(lines, path)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">display_total_word_count&lt;/span>(word_count_maps, options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> total_word_count_map &lt;span style="color:#f92672">=&lt;/span> build_total_word_count_map(word_count_maps)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> display_word_count(total_word_count_map, options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_total_word_count_map&lt;/span>(word_count_maps)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">number_of_lines&lt;/span>: word_count_maps&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>word_count_map&lt;span style="color:#f92672">|&lt;/span> word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:number_of_lines&lt;/span>&lt;span style="color:#f92672">]&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">number_of_words&lt;/span>: word_count_maps&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>word_count_map&lt;span style="color:#f92672">|&lt;/span> word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:number_of_words&lt;/span>&lt;span style="color:#f92672">]&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">bytesize&lt;/span>: word_count_maps&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>word_count_map&lt;span style="color:#f92672">|&lt;/span> word_count_map&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:bytesize&lt;/span>&lt;span style="color:#f92672">]&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">path&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;total&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>exec
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-2-ver2">4-2. ver2&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># frozen_string_literal: true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;optparse&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">exec&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options &lt;span style="color:#f92672">=&lt;/span> parse_options
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options &lt;span style="color:#f92672">=&lt;/span> { &lt;span style="color:#e6db74">c&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>, &lt;span style="color:#e6db74">l&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>, &lt;span style="color:#e6db74">w&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span> } &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">.&lt;/span>empty?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> paths &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> counts &lt;span style="color:#f92672">=&lt;/span> build_counts(&lt;span style="color:#e6db74">paths&lt;/span>: paths)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> counts&lt;span style="color:#f92672">.&lt;/span>map { &lt;span style="color:#f92672">|&lt;/span>count&lt;span style="color:#f92672">|&lt;/span> display_count(&lt;span style="color:#e6db74">count&lt;/span>: count, &lt;span style="color:#e6db74">options&lt;/span>: options) }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> display_total_count(&lt;span style="color:#e6db74">counts&lt;/span>: counts, &lt;span style="color:#e6db74">options&lt;/span>: options) &lt;span style="color:#66d9ef">if&lt;/span> paths&lt;span style="color:#f92672">.&lt;/span>size &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">parse_options&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">OptionParser&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options &lt;span style="color:#f92672">=&lt;/span> {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>on(&lt;span style="color:#e6db74">&amp;#39;-c&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>on(&lt;span style="color:#e6db74">&amp;#39;-l&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>on(&lt;span style="color:#e6db74">&amp;#39;-w&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> opt&lt;span style="color:#f92672">.&lt;/span>parse!(&lt;span style="color:#66d9ef">ARGV&lt;/span>, &lt;span style="color:#e6db74">into&lt;/span>: options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> options
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_counts&lt;/span>(&lt;span style="color:#e6db74">paths&lt;/span>:)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> paths&lt;span style="color:#f92672">.&lt;/span>empty?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">[&lt;/span>build_count(&lt;span style="color:#e6db74">text&lt;/span>: $stdin&lt;span style="color:#f92672">.&lt;/span>read)&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> paths&lt;span style="color:#f92672">.&lt;/span>map &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>path&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> build_count(&lt;span style="color:#e6db74">text&lt;/span>: &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">.&lt;/span>read(path), &lt;span style="color:#e6db74">path&lt;/span>: path)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_count&lt;/span>(&lt;span style="color:#e6db74">text&lt;/span>:, &lt;span style="color:#e6db74">path&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">line_count&lt;/span>: text&lt;span style="color:#f92672">.&lt;/span>count(&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">word_count&lt;/span>: text&lt;span style="color:#f92672">.&lt;/span>split(&lt;span style="color:#e6db74">/\s+/&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>size,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">bytesize&lt;/span>: text&lt;span style="color:#f92672">.&lt;/span>bytesize,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">path&lt;/span>: path
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">display_count&lt;/span>(&lt;span style="color:#e6db74">count&lt;/span>:, &lt;span style="color:#e6db74">options&lt;/span>:)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> formatted_counts &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> formatted_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> format_count(&lt;span style="color:#e6db74">count&lt;/span>: count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:line_count&lt;/span>&lt;span style="color:#f92672">]&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:l&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> formatted_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> format_count(&lt;span style="color:#e6db74">count&lt;/span>: count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:word_count&lt;/span>&lt;span style="color:#f92672">]&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:w&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> formatted_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> format_count(&lt;span style="color:#e6db74">count&lt;/span>: count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:bytesize&lt;/span>&lt;span style="color:#f92672">]&lt;/span>) &lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:c&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> formatted_counts &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#34; &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:path&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">unless&lt;/span> count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:path&lt;/span>&lt;span style="color:#f92672">].&lt;/span>empty?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts formatted_counts&lt;span style="color:#f92672">.&lt;/span>join
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">format_count&lt;/span>(&lt;span style="color:#e6db74">count&lt;/span>:)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> count&lt;span style="color:#f92672">.&lt;/span>to_s&lt;span style="color:#f92672">.&lt;/span>rjust(&lt;span style="color:#ae81ff">8&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">display_total_count&lt;/span>(&lt;span style="color:#e6db74">counts&lt;/span>:, &lt;span style="color:#e6db74">options&lt;/span>:)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> total_count &lt;span style="color:#f92672">=&lt;/span> build_total_count(&lt;span style="color:#e6db74">counts&lt;/span>: counts)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> display_count(&lt;span style="color:#e6db74">count&lt;/span>: total_count, &lt;span style="color:#e6db74">options&lt;/span>: options)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_total_count&lt;/span>(&lt;span style="color:#e6db74">counts&lt;/span>:)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">line_count&lt;/span>: counts&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>count&lt;span style="color:#f92672">|&lt;/span> count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:line_count&lt;/span>&lt;span style="color:#f92672">]&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">word_count&lt;/span>: counts&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>count&lt;span style="color:#f92672">|&lt;/span> count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:word_count&lt;/span>&lt;span style="color:#f92672">]&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">bytesize&lt;/span>: counts&lt;span style="color:#f92672">.&lt;/span>sum { &lt;span style="color:#f92672">|&lt;/span>count&lt;span style="color:#f92672">|&lt;/span> count&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">:bytesize&lt;/span>&lt;span style="color:#f92672">]&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">path&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;total&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>exec
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>【Ruby】rbenvのよく使うコマンド一覧</title><link>https://ama-blog.com/53/</link><pubDate>Tue, 16 Aug 2022 21:39:57 +0900</pubDate><guid>https://ama-blog.com/53/</guid><description>&lt;p>この記事ではrbenvのよく使うコマンドを紹介していきます。&lt;/p>
&lt;h2 id="1-バージョン確認">1. バージョン確認&lt;/h2>
&lt;h3 id="1-1-現在使用中のrubyのバージョンを表示">1-1. 現在使用中のRubyのバージョンを表示&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv version
&lt;/code>&lt;/pre>&lt;h3 id="1-2-インストール済みのrubyのバージョンを表示">1-2. インストール済みのRubyのバージョンを表示&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv versions
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>~/.rbenv/versions&lt;/code>のRubyのバージョンを表示&lt;/li>
&lt;/ul>
&lt;h2 id="2-インストール">2. インストール&lt;/h2>
&lt;h3 id="2-1-インストール可能なrubyの最新安定版のバージョンを表示">2-1. インストール可能なRubyの最新安定版のバージョンを表示&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv install -l/--list
&lt;/code>&lt;/pre>&lt;h3 id="2-2-インストール可能なrubyの全バージョンを表示">2-2. インストール可能なRubyの全バージョンを表示&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv install -L/--list-all
&lt;/code>&lt;/pre>&lt;h3 id="2-3-rubyのインストール">2-3. Rubyのインストール&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv install &amp;lt;version&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>~/.rbenv/versions&lt;/code>にインストールされる&lt;/li>
&lt;/ul>
&lt;h3 id="2-4-rubyのアンインストール">2-4. Rubyのアンインストール&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv uninstall &amp;lt;version&amp;gt;
&lt;/code>&lt;/pre>&lt;h2 id="3-バージョン指定">3. バージョン指定&lt;/h2>
&lt;p>&lt;strong>バージョンの優先順位&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>環境変数： &lt;code>RBENV_VERSION&lt;/code>&lt;/li>
&lt;li>ローカル ：&lt;code>rbenv local &amp;lt;version&amp;gt;&lt;/code>&lt;/li>
&lt;li>グローバル：&lt;code>rbenv global &amp;lt;version&amp;gt;&lt;/code>&lt;/li>
&lt;/ol>
&lt;h3 id="3-1-デフォルトで使用するrubyのバージョンを指定">3-1. デフォルトで使用するRubyのバージョンを指定&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv global &amp;lt;version&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>~/.rbenv/version&lt;/code>が作成され、グローバルに設定したRubyのバージョンが書き込まれる&lt;/li>
&lt;/ul>
&lt;h3 id="3-2-カレントディレクトリで使用するrubyのバージョンを指定">3-2. カレントディレクトリで使用するRubyのバージョンを指定&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv local &amp;lt;version&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>カレントディレクトリに&lt;code>.ruby-version&lt;/code>が作成され、ローカルに設定したRubyのバージョンが書き込まれる&lt;/li>
&lt;li>&lt;code>rbenv local --unset&lt;/code>で解除&lt;/li>
&lt;/ul>
&lt;h3 id="3-3-シェル単位で使用するrubyのバージョンを指定">3-3. シェル単位で使用するRubyのバージョンを指定&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv shell &amp;lt;version&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>環境変数&lt;code>$RBENV_VERSION&lt;/code>に指定したRubyのバージョンがセットされる&lt;/li>
&lt;li>&lt;code>rbenv shell --unset&lt;/code>で解除&lt;/li>
&lt;/ul>
&lt;h2 id="4-その他">4. その他&lt;/h2>
&lt;h3 id="4-1-rbenvのバージョンを表示">4-1. rbenvのバージョンを表示&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv -v
&lt;/code>&lt;/pre>&lt;h3 id="4-2-rbenvとruby-buildのアップグレード">4-2. rbenvとruby-buildのアップグレード&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ brew upgrade rbenv ruby-build
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>上記はHomebrewのコマンド&lt;/li>
&lt;li>&lt;code>rbenv install -l&lt;/code>でRubyの最新安定版のバージョンが表示されない時は&lt;code>rbenv&lt;/code>と&lt;code>ruby-build&lt;/code>の更新が必要かも&lt;/li>
&lt;/ul>
&lt;h3 id="4-3-rbenvのヘルプを表示">4-3. rbenvのヘルプを表示&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv -h
&lt;/code>&lt;/pre>&lt;h3 id="4-4-rbenvのコマンド詳細情報を表示">4-4. rbenvのコマンド詳細情報を表示&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ rbenv help &amp;lt;command&amp;gt;
&lt;/code>&lt;/pre>&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>【Mac】VSCodeのショートカットキーまとめ</title><link>https://ama-blog.com/52/</link><pubDate>Fri, 12 Aug 2022 21:39:52 +0900</pubDate><guid>https://ama-blog.com/52/</guid><description>&lt;p>この記事ではMacユーザー向けに、Visual Studio Codeのキーボードショートカットの中から特に使用頻度の高いものを紹介していきます。&lt;/p>
&lt;h2 id="1-一般">1. 一般&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>コマンドパレットを開く&lt;/td>
&lt;td>&lt;code>shift + ⌘ + P&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>クイックオープン&lt;/td>
&lt;td>&lt;code>⌘ + P &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>新規ウィンドウを開く&lt;/td>
&lt;td>&lt;code>shift + ⌘ + N &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ウィンドウを閉じる&lt;/td>
&lt;td>&lt;code>⌘ + W &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ユーザー設定を開く&lt;/td>
&lt;td>&lt;code>⌘ + , &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>キーボードショートカットを開く&lt;/td>
&lt;td>&lt;code>⌘ + K&lt;/code>→&lt;code>⌘ + S&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="2-基本的な編集">2. 基本的な編集&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>行を下に移動／上に移動&lt;/td>
&lt;td>&lt;code>option + ↓&lt;/code> / &lt;code>option + ↑&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>行の下にコピー/上にコピー&lt;/td>
&lt;td>&lt;code>shift + option + ↓&lt;/code> / &lt;code>shift + option + ↑&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>行の削除&lt;/td>
&lt;td>&lt;code>shift + ⌘ + K&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>行を下に挿入／上に挿入&lt;/td>
&lt;td>&lt;code>⌘ + Enter&lt;/code> / &lt;code>shift + ⌘ + Enter&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>一致する括弧にジャンプ&lt;/td>
&lt;td>&lt;code>shift + ⌘ + \ &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>行のインデント/アウトデント&lt;/td>
&lt;td>&lt;code>⌘ + ]&lt;/code> / &lt;code>⌘ + [ &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>コードを折りたたむ/展開する&lt;/td>
&lt;td>&lt;code>option + ⌘ + [&lt;/code> / &lt;code>option + ⌘ + ] &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>行コメントの切り替え&lt;/td>
&lt;td>&lt;code>⌘ + /&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>補完機能をトリガー&lt;/td>
&lt;td>&lt;code>control + space&lt;/code>&lt;br>&lt;code>⌘ + I&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="3-マルチカーソルと選択">3. マルチカーソルと選択&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>カーソルの挿入&lt;/td>
&lt;td>&lt;code>option + クリック &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>カーソルを下へ挿入/上へ挿入&lt;/td>
&lt;td>&lt;code>option + ⌘ + ↓&lt;/code> / &lt;code>option + ⌘ + ↑&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>現在の行を選択&lt;/td>
&lt;td>&lt;code>⌘ + L &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>選択中の文字列と一致する文字列を全て選択&lt;/td>
&lt;td>&lt;code>shift + ⌘ + L &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>矩形選択&lt;/td>
&lt;td>&lt;code>shift + option + マウスドラッグ&lt;/code>&lt;br>&lt;code>shift + option + ⌘ + ↑ / ↓ / ← / →&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="4-検索と置換">4. 検索と置換&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>検索&lt;/td>
&lt;td>&lt;code>⌘ + F &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>置換&lt;/td>
&lt;td>&lt;code>option + ⌘ + F&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>検索結果の次に移動/前に移動&lt;/td>
&lt;td>&lt;code>⌘ + G&lt;/code> / &lt;code>shift + ⌘ + G&lt;/code>&lt;br>&lt;code>Enter&lt;/code> / &lt;code>shift + Enter&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>マッチした文字列を全て選択&lt;/td>
&lt;td>&lt;code>option + Enter&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="5-ナビゲーション">5. ナビゲーション&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>指定行へ移動&lt;/td>
&lt;td>&lt;code>control + G&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>問題パネルを開く&lt;/td>
&lt;td>&lt;code>shift + ⌘ + M &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>パネルの表示/非表示切り替え&lt;/td>
&lt;td>&lt;code>⌘ + J&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="6-エディタの管理">6. エディタの管理&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>エディタを閉じる&lt;/td>
&lt;td>&lt;code>⌘ + W &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>フォルダを閉じる&lt;/td>
&lt;td>&lt;code>⌘ + K&lt;/code> → &lt;code>F&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>エディタを垂直分割&lt;/td>
&lt;td>&lt;code>⌘ + \ &lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="7-ファイル管理">7. ファイル管理&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>新規ファイル&lt;/td>
&lt;td>&lt;code>⌘ + N &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ファイルを開く&lt;/td>
&lt;td>&lt;code>⌘ + O &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>保存&lt;/td>
&lt;td>&lt;code>⌘ + S &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>閉じたエディタを開く&lt;/td>
&lt;td>&lt;code>shift + ⌘ + T&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>アクティブなファイルを新しいウィンドウに表示する&lt;/td>
&lt;td>&lt;code>⌘ + K&lt;/code> → &lt;code>O&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>最近開いた項目&lt;/td>
&lt;td>&lt;code>control + R&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="8-表示">8. 表示&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>エディタレイアウトの切り替え（水平／垂直）&lt;/td>
&lt;td>&lt;code>option + ⌘ + 0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>サイドバーの表示/非表示の切り替え&lt;/td>
&lt;td>&lt;code>⌘ + B &lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>出力パネルの表示&lt;/td>
&lt;td>&lt;code>shift + ⌘ + U&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Markdownプレビューをサイドに表示&lt;/td>
&lt;td>&lt;code>⌘ + K&lt;/code> → &lt;code>V&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Markdownプレビューを新規ファイルとして表示&lt;/td>
&lt;td>&lt;code>shift + ⌘ + V&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ターミナルを表示する&lt;/td>
&lt;td>&lt;code>control + `&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>新しいターミナルを作成する&lt;/td>
&lt;td>&lt;code>control + shift + `&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="9-その他">9. その他&lt;/h2>
&lt;h3 id="9-1-ユーザが作成したショートカットキーのみを表示する方法">9-1. ユーザが作成したショートカットキーのみを表示する方法&lt;/h3>
&lt;p>キーボードショートカットエディターの検索欄に&lt;code>@source:user&lt;/code>を入力する&lt;/p></description></item><item><title>【Ruby】Sinatraでメモアプリを作る(JSONファイル編)</title><link>https://ama-blog.com/51/</link><pubDate>Mon, 08 Aug 2022 21:39:45 +0900</pubDate><guid>https://ama-blog.com/51/</guid><description>&lt;p>この記事では、RubyのWebアプリケーションフレームワークであるSinatraを使って、シンプルなメモアプリを作成します。&lt;/p>
&lt;p>データの保存先にはDBを使わず、JSONファイルを使用します。&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.5&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;li>Bundler：2.3.12&lt;/li>
&lt;li>sinatra：2.2.2&lt;/li>
&lt;li>webrick：1.7.0&lt;/li>
&lt;li>sinatra-contrib：2.2.2&lt;/li>
&lt;/ul>
&lt;h2 id="2-メモアプリの要件">2. メモアプリの要件&lt;/h2>
&lt;p>以下のメモアプリを作成します。&lt;/p>
&lt;p>&lt;img alt="メモアプリ完成形" loading="lazy" src="https://ama-blog.com/51/images/1.gif">&lt;/p>
&lt;ul>
&lt;li>機能
&lt;ul>
&lt;li>メモの作成&lt;/li>
&lt;li>メモの編集&lt;/li>
&lt;li>メモの削除&lt;/li>
&lt;li>メモ一覧の表示&lt;/li>
&lt;li>特定のメモの表示&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="3-作成手順">3. 作成手順&lt;/h2>
&lt;p>以下の手順で進めていきます。&lt;/p>
&lt;ol>
&lt;li>設計&lt;/li>
&lt;li>実装&lt;/li>
&lt;li>改良&lt;/li>
&lt;/ol>
&lt;h3 id="3-1-設計">3-1. 設計&lt;/h3>
&lt;p>まずはアプリケーションの設計を行います。&lt;/p>
&lt;h4 id="3-1-1-uri設計">3-1-1. URI設計&lt;/h4>
&lt;p>RESTfulなURI設計として、今回は以下のURIを使用します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>/memos&lt;/td>
&lt;td>メモ一覧を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>/memos/new&lt;/td>
&lt;td>メモ作成画面を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>/memos/{memo_id}/edit&lt;/td>
&lt;td>メモ編集画面を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>/memos&lt;/td>
&lt;td>メモを作成&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>/memos/{memo_id}&lt;/td>
&lt;td>特定のメモを表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PATCH&lt;/td>
&lt;td>/memos/{memo_id}&lt;/td>
&lt;td>特定のメモを編集&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DELETE&lt;/td>
&lt;td>/memos/{memo_id}&lt;/td>
&lt;td>特定のメモを削除&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="3-1-2-ディレクトリ設計">3-1-2. ディレクトリ設計&lt;/h4>
&lt;p>ディレクトリ構成は以下のようになります。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>memo-app/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - public/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - memos.json &lt;span style="color:#75715e"># データ保存先&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - views/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - edit.erb &lt;span style="color:#75715e"># メモ編集画面&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - index.erb &lt;span style="color:#75715e"># メモ一覧表示画面&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - layout.erb &lt;span style="color:#75715e"># 各ビューの共通部分&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - new.erb &lt;span style="color:#75715e"># メモ作成画面&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - show.erb &lt;span style="color:#75715e"># 特定のメモ表示画面&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - memo.rb &lt;span style="color:#75715e"># ルーティング定義&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-2-実装">3-2. 実装&lt;/h3>
&lt;p>次にメインの機能の実装を行います。&lt;/p></description></item><item><title>【Ruby3.1】lsコマンドを作る</title><link>https://ama-blog.com/50/</link><pubDate>Thu, 04 Aug 2022 21:12:59 +0900</pubDate><guid>https://ama-blog.com/50/</guid><description>&lt;p>この記事では、RubyでLinuxのlsコマンドを実装する方法を解説します。&lt;/p>
&lt;p>gemを使わずにRubyの標準ライブラリのみで実装します。&lt;/p>
&lt;p>OOP版はこちら↓&lt;/p>
&lt;p>&lt;a href="https://ama-tech.hatenablog.com/ls-command-in-ruby-oop">【Ruby3.1】lsコマンドを作る(OOP版) - あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS：12.5&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-作成するlsコマンドの要件">2. 作成するlsコマンドの要件&lt;/h2>
&lt;p>今回はlsコマンドの以下の機能を実装の対象とします。&lt;/p>
&lt;ul>
&lt;li>オプションなしのlsコマンド
&lt;ul>
&lt;li>横に最大3列を維持して表示&lt;/li>
&lt;li>ファイルの並び順は列ごとに辞書式順序にソートされる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-a&lt;/code>オプション&lt;/li>
&lt;li>&lt;code>-r&lt;/code>オプション&lt;/li>
&lt;li>&lt;code>-l&lt;/code>オプション&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>ファイルの並び順&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># OK&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span> &lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#ae81ff">5&lt;/span> &lt;span style="color:#ae81ff">9&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#ae81ff">6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">3&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># NG&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">3&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span> &lt;span style="color:#ae81ff">5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">6&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span> &lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">9&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下の機能は実装の対象外とします。&lt;/p>
&lt;ul>
&lt;li>引数にファイルやディレクトリを指定可能にする&lt;/li>
&lt;li>mac拡張属性(@マーク)の表示&lt;/li>
&lt;/ul>
&lt;h2 id="3-lsコマンドの仕様">3. lsコマンドの仕様&lt;/h2>
&lt;p>macOS標準のlsコマンドの仕様は以下の通りです。(ソースコードは&lt;a href="https://opensource.apple.com/source/file_cmds/file_cmds-116.10/ls/ls.c.auto.html">こちら&lt;/a>)&lt;/p>
&lt;p>(今回の要件に必要な箇所のみ)&lt;/p>
&lt;ul>
&lt;li>引数なし
&lt;ul>
&lt;li>カレントディレクトリの内容を表示&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-a&lt;/code>オプション
&lt;ul>
&lt;li>ファイル名が&lt;code>.&lt;/code>で始まるファイルを含めて表示&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-l&lt;/code>オプション
&lt;ul>
&lt;li>ディレクトリ内の各ファイルのブロック数の合計を1行目に表示(&lt;code>total &amp;lt;blocks&amp;gt;&lt;/code>)&lt;/li>
&lt;li>2行目以降に各ファイルをロングフォーマットで表示&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>-r&lt;/code>オプション
&lt;ul>
&lt;li>逆順で表示&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="3-1-ロングフォーマットについて">3-1. ロングフォーマットについて&lt;/h3>
&lt;p>&lt;code>-l&lt;/code>オプション指定時に表示される以下のような形式をロングフォーマットと呼びます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>dr-xr-xr-x &lt;span style="color:#ae81ff">3&lt;/span> root wheel &lt;span style="color:#ae81ff">4539&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span> &lt;span style="color:#ae81ff">30&lt;/span> 07:10 dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ロングフォーマットに含まれるファイルの情報(属性)は以下の7つです。&lt;/p>
&lt;ol>
&lt;li>ファイルタイプとファイルモード&lt;/li>
&lt;li>ハードリンク数&lt;/li>
&lt;li>所有者名&lt;/li>
&lt;li>グループ名&lt;/li>
&lt;li>ファイルサイズ&lt;/li>
&lt;li>タイムスタンプ&lt;/li>
&lt;li>ファイル名&lt;/li>
&lt;/ol>
&lt;h4 id="3-1-1-ファイルタイプとファイルモード">3-1-1. ファイルタイプとファイルモード&lt;/h4>
&lt;ul>
&lt;li>ファイルタイプとファイルモードを10桁のアルファベットで表示(&lt;code>drwxr-xr-x&lt;/code>)
&lt;ul>
&lt;li>1桁目：ファイルタイプ&lt;/li>
&lt;li>2桁目~10桁目：ファイルモード&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/File=3a=3aStat/i/ftype.html">File::Stat#ftype&lt;/a>でファイルタイプを取得&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/File=3a=3aStat/i/mode.html">File::Stat#mode&lt;/a>でファイルモードを取得&lt;/li>
&lt;/ul>
&lt;p>lsコマンドの&lt;code>-l&lt;/code>オプションで表示されるファイルタイプとファイルモードの詳細については以下の記事を参照ください。&lt;/p></description></item><item><title>【Ruby】File::Stat#modeが返すファイルモードの数値を記号表記に変換する</title><link>https://ama-blog.com/49/</link><pubDate>Thu, 04 Aug 2022 12:44:15 +0900</pubDate><guid>https://ama-blog.com/49/</guid><description>&lt;p>この記事では、Rubyの&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/File=3a=3aStat/i/mode.html">File::Stat#mode&lt;/a>が返すファイルモードの数値と、記号表記(symbolic notation)の対応を解説します。&lt;/p>
&lt;p>ファイルモードの記号表記については以下の記事を参照ください。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/48/">【ls -l】ファイルタイプとファイルモードの記号の意味 | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-filestatmodeが返す値">1. File::Stat#modeが返す値&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>fs &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#66d9ef">Stat&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(&lt;span style="color:#e6db74">&amp;#39;sample.txt&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>p fs&lt;span style="color:#f92672">.&lt;/span>mode &lt;span style="color:#75715e">#=&amp;gt; 33188&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>p fs&lt;span style="color:#f92672">.&lt;/span>mode&lt;span style="color:#f92672">.&lt;/span>to_s(&lt;span style="color:#ae81ff">8&lt;/span>) &lt;span style="color:#75715e">#=&amp;gt; &amp;#34;100644&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>File::Stat#mode&lt;/code>はファイルモードを10進数の数値で返します。(&lt;code>33188&lt;/code>)&lt;/p>
&lt;p>これを意味のわかるものにするためには、8進表記の文字列に変換する必要があります。(&lt;code>&amp;quot;100644&amp;quot;&lt;/code>)&lt;/p>
&lt;h2 id="2-8進表記と記号表記の対応">2. 8進表記と記号表記の対応&lt;/h2>
&lt;p>ここからは8進表記の文字列と記号表記の対応を解説していきます。&lt;/p>
&lt;p>先ほど出てきた&lt;code>100644&lt;/code>を記号表記に変換すると以下のようになります。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>8進表記&lt;/th>
&lt;th>記号表記&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>100644&lt;/code>&lt;/td>
&lt;td>&lt;code>-rw-r--r--&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>この6桁の8進表記はそれぞれの桁ごとに以下の意味を持ちます。&lt;/p>
&lt;ul>
&lt;li>1~2桁目：ファイルタイプ&lt;/li>
&lt;li>3桁目：特殊権限&lt;/li>
&lt;li>4桁目：所有者の権限&lt;/li>
&lt;li>5桁目：グループの権限&lt;/li>
&lt;li>6桁目：その他のユーザの権限&lt;/li>
&lt;/ul>
&lt;p>以降で8進表記の各桁と記号表記の対応について詳しく解説していきます。&lt;/p>
&lt;h3 id="12桁目ファイルタイプ">1~2桁目：ファイルタイプ&lt;/h3>
&lt;p>&lt;code>File::Stat#mode&lt;/code>が返す6桁の8進表記の1~2桁目はファイルタイプを表します。&lt;/p>
&lt;p>ファイルタイプの8進表記と記号表記の対応は以下のようになります。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>8進表記&lt;/th>
&lt;th>記号表記&lt;/th>
&lt;th>ファイルタイプ&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>01&lt;/code>&lt;/td>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>名前付きパイプ(FIFO)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>02&lt;/code>&lt;/td>
&lt;td>&lt;code>c&lt;/code>&lt;/td>
&lt;td>キャラクタデバイス(Character special file)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>04&lt;/code>&lt;/td>
&lt;td>&lt;code>d&lt;/code>&lt;/td>
&lt;td>ディレクトリ(Directory)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>06&lt;/code>&lt;/td>
&lt;td>&lt;code>b&lt;/code>&lt;/td>
&lt;td>ブロックデバイス(Block special file)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>10&lt;/code>&lt;/td>
&lt;td>&lt;code>-&lt;/code>&lt;/td>
&lt;td>通常ファイル(Regular file)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>12&lt;/code>&lt;/td>
&lt;td>&lt;code>l&lt;/code>&lt;/td>
&lt;td>シンボリックリンク(Symbolic link)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>14&lt;/code>&lt;/td>
&lt;td>&lt;code>s&lt;/code>&lt;/td>
&lt;td>ソケット(Socket link)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="3桁目特殊権限">3桁目：特殊権限&lt;/h3>
&lt;p>&lt;code>File::Stat#mode&lt;/code>が返す6桁の8進表記の3桁目は特殊権限を表します。&lt;/p></description></item><item><title>【ls -l】ファイルタイプとファイルモードの記号の意味</title><link>https://ama-blog.com/48/</link><pubDate>Wed, 03 Aug 2022 22:57:02 +0900</pubDate><guid>https://ama-blog.com/48/</guid><description>&lt;p>この記事ではLinuxのlsコマンドの-lオプションで表示されるファイルタイプとファイルモードの記号の意味を解説します。&lt;/p>
&lt;p>&lt;code>ls -l&lt;/code>コマンドを実行すると、以下のようなファイルの詳細情報が表示されます。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ ls -l
-rw-r--r-- 1 uname staff 0 11 28 12:31 default.txt
drwxr-xr-x 2 uname staff 64 11 28 11:55 default_dir
&lt;/code>&lt;/pre>&lt;p>各行の先頭に表示される&lt;code>-rw-r--r--&lt;/code>や&lt;code>drwxr-xr-x&lt;/code>のような10桁の記号は、そのファイルのファイルタイプとファイルモードを表します。&lt;/p>
&lt;ul>
&lt;li>1桁目：ファイルタイプ&lt;/li>
&lt;li>2桁目~10桁目：ファイルモード&lt;/li>
&lt;/ul>
&lt;p>以降では、ファイルタイプとファイルモードの記号の意味を解説していきます。&lt;/p>
&lt;h2 id="1-ファイルタイプ">1. ファイルタイプ&lt;/h2>
&lt;p>&lt;code>ls -l&lt;/code>で表示される10桁の記号のうち1桁目はファイルタイプを表します。&lt;/p>
&lt;p>ファイルタイプを表す記号の種類は以下の7つです。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>記号&lt;/th>
&lt;th>ファイルタイプ&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>b&lt;/code>&lt;/td>
&lt;td>ブロックデバイス(Block special file)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>c&lt;/code>&lt;/td>
&lt;td>キャラクタデバイス(Character special file)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>d&lt;/code>&lt;/td>
&lt;td>ディレクトリ(Directory)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>l&lt;/code>&lt;/td>
&lt;td>シンボリックリンク(Symbolic link)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>s&lt;/code>&lt;/td>
&lt;td>ソケット(Socket link)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>名前付きパイプ(FIFO)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-&lt;/code>&lt;/td>
&lt;td>通常ファイル(Regular file)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="2-ファイルモード">2. ファイルモード&lt;/h2>
&lt;p>&lt;code>ls -l&lt;/code>で表示される10桁の記号のうち2桁目~10桁目はファイルモードを表します。&lt;/p>
&lt;p>このファイルモードは以下の3文字×3組で表されます。&lt;/p>
&lt;ul>
&lt;li>3文字(権限なし：&lt;code>-&lt;/code>)
&lt;ul>
&lt;li>&lt;code>r&lt;/code>：読み込み&lt;/li>
&lt;li>&lt;code>w&lt;/code>：書き込み&lt;/li>
&lt;li>&lt;code>x&lt;/code>：実行&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>3組
&lt;ul>
&lt;li>所有者(owner)&lt;/li>
&lt;li>グループ(group)&lt;/li>
&lt;li>その他のユーザ(other)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>例えばファイルモードが&lt;code>rwxr-xr-x&lt;/code>の場合、所有者は読み込み・書き込み・実行の全てを許可(&lt;code>rwx&lt;/code>)、グループは読み込み・実行を許可(&lt;code>r-x&lt;/code>)、その他のユーザも読み込み・実行を許可(&lt;code>r-x&lt;/code>)という意味になります。&lt;/p>
&lt;h3 id="2-1-特殊権限スティッキービットsgidsuid">2-1. 特殊権限(スティッキービット、SGID、SUID)&lt;/h3>
&lt;p>ファイルモードを表す記号には前述の&lt;code>r&lt;/code>,&lt;code>w&lt;/code>,&lt;code>x&lt;/code>,&lt;code>-&lt;/code>以外に、特殊権限を表す記号があります。&lt;/p></description></item><item><title>RubyでJSONファイルを扱う方法</title><link>https://ama-blog.com/47/</link><pubDate>Sat, 30 Jul 2022 22:36:55 +0900</pubDate><guid>https://ama-blog.com/47/</guid><description>&lt;p>この記事ではJSONの基礎と、RubyでJSONファイルを扱う方法を紹介します。&lt;/p>
&lt;h2 id="1-jsonの基礎">1. JSONの基礎&lt;/h2>
&lt;h3 id="1-1-jsonjavascript-object-notationとは">1-1. JSON(JavaScript Object Notation)とは&lt;/h3>
&lt;ul>
&lt;li>データ記述言語の1つ&lt;/li>
&lt;li>プログラミング言語を問わず利用することができる(JavaScript, Java, PHP, Ruby, Python など)&lt;/li>
&lt;li>名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する&lt;/li>
&lt;li>MIEMタイプは&lt;code>application/json&lt;/code>&lt;/li>
&lt;li>拡張子は&lt;code>json&lt;/code>&lt;/li>
&lt;li>文字コードは&lt;code>UTF-8&lt;/code>でエンコードすることが必須&lt;/li>
&lt;li>ウェブアプリケーションでデータを転送する場合によく使われる&lt;/li>
&lt;/ul>
&lt;h3 id="1-2-jsonの表記方法">1-2. JSONの表記方法&lt;/h3>
&lt;h4 id="jsonのデータ型">JSONのデータ型&lt;/h4>
&lt;p>JSONは以下のデータ型で構成されます。&lt;/p>
&lt;ol>
&lt;li>文字列(string)&lt;/li>
&lt;li>数値(number)&lt;/li>
&lt;li>真偽値(boolean)&lt;/li>
&lt;li>ヌル値(null)&lt;/li>
&lt;li>オブジェクト(object)&lt;/li>
&lt;li>配列(array)&lt;/li>
&lt;/ol>
&lt;h5 id="1-文字列string">1. 文字列(string)&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;John&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>ダブルクォーテーションで囲んだ文字列を指定(シングルクォーテーションは使えない)&lt;/li>
&lt;li>バックスラッシュでエスケープしたUnicode文字で構成される&lt;/li>
&lt;/ul>
&lt;h5 id="2-数値number">2. 数値(number)&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;number_1&amp;#34;&lt;/span> : &lt;span style="color:#ae81ff">210&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;number_2&amp;#34;&lt;/span> : &lt;span style="color:#ae81ff">215&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;number_3&amp;#34;&lt;/span> : &lt;span style="color:#ae81ff">21.05&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;number_4&amp;#34;&lt;/span> : &lt;span style="color:#ae81ff">10.05&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>10進法表記のみ(8進、16進法表記は使えない)&lt;/li>
&lt;li>浮動小数点数も使用できる&lt;/li>
&lt;/ul>
&lt;h5 id="3-真偽値boolean">3. 真偽値(boolean)&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;active_flag&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;delete_flag&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>true&lt;/code> と&lt;code>false&lt;/code>はすべて小文字で指定&lt;/li>
&lt;/ul>
&lt;h5 id="4-ヌル値null">4. ヌル値(null)&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;middlename&amp;#34;&lt;/span>:&lt;span style="color:#66d9ef">null&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>null&lt;/code>はすべて小文字で指定&lt;/li>
&lt;/ul>
&lt;h5 id="5-オブジェクトobject">5. オブジェクト(object)&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;employee&amp;#34;&lt;/span>:{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;John&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;age&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">30&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;city&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;New York&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>キーとして使うデータ型は文字列に限る&lt;/li>
&lt;li>JavaScriptにおける連想配列、Rubyにおけるハッシュ&lt;/li>
&lt;/ul>
&lt;h5 id="6-配列array">6. 配列(array)&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>[
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;John&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;age&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">30&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;Carol&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;age&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">21&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>配列要素には、文字列、数値、真偽値、ヌル値、オブジェクト、配列すべてを使用できる&lt;/li>
&lt;/ul>
&lt;h2 id="2-rubyでjsonファイルを扱う方法">2. RubyでJSONファイルを扱う方法&lt;/h2>
&lt;h3 id="2-1-jsonファイルを読み込んでrubyオブジェクトに変換する">2-1. JSONファイルを読み込んでRubyオブジェクトに変換する&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/File/s/open.html">File.open&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/JSON/m/load.html">JSON.#load&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>array.json&lt;/strong>&lt;/p></description></item><item><title>【Ruby】JSON.parseエラー対処【no implicit conversion of File into String (TypeError)】</title><link>https://ama-blog.com/46/</link><pubDate>Sat, 30 Jul 2022 22:29:25 +0900</pubDate><guid>https://ama-blog.com/46/</guid><description>&lt;h2 id="1-バージョン情報">1. バージョン情報&lt;/h2>
&lt;ul>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;li>robocop：1.32.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-経緯">2. 経緯&lt;/h2>
&lt;p>以下のような、JSONファイルを読み込むコードを書いていた。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>file_path &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;test.json&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>p &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">.&lt;/span>open(file_path) { &lt;span style="color:#f92672">|&lt;/span>f&lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">JSON&lt;/span>&lt;span style="color:#f92672">.&lt;/span>load(f) } &lt;span style="color:#75715e">#=&amp;gt; ファイルの内容&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>これをrubocopでチェックすると以下の警告文が表示された。&lt;/p>
&lt;pre tabindex="0">&lt;code>Security/JSONLoad: Prefer JSON.parse over JSON.load.
&lt;/code>&lt;/pre>&lt;p>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/JSON/m/load.html">JSON.load()&lt;/a>ではなく&lt;a href="https://docs.ruby-lang.org/ja/latest/method/JSON/m/parse.html">JSON.parse()&lt;/a>を使えと言っている。&lt;/p>
&lt;p>以下のように&lt;code>JSON.parse()&lt;/code>を使うように修正したところエラーが発生した。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>file_path &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;test.json&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>p &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">.&lt;/span>open(file_path) { &lt;span style="color:#f92672">|&lt;/span>f&lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">JSON&lt;/span>&lt;span style="color:#f92672">.&lt;/span>parse(f) } &lt;span style="color:#75715e">#=&amp;gt; no implicit conversion of File into String (TypeError)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="3-エラー対処法">3. エラー対処法&lt;/h2>
&lt;p>&lt;code>JSON.parse()&lt;/code>は引数に文字列を指定する必要があり、引数にファイルは指定できない。&lt;/p>
&lt;p>なので、先ほどのコードを以下のように修正すると上手くいく。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>file_path &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;test.json&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>p &lt;span style="color:#66d9ef">File&lt;/span>&lt;span style="color:#f92672">.&lt;/span>open(file_path) { &lt;span style="color:#f92672">|&lt;/span>f&lt;span style="color:#f92672">|&lt;/span> &lt;span style="color:#66d9ef">JSON&lt;/span>&lt;span style="color:#f92672">.&lt;/span>parse(f&lt;span style="color:#f92672">.&lt;/span>read) } &lt;span style="color:#75715e">#=&amp;gt; ファイルの内容&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/class/File.html">Fileクラス&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/IO/i/read.html">IO#read&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.rubydoc.info/gems/rubocop/0.46.0/RuboCop/Cop/Security/JSONLoad">RubyDoc.info: Class: RuboCop::Cop::Security::JSONLoad – Documentation for rubocop (0.46.0) – RubyDoc.info&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stackoverflow.com/questions/28685897/no-implicit-conversion-of-file-into-string">ruby - No implicit conversion of file into string - Stack Overflow&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【REST】TwitterのURLを再設計する</title><link>https://ama-blog.com/45/</link><pubDate>Mon, 25 Jul 2022 21:13:14 +0900</pubDate><guid>https://ama-blog.com/45/</guid><description>&lt;p>この記事ではRESTの考え方を理解するために、TwitterのURLをRESTの設計原則に従って再設計します。&lt;/p>
&lt;h2 id="1-対象の機能">1. 対象の機能&lt;/h2>
&lt;p>今回はTwitterの以下の機能を再設計の対象とします。&lt;/p>
&lt;ul>
&lt;li>ユーザを表示する&lt;/li>
&lt;li>ツイートする&lt;/li>
&lt;li>ツイートに返信する&lt;/li>
&lt;li>引用ツイートをする&lt;/li>
&lt;li>リツイートする&lt;/li>
&lt;li>フォローする&lt;/li>
&lt;li>フォロー一覧を表示する&lt;/li>
&lt;li>フォロワー一覧を表示する&lt;/li>
&lt;li>リストを作成する&lt;/li>
&lt;li>リストにユーザを追加する&lt;/li>
&lt;li>リストからユーザを削除する&lt;/li>
&lt;li>リスト一覧を表示する&lt;/li>
&lt;li>リストを表示する&lt;/li>
&lt;/ul>
&lt;h2 id="2-url設計">2. URL設計&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>users/{user_id}&lt;/td>
&lt;td>特定のユーザを表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>tweets&lt;/td>
&lt;td>ツイートを作成する(返信、引用ツイート含む)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>retweets&lt;/td>
&lt;td>特定のツイートをリツイートする&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>followings&lt;/td>
&lt;td>特定のユーザをフォローする&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>followings&lt;/td>
&lt;td>ログイン中のユーザのフォロー一覧を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>followers&lt;/td>
&lt;td>ログイン中のユーザのフォロワー一覧を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>users/{user_id}/followings&lt;/td>
&lt;td>特定のユーザのフォロー一覧を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>users/{user_id}/followers&lt;/td>
&lt;td>特定のユーザのフォロワー一覧を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>lists&lt;/td>
&lt;td>リストを作成する&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>lists/{list_id}/members&lt;/td>
&lt;td>特定のリストに特定のユーザを追加する&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DELETE&lt;/td>
&lt;td>lists/{list_id}/members/{user_id}&lt;/td>
&lt;td>特定のリストから特定のユーザを削除する&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>lists&lt;/td>
&lt;td>ログイン中のユーザのリスト一覧を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>users/{user_id}/lists&lt;/td>
&lt;td>特定のユーザのリスト一覧を表示&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>lists/{list_id}&lt;/td>
&lt;td>特定のリストを表示&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="3-解説">3. 解説&lt;/h2>
&lt;h3 id="3-1-ツイートする返信引用ツイート含む">3-1. ツイートする(返信・引用ツイート含む)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>tweets&lt;/td>
&lt;td>ツイートを作成する(返信、引用ツイート含む)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>ツイートをするのは常にログインユーザのため、URIにログインユーザのidは含めない&lt;/li>
&lt;li>返信の場合、リクエストのボディに返信先のツイートの情報を含める&lt;/li>
&lt;li>引用ツイートの場合、リクエストのボディに引用するツイートのidを含める&lt;/li>
&lt;/ul>
&lt;h3 id="3-2-リツイートする">3-2. リツイートする&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>retweets&lt;/td>
&lt;td>特定のツイートをリツイートする&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>リツイートをするのは常にログインユーザのため、URIにログインユーザのidは含めない&lt;/li>
&lt;li>リクエストのボディにリツイートするツイートのidを含める&lt;/li>
&lt;/ul>
&lt;h3 id="3-3-フォローする">3-3. フォローする&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>followings&lt;/td>
&lt;td>特定のユーザをフォローする&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>フォローを実行するのは常にログインユーザのため、URIにログインユーザのidは含めない&lt;/li>
&lt;li>リクエストのボディにフォローするユーザのidを含める&lt;/li>
&lt;/ul>
&lt;h3 id="3-4-リストにユーザを追加する">3-4. リストにユーザを追加する&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>lists/{list_id}/members&lt;/td>
&lt;td>特定のリストに特定のユーザを追加する&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>リストへのユーザ追加を実行するのは常にログインユーザのため、URIにログインユーザのidは含めない&lt;/li>
&lt;li>リクエストのボディにリストに追加するユーザのidを含める&lt;/li>
&lt;/ul>
&lt;h3 id="3-5-リストを表示する">3-5. リストを表示する&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>lists/{list_id}&lt;/td>
&lt;td>特定のリストを表示&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>リストを一意に特定できれば、そこからリストを所有するユーザはわかるため、&lt;code>users/{user_id}/lists/{list_id}&lt;/code>とする必要はない&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>【Git】特定のコミットを修正する方法【rebase -i】</title><link>https://ama-blog.com/44/</link><pubDate>Mon, 25 Jul 2022 21:02:39 +0900</pubDate><guid>https://ama-blog.com/44/</guid><description>&lt;h2 id="1-はじめに">1. はじめに&lt;/h2>
&lt;p>本稿では、&lt;code>git rebase -i&lt;/code>を使った特定のコミットの修正方法を解説します。&lt;/p>
&lt;ul>
&lt;li>直前のコミットだけではなく、2つ以上前のコミットを修正できる&lt;/li>
&lt;li>コミットメッセージの修正だけではなく、ファイルの編集内容の修正も可能&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>チーム開発等で既にpushしているコミットに対しての使用には注意が必要です。&lt;/strong>&lt;/p>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;p>以下の手順で進めていきます。&lt;/p>
&lt;ol>
&lt;li>コミットログの確認&lt;/li>
&lt;li>git rebase -i HEAD~n&lt;/li>
&lt;li>修正したいコミットの「pick」を「edit」に変更&lt;/li>
&lt;li>ファイルの修正&lt;/li>
&lt;li>git add&lt;/li>
&lt;li>git commit &amp;ndash;amend&lt;/li>
&lt;li>git rebase &amp;ndash;continue&lt;/li>
&lt;/ol>
&lt;h3 id="2-1-コミットログの確認">2-1. コミットログの確認&lt;/h3>
&lt;p>以下のコマンドを実行して、修正したいコミットを確認します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>git log --oneline
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>a00d4fa &lt;span style="color:#f92672">(&lt;/span>HEAD -&amp;gt; main&lt;span style="color:#f92672">)&lt;/span> file2.txtを修正
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>091fed5 file2.txtを作成
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>d4a404b file1.txtを修正 &lt;span style="color:#75715e"># これを修正したい&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>6f86174 file1.txtを作成
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>今回は以下のコミットを修正したいと思います。&lt;/p>
&lt;pre tabindex="0">&lt;code>d4a404b file1.txtを修正
&lt;/code>&lt;/pre>&lt;h3 id="2-2-git-rebase--i-headn">2-2. git rebase -i HEAD~n&lt;/h3>
&lt;p>&lt;code>git rebase -i HEAD~n&lt;/code> コマンドで、デフォルトのテキストエディタに直近のn個のコミットを表示できます。&lt;/p>
&lt;p>今回修正したいコミットはHEADを含めて3つ目のコミットなので、以下のコマンドを実行します。&lt;/p>
&lt;pre tabindex="0">&lt;code>git rebase -i HEAD~3
&lt;/code>&lt;/pre>&lt;p>すると、テキストエディタで以下のように表示されます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># コミット一覧のファイル&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pick d4a404b file1.txtを修正
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pick 091fed5 file2.txtを作成
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pick a00d4fa file2.txtを修正
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Rebase 6f86174..a00d4fa onto 6f86174 (3 commands)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Commands:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># p, pick &amp;lt;commit&amp;gt; = use commit&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># r, reword &amp;lt;commit&amp;gt; = use commit, but edit the commit message&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># e, edit &amp;lt;commit&amp;gt; = use commit, but stop for amending&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># s, squash &amp;lt;commit&amp;gt; = use commit, but meld into previous commit&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># f, fixup [-C | -c] &amp;lt;commit&amp;gt; = like &amp;#34;squash&amp;#34; but keep only the previous&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># commit&amp;#39;s log message, unless -C is used, in which case&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># keep only this commit&amp;#39;s message; -c is same as -C but&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># opens the editor&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># x, exec &amp;lt;command&amp;gt; = run command (the rest of the line) using shell&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># b, break = stop here (continue rebase later with &amp;#39;git rebase --continue&amp;#39;)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># d, drop &amp;lt;commit&amp;gt; = remove commit&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># l, label &amp;lt;label&amp;gt; = label current HEAD with a name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># t, reset &amp;lt;label&amp;gt; = reset HEAD to a label&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># m, merge [-C &amp;lt;commit&amp;gt; | -c &amp;lt;commit&amp;gt;] &amp;lt;label&amp;gt; [# &amp;lt;oneline&amp;gt;]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># . create a merge commit using the original merge commit&amp;#39;s&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># . message (or the oneline, if no original merge commit was&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># . specified); use -c &amp;lt;commit&amp;gt; to reword the commit message&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># These lines can be re-ordered; they are executed from top to bottom.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># If you remove a line here THAT COMMIT WILL BE LOST.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># However, if you remove everything, the rebase will be aborted.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-3-修正したいコミットのpickをeditに変更">2-3. 修正したいコミットの「pick」を「edit」に変更&lt;/h3>
&lt;p>&lt;code>d4a404b&lt;/code>のコミットを&lt;code>pick&lt;/code>から&lt;code>edit&lt;/code>に変更します。&lt;/p></description></item><item><title>【MacBook】USキーボードで簡単に「英字⇄かな」切替する方法</title><link>https://ama-blog.com/43/</link><pubDate>Sat, 23 Jul 2022 20:42:35 +0900</pubDate><guid>https://ama-blog.com/43/</guid><description>&lt;p>&lt;img alt="USキーボードで簡単に「英字⇄かな」切替する方法" loading="lazy" src="https://ama-blog.com/43/images/1.jpg">&lt;/p>
&lt;p>&lt;strong>USキーボードのMacBookを買ったけど、日本語入力への変換がめんどくさい！&lt;/strong>&lt;/p>
&lt;p>&lt;strong>「英字⇄かな」切替をもっと簡単にする方法はないかな？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>本記事の内容
&lt;ul>
&lt;li>USキーボードのMacBookで「英字⇄かな」切替を簡単に行う方法&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>今回は、USキーボードのMacBookで「英字⇄かな」切替を簡単に行う方法を紹介します。&lt;/strong>&lt;/p>
&lt;p>MacBookは見た目がカッコいいUSキーボードを選びました。&lt;/p>
&lt;p>徐々にUSキーボードに慣れてきた中で、唯一解決しない問題が「英字⇄かな」切替がめんどくさいことです。&lt;/p>
&lt;p>何故なら、USキーボードには「全角/半角」切替ボタンがありません。&lt;/p>
&lt;p>さらにMacBookのデフォルトでは「英字⇄かな」切替のショートカットキーが「Control + スペースキー」 に割り当てられています。&lt;/p>
&lt;p>そしてこの「Control + スペースキー」がめちゃくちゃ打ちづらい！&lt;/p>
&lt;p>&lt;strong>そこで今回は、そんな問題を解決するオススメの方法を2つ紹介します。&lt;/strong>&lt;/p>
&lt;h2 id="方法1command--スペースキーで切り替える">方法1.「Command + スペースキー」で切り替える&lt;/h2>
&lt;p>こちらの方法は、やることはシンプルで、&lt;strong>デフォルトのショートカットキーである「Control + スペースキー」を「Command + スペースキー」に変えるだけです。&lt;/strong>&lt;/p>
&lt;p>「Command」と「スペースキー」が隣り合っているので、とても簡単に「英字⇄かな」切替ができます。&lt;/p>
&lt;h3 id="手順1システム環境設定からキーボードを選択">手順1.「システム環境設定」から「キーボード」を選択&lt;/h3>
&lt;p>まず最初にDockの「システム環境設定」を開き、「キーボード」を選択します。&lt;/p>
&lt;p>&lt;img alt="「システム環境設定」から「キーボード」を選択" loading="lazy" src="https://ama-blog.com/43/images/2.png">&lt;/p>
&lt;h3 id="手順2ショートカットタブの入力ソースを選択">手順2.「ショートカット」タブの「入力ソース」を選択&lt;/h3>
&lt;p>次に「ショートカット」タブをクリックし、左側のリストから「入力ソース」を選択します。&lt;/p>
&lt;p>&lt;img alt="「ショートカット」タブの「入力ソース」を選択" loading="lazy" src="https://ama-blog.com/43/images/3.png">&lt;/p>
&lt;h3 id="手順3前の入力ソースを選択をクリックしてから新しいキーを設定">手順3.「前の入力ソースを選択」をクリックしてから新しいキーを設定&lt;/h3>
&lt;p>次に、「前の入力ソースを選択」をクリックし、「Command + スペースキー」を直接入力します。&lt;/p>
&lt;p>&lt;img alt="「前の入力ソースを選択」をクリックしてから新しいキーを設定" loading="lazy" src="https://ama-blog.com/43/images/4.png">&lt;/p>
&lt;h4 id="黄色い三角マークが出た場合">黄色い三角マークが出た場合&lt;/h4>
&lt;p>下の画像のように、「Command + スペースキー」設定後に黄色い三角マークが出た場合はもう少し設定をする必要があります。&lt;/p>
&lt;p>&lt;img alt="黄色い三角マークが出た場合の設定" loading="lazy" src="https://ama-blog.com/43/images/5.png">&lt;/p>
&lt;p>この黄色い三角マークは、先ほど設定した「Command + スペースキー」が既に別のアクション(デフォルトでは「Spotlight検索」)のショートカットキーとして割り当てられていることを意味します。&lt;/p>
&lt;p>なので既に「Command + スペースキー」が割り当てられていた「Spotlight検索」のショートカットキーを変更することでこの問題は解決します。&lt;/p>
&lt;p>手順3と同じように、今度は「Spotlight」→「Spotlight検索を表示」を選択して、「Control + スペースキー」を入力します。&lt;/p>
&lt;p>&lt;img alt="「Spotlight」→「Spotlight検索を表示」を選択して、「Control + スペースキー」を入力" loading="lazy" src="https://ama-blog.com/43/images/6.png">&lt;/p>
&lt;p>「Control + スペースキー」がちゃんと設定されると以下のように黄色い三角マークは消えます。&lt;/p>
&lt;p>&lt;img alt="「Control + スペースキー」設定後" loading="lazy" src="https://ama-blog.com/43/images/7.png">&lt;/p>
&lt;p>以上で設定完了です！&lt;/p>
&lt;h2 id="方法2caps-lockで切り替える">方法2.「caps lock」で切り替える&lt;/h2>
&lt;p>2つ目方法では、「caps lock」ボタンで「英字⇄かな」切り替えを行えるようにします。&lt;/p>
&lt;h3 id="手順1システム環境設定からキーボードを選択-1">手順1.「システム環境設定」から「キーボード」を選択&lt;/h3>
&lt;p>まず最初にDockの「システム環境設定」を開き、「キーボード」を選択します。&lt;/p>
&lt;p>&lt;img alt="「システム環境設定」から「キーボード」を選択" loading="lazy" src="https://ama-blog.com/43/images/8.png">&lt;/p>
&lt;h3 id="手順2入力ソースタブを選択しcaps-lockキーで英字入力モードと切り替えるをチェック">手順2.「入力ソース」タブを選択し、「Caps Lockキーで英字入力モードと切り替える」をチェック&lt;/h3>
&lt;p>次に「入力ソース」タブを選択し、「Caps Lockキーで英字入力モードと切り替える」にチェックを入れます。&lt;/p></description></item><item><title>【未経験・独学】基本情報技術者試験の勉強時間はどれくらい必要？</title><link>https://ama-blog.com/42/</link><pubDate>Wed, 20 Jul 2022 11:14:03 +0900</pubDate><guid>https://ama-blog.com/42/</guid><description>&lt;p>&lt;img alt="基本情報技術者試験の勉強時間はどれくらい必要？" loading="lazy" src="https://ama-blog.com/42/images/1.jpg">&lt;/p>
&lt;ul>
&lt;li>本記事の内容
&lt;ul>
&lt;li>IT業界未経験から合格までに必要な勉強時間&lt;/li>
&lt;li>勉強のスケジュール&lt;/li>
&lt;li>勉強内容&lt;/li>
&lt;li>オススメの参考書&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;u>&lt;strong>今回はIT業界未経験から独学で基本情報技術者試験に合格するための方法を解説します。&lt;/strong>&lt;/u>&lt;/p>
&lt;p>この記事を書いている僕は、平成30年度秋期 基本情報技術者試験に合格しました。&lt;/p>
&lt;p>&lt;img alt="平成30年度秋期 基本情報技術者試験 合格" loading="lazy" src="https://ama-blog.com/42/images/2.jpg">&lt;/p>
&lt;p>これから基本情報技術者試験の勉強を始める方は、ぜひこの記事を読んでみてください！&lt;/p>
&lt;h2 id="1-it業界未経験でも3ヶ月の勉強期間で合格できる">1. IT業界未経験でも3ヶ月の勉強期間で合格できる&lt;/h2>
&lt;p>IT業界未経験の方でも、&lt;u>&lt;strong>3ヶ月で180時間&lt;/strong>&lt;/u>の勉強で合格できます。&lt;/p>
&lt;h3 id="1-1-当時の自分のレベル">1-1. 当時の自分のレベル&lt;/h3>
&lt;p>社会人1年目の10月に受験しました。&lt;/p>
&lt;p>学生時代にパソコンに触れる機会は、Wordでレポートを提出するときくらいでした。&lt;/p>
&lt;p>試験勉強を始める前にやっていたことといえば、社内研修で1ヶ月間C言語を教わったことくらいです。&lt;/p>
&lt;p>基本情報技術者試験に合格すれば会社から資格取得手当が貰えたし、何かしらの勉強はしたかったので、存在を知った瞬間から受験する気はありました。&lt;/p>
&lt;p>ただ流石にまだ合格は無理だろうと思って、1年目の10月は受験しないで次の2年目の4月に受験しようと思っていました。&lt;/p>
&lt;p>7月くらいに現場の先輩から「基本情報受けるの？」と聞かれ、まだ無理だと思うから今回は受けないと答えると、「いやいや今からでも全然行けるっしょ」と受験する気がないことに結構驚かれました。&lt;/p>
&lt;p>そしたらなんか僕も「え、マジっすか、いけんすか。」ってなって、「いけんのかぁ、じゃ受けてみようかなぁ」って感じで受けたら、いけました。&lt;/p>
&lt;p>このような感じで僕のような素人でも3ヶ月の勉強で合格できたので、受験しようか迷ってる方にはぜひ挑戦してほしいです！&lt;/p>
&lt;h3 id="1-2-合格までに必要な勉強時間">1-2. 合格までに必要な勉強時間&lt;/h3>
&lt;p>&lt;strong>IT業界未経験で知識0からのスタートでも、180時間あれば十分に合格レベルまで持っていけます。&lt;/strong>&lt;/p>
&lt;p>期間は余裕を持って3ヶ月くらいあるといいです。&lt;/p>
&lt;p>毎日2時間×90日=180時間が理想ですが、仕事がある人は平日1時間、土日に5時間ずつで週15時間×12週間=180時間くらいのペースでもいいです。&lt;/p>
&lt;p>180時間の配分はざっくり以下を目指しましょう。&lt;/p>
&lt;ul>
&lt;li>午前対策
&lt;ul>
&lt;li>80時間&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>午後対策
&lt;ul>
&lt;li>100時間&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="2-勉強のスケジュール">2. 勉強のスケジュール&lt;/h2>
&lt;p>ここからは勉強のスケジュールを紹介していきます。&lt;/p>
&lt;p>僕の場合は以下のようなスケジュールで勉強しました。&lt;/p>
&lt;p>&lt;img alt="勉強のスケジュール" loading="lazy" src="https://ama-blog.com/42/images/3.png">&lt;/p>
&lt;p>入社した4月に会社から基本情報技術者試験の参考書が支給されていたので、図に示す期間の前から参考書を読んだりしていました。&lt;/p>
&lt;p>8/1に午前試験の過去問を1回解いてみたところから本格的な勉強スタートです。&lt;/p>
&lt;p>そこから9/16までは午前対策のみを行いました。&lt;/p>
&lt;p>9/16から午後対策を始めたので、9/16~9/28までの期間は午前、午後どちらの勉強もしている状態です。&lt;/p>
&lt;p>9/28で完全に午前対策をやめて、午後対策のみに集中しました。&lt;/p>
&lt;p>本番1週間前の10/13~10/14の二日間で、本番同様に午前・午後を通しで2回分解きました。&lt;/p>
&lt;p>ラスト1週間は最後の調整で、午後試験を中心に今までやったことを確認したり、気になるところの過去問を解き直したりしていました。&lt;/p>
&lt;h2 id="3-勉強内容">3. 勉強内容&lt;/h2>
&lt;p>ここからは実際に行った勉強内容を紹介していきます。&lt;/p>
&lt;h3 id="3-1-午前試験">3-1. 午前試験&lt;/h3>
&lt;p>以下の流れで午前試験の勉強を行いました。&lt;/p>
&lt;ul>
&lt;li>試しに過去問を1回分解いてみる&lt;/li>
&lt;li>参考書1周&lt;/li>
&lt;li>過去問演習と参考書の復習
&lt;ul>
&lt;li>過去問1~50→3回分&lt;/li>
&lt;li>過去問51~80→19回分&lt;/li>
&lt;li>参考書2~3周目&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>過去問1~80→3回分&lt;/li>
&lt;/ul>
&lt;p>まずは点数を気にせずにとりあえず過去問を1回解いてみて午前試験がどのようなものかを確認しました。&lt;/p>
&lt;p>そのあとで参考書を簡単に1周読み、あとはひたすら過去問演習をしました。&lt;/p>
&lt;p>参考書の2~3周目もがっつり読みこむのではなく、過去問演習をしていく中でわからない用語に遭遇したら、その都度参考書で確認していくという方法で読み進めていきました。&lt;/p>
&lt;p>過去問51〜80をかなり解いていますが、これは51〜80(マネジメント/ストラテジ系)は計算用紙がいらず、1問にかかる時間が短いので仕事中暇なときに&lt;a href="https://www.fe-siken.com/">基本情報技術者試験ドットコム&lt;/a>でずっと解いていたためです。&lt;/p>
&lt;p>僕の場合、午前対策の期間が8/1〜9/28の59日間とずいぶん長いですが、最初はのんびり勉強していたということもあるので、この内容なら40日間×2時間=80時間くらいで終わると思います。&lt;/p>
&lt;p>知識0からのスタートだと知らない単語だらけなので午前対策の期間が長くなりがちですが、午前試験は暗記ゲーなので、そこまで一生懸命理解しようとしなくても大丈夫です。&lt;/p>
&lt;p>&lt;strong>とりあえず過去問を解きまくって、ある程度いけそうだと思ったら午前対策はやめて、午後対策に移りましょう。&lt;/strong>&lt;/p>
&lt;h3 id="3-2-午後試験">3-2. 午後試験&lt;/h3>
&lt;p>以下の流れで午後試験の勉強を行いました。&lt;/p></description></item><item><title>【初心者向け】JavaScriptで簡単なゲームを30分で作ろう！</title><link>https://ama-blog.com/41/</link><pubDate>Sun, 17 Jul 2022 21:58:10 +0900</pubDate><guid>https://ama-blog.com/41/</guid><description>&lt;p>&lt;img alt="JavaScriptでゲームを作ろう！" loading="lazy" src="https://ama-blog.com/41/images/1.png">&lt;/p>
&lt;p>&lt;strong>JavaScript初心者でも簡単に作れるゲームが知りたい！&lt;/strong>&lt;/p>
&lt;p>&lt;strong>ゲームの作り方の詳しい解説やソースコードも見たい！&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>本記事の内容
&lt;ul>
&lt;li>ゲームの完成形とソースコード&lt;/li>
&lt;li>ゲームの作り方の解説&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>この記事は、&lt;strong>JavaScriptの基礎文法を一通り学んで「実際に何かを作ってみたい！」&lt;/strong> という方に向けたものになっています。&lt;/p>
&lt;p>ライブラリなどは一切使わず、JavaScriptの基礎文法だけで作れるゲームを紹介します。&lt;/p>
&lt;p>今回作るゲームはJavaScript初心者の方でも30分で作ることができます。&lt;/p>
&lt;p>実際に手を動かして、JavaScriptの理解を深めていきましょう！&lt;/p>
&lt;h2 id="1-数字当てゲーム">1. 数字当てゲーム&lt;/h2>
&lt;p>&lt;img alt="数字当てゲーム" loading="lazy" src="https://ama-blog.com/41/images/2.jpg">&lt;/p>
&lt;p>簡単な「数字当てゲーム」を作っていきます。&lt;/p>
&lt;h3 id="1-1-完成形とソースコード">1-1. 完成形とソースコード&lt;/h3>
&lt;p>以下が今回作るゲームの完成形です。&lt;/p>
&lt;p>&lt;img alt="ゲームの完成形" loading="lazy" src="https://ama-blog.com/41/images/3.gif">&lt;/p>
&lt;ul>
&lt;li>1~20までの数字を予想してスコアを競うゲームです。&lt;/li>
&lt;li>表示されるヒントを頼りに正解の数字を予想していきます。&lt;/li>
&lt;li>より少ない回数で数字を当てると高得点になります。&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://djkazunoko.github.io/guess_number/">デモサイト&lt;/a>で実際の動きを確認できます。&lt;/p>
&lt;p>ソースコードは&lt;a href="https://github.com/djkazunoko/guess_number/tree/main/docs">こちら&lt;/a>から確認できます。&lt;/p>
&lt;h3 id="1-2-このゲームを作って学べること">1-2. このゲームを作って学べること&lt;/h3>
&lt;p>今回の「数字当てゲーム」を作って学べることは以下の2つです。&lt;/p>
&lt;ul>
&lt;li>JavaScriptのDOM操作&lt;/li>
&lt;li>コードのリファクタリング&lt;/li>
&lt;/ul>
&lt;h3 id="1-3-用意するもの">1-3. 用意するもの&lt;/h3>
&lt;p>以下の3つのファイルを用意しましょう。&lt;/p>
&lt;ul>
&lt;li>&lt;code>index.html&lt;/code>&lt;/li>
&lt;li>&lt;code>style.css&lt;/code>&lt;/li>
&lt;li>&lt;code>script.js&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>これらのファイルは&lt;a href="https://github.com/djkazunoko/guess_number/tree/main/starter">こちら&lt;/a>にあります。&lt;/p>
&lt;h2 id="2-まずはゲームの仕様を理解しよう">2. まずはゲームの仕様を理解しよう&lt;/h2>
&lt;p>&lt;img alt="まずはゲームの仕様を理解しよう" loading="lazy" src="https://ama-blog.com/41/images/4.jpg">&lt;/p>
&lt;p>コードを書く前に、まずはゲームの仕様を理解しましょう。&lt;/p>
&lt;h3 id="2-1-仕様の確認">2-1. 仕様の確認&lt;/h3>
&lt;p>今回の「数字当てゲーム」は大きく3つの機能に分けることができます。&lt;/p>
&lt;ul>
&lt;li>メイン機能
&lt;ul>
&lt;li>ユーザーが数字を入力してチェックボタンをクリックすると処理を実行&lt;/li>
&lt;li>入力された値によって異なるメッセージを表示&lt;/li>
&lt;li>入力された数字が不正解の場合、スコアを1減らしてゲーム続行&lt;/li>
&lt;li>入力された数字が正解の場合、正解の数字を表示してゲーム終了&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>リセット機能
&lt;ul>
&lt;li>リセットボタンをクリックしてゲームを再スタート&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ハイスコア機能
&lt;ul>
&lt;li>ハイスコアを表示する&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-必要な要素の確認">2-2. 必要な要素の確認&lt;/h3>
&lt;p>必要な要素は以下の7つです。&lt;/p>
&lt;ol>
&lt;li>正解の数字(secretNumber)&lt;/li>
&lt;li>入力された数字(inputNumber)&lt;/li>
&lt;li>スコア(score)&lt;/li>
&lt;li>メッセージ(message)&lt;/li>
&lt;li>チェックボタン(check)&lt;/li>
&lt;li>リセットボタン(reset)&lt;/li>
&lt;li>ハイスコア(highscore)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>1. 正解の数字(secretNumber)&lt;/strong>&lt;/p>
&lt;p>変数secretNumberに1~20までのランダムな数字を設定します。&lt;/p>
&lt;p>正解した時にこの数字を表示させます。&lt;/p>
&lt;p>&lt;strong>2. 入力された数字(inputNumber)&lt;/strong>&lt;/p>
&lt;p>変数inputNumberにユーザーにより入力された数字を代入します。&lt;/p>
&lt;p>この値をもとに条件分岐を行います。&lt;/p></description></item><item><title>【VSCode】オススメ拡張機能まとめ</title><link>https://ama-blog.com/40/</link><pubDate>Sun, 10 Jul 2022 23:35:51 +0900</pubDate><guid>https://ama-blog.com/40/</guid><description>&lt;p>この記事では、Visual Studio Codeのオススメの拡張機能を紹介していきます。(随時更新中)&lt;/p>
&lt;h2 id="1-一般">1. 一般&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker">Code Spell Checker&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja">Japanese Language Pack for Visual Studio Code&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">Material Icon Theme&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager">Project Manager&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="2-html">2. HTML&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=ecmel.vscode-html-css">HTML CSS Support&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=mkaufman.HTMLHint">HTMLHint&lt;/a>
&lt;ul>
&lt;li>こちらの&lt;a href="https://marketplace.visualstudio.com/items?itemName=HTMLHint.vscode-htmlhint">HTMLHint&lt;/a>に移行推奨&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer">Live Server&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-complete-tag">Auto Complete Tag&lt;/a>
&lt;ul>
&lt;li>VSCodeの基本設定だけで代替可能(&lt;a href="https://ama-tech.hatenablog.com/vscode-auto-closing-and-renaming-html-tags-without-extensions">詳細&lt;/a>)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=techer.open-in-browser">open in browser&lt;/a>
&lt;ul>
&lt;li>Live Serverがあればほぼいらない、&lt;code>&amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;&lt;/code>で書いたJSファイルを読み込んでるhtmlファイルは&lt;code>file://&lt;/code> プロトコル経由で開いても動作しない&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="3-ruby">3. Ruby&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=Shopify.ruby-lsp">Ruby LSP&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=KoichiSasada.vscode-rdbg">VSCode rdbg Ruby Debugger&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="3-1-rails">3-1. Rails&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=sianglim.slim">Slim&lt;/a>
&lt;ul>
&lt;li>slim使う場合はあったほうがいい&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="4-javascript">4. JavaScript&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint">ESLint&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode">Prettier&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=xabikos.JavaScriptSnippets">JavaScript (ES6) code snippets&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode">IntelliCode&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=tombonnike.vscode-status-bar-format-toggle">Formatting Toggle&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="4-1-vuejs">4-1. Vue.js&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=vue.volar">Volar&lt;/a>
&lt;ul>
&lt;li>Vue3からはVolar、Vue2なら&lt;a href="https://marketplace.visualstudio.com/items?itemName=octref.vetur">Vetur&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="5-postgresql">5. PostgreSQL&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=ckolkman.vscode-postgres">PostgreSQL&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="6-git">6. Git&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory">Git History&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens">GitLens&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="7-docker">7. Docker&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker">Docker&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>【Mac】Chromeのショートカットキーまとめ</title><link>https://ama-blog.com/39/</link><pubDate>Sun, 10 Jul 2022 22:44:19 +0900</pubDate><guid>https://ama-blog.com/39/</guid><description>&lt;p>この記事ではMacユーザー向けに、Google Chromeのキーボードショートカットの中から特に使用頻度の高いものを紹介していきます。&lt;/p>
&lt;h2 id="1-タブとウィンドウのショートカット">1. タブとウィンドウのショートカット&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>新しいウィンドウを開く&lt;/td>
&lt;td>&lt;code>⌘ + n&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>新しいウィンドウをシークレットモードで開く&lt;/td>
&lt;td>&lt;code>⌘ + shift + n&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>新しいタブを開いてそのタブに移動する&lt;/td>
&lt;td>&lt;code>⌘ + t&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>閉じたタブを閉じた順序で再び開く&lt;/td>
&lt;td>&lt;code>⌘ + shift + t&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>タブの移動&lt;/td>
&lt;td>&lt;code>⌘ + option + ←&lt;/code>または&lt;code>⌘ + option + →&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>現在のタブのページを戻る・進む&lt;/td>
&lt;td>&lt;code>⌘ + ←&lt;/code>または&lt;code>⌘ + →&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>現在のタブを閉じる&lt;/td>
&lt;td>&lt;code>⌘ + w&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="2-google-chrome-機能のショートカット">2. Google Chrome 機能のショートカット&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>ページ内の文字列検索&lt;/td>
&lt;td>&lt;code>⌘ + f&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>文字列検索で一致する次の部分に移動する&lt;/td>
&lt;td>&lt;code>⌘ + g&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>文字列検索で一致する前の部分に移動する&lt;/td>
&lt;td>&lt;code>⌘ + shift + g&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>デベロッパーツールを開く&lt;/td>
&lt;td>&lt;code>⌘ + option + i&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="3-アドレスバーのショートカット">3. アドレスバーのショートカット&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>サイト名に www. と .com を追加して現在のタブで開く&lt;/td>
&lt;td>&lt;code>サイト名を入力 + control + enter&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>アドレスバーに移動する&lt;/td>
&lt;td>&lt;code>⌘ + l&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>アドレスバーから予測候補を削除する&lt;/td>
&lt;td>&lt;code>shift + fn + delete&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="4-ウェブページのショートカット">4. ウェブページのショートカット&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>ショートカット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>現在のページを再読み込みする&lt;/td>
&lt;td>&lt;code>⌘ + r&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>キャッシュを無視して現在のページを再読み込みする&lt;/td>
&lt;td>&lt;code>⌘ + shift + r&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>現在のページの HTML ソースコードを表示する&lt;/td>
&lt;td>&lt;code>⌘ + option + u&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>全画面表示モードをオンまたはオフにする&lt;/td>
&lt;td>&lt;code>⌘ + control + f&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ページを 1 画面ずつ下にスクロールする&lt;/td>
&lt;td>&lt;code>space&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ページを 1 画面ずつ上にスクロールする&lt;/td>
&lt;td>&lt;code>shift + space&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>【ER図】Twitterのデータベースを設計する</title><link>https://ama-blog.com/38/</link><pubDate>Thu, 07 Jul 2022 23:31:36 +0900</pubDate><guid>https://ama-blog.com/38/</guid><description>&lt;p>この記事ではTwitterのサイトのER図の書き方を解説します。&lt;/p>
&lt;p>論理設計の対象はTwitterの一部の機能に限定し、ER図はIE記法で、Draw.ioで作成しました。&lt;/p>
&lt;h2 id="1-対象の機能">1. 対象の機能&lt;/h2>
&lt;ul>
&lt;li>ユーザを表示する&lt;/li>
&lt;li>ツイートする&lt;/li>
&lt;li>ツイートに返信する&lt;/li>
&lt;li>リツイートする&lt;/li>
&lt;li>引用ツイートする&lt;/li>
&lt;li>フォローする&lt;/li>
&lt;li>フォロー一覧を表示する&lt;/li>
&lt;li>フォロワー一覧を表示する&lt;/li>
&lt;li>リストにユーザーを追加する&lt;/li>
&lt;li>リスト一覧を表示する&lt;/li>
&lt;li>リストをフォローする&lt;/li>
&lt;/ul>
&lt;h2 id="2-er図">2. ER図&lt;/h2>
&lt;p>&lt;img alt="ER図" loading="lazy" src="https://ama-blog.com/38/images/1.png">&lt;/p>
&lt;h2 id="3-テーブル定義">3. テーブル定義&lt;/h2>
&lt;h3 id="3-1-usersテーブル">3-1. usersテーブル&lt;/h3>
&lt;p>ユーザーの情報を管理するテーブル&lt;/p>
&lt;ul>
&lt;li>username
&lt;ul>
&lt;li>&lt;code>@&lt;/code>から始まるアカウント固有の識別名(ユーザー名)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>name
&lt;ul>
&lt;li>表示名(名前)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>bio
&lt;ul>
&lt;li>自己紹介&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>location
&lt;ul>
&lt;li>場所&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>website
&lt;ul>
&lt;li>ウェブサイト&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>date_of_birth
&lt;ul>
&lt;li>生年月日&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>profile_image
&lt;ul>
&lt;li>プロフィール画像&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>header_image
&lt;ul>
&lt;li>ヘッダー画像&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="3-2-tweetsテーブル">3-2. tweetsテーブル&lt;/h3>
&lt;p>ユーザーのツイートを管理するテーブル&lt;/p>
&lt;ul>
&lt;li>user_id
&lt;ul>
&lt;li>ツイートしたユーザーのid&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>content
&lt;ul>
&lt;li>ツイート文&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>image
&lt;ul>
&lt;li>ツイート画像&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>reply_to
&lt;ul>
&lt;li>返信の場合、返信先のツイートのidが入る&lt;/li>
&lt;li>通常のツイートの場合はnull(または0)が入る&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>quote_tweet_id
&lt;ul>
&lt;li>引用ツイートの場合、引用元のツイートのidが入る&lt;/li>
&lt;li>通常ツイートの場合、null(または0)が入る&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="3-3-retweetsテーブル">3-3. retweetsテーブル&lt;/h3>
&lt;p>リツイートしたユーザーとリツイートされたツイートの関連を表すテーブル(誰がどのツイートをリツイートしたかの情報を持つテーブル)&lt;/p>
&lt;ul>
&lt;li>user_id
&lt;ul>
&lt;li>リツイートしたユーザーのid&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>tweet_id
&lt;ul>
&lt;li>リツイートされたツイートのid&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="3-4-followsテーブル">3-4. followsテーブル&lt;/h3>
&lt;p>フォローしたユーザーとフォローされたユーザーの関連を表すテーブル(誰をフォローして誰にフォローされているかの情報を持つテーブル)&lt;/p>
&lt;ul>
&lt;li>follower_id
&lt;ul>
&lt;li>フォローという行為をしたユーザーのid(誰かをフォローしたユーザーのid = 誰かのフォロワーになるユーザーのid)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>followee_id
&lt;ul>
&lt;li>フォローの対象となるユーザーのid(誰かにフォローされているユーザーのid)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="3-5-listsテーブル">3-5. listsテーブル&lt;/h3>
&lt;p>リストの情報を管理するテーブル&lt;/p></description></item><item><title>【VSCode】HTMLタグの自動閉じタグ補完・自動タグ名変更を拡張機能なしで設定する方法</title><link>https://ama-blog.com/37/</link><pubDate>Sat, 25 Jun 2022 22:55:04 +0900</pubDate><guid>https://ama-blog.com/37/</guid><description>&lt;h2 id="1-はじめに">1. はじめに&lt;/h2>
&lt;p>Visual Studio Codeの拡張機能である&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-complete-tag">Auto Complete Tag&lt;/a>が提供する機能は、Visual Studio Codeの基本設定だけで代替可能です。&lt;/p>
&lt;p>この記事では、拡張機能をインストールすることなく、HTMLタグの自動閉じタグ補完機能と自動タグ名変更機能を有効にする方法を紹介します。&lt;/p>
&lt;h2 id="2-auto-complete-tag">2. Auto Complete Tag&lt;/h2>
&lt;p>Visual Studio Codeの拡張機能に&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-complete-tag">Auto Complete Tag&lt;/a>というものがあります。&lt;/p>
&lt;p>Auto Complete Tagとは&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag">Auto Close Tag&lt;/a>と&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag">Auto Rename Tag&lt;/a>の機能を合わせたもので、この拡張機能を有効にするとHTMLタグの自動閉じタグ補完(Auto Close Tag)と自動タグ名変更(Auto Rename Tag)ができるようになります。&lt;/p>
&lt;h3 id="2-1-auto-close-tag">2-1. Auto Close Tag&lt;/h3>
&lt;ul>
&lt;li>開始タグの閉じ括弧を入力すると、終了タグが自動的に挿入されます。&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="Auto Close Tag" loading="lazy" src="https://ama-blog.com/37/images/1.gif">&lt;/p>
&lt;h3 id="2-2-auto-rename-tag">2-2. Auto Rename Tag&lt;/h3>
&lt;ul>
&lt;li>一方のHTMLタグの名前を変更すると、対になるHTMLタグの名前も自動的に変更されます。&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="Auto Rename Tag" loading="lazy" src="https://ama-blog.com/37/images/2.gif">&lt;/p>
&lt;h2 id="3-設定方法">3. 設定方法&lt;/h2>
&lt;h3 id="3-1-自動閉じタグ補完auto-close-tag">3-1. 自動閉じタグ補完(Auto Close Tag)&lt;/h3>
&lt;ol>
&lt;li>&lt;code>command + ,&lt;/code>で設定を開く&lt;/li>
&lt;li>&lt;code>Auto Closing Tags&lt;/code>で検索&lt;/li>
&lt;li>&lt;code>HTML: Auto Closing Tags&lt;/code>にチェックを入れて設定を有効にする&lt;/li>
&lt;/ol>
&lt;p>&lt;code>settings.json&lt;/code>を直接編集する場合は以下を記入。&lt;/p>
&lt;pre tabindex="0">&lt;code>{
&amp;#34;html.autoClosingTags&amp;#34;: true
}
&lt;/code>&lt;/pre>&lt;h3 id="3-2-自動タグ名変更auto-rename-tag">3-2. 自動タグ名変更(Auto Rename Tag)&lt;/h3>
&lt;ol>
&lt;li>&lt;code>command + ,&lt;/code>で設定を開く&lt;/li>
&lt;li>&lt;code>Editor: Linked Editing&lt;/code>で検索&lt;/li>
&lt;li>&lt;code>Editor: Linked Editing&lt;/code>にチェックを入れて設定を有効にする&lt;/li>
&lt;/ol>
&lt;p>&lt;code>settings.json&lt;/code>を直接編集する場合は以下を記入。&lt;/p></description></item><item><title>【Git】作業ツリー上の変更を取り消す方法</title><link>https://ama-blog.com/36/</link><pubDate>Sat, 25 Jun 2022 10:24:31 +0900</pubDate><guid>https://ama-blog.com/36/</guid><description>&lt;p>この記事では&lt;code>git add&lt;/code>も&lt;code>git commit&lt;/code>もしていない、作業ツリー上のファイル(インデックスに登録されていないワークツリー上のファイル)の変更を取り消して元に戻す方法を紹介します。&lt;/p>
&lt;h2 id="1-方法">1. 方法&lt;/h2>
&lt;pre tabindex="0">&lt;code>$ git checkout -- &amp;lt;ファイル名&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>git checkout -- .&lt;/code>で全てのファイルを指定&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://qiita.com/macer_fkm/items/ea2337a9b504b982c295">git ローカルの変更を元に戻す方法 #Git - Qiita&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www-creators.com/archives/1290">Git で変更を取り消して、元に戻す方法 (事例別まとめ) | WWWクリエイターズ&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.gitlab.com/ee/topics/git/numerous_undo_possibilities_in_git/">https://docs.gitlab.com/ee/topics/git/numerous_undo_possibilities_in_git/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://git-scm.com/docs/git-checkout#_description">Git - git-checkout Documentation&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【Git】派生元ブランチの変更</title><link>https://ama-blog.com/35/</link><pubDate>Sat, 25 Jun 2022 10:08:10 +0900</pubDate><guid>https://ama-blog.com/35/</guid><description>&lt;p>この記事ではGitの派生元ブランチ(親ブランチ)の特定と変更方法を紹介します。&lt;/p>
&lt;p>間違った親ブランチからブランチを作成してしまいコミットもしてしまった時などに有効です。&lt;/p>
&lt;h2 id="1-派生元ブランチの特定方法">1. 派生元ブランチの特定方法&lt;/h2>
&lt;pre tabindex="0">&lt;code>$ git show-branch | grep &amp;#34;*&amp;#34; | grep -v &amp;#34;$(git rev-parse --abbrev-ref HEAD)&amp;#34; | head -n 1 | awk -F&amp;#39;[]~^[]&amp;#39; &amp;#39;{print $2}&amp;#39;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>grep &amp;quot;*&amp;quot;&lt;/code>：*がついてる行のみ表示&lt;/li>
&lt;li>&lt;code>grep -v &amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;/code>：カレントブランチを除外&lt;/li>
&lt;li>&lt;code>head -n 1&lt;/code>：1行目を表示&lt;/li>
&lt;li>&lt;code>awk -F'[]~^[]' '{print $2}’&lt;/code>：ブランチ名のみ表示&lt;/li>
&lt;/ul>
&lt;h2 id="2-派生元ブランチの変更方法">2. 派生元ブランチの変更方法&lt;/h2>
&lt;h3 id="2-1-git-rebase-onto">2-1. git rebase &amp;ndash;onto&lt;/h3>
&lt;pre tabindex="0">&lt;code> H---I---J topicB
/
E---F---G topicA
/
A---B---C---D main
&lt;/code>&lt;/pre>&lt;p>↓&lt;/p>
&lt;pre tabindex="0">&lt;code>$ git rebase --onto main topicA topicB
&lt;/code>&lt;/pre>&lt;p>↓&lt;/p>
&lt;pre tabindex="0">&lt;code> H&amp;#39;--I&amp;#39;--J&amp;#39; topicB
/
| E---F---G topicA
|/
A---B---C---D main
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>git rebase --onto &amp;lt;変更後の親ブランチ&amp;gt; &amp;lt;現在の親ブランチ&amp;gt; &amp;lt;移動するブランチ&amp;gt;&lt;/code>&lt;/li>
&lt;li>rebaseによりコミットが改変されているため、リモートへのpushには&lt;code>git push -f&lt;/code>が必要&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-git-cherry-pick">2-2. git cherry-pick&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ git checkout -b topicB-new master
$ git cherry-pick &amp;lt;コミットid&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>新しいブランチを作り、欲しいコミットだけを&lt;code>git cherry-pick&lt;/code>で移動させる&lt;/li>
&lt;li>適用させたいコミット数が少ない場合に有効&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>【Ruby 3.1】ボウリングのスコア計算プログラムを作る</title><link>https://ama-blog.com/34/</link><pubDate>Fri, 24 Jun 2022 21:48:46 +0900</pubDate><guid>https://ama-blog.com/34/</guid><description>&lt;p>OOP版はこちら↓&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/68/">【Ruby3.1】ボウリングのスコア計算プログラムをオブジェクト指向で作る | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey 12.4&lt;/li>
&lt;li>Ruby 3.1.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-ボウリングのスコア計算プログラムの要件">2. ボウリングのスコア計算プログラムの要件&lt;/h2>
&lt;ul>
&lt;li>1ゲーム = 10フレーム&lt;/li>
&lt;li>1フレーム = 2投&lt;/li>
&lt;li>スペアのフレームの得点は次の1投の点を加算する。&lt;/li>
&lt;li>ストライクのフレームの得点は次の2投の点を加算する。&lt;/li>
&lt;li>10フレーム目は1投目がストライクもしくは2投目がスペアだった場合、3投目が投げられる。&lt;/li>
&lt;li>ありえない投球数やありえない数字・記号がこない前提。&lt;/li>
&lt;li>入力例：&lt;code>6,3,9,0,0,3,8,2,7,3,X,9,1,8,0,X,6,4,5&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="3-ソースコード">3. ソースコード&lt;/h2>
&lt;ul>
&lt;li>ver1：自作→レビュー反映&lt;/li>
&lt;li>ver2：ver1→他の人のコードを反映&lt;/li>
&lt;/ul>
&lt;h3 id="3-1-ver1">3-1. ver1&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># frozen_string_literal: true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>score &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>scores &lt;span style="color:#f92672">=&lt;/span> score&lt;span style="color:#f92672">.&lt;/span>split(&lt;span style="color:#e6db74">&amp;#39;,&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>shots &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>scores&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> s &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;X&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> shots &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> shots &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> shots &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s&lt;span style="color:#f92672">.&lt;/span>to_i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>frames &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>shots&lt;span style="color:#f92672">.&lt;/span>each_slice(&lt;span style="color:#ae81ff">2&lt;/span>) &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>frames_point &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>frames&lt;span style="color:#f92672">.&lt;/span>each_with_index &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>frame, i&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames_point&lt;span style="color:#f92672">[&lt;/span>i&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">=&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>sum
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> i &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">9&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frame&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames_point&lt;span style="color:#f92672">[&lt;/span>i&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>i &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames_point&lt;span style="color:#f92672">[&lt;/span>i&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>i &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames&lt;span style="color:#f92672">[&lt;/span>i &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames&lt;span style="color:#f92672">[&lt;/span>i &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elsif&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>sum &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames_point&lt;span style="color:#f92672">[&lt;/span>i&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>i &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts frames_point&lt;span style="color:#f92672">.&lt;/span>sum
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-2-ver2">3-2. ver2&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># frozen_string_literal: true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>shots &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">].&lt;/span>split(&lt;span style="color:#e6db74">&amp;#39;,&amp;#39;&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>map { &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span> s &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;X&amp;#39;&lt;/span> ? &lt;span style="color:#ae81ff">10&lt;/span> : s&lt;span style="color:#f92672">.&lt;/span>to_i }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>frame &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>frames &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>shots&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frames&lt;span style="color:#f92672">.&lt;/span>length &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>length &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">||&lt;/span> s &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>dup
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame&lt;span style="color:#f92672">.&lt;/span>clear
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames&lt;span style="color:#f92672">.&lt;/span>last &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>point &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">..&lt;/span>&lt;span style="color:#ae81ff">9&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>n&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> point &lt;span style="color:#f92672">+=&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>n&lt;span style="color:#f92672">].&lt;/span>sum
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames&lt;span style="color:#f92672">[&lt;/span>n &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames&lt;span style="color:#f92672">[&lt;/span>n &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>n&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> point &lt;span style="color:#f92672">+=&lt;/span> (frames&lt;span style="color:#f92672">[&lt;/span>n &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">+&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>n &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#f92672">]&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>slice(&lt;span style="color:#ae81ff">0&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>sum
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elsif&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>n&lt;span style="color:#f92672">].&lt;/span>sum &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> point &lt;span style="color:#f92672">+=&lt;/span> frames&lt;span style="color:#f92672">[&lt;/span>n &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">][&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts point
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-ソースコードver2の解説">4. ソースコード(ver2)の解説&lt;/h2>
&lt;h3 id="4-1-主な使用メソッド">4-1. 主な使用メソッド&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/String/i/split.html">String#split&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/Enumerable/i/collect.html">Enumerable#map&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/Array/i/length.html">Array#length&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/Array/i/clone.html">Array#dup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/Array/i/clear.html">Array#clear&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/Array/i/last.html">Array#last&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/Array/i/slice.html">Array#slice&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/Array/i/sum.html">Array#sum&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="4-2-解説">4-2. 解説&lt;/h3>
&lt;h4 id="4行目">4行目&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>shots &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">].&lt;/span>split(&lt;span style="color:#e6db74">&amp;#39;,&amp;#39;&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>map { &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span> s &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#39;X&amp;#39;&lt;/span> ? &lt;span style="color:#ae81ff">10&lt;/span> : s&lt;span style="color:#f92672">.&lt;/span>to_i }
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>ARGV[0].split(',')&lt;/code>で入力された文字列を&lt;code>,&lt;/code>で分割して文字列の配列にする
&lt;ul>
&lt;li>&lt;code>&amp;quot;6,3,9,0,0,3,8,2,7,3,X,9,1,8,0,X,6,4,5&amp;quot;&lt;/code>が&lt;code>[&amp;quot;6&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;7&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;X&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;X&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;]&lt;/code>になる&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>.map { |s| s == 'X' ? 10 : s.to_i }&lt;/code>でXを数値の10に、それ以外を数値に変換する&lt;/li>
&lt;li>結果、shotsには&lt;code>[6, 3, 9, 0, 0, 3, 8, 2, 7, 3, 10, 9, 1, 8, 0, 10, 6, 4, 5]&lt;/code>が入る&lt;/li>
&lt;/ul>
&lt;h4 id="618行目">6~18行目&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>frame &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>frames &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>shots&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>s&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frames&lt;span style="color:#f92672">.&lt;/span>length &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>length &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">||&lt;/span> s &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span> &lt;span style="color:#75715e"># frameに2投またはストライクの1投が入ったら&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> frame&lt;span style="color:#f92672">.&lt;/span>dup
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frame&lt;span style="color:#f92672">.&lt;/span>clear
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span> &lt;span style="color:#75715e"># 10フレーム目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> frames&lt;span style="color:#f92672">.&lt;/span>last &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>shots&lt;code>[6, 3, 9, 0, 0, 3, 8, 2, 7, 3, 10, 9, 1, 8, 0, 10, 6, 4, 5]&lt;/code>から、各フレーム毎に分割したframes&lt;code>[[6, 3], [9, 0], [0, 3], [8, 2], [7, 3], [10], [9, 1], [8, 0], [10], [6, 4, 5]]&lt;/code>を作りたい&lt;/p></description></item><item><title>【Git】プルリクエストを使った開発の流れ</title><link>https://ama-blog.com/33/</link><pubDate>Wed, 22 Jun 2022 22:09:44 +0900</pubDate><guid>https://ama-blog.com/33/</guid><description>&lt;p>この記事ではGutHubでPull Requestを使った開発の流れを紹介します。&lt;/p>
&lt;h2 id="1-準備">1. 準備&lt;/h2>
&lt;p>まずは開発用のリポジトリを作成します。&lt;/p>
&lt;p>リポジトリの作成方法には以下の2つがあります。&lt;/p>
&lt;ol>
&lt;li>リポジトリを自分で作る&lt;/li>
&lt;li>既存のリポジトリをcloneする&lt;/li>
&lt;/ol>
&lt;h3 id="1-1-リポジトリを自分で作る">1-1. リポジトリを自分で作る&lt;/h3>
&lt;p>リポジトリの作成方法は、以下の手順を参照してください。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/32/">【Git】リポジトリの作成 | あまブログ&lt;/a>&lt;/p>
&lt;h3 id="1-2-既存のリポジトリをcloneする">1-2. 既存のリポジトリをcloneする&lt;/h3>
&lt;p>チーム開発等で既にリポジトリが存在する場合は、以下の手順でリモートリポジトリをcloneします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ mkdir &amp;lt;ディレクトリ名&amp;gt;
$ cd &amp;lt;ディレクトリのパス&amp;gt;
$ git clone &amp;lt;リポジトリのURL&amp;gt;
&lt;/code>&lt;/pre>&lt;p>※リポジトリのURLの取得方法&lt;/p>
&lt;p>&lt;img alt="リポジトリのURLの取得方法" loading="lazy" src="https://ama-blog.com/33/images/1.jpg">&lt;/p>
&lt;h2 id="2-開発の流れ">2. 開発の流れ&lt;/h2>
&lt;p>以下の流れで行います。&lt;/p>
&lt;ol>
&lt;li>リモートのmainをローカルのmainに反映させる&lt;/li>
&lt;li>作業ブランチを作成する&lt;/li>
&lt;li>ファイルの編集・追加を行う(コードを書く)&lt;/li>
&lt;li>ファイルの編集・追加をローカルに反映させる&lt;/li>
&lt;li>作業ブランチをリモートにpushする&lt;/li>
&lt;li>Pull Requestを作成する&lt;/li>
&lt;li>フィードバックを受ける&lt;/li>
&lt;li>Pull Requestをマージする&lt;/li>
&lt;/ol>
&lt;h3 id="2-1-リモートのmainをローカルのmainに反映させる">2-1. リモートのmainをローカルのmainに反映させる&lt;/h3>
&lt;p>まずはリモートのmainブランチの状態をローカルのmainブランチに反映させる。(最新のmainの状態にする)&lt;/p>
&lt;pre tabindex="0">&lt;code>$ git checkout main
$ git pull origin main
&lt;/code>&lt;/pre>&lt;h3 id="2-2-作業ブランチを作成する">2-2. 作業ブランチを作成する&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ git checkout -b &amp;lt;ブランチ名&amp;gt; main
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>上記はmainブランチを派生元に指定。&lt;/li>
&lt;/ul>
&lt;h3 id="2-3-ファイルの編集追加を行うコードを書く">2-3. ファイルの編集・追加を行う(コードを書く)&lt;/h3>
&lt;p>作成したブランチ上でコードを書く。&lt;/p>
&lt;h3 id="2-4-ファイルの編集追加をローカルに反映させる">2-4. ファイルの編集・追加をローカルに反映させる&lt;/h3>
&lt;p>作業した内容をローカルの作業ブランチに反映させる。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ git status
$ git add &amp;lt;編集・追加したファイル名&amp;gt;
$ git commit -m &amp;#34;&amp;lt;コミットメッセージ&amp;gt;&amp;#34;
&lt;/code>&lt;/pre>&lt;h3 id="2-5-作業ブランチをリモートにpushする">2-5. 作業ブランチをリモートにpushする&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ git push origin &amp;lt;ブランチ名&amp;gt;
&lt;/code>&lt;/pre>&lt;p>この時点でリモートに作業ブランチが作成される。&lt;/p></description></item><item><title>【Git】リポジトリの作成</title><link>https://ama-blog.com/32/</link><pubDate>Wed, 22 Jun 2022 22:05:09 +0900</pubDate><guid>https://ama-blog.com/32/</guid><description>&lt;p>この記事ではGitのリポジトリの作成方法を紹介します。&lt;/p>
&lt;h2 id="1-リモートリポジトリの作成">1. リモートリポジトリの作成&lt;/h2>
&lt;p>まず初めに、GitHub上にリモートリポジトリを作成します。&lt;/p>
&lt;p>GitHubの「New repository」からリモートリポジトリを作成。&lt;/p>
&lt;h2 id="2-ローカルリポジトリの作成">2. ローカルリポジトリの作成&lt;/h2>
&lt;p>次に自分のPC上にローカルリポジトリを作成します。&lt;/p>
&lt;h3 id="2-1-ディレクトリの作成">2-1. ディレクトリの作成&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ mkdir &amp;lt;ディレクトリ名&amp;gt;
&lt;/code>&lt;/pre>&lt;h3 id="2-2-ファイルの作成">2-2. ファイルの作成&lt;/h3>
&lt;p>作成したディレクトリに移動し、任意のファイルを作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ cd &amp;lt;ディレクトリ名&amp;gt;
$ echo &amp;#34;# test&amp;#34; &amp;gt;&amp;gt; README.md
&lt;/code>&lt;/pre>&lt;h3 id="2-3-ローカルリポジトリの作成">2-3. ローカルリポジトリの作成&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ git init
&lt;/code>&lt;/pre>&lt;h3 id="2-4-ファイルをローカルリポジトリに反映">2-4. ファイルをローカルリポジトリに反映&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ git add README.md
$ git commit -m &amp;#34;first commit&amp;#34;
&lt;/code>&lt;/pre>&lt;h2 id="3-ローカルリポジトリの内容をリモートリポジトリに反映">3. ローカルリポジトリの内容をリモートリポジトリに反映&lt;/h2>
&lt;p>ローカルリポジトリの作業内容を、GitHub上のリモートリポジトリに反映させます。&lt;/p>
&lt;h3 id="3-1-リモートリポジトリの登録">3-1. リモートリポジトリの登録&lt;/h3>
&lt;p>使用するリモートリポジトリを登録します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ git remote add origin https://github.com/[ユーザ名]/[リモートリポジトリ名]
&lt;/code>&lt;/pre>&lt;h3 id="3-2-ローカルリポジトリの内容をリモートリポジトリに反映">3-2. ローカルリポジトリの内容をリモートリポジトリに反映&lt;/h3>
&lt;p>ローカルリポジトリをリモートリポジトリにpushします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ git push -u origin main
&lt;/code>&lt;/pre></description></item><item><title>【VSCode】ファイル末尾に改行を自動で挿入する設定</title><link>https://ama-blog.com/31/</link><pubDate>Tue, 21 Jun 2022 09:19:54 +0900</pubDate><guid>https://ama-blog.com/31/</guid><description>&lt;p>この記事では、Visual Studio Codeのファイル保存時に、自動で末尾に改行が挿入されるように設定する方法を紹介します。&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>VS Code バージョン 1.68.1&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;ol>
&lt;li>&lt;code>⌘,(command + ,)&lt;/code>で設定を開く&lt;/li>
&lt;li>&lt;code>insertFinalNewline&lt;/code>で検索&lt;/li>
&lt;li>&lt;code>Files: Insert Final Newline&lt;/code>にチェックを入れて設定を有効にする&lt;/li>
&lt;/ol>
&lt;p>設定すると、&lt;code>settings.json&lt;/code>に以下が追記される。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;#34;files.insertFinalNewline&amp;#34;: true
&lt;/code>&lt;/pre>&lt;p>※ 上記を settings.json に直接追記しても設定可能&lt;/p>
&lt;ul>
&lt;li>settings.jsonの開き方
&lt;ul>
&lt;li>&lt;code>⇧⌘P(shift + command + P)&lt;/code>でコマンドパレットを開く&lt;/li>
&lt;li>&lt;code>open settings&lt;/code>で検索&lt;/li>
&lt;li>&lt;code>Preferences: Open Settings (JSON)&lt;/code>を選択&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://code.visualstudio.com/docs/configure/settings">User and workspace settings&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Q&amp;A掲示板のER図を書く</title><link>https://ama-blog.com/30/</link><pubDate>Tue, 21 Jun 2022 09:12:34 +0900</pubDate><guid>https://ama-blog.com/30/</guid><description>&lt;p>「ユーザが質問を投稿して、そこに誰かがコメントを付ける、問題が解決したらコメントの中からベストアンサーを1つ選ぶ」というシステムのER図を書く。&lt;/p>
&lt;h2 id="1-要件">1. 要件&lt;/h2>
&lt;ul>
&lt;li>質問を投稿する&lt;/li>
&lt;li>コメントする&lt;/li>
&lt;li>ベストアンサーを選ぶ&lt;/li>
&lt;/ul>
&lt;h2 id="2-er図">2. ER図&lt;/h2>
&lt;p>&lt;img alt="ER図1" loading="lazy" src="https://ama-blog.com/30/images/1.png">&lt;/p>
&lt;p>または&lt;/p>
&lt;p>&lt;img alt="ER図2" loading="lazy" src="https://ama-blog.com/30/images/2.png">&lt;/p></description></item><item><title>NginxでSSL対応サイトを作る</title><link>https://ama-blog.com/29/</link><pubDate>Tue, 14 Jun 2022 10:30:13 +0900</pubDate><guid>https://ama-blog.com/29/</guid><description>&lt;p>この記事では、Debian 11上のNginxでSSL対応サイトを作る方法を紹介します。&lt;/p>
&lt;p>自己署名証明書を作成し、Nginxの設定を編集します。&lt;/p>
&lt;p>Nginxの設定ファイルの詳しい解説は以下の記事を参照してください。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/19/">【Debian】NginxでVirtual Hostsを使って複数のドメインを設定する方法【Server Blocks】 | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>Debian GNU/Linux 11 bullseye (さくらのVPS)&lt;/li>
&lt;li>Nginx 1.21.6&lt;/li>
&lt;li>OpenSSL 1.1.1&lt;/li>
&lt;/ul>
&lt;h2 id="2-sslの概要">2. SSLの概要&lt;/h2>
&lt;p>まず初めに、SSLの概要を説明します。&lt;/p>
&lt;h3 id="2-1-sslの暗号化方式">2-1. SSLの暗号化方式&lt;/h3>
&lt;ul>
&lt;li>データのやりとりには共通鍵暗号を使う&lt;/li>
&lt;li>共通鍵暗号で必要となる共通鍵の受け渡しに公開鍵暗号を使う&lt;/li>
&lt;/ul>
&lt;p>共通鍵暗号：暗号化と復号化に同じ鍵を使う&lt;/p>
&lt;p>公開鍵暗号：秘密鍵で暗号化、ペアとなる公開鍵で復号化&lt;/p>
&lt;h3 id="2-2-公開鍵証明書">2-2. 公開鍵証明書&lt;/h3>
&lt;ul>
&lt;li>SSL証明書、サーバー証明書とも呼ばれる&lt;/li>
&lt;li>認証局によるデジタル署名がついたサーバーの公開鍵のこと
&lt;ul>
&lt;li>通信を行うサーバーが信頼できるかどうかを確認する仕組み&lt;/li>
&lt;li>デジタル署名を自身で行なった証明書を自己署名証明書と言う(オレオレ証明書)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>デジタル署名：秘密鍵で署名、ペアとなる公開鍵で検証&lt;/p>
&lt;p>【公開鍵証明書発行の流れ】( &lt;a href="https://qiita.com/TakahikoKawasaki/items/4c35ac38c52978805c69">図解 X.509 証明書 #x.509 - Qiita&lt;/a> より)&lt;/p>
&lt;p>&lt;img alt="公開鍵証明書発行の流れ" loading="lazy" src="https://ama-blog.com/29/images/1.png">&lt;/p>
&lt;h2 id="3-手順">3. 手順&lt;/h2>
&lt;p>以下の手順で進めていきます。&lt;/p>
&lt;ol>
&lt;li>公開鍵証明書の作成&lt;/li>
&lt;li>Nginxの設定&lt;/li>
&lt;/ol>
&lt;p>また、本手順では、サーバーのホスト名を&lt;code>test.com&lt;/code>とします。&lt;/p>
&lt;h3 id="3-1-公開鍵証明書の作成">3-1. 公開鍵証明書の作成&lt;/h3>
&lt;p>サーバーの秘密鍵と公開鍵証明書を作成します。&lt;/p>
&lt;p>まずは、opensslをインストール。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo apt install openssl
&lt;/code>&lt;/pre>&lt;p>秘密鍵と公開鍵証明書を生成。(ここで生成される公開鍵証明書は自己署名証明書)&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -subj /CN=test.com -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>req&lt;/code>：CSR(Certificate Signing Request：証明書署名要求)を生成するためのサブコマンド。&lt;/li>
&lt;li>&lt;code>-x509&lt;/code>：CSRではなく自己署名証明書を生成する。&lt;/li>
&lt;li>&lt;code>-nodes&lt;/code>：公開鍵証明書のパスフレーズ設定をスキップ。パスフレーズを設定するとNginxを再起動するたびに入力する必要がある。&lt;/li>
&lt;li>&lt;code>-days&lt;/code>：生成する公開鍵証明書の有効期限を指定。&lt;/li>
&lt;li>&lt;code>-newkey rsa:2048&lt;/code>：公開鍵証明書と秘密鍵を同時に生成する。rsa:2048で2048ビットのrsa鍵を指定。&lt;/li>
&lt;li>&lt;code>-subj /CN=test.com&lt;/code>：Common Nameにホスト名を指定。-subjオプションを指定しない場合、プロンプトが表示され入力を求められる。CN以外はテキトーな値でいい。&lt;/li>
&lt;li>&lt;code>-keyout&lt;/code>：生成する秘密鍵のファイル名を指定。&lt;/li>
&lt;li>&lt;code>-out&lt;/code>：生成する公開鍵証明書のファイル名を指定。&lt;/li>
&lt;/ul>
&lt;h4 id="3-1-1-細かくやると">3-1-1. 細かくやると&lt;/h4>
&lt;p>先程行った秘密鍵と公開鍵証明書の生成を、「秘密鍵の生成」と「公開鍵証明書の生成」に分けて行うと以下のようになります。&lt;/p></description></item><item><title>さくらのVPSに設定した独自ドメインにサブドメインを設定する方法</title><link>https://ama-blog.com/28/</link><pubDate>Sun, 12 Jun 2022 10:04:34 +0900</pubDate><guid>https://ama-blog.com/28/</guid><description>&lt;p>この記事ではさくらのVPSに設定した独自ドメインでサブドメインを利用できるようにする方法を紹介します。&lt;/p>
&lt;p>これにより、契約ドメインは1つで複数のサイトを扱うことができます。&lt;/p>
&lt;p>例えばfoo.comの独自ドメインにbarをサブドメインに設定することで、foo.comとbar.foo.comの2つのサイトを利用できます。&lt;/p>
&lt;p>前提条件&lt;/p>
&lt;ul>
&lt;li>さくらのVPSを契約済み&lt;/li>
&lt;li>独自ドメインを取得済み(お名前ドットコムやXserverドメインなどで作成)&lt;/li>
&lt;li>サブドメインを作成済み(お名前ドットコムやXserverドメインなどで作成)&lt;/li>
&lt;li>独自ドメインをさくらのVPSに設定済み&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://ama-blog.com/20/">さくらのVPSにXserverドメインで取得した独自ドメインを設定する方法 | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-設定方法">1. 設定方法&lt;/h2>
&lt;p>1.さくらインターネットの&lt;a href="https://secure.sakura.ad.jp/domain/domains">ドメインコントロールパネル&lt;/a>にアクセス。&lt;/p>
&lt;p>2.「ネームサーバサービス」を選択&lt;/p>
&lt;p>3.以下の画面で、設定済みのドメインの「ゾーン&amp;gt;」を選択します。(画面右側)&lt;/p>
&lt;p>&lt;img alt="ネームサーバサービス" loading="lazy" src="https://ama-blog.com/28/images/1.png">&lt;/p>
&lt;p>4.「編集」を選択&lt;/p>
&lt;p>5.「レコード追加」で以下の情報を入力して「追加」を選択&lt;/p>
&lt;ul>
&lt;li>「エントリ名」→サブドメイン名(barなど)&lt;/li>
&lt;li>「タイプ」→別名(CNAME)&lt;/li>
&lt;li>「データ」→@&lt;/li>
&lt;li>DNSチェック→チェックしない&lt;/li>
&lt;li>TTLの指定→チェックしない&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="レコード追加" loading="lazy" src="https://ama-blog.com/28/images/2.png">&lt;/p>
&lt;p>6.「保存」を選択&lt;/p>
&lt;p>以上で終了です。&lt;/p></description></item><item><title>【RuboCopエラー】Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &amp;&amp;/||.</title><link>https://ama-blog.com/27/</link><pubDate>Fri, 10 Jun 2022 10:00:02 +0900</pubDate><guid>https://ama-blog.com/27/</guid><description>&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>rubocop 1.30.0&lt;/li>
&lt;li>Ruby 3.1.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-エラー内容">2. エラー内容&lt;/h2>
&lt;pre tabindex="0">&lt;code>Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &amp;amp;&amp;amp;/||.
&lt;/code>&lt;/pre>&lt;p>if文の中身が1行の場合は、後置ifを使用するか、&lt;code>&amp;amp;&amp;amp;&lt;/code>または&lt;code>||&lt;/code>を使用してください。&lt;/p>
&lt;h2 id="3-エラー対処法">3. エラー対処法&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># bad&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> some_condition
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> do_something
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># good&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>do_something &lt;span style="color:#66d9ef">if&lt;/span> some_condition
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># another good option&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>some_condition &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> do_something
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;ul>
&lt;li>&lt;a href="https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/IfUnlessModifier">RubyDoc.info: Class: RuboCop::Cop::Style::IfUnlessModifier – Documentation for rubocop (1.81.6) – RubyDoc.info&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/rubocop/ruby-style-guide#if-as-a-modifier">rubocop/ruby-style-guide: A community-driven Ruby coding style guide&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【RuboCopエラー】Use the return of the conditional for variable assignment and comparison.</title><link>https://ama-blog.com/26/</link><pubDate>Fri, 10 Jun 2022 09:53:31 +0900</pubDate><guid>https://ama-blog.com/26/</guid><description>&lt;p>rubocopで&lt;code>Use the return of the conditional for variable assignment and comparison.&lt;/code>のエラーが出た時の対処法。&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>rubocop 1.30.0&lt;/li>
&lt;li>Ruby 3.1.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-エラー内容">2. エラー内容&lt;/h2>
&lt;pre tabindex="0">&lt;code>Use the return of the conditional for variable assignment and comparison.
&lt;/code>&lt;/pre>&lt;p>変数の代入と比較には、条件式の戻り値を使用してください。&lt;/p>
&lt;h2 id="3-エラー対処法">3. エラー対処法&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># bad&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> foo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bar &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bar &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># good&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bar &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> foo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;ul>
&lt;li>&lt;a href="https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/ConditionalAssignment">RubyDoc.info: Class: RuboCop::Cop::Style::ConditionalAssignment – Documentation for rubocop (1.81.1) – RubyDoc.info&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/rubocop/ruby-style-guide">rubocop/ruby-style-guide: A community-driven Ruby coding style guide&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stackoverflow.com/questions/48731014/ruby-use-the-return-of-the-conditional-for-variable-assignment-and-comparison">Ruby: Use the return of the conditional for variable assignment and comparison - Stack Overflow&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.yokoyan.net/entry/2019/03/08/180000">【Rubocop】Use the return of the conditional for variable assignment and comparison.エラーの対処法 - 紙一重の積み重ね&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>DebianにPostgreSQLをインストールして外部から接続する方法</title><link>https://ama-blog.com/25/</link><pubDate>Fri, 10 Jun 2022 09:29:29 +0900</pubDate><guid>https://ama-blog.com/25/</guid><description>&lt;p>この記事では、さくらのVPS上のDebianにPostgreSQLをインストールして、Macから外部接続する方法を紹介します。&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>Debian GNU/Linux 11 bullseye (さくらのVPS)&lt;/li>
&lt;li>macOS Monterey 12.4&lt;/li>
&lt;li>PostgreSQL 14.3&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;p>以下の流れで進めていきます。&lt;/p>
&lt;ol>
&lt;li>PostgreSQLのインストール&lt;/li>
&lt;li>接続確認&lt;/li>
&lt;li>ユーザの作成&lt;/li>
&lt;li>外部接続の設定&lt;/li>
&lt;li>外部接続の確認&lt;/li>
&lt;/ol>
&lt;h3 id="2-1-postgresqlのインストール">2-1. PostgreSQLのインストール&lt;/h3>
&lt;h4 id="2-1-1-必要なパッケージのインストール">2-1-1. 必要なパッケージのインストール&lt;/h4>
&lt;p>まずは、PostgreSQLのインストールに必要な以下のパッケージをインストールします。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/curl">curl&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/gnupg2">gnupg2&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/ca-certificates">ca-certificates&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/lsb-release">lsb-release&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>以下のコマンドを実行してパッケージをインストール。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo apt install curl gnupg2 ca-certificates lsb-release
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>パッケージの情報を表示：&lt;code>apt show &amp;lt;パッケージ名&amp;gt;&lt;/code>&lt;/li>
&lt;li>インストール済みパッケージの確認：&lt;code>apt list --installed &amp;lt;パッケージ名&amp;gt;&lt;/code>&lt;/li>
&lt;/ul>
&lt;h4 id="2-1-2-署名鍵のインポート">2-1-2. 署名鍵のインポート&lt;/h4>
&lt;p>次に、aptがパッケージの信頼性を確認できるようにするために、PostgreSQLが公式に公開している署名鍵をインポートします。&lt;/p>
&lt;p>以下のコマンドを実行して署名鍵をインポート。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg &amp;gt;/dev/null
&lt;/code>&lt;/pre>&lt;h4 id="2-1-3-リポジトリの追加">2-1-3. リポジトリの追加&lt;/h4>
&lt;p>aptの設定ファイルにPostgreSQLの公式リポジトリを追加します。&lt;/p>
&lt;p>以下のコマンドを実行して &lt;code>/etc/apt/sources.list.d&lt;/code> 配下に設定ファイルを作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ echo &amp;#34;deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main&amp;#34; | sudo tee /etc/apt/sources.list.d/pgdg.list
&lt;/code>&lt;/pre>&lt;p>作成された &lt;code>/etc/apt/sources.list.d/pgdg.list&lt;/code> の内容は以下のようになります。&lt;/p></description></item><item><title>【Ruby 3.1】カレンダーのプログラムを作る</title><link>https://ama-blog.com/24/</link><pubDate>Wed, 08 Jun 2022 09:24:49 +0900</pubDate><guid>https://ama-blog.com/24/</guid><description>&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey 12.4&lt;/li>
&lt;li>Ruby 3.1.0&lt;/li>
&lt;/ul>
&lt;h2 id="2-カレンダープログラムの要件">2. カレンダープログラムの要件&lt;/h2>
&lt;ul>
&lt;li>-mで月を、-yで年を指定できる&lt;/li>
&lt;li>引数を指定しない場合は、今年・今月のカレンダーが表示される&lt;/li>
&lt;li>macに入っているcalコマンドと同じ見た目になっている&lt;/li>
&lt;li>今日の日付の部分の色が反転する&lt;/li>
&lt;li>どのような引数が与えられようが、cal コマンドと同じ表示結果になる&lt;/li>
&lt;/ul>
&lt;h2 id="3-ソースコード">3. ソースコード&lt;/h2>
&lt;h3 id="3-1-試作品自作レビュー反映">3-1. 試作品(自作→レビュー反映)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;date&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;optparse&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>today &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>today
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>options &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>&lt;span style="color:#f92672">.&lt;/span>getopts(&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;m:&lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>today&lt;span style="color:#f92672">.&lt;/span>month&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;y:&lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>today&lt;span style="color:#f92672">.&lt;/span>year&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;m&amp;#34;&lt;/span>&lt;span style="color:#f92672">].&lt;/span>to_i &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;m&amp;#34;&lt;/span>&lt;span style="color:#f92672">].&lt;/span>to_i &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">12&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inputed_month &lt;span style="color:#f92672">=&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;m&amp;#34;&lt;/span>&lt;span style="color:#f92672">].&lt;/span>to_i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;cal: &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;m&amp;#34;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> is neither a month number (1..12) nor a name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;y&amp;#34;&lt;/span>&lt;span style="color:#f92672">].&lt;/span>to_i &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;y&amp;#34;&lt;/span>&lt;span style="color:#f92672">].&lt;/span>to_i &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">9999&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inputed_year &lt;span style="color:#f92672">=&lt;/span> options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;y&amp;#34;&lt;/span>&lt;span style="color:#f92672">].&lt;/span>to_i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;cal: year `&lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>options&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;y&amp;#34;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39; not in range 1..9999&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>first_date &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(inputed_year, inputed_month, &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>last_date &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(inputed_year, inputed_month, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>space &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts &lt;span style="color:#e6db74">&amp;#34; &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>inputed_month&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">月 &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>inputed_year&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts &lt;span style="color:#e6db74">&amp;#34;日 月 火 水 木 金 土&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print space &lt;span style="color:#f92672">*&lt;/span> first_date&lt;span style="color:#f92672">.&lt;/span>wday
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">color_reverse&lt;/span>(text)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[30m&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[47m&lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>text&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[0m&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(first_date&lt;span style="color:#f92672">..&lt;/span>last_date)&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>full_date&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> day_of_week &lt;span style="color:#f92672">=&lt;/span> full_date&lt;span style="color:#f92672">.&lt;/span>wday
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> full_date &lt;span style="color:#f92672">==&lt;/span> today
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print color_reverse(full_date&lt;span style="color:#f92672">.&lt;/span>day)&lt;span style="color:#f92672">.&lt;/span>rjust(&lt;span style="color:#ae81ff">16&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print full_date&lt;span style="color:#f92672">.&lt;/span>day&lt;span style="color:#f92672">.&lt;/span>to_s&lt;span style="color:#f92672">.&lt;/span>rjust(&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> day_of_week &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-2-最終形自作レビュー反映他の人のコードを見る">3-2. 最終形(自作→レビュー反映→他の人のコードを見る)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;date&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>require &lt;span style="color:#e6db74">&amp;#39;optparse&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>params &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>&lt;span style="color:#f92672">.&lt;/span>getopts(&lt;span style="color:#e6db74">&amp;#39;m:y:&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>month &lt;span style="color:#f92672">=&lt;/span> (params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;m&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>today&lt;span style="color:#f92672">.&lt;/span>month)&lt;span style="color:#f92672">.&lt;/span>to_i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>year &lt;span style="color:#f92672">=&lt;/span> (params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;y&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>today&lt;span style="color:#f92672">.&lt;/span>year)&lt;span style="color:#f92672">.&lt;/span>to_i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> month &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">||&lt;/span> month &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">12&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;cal: &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;m&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> is neither a month number (1..12) nor a name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> year &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">||&lt;/span> year &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">9999&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;cal: year `&lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;y&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39; not in range 1..9999&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start_of_month &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(year, month, &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>end_of_month &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(year, month, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts &lt;span style="color:#e6db74">&amp;#34; &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>month&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">月 &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>year&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts &lt;span style="color:#e6db74">&amp;#34;日 月 火 水 木 金 土&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#ae81ff">3&lt;/span> &lt;span style="color:#f92672">*&lt;/span> start_of_month&lt;span style="color:#f92672">.&lt;/span>wday
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(start_of_month&lt;span style="color:#f92672">..&lt;/span>end_of_month)&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>day&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> format &lt;span style="color:#f92672">=&lt;/span> day &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>today ? &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[7m%2d&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[0m &amp;#34;&lt;/span> : &lt;span style="color:#e6db74">&amp;#39;%2d &amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> printf format, day&lt;span style="color:#f92672">.&lt;/span>day
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> day&lt;span style="color:#f92672">.&lt;/span>wday &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\n\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-ソースコード最終形の解説">4. ソースコード(最終形)の解説&lt;/h2>
&lt;h3 id="4-1-主な使用メソッド">4-1. 主な使用メソッド&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/OptionParser=3a=3aArguable/i/getopts.html">Arguable#getopts&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/Date/s/today.html">Date.today&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/Date/i/mon.html">Date#mon&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/Date/i/year.html">Date#year&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/Date/i/wday.html">Date#wday&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/method/Date/i/day.html">Date#day&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/3.1/method/Kernel/m/printf.html">Kernel.#printf&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="4-2-解説">4-2. 解説&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 6行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>params &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">ARGV&lt;/span>&lt;span style="color:#f92672">.&lt;/span>getopts(&lt;span style="color:#e6db74">&amp;#39;m:y:&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 引数に「-m」と「-y」をとる&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 7~8行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>month &lt;span style="color:#f92672">=&lt;/span> (params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;m&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>today&lt;span style="color:#f92672">.&lt;/span>month)&lt;span style="color:#f92672">.&lt;/span>to_i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>year &lt;span style="color:#f92672">=&lt;/span> (params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;y&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span> &lt;span style="color:#f92672">||&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>today&lt;span style="color:#f92672">.&lt;/span>year)&lt;span style="color:#f92672">.&lt;/span>to_i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># それぞれの引数が指定されなかった場合、monthに今月の月、yearに今年の年が入る&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 10~13行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> month &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">||&lt;/span> month &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">12&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;cal: &lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;m&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> is neither a month number (1..12) nor a name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -mオプションで1~12以外が指定された場合、エラーメッセージを表示して処理を終了&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 15~18行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> year &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">||&lt;/span> year &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">9999&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> puts &lt;span style="color:#e6db74">&amp;#34;cal: year `&lt;/span>&lt;span style="color:#e6db74">#{&lt;/span>params&lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#39;y&amp;#39;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39; not in range 1..9999&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># -yオプションで1~9999以外が指定された場合、エラーメッセージを表示して処理を終了&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 20~21行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start_of_month &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(year, month, &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>end_of_month &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>new(year, month, &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 月の初日と最終日&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 25行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#ae81ff">3&lt;/span> &lt;span style="color:#f92672">*&lt;/span> start_of_month&lt;span style="color:#f92672">.&lt;/span>wday
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 月の初日の曜日によって表示する位置を調整&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># start_of_month.wdayには曜日を表す数値(日曜から0~6)が入る&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 26行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(start_of_month&lt;span style="color:#f92672">..&lt;/span>end_of_month)&lt;span style="color:#f92672">.&lt;/span>each &lt;span style="color:#66d9ef">do&lt;/span> &lt;span style="color:#f92672">|&lt;/span>day&lt;span style="color:#f92672">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># dayに&amp;lt;Date: 2017-09-20 ...&amp;gt;の形式で月の初日から最終日までが入る&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 27~28行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format &lt;span style="color:#f92672">=&lt;/span> day &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#66d9ef">Date&lt;/span>&lt;span style="color:#f92672">.&lt;/span>today ? &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[7m%2d&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[0m &amp;#34;&lt;/span> : &lt;span style="color:#e6db74">&amp;#39;%2d &amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>printf format, day&lt;span style="color:#f92672">.&lt;/span>day
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 条件演算子によりdayが今日の日付の場合&amp;#34;\e[7m%2d\e[0m &amp;#34;が、それ以外の場合&amp;#39;%2d &amp;#39;がformatに代入される&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># printfにより、指定したフォーマットでday.day(日付)が表示される(今日の日付の場合に色を反転して表示)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a href="https://ama-tech.hatenablog.com/ansi-escape-code-in-ruby">エスケープシーケンスについて&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.ruby-lang.org/ja/latest/doc/print_format.html">sprintf フォーマット&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.k-cube.co.jp/wakaba/server/format.html">フォーマット指定子一覧&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 29行目&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>puts &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> day&lt;span style="color:#f92672">.&lt;/span>wday &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 土曜日で改行&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>【Ruby】コンソールに出力結果を色付きで表示する方法【ANSIエスケープシーケンス】</title><link>https://ama-blog.com/23/</link><pubDate>Wed, 08 Jun 2022 09:14:49 +0900</pubDate><guid>https://ama-blog.com/23/</guid><description>&lt;p>この記事ではRubyの出力結果を色付きで表示する方法を紹介します。&lt;/p>
&lt;p>ターミナルの出力結果で色を使うためにはエスケープシーケンスというものを利用します。&lt;/p>
&lt;p>エスケープシーケンスはターミナル上で色を含む特定の制御を実現するための特殊な文字列です。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters">ANSI escape code - Wikipedia&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797">ANSI Escape Codes&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>この記事では色の変更に関するエスケープシーケンスのみを紹介します。&lt;/p>
&lt;h2 id="1-書き方">1. 書き方&lt;/h2>
&lt;p>&lt;code>print &amp;quot;&amp;lt;エスケープシーケンス&amp;gt;文字列&amp;quot;&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 赤い文字を表示したい場合&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[31m文字&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>１つの文字列に複数のシーケンスを適用することもできる。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 文字色：赤、背景色：緑色&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[31m&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[42m文字&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>末尾に&lt;code>\e[0m&lt;/code>でリセットできる。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[31m赤文字&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[0m&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;普通の色の文字&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>末尾に&lt;code>\e[0m&lt;/code>がないと、次の出力も変更した色のまま。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[31m赤文字&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;これも赤文字&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="2-カラーコード">2. カラーコード&lt;/h2>
&lt;p>例：&lt;code>\e[31&lt;/code>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>色の名前&lt;/th>
&lt;th>文字色&lt;/th>
&lt;th>背景色&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>黒&lt;/td>
&lt;td>30&lt;/td>
&lt;td>40&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>赤&lt;/td>
&lt;td>31&lt;/td>
&lt;td>41&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>緑&lt;/td>
&lt;td>32&lt;/td>
&lt;td>42&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>黄色&lt;/td>
&lt;td>33&lt;/td>
&lt;td>43&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>青&lt;/td>
&lt;td>34&lt;/td>
&lt;td>44&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>マゼンタ&lt;/td>
&lt;td>35&lt;/td>
&lt;td>45&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>シアン&lt;/td>
&lt;td>36&lt;/td>
&lt;td>46&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>白&lt;/td>
&lt;td>37&lt;/td>
&lt;td>47&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>デフォルト&lt;/td>
&lt;td>39&lt;/td>
&lt;td>49&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>リセット&lt;/td>
&lt;td>0&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>デフォルト：色のみをリセット&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[3m&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[31mイタリック赤文字&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[39m&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;イタリック普通の色の文字&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>リセット：色やその他の効果を全てリセット&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[3m&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[31mイタリック赤文字&lt;/span>&lt;span style="color:#ae81ff">\e&lt;/span>&lt;span style="color:#e6db74">[0m&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print &lt;span style="color:#e6db74">&amp;#34;普通の書式で普通の色の文字&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>【参考】&lt;/p></description></item><item><title>【macOS】PostgreSQLの基本操作</title><link>https://ama-blog.com/22/</link><pubDate>Wed, 08 Jun 2022 09:08:47 +0900</pubDate><guid>https://ama-blog.com/22/</guid><description>&lt;p>この記事では、PostgreSQLの基本操作を解説します。&lt;/p>
&lt;ul>
&lt;li>バージョン情報
&lt;ul>
&lt;li>macOS Monterey 12.4&lt;/li>
&lt;li>PostgreSQL 14.3&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="1-インストール">1. インストール&lt;/h2>
&lt;p>&lt;strong>インストール&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ brew install postgresql
&lt;/code>&lt;/pre>&lt;p>&lt;strong>バージョン確認&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ psql --version
psql (PostgreSQL) 14.3
&lt;/code>&lt;/pre>&lt;h2 id="2-データベースサーバの起動停止">2. データベースサーバの起動・停止&lt;/h2>
&lt;h3 id="2-1-brew-servicesコマンド">2-1. brew servicesコマンド&lt;/h3>
&lt;p>&lt;a href="https://github.com/Homebrew/homebrew-services">brew services&lt;/a>&lt;/p>
&lt;p>&lt;strong>起動&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ brew services start postgresql
&lt;/code>&lt;/pre>&lt;p>&lt;strong>停止&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ brew services stop postgresql
&lt;/code>&lt;/pre>&lt;h3 id="2-2-pg_ctlコマンド">2-2. pg_ctlコマンド&lt;/h3>
&lt;p>&lt;a href="https://www.postgresql.org/docs/current/app-pg-ctl.html">pg_ctlコマンド&lt;/a>&lt;/p>
&lt;p>&lt;strong>起動&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ pg_ctl -D /usr/local/var/postgres start
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>pg_ctl -D &amp;lt;データディレクトリのパス&amp;gt; start&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>停止&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ pg_ctl -D /usr/local/var/postgres stop
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>pg_ctl -D &amp;lt;データディレクトリのパス&amp;gt; stop&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>データディレクトリのパスの確認&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>postgres=# SHOW data_directory;
data_directory
-------------------------
/usr/local/var/postgres
(1 row)
&lt;/code>&lt;/pre>&lt;p>&lt;strong>&lt;code>-D&lt;/code>オプションの省略&lt;/strong>&lt;/p>
&lt;p>環境変数&lt;code>PGDATA&lt;/code>にデータディレクトリのパスを設定することで、&lt;code>-D&lt;/code>オプションを省略して起動・停止ができる。&lt;/p>
&lt;p>&lt;code>~/.zshrc&lt;/code>に以下を追加&lt;/p></description></item><item><title>SQLの基本を理解する</title><link>https://ama-blog.com/21/</link><pubDate>Tue, 07 Jun 2022 08:57:52 +0900</pubDate><guid>https://ama-blog.com/21/</guid><description>&lt;h2 id="1-sqlの概要">1. SQLの概要&lt;/h2>
&lt;h3 id="1-1-sqlとは">1-1. SQLとは&lt;/h3>
&lt;ul>
&lt;li>リレーショナルデータベースを操作するための言語&lt;/li>
&lt;li>標準規格に準拠したSQLを標準SQLと言う&lt;/li>
&lt;/ul>
&lt;h3 id="1-2-sqlの基本的な記述ルール">1-2. SQLの基本的な記述ルール&lt;/h3>
&lt;ul>
&lt;li>SQL文の最後に&lt;code>;&lt;/code>(セミコロン)をつける&lt;/li>
&lt;li>キーワードに大文字/小文字の区別はない&lt;/li>
&lt;li>定数は&lt;code>''&lt;/code>(シングルクォーテーション)で囲む&lt;/li>
&lt;/ul>
&lt;h2 id="2-sqlの分類">2. SQLの分類&lt;/h2>
&lt;h3 id="2-1-ddldata-definition-language">2-1. DDL(Data Definition Language)&lt;/h3>
&lt;ul>
&lt;li>CREATE&lt;/li>
&lt;li>DROP&lt;/li>
&lt;li>ALTER&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-dmldata-manipulation-language">2-2. DML(Data Manipulation Language)&lt;/h3>
&lt;ul>
&lt;li>SELECT&lt;/li>
&lt;li>INSERT&lt;/li>
&lt;li>UPDATE&lt;/li>
&lt;li>DELETE&lt;/li>
&lt;/ul>
&lt;h3 id="2-3-dcldata-control-language">2-3. DCL(Data Control Language)&lt;/h3>
&lt;ul>
&lt;li>COMMIT&lt;/li>
&lt;li>ROLLBACK&lt;/li>
&lt;li>GRANT&lt;/li>
&lt;li>REVOKE&lt;/li>
&lt;/ul>
&lt;h2 id="3-sql基礎">3. SQL基礎&lt;/h2>
&lt;h3 id="3-1-create-table">3-1. CREATE TABLE&lt;/h3>
&lt;p>テーブルの作成&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">CREATE&lt;/span> &lt;span style="color:#66d9ef">TABLE&lt;/span> Staff
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(id CHAR(&lt;span style="color:#ae81ff">4&lt;/span>) &lt;span style="color:#66d9ef">NOT&lt;/span> &lt;span style="color:#66d9ef">NULL&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>name TEXT &lt;span style="color:#66d9ef">NOT&lt;/span> &lt;span style="color:#66d9ef">NULL&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>age INTEGER ,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">PRIMARY&lt;/span> &lt;span style="color:#66d9ef">KEY&lt;/span> (id));
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>主な制約
&lt;ul>
&lt;li>PRIMARY KEY&lt;/li>
&lt;li>UNIQUE&lt;/li>
&lt;li>REFERENCES 表名(列名)&lt;/li>
&lt;li>CHECK(条件)&lt;/li>
&lt;li>NOT NULL&lt;/li>
&lt;li>DEFAULT 値&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="3-2-insert">3-2. INSERT&lt;/h3>
&lt;p>行の挿入&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">INSERT&lt;/span> &lt;span style="color:#66d9ef">INTO&lt;/span> Staff (id, name, age) &lt;span style="color:#66d9ef">VALUES&lt;/span> (&lt;span style="color:#e6db74">&amp;#39;0001&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;山田太郎&amp;#39;&lt;/span>, &lt;span style="color:#ae81ff">26&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">INSERT&lt;/span> &lt;span style="color:#66d9ef">INTO&lt;/span> Staff &lt;span style="color:#66d9ef">VALUES&lt;/span> (&lt;span style="color:#e6db74">&amp;#39;0004&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;渡辺さつき&amp;#39;&lt;/span>, &lt;span style="color:#ae81ff">28&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-3-select">3-3. SELECT&lt;/h3>
&lt;p>列の取得&lt;/p></description></item><item><title>さくらのVPSにXserverドメインで取得した独自ドメインを設定する方法</title><link>https://ama-blog.com/20/</link><pubDate>Mon, 06 Jun 2022 22:34:49 +0900</pubDate><guid>https://ama-blog.com/20/</guid><description>&lt;p>この記事ではさくらのネームサーバにXserverドメインで取得した独自ドメインを設定する方法を紹介します。&lt;/p>
&lt;p>これによりさくらのVPSに作成したサーバに、設定したドメイン名でアクセスできるようになります。&lt;/p>
&lt;ul>
&lt;li>前提条件
&lt;ul>
&lt;li>さくらのVPSでサーバを契約済み&lt;/li>
&lt;li>Xserverドメインで取得した独自ドメインをXserverで使用&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>さくらのVPSでサーバを契約する方法は以下を参照してください。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/14/">さくらのVPSにDebian11 (bullseye)をインストールする方法 | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-xserverドメイン側の設定">1. Xserverドメイン側の設定&lt;/h2>
&lt;h3 id="1-1-ネームサーバー設定の変更">1-1. ネームサーバー設定の変更&lt;/h3>
&lt;p>Xserverアカウントにログインします。&lt;/p>
&lt;p>&lt;a href="https://secure.xserver.ne.jp/xapanel/login/xserver/">XServerアカウント - ログイン | レンタルサーバーならエックスサーバー&lt;/a>&lt;/p>
&lt;p>ログイン後、該当のドメインを選択。&lt;/p>
&lt;p>ドメイン選択後の画面で「ネームサーバー設定」&amp;gt;「設定変更」を選択。&lt;/p>
&lt;p>ネームサーバー設定で「ドメイン適用先サービス」&amp;gt;「その他のサービスで利用する」を選択し、ネームサーバーに以下を入力します。&lt;/p>
&lt;pre tabindex="0">&lt;code>ns1.dns.ne.jp
ns2.dns.ne.jp
&lt;/code>&lt;/pre>&lt;p>以下のようになっていればOKです。「確認画面へ進む」を選択します。&lt;/p>
&lt;p>&lt;img alt="ネームサーバー設定1" loading="lazy" src="https://ama-blog.com/20/images/1.png">&lt;/p>
&lt;p>以下の画面で、設定内容を確認して「設定を変更する」を選択。&lt;/p>
&lt;p>&lt;img alt="ネームサーバー設定2" loading="lazy" src="https://ama-blog.com/20/images/2.png">&lt;/p>
&lt;p>Xserverドメイン側の設定は以上です。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.xdomain.ne.jp/manual/man_domain_namesever_setting.php">ネームサーバーの設定 | Xserverドメイン&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="2-さくらのvps側の設定">2. さくらのVPS側の設定&lt;/h2>
&lt;h3 id="2-1-ドメイン名の登録">2-1. ドメイン名の登録&lt;/h3>
&lt;p>さくらインターネットの会員メニューにログインします。&lt;/p>
&lt;p>&lt;a href="https://secure.sakura.ad.jp/auth/login?url=https://secure.sakura.ad.jp/menu/top/">会員認証｜さくらインターネット&lt;/a>&lt;/p>
&lt;p>「契約中のドメイン一覧」を選択。&lt;/p>
&lt;p>以下の画面で、「ドメインコントロールパネル」を選択。&lt;/p>
&lt;p>&lt;img alt="契約中のドメイン一覧" loading="lazy" src="https://ama-blog.com/20/images/3.png">&lt;/p>
&lt;p>以下の画面で、「ネームサーバサービス」&amp;gt;「ネームサーバ新規登録」を選択。&lt;/p>
&lt;p>&lt;img alt="ネームサーバサービス" loading="lazy" src="https://ama-blog.com/20/images/4.png">&lt;/p>
&lt;p>以下の画面で、利用したいドメイン名を入力し、「ドメインを登録する」を選択。&lt;/p>
&lt;p>&lt;img alt="ドメインを登録する" loading="lazy" src="https://ama-blog.com/20/images/5.png">&lt;/p>
&lt;p>ネームサーバサービス一覧に追加したドメインが表示されたら、新規登録は完了です。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://help.sakura.ad.jp/domain/2303/">ネームサーバー（オプションサービス）を利用したい | さくらのサポート情報&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-ゾーン情報の作成">2-2. ゾーン情報の作成&lt;/h3>
&lt;p>以下の画面で、先ほど追加したドメインの「ゾーン&amp;gt;」を選択します。(画面右側)&lt;/p>
&lt;p>&lt;img alt="ゾーン情報の作成1" loading="lazy" src="https://ama-blog.com/20/images/6.png">&lt;/p>
&lt;p>以下の画面で、「さくらのDNSに設定する(簡単設定)」でサーバーのIPアドレスを入力し、「追加して設定」を選択。&lt;/p>
&lt;p>&lt;img alt="ゾーン情報の作成2" loading="lazy" src="https://ama-blog.com/20/images/7.png">&lt;/p>
&lt;p>さくらのVPS側の設定は以上です。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://help.sakura.ad.jp/domain/2302/?article_anchor=js-nav-3">ドメインのゾーン情報を編集したい | さくらのサポート情報&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>以上で終了です。&lt;/p>
&lt;hr>
&lt;p>【メモ】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://pentan.net/sakuravps-xdomain-windows/">【IIS】さくらのVPS(WindowsServer)にエックスサーバーの独自ドメインを設定してみた&lt;/a>&lt;/li>
&lt;li>ネームサーバー
&lt;ul>
&lt;li>IPアドレスとドメイン名の紐付けを行うサーバー&lt;/li>
&lt;li>= DNSサーバー&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ドメイン移管とは
&lt;ul>
&lt;li>&lt;a href="https://www.xserver.ne.jp/blog/domain-transfer/">ドメイン移管とは？移管の流れ・具体的な方法や費用・トラブルの原因まで解説！ – 初心者のためのブログ始め方講座&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>別のパターン
&lt;ul>
&lt;li>&lt;a href="https://help.sakura.ad.jp/domain/2147/">他社で取得・管理中のドメインを設定したい | さくらのサポート情報&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://help.sakura.ad.jp/domain/2145/">さくらインターネットで取得・管理中のドメインを設定したい | さくらのサポート情報&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://help.sakura.ad.jp/domain/2146/">他社から移管したドメインを設定したい | さくらのサポート情報&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>【Debian】NginxでVirtual Hostsを使って複数のドメインを設定する方法【Server Blocks】</title><link>https://ama-blog.com/19/</link><pubDate>Mon, 06 Jun 2022 12:28:13 +0900</pubDate><guid>https://ama-blog.com/19/</guid><description>&lt;p>NginxのWebサーバではVirtual Hosts(Server Blocks)を使って1台のサーバで複数のドメインを運用することができます。&lt;/p>
&lt;p>この記事では、Debian 11上のNginxにVirtual Hostsを設定する方法を紹介します。&lt;/p>
&lt;p>なお、本稿の手順を進める前にDebian上にNginxがインストールされている必要があります。&lt;/p>
&lt;p>DebianでのNginxのインストール方法は以下の記事を参照してください。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/18/">【Debian】Nginx公式リポジトリにある最新バージョンのNginxをインストールする | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>Debian 11 bullseye&lt;/li>
&lt;li>nginx 1.21.6&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-ドキュメントルートディレクトリの作成">2-1. ドキュメントルートディレクトリの作成&lt;/h3>
&lt;p>ドキュメントルートは各ドメインのhtmlファイルが保存されるディレクトリで、任意の場所に作ることができます。&lt;/p>
&lt;p>以下では &lt;code>/var/www&lt;/code>ディレクトリの中にサーバでホストしたいドメインごとに html ディレクトリを作成します。&lt;/p>
&lt;p>今回はサンプルとして&lt;code>test1.com&lt;/code>と&lt;code>test2.com&lt;/code>の2つのドメインを使用します。&lt;/p>
&lt;p>以下のコマンドを実行して、ドキュメントルートディレクトリを作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo mkdir -p /var/www/test1.com/html
$ sudo mkdir -p /var/www/test2.com/html
&lt;/code>&lt;/pre>&lt;h3 id="2-2-サンプルページの作成">2-2. サンプルページの作成&lt;/h3>
&lt;p>次に各サイトのデフォルトページをドキュメントルートディレクトリの中に作成します。&lt;/p>
&lt;p>以下のコマンドを実行して、1つ目のサンプルページを作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo vi /var/www/test1.com/html/index.html
&lt;/code>&lt;/pre>&lt;p>テスト用として、以下の内容で作成します。&lt;/p>
&lt;p>&lt;code>/var/www/test1.com/html/index.html&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">html&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">title&lt;/span>&amp;gt;test1&amp;lt;/&lt;span style="color:#f92672">title&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">head&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">h1&lt;/span>&amp;gt;test1.com&amp;lt;/&lt;span style="color:#f92672">h1&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#f92672">body&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">html&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>続けて、2つ目のサンプルページも作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo cp /var/www/test1.com/html/index.html /var/www/test2.com/html/
$ sudo vi /var/www/test2.com/html/index.html
&lt;/code>&lt;/pre>&lt;p>内容は以下のようになります。&lt;/p></description></item><item><title>【Debian】Nginx公式リポジトリにある最新バージョンのNginxをインストールする</title><link>https://ama-blog.com/18/</link><pubDate>Mon, 06 Jun 2022 12:25:33 +0900</pubDate><guid>https://ama-blog.com/18/</guid><description>&lt;p>この記事では、DebianにNginx公式リポジトリにある最新バージョンのNginxをインストールする手順を紹介します。&lt;/p>
&lt;p>※Debianのデフォルトの設定で&lt;code>apt install nginx&lt;/code>した場合、Nginx公式リポジトリからではなく、Debian公式リポジトリから&lt;a href="https://packages.debian.org/bullseye/nginx">少し古いバージョンのNginx&lt;/a>がインストールされます。&lt;/p>
&lt;h2 id="1-実行環境">1. 実行環境&lt;/h2>
&lt;ul>
&lt;li>Debian 11 bullseye&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-必要なパッケージのインストール">2-1. 必要なパッケージのインストール&lt;/h3>
&lt;p>Nginxのインストールに必要な以下のパッケージをインストールします。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/curl">curl&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/gnupg2">gnupg2&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/ca-certificates">ca-certificates&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/lsb-release">lsb-release&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://packages.debian.org/bullseye/debian-archive-keyring">debian-archive-keyring&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>以下のコマンドを実行してパッケージをインストール。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>パッケージの情報を表示：&lt;code>apt show &amp;lt;パッケージ名&amp;gt;&lt;/code>&lt;/li>
&lt;li>インストール済みパッケージの確認：&lt;code>apt list --installed &amp;lt;パッケージ名&amp;gt;&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-署名鍵のインポート">2-2. 署名鍵のインポート&lt;/h3>
&lt;p>aptがパッケージの信頼性を確認できるようにするために、Nginxが公式に公開している署名鍵をインポートします。&lt;/p>
&lt;p>以下のコマンドを実行して署名鍵をインポート。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg &amp;gt;/dev/null
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>コマンドの意味
&lt;ul>
&lt;li>&lt;code>curl https://nginx.org/keys/nginx_signing.key&lt;/code>
&lt;ul>
&lt;li>curlコマンドで署名鍵ファイルをダウンロード&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>gpg --dearmor&lt;/code>
&lt;ul>
&lt;li>署名鍵ファイルをgpgコマンドで暗号化&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg&lt;/code>
&lt;ul>
&lt;li>teeコマンドで /usr/share/keyrings 配下に nginx-archive-keyring.gpg というファイル名で保存&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>&amp;gt;/dev/null&lt;/code>
&lt;ul>
&lt;li>コマンド実行時の出力結果を /dev/null に渡している&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>以下のコマンドを実行して、ダウンロードした署名鍵が正しいことを確認します。&lt;/p></description></item><item><title>telnetでGETとPOSTでHTTPリクエストを送る方法</title><link>https://ama-blog.com/17/</link><pubDate>Sun, 05 Jun 2022 14:21:28 +0900</pubDate><guid>https://ama-blog.com/17/</guid><description>&lt;p>この記事では、クライアントからtelnetを使ってGETメソッドとPOSTメソッドでWebサーバにHTTPリクエストを送信する方法を紹介します。&lt;/p>
&lt;p>HTTPは、Webサーバ(サーバ)⇄Webブラウザ(クライアント)間のWebページの送受信に使われるプロトコルです。&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey：12.4&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-telnetのインストール">2-1. telnetのインストール&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ brew install telnet
&lt;/code>&lt;/pre>&lt;h3 id="2-2-getメソッド">2-2. GETメソッド&lt;/h3>
&lt;p>以下のコマンドで、&lt;code>example.com&lt;/code>の80番ポート(HTTP)に接続&lt;/p>
&lt;pre tabindex="0">&lt;code>$ telnet example.com 80
&lt;/code>&lt;/pre>&lt;p>書式：&lt;code>telnet &amp;lt;ホスト名&amp;gt; &amp;lt;ポート番号&amp;gt;&lt;/code>&lt;/p>
&lt;p>続けて、以下のHTTPリクエストを実行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>GET / HTTP/1.1 &lt;span style="color:#75715e"># リクエスト行&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Host: example.com &lt;span style="color:#75715e"># ヘッダ&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;改行&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>リクエスト行
&lt;ul>
&lt;li>メソッド：GETメソッド、リクエストURI：/、プロトコルバージョン：HTTP/1.1&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ヘッダ
&lt;ul>
&lt;li>フィールド名：Host、フィールド値：example.com
&lt;ul>
&lt;li>Host→HTTP/1.1 で唯一の必須ヘッダ。フィールド値にURLのホスト部分を指定。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&amp;lt;改行&amp;gt;
&lt;ul>
&lt;li>1行空けることでヘッダの終わりを伝える&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="2-3-postメソッド">2-3. POSTメソッド&lt;/h3>
&lt;p>&lt;code>xxx.com/articles&lt;/code>に以下のようなフォームがある場合を想定&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;form action=&amp;#34;/articles&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;label for=&amp;#34;article_title&amp;#34;&amp;gt;Title&amp;lt;/label&amp;gt;
&amp;lt;input type=&amp;#34;text&amp;#34; name=&amp;#34;article[title]&amp;#34; id=&amp;#34;article_title&amp;#34;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;label for=&amp;#34;article_body&amp;#34;&amp;gt;Body&amp;lt;/label&amp;gt;
&amp;lt;textarea type=&amp;#34;text&amp;#34; name=&amp;#34;article[body]&amp;#34; id=&amp;#34;article_body&amp;#34;&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;input type=&amp;#34;submit&amp;#34; name=&amp;#34;commit&amp;#34; value=&amp;#34;Submit&amp;#34; data-disable-with=&amp;#34;Submit&amp;#34;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code>&lt;/pre>&lt;p>以下のコマンドで、&lt;code>xxx.com&lt;/code>の80番ポート(HTTP)に接続&lt;/p></description></item><item><title>【Debian】Nginxで自分で作ったhtmlファイルを表示させる方法</title><link>https://ama-blog.com/16/</link><pubDate>Sun, 05 Jun 2022 14:16:21 +0900</pubDate><guid>https://ama-blog.com/16/</guid><description>&lt;p>この記事では、Nginx上に自分で作ったhtmlファイルを配置し、ブラウザから表示させる方法を紹介します。&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>Debian 11 bullseye&lt;/li>
&lt;li>nginx 1.21.6&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-nginxのインストール">2-1. Nginxのインストール&lt;/h3>
&lt;p>Nginxをインストール&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo apt update
$ sudo apt install nginx
&lt;/code>&lt;/pre>&lt;p>Nginxのインストールを確認&lt;/p>
&lt;pre tabindex="0">&lt;code>$ /usr/sbin/nginx -v
nginx version: nginx/1.21.6
&lt;/code>&lt;/pre>&lt;h3 id="2-2-nginxの起動">2-2. Nginxの起動&lt;/h3>
&lt;p>Nignxを起動&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo systemctl start nginx
&lt;/code>&lt;/pre>&lt;p>Nginxの起動を確認&lt;/p>
&lt;pre tabindex="0">&lt;code>$ systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2022-06-05 06:38:04 JST; 1h 45min ago
Docs: https://nginx.org/en/docs/
Process: 8247 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 8248 (nginx)
Tasks: 2 (limit: 529)
Memory: 1.7M
CPU: 10ms
CGroup: /system.slice/nginx.service
├─8248 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─8250 nginx: worker process
&lt;/code>&lt;/pre>&lt;h3 id="2-3-設定ファイルの確認">2-3. 設定ファイルの確認&lt;/h3>
&lt;p>Nginxの設定ファイルを確認&lt;/p></description></item><item><title>【Debian 11 bullseye】sudoコマンドをインストールする方法</title><link>https://ama-blog.com/15/</link><pubDate>Wed, 01 Jun 2022 23:38:19 +0900</pubDate><guid>https://ama-blog.com/15/</guid><description>&lt;p>本稿では、さくらVPSにインストールしたDebian 11にsudoコマンドをインストールする方法を紹介します。&lt;/p>
&lt;p>sudoは一般ユーザにスーパーユーザ(root)の権限を与えるコマンドです。&lt;/p>
&lt;p>なお、さくらVPSにDebian 11をインストール方法は以下をご参照ください。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/14/">さくらのVPSにDebian11 (bullseye)をインストールする方法 | あまブログ&lt;/a>&lt;/p>
&lt;h2 id="1-sudoのインストール">1. sudoのインストール&lt;/h2>
&lt;p>sudoコマンドをインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code># apt install -y sudo
&lt;/code>&lt;/pre>&lt;h2 id="2-etcsudoersの編集">2. /etc/sudoersの編集&lt;/h2>
&lt;p>sudoコマンドの設定ファイルである&lt;code>/etc/sudoers&lt;/code>を編集して、権限の設定を行います。&lt;/p>
&lt;p>&lt;code>/etc/sudoers&lt;/code>は&lt;strong>直接テキストエディタで開いて編集してはいけません。&lt;/strong>&lt;/p>
&lt;p>書き方を誤るとsudoが動作せずに、どのユーザもsudoが使えなくなってしまうことがあるためです。&lt;/p>
&lt;p>&lt;code>/etc/sudoers&lt;/code>の編集はvisudoコマンドを使用します。&lt;/p>
&lt;pre tabindex="0">&lt;code># visudo
&lt;/code>&lt;/pre>&lt;p>visudoコマンドを実行したら、&lt;code>/etc/sudoers&lt;/code>に以下を追記します。&lt;/p>
&lt;pre tabindex="0">&lt;code>foo ALL=(ALL) ALL
&lt;/code>&lt;/pre>&lt;p>書式：&lt;code>&amp;lt;ユーザ&amp;gt; &amp;lt;マシン名&amp;gt;=(&amp;lt;権限&amp;gt;) &amp;lt;コマンド&amp;gt;&lt;/code>&lt;/p>
&lt;p>&lt;code>(&amp;lt;権限&amp;gt;)&lt;/code>のところを&lt;code>(&amp;lt;ALL:ALL&amp;gt;)&lt;/code>と書いた場合、左側がユーザ、右側がグループを表す。&lt;/p>
&lt;p>ファイルを保存し、設定したユーザでsudoコマンドが実行できれば設定は完了です。&lt;/p>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://qiita.com/osktak/items/f1746d64797a6a4dd6ae">【Debian 8 Jessie】sudoコマンドをインストールする #Linux - Qiita&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://qiita.com/progrhyme/items/6f936033b9d23efb1741">sudoers覚え書き #sudo - Qiita&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://takuya-1st.hatenablog.jp/entry/20090806/1249554458">sudoersを変更する、よく使う設定例 - それマグで！&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.amazon.co.jp/dp/B072K1NH76/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1">新しいLinuxの教科書 9章 03 スーパーユーザ&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>さくらのVPSにDebian11 (bullseye)をインストールする方法</title><link>https://ama-blog.com/14/</link><pubDate>Wed, 01 Jun 2022 23:09:44 +0900</pubDate><guid>https://ama-blog.com/14/</guid><description>&lt;p>さくらのVPSにDebian11をインストールする手順を解説します。&lt;/p>
&lt;p>サーバーを契約し、OSをインストールして、ユーザーを作成してログインします。&lt;/p>
&lt;h2 id="1-手順">1. 手順&lt;/h2>
&lt;p>以下の手順で進めていきます。&lt;/p>
&lt;ol>
&lt;li>さくらのVPSでサーバーを契約&lt;/li>
&lt;li>Debian11のインストール&lt;/li>
&lt;li>Debian11の設定&lt;/li>
&lt;li>Debian11にログイン&lt;/li>
&lt;/ol>
&lt;h3 id="1-1-さくらのvpsでサーバーを契約">1-1. さくらのVPSでサーバーを契約&lt;/h3>
&lt;p>以下にアクセスし、「お申し込み」を選択&lt;/p>
&lt;p>&lt;a href="https://vps.sakura.ad.jp/">VPS（仮想専用サーバー）｜さくらインターネット&lt;/a>&lt;/p>
&lt;ul>
&lt;li>サーバー作成
&lt;ul>
&lt;li>サーバー選択
&lt;ul>
&lt;li>ゾーン：石狩第一&lt;/li>
&lt;li>プラン：512MB(学習には最小プランで十分)&lt;/li>
&lt;li>ストレージ変更オプション：SSD25GB&lt;/li>
&lt;li>購入台数：1台&lt;/li>
&lt;li>支払いパターン：毎月払い&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>サーバー設定
&lt;ul>
&lt;li>サーバー名：任意&lt;/li>
&lt;li>サーバー説明：任意&lt;/li>
&lt;li>OS設定
&lt;ul>
&lt;li>インストールするOS：どれでも(後で入れ直すため)&lt;/li>
&lt;li>OSバージョン：どれでも(後で入れ直すため)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>スタートアップスクリプト：利用しない&lt;/li>
&lt;li>サーバーへのSSHキー登録：登録しない(後で入れ直すため)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>支払い方法
&lt;ul>
&lt;li>初回は2ヶ月分の支払い&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>支払い完了後に以下の画面が表示され、数分後にサーバーが作成されます。
&lt;img alt="支払い完了後の画面" loading="lazy" src="https://ama-blog.com/14/images/1.png">&lt;/p>
&lt;h3 id="1-2-debian11のインストール">1-2. Debian11のインストール&lt;/h3>
&lt;p>さくらのVPSにログインして、コントロールパネルのサーバー一覧から作成したサーバーを選択
&lt;img alt="サーバー一覧" loading="lazy" src="https://ama-blog.com/14/images/2.png">&lt;/p>
&lt;p>「OS再インストール」を選択し、OSインストール形式は「カスタムOS」、インストールOSは「Debian 11 amd64」を選択して「内容確認」をクリック
&lt;img alt="OS再インストール" loading="lazy" src="https://ama-blog.com/14/images/3.png">&lt;/p>
&lt;p>インストールOSが「Debian 11 amd64」になっていることを確認して、「OS再インストール」をクリック
&lt;img alt="OS再インストール実行" loading="lazy" src="https://ama-blog.com/14/images/4.jpg">&lt;/p>
&lt;h3 id="1-3-debian11の設定">1-3. Debian11の設定&lt;/h3>
&lt;p>作成したサーバーを選択し、「コンソール」&amp;gt;「VNCコンソール」を選択してVNCコンソールを起動
&lt;img alt="VNCコンソール" loading="lazy" src="https://ama-blog.com/14/images/5.jpg">&lt;/p>
&lt;h4 id="1-3-1-rootユーザーの設定">1-3-1. rootユーザーの設定&lt;/h4>
&lt;p>rootユーザーのパスワードを設定して、「Continue」を選択
&lt;img alt="rootユーザーのパスワードの設定" loading="lazy" src="https://ama-blog.com/14/images/6.png">&lt;/p>
&lt;p>設定したパスワードを再度入力して、「Continue」を選択
&lt;img alt="パスワードの再入力" loading="lazy" src="https://ama-blog.com/14/images/7.png">&lt;/p>
&lt;h4 id="1-3-2-一般ユーザーの設定">1-3-2. 一般ユーザーの設定&lt;/h4>
&lt;p>ユーザーのフルネームの設定は特に必要ないので何も入力せず、「Continue」を選択
&lt;img alt="ユーザーのフルネームの設定" loading="lazy" src="https://ama-blog.com/14/images/8.png">&lt;/p>
&lt;p>一般ユーザーのユーザー名を設定して、「Continue」を選択
&lt;img alt="一般ユーザーのユーザー名の設定" loading="lazy" src="https://ama-blog.com/14/images/9.png">&lt;/p>
&lt;p>一般ユーザーのパスワードを設定して、「Continue」を選択
&lt;img alt="一般ユーザーのパスワードの設定" loading="lazy" src="https://ama-blog.com/14/images/10.png">&lt;/p>
&lt;p>設定したパスワードを再度入力して、「Continue」を選択
&lt;img alt="パスワードの再入力" loading="lazy" src="https://ama-blog.com/14/images/11.png">&lt;/p>
&lt;h4 id="1-3-3-パーティションの設定">1-3-3. パーティションの設定&lt;/h4>
&lt;p>「Guided – use entire disk」を選択
&lt;img alt="Guided – use entire disk" loading="lazy" src="https://ama-blog.com/14/images/12.png">&lt;/p>
&lt;p>「Virtual disk 1 (vda)」を選択
&lt;img alt="Virtual disk 1 (vda)" loading="lazy" src="https://ama-blog.com/14/images/13.png">&lt;/p></description></item><item><title>【Git】リモート追跡ブランチと上流ブランチを理解する【fetch・merge】</title><link>https://ama-blog.com/13/</link><pubDate>Mon, 30 May 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/13/</guid><description>&lt;h2 id="1-リモート追跡ブランチ上流ブランチ">1. リモート追跡ブランチ、上流ブランチ&lt;/h2>
&lt;p>&lt;img alt="リモート追跡ブランチと上流ブランチ" loading="lazy" src="https://ama-blog.com/13/images/1.png">&lt;/p>
&lt;ul>
&lt;li>リモート追跡ブランチ(&lt;a href="https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefremotetrackingbrancharemote-trackingbranch">remote-tracking branch&lt;/a>)
&lt;ul>
&lt;li>リモートブランチの状態を追跡するブランチ&lt;/li>
&lt;li>ローカルリポジトリに存在する(実体は&lt;code>.git/refs/remotes/&lt;/code>)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>上流ブランチ(&lt;a href="https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefupstreambranchaupstreambranch">upstream branch&lt;/a>)
&lt;ul>
&lt;li>デフォルトでマージの対象となるブランチ(引数なしで&lt;code>git merge&lt;/code>した時にマージされるブランチ)&lt;/li>
&lt;li>mainブランチの上流ブランチがorigin/mainブランチである場合、「mainブランチはorigin/mainブランチを追跡している」と言う&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="2-fetchmergepull">2. fetch、merge、(pull)&lt;/h2>
&lt;p>&lt;img alt="fetchとmerge" loading="lazy" src="https://ama-blog.com/13/images/2.png">&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://git-scm.com/docs/git-fetch">fetch&lt;/a>：リモートリポジトリのmainブランチをローカルリポジトリのorigin/mainブランチに反映&lt;/li>
&lt;li>&lt;a href="https://git-scm.com/docs/git-merge">merge&lt;/a>：ローカルリポジトリのorigin/mainブランチをローカルリポジトリのmainブランチにマージ&lt;/li>
&lt;li>&lt;a href="https://git-scm.com/docs/git-pull">pull&lt;/a> = fetch + merge
&lt;ul>
&lt;li>&lt;code>git pull origin main&lt;/code> = &lt;code>git fetch origin&lt;/code> + &lt;code>git merge origin/main&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="3-関連コマンド">3. 関連コマンド&lt;/h2>
&lt;h3 id="3-1-上流ブランチの設定">3-1. 上流ブランチの設定&lt;/h3>
&lt;p>上流ブランチの設定(&lt;a href="https://git-scm.com/docs/git-branch#Documentation/git-branch.txt--ultupstreamgt">git-branch -u&lt;/a>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># git branch -u &amp;lt;リモート追跡ブランチ&amp;gt; &amp;lt;ローカルブランチ&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git branch -u origin/main main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>push時に上流ブランチを設定(&lt;a href="https://git-scm.com/docs/git-push#Documentation/git-push.txt--u">git-push -u&lt;/a>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># mainブランチの上流ブランチにorigin/mainブランチが設定される&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push -u origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上流ブランチの設定を解除(&lt;a href="https://git-scm.com/docs/git-branch#Documentation/git-branch.txt---unset-upstream">git-branch &amp;ndash;unset-upstream&lt;/a>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># git branch --unset-upstream &amp;lt;ローカルブランチ&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git branch --unset-upstream main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-2-ブランチの確認">3-2. ブランチの確認&lt;/h3>
&lt;p>ローカルブランチとリモート追跡ブランチの表示(&lt;a href="https://git-scm.com/docs/git-branch#Documentation/git-branch.txt--a">git-branch -a&lt;/a>)&lt;/p></description></item><item><title>【apt install】Debian公式リポジトリに登録されていないパッケージをインストールする方法</title><link>https://ama-blog.com/12/</link><pubDate>Thu, 19 May 2022 15:44:41 +0900</pubDate><guid>https://ama-blog.com/12/</guid><description>&lt;p>本稿では、aptコマンドを使ってDebianの標準以外のパッケージをインストールする方法を紹介します。&lt;/p>
&lt;h2 id="1-はじめに">1. はじめに&lt;/h2>
&lt;p>Debianにパッケージをインストールする時には、aptコマンドを使うことが多いと思います。&lt;/p>
&lt;p>デフォルトの状態ではDebianの公式リポジトリのみが&lt;code>/etc/apt/sources.list&lt;/code>に設定されています。&lt;/p>
&lt;p>そのため、サードパーティ製のパッケージ(Debianの公式リポジトリに登録されていないパッケージ)をインストールするためには、そのパッケージが格納されてるリポジトリを&lt;code>/etc/apt/sources.list&lt;/code>に追加する必要があります。&lt;/p>
&lt;p>今回は、以下の記事を参考に&lt;code>iozone3&lt;/code>のインストールを例に手順を解説します。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://qiita.com/kon_yu/items/8ac350f3951f8534c931">apt-getで見つからないパッケージを追加する方法(debian, ubuntu両方対応)&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="2-実行環境">2. 実行環境&lt;/h2>
&lt;ul>
&lt;li>Debian GNU/Linux 11 (bullseye)&lt;/li>
&lt;/ul>
&lt;h2 id="3-手順">3. 手順&lt;/h2>
&lt;h3 id="3-1パッケージディレクトリを検索">3-1.パッケージディレクトリを検索&lt;/h3>
&lt;p>以下のサイトから、インストールしたいパッケージが存在するリポジトリを検索します。&lt;/p>
&lt;p>&lt;a href="https://www.debian.org/distrib/packages#search_packages">Debian &amp;ndash; パッケージ&lt;/a>&lt;/p>
&lt;p>「キーワード」に&lt;code>iozone3&lt;/code>と入力して「検索」。&lt;/p>
&lt;p>&lt;img alt="パッケージ検索画面" loading="lazy" src="https://ama-blog.com/12/images/1.jpg">&lt;/p>
&lt;p>&lt;code>iozone3&lt;/code>は&lt;code>non-free&lt;/code>リポジトリにあることがわかる。&lt;/p>
&lt;p>&lt;img alt="パッケージ検索結果" loading="lazy" src="https://ama-blog.com/12/images/2.jpg">&lt;/p>
&lt;h3 id="3-2リポジトリを追加">3-2.リポジトリを追加&lt;/h3>
&lt;p>&lt;code>/etc/apt/sources.list&lt;/code>に&lt;code>non-free&lt;/code>リポジトリを追加します。&lt;/p>
&lt;p>今回はリポジトリの追加に&lt;code>apt-add-repository&lt;/code>コマンドを使用します(sources.listを自分で直接編集する方法もある)。&lt;/p>
&lt;p>&lt;code>apt-add-repository&lt;/code>コマンドを使用するには&lt;code>software-properties-common&lt;/code>パッケージが必要です。&lt;/p>
&lt;p>以下のコマンドを実行して、&lt;code>software-properties-common&lt;/code>パッケージをインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ apt install -y software-properties-common
&lt;/code>&lt;/pre>&lt;p>※上記コマンドの-yオプションについて、以下apt-getのmanpageより抜粋&lt;/p>
&lt;blockquote>
&lt;p>-y, &amp;ndash;yes, &amp;ndash;assume-yes&lt;/p>
&lt;p>Automatic yes to prompts; assume &amp;ldquo;yes&amp;rdquo; as answer to all prompts and run non-interactively.&lt;/p>
&lt;p>If an undesirable situation, such as changing a held package, trying to install an unauthenticated package or removing an essential package occurs then apt-get will abort.&lt;/p></description></item><item><title>【Linux】SSH公開鍵認証方式の設定手順</title><link>https://ama-blog.com/11/</link><pubDate>Thu, 19 May 2022 15:42:32 +0900</pubDate><guid>https://ama-blog.com/11/</guid><description>&lt;h2 id="1-はじめに">1. はじめに&lt;/h2>
&lt;p>本稿では、クライアントからSSHでLinuxサーバーに接続する手順を解説します。&lt;/p>
&lt;p>リモートのサーバーにローカルPCのSSHクライアントで公開鍵認証方式を使ってログインできるようにします。&lt;/p>
&lt;h2 id="2-実行環境">2. 実行環境&lt;/h2>
&lt;ul>
&lt;li>【SSHクライアント】macOS Monterey：12.3.1&lt;/li>
&lt;li>【SSHサーバー】Debian GNU/Linux 11 (bullseye)&lt;/li>
&lt;/ul>
&lt;h2 id="3-手順">3. 手順&lt;/h2>
&lt;p>以下の手順で進めていきます。&lt;/p>
&lt;ol>
&lt;li>SSHのインストール&lt;/li>
&lt;li>パスワード認証方式での設定&lt;/li>
&lt;li>公開鍵認証方式での設定&lt;/li>
&lt;li>セキュリティ設定&lt;/li>
&lt;li>追加設定&lt;/li>
&lt;/ol>
&lt;h3 id="3-1-sshのインストール">3-1. SSHのインストール&lt;/h3>
&lt;p>サーバー側で以下のコマンドを実行して、OpenSSHをインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code># apt install -y ssh
&lt;/code>&lt;/pre>&lt;h3 id="3-2-パスワード認証方式での設定">3-2. パスワード認証方式での設定&lt;/h3>
&lt;p>公開鍵認証方式の設定を行うために、一時的にパスワード認証方式でログインできるように設定します。&lt;/p>
&lt;p>サーバー側で以下のコマンドを実行して、設定ファイル(&lt;code>/etc/ssh/sshd_config&lt;/code>)のバックアップを取ります。&lt;/p>
&lt;pre tabindex="0">&lt;code># cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bk
&lt;/code>&lt;/pre>&lt;p>&lt;code>/etc/ssh/sshd_config&lt;/code>のパスワード認証の項目を以下に変更します。&lt;/p>
&lt;pre tabindex="0">&lt;code>PasswordAuthentication yes
&lt;/code>&lt;/pre>&lt;p>&lt;strong>※その他の項目は後で設定します。&lt;/strong>&lt;/p>
&lt;p>SSHサーバーを再起動して設定を反映させます。&lt;/p>
&lt;pre tabindex="0">&lt;code># systemctl restart ssh
&lt;/code>&lt;/pre>&lt;p>クライアント側で以下のコマンドを実行して、パスワード認証方式でSSHサーバーにログインできることを確認します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ ssh &amp;lt;ユーザ名&amp;gt;@&amp;lt;SSHサーバーのIPアドレス&amp;gt;
&lt;/code>&lt;/pre>&lt;h3 id="3-3-公開鍵認証方式での設定">3-3. 公開鍵認証方式での設定&lt;/h3>
&lt;p>次に公開鍵認証方式の設定を行います。&lt;/p>
&lt;h4 id="3-3-1-キーペアの生成">3-3-1. キーペアの生成&lt;/h4>
&lt;p>クライアント側で以下のコマンドを実行して、公開鍵と秘密鍵のキーペアを作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ ssh-keygen -t ed25519
&lt;/code>&lt;/pre>&lt;p>公開鍵：&lt;code>~/.ssh/id_ed25519.pub&lt;/code>&lt;/p>
&lt;p>秘密鍵：&lt;code>~/.ssh/id_ed25519&lt;/code>&lt;/p>
&lt;p>&lt;strong>※秘密鍵は絶対に流出させてはいけません。&lt;/strong>&lt;/p>
&lt;h4 id="3-3-2-公開鍵の登録">3-3-2. 公開鍵の登録&lt;/h4>
&lt;p>次に、サーバー側に公開鍵を登録します。&lt;/p>
&lt;p>&lt;code>ssh-copy-id&lt;/code>を使って公開鍵の登録を行います。&lt;/p>
&lt;p>クライアント側で以下のコマンドを実行し、&lt;code>ssh-copy-id&lt;/code>をインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ brew install ssh-copy-id
&lt;/code>&lt;/pre>&lt;p>クライアント側で以下のコマンドを実行し、サーバー側に公開鍵を登録します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ ssh-copy-id -i ~/.ssh/id_ed25519.pub &amp;lt;ユーザ名&amp;gt;@&amp;lt;SSHサーバーのIPアドレス&amp;gt;
&lt;/code>&lt;/pre>&lt;p>ssh-copy-idコマンドがやってくれたことを手動で行う場合は、以下のようになります。&lt;/p></description></item><item><title>【Rails/MySQL】RailsでMySQLを使う方法</title><link>https://ama-blog.com/10/</link><pubDate>Sun, 08 May 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/10/</guid><description>&lt;h2 id="1-はじめに">1. はじめに&lt;/h2>
&lt;p>Railsではデフォルトのデータベースにsqlite3を使用しています。&lt;/p>
&lt;p>今回はRailsアプリケーションのデータベースでMySQLを使用する方法を紹介します。&lt;/p>
&lt;h2 id="2-開発環境">2. 開発環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey：12.3.1&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;li>Bundler：2.3.12&lt;/li>
&lt;li>Ruby on Rails：6.1.5&lt;/li>
&lt;li>MySQL：8.0.28&lt;/li>
&lt;/ul>
&lt;h2 id="3-手順">3. 手順&lt;/h2>
&lt;h3 id="3-1-mysqlのインストールとセキュリティ設定">3-1. MySQLのインストールとセキュリティ設定&lt;/h3>
&lt;p>まずは、MySQLのインストールとセキュリティの設定を行います。&lt;/p>
&lt;p>&lt;a href="https://ama-blog.com/6/">MySQLをHomebrewでインストールしてセキュリティ設定を行う | あまブログ&lt;/a>&lt;/p>
&lt;h3 id="3-2-mysqlのユーザー作成">3-2. MySQLのユーザー作成&lt;/h3>
&lt;p>次にMySQLの開発用ユーザーを作成します。&lt;/p>
&lt;p>rootユーザーでログインします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ mysql -u root -p
&lt;/code>&lt;/pre>&lt;p>ユーザーの作成します。&lt;/p>
&lt;pre tabindex="0">&lt;code>mysql&amp;gt; CREATE USER &amp;#39;newuser&amp;#39;@&amp;#39;localhost&amp;#39; IDENTIFIED BY &amp;#39;password&amp;#39;;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;a href="https://dev.mysql.com/doc/refman/8.0/ja/create-user.html">MySQL 8.0 リファレンスマニュアル_CREATE USER ステートメント&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>ユーザーが作成されたことを確認します。&lt;/p>
&lt;pre tabindex="0">&lt;code>mysql&amp;gt; SELECT User,Host FROM mysql.user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| newuser | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
&lt;/code>&lt;/pre>&lt;p>権限の付与します。&lt;/p></description></item><item><title>【Rails/MySQL】bundle installでgem mysql2がインストールできない時の解決法</title><link>https://ama-blog.com/9/</link><pubDate>Sat, 07 May 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/9/</guid><description>&lt;h2 id="1-開発環境">1. 開発環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey：12.3.1&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;li>Ruby on Rails：6.1.5&lt;/li>
&lt;li>Bundler：2.3.12&lt;/li>
&lt;li>MySQL：8.0.28(Homebrew3.4.10でインストール)&lt;/li>
&lt;/ul>
&lt;h2 id="2-エラー時の状況">2. エラー時の状況&lt;/h2>
&lt;ol>
&lt;li>RailsでMySQLを使うために&lt;code>rails new &amp;lt;app&amp;gt; -d mysql&lt;/code>を実行&lt;/li>
&lt;li>bundle installの所でエラーが発生(mysql2のインストールに失敗していた)&lt;/li>
&lt;/ol>
&lt;h2 id="3-エラーログ">3. エラーログ&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>$ rails new &amp;lt;appname&amp;gt; -d mysql
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>省略
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> run bundle install
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching gem metadata from https://rubygems.org/...........
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Resolving dependencies....
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>省略
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> current directory: /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/mysql2-0.5.3/ext/mysql2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/Users/kazunoko/.rbenv/versions/3.1.0/bin/ruby -I /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0 -r ./siteconf20220503-1924-xwtu0t.rb extconf.rb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> rb_absint_size&lt;span style="color:#f92672">()&lt;/span>... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> rb_absint_singlebit_p&lt;span style="color:#f92672">()&lt;/span>... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> rb_wait_for_single_fd&lt;span style="color:#f92672">()&lt;/span>... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>-----
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Using mysql_config at /usr/local/bin/mysql_config
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>-----
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> errmsg.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SSL_MODE_DISABLED in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SSL_MODE_PREFERRED in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SSL_MODE_REQUIRED in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SSL_MODE_VERIFY_CA in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SSL_MODE_VERIFY_IDENTITY in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> MYSQL.net.vio in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> MYSQL.net.pvio in mysql.h... no
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> SERVER_QUERY_WAS_SLOW in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>checking &lt;span style="color:#66d9ef">for&lt;/span> my_bool in mysql.h... no
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>-----
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Don&lt;span style="color:#e6db74">&amp;#39;t know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">-----
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">-----
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">Setting libpath to /usr/local/Cellar/mysql/8.0.28_1/lib
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">-----
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">creating Makefile
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">current directory: /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/mysql2-0.5.3/ext/mysql2
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">make DESTDIR\= clean
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">current directory: /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/mysql2-0.5.3/ext/mysql2
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">make DESTDIR\=
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">compiling client.c
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">client.c:178:24: warning: &amp;#39;&lt;/span>rbimpl_tainted_str_new_cstr&lt;span style="color:#e6db74">&amp;#39; is deprecated: taintedness turned out to be a wrong idea. [-Wdeprecated-declarations]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> VALUE rb_sql_state = rb_tainted_str_new2(mysql_sqlstate(wrapper-&amp;gt;client));
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/intern/string.h:1742:29: note: expanded from macro &amp;#39;&lt;/span>rb_tainted_str_new2&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">#define rb_tainted_str_new2 rb_tainted_str_new_cstr /**&amp;lt; @old{rb_tainted_str_new_cstr} */
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/intern/string.h:1615:7: note: expanded from macro &amp;#39;&lt;/span>rb_tainted_str_new_cstr&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> rbimpl_tainted_str_new_cstr : \
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/intern/string.h:1401:1: note: &amp;#39;&lt;/span>rbimpl_tainted_str_new_cstr&lt;span style="color:#e6db74">&amp;#39; has been explicitly marked deprecated here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">RBIMPL_ATTR_DEPRECATED((&amp;#34;taintedness turned out to be a wrong idea.&amp;#34;))
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/attr/deprecated.h:36:53: note: expanded from macro &amp;#39;&lt;/span>RBIMPL_ATTR_DEPRECATED&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"># define RBIMPL_ATTR_DEPRECATED(msg) __attribute__((__deprecated__ msg))
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">client.c:787:14: warning: incompatible pointer types passing &amp;#39;&lt;/span>VALUE &lt;span style="color:#f92672">(&lt;/span>void *&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39; (aka &amp;#39;&lt;/span>unsigned long &lt;span style="color:#f92672">(&lt;/span>void *&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39;) to parameter of type &amp;#39;&lt;/span>VALUE &lt;span style="color:#f92672">(&lt;/span>*&lt;span style="color:#f92672">)(&lt;/span>VALUE&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39; (aka &amp;#39;&lt;/span>unsigned long &lt;span style="color:#f92672">(&lt;/span>*&lt;span style="color:#f92672">)(&lt;/span>unsigned long&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">[-Wincompatible-pointer-types]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> rb_rescue2(do_send_query, (VALUE)&amp;amp;args, disconnect_and_raise, self, rb_eException, (VALUE)0);
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^~~~~~~~~~~~~
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/iterator.h:388:26: note: passing argument to parameter &amp;#39;&lt;/span>b_proc&lt;span style="color:#e6db74">&amp;#39; here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">VALUE rb_rescue2(VALUE (*b_proc)(VALUE), VALUE data1, VALUE (*r_proc)(VALUE, VALUE), VALUE data2, ...);
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">client.c:795:16: warning: incompatible pointer types passing &amp;#39;&lt;/span>VALUE &lt;span style="color:#f92672">(&lt;/span>void *&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39; (aka &amp;#39;&lt;/span>unsigned long &lt;span style="color:#f92672">(&lt;/span>void *&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39;) to parameter of type &amp;#39;&lt;/span>VALUE &lt;span style="color:#f92672">(&lt;/span>*&lt;span style="color:#f92672">)(&lt;/span>VALUE&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39; (aka &amp;#39;&lt;/span>unsigned long &lt;span style="color:#f92672">(&lt;/span>*&lt;span style="color:#f92672">)(&lt;/span>unsigned long&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">[-Wincompatible-pointer-types]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> rb_rescue2(do_query, (VALUE)&amp;amp;async_args, disconnect_and_raise, self, rb_eException, (VALUE)0);
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^~~~~~~~
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/iterator.h:388:26: note: passing argument to parameter &amp;#39;&lt;/span>b_proc&lt;span style="color:#e6db74">&amp;#39; here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">VALUE rb_rescue2(VALUE (*b_proc)(VALUE), VALUE data1, VALUE (*r_proc)(VALUE, VALUE), VALUE data2, ...);
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">3 warnings generated.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">compiling infile.c
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">compiling mysql2_ext.c
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">compiling result.c
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">compiling statement.c
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">statement.c:49:24: warning: &amp;#39;&lt;/span>rbimpl_tainted_str_new_cstr&lt;span style="color:#e6db74">&amp;#39; is deprecated: taintedness turned out to be a wrong idea. [-Wdeprecated-declarations]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> VALUE rb_sql_state = rb_tainted_str_new2(mysql_stmt_sqlstate(stmt_wrapper-&amp;gt;stmt));
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/intern/string.h:1742:29: note: expanded from macro &amp;#39;&lt;/span>rb_tainted_str_new2&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">#define rb_tainted_str_new2 rb_tainted_str_new_cstr /**&amp;lt; @old{rb_tainted_str_new_cstr} */
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/intern/string.h:1615:7: note: expanded from macro &amp;#39;&lt;/span>rb_tainted_str_new_cstr&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> rbimpl_tainted_str_new_cstr : \
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/intern/string.h:1401:1: note: &amp;#39;&lt;/span>rbimpl_tainted_str_new_cstr&lt;span style="color:#e6db74">&amp;#39; has been explicitly marked deprecated here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">RBIMPL_ATTR_DEPRECATED((&amp;#34;taintedness turned out to be a wrong idea.&amp;#34;))
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">/Users/kazunoko/.rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/attr/deprecated.h:36:53: note: expanded from macro &amp;#39;&lt;/span>RBIMPL_ATTR_DEPRECATED&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"># define RBIMPL_ATTR_DEPRECATED(msg) __attribute__((__deprecated__ msg))
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> ^
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">1 warning generated.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">linking shared-object mysql2/mysql2.bundle
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">ld: library not found for -lssl
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">clang: error: linker command failed with exit code 1 (use -v to see invocation)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">make: *** [mysql2.bundle] Error 1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">make failed, exit code 2
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">Gem files will remain installed in /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/mysql2-0.5.3 for inspection.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">Results logged to /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/extensions/x86_64-darwin-21/3.1.0/mysql2-0.5.3/gem_make.out
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:95:in `run&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:44:in &lt;span style="color:#e6db74">`&lt;/span>block in make&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:36:in `each&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:36:in &lt;span style="color:#e6db74">`&lt;/span>make&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/ext_conf_builder.rb:63:in `block in build&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/tempfile.rb:317:in &lt;span style="color:#e6db74">`&lt;/span>open&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/ext_conf_builder.rb:26:in `build&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:161:in &lt;span style="color:#e6db74">`&lt;/span>build_extension&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:195:in `block in build_extensions&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:192:in &lt;span style="color:#e6db74">`&lt;/span>each&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:192:in `build_extensions&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/3.1.0/rubygems/installer.rb:847:in &lt;span style="color:#e6db74">`&lt;/span>build_extensions&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/rubygems_gem_installer.rb:71:in `build_extensions&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/rubygems_gem_installer.rb:28:in &lt;span style="color:#e6db74">`&lt;/span>install&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/source/rubygems.rb:204:in `install&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/installer/gem_installer.rb:54:in &lt;span style="color:#e6db74">`&lt;/span>install&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/installer/gem_installer.rb:16:in `install_from_spec&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/installer/parallel_installer.rb:186:in &lt;span style="color:#e6db74">`&lt;/span>do_install&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/installer/parallel_installer.rb:177:in `block in worker_pool&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/worker.rb:62:in &lt;span style="color:#e6db74">`&lt;/span>apply_func&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/worker.rb:57:in `block in process_queue&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/worker.rb:54:in &lt;span style="color:#e6db74">`&lt;/span>loop&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/worker.rb:54:in `process_queue&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /Users/kazunoko/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bundler-2.3.12/lib/bundler/worker.rb:91:in &lt;span style="color:#e6db74">`&lt;/span>block &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span> levels&lt;span style="color:#f92672">)&lt;/span> in create_threads&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">In Gemfile:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> mysql2
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> run bundle binstubs bundler
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">Could not find gem &amp;#39;&lt;/span>mysql2 &lt;span style="color:#f92672">(&lt;/span>~&amp;gt; 0.5&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#e6db74">&amp;#39; in locally installed gems.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> rails webpacker:install
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">Could not find gem &amp;#39;&lt;/span>mysql2 &lt;span style="color:#f92672">(&lt;/span>~&amp;gt; 0.5&lt;span style="color:#f92672">)&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#39;&lt;/span> in locally installed gems.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Run &lt;span style="color:#e6db74">`&lt;/span>bundle install&lt;span style="color:#e6db74">`&lt;/span> to install missing gems.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-エラーの原因と思しき箇所">4. エラーの原因と思しき箇所&lt;/h2>
&lt;pre tabindex="0">&lt;code>ld: library not found for -lssl
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>opensslのパスが見つからないと言っている
&lt;ul>
&lt;li>gemのmysql2はopensslが必須であり、bundleのビルド時にopensslのパスを設定する必要がある&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>macに標準でopenssl入ってなかったっけ？
&lt;ul>
&lt;li>mac OS High SierraからデフォルトのOpenSSLが&lt;a href="https://www.libressl.org/">LibreSSL&lt;/a>に変わった&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="5-解決法">5. 解決法&lt;/h2>
&lt;p>&lt;code>bundle config&lt;/code>でbundlerの設定ファイルにopensslのパスを設定して、&lt;code>bundle install&lt;/code>で再度mysql2をインストールする&lt;/p></description></item><item><title>【Rails/MySQL】dotenv-railsを使ってデータベースの認証情報を環境変数で管理する</title><link>https://ama-blog.com/8/</link><pubDate>Thu, 05 May 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/8/</guid><description>&lt;p>RailsにMySQLを導入する際に、パスワードを&lt;code>database.yml&lt;/code>に直接書くのはいかがなものかと思い、他の方法を調べた結果、&lt;code>dotenv-rails&lt;/code>を使って認証情報を環境変数で管理できることがわかりました。&lt;/p>
&lt;p>今回は作成済みのRailsアプリケーションにdotenv-railsを導入する手順を紹介します。&lt;/p>
&lt;h2 id="1-開発環境">1. 開発環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey：12.3.1&lt;/li>
&lt;li>Ruby：3.1.0&lt;/li>
&lt;li>Ruby on Rails：6.1.5&lt;/li>
&lt;li>dotenv-rails：2.7.6&lt;/li>
&lt;li>MySQL：8.0.28&lt;/li>
&lt;/ul>
&lt;h2 id="2-dotenv-railsとは">2. dotenv-railsとは&lt;/h2>
&lt;ul>
&lt;li>認証情報などを環境変数で管理するためのgem&lt;/li>
&lt;li>起動時にプロジェクトのルートディレクトリにある&lt;code>.env&lt;/code>を読み込み、環境変数&lt;code>ENV&lt;/code>に設定する&lt;/li>
&lt;li>&lt;a href="https://github.com/bkeepers/dotenv">dotenv-rails公式レポジトリ&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="3-手順">3. 手順&lt;/h2>
&lt;h3 id="3-1-dotenv-railsのインストール">3-1. dotenv-railsのインストール&lt;/h3>
&lt;p>&lt;code>Gemfile&lt;/code>に以下を追記します。&lt;/p>
&lt;pre tabindex="0">&lt;code>gem &amp;#39;dotenv-rails&amp;#39;
&lt;/code>&lt;/pre>&lt;p>&lt;code>dotenv-rails&lt;/code>をインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ bundle install
&lt;/code>&lt;/pre>&lt;h3 id="3-2-databaseymlの修正">3-2. database.ymlの修正&lt;/h3>
&lt;p>&lt;code>database.yml&lt;/code>を以下のように修正します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">default&lt;/span>: &lt;span style="color:#75715e">&amp;amp;default&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">adapter&lt;/span>: &lt;span style="color:#ae81ff">mysql2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">encoding&lt;/span>: &lt;span style="color:#ae81ff">utf8mb4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">pool&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV.fetch(&amp;#34;RAILS_MAX_THREADS&amp;#34;) { 5 } %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">username&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEFAULT_USER&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">password&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEFAULT_PASSWORD&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">host&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEFAULT_HOST&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">socket&lt;/span>: &lt;span style="color:#ae81ff">/tmp/mysql.sock&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">development&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span>: &lt;span style="color:#75715e">*default&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">database&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEV_NAME&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">test&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span>: &lt;span style="color:#75715e">*default&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">database&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_TEST_NAME&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>&amp;lt;&amp;lt;: *default&lt;/code>で一番上のdefaultの設定が呼び出されています。&lt;/p>
&lt;p>こうやって書いたのと同じ↓&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">development&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">adapter&lt;/span>: &lt;span style="color:#ae81ff">mysql2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">encoding&lt;/span>: &lt;span style="color:#ae81ff">utf8mb4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">pool&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV.fetch(&amp;#34;RAILS_MAX_THREADS&amp;#34;) { 5 } %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">username&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEFAULT_USER&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">password&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEFAULT_PASSWORD&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">host&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEFAULT_HOST&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">socket&lt;/span>: &lt;span style="color:#ae81ff">/tmp/mysql.sock&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">database&lt;/span>: &lt;span style="color:#ae81ff">&amp;lt;%= ENV[&amp;#39;DATABASE_DEV_NAME&amp;#39;] %&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-3-envの作成">3-3. .envの作成&lt;/h3>
&lt;p>アプリケーションのルートディレクトリ配下に、&lt;code>.env&lt;/code>を作成します。&lt;/p></description></item><item><title>【無料】プログラミング質問サイトまとめ【日本・海外】</title><link>https://ama-blog.com/7/</link><pubDate>Wed, 04 May 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/7/</guid><description>&lt;p>本稿では、エンジニア向けの技術系Q&amp;amp;Aサイトを紹介します。&lt;/p>
&lt;h2 id="1-日本">1. 日本&lt;/h2>
&lt;h3 id="1-1-teratailテラテイル">1-1. teratail(テラテイル)&lt;/h3>
&lt;p>&lt;a href="https://teratail.com/">teratail【テラテイル】｜ITエンジニア特化型Q&amp;amp;Aサイト&lt;/a>&lt;/p>
&lt;ul>
&lt;li>投稿した質問・回答の削除は原則不可(&lt;a href="https://teratail.com/help/delete-policy">teratail 投稿の削除ポリシー&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h3 id="1-2-qiitaキータ">1-2. Qiita(キータ)&lt;/h3>
&lt;p>&lt;a href="https://qiita.com/">Qiita&lt;/a>&lt;/p>
&lt;ul>
&lt;li>「投稿する」&amp;gt;「質問」&amp;gt;「フォーマットを選択」&amp;gt;「Q&amp;amp;A」&lt;/li>
&lt;/ul>
&lt;h3 id="1-3-スタックオーバーフロー">1-3. スタック・オーバーフロー&lt;/h3>
&lt;p>&lt;a href="https://ja.stackoverflow.com/">スタック・オーバーフロー&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://stackoverflow.com/">Stack Overflow&lt;/a>の日本語版&lt;/li>
&lt;li>&lt;a href="https://ja.meta.stackoverflow.com/">スタック・オーバーフローMeta&lt;/a>(スタック・オーバーフローについてのQ&amp;amp;Aサイト)&lt;/li>
&lt;/ul>
&lt;h3 id="1-4-クォーラ">1-4. クォーラ&lt;/h3>
&lt;p>&lt;a href="https://jp.quora.com/">Quora - 知識を共有し合い、世界を知ろう&lt;/a>&lt;/p>
&lt;ul>
&lt;li>技術系じゃない質問もある&lt;/li>
&lt;/ul>
&lt;h2 id="2-海外">2. 海外&lt;/h2>
&lt;h3 id="2-1-stack-overflow">2-1. Stack Overflow&lt;/h3>
&lt;p>&lt;a href="https://stackoverflow.com/">Stack Overflow&lt;/a>&lt;/p>
&lt;ul>
&lt;li>日本語版とアカウントは共通&lt;/li>
&lt;/ul>
&lt;h3 id="2-2-stack-exchange">2-2. Stack Exchange&lt;/h3>
&lt;p>&lt;a href="https://stackexchange.com/sites">All Sites - Stack Exchange&lt;/a>&lt;/p>
&lt;ul>
&lt;li>技術系じゃない質問もある&lt;/li>
&lt;/ul>
&lt;h3 id="2-3-code-project">2-3. Code Project&lt;/h3>
&lt;p>&lt;a href="https://www.codeproject.com/">Code Project&lt;/a>&lt;/p>
&lt;h3 id="2-4-code-ranch">2-4. Code Ranch&lt;/h3>
&lt;p>&lt;a href="https://coderanch.com/">Coderanch, a friendly place for programming greenhorns!&lt;/a>&lt;/p>
&lt;h3 id="2-5-reddit">2-5. Reddit&lt;/h3>
&lt;p>&lt;a href="https://www.reddit.com/">Reddit - ソーシャルの新たな中心地&lt;/a>&lt;/p>
&lt;ul>
&lt;li>技術系じゃない質問もある&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://aspiringcoders.com/alternatives-of-stack-overflow/">Top 11 Alternatives of Stack Overflow&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Comparison_of_Q%26A_sites">Comparison of Q&amp;amp;A sites&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.hyuki.com/writing/techask.html">技術系メーリングリストで質問するときのパターン・ランゲージ_結城浩&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>MySQLをHomebrewでインストールしてセキュリティ設定を行う</title><link>https://ama-blog.com/6/</link><pubDate>Tue, 03 May 2022 23:38:43 +0900</pubDate><guid>https://ama-blog.com/6/</guid><description>&lt;p>本稿ではMySQLのインストールからセキュリティ設定までの手順を解説します。&lt;/p>
&lt;h2 id="1-開発環境">1. 開発環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey バージョン12.3.1&lt;/li>
&lt;li>Homebrew 3.4.10&lt;/li>
&lt;li>MySQL 8.0.28&lt;/li>
&lt;/ul>
&lt;h2 id="2-手順">2. 手順&lt;/h2>
&lt;h3 id="2-1-mysqlのインストール">2-1. MySQLのインストール&lt;/h3>
&lt;p>&lt;a href="https://brew.sh/index_ja">Homebrew&lt;/a>でMySQLをインストールします。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ brew install mysql
&lt;/code>&lt;/pre>&lt;p>MySQLがインストールされたことを確認します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ brew info mysql
&lt;/code>&lt;/pre>&lt;p>&lt;a href="https://docs.brew.sh/Manpage#info-abv-options-formulacask-">brew info - Homebrew Documentation&lt;/a>&lt;/p>
&lt;h3 id="2-2-mysqlのセキュリティ設定">2-2. MySQLのセキュリティ設定&lt;/h3>
&lt;p>サーバーを起動します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ mysql.server start
&lt;/code>&lt;/pre>&lt;p>セキュリティ設定を開始します。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ mysql_secure_installation
&lt;/code>&lt;/pre>&lt;p>以下の項目の設定を行います。&lt;/p>
&lt;ul>
&lt;li>VALIDATE PASSWORDプラグインの利用確認&lt;/li>
&lt;li>rootユーザーのパスワード設定&lt;/li>
&lt;li>匿名ユーザーの削除&lt;/li>
&lt;li>リモートからrootユーザでログインできないようにする&lt;/li>
&lt;li>testデータベースの削除&lt;/li>
&lt;li>ユーザーの権限に関するテーブルの再読み込み&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># VALIDATE PASSWORDプラグインの利用確認&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VALIDATE PASSWORD COMPONENT can be used to test passwords
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>省略
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Press y|Y &lt;span style="color:#66d9ef">for&lt;/span> Yes, any other key &lt;span style="color:#66d9ef">for&lt;/span> No:&amp;lt;Enterを押してスキップ&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># rootユーザーのパスワード設定&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please set the password &lt;span style="color:#66d9ef">for&lt;/span> root here.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>New password:&amp;lt;パスワードを入力&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 匿名ユーザーの削除&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>By default, a MySQL installation has an anonymous user,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>省略
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Remove anonymous users? &lt;span style="color:#f92672">(&lt;/span>Press y|Y &lt;span style="color:#66d9ef">for&lt;/span> Yes, any other key &lt;span style="color:#66d9ef">for&lt;/span> No&lt;span style="color:#f92672">)&lt;/span> : &amp;lt;yを入力&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># リモートからrootユーザでログインできないようにする&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Normally, root should only be allowed to connect from
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>省略
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Disallow root login remotely? &lt;span style="color:#f92672">(&lt;/span>Press y|Y &lt;span style="color:#66d9ef">for&lt;/span> Yes, any other key &lt;span style="color:#66d9ef">for&lt;/span> No&lt;span style="color:#f92672">)&lt;/span> :&amp;lt;yを入力&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># testデータベースの削除&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Remove test database and access to it? &lt;span style="color:#f92672">(&lt;/span>Press y|Y &lt;span style="color:#66d9ef">for&lt;/span> Yes, any other key &lt;span style="color:#66d9ef">for&lt;/span> No&lt;span style="color:#f92672">)&lt;/span> :&amp;lt;yを入力&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ユーザーの権限に関するテーブルの再読み込み&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reload privilege tables now? &lt;span style="color:#f92672">(&lt;/span>Press y|Y &lt;span style="color:#66d9ef">for&lt;/span> Yes, any other key &lt;span style="color:#66d9ef">for&lt;/span> No&lt;span style="color:#f92672">)&lt;/span> :&amp;lt;yを入力&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://dev.mysql.com/doc/refman/8.0/ja/mysql-secure-installation.html">MySQL 8.0 リファレンスマニュアル 「mysql_secure_installation」&lt;/a>&lt;/p></description></item><item><title>【IE記法】ER図の書き方</title><link>https://ama-blog.com/5/</link><pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/5/</guid><description>&lt;h2 id="1-ie記法とは">1. IE記法とは&lt;/h2>
&lt;ul>
&lt;li>ER図の記法の一つ&lt;/li>
&lt;li>IE記法と&lt;a href="https://www.idef.com/idef1x-data-modeling-method/">IDEFX1記法&lt;/a>がメジャー&lt;/li>
&lt;li>別名「鳥の足記法」(Crow&amp;rsquo;s Foot Notation)&lt;/li>
&lt;li>明確な規格がない&lt;/li>
&lt;/ul>
&lt;h2 id="2-ie記法で使われる図形">2. IE記法で使われる図形&lt;/h2>
&lt;h3 id="2-1-エンティティ">2-1. エンティティ&lt;/h3>
&lt;ul>
&lt;li>エンティティを長方形(角付)で書く&lt;/li>
&lt;li>エンティティ名を長方形の1段目に書く&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="エンティティ" loading="lazy" src="https://ama-blog.com/5/images/1.png">&lt;/p>
&lt;h3 id="2-2-アトリビュート属性">2-2. アトリビュート(属性)&lt;/h3>
&lt;ul>
&lt;li>属性名を長方形の2段目に書く&lt;/li>
&lt;li>主キーは、属性名の前に&lt;code>*&lt;/code>を書く&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="アトリビュート" loading="lazy" src="https://ama-blog.com/5/images/2.png">&lt;/p>
&lt;h3 id="2-3-リレーションシップ関係">2-3. リレーションシップ(関係)&lt;/h3>
&lt;ul>
&lt;li>リレーションシップを実線で書く&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="リレーションシップ" loading="lazy" src="https://ama-blog.com/5/images/3.png">&lt;/p>
&lt;h3 id="2-4-カーディナリティ多重度">2-4. カーディナリティ(多重度)&lt;/h3>
&lt;ul>
&lt;li>カーディナリティとオプショナリティを書く&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>カーディナリティ(cardinality)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>エンティティから近い方に書く&lt;/li>
&lt;li>関連付くインスタンスの最大数を表す&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="カーディナリティ" loading="lazy" src="https://ama-blog.com/5/images/4.png">&lt;/p>
&lt;p>&lt;strong>オプショナリティ(optionality)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>エンティティから遠い方に書く&lt;/li>
&lt;li>関連付くインスタンスの最小数を表す&lt;/li>
&lt;li>modalityと言ったりもする&lt;/li>
&lt;li>1をmandatory(必須)、0をoptional(任意)と呼ぶ&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="オプショナリティ" loading="lazy" src="https://ama-blog.com/5/images/5.png">&lt;/p>
&lt;p>&lt;strong>カーディナリティとオプショナリティ&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>組み合わせ&lt;/th>
&lt;th>オプショナリティ&lt;/th>
&lt;th>カーディナリティ&lt;/th>
&lt;th>Aインスタンス1つに対するBインスタンスの数&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>(1)&lt;/td>
&lt;td>1&lt;/td>
&lt;td>1&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>(2)&lt;/td>
&lt;td>0&lt;/td>
&lt;td>1&lt;/td>
&lt;td>0または1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>(3)&lt;/td>
&lt;td>1&lt;/td>
&lt;td>多&lt;/td>
&lt;td>1以上&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>(4)&lt;/td>
&lt;td>0&lt;/td>
&lt;td>多&lt;/td>
&lt;td>0以上&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;img alt="カーディナリティとオプショナリティ" loading="lazy" src="https://ama-blog.com/5/images/6.png">&lt;/p>
&lt;h2 id="3-ie記法で書いたer図">3. IE記法で書いたER図&lt;/h2>
&lt;h3 id="3-1-1対1">3-1. 1対1&lt;/h3>
&lt;p>&lt;img alt="1対1" loading="lazy" src="https://ama-blog.com/5/images/7.png">&lt;/p>
&lt;h3 id="3-2-1対多">3-2. 1対多&lt;/h3>
&lt;p>&lt;img alt="1対多" loading="lazy" src="https://ama-blog.com/5/images/8.png">&lt;/p>
&lt;h3 id="3-3-多対多">3-3. 多対多&lt;/h3>
&lt;p>&lt;img alt="多対多" loading="lazy" src="https://ama-blog.com/5/images/9.png">&lt;/p></description></item><item><title>【Linuxコマンド】grep・egrep・fgrepの違い</title><link>https://ama-blog.com/4/</link><pubDate>Wed, 27 Apr 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/4/</guid><description>&lt;p>本稿では、Linuxのgrep・egrep・fgrepコマンドの違いを解説します。&lt;/p>
&lt;ul>
&lt;li>grep
&lt;ul>
&lt;li>パターンを基本正規表現(BRE：Basic Regular Expression)として扱う&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>egrep
&lt;ul>
&lt;li>パターンを拡張正規表現(ERE:Extended Regular Expression)として扱う&lt;/li>
&lt;li>grep -Eと同じ&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>fgrep
&lt;ul>
&lt;li>パターンを固定文字列として扱うため、文字列をそのまま検索できる(正規表現を認識しない)&lt;/li>
&lt;li>grep -Fと同じ&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>以下のファイルを使用してそれぞれのコマンドの違いを見ていきます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>$ cat check_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">(&lt;/span>f|g&lt;span style="color:#f92672">)&lt;/span>ile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#39;\(f\|g\)ile&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="1-grep">1. grep&lt;/h2>
&lt;p>grepで使われるBRE(基本正規表現)では&lt;code>{&lt;/code>,&lt;code>}&lt;/code>,&lt;code>(&lt;/code>,&lt;code>)&lt;/code>,&lt;code>|&lt;/code>,&lt;code>+&lt;/code>,&lt;code>?&lt;/code>を通常の文字列として扱います。&lt;/p>
&lt;p>そのため、これらのメタ文字をちゃんとメタ文字として扱うには逆にエスケープが必要です。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>$ grep -C &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#e6db74">&amp;#39;(f|g)ile&amp;#39;&lt;/span> check_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">(&lt;/span>f|g&lt;span style="color:#f92672">)&lt;/span>ile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ grep -C &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#e6db74">&amp;#39;\(f\|g\)ile&amp;#39;&lt;/span> check_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>file
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>1つ目の検索のように&lt;code>(&lt;/code>,&lt;code>|&lt;/code>,&lt;code>)&lt;/code>をエスケープしない場合、BREはこれらのメタ文字を通常の文字列として扱うため、&lt;code>(f|g)ile&lt;/code>という文字列を検索します。&lt;/p>
&lt;p>2つ目の検索のように&lt;code>(&lt;/code>,&lt;code>|&lt;/code>,&lt;code>)&lt;/code>をエスケープすると、BREはこれらをメタ文字として扱うため、メタ文字の意味通りに&lt;code>file&lt;/code>または&lt;code>gile&lt;/code>という文字列を検索します。&lt;/p>
&lt;h2 id="2-egrep">2. egrep&lt;/h2>
&lt;p>egrepで使われるERE(拡張正規表現)ではメタ文字をそのままメタ文字として扱うため、正規表現を使った検索に向いています。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>$ egrep -C &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#e6db74">&amp;#39;(f|g)ile&amp;#39;&lt;/span> check_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ egrep -C &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#e6db74">&amp;#39;\(f\|g\)ile&amp;#39;&lt;/span> check_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">(&lt;/span>f|g&lt;span style="color:#f92672">)&lt;/span>ile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>1つ目の検索のように&lt;code>(&lt;/code>,&lt;code>|&lt;/code>,&lt;code>)&lt;/code>をエスケープしない場合、EREはメタ文字の意味通りに&lt;code>file&lt;/code>または&lt;code>gile&lt;/code>という文字列を検索します。&lt;/p>
&lt;p>2つ目の検索のように&lt;code>(&lt;/code>,&lt;code>|&lt;/code>,&lt;code>)&lt;/code>をエスケープすると、EREはこれらのメタ文字を通常の文字列として扱うため、&lt;code>(f|g)ile&lt;/code>という文字列を検索します。&lt;/p>
&lt;h2 id="3-fgrep">3. fgrep&lt;/h2>
&lt;p>fgrepはメタ文字を認識しないため、直接文字列を検索するのに向いています。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-zsh" data-lang="zsh">&lt;span style="display:flex;">&lt;span>$ fgrep -C &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#e6db74">&amp;#39;(f|g)ile&amp;#39;&lt;/span> check_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">(&lt;/span>f|g&lt;span style="color:#f92672">)&lt;/span>ile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ fgrep -C &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#e6db74">&amp;#39;\(f\|g\)ile&amp;#39;&lt;/span> check_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#39;\(f\|g\)ile&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>1つ目の検索では、fgrepはメタ文字を通常の文字列として扱うため、&lt;code>(f|g)ile&lt;/code>という文字列を検索します。&lt;/p>
&lt;p>2つ目の検索では、fgrepは&lt;code>\&lt;/code>も通常の文字列として扱うため、&lt;code>\(f\|g\)ile&lt;/code>という文字列を検索します。&lt;/p>
&lt;hr>
&lt;p>【参考】&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.tecmint.com/difference-between-grep-egrep-and-fgrep-in-linux/">What’s Difference Between Grep, Egrep and Fgrep in Linux?&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://linuxjm.osdn.jp/html/GNU_grep/man1/grep.1.html">Man Page of grep&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://azisava.sakura.ne.jp/programming/0016.html">Linuxのコマンドで使われる正規表現の違い&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【MySQL】ERROR 1064 (42000)→構文ミスが見つからない→予約語が原因かも</title><link>https://ama-blog.com/3/</link><pubDate>Fri, 08 Apr 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/3/</guid><description>&lt;p>MySQLで構文は絶対正しいはずなのに、ERROR 1064 (42000)が出た時の話です。&lt;/p>
&lt;ul>
&lt;li>解決法
&lt;ul>
&lt;li>予約語をバッククォートで囲む&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="1-error-1064-42000について">1. ERROR 1064 (42000)について&lt;/h2>
&lt;p>ERROR 1064 (42000)は構文エラーです。
以下のようなエラーメッセージが出力されます。&lt;/p>
&lt;pre tabindex="0">&lt;code>ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near [入力したSQL文の一部] at line 1
&lt;/code>&lt;/pre>&lt;p>解決法としては、基本的にはドキュメントと自分が書いたSQLを見比べて、構文ミスを見つけるだけなんですが&amp;hellip;&lt;/p>
&lt;p>&lt;a href="https://dev.mysql.com/doc/refman/8.0/ja/sql-statements.html">MySQL 8.0 リファレンスマニュアル(SQLステートメント)&lt;/a>&lt;/p>
&lt;h2 id="2-構文ミスが見つからない予約語が原因かも">2. 構文ミスが見つからない→予約語が原因かも&lt;/h2>
&lt;h3 id="2-1-エラー発生">2-1. エラー発生&lt;/h3>
&lt;p>以下のSQL文でERROR1064(42000)の構文エラーが発生しました。&lt;/p>
&lt;pre tabindex="0">&lt;code>mysql&amp;gt; CREATE TABLE order (id INT);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &amp;#39;order (id INT)&amp;#39; at line 1
&lt;/code>&lt;/pre>&lt;h3 id="2-2-解決法">2-2. 解決法&lt;/h3>
&lt;p>予約語である「order」をバッククォートで囲むことでエラーが解消されました。&lt;/p></description></item><item><title>Alfredのブックマーク検索機能の使い方</title><link>https://ama-blog.com/2/</link><pubDate>Mon, 28 Feb 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/2/</guid><description>&lt;p>本稿では、macOS用ランチャーアプリAlfredの「ブックマーク検索機能」について、設定方法や使い方を解説していきます。&lt;/p>
&lt;h2 id="1-環境">1. 環境&lt;/h2>
&lt;ul>
&lt;li>macOS Monterey バージョン12.2.1&lt;/li>
&lt;li>Alfred 4.6.3&lt;/li>
&lt;/ul>
&lt;h2 id="2-ブックマーク検索機能とは">2. ブックマーク検索機能とは&lt;/h2>
&lt;p>Alfredの便利な機能の一つに「ブックマーク検索機能」があります。&lt;/p>
&lt;p>ブックマークの名前・URL・フォルダ名で検索して、ブックマークしたサイトを開くことができます。&lt;/p>
&lt;p>これまではブックマークしたサイトを開くには、以下の3ステップが必要でした。&lt;/p>
&lt;ol>
&lt;li>ブラウザを開く&lt;/li>
&lt;li>ブックマークを選択&lt;/li>
&lt;li>サイトが表示される&lt;/li>
&lt;/ol>
&lt;p>これが、Alfredの「ブックマーク検索機能」を使うと以下のようになります。&lt;/p>
&lt;ol>
&lt;li>Alfredで検索&lt;/li>
&lt;li>サイトが表示される&lt;/li>
&lt;/ol>
&lt;p>たったの2ステップでブックマークしたサイトを開くことができます。&lt;/p>
&lt;p>また、階層構造になったブックマークフォルダの場合も、見たいサイトを一発で開くことができます。&lt;/p>
&lt;h2 id="3-設定方法">3. 設定方法&lt;/h2>
&lt;p>設定方法は「Alfredの設定」と「Macの設定」に分かれます。&lt;/p>
&lt;h3 id="3-1-alfredの設定">3-1. Alfredの設定&lt;/h3>
&lt;p>まずはAlfredの「Web Bookmarks」の設定を行います。&lt;/p>
&lt;h4 id="3-1-1-alfred-preferencesを開く">3-1-1. Alfred Preferencesを開く&lt;/h4>
&lt;p>Alfredを起動した状態で、デスクトップ上部のメニューバーからAlfredのアイコンを選択し、「Preferences&amp;hellip;」をクリックしてAlfred Preferencesを開きます。&lt;/p>
&lt;p>&lt;img alt="Alfred Preferences" loading="lazy" src="https://ama-blog.com/2/images/1.png">&lt;/p>
&lt;h4 id="3-1-2-web-bookmarksを設定する">3-1-2. Web Bookmarksを設定する&lt;/h4>
&lt;p>Alfred Preferencesの「Features」→「Web Bookmarks」から各項目の設定を行います。&lt;/p>
&lt;p>&lt;img alt="Web Bookmarks" loading="lazy" src="https://ama-blog.com/2/images/2.png">&lt;/p>
&lt;h5 id="sources">Sources&lt;/h5>
&lt;p>ブックマークの検索対象とするブラウザを設定する項目です。&lt;/p>
&lt;ul>
&lt;li>SafariとChromeで登録したブックマーク(またはどちらか一方のブックマークのみ)を検索対象に選択できます。&lt;/li>
&lt;li>Chromeの場合は、選択したユーザーで登録したブックマークのみが検索対象になります。&lt;/li>
&lt;/ul>
&lt;h5 id="show-bookmarks">Show bookmarks&lt;/h5>
&lt;p>ブックマーク検索時のプレフィックスを設定する項目です。&lt;/p>
&lt;ul>
&lt;li>プレフィックスを指定して検索することで、検索結果にブックマークのみを表示することができます。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【実行例:ブックマークの「PhotoshopVIP」を検索】&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>プレフィックスを設定していない場合(「in default results」)&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="Show bookmarks no prefix" loading="lazy" src="https://ama-blog.com/2/images/3.png">&lt;/p>
&lt;p>&lt;strong>→PhotoshopVIPだけでなく、Photoshopアプリも検索結果に表示されてしまう。&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>プレフィックスを設定した場合(「via keyward」で「bm」を設定)&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="Show bookmarks with prefix" loading="lazy" src="https://ama-blog.com/2/images/4.png">&lt;/p>
&lt;p>&lt;strong>→PhotoshopVIPだけが表示される&lt;/strong>&lt;/p>
&lt;h5 id="open-bookmarks">Open Bookmarks&lt;/h5>
&lt;p>ブックマークを表示するブラウザを設定する項目です。&lt;/p></description></item><item><title>MacBookでシェルをbashやzshに切り替える方法</title><link>https://ama-blog.com/1/</link><pubDate>Tue, 01 Feb 2022 00:00:00 +0000</pubDate><guid>https://ama-blog.com/1/</guid><description>&lt;p>macOS Catalinaからデフォルトのシェルがbashからzshに変わりました。&lt;/p>
&lt;p>「zshに変更したい」「bashに戻したい」などシェルを切り替えたい時があると思います。&lt;/p>
&lt;p>本稿では、MacBookでシェルを切り替える方法を紹介します。&lt;/p>
&lt;h2 id="1現在使用中のシェルの確認">1.現在使用中のシェルの確認&lt;/h2>
&lt;pre tabindex="0">&lt;code>% echo $SHELL
/bin/zsh
&lt;/code>&lt;/pre>&lt;h2 id="2使用可能なシェル一覧の確認">2.使用可能なシェル一覧の確認&lt;/h2>
&lt;pre tabindex="0">&lt;code>% cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
&lt;/code>&lt;/pre>&lt;h2 id="3シェルの変更">3.シェルの変更&lt;/h2>
&lt;pre tabindex="0">&lt;code>% chsh -s /bin/bash
Changing shell for username.
Password for username:
&lt;/code>&lt;/pre>&lt;p>ユーザーのパスワードを入力します。&lt;/p>
&lt;p>ターミナル再起動後、シェルが切り替わります。&lt;/p>
&lt;h3 id="エラーの場合">エラーの場合&lt;/h3>
&lt;p>&lt;code>chsh: no changes made&lt;/code>のエラーが出た場合は以下の手順でシェルを変更します。&lt;/p>
&lt;ol>
&lt;li>「システム環境設定」&lt;/li>
&lt;li>「ユーザとグループ」&lt;/li>
&lt;li>左下の鍵アイコンをクリックしてロック解除&lt;/li>
&lt;li>現在のユーザを右クリックして「詳細オプション」&lt;/li>
&lt;li>「ログインシェル」を変更&lt;/li>
&lt;/ol>
&lt;h2 id="4設定ファイルの読み込み">4.設定ファイルの読み込み&lt;/h2>
&lt;pre tabindex="0">&lt;code>$ cat .zshrc &amp;gt;&amp;gt; .bashrc
$ source ~/.bashrc
&lt;/code>&lt;/pre>&lt;p>これで設定ファイルの内容が反映されます。&lt;/p></description></item></channel></rss>