<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
 <channel>
  <title>シンクリッジ::xpwiki</title>
  <link>https://thinkridge.com/modules/xpwiki/index.php</link>
  <description>xpWiki RecentChanges</description>
  <language>ja</language>
  <image>
   <url>https://thinkridge.com/modules/xpwiki/index.phpmodule_icon.php</url>
   <title>シンクリッジ::xpwiki</title>
   <link>https://thinkridge.com/modules/xpwiki/index.php</link>
   <description>シンクリッジ::xpwiki</description>
  </image>
  <pubDate>Wed, 29 Oct 2025 21:41:42 +0900</pubDate>
  <lastBuildDate>Tue, 17 Feb 2026 06:34:10 +0900</lastBuildDate>
  <generator>xpWiki</generator>

<item>
 <title>技術系備忘録/Docker/WireGuard</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=113</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=113</guid>
 <pubDate>Wed, 29 Oct 2025 21:41:42 +0900</pubDate>
 <description>ものぐさな自分の目論見としては、compose.yaml に好きなコンテナをただ追記するだけでVPN先と通信できちゃうお手軽環境の構築だったのですが、そこまでは実現できておらず、各コンテナで route を追加するというひと手間が必要となっています。 当初はデフォルトゲートウェイをコンテナ（WireGuardコンテナ）へ向ければイケるハズだ！と軽く考えてたのですが　Docker の network はそれが不可らしく断念。&amp;#182; ものぐさな自分の目論見としては、compose.yaml に&#182;WireGuard を試してみました。2拠点(複数拠点)の Docker 環境をVPNで繋げてコンテナ同士をLANで繋げたいという動機からです。VPNというと本店支店の拠点間接続とかリモートワークで家から会社へ繋げるといった用途が思いつきそうですが、ここでは Docker のコンテナのみを仮想LANで繋げる形です。というわけで docker-compose としてまとめたものを github に置いてあります。https://github.com/tr-takatsuka/wireguard-b</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><ul><li>ものぐさな自分の目論見としては、compose.yaml に好きなコンテナをただ追記するだけでVPN先と通信できちゃうお手軽環境の構築だったのですが、そこまでは実現できておらず、各コンテナで route を追加するというひと手間が必要となっています。<br />
当初はデフォルトゲートウェイをコンテナ（WireGuardコンテナ）へ向ければイケるハズだ！と軽く考えてたのですが　Docker の network はそれが不可らしく断念。</li></ul>&#182;<!--ADD_TEXT_SEP-->
<p>ものぐさな自分の目論見としては、compose.yaml に好きなコンテナをただ追記するだけでVPN先と通信できちゃうお手軽環境の構築だったのですが、そこまでは実現できていません。</p>&#182;<!--ADD_TEXT_SEP-->
<p>WireGuard という新しめで且つデファクトになりそうなVPN技術を使って、小難しい設定はナシでとにかくネット越しのコンテナ同士を安全に繋げるならこんな感じかなーと思い作ってみました。</p>&#182;<!--ADD_TEXT_SEP-->
<p>他の解がないものかとAI様に質問攻めもしましたが見つけられず手詰まりでした。自分の無知っぷりに乾杯。</p>&#182;<!--ADD_TEXT_SEP-->
<p>AWSとかが用意した仕組みに全てを依存する設計のものには向いてないかもですが、オンプレサーバーやコンテナレベルで運用してるようなケースでは選択肢になるかもと思います。昨今は「ランサムウェア」が流行語ノミネートもあり得そう(個人の妄想です)なほどにバックアップの重要性は増してそうですし・・。</p></dd></dl><hr /><p>WireGuard を試してみました。2拠点(複数拠点)の Docker 環境をVPNで繋げてコンテナ同士をLANで繋げたいという動機からです。</p>
<p>VPNというと本店支店の拠点間接続とかリモートワークで家から会社へ繋げるといった用途が思いつきそうですが、ここでは Docker のコンテナのみを仮想LANで繋げる形です。</p>
<p>というわけで docker-compose としてまとめたものを github に置いてあります。<br />
<a href="https://github.com/tr-takatsuka/wireguard-bridge-docker" title="github.com/tr-takatsuka/wireguard-bridge-docker">https://github.com/tr-takatsuka/wireguard-bridge-docker</a></p>
<p>用途としては、WebサービスのDBスレーブ(セカンダリ)を遠隔地に設置するとか、データのバックアップ先を別業者のクラウドサービスに置くとかを想定しています。<br />
AWSとかが用意した仕組みに全てを依存する設計のものには向いてないかもですが、オンプレサーバーやコンテナレベルで運用してるようなケースでは選択肢になるかもと思います。昨今は「ランサムウェア」が流行語ノミネートもあり得そう(個人の妄想です)なほどにバックアップの重要性は増してそうですし・・。</p>
<p>WireGuard という新しめで且つデファクトになりそうなVPN技術を使って、小難しい設定はナシでとにかくネット越しのコンテナ同士を安全に繋げるならこんな感じかなーと思い作ってみました。<br />
VPNの対象はコンテナのみとしているのでホストOSへの影響もほぼなく（--net=host にはしていない）、上位のルーターの設定変更なども不要。<br />
鍵情報を分離し別ファイルにしてソース管理対象外にしたりと、使い勝手とセキュリティも考慮しています。</p>
<p>使い方などはコチラの <a href="https://github.com/tr-takatsuka/wireguard-bridge-docker/blob/main/README.ja.md" title="github.com/tr-takatsuka/wireguard-bridge-docker/blob/main/README.ja.md">README </a> をご参照ください。</p>
<div>
<h2>未練  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FWireGuard#z74fc717" title="z74fc717"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>ものぐさな自分の目論見としては、compose.yaml に好きなコンテナをただ追記するだけでVPN先と通信できちゃうお手軽環境の構築だったのですが、そこまでは実現できておらず、各コンテナで route を追加するというひと手間が必要となっています。<br />
当初はデフォルトゲートウェイをコンテナ（WireGuardコンテナ）へ向ければイケるハズだ！と軽く考えてたのですが　Docker の network はそれが不可らしく断念。<br />
他の解がないものかとAI様に質問攻めもしましたが見つけられず手詰まりでした。自分の無知っぷりに乾杯。<br />
もしこのあたりの知恵をお持ちの方おられましたらご教示いただきたいです。</li></ul>
<!--z74fc717--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>よもやま  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FWireGuard#u4fcf429" title="u4fcf429"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<!--u4fcf429--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>WireGuard って  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FWireGuard#f8d34f81" title="f8d34f81"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<ul><li>VPNとしては後発でかつlinuxカーネルに組み込まれてもいるので基盤技術としての安全性や将来性はたぶん問題なさそうです。<br />
そして作りがとてもシンプルらしくサポートしてるプロトコルもUDPのみという割り切りっぷり。
<ul><li>逆にいえばUDPが通らない環境だと使えない。と思うと HTTPS(TCP/443)でも通るSoftEtherの便利っぷりは未だに健在。感謝です。</li></ul></li>
<li>そしてユニークだなと思ったのは、WireGuard って内部的にはサーバークライアントの区別はなく、各端末(Peer)は全て同等という設計思想のあたり。<br />
例えば NAT内の端末同士でもUDPホールパンチングなりで穴をあけることさえできれば接続が確立できるとか。<br />
実際に試してはいませんが使い道の幅が広そうです。</li></ul><!--f8d34f81--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/Docker/Emscripten</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=112</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=112</guid>
 <pubDate>Sat, 13 Apr 2024 23:12:55 +0900</pubDate>
 <description>なお、Boost は Emscripten を公式にはサポートしていないので（OSS なのでそもそも論的にも）自己責任ではありますが、ヘッダオンリーのライブラリについては動く可能性が高そうです。&amp;#182; &amp;gt; docker run --rm --name emsdk -v $(pwd)/sample:/opt/vol -w /opt/vol -p 8080:8080 -it emsdk emrun --no_browser --port 8080 .&amp;#182; https://gith&#182;WebAssembly を使うと JavaScript 以外をブラウザで動かすことが出来ておもしろいです。Emscripten は C/C++ から WebAssembly (wasm) へのコンパイルをしてくれるもので、環境構築も難しくはありませんが docker になってると便利かなと思い作ってみました。そして C++ ならやはり Boost C++ を使いたいと考え、ヘッダのみという制限はあるものの、一応使えるようにしました。Emscripten の Docker 自体は既に存在している中</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p>なお、Boost は Emscripten を公式にはサポートしていないので（OSS なのでそもそも論的にも）自己責任ではありますが、ヘッダオンリーのライブラリについては動く可能性が高そうです。</p>&#182;<!--ADD_TEXT_SEP-->
<div><pre>&gt; docker run --rm --name emsdk -v $(pwd)/sample:/opt/vol -w /opt/vol -p 8080:8080 -it emsdk emrun --no_browser --port 8080 .</pre></div>&#182;<!--ADD_TEXT_SEP-->
<p>https://github.com/tr-takatsuka/emsdk-docker<br />
問題点やご助言などなど何かありましたら御一報いただけると幸いです。</p>&#182;<!--ADD_TEXT_SEP-->
<p>使い方の事例や CMake を利用したサンプルコードも軽く掲載しています。</p>&#182;<!--ADD_TEXT_SEP-->
<p>こんな感じでビルドできます。ビルドに必要なソースフォルダ(この例では ./sample)をマウントして emcc でビルドです。</p></dd></dl><hr /><p>WebAssembly を使うと JavaScript 以外をブラウザで動かすことが出来ておもしろいです。</p>
<p><a href="https://emscripten.org/" title="emscripten.org/">Emscripten</a> は C/C++ から WebAssembly (wasm) へのコンパイルをしてくれるもので、環境構築も難しくはありませんが docker になってると便利かなと思い作ってみました。</p>
<p>そして C++ ならやはり <a href="https://www.boost.org/" title="www.boost.org/">Boost C++</a> を使いたいと考え、ヘッダのみという制限はあるものの、一応使えるようにしました。Emscripten の Docker 自体は既に存在している中で自作した理由がコレです。<br />
なお、Boost は Emscripten を公式にはサポートしていないので（OSS なのでそもそも論的にも）自己責任ではありますが、ヘッダオンリーのライブラリについては動く可能性が高そうです。</p>
<div>
<h2>Dockerfile  <a href="https://thinkridge.com/modules/xpwiki/?pgid=112#n5f12043" title="n5f12043"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<div><pre>FROM ubuntu:22.04

RUN apt update \
 &amp;&amp; apt -y upgrade \
 &amp;&amp; apt clean &amp;&amp; rm -rf /var/lib/apt/lists/*

# timezone Asia/Tokyo ############
RUN apt update \
 &amp;&amp; apt -y install tzdata \
 &amp;&amp; apt clean &amp;&amp; rm -rf /var/lib/apt/lists/*
ENV TZ=Asia/Tokyo

# build-essential ####################
RUN apt update \
 &amp;&amp; apt -y install --no-install-recommends build-essential \
 &amp;&amp; apt clean &amp;&amp; rm -rf /var/lib/apt/lists/*

# tools ##########################
RUN apt update \
 &amp;&amp; apt -y install git cmake wget python3 \
 &amp;&amp; apt clean &amp;&amp; rm -rf /var/lib/apt/lists/*

# emscripten ##########################
ARG EMSCRIPTEN_VERSION=3.1.56
ARG EMSDKDIR=/opt/emsdk
RUN git clone https://github.com/emscripten-core/emsdk.git ${EMSDKDIR}
RUN cd ${EMSDKDIR} \
 &amp;&amp; ./emsdk install ${EMSCRIPTEN_VERSION} \
 &amp;&amp; ./emsdk activate ${EMSCRIPTEN_VERSION}
RUN echo &quot;source ${EMSDKDIR}/emsdk_env.sh&quot; &gt;&gt; ~/.bash_profile
RUN echo '#!/bin/bash\nexec /bin/bash -l -c &quot;$*&quot;' &gt; /opt/entrypoint.sh \
 &amp;&amp; chmod +x /opt/entrypoint.sh
ENTRYPOINT [&quot;/opt/entrypoint.sh&quot;]


# boost ##########################
ARG BOOST_VERSION=1.84.0
RUN wget https://github.com/boostorg/boost/releases/download/boost-${BOOST_VERSION}/boost-${BOOST_VERSION}.tar.xz \
 &amp;&amp; tar xvf boost-${BOOST_VERSION}.tar.xz \
 &amp;&amp; cd boost-${BOOST_VERSION} \
 &amp;&amp; ./bootstrap.sh \
 &amp;&amp; ./b2 headers \
 &amp;&amp; mkdir -p /opt/include \
 &amp;&amp; cp -rl boost /opt/include/boost/ \
 &amp;&amp; cd ..\
 &amp;&amp; rm -f boost*.tar.xz \
 &amp;&amp; rm -rf boost-${BOOST_VERSION} 
ENV EMCC_CFLAGS=&quot;-I /opt/include&quot;</pre></div>
<!--n5f12043--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>使い方の例  <a href="https://thinkridge.com/modules/xpwiki/?pgid=112#r84cba85" title="r84cba85"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<p>まずは普通に docker build して image を構築します。</p>
<div><pre>&gt; docker build -t emsdk .</pre></div>
<p>こんな感じでビルドできます。ビルドに必要なソースフォルダ(この例では ./sample)をマウントして emcc でビルドです。</p>
<div><pre>&gt; docker run --rm --name emsdk -v $(pwd)/sample:/opt/vol -w /opt/vol -it emsdk emcc main.cpp -s WASM=1 -o index.html</pre></div>
<ul><li><ul><li><span style="font-size:90%;line-height:130%;">なお Windows では &quot;$(pwd)&quot; はNGですが、&quot;${pwd}&quot; にすると動くようです。ただし普通のコマンドプロンプトではなく PowerShell か ターミナル であることが条件なのでしょうか。いまいちよくわかっていません。</span></li></ul></li></ul>
<p>さらに Emscripten のサーバー機能を利用するとブラウザでの確認も容易です。</p>
<div><pre>&gt; docker run --rm --name emsdk -v $(pwd)/sample:/opt/vol -w /opt/vol -p 8080:8080 -it emsdk emrun --no_browser --port 8080 .</pre></div>
<p>手元のブラウザで localhost:8080 を開くと確認できると思います。</p>
<!--r84cba85--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>github  <a href="https://thinkridge.com/modules/xpwiki/?pgid=112#d5f78452" title="d5f78452"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<p>github にも公開しておりますので、もしお役に立ちそうなら使ってみてください。<br />
<a href="https://github.com/tr-takatsuka/emsdk-docker" title="github.com/tr-takatsuka/emsdk-docker">https://github.com/tr-takatsuka/emsdk-docker</a><br />
使い方の事例や CMake を利用したサンプルコードも軽く掲載しています。<br />
問題点やご助言などなど何かありましたら御一報いただけると幸いです。</p>
<p>Emscripten と Boost の関係者の方々に感謝です。</p><!--d5f78452--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/Windows/接続されているモニタ以上の解像度でデスクトップ表示</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=111</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=111</guid>
 <pubDate>Mon, 24 Oct 2022 13:04:50 +0900</pubDate>
 <description>として起動し接続してください。4K画面としてリモートデスクトップが起動できます。&amp;#182; まずWindowsPCを2台用意しLAN接続します。仮想PCでももちろん可。（この時点でもうハードルが高いでしょうか。すみません。）&amp;#182; なお、リモートデスクトップのサーバー側(接続される側)はWindowsProエディション以上である必要があるのでそこもご注意ください&amp;#182; まずWindowsPCを2台用意しLAN接続します。（この時点でもうハードルが高いでしょうか。すみません。）&#182;たとえばデスクトップアプリ開発で、手元に4Kモニタはないけど4Kでどう表示されるのか確認したいとか、稀によくあると思います。そういう場合の小技です。まずWindowsPCを2台用意しLAN接続します。仮想PCでももちろん可。（この時点でもうハードルが高いでしょうか。すみません。）次に、片方のPCからもう片方のPCへリモートデスクトップで接続します。その際、コマンドラインから&gt; %windir%\system32\mstsc.exe -w:3840 -h:2160として起動し接続してください。4K</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p>として起動し接続してください。4K画面としてリモートデスクトップが起動できます。</p>&#182;<!--ADD_TEXT_SEP-->
<p>まずWindowsPCを2台用意しLAN接続します。仮想PCでももちろん可。（この時点でもうハードルが高いでしょうか。すみません。）</p>&#182;<!--ADD_TEXT_SEP-->
<p><span style="font-size:80%;line-height:130%;">なお、リモートデスクトップのサーバー側(接続される側)はWindowsProエディション以上である必要があるのでそこもご注意ください</span></p>&#182;<!--ADD_TEXT_SEP-->
<p>まずWindowsPCを2台用意しLAN接続します。（この時点でもうハードルが高いでしょうか。すみません。）</p>&#182;<!--ADD_TEXT_SEP-->
<p><span style="font-size:80%;line-height:130%;">(リモートデスクトップのサーバー側(接続される側)はWindowsProエディション以上である必要があるのでそこもご注意ください)</span></p></dd></dl><hr /><p>たとえばデスクトップアプリ開発で、手元に4Kモニタはないけど4Kでどう表示されるのか確認したいとか、稀によくあると思います。</p>
<p>そういう場合の小技です。</p>
<p>まずWindowsPCを2台用意しLAN接続します。仮想PCでももちろん可。（この時点でもうハードルが高いでしょうか。すみません。）</p>
<p>次に、片方のPCからもう片方のPCへリモートデスクトップで接続します。<br />
その際、コマンドラインから</p>
<pre>&gt; %windir%\system32\mstsc.exe -w:3840 -h:2160</pre>
<p>として起動し接続してください。4K画面としてリモートデスクトップが起動できます。<br />
スマートサイズ指定ONにすれば縮小された全画面が見えますし、OFFなら等倍表示(スクロールビューで表示)されます。</p>
<ul><li>-w -h の値次第でお好みの解像度が実現できます。上下限値や制限事項はよくわからないので、ご自身で色々お試しください。</li></ul>
<p>以上、どなたかのお役に立てれば幸いです。</p>
<p><span style="font-size:80%;line-height:130%;">なお、リモートデスクトップのサーバー側(接続される側)はWindowsProエディション以上である必要があるのでそこもご注意ください</span></p>

  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/C++/小技/無名関数の再帰をローテクで</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=110</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=110</guid>
 <pubDate>Thu, 14 Oct 2021 11:46:26 +0900</pubDate>
 <description>ちなみに constexpr も使えます。なので以下のように swicth～case の条件式にも書けます。&amp;#182; ・見てくれがダサい！(・・・個人の感想です)&amp;#182; Yコンビネータなる実装です。関数の引数で自分自身が与えられています。 コレの弱点としては ・あとは見てくれがダサい！(・・・個人の感想です)&amp;#182; ・ラムダではないのでキャプチャが使えない！（これはイタイ） ・つまり無名関数ではない！(・・・なので記事タイトルに偽りアリとのご指摘あればスミマセン) ・あとは見てく&#182;無名関数(ラムダ)を再帰呼び出ししたくなることが稀によくあると思います。そこで昨今ならば不動点コンビネータが定石かと思います。int fibonacci(int n) {	const auto Y = [](auto f) { return [=](auto... args) { return f(f, args...); };	};	auto f = Y([](auto f, int n)-&gt;int { return n &lt; 2 ? n : f(f, n - 1) + f(f, n - 2);</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p>ちなみに constexpr も使えます。なので以下のように swicth～case の条件式にも書けます。</p>&#182;<!--ADD_TEXT_SEP-->
<p>・見てくれがダサい！(・・・個人の感想です)</p>&#182;<!--ADD_TEXT_SEP-->
<p>Yコンビネータなる実装です。関数の引数で自分自身が与えられています。<br />
コレの弱点としては<br />
・あとは見てくれがダサい！(・・・個人の感想です)</p>&#182;<!--ADD_TEXT_SEP-->
<p>・ラムダではないのでキャプチャが使えない！（これはイタイ）<br />
・つまり無名関数ではない！(・・・なので記事タイトルに偽りアリとのご指摘あればスミマセン)<br />
・あとは見てくれがダサい！(・・・でもない？)</p>&#182;<!--ADD_TEXT_SEP-->
<p>・あとは見てくれがダサい(！・・・でもない？)</p></dd></dl><hr /><p>無名関数(ラムダ)を再帰呼び出ししたくなることが稀によくあると思います。</p>
<p>そこで昨今ならば不動点コンビネータが定石かと思います。</p>
<pre>int fibonacci(int n) {	const auto Y = [](auto f) {		return [=](auto... args) {			return f(f, args...);		};	};	auto f = Y([](auto f, int n)-&gt;int {		return n &lt; 2 ? n : f(f, n - 1) + f(f, n - 2);	});	return f(n);}int main() {	std::cout &lt;&lt; fibonacci(10) &lt;&lt; std::endl;}</pre>
<p>Yコンビネータなる実装です。関数の引数で自分自身が与えられています。<br />
これでまったく問題ありません。解決です。</p>
<p>がしかし唯一の弱点としては C++14 以上が必要になることです。</p>
<p>ですのでココでは C++14 未満でも使えるローテクな手段<br />
<strong>その場にローカルクラス(構造体)と関数を定義し再帰呼び出し</strong> です。</p>
<pre>int fibonacci(int n) {	struct F {		static int f(int n) {			return n &lt; 2 ? n : f(n - 1) + f(n - 2);		}	};	return F::f(n);}</pre>
<p>コレの弱点としては</p>
<p>・ラムダではないのでキャプチャが使えない！（これはイタイ）<br />
・つまり無名関数ではない！(・・・なので記事タイトルに偽りアリとのご指摘あればスミマセン)<br />
・見てくれがダサい！(・・・個人の感想です)</p>
<p>などありますが、関数の外(スコープ)を汚すこともなく、<br />
std::function も使わず(計ってはいませんが)遅くもなさそうで、<br />
実はコレで十分な場合も多そうです。</p>
<p>ちなみに constexpr も使えます。なので以下のように swicth～case の条件式にも書けます。</p>
<pre>int rev(int n){	struct F {		static constexpr int f(int n) {			return n &lt; 2 ? n : f(n - 1) + f(n - 2);		}	};	switch (n) {	case F::f(3):	return 3;	case F::f(4):	return 4;	case F::f(5):	return 5;	}	return -1;}</pre>
<p><br /><br />
<br /><br />
C++ は14や17になって色々と出来ることが増えてきましたが、<br />
ローカルクラス自体は C++11 未満のコンパイラ、C++03 とかでも使えるハズなので有難く思うことがあるかもしれません。</p>
<p>なお、以下サイトの記事 &quot;C++のラムダで再帰する&quot; はとても充実しており大変参考になりました。<br />
<a href="https://koturn.hatenablog.com/entry/2018/06/10/060000" title="koturn.hatenablog.com/entry/2018/06/10/060000">https://koturn.hatenablog.com/entry/2018/06/10/060000</a></p>
<p>その他、サイトで色々な情報を提供されている方々にも感謝です。<br />
ありがとうございました。</p>

  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/C++/小技</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=109</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=109</guid>
 <pubDate>Tue, 10 Aug 2021 10:22:31 +0900</pubDate>
 <description>staticメンバ変数を持つクラスをヘッダファイルのみで実現std.set map系の比較関数の新機能templateクラスの中のtemplateクラスの書き方型で条件分岐無名関数の再帰をローテクで</description>
 <content:encoded><![CDATA[
  <ul><li><a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2F%E5%B0%8F%E6%8A%80%2Fstatic%E3%83%A1%E3%83%B3%E3%83%90%E5%A4%89%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E3%83%98%E3%83%83%E3%83%80%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%81%BF%E3%81%A7%E5%AE%9F%E7%8F%BE" title="技術系備忘録/C++/小技/staticメンバ変数を持つクラスをヘッダファイルのみで実現">staticメンバ変数を持つクラスをヘッダファイルのみで実現</a>
</li><li><a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2F%E5%B0%8F%E6%8A%80%2Fstd.set%20map%E7%B3%BB%E3%81%AE%E6%AF%94%E8%BC%83%E9%96%A2%E6%95%B0%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD" title="技術系備忘録/C++/小技/std.set map系の比較関数の新機能">std.set map系の比較関数の新機能</a>
</li><li><a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2F%E5%B0%8F%E6%8A%80%2Ftemplate%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%B8%AD%E3%81%AEtemplate%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9" title="技術系備忘録/C++/小技/templateクラスの中のtemplateクラスの書き方">templateクラスの中のtemplateクラスの書き方</a>
</li><li><a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2F%E5%B0%8F%E6%8A%80%2F%E5%9E%8B%E3%81%A7%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90" title="技術系備忘録/C++/小技/型で条件分岐">型で条件分岐</a>
</li><li><a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2F%E5%B0%8F%E6%8A%80%2F%E7%84%A1%E5%90%8D%E9%96%A2%E6%95%B0%E3%81%AE%E5%86%8D%E5%B8%B0%E3%82%92%E3%83%AD%E3%83%BC%E3%83%86%E3%82%AF%E3%81%A7" title="技術系備忘録/C++/小技/無名関数の再帰をローテクで">無名関数の再帰をローテクで</a>
</li></ul>

  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/C++/小技/型で条件分岐</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=108</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=108</guid>
 <pubDate>Sun, 08 Aug 2021 22:45:20 +0900</pubDate>
 <description>ちなみに C++03 くらいのコンパイラでも RTTI がサポートされていれば同じこと（型がキーの std::map）が出来るので目新しい小技ではありません。がしかしココまでシンプルには書けません。&amp;#182; std::type_index は C++11 から使えますが、以下コードは C++17 での書式も使っています。 }&amp;#182; ちなみに C++03 くらいのコンパイラでも、RTTI がサポートされていれば同じこと（型がキーの std::map）が出来るので目新しい小技ではありません&#182;変数の型によって処理を切り替えたいことが稀によくあるんじゃないかと思います。C++ では RTTI なる情報で実行時に型を判断出来るので以下のようなコードが書けます。struct Animal {	virtual ~Animal() {}	// ポリモーフィックにする};struct Dog : public Animal {};struct Cat : public Animal {};void func(Animal* p) {	if (typeid(*p) == typeid(Dog)) </description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p>ちなみに C++03 くらいのコンパイラでも RTTI がサポートされていれば同じこと（型がキーの std::map）が出来るので目新しい小技ではありません。がしかしココまでシンプルには書けません。</p>&#182;<!--ADD_TEXT_SEP-->
<p><span style="font-size:70%;line-height:130%;">std::type_index は C++11 から使えますが、以下コードは C++17 での書式も使っています。</span><br />
}</p>&#182;<!--ADD_TEXT_SEP-->
<p>ちなみに C++03 くらいのコンパイラでも、RTTI がサポートされていれば同じこと（型がキーの std::map）が出来るので目新しい小技ではありません。がしかしココまでシンプルには書けません。</p>&#182;<!--ADD_TEXT_SEP-->
<p>ちなみに C++03 くらいのコンパイラでも RTTI がサポートされていれば、ほぼ同じこと（型がキーの std::map）が出来るので目新しい小技ではありません。がしかしココまでシンプルには書けません。</p>&#182;<!--ADD_TEXT_SEP-->
<p>ちなみに、C++03 くらいのコンパイラでも RTTI がサポートされていれば、ほぼ同じこと（型がキーの std::map）が出来るので目新しい小技ではありません。がしかしココまでシンプルには書けません。</p></dd></dl><hr /><p>変数の型によって処理を切り替えたいことが稀によくあるんじゃないかと思います。</p>
<p>C++ では RTTI なる情報で実行時に型を判断出来るので以下のようなコードが書けます。</p>
<pre>struct Animal {	virtual ~Animal() {}	// ポリモーフィックにする};struct Dog : public Animal {};struct Cat : public Animal {};void func(Animal* p) {	if (typeid(*p) == typeid(Dog)) {		// 型が Dog なら		// ・・・	} else if (typeid(*p) == typeid(Cat)) {	// 型が Cat なら		// ・・・	}}</pre>
<p><span style="font-size:70%;line-height:130%;">コンパイル時に型が判明する場合は if constexpr などもアリですが、本稿は実行時に判断する場合の話です。</span></p>
<p>これで十分事足りるのですが、もう少し粋に書きたい場合もあると思います。<br />
if 文の羅列ではなく switch～case みたいな感じで。<br />
がしかし switch～case で分岐できる式は整定数式のみです。<br />
そこで、switch～case とまではいきませんがそれっぽい条件分岐として std::type_index をキーにした std::map を使った書き方です。</p>
<p><span style="font-size:70%;line-height:130%;">std::type_index は C++11 から使えますが、以下コードは C++17 での書式も使っています。</span></p>
<pre>int main(void){	using namespace std;	// クラス定義	struct Car {		virtual ~Car() {}	};	struct Nissan : public Car {};	struct Silvia : public Nissan {};	struct Skyline : public Nissan {};	struct Toyota : public Car {};	struct Chaser : public Toyota {};	const std::vector&lt;std::shared_ptr&lt;Car&gt;&gt; v = {	// サンプル		make_shared&lt;Nissan&gt;(),		make_shared&lt;Silvia&gt;(),		make_shared&lt;Skyline&gt;(),		make_shared&lt;Toyota&gt;(),		make_shared&lt;Chaser&gt;(),		make_shared&lt;Car&gt;(),	};	// それぞれの型に対応したコードを std::map で構築	// 注: static 変数であることが実行速度では有利です(この例では1度しか通らないのでアレですが・・)	static const std::map&lt;std::type_index, std::function&lt;void(void)&gt;&gt; map = {		{typeid(Nissan), [] {			cout &lt;&lt; &quot;NISSAN&quot; &lt;&lt; endl;		}},		{typeid(Silvia), [] {			cout &lt;&lt; &quot;NISSAN SILVIA&quot; &lt;&lt; endl;		}},		{typeid(Skyline), [] {			cout &lt;&lt; &quot;NISSAN SKYLINE&quot; &lt;&lt; endl;		}},		{typeid(Toyota), [] {			cout &lt;&lt; &quot;TOYOTA&quot; &lt;&lt; endl;		}},		{typeid(Chaser), [] {			cout &lt;&lt; &quot;TOYOTA CHASER&quot; &lt;&lt; endl;		}},	};	for (const auto i : v) {		if (auto j = map.find(typeid(*i)); j != map.end()) {	// mapから検索			j-&gt;second();										// 実行		} else {			cout &lt;&lt; &quot;unknown&quot; &lt;&lt; endl;							// 定義ナシ		}	}}</pre>
<div><pre>実行結果
NISSAN
NISSAN SILVIA
NISSAN SKYLINE
TOYOTA
TOYOTA CHASER
unknown</pre></div>
<p>この程度のボリュームの例でも、if 文の羅列よりは見通しもよいかなーと思います。</p>
<p>ちなみに C++03 くらいのコンパイラでも RTTI がサポートされていれば同じこと（型がキーの std::map）が出来るので目新しい小技ではありません。がしかしココまでシンプルには書けません。<br />
C++は難しげな機能も沢山追加されていますが地味な改修もとても有難いです。<br />
C++関係者の皆様には感謝です。</p>

  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/Docker/サーバー死活監視スクリプト</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=107</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=107</guid>
 <pubDate>Thu, 10 Jun 2021 17:07:46 +0900</pubDate>
 <description>サーバーにアクセスしエラーだったらメールで通知します。それを cron で定期的に実行します。&amp;#182; &amp;#35; 'チェックするURL | エラー発生メールの宛先'&amp;#182; せっかくなので Docker Compose を使って最小限の記述をするだけで構築できる形にしています。&amp;#182; これまでは windows 上で同様のことをしておりました。特に不都合もなかったのですが環境自体もかなり古くなったこともありシェルスクリプトで作ってみました。&amp;#182; &amp;#35; wget でチ&#182;サーバーの死活監視スクリプトです。サーバーにアクセスしエラーだったらメールで通知します。それを cron で定期的に実行します。というような簡素な機能しかありませんが事足りることも多いので。これまでは windows 上で同様のことをしておりました。特に不都合もなかったのですが環境自体もかなり古くなったこともありシェルスクリプトで作ってみました。せっかくなので Docker Compose を使って最小限の記述をするだけで構築できる形にしています。いろいろなサイトの情報を参考にさせてもらっていま</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p>サーバーにアクセスしエラーだったらメールで通知します。それを cron で定期的に実行します。</p>&#182;<!--ADD_TEXT_SEP-->
<p>&#35;	'チェックするURL | エラー発生メールの宛先'</p>&#182;<!--ADD_TEXT_SEP-->
<p>せっかくなので Docker Compose を使って最小限の記述をするだけで構築できる形にしています。</p>&#182;<!--ADD_TEXT_SEP-->
<p>これまでは windows 上で同様のことをしておりました。特に不都合もなかったのですが環境自体もかなり古くなったこともありシェルスクリプトで作ってみました。</p>&#182;<!--ADD_TEXT_SEP-->
<p>&#35; 	wget でチェックし、200 以外はエラーとしています</p></dd></dl><hr />
<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li>  docker-compose ファイル一覧 
<ul><li>  docker-compose.yml </li>
<li>  Dockerfile </li>
<li>  cron.sh </li></ul></li></ul>
 </div>
</div>
<!--/description ignore-->

<p>サーバーの死活監視スクリプトです。</p>
<p>サーバーにアクセスしエラーだったらメールで通知します。それを cron で定期的に実行します。<br />
というような簡素な機能しかありませんが事足りることも多いので。</p>
<p>これまでは windows 上で同様のことをしておりました。特に不都合もなかったのですが環境自体もかなり古くなったこともありシェルスクリプトで作ってみました。<br />
せっかくなので Docker Compose を使って最小限の記述をするだけで構築できる形にしています。</p>
<p>いろいろなサイトの情報を参考にさせてもらっています。ありがとうございます。</p>
<div>
<h2>docker-compose ファイル一覧  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2F%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%AD%BB%E6%B4%BB%E7%9B%A3%E8%A6%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88#e07d882e" title="e07d882e"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<div><pre>├ docker-compose.yml
├ Dockerfile
└ cron.sh</pre></div>
<!--e07d882e--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>docker-compose.yml  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2F%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%AD%BB%E6%B4%BB%E7%9B%A3%E8%A6%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88#t3e9ed12" title="t3e9ed12"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<pre>version: '3'services:  centos7:    build: ./    volumes:      - ./cron.sh:/opt/cron.sh    environment:      TZ: Asia/Tokyo    container_name: &quot;healthcheck-centos7&quot;#   restart: always</pre>
<!--t3e9ed12--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>Dockerfile  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2F%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%AD%BB%E6%B4%BB%E7%9B%A3%E8%A6%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88#tb7c509e" title="tb7c509e"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<pre>FROM centos:centos7RUN yum -y update# wget mailx cron インストールRUN yum -y install wget mailx cronie# .mailrc (SMTP)# 環境に合わせて記述してくださいRUN echo $'\n\#set smtp-use-starttls\n\set smtp=smtp://mail.example.com:587\n\set smtp-auth=login\n\set smtp-auth-user=info@example.com\n\set smtp-auth-password=○○○○○○○\n\set from=&quot;info@example.com&quot;\n\set ssl-verify=ignore\n\' &gt; /root/.mailrc# 15分毎に cron.sh を実行しますCMD chmod 744 /opt/cron.sh \  ; (echo &quot;*/15 * * * * /opt/cron.sh &gt; /dev/null 2&gt;&amp;1&quot;) | crontab - \  ; (crond -n &amp;) \  ; sleep infinity</pre>
<!--tb7c509e--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>cron.sh  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2F%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%AD%BB%E6%B4%BB%E7%9B%A3%E8%A6%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88#kf8282c9" title="kf8282c9"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<pre>#!/bin/bashitems=(#	以下に監視対象を記述してください#	'チェックするURL | エラー発生メールの宛先'	'https://www.example.com/|rb20det@example.com'	'http://www2.example.com/|jzx80@example.com,ae86@example.com')for item in ${items[@]}; do	IFS='|' read -r url mailto &lt;&lt;&lt; &quot;$item&quot;# 	wget でチェックし、200 以外はエラーとしています	result=`wget --spider -nv --timeout 30 -t 5 $url 2&gt;&amp;1`	ok=`echo &quot;$result&quot; | grep -c '200 OK'`	if [ $ok -eq 0 ]; then		subject=&quot;failed. ${url}&quot;		echo $result | mailx -s &quot;$subject&quot; &quot;$mailto&quot;	fidone</pre><!--kf8282c9--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/C++/Boost/boost.formatを使った文字列フォーマット。printf系関数を置き換え</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=90</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=90</guid>
 <pubDate>Mon, 29 Mar 2021 11:51:39 +0900</pubDate>
 <description>github にも公開しました rlib-StringFormat&amp;#182; こちらのコードでは printf っぽい書式しか使っておりませんが、中身は boost::format です。書式の詳細はそちらのリファレンスもご参照下さい。&amp;#182; こちらのコードでは、printf っぽい書式しか使っておりませんが、中身は boost::format です。書式の詳細はそちらのリファレンスもご参照下さい。&amp;#182; namespace rlib using namespace rlib::s&#182;C++ だと文字列をフォーマットするコードって結構大変です。C++11(14) になって色々な選択肢は増えたんですが、いまいち決定打に欠けると言いますか・・。というわけで boost です。boost::format を使った文字列フォーマットです。% で繋げることなく、可変引数テンプレートを使って printf 風に使えるようにしてみました。boost::format の機能のおかげで、型安全で例外が発生することもないようにしています。例えばアプリで処理失敗が発生したときに、アプリログを残す際</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><div>
<h4>github にも公開しました  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h4>
<p>rlib-StringFormat</p><!--t8d2d48e--></div>&#182;<!--ADD_TEXT_SEP-->
<ul><li>こちらのコードでは printf っぽい書式しか使っておりませんが、中身は boost::format です。書式の詳細はそちらのリファレンスもご参照下さい。</li></ul>&#182;<!--ADD_TEXT_SEP-->
<ul><li>こちらのコードでは、printf っぽい書式しか使っておりませんが、中身は boost::format です。書式の詳細はそちらのリファレンスもご参照下さい。</li></ul>&#182;<!--ADD_TEXT_SEP-->
<p>namespace rlib</p>
<div><pre>	using namespace rlib::string;</pre></div>&#182;<!--ADD_TEXT_SEP-->
<p>namespace trlib</p>
<div><pre>	using namespace trlib::string;
	auto tr = String::Format(_T(&quot;%s FC3S %s&quot;),t0,t1);		// tr = _T(&quot;マツダ FC3S 13B-T&quot;)  vc の CString版</pre></div></dd></dl><hr /><p>C++ だと文字列をフォーマットするコードって結構大変です。<br />
C++11(14) になって色々な選択肢は増えたんですが、いまいち決定打に欠けると言いますか・・。</p>
<p>というわけで boost です。boost::format を使った文字列フォーマットです。<br />
% で繋げることなく、可変引数テンプレートを使って printf 風に使えるようにしてみました。<br />
boost::format の機能のおかげで、型安全で例外が発生することもないようにしています。</p>
<p><span style="font-size:80%;line-height:130%;">例えばアプリで処理失敗が発生したときに、アプリログを残す際に sprintf などを使ってフォーマットしてるような場合、その書式をミスっていたりすると、アプリが落ちたりしちゃいます。<br />レアケース（処理失敗）を考慮したコードを書いたつもりが、再現率が低く修正しにくい致命的なバグを生んでしまったりするので、できれば、こういう箇所は特に安全に書いておきたいなと思う次第。<br />というわけで、</span></p>
<p>printf 系の関数は（windows の CString::Format とかも）使わないほうが安全です。<br />
がしかし printf 系の使いやすさは捨て難いです。慣れちゃってもいるし。</p>
<p>そんなわけで printf 風の書き方も出来てしまう boost::format はすごく便利です。<br />
開発者の方に感謝しつつ使わせていただこうと思います。</p>

<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li><ul><li>  2021/3 追記 
<ul><li>  github にも公開しました </li>
<li>  よもやま </li></ul></li></ul></li>
<li>  コード </li>
<li>  使い方の例 </li>
<li>  以前の版 </li>
<li>  追記履歴 </li></ul>
 </div>
</div>
<!--/description ignore-->

<div>
<h3>2021/3 追記  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FBoost%2Fboost.format%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%82printf%E7%B3%BB%E9%96%A2%E6%95%B0%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88#icd7a123" title="icd7a123"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<p>C++17 を前提にコードを刷新いたしました。<br />
と同時に、色々な型を展開して出力する機能を追加してみました。</p>
<p>基本的な使い方は変わってませんが、引数に渡せる型を景気よく増やしてみました。</p>
<p>std::pair std::tuple<br />
std::unique_ptr std::shared_ptr std::optional<br />
std::array std::vector std::list std::deque std::initializer_list<br />
std::set std::multiset std::map std::multimap</p>
<p>これらが渡された場合は、その中身を出力します。</p>
<p><span style="font-size:80%;line-height:130%;">std::tuple や std::unique_ptr などは、まぁ使い勝手が良くなったかなと感じますが、std::vector や std::map などのコンテナまで対応してしまったのはやりすぎかもしれません。<br />このあたりは実際に使う場合には要調整かなと思います。</span></p>
<!--icd7a123--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>github にも公開しました  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FBoost%2Fboost.format%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%82printf%E7%B3%BB%E9%96%A2%E6%95%B0%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88#t8d2d48e" title="t8d2d48e"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<p><a href="https://github.com/tr-takatsuka/rlib-StringFormat" title="github.com/tr-takatsuka/rlib-StringFormat">rlib-StringFormat</a></p>
<!--t8d2d48e--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>よもやま  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FBoost%2Fboost.format%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%82printf%E7%B3%BB%E9%96%A2%E6%95%B0%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88#c622d3f0" title="c622d3f0"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<p>C++17 の if constexpr はとても便利だなと感じます。<br />
その分、昨今のC++の発展っぷりに付いていくことは、自分程度のスペックだととても大変です。C++20 や 23 の話題もあるし・・。<br />
そのため、わからないことはすぐにネットで答えを探しています。色々な情報を提供してくれている方々には感謝しかありません。<br />
そしてここまで複雑な(と自分は思う) C++言語の、仕様決めをしている方々ももちろんですが、コンパイラを作っていらっしゃる方々には、畏敬の念を通り越して畏怖の念すら感じざるを得ません！<br />
ありがとうございます。</p>
<!--c622d3f0--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>コード  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FBoost%2Fboost.format%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%82printf%E7%B3%BB%E9%96%A2%E6%95%B0%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88#rad4fc7a" title="rad4fc7a"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>StringFormat.h</li></ul>
<pre>#include &lt;boost/format.hpp&gt;namespace rlib{	namespace string	{		namespace inner		{			template&lt;class&gt; struct IsArray : std::false_type {};			template&lt;class T, std::size_t N&gt; struct IsArray&lt;std::array&lt;T, N&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsVector : std::false_type {};			template&lt;class T1, class T2&gt; struct IsVector&lt;std::vector&lt;T1, T2&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsList : std::false_type {};			template&lt;class T1, class T2&gt; struct IsList&lt;std::list&lt;T1, T2&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsDeque : std::false_type {};			template&lt;class T1, class T2&gt; struct IsDeque&lt;std::deque&lt;T1, T2&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsInitializerList : std::false_type {};			template&lt;class T&gt; struct IsList&lt;std::initializer_list&lt;T&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsSet : std::false_type {};			template&lt;class T1, class T2, class T3&gt; struct IsSet&lt;std::set&lt;T1, T2, T3&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsMultiSet : std::false_type {};			template&lt;class T1, class T2, class T3&gt; struct IsMultiSet&lt;std::multiset&lt;T1, T2, T3&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsMap : std::false_type {};			template&lt;class T1, class T2, class T3, class T4&gt; struct IsMap&lt;std::map&lt;T1, T2, T3, T4&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsMultiMap : std::false_type {};			template&lt;class T1, class T2, class T3, class T4&gt; struct IsMultiMap&lt;std::multimap&lt;T1, T2, T3, T4&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsPair : std::false_type { };			template&lt;class T1, class T2&gt; struct IsPair&lt;std::pair&lt;T1,T2&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsUniquePtr : std::false_type {};			template&lt;class T1, class T2&gt; struct IsUniquePtr&lt;std::unique_ptr&lt;T1,T2&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsSharedPtr : std::false_type {};			template&lt;class T&gt; struct IsSharedPtr&lt;std::shared_ptr&lt;T&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsOptional : std::false_type {};			template&lt;class T&gt; struct IsOptional&lt;std::optional&lt;T&gt;&gt; :std::true_type {};			template&lt;class&gt; struct IsTuple : std::false_type {};			template&lt;class... T&gt; struct IsTuple&lt;std::tuple&lt;T...&gt;&gt; :std::true_type {};			template &lt;class CharT, class Head, class... Tail&gt; void f(boost::basic_format&lt;CharT&gt;&amp;, Head&amp;, Tail&amp;&amp;...);			template &lt;class CharT&gt; void f(const boost::basic_format&lt;CharT&gt;&amp;) {}			template &lt;std::size_t I, class CharT, class... T, class... Tail&gt; void f(boost::basic_format&lt;CharT&gt;&amp; format, const std::tuple&lt;T...&gt;&amp; head, Tail&amp;&amp;... tail) {				if constexpr (I &lt; sizeof...(T)) {					f&lt;I + 1, CharT&gt;(format % std::get&lt;I&gt;(head), head, tail...);				} else {					f&lt;CharT&gt;(format, tail...);				}			}			template &lt;class CharT, class Head, class... Tail&gt; void f(boost::basic_format&lt;CharT&gt;&amp; format, Head&amp; head, Tail&amp;&amp;... tail) {				using HeadT = std::remove_const_t&lt;Head&gt;;				if constexpr (IsUniquePtr&lt;HeadT&gt;::value|| IsSharedPtr&lt;HeadT&gt;::value|| IsOptional&lt;HeadT&gt;::value) {					if (head) {						f&lt;CharT&gt;(format, *head, tail...);					} else {						f&lt;CharT&gt;(format % &quot;(null)&quot;, tail...);					}				} else if constexpr (IsPair&lt;HeadT&gt;::value) {					f&lt;CharT&gt;(format, head.first, head.second, tail...);				} else if constexpr (IsTuple&lt;HeadT&gt;::value) {					f&lt;0, CharT&gt;(format, head, tail...);				} else if constexpr (IsArray&lt;HeadT&gt;::value || IsVector&lt;HeadT&gt;::value || IsList&lt;HeadT&gt;::value || IsDeque&lt;HeadT&gt;::value || IsInitializerList&lt;HeadT&gt;::value || IsSet&lt;HeadT&gt;::value || IsMultiSet&lt;HeadT&gt;::value || IsMap&lt;HeadT&gt;::value || IsMultiMap&lt;HeadT&gt;::value) {	// 範囲ループ可の型か？っていう便利記述がもしあるなら知りたい					for (const auto&amp; i : head) {						f&lt;CharT&gt;(format, i);					}					f&lt;CharT&gt;(format, tail...);#ifdef _MSC_VER				} else if constexpr (std::is_same_v&lt;HeadT, CStringA&gt; || std::is_same_v&lt;HeadT, CStringW&gt;) {					f&lt;CharT&gt;(format % std::basic_string&lt;CharT&gt;(head.GetString()), tail...);#endif				} else {					f&lt;CharT&gt;(format % head, tail...);				}			}		}		template &lt;class CharT, class... Args&gt; std::basic_string&lt;CharT&gt; format(const CharT* lpszFormat, Args&amp;&amp;... args) {			boost::basic_format&lt;CharT&gt; format;			format.exceptions(boost::io::no_error_bits);	// 例外を発生させない			format.parse(lpszFormat);			try {				inner::f&lt;CharT&gt;(format, args...);			} catch (...) {			}			return format.str();		}		template &lt;class CharT, class... Args&gt; std::basic_string&lt;CharT&gt; format(const std::basic_string&lt;CharT&gt;&amp; s, Args&amp;&amp;... args) {			return format&lt;CharT&gt;(s.c_str(), args...);		}	}}</pre>
<!--rad4fc7a--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>使い方の例  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FBoost%2Fboost.format%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%82printf%E7%B3%BB%E9%96%A2%E6%95%B0%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88#k9d70102" title="k9d70102"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>こちらのコードでは printf っぽい書式しか使っておりませんが、中身は boost::format です。書式の詳細はそちらのリファレンスもご参照下さい。</li></ul>
<pre>#include &quot;StringFormat.h&quot;	// ヘッダをインクルードするのみで使えますvoid main() {	using namespace rlib::string;	{// 普通の使い方		std::string r = format(u8&quot;%s %dSX SR%dDE%s&quot;, u8&quot;日産&quot;, 180, 20, &quot;T&quot;);  // &quot;日産 180SX SR20DET&quot;	}	{// std::wstring も可です		std::wstring r = format(L&quot;BNR%d RB%dDE%s&quot;, 32, 26, L&quot;TT&quot;);	// L&quot;BNR32 RB26DETT&quot;	}	{// 適してない型でも例外発生しません		std::string r = format(&quot;%dSX %s&quot;, 240, L&quot;日産&quot;);	// &quot;240SX 00007FF742CC123C&quot;	}	{// std::string をそのまま書けます。c_str() が不要なので便利。		const std::string a = u8&quot;トヨタ&quot;;		std::string b = &quot;1JZ-GTE&quot;;		std::string r = format(&quot;%s jzx90 %s&quot;, a, b);	// &quot;トヨタ jzx90 1JZ-GTE&quot;	}#ifdef _MSC_VER	{// VisualStudio の CString		CString t0(_T(&quot;マツダ&quot;));		const CString t1(_T(&quot;13B-T&quot;));		auto r = format(_T(&quot;%s FC3S %s&quot;), t0, t1);	// L&quot;マツダ FC3S 13B-T&quot;	}#endif	{// std::tuple std::pair は展開します。		std::tuple&lt;std::string, int, double&gt; a{ &quot;RPS13&quot;,1998,11.8 };		const std::pair&lt;std::string, int&gt; b{ &quot;FR&quot;, 1848000 };		auto r = format(			// &quot;形式:RPS13 排気量:1998cc 燃費:11.8km/l 駆動方式:FR 価格:1848000円&quot;			u8&quot;形式:%s 排気量:%dcc 燃費:%.1fkm/l 駆動方式:%s 価格:%d円&quot;, a, b);	}	{// std::unique_ptr std::shared_ptr std::optional は中身を出力にします。空(無効)の場合は&quot;(null)&quot;を出力します		std::unique_ptr&lt;int&gt; u = std::make_unique&lt;int&gt;(1);		std::shared_ptr&lt;int&gt; s = std::make_shared&lt;int&gt;(2);		std::optional&lt;int&gt; o(3);		std::optional&lt;int&gt; e;		auto r = format(&quot;%d,%d,%d,%d&quot;, u, s, o, e);	// &quot;1,2,3,(null)&quot;	}	{// その他コンテナも展開します。(やりすぎかもしれません。素直にコンパイルエラーに振ってもよいかも。)		auto r0 = format(&quot;%d,%d,%d&quot;, std::array&lt;int, 3&gt;{ 1, 2, 3 });	// &quot;1,2,3&quot;		auto r1 = format(&quot;%d,%d,%d&quot;, std::vector&lt;int&gt;{4, 5, 6});		// &quot;4,5,6&quot;		auto r2 = format(&quot;%d,%d,%d&quot;, std::list&lt;int&gt;{7, 8, 9});			// &quot;7,8,9&quot;		auto r3 = format(&quot;%d,%d,%d&quot;, std::deque&lt;int&gt;{10, 11, 12});		// &quot;10,11,12&quot;		auto r4 = format(&quot;%d,%d,%d&quot;, std::set&lt;int&gt;{3, 2, 1});			// &quot;1,2,3&quot; 取れる順で出力します(以下同様)		auto r5 = format(&quot;%d,%d,%d&quot;, std::map&lt;int, int&gt;{ {1, 2}, { 3,4 }});		// &quot;1,2,3&quot;		auto r6 = format(&quot;%d,%d,%d&quot;, std::multiset&lt;int&gt;{1, 2, 3});				// &quot;1,2,3&quot;		auto r7 = format(&quot;%d,%d,%d&quot;, std::multimap&lt;int, int&gt;{ {1, 2}, { 3,4 }});// &quot;1,2,3&quot;	}	{// コンテナの中も再帰で展開するので以下みたいな型も可です		std::map&lt;int, std::pair&lt;std::string, std::vector&lt;int&gt;&gt;&gt; m{			{1, {&quot;a&quot;, {5,6,7}}},			{8, {&quot;b&quot;, {9,10}}}		};		auto r = format(&quot;%s,%s,%s,%s,%s,%s&quot;, m);	// &quot;1,a,5,6,7,8&quot;	}	{// boost::format なので未対応の型はコンパイルエラーになってくれます		std::function&lt;void()&gt; f;		auto r = format(&quot;%s&quot;, f);	// コンパイルエラー	}</pre>
<!--k9d70102--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>以前の版  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FBoost%2Fboost.format%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%82printf%E7%B3%BB%E9%96%A2%E6%95%B0%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88#jf4a2124" title="jf4a2124"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<table cellpadding="1" cellspacing="2" style="width:auto;"><tr>
<td valign="top">
	<span style="cursor:pointer;font-weight:normal;font-size:10px;font-family:monospace;border:gray 1px solid;"
>+</span>
</td><td style="font-size:1pt;border:gray 1px;border-style:none;">&nbsp;</td><td style="color:gray;border:gray 1px solid;display:block;">以前の版</td><td valign="top" style="display:none;">
<pre>namespace String{template &lt;class CharT&gt; std::basic_string&lt;CharT&gt; Format(const boost::basic_format&lt;CharT&gt; &amp;format){	return format.str();}#ifdef _MSC_VER	// VisualC++ の CString 対応template &lt;class CharT,class... Tail&gt; std::basic_string&lt;CharT&gt; Format(boost::basic_format&lt;CharT&gt; &amp;format,CStringA&amp; head,Tail&amp;&amp;... tail){	return Format&lt;CharT&gt;( format % std::basic_string&lt;CharT&gt;(head), tail... );}template &lt;class CharT,class... Tail&gt; std::basic_string&lt;CharT&gt; Format(boost::basic_format&lt;CharT&gt; &amp;format,const CStringA&amp; head,Tail&amp;&amp;... tail){	return Format&lt;CharT&gt;( format % std::basic_string&lt;CharT&gt;(head), tail... );}template &lt;class CharT,class... Tail&gt; std::basic_string&lt;CharT&gt; Format(boost::basic_format&lt;CharT&gt; &amp;format,CStringW&amp; head,Tail&amp;&amp;... tail){	return Format&lt;CharT&gt;( format % std::basic_string&lt;CharT&gt;(head), tail... );}template &lt;class CharT,class... Tail&gt; std::basic_string&lt;CharT&gt; Format(boost::basic_format&lt;CharT&gt; &amp;format,const CStringW&amp; head,Tail&amp;&amp;... tail){	return Format&lt;CharT&gt;( format % std::basic_string&lt;CharT&gt;(head), tail... );}#endiftemplate &lt;class CharT,class Head,class... Tail&gt; std::basic_string&lt;CharT&gt; Format(boost::basic_format&lt;CharT&gt; &amp;format,Head&amp;&amp; head, Tail&amp;&amp;... tail){	return Format&lt;CharT&gt;( format % head, tail... );}template &lt;class CharT,class... Args&gt; std::basic_string&lt;CharT&gt; Format(const CharT *lpszFormat,Args&amp;&amp;... args){	boost::basic_format&lt;CharT&gt; format;	format.exceptions( boost::io::no_error_bits );	// 例外を発生させない	format.parse(lpszFormat);	return Format&lt;CharT&gt;(format,args...);}}// 使い方例int main(){	std::string s0 = String::Format( &quot;%s %dSX SR%dDE%s&quot;, &quot;日産&quot;, 180, 20, &quot;T&quot; );	// s0 = &quot;日産 180SX SR20DET&quot;	std::wstring ws0 = String::Format( L&quot;BNR%d RB%dDE%s&quot;, 32, 26, L&quot;TT&quot; );			// ws0 = L&quot;BNR32 RB26DETT&quot;  std::wstring も可です	std::string s1 = String::Format( &quot;%s %dSX SR%dDE%s&quot;, 180, 20, &quot;T&quot;, L&quot;日産&quot; );	// s1 = &quot;180 20SX SRTDE01909714&quot;  例外発生しません	const std::string s2a = u8&quot;トヨタ&quot;;	const std::string s2b = &quot;1JZ-GTE&quot;;	std::string s2c = String::Format( &quot;%s jzx90 %s&quot;, s2a, s2b );	// s2c = &quot;トヨタ jzx90 1JZ-GTE&quot;  std::string をそのまま書けます。 c_str() は不要です。便利！	CString t0(_T(&quot;マツダ&quot;));	const CString t1(_T(&quot;13B-T&quot;));	auto tr = String::Format(_T(&quot;%s FC3S %s&quot;),t0,t1);		// tr = _T(&quot;マツダ FC3S 13B-T&quot;)  vc の CString版}</pre>
</td></tr></table>
<!--jf4a2124--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>追記履歴  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FBoost%2Fboost.format%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%82printf%E7%B3%BB%E9%96%A2%E6%95%B0%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88#p57d9c21" title="p57d9c21"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>C++17 を使って諸々改修した版を追加しました 2021/3</li>
<li>CString 対応コードを追加しました 2019/5/15</li></ul><!--p57d9c21--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/VMware/Ubuntu8.10にVMwareServer1.0をインストール</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=106</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=106</guid>
 <pubDate>Wed, 21 Oct 2020 12:55:12 +0900</pubDate>
 <description>こちらのページを参考にし、手元で試した結果をシンプルにまとめました。ありがとうございます。&amp;#182; &amp;quot;old-releases.ubuntu.com&amp;quot; 等で検索すると色々と出てきます。感謝です。&amp;#182; (以降の解説は root で行っていますので、必要に応じて sudo するなりして下さい。)&amp;#182; 以降の解説は root で行っていますので、必要に応じて sudo するなりして下さい。&amp;#182; 今日時点(2020年10月)、Ubuntu 8.10 はサポ&#182;Ubuntu8.10 に VMwareServer1.0 をインストールする方法です。どちらもかなり古いバージョンなのですが、野暮い用事のために試したところ、ちょっと躓いたので備忘録として残しておきます。こちらのページを参考にし、手元で試した結果をシンプルにまとめました。ありがとうございます。https://www.howtoforge.com/how-to-install-vmware-server-1.0.x-on-an-ubuntu-8.10-desktopubuntu-8.10-desk</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p>こちらのページを参考にし、手元で試した結果をシンプルにまとめました。ありがとうございます。</p>&#182;<!--ADD_TEXT_SEP-->
<ul><li><ul><li><ul><li>&quot;old-releases.ubuntu.com&quot; 等で検索すると色々と出てきます。感謝です。</li></ul></li></ul></li></ul>&#182;<!--ADD_TEXT_SEP-->
<p>(以降の解説は root で行っていますので、必要に応じて sudo するなりして下さい。)</p>&#182;<!--ADD_TEXT_SEP-->
<ul><li><ul><li>以降の解説は root で行っていますので、必要に応じて sudo するなりして下さい。</li></ul></li></ul>&#182;<!--ADD_TEXT_SEP-->
<ul><li><ul><li>今日時点(2020年10月)、Ubuntu 8.10 はサポート切れの為、そのままだと apt-get が機能しませんので、使えるようにしておく必要があります。<br />
(&quot;old-releases.ubuntu.com&quot; 等で検索すると色々と出てきます。感謝です。)</li></ul></li></ul></dd></dl><hr /><p>Ubuntu8.10 に VMwareServer1.0 をインストールする方法です。<br />
どちらもかなり古いバージョンなのですが、野暮い用事のために試したところ、ちょっと躓いたので備忘録として残しておきます。</p>
<p>こちらのページを参考にし、手元で試した結果をシンプルにまとめました。ありがとうございます。<br />
<a href="https://www.howtoforge.com/how-to-install-vmware-server-1.0.x-on-an-ubuntu-8.10-desktop" title="www.howtoforge.com/how-to-install-vmware-server-1.0.x-on-an-ubuntu-8.10-desktop">https://www.howtoforge.com/how-to-install-vmware-server-1.0.x-on-an-ubuntu-8.10-desktop</a></p>
<p>ubuntu-8.10-desktop-i386 + VMware-server-1.0.10-203137 で確認しています</p>

<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li>  手順 </li></ul>
 </div>
</div>
<!--/description ignore-->

<div>
<h2>手順  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FVMware%2FUbuntu8.10%E3%81%ABVMwareServer1.0%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB#t2d33e76" title="t2d33e76"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ol><li>Ubuntu 8.10 の環境を用意
<ul><li>今日時点(2020年10月)、Ubuntu 8.10 はサポート切れの為、そのままだと apt-get が機能しませんので、使えるようにしておく必要があります。
<ul><li>&quot;old-releases.ubuntu.com&quot; 等で検索すると色々と出てきます。感謝です。</li></ul></li></ul></li>
<li>必要になるモジュールをインストールしておく<br />
(以降の解説は root で行っていますので、必要に応じて sudo するなりして下さい。)
<div><pre>&gt; apt-get install linux-headers-`uname -r` build-essential xinetd</pre></div></li>
<li>VMware-server-1.0.10-203137 をインストール
<div><pre>&gt; cd $HOME
&gt; tar -xvf VMware-server-1.0.10-203137.tar.gz
&gt; cd vmware-server-distrib
&gt; ./vmware-install.pl</pre></div>
<ul><li>問い合わせはすべてデフォルトでもOK。ビルドエラーで終了しますが、かまわず次へ。</li></ul></li>
<li>パッチを(用意してくれた方に感謝しながら)使ってインストールを行う
<div><pre>&gt; cd $HOME
&gt; wget --no-check-certificate http://www.insecure.ws/warehouse/vmware-update-2.6.27-5.5.7-2.tar.gz
&gt; tar -xvf vmware-update-2.6.27-5.5.7-2.tar.gz
&gt; cd vmware-update-2.6.27-5.5.7-2
&gt; ./runme.pl</pre></div>
<ul><li>問い合わせはすべてデフォルトでもOK。</li>
<li>ただしシリアルナンバーの入力を求められます。残念ながら今現在、新たにシリアルナンバーを入手する術があるのかわかりません。</li></ul></li>
<li>VMware Server Console を起動</li></ol><!--t2d33e76--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/VMware</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=105</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=105</guid>
 <pubDate>Wed, 14 Oct 2020 22:18:58 +0900</pubDate>
 <description>CentOS7にVMwarePlayer12をインストールUbuntu8.10にVMwareServer1.0をインストール</description>
 <content:encoded><![CDATA[
  <ul><li><a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FVMware%2FCentOS7%E3%81%ABVMwarePlayer12%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" title="技術系備忘録/VMware/CentOS7にVMwarePlayer12をインストール">CentOS7にVMwarePlayer12をインストール</a>
</li><li><a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FVMware%2FUbuntu8.10%E3%81%ABVMwareServer1.0%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" title="技術系備忘録/VMware/Ubuntu8.10にVMwareServer1.0をインストール">Ubuntu8.10にVMwareServer1.0をインストール</a>
</li></ul>

  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/VMware/CentOS7にVMwarePlayer12をインストール</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=104</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=104</guid>
 <pubDate>Wed, 14 Oct 2020 22:01:54 +0900</pubDate>
 <description>2020-00-00T00:00:00.000+09:00| vthread-4| I125: Building module with command &amp;quot;/usr/bin/make -j2 -C /tmp/modconfig-b6MdgY/vmnet-only auto-build HEADER_DIR=/lib/modules/3.10.0-1127.19.1.el7.x86_64/build/include CC=/usr/bin/gcc IS_GCC_3=no&amp;quot; 20&#182;CentOS7 に VMwarePlayer12 をインストールする方法です。どちらも旧バージョンなのでいまさら感がありますが、野暮い用事のために試したところ、ちょっと躓いたので備忘録として残しておきます。CentOS7 x86_64 (kernel 3.10.0) + VMware-Player-12.5.2 で確認しています。CentOS7 の環境を用意開発ツール（gccなど）もインストールされてる必要があると思いますので適宜用意。VMware-Player-12.5.2-4638234.x</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><div><pre>2020-00-00T00:00:00.000+09:00| vthread-4| I125: Building module with command &quot;/usr/bin/make -j2 -C /tmp/modconfig-b6MdgY/vmnet-only auto-build HEADER_DIR=/lib/modules/3.10.0-1127.19.1.el7.x86_64/build/include CC=/usr/bin/gcc IS_GCC_3=no&quot;
2020-00-00T00:00:00.000+09:00| vthread-4| W115: Failed to build vmnet.  Failed to execute the build command.</pre></div>&#182;<!--ADD_TEXT_SEP-->
<p>CentOS7 x86_64 (kernel 3.10.0) + VMware-Player-12.5.2 で確認しています。</p>&#182;<!--ADD_TEXT_SEP-->
<ol><li>ログファイルを確認。以下のような感じで終わってるハズ。</li></ol>&#182;<!--ADD_TEXT_SEP-->
<p>→ VMware Kernel Module Updater も完了し、正しく起動できるハズ</p>&#182;<!--ADD_TEXT_SEP-->
<p>情報を公開されておられてる方々には大変感謝です。</p></dd></dl><hr /><p>CentOS7 に VMwarePlayer12 をインストールする方法です。<br />
どちらも旧バージョンなのでいまさら感がありますが、野暮い用事のために試したところ、ちょっと躓いたので備忘録として残しておきます。</p>
<p>CentOS7 x86_64 (kernel 3.10.0) + VMware-Player-12.5.2 で確認しています。</p>

<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li>  手順 </li>
<li>  ひとこと </li></ul>
 </div>
</div>
<!--/description ignore-->

<div>
<h2>手順  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FVMware%2FCentOS7%E3%81%ABVMwarePlayer12%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB#z684fde9" title="z684fde9"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ol><li>CentOS7 の環境を用意
<ul><li>開発ツール（gccなど）もインストールされてる必要があると思いますので適宜用意。</li></ul></li>
<li>VMware-Player-12.5.2-4638234.x86_64.bundle を実行<br />
→ 特に問題なく完了するハズ。</li>
<li>VMwarePlayer を起動すると、VMware Kernel Module Updater でエラー「Unable to start services.」</li>
<li>ログファイルを確認。以下のような感じで終わってるハズ。
<div><pre>・
・
2020-00-00T00:00:00.000+09:00| vthread-4| I125: Building module with command &quot;/usr/bin/make -j2 -C /tmp/modconfig-b6MdgY/vmnet-only auto-build HEADER_DIR=/lib/modules/3.10.0-1127.19.1.el7.x86_64/build/include CC=/usr/bin/gcc IS_GCC_3=no&quot;
2020-00-00T00:00:00.000+09:00| vthread-4| W115: Failed to build vmnet.  Failed to execute the build command.</pre></div></li>
<li>/usr/lib/vmware/modules/source/vmnet.tar 内の compat_netdevice.h を書き換える
<ol><li>vmnet.tar をカレントに展開
<div><pre>&gt; tar -xf /usr/lib/vmware/modules/source/vmnet.tar</pre></div></li>
<li>展開した compat_netdevice.h の最後のほうを以下のように書き換える。
<div><pre>-#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(4, 7, 0)
+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(4, 7, 0) || \
+    (defined(RHEL_RELEASE_CODE) &amp;&amp; RHEL_RELEASE_CODE &gt;= 0x0704)</pre></div></li>
<li>vmnet.tar を書き換える
<div><pre>&gt; tar -cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only</pre></div></li></ol></li>
<li>気を取り直して VMwarePlayer を起動。<br />
→ VMware Kernel Module Updater も完了し、正しく起動できるハズ</li></ol>
<!--z684fde9--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>ひとこと  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FVMware%2FCentOS7%E3%81%ABVMwarePlayer12%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB#m3dc82d0" title="m3dc82d0"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<p>同じように躓いた方も多いようで、ググると複数の情報がヒットします。<br />
本稿はそれらを参考に試した結果を自分なりにシンプルにまとめてみたものです。<br />
情報を公開されておられてる方々には大変感謝です。</p><!--m3dc82d0--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/TypeScript/二分探索(binary search)</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=102</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=102</guid>
 <pubDate>Wed, 03 Jun 2020 10:09:06 +0900</pubDate>
 <description>less: (l: T, r: U) =&amp;gt; boolean = (l: T, r: U) =&amp;gt; l as any &amp;lt; r less: (l: U, r: T) =&amp;gt; boolean = (l: U, r: T) =&amp;gt; l as any &amp;lt; r less0: (l: T, r: U) =&amp;gt; boolean = (l: T, r: U) =&amp;gt; l as any &amp;lt; r, less1: (l: U, r: T) =&amp;gt; boolean = (l&#182;JavaScript には二分探索(バイナリサーチ)が標準で用意されてません。たぶん。が、あれば便利だと思うので作ってみました。配列内にお目当ての要素があるか否かだけの関数（いわゆる C++ で言う std::binary_search ）だけでなく、最初に現れた指定値以上の要素の位置を返す関数（ std::lower_bound ）と、最初に現れた指定値を超えた要素の位置を返す関数（ std::upper_bound ）を用意してます。きっと、ありがたみ的には binary_search より</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><div><pre>	less: (l: T, r: U) =&gt; boolean = (l: T, r: U) =&gt; l as any &lt; r</pre></div>
<div><pre>	less: (l: U, r: T) =&gt; boolean = (l: U, r: T) =&gt; l as any &lt; r
	less0: (l: T, r: U) =&gt; boolean = (l: T, r: U) =&gt; l as any &lt; r,
	less1: (l: U, r: T) =&gt; boolean = (l: U, r: T) =&gt; l as any &lt; r</pre></div>&#182;<!--ADD_TEXT_SEP-->
<ul><li>配列内にお目当ての要素があるか否かだけの関数（いわゆる C++ で言う std::binary_search ）だけでなく、</li>
<li>単純な配列にしか使えないんじゃ使い勝手が悪いので、比較関数を渡せるようにして、どんな形の配列でも対応できるようにしてあります。</li>
<li>配列内に同じ値(要素)がダブって存在していても、正しくソートされている配列であれば正常に動作します。</li></ul>&#182;<!--ADD_TEXT_SEP-->
<ul><li>コードは TypeScript で記述してありますが、試しに動かしたいとか、素の JavaScript のコードが欲しいとかの場合は、こちらのサイト（TypeScript Playground） にコピペしてみて下さい。とても便利で有難いサイトです。感謝です。</li></ul>&#182;<!--ADD_TEXT_SEP-->
<ul><li>お気付きの方がおられたら嬉しいのですが、本稿は以前記載した 技術系備忘録/PHP/二分探索(binary search) とほぼ同じです。なお、サンプルコード（テストケース）もまったく同じなのは手を抜いたとかではなく比較しやすいかなと考えた次第です。</li></ul>&#182;<!--ADD_TEXT_SEP-->
<div><pre>	return lowerBound(list,value,(l,r)=&gt;!less(r,l));</pre></div></dd></dl><hr />
<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li><ul><li>  コード </li>
<li>  サンプルコード </li>
<li>  サンプルコード の実行結果 </li></ul></li>
<li>  よもやま </li></ul>
 </div>
</div>
<!--/description ignore-->

<p>JavaScript には二分探索(バイナリサーチ)が標準で用意されてません。たぶん。<br />
が、あれば便利だと思うので作ってみました。</p>
<ul><li>配列内にお目当ての要素があるか否かだけの関数（いわゆる C++ で言う std::binary_search ）だけでなく、<br />
最初に現れた指定値以上の要素の位置を返す関数（ std::lower_bound ）と、<br />
最初に現れた指定値を超えた要素の位置を返す関数（ std::upper_bound ）を用意してます。<br />
きっと、ありがたみ的には binary_search より lower_bound、upper_bound の方が上だろうなと思います。</li></ul>
<ul><li>単純な配列にしか使えないんじゃ使い勝手が悪いので、比較関数を渡せるようにして、どんな形の配列でも対応できるようにしてあります。</li></ul>
<ul><li>配列内に同じ値(要素)がダブって存在していても、正しくソートされている配列であれば正常に動作します。<br />
もちろん、正しくソートされてない配列の場合の結果は不定です。</li></ul>
<div>
<h3>コード  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FTypeScript%2F%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2%28binary%20search%29#x0a2403a" title="x0a2403a"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<pre>// lower_boundfunction lowerBound&lt;T, U&gt;(list: T[], value: U,	less: (l: T, r: U) =&gt; boolean = (l: T, r: U) =&gt; l as any &lt; r): number {	let count = list.length;	let first = 0;	while (0 &lt; count) {		const count2 = count / 2 | 0;		const mid = first + count2;		if (less(list[mid], value)) {			first = mid + 1;			count -= count2 + 1;		} else {			count = count2;		}	}	return first;}// upper_boundfunction upperBound&lt;T, U&gt;(list: T[], value: U,	less: (l: U, r: T) =&gt; boolean = (l: U, r: T) =&gt; l as any &lt; r): number {	return lowerBound(list,value,(l,r)=&gt;!less(r,l));}// binary_search// ・2つの比較関数というのがいささか冗長な気がしています。もう少しスマートな書き方がもしあれば教えてほしいですfunction binarySearch&lt;T, U&gt;(list: T[], value: U,	less0: (l: T, r: U) =&gt; boolean = (l: T, r: U) =&gt; l as any &lt; r,	less1: (l: U, r: T) =&gt; boolean = (l: U, r: T) =&gt; l as any &lt; r): boolean {	const first = lowerBound(list, value, less0);	return first &gt;= list.length ? false : !less1(value, list[first]);}</pre>
<!--x0a2403a--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>サンプルコード  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FTypeScript%2F%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2%28binary%20search%29#lc2cf439" title="lc2cf439"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<pre>const sortedList = [-5, 0, 5, 10, 10, 11, 11, 13, 18];      // ソート済みの配列const testValues = [-7, -5, 0, 1, 2, 10, 12, 13, 18, 19];   // テストケースfor (const v of testValues) {	const l = lowerBound(sortedList, v);	const u = upperBound(sortedList, v);	const b = binarySearch(sortedList, v);	console.log(`${v} -&gt; lowerBound=${l} : upperBound=${u} : binarySearch=${b}`);}</pre>
<!--lc2cf439--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>サンプルコード の実行結果  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FTypeScript%2F%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2%28binary%20search%29#k9dd6a18" title="k9dd6a18"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<div><pre>-7 -&gt; lowerBound=0 : upperBound=0 : binarySearch=false
-5 -&gt; lowerBound=0 : upperBound=1 : binarySearch=true
0 -&gt; lowerBound=1 : upperBound=2 : binarySearch=true
1 -&gt; lowerBound=2 : upperBound=2 : binarySearch=false
2 -&gt; lowerBound=2 : upperBound=2 : binarySearch=false
10 -&gt; lowerBound=3 : upperBound=5 : binarySearch=true
12 -&gt; lowerBound=7 : upperBound=7 : binarySearch=false
13 -&gt; lowerBound=7 : upperBound=8 : binarySearch=true
18 -&gt; lowerBound=8 : upperBound=9 : binarySearch=true
19 -&gt; lowerBound=9 : upperBound=9 : binarySearch=false</pre></div>
<!--k9dd6a18--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>よもやま  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FTypeScript%2F%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2%28binary%20search%29#h8e0186b" title="h8e0186b"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>お気付きの方がおられたら嬉しいのですが、本稿は以前記載した <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FPHP%2F%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2%28binary%20search%29" title="技術系備忘録/PHP/二分探索(binary search) (1513d)">技術系備忘録/PHP/二分探索(binary search)</a> とほぼ同じです。なお、サンプルコード（テストケース）もまったく同じなのは手を抜いたとかではなく比較しやすいかなと考えた次第です。</li></ul>
<ul><li>コードは TypeScript で記述してありますが、試しに動かしたいとか、素の JavaScript のコードが欲しいとかの場合は、<a href="https://www.typescriptlang.org/play/index.html" title="www.typescriptlang.org/play/index.html">こちらのサイト（TypeScript Playground）</a> にコピペしてみて下さい。とても便利で有難いサイトです。感謝です。</li></ul><!--h8e0186b--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/Docker/SSLアクセラレータ＆リバースプロキシ</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=101</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=101</guid>
 <pubDate>Mon, 01 Jun 2020 17:24:51 +0900</pubDate>
 <description>証明書の設定などは Webサーバーコンテナの環境変数に記述するのが基本なようで、それ以外の方法を見つけられなかったです。ご存じの方おられましたら是非ご教示頂きたいです。&amp;#182; この用途ではかなりメジャーな jwilder/nginx-proxy と jrcs/letsencrypt-nginx-proxy-companion というdockerイメージを利用しています。&amp;#182; 証明書の設定などは Webサーバーコンテナの環境変数に記述するのが基本なようで、それ以外の方法を見つけられな&#182;SSLアクセラレータ兼リバースプロキシの docker-compose です。この用途ではかなりメジャーな jwilder/nginx-proxy と jrcs/letsencrypt-nginx-proxy-companion というdockerイメージを利用しています。少しの設定を書くだけで Let's Encrypt の証明書の取得と更新を自動でやってくれるのでメンテフリー（と言うと大げさですが）な HTTPS の webサーバー環境が作れてしまいます。スバラシイです。というわけで自分も使</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p><span style="font-size:80%;line-height:130%;">証明書の設定などは Webサーバーコンテナの環境変数に記述するのが基本なようで、それ以外の方法を見つけられなかったです。ご存じの方おられましたら是非ご教示頂きたいです。</span></p>&#182;<!--ADD_TEXT_SEP-->
<p>この用途ではかなりメジャーな jwilder/nginx-proxy と jrcs/letsencrypt-nginx-proxy-companion というdockerイメージを利用しています。</p>&#182;<!--ADD_TEXT_SEP-->
<p><span style="font-size:90%;line-height:130%;">証明書の設定などは Webサーバーコンテナの環境変数に記述するのが基本なようで、それ以外の方法を見つけられなかったです。</span></p>&#182;<!--ADD_TEXT_SEP-->
<p>この用途では一番メジャーっぽい jwilder/nginx-proxy と jrcs/letsencrypt-nginx-proxy-companion というdockerイメージを利用しています。</p>&#182;<!--ADD_TEXT_SEP-->
<p><span style="font-size:90%;line-height:130%;">証明書の設定は Webサーバーコンテナの環境変数に記述するのが基本なようで、それ以外の方法を見つけられなかったです。</span></p></dd></dl><hr />
<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li>  図 </li>
<li>  docker-compose ファイル一覧 
<ul><li>  docker-compose.yml </li>
<li>  nginx-proxy/custom.conf </li>
<li>  bridge-1/default.conf </li></ul></li>
<li>  よもやま </li></ul>
 </div>
</div>
<!--/description ignore-->

<p>SSLアクセラレータ兼リバースプロキシの docker-compose です。</p>
<p>この用途ではかなりメジャーな jwilder/nginx-proxy と jrcs/letsencrypt-nginx-proxy-companion というdockerイメージを利用しています。<br />
少しの設定を書くだけで Let's Encrypt の証明書の取得と更新を自動でやってくれるのでメンテフリー（と言うと大げさですが）な HTTPS の webサーバー環境が作れてしまいます。<br />
スバラシイです。</p>
<p>というわけで自分も使ってみようと思たのですが、ちょっと困ったことが・・。<br />
今回の自分のケースでは、webサーバーは既に別にあって、しかも Windows です。</p>
<p>jwilder/nginx-proxy、jrcs/letsencrypt-nginx-proxy-companion の場合、多分ですが、<br />
Webサーバーは同じhostにdockerコンテナとして稼働していることが前提のように見受けられます。</p>
<p><span style="font-size:80%;line-height:130%;">証明書の設定などは Webサーバーコンテナの環境変数に記述するのが基本なようで、それ以外の方法を見つけられなかったです。ご存じの方おられましたら是非ご教示頂きたいです。</span></p>
<p>そこで、Webサーバーと思わせ実はリバースプロキシなコンテナを立てるという形にしてみました。</p>
<div>
<h2>図  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FSSL%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF%EF%BC%86%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7#kd41d9a9" title="kd41d9a9"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<div><pre>   インターネット
        │
        │Port443
        │
┌───│───── Linux PC ────────────────┐
│      │                                                    │
│    ┌┴─────────┐  ┌────────────┐  │
│    │jwilder/nginx-proxy │  │jrcs/letsencrypt-・・   │  │
│    │SSLアクセラレータ   │  │Let's Encrypt 取得/更新 │  │
│    │（リバースプロキシ）│  │                        │  │
│    └┬─────────┘  └────────────┘  │
│      │                                                    │
│      │Port80                                              │
│      │                                                    │
│    ┌┴───────────────────┐            │
│    │nginx                                   │            │
│    │Webサーバーと思わせ実はリバースプロキシ │            │
│    └┬───────────────────┘            │
│      │                                                    │
└───│──────────────────────────┘
        │
        │Port80
        │
┌───│───── Windows PC ───────────────┐
│      │                                                    │
│    ┌┴──────────┐                              │
│    │Webサーバー IISとか   │                              │
│    └───────────┘                              │
│                                                            │
└──────────────────────────────┘</pre></div>
<p>こんな感じで、見ての通り余計なプロキシが１つ挟まっています。<br />
いささか非効率なのは否めませんが、一応期待通りに動作していることと、手間を少なくということで、割り切ってます。</p>
<!--kd41d9a9--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>docker-compose ファイル一覧  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FSSL%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF%EF%BC%86%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7#o24cab0e" title="o24cab0e"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<div><pre>├ docker-compose.yml
├ nginx-proxy
│ └ custom.conf
└ bridge-1
  └ default.conf</pre></div>
<!--o24cab0e--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>docker-compose.yml  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FSSL%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF%EF%BC%86%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7#l9e8340b" title="l9e8340b"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<div><pre>version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
    ports:
#     Let's Encrypt が証明書を発行する際、名前解決後にポート80で確認に来るので 80も通しておく必要アリ
      - 80:80
      - 443:443
    volumes:
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
      - ./nginx-proxy/custom.conf:/etc/nginx/conf.d/custom.conf:ro
    restart: always

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
#   environment:
#     - NGINX_PROXY_CONTAINER=nginx-proxy      やり方が間違ってるんだと思うけど、
#     - NGINX_DOCKER_GEN_CONTAINER=nginx-proxy うまく探し出してくれないっぽいのでこのやり方はナシ
    restart: always

  bridge-1:
    image: nginx:latest
    volumes:
      - ./bridge-1/default.conf:/etc/nginx/conf.d/default.conf
      - ./bridge-1:/var/www/html
    environment:
      - VIRTUAL_PORT=80
#    ↓ 環境に合わせて変更のこと
      - VIRTUAL_HOST=example.com
      - LETSENCRYPT_HOST=example.com
      - LETSENCRYPT_EMAIL=info@example.com
    restart: always

volumes:
  vhost:
  html:</pre></div>
<!--l9e8340b--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>nginx-proxy/custom.conf  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FSSL%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF%EF%BC%86%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7#z927403d" title="z927403d"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<div><pre># バージョン情報を非表示
server_tokens off;

# クライアントリクエストボディ上限を無制限
client_max_body_size 0;</pre></div>
<!--z927403d--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>bridge-1/default.conf  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FSSL%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF%EF%BC%86%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7#b47f577a" title="b47f577a"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<div><pre>server {
    listen 0.0.0.0:80;
    server_name localhost;

    location / {
#      ↓ 環境に合わせて変更のこと
        proxy_pass http://192.168.1.100:80/;
        proxy_redirect off;
        proxy_set_header Host            $http_host;
#       proxy_set_header X-Real-IP       $remote_addr; 設定既なのでココでは設定しない
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 0;
    }
}</pre></div>
<!--b47f577a--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>よもやま  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FDocker%2FSSL%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF%EF%BC%86%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7#u07c279c" title="u07c279c"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>常時SSLが常識のようになっていますので、無料で証明書を発行してくれる Let's Encrypt の存在はスバラシイです。
<ul><li>Let's Encrypt はワイルドカード証明書も発行できるようなので、そっちを狙いたいところですが、DNSテーブルを書き換える必要があります。<br />
証明書の更新時にも新たに書き換える必要があるので、APIが提供されているようなDNSサーバーなら不可能ではないですが、自動化はかなり手間です。<br />
が、今回のこの環境であれば、サブドメインを使いたい場合にもコンテナ一つ増やすだけで済むので、無理にワイルドカード証明書を使わなくても良さそうに思います。</li></ul></li>
<li>昨今はクラウド環境が充実してて、わざわざ自前でSSLアクセラレータ環境を作る機会も減ってきてるとはおもいますが、それでもまだ必要なケースはあります。<br />
Let's Encryptや、それを簡単につかえるdockerイメージの作者様、使い方を公開しておられる皆様には感謝です。ありがとうございます。</li></ul><!--u07c279c--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/C++/OpenSSL/ビルド方法</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=91</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=91</guid>
 <pubDate>Fri, 08 Nov 2019 09:58:44 +0900</pubDate>
 <description>WSL（Windows Subsystem for Linux）を使ってますのでそれも必要です。が、ダウンロードと解凍でのみ使ってるので、powershell や一般的な解凍ツールに挿げ替えることは可能だと思います。&amp;#182; WSL（Windows Subsystem for Linux）を使ってますのでそれも必要です。が、ダウンロードと解凍で使ってるのみなので、powershell や解凍ツールに挿げ替えることは可能だと思います。&amp;#182; VisualStudio の 開発者コマンドプ&#182;事前準備 要 VisualStudio要 perl。ActivePerl が無難だと思います。ppm install dmake が必要になるかも。OpenSSL をダウンロード https://www.openssl.org/ こちらからダウンロードここでは OpenSSL 1.1.0g を対象にしています。フォルダ構成 ここでは以下の感じでやってますc:\openssl\openssl-1.1.0g ←解凍したファイル一式c:\openssl\x86 ←出来上がり先VisualStudio </description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><ul><li><ul><li>WSL（Windows Subsystem for Linux）を使ってますのでそれも必要です。が、ダウンロードと解凍でのみ使ってるので、powershell や一般的な解凍ツールに挿げ替えることは可能だと思います。</li></ul></li></ul>&#182;<!--ADD_TEXT_SEP-->
<ul><li><ul><li>WSL（Windows Subsystem for Linux）を使ってますのでそれも必要です。が、ダウンロードと解凍で使ってるのみなので、powershell や解凍ツールに挿げ替えることは可能だと思います。</li></ul></li></ul>&#182;<!--ADD_TEXT_SEP-->
<ul><li><ul><li>VisualStudio の 開発者コマンドプロンプト で実行すると悩むことが少ない気がします。パスを通しておくとかそのあたりの事情で。</li></ul></li></ul>&#182;<!--ADD_TEXT_SEP-->
<div>

<!--description ignore-->
<div>
 <div>
  ページ内コンテンツ
 </div>
 <div>
  <ul><li>  windows ( VisualStudio ) 
<ul><li>  ビルド方法 
<ul><li>  事前準備 </li>
<li>  OpenSSL をダウンロード </li>
<li>  フォルダ構成 </li>
<li>  VisualStudio コマンドプロンプトで </li>
<li>  出来上がり </li></ul></li>
<li>  ダウンロードからビルドまでしてくれる BAT ファイル </li></ul></li></ul>
 </div>
</div>
<!--/description ignore-->

<h2>windows ( VisualStudio )  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h2>
<!--r4cfb75e--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>ビルド方法  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h3>
<!--k7627e67--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>事前準備  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h4>
<!--h68d651f--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>OpenSSL をダウンロード  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h4>
<!--g46efc99--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>フォルダ構成  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h4>
<!--iffc5409--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>VisualStudio コマンドプロンプトで  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h4>
<!--n0ed07c8--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>出来上がり  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h4>
<!--z7fb3986--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>ダウンロードからビルドまでしてくれる BAT ファイル  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h3><!--i2cff831--></div>&#182;<!--ADD_TEXT_SEP-->
<div>
<h2>ダウンロードからビルドまでしてくれる windows 用 BAT ファイル  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>使い方は適当なフォルダに BAT を置いて叩くのみです。</li>
<li>setup_openssl.bat<br />
&#35;prettify{{<br />
setlocal<br />
cd /d %~dp0</li></ul>
<p>@echo on</p>
<p>del openssl-1.1.1d.tar.gz<br />
rd /s /q openssl-1.1.1d</p>
<dl><dd>:: powershell -Command &quot;Invoke-WebRequest -Uri https://www.openssl.org/source/openssl-1.1.1d.tar.gz -OutFile openssl-1.1.1d.tar.gz&quot;<br />
wsl wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz<br />
wsl tar -xvf openssl-1.1.1d.tar.gz</dd></dl>
<p>cd ./openssl-1.1.1d</p>
<p>perl Configure VC-WIN32 --prefix=%CD%\x86 --openssldir=%CD%\ssl no-asm no-shared<br />
nmake.exe install</p>
<p>cmd /k</p>
<p>}}</p>
<ul><li><ul><li>WSL（Windows Subsystem for Linux）を使ってますのでそれも必要です。</li></ul></li></ul>
<!--nc078a68--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>更新履歴  <img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>ダウンロードからビルドまでしてくれる windows 用 BAT ファイル を追記しました。2019/11/8</li></ul><!--q92a547c--></div></dd></dl><hr /><div>

<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li>  windows ( VisualStudio ) 
<ul><li>  ビルド方法 
<ul><li>  事前準備 </li>
<li>  OpenSSL をダウンロード </li>
<li>  フォルダ構成 </li>
<li>  VisualStudio コマンドプロンプトで </li>
<li>  出来上がり </li></ul></li>
<li>  ダウンロードからビルドまでしてくれる BAT ファイル </li></ul></li>
<li>  更新履歴 </li></ul>
 </div>
</div>
<!--/description ignore-->

<h2>windows ( VisualStudio )  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#r4cfb75e" title="r4cfb75e"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<!--r4cfb75e--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>ビルド方法  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#k7627e67" title="k7627e67"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<!--k7627e67--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>事前準備  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#h68d651f" title="h68d651f"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<ul><li>要 VisualStudio</li>
<li>要 perl。ActivePerl が無難だと思います。
<ul><li>ppm install dmake が必要になるかも。</li></ul></li></ul>
<!--h68d651f--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>OpenSSL をダウンロード  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#g46efc99" title="g46efc99"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<ul><li><a href="https://www.openssl.org/" title="www.openssl.org/">https://www.openssl.org/</a> こちらからダウンロード</li>
<li>ここでは OpenSSL 1.1.0g を対象にしています。</li></ul>
<!--g46efc99--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>フォルダ構成  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#iffc5409" title="iffc5409"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<ul><li>ここでは以下の感じでやってます
<ul><li>c:\openssl\openssl-1.1.0g    &nbsp;&nbsp;←解凍したファイル一式</li>
<li>c:\openssl\x86               &nbsp;&nbsp;&nbsp;&nbsp;←出来上がり先</li></ul></li></ul>
<!--iffc5409--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>VisualStudio コマンドプロンプトで  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#n0ed07c8" title="n0ed07c8"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<div><pre>&gt; cd c:\openssl\openssl-1.1.0g
&gt; perl Configure VC-WIN32 --prefix=C:\openssl\x86 --openssldir=C:\openssl\openssl-1.1.0g\ssl no-asm no-shared</pre></div>
<ul><li><ul><li>VC-WIN32 で 32bit版。64bit版なら VC-WIN64A。</li>
<li>--prefix、--openssldir は絶対パスで。</li>
<li>no-asm でアセンブラ不使用の指定。パフォーマンスを優先するなら NASM を入れた上で外したほうがよいのかも。よくわかってません。</li>
<li>no-shared で スタティックライブラリに。がしかし適宜変更で。</li></ul></li></ul>
<div><pre>&gt; make
&gt; make install</pre></div>
<!--n0ed07c8--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>出来上がり  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#z7fb3986" title="z7fb3986"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<ul><li>C:\openssl\x86 を確認。</li></ul>
<!--z7fb3986--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h3>ダウンロードからビルドまでしてくれる BAT ファイル  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#i2cff831" title="i2cff831"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h3>
<ul><li>使い方は適当なフォルダに BAT を置いて叩くのみです。</li>
<li>setup_openssl.bat
<pre>setlocalcd /d %~dp0@echo ondel openssl-1.1.1d.tar.gzrd /s /q openssl-1.1.1d:: powershell -Command &quot;Invoke-WebRequest -Uri https://www.openssl.org/source/openssl-1.1.1d.tar.gz -OutFile openssl-1.1.1d.tar.gz&quot;wsl wget https://www.openssl.org/source/openssl-1.1.1d.tar.gzwsl tar -xvf openssl-1.1.1d.tar.gzcd ./openssl-1.1.1dperl Configure VC-WIN32 --prefix=%CD%\x86 --openssldir=%CD%\ssl no-asm no-sharednmake.exe installcmd /k</pre></li></ul>
<ul><li><ul><li>WSL（Windows Subsystem for Linux）を使ってますのでそれも必要です。が、ダウンロードと解凍でのみ使ってるので、powershell や一般的な解凍ツールに挿げ替えることは可能だと思います。</li>
<li>VisualStudio の 開発者コマンドプロンプト で実行すると悩むことが少ない気がします。パスを通しておくとかそのあたりの事情で。</li></ul></li></ul>
<!--i2cff831--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>更新履歴  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FOpenSSL%2F%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95#q92a547c" title="q92a547c"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<ul><li>ダウンロードからビルドまでしてくれる windows 用 BAT ファイル を追記しました。2019/11/8</li></ul><!--q92a547c--></div>


  ]]></content:encoded>
</item>
<item>
 <title>技術系備忘録/C++/VisualStudio/MSBuild.exeのパスを解決して実行</title>
 <link>https://thinkridge.com/modules/xpwiki/?pgid=100</link>
 <guid>https://thinkridge.com/modules/xpwiki/?pgid=100</guid>
 <pubDate>Mon, 04 Nov 2019 21:05:15 +0900</pubDate>
 <description>さすがに、「このプロジェクトでは VisualStudio2017 を使うので 2019 はインストールするべからず！」みたいな開発環境ルールは避けたいので、VisualStudio2019 がインストールされている環境でも期待通り MSBuild.exe を叩ける bat を用意したので備忘録兼ねて載せておきます。&amp;#182; もしもっと良い方法があればご助言頂けると幸いです。&amp;#182; もしもっと良い方法があればご助言頂ければ幸いです。&amp;#182; もしもっと良い方法があればご助言お願いし&#182;開発の現場では作業の敷居を上げないために、シンプルな開発環境構築手順ってとても大事だと思います。外部ライブラリであっても、このサイトからダウンロードしてビルドして出来上がったファイルはココに置いてパスを通して・・・みたいなことを各開発者に強いるのはなるべく避けたい。Clone（Checkout）した後に、このスクリプトだけ叩けばOK！くらいまでシンプルだと理想だなと思います。昨今は色々な言語でパッケージ管理ツール的なものが一般的に使われてると思うのですが、C++ 界隈ではソースをダウンロードして</description>
 <content:encoded><![CDATA[
  <dl><dt>Changes</dt><dd><p>さすがに、「このプロジェクトでは VisualStudio2017 を使うので 2019 はインストールするべからず！」みたいな開発環境ルールは避けたいので、VisualStudio2019 がインストールされている環境でも期待通り MSBuild.exe を叩ける bat を用意したので備忘録兼ねて載せておきます。</p>&#182;<!--ADD_TEXT_SEP-->
<p>もしもっと良い方法があればご助言頂けると幸いです。</p>&#182;<!--ADD_TEXT_SEP-->
<p>もしもっと良い方法があればご助言頂ければ幸いです。</p>&#182;<!--ADD_TEXT_SEP-->
<p>もしもっと良い方法があればご助言お願いします。</p>&#182;<!--ADD_TEXT_SEP-->
<p>がしかし困ったことに MSBuild.exe の配置場所(パス)って固定ではありません。環境事にバラバラです。<br />
で、それを解決する為に（かどうかはわかりませんが） VisualStudio では vswhere.exe っていうのがあり、それを叩けば MSBuild.exe のパスが取れるよ。というような記事を目にしたことがあります。<br />
なので、vswhere.exe を叩いておくようにすれば VisualStudio をバージョンアップしてもちゃんと動くんだろうからコレを使っておこう。と安心していたんですが、VisualStudio2019 をインストールしたら、MSBuild.exe のパスが取れなくなってしまいました。<br />
さすがに、「このプロジェクトでは VisualStudio2017 を使うので 2019 はインストールするべからず！」みたいな開発環境ルールは避けたいので、VisualStudio2019 がインストールされている環境でも期待通り MSBuild.exe を叩ける bat を用意したので、備忘録兼ねて載せておきます。</p></dd></dl><hr /><p>開発の現場では作業の敷居を上げないために、シンプルな開発環境構築手順ってとても大事だと思います。</p>
<p>外部ライブラリであっても、このサイトからダウンロードしてビルドして出来上がったファイルはココに置いてパスを通して・・・みたいなことを各開発者に強いるのはなるべく避けたい。<br />
Clone（Checkout）した後に、このスクリプトだけ叩けばOK！くらいまでシンプルだと理想だなと思います。</p>
<p>昨今は色々な言語でパッケージ管理ツール的なものが一般的に使われてると思うのですが、C++ 界隈ではソースをダウンロードして自分で手作業でビルドするものが多々あり、windows の場合は VC のプロジェクトファイルをビルドすべしっていうものがけっこうあります。</p>
<p>そこで必要になるのが VC プロジェクトをコマンドラインでビルドするために必要な MSBuild.exe。</p>
<p>がしかし困ったことに MSBuild.exe の配置場所(パス)って固定ではありません。環境事にバラバラです。<br />
で、それを解決する為に（かどうかはわかりませんが） VisualStudio では vswhere.exe っていうのがあり、それを叩けば MSBuild.exe のパスが取れるよ。というような記事を目にしたことがあります。</p>
<p>なので、vswhere.exe を叩いておくようにすれば VisualStudio をバージョンアップしてもちゃんと動くんだろうからコレを使っておこう。と安心していたんですが、VisualStudio2019 をインストールしたら、MSBuild.exe のパスが取れなくなってしまいました。<br />
さすがに、「このプロジェクトでは VisualStudio2017 を使うので 2019 はインストールするべからず！」みたいな開発環境ルールは避けたいので、VisualStudio2019 がインストールされている環境でも期待通り MSBuild.exe を叩ける bat を用意したので備忘録兼ねて載せておきます。</p>
<p>ネット上の情報をかき集めた知識でこさえてみました。感謝です。</p>

<!--description ignore-->
<div>
 <div>
  Table of contents
 </div>
 <div>
  <ul><li>  使い方 </li>
<li>  MSBuild.bat 
<ul><li><ul><li>  備考 </li></ul></li></ul></li></ul>
 </div>
</div>
<!--/description ignore-->

<div>
<h2>使い方  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FVisualStudio%2FMSBuild.exe%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C#h583eb2d" title="h583eb2d"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<pre>&gt; MSBuild.bat c:\app\app.vcxproj</pre>
<p>こんな感じで使うと、インストールされている最新の MSBuild.exe でビルドを行います。</p>
<p>VisualStudio2019、2017、2015 の環境までは確認しています。</p>
<!--h583eb2d--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h2>MSBuild.bat  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FVisualStudio%2FMSBuild.exe%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C#tbfcdbcc" title="tbfcdbcc"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h2>
<pre>:: MSBuild.exe %*@echo offsetlocal:: cd /d %~dp0set PF32=%ProgramFiles(x86)%if not exist &quot;%PF32%&quot; set PF32=%ProgramFiles%set VsWherePath=&quot;%PF32%\Microsoft Visual Studio\Installer\vswhere.exe&quot;:: vs2019 or laterfor /f &quot;usebackq tokens=*&quot; %%i in (`%VsWherePath% -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe`) do (	if exist &quot;%%i&quot; (		set MSBuildPath=&quot;%%i&quot;		goto :run	)):: vs2017 or earlierfor /f &quot;usebackq tokens=1* delims=: &quot; %%i in (`%VsWherePath% -latest -requires Microsoft.Component.MSBuild`) do (	if /i &quot;%%i&quot;==&quot;installationPath&quot; (		if exist &quot;%%j\MSBuild\15.0\Bin\MSBuild.exe&quot; (			set MSBuildPath=&quot;%%j\MSBuild\15.0\Bin\MSBuild.exe&quot;			goto :run		)		if exist &quot;%%j\MSBuild\14.0\Bin\MSBuild.exe&quot; (			set MSBuildPath=&quot;%%j\MSBuild\14.0\Bin\MSBuild.exe&quot;			goto :run		)		if exist &quot;%%j\MSBuild\12.0\Bin\MSBuild.exe&quot; (			set MSBuildPath=&quot;%%j\MSBuild\12.0\Bin\MSBuild.exe&quot;			goto :run		)	)):runif not exist %MSBuildPath% (	echo &quot;MSBuild.exe not find&quot;	exit /b 1)echo on%MSBuildPath% %*</pre>
<!--tbfcdbcc--></div>
<div>
<div><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=arrow_up.png" alt="Page Top" width="16" height="16" /></div><h4>備考  <a href="https://thinkridge.com/modules/xpwiki/?%E6%8A%80%E8%A1%93%E7%B3%BB%E5%82%99%E5%BF%98%E9%8C%B2%2FC%2B%2B%2FVisualStudio%2FMSBuild.exe%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C#ac84f756" title="ac84f756"><img src="https://thinkridge.com/modules/xpwiki/skin/loader.php?src=anchor.png" alt="anchor.png" height="12" width="12" /></a> 
<!--description ignore-->

<!--/description ignore--></h4>
<p>VisualStudio2019 の vswhere.exe には -find っていうオプションが追加されたようで、それを使うのが王道らしいので、それを使っています。<br />
が、当然 VisualStudio2019 が未インストールの環境では、-find を指定してもエラーになります。<br />
で、エラーが返ってきてもファイルの有無チェックで弾くことで VisualStudio2019 未満向けの処理に流れるっていう寸法です。<br />
あんまりスマートじゃないやり方な気がしますが、他に妙案が思いつかないです・・。<br />
もしもっと良い方法があればご助言頂けると幸いです。</p><!--ac84f756--></div>


  ]]></content:encoded>
</item>

 </channel>
</rss>