<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>CVMLAB Blog</title><link href="https://eiichiromomma.github.io/" rel="alternate"></link><link href="https://eiichiromomma.github.io/feeds/all.atom.xml" rel="self"></link><id>https://eiichiromomma.github.io/</id><updated>2026-01-19T08:00:00+09:00</updated><subtitle>Computer Vision and Measurement Lab.</subtitle><entry><title>WindowsでのオススメのPython環境 2026版</title><link href="https://eiichiromomma.github.io/2026/01/19/WinPython2026/" rel="alternate"></link><published>2026-01-19T08:00:00+09:00</published><updated>2026-01-19T08:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2026-01-19:/2026/01/19/WinPython2026/</id><summary type="html">&lt;p&gt;Python環境をuvにする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/astral-sh/uv"&gt;uvの配布元&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;利点としては以下が挙げられる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pyenv不要で複数バージョンのPythonがシステムに同居できる&lt;/li&gt;
&lt;li&gt;これまではpyenvによるアクロバチックな切り替えが必要(mac, Linux)，各バージョンのインストールは自前でpy.exeでがんばる(Windows)&lt;/li&gt;
&lt;li&gt;複数バージ …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Python環境をuvにする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/astral-sh/uv"&gt;uvの配布元&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;利点としては以下が挙げられる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pyenv不要で複数バージョンのPythonがシステムに同居できる&lt;/li&gt;
&lt;li&gt;これまではpyenvによるアクロバチックな切り替えが必要(mac, Linux)，各バージョンのインストールは自前でpy.exeでがんばる(Windows)&lt;/li&gt;
&lt;li&gt;複数バージョンのPythonおよび，パッケージがプロジェクト間で重複してもディスク占有容量が増えない&lt;/li&gt;
&lt;li&gt;仮想環境の数だけGBオーダーでディスクが圧迫される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uvx --with xxx&lt;/code&gt;の機構で仮想環境を作らずにpythonスクリプト(.pyだけでなくipythonのようなインタプリタやjupyterlabも)が実行できる&lt;/li&gt;
&lt;li&gt;特にLLM関係はuvxで書かれた実行サンプルが多い&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv add&lt;/code&gt;(pyproject.toml, uv.lock)でのパッケージ管理の方がpipやcondaより圧倒的に速く賢い&lt;/li&gt;
&lt;li&gt;開発環境のシェアが楽&lt;/li&gt;
&lt;li&gt;pipでのインストール順を守らないと入らないような問題が起きにくい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ネガティブな点としては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;なんでもuv経由なのでpython的に気持ち悪い&lt;/li&gt;
&lt;li&gt;「pythonなんだけどuvコマンド」をどう説明するか悩む&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1. インストール&lt;/h3&gt;
&lt;p&gt;uvについては配布元に記載されているスクリプトによるインストールが，自身のアップデートにも対応できるのでオススメ．&lt;/p&gt;
&lt;p&gt;Windowsの場合はコマンドプロンプトまたはPowerShellで下記を実行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;ByPass&lt;/span&gt; &lt;span class="n"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;irm https://astral.sh/uv/install.ps1 | iex&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;MacやLinuxの場合&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-LsSf&lt;span class="w"&gt; &lt;/span&gt;https://astral.sh/uv/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で,WindowsやMac, Linuxで一旦そのウィンドウを閉じて再度開くとuvがパスに入った状態になる.&lt;/p&gt;
&lt;p&gt;uvは感覚としてはPython Launcherのpy.exeに近いようなもんだが,より実体が隠蔽された形式になりpython本体もuvを経由して起動することになる.&lt;/p&gt;
&lt;p&gt;例えば&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;という感じで実行すると勝手に最新版のPythonをダウンロードしてインタプリタが開く.バージョンを指定したい場合は&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12&lt;span class="w"&gt; &lt;/span&gt;python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようにオプションで指定する.&lt;/p&gt;
&lt;h3&gt;2. プロジェクトの作成とパッケージ管理&lt;/h3&gt;
&lt;p&gt;uvでの開発についてはフォルダが単位となるプロジェクトとして扱う．従来のvenvみたいなもんだが，uvが実体を一括管理してくれて各プロジェクトにはHardLinkやRefLinkやBlockClone等でディスク容量を圧迫しない仕組みになっている．&lt;/p&gt;
&lt;p&gt;例えばPython 3.12のプロジェクト pj1 を作る場合&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;pj1
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pj1
uv&lt;span class="w"&gt; &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;pin&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12
uv&lt;span class="w"&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でpyproject.tomlが作られ，3.12に固定される．パッケージの追加はuv addで行う．pipは使わない．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;numpy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とか&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;numpy&amp;gt;2.0&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とか，&lt;code&gt;pip install&lt;/code&gt;を&lt;code&gt;uv add&lt;/code&gt;に置き換えたと考えればよい．
依存関係はpyproject.tomlに保存され，実際に入ったパッケージの情報がOSに依存しないような方法でuv.lockに保存される．&lt;/p&gt;
&lt;h3&gt;3. プロジェクト内での実行&lt;/h3&gt;
&lt;h4&gt;スクリプトの実行&lt;/h4&gt;
&lt;p&gt;hello.pyを実行したい場合&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;hello.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;ipython, python, jupyterlabの実行&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;ipython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;lab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいな感じでインストールされるスクリプトもuv runできる&lt;/p&gt;
&lt;h3&gt;4. プロジェクトに特定パッケージをインストールさせずに実行&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--with package&lt;/code&gt;付きで&lt;code&gt;uv run&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uvx scriptname&lt;/code&gt;で実行(ipythonとかスクリプトが同時にインストールされるタイプのものでwithを省略できる)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;--with&lt;/code&gt;は現プロジェクトでとりあえず任意のパッケージを追加して実行してみたい場合に有効で，そのパッケージ以外はプロジェクトが使われる．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;uvx&lt;/code&gt; を使えば環境を汚さずに実行できる.これは&lt;code&gt;uvx scriptname&lt;/code&gt;が実行されたときに暗黙で&lt;code&gt;--with scriptname&lt;/code&gt;を指定する挙動になるため，重複しないコマンドが書ける．パッケージ名とスクリプト名が一致しない場合は&lt;code&gt;--from&lt;/code&gt;を書く．&lt;/p&gt;
&lt;p&gt;ということで，&lt;code&gt;uvx&lt;/code&gt;はお作法としてipythonとか&lt;code&gt;uv add&lt;/code&gt;したときに実行形式ファイルも一緒に入るタイプのものの実行に使う．ただしpythonのバージョンは指定しないと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--python&lt;/code&gt;で指定したバージョン&lt;/li&gt;
&lt;li&gt;環境変数&lt;/li&gt;
&lt;li&gt;過去にpinしたバージョン&lt;/li&gt;
&lt;li&gt;uvで使っているPythonの中で最新のもの&lt;/li&gt;
&lt;li&gt;システムのPython&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の順で決まるらしい．&lt;/p&gt;
&lt;h4&gt;インタプリタにワンライナーで命令を食わせる場合&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12&lt;span class="w"&gt; &lt;/span&gt;--with&lt;span class="w"&gt; &lt;/span&gt;numpy&lt;span class="w"&gt; &lt;/span&gt;--with&lt;span class="w"&gt; &lt;/span&gt;libsvm-official&lt;span class="w"&gt; &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;from libsvm.svmutil import *; y, x = [1,-1], [{1:1, 3:1}, {1:-1,3:-1}]; prob  = svm_problem(y, x); param = svm_parameter(&amp;#39;-t 0 -c 4 -b 1&amp;#39;); m = svm_train(prob, param)&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;numpy入りのipythonを後腐れ無く使う場合&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uvx&lt;span class="w"&gt; &lt;/span&gt;--with&lt;span class="w"&gt; &lt;/span&gt;numpy&lt;span class="w"&gt; &lt;/span&gt;ipython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;open3d入りのmarimoを後腐れなく使う場合&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uvx&lt;span class="w"&gt; &lt;/span&gt;--python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12&lt;span class="w"&gt; &lt;/span&gt;--with&lt;span class="w"&gt; &lt;/span&gt;open3d&lt;span class="w"&gt;  &lt;/span&gt;marimo&lt;span class="w"&gt; &lt;/span&gt;new
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;uvxで実行スクリプトとパッケージ名が異なる場合&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uvx&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="w"&gt; &lt;/span&gt;httpie&lt;span class="w"&gt; &lt;/span&gt;http&lt;span class="w"&gt; &lt;/span&gt;https://google.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Ultralytics yoloで推論する&lt;/h4&gt;
&lt;p&gt;Macなので device=mps と書いてるが他は削るかcuda使う&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uvx&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="w"&gt; &lt;/span&gt;ultralytics&lt;span class="w"&gt; &lt;/span&gt;yolo&lt;span class="w"&gt; &lt;/span&gt;predict&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yolo26n.pt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;show&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;True&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;ファイルサーバを立てたい場合&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uvx&lt;span class="w"&gt; &lt;/span&gt;updog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;5. プロジェクトの開発環境の複製&lt;/h3&gt;
&lt;p&gt;プロジェクト用のフォルダを作り，フォルダ内に別のプロジェクトで生成されたpyproject.tomlとuv.lockを置いて使いたいバージョンでpinしてから&lt;code&gt;uv sync&lt;/code&gt;するだけ．例えば上のpj1で作った2ファイルを用意して&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;..
mkdir&lt;span class="w"&gt; &lt;/span&gt;pj2
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pj2
uv&lt;span class="w"&gt; &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;pin&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で，何らかの手段でファイルをpj2にコピーしてから&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class="w"&gt; &lt;/span&gt;sync
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で同じ環境を作ってくれる.condaみたいにos依存のゴミも入らないのでプラットフォームに依存しない.&lt;/p&gt;
&lt;h3&gt;6. venvで作った仮想環境の移行&lt;/h3&gt;
&lt;p&gt;とりあえず捨てる前の仮想環境でactivateしておいて&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;freeze&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で使ってるパッケージのバージョン入り一覧が保存できるのでdeactivateして仮想環境のフォルダごと消して良い(パッチ当ててるときは当然その差分も取っておく)&lt;/p&gt;
&lt;p&gt;pipの継ぎ足しソースのような状態だと大抵の場合バージョン衝突が起きるので，バージョンをとっぱらって入れてしまうのが早い．クリティカルな問題がある場合は特定パッケージだけ後で指定すれば直してくれる．&lt;/p&gt;
&lt;p&gt;Windowsの場合コマンドプロンプトから&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-Command&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Get-Content requirements.txt | % { uv add ($_ -split &amp;#39;=&amp;#39;)[0] }&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mac やLinuxは&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="s1"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f1&lt;span class="w"&gt; &lt;/span&gt;requirements.txt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ただ，pipでインストール順のお陰で奇跡的に動く組合せも存在し，コケることも多々あるので，pythonのバージョンに対して明らかに古いパッケージは外した方が良い．(横着せずにひとつずつuv addすると確実)&lt;/p&gt;
&lt;h3&gt;7. クラウドストレージとの相性&lt;/h3&gt;
&lt;p&gt;uvはUV_CACHE_DIRに実体を置いてハードリンクで仮想環境の容量増加を防いでくれるが，クラウドストレージとの相性を考えるとイマイチ．
プロジェクトを作ると.venvを作ってしまうのが問題となるが回避策はある．&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dropbox: .venvフォルダに属性付与して無視させるのは可能．ただし無視させる命令より前に処理が始まるし，空のフォルダは残る&lt;/li&gt;
&lt;li&gt;Box: 無視させる機構は無し&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一番無難な解決法はクラウドストレージがシンボリックリンクを解釈できないことを利用して，予め.venvというシンボリックリンクをクラウドストレージ外に設定すること．ただし，各PC環境でリンク設定が必要．Windowsの場合でも&lt;code&gt;mklink&lt;/code&gt;かPowerShellなら&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;New-Item&lt;/span&gt; &lt;span class="n"&gt;-ItemType&lt;/span&gt; &lt;span class="n"&gt;Junction&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.venv&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-Target&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$Home\uv_envs\PJA&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようにディレクトリジャンクションを使うとよい．&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category><category term="Windows"></category><category term="uv"></category></entry><entry><title>Apple Silicon MacでWindowsアプリを使う</title><link href="https://eiichiromomma.github.io/2026/01/19/Sikarugir/" rel="alternate"></link><published>2026-01-19T07:00:00+09:00</published><updated>2026-01-19T07:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2026-01-19:/2026/01/19/Sikarugir/</id><summary type="html">&lt;p&gt;※KegworksからSikarugirになってた&lt;/p&gt;
&lt;p&gt;WindowsアプリをMacでVMを通さずに使うにはPlayOnMacとかHomebrewからのCrossover Wineとかあるようだが，Kegworksが使いやすかった。で，今度は&lt;a href="https://github.com/Sikarugir-App/Sikarugir"&gt;Sikarugir&lt;/a&gt;へ。&lt;/p&gt;
&lt;p&gt;Sikarugirは単一の互換システムにアプリケーションをぶら下げるのではなく，Windowsアプリケーションごとに.appを作成する(.appフォルダはmacOSから見たアプリケーション本体)。(Wrapperと呼ぶ)
デメリットは容量を食うところ。共通のWindowsリソースは一応共有しているが，WrapperごとにWine Engineを任意のバージョンから選べるようにした仕組みのためWine関係のファイルについては独立して.app内に置かれている。
容量としては1アプリあたり1GB+そのアプリのフ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;※KegworksからSikarugirになってた&lt;/p&gt;
&lt;p&gt;WindowsアプリをMacでVMを通さずに使うにはPlayOnMacとかHomebrewからのCrossover Wineとかあるようだが，Kegworksが使いやすかった。で，今度は&lt;a href="https://github.com/Sikarugir-App/Sikarugir"&gt;Sikarugir&lt;/a&gt;へ。&lt;/p&gt;
&lt;p&gt;Sikarugirは単一の互換システムにアプリケーションをぶら下げるのではなく，Windowsアプリケーションごとに.appを作成する(.appフォルダはmacOSから見たアプリケーション本体)。(Wrapperと呼ぶ)
デメリットは容量を食うところ。共通のWindowsリソースは一応共有しているが，WrapperごとにWine Engineを任意のバージョンから選べるようにした仕組みのためWine関係のファイルについては独立して.app内に置かれている。
容量としては1アプリあたり1GB+そのアプリのファイルと考えると良さそう。&lt;/p&gt;
&lt;p&gt;使い方の詳しい説明は&lt;a href="https://www.storange.jp/2021/11/how-to-use-wineskin.html"&gt;ここ&lt;/a&gt;に載ってるのでそちらを参照すると良い。&lt;/p&gt;
&lt;h3&gt;Sikarugirで動作確認したソフト&lt;/h3&gt;
&lt;p&gt;コツとしてはUsers以下にインストールさせると階層がややこしくなるので，基本的にAdmin権限が必要となるAll Users向けで&lt;code&gt;Program Files&lt;/code&gt;にインストールさせると良い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20200301041025/http://www.spectrum-soft.com/download/download.shtm"&gt;Micro-CAP 10(archive.org)&lt;/a&gt;: Spectrum-software社のクローズからパブリックドメイン化，Webの閉鎖という流れでarchive.orgから&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.analog.com/jp/design-center/design-tools-and-calculators/ltspice-simulator.html"&gt;LTspice&lt;/a&gt; (macOS版もあるが使いにくいのでWindows版を使いたい) ※All Usersを選び&lt;code&gt;C:/Program Files/ADI/LTspice/LTspice.exe&lt;/code&gt;を使う&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hp.giesselink.com/emu48.htm"&gt;Emu48&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hp.giesselink.com/v41.htm"&gt;V41&lt;/a&gt; (追記)&lt;/li&gt;
&lt;li&gt;Visual Studioの再頒布ファイル(Redist)が必要な場合でも一度インストールした後でWrapperアプリ上で右クリックして，"パッケージの内容を表示"で，"Sikarugir"アプリを起動してからInstall Softwareで追加インストールできる(その後もExeファイルがV41.exeのままになっていれば問題ない)&lt;/li&gt;
&lt;li&gt;キーコードがハードコードされてるプログラムで普通にキーを打っても応答しないが，何故かCmdキーを押しっぱなしだと入力できる(Wineの機能なのかは不明)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sikarugirの導入&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;upgrade
brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--cask&lt;span class="w"&gt; &lt;/span&gt;Sikarugir-App/sikarugir/sikarugir
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;上記コマンドを使いHomebrewでインストール&lt;/li&gt;
&lt;li&gt;Sikarugir Creatorがアプリケーションにあるので起動&lt;/li&gt;
&lt;li&gt;"Installed Engines"が空なので，+ボタンでWineのエンジンを追加する。押せば最新版が推奨されるのでそれをインストールする&lt;/li&gt;
&lt;li&gt;Wrapper Versionのところで"No Wrapper Installed"または"Update"が有効になっていたらそれもアップデートする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これで本体の導入は終わり。&lt;/p&gt;
&lt;h3&gt;Wrapperの作成&lt;/h3&gt;
&lt;p&gt;SikarugirはWindowsアプリをmacOSのアプリのように見せ掛けるのでWrapperと呼んでいる。先にfakejapaneseを入れないと豆腐文字のインストーラと格闘する羽目になる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sikarugirを起動&lt;/li&gt;
&lt;li&gt;"Create New Blank Wrapper"を選ぶ&lt;/li&gt;
&lt;li&gt;Create a Wrapperというウィンドウが開くので，そこに英数字で使う予定のアプリ名を書く(例えばLTspice)&lt;/li&gt;
&lt;li&gt;暫く待つとWrapper Creation Finishedと出るので自分のApplicationフォルダ(通常 /Users/unername/Application でFinderの"移動"→"ホーム"からApplicationまたは"アプリケーション")に"Sikarugir"フォルダがあるのでそれを開く&lt;/li&gt;
&lt;li&gt;3で指定した名前のアプリを開く(アイコンはSikarugirという茶色いもの)&lt;/li&gt;
&lt;li&gt;"Advanced"を選ぶ&lt;/li&gt;
&lt;li&gt;"Tools"タブを選び"Winetricks"ボタンを押す&lt;/li&gt;
&lt;li&gt;Search for packagesのところにfakejと入れるとfontsの中にfakejapaneseがあるのでチェックを入れてRun→Yesを押して暫く待つ&lt;/li&gt;
&lt;li&gt;" Winetricks Commands Finished!!"と出たらClose&lt;/li&gt;
&lt;li&gt;左下の"Install Software"を選ぶ&lt;/li&gt;
&lt;li&gt;インストーラがある場合は"Choose Setup Executable"を選ぶ。(単にzipを展開しただけで使えるソフトの場合は"Copy a Folder Inside"で良いが，フォルダ名はシンプルにした方が良さそう)&lt;/li&gt;
&lt;li&gt;最後に実行するexeファイルを聞いてくるので適切なものを選ぶ(分からない場合は片っ端から選んで"Test Run")&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;6からのカスタマイズは後からも実行可能で，Wrapperアプリ上で右クリックして，"パッケージの内容を表示"で，"Sikarugir"アプリがあるのでそれを実行する。&lt;/p&gt;
&lt;h3&gt;インストール後の設定&lt;/h3&gt;
&lt;p&gt;登録されたアプリで右クリックして内容を表示させ，Contentsの中にある.appを起動するとセットアップと同じウィンドウが開くので設定が可能&lt;/p&gt;
&lt;h4&gt;字が小さい&lt;/h4&gt;
&lt;p&gt;SikarugirのAdvancedからToolsタブで"Config Utility(winecfg)"を選び，"画面"で96dpiとなっているものを変える。今のMacだと168dpiあたりだが，ちゃんと適用されるかはアプリの仕様次第。高解像度に対応できないソフトは実用上120くらいが限度。&lt;/p&gt;
&lt;h3&gt;アプリ(Sikarugir Wrapper)を消したい&lt;/h3&gt;
&lt;p&gt;システムで重要なファイルそのものはWrapperに含まれないので，macOSのアプリと同様に単にそのアプリをゴミ箱に捨てれば良いが，ToolsメニューにUninstallerがあるので恐らくそれを使った方がマナーは良いかも知れない。&lt;/p&gt;
&lt;h4&gt;アイコンを変えたい場合&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://github.com/jlu5/icoextract"&gt;icoextract&lt;/a&gt;みたいなexeやdllからアイコンを引っこ抜くツールを使えば変更可能だが，リバースエンジニアリングの類な気もするので要注意。&lt;/p&gt;</content><category term="Memo"></category><category term="Windows"></category><category term="Apple Silicon"></category><category term="mac"></category><category term="Micro-CAP"></category><category term="LTspice"></category><category term="Wine"></category><category term="Sikarugir"></category></entry><entry><title>Google Cloud Shellの日本語化(gcc+デバッグ込み) 2025版</title><link href="https://eiichiromomma.github.io/2025/07/30/CloudShellEditor2025/" rel="alternate"></link><published>2025-07-30T22:20:00+09:00</published><updated>2025-07-30T22:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2025-07-30:/2025/07/30/CloudShellEditor2025/</id><summary type="html">&lt;p&gt;Webブラウザ上でコーディングとshellによる操作が可能な&lt;a href="https://ide.cloud.google.com/?hl=ja"&gt;Cloud Shell Editor&lt;/a&gt;がとても便利。
ただし&lt;a href="https://cloud.google.com/shell/docs/quotas-limits?hl=ja"&gt;50時間/週の制限&lt;/a&gt;がある。&lt;/p&gt;
&lt;p&gt;三の字のアイコンからTerminal-&amp;gt;new terminalでターミナルを開く。&lt;/p&gt;
&lt;p&gt;機能的にはエディタはVS Codeの拡張機能組込み版みたいな感じで，Shellの方はUbuntu 24.04が動いている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Webブラウザ上でコーディングとshellによる操作が可能な&lt;a href="https://ide.cloud.google.com/?hl=ja"&gt;Cloud Shell Editor&lt;/a&gt;がとても便利。
ただし&lt;a href="https://cloud.google.com/shell/docs/quotas-limits?hl=ja"&gt;50時間/週の制限&lt;/a&gt;がある。&lt;/p&gt;
&lt;p&gt;三の字のアイコンからTerminal-&amp;gt;new terminalでターミナルを開く。&lt;/p&gt;
&lt;p&gt;機能的にはエディタはVS Codeの拡張機能組込み版みたいな感じで，Shellの方はUbuntu 24.04が動いている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/issue
Ubuntu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt;.04.2&lt;span class="w"&gt; &lt;/span&gt;LTS&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ただし，どちらも日本語は表示は可能でもメニュー等は英語のまま。せめてShellのメッセージやmanを日本語化しようということで，Ubuntuの日本語化の方法を一通り実行。&lt;/p&gt;
&lt;h3&gt;確認作業&lt;/h3&gt;
&lt;p&gt;ここで説明している作業を実施しても，セッションが切れると環境がリセットされるが，短時間ブラウザを閉じた程度だと継続してくれている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;locale&lt;span class="w"&gt; &lt;/span&gt;-a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とやって&lt;code&gt;ja_JP.utf-8&lt;/code&gt;が存在していれば作業不要だが，入ってない。&lt;/p&gt;
&lt;h3&gt;日本語化&lt;/h3&gt;
&lt;p&gt;以下を1行ずつコピペする&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo &amp;#39;ja_JP.UTF-8 UTF-8&amp;#39; &amp;gt;&amp;gt;  /etc/locale.gen&amp;quot;&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;locale-gen
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;task-japanese&lt;span class="w"&gt; &lt;/span&gt;-y
wget&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;https://github.com/gcc-mirror/gcc/raw/releases/gcc-13/gcc/po/ja.po
msgfmt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;ja.po
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;/usr/share/locale/ja/LC_MESSAGES/gcc-13.mo
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export LANG=ja_JP.utf-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;わかりやすいかは疑問だが英語で思考停止する人には良い。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20240605-cse.png" width="600"&gt;&lt;/p&gt;
&lt;h4&gt;分けて説明&lt;/h4&gt;
&lt;p&gt;localeとしてja_JP.utf-8が有効になっていないので&lt;code&gt;/etc/locale.gen&lt;/code&gt;ファイルに追記し，locale-genで生成する。あとtask-japaneseは日本語manとか。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo &amp;#39;ja_JP.UTF-8 UTF-8&amp;#39; &amp;gt;&amp;gt;  /etc/locale.gen&amp;quot;&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;locale-gen
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;task-japanese&lt;span class="w"&gt; &lt;/span&gt;-y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;gccの.moファイル(メッセージのローカライゼーションファイル)が無いのでgccのソースミラーから拾って生成する。moファイルは実体と一致しないとダメなので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/gcc
/usr/bin/gcc:&lt;span class="w"&gt; &lt;/span&gt;symbolic&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;gcc-13
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で出てきたgcc-11に合わせている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;https://github.com/gcc-mirror/gcc/raw/releases/gcc-13/gcc/po/ja.po
msgfmt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;ja.po
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;/usr/share/locale/ja/LC_MESSAGES/gcc-13.mo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;シェルを開いたときにja_JP.utf-8が環境変数LANGになるよう設定して読み込み&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export LANG=ja_JP.utf-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;デバッガ&lt;/h3&gt;
&lt;p&gt;拡張機能にExtension Pack for C/C++がある。これを入れるとデバッガ拡張だけ入るので，launch.jsonでデバッガが使える。自動ビルドは出来ない。&lt;/p&gt;
&lt;p&gt;まず，「ファイル」アイコンからOpen Folderを選んでファイル置き場を開く。次にエディタで.cなファイルを開いた状態で，"Run"-&amp;gt;"Add Configuration"で勝手にlaunch.jsonが出来るが以下のような内容にする。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Use IntelliSense to learn about possible attributes.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Hover to view descriptions of existing attributes.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0.2.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;configurations&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;C/C++ Debug (gdb Launch)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cppdbg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;request&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;launch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;program&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${fileDirname}/${fileBasenameNoExtension}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;stopAtEntry&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;cwd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${workspaceFolder}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;environment&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;MIMode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gdb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;setupCommands&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Enable pretty-printing for gdb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-enable-pretty-printing&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ignoreFailures&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;コンパイルするときにソースと同じ名称のプログラムを&lt;code&gt;-g&lt;/code&gt;オプション付きでコンパイルする必要がある。たとえばhelloworld.cだったら&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gcc&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;helloworld.c&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;helloworld
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;あとは左のデバッグアイコンを選び，ブレークポイントを設定しておけば▶C/C++ Debugでデバッガが動く。&lt;/p&gt;</content><category term="Memo"></category><category term="C"></category><category term="Lecture"></category><category term="Debian"></category><category term="gcc"></category></entry><entry><title>M1 MacでWindowsアプリを使う</title><link href="https://eiichiromomma.github.io/2025/04/18/Keworks/" rel="alternate"></link><published>2025-04-18T22:00:00+09:00</published><updated>2025-04-18T22:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2025-04-18:/2025/04/18/Keworks/</id><summary type="html">&lt;p&gt;※WineskinServerが知らぬ間にKegworksになってた&lt;/p&gt;
&lt;p&gt;PlayOnMacとかHomebrewからのCrossover Wineとかあるようだが、&lt;a href="https://github.com/Kegworks-App/Kegworks"&gt;Kegworks&lt;/a&gt;が使いやすかった。
講義で示すような用途の場合は&lt;a href="https://mac.getutm.app/"&gt;UTM&lt;/a&gt; とか &lt;a href="https://www.parallels.com/jp/"&gt;Parallels&lt;/a&gt;の仮想マシンで、とりあえず単発で動けばラッ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;※WineskinServerが知らぬ間にKegworksになってた&lt;/p&gt;
&lt;p&gt;PlayOnMacとかHomebrewからのCrossover Wineとかあるようだが、&lt;a href="https://github.com/Kegworks-App/Kegworks"&gt;Kegworks&lt;/a&gt;が使いやすかった。
講義で示すような用途の場合は&lt;a href="https://mac.getutm.app/"&gt;UTM&lt;/a&gt; とか &lt;a href="https://www.parallels.com/jp/"&gt;Parallels&lt;/a&gt;の仮想マシンで、とりあえず単発で動けばラッキー程度ならWineという感じになる。Wineは仮想マシンではなく、Windowsと互換性を持つシステムを作ったもので対応外のアプリも多数あるし日本語の表示も微妙だったりするのでハードルは高い。&lt;/p&gt;
&lt;p&gt;Kegworksは単一の互換システムにアプリケーションをぶら下げるのではなく、Windowsアプリケーションごとに.appを作成する(.appフォルダはmacOSから見たアプリケーション本体)。(Wrapperと呼ぶ)
デメリットは容量を食うところ。共通のWindowsリソースは一応共有しているが、WrapperごとにWine Engineを任意のバージョンから選べるようにした仕組みのためWine関係のファイルについては独立して.app内に置かれている。
容量としては1アプリあたり1GB+そのアプリのファイルと考えると良さそう。&lt;/p&gt;
&lt;p&gt;使い方の詳しい説明は&lt;a href="https://www.storange.jp/2021/11/how-to-use-wineskin.html"&gt;ここ&lt;/a&gt;に載ってるのでそちらを参照すると良い。&lt;/p&gt;
&lt;h3&gt;Kegworksで動作確認したソフト&lt;/h3&gt;
&lt;p&gt;コツとしてはUsers以下にインストールさせると階層がややこしくなるので，基本的にAdmin権限が必要となるAll Users向けで&lt;code&gt;Program Files&lt;/code&gt;にインストールさせると良い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.spectrum-soft.com/download/download.shtm"&gt;Micro-CAP 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.analog.com/jp/design-center/design-tools-and-calculators/ltspice-simulator.html"&gt;LTspice&lt;/a&gt; (macOS版もあるが使いにくいのでWindows版を使いたい) ※All Usersを選び&lt;code&gt;C:/Program Files/ADI/LTspice/LTspice.exe&lt;/code&gt;を使う&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hp.giesselink.com/emu48.htm"&gt;Emu48&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hp.giesselink.com/v41.htm"&gt;V41&lt;/a&gt; (追記)&lt;/li&gt;
&lt;li&gt;Visual Studioの再頒布ファイル(Redist)が必要な場合でも一度インストールした後でWrapperアプリ上で右クリックして、"パッケージの内容を表示"で、"Wineskin"アプリを起動してからInstall Softwareで追加インストールできる(その後もExeファイルがV41.exeのままになっていれば問題ない)&lt;/li&gt;
&lt;li&gt;キーコードがハードコードされてるプログラムで普通にキーを打っても応答しないが，何故かCmdキーを押しっぱなしだと入力できる(Wineの機能なのかは不明)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Kegworksの導入&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Homebrewでインストール&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;upgrade
brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--cask&lt;span class="w"&gt; &lt;/span&gt;--no-quarantine&lt;span class="w"&gt; &lt;/span&gt;Kegworks-App/kegworks/kegworks
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Kegworks Wineryがアプリケーションにあるので起動&lt;/li&gt;
&lt;li&gt;"Installed Engines"が空なので、+ボタンでWineのエンジンを追加する。押せば最新版が推奨されるのでそれをインストールする&lt;/li&gt;
&lt;li&gt;Wrapper Versionのところで"Update"が有効になっていたらそれもアップデートする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これで本体の導入は終わり。&lt;/p&gt;
&lt;h3&gt;Wrapperの作成&lt;/h3&gt;
&lt;p&gt;KegworksはWindowsアプリをmacOSのアプリのように見せ掛けるのでWrapperと呼んでいる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kegworks Wineryを起動&lt;/li&gt;
&lt;li&gt;"Create New Blank Wrapper"を選ぶ&lt;/li&gt;
&lt;li&gt;Create a Wrapperというウィンドウが開くので、そこに英数字で使う予定のアプリ名を書く(例えばLTspice)&lt;/li&gt;
&lt;li&gt;暫く待つとWrapper Creation Finishedと出るので自分のApplicationフォルダ(通常 /Users/unername/Application でFinderの"移動"→"ホーム"からApplicationまたは"アプリケーション")に"Kegworks"フォルダがあるのでそれを開く&lt;/li&gt;
&lt;li&gt;3で指定した名前のアプリを開く(アイコンはKegworksという茶色いもの)&lt;/li&gt;
&lt;li&gt;"Advanced"を選ぶ&lt;/li&gt;
&lt;li&gt;"Tools"タブを選び"Winetricks"ボタンを押す&lt;/li&gt;
&lt;li&gt;Search for packagesのところにfakejと入れるとfontsの中にfakejapaneseがあるのでチェックを入れてRun→Yesを押して暫く待つ&lt;/li&gt;
&lt;li&gt;" Winetricks Commands Finished!!"と出たらClose&lt;/li&gt;
&lt;li&gt;左下の"Install Software"を選ぶ&lt;/li&gt;
&lt;li&gt;インストーラがある場合は"Choose Setup Executable"を選ぶ。(単にzipを展開しただけで使えるソフトの場合は"Copy a Folder Inside"で良いが、フォルダ名はシンプルにした方が良さそう)&lt;/li&gt;
&lt;li&gt;最後に実行するexeファイルを聞いてくるので適切なものを選ぶ(分からない場合は片っ端から選んで"Test Run")&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;6からのカスタマイズは後からも実行可能で、Wrapperアプリ上で右クリックして、"パッケージの内容を表示"で、"Kegworks"アプリがあるのでそれを実行する。&lt;/p&gt;
&lt;h3&gt;字が小さい&lt;/h3&gt;
&lt;p&gt;KegworksのAdvancedからToolsタブで"Config Utility(winecfg)"を選び、"画面"で96dpiとなっているものを変える。今のMacだと168dpiあたりだが、ちゃんと適用されるかはアプリの仕様次第。&lt;/p&gt;
&lt;h3&gt;アプリ(Kegworks Wrapper)を消したい&lt;/h3&gt;
&lt;p&gt;システムで重要なファイルそのものはWrapperに含まれないので、macOSのアプリと同様に単にそのアプリをゴミ箱に捨てれば良いが、ToolsメニューにUninstallerがあるので恐らくそれを使った方がマナーは良いかも知れない。&lt;/p&gt;
&lt;h3&gt;アイコンを変えたい場合&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/jlu5/icoextract"&gt;icoextract&lt;/a&gt;みたいなexeやdllからアイコンを引っこ抜くツールを使えば変更可能だが、リバースエンジニアリングの類な気もするので要注意。&lt;/p&gt;</content><category term="Memo"></category><category term="Windows"></category><category term="Apple Silicon"></category><category term="M1 mac"></category><category term="Micro-CAP"></category><category term="LTspice"></category><category term="Wine"></category><category term="Kegworks"></category></entry><entry><title>PythonとMaixSense A010</title><link href="https://eiichiromomma.github.io/2024/07/13/MetaSense/" rel="alternate"></link><published>2024-07-13T19:20:00+09:00</published><updated>2024-07-13T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2024-07-13:/2024/07/13/MetaSense/</id><summary type="html">&lt;h3&gt;MaixSense A010 ToFセンサーの続き&lt;/h3&gt;
&lt;p&gt;ROS2で使ってみた&lt;a href="https://www.marutsu.co.jp/pc/i/43360161/"&gt;マルツで売ってる格安100x100 ToF&lt;/a&gt; (Switch Scienceは売り切れ)を今度はPythonで動かす。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.sipeed.com/hardware/en/maixsense/maixsense-a010/maixsense-a010.html"&gt;技術情報&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.sipeed.com/hardware/en/maixsense/maixsense-a010/at_command_en.html"&gt;ATコマンド一覧と説明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;技術情報のページにある&lt;a href="https://dl.sipeed.com/shareURL/others/maixsense_example"&gt;キーボードを使ったデモ …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h3&gt;MaixSense A010 ToFセンサーの続き&lt;/h3&gt;
&lt;p&gt;ROS2で使ってみた&lt;a href="https://www.marutsu.co.jp/pc/i/43360161/"&gt;マルツで売ってる格安100x100 ToF&lt;/a&gt; (Switch Scienceは売り切れ)を今度はPythonで動かす。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.sipeed.com/hardware/en/maixsense/maixsense-a010/maixsense-a010.html"&gt;技術情報&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.sipeed.com/hardware/en/maixsense/maixsense-a010/at_command_en.html"&gt;ATコマンド一覧と説明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;技術情報のページにある&lt;a href="https://dl.sipeed.com/shareURL/others/maixsense_example"&gt;キーボードを使ったデモのソース&lt;/a&gt;(maixsense-010-20220909-examples.zipにmetasense.pyとutils.pyが含まれる)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;仕様的にPySerialでATコマンドを送れば使えて，実際&lt;a href="https://elchika.com/article/fa84cf5a-54de-4f38-be1f-c12370960a45/"&gt;そうやってるサンプル&lt;/a&gt;もネットに存在する。&lt;/p&gt;
&lt;p&gt;もうちょいMaixSense周りの処理は簡単に表現してに使いたいと思ったら，&lt;a href="https://youtu.be/CPq58z2kVi8?si=J4qk5VMN4mzRyqg9"&gt;手のトラッキングのデモ&lt;/a&gt;があった。
そのソースは&lt;a href="https://github.com/jumejume1/Python-hand-detect"&gt;Python-hand-detect&lt;/a&gt;で公開されていてmediapipeにDepthを渡している。&lt;/p&gt;
&lt;p&gt;ソースを見ると&lt;code&gt;from metasense import MetaSense&lt;/code&gt;とあるものの，pypiにもcondaにも存在せず。上のキーボードを使ったデモのソースに含まれていた。これが正式な配布なのか不明。&lt;/p&gt;
&lt;p&gt;pyserialは必要なので入れておく。
上記のキーボードを使ったデモのソースに含まれる，utils.pyとmetasense.pyを一緒に置いて実行する。
LCDやUARTに出すか出さないかで安定度がだいぶ変わる。&lt;/p&gt;
&lt;p&gt;USBのみ出力にしておけば実測はしてないが&lt;a href="https://youtu.be/BpySY99Kixg"&gt;FPS=19でヌルヌル動く&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20240713A010Unit9.png" width="200"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cv2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;metasense&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MetaSense&lt;/span&gt;

&lt;span class="n"&gt;COM_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/dev/tty.usbserial-202206_E8C25B0&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;BASE_BARTRATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;115200&lt;/span&gt;

&lt;span class="c1"&gt;# sendCmdはちゃんとsleepで待つと有効&lt;/span&gt;
&lt;span class="c1"&gt;# 速いFPSを使いたい場合はDISPを絞る&lt;/span&gt;
&lt;span class="c1"&gt;# DISP=2: USBのみ (FPS=19でヌルヌル動く)&lt;/span&gt;
&lt;span class="c1"&gt;# DISP=3: USBとLCD (FPS=5くらいにしないと途中で固まる)&lt;/span&gt;
&lt;span class="c1"&gt;# UNITは1-9のときは UNIT mm刻みの画素値(1なら255で255mm)&lt;/span&gt;
&lt;span class="c1"&gt;# UNITは10まで良いと書いてあるが10にすると0の挙動になる&lt;/span&gt;
&lt;span class="c1"&gt;# UNIT=0のときは可視化重視モードでToFが近場の解像度が良いことから5.1*sqrt(x)らしい&lt;/span&gt;
&lt;span class="n"&gt;QUANTIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="c1"&gt;# mm が 濃度値1&lt;/span&gt;
&lt;span class="n"&gt;DISP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;FPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# init metasense&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;metasense&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MetaSense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;COM_PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BASE_BARTRATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;metasense&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_open&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="n"&gt;metasense&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;metasense&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendCmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AT+DISP=&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DISP&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;metasense&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendCmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AT+UNIT=&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QUANTIZE&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;metasense&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendCmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AT+FPS=&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FPS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metasense&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tof_data_queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;frame_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;frameID&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;frame_res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;res&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;frame_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;frameData&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# Depth&lt;/span&gt;
            &lt;span class="n"&gt;frame_data0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;frameData&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 疑似カラー用&lt;/span&gt;

            &lt;span class="n"&gt;frame_img0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_data0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;frame_img0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_img0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;frame_img0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;applyColorMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_img0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLORMAP_JET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# 濃度値100より遠いのは0 (UNIT=0のときは (th/5.1)^2 で，th=100で384mm)&lt;/span&gt;
            &lt;span class="c1"&gt;# UNIT:1-9のときは th*UNIT mm&lt;/span&gt;
            &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;frame_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="c1"&gt;# convert frame data to image&lt;/span&gt;
            &lt;span class="n"&gt;frame_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="c1"&gt;# rotate image 180 degree&lt;/span&gt;
            &lt;span class="n"&gt;frame_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;color_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;applyColorMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLORMAP_JET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;th_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;frame_img0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_img0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame_res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;frame0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame_img0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;th&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;th_img&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;waitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;metasense&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;terminate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Wiki"></category><category term="Python"></category></entry><entry><title>Apple SiliconなマシンでROS2</title><link href="https://eiichiromomma.github.io/2024/07/10/AppleSiliconROS2/" rel="alternate"></link><published>2024-07-10T21:20:00+09:00</published><updated>2024-07-10T21:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2024-07-10:/2024/07/10/AppleSiliconROS2/</id><summary type="html">&lt;p&gt;なんやかんやでROS2をmacOSで使えた方が便利なので導入してみる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20240710AppleSiliconROS2-01.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;基本的には&lt;a href="https://github.com/TakanoTaiga/ros2_m1_native/blob/master/install_guide.md"&gt;ここの手順&lt;/a&gt;なのだが&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SIPは無効にしなくてもとりあえずは動く(?)&lt;/li&gt;
&lt;li&gt;python3はHomebrewに限らず3.12を入れてるとハマるが3.11ならvenvでも問題なし&lt;/li&gt;
&lt;li&gt;/usr/local/libに余計なx86_64なdylibがあるとそっちを拾ってくるのでM1登場初期にbrew86を運用していた人は全部消した方が良い&lt;/li&gt;
&lt;li&gt;途中でよくわからんがfastcdrでコケるがbuildの中に入ってmake installして再度workspaceのビルドをかけると通る&lt;/li&gt;
&lt;li&gt;ここで入らないros2関係のインストールはたぶん苦行(cv_bridgeも諦めた …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;なんやかんやでROS2をmacOSで使えた方が便利なので導入してみる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20240710AppleSiliconROS2-01.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;基本的には&lt;a href="https://github.com/TakanoTaiga/ros2_m1_native/blob/master/install_guide.md"&gt;ここの手順&lt;/a&gt;なのだが&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SIPは無効にしなくてもとりあえずは動く(?)&lt;/li&gt;
&lt;li&gt;python3はHomebrewに限らず3.12を入れてるとハマるが3.11ならvenvでも問題なし&lt;/li&gt;
&lt;li&gt;/usr/local/libに余計なx86_64なdylibがあるとそっちを拾ってくるのでM1登場初期にbrew86を運用していた人は全部消した方が良い&lt;/li&gt;
&lt;li&gt;途中でよくわからんがfastcdrでコケるがbuildの中に入ってmake installして再度workspaceのビルドをかけると通る&lt;/li&gt;
&lt;li&gt;ここで入らないros2関係のインストールはたぶん苦行(cv_bridgeも諦めた)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみにhomebrewでpython3.12を消すとvimが使えなくなる(大損害)。問題なのはCMakeが呼ばれたとき(見境なくPython3.12を拾ってくる)なので，ビューワとかトピック監視用途とかで割り切ってしまうか，colcon buildの度に3.12とQt6を消せばたぶん使える。&lt;/p&gt;
&lt;p&gt;ビルドの最中何度かコケるが&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build/fastcdr
make
make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;../fastrtps
make&lt;span class="w"&gt; &lt;/span&gt;-j8
make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;../..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でまたビルドのコマンドを投げると通る。&lt;/p&gt;
&lt;p&gt;あとrosbag2_pyの&lt;code&gt;src/ros2/rosbag2/rosbag2_py/src/rosbag2_py/_reader.cpp&lt;/code&gt;でコケるが&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb nb-Type"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rosbag2_storage&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;StorageOptions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;storage_options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rosbag2_cpp&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ConverterOptions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;converter_options&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rosbag2_cpp&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ConverterOptions&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;reader_&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;storage_options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;converter_options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようにconstを追加すると通る。&lt;/p&gt;
&lt;p&gt;で，一通り入るがGazeboは別。あとcv_bridgeをビルドしようとするとOpenCV-&amp;gt;boost-python(homebrewはpython3.12用)と芋蔓式に面倒臭さが増えていくので諦める。&lt;/p&gt;
&lt;p&gt;ROS_MASTER_URIとROS_IPさえちゃんと設定しておけばRaspberry Pi OSで&lt;a href="https://wiki.sipeed.com/hardware/en/maixsense/maixsense-a010/maixsense-a010.html"&gt;MaixSense A010&lt;/a&gt;なる100x100のToF Depthカメラでpublishしてるのを受け取れた。&lt;/p&gt;
&lt;p&gt;(ドキュメントにあるようにtopicで追加でPointCloud2とかImageとかでTFをtofにする)&lt;/p&gt;</content><category term="Wiki"></category><category term="ROS2"></category><category term="Apple Silicon"></category></entry><entry><title>NumPy 2.0</title><link href="https://eiichiromomma.github.io/2024/06/19/NumPy2/" rel="alternate"></link><published>2024-06-19T20:20:00+09:00</published><updated>2024-06-19T20:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2024-06-19:/2024/06/19/NumPy2/</id><summary type="html">&lt;h3&gt;NumPy 2.0の混入&lt;/h3&gt;
&lt;p&gt;2024-6-17にNumPy2.0がリリースされたらしく，その前後でpipでのデフォルトバージョンが2.0に置き換わった模様。
依存関係でインストールされる場合にも2.0が適用されるので，今迄動いていた環境をpip -r で再構築しよ …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;NumPy 2.0の混入&lt;/h3&gt;
&lt;p&gt;2024-6-17にNumPy2.0がリリースされたらしく，その前後でpipでのデフォルトバージョンが2.0に置き換わった模様。
依存関係でインストールされる場合にも2.0が適用されるので，今迄動いていた環境をpip -r で再構築しようとしたときにNumPyのバージョン指定をしていないと確実に動かない状況で，インストール時にNumPyって2だっけか?と思って気付いて助かった。
当面は&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;numpy&amp;lt;2&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とした方が良さそう。&lt;/p&gt;</content><category term="Wiki"></category><category term="Python"></category></entry><entry><title>WindowsでのオススメのPython環境 2024版</title><link href="https://eiichiromomma.github.io/2024/06/05/WinPython2024/" rel="alternate"></link><published>2024-06-05T20:20:00+09:00</published><updated>2024-06-05T20:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2024-06-05:/2024/06/05/WinPython2024/</id><summary type="html">&lt;p&gt;普通に&lt;a href="https://www.python.org/"&gt;Python.org&lt;/a&gt;からダウンロードして入れましょうという話。&lt;/p&gt;
&lt;p&gt;これまでオススメのPython環境はAnacondaだったもののNavigatorでトラブルが発生するとかなり面倒だったり，condaがいつまでたっても依存関係を解決してくれなかったりとイマイチな状況が増えてきたのと，結局のところpip使わないで済むことは無いのでcondaではなくpipで統一してしまった方が楽だというのが動機で&lt;code&gt;py.exe&lt;/code&gt;の存在が決 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;普通に&lt;a href="https://www.python.org/"&gt;Python.org&lt;/a&gt;からダウンロードして入れましょうという話。&lt;/p&gt;
&lt;p&gt;これまでオススメのPython環境はAnacondaだったもののNavigatorでトラブルが発生するとかなり面倒だったり，condaがいつまでたっても依存関係を解決してくれなかったりとイマイチな状況が増えてきたのと，結局のところpip使わないで済むことは無いのでcondaではなくpipで統一してしまった方が楽だというのが動機で&lt;code&gt;py.exe&lt;/code&gt;の存在が決定的。macOSでもAnacondaではなく標準+pyenv+venvになってる。&lt;/p&gt;
&lt;h3&gt;1. Pythonのインストール&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.python.org/downloads/windows/"&gt;公式の配布サイト&lt;/a&gt;から3.11.xをダウンロードして実行。&lt;/p&gt;
&lt;p&gt;インストーラの画面は特に弄らずそのままInstall Nowを選ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython01.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;"Setup was successful"と出たらインストール完了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython02.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;そのウィンドウに&lt;em&gt;Disable path length limit&lt;/em&gt;という表示があったらそれを選択する。Windowsに限らず環境変数PATHという概念があり，そこに羅列したフォルダ内のプログラムはどこからでも呼び出せる，というOSの仕組みがある。macOSやUnixは問題ないのだが，Windowsは&lt;code&gt;C:\Program Files&lt;/code&gt;または&lt;code&gt;C:\Program Files(x86)&lt;/code&gt;みたいなアホ長いフォルダが標準的なインストール先なのでPATHに羅列しようとすると凄まじい長さになるのが明白にもかかわらず，環境変数に設定できるのが260文字までというアホな制限がある。それを回避する方法がこの選択肢。&lt;/p&gt;
&lt;p&gt;Windowsメニューの「すべてのアプリ」にPythonフォルダが出来ている。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython03.png" width="400"&gt;&lt;/p&gt;
&lt;p&gt;黒っぽいアイコンの&lt;code&gt;Python 3.xx(64-bit)&lt;/code&gt;を選ぶとコマンドプロンプトの黒い画面が開き&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような入力待ち(プロンプトと呼ぶ)になるので&lt;code&gt;quit()&lt;/code&gt;と打って一旦終了させる。&lt;/p&gt;
&lt;h3&gt;2. パッケージのインストール&lt;/h3&gt;
&lt;p&gt;Windowsメニューの検索にcmdと打ってコマンドプロンプトを起動する。&lt;/p&gt;
&lt;h4&gt;pipのアップグレード&lt;/h4&gt;
&lt;p&gt;Pythonのインストール時にpy.exeというプログラムもインストールされていて，自動的に「今使うPython」を呼び出す仕組みになっている。Pythonはパッケージ(機能)を呼び出すときに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python -m パッケージ名 パッケージのオプション
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とするか，パッケージによっては&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;パッケージ名 パッケージのオプション
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような感じで起動するのだが，後者はWindowsだと手間のかかるPathの設定が必要なので，py.exeと前者を組み合わせて使う。例えばよく&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install -U pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と実行しろと説明しているサイトが多いが，「パッケージ管理のpipを使ってpip自身をアップグレード(-U)しろ」というコマンドは&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m pip install -U pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と書く(.exeは付けなくて良い)。ということでまずは↑のコマンドをコマンドプロンプトで実行してpipをアップグレードする&lt;/p&gt;
&lt;h4&gt;基本環境の作成 (venv)&lt;/h4&gt;
&lt;p&gt;Pythonのパッケージでインストールするもののなかで，&lt;code&gt;py ナントカ&lt;/code&gt;ではなく&lt;code&gt;ナントカ&lt;/code&gt;のようにコマンドとしてインストールされるものもあるが，それを有効にするには&lt;code&gt;C:\Users\username\AppData\Local\Programs\Python\Python311\Scripts&lt;/code&gt;のような環境依存の場所へのPathの設定が必要になる。その代わりにvenvで基本環境も仮想環境として作成してしまう。&lt;/p&gt;
&lt;p&gt;ここではAnacondaを真似てbaseにすると紛らわしいのでdefaultという名前の仮想環境を作る。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m venv default
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;以後，Pythonを使うときにはコマンドプロンプトを開き&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;default\Scripts\activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;を必ず実行してから使う。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(default) C:\Users\username&amp;gt;&lt;/code&gt;みたいなプロンプトになる。
これの利点はactivateを実行するとその仮想環境のScriptsにPathが通ることで，たとえばipythonをインストールした後で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m IPython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とせずに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ipython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で起動できる。※まだインストールしてない
(ipythonがScriptsにインストールされる)&lt;/p&gt;
&lt;h4&gt;無難なパッケージのインストール&lt;/h4&gt;
&lt;p&gt;何をやるにしろあった方が便利なものを一通り入れておく。コマンドプロンプトに以下をコピペする。(^は長いコマンドに途中改行させる方法)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m pip install jupyter notebook ipython opencv-python ^
 opencv-contrib-python numpy scipy scikit-image scikit-learn ^
 pillow pandas matplotlib seaborn mediapy pyqt5 ^
 qtconsole jupyterlab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;ipython: 普通のpythonより親切なPythonインタプリタIPython&lt;/li&gt;
&lt;li&gt;jupyter: NotebookとLabで使うエンジン&lt;/li&gt;
&lt;li&gt;jupyterlab: Jupyter Lab。MATLABっぽいNotebook+コマンド+インタプリタな何でもあり版な開発環境&lt;/li&gt;
&lt;li&gt;matplotlib: グラフや画像の表示に使う可視化&lt;/li&gt;
&lt;li&gt;mediapy: Notebookで画像や動画を楽に表示できる&lt;/li&gt;
&lt;li&gt;notebook: Jupyter Notebookというブラウザベースで動くPythonの開発環境(ノートを取りながらPythonを実行できるので人気)&lt;/li&gt;
&lt;li&gt;numpy: 行列演算ライブラリ&lt;/li&gt;
&lt;li&gt;opencv-python: コンピュータビジョンライブラリOpenCV&lt;/li&gt;
&lt;li&gt;opencv-contrib-python: OpenCVの正式版には含まれていない機能の追加&lt;/li&gt;
&lt;li&gt;scipy: 科学技術系ライブラリ&lt;/li&gt;
&lt;li&gt;scikit-image: SciPy toolkit=scikitでscipyのサブモジュールの一つで画像処理関係&lt;/li&gt;
&lt;li&gt;scikit-learn: scipyのサブモジュールの一つで機械学習関係&lt;/li&gt;
&lt;li&gt;pandas: データ解析でR言語っぽい動きをする&lt;/li&gt;
&lt;li&gt;pillow: PIL(Python Imaging Library)という古くからある画像処理ライブラリから派生した現代版で呼び出しはPILとして互換性が保てる&lt;/li&gt;
&lt;li&gt;pyqt5: Qt(キュート(Cute)と読む)のPython版でなぜかパイキューティーと読まれる。GUIアプリのベースとなるものでqtconsoleで使う&lt;/li&gt;
&lt;li&gt;qtconsole: コマンドプロンプトでもIPythonは使えるが，こっちだと画像が表示できる。&lt;/li&gt;
&lt;li&gt;seaborn: 可視化でmatplotlibよりダサくない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;が入れるもの。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;default\Scripts&lt;/code&gt;フォルダには下記がインストールされる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;Users&lt;/span&gt;\&lt;span class="n"&gt;username&lt;/span&gt;\&lt;span class="n"&gt;default&lt;/span&gt;\&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;のディレクトリ&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bat&lt;/span&gt;
&lt;span class="n"&gt;Activate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ps1&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="n"&gt;deactivate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bat&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="n"&gt;f2py&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;fonttools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="n"&gt;imageio_download_bin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;imageio_remove_bin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;ipython&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;ipython3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="n"&gt;jlpm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;jsonpointer&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;jsonschema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dejavu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;kernelspec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;labextension&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;labhub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nbconvert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;notebook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;qtconsole&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;troubleshoot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;trust&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;lsm2bin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;normalizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;pip3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;11.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;pip3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;pybabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;pyftmerge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="n"&gt;pyftsubset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="n"&gt;pygmentize&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="n"&gt;pyjson5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;pylupdate5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="n"&gt;pyrcc5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="n"&gt;pythonw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;pyuic5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="n"&gt;pywin32_postinstall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;pywin32_testall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;qtpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;send2trash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="n"&gt;tiff2fsspec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;tiffcomment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;tifffile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;ttx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;wsdump&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;__pycache__&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pip, ipython,jupyter-*あたりがよく使いそうなもの。&lt;/p&gt;
&lt;h3&gt;3. IPythonを使ってみる&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ipython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で起動する。exit, quitで終了できる(標準のインタプリタと異なり括弧()が要らない)&lt;/p&gt;
&lt;p&gt;ちなみに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m IPython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようにPythonのモジュールとしてインストールされるものはScripts内のコマンドを使わなくてもpyに-mを付けてモジュール名を指定すれば使える(quitで終了)&lt;/p&gt;
&lt;h4&gt;%edit とエディタの変更&lt;/h4&gt;
&lt;p&gt;IPythonで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;edit&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のように&lt;code&gt;%edit&lt;/code&gt;の後にファイル名を付けるとMagicコマンドでエディタが起動して，エディタを閉じるとそのファイルが実行される。
デフォルトはnotepad(メモ帳)で微妙な使い心地なので変更したい場合は下記のようにする。&lt;/p&gt;
&lt;p&gt;Windowsメニューから使いたいエディタのアイコンを右クリックして「詳細」→「ファイルの場所を開く」を選ぶ。ショートカットが置かれた場所のエクスプローラーが開くので，そのアイコンを右クリックして「プロパティ」を選ぶ。「リンク先」をコピーしておく。&lt;/p&gt;
&lt;p&gt;コマンドプロンプトで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ipython profile create
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打つと&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ProfileCreate&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Generating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;file&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WindowsPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C:/Users/username/.ipython/profile_default/ipython_config.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ProfileCreate&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Generating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;file&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WindowsPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C:/Users/username/.ipython/profile_default/ipython_kernel_config.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と表示されるので最初の方を編集する。これもコマンドプロンプトで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;notepad .ipython\profile_default\ipython_config.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打つ。するとIPythonの設定ファイルが開くので，editorという単語を検索する。このファイルは#が先頭にあるとコメントアウトされた状態なので，そこを編集する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# c.TerminalInteractiveShell.editor = &amp;#39;notepad&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とある&lt;code&gt;'notepad'&lt;/code&gt;のところにさっきコピーしたリンク先を貼り付け，先頭の#とスペースを消してからバックスラッシュか￥を半角のスラッシュ&lt;code&gt;/&lt;/code&gt;に書き換える。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TerminalInteractiveShell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;C:/Users/username/AppData/Local/Programs/Microsoft VS Code/Code.exe&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような感じになる。「ファイル」「保存」して再びコマンドプロンプトでIPythonを起動してから&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;edit&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でvscodeが開くので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とでも書いて保存してvscodeを終了すると，IPython上で実行される。&lt;/p&gt;
&lt;h4&gt;QtConsole&lt;/h4&gt;
&lt;p&gt;qtconsoleの方が応用が効くので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter-qtconsole
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすると、QtのUIを使ったIPythonが使える。ただし、mediapyのshow_*はインライン表示に使えないのでmatplotlibのimshowを使う必要がある。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlretrieve&lt;/span&gt;
&lt;span class="n"&gt;urlretrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://www.python.org/static/img/python-logo@2x.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で入手したファイルをインライン表示するには&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mediapy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;media&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とする。(matplotlibを使った場合)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;PIL&lt;/span&gt;
&lt;span class="n"&gt;PIL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;も表示できる。(PILを使った場合)&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython05.png" width="600"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;IPython.display&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;だとIPythonかJupyter Notebook専用になるが表示できる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython07.png" width="600"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;IPython.display&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mediapy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;media&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;だとndarrayと見做されて生データがドバーっと出る。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython06.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;IPython同様にquitでウィンドウが閉じる。&lt;/p&gt;
&lt;p&gt;これもデフォルトのエディタの設定がnotepadになっているので変更が必要で，コマンドプロンプトで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter-qtconsole --generate-config
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で設定ファイルを &lt;code&gt;.jupyter\jupyter_qtconsole_config.py&lt;/code&gt; に生成できるのだが，&lt;code&gt;c.JupyterWidget.editor = 'notepad'&lt;/code&gt;を弄っても反映されない。&lt;/p&gt;
&lt;h3&gt;4. Jupyter Notebookを使ってみる&lt;/h3&gt;
&lt;p&gt;コマンドプロンプトでJupyter Notebookのサーバーを起動する命令なのだがデフォルトでそのページを開くようOSに命令を出すのでブラウザが起動する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コマンドプロンプトを起動&lt;/li&gt;
&lt;li&gt;Jupyter Notebookのサーバーを起動&lt;/li&gt;
&lt;li&gt;色々作業&lt;/li&gt;
&lt;li&gt;Notebookで「閉じて終了」を選ぶ&lt;/li&gt;
&lt;li&gt;コマンドプロンプトでCtrl+Cを2回入力してサーバーを停止&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という流れになる。当たり前だがブラウザが開いた後にコマンドプロンプトを閉じると使えなくなるので注意。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter-notebook
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でブラウザが起動しJupyter Notebookが使える。
&lt;code&gt;New&lt;/code&gt;ボタンを押すと&lt;code&gt;Python3&lt;/code&gt;が出るので選択するとNotebookが新規作成される。&lt;/p&gt;
&lt;p&gt;Notebookはセルという単位で分割されていて，セルにはコードセルとMarkdownセルがある(Markdownは&lt;a href="https://ja.wikipedia.org/wiki/Markdown"&gt;Wikipedia&lt;/a&gt;とかを参照)。&lt;/p&gt;
&lt;p&gt;Markdownで説明を書き，その下にコードセルでPythonプログラムを書くような流れで「実験ノート」が作れる。Markdownの表示やコードの実行はCtrl+EnterまたはShift+Enter。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlretrieve&lt;/span&gt;
&lt;span class="n"&gt;urlretrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://www.python.org/static/img/python-logo@2x.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mediapy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;media&lt;/span&gt;
&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython04.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;保存した後で，ブラウザのJupyter Notebookで&lt;code&gt;Save&lt;/code&gt;で保存してから&lt;code&gt;Close and Halt&lt;/code&gt;でタブを閉じる(ブラウザのタブを閉じてもPythonのプロセスは停止してくれない。ファイル一覧で緑色のアイコンがそれを意味する)。
その後&lt;code&gt;File&lt;/code&gt;-&amp;gt;&lt;code&gt;Shut down&lt;/code&gt;を選ぶか，コマンドプロンプトで「Ctrl+C」を打ってJupyter Notebookのサーバーを終了させる。&lt;/p&gt;
&lt;p&gt;ちなみに保存されるのは&lt;code&gt;.ipynb&lt;/code&gt;(IPython Notebookと名乗っていた時代の名残り)という拡張子のファイルで，Visual Studio CodeやGoogle Colaboratoryでも開ける。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;New&lt;/code&gt;ボタンでは&lt;code&gt;Text File&lt;/code&gt;を選ぶとテキストエディタとなり，テキストエディタの&lt;code&gt;File-Rename&lt;/code&gt;で.py付きのファイル名(例えばHello.py)にするとPython用のハイライト表示エディタになる。また，&lt;code&gt;New&lt;/code&gt;から&lt;code&gt;Terminal&lt;/code&gt;を選ぶとコマンドプロンプトの親戚のようなPower Shellが開くので，.pyファイルを編集して&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py なんとか.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいにPythonスクリプトを実行できる。&lt;/p&gt;
&lt;h3&gt;5. Jupyter Labを使ってみる&lt;/h3&gt;
&lt;p&gt;Notebookと同じノリで起動する。Notebookだとエディタもターミナルもブラウザの別タブになって鬱陶しいが，Jupyter Labは一つのウィンドウに収まる。&lt;/p&gt;
&lt;p&gt;サーバーとして起動するのはNotebookと同様で，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter-lab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でブラウザが開き、JupyterLabが表示される。JupyterLabはJupyter Notebookの豪華版という感じで、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notebookでのプログラミング&lt;/li&gt;
&lt;li&gt;IPythonでのコマンド実行&lt;/li&gt;
&lt;li&gt;.pyファイルを使ったプログラミング&lt;/li&gt;
&lt;li&gt;ターミナルでの作業(WindowsだとPowershellがデフォルト)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;が可能。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython08.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;とりあえずの開発環境としてはこれが無難。&lt;/p&gt;
&lt;h3&gt;6. その他&lt;/h3&gt;
&lt;h4&gt;(あくまでもWindowsのマシンで)PythonをLinuxで動かす&lt;/h4&gt;
&lt;p&gt;WindowsでPython(特に外部パッケージ)を扱うのは今はだいぶ良くなったとはいえ「動いたらラッキー。動かなかったらがんばりましょう」という認識でいた方が良い。できればUbuntu等のLinux系を使う方がトラブルが少ないので，もう少し凝った使い方としては以下がある。&lt;/p&gt;
&lt;p&gt;特に深層学習フレームワークを使う場合にはLinux系OSで扱う場合が殆どなので今のうちから慣れておくと良い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL2&lt;/li&gt;
&lt;li&gt;Windows Subsystem for Linuxの略称で，Microsoftが提供していて，Winodws上でまんまLinuxが動くので，Ubuntu等のPython利用の解説がまんま使える&lt;/li&gt;
&lt;li&gt;NVIDIAがCUDA Driverも出してるのでNVIDIAのGPUを積んだマシンならWSL2上でTensorflowとかPyTorchが使える&lt;/li&gt;
&lt;li&gt;WSL2+Docker&lt;/li&gt;
&lt;li&gt;様々な環境を搭載したコンテナを拾ってきて直ぐに試せるうえにVMと違ってディスク容量をそこまで圧迫しない&lt;/li&gt;
&lt;li&gt;WSL2+Docker+VSCode&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/ja-jp/products/visual-studio-code"&gt;Visual Studio Code&lt;/a&gt;はMicrosoft製のテキストエディタだが，拡張機能でコンテナ上の開発環境を使ってプログラミング，とかが楽にできる。&lt;/li&gt;
&lt;li&gt;VSCodeに慣れると，リモートホスト上のDockerコンテナ上で開発。のようなことも出来る。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;他のバージョンのPython&lt;/h4&gt;
&lt;p&gt;LinuxやmacOSの場合はpyenvという便利な解決法があるのだが，Windowsの場合案外面倒そうなので素直に特定のマイナーバージョンのインストーラをPython.orgから持ってくるのが楽。その上で，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set PY_PYTHON=バージョン
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を指定すると，そのコマンドプロンプト上では以後py.exeが勝手にそっちのバージョンを使ってくれる。例えば，3.11と3.10を入れている場合&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set PY_PYTHON=3.10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打てば以降3.10.xが使え，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set PY_PYTHON=3.11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすれば3.11.xが使える。&lt;/p&gt;
&lt;h4&gt;仮想環境&lt;/h4&gt;
&lt;p&gt;ある特定のバージョンのopencv-pythonが必要だが，普段は最新のopencv-pythonを使いたい。とか，requirements.txtで指定されている環境を作りたい。とか，Pythonでのパッケージのバージョン環境は簡単に崩壊する。特に深層学習フレームワークについては後方互換性をバッサリ切っているものが多いので，色々試したい場合には環境を変えて作業した方が安全。&lt;/p&gt;
&lt;p&gt;安全な解決方法は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作業ごとにPCを用意する&lt;/li&gt;
&lt;li&gt;作業ごとにDockerでコンテナを作る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とかなのだが，Pythonの環境だけ切り替えて使える機能が仮想環境である。condaとかvirtualenvとかがよく使われてきたが，最近は公式のvenvを使うのがトレンドらしい。&lt;/p&gt;
&lt;p&gt;自分が作業をするフォルダで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m venv 仮想環境名
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打つと，「仮想環境名」のフォルダが出来る。そこのScriptsフォルダに&lt;code&gt;activate.bat&lt;/code&gt;があるのでそれを実行する(PowerShellの場合はActivate.ps1)。上の方で基本環境としてdefaultという名前で作成したが，別の開発環境として例えばvenvHelloみたいな名前にすると，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m venv venvHello
venvHello\Scripts\activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打つと，プロンプトの頭に(venvHello)のように仮想環境名が表示されるので，あとはpipなりで環境構築すれば良い。&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category><category term="Windows"></category></entry><entry><title>Google Cloud Shellの日本語化(gcc込み) 2024版</title><link href="https://eiichiromomma.github.io/2024/06/05/CloudShellEditor2024/" rel="alternate"></link><published>2024-06-05T19:20:00+09:00</published><updated>2024-06-05T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2024-06-05:/2024/06/05/CloudShellEditor2024/</id><summary type="html">&lt;p&gt;Webブラウザ上でコーディングとshellによる操作が可能な&lt;a href="https://ide.cloud.google.com/?hl=ja"&gt;Cloud Shell Editor&lt;/a&gt;がとても便利。
ただし&lt;a href="https://cloud.google.com/shell/docs/quotas-limits?hl=ja"&gt;50時間/週の制限&lt;/a&gt;がある。&lt;/p&gt;
&lt;p&gt;三の字のアイコンからTerminal-&amp;gt;new terminalでターミナルを開く。&lt;/p&gt;
&lt;p&gt;機能的にはエディタはVS Codeの拡張機能組込み版みたいな感じで，Shellの方はUbuntu 22.04が動いている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Webブラウザ上でコーディングとshellによる操作が可能な&lt;a href="https://ide.cloud.google.com/?hl=ja"&gt;Cloud Shell Editor&lt;/a&gt;がとても便利。
ただし&lt;a href="https://cloud.google.com/shell/docs/quotas-limits?hl=ja"&gt;50時間/週の制限&lt;/a&gt;がある。&lt;/p&gt;
&lt;p&gt;三の字のアイコンからTerminal-&amp;gt;new terminalでターミナルを開く。&lt;/p&gt;
&lt;p&gt;機能的にはエディタはVS Codeの拡張機能組込み版みたいな感じで，Shellの方はUbuntu 22.04が動いている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/issue
Ubuntu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.04.4&lt;span class="w"&gt; &lt;/span&gt;LTS&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ただし，どちらも日本語は表示は可能でもメニュー等は英語のまま。せめてShellのメッセージやmanを日本語化しようということで，Ubuntuの日本語化の方法を一通り実行。&lt;/p&gt;
&lt;h3&gt;確認作業&lt;/h3&gt;
&lt;p&gt;ここで説明している作業を実施しても，セッションが切れると環境がリセットされるが，短時間ブラウザを閉じた程度だと継続してくれている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;locale&lt;span class="w"&gt; &lt;/span&gt;-a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とやって&lt;code&gt;ja_JP.utf-8&lt;/code&gt;が存在していれば作業不要だが，入ってない。&lt;/p&gt;
&lt;h3&gt;日本語化&lt;/h3&gt;
&lt;p&gt;以下を1行ずつコピペする&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo &amp;#39;ja_JP.UTF-8 UTF-8&amp;#39; &amp;gt;&amp;gt;  /etc/locale.gen&amp;quot;&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;locale-gen
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;task-japanese&lt;span class="w"&gt; &lt;/span&gt;-y
wget&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;https://github.com/gcc-mirror/gcc/raw/releases/gcc-11/gcc/po/ja.po
msgfmt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;ja.po
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;/usr/share/locale/ja/LC_MESSAGES/gcc-11.mo
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export LANG=ja_JP.utf-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;わかりやすいかは疑問だが英語で思考停止する人には良い。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20240605-cse.png" width="600"&gt;&lt;/p&gt;
&lt;h4&gt;分けて説明&lt;/h4&gt;
&lt;p&gt;localeとしてja_JP.utf-8が有効になっていないので&lt;code&gt;/etc/locale.gen&lt;/code&gt;ファイルに追記し，locale-genで生成する。あとtask-japaneseは日本語manとか。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo &amp;#39;ja_JP.UTF-8 UTF-8&amp;#39; &amp;gt;&amp;gt;  /etc/locale.gen&amp;quot;&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;locale-gen
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;task-japanese&lt;span class="w"&gt; &lt;/span&gt;-y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;gccの.moファイル(メッセージのローカライゼーションファイル)が無いのでgccのソースミラーから拾って生成する。moファイルは実体と一致しないとダメなので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/gcc
/usr/bin/gcc:&lt;span class="w"&gt; &lt;/span&gt;symbolic&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;gcc-11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で出てきたgcc-11に合わせている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;https://github.com/gcc-mirror/gcc/raw/releases/gcc-11/gcc/po/ja.po
msgfmt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;ja.po
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;/usr/share/locale/ja/LC_MESSAGES/gcc-11.mo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;シェルを開いたときにja_JP.utf-8が環境変数LANGになるよう設定して読み込み&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export LANG=ja_JP.utf-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;デバッガ&lt;/h3&gt;
&lt;p&gt;Cloud Shellエディタのデバッガは&lt;a href="https://cloud.google.com/shell/docs/editor-overview?hl=ja"&gt;Go,Node.js,Python,Javaのみ対応&lt;/a&gt;なのでC/C++は諦めてgdb(+TUIとか)を使う&lt;/p&gt;</content><category term="Memo"></category><category term="C"></category><category term="Lecture"></category><category term="Debian"></category><category term="gcc"></category></entry><entry><title>Windows11+WSL2+WSLg+Docker</title><link href="https://eiichiromomma.github.io/2024/06/05/WinWSLDocker2024/" rel="alternate"></link><published>2024-06-05T08:20:00+09:00</published><updated>2024-06-05T08:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2024-06-05:/2024/06/05/WinWSLDocker2024/</id><content type="html">&lt;h3&gt;WSL2関係のまとめ&lt;/h3&gt;
&lt;p&gt;WSL2関連で色々様変りしていたので&lt;a href="https://github.com/eiichiromomma/CVMLAB/wiki/WSL2"&gt;wikiの方にまとめました&lt;/a&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/gpu/"&gt;Docker DesktopでのGPUサポート&lt;/a&gt; (NVIDIA Docker toolkitは不要)&lt;/li&gt;
&lt;li&gt;WindowsのCUDAドライバ関係が入ってれば&lt;a href="https://docs.nvidia.com/cuda/wsl-user-guide/index.html"&gt;WSL2用のLinuxドライバは不要&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WSL2を入れてもエラーが出る (WslRegisterDistribution failed with error)&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/h4m4chi/articles/8627893de9cdc5"&gt;ここの記事&lt;/a&gt;の手順で解決。&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category><category term="Ubuntu"></category><category term="WSL2"></category><category term="Github"></category><category term="Docker"></category></entry><entry><title>Windows+WSL2でGithubで配布されてるものを試す環境構築</title><link href="https://eiichiromomma.github.io/2023/06/21/WinWSLPythonDocker/" rel="alternate"></link><published>2023-06-21T19:20:00+09:00</published><updated>2023-06-21T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2023-06-21:/2023/06/21/WinWSLPythonDocker/</id><summary type="html">&lt;p&gt;※この情報は古いです。&lt;a href="https://github.com/eiichiromomma/CVMLAB/wiki/WSL2"&gt;wikiの方にまとめました&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;1. WSL2のインストール&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/ja-jp/windows/wsl/install"&gt;Microsoftのサイト&lt;/a&gt;の説明に従いWSL2を入れる。&lt;/p&gt;
&lt;p&gt;PowerShellを管理者権限で起動して&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ここでWSLは既に入っていてディストリビューションがどうこうと出てきたら
```PowerShell!
wsl --install -d Ubuntu&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;として&lt;span class="nv"&gt;Ubuntu&lt;/span&gt;を入れる

```&lt;span class="nv"&gt;bash&lt;/span&gt;
&lt;span class="nv"&gt;Ubuntu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;は既にインストー …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;※この情報は古いです。&lt;a href="https://github.com/eiichiromomma/CVMLAB/wiki/WSL2"&gt;wikiの方にまとめました&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;1. WSL2のインストール&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/ja-jp/windows/wsl/install"&gt;Microsoftのサイト&lt;/a&gt;の説明に従いWSL2を入れる。&lt;/p&gt;
&lt;p&gt;PowerShellを管理者権限で起動して&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ここでWSLは既に入っていてディストリビューションがどうこうと出てきたら
```PowerShell!
wsl --install -d Ubuntu&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;として&lt;span class="nv"&gt;Ubuntu&lt;/span&gt;を入れる

```&lt;span class="nv"&gt;bash&lt;/span&gt;
&lt;span class="nv"&gt;Ubuntu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;は既にインストールされています。
&lt;span class="nv"&gt;Ubuntu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;を起動しています...
&lt;span class="nv"&gt;Installing&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;take&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;few&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;minutes&lt;/span&gt;...
&lt;span class="nv"&gt;Please&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UNIX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;account&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;does&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;need&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;.
&lt;span class="k"&gt;For&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;more&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;information&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;visit&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;https&lt;/span&gt;:&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;aka&lt;/span&gt;.&lt;span class="nv"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;wslusers&lt;/span&gt;
&lt;span class="nv"&gt;Enter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UNIX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようにWSL2上でのユーザー名を聞いてくるのでスペース無しの半角英字でユーザー名を入れる。
その後パスワードも聞かれるので2回パスワードを入れる(あとでしょっちゅう使うので忘れないように)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Enter&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;UNIX&lt;span class="w"&gt; &lt;/span&gt;username:&lt;span class="w"&gt; &lt;/span&gt;momma
New&lt;span class="w"&gt; &lt;/span&gt;password:
Retype&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;password:
passwd:&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;updated&lt;span class="w"&gt; &lt;/span&gt;successfully
この操作を正しく終了しました。
Installation&lt;span class="w"&gt; &lt;/span&gt;successful!
To&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;administrator&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;use&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sudo &amp;lt;command&amp;gt;&amp;quot;&lt;/span&gt;.
See&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;man sudo_root&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;details.

Welcome&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;Ubuntu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.04.2&lt;span class="w"&gt; &lt;/span&gt;LTS&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;GNU/Linux&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.15.90.1-microsoft-standard-WSL2&lt;span class="w"&gt; &lt;/span&gt;x86_64&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;Documentation:&lt;span class="w"&gt;  &lt;/span&gt;https://help.ubuntu.com
&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;Management:&lt;span class="w"&gt;     &lt;/span&gt;https://landscape.canonical.com
&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;Support:&lt;span class="w"&gt;        &lt;/span&gt;https://ubuntu.com/advantage


This&lt;span class="w"&gt; &lt;/span&gt;message&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;shown&lt;span class="w"&gt; &lt;/span&gt;once&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;day.&lt;span class="w"&gt; &lt;/span&gt;To&lt;span class="w"&gt; &lt;/span&gt;disable&lt;span class="w"&gt; &lt;/span&gt;it&lt;span class="w"&gt; &lt;/span&gt;please&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;the
/home/momma/.hushlogin&lt;span class="w"&gt; &lt;/span&gt;file.
momma@ASUS2022-0:~$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいな感じでUbuntuが使える状態になる。&lt;/p&gt;
&lt;p&gt;次回以降はWindowsのメニューから&lt;code&gt;Ubuntu&lt;/code&gt;を選択すれば使える。&lt;/p&gt;
&lt;h4&gt;Error: 0xc004000dが出た場合&lt;/h4&gt;
&lt;p&gt;コントロールパネルの「プログラム」で「プログラムと機能」の中に「Windowsの機能の有効化または無効化」があるのでそれを選んでから「仮想マシンプラットフォーム」にチェックを入れる(要再起動)。その後WSL2を再度インストールする。&lt;/p&gt;
&lt;h3&gt;WSL2上でX11アプリの確認&lt;/h3&gt;
&lt;p&gt;sudoコマンドをそのセッションで初めて使うときはパスワードを聞かれるのでsudoの行だけコピペする。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;x11-apps&lt;span class="w"&gt; &lt;/span&gt;mesa-utils
xeyes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でマウスカーソルを目玉が追うxeyesのウィンドウが開いたらGUIアプリケーションの実行は成功。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;glxgears
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で、ギアが回るアプリケーションが起動したらOpenGL関係のアプリケーションも使える。&lt;/p&gt;
&lt;h3&gt;2. Ubuntu上でpyenvを使えるようにする&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;upgrade&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;build-essential&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
python3-setuptools&lt;span class="w"&gt; &lt;/span&gt;python3-pip&lt;span class="w"&gt; &lt;/span&gt;libssl-dev&lt;span class="w"&gt; &lt;/span&gt;libffi-dev&lt;span class="w"&gt; &lt;/span&gt;zlib1g-dev&lt;span class="w"&gt; &lt;/span&gt;libbz2-dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
libreadline-dev&lt;span class="w"&gt; &lt;/span&gt;libsqlite3-dev&lt;span class="w"&gt; &lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;llvm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
libncurses5-dev&lt;span class="w"&gt; &lt;/span&gt;xz-utils&lt;span class="w"&gt; &lt;/span&gt;tk-dev&lt;span class="w"&gt; &lt;/span&gt;libxml2-dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
libxmlsec1-dev&lt;span class="w"&gt; &lt;/span&gt;liblzma-dev&lt;span class="w"&gt; &lt;/span&gt;python3-venv
curl&lt;span class="w"&gt; &lt;/span&gt;https://pyenv.run&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;export PYENV_ROOT=&amp;quot;$HOME/.pyenv&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;command -v pyenv &amp;gt;/dev/null || export PATH=&amp;quot;$PYENV_ROOT/bin:$PATH&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;eval &amp;quot;$(pyenv init -)&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で.bashrcに設定が書き込まれるので、WSL2(というかWindowsメニューにUbuntuと出てくる)を開き直すか、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行する。これで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行すると実行時オプションが表示される。&lt;/p&gt;
&lt;p&gt;※Windows版のpyenvをインストールしていると、PATHの共有化でかなりややこしい話になるので、Windowsの方はPATHから外しておいた方が良い&lt;/p&gt;
&lt;h3&gt;3. 特定バージョンのPythonのインストール&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;versions
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打つと最初は" * system "しか出てこない。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;global
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;や&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でも"system"しか表示されない。これはUbuntuでインストールされるPythonを使う(というかそれしか存在していない)状態で、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とするとインストール可能なPythonのバージョン、配布形態の一覧が表示されるので、そこから選んで追加してから使うのがpyenvでのバージョン制御になる。例えば古いPython3.8を使いたい場合はその中で一番マイナーバージョンの数字が大きい3.8.17を入れることになる。(セキュリティパッチのタイミングでバージョンは更に上がる可能性があるのでちゃんと自分で確認すること)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.8.17
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でインストールが始まる。&lt;/p&gt;
&lt;p&gt;インストールが終わったらまた&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;versions
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行すると今入れた3.8.17が増えているので、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pyenv global バージョン: システム全体で使うPythonのバージョンを指定(非推奨)&lt;/li&gt;
&lt;li&gt;pyenv local バージョン: 今いるディレクトリ以下で使うPythonのバージョンを指定&lt;/li&gt;
&lt;li&gt;venvで仮想環境のときにバージョンを指定 (推奨)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のいずれかで扱うことになる。DockerのコンテナであるPythonのバージョン=その環境、という状況ならこれで問題ないが、Dockerを使わない場合には何かやるたびに環境が壊れるので注意。&lt;/p&gt;
&lt;h3&gt;4. venvとpyenvで特定バージョンの仮想環境を作る&lt;/h3&gt;
&lt;p&gt;用途としてはGithubで配布されているソースを試したいときが多い。
無視リストの.gitignoreには&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# pyenv&lt;/span&gt;
&lt;span class="na"&gt;.python-version&lt;/span&gt;

&lt;span class="c1"&gt;# Environments&lt;/span&gt;
&lt;span class="na"&gt;.env&lt;/span&gt;
&lt;span class="na"&gt;.venv&lt;/span&gt;
&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;
&lt;span class="nf"&gt;venv&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;
&lt;span class="nf"&gt;ENV&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;
&lt;span class="nf"&gt;env.bak&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;
&lt;span class="nf"&gt;venv.bak&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;が書かれている場合が殆どなので、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;githubからcloneして持ってくる&lt;/li&gt;
&lt;li&gt;そのディレクトリに移動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pyenv local 特定バージョン&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;venvで仮想環境を作成&lt;/li&gt;
&lt;li&gt;activateして環境構築&lt;/li&gt;
&lt;li&gt;終わったらdeactivate&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;のような流れになる。venvで環境構築をする場合に、上のリストのどれかを使うとよい(ここではENV)。&lt;/p&gt;
&lt;p&gt;ここでは特定環境として https://github.com/atb033/multi_agent_path_planning を試してみる。&lt;/p&gt;
&lt;p&gt;条件はPython3.8.x だが色々入ったり別のソフトを使おうとしたときに環境が壊れるのを防ぐために仮想環境を使う。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/atb033/multi_agent_path_planning
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;multi_agent_path_planning
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でソースの場所に移動してから&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv local 3.8.17
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でこのディレクトリでのPythonのバージョンを指定する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;versions
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすると今度は3.8.17にアスタリスクが付いている。&lt;/p&gt;
&lt;p&gt;続けて&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;ENV
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./ENV/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすればプロンプトの頭に(ENV)が付いて仮想環境になったことを教えてくれる。&lt;/p&gt;
&lt;p&gt;あとはrequirements.txtをインストールして実行するなり不足パッケージをpipで入れるなりすればよい。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;requirements.txt
python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pyyaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(pyyamlがrequirements.txtで指定されていないので入れてる)&lt;/p&gt;
&lt;p&gt;あとは説明の通り&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./centralized/sipp
python3&lt;span class="w"&gt; &lt;/span&gt;multi_sipp.py&lt;span class="w"&gt; &lt;/span&gt;input.yaml&lt;span class="w"&gt; &lt;/span&gt;output.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でデモを試せる。&lt;/p&gt;
&lt;p&gt;WLS2上のファイルはWindowsのエクスプローラで&lt;code&gt;Linux&lt;/code&gt;というペンギンアイコンのネットワークドライブが見えるようになっているのでそこから&lt;code&gt;\\wsl.localhost\Ubuntu\home\momma\multi_agent_path_planning\centralized\sipp\results&lt;/code&gt;のように辿るとそのまま開ける。(mommaは各自のユーザー名に置き換える)&lt;/p&gt;
&lt;p&gt;試し終えたら必ず&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行して仮想環境から抜ける。&lt;/p&gt;
&lt;p&gt;次回以降使いたい場合には、WSL2で先程の場所のactivateを実行(source)すれば良い。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;multi_agent_path_planning/
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./ENV/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;またはダイレクトに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;multi_agent_path_planning/ENV/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でもよい。&lt;/p&gt;
&lt;h3&gt;5. WSL2上でDockerを使う (非Docker Desktop)&lt;/h3&gt;
&lt;p&gt;Ubuntuの流儀で入れるだけなので&lt;a href="https://docs.docker.com/engine/install/ubuntu/"&gt;公式ドキュメント&lt;/a&gt;の通りに入れる&lt;/p&gt;
&lt;p&gt;(Docker Desktopを使いたい場合は &lt;a href="https://docs.docker.jp/desktop/windows/wsl.html"&gt;公式ドキュメントに従ってWSLバックエンドを有効化&lt;/a&gt;すればこのインストール作業無しで使えた筈なのでここは飛ばして良い)&lt;/p&gt;
&lt;p&gt;DeepLearning系のものを試したいときかつNVIDIAのグラボを積んでいるマシンの場合には，Dockerを入れた後でNVIDIA CUDAも入れる。(やりかたはググると出てくる)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;ca-certificates&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;gnupg
sudo&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0755&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/keyrings
curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://download.docker.com/linux/ubuntu/gpg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;--dearmor&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/keyrings/docker.gpg
sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;a+r&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/keyrings/docker.gpg
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;deb [arch=&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;--print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \&lt;/span&gt;
&lt;span class="s2"&gt;  &amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;/etc/os-release&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; stable&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/sources.list.d/docker.list&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null
sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;docker-ce&lt;span class="w"&gt; &lt;/span&gt;docker-ce-cli&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;containerd.io&lt;span class="w"&gt; &lt;/span&gt;docker-buildx-plugin&lt;span class="w"&gt; &lt;/span&gt;docker-compose-plugin
sudo&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;hello-world
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;として&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Hello&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;Docker!
This&lt;span class="w"&gt; &lt;/span&gt;message&lt;span class="w"&gt; &lt;/span&gt;shows&lt;span class="w"&gt; &lt;/span&gt;that&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;installation&lt;span class="w"&gt; &lt;/span&gt;appears&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;working&lt;span class="w"&gt; &lt;/span&gt;correctly.

To&lt;span class="w"&gt; &lt;/span&gt;generate&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;message,&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;took&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;following&lt;span class="w"&gt; &lt;/span&gt;steps:
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;The&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;client&lt;span class="w"&gt; &lt;/span&gt;contacted&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;daemon.
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;The&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;daemon&lt;span class="w"&gt; &lt;/span&gt;pulled&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hello-world&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;Hub.
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;amd64&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;The&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;daemon&lt;span class="w"&gt; &lt;/span&gt;created&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;container&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;that&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;which&lt;span class="w"&gt; &lt;/span&gt;runs&lt;span class="w"&gt; &lt;/span&gt;the
&lt;span class="w"&gt;    &lt;/span&gt;executable&lt;span class="w"&gt; &lt;/span&gt;that&lt;span class="w"&gt; &lt;/span&gt;produces&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;output&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;are&lt;span class="w"&gt; &lt;/span&gt;currently&lt;span class="w"&gt; &lt;/span&gt;reading.
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;The&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;daemon&lt;span class="w"&gt; &lt;/span&gt;streamed&lt;span class="w"&gt; &lt;/span&gt;that&lt;span class="w"&gt; &lt;/span&gt;output&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;client,&lt;span class="w"&gt; &lt;/span&gt;which&lt;span class="w"&gt; &lt;/span&gt;sent&lt;span class="w"&gt; &lt;/span&gt;it
&lt;span class="w"&gt;    &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;terminal.

To&lt;span class="w"&gt; &lt;/span&gt;try&lt;span class="w"&gt; &lt;/span&gt;something&lt;span class="w"&gt; &lt;/span&gt;more&lt;span class="w"&gt; &lt;/span&gt;ambitious,&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;can&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;an&lt;span class="w"&gt; &lt;/span&gt;Ubuntu&lt;span class="w"&gt; &lt;/span&gt;container&lt;span class="w"&gt; &lt;/span&gt;with:
&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;ubuntu&lt;span class="w"&gt; &lt;/span&gt;bash

Share&lt;span class="w"&gt; &lt;/span&gt;images,&lt;span class="w"&gt; &lt;/span&gt;automate&lt;span class="w"&gt; &lt;/span&gt;workflows,&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;more&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;free&lt;span class="w"&gt; &lt;/span&gt;Docker&lt;span class="w"&gt; &lt;/span&gt;ID:
&lt;span class="w"&gt; &lt;/span&gt;https://hub.docker.com/

For&lt;span class="w"&gt; &lt;/span&gt;more&lt;span class="w"&gt; &lt;/span&gt;examples&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;ideas,&lt;span class="w"&gt; &lt;/span&gt;visit:
&lt;span class="w"&gt; &lt;/span&gt;https://docs.docker.com/get-started/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;な表示が出ればコンテナの起動は成功。&lt;/p&gt;
&lt;p&gt;続けて&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;自分のユーザー名
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;としてdockerグループに自分を加えておくと、dockerの実行にsudoコマンドが不要になる。&lt;/p&gt;
&lt;h3&gt;6. WSL2のDockerでGUIアプリケーションを使う&lt;/h3&gt;
&lt;p&gt;WSL2上でGUIアプリケーションをそのまま実行するだけならWSLgがいい感じにWindowsで表示できるよう扱ってくれているが、Dockerコンテナ上のGUIアプリケーションを起動するには、Dockerのホスト(WSL2)に別ホスト(ここではコンテナ)のアプリケーションを表示させる細工が必要で、具体的には設定ファイルと環境変数の共有が必要となる。&lt;a href="https://zenn.dev/holliy/articles/51012ef059aa9f"&gt;具体的なやりかた&lt;/a&gt;はあちこちで紹介されているがDockerやWSLのアップデートによって変わることが多々あるので、極力新しい情報を参考にする。(英語だが公式サイトを見るのが正解)&lt;/p&gt;
&lt;p&gt;一旦Ubuntuを閉じて再度開いてから&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;--rm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--mount&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bind,source&lt;span class="o"&gt;=&lt;/span&gt;/tmp/.X11-unix,target&lt;span class="o"&gt;=&lt;/span&gt;/tmp/.X11-unix&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--mount&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bind,source&lt;span class="o"&gt;=&lt;/span&gt;/mnt/wslg,target&lt;span class="o"&gt;=&lt;/span&gt;/mnt/wslg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;WAYLAND_DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WAYLAND_DISPLAY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ubuntu:22.04
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすると&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Status:&lt;span class="w"&gt; &lt;/span&gt;Downloaded&lt;span class="w"&gt; &lt;/span&gt;newer&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ubuntu:22.04
root@f4e906a0f041:/#
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような感じでコンテナが起動する。&lt;code&gt;--it&lt;/code&gt;でインタラクティブな状態(コマンドを実行する場合)、&lt;code&gt;--rm&lt;/code&gt;で使い終えたコンテナを削除することを意味するので、残したければ&lt;code&gt;--rm&lt;/code&gt;は外して実行する。&lt;/p&gt;
&lt;p&gt;デフォルトだとユーザーはrootで動くのでsudoコマンドの付与は不要だが、ホストのアプリケーションのインストールは無関係な素の状態なのでアプリケーションは入れ直すか、諸々インストール済みのディスクイメージを探して使うか、環境構築のためのDockerfileを書くかになる。(Dockerfileを使う例は&lt;a href="https://github.com/eiichiromomma/ros2docker"&gt;こっち&lt;/a&gt;を参照)&lt;/p&gt;
&lt;p&gt;このままですんなりxeyesは入れれば動くのだが&lt;a href="https://github.com/RobotLocomotion/drake/issues/18726"&gt;jammyにOpenGL関係のバグがあるらしい&lt;/a&gt;のでglxgearsは動かないため、jammyを使いたい場合は一部パッケージをholdする。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;libglapi-mesa&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.0.1-1ubuntu2
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;libgbm1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.0.1-1ubuntu2
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;libegl-mesa0&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.0.1-1ubuntu2
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;libgl1-mesa-dri&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.0.1-1ubuntu2
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;libglx-mesa0&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.0.1-1ubuntu2
apt-mark&lt;span class="w"&gt; &lt;/span&gt;hold&lt;span class="w"&gt; &lt;/span&gt;libglapi-mesa&lt;span class="w"&gt; &lt;/span&gt;libgbm1&lt;span class="w"&gt; &lt;/span&gt;libegl-mesa0&lt;span class="w"&gt;  &lt;/span&gt;libgl1-mesa-dri&lt;span class="w"&gt; &lt;/span&gt;libglx-mesa0&lt;span class="w"&gt; &lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;mesa-utils
glxgears
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で歯車が周るアプリケーションが起動すれば成功。&lt;/p&gt;
&lt;p&gt;アプリケーションを閉じて&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;コンテナを終了させる。&lt;code&gt;--rm&lt;/code&gt;オプションを付けずに起動したコンテナは停止状態で保持される。プロセスは圧迫しないがディスクは圧迫するので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;container&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で時々確認すると良い。&lt;/p&gt;
&lt;h4&gt;古いROSのコンテナを使う&lt;/h4&gt;
&lt;p&gt;古い環境でも構築可能なのがDockerの利点だが、追加で何か入れようとするとapt関係がミラーサイトにもなく、apt updateだけでも結構遅い状態になるので、何か試すにしてもよく吟味してから選ぶとよい。&lt;/p&gt;
&lt;p&gt;https://github.com/hasauino/rrt_exploration を試してみる。環境としては&lt;a href="http://wiki.ros.org/ja/kinetic/Installation/Ubuntu"&gt;kinetic&lt;/a&gt;なので今から素で入れるのは面倒。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hub.docker.com/_/ros/tags?page=1&amp;amp;name=kinetic"&gt;公式のコンテナ&lt;/a&gt;を使う。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker pull ros:kinetic-robot-xenial
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でDocker Imageをpullしたらrunで起動。今度は&lt;code&gt;--rm&lt;/code&gt;は付けずに&lt;code&gt;--name foxyTest&lt;/code&gt;と名付けて起動する(exitしてもコンテナが残る)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;foxyTest&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--mount&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bind,source&lt;span class="o"&gt;=&lt;/span&gt;/tmp/.X11-unix,target&lt;span class="o"&gt;=&lt;/span&gt;/tmp/.X11-unix&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--mount&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bind,source&lt;span class="o"&gt;=&lt;/span&gt;/mnt/wslg,target&lt;span class="o"&gt;=&lt;/span&gt;/mnt/wslg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;WAYLAND_DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WAYLAND_DISPLAY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ros:kinetic-robot-xenial
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でコンテナが起動するので&lt;code&gt;ros[TAB][TAB]&lt;/code&gt;とするとROS周りが既にインストールされているのがわかる。
ひとまずexitして&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;container&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とするとfoxyTestが一覧に出てくる。&lt;/p&gt;
&lt;p&gt;再開するには&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;foxyTest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でコンテナが起動するのでドキュメントの通り&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;ros-kinetic-gmapping&lt;span class="w"&gt; &lt;/span&gt;ros-kinetic-navigation&lt;span class="w"&gt; &lt;/span&gt;python-opencv&lt;span class="w"&gt; &lt;/span&gt;python-numpy&lt;span class="w"&gt; &lt;/span&gt;python-scikits-learn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で準備ができたら、catkinなWSを作る&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/catkin_ws/src
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/catkin_ws/
catkin_make
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;WSのsrcにソースをcloneする&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;src
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/hasauino/rrt_exploration.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/catkin_ws/
catkin_make
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;devel/setup.bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でインストール完了。続けて&lt;a href="https://github.com/hasauino/rrt_exploration_tutorials"&gt;Tutorials&lt;/a&gt;を試す。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;ros-kinetic-kobuki&lt;span class="w"&gt; &lt;/span&gt;ros-kinetic-kobuki-core&lt;span class="w"&gt; &lt;/span&gt;ros-kinetic-kobuki-gazebo&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/catkin_ws/src
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/hasauino/rrt_exploration_tutorials.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/catkin_ws/
catkin_make
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;devel/setup.bash
roslaunch&lt;span class="w"&gt; &lt;/span&gt;rrt_exploration_tutorials&lt;span class="w"&gt; &lt;/span&gt;single_simulated_house.launch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で一応Gazeboも一部透明だったりUIが表示されなかったりするが起動して動いてそうな画面が出てくる。&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category><category term="Ubuntu"></category><category term="WSL2"></category><category term="Github"></category></entry><entry><title>Windows環境でGitとvenvを使ってみる</title><link href="https://eiichiromomma.github.io/2023/05/25/WinVenv/" rel="alternate"></link><published>2023-05-25T19:20:00+09:00</published><updated>2023-05-25T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2023-05-25:/2023/05/25/WinVenv/</id><summary type="html">&lt;p&gt;&lt;a href="https://eiichiromomma.github.io/2023/05/21/WinPython/"&gt;前回のWindowsでのPython環境構築&lt;/a&gt;をやった続き。&lt;/p&gt;
&lt;h3&gt;やること&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;gitコマンドを使ってGitHubからソースを持ってくる&lt;/li&gt;
&lt;li&gt;venvで専用の環境を作って動かす&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Gitについて雑な説明&lt;/h3&gt;
&lt;p&gt;Gitは何かしらのプロジェクトで作成したプログラムのソース(とデータ)を管理するツールで，GitHubはGitに対応したサーバーを提供するサービス。程度の認識でよい。プログラムを作ってる …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://eiichiromomma.github.io/2023/05/21/WinPython/"&gt;前回のWindowsでのPython環境構築&lt;/a&gt;をやった続き。&lt;/p&gt;
&lt;h3&gt;やること&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;gitコマンドを使ってGitHubからソースを持ってくる&lt;/li&gt;
&lt;li&gt;venvで専用の環境を作って動かす&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Gitについて雑な説明&lt;/h3&gt;
&lt;p&gt;Gitは何かしらのプロジェクトで作成したプログラムのソース(とデータ)を管理するツールで，GitHubはGitに対応したサーバーを提供するサービス。程度の認識でよい。プログラムを作ってる側の視点だと&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;プログラムを書く&lt;/li&gt;
&lt;li&gt;Gitコマンドで更新内容を記録する&lt;/li&gt;
&lt;li&gt;GitHubに送る(公開にも非公開にもできる)&lt;/li&gt;
&lt;li&gt;開発を続けてプログラムを更新する&lt;/li&gt;
&lt;li&gt;Gitコマンドで更新内容を記録する&lt;/li&gt;
&lt;li&gt;GitHubに送る&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;みたいな感じで，手元にもGitHubにもプログラムと更新の記録が残るので，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;何かやらかしたので前のバージョンに戻す&lt;/li&gt;
&lt;li&gt;本流には入れずに取り敢えず試しに実装してみる(ブランチ)&lt;/li&gt;
&lt;li&gt;別ブランチの更新内容を取り入れる&lt;/li&gt;
&lt;li&gt;区切りを付ける(タグ)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のような感じで便利なためよく使われている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自分の考えた処理・手法を公開できる&lt;/li&gt;
&lt;li&gt;他の人から「こう直してくれ」と要望を送って貰える(プルリク)&lt;/li&gt;
&lt;li&gt;他の人が引き継いでそれに手を加える(fork)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のような側面もあり，使う側にとっては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アルゴリズムしか公開されていない手法を再実装しないで済む&lt;/li&gt;
&lt;li&gt;よく使うツールの開発に貢献できる&lt;/li&gt;
&lt;li&gt;開発が停止してしまったツールを自分で更新できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった利点もある。&lt;/p&gt;
&lt;p&gt;その他大量のサービスがあるので興味のある人は調べると良い。(このBlogっぽいWebもGitHubのサービスの一環)&lt;/p&gt;
&lt;h4&gt;Git for Windows&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/download/win"&gt;配布もと&lt;/a&gt;から64bitのstandaloneインストーラをダウンロードしてインストール。
設定は全部デフォルトで問題ない。&lt;/p&gt;
&lt;p&gt;PATHが自動的に設定されるが，インストール後に起動したプログラムにしか適用されないので，コマンドプロンプトのためにターミナルを起動している人は一旦閉じる。&lt;/p&gt;
&lt;h4&gt;PySimpleGUIのソースを拾ってくる&lt;/h4&gt;
&lt;p&gt;ここでは簡単にGUIなプログラムが作れるらしい&lt;a href="https://github.com/PySimpleGUI/PySimpleGUI"&gt;PySimpleGUI&lt;/a&gt; を試す。パッケージ自体はpipコマンドでインストールできるのだが、デモ等のソースも見ると勉強になるので拾ってくる。&lt;/p&gt;
&lt;p&gt;cmdでコマンドプロンプトを起動したら，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Documents
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/PySimpleGUI/PySimpleGUI.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で，PySimpleGUIフォルダにGitHubで公開されているソースコードがダウンロードできた(git pullコマンドで常に最新の状態に保つこともできるのが zipファイルでダウンロードする方法との違い)&lt;/p&gt;
&lt;p&gt;PySimpleGUIは設定プログラム(?)をいきなり試せるので起動してみる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py&lt;span class="w"&gt; &lt;/span&gt;PySimpleGUI&lt;span class="se"&gt;\P&lt;/span&gt;ySimpleGUI.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でウィンドウが開いたら成功。
ざっと試してウィンドウを閉じる。&lt;/p&gt;
&lt;h3&gt;venv&lt;/h3&gt;
&lt;p&gt;前回最後に触れたvenvを使って仮想環境を作る。
↓のvenvのあとの&lt;code&gt;venvPySimpleGUI&lt;/code&gt;は仮想環境名なので、別のパッケージ用に仮想環境を作るときは都度名前を変える。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;PySimpleGUI
py&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venvPySimpleGUI
.&lt;span class="se"&gt;\v&lt;/span&gt;envPySimpleGUI&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate
py&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;としたあとで本体とデモビューワ、あと使いそうなパッケージを入れる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;PySimpleGUI&lt;span class="w"&gt; &lt;/span&gt;psgdemos
py&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;opencv-python&lt;span class="w"&gt; &lt;/span&gt;matplotlib&lt;span class="w"&gt; &lt;/span&gt;pymunk&lt;span class="w"&gt; &lt;/span&gt;psutil&lt;span class="w"&gt; &lt;/span&gt;prawn&lt;span class="w"&gt; &lt;/span&gt;weather2&lt;span class="w"&gt; &lt;/span&gt;mido&lt;span class="w"&gt; &lt;/span&gt;python-vlc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で完了。
( python-vlcはコントロールだけなので、 &lt;a href="https://www.videolan.org/vlc/index.ja.html"&gt;VLC&lt;/a&gt;は別途インストールが必要。)&lt;/p&gt;
&lt;p&gt;Windows+venvを使うと、ScriptsフォルダへPathが設定される利点もある。&lt;code&gt;psgdemos&lt;/code&gt;もその一例でvenvの中のScriptsフォルダの中にScriptsと言いつつ.exeファイルが置いてある。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;psgdemos
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でデモの一覧が出てくるので色々試すと良い。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython09.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;OpenCV関係もあり，使い方は先程入手したソースの&lt;a href="DemoPrograms/Demo_OpenCV_4_Line_Program.py"&gt;DemoProgramsの中&lt;/a&gt;にあるので，参考にできる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/PySimpleGUI/PySimpleGUI/blob/master/readme.ja.md"&gt;日本語のドキュメント&lt;/a&gt;もあるので恵まれている。&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category><category term="Windows"></category></entry><entry><title>WindowsでのオススメのPython環境</title><link href="https://eiichiromomma.github.io/2023/05/21/WinPython/" rel="alternate"></link><published>2023-05-21T19:20:00+09:00</published><updated>2023-05-21T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2023-05-21:/2023/05/21/WinPython/</id><summary type="html">&lt;p&gt;普通に&lt;a href="https://www.python.org/"&gt;Python.org&lt;/a&gt;からダウンロードして入れましょうという話。&lt;/p&gt;
&lt;p&gt;これまでオススメのPython環境はAnacondaだったもののNavigatorでトラブルが発生するとかなり面倒だったり，condaがいつまでたっても依存関係を解決してくれなかったりとイマイチな状況が増えてきたのと，結局のところpip使わないで済むことは無いのでcondaではなくpipで統一してしまった方が楽だというのが動機で&lt;code&gt;py.exe&lt;/code&gt;の存在が決 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;普通に&lt;a href="https://www.python.org/"&gt;Python.org&lt;/a&gt;からダウンロードして入れましょうという話。&lt;/p&gt;
&lt;p&gt;これまでオススメのPython環境はAnacondaだったもののNavigatorでトラブルが発生するとかなり面倒だったり，condaがいつまでたっても依存関係を解決してくれなかったりとイマイチな状況が増えてきたのと，結局のところpip使わないで済むことは無いのでcondaではなくpipで統一してしまった方が楽だというのが動機で&lt;code&gt;py.exe&lt;/code&gt;の存在が決定的。macOSでもAnacondaではなく標準+pyenv+venvになってる。&lt;/p&gt;
&lt;h3&gt;1. Pythonのインストール&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.python.org/downloads/windows/"&gt;公式の配布サイト&lt;/a&gt;から3.11.xをダウンロードして実行。&lt;/p&gt;
&lt;p&gt;インストーラの画面は特に弄らずそのままInstall Nowを選ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython01.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;"Setup was successful"と出たらインストール完了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython02.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;そのウィンドウに&lt;em&gt;Disable path length limit&lt;/em&gt;という表示があったらそれを選択する。Windowsに限らず環境変数PATHという概念があり，そこに羅列したフォルダ内のプログラムはどこからでも呼び出せる，というOSの仕組みがある。macOSやUnixは問題ないのだが，Windowsは&lt;code&gt;C:\Program Files&lt;/code&gt;または&lt;code&gt;C:\Program Files(x86)&lt;/code&gt;みたいなアホ長いフォルダが標準的なインストール先なのでPATHに羅列しようとすると凄まじい長さになるのが明白にもかかわらず，環境変数に設定できるのが260文字までというアホな制限がある。それを回避する方法がこの選択肢。&lt;/p&gt;
&lt;p&gt;Windowsメニューの「すべてのアプリ」にPythonフォルダが出来ている。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython03.png" width="400"&gt;&lt;/p&gt;
&lt;p&gt;黒っぽいアイコンの&lt;code&gt;Python 3.xx(64-bit)&lt;/code&gt;を選ぶとコマンドプロンプトの黒い画面が開き&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような入力待ち(プロンプトと呼ぶ)になるので&lt;code&gt;quit()&lt;/code&gt;と打って一旦終了させる。&lt;/p&gt;
&lt;h3&gt;2. パッケージのインストール&lt;/h3&gt;
&lt;p&gt;Windowsメニューの検索にcmdと打ってコマンドプロンプトを起動する。&lt;/p&gt;
&lt;h4&gt;pipのアップグレード&lt;/h4&gt;
&lt;p&gt;Pythonのインストール時にpy.exeというプログラムもインストールされていて，自動的に「今使うPython」を呼び出す仕組みになっている。Pythonはパッケージ(機能)を呼び出すときに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python -m パッケージ名 パッケージのオプション
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とするか，パッケージによっては&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;パッケージ名 パッケージのオプション
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような感じで起動するのだが，後者はWindowsだと手間のかかるPathの設定が必要なので，py.exeと前者を組み合わせて使う。例えばよく&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install -U pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と実行しろと説明しているサイトが多いが，「パッケージ管理のpipを使ってpip自身をアップグレード(-U)しろ」というコマンドは&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m pip install -U pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と書く(.exeは付けなくて良い)。ということでまずは↑のコマンドをコマンドプロンプトで実行してpipをアップグレードする&lt;/p&gt;
&lt;h4&gt;無難なパッケージのインストール&lt;/h4&gt;
&lt;p&gt;何をやるにしろあった方が便利なものを一通り入れておく。コマンドプロンプトに以下をコピペする。(^は長いコマンドに途中改行させる方法)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m pip install jupyter notebook ipython opencv-python ^
 opencv-contrib-python numpy scipy scikit-image scikit-learn ^
 pillow pandas matplotlib seaborn mediapy pyqt5 ^
 qtconsole jupyterlab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ScriptsフォルダにPathを通さないと使えないぞ、という警告が出るが無視してよい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ipython: 普通のpythonより親切なPythonインタプリタIPython&lt;/li&gt;
&lt;li&gt;jupyter: NotebookとLabで使うエンジン&lt;/li&gt;
&lt;li&gt;jupyterlab: Jupyter Lab。MATLABっぽいNotebook+コマンド+インタプリタな何でもあり版な開発環境&lt;/li&gt;
&lt;li&gt;matplotlib: グラフや画像の表示に使う可視化&lt;/li&gt;
&lt;li&gt;mediapy: Notebookで画像や動画を楽に表示できる&lt;/li&gt;
&lt;li&gt;notebook: Jupyter Notebookというブラウザベースで動くPythonの開発環境(ノートを取りながらPythonを実行できるので人気)&lt;/li&gt;
&lt;li&gt;numpy: 行列演算ライブラリ&lt;/li&gt;
&lt;li&gt;opencv-python: コンピュータビジョンライブラリOpenCV&lt;/li&gt;
&lt;li&gt;opencv-contrib-python: OpenCVの正式版には含まれていない機能の追加&lt;/li&gt;
&lt;li&gt;scipy: 科学技術系ライブラリ&lt;/li&gt;
&lt;li&gt;scikit-image: SciPy toolkit=scikitでscipyのサブモジュールの一つで画像処理関係&lt;/li&gt;
&lt;li&gt;scikit-learn: scipyのサブモジュールの一つで機械学習関係&lt;/li&gt;
&lt;li&gt;pandas: データ解析でR言語っぽい動きをする&lt;/li&gt;
&lt;li&gt;pillow: PIL(Python Imaging Library)という古くからある画像処理ライブラリから派生した現代版で呼び出しはPILとして互換性が保てる&lt;/li&gt;
&lt;li&gt;pyqt5: Qt(キュート(Cute)と読む)のPython版でなぜかパイキューティーと読まれる。GUIアプリのベースとなるものでqtconsoleで使う&lt;/li&gt;
&lt;li&gt;qtconsole: コマンドプロンプトでもIPythonは使えるが，こっちだと画像が表示できる。&lt;/li&gt;
&lt;li&gt;seaborn: 可視化でmatplotlibよりダサくない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;が入れるもの。&lt;/p&gt;
&lt;h3&gt;3. IPythonを使ってみる&lt;/h3&gt;
&lt;p&gt;IPython(アイパイソン)のように大文字小文字に注意。最初の文字はアイの大文字。IPythonは通常ipythonコマンドで起動するよう書かれているドキュメントが多いが，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m IPython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようにPythonのモジュールとしてインストールされるものはScripts内のコマンドを使わなくてもpyに-mを付けてモジュール名を指定すれば使える(quitで終了)&lt;/p&gt;
&lt;h4&gt;QtConsole&lt;/h4&gt;
&lt;p&gt;qtconsoleの方が応用が効くので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m qtconsole
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすると、QtのUIを使ったIPythonが使える。ただし、mediapyのshow_*はインライン表示に使えないのでmatplotlibのimshowを使う必要がある。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlretrieve&lt;/span&gt;
&lt;span class="n"&gt;urlretrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://www.python.org/static/img/python-logo@2x.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で入手したファイルをインライン表示したいが、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mediapy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;media&lt;/span&gt;
&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;だと表示できない。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mediapy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;media&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;だと表示できる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;PIL&lt;/span&gt;
&lt;span class="n"&gt;PIL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;も表示できる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython05.png" width="600"&gt;&lt;/p&gt;
&lt;h4&gt;ipyエンジン専用の画像表示&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;IPython.display&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;だとIPythonかJupyter Notebook専用になるが表示できる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython07.png" width="600"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;IPython.display&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mediapy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;media&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;だとndarrayと見做されて生データがドバーっと出る。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython06.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;quitでウィンドウが閉じる。&lt;/p&gt;
&lt;h3&gt;4. Jupyter Notebookを使ってみる&lt;/h3&gt;
&lt;p&gt;コマンドプロンプトでJupyter Notebookのサーバーを起動する命令なのだがデフォルトでそのページを開くようOSに命令を出すのでブラウザが起動する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コマンドプロンプトを起動&lt;/li&gt;
&lt;li&gt;Jupyter Notebookのサーバーを起動&lt;/li&gt;
&lt;li&gt;色々作業&lt;/li&gt;
&lt;li&gt;Notebookで「閉じて終了」を選ぶ&lt;/li&gt;
&lt;li&gt;コマンドプロンプトでCtrl+Cを2回入力してサーバーを停止&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という流れになる。当たり前だがブラウザが開いた後にコマンドプロンプトを閉じると使えなくなるので注意。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m jupyter notebook
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でブラウザが起動しJupyter Notebookが使える。
&lt;code&gt;New&lt;/code&gt;ボタンを押すと&lt;code&gt;Python3&lt;/code&gt;が出るので選択するとNotebookが新規作成される。&lt;/p&gt;
&lt;p&gt;Notebookはセルという単位で分割されていて，セルにはコードセルとMarkdownセルがある(Markdownは&lt;a href="https://ja.wikipedia.org/wiki/Markdown"&gt;Wikipedia&lt;/a&gt;とかを参照)。&lt;/p&gt;
&lt;p&gt;Markdownで説明を書き，その下にコードセルでPythonプログラムを書くような流れで「実験ノート」が作れる。Markdownの表示やコードの実行はCtrl+EnterまたはShift+Enter。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlretrieve&lt;/span&gt;
&lt;span class="n"&gt;urlretrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://www.python.org/static/img/python-logo@2x.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mediapy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;media&lt;/span&gt;
&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python-logo.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython04.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;保存した後で，ブラウザのJupyter Notebookで&lt;code&gt;Save&lt;/code&gt;で保存してから&lt;code&gt;Close and Halt&lt;/code&gt;でタブを閉じる(ブラウザのタブを閉じてもPythonのプロセスは停止してくれない。ファイル一覧で緑色のアイコンがそれを意味する)。
その後コマンドプロンプトで「Ctrl+C」を打ってJupyter Notebookのサーバーを終了させる。&lt;/p&gt;
&lt;p&gt;ちなみに保存されるのは&lt;code&gt;.ipynb&lt;/code&gt;(IPython Notebookと名乗っていた時代の名残り)という拡張子のファイルで，Visual Studio CodeやGoogle Colaboratoryでも開ける。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;New&lt;/code&gt;ボタンでは&lt;code&gt;Text File&lt;/code&gt;を選ぶとテキストエディタとなり，テキストエディタの&lt;code&gt;File-Rename&lt;/code&gt;で.py付きのファイル名(例えばHello.py)にするとPython用のハイライト表示エディタになる。また，&lt;code&gt;New&lt;/code&gt;から&lt;code&gt;Terminal&lt;/code&gt;を選ぶとコマンドプロンプトの親戚のようなPower Shellが開くので，.pyファイルを編集して&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py なんとか.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいにPythonスクリプトを実行できる。&lt;/p&gt;
&lt;h3&gt;5. Jupyter Labを使ってみる&lt;/h3&gt;
&lt;p&gt;Notebookと同じノリで起動する。Notebookだとエディタもターミナルもブラウザの別タブになって鬱陶しいが，Jupyter Labは一つのウィンドウに収まる。&lt;/p&gt;
&lt;p&gt;サーバーとして起動するのはNotebookと同様で，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m jupyter lab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でブラウザが開き、JupyterLabが表示される。JupyterLabはJupyter Notebookの豪華版という感じで、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notebookでのプログラミング&lt;/li&gt;
&lt;li&gt;IPythonでのコマンド実行&lt;/li&gt;
&lt;li&gt;.pyファイルを使ったプログラミング&lt;/li&gt;
&lt;li&gt;ターミナルでの作業(WindowsだとPowershellがデフォルト)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;が可能。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2023WinPython08.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;とりあえずの開発環境としてはこれが無難。&lt;/p&gt;
&lt;h3&gt;6. その他&lt;/h3&gt;
&lt;h4&gt;(あくまでもWindowsのマシンで)PythonをLinuxで動かす&lt;/h4&gt;
&lt;p&gt;WindowsでPython(特に外部パッケージ)を扱うのは今はだいぶ良くなったとはいえ「動いたらラッキー。動かなかったらがんばりましょう」という認識でいた方が良い。できればUbuntu等のLinux系を使う方がトラブルが少ないので，もう少し凝った使い方としては以下がある。&lt;/p&gt;
&lt;p&gt;特に深層学習フレームワークを使う場合にはLinux系OSで扱う場合が殆どなので今のうちから慣れておくと良い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL2&lt;/li&gt;
&lt;li&gt;Windows Subsystem for Linuxの略称で，Microsoftが提供していて，Winodws上でまんまLinuxが動くので，Ubuntu等のPython利用の解説がまんま使える&lt;/li&gt;
&lt;li&gt;NVIDIAがCUDA Driverも出してるのでNVIDIAのGPUを積んだマシンならWSL2上でTensorflowとかPyTorchが使える&lt;/li&gt;
&lt;li&gt;WSL2+Docker&lt;/li&gt;
&lt;li&gt;様々な環境を搭載したコンテナを拾ってきて直ぐに試せるうえにVMと違ってディスク容量をそこまで圧迫しない&lt;/li&gt;
&lt;li&gt;WSL2+Docker+VSCode&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/ja-jp/products/visual-studio-code"&gt;Visual Studio Code&lt;/a&gt;はMicrosoft製のテキストエディタだが，拡張機能でコンテナ上の開発環境を使ってプログラミング，とかが楽にできる。&lt;/li&gt;
&lt;li&gt;VSCodeに慣れると，リモートホスト上のDockerコンテナ上で開発。のようなことも出来る。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;他のバージョンのPython&lt;/h4&gt;
&lt;p&gt;LinuxやmacOSの場合はpyenvという便利な解決法があるのだが，Windowsの場合案外面倒そうなので素直に特定のマイナーバージョンのインストーラをPython.orgから持ってくるのが楽。その上で，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set PY_PYTHON=バージョン
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を指定すると，そのコマンドプロンプト上では以後py.exeが勝手にそっちのバージョンを使ってくれる。例えば，3.11と3.10を入れている場合&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set PY_PYTHON=3.10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打てば以降3.10.xが使え，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set PY_PYTHON=3.11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすれば3.11.xが使える。&lt;/p&gt;
&lt;h4&gt;仮想環境&lt;/h4&gt;
&lt;p&gt;ある特定のバージョンのopencv-pythonが必要(例えばOpenEXRがギリギリ使える4.5.4とか)だが，普段は最新のopencv-pythonを使いたい。とか，requirements.txtで指定されている環境を作りたい。とか，Pythonでのパッケージのバージョン環境は簡単に崩壊する。特に深層学習フレームワークについては後方互換性をバッサリ切っているものが多いので，色々試したい場合には環境を変えて作業した方が安全。&lt;/p&gt;
&lt;p&gt;安全な解決方法は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作業ごとにPCを用意する&lt;/li&gt;
&lt;li&gt;作業ごとにDockerでコンテナを作る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とかなのだが，Pythonの環境だけ切り替えて使える機能が仮想環境である。condaとかvirtualenvとかがよく使われてきたが，最近は公式のvenvを使うのがトレンドらしい。&lt;/p&gt;
&lt;p&gt;自分が作業をするフォルダで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m venv 仮想環境名
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打つと，「仮想環境名」のフォルダが出来る。そこのScriptsフォルダに&lt;code&gt;activate.bat&lt;/code&gt;があるのでそれを実行する(PowerShellの場合はActivate.ps1)。例えばvenvHelloみたいな名前にすると，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;py -m venv venvHello
venvHello\Scripts\activate.bat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と打つと，プロンプトの頭に(venvHello)のように仮想環境名が表示されるので，あとはpipなりで環境構築すれば良い。&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category><category term="Windows"></category></entry><entry><title>cx_FreezeでPythonからexeファイル生成</title><link href="https://eiichiromomma.github.io/2023/02/16/cx_Freeze/" rel="alternate"></link><published>2023-02-16T19:20:00+09:00</published><updated>2023-02-16T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2023-02-16:/2023/02/16/cx_Freeze/</id><summary type="html">&lt;p&gt;Pythonはスクリプト記述なので開発環境の無いところで利用しようとすると面倒ごとが多い。
Windowsなら.exe，macOSなら.appに変換するのがよく用いられる手段で，&lt;a href="https://github.com/marcelotduarte/cx_Freeze"&gt;cx_Freeze&lt;/a&gt;はその一つ。&lt;/p&gt;
&lt;p&gt;Pythonのスクリプトから実行形式を生成できるパッケージで，元のスクリプトにはほぼ手を入れる必要が無さそうなのが良い点。
ただしWindowsならWindows，macOSならmacOSでの作業が必要。クロスプ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Pythonはスクリプト記述なので開発環境の無いところで利用しようとすると面倒ごとが多い。
Windowsなら.exe，macOSなら.appに変換するのがよく用いられる手段で，&lt;a href="https://github.com/marcelotduarte/cx_Freeze"&gt;cx_Freeze&lt;/a&gt;はその一つ。&lt;/p&gt;
&lt;p&gt;Pythonのスクリプトから実行形式を生成できるパッケージで，元のスクリプトにはほぼ手を入れる必要が無さそうなのが良い点。
ただしWindowsならWindows，macOSならmacOSでの作業が必要。クロスプラットフォームでの実行ファイル生成はできない。(開発は可能)&lt;/p&gt;
&lt;p&gt;GUIアプリケーションのサンプルとしてはPyQt5, PyQt6, PySide2, PySide6, wxWidgets, tcltk, Python.Netあたり。OpenCVも普通に&lt;code&gt;cv2.imshow&lt;/code&gt;が使えたりする。&lt;/p&gt;
&lt;p&gt;(余談だが&lt;a href="https://github.com/marcelotduarte/cx_Freeze/tree/main/samples/pythonnet-demo"&gt;Python.Netのデモ&lt;/a&gt;がIronPythonよりも遥かにC#のFormsアプリっぽく書けそうで驚いた。)&lt;/p&gt;
&lt;p&gt;手順としては普通にプログラムを作ったうえで，ルールに従ってsetup.pyを記述したうえで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class="w"&gt; &lt;/span&gt;setup.py&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;または&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class="w"&gt; &lt;/span&gt;setup.py&lt;span class="w"&gt; &lt;/span&gt;bdist_mac
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすれば.exeや.appを生成する。ただし実行に必要なdll等は内包せずに一緒にbuildフォルダにコピーされるので，フォルダごと持って行って実行。となる。OpenCLを使うパッケージでも普通に動いたのでかなり便利。&lt;/p&gt;
&lt;p&gt;必要なファイルについては結構優秀で自動的に依存関係からコピーしてくれるのだが，逆に言えば依存関係の解析に失敗すれば全コケする。.pydのようなバイナリ化してるパッケージについては対応できてないようなので，pythonでスクリプトを走らせたときは動くのに，exe化したときには動かない，という現象が発生するうえに，printでデバッグできないので検証が面倒。
(importでSystemErrorを起こしてexeでだけ動かないプログラムも↓の方法で確認したらnumpyが無いと言われてたので，&lt;code&gt;import numpy&lt;/code&gt;をそのパッケージの前にimportしたら動いた)&lt;/p&gt;
&lt;h3&gt;エラーの収集&lt;/h3&gt;
&lt;p&gt;.exeにするとprintデバッグができないがstdoutとstderrをファイルに振ってしまえば行けるだろうと思ったら&lt;a href="https://pc.atsuhiro-me.net/entry/2014/07/27/211623"&gt;既に先人が居た&lt;/a&gt;ので有り難く使わせて貰う。&lt;/p&gt;
&lt;p&gt;具体的には&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;log.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LogFrozen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;log.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initstdout&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;localdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localdir&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localdir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;frozen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# frozen&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LogFrozen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;log.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# not frozen&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;log.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="n"&gt;initstdout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# この後に怪しいimportを書く&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;をスクリプトに入れておけばホームフォルダ(Windowsならc:\Users\username，macOSなら/Users/username)にlog.txtファイルで出力される。場所を変えたかったら&lt;code&gt;localdir = os.path.expanduser("~/")&lt;/code&gt;のところの"~/"を適当に変える(チルダはホームフォルダの意味)&lt;/p&gt;</content><category term="Memo"></category><category term="Windows"></category><category term="macOS"></category><category term="Python"></category><category term="cx_Freeze"></category></entry><entry><title>Windows11 Edu.でのローカルID</title><link href="https://eiichiromomma.github.io/2023/02/15/Windows11LocalAccount/" rel="alternate"></link><published>2023-02-15T19:20:00+09:00</published><updated>2023-02-15T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2023-02-15:/2023/02/15/Windows11LocalAccount/</id><summary type="html">&lt;h3&gt;初見殺しのWindows11&lt;/h3&gt;
&lt;p&gt;Windows11は初期セットアップではMicrosoft Accountがないと無理矢理作らされるが，その後はネット切断してから「設定」でアカウント追加を実行すればローカルアカウントが作れる …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;初見殺しのWindows11&lt;/h3&gt;
&lt;p&gt;Windows11は初期セットアップではMicrosoft Accountがないと無理矢理作らされるが，その後はネット切断してから「設定」でアカウント追加を実行すればローカルアカウントが作れる。&lt;/p&gt;
&lt;p&gt;が、Education含めたエンタープライズ系の場合ログイン画面で一旦AD認証(職場・大学)になってしまうと，起動したときにE-Mailアドレスとパスワードの入力しか受け付けない状態でローカルアカウントでログインできなくなるように振る舞う。&lt;/p&gt;
&lt;p&gt;解決方法はE-Mailアドレスを入れろと書かれているところに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;.\
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のあとに続けてローカルアカウントIDを入れる。この".\"(ピリオド+リバーススラッシュまたはピリオド+円マーク(半角))はローカル領域という意味になるらしい。&lt;/p&gt;</content><category term="Memo"></category><category term="Windows"></category></entry><entry><title>M1 MacでWindowsアプリを使う</title><link href="https://eiichiromomma.github.io/2022/05/25/WineskinServer/" rel="alternate"></link><published>2022-05-25T22:00:00+09:00</published><updated>2022-05-25T22:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-05-25:/2022/05/25/WineskinServer/</id><summary type="html">&lt;p&gt;PlayOnMacとかHomebrewからのCrossover Wineとかあるようだが、&lt;a href="https://github.com/Gcenx/WineskinServer"&gt;WineskinServer&lt;/a&gt;が使いやすかった。
講義で示すような用途の場合は&lt;a href="https://mac.getutm.app/"&gt;UTM&lt;/a&gt; とか &lt;a href="https://www.parallels.com/jp/"&gt;Parallels&lt;/a&gt;の仮想マシンで、とりあえず単発で動けばラッキ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PlayOnMacとかHomebrewからのCrossover Wineとかあるようだが、&lt;a href="https://github.com/Gcenx/WineskinServer"&gt;WineskinServer&lt;/a&gt;が使いやすかった。
講義で示すような用途の場合は&lt;a href="https://mac.getutm.app/"&gt;UTM&lt;/a&gt; とか &lt;a href="https://www.parallels.com/jp/"&gt;Parallels&lt;/a&gt;の仮想マシンで、とりあえず単発で動けばラッキー程度ならWineという感じになる。Wineは仮想マシンではなく、Windowsと互換性を持つシステムを作ったもので対応外のアプリも多数あるし日本語の表示も微妙だったりするのでハードルは高い。&lt;/p&gt;
&lt;p&gt;WineskinServerは単一の互換システムにアプリケーションをぶら下げるのではなく、Windowsアプリケーションごとに.appを作成する(.appフォルダはmacOSから見たアプリケーション本体)。(Wrapperと呼ぶ)
デメリットは容量を食うところ。共通のWindowsリソースは一応共有しているが、WrapperごとにWine Engineを任意のバージョンから選べるようにした仕組みのためWine関係のファイルについては独立して.app内に置かれている。
容量としては1アプリあたり1GB+そのアプリのファイルと考えると良さそう。&lt;/p&gt;
&lt;p&gt;使い方の詳しい説明は&lt;a href="https://www.storange.jp/2021/11/how-to-use-wineskin.html"&gt;ここ&lt;/a&gt;に載ってるのでそちらを参照すると良い。&lt;/p&gt;
&lt;h3&gt;WineskinServerで動作確認したソフト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.spectrum-soft.com/download/download.shtm"&gt;Micro-CAP 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.analog.com/jp/design-center/design-tools-and-calculators/ltspice-simulator.html"&gt;LTspice&lt;/a&gt; (macOS版もあるが使いにくいのでWindows版を使いたい)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hp.giesselink.com/emu48.htm"&gt;Emu48&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hp.giesselink.com/v41.htm"&gt;V41&lt;/a&gt; (追記)&lt;/li&gt;
&lt;li&gt;Visual Studioの再頒布ファイル(Redist)が必要な場合でも一度インストールした後でWrapperアプリ上で右クリックして、"パッケージの内容を表示"で、"Wineskin"アプリを起動してからInstall Softwareで追加インストールできる(その後もExeファイルがV41.exeのままになっていれば問題ない)&lt;/li&gt;
&lt;li&gt;キーコードがハードコードされてるプログラムで普通にキーを打っても応答しないが，何故かCmdキーを押しっぱなしだと入力できる(Wineの機能なのかは不明)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WineskinServerの導入&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Homebrewでインストール&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--no-quarantine&lt;span class="w"&gt; &lt;/span&gt;gcenx/wine/unofficial-wineskin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Wineskin Wineryがアプリケーションにあるので起動&lt;/li&gt;
&lt;li&gt;"Installed Engines"が空なので、+ボタンでWineのエンジンを追加する。押せば最新版が推奨されるのでそれをインストールする&lt;/li&gt;
&lt;li&gt;Wrapper Versionのところで"Update"が有効になっていたらそれもアップデートする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これで本体の導入は終わり。&lt;/p&gt;
&lt;h3&gt;Wrapperの作成&lt;/h3&gt;
&lt;p&gt;WineskinServerはWindowsアプリをmacOSのアプリのように見せ掛けるのでWrapperと呼んでいる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wineskin Wineryを起動&lt;/li&gt;
&lt;li&gt;"Create New Blank Wrapper"を選ぶ&lt;/li&gt;
&lt;li&gt;Create a Wrapperというウィンドウが開くので、そこに英数字で使う予定のアプリ名を書く(例えばLTspice)&lt;/li&gt;
&lt;li&gt;暫く待つとWrapper Creation Finishedと出るので自分のApplicationフォルダ(通常 /Users/unername/Application でFinderの"移動"→"ホーム"からApplicationまたは"アプリケーション")に"Wineskin"フォルダがあるのでそれを開く&lt;/li&gt;
&lt;li&gt;3で指定した名前のアプリを開く(アイコンはWineskinという茶色いもの)&lt;/li&gt;
&lt;li&gt;"Advanced"を選ぶ&lt;/li&gt;
&lt;li&gt;"Tools"タブを選び"Winetricks"ボタンを押す&lt;/li&gt;
&lt;li&gt;Search for packagesのところにfakejと入れるとfontsの中にfakejapaneseがあるのでチェックを入れてRun→Yesを押して暫く待つ&lt;/li&gt;
&lt;li&gt;" Winetricks Commands Finished!!"と出たらClose&lt;/li&gt;
&lt;li&gt;左下の"Install Software"を選ぶ&lt;/li&gt;
&lt;li&gt;インストーラがある場合は"Choose Setup Executable"を選ぶ。(単にzipを展開しただけで使えるソフトの場合は"Copy a Folder Inside"で良いが、フォルダ名はシンプルにした方が良さそう)&lt;/li&gt;
&lt;li&gt;最後に実行するexeファイルを聞いてくるので適切なものを選ぶ(分からない場合は片っ端から選んで"Test Run")&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;6からのカスタマイズは後からも実行可能で、Wrapperアプリ上で右クリックして、"パッケージの内容を表示"で、"Wineskin"アプリがあるのでそれを実行する。&lt;/p&gt;
&lt;h3&gt;字が小さい&lt;/h3&gt;
&lt;p&gt;WineskinのAdvancedからToolsタブで"Config Utility(winecfg)"を選び、"画面"で96dpiとなっているものを変える。今のMacだと168dpiあたりだが、ちゃんと適用されるかはアプリの仕様次第。&lt;/p&gt;
&lt;h3&gt;アプリ(Wineskin Wrapper)を消したい&lt;/h3&gt;
&lt;p&gt;システムで重要なファイルそのものはWrapperに含まれないので、macOSのアプリと同様に単にそのアプリをゴミ箱に捨てれば良いが、ToolsメニューにUninstallerがあるので恐らくそれを使った方がマナーは良いかも知れない。&lt;/p&gt;
&lt;h3&gt;アイコンを変えたい場合&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/jlu5/icoextract"&gt;icoextract&lt;/a&gt;みたいなexeやdllからアイコンを引っこ抜くツールを使えば変更可能だが、リバースエンジニアリングの類な気もするので要注意。&lt;/p&gt;</content><category term="Memo"></category><category term="Windows"></category><category term="Apple Silicon"></category><category term="M1 mac"></category><category term="Micro-CAP"></category><category term="LTspice"></category><category term="Wine"></category><category term="WineskinServer"></category></entry><entry><title>CASIOっぽい関数電卓アプリ</title><link href="https://eiichiromomma.github.io/2022/05/21/ScientificCalcurator/" rel="alternate"></link><published>2022-05-21T08:20:00+09:00</published><updated>2022-05-21T08:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-05-21:/2022/05/21/ScientificCalcurator/</id><summary type="html">&lt;p&gt;大学配布のCASIOの関数電卓を模擬したものを探してみた。
カバンの中に入れっぱなしにしておくよう言ってはいるものの，忘れたときに使えるよう準備してお …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大学配布のCASIOの関数電卓を模擬したものを探してみた。
カバンの中に入れっぱなしにしておくよう言ってはいるものの，忘れたときに使えるよう準備しておくと良い。&lt;/p&gt;
&lt;h3&gt;Android&lt;/h3&gt;
&lt;h4&gt;&lt;a href="https://play.google.com/store/apps/details?id=advanced.scientific.calculator.calc991.plus&amp;amp;hl=ja&amp;amp;gl=US"&gt;Scientific calculator plus advanced 991 calc&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;ほぼカシオの関数電卓。作りようが無いといえばそうなのだが，下のとほぼ同じ感じもする。Androidのアプリはよくわからない。&lt;/p&gt;
&lt;p&gt;ENG表示の設定が可能で，SI接頭辞表示モードがあるのは便利。(3000→3kみたいな感じ)&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://play.google.com/store/apps/details?id=scientific.calculator.es991.es115.es300&amp;amp;hl=ja&amp;amp;gl=US"&gt;数学計算機991、300プラス&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;ほぼカシオ。メニューのアイコンとか設定のレイアウトも上のアプリとほぼ同じでどういう関係かはよく分からない。&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.hiedu.calculator580pro"&gt;HiEdu Calculator He-580 Pro&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;ほぼカシオ。Proじゃない版もあるのだが，こちらの環境だと表示が崩れる。190円なので常用するなら買っても良い。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;iOS&lt;/h3&gt;
&lt;h4&gt;&lt;a href="https://apps.apple.com/au/app/ncalc-scientific-calculator/id1449106995?l=ja&amp;amp;platform=iphone"&gt;NCalc Scientific Calculator+&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;キーボードデザインについてはfx-991esとかCASIOを名指しで指定しているだけあってよく似ている。
ENG表示とSI接頭辞表示モードがあり便利。
370円払わないとゾーニング無しの何でもありな動く広告が出る。macOS版もある。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;探すポイント&lt;/h3&gt;
&lt;p&gt;現在市場にある関数電卓としてはCASIO, TI, HP(RPN), SHARPあたり。以下がそれらのポイント。&lt;/p&gt;
&lt;h4&gt;CASIOっぽさ&lt;/h4&gt;
&lt;p&gt;最近のHPの廉価版，CANONの関数電卓はCASIOと同じファームウェアを使っているように思える&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S←→Dキー(CANONはF←→Dキー)がある&lt;/li&gt;
&lt;li&gt;SHIFT, ALPHAキーがある&lt;/li&gt;
&lt;li&gt;991, 115, 300なんとかという名前&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;TIっぽさ&lt;/h4&gt;
&lt;p&gt;ガワの下が丸みを帯びているのも特徴。
だいたいTI-84かTI-89Tiを意識したデザイン。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「何とか84」「何とか89」という名称&lt;/li&gt;
&lt;li&gt;2nd, ALPHAキー(SHARPも)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;HP(RPN)っぽさ&lt;/h4&gt;
&lt;p&gt;HP Prime以外はあまり売る気が無さそう(HP300+はマニュアルのリンクすら間違えてる)。個人的にはHP-35sとかHP-48gといったRPN電卓の方が複素数の演算も使い易いがまたそれは別の機会に。何もわからず使おうとすると本当に何もできないので調べてから使いましょう。あとRPNでも複素数を楽に使える機種は少ない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enterというデカいキーがある&lt;/li&gt;
&lt;li&gt;f, gキーまたはオレンジ，水色キー&lt;/li&gt;
&lt;li&gt;11, 12, 15, 16, 42, 48あたりが名前に入る&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;SHARPっぽさ&lt;/h4&gt;
&lt;p&gt;一時期SHARP製も配られたことがあった。カーソルがデカいのも特徴。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D1, D2みたいなカスタムキー&lt;/li&gt;
&lt;li&gt;3の下に(-)キー&lt;/li&gt;
&lt;li&gt;▶DRG(角度単位の変更)&lt;/li&gt;
&lt;li&gt;2nd, ALPHAキー(TIも)&lt;/li&gt;
&lt;/ul&gt;</content><category term="講義"></category><category term="iOS"></category><category term="Android"></category></entry><entry><title>colour-scienceで三刺激値のプロットとか</title><link href="https://eiichiromomma.github.io/2022/05/15/colour-science/" rel="alternate"></link><published>2022-05-15T09:30:00+09:00</published><updated>2022-05-15T09:30:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-05-15:/2022/05/15/colour-science/</id><summary type="html">&lt;p&gt;色彩工学・光学関係で便利そうな&lt;a href="https://www.colour-science.org/"&gt;colour-science&lt;/a&gt;なのだが，Tutorialに載ってないことをやろうとした途端に破綻する初見殺し。&lt;/p&gt;
&lt;h3&gt;等色関数のプロット&lt;/h3&gt;
&lt;h4&gt;一つだけプロットする場合&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://colour.readthedocs.io/en/develop/generated/colour.MSDS_CMFS.html"&gt;colour.MSDS_CMFS&lt;/a&gt;で定義されて …&lt;/p&gt;</summary><content type="html">&lt;p&gt;色彩工学・光学関係で便利そうな&lt;a href="https://www.colour-science.org/"&gt;colour-science&lt;/a&gt;なのだが，Tutorialに載ってないことをやろうとした途端に破綻する初見殺し。&lt;/p&gt;
&lt;h3&gt;等色関数のプロット&lt;/h3&gt;
&lt;h4&gt;一つだけプロットする場合&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://colour.readthedocs.io/en/develop/generated/colour.MSDS_CMFS.html"&gt;colour.MSDS_CMFS&lt;/a&gt;で定義されているdictもどきの&lt;code&gt;LazyCaseInsensitiveMapping&lt;/code&gt;(後で説明)。
ここの&lt;code&gt;Stiles &amp;amp; Burch 1955 2 Degree RGB CMFs&lt;/code&gt;とかがkeyという鬼畜で，&lt;code&gt;plot_single_cmfs&lt;/code&gt;で単にプロットしたい場合のkeyでもある。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;colour.plotting&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;cplt&lt;/span&gt;
&lt;span class="n"&gt;cplt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot_single_cmfs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Stiles &amp;amp; Burch 1955 2 Degree RGB CMFs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2022-05-15-colour-science.png" width="600"&gt;&lt;/p&gt;
&lt;h4&gt;複数プロットする場合&lt;/h4&gt;
&lt;p&gt;等色関数の名前をリストにして&lt;code&gt;plot_multi_cmfs&lt;/code&gt;に渡すだけでよい。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cmfs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Stiles &amp;amp; Burch 1959 10 Degree RGB CMFs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;CIE 1964 10 Degree Standard Observer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;cplt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot_multi_cmfs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmfs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2022-05-15-colour-science2.png" width="600"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href="https://colour.readthedocs.io/en/develop/generated/colour.utilities.LazyCaseInsensitiveMapping.html"&gt;LazyCaseInsensitiveMapping&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;dictもどきのclassでdomain(波長)をkeyとしたdataと，labelsとかの情報で構成されている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cmf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MSDS_CMFS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Stiles &amp;amp; Burch 1955 2 Degree RGB CMFs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;cmf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でドバーっと中身が出てくるが容易に拾えない。&lt;/p&gt;
&lt;h4&gt;domain&lt;/h4&gt;
&lt;p&gt;これが中身を拾うためのkeysになる。(内部で処理してるにせよ一致が保証されないfloat型をkeyにして大丈夫なのかと思うが)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="mf"&gt;390.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;395.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;400.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;405.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;410.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;415.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;420.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;425.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;430.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mf"&gt;435.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;440.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;445.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;450.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;455.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;460.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;465.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;470.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;475.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mf"&gt;480.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;485.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;490.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;495.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;500.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;505.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;510.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;515.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;520.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mf"&gt;525.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;530.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;535.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;540.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;545.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;550.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;555.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;560.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;565.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mf"&gt;570.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;575.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;580.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;585.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;590.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;595.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;600.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;605.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;610.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mf"&gt;615.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;620.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;625.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;630.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;635.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;640.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;645.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;650.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;655.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mf"&gt;660.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;665.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;670.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;675.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;680.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;685.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;690.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;695.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;700.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mf"&gt;705.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;710.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;715.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;720.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;725.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;730.&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;なので，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cfms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MSDS_CMFS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Stiles &amp;amp; Burch 1955 2 Degree RGB CMFs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;wl&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cfms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wl&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cfms&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wl&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;390.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.0018397&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.00045393&lt;/span&gt;  &lt;span class="mf"&gt;0.012152&lt;/span&gt;  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;395.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.0046153&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0010464&lt;/span&gt;  &lt;span class="mf"&gt;0.03111&lt;/span&gt;  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;400.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.0096264&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0021689&lt;/span&gt;  &lt;span class="mf"&gt;0.062371&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;405.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.018979&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0044304&lt;/span&gt;  &lt;span class="mf"&gt;0.13161&lt;/span&gt;  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;410.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.030803&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0072048&lt;/span&gt;  &lt;span class="mf"&gt;0.2275&lt;/span&gt;   &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;415.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.042459&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.012579&lt;/span&gt;  &lt;span class="mf"&gt;0.35897&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;420.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.051662&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.016651&lt;/span&gt;  &lt;span class="mf"&gt;0.52396&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;425.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.052837&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.02124&lt;/span&gt;   &lt;span class="mf"&gt;0.68586&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;430.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.044287&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.019936&lt;/span&gt;  &lt;span class="mf"&gt;0.79604&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;435.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.03222&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.016097&lt;/span&gt;  &lt;span class="mf"&gt;0.89459&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;440.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.014763&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0073457&lt;/span&gt;  &lt;span class="mf"&gt;0.96395&lt;/span&gt;  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;445.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0023392&lt;/span&gt;  &lt;span class="mf"&gt;0.001369&lt;/span&gt;   &lt;span class="mf"&gt;0.99814&lt;/span&gt;  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;450.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.02913&lt;/span&gt;  &lt;span class="mf"&gt;0.01961&lt;/span&gt;  &lt;span class="mf"&gt;0.91875&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;455.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.060677&lt;/span&gt;  &lt;span class="mf"&gt;0.043464&lt;/span&gt;  &lt;span class="mf"&gt;0.82487&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;460.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.096224&lt;/span&gt;  &lt;span class="mf"&gt;0.070954&lt;/span&gt;  &lt;span class="mf"&gt;0.78554&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;465.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.13759&lt;/span&gt;  &lt;span class="mf"&gt;0.11022&lt;/span&gt;  &lt;span class="mf"&gt;0.66723&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;470.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.17486&lt;/span&gt;  &lt;span class="mf"&gt;0.15088&lt;/span&gt;  &lt;span class="mf"&gt;0.61098&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;475.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.2126&lt;/span&gt;   &lt;span class="mf"&gt;0.19794&lt;/span&gt;  &lt;span class="mf"&gt;0.48829&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;480.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.2378&lt;/span&gt;   &lt;span class="mf"&gt;0.24042&lt;/span&gt;  &lt;span class="mf"&gt;0.36195&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;485.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.25674&lt;/span&gt;  &lt;span class="mf"&gt;0.27993&lt;/span&gt;  &lt;span class="mf"&gt;0.26634&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;490.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.27727&lt;/span&gt;  &lt;span class="mf"&gt;0.33353&lt;/span&gt;  &lt;span class="mf"&gt;0.19593&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;495.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.29125&lt;/span&gt;  &lt;span class="mf"&gt;0.40521&lt;/span&gt;  &lt;span class="mf"&gt;0.1473&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;500.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.295&lt;/span&gt;    &lt;span class="mf"&gt;0.4906&lt;/span&gt;   &lt;span class="mf"&gt;0.10749&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;505.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.29706&lt;/span&gt;   &lt;span class="mf"&gt;0.59673&lt;/span&gt;   &lt;span class="mf"&gt;0.076714&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;510.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.26759&lt;/span&gt;   &lt;span class="mf"&gt;0.70184&lt;/span&gt;   &lt;span class="mf"&gt;0.050248&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;515.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.21725&lt;/span&gt;   &lt;span class="mf"&gt;0.80852&lt;/span&gt;   &lt;span class="mf"&gt;0.028781&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;520.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.14768&lt;/span&gt;   &lt;span class="mf"&gt;0.91076&lt;/span&gt;   &lt;span class="mf"&gt;0.013309&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;525.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.035184&lt;/span&gt;  &lt;span class="mf"&gt;0.98482&lt;/span&gt;   &lt;span class="mf"&gt;0.002117&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;530.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.10614&lt;/span&gt;    &lt;span class="mf"&gt;1.0339&lt;/span&gt;    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0041574&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;535.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.25981&lt;/span&gt;    &lt;span class="mf"&gt;1.0538&lt;/span&gt;    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0083032&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;540.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.41976&lt;/span&gt;   &lt;span class="mf"&gt;1.0512&lt;/span&gt;   &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.012191&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;545.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.59259&lt;/span&gt;   &lt;span class="mf"&gt;1.0498&lt;/span&gt;   &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.014039&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;550.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.79004&lt;/span&gt;   &lt;span class="mf"&gt;1.0368&lt;/span&gt;   &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.014681&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;555.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;1.0078&lt;/span&gt;    &lt;span class="mf"&gt;0.99826&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.014947&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;560.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;1.2283&lt;/span&gt;    &lt;span class="mf"&gt;0.93783&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.014613&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;565.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;1.4727&lt;/span&gt;    &lt;span class="mf"&gt;0.88039&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.013782&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;570.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;1.7476&lt;/span&gt;   &lt;span class="mf"&gt;0.82835&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.01265&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;575.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;2.0214&lt;/span&gt;    &lt;span class="mf"&gt;0.74686&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.011356&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;580.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;2.2724&lt;/span&gt;     &lt;span class="mf"&gt;0.6493&lt;/span&gt;    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0099317&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;585.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;2.4896&lt;/span&gt;     &lt;span class="mf"&gt;0.56317&lt;/span&gt;   &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0084148&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;590.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;2.6725&lt;/span&gt;    &lt;span class="mf"&gt;0.47675&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.007021&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;595.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;2.8093&lt;/span&gt;     &lt;span class="mf"&gt;0.38484&lt;/span&gt;   &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0057437&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;600.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;2.8717&lt;/span&gt;     &lt;span class="mf"&gt;0.30069&lt;/span&gt;   &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0042743&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;605.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;2.8525&lt;/span&gt;     &lt;span class="mf"&gt;0.22853&lt;/span&gt;   &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.0029132&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;610.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;2.76010000e+00&lt;/span&gt;   &lt;span class="mf"&gt;1.65750000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.26930000e-03&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;615.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;2.59890000e+00&lt;/span&gt;   &lt;span class="mf"&gt;1.13730000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.99660000e-03&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;620.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;2.37430000e+00&lt;/span&gt;   &lt;span class="mf"&gt;7.46820000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.50690000e-03&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;625.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;2.10540000e+00&lt;/span&gt;   &lt;span class="mf"&gt;4.65040000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;9.38220000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;630.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.81450000e+00&lt;/span&gt;   &lt;span class="mf"&gt;2.63330000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.53160000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;635.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.52470000e+00&lt;/span&gt;   &lt;span class="mf"&gt;1.27240000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.16680000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;640.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.25430000e+00&lt;/span&gt;   &lt;span class="mf"&gt;4.50330000e-03&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.43190000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;645.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.00760000e+00&lt;/span&gt;   &lt;span class="mf"&gt;9.66110000e-05&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.08310000e-06&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;650.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;7.86420000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.96450000e-03&lt;/span&gt;   &lt;span class="mf"&gt;1.10810000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;655.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;5.96590000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.63270000e-03&lt;/span&gt;   &lt;span class="mf"&gt;1.91750000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;660.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;4.43200000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.62620000e-03&lt;/span&gt;   &lt;span class="mf"&gt;2.26560000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;665.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;3.24100000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.30270000e-03&lt;/span&gt;   &lt;span class="mf"&gt;2.15200000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;670.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;2.34550000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.87000000e-03&lt;/span&gt;   &lt;span class="mf"&gt;1.63610000e-04&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;675.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.68840000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.44240000e-03&lt;/span&gt;   &lt;span class="mf"&gt;9.71640000e-05&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;680.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.20860000e-01&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.07550000e-03&lt;/span&gt;   &lt;span class="mf"&gt;5.10330000e-05&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;685.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;8.58110000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;7.90040000e-04&lt;/span&gt;   &lt;span class="mf"&gt;3.52710000e-05&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;690.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;6.02600000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.67650000e-04&lt;/span&gt;   &lt;span class="mf"&gt;3.12110000e-05&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;695.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;4.14800000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.92740000e-04&lt;/span&gt;   &lt;span class="mf"&gt;2.45080000e-05&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;700.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;2.81140000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.62310000e-04&lt;/span&gt;   &lt;span class="mf"&gt;1.65210000e-05&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;705.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.91170000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.75120000e-04&lt;/span&gt;   &lt;span class="mf"&gt;1.11240000e-05&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;710.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;1.33050000e-02&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.21400000e-04&lt;/span&gt;   &lt;span class="mf"&gt;8.69650000e-06&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;715.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;9.40920000e-03&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;8.57600000e-05&lt;/span&gt;   &lt;span class="mf"&gt;7.43510000e-06&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;720.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;6.51770000e-03&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.76770000e-05&lt;/span&gt;   &lt;span class="mf"&gt;6.10570000e-06&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;725.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;4.53770000e-03&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.90030000e-05&lt;/span&gt;   &lt;span class="mf"&gt;5.02770000e-06&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mf"&gt;730.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  &lt;span class="mf"&gt;3.17420000e-03&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.65110000e-05&lt;/span&gt;   &lt;span class="mf"&gt;4.12510000e-06&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいな出力が得られる。(dataはndarray)&lt;/p&gt;
&lt;h4&gt;自力でプロット&lt;/h4&gt;
&lt;p&gt;綺麗ではないが力技で拾ってプロット&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;colour&lt;/span&gt;

&lt;span class="n"&gt;cmf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MSDS_CMFS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Stiles &amp;amp; Burch 1955 2 Degree RGB CMFs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wl&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wl&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/2022-05-15-colour-science3.png" width="600"&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;numpy_print_options&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;試行錯誤してたら&lt;code&gt;numpy_print_options&lt;/code&gt;というものがあるらしく&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;colour.utilities&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy_print_options&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;numpy_print_options&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で，表示だけできるのは分かったが特に便利な何かという訳ではない。&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category></entry><entry><title>TeXでPDFに埋め込んだ数式情報の救出</title><link href="https://eiichiromomma.github.io/2022/05/15/PyPDF2/" rel="alternate"></link><published>2022-05-15T09:20:00+09:00</published><updated>2022-05-15T09:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-05-15:/2022/05/15/PyPDF2/</id><summary type="html">&lt;p&gt;LaTeXiTとかTeX2imgでPDFに埋め込んだTeXソースを拾い出したい。&lt;/p&gt;
&lt;p&gt;結論から言うと TeX2imgは&lt;a href="https://github.com/py-pdf/PyPDF2"&gt;PyPDF2&lt;/a&gt;で読める。LaTeXiTは面倒過ぎて放棄。&lt;/p&gt;
&lt;h3&gt;tex2imgの場合&lt;/h3&gt;
&lt;p&gt;PyPDF2でPDFファイルを開いてページを取得する。
前提として1ページもので数式が出力されてるPDFの equation.pdf を扱う。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;PyPDF2&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equation.pdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyPDF2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PdfFileReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pageは&lt;code&gt;PyPDF2._page.PageObject&lt;/code&gt;だがdictと考えて良い …&lt;/p&gt;</summary><content type="html">&lt;p&gt;LaTeXiTとかTeX2imgでPDFに埋め込んだTeXソースを拾い出したい。&lt;/p&gt;
&lt;p&gt;結論から言うと TeX2imgは&lt;a href="https://github.com/py-pdf/PyPDF2"&gt;PyPDF2&lt;/a&gt;で読める。LaTeXiTは面倒過ぎて放棄。&lt;/p&gt;
&lt;h3&gt;tex2imgの場合&lt;/h3&gt;
&lt;p&gt;PyPDF2でPDFファイルを開いてページを取得する。
前提として1ページもので数式が出力されてるPDFの equation.pdf を扱う。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;PyPDF2&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equation.pdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyPDF2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PdfFileReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pageは&lt;code&gt;PyPDF2._page.PageObject&lt;/code&gt;だがdictと考えて良い。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dict_keys&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Parent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Contents&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/MediaBox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Rotate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Annots&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/ArtBox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/BleedBox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/CropBox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/TrimBox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいな感じで，注釈として&lt;code&gt;'/Annots'&lt;/code&gt;に入ってるので，ここを掘る。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Annots&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IndirectObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;IndirectObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような感じで&lt;code&gt;IndirectObject&lt;/code&gt;のリストになっているので、とりあえず先頭の要素を指定して&lt;code&gt;getObject&lt;/code&gt;で取得する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Annots&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getObject&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Popup&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Parent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;/Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Annot&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;/Subtype&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Popup&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;/Rect&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;132&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;/Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Annot&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;/AP&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/N&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Filter&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/FlateDecode&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s1"&gt;&amp;#39;/Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/XObject&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s1"&gt;&amp;#39;/Subtype&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Form&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s1"&gt;&amp;#39;/FormType&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="s1"&gt;&amp;#39;/BBox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
   &lt;span class="s1"&gt;&amp;#39;/Resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/ProcSet&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/PDF&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;/Rect&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;/Contents&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%%&lt;/span&gt;&lt;span class="s1"&gt;TeX2img Document&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;% La&lt;/span&gt;&lt;span class="s1"&gt;TeX compiler: platex&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;% DVI driver: dvipdfmx&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;documentclass[fleqn,papersize]&lt;/span&gt;&lt;span class="si"&gt;{jsarticle}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;usepackage{amsmath,amssymb}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;usepackage[dvipdfmx]{graphicx,color}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;pagestyle&lt;/span&gt;&lt;span class="si"&gt;{empty}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;parindent = 0pt&lt;/span&gt;&lt;span class="se"&gt;\n\n\\&lt;/span&gt;&lt;span class="s1"&gt;renewcommand{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;kanjifamilydefault}{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;gtdefault} &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;% 日本語書体をゴシック体に&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;renewcommand{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;familydefault}{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sfdefault} &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;% 欧文書体をHelveticaに&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;setlength{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;textwidth}&lt;/span&gt;&lt;span class="si"&gt;{100mm}&lt;/span&gt;&lt;span class="se"&gt;\n\n\\&lt;/span&gt;&lt;span class="s1"&gt;begin&lt;/span&gt;&lt;span class="si"&gt;{document}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;複素電圧$ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{V}&lt;/span&gt;&lt;span class="s1"&gt;$や複素電流$ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{I}&lt;/span&gt;&lt;span class="s1"&gt;$から瞬時電圧$v$や瞬時電流$i$を求めるには$&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t} $を乗じた虚部を求めれば良い。&lt;/span&gt;&lt;span class="se"&gt;\n\n\\&lt;/span&gt;&lt;span class="s1"&gt;begin{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;mbox&lt;/span&gt;&lt;span class="si"&gt;{複素電圧:}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{V}&lt;/span&gt;&lt;span class="s1"&gt; &amp;amp;=&amp;amp; V e^{j0^&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;circ} = V&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;angle 0^&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;circ = V &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dots (4.35) &lt;/span&gt;&lt;span class="se"&gt;\\\\\n\\&lt;/span&gt;&lt;span class="s1"&gt;mbox&lt;/span&gt;&lt;span class="si"&gt;{複素電流:}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{I}&lt;/span&gt;&lt;span class="s1"&gt; &amp;amp;=&amp;amp; I e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta } = I&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;angle &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta = I (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;cos &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta + j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dots (4.36) &lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;end{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;とすると&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;begin{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;v(t) &amp;amp;=&amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{V}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;times &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t} ] =  &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; V e^{j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t}] &lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp; = &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im[ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;V (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;cos &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t ) ]&lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp; = &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;V &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t = V_m &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t&lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;i(t) &amp;amp;=&amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{I}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;times &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t} ] =  &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; I e^{j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta}  e^{j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t}]  = &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; I e^{j ( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta)}] &lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp; = &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im[ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;I &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;{ (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;cos ( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) + j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;} ] &lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt; &amp;amp; =&amp;amp;  &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;I &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) = I_m &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin ( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t+ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta)&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;end{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;end&lt;/span&gt;&lt;span class="si"&gt;{document}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;/F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;/Subtype&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/Text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と、これもdictで&lt;code&gt;'/Contents'&lt;/code&gt;に対象がある。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Annots&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getObject&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Contents&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%%&lt;/span&gt;&lt;span class="s1"&gt;TeX2img Document&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;% La&lt;/span&gt;&lt;span class="s1"&gt;TeX compiler: platex&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;% DVI driver: dvipdfmx&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;documentclass[fleqn,papersize]&lt;/span&gt;&lt;span class="si"&gt;{jsarticle}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;usepackage{amsmath,amssymb}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;usepackage[dvipdfmx]{graphicx,color}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;pagestyle&lt;/span&gt;&lt;span class="si"&gt;{empty}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;parindent = 0pt&lt;/span&gt;&lt;span class="se"&gt;\n\n\\&lt;/span&gt;&lt;span class="s1"&gt;renewcommand{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;kanjifamilydefault}{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;gtdefault} &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;% 日本語書体をゴシック体に&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;renewcommand{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;familydefault}{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sfdefault} &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;% 欧文書体をHelveticaに&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;setlength{&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;textwidth}&lt;/span&gt;&lt;span class="si"&gt;{100mm}&lt;/span&gt;&lt;span class="se"&gt;\n\n\\&lt;/span&gt;&lt;span class="s1"&gt;begin&lt;/span&gt;&lt;span class="si"&gt;{document}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;複素電圧$ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{V}&lt;/span&gt;&lt;span class="s1"&gt;$や複素電流$ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{I}&lt;/span&gt;&lt;span class="s1"&gt;$から瞬時電圧$v$や瞬時電流$i$を求めるには$&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t} $を乗じた虚部を求めれば良い。&lt;/span&gt;&lt;span class="se"&gt;\n\n\\&lt;/span&gt;&lt;span class="s1"&gt;begin{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;mbox&lt;/span&gt;&lt;span class="si"&gt;{複素電圧:}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{V}&lt;/span&gt;&lt;span class="s1"&gt; &amp;amp;=&amp;amp; V e^{j0^&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;circ} = V&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;angle 0^&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;circ = V &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dots (4.35) &lt;/span&gt;&lt;span class="se"&gt;\\\\\n\\&lt;/span&gt;&lt;span class="s1"&gt;mbox&lt;/span&gt;&lt;span class="si"&gt;{複素電流:}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{I}&lt;/span&gt;&lt;span class="s1"&gt; &amp;amp;=&amp;amp; I e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta } = I&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;angle &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta = I (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;cos &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta + j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dots (4.36) &lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;end{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;とすると&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;begin{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;v(t) &amp;amp;=&amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{V}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;times &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t} ] =  &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; V e^{j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t}] &lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp; = &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im[ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;V (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;cos &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t ) ]&lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp; = &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;V &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t = V_m &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t&lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;i(t) &amp;amp;=&amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;dot&lt;/span&gt;&lt;span class="si"&gt;{I}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;times &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; e^{j&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t} ] =  &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; I e^{j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta}  e^{j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t}]  = &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im [ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; I e^{j ( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta)}] &lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp; = &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Im[ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;I &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;{ (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;cos ( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) + j &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;} ] &lt;/span&gt;&lt;span class="se"&gt;\\\\\n&lt;/span&gt;&lt;span class="s1"&gt; &amp;amp; =&amp;amp;  &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sqrt&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;I &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin (&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t + &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta) = I_m &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;sin ( &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;omega t+ &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;theta)&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;end{eqnarray*}&lt;/span&gt;&lt;span class="se"&gt;\n\\&lt;/span&gt;&lt;span class="s1"&gt;end&lt;/span&gt;&lt;span class="si"&gt;{document}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で拾えた。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;In : print(page[&amp;#39;/Annots&amp;#39;][0].getObject()[&amp;#39;/Contents&amp;#39;])
&lt;span class="c"&gt;%%TeX2img Document&lt;/span&gt;
&lt;span class="c"&gt;% LaTeX compiler: platex&lt;/span&gt;
&lt;span class="c"&gt;% DVI driver: dvipdfmx&lt;/span&gt;
&lt;span class="k"&gt;\documentclass&lt;/span&gt;&lt;span class="na"&gt;[fleqn,papersize]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;jsarticle&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\usepackage&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;amsmath,amssymb&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\usepackage&lt;/span&gt;&lt;span class="na"&gt;[dvipdfmx]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;graphicx,color&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\pagestyle&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;empty&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\parindent&lt;/span&gt; = 0pt

&lt;span class="k"&gt;\renewcommand&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\kanjifamilydefault&lt;/span&gt;&lt;span class="nb"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\gtdefault&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;% 日本語書体をゴシック体に&lt;/span&gt;
&lt;span class="k"&gt;\renewcommand&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\familydefault&lt;/span&gt;&lt;span class="nb"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\sfdefault&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;% 欧文書体をHelveticaに&lt;/span&gt;
&lt;span class="k"&gt;\setlength&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\textwidth&lt;/span&gt;&lt;span class="nb"&gt;}{&lt;/span&gt;100mm&lt;span class="nb"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;document&lt;span class="nb"&gt;}&lt;/span&gt;
複素電圧&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="nv"&gt;\dot&lt;/span&gt;&lt;span class="nb"&gt;{V}&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;や複素電流&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="nv"&gt;\dot&lt;/span&gt;&lt;span class="nb"&gt;{I}&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;から瞬時電圧&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nb"&gt;v&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;や瞬時電流&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nb"&gt;i&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;を求めるには&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;} e^{j&lt;/span&gt;&lt;span class="nv"&gt;\omega&lt;/span&gt;&lt;span class="nb"&gt; t} &lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;を乗じた虚部を求めれば良い。

&lt;span class="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;eqnarray*&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\mbox&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;複素電圧:&lt;span class="nb"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\dot&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;V&lt;span class="nb"&gt;}&lt;/span&gt; &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt;=&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; V e&lt;span class="nb"&gt;^{&lt;/span&gt;j0&lt;span class="nb"&gt;^&lt;/span&gt;&lt;span class="k"&gt;\circ&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt; = V&lt;span class="k"&gt;\angle&lt;/span&gt; 0&lt;span class="nb"&gt;^&lt;/span&gt;&lt;span class="k"&gt;\circ&lt;/span&gt; = V &lt;span class="k"&gt;\dots&lt;/span&gt; (4.35) &lt;span class="k"&gt;\\&lt;/span&gt;
&lt;span class="k"&gt;\mbox&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;複素電流:&lt;span class="nb"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\dot&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;I&lt;span class="nb"&gt;}&lt;/span&gt; &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt;=&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; I e&lt;span class="nb"&gt;^{&lt;/span&gt;j&lt;span class="k"&gt;\theta&lt;/span&gt; &lt;span class="nb"&gt;}&lt;/span&gt; = I&lt;span class="k"&gt;\angle&lt;/span&gt; &lt;span class="k"&gt;\theta&lt;/span&gt; = I (&lt;span class="k"&gt;\cos&lt;/span&gt; &lt;span class="k"&gt;\theta&lt;/span&gt; + j&lt;span class="k"&gt;\sin&lt;/span&gt; &lt;span class="k"&gt;\theta&lt;/span&gt;) &lt;span class="k"&gt;\dots&lt;/span&gt; (4.36)
&lt;span class="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;eqnarray*&lt;span class="nb"&gt;}&lt;/span&gt;
とすると
&lt;span class="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;eqnarray*&lt;span class="nb"&gt;}&lt;/span&gt;
v(t) &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt;=&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;\Im&lt;/span&gt; [ &lt;span class="k"&gt;\dot&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;V&lt;span class="nb"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\times&lt;/span&gt; &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2&lt;span class="nb"&gt;}&lt;/span&gt; e&lt;span class="nb"&gt;^{&lt;/span&gt;j&lt;span class="k"&gt;\omega&lt;/span&gt; t&lt;span class="nb"&gt;}&lt;/span&gt; ] =  &lt;span class="k"&gt;\Im&lt;/span&gt; [ &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2&lt;span class="nb"&gt;}&lt;/span&gt; V e&lt;span class="nb"&gt;^{&lt;/span&gt;j &lt;span class="k"&gt;\omega&lt;/span&gt; t&lt;span class="nb"&gt;}&lt;/span&gt;] &lt;span class="k"&gt;\\&lt;/span&gt;
&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; = &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;\Im&lt;/span&gt;&lt;span class="na"&gt;[ \sqrt{2}V (\cos \omega t + j \sin \omega t ) ]&lt;/span&gt;&lt;span class="k"&gt;\\&lt;/span&gt;
&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; = &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2&lt;span class="nb"&gt;}&lt;/span&gt;V &lt;span class="k"&gt;\sin&lt;/span&gt; &lt;span class="k"&gt;\omega&lt;/span&gt; t = V&lt;span class="nb"&gt;_&lt;/span&gt;m &lt;span class="k"&gt;\sin&lt;/span&gt; &lt;span class="k"&gt;\omega&lt;/span&gt; t&lt;span class="k"&gt;\\&lt;/span&gt;
i(t) &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt;=&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;\Im&lt;/span&gt; [ &lt;span class="k"&gt;\dot&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;I&lt;span class="nb"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\times&lt;/span&gt; &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2&lt;span class="nb"&gt;}&lt;/span&gt; e&lt;span class="nb"&gt;^{&lt;/span&gt;j&lt;span class="k"&gt;\omega&lt;/span&gt; t&lt;span class="nb"&gt;}&lt;/span&gt; ] =  &lt;span class="k"&gt;\Im&lt;/span&gt; [ &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2&lt;span class="nb"&gt;}&lt;/span&gt; I e&lt;span class="nb"&gt;^{&lt;/span&gt;j &lt;span class="k"&gt;\theta&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;  e&lt;span class="nb"&gt;^{&lt;/span&gt;j &lt;span class="k"&gt;\omega&lt;/span&gt; t&lt;span class="nb"&gt;}&lt;/span&gt;]  = &lt;span class="k"&gt;\Im&lt;/span&gt; [ &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2&lt;span class="nb"&gt;}&lt;/span&gt; I e&lt;span class="nb"&gt;^{&lt;/span&gt;j ( &lt;span class="k"&gt;\omega&lt;/span&gt; t + &lt;span class="k"&gt;\theta&lt;/span&gt;)&lt;span class="nb"&gt;}&lt;/span&gt;] &lt;span class="k"&gt;\\&lt;/span&gt;
&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; = &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;\Im&lt;/span&gt;&lt;span class="na"&gt;[ \sqrt{2}I \{ (\cos ( \omega t + \theta) + j \sin( \omega t + \theta) \} ]&lt;/span&gt; &lt;span class="k"&gt;\\&lt;/span&gt;
 &lt;span class="nb"&gt;&amp;amp;&lt;/span&gt; =&lt;span class="nb"&gt;&amp;amp;&lt;/span&gt;  &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2&lt;span class="nb"&gt;}&lt;/span&gt;I &lt;span class="k"&gt;\sin&lt;/span&gt; (&lt;span class="k"&gt;\omega&lt;/span&gt; t + &lt;span class="k"&gt;\theta&lt;/span&gt;) = I&lt;span class="nb"&gt;_&lt;/span&gt;m &lt;span class="k"&gt;\sin&lt;/span&gt; ( &lt;span class="k"&gt;\omega&lt;/span&gt; t+ &lt;span class="k"&gt;\theta&lt;/span&gt;)
&lt;span class="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;eqnarray*&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;document&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;LaTeXiTの場合&lt;/h3&gt;
&lt;p&gt;pdfminerみたいなパッケージでTextだけ拾うなら簡単。埋め込んだTeXソースについては，エンコード済み埋め込みデータとして存在しているので，データを拾ってエンコードして，という感じになりそうだが面倒過ぎて放棄。&lt;/p&gt;</content><category term="Memo"></category><category term="TeX"></category><category term="Python"></category></entry><entry><title>書籍紹介 "OpenCVではじめよう ディープラーニングによる画像認識"</title><link href="https://eiichiromomma.github.io/2022/05/04/OpenCV-Book/" rel="alternate"></link><published>2022-05-04T19:20:00+09:00</published><updated>2022-05-04T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-05-04:/2022/05/04/OpenCV-Book/</id><summary type="html">&lt;p&gt;著者の方からご献本頂いたので早速読みました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;技術評論社 &lt;a href="https://gihyo.jp/book/2022/978-4-297-12775-6"&gt;OpenCVではじめよう ディープラーニングによる画像認識&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Book" class="alignnone" src="https://eiichiromomma.github.io/images/20220504-OpenCVBook.png" width="320"&gt;&lt;/p&gt;
&lt;p&gt;情報の取捨選択 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;著者の方からご献本頂いたので早速読みました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;技術評論社 &lt;a href="https://gihyo.jp/book/2022/978-4-297-12775-6"&gt;OpenCVではじめよう ディープラーニングによる画像認識&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Book" class="alignnone" src="https://eiichiromomma.github.io/images/20220504-OpenCVBook.png" width="320"&gt;&lt;/p&gt;
&lt;p&gt;情報の取捨選択が良いとこ突いててPythonのcv2モジュールに絞ったうえで，リファレンスとまでは行かないにせよOpenCVの関数を良い感じで網羅しています。
案外知られていない?OpenCVのdnnモジュールを使った推論のやり方についても説明があり，タイトルの通り画像認識までの最短経路の構成です。&lt;/p&gt;
&lt;p&gt;サンプルは動かしたことがあるくらいの人が次のステップに進むのにも良い感じで，ひとまずPythonのソースは読めるけど。。。という企業の方にもお勧めしやすい内容です。&lt;/p&gt;</content><category term="ゼミ"></category><category term="OpenCV"></category><category term="Python"></category><category term="Book"></category></entry><entry><title>Canvas用のQuiz作成ツール</title><link href="https://eiichiromomma.github.io/2022/05/03/text2qti/" rel="alternate"></link><published>2022-05-03T19:20:00+09:00</published><updated>2022-05-03T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-05-03:/2022/05/03/text2qti/</id><summary type="html">&lt;p&gt;色々試した結果&lt;a href="https://en.wikipedia.org/wiki/QTI"&gt;QTI形式&lt;/a&gt;だとCanvasへのインポートは問題が発生しない(設定→インポートでQTI形式を選ぶ)。Moodleのコースエクスポートも使えるが，コースのインポートなのでミスると全部吹き飛ぶ。&lt;/p&gt;
&lt;p&gt;Quizの簡単な記述法としてはMoodleでのテキスト記述の&lt;a href="https://docs.moodle.org/3x/ja/GIFT%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88"&gt;GIFT Format&lt;/a&gt;があるが，Canvasでは工夫しないと使えない。&lt;/p&gt;
&lt;p&gt;結論とし …&lt;/p&gt;</summary><content type="html">&lt;p&gt;色々試した結果&lt;a href="https://en.wikipedia.org/wiki/QTI"&gt;QTI形式&lt;/a&gt;だとCanvasへのインポートは問題が発生しない(設定→インポートでQTI形式を選ぶ)。Moodleのコースエクスポートも使えるが，コースのインポートなのでミスると全部吹き飛ぶ。&lt;/p&gt;
&lt;p&gt;Quizの簡単な記述法としてはMoodleでのテキスト記述の&lt;a href="https://docs.moodle.org/3x/ja/GIFT%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88"&gt;GIFT Format&lt;/a&gt;があるが，Canvasでは工夫しないと使えない。&lt;/p&gt;
&lt;p&gt;結論としてはざっくり2択&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pythonが使えてMarkdownが好きなら&lt;a href="https://github.com/gpoore/text2qti"&gt;text2qti&lt;/a&gt;でMarkdownからQTIに変換&lt;/li&gt;
&lt;li&gt;php7が使える環境なら&lt;a href="https://marketplace.visualstudio.com/items?itemName=ethan-ou.vscode-gift-pack&amp;amp;ssr=false#overview"&gt;GIFT Format拡張機能&lt;/a&gt;と&lt;a href="https://github.com/csev/gift2qti"&gt;gift2qti&lt;/a&gt;でGIFTからQTIに変換&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;Markdown から QTI&lt;/h3&gt;
&lt;h4&gt;&lt;a href="https://github.com/gpoore/text2qti"&gt;text2qti&lt;/a&gt; (要Python, 動作確認済み)&lt;/h4&gt;
&lt;p&gt;配布元のページのサンプルを見れば書き方は直ぐに分かる。&lt;/p&gt;
&lt;p&gt;上記のより&lt;a href="https://github.com/molpopgen/md2Canvas"&gt;発展的な使い方&lt;/a&gt;(Github, bitbucket連携)&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;GIFT FormatからQTI&lt;/h3&gt;
&lt;p&gt;MoodleでのGIFT Format利用を想定したツールが殆どで，QTIへの変換についてはgift2qti一択な状況。
GIFT FormatをCanvasで利用するには&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gift2qtiで変換してインポート&lt;/li&gt;
&lt;li&gt;GIFT Formatで書いた問題をMoodleのコースに入れて，エクスポートしたデータをCanvasにインポート&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の手段しかない。
既にパーサーはあるのでCanvas側が本気になればXMLへのコンバートなので楽にインポートできる筈なのだが。&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ethan-ou.vscode-gift-pack&amp;amp;ssr=false#overview"&gt;GIFT Format拡張機能&lt;/a&gt; (要VS Code, 動作確認済み)&lt;/h4&gt;
&lt;p&gt;VS Codeでガシガシ補間してくれながらプレビュー付きで使える。&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://www.microsoft.com/ja-jp/p/moodle-test-creator/9nx4z4k7xn8x"&gt;Moodle Test Creatorアプリ&lt;/a&gt;(Windows, 動作未確認)&lt;/h4&gt;
&lt;p&gt;起動までは確認したが面倒そうなので放置。&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://github.com/csev/gift2qti"&gt;gift2qti&lt;/a&gt; (要PHP7, 動作確認済み)&lt;/h4&gt;
&lt;p&gt;ローカルのWebサイトとして動作する。PHP 7.x まで利用可能(現行のPHP8だと動かない)。PHP7が動く環境があるならCanvasへプラグインのような形で取り込みも可能。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.tsugi.org/gift2qti/"&gt;デモサイト&lt;/a&gt;もあるが常用はお勧めしない。&lt;/p&gt;
&lt;h5&gt;macOSでhomebrewのphp7を使った例&lt;/h5&gt;
&lt;h6&gt;php 7.xのインストールとソースの入手&lt;/h6&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;php@7.4
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/csev/gift2qti.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でgift2qtiフォルダに移動してからサーバーとして起動すれば良い。強引だがrcファイルを書き換えなくとも下記でいける。&lt;/p&gt;
&lt;h6&gt;起動方法&lt;/h6&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gift2qti
&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/opt/php@7.4/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;php&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;localhost:8000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;あとは&lt;a href="http://localhost:8000/"&gt;ローカルのサーバ(コマンドで指定したport 8000)&lt;/a&gt;を開けば良い。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;(動作確認できず) &lt;a href="https://github.com/OklahomaChristian/BlackboardQuizGenerator"&gt;BlackBoard形式からQTI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ASP.NETで動くらしい。IISをローカルで起動すれば動くと思われるが，&lt;a href="https://ed.oc.edu/blackboardquizgenerator/"&gt;デモサイト&lt;/a&gt;で生成したデータのインポートは失敗&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;以下未確認いろいろ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/backyardbiomech/qtiConverter"&gt;qtiConverter App&lt;/a&gt; テキストから変換(Macのみ)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nenad/CSV2QTI"&gt;CSV2QTI&lt;/a&gt; CSVから変換(Python)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://canconvert.k-state.edu/qti/"&gt;Kansas State Universityのcsv2qti&lt;/a&gt; CSVから変換 &lt;/li&gt;
&lt;/ul&gt;</content><category term="Memo"></category><category term="Canvas"></category><category term="Python"></category><category term="Markdown"></category></entry><entry><title>Google Cloud Shellの日本語化(gcc込み)</title><link href="https://eiichiromomma.github.io/2022/04/20/CloudShellEditor/" rel="alternate"></link><published>2022-04-20T21:20:00+09:00</published><updated>2022-04-20T21:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-04-20:/2022/04/20/CloudShellEditor/</id><summary type="html">&lt;p&gt;Webブラウザ上でコーディングとshellによる操作が可能な&lt;a href="https://ide.cloud.google.com/?hl=ja"&gt;Cloud Shell Editor&lt;/a&gt;がとても便利なので，夏季集中のコンピュータプログラミングで利用できないかと画策中。&lt;/p&gt;
&lt;p&gt;機能的にはエデ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Webブラウザ上でコーディングとshellによる操作が可能な&lt;a href="https://ide.cloud.google.com/?hl=ja"&gt;Cloud Shell Editor&lt;/a&gt;がとても便利なので，夏季集中のコンピュータプログラミングで利用できないかと画策中。&lt;/p&gt;
&lt;p&gt;機能的にはエディタはVS Codeの拡張機能組込み版みたいな感じで，Shellの方はDebianが動いている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/issue
Debian&lt;span class="w"&gt; &lt;/span&gt;GNU/Linux&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ただし，どちらも日本語は表示は可能でもメニュー等は英語のまま。せめてShellのメッセージやmanを日本語化しようということで，Debianの日本語化の方法を一通り実行。&lt;/p&gt;
&lt;h3&gt;確認作業&lt;/h3&gt;
&lt;p&gt;ここで説明している作業を実施しても，セッションが切れると環境がリセットされるが，短時間ブラウザを閉じた程度だと継続してくれている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;locale&lt;span class="w"&gt; &lt;/span&gt;-a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とやって&lt;code&gt;ja_JP.utf-8&lt;/code&gt;が存在していれば作業不要。&lt;/p&gt;
&lt;h3&gt;日本語化&lt;/h3&gt;
&lt;p&gt;以下をコピペする&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo &amp;#39;ja_JP.UTF-8 UTF-8&amp;#39; &amp;gt;&amp;gt;  /etc/locale.gen&amp;quot;&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;locale-gen
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;task-japanese&lt;span class="w"&gt; &lt;/span&gt;-y
wget&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;https://github.com/gcc-mirror/gcc/raw/releases/gcc-10/gcc/po/ja.po
msgfmt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;ja.po
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;/usr/share/locale/ja/LC_MESSAGES/gcc-10.mo
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export LANG=ja_JP.utf-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;わかりやすいかは疑問だが英語で思考停止する人には良い。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20220420-cse.png" width="600"&gt;&lt;/p&gt;
&lt;h4&gt;分けて説明&lt;/h4&gt;
&lt;p&gt;localeとしてja_JP.utf-8が有効になっていないので&lt;code&gt;/etc/locale.gen&lt;/code&gt;ファイルに追記し，locale-genで生成する。あとtask-japaneseは日本語manとか。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo &amp;#39;ja_JP.UTF-8 UTF-8&amp;#39; &amp;gt;&amp;gt;  /etc/locale.gen&amp;quot;&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;locale-gen
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;task-japanese&lt;span class="w"&gt; &lt;/span&gt;-y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;gccの.moファイル(メッセージのローカライゼーションファイル)が無いのでgccのソースミラーから拾って生成する。moファイルは実体と一致しないとダメなので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/gcc
/usr/bin/gcc:&lt;span class="w"&gt; &lt;/span&gt;symbolic&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;gcc-10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で出てきたgcc-10に合わせている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;https://github.com/gcc-mirror/gcc/raw/releases/gcc-10/gcc/po/ja.po
msgfmt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;ja.po
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;gcc.mo&lt;span class="w"&gt; &lt;/span&gt;/usr/share/locale/ja/LC_MESSAGES/gcc-10.mo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;シェルを開いたときにja_JP.utf-8が環境変数LANGになるよう設定して読み込み&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export LANG=ja_JP.utf-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Memo"></category><category term="C"></category><category term="Lecture"></category><category term="Debian"></category><category term="gcc"></category></entry><entry><title>Raspberry-pi+Slackで入退室管理</title><link href="https://eiichiromomma.github.io/2022/04/15/nfcpy/" rel="alternate"></link><published>2022-04-15T19:20:00+09:00</published><updated>2022-04-15T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-04-15:/2022/04/15/nfcpy/</id><summary type="html">&lt;p&gt;コロナ禍で研究室がスッカラカンな状態でしたが，今年度からはかなり人の出入りも増えてきたので入退室記録の …&lt;/p&gt;</summary><content type="html">&lt;p&gt;コロナ禍で研究室がスッカラカンな状態でしたが，今年度からはかなり人の出入りも増えてきたので入退室記録のシステムを作りました。
使ったのはSonyのICカードリーダー RC-S380。Windows, macOS以外だと選択肢がこれ以外ほぼ無い状態のようです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;特定のiSerialNumberのUSB機器を探す&lt;/li&gt;
&lt;li&gt;機器のUSB busとaddressを取得して接続&lt;/li&gt;
&lt;li&gt;数秒おきにNFCリーダーの入力待機&lt;/li&gt;
&lt;li&gt;NFCリーダーで学生証のIDを読む&lt;/li&gt;
&lt;li&gt;音を鳴らす&lt;/li&gt;
&lt;li&gt;予め用意したdictに従ってID-&amp;gt;人名変換をする&lt;/li&gt;
&lt;li&gt;Slackにメッセージを投げる&lt;/li&gt;
&lt;li&gt;3に戻る&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;と，やってることは至ってシンプル。メッセージについては各自について入室状況を保持してトグル処理を考えたものの，大抵タッチし忘れたときに破綻するので毎日リセットとか色々面倒なので，入室用と退室用でICカードリーダーを別にする最もシンプルな方法に決定。&lt;/p&gt;
&lt;p&gt;一番面倒だったのはpynfcとRC-S380の接続で，USBのバス番号は接続状況で変わる可能性があるのと，入室用と退室用を確実に決め打ちできるシリアルナンバー(iSerialNumber)をpyUsbでスキャン。ちなみにidVendor 0x054cはSony。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;usb&lt;/span&gt;
&lt;span class="n"&gt;devs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;usb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;find_all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idVendor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x054c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;devs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でずらずらと表示される一覧のiSerialNumberがそれ。ただしstringなので注意。 find(serial_number='xxxxx')となる。&lt;/p&gt;
&lt;p&gt;もう一つの課題としては，どう自動実行するかで，Raspberry piの起動時にサービスとして走らせる方法がよく紹介されているものの，それも面倒なので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;crontab&lt;span class="w"&gt; &lt;/span&gt;-e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で @rebootを指定して入室待機と退室待機の2つのスクリプトを走らせる手抜きで対応。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;nfc&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;binascii&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;usb&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="sd"&gt;https://api.slack.com/&lt;/span&gt;
&lt;span class="sd"&gt;からCreate an appでbotを作る&lt;/span&gt;
&lt;span class="sd"&gt;https://note.com/npaka/n/n4bcb38a1ea74&lt;/span&gt;
&lt;span class="sd"&gt;らへん参照。多少UIは変わってるが問題ない。&lt;/span&gt;
&lt;span class="sd"&gt;そっちのテストは&lt;/span&gt;
&lt;span class="sd"&gt;https://api.slack.com/methods/chat.postMessage/test&lt;/span&gt;
&lt;span class="sd"&gt;からやる&lt;/span&gt;
&lt;span class="sd"&gt;CHANNELで指定するチャンネルは予め作るBotを指定してインストールしておく必要あり(チャンネルの設定→インテグレーション)&lt;/span&gt;
&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ここに取得したtokenが入る&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;CHANNEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;入退室記録&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://slack.com/api/chat.postMessage&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bearer &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 入室USB ID &amp;#39;1412926&amp;#39; #うちのはこれだったが当然個体で変わる&lt;/span&gt;
&lt;span class="c1"&gt;# 退室USB ID &amp;#39;1413147&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;usbid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1412926&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;#これで入室用か退室用かを決める(もうちょいエレガントな方法もあるが手抜き)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;usbid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1412926&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;msg_valid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; が入室しました :tada: &amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;msg_warn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; が入室しました。 :warning: &amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;mp3file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Enter.mp3&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="n"&gt;msg_valid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; が退室しました :wave:&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;msg_warn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; が退室しました。 :warning: &amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;mp3file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Leave.mp3&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;members&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;#IDと名前の対応テーブル&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;0000000000000000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;aaaaa&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;1111111111111111&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Momma&amp;#39;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;idm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dt_now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%Y%m&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;-%H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;who&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;members&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="s1"&gt;&amp;#39;channel&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CHANNEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s1"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dt_now&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;who&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;msg_valid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="s1"&gt;&amp;#39;channel&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CHANNEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s1"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dt_now&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; 不明ID &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idm&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;msg_warn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Unknown ID &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idm&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# pythonからスマートに音が出ないのでsubprocessに逃げた&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Popen&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mpg123&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mp3file&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="sd"&gt;シリアルナンバー決め打ちでUSB デバイスを探す&lt;/span&gt;
&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serial_str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;usb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serial_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serial_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usbid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;usb_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;usb:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;#03&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;#03&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;nfc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContactlessFrontend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usb_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rdwr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;on-connect&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で，完成。↓のような感じで運用(スピーカーの裏にRaspberry piがある)&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20220415-nfcpy.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;Slackにはこんな感じで送られてくる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20220415-nfcpy-slack.png" width="600"&gt;&lt;/p&gt;</content><category term="Memo"></category><category term="Python"></category><category term="Slack"></category><category term="Raspberry-pi"></category></entry><entry><title>Moorebot Scout</title><link href="https://eiichiromomma.github.io/2022/04/09/moorebot-scout/" rel="alternate"></link><published>2022-04-09T09:20:00+09:00</published><updated>2022-04-09T09:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-04-09:/2022/04/09/moorebot-scout/</id><summary type="html">&lt;p&gt;KickstarterでROSも使える面白そうな&lt;a href="https://www.moorebot.com/pages/moorebot-scout"&gt;自律走行ロボット Moorebot Scout&lt;/a&gt;が出ていたのでバッカーになってました。
去年6月に発送予定ということで去年の卒研にも使おうと思っていたところで半導体・部材の世界的不足に巻き込まれ，半年く …&lt;/p&gt;</summary><content type="html">&lt;p&gt;KickstarterでROSも使える面白そうな&lt;a href="https://www.moorebot.com/pages/moorebot-scout"&gt;自律走行ロボット Moorebot Scout&lt;/a&gt;が出ていたのでバッカーになってました。
去年6月に発送予定ということで去年の卒研にも使おうと思っていたところで半導体・部材の世界的不足に巻き込まれ，半年くらい遅れて届いた3体。まともに触るタイミングがまるで無かったのですが新年度ということでファームウェアアップデート。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20220409-MoorebotScout.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category><category term="ROS"></category></entry><entry><title>Classroomから受講者名簿の生成</title><link href="https://eiichiromomma.github.io/2022/04/08/classroom/" rel="alternate"></link><published>2022-04-08T20:20:00+09:00</published><updated>2022-04-08T20:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-04-08:/2022/04/08/classroom/</id><summary type="html">&lt;p&gt;長期に渡り使われてきたCSTポータルIIが遂に廃止となりました。ClassroomとCanvasが乗り換え先な訳ですが，ClassroomはSIS (Student Information System)との連携前提なので学生番号という概念がなく，Web UIだけだと受講者を選択してメール送信を選んでようやくユニークな情報に到達する面倒な状態なのでGoogle Apps Scriptで特定の担当コースの学生情報(アドレス,氏名)を抽 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;長期に渡り使われてきたCSTポータルIIが遂に廃止となりました。ClassroomとCanvasが乗り換え先な訳ですが，ClassroomはSIS (Student Information System)との連携前提なので学生番号という概念がなく，Web UIだけだと受講者を選択してメール送信を選んでようやくユニークな情報に到達する面倒な状態なのでGoogle Apps Scriptで特定の担当コースの学生情報(アドレス,氏名)を抽出してみました。&lt;/p&gt;
&lt;p&gt;Classroom APIで情報取得する際はページ単位(30個/ページ がデフォルト)で持って来ようとするので，ページあたりのデータ数を増やしてもっと寄越せと指定しても仕様で「いっぱいくれと言われてもあげないよ」と書かれており，&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;取得(pageToken(今どこまで読んだか)も返される)&lt;/li&gt;
&lt;li&gt;読んだデータを別バッファにpush&lt;/li&gt;
&lt;li&gt;貰ったpageTokenを示しつつ取得&lt;/li&gt;
&lt;li&gt;pageTokenがnullになるまで繰り返し&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という処理になる。
↓は手を抜いていて実際には&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Classroom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;だと30個までしかコースは取得できないのだが30個以上コース持つことは無いだろうということでそのまま。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// 一覧を抽出するコース名 (Classroom)上の名前&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;courseName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;画像処理&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Classroom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myCourses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;courses&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myCourses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myCourses&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//デバッグ用に表示&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;//コース名はアーカイブされているものは重複しても許されるので courseStateの確認が必要&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myCourses&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;courseName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myCourses&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;courseState&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ARCHIVED&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;inviteClassId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myCourses&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pageToken&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;studentsString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;//どう頑張っても小塊でしか拾ってくれない(デフォ30)ので，Students.list での取得時にトークンを渡す&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;//トークンは取得ごとに更新されるので do - whileの最後に nextPageTokenに置換えると次のページを取得できる&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Classroom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inviteClassId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pageToken&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pageToken&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;students&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;//ここは雑にカンマ区切りのstringを作ってしまう。データごとに改行を入れる&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;studentsString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;studentsString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;students&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;emailAddress&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;students&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fullName&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;students&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;familyName&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;students&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;givenName&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;pageToken&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextPageToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pageToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text/plain&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;charset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// スクリプトの場所を取得する術がなさそうなのでまんま実行。MyDriveのルートにファイルが作られる&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Utilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newBlob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;courseName&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;setDataFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;studentsString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;charset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;DriveApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;※挙動が不明だったので冗長に書いてます&lt;/p&gt;
&lt;p&gt;実際にはGoogle Driveで新規作成からGoogle Apps Scriptを選んで(なければ追加)，サービスからClassroom APIを追加し，ソースをコピペして実行すれば良い。&lt;/p&gt;</content><category term="Memo"></category><category term="Classroom"></category><category term="GAS"></category></entry><entry><title>CanvasのSandbox WSL2編</title><link href="https://eiichiromomma.github.io/2022/04/01/Canvas-Sandbox-WSL2/" rel="alternate"></link><published>2022-04-01T06:00:00+09:00</published><updated>2022-04-01T06:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-04-01:/2022/04/01/Canvas-Sandbox-WSL2/</id><summary type="html">&lt;p&gt;LMSのCanvasのSandbox作成のWSL2編。WSL2ならではの問題でハマった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL2 + Ubuntu 18.04 は自力で入れましょう&lt;/li&gt;
&lt;li&gt;18.04必須です(20.04は×)&lt;/li&gt;
&lt;li&gt;doryが必要(Webサービスをlocal動作させる際，偽のFQDNをいい感じにmapしてくれるらしい)&lt;/li&gt;
&lt;li&gt;WSL2上でのdocker諸々必要&lt;/li&gt;
&lt;li&gt;mutagenが必要(dockerのバインドマウントを高速化)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;まず時間を合わせとツール入れ&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ntpdate&lt;span class="w"&gt; &lt;/span&gt;time.google.com
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;LMSのCanvasのSandbox作成のWSL2編。WSL2ならではの問題でハマった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL2 + Ubuntu 18.04 は自力で入れましょう&lt;/li&gt;
&lt;li&gt;18.04必須です(20.04は×)&lt;/li&gt;
&lt;li&gt;doryが必要(Webサービスをlocal動作させる際，偽のFQDNをいい感じにmapしてくれるらしい)&lt;/li&gt;
&lt;li&gt;WSL2上でのdocker諸々必要&lt;/li&gt;
&lt;li&gt;mutagenが必要(dockerのバインドマウントを高速化)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;まず時間を合わせとツール入れ&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ntpdate&lt;span class="w"&gt; &lt;/span&gt;time.google.com
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;upgrade&lt;span class="w"&gt; &lt;/span&gt;-y
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ruby&lt;span class="w"&gt; &lt;/span&gt;build-essential&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;doryを入れる&lt;/h3&gt;
&lt;p&gt;doryは普通にgemで入る&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;gem&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;dory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Canvasのソースを拾ってくる&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/instructure/canvas-lms.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;canvas-lms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;依存アプリを入れて環境構築&lt;/h3&gt;
&lt;p&gt;要mutagenなのだが&lt;a href="https://mutagen.io/documentation/introduction/installation"&gt;homebrewしか楽に入れる方法がない&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt;のコマンド&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/bin/bash&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行するのだが，その後に設定が必要。admin不要としたいがために&lt;a href="https://docs.brew.sh/Homebrew-on-Linux"&gt;/home/linuxbrewへインストールされる&lt;/a&gt;らしい。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;~/.linuxbrew&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;~/.linuxbrew/bin/brew&lt;span class="w"&gt; &lt;/span&gt;shellenv&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;/home/linuxbrew/.linuxbrew&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;/home/linuxbrew/.linuxbrew/bin/brew&lt;span class="w"&gt; &lt;/span&gt;shellenv&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;~/.bash_profile&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eval \&amp;quot;\$(&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;brew&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/bin/brew shellenv)\&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bash_profile
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eval \&amp;quot;\$(&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;brew&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/bin/brew shellenv)\&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とかやって&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;の後に&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;hello
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で確認できる。&lt;/p&gt;
&lt;p&gt;で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mutagen-io/mutagen/mutagen
brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mutagen-io/mutagen/mutagen-compose
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でmutagenとmutagen-composeを入れる。&lt;/p&gt;
&lt;h3&gt;WSL2固有の作業&lt;/h3&gt;
&lt;p&gt;ここからはWSL2固有の問題で，IPv6優先の設定が災いしてgemsとyarnの導入で必ずコケる。後に載せたdiff通りDockerfileに記載するだけでは解決しない。( /etc/gai.confに &lt;code&gt;echo precedence ::ffff:0:0/96  100&lt;/code&gt;とか書いてるのがそれ)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./script/docker_dev_setup.sh&lt;span class="w"&gt; &lt;/span&gt;--mutagen
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行するとまず&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Bundle&lt;span class="w"&gt; &lt;/span&gt;install...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のところで&lt;code&gt;Gem::RemoteFetcher::UnknownHostError timed out&lt;/code&gt;でコケる。これはhostsに rubygems.org に対応するIPを書いて解決する。また，その後で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Yarn&lt;span class="w"&gt; &lt;/span&gt;install....
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のところで必ず &lt;code&gt;getaddrinfo EAI_AGAIN registry.yarnpkg.com&lt;/code&gt;でコケるので 8.8.8.8 を /etc/resolv.conf に書き込んだりする。&lt;/p&gt;
&lt;p&gt;実際の対処方法は，この時点でコンテナは出来上がっているので，canvas-lms-web-1 に入り込んで上記を書き込む。&lt;/p&gt;
&lt;p&gt;まず，hostコマンドでrubygems.orgのIPを確認する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;host&lt;span class="w"&gt; &lt;/span&gt;rubygems.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;rubygems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;151.101.65.227&lt;/span&gt;
&lt;span class="nx"&gt;rubygems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;151.101.193.227&lt;/span&gt;
&lt;span class="nx"&gt;rubygems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;151.101.129.227&lt;/span&gt;
&lt;span class="nx"&gt;rubygems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;151.101.1.227&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;と出た例を以下に示す。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="o"&gt;=&lt;/span&gt;root&lt;span class="w"&gt; &lt;/span&gt;canvas-lms-web-1&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で canvas-lms-web-1 のコンテナにrootで入り&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;151.101.65.227    rubygems.org&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/hosts
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;151.101.193.227    rubygems.org&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/hosts
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;151.101.129.227    rubygems.org&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/hosts
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;151.101.1.227    rubygems.org&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/hosts
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nameserver 8.8.8.8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で書き換え完了。このままscript/docker_dev_setup.shを再度実行するとまたbuildされてしまうので，同ファイルをコピーして&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cp&lt;span class="w"&gt; &lt;/span&gt;script/docker_dev_setup.sh&lt;span class="w"&gt; &lt;/span&gt;script/docker_dev_build_assets.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;としたうえで，その中を&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;create_log_file
init_log_file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Docker Dev Setup&amp;quot;&lt;/span&gt;
os_setup
message&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Now we can set up Canvas!&amp;#39;&lt;/span&gt;
&lt;span class="c1"&gt;# copy_docker_config&lt;/span&gt;
&lt;span class="c1"&gt;# setup_docker_compose_override&lt;/span&gt;
&lt;span class="c1"&gt;# build_images&lt;/span&gt;
&lt;span class="c1"&gt;# docker_compose_up&lt;/span&gt;
&lt;span class="c1"&gt;# check_gemfile&lt;/span&gt;
build_assets
create_db
display_next_steps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のように コケたところから再開するようにコメントアウトして，そのスクリプトを実行する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./script/docker_dev_build_assets.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で Success !と出たら成功。&lt;/p&gt;
&lt;h3&gt;mutagen-compose up&lt;/h3&gt;
&lt;p&gt;mutagen-composeでupする(ちなみにupで開始だからdownとやるとcontainersが全部消える)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mutagen-compose&lt;span class="w"&gt; &lt;/span&gt;up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で，暫く待ってると&lt;code&gt;webpack_1&lt;/code&gt;からのログが終わって&lt;code&gt;jobs_1&lt;/code&gt;からのログが流れるので，ブラウザで &lt;a href="http://localhost/"&gt;http://localhost&lt;/a&gt;を開くとCanvasのログイン画面になれば順調。&lt;/p&gt;
&lt;h3&gt;Canvasのアカウント作成&lt;/h3&gt;
&lt;p&gt;この状態だとアカウントが無い状態なのでcontainerの中のrailsでアカウントを作成する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;ps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で確認してIMAGEが&lt;code&gt;canvas-lms_web&lt;/code&gt;のNAMESを見る(たぶんcanvas-lms_web_1)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;canvas-lms_web_1&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でコンテナに入ると&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;root@xxxxxxxxxxx:/usr/src/app#
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようなプロンプトになるので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rails&lt;span class="w"&gt; &lt;/span&gt;db:initial_setup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行すると色々聞かれる。&lt;/p&gt;
&lt;p&gt;※アカウント名(the account name)なのだが，特殊な用語で大学-学部-学科のようなツリーを考えたときの大学に相当する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="m"&gt;1&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;development:public
What&lt;span class="w"&gt; &lt;/span&gt;email&lt;span class="w"&gt; &lt;/span&gt;address&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;administrator&lt;span class="w"&gt; &lt;/span&gt;account&lt;span class="w"&gt; &lt;/span&gt;use?&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;ログインIDになるメールアドレスを入力&lt;span class="o"&gt;]&lt;/span&gt;
Please&lt;span class="w"&gt; &lt;/span&gt;confirm&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;ログインIDになるメールアドレスを入力&lt;span class="o"&gt;]&lt;/span&gt;
What&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;administrator&lt;span class="w"&gt; &lt;/span&gt;use?&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;パスワードを入力&lt;span class="o"&gt;]&lt;/span&gt;
Please&lt;span class="w"&gt; &lt;/span&gt;confirm&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;パスワードを入力&lt;span class="o"&gt;]&lt;/span&gt;
What&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;users&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;see&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;account&lt;span class="w"&gt; &lt;/span&gt;name?&lt;span class="w"&gt; &lt;/span&gt;This&lt;span class="w"&gt; &lt;/span&gt;should&lt;span class="w"&gt; &lt;/span&gt;probably&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;name&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;organization.&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;他のユーザーから見たアカウント名&lt;span class="o"&gt;]&lt;/span&gt;
To&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;our&lt;span class="w"&gt; &lt;/span&gt;developers&lt;span class="w"&gt; &lt;/span&gt;better&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;you,&lt;span class="w"&gt; &lt;/span&gt;Instructure&lt;span class="w"&gt; &lt;/span&gt;would&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;collect&lt;span class="w"&gt; &lt;/span&gt;some&lt;span class="w"&gt; &lt;/span&gt;usage&lt;span class="w"&gt; &lt;/span&gt;data&lt;span class="w"&gt; &lt;/span&gt;about&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;Canvas&lt;span class="w"&gt; &lt;/span&gt;installation.&lt;span class="w"&gt; &lt;/span&gt;You&lt;span class="w"&gt; &lt;/span&gt;can&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;setting&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;any&lt;span class="w"&gt; &lt;/span&gt;time.:
&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Opt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Only&lt;span class="w"&gt; &lt;/span&gt;send&lt;span class="w"&gt; &lt;/span&gt;anonymized&lt;span class="w"&gt; &lt;/span&gt;data
&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Opt&lt;span class="w"&gt; &lt;/span&gt;out&lt;span class="w"&gt; &lt;/span&gt;completely
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;開発元に情報を送るかどうかなので2の匿名化か3の拒否が無難&lt;span class="o"&gt;]&lt;/span&gt;
Thank&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;participating&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;anonymous&lt;span class="w"&gt; &lt;/span&gt;usage&lt;span class="w"&gt; &lt;/span&gt;collection.
You&lt;span class="w"&gt; &lt;/span&gt;can&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;feature&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;any&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;by&lt;span class="w"&gt; &lt;/span&gt;running&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;rake&lt;span class="w"&gt; &lt;/span&gt;task&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;rake db:configure_statistics_collection&amp;#39;&lt;/span&gt;
........................................................................................
Notifications&lt;span class="w"&gt; &lt;/span&gt;Loaded
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assignment&lt;span class="w"&gt; &lt;/span&gt;Publishing&lt;span class="w"&gt; &lt;/span&gt;Reminder
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assignment&lt;span class="w"&gt; &lt;/span&gt;Grading&lt;span class="w"&gt; &lt;/span&gt;Reminder
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assignment&lt;span class="w"&gt; &lt;/span&gt;Due&lt;span class="w"&gt; &lt;/span&gt;Date&lt;span class="w"&gt; &lt;/span&gt;Reminder
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Rubric&lt;span class="w"&gt; &lt;/span&gt;Assessment&lt;span class="w"&gt; &lt;/span&gt;Invitation
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Migration&lt;span class="w"&gt; &lt;/span&gt;Export&lt;span class="w"&gt; &lt;/span&gt;Ready
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Migration&lt;span class="w"&gt; &lt;/span&gt;Import&lt;span class="w"&gt; &lt;/span&gt;Finished
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Migration&lt;span class="w"&gt; &lt;/span&gt;Import&lt;span class="w"&gt; &lt;/span&gt;Failed

Initial&lt;span class="w"&gt; &lt;/span&gt;data&lt;span class="w"&gt; &lt;/span&gt;loaded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で完了。が，doryのproxyはあくまでもWSL2上で機能していて，Windowsでは使えないので &lt;a href="http://localhost/"&gt;http://localhost/&lt;/a&gt; を開くとCanvasのログイン画面が出てくる。&lt;/p&gt;
&lt;h3&gt;git  diff&lt;/h3&gt;
&lt;p&gt;たぶん不要な情報もあるが動いてるからそのまま&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;diff --git a/Dockerfile b/Dockerfile&lt;/span&gt;
&lt;span class="gh"&gt;index f973e5f232..f4c0d79620 100644&lt;/span&gt;
&lt;span class="gd"&gt;--- a/Dockerfile&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/Dockerfile&lt;/span&gt;
&lt;span class="gu"&gt;@@ -33,9 +33,11 @@ ARG USER_ID&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;# Without it, some linux distributions are unable to write at all to the host mounted volume.
&lt;span class="w"&gt; &lt;/span&gt;RUN if [ -n &amp;quot;$USER_ID&amp;quot; ]; then usermod -u &amp;quot;${USER_ID}&amp;quot; docker \
&lt;span class="w"&gt; &lt;/span&gt;        &amp;amp;&amp;amp; chown --from=9999 docker /usr/src/nginx /usr/src/app -R; fi
&lt;span class="gd"&gt;-&lt;/span&gt;
&lt;span class="gi"&gt;+RUN echo &amp;quot;precedence ::ffff:0:0/96  100&amp;quot; &amp;gt;&amp;gt; /etc/gai.conf&lt;/span&gt;
&lt;span class="gi"&gt;+RUN apt-get update; apt-get install wget -y&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \
&lt;span class="gd"&gt;-  &amp;amp;&amp;amp; curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="gi"&gt;+  &amp;amp;&amp;amp; wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="gi"&gt;+  # &amp;amp;&amp;amp; curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; echo &amp;quot;deb https://dl.yarnpkg.com/debian/ stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/yarn.list \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; printf &amp;#39;path-exclude /usr/share/doc/*\npath-exclude /usr/share/man/*&amp;#39; &amp;gt; /etc/dpkg/dpkg.cfg.d/01_nodoc \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; echo &amp;quot;deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main&amp;quot; &amp;gt; /etc/apt/sources.list.d/pgdg.list \
&lt;span class="gu"&gt;@@ -64,7 +66,12 @@ RUN if [ -e /var/lib/gems/$RUBY_MAJOR.0/gems/bundler-* ]; then BUNDLER_INSTALL=&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; gem uninstall --all --ignore-dependencies --force $BUNDLER_INSTALL bundler \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; gem install bundler --no-document -v $BUNDLER_VERSION \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; find $GEM_HOME ! -user docker | xargs chown docker:docker
&lt;span class="gi"&gt;+# RUN gem update --system&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;RUN npm install -g npm@latest &amp;amp;&amp;amp; npm cache clean --force
&lt;span class="gi"&gt;+RUN echo &amp;quot;151.101.193.227 rubygems.org&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;/span&gt;
&lt;span class="gi"&gt;+RUN echo &amp;quot;151.101.1.227 rubygems.org&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;/span&gt;
&lt;span class="gi"&gt;+RUN echo &amp;quot;151.101.129.227 rubygems.org&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;/span&gt;
&lt;span class="gi"&gt;+RUN echo &amp;quot;151.101.65.227 rubygems.org&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;USER docker

&lt;span class="gh"&gt;diff --git a/Dockerfile.jenkins b/Dockerfile.jenkins&lt;/span&gt;
&lt;span class="gh"&gt;index 9f5a765399..a4f2ca3520 100644&lt;/span&gt;
&lt;span class="gd"&gt;--- a/Dockerfile.jenkins&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/Dockerfile.jenkins&lt;/span&gt;
&lt;span class="gu"&gt;@@ -28,8 +28,10 @@ ENV BUNDLE_APP_CONFIG /home/docker/.bundle&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;WORKDIR $APP_HOME

&lt;span class="w"&gt; &lt;/span&gt;USER root
&lt;span class="gi"&gt;+RUN apt-get update; apt-get install wget -y&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \
&lt;span class="gd"&gt;-  &amp;amp;&amp;amp; curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="gi"&gt;+  &amp;amp;&amp;amp; wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="gi"&gt;+  # &amp;amp;&amp;amp; curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; echo &amp;quot;deb https://dl.yarnpkg.com/debian/ stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/yarn.list \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; printf &amp;#39;path-exclude /usr/share/doc/*\npath-exclude /usr/share/man/*&amp;#39; &amp;gt; /etc/dpkg/dpkg.cfg.d/01_nodoc \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; echo &amp;quot;deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main&amp;quot; &amp;gt; /etc/apt/sources.list.d/pgdg.list \
&lt;span class="gh"&gt;diff --git a/build/Dockerfile.template b/build/Dockerfile.template&lt;/span&gt;
&lt;span class="gh"&gt;index 61e680d71b..ec0cde9222 100644&lt;/span&gt;
&lt;span class="gd"&gt;--- a/build/Dockerfile.template&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/build/Dockerfile.template&lt;/span&gt;
&lt;span class="gu"&gt;@@ -42,8 +42,10 @@ RUN if [ -n &amp;quot;$USER_ID&amp;quot; ]; then usermod -u &amp;quot;${USER_ID}&amp;quot; docker \&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;        &amp;amp;&amp;amp; chown --from=9999 docker /usr/src/nginx /usr/src/app -R; fi

&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;% end -%&amp;gt;
&lt;span class="gi"&gt;+RUN apt-get update; apt-get install wget -y&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \
&lt;span class="gd"&gt;-  &amp;amp;&amp;amp; curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="gi"&gt;+  &amp;amp;&amp;amp; wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="gi"&gt;+  # &amp;amp;&amp;amp; curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; echo &amp;quot;deb https://dl.yarnpkg.com/debian/ stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/yarn.list \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; printf &amp;#39;path-exclude /usr/share/doc/*\npath-exclude /usr/share/man/*&amp;#39; &amp;gt; /etc/dpkg/dpkg.cfg.d/01_nodoc \
&lt;span class="w"&gt; &lt;/span&gt;  &amp;amp;&amp;amp; echo &amp;quot;deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main&amp;quot; &amp;gt; /etc/apt/sources.list.d/pgdg.list \
&lt;span class="gh"&gt;diff --git a/script/common/utils/dory_setup.sh b/script/common/utils/dory_setup.sh&lt;/span&gt;
&lt;span class="gh"&gt;index e04d4165cf..10a6d1b3d9 100755&lt;/span&gt;
&lt;span class="gd"&gt;--- a/script/common/utils/dory_setup.sh&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/script/common/utils/dory_setup.sh&lt;/span&gt;
&lt;span class="gu"&gt;@@ -16,9 +16,9 @@ function check_for_dory {&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;function start_dory {
&lt;span class="w"&gt; &lt;/span&gt;  message &amp;#39;Starting dory...&amp;#39;
&lt;span class="gd"&gt;-  if dory status | grep -q &amp;#39;not running&amp;#39;; then&lt;/span&gt;
&lt;span class="gd"&gt;-    confirm_command &amp;#39;dory up&amp;#39;&lt;/span&gt;
&lt;span class="gd"&gt;-  elif ! dory status; then&lt;/span&gt;
&lt;span class="gi"&gt;+  if sudo dory status | grep -q &amp;#39;not running&amp;#39;; then&lt;/span&gt;
&lt;span class="gi"&gt;+    confirm_command &amp;#39;sudo dory up&amp;#39;&lt;/span&gt;
&lt;span class="gi"&gt;+  elif ! sudo dory status; then&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;    message &amp;quot;Something went wrong with dory! Exiting script.&amp;quot;
&lt;span class="w"&gt; &lt;/span&gt;    exit 1
&lt;span class="w"&gt; &lt;/span&gt;  else
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Memo"></category><category term="Docker"></category><category term="Canvas"></category><category term="Ubuntu"></category><category term="WSL2"></category></entry><entry><title>GithubのToken</title><link href="https://eiichiromomma.github.io/2022/03/24/GithubToken/" rel="alternate"></link><published>2022-03-24T21:00:00+09:00</published><updated>2022-03-24T21:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-03-24:/2022/03/24/GithubToken/</id><content type="html">&lt;p&gt;Githubの自分のリポジトリにgitコマンドから何かするときにパスワードではなくTokenが必要になる。普段はGUIなツールなので意識しないがPelicanでこのサイトを更新するときには必要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tokenの生成ページ &lt;a href="https://github.com/settings/tokens"&gt;https://github.com/settings/tokens&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本的には &lt;code&gt;repo: Full control of private repositories&lt;/code&gt; にチェックを入れた状態で生成する。
期間は30日くらいにしておく。&lt;/p&gt;
&lt;p&gt;あとはgitでパスワードを聞かれたときにTokenをコピペすれば良い。&lt;/p&gt;</content><category term="Memo"></category><category term="Github"></category><category term="Pelican"></category></entry><entry><title>CanvasのSandbox</title><link href="https://eiichiromomma.github.io/2022/03/24/Canvas-Sandbox/" rel="alternate"></link><published>2022-03-24T20:00:00+09:00</published><updated>2022-03-24T20:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2022-03-24:/2022/03/24/Canvas-Sandbox/</id><summary type="html">&lt;p&gt;LMSのCanvasのSandbox作成。やることは簡単でスクリプト一発の筈だったのだが結構面倒だった。
gitとかの基本的なツールはあって当たり前なので省略するが&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この手順はmacOS (Monterey)&lt;/li&gt;
&lt;li&gt;doryが必要(Webサービスをlocal動作させる際，偽のFQDNをいい感じにmapしてくれるらしい)&lt;/li&gt;
&lt;li&gt;docker諸々必要&lt;/li&gt;
&lt;li&gt;mutagenが必要(dockerのバインドマウントを高速化)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あたり …&lt;/p&gt;</summary><content type="html">&lt;p&gt;LMSのCanvasのSandbox作成。やることは簡単でスクリプト一発の筈だったのだが結構面倒だった。
gitとかの基本的なツールはあって当たり前なので省略するが&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この手順はmacOS (Monterey)&lt;/li&gt;
&lt;li&gt;doryが必要(Webサービスをlocal動作させる際，偽のFQDNをいい感じにmapしてくれるらしい)&lt;/li&gt;
&lt;li&gt;docker諸々必要&lt;/li&gt;
&lt;li&gt;mutagenが必要(dockerのバインドマウントを高速化)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あたりが条件&lt;/p&gt;
&lt;h3&gt;doryを入れる&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;dory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Canvasのソースを拾ってくる&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/instructure/canvas-lms.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;canvas-lms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;依存アプリを入れて環境構築&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/instructure/canvas-lms/wiki/Quick-Start"&gt;ここ&lt;/a&gt;の通りにDocker環境のセットアップを実行すると足りないものを指摘してくれるのだが，先に依存するアプリも入れてしまう&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mutagen-io/mutagen/mutagen
brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mutagen-io/mutagen/mutagen-compose
./script/docker_dev_setup.sh&lt;span class="w"&gt; &lt;/span&gt;--mutagen
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Docker Desktopが無いと言われる&lt;/h3&gt;
&lt;p&gt;で，Docker Desktopをインストールしてあるのに無いと言われてコケるので &lt;code&gt;script/common/utils/docker_desktop_setup.sh&lt;/code&gt; の最後の&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;check_for_docker_desktop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;mdfind&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;kMDItemKind == &amp;#39;Application&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-qE&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Docker.app|Docker\ Desktop.app&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Docker Desktop is not installed!&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Refer to https://docs.docker.com/docker-for-mac/install/ for help installing.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Once Docker Desktop is installed rerun this script.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のexit 1を消す泥縄で対応。(エラーになっても終了させない)&lt;/p&gt;
&lt;h3&gt;またコケるが再度実行すると通る&lt;/h3&gt;
&lt;p&gt;その後コケるが，docker_dev_setup.logを見ても↓のような感じで原因不明だが，もう一度実行すると何故かエラーなく通る&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Gem&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;remain&lt;span class="w"&gt; &lt;/span&gt;installed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/docker/.gem/gems/ruby-debug-ide-0.7.2
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;inspection.
Results&lt;span class="w"&gt; &lt;/span&gt;logged&lt;span class="w"&gt; &lt;/span&gt;to
/home/docker/.gem/extensions/x86_64-linux/2.7.0/ruby-debug-ide-0.7.2/gem_make.out

An&lt;span class="w"&gt; &lt;/span&gt;error&lt;span class="w"&gt; &lt;/span&gt;occurred&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;installing&lt;span class="w"&gt; &lt;/span&gt;ruby-debug-ide&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.7.2&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Bundler&lt;span class="w"&gt; &lt;/span&gt;cannot
&lt;span class="k"&gt;continue&lt;/span&gt;.
Make&lt;span class="w"&gt; &lt;/span&gt;sure&lt;span class="w"&gt; &lt;/span&gt;that&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;gem&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ruby-debug-ide&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0.7.2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--source
&lt;span class="s1"&gt;&amp;#39;https://rubygems.org/&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;succeeds&lt;span class="w"&gt; &lt;/span&gt;before&lt;span class="w"&gt; &lt;/span&gt;bundling.

In&lt;span class="w"&gt; &lt;/span&gt;Gemfile:
&lt;span class="w"&gt;  &lt;/span&gt;ruby-debug-ide
&lt;span class="w"&gt;  &lt;/span&gt;/o&lt;span class="se"&gt;\ &lt;/span&gt;Something&lt;span class="w"&gt; &lt;/span&gt;went&lt;span class="w"&gt; &lt;/span&gt;wrong.&lt;span class="w"&gt; &lt;/span&gt;Check&lt;span class="w"&gt; &lt;/span&gt;/xxxxxxxxx/sandbox/canvas-lms/log/docker_dev_setup.log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;details.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ということでもう一度実行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./script/docker_dev_setup.sh&lt;span class="w"&gt; &lt;/span&gt;--mutagen
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;今度はセットアップが完了する。&lt;/p&gt;
&lt;h3&gt;mutagen-compose up&lt;/h3&gt;
&lt;p&gt;mutagen-composeでupする(ちなみにupで開始だからdownとやるとcontainersが全部消える)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mutagen-compose&lt;span class="w"&gt; &lt;/span&gt;up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で，暫く待ってると&lt;code&gt;webpack_1&lt;/code&gt;からのログが終わって&lt;code&gt;jobs_1&lt;/code&gt;からのログが流れるので，ブラウザで &lt;a href="http://canvas.docker/"&gt;http://canvas.docker&lt;/a&gt;を開くとCanvasのログイン画面になれば順調。&lt;/p&gt;
&lt;h3&gt;Canvasのアカウント作成&lt;/h3&gt;
&lt;p&gt;この状態だとアカウントが無い状態なのでcontainerの中のrailsでアカウントを作成する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;ps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で確認してIMAGEが&lt;code&gt;canvas-lms_web&lt;/code&gt;のNAMESを見る(たぶんcanvas-lms_web_1)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;canvas-lms_web_1&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でコンテナに入ると&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;root@xxxxxxxxxxx:/usr/src/app#
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のようなプロンプトになるので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rails&lt;span class="w"&gt; &lt;/span&gt;db:initial_setup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行すると色々聞かれる。&lt;/p&gt;
&lt;p&gt;※アカウント名(the account name)なのだが，特殊な用語で大学-学部-学科のようなツリーを考えたときの大学に相当する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="m"&gt;1&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;development:public
What&lt;span class="w"&gt; &lt;/span&gt;email&lt;span class="w"&gt; &lt;/span&gt;address&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;administrator&lt;span class="w"&gt; &lt;/span&gt;account&lt;span class="w"&gt; &lt;/span&gt;use?&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;ログインIDになるメールアドレスを入力&lt;span class="o"&gt;]&lt;/span&gt;
Please&lt;span class="w"&gt; &lt;/span&gt;confirm&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;ログインIDになるメールアドレスを入力&lt;span class="o"&gt;]&lt;/span&gt;
What&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;administrator&lt;span class="w"&gt; &lt;/span&gt;use?&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;パスワードを入力&lt;span class="o"&gt;]&lt;/span&gt;
Please&lt;span class="w"&gt; &lt;/span&gt;confirm&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;パスワードを入力&lt;span class="o"&gt;]&lt;/span&gt;
What&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;users&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;see&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;account&lt;span class="w"&gt; &lt;/span&gt;name?&lt;span class="w"&gt; &lt;/span&gt;This&lt;span class="w"&gt; &lt;/span&gt;should&lt;span class="w"&gt; &lt;/span&gt;probably&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;name&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;organization.&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;他のユーザーから見たアカウント名&lt;span class="o"&gt;]&lt;/span&gt;
To&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;our&lt;span class="w"&gt; &lt;/span&gt;developers&lt;span class="w"&gt; &lt;/span&gt;better&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;you,&lt;span class="w"&gt; &lt;/span&gt;Instructure&lt;span class="w"&gt; &lt;/span&gt;would&lt;span class="w"&gt; &lt;/span&gt;like&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;collect&lt;span class="w"&gt; &lt;/span&gt;some&lt;span class="w"&gt; &lt;/span&gt;usage&lt;span class="w"&gt; &lt;/span&gt;data&lt;span class="w"&gt; &lt;/span&gt;about&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;Canvas&lt;span class="w"&gt; &lt;/span&gt;installation.&lt;span class="w"&gt; &lt;/span&gt;You&lt;span class="w"&gt; &lt;/span&gt;can&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;setting&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;any&lt;span class="w"&gt; &lt;/span&gt;time.:
&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Opt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Only&lt;span class="w"&gt; &lt;/span&gt;send&lt;span class="w"&gt; &lt;/span&gt;anonymized&lt;span class="w"&gt; &lt;/span&gt;data
&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Opt&lt;span class="w"&gt; &lt;/span&gt;out&lt;span class="w"&gt; &lt;/span&gt;completely
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;開発元に情報を送るかどうかなので2の匿名化か3の拒否が無難&lt;span class="o"&gt;]&lt;/span&gt;
Thank&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;participating&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;anonymous&lt;span class="w"&gt; &lt;/span&gt;usage&lt;span class="w"&gt; &lt;/span&gt;collection.
You&lt;span class="w"&gt; &lt;/span&gt;can&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;feature&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;any&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;by&lt;span class="w"&gt; &lt;/span&gt;running&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;rake&lt;span class="w"&gt; &lt;/span&gt;task&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;rake db:configure_statistics_collection&amp;#39;&lt;/span&gt;
........................................................................................
Notifications&lt;span class="w"&gt; &lt;/span&gt;Loaded
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assignment&lt;span class="w"&gt; &lt;/span&gt;Publishing&lt;span class="w"&gt; &lt;/span&gt;Reminder
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assignment&lt;span class="w"&gt; &lt;/span&gt;Grading&lt;span class="w"&gt; &lt;/span&gt;Reminder
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assignment&lt;span class="w"&gt; &lt;/span&gt;Due&lt;span class="w"&gt; &lt;/span&gt;Date&lt;span class="w"&gt; &lt;/span&gt;Reminder
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Rubric&lt;span class="w"&gt; &lt;/span&gt;Assessment&lt;span class="w"&gt; &lt;/span&gt;Invitation
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Migration&lt;span class="w"&gt; &lt;/span&gt;Export&lt;span class="w"&gt; &lt;/span&gt;Ready
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Migration&lt;span class="w"&gt; &lt;/span&gt;Import&lt;span class="w"&gt; &lt;/span&gt;Finished
No&lt;span class="w"&gt; &lt;/span&gt;notification&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Migration&lt;span class="w"&gt; &lt;/span&gt;Import&lt;span class="w"&gt; &lt;/span&gt;Failed

Initial&lt;span class="w"&gt; &lt;/span&gt;data&lt;span class="w"&gt; &lt;/span&gt;loaded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で完了。doryのおかげで&lt;a href="http://canvas.docker/"&gt;http://canvas.docker&lt;/a&gt;でログインできるようになってる。&lt;/p&gt;</content><category term="Memo"></category><category term="Docker"></category><category term="Canvas"></category><category term="Ubuntu"></category></entry><entry><title>github-wiki-see</title><link href="https://eiichiromomma.github.io/2021/12/04/github-wiki-see/" rel="alternate"></link><published>2021-12-04T20:20:00+09:00</published><updated>2021-12-04T20:20:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2021-12-04:/2021/12/04/github-wiki-see/</id><summary type="html">&lt;p&gt;昔は研究室Webサーバ内にwikiを設置していたものの，SPAM対策やら色々面倒になりGithubのリポジトリ内Wikiでいいかと&lt;a href="https://github.com/eiichiromomma/CVMLAB/wiki"&gt;引っ越した&lt;/a&gt;訳ですが，2019年からGoogle等の検索エンジンのクロールをGithubが拒否するようになってます。
理由は色々あるらしいですが，&lt;code&gt;robots.txt&lt;/code&gt;から &lt;code&gt;Disallow: /*/wiki*&lt;/code&gt;を削除したものの&lt;code&gt;x-robots-tag: none&lt;/code&gt;がヘッダに埋め込まれるせ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;昔は研究室Webサーバ内にwikiを設置していたものの，SPAM対策やら色々面倒になりGithubのリポジトリ内Wikiでいいかと&lt;a href="https://github.com/eiichiromomma/CVMLAB/wiki"&gt;引っ越した&lt;/a&gt;訳ですが，2019年からGoogle等の検索エンジンのクロールをGithubが拒否するようになってます。
理由は色々あるらしいですが，&lt;code&gt;robots.txt&lt;/code&gt;から &lt;code&gt;Disallow: /*/wiki*&lt;/code&gt;を削除したものの&lt;code&gt;x-robots-tag: none&lt;/code&gt;がヘッダに埋め込まれるせいでGithubの検索から以外は探せない状態が続いています。(&lt;a href="https://github.com/github/feedback/discussions/4992"&gt;ここで議論されてました&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;例えばffmpegを使おうとして&lt;code&gt;eiichiromomma ffmpeg&lt;/code&gt;で&lt;a href="https://www.google.com/search?q=eiichiromomma+ffmpeg"&gt;検索してもGithubのWikiが出てこない&lt;/a&gt;。出てくるのはgithub-wiki-seeなる怪しいサイト。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/20211204-ghws.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;見た目的に変なサイトと思えてしまいますが，&lt;a href="https://github-wiki-see.page/"&gt;本来であれば検索エンジンに拾われたであろうGithub Wikiの内容をクロールして検索エンジンに渡して，オリジナルのWikiのURLを提示する&lt;/a&gt;。というサイトのようです。
私も最初訝しんでブロックしてましたが，問題無いようなので利用して下さい。&lt;/p&gt;
&lt;p&gt;改善しないなら，ここ(Github Pages)に今のWikiの内容をマージするのもアリかなと。ただフォルダ構造変えないとダメになるのでそれはそれで面倒。&lt;/p&gt;</content><category term="Wiki"></category><category term="github"></category><category term="wiki"></category></entry><entry><title>研究室への問い合わせと2020-2021の状況について</title><link href="https://eiichiromomma.github.io/2021/11/28/%E7%A0%94%E7%A9%B6%E5%AE%A4%E3%81%B8%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A82020-2021%E3%81%AE%E7%8A%B6%E6%B3%81%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/" rel="alternate"></link><published>2021-11-28T10:59:00+09:00</published><updated>2021-11-28T10:59:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2021-11-28:/2021/11/28/研究室への問い合わせと2020-2021の状況について/</id><summary type="html">&lt;h2&gt;研究室への問い合わせ&lt;/h2&gt;
&lt;p&gt;12/2,3は&lt;a href="http://view.tc-iaip.org/view/2021/"&gt;ViEW2021 ビジョン技術の実利用ワークショップ&lt;/a&gt;の運営やってるので対応できません。スミマ …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;研究室への問い合わせ&lt;/h2&gt;
&lt;p&gt;12/2,3は&lt;a href="http://view.tc-iaip.org/view/2021/"&gt;ViEW2021 ビジョン技術の実利用ワークショップ&lt;/a&gt;の運営やってるので対応できません。スミマセン。(学生さんは聴講参加無料なので，この分野を覗いてみたい人は是非参加してみてください。)
質問受け付けは&lt;strong&gt;全てZoomで実施します&lt;/strong&gt;。(Zoom URLはドライブの方に掲示)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;12/4(土) 11:00-12:00 &lt;/li&gt;
&lt;li&gt;12/6(月) 17:00-18:00 &lt;/li&gt;
&lt;li&gt;12/7(火) 12:00-13:00 &lt;/li&gt;
&lt;li&gt;時間が合わない人は可能な範囲で個別に調整するので momma.eiichiro@nihon-u.ac.jp まで連絡&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;近況&lt;/h2&gt;
&lt;p&gt;コロナ禍なかなか収束しませんませんね。Blogに載せられる活動がほぼ無い状況なので1年以上更新も止まってました。
写真はどうなんでしょうかね。マスクマンだらけなので社会情勢の記録にはなりますが。&lt;/p&gt;
&lt;p&gt;緊急事態宣言下ではもちろんリモートですが，卒研の活動については学部生は半数までという制限もあります(最近)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学生の研究室への登校は任意(要事前申請)&lt;/li&gt;
&lt;li&gt;連絡はコロナ禍の前からSlack (&lt;a href="https://slack.com/intl/ja-jp/help/articles/206646877-Slack-%E3%81%AE%E6%95%99%E8%82%B2%E6%94%AF%E6%8F%B4%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%89%B2%E5%BC%95%E3%81%AB%E7%94%B3%E3%81%97%E8%BE%BC%E3%82%80"&gt;教育支援プログラム&lt;/a&gt;をありがたく使わせて貰ってます)&lt;/li&gt;
&lt;li&gt;ゼミはZoomでのリモート&lt;/li&gt;
&lt;li&gt;個別のミーティングは研究室で対面だったりZoomだったり&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;研究室Webサーバー(Wordpress)の移設&lt;/h2&gt;
&lt;p&gt;先日サーバーPCの置いてあった建屋で停電が起き，再起動出来たり出来なかったりと不安定な状況になりました。
厄介なことに，研究室や自宅にサーバPCを持って帰って検証しようとすると起動して，建屋で再開させようとすると起動しない。
Wordpressで運用してるのですが，過去のサーバー移設の際もかなり面倒だったのと，放置してたgithubioのブログでの&lt;a href="https://github.com/getpelican/pelican"&gt;Pelican&lt;/a&gt;がmarkdown記述でかなり楽なのもあって，これを機会にWordpressを辞めてPelican運用に変更しました。(移設については別記事で)&lt;/p&gt;
&lt;p&gt;という訳で，技術メモも含めた研究室のWebページという扱いで運用して行きます。&lt;/p&gt;</content><category term="News"></category></entry><entry><title>Wordpress to Pelican</title><link href="https://eiichiromomma.github.io/2021/11/27/wordpress-to-pelican/" rel="alternate"></link><published>2021-11-27T19:20:00+09:00</published><updated>2021-11-27T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2021-11-27:/2021/11/27/wordpress-to-pelican/</id><summary type="html">&lt;p&gt;WordpressからPelicanへの移行メモ&lt;/p&gt;
&lt;h2&gt;前置き&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Wordpressサーバが停電から電源復旧せず。時々起動。本番物理環境(寒い8号館)で作業するのはダルい。&lt;/li&gt;
&lt;li&gt;本体は持ち運び可能なNUC&lt;/li&gt;
&lt;li&gt;IPは固定のグローバル&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;サーバが起動してるうちに …&lt;/h2&gt;</summary><content type="html">&lt;p&gt;WordpressからPelicanへの移行メモ&lt;/p&gt;
&lt;h2&gt;前置き&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Wordpressサーバが停電から電源復旧せず。時々起動。本番物理環境(寒い8号館)で作業するのはダルい。&lt;/li&gt;
&lt;li&gt;本体は持ち運び可能なNUC&lt;/li&gt;
&lt;li&gt;IPは固定のグローバル&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;サーバが起動してるうちにバックアップ&lt;/h2&gt;
&lt;h3&gt;IPの取得をDHCPに&lt;/h3&gt;
&lt;p&gt;/etc/network/interfaces をdhcp用に書き換える。ここらへんの作業は大した話ではない。再起動すればローカルのネットワーク内にアクセス可能なWebサーバが取り敢えず起動した状態になる。
ifconfigなりip addressでIPアドレスを調べておく。&lt;/p&gt;
&lt;h3&gt;嘘吐きサーバと嘘吐きクライアント&lt;/h3&gt;
&lt;p&gt;本番物理環境以外で起動してもWebサーバはServerNameに基いて喋るのでDHCPで取得したIP直打ちでブラウザから開こうとしても蹴られる。ServerNameをIPにする手段もあるがSSLの扱いとか諸々上手く行かないうえに，サーバ内でlynxやw3mで開いて保存してもsshで同じ問題に当たるので，&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;サーバの/etc/hosts でDHCPから割り当てられたIPと使っていたFQDN(www.cvm....)を紐付ける。&lt;/li&gt;
&lt;li&gt;クライアント(macOS)の/private/etc/hostsも同様にサーバのFQDNがDHCPでサーバが取得したIPに紐付ける。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;でローカル内で共謀させる。これでクライアントで今迄開いていたようにwww.cvm....を開くとローカルのサーバへアクセスできるし，sshやscpが機能する。&lt;/p&gt;
&lt;h3&gt;xmlをエクスポート&lt;/h3&gt;
&lt;p&gt;Wordpress to Wordpressならpluginで移行ツールも山程あるがPelicanはxmlが必要なので「ツール」-「エクスポート」で全データのXMLを吸い出す。
あとは/var/www/htmlにWordpressのフォルダがあるのでwp-contentsのuploadsフォルダをまるごと持ってくる(ここに画像等のデータが入ってる)&lt;/p&gt;
&lt;h3&gt;pelican-import&lt;/h3&gt;
&lt;p&gt;python環境でpelicanが使える前提。importツールも勝手に入る。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pelican-import&lt;span class="w"&gt; &lt;/span&gt;--dir-cat&lt;span class="w"&gt; &lt;/span&gt;--wpfile&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;wpoutput&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;markdown&lt;span class="w"&gt; &lt;/span&gt;--disable-slugs&lt;span class="w"&gt; &lt;/span&gt;../cvmlab.WordPress.2021-11-27.xml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;--dir-cat: Wordpressでのカテゴリごとにフォルダを掘って出力&lt;/li&gt;
&lt;li&gt;--wpfile: Wordpressからのコンバート&lt;/li&gt;
&lt;li&gt;-o wpoutput: wpoutputフォルダに出力&lt;/li&gt;
&lt;li&gt;-m markdown: Markdown形式で出力&lt;/li&gt;
&lt;li&gt;--disable-slugs: Pelicanはslugをファイル名やフォルダ名に使うのでWordpressのは使わないよう指定しないと後でカオスになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という感じでカテゴリごとにフォルダが掘られ，mdファイルが配置される。
エラーが出たらipythonを起動し，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pelican&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;wpfile&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;disable&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;slugs&lt;/span&gt; &lt;span class="o"&gt;../&lt;/span&gt;&lt;span class="n"&gt;cvmlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WordPress&lt;/span&gt;&lt;span class="mf"&gt;.2021&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;27.&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;という感じで実行し，その後で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とするとデバッガに入れる。大抵itemsに詰まったデータのitemを処理してる最中に起きるので，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;item&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でエラーが発生したitemの中身を表示して，Visual Studio Code等のエディタでxmlを開き該当箇所を探すと変な文字が紛れてたりするので消す。また実行してエラーが出なくなるまで繰り返し。&lt;/p&gt;
&lt;h3&gt;整形諸々&lt;/h3&gt;
&lt;p&gt;一応出力できたが問題は山積み&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-e0----.mdみたいなファイル名になりコマンド実行時にオプション扱いされる&lt;ul&gt;
&lt;li&gt;multi-byteな文字の問題だろうが以後コマンドでファイル名を指定する作業の際に--(ハイフン二つ)を前に置くとファイル名として扱ってくれる&lt;/li&gt;
&lt;li&gt;pelicanで変換する際は問題にならないので放置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pelicanはカテゴリは1つだけという制限&lt;ul&gt;
&lt;li&gt;色々手はあるが組合せが面倒なので全部開いて手作業で一つにした&lt;/li&gt;
&lt;li&gt;Tagsは複数指定できるらしいが今後1つだけにすれば良いやということでそのまま&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;画像のリンクはwordpress内へのリンクのまま(当たり前)&lt;ul&gt;
&lt;li&gt;gsedで一気に置換する&lt;/li&gt;
&lt;li&gt;sedでは"/"の代わりに別のセパレータ("|"とか)を指定すればURLをそのまま置換できる&lt;ul&gt;
&lt;li&gt;Pelicanで使うcotnents/imagesの中にuploadsフォルダをまんまコピーしておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;find&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;gsed&lt;span class="w"&gt; &lt;/span&gt;-i.bak&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s|https://www.cvm.ele.cst.nihon-u.ac.jp/wp/wp-content/|{static}/images/|g&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で後は全ページチェックしておかしなところを直していくしか無いのだが，過去記事なので致命的な問題の指摘が来たら直すってことで。&lt;/p&gt;
&lt;h3&gt;あとはPelicanの通常作業&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;make&lt;span class="w"&gt; &lt;/span&gt;html
make&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でlocalhost:8000を開いて確認。&lt;/p&gt;
&lt;p&gt;問題無ければリリースする。&lt;/p&gt;
&lt;h3&gt;theme&lt;/h3&gt;
&lt;p&gt;あちこちに載ってるので大した話は無いが適当な場所で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;https://github.com/getpelican/pelican-themes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でpelicanconf.pyに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/path/to/zurb-F5-basic&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような感じで書いて&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;make&lt;span class="w"&gt; &lt;/span&gt;html
make&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でlocalhost:8000を開いて確認する。&lt;/p&gt;
&lt;p&gt;このままでも良いのだが&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pelican-themes&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;/path/to/theme
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;としてインストールすると，THEMEの記述をパス不要で名前だけにもできる。&lt;/p&gt;
&lt;h3&gt;落とし穴&lt;/h3&gt;
&lt;p&gt;Makefileが古く&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pelican-quickstart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;を実行し直してMakefileを作り直せと言われたので実行したら，githubのmaster→mainの名称変更があって以後mainのbranchに投げられるように変わってた。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;リポジトリの設定でデフォルトのbranchをmainに変更&lt;/li&gt;
&lt;li&gt;同じくSitesの設定でgithub ioのサイトに反映させるbranchをmainに変更&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;が必要だった。&lt;/p&gt;</content><category term="Memo"></category></entry><entry><title>前期が終わりました</title><link href="https://eiichiromomma.github.io/2020/07/31/%E5%89%8D%E6%9C%9F%E3%81%8C%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F/" rel="alternate"></link><published>2020-07-31T08:48:00+09:00</published><updated>2020-07-31T08:48:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2020-07-31:/2020/07/31/前期が終わりました/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;コロナ禍で久々の更新です。卒業式もなく学位記伝達のみだったり，学部生は4正式に配属されてから一度も研究室に来てなかったりと特殊な状況ですが，M1, M2は入構可となってから1ヶ月くらいでリカバリーしてもらうところです。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:jetpack/slideshow {"ids":["791","792","793","794"],"sizeSlug":"full"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/SDIM0634_Original-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/IMG_1581-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/IMG_1585-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/0cd864550951e7111ba9ae1c4ab7c82a-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:jetpack/slideshow --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;講義は全てオンデマンド式の講義で曜日無 …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;コロナ禍で久々の更新です。卒業式もなく学位記伝達のみだったり，学部生は4正式に配属されてから一度も研究室に来てなかったりと特殊な状況ですが，M1, M2は入構可となってから1ヶ月くらいでリカバリーしてもらうところです。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:jetpack/slideshow {"ids":["791","792","793","794"],"sizeSlug":"full"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/SDIM0634_Original-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/IMG_1581-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/IMG_1585-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-507" src="https://eiichiromomma.github.io/images/uploads/2020/07/0cd864550951e7111ba9ae1c4ab7c82a-1-scaled.jpeg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:jetpack/slideshow --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;講義は全てオンデマンド式の講義で曜日無関係な収録の日々ではあるものの，そこは画像が専門なので，タダでは転ばず&lt;a href="https://github.com/eiichiromomma/CVMLAB/wiki/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E8%AC%9B%E7%BE%A9"&gt;ノウハウを溜めました&lt;/a&gt;ので，皆さんも参考にして下さい。お陰で自宅にクロマキー環境まで作ってYoutuber状態ですが。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;まだタワー・スコラに来たことすら無い2年生もいるかも知れませんので(?)，3Dモデルを噂の3D Scanner Appで作ってみました。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:video --&gt;

&lt;iframe src="https://player.vimeo.com/video/650708251?h=edbbc6d929" width="100%" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;
&lt;!-- /wp:video --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="News"></category></entry><entry><title>卒研発表会2020</title><link href="https://eiichiromomma.github.io/2020/02/27/%E5%8D%92%E7%A0%94%E7%99%BA%E8%A1%A8%E4%BC%9A2020/" rel="alternate"></link><published>2020-02-27T18:15:00+09:00</published><updated>2020-02-27T18:15:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2020-02-27:/2020/02/27/卒研発表会2020/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;例年だとB3と師匠の名誉教授にご参加頂き開催するところですが，例の肺炎対策ということで門馬とのポスターを使った試問ということにしました(距離は取ってます)。B3はネットでポスターを確認して …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;例年だとB3と師匠の名誉教授にご参加頂き開催するところですが，例の肺炎対策ということで門馬とのポスターを使った試問ということにしました(距離は取ってます)。B3はネットでポスターを確認して Sli.do で質疑という試みもしました。今年度は上から水が降ったせいでリソースを大幅に取られたり色々ありましたが，どうにかM0の2名が研究会にも出せたし何とかなりました。皆様お疲れ様でした。Cavaで乾杯だけして解散。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":782,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" src="https://eiichiromomma.github.io/images/uploads/2020/03/IMG_1545.jpeg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>卒論下見発表会</title><link href="https://eiichiromomma.github.io/2020/01/30/%E5%8D%92%E8%AB%96%E4%B8%8B%E8%A6%8B%E7%99%BA%E8%A1%A8%E4%BC%9A/" rel="alternate"></link><published>2020-01-30T17:12:00+09:00</published><updated>2020-01-30T17:12:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2020-01-30:/2020/01/30/卒論下見発表会/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;卒論も大詰めということで下見発表会を開催しました。打ち上げも開催したいところですが，テストに追われていた …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;卒論も大詰めということで下見発表会を開催しました。打ち上げも開催したいところですが，テストに追われていたり前日まで無理をしている人もいたりということで，昼にピザを差し入れするだけにしておきました。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":777,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00529.jpeg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":778,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00531.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":779,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00534.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="ゼミ"></category></entry><entry><title>忘年会</title><link href="https://eiichiromomma.github.io/2019/12/19/%E5%BF%98%E5%B9%B4%E4%BC%9A/" rel="alternate"></link><published>2019-12-19T20:10:00+09:00</published><updated>2019-12-19T20:10:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-12-19:/2019/12/19/忘年会/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;数日前に飲み会をやったばかりですが，今度はB4+院生の忘年会。たまたまM1の誕生日ということでケーキでお祝い。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":773,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00524.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":774,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00528.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="News"></category></entry><entry><title>B3自己紹介LT飲み会</title><link href="https://eiichiromomma.github.io/2019/12/16/B3/" rel="alternate"></link><published>2019-12-16T20:08:00+09:00</published><updated>2019-12-16T20:08:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-12-16:/2019/12/16/B3/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;仮配属が決定した3年生を集めて，自己紹介LT飲み会を開催しました。例年誰かしら欠けてて何度も自己紹介LTをやってますが，今度の3年生は集りが良く全員揃いました。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":768,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00504.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":769,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00513.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":770,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00515.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="ゼミ"></category></entry><entry><title>進捗報告+飲み会2019-11</title><link href="https://eiichiromomma.github.io/2019/11/21/%E9%80%B2%E6%8D%97%E5%A0%B1%E5%91%8A%E9%A3%B2%E3%81%BF%E4%BC%9A2019-11/" rel="alternate"></link><published>2019-11-21T19:02:00+09:00</published><updated>2019-11-21T19:02:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-11-21:/2019/11/21/進捗報告飲み会2019-11/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;研究の進捗報告会+飲み会でした。飲み会は人が少なく院生+M0で。ペプシが24本当たったとかでM1が配布中。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":763,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/0cd864550951e7111ba9ae1c4ab7c82a.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":764,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00499.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":765,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00502.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>研究室見学について</title><link href="https://eiichiromomma.github.io/2019/09/20/%E7%A0%94%E7%A9%B6%E5%AE%A4%E8%A6%8B%E5%AD%A6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/" rel="alternate"></link><published>2019-09-20T18:42:00+09:00</published><updated>2019-09-20T18:42:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-09-20:/2019/09/20/研究室見学について/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;仮着手の季節が来ました。見学は以下の時間に受付けています。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list --&gt;

&lt;ul&gt;
&lt;li&gt;9/21(土) -16:00&lt;/li&gt;
&lt;li&gt;9/25(水) 11:30-13:00&lt;/li&gt;
&lt;li&gt;9/27(金) 11:30-13:00&lt;/li&gt;
&lt;li&gt;9/28(土) 11:00-12:30 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;仮着手の季節が来ました。見学は以下の時間に受付けています。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list --&gt;

&lt;ul&gt;
&lt;li&gt;9/21(土) -16:00&lt;/li&gt;
&lt;li&gt;9/25(水) 11:30-13:00&lt;/li&gt;
&lt;li&gt;9/27(金) 11:30-13:00&lt;/li&gt;
&lt;li&gt;9/28(土) 11:00-12:30&lt;/li&gt;
&lt;li&gt;10/6(土) 電気工学科オープンラボ 9:30-17:00&lt;/li&gt;
&lt;li&gt;10/9(水) 11:30-13:00&lt;/li&gt;
&lt;li&gt;10/11(金) 11:30-13:00&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- /wp:list --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;これら以外の場合は事前にアポイントを取ってくれると助かります&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</content><category term="ゼミ"></category></entry><entry><title>研修旅行2019</title><link href="https://eiichiromomma.github.io/2019/09/10/%E7%A0%94%E4%BF%AE%E6%97%85%E8%A1%8C2019/" rel="alternate"></link><published>2019-09-10T19:56:00+09:00</published><updated>2019-09-10T19:56:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-09-10:/2019/09/10/研修旅行2019/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;今年の研修旅行は日帰りで恵比須の東京都写真美術館を見た後にヱビスビール記念館に行って，夜はバーベキュー …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;今年の研修旅行は日帰りで恵比須の東京都写真美術館を見た後にヱビスビール記念館に行って，夜はバーベキューでした。外で飲み食いするのもたまには良いもんです。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":760,"sizeSlug":"large"} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2020/03/DSC00473.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="ゼミ"></category></entry><entry><title>研究会+部門優秀論文発表賞 表彰</title><link href="https://eiichiromomma.github.io/2019/08/28/%E7%A0%94%E7%A9%B6%E4%BC%9A%E9%83%A8%E9%96%80%E5%84%AA%E7%A7%80%E8%AB%96%E6%96%87%E7%99%BA%E8%A1%A8%E8%B3%9E-%E8%A1%A8%E5%BD%B0/" rel="alternate"></link><published>2019-08-28T18:23:00+09:00</published><updated>2019-08-28T18:23:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-08-28:/2019/08/28/研究会部門優秀論文発表賞-表彰/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;徳島大学で開催の知覚情報/次世代産業システム合同研究会に参加してきました。研究発表に加えて昨年度 現M2の木鉛君が受賞した部門優秀論文発表賞の表彰も実施され，「非整 …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;徳島大学で開催の知覚情報/次世代産業システム合同研究会に参加してきました。研究発表に加えて昨年度 現M2の木鉛君が受賞した部門優秀論文発表賞の表彰も実施され，「非整備環境におけるセンシングとAI技術調査専門委員会」 委員長の谷口先生から表彰状を授与されました。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:gallery {"ids":[751,752]} --&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/IMG_1208-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/IMG_1209-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- /wp:gallery --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="News"></category></entry><entry><title>デモ大会その2+自己紹介LT飲み会</title><link href="https://eiichiromomma.github.io/2019/06/20/%E3%83%87%E3%83%A2%E5%A4%A7%E4%BC%9A%E3%81%9D%E3%81%AE2%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8Blt%E9%A3%B2%E3%81%BF%E4%BC%9A/" rel="alternate"></link><published>2019-06-20T18:17:00+09:00</published><updated>2019-06-20T18:17:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-06-20:/2019/06/20/デモ大会その2自己紹介lt飲み会/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;前回に引続きデモ大会です。UE4+ViveProでちゃんと作り込んできてました。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":746} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/DSC00436-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;その後打上げを兼ねた自己紹介LT飲み会(全員揃うまで続きます)です。写真は誕生日で浮か …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;前回に引続きデモ大会です。UE4+ViveProでちゃんと作り込んできてました。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":746} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/DSC00436-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;その後打上げを兼ねた自己紹介LT飲み会(全員揃うまで続きます)です。写真は誕生日で浮かれる田久保君。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:gallery {"ids":[747,748]} --&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/DSC00454-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/DSC00464-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- /wp:gallery --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="ゼミ"></category></entry><entry><title>デモ大会その1</title><link href="https://eiichiromomma.github.io/2019/06/06/%E3%83%87%E3%83%A2%E5%A4%A7%E4%BC%9A%E3%81%9D%E3%81%AE1/" rel="alternate"></link><published>2019-06-06T18:16:00+09:00</published><updated>2019-06-06T18:16:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-06-06:/2019/06/06/デモ大会その1/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;こちらから指定した機器やアルゴリズムを使ったデモ大会です。残念なCNNのプレゼンが秀逸でした。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":743} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/DSC00426-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="ゼミ"></category></entry><entry><title>輪講2019-5-16</title><link href="https://eiichiromomma.github.io/2019/05/16/%E8%BC%AA%E8%AC%9B2019-5-16/" rel="alternate"></link><published>2019-05-16T18:13:00+09:00</published><updated>2019-05-16T18:13:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-05-16:/2019/05/16/輪講2019-5-16/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;進学や就活で忙しいところですが輪講を開催しました。思いの外しっかり資料を作ってきてくれてました。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":740} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/09/DSC00416-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="ゼミ"></category></entry><entry><title>自己紹介LT飲み会2019-4</title><link href="https://eiichiromomma.github.io/2019/04/25/%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8Blt%E9%A3%B2%E3%81%BF%E4%BC%9A2019-4/" rel="alternate"></link><published>2019-04-25T21:54:00+09:00</published><updated>2019-04-25T21:54:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-04-25:/2019/04/25/自己紹介lt飲み会2019-4/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;恒例の自己紹介LT飲み会を開催しました．ちょっと酒が回ったところでの自己紹介プレゼンはリラックスできて楽しいものです．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;これから …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;恒例の自己紹介LT飲み会を開催しました．ちょっと酒が回ったところでの自己紹介プレゼンはリラックスできて楽しいものです．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;これから1年間頑張りましょう．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":735} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/DSC00405-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":736} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/DSC00407-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>部門優秀論文発表賞</title><link href="https://eiichiromomma.github.io/2019/03/31/%E9%83%A8%E9%96%80%E5%84%AA%E7%A7%80%E8%AB%96%E6%96%87%E7%99%BA%E8%A1%A8%E8%B3%9E/" rel="alternate"></link><published>2019-03-31T17:44:00+09:00</published><updated>2019-03-31T17:44:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-03-31:/2019/03/31/部門優秀論文発表賞/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;大学院生の木鉛君が電気学会D部門で部門優秀論文発表賞を受賞しました．おめでとう!&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":731} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/SDIM5076-1024x683.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;!-- /wp:paragraph --&gt;</content><category term="News"></category></entry><entry><title>卒業・修了</title><link href="https://eiichiromomma.github.io/2019/03/25/%E5%8D%92%E6%A5%AD%E4%BF%AE%E4%BA%86/" rel="alternate"></link><published>2019-03-25T18:04:00+09:00</published><updated>2019-03-25T18:04:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-03-25:/2019/03/25/卒業修了/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;今年も学部生，大学院生が巣立って行きました．卒業・修了おめでとうございます．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":724} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/SDIM4971-1024x683.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":725} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/SDIM4972-1024x683.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":726} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/SDIM5023-1024x683.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":727} --&gt;

&lt;p&gt;&lt;img alt="エレベータを諦めて12階分登った後で乾杯 (女性陣は着替えに出発済)" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/DSC00299-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>卒研発表会2019</title><link href="https://eiichiromomma.github.io/2019/02/28/%E5%8D%92%E7%A0%94%E7%99%BA%E8%A1%A8%E4%BC%9A2019/" rel="alternate"></link><published>2019-02-28T17:59:00+09:00</published><updated>2019-02-28T17:59:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-02-28:/2019/02/28/卒研発表会2019/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;新しい研究室で初の卒研発表会を実施しました．人が多過ぎて酸欠になりそうだったので来年からは発表会は実験 …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;新しい研究室で初の卒研発表会を実施しました．人が多過ぎて酸欠になりそうだったので来年からは発表会は実験室を借ります．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":719} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/SDIM4642-1024x683.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;優秀研究発表賞の投票の結果，三澤さん，彦坂君，小網さんが受賞となりました．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":720} --&gt;

&lt;p&gt;&lt;img alt="副賞の寿司と" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/DSC00290-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":721} --&gt;

&lt;p&gt;&lt;img alt="机を一つ借りて何とか全員座れた" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/DSC00296-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>授業アンケート結果(電気回路I及び演習)</title><link href="https://eiichiromomma.github.io/2019/02/12/%E6%8E%88%E6%A5%AD%E3%82%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88%E7%B5%90%E6%9E%9C%E9%9B%BB%E6%B0%97%E5%9B%9E%E8%B7%AFi%E5%8F%8A%E3%81%B3%E6%BC%94%E7%BF%92/" rel="alternate"></link><published>2019-02-12T17:45:00+09:00</published><updated>2019-02-12T17:45:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2019-02-12:/2019/02/12/授業アンケート結果電気回路i及び演習/</id><summary type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;データの加工が割と面倒なのでここ数年サボっていましたが，下図のような集計となりました．今年は諸事情により …&lt;/p&gt;</summary><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;データの加工が割と面倒なのでここ数年サボっていましたが，下図のような集計となりました．今年は諸事情によりABクラス1部屋で160名でしたのでうるさくならないか心配でしたが大丈夫でした．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":716} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/44c23b6b15d70994d766716b66bcaf1c.png" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;それなりに好意的な回答かなと思います．自由記述欄については幾つかピックアップします．(コメントありがとうございます)&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list --&gt;

&lt;ul&gt;
&lt;li&gt;解答を示してくれる・ポータルにスライドを置いてくれるのは助かった&lt;/li&gt;
&lt;li&gt;課題が多いです&lt;/li&gt;
&lt;li&gt;スライド配布資料へのメモ書きの時間が欲しい&lt;/li&gt;
&lt;li&gt;授業のスピードが速い&lt;/li&gt;
&lt;li&gt;マグロウヒルが難しい&lt;/li&gt;
&lt;li&gt;もっと，やる気のない生徒との差別化をしてほしい&lt;/li&gt;
&lt;li&gt;わかりやすかった&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- /wp:list --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;時間に関しては最後の総復習とのバランスの問題なのでもう少し見直す予定です．マグロウヒルが難しいのは確かですが解説付きの基本問題を解いていると分かってくるものです(他に丁度良い問題集がなかなか無いという理由もあります)．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;ちなみに上記のグラフは今回はPythonのpandasで自動生成できるようにしました．来年からは楽になるかも．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;&lt;a href="https://github.com/eiichiromomma/CVMLAB/blob/master/notebooks/201904%20QA.ipynb"&gt;https://github.com/eiichiromomma/CVMLAB/blob/master/notebooks/201904%20QA.ipynb&lt;/a&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</content><category term="講義"></category></entry><entry><title>進捗報告飲み会2018-12</title><link href="https://eiichiromomma.github.io/2018/12/20/%E9%80%B2%E6%8D%97%E5%A0%B1%E5%91%8A%E9%A3%B2%E3%81%BF%E4%BC%9A2018-12/" rel="alternate"></link><published>2018-12-20T20:42:00+09:00</published><updated>2018-12-20T20:42:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-12-20:/2018/12/20/進捗報告飲み会2018-12/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;卒研での進捗報告をして貰いました．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;

&lt;p&gt;その後は恒例の飲み会です．&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":712} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/DSC00241-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":713} --&gt;

&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2019/04/DSC00245-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>B3自己紹介LT飲み会</title><link href="https://eiichiromomma.github.io/2018/11/30/b3%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8Blt%E9%A3%B2%E3%81%BF%E4%BC%9A/" rel="alternate"></link><published>2018-11-30T20:48:00+09:00</published><updated>2018-11-30T20:48:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-11-30:/2018/11/30/b3自己紹介lt飲み会/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;恒例の仮配属者の懇親Lightning Talk+飲み会です。皆プレゼン上手いですね。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":707} --&gt;

&lt;p&gt;&lt;img alt="写真にはありませんが，どぶろくが目玉(?)でした" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/12/IMG_0878-768x1024.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>進捗報告+飲み会2018-11</title><link href="https://eiichiromomma.github.io/2018/11/08/%E9%80%B2%E6%8D%97%E5%A0%B1%E5%91%8A%E9%A3%B2%E3%81%BF%E4%BC%9A2018-11/" rel="alternate"></link><published>2018-11-08T20:43:00+09:00</published><updated>2018-11-08T20:43:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-11-08:/2018/11/08/進捗報告飲み会2018-11/</id><content type="html">&lt;!-- wp:paragraph --&gt;

&lt;p&gt;記事のアップロードが遅くなりましたが進捗報告+飲み会です。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":703} --&gt;

&lt;p&gt;&lt;img alt="(ブレブレですが)乾杯" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/12/DSC00192-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":704} --&gt;

&lt;p&gt;&lt;img alt="今回の目玉(?)のレモンサワー飲み比べセット" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/12/DSC00219-1024x768.jpg" width="600"&gt;&lt;/p&gt;
&lt;!-- /wp:image --&gt;</content><category term="ゼミ"></category></entry><entry><title>研究室の見学について</title><link href="https://eiichiromomma.github.io/2018/09/22/%E7%A0%94%E7%A9%B6%E5%AE%A4%E3%81%AE%E8%A6%8B%E5%AD%A6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/" rel="alternate"></link><published>2018-09-22T15:24:00+09:00</published><updated>2018-09-22T15:24:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-09-22:/2018/09/22/研究室の見学について/</id><summary type="html">&lt;p&gt;卒研の仮配属の季節になりました。見学を希望される方は下記の時間に来て下さい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[9/22(土) -16:00]&lt;/li&gt;
&lt;li&gt;[9/24(月) 16:00-17:00]&lt;/li&gt;
&lt;li&gt;[9/26(水 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;卒研の仮配属の季節になりました。見学を希望される方は下記の時間に来て下さい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[9/22(土) -16:00]&lt;/li&gt;
&lt;li&gt;[9/24(月) 16:00-17:00]&lt;/li&gt;
&lt;li&gt;[9/26(水) 12:00-13:00]&lt;/li&gt;
&lt;li&gt;[9/29(土) 11:00-12:30]&lt;/li&gt;
&lt;li&gt;[10/5(金) &lt;strong&gt;11:30-13:00&lt;/strong&gt;]&lt;/li&gt;
&lt;li&gt;[10/6(土) 電気工学科オープンラボ 9:30-17:00]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これら以外を希望される場合は事前にメール等頂けると助かります。&lt;/p&gt;</content><category term="講義"></category></entry><entry><title>2018年度(第51回)照明学会全国大会</title><link href="https://eiichiromomma.github.io/2018/09/12/2018%E5%B9%B4%E5%BA%A6%E7%AC%AC51%E5%9B%9E%E7%85%A7%E6%98%8E%E5%AD%A6%E4%BC%9A%E5%85%A8%E5%9B%BD%E5%A4%A7%E4%BC%9A/" rel="alternate"></link><published>2018-09-12T18:53:00+09:00</published><updated>2018-09-12T18:53:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-09-12:/2018/09/12/2018年度第51回照明学会全国大会/</id><content type="html">&lt;p&gt;M2程君とM1中澤君が神戸大学で発表してきました。神戸といえば牛。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/09/SDIM0940.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/09/image-4.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/09/image-2-2.jpg" width="600"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>研究室旅行</title><link href="https://eiichiromomma.github.io/2018/09/03/%E7%A0%94%E7%A9%B6%E5%AE%A4%E6%97%85%E8%A1%8C/" rel="alternate"></link><published>2018-09-03T18:23:00+09:00</published><updated>2018-09-03T18:23:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-09-03:/2018/09/03/研究室旅行/</id><content type="html">&lt;p&gt;ワインと肉の旅行でした。晴れて良かった。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/09/DSC00171.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/09/DSC00172.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/09/DSC00177.jpg" width="600"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>Roomba</title><link href="https://eiichiromomma.github.io/2018/08/10/roomba/" rel="alternate"></link><published>2018-08-10T18:08:00+09:00</published><updated>2018-08-10T18:08:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-08-10:/2018/08/10/roomba/</id><content type="html">&lt;p&gt;来ました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0613-e1533892095842.jpg" width="600"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>引越しほぼ完了</title><link href="https://eiichiromomma.github.io/2018/08/02/%E5%BC%95%E8%B6%8A%E3%81%97%E3%81%BB%E3%81%BC%E5%AE%8C%E4%BA%86/" rel="alternate"></link><published>2018-08-02T23:03:00+09:00</published><updated>2018-08-02T23:03:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-08-02:/2018/08/02/引越しほぼ完了/</id><summary type="html">&lt;p&gt;ダンボール20箱以上持ち込んだ書籍ですが、新規に設置した本棚にほぼぴったり納まりました。これで引越しも一段落。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0583.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;という訳で引越し祝となり …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ダンボール20箱以上持ち込んだ書籍ですが、新規に設置した本棚にほぼぴったり納まりました。これで引越しも一段落。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0583.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;という訳で引越し祝となりました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0584.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0585.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0586.jpg" width="600"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>電気学会 知覚情報/次世代産業システム合同研究会(広島工業大学)</title><link href="https://eiichiromomma.github.io/2018/07/30/%E9%9B%BB%E6%B0%97%E5%AD%A6%E4%BC%9A-%E7%9F%A5%E8%A6%9A%E6%83%85%E5%A0%B1%E6%AC%A1%E4%B8%96%E4%BB%A3%E7%94%A3%E6%A5%AD%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%90%88%E5%90%8C%E7%A0%94%E7%A9%B6%E4%BC%9A%E5%BA%83%E5%B3%B6%E5%B7%A5%E6%A5%AD%E5%A4%A7%E5%AD%A6/" rel="alternate"></link><published>2018-07-30T22:51:00+09:00</published><updated>2018-07-30T22:51:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-07-30:/2018/07/30/電気学会-知覚情報次世代産業システム合同研究会広島工業大学/</id><content type="html">&lt;p&gt;M2天野君、M1木鉛君、中島君と研究会に行ってきました。&lt;/p&gt;
&lt;p&gt;広島ということでお好み焼きも堪能しました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0571.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;ちゃんと発表も。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0575.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0576.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/08/IMG_0577.jpg" width="600"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>MESH</title><link href="https://eiichiromomma.github.io/2018/07/20/mesh/" rel="alternate"></link><published>2018-07-20T19:20:00+09:00</published><updated>2018-07-20T19:20:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-07-20:/2018/07/20/mesh/</id><summary type="html">&lt;p&gt;タワー・スコラでの研究室在室状況をMESH+Slack(+IFTTT+iruca)で確認できるようにしました。グラフィカルなプログラミングで，動 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;タワー・スコラでの研究室在室状況をMESH+Slack(+IFTTT+iruca)で確認できるようにしました。グラフィカルなプログラミングで，動きタグの倒し方で在室状況，明かりタグで部屋の照明状況を常時Slackで確認できます。写真には無いけどボタンタグで呼び鈴機能も追加。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/07/IMG_0529.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>デモ大会2と移転準備</title><link href="https://eiichiromomma.github.io/2018/07/12/%E3%83%87%E3%83%A2%E5%A4%A7%E4%BC%9A2%E3%81%A8%E7%A7%BB%E8%BB%A2%E6%BA%96%E5%82%99/" rel="alternate"></link><published>2018-07-12T19:13:00+09:00</published><updated>2018-07-12T19:13:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-07-12:/2018/07/12/デモ大会2と移転準備/</id><summary type="html">&lt;p&gt;デモ大会その2と，タワー・スコラ移転準備をしたので，そのまま酒類のストック減らしでピザをとっての飲み会です …&lt;/p&gt;</summary><content type="html">&lt;p&gt;デモ大会その2と，タワー・スコラ移転準備をしたので，そのまま酒類のストック減らしでピザをとっての飲み会です。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/07/DSC00132.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/07/DSC00140.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/07/DSC00155.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>Turtlebot3</title><link href="https://eiichiromomma.github.io/2018/06/21/turtlebot3/" rel="alternate"></link><published>2018-06-21T17:34:00+09:00</published><updated>2018-06-21T17:34:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-06-21:/2018/06/21/turtlebot3/</id><content type="html">&lt;p&gt;ROSやSLAM関係が面白いのでTurtlebot3を入手しました&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/06/IMG_0469.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>デモ大会</title><link href="https://eiichiromomma.github.io/2018/06/07/%E3%83%87%E3%83%A2%E5%A4%A7%E4%BC%9A/" rel="alternate"></link><published>2018-06-07T17:29:00+09:00</published><updated>2018-06-07T17:29:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-06-07:/2018/06/07/デモ大会/</id><content type="html">&lt;p&gt;一人20分と長めの持ち時間で各研究テーマにちなんだデモということで，SLAMやAR等をやって貰いました。ただのプレゼンとは違う面白さがあります。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/06/DSC00125.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>自己紹介LT飲み会2018-5</title><link href="https://eiichiromomma.github.io/2018/05/12/%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8Blt%E9%A3%B2%E3%81%BF%E4%BC%9A2018-5/" rel="alternate"></link><published>2018-05-12T21:17:00+09:00</published><updated>2018-05-12T21:17:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-05-12:/2018/05/12/自己紹介lt飲み会2018-5/</id><summary type="html">&lt;p&gt;恒例の自己紹介LT飲み会を開催しました。食事と酒が進んだところで自己紹介Lightning Talk(数分のプレゼン)をやって貰っています。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/05/DSC00082.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;今年も面白いメ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;恒例の自己紹介LT飲み会を開催しました。食事と酒が進んだところで自己紹介Lightning Talk(数分のプレゼン)をやって貰っています。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/05/DSC00082.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;今年も面白いメンバーが揃いました。今回は全員揃わなかったのでまた開催します。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/05/DSC00083.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/05/DSC00087.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>新しい研究室</title><link href="https://eiichiromomma.github.io/2018/04/20/%E6%96%B0%E3%81%97%E3%81%84%E7%A0%94%E7%A9%B6%E5%AE%A4/" rel="alternate"></link><published>2018-04-20T20:26:00+09:00</published><updated>2018-04-20T20:26:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-04-20:/2018/04/20/新しい研究室/</id><content type="html">&lt;p&gt;今日は内覧でした。↓こんな感じの景色です。&lt;/p&gt;
&lt;p&gt;[cardboard id="636"]&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>卒業</title><link href="https://eiichiromomma.github.io/2018/03/25/%E5%8D%92%E6%A5%AD/" rel="alternate"></link><published>2018-03-25T20:44:00+09:00</published><updated>2018-03-25T20:44:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-03-25:/2018/03/25/卒業/</id><content type="html">&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/04/DSC00063.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;更新遅くなりましたが，M2が3名，B4が7名巣立って行きました(うち3名は進学)。いつでも遊びに来て下さい。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://eiichiromomma.github.io/images/uploads/2018/04/DSC00063.jpg"&gt;[cardboard id="633"]&lt;/a&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>ピザ祭</title><link href="https://eiichiromomma.github.io/2018/03/12/%E3%83%94%E3%82%B6%E7%A5%AD/" rel="alternate"></link><published>2018-03-12T22:00:00+09:00</published><updated>2018-03-12T22:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-03-12:/2018/03/12/ピザ祭/</id><content type="html">&lt;p&gt;照明学会東京支部の技術セミナーでした。参加したメンバーでピザ祭。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/03/DSC00027.jpg" width="600"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>卒研発表会2018</title><link href="https://eiichiromomma.github.io/2018/02/27/%E5%8D%92%E7%A0%94%E7%99%BA%E8%A1%A8%E4%BC%9A2018/" rel="alternate"></link><published>2018-02-27T21:54:00+09:00</published><updated>2018-02-27T21:54:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-02-27:/2018/02/27/卒研発表会2018/</id><summary type="html">&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/03/IMG_0210-2-e1519909038477.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/03/IMG_0211-e1519909018807.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;今年は7名の発表でした。恒例の投票の結果，進学予定の3名が1, 2, 3フィニッシュでした。副賞はステーキと大トロ・中トロ・赤身の高級寿司。来年のメンバー …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/03/IMG_0210-2-e1519909038477.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/03/IMG_0211-e1519909018807.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;今年は7名の発表でした。恒例の投票の結果，進学予定の3名が1, 2, 3フィニッシュでした。副賞はステーキと大トロ・中トロ・赤身の高級寿司。来年のメンバーも頑張りましょう。&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>卒研報告会</title><link href="https://eiichiromomma.github.io/2018/01/18/%E5%8D%92%E7%A0%94%E5%A0%B1%E5%91%8A%E4%BC%9A/" rel="alternate"></link><published>2018-01-18T23:00:00+09:00</published><updated>2018-01-18T23:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2018-01-18:/2018/01/18/卒研報告会/</id><content type="html">&lt;p&gt;一昨日にB3の自己紹介LT兼新年会をやったのですが撮り忘れました。&lt;/p&gt;
&lt;p&gt;今日はB4の報告会です。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/01/IMG_0138-e1516285943491.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;無限cheezaの筈が全部食われました&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>Micro-CAPの意外(?)な使い方</title><link href="https://eiichiromomma.github.io/2017/12/28/micro-cap%E3%81%AE%E6%84%8F%E5%A4%96%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9/" rel="alternate"></link><published>2017-12-28T19:29:00+09:00</published><updated>2017-12-28T19:29:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-12-28:/2017/12/28/micro-capの意外な使い方/</id><summary type="html">&lt;p&gt;4年次設置の電子回路CADで使っているMicro-CAPですが，他のSPICE系回路シミュレータには(たぶん)無いDynamic AC解析機能があります。
&lt;img alt="None" class="alignnone size-full wp-image-604" height="641" src="https://eiichiromomma.github.io/images/uploads/2017/12/78a2175f380937da70f79e81cf54fca5.png" width="661"&gt;&lt;/p&gt;
&lt;p&gt;こんな感じです。簡単に言うと電気回路理論の問題が解けます。&lt;/p&gt;
&lt;p&gt;青い四角形が複素電流で最 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;4年次設置の電子回路CADで使っているMicro-CAPですが，他のSPICE系回路シミュレータには(たぶん)無いDynamic AC解析機能があります。
&lt;img alt="None" class="alignnone size-full wp-image-604" height="641" src="https://eiichiromomma.github.io/images/uploads/2017/12/78a2175f380937da70f79e81cf54fca5.png" width="661"&gt;&lt;/p&gt;
&lt;p&gt;こんな感じです。簡単に言うと電気回路理論の問題が解けます。&lt;/p&gt;
&lt;p&gt;青い四角形が複素電流で最初の数字が大きさ，カンマの後の数字が偏角です。これは相互インダクタンスの回路で下がT型等価回路へ変換した回路で，同じ枝電流になっています。で，ピンクの楕円の方が複素電圧です。グランドの位置を変えているのは節点電圧法で解いた場合の電位を出すためです。電圧と電流は直角座標系での表示も出来ます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;電源はVoltage SourceのSineを使いAC解析の方に実効値を入れて初期位相はdegree&lt;/li&gt;
&lt;li&gt;計算が楽なのでω=1000として扱う&lt;ul&gt;
&lt;li&gt;Lの値はインピーダンス表記から1/1000&lt;/li&gt;
&lt;li&gt;Cの値はインピーダンス表記の逆数の1/1000&lt;/li&gt;
&lt;li&gt;Analysis-Dynamic ACで出てくるダイヤログで周波数を1000/6.28&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;相互インダクタンスはAnalog Primitives-Passive ComponentsのKを使う(磁気結合)&lt;ul&gt;
&lt;li&gt;k=M/√(L1・L2)でkを決める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という感じで演習の解答の確認にも使ってます。&lt;/p&gt;
&lt;p&gt;ちなみにMicro-CAP 11は&lt;a href="http://www.spectrum-soft.com/demoform.shtm"&gt;評価版&lt;/a&gt;を制限付きですが使えます。日本語のマニュアルとUIが欲しい人はCQ出版のMicro-CAP 9を買いましょう。&lt;/p&gt;</content><category term="講義"></category></entry><entry><title>macOSでRealsense</title><link href="https://eiichiromomma.github.io/2017/12/28/librealsense/" rel="alternate"></link><published>2017-12-28T19:00:00+09:00</published><updated>2017-12-28T19:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-12-28:/2017/12/28/librealsense/</id><summary type="html">&lt;p&gt;Realsense on macOS&lt;/p&gt;</summary><content type="html">&lt;p&gt;CreativeのSenz3dがmacOSでも使えるらしいので試してみた。&lt;/p&gt;
&lt;h1&gt;インストール(macOS)&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/IntelRealSense/librealsense"&gt;librealsense&lt;/a&gt;は公式サポートではないがIntel謹製のライブラリらしい。
Homebrewにも存在するがPython wrapperが欲しいので自前でビルドする。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/IntelRealSense/librealsense.git
mkdir&lt;span class="w"&gt; &lt;/span&gt;build
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build
ccmake&lt;span class="w"&gt; &lt;/span&gt;..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BUILD_CV_EXAMPLES: OpenCVの実装例&lt;/li&gt;
&lt;li&gt;BUILD_PCL_EXAMPLES: PCL(Point Cloud Library)の実装例&lt;/li&gt;
&lt;li&gt;BUILD_PYTHON_BINDINGS: Python用のpackage(Python3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;をONにして，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BUILD_WITH_OPENMP: OpenMPだがmacOSだとエラーになる。動くようにしても大して速くならないとのこと&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;をOFFにしておく。あとはOpenCVなりPCLなりが入っている環境なら問題無く動く。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;librealsense&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;capture&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multicam&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pointcloud&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sensor&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;distance&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;terminal&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;enumerate&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;realsense&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;viewer&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;collect&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;quality&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pyrealsense2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;2.8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="n"&gt;cpython&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pyrealsense2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="n"&gt;cpython&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pyrealsense2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpython&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pybackend2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;2.8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="n"&gt;cpython&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pybackend2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="n"&gt;cpython&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pybackend2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpython&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;grabcuts&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;latency&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;tool&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dnn&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Installing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pcl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;という感じに面白いサンプルも入る。&lt;/p&gt;
&lt;h1&gt;サンプル&lt;/h1&gt;
&lt;p&gt;下のWrapperのサンプル以外のrs-*がそれ。名前のまんまなのでそれぞれ実行すると分かる。
realsense-viewerは至れり尽せり。&lt;/p&gt;
&lt;h1&gt;Pythonパッケージ&lt;/h1&gt;
&lt;p&gt;pythonのpyrealsense2は適切な場所に置く必要がある。例えば&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/lib/python3.6/site-packages/
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;/usr/local/lib/pyrealsense2.cpython-36m-darwin.so&lt;span class="w"&gt; &lt;/span&gt;pyrealsense2.so
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;/usr/local/lib/pybackend2.cpython-36m-darwin.so&lt;span class="w"&gt; &lt;/span&gt;pybackend2.so
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;のような感じで使える。&lt;/p&gt;
&lt;h1&gt;Wrapperのサンプル&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;rs-imshow: OpenCVのサンプル(imshow)&lt;/li&gt;
&lt;li&gt;rs-grabcuts: OpenCVのサンプル(Grabcutsの実装)&lt;/li&gt;
&lt;li&gt;rs-latency-tool: OpenCVのサンプルだがmacOSが白画面で応答しなくなった&lt;/li&gt;
&lt;li&gt;rs-dnn: OpenCVのサンプル(SSD+距離計測, build/wrappers/opencv/dnnへ移動して実行)&lt;/li&gt;
&lt;li&gt;rs-pcl: PCLのサンプル&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Pythonパッケージの使用例&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/IntelRealSense/librealsense/tree/master/wrappers/python"&gt;ここ&lt;/a&gt;のを少し弄って動くようにした。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pyrealsense2&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;rs&lt;/span&gt;
&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;frames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait_for_frames&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_depth_frame&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;coverage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;coverage&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;coverage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; .:nhBXWW&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
            &lt;span class="n"&gt;coverage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で距離画像をASCII Art化して表示してくれる。
ローテク加減が面白い。
※固定長フォントでお楽しみ下さい&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;                                    &lt;/span&gt;.
&lt;span class="w"&gt;                                  &lt;/span&gt;nWBnBWWX:
&lt;span class="w"&gt;                               &lt;/span&gt;h&lt;span class="w"&gt; &lt;/span&gt;:WWWWWWWWWn.
&lt;span class="w"&gt;                               &lt;/span&gt;WnWWWWWWWWWWWB
&lt;span class="w"&gt;                             &lt;/span&gt;.nXhWWWWWWWWWWWW:
&lt;span class="w"&gt;                         &lt;/span&gt;.:hWWWWhWWWWWWWWWWWW:
&lt;span class="w"&gt;                    &lt;/span&gt;:WXBXXWWWWWW:hWWWWWWWWWWn&lt;span class="w"&gt; &lt;/span&gt;n:&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="w"&gt;                   &lt;/span&gt;nWWWWWWWWWWWWX.:hhBXXh:n.&lt;span class="w"&gt; &lt;/span&gt;XWWXX
&lt;span class="w"&gt;                  &lt;/span&gt;hWWWWWWWWWWWWWWX:&lt;span class="w"&gt; &lt;/span&gt;hWBh:&lt;span class="w"&gt; &lt;/span&gt;.:WWWWWBB
&lt;span class="w"&gt;                 &lt;/span&gt;:WWWWWWWWWWWWWWXWWB:..&lt;span class="w"&gt; &lt;/span&gt;:BWWWWWXnXX
&lt;span class="w"&gt;                 &lt;/span&gt;XWWWWWBhWWWWWWWWWWWWWWWWWWWWWW:hB.














&lt;span class="w"&gt;                                  &lt;/span&gt;nWX:hWWX:
&lt;span class="w"&gt;                               &lt;/span&gt;B&lt;span class="w"&gt; &lt;/span&gt;:WWWWWWWWWn.
&lt;span class="w"&gt;                               &lt;/span&gt;WnWWWWWWWWWWWB
&lt;span class="w"&gt;                             &lt;/span&gt;.:XhWWWWWWWWWWWW.
&lt;span class="w"&gt;                          &lt;/span&gt;.hWWWWnWWWWWWWWWWWW:
&lt;span class="w"&gt;                    &lt;/span&gt;:XBhBXWWWWWW:hWWWWWWWWWWn&lt;span class="w"&gt; &lt;/span&gt;n.
&lt;span class="w"&gt;                   &lt;/span&gt;hWWWWWWWWWWWWB&lt;span class="w"&gt; &lt;/span&gt;:BhBXXh:n:&lt;span class="w"&gt; &lt;/span&gt;XWWXB
&lt;span class="w"&gt;                  &lt;/span&gt;hWWWWWWWWWWWXWWX:&lt;span class="w"&gt; &lt;/span&gt;hWXhn&lt;span class="w"&gt; &lt;/span&gt;.:WWWWWhX
&lt;span class="w"&gt;                 &lt;/span&gt;.WWWWWWWWWWWWWWWWWB:.&lt;span class="w"&gt;  &lt;/span&gt;:BWWWWWWnBh
&lt;span class="w"&gt;                 &lt;/span&gt;BWWWWXBhWWWWWWWXWWWWWWWWWWWWWWhXB:














&lt;span class="w"&gt;                                  &lt;/span&gt;BWnnBWWB
&lt;span class="w"&gt;                              &lt;/span&gt;:.&lt;span class="w"&gt; &lt;/span&gt;hWWWWWWWWX.
&lt;span class="w"&gt;                               &lt;/span&gt;WnWWWWWWWWWWXh
&lt;span class="w"&gt;                              &lt;/span&gt;:XBWWWWWWWWWWWX.
&lt;span class="w"&gt;                          &lt;/span&gt;.BWWWXnWWWWWWWWWWWW
&lt;span class="w"&gt;                    &lt;/span&gt;nXBhBBWWWWWW.XWWWWWWWWWW..n.
&lt;span class="w"&gt;                   &lt;/span&gt;hWWWWWWWWWWWWn&lt;span class="w"&gt; &lt;/span&gt;hhBBXXhnh.:WWWXB
&lt;span class="w"&gt;                  &lt;/span&gt;hWWWWWWWWWWWXWWh&lt;span class="w"&gt;  &lt;/span&gt;WWXh:&lt;span class="w"&gt; &lt;/span&gt;.nWWWWXBh
&lt;span class="w"&gt;                 &lt;/span&gt;:WWWWWWWWWWWWWXWWWh..&lt;span class="w"&gt;  &lt;/span&gt;nXWWWWWXhWB.
&lt;span class="w"&gt;                 &lt;/span&gt;XWWWWWBhWWWWWWWXWWWWWWWWWWWWWXnBBn














&lt;span class="w"&gt;                                  &lt;/span&gt;XW.nBWWB
&lt;span class="w"&gt;                              &lt;/span&gt;n.&lt;span class="w"&gt; &lt;/span&gt;BWWWWWWWWh:
&lt;span class="w"&gt;                              &lt;/span&gt;:WnWWWWWWWWWWXn
&lt;span class="w"&gt;                              &lt;/span&gt;hWBWWWWWWWWWWWX
&lt;span class="w"&gt;                          &lt;/span&gt;:BWWWBnWWWWWWWWWWWW
&lt;span class="w"&gt;                    &lt;/span&gt;nBhhBXWWWWWW:XWWWWWWWWWW.:n..
&lt;span class="w"&gt;                   &lt;/span&gt;BWWWWWWWWWWWWn&lt;span class="w"&gt; &lt;/span&gt;hBBXXXnnh&lt;span class="w"&gt; &lt;/span&gt;:WWWBB
&lt;span class="w"&gt;                  &lt;/span&gt;hWWWWWWWWWWWXWWh.&lt;span class="w"&gt; &lt;/span&gt;WWXh.&lt;span class="w"&gt; &lt;/span&gt;.nWWWWXBn
&lt;span class="w"&gt;                 &lt;/span&gt;.WWWWWWWWWWWWWXWWWh..&lt;span class="w"&gt;  &lt;/span&gt;nBWWWWWXhXh
&lt;span class="w"&gt;                 &lt;/span&gt;XWWWWWXBWWWWWWWXWWWWWWWWWWWWWWnhn













&lt;span class="w"&gt;                                       &lt;/span&gt;.
&lt;span class="w"&gt;                                 &lt;/span&gt;:WhnXWWW:
&lt;span class="w"&gt;                              &lt;/span&gt;n&lt;span class="w"&gt; &lt;/span&gt;:WWWWWWWWWBn.
&lt;span class="w"&gt;                              &lt;/span&gt;BhBWWWWWWWWWWX:
&lt;span class="w"&gt;                              &lt;/span&gt;hhWWWWWWWWWWWWh
&lt;span class="w"&gt;                          &lt;/span&gt;:BWWXnBWWWWWWWXWWWn
&lt;span class="w"&gt;                    &lt;/span&gt;:BBhhWWWWWWX:XWWWWWWWWWB&lt;span class="w"&gt; &lt;/span&gt;:n:
&lt;span class="w"&gt;                   &lt;/span&gt;hWWWWWWWWWWWWn&lt;span class="w"&gt; &lt;/span&gt;hnBBXX:::&lt;span class="w"&gt; &lt;/span&gt;hWWWBB
&lt;span class="w"&gt;                  &lt;/span&gt;hWWWWWWWWWWWXWWB..WWhn.&lt;span class="w"&gt; &lt;/span&gt;nBWWWWWBh
&lt;span class="w"&gt;                 &lt;/span&gt;:WWWWWWWWWWWWWXWWWB:...hXWWWWWXhXh.
&lt;span class="w"&gt;                 &lt;/span&gt;XWWWWWXXWWWWWWWXWWWWWWWWWWWWWXhXB.











&lt;span class="w"&gt;                                  &lt;/span&gt;BB:
&lt;span class="w"&gt;                              &lt;/span&gt;.hhWWWWWBn.
&lt;span class="w"&gt;                              &lt;/span&gt;XWWWWWWWWXh
&lt;span class="w"&gt;                            &lt;/span&gt;..WWWWWWWWWWWW
&lt;span class="w"&gt;                            &lt;/span&gt;nBWWWWWWWWWWWW
&lt;span class="w"&gt;                             &lt;/span&gt;hBWWWWWWWWWWX
&lt;span class="w"&gt;                           &lt;/span&gt;:hB.nXXhXWWXnn
&lt;span class="w"&gt;                        &lt;/span&gt;:XWWWWX:.&lt;span class="w"&gt; &lt;/span&gt;WWWWWn&lt;span class="w"&gt;  &lt;/span&gt;XWB.
&lt;span class="w"&gt;                   &lt;/span&gt;.XWWWWWWWWWXWB.&lt;span class="w"&gt; &lt;/span&gt;::.&lt;span class="w"&gt; &lt;/span&gt;.nWWWWWXh.
&lt;span class="w"&gt;                  &lt;/span&gt;.WWWWWWWWWWWXWWWWBhBXWWWWWWWWWWn.
&lt;span class="w"&gt;                 &lt;/span&gt;.WWWWWWWWWWWWWXWWWWWXWWWWWWWWWWWWX
&lt;span class="w"&gt;                 &lt;/span&gt;BWWWWWWWWWWWWWXWWWWWWWWWWWWWWWWWWh.
&lt;span class="w"&gt;                 &lt;/span&gt;XWWWWh:BWWWWWWWWWWWWWWWWWWBhh:XWn











&lt;span class="w"&gt;                               &lt;/span&gt;nXX.
&lt;span class="w"&gt;                            &lt;/span&gt;:hXWWWWWBnn
&lt;span class="w"&gt;                            &lt;/span&gt;WWWWWWWWWWB:
&lt;span class="w"&gt;                          &lt;/span&gt;:nWWWWWWWWWWWW
&lt;span class="w"&gt;                           &lt;/span&gt;BWWWWWWWWWWWW
&lt;span class="w"&gt;                           &lt;/span&gt;nBWWWWWWWWWWX
&lt;span class="w"&gt;                         &lt;/span&gt;.nB.nWBXWWWBn:&lt;span class="w"&gt;  &lt;/span&gt;:
&lt;span class="w"&gt;                      &lt;/span&gt;.hWWWWX:&lt;span class="w"&gt; &lt;/span&gt;.WWWWW:&lt;span class="w"&gt; &lt;/span&gt;.XWWXn.
&lt;span class="w"&gt;                  &lt;/span&gt;.XWWWXWWWWWWB:.::.&lt;span class="w"&gt; &lt;/span&gt;:BBWWWWWWWn
&lt;span class="w"&gt;                 &lt;/span&gt;:WWWWWWWWWWXWWWWBBXWWWBWWWWWWWWWh
&lt;span class="w"&gt;                &lt;/span&gt;.WWWWWWWWWWWWWXWWWWXXWWWWWWWWWWWWW:
&lt;span class="w"&gt;                &lt;/span&gt;hWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWB
&lt;span class="w"&gt;                &lt;/span&gt;XWWWXnnXWWWWWWWWWWWWWWWWWWWXhhXWBh











&lt;span class="w"&gt;                              &lt;/span&gt;:Bh:
&lt;span class="w"&gt;                           &lt;/span&gt;.nBWWWWWXhh:
&lt;span class="w"&gt;                           &lt;/span&gt;BWWWWWWWWWXh
&lt;span class="w"&gt;                          &lt;/span&gt;:XWWWWWWWWWWWh
&lt;span class="w"&gt;                          &lt;/span&gt;.BWWWWWWWWWWWh
&lt;span class="w"&gt;                           &lt;/span&gt;:WWWWWWWWWWW:
&lt;span class="w"&gt;                         &lt;/span&gt;nBB.BBhXWWXB:&lt;span class="w"&gt;  &lt;/span&gt;nh:
&lt;span class="w"&gt;                     &lt;/span&gt;.:hWWWWh.&lt;span class="w"&gt; &lt;/span&gt;BWWWWh&lt;span class="w"&gt; &lt;/span&gt;.BWWWXh:.
&lt;span class="w"&gt;                  &lt;/span&gt;.XWWWWWWWWXWB..:.&lt;span class="w"&gt;  &lt;/span&gt;BWWWWWWWWWB
&lt;span class="w"&gt;                 &lt;/span&gt;:WWWWWWWWWWWWWWWBBBXWXWWWWWWWWWWh
&lt;span class="w"&gt;                &lt;/span&gt;.WWWWWWWWWWWWhXWWWWXXWWWWWWWWWWWWWh
&lt;span class="w"&gt;                &lt;/span&gt;hWWWWWWWWWWWWWWWWXWWWWWWWWWWWWWWWXh
&lt;span class="w"&gt;                &lt;/span&gt;BWWWX:&lt;span class="w"&gt; &lt;/span&gt;hBWWWWWWWWWWWWWWWWWWX:hXWhn:











&lt;span class="w"&gt;                                &lt;/span&gt;:B:
&lt;span class="w"&gt;                              &lt;/span&gt;:hXWWWWh
&lt;span class="w"&gt;                             &lt;/span&gt;.hWWWWWWWX
&lt;span class="w"&gt;                             &lt;/span&gt;nhWWWWWWWW.
&lt;span class="w"&gt;                               &lt;/span&gt;nBBXXBn.
&lt;span class="w"&gt;                            &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;..&lt;span class="w"&gt; &lt;/span&gt;hWXX
&lt;span class="w"&gt;                        &lt;/span&gt;hB...XXWBn...nWh:.&lt;span class="w"&gt; &lt;/span&gt;.n.
&lt;span class="w"&gt;                      &lt;/span&gt;hWWWWXWWWBWWWWWWWWWhBWW.
&lt;span class="w"&gt;                     &lt;/span&gt;:WWWWWWWWWWWWWWWWWWWWXWXn:
&lt;span class="w"&gt;                     &lt;/span&gt;hWWWWWWWWWWWWWWWWWWWWWhBXh
&lt;span class="w"&gt;                     &lt;/span&gt;nWWWWWWWWWWWWWWWWWWWXh.nBB
&lt;span class="w"&gt;                     &lt;/span&gt;BXBn&lt;span class="w"&gt; &lt;/span&gt;:WWWWWWWXWWWXXWWWWB:
&lt;span class="w"&gt;                           &lt;/span&gt;nBhWWWWWWWXBWWWXhn:





















&lt;span class="w"&gt;                               &lt;/span&gt;.&lt;span class="w"&gt;  &lt;/span&gt;.h:..&lt;span class="w"&gt;   &lt;/span&gt;.
&lt;span class="w"&gt;                            &lt;/span&gt;.&lt;span class="w"&gt;   &lt;/span&gt;BXWWWB:&lt;span class="w"&gt; &lt;/span&gt;.nBhn
&lt;span class="w"&gt;                           &lt;/span&gt;n:.&lt;span class="w"&gt;   &lt;/span&gt;.:&lt;span class="w"&gt;       &lt;/span&gt;::.






















&lt;span class="w"&gt;                                 &lt;/span&gt;hXWh..&lt;span class="w"&gt;    &lt;/span&gt;.
&lt;span class="w"&gt;                                   &lt;/span&gt;:.&lt;span class="w"&gt;      &lt;/span&gt;.






















&lt;span class="w"&gt;                                &lt;/span&gt;:WWWn:.&lt;span class="w"&gt;  &lt;/span&gt;..
&lt;span class="w"&gt;                                  &lt;/span&gt;:.&lt;span class="w"&gt;       &lt;/span&gt;.






















&lt;span class="w"&gt;                                &lt;/span&gt;.BBX:.:.&lt;span class="w"&gt;  &lt;/span&gt;..
&lt;span class="w"&gt;                                  &lt;/span&gt;::






















&lt;span class="w"&gt;                                &lt;/span&gt;.hBX&lt;span class="w"&gt;       &lt;/span&gt;.
&lt;span class="w"&gt;                                  &lt;/span&gt;nn





















&lt;span class="w"&gt;                                 &lt;/span&gt;n&lt;span class="w"&gt; &lt;/span&gt;:.
&lt;span class="w"&gt;                                &lt;/span&gt;.:n:&lt;span class="w"&gt;      &lt;/span&gt;.
&lt;span class="w"&gt;                                &lt;/span&gt;.hXh













&lt;span class="w"&gt;                                &lt;/span&gt;hW:.:
&lt;span class="w"&gt;                               &lt;/span&gt;nXWWWXh:
&lt;span class="w"&gt;                               &lt;/span&gt;WWWWWWWn
&lt;span class="w"&gt;                               &lt;/span&gt;nWXXXXB.
&lt;span class="w"&gt;                           &lt;/span&gt;.&lt;span class="w"&gt;   &lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;.Bh:&lt;span class="w"&gt; &lt;/span&gt;:B
&lt;span class="w"&gt;                         &lt;/span&gt;hhW:&lt;span class="w"&gt; &lt;/span&gt;BWnn..:BWX
&lt;span class="w"&gt;                        &lt;/span&gt;.nXWnhWWWWWWWWWh..&lt;span class="w"&gt; &lt;/span&gt;..
&lt;span class="w"&gt;                        &lt;/span&gt;nWWhBWWWWWWWWWX:nn
&lt;span class="w"&gt;                         &lt;/span&gt;:B:hWWWWWWWWWWhnn&lt;span class="w"&gt;  &lt;/span&gt;.
&lt;span class="w"&gt;                             &lt;/span&gt;hhhXWWWWWWhn:
&lt;span class="w"&gt;                                &lt;/span&gt;.BXhBnh&lt;span class="w"&gt;  &lt;/span&gt;..












&lt;span class="w"&gt;                               &lt;/span&gt;:Bn.
&lt;span class="w"&gt;                              &lt;/span&gt;nXWWWWXh.
&lt;span class="w"&gt;                             &lt;/span&gt;nWWWWWWWWW
&lt;span class="w"&gt;                             &lt;/span&gt;:WWWWWWWWX
&lt;span class="w"&gt;                            &lt;/span&gt;..:BXXXBhh.&lt;span class="w"&gt; &lt;/span&gt;:
&lt;span class="w"&gt;                           &lt;/span&gt;:BWn&lt;span class="w"&gt; &lt;/span&gt;.WBXn&lt;span class="w"&gt; &lt;/span&gt;n:::.
&lt;span class="w"&gt;                       &lt;/span&gt;nBXBXWWWWh:.:nXWXnXWXW
&lt;span class="w"&gt;                      &lt;/span&gt;nWXWWWWWWhXWWWWWWWWWWXB:
&lt;span class="w"&gt;                     &lt;/span&gt;.WWWWWWWWWWWWWWWWWWWWXhWX:
&lt;span class="w"&gt;                     &lt;/span&gt;:WWWXXWWWWWWWWWWWWWWX&lt;span class="w"&gt; &lt;/span&gt;nBn.
&lt;span class="w"&gt;                      &lt;/span&gt;BWBh:hWWWWWWWWWWWWWB.nnh.
&lt;span class="w"&gt;                        &lt;/span&gt;.&lt;span class="w"&gt;   &lt;/span&gt;:hBBWWWWWWW::&lt;span class="w"&gt;    &lt;/span&gt;.











&lt;span class="w"&gt;                               &lt;/span&gt;nn
&lt;span class="w"&gt;                            &lt;/span&gt;.nWWWWhhnh:
&lt;span class="w"&gt;                            &lt;/span&gt;BWWWWWWWWXX
&lt;span class="w"&gt;                            &lt;/span&gt;WWWWWWWWWWWn
&lt;span class="w"&gt;                           &lt;/span&gt;.BWWWWWWWWWW
&lt;span class="w"&gt;                            &lt;/span&gt;.XWWWWWXXWn&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="w"&gt;                         &lt;/span&gt;nWWX&lt;span class="w"&gt; &lt;/span&gt;::WWWWn&lt;span class="w"&gt;  &lt;/span&gt;:WB&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="w"&gt;                    &lt;/span&gt;.::hhWWWWXn.hhhn&lt;span class="w"&gt; &lt;/span&gt;nWBWWWWXBn
&lt;span class="w"&gt;                    &lt;/span&gt;XWWWWWWWWWWWBhhBWWWBWWWWWWB:
&lt;span class="w"&gt;                   &lt;/span&gt;:WWWWWWWWWWXWWWWWWWWWWWWWWXWW
&lt;span class="w"&gt;                   &lt;/span&gt;hWWWWWWWWWWWWWWWWWWWWWWWXWWWX.
&lt;span class="w"&gt;                   &lt;/span&gt;nWXWh:WWWWWWWWWWWWWWWWWX.WWWX.
&lt;span class="w"&gt;                   &lt;/span&gt;:XXXn&lt;span class="w"&gt; &lt;/span&gt;nBWWWWWWWWWWWWWWX.BWX:.











&lt;span class="w"&gt;                              &lt;/span&gt;hXB:
&lt;span class="w"&gt;                           &lt;/span&gt;:hWWWWWBBnhn
&lt;span class="w"&gt;                           &lt;/span&gt;WWWWWWWWWWWXh
&lt;span class="w"&gt;                           &lt;/span&gt;WWWWWWWWWWWWB
&lt;span class="w"&gt;                           &lt;/span&gt;WWWWWWWWWWWWn
&lt;span class="w"&gt;                           &lt;/span&gt;hWWWWWWWWWWW.
&lt;span class="w"&gt;                        &lt;/span&gt;nXWn:XBXWWXBhn&lt;span class="w"&gt;  &lt;/span&gt;Xh:
&lt;span class="w"&gt;                     &lt;/span&gt;::WWWWWn&lt;span class="w"&gt; &lt;/span&gt;:WWWWW..nWWWWXh::
&lt;span class="w"&gt;                  &lt;/span&gt;:WWWWWWWWXWWn::...nWWXWWWWWWWB
&lt;span class="w"&gt;                  &lt;/span&gt;WWWWWWWWWWWWWWWWWWWWWXWWWWWWWWB
&lt;span class="w"&gt;                 &lt;/span&gt;nWWWWWWWWWWWXWWWWWWWWWWWWWWWWWWX
&lt;span class="w"&gt;                 &lt;/span&gt;:WWWWXWWWWWWWWWWWWWWWWWWWWXWWWWX
&lt;span class="w"&gt;                  &lt;/span&gt;BBnB:nXWWWWWWWWWWWWWWWWW.nWWWWB
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Memo"></category><category term="Realsense"></category><category term="OpenCV"></category><category term="Python"></category><category term="PCL"></category></entry><entry><title>Oculus</title><link href="https://eiichiromomma.github.io/2017/12/15/oculus/" rel="alternate"></link><published>2017-12-15T13:00:00+09:00</published><updated>2017-12-15T13:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-12-15:/2017/12/15/oculus/</id><content type="html">&lt;p&gt;新しいやつが来ました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2018/01/IMG_0047-e1516285743501.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;新しい研究室で全員これ被って仮想空間を広く使うのも悪くない。&lt;/p&gt;</content><category term="News"></category></entry><entry><title>ドローン作業中</title><link href="https://eiichiromomma.github.io/2017/12/09/%E3%83%89%E3%83%AD%E3%83%BC%E3%83%B3%E4%BD%9C%E6%A5%AD%E4%B8%AD/" rel="alternate"></link><published>2017-12-09T13:00:00+09:00</published><updated>2017-12-09T13:00:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-12-09:/2017/12/09/ドローン作業中/</id><content type="html">&lt;p&gt;&lt;img alt="None" class="alignnone size-full wp-image-609" height="480" src="https://eiichiromomma.github.io/images/uploads/2018/01/Mambo_2017-12-09T0950530900_A93A3A.jpg" width="640"&gt;&lt;/p&gt;
&lt;p&gt;この後プロペラ破損&lt;/p&gt;</content><category term="News"></category></entry><entry><title>受賞</title><link href="https://eiichiromomma.github.io/2017/12/05/%E5%8F%97%E8%B3%9E/" rel="alternate"></link><published>2017-12-05T21:21:00+09:00</published><updated>2017-12-05T21:21:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-12-05:/2017/12/05/受賞/</id><summary type="html">&lt;p&gt;共同研究をしている本学歯学部の古市先生が「光学印象機器の3Dデータを活用した窩洞形成評価システムの研究．」と題した発表で，第10回 日本総合歯科学会 総会・学術 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;共同研究をしている本学歯学部の古市先生が「光学印象機器の3Dデータを活用した窩洞形成評価システムの研究．」と題した発表で，第10回 日本総合歯科学会 総会・学術大会で優秀口演賞を受賞されました。おめでとうございます。&lt;/p&gt;</content><category term="News"></category></entry><entry><title>KivyでOpenCV</title><link href="https://eiichiromomma.github.io/2017/12/05/Kivy-OpenCV/" rel="alternate"></link><published>2017-12-05T08:00:00+09:00</published><updated>2017-12-05T08:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-12-05:/2017/12/05/Kivy-OpenCV/</id><summary type="html">&lt;p&gt;OpenCV with Kivy&lt;/p&gt;</summary><content type="html">&lt;h1&gt;他のGUIで表示してみる&lt;/h1&gt;
&lt;p&gt;OpenCVのPythonモジュールではQtが絡むと色々と厄介になる。
ビルド時のライブラリの依存の問題でシステムに入ってるQtやAnacondaに入ってるQtやその他諸々のQtをCMakeが拾ってきて，何も考えずにビルドするとビルドは問題なく終わるのに参照次第ではimportすら出来ない。(当たり前)
という訳でQt抜きのパッケージになるケースが非常に多い。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://riverbankcomputing.com/software/pyqt/intro"&gt;PyQt&lt;/a&gt;か&lt;a href="https://wiki.qt.io/PySide/ja"&gt;PySide&lt;/a&gt;かという選択肢もあるが，試しにKivyを使ってみたら結構簡単だった。
頑張ればOpenCVでのQt-highguiみたいにSaveボタンを付けたり(これは簡単)，拡大して画素値を出したりも出来そうだ。&lt;/p&gt;
&lt;h1&gt;サンプル&lt;/h1&gt;
&lt;p&gt;&lt;img alt="こんな感じ" src="https://eiichiromomma.github.io/images/20171205-1.png"&gt;&lt;/p&gt;
&lt;p&gt;こんな感じでWebCAM-スライダ-ボタンという並び。KivyのSliderは何故かラベルが無いのでちょっと工夫して付け足してる。&lt;/p&gt;
&lt;p&gt;構造としてはAppを継承したメインのクラスがあり，buildでUIの構築(と初期設定)，SliderとButtonにbindしたコールバック，Clock.schedule_intervalで指定してるupdateで更新。
update内でOpenCV周りの処理を行なってImageのtextureを書き換えて表示といった流れになる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.slider&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Slider&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.image&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.label&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.graphics.texture&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Texture&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.clock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Clock&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cv2&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CvCamera&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;#UIの構築等&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VideoCapture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# ButtonやSlider等は基本size_hintでサイズ比率を指定(絶対値の時はNoneでsize=)&lt;/span&gt;
        &lt;span class="c1"&gt;# Verticalの中に置くhorizontalなBoxLayout (ここだけ2column)&lt;/span&gt;
        &lt;span class="n"&gt;layout2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;horizontal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s1Label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Slider&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;halign&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;slider1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Slider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;slider1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slideCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# 日本語フォントを使いたいときはfont_nameでフォントへのパス&lt;/span&gt;
        &lt;span class="n"&gt;button1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ボタン&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;font_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/usr/local/texlive/texmf-local/fonts/truetype/cjk-gs-integrate/ipag.ttf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;button1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_press&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buttonCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#bindでイベントごとにコールバック指定&lt;/span&gt;
        &lt;span class="c1"&gt;# Imageに後で画像を描く&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;img1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="c1"&gt;# Layoutを作ってadd_widgetで順次モノを置いていく(並びは置いた順)&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vertical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;img1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# ここだけ2columnでLabelとSliderを並べる&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;layout2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s1Label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;layout2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slider1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# 1columnに戻る&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;#カメラ待ち&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isOpened&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; 
            &lt;span class="k"&gt;pass&lt;/span&gt;
        &lt;span class="c1"&gt;# 更新スケジュールとコールバックの指定&lt;/span&gt;
        &lt;span class="n"&gt;Clock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schedule_interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;30.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;slideCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Slider横のLabelをSliderの値に&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s1Label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Slider &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;buttonCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 何かのフラグに使える&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buttn &amp;lt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt; is pressed.&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 基本的にここでOpenCV周りの処理を行なってtextureを更新する&lt;/span&gt;
        &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;texture1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Texture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;colorfmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bgr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;texture1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blit_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;colorfmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bgr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bufferfmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubyte&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;img1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;texture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texture1&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;CvCamera&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Memo"></category><category term="Kivy"></category><category term="OpenCV"></category><category term="Python"></category></entry><entry><title>PCLのサンプル</title><link href="https://eiichiromomma.github.io/2017/10/24/pcl%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/" rel="alternate"></link><published>2017-10-24T22:24:00+09:00</published><updated>2017-10-24T22:24:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-10-24:/2017/10/24/pclのサンプル/</id><content type="html">&lt;p&gt;講義でも紹介したPoint Cloud Libraryのサンプル置き場です。PCL, CMake, Qtのある環境が必要です。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/eiichiromomma/pcl_samples"&gt;https://github.com/eiichiromomma/pcl_samples&lt;/a&gt;&lt;/p&gt;</content><category term="講義"></category></entry><entry><title>Google Drive File Stream</title><link href="https://eiichiromomma.github.io/2017/10/17/Google-DriveFS/" rel="alternate"></link><published>2017-10-17T22:00:00+09:00</published><updated>2017-10-17T22:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-10-17:/2017/10/17/Google-DriveFS/</id><summary type="html">&lt;p&gt;Google Drive File Stream&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Google Driveからの乗り換え&lt;/h1&gt;
&lt;p&gt;Google Driveのデスクトップアプリ(PCに同期させるアプリ)は2018年3月に廃止が決定。
置き換えソフトであるGoogle Drive File Streamアプリは，これまで大学との契約形態については未対応だったが配布開始された模様。
Google Driveアプリを使われていた方は乗り換えが必要で，かなり挙動が違った。
特にCドライブの容量が厳しく他のドライブに退避させていた方は注意が必要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「マイドライブ」と「チームドライブ」は外付けドライブのフォルダとしてマウントされる&lt;/li&gt;
&lt;li&gt;データは基本的にクラウドに保持(ネットに繋っていないと見えない)&lt;/li&gt;
&lt;li&gt;オフラインでも使えるようにするにはフォルダやファイルを選択して右クリックメニューで「オフラインで使用可能にする」&lt;/li&gt;
&lt;li&gt;オフライン用のキャッシュはc:\Users\username\AppData\Local\Google\DriveFSに保存される&lt;/li&gt;
&lt;li&gt;Google DriveをCドライブ以外で運用していた場合には，Cドライブの容量を食い潰されるうえに設定で変更できない&lt;/li&gt;
&lt;li&gt;既存のGoogleドライブからの引き継ぎは無い(インストーラorアプリがGoogleドライブの停止を推奨してくる)&lt;/li&gt;
&lt;li&gt;旧GoogleドライブのフォルダはGoogle Drive File Streamに以降した後は手動で削除する必要がある(消さなくても良いが同期しないうえに容量を食う)&lt;/li&gt;
&lt;li&gt;同期中はマウント状態が不安定になる(恐らく改善される)&lt;/li&gt;
&lt;li&gt;特に大量のファイルを同期させようとするとエクスプローラーが応答しなくなるが，暫く放置すると同期が終わって正常な状態になる&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;別ドライブにキャッシュを置く方法(無保証)&lt;/h1&gt;
&lt;p&gt;Google Drive File Streamをインストールする前に以下の作業をする。(後でもDriveFSをコピーしてしまえば出来るが入れる前の方が安全)&lt;/p&gt;
&lt;h2&gt;Windows&lt;/h2&gt;
&lt;p&gt;大容量HDDがHドライブのとき，コマンドプロンプトで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DFSCache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でh:\DFSCacheを作成して，そこへのシンボリックリンクをGoogle Drive File Streamアプリが作成する筈フォルダ名で作成する。(usernameは自分のホームフォルダに置き換える)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mklink /d c:\Users\username\AppData\Local\Google\DriveFS h:\DFSCache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;としてからGoogle Drive File Streamをインストールすると，h:\DFSCacheにもりもりファイルが溜まる。&lt;/p&gt;
&lt;h2&gt;Mac&lt;/h2&gt;
&lt;p&gt;/Users/username/Library/Application Support/Google/DriveFS にキャッシュが置かれるので，これを外付けドライブ等へのシンボリックリンクにする。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/Volumes/extdrive/DriveFS
sudo&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;username:staff&lt;span class="w"&gt; &lt;/span&gt;DriveFS
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/Users/username/Library/Application&lt;span class="se"&gt;\ &lt;/span&gt;Support/Google
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;/Volumes/extdrive/DriveFS&lt;span class="w"&gt; &lt;/span&gt;DriveFS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でextdrive上に逃がせる。&lt;/p&gt;</content><category term="Memo"></category><category term="GoogleDrive"></category></entry><entry><title>ひき続きvcpkg</title><link href="https://eiichiromomma.github.io/2017/10/15/vcpkg/" rel="alternate"></link><published>2017-10-15T23:00:00+09:00</published><updated>2017-10-15T23:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-10-15:/2017/10/15/vcpkg/</id><summary type="html">&lt;p&gt;vcpkg&lt;/p&gt;</summary><content type="html">&lt;h1&gt;vcpkg&lt;/h1&gt;
&lt;p&gt;現状でのメモ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FreeBSDのportsみたいなものでソースを拾ってきてビルドするシステムなので巨大ライブラリの場合はNuGetのように直ぐ使えるものではない&lt;/li&gt;
&lt;li&gt;先日のに追記した通り英語の言語パックが必要。( &lt;a href="https://www.microsoft.com/en-US/download/details.aspx?id=48157"&gt;英語言語パック&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;おまじないレベルだがchcp 65001しておく&lt;/li&gt;
&lt;li&gt;buildtrees以下に展開されてビルドするがvcpkg removeでもそれらは削除されない&lt;/li&gt;
&lt;li&gt;buildtrees以下は平気で100G越えてくるので要注意&lt;/li&gt;
&lt;li&gt;buildtrees以下はインストールしてしまえば消しても実用上問題ない&lt;ul&gt;
&lt;li&gt;各OSSのソースレベルデバッグは当然出来ない&lt;/li&gt;
&lt;li&gt;サンプルも消える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;msmpiでコケる時はdownloadsにインストーラがあるのでそれを使ってインストールしておく&lt;/li&gt;
&lt;li&gt;必要なファイルはinstalledに配置され，手動，integrate，cmake(toolchain)で使える&lt;/li&gt;
&lt;li&gt;NativeなCMakeで使うのは&lt;a href="https://github.com/Microsoft/vcpkg/blob/master/docs/examples/using-sqlite.md"&gt;ここ&lt;/a&gt;の最後にあるが微妙&lt;/li&gt;
&lt;li&gt;import/export機能があるので，速いマシンでパッケージをビルド→export→他マシンでimportすれば同一環境を作れる&lt;/li&gt;
&lt;/ul&gt;</content><category term="Memo"></category><category term="VC"></category></entry><entry><title>vcpkgのninja</title><link href="https://eiichiromomma.github.io/2017/10/13/vcpkg-ninja/" rel="alternate"></link><published>2017-10-13T23:00:00+09:00</published><updated>2017-10-13T23:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-10-13:/2017/10/13/vcpkg-ninja/</id><summary type="html">&lt;p&gt;ninja in vcpkg&lt;/p&gt;</summary><content type="html">&lt;h1&gt;vcpkgでハマる&lt;/h1&gt;
&lt;h2&gt;追記&lt;/h2&gt;
&lt;p&gt;↓で色々頑張ったのだが結局のところ英語以外の環境はあちこちでトラブルが発生する。
諦めてVisual Studioの&lt;a href="https://www.microsoft.com/en-US/download/details.aspx?id=48157"&gt;英語言語パック&lt;/a&gt;をインストールしたら解決した。&lt;/p&gt;
&lt;h2&gt;旧記事&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/Microsoft/vcpkg"&gt;vcpkg&lt;/a&gt;を試してみようと，とりあえずPower Shellで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\vcpkg install opencv:x64-windows
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とやったらzlibのビルドで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Building&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;zlib&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BUILD_FAILED&lt;/span&gt;
&lt;span class="n"&gt;Please&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ensure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;portfiles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;vcpkg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;then&lt;/span&gt;
&lt;span class="n"&gt;submit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;an&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;com&lt;/span&gt;&lt;span class="sr"&gt;/Microsoft/vcpkg/iss&lt;/span&gt;&lt;span class="n"&gt;ues&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;including&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Package&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;windows&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Vcpkg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;e19c24d2911ff1ef648aeed0c596e3987eafebf&lt;/span&gt;

&lt;span class="n"&gt;Additionally&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;relevant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;above&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいなエラーでコケる。エラーログを見てみると&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="s2"&gt;&amp;quot;C:/local/vcpkg/downloads/cmake-3.9.3-win32-x86/bin/cmcldeps.exe&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;local&lt;/span&gt;\&lt;span class="n"&gt;vcpkg&lt;/span&gt;\&lt;span class="n"&gt;buildtrees&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;\&lt;span class="n"&gt;src&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;\&lt;span class="n"&gt;win3&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;\&lt;span class="n"&gt;zlib1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CMakeFiles\zlib.dir\win32\zlib1.res.d&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CMakeFiles&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;\&lt;span class="n"&gt;win32&lt;/span&gt;\&lt;span class="n"&gt;zlib1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;: CN[h t@C:  &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;C:/Program Files&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Visual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Studio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;14.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;VC&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;amd64_x86&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; C:\PROGRA~2\WI3CF2~1\8.1&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\x64\r&lt;/span&gt;&lt;span class="s2"&gt;c.exe -DNO_FSEEKO -DZLIB_&lt;/span&gt;
&lt;span class="n"&gt;DLL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D_CRT_NONSTDC_NO_DEPRECATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D_CRT_SECURE_NO_DEPRECATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;IC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;local&lt;/span&gt;\&lt;span class="n"&gt;vcpkg&lt;/span&gt;\&lt;span class="n"&gt;buildtrees&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;\&lt;span class="n"&gt;src&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;IC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;local&lt;/span&gt;\&lt;span class="n"&gt;v&lt;/span&gt;
&lt;span class="n"&gt;cpkg&lt;/span&gt;\&lt;span class="n"&gt;buildtrees&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;\&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;DWIN32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;foCMakeFiles&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;\&lt;span class="n"&gt;win32&lt;/span&gt;\&lt;span class="n"&gt;zlib1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;local&lt;/span&gt;\&lt;span class="n"&gt;vcpkg&lt;/span&gt;\&lt;span class="n"&gt;buildtrees&lt;/span&gt;\&lt;span class="n"&gt;zlib&lt;/span&gt;\&lt;span class="n"&gt;src&lt;/span&gt;\&lt;span class="n"&gt;z&lt;/span&gt;
&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;\&lt;span class="n"&gt;win32&lt;/span&gt;\&lt;span class="n"&gt;zlib1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;途中変な文字化けをしているのでchcpでutf-8にしていないせいかと&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;chcp 65001
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とやってから実行してみたが何の変化も無し。
zlibのportsを見てみると，どうもninjaを使っているらしい。
そして&lt;a href="https://github.com/Microsoft/vcpkg/commit/67e876c76555c466e4faf49d6cd80a88b835f972#diff-1478a69d316b5c33129cf0ec2c174b7d"&gt;これ&lt;/a&gt;。
という訳でvcpkg/ports/zlib/portfile.cmakeの&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;PREFER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;NINJA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;をコメントアウト。
ようやくビルドできた。&lt;/p&gt;</content><category term="Memo"></category><category term="VC"></category></entry><entry><title>Google Apps ScriptでDriveとGMail連携</title><link href="https://eiichiromomma.github.io/2017/09/23/GAS/" rel="alternate"></link><published>2017-09-23T21:00:00+09:00</published><updated>2017-09-23T21:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-09-23:/2017/09/23/GAS/</id><summary type="html">&lt;p&gt;GoogleDrive and GMail&lt;/p&gt;</summary><content type="html">&lt;h1&gt;参加者が撮った写真を自動でWebアルバムみたいに表示したい&lt;/h1&gt;
&lt;p&gt;という要望があったので，この手の連携となれば&lt;a href="https://ifttt.com"&gt;IFTTT&lt;/a&gt;だろと調べてみたのだが，不特定多数からの受付が出来なさそうなので諦め。&lt;/p&gt;
&lt;p&gt;GMailだとusername@gmail.comなアドレスについて，username+tag@gmail.comでも受信できる技があるので，それをトリガにGoogle Photosに保存できるだろと少し調査。
取り敢えずGoogle Driveなら直ぐ出来そうなので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;特定のアドレスに送られたメールの添付ファイルをGoogle Driveのフォルダに自動で保存する(メールはゴミ箱へ)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;という処理に。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;e-mail: username+tag@gmail.com&lt;/li&gt;
&lt;li&gt;Google Driveのフォルダ: Test&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;で，ググって出てきたスクリプトだと&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getMessages&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getSubject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Target&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;みたいな処理だったので，ならToでもできるだろって事で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getMessages&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getSubject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;username+tag@gmail.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;としたら，Outlookが&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="nv"&gt;@gmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で送ってくるのでFalseになる。調べたら部分一致はindexOfでイケるらしいので下記で成功。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;gmailFileUploader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Threads&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GmailApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getInboxThreads&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;　&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;50&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;　&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;isUnread&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;　&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getMessages&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getTo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;username+tag@gmail.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;attachments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getMessages&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;getAttachments&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;　&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;folders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DriveApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getFoldersByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;folders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasNext&lt;/span&gt;&lt;span class="p"&gt;()){&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;folders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;attachments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DriveApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attachments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;Threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;moveToTrash&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//保存終了したらゴミ箱に移動&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Memo"></category><category term="Javascript"></category></entry><entry><title>研究室見学の受付時間について2017</title><link href="https://eiichiromomma.github.io/2017/09/21/%E7%A0%94%E7%A9%B6%E5%AE%A4%E8%A6%8B%E5%AD%A6%E3%81%AE%E5%8F%97%E4%BB%98%E6%99%82%E9%96%93%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62017/" rel="alternate"></link><published>2017-09-21T09:07:00+09:00</published><updated>2017-09-21T09:07:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-09-21:/2017/09/21/研究室見学の受付時間について2017/</id><summary type="html">&lt;p&gt;仮配属の季節になりました。下記が研究室見学並びに質問の受付時間です。希望する方は下記日時に8号館812室へ来て下さい。事前に momma.eiichiro\@nihon-u …&lt;/p&gt;</summary><content type="html">&lt;p&gt;仮配属の季節になりました。下記が研究室見学並びに質問の受付時間です。希望する方は下記日時に8号館812室へ来て下さい。事前に momma.eiichiro\@nihon-u.ac.jp まで連絡貰えると助かります。下記以外で希望する場合には必ずメールで事前に連絡をお願いします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;9/23(土) 15:30-17:00&lt;/li&gt;
&lt;li&gt;9/25(月) 15:30-17:00&lt;/li&gt;
&lt;li&gt;9/27(水) 16:00-17:30&lt;/li&gt;
&lt;li&gt;9/30(土) [16:15]{style="color: #ff0000;"}-17:00&lt;/li&gt;
&lt;li&gt;10/5(木) 15:30-17:00&lt;/li&gt;
&lt;li&gt;10/6(金) 16:30-18:00&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※ 時間は急用により変更する可能性があるので小まめにこのページを確認をして下さい&lt;/p&gt;</content><category term="News"></category></entry><entry><title>電気学会 知覚情報 次世代産業システム 合同研究会</title><link href="https://eiichiromomma.github.io/2017/09/02/%E9%9B%BB%E6%B0%97%E5%AD%A6%E4%BC%9A-%E7%9F%A5%E8%A6%9A%E6%83%85%E5%A0%B1-%E6%AC%A1%E4%B8%96%E4%BB%A3%E7%94%A3%E6%A5%AD%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E5%90%88%E5%90%8C%E7%A0%94%E7%A9%B6%E4%BC%9A/" rel="alternate"></link><published>2017-09-02T23:22:00+09:00</published><updated>2017-09-02T23:22:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-09-02:/2017/09/02/電気学会-知覚情報-次世代産業システム-合同研究会/</id><summary type="html">&lt;p&gt;&lt;a href="https://workshop.iee.or.jp/sbtk/cgi-bin/sbtk-showprogram.cgi?workshopid=SBW00004D74"&gt;電気学会の研究会&lt;/a&gt;に参加してきました。会場の千歳科学技術大学はうちの船橋キャンパスどころではない広大な敷 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://workshop.iee.or.jp/sbtk/cgi-bin/sbtk-showprogram.cgi?workshopid=SBW00004D74"&gt;電気学会の研究会&lt;/a&gt;に参加してきました。会場の千歳科学技術大学はうちの船橋キャンパスどころではない広大な敷地で，大自然に囲まれた環境でした。(雪で閉じ込められたこともあるとか)&lt;/p&gt;
&lt;p&gt;今回はM2吉瀬君，M1天野君(今回デビュー戦)の発表がありました。思ったより落ち着いて発表できていたかと思います。私も発表+座長でしんどかったです。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/IMG_0756.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/IMG_0757.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/IMG_0758.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/IMG_0759.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;美味しいビールを飲んだ翌日は，&lt;a href="https://www.chitose.ac.jp/~h-aoki/"&gt;青木研&lt;/a&gt;の見学会でした。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/IMG_0761.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;泳ぐ天野君&lt;/p&gt;</content><category term="News"></category></entry><entry><title>中間報告+自己紹介LT飲み会</title><link href="https://eiichiromomma.github.io/2017/08/08/%E4%B8%AD%E9%96%93%E5%A0%B1%E5%91%8A%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8Blt%E9%A3%B2%E3%81%BF%E4%BC%9A/" rel="alternate"></link><published>2017-08-08T23:21:00+09:00</published><updated>2017-08-08T23:21:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-08-08:/2017/08/08/中間報告自己紹介lt飲み会/</id><summary type="html">&lt;p&gt;盆前に中間報告+自己紹介LT飲み会開催です。これで全員揃ったかなというところで10月にまた新メンバーが来そうですね。&lt;/p&gt;
&lt;p&gt;1名遅刻を待ったので，結構飲んでからスタートとなり面白い報告 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;盆前に中間報告+自己紹介LT飲み会開催です。これで全員揃ったかなというところで10月にまた新メンバーが来そうですね。&lt;/p&gt;
&lt;p&gt;1名遅刻を待ったので，結構飲んでからスタートとなり面白い報告会でした。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/CIMG2755.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/CIMG2756.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/09/CIMG2766.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>学部連携ポスターセッション</title><link href="https://eiichiromomma.github.io/2017/07/22/%E5%AD%A6%E9%83%A8%E9%80%A3%E6%90%BA%E3%83%9D%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3/" rel="alternate"></link><published>2017-07-22T19:54:00+09:00</published><updated>2017-07-22T19:54:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-07-22:/2017/07/22/学部連携ポスターセッション/</id><summary type="html">&lt;p&gt;歯学部との共同研究の発表があり、優秀ポスター賞を共著の村山先生が受賞されました。皆も頑張って旨いもの食べ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;歯学部との共同研究の発表があり、優秀ポスター賞を共著の村山先生が受賞されました。皆も頑張って旨いもの食べましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="http://www.cvm.ele.cst.nihon-u.ac.jp/wp/wp-content/uploads/2017/07/IMG_0673.jpg" width="600"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>macOSでOpenCL</title><link href="https://eiichiromomma.github.io/2017/07/03/macOSOpenCL/" rel="alternate"></link><published>2017-07-03T22:00:00+09:00</published><updated>2017-07-03T22:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-07-03:/2017/07/03/macOSOpenCL/</id><summary type="html">&lt;p&gt;macOSでOpenCL&lt;/p&gt;</summary><content type="html">&lt;h1&gt;macOSでOpenCLを頑張ってみた&lt;/h1&gt;
&lt;p&gt;折角Radeonを搭載しているiMacもあるのでOpenCLでDeep Learningのframeworkが動かないかと弄ってみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/arrayfire/arrayfire"&gt;Arrayfire&lt;/a&gt;とか&lt;a href="https://github.com/BVLC/caffe/tree/opencl"&gt;CaffeのOpenCLブランチ&lt;/a&gt;とか&lt;a href="https://github.com/hughperkins/cltorch"&gt;cltorch&lt;/a&gt;とか&lt;a href="https://github.com/pyopencl/pyopencl"&gt;PyOpenCL&lt;/a&gt;とか色々と試してみて、ArrayfireやPyOpenCLは一応GPU使って動いてる感までは得られた。&lt;/p&gt;
&lt;p&gt;が、OpenCL自体が遅くCPUより処理が遅い。おまけにArrayfireは何かやらかすとmacOSごと調子悪くなる(要再起動)。つらい&lt;/p&gt;</content><category term="Memo"></category><category term="macOS"></category><category term="OpenCL"></category><category term="Torch"></category></entry><entry><title>イベント参加者で飲み会</title><link href="https://eiichiromomma.github.io/2017/06/17/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%8F%82%E5%8A%A0%E8%80%85%E3%81%A7%E9%A3%B2%E3%81%BF%E4%BC%9A/" rel="alternate"></link><published>2017-06-17T17:57:00+09:00</published><updated>2017-06-17T17:57:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-06-17:/2017/06/17/イベント参加者で飲み会/</id><summary type="html">&lt;p&gt;公開イベントに参加したメンバーで軽く打上げ。。。の筈がいつもの通りでした。食事はイベント前に食べたのでつまみ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;公開イベントに参加したメンバーで軽く打上げ。。。の筈がいつもの通りでした。食事はイベント前に食べたのでつまみは軽め。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/07/CIMG2595.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>輪講その2</title><link href="https://eiichiromomma.github.io/2017/06/16/%E8%BC%AA%E8%AC%9B%E3%81%9D%E3%81%AE2/" rel="alternate"></link><published>2017-06-16T17:51:00+09:00</published><updated>2017-06-16T17:51:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-06-16:/2017/06/16/輪講その2/</id><content type="html">&lt;p&gt;今回の輪講は「やってみた」系です。決められた時間内にデモをやるのは結構難しいので良い経験かと思います。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/07/image-1.jpeg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/07/Image-uploaded-from-iOS.jpg" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/07/image.jpeg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>授業評価</title><link href="https://eiichiromomma.github.io/2017/05/22/%E6%8E%88%E6%A5%AD%E8%A9%95%E4%BE%A1/" rel="alternate"></link><published>2017-05-22T18:29:00+09:00</published><updated>2017-05-22T18:29:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-05-22:/2017/05/22/授業評価/</id><summary type="html">&lt;p&gt;&lt;a href="https://eiichiromomma.github.io/images/uploads/2017/05/20170522105823.pdf"&gt;埼玉大での「プログラミング演習」の授業評価&lt;/a&gt;が送られてきました。&lt;/p&gt;
&lt;p&gt;自由記述で「難しかった」が3件、「説明不足」が2件。内容に関 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://eiichiromomma.github.io/images/uploads/2017/05/20170522105823.pdf"&gt;埼玉大での「プログラミング演習」の授業評価&lt;/a&gt;が送られてきました。&lt;/p&gt;
&lt;p&gt;自由記述で「難しかった」が3件、「説明不足」が2件。内容に関する高評価が3件。回答が62/86とやや少なかったのが残念ですが、遠慮無く書いてくれとお願いしたり、ダメな授業に対する効果的な悪評価の付け方を指南した割には、まずまずの評価といった所でしょうか。今後のプログラミングの機会に役立ってくれると嬉しいです。&lt;/p&gt;
&lt;p&gt;そういえばサーバ移転のゴタゴタで電気回路の評価を載せ忘れてましたね。今度載せます。&lt;/p&gt;</content><category term="講義"></category></entry><entry><title>輪講その1</title><link href="https://eiichiromomma.github.io/2017/05/19/%E8%BC%AA%E8%AC%9B%E3%81%9D%E3%81%AE1/" rel="alternate"></link><published>2017-05-19T17:46:00+09:00</published><updated>2017-05-19T17:46:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-05-19:/2017/05/19/輪講その1/</id><content type="html">&lt;p&gt;ゼミで輪講をやりました。今回は調査中心です。プレゼンテーションI, IIをやったせいか皆プレゼンは上手いです。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/07/CIMG2574.jpg" width="600"&gt;&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>macOSでTensorflow</title><link href="https://eiichiromomma.github.io/2017/05/18/macOSTensorflow/" rel="alternate"></link><published>2017-05-18T08:00:00+09:00</published><updated>2017-05-18T08:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-05-18:/2017/05/18/macOSTensorflow/</id><summary type="html">&lt;p&gt;macOSでTensorflow&lt;/p&gt;</summary><content type="html">&lt;h1&gt;macOSでTensorflowを頑張ってみた&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://blog.amedama.jp/entry/2017/03/08/223308"&gt;ここ&lt;/a&gt;の通りやってもCPUによってはまだ改善点があるようで&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;W&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tensorflow&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;platform&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;cpu_feature_guard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TensorFlow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;library&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wasn&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compiled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AVX2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;these&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;available&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;machine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;could&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;up&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;computations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nx"&gt;W&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tensorflow&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;platform&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;cpu_feature_guard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TensorFlow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;library&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wasn&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compiled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FMA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;these&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;availab&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とでる。bazelでビルドする時にAVX2とFMAも加えてみる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;conda&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;tf35&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.5&lt;span class="w"&gt; &lt;/span&gt;scipy&lt;span class="w"&gt; &lt;/span&gt;numpy&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;ipython&lt;span class="w"&gt; &lt;/span&gt;scikit-learn&lt;span class="w"&gt; &lt;/span&gt;scikit-image&lt;span class="w"&gt; &lt;/span&gt;matplotlib&lt;span class="w"&gt; &lt;/span&gt;pandas&lt;span class="w"&gt; &lt;/span&gt;h5py
$&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;tf35
$&lt;span class="w"&gt; &lt;/span&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;bazel&lt;span class="w"&gt; &lt;/span&gt;swig
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/tensorflow/tensorflow.git
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tensorflow
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;checkout&lt;span class="w"&gt; &lt;/span&gt;v1.0.1
$&lt;span class="w"&gt; &lt;/span&gt;./configure
$&lt;span class="w"&gt; &lt;/span&gt;bazel&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;opt&lt;span class="w"&gt; &lt;/span&gt;--copt&lt;span class="o"&gt;=&lt;/span&gt;-mavx&lt;span class="w"&gt; &lt;/span&gt;--copt&lt;span class="o"&gt;=&lt;/span&gt;-msse4.1&lt;span class="w"&gt; &lt;/span&gt;--copt&lt;span class="o"&gt;=&lt;/span&gt;-msse4.2&lt;span class="w"&gt; &lt;/span&gt;--copt&lt;span class="o"&gt;=&lt;/span&gt;-mavx2&lt;span class="w"&gt; &lt;/span&gt;--copt&lt;span class="o"&gt;=&lt;/span&gt;-mfma&lt;span class="w"&gt; &lt;/span&gt;//tensorflow/tools/pip_package:build_pip_package
$&lt;span class="w"&gt; &lt;/span&gt;bazel-bin/tensorflow/tools/pip_package/build_pip_package&lt;span class="w"&gt; &lt;/span&gt;/tmp/tensorflow_pkg
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;uninstall&lt;span class="w"&gt; &lt;/span&gt;tensorflow&lt;span class="w"&gt; &lt;/span&gt;keras
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;/tmp/tensorflow_pkg/tensorflow-1.0.1-cp35-cp35m-macosx_10_7_x86_64.whl
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;keras
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl -O https://raw.githubusercontent.com/fchollet/keras/master/examples/mnist_cnn.py
echo &amp;#39;K.clear_session()&amp;#39; &amp;gt;&amp;gt; mnist_cnn.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とした後に&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python mnist_cnn.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でmnistが動く。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Using TensorFlow backend.
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 100s - loss: 0.3406 - acc: 0.8961 - val_loss: 0.0818 - val_acc: 0.9734
Epoch 2/12
60000/60000 [==============================] - 96s - loss: 0.1207 - acc: 0.9643 - val_loss: 0.0533 - val_acc: 0.9822
Epoch 3/12
60000/60000 [==============================] - 95s - loss: 0.0891 - acc: 0.9743 - val_loss: 0.0461 - val_acc: 0.9852
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;1epochあたり100s(Core i7のiMac)。Core i5のmac miniだと&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Epoch 10/12
60000/60000 [==============================] - 195s - loss: 0.0391 - acc: 0.9883 - val_loss: 0.0277 - val_acc: 0.9905
Epoch 11/12
60000/60000 [==============================] - 219s - loss: 0.0379 - acc: 0.9893 - val_loss: 0.0306 - val_acc: 0.9899
Epoch 12/12
60000/60000 [==============================] - 247s - loss: 0.0359 - acc: 0.9887 - val_loss: 0.0266 - val_acc: 0.9909
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ちなみにGeForce 970だと1 epochあたり9s。これだけ頑張っても10倍遅い。GeForce 1080だと1 epochあたり4s。つらい&lt;/p&gt;</content><category term="Memo"></category><category term="macOS"></category><category term="Tensorflow"></category></entry><entry><title>Openpose</title><link href="https://eiichiromomma.github.io/2017/05/05/openpose/" rel="alternate"></link><published>2017-05-05T15:54:00+09:00</published><updated>2017-05-05T15:54:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-05-05:/2017/05/05/openpose/</id><content type="html">&lt;p&gt;前の投稿の&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/CMU-Perceptual-Computing-Lab/caffe_rtpose"&gt;https://github.com/CMU-Perceptual-Computing-Lab/caffe_rtpose&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;がPython, MATLABにwrapされたのが&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation"&gt;https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;でC++の方は&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/CMU-Perceptual-Computing-Lab/openpose"&gt;https://github.com/CMU-Perceptual-Computing-Lab/openpose&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;として正式公開?&lt;/p&gt;
&lt;p&gt;Body + Hands + Face Estimation、Body + Face Estimation、Body + Handsも面白そう。&lt;/p&gt;</content><category term="News"></category></entry><entry><title>例のアレ</title><link href="https://eiichiromomma.github.io/2017/05/01/%E4%BE%8B%E3%81%AE%E3%82%A2%E3%83%AC/" rel="alternate"></link><published>2017-05-01T19:59:00+09:00</published><updated>2017-05-01T19:59:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-05-01:/2017/05/01/例のアレ/</id><summary type="html">&lt;p&gt;作業してる裏で3月の研究会で見て面白そうだったアレを動かしてみました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/05/RT01.png" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/05/RT02.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;たまに誰も居ない筈のところの地縛霊に応答するけど、チューニングせずに動かしたせいかは不 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;作業してる裏で3月の研究会で見て面白そうだったアレを動かしてみました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/05/RT01.png" width="600"&gt;
&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/05/RT02.png" width="600"&gt;&lt;/p&gt;
&lt;p&gt;たまに誰も居ない筈のところの地縛霊に応答するけど、チューニングせずに動かしたせいかは不明。取り敢えず楽しい。Web Camでも確認。&lt;/p&gt;</content><category term="News"></category></entry><entry><title>サーバーを入れ替えました</title><link href="https://eiichiromomma.github.io/2017/04/27/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E5%85%A5%E3%82%8C%E6%9B%BF%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/" rel="alternate"></link><published>2017-04-27T19:23:00+09:00</published><updated>2017-04-27T19:23:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-04-27:/2017/04/27/サーバーを入れ替えました/</id><summary type="html">&lt;p&gt;遊びで入れたMac OS X Serverでズルズルと続けてましたが、飽きたのでLinuxでサーバーを立て直しました。&lt;/p&gt;
&lt;p&gt;WordpressもMigrationツールのお陰でいまのところトラブル無く移行できたかも?&lt;/p&gt;
&lt;p&gt;研究室の飲み会の投稿は消えてしまったので今度写真付きでアップします …&lt;/p&gt;</summary><content type="html">&lt;p&gt;遊びで入れたMac OS X Serverでズルズルと続けてましたが、飽きたのでLinuxでサーバーを立て直しました。&lt;/p&gt;
&lt;p&gt;WordpressもMigrationツールのお陰でいまのところトラブル無く移行できたかも?&lt;/p&gt;
&lt;p&gt;研究室の飲み会の投稿は消えてしまったので今度写真付きでアップします。&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>自己紹介LT飲み会2017-4</title><link href="https://eiichiromomma.github.io/2017/04/26/%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8Blt%E9%A3%B2%E3%81%BF%E4%BC%9A2017-4/" rel="alternate"></link><published>2017-04-26T17:40:00+09:00</published><updated>2017-04-26T17:40:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-04-26:/2017/04/26/自己紹介lt飲み会2017-4/</id><content type="html">&lt;p&gt;&lt;img alt="None" class="alignnone" src="https://eiichiromomma.github.io/images/uploads/2017/07/CIMG2492.jpg" width="600"&gt;&lt;/p&gt;
&lt;p&gt;今年度のメンバーでの自己紹介LT飲み会を開催しました。今年は寿司がダメな人もいるのでピザやらピンチョスやらも追加してます。&lt;/p&gt;</content><category term="ゼミ"></category></entry><entry><title>FacebookとWordpressの連携テスト</title><link href="https://eiichiromomma.github.io/2017/04/08/facebook%E3%81%A8wordpress%E3%81%AE%E9%80%A3%E6%90%BA%E3%83%86%E3%82%B9%E3%83%88/" rel="alternate"></link><published>2017-04-08T23:23:00+09:00</published><updated>2017-04-08T23:23:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-04-08:/2017/04/08/facebookとwordpressの連携テスト/</id><content type="html">&lt;p&gt;Wordpress公式のJetpackを使うと良いらしい。&lt;/p&gt;
&lt;p&gt;&lt;img alt="None" class="alignnone size-medium wp-image-535" height="200" src="https://eiichiromomma.github.io/images/uploads/2017/04/SDIM0743-300x200.jpg" width="300"&gt;
&lt;img alt="None" class="alignnone size-medium wp-image-536" height="200" src="https://eiichiromomma.github.io/images/uploads/2017/04/SDIM0745-300x200.jpg" width="300"&gt;
&lt;img alt="None" class="alignnone size-medium wp-image-537" height="200" src="https://eiichiromomma.github.io/images/uploads/2017/04/SDIM0750-300x200.jpg" width="300"&gt;&lt;/p&gt;</content><category term="News"></category></entry><entry><title>GNU nano</title><link href="https://eiichiromomma.github.io/2017/04/01/nano/" rel="alternate"></link><published>2017-04-01T09:00:00+09:00</published><updated>2017-04-01T09:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-04-01:/2017/04/01/nano/</id><summary type="html">&lt;p&gt;GNU nano&lt;/p&gt;</summary><content type="html">&lt;h1&gt;GNU nano&lt;/h1&gt;
&lt;p&gt;自分では滅多に使わないが、とりあえずUnix系の環境を触らせるときにオススメのエディタ&lt;a href="https://github.com/eiichiromomma/CVMLAB/wiki/nano"&gt;GNU nanoの紹介記事&lt;/a&gt;を更新。&lt;/p&gt;
&lt;p&gt;.nanorcについては思い切り勘違いしてた。というか初期設定ファイルがソースパッケージにしか無いのは変だ。&lt;/p&gt;</content><category term="Memo"></category><category term="nano"></category></entry><entry><title>NA (Excel)</title><link href="https://eiichiromomma.github.io/2017/03/31/excelna/" rel="alternate"></link><published>2017-03-31T23:00:00+09:00</published><updated>2017-03-31T23:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-03-31:/2017/03/31/excelna/</id><summary type="html">&lt;p&gt;Excel NA()&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Excelで欠損値のグラフ&lt;/h1&gt;
&lt;p&gt;Excelで欠損値のあるデータのグラフを描こうとすると線が切れる。
&lt;img alt="こんな感じ" src="https://eiichiromomma.github.io/images/20170331-1.png"&gt;&lt;/p&gt;
&lt;p&gt;欠損値のところに=NA()を入れておくと補完してくれるらしい。
&lt;img alt="こんな感じ" src="https://eiichiromomma.github.io/images/20170331-2.png"&gt;&lt;/p&gt;</content><category term="Memo"></category><category term="Excel"></category></entry><entry><title>VSCodeとClang</title><link href="https://eiichiromomma.github.io/2017/03/05/vscode_clang/" rel="alternate"></link><published>2017-03-05T11:00:00+09:00</published><updated>2017-03-05T11:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-03-05:/2017/03/05/vscode_clang/</id><summary type="html">&lt;p&gt;setup VSCode and clang&lt;/p&gt;</summary><content type="html">&lt;h1&gt;VSCodeの補完&lt;/h1&gt;
&lt;p&gt;代表的な補完拡張の中にclangを使ったものがあるが、CMakeが&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;CMAKE_EXPORT_COMPILE_COMMANDS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で吐いてくれるcompile_commands.jsonに対応していない。
&lt;a href="https://marketplace.visualstudio.com/items?itemName=mitaki28.vscode-clang"&gt;C/C++ Clang Command Adapter&lt;/a&gt;ではsettings.jsonの"clang.cxxflags"にコンパイラへのオプションを一つずつ並べないと有効にならない。&lt;/p&gt;
&lt;p&gt;CMakeの出力はアホみたいにオプションが多くて流石に手入力はやりたくないので&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;compile_commands.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gsed&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/ -/&amp;quot;,\n&amp;quot;-/g&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;とすると良い感じに変換できる。-oから先は不要なのでそれまでをsetting.jsonに貼り付ければ良い。&lt;/p&gt;</content><category term="Memo"></category><category term="VSCode"></category><category term="C++"></category></entry><entry><title>YouCompleteMe</title><link href="https://eiichiromomma.github.io/2017/03/05/youcompleteme/" rel="alternate"></link><published>2017-03-05T10:00:00+09:00</published><updated>2017-03-05T10:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-03-05:/2017/03/05/youcompleteme/</id><summary type="html">&lt;p&gt;setup YouCompleteMe&lt;/p&gt;</summary><content type="html">&lt;h1&gt;YouCompleteMe&lt;/h1&gt;
&lt;p&gt;C/C++の場合、clangを使ったVimの入力支援。他言語も色々ある。
NeoBundleで使おうとして色々なサイトを漁ったが結局ycmdとの連携がよくわからない。結論としてVundleを使う。
やり方は&lt;a href="https://github.com/Valloric/YouCompleteMe"&gt;元サイト&lt;/a&gt;に書かれている通りで、システムのclangとかは面倒になったので試していない。
ユーザごとにclangをビルドする羽目になるが確実に動く。&lt;/p&gt;</content><category term="Memo"></category><category term="Vim"></category><category term="C++"></category></entry><entry><title>Conway's Game of Life</title><link href="https://eiichiromomma.github.io/2017/02/18/conways-game-of-life/" rel="alternate"></link><published>2017-02-18T10:22:00+09:00</published><updated>2017-02-18T10:22:00+09:00</updated><author><name>momma</name></author><id>tag:eiichiromomma.github.io,2017-02-18:/2017/02/18/conways-game-of-life/</id><summary type="html">&lt;p&gt;9月から今年2月にかけて埼玉大で非常勤をやってきました。プログラミング演習ということでC言語の講義です。&lt;/p&gt;
&lt;p&gt;使った環境はコマンドラインベースでということで同大演習室に導入済み …&lt;/p&gt;</summary><content type="html">&lt;p&gt;9月から今年2月にかけて埼玉大で非常勤をやってきました。プログラミング演習ということでC言語の講義です。&lt;/p&gt;
&lt;p&gt;使った環境はコマンドラインベースでということで同大演習室に導入済みのcygwinのgccでしたがセキュリティの関係でgdbが使えないという問題もありやや苦労しました。デバッガの話はCode::Blocksでカバーしましたが、デバッガが使えない公式環境になってしまったのは申し訳なかったですね。&lt;/p&gt;
&lt;p&gt;講義・演習の方はMoodleのOnline Judgeプラグインを活用しました。2.4までしか対応していないプラグインだったものの、三重大の大山先生からパッチを頂きMoodle2.8で無事動作。課題も常時受け入れられるようさくらVPSで環境を立ち上げての運用でした。来年度はうちのプログラミングの授業でも活躍するかも?&lt;/p&gt;
&lt;p&gt;Online Judgeは&lt;a href="http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja"&gt;会津大のAOJ&lt;/a&gt;が有名です。プログラミングの習得にも役立ちます。独学には&lt;a href="https://paiza.jp/works"&gt;paizaラーニング&lt;/a&gt;もお薦めです。こっちは来年度のメンバーに受講して貰っています。&lt;/p&gt;
&lt;p&gt;で、課題の方はタイトルにも書いたライフゲーム、魔方陣のbrute-force解法、アスキー文字だけのシューティングゲーム、同じくアスキー文字だけのSnakeゲームとしました。雛形を渡してそれを弄るような感じです。OSSや標準以外のライブラリに触れて貰う目的もあり後者はncursesライブラリを使ったプログラミングです。ライフゲームについてはlibpngを使ってのPNG画像出力+imagemagickでのアニメーション化とかもやりました。↓みたいなアニメーションが作れます。&lt;/p&gt;
&lt;iframe src="https://player.vimeo.com/video/650717726?h=20b12243be" width="640" height="427" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="講義"></category></entry><entry><title>Ubuntuでの日本語入力</title><link href="https://eiichiromomma.github.io/2017/02/15/fcitx-skk/" rel="alternate"></link><published>2017-02-15T21:00:00+09:00</published><updated>2017-02-15T21:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-02-15:/2017/02/15/fcitx-skk/</id><summary type="html">&lt;p&gt;fcitx&amp;amp;skk&lt;/p&gt;</summary><content type="html">&lt;h1&gt;fcitx+skk&lt;/h1&gt;
&lt;p&gt;skkを愛用している訳だがUbuntuでfcitx+skkの環境だと謎のタイミングでskkのオンオフが切り変わる。&lt;/p&gt;
&lt;p&gt;設定をよくよく確認してみると「入力メソッド起動のその他のキー」なる項目があってデフォルトで左SHIFTが設定されていた。&lt;/p&gt;
&lt;p&gt;WindowsのCapsをIMEのオンオフに割り当ててるように(これも極めて迷惑だが)、確かに左SHIFTを押す度に切り替わる。&lt;/p&gt;
&lt;p&gt;という訳で「無効」にすると余計な動作が収まった。&lt;/p&gt;</content><category term="Memo"></category><category term="Ubuntu"></category></entry><entry><title>Pelicanセットアップ</title><link href="https://eiichiromomma.github.io/2017/02/12/pelican_setup/" rel="alternate"></link><published>2017-02-12T12:00:00+09:00</published><updated>2017-02-12T12:00:00+09:00</updated><author><name>eiichiromomma</name></author><id>tag:eiichiromomma.github.io,2017-02-12:/2017/02/12/pelican_setup/</id><summary type="html">&lt;p&gt;setup pelican&lt;/p&gt;</summary><content type="html">&lt;h1&gt;メモ用のブログ作成&lt;/h1&gt;
&lt;p&gt;Markdownで書き溜めて、後でgithubのwikiに上げようと思ったまま放置されてたネタ置き場の作成。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kazukousen.github.io/python-pelican-install.html"&gt;こっちの記事&lt;/a&gt;が元ネタだがgithub.ioのところで躓いてた。&lt;/p&gt;
&lt;p&gt;作業に関しては&lt;a href="http://blog.shigepon.info/blog/2016/03/31/migrate_octopress_github_page_to_pelican/#.WJ_ZLRKLRBw"&gt;こっち&lt;/a&gt;の方が簡潔。日付けの管理もこのサイト設定を使ってみた。&lt;/p&gt;
&lt;h2&gt;GitHub Pages作成&lt;/h2&gt;
&lt;p&gt;自分のアカウントでusername.github.ioのリポジトリを作成して、作業したい所にcloneしておく。以下cloneした中での作業&lt;/p&gt;
&lt;h2&gt;Pelicanの設定と更新作業&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pelican-quickstart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でGithub Pagesを使う設定にしておく。あとはcontent内にmarkdown形式のファイルを置いてから&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;make&lt;span class="w"&gt; &lt;/span&gt;html
make&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;で http://localhost:8000 から作業内容を確認できる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;world&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;
&lt;span class="n"&gt;Category&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Memo&lt;/span&gt;
&lt;span class="n"&gt;Tags&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pelican&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="n"&gt;Slug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20170212&lt;/span&gt;&lt;span class="n"&gt;_post&lt;/span&gt;
&lt;span class="n"&gt;Author&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eiichiromomma&lt;/span&gt;
&lt;span class="n"&gt;Summary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;world&lt;/span&gt;


&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;お試し&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pelican&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;markdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;確認したら&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;make&lt;span class="w"&gt; &lt;/span&gt;github
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;でpushしてくれる。.gitignore云々を説明しているページもあるが、outputの中身だけpushされるので不要な気もする。&lt;/p&gt;
&lt;h2&gt;設定&lt;/h2&gt;
&lt;p&gt;いちいちslugにタイムスタンプを埋め込むのも面倒なので、上のサイトの受け売りでディレクトリを掘るようにpelicanconf.pyを設定。ちなみにファイル名は無関係らしい。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;#pelicanconf.py&lt;/span&gt;
&lt;span class="c1"&gt;#ファイル名からslugを取得&lt;/span&gt;
&lt;span class="n"&gt;FILENAME_METADATA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(?P&amp;lt;date&amp;gt;\d&lt;/span&gt;&lt;span class="si"&gt;{4}&lt;/span&gt;&lt;span class="s1"&gt;-\d&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;-\d&lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt;)-(?P&amp;lt;slug&amp;gt;.*)&amp;#39;&lt;/span&gt;
&lt;span class="c1"&gt;#得られたslugからhtml生成時のurlと保存先を指定&lt;/span&gt;
&lt;span class="n"&gt;ARTICLE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{date:%Y}/{date:%m}/{date:&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;}/&lt;/span&gt;&lt;span class="si"&gt;{slug}&lt;/span&gt;&lt;span class="s1"&gt;/&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ARTICLE_SAVE_AS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{date:%Y}/{date:%m}/{date:&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;}/&lt;/span&gt;&lt;span class="si"&gt;{slug}&lt;/span&gt;&lt;span class="s1"&gt;/index.html&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;としておけば年月日でディレクトリを掘ってくれる。&lt;/p&gt;</content><category term="Memo"></category><category term="pelican"></category><category term="python"></category></entry></feed>