<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Posts on shibadog site</title>
		<link>https://pages.shibadog.net/posts/</link>
		<description>Recent content in Posts on shibadog site</description>
		<generator>Hugo -- gohugo.io</generator>
		<language>ja-jp</language>
		<lastBuildDate>Tue, 30 Apr 2024 15:00:00 +0900</lastBuildDate>
		<atom:link href="https://pages.shibadog.net/posts/index.xml" rel="self" type="application/rss+xml" />
		
		<item>
			<title>PlayStation4を壊して直した</title>
			<link>https://pages.shibadog.net/posts/017_playstation4/</link>
			<pubDate>Tue, 30 Apr 2024 15:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/017_playstation4/</guid>
			<description>目次
何が起こったのか？ 何をどうするのか？ 何が起こったのか？ PlayStation4を持っているのだが、使っているうちにかなりファンの音がうるさくなってきた。
最近、任天堂Switchの修理をしまくっていたため、調子に乗って、分解清掃でもするか、とばらして掃除したところ、なんと、電源の信号部分のコネクタを壊してしまった。
基盤からコネクタを引っこ抜いてしまい、そのパターンも完全にはがれてしまった。。。
がしかし、なんと、先駆者がいらっしゃり、パターンをはがしても裏の基盤から直接信号を伝えることが出来るとのこと。
この時点で、めんどくさくなって放置していたが、昨日やっと手を付けたので記録を残したい。
何をどうするのか？ 先駆者がまとめてくれていた動画は以下の通り。
https://youtube.com/watch?v=fRuwFATJ3Bc&amp;amp;si=UdmizDm7xKN9Va46
この動画を見ると、ピンの順序と意味は以下の通り。
で、このパターンと対応する露出が裏面に存在するとのこと。
これを適当に買ってきた導線につなぎ、ちぎれとんだ端子にはんだでつけなおす。
剥がれたパターン部分や、導線などは適当にビニールテープで押さえつけてつないだところ、無事復旧した。
また、改めてもう少し時間がある時にまとめようと思う。</description>
			<content type="html"><![CDATA[<p>目次</p>
<ul>
<li><a href="#%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">何が起こったのか？</a></li>
<li><a href="#%E4%BD%95%E3%82%92%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B">何をどうするのか？</a></li>
</ul>
<h2 id="何が起こったのか">何が起こったのか？</h2>
<p>PlayStation4を持っているのだが、使っているうちにかなりファンの音がうるさくなってきた。<br>
最近、任天堂Switchの修理をしまくっていたため、調子に乗って、分解清掃でもするか、とばらして掃除したところ、なんと、電源の信号部分のコネクタを壊してしまった。</p>
<p><img src="images/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%8C%E3%81%AF%E3%81%92%E3%81%9F.png" alt="パターンがはげた"></p>
<p>基盤からコネクタを引っこ抜いてしまい、そのパターンも完全にはがれてしまった。。。</p>
<p>がしかし、なんと、先駆者がいらっしゃり、パターンをはがしても裏の基盤から直接信号を伝えることが出来るとのこと。</p>
<p>この時点で、めんどくさくなって放置していたが、昨日やっと手を付けたので記録を残したい。</p>
<h2 id="何をどうするのか">何をどうするのか？</h2>
<p>先駆者がまとめてくれていた動画は以下の通り。</p>
<p><a href="https://youtube.com/watch?v=fRuwFATJ3Bc&amp;si=UdmizDm7xKN9Va46">https://youtube.com/watch?v=fRuwFATJ3Bc&amp;si=UdmizDm7xKN9Va46</a></p>
<p>この動画を見ると、ピンの順序と意味は以下の通り。</p>
<p><img src="images/%E3%83%94%E3%83%B3%E3%81%AE%E9%A0%86%E5%BA%8F.png" alt="ピンの順序"></p>
<p>で、このパターンと対応する露出が裏面に存在するとのこと。</p>
<p><img src="images/%E7%9B%B4%E4%BB%98%E3%81%91%E3%81%AE%E5%A0%B4%E6%89%80.png" alt="直付けの場所"></p>
<p><img src="images/gnd.png" alt="GNDは表に"></p>
<p>これを適当に買ってきた導線につなぎ、ちぎれとんだ端子にはんだでつけなおす。</p>
<p>剥がれたパターン部分や、導線などは適当にビニールテープで押さえつけてつないだところ、無事復旧した。</p>
<p>また、改めてもう少し時間がある時にまとめようと思う。</p>
]]></content>
		</item>
		
		<item>
			<title>fly.ioへspring bootアプリケーションをデプロイする</title>
			<link>https://pages.shibadog.net/posts/017_fly.io2spring-boot-01/</link>
			<pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
			
			<guid>https://pages.shibadog.net/posts/017_fly.io2spring-boot-01/</guid>
			<description>はじめに Qiitaのアドベントカレンダーをいつも見ていて、いつか参加してみたいと思ってました。 はじめてのアドベントカレンダーという企画があることを知ったので、今回始めて参加してみようと思います。
何がしたかったのか？ 子供のために、復習用の計算プリントをランダム生成するアプリケーションを作ってみた。
これはspring bootで作成した画面を持つWebサービスですが、なんとか無料で子供のタブレットから使えないかと、良い感じに転がす場所を探した結果 fly.io というサービスを見つけた。
デプロイまでに少しハマったので、この手順を記述した。
fly.ioとは fly.io
herokuとかと同様にPaaS環境を提供してくれるサービスの一つで、herokuの無料利用分がなくなってしまったため、移行先として上がるサービスの一つ（らしい）。
このfly.ioは、herokuと同様にコンテナを起動することでアプリケーションを動作させるため、どんな言語のアプリケーションでも、最終的にはコンテナの中で動作する仕組みとなる。
公式ドキュメントでも触れられている通り、 Dockerfile によるデプロイが一番プレーンはデプロイ方法となり、標準で対応している言語はソースの自動判定により起動イメージを選択される。
実は、fly.ioではこの自動判定に含まれないJava（Spring Boot）でのイメージデプロイをpaketo buildpacksを利用してワンタッチで行えるため、この手順を試してみる。
まずは、ソースを用意する プログラムは、 maine-coonというものを用意した。
これをクローンして試してみると良い。
ローカルで起動して、適切に動作するところまで実装をした。
&amp;gt; ./mvnw spring-boot:run -&amp;gt; http://localhost:8080/ 出来上がったらflyコマンドをインストール flyctlのインストール
fly.ioはローカルからコマンドでコントロールすることができる。
このコマンドは2種類存在しており、 fly と flyctl が存在する。
どう使い分けるのか、正直良くわからない（ぇ
&amp;gt; curl -L https://fly.io/install.sh | sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1735 0 1735 0 0 4131 0 --:--:-- --:--:-- --:--:-- 4140 ######################################################################## 100.</description>
			<content type="html"><![CDATA[<h2 id="はじめに">はじめに</h2>
<p>Qiitaのアドベントカレンダーをいつも見ていて、いつか参加してみたいと思ってました。
はじめてのアドベントカレンダーという企画があることを知ったので、今回始めて参加してみようと思います。</p>
<h2 id="何がしたかったのか">何がしたかったのか？</h2>
<p>子供のために、復習用の計算プリントをランダム生成するアプリケーションを作ってみた。<br>
これはspring bootで作成した画面を持つWebサービスですが、なんとか無料で子供のタブレットから使えないかと、良い感じに転がす場所を探した結果 <code>fly.io</code> というサービスを見つけた。<br>
デプロイまでに少しハマったので、この手順を記述した。</p>
<h2 id="flyioとは">fly.ioとは</h2>
<p><a href="https://fly.io/">fly.io</a></p>
<p>herokuとかと同様にPaaS環境を提供してくれるサービスの一つで、herokuの無料利用分がなくなってしまったため、移行先として上がるサービスの一つ（らしい）。</p>
<p>このfly.ioは、herokuと同様にコンテナを起動することでアプリケーションを動作させるため、どんな言語のアプリケーションでも、最終的にはコンテナの中で動作する仕組みとなる。</p>
<p>公式ドキュメントでも触れられている通り、 Dockerfile によるデプロイが一番プレーンはデプロイ方法となり、標準で対応している言語はソースの自動判定により起動イメージを選択される。</p>
<p>実は、fly.ioではこの自動判定に含まれないJava（Spring Boot）でのイメージデプロイをpaketo buildpacksを利用してワンタッチで行えるため、この手順を試してみる。</p>
<h2 id="まずはソースを用意する">まずは、ソースを用意する</h2>
<p>プログラムは、 <a href="https://github.com/shibadog/maine-coon">maine-coon</a>というものを用意した。</p>
<p>これをクローンして試してみると良い。</p>
<p>ローカルで起動して、適切に動作するところまで実装をした。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; ./mvnw spring-boot:run
</span></span><span style="display:flex;"><span>-&gt; http://localhost:8080/
</span></span></code></pre></div><h2 id="出来上がったらflyコマンドをインストール">出来上がったらflyコマンドをインストール</h2>
<p><a href="https://fly.io/docs/hands-on/install-flyctl/">flyctlのインストール</a></p>
<p>fly.ioはローカルからコマンドでコントロールすることができる。</p>
<p>このコマンドは2種類存在しており、 <code>fly</code> と <code>flyctl</code> が存在する。</p>
<p>どう使い分けるのか、正直良くわからない（ぇ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; curl -L https://fly.io/install.sh | sh
</span></span><span style="display:flex;"><span>  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
</span></span><span style="display:flex;"><span>                                 Dload  Upload   Total   Spent    Left  Speed
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">100</span>  <span style="color:#ae81ff">1735</span>    <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">1735</span>    <span style="color:#ae81ff">0</span>     <span style="color:#ae81ff">0</span>   <span style="color:#ae81ff">4131</span>      <span style="color:#ae81ff">0</span> --:--:-- --:--:-- --:--:--  <span style="color:#ae81ff">4140</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">######################################################################## 100.0%</span>
</span></span><span style="display:flex;"><span>set update channel to shell
</span></span><span style="display:flex;"><span>flyctl was installed successfully to /home/vscode/.fly/bin/flyctl
</span></span><span style="display:flex;"><span>Manually add the directory to your $HOME/.bash_profile <span style="color:#f92672">(</span>or similar<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>  export FLYCTL_INSTALL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/home/vscode/.fly&#34;</span>
</span></span><span style="display:flex;"><span>  export PATH<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span>$FLYCTL_INSTALL<span style="color:#e6db74">/bin:</span>$PATH<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>Run <span style="color:#e6db74">&#39;/home/vscode/.fly/bin/flyctl --help&#39;</span> to get started
</span></span></code></pre></div><h2 id="flyioにログイン">fly.ioにログイン</h2>
<p>事前にfly.ioでサインアップをしておく必要がある。</p>
<blockquote>
<p>[!NOTE]<br>
更に、これを試したとき（2023/12/03時点）では、無料利用においてもクレジットカード登録が必要な様子。</p>
</blockquote>
<p>この上で、flyコマンドからログインを行う。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; fly auth login
</span></span><span style="display:flex;"><span>failed opening browser. Copy the url <span style="color:#f92672">(</span>https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX<span style="color:#f92672">)</span> into a browser and <span style="color:#66d9ef">continue</span>
</span></span><span style="display:flex;"><span>Opening https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Waiting <span style="color:#66d9ef">for</span> session...⣾
</span></span></code></pre></div><p>上記状況になった後、表示されたURLからブラウザでログインを行うと、コマンドのログインも完了する。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; fly auth login
</span></span><span style="display:flex;"><span>failed opening browser. Copy the url <span style="color:#f92672">(</span>https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX<span style="color:#f92672">)</span> into a browser and <span style="color:#66d9ef">continue</span>
</span></span><span style="display:flex;"><span>Opening https://fly.io/app/auth/cli/XXXXXXXXXXXXXXXXXXX ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Waiting <span style="color:#66d9ef">for</span> session... Done
</span></span><span style="display:flex;"><span>successfully logged in as <span style="color:#f92672">{{</span>login user<span style="color:#f92672">}}</span>
</span></span></code></pre></div><h2 id="アプリケーションの構築">アプリケーションの構築</h2>
<p>まずは、fly.ioの自分の領域にアプリケーションのデプロイを行う場所を作成する。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; flyctl launch
</span></span></code></pre></div><p>以降、対話形式で諸々聞かれるため、必要に応じて設定する。</p>
<p>このやり取りが成功すると、カレントディレクトリに <code>fly.toml</code> が作成される。</p>
<blockquote>
<p>[!NOTE]<br>
この <code>fly.toml</code> が、デプロイを行うためのマニフェストファイルとなる。<br>
ここに指示を記載することで、デプロイ後のセットアップをコントロールすることができる。</p>
</blockquote>
<h2 id="flytomlの編集">fly.tomlの編集</h2>
<p>そのままではJavaはデプロイできないため、fly.tomlを編集する。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#a6e22e">app</span> = <span style="color:#e6db74">&#34;maine-coon&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">primary_region</span> = <span style="color:#e6db74">&#34;nrt&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">build</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">builder</span> = <span style="color:#e6db74">&#34;paketobuildpacks/builder-jammy-base:0.4.252&#34;</span>
</span></span><span style="display:flex;"><span>  [<span style="color:#a6e22e">build</span>.<span style="color:#a6e22e">args</span>]
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">BPE_APPEND_JAVA_TOOL_OPTIONS</span> = <span style="color:#e6db74">&#34;-XX:ReservedCodeCacheSize=30M -Xss256k&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">BPE_BPL_JVM_THREAD_COUNT</span> = <span style="color:#e6db74">&#34;10&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">BPE_DELIM_JAVA_TOOL_OPTIONS</span> = <span style="color:#e6db74">&#34; &#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">BPE_SERVER_TOMCAT_THREADS_MAX</span> = <span style="color:#e6db74">&#34;2&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">BP_JVM_VERSION</span> = <span style="color:#e6db74">&#34;21&#34;</span>
</span></span></code></pre></div><p>今回は、paketo buildpacksを用いて、javaのビルドとイメージ化を行い、ここで作成したイメージを起動することで fly.io 上でアプリケーションを動作させる。</p>
<p>ただし、 fly.io の無料分で利用できるコンテナのリソースは少なく、 256mb のメモリで動作させる必要があるため、調整を入れている。</p>
<h2 id="デプロイ">デプロイ</h2>
<p>準備ができたら、実際にデプロイを行う。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; fly deploy
</span></span></code></pre></div><p>これで、カレントに存在する fly.toml に従ってログインしているアカウントにデプロイが行われる。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>:
</span></span><span style="display:flex;"><span>:
</span></span><span style="display:flex;"><span>-------
</span></span><span style="display:flex;"><span>Updating existing machines in <span style="color:#e6db74">&#39;maine-coon&#39;</span> with rolling strategy
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>-------
</span></span><span style="display:flex;"><span> ✔ <span style="color:#f92672">[</span>1/2<span style="color:#f92672">]</span> Machine 32874dddae6348 <span style="color:#f92672">[</span>app<span style="color:#f92672">]</span> update succeeded
</span></span><span style="display:flex;"><span> ✔ <span style="color:#f92672">[</span>2/2<span style="color:#f92672">]</span> Machine 9185991c207383 <span style="color:#f92672">[</span>app<span style="color:#f92672">]</span> update succeeded
</span></span><span style="display:flex;"><span>-------
</span></span></code></pre></div><p>正常に起動が行われた場合、デフォルトで2コンテナが起動し、自動で割り当てられたURLでルーティングが行われる。</p>
<h2 id="この先">この先</h2>
<p>これで、とりあえず動作することはできるようになったが、ソースの編集をしたあとにデプロイするまでのコマンドを打つのが面倒なため、CIを用意してデプロイを行った。</p>
<p>こちらについても別途記載をしたい。</p>
]]></content>
		</item>
		
		<item>
			<title>spring boot log4j2のログローテーション</title>
			<link>https://pages.shibadog.net/posts/016_log4j2_rotate/</link>
			<pubDate>Fri, 23 Jun 2023 20:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/016_log4j2_rotate/</guid>
			<description>目次
まとめ なんでこんなこと ということで、サンプル こまけぇことはいいから、どうなったん？ ちなみに 参考資料 まとめ log4j2ならば、柔軟なローテション設定ができる 起動時にすでにある場合のローテーション ログ出力サイズによるログローテーション（今回はこれ） 時間によるログローテーション などなど log4j2ならば、ロールオーバーも簡単設定 保持期限によるロールオーバー(今回はこれ) なんでこんなこと オンプレミスでのアプリケーションではログはローカルのディスクに書き込むことになる。（多分それ以外の方法もいっぱいあるんだろうけど、おそらく一番ベターでしょ）
この場合、バッチやら、logrotateでいい感じにローテートしたり、自動削除などを行うのが割と古くからされてる方法ではあると思うが、最新のログライブラリではその辺カバーすることが出来ると思いお試しをしてみた。
ということで、サンプル サンプルアプリケーションとしては、spring bootの現時点（2023/06/25）での最新である、 3.1.1 を利用して、標準であるlogbackからlog4j2に変更した状態とした。
処理内容は、一定間隔でログを出し続けるコマンドラインアプリケーション。（つまり、何にもしないし、Webでさえない）
ソースはここ
こまけぇことはいいから、どうなったん？ 今回目指したのは、ログを容量によってローテーションして、一定期間でロールオーバーする状況。
つまり、ログを別の機構で バックアップ or ログ基盤への転送 をする想定で、一定容量のみローカルには保持するような状態とした。
（バックアップさえできれば無運用）
手元で試すため、時間や容量は小さい状態で試している。
ちゃんと、一定のログ容量でローテーション＆ロールオーバーがなされていることを確認した。
以下log4j2のconfig。
&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt; &amp;lt;Configuration strict=&amp;#34;true&amp;#34; xmlns=&amp;#34;http://logging.apache.org/log4j/2.0/config&amp;#34; xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34; xsi:schemaLocation=&amp;#34;http://logging.apache.org/log4j/2.0/config https://raw.githubusercontent.com/apache/logging-log4j2/main/log4j-core/src/main/resources/Log4j-config.xsd&amp;#34;&amp;gt; &amp;lt;Properties&amp;gt; &amp;lt;Property name=&amp;#34;baseDir&amp;#34;&amp;gt;logs&amp;lt;/Property&amp;gt; &amp;lt;/Properties&amp;gt; &amp;lt;Appenders&amp;gt; &amp;lt;Console name=&amp;#34;Console&amp;#34; target=&amp;#34;SYSTEM_OUT&amp;#34;&amp;gt; &amp;lt;PatternLayout pattern=&amp;#34;%d{yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss.SSSZ} %highlight{%-5level}[%style{$${spring:spring.application.name},%X{traceId},%X{spanId},%X{sampled}}{blue}][%style{%t}{bright,blue}] %style{%C}{bright,yellow}: %m%n&amp;#34;/&amp;gt; &amp;lt;/Console&amp;gt; &amp;lt;RollingFile name=&amp;#34;ApplicationLog&amp;#34; fileName=&amp;#34;${baseDir}/app.log&amp;#34; filePattern=&amp;#34;${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd-hhmmss}.log.gz&amp;#34;&amp;gt; &amp;lt;PatternLayout pattern=&amp;#34;%d{yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss.SSSZ} %-5level[$${spring:spring.application.name},%X{traceId},%X{spanId},%X{sampled}][%t] %C: %m%n&amp;#34;/&amp;gt; &amp;lt;Policies&amp;gt;&amp;lt;!-- Policiesは必須。 ローテーションポリシー --&amp;gt; &amp;lt;OnStartupTriggeringPolicy /&amp;gt; &amp;lt;!</description>
			<content type="html"><![CDATA[<p>目次</p>
<ul>
<li><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></li>
<li><a href="#%E3%81%AA%E3%82%93%E3%81%A7%E3%81%93%E3%82%93%E3%81%AA%E3%81%93%E3%81%A8">なんでこんなこと</a></li>
<li><a href="#%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%A7%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">ということで、サンプル</a></li>
<li><a href="#%E3%81%93%E3%81%BE%E3%81%91%E3%81%87%E3%81%93%E3%81%A8%E3%81%AF%E3%81%84%E3%81%84%E3%81%8B%E3%82%89%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%93">こまけぇことはいいから、どうなったん？</a></li>
<li><a href="#%E3%81%A1%E3%81%AA%E3%81%BF%E3%81%AB">ちなみに</a></li>
<li><a href="#%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99">参考資料</a></li>
</ul>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>log4j2ならば、柔軟なローテション設定ができる
<ul>
<li>起動時にすでにある場合のローテーション</li>
<li>ログ出力サイズによるログローテーション（今回はこれ）</li>
<li>時間によるログローテーション</li>
<li>などなど</li>
</ul>
</li>
<li>log4j2ならば、ロールオーバーも簡単設定
<ul>
<li>保持期限によるロールオーバー(今回はこれ)</li>
</ul>
</li>
</ul>
<h2 id="なんでこんなこと">なんでこんなこと</h2>
<p>オンプレミスでのアプリケーションではログはローカルのディスクに書き込むことになる。（多分それ以外の方法もいっぱいあるんだろうけど、おそらく一番ベターでしょ）<br>
この場合、バッチやら、logrotateでいい感じにローテートしたり、自動削除などを行うのが割と古くからされてる方法ではあると思うが、最新のログライブラリではその辺カバーすることが出来ると思いお試しをしてみた。</p>
<h2 id="ということでサンプル">ということで、サンプル</h2>
<p>サンプルアプリケーションとしては、spring bootの現時点（2023/06/25）での最新である、 3.1.1 を利用して、標準であるlogbackからlog4j2に変更した状態とした。</p>
<p>処理内容は、一定間隔でログを出し続けるコマンドラインアプリケーション。（つまり、何にもしないし、Webでさえない）</p>
<p>ソースは<a href="https://github.com/shibadog/sample-log4j2-logrotate">ここ</a></p>
<h2 id="こまけぇことはいいからどうなったん">こまけぇことはいいから、どうなったん？</h2>
<p>今回目指したのは、ログを容量によってローテーションして、一定期間でロールオーバーする状況。</p>
<p>つまり、ログを別の機構で <code>バックアップ or ログ基盤への転送</code> をする想定で、一定容量のみローカルには保持するような状態とした。<br>
（バックアップさえできれば無運用）</p>
<p>手元で試すため、時間や容量は小さい状態で試している。</p>
<p><img src="./result.gif" alt="結果"></p>
<p>ちゃんと、一定のログ容量でローテーション＆ロールオーバーがなされていることを確認した。</p>
<p>以下log4j2のconfig。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#75715e">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;Configuration</span> <span style="color:#a6e22e">strict=</span><span style="color:#e6db74">&#34;true&#34;</span>
</span></span><span style="display:flex;"><span>           <span style="color:#a6e22e">xmlns=</span><span style="color:#e6db74">&#34;http://logging.apache.org/log4j/2.0/config&#34;</span>
</span></span><span style="display:flex;"><span>           <span style="color:#a6e22e">xmlns:xsi=</span><span style="color:#e6db74">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
</span></span><span style="display:flex;"><span>           <span style="color:#a6e22e">xsi:schemaLocation=</span><span style="color:#e6db74">&#34;http://logging.apache.org/log4j/2.0/config 
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">           https://raw.githubusercontent.com/apache/logging-log4j2/main/log4j-core/src/main/resources/Log4j-config.xsd&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;Properties&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;Property</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;baseDir&#34;</span><span style="color:#f92672">&gt;</span>logs<span style="color:#f92672">&lt;/Property&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/Properties&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;Appenders&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;Console</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;Console&#34;</span> <span style="color:#a6e22e">target=</span><span style="color:#e6db74">&#34;SYSTEM_OUT&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;PatternLayout</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">pattern=</span><span style="color:#e6db74">&#34;%d{yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ} %highlight{%-5level}[%style{$${spring:spring.application.name},%X{traceId},%X{spanId},%X{sampled}}{blue}][%style{%t}{bright,blue}] %style{%C}{bright,yellow}: %m%n&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;/Console&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;RollingFile</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;ApplicationLog&#34;</span> <span style="color:#a6e22e">fileName=</span><span style="color:#e6db74">&#34;${baseDir}/app.log&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">filePattern=</span><span style="color:#e6db74">&#34;${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd-hhmmss}.log.gz&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;PatternLayout</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">pattern=</span><span style="color:#e6db74">&#34;%d{yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ} %-5level[$${spring:spring.application.name},%X{traceId},%X{spanId},%X{sampled}][%t] %C: %m%n&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;Policies&gt;</span><span style="color:#75715e">&lt;!-- Policiesは必須。 ローテーションポリシー --&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">&lt;OnStartupTriggeringPolicy</span> <span style="color:#f92672">/&gt;</span> <span style="color:#75715e">&lt;!-- 起動時にすでにログがあったら退避する --&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">&lt;SizeBasedTriggeringPolicy</span> <span style="color:#a6e22e">size=</span><span style="color:#e6db74">&#34;1 KB&#34;</span> <span style="color:#f92672">/&gt;</span> <span style="color:#75715e">&lt;!-- 指定容量に達した場合にローテーションする --&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;/Policies&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">&lt;!-- &lt;DefaultRolloverStrategy max=&#34;20&#34;/&gt; シンプルに最大保持数で指定することも可能。--&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;DefaultRolloverStrategy&gt;</span><span style="color:#75715e">&lt;!-- 削除条件 --&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">&lt;Delete</span> <span style="color:#a6e22e">basePath=</span><span style="color:#e6db74">&#34;${baseDir}&#34;</span> <span style="color:#a6e22e">maxDepth=</span><span style="color:#e6db74">&#34;2&#34;</span><span style="color:#f92672">&gt;</span> <span style="color:#75715e">&lt;!-- maxDepthはbasePath配下のフォルダをどこまでたどるかの深度 --&gt;</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#f92672">&lt;IfFileName</span> <span style="color:#a6e22e">glob=</span><span style="color:#e6db74">&#34;*/app-*.log.gz&#34;</span> <span style="color:#f92672">/&gt;</span> <span style="color:#75715e">&lt;!-- 削除対象のファイル名フォーマット定義。正規表現でも指定可能 --&gt;</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#f92672">&lt;IFLastModified</span> <span style="color:#a6e22e">age=</span><span style="color:#e6db74">&#34;P1M&#34;</span> <span style="color:#f92672">/&gt;</span> <span style="color:#75715e">&lt;!-- この時間を過ぎたら削除する。形式はISO 8601 --&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">&lt;/Delete&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;/DefaultRolloverStrategy&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;/RollingFile&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/Appenders&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;Loggers&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;Root</span> <span style="color:#a6e22e">level=</span><span style="color:#e6db74">&#34;info&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;AppenderRef</span> <span style="color:#a6e22e">ref=</span><span style="color:#e6db74">&#34;Console&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&lt;AppenderRef</span> <span style="color:#a6e22e">ref=</span><span style="color:#e6db74">&#34;ApplicationLog&#34;</span> <span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;/Root&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/Loggers&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/Configuration&gt;</span>
</span></span></code></pre></div><h2 id="ちなみに">ちなみに</h2>
<p>ログロールオーバーの方の時間設定に関しては、 ISO 8601 を利用して設定するらしい。</p>
<p>ちょっと特殊なので気を付けたし。（頭にPがついているのはそういうものらしい。あとは、まぁ、ね）</p>
<h2 id="参考資料">参考資料</h2>
<ul>
<li><a href="https://qiita.com/ss_koishi/items/407679d74e56ed800a37">log4j2でログローテートがしたかっただけなんだ - Qiita</a></li>
<li><a href="https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender">RollingFileAppender - Log4j – Log4j 2 Appenders</a></li>
<li><a href="https://logging.apache.org/log4j/2.x/manual/appenders.html#log-archive-retention-policy-delete-on-rollover">Log Archive Retention Policy: Delete on Rollover - Log4j – Log4j 2 Appenders</a></li>
<li><a href="https://qiita.com/kazokmr/items/7d8323cd2033b233c261">Spring Boot でロギングライブラリをLog4j2にする - Qiita</a></li>
<li><a href="https://en.wikipedia.org/wiki/ISO_8601#Durations">ISO 8601 Durations - Wikipedia</a></li>
</ul>
]]></content>
		</item>
		
		<item>
			<title>spring boot 3 trace</title>
			<link>https://pages.shibadog.net/posts/008_survery_results/</link>
			<pubDate>Wed, 17 May 2023 00:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/008_survery_results/</guid>
			<description>背景 spring boot3になってからtraceの構成が変わった。
sleuth から micrometer observationを使う用に代わり、opentelemetryが入ってきて関係性が変わったのでそれを把握したい。
micrometer observationの解説は優秀なブログがすでにあるのでそちらに任せることにする。
https://programacho.com/blog/a10b96ec9d79/
ここでは、このmicrometerの裏側を把握することを目的とする。
全体感から見た各種ライブラリの役割 ▲ なにかのdiagramのルールにのっとって書いているわけではなく、雰囲気で矢印と図形の形を変えている。
意味はあるが公のルールではないのでご注意。
tracer layerの詳細 この領域はトレーサー層と呼ぶらしい。
ここは、exporter（braveではreporter）を使って実際のトレース情報を伝送する部分の実装であったり、アプリケーション間のトレース情報をつなぐための処理を行う実装が存在する。
braveはもともとのspring cloudに存在する実装であり、zipkinのb3ヘッダのみに対応している。
opentelemetryでは、opentelemetryが定義する伝送プロトコル（なんだっけ？）とb3のどちらにも対応しており、ここをpropagatorと呼んでおり差し替え可能となっている。
w3c → W3CTraceContextPropagator b3 → B3Propagator opentelemetryを使った場合のexporter layer詳細 Opentelemetryに対応したトレース参照用のツールはいくつか存在する。
これ以外にも、上記zipkinの例から以下のような構造になっていることが伺える。
参考資料のmakingさんの資料にある通り、spring boot 3.0.Xまでは、exporterのauto configに対応している（つまり何もBean登録しなくても設定だけで使えるやつ）のはzipkinとwavefrontのみとなっている。
しかし、opentelemetry自体はいろいろなexporterに対応しており、自力でBean登録をすることで異なるサービスにtraceを伝送することが可能になっている。
braveを使った場合のexporter layer(reporter)詳細 tracerをopentelemetryではなく従来のbraveを選択することも可能となっている。
この場合でも伝送先を切り替えることが可能となっている。
Opentelemetryに対応しているElastic APMに入れてみる 本リポジトリでは、前章でまとめた依存のうち以下のような組み合わせでアプリケーションを作成している。
tracer layer -&amp;gt; opentelemetry exporter layer -&amp;gt; opentelemetry tracerの記録先は Elastic APMを利用している。
詳しくは ../../pom.xml を参照いただきたいが、traceにかかわる依存は以下の通り。
&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.micrometer&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;micrometer-tracing-bridge-otel&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.opentelemetry&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;opentelemetry-exporter-otlp&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; spring bootに関しては、3.0.x系であるため、そのままではopentelemetry exporterのauto configに対応していない。</description>
			<content type="html"><![CDATA[<h2 id="背景">背景</h2>
<p>spring boot3になってからtraceの構成が変わった。</p>
<p>sleuth から micrometer observationを使う用に代わり、opentelemetryが入ってきて関係性が変わったのでそれを把握したい。</p>
<p>micrometer observationの解説は優秀なブログがすでにあるのでそちらに任せることにする。</p>
<p><a href="https://programacho.com/blog/a10b96ec9d79/">https://programacho.com/blog/a10b96ec9d79/</a></p>
<p>ここでは、このmicrometerの裏側を把握することを目的とする。</p>
<h2 id="全体感から見た各種ライブラリの役割">全体感から見た各種ライブラリの役割</h2>
<p>▲ なにかのdiagramのルールにのっとって書いているわけではなく、雰囲気で矢印と図形の形を変えている。<br>
意味はあるが公のルールではないのでご注意。</p>
<p><img src="./dependency-overview.drawio.svg" alt="依存の関係性概要"></p>
<h3 id="tracer-layerの詳細">tracer layerの詳細</h3>
<p>この領域はトレーサー層と呼ぶらしい。<br>
ここは、exporter（braveではreporter）を使って実際のトレース情報を伝送する部分の実装であったり、アプリケーション間のトレース情報をつなぐための処理を行う実装が存在する。</p>
<p>braveはもともとのspring cloudに存在する実装であり、zipkinのb3ヘッダのみに対応している。</p>
<p>opentelemetryでは、opentelemetryが定義する伝送プロトコル（なんだっけ？）とb3のどちらにも対応しており、ここをpropagatorと呼んでおり差し替え可能となっている。</p>
<ul>
<li>w3c → W3CTraceContextPropagator</li>
<li>b3 → B3Propagator</li>
</ul>
<p><img src="./tracer-layer-dependency.drawio.svg" alt="tracer layer"></p>
<h3 id="opentelemetryを使った場合のexporter-layer詳細">opentelemetryを使った場合のexporter layer詳細</h3>
<p>Opentelemetryに対応したトレース参照用のツールはいくつか存在する。</p>
<p>これ以外にも、上記zipkinの例から以下のような構造になっていることが伺える。</p>
<p><img src="./expoter-layer-dependency.drawio.svg" alt="exporter layer"></p>
<p>参考資料のmakingさんの資料にある通り、spring boot 3.0.Xまでは、exporterのauto configに対応している（つまり何もBean登録しなくても設定だけで使えるやつ）のはzipkinとwavefrontのみとなっている。</p>
<p>しかし、opentelemetry自体はいろいろなexporterに対応しており、自力でBean登録をすることで異なるサービスにtraceを伝送することが可能になっている。</p>
<h3 id="braveを使った場合のexporter-layerreporter詳細">braveを使った場合のexporter layer(reporter)詳細</h3>
<p>tracerをopentelemetryではなく従来のbraveを選択することも可能となっている。<br>
この場合でも伝送先を切り替えることが可能となっている。</p>
<p><img src="./reporter-layer-dependency.drawio.svg" alt="reporter layer"></p>
<h2 id="opentelemetryに対応しているelastic-apmに入れてみる">Opentelemetryに対応しているElastic APMに入れてみる</h2>
<p>本リポジトリでは、前章でまとめた依存のうち以下のような組み合わせでアプリケーションを作成している。</p>
<ul>
<li>tracer layer -&gt; opentelemetry</li>
<li>exporter layer -&gt; opentelemetry</li>
</ul>
<p>tracerの記録先は Elastic APMを利用している。</p>
<p>詳しくは <code>../../pom.xml</code> を参照いただきたいが、traceにかかわる依存は以下の通り。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&lt;dependency&gt;</span>
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&lt;groupId&gt;</span>io.micrometer<span style="color:#f92672">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&lt;artifactId&gt;</span>micrometer-tracing-bridge-otel<span style="color:#f92672">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&lt;/dependency&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&lt;dependency&gt;</span>
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&lt;groupId&gt;</span>io.opentelemetry<span style="color:#f92672">&lt;/groupId&gt;</span>
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&lt;artifactId&gt;</span>opentelemetry-exporter-otlp<span style="color:#f92672">&lt;/artifactId&gt;</span>
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&lt;/dependency&gt;</span>
</span></span></code></pre></div><p>spring bootに関しては、3.0.x系であるため、そのままではopentelemetry exporterのauto configに対応していない。</p>
<p>このため、自分でBean登録を行った。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>    <span style="color:#a6e22e">@Bean</span>
</span></span><span style="display:flex;"><span>    SpanExporter <span style="color:#a6e22e">otlpHttpSpanExporter</span><span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> OtlpHttpSpanExporter<span style="color:#f92672">.</span><span style="color:#a6e22e">builder</span><span style="color:#f92672">()</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">.</span><span style="color:#a6e22e">setEndpoint</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;http://localhost:8200/v1/traces&#34;</span><span style="color:#f92672">)</span> <span style="color:#75715e">// &lt;- elastic apm のエンドポイント
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>                <span style="color:#f92672">.</span><span style="color:#a6e22e">build</span><span style="color:#f92672">();</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="参考資料">参考資料</h2>
<h3 id="traceについての公式ドキュメントの記述">Traceについての公式ドキュメントの記述</h3>
<p><a href="https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#actuator.micrometer-tracing">https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#actuator.micrometer-tracing</a></p>
<h3 id="makingさんの最強資料">makingさんの最強資料</h3>
<p><a href="https://bit.ly/springboot2023">https://bit.ly/springboot2023</a></p>
]]></content>
		</item>
		
		<item>
			<title>CentOSの事情</title>
			<link>https://pages.shibadog.net/posts/009_centos/</link>
			<pubDate>Fri, 03 Mar 2023 00:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/009_centos/</guid>
			<description>背景 業務で利用するLinux Serverを新規で作成することになった。
既存のLinux Serverの横に追加することになっているため、追加するサーバのOSも併せようと考えたが、現在CentOSはバージョンアップ方針が変わっており、そのまま採用すべきではないのではないか、となった。
適切なOSを選定するとともに、CentOSの事情を把握しておきたいため、調査する。
CentOSの事情 元々の流れ CentOSは Red Hat Enterprise Linux（以降RHEL）というディストリビューションの系列に属しており、RHELと機能的に互換性があることを目指したフリーのLinuxディストリビューションである。
RHELに含まれているソフトウェアの中にはOSSで無償公開しているため、これをもとに、商標や商用パッケージをのぞいたものをリビルドして提供している。そのため、「RHELクローン」と呼ばれることもある。(CentOS自体は公式には否定している)
最初期ではRHELを提供するレッドハットは関わっていなかったが、2014年からCentOSを正式に支援していくことを表明していた。
しかし、2020/12/8にCentOSからCentOS Streamに開発の主軸を移動し、CentOS Linux 8のサポートを2021年に停止している。RHEL 9に対応するCentOS Linux 9は提供さず、今後はCentOS Stream 9の提供とする。
Red Hat Enterprise Linux派生ディストリビューション Red Hat Enterprise Linux派生ディストリビューション
RHELには様々なディストリビューションが存在する。大きくは、まず同社がメンテナを行っているFedora Linuxがある。これは、もともとはRHELの無償版であった。
しかし、Fedoraはサポート期間が比較的短く、実験的なリリース方針であったため、長期サポートを望むユーザとしては利用に適していなかった。
RHELはコンパイル済みのものを無償提供していないが、完全なソースコードを公開しているため、これを入手し再コンパイルすることで派生ディストリビューションの作成が行われている。
CentOSのサポート情報 CentOS
Version 完全更新期限 メンテナス更新期限 6 6.10(最終) 2017年 Q2 2020/11/30 7 7.9-2009(最新) 2020年 Q4 2024/06/30 8 8.5.2111(最終) 2021年12月 2021/12/31 CentOS Stream CentOS StreamはRHELとFedora Linuxの中間を目指したディストリビューション。
Fedoraは実験的なリリースを取り込み、RHELの将来のメジャーリリースのベースとなるアップストリームプロジェクトであったが、CentOS StreamはRHELの次のバージョンとなる変更を取り入れたRHELのプレビューとなる。
このような性質の変更があったため、重要なビジネスアプリケーションやプロダクション環境での使用は推奨されておらずRHELが進められる。
元々のCentOSの性質としては、他のRHELと同様にコードのリビルドから生成されたものであり、個別メンテナンスであったため、今回の変更で性質ががらりと変わる。
やはり商用利用を考えた場合、（本質的にはRHELを使え、なのだが）あまり利用は推奨されるべきものではなくなるという見解があちらこちらで見られた。
派生ディストリビューションについて CentOSの事情を鑑み（結局ただ乗りになるのだが。。。）、同じ要件をかなえるためのディストリビューションが多数生まれている。
もし、無償版を利用するならばこの中から選定すべきだと考えられる。
Rocky Linux Rocky Linux</description>
			<content type="html"><![CDATA[<h2 id="背景">背景</h2>
<p>業務で利用するLinux Serverを新規で作成することになった。<br>
既存のLinux Serverの横に追加することになっているため、追加するサーバのOSも併せようと考えたが、現在CentOSはバージョンアップ方針が変わっており、そのまま採用すべきではないのではないか、となった。</p>
<p>適切なOSを選定するとともに、CentOSの事情を把握しておきたいため、調査する。</p>
<h2 id="centosの事情">CentOSの事情</h2>
<h3 id="元々の流れ">元々の流れ</h3>
<p>CentOSは Red Hat Enterprise Linux（以降RHEL）というディストリビューションの系列に属しており、RHELと機能的に互換性があることを目指したフリーのLinuxディストリビューションである。</p>
<p>RHELに含まれているソフトウェアの中にはOSSで無償公開しているため、これをもとに、商標や商用パッケージをのぞいたものをリビルドして提供している。そのため、「RHELクローン」と呼ばれることもある。(CentOS自体は公式には否定している)</p>
<p>最初期ではRHELを提供するレッドハットは関わっていなかったが、2014年からCentOSを正式に支援していくことを表明していた。</p>
<p>しかし、2020/12/8にCentOSからCentOS Streamに開発の主軸を移動し、CentOS Linux 8のサポートを2021年に停止している。RHEL 9に対応するCentOS Linux 9は提供さず、今後はCentOS Stream 9の提供とする。</p>
<h4 id="red-hat-enterprise-linux派生ディストリビューション">Red Hat Enterprise Linux派生ディストリビューション</h4>
<p><a href="https://ja.wikipedia.org/wiki/Red_Hat_Enterprise_Linux%E6%B4%BE%E7%94%9F%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">Red Hat Enterprise Linux派生ディストリビューション</a></p>
<p>RHELには様々なディストリビューションが存在する。大きくは、まず同社がメンテナを行っているFedora Linuxがある。これは、もともとはRHELの無償版であった。</p>
<p>しかし、Fedoraはサポート期間が比較的短く、実験的なリリース方針であったため、長期サポートを望むユーザとしては利用に適していなかった。</p>
<p>RHELはコンパイル済みのものを無償提供していないが、完全なソースコードを公開しているため、これを入手し再コンパイルすることで派生ディストリビューションの作成が行われている。</p>
<h4 id="centosのサポート情報">CentOSのサポート情報</h4>
<p><a href="https://ja.wikipedia.org/wiki/CentOS">CentOS</a></p>
<table>
<thead>
<tr>
<th>Version</th>
<th></th>
<th>完全更新期限</th>
<th>メンテナス更新期限</th>
</tr>
</thead>
<tbody>
<tr>
<td>6</td>
<td>6.10(最終)</td>
<td>2017年 Q2</td>
<td>2020/11/30</td>
</tr>
<tr>
<td>7</td>
<td>7.9-2009(最新)</td>
<td>2020年 Q4</td>
<td>2024/06/30</td>
</tr>
<tr>
<td>8</td>
<td>8.5.2111(最終)</td>
<td>2021年12月</td>
<td>2021/12/31</td>
</tr>
</tbody>
</table>
<h4 id="centos-stream">CentOS Stream</h4>
<p>CentOS StreamはRHELとFedora Linuxの中間を目指したディストリビューション。</p>
<p>Fedoraは実験的なリリースを取り込み、RHELの将来のメジャーリリースのベースとなるアップストリームプロジェクトであったが、CentOS StreamはRHELの次のバージョンとなる変更を取り入れたRHELのプレビューとなる。</p>
<p>このような性質の変更があったため、重要なビジネスアプリケーションやプロダクション環境での使用は推奨されておらずRHELが進められる。</p>
<p><img src="./image.drawio.png" alt="image"></p>
<p>元々のCentOSの性質としては、他のRHELと同様にコードのリビルドから生成されたものであり、個別メンテナンスであったため、今回の変更で性質ががらりと変わる。</p>
<p>やはり商用利用を考えた場合、（本質的にはRHELを使え、なのだが）あまり利用は推奨されるべきものではなくなるという見解があちらこちらで見られた。</p>
<h2 id="派生ディストリビューションについて">派生ディストリビューションについて</h2>
<p>CentOSの事情を鑑み（結局ただ乗りになるのだが。。。）、同じ要件をかなえるためのディストリビューションが多数生まれている。</p>
<p>もし、無償版を利用するならばこの中から選定すべきだと考えられる。</p>
<h3 id="rocky-linux">Rocky Linux</h3>
<p><a href="https://ja.wikipedia.org/wiki/Rocky_Linux">Rocky Linux</a><br>
<a href="https://rockylinux.org/ja/">Rocky Linux</a></p>
<p>RHELのソースコードを利用した、完全バイナリ互換性のあるリリースであることを意図しており、コミュニティがサポートする、商業品質の企業向けOSを提供することを目的としている。</p>
<p>背景として、CentOS Streamが発表された後、CentOSの初代創設者である Gregory Kurtzer氏が、元のCentOSの目的を達成するために立ち上げたプロジェクトである。</p>
<p>パートナー企業としては、ArmやVMWare、AWS、Google Cloudなども参加しており、従来のCentOSと同等のもののとなっている様子。</p>
<h3 id="almalinux">AlmaLinux</h3>
<p><a href="https://ja.wikipedia.org/wiki/AlmaLinux">AlmaLinux</a><br>
<a href="https://almalinux.org/ja/">AlmaLinux OS - Forever-Free Enterprise-Grade Operating System</a></p>
<p>Rocky Linuxと同様の動機と目的をもって開発されているディストリビューション。</p>
<p>しかし、こちらは、CloudLinux OSというRHELベースの商用Linuxディストリビューションを開発しているCloudLinuxが作成している。</p>
<p>また、このCloudLinuxは、別途AlmaLinux Open Source Foundationという非営利組織を設立し、AlmaLinuxの管理はこの組織に引き継いだ。</p>
<h3 id="oracle-linux">Oracle Linux</h3>
<p><a href="https://ja.wikipedia.org/wiki/Oracle_Linux">Oracle Linux</a><br>
<a href="https://www.oracle.com/jp/linux/">Oracle Linux</a></p>
<p>Oracle社によりRHELの商標やロゴの差し替えを行い、再構築したディストリビューション。</p>
<p>Oracleへのユーザ登録を行うことで無料で利用することが可能。</p>
<p>厳密には、RHELだけではなく、別のLinuxカーネルを含めたディストリビューションであり、Oracleにより一部強化されているため、完全互換ではないとレッドハットが公表している。</p>
<p>しかし、AWSでも選択できるほか、Oracleが提供するOracle Cloudでは標準OSとして利用されるなど実績を持つ。</p>
]]></content>
		</item>
		
		<item>
			<title>【vscode】devcontainer最高やぞ、という話</title>
			<link>https://pages.shibadog.net/posts/015_vscode_devcontainer01/</link>
			<pubDate>Tue, 27 Dec 2022 00:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/015_vscode_devcontainer01/</guid>
			<description>目次
なんぞ？ 何がいいねん 使い方 ベースイメージ featureについて 拡張機能も宣言しよう 事前処理を記述する オリジナルfeatureの作成 テンプレートからの新規リポジトリ 開発環境構築 テストを試す GitHub Action 実際に組み込んでみる なんぞ？ Microsoft製のOSSエディタであるvscodeに追加された便利機能について。
端的に言うと、コンテナ環境に開発環境を構築し、直接vscodeで開くことで開発専用のsandbox内で開発ができるという代物。
決まり事である、 .devcontainer というフォルダや json の定義に開発環境の状態を記述することで、どの端末でも同一の環境をコンテナ上に作成し開発を行うことができる。
各開発者の環境固有の設定などを排除することで環境差異を極力減らす事を目的としている。
こっからポエム
各個人の開発環境に対してこだわりを持っていくことはどの開発者でもわかると思う。しかし、開発環境の多機能化が進んでしまったことで開発用IDEの設定というものはかなり煩雑になってきている。いろいろな端末で自身のIDEの設定を同期させる拡張機能などは存在するもの、用途によって必要となる拡張機能は様々となる。必要な時に必要な拡張機能やツールを使うことでシンプルに環境を保つことは困難になる一方で、これを解決するため、各リポジトリ事に開発環境を持つ思想が生まれるのは必然ではないか。もはや、自身の環境は常に空っぽで、リポジトリ事に開発環境・ツールを整備すればすべてがシンプルになるのではないか？！と思った次第で、とても感銘を受けているからこれを書き始めた（オタク特有の早口）。
何がいいねん 上で書いてしまっているが、開発者が持つ個人端末固有の設定に依存せず、常に同一の環境で開発を行事ができるため、ハマりずらくなる。
また、クラウド上に開発環境を作成し、ブラウザで開発を行うスタイルの開発環境では、クラウドに作成する開発環境についても同様の設定で動作させることができる（と思う。試してない）。
使い方 以下のようにワークスペース中に devcontainer.json を用意する。
/root/ |-- .devcontainer/ | `-- devcontainer.json |-- src | |-- main | : : ルートまたは、 .devcontainer フォルダ配下に用意することで、vscodeを開いた際に通知にdevcontaerで開きなおすかどうかが聞かれる。
または、このルートフォルダで、 devcontainer open . とコマンドを打つことで直接vscodeで開くことができる。
この devcontainer コマンドは、vscode上のコマンドでインストールすることが可能。
これらは、拡張機能のDev Containersを入れることで有効になる。
ベースイメージ 拡張機能が入っていれば、vscode上で devcontainer.json を生成することも可能。
そちらから作成すれば、ベースイメージは選択式で選ぶこともできる。
このベースイメージは、多種多様のものがあり、シンプルな Ubuntu や、 Alpine から、RubyやJavaなど開発対象の言語に特化したものが存在する。</description>
			<content type="html"><![CDATA[<p>目次</p>
<ul>
<li><a href="#%E3%81%AA%E3%82%93%E3%81%9E">なんぞ？</a></li>
<li><a href="#%E4%BD%95%E3%81%8C%E3%81%84%E3%81%84%E3%81%AD%E3%82%93">何がいいねん</a></li>
<li><a href="#%E4%BD%BF%E3%81%84%E6%96%B9">使い方</a>
<ul>
<li><a href="#%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8">ベースイメージ</a></li>
<li><a href="#feature%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">featureについて</a></li>
<li><a href="#%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%82%82%E5%AE%A3%E8%A8%80%E3%81%97%E3%82%88%E3%81%86">拡張機能も宣言しよう</a></li>
<li><a href="#%E4%BA%8B%E5%89%8D%E5%87%A6%E7%90%86%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B">事前処理を記述する</a></li>
</ul>
</li>
<li><a href="#%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%ABfeature%E3%81%AE%E4%BD%9C%E6%88%90">オリジナルfeatureの作成</a>
<ul>
<li><a href="#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%8B%E3%82%89%E3%81%AE%E6%96%B0%E8%A6%8F%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA">テンプレートからの新規リポジトリ</a></li>
<li><a href="#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">開発環境構築</a></li>
<li><a href="#%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E8%A9%A6%E3%81%99">テストを試す</a></li>
<li><a href="#github-action">GitHub Action</a></li>
<li><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E7%B5%84%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B">実際に組み込んでみる</a></li>
</ul>
</li>
</ul>
<h2 id="なんぞ">なんぞ？</h2>
<p>Microsoft製のOSSエディタであるvscodeに追加された便利機能について。</p>
<p>端的に言うと、コンテナ環境に開発環境を構築し、直接vscodeで開くことで開発専用のsandbox内で開発ができるという代物。</p>
<p>決まり事である、 .devcontainer というフォルダや json の定義に開発環境の状態を記述することで、どの端末でも同一の環境をコンテナ上に作成し開発を行うことができる。</p>
<p>各開発者の環境固有の設定などを排除することで環境差異を極力減らす事を目的としている。</p>
<p>こっからポエム</p>
<p>各個人の開発環境に対してこだわりを持っていくことはどの開発者でもわかると思う。しかし、開発環境の多機能化が進んでしまったことで開発用IDEの設定というものはかなり煩雑になってきている。いろいろな端末で自身のIDEの設定を同期させる拡張機能などは存在するもの、用途によって必要となる拡張機能は様々となる。必要な時に必要な拡張機能やツールを使うことでシンプルに環境を保つことは困難になる一方で、これを解決するため、各リポジトリ事に開発環境を持つ思想が生まれるのは必然ではないか。もはや、自身の環境は常に空っぽで、リポジトリ事に開発環境・ツールを整備すればすべてがシンプルになるのではないか？！と思った次第で、とても感銘を受けているからこれを書き始めた（オタク特有の早口）。</p>
<h2 id="何がいいねん">何がいいねん</h2>
<p>上で書いてしまっているが、開発者が持つ個人端末固有の設定に依存せず、常に同一の環境で開発を行事ができるため、ハマりずらくなる。</p>
<p>また、クラウド上に開発環境を作成し、ブラウザで開発を行うスタイルの開発環境では、クラウドに作成する開発環境についても同様の設定で動作させることができる（と思う。試してない）。</p>
<h2 id="使い方">使い方</h2>
<p>以下のようにワークスペース中に <code>devcontainer.json</code> を用意する。</p>
<pre tabindex="0"><code>/root/
|-- .devcontainer/
|   `-- devcontainer.json
|-- src
|   |-- main
|   :
:
</code></pre><p>ルートまたは、 <code>.devcontainer</code> フォルダ配下に用意することで、vscodeを開いた際に通知にdevcontaerで開きなおすかどうかが聞かれる。</p>
<p>または、このルートフォルダで、 <code>devcontainer open .</code> とコマンドを打つことで直接vscodeで開くことができる。</p>
<p>この <code>devcontainer</code> コマンドは、vscode上のコマンドでインストールすることが可能。</p>
<p><img src="./01_e0ce6d26-d805-4067-8504-3427086f1bed.png" alt=""></p>
<p>これらは、拡張機能のDev Containersを入れることで有効になる。</p>
<p><img src="./02_00619fab-a19c-4008-bc50-f6ed61cc60c1.png" alt=""></p>
<h3 id="ベースイメージ">ベースイメージ</h3>
<p>拡張機能が入っていれば、vscode上で <code>devcontainer.json</code> を生成することも可能。</p>
<p>そちらから作成すれば、ベースイメージは選択式で選ぶこともできる。</p>
<p><img src="./03_e90245dc-20bb-4c1b-b488-65b739056d76.png" alt=""></p>
<p><img src="./04_5c9f3e32-cd61-480b-a76f-63fb0103e66e.png" alt=""></p>
<p>このベースイメージは、多種多様のものがあり、シンプルな Ubuntu や、 Alpine から、RubyやJavaなど開発対象の言語に特化したものが存在する。</p>
<p>また、docker-composeファイルにも対応しており、ベースイメージ＋composeで周辺ミドルウェアの立ち上げまで行うことができる。</p>
<p>（もちろんcomposeで立ち上げるため同一ネットワークに所属させることも可能であるため、ホスト名でアクセスしやすくなる）</p>
<h3 id="featureについて">featureについて</h3>
<p>ベースイメージを選択した後に聞かれるのがfeatureになる。</p>
<p>このfeatureは、ベースイメージの中にインストールするコマンドなどを管理するもの。</p>
<p>Gitコマンドやjq、SDKMANやAnacondaなど開発に利用するコマンド類を最初からセットアップされた状態で使える。</p>
<p><img src="./05_c17cdba0-8292-438e-8443-6e0f2f32c3ed.png" alt=""></p>
<p>これらを選択すると生成される <code>devcontainer.json</code> では、どのベースイメージでfeatureを利用するかを定義することが可能となり、別のPCで同一の開発環境を構築することが可能となる。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;Docker in Docker&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">&#34;image&#34;</span>: <span style="color:#e6db74">&#34;mcr.microsoft.com/devcontainers/base:buster&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">&#34;features&#34;</span>: {
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/devcontainers/features/common-utils:1&#34;</span>: {
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;installZsh&#34;</span>: <span style="color:#e6db74">&#34;false&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;upgradePackages&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;uid&#34;</span>: <span style="color:#e6db74">&#34;1000&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;gid&#34;</span>: <span style="color:#e6db74">&#34;1000&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;installOhMyZsh&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;nonFreePackages&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>
</span></span><span style="display:flex;"><span>		},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/devcontainers/features/docker-from-docker:1&#34;</span>: {
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;latest&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;enableNonRootDocker&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#f92672">&#34;moby&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>
</span></span><span style="display:flex;"><span>		},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/devcontainers/features/docker-in-docker:1&#34;</span>: {},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/devcontainers/features/git:1&#34;</span>: {},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/devcontainers/features/java:1&#34;</span>: {},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/eitsupi/devcontainer-features/jq-likes:0&#34;</span>: {},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/devcontainers/features/terraform:1&#34;</span>: {},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/meaningful-ooo/devcontainer-features/homebrew:2&#34;</span>: {},
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&#34;ghcr.io/shibadog/devcontainer-feature/graphviz:latest&#34;</span>: {}
</span></span><span style="display:flex;"><span>	},
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="拡張機能も宣言しよう">拡張機能も宣言しよう</h3>
<p>devcontainerで開いたvscode上では拡張機能はホスト側から引き継がれたりはしない。<br>
そのため、それぞれインストールの必要があるが、これを <code>devcontainer.json</code> に宣言することができる。<br>
（つまり、最初からインストールされた状態で起動することもできる）</p>
<p>これは、 <code>devcontainer.json</code> を直接編集して追加することもできるが、 <code>devcontainer</code> で起動したvscode上から拡張機能をインストールするタイミングで追加することも可能となっている。</p>
<p><img src="./06_44bbc6ba-c1ca-4721-be6b-6f75a1412c6d.png" alt=""></p>
<p>また、常に入れておきたい拡張機能は、 Dev Containers 拡張機能の設定で定義することができる。</p>
<p><img src="./07_b5b2625f-d9cf-4da2-8078-608b5efb5535.png" alt=""></p>
<h3 id="事前処理を記述する">事前処理を記述する</h3>
<p>だいたいfeatureで必要な事前処理は行うことができるようになっているが、あまり一般的ではない、プロジェクト固有の前処理などがあった場合は、 <code>postCreateCommand</code> で事前処理を行うことが可能である。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">// Use &#39;postCreateCommand&#39; to run commands after the container is created.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#e6db74">&#34;postCreateCommand&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;docker --version&#34;</span><span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">:</span>
</span></span></code></pre></div><p>同じく、 <code>devcontainer.json</code> の中に、 <code>postCreateCommand</code> を用意しておくことで、任意のコマンドを実行することが可能となる。<br>
ここで、事前処理などを行うことが可能となる。</p>
<p>もちろん、コマンドのみならずシェルスクリプトなど実行ができるので <code>.devcontaier</code> フォルダに格納して管理することも可能である。</p>
<h2 id="オリジナルfeatureの作成">オリジナルfeatureの作成</h2>
<p>実はここで出てくる <code>feature</code> というものは簡単に自作することができる。</p>
<p>これが実は真価を発揮する場面であり、今回最大に感動している点。</p>
<p>こちらにテンプレートリポジトリが用意されており、これをもとに作成したリポジトリでオリジナルfeatureを作ることができる。</p>
<p>また、nodeで開発された <code>devcontaer-cli</code> を使うことで、簡単にテストを記述することもでき、このテンプレートリポジトリには <code>devcontainer-cli</code> を用いたテストや Github Package を用いたパッケージ化の Github Action が含まれている。</p>
<p>これを、 <code>devcontainer.json</code> の <code>feature</code> に追加することですぐに利用することができる。</p>
<p>以下で簡単に自作した <code>feature</code> を追加してみる。</p>
<h3 id="テンプレートからの新規リポジトリ">テンプレートからの新規リポジトリ</h3>
<p>featureを作るにあたって、公式からテンプレートリポジトリが提供されている。</p>
<p><a href="https://github.com/devcontainers/feature-starter">GitHub - devcontainers/feature-starter: A  bootstrap repo for self-authoring Dev Container Features</a></p>
<p>これには、Github Actionsによるビルドとリリースのjobが定義されているため、定義追加後にGithub Actionsをそのまま実行することでfeature自体を利用することが可能となっている。</p>
<p>実際に作成したリポジトリは以下の通り。</p>
<p><a href="https://github.com/shibadog/devcontainer-feature">GitHub - shibadog/devcontainer-feature</a></p>
<h3 id="開発環境構築">開発環境構築</h3>
<p>テンプレートリポジトリから作成した場合、すでに devcontainer が用意されているため、vscodeで開くと devcontainer で開くことをを促される。</p>
<p>これにより、devcontainer-cli が利用でき、dockerが利用できるコンテナで開発が行える。</p>
<h3 id="テストを試す">テストを試す</h3>
<p>基本的に devcontaer-cli を利用することでテストなどが簡単に行える。</p>
<h3 id="github-action">GitHub Action</h3>
<h3 id="実際に組み込んでみる">実際に組み込んでみる</h3>
]]></content>
		</item>
		
		<item>
			<title>急にRubyについて学ぶ</title>
			<link>https://pages.shibadog.net/posts/014_ruby/</link>
			<pubDate>Fri, 01 Oct 2021 00:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/014_ruby/</guid>
			<description>まずは Javaとの対比が一番わかりやすいのでいったん対比を書く
# 項目 Java Ruby 備考 1 実行 java ruby ruby {rubyfile} 2 webフレームワーク spring ほか rails ? 3 テストフレームワーク junit minitest test-unit rspec ruby {testfile} 4 ビルドツール maven gradle rake rake {task} タスクの書き方は後述。 直接実行する場合は、グローバルインストールされていないといけない。 プロジェクト個別にインストールしたrakeを使う場合は以下のような感じ bundle exec rake {task} 5 依存解決 bundle bundle install bundle install &amp;ndash;path gems でプロジェクト個別に依存を収集できる 6 静的解析 findBugs ruboCop いろいろ使い方 シンタックス回り 変数 通常は何も書かずに代入で切るっぽい
variable = &amp;#39;だいにゅうできるよ&amp;#39;; puts variable; ローカル変数を作りたければ以下。
@variable = &amp;#39;ローカル変数！&amp;#39;; puts @variable; クラスの中でクラス変数を定義したい場合はアットが二つ</description>
			<content type="html"><![CDATA[<h2 id="まずは">まずは</h2>
<p>Javaとの対比が一番わかりやすいのでいったん対比を書く</p>
<table>
<thead>
<tr>
<th>#</th>
<th>項目</th>
<th>Java</th>
<th>Ruby</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>実行</td>
<td>java</td>
<td>ruby</td>
<td>ruby {rubyfile}</td>
</tr>
<tr>
<td>2</td>
<td>webフレームワーク</td>
<td>spring ほか</td>
<td>rails</td>
<td>?</td>
</tr>
<tr>
<td>3</td>
<td>テストフレームワーク</td>
<td>junit</td>
<td>minitest test-unit rspec</td>
<td>ruby {testfile}</td>
</tr>
<tr>
<td>4</td>
<td>ビルドツール</td>
<td>maven gradle</td>
<td>rake</td>
<td>rake {task} タスクの書き方は後述。 直接実行する場合は、グローバルインストールされていないといけない。 プロジェクト個別にインストールしたrakeを使う場合は以下のような感じ bundle exec rake {task}</td>
</tr>
<tr>
<td>5</td>
<td>依存解決</td>
<td></td>
<td>bundle</td>
<td>bundle install bundle install &ndash;path gems でプロジェクト個別に依存を収集できる</td>
</tr>
<tr>
<td>6</td>
<td>静的解析</td>
<td>findBugs</td>
<td>ruboCop</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="いろいろ使い方">いろいろ使い方</h2>
<h3 id="シンタックス回り">シンタックス回り</h3>
<h4 id="変数">変数</h4>
<p>通常は何も書かずに代入で切るっぽい</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>variable <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;だいにゅうできるよ&#39;</span>;
</span></span><span style="display:flex;"><span>puts variable;
</span></span></code></pre></div><p>ローカル変数を作りたければ以下。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>@variable <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;ローカル変数！&#39;</span>;
</span></span><span style="display:flex;"><span>puts @variable;
</span></span></code></pre></div><p>クラスの中でクラス変数を定義したい場合はアットが二つ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Clazz</span>
</span></span><span style="display:flex;"><span>    @@field <span style="color:#f92672">=</span> <span style="color:#66d9ef">nil</span>;
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">method_dayo</span>
</span></span><span style="display:flex;"><span>        @@field <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;フィールドだよ&#39;</span>;
</span></span><span style="display:flex;"><span>        puts @@field;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span></code></pre></div><p>スクリプトとして使う場合はグローバル変数なんてのもあったね。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>$variable <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;ぐろーばるなかんじ&#39;</span>;
</span></span><span style="display:flex;"><span>puts $variable;
</span></span></code></pre></div><h4 id="ビルド">ビルド</h4>
<p>bundlerだったりrakeだったりminitestだったりとツールがパラパラと存在していて、それぞれ別で実行するのは嫌になる。。。</p>
<p>node周りと同じように、ルートになるツールは何を使うべきか調べてみたけど、どうやらbundlerを使うスタイルが多そう。</p>
<p>（でも、rakeがビルドツールなのだからrakeから全部やりたくなるんだけどできないのか？）</p>
<p><img src="./kousei.drawio.svg" alt="構成"></p>
]]></content>
		</item>
		
		<item>
			<title>spring boot vault</title>
			<link>https://pages.shibadog.net/posts/007_spring-vault/</link>
			<pubDate>Tue, 22 Sep 2020 14:52:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/007_spring-vault/</guid>
			<description>やってみた。
Spring Vault
VaultはHashiCorpのプロダクトで、クレデンシャル情報を保持するミドル。
Vaultはコマンドラインでクレデンシャル情報の設定・取得が可能だが、spring boot vaultを使って、Configurationとしてアプリケーションの設定を連携することができる。
spring cloud configと同様に、 bootstrap.properties でVaultへの接続情報を設定することで、読み込みを行うようだ。
application.yml を作成してそこからの設定値読み込みと同時に使用しても問題なく使えた。 (まぁ当たり前か。)
RabbitだのAWSだのElasticsearchだののクレデンシャル情報に対応していると記載されているところから、 bootstrap.properties で操作することで、対応するミドルウェアのクレデンシャル情報を通常の application.yml に設定するのと同様の状態で設定することができるようだ。
どのへんでうれしさを感じるのだろうか？
環境変数で刺すようにするサービスブローカーとどう違うのか。。。？
よりアプリケーションに近い位置でクレデンシャルを設定できるので、良いような悪いような。
コンテナ運用の場合はコンテナ管理ミドルによって環境変数にさしてほしい気もする。
コンテナ管理ミドルを使わずに、手運用デプロイしているときにうれしいとか？
そんな状況で（クレデンシャル管理が）いる？
（そんなならば application.yml にべた書きしてもよいじゃないか）
K8Sな言葉がちょいちょい出てくるので何か想定する運用があるっぽい気もするけど、調べるの飽きてきたのでそろそろ終わる。</description>
			<content type="html"><![CDATA[<p>やってみた。</p>
<p><a href="https://spring.pleiades.io/guides/gs/vault-config/">Spring Vault</a></p>
<p><a href="https://www.vaultproject.io/">Vault</a>はHashiCorpのプロダクトで、クレデンシャル情報を保持するミドル。</p>
<p>Vaultはコマンドラインでクレデンシャル情報の設定・取得が可能だが、spring boot vaultを使って、Configurationとしてアプリケーションの設定を連携することができる。</p>
<p>spring cloud configと同様に、 <code>bootstrap.properties</code> でVaultへの接続情報を設定することで、読み込みを行うようだ。</p>
<p><code>application.yml</code> を作成してそこからの設定値読み込みと同時に使用しても問題なく使えた。
(まぁ当たり前か。)</p>
<p>RabbitだのAWSだのElasticsearchだののクレデンシャル情報に対応していると記載されているところから、 <code>bootstrap.properties</code> で操作することで、対応するミドルウェアのクレデンシャル情報を通常の <code>application.yml</code> に設定するのと同様の状態で設定することができるようだ。</p>
<hr>
<p>どのへんでうれしさを感じるのだろうか？<br>
環境変数で刺すようにするサービスブローカーとどう違うのか。。。？</p>
<p>よりアプリケーションに近い位置でクレデンシャルを設定できるので、良いような悪いような。</p>
<p>コンテナ運用の場合はコンテナ管理ミドルによって環境変数にさしてほしい気もする。</p>
<p>コンテナ管理ミドルを使わずに、手運用デプロイしているときにうれしいとか？<br>
そんな状況で（クレデンシャル管理が）いる？<br>
（そんなならば <code>application.yml</code> にべた書きしてもよいじゃないか）</p>
<p>K8Sな言葉がちょいちょい出てくるので何か想定する運用があるっぽい気もするけど、調べるの飽きてきたのでそろそろ終わる。</p>
]]></content>
		</item>
		
		<item>
			<title>もやもやボール</title>
			<link>https://pages.shibadog.net/posts/006_moyat-ball-star/</link>
			<pubDate>Sun, 28 Jun 2020 09:45:32 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/006_moyat-ball-star/</guid>
			<description>ユニット折り紙 イライラ、もやもやしたときにいつも作るユニット折り紙を並べて行こうという試み。
今回、いつも使っているユニット折り紙の本以外から情報を得て作ったので、作り方を残しておくというのもある。
完成図 作り方 思ったよりも、Draw.ioで折り紙書くの辛かった（何
折り紙の図面は表裏がわかるように範囲色付けとか、変形させた際に微調整をするために、線同士の結合をしたまま移動させるとかの機能があったほうがいい。。。
つまり、ちゃんとしたお絵かきソフトで作ったほうが断然効率がいいということが分かったorz
でもちょっと面白かった</description>
			<content type="html"><![CDATA[<h2 id="ユニット折り紙">ユニット折り紙</h2>
<p>イライラ、もやもやしたときにいつも作るユニット折り紙を並べて行こうという試み。</p>
<p>今回、いつも使っているユニット折り紙の本以外から情報を得て作ったので、作り方を残しておくというのもある。</p>
<h2 id="完成図">完成図</h2>
<p><img src="./IMG_0103.jpg" alt="完成図"></p>
<h2 id="作り方">作り方</h2>
<p><img src="./001_%E4%BD%9C%E3%82%8A%E6%96%B9.drawio.svg" alt=""></p>
<p><img src="./002_%E4%BD%9C%E3%82%8A%E6%96%B9.drawio.svg" alt=""></p>
<p><img src="./003_%E4%BD%9C%E3%82%8A%E6%96%B9.drawio.svg" alt=""></p>
<p>思ったよりも、Draw.ioで折り紙書くの辛かった（何</p>
<p>折り紙の図面は表裏がわかるように範囲色付けとか、変形させた際に微調整をするために、線同士の結合をしたまま移動させるとかの機能があったほうがいい。。。<br>
つまり、ちゃんとしたお絵かきソフトで作ったほうが断然効率がいいということが分かったorz</p>
<p>でもちょっと面白かった</p>
]]></content>
		</item>
		
		<item>
			<title>Browser Cache</title>
			<link>https://pages.shibadog.net/posts/011_browser_cache/</link>
			<pubDate>Wed, 10 Jun 2020 00:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/011_browser_cache/</guid>
			<description>overview 広義の意味では、動作の高速化を図るため、低速・安価な記憶領域から高速・高価な記憶領域へ一時的に情報を保持することを指す（と思う）。
ブラウザキャッシュは主に、ブラウザの描画に使うリソース（HTML、JS、CSS、画像など）を一定期間ローカルに保持することにより、再度ネットワークアクセスを行った際に高速に表示させる機構を指す（はず）
もちろん、昨今使われる動的ページ（Webシステムによるレスポンス）で生成されるHTMLなどのボディ部分に関しては、キャッシュする意味がないため、使用されない。
しかし、ロゴなどの画像を動的に表示することは特定の状況下以外ではまれであるため、静的コンテンツなどと呼び、キャッシュ対象にする。
また、JavaScriptによる動的描画を中心とした動的ページ（シングルページアプリケーション）は、ユーザ側（⇔サーバ側）であるブラウザによる描画になるため、ソースであるJavaScriptは静的コンテンツ扱いが可能になる。
静的コンテンツを高速化する仕組みとして、一種のキャッシュシステムであるCDNというものもの存在する。
ブラウザキャッシュとは異なるが、いわゆる広義のキャッシュという意味では同じ目的の仕組みになる。
これはこれで話が長そうなので、また別途。 参考:さくらのナレッジ - CDNってそもそも何？なんかサーバの負荷が下がるって聞いたんだけど！〜Web制作/運営の幅が広がるCDNを知ろう第1回〜
Browser Cacheのコントロール HTTPのレスポンスヘッダにより、サーバ側からリソースのキャッシュをコントロールすることができる。 https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control
cache-control というヘッダを用いる。
キャッシュを抑止したい場合は、 cache-control: no-store を用いる。
有効期限の設定 様々な指定の仕方で有効期限を設定することができる。 初めてキャッシュを行う時刻からの有効期限秒数を指定する。
特定の日付で有効期限が切れる形式の場合は、このヘッダではなく専用の Expires ヘッダを用いる。
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Expires
デフォルトの設定 springMVCで作られたwebシステムはもちろん動的サイトであるため、cacheしたくないはずだが、 デフォルトではどのような動きをするか？
ChromeはDevToolを開いて通信をすると、 cache-control: max-age=0 でリクエストを飛ばすっポイ？
これが原因かわからないけれども常にキャッシュされないし、レスポンスヘッダには cache-control は設定されない。
自分で制御 ResponseEntityオブジェクトでキャッシュコントロールを明示することができる。
@GetMapping(&amp;#34;/users/{name}&amp;#34;) public ResponseEntity&amp;lt;UserDto&amp;gt; getUser(@PathVariable String name) { return ResponseEntity.ok() .cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS)) .body(new UserDto(name)); } 動的レスポンスをキャッシュさせたい場合はまぁあれだけど、静的コンテンツをthymeleafでドウコウしたときのキャッシュってどうやって制御するんだろう？</description>
			<content type="html"><![CDATA[<h2 id="overview">overview</h2>
<p>広義の意味では、動作の高速化を図るため、低速・安価な記憶領域から高速・高価な記憶領域へ一時的に情報を保持することを指す（と思う）。</p>
<p>ブラウザキャッシュは主に、ブラウザの描画に使うリソース（HTML、JS、CSS、画像など）を一定期間ローカルに保持することにより、再度ネットワークアクセスを行った際に高速に表示させる機構を指す（はず）</p>
<p>もちろん、昨今使われる動的ページ（Webシステムによるレスポンス）で生成されるHTMLなどのボディ部分に関しては、キャッシュする意味がないため、使用されない。<br>
しかし、ロゴなどの画像を動的に表示することは特定の状況下以外ではまれであるため、静的コンテンツなどと呼び、キャッシュ対象にする。</p>
<p>また、JavaScriptによる動的描画を中心とした動的ページ（シングルページアプリケーション）は、ユーザ側（⇔サーバ側）であるブラウザによる描画になるため、ソースであるJavaScriptは静的コンテンツ扱いが可能になる。</p>
<p>静的コンテンツを高速化する仕組みとして、一種のキャッシュシステムであるCDNというものもの存在する。<br>
ブラウザキャッシュとは異なるが、いわゆる広義のキャッシュという意味では同じ目的の仕組みになる。</p>
<p>これはこれで話が長そうなので、また別途。
参考:<a href="https://knowledge.sakura.ad.jp/19191/">さくらのナレッジ - CDNってそもそも何？なんかサーバの負荷が下がるって聞いたんだけど！〜Web制作/運営の幅が広がるCDNを知ろう第1回〜</a></p>
<h2 id="browser-cacheのコントロール">Browser Cacheのコントロール</h2>
<p>HTTPのレスポンスヘッダにより、サーバ側からリソースのキャッシュをコントロールすることができる。
<a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control">https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control</a></p>
<p><code>cache-control</code> というヘッダを用いる。</p>
<p>キャッシュを抑止したい場合は、 <code>cache-control: no-store</code> を用いる。</p>
<h2 id="有効期限の設定">有効期限の設定</h2>
<p>様々な指定の仕方で有効期限を設定することができる。
初めてキャッシュを行う時刻からの有効期限秒数を指定する。</p>
<p>特定の日付で有効期限が切れる形式の場合は、このヘッダではなく専用の <code>Expires</code> ヘッダを用いる。</p>
<p><a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Expires">https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Expires</a></p>
<h2 id="デフォルトの設定">デフォルトの設定</h2>
<p>springMVCで作られたwebシステムはもちろん動的サイトであるため、cacheしたくないはずだが、
デフォルトではどのような動きをするか？</p>
<p>ChromeはDevToolを開いて通信をすると、 <code>cache-control: max-age=0</code> でリクエストを飛ばすっポイ？<br>
これが原因かわからないけれども常にキャッシュされないし、レスポンスヘッダには <code>cache-control</code> は設定されない。</p>
<h2 id="自分で制御">自分で制御</h2>
<p>ResponseEntityオブジェクトでキャッシュコントロールを明示することができる。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#a6e22e">@GetMapping</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;/users/{name}&#34;</span><span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> ResponseEntity<span style="color:#f92672">&lt;</span>UserDto<span style="color:#f92672">&gt;</span> <span style="color:#a6e22e">getUser</span><span style="color:#f92672">(</span><span style="color:#a6e22e">@PathVariable</span> String name<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> ResponseEntity<span style="color:#f92672">.</span><span style="color:#a6e22e">ok</span><span style="color:#f92672">()</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">.</span><span style="color:#a6e22e">cacheControl</span><span style="color:#f92672">(</span>CacheControl<span style="color:#f92672">.</span><span style="color:#a6e22e">maxAge</span><span style="color:#f92672">(</span><span style="color:#ae81ff">60</span><span style="color:#f92672">,</span> TimeUnit<span style="color:#f92672">.</span><span style="color:#a6e22e">SECONDS</span><span style="color:#f92672">))</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">.</span><span style="color:#a6e22e">body</span><span style="color:#f92672">(</span><span style="color:#66d9ef">new</span> UserDto<span style="color:#f92672">(</span>name<span style="color:#f92672">));</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>動的レスポンスをキャッシュさせたい場合はまぁあれだけど、静的コンテンツをthymeleafでドウコウしたときのキャッシュってどうやって制御するんだろう？</p>
]]></content>
		</item>
		
		<item>
			<title>Cookie</title>
			<link>https://pages.shibadog.net/posts/013_cookie/</link>
			<pubDate>Wed, 10 Jun 2020 00:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/013_cookie/</guid>
			<description>overview 正式名称は HTTP Cookie .
端的に言うと、クライアントに情報を保持することができる仕組み。
JavaScriptやサーバからのHTTPレスポンスにより保持させることができる。
また、JavaScriptならロジックで読み取りが可能で、HTTPサーバ通信の場合は、許可されているCookieを通信の際に自動付与して送信する。
ServerからCookieを設定する場合は、レスポンスヘッダに Set-Cookei を付与することで設定できる。
JavaScriptの場合 document.cookie でアクセスできる。
保持可能情報 # 項目 内容 1 name Cookie名（キー） 2 value Cookieがもつ値 3 Domain 発行元ドメイン 4 Path パス 5 Expires 有効期限 6 max-age 有効期限２（寿命） 7 HttpOnly サーバ送信にしか使えなくする。つまりJavaScriptから見れなくする 8 Secure HTTPS(SSL)通信の場合だけ送信するようにする。 9 SameSite None、Lax、Strictがあり、ドメイン間のCookie参照に関する設定となる 10 Priority 容量による制限でCookieを削除する際に消す際の優先度となる。低いほうから消す。 SameSiteとは？ 設定値 効果 Strict Aサイトに対し、Bサイトからどのようなリクエストがあっても、発行したサイトでCookieヘッダーに含めない（Cookieを使用しない） Lax Aサイトに対し、BサイトからのGETリクエストのみCookieヘッダーへ含める（Cookieを使用する）。これ以外のリクエストは含めない None Aサイトに対し、Bサイトからどのようなリクエストがあっても、発行したサイトでCookieヘッダーに含める (Cookieを使用する) 有効期限 Session Cookie 有効期限など指定しない場合は大体のブラウザがこの挙動となる。
ブラウザ（タブ？）が閉じられない間は保持し続ける。
ブラウザ側でよく出てくる「セッションの復元」をすると復元される。
持続的Cookie 有効期限を設定して設定した場合の挙動。
ブラウザ（タブ？）を閉じたとしても保持し続ける。
有効期限または指定した期間に到達した場合に無効になる。
参考資料 MDN - HTTP Cookie MDN - Set-Cookie Qiita - Chrome 80が密かに呼び寄せる地獄 ～ SameSite属性のデフォルト変更を調べてみた(@ahera) </description>
			<content type="html"><![CDATA[<h2 id="overview">overview</h2>
<p>正式名称は <code>HTTP Cookie</code> .</p>
<p>端的に言うと、クライアントに情報を保持することができる仕組み。</p>
<p>JavaScriptやサーバからのHTTPレスポンスにより保持させることができる。<br>
また、JavaScriptならロジックで読み取りが可能で、HTTPサーバ通信の場合は、許可されているCookieを通信の際に自動付与して送信する。</p>
<p>ServerからCookieを設定する場合は、レスポンスヘッダに <code>Set-Cookei</code> を付与することで設定できる。<br>
JavaScriptの場合 <code>document.cookie</code> でアクセスできる。</p>
<h2 id="保持可能情報">保持可能情報</h2>
<table>
<thead>
<tr>
<th>#</th>
<th>項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>name</td>
<td>Cookie名（キー）</td>
</tr>
<tr>
<td>2</td>
<td>value</td>
<td>Cookieがもつ値</td>
</tr>
<tr>
<td>3</td>
<td>Domain</td>
<td>発行元ドメイン</td>
</tr>
<tr>
<td>4</td>
<td>Path</td>
<td>パス</td>
</tr>
<tr>
<td>5</td>
<td>Expires</td>
<td>有効期限</td>
</tr>
<tr>
<td>6</td>
<td>max-age</td>
<td>有効期限２（寿命）</td>
</tr>
<tr>
<td>7</td>
<td>HttpOnly</td>
<td>サーバ送信にしか使えなくする。つまりJavaScriptから見れなくする</td>
</tr>
<tr>
<td>8</td>
<td>Secure</td>
<td>HTTPS(SSL)通信の場合だけ送信するようにする。</td>
</tr>
<tr>
<td>9</td>
<td>SameSite</td>
<td>None、Lax、Strictがあり、ドメイン間のCookie参照に関する設定となる</td>
</tr>
<tr>
<td>10</td>
<td>Priority</td>
<td>容量による制限でCookieを削除する際に消す際の優先度となる。低いほうから消す。</td>
</tr>
</tbody>
</table>
<h2 id="samesiteとは">SameSiteとは？</h2>
<table>
<thead>
<tr>
<th>設定値</th>
<th>効果</th>
</tr>
</thead>
<tbody>
<tr>
<td>Strict</td>
<td>Aサイトに対し、Bサイトからどのようなリクエストがあっても、発行したサイトでCookieヘッダーに含めない（Cookieを使用しない）</td>
</tr>
<tr>
<td>Lax</td>
<td>Aサイトに対し、BサイトからのGETリクエストのみCookieヘッダーへ含める（Cookieを使用する）。これ以外のリクエストは含めない</td>
</tr>
<tr>
<td>None</td>
<td>Aサイトに対し、Bサイトからどのようなリクエストがあっても、発行したサイトでCookieヘッダーに含める (Cookieを使用する)</td>
</tr>
</tbody>
</table>
<h2 id="有効期限">有効期限</h2>
<h3 id="session-cookie">Session Cookie</h3>
<p>有効期限など指定しない場合は大体のブラウザがこの挙動となる。<br>
ブラウザ（タブ？）が閉じられない間は保持し続ける。<br>
ブラウザ側でよく出てくる「セッションの復元」をすると復元される。</p>
<h3 id="持続的cookie">持続的Cookie</h3>
<p>有効期限を設定して設定した場合の挙動。<br>
ブラウザ（タブ？）を閉じたとしても保持し続ける。<br>
有効期限または指定した期間に到達した場合に無効になる。</p>
<h2 id="参考資料">参考資料</h2>
<ul>
<li><a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies">MDN - HTTP Cookie</a></li>
<li><a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie">MDN - Set-Cookie</a></li>
<li><a href="https://qiita.com/ahera/items/0c8276da6b0bed2b580c">Qiita - Chrome 80が密かに呼び寄せる地獄 ～ SameSite属性のデフォルト変更を調べてみた(@ahera)</a></li>
</ul>
]]></content>
		</item>
		
		<item>
			<title>JavaFX 入門</title>
			<link>https://pages.shibadog.net/posts/012_javafx01/</link>
			<pubDate>Sat, 23 May 2020 00:00:00 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/012_javafx01/</guid>
			<description>overview C#でWPFを使った開発を経験しているが、Javaでも同様の仕組みであるJavaFXが出たので、JavaFXが気になって仕方がない。
いまさらながら、調べてみようという話
現在SpringによるWebバックエンド開発が主な仕事なので、その辺の知識を生かしてうまいことJavaFXに適用できないかも模索してみる。
完全にJavaFXは初心者である
環境構築 JavaFXはJava11から本体から切り離された様子。 （この辺深堀している記事がありそうなので探そう。。。）
取り急ぎ、ググった結果ぱっと出てきたGluonが出しているOpenJavaFX11の環境構築を行った。
開発環境はもちろんWindowsなので、パッケージ管理にScoopを使う。
scoopの公式拡張bucketのjava bucketを追加してインストールする。
PS&amp;gt; scoop bucket add java PS&amp;gt; scoop update PS&amp;gt; scoop search javajfx &amp;#39;java&amp;#39; bucket: gluon-openjfx-jmods-ea (15-5) gluon-openjfx-jmods-lts (11.0.2) gluon-openjfx-jmods (14.0.1) gluon-openjfx-sdk-ea (15-5) gluon-openjfx-sdk-lts (11.0.2) gluon-openjfx-sdk (14.0.1) PS&amp;gt; scoop install gluon-openjfx-sdk-lts もちろん、javaも必要なのでインストールしておく
PS&amp;gt; scoop install openjdk11 あと、画面を作成するためのXMLエディタとしてscene builderというものが存在する。
WPFの画面作成のアレと同じことができる。
これはscoopに存在しなかったので、適当に自分でscoop bucketを作ったので追加してインストール
PS&amp;gt; scoop bucket add my-bucket https://github.com/shibadog/my-bucket.git PS&amp;gt; scoop update PS&amp;gt; scoop search scene-builder &amp;#39;my-bucket&amp;#39; bucket: gluon-scene-builder (11.0.0) PS&amp;gt; scoop install gluon-scene-builder これで実行環境と開発SDKのインストール完了。</description>
			<content type="html"><![CDATA[<h2 id="overview">overview</h2>
<p>C#でWPFを使った開発を経験しているが、Javaでも同様の仕組みであるJavaFXが出たので、JavaFXが気になって仕方がない。</p>
<p>いまさらながら、調べてみようという話</p>
<p>現在SpringによるWebバックエンド開発が主な仕事なので、その辺の知識を生かしてうまいことJavaFXに適用できないかも模索してみる。</p>
<p><strong>完全にJavaFXは初心者である</strong></p>
<h2 id="環境構築">環境構築</h2>
<p>JavaFXはJava11から本体から切り離された様子。
（この辺深堀している記事がありそうなので探そう。。。）</p>
<p>取り急ぎ、ググった結果ぱっと出てきたGluonが出しているOpenJavaFX11の環境構築を行った。</p>
<p>開発環境はもちろんWindowsなので、パッケージ管理にScoopを使う。</p>
<p>scoopの公式拡張bucketのjava bucketを追加してインストールする。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; scoop bucket add java
</span></span><span style="display:flex;"><span>PS&gt; scoop update
</span></span><span style="display:flex;"><span>PS&gt; scoop search javajfx
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#39;java&#39;</span> bucket<span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>    gluon-openjfx-jmods-ea (<span style="color:#ae81ff">15</span>-<span style="color:#ae81ff">5</span>)
</span></span><span style="display:flex;"><span>    gluon-openjfx-jmods-lts (<span style="color:#ae81ff">11.0</span>.<span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>    gluon-openjfx-jmods (<span style="color:#ae81ff">14.0</span>.<span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    gluon-openjfx-sdk-ea (<span style="color:#ae81ff">15</span>-<span style="color:#ae81ff">5</span>)
</span></span><span style="display:flex;"><span>    gluon-openjfx-sdk-lts (<span style="color:#ae81ff">11.0</span>.<span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>    gluon-openjfx-sdk (<span style="color:#ae81ff">14.0</span>.<span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>PS&gt; scoop install gluon-openjfx-sdk-lts
</span></span></code></pre></div><p>もちろん、javaも必要なのでインストールしておく</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; scoop install openjdk11
</span></span></code></pre></div><p>あと、画面を作成するためのXMLエディタとしてscene builderというものが存在する。</p>
<p>WPFの画面作成のアレと同じことができる。</p>
<p>これはscoopに存在しなかったので、適当に自分でscoop bucketを作ったので追加してインストール</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; scoop bucket add my-bucket https<span style="color:#960050;background-color:#1e0010">:</span>//github.com/shibadog/my-bucket.git
</span></span><span style="display:flex;"><span>PS&gt; scoop update
</span></span><span style="display:flex;"><span>PS&gt; scoop search scene-builder
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#39;my-bucket&#39;</span> bucket<span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>    gluon-scene-builder (<span style="color:#ae81ff">11.0</span>.<span style="color:#ae81ff">0</span>)
</span></span><span style="display:flex;"><span>PS&gt; scoop install gluon-scene-builder
</span></span></code></pre></div><p>これで実行環境と開発SDKのインストール完了。</p>
<p>エディタはvscodeを使う</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; scoop search vscode
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#39;extras&#39;</span> bucket<span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>    vscode-insiders-portable (nightly)
</span></span><span style="display:flex;"><span>    vscode-insiders (nightly)
</span></span><span style="display:flex;"><span>    vscode-portable (<span style="color:#ae81ff">1.45</span>.<span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    vscode (<span style="color:#ae81ff">1.45</span>.<span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#39;main&#39;</span> bucket<span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>    llvm (<span style="color:#ae81ff">10.0</span>.<span style="color:#ae81ff">0</span>) --&gt; includes <span style="color:#e6db74">&#39;lldb-vscode.exe&#39;</span>
</span></span><span style="display:flex;"><span>    winpython (<span style="color:#ae81ff">3.8</span>.2.<span style="color:#ae81ff">0</span>) --&gt; includes <span style="color:#e6db74">&#39;winvscode.bat&#39;</span>
</span></span><span style="display:flex;"><span>PS&gt; scoop bucket add extras
</span></span><span style="display:flex;"><span>PS&gt; scoop update
</span></span><span style="display:flex;"><span>PS&gt; scoop install vscode
</span></span></code></pre></div><p>あ、ビルドツールはmavenを使うので、これもscoopで入れておく。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; scoop search maven
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#39;main&#39;</span> bucket<span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>    maven (<span style="color:#ae81ff">3.6</span>.<span style="color:#ae81ff">3</span>)
</span></span><span style="display:flex;"><span>PS&gt; scoop install maven
</span></span></code></pre></div><p>vscodeには、諸々Java開発のための拡張機能など入れておいてね。</p>
<h2 id="vscodeでの環境構築">vscodeでの環境構築</h2>
<p>取り急ぎ、mavenプロジェクトを作ってから開発しないといかんので、諸々ベースを作る。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; mvn archetype<span style="color:#960050;background-color:#1e0010">:</span>generate
</span></span><span style="display:flex;"><span>Choose a number or apply <span style="color:#66d9ef">filter</span> (format<span style="color:#960050;background-color:#1e0010">:</span> [groupId<span style="color:#960050;background-color:#1e0010">:</span>]artifactId, case sensitive contains)<span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#ae81ff">1605</span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>Choose a number<span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#ae81ff">8</span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>Define value <span style="color:#66d9ef">for</span> property <span style="color:#e6db74">&#39;groupId&#39;</span><span style="color:#960050;background-color:#1e0010">:</span> com.github.shibadog
</span></span><span style="display:flex;"><span>Define value <span style="color:#66d9ef">for</span> property <span style="color:#e6db74">&#39;artifactId&#39;</span><span style="color:#960050;background-color:#1e0010">:</span> javafx-test
</span></span><span style="display:flex;"><span>Define value <span style="color:#66d9ef">for</span> property <span style="color:#e6db74">&#39;version&#39;</span> <span style="color:#ae81ff">1.0</span>-SNAPSHOT: <span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>Define value <span style="color:#66d9ef">for</span> property <span style="color:#e6db74">&#39;package&#39;</span> com.github.shibadog<span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span> Y: <span style="color:#960050;background-color:#1e0010">:</span> y
</span></span><span style="display:flex;"><span>PS&gt; ls
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Mode                LastWriteTime        Length Name
</span></span><span style="display:flex;"><span>----                -------------         ------ ----
</span></span><span style="display:flex;"><span>d-----       <span style="color:#ae81ff">2020</span>/<span style="color:#ae81ff">05</span>/<span style="color:#ae81ff">23</span>     <span style="color:#ae81ff">22</span><span style="color:#960050;background-color:#1e0010">:</span><span style="color:#ae81ff">32</span>                javafx-test
</span></span></code></pre></div><p>あとラッパも作っておく</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; cd javafx-test
</span></span><span style="display:flex;"><span>PS&gt; mvn -N io.takari<span style="color:#960050;background-color:#1e0010">:</span>maven<span style="color:#960050;background-color:#1e0010">:</span><span style="color:#ae81ff">0.7</span>.<span style="color:#ae81ff">6</span><span style="color:#960050;background-color:#1e0010">:</span>wrapper
</span></span></code></pre></div><p>giboで適当にignore作っておく</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>PS&gt; gibo dump VisualStudioCode Maven Java Eclipse &gt;.gitignore
</span></span></code></pre></div><p>powershellだとUTF-16になっちゃうので（これなんとかならんのかいな）、vscodeで開いて文字コードをUTF-8に変えておく。</p>
<p>pomのjdkバージョンを11に変更</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span>diff --git a/pom.xml b/pom.xml
</span></span><span style="display:flex;"><span>index 4c0c6e2..e9aed17 100644
</span></span><span style="display:flex;"><span><span style="color:#f92672">--- a/pom.xml
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+++ b/pom.xml
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span><span style="color:#75715e">@@ -14,8 +14,8 @@
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>   &lt;properties&gt;
</span></span><span style="display:flex;"><span>     &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
</span></span><span style="display:flex;"><span><span style="color:#f92672">-    &lt;maven.compiler.source&gt;1.7&lt;/maven.compiler.source&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-    &lt;maven.compiler.target&gt;1.7&lt;/maven.compiler.target&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+    &lt;maven.compiler.source&gt;11&lt;/maven.compiler.source&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    &lt;maven.compiler.target&gt;11&lt;/maven.compiler.target&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span>   &lt;/properties&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>   &lt;dependencies&gt;
</span></span></code></pre></div><p>肝心のjavaFxの依存を追加</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span>diff --git a/pom.xml b/pom.xml
</span></span><span style="display:flex;"><span>index e9aed17..b2a3002 100644
</span></span><span style="display:flex;"><span><span style="color:#f92672">--- a/pom.xml
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+++ b/pom.xml
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span><span style="color:#75715e">@@ -19,6 +19,16 @@
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>   &lt;/properties&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>   &lt;dependencies&gt;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    &lt;dependency&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      &lt;groupId&gt;org.openjfx&lt;/groupId&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      &lt;artifactId&gt;javafx-controls&lt;/artifactId&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      &lt;version&gt;11.0.2&lt;/version&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    &lt;/dependency&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    &lt;dependency&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      &lt;groupId&gt;org.openjfx&lt;/groupId&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      &lt;artifactId&gt;javafx-fxml&lt;/artifactId&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      &lt;version&gt;11.0.2&lt;/version&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    &lt;/dependency&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span>     &lt;dependency&gt;
</span></span><span style="display:flex;"><span>       &lt;groupId&gt;junit&lt;/groupId&gt;
</span></span><span style="display:flex;"><span>       &lt;artifactId&gt;junit&lt;/artifactId&gt;
</span></span></code></pre></div><p>これでもう作れるはず。
とりあえずMainクラスをJavaFXに改造</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span>diff --git a/src/main/java/com/github/shibadog/App.java b/src/main/java/com/github/shibadog/App.java
</span></span><span style="display:flex;"><span>index 351a4f4..afe5546 100644
</span></span><span style="display:flex;"><span><span style="color:#f92672">--- a/src/main/java/com/github/shibadog/App.java
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+++ b/src/main/java/com/github/shibadog/App.java
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span><span style="color:#75715e">@@ -1,13 +1,20 @@
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> package com.github.shibadog;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-/**
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">- * Hello world!
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">- *
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">- */
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-public class App
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-{
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-    public static void main( String[] args )
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-    {
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-        System.out.println( &#34;Hello World!&#34; );
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+import javafx.application.Application;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+import javafx.stage.Stage;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+public class App extends Application {
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    @Override
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    public void start(final Stage stage) {
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+        try {
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+            stage.show();
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+        } catch (final Exception e) {
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+            e.printStackTrace();
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+        }
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    }
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+    public static void main(final String... args) {
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+        Application.launch(args);
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span>     }
</span></span><span style="display:flex;"><span><span style="color:#f92672">-}
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+}
</span></span></span></code></pre></div><p>実行の時にミソ。vscodeのlaunch.jsonでjavaFx用のモジュールを指定して実行するように設定を入れる。</p>
<p>vscodeのデフォルト設定でlaunch.jsonを作成する。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// IntelliSense を使用して利用可能な属性を学べます。
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#75715e">// 既存の属性の説明をホバーして表示します。
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#75715e">// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;0.2.0&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;configurations&#34;</span>: [
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;java&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;Debug (Launch) - Current File&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;request&#34;</span>: <span style="color:#e6db74">&#34;launch&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;mainClass&#34;</span>: <span style="color:#e6db74">&#34;${file}&#34;</span>
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;java&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;Debug (Launch)-App&lt;javafx-test&gt;&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;request&#34;</span>: <span style="color:#e6db74">&#34;launch&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;mainClass&#34;</span>: <span style="color:#e6db74">&#34;com.github.shibadog.App&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;projectName&#34;</span>: <span style="color:#e6db74">&#34;javafx-test&#34;</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>このあと、モジュール追加</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span>diff --git a/.vscode/launch.json b/.vscode/launch.json
</span></span><span style="display:flex;"><span>index c0f83a8..8e410e4 100644
</span></span><span style="display:flex;"><span><span style="color:#f92672">--- a/.vscode/launch.json
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+++ b/.vscode/launch.json
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span><span style="color:#75715e">@@ -8,14 +8,16 @@
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>             &#34;type&#34;: &#34;java&#34;,
</span></span><span style="display:flex;"><span>             &#34;name&#34;: &#34;Debug (Launch) - Current File&#34;,
</span></span><span style="display:flex;"><span>             &#34;request&#34;: &#34;launch&#34;,
</span></span><span style="display:flex;"><span><span style="color:#f92672">-            &#34;mainClass&#34;: &#34;${file}&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+            &#34;mainClass&#34;: &#34;${file}&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+            &#34;vmArgs&#34;: &#34;--module-path ${env:USERPROFILE}\\scoop\\apps\\gluon-openjfx-sdk-lts\\current\\lib --add-modules javafx.controls,javafx.fxml&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span>         },
</span></span><span style="display:flex;"><span>         {
</span></span><span style="display:flex;"><span>             &#34;type&#34;: &#34;java&#34;,
</span></span><span style="display:flex;"><span>             &#34;name&#34;: &#34;Debug (Launch)-App&lt;javafx-test&gt;&#34;,
</span></span><span style="display:flex;"><span>             &#34;request&#34;: &#34;launch&#34;,
</span></span><span style="display:flex;"><span>             &#34;mainClass&#34;: &#34;com.github.shibadog.App&#34;,
</span></span><span style="display:flex;"><span><span style="color:#f92672">-            &#34;projectName&#34;: &#34;javafx-test&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672"></span><span style="color:#a6e22e">+            &#34;projectName&#34;: &#34;javafx-test&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+            &#34;vmArgs&#34;: &#34;--module-path ${env:USERPROFILE}\\scoop\\apps\\gluon-openjfx-sdk-lts\\current\\lib --add-modules javafx.controls,javafx.fxml&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e"></span>         }
</span></span><span style="display:flex;"><span>     ]
</span></span><span style="display:flex;"><span> }
</span></span></code></pre></div><p>これでやっとvscodeから起動ができる。</p>
<p>開発環境の構築完成！！</p>
]]></content>
		</item>
		
		<item>
			<title>暗号化/ハッシュ化について調べた</title>
			<link>https://pages.shibadog.net/posts/003_encript/</link>
			<pubDate>Mon, 04 Nov 2019 22:54:02 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/003_encript/</guid>
			<description>何もできなかったから過去書いたネタを転載（ぉ
暗号化アルゴリズム 暗号化と複合 暗号化は誰でもアクセス可能なパブリックな場所でデータを転送する際に、第三者にデータを盗み見されたり、改ざんされないようにデータを守るために用いられる。
暗号化や複合は、暗号化アルゴリズムと鍵によって行われる。
2種類の暗号化方式 暗号化アルゴリズムには大きく分けて2種類のものがある。
共通鍵暗号 公開鍵暗号 共通鍵暗号 この方式は、直観的に理解しやすい。
いわゆる現実で用いる「鍵」と同様の方法で、一つの「鍵」を用いて鍵をかける（暗号化）ことができ、さらに同じ「鍵」で鍵を開ける（複合化）できる。
また、この「鍵」を「共通鍵」と呼ぶ。
欠点と相手は、暗号化する側と、複合化する側が異なる場合に同一の「共通鍵」をそれぞれが保有している必要がある。
これは、「共通鍵」を他人が知り得てしまった場合は、その他人が暗号文を解読できてしまうというリスクが発生する。
公開鍵方式 この方式は、少し現実で表現しにくい。
二つの鍵を用意し、それぞれ、「暗号化用」と「複合化用」とする。
「暗号化用」の鍵を「公開鍵」と呼び、「複合化用」の鍵を「秘密鍵」と呼ぶ。
使用するときは、複合化する側が2つの鍵を生成し、「公開鍵」を暗号化する側に渡す。
渡された暗号化する側が「公開鍵」で暗号化を行った後、複合化する側に暗号文を渡す。
複合化する側は「秘密鍵」を用いて暗号文を複合化できる。
この方式の特徴は、「公開鍵」で暗号化したものは「秘密鍵」でのみ複合化できるということで、かつ、「公開鍵」を用いて「秘密鍵」を推測することができないことである。
「公開鍵」を知り得ても暗号化はできても複合化ができないため、必ず「秘密鍵」を持っているものしか暗号文を解読することはできない。
欠点としては、共通鍵方式と比べると処理（暗号化・複合化）の速度が遅い。
ハイブリット方式 それぞれの方式には利点・欠点がありそれを補完するためにはブリット方式が存在する。
ハイブリット方式では、データの暗号化には「共通鍵方式」を用い、この「共通鍵」を受け渡す際に「公開鍵方式」で暗号化を行うというものである。
「共通鍵」の漏えいリスクを「公開鍵方式」で担保し、高速な「共通鍵方式」のアルゴリズムでデータを担保するという手法。
共通鍵方式の中での2種類の方式 共通鍵方式の中で、その手法を大きく2つに分けることができる。
それが以下の2つの種類の暗号化方式である。
ブロック暗号 ストリーム暗号 ブロック暗号 ブロック暗号は、暗号化対象の平文データを一定の長さのブロックに分割して暗号化を行う手法である。
通常、平文データは1byte単位の可変長であるが、1byteごとに1byteの暗号文としていた場合は256通りのパターンでしかないため、簡単に解読されてしまう。
これを防ぐために、8byte（64bit）や、32byte（256bit）といった、より大きな「ブロック」ごとにまとめて暗号化する方式で解読を難しくしている。
ストリーム暗号 ブロック暗号では、ブロック毎に暗号化をすることで1byte毎の暗号化よりも解読を難しくしているが、結局ブロック長が短ければパターン数が少なく解読の難易度も下がってしまう問題は変わらない。
ブロック長を十分な長さにしたとしても、過去あった暗号化方式であるDESでも起こったように、コンピュータの性能向上によって脆弱なアルゴリズムになってしまう。
そこで、任意長の鍵ストリーム列を生成させ、これと入力の平文を演算させる「ストリーム暗号」が考え出された。
これは、1bitや1byte単位でデータを暗号化でき、かつ、パターンを十分に増やせる。
また、対象の平文の長さを気にしなくて済むため、SSL（HTTPS）や無線LAN（WEP）など、ネットワークトラフィックを暗号化するために利用されている。
暗号化アルゴリズムの種類 暗号化アルゴリズム一覧 # 方式 暗号化方式 暗号アルゴリズム 信頼度 規格 備考 1 共通鍵 ブロック DES 低 RFC 2451 2 共通鍵 ブロック AES 中 3 共通鍵 ブロック Rijndael 高 4 共通鍵 ブロック Triple-DES 中 5 共通鍵 ブロック RC2 低 RFC 2268 6 共通鍵 ストリーム RC4 低 RFC 7465 7 公開鍵 - RSA 高 大きな数の素因数分解問題 8 公開鍵 - El Gamal 高 離散対数問題 9 公開鍵 - ECC 高 離散対数暗号方式に楕円曲線の点のグループを適用させた方式 暗号利用モード (Block cipher modes of opration) 暗号化のアルゴリズムとは別に、暗号化を行う手順についての規格（？）。</description>
			<content type="html"><![CDATA[<p>何もできなかったから過去書いたネタを転載（ぉ</p>
<h2 id="暗号化アルゴリズム">暗号化アルゴリズム</h2>
<h3 id="暗号化と複合">暗号化と複合</h3>
<p>暗号化は誰でもアクセス可能なパブリックな場所でデータを転送する際に、第三者にデータを盗み見されたり、改ざんされないようにデータを守るために用いられる。</p>
<p>暗号化や複合は、暗号化アルゴリズムと鍵によって行われる。</p>
<h3 id="2種類の暗号化方式">2種類の暗号化方式</h3>
<p>暗号化アルゴリズムには大きく分けて2種類のものがある。</p>
<ul>
<li>共通鍵暗号</li>
<li>公開鍵暗号</li>
</ul>
<h4 id="共通鍵暗号">共通鍵暗号</h4>
<p>この方式は、直観的に理解しやすい。</p>
<p>いわゆる現実で用いる「鍵」と同様の方法で、一つの「鍵」を用いて鍵をかける（暗号化）ことができ、さらに同じ「鍵」で鍵を開ける（複合化）できる。</p>
<p>また、この「鍵」を「共通鍵」と呼ぶ。</p>
<p>欠点と相手は、暗号化する側と、複合化する側が異なる場合に同一の「共通鍵」をそれぞれが保有している必要がある。</p>
<p>これは、「共通鍵」を他人が知り得てしまった場合は、その他人が暗号文を解読できてしまうというリスクが発生する。</p>
<h4 id="公開鍵方式">公開鍵方式</h4>
<p>この方式は、少し現実で表現しにくい。</p>
<p>二つの鍵を用意し、それぞれ、「暗号化用」と「複合化用」とする。</p>
<p>「暗号化用」の鍵を「公開鍵」と呼び、「複合化用」の鍵を「秘密鍵」と呼ぶ。</p>
<p>使用するときは、複合化する側が2つの鍵を生成し、「公開鍵」を暗号化する側に渡す。</p>
<p>渡された暗号化する側が「公開鍵」で暗号化を行った後、複合化する側に暗号文を渡す。</p>
<p>複合化する側は「秘密鍵」を用いて暗号文を複合化できる。</p>
<p>この方式の特徴は、「公開鍵」で暗号化したものは「秘密鍵」でのみ複合化できるということで、かつ、「公開鍵」を用いて「秘密鍵」を推測することができないことである。</p>
<p>「公開鍵」を知り得ても暗号化はできても複合化ができないため、必ず「秘密鍵」を持っているものしか暗号文を解読することはできない。</p>
<p>欠点としては、共通鍵方式と比べると処理（暗号化・複合化）の速度が遅い。</p>
<h3 id="ハイブリット方式">ハイブリット方式</h3>
<p>それぞれの方式には利点・欠点がありそれを補完するためにはブリット方式が存在する。</p>
<p>ハイブリット方式では、データの暗号化には「共通鍵方式」を用い、この「共通鍵」を受け渡す際に「公開鍵方式」で暗号化を行うというものである。</p>
<p>「共通鍵」の漏えいリスクを「公開鍵方式」で担保し、高速な「共通鍵方式」のアルゴリズムでデータを担保するという手法。</p>
<h3 id="共通鍵方式の中での2種類の方式">共通鍵方式の中での2種類の方式</h3>
<p>共通鍵方式の中で、その手法を大きく2つに分けることができる。</p>
<p>それが以下の2つの種類の暗号化方式である。</p>
<ul>
<li>ブロック暗号</li>
<li>ストリーム暗号</li>
</ul>
<h4 id="ブロック暗号">ブロック暗号</h4>
<p>ブロック暗号は、暗号化対象の平文データを一定の長さのブロックに分割して暗号化を行う手法である。</p>
<p>通常、平文データは1byte単位の可変長であるが、1byteごとに1byteの暗号文としていた場合は256通りのパターンでしかないため、簡単に解読されてしまう。</p>
<p>これを防ぐために、8byte（64bit）や、32byte（256bit）といった、より大きな「ブロック」ごとにまとめて暗号化する方式で解読を難しくしている。</p>
<h4 id="ストリーム暗号">ストリーム暗号</h4>
<p>ブロック暗号では、ブロック毎に暗号化をすることで1byte毎の暗号化よりも解読を難しくしているが、結局ブロック長が短ければパターン数が少なく解読の難易度も下がってしまう問題は変わらない。</p>
<p>ブロック長を十分な長さにしたとしても、過去あった暗号化方式であるDESでも起こったように、コンピュータの性能向上によって脆弱なアルゴリズムになってしまう。</p>
<p>そこで、任意長の鍵ストリーム列を生成させ、これと入力の平文を演算させる「ストリーム暗号」が考え出された。</p>
<p>これは、1bitや1byte単位でデータを暗号化でき、かつ、パターンを十分に増やせる。</p>
<p>また、対象の平文の長さを気にしなくて済むため、SSL（HTTPS）や無線LAN（WEP）など、ネットワークトラフィックを暗号化するために利用されている。</p>
<h3 id="暗号化アルゴリズムの種類">暗号化アルゴリズムの種類</h3>
<h4 id="暗号化アルゴリズム一覧">暗号化アルゴリズム一覧</h4>
<table>
<thead>
<tr>
<th>#</th>
<th>方式</th>
<th>暗号化方式</th>
<th>暗号アルゴリズム</th>
<th>信頼度</th>
<th>規格</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>共通鍵</td>
<td>ブロック</td>
<td>DES</td>
<td>低</td>
<td>RFC 2451</td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>共通鍵</td>
<td>ブロック</td>
<td>AES</td>
<td>中</td>
<td></td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>共通鍵</td>
<td>ブロック</td>
<td>Rijndael</td>
<td>高</td>
<td></td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>共通鍵</td>
<td>ブロック</td>
<td>Triple-DES</td>
<td>中</td>
<td></td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>共通鍵</td>
<td>ブロック</td>
<td>RC2</td>
<td>低</td>
<td>RFC 2268</td>
<td></td>
</tr>
<tr>
<td>6</td>
<td>共通鍵</td>
<td>ストリーム</td>
<td>RC4</td>
<td>低</td>
<td>RFC 7465</td>
<td></td>
</tr>
<tr>
<td>7</td>
<td>公開鍵</td>
<td>-</td>
<td>RSA</td>
<td>高</td>
<td></td>
<td>大きな数の素因数分解問題</td>
</tr>
<tr>
<td>8</td>
<td>公開鍵</td>
<td>-</td>
<td>El Gamal</td>
<td>高</td>
<td></td>
<td>離散対数問題</td>
</tr>
<tr>
<td>9</td>
<td>公開鍵</td>
<td>-</td>
<td>ECC</td>
<td>高</td>
<td></td>
<td>離散対数暗号方式に楕円曲線の点のグループを適用させた方式</td>
</tr>
</tbody>
</table>
<h3 id="暗号利用モード-block-cipher-modes-of-opration">暗号利用モード (Block cipher modes of opration)</h3>
<p>暗号化のアルゴリズムとは別に、暗号化を行う手順についての規格（？）。</p>
<p>また、このモードはブロック暗号と呼ばれる暗号方式の際に利用する。</p>
<p>代表的なECBモードといわれる方法では、鍵で平文を暗号化する際に単純に一回暗号化処理を行う。この状態では、同じ平文を同じパスワードで暗号化した場合、暗号化結果が同一になってしまうため、パターンを解析することで平文が求められてしまう。</p>
<p>これを防ぐためのやり方がそのほかのモードである。</p>
<h4 id="ecbelectronic-codebookモード">ECB(Electronic Codebook)モード</h4>
<p>最も単純な暗号利用モードである。
平文を決まったブロック(長さ)に分けたのち、そのブロックをそれぞれ独立して暗号化する。</p>
<p>EBCモードの欠点は、上記にも記載した通り、同じ鍵を用いた場合ある平文ブロックを暗号化した結果の暗号ブロックが常に同じになることである。</p>
<h4 id="cbccipher-block-chainingモード">CBC(Cipher Block Chaining)モード</h4>
<p>この方式はIBMによって考案された方式で、各ブロックの平文を前のブロックのXORをとってから暗号化させる。</p>
<p>この方法をとることによって、同一のパスワード・平文であったとしても、文脈が異なれば暗号化結果が変わる状態となる。</p>
<p>また、最初のブロックについては、前のブロックが存在しないため、代わりになるInitialization Vector(IV)という初期値を与える。</p>
<p>これは、最初のブロックに対して前のブロックの代わりになるため、ブロック長と同じ長さを指定する必要がある。</p>
<p>この方式の欠点は以下の2点があげられる。</p>
<ul>
<li>ブロックの暗号化に前のブロックの情報が必要であるため、暗号化は並列で行うことができない。</li>
<li>暗号ブロックの長さを固定化しなければならないため、対象の平文をブロック長の整数倍の長さにパディング（空白埋めなど）しなければならない。</li>
</ul>
<p>Niels FergusonおよびBruce Schneierによって推奨される二つの暗号化の一つである。</p>
<h5 id="pcbcpropagating-cipher-block-chainingモード">PCBC(Propagating Cipher Block Chaining)モード</h5>
<p>あまり主流ではないCBCモードの変法である。</p>
<p>CBCモードでは、前のブロックの暗号結果を次のブロックに対してXORをかけた後に鍵で暗号化をかけていたが、PCBCモードでは、前のブロックの暗号化結果とそのブロックの暗号化前の平文をXORした結果で次のブロックの平文をXORし、鍵で暗号化する。</p>
<p>特徴としては、隣接する2つの暗号文ブロックを入れ替えたとしてもそれ以降のブロックの複合に影響しないこと。</p>
<h4 id="cfbcipher-feedbackモード">CFB(Cipher Feedback)モード</h4>
<p>CBCモードと似ているが、どちらを主として考えるかという違いのようである。</p>
<p>手順としては、IV（または前の暗号化結果）を暗号化し、その結果に次のブロックをXORして暗号化結果とする。</p>
<p>これは、CBCモードと同様に、並列処理ができない作りである。</p>
<p>また、これもCBCモードと同様だが、平文1ビットの変更で暗号文全体が変わってしまう。</p>
<p>CBCモードと比べて利点となるのは、パディング処理を行わなくともよいという点である。</p>
<h4 id="ofboutput-feedbackモード">OFB(Output Feedback)モード</h4>
<p>CFBモードの亜種みたいなもので、次のブロックの元となる暗号化ブロックを、前のブロックでXORをかける前の暗号化ブロックを用いる。</p>
<p>利点としては、暗号化前でも前方誤り補正を適用できることのようだが、正確な意味を理解できていない。。。[TODO]</p>
<p>また、細かい部分の説明を省くが、CBCモードを入力がすべて0で実施したときの暗号化ブロックが、OFBモードのブロックごとの入力値となるため、ハードウェア的な高速CBC機構を用いてOFBモードを実施する事が可能である。</p>
<h4 id="ctrcounterモード">CTR(Counter)モード</h4>
<p>Counterと呼ばれる値とNonceと呼ばれる値を組み合わせ、暗号化処理をかけた結果を平文のブロックにXORすることで暗号化する。</p>
<p>Counterは単調増加であり値が重複することがなければどんな値でもよいが、1ずつ増加する値を用いることが一般的である。</p>
<p>また、この方式では暗号化・複合化ともに並列処理が行えるため、複数プロセッサと相性が良い。</p>
<p>さらに、Niels FergusonおよびBruce Schneierによって推奨される2つの暗号化の一つである。</p>
<h4 id="その他">その他</h4>
<ul>
<li>CTS(CipherText Stealing)</li>
<li>2DEM(2D Encryption Mode)</li>
<li>ABC(Accumulated Block Chaining)</li>
<li>IGE(Infinite Garble Extension)</li>
<li>F8@3GPP</li>
</ul>
<p>などなど</p>
<h4 id="参考文献">参考文献</h4>
<ol>
<li><a href="https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89">Wikipedia - 暗号利用モード</a></li>
<li><a href="http://www.triplefalcon.com/Lexicon/Encryption-Block-Mode-1.htm">triplefalcon - ブロック暗号化モード</a></li>
</ol>
<h3 id="パディングモード">パディングモード</h3>
<p>暗号化モードでパディング処理が必要であるが、このパディングについても手法がいくつかある。</p>
<h4 id="nopadding">NoPadding</h4>
<p>単純で、パディングを行わないモード
これで問題ないのか？</p>
<h4 id="zerobytepadding">ZeroBytePadding</h4>
<p>ブロック長に満たない場合はNULLバイト(0x00)で埋める。
ブロック長ピッタリな場合はパディングされない。</p>
<p>このため、末尾のNULLバイトが本来生成された値の末尾なのかパディングされた値なのかを判断できない。</p>
<p>暗号化するデータにNULLバイトが含まれていない場合に用いれる。</p>
<h4 id="pkcs5-padding">PKCS#5 Padding</h4>
<p>ブロック長に満たないサイズの値を表すバイト値で足りない分を埋める。</p>
<p>不足分が変われば埋める値が変わる。</p>
<p>ブロック長がピッタリな場合は1ブロック分丸ごとパディングされる。</p>
<p><a href="https://www.ietf.org/rfc/rfc1423.txt">RFC1423</a>で規格化されている。</p>
<h4 id="pkcs7-padding">PKCS#7 Padding</h4>
<p>バイト シーケンスで構成され、各バイト シーケンスは追加される埋め込みバイトの合計数に等しいバイト数になる。</p>
<p><a href="https://tools.ietf.org/html/rfc5652">RFC5652</a>で規格化されている。</p>
<p>.NETではPKCS方式の場合このバージョンが実装されている。</p>
<p>たとえば以下の通り。</p>
<p><code>FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07</code></p>
<h4 id="iso10126padding">ISO10126Padding</h4>
<p>W3Cで定義されているパディング方式</p>
<p>ランダムな値で埋める。</p>
<p>たとえば以下の通り。</p>
<p><code>FF FF FF FF FF FF FF FF FF 7 D 2A 75 EF F8 EF 07</code></p>
<h4 id="ssl3padding">SSL3Padding</h4>
<p>SSL Protocol バージョン3.0のセクション5.2.3.2(CBCブロック暗号)で規定されたパディング方式</p>
<h4 id="ansix923-padding">ANSIX923 Padding</h4>
<p>ブロック長に満たないサイズの値を表すバイトを最後につけたNULLバイト値で埋める。</p>
<p>たとえば以下の通り。</p>
<p><code>FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07</code></p>
<h4 id="参考資料">参考資料</h4>
<ol>
<li><a href="https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.paddingmode(v=vs.110).aspx">MSDN - PaddingMode 列挙型</a></li>
<li><a href="http://pentan.info/doc/block_cipher.html">Pentan.info - [暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV)</a></li>
</ol>
<h3 id="参考資料-1">参考資料</h3>
<ol>
<li><a href="http://www.infraexpert.com/study/security4.html">ネットワークエンジニアとして - Common key cryptosystem / Public key cryptosystem</a></li>
<li><a href="http://www.atmarkit.co.jp/ait/articles/1504/27/news032.html">@IT - 第1回　暗号化の基礎</a></li>
<li><a href="http://www.mukaidono.jp/Board/infosys2000/security/firewall.htm">情報社会におけるセキュリティ - ２－４ 暗号化アルゴリズム</a></li>
</ol>
<h2 id="ハッシュ化アルゴリズム">ハッシュ化アルゴリズム</h2>
<p>暗号化とは似て異なる代物で、暗号化では可逆の暗号文を生成するが、ハッシュでは不可逆の暗号文（メッセージダイジェストとかフィンガープリントとか呼ぶらしい）を生成する。</p>
<p>また、可変のデータ長の平文を一定のデータ長の値を求めることができるため、チェックディジットや、パスワードの保管などに使われる。</p>
<p>使用方法から、ハッシュでは暗号化と異なった特性が求められる。</p>
<ul>
<li>ハッシュは同じハッシュ関数を通す場合は常に同じ値が求まる。</li>
<li>異なる元メッセージから同じハッシュ値が生成され <strong>にくい</strong></li>
<li>また、生成されたハッシュ値と同一のハッシュ値が生成されるメッセージを求めることが困難であること。</li>
</ul>
<h3 id="ハッシュ化アルゴリズムの種類">ハッシュ化アルゴリズムの種類</h3>
<h4 id="ハッシュ化アルゴリズム一覧">ハッシュ化アルゴリズム一覧</h4>
<table>
<thead>
<tr>
<th>#</th>
<th>ハッシュアルゴリズム</th>
<th>信頼度</th>
<th>規格</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>MD5</td>
<td>低</td>
<td>RFC 1321</td>
<td>_</td>
</tr>
<tr>
<td>2</td>
<td>SHA-1</td>
<td>低</td>
<td>FIPS 180-2</td>
<td>_</td>
</tr>
<tr>
<td>3</td>
<td>SHA-2</td>
<td>高</td>
<td>FIPS 180-4</td>
<td>_</td>
</tr>
<tr>
<td>4</td>
<td>SHA-3</td>
<td>?</td>
<td></td>
<td>_</td>
</tr>
</tbody>
</table>
<h4 id="参考資料-2">参考資料</h4>
<ol>
<li><a href="http://sehermitage.web.fc2.com/crypto/digest.html">シニアエンジニアの庵 - ハッシュ関数</a></li>
</ol>
<h3 id="ソルト">ソルト</h3>
<p>ハッシュ化アルゴリズムの特性上、同じ平文を与えた場合常にハッシュ化された値は同じになることが保証されている。</p>
<p>この特性をついて、よく設定される平文に対応するハッシュ値をデータベース化し、これと突き合わせることによって平文を求めるという手法（レインボーテーブル）に弱いことが知られている。</p>
<p>この対策のため、平文に「ある値」をつなげた結果をハッシュ化し、「ハッシュ値」とこの「ある値」を一緒に管理するという手法がとられている。</p>
<p>この「ある値」をソルトと呼んでいる。</p>
<p>パスワードの管理であれば、パスワードを入力された後、このパスワードと保管しておいたソルトをつなげハッシュ値を求める。このハッシュ値が保管しているハッシュ値と一致していれば、入力されたパスワードが正しいと判断できる。</p>
<p>また、レインボーテーブルへの対応としては以下の要件を満たすべきである。</p>
<ul>
<li>平文ごとに異なるソルトを使う</li>
<li>ある程度の長さ（20文字程度以上）を確保する</li>
</ul>
<h3 id="ストレッチング">ストレッチング</h3>
<p>ストレッチングは総当たりによる解読の対策として生まれた手法。</p>
<p>ハッシュの使用目的として、処理速度は高速であることが求められるため、この高速性をついて総当たりでの平文探索を行われてしまうことがある。</p>
<p>これの対策として、あえて遅いハッシュ関数を作成するのではなく、早いハッシュ関数を何千回と繰り返すことで処理自体を遅くし、総当たりに時間がかかるようにする手法がストレッチングである。</p>
<p>ストレッチングの回数が多いほど安全性が高まるが、計算量が増えることで負荷がかかってしまう。</p>
<p>この負荷を利用してDoS攻撃に悪用されるリスクが高まってしまう。</p>
<h2 id="参考資料-3">参考資料</h2>
<ol>
<li><a href="http://tkengo.github.io/blog/2015/12/01/https-details/">けんごのお屋敷 - 理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話</a></li>
<li><a href="http://qiita.com/chroju/items/3ddae568206b8bc3d8f9">Qiita - 暗号化とハッシュ化に関する基本的な事柄まとめ</a></li>
</ol>
]]></content>
		</item>
		
		<item>
			<title>Hystrixを説明してみた２</title>
			<link>https://pages.shibadog.net/posts/002_hystrix_02/</link>
			<pubDate>Sat, 26 Oct 2019 13:17:15 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/002_hystrix_02/</guid>
			<description>Hystrixを説明してみた の続き
Hystrixの機能 Hystrixの機能紹介をしてみる。
コマンド隔離 コマンドエラー検知 例外ハンドリング タイムアウトハンドリング コマンド同時実行数制限 コマンド隔離 Hystrixではコマンドの隔離が行える。
具体的には、指定したメソッド一つが隔離対象となり、別名で隔離したメソッドと影響しあわないようにできる。
例えば、以下のように2つのコマンドを定義したアプリの場合。 コマンドAからアクセスするAPIAがタイムアウトを頻発するような状況になってしまったとすると、
コマンドAが即エラーを返すようなることで、リクエスト処理スレッドが占有されず、コマンドBは正常に処理が行われる。
コマンドエラー検知 コマンド内で実行される処理でExceptionが発生した場合には、このExceptionを検知してフォールバック処理を行うことができる。
また、コマンド内の処理のタイムアウトを測ることができ、指定時間を過ぎた場合に、HystrixのExceptionを発生させることができる。
timeInMillisecondsの秒数内に、numBuckets分の記録用の箱があるイメージ。 例えば、10,000msで10Bucketsの場合、集計範囲は1,000msになる。
circuitBreaker.errorThresholdPercentageで設定した割合でSuccess以外のエラー数となった場合に、ショートサーキット状態となる。
参考：GitHub - Netflix/Hystrix wiki
コマンド同時実行数制御 隔離されたコマンドは同時実行数の制御が行える。
Hystrixは隔離方式を2種類用意しており、デフォルトでは独立Threadによる制御を行う。
もう一つの制御方法として、セマフォ方式を持っている。
若干飽きて適当になった（ぇ
いったんこれまでにしておく。</description>
			<content type="html"><![CDATA[<p><a href="../001_hystrix_01/">Hystrixを説明してみた</a> の続き</p>
<h1 id="hystrixの機能">Hystrixの機能</h1>
<p>Hystrixの機能紹介をしてみる。</p>
<ul>
<li>コマンド隔離</li>
<li>コマンドエラー検知
<ul>
<li>例外ハンドリング</li>
<li>タイムアウトハンドリング</li>
</ul>
</li>
<li>コマンド同時実行数制限</li>
</ul>
<h2 id="コマンド隔離">コマンド隔離</h2>
<p>Hystrixではコマンドの隔離が行える。<br>
具体的には、指定したメソッド一つが隔離対象となり、別名で隔離したメソッドと影響しあわないようにできる。</p>
<p>例えば、以下のように2つのコマンドを定義したアプリの場合。
コマンドAからアクセスするAPIAがタイムアウトを頻発するような状況になってしまったとすると、<br>
コマンドAが即エラーを返すようなることで、リクエスト処理スレッドが占有されず、コマンドBは正常に処理が行われる。</p>
<div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;resize&quot;:true,&quot;page&quot;:0,&quot;toolbar&quot;:&quot;pages zoom layers lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;url&quot;:&quot;https://drive.google.com/uc?id=1mWn5fHltGC2OvDTEekX06TUGgJboxkYB&amp;export=download&quot;}"></div>
<script type="text/javascript" src="https://www.draw.io/embed2.js?&fetch=https%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1mWn5fHltGC2OvDTEekX06TUGgJboxkYB%26export%3Ddownload"></script>
<h2 id="コマンドエラー検知">コマンドエラー検知</h2>
<p>コマンド内で実行される処理でExceptionが発生した場合には、このExceptionを検知してフォールバック処理を行うことができる。</p>
<p>また、コマンド内の処理のタイムアウトを測ることができ、指定時間を過ぎた場合に、HystrixのExceptionを発生させることができる。</p>
<p>timeInMillisecondsの秒数内に、numBuckets分の記録用の箱があるイメージ。
例えば、10,000msで10Bucketsの場合、集計範囲は1,000msになる。</p>
<p>circuitBreaker.errorThresholdPercentageで設定した割合でSuccess以外のエラー数となった場合に、ショートサーキット状態となる。</p>
<p><img src="./Hystrix%E3%82%A8%E3%83%A9%E3%83%BC%E6%A4%9C%E7%9F%A5.svg" alt=""></p>
<p>参考：<a href="https://github.com/Netflix/Hystrix/wiki/Configuration#metricsrollingstatstimeinmilliseconds">GitHub - Netflix/Hystrix wiki</a></p>
<h2 id="コマンド同時実行数制御">コマンド同時実行数制御</h2>
<p>隔離されたコマンドは同時実行数の制御が行える。</p>
<p>Hystrixは隔離方式を2種類用意しており、デフォルトでは独立Threadによる制御を行う。</p>
<p><img src="./Hystrix%E5%90%8C%E6%99%82%E5%AE%9F%E8%A1%8C%E6%95%B0_01.svg" alt=""></p>
<p>もう一つの制御方法として、セマフォ方式を持っている。</p>
<p><img src="./Hystrix%E5%90%8C%E6%99%82%E5%AE%9F%E8%A1%8C%E6%95%B0_02.svg" alt=""></p>
<p>若干飽きて適当になった（ぇ</p>
<p>いったんこれまでにしておく。</p>
]]></content>
		</item>
		
		<item>
			<title>Hystrixを説明してみた</title>
			<link>https://pages.shibadog.net/posts/001_hystrix_01/</link>
			<pubDate>Sun, 20 Oct 2019 21:10:22 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/001_hystrix_01/</guid>
			<description>Hystrixとは Netflixが開発したOSSで、Circuit Breakerの実装。
Circuit Breakerとは、マイクロサービスで開発されたアプリケーション同士が、一つのアプリの障害で連鎖的に障害を発生させる状態を防止するための、ブレーカー的役割をする機能のこと。
後続のアプリケーションが障害を起こした場合、当該アプリで即エラーを返すことでリクエストの流入を抑える。
例えば、一番後続のアプリが障害を起こして、応答がなくなる。
リクエストが流れ続けるため、障害を起こしたアプリを呼び出す前段のアプリが引きずられ、スレッド枯渇やGC頻発による応答不能が発生する（ことがある）。
さらに、これを呼び出すアプリが同様に障害を起こすことで、正常なアプリへの呼び出しも行われなくなり、全体が障害となってしまう。
もし、Hystrixがアプリに組み込まれていた場合。
やはり、最下層のアプリに障害が発生し。。。
しかし、前段のアプリで、障害を検知して後続が障害の場合のロジックを通って
これによって、後続が障害により連続でエラーを返す状態になった場合にも、後続へのリクエストを中止し、負荷をかけないようにしたうえで、異常状態の対処を行う。
これが相当に便利であり、しかも後続への無駄な負荷をかけずにすむという代物でした。
今回はここまで。</description>
			<content type="html"><![CDATA[<h2 id="hystrixとは">Hystrixとは</h2>
<p>Netflixが開発したOSSで、Circuit Breakerの実装。<br>
Circuit Breakerとは、マイクロサービスで開発されたアプリケーション同士が、一つのアプリの障害で連鎖的に障害を発生させる状態を防止するための、ブレーカー的役割をする機能のこと。</p>
<p>後続のアプリケーションが障害を起こした場合、当該アプリで即エラーを返すことでリクエストの流入を抑える。</p>
<p><img src="./CircuitBreaker_01.svg" alt=""></p>
<p>例えば、一番後続のアプリが障害を起こして、応答がなくなる。</p>
<p><img src="./CircuitBreaker_02.svg" alt=""></p>
<p>リクエストが流れ続けるため、障害を起こしたアプリを呼び出す前段のアプリが引きずられ、スレッド枯渇やGC頻発による応答不能が発生する（ことがある）。</p>
<p><img src="./CircuitBreaker_03.svg" alt=""></p>
<p>さらに、これを呼び出すアプリが同様に障害を起こすことで、正常なアプリへの呼び出しも行われなくなり、全体が障害となってしまう。</p>
<p><img src="./CircuitBreaker_04.svg" alt=""></p>
<p>もし、Hystrixがアプリに組み込まれていた場合。</p>
<p><img src="./CircuitBreaker_05.svg" alt=""></p>
<p>やはり、最下層のアプリに障害が発生し。。。</p>
<p><img src="./CircuitBreaker_06.svg" alt=""></p>
<p>しかし、前段のアプリで、障害を検知して後続が障害の場合のロジックを通って</p>
<p><img src="./CircuitBreaker_07.svg" alt=""></p>
<p>これによって、後続が障害により連続でエラーを返す状態になった場合にも、後続へのリクエストを中止し、負荷をかけないようにしたうえで、異常状態の対処を行う。</p>
<p>これが相当に便利であり、しかも後続への無駄な負荷をかけずにすむという代物でした。</p>
<p>今回はここまで。</p>
]]></content>
		</item>
		
		<item>
			<title>hugoにgoogleアナリティクスを導入</title>
			<link>https://pages.shibadog.net/posts/hugo_analytics/</link>
			<pubDate>Thu, 17 Oct 2019 09:55:20 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/hugo_analytics/</guid>
			<description>とりあえずgoogle analyticsが標準対応との記述を公式ドキュメントで見つけたのでやっておく。
1. google analyticsにログイン 2. 新規プロパティを作成 ハマったこと ウェブを選択。
アプリとウェブだとうまくできなかった（よくよめよ）
3. トラッキングIDをコピー プロパティのメニューから選ぶ
4. config.toml に追加 baseURL = &amp;#34;https://shibadog.github.io/&amp;#34; languageCode = &amp;#34;ja-jp&amp;#34; title = &amp;#34;shibadog site&amp;#34; theme = &amp;#34;hermit&amp;#34; googleAnalytics = &amp;#34;UA-999999999-9&amp;#34; [author] name = &amp;#34;shibadog&amp;#34; : : 参考 AGO&amp;rsquo;s page - hugoにgoogle アナリティクスを導入した話 なかけんのHugoノート - 画像を追加しよう </description>
			<content type="html"><![CDATA[<p>とりあえずgoogle analyticsが標準対応との記述を<a href="https://gohugo.io/templates/internal/#google-analytics">公式ドキュメント</a>で見つけたのでやっておく。</p>
<h2 id="1-google-analyticsにログイン">1. google analyticsにログイン</h2>
<h2 id="2-新規プロパティを作成">2. 新規プロパティを作成</h2>
<p><img src="./image1.png" alt="プロパティの種類"></p>
<h3 id="ハマったこと">ハマったこと</h3>
<p>ウェブを選択。<br>
アプリとウェブだとうまくできなかった（よくよめよ）</p>
<h2 id="3-トラッキングidをコピー">3. トラッキングIDをコピー</h2>
<p>プロパティのメニューから選ぶ</p>
<p><img src="./image2.png" alt="トラッキングIDの場所"></p>
<h2 id="4-configtoml-に追加">4. <code>config.toml</code> に追加</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-config.toml" data-lang="config.toml"><span style="display:flex;"><span><span style="color:#a6e22e">baseURL</span> = <span style="color:#e6db74">&#34;https://shibadog.github.io/&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">languageCode</span> = <span style="color:#e6db74">&#34;ja-jp&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">title</span> = <span style="color:#e6db74">&#34;shibadog site&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">theme</span> = <span style="color:#e6db74">&#34;hermit&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">googleAnalytics</span> = <span style="color:#e6db74">&#34;UA-999999999-9&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">author</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">name</span> = <span style="color:#e6db74">&#34;shibadog&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span></code></pre></div><h2 id="参考">参考</h2>
<ul>
<li><a href="https://agodoriru.github.io/post/20171218/">AGO&rsquo;s page - hugoにgoogle アナリティクスを導入した話</a></li>
<li><a href="https://hugo.nakaken88.com/use/image/">なかけんのHugoノート - 画像を追加しよう</a></li>
</ul>
]]></content>
		</item>
		
		<item>
			<title>My First Post</title>
			<link>https://pages.shibadog.net/posts/my-first-post/</link>
			<pubDate>Tue, 15 Oct 2019 23:52:59 +0900</pubDate>
			
			<guid>https://pages.shibadog.net/posts/my-first-post/</guid>
			<description>ブログをまたやりたいと思い、 Hugo という静的サイトジェネレータと GitHub Pages を使って作ってみた。
3日坊主にならないことを祈る。
しかし、このHugoというやつ結構楽しい。 まずはこれを使いこなせるようになりたい。。。</description>
			<content type="html"><![CDATA[<p>ブログをまたやりたいと思い、 <code>Hugo</code> という静的サイトジェネレータと <code>GitHub Pages</code> を使って作ってみた。</p>
<p>3日坊主にならないことを祈る。</p>
<p>しかし、このHugoというやつ結構楽しい。
まずはこれを使いこなせるようになりたい。。。</p>
]]></content>
		</item>
		
	</channel>
</rss>
