tag:crieit.net,2005:https://crieit.net/users/keyangu/feed keyanguの投稿 - Crieit Crieitでユーザーkeyanguによる最近の投稿 2021-03-15T10:16:12+09:00 https://crieit.net/users/keyangu/feed tag:crieit.net,2005:PublicArticle/16748 2021-03-15T10:16:12+09:00 2021-03-15T10:16:12+09:00 https://crieit.net/posts/Visual-Studio-2019-Git-push Visual Studio 2019 で Git のリモートリポジトリに push できない <p>Visual Studio 2019 でコード修正して Git Push しようとすると、<br /> <code>C:/WINDOWS/System32/OpenSSH/ssh.exe: No such file or directory</code><br /> と言われて Push できない。</p> <p>解決策を調べたらまんま同じのがあった。<br /> <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/64932199/error-running-ssh-exe-when-pushing-a-git-repo-from-visual-studio">https://stackoverflow.com/questions/64932199/error-running-ssh-exe-when-pushing-a-git-repo-from-visual-studio</a></p> <p>どうやら、VS2019 は git の <code>core.sshCommand</code> という設定に従って ssh クライアントを使おうとするのだが、これのデフォルトが 32bit のもので良くないらしい。</p> <p>なので、git のインストール先にある ssh.exe を使うように設定を変えれば良いと。<br /> <code>git config --global core.sshCommand "\"C:\Program Files\Git\usr\bin\ssh.exe\""</code></p> <p>グローバル設定を変えるのが嫌なら、適切に <code>.gitconfig</code> ファイルを使って設定するとよい。</p> keyangu tag:crieit.net,2005:PublicArticle/16587 2021-01-13T15:45:49+09:00 2021-01-13T18:21:58+09:00 https://crieit.net/posts/2021-1-13 nginx + uWSGI + Flask で python webアプリを立ち上げる <h1 id="nginx + uWSGI + Flask で python webアプリを立ち上げる"><a href="#nginx+%2B+uWSGI+%2B+Flask+%E3%81%A7+python+web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B">nginx + uWSGI + Flask で python webアプリを立ち上げる</a></h1> <p>開発中は Flask の dev server で良いのだけれど、リリース時にはフロントのHTTPサーバを用意する必要がある。</p> <p>Deployment は選択肢がいくつかあるけれど、今回はUbuntu上で、HTTPサーバに nginx、Flaskで作ったPython Webアプリを動かす WSGIコンテナに uWSGI を使った構成の設定例。</p> <h2 id="インストール"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">インストール</a></h2> <p>nginx, uwsgi, Flask をインストールする。uwsgi と Flask は venv 環境で。</p> <pre><code class="shell">$ uname -a Linux hoge-machine 5.4.0-52-generic #57~18.04.1-Ubuntu SMP Thu Oct 15 14:04:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux $ sudo apt install nginx $ python3 -V Python 3.6.9 $ mkdir venv; cd venv $ python3 -m venv flaskapp $ source ~/venv/flaskapp/bin/activate (flaskapp) $ pip install -U pip (flaskapp) $ pip install flask uwsgi </code></pre> <h2 id="nginx の設定ファイル"><a href="#nginx+%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB">nginx の設定ファイル</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://flask.palletsprojects.com/en/1.1.x/deploying/uwsgi/#configuring-nginx">https://flask.palletsprojects.com/en/1.1.x/deploying/uwsgi/#configuring-nginx</a></p> <p>flask で uwsgi を使う場合の nginx 設定ファイル例は上に載っているので、それを参考に。<br /> アプリ名を <code>nginx_yourapp</code> とか <code>your_application</code> とかにしているが適当に変える。</p> <p>nginx_yourapp.conf</p> <pre><code class="conf">server { listen 80; listen [::]:80; server_name hoge-machine.com; root /var/www/example.com; index index.html; location = /your_application { rewrite ^ /your_application/; } location /your_application { try_files $uri @your_application; } location @your_application { include uwsgi_params; uwsgi_pass unix:/tmp/your_application.sock; } } </code></pre> <p>nginx の設定ファイルは <code>/etc/nginx/sites-available</code> 下に置いて、<code>/etc/nginx/sites-enabled</code> 下に<br /> シンボリックリンクを張り、サービス再起動する。Permission 関係はよしなに。</p> <pre><code class="shell">$ mkdir -p ~/path/to/nginx_yourapp; cd ~/path/to/nginx_yourapp $ vim nginx_yourapp.conf (上記の設定ファイルを作る) $ cp nginx_yourapp.conf /etc/nginx/sites-available/ $ ln -s /etc/nginx/sites-available/nginx_yourapp.conf /etc/nginx/sites-enabled/nginx_yourapp.conf $ systemctl restart nginx </code></pre> <h2 id="webアプリの準備"><a href="#web%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E6%BA%96%E5%82%99">webアプリの準備</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://flask.palletsprojects.com/en/1.1.x/quickstart/#a-minimal-application">https://flask.palletsprojects.com/en/1.1.x/quickstart/#a-minimal-application</a></p> <p>Flask の HelloWorld。</p> <p>index.py</p> <pre><code class="python">from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello, World!" </code></pre> <h2 id="uwsgi の起動コマンド"><a href="#uwsgi+%E3%81%AE%E8%B5%B7%E5%8B%95%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">uwsgi の起動コマンド</a></h2> <ul> <li>ソケットファイルは nginx の設定ファイルと合わせること</li> <li><code>--chmod-socket=666</code> はパーミッション関連でこけたら</li> <li><code>--mount</code> はアプリパスと実行するスクリプト名:Flask appオブジェクト名を正しく指定する</li> <li><code>--virtualenv</code> は venv で作ったPython仮想環境を正しく指定する。</li> </ul> <pre><code class="shell">$ uwsgi -s /tmp/nginx_yourapp.sock --chmod-socket=666 --manage-script-name --mount /nginx_yourapp=index:app --virtualenv ~/venv/flaskapp </code></pre> <p>後はブラウザから <code>http://<サーバのIPアドレス>/nginx_yourapp/</code> にアクセスすれば <code>Hello World</code> が表示される。</p> <h2 id="FAQ"><a href="#FAQ">FAQ</a></h2> <h3 id="502 Bad Gateway が出る"><a href="#502+Bad+Gateway+%E3%81%8C%E5%87%BA%E3%82%8B">502 Bad Gateway が出る</a></h3> <p>ソケットファイルの permission 関連がおかしいかも。<br /> <code>/var/log/nginx/error.log</code> あたりを覗くとヒントがあるかも。</p> <h3 id="404 Not Found が出る"><a href="#404+Not+Found+%E3%81%8C%E5%87%BA%E3%82%8B">404 Not Found が出る</a></h3> <p>アプリパス指定が正しくないかも。</p> <h3 id="接続できない"><a href="#%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84">接続できない</a></h3> <p>nginx が正しく動いているなら、 <code>http://<サーバのIPアドレス>/</code> で何かが開けるはず。<br /> ダメならnginxが正しく起動できていないか、そもそもサーバに到達できてないか、<br /> サーバが外からのリクエストを受け付けていないので、そちらの方面でなんとかする。</p> keyangu tag:crieit.net,2005:PublicArticle/16545 2021-01-06T12:56:47+09:00 2021-01-06T12:56:47+09:00 https://crieit.net/posts/Linux Linuxでファイルコピーやファイル編集いくつか <h2 id="特定のファイルだけディレクトリ構造を維持したままコピーしたい"><a href="#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A0%E3%81%91%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0%E3%82%92%E7%B6%AD%E6%8C%81%E3%81%97%E3%81%9F%E3%81%BE%E3%81%BE%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%9F%E3%81%84">特定のファイルだけディレクトリ構造を維持したままコピーしたい</a></h2> <p>find と cpio で実現する。</p> <pre><code>A / subA / readme.txt / subB / readme.txt B / subA / readme.txt / subB / readme.txt dst <- コピー先 </code></pre> <pre><code class="shell">$ find A B -name "readme.txt" -print | cpio -pdv dst </code></pre> <h2 id="ディレクトリ下の所定のファイルだけ一定のルールで編集したい"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%B8%8B%E3%81%AE%E6%89%80%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A0%E3%81%91%E4%B8%80%E5%AE%9A%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%9F%E3%81%84">ディレクトリ下の所定のファイルだけ一定のルールで編集したい</a></h2> <p>find と sed で編集。</p> <pre><code class="shell">$ find . -name "*.txt" | xargs sed -i -e "s/<replace>/<pattern/e" </code></pre> <p>sed の -i はインプレイス編集で、やり直しがきかないので要注意。<br /> 事前に find で期待するテキストが過不足なく見つけられているか、 sed で正しく編集できるかは確認しておくこと。</p> keyangu