<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>yu Blog</title>
        <link>https://yukun.info/blog</link>
        <description>yu Blog</description>
        <lastBuildDate>Sat, 15 Apr 2023 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[解決例: OneNoteで(バックスラッシュ)入力時に¥(円)記号に変換される事象]]></title>
            <link>https://yukun.info/blog/onenote-mac-en-backslash</link>
            <guid>https://yukun.info/blog/onenote-mac-en-backslash</guid>
            <pubDate>Sat, 15 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[事象]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_krSy" id="事象">事象<a href="https://yukun.info/blog/onenote-mac-en-backslash#%E4%BA%8B%E8%B1%A1" class="hash-link" aria-label="Direct link to 事象" title="Direct link to 事象" translate="no">​</a></h2>
<p>以下の環境においてMicrosoft OneNote for Mac version 16.72のノートへのバックスラッシュ（\）入力時に¥（円）記号が表示される事象が発生。</p>
<ul>
<li class="">
<p>OS: MacOS 13.3.1</p>
</li>
<li class="">
<p>キーボード: RealForce R2 Mac JP 91 (A0.16)</p>
</li>
<li class="">
<p>キーボード配列設定：日本語</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="解決例">解決例<a href="https://yukun.info/blog/onenote-mac-en-backslash#%E8%A7%A3%E6%B1%BA%E4%BE%8B" class="hash-link" aria-label="Direct link to 解決例" title="Direct link to 解決例" translate="no">​</a></h2>
<p>フォントを既存の「Meiryo UI」から「Menlo」に変更することで解決。（MenloはVScodeで使用して馴染みがあった）</p>
<p>Word for Macでも同事象が発生しており原因は謎ですな。。</p>]]></content:encoded>
            <category>Mac</category>
            <category>Onenote</category>
        </item>
        <item>
            <title><![CDATA[解決例: ! [remote rejected] main -> main (refusing to allow an OAuth App to create or update workflow `.github/workflows/xxx.yml` without `workflow` scope)]]></title>
            <link>https://yukun.info/blog/github-actions-vscode-push-error</link>
            <guid>https://yukun.info/blog/github-actions-vscode-push-error</guid>
            <pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[事象]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_krSy" id="事象">事象<a href="https://yukun.info/blog/github-actions-vscode-push-error#%E4%BA%8B%E8%B1%A1" class="hash-link" aria-label="Direct link to 事象" title="Direct link to 事象" translate="no">​</a></h2>
<p>VSCode (on macOS) でGitHub Actionsを利用する為、リポジトリに.github/workflows/*.ymlファイルをpushする際に下記のエラーが発生しpushできない事象が発生。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラーメッセージ">エラーメッセージ<a href="https://yukun.info/blog/github-actions-vscode-push-error#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to エラーメッセージ" title="Direct link to エラーメッセージ" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-text codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">! [remote rejected] main -&gt; main (refusing to allow an OAuth App to create or update workflow `.github/workflows/xxx.yml` without `workflow` scope)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/github-actions-vscode-push-error#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h2>
<p>OAuth上でworkflowに対するcreate or updateの権限が付与されていない為。workflow機能の実装以前にVSCodeでGitHub関連のOAuth設定をしていた場合は本事象が発生する可能性あり。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="解決例">解決例<a href="https://yukun.info/blog/github-actions-vscode-push-error#%E8%A7%A3%E6%B1%BA%E4%BE%8B" class="hash-link" aria-label="Direct link to 解決例" title="Direct link to 解決例" translate="no">​</a></h2>
<ol>
<li class="">
<p>VSCode上でGitHubアカウントからサインアウトしアプリを終了（⌘Q）。</p>
</li>
<li class="">
<p>「キーチェーンアクセス.app」上の検索ボックスで文字列github.comとvscodeに合致する全てのエントリを削除。</p>
</li>
<li class="">
<p>VSCode上でGitHubアカウントに再サインイン。サインイン時に権限付与対象の設定チェックボックスが表示される為、workflowがチェックされていることを確認。</p>
</li>
</ol>
<p>サインアウト前に設定確認した限りだとworkflowへの権限チェックはついていたものの、本事象が発生していたのがイマイチだった。（readはOK、create or updateはNGの意味だったのかな。。）</p>]]></content:encoded>
            <category>GitHub</category>
        </item>
        <item>
            <title><![CDATA[SafePalで生成したSolanaアドレスはSollet.ioで復元可能]]></title>
            <link>https://yukun.info/blog/safepal-solana-derivation-path</link>
            <guid>https://yukun.info/blog/safepal-solana-derivation-path</guid>
            <pubDate>Wed, 01 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[なぜならSafePalのderivation pathが m/44'/501'/0' でありsollet.ioはderivation pathの選択ができる為。そして同じ理由でLedger Nano Xでの復元は不可。derivation pathが m/44'/501'/0' でない為。]]></description>
            <content:encoded><![CDATA[<p>なぜならSafePalのderivation pathが <strong><code>m/44'/501'/0'</code></strong> でありsollet.ioはderivation pathの選択ができる為。そして同じ理由でLedger Nano Xでの復元は不可。derivation pathが <strong><code>m/44'/501'/0'</code></strong> でない為。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="背景">背景<a href="https://yukun.info/blog/safepal-solana-derivation-path#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to 背景" title="Direct link to 背景" translate="no">​</a></h2>
<p>先日SafePalのV1.0.30でSolana チェーンのサポートが発表。Ledger Nano X / SafePal S1 / ペーパウォレットユーザーとしてはバックアップ先が増える話は歓迎の為、早速復元できるか確認したもの。</p>
<blockquote>
<p>Upgrade Your SafePal S1 To On-board New Features<br>
V1.0.30 (08/20/2021 mm/dd/yyyy) 1. Supports Solana mainnet, SPL tokens and DApps</p>
<p><a href="https://safepal.io/upgrade" target="_blank" rel="noopener noreferrer" class="">https://safepal.io/upgrade</a></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="公式ドキュメント上のderivation-pathsの記載は">公式ドキュメント上のDerivation pathsの記載は？<a href="https://yukun.info/blog/safepal-solana-derivation-path#%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E4%B8%8A%E3%81%AEderivation-paths%E3%81%AE%E8%A8%98%E8%BC%89%E3%81%AF" class="hash-link" aria-label="Direct link to 公式ドキュメント上のDerivation pathsの記載は？" title="Direct link to 公式ドキュメント上のDerivation pathsの記載は？" translate="no">​</a></h2>
<p>2021/09/01時点ではSolana (SOL)の記載なし。</p>
<p><a href="https://docs.safepal.io/report-a-bug/derivation-paths-supported-by-safepal-1" target="_blank" rel="noopener noreferrer" class=""></a><a href="https://safepalsupport.zendesk.com/hc/en-us/articles/360053299631-The-derivation-path-of-the-address-of-the-currency-already-supported-by-SafePal-" target="_blank" rel="noopener noreferrer" class="">The derivation path of the address of the currency already supported by SafePal. – SafePal</a></p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="アドレス復元の確認手法">アドレス復元の確認手法<a href="https://yukun.info/blog/safepal-solana-derivation-path#%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%BE%A9%E5%85%83%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%89%8B%E6%B3%95" class="hash-link" aria-label="Direct link to アドレス復元の確認手法" title="Direct link to アドレス復元の確認手法" translate="no">​</a></h2>
<p>SafePalのニーモニックフレーズをSollet.ioでリストアし、作成したSPL token アドレスと合致するderivation pathオプションを特定。</p>
<figure>
<p><img decoding="async" loading="lazy" alt="sollet_io_derivation_path" src="https://yukun.info/assets/images/sollet_io_derivation_path-32f045be990e907766e7b28212235888.png" width="800" height="238" class="img_Q36t"></p>
<figcaption>
<p>Sollet.ioのニーモニックフレーズ(シードフレーズ)のインポート後のDerivable Accountsオプション画面</p>
</figcaption>
</figure>
<figure>
<p><img decoding="async" loading="lazy" alt="safepal_solana" src="https://yukun.info/assets/images/safepal_solana-aa72e1748daccdb85c44be079fdb22ba.png" width="700" height="755" class="img_Q36t"></p>
<figcaption>
<p>SafePal Wallet (iPhoneアプリ)のSPL tokenアドレス画面</p>
</figcaption>
</figure>
<p>上の二つの画像に記載のアドレス（一部グレーアウト）が一致していることを確認できる。</p>
<p>因みに、記事投稿時点ではSafePalはRaydiumに対応。今後Phantomがスマホ対応を予定するがハードウェアウォレット＋スマホでDappを操作したいニーズがある場合はSafePalは良い選択肢になるだろう。因みにLedger Nano Xの場合はスマホでSolana のDapp操作は不可で、デスクトップPCにUSB-C接続して使用する。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="最後に">最後に<a href="https://yukun.info/blog/safepal-solana-derivation-path#%E6%9C%80%E5%BE%8C%E3%81%AB" class="hash-link" aria-label="Direct link to 最後に" title="Direct link to 最後に" translate="no">​</a></h2>
<p>以下にハードウェアウォレットのアフィリエイトリンクを置いておくので良ければ活用下さい。割引特典あり。</p>
<ul>
<li class="">SafePal Wallet: <a href="https://fas.st/t/asvaxcJW" target="_blank" rel="noopener noreferrer" class="">https://fas.st/t/asvaxcJW</a></li>
</ul>]]></content:encoded>
            <category>Blockchain</category>
            <category>SafePal</category>
            <category>Solana</category>
        </item>
        <item>
            <title><![CDATA[LedgerとSafePalのBitcoin / ETH(Ethereum)アドレス生成アルゴリズムは同じ(BIP39 / BIP44)]]></title>
            <link>https://yukun.info/blog/ledger-safepal-bip39-44</link>
            <guid>https://yukun.info/blog/ledger-safepal-bip39-44</guid>
            <pubDate>Sat, 19 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Ledger Nano XとSafePal S1を入手し表題を実機検証できたので備忘で記載するもの。]]></description>
            <content:encoded><![CDATA[<p><a href="http://ledger.refr.cc/yukuninfo" target="_blank" rel="noopener noreferrer" class="">Ledger Nano X</a>と<a href="https://shop.safepal.io/products/safepal-hardware-wallet-s1-bitcoin-wallet?ref=yukun" target="_blank" rel="noopener noreferrer" class="">SafePal S1</a>を入手し表題を実機検証できたので備忘で記載するもの。</p>
<!-- -->
<p>下記の写真は同一ニーモニックフレーズ(mnemonic phrase)を設定した両ハードウェアウォレットのBTCアドレスの表示画面。掲載の都合上一部モザイクを掛けているが完全一致していることを確認できた。EthereumのETHアドレスについては写真は割愛するがBTCと同様に両ウォレットで生成されるアドレスの完全一致を確認済。</p>
<p><img decoding="async" loading="lazy" alt="bip39_44_safepal_ledger" src="https://yukun.info/assets/images/bip39_44_safepal_ledger-1024x451-59f8eb7fd242a93481f2a4eca2a0052c.jpg" width="1024" height="451" class="img_Q36t"></p>
<p>もしハードウェアウォレットのバックアップを実施したい場合は同一メーカーの同機種を複数用意するより、今回の組み合わせのように別メーカー別機種で用意したほうがカウンターパーティリスクを低減できる。</p>
<p>上記の結論については分かっている人は今更感あるが、同一アドレスが生成できる仕掛けはアドレス生成アルゴリズムが両ウォレットともBIP39(アドレス生成アルゴリズム規格)、BIP44(アドレス階層規格)で同じである為。(※BIP: Bitcoin Improvement Proposal)</p>
<p>以下は上記検証に関わるドキュメントを紹介。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="bip39--44の公式ドキュメント">BIP39 / 44の公式ドキュメント<a href="https://yukun.info/blog/ledger-safepal-bip39-44#bip39--44%E3%81%AE%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88" class="hash-link" aria-label="Direct link to BIP39 / 44の公式ドキュメント" title="Direct link to BIP39 / 44の公式ドキュメント" translate="no">​</a></h2>
<ul>
<li class="">
<p>BIP39: <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target="_blank" rel="noopener noreferrer" class="">https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki</a></p>
</li>
<li class="">
<p>BIP44: <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank" rel="noopener noreferrer" class="">https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki</a></p>
<ul>
<li class="">Derivation Path書式：m / purpose' / coin_type' / account' / change / address_index</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="ledgerのbip関連の公式ドキュメント">LedgerのBIP関連の公式ドキュメント<a href="https://yukun.info/blog/ledger-safepal-bip39-44#ledger%E3%81%AEbip%E9%96%A2%E9%80%A3%E3%81%AE%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88" class="hash-link" aria-label="Direct link to LedgerのBIP関連の公式ドキュメント" title="Direct link to LedgerのBIP関連の公式ドキュメント" translate="no">​</a></h2>
<p>色々ぐぐって見たところ販売元ドメインのサポートとLedger teamが別ドメインで掲載しているドキュメントあり。</p>
<blockquote>
<p>Get the recovery phrase to restore.&nbsp;BIP39/BIP44 recovery phrases are supported.</p>
<p><a href="https://support.ledger.com/hc/en-us/articles/360015132494-Restore-from-recovery-phrase" target="_blank" rel="noopener noreferrer" class="">Restore from recovery phrase – Ledger Support</a></p>
</blockquote>
<blockquote>
<p>Public addresPublic addresses are derived from an account's&nbsp;<a href="https://support.ledger.com/hc/en-us/articles/360011069619" target="_blank" rel="noopener noreferrer" class="">extended public key (xpub)</a>&nbsp;by incrementing the address index in the derivation path.&nbsp;Ledger Live follows the&nbsp;<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#Address_gap_limit" target="_blank" rel="noopener noreferrer" class="">BIP 44</a>&nbsp;standard which prescribes that wallets look ahead 20 addresses from the last used address.</p>
<p><a href="https://support.ledger.com/hc/en-us/articles/360010892360-Address-gap-limit" target="_blank" rel="noopener noreferrer" class="">Address gap limit – Ledger Support</a></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="safepalのbip関連の公式ドキュメント">SafePalのBIP関連の公式ドキュメント<a href="https://yukun.info/blog/ledger-safepal-bip39-44#safepal%E3%81%AEbip%E9%96%A2%E9%80%A3%E3%81%AE%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88" class="hash-link" aria-label="Direct link to SafePalのBIP関連の公式ドキュメント" title="Direct link to SafePalのBIP関連の公式ドキュメント" translate="no">​</a></h2>
<blockquote>
<p>SafePal is using BIP39/44 mnemonic phrase standard so you could recover the mnemonic phrase in any other BIP39/44 compatible wallet. Here is a <a href="https://www.youtube.com/watch?v=FL2MTIT5IH0&amp;t=30s" target="_blank" rel="noopener noreferrer" class="">recover guide video</a>, kindly check it if you are interested in.</p>
<p><a href="https://docs.safepal.io/safepal-hardware-wallet/security-features/software-security/recovery-and-back-up" target="_blank" rel="noopener noreferrer" class="">Recovery &amp; back-up - SafePal Knowledge Base</a></p>
</blockquote>
<blockquote>
<p>SafePal is using BIP39/44 mnemonic phrase standard. However, even using the same mnemonic standard, the different derivation paths may also result in different currency addresses.<br>
The following info is the derivation path of the address of the currency already supported by SafePal for your reference.<br>
BTC（Legacy): m/44h/0h/0h<br>
BTC(SegWit): m/49h/0h/0h<br>
BTC(Native SegWit):m/84h/0h/0h<br>
ETH:m/44h/60h/0h<br>
DOT:m/44h/354h/0h</p>
<p><a href="https://docs.safepal.io/report-a-bug/derivation-paths-supported-by-safepal-1" target="_blank" rel="noopener noreferrer" class="">Derivation paths supported by SafePal - SafePal Knowledge Base</a></p>
</blockquote>
<blockquote>
<p>You can check the spelling error of the Mnemonic through the open specification, BIP39.<a href="https://github.com/bitcoinjs/bip39/blob/master/src/wordlists/english.json" target="_blank" rel="noopener noreferrer" class="">https://github.com/bitcoinjs/bip39/blob/master/src/wordlists/english.json</a></p>
<p><a href="https://docs.safepal.io/safepal-hardware-wallet/security-features/software-security/mnemonic-phrase#firstHeading-3" target="_blank" rel="noopener noreferrer" class="">Mnemonic phrase - SafePal Knowledge Base</a></p>
</blockquote>
<blockquote>
<p>SafePal supports BIP44 mnemonic generation standard. If your mnemonic phrase is not a BIP44-compatible one, it cannot be recovered on a SafePal wallet. Welcome to contact us at <a href="http://www.safepal.io/" target="_blank" rel="noopener noreferrer" class="">www.safepal.io</a> to <a href="https://docs.safepal.io/submit-a-request" target="_blank" rel="noopener noreferrer" class="">submit a request.</a> if you have further questions.</p>
<p><a href="https://docs.safepal.io/safepal-hardware-wallet/security-features/software-security/mnemonic-phrase#firstHeading-3" target="_blank" rel="noopener noreferrer" class="">Mnemonic phrase - SafePal Knowledge Base</a></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="その他参考サイト">その他参考サイト<a href="https://yukun.info/blog/ledger-safepal-bip39-44#%E3%81%9D%E3%81%AE%E4%BB%96%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88" class="hash-link" aria-label="Direct link to その他参考サイト" title="Direct link to その他参考サイト" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://mitomemel.hatenablog.com/entry/2018/12/07/000340" target="_blank" rel="noopener noreferrer" class="">BIP44が分からなくなる話 - 蟻地獄</a></p>
</li>
<li class="">
<p><a href="https://ja.0xzx.com/2019060111821.html" target="_blank" rel="noopener noreferrer" class="">BIP32、39、44：財布で最も一般的に使われる種の違い - 0xブロックチェーンニュース</a></p>
</li>
<li class="">
<p><a href="https://tech.bitbank.cc/about-bip39/" target="_blank" rel="noopener noreferrer" class="">BIP39について調べてみました</a></p>
</li>
</ul>]]></content:encoded>
            <category>Bitcoin</category>
            <category>Ethereum</category>
            <category>Ledger</category>
            <category>SafePal</category>
        </item>
        <item>
            <title><![CDATA[Polkadot{.js} Extension / Ledger / SafePal間で同一ニーモニックを用いたDOTアカウントの可搬性はない]]></title>
            <link>https://yukun.info/blog/non-portability-polkadot-ledger-safepal</link>
            <guid>https://yukun.info/blog/non-portability-polkadot-ledger-safepal</guid>
            <pubDate>Sat, 19 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[これまた前回の記事と同様に表題について実機確認できた為まとめておくもの。]]></description>
            <content:encoded><![CDATA[<p>これまた<a class="" href="https://yukun.info/blog/ledger-safepal-bip39-44">前回の記事</a>と同様に表題について実機確認できた為まとめておくもの。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="事象">事象<a href="https://yukun.info/blog/non-portability-polkadot-ledger-safepal#%E4%BA%8B%E8%B1%A1" class="hash-link" aria-label="Direct link to 事象" title="Direct link to 事象" translate="no">​</a></h2>
<p>Ledger Nano Xで生成したBIP39/44規格のニーモニックフレーズを下表の他2種のウォレットへインポートしたところ、Ledger Nano Xで生成されたDOTアドレスと異なるアドレスが生成された。(2020年6月時点 最新FW version)</p>
<figure>





























<table><thead><tr><th></th><th>Polkadot{.js} Extension</th><th>Ledger</th><th>SafePal</th></tr></thead><tbody><tr><td>Polkadot{.js} Extension</td><td>○</td><td>✗</td><td>✗</td></tr><tr><td>Ledger</td><td>✗</td><td>○</td><td>✗</td></tr><tr><td>SafePal</td><td>✗</td><td>✗</td><td>○</td></tr></tbody></table>
<figcaption>
<p>同一ニーモニックフレーズを用いたアカウント[受信アドレス]の可搬性。縦軸：移行元、横軸：移行先</p>
</figcaption>
</figure>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/non-portability-polkadot-ledger-safepal#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h2>
<p>Polkadot{.js} ExtensionーLedger/SafePal間で可搬性が無いのは下記リンク先の表の通りアドレス生成及びDerivation Pathの規格が異なる為。</p>
<figure>
<p><img decoding="async" loading="lazy" alt="polkadot_wiki_account_portability" src="https://yukun.info/assets/images/polkadot_wiki_account_portability-1024x977-ef02d623d2a25ccd1704fe6c70b87cb6.png" width="1024" height="977" class="img_Q36t"></p>
<figcaption>
<p><a href="https://wiki.polkadot.network/docs/learn-accounts#portability" target="_blank" rel="noopener noreferrer" class="">Polkadot Accounts · Polkadot Wiki</a></p>
</figcaption>
</figure>
<p>LedgerーSafePal間でもDOTアドレスが異なるのは意外な結果だった。色々ぐぐっては見たもののそれらしい記事・ドキュメントは見当たらず。可能性としてはDerivation Pathのインデックスの取り方かもとは思いつつ裏とりは出来ていない。公式サポートの回答結果を受領したら本記事に追記予定。</p>]]></content:encoded>
            <category>Ledger</category>
            <category>Polkadot</category>
            <category>SafePal</category>
        </item>
        <item>
            <title><![CDATA[IOST: Donnie Finance 発行のiwBTCトークンのステーキングフロー]]></title>
            <link>https://yukun.info/blog/iost-donnie-finance-iwbtc</link>
            <guid>https://yukun.info/blog/iost-donnie-finance-iwbtc</guid>
            <pubDate>Wed, 24 Mar 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[2021年3月23日(火)にDeFi プラットフォームのDonnie FinanceがiwBTC (IOST Wrapped BTC)のステーキング(staking)によるDON の配布サービスを開始。本記事ではiwBTC定義、入金(Deposit)フロー、想定リスクについて公開情報を元に簡単にまとめておくもの。]]></description>
            <content:encoded><![CDATA[<p>2021年3月23日(火)にDeFi プラットフォームのDonnie FinanceがiwBTC (IOST Wrapped BTC)のステーキング(staking)によるDON の配布サービスを開始。本記事ではiwBTC定義、入金(Deposit)フロー、想定リスクについて公開情報を元に簡単にまとめておくもの。</p>
<p><a href="https://twitter.com/donniefinance/status/1373854156788621316?s=21" target="_blank" rel="noopener noreferrer" class="">https://twitter.com/donniefinance/status/1373854156788621316?s=21</a></p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="iwbtcトークンとは">iwBTCトークンとは<a href="https://yukun.info/blog/iost-donnie-finance-iwbtc#iwbtc%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%A8%E3%81%AF" class="hash-link" aria-label="Direct link to iwBTCトークンとは" title="Direct link to iwBTCトークンとは" translate="no">​</a></h2>
<p>Donnie Finance発行の<a href="https://wbtc.network/" target="_blank" rel="noopener noreferrer" class="">WBTC (ERC20規格)</a>にbackedするIRC規格のトークン。間接的にBitcoin (BTC)の価値をIOSTチェーン上で取り扱うためのもの。トークンのコントラクトアドレスは以下の通り。</p>
<ul>
<li class="">
<p><a href="https://www.iostabc.com/token/iwbtc?page=1&amp;size=50&amp;order=asc" target="_blank" rel="noopener noreferrer" class="">Token:iwbtc</a></p>
</li>
<li class="">
<p><a href="https://www.iostabc.com/contract/ContractBWgi917ZzJM8fR4pHtcAS7gdy9uRRcGmajWLyEYh9NUR?page=1&amp;size=50&amp;order=asc" target="_blank" rel="noopener noreferrer" class="">ContractBWgi917ZzJM8fR4pHtcAS7gdy9uRRcGmajWLyEYh9NUR</a></p>
</li>
</ul>
<p>作成アカウントは<a href="https://www.iostabc.com/account/donmanager?activetab=1&amp;listtab=0&amp;page=1&amp;rowsPerPage=20" target="_blank" rel="noopener noreferrer" class="">donmanager</a>とDONトークンの発行元アカウントと同じ。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="iwbtcの入金ステーキングフロー">iwBTCの入金・ステーキングフロー<a href="https://yukun.info/blog/iost-donnie-finance-iwbtc#iwbtc%E3%81%AE%E5%85%A5%E9%87%91%E3%82%B9%E3%83%86%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%95%E3%83%AD%E3%83%BC" class="hash-link" aria-label="Direct link to iwBTCの入金・ステーキングフロー" title="Direct link to iwBTCの入金・ステーキングフロー" translate="no">​</a></h2>
<p>ステーキングページ( <a href="https://donnie.finance/trade/iwbtc" target="_blank" rel="noopener noreferrer" class="">https://donnie.finance/trade/iwbtc</a> ) 上のWBTC SwapメニューよりiwBTCへ変換を行うためのWBTC用Depositアドレスが提供される。昨日試しに表示されたアドレスを<a href="https://etherscan.io/" target="_blank" rel="noopener noreferrer" class="">Etherscan</a>で確認したが、0残高ということで、サイトに記載の通りユーザー個々に生成されるアドレスと思われる。</p>
<p>BTC, <a href="https://wbtc.network/" target="_blank" rel="noopener noreferrer" class="">WBTC</a>, iwBTCの関係性を踏まえたフロー図は以下の通り。</p>
<p><img decoding="async" loading="lazy" alt="donnie_finance_iwbtc_staking_flow" src="https://yukun.info/assets/images/donnie_finance_iwbtc_staking_flow-1024x576-78b731c75fe41e3e96d7e73aa0d1b466.png" width="1024" height="576" class="img_Q36t"></p>
<ul>
<li class="">
<p>No.1〜3：WBTCを保有していない場合はBTCをカストディアン経由で入手、と図中はかしこまった表現をしているが、言い換えればBTCを<a href="https://www.binance.com/ja/register?ref=F7HUYR9G" target="_blank" rel="noopener noreferrer" class="">Binance</a>, <a href="https://ftx.com/#a=14796040" target="_blank" rel="noopener noreferrer" class="">FTX</a>等のWBTC取り扱い取引所に送金してBTC→WBTCトレードをする。WBTCの公式上の定義は"Wrapped Bitcoin (WBTC) is the first ERC20 token backed 1:1 with Bitcoin"だが、取引所上は需給バランスによっては0.0X%程度の変動はある。</p>
</li>
<li class="">
<p>No.4〜4｀：取引所経由でWBTCを入手した場合はNo.3｀をスキップして直接No.4, 4｀を実施する。送金先のアドレスはDonnie Finance上で表示されているETH (ERC20)アドレスとなる。</p>
</li>
</ul>
<figure>
<p><img decoding="async" loading="lazy" alt="donnie_finance_wbtc_swap" src="https://yukun.info/assets/images/donnie_finance_wbtc_swap-d0b9cf1d59f03a0e7f347213135a491f.png" width="700" height="625" class="img_Q36t"></p>
<figcaption>
<p>BTC Swap画面例。最低入金額は0.0006 wBTC、入金確認には約30分</p>
</figcaption>
</figure>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="iwbtcステーキングのリスク">iwBTCステーキングのリスク<a href="https://yukun.info/blog/iost-donnie-finance-iwbtc#iwbtc%E3%82%B9%E3%83%86%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%AA%E3%82%B9%E3%82%AF" class="hash-link" aria-label="Direct link to iwBTCステーキングのリスク" title="Direct link to iwBTCステーキングのリスク" translate="no">​</a></h2>
<p>一般的なDeFi・スマートコントラクトのリスク(※)の他に考えられるものを2点ほど挙げておく。</p>
<p>※参考サイト</p>
<ul>
<li class="">
<p><a href="https://hashhub-research.com/articles/2020-11-19-ten-risks-defi-faces" target="_blank" rel="noopener noreferrer" class="">DeFi（分散型金融）に内在する10のリスク それぞれのリスク対応の考え方 | HashHub Research</a></p>
</li>
<li class="">
<p><a href="https://hashhub-research.com/articles/2021-04-16-about-yield-farming" target="_blank" rel="noopener noreferrer" class="">流動性供給、Impermanent Loss、高APYの仕組みから、ファーミングのリスクリターンを正しく理解する | HashHub Research</a></p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="1-wbtc-swapオペレーションミスリスク">1. WBTC Swapオペレーションミスリスク<a href="https://yukun.info/blog/iost-donnie-finance-iwbtc#1-wbtc-swap%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9F%E3%82%B9%E3%83%AA%E3%82%B9%E3%82%AF" class="hash-link" aria-label="Direct link to 1. WBTC Swapオペレーションミスリスク" title="Direct link to 1. WBTC Swapオペレーションミスリスク" translate="no">​</a></h3>
<p>現状IOSTのスマートコントラクトにクロスチェーンスワップを実装できるような機能は無いので(将来的にはPolkadot等とクロッシングしてくと思われる)、ETHアドレスへのDeposit経由という力技で対応している。Donnie Finance社側もクローラ等である程度自動化はしているだろうが。WBTCやERC20規格等この辺りの理解が無いユーザーはBTCを直にETHアドレスへ送金するミスを冒す可能性がある。</p>
<figure>
<p><img decoding="async" loading="lazy" alt="donnie_finance_operation_mistake_get_iwbtc" src="https://yukun.info/assets/images/donnie_finance_operation_mistake_get_iwbtc-564c4b08bef91e4fb1fa9bcc97a2ebe0.png" width="718" height="688" class="img_Q36t"></p>
<figcaption>
<p>公式Telegramでのユーザーの照会を抜粋</p>
</figcaption>
</figure>
<p>上記のケースがBTCからの送金にETHアドレスを指定していたのであれば、当然チェーン越えは出来ないので対象BTCは消失扱いとなる。合掌。。。未来の量子コンピュータによる計算か超大なレインボーテーブルに運良くETH(ERC20)アドレス文字列に該当するBTCプライベート鍵[秘密鍵]文字列がわかれば動かせるかもと思いつつ、改めて考えるとBTCとETHのアドレス書式の違いもあり、無理だろう。。</p>
<figure>
<p><img decoding="async" loading="lazy" alt="donnie_finance_caution_popup_wbtc_swap" src="https://yukun.info/assets/images/donnie_finance_caution_popup_wbtc_swap-badc0ec70aa2e5e45b05aaa3d662a888.png" width="962" height="972" class="img_Q36t"></p>
<figcaption>
<p>2021年3月24日 JST21:00頃に確認したところ、注意画面が設けられていた。やらかしあったのだろうな。。</p>
</figcaption>
</figure>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="2-donnie-financeのカウンターパーティリスク">2. Donnie Financeのカウンターパーティリスク<a href="https://yukun.info/blog/iost-donnie-finance-iwbtc#2-donnie-finance%E3%81%AE%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%82%B9%E3%82%AF" class="hash-link" aria-label="Direct link to 2. Donnie Financeのカウンターパーティリスク" title="Direct link to 2. Donnie Financeのカウンターパーティリスク" translate="no">​</a></h3>
<p>暗号資産取引所、Dapp提供元、暗号資産運用会社、カストディアン等基本的に外部委託部分には常にこの手のリスクが付きまとうが、今更論うのはiwBTCの定義・ホワイトペーパー的な文書が公式サイトやメディアから確認できなかった為。</p>
<p>因みにERC20 WBTCはBTCと1:1 backedとなるよう運営されており、実際に1:1均衡が取れているかは自主点検だけでなくDAOメンバーによる監査対応を行っている。</p>
<blockquote>
<p>DAO members will publicly audit the WBTC tokens to make sure that the balances in the custodian wallet match the balances in the smart contract.</p>
<p><a href="https://blog.kyber.network/wbtc-a-community-effort-to-bring-bitcoin-to-ethereum-b9b63e3b86e6" target="_blank" rel="noopener noreferrer" class="">WBTC: A Community Effort to Bring Bitcoin to Ethereum</a></p>
</blockquote>
<p>WBTCの運営体制と比較するとリスク高と言わざる負えない。(1:1 backedか否かの記載もない。。)</p>
<p>また、現状ETHのGas代高騰は継続しており、DONの価格変動性も鑑みると少額投資の場合は手数料負けする点もデメリットと考える。</p>
<p>上述の見解は2021年3月24日時点の情報を元に記載しており、将来の状況の変化により見解が変わる可能性もある点はご留意頂きたい。</p>]]></content:encoded>
            <category>Bitcoin</category>
            <category>Donnie Finance</category>
            <category>Ethereum</category>
            <category>IOST</category>
        </item>
        <item>
            <title><![CDATA[IOST: DeFiプラットフォームDonnie Financeのサーバダウン事象についてまとめてみた]]></title>
            <link>https://yukun.info/blog/defi-donnie-finance-down</link>
            <guid>https://yukun.info/blog/defi-donnie-finance-down</guid>
            <pubDate>Fri, 19 Mar 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[公開情報を元に記載しています。]]></description>
            <content:encoded><![CDATA[<p>公開情報を元に記載しています。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="事象内容">事象内容<a href="https://yukun.info/blog/defi-donnie-finance-down#%E4%BA%8B%E8%B1%A1%E5%86%85%E5%AE%B9" class="hash-link" aria-label="Direct link to 事象内容" title="Direct link to 事象内容" translate="no">​</a></h2>
<p>2021年3月17日 JST22:22頃からWebサイト<a href="https://donnie.finance/" target="_blank" rel="noopener noreferrer" class="">donnie.finance</a>へのアクセスできない事象が発生。</p>
<!-- -->
<figure>
<p><img decoding="async" loading="lazy" alt="telegram_don_down_issue" src="https://yukun.info/assets/images/telegram_don_down_issue-e1616076966566-986x1024-6c7ee47567c454cf3fbd014b81956903.png" width="986" height="1024" class="img_Q36t"></p>
<figcaption>
<p>Donnie Finance公式Telegramグループ(公開)におけるユーザの第一報とadmin担当間のやり取り</p>
</figcaption>
</figure>
<p>その後一部のTwitterユーザー側でも気づき始める。</p>
<p><a href="https://twitter.com/askuwai/status/1372180624589557760" target="_blank" rel="noopener noreferrer" class="">https://twitter.com/askuwai/status/1372180624589557760</a></p>
<p>HTTPレスポンスステータスコードは504 Gateway Time-outや502 Bad Gateway等。nmapで443 port (HTTPS)がオープンであること、及びクライアントへはレスポンス自体が返っていることから、ping不通はFWもしくはサーバ側の設定によるものと推測。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="ユーザー側への影響">ユーザー側への影響<a href="https://yukun.info/blog/defi-donnie-finance-down#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%81%B4%E3%81%B8%E3%81%AE%E5%BD%B1%E9%9F%BF" class="hash-link" aria-label="Direct link to ユーザー側への影響" title="Direct link to ユーザー側への影響" translate="no">​</a></h2>
<p>本記事公開時点で確認できている影響は以下の通り。</p>
<ul>
<li class="">
<p><a href="https://donnie.finance/" target="_blank" rel="noopener noreferrer" class="">donnie.finance</a>サイト掲載のIOST等取り扱い銘柄のStaking、及びDONのharvestingに係る状況照会や入出金操作(Deposit / withdraw)が不可</p>
</li>
<li class="">
<p>但しユーザーが保有している暗号資産への影響(消失・窃取)は無し</p>
</li>
</ul>
<figure>
<p><a href="https://twitter.com/DonnieFinance/status/1372260955745255424" target="_blank" rel="noopener noreferrer" class="">https://twitter.com/DonnieFinance/status/1372260955745255424</a></p>
<figcaption>
<p>公式アカウントからの第一報</p>
</figcaption>
</figure>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="donnie-finance側の対応">Donnie Finance側の対応<a href="https://yukun.info/blog/defi-donnie-finance-down#donnie-finance%E5%81%B4%E3%81%AE%E5%AF%BE%E5%BF%9C" class="hash-link" aria-label="Direct link to Donnie Finance側の対応" title="Direct link to Donnie Finance側の対応" translate="no">​</a></h2>
<p>サイトが復旧したのは翌3月18日 JST9:04頃となるが、後述のツイートの通り3月18日 JST15:37頃にサイトダウンが再発。3月19日 JST0時頃 再復旧を確認。</p>
<p><a href="https://twitter.com/DonnieFinance/status/1372338068942774274" target="_blank" rel="noopener noreferrer" class="">https://twitter.com/DonnieFinance/status/1372338068942774274</a></p>
<p><a href="https://twitter.com/DonnieFinance/status/1372437004693032963" target="_blank" rel="noopener noreferrer" class="">https://twitter.com/DonnieFinance/status/1372437004693032963</a></p>
<p>2021年3月20日(土)追記：現在はcloudflareによるDDoS対策が導入されている。</p>
<figure>
<p><img decoding="async" loading="lazy" alt="donnie_finance_ddos_countermeasure" src="https://yukun.info/assets/images/donnie_finance_ddos_countermeasure-b2d4e226192804d79ad4f81f74654d45.png" width="1000" height="943" class="img_Q36t"></p>
<figcaption>
<p>Webサイトへのアクセス時にCAPTCHA入力要</p>
</figcaption>
</figure>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="発生原因">発生原因<a href="https://yukun.info/blog/defi-donnie-finance-down#%E7%99%BA%E7%94%9F%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 発生原因" title="Direct link to 発生原因" translate="no">​</a></h2>
<p>3/18時点で公式プレスは無く、2度目のサイトダウン時に上記の投稿のみ。DDoS (Distributed Denial of Service)攻撃との説明。但し事実検証は外部からは不可。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="所見">所見<a href="https://yukun.info/blog/defi-donnie-finance-down#%E6%89%80%E8%A6%8B" class="hash-link" aria-label="Direct link to 所見" title="Direct link to 所見" translate="no">​</a></h2>
<p>インシデントレスポンスとして公式の一報や影響見極めが遅い点はユーザー側をやきもきさせた可能性あり。但し暗号資産の影響有無をユーザー側でも状況確認できるのはブロックチェーン上のスマートコントラクト技術の大きなメリットであることも再認識されたと思われる。</p>
<p>DeFiサービスプロバイダー側はサービスサイト上でユーザー側の資金決済情報(ユーザーアカウントのプライベート鍵[秘密鍵])を保管を行う必要はなく、あくまでクライアント側のウォレット(大抵のDeFiはブラウザアドオン機能を用いる)をインターフェイスとした資金移動機能をスマートコントラクトで提供するのみの為、適切な実装であれば本事象はサイトダウンに留まる。</p>
<p>留意しなけれならない点として、ユーザー側がブロックチェーン上の暗号資産の状態を確認するには正規のコントラクトアドレスを<strong>事前</strong>に押さえておく必要があること。</p>
<figure>
<p><img decoding="async" loading="lazy" alt="donnie_finance_contract_addr" src="https://yukun.info/assets/images/donnie_finance_contract_addr-1024x678-27249fcd4b4e77ab2643fcb1f1cae813.png" width="1024" height="678" class="img_Q36t"></p>
<figcaption>
<p>公式サイト上のコントラクトアドレスの掲示</p>
</figcaption>
</figure>
<p>サイバー攻撃等を受けやすい業界でもあるため、大事なコントラクトアドレスをサービス提供サイトでの掲載だと、当該サイトが改ざんされた場合やDNSハイジャック攻撃で別サーバへ誘導された場合にユーザーが悪意のあるコントラクトアドレスを掴まされる可能性がある。その為、複数媒体でコントラクトアドレスを掲載しておくのがベストプラクティスと考える。</p>
<blockquote>
<p><strong>Don Token Contract :</strong>&nbsp;<a href="https://www.iostabc.com/token/don?page=1&amp;size=50&amp;order=asc" target="_blank" rel="noopener noreferrer" class=""><em>Contract5ndTHiqRRPWnT5wBFhQ9bthhueT9LVFnuGgGEVfmVRb8</em></a></p>
<p><a href="https://donnie-finance.medium.com/donnie-finance-and-iost-announcing-don-airdrop-for-iost-holders-f168e9f608a5" target="_blank" rel="noopener noreferrer" class="">https://donnie-finance.medium.com/donnie-finance-and-iost-announcing-don-airdrop-for-iost-holders-f168e9f608a5</a></p>
</blockquote>
<p>今回のケースでは上記がDONのトークンコントラクトとなりその情報はIOSTABCサイトで誰でも閲覧可能。</p>
<ul>
<li class="">
<p><a href="https://www.iostabc.com/token/don?page=1&amp;size=50&amp;order=asc" target="_blank" rel="noopener noreferrer" class="">Token:don</a></p>
</li>
<li class="">
<p><a href="https://www.iostabc.com/contract/Contract5ndTHiqRRPWnT5wBFhQ9bthhueT9LVFnuGgGEVfmVRb8?page=1&amp;size=50&amp;order=asc" target="_blank" rel="noopener noreferrer" class="">Contract5ndTHiqRRPWnT5wBFhQ9bthhueT9LVFnuGgGEVfmVRb8</a></p>
</li>
</ul>
<p>ここから今回のDONトークンを作成したIOSTアカウントは<a href="https://www.iostabc.com/account/donmanager" target="_blank" rel="noopener noreferrer" class="">donmanager</a>と分かる。当該アカウントのプライベート鍵[秘密鍵]さえ適切に保管されていればコントラクトの改ざんは不可。</p>
<p>また、ブラウザウォレットでの操作承認画面や自アカウントのトランザクション取引参照することで、DonnieFinance上のStakingトークン毎のコントラクトアドレスを確認できる。例としてIOSTのStaking 01 ( <a href="https://donnie.finance/trade/iost01" target="_blank" rel="noopener noreferrer" class="">https://donnie.finance/trade/iost01</a> ) のコントラクトアドレスは</p>
<p><a href="https://www.iostabc.com/contract/Contract8JxGDc8B8Xa94uKv12bgSMkvShPjCPRLTNDMZYMbghGi?page=1&amp;size=50&amp;order=asc" target="_blank" rel="noopener noreferrer" class="">Contract8JxGDc8B8Xa94uKv12bgSMkvShPjCPRLTNDMZYMbghGi</a></p>
<figure>
<p><img decoding="async" loading="lazy" alt="contract_address_iost01" src="https://yukun.info/assets/images/contract_address_iost01-1007x1024-625c684ff9a043b8ba3166dc0850cd90.png" width="1007" height="1024" class="img_Q36t"></p>
<figcaption>
<p>例：iWallet(donnie.financeサイトのWebアプリ上のホップアップ画面<strong>ではない</strong>)のスマートコントラクトの実行確認画面。左側にコントラクトアドレスが記載。話ずれるがiGas代安！！(Ethereum脳より)</p>
</figcaption>
</figure>
<p>なお、各コントラクトコードもIOSTABCページのCONTRACT CODEタブから確認可能。</p>
<div class="language-javascript codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-javascript codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">DON_TOKEN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'don'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">DON_ADDRESS</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Contract5ndTHiqRRPWnT5wBFhQ9bthhueT9LVFnuGgGEVfmVRb8'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">STAKE_TOKEN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'iost'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//IOST</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">＜中略＞</span><br></div></code></pre></div></div>
<p>正規のDON tokenアドレスを指していることを確認できる。IOSTのコントラクトアドレスは接頭辞にContract....がついているので検索が容易なのが良い。改ざんする人はコードの冒頭に高らかにコントラクトアドレスを記載しないだろうし。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="最後に">最後に<a href="https://yukun.info/blog/defi-donnie-finance-down#%E6%9C%80%E5%BE%8C%E3%81%AB" class="hash-link" aria-label="Direct link to 最後に" title="Direct link to 最後に" translate="no">​</a></h2>
<p>以下にハードウェアウォレットのアフィリエイトリンクを置いておくので良ければ活用下さい。割引特典あり。</p>
<p><a href="https://shop.safepal.io/products/safepal-hardware-wallet-s1-bitcoin-wallet?ref=yukun" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/5d691081125a5-272a9891ca609c00d73c3bfafab086fc.png" width="728" height="90" class="img_Q36t"></a></p>]]></content:encoded>
            <category>Blockchain</category>
            <category>DeFi</category>
            <category>Don</category>
            <category>Donnie Finance</category>
            <category>IOST</category>
        </item>
        <item>
            <title><![CDATA[Apache エラー解決法 AH00526: Syntax error ~ httpd.conf:Invalid command 'Â ', perhaps misspelled or defined by a module not included in the server configuration]]></title>
            <link>https://yukun.info/blog/apache-ah00526-syntax-error-c2a0</link>
            <guid>https://yukun.info/blog/apache-ah00526-syntax-error-c2a0</guid>
            <pubDate>Tue, 05 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[表題のエラーで嵌った為、解決法を共有するもの。]]></description>
            <content:encoded><![CDATA[<p>表題のエラーで嵌った為、解決法を共有するもの。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="事象">事象<a href="https://yukun.info/blog/apache-ah00526-syntax-error-c2a0#%E4%BA%8B%E8%B1%A1" class="hash-link" aria-label="Direct link to 事象" title="Direct link to 事象" translate="no">​</a></h2>
<p>Apache httpdの公式Docker imageであるhttpd:2.4.46において、/usr/local/apache2/conf/httpd.confにカスタム設定を記述の上コンテナ起動した際に以下のエラーメッセージが出力しhttpdプロセスが起動せず。</p>
<!-- -->
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">&amp;gt; Executing task: docker logs -f 8b75027a04df9b312e5e371cc553e8caecc57cafb7f90829f19d4587e974effb &amp;lt; </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AH00526: Syntax error on line 558 of /usr/local/apache2/conf/httpd.conf: Invalid command '\xc2\xa0', perhaps misspelled or defined by a module not included in the server configuration </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AH00526: Syntax error on line 558 of /usr/local/apache2/conf/httpd.conf: Invalid command '\xc2\xa0', perhaps misspelled or defined by a module not included in the server configuration </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AH00526: Syntax error on line 558 of /usr/local/apache2/conf/httpd.conf: Invalid command '\xc2\xa0', perhaps misspelled or defined by a module not included in the server configuration </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AH00526: Syntax error on line 558 of /usr/local/apache2/conf/httpd.conf: Invalid command '\xc2\xa0', perhaps misspelled or defined by a module not included in the server configuration </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">＜後略(docker-compose.ymlでrestart: unless-stopped設定した為、エンドレスに出力された)＞</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/apache-ah00526-syntax-error-c2a0#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h2>
<p>VScodeやテキストエディタで対象のhttpd.confファイルを確認しても'\xc2\xa0'そのものの文字列はなく、先頭の\xをUTF-8の16進数表記のエントリポイントとすると、文字コードC2A0は<a href="https://en.wikipedia.org/wiki/Non-breaking_space" target="_blank" rel="noopener noreferrer" class="">non-breaking space, NBSP</a>と分かる。</p>
<p>今回このhttpd.confファイルの編集時、MS PowerPointファイル中のテキストボックスの文字列をコピペした際に混入したもの。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="解決法">解決法<a href="https://yukun.info/blog/apache-ah00526-syntax-error-c2a0#%E8%A7%A3%E6%B1%BA%E6%B3%95" class="hash-link" aria-label="Direct link to 解決法" title="Direct link to 解決法" translate="no">​</a></h2>
<p>テキストエディタでは上手く削除できなかった為、Mac用のバイナリエディタある<a href="https://apps.apple.com/jp/app/hex-fiend/id1342896380?mt=12" target="_blank" rel="noopener noreferrer" class="">Hex Fiend</a>で削除した。</p>
<figure>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/hex_fiend_httpd_conf_c2a0-1024x898-cbf457165a8184e3b1b2952cf10dd04d.png" width="1024" height="898" class="img_Q36t"></p>
<figcaption>
<p>画像右下の赤枠の「ﾂ 」がC2A0の箇所としてヒット</p>
</figcaption>
</figure>]]></content:encoded>
            <category>Apache</category>
        </item>
        <item>
            <title><![CDATA[Jetson nano 2GB: USBカメラとPython FlaskでWeb動画ストリーミング]]></title>
            <link>https://yukun.info/blog/jetson-nano-webcam-flask</link>
            <guid>https://yukun.info/blog/jetson-nano-webcam-flask</guid>
            <pubDate>Tue, 22 Dec 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[この記事はMDCアドベントカレンダー22日目の記事となる。]]></description>
            <content:encoded><![CDATA[<p>この記事は<a href="https://qiita.com/advent-calendar/2020/mdc" target="_blank" rel="noopener noreferrer" class="">MDCアドベントカレンダー</a>22日目の記事となる。</p>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="はじめに">はじめに<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="Direct link to はじめに" title="Direct link to はじめに" translate="no">​</a></h2>
<ul>
<li class="">
<p>表題のJetson nanoとはNVIDIA製の128-core GPU、Quod-core ARM CPUを持つシングルボードコンピュータ (ref: <a href="https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF" target="_blank" rel="noopener noreferrer" class="">Wikipedia link</a>)。</p>
<ul>
<li class="">
<p>公式 製品概要：<a href="https://www.nvidia.com/ja-jp/autonomous-machines/jetson-store/" target="_blank" rel="noopener noreferrer" class="">最新の Jetson 製品の購入 – NVIDIA Developer</a></p>
</li>
<li class="">
<p>公式 Jetson nano 2GB 仕様：<a href="https://developer.nvidia.com/embedded/jetson-nano-2gb-developer-kit" target="_blank" rel="noopener noreferrer" class="">Jetson Nano 2GB Developer Kit | NVIDIA Developer</a></p>
</li>
</ul>
</li>
<li class="">
<p>本記事では2020年10月5日に発売発表されたJetson nano 2GBとUSBカメラを用いてWeb動画ストリーミング機能をPython Flaskで構築するためのソースコード等を紹介するもの。</p>
</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="機能概要">機能概要<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E6%A9%9F%E8%83%BD%E6%A6%82%E8%A6%81" class="hash-link" aria-label="Direct link to 機能概要" title="Direct link to 機能概要" translate="no">​</a></h2>
<ul>
<li class="">
<p>Webブラウザ経由でUSBカメラでキャプチャした動画(連続画像)を表示</p>
</li>
<li class="">
<p>音声なし、動画の同時表示クライアント数は1つ</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="実行時のイメージ">実行時のイメージ<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to 実行時のイメージ" title="Direct link to 実行時のイメージ" translate="no">​</a></h2>
<p>紹介するソースコードの実行時のイメージは以下の通り。自身が想定した以上にヌルヌル動くので驚きだった。</p>
<figure>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/jetson_nano_flask_webcam_stream-1-768x1024-9051f5590b17f453e0b2aaf945839a72.jpg" width="768" height="1024" class="img_Q36t"></p>
<figcaption>
<p>USBカメラのキャプチャ内容をWebブラウザでストリーミング配信中</p>
</figcaption>
</figure>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="実行環境">実行環境<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83" class="hash-link" aria-label="Direct link to 実行環境" title="Direct link to 実行環境" translate="no">​</a></h2>
<p>本体(+ソフトウェアのバージョン)と付属部品を紹介する。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="jetson-nano-2gb-本体">Jetson nano 2GB 本体<a href="https://yukun.info/blog/jetson-nano-webcam-flask#jetson-nano-2gb-%E6%9C%AC%E4%BD%93" class="hash-link" aria-label="Direct link to Jetson nano 2GB 本体" title="Direct link to Jetson nano 2GB 本体" translate="no">​</a></h3>
<p><a href="https://amzn.to/3rgj8M6" target="_blank" rel="noopener noreferrer" class="">NVIDIA Jetson Nano 2GB 開発者キット JETSON NANO 2GB DEV KIT</a></p>
<p>初期設定時はモニタ・キーボード・マウス等ケーブルに囚われるイメージだが、VNC, ssh周りの設定が完了すれば2枚目の画像の通り多少はスッキリする。</p>
<figure>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/jetson_nano_2gb_first-77bfa3a5ab8bc88d5c62555c58173041.jpg" width="1000" height="750" class="img_Q36t"></p>
<figcaption>
<p>初回起動・初期設定時</p>
</figcaption>
</figure>
<figure>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/jetson_nano_2gb_remote_dev_cam-7a9a29643cfa8ce520e40c949af165f7.jpg" width="1000" height="750" class="img_Q36t"></p>
<figcaption>
<p>リモート開発環境の設定後</p>
</figcaption>
</figure>
<h4 class="anchor anchorTargetStickyNavbar_krSy" id="osバージョン">OSバージョン<a href="https://yukun.info/blog/jetson-nano-webcam-flask#os%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3" class="hash-link" aria-label="Direct link to OSバージョン" title="Direct link to OSバージョン" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">$ cat /etc/nv_tegra_release</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># R32 (release), REVISION: 4.4, GCID: 23942405, BOARD: t210ref, EABI: aarch64, DATE: Fri Oct 16 19:44:43 UTC 2020</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ dpkg-query --show nvidia-l4t-core</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nvidia-l4t-core	32.4.4-20201016124427</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_krSy" id="pythonパッケージバージョン">Python、パッケージバージョン<a href="https://yukun.info/blog/jetson-nano-webcam-flask#python%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3" class="hash-link" aria-label="Direct link to Python、パッケージバージョン" title="Direct link to Python、パッケージバージョン" translate="no">​</a></h4>
<p>主に使用するのはOpenCV、Flask、uWSGIとなる。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">$ python3 -V</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Python 3.6.9</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ pip -V</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pip 20.3.3 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ pip freeze | grep -e Flask -e uWSGI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Flask==1.1.2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">uWSGI==2.0.19.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Python 2.7.17 (default, Sep 30 2020, 13:38:04)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[GCC 7.5.0] on linux2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">&amp;gt;&amp;gt;&amp;gt; import cv2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">&amp;gt;&amp;gt;&amp;gt; print(cv2.__version__)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4.5.0</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="usbカメラ">USBカメラ<a href="https://yukun.info/blog/jetson-nano-webcam-flask#usb%E3%82%AB%E3%83%A1%E3%83%A9" class="hash-link" aria-label="Direct link to USBカメラ" title="Direct link to USBカメラ" translate="no">​</a></h3>
<p>最近発売されて価格と性能が釣り合っているロジクールC505を使用。赤ちゃんモニター用途だとより広角が欲しくなるかもだが、トライアルであれば十分な仕様。</p>
<p><a href="https://amzn.to/34wli0l" target="_blank" rel="noopener noreferrer" class="">ロジクール ウェブカメラ C505 HD 720P 自動光補正 ロングレンジマイク 2mの長いUSB接続ケーブル プラグアンドプレイ WEBカメラ ZoomやSkype等主要なビデオ通話アプリに対応 国内正規品 2年間メーカー保証</a></p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="その他部品">その他部品<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E3%81%9D%E3%81%AE%E4%BB%96%E9%83%A8%E5%93%81" class="hash-link" aria-label="Direct link to その他部品" title="Direct link to その他部品" translate="no">​</a></h3>
<p>microSDカードと電源ケーブル。欲を言えばケースも欲しかったが、2020年12月時点2GBモデルに対応する適当なケースが無く裸で使用している。</p>
<ul>
<li class="">
<p><a href="https://amzn.to/38lUQri" target="_blank" rel="noopener noreferrer" class="">Smraza Raspberry Pi 4 USB-C (Type C）電源、5V 3A ラズベリーACアダプター RPi 4b Model B 1GB / 2GB / 4GB/ 8GB適用 PSE取得</a></p>
</li>
<li class="">
<p><a href="https://amzn.to/34wzRB6" target="_blank" rel="noopener noreferrer" class="">Samsung EVO Plus 128GB microSDXC UHS-I U3 100MB/s Full HD &amp; 4K UHD Nintendo Switch 動作確認済 MB-MC128GA/ECO 国内正規保証品</a></p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="ソースコード">ソースコード<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89" class="hash-link" aria-label="Direct link to ソースコード" title="Direct link to ソースコード" translate="no">​</a></h2>
<p>構成としてはFlask Webアプリ内でUSBカメラのキャプチャ画像を60fpsで出力する構成となる。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="ファイルフォルダ構成">ファイル・フォルダ構成<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90" class="hash-link" aria-label="Direct link to ファイル・フォルダ構成" title="Direct link to ファイル・フォルダ構成" translate="no">​</a></h3>
<p>実際には下記以外に開発環境であるVS code用の設定ファイル、Web公開の為のBasic認証用のNginxコンテナ周りの設定ファイルやDockerfile、docker-compose.ymlファイル等があるが、表題とズレる為割愛する。</p>
<div class="language-text codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-text codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">~/code/jetson-web-stream$ tree</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── app.pid  # uwsgi経由での起動時に作成自動作成される</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── app.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── templates</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ └── index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── uwsgi.ini</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="apppy---flaskアプリ本体">app.py - Flaskアプリ本体<a href="https://yukun.info/blog/jetson-nano-webcam-flask#apppy---flask%E3%82%A2%E3%83%97%E3%83%AA%E6%9C%AC%E4%BD%93" class="hash-link" aria-label="Direct link to app.py - Flaskアプリ本体" title="Direct link to app.py - Flaskアプリ本体" translate="no">​</a></h3>
<p><a href="https://amzn.to/3nCs6ks" target="_blank" rel="noopener noreferrer" class="">Interface 2021年1月号</a>にbottleフレームワーク(FW)版の記載があるが、私が得意なFWはDjangoかFlaskの為、メインの処理部分を参考にしつつFlask-nizeしたもの。</p>
<p>ページ構成としてはルートディレクトリ'/'にアクセス時に呼び出されるindex.htmlテンプレート内のimgソースとしてvideo_recvメソッドが呼び出される。当該ページ(画像)はサーバのプッシュ通信で描画内容を更新させる為mimetype='multipart/x-mixed-replace;boundary=frame'指定とし、__main()処理内のyield句で生成されるjpg画像が60fpsで切り替わる流れ。</p>
<div class="language-python codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-python codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> flask </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Flask</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> render_template</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Response </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> cv2 </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> time</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Flask</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__name__</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">__main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cap </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cv2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">VideoCapture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> cap</span><span class="token punctuation" style="color:#393A34">.</span><span class="token builtin">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cv2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CAP_PROP_FRAME_WIDTH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">640</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 1280 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 360) # 720 if not cap.isOpened(): # ビデオキャプチャー可能か判断 print("Not Opened Video Camera") exit()</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ret</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> img </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cap</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">read</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> ret</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># キャプチャ失敗時に終了 print("Video Capture Err") break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># キャプチャ画像を出力 result, jpgImg = cv2.imencode('.jpg', img=img, params=[int(cv2.IMWRITE_JPEG_QUALITY), 80]) # 0 - 100 yield b'--frame\r\n' + b'Content-Type: image/jpeg\r\n\r\n' + bytearray(jpgImg) + b'\r\n\r\n' time.sleep(1 / 60)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cap</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">release</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> cv2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">destroyAllWindows</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">route</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">index</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> render_template</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'index.html'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">route</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/video_recv'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">video_recv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> mimetype</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'multipart/x-mixed-replace;boundary=frame'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'__main__'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cv2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">__version__</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">host</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'0.0.0.0'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">8080</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> debug</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="indexhtml---flask-アプリのテンプレート">index.html - Flask アプリのテンプレート<a href="https://yukun.info/blog/jetson-nano-webcam-flask#indexhtml---flask-%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88" class="hash-link" aria-label="Direct link to index.html - Flask アプリのテンプレート" title="Direct link to index.html - Flask アプリのテンプレート" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-html codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token doctype punctuation" style="color:#393A34;font-style:italic">&lt;!</span><span class="token doctype doctype-tag" style="color:#999988;font-style:italic">DOCTYPE</span><span class="token doctype" style="color:#999988;font-style:italic"> </span><span class="token doctype name" style="color:#999988;font-style:italic">html</span><span class="token doctype punctuation" style="color:#393A34;font-style:italic">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">html</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">title</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Ba!</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">title</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">charset</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">UTF-8</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">viewport</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">width=device-width, initial-scale=1</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">text/css</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css"> </span><span class="token style language-css selector" style="color:#00009f">&lt;!-- </span><span class="token style language-css selector id" style="color:#00009f">#ID_01</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"> </span><span class="token style language-css property" style="color:#36acaa">text-align</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> center</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token style language-css"></span><span class="token style language-css selector id" style="color:#00009f">#ID_TITLE</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"> </span><span class="token style language-css property" style="color:#36acaa">font-size</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">10</span><span class="token style language-css unit">pt</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css property" style="color:#36acaa">text-align</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> center</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"> --&gt; </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">ID_TITLE</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Web Streaming by Single board computer "Jetson nano 2GB"</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">ID_01</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">html</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="uwsgiini---flask用apサーバー">uwsgi.ini - Flask用APサーバー<a href="https://yukun.info/blog/jetson-nano-webcam-flask#uwsgiini---flask%E7%94%A8ap%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC" class="hash-link" aria-label="Direct link to uwsgi.ini - Flask用APサーバー" title="Direct link to uwsgi.ini - Flask用APサーバー" translate="no">​</a></h3>
<p>開発環境でのテスト実行であればif <strong>name</strong> == '<strong>main</strong>':句内を直接実行で構わないが、本番運用時は以下のWARNINGの通り推奨されない。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">$ python3 app.py </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4.5.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> * Serving Flask app &amp;quot;app&amp;quot; (lazy loading)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> * Environment: production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   WARNING: This is a development server. Do not use it in a production deployment.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Use a production WSGI server instead.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">＜攻略＞</span><br></div></code></pre></div></div>
<p><a href="https://flask.palletsprojects.com/en/master/server/" target="_blank" rel="noopener noreferrer" class="">Development Server — Flask Documentation (2.0.x)</a></p>
<p>uwsgi.ini記述は以下の通り。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">[uwsgi]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">master = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">http=0.0.0.0:8080</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">wsgi-file = app.py </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">callable = app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">processes = 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">threads = 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pidfile=./app.pid</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="実行方法">実行方法<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95" class="hash-link" aria-label="Direct link to 実行方法" title="Direct link to 実行方法" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> # uwsgiサーバーの起動 $ uwsgi uwsgi.ini &amp;amp;amp;amp; [1] 18387</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 起動プロセス番号を確認 $ cat app.pid 18387</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># uwsgiサーバーの停止 $ uwsgi --stop app.pid </span><br></div></code></pre></div></div>
<p>コマンド末尾に&amp;を付与することでバックグラウンドでの実行が可能。尚、実行時のリソース使用状況は以下の通り。これまで動画像処理の経験があまりなく、必要リソースの肌感覚が掴めなかった為参考となった。配信のマルチスレッド化とアクセス数の増加時にどのように推移するかは気になる点である。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> $ top top - 22:20:37 up 1 day, 13:11, 2 users, load average: 0.39, 0.19, 0.19 Tasks: 248 total, 1 running, 247 sleeping, 0 stopped, 0 zombie %Cpu(s): 5.7 us, 0.6 sy, 0.0 ni, 92.4 id, 0.0 wa, 1.1 hi, 0.2 si, 0.0 st KiB Mem : 2027368 total, 467944 free, 598448 used, 960976 buff/cache KiB Swap: 5207980 total, 4990740 free, 217240 used. 1352596 avail Mem</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 18975 xx 20 0 1351516 66968 25232 S 19.2 3.3 0:02.64 uwsgi 5343 root 20 0 6530024 44920 20744 S 0.7 2.2 56:16.21 Xorg 19528 xx 20 0 10148 3928 3192 R 0.7 0.2 0:00.12 top 4405 root -51 0 0 0 0 S 0.3 0.0 33:22.67 sugov:0 5676 xx 20 0 371972 19496 15068 S 0.3 1.0 11:05.43 vino-server 5713 xx 20 0 361252 12776 9312 S 0.3 0.6 61:26.18 clipit 5977 xx 20 0 499780 3108 2004 S 0.3 0.2 18:58.24 python3 15604 root 20 0 0 0 0 S 0.3 0.0 0:01.16 kworker/u8:2 18153 systemd+ 20 0 8732 3380 2060 S 0.3 0.2 0:01.83 nginx 18979 xx 20 0 988352 45204 1628 S 0.3 2.2 0:00.03 uwsgi 1 root 20 0 161208 6112 4264 S 0.0 0.3 0:09.15 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:35.86 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:03.62 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root 20 0 0 0 0 S 0.0 0.0 1:33.45 rcu_preempt 8 root 20 0 0 0 0 S 0.0 0.0 0:03.07 rcu_sched 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0:00.02 migration/0 $ free -m total used free shared buff/cache available Mem: 1979 584 457 18 938 1321 Swap: 5085 212 4873 </span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_krSy" id="作成動機背景">作成動機・背景<a href="https://yukun.info/blog/jetson-nano-webcam-flask#%E4%BD%9C%E6%88%90%E5%8B%95%E6%A9%9F%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to 作成動機・背景" title="Direct link to 作成動機・背景" translate="no">​</a></h2>
<p>これまでシングルボードコンピュータを扱ったことがなく、書籍やWeb上の活用事例を見ながら漠然とした興味に留まっていたがJetson nano 2GBのお手頃価格が背中を押した感じ。</p>
<p>我が家はFamily budgetのみの為、妻とJetson nano 2GBの活用方法を相談している中で、表題のアプリはコロナ禍で英露から来日出来ない妻の両親が「何時でもお孫さんと一緒だよ」と感じられるツールにもなるとのことで、了解してもらった。</p>
<p>ただ、実際に設置してみると現時点は我々夫婦が専らのユーザーとなり生後4ヶ月の息子の寝返りチャレンジをチラ見する事となった。。(今の所寝返るが腕抜きが出来ず最後に泣いて両親駆けつけレスキュー)</p>]]></content:encoded>
            <category>Flask</category>
            <category>Jetson Nano</category>
            <category>PyCharm</category>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Python: 東京都 新型コロナウイルス(COVID-19)陽性患者発表詳細のcsvデータを積み上げグラフ表示]]></title>
            <link>https://yukun.info/blog/python-covid19-tokyo-opendata</link>
            <guid>https://yukun.info/blog/python-covid19-tokyo-opendata</guid>
            <pubDate>Wed, 06 May 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Python pandasのデータフレームの学習がてら表題のオープンデータを用いて日時の陽性者数を年代別に積み上げグラフとして出力するスクリプトを下記リンク先に掲載。]]></description>
            <content:encoded><![CDATA[<p>Python pandasのデータフレームの学習がてら表題のオープンデータを用いて日時の陽性者数を年代別に積み上げグラフとして出力するスクリプトを下記リンク先に掲載。</p>
<!-- -->
<p><a href="https://github.com/yu-kun/covid19-tokyo-opendata" target="_blank" rel="noopener noreferrer" class="">yu-kun/covid19-tokyo-opendata: Source code to a distribution of patients by age group created with Python Jupyter on the basis of Tokyo Open Data Catalogue Site csv file.</a></p>
<p>VS codeのdev containerの設定ファイルも同梱することで、環境構築を容易に可能。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="実行結果例">実行結果例<a href="https://yukun.info/blog/python-covid19-tokyo-opendata#%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E4%BE%8B" class="hash-link" aria-label="Direct link to 実行結果例" title="Direct link to 実行結果例" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="daily_patient_number_20200504" src="https://yukun.info/assets/images/daily_patient_number_20200504-3ea6cb51e89aa482b78c9be7c5cde5b2.png" width="495" height="367" class="img_Q36t"></p>
<p><img decoding="async" loading="lazy" alt="distribution_of_patients_by_age_group_20200504" src="https://yukun.info/assets/images/distribution_of_patients_by_age_group_20200504-1024x359-d9d2540923f1a56387d165292e456045.png" width="1024" height="359" class="img_Q36t"></p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="ソースコード">ソースコード<a href="https://yukun.info/blog/python-covid19-tokyo-opendata#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89" class="hash-link" aria-label="Direct link to ソースコード" title="Direct link to ソースコード" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-python codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># %% import matplotlib.pyplot as plt import japanize_matplotlib import pandas as pd</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %% url = 'https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv' df = pd.read_csv(url) df['公表_年月日'] = pd.to_datetime(df['公表_年月日'], format='%Y-%m-%d') # 未使用予定の列を削除 del df['No'], df['全国地方公共団体コード'], df['市区町村名'], df['発症_年月日'], df['患者_属性'], \ df['患者_状態'], df['患者_症状'], df['患者_渡航歴の有無フラグ'], df['備考']</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %% df</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %% # 日別の陽性者数の集計 se_dairy = df.groupby('公表_年月日').size() se_dairy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %% # 特定日の陽性者数を出力 se_dairy['2020-04-17']</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %% # 日別の陽性者数の棒グラフ ax_dairy = se_dairy.plot(title='東京都 新型コロナウイルス陽性患者') fig = ax_dairy.get_figure() fig.savefig('data/daily_patient_number_' + df['公表_年月日'].max().strftime('%Y%m%d') + '.png', dpi=100)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %% df_tmp = df[['公表_年月日', '患者_年代']] # 人数列を追加 df_tmp['人数'] = 1 # 行と列を指定してピボット（再形成） df_tmp2 = df_tmp.pivot(columns='患者_年代', values='人数' ) # columns方向(axis=1)に結合し欠損値を0置換 df_tmp3 = pd.concat([df_tmp['公表_年月日'], df_tmp2], axis=1).fillna(0) # 列順序の変更 df_tmp3 = df_tmp3[['公表_年月日', '10歳未満', '10代', '20代', '30代', '40代', '50代', '60代', '70代', '80代', '90代', '100歳以上', '不明', "-"]] # 日別集計 df_age = df_tmp3.groupby('公表_年月日').sum()</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %% df_age1 = df_age.copy() df_age1.index = df_age.index.strftime('%m/%d') ax_age = df_age1.plot(kind='bar', stacked=True, figsize=(17,5), title='東京都 新型コロナウイルス陽性患者(年代別積み上げ)') fig = ax_age.get_figure() fig.savefig('data/distribution_of_patients_by_age_group_' + df['公表_年月日'].max().strftime('%Y%m%d') + '.png', dpi=100)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># %%</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Python</category>
            <category>VS Code</category>
        </item>
        <item>
            <title><![CDATA[VS Code: ホストのssh鍵をコンテナから利用／リモートコンテナからGitHubへのpush時のHost key verification failedエラー解決法]]></title>
            <link>https://yukun.info/blog/vscode-github-host-key-verification</link>
            <guid>https://yukun.info/blog/vscode-github-host-key-verification</guid>
            <pubDate>Mon, 27 Apr 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Mac OS 10.15.4, Visual Studio Code v1.44.2において、リモートコンテナ(dev container)上からソースコードをGitリポジトリへコミット、GitHubへプッシュを試みたところ、下記のエラーが発生しコミット及びプッシュが完了しない事象が発生。]]></description>
            <content:encoded><![CDATA[<p>Mac OS 10.15.4, Visual Studio Code v1.44.2において、リモートコンテナ(dev container)上からソースコードをGitリポジトリへコミット、GitHubへプッシュを試みたところ、下記のエラーが発生しコミット及びプッシュが完了しない事象が発生。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラーメッセージ">エラーメッセージ<a href="https://yukun.info/blog/vscode-github-host-key-verification#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to エラーメッセージ" title="Direct link to エラーメッセージ" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> Run</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git config --global user.email "you@example.com" git config --global user.name "Your Name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">to set your account's default identity. Omit --global to set the identity only in this repository.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fatal: unable to auto-detect email address (got 'vscode@97eafea5e679.(none)') &gt; git config --get-all user.name &gt; git config --get-all user.email ＜後略＞ </span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/git_error_config-4f8c3ede7da74a1c6859339b7f27de54.png" width="492" height="123" class="img_Q36t"></p>
<p>上記の対処法としては、記載の通りローカル環境で(≠リモートコンテナ環境)でgit configでemail, user nameを設定し、Rebuild Containerを実行することでローカルの.gitconfigがコンテナへ引き継がれ再コミット時はエラー解決する。しかし、プッシュ時には下記のエラーが発生するようになる。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> ＜前略＞ &gt; git push origin master:master Host key verification failed. fatal: Could not read from remote repository.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Please make sure you have the correct access rights and the repository exists. &gt; git fetch Host key verification failed. fatal: Could not read from remote repository.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Please make sure you have the correct access rights and the repository exists. ＜後略＞ </span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/git_hostkey_error-407d1d60ad5826685c613551cfbcbae0.png" width="408" height="120" class="img_Q36t"></p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="原因と解決法">原因と解決法<a href="https://yukun.info/blog/vscode-github-host-key-verification#%E5%8E%9F%E5%9B%A0%E3%81%A8%E8%A7%A3%E6%B1%BA%E6%B3%95" class="hash-link" aria-label="Direct link to 原因と解決法" title="Direct link to 原因と解決法" translate="no">​</a></h3>
<p>原因は記載の通り、Host key認証失敗だがgit関連の認証設定を特にしていない場合、先ずは下記公式ドキュメントを参考に設定を行う。</p>
<p><a href="https://code.visualstudio.com/docs/remote/containers#_sharing-git-credentials-with-your-container" target="_blank" rel="noopener noreferrer" class="">Developing inside a Container using Visual Studio Code Remote Development</a></p>
<p>私の環境ではGitHubに二段階認証を設定していた為、credential helper configuredではなく、SSH agent手法でGitHub認証用の秘密鍵を登録する。(事前に対となる公開鍵はについてはすでにGitHub上に登録済みの前提で後述の作業を行う)</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">% ssh-add -l</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">The agent has no identities.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">% ssh-add $HOME/.ssh/id_rsa</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Identity added: /Users/xxx/.ssh/id_rsa (/Users/xxx/.ssh/id_rsa)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">% ssh-add -l</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4096 SHA256:gqtj+gasge+tvvW9Tqke56uerdftsqo8o7kTdkSDYc /Users/xxx/.ssh/id_rsa (RSA)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">%</span><br></div></code></pre></div></div>
<p>その後、改めてコンテ上のターミナルでgithub.comのfingerprintを登録する。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">vscode@096d672ed308:/workspace$ ssh -T git@github.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">The authenticity of host 'github.com (52.192.72.89)' can't be established.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">RSA key fingerprint is SHA256:nThb3kXUpJWgwagwtagwagxdCARLviKw6E5SY8.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Are you sure you want to continue connecting (yes/no)? yes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Warning: Permanently added 'github.com,52.192.72.89' (RSA) to the list of known hosts.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.</span><br></div></code></pre></div></div>
<p>その後に改めてプッシュ(push)を行うと正常完了する。</p>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/git_fingerprint-84d151d52d2fad8bf283d1052b596fea.png" width="960" height="78" class="img_Q36t"></p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="mac-os-再起動後もssh-agentの登録鍵を利用">Mac OS 再起動後もSSH agentの登録鍵を利用<a href="https://yukun.info/blog/vscode-github-host-key-verification#mac-os-%E5%86%8D%E8%B5%B7%E5%8B%95%E5%BE%8C%E3%82%82ssh-agent%E3%81%AE%E7%99%BB%E9%8C%B2%E9%8D%B5%E3%82%92%E5%88%A9%E7%94%A8" class="hash-link" aria-label="Direct link to Mac OS 再起動後もSSH agentの登録鍵を利用" title="Direct link to Mac OS 再起動後もSSH agentの登録鍵を利用" translate="no">​</a></h3>
<p>下記リンク先のGitHub公式ヘルプ No.2に記載の通り、~/.ssh/configファイルのIdentityFileディレクティブへ秘密鍵のパスを指定しておけば良い。</p>
<p><a href="https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent" target="_blank" rel="noopener noreferrer" class="">Generating a new SSH key and adding it to the ssh-agent - GitHub Help</a></p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">Host *</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  AddKeysToAgent yes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  UseKeychain yes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  IdentityFile ~/.ssh/id_rsa</span><br></div></code></pre></div></div>
<p>再起動後にssh-add -lを実行すると"The agent has no identities."が出力されるが、dev containerからssh -T <a href="mailto:git@github.com" target="_blank" rel="noopener noreferrer" class="">git@github.com</a>を実行した際に自動的に秘密鍵が追加されsuccessfully authenticatedとなり、問題なく動作する。</p>]]></content:encoded>
            <category>Git</category>
            <category>SSH</category>
            <category>VS Code</category>
        </item>
        <item>
            <title><![CDATA[Django: エラー解決法 TypeError: __init__() missing 1 required positional argument: 'app_module']]></title>
            <link>https://yukun.info/blog/django-missing-app-module-error</link>
            <guid>https://yukun.info/blog/django-missing-app-module-error</guid>
            <pubDate>Sat, 18 Apr 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Python 3.8.2、Django==3.0.5の環境で、python manage.py runserverを実行した際に下記のエラーが発生し、サーバーが起動しない事象が発生。]]></description>
            <content:encoded><![CDATA[<p>Python 3.8.2、Django==3.0.5の環境で、python manage.py runserverを実行した際に下記のエラーが発生し、サーバーが起動しない事象が発生。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラーメッセージ">エラーメッセージ<a href="https://yukun.info/blog/django-missing-app-module-error#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to エラーメッセージ" title="Direct link to エラーメッセージ" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> vscode@d2a06e1c5d42:/workspace$ python manage.py runserver Watching for file changes with StatReloader Performing system checks...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">System check identified no issues (0 silenced). April 18, 2020 - 09:48:16 Django version 3.0.5, using settings 'crossk.settings' Starting development server at Quit the server with CONTROL-C. Exception in thread django-main-thread: Traceback (most recent call last): File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/usr/local/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/home/vscode/.local/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper fn(*args, **kwargs) File "/home/vscode/.local/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 137, in inner_run handler = self.get_handler(*args, **options) File "/home/vscode/.local/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/runserver.py", line 27, in get_handler handler = super().get_handler(*args, **options) File "/home/vscode/.local/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 64, in get_handler return get_internal_wsgi_application() File "/home/vscode/.local/lib/python3.8/site-packages/django/core/servers/basehttp.py", line 45, in get_internal_wsgi_application return import_string(app_path) File "/home/vscode/.local/lib/python3.8/site-packages/django/utils/module_loading.py", line 17, in import_string module = import_module(module_path) File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 1014, in _gcd_import File "", line 991, in _find_and_load File "", line 975, in _find_and_load_unlocked File "", line 671, in _load_unlocked File "", line 783, in exec_module File "", line 219, in _call_with_frames_removed File "/workspace/crossk/wsgi.py", line 16, in application = get_wsgi_application() File "/home/vscode/.local/lib/python3.8/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application return WSGIHandler() File "/home/vscode/.local/lib/python3.8/site-packages/django/core/handlers/wsgi.py", line 127, in __init__ self.load_middleware() File "/home/vscode/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 37, in load_middleware mw_instance = middleware(handler) TypeError: __init__() missing 1 required positional argument: 'app_module' </span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/django-missing-app-module-error#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h3>
<p>settings.pyのINSTALLED_APPSリストに作成したapp名を記載するところ、誤って、MIDDLEWAREリストに記載していた為。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決法">解決法<a href="https://yukun.info/blog/django-missing-app-module-error#%E8%A7%A3%E6%B1%BA%E6%B3%95" class="hash-link" aria-label="Direct link to 解決法" title="Direct link to 解決法" translate="no">​</a></h3>
<p>MIDDLEWAREリストに記載しているapp名を削除し、INSTALLED_APPSリストにapp名を記載すれば良い。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="参考サイト">参考サイト<a href="https://yukun.info/blog/django-missing-app-module-error#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88" class="hash-link" aria-label="Direct link to 参考サイト" title="Direct link to 参考サイト" translate="no">​</a></h3>
<p><a href="https://stackoverflow.com/questions/53209189/typeerror-init-missing-1-required-positional-argument-app-module" target="_blank" rel="noopener noreferrer" class="">django - TypeError: __init__() missing 1 required positional argument: 'app_module' - Stack Overflow</a></p>]]></content:encoded>
            <category>Django</category>
            <category>Python</category>
            <category>VS Code</category>
        </item>
        <item>
            <title><![CDATA[Django: エラー解決法 Unknown command: '~' Type 'manage.py help' for usage.]]></title>
            <link>https://yukun.info/blog/django-unknown-command-error</link>
            <guid>https://yukun.info/blog/django-unknown-command-error</guid>
            <pubDate>Fri, 17 Apr 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Python 3.8.2、Django==3.0.5の環境で、カスタムコマンドを作成の上、python manage.py コマンド名 を実行したところ、下記のエラーが発生しコマンド処理が実行されない事象が発生。]]></description>
            <content:encoded><![CDATA[<p>Python 3.8.2、Django==3.0.5の環境で、カスタムコマンドを作成の上、python manage.py コマンド名 を実行したところ、下記のエラーが発生しコマンド処理が実行されない事象が発生。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラーメッセージ">エラーメッセージ<a href="https://yukun.info/blog/django-unknown-command-error#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to エラーメッセージ" title="Direct link to エラーメッセージ" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">vscode@d2a06e1c5d42:/workspace$ python manage.py crawl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Unknown command: 'crawl'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Type 'manage.py help' for usage.</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="事象発生時のdjangoプロジェクトフォルダ構成">事象発生時のDjangoプロジェクトフォルダ構成<a href="https://yukun.info/blog/django-unknown-command-error#%E4%BA%8B%E8%B1%A1%E7%99%BA%E7%94%9F%E6%99%82%E3%81%AEdjango%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90" class="hash-link" aria-label="Direct link to 事象発生時のDjangoプロジェクトフォルダ構成" title="Direct link to 事象発生時のDjangoプロジェクトフォルダ構成" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-text codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">project/ # Djangoプロジェクトトップディレクトリ</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    manage.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    app_name/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        __init__.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        models.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        management/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            __init__.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            commands/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                __init__.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                crawl.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        views.py</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/django-unknown-command-error#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h3>
<p>settings.py内のINSTALLED_APPSリストにカスタムコマンドpyファイルが設置されているアプリ名を設定していなかった為。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決法">解決法<a href="https://yukun.info/blog/django-unknown-command-error#%E8%A7%A3%E6%B1%BA%E6%B3%95" class="hash-link" aria-label="Direct link to 解決法" title="Direct link to 解決法" translate="no">​</a></h3>
<p>上記の通り、INSTALLED_APPSリストにアプリ名を設定することで当該エラーは解消する。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> INSTALLED_APPS = (</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    'django.contrib.auth',</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    'django.contrib.admin',</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    'django.contrib.contenttypes',</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    'django.contrib.sessions',</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    'django.contrib.sites',</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    'app_name', # &lt;= アプリ名を追加</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">)</span><br></div></code></pre></div></div>
<p>動作確認としてpython manage.py helpを実行することで、利用できるカスタムコマンド一覧(Available subcommands)を出力できる。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="参考サイト">参考サイト<a href="https://yukun.info/blog/django-unknown-command-error#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88" class="hash-link" aria-label="Direct link to 参考サイト" title="Direct link to 参考サイト" translate="no">​</a></h3>
<p><a href="https://stackoverflow.com/questions/2190539/django-custom-command-not-found" target="_blank" rel="noopener noreferrer" class="">django custom command not found - Stack Overflow</a></p>]]></content:encoded>
            <category>Django</category>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[VS Code: gitのPermission denied (publickey)やInvalid username or password. fatal: Authentication failedの解決法]]></title>
            <link>https://yukun.info/blog/vscode-git-permission-denied</link>
            <guid>https://yukun.info/blog/vscode-git-permission-denied</guid>
            <pubDate>Thu, 16 Apr 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[VS Code 1.44.2にてGitHubへソースコードのプッシュをhttps方式、ssh方式療法で試みたところ、下記のエラーが発生しプッシュに失敗。]]></description>
            <content:encoded><![CDATA[<p>VS Code 1.44.2にてGitHubへソースコードのプッシュをhttps方式、ssh方式療法で試みたところ、下記のエラーが発生しプッシュに失敗。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラーメッセージ">エラーメッセージ<a href="https://yukun.info/blog/vscode-git-permission-denied#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to エラーメッセージ" title="Direct link to エラーメッセージ" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> ↓ https方式 次の場所で Git を検索しています: /usr/bin/git /usr/bin/git から Git 2.24.2 (Apple Git-127) を使用しています &gt; git clone /Users/xxx/Documents/vscode/yyy --progress Cloning into '/Users/xxx/Documents/vscode/yyy'... remote: Invalid username or password. fatal: Authentication failed for 'https://github.com/xxx/yyy.git/‘</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓ssh方式 &gt; git clone git@github.com:xxx/yyy.git /Users/xxx/Documents/vscode/yyy --progress Cloning into '/Users/xxx/Documents/vscode/yyy'... git@github.com: Permission denied (publickey). fatal: Could not read from remote repository.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Please make sure you have the correct access rights and the repository exists. </span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/vscode-git-permission-denied#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h3>
<p>https方式が失敗したのはGitHubに二段階認証を設定していた為で、ssh方式が失敗したのはGitHubに公開鍵を登録していなかった為だった。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決法">解決法<a href="https://yukun.info/blog/vscode-git-permission-denied#%E8%A7%A3%E6%B1%BA%E6%B3%95" class="hash-link" aria-label="Direct link to 解決法" title="Direct link to 解決法" translate="no">​</a></h3>
<p>下記の公式ドキュメントを参考にsshの公開鍵をGitHubに登録することでssh方式でプッシュ可能となる。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="参考サイト">参考サイト<a href="https://yukun.info/blog/vscode-git-permission-denied#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88" class="hash-link" aria-label="Direct link to 参考サイト" title="Direct link to 参考サイト" translate="no">​</a></h3>
<p><a href="https://help.github.com/en/github/authenticating-to-github/testing-your-ssh-connection" target="_blank" rel="noopener noreferrer" class="">Testing your SSH connection - GitHub Help</a></p>]]></content:encoded>
            <category>Git</category>
            <category>VS Code</category>
        </item>
        <item>
            <title><![CDATA[Kubernetes: エラー解決法 requires conntrack to be installed in root's path]]></title>
            <link>https://yukun.info/blog/kubernetes-error-conntrack</link>
            <guid>https://yukun.info/blog/kubernetes-error-conntrack</guid>
            <pubDate>Tue, 14 Apr 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Ubuntu上に Kubernetes v1.18.0のminikubeをインストールしminikube startコマンドを実行したとろ、下記のエラーが発生し、minikube startコマンドが中断。]]></description>
            <content:encoded><![CDATA[<p>Ubuntu上に Kubernetes v1.18.0のminikubeをインストールしminikube startコマンドを実行したとろ、下記のエラーが発生し、minikube startコマンドが中断。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラーメッセージ">エラーメッセージ<a href="https://yukun.info/blog/kubernetes-error-conntrack#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to エラーメッセージ" title="Direct link to エラーメッセージ" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">$ sudo minikube --driver=none start</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">😄  minikube v1.9.2 on Ubuntu 16.04 (vbox/amd64)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">✨  Using the none driver based on user configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">💣  Sorry, Kubernetes v1.18.0 requires conntrack to be installed in root's path</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決法">解決法<a href="https://yukun.info/blog/kubernetes-error-conntrack#%E8%A7%A3%E6%B1%BA%E6%B3%95" class="hash-link" aria-label="Direct link to 解決法" title="Direct link to 解決法" translate="no">​</a></h3>
<p>conntrackがインストールされていない為発生したエラー。下記コマンドでconntrackをインストールする。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">$ sudo apt install conntrack</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Reading package lists... Done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Building dependency tree</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Reading state information... Done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">The following NEW packages will be installed:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  conntrack</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Need to get 27.3 kB of archives.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">After this operation, 91.1 kB of additional disk space will be used.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 conntrack amd64 1:1.4.3-3 [27.3 kB]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Fetched 27.3 kB in 1s (25.4 kB/s)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Selecting previously unselected package conntrack.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">(Reading database ... 62970 files and directories currently installed.)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Preparing to unpack .../conntrack_1%3a1.4.3-3_amd64.deb ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Unpacking conntrack (1:1.4.3-3) ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Processing triggers for man-db (2.7.5-1) ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Setting up conntrack (1:1.4.3-3) ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$</span><br></div></code></pre></div></div>
<p>インストール後は正常にminikubeコマンドを実行できる。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> $ sudo minikube start 😄 minikube v1.9.2 on Ubuntu 16.04 (vbox/amd64) ✨ Automatically selected the docker driver 🛑 The "docker" driver should not be used with root privileges. 💡 If you are running minikube within a VM, consider using --driver=none: 📘 https://minikube.sigs.k8s.io/docs/reference/drivers/none/ vagrant@minikube:~$ sudo minikube --driver=none start 😄 minikube v1.9.2 on Ubuntu 16.04 (vbox/amd64) ✨ Using the none driver based on user configuration 👍 Starting control plane node in cluster minikube 🤹 Running on localhost (CPUs=2, Memory=1999MB, Disk=9861MB) ... ℹ️ OS release is Ubuntu 16.04.6 LTS 🐳 Preparing Kubernetes v1.18.0 on Docker 18.06.2-ce ... ❗ This bare metal machine is having trouble accessing https://k8s.gcr.io 💡 To pull new external images, you may need to configure a proxy: &gt; kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s &gt; kubeadm.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s &gt; kubelet.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s &gt; kubeadm: 37.96 MiB / 37.96 MiB [------------] 100.00% 216.61 KiB p/s 3m0s &gt; kubectl: 41.98 MiB / 41.98 MiB [------------] 100.00% 233.34 KiB p/s 3m4s &gt; kubelet: 108.01 MiB / 108.01 MiB [---------] 100.00% 408.56 KiB p/s 4m31s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">🌟 Enabling addons: default-storageclass, storage-provisioner 🤹 Configuring local host environment ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">❗ The 'none' driver is designed for experts who need to integrate with an existing VM 💡 Most users should use the newer 'docker' driver instead, which does not require root! 📘 For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">❗ kubectl and minikube configuration will be stored in /home/vagrant ❗ To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">▪ sudo mv /home/vagrant/.kube /home/vagrant/.minikube $HOME ▪ sudo chown -R $USER $HOME/.kube $HOME/.minikube</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">💡 This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true 🏄 Done! kubectl is now configured to use "minikube"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">❗ /usr/local/bin/kubectl is v1.13.4, which may be incompatible with Kubernetes v1.18.0. 💡 You can also use 'minikube kubectl -- get pods' to invoke a matching version</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ sudo kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-66bff467f8-5rwm9 1/1 Running 0 2m41s coredns-66bff467f8-kfsl4 1/1 Running 0 2m41s etcd-minikube 1/1 Running 0 2m50s kube-apiserver-minikube 1/1 Running 0 2m50s kube-controller-manager-minikube 1/1 Running 0 2m50s kube-proxy-7wnkw 1/1 Running 0 2m41s kube-scheduler-minikube 1/1 Running 0 2m50s storage-provisioner 1/1 Running 0 2m47s </span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Kubernetes</category>
        </item>
        <item>
            <title><![CDATA[VSCode: エラー解決法 ModuleNotFoundError: No module named ‘flask']]></title>
            <link>https://yukun.info/blog/vscode-flask-not-found-error</link>
            <guid>https://yukun.info/blog/vscode-flask-not-found-error</guid>
            <pubDate>Sat, 11 Apr 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Visual Studio CodeのDev Container上でPython Flaskライブラリの使用を試みたところ下記のエラーが発生しスクリプトを実行できない事象が発生。]]></description>
            <content:encoded><![CDATA[<p>Visual Studio CodeのDev Container上でPython Flaskライブラリの使用を試みたところ下記のエラーが発生しスクリプトを実行できない事象が発生。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラーメッセージ">エラーメッセージ<a href="https://yukun.info/blog/vscode-flask-not-found-error#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to エラーメッセージ" title="Direct link to エラーメッセージ" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">vscode@7a83afce1faf:/workspaces/test-vs$ pip freeze</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">click==7.1.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Flask==1.1.2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">itsdangerous==1.1.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Jinja2==2.11.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">MarkupSafe==1.1.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Werkzeug==1.0.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vscode@7a83afce1faf:/workspaces/test-vs$ /usr/bin/python3 /workspaces/test-vs/app.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Traceback (most recent call last):</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  File "/workspaces/test-vs/app.py", line 1, in &lt;module&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from flask import Flask</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ModuleNotFoundError: No module named 'flask'</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/vscode-flask-not-found-error#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h3>
<p>使用しているPythonインタプリターのPATHが誤っていた為。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">vscode@7a83afce1faf:/workspaces/test-vs$ which python</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/usr/local/bin/python</span><br></div></code></pre></div></div>
<p>上記の通り、Pythonコンテナ上のデフォルトパスは/usr/local/bin/pythonだが、エラー発生の指定インタプリタは/usr/bin/python3と相違。原因はVSCodeのローカル環境で一度Pythonインタプリタの設定をした際にsettings.jsonにパス設定をしてしまった為。</p>
<div class="language-javascript codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-javascript codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"python.pythonPath"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/usr/bin/python3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決法">解決法<a href="https://yukun.info/blog/vscode-flask-not-found-error#%E8%A7%A3%E6%B1%BA%E6%B3%95" class="hash-link" aria-label="Direct link to 解決法" title="Direct link to 解決法" translate="no">​</a></h3>
<p>上記のsettings.jsonのpython.pythonPath行をコメントアウトすればデフォルトのパスを参照するようになる。また、明示的に以下の通り指定しても良い。</p>
<div class="language-javascript codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-javascript codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"python.pythonPath"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/usr/local/bin/python3.8"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//"python.pythonPath": "/usr/bin/python3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="再実行結果">再実行結果<a href="https://yukun.info/blog/vscode-flask-not-found-error#%E5%86%8D%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C" class="hash-link" aria-label="Direct link to 再実行結果" title="Direct link to 再実行結果" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">vscode@7a83afce1faf:/workspaces/test-vs$ /usr/local/bin/python3.8 /workspaces/test-vs/app.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> * Serving Flask app "app" (lazy loading)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> * Environment: production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   WARNING: This is a development server. Do not use it in a production deployment.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Use a production WSGI server instead.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> * Debug mode: off</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> * Running on  (Press CTRL+C to quit)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">127.0.0.1 - - [11/Apr/2020 13:24:20] "GET / HTTP/1.1" 200 -</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="ソースコード">ソースコード<a href="https://yukun.info/blog/vscode-flask-not-found-error#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89" class="hash-link" aria-label="Direct link to ソースコード" title="Direct link to ソースコード" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-python codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> flask </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Flask app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Flask</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__name__</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">route</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">hello_world</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello World!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__</span><span class="token operator" style="color:#393A34">==</span><span class="token string" style="color:#e3116c">'__main__'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Flask</category>
            <category>Python</category>
            <category>VS Code</category>
        </item>
        <item>
            <title><![CDATA[Django: CentOS上でのmysqlclientインストールエラーの解決法]]></title>
            <link>https://yukun.info/blog/django-centos-mysqlclient-error</link>
            <guid>https://yukun.info/blog/django-centos-mysqlclient-error</guid>
            <pubDate>Wed, 12 Feb 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[開発環境(Mac)ではインストールできたmysqlclientだが、いざ本番のCentOSサーバへDjangoアプリをデプロイの上、pip install -r requirements.txt でライブラリのインストールを試みたところ、依存ライブラリ・パッケージが不足しており下記のエラーが発生。インストール異常終了した為、解決法を後述に記載する。]]></description>
            <content:encoded><![CDATA[<p><a class="" href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina">開発環境(Mac)ではインストールできたmysqlclient</a>だが、いざ本番のCentOSサーバへDjangoアプリをデプロイの上、pip install -r requirements.txt でライブラリのインストールを試みたところ、依存ライブラリ・パッケージが不足しており下記のエラーが発生。インストール異常終了した為、解決法を後述に記載する。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラー事象-例1">エラー事象 (例1)<a href="https://yukun.info/blog/django-centos-mysqlclient-error#%E3%82%A8%E3%83%A9%E3%83%BC%E4%BA%8B%E8%B1%A1-%E4%BE%8B1" class="hash-link" aria-label="Direct link to エラー事象 (例1)" title="Direct link to エラー事象 (例1)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">ERROR: Command errored out with exit status 1:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> command: /usr/bin/python3.6 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-q0i5354t/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-q0i5354t/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-q0i5354t/mysqlclient/pip-egg-info</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     cwd: /tmp/pip-install-q0i5354t/mysqlclient/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Complete output (12 lines):</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/bin/sh: mysql_config: command not found</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/bin/sh: mariadb_config: command not found</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/bin/sh: mysql_config: command not found</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Traceback (most recent call last):</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  File "&lt;string&gt;", line 1, in &lt;module&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  File "/tmp/pip-install-q0i5354t/mysqlclient/setup.py", line 16, in &lt;module&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    metadata, options = get_config()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  File "/tmp/pip-install-q0i5354t/mysqlclient/setup_posix.py", line 61, in get_config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    libs = mysql_config("libs")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  File "/tmp/pip-install-q0i5354t/mysqlclient/setup_posix.py", line 29, in mysql_config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    raise EnvironmentError("%s not found" % (_mysql_config_path,))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">OSError: mysql_config not found</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">----------------------------------------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="エラー事象-例2">エラー事象 (例2)<a href="https://yukun.info/blog/django-centos-mysqlclient-error#%E3%82%A8%E3%83%A9%E3%83%BC%E4%BA%8B%E8%B1%A1-%E4%BE%8B2" class="hash-link" aria-label="Direct link to エラー事象 (例2)" title="Direct link to エラー事象 (例2)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">Installing collected packages: asgiref, asn1crypto, base58, certifi, pycparser, cffi, chardet, six, cryptography, defusedxml, sqlparse, pytz, Django, python3-openid, idna, urllib3, requests, oauthlib, requests-oauthlib, django-allauth, django-cleanup, django-environ, django-filter, djangorestframework, djangorestframework-filters, ecdsa, gunicorn, mysqlclient, pyparsing, packaging, pip-review</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     Running setup.py install for pycparser … done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     Running setup.py install for django-allauth … done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     Running setup.py install for mysqlclient … error</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     ERROR: Command errored out with exit status 1:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      command: /srv/cq4/venv/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-1a2tgg59/mysqlclient/setup.py'"'"'; file='"'"'/tmp/pip-install-1a2tgg59/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-ijt7h4i7/install-record.txt --single-version-externally-managed --compile --install-headers /srv/cq4/venv/include/site/python3.6/mysqlclient</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          cwd: /tmp/pip-install-1a2tgg59/mysqlclient/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     Complete output (30 lines):</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     running install</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     running build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     running build_py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     creating build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     creating build/lib.linux-x86_64-3.6</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     creating build/lib.linux-x86_64-3.6/MySQLdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     copying MySQLdb/init.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     copying MySQLdb/exceptions.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb     copying MySQLdb/compat.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb     copying MySQLdb/connections.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb     copying MySQLdb/converters.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb     copying MySQLdb/cursors.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb     copying MySQLdb/release.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb     copying MySQLdb/times.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb     creating build/lib.linux-x86_64-3.6/MySQLdb/constants     copying MySQLdb/constants/init.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb/constants     copying MySQLdb/constants/CLIENT.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb/constants     copying MySQLdb/constants/CR.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb/constants     copying MySQLdb/constants/ER.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb/constants     copying MySQLdb/constants/FIELD_TYPE.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb/constants     copying MySQLdb/constants/FLAG.py -&amp;gt; build/lib.linux-x86_64-3.6/MySQLdb/constants     running build_ext     building 'MySQLdb._mysql' extension     creating build/temp.linux-x86_64-3.6     creating build/temp.linux-x86_64-3.6/MySQLdb     gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -Dversion_info=(1,4,6,'final',0) -D__version_=1.4.6 -I/usr/include/mysql -I/usr/include/mysql/mysql -I/srv/cq4/venv/include -I/usr/include/python3.6m -c MySQLdb/_mysql.c -o build/temp.linux-x86_64-3.6/MySQLdb/_mysql.o</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     gcc -pthread -shared -Wl,-z,relro build/temp.linux-x86_64-3.6/MySQLdb/_mysql.o -L/usr/lib64/ -L/usr/lib64 -lmariadb -lpython3.6m -o build/lib.linux-x86_64-3.6/MySQLdb/_mysql.cpython-36m-x86_64-linux-gnu.so</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     /usr/bin/ld: cannot find -lmariadb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     collect2: error: ld returned 1 exit status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     error: command 'gcc' failed with exit status 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     ----------------------------------------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ERROR: Command errored out with exit status 1: /srv/cq4/venv/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-1a2tgg59/mysqlclient/setup.py'"'"'; file='"'"'/tmp/pip-install-1a2tgg59/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-ijt7h4i7/install-record.txt --single-version-externally-managed --compile --install-headers /srv/cq4/venv/include/site/python3.6/mysqlclient Check the logs for full command output.</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="発生環境">発生環境<a href="https://yukun.info/blog/django-centos-mysqlclient-error#%E7%99%BA%E7%94%9F%E7%92%B0%E5%A2%83" class="hash-link" aria-label="Direct link to 発生環境" title="Direct link to 発生環境" translate="no">​</a></h3>
<p>CentOS 7.7.1908, Python 3.6.8, pip 20.0.2</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決方法">解決方法<a href="https://yukun.info/blog/django-centos-mysqlclient-error#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95" class="hash-link" aria-label="Direct link to 解決方法" title="Direct link to 解決方法" translate="no">​</a></h3>
<p>下記のパッケージをインストール後に改めてpipを実行することで解消。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">yum install epel-release</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">yum install python-devel mysql-community-devel</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">yum install --enablerepo=epel,  python36 python36-devel</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">yum install gcc MariaDB-server MariaDB-devel MariaDB-shared openssl-devel zlib-devel libssl-dev</span><br></div></code></pre></div></div>
<p>もし既にIUSリポジトリのPython36uパッケージがインストールされている場合は以下の操作でパッケージを削除後に上記のコマンドを打鍵する。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">yum remove Python36u</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rm -fr /usr/lib/python3.6</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vim /etc/yum.repos.d/ius.repo →　enabled=0へ変更</span><br></div></code></pre></div></div>
<p>今回の発生環境ではIUSリポジトリのPythonでは何故か上手く行かず、EPELリポジトリのPython36パッケージはエラーなく処理が推移。</p>]]></content:encoded>
            <category>CentOS</category>
            <category>Django</category>
            <category>MariaDB</category>
            <category>MySQL</category>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Python: macOS (Catalina)でのpip install mysqlclient エラーの解決法]]></title>
            <link>https://yukun.info/blog/python-pip-install-mysqlclient-catalina</link>
            <guid>https://yukun.info/blog/python-pip-install-mysqlclient-catalina</guid>
            <pubDate>Wed, 25 Dec 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[先日開発環境であるmacOSをCatalinaへアップグレード後にPyCharmでDjango環境の再構築を試みたところ、mysqlclientライブラリのインストールで下記のエラーが発生。]]></description>
            <content:encoded><![CDATA[<p>先日開発環境であるmacOSをCatalinaへアップグレード後にPyCharmでDjango環境の再構築を試みたところ、mysqlclientライブラリのインストールで下記のエラーが発生。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="事象-エラーメッセージ">事象 (エラーメッセージ)<a href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina#%E4%BA%8B%E8%B1%A1-%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8" class="hash-link" aria-label="Direct link to 事象 (エラーメッセージ)" title="Direct link to 事象 (エラーメッセージ)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> Collecting mysqlclient==1.4.6 Using cached https://files.pythonhosted.org/packages/d0/97/7326248ac8d5049968bf4ec708a5d3d4806e412a42e74160d7f266a3e03a/mysqlclient-1.4.6.tar.gz Installing collected packages: mysqlclient Running setup.py install for mysqlclient: started Running setup.py install for mysqlclient: finished with status 'error'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ERROR: Command errored out with exit status 1: command: /Users/yu/PycharmProjects/sskcoin/venv/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/b5/cl371z9s20bdmwtprsx2nn6h0000gn/T/pycharm-packaging/mysqlclient/setup.py'"'"'; __file__='"'"'/private/var/folders/b5/cl371z9s20bdmwtprsx2nn6h0000gn/T/pycharm-packaging/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/b5/cl371z9s20bdmwtprsx2nn6h0000gn/T/pip-record-8kd13qk4/install-record.txt --single-version-externally-managed --compile --install-headers /Users/yu/PycharmProjects/sskcoin/venv/include/site/python3.8/mysqlclient cwd: /private/var/folders/b5/cl371z9s20bdmwtprsx2nn6h0000gn/T/pycharm-packaging/mysqlclient/ Complete output (32 lines): running install running build running build_py creating build creating build/lib.macosx-10.9-x86_64-3.8 creating build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/__init__.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/_exceptions.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/compat.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/connections.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/converters.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/cursors.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/release.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb copying MySQLdb/times.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb creating build/lib.macosx-10.9-x86_64-3.8/MySQLdb/constants copying MySQLdb/constants/__init__.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb/constants copying MySQLdb/constants/CLIENT.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb/constants copying MySQLdb/constants/CR.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb/constants copying MySQLdb/constants/ER.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb/constants copying MySQLdb/constants/FIELD_TYPE.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb/constants copying MySQLdb/constants/FLAG.py -&gt; build/lib.macosx-10.9-x86_64-3.8/MySQLdb/constants warning: build_py: byte-compiling is disabled, skipping. running build_ext building 'MySQLdb._mysql' extension creating build/temp.macosx-10.9-x86_64-3.8 creating build/temp.macosx-10.9-x86_64-3.8/MySQLdb gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch x86_64 -g -Dversion_info=(1,4,6,'final',0) -D__version__=1.4.6 -I/usr/local/Cellar/mysql/8.0.18_1/include/mysql -I/Users/yu/PycharmProjects/sskcoin/venv/include -I/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8 -c MySQLdb/_mysql.c -o build/temp.macosx-10.9-x86_64-3.8/MySQLdb/_mysql.o gcc -bundle -undefined dynamic_lookup -arch x86_64 -g build/temp.macosx-10.9-x86_64-3.8/MySQLdb/_mysql.o -L/usr/local/Cellar/mysql/8.0.18_1/lib -lmysqlclient -lssl -lcrypto -o build/lib.macosx-10.9-x86_64-3.8/MySQLdb/_mysql.cpython-38-darwin.so ld: library not found for -lssl clang: error: linker command failed with exit code 1 (use -v to see invocation) error: command 'gcc' failed with exit status 1 ---------------------------------------- ERROR: Command errored out with exit status 1: /Users/yu/PycharmProjects/sskcoin/venv/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/b5/cl371z9s20bdmwtprsx2nn6h0000gn/T/pycharm-packaging/mysqlclient/setup.py'"'"'; __file__='"'"'/private/var/folders/b5/cl371z9s20bdmwtprsx2nn6h0000gn/T/pycharm-packaging/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/b5/cl371z9s20bdmwtprsx2nn6h0000gn/T/pip-record-8kd13qk4/install-record.txt --single-version-externally-managed --compile --install-headers /Users/yu/PycharmProjects/sskcoin/venv/include/site/python3.8/mysqlclient Check the logs for full command output. </span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="発生環境">発生環境<a href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina#%E7%99%BA%E7%94%9F%E7%92%B0%E5%A2%83" class="hash-link" aria-label="Direct link to 発生環境" title="Direct link to 発生環境" translate="no">​</a></h3>
<p>macOS 10.15.2, PyCharm 2019.3, Python 3.8.1, pip 19.3.1, mysqlclient 1.4.6</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h3>
<ul>
<li class="">Command Line Tools for Xcodeが未インストール</li>
<li class="">mysqlクライアントが未インストール</li>
<li class="">OpenSSLライブラリの環境変数が未設定</li>
</ul>
<p>アップグレード前はCommand Line Toolsやmysqlクライアント等をインストールした筈なのだが。(過去記事)→<a class="" href="https://yukun.info/blog/pip-install-mysqlclient-error">Django: macOSでのpip install mysqlclient エラーの解決法</a></p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決方法">解決方法<a href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95" class="hash-link" aria-label="Direct link to 解決方法" title="Direct link to 解決方法" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_krSy" id="command-line-tools-for-xcodeのインストール">Command Line Tools for Xcodeのインストール<a href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina#command-line-tools-for-xcode%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="Direct link to Command Line Tools for Xcodeのインストール" title="Direct link to Command Line Tools for Xcodeのインストール" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">xcode-select --install</span><br></div></code></pre></div></div>
<p>コマンド実行後に下記のプロンプトが表示されるので、installボタンを押下。</p>
<p><img decoding="async" loading="lazy" alt="xcode_command_line_tools" src="https://yukun.info/assets/images/xcode_command_line_tools-ec9cdbe7d47f9b3cb99c8153d2ed7af1.png" width="461" height="190" class="img_Q36t"></p>
<p>時期によってはSoftware Updateでtoolsのupdate通知があるので最新版までアップデートしておく。</p>
<p><img decoding="async" loading="lazy" src="https://yukun.info/assets/images/xcode_command_line_tools_update-fb9d0d763dfcd769b078dce738975bc6.png" width="668" height="234" class="img_Q36t"></p>
<h4 class="anchor anchorTargetStickyNavbar_krSy" id="mysqlクライアントのインストール">mysqlクライアントのインストール<a href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina#mysql%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="Direct link to mysqlクライアントのインストール" title="Direct link to mysqlクライアントのインストール" translate="no">​</a></h4>
<p>brewコマンドでインストールを行う。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> % brew install mysql ==&gt; Installing dependencies for mysql: protobuf@3.7 ==&gt; Installing mysql dependency: protobuf@3.7 ==&gt; Downloading https://homebrew.bintray.com/bottles/protobuf@3.7-3.7.1_1.mojave.bottle.tar.gz ==&gt; Downloading from ######################################################################## 100.0% ==&gt; Pouring protobuf@3.7-3.7.1_1.mojave.bottle.tar.gz ==&gt; Caveats protobuf@3.7 is keg-only, which means it was not symlinked into /usr/local, because this is an alternate version of another formula.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">If you need to have protobuf@3.7 first in your PATH run: echo 'export PATH="/usr/local/opt/protobuf@3.7/bin:$PATH"' &gt;&gt; ~/.zshrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">For compilers to find protobuf@3.7 you may need to set: export LDFLAGS="-L/usr/local/opt/protobuf@3.7/lib" export CPPFLAGS="-I/usr/local/opt/protobuf@3.7/include"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">For pkg-config to find protobuf@3.7 you may need to set: export PKG_CONFIG_PATH="/usr/local/opt/protobuf@3.7/lib/pkgconfig"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">\==&gt; Summary 🍺 /usr/local/Cellar/protobuf@3.7/3.7.1_1: 264 files, 18.5MB ==&gt; Installing mysql ==&gt; Downloading https://homebrew.bintray.com/bottles/mysql-8.0.18_1.catalina.bottle.1.tar.gz ==&gt; Downloading from ######################################################################## 100.0% ==&gt; Pouring mysql-8.0.18_1.catalina.bottle.1.tar.gz ==&gt; Caveats We've installed your MySQL database without a root password. To secure it run: mysql_secure_installation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">MySQL is configured to only allow connections from localhost by default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">To connect run: mysql -uroot</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">To have launchd start mysql now and restart at login: brew services start mysql Or, if you don't want/need a background service you can just run: mysql.server start ==&gt; Summary 🍺 /usr/local/Cellar/mysql/8.0.18_1: 287 files, 278.6MB ==&gt; Caveats ==&gt; protobuf@3.7 protobuf@3.7 is keg-only, which means it was not symlinked into /usr/local, because this is an alternate version of another formula.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">If you need to have protobuf@3.7 first in your PATH run: echo 'export PATH="/usr/local/opt/protobuf@3.7/bin:$PATH"' &gt;&gt; ~/.zshrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">For compilers to find protobuf@3.7 you may need to set: export LDFLAGS="-L/usr/local/opt/protobuf@3.7/lib" export CPPFLAGS="-I/usr/local/opt/protobuf@3.7/include"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">For pkg-config to find protobuf@3.7 you may need to set: export PKG_CONFIG_PATH="/usr/local/opt/protobuf@3.7/lib/pkgconfig"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">\==&gt; mysql We've installed your MySQL database without a root password. To secure it run: mysql_secure_installation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">MySQL is configured to only allow connections from localhost by default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">To connect run: mysql -uroot</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">To have launchd start mysql now and restart at login: brew services start mysql Or, if you don't want/need a background service you can just run: mysql.server start </span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_krSy" id="opensslライブラリの環境変数の設定">OpenSSLライブラリの環境変数の設定<a href="https://yukun.info/blog/python-pip-install-mysqlclient-catalina#openssl%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="Direct link to OpenSSLライブラリの環境変数の設定" title="Direct link to OpenSSLライブラリの環境変数の設定" translate="no">​</a></h4>
<p>先ずは環境変数の確認を行う。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> % brew info openssl openssl@1.1: stable 1.1.1d (bottled) [keg-only] Cryptography and SSL/TLS Toolkit https://openssl.org/ /usr/local/Cellar/openssl@1.1/1.1.1d (7,983 files, 17.9MB) Poured from bottle on 2019-11-01 at 19:51:33 From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/openssl@1.1.rb ==&gt; Caveats A CA file has been bootstrapped using certificates from the system keychain. To add additional certificates, place .pem files in /usr/local/etc/openssl@1.1/certs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">and run /usr/local/opt/openssl@1.1/bin/c_rehash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">openssl@1.1 is keg-only, which means it was not symlinked into /usr/local, because openssl/libressl is provided by macOS so don't link an incompatible version.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">If you need to have openssl@1.1 first in your PATH run: echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' &gt;&gt; ~/.zshrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">For compilers to find openssl@1.1 you may need to set: export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">For pkg-config to find openssl@1.1 you may need to set: export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">\==&gt; Analytics install: 478,952 (30 days), 1,627,695 (90 days), 2,653,948 (365 days) install-on-request: 83,221 (30 days), 166,771 (90 days), 458,497 (365 days) build-error: 0 (30 days) </span><br></div></code></pre></div></div>
<p>後は環境変数を設定の上、pipコマンドでインストールすることで本事象は解消する。PyCharmを使用している場合はメニューからPyCharm → Preferences → Tools → Terminal画面のProject settings → Environment Variables欄でプロジェクト用の環境変数を設定できるので、設定しておくと毎度のexportコマンド実行を省ける。</p>
<p><img decoding="async" loading="lazy" alt="pycharm_environment_variables_setting" src="https://yukun.info/assets/images/pycharm_env_setting-4a21e0a53d14709f84b8848bda675d4f.png" width="700" height="511" class="img_Q36t"></p>
<p>設定後はPyCharmを再起動することで、環境変数を読み込んだ状態でTerminal操作が可能となる。試しに変数の設定状態を書くにしたい場合はechoコマンドを用いる。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">(venv) % echo $LDFLAGS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-L/usr/local/opt/openssl@1.1/lib</span><br></div></code></pre></div></div>
<p>最後にpipコマンドでmysqlclientをインストールする。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">(venv) % pip install mysqlclient</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Collecting mysqlclient</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Using cached https://files.pythonhosted.org/packages/d0/97/7326248ac8d5049968bf4ec708a5d3d4806e412a42e74160d7f266a3e03a/mysqlclient-1.4.6.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Installing collected packages: mysqlclient</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Running setup.py install for mysqlclient ... done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Successfully installed mysqlclient-1.4.6</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Django</category>
            <category>Mac</category>
            <category>MariaDB</category>
            <category>MySQL</category>
            <category>PyCharm</category>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Mac OS Mail: アカウント登録時の"Unable to verify account name or password"エラーの解決法]]></title>
            <link>https://yukun.info/blog/mac-mail-account-register-error</link>
            <guid>https://yukun.info/blog/mac-mail-account-register-error</guid>
            <pubDate>Thu, 19 Dec 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[CentOS 上にDovecotを用いてIMAP / IMAPSサーバーを構築後にMacOSの標準メールソフト(Mail)よりアカウント登録を試みたところ、下記のエラーが発生しアカウント登録に失敗、及びメールの受信が不可となった。]]></description>
            <content:encoded><![CDATA[<p>CentOS 上にDovecotを用いてIMAP / IMAPSサーバーを構築後にMacOSの標準メールソフト(Mail)よりアカウント登録を試みたところ、下記のエラーが発生しアカウント登録に失敗、及びメールの受信が不可となった。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="事象">事象<a href="https://yukun.info/blog/mac-mail-account-register-error#%E4%BA%8B%E8%B1%A1" class="hash-link" aria-label="Direct link to 事象" title="Direct link to 事象" translate="no">​</a></h3>
<p>下図のEmail Address, Mail Server欄は伏せている。エラーメッセージは"Unable to verify account name or password."。</p>
<p><img decoding="async" loading="lazy" alt="mac_email_register_error" src="https://yukun.info/assets/images/mac_email_register_error-d5672392ccc849355b1a60f7aec657ad.png" width="700" height="683" class="img_Q36t"></p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="原因">原因<a href="https://yukun.info/blog/mac-mail-account-register-error#%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="Direct link to 原因" title="Direct link to 原因" translate="no">​</a></h3>
<p>サーバー上の/var/log/maillogを確認したところ、以下の通りuser欄が指定されていなかった為(user=&lt;&gt;)。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">Dec 16 19:53:03 ht2-100-11111 dovecot: imap-login: </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Aborted login (no auth attempts in 1 secs): user=&lt;&gt;, </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rip=xxx.xx.xxx.xxx, lip=yyy.yy.yyy.yy, TLS, session=&lt;O7sEBNHRSGejMctw&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="解決策">解決策<a href="https://yukun.info/blog/mac-mail-account-register-error#%E8%A7%A3%E6%B1%BA%E7%AD%96" class="hash-link" aria-label="Direct link to 解決策" title="Direct link to 解決策" translate="no">​</a></h3>
<p>Accounts登録画面上のUser NameはMail上だとOptionalだが、Dovecotとしては必須のパラメーターの為、明示的に設定(emailアドレス)することで事象解消する。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">Dec 16 19:53:03 ht2-100-11111 dovecot: imap-login: </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Login: user=&lt;mail@example.com&gt;, method=CRAM-MD5, </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rip=xxx.xx.xxx.xxx, lip=yyy.yy.yyy.yy, mpid=481, TLS, session=&lt;Zu0MgasCZoijMctw&gt;</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Dovecot</category>
            <category>Email</category>
            <category>Linux</category>
            <category>Mac</category>
        </item>
        <item>
            <title><![CDATA[Postfix, Dovecot用の複数ドメイン[マルチドメイン]TLS証明書の取得(同一IPアドレス)]]></title>
            <link>https://yukun.info/blog/multi-domain-tls-certbot</link>
            <guid>https://yukun.info/blog/multi-domain-tls-certbot</guid>
            <pubDate>Tue, 17 Dec 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[1つの仮想OS上で複数ドメインに対応した送受信メールサーバの構築の為、PostfixとDovecotのTLS設定周りを確認したのだが、設定できる証明書は1ファイルのみで複数の指定は現時点不可。今回は複数ドメイン(e.g. example.com, fxample.net等)を1ファイルまとめた証明書を作成することで対応する為(※)、Open CAであるLet's Encryptのクライアントソフトウェア(certbot)を用いて証明書を取得する手順を紹介する。 ※証明書に別ドメインが内包される点を許容できない場合は記事末尾の参考サイトをご参照。]]></description>
            <content:encoded><![CDATA[<p>1つの仮想OS上で複数ドメインに対応した送受信メールサーバの構築の為、PostfixとDovecotのTLS設定周りを確認したのだが、設定できる証明書は1ファイルのみで複数の指定は現時点不可。今回は複数ドメイン(e.g. example.com, fxample.net等)を1ファイルまとめた証明書を作成することで対応する為(※)、Open CAであるLet's Encryptのクライアントソフトウェア(certbot)を用いて証明書を取得する手順を紹介する。 ※証明書に別ドメインが内包される点を許容できない場合は記事末尾の参考サイトをご参照。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="実行環境">実行環境<a href="https://yukun.info/blog/multi-domain-tls-certbot#%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83" class="hash-link" aria-label="Direct link to 実行環境" title="Direct link to 実行環境" translate="no">​</a></h3>
<p>CentOS 7, certbot 0.39.0, Postfix 3.4.7, Dovecot 2.2.36</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="マルチドメイン内包のtls証明書の取得コマンド">マルチドメイン内包のTLS証明書の取得コマンド<a href="https://yukun.info/blog/multi-domain-tls-certbot#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%86%85%E5%8C%85%E3%81%AEtls%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E5%8F%96%E5%BE%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89" class="hash-link" aria-label="Direct link to マルチドメイン内包のTLS証明書の取得コマンド" title="Direct link to マルチドメイン内包のTLS証明書の取得コマンド" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> # certbot certonly --webroot -w /srv/wordpress -d mail.example.com -w /srv/html -d mail.fxample.net -w /srv/shop -d mail.gxample.info Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Obtaining a new certificate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/mail.example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/mail.example.com/privkey.pem Your cert will expire on 2020-03-14. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le </span><br></div></code></pre></div></div>
<p>(ご参考) 認証に用いるWebサーバ(Nginx)側の設定については下記リンクに記載している。 <a class="" href="https://yukun.info/blog/nginx-lets-encrypt-certificate-update">Nginx: Let’s EncryptのTLS/SSL証明書の更新方法(手動)</a></p>
<p>証明書の保管先フォルダドメイン名は最初に指定したドメイン名となる。後は当該ファイルはPostfix、Dovecotのconfファイルへ指定し関連設定を行う。</p>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="postfix---etcpostfixmaincf">Postfix - /etc/postfix/main.cf<a href="https://yukun.info/blog/multi-domain-tls-certbot#postfix---etcpostfixmaincf" class="hash-link" aria-label="Direct link to Postfix - /etc/postfix/main.cf" title="Direct link to Postfix - /etc/postfix/main.cf" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="dovecot---etcdovecotconfd10-sslconf">Dovecot - /etc/dovecot/conf.d/10-ssl.conf<a href="https://yukun.info/blog/multi-domain-tls-certbot#dovecot---etcdovecotconfd10-sslconf" class="hash-link" aria-label="Direct link to Dovecot - /etc/dovecot/conf.d/10-ssl.conf" title="Direct link to Dovecot - /etc/dovecot/conf.d/10-ssl.conf" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">ssl_cert = &amp;lt;/etc/letsencrypt/live/mail.example.com/fullchain.pem</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ssl_key = &amp;lt;/etc/letsencrypt/live/mail.example.com/privkey.pem</span><br></div></code></pre></div></div>
<p>Postfix, Dovecot全般の設定については今後別途記事でまとめる予定。</p>
<p><strong>追記(2020-04-19)：</strong> 上記の設定だと、Mac Mailクライアントを用いた場合は下記のエラーメッセージがdovecotログに出力され、クライアント側でメール受信ができない事象が発生。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain">Mar 14 18:53:58 tk2-123-45678 dovecot: imap-login: Aborted login (no auth attempts in 0 secs): user=&amp;lt;&amp;gt;, rip=192.168.2.1, lip=192.168.2.2, TLS, session=&amp;lt;DJ+hkfsagVK7SirDy&amp;gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Mar 14 18:53:59 tk2-123-45678 dovecot: imap-login: Disconnected (no auth attempts in 1 secs): user=&amp;lt;&amp;gt;, rip=192.168.2.1, lip=192.168.2.2, TLS, session=&amp;lt;G/OkkM2gsaSirDy&amp;gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Mar 14 18:54:00 tk2-123-45678 dovecot: imap-login: Login: user=&amp;lt;email@example.com&amp;gt;, method=CRAM-MD5, rip=192.168.2.1, lip=192.168.2.2, mpid=30131, TLS, session=&amp;lt;Grq5kMgafeeSirDy&amp;gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Mar 14 18:54:22 tk2-123-45678 dovecot: imap-login: Disconnected (no auth attempts in 0 secs): user=&amp;lt;&amp;gt;, rip=192.168.2.1, lip=192.168.2.2, TLS handshaking: SSL_accept() failed: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown: SSL alert number 46, session=&amp;lt;F2sfasg6vjSirDy&amp;gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">・・・以下同メッセージが出力され続ける。</span><br></div></code></pre></div></div>
<p>解決法は各ドメイン用のSSL証明書を個別に取得の上、10-ssl.confファイルの設定を以下の通り修正する。local_nameディレクティブでドメイン毎に使用する証明書の設定が可能。</p>
<div class="language-bash codeBlockContainer_el9n theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_eKS9"><pre tabindex="0" class="prism-code language-bash codeBlock_u0S5 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_cEmh"><div class="token-line" style="color:#393A34"><span class="token plain"> ssl_cert = &lt;/etc/letsencrypt/live/mail.example.com/fullchain.pem ssl_key = &lt;/etc/letsencrypt/live/mail.example.com/privkey.pem</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">local_name example.com { ssl_cert = &lt;/etc/letsencrypt/live/example.com/fullchain.pem ssl_key = &lt;/etc/letsencrypt/live/example.com/privkey.pem } local_name fxample.net { ssl_cert = &lt;/etc/letsencrypt/live/fxample.net/fullchain.pem ssl_key = &lt;//etc/letsencrypt/live/fxample.net/privkey.pem } </span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_krSy" id="参考サイト">参考サイト<a href="https://yukun.info/blog/multi-domain-tls-certbot#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88" class="hash-link" aria-label="Direct link to 参考サイト" title="Direct link to 参考サイト" translate="no">​</a></h3>
<ul>
<li class="">
<p><a href="https://lxadm.com/Postfix_and_multiple_SSL_certificates" target="_blank" rel="noopener noreferrer" class="">Postfix and multiple SSL certificates - lxadm | Linux administration tips, tutorials, HOWTOs and articles</a> master.cf側でinterface IP毎にTLS証明書を指定する方法。この方法を採るのであれば複数ドメインを1ファイルにまとめる必要もないが、グローバルIPが潤沢にない場合、かつ2019.12時点のversionでは上記の方法にならざる負えない。数年前と異なり、TLS証明書の取得についてはLet's Encryptで無料で手に入る環境が出来たことは良い点。</p>
</li>
<li class="">
<p><a href="https://free-ssl.jp/usage/#ExecClientSoftware" target="_blank" rel="noopener noreferrer" class="">Let's Encrypt の使い方 - Let's Encrypt 総合ポータル</a></p>
</li>
<li class="">
<p><a href="https://rms.ne.jp/sslserver/install/install_dovecot-html/" target="_blank" rel="noopener noreferrer" class="">SSLサーバ証明書 : dovecotサーバ証明書のインストール方法 | DigiCert</a></p>
</li>
</ul>]]></content:encoded>
            <category>CentOS</category>
            <category>Certification</category>
            <category>Dovecot</category>
            <category>Email</category>
            <category>Linux</category>
            <category>Postfix</category>
            <category>TLS</category>
        </item>
    </channel>
</rss>