はしくれエンジニアもどきのメモ https://cartman0.hatenablog.com/ 情報系技術・哲学・デザインなどの勉強メモ・備忘録です。 Thu, 14 Mar 2024 02:07:46 +0900 http://blogs.law.harvard.edu/tech/rss Hatena::Blog 動物標本の3Dモデルを見るメモ https://cartman0.hatenablog.com/entry/2024/03/14/%E5%8B%95%E7%89%A9%E6%A8%99%E6%9C%AC%E3%81%AE3D%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%A6%8B%E3%82%8B%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="動物標本の3Dモデルを見るメモ">動物標本の3Dモデルを見るメモ</h1> <p>動物標本の3Dモデルを見られるサービスを見つけたのでメモ。</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#動物標本の3Dモデルを見るメモ">動物標本の3Dモデルを見るメモ</a><ul> <li><a href="#CT図鑑">CT図鑑</a></li> </ul> </li> <li><a href="#MorphoSource">MorphoSource</a></li> <li><a href="#iDigBio">iDigBio</a><ul> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="CT図鑑">CT図鑑</h2> <p>現在(2024年3月時点)、34種類ほどの動物標本(魚含む)をCTしたもの3Dで閲覧できるサービスです。</p> <p><figure class="figure-image figure-image-fotolife" title="CT図鑑"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20240314/20240314011457.jpg" width="800" height="498" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>CT図鑑</figcaption></figure> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fctseibutsu.jp%2F" title="CT生物図鑑" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://ctseibutsu.jp/">ctseibutsu.jp</a></cite></p> <p>基本的に閲覧のみで、一部の3Dデータは非営利・ライセンス表記でDLして利用できるようです。 例えば、チャグロサソリの3DデータはここからDLできます。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fctseibutsu.jp%2Fdata%2Fdata_asian_forest_scorpion.html" title="チャグロサソリ 3Dデータダウンロード | CT生物図鑑" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://ctseibutsu.jp/data/data_asian_forest_scorpion.html">ctseibutsu.jp</a></cite></p> <p><a href="https://www.jmc-rp.co.jp/">JMC</a>という産業用CTや<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>事業などを行ってる会社が運用してるようです。</p> <p></section></p> <p><section></p> <h1 id="MorphoSource">MorphoSource</h1> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.morphosource.org%2F%3Flocale%3Den" title="MorphoSource" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.morphosource.org/?locale=en">www.morphosource.org</a></cite></p> <p>自然遺産など動物以外も含んだ3D、2Dデータを集めた<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>。 英語のみ。学術向けです。3Dデータの提供元は博物館や研究所です。</p> <p>OpenDataであれば会員登録すれば無料でDL可能(DLするときに利用目的に記述が必要)。また、Artistの利用も視野に入れて公開されてるようです。</p> <p>フロリダ博物館の爬虫類の3D標本が追加され、Morpho内で閲覧できるようになりました。</p> <p><a href="https://www.morphosource.org/projects/00000C211?locale=en">Digitizing the Florida Museum of Natural History&#39;s Herpetology collections // MorphoSource</a></p> <p></section></p> <p><section></p> <h1 id="iDigBio">iDigBio</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%E1%A5%EA">アメリ</a>カ国立科学財団(National Science Foundation)の助成によるAdvancing Digitization of Biodiversity Collections(ADBC; 直訳:<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C0%B8%CA%AA%C2%BF%CD%CD%C0%AD">生物多様性</a>コレクションのデジタル化を推進する)プロジェクトのようです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.idigbio.org%2F" title="iDigBio Home | iDigBio" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.idigbio.org/">www.idigbio.org</a></cite></p> <p>MorphoSourceとの違いがわかりにくいですが、生物標本がメインで<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%E1%A5%EA">アメリ</a>カが主に助成で関わってるということでしょうか?</p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.gizmodo.jp%2F2024%2F03%2Fopenvertebrate.html" title="博物館の生き物3D解剖図、無料で見放題" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.gizmodo.jp/2024/03/openvertebrate.html">www.gizmodo.jp</a></cite></p></li> </ul> <p></aside></p> Thu, 14 Mar 2024 02:07:46 +0900 hatenablog://entry/6801883189090540981 生物 3Dデータ Bing Chatとペアプロできる時代がきた https://cartman0.hatenablog.com/entry/2023/03/15/Bing_Chat%E3%81%A8%E3%83%9A%E3%82%A2%E3%83%97%E3%83%AD%E3%81%A7%E3%81%8D%E3%82%8B%E6%99%82%E4%BB%A3%E3%81%8C%E3%81%8D%E3%81%9F?utm_source=feed <h1 id="Bing-Chatとペアプロできる時代がきた">Bing Chatと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%A2%A5%D7%A5%ED">ペアプロ</a>できる時代がきた</h1> <p>世間はChat-GPT4で持ち切りですが、Bing Chatでもいい感じのコードを生成してくれるぞという成功例メモ。 今のBingChatは最大15ターン150回まで利用できるようになった。 個人的には、</p> <ul> <li>無料</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>キー必要なし</li> <li>モバイル利用OKは</li> </ul> <p>かなりのメリットだと思っている。</p> <p>今回は、doctestを使ったときにmodule単位でなく、 <code>doctest.run_docstring_examples()</code>あたりを使ってクラス単位でテストして、(失敗数, try数)である集計結果を得る方法はないのか聞いてみた。 (なぜか<code>doctest.run_docstring_examples()</code>は<code>TestResult</code>を返り値で返してくれない。)</p> <p>一応、事前のやり取りで、doctest.DocTestRunner`を使うと良さそうというアタリは付けている。</p> <p>で、(私が少し手直ししているが)できたコードはこんな感じである。🎉</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> doctest <span class="synStatement">def</span> <span class="synIdentifier">doctest_objAll</span>(obj, verbose = <span class="synIdentifier">True</span>, optionflags = <span class="synConstant">0</span>): finder = doctest.DocTestFinder() runner = doctest.DocTestRunner(verbose = verbose, optionflags = optionflags) tests = finder.find(obj) <span class="synStatement">for</span> test <span class="synStatement">in</span> tests: runner.run(test) <span class="synStatement">return</span> runner.summarize() </pre> <p>ちゃんとこのコードは動き、しかも公式ドキュメント(<a href="https://docs.python.org/ja/3/library/doctest.html">https://docs.python.org/ja/3/library/doctest.html</a>)に そっくり載ってるコードでないところが重要ポイントである。(なぜドキュメントにサンプルコードないねんと言いたいところだが)</p> <p>このコードはできるまでの流れを、(スマートではないが)以降に残しておく。</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#Bing-Chatとペアプロできる時代がきた">Bing Chatとペアプロできる時代がきた</a><ul> <li><a href="#環境事前準備">環境・事前準備</a></li> <li><a href="#Bing-Chat-とのやりとり">Bing Chat とのやりとり</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境事前準備">環境・事前準備</h2> <ul> <li>Windows11 64bit <ul> <li>Edge バージョン 110.0.1587.69 (公式ビルド) (64 ビット)</li> <li>WSL2</li> <li>Docker Desktop 4.17.0 (99724)</li> <li>jupyter <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> 3.10(生成コードの確認)</li> </ul> </li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="Bing-Chat-とのやりとり">Bing Chat とのやりとり</h2> <p>[1]: 「<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のdoctest_runnerを使ってモジュール単位でなくクラスとその中のメソッド単位でテストして失敗数を返り値で方法を教えて」</p> <p>ちょっと誤字ってますがこの内容で聞いてみます。</p> <p><figure> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222214.jpg" width="800" height="347" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> </figure></p> <blockquote><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>のdoctestモジュールは、対話的な<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>セッションのように見えるテキストを探し出し、セッションの内容を実行して、そこに書かれている通りに振舞うかを調べます1。ただし、私が見つけた情報では、doctest_runnerを使ってクラスとその中のメソッド単位でテストして失敗数を返す方法については詳しく説明されていません。もう少し具体的な質問がありますか?</p></blockquote> <p>見つからないと言い出したので、誤字の影響も加味して正式名で使い方を聞いてみます。</p> <p>[2]: 「doctestRunnerの使い方を教えて」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222219.jpg" width="800" height="325" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><p>doctestRunnerは、DocTestのテストケースを実行し、統計を蓄積するために使用されるクラスです。runメソッドは、単一のDocTestケースを処理するために使用されます。試行したテストケースの数tと失敗したテストケースの数fのタプル(f, t)を返します1。ただし、私が見つけた情報では、doctestRunnerの詳しい使い方については説明されていません。もう少し具体的な質問がありますか?</p></blockquote> <p>検索して教えてくれました。ただ詳しい使い方は見つからなかったようです。 サンプルコードがあるか聞いてみます。</p> <p>[3]: 「サンプルコードはありますか?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222224.jpg" width="800" height="346" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><p>はい、doctest.DocTestRunnerのサンプルコードがいくつかあります。例えば、Program Creekというサイトには、doctest.DocTestRunnerの30のコード例があります1。また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>の公式ドキュメントにも、doctestモジュールを使用したテストの例があります2。</p> <pre><code class="python">import doctest doctest.testfile("example.txt") </code></pre> <p>上記の短い<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>は、ファイルexample.txtに含まれる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>な<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>の例を実行して検証します。ファイルの内容は、単一の巨大なdocstringとして扱われます。ファイルに<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>プログラムを含める必要はありません!2</p></blockquote> <p><code>doctest.testfile</code>のサンプルコードを教えてくれました。 ここで質問の選択肢「doctestRunnerでクラスとメソッドをテストする方法」</p> <p>[4]: 「doctestRunnerでクラスとメソッドをテストする方法」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222228.jpg" width="800" height="350" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><p>doctestRunnerを使用して、クラスとその中のメソッドをテストすることができます。テストを実行するには、ファイルの末尾に次のコードを追加します。</p> <pre><code class="python">if __name__ == "__main__": import doctestモジュール単位でなくクラス単位でやりたいです。doctestrunnerとdoctest.run_docstring_examplesを組み合わせる方法ある? doctest.testmod() </code></pre> <p>テストがクラス全体を対象とする場合は、クラスのdocstringに配置します。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%B9%A5%C8%A5%E9%A5%AF%A5%BF%A1%BC">コンストラクター</a>をテストする場合は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%B9%A5%C8%A5%E9%A5%AF%A5%BF%A1%BC">コンストラクター</a>のdocstringに配置します1。</p></blockquote> <p><code>doctestRunner</code>というより、<code>doctest.testmod()</code>の使い方を教えてくれました。 それはモジュール単位で行うのでそれじゃないと主張し、もう一歩踏み込んで「doctestrunnerとdoctest.run_docstring_examplesを組み合わせる方法あるか?」という質問をします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222232.jpg" width="800" height="327" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><p>はい、doctest.run_docstring_examples()を使用して、特定のクラスやメソッドのdocstring内のテストを実行することができます。例えば、次のように書くことができます。</p> <pre><code class="python">import doctest doctest.run_docstring_examples(MyClass.my_method, globals()) </code></pre> <p>上記のコードは、MyClassクラスのmy_methodメソッド内のdocstringに記載されているテストを実行します。1</p></blockquote> <p><code>doctest.run_docstring_examples</code>のサンプルを出してきましたが、<code>DocTestRunner</code>と組み合わせられるかの質問に答えてません。もう一度聞いてみます。</p> <p>[6]:「そのときにdoctestrunnerの結果もえる方法ある?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222236.jpg" width="800" height="327" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><p>はい、doctest.DocTestRunnerオブジェクトを使用して、doctest.run_docstring_examples()の結果を取得することができます。例えば、次のように書くことができます。</p> <pre><code class="python">import doctest runner = doctest.DocTestRunner() doctest.run_docstring_examples(MyClass.my_method, globals(), test_runner=runner) print(runner.summarize()) </code></pre> <p>上記のコードは、MyClassクラスのmy_methodメソッド内のdocstringに記載されているテストを実行し、その結果を表示します。</p></blockquote> <p>なんかそれっぽいコードが出てきましたが、これは嘘コードです。ドキュメントを見ればわかりますが、 <code>doctest.run_docstring_examples()</code>には<code>test_runner</code>という引数は与えられません。 実は事前のやりとりでもこの嘘コードを教えられました。</p> <p>このコードは間違っており、他にいい方法があるか聞いてみます。 すると・・</p> <p>[7]: 「最新のドキュメント(<a href="https://docs.python.org/ja/3/library/doctest.html#doctest.DocTestRunner">https://docs.python.org/ja/3/library/doctest.html#doctest.DocTestRunner</a>)ではdoctest.run_docstring_examplesはtest_runner引数を持ちません。他にいい方法ある?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222240.jpg" width="800" height="374" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><pre><code class="python">import doctest finder = doctest.DocTestFinder() runner = doctest.DocTestRunner() tests = finder.find(MyClass.my_method) for test in tests: runner.run(test) print(runner.summarize()) </code></pre></blockquote> <p><code>doctest.DocTestFinder()</code>を使った(本当に動くなら)良さげなコードを教えてくれました。 <code>DocTestFinder</code>がどんなものかわからないので聞いてみます。</p> <p>[8]: 「これは良さそうです。DocTestFinderとは何ですか?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222244.jpg" width="800" height="277" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><p>doctest.DocTestFinderは、モジュール、クラス、メソッド、関数などのオブジェクトからdocstringを抽出し、~</p></blockquote> <p><code>doctest.DocTestFinder</code>はdocstringの抽出してくれるようです。 ただ、先程のコードではクラス内関数を1つ指定して使って面倒そうだったので、動的にクラス内関数を与えられないか聞いてみます。</p> <p>[9]: 「関数を指定するのは面倒なのでdocstringの書かれた関数を動的に取得する方法ある?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222151.jpg" width="800" height="303" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><pre><code class="python">finder = doctest.DocTestFinder() tests = finder.find(my_module) </code></pre></blockquote> <p>どうやら<code>DocTestFinder().find(module)</code>と与えればその中のdocstring全てを抽出してくれるようです。 クラスオブジェクトも与えられそうですが少し確認の意味も込めて、moduleの代わりにクラスにするとどうなるか聞いてみます。</p> <p>[10]: 「モジュールでなくクラスだとどうなる?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222154.jpg" width="800" height="293" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><pre><code class="python">finder = doctest.DocTestFinder() tests = finder.find(MyClass) </code></pre></blockquote> <p>ほぼ完成しましたが、せっかくなのでまとめたコードを出してもらいましょう。</p> <p>[11]: 「そこからdoctestrunnerで結果を受け取るにはどう書けば良い?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222158.jpg" width="800" height="328" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><pre><code class="python">import doctest finder = doctest.DocTestFinder() runner = doctest.DocTestRunner() tests = finder.find(MyClass) for test in tests: runner.run(test) print(runner.summarize()) </code></pre></blockquote> <p>9割完成です。 せっかくなので関数化してもらいます。</p> <p>[12]: 「おーこれは最高です。他でも使えるようにテスト関数化するとどうなる?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222202.jpg" width="800" height="431" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><pre><code class="python">import doctest def run_doctest(obj): finder = doctest.DocTestFinder() runner = doctest.DocTestRunner() tests = finder.find(obj) for test in tests: runner.run(test) return runner.summarize() </code></pre></blockquote> <p><a href="https://sl.bing.net/gQJU6UONDwW">https://sl.bing.net/gQJU6UONDwW</a></p> <p>9割9分完成ですが、このまま動かすとテストの詳細表示をしてくれないのでverboseの設定をお願いします。</p> <p>[13]: 「それで詳細結果 verboseを得る方法ある?」</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20230315/20230315222207.jpg" width="800" height="346" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <blockquote><pre><code class="python">runner = doctest.DocTestRunner(verbose=True) </code></pre></blockquote> <p>先程の関数の<code>DocTestRunner</code>にこのverboseを設定すれば完成です。 実際には、Exceptionやerrorもテストできるように<code>optionflags</code>もできたほうがいいです。</p> <p></section></p> Wed, 15 Mar 2023 23:00:10 +0900 hatenablog://entry/4207112889971788302 Bing Pythonで循環リスト(circular list; 初期位置リセット可)を作る https://cartman0.hatenablog.com/entry/2023/03/05/Python%E3%81%A7%E5%BE%AA%E7%92%B0%E3%83%AA%E3%82%B9%E3%83%88%28circular_list%3B_%E5%88%9D%E6%9C%9F%E4%BD%8D%E7%BD%AE%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E5%8F%AF%29%E3%82%92%E4%BD%9C%E3%82%8B?utm_source=feed <h1 id="Pythonで循環リストcircular-list-初期位置リセット可を作る"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>で循環リスト(circular list; 初期位置リセット可)を作る</h1> <p>いい感じの循環リストがなさそうなので作ってみようというメモ</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#Pythonで循環リストcircular-list-初期位置リセット可を作る">Pythonで循環リスト(circular list; 初期位置リセット可)を作る</a><ul> <li><a href="#環境事前準備">環境・事前準備</a></li> <li><a href="#循環リストとは">循環リストとは</a></li> <li><a href="#よくあるやり方">よくあるやり方</a></li> <li><a href="#iterableとiteratorの違い">iterableとiteratorの違い</a></li> <li><a href="#CircularList-Classを自作する">CircularList Classを自作する</a><ul> <li><a href="#メモ代わりの解説">メモ代わりの解説</a></li> </ul> </li> <li><a href="#Deque継承版">Deque継承版</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境事前準備">環境・事前準備</h2> <ul> <li>Windows10 64bit <ul> <li>WSL2</li> <li>Docker Desktop 4.17.0 (99724)</li> <li>jupyter <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> 3.10</li> </ul> </li> </ul> </li> </ul> <p></section></p> <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script> <script>mermaid.initialize({startOnLoad: true});</script> <p><section></p> <h2 id="循環リストとは">循環リストとは</h2> <p>[a,b,c] というリストが有ったときに最後まで辿ったらまた最初に戻るようなリストである。あえて図を描くと下のようになる。</p> <pre class="code mermaid" data-lang="mermaid" data-unlink>graph LR; a --&gt; b; b --&gt; c; c --&gt; a;</pre> <p>きっかけは、クロック周期の再現に良いんじゃないかと探していた。</p> <p></section></p> <p><section></p> <h2 id="よくあるやり方">よくあるやり方</h2> <ul> <li><p><code>itertools.cycle(*iterable*)</code> <a href="https://docs.python.org/ja/3/library/itertools.html#itertools.cycle">https://docs.python.org/ja/3/library/itertools.html#itertools.cycle</a></p> <ul> <li>破壊的かつ常に元のコピーを保持するのでメモリ増える。最大2倍?</li> <li>初期位置リセットできない</li> </ul> </li> <li><p><code>collections.deque.rotate</code> <a href="https://docs.python.org/3/library/collections.html#collections.deque">https://docs.python.org/3/library/collections.html#collections.deque</a></p> <ul> <li>元のコピーは保持しないようなのでメモリが増える心配はない <ul> <li>ただし、元のリストに対して<code>d.append(d.popleft())</code>と言う処理をしているので破壊的ではある</li> </ul> </li> <li>初期位置にリセットできない</li> </ul> </li> </ul> <p>今回は、単純なHEAD位置をもったリストにすればリセット可能で破壊的でもないのが作れそうなのでやってみる</p> <p></section></p> <p><section></p> <h2 id="iterableとiteratorの違い">iterableと<a class="keyword" href="http://d.hatena.ne.jp/keyword/iterator">iterator</a>の違い</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のリストっぽいオブジェクトにはiterableと<a class="keyword" href="http://d.hatena.ne.jp/keyword/iterator">iterator</a>の2種類がある。</p> <ul> <li><a href="https://docs.python.org/ja/3/glossary.html#term-iterable">iterable</a> <ul> <li><a href="https://docs.python.org/ja/3/library/functions.html?highlight=iter#iter">iter(iterable)</a>関数で<a class="keyword" href="http://d.hatena.ne.jp/keyword/iterator">iterator</a>になるオブジェクト。</li> <li>代表例:list</li> <li><a href="https://docs.python.org/3/reference/datamodel.html#special-method-names">special method</a> の<a href="" title="https://docs.python.org/3/reference/datamodel.html#object.__iter__"><code>def __iter__(self)</code></a>をもつ</li> <li>厳密でないが判定方法は、抽象クラスを使って、<code>isinstance(*iterable_obj*, collections.abc.Iterable</code> ( <a href="https://docs.python.org/ja/3/library/collections.abc.html#collections.abc.Iterable">collections.abc.Iterable</a> )でできる</li> </ul> </li> <li><a href="https://docs.python.org/ja/3/glossary.html#term-iterator">iterator</a> <ul> <li><code>next(iterator)</code>関数で次の要素を取り出せる。</li> <li><a href="https://docs.python.org/3/reference/datamodel.html#special-method-names">special method</a> の<a href="https://docs.python.org/3/reference/datamodel.html#object.__iter__"><code>def __iter__(self)</code></a> と <a href="" title="https://docs.python.org/3/library/stdtypes.html#iterator.__next__"><code>def __next__(self)</code></a> をもつ。つまりiterableでもある。</li> <li>判定方法は同じように、<code>isinstance(*iterator_obj*, collections.abc.Iterator)</code>( <a href="https://docs.python.org/ja/3/library/collections.abc.html#collections.abc.Iterator">collections.abc.Iterator</a> )でできる。ちなみに、IterableでもTrueになる。</li> </ul> </li> </ul> <p>※他にも非同期版(<a href="https://docs.python.org/ja/3/library/functions.html#aiter"><code>aiter</code></a>)もある</p> <p></section></p> <p><section></p> <h2 id="CircularList-Classを自作する">CircularList Classを自作する</h2> <p>以上を踏まえて新しい循環リストを作る。求める機能は以下とする。</p> <ul> <li><code>next()</code>関数使っても要素は削除されないようにする、つまり、Iterableオブジェクトにする。</li> <li>ただし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iterator">iterator</a>のように使えたほうが良いので<code>next()</code>でシフトして循環していく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C6%A5%EC%A1%BC%A5%BF">イテレータ</a>を生成するジェネレータを持たせる。</li> <li>シフト・循環はHead位置を保持して再現する。これだと配列操作はいらないので基本的に処理は軽い。</li> </ul> <pre class="code lang-python" data-lang="python" data-unlink>cl = CircularList([<span class="synConstant">'a'</span>, <span class="synConstant">'b'</span>]) g = cl.generator_for_circ() <span class="synComment"># Head=0</span> <span class="synIdentifier">next</span>(g) <span class="synComment"># a, Head &lt;- 1</span> <span class="synIdentifier">next</span>(g) <span class="synComment"># b, Head &lt;- 0</span> <span class="synIdentifier">next</span>(g) <span class="synComment"># a, Head &lt;- 1</span> </pre> <ul> <li>循環をresetできる機能を追加する <ul> <li>Headを0にすればいい</li> </ul> </li> </ul> <pre class="code lang-python" data-lang="python" data-unlink>cl = CircularList([<span class="synConstant">'a'</span>, <span class="synConstant">'b'</span>]) g = cl.generator_for_circ() <span class="synComment"># Head=0</span> <span class="synIdentifier">next</span>(g) <span class="synComment"># a, Head &lt;- 1</span> cl.reset() <span class="synComment"># Head &lt;- 0 ※実際には再開するとstep分足されるのでその分引く必要あり</span> <span class="synIdentifier">next</span>(g) <span class="synComment"># a, Head &lt;- 1</span> </pre> <p>できたコードは以下である。</p> <script src="https://gist.github.com/Cartman0/bc820d27ea1bfac269542bae5e0e5ca9.js?file=CircularList.ipynb"></script> <p><section></p> <h3 id="メモ代わりの解説">メモ代わりの解説</h3> <ul> <li><code>list</code>から継承してもいいが、破壊的な配列操作のオーバーライドとHeadの処理が大変なのであえて抽象クラス<code>Iterable</code>から継承してる。</li> <li>Iterableの継承だと<code>__iter__(self)</code>の記述が必須になる。 今回は、<code>iter(self._l)</code>をそのまま返して従来の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C6%A5%EC%A1%BC%A5%BF">イテレータ</a>の使い方もできるようにしている。</li> <li><code>head</code>は中身が見えるgetだけで、書き換えできないように<code>@property</code>の設定にしている。</li> <li><code>__repr__</code>の設定で、リストの中身が見えるように。</li> <li><code>def circ_iterator(self, step=1)</code>で循環リスト用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C6%A5%EC%A1%BC%A5%BF">イテレータ</a>を作るジェネレータにしている。基本的にはHead位置の値を返してyieldで止まる。次のループでHeadが更新されることに注意。</li> <li>indexでアクセスできる(<code>l[0]</code>)ようにsubscratable(<code>__getitem__(self, idx:int)</code>)を設定。 <ul> <li>逆に、値の書き換え(assigment)はできないように<code>__setitem__(self, idx, v)</code>は設定してない</li> </ul> </li> <li>リストの長さ(<code>len()</code>)を取れるように<code>__len__(self)</code>を設定している。<code>__iter__</code>の設定だけでは実は返されず、<code>TypeError: object of type * has no len()</code> になる。</li> </ul> <p></section></p> <p></section></p> <p><section></p> <h2 id="Deque継承版">Deque継承版</h2> <p>途中までdequeで作ってたものも記録として残しておく。こっちは<code>rotate</code>したときにでも与えた最初のリストの先頭位置を常にHeadで管理していくものになる。</p> <p>dequeは破壊的な配列操作(popleft()など)が多い。使えないように、オーバーライドして <code>NotImplementedError</code>をraiseしたほうがいい。</p> <script src="https://gist.github.com/Cartman0/bc820d27ea1bfac269542bae5e0e5ca9.js?file=CircularList_deque.py"></script> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="https://docs.python.org/ja/3/library/itertools.html#itertools.cycle">https://docs.python.org/ja/3/library/itertools.html#itertools.cycle</a>(<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.python.org%2Fja%2F3%2Flibrary%2Fitertools.html%23itertools.cycle" title="itertools --- 効率的なループ実行のためのイテレータ生成関数" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://docs.python.org/ja/3/library/itertools.html#itertools.cycle">docs.python.org</a></cite>]</p></li> <li><p><a href="https://docs.python.org/3/library/collections.html#collections.deque">https://docs.python.org/3/library/collections.html#collections.deque</a>(<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.python.org%2F3%2Flibrary%2Fcollections.html%23collections.deque" title="collections — Container datatypes" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://docs.python.org/3/library/collections.html#collections.deque">docs.python.org</a></cite>]</p></li> </ul> <p></aside></p> Sun, 05 Mar 2023 22:52:21 +0900 hatenablog://entry/4207112889968844982 Python アルゴリズム Mesonの使い方メモ https://cartman0.hatenablog.com/entry/2022/03/24/Meson%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="Mesonの使い方メモ">Mesonの使い方メモ</h1> <p>Mesonの情報無さすぎるということでメモ。 触ってみた所感としてcmakeより楽なんだろうけど、どのbuitinオプションがどの引数を制御してるかなどがわかりにくい.. (ver0.61なので今後変わりそうですが)</p> <p><a href="https://mesonbuild.com/">The Meson Build system</a></p> <p>mesonではビルド方法を2種類に分けている</p> <ul> <li>native build: build machineとhost/target machineが同じ</li> <li>cross build: build machineとhost/target machineが別</li> </ul> <p>今回はnative buildを中心にまとめる。</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#Mesonの使い方メモ">Mesonの使い方メモ</a><ul> <li><a href="#環境事前準備">環境・事前準備</a></li> <li><a href="#Mesonって何">Mesonって何?</a></li> <li><a href="#Mesonを使う流れ">Mesonを使う流れ</a></li> <li><a href="#mesonbuild設定ファイルの書き方">meson.build(設定ファイル)の書き方</a></li> <li><a href="#引数設定のススメ">引数設定のススメ</a><ul> <li><a href="#nativeファイルの書き方使い方">nativeファイルの書き方・使い方</a><ul> <li><a href="#例nativeファイルからコンパイラをclangに変える">例:nativeファイルからコンパイラをclangに変える</a></li> </ul> </li> <li><a href="#mesonbuildファイル内に書く">meson.buildファイル内に書く</a></li> <li><a href="#環境変数を使うケース">環境変数を使うケース</a><ul> <li><a href="#例-環境変数を使ってgccでなくclangでビルドする場合">例: 環境変数を使ってgccでなくclangでビルドする場合</a></li> </ul> </li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境事前準備">環境・事前準備</h2> <p>今回はDocker上にMesonをインストールした状況を想定してる。 Mesonはpipからインストールできる。</p> <pre class="code bash" data-lang="bash" data-unlink>$ pip3 install meson</pre> <ul> <li>Windows10 64bit <ul> <li>WSL2</li> <li>DockerDesktop 4.5.1 (74721) <ul> <li>base image: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Debian">Debian</a> 11 <ul> <li>Meson 0.61.2</li> </ul> </li> </ul> </li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="Mesonって何">Mesonって何?</h2> <p><a href="https://ja.wikipedia.org/wiki/Autotools">Autotools(automake)</a>やCMakeのようなビルディングツール。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>製。</p> <p>ビルドツールの歴史として以下を三大巨頭とすると</p> <ul> <li>1990年頃:Autotools(automake)</li> <li>1999年頃:Cmake</li> <li>2013年頃:Meson</li> </ul> <p>その中でも、Mesonは特にユーザーフレンドリーを意識して開発されている。 (ドキュメントの解説が機能別になりすぎていたり、サンプルも少ないので、わかりにくいことも多いが)</p> <p>ただし実際にMesonはfrontend側の処理をしておりビルド処理を担当してるのは<a href="https://ninja-build.org/">Ninja</a>になる。 まとめると、</p> <ul> <li>frontend: Meson: autoconfやautomake側に近い</li> <li>backend: Ninja: ビルド処理を担当、make側に近い</li> </ul> <p>(正直、Ninjaだけでは駄目なのかよくわかってない)</p> <p>設定ファイルの関係をまとめると</p> <table> <thead> <tr> <th style="text-align:center;">tool</th> <th style="text-align:center;">ビルドの設定ファイル</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">make/automake</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Makefile">Makefile</a></td> </tr> <tr> <td style="text-align:center;">Cmake</td> <td style="text-align:center;">CMakeLists.txt</td> </tr> <tr> <td style="text-align:center;">Meson</td> <td style="text-align:center;">meson.build</td> </tr> </tbody> </table> <p></section></p> <p><section></p> <h2 id="Mesonを使う流れ">Mesonを使う流れ</h2> <p><strong>主な</strong>流れをまとめる。</p> <p>開発者側:プロジェクト用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ作成からビルドまで</p> <pre class="code bash" data-lang="bash" data-unlink>$ mkdir &lt;project dir&gt; $ cd &lt;project dir&gt; $ meson init # meson.buildファイルが作成される</pre> <p><code>meson init</code>にオプションをつけることで使う言語など指定できる。</p> <p><a href="https://mesonbuild.com/Project-templates.html">Project templates</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>やらエディタやらで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>をプロジェクトフォルダ内に作成または追加して, <code>meson.build</code>にビルド用の設定を追加する。</p> <pre class="code bash" data-lang="bash" data-unlink>$ meson setup &lt;build dir&gt; $ cd &lt;build dir&gt; $ meson compile # or ninja build</pre> <p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>の変更があれば<code>meson compile</code>だけで済むようになる。</p> <p>Release版などをインストールするユーザ側:基本的にautotoolsの流れに近い</p> <pre class="code bash" data-lang="bash" data-unlink>$ cd &lt;project dir&gt; # meson.buildのある場所に移動 $ meson setup &lt;build dir&gt; # ./configure に相当 $ cd &lt;build dir&gt; $ meson compile # make に相当 $ meson install # make install に相当</pre> <p><code>meson install</code>について: <a href="https://mesonbuild.com/Installing.html">Installing</a></p> <p></section></p> <p><section></p> <h2 id="mesonbuild設定ファイルの書き方">meson.build(設定ファイル)の書き方</h2> <p>mesonを使うには<strong><code>meson.build</code>ファイルが必須</strong>になる。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ内に存在しないとエラーになる。</p> <p>公式Tutorialに最低限の書き方がある。</p> <p><a href="https://mesonbuild.com/Tutorial.html">Tutorial</a></p> <p>最低限必要なのは以下2行になる。</p> <pre class="code meson.build" data-lang="meson.build" data-unlink>project(&#39;project name&#39;, &#39;language&#39;) executable(&#39;実行ファイル名&#39;, [&#39;source code path&#39;])</pre> <p>if文やforreach文なんかも使える。 if文が使えるので指定の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>だったら特定の引数を追加するような書き方もできる。 (あまり複雑な条件設定にするとカオスになりそうだが)</p> <p>他に使える構文: <a href="https://mesonbuild.com/Syntax.html">Syntax</a></p> <p>※<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>ライクに書けて変数設定もできるが、予約された識別子と自分が設定した変数なのかがわかりにくくなるので注意。</p> <p>また、built-in optionや変数の値を確認するには<a href="https://mesonbuild.com/Reference-manual_functions.html#message"><code>message</code>関数</a>が使える。built-in optionは<a href="https://mesonbuild.com/Reference-manual_functions.html#get_option"><code>get_option</code></a>関数でアクセスできる。</p> <pre class="code meson.build" data-lang="meson.build" data-unlink>project(&#39;project name&#39;, &#39;language&#39;) flag=false executable(&#39;実行ファイル名&#39;, [&#39;source code path&#39;]) message(flag) message(&#39;b_asneeded: &#39;, get_option(&#39;b_asneeded&#39;))</pre> <p>これらの<code>message</code>は<code>meson setup</code>したときに表示される。</p> <p></section></p> <p><section></p> <h2 id="引数設定のススメ">引数設定のススメ</h2> <p>ビルドツールを使うということは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>やリンカの引数設定をするはずなのでその方法についてまとめる。</p> <p>引数指定方法は主に3つある。</p> <ul> <li><strong>nativeファイル内で指定してmesonコマンドのときに上書きする</strong></li> <li><code>meson.build</code>ファイル内で指定</li> <li>meson側で読み込む<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>を使う</li> </ul> <p> おすすめは一番上のカスタム用のnativeファイルを作成してそこで指定しておくやり方である。 これだと元の<code>meson.build</code>ファイルを基本いじらずにnativeファイルから上書きして設定できる。</p> <p>実際に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>やリンカにどの引数が指定されてビルドされているかを確認するには</p> <pre class="code bash" data-lang="bash" data-unlink>$ meson compile --verbose</pre> <p><section></p> <h3 id="nativeファイルの書き方使い方">nativeファイルの書き方・使い方</h3> <p>nativeファイルの書き方: <a href="https://mesonbuild.com/Machine-files.html#cross-and-native-file-reference">Cross and Native File reference</a></p> <p>※ただし、 meson側のbuilt-in optionにより勝手に設定される<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>やリンカへの引数がわかりにくい(特に明示がない)ので注意。 built-in optionの一覧は <a href="https://mesonbuild.com/Builtin-options.html#base-options">Built-in options</a>で確認できる。</p> <p>毎度検索するのは大変なのでtemplateファイルを残す。</p> <p><details> <summary>native_template.ini</summary></p> <pre class="code ini" data-lang="ini" data-unlink>## native file ## &#34;constants&#34; that can be used on .ini files ### 🔗 https://mesonbuild.com/Machine-files.html#constants [constants] ## &#34;Properties&#34; that is key value pairs accessed using the meson.get_external_property(), or meson.get_cross_property(). ### 🔗 https://mesonbuild.com/Machine-files.html#properties [properties] # cmake_toolchain_file=&#39;&#39; # specifies an absolute path to an already existing CMake toolchain file that will be loaded with include() as the last instruction of the automatically generated CMake toolchain file from Meson. (new in 0.56.0) # cmake_defaults=&#39;&#39; # is a boolean that specifies whether Meson should automatically generate default toolchain variables from other sections (binaries, host_machine, etc.) in the machine file. Defaults are always overwritten by variables set in the [cmake] section. The default is true. (new in 0.56.0) # cmake_skip_compiler_test=&#39;&#39; # is an enum that specifies when Meson should automatically generate toolchain variables to skip the CMake compiler sanity checks. This only has an effect if cmake_defaults is true. Supported values are always, never, dep_only. The default is dep_only. (new in 0.56.0) # cmake_use_exe_wrapper=&#39;&#39; # is a boolean that controls whether to use the exe_wrapper specified in [binaries] to run generated executables in CMake subprojects. This setting has no effect if the exe_wrapper was not specified. The default value is true. (new in 0.56.0) # java_home=&#39;&#39; ## Project specific options ### Being able to set project specific options in a cross or native file can be done using the [project options] section of the specific file (if doing a cross build the options from the native file will be ignored) ### ⚠ require to define options in `meson_option.txt` ### able to set -Doption when using `meson` command on terminal ### able to access using `get_option()` in `meson.build`file ### 🔗 https://mesonbuild.com/Machine-files.html#project-specific-options [project options] ## Binaries ### 🔗 https://mesonbuild.com/Machine-files.html#binaries [binaries] # c = &#39;gcc&#39; # c_ld=&#39;ld&#39; # cpp=&#39;g++&#39; # cpp_ld=&#39;ld&#39; # ar=&#39;ar&#39; # sed = &#39;sed&#39; # llvm-config = &#39;/usr/lib/llvm-11/bin/llvm-config&#39; ## Builtin-options ### 🔗 https://mesonbuild.com/Builtin-options [built-in options] ### Compiler options 🔗 https://mesonbuild.com/Builtin-options.html#compiler-options # c_args=[] # C compile arguments to use # c_link_args=[] # C link arguments to use # c_std=&#39;none&#39; # &#39;none&#39;/&#39;c89&#39;/&#39;c99&#39;/&#39;c11&#39;/&#39;c17&#39;/&#39;c18&#39;/&#39;c2x&#39;/&#39;gnu89&#39;/&#39;gnu99&#39;/&#39;gnu11&#39;/&#39;gnu17&#39;/&#39;gnu18&#39;/&#39;gnu2x&#39; # C language standard to use # c_winlibs=[] # see below free-form comma-separated list # Standard Windows libs to link against # c_thread_count=4 #integer value ≥ 0 # Number of threads to use with emcc when using threads # cpp_args=[] # free-form comma-separated list # C++ compile arguments to use # cpp_link_args=[] # free-form comma-separated list # C++ link arguments to use # cpp_std=&#39;none&#39; # none/c++98/c++03/c++11/c++14/c++17/c++20/c++2a/c++1z/gnu++03/gnu++11/gnu++14/gnu++17/gnu++1z/gnu++2a, gnu++20, vc++14, vc++17, vc++latest C++ language standard to use # cpp_debugstl=false # true/false # C++ STL debug mode # cpp_eh=&#39;default&#39; # none/default/a/s/sc # C++ exception handling type # cpp_rtti=true # true/false # Whether to enable RTTI (runtime type identification) # cpp_thread_count=4 # integer value ≥ 0 # Number of threads to use with emcc when using threads # cpp_winlibs=[] # see below free-form comma-separated list # Standard Windows libs to link against # fortran_std=&#39;none&#39; # [none, legacy, f95, f2003, f2008, f2018] # Fortran language standard to use # cuda_ccbindir=&#39;&#39; # filesystem path # CUDA non-default toolchain directory to use (-ccbin) (Added in 0.57.1) ### Universal options 🔗 https://mesonbuild.com/Builtin-options.html#universal-options #### Directories # prefix=&#39;/usr/local&#39; # prefix defaults to &#39;C:/&#39; on Windows, and &#39;/usr/local&#39; otherwise. # Installation prefix # bindir=&#39;bin&#39; # Executable directory # datadir=&#39;share&#39; # Data file directory # includedir=&#39;include&#39; # Header file directory # infodir=&#39;share/info&#39; # Info page directory # libdir=&#39;&#39; # `libdir` is automatically detected based on your platform, it should be correct when doing &#34;native&#34; (build machine == host machine) compilation. For cross compiles Meson will try to guess the correct libdir, but it may not be accurate, especially on Linux where different distributions have different defaults. Using a cross file, particularly the paths section may be necessary. # Library directory # libexecdir=&#39;libexec&#39; # Library executable directory # localedir=&#39;share/locale&#39; # Locale data directory # localstatedir=&#39;var&#39; # Localstate data directory # mandir=&#39;share/man&#39; # Manual page directory # sbindir=&#39;sbin&#39; # System executable directory # sharedstatedir=&#39;com&#39; # Architecture-independent data directory # sysconfdir=&#39;etc&#39; # Sysconf data directory ### Core options 🔗 https://mesonbuild.com/Builtin-options.html#core-options # auto_features=&#39;auto&#39; # {enabled, disabled, auto} # Override value of all &#39;auto&#39; features # backend=&#39;ninja&#39; # {ninja, vs, vs2010, vs2012, vs2013, vs2015, vs2017, vs2019, vs2022, xcode} # Backend to use # buildtype=&#39;debug&#39; # {plain, debug, debugoptimized, release, minsize, custom} # Build type to use # debug=true # Debug # default_library=&#39;shared&#39; # {shared, static, both} # Default library type # errorlogs=true # Whether to print the logs from failing tests. # install_umask=&#39;022&#39; # {preserve, 0000-0777} # Default umask to apply on permissions of installed files no no # layout=&#39;mirror&#39; {mirror,flat} # Build directory layout # optimization=&#39;0&#39; # {0, g, 1, 2, 3, s} # Optimization level # pkg_config_path=&#39;&#39; # {OS separated path} # Additional paths for pkg-config to search before builtin paths # cmake_prefix_path=[] # Additional prefixes for cmake to search before builtin paths yes no # stdsplit=true # Split stdout and stderr in test logs # strip=false # Strip targets on install # unity=&#39;off&#39; # {on, off, subprojects} # Unity build # unity_size=4 # {&gt;=2} # Unity file block size no no # warning_level=1 # {0, 1, 2, 3} Set the warning level. From 0 = none to 3 = highest no yes # werror=false # Treat warnings as errors # wrap_mode=&#39;default&#39; {default, nofallback, nodownload, forcefallback, nopromote} # Wrap mode to use no no # force_fallback_for=[] # Force fallback for those dependencies no no ### Base option 🔗 https://mesonbuild.com/Builtin-options.html#base-options # b_asneeded=true # true/false # Use -Wl,--as-needed when linking # b_bitcode=false # true/false # Embed Apple bitcode, see below # b_colorout=&#39;always&#39; # auto/always/never # Use colored output # b_coverage=false # true/false # Enable coverage tracking # b_lundef=true # true/false # Don&#39;t allow undefined symbols when linking # b_lto=false # true/false # Use link time optimization # b_lto_threads=0 # Any integer* # Use multiple threads for lto. (Added in 0.57.0) # b_lto_mode=&#39;default&#39; # default/thin # Select between lto modes, thin and default. (Added in 0.57.0) # b_ndebug=false # true/false # if-release Disable asserts # b_pch=true # true/false # Use precompiled headers # b_pgo=&#39;off&#39; # off/generate/use # Use profile guided optimization # b_sanitize=&#39;none&#39; # see below Code sanitizer to use # b_staticpic=true # true/false # Build static libraries as position independent # b_pie=false # true/false # Build position-independent executables (since 0.49.0) # b_vscrt=&#39;from_buildtype&#39; #none/md/mdd/mt/mtd/from_buildtype/static_from_buildtype # VS runtime library to use (since 0.48.0) (static_from_buildtype since 0.56.0)</pre> <p></details></p> <p>上書き方法は</p> <pre class="code bash" data-lang="bash" data-unlink>$ meson setup &lt;build dir&gt; --native-file &lt;native&gt;.ini</pre> <p><section></p> <h4 id="例nativeファイルからコンパイラをclangに変える">例:nativeファイルから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>をclangに変える</h4> <pre class="code mermaid" data-lang="mermaid" data-unlink>graph BT subgraph &#34;--native-file native_clang.ini&#34; c[&#34;c: clang&#34;] subgraph &#34;default native&#34; c_d[&#34;c: gcc&#34;] end c_d -..-&gt; c end</pre> <p><code>native_clang.ini</code>ファイルを作る。</p> <pre class="code native_clang.ini" data-lang="native_clang.ini" data-unlink>[binaries] c=&#39;clang&#39; cpp=&#39;clang++&#39;</pre> <pre class="code bash" data-lang="bash" data-unlink>$ meson setup &lt;build_dir&gt; --native-file native_clang.ini</pre> <p>C compilerがclangになってれば設定できている。</p> <p><figure class="figure-image figure-image-fotolife" title="result: meson setup"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220324/20220324212852.jpg" alt="f:id:cartman0:20220324212852j:plain" width="800" height="281" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>result: meson setup</figcaption></figure></p> <p></section></p> <p></section></p> <p><section></p> <h3 id="mesonbuildファイル内に書く"><code>meson.build</code>ファイル内に書く</h3> <ul> <li><a href="https://mesonbuild.com/Reference-manual_functions.html#project"><code>project</code>関数</a>内の<code>default_options={}</code>で指定:</li> <li>add関数で指定 <ul> <li><a href="https://mesonbuild.com/Reference-manual_functions.html#add_project_arguments"><code>add_project_arguments()</code></a>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>の引数を指定できる</li> <li><a href="https://mesonbuild.com/Reference-manual_functions.html#add_project_link_arguments"><code>add_project_link_arguments()</code></a>: リンカの引数を指定</li> </ul> </li> <li><code>executable</code>関数内の<code>override_options={}</code>で指定</li> </ul> <p><code>override_options</code>は実行ファイル生成時にのみ引数が有効になり、<code>mesage</code> や<code>get_option</code>でアクセスしたときには有効にならないので使わないほうがいい。</p> <p></section></p> <p><section></p> <h3 id="環境変数を使うケース"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>を使うケース</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>を使うやり方はCMakeのように扱える。</p> <p>meson側が参照する予約されている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>一覧:</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmesonbuild.com%2FReference-tables.html%23compiler-and-linker-selection-variables" title="Reference tables" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://mesonbuild.com/Reference-tables.html#compiler-and-linker-selection-variables">mesonbuild.com</a></cite></p> <p>この一覧の大文字で表されてるのが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>になる。各言語の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>やリンカはここの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>でも設定できる。</p> <p>※ただし、mesonでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>の設定が<code>meson.build</code>ファイル上でできない?ぽい。つまり設定ファイル上で制御できない。 実用するならsetup用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">シェルスクリプト</a>を書いたほうが扱いやすい。</p> <p><section></p> <h4 id="例-環境変数を使ってgccでなくclangでビルドする場合">例: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>を使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>でなくclangでビルドする場合</h4> <ul> <li><code>CC</code>: C<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a></li> <li><code>CXX</code>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a></li> </ul> <p>なのでこれらに<code>clang</code>, <code>clang++</code>を設定すればいい。</p> <p>command:</p> <pre class="code bash" data-lang="bash" data-unlink>$ CC=clang CXX=clang++ meson setup &lt;build dir&gt;</pre> <p>一応事前に<code>set CC=clang</code>のようにも書いておけるが上のように書けば、 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>後のコマンドが子プロセス扱いで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>が引き継がれるのでこっちの書き方推奨。</p> <p></section></p> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmesonbuild.com%2F" title="The Meson Build system" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://mesonbuild.com/">mesonbuild.com</a></cite></p></li> </ul> <p></aside></p> <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script> <script>mermaid.initialize({startOnLoad: true});</script> Thu, 24 Mar 2022 22:13:35 +0900 hatenablog://entry/13574176438076304858 meson はてなブログでmermaidの図を描く https://cartman0.hatenablog.com/entry/2022/03/16/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7mermaid%E3%81%AE%E5%9B%B3%E3%82%92%E6%8F%8F%E3%81%8F?utm_source=feed <h1 id="はてなブログでmermaidの図を描く"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>でmermaidの図を描く</h1> <p><a href="https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/">Githubでもサポートされた</a>mermaidを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>でも描けないか試したところ多少なんとかなったのでメモ。</p> <pre class="code lang-markdown" data-lang="markdown" data-unlink><span class="synSpecial"> ```mermaid</span> graph TB H[&quot;Hatenaで&quot;] M[&quot;mermaid&quot;] H--&gt;M <span class="synSpecial"> ```</span> </pre> <p>👇上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/markdown">markdown</a>コードがこうなる</p> <pre class="code mermaid" data-lang="mermaid" data-unlink>graph TB H[&#34;Hatenaで&#34;] M[&#34;mermaid&#34;] H--&gt;M</pre> <p><nav></p> <ul class="table-of-contents"> <li><a href="#はてなブログでmermaidの図を描く">はてなブログでmermaidの図を描く</a><ul> <li><a href="#mermaidって何">mermaidって何?</a><ul> <li><a href="#サポートしてる図">サポートしてる図</a></li> </ul> </li> <li><a href="#記事に埋め込むコード">記事に埋め込むコード</a><ul> <li><a href="#注意点">注意点</a></li> </ul> </li> <li><a href="#Example">Example</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script> <script>mermaid.initialize({startOnLoad: true});</script> <p><section></p> <h2 id="mermaidって何">mermaidって何?</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Graphviz">Graphviz</a>やPlantUMLのようにコードで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%ED%A1%BC%A5%C1%A5%E3%A1%BC%A5%C8">フローチャート</a>のような図を描ける。 JSで書かれているのでHTML上にそのまま<a class="keyword" href="http://d.hatena.ne.jp/keyword/SVG">SVG</a>画像として出力できる。</p> <p><a href="https://mermaid-js.github.io/mermaid/#/">mermaid - Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.</a></p> <p>基本図形のみの描画はまだないぽい</p> <p><section></p> <h3 id="サポートしてる図">サポートしてる図</h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%ED%A1%BC%A5%C1%A5%E3%A1%BC%A5%C8">フローチャート</a>(有向、無向グラフ含む)</li> <li>シーケンス図</li> <li>クラス図</li> <li>状態遷移図</li> <li>ER図</li> <li>カスタマージャーニー</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%C8%A5%C1%A5%E3%A1%BC%A5%C8">ガントチャート</a></li> <li>円グラフ</li> <li>要求図</li> </ul> <p>など</p> <p>無向グラフは描けるが、Springレイアウトなどはない</p> <p></section></p> <p>オンラインエディタがあるので確認できる。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmermaid.live%2Fedit" title="Online FlowChart &amp; Diagrams Editor - Mermaid Live Editor" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://mermaid.live/edit">mermaid.live</a></cite></p> <p></section></p> <p><section></p> <h2 id="記事に埋め込むコード">記事に埋め込むコード</h2> <ol> <li>次のmermaidの<a class="keyword" href="http://d.hatena.ne.jp/keyword/CDN">CDN</a>を読み込む</li> <li><code>class=mermaid</code>タグの中にmermaidのコードを書くと自動で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%F3%A5%C0%A5%EA%A5%F3%A5%B0">レンダリング</a>される</li> </ol> <pre class="code lang-html" data-lang="html" data-unlink><span class="synIdentifier">&lt;</span><span class="synStatement">div</span><span class="synIdentifier"> </span><span class="synType">class</span><span class="synIdentifier">=</span><span class="synConstant">&quot;mermaid&quot;</span><span class="synIdentifier">&gt;</span> mermaid code <span class="synIdentifier">&lt;/</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">&quot;https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js&quot;</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span><span class="synSpecial">mermaid.initialize</span>(<span class="synIdentifier">{</span><span class="synSpecial">startOnLoad: </span><span class="synConstant">true</span><span class="synIdentifier">}</span>)<span class="synSpecial">;</span><span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> </pre> <p><section></p> <h3 id="注意点">注意点</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>ではテキストが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%AD%A1%BC%A5%EF%A1%BC%A5%C9">はてなキーワード</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C6%B0%A5%EA%A5%F3%A5%AF">自動リンク</a>される場合がありこのときmermaidの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%F3%A5%C0%A5%EA%A5%F3%A5%B0">レンダリング</a>はうまくいかない。回避策としてコードブロックで囲めばいい。</p> <pre class="code lang-markdown" data-lang="markdown" data-unlink><span class="synSpecial"> ```mermaid</span> &lt;mermaidのコード&gt; <span class="synSpecial"> ```</span> </pre> <p>ただし、この場合<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>のコードブロックの<a class="keyword" href="http://d.hatena.ne.jp/keyword/CSS">CSS</a>スタイルが当てられてしまうので<code>pre.code.mermaid</code>のときはスタイルが当たらないように修正する必要がある。</p> <p>例えば、以下のようにすると<code>.mermaid</code>のときだけスタイルをリセットできる。</p> <pre class="code lang-css" data-lang="css" data-unlink><span class="synComment">/*mermaid用*/</span> <span class="synIdentifier">.entry-content</span> <span class="synStatement">pre</span><span class="synIdentifier">.code.mermaid</span> <span class="synIdentifier">{</span> <span class="synType">background</span>: <span class="synConstant">none</span>; <span class="synType">border</span>: <span class="synConstant">none</span>; <span class="synType">padding</span>: <span class="synConstant">0</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">.entry-content</span> <span class="synStatement">pre</span><span class="synIdentifier">.code.mermaid</span><span class="synSpecial">[</span><span class="synConstant">data-lang</span><span class="synSpecial">=</span><span class="synConstant">&quot;mermaid&quot;</span><span class="synSpecial">]</span>:<span class="synPreProc">before</span> <span class="synIdentifier">{</span> <span class="synType">content</span>: <span class="synConstant">none</span>; <span class="synIdentifier">}</span> </pre> <p></section></p> <p></section></p> <p><section></p> <h2 id="Example">Example</h2> <p>有向グラフが描けるので次のような論証図が描ける。</p> <pre class="code mermaid" data-lang="mermaid" data-unlink>flowchart TB subgraph P[&#34;前提&#34;] direction LR subgraph A[&#34;(1)形而上学的認識は、経験的判断ではない&#34;] direction LR A1[&#34;(1) 形而上学的認識&#34;] A2[&#34;経験的判断ではない&#34;] A1 --&gt; A2 end subgraph B[&#34;(2)その認識がア・プリオリでないならば、その認識は経験的判断である&#34;] direction LR B1[&#34;(2)その認識がア・プリオリでない&#34;] B2[&#34;その認識は経験的判断である&#34;] B1 --&gt; B2 end subgraph C[&#34;(3)純粋性に基づく認識のみが、ア・プリオリである&#34;] direction LR C1[&#34;(3)その認識がア・プリオリである&#34;] C2[&#34;純粋性に基づく認識である&#34;] C1 --&gt; C2 end end subgraph A_c[&#34;(1)対偶:それが経験的判断であるならば、それは形而上学的認識でない&#34;] direction LR A_c1[&#34;(1)対偶:それが経験的判断である&#34;] A_c2[&#34;それは形而上学的認識でない&#34;] A_c1 --&gt; A_c2 end A&lt;-. &#34;対偶&#34; .-&gt;A_c subgraph C_c[&#34;(3)対偶:純粋性に基づく認識でないならばア・プリオリでない&#34;] direction LR C_c1[&#34;(3)対偶:純粋理性に基づく認識でない&#34;] C_c2[&#34;その認識はア・プリオリでない&#34;] C_c1 --&gt; C_c2 end C&lt;-. &#34;対偶&#34; .-&gt;C_c C_c2 -..-&gt; B1 B2 -..-&gt; A_c1 subgraph Con[&#34;結論&#34;] direction LR Con1[&#34;純粋理性に基づく認識でない&#34;] Con2[&#34;それは形而上学的認識でない&#34;] Con1----&gt;Con2 end C_c1-..-&gt;Con1 A_c2-..-&gt;Con2 </pre> <pre class="code lang-markdown" data-lang="markdown" data-unlink><span class="synSpecial"> ```mermaid</span> flowchart TB subgraph P[&quot;前提&quot;] direction LR subgraph A[&quot;(1)形而上学的認識は、経験的判断ではない&quot;] direction LR A1[&quot;(1) 形而上学的認識&quot;] A2[&quot;経験的判断ではない&quot;] A1 --&gt; A2 end subgraph B[&quot;(2)その認識がア・プリオリでないならば、その認識は経験的判断である&quot;] direction LR B1[&quot;(2)その認識がア・プリオリでない&quot;] B2[&quot;その認識は経験的判断である&quot;] B1 --&gt; B2 end subgraph C[&quot;(3)純粋性に基づく認識のみが、ア・プリオリである&quot;] direction LR C1[&quot;(3)その認識がア・プリオリである&quot;] C2[&quot;純粋性に基づく認識である&quot;] C1 --&gt; C2 end end subgraph A_c[&quot;(1)対偶:それが経験的判断であるならば、それは形而上学的認識でない&quot;] direction LR A_c1[&quot;(1)対偶:それが経験的判断である&quot;] A_c2[&quot;それは形而上学的認識でない&quot;] A_c1 --&gt; A_c2 end A&lt;-. &quot;対偶&quot; .-&gt;A_c subgraph C_c[&quot;(3)対偶:純粋性に基づく認識でないならばア・プリオリでない&quot;] direction LR C_c1[&quot;(3)対偶:純粋理性に基づく認識でない&quot;] C_c2[&quot;その認識はア・プリオリでない&quot;] C_c1 --&gt; C_c2 end C&lt;-. &quot;対偶&quot; .-&gt;C_c C_c2 -..-&gt; B1 B2 -..-&gt; A_c1 subgraph Con[&quot;結論&quot;] direction LR Con1[&quot;純粋理性に基づく認識でない&quot;] Con2[&quot;それは形而上学的認識でない&quot;] Con1----&gt;Con2 end C_c1-..-&gt;Con1 A_c2-..-&gt;Con2 <span class="synSpecial"> ```</span> </pre> <p><a href="https://mermaid.live/edit#pako:eNqdld9r01AUx_-VcJ8sLIV0b0UKzdU3H0R9MyIxubWBNhlZgsgY9KZDnOtYYTJlIMLwFx1dRVTEn3_MNU198l_wnqRpliat6fIQwsk55_u9n3tPsoU0Syeoihot64HWVG1HuCUrpsCvTffefVvdaArXbyvI390fH_QVdCd6pxs20RzDMoVrN6JIqqLOKy5JJf_HyaTT-_3liT98ExzvTAb7k-FzRkesQ4NPvT_vDnnQf_xqfDRk9C3E6YDRnZnIYqG6FAkIuQqpBvUKTy2qVpcEUazxmiRETF0xc5Yog4NKidEXjJ7FK-sx74R1v7HuM9YdMG8Ad9ACIbh7u4y-56tPV43y7HnM2ytAQpZW9ZFqKgOdi7iRI1JyAVIYHK6Xgo9Pgw974w7vduq__Mroa0YPYtEzRn-BbY4m33lBHFiKxIrhyDTF4WFZZjS3KmKB51nMQUmm4642nY_RT59-_vv9GOx6PW50Efv5wwPJowXjNb_PWVLcgLSqg1k7XhwfmlVcgGY0XLz-HJvw3WWxLPBvTGhGQUJZrPGsDDcccVtPXP9vq9JzV2AmsqzwlFVGNeg_Wi48a4oTYufGrIgdHEPDWWg4Cw0n0KBAEMtlmFEpCslxALYiC9cyww9lf3J6tAyHZUqzGVkBgWVe5NCAmsivGtRnBgrohCuCtORwxqEKWkNtYrdVQ-f_ty1IUJDTJG2ioCp_1ElDdVuOghRzm6e6G7rqkKu64Vg2qjbU1iZZQ6rrWDcfmhqqOrZL4qQrhsqhtadZ2_8AXwxhbg">Online FlowChart &amp; Diagrams Editor - Mermaid Live Editor</a></p> <blockquote><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%EE%CC%F0%CC%D0%BC%F9">野矢茂樹</a>, 「論理ト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A1%BC%A5%CB%A5%F3">レーニン</a>グ」, p.112 例題4</p></blockquote> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="https://mermaid-js.github.io/mermaid/#/">mermaid - Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.</a></p></li> <li><p><a href="https://mermaid.live/edit">Online FlowChart &amp; Diagrams Editor - Mermaid Live Editor</a></p></li> <li><p><a href="https://maku77.github.io/hugo/advanced/mermaid.html">mermaid.js &#x3067; Markdown &#x4E2D;&#x306B; UML &#x56F3;&#x3092;&#x57CB;&#x3081;&#x8FBC;&#x3080; | &#x307E;&#x304F;&#x307E;&#x304F;Hugo/Go&#x30CE;&#x30FC;&#x30C8;</a></p></li> </ul> <p></aside></p> Wed, 16 Mar 2022 10:30:03 +0900 hatenablog://entry/13574176438073413590 mermaid はてなブログ UML SVG emscriptenでよくみるoption-flagをまとめる https://cartman0.hatenablog.com/entry/2022/03/15/_emscripten%E3%81%A7%E3%82%88%E3%81%8F%E3%81%BF%E3%82%8Boption-flag%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B?utm_source=feed <h1 id="emscriptenでよくみるoption-flagをまとめる"><a class="keyword" href="http://d.hatena.ne.jp/keyword/emscripten">emscripten</a>でよくみるoption-flagをまとめる</h1> <p><code>emcc --help</code>しても出てこないオプション(e.g. clang由来のものとか)もあってよくわからんとなったのでメモ。</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#emscriptenでよくみるoption-flagをまとめる">emscriptenでよくみるoption-flagをまとめる</a><ul> <li><a href="#環境事前準備">環境・事前準備</a></li> <li><a href="#困ったときのコマンド">困ったときのコマンド</a></li> <li><a href="#emscriptenのコンパイラとリンカ">emscriptenのコンパイラとリンカ</a></li> <li><a href="#コンパイラ用オプションとリンカ用オプション">コンパイラ用オプションとリンカ用オプション</a><ul> <li><a href="#コンパイラ用オプション">コンパイラ用オプション</a></li> <li><a href="#リンカ用オプション">リンカ用オプション</a></li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境事前準備">環境・事前準備</h2> <p>今回はDocker上に<a href="https://github.com/emscripten-core/emsdk">emscripten</a>をインストールした状況を想定してる。</p> <ul> <li>Windows10 64bit <ul> <li>WSL2</li> <li>DockerDesktop 4.5.1 (74721)</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="困ったときのコマンド">困ったときのコマンド</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B0%A5%B0%A4%EB">ググる</a>前にやっとくべきコマンド</p> <pre class="code" data-lang="" data-unlink>$ emcc --help | grep -- -&lt;option-flag&gt;</pre> <p>または<a class="keyword" href="http://d.hatena.ne.jp/keyword/LLVM">LLVM</a>/clang由来のオプションもあるので</p> <pre class="code" data-lang="" data-unlink>$ clang --help | grep -- -&lt;option-flag&gt;</pre> <p><code>grep</code>でハイフン付きoptionやflagの文字列を検索すると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/grep">grep</a>のオプション扱いになってしまうので注意。対処としてハイフン2つ<code>--</code>をつけるとkeyword argumentの終了を表し、その後がposition argumentの指定になり 検索できる。これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/grep">grep</a>以外の<a class="keyword" href="http://d.hatena.ne.jp/keyword/UNIX">UNIX</a>コマンドでも大抵有効なTIPSである。</p> <p>ref:<a href="https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean/11382#11382">shell - What does &quot;--&quot; (double-dash) mean? - Unix &amp; Linux Stack Exchange</a></p> <p></section></p> <p><section></p> <h2 id="emscriptenのコンパイラとリンカ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/emscripten">emscripten</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>とリンカ</h2> <p><code>emcc</code>には<code>.c</code><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>を渡すとそのまま<code>.js</code>とバイナリファイルの<code>.wasm</code>が生成されるのでわかりにくいが、 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>とリンカが動作している。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>名 emcc: code <code>emcc -c &lt;c source&gt; -o &lt;object code&gt;.o</code></li> <li>リンカ名 ld.wasm : code <code>emcc -o &lt;output js&gt;.js &lt;object code&gt;.o</code></li> </ul> <p>ちなみにリンカはJSで読みこみ実行するための<code>.wasm</code>ファイルも生成してる。</p> <p></section></p> <p><section></p> <h2 id="コンパイラ用オプションとリンカ用オプション"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>用オプションとリンカ用オプション</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>用オプションとリンカ用オプションに分けられるので分類する。</p> <p><section></p> <h3 id="コンパイラ用オプション"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>用オプション</h3> <pre class="code" data-lang="" data-unlink> &#34;-c&#34;: [compile] Tells *emcc* to emit an object file which can then be linked with other object files to produce an executable.</pre> <p>リンク前のobjectファイル(<code>.o</code>)を生成するのに必要なオプション。</p> <pre class="code" data-lang="" data-unlink>-I&lt;include path&gt;, -I &lt;include path&gt;</pre> <p>includeするファイルを検索したい場所を指定する。(clang由来のオプション) カレント<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを追加する場合、<code>-I.</code> と指定する。</p> <pre class="code" data-lang="" data-unlink>-fcolor-diagnostics: Enable colors in diagnostics</pre> <p>Warningを表示するときに黄色になるなど診断に色付けをする</p> <pre class="code" data-lang="" data-unlink>-D_FILE_OFFSET_BITS=64</pre> <p>64bitでも取り扱えるというオプションのはずだが詳細不明(<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>/clamg由来)</p> <pre class="code" data-lang="" data-unlink>-W&lt;warning&gt;: Enable the specified warning -W&lt;warnings&gt;: -Wall, -Werror, -Wno-error= -Werror= -w: Suppress all warnings 全警告を伏せる</pre> <p>警告の表示を設定する。</p> <pre class="code" data-lang="" data-unlink>-O0: incremental builds &#34;-O0&#34; is best, while for release you should link not include various runtime assertions in JS that *-O0* would do. with -O0 or -O1 link-time optimization flags. -O1: include LLVM &#34;-O1&#34; optimizations. During the link step this does [compile+link] Like &#34;-O1&#34;, but enables more optimizations. During with -O0 or -O1 link-time optimization flags.</pre> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>の最適化を設定</p> <pre class="code" data-lang="" data-unlink>&#34;-g&#34;: * When linking, this is equivalent to -g3. &#34;-g3&#34;: When compiling to object files, keep debug info, (DWARF) if any (this is the same as -g).</pre> <p>objectファイルへの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>情報を残すか</p> <pre class="code" data-lang="" data-unlink>-MD: Write a depfile containing user and system headers -MQ &lt;value&gt;: Specify name of main file output to quote in depfile -MF &lt;file&gt;: Write depfile output from -MMD, -MD, -MM, or -M to &lt;file&gt;</pre> <p>依存関係をまとめたファイルdepsfile(<code>.d</code>)の設定をする。出力する場合は<code>-MF &lt;output&gt;.d</code>となる。</p> <p></section></p> <p><section></p> <h3 id="リンカ用オプション">リンカ用オプション</h3> <p>基本的には<code>-s OPTION[=VALUE]</code>で設定できる。</p> <p>一覧は以下のjsファイルにある。</p> <p><a href="https://github.com/emscripten-core/emscripten/blob/main/src/settings.js">emscripten/settings.js at main &middot; emscripten-core/emscripten &middot; GitHub</a></p> <pre class="code" data-lang="" data-unlink>-s WASM=0: -s WASM=1: -s WASM=2: Whether to use compile code to WebAssembly. Set this to 0 to compile to &#34;JS&#34; instead of wasm. Specify &#34;-s WASM=2&#34; to target both WebAssembly and JavaScript at the same time. In that build mode, two files a.wasm and a.wasm.js are produced, and at runtime the WebAssembly file is loaded if browser/shell supports it. Otherwise the .wasm.js fallback will be used. If WASM=2 is enabled and the browser fails to compile the WebAssembly module, the page will be reloaded in Wasm2JS mode.</pre> <ul> <li><code>-s WASM=0</code>: wasmでなくJSファイルのみ</li> <li><code>-s WASM=1</code>: wasmファイルとそれを読み込んで実行してくれるJS(基本的にこれ)</li> <li><code>-s WASM=2</code>: おそらく、wasmをサポートした環境であれば1のときと同じように実行、対応してなければ0のときと同じJSのみの実行</li> </ul> <pre class="code" data-lang="" data-unlink>-s EXPORT_ALL=0 -s EXPORT_ALL=1 : If true, we export all the symbols that are present in JS onto the Module object.</pre> <p>おそらく、出力JSの中に存在するすべてのシンボルを<code>Module.exports()</code>でエクスポートする。</p> <pre class="code" data-lang="" data-unlink>-s ERROR_ON_UNDEFINED_SYMBOLS=0 -s ERROR_ON_UNDEFINED_SYMBOLS=1 : If set to 1, we will give a link-time error on any undefined symbols (see WARN_ON_UNDEFINED_SYMBOLS). To allow undefined symbols at link time set this to 0, in which case if an undefined function is called a runtime error will occur. Any undefined symbols that are listed in EXPORTED_FUNCTIONS will also be reported. [link]</pre> <p>未定義シンボルのエラーを出すか、基本的に1でいい。</p> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><a href="https://github.com/emscripten-core/emscripten/blob/main/src/settings.js">emscripten/settings.js at main &middot; emscripten-core/emscripten &middot; GitHub</a></li> </ul> <p></aside></p> Tue, 15 Mar 2022 08:43:51 +0900 hatenablog://entry/13574176438073121783 emscripten Compiler DockerでExited(139)が出たときの対処 https://cartman0.hatenablog.com/entry/2022/03/07/Docker%E3%81%A7Exited%28139%29%E3%81%8C%E5%87%BA%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6?utm_source=feed <h1 id="DockerでExited139が出たときの対処">DockerでExited(139)が出たときの対処</h1> <p><code>doker run</code>したときにコンテナが立ち上がらず<code>Exited(139)</code>で終了してしまうときの対処メモ。</p> <p>この終了コードはDocker Desktop上でも確認できる。</p> <p><figure class="figure-image figure-image-fotolife" title="Exited(139)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220307/20220307003209.png" alt="f:id:cartman0:20220307003209p:plain" width="594" height="192" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Exited(139)</figcaption></figure></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#DockerでExited139が出たときの対処">DockerでExited(139)が出たときの対処</a><ul> <li><a href="#環境事前準備">環境・事前準備</a></li> <li><a href="#対処方法">対処方法</a></li> <li><a href="#原因">原因</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境事前準備">環境・事前準備</h2> <ul> <li>Windows10 64bit <ul> <li>WSL2</li> <li>DockerDesktop 4.5.1 (74721)</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="対処方法">対処方法</h2> <p>wsl2側で立ち上げているOS側の問題なのでWSL2の設定を変更する.</p> <ol> <li> <a class="keyword" href="http://d.hatena.ne.jp/keyword/windows">windows</a>側のエディタで`%PROFILE%\.wslconfig`ファイルを開く。なければテキストファイルとして作る。 </li> <li> 次の設定を追加。 <pre><code> [wsl2] kernelCommandLine = vsyscall=emulate </code></pre> </li> <li> PCを再起動 </li> <li> 設定変更が適用されたかの確認 <pre><code> > wsl cat /proc/cmdline initrd=\initrd.img panic=-1 pty.legacy_count=0 nr_cpus=12 vsyscall=emulate </code></pre> <figure class="figure-image figure-image-fotolife" title="&#x60;vsyscall=emulate&#x60;を確認"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220307/20220307003205.png" alt="f:id:cartman0:20220307003205p:plain" width="800" height="49" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>&#x60;vsyscall=emulate&#x60;を確認</figcaption></figure> </li> </ol> <p>ここまでできてれば<code>docker run</code>でコンテナを立ち上げできる.</p> <p></section></p> <p><section></p> <h2 id="原因">原因</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a>などの古いOSでは<code>vsyscall</code>が使われる場合がある。しかしWSL2ではデフォではOFFなのでDocker側で使おうとすると立ち上がらずexitedしてしまう、らしい。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2FWSL%2Fissues%2F4694%23issuecomment-556095344" title="Enable vsyscall=emulate in the kernel config to run older base images such as Centos 6 · Issue #4694 · microsoft/WSL" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/microsoft/WSL/issues/4694#issuecomment-556095344">github.com</a></cite></p> <p><code>emulate</code>するように設定すれば問題なくなる。</p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="https://qiita.com/nakat-t/items/271071eeb0c0c9143396">Docker Windows (WSL2) &#x3067; centos:6 &#x7B49;&#x306E;&#x53E4;&#x3044;&#x30B3;&#x30F3;&#x30C6;&#x30CA;&#x304C; Exited (139) &#x3067;&#x8D77;&#x52D5;&#x3057;&#x306A;&#x3044;&#x554F;&#x984C;&#x306E;&#x5BFE;&#x51E6;&#x6CD5; - Qiita</a></p></li> </ul> <p></aside></p> Mon, 07 Mar 2022 00:36:32 +0900 hatenablog://entry/13574176438070230779 Docker WSL2 Docker+VSCodeのRust環境を作る https://cartman0.hatenablog.com/entry/2022/02/15/Docker%2BVSCode%E3%81%AERust%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%82%8B?utm_source=feed <h1 id="DockerVSCodeのRust環境を作る">Docker+<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>のRust環境を作る</h1> <p>RustがCと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>の間(C寄り)の中級型言語でCより書きやすく速度はCと大差ないらしいということで、触りたくなったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>での環境構築を調べたメモ。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>アプリを作るようなケースでなければ以下の方法で問題ないはず。</p> <ul> <li>.devcontainerを使わない方法(1ファイルのみの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>・実行なら可能)</li> <li>.devcontainerを使う方法(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%B9%A5%DA%A1%BC%A5%B9">ワークスペース</a>・パッケージ単位のビルド、1パッケージの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>、補完やらが可能。基本的にはこっち)</li> </ul> <p><nav></p> <ul class="table-of-contents"> <li><a href="#DockerVSCodeのRust環境を作る">Docker+VSCodeのRust環境を作る</a><ul> <li><a href="#環境事前準備">環境・事前準備</a></li> <li><a href="#Rustはどんな言語か">Rustはどんな言語か</a></li> <li><a href="#devcontainerを使わない場合">.devcontainerを使わない場合</a></li> <li><a href="#devcontainerを使う場合">.devcontainerを使う場合</a><ul> <li><a href="#出来上がるファイル構成">出来上がるファイル構成</a></li> <li><a href="#動作確認">動作確認</a></li> <li><a href="#Rust-workspaceの設定">Rust workspaceの設定</a></li> <li><a href="#デバッグの設定">デバッグの設定</a></li> <li><a href="#ビルド用のタスク設定">ビルド用のタスク設定</a></li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境事前準備">環境・事前準備</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>(+<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>RemoteContainer)とDockerDesktopはインストール済みを想定</p> <ul> <li>Windows10 64bit <ul> <li>VSCode1.64.1 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>:<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a> Remote Container</li> </ul> </li> <li>DockerDesktop 4.5</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="Rustはどんな言語か">Rustはどんな言語か</h2> <p><a href="https://www.rust-lang.org/ja">https://www.rust-lang.org/ja</a></p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>のような静的型付けの言語</li> <li>高低レイヤ具合を比較すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> > Go > Rust > <a class="keyword" href="http://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a> あたりで速度はこの逆になってくる</li> <li>特徴として、メモリ安全性とスレッドセーフがよく言われる</li> <li>エラーメッセージが丁寧</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E6%A5%CB%A5%C3%A5%C8%A5%C6%A5%B9%A5%C8">ユニットテスト</a>が標準機能でできる</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>は<code>rustc.rs</code>でRustで書かれているself-host型になる。 <ul> <li>ここの解説がわかりやすい <a href="https://www.quora.com/Was-Rust-written-in-C-C">https://www.quora.com/Was-Rust-written-in-C-C</a></li> <li><p>詳細:<a href="https://rustc-dev-guide.rust-lang.org/overview.html">Overview of the Compiler - Guide to Rustc Development</a></p></li> <li><p>最初の方は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ocaml">Ocaml</a>あたりで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>されていて途中からRust自身に変わったらしい。教師学習から自己学習に変わったと考えるとなかなか生物っぽくて面白い.<a href="https://www.sigbus.info/compilerbook">&#x4F4E;&#x30EC;&#x30A4;&#x30E4;&#x3092;&#x77E5;&#x308A;&#x305F;&#x3044;&#x4EBA;&#x306E;&#x305F;&#x3081;&#x306E;C&#x30B3;&#x30F3;&#x30D1;&#x30A4;&#x30E9;&#x4F5C;&#x6210;&#x5165;&#x9580;</a> でも触れてるが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>の名残りがあるとすると生物学の祖先の遺伝子に近いものが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>にもあるんだなあ。</p></li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB">チュートリアル</a>教科書:The Rust Programming Language 日本語版 <a href="https://doc.rust-jp.rs/book-ja/">The Rust Programming Language &#x65E5;&#x672C;&#x8A9E;&#x7248; - The Rust Programming Language &#x65E5;&#x672C;&#x8A9E;&#x7248;</a></li> </ul> <p>インストールした環境では以下のコマンドが使えるようになる。</p> <ul> <li>rustc:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a></li> <li>cargo: NodeJSのnpmに近い</li> <li>rustup: rustのバージョン管理、ク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B9%A5%B3%A5%F3">ロスコン</a>パイルのターゲット先指定</li> </ul> <p></section></p> <p><section></p> <h2 id="devcontainerを使わない場合">.devcontainerを使わない場合</h2> <p>これは公式のRustイメージで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>する方法である。</p> <p>まず、公式のRustイメージをインストールしておく。</p> <pre class="code cmd" data-lang="cmd" data-unlink>docker pull rust:latest</pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>で以下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Hello%20World">Hello World</a>のコードを書く。 なお直接<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>上にRustをインストールしてないのでマクロの補完は効かない。</p> <pre class="code lang-rust" data-lang="rust" data-unlink><span class="synComment">// hello.rs</span> <span class="synStatement">fn</span> <span class="synIdentifier">main</span>(){ <span class="synPreProc">println!</span>(<span class="synConstant">&quot;hello world!&quot;</span>) } </pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ構造は</p> <pre class="code" data-lang="" data-unlink>- Project - hello.rs</pre> <p>こいつを<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>上のターミナルから<code>rustc</code>コマンドで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>する。</p> <pre class="code powershell" data-lang="powershell" data-unlink>PS Project&gt; docker run -it --rm -v &#34;$(PWD):/usr/src/myapp&#34; rust /bin/sh -c &#34;rustc / usr/src/myapp/hello.rs; ./hello&#34; hello world!</pre> <p><figure class="figure-image figure-image-fotolife" title="Rustコンテナ立ち上げと同時にコンパイル"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220238.png" alt="f:id:cartman0:20220214220238p:plain" width="800" height="53" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Rustコンテナ立ち上げと同時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a></figcaption></figure></p> <p></section></p> <p><section></p> <h2 id="devcontainerを使う場合">.devcontainerを使う場合</h2> <ul> <li>公式のRustイメージをインストールする必要なし(間接的にレイヤとしてインストールされるが)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>可能(lldbデバッガ)</li> </ul> <p>参考: <a href="https://www.sun-m.co.jp/blog/tips/414.html">VS Code + Remote Containers &#x3067;&#x5FEB;&#x9069;&#x306A; Dev &#x30E9;&#x30A4;&#x30D5;&#x3092; | &#x30B5;&#x30F3;&#x30FB;&#x30A8;&#x30E0;&#x30FB;&#x30B7;&#x30B9;&#x30C6;&#x30E0;&#x682A;&#x5F0F;&#x4F1A;&#x793E;</a></p> <ol> <li> プロジェクト(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%B9%A5%DA%A1%BC%A5%B9">ワークスペース</a>)にするフォルダを右クリックして<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>を開く </li> <li> 左下「Open a Remote Window」マークをクリック <figure class="figure-image figure-image-fotolife" title="Open a Remote Container"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220251.png" alt="f:id:cartman0:20220214220251p:plain" width="314" height="261" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Open a Remote Window</figcaption></figure> </li> <li>「Reopen in Container」を選択。 <figure class="figure-image figure-image-fotolife" title="Reopen in Container"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220235.jpg" alt="f:id:cartman0:20220214220235j:plain" width="762" height="334" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Reopen in Container</figcaption></figure> </li> <li>ここで対応している言語が選べる。今回は「Rust」を選ぶ。 <figure class="figure-image figure-image-fotolife" title="言語選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220241.png" alt="f:id:cartman0:20220214220241p:plain" width="571" height="325" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>言語選択</figcaption></figure> </li> <li> ContainerのOSを選択。「buster」にする。 <figure class="figure-image figure-image-fotolife" title="ContainerのOS選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220244.png" alt="f:id:cartman0:20220214220244p:plain" width="608" height="136" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ContainerのOS選択</figcaption></figure> </li> <li>追加インストールするものを決める。今回はなし <figure class="figure-image figure-image-fotolife" title="言語選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220254.png" alt="f:id:cartman0:20220214220254p:plain" width="763" height="356" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>オプションのインストール</figcaption></figure> </li> </ol> <p>以上全てを設定するとDLが始まる。</p> <p>この手順で導入すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>用Rustイメージ(公式のRustイメージがベースイメージ)がインストールされる。 (初期インストールは時間がかかる)</p> <ul> <li>pullされるイメージは <a href="https://hub.docker.com/_/microsoft-vscode-devcontainers">https://hub.docker.com/_/microsoft-vscode-devcontainers</a> の中の<a href="https://github.com/microsoft/vscode-dev-containers/tree/master/containers/rust"><code>mcr.microsoft.com/vscode/devcontainers/rust - bullseye, buster</code></a>になる。</li> </ul> <p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>がnpmのローカルインストールと同じ感じでインストールされる。</p> <p>devcontainerを閉じた後にもう1度開くには, 左下マークをクリックして「Open Folder in Container」を選択してプロジェクト用のフォルダを開いてあげればいい。</p> <p><section></p> <h3 id="出来上がるファイル構成">出来上がるファイル構成</h3> <p>インストールが終わると次のファイル構成になる。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>側が生成したものとRust側が生成したものがあるので注意。</p> <pre class="code" data-lang="" data-unlink>- Project - .git - .gitignore - .devcontainer - Dockerfile // このイメージがdocker pullされる - .vscode - launch.json // デバッガ用の構成ファイル // 👆ここまでがVSCode側で生成 // 👇ここからcargo initで生成されたファイル - src - main.rs // hello worldが書かれている - Cargo.toml // Rustのパッケージ情報など - Cargo.lock // Rustのworkspace内での依存関係の明示など</pre> <p></section></p> <p><section></p> <h3 id="動作確認">動作確認</h3> <p>Rust関連のコマンドが使えるか確認</p> <pre class="code bash" data-lang="bash" data-unlink>vscode ➜ /workspaces/rust_project (main ✗) $ cargo -V cargo 1.58.0 (f01b232bc 2022-01-19)</pre> <pre class="code bash" data-lang="bash" data-unlink>vscode ➜ /workspaces/rust_project (main ✗) $ rustc -V rustc 1.58.1 (db9d1b20b 2022-01-20)</pre> <pre class="code bash" data-lang="bash" data-unlink>vscode ➜ /workspaces/rust_project (main) $ rustup --version rustup 1.24.3 (ce5817a94 2021-05-31) info: This is the version for the rustup toolchain manager, not the rustc compiler. info: The currently active `rustc` version is `rustc 1.58.1 (db9d1b20b 2022-01-20)`</pre> <p></section></p> <p><section></p> <h3 id="Rust-workspaceの設定">Rust workspaceの設定</h3> <p>上記の設定ではRustの1パッケージのファイル構成なので、 次のようなパッケージが2つあるようなworkspace用の構成に作り変える。</p> <p><a href="https://github.com/Cartman0/rust_workspace_sample">https://github.com/Cartman0/rust_workspace_sample</a></p> <p>RustのWorkspaceについて: <a href="https://sivira.github.io/rust-lang-book-ja/ch14-03-cargo-workspaces.html">Cargo&#x306E;&#x30EF;&#x30FC;&#x30AF;&#x30B9;&#x30DA;&#x30FC;&#x30B9; - &#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30DF;&#x30F3;&#x30B0;&#x8A00;&#x8A9E; Rust</a></p> <pre class="code" data-lang="" data-unlink>- Project - Cargo.toml // workspace用の設定 - Cargo.lock // workpaceあたり1つもち,依存関係を書く - p1 // package1 - Cargo.toml // package1用の設定 - src - main.rs - lib.rs - p2 // package2 - Cargo.toml // package2用の設定 - src - main.rs // 今回はp1のlibも読み込めるようにする(依存関係)</pre> <p>まず、workspace用の設定を追加する。 workspace用(直下)の<code>Cargo.toml</code>ファイルには以下のように書いてどのpackageをもつか明示する。</p> <pre class="code" data-lang="" data-unlink>// /Cargo.toml [workspace] members = [ &#34;p1&#34;, &#34;p2&#34; ]</pre> <p>workspace用の<code>Cargo.lock</code>にはpackage同士の依存関係を書く。 この<code>dependencies</code>を書かないと外側のパッケージのファイルを見れずエラーになる。</p> <pre class="code" data-lang="" data-unlink>// /Cargo.lock [[package]] name = &#34;p1&#34; version = &#34;0.1.0&#34; [[package]] name = &#34;p2&#34; version = &#34;0.1.0&#34; dependencies = [ &#34;p1&#34;, ]</pre> <p>次に各パッケージの設定を追加する。</p> <p>p1<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを作った後にその中で<code>cargo init</code>すればパッケージの初期設定が得られる。 (今回はライブラリファイルをもつので<code>cargo init --lib</code>でもいい)</p> <pre class="code bash" data-lang="bash" data-unlink>Project&gt; mkdir p1 cd p1 cargo init</pre> <p><code>p1/Cargo.toml</code>の中を確認する。 気をつけるべきは<code>[package]</code>となっているかと<code>name</code>と<code>[dependencies]</code>の部分。 <code>name</code>の部分がworkspaceの設定に使われる。今回は外部依存はないので<code>[dependencies]</code>は空のままでいい。</p> <pre class="code" data-lang="" data-unlink>// p1/Cargo.toml [package] name = &#34;p1&#34; version = &#34;0.1.0&#34; edition = &#34;2021&#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies]</pre> <p>p1にはライブラリファイルを使いたいので以下のような公開モジュールにしておく。</p> <pre class="code lang-rust" data-lang="rust" data-unlink><span class="synComment">// p1/src/lib.rs</span> <span class="synStatement">pub</span> <span class="synStatement">mod</span> <span class="synIdentifier">my</span>{ <span class="synStatement">pub</span> <span class="synStatement">fn</span> <span class="synIdentifier">hey</span>(){ <span class="synPreProc">println!</span>(<span class="synConstant">&quot;hey!&quot;</span>); } } </pre> <p><code>p1/src/main.rs</code>はライブラリを読み込めるように以下のようにしておく。</p> <pre class="code lang-rust" data-lang="rust" data-unlink><span class="synStatement">use</span> <span class="synPreProc">p1</span><span class="synSpecial">::</span>my; <span class="synStatement">fn</span> <span class="synIdentifier">main</span>() { <span class="synPreProc">println!</span>(<span class="synConstant">&quot;Hello, world! p1&quot;</span>); <span class="synPreProc">my</span><span class="synSpecial">::</span><span class="synIdentifier">hey</span>(); } </pre> <p>次に<code>p2</code>の設定をする。 外部のp1に依存するのでpathを<code>Cargo.toml</code>に設定する。 このとき読み込むときの名前を変えられる。</p> <pre class="code" data-lang="" data-unlink>//p2/Cargo.toml [package] name = &#34;p2&#34; version = &#34;0.1.0&#34; edition = &#34;2021&#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] p1 = { path = &#34;../p1&#34; }</pre> <p><code>p2/main.rs</code>は次のようにする。外部ライブラリの読み込みもp1と同じように読み込める。</p> <pre class="code lang-rust" data-lang="rust" data-unlink><span class="synComment">// p2/src/main.rs</span> <span class="synStatement">use</span> <span class="synPreProc">p1</span><span class="synSpecial">::</span>my; <span class="synStatement">fn</span> <span class="synIdentifier">main</span>() { <span class="synPreProc">my</span><span class="synSpecial">::</span><span class="synIdentifier">hey</span>(); <span class="synPreProc">println!</span>(<span class="synConstant">&quot;Hello, world! p2&quot;</span>); } </pre> <p>以上でソースの設定はok。</p> <p></section></p> <p><section></p> <h3 id="デバッグの設定"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>の設定</h3> <p>次に<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>・ビルドの設定をする。 設定ファイルは以下のように対応している。</p> <ul> <li>ビルドのみ:コマンドか<code>.vscode/tasks.json</code></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>:<code>.vscode/launch.json</code></li> </ul> <p>workspaceのビルドはProject直下で</p> <pre class="code bash" data-lang="bash" data-unlink>cargo build //or cargo build --workspace</pre> <p>実際に試すと以下のような結果が得られ、<code>target</code><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リに実行ファイルが生成される。</p> <pre class="code bash" data-lang="bash" data-unlink>vscode ➜ /workspaces/rust_project (main ✗) $ cargo build Compiling p2 v0.1.0 (/workspaces/rust_project/p2) Compiling p1 v0.1.0 (/workspaces/rust_project/p1) Finished dev [unoptimized + debuginfo] target(s) in 8.10s</pre> <p>パッケージごとにビルドしたい場合は<code>-p &amp;lt;package name&amp;gt;</code>をつける。</p> <pre class="code bash" data-lang="bash" data-unlink>vscode ➜ /workspaces/rust_project (main ✗) $ cargo build -p p1 Finished dev [unoptimized + debuginfo] target(s) in 0.09s</pre> <p><code>.vscode/launch.json</code>を設定すれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>できる。 ただし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>のlldbデバッガでは1つの実行ファイルしか追えないので<code>cargo build --workspace</code>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>ではエラーが出る。</p> <p><figure class="figure-image figure-image-fotolife" title="Error: Cargo has produced more than one matching compilation artifact"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220222.png" alt="f:id:cartman0:20220214220222p:plain" width="533" height="150" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Error: Cargo has produced more than one matching compilation artifact</figcaption></figure></p> <p>なので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>のlaunch.<a class="keyword" href="http://d.hatena.ne.jp/keyword/json">json</a>はpackageごとに設定すればいい。 <code>"configurations":</code>に追加していけばいい。 <code>cargo</code>属性中の<code>args</code>属性の配列が実行されるコマンドになる。 また、"filter"の指定がないとエラーになる。</p> <pre class="code lang-json" data-lang="json" data-unlink><span class="synSpecial">{</span> ..., &quot;<span class="synStatement">configurations</span>&quot;: <span class="synSpecial">[</span> <span class="synSpecial">{</span> &quot;<span class="synStatement">type</span>&quot;: &quot;<span class="synConstant">lldb</span>&quot;, &quot;<span class="synStatement">request</span>&quot;: &quot;<span class="synConstant">launch</span>&quot;, &quot;<span class="synStatement">name</span>&quot;: &quot;<span class="synConstant">Debug 'p1' in 'rust_project'</span>&quot;, &quot;<span class="synStatement">cargo</span>&quot;: <span class="synSpecial">{</span> &quot;<span class="synStatement">args</span>&quot;: <span class="synSpecial">[</span> &quot;<span class="synConstant">build</span>&quot;, &quot;<span class="synConstant">-p</span>&quot;, &quot;<span class="synConstant">p1</span>&quot;, &quot;<span class="synConstant">--verbose</span>&quot; <span class="synSpecial">]</span>, &quot;<span class="synStatement">filter</span>&quot;: <span class="synSpecial">{</span> &quot;<span class="synStatement">kind</span>&quot;: &quot;<span class="synConstant">bin</span>&quot; <span class="synSpecial">}</span> <span class="synSpecial">}</span>, &quot;<span class="synStatement">args</span>&quot;: <span class="synSpecial">[]</span>, &quot;<span class="synStatement">cwd</span>&quot;: &quot;<span class="synConstant">${workspaceFolder}</span>&quot; <span class="synSpecial">}</span>, ... <span class="synSpecial">]</span>, ... </pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>の「Run and Debug」から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>を実行できる。 1度実行すると<code>main</code>関数上部にクリック可能なボタンが追加される。</p> <p><figure class="figure-image figure-image-fotolife" title="パッケージp1のデバッグ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220225.png" alt="f:id:cartman0:20220214220225p:plain" width="510" height="309" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>パッケージp1の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a></figcaption></figure></p> <p></section></p> <p><section></p> <h3 id="ビルド用のタスク設定">ビルド用のタスク設定</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>しないのであればタスクとして、コマンドを<code>.vscode/tasks.json</code>に設定できる。 例えば,先程のworkspace全体のビルドを登録するとき次のように追加すればいい。</p> <pre class="code lang-json" data-lang="json" data-unlink><span class="synSpecial">{</span> ..., &quot;<span class="synStatement">tasks</span>&quot;: <span class="synSpecial">[</span> <span class="synSpecial">{</span> &quot;<span class="synStatement">label</span>&quot;: &quot;<span class="synConstant">rust: cargo build workspace</span>&quot;, &quot;<span class="synStatement">type</span>&quot;: &quot;<span class="synConstant">cargo</span>&quot;, &quot;<span class="synStatement">command</span>&quot;: &quot;<span class="synConstant">build</span>&quot;, &quot;<span class="synStatement">problemMatcher</span>&quot;: <span class="synSpecial">[</span> &quot;<span class="synConstant">$rustc</span>&quot; <span class="synSpecial">]</span>, &quot;<span class="synStatement">args</span>&quot;: <span class="synSpecial">[</span> &quot;<span class="synConstant">--workspace</span>&quot;, &quot;<span class="synConstant">--verbose</span>&quot; <span class="synSpecial">]</span>, &quot;<span class="synStatement">group</span>&quot;: &quot;<span class="synConstant">build</span>&quot;, &quot;<span class="synStatement">presentation</span>&quot;: <span class="synSpecial">{</span> &quot;<span class="synStatement">reveal</span>&quot;: &quot;<span class="synConstant">always</span>&quot;, <span class="synError">// Terminalパネルを開く</span> &quot;<span class="synStatement">clear</span>&quot;: <span class="synConstant">true</span>, <span class="synError">// 実行前にTerminalをクリア</span> <span class="synSpecial">}</span>, &quot;<span class="synStatement">options</span>&quot;: <span class="synSpecial">{</span> <span class="synSpecial">}</span> <span class="synSpecial">}</span>, ...<span class="synSpecial">]</span>, ... <span class="synSpecial">}</span> </pre> <p>"Terminal > Run Task"を選択すると登録したタスク一覧(labelに設定してタスク名)が出るので選ぶと実行される。。</p> <p><figure class="figure-image figure-image-fotolife" title="taskの選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220214/20220214220231.jpg" alt="f:id:cartman0:20220214220231j:plain" width="757" height="165" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>taskの選択</figcaption></figure></p> <p>実行結果:</p> <pre class="code bash" data-lang="bash" data-unlink>&gt; Executing task: cargo build --workspace --verbose &lt; Fresh p2 v0.1.0 (/workspaces/rust_project/p2) Fresh p1 v0.1.0 (/workspaces/rust_project/p1) Finished dev [unoptimized + debuginfo] target(s) in 0.75s Terminal will be reused by tasks, press any key to close it.</pre> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p>[https://qiita.com/kishibashi3/items/e20aecef45ed8341e739:embed:cite]</p></li> </ul> <p></aside></p> Tue, 15 Feb 2022 00:58:45 +0900 hatenablog://entry/13574176438063503729 Rust VSCode Docker Jupyter上にGraphvizの図をSVGで描画する https://cartman0.hatenablog.com/entry/2022/02/11/Jupyter%E4%B8%8A%E3%81%ABGraphviz%E3%81%AE%E5%9B%B3%E3%82%92SVG%E3%81%A7%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B?utm_source=feed <h1 id="Jupyter上にGraphvizの図をSVGで描画する">Jupyter上に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Graphviz">Graphviz</a>の図を<a class="keyword" href="http://d.hatena.ne.jp/keyword/SVG">SVG</a>で描画する</h1> <p>Jupyter上に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Graphviz">Graphviz</a>(.dot)の図を<a class="keyword" href="http://d.hatena.ne.jp/keyword/SVG">SVG</a>で描画することに成功したのでメモとして残す。(※<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>としてはまだ作れていない)</p> <p>Viz.jsのおかげで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>のインストールすら不要になった..!</p> <p>dotファイルのコードを書いてあげればこうなる👇</p> <p><figure class="figure-image figure-image-fotolife" title="jupyter上にGraphvizの図を描画"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220211/20220211190623.png" alt="f:id:cartman0:20220211190623p:plain" width="565" height="367" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>jupyter上に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Graphviz">Graphviz</a>の図を描画</figcaption></figure></p> <p>gist上では表示されないがnbviewerを通せば図も表示される。</p> <p><a href="https://nbviewer.org/gist/Cartman0/5a7cfadc2f367869f2df506577ace525">https://nbviewer.org/gist/Cartman0/5a7cfadc2f367869f2df506577ace525</a></p> <p>また、IPythonの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>周りの挙動もドキュメントがなく分かりづらいのメモとして残す。</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#Jupyter上にGraphvizの図をSVGで描画する">Jupyter上にGraphvizの図をSVGで描画する</a><ul> <li><a href="#試した環境">試した環境</a></li> <li><a href="#how-to-use">how to use</a></li> <li><a href="#動作の仕組み">動作の仕組み</a><ul> <li><a href="#Vizjsとは">Viz.jsとは</a></li> <li><a href="#iPythonとJavaScriptの連携">iPythonとJavaScriptの連携</a><ul> <li><a href="#iPython上でJSを動かす方法">iPython上でJSを動かす方法</a></li> <li><a href="#iPython上のJSからpythonの実行">iPython上のJSからpythonの実行</a></li> </ul> </li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="試した環境">試した環境</h2> <p>DockerDesktopはインストール済みを想定</p> <ul> <li>Windows10 64bit <ul> <li>DockerDesktop 4.4 <ul> <li>scipy-notebook Image <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> 3.8.4</li> </ul> </li> </ul> </li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="how-to-use">how to use</h2> <p>gist:</p> <p><script src="https://gist.github.com/Cartman0/5a7cfadc2f367869f2df506577ace525.js"> </script><cite class="hatena-citation"><a href="https://gist.github.com/Cartman0/5a7cfadc2f367869f2df506577ace525">gist.github.com</a></cite></p> <ol> <li>最初のセルのコードをノートブックの一番上などで事前に実行しておく(<a class="keyword" href="http://d.hatena.ne.jp/keyword/CDN">CDN</a>のjsファイルを読み込むので最初はオンライン環境でないといけない)</li> <li><code>drawDot</code>関数にdotファイル中身の文字列を渡して実行</li> </ol> <p></section></p> <p><section></p> <h2 id="動作の仕組み">動作の仕組み</h2> <p>Viz.jsや<code>IPython.notebook.kernel</code>の仕様がわかりにくいのでメモ。 <code>IPython.notebook.kernel</code>に至っては詳しいドキュメントがなくjupyterのショートカットのコードあたりを読まないと挙動がわからん感じになってる。</p> <p>今回はほぼ<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>で動作しており出力セルへの表示だけ<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>が行っている。</p> <ol> <li>RequireJSでViz.jsとそれ用のrender.jsを読み込む(Jupyterは外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を<code>script</code>タグだけで読み込めないらしいので)</li> <li>Viz<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の作成(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Graphviz">Graphviz</a>のdotコードを画像に変換してくれる)</li> <li><code>Viz.renderSVGElement()</code>関数で<code>.dot</code>コードを<a class="keyword" href="http://d.hatena.ne.jp/keyword/svg">svg</a>に変換</li> <li>この<a class="keyword" href="http://d.hatena.ne.jp/keyword/svg">svg</a>はjsのSVGElementオブジェクトなのでこれを<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>に渡せるように<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%A2%A5%E9%A5%A4%A5%BA">シリアライズ</a>して文字列(改行あり)に変換</li> <li><code>IPython.notebook.kernel.excute</code>にpyrhon側の<code>SVG</code>関数を渡して出力セルに表示させる。<code>cell.output_area.append_output({})</code>関数を使って出力セルに表示させると<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>コードを実行したときのようにノートブックファイル(.ipynb)に<a class="keyword" href="http://d.hatena.ne.jp/keyword/svg">svg</a>コードが保存される。</li> </ol> <p><section></p> <h3 id="Vizjsとは">Viz.jsとは</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Graphviz">Graphviz</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Javascript">Javascript</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/EcmaScript">EcmaScript</a>)で書いたもの。NodeJS用かと思ったら<a class="keyword" href="http://d.hatena.ne.jp/keyword/CDN">CDN</a>がありブラウザ上でも動作する模様。</p> <p>ブラウザ上で動かしている例:<a href="https://qiita.com/basho/items/431af27b2fc6e90c9469">&#xFF1C;&#x521D;&#x5FC3;&#x8005;&#xFF1E;Vue.js&#x3068;viz.js&#x3067;graphviz&#x306E;&#x30AA;&#x30F3;&#x30E9;&#x30A4;&#x30F3;&#x30A8;&#x30C7;&#x30A3;&#x30BF;&#x3092;&#x4F5C;&#x3063;&#x3066;&#x307F;&#x305F;&#x3002;&#xFF1C;Vue.js&#x7DF4;&#x7FD2;&#xFF1E; - Qiita</a></p> <ul> <li>オンラインエディタで動くこれが凄い: <a href="http://viz-js.com/">Viz.js</a></li> <li>Viz.jsそのものの使い方は公式<a class="keyword" href="http://d.hatena.ne.jp/keyword/wiki">wiki</a>にある:<a href="https://github-wiki-see.page/m/mdaines/viz.js/wiki/Usage">Usage - mdaines/viz.js Wiki</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>: <a href="https://github.com/mdaines/viz.js/">GitHub - mdaines/viz.js: A hack to put Graphviz on the web.</a></li> </ul> <p>恐らく2系より仕様が変わりrenderと分かれるようになり、dotコードを変換するにはViz<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を作成してそこから関数を呼ぶ必要がある。</p> <p></section></p> <p><section></p> <h3 id="iPythonとJavaScriptの連携">iPythonと<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>の連携</h3> <p>この辺、情報が少ないのでメモ</p> <p><section></p> <h4 id="iPython上でJSを動かす方法">iPython上でJSを動かす方法</h4> <p>まず iPython上でもJSは動く。 主に2種類ある。</p> <ul> <li> <code>iPython.display.HTML</code>かマジックコマンド<code>%%HTML</code>を使って<code>&lt;script&gt;</code>タグ内にJSコードを書く <pre class="code lang-html" data-lang="html" data-unlink>%%HTML <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synSpecial"> ..</span><span class="synComment">// your js code</span> <span class="synSpecial"> </span><span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> </pre> </li> <li> <code>iPython.display.Javascript</code>かマジックコマンド<code>%%javascript</code>を使う <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> iPython.display <span class="synPreProc">import</span> Javascript Javascript(<span class="synConstant">'''</span> <span class="synConstant"> ..// your js code</span> <span class="synConstant">'''</span>) </pre> </li> </ul> <p>この2つに大きな違いはないが、<code>this</code>の参照先が変わるので注意。</p> <ul> <li>前者:<code>this == window</code></li> <li>後者:<code>this==</code>実行したセルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/jQuery">jQuery</a>での<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a></li> </ul> <p></section></p> <p><section></p> <h4 id="iPython上のJSからpythonの実行">iPython上のJSから<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>の実行</h4> <p> iPython上のJSのメリットとしてJSから<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>を実行できる。 これにより、</p> <ul> <li>JSの計算結果を<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>に渡して処理(今回はこっち側に近い)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>の計算結果をコールバックで受け取り、JSで表示</li> </ul> <p>などが可能になる。</p> <p>例:numpyの計算結果をJSの<code>alert</code>で表示している:</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fenakai00.hatenablog.com%2Fentry%2F2016%2F12%2F10%2F141301" title="Jupyterノートブック上でJavaScriptからカーネルのコードを実行する方法 - めもめも" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://enakai00.hatenablog.com/entry/2016/12/10/141301">enakai00.hatenablog.com</a></cite></p> <p>JS側で使える<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>として<code>iPython.notebook.kernel</code>がある。 この<code>iPython.notebook.kernel.execute()</code>関数に<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>コードの文字列を渡すとバックグラウンド上で実行される。</p> <p>サンプルコード例1:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> IPython.display <span class="synPreProc">import</span> Javascript jscode = <span class="synConstant">'''</span> <span class="synConstant">var kernerl=IPython.notebook.kernel;</span> <span class="synConstant">var jsobj = &quot;hello world&quot;;</span> <span class="synConstant">var pycode = `&quot;&quot;&quot;${jsobj}&quot;&quot;`;</span> <span class="synConstant">kernel.execute(pycode);</span> <span class="synConstant">'''</span> Javascript(jscode) </pre> <p>注意1:<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>側で文字列<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%C6%A5%E9%A5%EB">リテラル</a>として認識させるためにダブルクオーテーションやシングルクォーテーション等つけて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%CB%A5%BF%A5%A4%A5%BA">サニタイズ</a>する必要がある。</p> <p>JS側で<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>の計算結果を受け取るにはコールバックを渡す. ブラウザ上のコンソールに表示するだけならコールバックの結果を表示すればいい。</p> <p>サンプルコード例2:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> IPython.display <span class="synPreProc">import</span> Javascript jscode = <span class="synConstant">'''</span> <span class="synConstant">var kernel = IPython.notebook.kernel;</span> <span class="synConstant">var callback = function(output) {</span> <span class="synConstant"> console.log(output);</span> <span class="synConstant"> var res = output.content.data['text/plain'];</span> <span class="synConstant"> console.log(&quot;o:&quot;, res);</span> <span class="synConstant"> return res;</span> <span class="synConstant">};</span> <span class="synConstant">var x = 0;</span> <span class="synConstant">var pycode = `&quot;&quot;&quot;hello world &quot;&quot;&quot; + str(${x}+1)`;</span> <span class="synConstant">kernel.execute(pycode, {'iopub': {&quot;output&quot;: callback}}, {'silent':false});</span> <span class="synConstant">'''</span> Javascript(jscode) </pre> <p>ブラウザからコンソールを開く。ちなみに<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>側でエラーが出るとコールバック引数<code>output</code>にTracebackが保存される。</p> <p>コンソール :</p> <pre class="code" data-lang="" data-unlink>{header: {…}, msg_id: &#39;66a569b4-e88df9f760b38eff2762703f_219&#39;, msg_type: &#39;execute_result&#39;, parent_header: {…}, metadata: {…}, …} o: &#39;hello world 1&#39;</pre> <p>上記の例だと、セルの<code>Out</code>には何も結果が表示されない。 表示させるには、セルオブジェクトを取得して<code>cell.output_area.append_output()</code>関数が使える。</p> <p>サンプル3:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> IPython.display <span class="synPreProc">import</span> Javascript jscode = <span class="synConstant">'''</span> <span class="synConstant">var kernel = IPython.notebook.kernel;</span> <span class="synConstant">function get_exec_cell(this_of_call){</span> <span class="synConstant"> var output_area = this_of_call;</span> <span class="synConstant"> var cell_element = output_area.element.parents('.cell');</span> <span class="synConstant"> var cell_idx = Jupyter.notebook.get_cell_elements().index(cell_element);</span> <span class="synConstant"> var cell = Jupyter.notebook.get_cell(cell_idx);</span> <span class="synConstant"> return cell;</span> <span class="synConstant">}</span> <span class="synConstant">var callback = function(output) {</span> <span class="synConstant"> console.log(output)</span> <span class="synConstant"> var res = output.content.data['text/plain'];</span> <span class="synConstant"> console.log(&quot;o:&quot;, res);</span> <span class="synConstant"> var cell = get_exec_cell($this);</span> <span class="synConstant"> cell.output_area.clear_output();</span> <span class="synConstant"> cell.output_area.append_output({</span> <span class="synConstant"> output_type: &quot;stream&quot;,</span> <span class="synConstant"> name: &quot;o&quot;,</span> <span class="synConstant"> text: String(res)</span> <span class="synConstant"> });</span> <span class="synConstant"> return res;</span> <span class="synConstant">};</span> <span class="synConstant">var x = 0;</span> <span class="synConstant">var pycode = `&quot;&quot;&quot;hello world &quot;&quot;&quot;+str(${x}+1)`;</span> <span class="synConstant">$this=this</span> <span class="synConstant">kernel.execute(pycode, {'iopub': {&quot;output&quot;: callback}}, {'silent':false});</span> <span class="synConstant">'''</span> Javascript(jscode) </pre> <p>関数に渡すにはオブジェクトにする必要がある。必要なプロパティが決まっている。プロパティを満たさないとnotebookファイルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/json">json</a>がvalidにならない。</p> <p>まず <code>output_type</code>を指定する必要がある。</p> <p> テキスト出力の場合: <code>output_type: "stream"</code>、<code>name</code>:(名前)、<code>text</code>: 出力したい文字列、の3つが必要</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">//テキストの出力</span> cell.output_area.append_output(<span class="synIdentifier">{</span> output_type: <span class="synConstant">&quot;stream&quot;</span>, name: <span class="synConstant">&quot;o&quot;</span>, text: <span class="synType">String</span>(res) <span class="synIdentifier">}</span>); </pre> <p> 画像出力の場合:<code>output_type: "display_data"</code>、<code>data</code>の2つが必要。 <code>data</code>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/MIME">MIME</a>タイプを指定して画像データを渡す。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">//画像の出力</span> cell.output_area.append_output(<span class="synIdentifier">{</span> output_type: <span class="synConstant">&quot;display_data&quot;</span>, data: <span class="synIdentifier">{</span><span class="synConstant">&quot;image/svg+xml&quot;</span>: out.content.data<span class="synIdentifier">[</span><span class="synConstant">&quot;image/svg+xml&quot;</span><span class="synIdentifier">]}</span> <span class="synIdentifier">}</span>); </pre> <p>※注意:実行中のセルの取得に<code>Jupyter.notebook.get_selected_cell();</code>は使えないので注意。<kbd><kbd>SHIFT</kbd>+<kbd>ENTER</kbd></kbd>でセル実行後の次のセルが選択されてしまう。参考: <a href="https://stackoverflow.com/questions/39613822/how-to-select-current-cell-with-javascript-in-jupyter">ipython - How to select current cell with JavaScript in Jupyter? - Stack Overflow</a></p> <p></section></p> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <p><code>IPython.notebook.kernel</code> 周り:</p> <ul> <li>iPython APIを呼んだときに発行されるevent。なのでこれに関係した関数が定義されているはずだがサンプルコードの情報が少ない:<a href="https://docs.jupyter.org/en/latest/contributing/ipython-dev-guide/js_events.html">JavaScript Events &mdash; Jupyter Documentation 4.1.1 alpha documentation</a></li> <li><code>IPython.display</code>のサンプルコード集:<a href="https://www.programcreek.com/python/example/72292/IPython.display.Javascript">Python Examples of IPython.display.Javascript</a></li> <li>JS→Pythonへのコールバック関数のPromise化:<a href="https://qiita.com/chez_sugi/items/a0b46c5aa1b100e4864f">jupyter notebook&#x3067;python&#x3068;JavaScript&#x306E;&#x9023;&#x643A; - Qiita</a> </aside></li> </ul> Fri, 11 Feb 2022 19:57:21 +0900 hatenablog://entry/13574176438062329565 Jupyter Graphviz SVG 畳み込み積分は結局何を計算してるのかメモ https://cartman0.hatenablog.com/entry/2022/02/06/%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E7%A9%8D%E5%88%86%E3%81%AF%E7%B5%90%E5%B1%80%E4%BD%95%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E3%81%A6%E3%82%8B%E3%81%AE%E3%81%8B%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="畳み込み積分は結局何を計算してるのかメモ">畳み込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>は結局何を計算してるのかメモ</h1> <p>畳み込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A1%BC%A5%EA%A5%A8">フーリエ</a>か<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%D7%A5%E9%A5%B9%CA%D1%B4%B9">ラプラス変換</a>で周波数領域にすると積の形にできて便利だよねくらい雑に理解してたので、 時間領域でどんな計算してるのかメモとして残す。</p> <p>この記事で出てくる式や図はgistにまとめている。</p> <p><a href="https://gist.github.com/Cartman0/50ffbe3a6232dff3f3af35e288b996f4">convolution_integral.ipynb &middot; GitHub</a></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#畳み込み積分は結局何を計算してるのかメモ">畳み込み積分は結局何を計算してるのかメモ</a><ul> <li><a href="#なぜ畳み込み積分なんてするのか">なぜ畳み込み積分なんてするのか</a></li> <li><a href="#なぜ反転する">なぜ反転する?</a></li> <li><a href="#上図の領域を積分すると">上図の領域を積分すると...</a></li> <li><a href="#一般化して図示すると">一般化して図示すると</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="なぜ畳み込み積分なんてするのか">なぜ畳み込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>なんてするのか</h2> <p>そもそも、何故わざわざ畳み込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>なんかするのかというところで、以下の状況を想像すると多分わかりやすい。</p> <p>イメージ:</p> <ul> <li>入力信号fに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C1%C3%A3%B4%D8%BF%F4">伝達関数</a>g(例えば減衰)を適用して変化した値の総和を見たい</li> <li>=(これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C1%C3%A3%B4%D8%BF%F4">伝達関数</a>gを反転させて左から右へ通過させて重なった領域の総和(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>)に等しい)</li> </ul> <p>具体例:単位ステップ波<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f%28%5Ctau%29%3D1%280%5Cleq%20%5Ctau%20%5Cleq%201%29" alt=" f(\tau)=1(0\leq \tau \leq 1)"/>を入力して減衰関数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20g%28%5Ctau%29%3De%5E%7B-%5Ctau%7D" alt=" g(\tau)=e^{-\tau}"/>を全体に適用して入力開始からt=1秒後の出力値を考える.</p> <p>図示すると次のようになる。</p> <p><figure class="figure-image figure-image-fotolife" title="入力信号の減衰"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220206/20220206024032.png" alt="f:id:cartman0:20220206024032p:plain" width="383" height="262" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig1. 入力信号の減衰</figcaption></figure></p> <p>ほしい出力値は、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctau%3D1" alt="\tau=1"/>上の点すべての高さを総和(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>)した値が畳み込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>の値になる。</p> <p><section></p> <h2 id="なぜ反転する">なぜ反転する?</h2> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctau%3D1" alt=" \tau=1"/>上の点たちをもともとの入力にあった時間に並び替える。 例えば、オレンジの点は元々<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctau%3D0" alt="\tau=0"/>のときだったので<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctau%3D0" alt="\tau=0"/>に並び替える。 これをすべての点にやると次の図になる.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig2. 計算したかったのは反転して重なった領域だった!"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220206/20220206024039.png" alt="f:id:cartman0:20220206024039p:plain" width="383" height="262" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig2. 計算したかったのは反転して重なった領域だった!</figcaption></figure></p> <p>これはつまり反転させた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C1%C3%A3%B4%D8%BF%F4">伝達関数</a>と入力信号の重なった領域(つまり積の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>)にほかならない。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C1%C3%A3%B4%D8%BF%F4">伝達関数</a><img src="https://chart.apis.google.com/chart?cht=tx&chl=g%28%5Ctau%29" alt="g(\tau)"/>はどう変わったかを見ると、反転させて終了時間<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctau%3D1" alt="\tau=1"/>までシフトさせたもので、式に直すと<img src="https://chart.apis.google.com/chart?cht=tx&chl=g%281-%5Ctau%29" alt="g(1-\tau)"/>となる。</p> <p></section></p> <p><section></p> <h2 id="上図の領域を積分すると">上図の領域を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>すると...</h2> <p>以上の図から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>の式にすると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0Ax%28t%3D1%29%3D%5Cint_%7B%5Ctau%3D0%7D%5E%7B%5Ctau%3D1%7Df%28%5Ctau%29g%281-%5Ctau%29d%5Ctau%0A" alt=" x(t=1)=\int_{\tau=0}^{\tau=1}f(\tau)g(1-\tau)d\tau "/> </div> <p>これは畳込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>の式となる。</p> <p>ちなみに、上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>は領域が台形に似てるので台形の公式で近似できる。</p> <p>$$ (上底0.4 + 下底1)*高さ1 / 2 = 0.7 $$</p> <p>また入力信号の正方形面積の半分(0.5)より大きいので以下の範囲で収まると概算できる。</p> <p>$$ 0.5 &lt; x(t=1) &lt; 0.7 $$</p> <p>実際にたたみこみ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>を計算してみる。 範囲は<img src="https://chart.apis.google.com/chart?cht=tx&chl=0%5Cleq%20%5Ctau%20%5Cleq%201" alt="0\leq \tau \leq 1"/>とする。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C1%C3%A3%B4%D8%BF%F4">伝達関数</a>は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0Ag%28%5Ctau%29%3D%5Cexp%7B%28-%5Ctau%29%7D%0A" alt=" g(\tau)=\exp{(-\tau)} "/> </div> <p>だった。これを代入して計算すると、</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ax%28t%3D1%29%26%3D%26%5Cint_%7B%5Ctau%3D0%7D%5E%7B%5Ctau%3D1%7Df%28%5Ctau%29g%281-%5Ctau%29d%5Ctau%5C%5C%0A%26%3D%26%5Cint_%7B%5Ctau%3D0%7D%5E%7B%5Ctau%3D1%7D1%5Ccdot%20%5Cexp%7B%28-%281-%5Ctau%29%29%7Dd%5Ctau%5C%5C%0A%26%3D%26%5Cint_%7B%5Ctau%3D0%7D%5E%7B%5Ctau%3D1%7D%20%5Cexp%7B%28%5Ctau-1%29%7Dd%5Ctau%5C%5C%0A%26%3D%26%5Cexp%7B%28-1%29%7D%5Cint_%7B%5Ctau%3D0%7D%5E%7B%5Ctau%3D1%7D%20%5Cexp%7B%28%5Ctau%29%7Dd%5Ctau%5C%5C%0A%26%3D%26%5Cexp%7B%28-1%29%7D%5Cleft%5B%20%20%5Cexp%7B%28%5Ctau%29%7D%20%5Cright%5D_%7B%5Ctau%3D0%7D%5E%7B%5Ctau%3D1%7D%20%5C%5C%0A%26%3D%26%5Cexp%7B%28-1%29%7D%5Cleft%5B%20%20%5Cexp%7B%28%5Ctau%3D1%29%7D%20-%201%20%5Cright%5D%5C%5C%0A%26%3D%26%201%20-%20%5Cexp%7B%28-1%29%7D%5C%5C%0A%26%5Cfallingdotseq%26%200.632%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} x(t=1)&amp;=&amp;\int_{\tau=0}^{\tau=1}f(\tau)g(1-\tau)d\tau\\ &amp;=&amp;\int_{\tau=0}^{\tau=1}1\cdot \exp{(-(1-\tau))}d\tau\\ &amp;=&amp;\int_{\tau=0}^{\tau=1} \exp{(\tau-1)}d\tau\\ &amp;=&amp;\exp{(-1)}\int_{\tau=0}^{\tau=1} \exp{(\tau)}d\tau\\ &amp;=&amp;\exp{(-1)}\left[ \exp{(\tau)} \right]_{\tau=0}^{\tau=1} \\ &amp;=&amp;\exp{(-1)}\left[ \exp{(\tau=1)} - 1 \right]\\ &amp;=&amp; 1 - \exp{(-1)}\\ &amp;\fallingdotseq&amp; 0.632 \end{eqnarray} "/> </div> <p></section></p> <p><section></p> <h2 id="一般化して図示すると">一般化して図示すると</h2> <p>畳込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>は終了時間を変数で表す事が多いので次のような式になり、 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>結果が変数を持つので関数の形になる。</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%28f%2Ag%29%28t%29%3D%5Cint_%7B%5Ctau%3D0%7D%5E%7B%5Ctau%3D1%7Df%28%5Ctau%29g%28t-%5Ctau%29d%5Ctau%0A" alt=" (f*g)(t)=\int_{\tau=0}^{\tau=1}f(\tau)g(t-\tau)d\tau "/> </div> <p>ちなみに先程の例を変数ありで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>するとほぼ上記の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>と同じになるが、次のようになる。</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%0A%5Cbegin%7Beqnarray%7D%0A%28f%2Ag%29%28t%29%0A%26%3D%26%5Cint_%7B0%7D%5E%7Bt%7Df%28%5Ctau%29g%28t-%5Ctau%29d%5Ctau%20%5C%5C%0A%26%3D%26%20%5Cint_%7B0%7D%5E%7Bt%7D1%5Ccdot%20%5Cexp%7B%28-%28t-%5Ctau%29%29%7Dd%5Ctau%5C%5C%0A%26%3D%26%20%5Cint_%7B0%7D%5E%7Bt%7D%20%5Cexp%7B%28%5Ctau-t%29%7Dd%5Ctau%5C%5C%0A%26%3D%26%20%5Cint_%7B0%7D%5E%7Bt%7D%20%20%5Cexp%7B%28-t%29%7D%5Cexp%7B%28%5Ctau%29%7D%20d%5Ctau%20%5C%5C%0A%26%3D%26%20%5Cexp%7B%28-t%29%7D%5Cleft%5B%5Cexp%7B%28%5Ctau%29%7D%20%5Cright%5D_0%5Et%20%5C%5C%0A%26%3D%26%20%5Cexp%7B%28-t%29%7D%28%5Cexp%7B%28t%29%7D%20-%201%29%20%5C%5C%0A%26%3D%261-%5Cexp%7B%28-t%29%7D%2C%20%280%20%5Cleq%20t%20%5Cleq%201%29%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} (f*g)(t) &amp;=&amp;\int_{0}^{t}f(\tau)g(t-\tau)d\tau \\ &amp;=&amp; \int_{0}^{t}1\cdot \exp{(-(t-\tau))}d\tau\\ &amp;=&amp; \int_{0}^{t} \exp{(\tau-t)}d\tau\\ &amp;=&amp; \int_{0}^{t} \exp{(-t)}\exp{(\tau)} d\tau \\ &amp;=&amp; \exp{(-t)}\left[\exp{(\tau)} \right]_0^t \\ &amp;=&amp; \exp{(-t)}(\exp{(t)} - 1) \\ &amp;=&amp;1-\exp{(-t)}, (0 \leq t \leq 1) \end{eqnarray} "/> </div> <p>終了時刻t=0からt=1まで変えた畳み込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>の結果を図示したのが次のグラフとなる。 これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C1%C3%A3%B4%D8%BF%F4">伝達関数</a>gを反転させて終了時刻まで移動させてその時重なった領域をプロットしていったものに等しい。</p> <p><figure class="figure-image figure-image-fotolife" title="終了時刻tを変えた畳み込み積分のプロット"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220206/20220206024045.png" alt="f:id:cartman0:20220206024045p:plain" width="390" height="264" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>終了時刻tを変えた畳み込み<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>のプロット</figcaption></figure></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="https://www.ice.tohtech.ac.jp/nakagawa/laplacetrans/convolution1.htm">&#x521D;&#x5FC3;&#x8005;&#x7528; &#x7573;&#x307F;&#x8FBC;&#x307F;&#xFF08;&#x305F;&#x305F;&#x307F;&#x3053;&#x307F;&#xFF09;&#x89E3;&#x8AAC;</a></p></li> <li><p><a href="http://www-comm.cs.shinshu-u.ac.jp/public/sigproc/analogconv/">http://www-comm.cs.shinshu-u.ac.jp/public/sigproc/analogconv/</a></p></li> <li><p><a href="https://ja.wikipedia.org/wiki/%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF">&#x7573;&#x307F;&#x8FBC;&#x307F; - Wikipedia</a>: アニメーションで畳み込み積分が計算されている様子がある</p></li> </ul> <p></aside></p> Sun, 06 Feb 2022 02:59:36 +0900 hatenablog://entry/13574176438060478404 math はてなブログのコードブロックのcssスタイルを変更する https://cartman0.hatenablog.com/entry/2022/02/05/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AEcss%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%92%E5%A4%89?utm_source=feed <h1 id="はてなブログのコードブロックのcssスタイルを変更する"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>のコードブロックの<a class="keyword" href="http://d.hatena.ne.jp/keyword/css">css</a>スタイルを変更する</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>のコードブロックのスタイル変更時のメモ。</p> <ul> <li>色などのスタイル変更</li> <li>言語名の追加</li> </ul> <p>を中心にまとめる。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>の場合、意外に行数表示は<a class="keyword" href="http://d.hatena.ne.jp/keyword/CSS">CSS</a>だけではタグ構造上無理でJSが必要になりそうなので gistやcodepenみたいなサービスの埋め込み使うのもありかも。</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#はてなブログのコードブロックのcssスタイルを変更する">はてなブログのコードブロックのcssスタイルを変更する</a><ul> <li><a href="#はてなブログにおけるコードブロックのセレクタ">はてなブログにおけるコードブロックのセレクタ</a><ul> <li><a href="#Qiitaっぽいデザインにしてみる">Qiitaっぽいデザインにしてみる</a></li> </ul> </li> <li><a href="#言語名の追加">言語名の追加</a></li> <li><a href="#行数表示">行数表示</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="はてなブログにおけるコードブロックのセレクタ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>におけるコードブロックの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a></h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Markdown">Markdown</a>のコードブロック(<code>``````</code>で囲むやつ)では、実際はpreタグのみ使われており、<code>pre.code</code>となっている。 こいつのデザインを変えてあげればいい。</p> <pre class="code lang-css" data-lang="css" data-unlink><span class="synComment">/*記事中のcode*/</span> <span class="synIdentifier">.entry-content</span> <span class="synStatement">pre</span><span class="synIdentifier">.code</span> <span class="synIdentifier">{</span> // 新しいデザイン <span class="synIdentifier">}</span> </pre> <p><section></p> <h3 id="Qiitaっぽいデザインにしてみる">Qiitaっぽいデザインにしてみる</h3> <p>今回はQiitaの黒っぽいコードのデザインにしてみる。</p> <p><figure class="figure-image figure-image-fotolife" title="Qiitaのコードブロックデザイン"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20220205/20220205042449.png" alt="f:id:cartman0:20220205042449p:plain" width="727" height="206" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Qiitaのコードブロックデザイン</figcaption></figure></p> <p>参考:<a href="https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1">Qiita Markdown &#x66F8;&#x304D;&#x65B9; &#x307E;&#x3068;&#x3081; - Qiita</a></p> <p>次の色を使うとQiitaっぽくなる。</p> <pre class="code lang-css" data-lang="css" data-unlink><span class="synIdentifier">.entry-content</span> <span class="synStatement">pre</span><span class="synIdentifier">.code</span> <span class="synIdentifier">{</span> <span class="synType">font-size</span>: .<span class="synConstant">8rem</span>; <span class="synType">margin</span>: <span class="synConstant">1.5rem</span> <span class="synConstant">0</span>; <span class="synType">padding</span>: <span class="synConstant">1.5rem</span> <span class="synConstant">0.5rem</span>; <span class="synType">background-color</span>: <span class="synConstant">#364549</span>; <span class="synType">color</span>: <span class="synConstant">#e3e3e3</span>; <span class="synIdentifier">}</span> </pre> <p></section></p> <p></section></p> <p><section></p> <h2 id="言語名の追加">言語名の追加</h2> <p>コードブロックに言語名を追加しなかったまたはした場合で、以下のように微妙に属性が変わる。</p> <ul> <li>言語名あり:<code>data-lang="python"</code> のように追加される</li> <li>言語名なし:<code>data-lang</code>属性はあるが値なし</li> </ul> <p>注意点としては<code>data-lang</code>属性が必ず入る。</p> <p>なので言語名を表示する場合、<code>data-lang</code>属性の値を擬似要素<code>:before</code>などに追加して表示してあげればいい。</p> <p>今回はQiitaのように、</p> <ul> <li>言語の指定があれば左上に表示し、</li> <li>指定がなければ何も表示しない</li> </ul> <p>ようなデザインにしてみる。 ただし、この場合、単純に表示パターンでデザインすると値なしの場合に空文字を出力してデザイン崩れを起こす. なので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a>で分けて2通りにする必要がある。</p> <ul> <li><code>pre.code[data-lang=""]</code>: 言語指定なし</li> <li><code>pre.code:not([data-lang=""])</code>: 何かしらの言語指定がある</li> </ul> <p>今回は言語指定なしの場合、何も表示しないので前者は使わない。 Qiitaっぽくやると次のようになる。</p> <pre class="code lang-css" data-lang="css" data-unlink> <span class="synComment">/*言語名表示*/</span> <span class="synIdentifier">.entry-content</span> <span class="synStatement">pre</span><span class="synIdentifier">.code</span>:<span class="synIdentifier">not(</span>[data-lang=&quot;&quot;]<span class="synIdentifier">)</span> <span class="synIdentifier">{</span> <span class="synType">padding</span>: <span class="synConstant">2.3rem</span> <span class="synConstant">0.5rem</span> <span class="synConstant">1.5rem</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">.entry-content</span> <span class="synStatement">pre</span><span class="synIdentifier">.code</span>:<span class="synIdentifier">not(</span>[data-lang=&quot;&quot;]<span class="synIdentifier">)</span>:<span class="synPreProc">before</span> <span class="synIdentifier">{</span> <span class="synType">content</span>: <span class="synIdentifier">attr(</span><span class="synConstant">data-lang</span><span class="synIdentifier">)</span>; <span class="synType">display</span>: <span class="synConstant">inline-block</span>; <span class="synType">color</span>: <span class="synConstant">#eee</span>; <span class="synType">background-color</span>: <span class="synConstant">#777</span>; <span class="synType">padding</span>: <span class="synConstant">2px</span> <span class="synConstant">4px</span>; <span class="synType">position</span>: <span class="synConstant">absolute</span>; <span class="synType">transform</span>: <span class="synIdentifier">translateY(</span><span class="synConstant">-2.3rem</span><span class="synIdentifier">)</span>; <span class="synType">word-break</span>: <span class="synConstant">break-all</span>; <span class="synIdentifier">}</span> </pre> <p></section></p> <p><section></p> <h2 id="行数表示">行数表示</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>の場合、コードの毎行にタグ付けされてるわけではないのでJSでの処理が必要。JS処理で表示が遅くなりそうなので今回は見送り。</p> <p>次のページが詳しい。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fcodelife.cafe%2Fentry%2F2018%2F05%2F22%2F%25E3%2581%25AF%25E3%2581%25A6%25E3%2581%25AA%25E3%2583%2596%25E3%2583%25AD%25E3%2582%25B0%25E3%2581%25A7%25E6%259B%25B8%25E3%2581%2584%25E3%2581%259F%25E3%2582%25B3%25E3%2583%25BC%25E3%2583%2589%25E3%2583%2596%25E3%2583%25AD%25E3%2583%2583%25E3%2582%25AF%25E3%2581%25AB%25E8%25A1%258C%25E7%2595%25AA%25E5%258F%25B7%25E3%2582%2592" title="【2020年更新】はてなブログで書いたコードブロックに行番号を表示する方法(CSS+JavaScript) - 自動化厨のプログラミングメモブログ │ CODE:LIFE" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://codelife.cafe/entry/2018/05/22/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AB%E8%A1%8C%E7%95%AA%E5%8F%B7%E3%82%92#%E3%81%8A%E3%81%BE%E3%81%91%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E5%B7%A6%E4%B8%8A%E3%81%AB%E8%A8%80%E8%AA%9E%E5%90%8D%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8BCSS">codelife.cafe</a></cite></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="https://codelife.cafe/entry/2018/05/22/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AB%E8%A1%8C%E7%95%AA%E5%8F%B7%E3%82%92#%E3%81%8A%E3%81%BE%E3%81%91%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E5%B7%A6%E4%B8%8A%E3%81%AB%E8%A8%80%E8%AA%9E%E5%90%8D%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8BCSS">&#x3010;2020&#x5E74;&#x66F4;&#x65B0;&#x3011;&#x306F;&#x3066;&#x306A;&#x30D6;&#x30ED;&#x30B0;&#x3067;&#x66F8;&#x3044;&#x305F;&#x30B3;&#x30FC;&#x30C9;&#x30D6;&#x30ED;&#x30C3;&#x30AF;&#x306B;&#x884C;&#x756A;&#x53F7;&#x3092;&#x8868;&#x793A;&#x3059;&#x308B;&#x65B9;&#x6CD5;&#xFF08;CSS+JavaScript&#xFF09; - &#x81EA;&#x52D5;&#x5316;&#x53A8;&#x306E;&#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30DF;&#x30F3;&#x30B0;&#x30E1;&#x30E2;&#x30D6;&#x30ED;&#x30B0; &#x2502; CODE:LIFE</a></p></li> </ul> <p></aside></p> Sat, 05 Feb 2022 04:42:22 +0900 hatenablog://entry/13574176438060136382 はてなブログ CSS 伊勢田哲治「哲学的思考トレーニング」の感想とメモ https://cartman0.hatenablog.com/entry/2022/01/26/%E4%BC%8A%E5%8B%A2%E7%94%B0%E5%93%B2%E6%B2%BB%E3%80%8C%E5%93%B2%E5%AD%A6%E7%9A%84%E6%80%9D%E8%80%83%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%80%8D%E3%81%AE%E6%84%9F%E6%83%B3%E3%81%A8?utm_source=feed <h1 id="伊勢田哲治哲学的思考トレーニングの感想とメモ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%CB%C0%AA%C5%C4%C5%AF%BC%A3">伊勢田哲治</a>「哲学的思考ト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A1%BC%A5%CB%A5%F3">レーニン</a>グ」の感想とメモ</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%CB%C0%AA%C5%C4%C5%AF%BC%A3">伊勢田哲治</a>先生の「哲学的思考ト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A1%BC%A5%CB%A5%F3">レーニン</a>グ」(2005)を読んだので感想とメモを残す。</p> <ul> <li>哲学的思考(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>)とはなんぞやからどうやるのか</li> <li>(哲学的)議論(主張)の扱い方、さらに価値主張の扱い方</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>の大切さとどのくらい緩めるのかの文脈主義</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%B2%C4%C7%BD%C0%AD">反証可能性</a>の大切さ</li> <li>科学と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BF%BB%F7%B2%CA%B3%D8">疑似科学</a>の違いの入り口</li> <li>みんなで考える場合の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a></li> </ul> <p>などが分かる本で、 文系学生に限らずみな読んでおいたほうがいい本である.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00IE7L1W2/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41wDwgQem4L._SL500_.jpg" class="hatena-asin-detail-image" alt="哲学思考トレーニング (ちくま新書)" title="哲学思考トレーニング (ちくま新書)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00IE7L1W2/newm-22/" target="_blank" rel="noopener">哲学思考トレーニング (ちくま新書)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B0%CB%C0%AA%C5%C4%C5%AF%BC%A3" class="keyword">伊勢田哲治</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%DE%CB%E0%BD%F1%CB%BC">筑摩書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00IE7L1W2/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#伊勢田哲治哲学的思考トレーニングの感想とメモ">伊勢田哲治「哲学的思考トレーニング」の感想とメモ</a><ul> <li><a href="#各章の感想">各章の感想</a></li> <li><a href="#第1章感想">第1章感想</a></li> <li><a href="#第2章感想">第2章感想</a></li> <li><a href="#第3章感想">第3章感想</a></li> <li><a href="#第4章感想">第4章感想</a></li> <li><a href="#第5章感想">第5章感想</a></li> <li><a href="#memo">memo</a><ul> <li><a href="#1-心構え">1. 心構え</a></li> <li><a href="#2議論の明確化">2.議論の明確化</a><ul> <li><a href="#43価値的議論-p162">4.3.価値的議論 p.162</a></li> </ul> </li> <li><a href="#3さまざまな文脈-p242">3.さまざまな文脈 p.242</a><ul> <li><a href="#文脈主義の考え方を主張の妥当性の判断に適用した場合の思考の道筋-p143">文脈主義の考え方を主張の妥当性の判断に適用した場合の思考の道筋 p.143</a></li> </ul> </li> <li><a href="#4前提の検討-p243">4.前提の検討 p.243</a><ul> <li><a href="#反証可能性-p78">反証可能性 p.78</a></li> </ul> </li> <li><a href="#5推論の検討">5.推論の検討</a><ul> <li><a href="#4章-実践的三段論法-p162">4章 実践的三段論法 p.162</a></li> </ul> </li> </ul> </li> <li><a href="#この本で紹介されているブックガイド">この本で紹介されているブックガイド</a><ul> <li><a href="#クリティカルシンキング全般">クリティカルシンキング全般</a></li> <li><a href="#反証主義まわり">反証主義まわり</a></li> <li><a href="#3章のブックガイド">3章のブックガイド</a></li> <li><a href="#倫理">倫理</a></li> <li><a href="#通約不可能性">通約不可能性</a></li> </ul> </li> <li><a href="#参考書リンク">参考書・リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="各章の感想">各章の感想</h2> <p>メインとなる全5章の構成になっている。</p> <ul> <li>第1章 上手に疑うための第一歩(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>)</li> <li>第2章 「科学」だってこわくない(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%B2%C4%C7%BD%C0%AD">反証可能性</a>、科学と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BF%BB%F7%B2%CA%B3%D8">疑似科学</a>の違い)</li> <li>第3章 疑いの泥沼からどう抜け出すか(文脈主義)</li> <li>第4章 「価値観の壁」をどう乗り越えるか(価値主張)</li> <li>第5章 みんなで考えあう技術</li> </ul> <p><section></p> <h2 id="第1章感想">第1章感想</h2> <p>序の部分で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>とはなんぞや、そして考え方が2種類(修理型、改築型)あることが紹介されている. 第1章では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の出発点として<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>の入り口として「疑う習慣」が導入されている. この本は2005年頃に書かれてるので日常会話が例になってるが、今書けば<a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a>などのネット情報が例として話題になるだろう.</p> <p>(哲学的)議論とは何か、どう構成されているかが紹介されている。</p> <p>「飛行機は自動車より安全か」という議論を例に、「議論の特定」(相手が何と正確に主張してるか)の方法が書かれており参考になる. 言い回しの差など語尾や推論の流れとして接続詞など国語的要素にも触れている.</p> <p>聞き手側と話し手側の心構え(思いやりの原理、協調の原理)も紹介されている。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a>で論争が多い昨今唱えたいワードである。</p> <p></section></p> <p><section></p> <h2 id="第2章感想">第2章感想</h2> <p>「科学的事実」とは何かについて書かれている。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A1%BC%A5%A6%A5%A3%A5%F3">ダーウィン</a>進化論との比較で「今西進化論」を例に科学と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BF%BB%F7%B2%CA%B3%D8">疑似科学</a>の説明がされている。 「ウイルス進化論」なんかも出てきて生物学素人からすると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BF%BB%F7%B2%CA%B3%D8">疑似科学</a>事例が登場して勉強になる. 今だったら<a class="keyword" href="http://d.hatena.ne.jp/keyword/STAP%BA%D9%CB%A6">STAP細胞</a>や新型コロナの反ワクネタが例になるだろうか?</p> <p>「科学」の持つ特徴の1つとして「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%B2%C4%C7%BD%C0%AD">反証可能性</a>」があるかどうか、ここで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DD%A5%D1%A1%BC">ポパー</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>が紹介されている.</p> <p>「科学的実証」がどのくらい信用できるかで、分配の過ち(分割の誤謬)、結合の過ち(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E7%C0%AE%A4%CE%B8%ED%C9%B5">合成の誤謬</a>)という、いわゆる誤謬が紹介されている。 また、科学的事実が確立されるまで科学者たちのチェックをくぐり抜けるのが大変であることが記されている.</p> <p>日常へこのような<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>を応用する方法も記されており、意味の混同を避けるためにいろいろな定義の仕方なども紹介されている. 中でも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%D2%B2%F1%B3%D8">社会学</a>で出てくるような価値観の定義で操作的定義あたりも登場する。</p> <p></section></p> <p><section></p> <h2 id="第3章感想">第3章感想</h2> <p>第3章では、疑いの強い順に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>が紹介される。ここで水槽の脳説などの哲学で出てくるような思考実験も紹介される。 論理的推論だけを許す<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>では論理学の部分に触れられる。 ここでの主題は、強すぎる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>を緩めるために文脈主義が導入される。 これによりほどよい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>で議論ができ、文脈レベルを上下変えることで疑いの強さを調整して、提示した主張と対抗仮説を比較して議論ができる。</p> <p>ただ、5章にも繋がるが、複数人の議論の際、この文脈レベルの合意を取るのが難しそうである。</p> <p></section></p> <p><section></p> <h2 id="第4章感想">第4章感想</h2> <p>第4章は、「~するのが望ましい」や「~は美しい」といった価値主張についての話である。 日常的な議論や人それぞれで終わってしまう議論に適用できる(必ず最適解が出るとは限らない)方法が展開されている。 事例として、哲学の一分野である「生きる意味」(mean of life)の議論について実際に適用して紹介される。 これについて代表的なものが3パターンあるなど紹介されており、大変勉強になり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B8%B3%B6%B3%D8%BD%AC">生涯学習</a>にもってこいな内容である。 さらに、価値的議論の特定方法で実践的三段論法はシンプルながらも前提を追っていけるのでわかりやすい。</p> <p>倫理的<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>では、倫理的に議論すること自体望ましくないで終わらないような方法がされている。 中でも代表格である<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D4%A5%E5%A5%ED%A5%F3">ピュロン</a>主義における倫理的<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>が紹介されている。</p> <p>また、それを主張するときに誰に立証責任があるのかという話が導入される。</p> <p></section></p> <p><section></p> <h2 id="第5章感想">第5章感想</h2> <p>第1章から第4章までは1人で行う<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の話であったが、第5章では複数人での合意形成をどうやるかの話になっている。 事例として「温暖化」の議論であるが、この本は2005年に出版されているので温暖化の議論は2000年代初頭の話であることに注意である。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/2020%C7%AF%C2%E5">2020年代</a>であれば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BD%C0%D0%C7%B3%CE%C1">化石燃料</a>の枯渇は当初の見込みよりも採掘技術の発展もあり意外にも影響少なかったことや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%B6%C8%AF">原発</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%B9%BC%BC%B8%FA%B2%CC">温室効果</a>ガスを出しにくいものの東北の大震災のような災害事故のときはリスクが大きいなどが触れられるだろうか。</p> <p>ここでは、対人論法や権威に訴える議論は誤謬であるが、その筋の専門家が信頼性高い情報を出してる事がわかってる状況なら素人判断よりも正しい可能性が高いのでokとするゆるい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>が提案されている。</p> <p>複数人での価値観の違い、見ている視点の違い、目的の違いの差による通約不可能性の解消方法も論じられている。 通約不可能性を解消して両者の見方の統合、これを「地平の融合」(Horizontverschmelzung ドイツ; Fusion of horizons)と呼んでいる。この地平の融合というのはガダマーが最初に使ったた言葉で、 おそらく元ネタは「真理と方法III」第3節「解釈学的<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%B8%BA%DF%CF%C0">存在論</a>の地平としての言語」だと思われる。ただ元本の使い方だと解釈学において使用しているので。この辺は解説書を見ないとわからなそうである。</p> <p>また、心構えとして自分の主張が間違っていた場合、素直に「間違いを認めて改めること」という言うのは簡単だが実行するのは難しいことがちゃんと書かれている。</p> <p></section></p> <p></section></p> <p><section></p> <h2 id="memo">memo</h2> <p>「結局、何がどうだったの?」という人のためのガイド」(p.241)を読めばわかるが、この本は、初見で出てくる知識も読みながらわかる順番で書かれているので、 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の実際の流れとはちょっと違く、散りばめられていることに注意が必要である。 なのでここでは実際の順番になるよう軽くまとめてみる。</p> <p>この本で書かれている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の一連の流れを整理すると、</p> <ol> <li>「心構え」</li> <li>「議論の明確化」</li> <li>「さまざまな文脈」</li> <li>「前提の検討」</li> <li>「推論の検討」</li> </ol> <p>といった項目に分けられる。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の目的: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%FC%A4%C3%A4%BF">穿った</a>ことを言うことではなく、ある主張をしっかりした根拠のもとに受け入れること p.61</p> <h3 id="1-心構え">1. 心構え</h3> <p>「心構え」については、大きく分けて2つのタイプの心構えに触れている。</p> <ul> <li>(a)「疑い」にかかわる心構えのグループ <ul> <li>疑う習慣を身につけること(第1章 p.22)</li> <li>自分が間違えたと思ったら立場を変えるのをためらわないこと(第5章 p.236) <ul> <li>思考が硬直してしまった場合の対策:自分の意見に感情移入しすぎないこと</li> <li>自分の意見に対する批判は必ずしも自分自身に対する攻撃ではない p.238</li> </ul> </li> </ul> </li> <li>(b) 共同作業としての<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>にかかわる心構え <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>は協力的な共同作業だという認識を持つこと(序、第1章、第5章 p.215-)、</li> <li>正解ではなくよりましな回答を探すという考え方をすること(第4章)</li> <li>立場の違いに起因する問題 p.217 <ul> <li>価値観の違いの擦り合わせ p.217 <ul> <li>価値観の違いを残したままでの解決法 p.219: 手続き的正義: 対立の中から1つ選択する.代表例:多数決の原理</li> </ul> </li> <li>視点の違いによる見え方の差 p.221</li> <li>目的の違いによる文脈の変化 p.227 : 文脈の差が生じるのは、そもそも何のためにその問題について論じているのかについてのくい違いがある場合が多い</li> </ul> </li> </ul> </li> </ul> <h3 id="2議論の明確化">2.議論の明確化</h3> <p>「議論の明確化」については、議論を特定する、つまり前提と推論の構造をはっきりさせることは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の第一歩である(第1章 p.25, p.29)。</p> <p>議論:</p> <ul> <li>(1)主な主張(結論)</li> <li>(2)理由となる主張(前提)</li> <li>(3)前提と結論のつながり(推輸)</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の出発点は、議論を特定する(相手の主張についてどういう前提からどういう結論が導き出されているかをはっきりさせる)こと p.29</p> <p>議論の特定の手法:</p> <ul> <li>論の構造を押さえるためには、まず結論を探すのが近道 p.34</li> <li>その結論を出す理由(前提)として何が挙げられているかを見る p.34</li> <li>理由や結論として述べられている主張の内容を正確にとらえること(字面の上ではほとんど同じ結論に見えても、微妙な差でまったく違う結論になることがある) p.35</li> </ul> <p>table1 文末の言い回しの差と求められる根拠の対応 p.37</p> <table> <thead> <tr> <th style="text-align:left;">言い回し</th> <th style="text-align:left;">求められる証拠</th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"><strong>量に関する言い回し</strong></td> <td style="text-align:left;">-</td> </tr> <tr> <td style="text-align:left;">すべて~である(~なものは1つもない)</td> <td style="text-align:left;">実際の例外(事例)が1つもないことを示す</td> </tr> <tr> <td style="text-align:left;">~であることもある(~でないこともある)</td> <td style="text-align:left;">事例(反例)を1つ挙げる</td> </tr> <tr> <td style="text-align:left;">~であることも多い,~の割合が高い,~だろう,~であることあまれである,~の割合が低い</td> <td style="text-align:left;">主張の内容に応じた比率についてのデータを示す</td> </tr> <tr> <td style="text-align:left;"><strong>可能性に関する言い回し</strong> </td> <td style="text-align:left;">-</td> </tr> <tr> <td style="text-align:left;">~であるはずがない(~でないはずがない),~は必然的である(~は不可能である)</td> <td style="text-align:left;">実例(反例)が実際にないだけでなく絶対にありえないことを示す</td> </tr> <tr> <td style="text-align:left;">~かもしれないmay(~でないかもしれない may not)</td> <td style="text-align:left;">現実に実例(反例)があるかどうかに関わらず,実例(反例)が可能であることを示す</td> </tr> <tr> <td style="text-align:left;">~であることも十分ありうるcould well(~でないことも十分ありうる)</td> <td style="text-align:left;">単に実例(反例)が可能であるだけでなく,何らかの意味でその確率が高いことを示す</td> </tr> <tr> <td style="text-align:left;"><strong>価値に関する言い回し</strong></td> <td style="text-align:left;">-</td> </tr> <tr> <td style="text-align:left;">~すべきであるshould(~すべきでない)</td> <td style="text-align:left;">その記述を満たさない(満たす)ものがすべて価値基準に反していることを示す</td> </tr> <tr> <td style="text-align:left;">~してもよいcan,may(~しなくてもよい not have to)</td> <td style="text-align:left;">その記述を満たす(満たさない)もので所与価値基準に反しない例があることを示す</td> </tr> </tbody> </table> <ul> <li>推論の流れをはっきりさせる(構造を特定するうえでは接続詞が重要な役割を果たす。) p.40 <ul> <li>直列型(に対する場合1つだけ覆せばいい)</li> <li>並列型(に対する場合すべて覆す必要あり)</li> </ul> </li> </ul> <p> table2 使われる接続詞の種類と議論の構造 p.43</p> <table> <thead> <tr> <th style="text-align:left;">接続詞</th> <th style="text-align:left;">議論の構造</th> </tr> </thead> <tbody> <tr> <td style="text-align:left;">なぜなら,というのも,したがって</td> <td style="text-align:left;">根拠と結論を結ぶ</td> </tr> <tr> <td style="text-align:left;">第一に,第二に,また</td> <td style="text-align:left;">単純並列型の並列</td> </tr> <tr> <td style="text-align:left;">そして,かつ</td> <td style="text-align:left;">組み合わせ型の並列(直列)(単純並列型にも使われる)</td> </tr> <tr> <td style="text-align:left;">確かに~しかし~</td> <td style="text-align:left;">不利な根拠の打ち消し</td> </tr> </tbody> </table> <p>議論の構造をはっきりさせるために利用できるツールとして、</p> <ul> <li>思いやりの原理(慈愛の原理,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%B2%CD%C6%A4%CE%B8%B6%CD%FD">寛容の原理</a>; principle of charity, p.48)と協調原理(第1章 p.52)、 <ul> <li>思いやりの原理(聞き手側): 相手の議論を組み立てなおす場合には、できるだけ筋の通ったかたちに組み立てなおすべき</li> <li>協調原理(話し手側)のルール -「必要な限りの情報を提供する」 <ul> <li>「十分な証拠のないことは言わない」</li> <li>「関係のないことは言わない」</li> <li>「あいまいさを避ける」</li> <li>例 含みの確認 p.53</li> </ul> </li> </ul> </li> <li>暗黙の前提の洗い出し(第1章 p.57) <ul> <li>あまりにも当然な前提は省略される場合がある p.57</li> <li>どんなに筋が通っているように見えても、結論になってはじめて出てくる名詞や動詞がある推論には、必ず何か飛躍ないしは明示されていない前提が存在する。 第3章 p.131</li> </ul> </li> <li>定義による明確化(第2章 p.95): 定義の不明確な言葉や多義的な言葉を避ける、どうしても使う場合にはきちんと定義して使う <ul> <li>直示的定義 p.98</li> <li>辞書的定義 p.98</li> <li>哲学的定義:定義が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%AC%CD%D7%BD%BD%CA%AC%BE%F2%B7%EF">必要十分条件</a>になっている p.98</li> <li>操作的定義:調査して確かめられる内容で定義する.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%B2%C4%C7%BD%C0%AD">反証可能性</a>とのかかわりで重要 p.99 <ul> <li>e.g. 性格が外向的 ← 「この性格テストで何点以上をとる人」</li> </ul> </li> </ul> </li> <li>思考実験(第3章 p.110):言葉の意味や、行為・選択の本当の理由、われわれが暗黙のうちに受け入れているルールなどを明らかにするによい方法 <ul> <li>e.g. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%AB%A5%EB%A5%C8">デカルト</a>のデーモン(水槽脳)仮説 p.108</li> </ul> </li> <li>薄い記述と分厚い記述の区分の利用(第4章 p.153):みんなを納得させるような定義がない場合の手法 <ul> <li>薄い記述(thin description):言葉の定義(辞書的定義、哲学的定義、操作的定義など) p.155 <ul> <li>薄い記述は、どういう分厚い記述が受け入れ可能かを決定するための出発点としての役割を果たす。 p.181</li> </ul> </li> <li>分厚い記述(thick description): 薄い記述+もっと具体的な内容 p.156 <ul> <li>薄い記述を厚くする2つの方法 p.181 <ul> <li>薄い記述を満たすものについて調べるというやり方 <ul> <li>e.g. 「わたしの年齢」という言葉の薄い記述: 「わたしが生まれてから現在までの年数」. これだと経験的データにもとづいてくい違いを調停可</li> </ul> </li> <li>薄い記述にさらに新しい条件を付け加えるというやり方 <ul> <li>本当に純粋に意味の上での違いなら、言葉の用法について共同の取り決めとして対立する用法は配号をつけて区別する(箇条書きのときに(a)(b)(c)のようにインデックス付けするのと同じ)。 e.g.カレーライスa, カレーライスb</li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> <li>通約不可能性の処理(第5章 p.221): <ul> <li>通約不可能性: 2つのグループがまったく違う世界観で世界を見るために基本的な出来事でさえも違って見え、そのために話が通じなくなるという状態</li> <li>由来: (<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%CD%FD%BF%F4">有理数</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%CD%FD%BF%F4">無理数</a>を比較しようとしても両者を整数の比であらわすことはできないという、よく知られた数学上の事実との類推で通約不可能という言葉が使われる)。</li> <li>兆候:自分が決定的だと思う証拠や龍輸を提出したのに、相手がまったくその重要さを罷職していない(どころか単に聞き流してしまっている)ように見える</li> <li>怖いところ:「こんなに物わかりが悪いのは裏で利害団体から金でももらってるんじゃないか」などと勘ぐる(中傷合戦につながる)。</li> <li>くい違いの解消の方法: まず、相手の認知の枠組みや、何が重要な問題で何が重要でないと思っているかを推定し、その枠組みを身につけた者からは世界がどう見えるか考えること <ul> <li>紹介した手法を使い、お互いの議論の構造を明確化することも、どこでくい違っているかはっきりさせるために有効で, 相手の議論の背後に自分の気づいていない前提がないか、自分の推論の背後に相手にとって受け入れられない前提がないか、をチェックすることができる。そうすると「こういう前提のもとで見るとどうなるか」「この前提を無視して見るとどう見えるか」というような思考実験が可能となる。</li> <li>最終的にはお互いがお互いについて理解を深め、両者のものの見方を統合した一段レベルの高い視野を獲得するのが理想(地平の融合)である。</li> </ul> </li> </ul> </li> </ul> <p>といった問題を論じた。</p> <p><figure> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:krita="http://krita.org/namespaces/svg/krita" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" width="100%" viewBox="0 0 122.88 122.88"> <defs/> <g id="group0" transform="matrix(0.077643891073663 0 0 0.0596984952857233 44.0573131327189 66.4006016597316)" fill="none"> <path id="shape0" transform="translate(1.088, 2)" fill="#ffffff" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M17.608 369.816L28.178 250.075L66.919 172.588L102.139 95.1L151.449 45.789C151.449 45.789 172.031 32.633 188.651 17.669C197.954 9.297 210.075 0 218.372 0C222.359 0 226.279 6.455 232.358 9.297C237.418 11.67 244.4 9.657 248.168 14.875C254.141 23.146 264.284 28.873 272.319 34.438C286.155 44.025 299.386 49.305 299.386 49.305L348.688 91.573L394.473 172.586L405.041 281.763L433.214 373.341C433.214 373.341 429.689 461.393 429.689 471.963C429.689 482.54 422.654 545.928 422.654 545.928L394.473 704.421L302.894 774.861L218.372 796L151.449 774.862L63.397 697.387L24.656 630.473L17.608 521.273L0 443.782Z" sodipodi:nodetypes="cccccccccccccccccccccccccc"/> <path id="shape1" transform="translate(240.59, 234.462)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M176.101 158.484L144.411 450.822L81.005 514.219L0 545.926L70.98 440.787L91.582 359.253L95.1 285.287L130.324 140.88L119.746 0Z" sodipodi:nodetypes="cccccccccc"/> <path id="shape2" transform="translate(226.504, 100.621)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M0 0L45.78 52.828L35.215 105.655L45.78 225.411L3.521 102.143L21.134 59.871Z" sodipodi:nodetypes="ccccccc"/> <path id="shape3" transform="translate(261.719, 44.267)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M0 0L66.919 42.259L102.144 137.359L95.092 169.062L59.876 63.397Z" sodipodi:nodetypes="cccccc"/> <path id="shape4" transform="translate(39.8349998934596, 547.929)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M3.517 0L38.742 66.924L77.484 81.02L91.574 154.968L151.445 214.847L116.221 211.322L73.962 172.58L24.651 151.459L1.0654e-07 84.545C-0.000999893 84.544 7.038 17.595 3.517 0Z" sodipodi:nodetypes="cccccccccc"/> <path id="shape5" transform="translate(107.929, 227.454)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M28.751 199.357L0 156.221L17.248 64.222L30.667 34.514L36.421 0L51.753 15.341L63.251 17.262L69.002 46.013L93.924 116.935L82.421 153.352L65.168 174.429L55.581 208.935L49.837 277.945L32.579 302.854L22.997 243.449Z" sodipodi:nodetypes="cccccccccccccccc"/> <path id="shape6" transform="translate(199.972, 608.3)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M26.036 119.024L37.197 70.66L0 0L0 59.503C11.156 78.107 26.036 119.024 26.036 119.024Z" sodipodi:nodetypes="ccccc"/> </g><g id="group1" transform="matrix(-0.0319217506910407 0 0 0.0391186517072254 38.2214183693982 82.9457325399481)" fill="none"> <path id="shape7" transform="translate(88.587, 374.168)" fill="#df5656" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M8.198 0C8.182 0 8.174 0.008 8.149 0.008L0 2.757Z" sodipodi:nodetypes="cccc"/> <path id="shape8" transform="translate(13.862, -0.000485697152896932)" fill="#df5656" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M441.187 244.286C510.397 141.058 489.629 53.9635 425.62 17.6355C365.543 -16.4735 330.698 14.4975 292.392 24.9135C243.949 -7.44751 176.188 -11.3235 91.701 31.4715C50.173 29.7495 3.55271e-15 71.2695 8.653 111.049C11.493 124.149 19.228 137.613 28.303 149.803C28.279 150.581 28.22 151.376 28.22 152.138C28.22 155.508 28.452 158.779 28.932 161.95C30.34 171.199 31.069 179 31.069 185.798C31.069 186.75 31.036 187.661 31.011 188.588C21.977 191.735 9.647 195.072 0 194.103C0 194.103 11.254 203.079 28.295 205.663C27.65 207.717 26.879 209.737 25.977 211.783C22.441 219.724 16.694 227.955 7.908 238.007C5.532 240.715 3.694 243.473 2.427 246.354C1.159 249.228 0.481 252.25 0.497 255.165C0.481 258.634 1.441 261.839 2.808 264.456C4.886 268.398 7.718 271.13 10.294 273.2C12.836 275.229 15.246 276.653 16.777 277.589C16.943 277.688 17.722 278.732 18.235 280.156C18.79 281.58 19.121 283.361 19.113 284.76C19.121 285.655 18.981 286.383 18.849 286.781L18.683 287.17L18.667 287.212L18.683 287.179L18.683 287.195L18.667 287.212L18.659 287.212C17.326 288.561 16.141 290.044 15.239 291.832C14.32 293.612 13.724 295.757 13.732 297.926C13.724 300.444 14.527 302.763 15.504 304.452C17.003 307.036 18.725 308.576 20.233 309.867C20.63 310.19 20.986 310.464 21.367 310.753C21.243 311.093 21.119 311.441 20.979 311.821C20.656 312.707 20.283 313.725 19.968 314.935C19.645 316.135 19.339 317.535 19.33 319.349C19.33 320.864 19.587 322.753 20.522 324.673C21.425 326.603 23.031 328.35 24.746 329.418L25.118 329.658L24.779 329.442C26.957 330.875 27.669 331.96 28.29 333.334C28.869 334.708 29.184 336.663 29.168 339.196C29.193 342.31 28.704 346.052 28.671 350.292C28.671 351.584 28.729 352.926 28.911 354.349C29.209 356.801 29.863 359.492 31.064 362.249C32.845 366.364 36.008 370.678 40.844 373.792C45.672 376.914 51.932 378.661 59.26 378.652C66.009 378.644 73.743 377.244 82.877 374.172L82.935 374.156C90.189 371.713 96.474 370.686 101.964 370.686C109.698 370.71 115.868 372.648 121.465 376.052C125.647 378.627 129.498 382.106 133.042 386.387C138.375 392.796 142.987 401.018 146.953 410.095C150.936 419.178 154.265 429.091 157.246 438.861C159.142 445.072 159.912 450.819 159.912 456.143C159.912 469.202 155.267 479.967 150.48 487.593C148.103 491.386 145.71 494.359 143.964 496.312C143.094 497.306 142.382 498.034 141.902 498.498L141.397 498.995L141.322 499.061L141.298 499.078L144.809 502.986L152.816 511.995C153.23 511.614 159.151 506.315 165.138 496.792C171.108 487.286 177.203 473.374 177.212 456.142C177.212 449.145 176.193 441.634 173.792 433.793C168.285 415.873 161.545 396.588 150.664 380.995C145.215 373.211 138.64 366.305 130.525 361.312C122.41 356.311 112.738 353.354 101.965 353.388C94.314 353.388 86.141 354.828 77.404 357.768L77.412 357.76C69.562 360.41 63.567 361.353 59.261 361.337C56.114 361.337 53.871 360.873 52.255 360.26C49.845 359.316 48.67 358.165 47.717 356.782C46.798 355.424 46.251 353.686 46.069 352.195C46.02 351.715 45.978 351.069 45.978 350.291C45.945 347.683 46.45 343.766 46.475 339.195C46.466 335.461 46.102 331.13 44.247 326.667C42.881 323.297 40.553 320.017 37.391 317.301C37.507 317.003 37.606 316.705 37.739 316.382C38.062 315.48 38.418 314.453 38.75 313.235C39.064 312.017 39.362 310.593 39.37 308.804C39.37 307.355 39.146 305.591 38.352 303.778C37.582 301.964 36.207 300.225 34.609 299.066C33.839 298.494 33.151 297.99 32.539 297.526C33.798 295.82 34.7 293.998 35.289 292.185C36.108 289.668 36.415 287.175 36.423 284.757C36.407 280.467 35.479 276.394 33.865 272.651C33.045 270.78 32.035 268.999 30.76 267.335C29.468 265.663 27.895 264.089 25.8 262.814C24.782 262.201 23.697 261.547 22.637 260.819C21.039 259.733 19.573 258.458 18.769 257.407C18.355 256.877 18.115 256.422 17.975 256.083C17.842 255.727 17.801 255.495 17.801 255.164C17.801 254.808 17.85 254.27 18.264 253.326C18.67 252.398 19.482 251.057 20.931 249.401C30.305 238.67 37.219 229.072 41.79 218.813C46.378 208.561 48.397 197.813 48.381 185.797C48.373 181.533 48.124 177.094 47.677 172.424C60.264 185.491 70.938 194.102 70.938 194.102C70.938 194.102 64.023 135.276 79.591 123.17C79.591 123.17 140.148 239.083 195.512 228.715L233.57 261.573C233.57 261.573 242.224 206.208 268.184 201.025C294.136 195.842 292.397 244.284 261.261 284.072L261.261 335.694C258.677 340.058 256.392 344.356 254.496 348.621C253.494 350.898 252.84 353.374 252.351 356.231C251.879 359.08 251.622 362.293 251.622 365.895C251.639 380.369 255.82 401.253 269.177 426.526C277.723 442.632 289.614 454.606 299.36 462.679C309.106 470.736 316.766 474.885 317.122 475.083L323.887 462.563L325.361 459.863L325.345 459.854C325.213 459.78 318.422 456.054 309.976 448.998C301.497 441.927 291.394 431.543 284.472 418.435C272.258 395.373 268.912 377.039 268.921 365.894C268.921 363.136 269.128 360.826 269.418 359.062C269.7 357.298 270.114 356.073 270.321 355.625C274.321 346.55 281.285 335.851 289.739 324.192C302.409 306.67 318.39 286.912 332.617 265.482C346.827 244.035 359.381 220.849 364.862 195.956C367.082 185.904 368.191 175.271 368.191 164.39C368.175 133.743 359.347 100.91 340.087 73.4185C368.631 79.6125 405.165 99.2375 385.829 160.655C366.221 222.934 316.636 310.61 359.877 372.301C396.022 423.874 453.3 406.915 453.3 406.915C427.342 375.766 385.053 328.003 441.187 244.286Z" sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"/> </g><ellipse id="shape9" transform="translate(48.4800000463377, 72.2400000690477)" rx="14.4599997969212" ry="19.2399997102288" cx="14.4599997969212" cy="19.2399997102288" fill="none" stroke="#df5656" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="bevel"/><path id="shape10" transform="translate(39.1150517087468, 91.2799995304028)" fill="none" stroke="#df5656" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="2" d="M23.2849 0L0 0" sodipodi:nodetypes="cc"/><g id="group2" transform="matrix(0.0510680722900927 0 0 0.0510680722900927 81.4093535517495 81.4865228599221)" fill="none"> <path id="shape11" transform="translate(55.4289277230854, 0)" fill="#3aabd2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M397.61 429.75C395.61 422.25 392.782 415.516 389.282 409.516C383.157 399 375.032 390.813 366.079 384.313C359.376 379.438 352.188 375.485 344.907 372.063C333.969 366.938 322.782 363 312.469 359.188C302.141 355.391 292.688 351.657 285.375 347.329C282.687 345.751 280.266 344.095 278.172 342.376C275.047 339.751 272.641 336.985 270.875 333.876C269.109 330.767 267.922 327.282 267.469 322.907C267.141 319.798 267 316.844 267 314.063C267 305.813 268.219 298.641 269.766 291.329C274.391 286.11 278.61 279.907 282.61 272.47C286.61 265.033 290.423 256.298 294.204 245.97C296.642 244.861 299.079 243.532 301.485 241.939C306.938 238.251 312.11 233.158 316.423 226.345C320.736 219.532 324.204 211.064 326.564 200.611C327.22 197.72 327.533 194.83 327.533 192.002C327.533 186.064 326.142 180.408 323.783 175.361C322.158 171.877 320.08 168.658 317.658 165.736C318.892 161.189 320.392 155.048 321.721 147.877C323.565 137.908 325.096 125.955 325.096 113.346C325.096 105.237 324.471 96.862 322.815 88.565C321.565 82.362 319.768 76.206 317.19 70.299C313.346 61.44 307.752 53.096 299.956 46.205C292.753 39.814 283.722 34.752 272.831 31.471C268.222 25.955 263.456 21.283 258.534 17.362C250.253 10.753 241.534 6.315 232.643 3.643C223.752 0.971 214.751 0 205.766 0C201.032 0 196.313 0.266 191.563 0.688C187.125 1.094 183.438 1.547 180.141 2.11C175.203 2.938 171.141 4.032 167.203 5.391C163.25 6.75 159.453 8.344 154.469 10.297C152.578 11.047 150.11 12.141 147.11 13.656C141.891 16.281 135.141 20.187 127.954 25.562C117.141 33.609 105.204 45 95.9231 60.406C91.2671 68.094 87.2981 76.812 84.5011 86.547C81.6881 96.313 80.0631 107.063 80.0631 118.828C80.0631 126.141 80.7191 133.891 82.0631 142C82.0631 142.563 82.0941 143.125 82.1261 143.656C82.1891 144.656 82.2981 145.719 82.4071 146.812C82.5791 148.421 82.7661 150.093 82.9071 151.5C82.9851 152.188 83.0481 152.813 83.0951 153.313C83.0951 153.547 83.1111 153.751 83.1261 153.907L83.1261 154.063L83.1261 154.11L83.1261 154.126L83.1261 155.048L85.1101 163.876C82.2661 166.985 79.7971 170.485 77.8761 174.314C75.2041 179.658 73.6101 185.658 73.6261 192.017C73.6261 194.83 73.9231 197.72 74.5791 200.611C76.1571 207.595 78.2201 213.689 80.7041 218.97C84.4231 226.939 89.1101 233.126 94.3291 237.783C98.3601 241.392 102.673 244.033 106.954 245.986C110.735 256.299 114.532 265.017 118.548 272.47C122.532 279.908 126.751 286.095 131.376 291.314C132.907 298.611 134.142 305.798 134.142 314.064C134.142 316.861 134.017 319.798 133.689 322.908C133.376 325.908 132.705 328.502 131.751 330.846C130.329 334.33 128.267 337.299 125.438 340.127C122.625 342.908 119.016 345.502 114.766 347.924C110.438 350.377 105.438 352.658 99.9851 354.862C90.4381 358.721 79.5791 362.378 68.5471 366.753C60.2661 370.066 51.9061 373.816 43.9221 378.534C37.9381 382.05 32.1721 386.128 26.8751 390.987C18.9531 398.221 12.0941 407.284 7.37507 418.518C2.62507 429.721 -0.0159277 442.987 7.22769e-05 458.674C7.22769e-05 460.877 0.469072 463.002 1.23407 464.94C1.95307 466.753 2.92207 468.456 4.07807 470.018C6.25007 472.987 9.07807 475.627 12.5161 478.19C18.5631 482.659 26.5941 486.831 37.0001 490.768C52.5941 496.643 73.5001 501.909 100.516 505.768C127.516 509.596 160.641 512.002 200.579 512.002C235.173 512.002 264.688 510.189 289.517 507.205C308.158 504.986 324.158 502.08 337.751 498.767C347.939 496.267 356.767 493.533 364.345 490.658C370.033 488.517 375.033 486.283 379.361 483.97C382.595 482.22 385.486 480.47 388.017 478.626C391.83 475.876 394.876 473.032 397.205 469.813C398.346 468.204 399.33 466.485 400.033 464.641C400.721 462.782 401.142 460.75 401.142 458.672C401.141 447.938 399.907 438.344 397.61 429.75ZM183.11 437.297L124.079 361.828C127.157 360.031 130.079 358.078 132.813 355.89C135.751 353.531 138.454 350.921 140.829 347.952L183.751 367.874L174.595 383.155L188.783 398.202ZM146.907 337.875C148.641 333.828 149.829 329.406 150.298 324.625C150.689 320.937 150.861 317.406 150.861 314.062C150.861 303.124 149.048 293.906 147.252 285.562L146.736 283.296L145.142 281.608C141.095 277.327 137.189 271.842 133.267 264.561C129.361 257.264 125.454 248.186 121.439 236.873L120.126 233.17L116.438 231.811C113.875 230.873 111.391 229.67 109 228.061C105.406 225.623 101.984 222.327 98.8441 217.405C95.7191 212.483 92.9061 205.874 90.8751 196.936C90.5001 195.233 90.3281 193.592 90.3281 192.014C90.3281 188.436 91.2031 185.045 92.8281 181.78C94.1721 179.092 96.0471 176.53 98.3281 174.249C102.172 180.062 105.328 184.655 106.5 185.796C110.25 189.562 109.078 188.405 110.328 186.546C110.328 186.546 114.594 180.546 137.156 136.655C182.297 146.686 261.172 78.889 261.172 78.889C261.172 78.889 262.125 100.78 277.172 120.842C291.438 139.873 299.578 184.545 299.578 184.545C299.578 184.545 301.516 180.873 304.406 175.936C306.14 177.952 307.578 180.139 308.625 182.405C310.063 185.483 310.813 188.671 310.813 191.999C310.813 193.593 310.641 195.233 310.266 196.921C308.907 202.874 307.219 207.812 305.297 211.874C302.438 217.999 299.141 222.202 295.688 225.296C292.219 228.39 288.547 230.405 284.719 231.812L281.031 233.156L279.718 236.859C275.702 248.187 271.796 257.281 267.89 264.562C263.968 271.875 260.046 277.343 255.999 281.625L254.405 283.313L253.905 285.594C252.092 293.907 250.28 303.141 250.28 314.063C250.28 317.407 250.452 320.938 250.827 324.626C251.28 328.97 252.265 333.032 253.765 336.782C253.828 336.954 253.906 337.126 253.984 337.282L203.188 364ZM222.126 440.031L216.048 398.203L230.251 383.156L221.063 367.812L259.891 347.406C260.969 348.797 262.094 350.125 263.313 351.359C267.172 355.312 271.61 358.578 276.376 361.422Z" sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"/> </g><ellipse id="shape12" transform="translate(48.9600000467965, 72.2400000690477)" rx="14.6400000139931" ry="19.2000000183516" cx="14.6400000139931" cy="19.2000000183516" fill="none" stroke="#3aabd2" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="bevel"/><path id="shape13" transform="translate(60.96, 91.1999998999435)" fill="none" stroke="#3aabd2" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="2" d="M0 0C7.76041 0 15.5208 0 23.2812 0" sodipodi:nodetypes="cc"/><g id="group3" transform="matrix(0.077643891073663 0 0 0.0596984952857233 44.5373131327189 0.160601659731654)" fill="none"> <path id="shape14" transform="translate(1.088, 2)" fill="#ffffff" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M17.608 369.816L28.178 250.075L66.919 172.588L102.139 95.1L151.449 45.789C151.449 45.789 172.031 32.633 188.651 17.669C197.954 9.297 210.075 0 218.372 0C222.359 0 226.279 6.455 232.358 9.297C237.418 11.67 244.4 9.657 248.168 14.875C254.141 23.146 264.284 28.873 272.319 34.438C286.155 44.025 299.386 49.305 299.386 49.305L348.688 91.573L394.473 172.586L405.041 281.763L433.214 373.341C433.214 373.341 429.689 461.393 429.689 471.963C429.689 482.54 422.654 545.928 422.654 545.928L394.473 704.421L302.894 774.861L218.372 796L151.449 774.862L63.397 697.387L24.656 630.473L17.608 521.273L0 443.782Z" sodipodi:nodetypes="cccccccccccccccccccccccccc"/> <path id="shape15" transform="translate(240.59, 234.462)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M176.101 158.484L144.411 450.822L81.005 514.219L0 545.926L70.98 440.787L91.582 359.253L95.1 285.287L130.324 140.88L119.746 0Z" sodipodi:nodetypes="cccccccccc"/> <path id="shape16" transform="translate(226.504, 100.621)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M0 0L45.78 52.828L35.215 105.655L45.78 225.411L3.521 102.143L21.134 59.871Z" sodipodi:nodetypes="ccccccc"/> <path id="shape17" transform="translate(261.719, 44.267)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M0 0L66.919 42.259L102.144 137.359L95.092 169.062L59.876 63.397Z" sodipodi:nodetypes="cccccc"/> <path id="shape18" transform="translate(39.8349998934596, 547.929)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M3.517 0L38.742 66.924L77.484 81.02L91.574 154.968L151.445 214.847L116.221 211.322L73.962 172.58L24.651 151.459L1.0654e-07 84.545C-0.000999893 84.544 7.038 17.595 3.517 0Z" sodipodi:nodetypes="cccccccccc"/> <path id="shape19" transform="translate(107.929, 227.454)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M28.751 199.357L0 156.221L17.248 64.222L30.667 34.514L36.421 0L51.753 15.341L63.251 17.262L69.002 46.013L93.924 116.935L82.421 153.352L65.168 174.429L55.581 208.935L49.837 277.945L32.579 302.854L22.997 243.449Z" sodipodi:nodetypes="cccccccccccccccc"/> <path id="shape20" transform="translate(199.972, 608.3)" fill="#d2d2d2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M26.036 119.024L37.197 70.66L0 0L0 59.503C11.156 78.107 26.036 119.024 26.036 119.024Z" sodipodi:nodetypes="ccccc"/> </g><g id="group4" transform="matrix(-0.0319217506910407 0 0 0.0391186517072254 38.2214183689394 31.3457325539412)" fill="none"> <path id="shape21" transform="translate(88.587, 374.168)" fill="#df5656" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M8.198 0C8.182 0 8.174 0.008 8.149 0.008L0 2.757Z" sodipodi:nodetypes="cccc"/> <path id="shape22" transform="translate(13.862, -0.000485697152896932)" fill="#df5656" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M441.187 244.286C510.397 141.058 489.629 53.9635 425.62 17.6355C365.543 -16.4735 330.698 14.4975 292.392 24.9135C243.949 -7.44751 176.188 -11.3235 91.701 31.4715C50.173 29.7495 3.55271e-15 71.2695 8.653 111.049C11.493 124.149 19.228 137.613 28.303 149.803C28.279 150.581 28.22 151.376 28.22 152.138C28.22 155.508 28.452 158.779 28.932 161.95C30.34 171.199 31.069 179 31.069 185.798C31.069 186.75 31.036 187.661 31.011 188.588C21.977 191.735 9.647 195.072 0 194.103C0 194.103 11.254 203.079 28.295 205.663C27.65 207.717 26.879 209.737 25.977 211.783C22.441 219.724 16.694 227.955 7.908 238.007C5.532 240.715 3.694 243.473 2.427 246.354C1.159 249.228 0.481 252.25 0.497 255.165C0.481 258.634 1.441 261.839 2.808 264.456C4.886 268.398 7.718 271.13 10.294 273.2C12.836 275.229 15.246 276.653 16.777 277.589C16.943 277.688 17.722 278.732 18.235 280.156C18.79 281.58 19.121 283.361 19.113 284.76C19.121 285.655 18.981 286.383 18.849 286.781L18.683 287.17L18.667 287.212L18.683 287.179L18.683 287.195L18.667 287.212L18.659 287.212C17.326 288.561 16.141 290.044 15.239 291.832C14.32 293.612 13.724 295.757 13.732 297.926C13.724 300.444 14.527 302.763 15.504 304.452C17.003 307.036 18.725 308.576 20.233 309.867C20.63 310.19 20.986 310.464 21.367 310.753C21.243 311.093 21.119 311.441 20.979 311.821C20.656 312.707 20.283 313.725 19.968 314.935C19.645 316.135 19.339 317.535 19.33 319.349C19.33 320.864 19.587 322.753 20.522 324.673C21.425 326.603 23.031 328.35 24.746 329.418L25.118 329.658L24.779 329.442C26.957 330.875 27.669 331.96 28.29 333.334C28.869 334.708 29.184 336.663 29.168 339.196C29.193 342.31 28.704 346.052 28.671 350.292C28.671 351.584 28.729 352.926 28.911 354.349C29.209 356.801 29.863 359.492 31.064 362.249C32.845 366.364 36.008 370.678 40.844 373.792C45.672 376.914 51.932 378.661 59.26 378.652C66.009 378.644 73.743 377.244 82.877 374.172L82.935 374.156C90.189 371.713 96.474 370.686 101.964 370.686C109.698 370.71 115.868 372.648 121.465 376.052C125.647 378.627 129.498 382.106 133.042 386.387C138.375 392.796 142.987 401.018 146.953 410.095C150.936 419.178 154.265 429.091 157.246 438.861C159.142 445.072 159.912 450.819 159.912 456.143C159.912 469.202 155.267 479.967 150.48 487.593C148.103 491.386 145.71 494.359 143.964 496.312C143.094 497.306 142.382 498.034 141.902 498.498L141.397 498.995L141.322 499.061L141.298 499.078L144.809 502.986L152.816 511.995C153.23 511.614 159.151 506.315 165.138 496.792C171.108 487.286 177.203 473.374 177.212 456.142C177.212 449.145 176.193 441.634 173.792 433.793C168.285 415.873 161.545 396.588 150.664 380.995C145.215 373.211 138.64 366.305 130.525 361.312C122.41 356.311 112.738 353.354 101.965 353.388C94.314 353.388 86.141 354.828 77.404 357.768L77.412 357.76C69.562 360.41 63.567 361.353 59.261 361.337C56.114 361.337 53.871 360.873 52.255 360.26C49.845 359.316 48.67 358.165 47.717 356.782C46.798 355.424 46.251 353.686 46.069 352.195C46.02 351.715 45.978 351.069 45.978 350.291C45.945 347.683 46.45 343.766 46.475 339.195C46.466 335.461 46.102 331.13 44.247 326.667C42.881 323.297 40.553 320.017 37.391 317.301C37.507 317.003 37.606 316.705 37.739 316.382C38.062 315.48 38.418 314.453 38.75 313.235C39.064 312.017 39.362 310.593 39.37 308.804C39.37 307.355 39.146 305.591 38.352 303.778C37.582 301.964 36.207 300.225 34.609 299.066C33.839 298.494 33.151 297.99 32.539 297.526C33.798 295.82 34.7 293.998 35.289 292.185C36.108 289.668 36.415 287.175 36.423 284.757C36.407 280.467 35.479 276.394 33.865 272.651C33.045 270.78 32.035 268.999 30.76 267.335C29.468 265.663 27.895 264.089 25.8 262.814C24.782 262.201 23.697 261.547 22.637 260.819C21.039 259.733 19.573 258.458 18.769 257.407C18.355 256.877 18.115 256.422 17.975 256.083C17.842 255.727 17.801 255.495 17.801 255.164C17.801 254.808 17.85 254.27 18.264 253.326C18.67 252.398 19.482 251.057 20.931 249.401C30.305 238.67 37.219 229.072 41.79 218.813C46.378 208.561 48.397 197.813 48.381 185.797C48.373 181.533 48.124 177.094 47.677 172.424C60.264 185.491 70.938 194.102 70.938 194.102C70.938 194.102 64.023 135.276 79.591 123.17C79.591 123.17 140.148 239.083 195.512 228.715L233.57 261.573C233.57 261.573 242.224 206.208 268.184 201.025C294.136 195.842 292.397 244.284 261.261 284.072L261.261 335.694C258.677 340.058 256.392 344.356 254.496 348.621C253.494 350.898 252.84 353.374 252.351 356.231C251.879 359.08 251.622 362.293 251.622 365.895C251.639 380.369 255.82 401.253 269.177 426.526C277.723 442.632 289.614 454.606 299.36 462.679C309.106 470.736 316.766 474.885 317.122 475.083L323.887 462.563L325.361 459.863L325.345 459.854C325.213 459.78 318.422 456.054 309.976 448.998C301.497 441.927 291.394 431.543 284.472 418.435C272.258 395.373 268.912 377.039 268.921 365.894C268.921 363.136 269.128 360.826 269.418 359.062C269.7 357.298 270.114 356.073 270.321 355.625C274.321 346.55 281.285 335.851 289.739 324.192C302.409 306.67 318.39 286.912 332.617 265.482C346.827 244.035 359.381 220.849 364.862 195.956C367.082 185.904 368.191 175.271 368.191 164.39C368.175 133.743 359.347 100.91 340.087 73.4185C368.631 79.6125 405.165 99.2375 385.829 160.655C366.221 222.934 316.636 310.61 359.877 372.301C396.022 423.874 453.3 406.915 453.3 406.915C427.342 375.766 385.053 328.003 441.187 244.286Z" sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"/> </g><ellipse id="shape23" transform="translate(45.00000035982, 34.1199996334334)" rx="16.43999964018" ry="5.179999928036" cx="16.43999964018" cy="5.179999928036" fill="none" stroke="#df5656" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="bevel"/><path id="shape24" transform="translate(38.8750517080586, 38.7199995434784)" fill="none" stroke="#df5656" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="2" d="M23.2849 0L0 0" sodipodi:nodetypes="cc"/><path id="shape25" transform="translate(60.44, 52.2800000474847)" fill="#000000" fill-rule="evenodd" stroke="#000000" stroke-width="6.4824" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="2" d="M0 0L0 9.84" sodipodi:nodetypes="cc"/><path id="shape26" transform="translate(53.6400000520725, 60.2400000541371)" fill="#000000" fill-rule="evenodd" stroke="#000000" stroke-width="5.7504" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="2" d="M6.96 4.8L0 0" sodipodi:nodetypes="cc"/><path id="shape0" transform="matrix(-1.00000004580259 0 0 1.00000004580259 67.8261790139506 60.2501787862695)" fill="none" stroke="#000000" stroke-width="5.7504" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="2" d="M6.96 4.8L0 0" sodipodi:nodetypes="cc"/><g id="group5" transform="matrix(0.0510680722900927 0 0 0.0510680722900927 79.9693535499143 3.24652284845245)" fill="none"> <path id="shape27" transform="translate(55.4289277230854, 0)" fill="#3aabd2" stroke-opacity="0" stroke="#000000" stroke-width="0" stroke-linecap="square" stroke-linejoin="bevel" d="M397.61 429.75C395.61 422.25 392.782 415.516 389.282 409.516C383.157 399 375.032 390.813 366.079 384.313C359.376 379.438 352.188 375.485 344.907 372.063C333.969 366.938 322.782 363 312.469 359.188C302.141 355.391 292.688 351.657 285.375 347.329C282.687 345.751 280.266 344.095 278.172 342.376C275.047 339.751 272.641 336.985 270.875 333.876C269.109 330.767 267.922 327.282 267.469 322.907C267.141 319.798 267 316.844 267 314.063C267 305.813 268.219 298.641 269.766 291.329C274.391 286.11 278.61 279.907 282.61 272.47C286.61 265.033 290.423 256.298 294.204 245.97C296.642 244.861 299.079 243.532 301.485 241.939C306.938 238.251 312.11 233.158 316.423 226.345C320.736 219.532 324.204 211.064 326.564 200.611C327.22 197.72 327.533 194.83 327.533 192.002C327.533 186.064 326.142 180.408 323.783 175.361C322.158 171.877 320.08 168.658 317.658 165.736C318.892 161.189 320.392 155.048 321.721 147.877C323.565 137.908 325.096 125.955 325.096 113.346C325.096 105.237 324.471 96.862 322.815 88.565C321.565 82.362 319.768 76.206 317.19 70.299C313.346 61.44 307.752 53.096 299.956 46.205C292.753 39.814 283.722 34.752 272.831 31.471C268.222 25.955 263.456 21.283 258.534 17.362C250.253 10.753 241.534 6.315 232.643 3.643C223.752 0.971 214.751 0 205.766 0C201.032 0 196.313 0.266 191.563 0.688C187.125 1.094 183.438 1.547 180.141 2.11C175.203 2.938 171.141 4.032 167.203 5.391C163.25 6.75 159.453 8.344 154.469 10.297C152.578 11.047 150.11 12.141 147.11 13.656C141.891 16.281 135.141 20.187 127.954 25.562C117.141 33.609 105.204 45 95.9231 60.406C91.2671 68.094 87.2981 76.812 84.5011 86.547C81.6881 96.313 80.0631 107.063 80.0631 118.828C80.0631 126.141 80.7191 133.891 82.0631 142C82.0631 142.563 82.0941 143.125 82.1261 143.656C82.1891 144.656 82.2981 145.719 82.4071 146.812C82.5791 148.421 82.7661 150.093 82.9071 151.5C82.9851 152.188 83.0481 152.813 83.0951 153.313C83.0951 153.547 83.1111 153.751 83.1261 153.907L83.1261 154.063L83.1261 154.11L83.1261 154.126L83.1261 155.048L85.1101 163.876C82.2661 166.985 79.7971 170.485 77.8761 174.314C75.2041 179.658 73.6101 185.658 73.6261 192.017C73.6261 194.83 73.9231 197.72 74.5791 200.611C76.1571 207.595 78.2201 213.689 80.7041 218.97C84.4231 226.939 89.1101 233.126 94.3291 237.783C98.3601 241.392 102.673 244.033 106.954 245.986C110.735 256.299 114.532 265.017 118.548 272.47C122.532 279.908 126.751 286.095 131.376 291.314C132.907 298.611 134.142 305.798 134.142 314.064C134.142 316.861 134.017 319.798 133.689 322.908C133.376 325.908 132.705 328.502 131.751 330.846C130.329 334.33 128.267 337.299 125.438 340.127C122.625 342.908 119.016 345.502 114.766 347.924C110.438 350.377 105.438 352.658 99.9851 354.862C90.4381 358.721 79.5791 362.378 68.5471 366.753C60.2661 370.066 51.9061 373.816 43.9221 378.534C37.9381 382.05 32.1721 386.128 26.8751 390.987C18.9531 398.221 12.0941 407.284 7.37507 418.518C2.62507 429.721 -0.0159277 442.987 7.22769e-05 458.674C7.22769e-05 460.877 0.469072 463.002 1.23407 464.94C1.95307 466.753 2.92207 468.456 4.07807 470.018C6.25007 472.987 9.07807 475.627 12.5161 478.19C18.5631 482.659 26.5941 486.831 37.0001 490.768C52.5941 496.643 73.5001 501.909 100.516 505.768C127.516 509.596 160.641 512.002 200.579 512.002C235.173 512.002 264.688 510.189 289.517 507.205C308.158 504.986 324.158 502.08 337.751 498.767C347.939 496.267 356.767 493.533 364.345 490.658C370.033 488.517 375.033 486.283 379.361 483.97C382.595 482.22 385.486 480.47 388.017 478.626C391.83 475.876 394.876 473.032 397.205 469.813C398.346 468.204 399.33 466.485 400.033 464.641C400.721 462.782 401.142 460.75 401.142 458.672C401.141 447.938 399.907 438.344 397.61 429.75ZM183.11 437.297L124.079 361.828C127.157 360.031 130.079 358.078 132.813 355.89C135.751 353.531 138.454 350.921 140.829 347.952L183.751 367.874L174.595 383.155L188.783 398.202ZM146.907 337.875C148.641 333.828 149.829 329.406 150.298 324.625C150.689 320.937 150.861 317.406 150.861 314.062C150.861 303.124 149.048 293.906 147.252 285.562L146.736 283.296L145.142 281.608C141.095 277.327 137.189 271.842 133.267 264.561C129.361 257.264 125.454 248.186 121.439 236.873L120.126 233.17L116.438 231.811C113.875 230.873 111.391 229.67 109 228.061C105.406 225.623 101.984 222.327 98.8441 217.405C95.7191 212.483 92.9061 205.874 90.8751 196.936C90.5001 195.233 90.3281 193.592 90.3281 192.014C90.3281 188.436 91.2031 185.045 92.8281 181.78C94.1721 179.092 96.0471 176.53 98.3281 174.249C102.172 180.062 105.328 184.655 106.5 185.796C110.25 189.562 109.078 188.405 110.328 186.546C110.328 186.546 114.594 180.546 137.156 136.655C182.297 146.686 261.172 78.889 261.172 78.889C261.172 78.889 262.125 100.78 277.172 120.842C291.438 139.873 299.578 184.545 299.578 184.545C299.578 184.545 301.516 180.873 304.406 175.936C306.14 177.952 307.578 180.139 308.625 182.405C310.063 185.483 310.813 188.671 310.813 191.999C310.813 193.593 310.641 195.233 310.266 196.921C308.907 202.874 307.219 207.812 305.297 211.874C302.438 217.999 299.141 222.202 295.688 225.296C292.219 228.39 288.547 230.405 284.719 231.812L281.031 233.156L279.718 236.859C275.702 248.187 271.796 257.281 267.89 264.562C263.968 271.875 260.046 277.343 255.999 281.625L254.405 283.313L253.905 285.594C252.092 293.907 250.28 303.141 250.28 314.063C250.28 317.407 250.452 320.938 250.827 324.626C251.28 328.97 252.265 333.032 253.765 336.782C253.828 336.954 253.906 337.126 253.984 337.282L203.188 364ZM222.126 440.031L216.048 398.203L230.251 383.156L221.063 367.812L259.891 347.406C260.969 348.797 262.094 350.125 263.313 351.359C267.172 355.312 271.61 358.578 276.376 361.422Z" sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"/> </g><ellipse id="shape28" transform="translate(45.36, 7.68)" rx="14.64" ry="4.92" cx="14.64" cy="4.92" fill="none" stroke="#3aabd2" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="bevel"/><path id="shape29" transform="translate(61.44, 11.9999998875563)" fill="none" stroke="#3aabd2" stroke-width="0.3384" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="2" d="M0 0L23.2812 0" sodipodi:nodetypes="cc"/> </svg> <figcaption>「地平の融合」のイメージ</figcaption> </figure></p> <p>逆に、</p> <ul> <li>わら人形論法(第1章, p.50)</li> <li>意味の混同(equivocation 第2章 p.96): 定義による明確化で避けられる e.g.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B4%C8%D3%CF%C0%CB%A1">ご飯論法</a>,おばさんと親戚の叔母さんの違いなど</li> <li>二次的評価語による議論(第4章 p.159): 一見価値主張でないように見えて実は価値主張を背後に含んだ言葉</li> <li>e.g. 「有意味」の人生という場合,無意味よりいいという暗黙の前提含みをもっている</li> </ul> <p>といった、議論の明確化のうえで害になるような論法についても注意をうながした。</p> <h4 id="43価値的議論-p162">4.3.価値的議論 p.162</h4> <ul> <li>価値的議論は、つねに、前提に価値主張を含むかたちに再構成できる、p.162</li> <li>一般的にヒュームが提唱したとされる価値的推論のの特徴:(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%D1%CD%FD%B3%D8">倫理学</a>において)「『である』から『べき』は導き出せない」 <ul> <li>に対して本書は「価値的な議論は必ず価値的な前提を持っかたちで整理することができる」 p.163</li> </ul> </li> </ul> <p>価値主張の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a> p.178</p> <p>基本的に4つの視点が必要</p> <ul> <li>(1)基本的な言葉の意味を明確にする。</li> <li>(2)事実関係を確認する。</li> <li>(3)同じ理由をいろいろな場面にあてはめる。</li> <li>(4)出発点として利用できる一致点を見つける。</li> </ul> <h3 id="3さまざまな文脈-p242">3.さまざまな文脈 p.242</h3> <blockquote><p>生産的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>をやるために必要なのは、両極端を避けるための思考法である。 p.136</p></blockquote> <p>文脈主義:</p> <ul> <li>誤った二分法を避けるべきだということ、そして問題の重要度に応じて要求される知識の確実さの度合を変えるべきを行うための手法.同じ人の同じ主張が、判定を下す側の文脈で妥当とも妥当でないとも判断できる、という可能性を認める立場.p.137</li> <li>文脈主義を意識的にとれば、文脈の選択そのものについてもクリテ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%AB">イカ</a>ルシンキングができるようになる p.146</li> <li>文脈主義によって得られるのは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>が提供する「疑う技術」を補完する「疑わない技術」である。 疑わないという決定にもそれ相応の理由がいるのでそれを見つけられる。p.147</li> </ul> <p>「さまざまな文脈」に関しては、本書では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>が行なわれる文脈として、いろいろなものを考えた。 大きく分けて、</p> <ul> <li>哲学的な文脈</li> <li>科学的な文脈</li> <li>倫理的な文脈</li> <li>日常的な文脈</li> </ul> <p>の4つは区別できる。</p> <p>それぞれの中でもさらにいくつかの区分ができる。</p> <ul> <li>哲学的文脈 <ul> <li>経験も論理もすべて疑うような文脈(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%AB%A5%EB%A5%C8">デカルト</a>的懐疑) p.105</li> <li>論理は疑わない文脈を区別した(第3章 p.120)。</li> </ul> </li> <li><p>科学的文脈</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>を厳密に適用する文脈: 科学と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BF%BB%F7%B2%CA%B3%D8">疑似科学</a>の聞の線を引く「線引き問題」(demarcation problem, 境界設定問題)で重視(第2章 p.78)</li> <li>やわらかい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>を使う文脈(第5章 p.208): いかなる言い抜けも禁止する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>の考え方を少しゆるめたもので,反証を前にした際の言い抜けの仕方にもいくつかのパターンがあり、新しい実験や観察につながるような生産的な言い抜けならばいいけれども、非生産的な言い抜けばかりくり返すのはだめとする.</li> <li>確率的な推論を認める文脈(第5章 p.212): 統計的な証拠をはじめとして、確率を使った推論 <ul> <li>ヒューム流<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>が問題とならないようなもっと非哲学的な文脈においてであれば、この推論が妥当である</li> <li>前提が正しければ結論が正しい確率が高い</li> </ul> </li> </ul> <p>など。</p></li> <li><p>倫理的な文脈: 価値主張文脈での<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の目標与えられた条件下で「少しでもましな筈え」を出すこと p.149</p> <ul> <li>すべての価値主張を懐疑の対象とする文脈: 特に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D4%A5%E5%A5%ED%A5%F3">ピュロン</a>主義</li> <li>普遍化可能性という基準を認める文脈 (価値主張の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の(3)) p.179</li> <li>誰もが認める一般原則は出発点として受け入れる文脈((4)出発点として利用できる一致点(薄い記述)を見つける,それをするのに反照的均衡を使う p.189)</li> </ul> <p>など(いずれも第4章)。</p></li> <li><p>日常的文脈については本書ではあまりはっきりとは論じなかったが、</p> <ul> <li>権威による議論や伝聞を受け入れる立場(第5章 p.215) <ul> <li>シミュレーションなどがそれなりに正確ならば自力で確かめるよりも他力本願で行ったほうが、かえって正しい結論にたどりつく確率が高いことになるだ</li> </ul> </li> </ul> </li> </ul> <p>がそれにあたる。</p> <p>文脈的思考のツールとしては、</p> <ul> <li><p>関連する対抗仮説(特定理由の要件 p.137)と基準の上下(第3章 p.140)</p> <ul> <li>関連する対抗仮説型 relevant <a class="keyword" href="http://d.hatena.ne.jp/keyword/alternative">alternative</a> : 自分の主張が他の仮説と比べてもっとも優れていることを示せれば、その主張が妥当だとみなすのに十分とする考え方</li> <li>「基準の上下」型 : 要求される確実さのレベルを文脈によって上げ下げし、それに見合った証拠が得られればその主張を妥当とする考え方. e.g. 日常生活なら70%, 人命に関わるなら99.999%の確実性など</li> </ul> </li> <li><p>立証責任(burden of proof 第4章 p.175): 2つ以上の対立する主張があるときに、自分の立場が正しいということを積極的に示す責任のこと</p> <ul> <li>立証責廷は誰にあるのか: <ul> <li>決め手がないときでも、全体的に見てAのほうがもっともらしい、ということはある.こういうときはBに立証責任を帰す</li> <li>特殊な主張をしている側</li> <li>特別な行動を要する主張をしている側</li> <li>もしその主張が正しければ容易にそれが立証できるはずの側に立証責任を帰するという判断基準もある</li> <li>AとBのどちらにも決め手がないがAが本当なら重大な事故や危害が生じる、というような場合、Aだという仮定のもとで安全策をとるのが普通になるので、事故や危害が生じるような状況ではない、というBの側が立証責任を負うことになる</li> </ul> </li> <li>ある共同体で現在受け入れられている倫理規範が正しいかどうかという問題では、間違っていると主張する側のほうが特殊な主張をし、大幅な改革を要求していることになる。したがって、一般論としては、現存する倫理規範を批判する側が立証責任を負うことになる p.177</li> <li>誰も反対しない主張については、そもそも立証を求める人もおらず、立証責任も発生しない p.190</li> </ul> </li> <li><p>反照的均衡(第4章 p.191): 「すでに一致できているところにはできるだけ手をつけず、それでも不整合が生じたら、できるだけ無理の少ない方向で修正を加える」</p></li> </ul> <p>などを紹介した。</p> <h4 id="文脈主義の考え方を主張の妥当性の判断に適用した場合の思考の道筋-p143">文脈主義の考え方を主張の妥当性の判断に適用した場合の思考の道筋 p.143</h4> <ul> <li>(1)まず、その主張が依拠する証拠や前提を洗い出す</li> <li>(2)その証拠と両立するが、もとの主張とは両立しないような対抗仮説を列挙してリストにする。この段階では、デーモン仮説など自分に思いつける限りありとあらゆる可能性を列挙する</li> <li>(3)その文脈ではもとの主張とその仮説の差は無視してもかまわないような(十分ありうる)仮説をリストに残して後で考慮する。デーモン仮説などはほとんどの問題について、ここで排除される</li> <li>(4)残った対抗仮説のうち、もしその対抗仮説が正しかったら非常に困るようなものをチェックし、手許にある証拠でその対抗仮説が十分排除できているかどうか判断する。ここで、問題の重要性によって「排除できている」かどうかの基準が上下する。</li> <li>(5)さらに、残った対抗仮説については、その仮説が正しいと疑う特定の理由があるかどうかを考える。</li> <li>(5)-1: 特定の理由がすべて弱い場合,元の主張が残って妥当とする</li> </ul> <h3 id="4前提の検討-p243">4.前提の検討 p.243</h3> <p>さまざまなタイプの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>の紹介が前提の検討にあたる。</p> <ul> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D4%A5%E5%A5%ED%A5%F3">ピュロン</a>主義(第4章 p.168): <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>の中の1つ:ある文化圏(やある<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%D1%CD%FD%B3%D8">倫理学</a>上の立場)が他の文化圏(や他の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%D1%CD%FD%B3%D8">倫理学</a>上の立場)よりも正しいと考える理由は存在しない、と考え、善悪の問題について判断停止をするべき。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D4%A5%E5%A5%ED%A5%F3">ピュロン</a>主義の主張の一つとして、われわれはあらゆることについて判断を保留して平静に生きなくてはならない、という生き方についての積極的な主張が含まれている <ul> <li>「平静に生きるべし」という価値主張自体は懐疑しなくてよいのか?</li> </ul> </li> <li>注意: このタイプの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>は、何が善で何が悪かということについてなんらかの正解があるかもしれないという可能性を否定する必要さえない.倫理的 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>がやるのは、単に、ある問題についての具体的な解答の一つひとつについて個別に疑問を呈し、「他の文化や理論ではそれと矛盾することを言っているが、あなたの文化や理論のほうが正しいという証拠はあるのか」と尋ねることだけ.</li> </ul> </li> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%AB%A5%EB%A5%C8">デカルト</a>的懐疑(第3章 p.105): 疑いうるものについてはすべていったん判断を停止して、絶対確実に真だとわかるものだけを受け入れるというやり方.(※<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%AB%A5%EB%A5%C8">デカルト</a>自身これを否定できるものが真の知識だとして探求していた)</p> <ul> <li>->騙されている「私」、騙されているのではないかと疑っている「私」の存在は疑いようがないと考えた</li> <li>-> 「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%E6%BB%D7%A4%A6%A1%A2%A4%E6%A4%A8%A4%CB%B2%E6%A4%A2%A4%EA">我思う、ゆえに我あり</a>」</li> <li>できるだけ確実なものから出発して確実な情報とあやふやな情報をより分けていくという方針そのものは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の一つの基本的な考え方として参考にすることはできる p.117 (「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>はみんなでやれば怖くない」)</li> </ul> </li> <li><p>ヒューム流の懐疑(第3章 p.139): 法則や規則性がこれから観察するもの、これから起きることにもそのままあてはまると期待する理由は何もないのではないか、という疑い</p> <ul> <li>e.g. これまで見つかったカラスがすべて黒かったからといって、次に見つかるカラスが白くないという保証はないと疑う</li> </ul> </li> <li><p>倫理的<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>(第4章 p.167): 何が善いか、何をするのが正しいかに関する主張に対して、本当にそれが善い(正しい)のかどうか疑う、という立場</p> <ul> <li>倫理的<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>へのよくある回答 p.171 <ul> <li>倫理的ルールの普遍性: 実際には基本的な倫理問題については文化聞や哲学上の立場の聞で大きなくい違いはない <ul> <li>欠点:性的タブーなど社会によってばらつきの大きい規範にはこの議論は使えない。</li> </ul> </li> <li>倫理的ル-ルの合理性:「社会契約」のかたちをとることが多い <ul> <li>欠点:契約の穴になるような状況ではいいのかという泥沼になる</li> </ul> </li> <li>回避パターン:倫理的<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>をまじめに受けとると何もできなくなってしまうので、まじめに受けとることはできない <ul> <li>欠点:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>を全面放棄するのも行きすぎ</li> </ul> </li> <li>文脈主義 p.174</li> </ul> </li> </ul> </li> <li><p>科学における組織だった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>(第2章 p.93): 科学者による集団的なチェックのプロセスを生き延びるという重要な基準を満たしているか</p></li> <li><p>環境危機に関する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>(第5章 p.202, p.232)</p></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の倫理性 p.232</li> <li>緊急性と反論可能性はどのくらい認めるかの解決策: 文脈の分業: いくつかの独立な文脈を並行して存立させる <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>が倫理的合意を持つ例: 疑われること自体によって心に傷が残るという場面でも役立つ.</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>をしないほうがいいかどうかを判断するためにも、きちんと判断しようとするなら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>が必要</li> </ul> <p>なんでものも出てくる。</p> <p>前提を検討するための思考のツールとしては</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>とやわらかい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>(第2章p.78、第5章)、 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%B2%C4%C7%BD%C0%AD">反証可能性</a>に基づく.反証可能とは、データ(証拠)と突き合わせることでその仮説が放棄されることがありうる,を意味する。科学哲学では科学と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BF%BB%F7%B2%CA%B3%D8">疑似科学</a>を分ける境界設定問題(denarcation problem)が有名.</li> </ul> </li> <li>普遍化可能性テスト(第4章 p.187) <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%D6%A5%B9%A5%BF">ダブスタ</a>を見つける</li> </ul> <p>などをとりあげている。</p> <h4 id="反証可能性-p78"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%B2%C4%C7%BD%C0%AD">反証可能性</a> p.78</h4> <p>科学的仮説を提案する者の2つの心得</p> <ul> <li>(1)仮説を立てるときは反証可能なかたちで仮説を立てるべし。</li> <li>(2)仮説を立てたらできる限り反証しようと試みるべし</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%B2%C4%C7%BD%C0%AD">反証可能性</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%B4%CD%FD%C5%AA">心理的</a>重要性: 自分の仮説と距離をとるための手段として、その仮説の反証条件は何か、そして反証条件を満たすような証拠はないかと考える習慣を持つのは非常に有用</p> <h3 id="5推論の検討">5.推論の検討</h3> <p>大きく分けて、</p> <ul> <li>論理学における推論</li> <li>それ以外の領域での推論</li> </ul> <p>について扱っている。</p> <p>論理学では、</p> <ul> <li>三段論法など、演緯的に妥当な推論を重視する(第3章 p.120)。そのため、肯定式や否定式は妥当だが、前件否定の過ちや後件肯定の過ちは妥当でない推論として否定される(p.128)。 <ul> <li>論理学は前提の妥当性については基本的に口を出さない (これは前提の検討にあたる)p.124</li> <li>「実践的三段論法」は倫理的判断について理解するうえで非常に助けになる p.128</li> <li>前件否定の過ち A->Bが真のときの not A -> Bの形 p.128</li> <li>後件肯定の過ち not B -> not Aが真のときのB ->not Aの形 p.128</li> </ul> </li> <li>しかし、厳密な論理学以外のほとんどの文脈においては確率的な推論も妥当な推論として認めざるをえない(第5章 p.214)。</li> </ul> <p>そのほか気をつけるべき推論に関する話題は本書全体に散らばっている。</p> <ul> <li>分配の過ちと結合の過ち(第2章 p.87)</li> <li>分配の過ち例:科学そのもの、ないしはグループとしての科学者が信頼できるからといって、個々の「科学者」が信用できるとは隈らない。</li> <li> 結合の過ち: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E7%C0%AE%A4%CE%B8%ED%C9%B5">合成の誤謬</a></li> <li>権威からの議論と対人論法(第2章p.72, p.74と第5章 p.215) <ul> <li>権威からの議論対策: その人が権威を持つとされる理由と、言っている内容の信憑性の聞に相聞があるのでない限り、権威からの議論は使わないほうがよい</li> <li>共通の対策:ある主張の善し悪しを判断するときには、主張している人を見て判断するのではなく、どういう証拠からどういう推論でその主張が導かれているか、という点を見るべき p.74</li> <li>一般に、他人の証言を信頼せざるをえない状況はすべて権威からの議論を援用することになる。</li> <li>権威からの議論を使っていい場面: その人の権威がどういう根拠から発生しているかということと、問題になっている主張の内容に関係があるかどうかで、権威からの議論を使っていいかどうかを判断する</li> </ul> </li> <li>事例による議論(第2章 p.101): 一般的には、「AはBである、なぜならこの事例においてはAがBであったから」というかたちをとる.「AをすればBになることもある」という弱い主張をするときには、事例による議論は非常に強力.</li> <li>二分法的議論(第3章p.136と第5章 p.214)</li> <li>誤った二分法 false dichotomy : 複雑な状況をAかBかというかたちで単<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%E3%B2%BD">純化</a>して、AではないからBだ、と結論する過ち 第3章p.136:</li> <li>二分法的議論: 誤った二分法に対して、AでないものがおおむねBであることがわかっているのなら、これは確率的には妥当な推論にもなりうる。</li> <li>e.g. 通勤手段として5割の人が電車、4割がパス、1割がその他の手段を使っていることがわかっているとしたら、相手がパス通勤ではないことがわかれば「おそらくこの人は電車で通勤しているのだろう」と推定するのは十分根拠がある推論になる.</li> </ul> <p>などがそうである。</p> <p>また、価値主張に関してはとくに気をつけるべき推論として、</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%F3%BD%C5%B4%F0%BD%E0">二重基準</a>の過ち(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%D6%A5%B9%A5%BF">ダブスタ</a> p.192): 、結論が最初からあってその結論にたどりつくためにあとから理由をつけるような場合によく起きる</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%BC%E7%B5%C1">自然主義</a>的誤謬 p.193: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%D1%CD%FD%B3%D8">倫理学</a>者ムーアが導入した考えで、倫理的概念を事実で定義するという過ち <ul> <li>e.g. 「人々が受け入れている規範は正しい」</li> </ul> </li> <li>自然さからの議論 p.194 <ul> <li>e.g. <ul> <li>「Xという行為は自然なので、やってよい」</li> <li>「Xという行為は不自然なので、やってはならない」</li> </ul> </li> </ul> </li> </ul> <p>などを挙げた(第4章)。</p> <h4 id="4章-実践的三段論法-p162">4章 実践的三段論法 p.162</h4> <p>実践的三段論法:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EA%A5%B9%A5%C8%A5%C6%A5%EC%A5%B9">アリストテレス</a>は、価値的議論における妥当な推論形式 - 大前提と結論に特徴 - 大前提:一般性の高いカテゴリに関する価値主張 - 小前提:ある特定の事物がその一般的カテゴリに属する前提</p> <p>e.g.</p> <pre class="code" data-lang="" data-unlink>[4-3 p.165] 大前提 有意味な生迭を送るのは望ましい 小前提 Xという生き方は有意味である ---------------------------------------------------- 結論 Xという生き方をするのは望ましい</pre> <ul> <li>価値主張の無限連鎖:大前提も価値主張である以上、それを正当化する議論を組み立てようとすれば別の実践的三段論法が必要になる p.165</li> </ul> <p></section></p> <p><section></p> <h2 id="この本で紹介されているブックガイド">この本で紹介されているブックガイド</h2> <p>この本の最後には、哲学系の良い入門本によくあるブックガイドが付いてる。</p> <p><section></p> <h3 id="クリティカルシンキング全般"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>全般</h3> <p>日本語があるもの:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4782802110/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41UJxuq-WKL._SL500_.jpg" class="hatena-asin-detail-image" alt="新版 論理トレーニング (哲学教科書シリーズ)" title="新版 論理トレーニング (哲学教科書シリーズ)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4782802110/newm-22/" target="_blank" rel="noopener">新版 論理トレーニング (哲学教科書シリーズ)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%CC%EE%CC%F0%20%CC%D0%BC%F9" class="keyword">野矢 茂樹</a></li><li>産業図書</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4782802110/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/478280136X/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41X2PCT1WFL._SL500_.jpg" class="hatena-asin-detail-image" alt="論理トレーニング101題" title="論理トレーニング101題"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/478280136X/newm-22/" target="_blank" rel="noopener">論理トレーニング101題</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%CC%EE%CC%F0%20%CC%D0%BC%F9" class="keyword">野矢 茂樹</a></li><li>産業図書</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/478280136X/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4569634362/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/61NE4GFSYAL._SL500_.jpg" class="hatena-asin-detail-image" alt="クリティカル・シンキング練習帳" title="クリティカル・シンキング練習帳"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4569634362/newm-22/" target="_blank" rel="noopener">クリティカル・シンキング練習帳</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/M%A1%A6%A5%CB%A1%BC%A5%EB%A1%A6%A5%D6%A5%E9%A5%A6%A5%F3" class="keyword">M・ニール・ブラウン</a>,<a href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C1%A5%E5%A5%A2%A1%BC%A5%C8%A1%A6M%A1%A6%A5%AD%A1%BC%A5%EA%A1%BC" class="keyword">スチュアート・M・キーリー</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP%B8%A6%B5%E6%BD%EA">PHP研究所</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4569634362/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <ul> <li>原著 <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00XN477ME/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51SZQ6nw4tL._SL500_.jpg" class="hatena-asin-detail-image" alt="Asking the Right Questions PDF eBook, Global Edition (English Edition)" title="Asking the Right Questions PDF eBook, Global Edition (English Edition)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00XN477ME/newm-22/" target="_blank" rel="noopener">Asking the Right Questions PDF eBook, Global Edition (English Edition)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Browne%2C%20M." class="keyword">Browne, M.</a>,<a href="http://d.hatena.ne.jp/keyword/Keeley%2C%20Stuart%20M." class="keyword">Keeley, Stuart M.</a></li><li>Pearson</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00XN477ME/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> </li> </ul> </li> <li>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%C0%CF%C5%AF%B3%D8">分析哲学</a>としての哲学/哲学としての<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%C0%CF%C5%AF%B3%D8">分析哲学</a>, 『<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%BD%C2%E5%BB%D7%C1%DB">現代思想</a>』2004年7月号」が収録されている <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08K3FJ9D4/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41lifwL0xCL._SL500_.jpg" class="hatena-asin-detail-image" alt="分析哲学 これからとこれまで (けいそうブックス)" title="分析哲学 これからとこれまで (けいそうブックス)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08K3FJ9D4/newm-22/" target="_blank" rel="noopener">分析哲学 これからとこれまで (けいそうブックス)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%C8%D3%C5%C4%CE%B4" class="keyword">飯田隆</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%D2%A6%C1%F0%BD%F1%CB%BC">勁草書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08K3FJ9D4/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/476282139X/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51CRA409FDL._SL500_.jpg" class="hatena-asin-detail-image" alt="クリティカル進化(シンカー)論―「OL進化論」で学ぶ思考の技法" title="クリティカル進化(シンカー)論―「OL進化論」で学ぶ思考の技法"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/476282139X/newm-22/" target="_blank" rel="noopener">クリティカル進化(シンカー)論―「OL進化論」で学ぶ思考の技法</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%C6%BB%C5%C4%20%C2%D9%BB%CA" class="keyword">道田 泰司</a>,<a href="http://d.hatena.ne.jp/keyword/%B5%DC%B8%B5%20%C7%EE%BE%CF" class="keyword">宮元 博章</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CB%CC%C2%E7%CF%A9%BD%F1%CB%BC">北大路書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/476282139X/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/476282061X/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/513BZY8EKEL._SL500_.jpg" class="hatena-asin-detail-image" alt="クリティカルシンキング 入門篇: あなたの思考をガイドする40の原則" title="クリティカルシンキング 入門篇: あなたの思考をガイドする40の原則"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/476282061X/newm-22/" target="_blank" rel="noopener">クリティカルシンキング 入門篇: あなたの思考をガイドする40の原則</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/E.B.%A5%BC%A5%C3%A5%AF%A5%DF%A5%B9%A5%BF" class="keyword">E.B.ゼックミスタ</a>,<a href="http://d.hatena.ne.jp/keyword/J.E.%A5%B8%A5%E7%A5%F3%A5%BD%A5%F3" class="keyword">J.E.ジョンソン</a>,<a href="http://d.hatena.ne.jp/keyword/%B5%DC%B8%B5%20%C7%EE%BE%CF" class="keyword">宮元 博章</a>,<a href="http://d.hatena.ne.jp/keyword/%C6%BB%C5%C4%20%C2%D9%BB%CA" class="keyword">道田 泰司</a>,<a href="http://d.hatena.ne.jp/keyword/%C3%AB%B8%FD%20%B9%E2%BB%CE" class="keyword">谷口 高士</a>,<a href="http://d.hatena.ne.jp/keyword/%B5%C6%C3%D3%20%C1%EF" class="keyword">菊池 聡</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CB%CC%C2%E7%CF%A9%BD%F1%CB%BC">北大路書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/476282061X/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <ul> <li>原著 <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0534165966/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/512TUr4PrrL._SL500_.jpg" class="hatena-asin-detail-image" alt="Critical Thinking: A Functional Approach" title="Critical Thinking: A Functional Approach"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0534165966/newm-22/" target="_blank" rel="noopener">Critical Thinking: A Functional Approach</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Zechmeister%2C%20Eugene%20B." class="keyword">Zechmeister, Eugene B.</a>,<a href="http://d.hatena.ne.jp/keyword/Johnson%2C%20James%20E." class="keyword">Johnson, James E.</a></li><li>Brooks/Cole Pub Co</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0534165966/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> </li> </ul> <p>洋書:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07X754VP9/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41BGhkQ2ClL._SL500_.jpg" class="hatena-asin-detail-image" alt="Critical Thinking: A Concise Guide (English Edition)" title="Critical Thinking: A Concise Guide (English Edition)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07X754VP9/newm-22/" target="_blank" rel="noopener">Critical Thinking: A Concise Guide (English Edition)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Bowell%2C%20Tracy" class="keyword">Bowell, Tracy</a>,<a href="http://d.hatena.ne.jp/keyword/Cowan%2C%20Robert" class="keyword">Cowan, Robert</a>,<a href="http://d.hatena.ne.jp/keyword/Kemp%2C%20Gary" class="keyword">Kemp, Gary</a></li><li>Routledge</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07X754VP9/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/1133049753/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51rrlVWlRJL._SL500_.jpg" class="hatena-asin-detail-image" alt="Introduction to Logic and Critical Thinking" title="Introduction to Logic and Critical Thinking"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/1133049753/newm-22/" target="_blank" rel="noopener">Introduction to Logic and Critical Thinking</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Salmon%2C%20Merrilee%20H." class="keyword">Salmon, Merrilee H.</a></li><li>Cengage Learning</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/1133049753/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00EM37YRS/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41O-QQzuotL._SL500_.jpg" class="hatena-asin-detail-image" alt="How to Think Straight: An Introduction to Critical Reasoning (English Edition)" title="How to Think Straight: An Introduction to Critical Reasoning (English Edition)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00EM37YRS/newm-22/" target="_blank" rel="noopener">How to Think Straight: An Introduction to Critical Reasoning (English Edition)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Flew%2C%20Antony" class="keyword">Flew, Antony</a></li><li>Prometheus</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00EM37YRS/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07CNBJR86/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41-BoBMfgWL._SL500_.jpg" class="hatena-asin-detail-image" alt="A Rulebook for Arguments (English Edition)" title="A Rulebook for Arguments (English Edition)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07CNBJR86/newm-22/" target="_blank" rel="noopener">A Rulebook for Arguments (English Edition)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Weston%2C%20Anthony" class="keyword">Weston, Anthony</a></li><li>Hackett Publishing Company, Inc.</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07CNBJR86/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4320005732/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51i5PvRBxXL._SL500_.jpg" class="hatena-asin-detail-image" alt="哲学の道具箱" title="哲学の道具箱"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4320005732/newm-22/" target="_blank" rel="noopener">哲学の道具箱</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%E5%A5%EA%A5%A2%A5%F3%A1%A6%A5%D0%A5%C3%A5%B8%A1%BC%A5%CB" class="keyword">ジュリアン・バッジーニ</a>,<a href="http://d.hatena.ne.jp/keyword/%A5%D4%A1%BC%A5%BF%A1%BC%A1%A6%A5%D5%A5%A9%A5%B9%A5%EB" class="keyword">ピーター・フォスル</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%A6%CE%A9%BD%D0%C8%C7">共立出版</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4320005732/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <ul> <li>原著:<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B0875NSBM5/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51+HmaoLfyL._SL500_.jpg" class="hatena-asin-detail-image" alt="The Philosopher&#39;s Toolkit: A Compendium of Philosophical Concepts and Methods (English Edition)" title="The Philosopher&#39;s Toolkit: A Compendium of Philosophical Concepts and Methods (English Edition)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B0875NSBM5/newm-22/" target="_blank" rel="noopener">The Philosopher&#39;s Toolkit: A Compendium of Philosophical Concepts and Methods (English Edition)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Fosl%2C%20Peter%20S." class="keyword">Fosl, Peter S.</a>,<a href="http://d.hatena.ne.jp/keyword/Baggini%2C%20Julian" class="keyword">Baggini, Julian</a></li><li>Wiley-Blackwell</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B0875NSBM5/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> </li> </ul> <p>文献探索法(この本では文献探索まで触れられてないが、代わりに紹介されている):</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B01MDLGE9O/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/316Mv-g7itL._SL500_.jpg" class="hatena-asin-detail-image" alt="理科系の作文技術(リフロー版) (中公新書)" title="理科系の作文技術(リフロー版) (中公新書)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B01MDLGE9O/newm-22/" target="_blank" rel="noopener">理科系の作文技術(リフロー版) (中公新書)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%CC%DA%B2%BC%C0%A7%CD%BA" class="keyword">木下是雄</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%E6%B1%FB%B8%F8%CF%C0%BF%B7%BC%D2">中央公論新社</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B01MDLGE9O/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00VESYKAS/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51eByW1OA7L._SL500_.jpg" class="hatena-asin-detail-image" alt="新版 論文の教室 レポートから卒論まで (NHKブックス)" title="新版 論文の教室 レポートから卒論まで (NHKブックス)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00VESYKAS/newm-22/" target="_blank" rel="noopener">新版 論文の教室 レポートから卒論まで (NHKブックス)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B8%CD%C5%C4%BB%B3%20%CF%C2%B5%D7" class="keyword">戸田山 和久</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/NHK">NHK</a>出版</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00VESYKAS/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p></section></p> <p><section></p> <h3 id="反証主義まわり"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BF%BE%DA%BC%E7%B5%C1">反証主義</a>まわり</h3> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4815804532/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/411KF3QGDWL._SL500_.jpg" class="hatena-asin-detail-image" alt="疑似科学と科学の哲学" title="疑似科学と科学の哲学"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4815804532/newm-22/" target="_blank" rel="noopener">疑似科学と科学の哲学</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B0%CB%C0%AA%C5%C4%20%C5%AF%BC%A3" class="keyword">伊勢田 哲治</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BE%B8%C5%B2%B0%C2%E7%B3%D8">名古屋大学</a>出版会</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4815804532/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4140910224/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51K7TVQHJAL._SL500_.jpg" class="hatena-asin-detail-image" alt="科学哲学の冒険 サイエンスの目的と方法をさぐる (NHKブックス)" title="科学哲学の冒険 サイエンスの目的と方法をさぐる (NHKブックス)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4140910224/newm-22/" target="_blank" rel="noopener">科学哲学の冒険 サイエンスの目的と方法をさぐる (NHKブックス)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B8%CD%C5%C4%BB%B3%20%CF%C2%B5%D7" class="keyword">戸田山 和久</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/NHK">NHK</a>出版</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4140910224/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4790705587/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/415yT9q6maL._SL500_.jpg" class="hatena-asin-detail-image" alt="科学哲学入門―科学の方法・科学の目的 (世界思想ゼミナール)" title="科学哲学入門―科学の方法・科学の目的 (世界思想ゼミナール)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4790705587/newm-22/" target="_blank" rel="noopener">科学哲学入門―科学の方法・科学の目的 (世界思想ゼミナール)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%C6%E2%B0%E6%20%C1%DA%BC%B7" class="keyword">内井 惣七</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%A4%B3%A6%BB%D7%C1%DB%BC%D2">世界思想社</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4790705587/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00E17CKLA/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41HBJVhkV7L._SL500_.jpg" class="hatena-asin-detail-image" alt="ポパー 批判的合理主義" title="ポパー 批判的合理主義"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00E17CKLA/newm-22/" target="_blank" rel="noopener">ポパー 批判的合理主義</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%BE%AE%B2%CF%B8%B6%A1%A1%C0%BF" class="keyword">小河原 誠</a></li><li>小河原 誠</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00E17CKLA/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p></section></p> <p><section></p> <h3 id="3章のブックガイド">3章のブックガイド</h3> <p>認識論と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4782802080/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/4121BBRG2KL._SL500_.jpg" class="hatena-asin-detail-image" alt="知識の哲学 (哲学教科書シリーズ)" title="知識の哲学 (哲学教科書シリーズ)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4782802080/newm-22/" target="_blank" rel="noopener">知識の哲学 (哲学教科書シリーズ)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B8%CD%C5%C4%BB%B3%20%CF%C2%B5%D7" class="keyword">戸田山 和久</a></li><li>産業図書</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4782802080/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0631229191/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51CWuCGNI+L._SL500_.jpg" class="hatena-asin-detail-image" alt="Blackwell Gde to Philosophy of Computing (Blackwell Philosophy Guides)" title="Blackwell Gde to Philosophy of Computing (Blackwell Philosophy Guides)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0631229191/newm-22/" target="_blank" rel="noopener">Blackwell Gde to Philosophy of Computing (Blackwell Philosophy Guides)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Floridi%2C%20Luciano" class="keyword">Floridi, Luciano</a></li><li>Wiley-Blackwell</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0631229191/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%AB%A5%EB%A5%C8">デカルト</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%FB%B5%BF%BC%E7%B5%C1">懐疑主義</a>について:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4560025266/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41zu-RCWUoL._SL500_.jpg" class="hatena-asin-detail-image" alt="デカルト著作集〈2〉" title="デカルト著作集〈2〉"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4560025266/newm-22/" target="_blank" rel="noopener">デカルト著作集〈2〉</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%AB%A5%EB%A5%C8" class="keyword">デカルト</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%F2%BF%E5%BC%D2">白水社</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4560025266/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p>論理学:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4815803900/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/5126AYWJFRL._SL500_.jpg" class="hatena-asin-detail-image" alt="論理学をつくる" title="論理学をつくる"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4815803900/newm-22/" target="_blank" rel="noopener">論理学をつくる</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B8%CD%C5%C4%BB%B3%20%CF%C2%B5%D7" class="keyword">戸田山 和久</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BE%B8%C5%B2%B0%C2%E7%B3%D8">名古屋大学</a>出版会</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4815803900/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4130120530/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/31KQKS7Y5DL._SL500_.jpg" class="hatena-asin-detail-image" alt="論理学" title="論理学"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4130120530/newm-22/" target="_blank" rel="noopener">論理学</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%CC%D0%BC%F9%2C%20%CC%EE%CC%F0" class="keyword">茂樹, 野矢</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%C2%E7%B3%D8%BD%D0%C8%C7%B2%F1">東京大学出版会</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4130120530/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/414001895X/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41Z5Z7D8MQL._SL500_.jpg" class="hatena-asin-detail-image" alt="論理学入門 推論のセンスとテクニックのために (NHKブックス)" title="論理学入門 推論のセンスとテクニックのために (NHKブックス)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/414001895X/newm-22/" target="_blank" rel="noopener">論理学入門 推論のセンスとテクニックのために (NHKブックス)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%BB%B0%B1%BA%20%BD%D3%C9%A7" class="keyword">三浦 俊彦</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/NHK">NHK</a>出版</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/414001895X/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p>文脈主義:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0631229191/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51CWuCGNI+L._SL500_.jpg" class="hatena-asin-detail-image" alt="Blackwell Gde to Philosophy of Computing (Blackwell Philosophy Guides)" title="Blackwell Gde to Philosophy of Computing (Blackwell Philosophy Guides)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0631229191/newm-22/" target="_blank" rel="noopener">Blackwell Gde to Philosophy of Computing (Blackwell Philosophy Guides)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Floridi%2C%20Luciano" class="keyword">Floridi, Luciano</a></li><li>Wiley-Blackwell</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/0631229191/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p>文脈主義の出発点となった</p> <ul> <li>オースティン論文集の中の「他人の心」  <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4326198850/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41KtGAZKYDS._SL500_.jpg" class="hatena-asin-detail-image" alt="オースティン哲学論文集 (双書プロブレーマタ)" title="オースティン哲学論文集 (双書プロブレーマタ)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4326198850/newm-22/" target="_blank" rel="noopener">オースティン哲学論文集 (双書プロブレーマタ)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/J.L.%20%A5%AA%A1%BC%A5%B9%A5%C6%A5%A3%A5%F3" class="keyword">J.L. オースティン</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%D2%A6%C1%F0%BD%F1%CB%BC">勁草書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4326198850/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p></section></p> <p><section></p> <h3 id="倫理">倫理</h3> <p>倫理問題の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4771027617/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41snecNqeYL._SL500_.jpg" class="hatena-asin-detail-image" alt="新版 現実をみつめる道徳哲学" title="新版 現実をみつめる道徳哲学"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4771027617/newm-22/" target="_blank" rel="noopener">新版 現実をみつめる道徳哲学</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%B8%CD%CE%BD%F1%CB%BC">晃洋書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4771027617/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <ul> <li>原著 <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/1265237182/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/01MKUOLsA5L._SL500_.gif" class="hatena-asin-detail-image" alt="ISE The Elements of Moral Philosophy" title="ISE The Elements of Moral Philosophy"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/1265237182/newm-22/" target="_blank" rel="noopener">ISE The Elements of Moral Philosophy</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Rachels%2C%20James" class="keyword">Rachels, James</a>,<a href="http://d.hatena.ne.jp/keyword/Rachels%2C%20Stuart" class="keyword">Rachels, Stuart</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/McGraw-Hill%20Education">McGraw-Hill Education</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/1265237182/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> </li> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4393323041/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/519YG4GBKRL._SL500_.jpg" class="hatena-asin-detail-image" alt="ここからはじまる倫理" title="ここからはじまる倫理"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4393323041/newm-22/" target="_blank" rel="noopener">ここからはじまる倫理</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%F3%A5%BD%A5%CB%A1%BC%20%A5%A6%A5%A8%A5%B9%A5%C8%A5%F3" class="keyword">アンソニー ウエストン</a></li><li>春秋社</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4393323041/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p>倫理における<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C6%A5%A3%A5%AB%A5%EB%A5%B7%A5%F3%A5%AD%A5%F3%A5%B0">クリティカルシンキング</a>の実践問題集:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4093874336/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/61FGMDK8XHL._SL500_.jpg" class="hatena-asin-detail-image" alt="倫理力を鍛える―Q&amp;A善悪の基準がわかるようになるトレーニングブック" title="倫理力を鍛える―Q&amp;A善悪の基準がわかるようになるトレーニングブック"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4093874336/newm-22/" target="_blank" rel="noopener">倫理力を鍛える―Q&amp;A善悪の基準がわかるようになるトレーニングブック</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B2%C3%C6%A3%20%BE%B0%C9%F0" class="keyword">加藤 尚武</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%B3%D8%B4%DB">小学館</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4093874336/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p>メタ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%D1%CD%FD%B3%D8">倫理学</a>:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4888486352/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51kUV12-zlL._SL500_.jpg" class="hatena-asin-detail-image" alt="道徳の哲学者たち―倫理学入門" title="道徳の哲学者たち―倫理学入門"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4888486352/newm-22/" target="_blank" rel="noopener">道徳の哲学者たち―倫理学入門</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%C1%A5%E3%A1%BC%A5%C9%20%A5%CE%A1%BC%A5%DE%A5%F3" class="keyword">リチャード ノーマン</a></li><li>ナ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%CB">カニ</a>シヤ出版</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4888486352/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p>反照的均衡:</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%EB%A5%BA">ロールズ</a>「正義論」の解説本:<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4326153229/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51afELUP7FL._SL500_.jpg" class="hatena-asin-detail-image" alt="ロールズ―『正義論』とその批判者たち" title="ロールズ―『正義論』とその批判者たち"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4326153229/newm-22/" target="_blank" rel="noopener">ロールズ―『正義論』とその批判者たち</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%AB%A5%B5%A5%B9%2C%A5%C1%A5%E3%A5%F3%A5%C9%A5%E9%A5%F3" class="keyword">クカサス,チャンドラン</a>,<a href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%C6%A5%A3%A5%C3%A5%C8%2C%A5%D5%A5%A3%A5%EA%A5%C3%A5%D7" class="keyword">ペティット,フィリップ</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%D2%A6%C1%F0%BD%F1%CB%BC">勁草書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4326153229/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p></section></p> <p><section></p> <h3 id="通約不可能性">通約不可能性</h3> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4622016672/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41R84CNDH2L._SL500_.jpg" class="hatena-asin-detail-image" alt="科学革命の構造" title="科学革命の構造"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4622016672/newm-22/" target="_blank" rel="noopener">科学革命の構造</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%DE%A5%B9%A1%A6%A5%AF%A1%BC%A5%F3" class="keyword">トーマス・クーン</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%DF%A4%B9%A4%BA%BD%F1%CB%BC">みすず書房</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4622016672/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <ul> <li>原著:<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B007USH7J2/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51WjNGMP1xL._SL500_.jpg" class="hatena-asin-detail-image" alt="The Structure of Scientific Revolutions: 50th Anniversary Edition (English Edition)" title="The Structure of Scientific Revolutions: 50th Anniversary Edition (English Edition)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B007USH7J2/newm-22/" target="_blank" rel="noopener">The Structure of Scientific Revolutions: 50th Anniversary Edition (English Edition)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/Kuhn%2C%20Thomas%20S." class="keyword">Kuhn, Thomas S.</a></li><li>University of Chicago Press</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B007USH7J2/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li>解説本 <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4062659247/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/514EFMH3J5L._SL500_.jpg" class="hatena-asin-detail-image" alt="クーン―パラダイム (現代思想の冒険者たち)" title="クーン―パラダイム (現代思想の冒険者たち)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4062659247/newm-22/" target="_blank" rel="noopener">クーン―パラダイム (現代思想の冒険者たち)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%CC%EE%B2%C8%20%B7%BC%B0%EC" class="keyword">野家 啓一</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%D6%C3%CC%BC%D2">講談社</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4062659247/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> </li> </ul> <p>ガダマーの「地平の融合」:</p> <ul> <li>ガダマーの解説本 丸山高司『ガダマー-地平の融合』 <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4062659123/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/510DKVFBDXL._SL500_.jpg" class="hatena-asin-detail-image" alt="ガダマー―地平の融合 (現代思想の冒険者たち)" title="ガダマー―地平の融合 (現代思想の冒険者たち)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4062659123/newm-22/" target="_blank" rel="noopener">ガダマー―地平の融合 (現代思想の冒険者たち)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B4%DD%BB%B3%20%B9%E2%BB%CA" class="keyword">丸山 高司</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%D6%C3%CC%BC%D2">講談社</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4062659123/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p>異文化コニュニケーション:</p> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4641121079/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/414BJ502G7L._SL500_.jpg" class="hatena-asin-detail-image" alt="異文化コミュニケーション・入門 (有斐閣アルマ)" title="異文化コミュニケーション・入門 (有斐閣アルマ)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4641121079/newm-22/" target="_blank" rel="noopener">異文化コミュニケーション・入門 (有斐閣アルマ)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%CD%FD%C3%CE%BB%D2%2C%20%C3%D3%C5%C4" class="keyword">理知子, 池田</a>,<a href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EC%A1%BC%A5%DE%A1%BC%2C%A5%A8%A5%EA%A5%C3%A5%AF%A1%A6M." class="keyword">クレーマー,エリック・M.</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%C8%E5%B3%D5">有斐閣</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4641121079/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> </ul> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考書リンク">参考書・リンク</h2> <ul> <li><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00IE7L1W2/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41wDwgQem4L._SL500_.jpg" class="hatena-asin-detail-image" alt="哲学思考トレーニング (ちくま新書)" title="哲学思考トレーニング (ちくま新書)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00IE7L1W2/newm-22/" target="_blank" rel="noopener">哲学思考トレーニング (ちくま新書)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B0%CB%C0%AA%C5%C4%C5%AF%BC%A3" class="keyword">伊勢田哲治</a></li><li>筑摩書房</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00IE7L1W2/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></li> <li><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbookofbadarguments.com%2Fjp%2F" title="絵で見てわかる 誤謬の事典 (訳:南学正仁)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://bookofbadarguments.com/jp/">bookofbadarguments.com</a></cite></li> </ul> <p></aside></p> Wed, 26 Jan 2022 18:02:20 +0900 hatenablog://entry/13574176438056719158 Philosophy CriticalThinking ドット絵で30°の斜線を引くには https://cartman0.hatenablog.com/entry/2021/10/07/%E3%83%89%E3%83%83%E3%83%88%E7%B5%B5%E3%81%A730%C2%B0%E3%81%AE%E6%96%9C%E7%B7%9A%E3%82%92%E5%BC%95%E3%81%8F%E3%81%AB%E3%81%AF?utm_source=feed <h1 id="ドット絵で30度の斜線を引くには">ドット絵で30度の斜線を引くには</h1> <p>ドット絵で中途半端な角度の斜線を引くための計算メモ. 数学的に考えると,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%CB%BA%C2%C9%B8">極座標</a>系のグリッド化問題になる?</p> <p>結論からいくと,</p> <ul> <li>単純に30度を引くには,「2,2,1,...」の周期並びで問題ない. <a class="keyword" href="http://d.hatena.ne.jp/keyword/arctan">arctan</a> 3/5 ≒ 31度になる.+1度の誤差が発生するが,ジャギ消し分含めるとあまり問題ないはず</li> <li>画像サイズが大きくもっと精度良くしたい場合には,『「2,1,...」の周期並べx4,「2,2,...」の均等並べx13, 「2,1,...」の周期並べx4』の周期並べが良さげ. <a class="keyword" href="http://d.hatena.ne.jp/keyword/arctan">arctan</a> 58/100 ≒ 30.1度で+0.1度まで誤差を抑えられる.でもジャギ消しで見え方変わるのでここまでこだわる必要があるかはなんとも言えない.</li> </ul> <p><figure class="figure-image figure-image-fotolife" title="30°の表現2パターン"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20211007/20211007220039.jpg" alt="f:id:cartman0:20211007220039j:plain" width="640" height="640" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>30°の表現2パターン</figcaption></figure></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#ドット絵で30度の斜線を引くには">ドット絵で30度の斜線を引くには</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#ドットの並べ方技法">ドットの並べ方技法</a><ul> <li><a href="#規則並べ">規則並べ</a></li> <li><a href="#周期並べ">周期並べ</a></li> </ul> </li> <li><a href="#計算方法メモ">計算方法メモ</a><ul> <li><a href="#例30の場合">例:30°の場合</a></li> </ul> </li> <li><a href="#丸め誤差を変えて精度を上げると">丸め誤差を変えて精度を上げると</a></li> <li><a href="#30近辺のドット並べ方表">30°近辺のドット並べ方表</a></li> <li><a href="#応用60を描く">応用:60°を描く</a></li> <li><a href="#参考資料">参考資料</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 64bit <ul> <li>edge 1.29b</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="ドットの並べ方技法">ドットの並べ方技法</h2> <p>まず,「ドット絵プロフェッショナルテクニック, <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A8%CF%C2%A5%B7%A5%B9%A5%C6%A5%E0">秀和システム</a>, 2005」 で名づけられいる斜線の並べ方をまとめる.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798010111/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51HDATP7Y8L._SL500_.jpg" class="hatena-asin-detail-image" alt="ドット絵プロフェッショナルテクニック ドット打ちからアニメーションまで (Game developer books)" title="ドット絵プロフェッショナルテクニック ドット打ちからアニメーションまで (Game developer books)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798010111/newm-22/" target="_blank" rel="noopener">ドット絵プロフェッショナルテクニック ドット打ちからアニメーションまで (Game developer books)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B9%E2%CC%EE%20%C8%BB%BF%CD" class="keyword">高野 隼人</a></li><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A8%CF%C2%A5%B7%A5%B9%A5%C6%A5%E0">秀和システム</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798010111/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><section></p> <h3 id="規則並べ">規則並べ</h3> <p>例えば,横に2ドット並べた後に縦に1ドットずらして均等に並べていく技法. 上記の本では「2,2, ...」のように表記されている.</p> <p><figure class="figure-image figure-image-fotolife" title="規則並べ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20211007/20211007201527.png" alt="f:id:cartman0:20211007201527p:plain" width="644" height="651" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>規則並べ</figcaption></figure></p> <p></section></p> <p><section></p> <h3 id="周期並べ">周期並べ</h3> <p>一方で,「2,1,2,1, ...」のように周期的に並べていくのが周期並べになる.</p> <p><figure class="figure-image figure-image-fotolife" title="周期並べ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20211007/20211007201540.png" alt="f:id:cartman0:20211007201540p:plain" width="646" height="644" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>周期並べ</figcaption></figure></p> <p></section></p> <p></section></p> <p><section></p> <h2 id="計算方法メモ">計算方法メモ</h2> <p>上記を踏まえて30°の斜線を引くことを考える.</p> <p>今回は,単純にtanで横縦比を計算する方法でやってみる. 手順としては,</p> <ol> <li>tan(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%C0%DC">正接</a>)で横縦比を計算する.</li> <li>その比から1周期の横ドット総数と縦ドット総数を決める</li> <li>その総数になるような配置方法を決める.</li> </ol> <p>タイル配置問題のようなものなので建築や芸術分野でもっと精密な計算方法もありそう?</p> <p><section></p> <h3 id="例30の場合">例:30°の場合</h3> <p>まず,tan30°を計算する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Ctan%7B%2030%5E%7B%20%5Ccirc%20%7D%20%7D%20%3D%200.57735026919%0A" alt=" \tan{ 30^{ \circ } } = 0.57735026919 "/> </div> <p>この横縦比を丸める.ここの丸め方で精度が決まる. 今回は0.6で丸める.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Ctan%7B%2030%5E%7B%20%5Ccirc%20%7D%20%7D%20%5Cfallingdotseq%20%200.6%0A" alt=" \tan{ 30^{ \circ } } \fallingdotseq 0.6 "/> </div> <p>この比から横ドット数と縦ドット数を決める.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A0.6%20%3D%206%20%2F10%20%3D%203%20%2F%205%0A" alt=" 0.6 = 6 /10 = 3 / 5 "/> </div> <p>ドットを並べた総数が,横5ドット,縦3ドットになればいいことがわかる.</p> <p>ここから並べ方を考える必要があり,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%C5%AA">機械的</a>にやろうとすると配分問題になりちょっとややこしい.</p> <p>まず,1周期に縦3ドット並べる必要があるので横には3種類並べればいい. [?, ?, ?]</p> <p>そして,横に並べた総数が5ドットにすればいい.(?+?+?=5)</p> <p>ここで,5ドットを3種類で割って5÷3 = 1あまり2. 配分として[1, 1, 1] 余り2ドットになる.この余ったドットを配分してやればいい.</p> <p>今回の場合,配分としては主に2パターン</p> <ul> <li>[3, 1, 1]</li> <li>[2, 2, 1]</li> </ul> <p>になるがドット数の変化が緩やかなほうが違和感がないので [2, 2, 1]が望ましい.</p> <p><figure class="figure-image figure-image-fotolife" title="30deg[2,2,1,...]周期並べ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20211007/20211007201258.png" alt="f:id:cartman0:20211007201258p:plain" width="645" height="646" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>30deg[2,2,1,...]周期並べ</figcaption></figure></p> <p>ちなみに,丸めた後の実際の角度を計算するには<a class="keyword" href="http://d.hatena.ne.jp/keyword/arctan">arctan</a>で計算できる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cmathrm%7Barctan%7D%200.6%20%3D%20%5Cmathrm%7Barctan%7D%203%2F5%20%20%3D%200.5404195%20%5Brad" alt=" \mathrm{arctan} 0.6 = \mathrm{arctan} 3/5 = 0.5404195 [rad"/> = 30.96 \fallingdotseq 31^{ \circ } ] </div> <p></section></p> <p></section></p> <p><section></p> <h2 id="丸め誤差を変えて精度を上げると"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%DD%A4%E1%B8%ED%BA%B9">丸め誤差</a>を変えて精度を上げると</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%DD%A4%E1%B8%ED%BA%B9">丸め誤差</a>を変えて同じような計算をする.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Ctan%7B%2030%5E%7B%20%5Ccirc%20%7D%20%7D%20%5Cfallingdotseq%20%200.58%20%5C%5C%5C%5C%0A0.58%20%3D%2058%20%2F100%20%3D%2029%20%2F%2050%0A" alt=" \tan{ 30^{ \circ } } \fallingdotseq 0.58 \\\\ 0.58 = 58 /100 = 29 / 50 "/> </div> <p>横50ドット,縦29ドットを並べればいい. 横の並べ方は29種類になる. [? x 29], sum ? = 50</p> <p>余りドットを考えると,[1 x 29] 余り21ドット.</p> <p>余りドットを含めて,[2 x 21, 1 x 8 ].</p> <p>配置パターンを考える.</p> <ul> <li>[2 x 21, 1 x 8 ]周期並べ</li> <li>[1 x 4, 2 x 21, 1 x 4 ]周期並べ</li> <li>[(2, 1) x 4, 2 x 13, (2, 1) x 4 ]周期並べ</li> </ul> <p>この3パターンを比較してみる.</p> <p><figure class="figure-image figure-image-fotolife" title="3パターンの並べ方"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20211007/20211007201124.png" alt="f:id:cartman0:20211007201124p:plain" width="770" height="452" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>3パターンの並べ方(64x64pxを12倍して切り抜いている)</figcaption></figure></p> <ul> <li>赤: [2 x 21, 1 x 8 ]周期並べ</li> <li>青:[1 x 4, 2 x 21, 1 x 4 ]周期並べ</li> <li>緑:[(2, 1) x 4, 2 x 13, (2, 1) x 4 ]周期並べ</li> </ul> <p>で描画している.</p> <p>スケール等倍も見てみる.</p> <p><figure class="figure-image figure-image-fotolife" title="スケール等倍"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20211007/20211007201143.gif" alt="f:id:cartman0:20211007201143g:plain" width="64" height="64" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>スケール等倍</figcaption></figure></p> <ul> <li>赤[2 x 21, 1 x 8 ]周期並べの場合: 終端で角度が変わるので違和感がある.</li> <li>青[1 x 4, 2 x 21, 1 x 4 ]周期並べの場合:始点と終端が揃うが,途中で角度が変わるのでまだ違和感が残る</li> <li>緑[(2, 1) x 4, 2 x 13, (2, 1) x 4 ]周期並べの場合:始点と終点も周期並べにしてるので青よりも違和感が減る.この3パターンの中で一番違和感がないように見える.</li> </ul> <p>ちなみに,実際の角度を計算すると,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Ctext%7Barctan%7D%200.58%20%5Cfallingdotseq%2030.1%5E%7B%20%5Ccirc%20%7D%20%0A" alt=" \text{arctan} 0.58 \fallingdotseq 30.1^{ \circ } "/> </div> <p>[(2, 1) x 4, 2 x 13, (2, 1) x 4 ]周期並べにすれば+0.1°に抑えられる.ただ,ジャギ消し用ドットを普通配置するので見え方がまた変わってくるが..</p> <p>これを応用すれば基本的にどの角度もいけるはず.</p> <p></section></p> <p><section></p> <h2 id="30近辺のドット並べ方表">30°近辺のドット並べ方表</h2> <p>以上を踏まえて30°近辺の配置方法をまとめてみる.</p> <table> <thead> <tr> <th style="text-align:center;">並べ方</th> <th style="text-align:center;">tan</th> <th style="text-align:center;">角度</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">横2,2,2,...規則並べ </td> <td style="text-align:center;"> 1/2 </td> <td style="text-align:center;"> arctan1/2 = 0.463647609 rad = 26.565°</td> </tr> <tr> <td style="text-align:center;"> - </td> <td style="text-align:center;"> 0.57735026919 </td> <td style="text-align:center;">30° </td> </tr> <tr> <td style="text-align:center;">[(2,1)x4, 2x13, (2,1)x4 ]... 周期並べ</td> <td style="text-align:center;"> 0.58 </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/arctan">arctan</a> 0.58 = 30.1° </td> </tr> <tr> <td style="text-align:center;">横2,2,1, ...周期並べ</td> <td style="text-align:center;"> 3/5=0.6 </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/arctan">arctan</a> 0.6 = 30.983765 °</td> </tr> </tbody> </table> <p></section></p> <p><section></p> <h2 id="応用60を描く">応用:60°を描く</h2> <p>縦軸に沿って[(2,1)x4, 2x13, (2,1)x4 ]... 周期並べを描けば, 内角の和90°より残りは90-30.1 = 59.9°と約60°を描画できる.</p> <p><figure class="figure-image figure-image-fotolife" title="60deg"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20211007/20211007201137.png" alt="f:id:cartman0:20211007201137p:plain" width="790" height="784" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>60deg</figcaption></figure></p> <p></section></p> <p><aside></p> <h2 id="参考資料">参考資料</h2> <ul> <li><p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798010111/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51HDATP7Y8L._SL500_.jpg" class="hatena-asin-detail-image" alt="ドット絵プロフェッショナルテクニック ドット打ちからアニメーションまで (Game developer books)" title="ドット絵プロフェッショナルテクニック ドット打ちからアニメーションまで (Game developer books)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798010111/newm-22/" target="_blank" rel="noopener">ドット絵プロフェッショナルテクニック ドット打ちからアニメーションまで (Game developer books)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%B9%E2%CC%EE%20%C8%BB%BF%CD" class="keyword">高野 隼人</a></li><li>秀和システム</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798010111/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p></li> </ul> <p></aside></p> Thu, 07 Oct 2021 22:03:12 +0900 hatenablog://entry/13574176438020095133 ドット絵 BlenderでMMDのpmxファイルを読み込む https://cartman0.hatenablog.com/entry/2021/09/28/_Blender%E3%81%A7MMD%E3%81%AEpmx%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80?utm_source=feed <h1 id="BlenderでMMDのpmxファイルを読み込む"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/MMD">MMD</a>のpmxファイルを読み込む</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/MMD">MMD</a>のpmxファイルを読み込むには,アドオンの導入が必要なのでその辺のメモ.</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#BlenderでMMDのpmxファイルを読み込む">BlenderでMMDのpmxファイルを読み込む</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#最新版MMDの導入">最新版MMDの導入</a></li> <li><a href="#Blenderのためのpmxファイル読み込み用アドオンmmd_toolsの導入">Blenderのためのpmxファイル読み込み用アドオンmmd_toolsの導入</a></li> <li><a href="#Blenderのアドオンの設定">Blenderのアドオンの設定</a></li> <li><a href="#pmxファイルを開く">pmxファイルを開く</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 64bit <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a> 2.19</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="最新版MMDの導入">最新版<a class="keyword" href="http://d.hatena.ne.jp/keyword/MMD">MMD</a>の導入</h2> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fsites.google.com%2Fview%2Fvpvp%2F" title="Vocaloid Promotion Video Project" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://sites.google.com/view/vpvp/">sites.google.com</a></cite></p> <p>からOSに合ったファイルをDLする.Windows10 64bitの場合は,<a class="keyword" href="http://d.hatena.ne.jp/keyword/MikuMikuDance">MikuMikuDance</a>(64bitOS Ver)をDLする.</p> <p><figure class="figure-image figure-image-fotolife" title="MMDのDL"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232354.png" alt="f:id:cartman0:20210928232354p:plain" width="800" height="465" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/MMD">MMD</a>のDL</figcaption></figure></p> <p>※2021年9月28日時点ではv932が最新</p> <p>DLしたら適当な場所に展開して配置する.</p> <p></section></p> <p><section></p> <h2 id="Blenderのためのpmxファイル読み込み用アドオンmmd_toolsの導入"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a>のためのpmxファイル読み込み用アドオン<a class="keyword" href="http://d.hatena.ne.jp/keyword/mmd">mmd</a>_toolsの導入</h2> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fpowroupi%2Fblender_mmd_tools" title="GitHub - powroupi/blender_mmd_tools: mmd_tools is a blender addon for importing Models and Motions of MikuMikuDance." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/powroupi/blender_mmd_tools">github.com</a></cite></p> <p>のReleaseから最新版<a class="keyword" href="http://d.hatena.ne.jp/keyword/mmd">mmd</a>_toolsをDLする.こちらの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>は現在でもテストされている.</p> <p>※2021年9月28日時点ではv0.7.1が最新</p> <p><figure class="figure-image figure-image-fotolife" title="mmd_toolsのDL"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232428.png" alt="f:id:cartman0:20210928232428p:plain" width="516" height="384" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/mmd">mmd</a>_toolsのDL</figcaption></figure></p> <p>DLしたら適当な場所で展開して中身の<code>mmd_tools</code>フォルダを, インストールした<a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a>のアドオン用フォルダ(例:<code>C:\Program Files\Blender Foundation\Blender 2.91\2.91\scripts\addons</code>)の中に置く.</p> <p></section></p> <p><section></p> <h2 id="Blenderのアドオンの設定"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a>のアドオンの設定</h2> <p>ファイルを配置しただけでは有効にならないので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a>内でも設定する.</p> <ol> <li> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Blender">Blender</a>を開いて左上メニューから,Edit > Preferences を開く. </li> <li> Add-ons を選択.Commnunityタブに切り替え,検索ボックスに<a class="keyword" href="http://d.hatena.ne.jp/keyword/mmd">mmd</a>_toolsを入力して検索して`Object: <a class="keyword" href="http://d.hatena.ne.jp/keyword/mmd">mmd</a>_tools`にチェックする. <figure class="figure-image figure-image-fotolife" title="mmd_toolsを有効にする"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232417.png" alt="f:id:cartman0:20210928232417p:plain" width="800" height="290" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/mmd">mmd</a>_toolsを有効にする</figcaption></figure> </li> <li> `Object: <a class="keyword" href="http://d.hatena.ne.jp/keyword/mmd">mmd</a>_tools`を展開して,Shared Toon TextureFolderの設定をする.<a class="keyword" href="http://d.hatena.ne.jp/keyword/MikuMikuDance">MikuMikuDance</a>のDataフォルダを設定する.ex. `C:\<a class="keyword" href="http://d.hatena.ne.jp/keyword/MikuMikuDance">MikuMikuDance</a>_v932x64\Data` <figure class="figure-image figure-image-fotolife" title="Shared Toon TextureFolderの設定"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232350.png" alt="f:id:cartman0:20210928232350p:plain" width="800" height="323" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Shared Toon TextureFolderの設定</figcaption></figure> </li> </ol> <p></section></p> <p><section></p> <h2 id="pmxファイルを開く">pmxファイルを開く</h2> <ol> <li> ショートカットNキーでメニューを展開して,<a class="keyword" href="http://d.hatena.ne.jp/keyword/MMD">MMD</a>タブを開く. <figure class="figure-image figure-image-fotolife" title="MMDタブを開く"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232424.png" alt="f:id:cartman0:20210928232424p:plain" width="283" height="440" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/MMD">MMD</a>タブを開く</figcaption></figure> </li> <li> Model > Import から開ける. <figure class="figure-image figure-image-fotolife" title="Importを選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232421.png" alt="f:id:cartman0:20210928232421p:plain" width="273" height="443" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Importを選択</figcaption></figure> </li> <li> 開きたいファイルを選ぶ.右側に開く時のオプションがある. <figure class="figure-image figure-image-fotolife" title="pmxファイルの選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232414.png" alt="f:id:cartman0:20210928232414p:plain" width="773" height="559" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>pmxファイルの選択</figcaption></figure> </li> </ol> <p>View か Modelingタブでテクスチャなしのままの描画になる.</p> <p><figure class="figure-image figure-image-fotolife" title="テクスチャなしの描画"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232400.png" alt="f:id:cartman0:20210928232400p:plain" width="800" height="535" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>テクスチャなしの描画</figcaption></figure></p> <p>Texture Paintタブでテクスチャ付きで見描画される.</p> <p><figure class="figure-image figure-image-fotolife" title="テクスチャありの描画"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210928/20210928232408.png" alt="f:id:cartman0:20210928232408p:plain" width="800" height="748" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>テクスチャありの描画</figcaption></figure></p> <p>pmxファイルは,<a href="https://www.deviantart.com/abyssleo/art/MMD-Walther-WA2000-for-DL-617172411">[MMD] Walther WA2000 for DL by AbyssLeo on DeviantArt</a> のものを使用した.</p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fshinshimmder.memo.wiki%2Fd%2F%25a1%25daBlender2.9%25a1%25db%2520mmd_tools%2520%25a1%25daAddon%25a1%25db" title="【Blender2.9】 mmd_tools 【Addon】 - とある紳士MMDerの3DCG関連wiki" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://shinshimmder.memo.wiki/d/%a1%daBlender2.9%a1%db%20mmd_tools%20%a1%daAddon%a1%db">shinshimmder.memo.wiki</a></cite></p></li> </ul> <p></aside></p> Tue, 28 Sep 2021 23:47:26 +0900 hatenablog://entry/13574176438016853121 Blender MMD プチブロックで学ぶプーリー・ベルト機構 https://cartman0.hatenablog.com/entry/2021/07/19/%E3%83%97%E3%83%81%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%97%E3%83%BC%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%99%E3%83%AB%E3%83%88%E6%A9%9F%E6%A7%8B?utm_source=feed <h1 id="プチブロックで学ぶプーリーベルト機構">プチブロックで学ぶプーリー・ベルト機構</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%BD%A1%BC">ダイソー</a>100均のプチブロックの車輪パーツを見てたらプリー・ベルト機構を作れそうだなということで作ってみたメモ.</p> <p>とりあえず車輪4つとベルト用の輪ゴムあれば,以下のような簡易なものは作れる. ただし,駆動輪側は手動なので教育用な感じ.</p> <p><figure class="figure-image figure-image-fotolife" title="プーリー・ベルト機構"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719150432.gif" alt="&#x30D7;&#x30FC;&#x30EA;&#x30FC;&#x30FB;&#x30D9;&#x30EB;&#x30C8;&#x30A2;&#x30CB;&#x30E1;" width="352" height="240" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>プーリー・ベルト機構</figcaption></figure></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#プチブロックで学ぶプーリーベルト機構">プチブロックで学ぶプーリー・ベルト機構</a><ul> <li><a href="#プーリーベルト機構とは">プーリー・ベルト機構とは</a></li> <li><a href="#必要なもの">必要なもの</a></li> <li><a href="#シンプルなプーリーベルト機構を作る">シンプルなプーリー・ベルト機構を作る</a></li> <li><a href="#従動輪を逆回転させる">従動輪を逆回転させる</a></li> <li><a href="#プーリーの大きさを変えてみる">プーリーの大きさを変えてみる</a></li> <li><a href="#感想メモ">感想・メモ</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="プーリーベルト機構とは">プーリー・ベルト機構とは</h2> <p>ロボジョ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%AF%A5%E9">イクラ</a>ブの記事が詳しい.</p> <p><a href="http://www.robojoy-club.com/challenge/challenge_c10_2_01.php?p=3&loc=cc10_2_01">http://www.robojoy-club.com/challenge/challenge_c10_2_01.php?p=3&loc=cc10_2_01</a></p> <p>モーターなどと介して回っている駆動輪側プーリーの回転をベルトを介して従動輪側プーリーに伝達させて従動輪側プーリーを回すという機構である.</p> <p>必要なものは3要素.</p> <ul> <li>駆動輪側プーリー</li> <li>ベルト</li> <li>従動輪側プーリー</li> </ul> <p>主な役割は3つ.</p> <ul> <li>駆動輪側プーリーから従動輪側プーリーへの離れた位置への回転の伝達</li> <li>ベルトをたすき掛け(クロス)することで逆回転させる</li> <li>プーリーの大きさを変えることで回転数を変化させる(自転車のギア変速と同じ) <ul> <li>従動輪側プーリーを大きくすれば,駆動輪に対して回転数が下がる=ペダルに対して後輪が余り回らない=自転車が余り進まない=自転車のギアを1にしてペダル負荷を軽くしてる状態.</li> <li>従動輪側プーリーを小さくすれば,駆動輪に対して回転数が上がる=ペダルに対して後輪がより回る=自転車がより進む=自転車のギアを6にしてペダル負荷を重くしてる状態.</li> </ul> </li> </ul> <p>代表例は自転車である.</p> <ul> <li>駆動輪側プーリー:ペダル側のギア</li> <li>従動輪側プーリー:後輪側のギア</li> <li>ベルト:チェーン</li> </ul> <p>ペダル側ギアが回転することでチェーン(ベルト)を介して後輪側ギアが回る.</p> <p>歯車との違い: 歯車の場合は対になる歯車は常に逆回転になるが,プーリー・ベルトの場合はベルトのかけ方を変えなければベルトの動きに合わせてプーリーが回るので駆動と従動プーリーは同じ回転になる.歯車と比べて回転方向の考え方はシンプルになる.</p> <p></section></p> <p><section></p> <h2 id="必要なもの">必要なもの</h2> <ul> <li> 車輪を含むキット:今回は救急車キットを使う. <figure class="figure-image figure-image-fotolife" title="プチブロック:救急車キット"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719143517.jpg" alt="" width="477" height="532" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>プチブロック:救急車キット</figcaption></figure> </li> <li> ベルト用の輪ゴム:太くて短めのほうがいい.(ゴムが伸びると細くなり,細いとねじれやすくなるため.また,長いとそれに応じて必要なブロックが増えるため.) <ul><li>輪ゴムの代替:適当な紙を長細く切って両端をテープで止めたものも使えるかもしれない.ただし,プーリーとベルト間の摩擦がないとベルトだけ回る空転状態になってしまうので注意.</li></ul></li> </ul> <p></section></p> <p><section></p> <h2 id="シンプルなプーリーベルト機構を作る">シンプルなプーリー・ベルト機構を作る</h2> <p>1.ポイントは,車輪パーツ2つを向かい合わせて疑似プーリーを1つ作ることである.</p> <p><figure class="figure-image figure-image-fotolife" title="疑似プーリー"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719144911.jpg" alt="" width="210" height="430" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>疑似プーリー</figcaption></figure></p> <p>これにより車輪パーツから輪ゴムの脱輪を防いでいる.ただし,2つ車輪パーツの隙間から抜ける場合があるので輪ゴムは太いほうがいい.</p> <p>あとは,この疑似プーリー上で輪ゴムのベルトが回るように台を作ればいい. 台の高さはゴムの太さにもよるが,疑似プーリーの間を3層くらいにするとちょうどいい.</p> <p>必要パーツは,</p> <ul> <li>車輪2つ</li> <li>高さ調節用2x3か2x4パーツ6つ</li> <li>土台用2x8パーツ</li> </ul> <p><figure class="figure-image figure-image-fotolife" title="プーリー+台"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719144303.jpg" alt="" width="426" height="208" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>プーリー+台</figcaption></figure></p> <p>これを駆動輪側と従動輪側の2つ作ればいい.</p> <p><figure class="figure-image figure-image-fotolife" title="左:駆動輪側プーリー 右:従動輪側プーリー"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719161910.jpg" alt="f:id:cartman0:20210719161910j:plain" width="483" height="128" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>左:駆動輪側プーリー 右:従動輪側プーリー</figcaption></figure></p> <p>2.疑似プーリーを2つ用意したら2つの距離調整する台を用意する.</p> <p>必要パーツ: - 今回は2x8を3つ組み合わせて作った.</p> <p><figure class="figure-image figure-image-fotolife" title="土台"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719145125.jpg" alt="f:id:cartman0:20210719145125j:plain" width="450" height="109" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>土台</figcaption></figure></p> <p>3.土台に疑似プーリーを設置する</p> <p><figure class="figure-image figure-image-fotolife" title="土台に疑似プーリーを設置"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719163943.jpg" alt="f:id:cartman0:20210719163943j:plain" width="396" height="259" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>土台に疑似プーリーを設置</figcaption></figure></p> <p>4.疑似プーリーにベルト用輪ゴムを通す.このときに輪ゴムがいい感じになるようにプーリーの位置を変える.</p> <p><figure class="figure-image figure-image-fotolife" title="シンプルなプーリー・ベルト機構"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719150037.jpg" alt="f:id:cartman0:20210719150037j:plain" width="441" height="240" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>シンプルなプーリー・ベルト機構</figcaption></figure></p> <p>実際に回してみる.左側を駆動輪として回すと右側の従動輪も回る.</p> <p><figure class="figure-image figure-image-fotolife" title="プーリー・ベルト機構・動画"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719150432.gif" alt="&#x30D7;&#x30FC;&#x30EA;&#x30FC;&#x30FB;&#x30D9;&#x30EB;&#x30C8;&#x30A2;&#x30CB;&#x30E1;" width="352" height="240" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>プーリー・ベルト機構(動画)</figcaption></figure></p> <p>※従動輪側の回転がわかるようにセロテープを貼っている </section></p> <p><section></p> <h2 id="従動輪を逆回転させる">従動輪を逆回転させる</h2> <p>下図のように,ベルト(輪ゴム)をたすき掛けさせること駆動輪に対して従動輪を逆回転させることができる.</p> <p><figure class="figure-image figure-image-fotolife" title="駆動輪に対して逆回転"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719152259.gif" alt="f:id:cartman0:20210719152259g:plain" width="352" height="240" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>駆動輪に対して逆回転</figcaption></figure></p> <p></section></p> <p><section></p> <h2 id="プーリーの大きさを変えてみる">プーリーの大きさを変えてみる</h2> <p>プーリーの大きさを変えて回転数がどう変わるか確認する. しかし,プチブロックの車輪パーツは今まで使ってたもの1種類しかないので,別のものを用意するか自作するしかない.</p> <p>今回はブロックを使ってプーリーになるような歯車を作る.</p> <p>必要パーツ:</p> <ul> <li>2x2 L字 3個(救急車キットにはないので他から持ってくる)</li> <li>1x2 4個</li> <li>1x1 5個</li> </ul> <p>最上段の1x1パーツを軸の代わりとして回転させる.</p> <p><figure class="figure-image figure-image-fotolife" title="プーリー大"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719152512.jpg" alt="f:id:cartman0:20210719152512j:plain" width="682" height="209" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>プーリー大</figcaption></figure></p> <p>このプーリーを取り付けるための軸+台を作る.</p> <ul> <li>ボールジョイント凹凸 x2</li> <li>2x3パーツ 2個</li> <li>2x4パーツ 2個</li> <li>1x1: プーリーの裏抑え用</li> <li>2x2 L字: プーリーの表抑え用</li> </ul> <p><figure class="figure-image figure-image-fotolife" title="プーリー大+台"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719152525.jpg" alt="f:id:cartman0:20210719152525j:plain" width="800" height="592" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>プーリー大+台</figcaption></figure></p> <p>これを先程のプーリー・ベルトに取り付け,ベルト用輪ゴムをつければいい.</p> <p><figure class="figure-image figure-image-fotolife" title="駆動輪大・プーリー・ベルト"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719144907.jpg" alt="f:id:cartman0:20210719144907j:plain" width="664" height="288" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>駆動輪大・プーリー・ベルト</figcaption></figure></p> <p>ただし,この歯車型プーリーを従動輪側で回転させようとしても円形じゃないためうまく回らない. そのため,今回は駆動輪側として回して車輪パーツのほうを従動輪側とする.</p> <p>実際に回すと,従動輪側が小さいので回転数が高くなるという自転車のギアを重くした状態になる.</p> <p><figure class="figure-image figure-image-fotolife" title="駆動輪大・プーリー・ベルト動画"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210719/20210719152806.gif" alt="f:id:cartman0:20210719152806g:plain" width="352" height="240" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>駆動輪大・プーリー・ベルト(動画)</figcaption></figure></p> <p></section></p> <p><section></p> <h2 id="感想メモ">感想・メモ</h2> <ul> <li> ベルト用ゴムが太くないと車輪の間に挟まってしまって難しい</li> <li>大きいプーリーや小さいプーリーを用意するのが難しい.プーリー・ベルト機構の本格的なキットだと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%DF%A5%E4">タミヤ</a>のキットあたりがある. <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001VZP8RI/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/410Q9ESvZHL._SL500_.jpg" class="hatena-asin-detail-image" alt="タミヤ 楽しい工作シリーズ No.121 プーリーユニットセット (70121)" title="タミヤ 楽しい工作シリーズ No.121 プーリーユニットセット (70121)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001VZP8RI/newm-22/" target="_blank" rel="noopener">タミヤ 楽しい工作シリーズ No.121 プーリーユニットセット (70121)</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%DF%A5%E4">タミヤ</a>(TAMIYA)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001VZP8RI/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> </li> </ul> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="http://www.robojoy-club.com/challenge/challenge_c10_2_01.php?p=3&loc=cc10_2_01">http://www.robojoy-club.com/challenge/challenge_c10_2_01.php?p=3&loc=cc10_2_01</a></p></li> </ul> <p></aside></p> Mon, 19 Jul 2021 22:49:41 +0900 hatenablog://entry/26006613788411412 ブロック 2010-2020年くらいのプラモ界隈の流れをざっくりまとめたい https://cartman0.hatenablog.com/entry/2021/07/06/2010-2020%E5%B9%B4%E3%81%8F%E3%82%89%E3%81%84%E3%81%AE%E3%83%97%E3%83%A9%E3%83%A2%E7%95%8C%E9%9A%88%E3%81%AE%E6%B5%81%E3%82%8C%E3%82%92%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%BE%E3%81%A8%E3%82%81?utm_source=feed <h1 id="2010-2020年くらいのプラモ界隈の流れをざっくりまとめたい">2010-2020年くらいのプラモ界隈の流れをざっくりまとめたい</h1> <p>最近,自分の中の小学生男子心が疼きプラモ熱が高まり,調べてみたところ昔比べてかなり結構進化してるなと思ったのでいろいろまとめたい.</p> <p>今のプラモ界隈の流れとしてポイントは6つ+αほどある.</p> <ul> <li>骨組みフレーム+外付けアーマー形式により可動箇所が増えた</li> <li>フィギュアスケールプラモ(美少女フィギュア形含む)が普及して当たり前になった</li> <li>共通規格(3mm軸ジョイント,キットブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%C3%A5%AF%B7%CF">ロック系</a>)ができはじめてきた</li> <li>価格安めが増えてきた(特に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>)</li> <li>低年齢狙いの商品が増えてきた</li> <li>環境問題対策(特に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>)</li> <li>(+α)100円ショップで便利な道具が安く手に入るようになった</li> </ul> <p><figure> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210705/20210705200415.png" alt="f:id:cartman0:20210705200415p:plain" width="640" height="220" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> </figure></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#2010-2020年くらいのプラモ界隈の流れをざっくりまとめたい">2010-2020年くらいのプラモ界隈の流れをざっくりまとめたい</a><ul> <li><a href="#プラモ年表">プラモ年表</a></li> <li><a href="#そもそもプラモのプラスチック素材とは何なのか">そもそもプラモのプラスチック素材とは何なのか</a><ul> <li><a href="#PSポリスチレン-Poly-Styrene">PS(ポリスチレン, Poly-Styrene)</a></li> <li><a href="#ABSアクリロニトリルブタジエンスチレン">ABS(アクリロニトリル・ブタジエン・スチレン)</a></li> <li><a href="#PEポリエチレン-Poly-Ethene">PE(ポリエチレン, Poly-Ethene)</a></li> <li><a href="#POMポリアセタール">POM(ポリアセタール)</a></li> <li><a href="#KPS強化PS">KPS(強化PS)</a></li> <li><a href="#LIMEXライメックス">LIMEX(ライメックス)</a></li> </ul> </li> <li><a href="#骨組みフレーム外付けアーマー形式の登場">骨組みフレーム+外付けアーマー形式の登場</a><ul> <li><a href="#関節ヘタリ問題">関節ヘタリ問題</a></li> </ul> </li> <li><a href="#美少女プラモの誕生普及">美少女プラモの誕生・普及</a></li> <li><a href="#ミキシングしやすい3mm軸共通ジョイントの普及">ミキシングしやすい3mm軸共通ジョイントの普及</a><ul> <li><a href="#軸ジョイントの種類">軸・ジョイントの種類</a></li> </ul> </li> <li><a href="#低年齢向けプラモの増加">低年齢向けプラモの増加</a></li> <li><a href="#環境問題対策">環境問題対策</a></li> <li><a href="#100円ショップで使える道具たち">100円ショップで使える道具たち</a><ul> <li><a href="#まだ避けておいたほうがいいもの">まだ避けておいたほうがいいもの</a></li> </ul> </li> <li><a href="#今から始める復帰する人におすすめのシリーズ">今から始める・復帰する人におすすめのシリーズ</a><ul> <li><a href="#30MMシリーズ">30MMシリーズ</a></li> <li><a href="#30MMシスターズシリーズ">30MMシスターズシリーズ</a></li> <li><a href="#アニマギアシリーズ">アニマギアシリーズ</a></li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="プラモ年表">プラモ年表</h2> <p>まず昨今における(有名所の)メーカーがどのブランドを立ち上げてどの年齢層をターゲットにしているか+イベントをまとめる.</p> <p>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%CB%BB%CD%B6%EE">ミニ四駆</a>や戦闘機・戦車の乗り物系プラモについてはわからないので省略)</p> <table> <thead> <tr> <th style="text-align:center;">年</th> <th style="text-align:center;">ブランド・商品</th> <th style="text-align:center;">メーカー</th> <th style="text-align:center;">対象年齢</th> <th style="text-align:center;">価格</th> <th style="text-align:center;">サイズ</th> <th style="text-align:center;">備考</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">2009年10月</td> <td style="text-align:center;"><a href="https://www.kotobukiya.co.jp/product-series/framearms/">FA(フレームアームズ)</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a></td> <td style="text-align:center;">15歳以上</td> <td style="text-align:center;">1400-10000円</td> <td style="text-align:center;">1/100(14cm)</td> <td style="text-align:center;">フレームアーキテクト(素体)をベースに外付けアーマータイプのプラモ</td> </tr> <tr> <td style="text-align:center;">2010年2月</td> <td style="text-align:center;"><a href="https://www.volks.co.jp/jp/vlockers/">ブロッカーズ</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A1%BC%A5%AF%A5%B9">ボークス</a></td> <td style="text-align:center;">15歳以上</td> <td style="text-align:center;">1400-10000円</td> <td style="text-align:center;">1/20</td> <td style="text-align:center;">4mmジョイント採用のキットブロック</td> </tr> <tr> <td style="text-align:center;">2010年7月</td> <td style="text-align:center;"><a href="https://bandai-hobby.net/brand/rg/">RG(リアルグレード)</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">15歳以上</td> <td style="text-align:center;">約3000円</td> <td style="text-align:center;">1/144</td> <td style="text-align:center;">インナーフレーム『アドバンスドMSジョイント』+外付けアーマータイプの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>登場</td> </tr> <tr> <td style="text-align:center;">2012年8月</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>が新素材KPS(強化ポリスチレン)を採用した<a href="https://bandai-hobby.net/item/3221/">プラモ</a>を出す</td> </tr> <tr> <td style="text-align:center;">2013年10月</td> <td style="text-align:center;">HGBCシリーズ</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">8歳以上</td> <td style="text-align:center;">500円</td> <td style="text-align:center;">1/144</td> <td style="text-align:center;">ビルドシリーズ系<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>と組み合わせできるオプションパーツが出始めた</td> </tr> <tr> <td style="text-align:center;">2015年5月</td> <td style="text-align:center;"><a href="https://www.kotobukiya.co.jp/product-title/framearmsgirl/">FAガール(FAG)</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a></td> <td style="text-align:center;">15歳以上</td> <td style="text-align:center;">5000円弱</td> <td style="text-align:center;">15cm</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%A2%A1%BC%A5%E0%A5%BA">フレームアームズ</a>の美少女版</td> </tr> <tr> <td style="text-align:center;">2015年11月</td> <td style="text-align:center;"><a href="https://bandai-hobby.net/item/1398/">HGBF すーぱーふみな</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">8才以上</td> <td style="text-align:center;">2000円弱</td> <td style="text-align:center;">1/144</td> <td style="text-align:center;">美少女フィギュア形プラモの元祖とよくいわれる</td> </tr> <tr> <td style="text-align:center;">2016年</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;"><a href="https://thewonder.it/bukatsu/gundam/">バンダイ運営のWONDER!SCHOOLガンダム部</a>やよしもと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>部など<a class="keyword" href="http://d.hatena.ne.jp/keyword/Youtube">Youtube</a>でプラモ製作動画が増え始める</td> </tr> <tr> <td style="text-align:center;">2016年6月</td> <td style="text-align:center;"><a href="https://www.bandai.co.jp/candy/brand/smp/index.html">スーパーミニプラ</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">15才以上</td> <td style="text-align:center;">850-10000円前後</td> <td style="text-align:center;">25cm</td> <td style="text-align:center;">ミニプラのおっさん向け版.一応<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a></td> </tr> <tr> <td style="text-align:center;">2016年7月</td> <td style="text-align:center;"><a href="https://bandai-hobby.net/brand/figurerise-standard/">Figure-rise Standard</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">15歳以上</td> <td style="text-align:center;">2000-5000円弱</td> <td style="text-align:center;">1/12(15cm前後)</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E9%A5%B4%A5%F3%A5%DC%A1%BC%A5%EB">ドラゴンボール</a>,ライダーのフィギュアスケールのプラモが出始める</td> </tr> <tr> <td style="text-align:center;">2016年12月</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>SPIRITS公式がhatenaで<a href="https://bandaihobby.hatenablog.com/">開発ブログ</a>を創設</td> </tr> <tr> <td style="text-align:center;">2016年12月</td> <td style="text-align:center;"><a href="https://www.megamidevice.com/">メガミデバイス</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a></td> <td style="text-align:center;">15歳以上</td> <td style="text-align:center;">約5000円</td> <td style="text-align:center;">1/1(14cm)</td> <td style="text-align:center;">FAGとは別の美少女フィギュア形プラモの新ブランド</td> </tr> <tr> <td style="text-align:center;">2017年7月</td> <td style="text-align:center;"><a href="https://www.volks.co.jp/jp/vlockers/fiore01.html">ブロッカーズFIORE</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A1%BC%A5%AF%A5%B9">ボークス</a></td> <td style="text-align:center;">15才以上</td> <td style="text-align:center;">3700-7000円</td> <td style="text-align:center;">ノンスケール(全高:約18cm)</td> <td style="text-align:center;">ブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%C3%A5%AB%A1%BC%A5%BA">ロッカーズ</a>の美少女プラモ版</td> </tr> <tr> <td style="text-align:center;">2017年8月</td> <td style="text-align:center;"><a href="https://www.kotobukiya.co.jp/product-title/hexa-gear/">ヘキサギア</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a></td> <td style="text-align:center;">15才以上</td> <td style="text-align:center;">2800円-7000円</td> <td style="text-align:center;">1/24</td> <td style="text-align:center;">3mm六角ジョイント共通規格のブロックキット,価格高め</td> </tr> <tr> <td style="text-align:center;">2018年2月</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%C6%B0%C0%EF%BB%CE%A5%AC%A5%F3%A5%C0%A5%E0">機動戦士ガンダム</a> Gフレーム</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">15才以上</td> <td style="text-align:center;">合わせて1000円</td> <td style="text-align:center;">11cm</td> <td style="text-align:center;">アーマー・固定フレームと可動フレームが別売りになってる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a></td> </tr> <tr> <td style="text-align:center;">2018年6月</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BE%A5%A4%A5%C9">ゾイド</a>ワイルドシリーズ</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%AB%A5%E9%A5%C8%A5%DF%A1%BC">タカラトミー</a></td> <td style="text-align:center;">6才以上</td> <td style="text-align:center;">3000円-4000円</td> <td style="text-align:center;">高さ20cm</td> <td style="text-align:center;">発掘・復元の設定からパーツからランナー排除に成功</td> </tr> <tr> <td style="text-align:center;">2018年6月</td> <td style="text-align:center;"><a href="https://bandai-hobby.net/brand/sdcs">SDガンダムクロスシルエット</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">8才以上</td> <td style="text-align:center;">800-3000円弱</td> <td style="text-align:center;">2種類フレーム+外装アーマータイプの<a class="keyword" href="http://d.hatena.ne.jp/keyword/SD%A5%AC%A5%F3%A5%C0%A5%E0">SDガンダム</a>シリーズの新作</td> <td></td> </tr> <tr> <td style="text-align:center;">2019年6月</td> <td style="text-align:center;"><a href="https://bandai-hobby.net/site/30minutes_missions/">30MM</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">8才以上</td> <td style="text-align:center;">1500円</td> <td style="text-align:center;">1/144より1回り小さい</td> <td style="text-align:center;">量産機コンセプトの3mmジョイント共通規格ブロックキット系プラモ</td> </tr> <tr> <td style="text-align:center;">2019年8月</td> <td style="text-align:center;"><a href="https://www.bandai.co.jp/candy/animagear/">アニマギア</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">8歳以上</td> <td style="text-align:center;">429円</td> <td style="text-align:center;">10cm弱</td> <td style="text-align:center;">3mm六角ジョイントを備えたフレーム+アーマータイプの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a>.超安い</td> </tr> <tr> <td style="text-align:center;">2020年4月頃</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;"><a href="https://www.mbs.jp/mint/news/2021/03/11/082734.shtml">コロナ禍の巣ごもり需要でプラモが売れ始める</a></td> </tr> <tr> <td style="text-align:center;">2021年3月</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;">-</td> <td style="text-align:center;"><a href="https://www.bandaispirits.co.jp/hobbycenter/recycleproject.html">バンダイがガンプラリサイクルプロジェクト(バンダイ製ランナー回収)を開始</a></td> </tr> <tr> <td style="text-align:center;">2021年8月</td> <td style="text-align:center;"><a href="https://bandai-hobby.net/site/30minutes_sisters/">30MMシスターズ</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">15才以上</td> <td style="text-align:center;">2500円</td> <td style="text-align:center;">1/144</td> <td style="text-align:center;">30MMの規格をもった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>版FAG,安い</td> </tr> <tr> <td style="text-align:center;">2021年8月</td> <td style="text-align:center;"><a href="https://www.bandai.co.jp/candy/animagear/items/de01/">アニマギアDE</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">8才以上</td> <td style="text-align:center;">451円</td> <td style="text-align:center;">10cm弱</td> <td style="text-align:center;">アニマギア改良版</td> </tr> <tr> <td style="text-align:center;">2021年9月</td> <td style="text-align:center;">恐竜骨格プラモデル</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a></td> <td style="text-align:center;">15才以上</td> <td style="text-align:center;">1540円</td> <td style="text-align:center;">20cm前後</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>が新素材<a href="https://bandai-hobby.net/site/limexdinosaur/">LIMEX(ライメックス)製プラモ</a>を発売予定</td> </tr> <tr> <td style="text-align:center;">2021年12月</td> <td style="text-align:center;"><a href="https://www.kotobukiya.co.jp/evoroids/">エヴォロイド</a></td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a></td> <td style="text-align:center;">8才以上</td> <td style="text-align:center;">3000円弱</td> <td style="text-align:center;">87mm</td> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a>初の子供向けプラモ</td> </tr> </tbody> </table> <p>さらに技術変遷がどう変化しているかざっくりまとめる.</p> <ul> <li>2009-2010年:フレーム+アーマータイプの可動が多いプラモ登場</li> <li>2013年:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%C0%A5%E0">ガンダム</a>ビルドシリーズにより<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>でも共<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C4%CC%B2%BD">通化</a>の流れができ始める</li> <li>2015年:美少女フィギュア形プラモ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%FA%C3%C2">爆誕</a></li> <li>2016年:美少女フィギュア形プラモの流れからフィギュアスケールプラモに派生</li> <li>2017年:3mmジョイントを共通規格とするブロックキットが出始める</li> <li>2018年:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a>にもフレーム+アーマータイプ登場.低年齢向け商品(ニッパーを必要としない)も増え始める</li> <li>2019年:ブロックキット(30MMシリーズ),フレーム+アーマータイプの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a>(アニマギア)に低価格商品が出始める</li> <li>2021年:美少女プラモ(30MMS)の低価格化,環境問題対策として新素材の模索</li> </ul> <p></section></p> <p><section></p> <h2 id="そもそもプラモのプラスチック素材とは何なのか">そもそもプラモのプラスチック素材とは何なのか</h2> <p>ごみの分別ではプラスチックと呼ばれるが,学術的・工学的名称ではプラスチック=<strong>合成樹脂(synthetic resin)</strong>になる.手芸・雑貨に置いてあるレジンや<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>のフィラメントと同じである.ただし,細かい成分配合は企業によって異なる.</p> <p>合成樹脂にも種類があるのでプラモによく使われる種類をまとめてみる.</p> <p><section></p> <h3 id="PSポリスチレン-Poly-Styrene">PS(ポリスチレン, Poly-Styrene)</h3> <p><a href="https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%82%B9%E3%83%81%E3%83%AC%E3%83%B3">&#x30DD;&#x30EA;&#x30B9;&#x30C1;&#x30EC;&#x30F3; - Wikipedia</a></p> <p>プラモの基本ベースに使われてる.</p> <ul> <li>安価</li> <li>加工しやすい</li> <li>接着しやすい</li> <li>染色しやすい上に塗装もしやすい</li> <li>硬いがゆえに衝撃に弱く割れやすい,傷つきやすい</li> </ul> <p></section></p> <p><section></p> <h3 id="ABSアクリロニトリルブタジエンスチレン">ABS(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%EA%A5%ED%A5%CB%A5%C8%A5%EA%A5%EB">アクリロニトリル</a>・ブタジエン・スチレン)</h3> <p><a href="https://ja.wikipedia.org/wiki/ABS%E6%A8%B9%E8%84%82">ABS&#x6A39;&#x8102; - Wikipedia</a></p> <ul> <li>ポリブタジエンが合成ゴムなので弾力性を追加したPSに近い素材</li> <li>弾力性により,PSに比べて割れにくい(丈夫).</li> <li>曲げに強いが,白化を起こしやすい</li> <li>PSよりは塗装しにくい</li> </ul> <p>参考: - <a href="https://spsj.or.jp/mirai/2019/06/07/%E3%83%97%E3%83%A9%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AB%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E3%83%97%E3%83%A9%E3%82%B9%E3%83%81%E3%83%83%E3%82%AF/">&#x30D7;&#x30E9;&#x30E2;&#x30C7;&#x30EB;&#x306B;&#x4F7F;&#x308F;&#x308C;&#x308B;&#x30D7;&#x30E9;&#x30B9;&#x30C1;&#x30C3;&#x30AF; &ndash; &#x9AD8;&#x5206;&#x5B50;&#x672A;&#x6765;&#x587E;&reg;</a></p> <p>丈夫なため,プラモではフレーム(関節をつなぐリンク)あたりに使われてる.</p> <p></section></p> <p><section></p> <h3 id="PEポリエチレン-Poly-Ethene">PE(ポリエチレン, Poly-Ethene)</h3> <p><a href="https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%82%A8%E3%83%81%E3%83%AC%E3%83%B3">&#x30DD;&#x30EA;&#x30A8;&#x30C1;&#x30EC;&#x30F3; - Wikipedia</a></p> <p>プラモでは通称,ポリキャップ.</p> <p>丸型ジョイントなど関節によく使われている. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>ではPC-数字のようなパーツ.</p> <ul> <li>柔らかいがゆえに耐久性に優れる</li> <li>柔らかいために精密なエッジが出せない</li> <li>接着が使えない</li> <li>塗装できない</li> </ul> <p></section></p> <p><section></p> <h3 id="POMポリアセタール">POM(ポリアセタール)</h3> <p>商標ではジュラコンとも呼ばれる.</p> <p><a href="https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%82%A2%E3%82%BB%E3%82%BF%E3%83%BC%E3%83%AB">&#x30DD;&#x30EA;&#x30A2;&#x30BB;&#x30BF;&#x30FC;&#x30EB; - Wikipedia</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a>のプラモやアクションフィギュアのジョイント,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%CB%BB%CD%B6%EE">ミニ四駆</a>ではベアリングに使われている素材.</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%C5%AA">機械的</a>特性に優れるエンジニアリング・プラスチック(通称:エンプラ)の1つ</li> <li>エンプラの中では安価</li> <li>接着できない</li> </ul> <p>参考:</p> <ul> <li><a href="https://i-maker.jp/blog/polyacetal-8492.html">&#x30DD;&#x30EA;&#x30A2;&#x30BB;&#x30BF;&#x30FC;&#x30EB;&#xFF08;POM&#xFF09;&#x306E;&#x7279;&#x6027;&#x3068;&#x7528;&#x9014; &#x9AD8;&#x3044;&#x8010;&#x78E8;&#x8017;&#x6027;&#x3092;&#x6D3B;&#x304B;&#x3057;&#x305F;&#x30A8;&#x30F3;&#x30D7;&#x30E9;</a></li> </ul> <p></section></p> <p><section></p> <h3 id="KPS強化PS">KPS(強化PS)</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>が開発した新素材.PSの強度をABS並にしたPS.</p> <p>参考:</p> <ul> <li><a href="https://xtech.nikkei.com/dm/atcl/column/15/426062/121500002/">&#x30A8;&#x30B3;&#x306B;&#x306A;&#x308B;&#x30AC;&#x30F3;&#x30D7;&#x30E9; | &#x65E5;&#x7D4C;&#x30AF;&#x30ED;&#x30B9;&#x30C6;&#x30C3;&#x30AF;&#xFF08;xTECH&#xFF09;</a></li> </ul> <p></section></p> <p><section></p> <h3 id="LIMEXライメックス">LIMEX(ライメックス)</h3> <p>株式会社TBMが開発した新樹脂.</p> <p><a href="https://tb-m.com/limex/">LIMEX | &#x9769;&#x547D;&#x7684;&#x65B0;&#x7D20;&#x6750;LIMEX&#xFF08;&#x30E9;&#x30A4;&#x30E1;&#x30C3;&#x30AF;&#x30B9;&#xFF09;- &#x682A;&#x5F0F;&#x4F1A;&#x793E;TBM</a></p> <p>上記のプラは石油から作られているが,LIMEXは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D0%B3%A5%C0%D0">石灰石</a>から作られている. ただし,従来のように非生分解性(自然分解されない)プラであることに変わらないのでグリーンウォッシング批判もある.</p> <p><a href="https://ja.wikipedia.org/wiki/LIMEX">LIMEX - Wikipedia</a></p> <p></section></p> <p>なお,上記すべての合成樹脂は非生分解性プラなのでマイクロプラスチック問題を解消できない.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B8%CA%AC%B2%F2%C0%AD%A5%D7%A5%E9%A5%B9%A5%C1%A5%C3%A5%AF">生分解性プラスチック</a>の種類については以下でまとめられている.(今の所プラモ製品としてはない)</p> <p><a href="http://www.jbpaweb.net/gp/">&#x751F;&#x5206;&#x89E3;&#x6027;&#x30D7;&#x30E9;&#x30B9;&#x30C1;&#x30C3;&#x30AF;&#x5165;&#x9580; &ndash; JBPA</a></p> <p></section></p> <p><section></p> <h2 id="骨組みフレーム外付けアーマー形式の登場">骨組みフレーム+外付けアーマー形式の登場</h2> <p>2010年頃に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%A2%A1%BC%A5%E0%A5%BA">フレームアームズ</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>のRGシリーズにより, 骨組みフレーム上に外付けアーマーを取り付けるプラモが登場した.</p> <p>特徴としては,骨組みフレームにより可動箇所が増加し,自由度の高いポーズを取らせることが可能になった.</p> <p>フレームーアームズでは,フレームと外付けアーマーが基本別売りとなっている.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08N5374DJ/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41Q6Ufev3HL._SL500_.jpg" class="hatena-asin-detail-image" alt="壽屋 フレームアームズ フレームアーキテクトTYPE-001〈ガンメタリック〉:RE2 全高約140mm 1/100スケール プラモデル FAF10" title="壽屋 フレームアームズ フレームアーキテクトTYPE-001〈ガンメタリック〉:RE2 全高約140mm 1/100スケール プラモデル FAF10"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08N5374DJ/newm-22/" target="_blank" rel="noopener">壽屋 フレームアームズ フレームアーキテクトTYPE-001〈ガンメタリック〉:RE2 全高約140mm 1/100スケール プラモデル FAF10</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%D4%E8%B2%B0">壽屋</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/KOTOBUKIYA">KOTOBUKIYA</a>)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08N5374DJ/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>ではRGというシリーズで,特徴としては,</p> <ul> <li>ランナー切り離し前からジョイントがある程度くっついているフレーム(アドバンスドMSジョイントシステム;ただし最近だとフレームに使われなくなってきたらしい)</li> <li>フレームとアーマーは一体販売</li> </ul> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B003KX5OXW/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51J++xYZxRL._SL500_.jpg" class="hatena-asin-detail-image" alt="RG 機動戦士ガンダム RX-78-2ガンダム 1/144スケール 色分け済みプラモデル" title="RG 機動戦士ガンダム RX-78-2ガンダム 1/144スケール 色分け済みプラモデル"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B003KX5OXW/newm-22/" target="_blank" rel="noopener">RG 機動戦士ガンダム RX-78-2ガンダム 1/144スケール 色分け済みプラモデル</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/BANDAI">BANDAI</a> SPIRITS(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a> スピリッツ)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B003KX5OXW/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a>界でもこの流れはあり, 「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%C6%B0%C0%EF%BB%CE%A5%AC%A5%F3%A5%C0%A5%E0">機動戦士ガンダム</a> Gフレーム」では,</p> <ul> <li>固定フレーム+外アーマー</li> <li>その機体専用の可動フレーム</li> </ul> <p>が各500円である.2つ買うと1000円なので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a>にしては高くね?となるが対象年齢も15才以上と高めである.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RKFN7N/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51MvB2sIQES._SL500_.jpg" class="hatena-asin-detail-image" alt="機動戦士ガンダム Gフレーム14 (10個入) 食玩・ガム (ガンダムシリーズ)" title="機動戦士ガンダム Gフレーム14 (10個入) 食玩・ガム (ガンダムシリーズ)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RKFN7N/newm-22/" target="_blank" rel="noopener">機動戦士ガンダム Gフレーム14 (10個入) 食玩・ガム (ガンダムシリーズ)</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/BANDAI">BANDAI</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RKFN7N/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>そして,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a>ということで低価格商品も登場. 「アニマギア」である.この商品は450円ほどでランナーが6枚ほど付いてくるという<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%B9%A5%D1">コスパ</a>良し商品である. 2021年8月には新シリーズアニマギアDEが登場.改良されておりアーマーにもジョイント用穴が空いておりカスタマイズ性が上がっている.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RL3N2L/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51WF2ysd0rS._SL500_.jpg" class="hatena-asin-detail-image" alt="アニマギアDE 01 (10個入) 食玩・ガム (アニマギア)" title="アニマギアDE 01 (10個入) 食玩・ガム (アニマギア)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RL3N2L/newm-22/" target="_blank" rel="noopener">アニマギアDE 01 (10個入) 食玩・ガム (アニマギア)</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/BANDAI">BANDAI</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RL3N2L/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><section></p> <h3 id="関節ヘタリ問題">関節ヘタリ問題</h3> <p>可動箇所が増えたが,ポーズを模索中に関節がヘタることや外付けアーマーがポロポロ落ちる問題も増えるようになった.</p> <p>対策としては,関節部分を瞬間接着剤(プラスチックが溶けないタイプ)を塗るか塗装してキツく締まるように分厚くすればいい.</p> <p>本来の使い方でないが,関節が復活すると評判のニス「 パーマネント マット バーニッシュ」もある.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001U3SETU/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41OVcQ0Q97L._SL500_.jpg" class="hatena-asin-detail-image" alt="Liquitex パーマネントマット バーニッシュ 40ml" title="Liquitex パーマネントマット バーニッシュ 40ml"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001U3SETU/newm-22/" target="_blank" rel="noopener">Liquitex パーマネントマット バーニッシュ 40ml</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%AD%A5%C6%A5%C3%A5%AF%A5%B9">リキテックス</a>(Liquitex)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001U3SETU/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p></section></p> <p></section></p> <p><section></p> <h2 id="美少女プラモの誕生普及">美少女プラモの誕生・普及</h2> <p>2015年に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%C0%A5%E0%A5%D3%A5%EB%A5%C9%A5%D5%A5%A1%A5%A4%A5%BF%A1%BC%A5%BA%A5%C8%A5%E9%A5%A4">ガンダムビルドファイターズトライ</a>より, アニメ内に登場した「すーぱーふみな」がキット化し美少女系プラモが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%FA%C3%C2">爆誕</a>. (実際はFAガールのほうが先だが,価格,流通,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%CE%CC%BE%C5%D9">知名度</a>によりこっちのほうがおそらく先駆け的位置づけ)</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B014SCW6WA/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41S8RDAU8dL._SL500_.jpg" class="hatena-asin-detail-image" alt="HGBF ガンダムビルドファイターズトライ すーぱーふみな 1/144スケール 色分け済みプラモデル" title="HGBF ガンダムビルドファイターズトライ すーぱーふみな 1/144スケール 色分け済みプラモデル"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B014SCW6WA/newm-22/" target="_blank" rel="noopener">HGBF ガンダムビルドファイターズトライ すーぱーふみな 1/144スケール 色分け済みプラモデル</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/BANDAI">BANDAI</a> SPIRITS(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a> スピリッツ)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B014SCW6WA/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a>のFAガールは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%A2%A1%BC%A5%E0%A5%BA">フレームアームズ</a>のキットを擬人・女体化したものである.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08B8NSH6P/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/419eCvWxA1L._SL500_.jpg" class="hatena-asin-detail-image" alt="壽屋フレームアームズ・ガール 轟雷改 Ver.2 全高約150mm NONスケール プラモデルFG021R" title="壽屋フレームアームズ・ガール 轟雷改 Ver.2 全高約150mm NONスケール プラモデルFG021R"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08B8NSH6P/newm-22/" target="_blank" rel="noopener">壽屋フレームアームズ・ガール 轟雷改 Ver.2 全高約150mm NONスケール プラモデルFG021R</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%D4%E8%B2%B0">壽屋</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/KOTOBUKIYA">KOTOBUKIYA</a>)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08B8NSH6P/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>更に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a>は,</p> <ul> <li>FAガールとは別の新ブランドの<a href="https://www.megamidevice.com/">メガミデバイス</a></li> <li>学園モノの<a href="https://sousaishojoteien.com/">創彩少女庭園</a></li> </ul> <p>と美少女プラモの新ブランドを作っている.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A1%BC%A5%AF%A5%B9">ボークス</a>もブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%C3%A5%AB%A1%BC%A5%BA">ロッカーズ</a>FIOREというブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%C3%A5%AB%A1%BC%A5%BA">ロッカーズ</a>シリーズ系譜の美少女プラモを出している.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07ZK3785S/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41vaxQWB-QL._SL500_.jpg" class="hatena-asin-detail-image" alt="ブロッカーズ FIORE アイリス" title="ブロッカーズ FIORE アイリス"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07ZK3785S/newm-22/" target="_blank" rel="noopener">ブロッカーズ FIORE アイリス</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A1%BC%A5%AF%A5%B9">ボークス</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07ZK3785S/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>2021年8月に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>が美少女プラモブランド30MMシスターズを立ち上げ. 特徴としては</p> <ul> <li>値段が安い(2500円程度)</li> <li>30MMシリーズの3mm共通ジョイントを使用しており互換性あり</li> </ul> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RNFKS7/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41WLNCrYMoS._SL500_.jpg" class="hatena-asin-detail-image" alt="BANDAI SPIRITS 30MS SIS-G00 リシェッタ[カラーA] 1/144スケール 色分け済みプラモデル 197704" title="BANDAI SPIRITS 30MS SIS-G00 リシェッタ[カラーA] 1/144スケール 色分け済みプラモデル 197704"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RNFKS7/newm-22/" target="_blank" rel="noopener">BANDAI SPIRITS 30MS SIS-G00 リシェッタ[カラーA] 1/144スケール 色分け済みプラモデル 197704</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/BANDAI">BANDAI</a> SPIRITS(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a> スピリッツ)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RNFKS7/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p></section></p> <p><section></p> <h2 id="ミキシングしやすい3mm軸共通ジョイントの普及">ミキシングしやすい3mm軸共通ジョイントの普及</h2> <p>ミキシング:他のプラモとの組み合わせ・カスタマイズ</p> <p>他のプラモと(比較的)容易にミキシングできるようなプラモシリーズが出始めた(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BE%A5%A4%A5%C9">ゾイド</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%ED%A5%C3%A5%AF%A5%B9">ブロックス</a>シリーズみたいな感じ). 共通規格があり,ブロック遊びのようにできるプラモを「キットブロック」や「ブロックトイ」と呼んだりする.</p> <p>キットブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%C3%A5%AF%B7%CF">ロック系</a>の特徴:</p> <ul> <li>同じシリーズ間のプラモであればミキシングが容易</li> <li>汎用的なパーツの買い足しがしやすい</li> <li>カラバリ機体との組み合わせで塗装を省ける場合あり</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a>でテーマに沿ったキットを組むイベントあり</li> <li>パーツ差し込み用の穴が目立つ</li> <li>他社キットとの組み合わせには,微妙に大きさが違かったりで調整必要だったりする</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%E9%A5%C3%A5%D7%A5%A2%A5%F3%A5%C9%A5%D3%A5%EB%A5%C9">スクラップアンドビルド</a>で関節が逝きやすい</li> </ul> <p>最初に出したのは,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A1%BC%A5%AF%A5%B9">ボークス</a>の「ブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%C3%A5%AB%A1%BC%A5%BA">ロッカーズ</a>」シリーズである. ただし,4mmジョイントである(後に3mm変換用パーツを出している). <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A1%BC%A5%AF%A5%B9">ボークス</a>のプラモは入手しにくい・初期キットはパチ組みしにくいくらい品質不安定で製作困難なために普及しなかった印象.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08K2LRF6S/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/513iOtLjFVL._SL500_.jpg" class="hatena-asin-detail-image" alt="ブロッカーズ NEXATE PRIME遠距離射撃タイプ:V-LAST アーマーパーツセット(ブラック/ブルーver.)" title="ブロッカーズ NEXATE PRIME遠距離射撃タイプ:V-LAST アーマーパーツセット(ブラック/ブルーver.)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08K2LRF6S/newm-22/" target="_blank" rel="noopener">ブロッカーズ NEXATE PRIME遠距離射撃タイプ:V-LAST アーマーパーツセット(ブラック/ブルーver.)</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A1%BC%A5%AF%A5%B9">ボークス</a></li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B08K2LRF6S/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>キットブロックという名が普及したのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a>の「ヘキサギア」(2017年)である, <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%A2%A1%BC%A5%E0%A5%BA">フレームアームズ</a>の頃から共通フレームにアーマー載せる仕様なのでキットブロックに近かったが, 「キットブロック」という名前を公式で使い出したのはヘキサギアからである.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B0978DTSTF/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41m8-7QRSES._SL500_.jpg" class="hatena-asin-detail-image" alt="ヘキサギア ボルトレックス・ラース 全長約165mm 1/24スケール プラモデル" title="ヘキサギア ボルトレックス・ラース 全長約165mm 1/24スケール プラモデル"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B0978DTSTF/newm-22/" target="_blank" rel="noopener">ヘキサギア ボルトレックス・ラース 全長約165mm 1/24スケール プラモデル</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%D4%E8%B2%B0">壽屋</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/KOTOBUKIYA">KOTOBUKIYA</a>)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B0978DTSTF/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>そして,2019年に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>が量産機コンセプトの<a href="https://bandai-hobby.net/site/30minutes_missions/">30MM</a>シリーズを出した. 特徴としては,</p> <ul> <li>安価(1機体1500円くらい,オプションの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A1%BC%A5%AF%A5%EB">ビークル</a>なら800円くらい)により買い足ししやすい</li> <li>カラバリが多い</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>プラモということで入手しやすい</li> </ul> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RMN1P6/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41y0QxWJh0S._SL500_.jpg" class="hatena-asin-detail-image" alt="30MM 1/144 EXM-E7f スピナティア (フェンサー仕様) 1/144スケール 色分け済みプラモデル" title="30MM 1/144 EXM-E7f スピナティア (フェンサー仕様) 1/144スケール 色分け済みプラモデル"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RMN1P6/newm-22/" target="_blank" rel="noopener">30MM 1/144 EXM-E7f スピナティア (フェンサー仕様) 1/144スケール 色分け済みプラモデル</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/BANDAI">BANDAI</a> SPIRITS(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a> スピリッツ)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B092RMN1P6/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><section></p> <h3 id="軸ジョイントの種類">軸・ジョイントの種類</h3> <p>丸軸やボールジョイントが一般的であるが, 軸受あたりもみるとシリーズによって微妙に違ったりする.</p> <ul> <li>3mm丸軸・丸型軸受(30MMシリーズ) <figure class="figure-image figure-image-fotolife" title="3mm丸軸・軸受"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210706/20210706144221.jpg" alt="3mm&#x4E38;&#x8EF8;&#x30FB;&#x8EF8;&#x53D7;" width="605" height="355" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>3mm丸軸・軸受</figcaption></figure> </li> <li>5mmボールジョイント・丸型軸受(30MMシリーズ):3mm軸にポリキャップを被せると5mmボールジョイントに変換可能.手首や足首はこのパーツで可動してる場合が多い. <figure class="figure-image figure-image-fotolife" title="5mmボールジョイント"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210706/20210706144242.jpg" alt="5mm&#x30DC;&#x30FC;&#x30EB;&#x30B8;&#x30E7;&#x30A4;&#x30F3;&#x30C8;(30MM)" width="309" height="284" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>5mmボールジョイント</figcaption></figure> </li> <li>C型ジョイント(30MMシリーズ):ボールジョイントとが違って膝,肘のような1方向の曲げに使える.取り外しが容易だが緩くなりやすい. <figure class="figure-image figure-image-fotolife" title="C型ジョイント"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210706/20210706144228.jpg" alt="C&#x578B;&#x30B8;&#x30E7;&#x30A4;&#x30F3;&#x30C8;(30MM)" width="266" height="394" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>C型ジョイント</figcaption></figure> </li> <li>六角ジョイント(3mm, 5mm): ヘキサギアで主に採用され,([ヘキサ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B0%A5%E9%A5%E0%A5%B7">グラムシ</a>ステム](<a href="https://www.kotobukiya.co.jp/hexa-gear-gg/hexa-gear-gg-104808/">https://www.kotobukiya.co.jp/hexa-gear-gg/hexa-gear-gg-104808/</a>))と呼んででいる.特徴は六角軸なら60度ずつ角度を選びながらパーツの固定,ボールジョイントなら可動(内接円でパーツがはまる)と自由度がある.</li> <li>3mm丸軸・六角軸受:アニマギアで採用.形合わないのでは?と思ったら六角の内接円でハマる感じ. [アニマギア公式の解説](<a href="https://bandaicandy.hateblo.jp/entry/animagear_20190823">https://bandaicandy.hateblo.jp/entry/animagear_20190823</a>) </li> </ul> <p></p> <p></section></p> <p></section></p> <p><section></p> <h2 id="低年齢向けプラモの増加">低年齢向けプラモの増加</h2> <p>おそらく模型<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%B9%A5%BF">クラスタ</a>の年齢層が高いため低年齢層を増やすためだと思われるが(元々模型は子供向けなので原点回帰ともいえる), 低年齢向け商品も増えてきた.一般的にプラモの対象年齢は15才以上であるが,低年齢向け商品の特徴としては,</p> <ul> <li>ニッパーのような危険な道具を使わない,飲み込まないようにパーツが小さすぎない,危険な塗料を使わなくて済むといった安全性</li> <li>お小遣いの範囲で買える価格の安さ</li> </ul> <p>がある.この辺を意識した商品は対象年齢8才以上くらいまで下がってくる.</p> <p>最近でこの低年齢を意識したシリーズは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%AB%A5%E9%A5%C8%A5%DF%A1%BC">タカラトミー</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BE%A5%A4%A5%C9">ゾイド</a>ワイルドシリーズである. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BE%A5%A4%A5%C9">ゾイド</a>ワイルドでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BE%A5%A4%A5%C9">ゾイド</a>の各パーツ発掘・復元するという設定からプラモに必ずあるといっていいランナーの排除に成功している.対象年齢6才まで下げている. また,昨今における子供の<a class="keyword" href="http://d.hatena.ne.jp/keyword/youtube">youtube</a>人気から作り方動画も<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%AB%A5%E9%A5%C8%A5%DF%A1%BC">タカラトミー</a>公式でアップしている.</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/MH9psTmMBj8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=MH9psTmMBj8">www.youtube.com</a></cite></p> <p>ただ,残念なことに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BE%A5%A4%A5%C9">ゾイド</a>ワイルドシリーズは2021年でWEBアニメが終了しているぽいので今後のキット化は望めない. ぜひ復活するときにはキットブロックの波に乗っかって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%ED%A5%C3%A5%AF%A5%B9">ブロックス</a>シリーズぽいものをお願いしたい.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>では,「30MM」シリーズ,「アニマギア」シリーズを出している.流通量も多いので価格が安い.</p> <p>そして,この流れを受けてか,あの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%C8%A5%D6%A5%AD%A5%E4">コトブキヤ</a>が低年齢向け(対象年齢8才以上)の商品を初めて出す予定. エヴォロイドである.オモロイドの系譜のようである.パーツが多かったり流通が少ないためかメーカー希望価格は3000円弱とお高めである.</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B095S4PFL7/newm-22/" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41bx-VWE7wS._SL500_.jpg" class="hatena-asin-detail-image" alt="エヴォロイド EVR-01A ジェットン 全高87mm NONスケール プラモデル IT001" title="エヴォロイド EVR-01A ジェットン 全高87mm NONスケール プラモデル IT001"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B095S4PFL7/newm-22/" target="_blank" rel="noopener">エヴォロイド EVR-01A ジェットン 全高87mm NONスケール プラモデル IT001</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%D4%E8%B2%B0">壽屋</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/KOTOBUKIYA">KOTOBUKIYA</a>)</li></ul><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B095S4PFL7/newm-22/" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p></section></p> <p><section></p> <h2 id="環境問題対策">環境問題対策</h2> <p>プラモはもちろんプラスチックを使ってるのでマイ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A5%B9%A5%D7%A5%E9%A5%B9">クロスプラス</a>チック問題にも関わってくる. プラスチックの問題は昔からあったが,「マイクロプラスチック」というキーワードのニュースが話題になったのは2015年頃である.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fweb.archive.org%2Fweb%2F20151209220500%2Fhttp%3A%2F%2Fwww3.nhk.or.jp%2Fnews%2Fhtml%2F20151208%2Fk10010333111000.html" title="日本近海のマイクロプラスチック 世界平均の27倍 NHKニュース" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://web.archive.org/web/20151209220500/http://www3.nhk.or.jp/news/html/20151208/k10010333111000.html">web.archive.org</a></cite></p> <p>ただ,2021年の今でも生分解性(自然分解可能)プラの製品はいまのところない. このあたりの環境問題に特に力を入れてるのは企業規模のでかい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>である.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>では,自社製品のランナーを回収しそこから新たなプラモデルをつくるという 「<a href="https://www.bandaispirits.co.jp/hobbycenter/recycleproject.html">ガンプラリサイクルプロジェクト</a>」を行っている. <a href="https://bandainamco-am.co.jp/event/game_center/gunpla-recycle.html">ナムコ関係施設に置いてあるハロのリサイクルBOX</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>製のランナーだけを対象に回収している. ただし,回収ランナーから作ったプラモの発色が出ないようなので製品販売までは時間がかかりそうである.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D0%BA%E4%B9%C0%C6%F3">石坂浩二</a>氏が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A1%BC%A5%EA%A1%BC%A5%C6%A5%E9%A1%BC">ストーリーテラー</a>になってるニュース動画がわかりやすいので載せておく.</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/Cnz_mQl0ifM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=Cnz_mQl0ifM">www.youtube.com</a></cite></p> <p>さらに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>は新素材にも着目している. <a href="https://tb-m.com/limex/">株式会社TBMが開発したLIMEX</a>である. 基本的にプラスチックは石油由来だがLIMEXは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D0%B3%A5%C0%D0">石灰石</a>から作られる. ただし,非生分解性プラなので,石油を使わない,CO2削減あたりに期待されている.</p> <p>グリーンウォッシングとして批判されてる部分もある.</p> <p><a href="https://ja.wikipedia.org/wiki/LIMEX#%E5%95%8F%E9%A1%8C%E7%82%B9%E3%83%BB%E6%89%B9%E5%88%A4">LIMEX - Wikipedia</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>はこのLIMEXを使ったプラモを2021年9月に発売予定.プラっぽくない見た目なので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%FC%B3%CA%C9%B8%CB%DC">骨格標本</a>タイプのプラモとして出す模様.</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/6eDigKUlWSI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><cite class="hatena-citation"><a href="https://youtu.be/6eDigKUlWSI">youtu.be</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fp-bandai.jp%2Fitem%2Fitem-1000158708%2F%3Fmedtr%3D12gog18mw%26rt%3Dgossc%26utm_source%3DGoogle%26utm_medium%3Dssc%26utm_campaign%3DGAW_SSC%26gclid%3DCj0KCQjw24qHBhCnARIsAPbdtlJL-dqNEhLPYFNJWLhfqmNQIUel7aZ94phO5Vod9LYy3kOI1Z-m-agaAkFZEALw_wcB" title="恐竜骨格プラモデル ティラノサウルス【2021年9月発送】| プレミアムバンダイ" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://p-bandai.jp/item/item-1000158708/?medtr=12gog18mw&rt=gossc&utm_source=Google&utm_medium=ssc&utm_campaign=GAW_SSC&gclid=Cj0KCQjw24qHBhCnARIsAPbdtlJL-dqNEhLPYFNJWLhfqmNQIUel7aZ94phO5Vod9LYy3kOI1Z-m-agaAkFZEALw_wcB">p-bandai.jp</a></cite></p> <p></section></p> <p><section></p> <h2 id="100円ショップで使える道具たち">100円ショップで使える道具たち</h2> <p>プラモも進化したが100円ショップのハンドメイド・手芸・工作用商品も進化して(増えて)いる. 特にハンドメイド品はセリアが強い.</p> <ul> <li>デザインナイフ:ニッパー後のバリ取りに最適.替刃も付いてるが使い捨てもできる.</li> <li>カッティングマット:デザインナイフや作業用に.100円だと小さいが大きいものは200-300円で売っている.</li> <li>紙やすり(耐水ペーパー):600-1500番手までは手に入る.</li> <li>スポンジやすり:2000番手もある.ただし量が少ないのでホームセンターで耐水ペーパーを買ったほうがいいかもしれない.</li> <li>UVレジン:レジンもプラモとは成分が異なるが樹脂でちょっとしたパーツを自作できる.UVライトがなくとも太陽光で固まるタイプもある.量は少なく4gほどなので量が欲しい場合は雑貨屋で買ったほうがいい.</li> <li>レジン用UVライト:なんとUVライトも売っている.USB給電で200円</li> <li>お湯で柔らかくなるタイプの粘土:「おゆまる」という名前でも売ってる.これでパーツの型取りをしてレジンを流し込めばパーツの複製が可能</li> <li>仕切りケース:ジョイントパーツなどをしまっておくのに便利.大きいものは150-200円くらいである.</li> <li>ジュエルシール:ザクの目のようなクリアパーツの代わりに使える.</li> <li>マニキュア:エナメル塗料なので塗装に使える.薄め液や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%C3%A5%D7%A5%B3%A1%BC%A5%C8">トップコート</a>も売ってる.マット系ならつや消しにもなる.</li> <li>マクロ・接写レンズ:撮影用.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>に取り付けできる.</li> <li>撮影ボックス(キャンドゥ,ワッツ):LEDライト付き440円.撮影対象のサイズは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%F3%A5%D7%A5%E9">ガンプラ</a>1/144(14cm前後)程度なので注意.</li> </ul> <p><section></p> <h3 id="まだ避けておいたほうがいいもの">まだ避けておいたほうがいいもの</h3> <ul> <li>ニッパー:安物だとバリを綺麗に切落とせず白化するので両刃ニッパーがおすすめ</li> <li>面相筆:プラモではスミ入れに使うことが多い.安物だと毛先が揃わなかったりするので模型用のお高いやつを買ったほうがいい</li> </ul> <p></section></p> <p></section></p> <p><section></p> <h2 id="今から始める復帰する人におすすめのシリーズ">今から始める・復帰する人におすすめのシリーズ</h2> <p>入手性と価格の安さの観点から決めてみる. 安いプラモは塗装練習に使えたり処分もしやすい.</p> <p>まず,入手性からいくと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>製である. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B5%A4%B2%B0">電気屋</a>,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%E2%A4%C1%A4%E3%B2%B0">おもちゃ屋</a>のプラモコーナーやイオンのおもちゃコーナーに置いてある.</p> <p>そして安さでいくとこれも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%C0%A5%A4">バンダイ</a>である.流通数も多いので安い.</p> <p>さらに,パーツが無駄にならず拡張性のある「ブロックキット」系をおすすめしたい.</p> <p>以上から次に絞られる.</p> <p><section></p> <h3 id="30MMシリーズ">30MMシリーズ</h3> <p>ロボ好きにおすすめ</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/JDqF7rBLZE8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=JDqF7rBLZE8">www.youtube.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbandai-hobby.net%2Fsite%2F30minutes_missions%2F" title="30 MINUTES MISSIONS[30ミニッツミッションズ] | バンダイ ホビーサイト" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://bandai-hobby.net/site/30minutes_missions/">bandai-hobby.net</a></cite></p> <p>名前の由来は30分で作れるでなく,「遊んで気がついたら30分以上経ってる」である. 量産機コンセプトであるが,オプションパーツなど組み合わせてゴテゴテの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A5%F3%A5%AA%A5%D5">ワンオフ</a>機を作ってもいいと自由度が高い.</p> <ul> <li>安い(機体1500円くらい,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A1%BC%A5%AF%A5%EB">ビークル</a>は800円)</li> <li>カラバリが多いので塗装しなくて済む場合もある</li> <li>イオンのおもちゃコーナーにおいてあるくらいに入手性は高いが,人気の新作はすぐ売り切れるのでネット予約がベスト</li> </ul> <p></section></p> <p><section></p> <h3 id="30MMシスターズシリーズ">30MMシスターズシリーズ</h3> <p>美少女プラモを触ってみたい人におすすめ</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/Qdtsycmm1hA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=Qdtsycmm1hA&feature=emb_imp_woyt">www.youtube.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbandai-hobby.net%2Fsite%2F30minutes_sisters%2F" title="30 MINUTES SISTERS" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://bandai-hobby.net/site/30minutes_sisters/">bandai-hobby.net</a></cite></p> <ul> <li>美少女プラモ中で一番安い(2500円くらい)</li> <li>30MMと同じ3mm軸共通ジョイントなので互換性がある</li> <li>ただし,安さ人気で予約終わってしまった?</li> </ul> <p></section></p> <p><section></p> <h3 id="アニマギアシリーズ">アニマギアシリーズ</h3> <p>とにかく安いものが欲しい人におすすめ</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/DD3Ban08Eek?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=DD3Ban08Eek">www.youtube.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.bandai.co.jp%2Fcandy%2Fanimagear%2F" title="アニマギア|バンダイ キャンディ公式サイト" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.bandai.co.jp/candy/animagear/">www.bandai.co.jp</a></cite></p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A9%B4%E1">食玩</a>なのでとにかく安い(450円ほど)</li> <li>安くてもランナー6枚くらい入ってる</li> <li>フレーム+アーマー型なので可動もする</li> <li>世界観は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DB%A5%D3%A1%BC%A5%A2%A5%CB%A5%E1">ホビーアニメ</a>,キャ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>ターは人型は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%C0%A5%ED%A5%C3%A5%C8">メダロット</a>ぽく動物型は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BE%A5%A4%A5%C9">ゾイド</a>ぽい感じでこの辺が好きな人は刺さるかと</li> </ul> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.kda1969.com%2Fstudy%2Fstudy_pla_detail.htm" title="各種汎用プラスチックの長所・短所・用途(基礎知識)|KDAのプラスチック加工技術" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.kda1969.com/study/study_pla_detail.htm">www.kda1969.com</a></cite></p></li> <li><p><a href="https://spsj.or.jp/mirai/2019/06/07/%E3%83%97%E3%83%A9%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AB%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E3%83%97%E3%83%A9%E3%82%B9%E3%83%81%E3%83%83%E3%82%AF/">&#x30D7;&#x30E9;&#x30E2;&#x30C7;&#x30EB;&#x306B;&#x4F7F;&#x308F;&#x308C;&#x308B;&#x30D7;&#x30E9;&#x30B9;&#x30C1;&#x30C3;&#x30AF; &ndash; &#x9AD8;&#x5206;&#x5B50;&#x672A;&#x6765;&#x587E;&reg;</a></p></li> </ul> <p></aside></p> Tue, 06 Jul 2021 15:11:27 +0900 hatenablog://entry/26006613783549188 プラモデル 雑記 pythonのビット演算周りのメモ https://cartman0.hatenablog.com/entry/2021/03/02/python%E3%81%AE%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97%E5%91%A8%E3%82%8A%E3%81%AE%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="pythonのビット演算周りのメモ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のビット演算周りのメモ</h1> <p>負数の取り扱いとビットの反転がわかりにくいのでメモ</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#pythonのビット演算周りのメモ">pythonのビット演算周りのメモ</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#pythonでの2進数16進数">pythonでの2進数,16進数</a></li> <li><a href="#pythonでの負数ビット">pythonでの負数ビット</a><ul> <li><a href="#ビット文字列の自作関数">ビット文字列の自作関数</a></li> <li><a href="#ビット文字列から整数への変換">ビット文字列から整数への変換</a></li> <li><a href="#2の補数ビット文字列から整数への変換">2の補数ビット文字列から整数への変換</a></li> </ul> </li> <li><a href="#pythonでのビット反転">pythonでのビット反転</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 <ul> <li>Docker Desktop <ul> <li><a href="">scipy-notebook image</a> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> 3.8.4</li> </ul> </li> </ul> </li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="pythonでの2進数16進数"><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>での2進数,16進数</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>の整数<code>int</code>では,2進数,16進数も扱える.</p> <ul> <li>2進数の前には<code>0b</code>を付ける.</li> <li>16進数の前には<code>0x</code>を付ける.</li> </ul> <p>例:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># 1</span> <span class="synIdentifier">print</span>(<span class="synConstant">0b1</span>) &gt; <span class="synConstant">1</span> </pre> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># 1</span> <span class="synIdentifier">print</span>(<span class="synConstant">0xf</span>) &gt; <span class="synConstant">15</span> </pre> <p>あくまで整数なので表示を指定しなければそのまま整数として表示される.</p> <p>2進数として表示するなら<code>format()</code>や<code>bin()</code>が使える. ただし負数の取り扱いがややこしい(後述).</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">bin</span>(<span class="synConstant">0b1</span>) <span class="synComment"># 文字列が返る</span> &gt; <span class="synConstant">'0b1'</span> <span class="synIdentifier">format</span>(<span class="synConstant">0b10</span>, <span class="synConstant">'b'</span>) <span class="synComment"># 0bがつかないビット列の文字列が返る</span> &gt; <span class="synConstant">'10'</span> </pre> <p></section></p> <p><section></p> <h2 id="pythonでの負数ビット"><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>での負数ビット</h2> <p>2の補数で扱われる.</p> <p>元の整数+その2の補数=0 になる.</p> <p>今の整数の2の補数が欲しい場合は -符号を付けるだけで求められる.</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># x + (-x) = 0</span> <span class="synIdentifier">bin</span>(<span class="synConstant">1</span>+(-<span class="synConstant">1</span>)) &gt; <span class="synConstant">0b0</span> </pre> <p>しかし,<code>format()</code>や<code>bin()</code>で表示すると<code>-</code>符号と正数ビットになり, <code>-0b</code>の形で表示される.(表示されるだけで内部では2の補数のビット列になっている.)</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">bin</span>(-<span class="synConstant">1</span>) &gt; <span class="synConstant">'-0b1'</span> <span class="synComment"># 2の補数の11 とは表示されない</span> <span class="synIdentifier">format</span>(-<span class="synConstant">3</span>, <span class="synConstant">'b'</span>) &gt; <span class="synConstant">'-11'</span> <span class="synComment"># 2の補数の101 とは表示されない</span> </pre> <p>2の補数のビット列が欲しい場合は<code>0b1111</code>や<code>0xff</code>あたりでAND(<code>&amp;</code>)演算(mask)すると, 内部では2の補数ビット列なのでそのビット列が正数ビット<code>0b</code>として返ってくる.</p> <pre class="code" data-lang="" data-unlink>bin(-1 &amp; 0b1111) &gt; &#39;0b1111&#39;</pre> <p><section></p> <h3 id="ビット文字列の自作関数">ビット文字列の自作関数</h3> <p>上記のように<code>0b</code>付きの表記はややこしいため,2の補数ビット列が必要な場合は ビット列を文字列として表示する専用関数を作ったほうがいいかもしれない.</p> <ul> <li>正数の場合:先頭に0</li> <li>負数の場合:2の補数,先頭は1</li> </ul> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">int2bitstr</span>(num:<span class="synIdentifier">int</span>, mask:<span class="synIdentifier">int</span>=<span class="synConstant">0xff</span>): s = <span class="synIdentifier">bin</span>(num &amp; mask)[<span class="synConstant">2</span>:] <span class="synStatement">if</span> num &gt; <span class="synConstant">0</span>: <span class="synStatement">return</span> <span class="synConstant">'0'</span> + s <span class="synStatement">else</span>: <span class="synStatement">return</span> s </pre> <pre class="code lang-python" data-lang="python" data-unlink>int2bitstr(<span class="synConstant">1</span>, <span class="synConstant">0xf</span>) &gt; `<span class="synConstant">01</span>` int2bitstr(-<span class="synConstant">1</span>, <span class="synConstant">0xf</span>) &gt; <span class="synConstant">'1111'</span> </pre> <p></section></p> <p><section></p> <h3 id="ビット文字列から整数への変換">ビット文字列から整数への変換</h3> <p><code>0b</code>付きや負の絶対値のビット文字列であれば<code>int(str, 2)</code>で整数へ変換できる.</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">int</span>(<span class="synConstant">&quot;0b1&quot;</span>, <span class="synConstant">2</span>) &gt; <span class="synConstant">1</span> <span class="synIdentifier">int</span>(<span class="synConstant">&quot;01&quot;</span>,<span class="synConstant">2</span>) <span class="synComment"># 0bなしでもok</span> &gt; <span class="synConstant">1</span> </pre> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">int</span>(<span class="synConstant">&quot;-0b01&quot;</span>, <span class="synConstant">2</span>) <span class="synComment"># 負数の場合,最初に`-`をつける.</span> &gt; -<span class="synConstant">1</span> <span class="synIdentifier">int</span>(<span class="synConstant">&quot;-01&quot;</span>, <span class="synConstant">2</span>) <span class="synComment"># 負数でも-符号さえあれば0bなしでok</span> &gt; <span class="synConstant">1</span> </pre> <p></section></p> <p><section></p> <h3 id="2の補数ビット文字列から整数への変換">2の補数ビット文字列から整数への変換</h3> <p>上記の方法だと2の補数ビット列は正のビット文字列として扱われるので そのまま整数にはできない. 自作関数が必要になるのでやり方をちょっと考える.</p> <p>例えば<code>11</code>という文字列を与えたときに整数で-1になればいい.</p> <pre class="code" data-lang="" data-unlink># 10進: (1) + (-1) = 0 # 2の補数に直す: 01 + 11 = 100 #ビット演算的には10進の1+3=4のときと同じになる 01 + 11 = 100 01 = 100 - 11 #両辺にマイナスをかける -1 = -4+3と同じ -(01) = -100 + 11</pre> <p>一般化すると</p> <pre class="code" data-lang="" data-unlink># 符号ビットを元のビット列の数だけシフト x[0] &lt;&lt; len(x) # 符号が正ならこれは正 # 元のビット列を正の整数としてみてそこから引けばいい int(x, 2) - (int(x[0],2) &lt;&lt; len(x))</pre> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">bits2int</span>(bits_s: <span class="synIdentifier">str</span>) -&gt; <span class="synIdentifier">int</span>: <span class="synStatement">return</span> <span class="synIdentifier">int</span>(bits_s, <span class="synConstant">2</span>) - (<span class="synIdentifier">int</span>(bits_s[<span class="synConstant">0</span>], <span class="synConstant">2</span>)&lt;&lt;<span class="synIdentifier">len</span>(bits_s)) </pre> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># 2bitだと[-2, 1]まで表せる.</span> bits2int(<span class="synConstant">&quot;01&quot;</span>) &gt; <span class="synConstant">1</span> bits2int(<span class="synConstant">&quot;00&quot;</span>) &gt; <span class="synConstant">0</span> bits2int(<span class="synConstant">&quot;11&quot;</span>) &gt; -<span class="synConstant">1</span> bits2int(<span class="synConstant">&quot;10&quot;</span>) &gt; -<span class="synConstant">2</span> </pre> <p>参考: <a href="https://qiita.com/ein-san/items/d73ea8483732f09ba37f">Python&#x3067;2&#x306E;&#x88DC;&#x6570;&#x3092;10&#x9032;&#x6570;&#x306B;&#x5909;&#x63DB;&#x3059;&#x308B; - Qiita</a></p> <p></section></p> <p></section></p> <p><section></p> <h2 id="pythonでのビット反転"><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>でのビット反転</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a><code>~</code>を使う. 反転の定義が少し違うので注意.</p> <p><a href="https://docs.python.org/ja/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations">6. &#x5F0F; (expression) &mdash; Python 3.9.2 &#x30C9;&#x30AD;&#x30E5;&#x30E1;&#x30F3;&#x30C8;</a></p> <p>元のビット列と反転ビットの足し算を考える.</p> <pre class="code" data-lang="" data-unlink>01 + 10 = 11 # 必ずフルビット立つようになる. # 2の補数としてみて10進に直すと 1 + -2 = -1 必ず-1になる</pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のビット反転の仕様はこれになるので必ず<code>x + ~x = -1</code>になる.</p> <p>つまり,</p> <pre class="code" data-lang="" data-unlink>~x = -x - 1= -(x+1)</pre> <p>となる.</p> <p>一般的な正のフルビットの考え方とは異なる.</p> <pre class="code" data-lang="" data-unlink># 以下のようにはならない. 0b01 + ~(0b01) = 0b11 0b01 + 0b10 = 0b11 10進: 1 + 2 = 2^2 - 1=3</pre> <p><code>~</code>での反転した負数を<code>format, bin</code>で表示すると 負の絶対値表現になりより混乱するので注意.</p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.python.org%2Fja%2F3%2Freference%2Fexpressions.html%23unary-arithmetic-and-bitwise-operations" title="6. 式 (expression) — Python 3.9.2 ドキュメント" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://docs.python.org/ja/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations">docs.python.org</a></cite></p></li> </ul> <p></aside></p> Tue, 02 Mar 2021 06:07:41 +0900 hatenablog://entry/26006613698146035 Python ディリクレ(Dirichlet)分布を3Dで可視化する https://cartman0.hatenablog.com/entry/2021/02/27/%E3%83%87%E3%82%A3%E3%83%AA%E3%82%AF%E3%83%AC%28Dirichlet%29%E5%88%86%E5%B8%83%E3%82%923D%E3%81%A7%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B?utm_source=feed <h1 id="ディリクレDirichlet分布を3Dで可視化する">ディリクレ(Dirichlet)分布を3Dで可視化する</h1> <p>(3次元の)ディリクレ分布を<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>の<code>matplotlib.plot_surface</code>で可視化するメモ.</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#ディリクレDirichlet分布を3Dで可視化する">ディリクレ(Dirichlet)分布を3Dで可視化する</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#ディリクレ分布">ディリクレ分布</a></li> <li><a href="#matplotlibで可視化する">matplotlibで可視化する.</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 <ul> <li>Docker Desktop <ul> <li><a href="https://hub.docker.com/r/jupyter/scipy-notebook">scipy-notebook image</a></li> </ul> </li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="ディリクレ分布">ディリクレ分布</h2> <p>ベルヌーイ分布をn変量に拡張したもの. 多項分布(categorical分布)のパラメータの分布でよく出てくる. 例えば,サイコロの各出目がその確率になる確率を計算できる. (6次元の確率から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%CE%CE%A8%CC%A9%C5%D9%B4%D8%BF%F4">確率密度関数</a>pdfの値が求まる) なので確率変数をすべて足すと1になる.(自由度として1つ減る.) $x_{1}+x_{2}+x_{3}+x_{4}+x_{5}+x_{6}=1$</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%CE%CE%A8%CC%A9%C5%D9%B4%D8%BF%F4">確率密度関数</a>:ガンマ関数を使って表される. ディリクレ分布のパラメータを$\vec{\alpha}$とする. このパラメータはベルヌーイ分布のパラメータをサイコロのような多面体に拡張したものになる. パラメータの意味としてベルヌーイ分布のパラメータ同様に事前に振っておいてどの目がどのくらい出現していたかに相当する. 全体的にパラメータの値が大きくなると出現回数が確認されてるので分散は小さくなっていく.</p> <p>$$ \mathrm{pdf}(\vec{x} | \vec{\alpha}) = \frac{1}{C} \prod_{k=1}^{K} x^{\alpha_{ k - 1 }} \\ C = \frac{\prod_{k=1}^{K} \Gamma(\alpha_{k}) }{\Gamma(\sum_{k=1}^{K} \alpha_{k})} $$</p> <p>K=6とするとサイコロの各出目の確率の確率分布を表せる.</p> <p><code>.rvs</code>などでランダムサンプリングすると, K=6であれば多項分布のパラメータになる$x_1+\cdots+x_{6}=1$となる確率をサンプリングできる.</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> scipy <span class="synPreProc">import</span> stats alpha = np.array([<span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>, <span class="synConstant">1</span>]) <span class="synComment"># specify concentration parameters</span> stats.dirichlet.rvs(alpha, <span class="synConstant">1</span>) array([[<span class="synConstant">0.1657884</span> , <span class="synConstant">0.17995035</span>, <span class="synConstant">0.0089385</span> , <span class="synConstant">0.05918143</span>, <span class="synConstant">0.09352992</span>, <span class="synConstant">0.49261141</span>]]) </pre> <p><section></p> <p><section></p> <h2 id="matplotlibで可視化する">matplotlibで可視化する.</h2> <p>可視化できるように3次元(K=3)のディリクレ分布で試す. 3次元なので3面のサイコロの各確率が出るに相当する. どの点も$x_{1}+x_{2}+x_{3}=1$を満たす. さらに各頂点は,$x_{1},x_{2},x_{3}$のどれかが1で残りは0になっている.</p> <p>グラフの各軸は</p> <ul> <li>x軸:確率変数$x_{1}$</li> <li>y軸:確率変数$x_{2}$</li> <li>z軸: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%CE%CE%A8%CC%A9%C5%D9%B4%D8%BF%F4">確率密度関数</a>$pdf(x_{1},x_{2},1-x_{1}-x_{2})$</li> </ul> <p>とする.</p> <p>ディリクレ分布の密度関数の計算コード:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># ディレクレ</span> <span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">from</span> scipy <span class="synPreProc">import</span> special <span class="synStatement">class</span> <span class="synIdentifier">Dirichlet</span>(): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self,para:<span class="synIdentifier">list</span>)-&gt;<span class="synIdentifier">None</span>: self.para = np.array(para) <span class="synStatement">def</span> <span class="synIdentifier">pdf</span>(self, x:<span class="synIdentifier">list</span>)-&gt;np.float: <span class="synComment"># 正規化定数 Z</span> x_ar = np.array(x) cons = np.prod(special.gamma(self.para))/(special.gamma(np.sum(self.para))) p = (<span class="synConstant">1.</span>/cons) * np.prod(x_ar**(self.para-<span class="synConstant">1</span>)) <span class="synStatement">return</span> p <span class="synStatement">def</span> <span class="synIdentifier">plt_3d</span>(self, zlim=<span class="synIdentifier">None</span>)-&gt;<span class="synIdentifier">None</span>: xdata = np.linspace(<span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">200</span>) ydata = np.linspace(<span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">200</span>) X,Y = np.meshgrid(xdata, ydata) z = [] X[X+Y&gt;<span class="synConstant">1</span>] = <span class="synConstant">0</span> Y[X+Y&gt;<span class="synConstant">1</span>] = <span class="synConstant">0</span> <span class="synStatement">for</span> _x, _y, _z <span class="synStatement">in</span> <span class="synIdentifier">zip</span>(X.flatten(), Y.flatten(), (<span class="synConstant">1</span>-X-Y).flatten()): z.append(self.pdf([_x, _y, _z])) Z = np.array(z).reshape(X.shape) ax3d = plt.axes(projection=<span class="synConstant">'3d'</span>) ax3d.plot_surface(X, Y, Z,cmap=<span class="synConstant">'plasma'</span>) ax3d.set_zlim(zlim) ax3d.set_xlabel(<span class="synConstant">&quot;$x_1$&quot;</span>) ax3d.set_ylabel(<span class="synConstant">&quot;$x_2$&quot;</span>) ax3d.set_zlabel(<span class="synConstant">&quot;pdf$(x_1,x_2,1-x_1-x_2)$&quot;</span>) ax3d.set_title(<span class="synConstant">&quot;Dir($</span><span class="synSpecial">\\</span><span class="synConstant">vec{</span><span class="synSpecial">\\</span><span class="synConstant">alpha} = $&quot;</span> + <span class="synConstant">&quot;%s)&quot;</span> % self.para) plt.show() diri.pdf([<span class="synConstant">1.</span>,<span class="synConstant">0.</span>,<span class="synConstant">0.</span>]) </pre> <p>3Dの可視化では,[0,1]の範囲をmeshgridを使ってx,yの各2次元配列を作成. $x+y+x_3=1$の制約があるので$x+y>1$になるメッシュは$x=0,y=0$として上書きしている.</p> <p>パラメータ$\vec{\alpha} = [1,1,1]$のときを描画してみる.jupyer labでは<code>%matplotlib widget</code>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>なグラフが描ける.</p> <pre class="code lang-python" data-lang="python" data-unlink>%matplotlib widget diri = Dirichlet([<span class="synConstant">1.</span>,<span class="synConstant">1.</span>,<span class="synConstant">1.</span>]) diri.plt_3d(zlim=(<span class="synConstant">0</span>, <span class="synConstant">2.1</span>)) </pre> <p><figure class="figure-image figure-image-fotolife" title="パラメータ$\vec{\alpha} = [1,1,1]$のときのディリクレ分布"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210227/20210227035733.png" alt="" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>パラメータ$\vec{\alpha} = [1,1,1]$のときのディリクレ分布</figcaption></figure></p> <p>ちなみに $pdf(1,0,0|alpha=[1,1,1])=2$ になる</p> <p>パラメータ$\vec{\alpha} = [5,5,5]$: $\vec{\alpha} = [1,1,1]$のときより分散が小さいので真ん中らへんが一番高くなる.</p> <pre class="code lang-python" data-lang="python" data-unlink>%matplotlib widget diri = Dirichlet([<span class="synConstant">5.</span>,<span class="synConstant">5.</span>,<span class="synConstant">5.</span>]) diri.plt_3d() </pre> <p><figure class="figure-image figure-image-fotolife" title="パラメータ\vec{\alpha} = [5,5,5]のときのディリクレ分布"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210227/20210227035739.png" alt="&#x30D1;&#x30E9;&#x30E1;&#x30FC;&#x30BF;vec{\alpha} = (5,5,5)&#x306E;&#x3068;&#x304D;&#x306E;&#x30C7;&#x30A3;&#x30EA;&#x30AF;&#x30EC;&#x5206;&#x5E03;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>パラメータ$\vec{\alpha} = [5,5,5]$のときのディリクレ分布</figcaption></figure></p> <p>パラメータ$\vec{\alpha} = [5,1,1]$: $x_1$が一番起きやすいので$x_1$の値が1付近で密度関数が高くなる.</p> <pre class="code lang-python" data-lang="python" data-unlink>%matplotlib widget diri = Dirichlet([<span class="synConstant">5.</span>,<span class="synConstant">1.</span>,<span class="synConstant">1.</span>]) diri.plt_3d() </pre> <p><figure class="figure-image figure-image-fotolife" title="パラメータ$\vec{\alpha} = [5,1,1]$のときのディリクレ分布"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210227/20210227035727.png" alt="&#x30D1;&#x30E9;&#x30E1;&#x30FC;&#x30BF;\vec{\alpha} = (5,1,1)&#x306E;&#x3068;&#x304D;&#x306E;&#x30C7;&#x30A3;&#x30EA;&#x30AF;&#x30EC;&#x5206;&#x5E03;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>パラメータ$\vec{\alpha} = [5,1,1]$のときのディリクレ分布</figcaption></figure></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fy-mattu.hatenablog.com%2Fentry%2F2016%2F03%2F03%2F143451" title="多項分布とディリクレ分布のまとめと可視化 - ★データ解析備忘録★" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://y-mattu.hatenablog.com/entry/2016/03/03/143451">y-mattu.hatenablog.com</a></cite></p></li> </ul> <p></aside></p> Sat, 27 Feb 2021 04:38:28 +0900 hatenablog://entry/26006613696848754 確率・統計 Python 2020年代でも環境構築できる論理型言語のメモ https://cartman0.hatenablog.com/entry/2021/01/24/2020%E5%B9%B4%E4%BB%A3%E3%81%A7%E3%82%82%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%A7%E3%81%8D%E3%82%8B%E8%AB%96%E7%90%86%E5%9E%8B%E8%A8%80%E8%AA%9E%E3%81%AE%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="2020年代でも環境構築できる論理型言語のメモ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/2020%C7%AF%C2%E5">2020年代</a>でも環境構築できる論理型言語のメモ</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/2020%C7%AF%C2%E5">2020年代</a>でも使えそうな論理型言語のメモ. 論理型言語自体アカデミック向けだったり最近の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%CD%B9%A9%C3%CE%C7%BD">人工知能</a>はディープニューラル系が多いので情報が少ない.</p> <p>このあたり<a href="http://minikanren.org/#papers">http://minikanren.org/#papers</a> を見ると,最近では"Program Synthesis"というコードの自動生成(Quin生成)の分野では活躍してるぽい.</p> <p>結論から列挙すると以下が良さげ.</p> <ul> <li><a href="https://www.swi-prolog.org/">SWI-Prolog</a>(+<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>+pyswip)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a> + <a href="https://clojure.org/">Clojure + core.logic</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> + <a href="https://docs.hylang.org/en/stable/">Hy</a> + miniKanrenライブラリ</li> <li><a href="https://racket-lang.org/">Racket</a>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>から派生</li> <li>好きな言語+<a href="http://minikanren.org/">mini/microKanren</a></li> </ul> <p><nav></p> <ul class="table-of-contents"> <li><a href="#2020年代でも環境構築できる論理型言語のメモ">2020年代でも環境構築できる論理型言語のメモ</a><ul> <li><a href="#Prolog">Prolog</a><ul> <li><a href="#Swi-prolog">Swi-prolog</a></li> </ul> </li> <li><a href="#Clojure">Clojure</a></li> <li><a href="#miniKanren">miniKanren</a><ul> <li><a href="#microKanren">microKanren</a></li> </ul> </li> <li><a href="#Prolog-vs-miniKanren">Prolog vs miniKanren</a></li> <li><a href="#Hy">Hy</a></li> <li><a href="#Racket">Racket</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="Prolog"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a></h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/prolog">prolog</a>のコードは次の3要素で構成される.</p> <ul> <li>fact(事実)</li> <li>rule(規則;条件(goal)付き事実で,手続き言語でいう"function"に近い)</li> <li>query(質問): <a class="keyword" href="http://d.hatena.ne.jp/keyword/sql">sql</a>の問い合わせみたいなもの</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/prolog">prolog</a>ではfactとruleの集まりをknowledge base(database)という.これを読み込んで,queryで解を求める.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/prolog">prolog</a>の基本操作としては</p> <ul> <li>unify(単一化):論理変数同士の値が同じになるように処理が進む.</li> <li>backtrack(バックトラック):解が見つからなかったら戻って別の解を見つける.</li> <li>cut(カット): <code>!</code> :バックトラックを止めて制御する. 1回は動作して2回目以降<code>!</code>の左側とそれ以降のheadは動作しない.continue+breakのような振る舞いをする.</li> </ul> <p><section></p> <h3 id="Swi-prolog">Swi-<a class="keyword" href="http://d.hatena.ne.jp/keyword/prolog">prolog</a></h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%E0%A5%B9%A5%C6%A5%EB%A5%C0%A5%E0">アムステルダム</a>大学が開発.</p> <p><a href="https://www.swi-prolog.org/">https://www.swi-prolog.org/</a></p> <p>特徴:</p> <ul> <li>各OSでのインストール手段がある</li> <li>開発がまだ盛んに進んでいる</li> <li>ドキュメント充実してる.<a href="https://www.swi-prolog.org/pldoc/doc_for?object=manual">https://www.swi-prolog.org/pldoc/doc_for?object=manual</a></li> <li>Docker imageがDocker公式で提供されている.<a href="https://hub.docker.com/_/swipl">https://hub.docker.com/_/swipl</a></li> </ul> <p>特にDocker imageのおかげで,OSを気にせず環境構築できる. デメとして,Docker imageを利用すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>のライブラリがなく,組み込みの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Emacs">Emacs</a>が使えない.</p> <p></section></p> <p></section></p> <p><section></p> <h2 id="Clojure"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Clojure">Clojure</a></h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>上で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Lisp">Lisp</a>方言を使えるようにした言語</p> <p>公式:<a href="https://clojure.org/">https://clojure.org/</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>はopenJDKでも動作する.</p> <p><code>core.logic</code>がminiKanrenになっており<a class="keyword" href="http://d.hatena.ne.jp/keyword/prolog">prolog</a>のような処理もできる.</p> <p>Docker公式のイメージもある.</p> <p><a href="https://hub.docker.com/_/clojure">https://hub.docker.com/_/clojure</a></p> <p></section></p> <p><section></p> <h2 id="miniKanren">miniKanren</h2> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fminikanren.org%2F" title="miniKanren.org" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://minikanren.org/">minikanren.org</a></cite></p> <p>miniKanrenは,論理プログラミングのための<a class="keyword" href="http://d.hatena.ne.jp/keyword/Domain%20Specific%20Language">Domain Specific Language</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/DSL">DSL</a>).</p> <p>"Kanren"という名前は日本語の”関連”からきてるらしい.</p> <p>Clogureの<code>core.logic</code>もこれになる. <code>membro</code>や<code>member</code>などがユーザレベルで定義されている.</p> <p>各言語で実装されている. この<a class="keyword" href="http://d.hatena.ne.jp/keyword/DSL">DSL</a>上の各機能の厳密な定義はなさそう. <a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>のcore-levelの機能を調べれば必要interfaceがわかりそう.</p> <p>近いのはこの論文か?</p> <p><a href="https://search.proquest.com/docview/304903505">Byrd, William, "Relational programming in miniKanren: Techniques, applications, and implementations", E.Indiana University, ProQuest Dissertations Publishing, 2009. 3380156.</a></p> <p>教科書的な本は</p> <p><a href="https://mitpress.mit.edu/books/reasoned-schemer-second-edition">Daniel P. Friedman, William E. Byrd, Oleg Kiselyov, and Jason Hemann, "The Reasoned Schemer, Second Edition", The MIT Press, Cambridge, MA, 2018</a></p> <p>miniKanrenは<a class="keyword" href="http://d.hatena.ne.jp/keyword/prolog">prolog</a>と違ってバックトラックを持たない.</p> <p><section></p> <h3 id="microKanren">microKanren</h3> <p>2013年に登場.論文はこれ</p> <p><a href="http://webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf">http://webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf</a></p> <p>miniKanrenファミリの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%CB%A5%DE%A5%EA%A5%B9%A5%C8">ミニマリスト</a>言語. その実装は、40行未満の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>で構成される。 (おそらくcore部分のみ) この量でminiKanrenと同じ機能が実装できる.</p> <p>上論文の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>での実際の実装が<a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>にある.</p> <p><a href="https://github.com/jasonhemann/microKanren">GitHub - jasonhemann/microKanren: The implementation of microKanren, a featherweight relational programming language</a></p> <p>実装の参考になりそうな論文は</p> <ul> <li><a href="https://dl.acm.org/doi/abs/10.1145/2989225.2989230">Jason Hemann, Daniel P. Friedman, William E Byrd, "A small embedding of logic programming with a simple complete search", 2016</a>: 上のmicroKanrenを改善したやつ</li> </ul> <p></section></p> <p></section></p> <p><section></p> <h2 id="Prolog-vs-miniKanren"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a> vs miniKanren</h2> <p>ここのstackoverflow <a href="https://stackoverflow.com/questions/28467011/what-are-the-main-technical-differences-between-prolog-and-minikanren-with-resp">https://stackoverflow.com/questions/28467011/what-are-the-main-technical-differences-between-prolog-and-minikanren-with-resp</a> の解答にまとまっている.</p> <p>miniKanren公式にも同じ解説がある.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fminikanren.org%2Fminikanren-and-prolog.html" title="miniKanren.org" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://minikanren.org/minikanren-and-prolog.html">minikanren.org</a></cite></p> <p>以下,テキトーに日本語訳したもの.</p> <blockquote><p>それでも、miniKanrenと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>は異なる設計哲学を持っており、異なる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5">トレードオフ</a>を行います。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>: シンボリック<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%CD%B9%A9%C3%CE%C7%BD">人工知能</a>プログラミング用の2つの古典言語の1つです(他の古典言語は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Lisp">Lisp</a>です)。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>は、宣言的知識が一階述語論理で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9">エンコード</a>されるシンボリックルールベースのシステムの実装に優れています。この言語は、論理的な純粋さを犠牲にして、これらのタイプのアプリケーションの表現力と効率を高めるように最適化されています。たとえば、デフォルトでは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>は統合で「発生チェック」を使用しません。数学/論理の観点から、このバージョンの統合は正しくありません。ただし、発生チェックはコストがかかり、ほとんどの場合、発生チェックがなくても問題はありません。これは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%BC%A4%B5%CD%A5%C0%E8%C3%B5%BA%F7">深さ優先探索</a>を使用し、カット(!)を使用してバックトラックを制御するのと同様に、非常に実用的な設計上の決定です。これらの決定は、1970年代のハードウェアで実行する場合に絶対に必要であり、今日では、大きな問題に取り組む場合や、巨大な(多くの場合無限の)検索スペースを扱う場合に非常に役立ちます。</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>は、カット、アサート、リト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>ト、isを使用した算術演算用の変数の射影など、多くの「論理外」または「非論理」機能をサポートしています。これらの機能の多くは、複雑な制御フローを表現し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>の事実のグローバルデータベースを操作することを容易にします。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>の非常に興味深い機能の1つは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>コード自体がファクトのグローバルデータベースに格納されており、実行時にクエリを実行できることです。これにより、解釈中の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>コードの動作を変更するメタ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%D7%A5%EA%A5%BF">インタープリタ</a>を作成するのは簡単になります。たとえば、検索順序を変更するメタ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%D7%A5%EA%A5%BF">インタープリタ</a>ーを使用して、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%FD%CD%A5%C0%E8%C3%B5%BA%F7">幅優先探索</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9">エンコード</a>することができます。これは非常に強力な手法であり、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>の世界以外ではあまり知られていません。 「The Art of <a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>」では、この手法について詳しく説明しています。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>の実装を改善するために多大な努力が払われており、そのほとんどはWarren Abstract Machine(WAM)に基づいています。 WAMは、値が論理変数に破壊的に割り当てられる副作用モデルを使用します。これらの副作用は、バックトラック時に元に戻されます。 WAMの命令を拡張することにより、多くの機能を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>に追加することができます。このアプローチの欠点の1つは、WAMをしっかりと理解していなければ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>の実装ペーパーを読むのが難しい場合があることです。一方、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>実装者は、実装の問題を議論するための共通のモデルを持っています。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>と並行して多くの研究が行われ、1990年代にAndorraPrologで最高潮に達しました。これらのア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C7%A5%A2">イデア</a>の少なくともいくつかは、CiaoPrologに残っています。 (Ciao <a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>は興味深いア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C7%A5%A2">イデア</a>でいっぱいで、その多くは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>標準をはるかに超えています。)</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>には、非常に簡潔なプログラムを実現する、美しい統合ベースの「パターンマッチング」スタイルの構文があります。 LispersがS式を愛するように、プロローガーは構文を愛します。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>には、標準述語の大規模なライブラリもあります。 WAMを高速化するために行われたすべてのエンジニアリングにより、非常に有能で成熟した<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>実装があります。その結果、多くの大規模な知識ベースのシステムは完全に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>で書かれています。</p> <p>miniKanrenは、小さく、理解しやすく、ハッキングしやすい実装を備えた、最小限の論理<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>として設計されました。 miniKanrenは元々<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>に組み込まれており、過去10年間で他の数十のホスト言語に移植されてきました。最も人気のあるminiKanrenの実装は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Clojure">Clojure</a>の「<code>core.logic</code>」です。これには、多くの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>のような<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>と多くの最適化が含まれています。最近、miniKanren実装のコアがさらに単<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%E3%B2%BD">純化</a>され、「microKanren」と呼ばれる小さな「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%AF%A5%ED%A5%AB%A1%BC%A5%CD%A5%EB">マイクロカーネル</a>」が作成されました。その後、miniKanrenをこのmicroKanrenコア上に実装できます。 microKanrenまたはminiKanrenを新しいホスト言語に移植することは、miniKanrenを学ぶ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>にとって標準的な演習になっています。 その結果、最も人気のある<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E2%B5%E9%B8%C0%B8%EC">高級言語</a>には、少なくとも1つのminiKanrenまたはmicroKanrenが実装されています。</p> <p>miniKanrenとmicroKanrenの標準実装には、1つの例外を除いて、突然変異やその他の副作用は含まれていません。miniKanrenの一部のバージョンでは、論理変数の比較に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DD%A5%A4%A5%F3%A5%BF%A1%BC">ポインター</a>の等価性が使用されます。私はこれを「良性の効果」と考えていますが、多くの実装では、実装にカウンターを渡すことでこの効果すら回避しています。グローバルファクトデータベースもありません。 miniKanrenの実装哲学は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%D8%BF%F4%B7%BF%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0">関数型プログラミング</a>に触発されています。突然変異と影響は避け、すべての言語構造は字句スコープを尊重する必要があります。実装を注意深く見ると、いくつかの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E2%A5%CA%A5%C9">モナド</a>を見つけることさえできるかもしれません。検索の実装は、ミューテーションを使用せずに、レイ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A1%BC">ジー</a>ストリームを組み合わせて操作することに基づいています。これらの実装の選択は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>とは非常に異なる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5">トレードオフ</a>につながります。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>では、変数ルックアップは一定時間ですが、バックトラックには副作用を元に戻す必要があります。 miniKanrenでは、変数ルックアップはより高価ですが、バックトラックは「無料」です。実際、ストリームの処理方法が原因で、miniKanrenにはバックトラックはありません。</p> <p>miniKanren実装の興味深い側面の1つは、コードが本質的にスレッドセーフであり、---少なくとも理論的には---簡単に並列化できることです。もちろん、各スレッドまたはプロセスに並列化のオーバーヘッドを補うのに十分な作業を与える必要があることを考えると、コードを遅くせずに並列化することは簡単ではありません。それでも、これはminiKanrenの実装分野であり、もっと注目され、実験されることを願っています。</p> <p>miniKanrenは、unifyのために発生チェックを使用し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%BC%A4%B5%CD%A5%C0%E8%C3%B5%BA%F7">深さ優先探索</a>の代わりに完全なインターリーブ検索を使用します。インターリーブ検索は深さ優先検索よりも多くのメモリを使用しますが、深さ優先検索が永久に分岐/ループする場合には答えを見つけることができます。 miniKanrenは、いくつかの特別な論理<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>(<code>conda</code>、<code>condu</code>、<code>project</code>など)をサポートしています。 <code>conda</code>と<code>condu</code>を使用して<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>のカットをシミュレートでき、<code>project</code>を使用して論理変数に関連付けられた値を取得できます。</p> <p><code>conda</code>、<code>condu</code>、および<code>project</code>の存在---および検索戦略を簡単に変更する機能---により、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE%A1%BC">プログラマー</a>は、埋め込まれた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>のような言語としてminiKanrenを使用できます。これは、多くの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>のような<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>を含む<a class="keyword" href="http://d.hatena.ne.jp/keyword/Clojure">Clojure</a>の「core.logic」のユーザーに特に当てはまります。 miniKanrenのこの「実用的な」使用は、業界でのminiKanrenの使用の大部分を占めているようです。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Clojure">Clojure</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>、または<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>で記述された既存のアプリケーションに知識ベースの推論システムを追加したい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE%A1%BC">プログラマー</a>は、通常、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>でアプリケーション全体を書き直すことに関心がありません。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Clojure">Clojure</a>または<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>に小さな論理<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>を組み込むことははるかに魅力的です。埋め込まれた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>の実装は、おそらくこの目的のためにも同様に機能します。 miniKanrenは、「The Reasoned Schemer」の発行以降に発表された講演、ブログ投稿、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB">チュートリアル</a>、その他の教材に加えて、小さくて純粋なコア実装により、組み込みロジック言語として人気が高まっていると思います。</p> <p>miniKanrenは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>と精神的に似た実用的な組み込み論理<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>として使用されているだけでなく、「リレーショナル」プログラミングの研究にも使用されています。つまり、数学関数ではなく数学関係として動作するプログラムを作成する場合です。たとえば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>では、append関数は2つのリストを追加して、新しいリストを返すことができます。関数呼び出し<code>(append '(a b c)'(d e))</code>はリスト<code>(a b c d e)</code>を返します。ただし、appendを2つの引数関数としてではなく、3つの場所の関係として扱うこともできます。次に、呼び出し<code>(appendo '(a b c)'(d e)Z)</code>は、論理変数Zをリスト<code>(a b c d e)</code>に関連付けます。もちろん、論理変数を他の位置に配置すると、状況はさらに興味深いものになります。呼び出し<code>(appendo X '(de)'(abcde))</code>はXを<code>(abc)</code>に関連付け、呼び出し<code>(appendo XY '(abcde))</code>はXとYを、追加されると<code>(abcde)</code>に等しいリストのペアに関連付けます。 )。たとえば、<code>X =(a b)</code>と<code>Y =(c d e)</code>はそのような値のペアの1つです。 <code>(appendo X Y Z)</code>と書くこともできます。これは、リストX、Y、およびZのトリプルを無限に生成し、XをYに追加するとZが生成されます。</p> <p>このリレーショナルバージョンの<code>append</code>は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>で簡単に表現でき、実際、多くの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB">チュートリアル</a>で示されています。実際には、より複雑な<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>プログラムは、カットなどの少なくともいくつかの特別な機能を使用する傾向があり、結果のプログラムを関係として扱う能力を阻害します。対照的に、miniKanrenは、このスタイルのリレーショナルプログラミングをサポートするように明示的に設計されています。 miniKanrenの最近のバージョンでは、シンボリック制約の解決(シンボロ、ナンバー、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D6%A5%B5%A5%F3">アブサン</a>、不等式制約、名目論理プログラミング)がサポートされており、重要なプログラムをリレーションとして簡単に記述できます。実際には、miniKanrenの特別な機能を使用することはなく、すべてのminiKanrenプログラムをリレーションとして作成します。最も興味深いリレーショナルプログラムは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>のサブセットのリレーショナル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%D7%A5%EA%A5%BF">インタープリタ</a>ーです。これらの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>には、リストに評価される100万の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>プログラム(I love you)を生成したり、クイン(自分自身に評価されるプログラム)を簡単に生成したりするなど、多くの興味深い機能があります。</p> <p>miniKanrenは、このリレーショナルスタイルのプログラミングを可能にするためにいくつかの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5">トレードオフ</a>を行います。これは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>が行う<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5">トレードオフ</a>とは大きく異なります。時が経つにつれて、miniKanrenはより多くの記号制約を追加し、実際には記号指向の制約論理<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>になりました。多くの場合、これらのシンボリック制約により、conduやprojectなどの論理外の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>の使用を避けることが実用的になります。その他の場合、これらのシンボリック制約は十分ではありません。シンボリック制約のより良いサポートは、関係としてより大きくより複雑なプログラムをどのように書くかというより広い問題とともに、miniKanren研究の1つの活発な領域です。</p> <p>要するに、miniKanrenと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>はどちらも興味深い機能、実装、使用法を持っており、両方の言語からア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C7%A5%A2">イデア</a>を学ぶ価値があると思います。 Mercury、Curry、Gödelなど、他にも非常に興味深い論理<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>があり、それぞれが独自の論理プログラミングを採用しています。</p> <p>最後に、いくつかのminiKanrenリソースを紹介します。</p> <ul> <li>miniKanrenのメインWebサイト:<a href="http://minikanren.org/">http://minikanren.org/</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>との比較を含む、リレーショナルプログラミングとminiKanrenについてのインタビュー:<a href="http://www.infoq.com/interviews/byrd-relational-programming-minikanren">http://www.infoq.com/interviews/byrd-relational-programming-minikanren</a></li> </ul> </blockquote> <p></section></p> <p><section></p> <h2 id="Hy"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Hy">Hy</a></h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Lisp">Lisp</a>方言を使えるようにしたもの. <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>上で動作して<a class="keyword" href="http://d.hatena.ne.jp/keyword/Hy">Hy</a>の式を<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>への変換もできる.</p> <p><a href="https://docs.hylang.org/en/stable/">The Hy Manual &mdash; hy 0.20.0+1.g0e4d576c documentation</a></p> <p>docker imageがDocker公式から出ている.</p> <p><a href="https://hub.docker.com/_/hylang">https://hub.docker.com/_/hylang</a></p> <p>※日本のバンドではない.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Hy">Hy</a>上のminiKanrenの実装はいくつかあるが, <a href="https://pypi.org/project/adderall/">adderall</a>が使いすそう,</p> <p></section></p> <p><section></p> <h2 id="Racket">Racket</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>から派生した言語.研究向け.</p> <ul> <li>公式:<a href="https://racket-lang.org/">Racket</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Github">Github</a>: <a href="https://github.com/racket/racket">GitHub - racket/racket: The Racket repository</a></li> </ul> <p>Dockerイメージはracket公式が出してるものがある. <a href="https://hub.docker.com/r/racket/racket-ci">https://hub.docker.com/r/racket/racket-ci</a></p> <p><a href="https://mitpress.mit.edu/sites/default/files/sicp/index.html">SchemeバイブルのSICP本</a>用のパッケージも用意されてる.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.racket-lang.org%2Fsicp-manual%2Findex.html" title="SICP Collections" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://docs.racket-lang.org/sicp-manual/index.html">docs.racket-lang.org</a></cite></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li>[http://minikanren.org/:title]</li> <li>[http://minikanren.org/minikanren-and-prolog.html]</li> </ul> <p></aside></p> Sun, 24 Jan 2021 02:07:22 +0900 hatenablog://entry/26006613682192177 論理型言語 gccのコンパイルの流れとオプションのメモ https://cartman0.hatenablog.com/entry/2021/01/15/gcc%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%AE%E6%B5%81%E3%82%8C%E3%81%A8%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="gccのコンパイルの流れとオプションのメモ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>の流れとオプションのメモ</h1> <p>docker利用により<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>でも<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>など使わずとも手軽に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Unix">Unix</a>ベースの<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>が利用できるようになった.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>での中間コード(Intermediate code; <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード), オブジェクトコード(Object code), 実行ファイル(Executable file)の流れとオプションを使った生成のメモ.</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#gccのコンパイルの流れとオプションのメモ">gccのコンパイルの流れとオプションのメモ</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#コンパイラの流れ特にgcc">コンパイラの流れ(特にgcc)</a></li> <li><a href="#gccでの例">gccでの例</a><ul> <li><a href="#中間アセンブリコードの生成-Sオプション">中間(アセンブリ)コードの生成(-Sオプション)</a></li> <li><a href="#アセンブラからオブジェクトコードの生成-cオプション">アセンブラからオブジェクトコードの生成(-cオプション)</a></li> <li><a href="#実行ファイルの生成-oオプション">実行ファイルの生成(-oオプション)</a><ul> <li><a href="#複数のオブジェクトコードから実行ファイルの生成">複数のオブジェクトコードから実行ファイルの生成</a></li> </ul> </li> </ul> </li> <li><a href="#静的ライブラリファイルからオブジェクトコードを抽出する">(静的)ライブラリファイルからオブジェクトコードを抽出する</a></li> <li><a href="#逆アセンブリでオブジェクトコードから中間アセンブリコードを生成する">逆アセンブリでオブジェクトコードから中間(アセンブリ)コードを生成する</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 <ul> <li>Docker Desktop <ul> <li><a href="https://hub.docker.com/_/gcc">gcc image</a></li> </ul> </li> <li>WSL2 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> 20.04 LTS (動作確認用)</li> </ul> </li> </ul> </li> </ul> <p></section></p> <p><sectioin></p> <h2 id="コンパイラの流れ特にgcc"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>の流れ(特に<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>)</h2> <p>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>処理系でない)一般的な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>の流れとして, <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>(<code>.c</code>)があったときに<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>に投げて実行ファイルができるまでは以下の流れになる.</p> <ol> <li>字句解析</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%BD%CA%B8%B2%F2%C0%CF">構文解析</a></li> <li>中間コード(Intermediate code; <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード)が生成される</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%E9">アセンブラ</a>(assembler):<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%E9">アセンブラ</a>に通すとオブジェクトコード(Object code)が生成される</li> <li>リンカ(linker):オブジェクトコードと標準ライブラリなどのオブジェクトコードをリンクしてひとまとめにすると実行ファイル(Executable file)になる.</li> </ol> <p>各ファイル形式をまとめると</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E2%B5%E9%B8%C0%B8%EC">高級言語</a>で書かれていて今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%B8%C0%B8%EC">C言語</a>でCのコード.拡張子は<code>.c</code>.</li> <li>中間コード,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード:テキスト形式.中身は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード(低級言語で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>で使われるようなコード).<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>では<code>.s</code>ファイルとして出力される.</li> <li>オブジェクトコード: バイナリ形式.ただしリンクされていないので実行はできない.開くには<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%CA%A5%EA%A5%A8%A5%C7%A5%A3%A5%BF">バイナリエディタ</a>か<code>od</code>コマンドが必要.拡張子は<code>.o</code>ファイル.</li> <li>実行ファイル:オブジェクトコードとほぼ同じだがライブラリとリンクして実行可能になったファイル. <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>: PE形式,拡張子は<code>.exe</code>ファイル</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Unix">Unix</a>: ELF形式,拡張子は<code>.out</code>かなし</li> </ul> </li> </ul> <p>オブジェクトファイルと実行ファイルの中身は,いわゆるマシンコード(machine code)と呼ばれる.</p> <p></sectioin></p> <p><section></p> <h2 id="gccでの例"><a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>での例</h2> <p>以下のcで書かれたhellowoldのソースがあったとする.</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include</span><span class="synConstant">&lt;stdio.h&gt;</span> <span class="synType">int</span> main(<span class="synType">void</span>){ printf(<span class="synConstant">&quot;hello world</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>); <span class="synStatement">return</span> <span class="synConstant">0</span>; } </pre> <p><section></p> <h3 id="中間アセンブリコードの生成-Sオプション">中間(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>)コードの生成(<code>-S</code>オプション)</h3> <p><code>-S</code>オプション(大文字)で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード(<code>.s</code>ファイル)を生成できる.</p> <p><a href="https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#index-S">https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#index-S</a></p> <p>ソース -> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード:</p> <pre class="code" data-lang="" data-unlink>gcc -S hello.c</pre> <p>Dockerの<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>イメージなら</p> <pre class="code" data-lang="" data-unlink>docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest gcc -S hello.c</pre> <p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード<code>hello.s</code>が生成される.</p> <pre class="code assembly" data-lang="assembly" data-unlink> .file &#34;hello.c&#34; .text .section .rodata .LC0: .string &#34;hello world&#34; .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi call puts movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident &#34;GCC: (GNU) 10.1.0&#34; .section .note.GNU-stack,&#34;&#34;,@progbits</pre> <p></section></p> <p><section></p> <h3 id="アセンブラからオブジェクトコードの生成-cオプション"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%E9">アセンブラ</a>からオブジェクトコードの生成(<code>-c</code>オプション)</h3> <p><code>-c</code>オプションでオブジェクトコード<code>.o</code>を生成できる.</p> <p><a href="https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#index-c">https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#index-c</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>コード -> オブジェクトコード:</p> <pre class="code" data-lang="" data-unlink>gcc -c hello.s</pre> <p>ソース -> オブジェクトコード:</p> <p> こっちのほうが一般的.</p> <pre class="code" data-lang="" data-unlink>gcc -c hello.c</pre> <p>dockerの<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>イメージでも同様に</p> <pre class="code" data-lang="" data-unlink>docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest gcc -c hello.c</pre> <p><code>hello.o</code>が生成される.</p> <p>WSL上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>で<code>od</code>コマンドで中を見る.</p> <ul> <li><code>-A x</code>: 値の表示を16進数に変更</li> <li><code>-t x1z</code>: <code>x</code>(16進数)で<code>1</code>byteずつ,<code>z</code>で行末に出力可能文字の出力</li> </ul> <pre class="code" data-lang="" data-unlink>:/mnt/c/Users/&lt;user&gt;/Desktop/c$ od -t x1z -A x hello/hello.o 000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 &gt;.ELF............&lt; 000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 &gt;..&gt;.............&lt; 000020 00 00 00 00 00 00 00 00 80 02 00 00 00 00 00 00 &gt;................&lt; 000030 00 00 00 00 40 00 00 00 00 00 40 00 0d 00 0c 00 &gt;....@.....@.....&lt; 000040 55 48 89 e5 bf 00 00 00 00 e8 00 00 00 00 b8 00 &gt;UH..............&lt; 000050 00 00 00 5d c3 68 65 6c 6c 6f 20 77 6f 72 6c 64 &gt;...].hello world&lt; 000060 00 00 47 43 43 3a 20 28 47 4e 55 29 20 31 30 2e &gt;..GCC: (GNU) 10.&lt; 000070 31 2e 30 00 00 00 00 00 14 00 00 00 00 00 00 00 &gt;1.0.............&lt; 000080 01 7a 52 00 01 78 10 01 1b 0c 07 08 90 01 00 00 &gt;.zR..x..........&lt; 000090 1c 00 00 00 1c 00 00 00 00 00 00 00 15 00 00 00 &gt;................&lt; 0000a0 00 41 0e 10 86 02 43 0d 06 50 0c 07 08 00 00 00 &gt;.A....C..P......&lt; 0000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0000c0 00 00 00 00 00 00 00 00 01 00 00 00 04 00 f1 ff &gt;................&lt; 0000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0000e0 00 00 00 00 03 00 01 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0000f0 00 00 00 00 00 00 00 00 00 00 00 00 03 00 03 00 &gt;................&lt; 000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000110 00 00 00 00 03 00 04 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000120 00 00 00 00 00 00 00 00 00 00 00 00 03 00 05 00 &gt;................&lt; 000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000140 00 00 00 00 03 00 07 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000150 00 00 00 00 00 00 00 00 00 00 00 00 03 00 08 00 &gt;................&lt; 000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000170 00 00 00 00 03 00 06 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000180 00 00 00 00 00 00 00 00 09 00 00 00 12 00 01 00 &gt;................&lt; 000190 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 &gt;................&lt; 0001a0 0e 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0001b0 00 00 00 00 00 00 00 00 00 68 65 6c 6c 6f 2e 63 &gt;.........hello.c&lt; 0001c0 00 6d 61 69 6e 00 70 75 74 73 00 00 00 00 00 00 &gt;.main.puts......&lt; 0001d0 05 00 00 00 00 00 00 00 0a 00 00 00 05 00 00 00 &gt;................&lt; 0001e0 00 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 &gt;................&lt; 0001f0 04 00 00 00 0a 00 00 00 fc ff ff ff ff ff ff ff &gt;................&lt; 000200 20 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 &gt; ...............&lt; 000210 00 00 00 00 00 00 00 00 00 2e 73 79 6d 74 61 62 &gt;..........symtab&lt; 000220 00 2e 73 74 72 74 61 62 00 2e 73 68 73 74 72 74 &gt;..strtab..shstrt&lt; 000230 61 62 00 2e 72 65 6c 61 2e 74 65 78 74 00 2e 64 &gt;ab..rela.text..d&lt; 000240 61 74 61 00 2e 62 73 73 00 2e 72 6f 64 61 74 61 &gt;ata..bss..rodata&lt; 000250 00 2e 63 6f 6d 6d 65 6e 74 00 2e 6e 6f 74 65 2e &gt;..comment..note.&lt; 000260 47 4e 55 2d 73 74 61 63 6b 00 2e 72 65 6c 61 2e &gt;GNU-stack..rela.&lt; 000270 65 68 5f 66 72 61 6d 65 00 00 00 00 00 00 00 00 &gt;eh_frame........&lt; 000280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; * 0002c0 20 00 00 00 01 00 00 00 06 00 00 00 00 00 00 00 &gt; ...............&lt; 0002d0 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 &gt;........@.......&lt; 0002e0 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0002f0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000300 1b 00 00 00 04 00 00 00 40 00 00 00 00 00 00 00 &gt;........@.......&lt; 000310 00 00 00 00 00 00 00 00 d0 01 00 00 00 00 00 00 &gt;................&lt; 000320 30 00 00 00 00 00 00 00 0a 00 00 00 01 00 00 00 &gt;0...............&lt; 000330 08 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 &gt;................&lt; 000340 26 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 &gt;&amp;...............&lt; 000350 00 00 00 00 00 00 00 00 55 00 00 00 00 00 00 00 &gt;........U.......&lt; 000360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000370 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000380 2c 00 00 00 08 00 00 00 03 00 00 00 00 00 00 00 &gt;,...............&lt; 000390 00 00 00 00 00 00 00 00 55 00 00 00 00 00 00 00 &gt;........U.......&lt; 0003a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0003b0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0003c0 31 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 &gt;1...............&lt; 0003d0 00 00 00 00 00 00 00 00 55 00 00 00 00 00 00 00 &gt;........U.......&lt; 0003e0 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0003f0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000400 39 00 00 00 01 00 00 00 30 00 00 00 00 00 00 00 &gt;9.......0.......&lt; 000410 00 00 00 00 00 00 00 00 61 00 00 00 00 00 00 00 &gt;........a.......&lt; 000420 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000430 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 &gt;................&lt; 000440 42 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 &gt;B...............&lt; 000450 00 00 00 00 00 00 00 00 74 00 00 00 00 00 00 00 &gt;........t.......&lt; 000460 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000470 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000480 57 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 &gt;W...............&lt; 000490 00 00 00 00 00 00 00 00 78 00 00 00 00 00 00 00 &gt;........x.......&lt; 0004a0 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;8...............&lt; 0004b0 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0004c0 52 00 00 00 04 00 00 00 40 00 00 00 00 00 00 00 &gt;R.......@.......&lt; 0004d0 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 &gt;................&lt; 0004e0 18 00 00 00 00 00 00 00 0a 00 00 00 08 00 00 00 &gt;................&lt; 0004f0 08 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 &gt;................&lt; 000500 01 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000510 00 00 00 00 00 00 00 00 b0 00 00 00 00 00 00 00 &gt;................&lt; 000520 08 01 00 00 00 00 00 00 0b 00 00 00 09 00 00 00 &gt;................&lt; 000530 08 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 &gt;................&lt; 000540 09 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000550 00 00 00 00 00 00 00 00 b8 01 00 00 00 00 00 00 &gt;................&lt; 000560 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000570 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000580 11 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 000590 00 00 00 00 00 00 00 00 18 02 00 00 00 00 00 00 &gt;................&lt; 0005a0 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;a...............&lt; 0005b0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &gt;................&lt; 0005c0</pre> <p>最後に何バイトあるか16進数で表示される. つまり<code>x0005c0</code>=1472バイト,これがファイルサイズになる. <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>側で<code>hello.o</code>のプロパティをみるとサイズが一致する.</p> <p><figure class="figure-image figure-image-fotolife" title="ファイルサイズ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20210115/20210115074445.png" alt="&#x30D5;&#x30A1;&#x30A4;&#x30EB;&#x30B5;&#x30A4;&#x30BA;&#x306B;&#x5BFE;&#x5FDC;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ファイルサイズ</figcaption></figure> </figure></p> <p></section></p> <p><section></p> <h3 id="実行ファイルの生成-oオプション">実行ファイルの生成(<code>-o</code>オプション)</h3> <p><code>-o</code>で出力ファイル名を指定する. 何も指定しないと<code>a.out</code>になる.</p> <p>オブジェクトコードから実行ファイルを生成するには直接オブジェクトコードを指定すればいい.</p> <pre class="code" data-lang="" data-unlink>gcc hello.o -o hello # or &gt; docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest gcc hello.o -o hello</pre> <p>WSL上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>で実行すると</p> <pre class="code" data-lang="" data-unlink>:/mnt/c/Users/&lt;user&gt;/Desktop/c$ ./hello/hello hello world</pre> <p><code>od</code>コマンドで中を見る. <code>printf</code>関数が静的にリンクされておりファイルが長くなっているので 最初と最後の3x16バイトを表示する.</p> <pre class="code" data-lang="" data-unlink>:/mnt/c/Users/&lt;user&gt;/Desktop/c$ od -t x1z -A x hello/hello 000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 &gt;.ELF............&lt; 000010 02 00 3e 00 01 00 00 00 40 10 40 00 00 00 00 00 &gt;..&gt;.....@.@.....&lt; 000020 40 00 00 00 00 00 00 00 b8 38 00 00 00 00 00 00 &gt;@........8......&lt; ... 003fe0 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 &gt;................&lt; 003ff0 00 00 00 00 00 00 00 00 &gt;........&lt; 003ff8</pre> <p><section></p> <h4 id="複数のオブジェクトコードから実行ファイルの生成">複数のオブジェクトコードから実行ファイルの生成</h4> <p>複数ソースの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>と同様の挙動になるが, 事前にオブジェクトコードを作っておけばそのままリンカで実行ファイルを生成できる. dll(so)のように一部の関数を書き換えて実行ファイルの生成ができる.</p> <p>実際に試すには, 独自関数を利用するように変更. ただしライブラリ化はしてないのでincludeはない.</p> <p><code>hello.c</code>:</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include</span><span class="synConstant">&lt;stdio.h&gt;</span> <span class="synType">int</span> main(<span class="synType">void</span>){ printf(<span class="synConstant">&quot;hello world</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>); printf(<span class="synConstant">&quot;</span><span class="synSpecial">%s</span><span class="synConstant">&quot;</span>, str_num(<span class="synConstant">0</span>)); <span class="synStatement">return</span>; } </pre> <p>オブジェクトコードを生成する.</p> <pre class="code" data-lang="" data-unlink>gcc -g -c hello.c -o hello2.o # or &gt; docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest gcc -g -c hello.c -o hello2.o hello.c: In function &#39;main&#39;: hello.c:5:21: warning: implicit declaration of function &#39;str_num&#39; [-Wimplicit-function-declaration] 5 | printf(&#34;%s\n&#34;, str_num(0)); |</pre> <p>関数が見つからないので警告がでるが,オブジェクトコードは生成される.</p> <p>このままオブジェクトコードから実行ファイルの生成をするとエラーになる.</p> <pre class="code" data-lang="" data-unlink>gcc hello2.o -o hello2 # or &gt; docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest gcc hello2.o -o hello2 /usr/bin/ld: hello2.o: in function `main&#39;: /usr/src/myapp/hello.c:5: undefined reference to `str_num&#39; collect2: error: ld returned 1 exit status</pre> <p>独自関数を別のソースファイルで定義する.</p> <p><code>str_num.c</code>:</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;stdio.h&gt;</span> <span class="synType">char</span> s[<span class="synConstant">5</span>]; <span class="synType">char</span>* str_num(<span class="synType">int</span> n){ snprintf(s, <span class="synConstant">5</span>, <span class="synConstant">&quot;</span><span class="synSpecial">%04d</span><span class="synConstant">&quot;</span>, n); <span class="synStatement">return</span> s; } </pre> <p>この関数のオブジェクトコードを生成する.</p> <pre class="code" data-lang="" data-unlink>gcc -c str_num.c -o str_num.o</pre> <p>2つのオブジェクトコードから実行ファイルを生成する.</p> <pre class="code" data-lang="" data-unlink>gcc hello2.o str_num.o -o hello2 # or &gt; docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest gcc hello2.o str_num.o -o hello2</pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> on WSL上で実行すると</p> <pre class="code" data-lang="" data-unlink>$ ./hello/hello2 hello world 0000</pre> <p></section></p> <p></section></p> <p></section></p> <p><section></p> <h2 id="静的ライブラリファイルからオブジェクトコードを抽出する">(静的)ライブラリファイルからオブジェクトコードを抽出する</h2> <p>例として,<code>printf.o</code>を抽出する.</p> <p>dockerの<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a> image内に<a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>で入る.</p> <pre class="code" data-lang="" data-unlink> docker run --rm -it -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest /bin/bash</pre> <p>標準ライブラリのライブラリファイル<code>libc.a</code>を探す.</p> <p>※(静的)ライブラリのファイル拡張子は</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/unix">unix</a>: <code>.a</code></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>: <code>.lib</code></li> </ul> <pre class="code" data-lang="" data-unlink>:/usr/src/myapp# find / -name libc.a /usr/lib/x86_64-linux-gnu/libc.a</pre> <p><code>ar</code>コマンドで中の関数を確認する.</p> <p>まず,<code>ar</code>コマンドが使えるかを確認する.</p> <pre class="code" data-lang="" data-unlink>:/usr/src/myapp# ar V GNU ar (GNU Binutils for Debian) 2.31.1 Copyright (C) 2018 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.</pre> <ul> <li>tオプション: 中のファイルをリスト表示</li> <li>vオプション:詳細表示</li> </ul> <pre class="code" data-lang="" data-unlink> ar tv /usr/lib/x86_64-linux-gnu/libc.a</pre> <p><a href="https://sourceware.org/binutils/docs/binutils/ar-cmdline.html#ar-cmdline">ar cmdline (GNU Binary Utilities)</a></p> <p>全部は表示しきれないので一部抜粋して表示すると</p> <pre class="code" data-lang="" data-unlink>rw-r--r-- 0/0 1040 Jan 1 00:00 1970 time.o rw-r--r-- 0/0 1496 Jan 1 00:00 1970 sleep.o rw-r--r-- 0/0 1608 Jan 1 00:00 1970 pause.o rw-r--r-- 0/0 3016 Jan 1 00:00 1970 fork.o rw-r--r-- 0/0 1272 Jan 1 00:00 1970 mkdir.o rw-r--r-- 0/0 496 Jan 1 00:00 1970 open.o rw-r--r-- 0/0 1712 Jan 1 00:00 1970 read.o rw-r--r-- 0/0 1712 Jan 1 00:00 1970 write.o rw-r--r-- 0/0 1744 Jan 1 00:00 1970 select.o rw-r--r-- 0/0 1760 Jan 1 00:00 1970 send.o rw-r--r-- 0/0 1272 Jan 1 00:00 1970 shutdown.o rw-r--r-- 0/0 1272 Jan 1 00:00 1970 socket.o rw-r--r-- 0/0 3288 Jan 1 00:00 1970 printf_chk.o rw-r--r-- 0/0 3160 Jan 1 00:00 1970 fprintf_chk.o rw-r--r-- 0/0 3048 Jan 1 00:00 1970 vprintf_chk.o rw-r--r-- 0/0 2928 Jan 1 00:00 1970 vfprintf_chk.o</pre> <p><code>printf_chk</code>関数はおそらくこっち. <a href="https://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/baselib---printf-chk-1.html">https://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/baselib---printf-chk-1.html</a></p> <p>ここには表示してないが<code>printf.o</code>も中に入ってる. 展開するには<code>x</code>オプションを使う.</p> <pre class="code" data-lang="" data-unlink>:/usr/src/myapp# ar x /usr/lib/x86_64-linux-gnu/libc.a printf.o :/usr/src/myapp# ls -l printf.o -rw-r--r-- 1 root root 1584 Jan 14 16:21 printf.o</pre> <p></section></p> <p><section></p> <h2 id="逆アセンブリでオブジェクトコードから中間アセンブリコードを生成する">逆<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>でオブジェクトコードから中間(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%EA">アセンブリ</a>)コードを生成する</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>コンテナに入る.</p> <pre class="code" data-lang="" data-unlink>&gt; docker run --rm -it -v ${PWD}:/usr/src/myapp -w /usr/src/myapp gcc:latest /bin/bash</pre> <p><code>objdump</code>が入ってるかを確認.</p> <pre class="code" data-lang="" data-unlink>:/usr/src/myapp# objdump -v GNU objdump (GNU Binutils for Debian) 2.31.1 Copyright (C) 2018 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.</pre> <ul> <li><code>-d, --disassemble</code>: Display assembler contents of executable sections</li> <li><code>-l, --line-numbers</code>: Include line numbers and filenames in output</li> </ul> <pre class="code" data-lang="" data-unlink>:/usr/src/myapp# objdump -d -l hello.o hello.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 &lt;main&gt;: main(): 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: bf 00 00 00 00 mov $0x0,%edi 9: e8 00 00 00 00 callq e &lt;main+0xe&gt; e: b8 00 00 00 00 mov $0x0,%eax 13: 5d pop %rbp 14: c3 retq</pre> <p>オブジェクトコードから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>まで見ることができる. <code>-S</code>オプションを使う.</p> <p>まず,<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>情報をつけてオブジェクトコードを作っておく.</strong></p> <pre class="code" data-lang="" data-unlink>gcc -g -c hello.c</pre> <pre class="code" data-lang="" data-unlink>:/usr/src/myapp# objdump hello.o -S hello.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 &lt;main&gt;: #include&lt;stdio.h&gt; int main(void){ 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp printf(&#34;hello world\n&#34;); 4: bf 00 00 00 00 mov $0x0,%edi 9: e8 00 00 00 00 callq e &lt;main+0xe&gt; return 0; e: b8 00 00 00 00 mov $0x0,%eax 13: 5d pop %rbp 14: c3 retq</pre> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="https://www.cs.miyazaki-u.ac.jp/~date/lectures/2009ics/kadai/gcc001ics.html">https://www.cs.miyazaki-u.ac.jp/~date/lectures/2009ics/kadai/gcc001ics.html</a></p></li> <li><p><a href="https://qiita.com/argama147/items/2f636a2f4fd76f6ce130">&#x30E9;&#x30A4;&#x30D6;&#x30E9;&#x30EA;&#x306E;&#x30EA;&#x30F3;&#x30AF;&#x65B9;&#x6CD5;&#x3092;&#x304D;&#x3063;&#x3061;&#x308A;&#x533A;&#x5225;&#x3057;&#x3088;&#x3046; - Qiita</a></p></li> <li><p><a href="https://corgi-lab.com/programming/c-lang/reverse-assemble/">&#x30D0;&#x30A4;&#x30CA;&#x30EA;&#x3092;&#x9006;&#x30A2;&#x30BB;&#x30F3;&#x30D6;&#x30EB;&#x3057;&#x3066;&#x4E2D;&#x3092;&#x8997;&#x3044;&#x3066;&#x307F;&#x305F; - Corgi Lab. &#xFF5E;&#x5099;&#x5FD8;&#x9332;&#x306E;&#x305F;&#x3081;&#x306E;&#x6280;&#x8853;&#x30D6;&#x30ED;&#x30B0;&#xFF5E;</a></p></li> </ul> <p></aside></p> Fri, 15 Jan 2021 07:48:30 +0900 hatenablog://entry/26006613678443000 C/C++ Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする https://cartman0.hatenablog.com/entry/2020/12/21/Windows%E7%92%B0%E5%A2%83%E3%81%ABUEFI%E3%82%A2%E3%83%97%E3%83%AA%E5%8B%95%E4%BD%9C%E7%94%A8%E3%81%AE%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83qemu%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC?utm_source=feed <h1 id="Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>環境に<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>アプリ動作用の仮想環境<a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>をインストールする</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>アプリ自体はWindowsPCでも動くのに意外に仮想環境である<a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/windows">windows</a>にインストールして動かす話があまりなかったのでメモ.</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする">Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#ファームウェア周りの用語メモ">ファームウェア周りの用語メモ</a></li> <li><a href="#実機でファームウェアアプリを動かす場合">実機でファームウェアアプリを動かす場合</a></li> <li><a href="#エミュレータを利用する">エミュレータを利用する</a></li> <li><a href="#qemuとは">qemuとは</a><ul> <li><a href="#qemuのインストール">qemuのインストール</a><ul> <li><a href="#wsl上でも動く">wsl上でも動く?</a></li> </ul> </li> <li><a href="#OVMFとは">OVMFとは</a></li> <li><a href="#OVMFのDL">OVMFのDL</a><ul> <li><a href="#ビルド方法">ビルド方法</a></li> </ul> </li> </ul> </li> <li><a href="#qemuの動作確認">qemuの動作確認</a><ul> <li><a href="#そのまま起動">そのまま起動</a></li> <li><a href="#空フォルダをマウントしてOVMFを起動">空フォルダをマウントしてOVMFを起動</a></li> <li><a href="#OSイメージの起動">OSイメージの起動</a></li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10</li> </ul> <p></section></p> <p><sectioin></p> <h2 id="ファームウェア周りの用語メモ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>周りの用語メモ</h2> <ul> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Basic%20Input/Output%20System">Basic Input/Output System</a>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%B6%A1%BC%A5%DC%A1%BC%A5%C9">マザーボード</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a></p></li> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/EFI">EFI</a>: Extensible <a class="keyword" href="http://d.hatena.ne.jp/keyword/Firmware">Firmware</a> Interface <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>の規格.</p></li> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Unified%20Extensible%20Firmware%20Interface">Unified Extensible Firmware Interface</a> 旧<a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>を改善した新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>規格.<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>ともいう.</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>の仕様書は<a href="https://www.uefi.org/specifications">https://www.uefi.org/specifications</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a> version2.7の仕様書: <a href="https://uefi.org/sites/default/files/resources/UEFI%20Spec%202_7_B.pdf">https://uefi.org/sites/default/files/resources/UEFI%20Spec%202_7_B.pdf</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>の特徴がまとまってる記事 <a href="https://github.com/tsuyopon/memo/blob/master/UEFI/UEFI.md">https://github.com/tsuyopon/memo/blob/master/UEFI/UEFI.md</a></li> </ul> </li> <li><p>TianoCore: <a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>実装をサポートするコミュニティ <a href="https://www.tianocore.org/">https://www.tianocore.org/</a></p></li> <li><p>EDK II: <a class="keyword" href="http://d.hatena.ne.jp/keyword/EFI">EFI</a> Developer Kit II : <a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>および<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>プラットフォーム初期化(PlatformInitialization)仕様向けの、機能が豊富なモダンな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A5%B9%A5%D7%A5%E9%A5%C3%A5%C8%A5%D5%A5%A9%A1%BC%A5%E0">クロスプラットフォーム</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>開発環境 <a href="https://github.com/tianocore/tianocore.github.io/wiki/EDK-II">https://github.com/tianocore/tianocore.github.io/wiki/EDK-II</a></p></li> <li><p>ビルドを試してる記事 <a href="https://cluster.hatenablog.com/entry/2019/03/11/234149">https://cluster.hatenablog.com/entry/2019/03/11/234149</a></p></li> <li><p>ベアメタルプログラミング: OS無しでハードウェアを直接制御するプログラムを書くプログラミング <a href="http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/intro.html">http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/intro.html</a></p></li> </ul> <p></sectioin></p> <p><section></p> <h2 id="実機でファームウェアアプリを動かす場合">実機で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>アプリを動かす場合</h2> <p>そもそもUEFIBIOSのPCがあればそのまま<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>アプリを動かせるので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF">エミュレータ</a>はいらない.</p> <p>手順として,</p> <ol> <li>Cで書いた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>アプリを<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>用にビルドしてイメージファイルを作る</li> <li>イメージファイルを<code>BOOTX64.EFI</code>にリネームして,いらない<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>あたりに"<a class="keyword" href="http://d.hatena.ne.jp/keyword/EFI">EFI</a>/BOOT/BOOTX64.<a class="keyword" href="http://d.hatena.ne.jp/keyword/EFI">EFI</a>"に書き込む</li> <li>PCの<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>を起動して起動ディスクの優先順を変更などして,このUSBの起動ディスクを起動.</li> </ol> <p>これで自作の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>が動く.</p> <p></section></p> <p><section></p> <h2 id="エミュレータを利用する"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF">エミュレータ</a>を利用する</h2> <p>上のように実機でも動くが,</p> <ul> <li>毎回USBに書き出して起動するのは面倒</li> <li>バグったコードで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%B6%A1%BC%A5%DC%A1%BC%A5%C9">マザーボード</a>が壊れる可能性</li> </ul> <p>を考慮して今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF">エミュレータ</a>を使用する.</p> <p><section></p> <h2 id="qemuとは"><a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>とは</h2> <blockquote><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/QEMU">QEMU</a> is a generic and open source machine emulator and virtualizer.</p></blockquote> <p>公式サイト:</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.qemu.org%2F" title="QEMU" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.qemu.org/">www.qemu.org</a></cite></p> <p>他の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>ソフトとの違い - <a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>: ホストOSのCPUを使って同一CPU(のOS実行環境)をエミュレートするタイプ - <a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>: CPUを丸ごとエミュレートするタイプ</p> <p>参考: <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.webzoit.net%2Fhp%2Fit%2Finternet%2Fhomepage%2Fenv%2Fvirtualization%2Fsoftware%2F" title="仮想化ソフトウェア比較 webzoit.net" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.webzoit.net/hp/it/internet/homepage/env/virtualization/software/">www.webzoit.net</a></cite></p> <p><strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>を使うと自作した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>アプリをフォルダに配置するだけでそれをマウントした状態で起動できる.</strong></p> <p></section></p> <p><section></p> <h3 id="qemuのインストール"><a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>のインストール</h3> <p>今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/windows">windows</a>上にインストールする.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>のDL:</p> <ol> <li> <a href="https://www.qemu.org/download/#windows">Download QEMU - QEMU</a> からOSに合わせて"64bit"or"32bit"を選択する. <figure class="figure-image figure-image-fotolife" title="32bitか64bitを選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022239.png" alt="32bit&#x304B;64bit&#x3092;&#x9078;&#x629E;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>32bitか64bitを選択</figcaption></figure> </figure> </li> <li> 最新の`<a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>-w64-setup-20201124.exe`をDLする. <figure><figure class="figure-image figure-image-fotolife" title="インストーラのDL"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022253.png" alt="&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30E9;&#x306E;DL" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>のDL</figcaption></figure> </figure> </li> </ol> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>からインストール:</p> <ol> <li> 言語を選択する.今回は"English". <figure><figure class="figure-image figure-image-fotolife" title="言語選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022244.png" alt="&#x8A00;&#x8A9E;&#x9078;&#x629E;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>言語選択</figcaption></figure> </li> <li> セットアップ画面が立ち上がる. <figure class="figure-image figure-image-fotolife" title="セットアップ画面"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022249.png" alt="&#x30BB;&#x30C3;&#x30C8;&#x30A2;&#x30C3;&#x30D7;&#x753B;&#x9762;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>セットアップ画面</figcaption></figure> </li> <li> 内容確認して”agree”を選択. <figure class="figure-image figure-image-fotolife" title="同意確認"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022259.png" alt="&#x540C;&#x610F;&#x78BA;&#x8A8D;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>同意確認</figcaption></figure> </li> <li> インストールする<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>を選ぶ.今回は全部選択する. <figure class="figure-image figure-image-fotolife" title="コンポーネント選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022304.png" alt="&#x30B3;&#x30F3;&#x30DD;&#x30FC;&#x30CD;&#x30F3;&#x30C8;&#x9078;&#x629E;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>選択</figcaption></figure> </li> <li> インストール先を選択する. 今回はDドライブ直下に選択. <figure class="figure-image figure-image-fotolife" title="インストール先選択"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022309.png" alt="&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB;&#x5148;&#x9078;&#x629E;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>インストール先選択</figcaption></figure> </li> <li> インストールが始まる. <figure class="figure-image figure-image-fotolife" title="インストール中"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022216.png" alt="&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB;&#x4E2D;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>インストール中</figcaption></figure> </li> <li> 無事インストールできれば終わり. <figure class="figure-image figure-image-fotolife" title="インストール完了"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022220.png" alt="&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB;&#x5B8C;&#x4E86;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>インストール完了</figcaption></figure> </li> <li> <a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>あたりから`<a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>-system-<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>_64.exe`を呼べるようにPATHを通す. <pre class="code" data-lang="" data-unlink>set QEMU &#34;D:\qemu&#34; set PATH &#34;%PATH%;%QEMU%&#34;&#34;</pre> </li> </ol> <p><section></p> <h4 id="wsl上でも動く">wsl上でも動く?</h4> <p>こちらの記事でWSL上のDevianで<a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>をインストールして試してるのがある.</p> <p><a href="http://www.neko.ne.jp/~freewing/software/uefi_bios_hack/">http://www.neko.ne.jp/~freewing/software/uefi_bios_hack/</a></p> <p>ただし,<code>-nographic</code>オプションが必要な模様.おそらくWSLでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>が動かないため?</p> <p>理想の仮想環境としてはwslかdockerかつ<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>として動かせるだろうか</p> <p></section></p> <p></section></p> <p><section></p> <h3 id="OVMFとは">OVMFとは</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>には<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>は実装されていない. 別途用意する必要があり,それがOVMF(Open Virtual Machine <a class="keyword" href="http://d.hatena.ne.jp/keyword/Firmware">Firmware</a>)になる.</p> <p>OVMFとは何か?</p> <blockquote><p>OVMF is an EDK II based project to enable <a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a> support for Virtual Machines. OVMF contains sample <a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/firmware">firmware</a> for <a class="keyword" href="http://d.hatena.ne.jp/keyword/QEMU">QEMU</a> and <a class="keyword" href="http://d.hatena.ne.jp/keyword/KVM">KVM</a>.</p> <p><a href="https://github.com/tianocore/tianocore.github.io/wiki/OVMF">OVMF &middot; tianocore/tianocore.github.io Wiki &middot; GitHub</a></p></blockquote> <p><code>OVMF.fd</code>がイメージファイルになる. これを<a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>を起動するときの<code>-bios</code>オプションで指定すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>を起動できる.</p> <p></section></p> <p><section></p> <h3 id="OVMFのDL">OVMFのDL</h3> <p>以下からzipファイルをDLして解凍すると<code>OVMF.fd</code>ファイルが入っている.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fedk2%2Ffiles%2FOVMF%2F" title="EDK II - Browse /OVMF at SourceForge.net" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://sourceforge.net/projects/edk2/files/OVMF/">sourceforge.net</a></cite></p> <p><figure class="figure-image figure-image-fotolife" title="OVMF.fdのDL"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022226.png" alt="OVMF.fd&#x306E;DL" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>OVMF.fdのDL</figcaption></figure></p> <p>解凍して適当な場所に置く.</p> <p>実装されている<a class="keyword" href="http://d.hatena.ne.jp/keyword/UEFI">UEFI</a>のバージョンは書かれていない?</p> <p><section></p> <h4 id="ビルド方法">ビルド方法</h4> <p>最新版が欲しい場合は, <a href="https://github.com/tianocore/edk2">EDKⅡ</a>のプロジェクトをDLしてビルドすればいい.</p> <p>サポート環境:</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>_VS2019 VS2019</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>_GCC5</li> </ul> <p>以下の記事で実際にビルドを試している..</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fcluster.hatenablog.com%2Fentry%2F2019%2F03%2F11%2F234149" title="EDK2の始め方 - CLUSTER" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://cluster.hatenablog.com/entry/2019/03/11/234149">cluster.hatenablog.com</a></cite></p> <p></section></p> <p></section></p> <p></section></p> <p><section></p> <h2 id="qemuの動作確認"><a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>の動作確認</h2> <p><section></p> <h3 id="そのまま起動">そのまま起動</h3> <p>PATHが通ってるので以下のコマンドで起動できる.</p> <pre class="code" data-lang="" data-unlink>&gt; qemu-system-x86_64.exe</pre> <p>以下のように立ち上がればok</p> <p><figure class="figure-image figure-image-fotolife" title="qemu起動"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022231.png" alt="qemu&#x8D77;&#x52D5;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>起動</figcaption></figure></p> <p></section></p> <p><section></p> <h3 id="空フォルダをマウントしてOVMFを起動">空フォルダをマウントしてOVMFを起動</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/qemu">qemu</a>ではフォルダをディスクとしてマウントして起動できる.</p> <ul> <li><code>-bios</code>オプションでOVMFファイルを指定する.</li> <li><code>-hda</code>オプションでマウントしたいフォルダを指定する.</li> </ul> <p>option一覧は <a href="https://www.qemu.org/docs/master/system/invocation.html">Invocation &mdash; QEMU 5.0.92 (v5.1.0-rc2) documentation</a>に載っている.</p> <pre class="code" data-lang="" data-unlink>&gt; qemu-system-x86_64.exe -bios D:\OSImage\OVMF-X64-r15214\OVMF.fd -hda fat:rw:Desktop/qemu</pre> <p>今回は空フォルダなのでロードに失敗して以下のように立ち上がる.</p> <p><figure class="figure-image figure-image-fotolife" title="OVMF起動"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/cartman0/20201221/20201221022235.png" alt="OVMF&#x8D77;&#x52D5;" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>OVMF起動</figcaption></figure></p> <p>イメージフォーマットを指定してないので以下の警告が出るが問題なく動作する.</p> <pre class="code" data-lang="" data-unlink>WARNING: Image format was not specified for &#39;json:{&#34;fat-type&#34;: 0, &#34;backing&#34;: {&#34;driver&#34;: &#34;vvfat_write_target&#34;}, &#34;dir&#34;: &#34;Desktop/qemu&#34;, &#34;driver&#34;: &#34;vvfat&#34;, &#34;floppy&#34;: false, &#34;rw&#34;: true, &#34;write-target&#34;: {&#34;driver&#34;: &#34;qcow&#34;, &#34;file&#34;: {&#34;driver&#34;: &#34;file&#34;, &#34;filename&#34;: &#34;C:\\Users\\...&#39; and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the &#39;raw&#39; format explicitly to remove the restrictions.</pre> <p>回避するには<code>-drive</code>オプションを使って, <code>-drive format=raw</code>で回避できる.</p> <p></section></p> <p><section></p> <h3 id="OSイメージの起動">OSイメージの起動</h3> <p>今回使わないので省略. 仮想ディスクのサイズを指定しておくなど前処理が必要ぽい.</p> <p>こちらの記事で使い方がまとまっている.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flegacyos.ichmy.0t0.jp%2Fqemu%2F" title="Qemuで遊ぼうのこーなー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://legacyos.ichmy.0t0.jp/qemu/">legacyos.ichmy.0t0.jp</a></cite></p> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/main_1.html">Hello UEFI!</a></p></li> <li><p><a href="https://legacyos.ichmy.0t0.jp/qemu/">Qemu&#x3067;&#x904A;&#x307C;&#x3046;&#x306E;&#x3053;&#x30FC;&#x306A;&#x30FC;</a></p></li> </ul> <p></aside></p> Mon, 21 Dec 2020 02:45:54 +0900 hatenablog://entry/26006613667908076 UEFI Windows ルートと無限連分数メモ https://cartman0.hatenablog.com/entry/2020/10/19/%E3%83%AB%E3%83%BC%E3%83%88%E3%81%A8%E7%84%A1%E9%99%90%E9%80%A3%E5%88%86%E6%95%B0%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="ルートと無限連分数メモ">ルートと無限連分数メモ</h1> <p>ルートの入った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%CD%FD%BF%F4">無理数</a>を無限連分数で表現しようという面白い記事があったのでメモ. また,収束条件を満たすかあたりも残しておく.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgendai.ismedia.jp%2Farticles%2F-%2F76168" title="「2乗して10になる数」はどう求める? じつは分数でも書けます。(横山 明日希)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://gendai.ismedia.jp/articles/-/76168">gendai.ismedia.jp</a></cite></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#ルートと無限連分数メモ">ルートと無限連分数メモ</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#ルートを求めるテク">ルートを求めるテク</a><ul> <li><a href="#収束を可視化">収束を可視化</a></li> <li><a href="#無限連分数で表現">無限連分数で表現</a></li> <li><a href="#自然数nを変えても収束するか">自然数nを変えても収束するか?</a></li> </ul> </li> <li><a href="#連分数の理論">連分数の理論</a><ul> <li><a href="#正準表現と収束子近似子">正準表現と収束子(近似子)</a><ul> <li><a href="#Theorem1-収束市の形の規則漸化式">Theorem1 収束市の形の規則(漸化式)</a></li> <li><a href="#Theorem2">Theorem2</a></li> <li><a href="#Theorem3">Theorem3</a></li> <li><a href="#Theorem4">Theorem4</a></li> <li><a href="#Theorem5">Theorem5</a></li> <li><a href="#Theorem6">Theorem6</a></li> </ul> </li> <li><a href="#無限連分数">無限連分数</a><ul> <li><a href="#Theorem7">Theorem7</a></li> <li><a href="#Theorem8">Theorem8</a></li> <li><a href="#Theorem9">Theorem9</a></li> <li><a href="#Theorem10-無限連分数が収束する必要十分条件">Theorem10 無限連分数が収束する必要十分条件</a></li> </ul> </li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> 3.8 </section></li> </ul> </li> </ul> <p><section></p> <h2 id="ルートを求めるテク">ルートを求めるテク</h2> <p>求めたいルートの数字を記事のように$\sqrt{10}$として, <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%BF%F4">自然数</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%CD%FD%BF%F4">無理数</a>の和から成り立っていると考える.どちらも正値とする.</p> <p>$$ \sqrt{10} = n + b $$</p> <p>両辺の二乗は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%28n%2Bb%29%28n%2Bb%29%20%26%3D%26%2010%5C%5C%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} (n+b)(n+b) &amp;=&amp; 10\\\\ \end{eqnarray} "/> </div> <p>式変形すると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0An%5E%7B2%7D%20%2B%202nb%20%2B%20b%5E2%20%26%3D%26%2010%5C%5C%5C%5C%0Ab%282n%20%2B%20b%29%20%26%3D%26%2010%20-%20n%5E%7B2%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} n^{2} + 2nb + b^2 &amp;=&amp; 10\\\\ b(2n + b) &amp;=&amp; 10 - n^{2} \end{eqnarray*} "/> </div> <p>$\sqrt{3^{2}} &lt; \sqrt{10} &lt; \sqrt{4^{2}}$より$n=3$とする.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Ab%282%20%5Ccdot%203%20%2B%20b%29%20%26%3D%26%2010%20-%209%20%5C%5C%5C%5C%0Ab%282%20%5Ccdot%203%20%2B%20b%29%20%26%3D%26%201%20%5C%5C%5C%5C%0Ab%20%26%3D%26%20%5Cfrac%7B1%7D%7B%282%20%5Ccdot%203%20%2B%20b%29%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} b(2 \cdot 3 + b) &amp;=&amp; 10 - 9 \\\\ b(2 \cdot 3 + b) &amp;=&amp; 1 \\\\ b &amp;=&amp; \frac{1}{(2 \cdot 3 + b)} \end{eqnarray*} "/> </div> <p>次にこの式を</p> <ul> <li>左辺の$b$を$b_{i+1}$</li> <li>右辺の$b$を$b_{i}$</li> </ul> <p>という更新式としてみる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ab_%7Bi%2B1%7D%20%26%3D%26%20%5Cfrac%7B1%7D%7B%282%20%5Ccdot%203%20%2B%20b_%7Bi%7D%29%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} b_{i+1} &amp;=&amp; \frac{1}{(2 \cdot 3 + b_{i})} \end{eqnarray} "/> </div> <p><section></p> <h3 id="収束を可視化">収束を可視化</h3> <p>収束の証明をふっとばして収束の様子を可視化する.</p> <p>$$ \sqrt{10} = 3+b $$</p> <p>のbの更新式をインデックスを変えながら可視化する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%7Cb_%7Bi%2B1%7D%20%3D%20%20%5Cfrac%7B1%7D%7B%282%20%5Ccdot%203%20%2B%20b_%7Bi%7D%29%7D%0A%3D%20%20%5Cfrac%7B1%7D%7B%286%2B%20b_%7Bi%7D%29%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} |b_{i+1} = \frac{1}{(2 \cdot 3 + b_{i})} = \frac{1}{(6+ b_{i})} \end{eqnarray} "/> </div> <p>初期値$b_{0} = 0$とする. ここで,$\sqrt{10}-3 = 0.1622776601683795$へ収束していく.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3ftBCkALROzsXT_QNwN4qXrvinTvFPKvaf7T5wD4vb7U935udPnNw_f8Kng8DMAvQTTMusk4FsVd8WUpHUVjnQJ9aM8Cs1MTvzY3N2Sy3swa4zQnUlPRJ-0kRnQgKRQkSEYgwMz6JHXzQHKZkkuVSdU7w=w432-h288-no?authuser=0" itemprop="image"></span> <figcaption>$b_{i+1}=\frac{1}{6+b_{i}}$</figcaption> </figure></p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt %matplotlib inline bs = [<span class="synConstant">0</span>] i_s = np.arange(<span class="synConstant">0</span>, <span class="synConstant">6</span>+<span class="synConstant">1</span>) <span class="synStatement">for</span> i <span class="synStatement">in</span> i_s[<span class="synConstant">1</span>:]: bs.append(<span class="synConstant">1</span>/(<span class="synConstant">6</span>+bs[-<span class="synConstant">1</span>])) plt.hlines(np.sqrt(<span class="synConstant">10</span>) - <span class="synConstant">3</span>, <span class="synConstant">0</span>, i_s[-<span class="synConstant">1</span>], linestyles=<span class="synConstant">&quot;--&quot;</span>) <span class="synIdentifier">print</span>(np.sqrt(<span class="synConstant">10</span>) - <span class="synConstant">3</span>) plt.plot(i_s, bs) plt.grid(<span class="synIdentifier">True</span>) plt.ylim(<span class="synConstant">0.1621</span>, <span class="synConstant">0.1623</span>) plt.show() </pre> <p>表にすると</p> <table> <thead> <tr> <th style="text-align:center;">$b_{i}$ </th> <th style="text-align:center;">分数表記</th> <th style="text-align:center;">小数(double)</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">$b_{0}$</td> <td style="text-align:center;">$0$ </td> <td style="text-align:center;">0</td> </tr> <tr> <td style="text-align:center;">$b_{1}$</td> <td style="text-align:center;">$\frac{1}{6}$</td> <td style="text-align:center;">0.16666666666666666</td> </tr> <tr> <td style="text-align:center;">$b_{2}$</td> <td style="text-align:center;">$\frac{6}{37}$</td> <td style="text-align:center;">0.16216216216216214</td> </tr> <tr> <td style="text-align:center;">$b_{3}$</td> <td style="text-align:center;">$\frac{37}{228}$</td> <td style="text-align:center;">0.16228070175438597</td> </tr> <tr> <td style="text-align:center;">$b_{4}$</td> <td style="text-align:center;">$\frac{228}{1405}$</td> <td style="text-align:center;">0.16227758007117438</td> </tr> <tr> <td style="text-align:center;">$b_{\infty}$</td> <td style="text-align:center;"> - </td> <td style="text-align:center;"> $\sqrt{10}-3=0.1622776601683795$ </td> </tr> </tbody> </table> <p></section></p> <p><section></p> <h3 id="無限連分数で表現">無限連分数で表現</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%CD%FD%BF%F4">無理数</a>$b_{i+1}$については無限連分数で表現できる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ab_%7Bi%2B1%7D%0A%26%3D%26%20%5Cfrac%7B1%7D%7B6%2Bb_%7Bi%7D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B1%7D%7B%206%2B%5Cfrac%7B1%7D%7B6%2Bb_%7Bi-1%7D%7D%20%7D%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B1%7D%7B6%2B%5Cfrac%7B1%7D%7B6%2B%5Cfrac%7B1%7D%7B6%2B%5Cddots%7D%7D%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} b_{i+1} &amp;=&amp; \frac{1}{6+b_{i}} \\\\ &amp;=&amp; \frac{1}{ 6+\frac{1}{6+b_{i-1}} }\\\\ &amp;=&amp; \frac{1}{6+\frac{1}{6+\frac{1}{6+\ddots}}} \end{eqnarray} "/> </div> <p>よって$\sqrt{10}$は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Csqrt%7B%2010%20%7D%20%26%3D%26%20n%20%2B%20b%5C%5C%5C%5C%0A%26%3D%26%203%20%2B%20%20%5Cfrac%7B1%7D%7B6%2B%5Cfrac%7B1%7D%7B6%2B%5Cfrac%7B1%7D%7B6%2B%5Cddots%7D%7D%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \sqrt{ 10 } &amp;=&amp; n + b\\\\ &amp;=&amp; 3 + \frac{1}{6+\frac{1}{6+\frac{1}{6+\ddots}}} \end{eqnarray} "/> </div> <p></section></p> <p><section></p> <h3 id="自然数nを変えても収束するか"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%BF%F4">自然数</a>nを変えても収束するか?</h3> <p>$$ \sqrt{10} = n + b $$</p> <p>の形であれば問題ない.nが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%CD%FD%BF%F4">有理数</a>やbが負数でも収束する.</p> <p>$n=3$を$n=2$へ変えてみる.</p> <p>$$ 10 = 2^{2} + b(2 \cdot 2 + b)\\ $$</p> <p>この場合,更新式は次のように変わる.,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%7Cb_%7Bi%2B1%7D%20%3D%20%20%5Cfrac%7B6%7D%7B%282%20%5Ccdot%202%20%2B%20b_%7Bi%7D%29%7D%0A%3D%20%20%5Cfrac%7B6%7D%7B%284%2B%20b_%7Bi%7D%29%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} |b_{i+1} = \frac{6}{(2 \cdot 2 + b_{i})} = \frac{6}{(4+ b_{i})} \end{eqnarray} "/> </div> <p>収束を可視化する. $\sqrt{10} - 2 = 1.1622776601683795$へ収束していく.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3c5sYZVM8lqngfyMe86yDieJKmmdOP6CIuEc_gz-YsE1OQzxDXqcc7NipcP6udTm5z6uBYA888a32b2PfyznJSi55fv59FgH8WWK7ubx2yjWbBjcUKopLBCc5brNz2aAI63oJ5o3APotWhda1ITTpg3bw=w432-h288-no?authuser=0" itemprop="image"></span> <figcaption>$b_{i+1}=\frac{6}{4+b_{i}}$の収束</figcaption> </figure></p> <p>code:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt %matplotlib inline bs = [<span class="synConstant">0</span>] i_s = np.arange(<span class="synConstant">0</span>, <span class="synConstant">10</span>+<span class="synConstant">1</span>) <span class="synStatement">for</span> i <span class="synStatement">in</span> i_s[<span class="synConstant">1</span>:]: bs.append(<span class="synConstant">6</span>/(<span class="synConstant">4</span>+bs[-<span class="synConstant">1</span>])) plt.hlines(np.sqrt(<span class="synConstant">10</span>) - <span class="synConstant">2</span>, <span class="synConstant">0</span>, i_s[-<span class="synConstant">1</span>], linestyles=<span class="synConstant">&quot;--&quot;</span>, label=<span class="synConstant">&quot;$\sqrt{10}-2$&quot;</span>) <span class="synIdentifier">print</span>(np.sqrt(<span class="synConstant">10</span>) - <span class="synConstant">2</span>) plt.plot(i_s, bs) plt.grid(<span class="synIdentifier">True</span>) plt.ylim(<span class="synConstant">1.15</span>, <span class="synConstant">1.164</span>) plt.legend() plt.savefig(<span class="synConstant">&quot;convergence_sqrt(10)-2.png&quot;</span>) plt.show() </pre> <p>計算結果の$[b_{0}, b_{5}]$を表にまとめる.</p> <table> <thead> <tr> <th style="text-align:center;">$b_{i}$ </th> <th style="text-align:center;">分数表記</th> <th style="text-align:center;">小数(double)</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">$b_{0}$</td> <td style="text-align:center;">$0$ </td> <td style="text-align:center;">0</td> </tr> <tr> <td style="text-align:center;">$b_{1}$</td> <td style="text-align:center;">$\frac{3}{2}=1+\frac{1}{2}$</td> <td style="text-align:center;">1.5</td> </tr> <tr> <td style="text-align:center;">$b_{2}$</td> <td style="text-align:center;">$\frac{12}{11} = 1+\frac{1}{11}$</td> <td style="text-align:center;">1.0909090909090908</td> </tr> <tr> <td style="text-align:center;">$b_{3}$</td> <td style="text-align:center;">$\frac{33}{28}=1+\frac{5}{28}$</td> <td style="text-align:center;">1.1785714285714286</td> </tr> <tr> <td style="text-align:center;">$b_{4}$</td> <td style="text-align:center;">$\frac{168}{145}=1+\frac{23}{145}$</td> <td style="text-align:center;">1.1586206896551723</td> </tr> <tr> <td style="text-align:center;">$b_{5}$</td> <td style="text-align:center;">$\frac{435}{374}=1+\frac{61}{374}$</td> <td style="text-align:center;">1.1631016042780749</td> </tr> <tr> <td style="text-align:center;">$b_{\infty}$</td> <td style="text-align:center;"> - </td> <td style="text-align:center;"> $\sqrt{10}-2=1.1622776601683795$ </td> </tr> </tbody> </table> <p>収束していくが,仮分数となるので分子が大きくになりにくく$n=3$のときよりも収束が遅い.</p> <p>無限連分数で表現すると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Csqrt%7B%2010%20%7D%20%26%3D%26%20n%20%2B%20b%5C%5C%5C%5C%0A%26%3D%26%202%20%2B%20%20%5Cfrac%7B6%7D%7B4%2B%5Cfrac%7B6%7D%7B4%2B%5Cfrac%7B6%7D%7B4%2B%5Cddots%7D%7D%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \sqrt{ 10 } &amp;=&amp; n + b\\\\ &amp;=&amp; 2 + \frac{6}{4+\frac{6}{4+\frac{6}{4+\ddots}}} \end{eqnarray} "/> </div> <p></section></p> <p></section></p> <p><section></p> <h2 id="連分数の理論">連分数の理論</h2> <p>参考:<a href="http://argent.shinshu-u.ac.jp/lecture/files/pdf/cfracb5.pdf">http://argent.shinshu-u.ac.jp/lecture/files/pdf/cfracb5.pdf</a></p> <p>まず用語の定義.</p> <p>次の形の連分数を<strong>正則な連分数</strong>という.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aa_0%20%2B%20%5Cfrac%7B1%7D%7Ba_1%20%2B%20%5Cfrac%7B1%7D%7Ba_%7B2%7D%20%2B%20%5Ccdots%7D%20%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} a_0 + \frac{1}{a_1 + \frac{1}{a_{2} + \cdots} } \end{eqnarray} "/> </div> <p>$a_{0}, a_{1}, \cdots $を<strong>要素</strong>という.これは実数,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%BF%F4">複素数</a>,関数でも問題ない.</p> <p>有限な連分数で要素を$a_{0}, \cdots, a_{n}$までもつものを<strong>n階の連分数</strong>という. 要<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%C7%BF%F4">素数</a>は$a_{0}$も含めるのでn+1個になる.</p> <p>式にすると次になり,右辺は省略記法である.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aa_%7B0%7D%20%2B%20%5Cfrac%7B1%7D%7Ba_%7B1%7D%20%2B%20%5Cfrac%7B1%7D%7Ba_%7B2%7D%20%2B%20%5Cfrac%7B1%7D%7B%5Cddots%20%2B%20%5Cfrac%7B1%7D%7Ba_%7Bn%7D%20%7D%20%7D%20%7D%20%7D%0A%3D%20%5B%20a_%7B0%7D%3B%20a_%7B1%7D%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%20%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} a_{0} + \frac{1}{a_{1} + \frac{1}{a_{2} + \frac{1}{\ddots + \frac{1}{a_{n} } } } } = [ a_{0}; a_{1}, a_{2}, \cdots, a_{n} ] \end{eqnarray} "/> </div> <p>同様にして無限連分数は次のように表記される.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aa_%7B0%7D%20%2B%20%5Cfrac%7B1%7D%7B%20a_%7B1%7D%2B%5Cfrac%7B1%7D%7Ba_%7B2%7D%2B%5Cddots%7D%20%7D%0A%3D%20%5B%20a_%7B0%7D%3B%20a_%7B1%7D%20%2C%20a_%7B2%7D%2C%20%5Ccdots%20%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} a_{0} + \frac{1}{ a_{1}+\frac{1}{a_{2}+\ddots} } = [ a_{0}; a_{1} , a_{2}, \cdots ] \end{eqnarray} "/> </div> <p>有限連分数はなんらかの実数となり,すべての要素が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%CD%FD%BF%F4">有理数</a>であれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%CD%FD%BF%F4">有理数</a>をつかった連分数になるので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%CD%FD%BF%F4">有理数</a>となる.</p> <p>連分数の中の最初の要素から途中(k番目)までの要素まで連分数を<strong>断片</strong>という. k番目までで固定されるので,断片は有限・無限問わず有限連分数となる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0As_%7Bk%7D%0A%3D%20%5B%20a_%7B0%7D%3B%20a_%7B1%7D%20%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bk%7D%20%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} s_{k} = [ a_{0}; a_{1} , a_{2}, \cdots, a_{k} ] \end{eqnarray} "/> </div> <p>逆に,途中要素から最後までを<strong>剰余</strong>という. 有限連分数であれば$a_{n}$までで有限連分数になり, 無限連分数の場合は終わりがないので$a_{0} = a_{k}$とした無限連分数になる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ar_%7Bk%7D%0A%3D%20%5Cleft%5C%7B%0A%5Cbegin%7Barray%7D%7Bll%7D%0A%5B%20a_%7Bk%7D%3B%20a_%7Bk%2B1%7D%20%2C%20a_%7Bk%2B2%7D%2C%20%5Ccdots%20%2C%20a_%7Bn%7D%20%5D%20%26%20%5Ctext%7B%20where%20finite%7D%5C%5C%0A%5B%20a_%7Bk%7D%3B%20a_%7Bk%2B1%7D%20%2C%20a_%7Bk%2B2%7D%2C%20%5Ccdots%20%20%5D%20%26%20%5Ctext%7B%20where%20infinite%7D%0A%5Cend%7Barray%7D%0A%5Cright.%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} r_{k} = \left\{ \begin{array}{ll} [ a_{k}; a_{k+1} , a_{k+2}, \cdots , a_{n} ] &amp; \text{ where finite}\\ [ a_{k}; a_{k+1} , a_{k+2}, \cdots ] &amp; \text{ where infinite} \end{array} \right. \end{eqnarray} "/> </div> <p>無限連分数は剰余を使って次のように書ける.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5B%20a_%7B0%7D%3B%20a_%7B1%7D%20%2C%20a_%7B2%7D%2C%20%5Ccdots%20%20%5D%0A%3D%0A%5B%20a_%7B0%7D%3B%20a_%7B1%7D%20%2C%20a_%7B2%7D%2C%20%5Ccdots%20%2C%20a_%7Bk-1%7D%2C%20r_%7Bk%7D%20%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} [ a_{0}; a_{1} , a_{2}, \cdots ] = [ a_{0}; a_{1} , a_{2}, \cdots , a_{k-1}, r_{k} ] \end{eqnarray} "/> </div> <p><section></p> <h3 id="正準表現と収束子近似子">正準表現と収束子(近似子)</h3> <p>有限連分数は有理関数なので分母を表す<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%BF%B9%E0%BC%B0">多項式</a>と分子を表す<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%BF%B9%E0%BC%B0">多項式</a>の比で表現できる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5B%20a_%7B0%7D%3B%20a_%7B1%7D%20%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%20%20%5D%0A%3D%20%5Cfrac%7BP%28a_%7B0%7D%2C%20a_%7B1%7D%20%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%20%29%7D%7BQ%28a_%7B0%7D%2C%20a_%7B1%7D%20%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%20%29%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} [ a_{0}; a_{1} , a_{2}, \cdots, a_{n} ] = \frac{P(a_{0}, a_{1} , a_{2}, \cdots, a_{n} )}{Q(a_{0}, a_{1} , a_{2}, \cdots, a_{n} )} \end{eqnarray} "/> </div> <p>有利連分数を単純な分数の形で表現することを<strong>正準表現</strong>と呼ぶ.</p> <p>0階の連分数を</p> <p>$$ [ a_{0} ] = a_{0} = \frac{a_{0}}{1} $$</p> <p>n階の連分数は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5B%20a_%7B0%7D%3B%20a_%7B1%7D%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%20%5D%0A%26%3D%26%20a_%7B0%7D%20%2B%20%5Cfrac%7B1%7D%7Ba_%7B1%7D%20%2B%20%5Cfrac%7B1%7D%7Ba_%7B2%7D%20%2B%20%5Cfrac%7B1%7D%7B%5Cddots%20%2B%20%5Cfrac%7B1%7D%7Ba_%7Bn%7D%20%7D%20%7D%20%7D%20%7D%5C%5C%5C%5C%0A%26%3D%26%20%5B%20a_%7B0%7D%3B%20r_%7B1%7D%20%5D%20%5C%5C%5C%5C%0A%26%3D%26%20a_%7B0%7D%20%2B%20%5Cfrac%7B1%7D%7Br_%7B1%7D%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} [ a_{0}; a_{1}, a_{2}, \cdots, a_{n} ] &amp;=&amp; a_{0} + \frac{1}{a_{1} + \frac{1}{a_{2} + \frac{1}{\ddots + \frac{1}{a_{n} } } } }\\\\ &amp;=&amp; [ a_{0}; r_{1} ] \\\\ &amp;=&amp; a_{0} + \frac{1}{r_{1}} \end{eqnarray} "/> </div> <p>ここで,剰余$r_{1}$は有限連分数なので次の正準表現で表されるとする.</p> <p>$$ r_{1} = \frac{p'}{q'} $$</p> <p>これを代入して有限の連分数$[a_{0}; a_{1}, a_{2}, \cdots, a_{n}]$の正準表現とする.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Ba_%7B0%7D%3B%20a_%7B1%7D%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%5D%0A%3D%20a_%7B0%7D%20%2B%20%5Cfrac%7B1%7D%7B%20r_%7B1%7D%20%7D%0A%3D%20a_%7B0%7D%20%2B%20%5Cfrac%7Bq%27%7D%7Bp%27%7D%0A%3D%20%5Cfrac%7Ba_%7B0%7Dp%27%20%2B%20q%27%7D%7Bp%27%7D%0A%3D%20%5Cfrac%7Bp%7D%7Bq%7D%5C%5C%5C%5C%0Ar_%7B1%7D%20%3D%20%5B%20a_%7B1%7D%3B%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%20%5D%20%3D%20%5Cfrac%7Bp%27%7D%7Bq%27%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} [a_{0}; a_{1}, a_{2}, \cdots, a_{n}] = a_{0} + \frac{1}{ r_{1} } = a_{0} + \frac{q&#39;}{p&#39;} = \frac{a_{0}p&#39; + q&#39;}{p&#39;} = \frac{p}{q}\\\\ r_{1} = [ a_{1}; a_{2}, \cdots, a_{n} ] = \frac{p&#39;}{q&#39;} \end{eqnarray} "/> </div> <p>正準表現の分子分母は次のように対応している.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ap%20%26%3D%26%20a_%7B0%7Dp%27%20%2B%20q%27%20%5C%5C%5C%5C%0Aq%20%26%3D%26%20p%27%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} p &amp;=&amp; a_{0}p&#39; + q&#39; \\\\ q &amp;=&amp; p&#39; \end{eqnarray} "/> </div> <p>ちなみに,$[a_{0}, a_{1}]$の正準表現は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5B%20a_%7B0%7D%2C%20a_%7B1%7D%20%5D%20%3D%20a_%7B0%7D%20%2B%20%5Cfrac%7B1%7D%7Br_%7B1%7D%7D%20%3D%20%5Cfrac%7Ba_%7B0%7Da_%7B1%7D%20%2B%201%7D%7Ba_%7B1%7D%7D%3D%20%5Cfrac%7Bp%7D%7Bq%7D%5C%5C%5C%5C%0Ar_%7B1%7D%20%3D%20%5Cfrac%7Bp%27%7D%7Bq%27%7D%20%3D%5Cfrac%7Ba_%7B1%7D%7D%7B1%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} [ a_{0}, a_{1} ] = a_{0} + \frac{1}{r_{1}} = \frac{a_{0}a_{1} + 1}{a_{1}}= \frac{p}{q}\\\\ r_{1} = \frac{p&#39;}{q&#39;} =\frac{a_{1}}{1} \end{eqnarray*} "/> </div> <p>断片の正準表現を考える. 断片は有限連分数になるので正準表現可能である.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0As_%7Bk%20%7D%20%3D%20%5B%20a_%7B0%7D%3B%20a_%7B1%7D%2C%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bk%7D%20%5D%0A%3D%20%5Cfrac%7Bp_%7Bk%7D%7D%7Bq_%7Bk%7D%7D%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} s_{k } = [ a_{0}; a_{1}, a_{2}, \cdots, a_{k} ] = \frac{p_{k}}{q_{k}} \\\\ \end{eqnarray*} "/> </div> <p>これを連分数のk階の$収束子(近似子)$という. 無限連分数の場合は,kは無限まで存在する.</p> <p>n階の有限連分数$\alpha$には$n+1$の収束子が存在する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Calpha%20%26%3D%26%20%5Cfrac%7Bp_%7Bn%7D%7D%7Bq_%7Bn%7D%7D%5C%5C%5C%5C%0As_%7B%200%20%7D%20%26%3D%26%20%5Cfrac%7Bp_%7B0%7D%7D%7Bq_%7B0%7D%7D%20%5C%5C%5C%5C%0A%5Cvdots%20%5C%5C%5C%5C%0As_%7Bn-1%7D%20%26%3D%26%20%5Cfrac%7Bp_%7Bn-1%7D%7D%7Bq_%7Bn-1%7D%7D%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \alpha &amp;=&amp; \frac{p_{n}}{q_{n}}\\\\ s_{ 0 } &amp;=&amp; \frac{p_{0}}{q_{0}} \\\\ \vdots \\\\ s_{n-1} &amp;=&amp; \frac{p_{n-1}}{q_{n-1}} \\\\ \end{eqnarray*} "/> </div> <p><section></p> <h4 id="Theorem1-収束市の形の規則漸化式">Theorem1 収束市の形の規則(漸化式)</h4> <p>次の漸化式が成立する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ap_%7Bk%7D%20%26%3D%26%20a_%7Bk%7Dp_%7Bk-1%7D%20%2B%20p_%7Bk-2%7D%20%5C%5C%5C%5C%0Aq_%7Bk%7D%20%26%3D%26%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20q_%7Bk-2%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} p_{k} &amp;=&amp; a_{k}p_{k-1} + p_{k-2} \\\\ q_{k} &amp;=&amp; a_{k}q_{k-1} + q_{k-2} \end{eqnarray} "/> </div> <p>proof:</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A2%C7%BC%CB%A1">帰納法</a>を使う.</p> <p>k=2のとき:</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0As_%7B0%7D%20%26%3D%26%20%5Cfrac%7Bp_%7B0%7D%7D%7Bq_%7B0%7D%7D%20%3D%20%5Cfrac%7Ba_%7B0%7D%7D%7B1%7D%20%5C%5C%5C%5C%0As_%7B1%7D%20%26%3D%26%20%5Cfrac%7Bp_%7B1%7D%7D%7Bq_%7B1%7D%7D%20%3D%20%5Cfrac%7B%20a_%7B0%7Da_%7B1%7D%20%2B%201%20%7D%7B%20a_%7B1%7D%20%7D%20%5C%5C%5C%5C%0Ar_%7B1%7D%20%26%3D%26%20p%27%2Fq%27%20%3D%20a_%7B1%7D%20%2B%20%5Cfrac%7B1%7D%7Ba_%7B2%7D%7D%20%3D%20%5Cfrac%7B%20a_%7B1%7Da_%7B2%7D%20%2B%201%7D%7B%20a_%7B2%7D%20%7D%20%5C%5C%5C%5C%0As_%7B2%7D%20%26%3D%26%20%5Cfrac%7Bp_2%7D%7Bq_2%7D%20%3D%20%5Cfrac%7Ba_%7B0%7Dp%27%20%2B%20q%27%7D%7Bp%27%7D%20%3D%20%5Cfrac%7Ba_%7B0%7D%20%28a_%7B1%7Da_%7B2%7D%20%2B%201%29%20%2B%20a_%7B2%7D%7D%7B%20a_%7B1%7Da_%7B2%7D%20%2B%201%20%7D%0A%3D%20%5Cfrac%7B%20a_%7B2%7D%28%20a_%7B0%7D%20a_%7B1%7D%20%2B1%20%29%20%2B%20a_%7B0%7D%7D%7B%20a_%7B1%7Da_%7B2%7D%20%2B%201%20%7D%0A%3D%20%5Cfrac%7Ba_%7B2%7Dp_%7B1%7D%20%2B%20p_%7B0%7D%20%7D%7Ba_%7B2%7Dq_%7B1%7D%20%2B%20q_%7B0%7D%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} s_{0} &amp;=&amp; \frac{p_{0}}{q_{0}} = \frac{a_{0}}{1} \\\\ s_{1} &amp;=&amp; \frac{p_{1}}{q_{1}} = \frac{ a_{0}a_{1} + 1 }{ a_{1} } \\\\ r_{1} &amp;=&amp; p&#39;/q&#39; = a_{1} + \frac{1}{a_{2}} = \frac{ a_{1}a_{2} + 1}{ a_{2} } \\\\ s_{2} &amp;=&amp; \frac{p_2}{q_2} = \frac{a_{0}p&#39; + q&#39;}{p&#39;} = \frac{a_{0} (a_{1}a_{2} + 1) + a_{2}}{ a_{1}a_{2} + 1 } = \frac{ a_{2}( a_{0} a_{1} +1 ) + a_{0}}{ a_{1}a_{2} + 1 } = \frac{a_{2}p_{1} + p_{0} }{a_{2}q_{1} + q_{0}} \end{eqnarray*} "/> </div> <p>$k &lt; n$のとき成り立つと仮定し$k=n$でも成立するかを確認する.</p> <p>$n-1$階剰余$r_{1}$のr階の収束子を$p'_{r}/q'_{r}$で表す. これにより$k=2$のときの$p'/q'$を一般化できる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Ar_%7B1%7D%20%3D%20%5B%20a_%7B1%7D%3B%20a_%7B2%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%20%5D%20%3D%20%5Cfrac%7Bp%27_%7B%20n-1%20%7D%20%7D%7B%20q%27_%7Bn-1%7D%7D%5C%5C%5C%5C%0As%27_%7Br%7D%20%3D%20%5Ba_%7B1%7D%3B%20a_%7B2%7D%2C%20%5Ccdots%20%2C%20a_%7Br%7D%2C%20a_%7Br%2B1%7D%5D%20%3D%20%20%5Cfrac%7B%20p%27_%7Br%7D%20%7D%7B%20q%27_%7Br%7D%20%7D%20%2C%20%28r%20%3C%20n%29%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} r_{1} = [ a_{1}; a_{2}, \cdots, a_{n} ] = \frac{p&#39;_{ n-1 } }{ q&#39;_{n-1}}\\\\ s&#39;_{r} = [a_{1}; a_{2}, \cdots , a_{r}, a_{r+1}] = \frac{ p&#39;_{r} }{ q&#39;_{r} } , (r &lt; n) \\\\ \end{eqnarray*} "/> </div> <p>もとの連分数のn階の収束子を考える.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0As_%7Bn%7D%20%3D%20%5Cfrac%7Bp_n%7D%7Bq_n%7D%20%3D%20%5Ba_%7B0%7D%3B%20r_%7B1%7D%5D%0A%26%3D%26%20a_%7B0%7D%20%2B%20%5Cfrac%7B1%7D%7Br_%7B1%7D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20a_%7B0%7D%20%2B%20%5Cfrac%7Bq%27_%7Bn-1%7D%7D%7Bp%27_%7Bn-1%7D%7D%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B%20a_%7B0%7Dp%27_%7Bn-1%7D%20%2B%20q%27_%7Bn-1%7D%20%7D%7B%20p%27_%7Bn-1%7D%20%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} s_{n} = \frac{p_n}{q_n} = [a_{0}; r_{1}] &amp;=&amp; a_{0} + \frac{1}{r_{1}} \\\\ &amp;=&amp; a_{0} + \frac{q&#39;_{n-1}}{p&#39;_{n-1}}\\\\ &amp;=&amp; \frac{ a_{0}p&#39;_{n-1} + q&#39;_{n-1} }{ p&#39;_{n-1} } \end{eqnarray*} "/> </div> <p>よって,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ap_%7Bn%7D%20%26%3D%26%20a_%7B0%7Dp%27_%7Bn-1%7D%20%2B%20q%27_%7Bn-1%7D%5C%5C%5C%5C%0Aq_%7Bn%7D%20%26%3D%26%20p%27_%7Bn-1%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} p_{n} &amp;=&amp; a_{0}p&#39;_{n-1} + q&#39;_{n-1}\\\\ q_{n} &amp;=&amp; p&#39;_{n-1} \end{eqnarray} "/> </div> <p>n-1階剰余の連分数でも仮定は成立するので</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ap%27_%7Bn-1%7D%20%26%3D%26%20a_%7Bn%7Dp%27_%7Bn-2%7D%20%2B%20p%27_%7Bn-3%7D%20%5C%5C%5C%5C%0Aq%27_%7Bn-1%7D%20%26%3D%26%20a_%7Bn%7Dq%27_%7Bn-2%7D%20%2B%20q%27_%7Bn-3%7D%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} p&#39;_{n-1} &amp;=&amp; a_{n}p&#39;_{n-2} + p&#39;_{n-3} \\\\ q&#39;_{n-1} &amp;=&amp; a_{n}q&#39;_{n-2} + q&#39;_{n-3} \\\\ \end{eqnarray} "/> </div> <p>※$[a_{1}; a_{2}, \cdots, a_{n}]$の収束子なので$a_{n-1}$でなく$a_{n}$になる.</p> <p>これを代入すると,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ap_%7Bn%7D%20%26%3D%26%20a_%7B0%7Dp%27_%7Bn-1%7D%20%2B%20q%27_%7Bn-1%7D%5C%5C%5C%5C%0A%26%3D%26%20a_%7B0%7D%28a_%7Bn%7Dp%27_%7Bn-2%7D%20%2B%20p%27_%7Bn-3%7D%29%20%2B%20%28a_%7Bn%7Dq%27_%7Bn-2%7D%20%2B%20q%27_%7Bn-3%7D%20%29%5C%5C%5C%5C%0A%26%3D%26%20a_%7Bn%7D%28a_%7B0%7D%20p%27_%7Bn-2%7D%20%2B%20q%27_%7Bn-2%7D%20%29%20%2B%20%28a_%7B0%7D%20p%27_%7Bn-3%7D%20%2B%20q%27_%7Bn-3%7D%20%29%5C%5C%5C%5C%0A%26%3D%26%20a_%7Bn%7Dp_%7Bn-1%7D%20%2B%20p_%7Bn-2%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} p_{n} &amp;=&amp; a_{0}p&#39;_{n-1} + q&#39;_{n-1}\\\\ &amp;=&amp; a_{0}(a_{n}p&#39;_{n-2} + p&#39;_{n-3}) + (a_{n}q&#39;_{n-2} + q&#39;_{n-3} )\\\\ &amp;=&amp; a_{n}(a_{0} p&#39;_{n-2} + q&#39;_{n-2} ) + (a_{0} p&#39;_{n-3} + q&#39;_{n-3} )\\\\ &amp;=&amp; a_{n}p_{n-1} + p_{n-2} \end{eqnarray} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aq_%7Bn%7D%20%26%3D%26%20%20p%27_%7Bn-1%7D%5C%5C%5C%5C%0A%26%3D%26%20%20a_%7Bn%7Dp%27_%7Bn-2%7D%20%2B%20p%27_%7Bn-3%7D%20%5C%5C%5C%5C%0A%26%3D%26%20a_%7Bn%7Dq_%7Bn-1%7D%20%2B%20q_%7Bn-2%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} q_{n} &amp;=&amp; p&#39;_{n-1}\\\\ &amp;=&amp; a_{n}p&#39;_{n-2} + p&#39;_{n-3} \\\\ &amp;=&amp; a_{n}q_{n-1} + q_{n-2} \end{eqnarray} "/> </div> <p>よって任意の$2 \leq k$でも定理が成り立つ.</p> <p>note: -1階数の収束子を$p<em>{-1}=1,q</em>{-1}=0$とおくと.$k=1$でも成立する.</p> <p><section></p> <p>$\sqrt{10}$の断片$[3,6,6,6]$で確認</p> <table> <thead> <tr> <th style="text-align:center;">k </th> <th style="text-align:center;">正準表現</th> <th style="text-align:center;">$p_{k}$</th> <th style="text-align:center;">$q_{k}$</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">0</td> <td style="text-align:center;">$\frac{3}{1}$ </td> <td style="text-align:center;">3 </td> <td style="text-align:center;">1 </td> </tr> <tr> <td style="text-align:center;">1</td> <td style="text-align:center;">$\frac{19}{6}$</td> <td style="text-align:center;">19 </td> <td style="text-align:center;"> 6 </td> </tr> <tr> <td style="text-align:center;">2</td> <td style="text-align:center;">$\frac{117}{37}$</td> <td style="text-align:center;"> $6\cdot19+3=117$ </td> <td style="text-align:center;"> $6\cdot 6+1=37$ </td> </tr> <tr> <td style="text-align:center;">3</td> <td style="text-align:center;">$\frac{721}{228}$</td> <td style="text-align:center;"> $6\cdot 117+19=721$ </td> <td style="text-align:center;"> $6\cdot 37+6=228$ </td> </tr> </tbody> </table> <p></section></p> <p></section></p> <p><section></p> <h4 id="Theorem2">Theorem2</h4> <p>すべての$k\geq 0$に対して</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aq_%7Bk%7Dp_%7Bk-1%7D%20-%20p_%7Bk%7Dq_%7Bk-1%7D%20%26%3D%26%20%28-1%29%5E%7Bk%7D%5C%5C%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} q_{k}p_{k-1} - p_{k}q_{k-1} &amp;=&amp; (-1)^{k}\\\\ \end{eqnarray} "/> </div> <p>が成立する.</p> <p>proof:</p> <p>定理1の第1式を <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk-1%7D%20" alt=" q_{k-1} "/> 倍する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Ap_%7Bk%7Dq_%7Bk-1%7D%20%3D%20q_%7Bk-1%7Da_%7Bk%7Dp_%7Bk-1%7D%20%2B%20q_%7Bk-1%7Dp_%7Bk-2%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} p_{k}q_{k-1} = q_{k-1}a_{k}p_{k-1} + q_{k-1}p_{k-2} \end{eqnarray*} "/> </div> <p>第2式を <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p_%7Bk-1%7D" alt=" p_{k-1}"/> 倍する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7Dp_%7Bk-1%7D%20%3D%20p_%7Bk-1%7D%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20p_%7Bk-1%7Dq_%7Bk-2%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k}p_{k-1} = p_{k-1} a_{k}q_{k-1} + p_{k-1}q_{k-2} \end{eqnarray*} "/> </div> <p>差分を計算すると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7Dp_%7Bk-1%7D%20-%20p_%7Bk%7Dq_%7Bk-1%7D%0A%26%3D%26%20p_%7Bk-1%7D%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20p_%7Bk-1%7Dq_%7Bk-2%7D%20%20-%20%20%28q_%7Bk-1%7Da_%7Bk%7Dp_%7Bk-1%7D%20%2B%20q_%7Bk-1%7Dp_%7Bk-2%7D%29%20%5C%5C%5C%5C%0A%26%3D%26%20p_%7Bk-1%7Dq%5C_%7Bk-2%7D%20-%20q_%7Bk-1%7Dp_%7Bk-2%7D%5C%5C%5C%5C%0A%26%3D%26%20-%20%28%20q_%7Bk-1%7Dp_%7Bk-2%7D%20-%20p_%7Bk-1%7Dq_%7Bk-2%7D%20%29%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k}p_{k-1} - p_{k}q_{k-1} &amp;=&amp; p_{k-1} a_{k}q_{k-1} + p_{k-1}q_{k-2} - (q_{k-1}a_{k}p_{k-1} + q_{k-1}p_{k-2}) \\\\ &amp;=&amp; p_{k-1}q\_{k-2} - q_{k-1}p_{k-2}\\\\ &amp;=&amp; - ( q_{k-1}p_{k-2} - p_{k-1}q_{k-2} ) \end{eqnarray*} "/> </div> <p>前インデックスの符号反転であることがわかる.</p> <p>$-1$階数も考慮してk=0の開始点をみると</p> <p>$$ q_{0}p_{-1} - p_{0}q_{-1} = 1 \cdot 1 - a_{1} \cdot 0\ = +1 $$</p> <p>よって,定理2が成立.</p> <p><section> 定理2を <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk%7Dq_%7Bk-1%7D" alt=" q_{k}q_{k-1}"/> で割ると次の系が成立する.</p> <p>Corollary1: すべての$k \leq 1$に対して</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cfrac%7Bp_%7Bk-1%7D%7D%7Bq_%7Bk-1%7D%7D%20-%20%5Cfrac%7Bp_%7Bk%7D%7D%7Bq_%7Bk%7D%7D%20%3D%5Cfrac%7B%20%28-1%29%5E%7Bk%7D%20%7D%7B%20q_%7Bk%7D%20q_%7Bk-1%7D%20%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \frac{p_{k-1}}{q_{k-1}} - \frac{p_{k}}{q_{k}} =\frac{ (-1)^{k} }{ q_{k} q_{k-1} } \end{eqnarray} "/> </div> <p>この系からわかることは</p> <ul> <li>偶数階数収束子は直後(k, 直前でも同じ)の奇数階数収束子より小さい.(偶数階数収束子は,奇数階数収束子にとって下界である)</li> <li>奇数階数収束子は直後(k)の偶数階数収束子より大きい.(奇数階数収束子は,偶数階数収束子にとって上界である)</li> </ul> <p><section> 確認:$\sqrt{10}$の断片$[3,6,6,6]$より偶数階収束子と奇数階収束子の関係をみる.</p> <table> <thead> <tr> <th style="text-align:center;">k </th> <th style="text-align:center;">偶数階$\frac{p_{2k}}{q_{2k}}$</th> <th style="text-align:center;">不等号</th> <th style="text-align:center;">奇数階$\frac{p_{2k+1}}{q_{2k+1}}$</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">0</td> <td style="text-align:center;">$\frac{3}{1}=3$ </td> <td style="text-align:center;"> &lt; </td> <td style="text-align:center;"> $\frac{19}{6}=3.1666666666666665$</td> </tr> <tr> <td style="text-align:center;">2</td> <td style="text-align:center;">$\frac{117}{37}=3.1621621621621623$</td> <td style="text-align:center;"> &lt; </td> <td style="text-align:center;"> $\frac{721}{228}=3.162280701754386$</td> </tr> </tbody> </table> <p></section></p> <p></section></p> <p><section></p> <h4 id="Theorem3">Theorem3</h4> <p>すべての$k \geq 1$に対して</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aq_%7Bk%7D%20p_%7Bk-2%7D%20-%20p_%7Bk%7Dq_%7Bk-2%7D%20%3D%20%28-1%29%5E%7Bk-1%7Da_%7Bk%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} q_{k} p_{k-2} - p_{k}q_{k-2} = (-1)^{k-1}a_{k} \end{eqnarray} "/> </div> <p>proof:</p> <p>定理1の第1式を$q_{k-2}$倍する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Ap_%7Bk%7Dq_%7Bk-2%7D%20%3D%20q_%7Bk-2%7Da_%7Bk%7Dp_%7Bk-1%7D%20%2B%20q_%7Bk-2%7Dp_%7Bk-2%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} p_{k}q_{k-2} = q_{k-2}a_{k}p_{k-1} + q_{k-2}p_{k-2} \end{eqnarray*} "/> </div> <p>第2式を$p_{k-2}$倍する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq%5C_%7Bk%7Dp%5C_%7Bk-2%7D%20%3D%20p%5C_%7Bk-2%7D%20a%5C_%7Bk%7Dq%5C_%7Bk-1%7D%20%2B%20p%5C_%7Bk-2%7Dq%5C_%7Bk-2%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q\_{k}p\_{k-2} = p\_{k-2} a\_{k}q\_{k-1} + p\_{k-2}q\_{k-2} \end{eqnarray*} "/> </div> <p>これらの差は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7Dp_%7Bk-2%7D%20-%20p_%7Bk%7Dq_%7Bk-2%7D%0A%26%3D%26%20p_%7Bk-2%7D%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20p_%7Bk-2%7Dq_%7Bk-2%7D%20-%20%28q_%7Bk-2%7Da_%7Bk%7Dp_%7Bk-1%7D%20%2B%20q_%7Bk-2%7Dp_%7Bk-2%7D%29%5C%5C%5C%5C%0A%26%3D%26%20p_%7Bk-2%7D%20a_%7Bk%7Dq_%7Bk-1%7D%20%20-%20q_%7Bk-2%7Da_%7Bk%7Dp_%7Bk-1%7D%5C%5C%5C%5C%0A%26%3D%26%20a_%7Bk%7D%20%28%20q_%7Bk-1%7Dp_%7Bk-2%7D%20-%20p_%7Bk-1%7Dq_%7Bk-2%7D%20%29%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k}p_{k-2} - p_{k}q_{k-2} &amp;=&amp; p_{k-2} a_{k}q_{k-1} + p_{k-2}q_{k-2} - (q_{k-2}a_{k}p_{k-1} + q_{k-2}p_{k-2})\\\\ &amp;=&amp; p_{k-2} a_{k}q_{k-1} - q_{k-2}a_{k}p_{k-1}\\\\ &amp;=&amp; a_{k} ( q_{k-1}p_{k-2} - p_{k-1}q_{k-2} ) \end{eqnarray*} "/> </div> <p>定理2より</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7Dp_%7Bk-2%7D%20-%20p_%7Bk%7Dq_%7Bk-2%7D%0A%26%3D%26%20a_%7Bk%7D%20%28%20q_%7Bk-1%7Dp_%7Bk-2%7D%20-%20p_%7Bk-1%7Dq_%7Bk-2%7D%20%29%20%5C%5C%5C%5C%0A%26%3D%26%20a_%7Bk%7D%20%28%20-1%20%29%5E%7Bk-1%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k}p_{k-2} - p_{k}q_{k-2} &amp;=&amp; a_{k} ( q_{k-1}p_{k-2} - p_{k-1}q_{k-2} ) \\\\ &amp;=&amp; a_{k} ( -1 )^{k-1} \end{eqnarray*} "/> </div> <p><section> Corollary2: 定理3を$q<em>{k}q</em>{k-2}$で割ると次を導ける.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cfrac%7Bp_%7Bk-2%7D%7D%7Bq_%7Bk-2%7D%7D%20-%5Cfrac%7B%20p_%7Bk%7D%20%7D%7Bq_%7Bk%7D%20%7D%0A%26%3D%26%20%5Cfrac%7Ba_%7Bk%7D%20%28%20-1%20%29%5E%7Bk-1%7D%7D%7Bq_%7Bk%7Dq_%7Bk-2%7D%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \frac{p_{k-2}}{q_{k-2}} -\frac{ p_{k} }{q_{k} } &amp;=&amp; \frac{a_{k} ( -1 )^{k-1}}{q_{k}q_{k-2}} \end{eqnarray} "/> </div> <p>系2の結果から - 奇数階数収束子は減少列(kが増えるごとに小さくなる) - 偶数階数収束子は増大列(kが増えるごとに大きくなる)</p> <p>よって,この2つの列は互いに近づく(収束).($a_{k}$が正値の場合)</p> <p><section> 確認:$\sqrt{10}$の断片$[3,6,6,6]$より偶数階収束子が増大列, 奇数階収束子が減少列であるかを確認する.</p> <table> <thead> <tr> <th style="text-align:center;">k </th> <th style="text-align:center;">偶数階$\frac{p_{2k}}{q_{2k}}$</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">0</td> <td style="text-align:center;">$\frac{3}{1}=3$ </td> </tr> <tr> <td style="text-align:center;">2</td> <td style="text-align:center;">$\frac{117}{37}=3.1621621621621623$</td> </tr> </tbody> </table> <table> <thead> <tr> <th style="text-align:center;">k </th> <th style="text-align:center;">奇数階$\frac{p_{2k+1}}{q_{2k+1}}$</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">1</td> <td style="text-align:center;"> $\frac{19}{6}=3.1666666666666665$</td> </tr> <tr> <td style="text-align:center;">3</td> <td style="text-align:center;"> $\frac{721}{228}=3.162280701754386$</td> </tr> </tbody> </table> <p></section></p> <p></section></p> <p></section></p> <p><section></p> <h4 id="Theorem4">Theorem4</h4> <p>系1,系2をまとめると</p> <p>系2から - 奇数階収束子は減少列 - 偶数階収束子は増大列</p> <p>系1から - 奇数階収束子は直後の偶数階収束子より大きい - 偶数階収束子は直後の奇数階収束子より小さい</p> <p>よって,すべての奇数階収束子はすべての偶数階収束子よりも大きい.</p> <p>有限連分数$\alpha$に対して - すべての偶数階収束子は$\alpha$よりも小さい - すべての奇数階収束子は$\alpha$よりも大きい</p> <p><section> 確認:$\sqrt{10}$の断片$[3,6,6,6,6,6,6,6,6,6,6]$の偶数階収束子と奇数階収束をプロットする.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3cHtA-PtQH6TkYBfjtP1jCw0_uC2HoTCEF16T7bO8zXkAcZ6eU_bWcYKUzJOmSub8BOHMSX74yb2QEOTBJAY-u6FIDGYK1Sh5-t6u7Gv0iG36aI0odnwS4I-OGrLPZiRVpu9wrlNQAVEkW3UtKdvi6_lg=w432-h288-no?authuser=0" itemprop="image"></span> <figcaption>増大列・減少列の確認</figcaption> </figure></p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt %matplotlib inline <span class="synStatement">def</span> <span class="synIdentifier">renbu_1</span>(a, k=<span class="synConstant">0</span>): <span class="synConstant">'''</span> <span class="synConstant"> [a; a, a, ...]</span> <span class="synConstant"> '''</span> <span class="synStatement">if</span> k&lt;= <span class="synConstant">0</span>: <span class="synStatement">return</span> a <span class="synStatement">return</span> a + <span class="synConstant">1</span>/ renbu_1(a, k=k-<span class="synConstant">1</span>) <span class="synStatement">def</span> <span class="synIdentifier">renbu_2</span>(a0, a1, k=<span class="synConstant">0</span>): <span class="synConstant">'''</span> <span class="synConstant"> [a0;a1,a1,...]</span> <span class="synConstant"> '''</span> <span class="synStatement">if</span> k&lt;= <span class="synConstant">0</span>: <span class="synStatement">return</span> a0 <span class="synStatement">return</span> a0 + <span class="synConstant">1</span>/ renbu_1(a1, k=k-<span class="synConstant">1</span>) ks = np.arange(<span class="synConstant">0</span>, <span class="synConstant">10</span>+<span class="synConstant">1</span>) renbus = [] <span class="synStatement">for</span> k <span class="synStatement">in</span> ks: renbus.append(renbu_2(<span class="synConstant">6</span>,<span class="synConstant">3</span>,k)) <span class="synComment">#even</span> plt.plot(ks[::<span class="synConstant">2</span>], renbus[::<span class="synConstant">2</span>], label=<span class="synConstant">&quot;even&quot;</span>) <span class="synComment"># odd</span> plt.plot(ks[<span class="synConstant">1</span>::<span class="synConstant">2</span>], renbus[<span class="synConstant">1</span>::<span class="synConstant">2</span>], label=<span class="synConstant">&quot;odd&quot;</span>) plt.grid(<span class="synIdentifier">True</span>) plt.ylim(<span class="synConstant">6.29</span>, <span class="synConstant">6.34</span>) plt.legend() plt.savefig(<span class="synConstant">&quot;convergence_odd_even.png&quot;</span>) plt.show() </pre> <p></section></p> <p></section></p> <p><section></p> <h4 id="Theorem5">Theorem5</h4> <p>任意のk$(1 \leq k \leq n)$に対して</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Ba_0%3B%20a_%7B1%7D%2C%20a_%7B2%7D%2C%5Ccdots%20%2Ca_%7Bn%7D%5D%0A%3D%20%5Cfrac%7Bp_%7Bk-1%7Dr_%7Bk%7D%20%2B%20p_%7Bk-2%7D%7D%7Bq_%7Bk-1%7Dr_%7Bk%7D%2B%20q_%7Bk-2%7D%20%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} [a_0; a_{1}, a_{2},\cdots ,a_{n}] = \frac{p_{k-1}r_{k} + p_{k-2}}{q_{k-1}r_{k}+ q_{k-2} } \end{eqnarray} "/> </div> <ul> <li>$r_{k}$は$a_k$から始まる剰余(有限連分数)</li> </ul> <p>Theorem1を剰余を使って拡張して表記できる. また,実は無限連分数でも成立する.</p> <p>proof:</p> <p>有限連分数を剰余を使って書き直す.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Ba_%7B0%7D%3B%20a_%7B1%7D%2C%20a_%7B2%7D%20%2C%20%5Ccdots%20%2C%20a_%7Bn%7D%20%5D%0A%3D%20%5Ba_%7B0%7D%3B%20a_%7B1%7D%2Ca_%7B2%7D%2C%5Ccdots%20%2C%20a_%7Bk-1%7D%2C%20r_%7Bk%7D%20%5D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} [a_{0}; a_{1}, a_{2} , \cdots , a_{n} ] = [a_{0}; a_{1},a_{2},\cdots , a_{k-1}, r_{k} ] \end{eqnarray*} "/> </div> <p>右辺の <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5B%20a_%7B0%7D%3Ba_%7B1%7D%2C%5Ccdots%20%2C%20a_%7Bk-1%7D" alt=" [ a_{0};a_{1},\cdots , a_{k-1}"/> ] までは<a class="keyword" href="http://d.hatena.ne.jp/keyword/k-1">k-1</a>階収束子で表される.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0As_%7Bk-1%7D%20%3D%20%5B%20a_%7B0%7D%3B%20a_%7B1%7D%2Ca_%7B2%7D%2C%5Ccdots%20%2C%20a_%7Bk-1%7D%20%5D%0A%3D%20%5Cfrac%7Bp_%7Bk-1%7D%7D%7Bq_%7Bk-1%7D%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} s_{k-1} = [ a_{0}; a_{1},a_{2},\cdots , a_{k-1} ] = \frac{p_{k-1}}{q_{k-1}} \end{eqnarray*} "/> </div> <p>Theorem1より</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ap_%7Bk%7D%20%26%3D%26%20a_%7Bk%7Dp_%7Bk-1%7D%20%2B%20p_%7Bk-2%7D%20%3D%20r_%7Bk%7Dp_%7Bk-1%7D%2Bp_%7Bk-2%7D%5C%5C%5C%5C%0Aq_%7Bk%7D%20%26%3D%26%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20q_%7Bk-2%7D%20%3D%20r_%7Bk%7Dq_%7Bk-1%7D%20%2B%20q_%7Bk-2%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} p_{k} &amp;=&amp; a_{k}p_{k-1} + p_{k-2} = r_{k}p_{k-1}+p_{k-2}\\\\ q_{k} &amp;=&amp; a_{k}q_{k-1} + q_{k-2} = r_{k}q_{k-1} + q_{k-2} \end{eqnarray} "/> </div> <p>よってTheorem5が成立.</p> <p></section></p> <p><section></p> <h4 id="Theorem6">Theorem6</h4> <p>任意の$k\geq 1$ に対して</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cfrac%7Bq_%7Bk%7D%7D%7Bq_%7Bk-1%7D%7D%20%26%3D%26%20%5B%20a_%7Bk%7D%3B%20a_%7Bk-1%7D%2C%20%5Ccdots%20%2C%20a_%7B1%7D%20%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \frac{q_{k}}{q_{k-1}} &amp;=&amp; [ a_{k}; a_{k-1}, \cdots , a_{1} ] \end{eqnarray} "/> </div> <p>$a_0$を除いて逆順の連分数となるもの.</p> <p>proof:</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A2%C7%BC%CB%A1">帰納法</a>を使う.</p> <p>$k=1$のとき:</p> <p>$$ \frac{q_{1}}{q_{0}} = \frac{a_{1}}{1} = a_{1} = [a_{1}] $$</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/k-1">k-1</a>でこの定理が成り立つと仮定しk番目で成立するか確認する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cfrac%7Bq_%7Bk-1%7D%7D%7Bq_%7Bk-2%7D%7D%20%26%3D%26%20%5B%20a_%7Bk-1%7D%3B%20a_%7Bk-2%7D%2C%20%5Ccdots%20%2C%20a_%7B1%7D%20%5D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \frac{q_{k-1}}{q_{k-2}} &amp;=&amp; [ a_{k-1}; a_{k-2}, \cdots , a_{1} ] \end{eqnarray*} "/> </div> <p>定理1の第2式を$q_{<a class="keyword" href="http://d.hatena.ne.jp/keyword/k-1">k-1</a>}$で割る.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aq_%7Bk%7D%20%26%3D%26%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20q_%7Bk-2%7D%20%5C%5C%5C%5C%0A%5Cfrac%7Bq_%7Bk%7D%7D%7Bq_%7Bk-1%7D%7D%20%26%3D%26%20%20a_%7Bk%7D%20%2B%20%5Cfrac%7Bq_%7Bk-2%7D%7D%7Bq_%7Bk-1%7D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%20a_%7Bk%7D%20%2B%20%5Cfrac%7B1%7D%7B%5Cfrac%7Bq_%7Bk-1%7D%7D%7Bq_%7Bk-2%7D%7D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5B%20a_%7Bk%7D%3B%20%5Cfrac%7Bq_%7Bk-1%7D%7D%7Bq_%7Bk-2%7D%7D%20%5D%5C%5C%5C%5C%0A%26%3D%26%20%5B%20a_%7Bk%7D%3B%20%20a_%7Bk-1%7D%3B%20a_%7Bk-2%7D%2C%20%5Ccdots%20%2C%20a_%7B1%7D%20%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} q_{k} &amp;=&amp; a_{k}q_{k-1} + q_{k-2} \\\\ \frac{q_{k}}{q_{k-1}} &amp;=&amp; a_{k} + \frac{q_{k-2}}{q_{k-1}} \\\\ &amp;=&amp; a_{k} + \frac{1}{\frac{q_{k-1}}{q_{k-2}}} \\\\ &amp;=&amp; [ a_{k}; \frac{q_{k-1}}{q_{k-2}} ]\\\\ &amp;=&amp; [ a_{k}; a_{k-1}; a_{k-2}, \cdots , a_{1} ] \end{eqnarray} "/> </div> <p>よって,成立.</p> <p></section></p> <p></section></p> <p><section></p> <h3 id="無限連分数">無限連分数</h3> <p>無限連分数$[a_{0}; a_{1}, a_{2} , \cdots ]$に対して収束子は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cfrac%7Bp_%7B0%7D%7D%7Bq_%7B0%7D%7D%2C%20%5Cfrac%7Bp_%7B1%7D%7D%7Bq_%7B1%7D%7D%20%2C%20%5Ccdots%20%2C%20%5Cfrac%7Bp_%7Bk%7D%7D%7Bq_%7Bk%7D%7D%2C%20%5Ccdots%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \frac{p_{0}}{q_{0}}, \frac{p_{1}}{q_{1}} , \cdots , \frac{p_{k}}{q_{k}}, \cdots \end{eqnarray} "/> </div> <p>に対応している. すべての収束子は何かの実数になる. もし列が収束するなら(それが一意な極限$\alpha$)を持っているなら, その$\alpha$を連分数の値であると考えて,</p> <p>$$ \alpha = [a_{0}; a_{1}, a_{2}, \cdots ] $$</p> <p>と書ける.そのとき無限連分数もまた<strong>収束する</strong>という. 逆に,定まった極限を持たない場合は発散するという.</p> <p><section></p> <h4 id="Theorem7">Theorem7</h4> <p>もし無限連分数が収束するなら、その剰余もまたすべて収束する。 逆に、無限連分数の少なくとも一つの剰余が収束するなら、その無限連分数自身 が収束している。</p> <p>proof: 無限連分数のn-1階収束子を$\frac{p_{n-1}}{q_{n-1}}$とする.</p> <p>$$ [a_{0}; a_{1}, a_{2}, \cdots, a_{n-1} ]= \frac{p_{n-1}}{q_{n-1}} $$</p> <p>残りの剰余$r_{n}$のk階収束子を$p'_{k}/q'_{k}$とする.</p> <p>$$ [a_{n}; a_{ n +1}, a_{n+2}, \cdots a_{n+k} ]= \frac{p'_{k}}{q'_{k}} $$</p> <p>無限連分数の$n+k$階収束子はTheorem5より</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cfrac%7Bp_%7Bn%2Bk%7D%7D%7Bq_%7Bn%2Bk%7D%7D%0A%3D%20%5Ba_0%3B%20a_%7B1%7D%2C%20a_%7B2%7D%2C%5Ccdots%20%2C%20a_%7Bn-1%7D%2C%20a_%7Bn%7D%2C%20%5Ccdots%20%2C%20a_%7Bn%2Bk%7D%5D%5C%5C%5C%5C%0A%3D%20%5Cfrac%7Bp_%7Bn-1%7D%5Cfrac%7Bp%27_%7Bk%7D%7D%7Bq%27_%7Bk%7D%7D%20%2B%20p_%7Bn-2%7D%7D%7Bq_%7Bk-1%7D%5Cfrac%7Bp%27%5C_%7Bk%7D%7D%7Bq%27%5C_%7Bk%7D%7D%2B%20q_%7Bn-2%7D%20%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \frac{p_{n+k}}{q_{n+k}} = [a_0; a_{1}, a_{2},\cdots , a_{n-1}, a_{n}, \cdots , a_{n+k}]\\\\ = \frac{p_{n-1}\frac{p&#39;_{k}}{q&#39;_{k}} + p_{n-2}}{q_{k-1}\frac{p&#39;\_{k}}{q&#39;\_{k}}+ q_{n-2} } \end{eqnarray} "/> </div> <p>もし剰余$r_{n}$が収束するなら</p> <p>$$ \lim_{k\to \infty} \frac{p'_{k}}{q'_{k}} = r_{n} $$</p> <p>無限連分数の収束子も何らかの値に収束する</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cfrac%7B%20p_%7Bn-1%7D%20r_%7Bn%7D%20%2B%20p_%7Bn-2%7D%20%7D%7Bq_%7Bk-1%7Dr_%7Bn%7D%20%2B%20q_%7Bn-2%7D%20%7D%0A%3D%20%5Calpha%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \frac{ p_{n-1} r_{n} + p_{n-2} }{q_{k-1}r_{n} + q_{n-2} } = \alpha \end{eqnarray} "/> </div> <p>また,Therom5が無限連分数にも成立する.</p> <p></section></p> <p><section></p> <h4 id="Theorem8">Theorem8</h4> <p>収束する無限連分数の値はすべての偶数回数収束子よりも大きく,奇数階数収束子よりも小さい.</p> <p>Theorem4から導ける.</p> <p></section></p> <p><section></p> <h4 id="Theorem9">Theorem9</h4> <p>定理2の系1から次を導ける.</p> <p>収束する無限連分数の値$\alpha$は任意の$n-1> k \geq 0 $に対して次の不等式を満たす. なお,$a_{1} > 0$より$q_{k} > 0, k>1$を仮定する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cleft%7C%20%5Calpha%20-%20%5Cfrac%7Bp_%7Bk%7D%7D%7Bq_%7Bk%7D%7D%5Cright%7C%20%3C%20%5Cfrac%7B%201%20%7D%7B%20q_%7Bk%7D%20q_%7Bk%2B1%7D%20%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \left| \alpha - \frac{p_{k}}{q_{k}}\right| &lt; \frac{ 1 }{ q_{k} q_{k+1} } \end{eqnarray} "/> </div> <p>系1のインデックスを進めて絶対値をとると導出できる.</p> <p></section></p> <p><section></p> <h4 id="Theorem10-無限連分数が収束する必要十分条件">Theorem10 無限連分数が収束する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%AC%CD%D7%BD%BD%CA%AC%BE%F2%B7%EF">必要十分条件</a></h4> <p>$a_{i} > 0,( i\leq 1) $の場合 無限連分数が収束する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%AC%CD%D7%BD%BD%CA%AC%BE%F2%B7%EF">必要十分条件</a>は, 無限連分数の要素の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%E9%BF%F4">級数</a></p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Csum_%7Bn%3D1%7D%5E%7B%5Cinfty%7D%20a_%7Bn%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \sum_{n=1}^{\infty} a_{n} \end{eqnarray} "/> </div> <p>が発散すること.</p> <p>proof:</p> <p>Theorem4から無限連分数が収束する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%AC%CD%D7%BD%BD%CA%AC%BE%F2%B7%EF">必要十分条件</a>は 奇数階収束子と偶数階収束子の2つの列が同じ極限を持つことになる.</p> <p>同じ極限を持つ場合,系1の式は0に近づいていく.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cfrac%7Bp_%7Bk-1%7D%7D%7Bq_%7Bk-1%7D%7D%20-%20%5Cfrac%7Bp_%7Bk%7D%7D%7Bq_%7Bk%7D%7D%20%3D%5Cfrac%7B%20%28-1%29%5E%7Bk%7D%20%7D%7B%20q_%7Bk%7D%20q_%7Bk-1%7D%20%7D%20%5Cto%200%2C%20%28k%5Cto%20%5Cinfty%29%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \frac{p_{k-1}}{q_{k-1}} - \frac{p_{k}}{q_{k}} =\frac{ (-1)^{k} }{ q_{k} q_{k-1} } \to 0, (k\to \infty) \end{eqnarray} "/> </div> <p>そうすると右辺分母が</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%20q_%7Bk%7D%20q_%7Bk-1%7D%20%20%5Cto%20%5Cinfty%20%2C%20%28k%5Cto%20%5Cinfty%29%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} q_{k} q_{k-1} \to \infty , (k\to \infty) \end{eqnarray} "/> </div> <p>のときのみである.これが収束するための<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%AC%CD%D7%BD%BD%CA%AC%BE%F2%B7%EF">必要十分条件</a>になる.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%E9%BF%F4">級数</a>が何らかの値に収束すると仮定する. つまり$0&lt; a_{k}&lt;1$の場合を考える. Thorem1の式より</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7D%20%26%3D%26%20a_%7Bk%7Dq_%7Bk%E2%88%921%7D%20%2B%20q_%7Bk%E2%88%922%7D%5C%5C%5C%5C%0Aq_%7Bk%7D%20%26%3E%26%20q_%7Bk-2%7D%2C%20%28a_%7Bk%7D%20%3E%200%20%29%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k} &amp;=&amp; a_{k}q_{k&minus;1} + q_{k&minus;2}\\\\ q_{k} &amp;&gt;&amp; q_{k-2}, (a_{k} &gt; 0 ) \end{eqnarray*} "/> </div> <p>このとき</p> <ul> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk-2%7D%20%3E%20q_%7Bk-1%7D%20" alt=" q_{k-2} &gt; q_{k-1} "/> すなわち <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk%7D%20%3E%20q_%7Bk-1%7D%20" alt=" q_{k} &gt; q_{k-1} "/></li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk-2%7D%20%5Clt%20q_%7Bk-1%7D%20" alt=" q_{k-2} \lt q_{k-1} "/></li> </ul> <p>の2通りが考えられる.</p> <p><section></p> <p>前者の場合</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7D%20%3D%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20q_%7Bk-2%7D%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k} = a_{k}q_{k-1} + q_{k-2}\\\\ \end{eqnarray*} "/> </div> <p>不等式にすると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aa_%7Bk%7Dq_%7Bk%7D%20%2B%20q_%7Bk-2%7D%20%26%3E%26%20q_%7Bk%7D%20%5C%5C%5C%5C%0Aq_%7Bk-2%7D%20%26%3E%26%20%281-a_%7Bk%7D%29q_%7Bk%7D%20%5C%5C%5C%5C%0A%5Cfrac%7Bq_%7Bk-2%7D%7D%7B1-a_%7Bk%7D%7D%20%26%3E%26%20q_%7Bk%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} a_{k}q_{k} + q_{k-2} &amp;&gt;&amp; q_{k} \\\\ q_{k-2} &amp;&gt;&amp; (1-a_{k})q_{k} \\\\ \frac{q_{k-2}}{1-a_{k}} &amp;&gt;&amp; q_{k} \end{eqnarray*} "/> </div> <p>後者の場合 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk-1%7D%20%3E%20q_%7Bk-2%7D" alt=" q_{k-1} &gt; q_{k-2}"/> を考えると <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk-1%7D" alt=" q_{k-1}"/> で置きかえると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7D%20%3D%20a_%7Bk%7Dq_%7Bk-1%7D%20%2B%20q_%7Bk-2%7D%5C%5C%5C%5C%0Aa_%7Bk%7Dq_%7Bk-1%7D%20%2B%20q_%7Bk-1%7D%20%3E%20q_%7Bk%7D%5C%5C%5C%5C%0A%281%2Ba_%7Bk%7D%29q_%7Bk-1%7D%20%3E%20q_%7Bk%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k} = a_{k}q_{k-1} + q_{k-2}\\\\ a_{k}q_{k-1} + q_{k-1} &gt; q_{k}\\\\ (1+a_{k})q_{k-1} &gt; q_{k} \end{eqnarray*} "/> </div> <p>左辺を式変形すると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cfrac%7B%281%2Ba_%7Bk%7D%29%281-a_%7Bk%7D%29%7D%7B1-a_%7Bk%7D%7Dq_%7Bk-1%7D%20%3E%20q_%7Bk%7D%20%5C%5C%5C%5C%0A%5Cfrac%7B1-a_%7Bk%7D%5E%7B2%7D%7D%7B1-a_%7Bk%7D%7Dq_%7Bk-1%7D%20%3E%20q_%7Bk%7D%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \frac{(1+a_{k})(1-a_{k})}{1-a_{k}}q_{k-1} &gt; q_{k} \\\\ \frac{1-a_{k}^{2}}{1-a_{k}}q_{k-1} &gt; q_{k} \\\\ \end{eqnarray*} "/> </div> <p>まとめると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7D%20%3C%20%281%2Ba_%7Bk%7D%29q_%7Bk-1%7D%20%3C%20%20%5Cfrac%7Bq_%7Bk-1%7D%7D%7B1-a_%7Bk%7D%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k} &lt; (1+a_{k})q_{k-1} &lt; \frac{q_{k-1}}{1-a_{k}} \end{eqnarray*} "/> </div> <p>したがって,すべての場合で</p> <p>$$ q_{k} &lt; \frac{1}{1-a_{k} }q_{l} , (\text{ where } l &lt; k) $$</p> <p>が成り立つ. これを$k_{0} &lt; s &lt; r &lt; \cdots &lt; m &lt; l $のように繰り返すと</p> <p>$$ q_{l} &lt; \frac{1}{1-a_{l} }q_{m} , (\text{ where } m &lt; l) $$</p> <p>これを繰り返して両辺の積は</p> <p>$$ q_{k}q_{l} \cdots q_{r} &lt; \frac{q_{l} }{1-a_{k} } \frac{q_{m} }{1-a_{l} } \cdots \frac{q_{s}}{1-a_{r} } $$</p> <p>分子が消せるので</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aq_%7Bk%7D%3C%20%5Cfrac%7Bq_%7Bs%7D%20%7D%7B%281-a_%7Bk%7D%29%20%20%281-a_%7Bl%7D%29%5Ccdots%20%281-a_%7Br%7D%29%20%7D%5C%5C%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} q_{k}&lt; \frac{q_{s} }{(1-a_{k}) (1-a_{l})\cdots (1-a_{r}) }\\\\ \end{eqnarray} "/> </div> <p>$\sum_{n=1}^{\infty} a_{n}$が収束するなら$\prod_{n=1}^{\infty} (1+a_{n})$も収束する. $\prod_{n=1}^{\infty}\frac{1}{(1- a_{n})}$も収束する.</p> <p>3.1 無限積の絶対収束 <a href="https://genkuroki.github.io/documents/Calculus/02%20series.pdf">https://genkuroki.github.io/documents/Calculus/02%20series.pdf</a></p> <p>よって,</p> <p>$$ \frac{1}{(1-a_{k}) (1-a_{l})\cdots (1-a_{r})} \leq \prod_{n=k_{0}}^{\infty} (1-a_{n}) = \lambda $$</p> <p>$q_{0}, q_{1},\cdots q_{k_{0}-1}$中の最大のものを$Q$と書けば</p> <p>$$ q_{k} &lt; \lambda Q, (k \geq k_{0}) $$</p> <p>そして,</p> <p>$$ q_{k}q_{k+1} &lt; \lambda^{2} Q^{2} &lt; \infty, (k \geq k_{0}) $$</p> <p>よって,要素の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%E9%BF%F4">級数</a>が収束する場合,その無限連分数は発散する. </section></p> <p><section> 要素の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%E9%BF%F4">級数</a>が発散する場合:</p> <p>系1の第2式と$a_{i} > 0$の仮定より $q_{k} > q_{k-2}, (k \geq 1)$</p> <p>これは$k \geq 2$で成立しているので</p> <p>$$ q_{2} > q_{0} \\ q_{3} > q_{1} $$</p> <p>ここで最小のものを$c$とれば</p> <p>$$ c=\mathrm{min}(q_{0}, q_{1}) $$</p> <p>$$ q_{k} \geq c, (k \geq 0) $$</p> <p>が成り立つ.</p> <p>系1第2式の <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk-1%7D" alt=" q_{k-1}"/> を$c$に置き換えると次の不等式が成立,</p> <p>$$ q_{k} \geq q_{k-2} + ca_{k}, (k \geq 2) $$</p> <p>ここで偶数階収束子は</p> <p>$$ q_{2} \geq q_{0} + c a_{2}\\ q_{4} \geq q_{2} + c a_{4} \geq q_{0} + c(a_{2}+a_{4}) \\ \vdots \\ q_{2k} \geq q_{0} + c \sum_{n=1}^{k}a_{2n} $$</p> <p>奇数階収束子は</p> <p>$$ q_{3} \geq q_{1} + ca_{3}\\ q_{5} \geq q_{3} + ca_{5} \geq q_{1} + c(a_{3}+a_{5}) \\ \vdots \\ q_{2k+1} \geq q_{1} + c\sum_{n=1}^{k}a_{2n+1} $$</p> <p>この2つの不等式を足すと</p> <p>$$ q_{2k} + q_{2k+1} \geq q_{0} + q_{1} + c\sum_{n=1}^{2k+1}a_{n}\\ q_{2k} + q_{2k+1} > c\sum_{n=1}^{2k+1}a_{n} $$</p> <p>すべてのkで書き換えると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Aq_%7Bk%7D%20%2B%20q_%7Bk-1%7D%20%3E%20%20c%20%5Csum_%7Bn%3D1%7D%5E%7Bk%7D%20a_%7Bn%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} q_{k} + q_{k-1} &gt; c \sum_{n=1}^{k} a_{n} \end{eqnarray*} "/> </div> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk%7D%20%5Cgeq%20q_%7Bk-1%7D" alt=" q_{k} \geq q_{k-1}"/> のとき</p> <p>$$ 2q_{k} > c \sum_{n=1}^{k}a_{n} $$</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk-1%7D%20%5Cgeq%20q_%7Bk%7D" alt=" q_{k-1} \geq q_{k}"/> のとき</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A2q_%7Bk-1%7D%20%20%3E%20%20c%20%5Csum_%7Bn%3D1%7D%5E%7Bk%7D%20a_%7Bn%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} 2q_{k-1} &gt; c \sum_{n=1}^{k} a_{n} \end{eqnarray*} "/> </div> <p>また,<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q_%7Bk%7D%20%3E%20c%2C%20q_%7Bk-1%7D%3Ec" alt=" q_{k} &gt; c, q_{k-1}&gt;c"/> より</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A2q_%7Bk%7Dq_%7Bk-1%7D%20%20%3E%20%20c%5E%7B2%7D%20%5Csum_%7Bn%3D1%7D%5E%7Bk%7D%20a_%7Bn%7D%20%5C%5C%5C%5C%0Aq_%7Bk%7Dq_%7Bk-1%7D%20%20%3E%20%20%5Cfrac%7Bc%5E%7B2%7D%7D%7B2%7D%20%5Csum_%7Bn%3D1%7D%5E%7Bk%7D%20a_%7Bn%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} 2q_{k}q_{k-1} &gt; c^{2} \sum_{n=1}^{k} a_{n} \\\\ q_{k}q_{k-1} &gt; \frac{c^{2}}{2} \sum_{n=1}^{k} a_{n} \end{eqnarray*} "/> </div> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%E9%BF%F4">級数</a>が発散するという仮定だったので</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Aq_%7Bk%7Dq_%7Bk-1%7D%20%20%3E%20%20%5Cfrac%7Bc%5E%7B2%7D%7D%7B2%7D%20%5Csum_%7Bn%3D1%7D%5E%7Bk%7D%20a_%7Bn%7D%20%5Cto%20%5Cinfty%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} q_{k}q_{k-1} &gt; \frac{c^{2}}{2} \sum_{n=1}^{k} a_{n} \to \infty \end{eqnarray} "/> </div> <p>収束の精度についてはヒンチン本の第2章6,7節に書かれてる.</p> <p></section></p> <p></section></p> <p></section></p> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgendai.ismedia.jp%2Farticles%2F-%2F76168" title="「2乗して10になる数」はどう求める? じつは分数でも書けます。(横山 明日希)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://gendai.ismedia.jp/articles/-/76168">gendai.ismedia.jp</a></cite></li> <li><a href="http://argent.shinshu-u.ac.jp/lecture/files/pdf/cfracb5.pdf">http://argent.shinshu-u.ac.jp/lecture/files/pdf/cfracb5.pdf</a></li> <li><a href="https://genkuroki.github.io/documents/Calculus/02%20series.pdf">https://genkuroki.github.io/documents/Calculus/02%20series.pdf</a></li> </ul> <p></aside></p> Mon, 19 Oct 2020 22:42:15 +0900 hatenablog://entry/26006613640861143 math Androidアプリ単体をadbでバックアップ/リストアする https://cartman0.hatenablog.com/entry/2020/09/08/Android%E3%82%A2%E3%83%97%E3%83%AA%E5%8D%98%E4%BD%93%E3%82%92adb%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97/%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E3%81%99%E3%82%8B?utm_source=feed <h1 id="Androidアプリ単体をadbでバックアップリストアする"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>アプリ単体をadbでバックアップ/リストアする</h1> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>アプリ単体を<code>adb</code>でバックアップ/リストアするメモ.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> Platform-Tools内の<code>adb</code>コマンドを使うとアプリ単体または全部のバックアップ/リストアが可能になる.</p> <p>※なお<code>adb backup</code>と<code>adb restore</code>は将来的にdepricate予定になっているので使う場合は注意. 代替コマンドの予定もない?</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#Androidアプリ単体をadbでバックアップリストアする">Androidアプリ単体をadbでバックアップ/リストアする</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#adbとは">adbとは</a></li> <li><a href="#Android-SDK-Platform-Toolsの導入">Android SDK Platform-Toolsの導入</a></li> <li><a href="#バックアップ前の準備">バックアップ前の準備</a><ul> <li><a href="#Androidの開発者向けオプションを有効にする">Androidの開発者向けオプションを有効にする</a></li> <li><a href="#USBデバッグを有効にする">"USBデバッグ"を有効にする</a></li> </ul> </li> <li><a href="#adbコマンドの使い方">adbコマンドの使い方</a></li> <li><a href="#アプリのバックアップをとる">アプリのバックアップをとる</a><ul> <li><a href="#adb-backupコマンド">adb backupコマンド</a></li> </ul> </li> <li><a href="#バックアップを取ったアプリをリストアする">バックアップを取ったアプリをリストアする</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 ver2004(OSビルド 19041.330) <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> Platform-Tools Version 30.0.4-6686687 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> Debug Bridge version 1.0.41</li> </ul> </li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="adbとは">adbとは</h2> <p>adbは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> Debug Bridgeの略.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> Platform-Toolsを導入すると cmdから<code>adb</code>コマンドが使えるようになる.</p> <p>その中でも<code>adb backup</code>と<code>adb restore</code>が使うと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>内のアプリのバックアップ/リストアが可能になる. </section></p> <p><section></p> <h2 id="Android-SDK-Platform-Toolsの導入"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> Platform-Toolsの導入</h2> <p>AndroidStudioをインストールしてる場合はSDKManagerで管理して導入できる.</p> <p>コマンドだけ使いたい場合は,以下からダウンロードできる.</p> <p><a href="https://developer.android.com/studio/releases/platform-tools">SDK Platform Tools release notes &nbsp;|&nbsp; Android Developers</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>でなくzipファイルなので展開して好きなところに置いてPATHを通しておけば導入できる.</p> <p>例:</p> <ul> <li>配置:<code>:C:\platform-tools</code></li> <li>PATH: <ul> <li>変数名<code>ANDROID_SDK_PLATFORM_TOOLS</code>:値<code>C:\platform-tools</code></li> <li>変数名<code>Path</code>: <code>%ANDROID_SDK_PLATFORM_TOOLS%</code></li> </ul> </li> </ul> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3cN6lJfzYvl0g7DnPk-2JUpQkKcw3aYWehuP-3R6Qr-SxKT2dh9-ww7CkfCEvOOlrtRKwwLQ28xn_fLkOxatFhjUL4lQk9jlPHSR_m3_AV0I7GPX-c2BIqcWH6mt5gDbw4z7mnsehL7vRMS0cNqniFISA=w620-h531-no?authuser=0" itemprop="image"></span> <figcaption>adb.exeの確認</figcaption> </figure></p> <p></section></p> <p><section></p> <h2 id="バックアップ前の準備">バックアップ前の準備</h2> <ul> <li>PC接続用のUSBケーブルの準備</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>端末の開発者向けオプションを有効にする.</li> <li>開発者向けオプションから"USB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>"を有効にする</li> </ul> <p><section></p> <h3 id="Androidの開発者向けオプションを有効にする"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>の開発者向けオプションを有効にする</h3> <ol> <li>設定>システム>端末情報>ソフトウェア情報>"ビルド番号"まで開く</li> <li>"ビルド番号"を7回ほど連続でタップする.</li> </ol> <p>これで開発者向けオプションが有効になる.</p> <p></section></p> <p><section></p> <h3 id="USBデバッグを有効にする">"USB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>"を有効にする</h3> <ol> <li>設定>システム>"開発者向けオプション"を開く</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>項目の中の"USB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>"を有効にする.</li> </ol> <p></section></p> <p></section></p> <p><section></p> <h2 id="adbコマンドの使い方">adbコマンドの使い方</h2> <pre class="code" data-lang="" data-unlink>adb &lt;subcommand&gt;</pre> <p>で使う.</p> <p>ex.</p> <pre class="code" data-lang="" data-unlink>adb devices adb backup adb restore</pre> <p>複数端末ある場合は<code>adb devices</code>でデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>番号を調べて <code>-s</code>オプションでデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>指定する.</p> <pre class="code" data-lang="" data-unlink>adb -s &lt;devices id&gt; &lt;subcommand&gt;</pre> <p>ex.</p> <pre class="code" data-lang="" data-unlink>adb -s emulater-5554 backup</pre> <p></section></p> <p><section></p> <h2 id="アプリのバックアップをとる">アプリのバックアップをとる</h2> <p><code>adb backup</code>でバックアップを取れる. オプションなどもメモしておく.</p> <p>流れとしては</p> <ol> <ul> <li>PCと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>をUSBで接続する</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>側で「USBをファイル転送に使用しますか?」で「はい」を選択</li> <li><code>adb backup</code>コマンドでバックアップをとる</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>側でバックアップの許可(confirm)をする.</li> </ul> </ol> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3e0TJamPfoV7AVRySMsP48GL5_jz3Xo9AOP4voE_ITfcbc7RGmSfGBbmPZk584sm-UZu_huuoyLVTHRI2tFKWC-Mbnk4tehU_hNsAv3hjqwITGzvzF3FFeycA9DrflvSM0hpTtB8gHmpGKyLLJbKSP8lw=w343-h685-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>側でconfirm</figcaption> </figure></p> <p><section></p> <h3 id="adb-backupコマンド"><code>adb backup</code>コマンド</h3> <p>基本的な使い方は以下になる. アプリ名を指定する場合package名を使用する(ex. <code>com.xxx.yyy</code>).</p> <pre class="code" data-lang="" data-unlink>adb backup &lt;package name&gt;</pre> <p>以上のコマンドでアプリの<code>Android/data</code>ファイルが含まれる. 他のファイルを含める場合は以下のオプションで指定する.</p> <p>オプション - <code>-apk</code>: apkファイルを含める - <code>-obb</code>: obbフォルダも含める - <code>-shared</code>: SDカード内データも含められる.主に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>内のアプリ全データのバックアップを取るときに使用する. - <code>-f</code>: ファイル名の指定.<code>xxx.ab</code>などとする.</p> <p>参考:</p> <ul> <li><p><a href="https://qiita.com/niusounds/items/7b4959c3b1c1272d6c9a">adb backup&#x306E;&#x30AA;&#x30D7;&#x30B7;&#x30E7;&#x30F3;&#x306B;&#x3064;&#x3044;&#x3066; - Qiita</a></p></li> </ul> <p>ex.</p> <pre class="code" data-lang="" data-unlink>adb -s XXX backup -app -obb -f file.ab com.squareenix.adventures</pre> <p>コマンド実行後に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>端末側でバックアップを実行するかダイアログが出るので許可する.</p> <p></section></p> <p></section></p> <p><section></p> <h2 id="バックアップを取ったアプリをリストアする">バックアップを取ったアプリをリストアする</h2> <p>リストアする端末とPCをUSBで接続しておく.</p> <pre class="code" data-lang="" data-unlink>cd &lt;バックアップファイルのある場所&gt; adb restore file.ab</pre> <p>backupのときと同様に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>端末側でリストアするか聞かれるので許可する.</p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fsp7pc.com%2Fgoogle%2Fandroid%2F34214" title="Androidのアプリをフルバックアップする方法! 設定やセーブデータを保存して完全にまるごと復元しよう" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://sp7pc.com/google/android/34214">sp7pc.com</a></cite></p></li> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fniusounds%2Fitems%2F7b4959c3b1c1272d6c9a" title="adb backupのオプションについて - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://qiita.com/niusounds/items/7b4959c3b1c1272d6c9a">qiita.com</a></cite></p></li> </ul> <p></aside></p> Tue, 08 Sep 2020 02:05:05 +0900 hatenablog://entry/26006613625193722 Android Windows 2次の分数関数の積分とhyperbolic tangentへの変換 https://cartman0.hatenablog.com/entry/2020/09/04/2%E6%AC%A1%E3%81%AE%E5%88%86%E6%95%B0%E9%96%A2%E6%95%B0%E3%81%AE%E7%A9%8D%E5%88%86%E3%81%A8hyperbolic_tangent%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B?utm_source=feed <h1 id="2次の分数関数の積分とhyperbolic-tangentへの変換">2次の分数関数の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>とhyperbolic tangentへの変換</h1> <p>2次の分数関数$\frac{1}{ax^{2}+bx+c}$の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>の導出とhyperbolic tangentへの変換メモ.</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#2次の分数関数の積分とhyperbolic-tangentへの変換">2次の分数関数の積分とhyperbolic tangentへの変換</a><ul> <li><a href="#まず平方完成する">まず平方完成する</a></li> <li><a href="#1x2--k2の積分を求める">$1/(x^{2} + k^{2})$の積分を求める</a></li> <li><a href="#平方完成した式を積分する">平方完成した式を積分する</a><ul> <li><a href="#可視化">可視化</a></li> </ul> </li> <li><a href="#hyperbolic-tangentへの変換">hyperbolic tangentへの変換</a><ul> <li><a href="#tanxをオイラーの公式で表す">$\tan{x}$をオイラーの公式で表す</a></li> <li><a href="#-tanx-をへ変換する">$ \tan{x} $をへ変換する</a></li> <li><a href="#hyperbolic-tangentへ変形">hyperbolic tangentへ変形</a></li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="まず平方完成する">まず平方完成する</h2> <p>分母$ax^{2}+bx+c$を平方完成する.</p> <p>$$ ax^{2} + bx + c = a(x^{2} + b/a x + c/a)\\ = a{ (x+\frac{b}{2a})^{2} + \frac{c}{a} - \frac{b^{2}}{4a^{2}} }\\ = a{ (x+\frac{b}{2a})^{2} + \frac{1}{a}(c - \frac{b^{2}}{4a}) }\\ = a{ (x+\frac{b}{2a})^{2} + \sqrt{\frac{1}{a}(c - \frac{b^{2}}{4a})}^{2} }\ $$</p> <p>これで$X^{2} + K^{2}$の形になった.</p> <p></section></p> <p><section></p> <h2 id="1x2--k2の積分を求める">$1/(x^{2} + k^{2})$の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>を求める</h2> <p> $1/(x^{2} + k^{2})$の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>を求める.これは$\tan^{-1}{(x/k)}/k$(arc tangent)の形になる.</p> <p>$y = \frac{1}{k}\tan^{-1}{(x/k)}$の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>を考える.</p> <p>$$ ky = \tan^{-1}{(x/k)}\ x/k = \tan{ky}\ x = k \tan{ky} $$</p> <p>$\tan{x} = \sin{x}/\cos{x}$より</p> <p>$$ x = k \tan{(ky)}\ = k\frac{ \sin{(ky)} }{ \cos{(ky)} } $$</p> <p>これをyで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cfrac%7Bdx%7D%7Bdy%7D%0A%26%3D%26%20k%5Cfrac%7Bd%7D%7Bdy%7D%5Cfrac%7B%20%5Csin%7B%28ky%29%7D%20%7D%7B%20%5Ccos%7B%28ky%29%7D%20%7D%5C%5C%5C%5C%0A%26%3D%26%20k%20%5Cfrac%7B%5Csin%27%7B%28ky%29%7D%5Ccos%7B%28ky%29%7D%20-%20%5Csin%7B%28ky%29%7D%5Ccos%7B%28ky%29%27%7D%20%7D%7B%5Ccos%7B%28ky%29%7D%5E%7B2%7D%7D%5C%5C%5C%5C%0A%26%3D%26%20k%20%5Cfrac%7Bk%5Ccos%7B%28ky%29%7D%5E%7B2%7D%20%2B%20k%5Csin%7B%28ky%29%7D%5E%7B2%7D%20%7D%7B%5Ccos%7B%28ky%29%7D%5E%7B2%7D%7D%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7Bk%5E%7B2%7D%20%7D%7B%5Ccos%7B%28ky%29%7D%5E%7B2%7D%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \frac{dx}{dy} &amp;=&amp; k\frac{d}{dy}\frac{ \sin{(ky)} }{ \cos{(ky)} }\\\\ &amp;=&amp; k \frac{\sin&#39;{(ky)}\cos{(ky)} - \sin{(ky)}\cos{(ky)&#39;} }{\cos{(ky)}^{2}}\\\\ &amp;=&amp; k \frac{k\cos{(ky)}^{2} + k\sin{(ky)}^{2} }{\cos{(ky)}^{2}}\\\\ &amp;=&amp; \frac{k^{2} }{\cos{(ky)}^{2}} \end{eqnarray*} "/> </div> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%D5%B4%D8%BF%F4">逆関数</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>より</p> <p>$$ \frac{dy}{dx} = \frac{1}{k^{2} }\frac{1}{\frac{1}{ \cos{(ky)}^{2} } } $$</p> <p>$\cos{(ay)}^2$を変換する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Ccos%5E2%7B%28ky%29%7D%20%2B%20%5Csin%5E%7B2%7D%7B%28ky%29%7D%20%3D%201%20%5C%5C%5C%5C%0A1%20%2B%20%5Cfrac%7B%5Csin%5E%7B2%7D%7B%28ky%29%7D%7D%7B%5Ccos%5E2%7B%28ky%29%7D%7D%20%3D%20%5Cfrac%7B1%7D%7B%5Ccos%5E2%7B%28ky%29%7D%7D%20%5C%5C%5C%5C%0A%5Cfrac%7B1%7D%7B%5Ccos%5E2%7B%28ky%29%7D%7D%20%3D%201%20%2B%20%5Ctan%5E%7B2%7D%7B%28ky%29%7D%20%20%5C%5C%5C%5C%0A" alt=" \cos^2{(ky)} + \sin^{2}{(ky)} = 1 \\\\ 1 + \frac{\sin^{2}{(ky)}}{\cos^2{(ky)}} = \frac{1}{\cos^2{(ky)}} \\\\ \frac{1}{\cos^2{(ky)}} = 1 + \tan^{2}{(ky)} \\\\ "/> </div> <p>よって,</p> <p>$$ \frac{dy}{dx} = \frac{1}{k^{2} }\frac{1}{1 + \tan^{2}{(ky)} } \\ = \frac{1}{k^{2} +( k\tan{(ky)})^{2} } \ $$</p> <p>今,$x=k\tan{(ky)}$より</p> <p>$$ \frac{d}{dx}(\frac{1}{k}\tan^{-1}{(x/k)}) = \frac{1}{ x^{2} + k^{2} } \ $$</p> <p>$$ \int \frac{1}{x^{2} + k^{2} } dx = \frac{1}{k}\tan^{-1}{(x/k)} $$</p> <p></section></p> <p><section></p> <h2 id="平方完成した式を積分する">平方完成した式を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>する</h2> <p>$a{ (x+\frac{b}{2a})^{2} + \sqrt{\frac{1}{a}(c - \frac{b^{2}}{4a})}^{2} }$ を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>する.</p> <p>$$ X = (x+\frac{b}{2a}) \ K = \sqrt{\frac{1}{a}(c - \frac{b^{2}}{4a})}\ $$</p> <p>とおくと,</p> <p>$$ a{ (x+\frac{b}{2a})^{2} + \sqrt{\frac{1}{a}(c - \frac{b^{2}}{4a})}^{2} } = a( X^{2} + K^{2} ) $$</p> <p>よって,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>は,</p> <p>$$ \frac{1}{a} \int \frac{1}{ X^{2} + K^{2} } dX = \frac{1}{a} \cdot \frac{1}{K}\tan^{-1}{(X / K)} $$</p> <p>$X$と$K$を戻すと,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cfrac%7B1%7D%7Ba%7D%20%20%5Ccdot%20%5Cfrac%7B1%7D%7BK%7D%5Ctan%5E%7B-1%7D%7B%28X%20%2F%20K%29%7D%0A%26%3D%26%20%5Cfrac%7B1%7D%7Ba%7D%20%5Ccdot%20%5Csqrt%7B%5Cfrac%7Ba%7D%7B%28c%20-%20%5Cfrac%7Bb%5E%7B2%7D%7D%7B4a%7D%29%7D%7D%20%5Ctan%5E%7B-1%7D%7B%5Cleft%5B%20%28x%2B%5Cfrac%7Bb%7D%7B2a%7D%29%20%5Csqrt%7B%20%5Cfrac%7Ba%7D%7B%28c%20-%20%5Cfrac%7Bb%5E%7B2%7D%7D%7B4a%7D%29%7D%20%7D%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Csqrt%7B%5Cfrac%7B1%7D%7B%28ac%20-%20%5Cfrac%7Bb%5E%7B2%7D%7D%7B4%7D%29%7D%7D%5Ctan%5E%7B-1%7D%7B%5Cleft%5B%20%5Cfrac%7B2a%7D%7B2a%7D%28x%2B%5Cfrac%7Bb%7D%7B2a%7D%29%20%5Csqrt%7B%20%5Cfrac%7Ba%7D%7B%28c%20-%20%5Cfrac%7Bb%5E%7B2%7D%7D%7B4a%7D%29%7D%20%7D%20%5Cright%5D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Csqrt%7B%5Cfrac%7B1%7D%7B%28ac%20-%20%5Cfrac%7Bb%5E%7B2%7D%7D%7B4%7D%29%7D%7D%5Ctan%5E%7B-1%7D%7B%5Cleft%5B%20%282ax%2Bb%29%20%5Csqrt%7B%20%5Cfrac%7B1%7D%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%20%5Cright%5D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B2%7D%7B2%7D%5Csqrt%7B%5Cfrac%7B1%7D%7B%28ac%20-%20%5Cfrac%7Bb%5E%7B2%7D%7D%7B4%7D%29%7D%7D%5Ctan%5E%7B-1%7D%7B%5Cleft%5B%20%282ax%2Bb%29%20%5Csqrt%7B%20%5Cfrac%7B1%7D%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%20%5Cright%5D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B1%7D%7B%20%5Csqrt%7B%20%284ac%20-%20b%5E%7B2%7D%29%20%7D%20%7D2%5Ctan%5E%7B-1%7D%7B%20%5Cleft%5B%20%5Cfrac%7B%282ax%2Bb%29%7D%7B%20%20%5Csqrt%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \frac{1}{a} \cdot \frac{1}{K}\tan^{-1}{(X / K)} &amp;=&amp; \frac{1}{a} \cdot \sqrt{\frac{a}{(c - \frac{b^{2}}{4a})}} \tan^{-1}{\left[ (x+\frac{b}{2a}) \sqrt{ \frac{a}{(c - \frac{b^{2}}{4a})} } \right] } \\\\ &amp;=&amp; \sqrt{\frac{1}{(ac - \frac{b^{2}}{4})}}\tan^{-1}{\left[ \frac{2a}{2a}(x+\frac{b}{2a}) \sqrt{ \frac{a}{(c - \frac{b^{2}}{4a})} } \right]} \\\\ &amp;=&amp; \sqrt{\frac{1}{(ac - \frac{b^{2}}{4})}}\tan^{-1}{\left[ (2ax+b) \sqrt{ \frac{1}{(4ac - b^{2})} } \right]} \\\\ &amp;=&amp; \frac{2}{2}\sqrt{\frac{1}{(ac - \frac{b^{2}}{4})}}\tan^{-1}{\left[ (2ax+b) \sqrt{ \frac{1}{(4ac - b^{2})} } \right]} \\\\ &amp;=&amp; \frac{1}{ \sqrt{ (4ac - b^{2}) } }2\tan^{-1}{ \left[ \frac{(2ax+b)}{ \sqrt{(4ac - b^{2})} } \right] } \\\\ \end{eqnarray*} "/> </div> <p>よって,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cint%20%5Cfrac%7B1%7D%7Bax%5E%7B2%7D%20%2B%20bx%20%2B%20c%7D%20dx%0A%3D%20%5Cfrac%7B1%7D%7B%20%5Csqrt%7B%20%284ac%20-%20b%5E%7B2%7D%29%20%7D%20%7D2%5Ctan%5E%7B-1%7D%7B%20%5Cleft%5B%20%5Cfrac%7B%282ax%2Bb%29%7D%7B%20%20%5Csqrt%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%20%5Cright%5D%20%7D%20%2B%20C%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \int \frac{1}{ax^{2} + bx + c} dx = \frac{1}{ \sqrt{ (4ac - b^{2}) } }2\tan^{-1}{ \left[ \frac{(2ax+b)}{ \sqrt{(4ac - b^{2})} } \right] } + C \\\\ \end{eqnarray} "/> </div> <p><section></p> <h3 id="可視化">可視化</h3> <p>$x=0$を開始点として,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>の初期値を0として$y=\frac{1}{ax^{2}+bx+c}$とx軸間の面積を求める場合,</p> <p>$$ 0 = \frac{1}{\sqrt{4ac - b^{2}}} 2\tan^{-1}{[\frac{2a \cdot 0 + b}{\sqrt{4ac - b^{2} }}]}+C \\ C = -\frac{1}{\sqrt{4ac - b^{2}}} 2\tan^{-1}{[\frac{b}{\sqrt{4ac - b^{2}}}]} $$</p> <p>よって,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Cint%20%5Cfrac%7B1%7D%7Bax%5E%7B2%7D%2Bbx%2Bc%7D%20dx%0A%3D%20%5Cfrac%7B2%7D%7B%5Csqrt%7B4ac%20-%20b%5E2%7D%7D%20%5Cleft%28%20%5Ctan%5E%7B-1%7D%7B%5B%20%5Cfrac%7B2ax%20%2B%20b%7D%7B%5Csqrt%7B4ac%20-%20b%5E2%7D%7D%5D%20%7D%20-%20%5Ctan%5E%7B-1%7D%7B%5B%20%5Cfrac%7Bb%7D%7B%5Csqrt%7B4ac%20-%20b%5E2%7D%7D%20%5D%7D%20%5Cright%29%20%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \int \frac{1}{ax^{2}+bx+c} dx = \frac{2}{\sqrt{4ac - b^2}} \left( \tan^{-1}{[ \frac{2ax + b}{\sqrt{4ac - b^2}}] } - \tan^{-1}{[ \frac{b}{\sqrt{4ac - b^2}} ]} \right) \\ \end{eqnarray} "/> </div> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3f-Qn2XfWKSO5MmeDnmlCVkoztIFQhzVrv5xhkS_Byrlkq_Zt9TbyOuvSyDYcnt0tI_SAWDTvhuCvJ2r3utkxXYQeHE2NXxFWS4sa2-PiVg0t-r-t6zDIJ7_kCSpDL7UWNmfpz7D0bZQ0CohoD6Iz-VCg=s360-no?authuser=0" itemprop="image"></span> <figcaption>fig. $1/(ax^{2}+bx+c)$の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a></figcaption> </figure></p> <p>可視化用コード:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt a = <span class="synConstant">1</span> b = <span class="synConstant">1</span> c = <span class="synConstant">1</span> x = np.linspace(<span class="synConstant">0</span>, <span class="synConstant">1</span>) f = <span class="synConstant">1</span> / ( a * x**<span class="synConstant">2</span> + b * x +c ) fig = plt.figure(figsize=(<span class="synConstant">5</span>,<span class="synConstant">5</span>)) plt.plot(x, f, label=<span class="synConstant">&quot;$1/(ax^2+bx+c)$&quot;</span>) beta = np.sqrt(<span class="synConstant">4</span>*a*c - b*b) inte = (<span class="synConstant">2</span>*np.arctan((<span class="synConstant">2</span>*a*x+b)/beta))/beta C = -<span class="synConstant">2</span>*np.arctan(b/beta)/beta inte += C plt.plot(x, inte, label=<span class="synConstant">&quot;integral&quot;</span>) plt.xlim(-<span class="synConstant">.1</span>, <span class="synConstant">1.1</span>) plt.ylim(-<span class="synConstant">.1</span>, <span class="synConstant">1.1</span>) plt.legend() plt.grid(<span class="synIdentifier">True</span>) plt.title(<span class="synConstant">&quot;a=1, b=1, c=1&quot;</span>) plt.savefig(<span class="synConstant">&quot;(ax2+bx+c)-1_integral.png&quot;</span>) plt.show() </pre> <p></section> </section></p> <p><section></p> <h2 id="hyperbolic-tangentへの変換">hyperbolic tangentへの変換</h2> <p>今,変数分離型の次の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>があるとする.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cfrac%7Bdx%7D%7Bdt%7D%20%26%3D%26%20%28ax%5E%7B2%7D%2Bbx%2Bc%29f%28t%29%5C%5C%5C%5C%0A%5Cint%20%5Cfrac%7B1%7D%7B%28ax%5E2%2Bbx%2Bc%29%7D%20dx%20%26%3D%26%20%5Cint%20f%28t%29%20dt%20%5C%5C%5C%5C%0A%5Cfrac%7B1%7D%7B%20%5Csqrt%7B%20%284ac%20-%20b%5E%7B2%7D%29%20%7D%20%7D2%5Ctan%5E%7B-1%7D%7B%20%5Cleft%5B%20%5Cfrac%7B%282ax%2Bb%29%7D%7B%20%20%5Csqrt%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%20%5Cright%5D%20%7D%20%26%3D%26%20F%28t%29%20%2B%20C%20%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \frac{dx}{dt} &amp;=&amp; (ax^{2}+bx+c)f(t)\\\\ \int \frac{1}{(ax^2+bx+c)} dx &amp;=&amp; \int f(t) dt \\\\ \frac{1}{ \sqrt{ (4ac - b^{2}) } }2\tan^{-1}{ \left[ \frac{(2ax+b)}{ \sqrt{(4ac - b^{2})} } \right] } &amp;=&amp; F(t) + C \end{eqnarray*} "/> </div> <ul> <li>$C$は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC%C4%EA%BF%F4">積分定数</a></li> </ul> <p>これをarc tangentからtangentへ変換する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Ctan%5E%7B-1%7D%7B%20%5Cleft%5B%20%5Cfrac%7B%282ax%2Bb%29%7D%7B%20%20%5Csqrt%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%20%5Cright%5D%20%7D%20%26%3D%26%20%5Cfrac%7B%5Csqrt%7B%20%284ac%20-%20b%5E%7B2%7D%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5C%5C%5C%5C%0A%5Ctan%7B%5Cleft%5B%20%5Cfrac%7B%5Csqrt%7B%20%284ac%20-%20b%5E%7B2%7D%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%7D%0A%26%3D%26%20%5Cfrac%7B%282ax%2Bb%29%7D%7B%20%20%5Csqrt%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \tan^{-1}{ \left[ \frac{(2ax+b)}{ \sqrt{(4ac - b^{2})} } \right] } &amp;=&amp; \frac{\sqrt{ (4ac - b^{2}) }}{2} (F(t)+C) \\\\ \tan{\left[ \frac{\sqrt{ (4ac - b^{2}) }}{2} (F(t)+C) \right]} &amp;=&amp; \frac{(2ax+b)}{ \sqrt{(4ac - b^{2})} } \\\\ \end{eqnarray*} "/> </div> <p><section></p> <h3 id="tanxをオイラーの公式で表す">$\tan{x}$を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%A4%A5%E9%A1%BC%A4%CE%B8%F8%BC%B0">オイラーの公式</a>で表す</h3> <p>$$ \sin{x} = \frac{e^{ix} - e{-ix}}{2i}\ \cos{x} = \frac{e^{ix} + e{-ix}}{2} $$</p> <p>ここで$i=\sqrt{-1}$の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>単位</p> <p>よって,</p> <p>$$ \tan{x} = \frac{\sin{x}}{\cos{x}}\ = \frac{e^{ix} - e{-ix}}{i(e^{ix} + e{-ix})} $$</p> <p></section></p> <p><section></p> <h3 id="-tanx-をへ変換する">$ \tan{x} $を<img alt=" \tanh{x} " src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctanh%7Bx%7D%20" />へ変換する</h3> <p>hyperbolic tangentの定義は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Ctanh%7Bx%7D%20%3D%20%5Cfrac%7Be%5E%7Bx%7D%20-%20e%5E%7B-x%7D%7D%7Be%5E%7Bx%7D%20%2B%20e%5E%7B-x%7D%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \tanh{x} = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} \end{eqnarray*} "/> </div> <p>tanの式を変形して上記の形にする.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A-i%5Ctan%7B%28ix%29%7D%0A%26%3D%26%20-i%20%5Cfrac%7Be%5E%7Bi%5E2%20x%7D%20-%20e%7B-i%5E2x%7D%7D%7Bi%28e%5E%7Bi%5E2x%7D%20%2B%20e%7B-i%5E2x%7D%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20-%20%5Cfrac%7Be%5E%7B-%20x%7D%20-%20e%7Bx%7D%7D%7B%28e%5E%7B-x%7D%20%2B%20e%7Bx%7D%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7Be%7Bx%7D%20-%20e%5E%7B-%20x%7D%7D%7Be%5E%7B-x%7D%20%2B%20e%7Bx%7D%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Ctanh%7Bx%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} -i\tan{(ix)} &amp;=&amp; -i \frac{e^{i^2 x} - e{-i^2x}}{i(e^{i^2x} + e{-i^2x})} \\\\ &amp;=&amp; - \frac{e^{- x} - e{x}}{(e^{-x} + e{x})} \\\\ &amp;=&amp; \frac{e{x} - e^{- x}}{e^{-x} + e{x}} \\\\ &amp;=&amp; \tanh{x} \end{eqnarray*} "/> </div> <p>よって,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A-i%5Ctan%7B%28ix%29%7D%0A%3D%20%5Ctanh%7Bx%7D%20%5C%5C%5C%5C%0A%5Ctan%7B%28ix%29%7D%20%3D%20i%5Ctanh%7Bx%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} -i\tan{(ix)} = \tanh{x} \\\\ \tan{(ix)} = i\tanh{x} \end{eqnarray*} "/> </div> <p>ちなみに<a class="keyword" href="http://d.hatena.ne.jp/keyword/sinh">sinh</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/cosh">cosh</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/tanh">tanh</a>, tanを可視化すると</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3f2zgNtr9cjrlrztwW24gC9-UgQ6XF9lY4xB69EKaYpkDHE7ryM_qJtDflvRvx237unyOGPpN67l9luYXzDkR7u3aQENF8KXnbIEWg7qweW_fUDMjDBS578FdEnuYHbl-WBub3v9FGAip8TQJpm1JMb2g=w432-h288-no?authuser=0" itemprop="image"></span> <figcaption>fig. <a class="keyword" href="http://d.hatena.ne.jp/keyword/sinh">sinh</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/cosh">cosh</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/tanh">tanh</a>, tanの可視化</figcaption> </figure></p> <p>tanの無限に上昇にする部分がhyperbolic tangentでは裏返しのようにされて$\pm 1$へ収束するようになっている.</p> <p>可視化コード:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># 双曲線</span> <span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt x = np.linspace(-<span class="synConstant">1</span>, +<span class="synConstant">1</span>, <span class="synConstant">1000</span>) sinh = (np.exp(x) - np.exp(-x))/<span class="synConstant">2</span> cosh = (np.exp(x) + np.exp(-x))/<span class="synConstant">2</span> tanh = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x)) tan = (np.tan(x)) plt.plot(x, sinh, label=<span class="synConstant">&quot;sinh&quot;</span>) plt.plot(x, cosh, label=<span class="synConstant">&quot;cosh&quot;</span>) plt.plot(x, tanh, label=<span class="synConstant">&quot;tanh&quot;</span>) plt.plot(x, tan, label=<span class="synConstant">&quot;tan&quot;</span>) <span class="synComment"># plt.plot(x, 1/tanh, label=&quot;1/tanh&quot;)</span> plt.legend() plt.grid(<span class="synIdentifier">True</span>) plt.savefig(<span class="synConstant">&quot;img/img_chapter7/sinh_cosh_tanh_tan.png&quot;</span>) plt.show() </pre> <p></section></p> <p><section></p> <h3 id="hyperbolic-tangentへ変形">hyperbolic tangentへ変形</h3> <p>次の左辺をhyperbolic tangentへ変形する.</p> <p>$$ \tan{\left[ \frac{\sqrt{ (4ac - b^{2}) }}{2} (F(t)+C) \right]} = \frac{(2ax+b)}{ \sqrt{(4ac - b^{2})} } $$</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Ctan%7B%5Cleft%5B%20%5Cfrac%7B%5Csqrt%7B%20%284ac%20-%20b%5E%7B2%7D%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%0A%26%3D%26%20%5Ctan%7B%5Cleft%5B%20%5Cfrac%7B%5Csqrt%7B%20-%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Ctan%7B%5Cleft%5B%20%5Cfrac%7B%5Csqrt%7B%20i%5E2%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Ctan%7B%5Cleft%5B%20%5Cfrac%7Bi%20%5Csqrt%7B%20%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A%26%3D%26%20i%20%5Ctanh%7B%5Cleft%5B%20%5Cfrac%7B%20%5Csqrt%7B%20%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \tan{\left[ \frac{\sqrt{ (4ac - b^{2}) }}{2} (F(t)+C) \right] } &amp;=&amp; \tan{\left[ \frac{\sqrt{ -( b^{2} - 4ac) }}{2} (F(t)+C) \right] } \\\\ &amp;=&amp; \tan{\left[ \frac{\sqrt{ i^2 ( b^{2} - 4ac) }}{2} (F(t)+C) \right] } \\\\ &amp;=&amp; \tan{\left[ \frac{i \sqrt{ ( b^{2} - 4ac) }}{2} (F(t)+C) \right] } \\\\ &amp;=&amp; i \tanh{\left[ \frac{ \sqrt{ ( b^{2} - 4ac) }}{2} (F(t)+C) \right] } \\\\ \end{eqnarray*} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%20%5Cbegin%7Beqnarray%7D%0Ai%20%5Ctanh%7B%5Cleft%5B%20%5Cfrac%7B%20%5Csqrt%7B%20%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%0A%3D%20%5Cfrac%7B%282ax%2Bb%29%7D%7B%20%20%5Csqrt%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} i \tanh{\left[ \frac{ \sqrt{ ( b^{2} - 4ac) }}{2} (F(t)+C) \right] } = \frac{(2ax+b)}{ \sqrt{(4ac - b^{2})} } \end{eqnarray} "/> </div> <p>$x$の式に直す.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A2ax%20%2B%20b%20%26%3D%26%20%20%5Csqrt%7B%284ac%20-%20b%5E%7B2%7D%29%7D%20i%20%5Ctanh%7B%5Cleft%5B%20%5Cfrac%7B%20%5Csqrt%7B%20%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A2ax%20%2B%20b%20%26%3D%26%20%20-%20%5Csqrt%7B%28b%5E%7B2%7D-4ac%29%7D%20%20%5Ctanh%7B%5Cleft%5B%20%5Cfrac%7B%20%5Csqrt%7B%20%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0A2ax%20%26%3D%26%20-b%20%20-%20%5Csqrt%7B%28b%5E%7B2%7D-4ac%29%7D%20%20%5Ctanh%7B%5Cleft%5B%20%5Cfrac%7B%20%5Csqrt%7B%20%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%20%5C%5C%5C%5C%0Ax%20%26%3D%26%20%5Cfrac%7B-b%20%20-%20%5Csqrt%7B%28b%5E%7B2%7D-4ac%29%7D%20%20%5Ctanh%7B%5Cleft%5B%20%5Cfrac%7B%20%5Csqrt%7B%20%20%28%20b%5E%7B2%7D%20-%204ac%29%20%7D%7D%7B2%7D%20%28F%28t%29%2BC%29%20%5Cright%5D%20%7D%7D%7B2a%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} 2ax + b &amp;=&amp; \sqrt{(4ac - b^{2})} i \tanh{\left[ \frac{ \sqrt{ ( b^{2} - 4ac) }}{2} (F(t)+C) \right] } \\\\ 2ax + b &amp;=&amp; - \sqrt{(b^{2}-4ac)} \tanh{\left[ \frac{ \sqrt{ ( b^{2} - 4ac) }}{2} (F(t)+C) \right] } \\\\ 2ax &amp;=&amp; -b - \sqrt{(b^{2}-4ac)} \tanh{\left[ \frac{ \sqrt{ ( b^{2} - 4ac) }}{2} (F(t)+C) \right] } \\\\ x &amp;=&amp; \frac{-b - \sqrt{(b^{2}-4ac)} \tanh{\left[ \frac{ \sqrt{ ( b^{2} - 4ac) }}{2} (F(t)+C) \right] }}{2a} \end{eqnarray*} "/> </div> <p>この式はSIRモデルのRecoveredを時間tの関数に直すと出てくる.</p> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="http://www.physics.umd.edu/hep/drew/IntegralTable.pdf">http://www.physics.umd.edu/hep/drew/IntegralTable.pdf</a></p></li> </ul> <p></aside></p> Fri, 04 Sep 2020 08:04:34 +0900 hatenablog://entry/26006613623568312 math 微分方程式 微分方程式モデルでPursuitCurve問題を解く:hawk-pigeon問題 https://cartman0.hatenablog.com/entry/2020/08/27/%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7PursuitCurve%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F%3Ahawk-pigeon%E5%95%8F%E9%A1%8C?utm_source=feed <h1 id="微分方程式モデルでPursuitCurve問題を解くhawk-pigeon問題"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>モデルでPursuitCurve問題を解く:hawk-pigeon問題</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>モデルでPursuitCurve問題:hawk-pigeon問題(鳩を追いかける鷹の追跡曲線)を解くメモ.</p> <p>hawk-pigeonモデルとここでは呼んでいるが他の専門書では</p> <ul> <li>商船を追いかける海賊船</li> <li>飛んでいる飛行機を撃ち落とすための迎撃ミサイル</li> </ul> <p>などの追跡曲線で紹介されている.</p> <p>今回は以下をまとめる.</p> <ul> <li>その<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>がどんな形になるか</li> <li>どう解くか</li> <li>capture time(捕捉時間)はどうなるか</li> </ul> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3dTf-Cxb7pCdiXY8FBEvEDL5rng-bgjxO36UR2pIawVopODSUKKQh_Pb8Vr_pLHV6H54b1oAglkWBssp4y1HQXa9UgCdKnqCs9snjoEnvHEACbrtlCY5o0VoFwLxMiOIYL9oLAgXDfjgBKOwHblCngIdw=s360-no?authuser=0" itemprop="image"></span> <figcaption>図1. hawk-pigeon problem</figcaption> </figure></p> <p>参考:</p> <ul> <li><a href="https://b-ok.asia/book/2330460/72496b?regionChanged=&amp;redirect=11886211">D.N.Burghers, M.S.Borrie, "Modelling with Differential Equations", chapter6:Non-Linear Second Order Differential Equations, p.134</a></li> <li><a href="https://mse.redwoods.edu/darnold/math55/DEproj/sp08/mseverdia/pursuit.pdf">https://mse.redwoods.edu/darnold/math55/DEproj/sp08/mseverdia/pursuit.pdf</a></li> </ul> <p><nav></p> <ul class="table-of-contents"> <li><a href="#微分方程式モデルでPursuitCurve問題を解くhawk-pigeon問題">微分方程式モデルでPursuitCurve問題を解く:hawk-pigeon問題</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#Pursuit-Curveとは">Pursuit Curveとは</a></li> <li><a href="#問題設定">問題設定</a></li> <li><a href="#微分方程式を立てる">微分方程式を立てる</a></li> <li><a href="#微分方程式を解く">微分方程式を解く</a></li> <li><a href="#可視化と分析">可視化と分析</a></li> <li><a href="#capture-time捕捉時間を求める">capture time(捕捉時間)を求める</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 ver2004(OSビルド 19041.330)</li> <li>Docker for win v19.03.12 <ul> <li>jupyter/scipy-notebook</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="Pursuit-Curveとは">Pursuit Curveとは</h2> <p>Pursuit Curveとは日本語で追跡曲線のことである. ある追跡者(chaser)が環境の外部要因を受けながら対象(target)を追いかけるときの軌跡を求める問題である.</p> <p>解析としては,初期位置や初期速度により追跡者が対象に到達可能化どうか,到達可能な場合そのときの捕捉時間(capture time)などを調べる.</p> <p>対象物への追跡曲線の作り方・考え方としては,追跡曲線の接線が常に対象物と交わるにすることで その軌跡はいずれ接線と平行するようになり,十分な速度があれば対象物に到達できる.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3f1z0dVmDMOQtCQMwWf5sjztikfD4ew8WLilkCoZb2p2Pt1S_bekdCJt5kbBnBfhzoU1dxN8B8epwPFABDXthd4kdMHBpbfFVJrUQvwppRYTYZcwHISw_hkoMKQFvdGoIppw2fh7QLTLz09RH-iMCHzXA=s432-no?authuser=0" itemprop="image"></span> <figcaption>接線は常に対象と交わる</figcaption> </figure></p> <p></section></p> <p><section></p> <h2 id="問題設定">問題設定</h2> <p>2次元平面$(x,y)$を考え,</p> <ul> <li>鳩Q(target)が等速$v>0$でこの座標$(b=0,vt)$上を飛んでいるとする.</li> <li>鷹P(chaser)は時間$t=0$で初期位置$(a>0, 0)$で鳩Qを見つけそれを等速$w>0$で追跡しようとする.</li> </ul> <p>このときの鷹Pの追跡曲線を求める.</p> <p></section></p> <p><section></p> <h2 id="微分方程式を立てる"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>を立てる</h2> <p>鷹の軌道$P(x_{h}, y_{h})$の接線の傾きは</p> <p>$$ \frac{dy(x_{h})}{dx}= \frac{y - y_{h}}{x - x_{h}} $$</p> <p>鳩Q$(b=0, vt)$と交わるので</p> <p>$$ \frac{dy(x_h)}{dx} =\frac{y-y_h}{x-x_h}\\ = \frac{vt-y_h}{b-x_h}\\ = \frac{vt-y_h}{0-x_h}\\ = \frac{y_h-vt}{x_h}\\ $$</p> <p>時間$t$の式に直す.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cfrac%7Bvt-y%7D%7Bb-x%7D%20%26%3D%26%20%5Cfrac%7Bdy%7D%7Bdx%7D%5C%5C%0Avt-y%20%26%3D%26%20%28b-x%29%5Cfrac%7Bdy%7D%7Bdx%7D%5C%5C%0Avt%20%26%3D%26%20y%20%2B%20%28b-x%29%5Cfrac%7Bdy%7D%7Bdx%7D%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \frac{vt-y}{b-x} &amp;=&amp; \frac{dy}{dx}\\ vt-y &amp;=&amp; (b-x)\frac{dy}{dx}\\ vt &amp;=&amp; y + (b-x)\frac{dy}{dx}\\ \end{eqnarray*} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0At%20%3D%20%5Cfrac%7By%7D%7Bv%7D%20-%20%5Cfrac%7Bx-b%7D%7Bv%7D%5Cfrac%7Bdy%7D%7Bdx%7D%2C%20%281%29%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} t = \frac{y}{v} - \frac{x-b}{v}\frac{dy}{dx}, (1) \end{eqnarray} "/> </div> <p>合成速度$w$は</p> <p>$$ w = \sqrt{\dot{x}^{2} + \dot{y}^{2}}\ = \sqrt{(\frac{dx}{dt})^{2} + (\frac{dy}{dt})^{2}} $$</p> <p>時間tで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>する.</p> <p>$$ wt = \int_{0}^{t} \sqrt{(\frac{dx}{dt'})^{2} + (\frac{dy}{dt'})^{2}}dt' $$</p> <p>時間[0, t]でx軸で[a,a-x]まで移動したとすると</p> <p>$$ wt = \int_{a}^{a-x} \sqrt{(dx')^{2} + (dy)^{2}}\\ = \int_{a}^{a-x} \sqrt{1 + (\frac{dy}{dx'})^{2}}dx' $$</p> <p>$a-x=x'$として変数変換する.</p> <p>$$ dx' = -dx\\ wt = \int_{0}^{x'} \sqrt{1 + (\frac{dy}{dx})^{2}}(-dx)\\ = - \int_{0}^{x'} \sqrt{1 + (\frac{dy}{dx})^{2}}dx $$</p> <p>時間tの式に直すと</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0At%3D%20-%5Cfrac%7B1%7D%7Bw%7D%20%5Cint_0%5Ex%20%5Csqrt%7B1%20%2B%20%28%5Cfrac%7Bdy%7D%7Bdx%27%7D%29%5E2%7Ddx%27%2C%20%282%29%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} t= -\frac{1}{w} \int_0^x \sqrt{1 + (\frac{dy}{dx&#39;})^2}dx&#39;, (2) \end{eqnarray} "/> </div> <p>(1)式と(2)式で等式を作ると,</p> <p>$$ -\frac{1}{w} \int_{0}^{x} \sqrt{1 + (\frac{dy}{dx'})^{2}}dx' = \frac{y}{v} - \frac{x-b}{v}\frac{dy}{dx} $$</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F3%C0%FE%B7%C1">非線形</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>になる.</p> <p>置換して解ける形に直す. $p(x) = \frac{dy}{dx}$として置換する.</p> <p>$$ -\frac{1}{w} \int_{0}^{x} \sqrt{1 + p(x')^{2}}dx' = \frac{y}{v} - \frac{x-b}{v}p(x)\ $$</p> <p>両辺を$x$で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>する.</p> <p>$$ -\frac{1}{w} (\sqrt{1 + p(x)^{2}} - \sqrt{1 + p(a)^{2}}) = \frac{1}{v}\frac{dy}{dx} - \frac{x-b}{v}\frac{dp}{dx} - \frac{1}{v}p(x) $$</p> <p>$dp/dx$の式に直す.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cfrac%7Bx-b%7D%7Bv%7D%5Cfrac%7Bdp%7D%7Bdx%7D%20%26%3D%26%20%5Cfrac%7B1%7D%7Bw%7D%20%28%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%29%5C%5C%0A%28x-b%29%5Cfrac%7Bdp%7D%7Bdx%7D%20%26%3D%26%20%5Cfrac%7Bv%7D%7Bw%7D%20%28%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%29%5C%5C%0A%28x-b%29%5Cfrac%7Bdp%7D%7Bdx%7D%20%26%3D%26%20u%20%28%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%29%2C%20u%3D%5Cfrac%7Bv%7D%7Bw%7D%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \frac{x-b}{v}\frac{dp}{dx} &amp;=&amp; \frac{1}{w} (\sqrt{1 + p(x)^2})\\ (x-b)\frac{dp}{dx} &amp;=&amp; \frac{v}{w} (\sqrt{1 + p(x)^2})\\ (x-b)\frac{dp}{dx} &amp;=&amp; u (\sqrt{1 + p(x)^2}), u=\frac{v}{w}\\ \end{eqnarray*} "/> </div> <p></section></p> <p><section></p> <h2 id="微分方程式を解く"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>を解く</h2> <p>変数分離可能な形になったので解くことができる.</p> <p>変数分離に直す.</p> <p>$$ \frac{dp}{\sqrt{1 + p(x)^{2}}} = \frac{u}{x-b} dx\ $$</p> <p>$x>b$として<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>する.</p> <p>$$ \ln{[p + \sqrt{1 + p(x)^{2}}]} + C = u\ln{(x-b)}\ $$</p> <p>初期条件$x=a, y=0, p(a)=dy/dx = 0, b=0 $として定数を求める.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cln%7B%5Bp%20%2B%20%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%5D%7D%20%2B%20C%20%26%3D%26%20u%5Cln%7B%28x-b%29%7D%5C%5C%5C%5C%0A%5Cln%7B%5B0%20%2B%20%5Csqrt%7B1%20%2B%200%5E2%7D%5D%7D%20%2B%20C%20%26%3D%26%20u%5Cln%7B%28x-b%29%7D%5C%5C%5C%5C%0AC%20%26%3D%26%20u%5Cln%7B%28a-b%29%7D%2C%20%28a%3Eb%29%20%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \ln{[p + \sqrt{1 + p(x)^2}]} + C &amp;=&amp; u\ln{(x-b)}\\\\ \ln{[0 + \sqrt{1 + 0^2}]} + C &amp;=&amp; u\ln{(x-b)}\\\\ C &amp;=&amp; u\ln{(a-b)}, (a&gt;b) \end{eqnarray*} "/> </div> <p>定数を代入して</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A%5Cln%7B%5Bp%20%2B%20%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%5D%7D%20%2B%20u%5Cln%7B%28a-b%29%7D%20%26%3D%26%20u%5Cln%7B%28x-b%29%7D%5C%5C%5C%5C%0A%5Cln%7B%5Bp%20%2B%20%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%5D%7D%20-%20%5Cln%7B%28x-b%29%5E%7Bu%7D%7D%2B%5Cln%7B%28a-b%29%5Eu%7D%20%26%3D%26%200%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} \ln{[p + \sqrt{1 + p(x)^2}]} + u\ln{(a-b)} &amp;=&amp; u\ln{(x-b)}\\\\ \ln{[p + \sqrt{1 + p(x)^2}]} - \ln{(x-b)^{u}}+\ln{(a-b)^u} &amp;=&amp; 0 \end{eqnarray*} "/> </div> <p>変形する</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A0%20%3D%20%5Cln%7B%5Bp%20%2B%20%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%5D%7D%20-%20%5Cln%7B%28x-b%29%5Eu%7D%2B%5Cln%7B%28a-b%29%5Eu%7D%5C%5C%0A0%20%3D%20%5Cln%7B%5Bp%20%2B%20%5Csqrt%7B1%20%2B%20p%28x%29%5E2%7D%5D%7D%20%2B%20%5Cln%7B%5Cleft%28%5Cfrac%7Ba-b%7D%7Bx-b%7D%5Cright%29%5Eu%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} 0 = \ln{[p + \sqrt{1 + p(x)^2}]} - \ln{(x-b)^u}+\ln{(a-b)^u}\\ 0 = \ln{[p + \sqrt{1 + p(x)^2}]} + \ln{\left(\frac{a-b}{x-b}\right)^u} \end{eqnarray*} "/> </div> <p>$\ln{1}=0$より</p> <p>$$ [p + \sqrt{1 + p(x)^{2}}] \cdot \left(\frac{a-b}{x-b}\right)^{u} = 1 $$</p> <p>左辺をpの式に直す.</p> <p>$$ [p + \sqrt{1 + p(x)^{2}}] = \left(\frac{a-b}{x-b}\right)^{-u}\ $$</p> <p>$q = \left(\frac{a-b}{x-b}\right)^{-u}$とおいて</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Ap%20%2B%20%5Csqrt%7B1%2Bp%5E2%7D%20%26%3D%26%20q%20%5C%5C%0A%5Csqrt%7B1%2Bp%5E2%7D%20%26%3D%26%20q%20-%20p%20%5C%5C%0A1%2Bp%5E2%20%26%3D%26%20%28q-p%29%5E2%5C%5C%0A1%2Bp%5E2%20%26%3D%26%20q%5E2%20-%202pq%20%2B%20p%5E2%5C%5C%0A2pq%20%26%3D%26%20q%5E2%20-1%20%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} p + \sqrt{1+p^2} &amp;=&amp; q \\ \sqrt{1+p^2} &amp;=&amp; q - p \\ 1+p^2 &amp;=&amp; (q-p)^2\\ 1+p^2 &amp;=&amp; q^2 - 2pq + p^2\\ 2pq &amp;=&amp; q^2 -1 \\ \end{eqnarray*} "/> </div> <p>$$ p = \frac{1}{2}\left( q - \frac{1}{q} \right) $$</p> <p>pとqの変数をもとに戻すと</p> <p>$$ \frac{dy}{dx} = \frac{1}{2}\left( \left(\frac{a-b}{x-b}\right)^{-u} - \left(\frac{a-b}{x-b}\right)^{u} \right) $$</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>すると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Ay%28x%29%0A%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cint%20%5Cleft%28%5Cfrac%7Ba-b%7D%7Bx-b%7D%5Cright%29%5E%7B-u%7Ddx%20-%20%5Cint%5Cleft%28%5Cfrac%7Ba-b%7D%7Bx-b%7D%5Cright%29%5E%7Bu%7D%20dx%20%5Cright%29%20%2BC%5C%5C%0A%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cleft%28%20%5Cfrac%7B%28x-b%29%5E%7Bu%2B1%7D%7D%7B%28u%2B1%29%28a-b%29%5E%7Bu%7D%7D%20%5Cright%29%20-%20%5Cleft%28%5Cfrac%7B%28a-b%29%5E%7Bu%7D%28x-b%29%5E%7B-u%2B1%7D%7D%7B%28-u%2B1%29%7D%5Cright%29%20%5Cright%29%20%2BC%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} y(x) &amp;=&amp; \frac{1}{2}\left( \int \left(\frac{a-b}{x-b}\right)^{-u}dx - \int\left(\frac{a-b}{x-b}\right)^{u} dx \right) +C\\ &amp;=&amp; \frac{1}{2}\left( \left( \frac{(x-b)^{u+1}}{(u+1)(a-b)^{u}} \right) - \left(\frac{(a-b)^{u}(x-b)^{-u+1}}{(-u+1)}\right) \right) +C \end{eqnarray*} "/> </div> <p>初期条件$x=a, y(a)=0$より,定数を求める.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0A0%20%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cleft%28%20%5Cfrac%7B%28a-b%29%5E%7Bu%2B1%7D%7D%7B%28u%2B1%29%28a-b%29%5E%7Bu%7D%7D%20%5Cright%29%20-%20%5Cleft%28%5Cfrac%7B%28a-b%29%5E%7Bu%7D%28a-b%29%5E%7B-u%2B1%7D%7D%7B%28-u%2B1%29%7D%5Cright%29%20%5Cright%29%2BC%5C%5C%0AC%20%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cleft%28%20%5Cfrac%7B%28a-b%29%7D%7B%28-u%2B1%29%7D%20%5Cright%29%20-%20%5Cleft%28%5Cfrac%7B%28a-b%29%7D%7B%28u%2B1%29%7D%5Cright%29%20%5Cright%29%5C%5C%0A%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cfrac%7B%28a-b%29%281%2Bu%29%20-%20%28a-b%29%281-u%29%7D%7B1-u%5E2%7D%20%5Cright%29%5C%5C%0A%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cfrac%7B2u%28a-b%29%7D%7B1-u%5E2%7D%20%5Cright%29%5C%5C%0A%26%3D%26%20%5Cleft%28%20%5Cfrac%7Bu%28a-b%29%7D%7B1-u%5E2%7D%20%5Cright%29%5C%5C%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} 0 &amp;=&amp; \frac{1}{2}\left( \left( \frac{(a-b)^{u+1}}{(u+1)(a-b)^{u}} \right) - \left(\frac{(a-b)^{u}(a-b)^{-u+1}}{(-u+1)}\right) \right)+C\\ C &amp;=&amp; \frac{1}{2}\left( \left( \frac{(a-b)}{(-u+1)} \right) - \left(\frac{(a-b)}{(u+1)}\right) \right)\\ &amp;=&amp; \frac{1}{2}\left( \frac{(a-b)(1+u) - (a-b)(1-u)}{1-u^2} \right)\\ &amp;=&amp; \frac{1}{2}\left( \frac{2u(a-b)}{1-u^2} \right)\\ &amp;=&amp; \left( \frac{u(a-b)}{1-u^2} \right)\\ \end{eqnarray*} "/> </div> <p>まとめると,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ay%28x%29%0A%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cleft%28%20%5Cfrac%7B%28x-b%29%5E%7Bu%2B1%7D%7D%7B%28u%2B1%29%28a-b%29%5E%7Bu%7D%7D%20%5Cright%29%20-%20%5Cleft%28%5Cfrac%7B%28a-b%29%5E%7Bu%7D%28x-b%29%5E%7B-u%2B1%7D%7D%7B%28-u%2B1%29%7D%5Cright%29%20%5Cright%29%20%2BC%5C%5C%0AC%26%3D%26%20%5Cleft%28%20%5Cfrac%7Bu%28a-b%29%7D%7B1-u%5E2%7D%20%5Cright%29%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} y(x) &amp;=&amp; \frac{1}{2}\left( \left( \frac{(x-b)^{u+1}}{(u+1)(a-b)^{u}} \right) - \left(\frac{(a-b)^{u}(x-b)^{-u+1}}{(-u+1)}\right) \right) +C\\ C&amp;=&amp; \left( \frac{u(a-b)}{1-u^2} \right)\\ \end{eqnarray} "/> </div> <p>鳩Qの初期x座標が$b=0$とすると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ay%28x%29%0A%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cleft%28%20%5Cfrac%7Bx%5E%7Bu%2B1%7D%7D%7B%28u%2B1%29a%5E%7Bu%7D%7D%20%5Cright%29%20-%20%5Cleft%28%5Cfrac%7Ba%5E%7Bu%7Dx%5E%7B-u%2B1%7D%7D%7B%28-u%2B1%29%7D%5Cright%29%20%5Cright%29%20%2BC%5C%5C%0AC%26%3D%26%20%5Cleft%28%20%5Cfrac%7Bua%7D%7B1-u%5E2%7D%20%5Cright%29%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} y(x) &amp;=&amp; \frac{1}{2}\left( \left( \frac{x^{u+1}}{(u+1)a^{u}} \right) - \left(\frac{a^{u}x^{-u+1}}{(-u+1)}\right) \right) +C\\ C&amp;=&amp; \left( \frac{ua}{1-u^2} \right)\\ \end{eqnarray} "/> </div> <p></section></p> <p><section></p> <h2 id="可視化と分析">可視化と分析</h2> <p>鳩と鷹の速度$v, w$を変えて導出した式を使って可視化する.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0Ay%28x%29%0A%26%3D%26%20%5Cfrac%7B1%7D%7B2%7D%5Cleft%28%20%5Cleft%28%20%5Cfrac%7Bx%5E%7Bu%2B1%7D%7D%7B%28u%2B1%29a%5E%7Bu%7D%7D%20%5Cright%29%20-%20%5Cleft%28%5Cfrac%7Ba%5E%7Bu%7Dx%5E%7B-u%2B1%7D%E3%83%BB%E3%83%BB%7D%7B%28-u%2B1%29%7D%5Cright%29%20%5Cright%29%20%2BC%5C%5C%0AC%26%3D%26%20%5Cleft%28%20%5Cfrac%7Bua%7D%7B1-u%5E2%7D%20%5Cright%29%5C%5C%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} y(x) &amp;=&amp; \frac{1}{2}\left( \left( \frac{x^{u+1}}{(u+1)a^{u}} \right) - \left(\frac{a^{u}x^{-u+1}&#x30FB;&#x30FB;}{(-u+1)}\right) \right) +C\\ C&amp;=&amp; \left( \frac{ua}{1-u^2} \right)\\ \end{eqnarray} "/> </div> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt v = <span class="synConstant">1</span> w = <span class="synConstant">1.5</span> u = v/w a = <span class="synConstant">1</span> C = ( u * a / (<span class="synConstant">1</span>-u**<span class="synConstant">2</span>) ) <span class="synComment"># print(C)</span> x = np.linspace(<span class="synConstant">0</span>, a, <span class="synConstant">1000</span>) y = <span class="synConstant">.5</span> * ((x**(u+<span class="synConstant">1</span>)/((u+<span class="synConstant">1</span>)*a**(u)) ) - ((x**(-u+<span class="synConstant">1</span>)*(a)**u)/((-u+<span class="synConstant">1</span>)))) + C cap_t = a/(w*(<span class="synConstant">1</span>-u**<span class="synConstant">2</span>)) <span class="synIdentifier">print</span>(f<span class="synConstant">&quot;cap_t = {cap_t}&quot;</span>) fig = plt.figure(figsize=(<span class="synConstant">5</span>,<span class="synConstant">5</span>)) plt.plot(x, y, label=f<span class="synConstant">&quot;$v/w={u:.3}$&quot;</span>) v = <span class="synConstant">1</span> w = <span class="synConstant">0.999</span> u = v/w C = ( u * a / (<span class="synConstant">1</span>-u**<span class="synConstant">2</span>) ) y = <span class="synConstant">.5</span> * ((x**(u+<span class="synConstant">1</span>)/((u+<span class="synConstant">1</span>)*a**(u)) ) - ((x**(-u+<span class="synConstant">1</span>)*(a)**u)/((-u+<span class="synConstant">1</span>)))) + C plt.plot(x, y, label=f<span class="synConstant">&quot;$v/w={u:.3}$&quot;</span>) cap_t = a/(w*(<span class="synConstant">1</span>-u**<span class="synConstant">2</span>)) <span class="synIdentifier">print</span>(f<span class="synConstant">&quot;cap_t = {cap_t}&quot;</span>) v = <span class="synConstant">1.5</span> w = <span class="synConstant">1</span> u = v/w C = ( u * a / (<span class="synConstant">1</span>-u**<span class="synConstant">2</span>) ) y = <span class="synConstant">.5</span> * ((x**(u+<span class="synConstant">1</span>)/((u+<span class="synConstant">1</span>)*a**(u)) ) - ((x**(-u+<span class="synConstant">1</span>)*(a)**u)/((-u+<span class="synConstant">1</span>)))) + C plt.plot(x, y, label=f<span class="synConstant">&quot;$v/w={u:.3}$&quot;</span>) cap_t = a/(w*(<span class="synConstant">1</span>-u**<span class="synConstant">2</span>)) <span class="synIdentifier">print</span>(f<span class="synConstant">&quot;cap_t = {cap_t}&quot;</span>) plt.xlim(-<span class="synConstant">.1</span>, <span class="synConstant">2</span>) plt.ylim(-<span class="synConstant">.1</span>, <span class="synConstant">2</span>) plt.grid(<span class="synIdentifier">True</span>) plt.legend() plt.show() </pre> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fYkQ8ALJGrG6UR_oVvAxITx5t7zIimEMbu7xj102U5O_siXIZ2u2eXGSE7N14m5fe9gN0oXmwyhcCVuR9xpP6VN4Nt_xMiZDpbw6R0IzYQlPm8hYsjYVNLxSXRrZIjYBnUoqW9sT8ZIGSTlJLug-LCyQ=s360-no?authuser=0" itemprop="image"></span> <figcaption>図2. 可視化</figcaption> </figure></p> <p>速度比3パターンを比較する.</p> <ul> <li>$u &lt; w$: 鳩の横軸$b=0$に近づくのが早く鳩に到達する.</li> <li>$u=w$: yの式から計算不可能,つまり鳩に追いつかない.</li> <li>$u>w$: 計算は可能だが鳩の横軸$b=0$に近づくのが遅く,横軸にたどり着いたとしても垂直直線y軸から速度差により追いつけない.</li> </ul> <p></section></p> <p><section></p> <h2 id="capture-time捕捉時間を求める">capture time(捕捉時間)を求める</h2> <p>capture timeを求める.</p> <p>$x=b, y=vt$</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%2A%7D%0Ay%28x%3Db%29%20%26%3D%26%200%20%2BC%5C%5C%5C%5C%0Avt%20%26%3D%26%200%20%2B%20C%5C%5C%5C%5C%0Avt%20%26%3D%26%20C%5C%5C%5C%5C%0At%20%26%3D%26%20%5Cfrac%7BC%7D%7Bv%7D%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B1%7D%7Bv%7D%5Cfrac%7Bu%28a-b%29%7D%7B1-u%5E2%7D%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B%28a-b%29%7D%7Bw%281-u%5E2%29%7D%0A%5Cend%7Beqnarray%2A%7D%0A" alt=" \begin{eqnarray*} y(x=b) &amp;=&amp; 0 +C\\\\ vt &amp;=&amp; 0 + C\\\\ vt &amp;=&amp; C\\\\ t &amp;=&amp; \frac{C}{v}\\\\ &amp;=&amp; \frac{1}{v}\frac{u(a-b)}{1-u^2}\\\\ &amp;=&amp; \frac{(a-b)}{w(1-u^2)} \end{eqnarray*} "/> </div> <p>$b=0$とすると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0At%20%26%3D%26%20%5Cfrac%7B%28a-b%29%7D%7Bw%281-u%5E2%29%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} t &amp;=&amp; \frac{(a-b)}{w(1-u^2)} \end{eqnarray} "/> </div> <ul> <li><p>$1-u^{2} > 0 \to 1 > u^{2} \to w^{2} > v^{2} \to w > v$のとき, 計算可能.つまり鳩に追いつく.</p></li> <li><p>$1-u^{2} \leq 0 \to 1 \leq u^{2} \to w^{2} \leq v^{2} \to w \leq v$のときcapture timeはマイナスになり計算不可,つまり鷲は鳩に追いつけない.</p></li> </ul> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><a href="https://b-ok.asia/book/2330460/72496b?regionChanged=&amp;redirect=11886211">Db U. Burghers, M.S: Borrie, "Modelling with Differential Equations", chapter6:Non-Linear Second Order Differential Equations, p.134</a></li> <li><a href="https://mse.redwoods.edu/darnold/math55/DEproj/sp08/mseverdia/pursuit.pdf">https://mse.redwoods.edu/darnold/math55/DEproj/sp08/mseverdia/pursuit.pdf</a></li> </ul> <p></aside></p> Thu, 27 Aug 2020 06:32:56 +0900 hatenablog://entry/26006613620348135 微分方程式 math VSCodeでWSL2のLinux上のファイルをリモート操作する https://cartman0.hatenablog.com/entry/2020/07/18/VSCode%E3%81%A7WSL2%E3%81%AELinux%E4%B8%8A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B?utm_source=feed <h1 id="VSCodeでWSL2のLinux上のファイルをリモート操作する"><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>でWSL2の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>上のファイルをリモート操作する</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>上に<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>があれば<code>ssh</code>使わずとも WSL2上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>にアクセスし操作ができる. これができると,例えば,WSL2上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>にあるcコードを<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>で編集し <a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>環境で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>して結果を得ることが容易に可能になる.</p> <p>参考: <a href="https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode">Windows Subsystem for Linux &#x3067; VS Code &#x306E;&#x4F7F;&#x7528;&#x3092;&#x958B;&#x59CB;&#x3059;&#x308B; | Microsoft Docs</a></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#VSCodeでWSL2のLinux上のファイルをリモート操作する">VSCodeでWSL2のLinux上のファイルをリモート操作する</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#WSL2を事前にインストール">WSL2を事前にインストール</a></li> <li><a href="#VSCodeで拡張機能をインストールする">VSCodeで拡張機能をインストールする</a></li> <li><a href="#WSL2上のLinuxとVSCodeを連携する">WSL2上のLinuxとVSCodeを連携する</a><ul> <li><a href="#VSCodeから直接WSL2に接続する">VSCodeから直接WSL2に接続する</a></li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 ver2004(OSビルド 19041.330) <ul> <li>WSL2 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> 20.04LTS</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a> 1.47.0</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="WSL2を事前にインストール">WSL2を事前にインストール</h2> <p>WSL2を事前にインストールしておく. 以下にインストール用のメモがある.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fcartman0.hatenablog.com%2Fentry%2F2020%2F07%2F02%2FWSL2%25E3%2581%25AE%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB%25E3%2583%25A1%25E3%2583%25A2" title="WSL2のインストールメモ - はしくれエンジニアもどきのメモ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://cartman0.hatenablog.com/entry/2020/07/02/WSL2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%A2">cartman0.hatenablog.com</a></cite></p> <p></section></p> <p><section></p> <h2 id="VSCodeで拡張機能をインストールする"><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>をインストールする</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>は事前にインストールしておく.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>「Remoto Development」をインストールする.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dms-vscode-remote.vscode-remote-extensionpack" title="Remote Development - Visual Studio Marketplace" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack">marketplace.visualstudio.com</a></cite></p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3eFeziZWBAYp_tdun39__GXgQOV9aWimZaK0EPOH3H43ptfBzaYcgDZN9KkDtxy2asxTxdF0yY_09BqGsUvqg2_ZLP8-elcpspPDuahGc2yWLjadZk4FfiN1E4yWpwsa3mPTijn0END2GjHHWtttI_1iw=w839-h635-no?authuser=0" itemprop="image"></span> <figcaption>Remoto Development</figcaption> </figure></p> <p>この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>はpackなので以下3つが入る.</p> <ul> <li>Remote - <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a></li> <li>Remote - Containers: Docker用</li> <li>Remote - WSL: WSL用</li> </ul> <p>特にWSLと使うのは"Remote - WSL"だけだが, 仮想環境を利用するとどれも利用する機会があるので全部入れて問題ない.</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>のインストールがうまくいくと, 左のメニューに"Remote <a class="keyword" href="http://d.hatena.ne.jp/keyword/Explorer">Explorer</a>"が追加され, 左下に緑色の接続マークが表示される.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3cdC1ryXlGgGS81ZGGLZcsJ6yHzTDlrX_yXZlUK174hcvGVYnY-lacgkwjlHi7b2T9haRaS5Il8MqsKO6ow362pF3Om3x7tY6sl_vkpSXfiusXLw36eola5yQGCnISlBCbgxud2Hc7fz_gZWIXgs-ujQg=w58-h383-no?authuser=0" itemprop="image"></span> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fRqzgXfZ9EcjiQ8zrS-POqeTXQ98m_qX7HfY51br0ePohsjbKO-dCQeOZodUNEIeiHb3GgjFh4YgJ7jjHVi1XX_9tL6BOkDQEx5x6UmHT_EcTOxGmKDBgm3s3vVWxUUe-xAB-rYvv8B66zRJS0vro42g=w30-h23-no?authuser=0" itemprop="image"></span> <figcaption>Remote用のメニューが追加される</figcaption> </figure></p> <p></section></p> <p><section></p> <h2 id="WSL2上のLinuxとVSCodeを連携する">WSL2上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>を連携する</h2> <p>WSL2上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>を起動して(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>.exeを起動するかcmd, <a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>で<code>wsl</code>コマンド)ログインする. 現在の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リか作業<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ上で以下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>のコマンドを実行.</p> <pre class="code bash" data-lang="bash" data-unlink>&gt; code .</pre> <p>すると連携用のVSCodeServerがDL,インストールされる.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3cUmbGpDsR_v6Hk61ELUVGkcYnPRbtMPpN7gH_BAUTLft1hoRyxYB0SqTkCMB27PokrUGrEjSO5xkCyguh56B3nH7bQJWEjccYfChdQiA7zQ64wq3oIwbgu0qlFq-EZ7yLSRpMXicFF2x8Zx9gk4UC4AA=w729-h148-no?authuser=0" itemprop="image"></span> <figcaption>VSCodeServerのインストール</figcaption> </figure></p> <p>無事インストールされると<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>が立ち上がる. WSL上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>と接続されていると左下に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>が表示される.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fZklRq528mOaq9M4A9ohq1gVFANdO7C3JQU_-Zx7LABPVxqQKvk0EwElTwSsjZLhilVW7iYuosAT7jRwut67__-EwxDLl-4Ajd2kJenpNX86d_m5RLyIPA98AdsIH7g4Q6z-LqkcvvDSSQcJEamDYh3A=w171-h42-no?authuser=0" itemprop="image"></span> <figcaption>WSL2と接続</figcaption> </figure></p> <p>また,<a class="keyword" href="http://d.hatena.ne.jp/keyword/Explorer">Explorer</a>に<code>code .</code>を実行した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%B9%A5%DA%A1%BC%A5%B9">ワークスペース</a>として登録される.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3cDWAEsoT1Ux4CstJZ2JMCj94x2nJY9v5PVKywVu9Owpmv71P9Vw5S5mYuQBAXmv7qIOKQ_I9hufa_5nqnM5rarw3nO69OjW4De9vXCefgzu9PLHzpRVk9fGoNqB8EZjydl7zvrWp-IF2weg8aHQuSsAg=w256-h535-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/Explorer">Explorer</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%B9%A5%DA%A1%BC%A5%B9">ワークスペース</a></figcaption> </figure></p> <p>この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%B9%A5%DA%A1%BC%A5%B9">ワークスペース</a>上であればファイルの追加・編集・削除が可能になる.</p> <p>また,<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>を閉じてもWSL2上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>が立ち上がったままであれば <a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>をreopenすれば再接続される.</p> <p><section></p> <h3 id="VSCodeから直接WSL2に接続する"><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>から直接WSL2に接続する</h3> <p>上記の流れを1度行ってしまえば, WSL2を起動しなくとも<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>から直接接続が可能になる,</p> <ul> <li>1. <a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>を起動</li> <li>2. 左下の緑マークをクリックするか,<kbd>ctrl</kbd>+<kbd>shift</kbd>のコマンドパレットで `> Remote-WSL`コマンドを使う</li> <ul> <li> 例えば,<code>> Remote-WSL: New Window using Distro</code>を使えばWSL2上のDistributionを指定して新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>を立ち上げる. <figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3e55_zWq5xXt-nStnFfR3wDCncZ_Chp4V_pGDg_mTTdXTVSoBkT5vJY5hfQoJPVb7DVOPStz8JPIi0cmFtiW3wI8NMpF3P650y-T9l3CsCX59f6LZx8GgYLSIq5-_Z5kZ9KMnXZzjHqL_7yASC0knBgzA=w294-h147-no?authuser=0" itemprop="image"></span> <figcaption><code>> Remote-WSL: New Window using Distro</code></figcaption> </figure> </li> <li> <code>> Remote-WSL: Reopen Folder in WSL</code>であれば現在の<a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a>が切り替わる. </li> </ul> </ul> <p>WSL2上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>と作業<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを切り替える場合, <code>RemoteExplorer</code>から<code>reopen</code>で切り替えることが可能. 緑のチェックマークが現在接続している<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リになる.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fjEKiVp2f_PhaPgdzJwBzrIsQp-9GmtLIVD07q8RsGbtq5p3zOkL0s-9o34yjlsoeucDBXDXNiTeFkkBIwp3gecaPkfmPBsptTXhCKja69PaJXOBHsVOqHBBzYZApgSnNWRHRXbk8PEsvMm2aOGhxPvA=w516-h318-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>と作業<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを切り替える</figcaption> </figure></p> <p></section></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fwindows%2Fwsl%2Ftutorials%2Fwsl-vscode" title="Windows Subsystem for Linux で VS Code の使用を開始する" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode">docs.microsoft.com</a></cite></p></li> </ul> <p></aside></p> Sat, 18 Jul 2020 08:05:42 +0900 hatenablog://entry/26006613600106501 Windows WSL2 VSCode WSL2でネットワークのドメインを解決できない場合の対処 https://cartman0.hatenablog.com/entry/2020/07/16/WSL2%E3%81%A7%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88?utm_source=feed <h1 id="WSL2でネットワークのドメインを解決できない場合の対処">WSL2でネットワークの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3">ドメイン</a>を解決できない場合の対処</h1> <p>WSL2上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>(ex.<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>)で, <code>ping google.com</code>や<code>apt update</code>がうまく行かない場合(Temporary failure)の対処である.</p> <p>どうやら<a class="keyword" href="http://d.hatena.ne.jp/keyword/DNS">DNS</a>サーバの設定がよくなく?<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3">ドメイン</a>の解決ができなくなっているぽい.</p> <p>参考:</p> <ul> <li><p><a href="https://github.com/microsoft/WSL/issues/4435">Apt-get update and apt-get upgrade fail &middot; Issue #4435 &middot; microsoft/WSL &middot; GitHub</a></p></li> <li><a href="https://github.com/microsoft/WSL/issues/4285">WSL2 DNS stops working &middot; Issue #4285 &middot; microsoft/WSL &middot; GitHub</a></li> </ul> <p>現状(2020/07/16),原因は不明ぽいです. (<code>/etc/resolv.conf</code>がどっかのタイミングで勝手に書き換わる?)</p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#WSL2でネットワークのドメインを解決できない場合の対処">WSL2でネットワークのドメインを解決できない場合の対処</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#エラー内容">エラー内容</a><ul> <li><a href="#pingができない">pingができない</a></li> <li><a href="#apt-updateができない">apt updateができない</a></li> </ul> </li> <li><a href="#対処">対処</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 ver2004(OSビルド 19041.330) <ul> <li>WSL2 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> 20.04</li> </ul> </li> <li>Docker Desktop for <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> 2.3.0.3(45519) <ul> <li>Docker Engine: 19.03.8</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VSCode">VSCode</a> 1.47.0</li> </ul> </li> </ul> <p></section></p> <p><section></p> <h2 id="エラー内容">エラー内容</h2> <p>wsl上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>で<code>ping</code>や<code>apt update</code>できなくなる.</p> <p><section></p> <h3 id="pingができない"><code>ping</code>ができない</h3> <p>例えば<code>google</code>への<a class="keyword" href="http://d.hatena.ne.jp/keyword/ping">ping</a>が返ってこない.</p> <pre class="code bash" data-lang="bash" data-unlink>&gt; ping google.com ping: google.com: Temporary failure in name resolution</pre> <p></section></p> <p><section></p> <h3 id="apt-updateができない"><code>apt update</code>ができない</h3> <p><code>apt update</code>すると<code>Temporary failure</code>が起きる.</p> <pre class="code bash" data-lang="bash" data-unlink>&gt; sudo apt update Err:1 http://archive.ubuntu.com/ubuntu bionic InRelease Temporary failure resolving &#39;archive.ubuntu.com&#39; Err:2 http://security.ubuntu.com/ubuntu bionic-security InRelease Temporary failure resolving &#39;security.ubuntu.com&#39; Err:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease Temporary failure resolving &#39;archive.ubuntu.com&#39; Err:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease Temporary failure resolving &#39;archive.ubuntu.com&#39; Reading package lists... Done W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic/InRelease Temporary failure resolving &#39;archive.ubuntu.com&#39; W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease Temporary failure resolving &#39;archive.ubuntu.com&#39; W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease Temporary failure resolving &#39;archive.ubuntu.com&#39; W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease Temporary failure resolving &#39;security.ubuntu.com&#39; W: Some index files failed to download. They have been ignored, or old ones used instead.</pre> <p></section></p> <p></section></p> <p><section></p> <h2 id="対処">対処</h2> <p>wsl2では<a class="keyword" href="http://d.hatena.ne.jp/keyword/DNS">DNS</a>サーバの設定である<code>resolv.conf</code>が自動的に生成される. なのでこの設定を変更する.</p> <ol> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>から<code>wsl</code>コマンドでログインする.</li> <li> <p>`/etc/wsl.conf`で制御できるので,このファイルを作る.</p> <pre><code>sudo vim /etc/wsl.conf</code></pre> </li> <li> <p>中身を次のようにする.`:wq`で保存.</p> <pre><code>[network] generateResolvConf = false</code></pre> </li> <li> <p>別の<a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>を立ち上げてwslをシャットダウンさせる. </p> <pre><code>wsl --shutdown</code></pre> </li> <li><p>WSL2を再起動して<code>/etc/resolv.conf</code>を書き換える.</p> <pre><code>> wsl > sudo vim /etc/resolv.conf </code></pre> </li> <li> <p>次に書き換える.</p> <pre><code>nameserver 8.8.8.8</code></pre> </li> </ol> <p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/DNS">DNS</a>サーバの設定ができ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3">ドメイン</a>名が解決できるようになる.</p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2FWSL%2Fissues%2F4435" title="Apt-get update and apt-get upgrade fail · Issue #4435 · microsoft/WSL" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/microsoft/WSL/issues/4435">github.com</a></cite></p></li> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2FWSL%2Fissues%2F4285" title="WSL2 DNS stops working · Issue #4285 · microsoft/WSL" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/microsoft/WSL/issues/4285">github.com</a></cite></p></li> </ul> <p></aside></p> Thu, 16 Jul 2020 06:28:31 +0900 hatenablog://entry/26006613599124064 Windows WSL2 どの党派が小池百合子氏を再選させたかをベイズ推定する https://cartman0.hatenablog.com/entry/2020/07/08/%E3%81%A9%E3%81%AE%E5%85%9A%E6%B4%BE%E3%81%8C%E5%B0%8F%E6%B1%A0%E7%99%BE%E5%90%88%E5%AD%90%E6%B0%8F%E3%82%92%E5%86%8D%E9%81%B8%E3%81%95%E3%81%9B%E3%81%9F%E3%81%8B%E3%82%92%E3%83%99%E3%82%A4%E3%82%BA?utm_source=feed <h1 id="選挙統計どの党派が小池百合子氏を再選させたかをベイズ推定する">[選挙統計]どの党派が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%C3%D3%C9%B4%B9%E7%BB%D2">小池百合子</a>氏を再選させたかを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>推定する</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%D4%C3%CE%BB%F6">都知事</a>選が2020年7月5日にありました. 大差で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%C3%D3%C9%B4%B9%E7%BB%D2">小池百合子</a>氏が再選しました. 今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%C3%D3%C9%B4%B9%E7%BB%D2">小池百合子</a>氏に投票した内どの党派が多いかを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>推定で計算します.</p> <p>結論からいうと<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9%C1%D8">無党派層</a></strong>(小池氏に投票した5割が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9%C1%D8">無党派層</a>)です.</p> <p>※なお,筆者は都内在住ではないので投票に参加していません</p> <p>※また,この記事は選挙開票が終わった後にpublishしており<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%F8%BF%A6%C1%AA%B5%F3%CB%A1">公職選挙法</a>に反するものではないことを明記しておきます.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="" itemprop="image"></span> <figcaption></figcaption> </figure></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#選挙統計どの党派が小池百合子氏を再選させたかをベイズ推定する">[選挙統計]どの党派が小池百合子氏を再選させたかをベイズ推定する</a><ul> <li><a href="#計算するための定義仮定">計算するための定義・仮定</a></li> <li><a href="#データ">データ</a><ul> <li><a href="#NHKによる政党支持率">NHKによる政党支持率</a></li> <li><a href="#投票予定先東京新聞">投票予定先(東京新聞)</a></li> </ul> </li> <li><a href="#小池氏に入った割合">小池氏に入った割合</a></li> <li><a href="#ベイズによる小池氏の得票率の推定">ベイズによる小池氏の得票率の推定</a></li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="計算するための定義仮定">計算するための定義・仮定</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>で計算するために以下を定義します.</p> <ul> <li>今回の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%D4%C3%CE%BB%F6">都知事</a>選のX氏の得票率(確率)を$P(X氏)$とする.</li> <li>都内で選挙権のある人がY党派である割合(確率)を$P(Y派)$とする</li> <li>都内でY党派のうちX氏に投票した割合(確率)を$P(X氏|Y派)$とする.</li> <li><strong>X氏の得票率のうちY派である割合(確率)を$P(Y派|X氏)$とする.</strong>(今回求めるもの)</li> </ul> <p>X氏の得票率のうちY派である割合を求める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>の式は</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28Y%E6%B4%BE%7CX%E6%B0%8F%29%0A%26%3D%26%20%5Cfrac%7BP%28X%E6%B0%8F%2CY%E6%B4%BE%29P%28Y%E6%B4%BE%29%7D%7BP%28X%E6%B0%8F%29%7D%5C%5C%0A%26%3D%26%20%5Cfrac%7BP%28X%E6%B0%8F%7CY%E6%B4%BE%29P%28Y%E6%B4%BE%29%7D%7BP%28X%E6%B0%8F%29%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(Y&#x6D3E;|X&#x6C0F;) &amp;=&amp; \frac{P(X&#x6C0F;,Y&#x6D3E;)P(Y&#x6D3E;)}{P(X&#x6C0F;)}\\ &amp;=&amp; \frac{P(X&#x6C0F;|Y&#x6D3E;)P(Y&#x6D3E;)}{P(X&#x6C0F;)} \end{eqnarray} "/> </div> <p>となります.</p> <p>※ここで$P(X氏,Y派)$は都内の選挙権がある人中でX氏に投票してかつY党派である割合(同時確率)</p> <p>例えば,小池氏の得票率のうち自民派である割合(確率)は以下の式で求められる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E8%87%AA%E6%B0%91%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%2C%E8%87%AA%E6%B0%91%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E8%87%AA%E6%B0%91%29P%28%E8%87%AA%E6%B0%91%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x81EA;&#x6C11;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;,&#x81EA;&#x6C11;)}{P(&#x5C0F;&#x6C60;)} \\ &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x81EA;&#x6C11;)P(&#x81EA;&#x6C11;)}{P(&#x5C0F;&#x6C60;)} \end{eqnarray} "/> </div> <p>この計算にあたって特に必要なデータは</p> <ul> <li>都内で選挙権のある人がY党派である割合</li> <li>都内でY党派のうちX氏に投票した割合</li> </ul> <p>になる.が,正確なデータはないので以下の仮定をおく.</p> <ul> <li>都内で選挙権のある人がY党派である割合$P(Y派)$ ≒全国の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a>(つまり,都内の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a>と全国区の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a>がほぼ等しい)</li> <li>都内でY党派のうちX氏に投票した割合$P(X氏|Y派)$≒都内でY党派のうちX氏に投票する予定の割合 (<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BF%B7%CA%B9">東京新聞</a>が投票予定先を調査していたのでこれを使う.)</li> </ul> <p></section></p> <p><section></p> <h2 id="データ">データ</h2> <p><section></p> <h3 id="NHKによる政党支持率"><a class="keyword" href="http://d.hatena.ne.jp/keyword/NHK">NHK</a>による<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a></h3> <p>全国の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a>データとして<a class="keyword" href="http://d.hatena.ne.jp/keyword/NHK">NHK</a>の最新のものを利用する.</p> <ul> <li><a href="https://web.archive.org/web/20200706075456/http://www.nhk.or.jp/senkyo/shijiritsu/">archive</a></li> </ul> <blockquote><p>調査概要: - 調査期間 6月19日(金)~21日(日) - 調査方法 電話法(固定・携帯RDD) - 調査相手 全国18歳以上 2,202人 - 回答数(率) 1,270人(57.7%)</p></blockquote> <p><figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fPwaDobju9ayh30lVrAojBTYz_j3xwnrSGeG1oSIR4YmWzC8Cyt7Ue13uj9RBJX8a89I3ZXVzy6GoUJkKxMTwfCIJrI7Rgzgk7LPEBW721_W3otKfZf5lN03GJd19040Jm66ZbWTAXslnBvQVs8vKhxw=w859-h498-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/NHK">NHK</a>による<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a> </figcaption> </figure></p> <p>整形処理として,"支持なし"と"わからない、無回答"をまとまめて「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9">無党派</a>」とする. また,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BF%B7%CA%B9">東京新聞</a>の投票予定先データと合わせるために"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FC%CB%DC%B0%DD%BF%B7%A4%CE%B2%F1">日本維新の会</a>","社民","N国"をまとめてその他にまとめる.</p> <p>表にまとめ直すと以下になる.</p> <table> <thead> <tr> <th style="text-align:center;">政党名</th> <th style="text-align:center;">支持率[%]</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%CC%B1%C5%DE">自民党</a></td> <td style="text-align:center;">32.5</td> </tr> <tr> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%F8%CC%C0%C5%DE">公明党</a></td> <td style="text-align:center;">4.3</td> </tr> <tr> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%A9%B7%FB%CC%B1%BC%E7%C5%DE">立憲民主党</a></td> <td style="text-align:center;">5.6</td> </tr> <tr> <td style="text-align:center;">国民<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B1%BC%E7%C5%DE">民主党</a></td> <td style="text-align:center;">0.6</td> </tr> <tr> <td style="text-align:center;">共産</td> <td style="text-align:center;">1.7</td> </tr> <tr> <td style="text-align:center;">れいわ</td> <td style="text-align:center;">0.6</td> </tr> <tr> <td style="text-align:center;">その他</td> <td style="text-align:center;">5.1</td> </tr> <tr> <td style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9">無党派</a></td> <td style="text-align:center;">49.6</td> </tr> </tbody> </table> <p></section></p> <p><section></p> <h3 id="投票予定先東京新聞">投票予定先(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BF%B7%CA%B9">東京新聞</a>)</h3> <p>今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BF%B7%CA%B9">東京新聞</a>が調査したデータを使う.</p> <ul> <li><a href="https://www.tokyo-np.co.jp/article/38679">&#x8AB0;&#x306B;&#x6295;&#x7968;&#xFF1F; &#x91CE;&#x515A;&#x652F;&#x6301;&#x5C64;&#x306F;&#x5206;&#x6563;&#x3010;&#x90FD;&#x77E5;&#x4E8B;&#x9078;&#x4E16;&#x8AD6;&#x8ABF;&#x67FB;&#x3011;&#xFF1A;&#x6771;&#x4EAC;&#x65B0;&#x805E; TOKYO Web</a></li> <li><a href="https://web.archive.org/save/https://www.tokyo-np.co.jp/article/38679">archive</a></li> </ul> <blockquote><p>【調査の方法】6月26~28日、都内の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%B8%A2%BC%D4">有権者</a>を対象にコンピューターで無作為に選んだ番号に電話をかける方法で行い、実際に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%B8%A2%BC%D4">有権者</a>がいる家庭につながった1457件のうち1030人から回答を得た。各設問の回答の比率は小数点以下第2位で四捨五入しており、総計が100%にならない場合がある。</p></blockquote> <p><figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3e9cYrk4AiphWd0mg6bRYTcl8UpJ5Gkhkk312xrZN6Zl3IN62X3TavPlM4UctfsHJzFmFzGJynSOZ_PRYA7xzlKvJJL98tIOtBJ1_w2YBySwgu2wg48BqpRKJKyk6btl_czHAca_QCTC-ZjEJraGn36Hw=w612-h640-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BF%B7%CA%B9">東京新聞</a>の調査した投票先予定データ</figcaption> </figure></p> <p>※今回の0%になっている(ex.国民<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B1%BC%E7%C5%DE">民主党</a>派の中で宇都宮氏に入れる予定が0)のはデータが足りなく観測ができていないと考えるべきである.</p> <p>※この0%はナイーブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>ではよく誤差をもたらす.対処としてカウントデータではsmoothing処理を入れることが多いが,今回は0のまま扱う.</p> <p></section></p> <p></section></p> <p><section></p> <h2 id="小池氏に入った割合">小池氏に入った割合</h2> <p>小池氏の得票率は59.70[%]でした.</p> <ul> <li><p><a href="https://www.asahi.com/senkyo/tochijisen/2020/kaihyo/">&#x958B;&#x7968;&#x901F;&#x5831;&#xFF5C;2020&#x90FD;&#x77E5;&#x4E8B;&#x9078;&#xFF08;&#x6771;&#x4EAC;&#x90FD;&#x77E5;&#x4E8B;&#x9078;&#x6319;&#xFF09;&#xFF1A;&#x671D;&#x65E5;&#x65B0;&#x805E;&#x30C7;&#x30B8;&#x30BF;&#x30EB;</a></p></li> <li><p><a href="https://www.senkyo.metro.tokyo.lg.jp/election/tochiji-all/tochiji-sokuhou2020/">&#x6771;&#x4EAC;&#x90FD;&#x77E5;&#x4E8B;&#x9078;&#x6319;&#xFF08;&#x4EE4;&#x548C;2&#x5E74;7&#x6708;5&#x65E5;&#x57F7;&#x884C;&#xFF09; &#x6295;&#x958B;&#x7968;&#x7D50;&#x679C; | &#x6771;&#x4EAC;&#x90FD;&#x9078;&#x6319;&#x7BA1;&#x7406;&#x59D4;&#x54E1;&#x4F1A;</a></p></li> </ul> <p>小池氏の得票率のうち各党派の割合の計算式は以下のようになります.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0AP%28%E5%B0%8F%E6%B1%A0%20%7C%20%E8%87%AA%E6%B0%91%29%20%3D%2073.4%5B%5C%25%5D%20%5C%5C%5C%5C%0AP%28%E8%87%AA%E6%B0%91%29%20%3D%2032.5%5B%5C%25%5D%20%5C%5C%5C%5C%0AP%28%E5%B0%8F%E6%B1%A0%29%20%3D%2059.70%5B%5C%25%5D%0A" alt=" P(&#x5C0F;&#x6C60; | &#x81EA;&#x6C11;) = 73.4[\%] \\\\ P(&#x81EA;&#x6C11;) = 32.5[\%] \\\\ P(&#x5C0F;&#x6C60;) = 59.70[\%] "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E8%87%AA%E6%B0%91%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%2C%E8%87%AA%E6%B0%91%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E8%87%AA%E6%B0%91%29P%28%E8%87%AA%E6%B0%91%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B0.734%20%5Ccdot%200.325%7D%7B0.5970%7D%20%5C%5C%5C%5C%0A%26%3D%26%2039.96%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x81EA;&#x6C11;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;,&#x81EA;&#x6C11;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x81EA;&#x6C11;)P(&#x81EA;&#x6C11;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{0.734 \cdot 0.325}{0.5970} \\\\ &amp;=&amp; 39.96[\%] \end{eqnarray} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E5%85%AC%E6%98%8E%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E5%85%AC%E6%98%8E%29P%28%E5%85%AC%E6%98%8E%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B0.873%20%5Ccdot%200.043%7D%7B0.5970%7D%20%5C%5C%5C%5C%0A%26%3D%26%206.29%20%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x516C;&#x660E;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x516C;&#x660E;)P(&#x516C;&#x660E;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{0.873 \cdot 0.043}{0.5970} \\\\ &amp;=&amp; 6.29 [\%] \end{eqnarray} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E7%84%A1%E5%85%9A%E6%B4%BE%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E7%84%A1%E5%85%9A%E6%B4%BE%29P%28%E7%84%A1%E5%85%9A%E6%B4%BE%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B0.601%20%5Ccdot%200.496%7D%7B0.5970%7D%20%5C%5C%5C%5C%0A%26%3D%26%2049.93%20%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x7121;&#x515A;&#x6D3E;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x7121;&#x515A;&#x6D3E;)P(&#x7121;&#x515A;&#x6D3E;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{0.601 \cdot 0.496}{0.5970} \\\\ &amp;=&amp; 49.93 [\%] \end{eqnarray} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E7%AB%8B%E6%86%B2%E6%B0%91%E4%B8%BB%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E7%AB%8B%E6%86%B2%E6%B0%91%E4%B8%BB%29P%28%E7%AB%8B%E6%86%B2%E6%B0%91%E4%B8%BB%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B0.561%20%5Ccdot%200.056%7D%7B0.5970%7D%20%5C%5C%5C%5C%0A%26%3D%26%205.26%20%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x7ACB;&#x61B2;&#x6C11;&#x4E3B;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x7ACB;&#x61B2;&#x6C11;&#x4E3B;)P(&#x7ACB;&#x61B2;&#x6C11;&#x4E3B;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{0.561 \cdot 0.056}{0.5970} \\\\ &amp;=&amp; 5.26 [\%] \end{eqnarray} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E5%9B%BD%E6%B0%91%E6%B0%91%E4%B8%BB%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E5%9B%BD%E6%B0%91%E6%B0%91%E4%B8%BB%29P%28%E5%9B%BD%E6%B0%91%E6%B0%91%E4%B8%BB%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B0.629%20%5Ccdot%200.006%7D%7B0.5970%7D%20%5C%5C%5C%5C%0A%26%3D%26%200.63%20%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x56FD;&#x6C11;&#x6C11;&#x4E3B;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x56FD;&#x6C11;&#x6C11;&#x4E3B;)P(&#x56FD;&#x6C11;&#x6C11;&#x4E3B;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{0.629 \cdot 0.006}{0.5970} \\\\ &amp;=&amp; 0.63 [\%] \end{eqnarray} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E5%85%B1%E7%94%A3%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E5%85%B1%E7%94%A3%29P%28%E5%85%B1%E7%94%A3%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B0.214%20%5Ccdot%200.017%7D%7B0.5972%7D%20%5C%5C%5C%5C%0A%26%3D%26%200.61%20%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x5171;&#x7523;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x5171;&#x7523;)P(&#x5171;&#x7523;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{0.214 \cdot 0.017}{0.5972} \\\\ &amp;=&amp; 0.61 [\%] \end{eqnarray} "/> </div> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E3%82%8C%E3%81%84%E3%82%8F%7C%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Cfrac%7BP%28%E5%B0%8F%E6%B1%A0%7C%E3%82%8C%E3%81%84%E3%82%8F%29P%28%E3%82%8C%E3%81%84%E3%82%8F%29%7D%7BP%28%E5%B0%8F%E6%B1%A0%29%7D%20%5C%5C%5C%5C%0A%26%3D%26%20%5Cfrac%7B0.075%20%5Ccdot%200.006%7D%7B0.5972%7D%20%5C%5C%5C%5C%0A%26%3D%26%200.08%20%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x308C;&#x3044;&#x308F;|&#x5C0F;&#x6C60;) &amp;=&amp; \frac{P(&#x5C0F;&#x6C60;|&#x308C;&#x3044;&#x308F;)P(&#x308C;&#x3044;&#x308F;)}{P(&#x5C0F;&#x6C60;)} \\\\ &amp;=&amp; \frac{0.075 \cdot 0.006}{0.5972} \\\\ &amp;=&amp; 0.08 [\%] \end{eqnarray} "/> </div> <p>5位で四捨五入</p> <p>この計算結果を表にまとめる.</p> <table> <thead> <tr> <th style="text-align:center;">P(Y派|小池)</th> <th style="text-align:center;"> 割合[%] </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">P(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9">無党派</a>|小池)</td> <td style="text-align:center;">49.93</td> </tr> <tr> <td style="text-align:center;">P(自民|小池)</td> <td style="text-align:center;">39.96</td> </tr> <tr> <td style="text-align:center;">P(公明|小池)</td> <td style="text-align:center;">6.29</td> </tr> <tr> <td style="text-align:center;">P(立憲民主|小池)</td> <td style="text-align:center;">5.26</td> </tr> <tr> <td style="text-align:center;">P(国民民主|小池)</td> <td style="text-align:center;">0.63</td> </tr> <tr> <td style="text-align:center;">P(共産|小池)</td> <td style="text-align:center;">0.61</td> </tr> <tr> <td style="text-align:center;">P(れいわ|小池)</td> <td style="text-align:center;">0.08</td> </tr> <tr> <td style="text-align:center;">計</td> <td style="text-align:center;">102.76</td> </tr> </tbody> </table> <p>※今回は正確なP(X氏|Y派)とP(Y派)を使ってないのでぴったり100にならない.</p> <p>最も高いのは約50%の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9%C1%D8">無党派層</a>であることがわかります.</p> <p>計100にならないので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9">無党派</a>を1とする比で見てみます.</p> <table> <thead> <tr> <th style="text-align:center;">P(Y派|小池)</th> <th style="text-align:center;"> 比 </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">P(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C5%DE%C7%C9">無党派</a>|小池)</td> <td style="text-align:center;">1</td> </tr> <tr> <td style="text-align:center;">P(自民|小池)</td> <td style="text-align:center;">0.800</td> </tr> <tr> <td style="text-align:center;">P(公明|小池)</td> <td style="text-align:center;">0.126</td> </tr> <tr> <td style="text-align:center;">P(立憲民主|小池)</td> <td style="text-align:center;">0.105</td> </tr> <tr> <td style="text-align:center;">P(国民民主|小池)</td> <td style="text-align:center;">0.0126</td> </tr> <tr> <td style="text-align:center;">P(共産|小池)</td> <td style="text-align:center;">0.0122</td> </tr> <tr> <td style="text-align:center;">P(れいわ|小池)</td> <td style="text-align:center;">0.0016</td> </tr> </tbody> </table> <p>可視化すると,</p> <p><figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3cO0Yyf51BNWKxTp9ll2O2F6eL3KaDr6Wq1h2BTpmlh3CXFI1gxS_UVUjT4Jf1F3eykHZND6z0xztAJFljoGJ9iRevtZxJIGQ53VchEPITrc1dEMtBMp9U3mbQHVIJXjf-i9GZ74aGYEympAH7G0-53Nw=w432-h288-no?authuser=0" itemprop="image"></span> <figcaption>比</figcaption> </figure></p> <p></section></p> <p><section></p> <h2 id="ベイズによる小池氏の得票率の推定"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>による小池氏の得票率の推定</h2> <p>今回は,X氏に投票したかつY党派である同時確率の周辺化により, 実は小池氏の得票率を前もって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>推定できました.</p> <p>式にすると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28X%E6%B0%8F%29%0A%26%3D%26%20%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20P%28X%E6%B0%8F%2C%20Y_%7Bi%7D%E6%B4%BE%29%5C%5C%0A%26%3D%26%20%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20P%28X%E6%B0%8F%7CY_%7Bi%7D%E6%B4%BE%29P%28Y_%7Bi%7D%E6%B4%BE%29%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(X&#x6C0F;) &amp;=&amp; \sum_{i=1}^{N} P(X&#x6C0F;, Y_{i}&#x6D3E;)\\ &amp;=&amp; \sum_{i=1}^{N} P(X&#x6C0F;|Y_{i}&#x6D3E;)P(Y_{i}&#x6D3E;) \end{eqnarray} "/> </div> <ul> <li>※$N$を全党派の数とする(今回は7).</li> <li>※なお,"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FC%CB%DC%B0%DD%BF%B7%A4%CE%B2%F1">日本維新の会</a>","社民","N国","その他の党派"の方々が誰に投票予定かのデータはないので$P(X氏|その他の党派)=0$としているに等しい.</li> </ul> <p>例えば,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%C3%D3%C9%B4%B9%E7%BB%D2">小池百合子</a>氏の得票率を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>推定すると,</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0AP%28%E5%B0%8F%E6%B1%A0%29%0A%26%3D%26%20%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20P%28%E5%B0%8F%E6%B1%A0%7CY%E6%B4%BE%29P%28Y%E6%B4%BE%29%5C%5C%5C%5C%0A%26%3D%26%20P%28%E5%B0%8F%E6%B1%A0%7C%E8%87%AA%E6%B0%91%29P%28%E8%87%AA%E6%B0%91%29%5C%5C%5C%5C%0A%26%2B%26P%28%E5%B0%8F%E6%B1%A0%7C%E5%85%AC%E6%98%8E%29P%28%E5%85%AC%E6%98%8E%29%5C%5C%5C%5C%0A%26%2B%26P%28%E5%B0%8F%E6%B1%A0%7C%E7%AB%8B%E6%B0%91%29P%28%E7%AB%8B%E6%B0%91%29%5C%5C%5C%5C%0A%26%2B%26P%28%E5%B0%8F%E6%B1%A0%7C%E5%9B%BD%E6%B0%91%29P%28%E5%9B%BD%E6%B0%91%29%5C%5C%5C%5C%0A%26%2B%26P%28%E5%B0%8F%E6%B1%A0%7C%E5%85%B1%E7%94%A3%29P%28%E5%85%B1%E7%94%A3%29%5C%5C%5C%5C%0A%26%2B%26P%28%E5%B0%8F%E6%B1%A0%7C%E3%82%8C%E3%81%84%E3%82%8F%29P%28%E3%82%8C%E3%81%84%E3%82%8F%29%5C%5C%5C%5C%0A%26%2B%26P%28%E5%B0%8F%E6%B1%A0%7C%E7%84%A1%E5%85%9A%E6%B4%BE%29P%28%E7%84%A1%E5%85%9A%E6%B4%BE%29%5C%5C%5C%5C%0A%26%3D%26%2061.3%20%5B%5C%25%5D%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} P(&#x5C0F;&#x6C60;) &amp;=&amp; \sum_{i=1}^{N} P(&#x5C0F;&#x6C60;|Y&#x6D3E;)P(Y&#x6D3E;)\\\\ &amp;=&amp; P(&#x5C0F;&#x6C60;|&#x81EA;&#x6C11;)P(&#x81EA;&#x6C11;)\\\\ &amp;+&amp;P(&#x5C0F;&#x6C60;|&#x516C;&#x660E;)P(&#x516C;&#x660E;)\\\\ &amp;+&amp;P(&#x5C0F;&#x6C60;|&#x7ACB;&#x6C11;)P(&#x7ACB;&#x6C11;)\\\\ &amp;+&amp;P(&#x5C0F;&#x6C60;|&#x56FD;&#x6C11;)P(&#x56FD;&#x6C11;)\\\\ &amp;+&amp;P(&#x5C0F;&#x6C60;|&#x5171;&#x7523;)P(&#x5171;&#x7523;)\\\\ &amp;+&amp;P(&#x5C0F;&#x6C60;|&#x308C;&#x3044;&#x308F;)P(&#x308C;&#x3044;&#x308F;)\\\\ &amp;+&amp;P(&#x5C0F;&#x6C60;|&#x7121;&#x515A;&#x6D3E;)P(&#x7121;&#x515A;&#x6D3E;)\\\\ &amp;=&amp; 61.3 [\%] \end{eqnarray} "/> </div> <p>なんと誤差+2%程である.</p> <p>このことから, - 小池氏への投票予定先データ通りに投票行動した人が多かった - また,全国区の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a>と都内の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%AF%C5%DE%BB%D9%BB%FD%CE%A8">政党支持率</a>はほぼ変わらなかった</p> <p>といえる.</p> <p>※ただし,他の候補者例えば宇都宮氏や山本氏で同様に計算すると, P(X氏|Y派)=0の部分もあるので誤差は大きめになる.</p> <p></section></p> <p><section></p> <h2 id="まとめ">まとめ</h2> <p>今回の計算が可能になったキモは, <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BF%B7%CA%B9">東京新聞</a>の行った投票予定先データです. 一応,<a href="https://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=325AC1000000100#1233">公職選挙法の138条の2で規定されている"人気投票の公表の禁止"</a>では 実際の投票結果でなければセーフとという判断のようですが,今回の計算結果をみると予定先のデータでもかなり情報として有用かつ危険であることがわかります.</p> <p>今回のように<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>推定できると,投票の意義を感じず投票行動を阻害する可能性があるので今後規制が入ってもおかしくないような..</p> <p>計算に使ったコード: <a href="https://github.com/Cartman0/tochijisen-20200705">GitHub - Cartman0/tochijisen-20200705: &#x9078;&#x6319;&#x7D71;&#x8A08; 20200705&#x306E;&#x90FD;&#x77E5;&#x4E8B;&#x9078;&#x306E;&#x5206;&#x6790;</a></p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><a href="https://web.archive.org/web/20200706075456/http://www.nhk.or.jp/senkyo/shijiritsu/">https://web.archive.org/web/20200706075456/http://www.nhk.or.jp/senkyo/shijiritsu/</a></p></li> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.asahi.com%2Fsenkyo%2Ftochijisen%2F2020%2Fkaihyo%2F" title="開票速報|2020都知事選(東京都知事選挙):朝日新聞デジタル" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.asahi.com/senkyo/tochijisen/2020/kaihyo/">www.asahi.com</a></cite></p></li> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.senkyo.metro.tokyo.lg.jp%2Felection%2Ftochiji-all%2Ftochiji-sokuhou2020%2F" title="東京都知事選挙(令和2年7月5日執行) 投開票結果 | 東京都選挙管理委員会" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.senkyo.metro.tokyo.lg.jp/election/tochiji-all/tochiji-sokuhou2020/">www.senkyo.metro.tokyo.lg.jp</a></cite></p></li> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Felaws.e-gov.go.jp%2Fsearch%2FelawsSearch%2Felaws_search%2Flsg0500%2Fdetail%3FlawId%3D325AC1000000100%231233" title="e-Gov法令検索" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=325AC1000000100#1233">elaws.e-gov.go.jp</a></cite></p></li> </ul> <p></aside></p> Wed, 08 Jul 2020 06:14:30 +0900 hatenablog://entry/26006613595391822 選挙統計 確率・統計 ベイズ統計 雑記 WSL2のインストールメモ https://cartman0.hatenablog.com/entry/2020/07/02/WSL2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%A2?utm_source=feed <h1 id="WSL2のインストールメモ">WSL2のインストールメモ</h1> <p>Windows10 ver2004からWSL2のインストールが可能になったのでそのメモ.</p> <p>以下のドキュメントの手順に従えばインストール可能.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fwindows%2Fwsl%2Finstall-win10" title="Windows Subsystem for Linux (WSL) を Windows 10 にインストールする" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://docs.microsoft.com/ja-jp/windows/wsl/install-win10">docs.microsoft.com</a></cite></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#WSL2のインストールメモ">WSL2のインストールメモ</a><ul> <li><a href="#環境">環境</a></li> <li><a href="#導入手順">導入手順</a><ul> <li><a href="#Windows10をver2004へアップデート">Windows10をver2004へアップデート</a></li> <li><a href="#Windows-TerminalをMicrosoftStoreからインストール">Windows TerminalをMicrosoftStoreからインストール</a></li> <li><a href="#wsl2を使うのためのオプションを有効にする">wsl2を使うのためのオプションを有効にする</a></li> <li><a href="#wsl2を有効にするためにPCを再起動">wsl2を有効にするためにPCを再起動</a></li> <li><a href="#wslのデフォルトバージョンを設定する">wslのデフォルトバージョンを設定する</a></li> <li><a href="#Ubuntuなどの好きなLinuxディストリビューションをMicrosoftStoreからインストール">Ubuntuなどの好きなLinuxディストリビューションをMicrosoftStoreからインストール</a></li> <li><a href="#ディストリビューションを起動設定する">ディストリビューションを起動・設定する</a></li> <li><a href="#インストールされているパッケージの更新">インストールされているパッケージの更新</a></li> </ul> </li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <p><section></p> <h2 id="環境">環境</h2> <ul> <li>Windows10 64bit</li> </ul> <p></section></p> <p><section></p> <h2 id="導入手順">導入手順</h2> <ol> <li> <h3 id="Windows10をver2004へアップデート">Windows10をver2004へアップデート</h3> <p>`winver`コマンドでバージョンが2004以上になっているかを確認する. </p> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3eUc2rJMDAFj4KCtEs6Sox_1c34L6Z_QLUVvqDlkrZZ_Li97o9Fb6b3ReDKxyu_UlvldzslgJhuIS6lU6iZ0HduObEBqmCV1D91mRrb4d6-M7nXyGe2-fA7ON4P-9-fBwK2Fp42AunrcO1CTFlSK_rp0w=w594-h474-no?authuser=0" itemprop="image"></span> <figcaption>winverでバージョン確認</figcaption></figure> <p>2004未満の場合は以下のページからアップデートする. <a href="https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-update">https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-update</a> </p> </li> <li> <h3 id="Windows-TerminalをMicrosoftStoreからインストール"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> TerminalをMicrosoftStoreからインストール</h3> <p> WSLはcmdや<a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>からも起動できるが, WindowsTerninalではタブ利用もできて便利なので今回はこちらを利用する. MicrosoftStoreからインストールできる. </p> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.microsoft.com%2Fja-jp%2Fp%2Fwindows-terminal%2F9n0dx20hk701" title="Windows Terminal を入手 - Microsoft Store ja-JP" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701">www.microsoft.com</a></cite> (<a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>と名前が付いているのはプレビュー版になるので注意) </li> <li> <h3 id="wsl2を使うのためのオプションを有効にする">wsl2を使うのためのオプションを有効にする</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> Terminalを管理者権限で起動する.次のコマンドを実行する.</p> <pre><code>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart </code></pre> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fFZKHybzL5gZLs0FBjGLQWeWp7ubweERmP248jFzekXzP6VeAjcuSvbwqScNCJsQST1rtFQo13OseOH1Jp0u_uYLl_MCxyUk_eLY2u72JDxhgFyYdObgU2mfnCYeYUrwdtyxUPvUAhSomBeq5wYpOT4Q=w818-h155-no?authuser=0" itemprop="image"></span><figcaption>wsl2のバージョン設定</figcaption></figure> </li> <li> <h3 id="wsl2を有効にするためにPCを再起動">wsl2を有効にするためにPCを再起動</h3> <p> こうすると"<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>用<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>サブシステム"が有効になり,その内部で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Hyper-V">Hyper-V</a>が有効になる."<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>"の機能から確認できる. </p> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3csaugZC8DfPIfSWDVhkhKeKkEl6ivex-azHFNlsRD7ke-pXgsMl7k9NpCGQotAvVgeNPWObtlW1uADlURWHfFg9qFgCtsT6ZzS4VpDy5nS2a2beMuIkU81SX4ufWH2qimVzYvQxVAfbXirvvxRo2S9Yw=w552-h490-no?authuser=0" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>の機能</figcaption> </figure> </li> <li> <h3 id="wslのデフォルトバージョンを設定する">wslのデフォルトバージョンを設定する</h3> <pre><code>wsl --set-default-version 2</code></pre> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3e-U2Z6FPxlkNNnZXIJYPubjH0Vy2Z6XnYGw0Vdu1EOImnCiyOqdDU4Lhtm9G-ufruHD93xZcyzLIBmEiD6O8se1H9afutd9CX3x9ne7QGXxaNp-V4LHGFow6Sn4l6hSrPhWtQZNS_AagqR1zwvbHxGUQ=w618-h43-no?authuser=0" itemprop="image"></span> <figcaption>wsl2のバージョン設定</figcaption></figure> <p>※アップデートを求められたら<a href="https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel">WSL 2 Linux &#x30AB;&#x30FC;&#x30CD;&#x30EB;&#x306E;&#x66F4;&#x65B0; | Microsoft Docs</a> から手動で更新する.そしてWindowsTerminal(<a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>)を再起動して再度コマンドで設定する. </p> </li> <li> <h3 id="Ubuntuなどの好きなLinuxディストリビューションをMicrosoftStoreからインストール"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>などの好きな<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">Linuxディストリビューション</a>をMicrosoftStoreからインストール</h3> <p>今回はUbuntu20.04LTSをインストールする.</p> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3dPFoxopuGPfS1OWLmAfVNDO41WbMkUeQukt_R2hij6-60bvgV0eGI7BM9aBdqgYgFgwGt-812xoK5fNoTJ0OpJlqUDXw_lsc2hjgyxZKUYBzrWPINnC6Sg5ahqJHp7PiYt0s6T8v8cFO9kqggeMzLXKw=w618-h328-no?authuser=0" itemprop="image"></span><figcaption>MicrosoftStoreから<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">Linuxディストリビューション</a>をインストール</figcaption> </figure> </li> <li><h3 id="ディストリビューションを起動設定する"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>を起動・設定する</h3> <p>起動方法は主に3種類ある.</p> <ul> <li>cmd/<a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>から<code>wsl</code>コマンド:<a class="keyword" href="http://d.hatena.ne.jp/keyword/windows">windows</a>の現在の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リがマウントされて起動</li> <li>cmd/<a class="keyword" href="http://d.hatena.ne.jp/keyword/powershell">powershell</a>から<code>ubuntu2004.exe</code>:wslのroot<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リがマウントされて起動</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>をスタートメニューまたはMicrosoftStoreから起動する.wslのroot<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リがマウントされて新しいシェルウィンドウが開く.</li> </ul> <p> 起動すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%D7%A5%ED%A5%F3%A5%D7%A5%C8">コマンドプロンプト</a>が開き初期設定が始まる. </p> <p> 次に,ユーザー名とパスワードを設定する. <a href="https://docs.microsoft.com/ja-jp/windows/wsl/user-support">Linux &#x30C7;&#x30A3;&#x30B9;&#x30C8;&#x30EA;&#x30D3;&#x30E5;&#x30FC;&#x30B7;&#x30E7;&#x30F3;&#x306E;&#x30E6;&#x30FC;&#x30B6;&#x30FC; &#x30A2;&#x30AB;&#x30A6;&#x30F3;&#x30C8;&#x3092;&#x4F5C;&#x6210;&#x304A;&#x3088;&#x3073;&#x66F4;&#x65B0;&#x3059;&#x308B; | Microsoft Docs</a> ユーザ作成に成功するとそのユーザでログインし,以下の画面になる. </p> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3cPIGtesCtXaVZABxFLTOZG7shFgX1oto4jtmnt9m3o9S2GtePu99dr6uW3n_JfxVKDzOa2fQZwM8TvOtG7KYA9GmWWNiHX4jY3xfQmCQgdiKOoO73zx5eDVFykeacgBLEH33_WLXZqIGMWlmMTlCaNLQ=w618-h464-no?authuser=0" itemprop="image"></span> <figcaption>ログイン</figcaption> </figure> </li> <il> <h3 id="インストールされているパッケージの更新">インストールされているパッケージの更新</h3> <p> 次のコマンドでパッケージカタログの更新とインストールされているパッケージの更新を行う.</p> <pre><code>sudo apt update && sudo apt upgrade</code></pre> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3dIuXXx1bx3YQvxMnSCG3ywKz_x8yuFqJ72yV0yJbRT_v5AbAropwSh5Aw1QKXAzafhomlCxrm5ByE-95o1mRg7wLW3kSwsh4tGV8SbhhTMzurYXNsFWK-UGfcvVuj8RZIktcRzJ_-I28AThRVcPHiI-A=w618-h123-no?authuser=0" itemprop="image"></span> <figcaption>パッケージのアップデート</figcaption> </figure> <p>インストール済みパッケージを調べるには`dpkg -l`</p> <pre><code>dpkg -l </code></pre> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/gawk">gawk</a>,<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>,<a class="keyword" href="http://d.hatena.ne.jp/keyword/grep">grep</a>,<a class="keyword" href="http://d.hatena.ne.jp/keyword/gzip">gzip</a>,man,mawk,<a class="keyword" href="http://d.hatena.ne.jp/keyword/perl">perl</a>,python3,<a class="keyword" href="http://d.hatena.ne.jp/keyword/wget">wget</a>などなどが入ってることがわかる.qで抜けられる </p> <figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3edFNTqJLm1xMKp4BcmLDLesDlG6Tk0FI_-iTFqex2tdECWP0k8DxoW4g7IDlgcjTAtj5mNV3FGqN-FoCSmfkZa9gVRt5xheQA3C6o_tCCeaO2Azzs4AoDYKKstzQfajVp2MOs1Fj8ZkDmFoGDcqIGcKQ=w630-h354-no?authuser=0" itemprop="image"></span> <figcaption>インストール済みパッケージ</figcaption> </figure> <p> 行頭がDesired, Status=ii になっているものがインストール済みになる. -lオプションのあとに&lt;pattern(glob)&gt;を入れるとインストールしてないものも表示される. <a class="keyword" href="http://d.hatena.ne.jp/keyword/grep">grep</a>でインストール済みのものを表示できる.例えば<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>を調べるには </p> <pre><code>bash ~$ dpkg -l vim | grep ^ii ii vim 2:8.1.2269-1ubuntu5 amd64 Vi IMproved - enhanced vi editor</code></pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>から抜けるには <code>exit</code>でログアウトできる.</p> </il> </ol> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fwindows%2Fwsl%2Finstall-win10" title="Windows Subsystem for Linux (WSL) を Windows 10 にインストールする" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://docs.microsoft.com/ja-jp/windows/wsl/install-win10">docs.microsoft.com</a></cite></p></li> </ul> <p></aside></p> Thu, 02 Jul 2020 06:08:53 +0900 hatenablog://entry/26006613592537950 Windows WSL2 点とバウンディングボックスとの距離を求める https://cartman0.hatenablog.com/entry/2020/06/15/%E7%82%B9%E3%81%A8%E3%83%90%E3%82%A6%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AE%E8%B7%9D%E9%9B%A2%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B?utm_source=feed <h1 id="点とバウンディングボックス超長方形hyper-rectangleとの距離を求める">点と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス(超長方形hyper rectangle)との距離を求める</h1> <p>超次元点と超次元長方形の距離を求めるメモ.</p> <p>距離の考え方としては以下になる.</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの外に点がある場合は,その最短距離の求め方</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス内に点がある場合は,距離0とする.</li> <li>逆に,最長距離の求め方</li> </ul> <p>これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%B9%A5%BF%A5%EA%A5%F3%A5%B0">クラスタリング</a>などの最近傍を求めるような,とくにk-d treeを使った近傍探索に使える.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fPo-54_E0McMObBhQATXw_GxT-BrCm3e_ruvGeBENsHFGJq4cTtKW7tPy8dYF46yZIBCzsilwzPqTb8nZVcomdI5afhIvMxq6zeauZP4Bzg_RdffejDfLvaSDozSLgtEXVanAD1mNbF5PRB_6rghgwVQ=w864-h288-no?authuser=0" itemprop="image"></span> <figcaption>例:点と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスとの最短距離</figcaption> </figure></p> <p><nav></p> <ul class="table-of-contents"> <li><a href="#点とバウンディングボックス超長方形hyper-rectangleとの距離を求める">点とバウンディングボックス(超長方形hyper rectangle)との距離を求める</a><ul> <li><a href="#最短距離を求める">最短距離を求める</a><ul> <li><a href="#バウンディングボックス左側に対象データがある場合">バウンディングボックス左側に対象データがある場合</a></li> <li><a href="#バウンディングボックス右側に対象データがある場合">バウンディングボックス右側に対象データがある場合</a></li> <li><a href="#2つのパターンをまとめる">2つのパターンをまとめる</a></li> </ul> </li> <li><a href="#バウンディングボックス内部にあるかを判定する">バウンディングボックス内部にあるかを判定する</a><ul> <li><a href="#python-codeで実装">python codeで実装</a></li> </ul> </li> <li><a href="#最長距離を求める">最長距離を求める</a></li> <li><a href="#バウンディングボックスとバウンディングボックスとの距離は">バウンディングボックスとバウンディングボックスとの距離は?</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> </li> </ul> <p></nav></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script> <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <p><section></p> <h2 id="最短距離を求める">最短距離を求める</h2> <p>ある1次元で考えると距離を考えやすい.</p> <p><section></p> <h3 id="バウンディングボックス左側に対象データがある場合"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス左側に対象データがある場合</h3> <p>つまり,以下の数直線の状況, データと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの位置関係が$x_i &lt; \text{BB_min}_i$の場合を考える.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3dj372ROzZkwWMUlkvJxlYQCF-33frfsVV1Gvaydlgl75yMX2Pz1HEwbGrKcuAzwQZWAPVWXqFyGf1CeHUuh1Fo_OhiLE3Z9dY68FgrRNIQ2bNFDGzt28ifwhriUyS4elHl3KepF8I9-qTzUCMhlGJPgg=w432-h144-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス左側にデータがある場合</figcaption> </figure></p> <p>差の絶対値でなく符号付きの差を考える. 以下4パターンが考えられる.</p> <ul> <li>$x_{i} - \text{BB_max}_{i}$ : -(負)</li> <li>$\text{BB_max}_{i} - x_{i}$: +(正)</li> <li>$x_{i} - \text{BB_min}_{i}$ : -(負)</li> <li>$\text{BB_min}_{i} - x_{i}$: +(正)</li> </ul> <p>最短距離を考えると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの最大値との差を見ている, 上1,2番目は対象外になり以下2パターンになる.</p> <ul> <li>$x_{i} - \text{BB_min}_{i}$ : -(負)</li> <li>$\text{BB_min}_{i} - x_{i}$: +(正)(最短距離)</li> </ul> <p>符号込みで考えると最後のパターンが正しい.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Ctext%7BBB_min%7D_%7Bi%7D%20-%20x_%7Bi%7D%0A" alt=" \text{BB_min}_{i} - x_{i} "/> </div> <p>※位置関係が,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの最小値が正にあり,データがその左側の正にあってもこの関係は変わらない. ($x_{i} &lt; \text{BB_min}_{i}$は常に成立)</p> <p></section></p> <p><section></p> <h3 id="バウンディングボックス右側に対象データがある場合"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス右側に対象データがある場合</h3> <p>次に,<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス右側に対象デ-タがある場合を考える. つまり,データと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの位置関係が$ \text{BB_max}_{i} &lt; x_{i} $の場合を考える.</p> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3evPJNQ6j4_zNGIV1QnCO1DYA0eIfcKm5p4oc1Pwn8uxZGohQsML0I4pOgCCQvJbtCXIsX5lNNTmVz1Q0QA1mTzo2wF4MXG5bxP2TwPx7vJ5c8V3V83aGmHuaamFreAgfg33-YG_nQ2JwjBEEEGIuzwOQ=w432-h144-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス右側に対象データがある場合</figcaption> </figure></p> <p>これも同様に,距離関係になり得るペアは4パターンある.</p> <ul> <li>$\text{BB_min}_{i} - x_{i}$: -(負)</li> <li>$x_{i} - \text{BB_min}_{i}$ : +(正)</li> <li>$\text{BB_max}_{i} - x_{i}$: -(負)</li> <li>$x_{i} - \text{BB_max}_{i}$ : +(正)</li> </ul> <p>最短距離を考えると,今度は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの最小値との差を見ている, 上1,2番目は対象外になり以下2パターンになる.</p> <ul> <li>$\text{BB_max}_{i} - x_{i}$: -(負)</li> <li>$x_{i} - \text{BB_max}_{i}$ : +(正)(最短距離)</li> </ul> <p>符号込みで考えると最後のパターンが正しい.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0Ax_i%20-%20%5Ctext%7BBB_max%7D_i%0A" alt=" x_i - \text{BB_max}_i "/> </div> <p>※<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの最大値が負にあり,データがその右側の負にあってもこの関係は変わらない.($\text{BB_max} &lt; x_{i}$は常に成立)</p> <p></section></p> <p><section></p> <h3 id="2つのパターンをまとめる">2つのパターンをまとめる</h3> <p>データが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの左側または右側, この2つの状況をまとめて考える. クロス表のようなものを考えると以下の関係になる.</p> <table> <thead> <tr> <th style="text-align:center;"> \ </th> <th style="text-align:center;">左側</th> <th style="text-align:center;">右側</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> $\text{BB_min}_{i} - x_{i}$ </td> <td style="text-align:center;"> 正 </td> <td style="text-align:center;"> 負 </td> </tr> <tr> <td style="text-align:center;"> $x_{i} - \text{BB_max}_{i}$ </td> <td style="text-align:center;"> 負 </td> <td style="text-align:center;"> 正 </td> </tr> </tbody> </table> <p>つまり,2つの差を計算して正になるものが距離として正しい値になる. ifチェックでも判定できるがmaxを使えば数式で1つにまとめられる. 1つの軸の差を$\mathrm{sd}_{i}$とすると</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cmathrm%7Bsd%7D_%7Bi%7D%0A%3D%0A%5Cmathrm%7Bmax%7D%28%5Ctext%7BBB_min%7D_%7Bi%7D%20-%20x_%7Bi%7D%2C%20x_%7Bi%7D%20-%20%5Ctext%7BBB_max%7D_%7Bi%7D%29%2C%20%28%5Ctext%7Bfor%20%7D%20i%20%3D%201%2C%20%5Ccdots%20%2C%20d%29%0A" alt=" \mathrm{sd}_{i} = \mathrm{max}(\text{BB_min}_{i} - x_{i}, x_{i} - \text{BB_max}_{i}), (\text{for } i = 1, \cdots , d) "/> </div> <p>ここまでくればp-ノルム距離(ミンコスキー距離)を簡単に求められる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0AD%20%3D%20%5Cleft%28%20%5Csum_%7Bi%7D%5E%7Bd%7D%20%5Cmathrm%7Bsd%7D_%7Bi%7D%5E%7Bp%7D%20%5Cright%29%5E%7B1%2Fp%7D%2C%20%28p%20%3E0%2C%20%5Cneq%20%5Cinfty%29%0A" alt=" D = \left( \sum_{i}^{d} \mathrm{sd}_{i}^{p} \right)^{1/p}, (p &gt;0, \neq \infty) "/> </div> <p></section> </section></p> <p><section></p> <h2 id="バウンディングボックス内部にあるかを判定する"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス内部にあるかを判定する</h2> <p>この符号付き距離を使って中にあるかどうかを判定できればいい.</p> <p><figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3dQzMNoAC-7GwNJgRz4GzCfqD-EwQlEIqbQcUiDXXNeFggj6HUq3vIM6tYg2UbqSw2cLjNd53KrmQZe63S2vmB0nkOiILeGH4NK2zEcx2a9kifnW-MaOfhkUTbd7E2IvIVEyi98MA50Ek0GqKQdeUehhA=w432-h144-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス内に点がある場合</figcaption> </figure></p> <p>このとき<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの上限下限との符号付き距離は以下のようになる.</p> <table> <thead> <tr> <th style="text-align:center;"> \ </th> <th style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/sign">sign</a></th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> $\text{BB_min}_{i} - x_{i}$ </td> <td style="text-align:center;"> 負 </td> </tr> <tr> <td style="text-align:center;"> $x_{i} - \text{BB_max}_{i}$ </td> <td style="text-align:center;"> 負 </td> </tr> </tbody> </table> <p>もし上限下限上にある場合は0となる.</p> <table> <thead> <tr> <th style="text-align:center;"> \ </th> <th style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/sign">sign</a></th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> $\text{BB_min}_{i} - x_{i}$ </td> <td style="text-align:center;"> 0 </td> </tr> <tr> <td style="text-align:center;"> $x_{i} - \text{BB_max}_{i}$ </td> <td style="text-align:center;"> 0 </td> </tr> </tbody> </table> <p><figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3fmpCNcTBExKUOK5OJ8s21sI1XseaKu1jfDFc24IN1nvolQOuTdGZXWR6xrRFM41bo1AqW9AIKiY-BGJzoO_nLyHo8SzeN2CADVfCXq6tDedE_EicpwX9nNz2g6_4vIUcvoQ4I0u-FK_MPkC8TXXM_VNw=w432-h144-no?authuser=0" itemprop="image"></span> <figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスのエッジ上に点がある場合</figcaption> </figure></p> <p>つまり, $\text{BB_min}_{i} - x_{i}$, $x_{i} - \text{BB_max}_{i}$ の両者が0以下になれば内部にあり距離0と返せばいい.</p> <p>これは外にある場合の距離$\mathrm{sd}_{i}$と0の最大値をみることで計算可能.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Ctext%7Bsd%7D_%7Bi%7D%0A%26%3D%26%20%5Cmathrm%7Bmax%7D%28%0Ax_%7Bi%7D%20-%20%5Ctext%7BBB_max%7D_%7Bi%7D%2C%20%5Ctext%7BBB_min%7D_%7Bi%7D%20-%20x_%7Bi%7D%29%5C%5C%0A%5Chat%7B%5Ctext%7Bsd%7D%7D_%7Bi%7D%0A%26%3D%26%20%5Cmathrm%7Bmax%7D%280%2C%5Cmathrm%7Bsd%7D_%7Bi%7D%29%5C%5C%0AD%20%26%3D%26%20%5Cleft%28%20%5Csum_%7Bi%7D%5E%7Bd%7D%20%5Chat%7B%5Cmathrm%7Bsd%7D%7D_%7Bi%7D%5E%7Bp%7D%20%5Cright%29%5E%7B1%2Fp%7D%2C%20%28p%20%3E0%2C%20%5Cneq%20%5Cinfty%29%0A%5Cend%7Beqnarray%7D%0A" alt=" \begin{eqnarray} \text{sd}_{i} &amp;=&amp; \mathrm{max}( x_{i} - \text{BB_max}_{i}, \text{BB_min}_{i} - x_{i})\\ \hat{\text{sd}}_{i} &amp;=&amp; \mathrm{max}(0,\mathrm{sd}_{i})\\ D &amp;=&amp; \left( \sum_{i}^{d} \hat{\mathrm{sd}}_{i}^{p} \right)^{1/p}, (p &gt;0, \neq \infty) \end{eqnarray} "/> </div> <p>もしデータ点$\vec{x}$が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス内であると $\hat{\text{sd}}_{i}$が全て0となり距離$D$も0となる.</p> <p><section></p> <h3 id="python-codeで実装"><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> codeで実装</h3> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np point = [-<span class="synConstant">1</span>, -<span class="synConstant">1</span>] <span class="synStatement">class</span> <span class="synIdentifier">BB</span>(): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, lower, upper): self.mins = np.minimum(lower,upper) self.maxes = np.maximum(lower,upper) sd_hat = np.maximum(<span class="synConstant">0</span>,np.maximum(self.mins-x,x-self.maxes)) p = <span class="synConstant">2</span> D = sp.sum(sd_hat**p)**(<span class="synConstant">1</span>/p) </pre> <p>ちなみにこのコードは,<code>scipy.spatial.kdtree.py</code>中の<code>min_distance_point</code>関数で定義されている.</p> <p><a href="https://github.com/scipy/scipy/blob/v0.14.0/scipy/spatial/kdtree.py#L117">scipy/kdtree.py at v0.14.0 &middot; scipy/scipy &middot; GitHub</a></p> <p></section></p> <p></section></p> <p><section></p> <h2 id="最長距離を求める">最長距離を求める</h2> <p>最短距離同様に最長距離を考える. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスの左側に点がある場合, 以下2パターンになる.</p> <ul> <li>$x_{i}-\text{BB_min}_{i}$: -(負)</li> <li>$\text{BB_max}_{i} - x_{i}$: +(正)(最長距離)</li> </ul> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3dRfHTw30U5lll8u1ma0_JX6BS8Mc5Vjb2r7YTMcq3nurC8EInLcelrsSCN9T4MYng4BMhpW56l1P64KbLl4fqStbBSg2BrrgHYFiITVBP8wiSOmaV98O6NADrKYF4LW9FOrnl-oIHerv4Sz5CSb-SrAw=w432-h144-no?authuser=0" itemprop="image"></span> <figcaption>点が左側にある場合の最大距離</figcaption> </figure></p> <p>反対の右側にある場合を考える. 以下2パターンにある.</p> <ul> <li>$\text{BB_max}_{i} - x_{i}$: -(負)</li> <li>$x_{i} − \text{BB_min}_{i}$ : +(正)(最長距離)</li> </ul> <p><figure> <span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3ffwFHKZFTJIl8K4XMYTIUbBFHk9quFDMY1Ii65v3pfwpzpw9Ko5k_GJMOOQ3YcCIT0SU2FOWELCc9wp8TqerIi_dAC5hdS5nPLazoXufkEBes2RFt6mlf-cv1MkCJLIqEZp2dxm52UL3A7v56dV899SA=w432-h144-no?authuser=0" itemprop="image"></span> <figcaption>点が右側にある場合の最大距離</figcaption> </figure></p> <p>以上のパターンをまとめると</p> <table> <thead> <tr> <th style="text-align:center;">\ </th> <th style="text-align:center;">左側</th> <th style="text-align:center;">右側</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> $ \text{BB_max}_{i}-x_{i} $ </td> <td style="text-align:center;"> 正 </td> <td style="text-align:center;"> 負 </td> </tr> <tr> <td style="text-align:center;"> $ x_{i} - \text{BB_min}_{i}$</td> <td style="text-align:center;"> 負 </td> <td style="text-align:center;"> 正 </td> </tr> </tbody> </table> <p>各軸の最長距離を求める式は次になる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cmathrm%7Bsd%7D_%7Bi%7D%0A%3D%0A%5Cmathrm%7Bmax%7D%28%5Ctext%7BBB_max%7D_%7Bi%7D%20-%20x_%7Bi%7D%20%2C%20%20x_%7Bi%7D%20-%20%5Ctext%7BBB_min%7D_%7Bi%7D%29%2C%20%28%5Ctext%7Bfor%20%7D%20i%20%3D%201%2C%20%5Ccdots%20%2C%20d%29%0A" alt=" \mathrm{sd}_{i} = \mathrm{max}(\text{BB_max}_{i} - x_{i} , x_{i} - \text{BB_min}_{i}), (\text{for } i = 1, \cdots , d) "/> </div> <p>この距離の式のときに, <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス内部に点がある場合の符号付き距離がどうなるか調べる.</p> <table> <thead> <tr> <th style="text-align:center;"> \ </th> <th style="text-align:center;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/sign">sign</a></th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> $\text{BB_max}_{i} - x_{i}$ </td> <td style="text-align:center;"> 正 </td> </tr> <tr> <td style="text-align:center;"> $x_{i} - \text{BB_min}_{i}$ </td> <td style="text-align:center;"> 正 </td> </tr> </tbody> </table> <p><figure><span itemtype="http://schema.org/Photograph" itemscope="itemscope"><img class="magnifiable" src="https://lh3.googleusercontent.com/pw/ACtC-3dQzMNoAC-7GwNJgRz4GzCfqD-EwQlEIqbQcUiDXXNeFggj6HUq3vIM6tYg2UbqSw2cLjNd53KrmQZe63S2vmB0nkOiILeGH4NK2zEcx2a9kifnW-MaOfhkUTbd7E2IvIVEyi98MA50Ek0GqKQdeUehhA=w432-h144-no?authuser=0" itemprop="image"></span> <figcaption> 点が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス内部にある場合(再掲) </figcaption> </figure></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックス内部のときを距離0とすると式は, 以下の条件で分けられる.</p> <div> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cbegin%7Beqnarray%7D%0A%5Chat%7B%5Cmathrm%7Bsd%7D%7D_%7Bi%7D%0A%26%3D%26%0A%5Cleft%5C%7B%0A%5Cbegin%7Barray%7D%7Bll%7D%0A0%20%26%20%28%5Ctext%7BBB_max%7D_i%20-%20x_i%3E0%20%5Ccap%20x_i%20-%20%5Ctext%7BBB_min%7D_i%3E0%29%5C%5C%0A%5Cmathrm%7Bsd%7D_%7Bi%7D%20%26%20%28%5Ctext%7Bothers%7D%29%0A%5Cend%7Barray%7D%0A%5Cright.%5C%5C%0AD%20%26%3D%26%20%5Cleft%28%20%5Csum_%7Bi%7D%5E%7Bd%7D%20%5Chat%7B%5Cmathrm%7Bsd%7D%7D_%7Bi%7D%5E%7Bp%7D%20%5Cright%29%5E%7B1%2Fp%7D%2C%20%28p%20%3E0%2C%20%5Cneq%20%5Cinfty%29%0A%5Cend%7Beqnarray%7D%0A%0A" alt=" \begin{eqnarray} \hat{\mathrm{sd}}_{i} &amp;=&amp; \left\{ \begin{array}{ll} 0 &amp; (\text{BB_max}_i - x_i&gt;0 \cap x_i - \text{BB_min}_i&gt;0)\\ \mathrm{sd}_{i} &amp; (\text{others}) \end{array} \right.\\ D &amp;=&amp; \left( \sum_{i}^{d} \hat{\mathrm{sd}}_{i}^{p} \right)^{1/p}, (p &gt;0, \neq \infty) \end{eqnarray} "/> </div> <p>最大距離は<code>scipy.spatial.kdtree.py</code>中の<code>max_distance_point</code>で定義されている.</p> <p><a href="https://github.com/scipy/scipy/blob/v0.14.0/scipy/spatial/kdtree.py#L131">scipy/kdtree.py at v0.14.0 &middot; scipy/scipy &middot; GitHub</a></p> <p></section></p> <p><section></p> <h2 id="バウンディングボックスとバウンディングボックスとの距離は"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A6%A5%F3%A5%C7%A5%A3">バウンディ</a>ングボックスとの距離は?</h2> <p>点の場合と同様に考えることで計算可能.</p> <ul> <li><a href="https://github.com/scipy/scipy/blob/v0.14.0/scipy/spatial/kdtree.py#L145"><code>scipy/spatial/kdtree.py</code>中の<code>min_distance_rectangle</code></a></li> <li><a href="https://github.com/scipy/scipy/blob/v0.14.0/scipy/spatial/kdtree.py#L159"><code>scipy/spatial/kdtree.py</code>中の<code>max_distance_rectangle</code></a></li> </ul> <p>で定義されている.</p> <p></section></p> <p><aside></p> <h2 id="参考リンク">参考リンク</h2> <ul> <li><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fscipy%2Fscipy%2Fblob%2Fv0.14.0%2Fscipy%2Fspatial%2Fkdtree.py%23L174" title="scipy/scipy" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/scipy/scipy/blob/v0.14.0/scipy/spatial/kdtree.py#L174">github.com</a></cite></p></li> </ul> <p></aside></p> Mon, 15 Jun 2020 21:58:32 +0900 hatenablog://entry/26006613585469796 clustering math MachineLearning