tag:crieit.net,2005:https://crieit.net/tags/Git/feed 「Git」の記事 - Crieit Crieitでタグ「Git」に投稿された最近の記事 2023-02-01T00:00:20+09:00 https://crieit.net/tags/Git/feed tag:crieit.net,2005:PublicArticle/18380 2023-01-31T23:59:28+09:00 2023-02-01T00:00:20+09:00 https://crieit.net/posts/Git-OneDrive Git と OneDrive 等のクラウドストレージを併用する <p>ブログに書きたいネタとか雑多なメモを管理する際、Git によるバージョン管理と、クラウドストレージによる同期を併用したくなる。</p> <p>具体的には、こんなことがしたい:</p> <ul> <li>コミットに至らないメモ書きの段階では、クラウドストレージで同期させたい <ul> <li>ついでにそのメモ書きは、タブレット等の複数の端末から更新したい</li> </ul></li> <li>ブログで記事を公開してからの差分を Git で管理</li> </ul> <p>プライベートのリモートリポジトリ代わりに、ベアリポジトリを OneDrive に共有する話は見たことある (<a target="_blank" rel="nofollow noopener" href="https://www.mussyu1204.com/wordpress/it/?p=249">これ</a> とか <a target="_blank" rel="nofollow noopener" href="https://note.com/ume_white/n/n825adeb8e04d">これ</a>) のだが、私がやりたいこととはちょっと違うんだよな。<br /> そもそも、 Microsoft 買収後に GitHub で無制限にプライベートリポジトリ作れるようになったので、 Git リポジトリの共有自体は GitHub とかで良いので。</p> <p>以前、ローカルリポジトリをまるごと OneDrive で共有させてみたのだが、複数の端末で編集すると同期の競合が発生しまくってしまった。<br /> 特に <code>.\.git</code> ディレクトリ内でコンフリクトすると後処理が面倒くさすぎる。</p> <p>どうにかならんもんか。</p> <h2><code>.\.git</code> ディレクトリだけ同期除外</h2> <p>先に答えを言ってしまうと、クラウドストレージでの同期で特定のディレクトリの同期を除外させれば良い。</p> <p><code>.\.git</code> ディレクトリ内のコンフリクトが面倒なら、 <code>.\.git</code> ディレクトリだけ同期を除外させればいじゃない… という精神だ。</p> <p>ただ、 OneDrive では一筋縄ではいかなかったので、少々トリッキーな方法を採っている。</p> <p>そのやり方を、 Windows 上の OneDrive を例に紹介する。</p> <h3 id="1つ目の端末"><a href="#1%E3%81%A4%E7%9B%AE%E3%81%AE%E7%AB%AF%E6%9C%AB">1つ目の端末</a></h3> <p>既に OneDrive で管理しているフォルダを、 Git 管理させる方法。</p> <ol> <li>同期させたいディレクトリのルート直下に <code>.\.git</code> フォルダを手動で新規作成する<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-01.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-01.png" alt="" /></a></li> <li>OneDrive の設定から、 アカウント → フォルダの選択 から、 <code>.\.git</code> フォルダーを同期の対象外にする<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-02.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-02-244x300.png" alt="" /></a> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-03.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-03-300x272.png" alt="" /></a> <ul> <li>ローカルから <code>.\.git</code> フォルダが消える</li> </ul></li> <li><code>git init</code> する <ul> <li><code>.\.git</code> 隠しフォルダが再作成される</li> </ul></li> <li>適当に Git のコミットしたり、 remote の追加・プッシュしたりする</li> </ol> <p>この結果、 Git のリポジトリやステージングのデータを除く、ワーキングツリーのファイルだけをクラウドストレージで同期できる。</p> <p>難点なのが、 OneDrive 上で「同期の問題」として以下のエラーが出続けることだ。<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-04.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-04.png" alt="" /></a></p> <blockquote> <p>この名前のファイルまたはフォルダーが、同じ場所にあります。<br /> 両方のバージョンを残すには、この PCまたはオンラインのどちらかでこのアイテムの名前を変更してください。両方のアイテムが同じ場合は、この PCにあるバージョンを削除するとオンラインのバージョンをダウンロードできます。</p> </blockquote> <p>なお、エラーが出ていても同期はされる。</p> <h3 id="2つ目の端末"><a href="#2%E3%81%A4%E7%9B%AE%E3%81%AE%E7%AB%AF%E6%9C%AB">2つ目の端末</a></h3> <p>上記と同様、 OneDrive でワーキングツリーを同期させつつ、 <code>.\.git</code> ディレクトリは同期させないフォルダを、別のマシンに構築する方法。</p> <ol> <li>一旦、対象ディレクトリを「このデバイス上で常に保持する」を実行して、ファイルをローカルにおいておく</li> <li>OneDrive の設定から、 アカウント → フォルダの選択 から、 <code>.\.git</code> フォルダーを同期の対象外にする <ul> <li>1つ目の端末の設定で、既に空の <code>.\.git</code> フォルダが存在しているはず</li> <li>設定後ローカルから <code>.\.git</code> フォルダが消える</li> </ul></li> <li>同期を一時停止</li> <li><p>clone の替わりに fetch と reset を使い、ワーキングツリーはそのままリポジトリだけ更新する</p> <pre><code class="shell">$ git init $ git remote add origin [email protected]:username/reponame.git $ git fetch origin master $ git reset origin/master </code></pre></li> <li><p>同期を再開させる</p></li> </ol> <h2 id="リポジトリの同期"><a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%90%8C%E6%9C%9F">リポジトリの同期</a></h2> <p>片方で push した後もう一方で pull しようとしても、先に OneDrive の同期によってワーキングツリーのファイルが更新されてしまっているので、 pull がエラーになってしまう。</p> <p>こればかりはどうしようもないので、2つ目の端末のセットアップと同様、以下のように <strong>ワークツリーを維持したまま、</strong> リポジトリとステージングを (<code>--mixed</code> オプション相当で) リセットしてやれば良い。</p> <pre><code>$ git fetch origin master $ git reset origin/master </code></pre> <p>こんな感じで、期待していた環境が整った。</p> <p>Android からは Jota+ あたりを使って OneDrive 上のファイルを直接更新したりしながら活用している。</p> <h2 id="【参考】: OneDrive で特定のファイル名パターンのファイルをアップロードから除外する方法"><a href="#%E3%80%90%E5%8F%82%E8%80%83%E3%80%91%3A+OneDrive+%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95">【参考】: OneDrive で特定のファイル名パターンのファイルをアップロードから除外する方法</a></h2> <p>ちなみに、グループポリシーやレジストリをいじることで、「特定の種類のファイルをアップロードから除外」する事ができる (<a target="_blank" rel="nofollow noopener" href="https://learn.microsoft.com/ja-jp/sharepoint/use-group-policy#exclude-specific-kinds-of-files-from-being-uploaded">OneDrive ポリシーを使用して同期設定を制御する - SharePoint in Microsoft 365 | Microsoft Learn</a>)。<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-05.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-05.png" alt="" /></a></p> <p>が、残念ながらフォルダに対してはこの機能が働かないので、上記の用途を満たさない。</p> <p>参考までに、やり方だけ下記に示しておく。</p> <h3 id="レジストリを弄る場合:"><a href="#%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%82%92%E5%BC%84%E3%82%8B%E5%A0%B4%E5%90%88%3A">レジストリを弄る場合:</a></h3> <ol> <li><code>HKLM\SOFTWARE\Policies\Microsoft\OneDrive\</code> の下に <code>EnableODIgnoreListFromGPO</code> というキーを作る<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-06.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-06.png" alt="" /></a></li> <li>その中に「除外したいファイル名」を名前と値の両方に持った、文字列値(複数可)を入れる</li> <li>PC を再起動する</li> </ol> <h3 id="グループポリシーを使う場合:"><a href="#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88%3A">グループポリシーを使う場合:</a></h3> <ol> <li>「グループ ポリシーの編集」を使える状態にする <ul> <li>Windows の Pro エディション以上なら標準では言っている。 Home エディションなら、ググって調べて。</li> </ul></li> <li><code>C:\Users\N2633\AppData\Local\Microsoft\OneDrive\<ビルド番号>\adm\</code> 内の以下のファイルをコピーする <ul> <li><code>.\OneDrive.admx</code> を <code>C:\Windows\PolicyDefinitions\</code> へ</li> <li><code>.\ja\OneDrive.adml</code> <code>を C:\Windows\PolicyDefinitions\ja-JP\</code> へ</li> </ul></li> <li>Win+R で <code>gpedit.msc</code> を入力し「ローカル グループ ポリシー エディター」を立ち上げる</li> <li>[コンピューターの構成] → [管理用テンプレート] → [OneDrive] → [特定の種類のファイルをアップロードから除外] を選択</li> <li>構成を有効にして、キーワード一覧に除外したいファイル名(アスタリスク可)を設定する</li> </ol> advanceboy tag:crieit.net,2005:PublicArticle/18184 2022-05-04T05:16:16+09:00 2022-05-15T23:54:05+09:00 https://crieit.net/posts/Docker-Kubernetes-gitLab DockerとKubernetes <h1 id="0 前提"><a href="#0+%E5%89%8D%E6%8F%90">0 前提</a></h1> <p>Oracle LinuxとWindows</p> <h1 id="1 環境構築"><a href="#1+%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">1 環境構築</a></h1> <p>準備</p> <h2 id="1-1 Dockerオフラインインストール"><a href="#1-1+Docker%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1-1 Dockerオフラインインストール</a></h2> <p>参考にしたURLは<code>https://qiita.com/kod314/items/e574ac12c23598e0d903</code>。<br /> オンラインインストールの場合は、<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/kichise/items/f8e56c6d2d08eaf4a6a0">https://qiita.com/kichise/items/f8e56c6d2d08eaf4a6a0</a><br /> の手順に従えば可能。</p> <p>今回はオフラインインストールを実行しようと思う。社内規則によりDockerをインストールするサーバがインターネット接続できない場合がある。その場合、インターネット接続できる自席端末からネットに接続してDockerのインストーラーをダウンロード。それをDockerをインストールしたいサーバに転送して実行させる。</p> <h3 id="1-1-1 OS確認"><a href="#1-1-1+OS%E7%A2%BA%E8%AA%8D">1-1-1 OS確認</a></h3> <p>まずはOSのversionを確認。</p> <pre><code>$ uname -a Linux publicpc1 5.4.17-2136.305.5.3.el8uek.x86_64 #2 SMP Thu Mar 17 10:45:33 PDT 2022 x86_64 x86_64 x86_64 GNU/Linux </code></pre> <p>より詳細</p> <pre><code>#cat /etc/os-release NAME="Oracle Linux Server" VERSION="8.5" ID="ol" ID_LIKE="fedora" VARIANT="Server" VARIANT_ID="server" VERSION_ID="8.5" PLATFORM_ID="platform:el8" PRETTY_NAME="Oracle Linux Server 8.5" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:oracle:linux:8:5:server" HOME_URL="https://linux.oracle.com/" BUG_REPORT_URL="https://bugzilla.oracle.com/" ORACLE_BUGZILLA_PRODUCT="Oracle Linux 8" ORACLE_BUGZILLA_PRODUCT_VERSION=8.5 ORACLE_SUPPORT_PRODUCT="Oracle Linux" ORACLE_SUPPORT_PRODUCT_VERSION=8.5 </code></pre> <p>Linuxカーネルの確認</p> <pre><code>$ hostnamectl Static hostname: publicpc1 Icon name: computer-vm Chassis: vm Machine ID: 4c3dc5bfa43b47b8b66789ce778a0711 Boot ID: 226a196eedc746e2848a6f15e9afeb0b Virtualization: kvm Operating System: Oracle Linux Server 8.5 CPE OS Name: cpe:/o:oracle:linux:8:5:server Kernel: Linux 5.4.17-2136.305.5.3.el8uek.x86_64 Architecture: x86-64 </code></pre> <p>x86_64と記載されているので、Intel(AMD)の64bitオペレーティングシステムであることがわかる。</p> <h3 id="1-1-2 Docker engineをインストール"><a href="#1-1-2+Docker+engine%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1-1-2 Docker engineをインストール</a></h3> <p>Docker本体であるDocker Engineと、同時に複数のコンテナを操作するツールであるDocker Composeをダウンロードする。<br /> 参考にした公式:https://docs.docker.com/engine/install/binaries/</p> <p>まずはdocker本体<br /> <a target="_blank" rel="nofollow noopener" href="https://download.docker.com/linux/static/stable/x86_64/">https://download.docker.com/linux/static/stable/x86_64/</a><br /> →バージョンがいろいろあるので、最新のdocker-20.10.9.tgz をダウンロードしてみた。<br /> 自分の端末(クライアント側にダウンロードしたファイルをLinuxサーバに転送してから解凍する。</p> <pre><code>$ ls -al /home/opc/docker-20.10.9.tgz -rw-r--r--. 1 opc opc 63350495 May 4 04:23 /home/opc/docker-20.10.9.tgz </code></pre> <p>展開</p> <pre><code>$ tar zxvf docker-20.10.9.tgz </code></pre> <p>すると、カレントディレクトリにdockerディレクトリが作成される。<br /> dockerディレクトリの中身を<code>/usr/bin/</code>配下にコピーする。</p> <pre><code>$ sudo cp docker/* /usr/bin/ </code></pre> <p>試しに起動するには</p> <pre><code>$ sudo dockerd & </code></pre> <h3 id="1-1-3 Docker Composeをインストール"><a href="#1-1-3+Docker+Compose%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1-1-3 Docker Composeをインストール</a></h3> <p>続いてはdocker-compose<br /> インストール手順は以下に記載されているので以降この指示に従う。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/docker/compose/blob/v2/README.md">https://github.com/docker/compose/blob/v2/README.md</a></p> <p>さきほど(1-1-1節)でOSとCPUを確認したので、<br /> それに従って<code>docker-compose-linux-x86_64</code>をダウンロードする。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/docker/compose/releases">https://github.com/docker/compose/releases</a></p> <p>自分のwindows端末(クライアント側)にダウンロードした<code>docker-compose-linux-x86_64</code>をdockerをインストールしたLinuxサーバに転送。<br /> 転送したら、バイナリファイルの名前を<code>docker-compose</code>にリネーム。</p> <pre><code>$ mv docker-compose-linux-x86_64 docker-compose </code></pre> <p>docker-composeをいどうする。移動する先は目的に応じて移動先が異なる。<br /> 今回は</p> <pre><code>$ sudo mv docker-compose /usr/local/bin/ $ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose -v Docker Compose version v2.5.0 </code></pre> <h3 id="1-1-4 Docker イメージのオフラインで利用する"><a href="#1-1-4+Docker+%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B">1-1-4 Docker イメージのオフラインで利用する</a></h3> <pre><code>$ tar zxvf helloworld_img.tar.gz $ docker load < helloworld_img # dockerイメージをload $ docker images # hello-worldイメージが存在することを確認 </code></pre> <h3 id="1-1-5 Dockerグループ作成"><a href="#1-1-5+Docker%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E4%BD%9C%E6%88%90">1-1-5 Dockerグループ作成</a></h3> <p>Docker daemonはrootユーザで実行しなければならず、毎回sudoを使うのは面倒である。<br /> その場合、dockerグループを作成してそこに任意のユーザを所属させてあげる。</p> <pre><code>groupadd docker usermod -aG docker opc </code></pre> <h3 id="1-1-6 トラブルシュート"><a href="#1-1-6+%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%88">1-1-6 トラブルシュート</a></h3> <p>docklerをサービスでenebleにしようと思ったができなかった。</p> <pre><code>[root@publicpc1 system]# systemctl enable docker Failed to enable unit: Unit file docker.service does not exist. </code></pre> <p>以下のサイトを参考に対応してみた。<br /> <a target="_blank" rel="nofollow noopener" href="https://jhooq.com/docker-daemon-centos/">https://jhooq.com/docker-daemon-centos/</a></p> <p>/usr/lib/systemd/system配下にdocker.socketファイルを作成し以下の内容を記載した。</p> <pre><code>[Unit] Description=Docker Socket for the API [Socket] ListenStream=/var/run/docker.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target </code></pre> <p>続いて、/usr/lib/systemd/system/配下に<code>docker.service</code>を作成する。</p> <pre><code>[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service containerd.service Wants=network-online.target Requires=docker.socket containerd.service [Service] Type=notify #the default is not to use systemd for cgroups because the delegate issues still #exists and systemd currently does not support the cgroup feature set required #for containers run by docker ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always #Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229. #Both the old, and new location are accepted by systemd 229 and up, so using the old location #to make them work for either version of systemd. StartLimitBurst=3 #Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230. #Both the old, and new name are accepted by systemd 230 and up, so using the old name to make #this option work for either version of systemd. StartLimitInterval=60s #Having non-zero Limit*s causes performance problems due to accounting overhead #in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity #Comment TasksMax if your systemd version does not support it. #Only systemd 226 and above support this option. TasksMax=infinity #set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes #kill only the docker process, not all processes in the cgroup KillMode=process OOMScoreAdjust=-500 [Install] WantedBy=multi-user.target </code></pre> <p>この中身をみると<code>Requires=docker.socket containerd.service</code>と記載されている通り、containerd.serviceが必要。なので/usr/lib/systemd/system配下にcontainerd.serviceサービスを作成する必要がある。</p> <pre><code>#Copyright The containerd Authors. #Licensed under the Apache License, Version 2.0 (the "License"); #you may not use this file except in compliance with the License. #You may obtain a copy of the License at #http://www.apache.org/licenses/LICENSE-2.0 #Unless required by applicable law or agreed to in writing, software #distributed under the License is distributed on an "AS IS" BASIS, #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #See the License for the specific language governing permissions and #limitations under the License. [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 #Having non-zero Limit*s causes performance problems due to accounting overhead #in the kernel. We recommend using cgroups to do container-local accounting. LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=infinity #Comment TasksMax if your systemd version does not supports it. #Only systemd 226 and above support this version. TasksMax=infinity OOMScoreAdjust=-999 [Install] WantedBy=multi-user.target </code></pre> <p>上記を作成する。</p> <p>ちゃんとリロードしとく。</p> <pre><code>systemctl daemon-reload </code></pre> <h2 id="1-2.Kubernetesの準備"><a href="#1-2.Kubernetes%E3%81%AE%E6%BA%96%E5%82%99">1-2.Kubernetesの準備</a></h2> <h3 id="1-2-1. インストール"><a href="#1-2-1.+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1-2-1. インストール</a></h3> <p>オフライン環境でKubernetesを構築する手順。<br /> 手順の参考にしたのは以下<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.genesys.com/Documentation/GCXI/latest/Dep/DockerOffline">https://docs.genesys.com/Documentation/GCXI/latest/Dep/DockerOffline</a></p> <p>まずはネットにつながる端末から</p> <pre><code>$ pwd /etc/yum.repos.d $ cat kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg </code></pre> <p>以下のコマンドを実行してファイルをダウンロード。<br /> <code><your_rpm_dir></code>の部分は自分で適当なディレクトリを作成して<br /> そこのパスを指定。</p> <pre><code>yumdownloader --assumeyes --destdir= --resolve yum-utils kubeadm-1.21.* kubelet-1.21.* kubectl-1.21.* ebtables </code></pre> <p>続いて、ダウンロードしたファイルをインストールしていく。</p> <pre><code>yum install -y --cacheonly --disablerepo=* /*.rpm </code></pre> <p>インストールする際、バージョンが異なるファイルが存在してインストールエラーになるかもしれない。<br /> その場合は、必要のないバージョンのファイルは削除してから<br /> 再度インストールするとうまくいく。<br /> うまくいくと以下のようになる。</p> <pre><code>Complete! </code></pre> <p>必要なイメージが揃っているか確認してみよう。</p> <pre><code>$ kubeadm config images list I0504 23:15:36.977910 309762 version.go:254] remote version is much newer: v1.24.0; falling back to: stable-1.21 k8s.gcr.io/kube-apiserver:v1.21.12 k8s.gcr.io/kube-controller-manager:v1.21.12 k8s.gcr.io/kube-scheduler:v1.21.12 k8s.gcr.io/kube-proxy:v1.21.12 k8s.gcr.io/pause:3.4.1 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns/coredns:v1.8.0 </code></pre> <h3 id="1-2-2. kubectlの概要"><a href="#1-2-2.+kubectl%E3%81%AE%E6%A6%82%E8%A6%81">1-2-2. kubectlの概要</a></h3> <p>参考URL:https://kubernetes.io/ja/docs/reference/kubectl/_print/<br /> Kubernetesクラスタを操作するコマンド</p> <h1 id="2.Docker入門"><a href="#2.Docker%E5%85%A5%E9%96%80">2.Docker入門</a></h1> kawai_mizugorou tag:crieit.net,2005:PublicArticle/17846 2021-12-12T12:39:24+09:00 2021-12-12T12:39:24+09:00 https://crieit.net/posts/git-checkout-only-one-file-by-other-branch-20211212 Git で別ブランチから特定のファイルのみチェックアウトする <p>Git で別ブランチから特定のファイルのみチェックアウトする方法を知ったので試しました。なお、 Git は <code>2.33.1.windows.1</code> で試しました。</p> <p>今回は Ambergrease で。該当プロジェクトは <code>main</code>ブランチ と MySQL のバージョンを 8.0 から 5.7 に落とした <code>mysql5.7</code>ブランチ が存在するため、うってつけの条件でした。</p> <h2 id="別ブランチのファイルを参照"><a href="#%E5%88%A5%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%82%E7%85%A7">別ブランチのファイルを参照</a></h2> <pre><code class="bash">> git show main:workspace/entrypoint_web.sh #!/bin/bash # gen key & certificate openssl req -new -newkey rsa:2048 -nodes -out /etc/ssl/private/server.csr -keyout /etc/ssl/private/server.key -subj "/C=/ST=/L=/O=/OU=/CN=*.lvh.me" openssl x509 -days 365 -req -signkey /etc/ssl/private/server.key -in /etc/ssl/private/server.csr -out /etc/ssl/private/server.crt # 略 </code></pre> <p><code>mysql5.7</code>ブランチ で <code>main</code>ブランチ の <code>workspace/entrypoint_web.sh</code> を参照。OKです。</p> <h2 id="別ブランチから特定のファイルをチェックアウト"><a href="#%E5%88%A5%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%8B%E3%82%89%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%A2%E3%82%A6%E3%83%88">別ブランチから特定のファイルをチェックアウト</a></h2> <p>試しに、 WP-CLI のインストールの条件分岐を <code>main</code>ブランチ には入れているが <code>mysql5.7</code>ブランチ には入れていない状態のリポジトリを作ります。</p> <p>このリポジトリで <code>mysql5.7</code>ブランチ に移動し、次のコマンドを実行。</p> <pre><code class="bash">> git checkout main -- workspace/entrypoint_web.sh > </code></pre> <p>これで <code>main</code>ブランチ から WP-CLI のインストールの条件分岐の部分が入ったエントリポイントのシェルスクリプトが <code>mysql5.7</code>ブランチ にチェックアウトされ、上書き&ステージングまでされました。</p> <p><a href="https://crieit.now.sh/upload_images/f52ae4e02e0bd2373a29cdf955808ef561b20b02456ed.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f52ae4e02e0bd2373a29cdf955808ef561b20b02456ed.jpg?mw=700" alt="mainブランチ から WP-CLI のインストールの条件分岐の部分が入ったエントリポイントのシェルスクリプトが mysql5.7ブランチ にチェックアウトされ、上書き&ステージングまでされた" /></a></p> <p>今回のケースではWebサーバ側は共通なのでバッティングも気にせず、そのままコミットで大丈夫なケースです。こういう場合は便利ですね。</p> <h2 id="別ブランチから特定のファイルをチェックアウト (コンフリクト想定)"><a href="#%E5%88%A5%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%8B%E3%82%89%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%A2%E3%82%A6%E3%83%88+%28%E3%82%B3%E3%83%B3%E3%83%95%E3%83%AA%E3%82%AF%E3%83%88%E6%83%B3%E5%AE%9A%29">別ブランチから特定のファイルをチェックアウト (コンフリクト想定)</a></h2> <p>次に、DB側のエントリポイントで一ヶ所修正をします。</p> <p>修正内容は該当リポジトリでは「 MySQL のログを削除せずにコンテナを再度ビルドすると、ログの最初の初期パスワードを拾ってしまうため、 <code>root</code> のパスワード置換処理でコケることを回避するために最後の結果を使用するように <code>awk</code> コマンドを修正」というもの。</p> <p>先程とは逆に <code>mysql5.7</code>ブランチ で先に修正を施します。</p> <pre><code>- DB_INIT_PASSWORD=$(sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk '{print $11}') + DB_INIT_PASSWORD=$(sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk 'END{print $11}') </code></pre> <p><code>awk</code> に <code>END</code> を追加しています。</p> <p>一方、 MySQL8.0 環境用の <code>main</code>ブランチ では該当箇所は次のようになっています。</p> <pre><code> DB_INIT_PASSWORD=$(sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk '{print $13}') </code></pre> <p>ログの出力フォーマットが変わった結果、空白区切りで11番目ではなく13番目に初期パスワードが出現します。そのため、 <code>awk</code> の中身が <code>{print $11}</code> ではなく <code>{print $13}</code> 指定になっています。</p> <p>この状態で、先程と同じようにチェックアウトのコマンドを実行。</p> <pre><code class="bash">> git checkout mysql5.7 -- workspace/entrypoint_db.sh </code></pre> <p>すると、次のようになりました。</p> <pre><code>- DB_INIT_PASSWORD=$(sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk '{print $13}') + DB_INIT_PASSWORD=$(sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk 'END{print $11}') </code></pre> <p>完全に <code>mysql5.7</code>ブランチ の内容で上書きされていますね。どうやら、そのままだと上書きしてしまうようです。</p> <p><a href="https://crieit.now.sh/upload_images/cf3469dc4fe3a0750f8e422ca2874ee461b20b3ee1424.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cf3469dc4fe3a0750f8e422ca2874ee461b20b3ee1424.jpg?mw=700" alt="完全に mysql5.7ブランチ の内容で上書きされていますね。どうやら、そのままだと上書きしてしまう模様" /></a></p> <p>こういうケースでは注意するか、コンフリクトと同じような状態を起こすオプションがあったりするのでしょうか(未確認)。</p> <p>とはいえ、先程の共通部分をチェックアウトできるだけでも便利なので、覚えておいて損はなさそうです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://t-cr.jp/memo/1a817a9f72658927a">Gitで別ブランチから特定のファイルやディレクトリを取得するコマンド | とあるクリエイターのエンジニアブログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/oret/items/b646fcada9d89ed308c4">Git 1ファイルだけ別のブランチから持ってくる - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tommy_aka_jps/items/07cce1f1759cdc0c1e3c">[git]他ブランチの作業を自分のブランチに持ってくる方法まとめ - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16745 2021-03-13T23:47:53+09:00 2021-03-13T23:47:53+09:00 https://crieit.net/posts/git-authente-information-20210313 Git の認証情報について <p>AskPass.exe のエラー関係の対処の続きです。</p> <p>エラーでフォーカスが外れて入力を邪魔されることはなくなりましたが、一瞬表示されては消えるダイアログが気になるので、追加調査です。</p> <p>相変わらず認証情報で何らかの問題が発生していると考えられるため、認証情報周りの状況を確認します。</p> <p>ます、何によって Git の認証情報が管理されているか確認します。</p> <pre><code class="bash">> git config --list ## 略 credential.helper=manager ## 略 </code></pre> <p>今回は Windows PC なので <code>manager</code> は「Git Credential Manager for Windows」を指すことになります。</p> <p>また、検索すると <code>git config --show-origin --get credential.helper</code> のコマンドから辿っていくこともできます。</p> <pre><code class="bash">> git config --show-origin --get credential.helper file:PATH/TO/Users/<USERNAME>/.gitconfig manager </code></pre> <p>ユーザディレクトリ直下の <code>.gitconfig</code> に情報がある、と出ます。</p> <pre><code class="gitconfig">[credential] helper = manager </code></pre> <p><code>.gitconfig</code> を見ると、こちらも <code>manager</code> になっていることが確認できます。</p> <p>上述より「Git Credential Manager for Windows」であることが分かったので、次にその情報を確認します。</p> <p>「コントロールパネル」→「ユーザーアカウント」→「資格情報の管理」を開き、「Windows 資格情報」をクリックします。</p> <p>この中に Git 関連の資格情報も含まれています。……が、特に怪しい情報はなし。</p> <p>Git の認証情報の管理の仕方は分かりましたが、今回は原因究明には至りませんでした。</p> <h3 id="追記"><a href="#%E8%BF%BD%E8%A8%98">追記</a></h3> <p>その後、 SourceTree で開いているリポジトリを一つずつ調べていった結果、ユーザ名をコピペミスで間違えていたリポジトリを発見しました。</p> <p>これが原因 (開きっ放しにしているリポジトリのリモートリポジトリに該当するユーザ名が SorceTree で管理されていない → AskPass.exe でエラーが多発(or 認証画面ダイアログが表示されては一瞬で消えるを繰り返す)) な気がしてきました。</p> <p>ユーザ名のミスを修正して、またこれで様子見にしたいと思います。</p> <h3 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://dev.classmethod.jp/articles/credential-helper-resolves-codecommit-error/">gitのcredential.helperを理解してCodeCommitの403エラーを回避してみた | DevelopersIO</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.zunouissiki.com/entry/git-credential-manager-for-windows/">「Git Credential Manager for Windows」が何度も聞かれないように認証設定しよう! | 頭脳一式</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16744 2021-03-13T23:39:32+09:00 2021-03-13T23:39:32+09:00 https://crieit.net/posts/askpass-error-from-sourcetree-2-20210306 Askpass.exe の「アプリケーションを正しく起動できませんでした」というエラーへの対処 (アカウント追加編) <p>ある日突然 Askpass.exe から「アプリケーションを正しく起動できませんでした」というエラーが表示されるようになってしまったため対処の2点目。アカウントがいくつか足りないので設定し直します。</p> <p>今回足りないアカウントは GitLab EE のアカウントです。</p> <p>SourceTree の「ツール」→「オプション」→「認証」に進み、「追加」をクリック。</p> <p><a href="https://crieit.now.sh/upload_images/8f0f468564f618e220ce3e7095dfb1576040f5b1c47ab.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8f0f468564f618e220ce3e7095dfb1576040f5b1c47ab.jpg?mw=700" alt="「ホスティングアカウントを設定」ダイアログ" /></a></p> <p>ホスティングアカウントを設定」ダイアログが開いたら、「ホスティングサービス」から「GitLab EE」を選択し、「ホスト URL」を入力します。 Credentials の「認証」は「Personal Access Token」しか選べないのでそのままで、続いて「Personal Access token を再読み込み」をクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/265da3c88157e18cbd6601db8bfa7e976040f5be4830e.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/265da3c88157e18cbd6601db8bfa7e976040f5be4830e.jpg?mw=700" alt="Personal Access Token の認証ダイアログ" /></a></p> <p>すると Personal Access Token の認証ダイアログが開きます。「ユーザー名」は自分のユーザー名を入れます。</p> <p>問題は「パスワード」。これは通常のパスワード<strong>ではなく</strong>、上述の Personal Access Token を入力します。</p> <p>そこで GitLab にログイン。</p> <p>ユーザーのアバターアイコンからメニューを開き、「設定」画面を開きます。続いてサイドバーから「アクセストークン」へ。</p> <p><a href="https://crieit.now.sh/upload_images/6d940822318822e14ffbd44a59b3d63a6040f5c97ec12.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6d940822318822e14ffbd44a59b3d63a6040f5c97ec12.jpg?mw=700" alt="GitLab の Personal Access Token 発行画面" /></a></p> <p>Personal Access Token 発行画面をひらいたら、「Scopes」の中で「api」を選択し、「Create personal access token」ボタンをクリック。</p> <p><a href="https://crieit.now.sh/upload_images/3014fe5f05a74ebaf7de8d2cdbd41bf76040f5d5a6138.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3014fe5f05a74ebaf7de8d2cdbd41bf76040f5d5a6138.jpg?mw=700" alt="発行された GitLab の Personal Access Token" /></a></p> <p>すると、「Your New Personal Access Token」が表示されます。この Personal Access Token はテキストボックスのミュートテキストの通り、この画面でしかアクセスできず、一度他のページに遷移したり閉じたりすると<strong>二度とアクセスできません</strong> ( Revoke して再発行になる)。必ず控えておきましょう。</p> <p><a href="https://crieit.now.sh/upload_images/af153eb91208ad322e0d5943b6e5a4066040f5e003bb8.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/af153eb91208ad322e0d5943b6e5a4066040f5e003bb8.jpg?mw=700" alt="発行された GitLab の Personal Access Token" /></a></p> <p>発行が完了すると、発行画面の下に一覧で表示されます。ご覧の通り「Revoke」しか表示されておらず、先程のページで表示されていたトークンへはアクセスできません。</p> <p>さて、先程の Personal Access Token を開きっ放しにしていた SourceTree の認証ダイアログの「パスワード」にコピペして「OK」をクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/f85f66fe1e5d3ed5213887bf00ab1cbb6040f5eaa86f8.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f85f66fe1e5d3ed5213887bf00ab1cbb6040f5eaa86f8.jpg?mw=700" alt="Personal Access Token が認証された" /></a></p> <p>すると、認証が成功し、「ホスティングアカウントを設定」画面で「✅認証に成功」が表示されるようになります。これでOKです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/TakuyaHara/items/0424e188f5073aa362a5">GitLabアカウントをSourceTreeに登録する方法 - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16717 2021-03-05T00:02:35+09:00 2021-03-05T00:02:35+09:00 https://crieit.net/posts/askpass-error-from-sourcetree-1-20210305 Askpass.exe の「アプリケーションを正しく起動できませんでした」というエラーへの対処 (仮) <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p>ある日突然 Askpass.exe から「アプリケーションを正しく起動できませんでした」というエラーが表示されるようになってしまいました。</p> <p><a href="https://crieit.now.sh/upload_images/9ca7059fe935c4deb754e905c144ef9f6040f34619435.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9ca7059fe935c4deb754e905c144ef9f6040f34619435.jpg?mw=700" alt="Askpass.exe からのエラーダイアログ" /></a></p> <blockquote> <p>Askpass.exe - アプリケーション エラー</p> <p>アプリケーションを正しく起動できませんでした (0xc0000142)。[OK] をクリックしてアプリケーションを閉じてください。</p> </blockquote> <p>しかも一度だけではなく、放置していると同じエラーダイアログが溜まって数~十数回「OK」をクリックするはめになります。</p> <p>発生するタイミングはランダムのように見えるため、文字入力やコーディング中にエラーダイアログが起動して入力を妨げられることも……。</p> <p>さすがに作業しづらいので、対処することにしました。</p> <h2 id="調査"><a href="#%E8%AA%BF%E6%9F%BB">調査</a></h2> <p>検索すると Askpass.exe はどうも SourceTree のコンポーネントで Git で使用する SSH の鍵を管理する部分に関する GUI を担うようです。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://community.atlassian.com/t5/SourceTree-questions/What-is-askpass-exe/qaq-p/134504">Solved: What is askpass.exe?</a></li> </ul> <p>関連する場所としては、 SourceTree の「ツール」→「オプション」→「認証」のところの設定周りでしょうか……。</p> <p>以上より、 SourceTree 周りの環境を整理すると以下の通りです。</p> <ul> <li>OS: Windows 10 環境</li> <li>Git: SourceTree が持っている Git ではなく、システムインストールの Git を使用。バージョンは <code>2.30.0.windows</code> 。</li> <li>SourceTree: <code>3.4.2.0</code></li> </ul> <h2 id="対処1 (失敗)"><a href="#%E5%AF%BE%E5%87%A61+%28%E5%A4%B1%E6%95%97%29">対処1 (失敗)</a></h2> <p>Askpass.exe 自体は Gitクライアント にも類似のファイル (<code>git-askpass.exe</code>) が存在していた (<code>PATH\TO\INSTALLED_DIRECTORY\Git\mingw64\libexec\git-core</code>下)のと、 Git のマイナーバージョンが上がっていたので以下のようにしました。</p> <ul> <li>Gitクライアント本体: 上書きインストールによるアップデート (<code>2.30.0.windows</code> → <code>2.30.0.windows.2</code>)</li> <li>SourceTree: コントロールパネルからアンインストール→再度インストール (<code>3.4.2.0</code>)</li> </ul> <p>が、改善せず。 SourceTree にいたっては設定などの情報が残っていたため、アンインストールで綺麗に消えていたわけでもなさそう……。</p> <h2 id="対処2"><a href="#%E5%AF%BE%E5%87%A62">対処2</a></h2> <p>そこで今度は SourceTree 関連のファイルを削除することにしました。</p> <ol> <li>SourceTree の「ツール」→「オプション」→「認証」で保存されているアカウント情報を手動で全て削除</li> <li>SourceTree を閉じる</li> <li>コントロールパネルから SourceTree をアンインストール</li> <li><code>PATO\TO\Users\<USERNAME>\AppData\Local\Atlassian</code> 配下のファイルを別フォルダにバックアップ</li> <li><code>PATO\TO\Users\<USERNAME>\AppData\Local\Atlassian</code> 配下のファイルを全部削除 (過去バージョンのものも含めて) <ul> <li><a target="_blank" rel="nofollow noopener" href="https://confluence.atlassian.com/sourcetreekb/how-to-wipe-sourcetree-preferences-412484640.html">SourceTree のナレッジベース</a> では個人設定情報をリフレッシュさせるには以下の手順で良いそうですが、今回はきれいさっぱりにしたかったためあえて全部削除しました <ol> <li>SourceTree を閉じる</li> <li><code>PATO\TO\Users\<USERNAME>\AppData\Local\Atlassian\SourceTree\</code> と <code>PATO\TO\Users\<USERNAME>\AppData\Local\Atlassian\SourceTree.exe<ランダム文字列>\<バージョン番号(今回は 3.4.2.0)>\</code> フォルダのファイルをバックアップ</li> <li><code>PATO\TO\Users\<USERNAME>\AppData\Local\Atlassian\SourceTree\</code>下 の以下の3つのファイルを削除 <ul> <li><code>bookmarks.xml</code></li> <li><code>opentabs.xml</code></li> <li><code>userhosts</code></li> </ul></li> <li><code>PATO\TO\Users\<USERNAME>\AppData\Local\Atlassian\SourceTree.exe<ランダム文字列>\<バージョン番号(今回は 3.4.2.0)>\</code>下 の <code>user.config</code> ファイルを削除</li> <li>SourceTree を起動し、正常に動作するか確認する</li> </ol></li> </ul></li> <li>SourceTree を再度インストール <ul> <li>Bitbucket or Bitbucket Server の選択: スキップ</li> <li>オプション: <ul> <li>Mercurial もインストール</li> <li>改行の自動設定: チェックを外す (Git本体 側で LF 統一するようにしているため)</li> <li>ユーザ名・メールアドレス: Git本体に記憶されている情報を使用</li> <li>SSH鍵の読み込み: 「いいえ」でスキップ</li> </ul></li> <li>インストール完了後: 「ツール」→「オプション」→「Git バージョン」で「System」となっていることを確認 (SourceTree 本体で持っている Git ではなく、インストール済みの Git を使用)</li> </ul></li> </ol> <p>これでSourceTree の「ツール」→「オプション」→「認証」を開くと……なぜかいくつかのアカウント情報が記録されていました。おそらく Git 本体に記録されていた情報だと思います詳細は不明……。</p> <p>ただし、全てではないので改めて追加する必要があります。それについては別途設定するということで、ひとまず今回はこれで様子見とします。</p> <h2 id="様子見の結果"><a href="#%E6%A7%98%E5%AD%90%E8%A6%8B%E3%81%AE%E7%B5%90%E6%9E%9C">様子見の結果</a></h2> <p>様子を見ていた結果ですが、冒頭のエラーは表示されなくなりました。</p> <p>代わりに、同じようなタイミングで認証のダイアログが表示されるのですが、一瞬で閉じられるため今のところさほど影響は出ていません。</p> <p>一旦解決、といったところでしょうか。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://community.atlassian.com/t5/SourceTree-questions/What-is-askpass-exe/qaq-p/134504">Solved: What is askpass.exe?</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/BlueTone/items/bbafed96520c99c19d16">SourceTree3.0.6でエラー:Askpass.exe: No such file or directory - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yosida001/items/21365a174facf76f1209">SourceTree 3.0.6にアップデートしたら、リモートからの操作ができなくなったので解決した忘備録 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://confluence.atlassian.com/sourcetreekb/how-to-wipe-sourcetree-preferences-412484640.html">How to Wipe SourceTree Preferences | Sourcetree | Atlassian Documentation</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16422 2020-12-25T00:50:10+09:00 2020-12-25T00:50:10+09:00 https://crieit.net/posts/GitBash-GUI 【GitBash】黒い画面でコミット履歴をGUIっぽく見たい <h1 id="黒い画面のうえでもうちょっと見やすくコミットログが見たい!!!"><a href="#%E9%BB%92%E3%81%84%E7%94%BB%E9%9D%A2%E3%81%AE%E3%81%86%E3%81%88%E3%81%A7%E3%82%82%E3%81%86%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E8%A6%8B%E3%82%84%E3%81%99%E3%81%8F%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%AD%E3%82%B0%E3%81%8C%E8%A6%8B%E3%81%9F%E3%81%84%EF%BC%81%EF%BC%81%EF%BC%81">黒い画面のうえでもうちょっと見やすくコミットログが見たい!!!</a></h1> <p>コマンド上でも、GUIにまけないくらい見やすいログの見方をメモ( ..)φ</p> <p>以下は一般的なもの、枝とかわからないし見づらい。。。<br /> コマンド:<code>git log</code><br /> <a href="https://crieit.now.sh/upload_images/ca1f292da2d67803d3643952d9f97b685fe4b67b81842.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ca1f292da2d67803d3643952d9f97b685fe4b67b81842.png?mw=700" alt="image.png" /></a></p> <h2 id="git log --graph --oneline --decorate"><a href="#git+log+--graph+--oneline+--decorate">git log --graph --oneline --decorate</a></h2> <p><a href="https://crieit.now.sh/upload_images/ca1f292da2d67803d3643952d9f97b685fe4b711b3f55.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ca1f292da2d67803d3643952d9f97b685fe4b711b3f55.png?mw=700" alt="image.png" /></a></p> <p>ちょっとコミット数が少なくてわからないが、樹形図みたく表示できる</p> <p><a target="_blank" rel="nofollow noopener" href="https://startup-git.com/experts/git-log-oneline/">参考リンク</a></p> <h2 id="tig --all"><a href="#tig+--all">tig --all</a></h2> <p><a href="https://crieit.now.sh/upload_images/ca1f292da2d67803d3643952d9f97b685fe4b8138c75e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ca1f292da2d67803d3643952d9f97b685fe4b8138c75e.png?mw=700" alt="image.png" /></a><br /> 何日とかその辺まで表示される。</p> <p>この画面から抜けるときは<code>q</code>を押下すること</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/suino/items/b0dae7e00bd7165f79ea">参考リンク</a></p> ずずまる@ばぶばぶSE tag:crieit.net,2005:PublicArticle/16109 2020-10-04T23:29:37+09:00 2020-10-04T23:44:28+09:00 https://crieit.net/posts/PowerShell-Git-reset-stash PowerShell で Git の reset/stash などを使う際に履歴を指定する方法 <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/gDTuDEwe0dme8qkN">PowerShell で Git の reset/stash などを使う際に履歴を指定する方法 - 雑木林</a></p> <h1 id="TL; DR"><a href="#TL%3B+DR">TL; DR</a></h1> <p>中括弧で表記する文字列は <code>'</code> で囲みましょう。</p> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>みなさんおなじみ、履歴を戻すコマンドは、下記の通りです。</p> <p>gitで履歴を戻すコマンド(実行不可)</p> <pre><code class="powershell">git reset HEAD@{0} </code></pre> <p>また、スタッシュを適用するコマンドは、下記の通りです。</p> <p>gitでスタッシュを適用するコマンド(実行不可)</p> <pre><code class="powershell">git stash pop stash@{0} </code></pre> <p>しかし、 PowerShell で上記を実行しようとすると、次のエラーが発生し、履歴リセット/スタッシュ適用できません。</p> <p>PowerShellで履歴を戻そうとした際のエラー</p> <pre><code class="powershell">error: unknown switch `e' </code></pre> <h1 id="解決策"><a href="#%E8%A7%A3%E6%B1%BA%E7%AD%96">解決策</a></h1> <p>PoserShell では、中括弧に特別な意味があるため(スクリプトブロックと呼ぶらしい)、中括弧内の文字列をコマンドとして実行してしまうからみたいです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_script_blocks?view=powershell-7">about_Script_Blocks - PowerShell | Microsoft Docs</a></p> <p><code>'</code> で囲み文字列化することで、実行できます。</p> <p>gitで履歴を戻すコマンド(文字列化)</p> <pre><code class="powershell">git reset 'HEAD@{0}' </code></pre> <p>gitでスタッシュを適用するコマンド</p> <pre><code class="powershell">git stash pop 'stash@{0}' </code></pre> <p>または、中括弧エスケープ処理をすることでも可能です。<br /> PowerShell のエスケープシーケンスは <code>`</code> ですよね。</p> <p>gitで履歴を戻すコマンド(エスケープ処理)</p> <pre><code class="powershell">git reset HEAD@`{0`} </code></pre> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/dahlbyk/posh-git/issues/106">git reset HEAD@{1} results in error · Issue #106 · dahlbyk/posh-git</a></p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>エラー文だけでは理解できず、地味に苦労しました。<br /> PowerShell は <del>めんどくさい</del> 奥が深いですね。</p> Morichan tag:crieit.net,2005:PublicArticle/16106 2020-10-04T23:25:37+09:00 2020-10-04T23:25:37+09:00 https://crieit.net/posts/Git Gitのコミットメッセージに絵文字付きプレフィックスを適用する <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/boTlOB6zi3hGwNTd">Gitのコミットメッセージに絵文字付きプレフィックスを適用する - 雑木林</a></p> <h1 id="TL; DR"><a href="#TL%3B+DR">TL; DR</a></h1> <p>コミットメッセージのプレフィックスは、Angularスタイルを基準としています。<br /> また、各プレフィックスに絵文字を付ける際は、下記のようにしています。</p> <div class="table-responsive"><table> <thead> <tr> <th>プレフィックス</th> <th align="center">絵文字</th> <th>絵文字の綴り</th> </tr> </thead> <tbody> <tr> <td>feat</td> <td align="center">✨</td> <td>sparkles</td> </tr> <tr> <td>fix</td> <td align="center">🐛</td> <td>bug</td> </tr> <tr> <td>docs</td> <td align="center">📝</td> <td>memo</td> </tr> <tr> <td>style</td> <td align="center">📁</td> <td>file_folder</td> </tr> <tr> <td>refactor</td> <td align="center">♻️</td> <td>recycle</td> </tr> <tr> <td>perf</td> <td align="center">⚡️</td> <td>zap</td> </tr> <tr> <td>test</td> <td align="center">✅</td> <td>white_check_mark</td> </tr> <tr> <td>chore</td> <td align="center">🍰</td> <td>cake</td> </tr> <tr> <td>init</td> <td align="center">🎉</td> <td>tada</td> </tr> <tr> <td>merge</td> <td align="center">🔀</td> <td>twisted_rightwards_arrows</td> </tr> <tr> <td>review</td> <td align="center">👌</td> <td>ok_hand</td> </tr> <tr> <td>wip</td> <td align="center">🚧</td> <td>construction</td> </tr> </tbody> </table></div> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>コミットメッセージにプレフィックスを付ける文化が、少しずつ広がっています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/numanomanu/items/45dd285b286a1f7280ed">【今日からできる】コミットメッセージに 「プレフィックス」 をつけるだけで、開発効率が上がった話 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type">angular.js/DEVELOPERS.md at master · angular/angular.js</a></li> </ul> <p>一方、コミットメッセージに絵文字を付ける文化も、広まりつつあります。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/SnO2WMaN/items/45a68905e6768f5d7c39">customizable-gitmoji-cliで、gitのコミットメッセージに絵文字を付ける - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gitmoji.carloscuesta.me/">gitmoji | An emoji guide for your commit messages</a></li> </ul> <p>両者を組合せれば、最強のプレフィックスが出来上がるのではないかと考えました。<br /> ということで、絵文字付きプレフィックスという考え方を提案し、ここに記すこととします。</p> <h1 id="コミットメッセージにおける絵文字の付け方"><a href="#%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%AE%E4%BB%98%E3%81%91%E6%96%B9">コミットメッセージにおける絵文字の付け方</a></h1> <p>コミットメッセージに、絵文字名を <code>:</code> で挟むことにより、GitHub上で表示できます。<br /> また、コンソール上では、 emoji-cli などを利用することで、表示が可能です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/b4b4r07/items/1811f39a5f1418b38ec4">コマンドラインで emoji を扱う - Qiita</a></p> <p>例えば、 ✨ (sparkles) という記号をコミットメッセージに書きたい場合、コミットメッセージを次のように記述します。</p> <pre><code class="txt">:sparkles: feat(ruby): やさしい日本語ページのルビタグ対応 </code></pre> <p>すると、GitHub上のコミットメッセージとして登録されます。</p> <p><a href="https://crieit.now.sh/upload_images/69c95e597c4645fbdc4475feb494043e5f79d2604c967.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/69c95e597c4645fbdc4475feb494043e5f79d2604c967.png?mw=700" alt="sparklesをGitHub上のコミットメッセージとして表示した画面" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/covid19-miyazaki/covid19">covid19-miyazaki/covid19: 宮崎県(非公式) 新型コロナウイルス感染症対策サイト / Miyazaki COVID-19 Task Force website</a></p> <p>コミットメッセージの1行目は、表示できる文字数に制限があるため、長すぎる絵文字名の絵文字は気をつけたほうがいいかもしれません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tommy_aka_jps/items/a20d9a821cc01ee7bd96">git commit 時に書くコミットメッセージ1行目の表示文字数上限を調べてみた - Qiita</a></p> <h1 id="各プレフィックスと絵文字の紐付け"><a href="#%E5%90%84%E3%83%97%E3%83%AC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%AE%E7%B4%90%E4%BB%98%E3%81%91">各プレフィックスと絵文字の紐付け</a></h1> <p>大前提として、プレフィックスを使う場合は、リポジトリ内で統一する必要があります。<br /> これは、プレフィックスを使ったとしても、意味がわからなければ伝わらないからです。<br /> 同様に、多くの種類の絵文字を使うことも否定的です。<br /> これからの時代は、プロジェクト毎に、コーディングスタイルと共にコミットメッセージスタイルも定義する必要があると思います。</p> <p>今回は、Angularスタイルのプレフィックスを参考にします。<br /> <del>理由は、それ以外のスタイルを知らないからです。</del></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type">angular.js/DEVELOPERS.md at master · angular/angular.js</a></p> <p>また、絵文字については、Gitmojiを参考にします。<br /> <del>理由は、サイトが綺麗だからです。</del></p> <p><a target="_blank" rel="nofollow noopener" href="https://gitmoji.carloscuesta.me/">gitmoji | An emoji guide for your commit messages</a></p> <p>オリジナル絵文字を利用する場合は、GitHubで使える絵文字チートシートを参考にします。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.webfx.com/tools/emoji-cheat-sheet/">🎁 Emoji cheat sheet for GitHub, Basecamp, Slack & more</a></p> <p>以降、各プレフィックスの内容を説明し、それに見合った絵文字を紹介します。</p> <h2 id="feat"><a href="#feat">feat</a></h2> <blockquote> <p><strong>feat</strong>: A new feature</p> </blockquote> <p>新機能を追加する際に利用します。</p> <p>Gitmojiでは、同等の絵文字として ✨ (sparkles) を定義しています。<br /> 新機能を導入する際に使う絵文字です。</p> <blockquote> <p>:sparkles: Introducing new features.</p> </blockquote> <p>ということで、 feat には ✨ (sparkles) を利用します。</p> <hr /> <p>余談ですが、新機能というと、無かった機能を追加した際のみにも聞こえます。<br /> 僕の場合は、既存機能を変更する際や、既存機能を削除する際にも使っています。<br /> 変更/削除についても、変更することによって統一性が図れるとか、削除することによってUIが向上するとか、変更/削除そのものが機能追加という場合が多いなーと思っていたからです(いわゆる enhansement と同じ意味として捉えています。<br /> これについては、プロジェクト毎に決めておくといいかもしれません。</p> <h2 id="fix"><a href="#fix">fix</a></h2> <blockquote> <p><strong>fix</strong>: A bug fix</p> </blockquote> <p>不具合を修正する際に利用します。</p> <p>Gitmojiでは、同等の絵文字として 🐛 (bug) を定義しています。<br /> 意味は全く同じです。</p> <blockquote> <p>:bug: Fixing a bug.</p> </blockquote> <p>ということで、 fix には 🐛 (bug) を利用します。</p> <hr /> <p>また余談ですが、個人的には、修正コミットに 🐛 を付けることは、若干抵抗があります。<br /> GitHubでIssueファーストの開発をしていると、Issueでは不具合発見として 🐛 を付けて、修正プルリクとして 🐛 の絵文字を付けてしまいませんか?<br /> 🐛 という絵文字自体には2つの意味があるからです。</p> <ul> <li>不具合発見時</li> <li>不具合修正時</li> </ul> <p>前者は 🐛 で問題ないのですが、後者については考える余地があるはずです。<br /> もし虫網や虫籠の絵文字があれば、それを使っていたのですが......</p> <p>コミット時に不具合を意図的に入れることは考えられない点と、不具合発見時をコミットメッセージで表すことが無い点、さらに 不具合 == バグ == 🐛 を知らないエンジニアがほぼいない点を考慮して、 fix には 🐛 がいいかなと考えました。</p> <h2 id="docs"><a href="#docs">docs</a></h2> <blockquote> <p><strong>docs</strong>: Documentation only changes</p> </blockquote> <p>ドキュメント類を修正する際に利用します。<br /> 修正と言っていますが、追加や削除時にも使ってよいと思います。</p> <p>Gitmojiでは、同等の絵文字として 📝 (pencil) を定義しています。<br /> ドキュメント類を記述する際に利用します。</p> <blockquote> <p>:pencil: Writing docs.</p> </blockquote> <p>また、 pencil と memo は、GitHubでは同じ絵文字として認識されます。</p> <p><a href="https://crieit.now.sh/upload_images/aaa7383ded55b293dbf016257c05ce015f79d2d1c40c6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/aaa7383ded55b293dbf016257c05ce015f79d2d1c40c6.png?mw=700" alt="pencil と memo の絵文字" /></a></p> <p>ちなみに、鉛筆だけの絵文字は pencil2 です。<br /> <del>これは酷い......</del></p> <p><a href="https://crieit.now.sh/upload_images/ef7ebafe4134a31651e449623053f44f5f79d30a659e8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ef7ebafe4134a31651e449623053f44f5f79d30a659e8.png?mw=700" alt="pencil2 の絵文字" /></a></p> <p>ということで、 pencil では文字ベースとして判断しづらい点から、 📝 (memo) を利用します。</p> <h2 id="style"><a href="#style">style</a></h2> <blockquote> <p><strong>style</strong>: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)</p> </blockquote> <p>ソースコードの可読性を変更する際に利用します。<br /> Lintを適用した際や、空行を追加した際など、振舞いに変化を与えない変更が該当します。</p> <p>Gitmojiでは、 🎨 (art) が当てはまるかもしれません。<br /> 🎨 は、ファイル構造を変更する際、または、ソースコードのフォーマットを変更する際に利用します。</p> <blockquote> <p>:art: Improving structure / format of the code.</p> </blockquote> <p>style という観点で言えば、2番目の意味に該当することは間違いありません。<br /> また、1番目の意味も、ファイル構造の style という側面で見れば、該当すると見ることもできます。</p> <p>しかし、 <code>art</code> という単語からは、UIに関連しそうなイメージが付きます。<br /> 実際、下記のようなIssueも上がっています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/carloscuesta/gitmoji/issues/320">🎨 for design and 📐 for structure · Issue #320 · carloscuesta/gitmoji</a></p> <p>style という内容に合わせるため、ここでは 📁 (file_folder) を利用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://emojipedia.org/file-folder/">📁 File Folder Emoji</a></p> <h2 id="refactor"><a href="#refactor">refactor</a></h2> <blockquote> <p><strong>refactor</strong>: A code change that neither fixes a bug nor adds a feature</p> </blockquote> <p>ソースコードの可読性を向上する際に利用します。</p> <p>Gitmojiには、同等の絵文字として ♻️ (recycle) を定義しています。<br /> 意味はほとんど同じです。</p> <blockquote> <p>:recycle: Refactoring code.</p> </blockquote> <p>ということで、 refactor には ♻️ (recycle) を利用します。</p> <h2 id="perf"><a href="#perf">perf</a></h2> <blockquote> <p><strong>perf</strong>: A code change that improves performance</p> </blockquote> <p>パフォーマンスを向上する際に利用します。</p> <p>Gitmojiには、同等の絵文字として ⚡️ (zap) を定義しています。<br /> 意味は全く同じです。</p> <blockquote> <p>:zap: Improving performance.</p> </blockquote> <p>ということで、 perf には ⚡️ (zap) を利用します。</p> <h2 id="test"><a href="#test">test</a></h2> <blockquote> <p><strong>test</strong>: Adding missing or correcting existing tests</p> </blockquote> <p>テストコードを追加する際や、既存テストコードを修正する際に利用します。</p> <p>Gitmojiには、同等の絵文字として ✅ (white_check_mark) を定義しています。<br /> 意味は全く同じです。</p> <blockquote> <p>:white_check_mark: Updating tests.</p> </blockquote> <p>また、チェックマークの絵文字は、他にも ✔️ (heavy_check_mark) が存在します。</p> <p>正直、どちらでもいいとは思います。<br /> 個人的には、Windowsでの開発が多かったため、 ✔️ を利用していました。<br /> ✔️ のチェックの色が緑色で、わかりやすかったためです。</p> <p>しかし、他OSではチェックの色が黒色で、わかりづらくなっています。<br /> 一方、 ✅ は、殆どのメーカーが緑色矩形の白抜きチェックであり、わかりやすくなっています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://emojipedia.org/check-mark-button/">✅ White Heavy Check Mark Emoji</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://emojipedia.org/check-mark/">✔️ Heavy Check Mark Emoji</a></li> </ul> <p>ということで、 test には ✅ (white_check_mark) を利用します。</p> <h2 id="chore"><a href="#chore">chore</a></h2> <blockquote> <p><strong>chore</strong>: Changes to the build process or auxiliary tools and libraries such as documentation generation</p> </blockquote> <p>自動生成ツールによりファイルを変更する際に利用します。<br /> chore とは、雑務という意味があります。</p> <p><a target="_blank" rel="nofollow noopener" href="https://ejje.weblio.jp/content/chore">choreの意味・使い方・読み方 | Weblio英和辞書</a></p> <p>Gitmojiには、該当する絵文字はありません。<br /> 一部分で該当しそうな絵文字は、いくつか定義しています。</p> <p>少し頭を悩ませましたが、英語圏のスラングである 'It's a piece of cake' から取って、 🍰 (cake) を利用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://ejje.weblio.jp/content/it%27s+a+piece+of+cake">it's a piece of cakeの意味・使い方・読み方 | Weblio英和辞書</a></p> <h2 id="Angularスタイル以外"><a href="#Angular%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E4%BB%A5%E5%A4%96">Angularスタイル以外</a></h2> <p>以下は、Angularスタイル以外のコミットメッセージで利用する絵文字です。<br /> プレフィックスは付けても付けなくても構いません。</p> <h3 id="First commit"><a href="#First+commit">First commit</a></h3> <p>最初のコミットとしてよく使われる first commit ですが、Gitmojiでは 🎉 (tada) として定義しています。</p> <blockquote> <p>:tada: Initial commit.</p> </blockquote> <p>ということで、 first commit には 🎉 (tada) を利用します。<br /> プレフィックスは init とします。</p> <hr /> <p>余談ですが、個人的には first commit を空メッセージにするのは懐疑的です。<br /> 必要無いから消したのか、書き忘れたのか、空メッセージでは判断できないためです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19">Gitの最初のコミットは空コミットにしよう - Qiita</a></p> <h3 id="Merge commit"><a href="#Merge+commit">Merge commit</a></h3> <p>マージ実行時のコミットですが、Gitmojiでは 🔀 (twisted_rightwards_arrows) として定義しています。</p> <blockquote> <p>:twisted_rightwards_arrows: Merging branches.</p> </blockquote> <p>ということで、マージコミットには 🔀 (twisted_rightwards_arrows) を利用します。<br /> 長いですが、マージコミットの1行目はあまり重要であることは少ないため、問題なしとします。<br /> プレフィックスは merge とします。</p> <h3 id="Review commit"><a href="#Review+commit">Review commit</a></h3> <p>レビュー指摘反映時のコミットですが、Gitmojiでは 👌 (ok_hand) として定義しています。</p> <blockquote> <p>:ok_hand: Updating code due to code review changes.</p> </blockquote> <p>ということで、レビュー指摘反映コミットには 👌 (ok_hand) を利用します。<br /> <del>あまり個人的には多用しないようにすべきとは思いますが......</del></p> <h3 id="WIP commit"><a href="#WIP+commit">WIP commit</a></h3> <p>作業中コミット (WIP: Work in Progress) ですが、Gitmojiでは 🚧 (construction) として定義しています。</p> <blockquote> <p>:construction: Work in progress.</p> </blockquote> <p>ということで、作業中コミットには 🚧 (construction) を利用します。<br /> プレフィックスは wip とします。</p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>現在ではプライベートリポジトリでしか利用してませんが、個人的には可読性が上がっている気がします。<br /> これを開発チームに展開して共有できれば、また違った世界が見えるかもしれません。</p> <p>絵文字は、用法用量を守り、適切にご利用ください。</p> <h1 id="ちなみに"><a href="#%E3%81%A1%E3%81%AA%E3%81%BF%E3%81%AB">ちなみに</a></h1> <p>Gitmojiでは、本記事と似たようなIssueが立っていました。<br /> もしかしたら、Gitmoji側で方針が決まるかもしれません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/carloscuesta/gitmoji/issues/429">Add a "semver" field for each emoji · Issue #429 · carloscuesta/gitmoji</a></p> <p>こんなリポジトリもあります。<br /> これを使えば、本記事の内容をPJで統一しやすくなりますね。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/negokaz/git-fancy-message-prefix">negokaz/git-fancy-message-prefix: A Git prepare-commit-msg hook for fancy commit message</a></p> Morichan tag:crieit.net,2005:PublicArticle/16018 2020-07-27T08:40:30+09:00 2020-07-27T08:40:52+09:00 https://crieit.net/posts/Windows-VSCode-git-add-outside-repository WindowsのVSCodeでファイルをgit addしようとするとoutside repositoryエラーが出る <p>VSCodeのUIで編集したファイルのプラスボタンを押してgit addしようとすると、下記のようなエラーが出るようになっていた。結構古いプロジェクトだった。他のプロジェクトでは発生しない。Windowsだけ発生する現象かもしれない。</p> <pre><code class="text">fatal: d:\users\documents\apps\app\src\entity\Answer.ts: 'd:\users\documents\apps\app\src\entity\Answer.ts' is outside repository </code></pre> <p>これによりaddができない。試しにシェルでaddしてみたら普通にaddできた。VSCodeのUIでだけaddできない。</p> <p>調べてみると、 <code>git update-git-for-windows</code> でgit自体をバージョンアップすれば良いらしい。詳しくは下記の情報。</p> <p><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/13790592/how-to-upgrade-to-the-latest-version-of-git-on-windows-still-showing-older-vers">https://stackoverflow.com/questions/13790592/how-to-upgrade-to-the-latest-version-of-git-on-windows-still-showing-older-vers</a></p> <p>とにかくgitのバージョン2.13あたり以前だと発生するらしい。多分ドライブ文字列が小文字になってるところが原因っぽいのだろうと。何にしろ詳しくはわからないが、バージョンアップすれば改善した。</p> <p>バージョンの確認</p> <pre><code>git version </code></pre> <p>アップグレード</p> <pre><code>git update-git-for-windows </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15677 2020-01-13T14:41:18+09:00 2020-01-13T14:44:52+09:00 https://crieit.net/posts/1626f2bc2824aa0dbd4d3bee680dc2fe 共通の設定をリポジトリ化する <h1 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h1> <p>現在、私が運営しているサービスのうち、</p> <p>野球スコア掲載プラットフォーム<br /> <a target="_blank" rel="nofollow noopener" href="https://jcbl-score.com">みんなのSCORE</a><br /> キャップ野球総合サイト<br /> <a target="_blank" rel="nofollow noopener" href="https://cap-baseball.com">キャップ野球情報局</a></p> <p>この2サービス、共通のアプリケーションサーバを持っていてUIが異なるだけなのです。</p> <p>画像や設定など、2つのサイト(異なるリポジトリ)間で同じものを共有したい場合、<br /> 別のリポジトリから<code>npm install</code>するのがよいようです。</p> <h1 id="実際に作ってみる"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">実際に作ってみる</a></h1> <p>今回は試合のIDとyoutubeやtwitterのツイートを紐づけするconfigファイルを<br /> 共通リポジトリに置きます。</p> <h2 id="今回作ったリポジトリのindex.js"><a href="#%E4%BB%8A%E5%9B%9E%E4%BD%9C%E3%81%A3%E3%81%9F%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AEindex.js">今回作ったリポジトリのindex.js</a></h2> <pre><code class="javascript">export { twMovieConfig } from './config/twMovieConfig'; export { youtubeConfig } from './config/youtubeConfig'; </code></pre> <p>共有したいファイルをexportする。</p> <h2 id="package.json"><a href="#package.json">package.json</a></h2> <pre><code class="json">{ "name": "common", "version": "0.0.202001131200", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "description": "" } </code></pre> <h2 id="インポートする側のpackage.json"><a href="#%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E5%81%B4%E3%81%AEpackage.json">インポートする側のpackage.json</a></h2> <pre><code class="js"> { "dependencies": { ........ "common": "https://github.com/ckoshien/common.git" } } </code></pre> <h1 id="課題"><a href="#%E8%AA%B2%E9%A1%8C">課題</a></h1> <ul> <li>変更があった場合は毎回npmインストール</li> <li>package-lock.jsonを削除しないとインストールできない</li> <li>package.jsonのバージョンを上げないと変更があったと認識されない</li> </ul> ckoshien tag:crieit.net,2005:PublicArticle/15630 2019-12-21T15:38:21+09:00 2019-12-21T15:38:21+09:00 https://crieit.net/posts/MinQ-7-Git MinQ開発日記 (7) 認証情報を含んだプロジェクトをGitで管理する <h1 id="認証情報を含んだプロジェクトをGitで管理する"><a href="#%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%82%92%E5%90%AB%E3%82%93%E3%81%A0%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92Git%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B">認証情報を含んだプロジェクトをGitで管理する</a></h1> <h2 id="モチベーション"><a href="#%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">モチベーション</a></h2> <p>GORMでデータベースへアクセスする場合ユーザー名やパスワードが必要でした. こうした認証情報をgitで管理してGitHubのようなリモート・リポジトリに上げてしまうのは例え非公開でも大変危険です. かといってこれをプロジェクト外部で管理すると, デプロイ時にめんどいうになりそうです. 後間違えコミットしてしまうということも有り得ます.</p> <h2 id="用語"><a href="#%E7%94%A8%E8%AA%9E">用語</a></h2> <h3 id="PGP (Pretty Good Privacy)"><a href="#PGP+%28Pretty+Good+Privacy%29">PGP (Pretty Good Privacy)</a></h3> <p>暗号化プログラムで, 公開暗号方式を使うようです.</p> <h3 id="GPG (GnuPG)"><a href="#GPG+%28GnuPG%29">GPG (GnuPG)</a></h3> <p>GNUによるオープンソースなPGPです.</p> <h3><a target="_blank" rel="nofollow noopener" href="https://www.gnupg.org/software/pinentry/index.html">pinentry</a></h3> <p>GnuPGがパスフレーズやPIN番号を読み取れるようにするプログラムのようです. なくても良さそうでは有ります.</p> <h3><a target="_blank" rel="nofollow noopener" href="https://linux.die.net/man/1/gpg-agent">gpg-agent</a></h3> <p>秘密鍵を管理してくれるデーモンのようです. ssh-agentと同じようなもののようです.</p> <blockquote> <p>gpg-agent is a daemon to manage secret (private) keys independently from any protocol. It is used as a backend for gpg and gpgsm as well as for a couple of other utilities.</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://linux.die.net/man/1/gpg-agent">gpg-agent(1) - Linux man page</a></p> <blockquote> <p>If the agent process has the key, it provides it to gpg. If it doesn't, it attempts to load the encrypted key from your keyring, and prompts you for the key's passphrase. Once the agent has obtained the decrypted key, it passes it to the gpg process. In addition to GPG keys, Gpg-agent can similarly store SSH keys and provide them to SSH processes, like the ssh-agent program that comes with SSH.</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://unix.stackexchange.com/a/188813/382631">How does GPG agent work?</a></p> <blockquote> <p>gpg-agent is mostly used as daemon to request and cache the password for the keychain.</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://wiki.archlinux.org/index.php/GnuPG#gpg-agent">gpg-agent</a></p> <blockquote> <p>gpg-agent can be configured via the pinentry-program stanza to use a particular pinentry user interface when prompting the user for a passphrase.</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://wiki.archlinux.org/index.php/GnuPG#pinentry">pinentry</a></p> <h3 id="用語の整理"><a href="#%E7%94%A8%E8%AA%9E%E3%81%AE%E6%95%B4%E7%90%86">用語の整理</a></h3> <div class="table-responsive"><table> <thead> <tr> <th>名前</th> <th>用途</th> </tr> </thead> <tbody> <tr> <td>GPG(GnuPG)</td> <td>暗号化や署名の生成を行うプログラム</td> </tr> <tr> <td>Pinetnry</td> <td>GPGにパスフレーズやPIN番号を安全に渡すプログラム</td> </tr> <tr> <td>gpg-agent</td> <td>GPGの代理として鍵を管理するプログラム?</td> </tr> </tbody> </table></div> <p>GPG本体とgpg-agentの違いというか役割分担がよく分かっていませんね😅</p> <h2 id="GnuPG"><a href="#GnuPG">GnuPG</a></h2> <h3 id="導入"><a href="#%E5%B0%8E%E5%85%A5">導入</a></h3> <p>brewを使うと簡単にできます</p> <pre><code class="bash">brew install gnupg gnupg2 pinentry-mac gpg-agent </code></pre> <p>gpg-agentにpinentry-programを指定します.</p> <pre><code class="bash">which pinentry-mac echo "pinentry-program /usr/local/bin/pinentry-mac" >>~/.gnupg/gpg-agent.conf cat ~/.gnupg/gpg-agent.conf </code></pre> <p>ところがgpg-agentは存在しません. GPG 2.1以降はgpg-agent付属して配布されているようです.</p> <p><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/52435650/gpg-agent-not-found-for-homebrew">gpg-agent not found for homebrew</a></p> <blockquote> <p>It expects that the reader is familiar with GnuPG version 2.0 and aware that GnuPG consists of gpg, gpgsm, and gpg-agent as its main components.</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://www.gnupg.org/faq/whats-new-in-2.1.html">GnuPG</a></p> <p>これでGPGで鍵を生成するときにパスフレーズが求められるとpinentry-programであるpinentry-macが起動するはずです. が, どうも2.0以降はpinentry-programの設定が変わっているようで動きませんでした. Stackoverflowに質問しておきました.</p> <p><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/59433705/where-should-i-specify-a-pinentry-program-for-gnupg-2-0-and-later">Where should I specify a pinentry program for GnuPG 2.0 and later?</a></p> <p>とりあえずなしでいきます.</p> <h3 id="鍵の生成"><a href="#%E9%8D%B5%E3%81%AE%E7%94%9F%E6%88%90">鍵の生成</a></h3> <p>必要となる情報は以下です.</p> <ul> <li>名前</li> <li>e-mail</li> <li>パスフレーズ</li> </ul> <pre><code class="bash">gpg --generate-key </code></pre> <p>で用意した情報を入力しましょう.</p> <h2 id="git-crypt"><a href="#git-crypt">git-crypt</a></h2> <h3 id="導入"><a href="#%E5%B0%8E%E5%85%A5">導入</a></h3> <p>こちらもbrewでインストールします.</p> <pre><code class="bash">brew install git-crypt </code></pre> <h3 id="利用"><a href="#%E5%88%A9%E7%94%A8">利用</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://dev.classmethod.jp/tool/git/git-crypt/">git-crypt を使って秘密情報を版管理する</a>を参考にしてやってみましょう.</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>これで公開鍵を知らない人は中身を見れなくなりました. よってGitHubにアップロードして問題ないと思われます. VPSに公開鍵をアップロードしておけばgit crypt unlockで復号化されます.</p> <h2 id="課題"><a href="#%E8%AA%B2%E9%A1%8C">課題</a></h2> <p>デプロイするときに面倒が増します. Gitのフックはpush時しか出来ないからです. のでGitHubはリモート・リポジトリと割り切ってデプロはAnsibleとか使った方が良いと思いました.</p> <p><a target="_blank" rel="nofollow noopener" href="https://satoshun.github.io/2015/02/ansible-go_deploy/">AnsibleでGoアプリをデプロイ</a></p> <h2 id="Reference"><a href="#Reference">Reference</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.digitalocean.com/community/tutorials/an-introduction-to-managing-secrets-safely-with-version-control-systems">An Introduction to Managing Secrets Safely with Version Control Systems</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/daisukeoda/items/c6b6c36009fa3409dc39">本番用の.envを外部に一切知られずに安全にgithubで保存する方法</a><br /> <a target="_blank" rel="nofollow noopener" href="https://dev.classmethod.jp/tool/git/git-crypt/">git-crypt を使って秘密情報を版管理する</a></p> ブレイン tag:crieit.net,2005:PublicArticle/15459 2019-10-08T01:05:45+09:00 2019-10-08T01:09:21+09:00 https://crieit.net/posts/C-5d9b6259e4530 C#を本業にしているスクリプトキディが思いついた、私史上最強の三文未満小説執筆環境 <p>3畳に足りるか足りないか分からないシェアハウスの個室で、間接照明とディスプレイの明かりを頼りに、<br /> この文章を自作した左右分離式キーボードで書いている。</p> <p><a href="https://crieit.now.sh/upload_images/3bf7b632524cf2841f96bdb7b8fe62e05d9b6315cd782.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3bf7b632524cf2841f96bdb7b8fe62e05d9b6315cd782.png?mw=700" alt="This is DOOM Emacs." /></a><br /> Emacsで。 厳密に言うと、DOOM Emacsだ。</p> <p>そんな私がなぜ久々に文章を打っているかといえば、<br /> 就業中にわだかまっていた三文小説未満のライトノベルにも満たないプログラミング入門以前物語のそれを書きたくなったり、<br /> 書くに至って良いやり方をいろいろ考えていたら、思いついたのでまとめているわけである。</p> <h1 id="Emacsは最強の執筆環境"><a href="#Emacs%E3%81%AF%E6%9C%80%E5%BC%B7%E3%81%AE%E5%9F%B7%E7%AD%86%E7%92%B0%E5%A2%83">Emacsは最強の執筆環境</a></h1> <p>この記事に何らかのきっかけで行き着いた方々には釈迦に説法だとは思うし、<br /> もっとLispを使いこなしているEmacsユーザーに対しては僭越だが、<br /> 一応Emacsというエディタについて簡単に自分が今(2019-10-07T22:46)資料を見ないでできる限りの<br /> 紹介をさせていただく。</p> <h2 id="Emacsという古来から存在するテキストエディタ"><a href="#Emacs%E3%81%A8%E3%81%84%E3%81%86%E5%8F%A4%E6%9D%A5%E3%81%8B%E3%82%89%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF">Emacsという古来から存在するテキストエディタ</a></h2> <p>古来(といってもUNIXが生まれてからではあるので、西暦1980年以降である)から存在するテキストエディタであるが、<br /> その拡張性の高さと、拡張性ゆえの可能性の多さから、このエディタのファンは多く、根強い支持を得ている。</p> <p>とかく書いてる私自身も2年前から少しずつEmacsを触り始めた口で、それまでは<a target="_blank" rel="nofollow noopener" href="http://vim.org">Vim</a>という双対をなすテキストエディタを使っていた。</p> <h2 id="(ほぼ)文字だけで表現するテキストエディタ"><a href="#%EF%BC%88%E3%81%BB%E3%81%BC%EF%BC%89%E6%96%87%E5%AD%97%E3%81%A0%E3%81%91%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF">(ほぼ)文字だけで表現するテキストエディタ</a></h2> <p>これら(Emacs,<br /> Vim)の特徴としては、ほぼすべてを文字で表現することにある。</p> <p>ドットインパクトプリンタなどの出力機器しかなかった時代から見るとずいぶんと贅沢かもしれないが、<br /> 2000年以降に生まれた若い人たちからすると、ずいぶんと貧相に思うかもしれない。<br /> 今日のEmacs,<br /> その拡張機能と適切なフォントをインストールすれば、絵文字などを利用して見栄えは良くなる。</p> <h2 id="「ダサい」? 違う、洗練されているのだ。"><a href="#%E3%80%8C%E3%83%80%E3%82%B5%E3%81%84%E3%80%8D%EF%BC%9F%E3%80%80%E9%81%95%E3%81%86%E3%80%81%E6%B4%97%E7%B7%B4%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A0%E3%80%82">「ダサい」? 違う、洗練されているのだ。</a></h2> <p>とはいえ、EmacsはCtrlやAltなどの装飾キーを酷使し、Vimは3つのモードを把握しなければいけないなどの<br /> 参入障壁があり、それ以前におそらく最初の見た目はWindowsのメモ帳と代わり映えしないだろう。</p> <p>「ダサい」と思われるかもしれない。 しかし本当にダサいのだろうか。</p> <p>私は憧れる。必要な時に必要な道具をサッと出し、作業に取り掛かり、必要が無くなったらしまう。</p> <p>それができるのがこれらのエディタの強さである。</p> <h1 id="Org-modeは至高の(ドキュメント|タスク管理|プロジェクト管理)テキストフォーマット"><a href="#Org-mode%E3%81%AF%E8%87%B3%E9%AB%98%E3%81%AE%EF%BC%88%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%EF%BD%9C%E3%82%BF%E3%82%B9%E3%82%AF%E7%AE%A1%E7%90%86%EF%BD%9C%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86%EF%BC%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88">Org-modeは至高の(ドキュメント|タスク管理|プロジェクト管理)テキストフォーマット</a></h1> <h2 id="執筆に適したテキストフォーマットを作るという行為の非現実性"><a href="#%E5%9F%B7%E7%AD%86%E3%81%AB%E9%81%A9%E3%81%97%E3%81%9F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E8%A1%8C%E7%82%BA%E3%81%AE%E9%9D%9E%E7%8F%BE%E5%AE%9F%E6%80%A7">執筆に適したテキストフォーマットを作るという行為の非現実性</a></h2> <p>とはいえ、テキストエディタが優秀で拡張性に優れているからと言って、自前で執筆に適した拡張機能を作るのは骨が折れる。</p> <p>ましてや進捗やHTMLファイル(Webブラウザで閲覧できる形式)への変換出力機能も実装するのは、自分のような専門学校卒業程度の、<br /> ほぼ文系コーダーに毛が生えてるか生えていないか程度のプログラマというのもおこがましい劣化知的生命体には無茶な話で、<br /> 仕事の余暇に作るなんて、人間の平均寿命から20年ほど引いた年数ではできるものではない<br /> (たまにそれを成し遂げる者も居るが、それは天才と言われる超人類にしか当てはまらない)。</p> <h2 id="巨人の肩に腰を据える"><a href="#%E5%B7%A8%E4%BA%BA%E3%81%AE%E8%82%A9%E3%81%AB%E8%85%B0%E3%82%92%E6%8D%AE%E3%81%88%E3%82%8B">巨人の肩に腰を据える</a></h2> <p>今日、オープンソースソフトウェア・フリーソフトウェアという文化が広まり、インターネットにつながるパソコンがあれば、<br /> 天才達が考えたプログラムを自由に利用し、技術があれば改造したり、更にその天才が気づかなかった不具合を治すことだってできる。<br />  <br /> Emacsの文化から生まれた<a target="_blank" rel="nofollow noopener" href="https://orgmode.org/ja/">Org-mode</a>もその一つだろう。</p> <p>Org-modeはそのよく考えられたテキストフォーマットと、文字列情報を解析して機能を与えるEmacsが織りなす、</p> <ul> <li>メモ</li> <li>ジャーナル</li> <li>文書</li> <li>タスク管理</li> <li>プロジェクト管理</li> </ul> <p>上記全て(さらに数個以上)に対応するテキストフォーマットなのである。</p> <p>MarkdownやreStructuredTextも拡張することでこれらを全て受け持つテキストフォーマットになるだろう。<br /> ただ、Emacs<br /> Lispという強力なテキストエディタの拡張性により、テキストエディタとシンプルな軽量マークアップ言語<br /> で実装できたと私は思う。</p> <h1 id="実際にどう書くのか。"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%A9%E3%81%86%E6%9B%B8%E3%81%8F%E3%81%AE%E3%81%8B%E3%80%82">実際にどう書くのか。</a></h1> <p>さて、ここからそんなEmacsとOrg-modeを利用して執筆する方法を見てみよう。</p> <h2 id="とにかく見出しを作る"><a href="#%E3%81%A8%E3%81%AB%E3%81%8B%E3%81%8F%E8%A6%8B%E5%87%BA%E3%81%97%E3%82%92%E4%BD%9C%E3%82%8B">とにかく見出しを作る</a></h2> <p>とにかく見出しを作る。</p> <h3 id="更に細分化した見出しを作る"><a href="#%E6%9B%B4%E3%81%AB%E7%B4%B0%E5%88%86%E5%8C%96%E3%81%97%E3%81%9F%E8%A6%8B%E5%87%BA%E3%81%97%E3%82%92%E4%BD%9C%E3%82%8B">更に細分化した見出しを作る</a></h3> <p>その見出しを細分化する。</p> <p>アニメの絵コンテの一枠や、マンガのヒトコマくらいに細分化してしまっていい。</p> <h3 id="そのシーンを1行でまとめた描写を"><a href="#%E3%81%9D%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%B3%E3%82%921%E8%A1%8C%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%81%E3%81%9F%E6%8F%8F%E5%86%99%E3%82%92">そのシーンを1行でまとめた描写を</a></h3> <p>更にその見出しを細分化する。段落レベルまで細分化してしまっても良い。</p> <p>私の様な人間は特に、 「これは5分で書けるだろう」 <br /> くらいのレベルまで細分化してしまったほうが良いと思う。</p> <h2>見出しを <code>TODO</code> にしてしまう</h2> <p>Org-modeのテキストを、Emacsの <code>org-mode</code> を適応して開いていれば、<br /> キーボード・ショートカットで見出しを一瞬でタスクに切り替えることができる。</p> <p>この機能を最大限利用し、先程まで書いた見出しを全て <code>TODO</code><br /> にしてしまおう。</p> <p>もちろんだが、全ての見出しを <code>TODO</code><br /> にするスクリプトを書いてしまっても良い。<br /> むしろそうやって積極的に拡張できるのがEmacsの強みだと私は思う。</p> <h2 id="書け。羅列されたシーンを描写しろ。"><a href="#%E6%9B%B8%E3%81%91%E3%80%82%E7%BE%85%E5%88%97%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B7%E3%83%BC%E3%83%B3%E3%82%92%E6%8F%8F%E5%86%99%E3%81%97%E3%82%8D%E3%80%82">書け。羅列されたシーンを描写しろ。</a></h2> <p>さあ、何を書きたいか決まった。書こう。</p> <h3 id="細分化された見出しはほぼ穴埋めだ。"><a href="#%E7%B4%B0%E5%88%86%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E8%A6%8B%E5%87%BA%E3%81%97%E3%81%AF%E3%81%BB%E3%81%BC%E7%A9%B4%E5%9F%8B%E3%82%81%E3%81%A0%E3%80%82">細分化された見出しはほぼ穴埋めだ。</a></h3> <p>細分化された見出しに答えるように書いていくだけで良いはずだ。</p> <p>それで筆が進まないのは、もしかしたら細分化が足りない。</p> <p>どんな風に書くか迷ったら、 <code>#</code><br /> を行頭につけてコメントアウトしてとりあえず書いてみる。</p> <h3 id="余談:テストを行うプログラムから書く「テスト駆動開発」"><a href="#%E4%BD%99%E8%AB%87%EF%BC%9A%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E8%A1%8C%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8B%E3%82%89%E6%9B%B8%E3%81%8F%E3%80%8C%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%80%8D">余談:テストを行うプログラムから書く「テスト駆動開発」</a></h3> <p>昨今になってソフトウェア開発の世界で注目されているのが、「テスト駆動開発」という手法だ。</p> <p>雑に説明してしまうと、<br /> 「作ったものの動作が正しく動作するか検証するプログラムを書きながらソフトウェアを作っていく」<br /> という手法だ。</p> <p>この執筆手法も、このソフトウェア開発手法からヒントを得た。<br /> 「自分の書きたいことをある程度ハッキリさせたら筆が進むはず」<br /> という、結構安直な考えである。</p> <p>この際なのでここに、 「ドメイン駆動設計」<br /> の考え方も混ぜ込みたくもなったが、まだそこまで考えがまとまってないので、後日うっかりひらめいたら。</p> <h2 id="見出しを消す"><a href="#%E8%A6%8B%E5%87%BA%E3%81%97%E3%82%92%E6%B6%88%E3%81%99">見出しを消す</a></h2> <h3 id="よしっ!"><a href="#%E3%82%88%E3%81%97%E3%81%A3%EF%BC%81">よしっ!</a></h3> <p>(ヘルメットを被った猫の絵は省略)</p> <p>あとは大見出し以外を消すなり、大見出しを書き直したら、大分いい感じになってるはずだ。</p> <h3 id="Orgで書いたテキストを変換。"><a href="#Org%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%9F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%A4%89%E6%8F%9B%E3%80%82">Orgで書いたテキストを変換。</a></h3> <p>とはいえ、書いたテキストを他の人が見やすいフォーマットにできないと、<br /> なかなか見せづらくて寂しいと思われる。</p> <p>EmacsとOrg-mode標準でもいくつかのファイルフォーマットに出力できるが、<a target="_blank" rel="nofollow noopener" href="https://pandoc.org">Pandoc</a>などのツールを使うと、<br /> 更に幅が広がる。</p> <p>LaTeX形式に一度吐き出して、PDF形式に変換することも可能だ 。</p> <h1 id="Git(とMagit)を合わせると鬼に金棒。"><a href="#Git%EF%BC%88%E3%81%A8Magit%EF%BC%89%E3%82%92%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E3%81%A8%E9%AC%BC%E3%81%AB%E9%87%91%E6%A3%92%E3%80%82">Git(とMagit)を合わせると鬼に金棒。</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://git-scm.com">Git</a>と<a target="_blank" rel="nofollow noopener" href="https://magit.vc">Magit</a>を使って共同執筆する方法についても書きたかったが、私個人の時間切れに付き、ここまで。</p> <p>Gitを使った執筆活動の方法は他の方も各所で書いているので、興味のある方はぜひ調べてみるといいだろう。</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>私の眠気もいい具合にキマってきた午前0時40分。</p> <p>割と思いついたことは書き留めれたはず。</p> <p>なお、この記事を書くに当たって、<a target="_blank" rel="nofollow noopener" href="http://www.mhatta.org/wp/category/org-mode/">八田真行さんの「モーレツ! Org<br /> mode教室」</a>を多大に参考にさせていただいた。<br /> ちょっとでもEmacsとOrg-modeに興味を抱いた方は、ぜひ確認していただきたい。</p> <h1 id="Emacsディストリビューション"><a href="#Emacs%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">Emacsディストリビューション</a></h1> <p>しかしながら、この記事の最初でも記したとおり、Emacsは素のままでは結構難解なテキストエディタである。</p> <p>そこで、そんなEmacsにパッケージを追加して使いやすくしたEmacs達を紹介して話を締めたいと思う。</p> <dl> <dt>Graphene</dt> <dd>比較的優しそうな見た目</dd> <dt>Emacs Prelude</dt> <dd>ディストリビューションでは結構人気</dd> <dt>Spacemacs</dt> <dd>ちょっと重くて音沙汰ないけど、元祖Emacs + Vim</dd> <dt>DOOM Emacs</dt> <dd>Spacemacsの意志を受け継いだ? チョットワカル人向け。とはいえ自分みたいなニワカでも割と扱える。</dd> <dt>Emacs</dt> <dd>弘法は筆を選ぶのではない。作るのだ。</dd> <dt>Vim-Org-mode</dt> <dd>VimでもOrg-mode</dd> <dt>VSCode + VS Code Org Mode</dt> <dd>Visual Studio CodeでもOrg-mode。すげぇな。</dd> </dl> <h1 id="P.S."><a href="#P.S.">P.S.</a></h1> <p>このテキストの原稿もOrg-modeで書きました。<br /> <a target="_blank" rel="nofollow noopener" href="https://gist.github.com/manzyun/63768a11fde889e090ffe16c785425a6">GIstに原稿を上げてます</a>Rawボタンを見ると、生テキストファイルが見れます。<br /> 参考になれば幸いです。</p> まんじゅ(´ん`) tag:crieit.net,2005:PublicArticle/15066 2019-06-06T14:15:54+09:00 2019-06-06T15:56:49+09:00 https://crieit.net/posts/submodule submoduleのざっくりとした流れ <p>2個のリポジトリをまとめて管理したかっただけなので込み入ったことはしていません。</p> <ul> <li><code>git submodule</code>: 現在のsubmoduleの状態を見る</li> <li><code>git submodule add <URL></code>: 追加したいリモートリポジトリを指定</li> </ul> <h4 id="前提"><a href="#%E5%89%8D%E6%8F%90">前提</a></h4> <p>submoduleは予めpushしておくこと</p> <h4 id="登録"><a href="#%E7%99%BB%E9%8C%B2">登録</a></h4> <p><code>git submodule add <URL></code>でsubmoduleの追加。配下に登録される。</p> <h4 id="更新"><a href="#%E6%9B%B4%E6%96%B0">更新</a></h4> <p>submodule化したプロジェクトでpushしても自動更新されないことに注意。</p> <pre><code>cd <submodule> git pull origin <branch> </code></pre> <p><code>git diff</code>で差分が出ていることを確認。</p> <p>後は普通にadd->push</p> <p>参考リンク:</p> <p><a href="">https://qiita.com/kinpira/items/3309eb2e5a9a422199e9</a><br /> <a href="">https://qiita.com/sotarok/items/0d525e568a6088f6f6bb</a></p> tag:crieit.net,2005:PublicArticle/15061 2019-06-05T22:47:35+09:00 2019-06-05T23:36:53+09:00 https://crieit.net/posts/ojichat ojichatのおじさん文章をコミットメッセージのデフォルトにする <p>こんにちは。ななめ210(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/naname210">@naname210</a>)です。<br /> 個人開発で、物書きさん向けライブ配信サービス <a target="_blank" rel="nofollow noopener" href="https://txtlive.net">TxT Live</a> などを作ってます。</p> <h1 id="最初に"><a href="#%E6%9C%80%E5%88%9D%E3%81%AB">最初に</a></h1> <p>これは、最近Twitterなどで話題になっている <a target="_blank" rel="nofollow noopener" href="https://reverent-shirley-368990.netlify.com/">おじさん文章ジェネレーター</a> で作られた文章をGitのコミットメッセージにする方法をまとめたものです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://reverent-shirley-368990.netlify.com/">おじさん文章ジェネレーター</a>は、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/3qgt">@3qgt</a>さんが作成されて公開しているサービスです。</p> <pre><code>ヤッホー😃♥ 😘(笑)😃☀ はなチャン、元気かな❗❓🤔⁉そういえば、昨日は例のバー🍷に行ってきたよ。結構いい雰囲気だったから、オススメダヨ(^з<)(^_^) </code></pre> <pre><code>はなちゃんのお目々、キラキラ😆(^o^)してるね(^з<)こんなに可愛く😃☀ なっちゃったらお姫様みたいで僕困っちゃウヨ(・_・; </code></pre> <p>のような、おじさん風のクソリプを自動生成してくれるものになります。</p> <p>おじさん文章を作るプログラムは、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/grethlen">@grethlen</a>さんが作成している<a target="_blank" rel="nofollow noopener" href="https://github.com/greymd/ojichat">ojichat</a>が使われています。</p> <h1 id="なぜ作ったか"><a href="#%E3%81%AA%E3%81%9C%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%8B">なぜ作ったか</a></h1> <p>理由は、簡単!TwitterのTLでコミットメッセージをおじさん文章にしているのを見たからです!<br /> (これを作って記事にしようと思ったときに再度探してみましたが、見つけられませんでした。。。</p> <p>先駆者の方のものを見て、<br /> 日頃、個人開発をしているけど、共同開発と違いコミットメッセージを書くのがめんどくさくて画像のような「aaaa」「ddddd」などが並んでるなー。<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428428/48103978-8ede-b6af-4f5b-b14bc91c942e.png" alt="001.png" /></p> <p>そこで、意味のない文字列が並んでるよりおじさん文章が並んでる方が見ていて楽しくなるなー、できれば自動で挿入されてほしいなーと思ったので作りました!</p> <h1 id="環境"><a href="#%E7%92%B0%E5%A2%83">環境</a></h1> <p>・git version 2.16.2<br /> ・go version go1.12.5 darwin/amd64<br /> ・ojichat v0.2.0</p> <h1 id="作り方"><a href="#%E4%BD%9C%E3%82%8A%E6%96%B9">作り方</a></h1> <p>前提として、</p> <pre><code>$ ojichat </code></pre> <p>でojichatが使えるようになってるとします。<br /> ojichatのインストール&使い方はojichatの<a target="_blank" rel="nofollow noopener" href="https://github.com/greymd/ojichat">GitHub</a>をみてください。</p> <h2 id="Git フック"><a href="#Git+%E3%83%95%E3%83%83%E3%82%AF">Git フック</a></h2> <p>Git フックを使って作っていきます。<br /> Gitフックについては、参考文献のURLの記事を見てみてください。</p> <p>まずフックスクリプトを読み込む設定をします。<br /> 今回は、個人開発のプロジェクトのみ適用していきたいので対象をローカルにします。</p> <pre><code>$ cd git_project $ git config --local init.templatedir '~/.git' </code></pre> <p>次にフックスクリプトの作成を行います。</p> <pre><code>$ touch ~/.git/hooks/prepare-commit-msg </code></pre> <pre><code class=":prepare-commit-msg">#!/bin/sh if [ "$2" == "" ] ; then echo "`ojichat`\n`cat $1`" > $1 fi </code></pre> <p>最後にhookファイルのパーミッションを変更します。</p> <pre><code>chmod +x ~/.git/hooks/prepare-commit-msg </code></pre> <p>これで完成です!</p> <h1 id="使用すると"><a href="#%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8">使用すると</a></h1> <p>画像みたいにデフォルトでおじさん文章が挿入されます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428428/d710f600-3986-9f15-ae4c-d2257a4aafac.png" alt="002.png" /></p> <p>これでGitログが華やか?に!<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428428/2e93a785-e1f5-4d5a-14fe-31255f6ece06.png" alt="003.png" /></p> <h1 id="問題点"><a href="#%E5%95%8F%E9%A1%8C%E7%82%B9">問題点</a></h1> <p>エディタでVScodeを使ってるのですが、VScode内のGit機能には反映されない。<br /> どうにかできないか調査中。</p> <h1 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h1> <p>日頃、「aaaa」「hogehoge」などでコミットメッセージをしている方、華やかになりますよ!<br /> 個人開発に華が!おじさんだけど!</p> <p>いいねやコメントをしてくださると、嬉しいです。よろしくお願いします。</p> <h1 id="参考文献"><a href="#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</a></h1> <p>Git フックについて、Gitフックの設定の仕方で参考にさせていただきました。<br /> ・ <a target="_blank" rel="nofollow noopener" href="https://qiita.com/noraworld/items/c562de68a627ae792c6c">https://qiita.com/noraworld/items/c562de68a627ae792c6c</a><br /> ・<a target="_blank" rel="nofollow noopener" href="https://qiita.com/noraworld/items/c562de68a627ae792c6c"> https://qiita.com/mkiken/items/b7d4731a31e5559cd090</a></p> ななめ210🌑つくったのまとめるのを作ってます tag:crieit.net,2005:PublicArticle/15003 2019-05-20T18:32:12+09:00 2019-05-20T22:20:07+09:00 https://crieit.net/posts/Git-Revert Git Revert 複数コミットをまとめて取り消すときにコミットメッセージを設定する <p>「ここからここまでのコミット」と範囲を指定したrevertをして、いい感じのコミットメッセージを作る方法です。</p> <p>複数のコミットをrevertしたい場合は、単に複数のコミットを指定するか、オプション<code>--no-commit</code>でrevertコマンドを繰り返した後に<code>revert --continue</code>して確定します。どちらの場合も、コミットメッセージをコマンドラインで指定することができません。オプション<code>-e</code>はコミットメッセージを編集するためのエディタを開くもので、メッセージをコマンドラインで指定できません。*コマンドリファレンス <a target="_blank" rel="nofollow noopener" href="https://git-scm.com/docs/git-revert">Git - git-revert Documentation</a></p> <p>メッセージを指定するには、オプション<code>--no-commit</code>を実行した後に通常のコマンド<code>git commit</code>をオプション<code>-m</code>と共に実行します。from: <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/27507977/specify-commit-message-with-revert-continue">stack overflow</a></p> <p>ところで、gitには「ここからここまでのコミット」を表す記法があります。例えば、<code>master..HEAD</code>の「<code>..</code>」みたいなやつ。詳しくはここに書いてあります、<a target="_blank" rel="nofollow noopener" href="https://git-scm.com/book/ja/v2/Git-のさまざまなツール-リビジョンの選択#コミットの範囲指定">Git Book コミットの範囲指定</a>。revertコマンドでは、この記法で複数コミットを指定できます。</p> <p>以下のコマンドではbashの文字列展開を使って、すべての取り消し対象コミットのメッセージの先頭行を結合したテキストを作ります。</p> <pre><code class="bash">$ ref=[ここまで戻したいコミット、タグ] $ git revert --no-commit $ref..HEAD $ git commit -m "Revert to $ref" -m "$(eval "git log --pretty=oneline $ref..HEAD")" # 確認 $ git diff $ref HEAD </code></pre> <ul> <li><code>revert --no-commit</code>で、チェリーピッキング <ul> <li><code>revert --continue</code>するとメッセージが指定できない</li> </ul></li> <li>commit -mしてしまえばいい <ul> <li><code>-m</code>オプションを複数書いたら改行して追加される</li> </ul></li> <li>bashで入れ子の文字列展開には<code>eval</code>を使う <ul> <li><code>"$(eval "$var")"</code></li> </ul></li> </ul> あぜち(おばあちゃん) tag:crieit.net,2005:PublicArticle/14940 2019-04-21T22:24:31+09:00 2019-04-24T12:19:15+09:00 https://crieit.net/posts/URL-netlify-Large-Media URLパラメータで簡単画像リサイズ。netlify の Large Media が便利! <h1 id="netlify の Large Media とは"><a href="#netlify+%E3%81%AE+Large+Media+%E3%81%A8%E3%81%AF">netlify の Large Media とは</a></h1> <p>Git レポジトリでサイトコンテンツを管理する際に、画像やPSD/ZIPなどの大きいファイルを含めて管理するために Git LFS(Git Large File Strage)と仕組みがある。<br /> LFS については細かく触れないが、LFS を使って netlify にデプロイされた画像を、URLパラメータをつかってリサイズやクロップが便利に扱えるように使える神機能である。</p> <p>Large Media 公式ドキュメント<br /> <a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/docs/large-media/#enabling-netlify-large-media">https://www.netlify.com/docs/large-media/#enabling-netlify-large-media</a></p> <p>Git LFS 公式サイト<br /> <a target="_blank" rel="nofollow noopener" href="https://git-lfs.github.com/">https://git-lfs.github.com/</a></p> <h2 id="netlify Large Media のサンプル"><a href="#netlify+Large+Media+%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">netlify Large Media のサンプル</a></h2> <p>例えば、普通に gitレポジトリ に含めて github などを介して netlify デプロイすると、このようなURLで画像にアクセスできる。</p> <p><a target="_blank" rel="nofollow noopener" href="https://netlify-photo-gallery.netlify.com/images/apple.jpg">https://netlify-photo-gallery.netlify.com/images/apple.jpg</a><br /> <img src="https://netlify-photo-gallery.netlify.com/images/apple.jpg?nf_resize=fit&w=1000&h=1000" alt="りんご画像" /></p> <p>これにこんな形で、最後に <code>?nf_resize=fit&w=200</code> を加えてやると、リサイズされた画像を生成して返してくれるのだ。<br /> <a target="_blank" rel="nofollow noopener" href="https://netlify-photo-gallery.netlify.com/images/apple.jpg?nf_resize=fit&w=200">https://netlify-photo-gallery.netlify.com/images/apple.jpg?nf_resize=fit&w=200</a><br /> <img src="https://netlify-photo-gallery.netlify.com/images/apple.jpg?nf_resize=fit&w=200" alt="リサイズされたりんご画像" /></p> <p>さらに次は、画像URLにの最後に <code>?nf_resize=smartcrop&w=200</code> を加えてやると、クロップされた画像を生成して返してくれる。</p> <p><img src="https://netlify-photo-gallery.netlify.com/images/apple.jpg?nf_resize=smartcrop&w=200&h=200" alt="クロップされたりんご画像" /></p> <p>1つ画像をアップするだけでいい感じにリサイズされた画像やクロップされたをすぐに使えるのだ!神すぎないか?</p> <p>これが <strong>netlify Large Media</strong> 機能だ。</p> <p>公式サンプルに Transformation demo とジェネレーターがあるので、もう少し触ってみたいかたはこちら。<br /> <a target="_blank" rel="nofollow noopener" href="https://netlify-photo-gallery.netlify.com">https://netlify-photo-gallery.netlify.com</a></p> <h2 id="netlify Large Media の使い方"><a href="#netlify+Large+Media+%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9">netlify Large Media の使い方</a></h2> <h3 id="環境準備"><a href="#%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">環境準備</a></h3> <p>最初に一度ローカル環境を準備する必要がある。</p> <h4 id="バージョン確認"><a href="#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%A2%BA%E8%AA%8D">バージョン確認</a></h4> <p><code>git lfs version</code><br /> Git LFS version: v2.5.1以上 を確認<br /> なければ、Git LFS をインストール。詳細は公式サイトで割愛<br /> <a target="_blank" rel="nofollow noopener" href="https://git-lfs.github.com/">https://git-lfs.github.com/</a></p> <p><code>netlify -v</code><br /> netlify-cli: 2.6.4以上 を確認</p> <p>なければ、netlify-cli をインストール。詳細は公式ドキュメントで割愛<br /> <a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/docs/cli/">https://www.netlify.com/docs/cli/</a></p> <h4 id="large media プラグインインストール"><a href="#large+media+%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">large media プラグインインストール</a></h4> <p>バージョン確認後、netlify-cliのプラグインをインストール</p> <pre><code>netlify plugins:install netlify-lm-plugin netlify lm:install </code></pre> <p>これで環境準備は完了</p> <h3 id="サイト(レポジトリ)ごとの設定"><a href="#%E3%82%B5%E3%82%A4%E3%83%88%EF%BC%88%E3%83%AC%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%EF%BC%89%E3%81%94%E3%81%A8%E3%81%AE%E8%A8%AD%E5%AE%9A">サイト(レポジトリ)ごとの設定</a></h3> <p>Large Media 機能を使うには、サイトごとに機能を ON にしないといけないので、サイトごとで設定。<br /> 1. まずは、netlifyでプロジェクトを作成 と github レポジトリが紐付いていることを確認<br /> 2. その後、ローカルのレポジトリも紐付ける</p> <pre><code>netlify link </code></pre> <p>3.セットアップコマンドをつ</p> <pre><code>netlify lm:setup </code></pre> <p>4.セットアップコマンドをつ<br /> <code>git status</code> で、<code>.lfsconfig</code> が生成されていることを確認し、git add で<code>.lfsconfig</code>を git の管理下におく。</p> <h3 id="LFS で管理する"><a href="#LFS+%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B">LFS で管理する</a></h3> <p>サイトごとの設定の他に、LFS でファイルを管理する必要があるので、</p> <p>画像ごとでトラッキングしていくか、gitignore の <a target="_blank" rel="nofollow noopener" href="https://git-scm.com/docs/gitignore#_pattern_format">pattern rules</a> も使えるので、LFSで管理するように指定していく。</p> <pre><code>git lfs track "sample.jpeg" git lfs track "*.jpeg" </code></pre> <p>トラッキングされたファイル一覧はこちらで確認可能。</p> <pre><code>git lfs track </code></pre> <p>トラッキング時には <code>.gitattributes</code> が生成されるので、こちらも git add と commit して管理する。</p> <p>詳しくは netlify のドキュメント、または、Git LFS 公式サイトで。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/docs/large-media/#large-media-file-tracking-configuration">https://www.netlify.com/docs/large-media/#large-media-file-tracking-configuration</a></p> <h3 id="確認"><a href="#%E7%A2%BA%E8%AA%8D">確認</a></h3> <p>うまくnetlify large media の設定と LFS で設定できていれば、あとはいつもどおりレポジトリに push をするだけで、large media 機能がつかえるようになる。</p> <p><a target="_blank" rel="nofollow noopener" href="https://lfs-test.netlify.com/sample.jpeg?nf_resize=smartcrop&w=100&h=200">https://lfs-test.netlify.com/sample.jpeg?nf_resize=smartcrop&w=100&h=200</a><br /> <img src="https://lfs-test.netlify.com/sample.jpeg?nf_resize=smartcrop&w=100&h=200" alt="木" /><br /> 最初のサンプルのようにパラメーターをつけるだけで、Large Media が使えるようになっている!</p> <p>正常に動いていれば、netlify 管理画面もこんな感じに、ドキュメントのリンクの画面から管理している画像の一覧に変わります。</p> <h3><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6531/1c50d7f0-e372-775d-df7d-379669687ba4.png" alt="Screen Shot on 0031-04-21 at 21:41:59.png" /></h3> <p>公式のサンプルもあるけど、自分でためしたサンプルも一応<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/yahsan2/lfs-test">https://github.com/yahsan2/lfs-test</a></p> <h2 id="netlify Large Media と CMS"><a href="#netlify+Large+Media+%E3%81%A8+CMS">netlify Large Media と CMS</a></h2> <p>この netlify large media 機能は、 netlify CMS をつかって画像をアップロードする lfs として画像をコミットしてくれるので、この機能を簡単につかえるので、netlifyCMS もおすすめですね。つまり画像リサイズをもった JAMstack な CMS も簡単につくれるわけです。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.netlifycms.org/docs/netlify-large-media/">https://www.netlifycms.org/docs/netlify-large-media/</a></p> <p>なんか静的サイトホスティングサービスでシンプルなのに、このかゆいところにどんどん手が届いてく netlify 拡張具合ほんとファンです。</p> yahsan2 tag:crieit.net,2005:PublicArticle/14552 2018-09-25T22:40:57+09:00 2018-10-30T20:29:38+09:00 https://crieit.net/posts/9c710ef2383a3703649ee712a9eb86e6 一人プルリクエストのすゝめ <p>プルリクエストといえばGitHub等で業務の際やOSSに貢献する際などに利用する、自分の対応したブランチを取り込んでもらうための仕組みですが、何気に一人で使うのにもメリットがあったりします。どういったメリットがあるのか紹介します。</p> <h2 id="とりあえずGitHubでプルリクエストを作成してみる"><a href="#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9AGitHub%E3%81%A7%E3%83%97%E3%83%AB%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">とりあえずGitHubでプルリクエストを作成してみる</a></h2> <p>何にしろまずプルリクエストをGitHub上で作成してみます。ちなみにGitHubだけでなく、BitBucketやGitLab等でも同様のことは可能です。</p> <h3 id="ブランチを作成"><a href="#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%82%92%E4%BD%9C%E6%88%90">ブランチを作成</a></h3> <p>まずはブランチを作成します。エディタやGitクライアントの機能でも良いですし、コマンドラインで作成する場合は下記のように実行します。</p> <pre><code class="sh">git branch prtest </code></pre> <p>これで現在のブランチを基底にしたprtestというブランチが作成されます。作業ブランチをこのprtestに切り替えておきます。</p> <pre><code class="sh">git checkout prtest </code></pre> <h3 id="ブランチにコミットする"><a href="#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AB%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%99%E3%82%8B">ブランチにコミットする</a></h3> <p>適当に何かのファイルを編集し、コミットします。今回はREADME.mdを更新しました。</p> <pre><code class="sh">git add README.md git commit -m "Update README" </code></pre> <h3 id="GitHubにpushする"><a href="#GitHub%E3%81%ABpush%E3%81%99%E3%82%8B">GitHubにpushする</a></h3> <p>pushしてGitHubのリポジトリを更新します。</p> <pre><code class="sh">git push origin prtest </code></pre> <p>すると、この時点でGitHubのリポジトリを見てみると下記の画像の様に黄色背景のところのような感じで、最近pushしたブランチが表示されています。このようにして簡単にプルリクエストを作成できるようになっています。ここの「Compare & pull request」ボタンを押してプルリクエストの作成画面へ移動しましょう。(プルリクエスト一覧ページからでも作成できます)</p> <p><a href="https://crieit.now.sh/upload_images/70cf4f5d038879f51dda83ad6b3005235baa2c281553b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/70cf4f5d038879f51dda83ad6b3005235baa2c281553b.png?mw=700" alt="prnotify.png" /></a></p> <h3 id="プルリクエストを作成する"><a href="#%E3%83%97%E3%83%AB%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">プルリクエストを作成する</a></h3> <p>ボタンを押すと下記のような画面が表示されます。</p> <p><a href="https://crieit.now.sh/upload_images/b5e51e8e390b12639872817832ee1e595baa2dd378828.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b5e51e8e390b12639872817832ee1e595baa2dd378828.png?mw=700" alt="pr.png" /></a></p> <p>色々と入力欄がありますが、一人でやっている場合はとりあえずわかりやすい件名を入れておけば十分でしょう。あとは整理したければ気分で色々と入力しておいてください。必要な箇所を入力したら「Create pull request」を実行します。</p> <h2 id="プルリクエスト詳細画面"><a href="#%E3%83%97%E3%83%AB%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E8%A9%B3%E7%B4%B0%E7%94%BB%E9%9D%A2">プルリクエスト詳細画面</a></h2> <p>作成すると、下記のようなプルリクエストの詳細画面にアクセスすることができるようになります。</p> <p><a href="https://crieit.now.sh/upload_images/e0543cdc0b85799df248d2f55c1732305baa31d33577d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e0543cdc0b85799df248d2f55c1732305baa31d33577d.png?mw=700" alt="prdetail.png" /></a></p> <p>この画面では、先程追加したコミットが表示されています。今後このブランチにコミットを行うと、ここに列挙されます。そのため、このブランチで何をやっているかというのが非常にわかりやすくなります。</p> <h3 id="コミットの粒度"><a href="#%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%AE%E7%B2%92%E5%BA%A6">コミットの粒度</a></h3> <p>Gitについて調べた方の中には、「コミットの粒度」がどうとか、というのを見たことがある人もいるのではないかと思います。このプルリクエスト画面を見ると、どういったコミットが積まれているかをわかりやすく見ることができますので、なんとなくいい感じに並べてみたい気分になったりしませんか?</p> <p>一人でやっている場合は恐らくセーブ感覚で適当なところで「ひとまずセーブ」みたいな感じでコミットしている場合も多いかもしれませんが、せっかくなので各コミットで何をやっているかをわかりやすく書いてコミットしてきましょう。「投稿機能を追加」とか、「トップページのデザインを変更」のような感じです。OSSにも貢献してみたい場合などは英語で練習しておいても良いと思います。</p> <h3 id="File Changed"><a href="#File+Changed">File Changed</a></h3> <p>File Changed画面も非常に有用です。開いてみると下記のような画面が表示されます。</p> <p><a href="https://crieit.now.sh/upload_images/254e66e25595db2986770092894472405baa346fa8b46.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/254e66e25595db2986770092894472405baa346fa8b46.png?mw=700" alt="filechanged.png" /></a></p> <p>このように、このプルリクエストの差分を見やすく表示してくれます。今まではコンソール上で<code>git diff</code>等で差分を確認していた方もいると思いますが、このようにGitHub上で確認ができると便利です。マージ前に自分でざっとセルフレビューして変なデバッグ処理が混じってしまっていたりしないかなどを見ることができますし、このプルリクエストはマージしてプルリクエストがクローズされた後も閲覧できますので、「あの時のプルリクエストって何を変更してたっけな~」という場合にもブラウザだけで非常に簡単に確認しやすいです。</p> <p>ただ、ここもファイル数や行数がとんでもない量になるとカクカクになってしまいますので、プルリクエスト自体もなるべく必要最低限の粒度に調整することが、綺麗なプルリクエストの運用の仕方になります。</p> <h2 id="マージする"><a href="#%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%99%E3%82%8B">マージする</a></h2> <p>最初の画面にあった、「Merge pull request」ボタンを押すとここでいうprtestブランチがmasterブランチにマージされます。ブランチを削除するかどうか聞かれますので、削除しましょう。この対応に対して修正が必要な場合はこのブランチ内で修正するのではなく、別途修正用のブランチを作成して別のプルリクエストを作成します。もったいないからと残しておく必要はありません。だらだらと残しておくとよく分からないブランチが溜まっていきますので、終わったら即削除です。</p> <p>基本的にはこれで完了です。masterにはマージコミットだけが残りますので、万が一差し戻しなどが必要になった時なども簡単にrevertできます。masterブランチにCIを入れている場合はこのタイミングで実行されると思いますのでデプロイもCIに組み込んでいる場合などはGitHubの画面上だけでデプロイができます。</p> <h3 id="コンフリクトした場合は"><a href="#%E3%82%B3%E3%83%B3%E3%83%95%E3%83%AA%E3%82%AF%E3%83%88%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF">コンフリクトした場合は</a></h3> <p>色々やり方はあると思いますが、とりあえずローカルで該当ブランチに切り替えている状態で<code>git rebase master</code>し、コンフリクトを解消してから<code>git push origin prtest --force</code>みたいな感じでpushし直せば良いと思います。</p> <p>forceはしちゃいけない、みたいな記述を見たことがある方もいるかもしれませんが、それはあくまでもmasterブランチや、どこかで稼働させているブランチなどに対してのことです。今回のような何かの対応用のトピックブランチは自分しか使うことはなく何にも影響を与えることは無いのでマージするまでは割と適当でOKですので、force pushしてしまって問題ないです。(ただし操作ミスで間違えてmasterにforce pushしないようにしましょう)</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とにかく、プルリクエスト画面自体が非常に便利なものなので、今まで仕事じゃないし関係ないや、と思って使っていなかった方も、是非使ってみた方が楽しいと思います。</p> <p>一人プルリクエストはオススメです。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14531 2018-09-10T17:12:08+09:00 2018-10-31T11:56:54+09:00 https://crieit.net/posts/Git-log-graph Git log --graph を美しくする <h1 id="Git log --graph を美しくする"><a href="#Git+log+--graph+%E3%82%92%E7%BE%8E%E3%81%97%E3%81%8F%E3%81%99%E3%82%8B">Git log --graph を美しくする</a></h1> <p>.git/configに以下を追記。</p> <pre><code>[alias] lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative lga = log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative </code></pre> <p><code>git lg</code>、<code>git lga</code> と打つと、以下のように表示される。</p> <pre><code>fk2000@localhost:fk2000[master] $ git lg * 67ea281 - (HEAD -> master, origin/master, origin/HEAD) merge (4 months ago) <fk2000> * 7f8dc4f - (tag: 1.0.3) avatar.png change (4 months ago) <fk2000> * 277f2bb - (tag: 1.0.2) package.json (4 months ago) <fk2000> * eb37736 - screenshot change (4 months ago) <fk2000> * 32aaadf - 1.0.1 (4 months ago) <fk2000> * bfbad84 - (tag: 1.0.1) package.json edit (4 months ago) <fk2000> * 529c4a0 - fallback delete (4 months ago) <fk2000> * e2e47c4 - unicorn delete (4 months ago) <fk2000> * 8a251f0 - avater change (4 months ago) <fk2000> * 148b3ef - (tag: 1.0.0) first commit (4 months ago) <fk2000> * f7c11d3 - Use smart quotes (#3) (4 months ago) <Federico Brigante> * 7d0152f - (tag: v2.0.1) 2.0.1 (4 months ago) <Sindre Sorhus> * 9495759 - <U+1F411> (4 months ago) <Sindre Sorhus> * a0da995 - (tag: v2.0.0) 2.0.0 (4 months ago) <Sindre Sorhus> * ce0eb73 - Init (4 months ago) <Sindre Sorhus> fk2000@localhost:fk2000[master] $ </code></pre> fk2000