<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://ebiyuu.com/">
  <title>Yusuke Ebihara&#39;s blog</title>
  <subtitle></subtitle>
  <link href="https://ebiyuu.com/feed.xml" rel="self"/>
  <link href="https://ebiyuu.com/"/>
  <updated>2026-05-13T00:00:00Z</updated>
  <id>https://ebiyuu.com/</id>
  <author>
    <name>Yusuke Ebihara</name>
    <email>yusuke@ebihara.com</email>
  </author>
  <entry>
    <title>ブログをはじめました。</title>
    <link href="https://ebiyuu.com/post/2020/06/hello/"/>
    <updated>2020-06-23T20:25:17Z</updated>
    <id>https://ebiyuu.com/post/2020/06/hello/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;ブログを始めました。&lt;/p&gt;
&lt;p&gt;まずは自己紹介。プログラミングや電気系に興味がある理系の大学生です。&lt;/p&gt;
&lt;p&gt;自分自身色々学んでいる途中ということで、自分の学んだことをメモしつつ、誰かの役に立てばいいなあと思いながらゆるく書いていきたいと思っています。&lt;/p&gt;
&lt;p&gt;それではこれからよろしくお願いします。&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Google製の正規表現ライブラリ「RE2」をpythonで動かす</title>
    <link href="https://ebiyuu.com/post/2020/06/re2/"/>
    <updated>2020-06-23T20:27:05Z</updated>
    <id>https://ebiyuu.com/post/2020/06/re2/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;&lt;strong&gt;状況が変わっているため、 &lt;a href=&quot;https://ebiyuu.com/post/2025/08/python-re2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google製の正規表現ライブラリ「RE2」をpythonで動かす - 2025版&lt;/a&gt; を参照してください。&lt;/strong&gt; (2025/08/14追記)&lt;/p&gt;
&lt;p&gt;python で Google の正規表現ライブラリ「RE2」を使いたかったが、インストールで困ったのでメモ。&lt;/p&gt;
&lt;h2 id=&quot;re2-%E3%81%A8%E3%81%AF&quot; tabindex=&quot;-1&quot;&gt;RE2 とは&lt;/h2&gt;
&lt;p&gt;RE2 は Google によって開発されている正規表現ライブラリ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/re2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;google/re2: RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RE2 was designed and implemented with an explicit goal of being able to handle regular expressions from untrusted users without risk. One of its primary guarantees is that the match time is linear in the length of the input string. It was also written with production concerns in mind: the parser, the compiler and the execution engines limit their memory usage by working within a configurable budget – failing gracefully when exhausted – and they avoid stack overflow by eschewing recursion.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://github.com/google/re2/wiki/WhyRE2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/google/re2/wiki/WhyRE2&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;高速な正規表現ライブラリで、計算量が入力文字列の長さに対して線形になるアルゴリズムを採用している。正規表現の計算量を利用した&lt;a href=&quot;https://qiita.com/prograti/items/9b54cf82a08302a5d2c7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ReDoS 攻撃&lt;/a&gt;を防げるらしい。&lt;/p&gt;
&lt;p&gt;詳細は下の記事に詳しく書いてあった。&lt;/p&gt;
&lt;figure class=&quot;wp-block-embed is-type-rich is-provider-hatena-blog&quot;&gt;
&lt;iframe src=&quot;https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnaoyat.hatenablog.jp%2Fentry%2F2012%2F01%2F12%2F220812&quot; title=&quot;高速かつ省メモリなGoogleの正規表現ライブラリ re2 についてのメモ - naoya_t@hatenablog&quot; class=&quot;embed-card embed-blogcard&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;インストールする&lt;/h2&gt;
&lt;h3 id=&quot;pip-%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;pip でインストールしてみる&lt;/h3&gt;
&lt;p&gt;何も考えずに pip でインストールしてみた。&lt;/p&gt;
&lt;pre class=&quot;wp-block-preformatted shell&quot;&gt;$ pip install re2&lt;/pre&gt;
&lt;p&gt;インストールに失敗した。&lt;/p&gt;
&lt;pre class=&quot;wp-block-preformatted shell&quot;&gt;_re2.cc:37:10: fatal error: re2/re2.h: No such file or directory
     #include &lt;re2 re2.h=&quot;&quot;&gt;
              ^~~~~~~~~~~
    compilation terminated.
    error: command &#39;gcc&#39; failed with exit status 1&lt;/re2&gt;&lt;/pre&gt;
&lt;h3 id=&quot;%E6%9C%AC%E4%BD%93%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;本体のインストール&lt;/h3&gt;
&lt;p&gt;ちゃんとドキュメントを読んでみる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pypi.org/project/re2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;re2 · PyPI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/axiak/pyre2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;axiak/pyre2: Python wrapper for RE2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitHub の readme にちゃんと書いてあった。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To install, you must first install the prerequisites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;http://code.google.com/p/re2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;re2 library from Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Python development headers (e.g. &lt;em&gt;sudo apt-get install python-dev&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;A build environment with &lt;code&gt;g++&lt;/code&gt; (e.g. &lt;em&gt;sudo apt-get install build-essential&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;RE2 本体のインストールが必要らしい。（python-dev・build-seential はすでに入っていたのか、インストールする必要はなかった）&lt;/p&gt;
&lt;p&gt;apt-get からインストールできるようなので利用する。（&lt;a href=&quot;https://www.hexacosa.net/blog/detail/120/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;参考&lt;/a&gt;）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install -y re2 $ pip install re2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;無事インストールが完了した。&lt;/p&gt;
&lt;p&gt;公式リポジトリでは &lt;code&gt;easy_install&lt;/code&gt; の使用が推奨されていたようだが、&lt;a href=&quot;https://setuptools.readthedocs.io/en/latest/easy_install.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;easy_install は deprecated なようなので&lt;/a&gt;今回は pip を採用した。&lt;/p&gt;
&lt;h3 id=&quot;%E3%81%86%E3%81%BE%E3%81%8F%E8%A1%8C%E3%81%A3%E3%81%9F%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%8C..&quot; tabindex=&quot;-1&quot;&gt;うまく行ったと思ったが..&lt;/h3&gt;
&lt;p&gt;インストールできたかのように思えたが、まだ罠が待っていた。&lt;/p&gt;
&lt;p&gt;ドキュメントのとおりに import する。標準の re モジュールをオーバーラップしているので置き換えるだけで同じように動作するようだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import re2 as re
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;File &amp;quot;/code/cms/functions.py&amp;quot;, line 1, in import re2 File &amp;quot;re2.pyx&amp;quot;, line 1, in init re2 (src/re2.cpp:13681) NameError: basestring
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;エラーが発生してしまった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackovernet.xyz/ja/q/12827277&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python3 で re2 を使う&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PyPI 版の re2 モジュールは python3 に対応していないから GitHub から直接 pip でインストールするといいいらしい。&lt;/p&gt;
&lt;p&gt;せっかくなので RE2 のリポジトリからリンクを貼られている Facebook のリポジトリのほうがメンテナンスされてイそうなので、こちらからインストールすることにする。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/facebook/pyre2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;facebook/pyre2: Python wrapper for RE2&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; git+https://github.com/facebook/pyre2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;無事インストールが完了し、実行することができた。&lt;/p&gt;
&lt;p&gt;ベンチマーク結果などは以下の記事にあったので参考までに。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RE2 本体と Python ラッパーのインストールが必要。&lt;/li&gt;
&lt;li&gt;PyPI でホスティングされているリポジトリ（&lt;a href=&quot;https://github.com/axiak/pyre2/issues/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;axiak/pyre2&lt;/a&gt;）が Python3 に対応していないなど、メンテナンスされてない感じがあって残念&lt;/li&gt;
&lt;li&gt;RE2 のリポジトリからリンクされていてそこそこメンテナンスもされている&lt;a href=&quot;https://github.com/facebook/pyre2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;facebook/pyre2&lt;/a&gt;を使うと良さそう。&lt;/li&gt;
&lt;li&gt;pip コマンドを使って GitHub から直接インストールすることができる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hexacosa.net/blog/detail/120/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pyre2 を使ってみた | hexacosa.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverrun.com/ja/q/12827277&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python3 で re2 を使う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/mktakuya/items/8e76b9f720dd1d0e02bb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub のリポジトリを pip install - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://naoyat.hatenablog.jp/entry/2012/01/12/220812&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;高速かつ省メモリな Google の正規表現ライブラリ re2 についてのメモ - naoya_t@hatenablog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/veltra-engineering/regexp-library-re2-for-fragility-risk-7c28310838e0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RE2：脆弱な正規表現のリスクをゼロにするライブラリ - VELTRA Engineering - Medium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Windowsのscoopが便利という話</title>
    <link href="https://ebiyuu.com/post/2020/07/scoop/"/>
    <updated>2020-06-30T20:44:54Z</updated>
    <id>https://ebiyuu.com/post/2020/07/scoop/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;windows でプログラミングをやる人全員におすすめしたいパッケージ管理ツール「scoop」を紹介する。&lt;/p&gt;
&lt;h2 id=&quot;%E3%80%8C%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E3%80%8D%E3%81%A8%E3%81%AF&quot; tabindex=&quot;-1&quot;&gt;「パッケージ管理ツール」とは&lt;/h2&gt;
&lt;p&gt;僕はもともと mac ユーザーであるが、mac には有名なパッケージ管理ツール「homebrew」がある。（Linux だと&lt;code&gt;yum&lt;/code&gt;やら&lt;code&gt;apt&lt;/code&gt;やらがある。）&lt;/p&gt;
&lt;p&gt;パッケージ管理ツールはソフトウェアのインストール&amp;amp;管理（そしてそのソフトウェアを動かすのに必要なソフトのインストール）を行ってくれる便利ツールである。特に手動でやると色々面倒な環境構築をコマンド一発でできるので便利なのだ。&lt;/p&gt;
&lt;p&gt;mac の場合、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ brew install python3 $ brew install php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;などのように実行するだけで環境が構築できる（mac で homebrew を使ってない人は使いましょう）&lt;/p&gt;
&lt;h2 id=&quot;windows-%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;Windows のパッケージ管理ツール&lt;/h2&gt;
&lt;p&gt;Windows のパッケージ管理ツールとして有名なものとしては Chocolatey や Scoop があるらしいので調べてみた。&lt;/p&gt;
&lt;h3 id=&quot;chocolatey&quot; tabindex=&quot;-1&quot;&gt;Chocolatey&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://chocolatey.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://chocolatey.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一番有名らしいが、ネットで下調べしたところ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;毎回管理者権限を要求される&lt;/li&gt;
&lt;li&gt;アンインストールによく失敗する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などの短所が書いてあったので見送った。（パッケージ管理ツールを使う理由の一つが楽にアンインストールしたいってことなのでアンインストールできないのは致命的）&lt;/p&gt;
&lt;h3 id=&quot;scoop&quot; tabindex=&quot;-1&quot;&gt;scoop&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://scoop.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://scoop.sh/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Linux のパッケージ管理ツールをイメージしてる作られたらしい。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.satotaichi.info/scoop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.satotaichi.info/scoop/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このブログが一番わかりやすかった。&lt;/p&gt;
&lt;p&gt;Docker も入ったりするらしい。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/watahani/items/9551e22e0f9d42c35672&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://qiita.com/watahani/items/9551e22e0f9d42c35672&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;windows-package-manager&quot; tabindex=&quot;-1&quot;&gt;Windows Package Manager&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/commandline/windows-package-manager-preview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devblogs.microsoft.com/commandline/windows-package-manager-preview/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Microsoft が公式に開発しているパッケージ管理ツールのようである。今後のスタンダードになるといいなあと思いつつ、今回は情報が少ないということで見送った。&lt;/p&gt;
&lt;h2 id=&quot;%E8%A9%A6%E3%81%97%E3%81%9F&quot; tabindex=&quot;-1&quot;&gt;試した&lt;/h2&gt;
&lt;p&gt;scoop をインストールしてみた。&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;インストール&lt;/h3&gt;
&lt;p&gt;公式サイトを参考にしてインストールする。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://scoop.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://scoop.sh/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Powershell（管理者として実行）で以下のコマンドを実行するだけ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Invoke-Expression (New-Object System.Net.WebClient).DownloadString(&#39;https://get.scoop.sh&#39;) # or shorter iwr -useb get.scoop.sh | iex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;実行に失敗した場合は下のコマンドで実行ポリシーをする必要があるらしい。（僕は必要なかった）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned -scope CurrentUser
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;使ってみる&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ scoop install php $ scoop install iverilog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;特に時間は測ってないけど結構速くインストールできた。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今回は scoop をインストールしてみた&lt;/li&gt;
&lt;li&gt;ちょっと使ってみた感じ使いやすかった。&lt;/li&gt;
&lt;li&gt;そのうち、汚れた windows 環境を一旦クリーンインストールして scoop で環境構築したい。&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Kenkyuu.htmlを読んだ</title>
    <link href="https://ebiyuu.com/post/2020/07/kenkyuu/"/>
    <updated>2020-07-09T20:51:47Z</updated>
    <id>https://ebiyuu.com/post/2020/07/kenkyuu/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;&lt;a href=&quot;http://hori.k.u-tokyo.ac.jp/essay/kenkyuu.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Kenkyuu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;東大の堀先生が書かれたページを学科の先輩から教えてもらったので読んでみた。&lt;/p&gt;
&lt;p&gt;「研究者を目指す普通の学生諸君に」という題目で、博士課程の学生に向けて書いたもののようである。&lt;/p&gt;
&lt;p&gt;これを読んで最初に出てきた感想は「厳しすぎる」だった。こんな厳しいことまで言われて研究なんかしたくない、と思った。でも、それが研究するということなのだなあとも思った。&lt;/p&gt;
&lt;p&gt;今はまだ学部 3 年生、進振りを終えて工学部に進んでまだ半年も経たない、研究の&amp;quot;け&amp;quot;の字も知らないような学生である。研究生活も、なんか適当にテーマ決めてもらってあとは今までのレポートと同じように惰性で終わらせれるものだという考えが奥底にはあった（今もあるかもしれない）。「研究がつらい」という発言を聞いても「いつものやつね」程度の認識しかなかった。&lt;/p&gt;
&lt;p&gt;たった１ページ分を読んだだけだが、自分の進むことになるかもしれない研究室の先生の言葉ということもあり、とても重く考えさせられた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tooshitaka.hatenablog.com/entry/2017/01/27/121607&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;「研究者を目指す普通の学生諸君に」を読んだ話 - tooshitaka’s diary&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上のブログも見つけた。こちらはもう研究生活を終えた方の言葉ということもあり、これも説得力があった。&amp;quot;ある程度の試行錯誤で研究をしてきて失敗もした学生じゃないと共感できないかもしれない&amp;quot;という言葉も本当なのだろうなあと感じた。&lt;/p&gt;
&lt;p&gt;研究室配属まで 1 年を切っているが、今一番すべきことはひたすら勉強することだと思うので、とりあえず勉強します（泣）&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title> Windowsでyarnが動かなかった。</title>
    <link href="https://ebiyuu.com/post/2020/07/yarn/"/>
    <updated>2020-07-28T20:47:59Z</updated>
    <id>https://ebiyuu.com/post/2020/07/yarn/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;mac で開発していた Nuxt のソースコードを windows に持ってきた。&lt;/p&gt;
&lt;p&gt;yarn の開発環境は scoop で構築した。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ scoop install node yarn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これでコンパイル！しようとしたら失敗した。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ yarn run generate yarn run v1.22.4 &amp;gt; $ nuxt generate &#39;nuxt&#39; is not recognized as an internal or external command, operable program or batch file. error Command failed with exit code 1. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nuxt が見つからないよ！って怒られてるらしい。もちろんちゃんと yarn での nuxt のインストールはしてあるので、エラーになるのはよくわからない。&lt;/p&gt;
&lt;h2 id=&quot;%E8%A7%A3%E6%B1%BA%E7%AD%96&quot; tabindex=&quot;-1&quot;&gt;解決策&lt;/h2&gt;
&lt;p&gt;調べてみたところ、&lt;code&gt;cross-env&lt;/code&gt;を使うといいらしい。&lt;/p&gt;
&lt;p&gt;まずは&lt;code&gt;cross-env&lt;/code&gt;のインストール&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ yarn global add cross-env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;それに加えて、&lt;code&gt;package.json&lt;/code&gt;の書き換えを行う。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- &amp;quot;dev&amp;quot;: &amp;quot;nuxt&amp;quot;, - &amp;quot;build&amp;quot;: &amp;quot;nuxt build&amp;quot;, - &amp;quot;start&amp;quot;: &amp;quot;nuxt start&amp;quot;, - &amp;quot;generate&amp;quot;: &amp;quot;nuxt generate&amp;quot;, + &amp;quot;dev&amp;quot;: &amp;quot;cross-env nuxt&amp;quot;, + &amp;quot;build&amp;quot;: &amp;quot;cross-env nuxt build&amp;quot;, + &amp;quot;start&amp;quot;: &amp;quot;cross-env nuxt start&amp;quot;, + &amp;quot;generate&amp;quot;: &amp;quot;cross-env nuxt generate&amp;quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これで実行すると成功した。&lt;/p&gt;
&lt;p&gt;cross-env は、「開発環境ごとの差異を吸収してくれる」ということらしいが、よくわかっていない。&lt;/p&gt;
&lt;p&gt;node のライブラリは全体的によくわからないものしかない。&lt;/p&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.it-swarm-ja.tech/ja/vue.js/nuxt%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%82%A8%E3%83%A9%E3%83%BC%EF%BC%9A%E3%80%8C-&#39;nuxt&#39;%E3%81%AF%E5%86%85%E9%83%A8%E3%81%BE%E3%81%9F%E3%81%AF%E5%A4%96%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%8D%E8%AD%98%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%8D/809710738/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;vue.js — nuxt プロジェクトの実行エラー：「 &#39;nuxt&#39;は内部または外部コマンドとして認識されません」&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DockerでCodiMDを構築した</title>
    <link href="https://ebiyuu.com/post/2020/08/codimd/"/>
    <updated>2020-08-01T04:09:49Z</updated>
    <id>https://ebiyuu.com/post/2020/08/codimd/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;同時編集できるオンラインの Markdown エディタ「HackMD」がある。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hackmd.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HackMD - Collaborative Markdown Knowledge Base&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これのオープンソース版の「CodiMD」を、自分のサーバー上に構築してみた。&lt;/p&gt;
&lt;h2 id=&quot;docker-%E3%81%AE%E8%A8%AD%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;docker の設定&lt;/h2&gt;
&lt;p&gt;公式サイトを参考にする。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hackmd.io/s/codimd-docker-deployment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker Deployment - HackMD&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新しいフォルダを作り、 &lt;code&gt;docker-compose.yml&lt;/code&gt; を作成して編集する。
DB のパスワードは &lt;code&gt;.env&lt;/code&gt; ファイルに書き出す（git にはコミットしない）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.
├─docker-compose.yml
├─.gitignore
└─.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker-compose.yml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &#39;3&#39;

services:
    db:
        image: postgres:11.6-alpine
        environment:
            - POSTGRES_USER=${DB_USER}
            - POSTGRES_PASSWORD=${DB_PASSWD}
            - POSTGRES_DB=codimd
        volumes:
            - &amp;quot;db-data:/var/lib/postgresql/data&amp;quot;
        restart: always
    codimd:
        image: nabo.codimd.dev/hackmdio/hackmd:2.2.0
        environment:
            - CMD_DOMAIN=example.com
            - CMD_DB_URL=postgres://${DB_USER}:${DB_PASSWD}@db/codimd
            - CMD_PROTOCOL_USESSL=true
            - CMD_USECDN=false
            - CMD_ALLOW_ANONYMOUS=false
            - CMD_DEFAULT_PERMISSION=private
            - CMD_ALLOW_PDF_EXPORT=true
            - CMD_IMAGE_UPLOAD_TYPE=filesystem
            - CMD_ALLOW_EMAIL_REGISTER=false
        depends_on:
            - db
        ports:
            - &amp;quot;3030:3000&amp;quot;
        volumes:
            - upload-data:/home/hackmd/app/public/uploads
        restart: always
volumes:
    db-data: {}
    upload-data: {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.env（変更する）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DB_USRR=codimd DB_PASSWD=somepassword
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.gitignore&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;カスタマイズは環境変数で行っている。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hackmd.io/c/codimd-documentation/%2Fs%2Fcodimd-configuration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CodiMD Configuration Overview - HackMD&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;自分用として使うため、ユーザー登録必須・ユーザー登録はできない設定としている。&lt;/p&gt;
&lt;h2 id=&quot;%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;使ってみる&lt;/h2&gt;
&lt;p&gt;アクセスしてみる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/08/codimd/img/01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ちゃんとユーザー登録ボタンが消えている。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/08/codimd/img/02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;オンラインでのユーザー登録は無効にしているのでコマンドで行う。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ docker-compose exec codimd

# cd bin
# ./manage_users --add user@example.com
# exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;うまくログインできた！&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HackMD のオープンソース版「CodiMD」を Docker で構築できた&lt;/li&gt;
&lt;li&gt;細かく環境変数でカスタマイズできた。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hashy0917.wordpress.com/2018/11/14/docker%E5%86%85%E3%81%ABhackmd%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker 内に HackMD 構築してみた話。 – % Incomplete command.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>zoomでYouTube Liveをする</title>
    <link href="https://ebiyuu.com/post/2020/08/zoom/"/>
    <updated>2020-08-02T20:54:33Z</updated>
    <id>https://ebiyuu.com/post/2020/08/zoom/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;ビデオ会議アプリ Zoom には、そのまま YouTube Live に配信する機能がついている。&lt;/p&gt;
&lt;p&gt;ライブを配信する機会があったのでその時のいろいろなことのメモ&lt;/p&gt;
&lt;p&gt;仕様は 2020.8.2 最新バージョン時点なので変わる可能性あり&lt;/p&gt;
&lt;p&gt;実際にやる場合は一度ためしてからやってみてください。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%84%E3%82%8A%E6%96%B9&quot; tabindex=&quot;-1&quot;&gt;やり方&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;zoom の設定 → ミーティング詳細 → ライブストリームを許可 が有効になっていることを確認する。&lt;/li&gt;
&lt;li&gt;zoom の画面の「その他」から「Live on YouTube」を選ぶ。&lt;/li&gt;
&lt;li&gt;YouTube の画面が開き、配信タイトル等を入力する欄が現れる。&lt;/li&gt;
&lt;li&gt;必要な内容を入力するとライブが作成され、配信することができる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.st-note.com/production/uploads/images/20204123/rectangle_large_type_2_cc484ddaa415905b6830711674b9c50c.png?width=800&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;【最小構成のライブ配信】Zoom で YouTube Live をしよう！｜松井 隆幸@ライブ配信が好きな人｜ note&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;obs-%E9%85%8D%E4%BF%A1%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83&quot; tabindex=&quot;-1&quot;&gt;OBS 配信との比較&lt;/h2&gt;
&lt;p&gt;ライブ配信をするとき、通常は OBS などの配信ソフトなどを使うが、それと比べてみる。&lt;/p&gt;
&lt;h3 id=&quot;%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;メリット&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;画面レイアウトをうまくやってくれる&lt;/li&gt;
&lt;li&gt;音声ラインを考えなくていい&lt;/li&gt;
&lt;li&gt;PC スペックを圧迫しない&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;%E7%94%BB%E9%9D%A2%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E3%81%86%E3%81%BE%E3%81%8F%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;画面レイアウトをうまくやってくれる&lt;/h4&gt;
&lt;p&gt;ギャラリービューの配置や、画面共有時の配置など、zoom 側でいい感じのレイアウトにしてくれる。&lt;/p&gt;
&lt;p&gt;OBS でこれをやろうと思うと、zoom の画面をキャプチャしたりしてズレがちなので、これを勝手にやってくれるのはとても楽だった。&lt;/p&gt;
&lt;h4 id=&quot;%E9%9F%B3%E5%A3%B0%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E8%80%83%E3%81%88%E3%81%AA%E3%81%8F%E3%81%A6%E3%81%84%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;音声ラインを考えなくていい&lt;/h4&gt;
&lt;p&gt;OBS でビデオ通話しながら配信しようと思うと、zoom から出る音と自分の声とをうまく配信しつつ、調整がめんどくさかったりする。zoom の通話音声をそのまま配信できるので楽。&lt;/p&gt;
&lt;h4 id=&quot;pc-%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E3%82%92%E5%9C%A7%E8%BF%AB%E3%81%97%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;PC スペックを圧迫しない&lt;/h4&gt;
&lt;p&gt;OBS で配信しようとすると、zoom の受信・画面のキャプチャ・YouTube への送信を行わないといけないので、PC のスペックや通信帯域を圧迫してしまうが、zoom でのライブ配信であれば zoom サーバーから映像を送出してくれるので、スペックがそこまで必要ない。&lt;/p&gt;
&lt;h3 id=&quot;%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;デメリット&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;レイアウトをカスタマイズできない&lt;/li&gt;
&lt;li&gt;音声の確認・調整がしづらい&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;レイアウトをカスタマイズできない&lt;/h4&gt;
&lt;p&gt;自動でレイアウトしてくれるというメリットの裏返しでもある。&lt;/p&gt;
&lt;p&gt;例えば共有画面を小さく、自分を大きく写したいってときもあるかもしれないが、そういうことができない。&lt;/p&gt;
&lt;h4 id=&quot;%E9%9F%B3%E5%A3%B0%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%83%BB%E8%AA%BF%E6%95%B4%E3%81%8C%E3%81%97%E3%81%A5%E3%82%89%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;音声の確認・調整がしづらい&lt;/h4&gt;
&lt;p&gt;後述もするが、zoom 上と YouTube 上で音声の聞こえ方が違ったりするので、確認が難しい上、自在に調整できるわけでもない。&lt;/p&gt;
&lt;h2 id=&quot;%E6%B3%A8%E6%84%8F%E7%82%B9&quot; tabindex=&quot;-1&quot;&gt;注意点&lt;/h2&gt;
&lt;p&gt;いくつか罠があった。&lt;/p&gt;
&lt;h3 id=&quot;%E4%BA%88%E7%B4%84%E9%85%8D%E4%BF%A1%E3%81%AE%E3%81%97%E3%81%8B%E3%81%9F&quot; tabindex=&quot;-1&quot;&gt;予約配信のしかた&lt;/h3&gt;
&lt;p&gt;zoom から「YouTube Live」を選ぶと、あたらしく Live が作成される。&lt;/p&gt;
&lt;p&gt;事前に作成した配信で配信したい場合は、「YouTube Live」ではなく「カスタムライブストリーミング」を選び、ストリーミングキーなどを入力する必要がある。&lt;/p&gt;
&lt;h3 id=&quot;%E9%81%85%E5%BB%B6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&quot; tabindex=&quot;-1&quot;&gt;遅延について&lt;/h3&gt;
&lt;p&gt;YouTube Live に表示されるまでに少しタイムラグがある。&lt;/p&gt;
&lt;p&gt;終了時に zoom の画面を見ながら YouTube 側で配信を停止すると、最後まで再生されないまま終了してしまうことがあるので注意。&lt;/p&gt;
&lt;h3 id=&quot;%E7%94%BB%E9%9D%A2%E3%81%AE%E6%98%A0%E3%82%8A%E6%96%B9&quot; tabindex=&quot;-1&quot;&gt;画面の映り方&lt;/h3&gt;
&lt;p&gt;YouTube Live を開始した人（ホスト？）の画面表示に準拠した表示になる。&lt;/p&gt;
&lt;h4 id=&quot;%E3%82%AE%E3%83%A3%E3%83%A9%E3%83%AA%E3%83%BC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%8D&quot; tabindex=&quot;-1&quot;&gt;ギャラリービューで表示しているとき&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ギャラリービューで表示される&lt;/li&gt;
&lt;li&gt;ただし、ビデオオフになっている人は表示すらされない&lt;/li&gt;
&lt;li&gt;ビデオオンになっている人が 1 人だけのときは、全画面にその人の画像が表示される。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%8D&quot; tabindex=&quot;-1&quot;&gt;スピーカービューで表示しているとき&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;普通の状態では今喋っている人（おそらく音量で判定している）が表示される。
&lt;ul&gt;
&lt;li&gt;ビデオオフの人が喋ってもその人にはならない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;「スポットライトビデオ」に指定すると、その人の画面で固定される。&lt;/li&gt;
&lt;li&gt;「ビデオの固定」は反映されない&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;%E7%94%BB%E9%9D%A2%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%8D&quot; tabindex=&quot;-1&quot;&gt;画面を共有しているとき&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ビデオオンの人がいる場合は右上に小さく表示される。&lt;/li&gt;
&lt;li&gt;ギャラリービューの場合でも 1 人しか表示されない
&lt;ul&gt;
&lt;li&gt;表示のされ方はスピーカービューのときと同様。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bgm-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&quot; tabindex=&quot;-1&quot;&gt;BGM について&lt;/h3&gt;
&lt;p&gt;BGM は、zoom の画面共有の「コンピュータオーディオの共有」機能で流すことができるが、これが罠だらけだった。&lt;/p&gt;
&lt;h4 id=&quot;%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%AB%E3%83%83%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;ノイズカット&lt;/h4&gt;
&lt;p&gt;人の声が聞こえやすいよう、人がしゃべっているときは BGM がカットされることがある。&lt;/p&gt;
&lt;p&gt;これは zoom の仕様によるものと思われるが、なぜか Windows からの配信のときはカットされるが、mac から配信したらカットされなかった。zoom の仕様なのですぐ変わる可能性があるため、ちゃんと事前にチェックしたほうがいい。&lt;/p&gt;
&lt;h4 id=&quot;%E9%9F%B3%E9%87%8F&quot; tabindex=&quot;-1&quot;&gt;音量&lt;/h4&gt;
&lt;p&gt;これは非直感的なのが、「オーディオ共有の音量は PC 本体の音量に影響される」ということ。(mac)&lt;/p&gt;
&lt;p&gt;流す BGM の音量を小さくしつつ zoom の音声を聞くのは難しいため、BGM 配信用と zoom の音声を聞く用の PC は別に用意したほうがいい。&lt;/p&gt;
&lt;p&gt;また、音量最小でもまだ BGM が大きいので、音源を加工してゲインを下げる必要があるかもしれない。&lt;/p&gt;
&lt;p&gt;結局、bgm の配信には向いていない。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;zoom を利用すると簡単にライブストリーミングをできる。&lt;/li&gt;
&lt;li&gt;いろいろ自動でやってくれる一方で複雑なことは難しい&lt;/li&gt;
&lt;li&gt;特に BGM は難しい。&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Windowsの環境構築メモ</title>
    <link href="https://ebiyuu.com/post/2020/08/windows/"/>
    <updated>2020-08-14T21:00:01Z</updated>
    <id>https://ebiyuu.com/post/2020/08/windows/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;最近 Windows PC の調子が悪くなってきていたので、windows を初期化してインストールし直した。&lt;/p&gt;
&lt;p&gt;windows の環境構築のメモ。&lt;/p&gt;
&lt;h2 id=&quot;%E5%BF%85%E9%A0%88%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;必須ソフトのインストール&lt;/h2&gt;
&lt;p&gt;手動で真っ先にインストールするソフト。&lt;/p&gt;
&lt;h3 id=&quot;google-chrome&quot; tabindex=&quot;-1&quot;&gt;Google Chrome&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.google.com/chrome/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google Chrome - Download the Fast, Secure Browser from Google&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ブラウザは普段 Google Chrome を使っている。これをインストールしないと始まらない。&lt;/p&gt;
&lt;p&gt;Google Chrome は Google アカウントでログインするだけで設定やブックマークから拡張機能まで、普段の環境が整うのでかんたん。&lt;/p&gt;
&lt;h3 id=&quot;1password&quot; tabindex=&quot;-1&quot;&gt;1password&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://1password.com/downloads/windows/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Best Password Manager for Windows | 1Password&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;パスワード管理は 1password で行っている。これを入れないと各種 web サイトへのログインが面倒なので、まっさきに入れる。&lt;/p&gt;
&lt;h3 id=&quot;dropbox&quot; tabindex=&quot;-1&quot;&gt;Dropbox&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.dropbox.com/downloading&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ダウンロード - Dropbox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ファイルは普段 Dropbox で同期している。これを入れれば普段使っている Office などのファイルが一発で同期されるので、便利。&lt;/p&gt;
&lt;h4 id=&quot;%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%AE%E8%A8%AD%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;デスクトップの設定&lt;/h4&gt;
&lt;p&gt;Dropbox をつかって、デスクトップも同期している。（とりあえずデスクトップにおいたファイルが同期されるので便利。）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Dropbox&#92;Desktop&lt;/code&gt; がデスクトップに表示されるように設定を変える。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/08/windows/img/dropbox.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;エクスプローラーのデスクトップの「プロパティ」の「場所」タブから変更する。&lt;/p&gt;
&lt;h2 id=&quot;google-%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;Google 日本語入力のインストール&lt;/h2&gt;
&lt;p&gt;Google 日本語入力をインストールする。&lt;/p&gt;
&lt;p&gt;また、「変換」「無変換」を用いて入力モードを切りかえる（mac 風）設定にしているので、これを設定しないと使い物にならないので設定する。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/08/windows/img/ime.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Henkan・Hiragana に「Set input mode to Hiragana」、Muhenkan に「Deactivate IME」を選択する。Mode ごとにあるので全部の Mode に関して設定する。&lt;/p&gt;
&lt;h2 id=&quot;scoop-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;Scoop のインストール&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ebiyuu.com/post/2020/07/scoop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Windows の scoop が便利という話&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;前も記事に書いた Scoop を使って各種環境を設定する。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://scoop.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Scoop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Powershell で以下のコマンドを実行してインストールする。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned -scope CurrentUser iwr -useb get.scoop.sh | iex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ついでに各種基本コマンドをインストールしておく。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ scoop install git $ scoop install make
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ssh-%E3%82%AD%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;ssh キーを作る&lt;/h2&gt;
&lt;p&gt;github に接続するために ssh キーを作って設定する。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ssh-keygen -b 4096 $ cat ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Github に登録しておく。&lt;/p&gt;
&lt;h2 id=&quot;dotfiles-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;dotfiles のインストール&lt;/h2&gt;
&lt;p&gt;自分で普段使っている&lt;code&gt;.bashrc&lt;/code&gt;や&lt;code&gt;.gitconfig&lt;/code&gt;などを入れる。&lt;/p&gt;
&lt;p&gt;自作の同期用スクリプトを用意しているので、それを用いる。&lt;/p&gt;
&lt;p&gt;今後のシェル操作は git bash からおこなう。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -sL dot.ebiyuu.com | sh $ cd ~/dotfiles $ ./dot link
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;vscode-%E3%81%AE%E8%A8%AD%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;VSCode の設定&lt;/h2&gt;
&lt;p&gt;VSCode をインストールする。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ scoop install vscode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;VSCode を起動したら真っ先に「Setting Sync」拡張機能をインストールして、設定を同期する。&lt;/p&gt;
&lt;p&gt;GitHub ログインが終わったら、ctrl+shift+P でコマンドパレットを開き、&lt;code&gt;&amp;gt; Sync: Download Settings&lt;/code&gt;を選ぶ。&lt;/p&gt;
&lt;h2 id=&quot;docker-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;Docker のインストール&lt;/h2&gt;
&lt;p&gt;Windows Pro だったので、公式サイトに従ってインストールをしたらすぐ設定が終わった。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%9D%E3%81%AE%E4%BB%96&quot; tabindex=&quot;-1&quot;&gt;その他&lt;/h2&gt;
&lt;p&gt;ここまで終わったらほとんど元の環境が整った。あとは LINE や Slack などの細かいソフトを落としたら環境構築完了である。大体 1 時間かからなかった。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;環境構築をした。&lt;/li&gt;
&lt;li&gt;scoop が便利&lt;/li&gt;
&lt;li&gt;これからも定期的にインストールしなおそう。&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>マコの名言</title>
    <link href="https://ebiyuu.com/post/2020/08/mako/"/>
    <updated>2020-08-23T19:51:50Z</updated>
    <id>https://ebiyuu.com/post/2020/08/mako/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;株式会社ほえいのマコの名言に感動した。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;人生、「この時のために生きてるんや！」っていう瞬間を切り取って積み重ねて、どれだけ高く登れるかのゲームだと思ってる&lt;br /&gt;&lt;br /&gt;今は、出し切って作った動画が世に出る瞬間がまさにそれ&lt;/p&gt;&amp;mdash; マコ (@mako77_77) &lt;a href=&quot;https://twitter.com/mako77_77/status/1297632201291440129?ref_src=twsrc%5Etfw&quot;&gt;August 23, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;人生頑張ろうと思う。&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>macのopenコマンドとwindowsのstartコマンド</title>
    <link href="https://ebiyuu.com/post/2020/08/open-start/"/>
    <updated>2020-08-23T19:51:50Z</updated>
    <id>https://ebiyuu.com/post/2020/08/open-start/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;mac-%E3%81%AE%E5%A0%B4%E5%90%88&quot; tabindex=&quot;-1&quot;&gt;mac の場合&lt;/h2&gt;
&lt;p&gt;mac のターミナルには &lt;code&gt;open&lt;/code&gt; というコマンドがある。例えば&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ open .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;とすると現在のフォルダを Finder で開くし、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ open doc/html/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;とすればブラウザで html でファイルを開いたり、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ open logo.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;とすると画像ファイルをプレビューアプリで開いたりする。&lt;/p&gt;
&lt;p&gt;要はファイルをダブルクリックした時と同じ動作になる。ファイルを簡単に確認するのに便利なのでぜひ覚えておきたい。&lt;/p&gt;
&lt;h2 id=&quot;windows-%E3%81%AE%E5%A0%B4%E5%90%88&quot; tabindex=&quot;-1&quot;&gt;Windows の場合&lt;/h2&gt;
&lt;p&gt;これは最近知ったのだが、windows にも &lt;code&gt;start&lt;/code&gt; コマンドがある。&lt;/p&gt;
&lt;p&gt;git bash の場合&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ start .
$ start doc/html/index.html
$ start logo.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コマンドプロンプトの場合&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; start .
&amp;gt; start doc&#92;html&#92;index.html
&amp;gt; start logo.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;などと、 &lt;code&gt;open&lt;/code&gt; コマンドと同等の事ができる。&lt;/p&gt;
&lt;p&gt;フォルダを開く場合は直接 explorer を呼ぶことができる。&lt;/p&gt;
&lt;p&gt;git bash の場合&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ explorer doc
$ explorer doc&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;html &lt;span class=&quot;token comment&quot;&gt;# ファイル名は&#92;&#92;で区切る必要がある&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コマンドプロンプトの場合&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; explorer doc
&amp;gt; explorer doc&#92;html
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wsl-%E3%81%AE%E5%A0%B4%E5%90%88&quot; tabindex=&quot;-1&quot;&gt;WSL の場合&lt;/h2&gt;
&lt;p&gt;WSL からフォルダを開く場合は、前述の &lt;code&gt;explorer&lt;/code&gt; が使える。ただし、ちゃんと &lt;code&gt;eplorer.exe&lt;/code&gt; と指定しないといけない。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ explorer.exe .
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Inkscapeの開発に参加した</title>
    <link href="https://ebiyuu.com/post/2020/11/inkscape/"/>
    <updated>2020-11-03T04:28:19Z</updated>
    <id>https://ebiyuu.com/post/2020/11/inkscape/</id>
    <content xml:lang="ja" type="html">&lt;blockquote&gt;
&lt;p&gt;この記事は &lt;a href=&quot;https://qiita.com/ebiyuu1121/items/991d65f6c975887a7f22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Inkscape の開発に参加した - Qiita&lt;/a&gt; から移行しました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;この記事は&lt;a href=&quot;https://www.ee.t.u-tokyo.ac.jp/j/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;東京大学工学部電子情報工学科・電気電子工学科&lt;/a&gt;(通称 eeic, &lt;a href=&quot;https://qiita.com/advent-calendar/2019/eeic&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;cf.&lt;/a&gt;)の 3 年後期実験の一つである「&lt;a href=&quot;https://doss.eidos.ic.i.u-tokyo.ac.jp/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;大規模ソフトウェアを手探る&lt;/a&gt;」のレポートとして，書かれたものです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;%E6%A6%82%E8%A6%81%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;概要を手探る。&lt;/h2&gt;
&lt;p&gt;人生で初めて OSS に Contribute したので、そのことについての記録を。
今回は OSS としてドローソフトの Inkscape を取り上げた。
開発は GitLab 上のリポジトリで行われており、メイン言語は C++となっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://inkscape.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Draw Freely | Inkscape&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;リポジトリ：&lt;a href=&quot;https://gitlab.com/inkscape/inkscape&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Inkscape / inkscape · GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;冒頭に書いたとおり、「&lt;a href=&quot;https://doss.eidos.ic.i.u-tokyo.ac.jp/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;大規模ソフトウェアを手探る&lt;/a&gt;」という大学の授業の一環で行ったことであるが、ずっと OSS に興味はあったので良い機会であった。&lt;/p&gt;
&lt;p&gt;今回はバグ修正を１つと、機能追加を１つ行った。
バグ修正の方は Merge Request を提出し、本リポジトリにマージされた。&lt;/p&gt;
&lt;p&gt;この記事では、初めて見るソースコードに対して実際にどのように編集を加えていったのかを示す。
※ビルド方法などこの記事に書いていないことについては、同じく実験に参加したメンバーが別途記事を書いている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/momoka_0122y/private/df19a0ff5a993514cc89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Inkscape を手探る - Qiita&lt;/a&gt;(目次)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/wolfram1293/private/3c7d88fdd0ba0a6b8111&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Inkscape の環境構築 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/wolfram1293/private/cc451b87d74875d6318e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Visual Studio Code を使ったデバッガ導入とデバッグ実行 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/momoka_0122y/private/64d35862a357d42c3381&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OSS 開発初めかた (Issue の見つけ方) - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/momoka_0122y/items/4d04c8f2d94d591f938a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OSS 開発初めかた (GitLab にある本家にマージ) - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%83%90%E3%82%B0%E4%BF%AE%E6%AD%A3%E7%B7%A8&quot; tabindex=&quot;-1&quot;&gt;バグ修正編&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.com/inkscape/inkscape/-/merge_requests/2401/diffs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;今回の修正内容&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;%E3%83%90%E3%82%B0%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;バグの内容を手探る。&lt;/h3&gt;
&lt;p&gt;今回行った修正は以下の Issue への解決である。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.com/inkscape/inkscape/-/issues/1921&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;clipping paths are antialiased even if export is set to no antialiasing (#1921) · Issues · Inkscape / inkscape · GitLab&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;要はクリッピングマスクを適用した図形を png エクスポートする際に、アンチエイリアスを無効にする設定にしても反映されないというバグである。&lt;/p&gt;
&lt;p&gt;クリッピングマスクを適用した図形を png エクスポートする際に、アンチエイリアスを無効にしてもアンチエイリアスが適用されるバグ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;アンチエイリアスあり&lt;/th&gt;
&lt;th&gt;アンチエイリアスなし&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/11/inkscape/img/aa-01.png&quot; alt=&quot;image.png&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/11/inkscape/img/aa-02.png&quot; alt=&quot;image.png&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;実際に試してみると、クリッピングパスを設定していないオブジェクト（黒）に関してはアンチエイリアスの設定が反映されているが、クリッピングパスを設定したオブジェクト（赤）に関してはアンチエイリアスの設定に関わらずアンチエイリアス処理が行われていることがわかる。&lt;/p&gt;
&lt;h3 id=&quot;%E5%A4%A7%E9%87%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;大量のファイルをを手探る。&lt;/h3&gt;
&lt;p&gt;ファイルが多すぎてどこをどういじれば良いのかわからない。&lt;/p&gt;
&lt;p&gt;というわけで手がかりを探そうと思っていたところ、該当 Issue に以下のような記述がなされていた。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Remarks to whoever wants to try to tackle this : in &lt;code&gt;src/diplay/drawing-item.cpp&lt;/code&gt; please take the lines 711-726 and make it a static function taking arguments &lt;code&gt;dc&lt;/code&gt; and &lt;code&gt;_antialias&lt;/code&gt;, so that you can call it from other places (say, from the &lt;code&gt;::clip&lt;/code&gt; method, if that has chances to work)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;（だいたい意訳）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;この Issue をやる人へ：&lt;code&gt;src/diplay/drawing-item.cpp&lt;/code&gt; の 711-726 行目を &lt;code&gt;dc&lt;/code&gt; と &lt;code&gt;_antialias&lt;/code&gt; を引数にもつ static 関数にすれば、色んな場所から呼び出せます。（そしてこれを &lt;code&gt;::clip&lt;/code&gt; メソッドから呼び出せばもしかしたらバグの解決に役立つかも！）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;このコメント自体がそのまま解決に結びつくかどうかはまだわからないが、 &lt;code&gt;src/diplay/drawing-item.cpp&lt;/code&gt; を見れば良いということはわかった。というわけで &lt;code&gt;src/display/drawing-item.cpp&lt;/code&gt; をひもとく。&lt;/p&gt;
&lt;h3 id=&quot;drawing-item.cpp-%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;drawing-item.cpp&lt;/code&gt; を手探る。&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;drawing-item.cpp&lt;/code&gt; は　&lt;code&gt;Inkscape::DrawingItem&lt;/code&gt; というクラスの実装が記述されていた。
&lt;code&gt;DrawingItem&lt;/code&gt; クラスは図形や文字・画像など、描画されるアイテムの基底クラスであるようであり、描画時に用いられる。&lt;code&gt;DrawingShape&lt;/code&gt; や &lt;code&gt;DrawingGryphs&lt;/code&gt; などのクラスから継承されていることがわかる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/11/inkscape/img/doc.png&quot; alt=&quot;image.png&quot; /&gt;
（doxygen ドキュメントより）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;たくさんのメソッドが記述されていたが、今回関係するメソッドだけを抽出すると以下のようになる。
上で記述されていた 711-726 行目とは、&lt;code&gt;switch(_antialias){&lt;/code&gt; の行である。&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;DrawingItem&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAntialiasing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_antialias &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        _antialias &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;_markForRendering&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;DrawingItem&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DrawingContext &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;dc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Geom&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;IntRect &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;area&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; flags&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DrawingItem &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;stop_at&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 事前処理など&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_antialias&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;cairo_set_antialias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CAIRO_ANTIALIAS_NONE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;cairo_set_antialias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CAIRO_ANTIALIAS_FAST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;cairo_set_antialias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CAIRO_ANTIALIAS_GOOD&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;cairo_set_antialias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CAIRO_ANTIALIAS_BEST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// should not happen&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;g_assert_not_reached&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 描画処理など&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_clip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        ict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pushGroup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        _clip&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ict&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;carea&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        ict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;popGroupToSource&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        ict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setOperator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;CAIRO_OPERATOR_IN&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        ict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;paint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 描画処理など&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;DrawingItem&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Inkscape&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;DrawingContext &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;dc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Geom&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;IntRect &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;area&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 処理&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;また、 &lt;code&gt;Inkscape::DrawingItem&lt;/code&gt; クラスは以下のようなメンバ変数をもつ。（関連するもののみ抽出）&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;DrawingItem &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;_clip&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; _antialias &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;///&amp;lt; antialiasing level (NONE/FAST/GOOD(DEFAULT)/BEST)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ソースコードから以下のようなことがわかる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;render&lt;/code&gt; 関数で描画処理を行っている。
&lt;ul&gt;
&lt;li&gt;実際にデバッガを用いてブレークポイントを貼りながら実行することで、描画処理時（画面の表示更新時や画像書き出しなどのラスタライズされるタイミング）に &lt;code&gt;render&lt;/code&gt; メソッドが実行されることがわかった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クリッピングパスが設定されたオブジェクトでは &lt;code&gt;render&lt;/code&gt; メソッド内で　&lt;code&gt;clip&lt;/code&gt; メソッドが呼び出されている。（デバッガで調べると実際そうであることがわかる）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_render&lt;/code&gt; 関数の内部でメンバ変数 &lt;code&gt;_antialias&lt;/code&gt; の値によって分岐し、アンチエイリアスの設定を切り替えている。&lt;/li&gt;
&lt;li&gt;クリップマスクが設定されている場合、メンバ変数 &lt;code&gt;_clip&lt;/code&gt; に &lt;code&gt;DrawingItem&lt;/code&gt; へのポインタが設定されている。（子要素のようなもの）&lt;/li&gt;
&lt;li&gt;描画ライブラリとして&lt;a href=&quot;https://www.cairographics.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;cairo&lt;/a&gt;が用いられている。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これがわかったところで、まずは、どこで問題が発生しているのかを突き止める。
アンチエイリアスが反映されない原因として、以下のようなものが思いつく。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;設定値が　&lt;code&gt;_antialias&lt;/code&gt; メンバ変数に反映されていない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_antialias&lt;/code&gt; メンバ変数をもとに cairo に設定値を正常に渡せていない&lt;/li&gt;
&lt;li&gt;cairo が受け取った設定値を反映できていない（ライブラリのバグ）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;clip()-%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;clip()&lt;/code&gt; を手探る。&lt;/h3&gt;
&lt;p&gt;まず、3 を検証するため、&lt;code&gt;clip()&lt;/code&gt; メソッドを以下のように変更した。&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; DrawingItem::clip(Inkscape::DrawingContext &amp;amp;dc, Geom::IntRect const &amp;amp;area)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     // don&#39;t bother if the object does not implement clipping (e.g. DrawingImage)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     if (!_canClip()) return;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     if (!_visible) return;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     if (!area.intersects(_bbox)) return;
&lt;/span&gt;

&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;     cairo_set_antialias(dc.raw(), CAIRO_ANTIALIAS_NONE);
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     dc.setSource(0,0,0,1);
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     dc.pushGroup();
&lt;/span&gt;
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     ...
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クリッピングマスクに関して、設定値に関わらずアンチエイリアオフに固定してその結果を見る意図である。
これで正常にアンチエイリアスがオフになれば cairo ライブラリには問題がないということが分かる。&lt;/p&gt;
&lt;p&gt;実際、ビルドして実行を行ったところ、アンチエイリアスがオフになったため、ライブラリの問題でないことはわかった。&lt;/p&gt;
&lt;p&gt;そこで、&lt;code&gt;render()&lt;/code&gt;メソッドに含まれる&lt;code&gt;switch&lt;/code&gt;文を&lt;code&gt;clip()&lt;/code&gt;メソッドにも書いてみる。&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; DrawingItem::clip(Inkscape::DrawingContext &amp;amp;dc, Geom::IntRect const &amp;amp;area)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     // don&#39;t bother if the object does not implement clipping (e.g. DrawingImage)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     if (!_canClip()) return;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     if (!_visible) return;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     if (!area.intersects(_bbox)) return;
&lt;/span&gt;

&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;     switch(_antialias){
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;       case 0:
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           cairo_set_antialias(dc.raw(), CAIRO_ANTIALIAS_NONE);
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           break;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;       case 1:
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           cairo_set_antialias(dc.raw(), CAIRO_ANTIALIAS_FAST);
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           break;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;       case 2:
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           cairo_set_antialias(dc.raw(), CAIRO_ANTIALIAS_GOOD);
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           break;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;       case 3:
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           cairo_set_antialias(dc.raw(), CAIRO_ANTIALIAS_BEST);
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           break;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;       default: // should not happen
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;           g_assert_not_reached();
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;   }
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     dc.setSource(0,0,0,1);
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     dc.pushGroup();
&lt;/span&gt;
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     ...
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これでバグ解決となればよかったが、解決しない。
デバッガで見てみると、 &lt;code&gt;_antialias&lt;/code&gt; の値に設定値が反映されていないことが分かったため、この原因を調査する。&lt;/p&gt;
&lt;h3 id=&quot;_antialias%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;_antialias&lt;/code&gt;を手探る。&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;_antialias&lt;/code&gt; はアンチエイリアスの設定によって変化するため、全&lt;code&gt;DrawingItem&lt;/code&gt;で共通である。
（なぜグローバルなオブジェクトではなく各&lt;code&gt;DrawingItem&lt;/code&gt;に持たせているのかはわからない）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DrawingItem&lt;/code&gt;(を継承しているクラス)のインスタンスは木構造となっていて、根の&lt;code&gt;_antialias&lt;/code&gt;を変更して&lt;code&gt;render()&lt;/code&gt;時に値を子に伝播させていく、という形式のようである。&lt;/p&gt;
&lt;p&gt;この伝播の途中で処理が抜けていてクリッピングマスクの部分までで&lt;code&gt;_antialias&lt;/code&gt;の値が引き継がれていないのが原因のようだった。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;render()&lt;/code&gt;関数内の該当箇所は以下のようになっている。&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;    &lt;span class=&quot;token comment&quot;&gt;// 3. Render object itself&lt;/span&gt;
    ict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pushGroup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    render_result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;_renderItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ict&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;iarea&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; flags&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; stop_at&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;_renderItem()&lt;/code&gt;は仮想関数で、実態は&lt;code&gt;DrawingItem&lt;/code&gt;を継承したクラスで定義されている。
このうち&lt;code&gt;DrawingGroup::renderItem()&lt;/code&gt;の実装が問題であった。&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; for (auto &amp;amp;i : _children) {
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;     i.setAntialiasing(_antialias);
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     i.render(dc, area, flags, stop_at);
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上記のように修正したところ、ちゃんと反映されるようになった。&lt;/p&gt;
&lt;h4 id=&quot;%E3%81%A4%E3%81%84%E3%81%A7%E3%81%AB&quot; tabindex=&quot;-1&quot;&gt;ついでに&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;_clip&lt;/code&gt;が指すオブジェクトも&lt;code&gt;DrawingItem&lt;/code&gt;なので、&lt;code&gt;_antialias&lt;/code&gt;を持っている。
クリッピングマスクが入れ子になっている場合は、&lt;code&gt;_clip-&amp;gt;_antialias&lt;/code&gt;の値にも反映する必要があるため、&lt;code&gt;render()&lt;/code&gt;関数の中で更新をおこなう。&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; if (_clip) {
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     ict.pushGroup();
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;     _clip-&gt;setAntialiasing(_antialias); // propagate antialias setting
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     _clip-&gt;clip(ict, *carea);
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     ict.popGroupToSource();
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     ict.setOperator(CAIRO_OPERATOR_IN);
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     ict.paint();
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;merge-request-%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;Merge Request を手探る。&lt;/h3&gt;
&lt;p&gt;上記の変更を加え、Merge Request を作成した。
Issue でも言及された共通部分の関数化なども合わせて実施した。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.com/inkscape/inkscape/-/merge_requests/2401&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Fix clipping path antialias (!2401) · Merge Requests · Inkscape / inkscape · GitLab&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;約 24 時間後に master ブランチへ無事マージされた。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%8A%E3%81%BE%E3%81%91%EF%BC%9A%E6%A9%9F%E8%83%BD%E8%BF%BD%E5%8A%A0%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;おまけ：機能追加を手探る。&lt;/h2&gt;
&lt;p&gt;同じくドローソフトである Adobe Illustrator には、「キーオブジェクトに整列」機能がある。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/11/inkscape/img/ko-01.gif&quot; alt=&quot;Illustratorでの整列機能&quot; /&gt;&lt;/p&gt;
&lt;p&gt;これを Inkscape で実装した。(&lt;a href=&quot;https://gitlab.com/ebiyuu1121/inkscape/-/compare/2c47cfbda2d5ccbbc4052f77f0bad5837f52bd77...94caf0f50d4461d2eac6a8ba210cb514d5cf7545&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;変更内容&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2020/11/inkscape/img/ko-02.gif&quot; alt=&quot;Inkscapeで実装した整列機能&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キーオブジェクトを保持する変数を作成&lt;/li&gt;
&lt;li&gt;選択ツールの動作を変更&lt;/li&gt;
&lt;li&gt;整列処理を変更&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;バグ修正で全体像を掴んでいたこともあり、機能追加自体はかんたんに行うことができた。
まだ未完成の状態で開発を進められていないが、機会があれば追記しようと思う。&lt;/p&gt;
&lt;h2 id=&quot;%E6%84%9F%E6%83%B3%E3%82%92%E6%89%8B%E6%8E%A2%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;感想を手探る。&lt;/h2&gt;
&lt;p&gt;初めての OSS への参加という経験であった。&lt;/p&gt;
&lt;p&gt;「大規模ソフトウェアを手探る」というテーマの通り、たくさんのソースコードから該当箇所を見つけ出すのが最も大変であった。しかし、どんなソフトも結局それぞれの機能は普段使うような言語で書かれているということを実感できた。&lt;/p&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://esudo.hatenablog.com/entry/2015/11/05/024702&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Inkscape にナイフ機能を付けてみた 1/4 - UI をいじる編 - esudo’s diary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ika2018.hatenablog.com/entry/2018/11/05/114408#fn-6316abf8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Inkscape を手探る - くコ:彡&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dried-doss.hatenablog.com/entry/2019/11/05/000722&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;inkscape で全レイヤー間で同期して動く図形を追加した話 - dried_doss’s diary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://team-denki-kei-inkscape.hatenablog.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;team_denki-kei_inkscape’s diary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inkscape.org/develop/getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Getting Started | Inkscape&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>ブログを移転しました</title>
    <link href="https://ebiyuu.com/post/2021/06/blog-move/"/>
    <updated>2021-06-01T16:24:56Z</updated>
    <id>https://ebiyuu.com/post/2021/06/blog-move/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;&lt;a href=&quot;https://ebiyuu.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ebiyuu.com/&lt;/a&gt; に載せていた自分のホームページをリニューアルしました。&lt;/p&gt;
&lt;p&gt;そこで、別ドメイン &lt;a href=&quot;https://blog.ebiyuu.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.ebiyuu.com/&lt;/a&gt; で運用していたブログを統合しました。今後記事の移行を行っていきます。&lt;/p&gt;
&lt;h2 id=&quot;%E6%96%B0%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AB%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93&quot; tabindex=&quot;-1&quot;&gt;新ブログに用いられている技術&lt;/h2&gt;
&lt;p&gt;実は、以前のブログは WordPress を用いて構築していました。しかし、Wordpress の管理は、定期的なソフトウェア更新を行わないと脆弱性が生まれてしまうなど、コストが大きくかかります。&lt;/p&gt;
&lt;p&gt;そこで、静的サイトジェネレータ（SSG）を用いることにしました。記事を更新するごとにウェブページをビルドして、HTML ファイルで配信しています。ブログの管理コストを下げるには、動的なプログラムをウェブ上に公開する必要がないため、セキュリティ的な問題が発生しづらいことがメリットです。&lt;/p&gt;
&lt;h3 id=&quot;ssg-%E3%81%AE%E9%81%B8%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;SSG の選定&lt;/h3&gt;
&lt;p&gt;今までのウェブページは Jekyll を用いて生成していました。GitHub Pages に標準搭載されていたのが理由で、GitHub に push すると自動でウェブページが生成されていました。&lt;/p&gt;
&lt;p&gt;新サイトでは、Go 言語製の静的サイトジェネレータ&lt;a href=&quot;https://gohugo.io/&quot; target=&quot;_blank&quot;&gt;Hugo&lt;/a&gt;を使いました。理由は使ってみたかったのと、速度が早いとのことでローカルで編集しやすいかなと思ったからです。実際に使ってみたところ、Hugo の実行は噂通り爆速でした。起動したのに気づかないし、ホットリロードも 1 秒もかかりません。&lt;/p&gt;
&lt;p&gt;デプロイには Netlify を使いました。いままで静的サイトのデプロイには AWS S3 を使っており、Netlify hosting は初めて使ったのですが、GitHub から自動でデプロイしてくれるので便利ですね。&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>WSLのlocalhostがWindowsから見えない問題</title>
    <link href="https://ebiyuu.com/post/2021/06/wsl-localhost/"/>
    <updated>2021-06-02T04:40:00Z</updated>
    <id>https://ebiyuu.com/post/2021/06/wsl-localhost/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;WSL でウェブ開発をしている際、Windows 上のブラウザから &lt;code&gt;http://localhost:3000&lt;/code&gt; とかでアクセスできないことがよくあった。大体再起動すると戻るのだが。&lt;/p&gt;
&lt;p&gt;WSL 内から&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; localhost:3000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;とかするとソースは見えるので、サーバー自体は立ち上がっていそう。&lt;/p&gt;
&lt;p&gt;結論としては、Windows の「高速スタートアップ」をオフにすると解決した。再起動時（シャットダウン → 起動とは挙動が違う）は高速スタートアップが無効になるため、再起動でも解決していたようだ。&lt;/p&gt;
&lt;p&gt;Linux と Windows をデュアルブートしている場合でも高速スタートアップがよく悪さをするので、無効化しておくのが無難そう。（そんな早くなる実感ないし）&lt;/p&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E8%A8%98%E4%BA%8B&quot; tabindex=&quot;-1&quot;&gt;参考記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/snaka/items/a8eee4cfc8f7d733e6ab&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WSL2 内で立ち上げたサーバに Windows 側から localhost で接続する - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>AWSを用いてサーバーレスでリダイレクト</title>
    <link href="https://ebiyuu.com/post/2021/06/aws-redirect/"/>
    <updated>2021-06-02T09:00:53Z</updated>
    <id>https://ebiyuu.com/post/2021/06/aws-redirect/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;よくアクセスするウェブサイトに簡単にアクセスするため、独自ドメインからリダイレクトを設定したい。&lt;/p&gt;
&lt;p&gt;リダイレクトのためだけにサーバーを用意するのも面倒なため、AWSを用いてリダイレクトを行う。&lt;/p&gt;
&lt;h2 id=&quot;%E6%A7%8B%E6%88%90&quot; tabindex=&quot;-1&quot;&gt;構成&lt;/h2&gt;
&lt;p&gt;S3のStatic Site Hosting機能を使ってリダイレクトを行い、Cloudfront+ACMでSSL化する。SSL化が必要ない場合はS3だけで可能。&lt;/p&gt;
&lt;h3 id=&quot;%E6%A7%8B%E7%AF%89%E6%89%8B%E9%A0%86&quot; tabindex=&quot;-1&quot;&gt;構築手順&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;S3バケットを設定する。
独自ドメインのリダイレクトを行う場合、バケット名をドメイン名(FQDN)にしなければならない。&lt;/li&gt;
&lt;li&gt;Static Site Hostingを有効化し、リダイレクトを設定する。
&lt;img src=&quot;https://ebiyuu.com/post/2021/06/aws-redirect/img/image-20210602181055402.png&quot; alt=&quot;image-20210602181055402&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Cloudfrontディストリビューションを作成し、Static Site HostingのURL（S3バケットそのものではない）をオリジンに設定する。&lt;/li&gt;
&lt;li&gt;CloudfrontにCNAMEを設定し、Route 53にてCNAMEレコードを追加してCloudfrontに独自ドメインを設定する。ACMも設定する。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;302%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;302リダイレクト&lt;/h3&gt;
&lt;p&gt;前述の方法だと、HTTPコードが301になってしまう。リダイレクト先が変更される場合がある場合は302が妥当（ブラウザにリダイレクトがキャッシュされてしまう）。&lt;/p&gt;
&lt;p&gt;そこで、&lt;code&gt;Host Static Website&lt;/code&gt; を選択し、リダイレクトはRedirection Ruleを用いて設定する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://example.com/path&lt;/code&gt; にリダイレクトする場合は以下のようになる。&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Redirect&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;HostName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;HttpRedirectCode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;302&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;Protocol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;ReplaceKeyWith&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;path&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-page-redirect.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(Optional) Configuring a webpage redirect - Amazon Simple Storage Service&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.hirokiky.org/entry/2018/01/23/174023&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;S3で302リダイレクトをする（301リダイレクトでなく） - Make組ブログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>LINEのトーク履歴を解析する</title>
    <link href="https://ebiyuu.com/post/2021/06/line/"/>
    <updated>2021-06-07T10:04:17Z</updated>
    <id>https://ebiyuu.com/post/2021/06/line/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;LINE のトーク履歴を解析して、累計通話時間・メッセージ数をグラフ化するコードを書いたのでせっかくなので公開する。&lt;/p&gt;
&lt;p&gt;解析してみると新しい発見があっておもしろいかもしれない。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89(gist)&quot; tabindex=&quot;-1&quot;&gt;ソースコード(gist)&lt;/h2&gt;
&lt;p&gt;トーク履歴をエクスポートした txt ファイルを同じフォルダに配置してから実行してください。&lt;/p&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; re
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; datetime
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; matplotlib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pyplot &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; plt

data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

filename &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;input filename (before &#92;&quot;.txt&#92;&quot;) &gt; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filename &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; encoding&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;utf_8_sig&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    lines &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; m &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;&#92;[LINE&#92;] Chat history with (.*)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    YOU &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;groups&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; m &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;&#92;[LINE&#92;] (.*?)とのトーク履歴&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    YOU &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;groups&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cannot detect name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; line &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; m &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;(&#92;d&#92;d&#92;d&#92;d)&#92;/(&#92;d+)&#92;/(&#92;d+)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; d &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;groups&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;d&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
                &lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;d&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; m &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;&#92;d+:&#92;d+&#92;t(.*?)&#92;t&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        is_me &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;groups&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; YOU
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; is_me&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; m &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;Call time ((&#92;d+):)?(&#92;d+):(&#92;d+)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;通話時間 ((&#92;d+):)?(&#92;d+):(&#92;d+)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; h&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;groups&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; is_me&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;h &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;h &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600&lt;/span&gt;

fig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;figure&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
ax1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add_subplot&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;211&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stackplot&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;call&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    colors&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;blue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;red&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;legend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ME&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;YOU&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; loc&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;upper left&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xlabel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ylabel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;time [h]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grid&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

ax2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add_subplot&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;212&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stackplot&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;you&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    colors&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;blue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;red&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;legend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ME&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;YOU&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; loc&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;upper left&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xlabel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ylabel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grid&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tight_layout&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;savefig&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filename &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;show&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Lambda at Edge Chrome</title>
    <link href="https://ebiyuu.com/post/2021/06/lambda-at-edge-chrome/"/>
    <updated>2021-06-08T12:54:11Z</updated>
    <id>https://ebiyuu.com/post/2021/06/lambda-at-edge-chrome/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;lambda-layer-%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;Lambda layer を作成する&lt;/h2&gt;
&lt;p&gt;Headless Chrome 本体のレイヤーと、pip ライブラリをインストールしたレイヤーの 2 つを作成します。&lt;/p&gt;
&lt;h3 id=&quot;chrome-layer&quot; tabindex=&quot;-1&quot;&gt;chrome Layer&lt;/h3&gt;
&lt;p&gt;以下の 2 点を Zip にします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/adieuadieu/serverless-chrome/tree/master&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;adieuadieu/serverless-chrome: 🌐 Run headless Chrome/Chromium on AWS Lambda&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Headless Chrome を Lambda で動作するようにカスタマイズしたライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromedriver.chromium.org/downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ChromeDriver - WebDriver for Chrome - Downloads&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Chrome を制御する WebDriver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は Serverless Chrome &lt;a href=&quot;https://github.com/adieuadieu/serverless-chrome/releases/tag/v1.0.0-37&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Release v1.0.0-37&lt;/a&gt;、&lt;a href=&quot;https://chromedriver.storage.googleapis.com/index.html?path=2.37/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Chromedriver 2.37&lt;/a&gt;を用いました。（最新版は容量不足で入らなかった）&lt;/p&gt;
&lt;p&gt;これらを解凍して実行権限を与え、&lt;code&gt;chrome&lt;/code&gt; フォルダにまとめて zip に固めます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chrome
├── chromedriver
└── headless-chromium
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-000&quot;&gt;&lt;code class=&quot;language-000&quot;&gt;$ chmod 755 chrome/*
$ zip -r chrome.zip chrome&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;chrome.zip&lt;/code&gt;を Lambda Layer としてアップロードします。&lt;/p&gt;
&lt;h2 id=&quot;selenium-layer&quot; tabindex=&quot;-1&quot;&gt;selenium layer&lt;/h2&gt;
&lt;p&gt;画像のリサイズ処理を行うため、Pillow も一緒にインストールします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip3 install -t python/lib/python3.7/site-packages selenium Pillow
$ zip -r selenium.zip python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;動かん。もう無理。&lt;/p&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/mishimay/items/afd7f247f101fbe25f30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python] Headless Chrome を AWS Lambda で動かす - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/mishimay/items/e107b685381cca0493bf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python] pip3 のパッケージを AWS Lambda 上で import できるようにする - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://michimani.net/post/aws-use-pillow-in-lambda/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AWS Lambda で Pillow を使おうとしたらハマった - michimani.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>WindowsからsshでGUIを表示したメモ</title>
    <link href="https://ebiyuu.com/post/2021/06/ssh-gui/"/>
    <updated>2021-06-15T05:41:51Z</updated>
    <id>https://ebiyuu.com/post/2021/06/ssh-gui/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;~%2F.ssh%2Fconfig-%E3%81%AE%E8%A8%98%E8%BF%B0%E5%86%85%E5%AE%B9&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt; の記述内容&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Host hogehoge
    ForwardX11 yes
    ForwardX11Trusted yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;は記述しておく。&lt;/p&gt;
&lt;h2 id=&quot;vcxsrc-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;VcXsrc のインストール&lt;/h2&gt;
&lt;p&gt;VcXsrv を Windows 側で起動しておく。&lt;/p&gt;
&lt;p&gt;また、起動時のオプションで &lt;code&gt;-ac&lt;/code&gt; を指定する。&lt;/p&gt;
&lt;h2 id=&quot;wsl-%E3%81%A7%E3%81%AE%E8%A9%A6%E8%A1%8C&quot; tabindex=&quot;-1&quot;&gt;WSL での試行&lt;/h2&gt;
&lt;p&gt;普段 SSh クライアントは WSL 上の ssh を使っているので、何も考えず WSL で接続を試みた。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt;に以下を記述しておくとよいとのこと。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;DISPLAY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /etc/resolv.conf &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; nameserver &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{print $2}&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;:0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これで動くはずだったが、動かなかった。エラーも出ず何も起きない状況。&lt;/p&gt;
&lt;h2 id=&quot;powershell-%E3%81%A7%E3%81%AE%E8%A9%A6%E8%A1%8C&quot; tabindex=&quot;-1&quot;&gt;Powershell での試行&lt;/h2&gt;
&lt;p&gt;WSL-&amp;gt;Windows の通信がうまくいっていなさそうなのでシンプルに Windows 側の ssh クライアントで接続する。（最初からそうすればよかった）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$env:DISPLAY=&amp;quot;localhost:0.0&amp;quot;
ssh hoge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;すると、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh_askpass: posix_spawn: No such file or directory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;とのエラーメッセージが。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir &#92;dev
echo x &amp;gt; &#92;dev&#92;tty
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;を実行すれば良いらしいので実行したところうまく接続でき、GUI も表示された。&lt;/p&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/ryoi084/items/0dff11134592d0bb895c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WSL2 における VcXsrv の設定 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://teratail.com/questions/246584&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Linux - win10 標準の openSSH を使って、リモートの Ubuntu に X11 Forwarding したい｜ teratail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/jyomu/items/4bdb99776e88b7670026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;win10 に同梱の OpenSSH で ssh すると失敗するときの対処 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Xcode Cheatsheet</title>
    <link href="https://ebiyuu.com/post/2021/08/xcode-cheatsheet/"/>
    <updated>2021-08-19T12:56:25Z</updated>
    <id>https://ebiyuu.com/post/2021/08/xcode-cheatsheet/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;XCodeのショートカット（よく使うもの）&lt;/p&gt;
&lt;h3 id=&quot;%E3%83%93%E3%83%AB%E3%83%89%E9%96%A2%E9%80%A3&quot; tabindex=&quot;-1&quot;&gt;ビルド関連&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;キー&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;効果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;B&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;ビルド&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;R&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;.&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;停止&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E9%96%A2%E9%80%A3&quot; tabindex=&quot;-1&quot;&gt;エディタ関連&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;キー&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;効果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;↩︎&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;エディタのみ表示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;opt&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;↩︎&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;キャンバスを表示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;M&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;ミニマップ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;%E3%82%B3%E3%83%BC%E3%83%89%E9%96%A2%E9%80%A3&quot; tabindex=&quot;-1&quot;&gt;コード関連&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;キー&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;効果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;J&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;定義にジャンプ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;←︎&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;ジャンプから戻る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;/&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;クイックヘルプ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;kbd&gt;opt&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;/&lt;/kbd&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;関数・クラスにコメントを追加&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content>
  </entry>
  <entry>
    <title>pipenvのススメ</title>
    <link href="https://ebiyuu.com/post/2021/08/pipenv/"/>
    <updated>2021-08-23T10:31:25Z</updated>
    <id>https://ebiyuu.com/post/2021/08/pipenv/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;pipenv%E3%81%A8%E3%81%AF&quot; tabindex=&quot;-1&quot;&gt;pipenvとは&lt;/h2&gt;
&lt;p&gt;環境ごとにパッケージの管理ができるツール。npm・yarnのpython版&lt;/p&gt;
&lt;h3 id=&quot;docker%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83&quot; tabindex=&quot;-1&quot;&gt;Dockerとの比較&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ホストのpythonを用いるので軽い&lt;/li&gt;
&lt;li&gt;devcontainerを用いなくてもVSCodeが自動的に読み込んでくれる（後述の &lt;code&gt;.vev&lt;/code&gt; ファイルが必要）&lt;/li&gt;
&lt;li&gt;Pythonモジュール以外にインストールの必要がない場合はDockerより良さそう。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E6%8C%99%E5%8B%95&quot; tabindex=&quot;-1&quot;&gt;具体的な挙動&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pipfile&lt;/code&gt; に依存パッケージが記述される。 (&lt;code&gt;package.json&lt;/code&gt; に該当)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pipfile.lock&lt;/code&gt; に実際にインストールされたバージョンが記述される→環境による差異を防ぐ (&lt;code&gt;package.lock&lt;/code&gt;や&lt;code&gt;yarn.lock&lt;/code&gt;に該当)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;↑これらをgitにコミットすることで環境を共有できる&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;インストール&lt;/h2&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; pipenv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;pyenvとの連携が便利&lt;/p&gt;
&lt;h2 id=&quot;%E4%B8%BB%E8%A6%81%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89&quot; tabindex=&quot;-1&quot;&gt;主要コマンド&lt;/h2&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;pipenv &lt;span class=&quot;token parameter variable&quot;&gt;--python&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.8&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 初期化 pyenvが入っていると該当のpythonバージョンを読み込んでくれる。 (npm init)&lt;/span&gt;
pipenv &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; pandas &lt;span class=&quot;token comment&quot;&gt;# パッケージのインストール (npm install --save libname)&lt;/span&gt;
pipenv &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; black &lt;span class=&quot;token parameter variable&quot;&gt;--dev&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 開発用モジュールをinstall (npm install --save-dev libname)&lt;/span&gt;
pipenv &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--dev&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Pipfile.lockからインストール（cloneしたら基本これ） (npm install)&lt;/span&gt;
pipenv &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--dev&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Pipfileを使ってinstall（Pipfileを手動で編集してパッケージを追加した場合に実行する）&lt;/span&gt;
pipenv shell &lt;span class=&quot;token comment&quot;&gt;# pipenvの環境内に入る（vscodeのターミナルなら自動で実行してくれる）&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;.venv-%E3%81%AE%E7%94%9F%E6%88%90&quot; tabindex=&quot;-1&quot;&gt;.venv の生成&lt;/h2&gt;
&lt;p&gt;VSCodeで補完を効かせるために必要&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt;や&lt;code&gt;.bash_profile&lt;/code&gt; に記述。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PIPENV_VENV_IN_PROJECT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pyteyon.hatenablog.com/entry/2019/10/03/182407&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python：VSCode で pipenv 仮想環境にインストールしたライブラリの補完を効かせる - pyてよn日記&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pipenvを使ったPython開発まとめ - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Among usで近くにいる人と通話できる「BetterCrewLink」の使い方</title>
    <link href="https://ebiyuu.com/post/2021/08/better-crew-link/"/>
    <updated>2021-08-27T12:08:59Z</updated>
    <id>https://ebiyuu.com/post/2021/08/better-crew-link/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;Among usに特化した通話ツールで、Among usの部屋と連動して通話ができる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会議中だけ生きている人全員で会話ができる&lt;/li&gt;
&lt;li&gt;会議中以外はゲーム上で近くにいる人と通話ができる。&lt;/li&gt;
&lt;li&gt;死んだ人の声は生きている人には聞こえない。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;%E4%BC%9A%E8%AD%B0%E4%B8%AD%E4%BB%A5%E5%A4%96&quot; tabindex=&quot;-1&quot;&gt;会議中以外&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;近くにいる生きている人の声&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;近くにいる死んだ人の声&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;遠くにいる人の声&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;生きているクルーメイト&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえない&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生きているインポスター&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;em&gt;設定による&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;死んだ人&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;%E4%BC%9A%E8%AD%B0%E4%B8%AD&quot; tabindex=&quot;-1&quot;&gt;会議中&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;生きている人の声&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;死んだ人の声&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;生きているクルーメイト&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生きているインポスター&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえない &lt;small&gt;(要検証)&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;死んだ人&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;聞こえる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA&quot; tabindex=&quot;-1&quot;&gt;リポジトリ&lt;/h2&gt;
&lt;p&gt;Githubで開発が行われており、使い方もGithubに書いてある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/OhMyGuus/BetterCrewLink&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OhMyGuus/BetterCrewLink: Free, open, Among Us Proximity Chat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/OhMyGuus/BetterCrewlink-mobile&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OhMyGuus/BetterCrewlink-mobile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95&quot; tabindex=&quot;-1&quot;&gt;設定方法&lt;/h2&gt;
&lt;p&gt;注意点: 少なくとも一人は「Windows版BetterCrewLink+Windows版 Among us」の組み合わせの人が必要。&lt;/p&gt;
&lt;h3 id=&quot;windows&quot; tabindex=&quot;-1&quot;&gt;Windows&lt;/h3&gt;
&lt;p&gt;以下から.exeファイルをダウンロードしてインストールできる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/OhMyGuus/BetterCrewLink/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Releases · OhMyGuus/BetterCrewLink&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows版はPC上で起動しているAmong usを自動で認識し、自動的に接続される。&lt;/p&gt;
&lt;h3 id=&quot;android&quot; tabindex=&quot;-1&quot;&gt;Android&lt;/h3&gt;
&lt;p&gt;Google Play Storeからダウンロードできます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.bettercrewlink.app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BetterCrewlink - Apps on Google Play&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;android版の詳細に関しては詳しくないのでわかりません。&lt;/small&gt;&lt;/p&gt;
&lt;h3 id=&quot;%E3%81%9D%E3%81%AE%E4%BB%96&quot; tabindex=&quot;-1&quot;&gt;その他&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://web.bettercrewl.ink/settings&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ブラウザ版&lt;/a&gt;を使用してください。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Among usアプリでのルーム参加に加え、BetterCrewLinkでのルーム参加が必要。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Among usを起動する端末とBetterCrewLinkを開く端末は同じでも異なっていても大丈夫。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;よくあるトラブル&lt;/h2&gt;
&lt;h3 id=&quot;%E5%A3%B0%E3%81%8C%E4%BA%8C%E9%87%8D%E3%81%AB%E8%81%9E%E3%81%93%E3%81%88%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;声が二重に聞こえる&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;イヤホンをしていない人がいる可能性がある。全員がイヤホンを装着するようにしてください。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E4%BB%96%E3%81%AE%E4%BA%BA%E3%81%AE%E5%A3%B0%E3%81%8C%E8%81%9E%E3%81%93%E3%81%88%E3%81%AA%E3%81%84%E3%83%BB%E8%87%AA%E5%88%86%E3%81%AE%E5%A3%B0%E3%81%8C%E5%B1%8A%E3%81%8B%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;他の人の声が聞こえない・自分の声が届かない&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザ版であれば、マイクの使用が許可できているか確認する。リロードすると許可のポップアップが出ることがある。&lt;/li&gt;
&lt;li&gt;別の端末・ブラウザを試してみるというのも手。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E7%89%88%E3%81%A7%E3%80%8Cwaiting-for-a-pc-user-to-respond%E3%80%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E9%80%B2%E3%81%BE%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;ブラウザ版で「Waiting for a PC user to respond」と表示され進まない&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PC版のBetterCrewLinkを起動しているユーザーがいないか、その接続が悪い。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E7%89%88%E3%81%A7%E3%80%8Cwaiting-for-you-to-join-with-the-name-with-xxx%E3%80%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E9%80%B2%E3%81%BE%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;ブラウザ版で「Waiting for you to join with the name with XXX」と表示され進まない&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Among usのアプリでルームに参加していなければする。&lt;/li&gt;
&lt;li&gt;ルームIDまたはプレイヤー名が間違っている可能性がある。&lt;/li&gt;
&lt;li&gt;プレイヤー名が日本語の場合うまくいかない可能性が高いのでアルファベットに変更する。&lt;/li&gt;
&lt;li&gt;たまに名前を変えるとなおる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E7%89%B9%E5%AE%9A%E3%81%AE%E4%BA%BA%E3%81%AE%E5%A3%B0%E3%81%8C%E3%81%A0%E3%81%91%E3%81%8C%E8%81%9E%E3%81%93%E3%81%88%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;特定の人の声がだけが聞こえない&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Windows版・ブラウザ版ともにリロードすると治ることがある。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/OhMyGuus/BetterCrewLink&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OhMyGuus/BetterCrewLink: Free, open, Among Us Proximity Chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>静的サイトジェネレータをHugoから11tyに変更した</title>
    <link href="https://ebiyuu.com/post/2022/07/11ty/"/>
    <updated>2022-07-04T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2022/07/11ty/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;%E4%BB%8A%E3%81%BE%E3%81%A7%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9&quot; tabindex=&quot;-1&quot;&gt;今までの問題点&lt;/h2&gt;
&lt;p&gt;本サイトは、今まで「&lt;a href=&quot;https://www.ebiyuu.com/post/2021/06/blog-move/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ブログを移転しました&lt;/a&gt;」でも触れた通り、静的サイトジェネレータとして&lt;a href=&quot;https://gohugo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hugo&lt;/a&gt;を利用していた。
正確にはHugoのテーマの一つである&lt;a href=&quot;https://academic-demo.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Academic&lt;/a&gt;を使っていた。
プロフィールとして必要な情報を埋めると綺麗に表示してくれる上、ブログ機能も付いていてちょうど使いやすいテーマであった。&lt;/p&gt;
&lt;p&gt;しかし、今回はこのAcademicテーマを引退し、自分でhtml書くことにした。&lt;/p&gt;
&lt;p&gt;これは主に以下の2つの問題が原因であった。&lt;/p&gt;
&lt;h3 id=&quot;1.-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%81%8C%E9%9B%A3%E3%81%97%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;1. カスタムが難しい&lt;/h3&gt;
&lt;p&gt;Academicテーマはその名の通り研究者向けのテーマであるため、トップページにはプロフィールを表示することが想定されている。&lt;/p&gt;
&lt;p&gt;指定されたファイルを記入することによって自動で表示されるようになっており、少ない手間できれいなプロフィールページを作成することができる。&lt;/p&gt;
&lt;p&gt;例えばExperienceやPublicationなどのファイルに指定の方法で記入すると、一切htmlを書かずにプロフィールページを作ることができる。
以下は経歴欄を設定する &lt;code&gt;experience.md&lt;/code&gt; の一部の例である。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;experience:
  - title:
    company: ○○大学○○○学科○○学部
    company_url: https://www.xxxxxxxxxx.ac.jp/
    company_logo:
    location:
    date_start: &#39;20XX-04-01&#39;
    date_end: &#39;&#39;
    description:
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;しかし、逆にhtmlの一部だけを書きかえることは難しい。
もちろんレイアウトファイルを書きかえることで実現可能ではあるが、どのファイルを書きかえればよいかを調べるのは学習コストが高く感じた。
今後少し書きかえたかい場合にも毎回レイアウトファイルをカスタムする必要がある。&lt;/p&gt;
&lt;p&gt;htmlを書けるのであれば直接書いた方が効率的だと思い、自分でhtmlを書くことにした。&lt;/p&gt;
&lt;h3 id=&quot;2.-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%8C%E4%B8%8A%E6%89%8B%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;2. コンパイルが上手くいかない&lt;/h3&gt;
&lt;p&gt;どちらかというとこちらがメインの原因である。&lt;/p&gt;
&lt;p&gt;Hugoはgo言語によって動いており、Academicテーマは &lt;code&gt;go get&lt;/code&gt; によってインストールされている。
一方でHugoはaptなどのパッケージマネージャーでインストールする形式を取っており、これらのバージョンが整合しないという問題が発生した。
そのため手元のPCにおいて開発サーバーの起動やhtmlファイルの生成ができない状況になってしまった。&lt;/p&gt;
&lt;p&gt;ウェブサイトはNetlifyのGithub連携によって自動ビルドしてホスティングしており、なぜかデプロイビルドは通っていた。
ローカルではサーバーが起動しなくてもリポジトリにpushすれば反映されるという状況が続いており、しばらくはそのように更新していた。&lt;/p&gt;
&lt;p&gt;しかし、ローカルで確認できないというのは少し複雑な編集を行なうには不便であり、
またいつビルド環境が壊れてデプロイできなくなるかも分からず、不安であった。&lt;/p&gt;
&lt;p&gt;そのため、今回の移行に踏みきった。&lt;/p&gt;
&lt;h2 id=&quot;%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E9%81%B8%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;パッケージ選定&lt;/h2&gt;
&lt;p&gt;今回Hugoの依存関係によって苦労したため、今後はそのようなことが無いようにしたかった。&lt;/p&gt;
&lt;p&gt;また本番サイトはJavaScriptを使わない、シンプルなhtmlにしたいとも思っていた。&lt;/p&gt;
&lt;p&gt;これらを満たすものとして、今回はJavaScript製の軽量静的サイトフレームワーク、&lt;a href=&quot;https://www.11ty.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;11ty&lt;/a&gt;を選択した。&lt;/p&gt;
&lt;p&gt;11tyはただのhtmlテンプレートエンジンであり、JavaScriptなしのシンプルな静的サイトを作成するにはちょうどいいライブラリである。
また、11tyはNodeにしか依存せず、インストールも付属するnpmによって行えるため、インストールに関しても問題が発生しなさそうであった。&lt;/p&gt;
&lt;p&gt;11tyの詳細に関しては他のブログ記事に任せることとする。(追記するは可能性あり)&lt;/p&gt;
&lt;p&gt;ディレクトリ構造がそのままurlのパスとなる仕様は移行前と同じであったため、記事の移行は簡単であった。&lt;/p&gt;
&lt;p&gt;テーマ等を使わずhtml・CSSも1から書いているため、現在はシンプルなCSSしか書いていないが、今後適宜デザインを変更していく予定である。&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>AWSでminecraftサーバーを立てる (1.19)</title>
    <link href="https://ebiyuu.com/post/2022/07/minecraft-server1.19/"/>
    <updated>2022-07-17T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2022/07/minecraft-server1.19/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;AWS EC2でminecraftのサーバーを構築した。
遊ぶ時だけ起動する運用なら時間課金制のEC2は便利。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E9%81%B8%E6%8A%9E&quot; tabindex=&quot;-1&quot;&gt;インスタンスの選択&lt;/h2&gt;
&lt;p&gt;今回は少人数でのプレイを想定していたため、 &lt;code&gt;t3.meduim&lt;/code&gt; を選択。&lt;/p&gt;
&lt;p&gt;インスタンスの作成からsshの設定までは省略する。&lt;/p&gt;
&lt;p&gt;また、Security Groupを編集して25565番ポートを開けておく。&lt;/p&gt;
&lt;h2 id=&quot;jdk%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;JDKのインストール&lt;/h2&gt;
&lt;p&gt;Minecraft server 1.19はJDK18を要求している。&lt;/p&gt;
&lt;p&gt;今回はAWSが用意しているJDKディストリビューションである&lt;a href=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-18-ug/generic-linux-install.html#rpm-linux-install-instruct&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Amazon Corretto&lt;/a&gt;を利用した。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rpm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--import&lt;/span&gt; https://yum.corretto.aws/corretto.key
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; yum &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; java-18-amazon-corretto-devel&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;サーバーのインストール&lt;/h2&gt;
&lt;p&gt;今回はバニラサーバーではなく、modのインストールなどができる非公式の&lt;a href=&quot;https://www.spigotmc.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Spigot&lt;/a&gt;をインストールした。&lt;/p&gt;
&lt;p&gt;インストール時にgitが必要になるのでこちらもインストールしておく。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo yum install -y git
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
java -jar BuildTools.jar --rev 1.19
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E8%B5%B7%E5%8B%95%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;起動スクリプトの設定&lt;/h2&gt;
&lt;p&gt;起動用のシェルスクリプトファイルを作成する。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;vi&lt;/span&gt; start.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;start.sh&lt;/code&gt; に以下の内容を記入する。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/sh&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;java&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Xmx3500M&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Xms2048M&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-jar&lt;/span&gt; /home/ec2-user/minecraft/spigot-1.19.jar nogui&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;755&lt;/span&gt; start.sh
./start.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;サーバーが起動すれば成功。 &lt;code&gt;eula.txt&lt;/code&gt; の編集を求められる。&lt;/p&gt;
&lt;h2 id=&quot;%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96&quot; tabindex=&quot;-1&quot;&gt;デーモン化&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;screen&lt;/code&gt; などを用いて永続化してもいいが、今回はインスタンスの起動時に自動で起動・クラッシュ時に自動で再起動するよう、 &lt;code&gt;systemd&lt;/code&gt; に登録する。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vi&lt;/span&gt; /etc/systemd/system/minecraft.service&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description = Minecraft server

[Service]
ExecStart = /home/ec2-user/start.sh
WorkingDirectory=/home/ec2-user
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存できたら、&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl start minecraft&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;で起動確認をする。正常に起動できていれば、サービスを有効化する。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; minecraft&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;サーバーログは&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;systemctl status minecraft&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;で(一部)確認が可能。&lt;/p&gt;
&lt;h2 id=&quot;slack%E9%80%9A%E7%9F%A5&quot; tabindex=&quot;-1&quot;&gt;Slack通知&lt;/h2&gt;
&lt;p&gt;起動前・終了時にSlackのimcoming webhookを用いて通知を送るため、 &lt;code&gt;start.sh&lt;/code&gt; を以下のように編集したが、これは必須ではない。&lt;/p&gt;
&lt;p&gt;EC2インスタンスから &lt;code&gt;169.254.169.254&lt;/code&gt; にリクエストを送るとインスタンス情報が取得できるため、これを利用してIPアドレスを取得している。
ElasticIPを割り当てていない場合、毎回起動ごとにIPアドレスが変わるのでSlackで共有しておくと便利である。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#! /bin/sh&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dirname&lt;/span&gt; $0&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;notify_slack&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-XPOST&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; Content-Type:application/json &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{&lt;span class=&quot;token entity&quot; title=&quot;&#92;&amp;quot;&quot;&gt;&#92;&quot;&lt;/span&gt;text&lt;span class=&quot;token entity&quot; title=&quot;&#92;&amp;quot;&quot;&gt;&#92;&quot;&lt;/span&gt;:&lt;span class=&quot;token entity&quot; title=&quot;&#92;&amp;quot;&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&#92;&amp;quot;&quot;&gt;&#92;&quot;&lt;/span&gt;}&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;webhook url&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/dev/null &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;on_exit&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  notify_slack &lt;span class=&quot;token string&quot;&gt;&quot;Minecraft server stopped&lt;span class=&quot;token entity&quot; title=&quot;&#92;&#92;&quot;&gt;&#92;&#92;&lt;/span&gt;nIP Address: &#92;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;$ip_addr&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;ip_addr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;169.254.169.254/latest/meta-data/public-ipv4/&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;/dev/null&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;

notify_slack &lt;span class=&quot;token string&quot;&gt;&quot;Minecraft server starting&lt;span class=&quot;token entity&quot; title=&quot;&#92;&#92;&quot;&gt;&#92;&#92;&lt;/span&gt;nIP Address: &#92;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;$ip_addr&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;trap&lt;/span&gt; on_exit EXIT

&lt;span class=&quot;token function&quot;&gt;java&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Xmx3500M&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Xms2048M&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-jar&lt;/span&gt; /home/ec2-user/spigot-1.19.jar nogui &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; line
&lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *joined&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt; the&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt; game* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; notify_slack &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *left&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt; the&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt; game* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; notify_slack &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *Done* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; notify_slack &lt;span class=&quot;token string&quot;&gt;&quot;Server started!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF&quot; tabindex=&quot;-1&quot;&gt;参考リンク&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/minecraft-for-aws_ec2-instance/#toc-8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;【Minecraft for AWS】 EC2インスタンスでMinecraftサーバーを構築 | DevelopersIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-18-ug/generic-linux-install.html#rpm-linux-install-instruct&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.aws.amazon.com/corretto/latest/corretto-18-ug/generic-linux-install.html#rpm-linux-install-instruct&lt;/a&gt; Amazon Corretto 18 Installation Instructions for Debian-Based, RPM-Based and Alpine Linux Distributions - Amazon Corretto 18]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.spigotmc.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SpigotMC - High Performance Minecraft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.hgrs.me/20200223233018&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Minecraft のマルチサーバでログイン通知を Slack / Discord / LINE に送る | hgrs&#39;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webbibouroku.com/Blog/Article/shell-try-catch-finally&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;シェルスクリプトでtry-catch-finallyを実装する方法 │ Web備忘録&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>ghとghq(+peco)で作る快適git環境</title>
    <link href="https://ebiyuu.com/post/2023/03/ghq-gh/"/>
    <updated>2023-03-15T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/03/ghq-gh/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;%E7%B4%B9%E4%BB%8B%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE&quot; tabindex=&quot;-1&quot;&gt;紹介するもの&lt;/h2&gt;
&lt;h3 id=&quot;gh&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://cli.github.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;gh&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHubの公式cliクライアント。少し前には &lt;code&gt;hub&lt;/code&gt; とかあったけどもうghで十分。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh repo view -w&lt;/code&gt; 現在のリポジトリをwebで表示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh pr create&lt;/code&gt; 現在のブランチからpull-requestを作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh repo create&lt;/code&gt; リポジトリを作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh run watch&lt;/code&gt; 現在実行中のGithub actionsを表示・監視&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ghq&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://github.com/x-motemen/ghq&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ghq&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;gitでcloneしたフォルダをフォルダ管理してくれる優れもの。「あのフォルダどこにcloneしたんだっけ？」がなくなる。
&lt;ul&gt;
&lt;li&gt;「とりあえずリポジトリcloneして中見たい！」みたいなときにも考えることが減るのが良いポイント。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;例えば &lt;code&gt;https://github.com/ebiyuu1121/ebiyuu.com/&lt;/code&gt; だったら自動的に &lt;code&gt;~/ghq/github.com/ebiyuu1121/ebiyuu.com/&lt;/code&gt; にcloneされる。
&lt;ul&gt;
&lt;li&gt;上記の例だと &lt;code&gt;ghq get -p ebiyuu1121/ebiyuu.com&lt;/code&gt; でcloneできる。&lt;/li&gt;
&lt;li&gt;自分のリポジトリだったらユーザー名も省略できるので、 &lt;code&gt;ghq get -p ebiyuu.com&lt;/code&gt; で十分。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;各種コマンドもあり、例えば &lt;code&gt;ghq list | ghq get --update --parallel&lt;/code&gt; でローカルの全リポジトリを最新状態にできます。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Songmu/ghq-handbook/tree/master/ja&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ghq-handbook&lt;/a&gt; が分かりやすいのでおすすめです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;peco&quot; tabindex=&quot;-1&quot;&gt;peco&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ghqでcloneしたフォルダに移動するときに、pecoでインタラクティブにリポジトリを選択するのが便利。&lt;/li&gt;
&lt;li&gt;これに関しては設定して使ってみてください。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E8%A8%AD%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;設定&lt;/h2&gt;
&lt;p&gt;書いてないOS・環境は公式サイト参照。&lt;/p&gt;
&lt;h3 id=&quot;git&quot; tabindex=&quot;-1&quot;&gt;git&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;windows: &lt;code&gt;scoop install git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ubuntu: &lt;code&gt;sudo apt install git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;mac: XCode command line toolsに付属&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;gh-1&quot; tabindex=&quot;-1&quot;&gt;gh&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;windows: &lt;code&gt;scoop install gh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ghq-1&quot; tabindex=&quot;-1&quot;&gt;ghq&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;goのインストール
&lt;ul&gt;
&lt;li&gt;win: &lt;code&gt;scoop install go&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ubuntu: &lt;code&gt;sudo apt install golang&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;go install github.com/motemen/ghq&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;peco-1&quot; tabindex=&quot;-1&quot;&gt;peco&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;windows: &lt;code&gt;scoop install peco&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ubuntu: &lt;code&gt;apt install peco&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;mac: &lt;code&gt;brew install peco&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;.zshrc&quot; tabindex=&quot;-1&quot;&gt;.zshrc&lt;/h3&gt;
&lt;p&gt;以下をzshrcに追記&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;]&lt;/code&gt; で起動してcdできます。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;peco-src&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;selected_dir&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;ghq list &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; peco &lt;span class=&quot;token parameter variable&quot;&gt;--query&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$LBUFFER&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$selected_dir&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;BUFFER&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cd &lt;span class=&quot;token variable&quot;&gt;${selected_dir}&lt;/span&gt;&quot;&lt;/span&gt;
    zle accept-line
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
zle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; peco-src
bindkey &lt;span class=&quot;token string&quot;&gt;&#39;^]&#39;&lt;/span&gt; peco-src&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>cliマネージャ &quot;afx&quot; を試す</title>
    <link href="https://ebiyuu.com/post/2023/05/afx/"/>
    <updated>2023-05-16T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/05/afx/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/b4b4r07/afx/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;b4b4r07/afx: 📦 Package manager for CLI&lt;/a&gt;を使ってみる。&lt;/p&gt;
&lt;p&gt;yamlファイルをもとに、宣言的にツールのインストールができるらしい。zplugの作者の作。
現状では GitHub / GitHub Release / Gist / HTTP (web) / Local からのインストールに対応している。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;インストール&lt;/h2&gt;
&lt;p&gt;Goで書かれている。 &lt;code&gt;go install&lt;/code&gt; でもインストールできるようだが、
インストールスクリプトが用意されていたので今回はそちらを試す。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sL&lt;/span&gt; https://raw.githubusercontent.com/b4b4r07/afx/HEAD/hack/install &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;実行したところ、インストールスクリプトが上手く動かなかったため、PRを出しておいた。(2023/5/18 追記: マージされた)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/b4b4r07/afx/pull/59&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fix: fix install script by ebiyuu1121 · Pull Request #59 · b4b4r07/afx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、コマンドを実行したところ設定ディレクトリが存在せず、エラーとなったため、 &lt;code&gt;~/.config/afx&lt;/code&gt; を作成した。&lt;/p&gt;
&lt;p&gt;なお、エラーになるのは不自然だと思ったので、こちらもPull-requestを作成しておいた。(2023/5/18 追記: マージされた)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/b4b4r07/afx/pull/60&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Create ~/.config/afx if not exist by ebiyuu1121 · Pull Request #60 · b4b4r07/afx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この後、 &lt;code&gt;.zshrc&lt;/code&gt; に以下の2行を追記する。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# set up afx&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; afx &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;afx init&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; afx &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;afx completion &lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2023/5/18 追記: 上記の設定では補完が出ないことが判明した。上の2行の下に&lt;a href=&quot;https://github.com/ebiyuu1121/dotfiles/commit/01f6dcebc872d86978653ad839e4daf7f72d0e57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;以下を追加&lt;/a&gt;すれば無事補完が効いた(バグかも)&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; afx &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; compdef _afx afx&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;neovim%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;neovimをビルドしてみる&lt;/h2&gt;
&lt;p&gt;以下のyamlを &lt;code&gt;~/.config/afx/github.yaml&lt;/code&gt; に配置する。&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; neovim/neovim
  &lt;span class=&quot;token key atrule&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Vim&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;fork focused on extensibility and usability
  &lt;span class=&quot;token key atrule&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; neovim
  &lt;span class=&quot;token key atrule&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; neovim
  &lt;span class=&quot;token key atrule&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; master
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; make CMAKE_BUILD_TYPE=RelWithDebInfo
    &lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;EDITOR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nvim
    &lt;span class=&quot;token key atrule&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;vi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nvim
    &lt;span class=&quot;token key atrule&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; build/bin/nvim&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この状態で &lt;code&gt;afx install&lt;/code&gt; を実行し、ビルドに成功した。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/afx/img/afx-nvim.png&quot; alt=&quot;afx-nvim&quot; /&gt;&lt;/p&gt;
&lt;p&gt;gitリポジトリは &lt;code&gt;~/.afx/github.com&lt;/code&gt; 以下に展開されていた。
このうち、yamlの &lt;code&gt;link&lt;/code&gt; で指定したバイナリが &lt;code&gt;~/bin&lt;/code&gt; へとリンクされていた。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/afx/img/afx-nvim2.png&quot; alt=&quot;afx-nvim2&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B4%E6%96%B0&quot; tabindex=&quot;-1&quot;&gt;パッケージの更新&lt;/h2&gt;
&lt;p&gt;NeovimのHEADを追いかけ続けるために、 &lt;code&gt;afx update&lt;/code&gt; で最新にアップデートしたい。
しかし、 &lt;code&gt;afx update&lt;/code&gt; を実行しても &lt;code&gt;git fetch&lt;/code&gt; をしている様子はなかった。&lt;/p&gt;
&lt;p&gt;ソースを確認したところ、TOODコメントが記載されていた。
今後の実装に期待、または自分で実装をしたい。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/afx/img/afx-update-not-supported.png&quot; alt=&quot;afx-update-not-supported&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ビルドの自動化ができて便利そうだった。
今後はchezmoiとの連携、各種環境でのビルドに取り組みたい。&lt;/p&gt;
&lt;p&gt;にしても、 &lt;code&gt;afx&lt;/code&gt; は検索ノイズが多かった。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tellme.tokyo/post/2022/03/02/package-manager-for-cli/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;新しいコマンドラインツール向けのパッケージマネージャ | tellme.tokyo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/neovim/neovim&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;neovim/neovim: Vim-fork focused on extensibility and usability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/b4b4r07/afx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;b4b4r07/afx: 📦 Package manager for CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://babarot.me/afx/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AFX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Nginxのproxy_passをS3のurlに設定すると404になる</title>
    <link href="https://ebiyuu.com/post/2023/05/nginx-s3/"/>
    <updated>2023-05-19T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/05/nginx-s3/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;%E5%95%8F%E9%A1%8C&quot; tabindex=&quot;-1&quot;&gt;問題&lt;/h2&gt;
&lt;p&gt;AWS S3のstatic website hostingのurlに対して、nginxのリバースプロキシを設定しようとした。&lt;/p&gt;
&lt;p&gt;nginxの設定は以下の通り。&lt;/p&gt;
&lt;pre class=&quot;language-nginx&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://&amp;lt;bucket-name&gt;.s3-website-ap-northeast-1.amazonaws.com&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;すると、該当urlへのアクセスにより &amp;quot;Bucket not found&amp;quot; エラーが表示される。&lt;/p&gt;
&lt;h2 id=&quot;%E8%A7%A3%E6%B1%BA%E7%AD%96&quot; tabindex=&quot;-1&quot;&gt;解決策&lt;/h2&gt;
&lt;p&gt;プロキシ先に渡すHostヘッダーを再設定する。&lt;/p&gt;
&lt;pre class=&quot;language-diff-nginx&quot;&gt;&lt;code class=&quot;language-diff-nginx&quot;&gt;&lt;span class=&quot;token unchanged language-nginx&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-nginx&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;       &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Host http://&amp;lt;bucket-name&gt;.s3-website-ap-northeast-1.amazonaws.com&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token unchanged language-nginx&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://&amp;lt;bucket-name&gt;.s3-website-ap-northeast-1.amazonaws.com&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;S3側ではHostヘッダを見て返すリソースを判断しているようだ。&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Dockerでminecraftを動かしてみる</title>
    <link href="https://ebiyuu.com/post/2023/05/minecraft-docker/"/>
    <updated>2023-05-21T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/05/minecraft-docker/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;minecraftサーバーをdockerで立ててみる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/itzg/docker-minecraft-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;itzg/docker-minecraft-server&lt;/a&gt; を見つけたので使ってみる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; を記述する。&lt;/p&gt;
&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;mc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; itzg/minecraft&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 25565&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;25565&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;EULA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;TRUE&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;MEMORY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4G&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;tty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;stdin_open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ./minecraft&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下を実行したところ、エラーが発生して起動できなかった。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; compose up&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-log&quot;&gt;&lt;code class=&quot;language-log&quot;&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;image&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;helper&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token time number&quot;&gt;06:24:30.358&lt;/span&gt; &lt;span class=&quot;token level error important&quot;&gt;ERROR&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;get&#39;&lt;/span&gt; command failed&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; Version is &lt;span class=&quot;token number&quot;&gt;1.29.0&lt;/span&gt;
mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;java.net.UnknownHostException:&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;launchermeta.mojang.com:&lt;/span&gt; Temporary failure in name resolution
mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         at java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;base&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;net&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Inet4AddressImpl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lookupAllHostAddr&lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;Native Method&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         at java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;base&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;net&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;InetAddress&lt;span class=&quot;token operator&quot;&gt;$&lt;/span&gt;PlatformNameService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lookupAllHostAddr&lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;Unknown Source&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;

                  &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;中略&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;

mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         at picocli&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CommandLine&lt;span class=&quot;token operator&quot;&gt;$&lt;/span&gt;RunLast&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;execute&lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;CommandLine&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;java&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2417&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         at picocli&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CommandLine&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;execute&lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;CommandLine&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;java&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2170&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         at me&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;itzg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;helpers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;McImageHelper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;main&lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;McImageHelper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;java&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;139&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;init&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token level error important&quot;&gt;ERROR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; version lookup failed&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; exited with code &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DNSが解決できていないようなので、docker-composeでdnsを指定してなんとかする。&lt;/p&gt;
&lt;pre class=&quot;language-diff-yaml&quot;&gt;&lt;code class=&quot;language-diff-yaml&quot;&gt;&lt;span class=&quot;token unchanged language-yaml&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;  &lt;span class=&quot;token key atrule&quot;&gt;mc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; itzg/minecraft&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 25565&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;25565&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      &lt;span class=&quot;token key atrule&quot;&gt;EULA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;TRUE&quot;&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      &lt;span class=&quot;token key atrule&quot;&gt;MEMORY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4G&quot;&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;tty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;stdin_open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-yaml&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;dns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8.8.8.8
&lt;/span&gt;&lt;span class=&quot;token unchanged language-yaml&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ./minecraft&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/data
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;起動できた。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-docker/img/mc-login.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-docker/img/mc-loggedin.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>ECSでマイクラサーバーを立ててみる。</title>
    <link href="https://ebiyuu.com/post/2023/05/minecraft-ecs/"/>
    <updated>2023-05-22T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/05/minecraft-ecs/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;「&lt;a href=&quot;https://ebiyuu.com/post/2023/05/minecraft-docker/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Dockerでminecraftを動かしてみる&lt;/a&gt;」 の続き。&lt;/p&gt;
&lt;h2 id=&quot;1.-%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90&quot; tabindex=&quot;-1&quot;&gt;1. クラスターの作成&lt;/h2&gt;
&lt;p&gt;適当な名前で作成する。&lt;/p&gt;
&lt;h2 id=&quot;2.-%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E4%BD%9C%E6%88%90&quot; tabindex=&quot;-1&quot;&gt;2. タスクの作成&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/itzg/minecraft-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;itzg/minecraft-server - Docker Image | Docker Hub&lt;/a&gt; を使う。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-ecs/img/task-definition2.png&quot; alt=&quot;task-definition2&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;3.-%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90&quot; tabindex=&quot;-1&quot;&gt;3. デプロイメントの作成&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-ecs/img/deployment-config.png&quot; alt=&quot;deployment-config&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-ecs/img/deploy-status.png&quot; alt=&quot;deploy-status&quot; /&gt;&lt;/p&gt;
&lt;p&gt;落ちた。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-ecs/img/deploy-fail.png&quot; alt=&quot;deploy-fail&quot; /&gt;&lt;/p&gt;
&lt;p&gt;EULAをtrueに設定するのを忘れていたので、
環境変数で &lt;code&gt;EULA&lt;/code&gt; = &lt;code&gt;true&lt;/code&gt; を設定して再度試す。&lt;/p&gt;
&lt;h2 id=&quot;4.-%E8%B5%B7%E5%8B%95%E7%A2%BA%E8%AA%8D&quot; tabindex=&quot;-1&quot;&gt;4. 起動確認&lt;/h2&gt;
&lt;p&gt;ログはCloudWatch Logsで確認できる。&lt;/p&gt;
&lt;p&gt;起動していた。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-ecs/img/mc-launched.png&quot; alt=&quot;mc-launched&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接続できた。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/05/minecraft-ecs/img/connected-.png&quot; alt=&quot;connected-&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ただし、VPCのsecurity groupを編集して &lt;code&gt;TCP/25565&lt;/code&gt; アクセスを許可する必要がった。
今回はデフォルトVPCを使ったため戻したが、実際は専用のVPCを作った方がよいのかも。&lt;/p&gt;
&lt;p&gt;これはちょっと調べる。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8&quot; tabindex=&quot;-1&quot;&gt;これからやりたいこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Volumeを使ってセーブデータを永続化する&lt;/li&gt;
&lt;li&gt;Lambdaを使って起動・終了をする&lt;/li&gt;
&lt;li&gt;Public IPにDNSを割り当てる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/NaokiIshimura/items/45d2288b5a2fc4e4e4e4#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-2-docker-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E6%A7%8B%E7%AF%89%E3%82%BF%E3%82%B0%E4%BB%98%E3%81%91%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Amazon ECS コンソールの初回実行ウィザードを利用してコンテナを動かす - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/itzg/docker-minecraft-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;itzg/docker-minecraft-server: Docker image that provides a Minecraft Server that will automatically download selected version at startup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Keyball61を組んだ</title>
    <link href="https://ebiyuu.com/post/2023/06/keyball61/"/>
    <updated>2023-06-06T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/06/keyball61/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;トラックボール付き分割キーボードであるところの&lt;a href=&quot;https://shirogane-lab.com/products/keyball61&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keyball61&lt;/a&gt;を購入したので組み立てた。&lt;/p&gt;
&lt;p&gt;要約すると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;トラックボールを買え&lt;/li&gt;
&lt;li&gt;キースイッチは予備を買っておけ&lt;/li&gt;
&lt;li&gt;Pro Microの向きには気をつけろ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E6%9D%90%E6%96%99%E3%81%AE%E8%AA%BF%E9%81%94&quot; tabindex=&quot;-1&quot;&gt;材料の調達&lt;/h2&gt;
&lt;p&gt;「自作キーボード」なので、もろもろのパーツを買って組み立てないといけない。&lt;/p&gt;
&lt;p&gt;必要な部品のリストは&lt;a href=&quot;https://shop.yushakobo.jp/products/5358&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;遊舎工房のページ&lt;/a&gt;や
&lt;a href=&quot;https://github.com/Yowkees/keyball/blob/main/keyball61/doc/rev1/buildguide_jp.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ビルドガイド&lt;/a&gt; に書いてある。&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%AD%E3%83%BC%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81&quot; tabindex=&quot;-1&quot;&gt;キースイッチ&lt;/h3&gt;
&lt;p&gt;とりあえず初心者は赤軸、という記事を見かけたのと、ミーティング中にうるさくないキーボードがほしかったので、
&lt;a href=&quot;https://shop.yushakobo.jp/products/cherry-mx?variant=44079445672167&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cherry MXのピンク軸&lt;/a&gt;を購入。&lt;/p&gt;
&lt;p&gt;気に入らなかったら交換すればいいやというのと、どうせ長く使わないと実際に使用感は分からないと思ったため、
特に比較せず購入。&lt;/p&gt;
&lt;p&gt;親指は&lt;a href=&quot;https://shop.yushakobo.jp/products/pg1350?variant=44079245492455&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ロープロの赤軸&lt;/a&gt;のキースイッチを採用。&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%AD%E3%83%BC%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97&quot; tabindex=&quot;-1&quot;&gt;キーキャップ&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://shop.yushakobo.jp/products/a0300pc-01-1?variant=37665534673057&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;刻印ありのPBTキーキャップ一式&lt;/a&gt;と、
特殊キー用の&lt;a href=&quot;https://shop.yushakobo.jp/products/dsa-blank-keycaps?_pos=1&amp;amp;_sid=470a31dc8&amp;amp;_ss=r&amp;amp;variant=37665598308513&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DSA無刻印&lt;/a&gt;を購入。&lt;/p&gt;
&lt;p&gt;DSAとPBTの違いが分からず買ったので、いずれ統一しないといけない。&lt;/p&gt;
&lt;p&gt;特殊キーはどうせすぐキーマップが変わると思ったので、無刻印にした。
キーマップが固まったらオーダーメイドで何か刻印してもいいかな。&lt;/p&gt;
&lt;h3 id=&quot;%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;トラックボール&lt;/h3&gt;
&lt;p&gt;買い忘れたので自宅にあった&lt;a href=&quot;https://www.amazon.co.jp/gp/product/B0BXCTQJP7/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;amp;psc=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MX ergo&lt;/a&gt;から羅生門した。&lt;/p&gt;
&lt;h2 id=&quot;%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%81%A7%E8%A9%B0%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D&quot; tabindex=&quot;-1&quot;&gt;組み立てで詰まったところ&lt;/h2&gt;
&lt;h3 id=&quot;pro-micro%E3%81%AE%E5%90%91%E3%81%8D%E3%82%92%E9%96%93%E9%81%95%E3%81%88%E3%81%9F&quot; tabindex=&quot;-1&quot;&gt;Pro Microの向きを間違えた&lt;/h3&gt;
&lt;p&gt;Pro Microは部品面が下。ちゃんとビルドガイドを見よう。&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%AD%E3%83%BC%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%AE%E8%B6%B3%E3%81%8C%E6%8A%98%E3%82%8C%E3%81%9F-(x3)&quot; tabindex=&quot;-1&quot;&gt;キースイッチの足が折れた (x3)&lt;/h3&gt;
&lt;p&gt;特定のキーが反応しなかった。キースイッチを引き抜いてみたところ、足が曲がっていた。
新しいキースイッチに交換して対応した。&lt;/p&gt;
&lt;p&gt;キースイッチの予備はあったほうがいい。&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%AD%E3%83%BC%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E3%83%8F%E3%83%B3%E3%83%80%E4%BB%98%E3%81%91%E4%B8%8D%E8%89%AF-(x1)&quot; tabindex=&quot;-1&quot;&gt;キーソケットのハンダ付け不良 (x1)&lt;/h3&gt;
&lt;p&gt;キーソケットのハンダ付け不良が1箇所あった。
温め直してハンダを流し込んで修正。&lt;/p&gt;
&lt;p&gt;逆に1箇所しかなかったのは少なくて意外だった。&lt;/p&gt;
&lt;h3 id=&quot;pro-micro%E3%81%AE%E6%8E%A5%E8%A7%A6%E4%B8%8D%E8%89%AF-(x2)&quot; tabindex=&quot;-1&quot;&gt;Pro Microの接触不良 (x2)&lt;/h3&gt;
&lt;p&gt;Row 4が左右ともに反応しなかったので、ProMicroの接触不良を疑った。
実際にテスターを当ててみたら導通していなかった。差し直したら直った。
ソケットの信頼性に若干の不安。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97&quot; tabindex=&quot;-1&quot;&gt;キーマップ&lt;/h2&gt;
&lt;p&gt;キーマップは試行錯誤中なので、いずれ。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://goropikari.hatenablog.com/entry/keyball39_build_log&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;keyball39 を組み立てた - goropikariの備忘録&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://monoworks.co.jp/post/2023-04-10-first-self-made-keyboard-keyball61/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;はじめての自作キーボード：Keyball61 - チラシのすきま&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>keyball61のキーマップが固まってきた</title>
    <link href="https://ebiyuu.com/post/2023/07/keyball61-keymap/"/>
    <updated>2023-07-15T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/07/keyball61-keymap/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;&lt;a href=&quot;https://ebiyuu.com/post/2023/06/keyball61/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keyball61を組んだ&lt;/a&gt; のつづき。&lt;/p&gt;
&lt;p&gt;いろいろと試行錯誤してキーマップが固まってきたので紹介する。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97&quot; tabindex=&quot;-1&quot;&gt;キーマップ&lt;/h2&gt;
&lt;p&gt;Remapでキーマップしていたが、キーマップが固まってきたのでQMK firmwareでキーマップを定義してみた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ebiyuu1121/keyball/blob/main/qmk_firmware/keyboards/keyball/keyball61/keymaps/ebiyuu1121/keymap.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;keymap.c&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Layer1: テンキーレイヤ&lt;/li&gt;
&lt;li&gt;Layer2: マウス用レイヤ&lt;/li&gt;
&lt;li&gt;Layer3: カーソル用レイヤ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のイメージで組んでいる。&lt;/p&gt;
&lt;p&gt;ポイントとしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スクロールはLayer3に割り当てている。&lt;/li&gt;
&lt;li&gt;vimmerなので左手親指にescキーを置いている&lt;/li&gt;
&lt;li&gt;右手の親指にはBackspace/Enterを置いている。誤爆すると怖いキーなのでLong tapキーは入れていない&lt;/li&gt;
&lt;li&gt;右下に &lt;code&gt;-&lt;/code&gt; キーを置いている(指じゃなくて手のひらで押す)&lt;/li&gt;
&lt;li&gt;片手でマウスを操作するために、右下にLayer2/3のキーを置いている。&lt;/li&gt;
&lt;li&gt;Layer2に &lt;code&gt;ctrl&lt;/code&gt; ( + &lt;code&gt;shift&lt;/code&gt; ) + &lt;code&gt;tab&lt;/code&gt; を置いて、ブラウザ等のタブ切り替えが楽にできるようにしている&lt;/li&gt;
&lt;li&gt;数字を楽に入力したいので、テンキーレイヤを用意
&lt;ul&gt;
&lt;li&gt;Layer2に置いている左手テンキーはいま実験中。左手テンキーで慣れればLayer1を削除できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Layer3の左側にトラックボール関係の調整キーを導入&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;uint16_t&lt;/span&gt; PROGMEM keymaps&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;MATRIX_ROWS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;MATRIX_COLS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LAYOUT_universal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    KC_ESC   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_1     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_2     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_3     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_4     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_5     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  KC_6     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_7     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_8     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_9     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_0     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_EQL   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    KC_TAB   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_Q     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_W     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_E     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_R     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_T     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  KC_Y     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_U     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_I     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_O     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_P     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_BSLS  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    KC_LCTL  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_A     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_S     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_D     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_G     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  KC_H     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_J     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_K     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_L     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_SCLN  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_QUOT  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    KC_LSFT  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_Z     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_X     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_C     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_V     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_B     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_LBRC  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;            KC_RBRC  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_N     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_M     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_COMM  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_DOT   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_SLSH  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;MO&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_LALT  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_LGUI  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;MO&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;KC_SPC&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;KC_ESC&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;           KC_BSPC  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_ENT   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_MINS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LAYOUT_universal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_7     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_8     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_9     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_7     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_8     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_9     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_4     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_5     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_6     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_4     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_5     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_6     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_0     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_1     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_2     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_3     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;            _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_0     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_1     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_2     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_3     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_DOT   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;            KC_BSPC  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_ENT   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LAYOUT_universal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F1    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F2    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F3    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F4    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F5    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  KC_F6    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F7    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F8    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F9    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F10   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F11   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_7     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_8     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_9     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_F12   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_4     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_5     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_6     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_BTN1  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_BTN3  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_BTN2  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_0     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_1     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_2     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_3     &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;             _______ &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;RCS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;KC_TAB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______ &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;KC_TAB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;             KC_BTN4 &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_BTN5  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_GRAVE
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;LAYOUT_universal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  KC_HOME  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_PGDN  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_PGUP  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_END   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CPI_D1K  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CPI_D100 &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CPI_I100 &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CPI_I1K  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                                  KC_LEFT  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_DOWN  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_UP    &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_RIGHT &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SCRL_DVI &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SCRL_DVD &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KBC_SAVE &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;            KBC_RST  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;            KC_DEL   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; KC_ENT   &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______  &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _______
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;automatic-mouse-layer&quot; tabindex=&quot;-1&quot;&gt;Automatic Mouse Layer&lt;/h2&gt;
&lt;p&gt;結果的に導入しなかったが、記録として残しておく。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kamiichi99/keyball/blob/main/qmk_firmware/keyboards/keyball/readme.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;かみだいさんのファームウェア&lt;/a&gt;が有名。&lt;/li&gt;
&lt;li&gt;QMKのファームウェアを0.19以上に上げることで公式での対応が可能(&lt;a href=&quot;https://wonwon-eater.com/keyball44/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;参考&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;今回は後者をやってみた。&lt;/p&gt;
&lt;p&gt;結果的に、誤爆が頻発したのでやめた。&lt;/p&gt;
&lt;h2 id=&quot;%E3%83%86%E3%83%B3%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0&quot; tabindex=&quot;-1&quot;&gt;テンティング&lt;/h2&gt;
&lt;p&gt;キーマップとは直接関係ないけど前書き忘れたので。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/B083LTGX1N/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;amp;psc=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Amazonで売っていたタブレットスタンド&lt;/a&gt; を2つ買ってみた。&lt;/p&gt;
&lt;p&gt;0度・30度・60度どれもそれぞれよさそうだった。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wonwon-eater.com/keyball44/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keyball61ユーザーがKeyball44も作ってみた │ wonwon eater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://note.com/twoboy03/n/n791f11d7f261&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;keyballの自動マウスレイヤーに戻る・進むボタンを追加する方法｜twoboy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wonwon-eater.com/keyball39/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keyball39を使いこなすために必要なセッティング │ wonwon eater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.tavi-travelog.net/2020/04/24/claw44-buildlog-03&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tavi&#39;s Travelog - QMKファームウェアの書き込み by Ubuntu - Claw44 ビルドログ03&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kamiichi99/keyball/blob/main/qmk_firmware/keyboards/keyball/readme.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;keyball/qmk_firmware/keyboards/keyball/readme.md at main · kamiichi99/keyball&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>キー入力一発でDiscordのマイクミュートをするi3wmの設定d</title>
    <link href="https://ebiyuu.com/post/2023/07/discord-i3/"/>
    <updated>2023-07-18T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/07/discord-i3/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;通話をしている時に、マイクミュートにすぐしたいタイミングというのは定期的に発生する。&lt;/p&gt;
&lt;p&gt;今回は、Linuxのタイル型居ウィンドウマネージャーのi3wmを使って、
Discord上にフォーカスが当たっていなくてもキー入力一発で
Discordのミュート・ミュート解除ができるようにする。&lt;/p&gt;
&lt;h2 id=&quot;%E7%92%B0%E5%A2%83&quot; tabindex=&quot;-1&quot;&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;i3 version 4.22&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;xdotool-%E3%81%AE%E5%B0%8E%E5%85%A5&quot; tabindex=&quot;-1&quot;&gt;xdotool の導入&lt;/h2&gt;
&lt;p&gt;今回は、 discordアプリに &lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;shift&lt;/code&gt; + &lt;code&gt;m&lt;/code&gt; のキー入力を送ることでミュートを行う。&lt;/p&gt;
&lt;p&gt;Linux上で、特定のwindowにキー入力を送ることができる &lt;code&gt;xdotool&lt;/code&gt; をインストールする。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; xdotool&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E8%A8%AD%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;設定&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;~/.config/i3/config&lt;/code&gt; 内に以下を記入する。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# mute/unmute on discord
bindsym $mod+m exec xdotool search --onlyvisible --name discord windowactivate --sync key --clearmodifiers ctrl+shift+m
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この状態で &lt;code&gt;super&lt;/code&gt; + &lt;code&gt;m&lt;/code&gt; を入力すると、Discordのウィンドウがアクティブになってミュートされる。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;便利になった。
Linux+i3を使っていると、このような設定が簡単にできるのがとてもよい。&lt;/p&gt;
&lt;p&gt;もちろんこの方法は他のソフトでも可能なので、便利な設定を探していきたい。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.capilano-fw.com/?p=3477&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;xdotool コマンド全２６実例 – console dot log&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shuzo-kino.hateblo.jp/entry/2020/06/23/235617&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;xdotoolでGUIツールの操作をする　その２：ウィンドウ検索とアクティブ化 - Bye Bye Moore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Django Rest Frameworkでget_objectをオーバーライドする時はget_object_permissionに注意</title>
    <link href="https://ebiyuu.com/post/2023/08/django-object-permission/"/>
    <updated>2023-08-25T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/08/django-object-permission/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;Django Rest Frameworkで以下のようなコードを書いていたが、Owner以外でもアクセスできしまうというバグが発生した。&lt;/p&gt;
&lt;pre class=&quot;language-py&quot;&gt;&lt;code class=&quot;language-py&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IsOwner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BasePermission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;has_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_authenticated

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;has_object_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyDetail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RetrieveAPIView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    serializer_class &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MySerializer
    permission_classes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;IsOwner&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    parser_classes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;JSONParser&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; get_object_or_404&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;MyModel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;kwargs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; obj&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;調べてみると、そもそも &lt;code&gt;has_object_permission&lt;/code&gt; が呼び出されていない。&lt;/p&gt;
&lt;h2 id=&quot;%E5%8E%9F%E5%9B%A0&quot; tabindex=&quot;-1&quot;&gt;原因&lt;/h2&gt;
&lt;p&gt;調べてみると、 &lt;code&gt;get_object&lt;/code&gt; をoverrideした場合は  &lt;code&gt;has_object_permission&lt;/code&gt; は呼び出されない仕様のようだ。
&lt;a href=&quot;https://www.django-rest-framework.org/api-guide/permissions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Django Rest Frameworkのドキュメント&lt;/a&gt; にも以下のような記述がある。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&#39;re writing your own views and want to enforce object level permissions, or if you override the get_object method on a generic view, then you&#39;ll need to explicitly call the .check_object_permissions(request, obj) method on the view at the point at which you&#39;ve retrieved the object.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;%E8%A7%A3%E6%B1%BA%E7%AD%96&quot; tabindex=&quot;-1&quot;&gt;解決策&lt;/h2&gt;
&lt;p&gt;上記の通り、 &lt;code&gt;check_object_permissions&lt;/code&gt; を明示的に呼び出す。&lt;/p&gt;
&lt;pre class=&quot;language-diff-py&quot;&gt;&lt;code class=&quot;language-diff-py&quot;&gt;&lt;span class=&quot;token unchanged language-py&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IsOwner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BasePermission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;has_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_authenticated
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;has_object_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyDetail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RetrieveAPIView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    serializer_class &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MySerializer
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    permission_classes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;IsOwner&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    parser_classes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;JSONParser&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;        obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; get_object_or_404&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;MyModel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;kwargs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-py&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;check_object_permissions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token unchanged language-py&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; obj
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;テストを書いていたから気付けたものの、普通に危ない仕様。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/74893820/djangos-drf-has-object-permission-method-not-called-with-get-object&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;python - Django&#39;s DRF has_object_permission method not called with get_object - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.django-rest-framework.org/api-guide/permissions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Permissions - Django REST framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>NETGEAR アンマネージドプラススイッチのWeb UIにアクセスすると拒否される問題の解決ログ</title>
    <link href="https://ebiyuu.com/post/2023/10/netgear-switch-webui/"/>
    <updated>2023-10-16T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/10/netgear-switch-webui/</id>
    <content xml:lang="ja" type="html">&lt;h2 id=&quot;%E7%B5%90%E8%AB%96&quot; tabindex=&quot;-1&quot;&gt;結論&lt;/h2&gt;
&lt;p&gt;MTU=1500に設定する必要がある。&lt;/p&gt;
&lt;h2 id=&quot;%E7%8A%B6%E6%B3%81&quot; tabindex=&quot;-1&quot;&gt;状況&lt;/h2&gt;
&lt;p&gt;NETGEAR アンマネージドスイッチ (GS308E・GS108PEv3) にWebブラウザのUIでアクセスしようとしたところ、
&amp;quot;Connection Refused&amp;quot; と表示されてアクセスできない。
curlコマンドでもNG。pingは通る。&lt;/p&gt;
&lt;p&gt;LAN内の他のPCでWebブラウザでのアクセスを試したところ、接続できた。&lt;/p&gt;
&lt;h2 id=&quot;%E8%A7%A3%E6%B1%BA%E7%AD%96&quot; tabindex=&quot;-1&quot;&gt;解決策&lt;/h2&gt;
&lt;p&gt;PC側のMTU設定を1500に変更したところ、正常に接続することができた。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;nmcliでの設定例&lt;/summary&gt;
&lt;p&gt;(nmcliをつ)&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;nmcli con modify etherner1 &lt;span class=&quot;token number&quot;&gt;802&lt;/span&gt;-3-ethernet.mtu &lt;span class=&quot;token number&quot;&gt;1500&lt;/span&gt;
nmcli con down etherner1
nmcli con up etherner1&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;MTUまわりの実験をした後に設定を戻していなかったので設定が変わっていたのが原因。&lt;/p&gt;
&lt;p&gt;スイッチがMTU=1500しかサポートしておらず、それ以外に設定されている場合はTCPの接続を確立しない実装になっているっぽい。
(SYNパケットを送ると、ACK/RSTが返ってくる。)
そんな実装ありかよ……&lt;/p&gt;
&lt;h2 id=&quot;%E5%8F%82%E8%80%83&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://community.netgear.com/t5/Managed-Switches/GS108PE-Web-access-refused/m-p/2126745&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Re: GS108PE Web access refused - NETGEAR Communities&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>ECSでマイクラサーバーを立ててる データ永続化編</title>
    <link href="https://ebiyuu.com/post/2023/12/minecraft-ecs-volume/"/>
    <updated>2023-12-04T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/12/minecraft-ecs-volume/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;「&lt;a href=&quot;https://ebiyuu.com/post/2023/05/minecraft-ecs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ECSでマイクラサーバーを立ててみる。&lt;/a&gt; 」の続き。&lt;/p&gt;
&lt;p&gt;今まではコンテナ内部にデータを保持していたため、コンテナを停止するとセーブデータが削除されるようになっていた。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;サービスを起動する&lt;/h2&gt;
&lt;p&gt;しばらく起動していなかったが、前回のタスク定義が残っていたため、それを利用してサービスを立ち上げるだけ。&lt;/p&gt;
&lt;h2 id=&quot;efs%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;EFSをつくる&lt;/h2&gt;
&lt;p&gt;EFSを使う。
EFSは(TODO)。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/12/minecraft-ecs-volume/img/efs-create.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;ボリュームマウントする&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docker-minecraft-server.readthedocs.io/en/latest/data-directory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;itzg/docker-minecraft-server の説明&lt;/a&gt;によると、
コンテナの &lt;code&gt;/data&lt;/code&gt; にマウントすればよい。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/12/minecraft-ecs-volume/img/mount-volume.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8&quot; tabindex=&quot;-1&quot;&gt;これからやりたいこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;サーバーコマンドの実行&lt;/li&gt;
&lt;li&gt;Lambdaを使って起動・終了をする&lt;/li&gt;
&lt;li&gt;Dynamic DNS化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docker-minecraft-server.readthedocs.io/en/latest/data-directory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Data directory - Minecraft Server on Docker (Java Edition)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>ECSでマイクラサーバーを立てる サーバーコマンド実行編</title>
    <link href="https://ebiyuu.com/post/2023/12/minecraft-ecs-command/"/>
    <updated>2023-12-05T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2023/12/minecraft-ecs-command/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;「&lt;a href=&quot;https://ebiyuu.com/post/2023/12/minecraft-ecs-volume/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ECSでマイクラサーバーを立てる データ永続化編&lt;/a&gt;」のつづき。&lt;/p&gt;
&lt;p&gt;op権限を付与するために、コンテナの中でサーバーコマンドを実行したい。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docker-minecraft-server.readthedocs.io/en/latest/commands/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sending commands - Minecraft Server on Docker (Java Edition)&lt;/a&gt;
を参考にすると、docker execができればよい。今回はECS Execを使ってFaragateコンテナ内で実行する。&lt;/p&gt;
&lt;h2 id=&quot;aws-cli%E3%83%BBsession-mangager-plugin%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;aws cli・session mangager pluginを入れる&lt;/h2&gt;
&lt;p&gt;aws cliを入れておく。&lt;/p&gt;
&lt;p&gt;session manager pluginを入れる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-verify&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;session-manager-plugin.deb&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; session-manager-plugin.deb&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ecs%E3%81%ABiam%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;ecsにIAMポリシーを付与する。&lt;/h2&gt;
&lt;p&gt;以下のIAMポリシーを付与したロールを、ECSタスク定義のタスクロールに付与する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;タスク実行ロール&lt;/strong&gt; ではなく &lt;strong&gt;タスクロール&lt;/strong&gt; なので注意。&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2012-10-17&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Statement&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Effect&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Allow&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;ssmmessages:CreateControlChannel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;ssmmessages:CreateDataChannel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;ssmmessages:OpenControlChannel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;ssmmessages:OpenDataChannel&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Resource&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作成したポリシー&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/12/minecraft-ecs-command/img/ssm-agent-execution-policy.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;作成したロール&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/12/minecraft-ecs-command/img/ecsTaskRole.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ロールをECSのタスク定義に割り当て。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2023/12/minecraft-ecs-command/img/role-attached.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%80%82&quot; tabindex=&quot;-1&quot;&gt;コマンドを実行する。&lt;/h2&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;aws ecs execute-command &lt;span class=&quot;token parameter variable&quot;&gt;--region&lt;/span&gt; ap-northeast-1 &lt;span class=&quot;token parameter variable&quot;&gt;--cluster&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;クラスター名&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--task&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;タスク定義id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--container&lt;/span&gt; minecraft &lt;span class=&quot;token parameter variable&quot;&gt;--interactive&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--command&lt;/span&gt; rcon-cli&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;→これを実行するとシェルに入ることができる。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/okubot55/items/b1fb07b2de08c354275b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ECS Execを使って Fargateのコンテナにアクセスする #AWS - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/ms2geki/items/176bbfd869fe8aba94f4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;FARGATEのコンテナにdocker execする【既にECSを使用している方向け】 #AWS - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;デバッグ用にAmazon ECS Exec を使用 - Amazon ECS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docker-minecraft-server.readthedocs.io/en/latest/commands/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sending commands - Minecraft Server on Docker (Java Edition)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.vg/RCON&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RCON - wiki.vg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>自宅の3Dプリンターまわりの知見まとめ 2023年度版</title>
    <link href="https://ebiyuu.com/post/2024/01/3d-printer/"/>
    <updated>2024-01-08T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2024/01/3d-printer/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;自宅で使っている3Dプリンターの環境や設定などをまとめる。&lt;/p&gt;
&lt;h2 id=&quot;%E6%9C%AC%E4%BD%93%E3%81%BE%E3%82%8F%E3%82%8A&quot; tabindex=&quot;-1&quot;&gt;本体まわり&lt;/h2&gt;
&lt;p&gt;手軽なEnder3。24,900円(2024/1時点)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07D218NX3/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Creality Ender 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;デフォルトで付属している制御基板だと、ステッピングモーターのノイズ音が(想像の10倍くらい)うるさい。
市販のサードパーティーの制御基板に換装する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0882TTF4B/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BIQU SKR Mini E3 V2.0 基板 コントローラーボード32ビット&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;参考: &lt;a href=&quot;https://www.youtube.com/watch?v=ZaEEMG5nTHQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;３Dプリンタの動作音を劇的に静かにする方法【Ender-3】 - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ベッドはマグネット式を採用。
ベッドの上だけが外れるので、ベッドを曲げることで簡単に印刷物を剥がすことができる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/B085NK3KQ8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;amp;th=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Creality マグネットシート 235x235mm ソフト 磁気 印刷 ベッド Ender 3 / Ender 3 V2 / Ender 3 S1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剥がれないときは無理矢理剥がす必要があるが、付属のスクレイパーだと、厚みがありすぎてうまく剥がせないし怪我をして危ない。&lt;/p&gt;
&lt;p&gt;シールはがし用のカッターがいい感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07QF883Z9/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ニトムズ テープはがしカッター&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B5%E3%83%BC&quot; tabindex=&quot;-1&quot;&gt;スライサー&lt;/h2&gt;
&lt;p&gt;Ultrimaker Cura。基本的にデフォルトの設定でうまく印刷できる。brimも付けなくてOK。&lt;/p&gt;
&lt;p&gt;積層ピッチは0.2mmか0.26mmを普段は使う。&lt;/p&gt;
&lt;p&gt;移動速度2倍くらいまでなら見た目の品質劣化はなさそうに見える。
3倍くらいだと多少の乱れは見えるものの、1mm精度程度であれば十分出るので、おおまかなプロトタイプならそれでもOK。&lt;/p&gt;
&lt;h2 id=&quot;%E3%83%95%E3%82%A3%E3%83%A9%E3%83%A1%E3%83%B3%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;フィラメント&lt;/h2&gt;
&lt;p&gt;このへんは問題なく使えた。設定もCuraデフォルトのものでOK。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B085CCBP6S/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Creality Hyper PLA フィラメント 1.75mm 1KG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0BGR7Q4NK/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Creality 3Dプリンター フィラメント PLA 1.75mm ±0.02mm 1KG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%88%E3%83%8A%E3%83%83%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;インサートナット&lt;/h2&gt;
&lt;p&gt;3dプリンタ成形物に、ナットを溶かし入れることで、2つ以上の部品を組み合わせて作ることができる。
手軽なのでちょくちょく活用している。&lt;/p&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://maniacucina.work/3dprinter/heat-press-fitting/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;【3Dプリンタ】PLA造形物に熱圧入で簡単にネジをつくる方法 – まにあふぁくとりー&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;用意したもの&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B09NNPRV9C/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;uxcell ローレットインサートナット M3 x 4mm L x 5mm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;はんだごてを活用して圧入する。通常のはんだごてでも可能がだが、安定しやすくて熱が伝わりやすい専用のコテ先もある。普段はこれを使っている。
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B09VL41T7K/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;hineNow ヒートセットインサートチップ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B006MQD7M4/?th=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;白光(HAKKO) ダイヤル式温度制御はんだこて FX600-02&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;条件 (M3の場合)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;穴径：外径+0.05mm → 5.05mm&lt;/li&gt;
&lt;li&gt;穴深さ：全長+0.1mm → 4.1mm&lt;/li&gt;
&lt;li&gt;入口に面取り0.5mm
&lt;ul&gt;
&lt;li&gt;安定して圧入するには、面取りが重要。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;こての温度270度か320度
&lt;ul&gt;
&lt;li&gt;少し足りないかな？くらいの低めの温度で、ゆっくり溶かしてゆっくり圧入するのがコツ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;ネットワークプリント&lt;/h2&gt;
&lt;p&gt;SDカードの抜き差しをしなくてよいよう、
OctoPrintを利用してネットワーク経由で印刷できるようにしている。&lt;/p&gt;
&lt;p&gt;専用のラズパイイメージ &amp;quot;OctoPi&amp;quot; を活用。ラズパイをEnder3に接続して制御している。
Raspi Imagerからイメージを焼くことができる。&lt;/p&gt;
&lt;h2 id=&quot;todo&quot; tabindex=&quot;-1&quot;&gt;TODO&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;オートレベリング用のセンサを買ったけど手をつけられていないので試してみたい。
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0CFX3VSDF/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Creality CR Touch 自動ベッドレベリングセンサーキット 3Dプリンターベッドレベリングツール 金属プッシュピン付き Ender 3/Ender 3 V2/Ender 3 Pro/3 Max/Ender 5 pro/CR-10用 32 ビット V4.2.2/V4.2.7 メインボード付き : DIY・工具・ガーデン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0CD5YWSL3/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Creality K1&lt;/a&gt; を試してみたい。&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Keyball44を組み立てた</title>
    <link href="https://ebiyuu.com/post/2024/05/keyball44/"/>
    <updated>2024-05-09T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2024/05/keyball44/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;Keyball44を組み立てたので紹介。
実は結構前に組み立てたのだが、記事にしていなかったので書いておく。&lt;/p&gt;
&lt;h2 id=&quot;%E5%89%8D%E5%9B%9E%E3%81%AE%E5%8F%8D%E7%9C%81%E3%81%A8%E4%BB%8A%E5%9B%9E%E3%81%AE%E6%96%B9%E9%87%9D&quot; tabindex=&quot;-1&quot;&gt;前回の反省と今回の方針&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ebiyuu.com/post/2023/06/keyball61/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keyball61を組んだ&lt;/a&gt;ときの反省を活かす。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ProMicroのソケットの接触不良があったため、今回はソケットを使わず直接ハンダ付けする。&lt;/li&gt;
&lt;li&gt;前回は親指ロープロ仕様で組んでいたが、押しづらかったので通常のキースイッチを使う。&lt;/li&gt;
&lt;li&gt;静音キースイッチを使っていたがせっかくのメカニカルなのでクリック音がする青軸を選択。
&lt;ul&gt;
&lt;li&gt;自宅で使うので音は気にせず、気持ちよさを優先。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%83%91%E3%83%BC%E3%83%84&quot; tabindex=&quot;-1&quot;&gt;パーツ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://shop.yushakobo.jp/products/3905?variant=42888066400487&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pro Micro Type-C版&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Type-C版を選択。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;キースイッチ: &lt;a href=&quot;https://shop.yushakobo.jp/products/cherry-mx?variant=44079445541095&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cherry MX Blue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;キーキャップ: &lt;a href=&quot;https://shop.yushakobo.jp/products/dsa-blank-keycaps?variant=37665598898337&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DSA無刻印 鉛&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;キー割り当てがどうせ変わるので無刻印を選択。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B018FPYC78/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TRSケーブル&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;いろいろ試したが、60cm&amp;amp;L字のものが最も快適だった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E5%AE%8C%E6%88%90&quot; tabindex=&quot;-1&quot;&gt;完成&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/05/keyball44/img/keyball_whole.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/05/keyball44/img/keyball_left.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/05/keyball44/img/keyball_side.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97&quot; tabindex=&quot;-1&quot;&gt;キーマップ&lt;/h2&gt;
&lt;p&gt;結構使って固まったキーマップ。&lt;/p&gt;
&lt;p&gt;Remap: &lt;a href=&quot;https://remap-keys.app/catalog/tAJ9Htme4oNabUkx4832/keymap?id=wD11O9RvG25kK9Xf8Yhq&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v1.3&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;%E6%83%B3%E5%AE%9A%E7%92%B0%E5%A2%83&quot; tabindex=&quot;-1&quot;&gt;想定環境&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;windows・US キーボード&lt;/li&gt;
&lt;li&gt;CorvusSKKを用いているのでIME切り替えキーは置いていない。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E3%83%AC%E3%82%A4%E3%83%A4%E6%A7%8B%E6%88%90&quot; tabindex=&quot;-1&quot;&gt;レイヤ構成&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Layer&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Function&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Scroll&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;L0&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Main Layer&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;L1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;テンキー + 記号&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;L2&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;マウス + ファンクションキー&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;L3&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;カーソル + キーボード設定&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;On&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;l0&quot; tabindex=&quot;-1&quot;&gt;L0&lt;/h3&gt;
&lt;p&gt;Escは親指の押しやすい場所に置いている（vimを使うため。）&lt;/p&gt;
&lt;p&gt;こだわりポイント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;右にもレイヤ切り替えのキーを用意し、右手だけでマウス操作ができるようにしている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/05/keyball44/img/L0.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;l1%3A-%E3%83%86%E3%83%B3%E3%82%AD%E3%83%BClayer&quot; tabindex=&quot;-1&quot;&gt;L1: テンキーLayer&lt;/h3&gt;
&lt;p&gt;L0に収まらなかった記号キーも置いている。
Shift+数字で入力する記号はこのレイヤ+shift で入力する&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/05/keyball44/img/L1.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;l2%3A-%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%AC%E3%82%A4%E3%83%A4&quot; tabindex=&quot;-1&quot;&gt;L2: マウスレイヤ&lt;/h3&gt;
&lt;p&gt;ファンクションキーも置いている。&lt;/p&gt;
&lt;p&gt;こだわりポイント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl+tabとCtrl+Shift+Tabをマッピングすることで、ブラウザ等でのタブ切り替えを素早く行うことができるようにしている。&lt;/li&gt;
&lt;li&gt;右親指キーにMouse Button4/5（進む・戻るボタン）を割り当てている。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/05/keyball44/img/L2.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;l3%3A-%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%83%AC%E3%82%A4%E3%83%A4&quot; tabindex=&quot;-1&quot;&gt;L3: カーソルレイヤ&lt;/h3&gt;
&lt;p&gt;カーソルキーはvimキーバインドと同じになるように hjkl に割り当ててある。
deleteキーもこのレイヤに置いている。
左側にはキーボード設定用のキーも置いている&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/05/keyball44/img/L3.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>LaTeX初心者にこそ教えたい、ちょっとLaTeX便利にするtips</title>
    <link href="https://ebiyuu.com/post/2024/10/latex-tips/"/>
    <updated>2024-10-03T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2024/10/latex-tips/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;使い方わかってきたなーくらいの人向けのtips&lt;/p&gt;
&lt;h2 id=&quot;siunitx%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86(%E5%BF%85%E9%A0%88)&quot; tabindex=&quot;-1&quot;&gt;siunitxを使おう(必須)&lt;/h2&gt;
&lt;p&gt;単位は斜体にせず、数値と単位の間にスペースを入れるのが一般的。
これを手でやろうとすると面倒だし、ミスのもととなるので、siunitxを使おう。&lt;/p&gt;
&lt;h3 id=&quot;%E4%BD%BF%E3%81%84%E6%96%B9&quot; tabindex=&quot;-1&quot;&gt;使い方&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プリアンプルに&lt;code&gt;&#92;usepackage{siunitx}&lt;/code&gt; を書く。&lt;/li&gt;
&lt;li&gt;例えば、 &amp;quot;1um&amp;quot; と出力したい時は、 &lt;code&gt;$&#92;SI{1}{&#92;micro&#92;meter}$&lt;/code&gt; と書く。&lt;/li&gt;
&lt;li&gt;単位だけ出したい場合は小文字の &lt;code&gt;&#92;si&lt;/code&gt; を使う。 例: &lt;code&gt;$&#92;si{&#92;micro&#92;meter}$&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;overleaf%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86(%E6%8E%A8%E5%A5%A8)&quot; tabindex=&quot;-1&quot;&gt;Overleafを使おう(推奨)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザさえあればどこでも編集ができる・共同編集ができる&lt;/li&gt;
&lt;li&gt;fast compileを活用すると便利
&lt;ul&gt;
&lt;li&gt;画像が表示されない代わりにコンパイルが早くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;卒論の時期とか論文の締め切り直前は落ちがちなので定期的にバックアップを取っておく
&lt;ul&gt;
&lt;li&gt;課金する余裕があればgithub連携がおすすめ（履歴も管理できるしバックアップになる）&lt;/li&gt;
&lt;li&gt;余裕があれば手元にもビルド環境を用意しておこう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E5%87%BA%E3%81%97%E6%96%B9&quot; tabindex=&quot;-1&quot;&gt;日本語の出し方&lt;/h3&gt;
&lt;p&gt;日本語を含む文書をタイプセットするために、platexを用いる。
コンパイラは &amp;quot;LaTeX&amp;quot; を選択しておき、 &lt;code&gt;latexmkrc&lt;/code&gt; を用意しておく。&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── main.tex
└── latexmkrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;latexmkrc&lt;/code&gt; には以下の内容を書いておく。&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$latex = &#39;platex&#39;;
$bibtex = &#39;upbibtex&#39;;
$dvipdf = &#39;dvipdfmx %O -o %D %S&#39;;
$makeindex = &#39;mendex -U %O -o %D %S&#39;;
$pdf_mode = 3;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これで日本語の文書をコンパイルできるようになる。&lt;/p&gt;
&lt;p&gt;cf. &lt;a href=&quot;https://dreamer-uma.com/overleaf/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;【必見】Overleafの使い方（日本語入力も解説・bibファイル）｜努力のガリレオ&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;subfiles%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86(%E6%8E%A8%E5%A5%A8)&quot; tabindex=&quot;-1&quot;&gt;subfilesを使おう(推奨)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;論文とかは往々にして長くなりがち→コンパイルにも時間がかかる&lt;/li&gt;
&lt;li&gt;本文を書く場合、今書いているところだけコンパイルできればよい&lt;/li&gt;
&lt;li&gt;一方で、全体の配置を見たいので全体でもコンパイルできるようにしたい&lt;/li&gt;
&lt;li&gt;章ごとにファイルを分割し、 &lt;code&gt;main.tex&lt;/code&gt; ではそれを import することができる
&lt;ul&gt;
&lt;li&gt;章のファイルをコンパイルすればその章だけのコンパイルが可能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main.tex&lt;/code&gt; をコンパイルすれば全体の完成系を見ることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E4%BD%BF%E3%81%84%E6%96%B9-1&quot; tabindex=&quot;-1&quot;&gt;使い方&lt;/h3&gt;
&lt;p&gt;章ごとのファイルと、 &lt;code&gt;main.tex&lt;/code&gt; を作成する&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── main.tex
└── src
    ├── 1_introductin.tex
    ├── 2_method.tex
    ├── 3_result.tsx
    └── 4_discussion.tex&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;main.tex&lt;/code&gt; にはこれを書いておく&lt;/p&gt;
&lt;pre class=&quot;language-tex&quot;&gt;&lt;code class=&quot;language-tex&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;% ....&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;usepackage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;subfiles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function selector&quot;&gt;&#92;begin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;% ....&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;subfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;src/1_introductin.tex&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;subfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;src/2_method.tex&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;subfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;src/3_result.tsx&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;subfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;src/4_discussion.tex&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;% ....&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;章ごとのファイルにはこれを書いておく&lt;/p&gt;
&lt;pre class=&quot;language-tex&quot;&gt;&lt;code class=&quot;language-tex&quot;&gt;&lt;span class=&quot;token function selector&quot;&gt;&#92;documentclass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;../main&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;subfiles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;begin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プリアンプルは勝手に &lt;code&gt;main.tex&lt;/code&gt; のものを引っ張ってきてくれる&lt;/p&gt;
&lt;h2 id=&quot;bibtex%E3%81%AF%E6%96%87%E7%8C%AE%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86(%E6%8E%A8%E5%A5%A8)&quot; tabindex=&quot;-1&quot;&gt;bibtexは文献管理ツールを使おう(推奨)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;bibtexを手書きするのは大変&lt;/li&gt;
&lt;li&gt;だいたいの文献管理ツールはbibtexを書き出すことが可能&lt;/li&gt;
&lt;li&gt;課金していればmendeley連携も可能&lt;/li&gt;
&lt;li&gt;例) zoteroからも書き出したもの
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/10/latex-tips/img/66f4aecfaa7149001c84eefd.png&quot; alt=&quot;img/66f4aecfaa7149001c84eefd.png&quot; /&gt;&lt;/li&gt;
&lt;li&gt;bibtexは複数ファイルを使えるので、文献管理ツールで生成するものと自分で管理するもの（ウェブサイト）を分けておくと管理が楽。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;todo%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E4%BD%BF%E3%81%86(%E6%B0%97%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9F%E3%82%89%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%A6%E3%81%AD)&quot; tabindex=&quot;-1&quot;&gt;todoマクロを使う(気に入ったら使ってみてね)&lt;/h2&gt;
&lt;p&gt;自分がやっている内容。&lt;/p&gt;
&lt;pre class=&quot;language-tex&quot;&gt;&lt;code class=&quot;language-tex&quot;&gt;&lt;span class=&quot;token function selector&quot;&gt;&#92;usepackage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function selector&quot;&gt;&#92;newcommand&lt;/span&gt;&lt;span class=&quot;token function selector&quot;&gt;&#92;todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token function selector&quot;&gt;&#92;PackageWarning&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Todo&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Detection TODO:#1&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token function selector&quot;&gt;&#92;textcolor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;red&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;// TODO: #1&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;とプリアンプルに書いておいて、&lt;/p&gt;
&lt;pre class=&quot;language-tex&quot;&gt;&lt;code class=&quot;language-tex&quot;&gt;&lt;span class=&quot;token function selector&quot;&gt;&#92;todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ここ後でなおす&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;のように使う。&lt;/p&gt;
&lt;p&gt;このように本文中に表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/10/latex-tips/img/66fe9f78dd25d1001c996493.png&quot; alt=&quot;img/66fe9f78dd25d1001c996493.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;warningにも表示されるので、コンパイル時に気づきやすい。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/10/latex-tips/img/66fe9f860e58e7001c0b7b52.png&quot; alt=&quot;img/66fe9f860e58e7001c0b7b52.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;latexdiff(%E5%90%8D%E5%89%8D%E3%81%A0%E3%81%91%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%93%E3%81%86)&quot; tabindex=&quot;-1&quot;&gt;latexdiff(名前だけ覚えておこう)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;texファイルの変更差分を含めた形でpdfにしてくれる&lt;/li&gt;
&lt;li&gt;論文のrevise時などに便利&lt;/li&gt;
&lt;li&gt;使い方は省略
&lt;ul&gt;
&lt;li&gt;overleafでも使えるらしい、試したことないけど
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.overleaf.com/learn/latex/Articles/How_to_use_latexdiff_on_Overleaf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;How to use latexdiff on Overleaf - Overleaf, Online LaTeX Editor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dreamer-uma.com/overleaf/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;【必見】Overleafの使い方（日本語入力も解説・bibファイル）｜努力のガリレオ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.overleaf.com/learn/latex/Articles/How_to_use_latexdiff_on_Overleaf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;How to use latexdiff on Overleaf - Overleaf, Online LaTeX Editor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>ECS のタスク定義を terraform で管理しつつ、Github Actions でコンテナを更新する</title>
    <link href="https://ebiyuu.com/post/2024/10/terraform-ecs-gha/"/>
    <updated>2024-10-03T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2024/10/terraform-ecs-gha/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;ECSのタスク定義はterraformから定義できる。&lt;/p&gt;
&lt;pre class=&quot;language-hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# ECS Service&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_ecs_service&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;app&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;            &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token type variable&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;-app&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cluster&lt;/span&gt;         &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws_ecs_cluster.this.id
  &lt;span class=&quot;token property&quot;&gt;task_definition&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws_ecs_task_definition.app.arn
  &lt;span class=&quot;token property&quot;&gt;desired_count&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;launch_type&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FARGATE&quot;&lt;/span&gt;

  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ECS Task Definition&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_ecs_task_definition&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;app&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;family&lt;/span&gt;                   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token type variable&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;-app&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cpu&lt;/span&gt;                      &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1024&quot;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;memory&lt;/span&gt;                   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2048&quot;&lt;/span&gt;
  ...

  &lt;span class=&quot;token property&quot;&gt;container_definitions&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; jsonencode(&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    ...
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;)
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一方で、CI/CDを導入すると、Github Actionsなどでタスク定義を更新することがある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新しくコンテナをpushした場合、そのタグに合わせてタスク定義を更新する必要がある。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この時、どのようにタスク定義を管理するかが課題となる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例えば、Github Actionsでタスク定義を更新した場合、terraformで管理しているタスク定義との差異が生じる。&lt;/li&gt;
&lt;li&gt;この差異をどのように解消するかが課題。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&quot; tabindex=&quot;-1&quot;&gt;よくあるパターン&lt;/h2&gt;
&lt;h3 id=&quot;%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B31%3A-github%E5%81%B4%E3%81%A7%E3%82%BF%E3%82%B9%E3%82%AF%E5%AE%9A%E7%BE%A9%E3%82%92%E6%8C%87%E5%AE%9A&quot; tabindex=&quot;-1&quot;&gt;パターン1: Github側でタスク定義を指定&lt;/h3&gt;
&lt;p&gt;例: &lt;a href=&quot;https://zenn.dev/shonansurvivors/articles/6bf9fe7bd09d82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ecspresso利用を考慮したTerraformのECS(Fargate)構築 - Zenn&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;タスク定義をGithubのリポジトリに記述し、Github Actionsでタスク定義を更新する&lt;/li&gt;
&lt;li&gt;terraform側では管理しない&lt;/li&gt;
&lt;li&gt;terraformの変数をタスク定義に埋め込む形がやりづらい
&lt;ul&gt;
&lt;li&gt;環境変数など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インスタンスサイズなど構成を変更するときに、terraform側からタスクを更新することができない
&lt;ul&gt;
&lt;li&gt;Github Actionsでタスク定義を更新する必要がある&lt;/li&gt;
&lt;li&gt;インフラの変更とアプリケーションの変更が分離される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B32%3A-latest%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4&quot; tabindex=&quot;-1&quot;&gt;パターン2: latestデプロイ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;タスク定義はterraformで定義し、latestタグを使ってデプロイする&lt;/li&gt;
&lt;li&gt;Github Actionsからのデプロイではlatestタグへのpushを行い、ECSの再デプロイを行うことで最新のコンテナをデプロイする&lt;/li&gt;
&lt;li&gt;この場合、latestタグを使うため、どのコンテナがデプロイされているかがわかりにくい
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/ecs-deploy-all/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;あなたの組織に最適なECSデプロイ手法の考察 | DevelopersIO&lt;/a&gt; にてアンチパターンとして紹介されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E4%BB%8A%E5%9B%9E%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&quot; tabindex=&quot;-1&quot;&gt;今回のパターン&lt;/h2&gt;
&lt;p&gt;できるようにしたいこと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;タスク定義はTerraform側で管理、applyした時にちゃんと変更が効く&lt;/li&gt;
&lt;li&gt;Github Actions側からもコンテナを更新でき、terraform側からの最新のタスク定義が反映される&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;terraform%E5%81%B4%3A-latest%E6%8C%87%E5%AE%9A%E3%81%A7%E6%9C%80%E6%96%B0%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E5%AE%9A%E7%BE%A9&quot; tabindex=&quot;-1&quot;&gt;Terraform側: latest指定で最新のコンテナを使ったタスク定義&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/terraform_ecs_codepipeline_rollingupdate_taskdef/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraformで構築したECSをCodePipeline等でローリング更新するとタスク定義のリビジョンがずれる問題をdataを使って回避する | DevelopersIO&lt;/a&gt; の方式を活用。&lt;/p&gt;
&lt;p&gt;dataを利用すると、最新のタスク定義を参照することができる。&lt;/p&gt;
&lt;p&gt;terraform定義を以下のように変更する。&lt;/p&gt;
&lt;pre class=&quot;language-diff-hcl&quot;&gt;&lt;code class=&quot;language-diff-hcl&quot;&gt;&lt;span class=&quot;token unchanged language-hcl&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# ECS Service&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_ecs_service&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;app&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token property&quot;&gt;name&lt;/span&gt;            &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token type variable&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;-app&quot;&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token property&quot;&gt;cluster&lt;/span&gt;         &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws_ecs_cluster.this.id
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted language-hcl&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   &lt;span class=&quot;token property&quot;&gt;task_definition&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws_ecs_task_definition.app.arn
&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-hcl&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;   &lt;span class=&quot;token property&quot;&gt;task_definition&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; data.aws_ecs_task_definition.app.arn
&lt;/span&gt;&lt;span class=&quot;token unchanged language-hcl&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token property&quot;&gt;desired_count&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token property&quot;&gt;launch_type&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FARGATE&quot;&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;token unchanged language-hcl&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   ...
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;token unchanged language-hcl&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# ECS Task Definition&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;resource &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_ecs_task_definition&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;app&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   ...
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;token inserted-sign inserted language-hcl&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;data &lt;span class=&quot;token type variable&quot;&gt;&quot;aws_ecs_task_definition&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;app&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;   &lt;span class=&quot;token property&quot;&gt;task_definition&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; aws_ecs_task_definition.app.family
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;github%E5%81%B4%3A-%E6%9C%80%E6%96%B0%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E5%AE%9A%E7%BE%A9%E3%82%92aws%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%BF%E3%82%B0%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%A6%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4&quot; tabindex=&quot;-1&quot;&gt;Github側: 最新のタスク定義をawsから取得し、コンテナタグを更新してデプロイ&lt;/h3&gt;
&lt;p&gt;最新のタスク定義は、aws cliで取得できる。&lt;/p&gt;
&lt;!-- - ![img/66d9c3a166312a001c17fc35.png](img/66d9c3a166312a001c17fc35.png) --&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;aws ecs describe-task-definition &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
   --task-definition my-task-definition-family &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
   &lt;span class=&quot;token parameter variable&quot;&gt;--query&lt;/span&gt; taskDefinition &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; task-definition.json&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aws-actions/amazon-ecs-deploy-task-definition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/aws-actions/amazon-ecs-deploy-task-definition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;落としてきたタスク定義のイメージタグだけを更新して、再度デプロイする。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github Actionsで &lt;a href=&quot;https://github.com/aws-actions/amazon-ecs-render-task-definition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;aws-actions/amazon-ecs-render-task-definition&lt;/a&gt; を利用すると、タスク定義のjsonを更新することができる。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ビルドしたイメージは、 &lt;code&gt;latest&lt;/code&gt; タグにもpushしておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;terraform側でタスク定義を更新した場合は &lt;code&gt;latest&lt;/code&gt; タグを参照するため、最新のコンテナがデプロイされる。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらをGithub Actionsのworkflowに記述すると以下のようになる。&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Build and push docker container
  &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
    docker build -t app .
    docker tag app:latest ${{secrets.AWS_ECR_REPOSITORY_URI}}:${{github.sha}}
    docker tag app:latest ${{secrets.AWS_ECR_REPOSITORY_URI}}:latest
    docker push ${{secrets.AWS_ECR_REPOSITORY_URI}}:${{github.sha}}
    docker push ${{secrets.AWS_ECR_REPOSITORY_URI}}:latest&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# deploy to ECS&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Get latest ECS task definition
  &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; aws ecs describe&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;task&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;definition &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;task&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;definition $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.ECS_TASK_DEFINITION &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;query taskDefinition &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt; task_definition.json
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Render task definition
  &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; render_task_definition
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; aws&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;actions/amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ecs&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;render&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;task&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;definition@v1
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;task-definition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; task_definition.json
    &lt;span class=&quot;token key atrule&quot;&gt;container-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; app
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;secrets.AWS_ECR_REPOSITORY_URI&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;github.sha&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Deploy to ECS (Update task definition)
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; aws&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;actions/amazon&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ecs&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;deploy&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;task&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;definition@v1
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;task-definition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;steps.render_task_definition.outputs.task&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;definition&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;secrets.ECS_SERVICE_NAME&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;secrets.ECS_CLUSTER_NAME&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;wait-for-service-stability&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E5%9B%B0%E3%82%8B%E7%82%B9&quot; tabindex=&quot;-1&quot;&gt;困る点&lt;/h2&gt;
&lt;p&gt;terraform定義から料金を計算してくれる &lt;a href=&quot;https://github.com/infracost/infracost&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;infracost&lt;/a&gt; が、正しく料金を計算してくれない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;terraformの定義としては &lt;code&gt;data&lt;/code&gt; で参照しているだけで、実際にはタスク定義が存在しない。&lt;/li&gt;
&lt;li&gt;そのため、CPUやメモリの値が取得できず、料金計算ができない。&lt;/li&gt;
&lt;li&gt;一回計算を行うだけであれば、計算する時だけdataを用いないように書き換えればよいが、CI/CDで毎回計算するような場合は困る。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zenn.dev/shonansurvivors/articles/6bf9fe7bd09d82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ecspresso利用を考慮したTerraformのECS(Fargate)構築&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/terraform_ecs_codepipeline_rollingupdate_taskdef/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraformで構築したECSをCodePipeline等でローリング更新するとタスク定義のリビジョンがずれる問題をdataを使って回避する | DevelopersIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/aws-ecs-task-definition-supports-track-latest-args/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;aws_ecs_task_definition に CI/CD との競合を防ぐ track_latest 引数がリリースされました | DevelopersIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aws-actions/amazon-ecs-deploy-task-definition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/aws-actions/amazon-ecs-deploy-task-definition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DuckDuckGo - プライバシーだけじゃない、エンジニアにおすすめの検索エンジン</title>
    <link href="https://ebiyuu.com/post/2024/10/duckduckgo/"/>
    <updated>2024-10-10T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2024/10/duckduckgo/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;&lt;a href=&quot;https://duckduckgo.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DuckDuckGo&lt;/a&gt; は、プライバシーを重視した検索エンジンとして知られている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;トラッキングをしない&lt;/li&gt;
&lt;li&gt;ターゲティング広告なし&lt;/li&gt;
&lt;li&gt;位置情報を使わない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、最初はプライバシーを重視する人が使う検索エンジンとして認識していたが、
興味本位で使ってみたところ最近は完全に DuckDuckGo を常用するようになってしまった。&lt;/p&gt;
&lt;p&gt;DuckDuckGo は単純に検索エンジンとして使い勝手がよく、特にエンジニアが好みそうな機能も多いためである。
この記事ではそれらの機能を紹介する。&lt;/p&gt;
&lt;p&gt;仕様頻度順に紹介する。&lt;/p&gt;
&lt;h2 id=&quot;%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC&quot; tabindex=&quot;-1&quot;&gt;ショートカットキー&lt;/h2&gt;
&lt;p&gt;検索結果画面にショートカットキーが設定されているため、キーボードだけで検索結果の操作ができる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;j/↓&lt;/code&gt; &lt;code&gt;k/↑&lt;/code&gt; で検索結果を選択できる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Enter&lt;/code&gt; / &lt;code&gt;o&lt;/code&gt; / &lt;code&gt;l&lt;/code&gt;  → 開く&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v&lt;/code&gt; → 別タブで開く&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cmd+Enter&lt;/code&gt; (mac) / &lt;code&gt;Ctrl+Enter&lt;/code&gt; (win) → 別タブで開く（バックグラウンド）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt; で検索バーにフォーカスできる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt; 選択したドメインでドメインサーチ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t&lt;/code&gt; 最上部へ移動&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%8C%E6%A5%BD&quot; tabindex=&quot;-1&quot;&gt;言語での絞り込みが楽&lt;/h2&gt;
&lt;p&gt;言語設定をしておくと(デフォルトではブラウザの言語が使われる)、検索結果がその言語に合わせて表示される。&lt;/p&gt;
&lt;p&gt;言語フィルタのあり・なしをスイッチで簡単に切り替えることができる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/670618346c2107001d5bd19a.png&quot; alt=&quot;img/670618346c2107001d5bd19a.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;↓&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/67061826003c74001c2f9e7f.png&quot; alt=&quot;img/67061826003c74001c2f9e7f.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%5B%E7%A5%9E%5D-%22bang%22-%E3%82%B5%E3%83%BC%E3%83%81&quot; tabindex=&quot;-1&quot;&gt;[神] &amp;quot;Bang&amp;quot; サーチ&lt;/h2&gt;
&lt;p&gt;検索結果のに &lt;code&gt;!{keyword}&lt;/code&gt; をつけて検索することで、外部サイトで検索することができる。これが一番便利。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;よく使う例:
&lt;ul&gt;
&lt;li&gt;「!gmap 渋谷」 → Google Map で「渋谷」と検索&lt;/li&gt;
&lt;li&gt;「!a 洗剤」→ Amazon で「洗剤」を検索&lt;/li&gt;
&lt;li&gt;「!yt 可愛い猫」 → YouTube で「可愛い猫」を検索&lt;/li&gt;
&lt;li&gt;「!w 山手線」 → Wikipediaで 「山手線」を検索
&lt;ul&gt;
&lt;li&gt;ちなみに言語はDuckduckgoの設定に準拠、デフォルトではブラウザの設定言語&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!x&lt;/code&gt; → twitter(x)&lt;/li&gt;
&lt;li&gt;エンジニアにとっても便利。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;!py3&lt;/code&gt; → python documentation, &lt;code&gt;!pip&lt;/code&gt; → pypi, &lt;code&gt;!docker&lt;/code&gt; → docker hub, &lt;code&gt;!gh&lt;/code&gt; → github&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;研究者向け (2025-11-05 追記)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;!scholar&lt;/code&gt; → google scholar, &lt;code&gt;!pubmed&lt;/code&gt; → pubmed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!doi &amp;lt;doi&amp;gt;&lt;/code&gt; → doi.org経由で直接文献を開くことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;必ずしも先頭である必要はなく、最後でも良いし、なんなら途中でも良い。&lt;/li&gt;
&lt;li&gt;クエリを入れずにbangを実行するといい感じにトップページに移動してくれるので、簡易的なブックマークとしても使える
&lt;ul&gt;
&lt;li&gt;「!a」→amazonのトップページ など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;bangの一覧は &lt;a href=&quot;https://duckduckgo.com/bangs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DuckDuckGo !Bangs&lt;/a&gt; で参照することができる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%83%84%E3%83%BC%E3%83%AB%E3%82%82%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E3%81%A4%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;ツールもいろいろついている&lt;/h2&gt;
&lt;p&gt;これはGoogleでもある、検索するとそれに応じたツールが表示されるやつ&lt;/p&gt;
&lt;p&gt;電卓
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/calculator.png&quot; alt=&quot;電卓&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;単位換算
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/67061e2dc28a95001dc1d471.png&quot; alt=&quot;単位換算&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;QRコード生成
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/67061fb1d10004001c56f16c.png&quot; alt=&quot;QRコード生成&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;UUID生成
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/67062002872288001df7fd87.png&quot; alt=&quot;UUID生成&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;カラーコードプレビュー
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/67062018f441be001d2bc6d6.png&quot; alt=&quot;カラーコードプレビュー&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;基数変換
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/67062028ba8ff7001d84fc4b.png&quot; alt=&quot;基数変換&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;base64 encode/decode
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/6706204387201b001c13ec1b.png&quot; alt=&quot;base64 encode&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;
&lt;img src=&quot;https://ebiyuu.com/post/2024/10/duckduckgo/img/67062055363be2001c370bcc.png&quot; alt=&quot;base64 decode&quot; style=&quot;max-width: 500px; width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;かゆいところに手が届く&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zenn.dev/hikyae/articles/duckduckgo-other-benefits&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;プライバシー保護とは別視点のDuckDuckGoのすゝめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duckduckgo.com/duckduckgo-help-pages/features/keyboard-shortcuts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;How To Use Keyboard Shortcuts on DuckDuckGo Search | DuckDuckGo Help Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yokkin.com/blog/meet-duckduckgo.html#%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AB%E3%81%A8%E3%81%A3%E3%81%A6%E3%81%AE!Bangs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;技術者にとって代えがたき至高の検索ツールとしての DuckDuckGo: !Bangs のすすめ – yokkin.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/shubhamverma/duckduckgo-the-search-engine-for-the-developers-55a6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DuckDuckGo - The Search Engine for the Developers - DEV Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>pecoが文字化けする問題</title>
    <link href="https://ebiyuu.com/post/2024/11/peco-bug/"/>
    <updated>2024-11-06T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2024/11/peco-bug/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;バグを引いたので記録用に&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2024/11/6現在&lt;/li&gt;
&lt;li&gt;Ubuntu24.04にて、aptでインストールしたpecoにて発生。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;peco&lt;/code&gt; を実行すると &amp;quot;?????????&amp;quot; と表示され、画面表示が崩れる。&lt;/p&gt;
&lt;p&gt;同様の現象は発生していて、aptパッケージが壊れているらしい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cf. &lt;a href=&quot;https://zenn.dev/mato/scraps/2b0c423ad9da2c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Ubuntu24.04 LTSにpecoをインストールしたら文字化けしたが、apt経由ではなく直接githubから落とすことで文字化け解消できた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/peco/peco&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub&lt;/a&gt; から直接入れる。
今回はgoが入っていたので &lt;code&gt;go install&lt;/code&gt; で入れる。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;go &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; github.com/peco/peco/cmd/peco@latest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;にて解決。&lt;/p&gt;
&lt;p&gt;releaseからバイナリを落としてきてもいいらしい。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;cf. &lt;a href=&quot;https://zenn.dev/mato/scraps/2b0c423ad9da2c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Ubuntu24.04 LTSにpecoをインストールしたら文字化けしたが、apt経由ではなく直接githubから落とすことで文字化け解消できた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>ESP32のADCで連続読み出しをする</title>
    <link href="https://ebiyuu.com/post/2025/07/esp32_adc_continuous/"/>
    <updated>2025-07-23T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2025/07/esp32_adc_continuous/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;ESP32のADCは、シングル読み取りモード（通常の &lt;code&gt;analogRead&lt;/code&gt; ）の他に連続読み出しモードがある。
ADC側で一定周期でサンプリングを実施してくれるモードであり、今回はサンプリング間隔を一定にしたかったため利用した。&lt;/p&gt;
&lt;p&gt;開発には PlatformIO + Arduino core を利用している。&lt;/p&gt;
&lt;h2 id=&quot;%E6%A6%82%E8%A6%81%E3%82%92%E3%81%A4%E3%81%8B%E3%82%80&quot; tabindex=&quot;-1&quot;&gt;概要をつかむ&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.espressif.com/projects/arduino-esp32/en/latest/api/adc.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ADC API ドキュメント&lt;/a&gt; を参照しながら実装する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;analogContinous()&lt;/code&gt; で初期化
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sampling_freq_hz&lt;/code&gt; サンプリング周波数、最終的に出力されるデータ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conversions_per_pin&lt;/code&gt; 上のサンプリング周波数の&lt;s&gt;1周期あたり、何回計測を行うか&lt;/s&gt;何回分をまとめて1つのデータとするか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;analogContinuousStart()&lt;/code&gt; で連続読み出しを開始&lt;/li&gt;
&lt;li&gt;&lt;code&gt;analogContinuousRead()&lt;/code&gt; で計測した値を読み出す
&lt;ul&gt;
&lt;li&gt;第二引数でタイムアウトを指定 (ms)&lt;/li&gt;
&lt;li&gt;データが読み出せれば &lt;code&gt;true&lt;/code&gt; 、タイムアウトが発生すれば &lt;code&gt;false&lt;/code&gt; が返される。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;スケッチ例は以下のようになる。
以下の例では &lt;code&gt;sampling_freq_hz = 1000&lt;/code&gt; 、  &lt;code&gt;conversions_per_pin = 20&lt;/code&gt; なので、 &lt;s&gt;1kHzで&lt;code&gt;Serial.println&lt;/code&gt; が呼ばれ、またそれぞれの計測では20回のサンプリングが実施されておりその平均が出力される。&lt;/s&gt; &lt;code&gt;Serial.println&lt;/code&gt; は 1000/20 の 50 Hzで呼ばれる。&lt;/p&gt;
&lt;p&gt;7/24 追記 &lt;code&gt;conversions_per_pin&lt;/code&gt; について誤解していたので修正&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  Serial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;115200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Initialize the serial port&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;A0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; INPUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Set pin A0 as input&lt;/span&gt;
  
  &lt;span class=&quot;token keyword&quot;&gt;uint8_t&lt;/span&gt; pins&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;A0&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Define the pins to read&lt;/span&gt;
  size_t pinCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pins&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pins&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;uint32_t&lt;/span&gt; conversions_per_pin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Set the number of conversions per pin&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;uint32_t&lt;/span&gt; sampling_freq_hz &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Set the sampling frequency in Hz&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Start continuous analog reading&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;analogContinuous&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pins&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pinCount&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; conversions_per_pin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sampling_freq_hz&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;analogContinuousStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  Serial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ADC initialization completed.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  adc_continuous_data_t &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;buffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nullptr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Buffer to hold ADC data&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;analogContinuousRead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;buffer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Read the latest data from the buffer&lt;/span&gt;
    adc_continuous_data_t &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;buffer&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    Serial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;avg_read_mvolts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;なお、周波数指定の範囲は 20 kHz～2 MHz となっている（&lt;a href=&quot;https://github.com/espressif/esp-idf/blob/master/components/soc/esp32/include/soc/soc_caps.h#L138-L139&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;esp-idf/components/soc/esp32/include/soc/soc_caps.h at master · espressif/esp-idf&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&quot;%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E5%95%8F%E9%A1%8C&quot; tabindex=&quot;-1&quot;&gt;バージョンの問題&lt;/h2&gt;
&lt;p&gt;上記の方針でコードを書こうとしたが、 &lt;code&gt;analogContinous&lt;/code&gt; などの関数が定義されておらずコンパイルエラーとなる。&lt;/p&gt;
&lt;p&gt;調べてみたところ、ESP-IDFのバージョンがv3以降ではないとAPIが用意されていないっぽい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.arduino.cc/t/esp32-adc-continuos-mode/1212920/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ESP32 ADC Continuos mode? - Projects / Programming - Arduino Forum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PlatformIOでインストールされているバージョンはv2系となっている。
PlatformIOでは最新のesp-idfが使えないらしい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参照: &lt;a href=&quot;https://zenn.dev/kyjb/articles/6950231b231643&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PlatformIOとEspressifの対立：コミュニティによる開発の現状&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PlatformIOフォークの &lt;a href=&quot;https://github.com/pioarduino/platform-espressif32&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pioarduino/platform-espressif32&lt;/a&gt; では最新版がメンテナンスされている。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;platformio.ini&lt;/code&gt; のplatform欄に以下のように記述する。&lt;/p&gt;
&lt;pre class=&quot;language-ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;platform&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これでコンパイルを通すことができ、実際に動作することを確認することができた。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.espressif.com/projects/arduino-esp32/en/latest/api/adc.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ADC - - — Arduino ESP32 latest documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.arduino.cc/t/esp32-adc-continuos-mode/1212920/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ESP32 ADC Continuos mode? - Projects / Programming - Arduino Forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zenn.dev/kyjb/articles/6950231b231643&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PlatformIOとEspressifの対立：コミュニティによる開発の現状&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/platformio/platform-espressif32&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;platformio/platform-espressif32: Espressif 32: development platform for PlatformIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/espressif/esp-idf/blob/master/components/soc/esp32/include/soc/soc_caps.h#L138-L139&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;esp-idf/components/soc/esp32/include/soc/soc_caps.h at master · espressif/esp-idf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Google製の正規表現ライブラリ「RE2」をpythonで動かす - 2025版</title>
    <link href="https://ebiyuu.com/post/2025/08/python-re2/"/>
    <updated>2025-08-14T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2025/08/python-re2/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;&lt;a href=&quot;https://ebiyuu.com/post/2020/06/re2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google製の正規表現ライブラリ「RE2」をpythonで動かす&lt;/a&gt; という記事を5年前に書いたが、いろいろと状況が変わっていたので最新の状況を記す。&lt;/p&gt;
&lt;p&gt;前述の記事で用いていた &lt;code&gt;fb-re2&lt;/code&gt; がpip install時にビルドでコケてしまうようになった。&lt;/p&gt;
&lt;p&gt;Claudeに要約させたところこのようなことらしい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システムのAbseilライブラリがC++14以上を要求&lt;/li&gt;
&lt;li&gt;fb-re2のビルドスクリプトがC++11を指定
つまり、Ubuntuのバージョンが更新されたことによって、最新の環境でビルドができなくなってしまった。しばらく更新されていなかったことによる、互換性問題が発生していそう。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;気付いたらGoogle公式が re2をPyPIに公開しており、これがメンテナンスされているので、これに切り替えてみる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pypi.org/project/google-re2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pypi.org/project/google-re2/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;google-re2&lt;/code&gt; 2022年10月25日にv1.0がリリース&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fb-re2&lt;/code&gt; 2019年2月8日を最後にリリースされていない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;google-re2を使ってみることで、ビルドが成功した。&lt;/p&gt;
&lt;h2 id=&quot;%E5%B7%AE%E7%95%B0&quot; tabindex=&quot;-1&quot;&gt;差異&lt;/h2&gt;
&lt;p&gt;バージョン &lt;code&gt;fb-re2&lt;/code&gt; → &lt;code&gt;google-re2&lt;/code&gt; へ変更した際にたまたま発見した差異。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fb-re2&lt;/code&gt; は &lt;code&gt;re2.error&lt;/code&gt; がそのまま &lt;code&gt;re.error&lt;/code&gt; を差していたが、 &lt;code&gt;gooogle-re2&lt;/code&gt; では別物のオブジェクトになっている。まあこれが問題になることはないと思うが……&lt;/p&gt;
&lt;p&gt;検証結果。uvはこういう検証に便利。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;uv run &lt;span class=&quot;token parameter variable&quot;&gt;--isolated&lt;/span&gt; --no-project &lt;span class=&quot;token parameter variable&quot;&gt;--with&lt;/span&gt; fb-re2 python &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;import re;import re2;print(re.error is re2.error)&quot;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; True
uv run &lt;span class=&quot;token parameter variable&quot;&gt;--isolated&lt;/span&gt; --no-project &lt;span class=&quot;token parameter variable&quot;&gt;--with&lt;/span&gt; google-re2 python &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;import re;import re2;print(re.error is re2.error)&quot;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; False&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fb-re2&lt;/code&gt; はもう古いので &lt;code&gt;google-re2&lt;/code&gt; を使おう。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/google-re2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;google-re2 · PyPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/fb-re2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fb-re2 · PyPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/google/re2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;google/re2: RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>【2025年版】Pythonパッケージ管理の決定版「uv」- 覚えることは4つだけ</title>
    <link href="https://ebiyuu.com/post/2025/08/uv/"/>
    <updated>2025-08-26T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2025/08/uv/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;今流行りのPythonのパッケージマネージャー &amp;quot;&lt;a href=&quot;https://docs.astral.sh/uv/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;uv&lt;/a&gt;&amp;quot; が便利でとりあえず全員に使ってほしい。「昨日まで動いていたコードが突然エラーになった」 「同僚にコードを渡したら動かなかった」 「venv使ってるけど、activateが面倒」といった経験がある人は特に見てください。&lt;/p&gt;
&lt;p&gt;この記事はそこまでPythonをガチで使っていない人（解析でPythonを使う研究者など）、パッケージ管理をやったことない人に向けた記事です。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%A8%E3%81%AB%E3%81%8B%E3%81%8F%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BB%E3%81%97%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;とにかく使ってほしい&lt;/h2&gt;
&lt;p&gt;覚えるのは以下の4つだけ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;最初にプロジェクトフォルダを作ったら &lt;code&gt;uv init&lt;/code&gt; を実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install {package}&lt;/code&gt; の代わりに &lt;code&gt;uv add {package}&lt;/code&gt; でパッケージをインストール&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python {script}.py&lt;/code&gt; の代わりに &lt;code&gt;uv run python {script}.py&lt;/code&gt; で実行
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run {script.py}&lt;/code&gt; と省略可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;人にスクリプトを渡すときはフォルダごと（ &lt;code&gt;pyproject.toml&lt;/code&gt; と一緒に）渡す&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;%E4%BB%8A%E3%81%BE%E3%81%A7%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83&quot; tabindex=&quot;-1&quot;&gt;今までのパッケージ管理との比較&lt;/h2&gt;
&lt;p&gt;なぜuvが良いのか、今までのパッケージ管理手法と比較して解説する。&lt;/p&gt;
&lt;h3 id=&quot;%EF%BC%88%E6%89%8B%E6%B3%951%EF%BC%89-pip-install-%E3%81%A0%E3%81%91%E3%82%92%E3%81%99%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;（手法1） pip install だけをする&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pip install matplotlib&lt;/code&gt; など、pipを使うことで様々なパッケージをインストールすることができるのがPythonのいい所である。そのため、必要になったタイミングで &lt;code&gt;pip install&lt;/code&gt; すれば実行できる、という運用をしている人が多いと思う。&lt;/p&gt;
&lt;p&gt;普段はこれでいいものの、突然Pythonのコードが動かなくなった経験がある人も少なくないと思う。そして、Pythonのコードが急に動かなくなる原因の9割は依存パッケージによるものである。これが起こる1つのストーリーを紹介する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スクリプトAのために、 &lt;code&gt;pip install X&lt;/code&gt; によってパッケージX v1.0 を入れた。&lt;/li&gt;
&lt;li&gt;1年後に、スクリプトBのためにパッケージYを入れ、無事スクリプトBを動かすことができた。
&lt;ul&gt;
&lt;li&gt;しかし、パッケージYはパッケージX v2.0に依存しており、自動的に パッケージX v2.0がインストールされた。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;その後にスクリプトAを実行しようとしたが、パッケージX v1.0 ではなく v2.0 がインストールされていたため、エラーとなってしまった。
&lt;ul&gt;
&lt;li&gt;当時に使っていたパッケージXのバージョンを記録していなかったため、復旧することができなかった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最近起きた事例だと、&lt;a href=&quot;https://github.com/numpy/numpy/releases/tag/v2.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;numpyのv2.0のリリース&lt;/a&gt; が2024年にあって、この現象が起きた。例えば X=numpy、Y=matplotlib など。&lt;/p&gt;
&lt;p&gt;また、他の例だと、機械学習によく用いるPyTorchは厳密にバージョンを指定しないと動作が変わってしまうことがあるため、勝手に変わっては困ることがある。&lt;/p&gt;
&lt;h3 id=&quot;%EF%BC%88%E6%89%8B%E6%B3%952%EF%BC%89venv%E3%82%92%E4%BD%BF%E3%81%86&quot; tabindex=&quot;-1&quot;&gt;（手法2）venvを使う&lt;/h3&gt;
&lt;p&gt;このような困りごとはよくあることであるため、pythonにはvenvという仕組みが標準搭載されている。venv（仮想環境）をプロジェクトごとに作成し、その中に &lt;code&gt;pip install&lt;/code&gt; することで、前述したような別のプロジェクトの影響による不具合は起こらなくなる。&lt;/p&gt;
&lt;p&gt;venvを使う際は以下のような流れになる。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; venv venv &lt;span class=&quot;token comment&quot;&gt;# `venv` ディレクトリに仮想環境を作成して&lt;/span&gt;
./venv/bin/activate &lt;span class=&quot;token comment&quot;&gt;# 仮想環境を有効化して&lt;/span&gt;
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; matplotlib &lt;span class=&quot;token comment&quot;&gt;# パッケージを入れて&lt;/span&gt;
python script.py &lt;span class=&quot;token comment&quot;&gt;# 実行したいスクリプトを実行して&lt;/span&gt;
deactivate &lt;span class=&quot;token comment&quot;&gt;# 仮想環境から出る&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ディレクトリを指定して（今回は &lt;code&gt;venv&lt;/code&gt; ディレクトリ）仮想環境を作成し、そこにパッケージをインストールする。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;venv&lt;/code&gt; は十分な機能であり、 &lt;code&gt;venv&lt;/code&gt; だけで運用している人も多い。しかし、以下のような困りごともある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;venv&lt;/code&gt; をアクティベートし忘れる
&lt;ul&gt;
&lt;li&gt;スクリプトを実行する前にactivateを忘れると、エラーが発生したり、&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install&lt;/code&gt; をする前にactivateを忘れるとPC全体にインストールされてしまったりする。&lt;/li&gt;
&lt;li&gt;まあ忘れなければよいが。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;venvのディレクトリ名を忘れる
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;venv&lt;/code&gt; /  &lt;code&gt;.venv&lt;/code&gt; などが慣例的に用いられるが、それ以外の名前も指定できるため、フォルダ名を忘れてしまう。見ればいいんだけどね。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;必要なパッケージのリストを手動で管理しないといけない
&lt;ul&gt;
&lt;li&gt;pip installはあくまで手動でやるため、例えば別のPCに移動する場合や他人に共有する場合はパッケージのリストを共有する必要がある。&lt;/li&gt;
&lt;li&gt;なお、このための仕組みはちゃんとpipに容易されており、
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pip freeze &amp;gt; requirements.txt&lt;/code&gt; でパッケージのリスト（ &lt;code&gt;requirements.txt&lt;/code&gt; ）を作成しておく。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt; で、リストを元にインストールできる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新しいパッケージを入れたものの &lt;code&gt;requirements.txt&lt;/code&gt; の更新を忘れていて、パッケージが足りなかったりなどもよく起こる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このように、まあ十分使えるんだが、覚えることが多くて大変。
なので、初心者ほど uv を使うのがいいと思っている。&lt;/p&gt;
&lt;h2 id=&quot;uv%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9&quot; tabindex=&quot;-1&quot;&gt;uvの使い方&lt;/h2&gt;
&lt;p&gt;再掲するが、覚えるのは以下の4つだけ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;最初にプロジェクトフォルダを作ったら &lt;code&gt;uv init&lt;/code&gt; を実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install {package}&lt;/code&gt; の代わりに &lt;code&gt;uv add {package}&lt;/code&gt; でパッケージをインストール&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python {script}.py&lt;/code&gt; の代わりに &lt;code&gt;uv run python {script}.py&lt;/code&gt; で実行
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run {script.py}&lt;/code&gt; と省略可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;人にスクリプトを渡すときはフォルダごと（ &lt;code&gt;pyproject.toml&lt;/code&gt; と一緒に）渡す
&lt;ul&gt;
&lt;li&gt;gitを使っている場合は、 &lt;code&gt;pyproject.toml&lt;/code&gt; をコミットする&lt;/li&gt;
&lt;li&gt;「 &lt;code&gt;uv run script.py&lt;/code&gt; で実行」してくださいと伝える。（READMEに書くなど）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;実際には上で説明した venv を使っているのだが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run&lt;/code&gt; &lt;code&gt;uv add&lt;/code&gt; 時に、勝手に仮想環境を activate して実行してくれる。
&lt;ul&gt;
&lt;li&gt;仮想環境が存在しない場合は自動で作成してくれる。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.venv&lt;/code&gt; という名前で固定になっていて、意識する必要がない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;必要なパッケージがない場合は勝手にインストールしてくれる。&lt;/li&gt;
&lt;li&gt;後述するが、Pythonがない場合ですら勝手にインストールしてくれる。
&lt;ul&gt;
&lt;li&gt;なので、uvを使う場合はPythonのインストールが不要。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インストールしたパッケージとバージョンは &lt;code&gt;pyproject.toml&lt;/code&gt;  に勝手に保存される。
&lt;ul&gt;
&lt;li&gt;明示的に指定していないパッケージのバージョンも &lt;code&gt;uv.lock&lt;/code&gt; に記録されるため、完全に環境が再現可能である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、何も意識せずに使えばよい。
ちなみに単純に &lt;code&gt;pip install&lt;/code&gt; するよりも高速なのでそれだけでも便利。&lt;/p&gt;
&lt;h2 id=&quot;uv%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;uvのインストール&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astral.sh/uv/getting-started/installation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Installation | uv&lt;/a&gt; に従えばインストールができる。&lt;/p&gt;
&lt;p&gt;windowsの場合&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;powershell &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ExecutionPolicy ByPass &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;c &lt;span class=&quot;token string&quot;&gt;&quot;irm https://astral.sh/uv/install.ps1 | iex&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mac / linux の場合&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-LsSf&lt;/span&gt; https://astral.sh/uv/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;スクリプトを実行したくない場合は、 &lt;code&gt;winget&lt;/code&gt; や &lt;code&gt;homebrew&lt;/code&gt; で入れることもできる。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;winget &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; astral-sh.uv &lt;span class=&quot;token comment&quot;&gt;# for windows&lt;/span&gt;
brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; uv &lt;span class=&quot;token comment&quot;&gt;# for mac&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E4%BE%BF%E5%88%A9%E6%A9%9F%E8%83%BD&quot; tabindex=&quot;-1&quot;&gt;その他の便利機能&lt;/h2&gt;
&lt;p&gt;さっきの4項目だけを使うだけで、uvの恩恵にあずかることができる。&lt;/p&gt;
&lt;p&gt;一方で、uvにはさらにいくつか便利機能があるので、活用例と共に紹介する。&lt;/p&gt;
&lt;h3 id=&quot;uv%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6python%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&quot; tabindex=&quot;-1&quot;&gt;uvを使ってPythonをインストール&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astral.sh/uv/concepts/python-versions/#discovery-of-python-versions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python versions | uv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Python自体のインストールをする機能がある。そのため、基本的にはuvさえインストールすればPythonをインストールする必要はない。実行時にPythonがなければ自動でインストールしてくれる。ちなみに、すでにPythonを(例えばmicrosoft storeなどから)インストールしてある場合には、そのPythonをちゃんと参照してくれたりする。&lt;/p&gt;
&lt;p&gt;uvではこの仕組みを使って、指定したpythonのバージョンを用いることができる。これによって、Pythonのバージョンが環境によって異なることによる不具合を防ぐことができる。 &lt;code&gt;uv init&lt;/code&gt; 時に指定する。&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;uv init &lt;span class=&quot;token parameter variable&quot;&gt;--python&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.11&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Python 3.11を指定&lt;/span&gt;
uv python pin &lt;span class=&quot;token number&quot;&gt;3.11&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# すでにinitしている場合には、python pinが使える&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指定したPythonは &lt;code&gt;.python-version&lt;/code&gt; ファイルに自動で記録され、uvが勝手に読み取ってくれるため、次回以降は意識せず &lt;code&gt;uv run&lt;/code&gt; を行うだけで指定したバージョンのPythonで実行される（そのバージョンがなければインストールしてくれる）。&lt;/p&gt;
&lt;p&gt;なお、パッと違うバージョンで実行したい時には&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;uv run &lt;span class=&quot;token parameter variable&quot;&gt;--python&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.13&lt;/span&gt; script.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;と指定して実行ができる。&lt;/p&gt;
&lt;p&gt;Pythonのバイナリをパッとインストール&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv python install 3.10
uv venv --python 3.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astral.sh/uv/pip/environments/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.astral.sh/uv/pip/environments/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%881%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E5%AE%8C%E7%B5%90%E3%81%95%E3%81%9B%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;スクリプト1ファイルで完結させる&lt;/h3&gt;
&lt;p&gt;依存パッケージの情報は、 &lt;code&gt;pyproject.toml&lt;/code&gt; に基本的に記載される。一方で、スクリプトファイル1つだけ動かしたいような場合には、わざわざ &lt;code&gt;pyproject.toml&lt;/code&gt; に記載するのが面倒である。&lt;/p&gt;
&lt;p&gt;uvを使うと、ファイル内に依存関係を埋め込むこともできる。 &lt;code&gt;uv add&lt;/code&gt; 時に &lt;code&gt;--script&lt;/code&gt; を指定すればよい。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv add --script script.py matplotlib
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;# /// script
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;# requires-python = &quot;&gt;=3.9&quot;
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;# dependencies = [
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;#     &quot;matplotlib&quot;,
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;# ]
&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;# ///
&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;import matplotlib.pyplot as plt
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;x = [1, 2, 3, 4, 5]
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;y = [2, 4, 1, 3, 5]
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;plt.plot(x, y, marker=&#39;o&#39;)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;plt.xlabel(&#39;x-axis&#39;)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;plt.ylabel(&#39;y-axis&#39;)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;plt.grid(True)
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;plt.show()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;実行する側は、何も意識せず今まで通りやればよい。（これが素晴らしい）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv run script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.py&lt;/code&gt; スクリプトを共有する場合には依存関係を組み込んでおくと親切。&lt;/p&gt;
&lt;h2 id=&quot;%E5%BF%9C%E7%94%A8%E4%BE%8B&quot; tabindex=&quot;-1&quot;&gt;応用例&lt;/h2&gt;
&lt;p&gt;他にも便利な使い方の例を紹介する。&lt;/p&gt;
&lt;h3 id=&quot;python%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;Pythonファイルのフォーマット&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;uvx ruff format
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;uvx&lt;/code&gt; を用いると、パッケージをインストールして実行できる。この機能を用いて、フォーマッタの1つである &lt;code&gt;ruff&lt;/code&gt; パッケージをインストールすることで簡単にPythonスクリプトのフォーマット（体裁を整えること）ができる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astral.sh/uv/concepts/tools/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tools | uv&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;jupyter-notebook-(jupyer-lab)%E3%81%AE%E5%AE%9F%E8%A1%8C&quot; tabindex=&quot;-1&quot;&gt;Jupyter notebook (jupyer lab)の実行&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;uv run --with jupyter jupyter lab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;uv run&lt;/code&gt; 時に &lt;code&gt;--with&lt;/code&gt; で指定したパッケージを追加で一時的に（ &lt;code&gt;pyproject.toml&lt;/code&gt; に追加せずに）インストールして実行することができる。これを活用すると、現在のフォルダの依存パッケージを保ったまま jupyter labを実行することができる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astral.sh/uv/guides/scripts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Running scripts | uv&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;パッケージ管理ツールを使うと、パッケージ依存に関するトラブルを避けることができる。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv&lt;/code&gt; では基本的な使いかたを覚えるだけで使うことができる。&lt;/li&gt;
&lt;li&gt;他にも便利な機能がある。&lt;/li&gt;
&lt;li&gt;とにかく将来の自分や他人のために使ってください。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astral.sh/uv/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;uv official document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nikkie-ftnext.hatenablog.com/entry/uv-guides-running-scripts-add-inline-script-metadata&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;uvはinline script metadataを書ける！ Guidesの「Running scripts」を読んだメモ - nikkie-ftnextの日記&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>分析スクリプト迷子問題を解決する：1成果物＝1スクリプト運用</title>
    <link href="https://ebiyuu.com/post/2025/12/python_analysis_filename/"/>
    <updated>2025-12-05T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2025/12/python_analysis_filename/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;Pythonでデータ分析やグラフ作成をしてると、「この図ってどのスクリプト・どの条件で作ったんだっけ？」が多発する。これを解決するために、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1成果物1ファイルでスクリプトを作り、&lt;/li&gt;
&lt;li&gt;&lt;code&gt;__file__&lt;/code&gt; を使うことでスクリプトファイルと成果物を対応させる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;運用を紹介する。1年間ほど行ってきて固まってきたものを紹介する。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%AE%E8%AA%B2%E9%A1%8C&quot; tabindex=&quot;-1&quot;&gt;これまでの課題&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;スクリプトを書き換えてしまい、どの条件で出した図かわからなくなる&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Jupyter Notebookなどを用いている場合も書き換えがちなので同様&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入力ファイルなどを引数にして管理しても、
&lt;ul&gt;
&lt;li&gt;最初はパラメータだと思っていなかったところを後から変えたくなったり&lt;/li&gt;
&lt;li&gt;パラメータが増えていくと実行するのが大変になるなど、&lt;/li&gt;
&lt;li&gt;どうしても本体のスクリプトを書き換えたくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;修正版を作るためにスクリプトをコピーすると増えていき、&lt;strong&gt;どの成果物がどのスクリプトから出力したものなのか分からなくなってしまう&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、成果物とスクリプトの紐付けが失われやすいのが課題&lt;/p&gt;
&lt;h2 id=&quot;%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E9%81%8B%E7%94%A8&quot; tabindex=&quot;-1&quot;&gt;解決するための運用&lt;/h2&gt;
&lt;h3 id=&quot;1%E6%88%90%E6%9E%9C%E7%89%A91%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E9%81%8B%E7%94%A8%E3%81%AB%E3%81%99%E3%82%8B%EF%BC%88%E4%B8%80%E5%AF%BE%E4%B8%80%E3%83%AB%E3%83%BC%E3%83%AB%EF%BC%89&quot; tabindex=&quot;-1&quot;&gt;1成果物1スクリプトの運用にする（一対一ルール）&lt;/h3&gt;
&lt;p&gt;例えば、&lt;code&gt;251205_data1_plot.py&lt;/code&gt; というスクリプトは &lt;code&gt;251205_data1_plot.png&lt;/code&gt; を生成する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同じスクリプトで別のデータを出力する際も別のファイルにする
&lt;ul&gt;
&lt;li&gt;これは、後からグラフの文言や縦軸・横軸を変えたくなったりすることがあるため。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AF%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9A%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B%EF%BC%88%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%83%AB%E3%83%BC%E3%83%AB%EF%BC%89&quot; tabindex=&quot;-1&quot;&gt;スクリプトは基本的に書き換えずコピーする（イミュータブルルール）&lt;/h3&gt;
&lt;p&gt;基本スクリプトの書き換えはせず、コピーして新規スクリプトを作る（イミュータブルルール）
コピーして編集してもよいし、「名前をつけて保存」でもよい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可視化の際に試行錯誤するとか、明らかに間違えたとかであればもちろんOK。&lt;/li&gt;
&lt;li&gt;一方で1週間前作ったグラフを作り直したい、などあればコピーして修正するのがベター。&lt;/li&gt;
&lt;li&gt;イメージとしては、24時間経ったらもう編集しないくらいのイメージ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際はスクリプトを作成した日付を頭につける運用をしている。
命名が面倒なのでファイルをコピーせず編集しちゃう、といったことが起きうるが、
日付をつけておけばある程度適当な命名でも同じ日付内での重複だけ避ければよい。&lt;/p&gt;
&lt;h3 id=&quot;__file__-%E3%81%A7%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%87%BA%E5%8A%9B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;__file__&lt;/code&gt; で自動的に出力ファイル名を決める&lt;/h3&gt;
&lt;p&gt;一対一ルールとイミュータブルルールを守るためのテクニック。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;__file__&lt;/code&gt; を使うことでスクリプトのファイル名を取得できるので、これを用いて出力ファイル名を決定するとファイルと成果物（グラフ画像など）が一対一対応できる
&lt;ul&gt;
&lt;li&gt;また、スクリプトを別名保存した際にはグラフも新しい名前で自動的に作成される。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pathlib&lt;/code&gt; の &lt;code&gt;.with_suffix()&lt;/code&gt; を用いるとこれが簡略に書ける&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; matplotlib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pyplot &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; plt

fig&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ax &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subplots&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;figsize&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; constrained_layout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# example&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# plot here&lt;/span&gt;

plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;savefig&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__file__&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;with_suffix&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.png&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
plt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;show&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;%E5%85%B1%E9%80%9A%E5%8C%96%E3%81%AF%E3%81%82%E3%81%88%E3%81%A6%E3%81%97%E3%81%AA%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;共通化はあえてしない&lt;/h3&gt;
&lt;p&gt;特にプログラミングに慣れている人は前処理や描画の共通化をしたくなるが…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ただ、もし前処理だけ変えたくなったら？&lt;/li&gt;
&lt;li&gt;一部だけ変えたくなったときにライブラリ側を変更すると、他のスクリプトの再現性を壊す&lt;/li&gt;
&lt;li&gt;1ファイルに全部書いておいて、まるごとコピペするのがベスト&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そこで、1ファイル完結で書き、必要ならそのままコピペが一番トラブルが少ない。&lt;/p&gt;
&lt;h3 id=&quot;%E6%9C%80%E5%BE%8C%E3%81%AB%E3%80%81%E3%81%93%E3%82%8C%E3%82%89%E3%82%92%E5%85%A8%E9%83%A81%E3%81%A4%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;最後に、これらを全部1つのリポジトリに入れる&lt;/h3&gt;
&lt;p&gt;以下のようなフォルダ構造にしている。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;data/
	yymmdd_&amp;lt;slug&amp;gt;/       # 実験日と実験内容で分類
		**/*.csv         # 実験データファイル
scripts/
    yymm/                    # 年月で分類
        yymmdd_&amp;lt;slug&amp;gt;.py     # 解析スクリプト（1成果物1スクリプト）
pyproject.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;今のところは、全ての生データと解析スクリプトをここに入れている。
&lt;ul&gt;
&lt;li&gt;プロジェクトごとにフォルダを作ってもよいが、「これどこに入れよう？」を毎回考えるのが面倒。&lt;/li&gt;
&lt;li&gt;結局日付での管理が最強で思い出しやすい。（参考: スマホのカメラロール）
&lt;ul&gt;
&lt;li&gt;実験ノートに日付付きでメモしているので辿れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Claude codeなどを用いることで、他のスクリプトのデータだけ差し替えたものを作ったりできる。
&lt;ul&gt;
&lt;li&gt;プロンプト例: 「scripts/yymm/yymmdd_analysis1.py を参考にして、 data/yymmdd_exp1/exp1.csv を可視化するスクリプトを作成してください。」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;できればgitで管理する
&lt;ul&gt;
&lt;li&gt;バックアップのため。慣れていなければ定期的に全体をzipしてクラウドにバックアップしておくような運用でも、まあ、よい。
&lt;ul&gt;
&lt;li&gt;イミュータブルルールにより、バージョン管理の重要性が少ない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data&lt;/code&gt; フォルダはgit管理してもしなくてもよい
&lt;ul&gt;
&lt;li&gt;データが軽量なのであればgit管理しておくとバックアップにもなるし同期が楽&lt;/li&gt;
&lt;li&gt;重いのであればLFSや別のクラウドストレージで管理するなどの方法を取ってもよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コミットメッセージは適当
&lt;ul&gt;
&lt;li&gt;コミットメッセージで（内容に関係なくてよいので）日記をつけている。以外と記憶が連想で思い出しやすくてよい。&lt;/li&gt;
&lt;li&gt;もちろんちゃんとメッセージを書いてもよい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ai%E3%81%A8%E3%81%AE%E9%81%A9%E6%AD%A3%E3%82%82good&quot; tabindex=&quot;-1&quot;&gt;AIとの適正もgood&lt;/h2&gt;
&lt;p&gt;スクリプトが1ファイルで完結していることにより、AIによるコードレビューや修正も用意。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「このファイルを直して」とそのまま渡せる&lt;/li&gt;
&lt;li&gt;文脈が1ファイル内で閉じているため誤解が少ない&lt;/li&gt;
&lt;li&gt;claude codeなどのコーディングエージェントをわざわざ用いずとも、Web上のChatGPTやGeminiなどの画面にコピペすれば済む。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI支援時代のスクリプト管理としても合理的。
このブログ記事を &lt;code&gt;CLAUDE.md&lt;/code&gt; などに記載しておいてもよい。&lt;/p&gt;
&lt;h2 id=&quot;%E5%B7%AE%E5%88%86%E3%81%8C%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A5%E3%82%89%E3%81%84%E5%95%8F%E9%A1%8C&quot; tabindex=&quot;-1&quot;&gt;差分が確認しづらい問題&lt;/h2&gt;
&lt;p&gt;「共通化をしない」「gitなどのバージョン管理ツールを使わずにコピペで履歴管理する」ことによって、どの部分を変更したのか忘れてしまったりする。&lt;/p&gt;
&lt;p&gt;積極的にdiffをとろう。vscodeであれば右クリックでcompareできるし、コマンドラインだったらdiffコマンドが使える。winmergeなどを使ってもよいだろう。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1成果物＝1スクリプト（一対一ルール）&lt;/strong&gt; により、スクリプトが迷子にならない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スクリプトの変更は基本的に行わないイミュータブルルール&lt;/strong&gt; により、再現性を確保&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%E3%81%8A%E3%81%BE%E3%81%91&quot; tabindex=&quot;-1&quot;&gt;おまけ&lt;/h2&gt;
&lt;h3 id=&quot;%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%81%8C%E9%9D%A2%E5%80%92%E3%81%AA%E5%95%8F%E9%A1%8C&quot; tabindex=&quot;-1&quot;&gt;ファイルの実行が面倒な問題&lt;/h3&gt;
&lt;p&gt;毎回 &lt;code&gt;python&lt;/code&gt; コマンドを実行するのが（jupyter notebookなどと比較して）面倒である問題&lt;/p&gt;
&lt;p&gt;これに対しては、スクリプトファイルをwatchして保存時に自動的に実行する適当なスクリプトを用意している。&lt;/p&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; time
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; subprocess
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; watchdog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;observers &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Observer
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; watchdog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;events &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FileSystemEventHandler
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; threading
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; shutil

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PythonFileChangeHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FileSystemEventHandler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; delay&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__init__&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;delay &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; delay
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_py_run_time &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Last execution time of .py script&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;on_modified&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Cancel existing timer if present&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src_path &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src_path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cancel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Set a new timer&lt;/span&gt;
        timer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; threading&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Timer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;delay&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;on_modified_throttled&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src_path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; timer
        timer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; timer &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                timer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cancel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;on_moved&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Cancel existing timer if present&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dest_path &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dest_path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cancel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Set a new timer&lt;/span&gt;
        timer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; threading&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Timer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;delay&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;on_modified_throttled&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dest_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dest_path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; timer
        timer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; timer &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                timer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cancel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;on_modified_throttled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# .venv配下は無視&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.venv&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resolve&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__file__&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resolve&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        ext &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;suffix

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ext &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            execute_py&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_py_run_time &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; ext &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.yaml&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; ext &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.yml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;YAML file changed: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            execute_py&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ext&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_py_run_time &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; ext &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.svg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;# Notify only if updated within 2 seconds after .py execution&lt;/span&gt;
            now &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_py_run_time &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;now &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_py_run_time&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot; Updated: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;execute_py&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Executing &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;...&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; flush&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        env &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;copy&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        env&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MPLBACKEND&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Agg&quot;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subprocess&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;uv&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;run&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;python&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;-W&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ignore:FigureCanvasAgg is non-interactive&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                file_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            capture_output&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            text&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            env&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            encoding&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;utf-8&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            errors&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ignore&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;returncode &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;done.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;error! (code=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;returncode&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stdout&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            print_boxed_output&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stdout&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stdout&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stderr&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            print_boxed_output&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stderr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stderr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Failed to execute &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;file_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;print_boxed_output&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Output&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Get terminal width, fallback to 60 if not available&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; shutil&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_terminal_size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;columns
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;
    min_width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
    width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; min_width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Box drawing&lt;/span&gt;
    head &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;─&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;┐&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# -2 for right corner&lt;/span&gt;
    tail &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; └&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;─&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;┘&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; line &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rstrip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ljust&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# │ と │ で2文字、先頭の│ とスペースで2文字&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot; │ &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; │&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tail&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getcwd&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# scripts directory&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Error: scripts directory not found at &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    event_handler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; PythonFileChangeHandler&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;delay&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    observer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Observer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;schedule&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_handler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; recursive&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Monitoring .py files in &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; for changes...&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; KeyboardInterrupt&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    observer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>SpotifyからApple Musicへ移行しての感想</title>
    <link href="https://ebiyuu.com/post/2026/05/spotify-to-apple-music/"/>
    <updated>2026-05-13T00:00:00Z</updated>
    <id>https://ebiyuu.com/post/2026/05/spotify-to-apple-music/</id>
    <content xml:lang="ja" type="html">&lt;p&gt;今までずっとSpotifyを使っていた（10年間程度）が、1週間前ごろからApple Musicを使ってみている。
比較した感想を述べる。
結論から言うと今後もApple Musicを使いつづけると思う。&lt;/p&gt;
&lt;h2 id=&quot;%E7%A7%BB%E8%A1%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&quot; tabindex=&quot;-1&quot;&gt;移行について&lt;/h2&gt;
&lt;p&gt;一番心配だったのは育ててきたプレイリストの移行だったが、公式機能を使って簡単に全部コピーできた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.lifehacker.jp/article/2509how-to-transfer-songs-from-spotify-to-apple-music/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apple Musicの「神アプデ」でSpotifyからの楽曲移行が可能に！ 日本の対応はいつ？ | ライフハッカー・ジャパン&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;apple-music-%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%A6%E6%84%9F%E3%81%98%E3%81%9F%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;Apple Music へ移行して感じたメリット&lt;/h2&gt;
&lt;p&gt;全体的にApple純正なだけあり、iPhoneとの親和性が高い&lt;/p&gt;
&lt;h3 id=&quot;auto-mix&quot; tabindex=&quot;-1&quot;&gt;Auto Mix&lt;/h3&gt;
&lt;p&gt;これをやってみたくて移行した。
アウトロの途中からイントロ後 or サビ前まで、自動でトランジションしてくれる。&lt;/p&gt;
&lt;p&gt;「曲はフルで聞くべき」など賛否あると思うがドライブ中などBGMとして聞いている時には良い。&lt;/p&gt;
&lt;h3 id=&quot;%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E6%99%82%E3%81%8B%E3%82%89%E6%AD%8C%E8%A9%9E%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;リリース時から歌詞が表示される&lt;/h3&gt;
&lt;p&gt;Spotifyは歌詞の表示に外部サービスを用いているため、新曲などリリース直後には歌詞が表示されなかった。Apple Musicの場合はリリース時から歌詞が表示される。新曲を追い掛けている場合にはとても重要。&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%A2%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AE%E6%9B%B2%E4%B8%80%E8%A6%A7%E3%81%8C%E8%A6%8B%E3%82%8C%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;アーティストの曲一覧が見れる&lt;/h3&gt;
&lt;p&gt;Spotifyではアーティスト画面から、トップ10曲しか見ることができなかった。
Apple Musicでは曲を全て見ることができる。&lt;/p&gt;
&lt;h3 id=&quot;%E3%82%AF%E3%83%AC%E3%82%B8%E3%83%83%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%8C%E5%85%85%E5%AE%9F%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;クレジット機能が充実している&lt;/h3&gt;
&lt;p&gt;「クレジット表示」で作編曲者やリリース日が表示される。
Spotifyではクレジットは表示されるものの、リリース日が表示されなかった。
たまにいつの曲か調べたくなるので便利。&lt;/p&gt;
&lt;h3 id=&quot;%E6%AD%8C%E8%A9%9E%E3%81%AE%E5%85%B1%E6%9C%89%E6%A9%9F%E8%83%BD&quot; tabindex=&quot;-1&quot;&gt;歌詞の共有機能&lt;/h3&gt;
&lt;p&gt;「歌詞を共有」機能を用いると、曲の歌詞の好きな部分を画像として共有することができる。
歌詞ツイがお手軽にできてたのしい。&lt;/p&gt;
&lt;h3 id=&quot;%E3%83%AD%E3%83%83%E3%82%AF%E7%94%BB%E9%9D%A2%E3%81%8B%E3%82%89%E6%A5%BD%E6%9B%B2%E3%81%AE%E3%81%84%E3%81%84%E3%81%AD%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B&quot; tabindex=&quot;-1&quot;&gt;ロック画面から楽曲のいいねができる&lt;/h3&gt;
&lt;p&gt;ロック画面の再生コンポーネントから、☆ボタンを押して、お気に入りの曲に追加することができる。
自動再生にしている時など、「この曲好き」と思ったら記録しておけるのがとてもよい。&lt;/p&gt;
&lt;h2 id=&quot;apple-music-%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%A6%E6%84%9F%E3%81%98%E3%81%9F%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88&quot; tabindex=&quot;-1&quot;&gt;Apple Music へ移行して感じたデメリット&lt;/h2&gt;
&lt;h3 id=&quot;ui%E3%81%8C%E4%BD%BF%E3%81%84%E3%81%A5%E3%82%89%E3%81%84&quot; tabindex=&quot;-1&quot;&gt;UIが使いづらい&lt;/h3&gt;
&lt;p&gt;画面下部のナビゲーションがタブではなくコロコロと形が変わるため、認知負荷が高い。&lt;/p&gt;
&lt;p&gt;Spotifyであれば単純なタブUIなので、例えば検索がしたかったら毎回同じ場所をタップすればよい。
Apple Musicは検索ボタンが音声検索ボタンに変わったり、検索欄が再生中音楽に変わったりと状態遷移が多いため、画面を見ないとまともに操作ができない。&lt;/p&gt;
&lt;p&gt;歌詞画面のUIも歌詞を見ようと歌詞をスクロールしていると、音楽を飛ばしてしまうことがあるなど、直感的に操作できないことが多い。&lt;/p&gt;
&lt;h3 id=&quot;google-tv%E9%80%A3%E6%90%BA&quot; tabindex=&quot;-1&quot;&gt;Google TV連携&lt;/h3&gt;
&lt;p&gt;SpotifyではスマホアプリからGoogle HomeやGoogle TVへ曲を転送して、そのまま再生、さらにスマホから再生をコントロールすることができた。
Apple Musicでもできるのかもしれないが今のところやり方が分かっていない。&lt;/p&gt;
&lt;h2 id=&quot;%E3%81%BE%E3%81%A8%E3%82%81&quot; tabindex=&quot;-1&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Apple Musicの方が痒いところに手が届くような機能が充実していた。
ただ、最近のApple特有の使いづらいUIには不満が残る。&lt;/p&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lifehacker.jp/article/2509how-to-transfer-songs-from-spotify-to-apple-music/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apple Musicの「神アプデ」でSpotifyからの楽曲移行が可能に！ 日本の対応はいつ？ | ライフハッカー・ジャパン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/ja-jp/105067&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apple MusicアプリでAutoMixまたはクロスフェードのオン／オフを切り替える方法 - Apple サポート (日本)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://note.com/akausa28/n/n2379ca8e129e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;iOS26で進化したApple Music──Auto MixでDJ気分の音楽体験｜あかうさ📸&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>
