<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>技術メモ | hgrs&#039;s Blog</title>
	<atom:link href="/archives/category/%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>文字好きエンジニアの技術メモ</description>
	<lastBuildDate>Sun, 29 Aug 2021 08:16:30 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.3.1</generator>

<image>
	<url>/wp-content/uploads/2019/05/cropped-port_512-32x32.png</url>
	<title>技術メモ | hgrs&#039;s Blog</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>さくらのレンタルサーバ（スタンダード）で Django 3.0 を動かす方法</title>
		<link>/archives/444.html</link>
					<comments>/archives/444.html#comments</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Thu, 23 Jul 2020 10:21:38 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">/?p=444</guid>

					<description><![CDATA[はじめに 僕はサーバをさくらのレンタルサーバのスタンダードプランしか借りていないので、サーバサイドで...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>僕はサーバをさくらのレンタルサーバのスタンダードプランしか借りていないので、サーバサイドでガシガシプログラムを動かすことができないのですが、Django を使って API を作りたかったので、その設定方法を紹介します。</p>
<h2>紹介する範囲</h2>
<p>今回は Django の WSGI を CGI を通して利用する方法のみを紹介します。</p>
<p>さくらのレンタルサーバで Python 自体を利用する方法や Django の細かな設定自体は紹介しません。</p>
<h2>CGI の設定</h2>
<p>さくらのレンタルサーバでは <code>mod_wsgi</code> が設定されていないため、Python を実行するには CGI を通さなければいけません。</p>
<p>そこで、 Django のプロジェクトルートに <code>index.cgi</code> を作成し、以下の内容を書き加えます。<br />
この際、パーミッションを <code>755</code> に指定するのを忘れないようにします。</p>
<pre><code class="language-python">#!/path/to/python

import sys
sys.path.append(&#039;/path/to/djangoproject/&#039;)

import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from projectname.wsgi import application

CGIHandler().run(application)</code></pre>
<p>まず、1行目は使用している Python の環境をしてします。<br />
pyenv と pyenv-virtualenv などを使用している場合は <code>#!/home/username/.pyenv/versions/envname/python</code> などですね。</p>
<p>4行目は今使用している Django のプロジェクトへのパスを指定します。<br />
ここは <code>pwd</code> で表示される値をそのまま持ってくれば大丈夫です。</p>
<p>10行目の projectname は自分で設定しているプロジェクト名に変更します。</p>
<p>内部でやっていることは Django が設定している WSGI を CGI ハンドラーに載せて実行しているだけです。</p>
<h2>アクセスしてみる</h2>
<p><code>index.cgi</code> を入り口としているので <code>https://example.com/index.cgi</code> がルートになります。<br />
デフォルトの管理画面だと <code>https://example.com/index.cgi/admin</code> になります。</p>
<p>アクセスする際には <code>settings.py</code> の <code>ALLOWED_HOSTS</code> にホストを追加するのを忘れないようにしましょう。</p>
<p>またこのままだと <code>index.cgi</code> が常に入っていてダサいので <code>.htaccess</code> を用いて <code>index.cgi</code> 無しで見れるようにします。</p>
<pre><code class="language-text">RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]</code></pre>
<h2>おわりに</h2>
<p>以上、簡単でしたがスタンダードのさくらのレンタルサーバで Django を動かす方法でした。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/444.html/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Xcode Command Line Tools を入れ直す（ アップデートする ）</title>
		<link>/archives/439.html</link>
					<comments>/archives/439.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Mon, 08 Jun 2020 00:01:46 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Mac]]></category>
		<guid isPermaLink="false">/?p=439</guid>

					<description><![CDATA[はじめに macOS で開発しようとすると Xcode Command Line Tools は必須...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>macOS で開発しようとすると Xcode Command Line Tools は必須ですが、バージョンなどの問題で入れ直す必要がありました。<br />
その方法をまとめます。</p>
<h2>Xcode Command Line Tools のアンインストール</h2>
<p>Xcode Command Line Tools は <code>/Library/Developer/CommandLineTools/</code> に保存されています。<br />
なので、このディレクトリを削除することでアンインストールが行えます。</p>
<pre><code class="language-bash">$ sudo rm -r /Library/Developer/CommandLineTools</code></pre>
<h2>Xcode Command Line Tools の再インストール</h2>
<p>コマンドラインツールだけ入れれば良いので、以下のコマンドでインストールができます。</p>
<pre><code class="language-bash">$ xcode-select --install</code></pre>
<h2>おわりに</h2>
<p>最新バージョンじゃない場合など、エラーを引き起こす原因になるので、できる限り最新のものを使用したいですね。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/439.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Pi に Docker と Docker Compose をインストールする</title>
		<link>/archives/437.html</link>
					<comments>/archives/437.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 03:00:51 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">/?p=437</guid>

					<description><![CDATA[はじめに ラズパイの環境構築の一環で Docker 周りの環境を用意したので、記録しておきます。 D...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>ラズパイの環境構築の一環で Docker 周りの環境を用意したので、記録しておきます。</p>
<h2>Docker</h2>
<p>Docker の公式に用意されているインストールスクリプトで簡単にインストールすることができます。</p>
<pre><code class="language-bash">$ curl -sSL https://get.docker.com/ | sh</code></pre>
<p>インストールが終わったら Docker のコマンドの権限をユーザに与えます。</p>
<pre><code class="language-bash">$ sudo usermod -aG docker &lt;username&gt;</code></pre>
<p>例えば、ユーザ名が <code>pi</code> ならば <code>sudo usermod -aG docker pi</code> となります。</p>
<h2>Docker Compose</h2>
<p>Docker Compose は Python の <code>pip</code> を使うと簡単にインストールできます。<br />
Python がインストールされていない人はインストールしてください。<br />
また、公式では環境を汚さないために、仮想環境を使用することが推奨されています。</p>
<p>まず、依存ライブラリをインストールします。</p>
<pre><code class="language-bash">$ sudo apt install libffi-dev</code></pre>
<p>次に Docker Compose 本体をインストールしていきます。</p>
<pre><code class="language-bash">$ pip install docker-compose</code></pre>
<h2>おわりに</h2>
<p><code>sudo apt install docker docker-compose</code> で全て入る未来は来ないんですかね？</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/437.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Pi で VNC( x11vnc ) を設定して画面共有する</title>
		<link>/archives/430.html</link>
					<comments>/archives/430.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Tue, 14 Apr 2020 03:54:41 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">/?p=430</guid>

					<description><![CDATA[はじめに ラズパイにを操作するのに、ディスプレイやキーボード、マウスを用意するのが面倒なので、mac...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>ラズパイにを操作するのに、ディスプレイやキーボード、マウスを用意するのが面倒なので、macOS から画面共有できるようにします。</p>
<h2>x11vnc のインストール</h2>
<p>x11vnc は VNC プロトコルを利用した画面共有を実現するためのものです。</p>
<p>Raspbian では以下のコマンドでインストールすることができます。</p>
<pre><code class="language-bash">$ sudo apt install x11vnc</code></pre>
<h2>x11vnc の設定</h2>
<p>画面共有の認証に使うパスワードを以下のコマンドで設定します。</p>
<pre><code class="language-bash">$ x11vnc -storepasswd</code></pre>
<p>パスワード入力すると <code>Write password to /home/&lt;user_name&gt;/.vnc/passwd?  [y]/n</code> と確認されます。こちらは次に説明する自動起動設定に使用するので <code>y</code> で解答します。</p>
<p>また、Raspberry Pi にディスプレイを接続している場合は、画面共有時、そのディスプレイと同じ画面、同じ解像度で表示されます。<br />
ディスプレイを接続していない場合は、「Raspberry Pi の設定」のディスプレイの解像度が使用されるため、解像度を変更したい場合はこちらを変更します。（コマンドラインから変更する場合は <code>sudo raspi-config</code> &gt; <code>Display Options</code> から設定します）</p>
<h2>自動起動設定</h2>
<p>起動時に毎回、手動で立ち上げるのでは、あまり意味がないので、自動起動の設定を行います。</p>
<p>まず、以下の内容の <code>x11vnc.service</code> というファイルを <code>/etc/systemd/system/</code> に作成します。</p>
<pre><code class="language-text">[Unit]
Description=X11vnc
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -forever -auth guess -rfbauth /home/pi/.vnc/passwd

[Install]
WantedBy=multi-user.target</code></pre>
<p>これは systemd という Raspbian で採用されているデーモンの設定ファイルで、それぞれのオプションについてはここでは説明しませんが、x11vnc に限らず、自由に自動起動の設定が行えるので、覚えておくと良いでしょう。</p>
<p>また x11vnc の実行オプションにこだわりのある方は上記の <code>ExecStart</code> の行にオプションを書き加えることで実行オプションを変更することができます。</p>
<p>上記の設定ファイルを保存したら、以下のコマンドで設定ファイルを読み込ませます。</p>
<pre><code class="language-bash">$ sudo systemctl daemon-reload</code></pre>
<p>次に、設定が正しく行えて起動できるかを確認するために以下のコマンドで起動します。</p>
<pre><code class="language-bash">$ sudo systemctl start x11vnc</code></pre>
<p>後述する接続方法で接続ができれば、以下のコマンドで、自動起動を有効にします。</p>
<pre><code class="language-bash">$ sudo systemctl enable x11vnc</code></pre>
<h2>画面共有の接続</h2>
<p>macOS から確認するには 画面共有.app を使用します。画面共有.app は Spotlight から検索すると出てきます。</p>
<p>アドレスには Raspberry Pi のホスト名か IP アドレスを指定します。</p>
<p>または、Finder からサーバへ接続（ Command + K ）をし、<code>vnc://raspberrypi.local/</code> に接続することでも画面共有を開始できます。</p>
<p>この際 <code>raspberrypi.local</code> の部分は環境によって IP アドレスやホスト名に適宜変更してください。</p>
<h2>おわりに</h2>
<p>これでラズパイ用の周辺機器がなくても操作できるようになりました。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/430.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Pi で Samba を設定してホームディレクトリにアクセスする</title>
		<link>/archives/428.html</link>
					<comments>/archives/428.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Mon, 13 Apr 2020 03:21:05 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">/?p=428</guid>

					<description><![CDATA[はじめに ラズパイをセットアップしたので、ファイル共有の設定をしていきたいと思います。 Samba ...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>ラズパイをセットアップしたので、ファイル共有の設定をしていきたいと思います。</p>
<h2>Samba のインストール</h2>
<p><a href="https://www.samba.org/">Samba</a> は SMB プロトコルを利用したファイル共有を実現するためのものです。</p>
<p>Raspbian では以下のコマンドでインストールすることができます。</p>
<pre><code class="language-bash">$ sudo apt install samba</code></pre>
<h2>ホームディレクトリを設定</h2>
<p>インストールした Samba の設定ファイルは <code>/etc/samba/smb.conf</code> にあります。これを編集してホームディレクトリにアクセスできるようにします。</p>
<p>お好きなエディタか <code>sudo nano /etc/samba/smb.conf</code> のコマンドで以下のように編集してください。</p>
<p><code>#</code> の行はコメントなので入力する必要はありません</p>
<pre><code class="language-text"># [homes] より下を編集
# browsable = no を yes に変更
browsable = yes
# read only = yes を no に変更
read only = no
# create mask = 0700 をコメントアウト / もしくは権限変更
# directory mask = 0700 をコメントアウト / もしくは権限変更</code></pre>
<p>これで設定ファイルを保存すれば、ホームディレクトリにアクセスできます。</p>
<h2>Samba ユーザの作成</h2>
<p>Samba のユーザを作成するため以下のコマンドでユーザを作成します。</p>
<pre><code class="language-bash">$ sudo smbpasswd -a &lt;user_name&gt;</code></pre>
<p><code>&lt;user_name&gt;</code> は自分の好きなものにします。例えば <code>pi</code> の場合は <code>sudo smbpasswd -a pi</code> となります。</p>
<h2>Samba の再起動</h2>
<p>変更した設定を読み込ませるために以下のコマンドで、Samba を再起動します。</p>
<pre><code class="language-bash">$ sudo systemctl restart smbd</code></pre>
<p>これで他のデバイスからホームディレクトリに自由にアクセスできるようになります。</p>
<h2>他のデバイスからアクセス。</h2>
<p>例えば macOS からは Finder で Command + K でサーバへ接続し、 <code>smb:/raspberrypi.local/</code> に先ほど作成したユーザで接続すると、ディレクトリが選択できて <code>Home</code> を選ぶと、ホームディレクトリに移動できます。</p>
<p>この際 <code>raspberrypi.local</code> の部分は環境によって IP アドレスやホスト名に適宜変更してください。</p>
<h2>おわりに</h2>
<p>これでファイルの移動や共有が簡単になりました。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/428.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>macOS で Raspberry Pi 用に Raspbian を SD カードに焼く</title>
		<link>/archives/425.html</link>
					<comments>/archives/425.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Sun, 12 Apr 2020 00:47:48 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">/?p=425</guid>

					<description><![CDATA[はじめに クローゼットに眠っていたラズパイを有効活用すべく、久しぶりにセットアップを行ったので、その...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>クローゼットに眠っていたラズパイを有効活用すべく、久しぶりにセットアップを行ったので、その記録です。</p>
<h2>Raspbian のダウンロード</h2>
<p>まずは OS 本体をダウンロードしてきます。</p>
<p><a href="https://www.raspberrypi.org/downloads/raspbian/">ダウンロードサイト</a></p>
<p>好きなバージョンを選んでダウンロードします。僕は GUI 環境が欲しかったので Raspbian Buster with desktop を選びました。</p>
<p><img decoding="async" src="/wp-content/uploads/2020/04/ad4867038f1d716ed71e1c47cbee5673.png" alt="Raspbian Buster with desktop" /></p>
<h2>SD カードに書き込み</h2>
<h3>SD カードのアンマウント</h3>
<p>書き込みに備えて、SD カードをアンマウント状態にします。</p>
<p>ターミナルから <code>diskutil list</code> コマンドを実行して、SD カードのデバイス番号を取得します。環境にもよりますが <code>/dev/disk0</code> や <code>/dev/disk1</code> などは macOS のために使用されるため、<code>/dev/disk2</code> 以降に割り当てられていると思います。</p>
<p>僕の環境では <code>/dev/disk2</code> であったため、これ以降は <code>/dev/disk2</code> の表記を使いますが、それぞれの番号に置き換えてコマンドを実行してください。</p>
<p>アンマウントは以下のコマンドで実行できます。</p>
<pre><code class="language-bash">$ diskutil unmountDisk /dev/disk2</code></pre>
<h3>OS の書き込み</h3>
<p>書き込みは <code>dd</code> コマンドを使用して、<code>dd if=&lt;path_to_os&gt; of=&lt;disk&gt;</code> の様に実行できます。</p>
<p>執筆時点で最新の Raspbian を使用して、カレントディレクトリに解凍してある場合は以下のコマンドで、書き込むことができます。</p>
<pre><code class="language-bash">$ sudo dd if=2020-02-13-raspbian-buster.img of=/dev/rdisk2 bs=1m</code></pre>
<p>ここで、気をつけたいのが、先ほど確認したデバイスは <code>/dev/disk2</code> であったのに対し、今回の入力では <code>/dev/rdisk2</code> を使用しています。</p>
<p><code>/dev/disk2</code> はバッファリングを使用しアクセスするのに対し、<code>/dev/rdisk2</code> は直にデバイスへアクセスするため、書き込みを高速化することができます。</p>
<p>またオプションの <code>bs=1m</code> も高速化のために使用しています。</p>
<p>どちらも高速化のために行っているので、<code> sudo dd if=2020-02-13-raspbian-buster.img of=/dev/disk2</code> という通常コマンドでも、問題なく書き込むことができます。</p>
<p>時間は記録してませんが 5 – 10 分程度だった気がします。</p>
<h2>Raspberry Pi で起動確認</h2>
<p>書き込んだ SD カードを Raspberry Pi に戻し、起動させます。ちゃんと起動すれば成功です。</p>
<p>セットアップが始まるので、ガイドに沿って進めていきましょう。</p>
<h2>おわりに</h2>
<p>前は FreeBSD で使ってたので Raspbian のセットアップは購入時以来だったのですが、ガイドに沿って進めるとめちゃくちゃ簡単に使えるんですね。</p>
<p>もっと苦戦するものかと思ってました。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/425.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GitHub Pages でパスワードによる認証をつける</title>
		<link>/archives/422.html</link>
					<comments>/archives/422.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Sun, 05 Apr 2020 18:01:44 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[GitHub]]></category>
		<guid isPermaLink="false">/?p=422</guid>

					<description><![CDATA[はじめに GitHub Pages などの静的ホスティングサービスでサーバを自由にいじれない環境でも...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>GitHub Pages などの静的ホスティングサービスでサーバを自由にいじれない環境でもパスワードをつける方法です。</p>
<h2>デモ</h2>
<p><a href="https://higurashi-takuto.github.io/password/">デモサイト</a><br />
<a href="https://higurashi-takuto.github.io/password/check.html">ハッシュ値チェック</a><br />
<a href="https://github.com/higurashi-takuto/password">リポジトリ</a></p>
<p>パスワードは <code>password</code></p>
<h2>概要</h2>
<p>GitHub Pages などの静的ホスティングでサーバの設定ができない場合、パスワードによる制限をつけることが難しいです。</p>
<p>それでも、パスワードによって閲覧を制限したい場合に、今回の方法が使えます。</p>
<p>簡単な説明をするとパスワードによって制限したいページをハッシュ化された文字列の名前を持つディレクトリに入れることで、URI を用いた認証をつけます。</p>
<p>これにより、パスワードを知っている人のみがページへアクセスすることができます。</p>
<h2>仕組みの詳細</h2>
<h3>パスワードの入力</h3>
<p>あらかじめ正解のパスワードが入力された場合のハッシュ値（ デモサイトでは SHA-256 を使用 ）をそのままアクセスされるディレクトリの名前にしておきます。</p>
<p>訪問者はパスワード入力ページでパスワードを入力します。</p>
<p>パスワードが入力されたら、JavaScript でハッシュ化（ ライブラリは <a href="https://github.com/Caligatio/jsSHA">jsSHA</a> を使用してます ）し、XMLHttpRequest を利用してハッシュ値の名前を持つディレクトリの存在を確認します。</p>
<p>正常なレスポンスが返されればアクセスに成功とし、遷移します。</p>
<p>そうでない場合は、再入力を促します。</p>
<p>詳細なコードはリポジトリにある <a href="https://github.com/higurashi-takuto/password/blob/master/index.html">index.html</a> を見れば全てわかります。</p>
<h3>セキュリティ</h3>
<p>（ 専門ではないので間違いがある可能性があります。 ）<br />
上記の仕組みを見れば分かる通り、URI の存在を確認しているだけなので、それを知られるとパスワード無しで閲覧できてしまいます。</p>
<p>なので、ディレクトリリスティングの設定や noindex などを利用して、リンクを知られないようした上で SSL を利用しましょう。</p>
<p>しかし、簡単なパスワードを利用していない限りは URI を知られてもパスワード自体が知られることはないでしょう。</p>
<h2>おわりに</h2>
<p>簡易的ではありますが、静的ホスティングサービスでパスワード認証を利用する方法の紹介でした。</p>
<p>ちょっとした認証に利用できそうなので、使う機会があれば使っていきたいですね。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/422.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【macOS】Python の環境構築 — pyenv と pyenv-virtualenv —</title>
		<link>/archives/418.html</link>
					<comments>/archives/418.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Fri, 20 Mar 2020 09:53:54 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">/?p=418</guid>

					<description><![CDATA[はじめに 僕なりの macOS で Python 環境を作るためのお話です。 pyenv と pye...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>僕なりの macOS で Python 環境を作るためのお話です。</p>
<h2>pyenv と pyenv-virtualenv</h2>
<p>ここでは Python の仮想環境を <a href="https://github.com/pyenv/pyenv">pyenv</a> と <a href="https://github.com/pyenv/pyenv-virtualenv">pyenv-virtualenv</a> で作成する方法を紹介します。</p>
<h2>pyenv</h2>
<h3>Homebrew を用いたインストール</h3>
<p>macOS を使用している場合は <a href="https://brew.sh/index_ja">Homebrew</a> を用いてインストールすることができます。Homebrew をインストールしていない場合はリンク先のインストールコマンドを実行しましょう。</p>
<p>pyenv のインストールコマンドは以下の通りです。</p>
<pre><code class="language-bash">$ brew install pyenv</code></pre>
<h3>Git を用いたインストール</h3>
<p>pyenv の GitHub リポジトリをクローンしてくることでもインストールすることができます。</p>
<p>コマンドは以下の通りです。</p>
<pre><code class="language-bash">$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv</code></pre>
<h3>パスの追加と初期化</h3>
<p>インストールした pyenv を使用できるように、パスを通し、シェル実行時に初期化をしてやる必要があります。</p>
<p>今回は最新の macOS 標準の Z Shell( zsh ) の方法を紹介します。<br />
Bash を使用している方は適宜 <code>.zshrc</code> を <code>.bash_profile</code> などに読み替えてください。</p>
<p>実行するコマンドは以下の通りです。</p>
<pre><code class="language-bash">$ echo &#039;export PYENV_ROOT=&quot;$HOME/.pyenv&quot;&#039; &gt;&gt; ~/.zshrc
$ echo &#039;export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;&#039; &gt;&gt; ~/.zshrc
$ echo -e &#039;if command -v pyenv 1&gt;/dev/null 2&gt;&amp;1; then\n  eval &quot;$(pyenv init -)&quot;\nfi&#039; &gt;&gt; ~/.zshrc</code></pre>
<h3>Python バージョンの追加</h3>
<p>仮想環境のためのバージョンを追加するにはバージョンを指定し、以下のコマンドで追加できます。</p>
<pre><code class="language-bash">$ pyenv install x.x.x</code></pre>
<p>この際、インストール可能なバージョン一覧は <code>pyenv install -l</code> で確認することができます。</p>
<p>また、アプリケーションをビルドする場合などはフレームワークとしてインストールする必要があります。コマンドは以下のとおりです。</p>
<pre><code class="language-bash">$ env PYTHON_CONFIGURE_OPTS=&quot;--enable-framework&quot; pyenv install x.x.x</code></pre>
<h2>pyenv-virtualenv</h2>
<h3>Homebrew を用いたインストール</h3>
<p>pyenv と同じく Homebrew でインストールできます。インストールコマンドは以下の通りです。</p>
<pre><code class="language-bash">$ brew install pyenv-virtualenv</code></pre>
<h3>Git を用いたインストール</h3>
<p>こちらも pyenv と同じく Git でもインストールできます。コマンドは以下の通りです。</p>
<pre><code class="language-bash">$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv</code></pre>
<h3>初期化</h3>
<p>pyenv 同様に、初期化のコマンドを追加します。</p>
<pre><code class="language-bash">$ echo &#039;eval &quot;$(pyenv virtualenv-init -)&quot;&#039; &gt;&gt; ~/.zshrc</code></pre>
<h3>仮想環境の追加</h3>
<p>仮想環境を追加するには以下のコマンドを実行します。</p>
<pre><code class="language-bash">$ pyenv virtualenv x.x.x &lt;name&gt;</code></pre>
<p>例えば、Python 3.8.2 で test-3.8 という名前の環境を作りたい場合は以下のようになります。</p>
<pre><code class="language-bash">$ pyenv virtualenv 3.8.2 test-3.8</code></pre>
<h2>仮想環境の指定</h2>
<h3>グローバル</h3>
<p>特別に、環境が指定されていない、グローバルな環境で使うバージョンを指定するには <code>pyenv global</code> を使用します。例えば先ほど作成した <code>test-3.8</code> を使用する場合は以下のようになります。</p>
<pre><code class="language-bash">$ pyenv global test-3.8</code></pre>
<h3>ローカル</h3>
<p>カレントディレクトリで、特定の仮想環境を指定する場合には <code>pyenv local</code> を使用します。例えば先ほど作成した <code>test-3.8</code> を使用する場合は以下のようになります。</p>
<pre><code class="language-bash">$ pyenv local test-3.8</code></pre>
<p>このコマンドを実行すると、ディレクトリに <code>.python-version</code> というファイルが追加され、そこに、指定した仮想環境が書き込まれます。</p>
<p>また、<code>pyenv activate &lt;name&gt;</code> を使用することで、仮想環境を一時的に起動することもできます。</p>
<h2>仮想環境の確認</h2>
<p>現在作成されている仮想環境の一覧を取得するには <code>pyenv versions</code> が使用できます。また、一覧ではなく、現在の環境で適用されているものを知りたい場合には <code>pyenv version</code> で確認できます。</p>
<h2>おわりに</h2>
<p>ここで紹介した他に必要そうなコマンドが出てきたら、追記していきます。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/418.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python で簡単に HTTP / Web サーバを立てる方法【アドレス / ポート変更】</title>
		<link>/archives/410.html</link>
					<comments>/archives/410.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Tue, 25 Feb 2020 19:10:32 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">/?p=410</guid>

					<description><![CDATA[はじめに 手元で簡易的な HTTP サーバを立てたいときによく Python を使います。なのでその...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>手元で簡易的な HTTP サーバを立てたいときによく Python を使います。なのでその方法をまとめておきます。</p>
<h2>http.server</h2>
<p>Python で簡単に HTTP サーバを立てるには、標準ライブラリの <a href="https://docs.python.org/ja/3/library/http.server.html">http.server</a> を使います。</p>
<p>公式の警告にもあるように、実運用向けのライブラリではないので、あくまで手元の確認用程度のものという認識で。</p>
<h2>実行</h2>
<p>もちろん http.server を使って Python のコードを書き、実行すればサーバを立てられるのですが、それでは少し面倒です。</p>
<p>ここでは Python のモジュールモードを使用して、コマンドでサーバを立ち上げましょう。<br />
モジュールモードで起動するには Python の実行オプションとして <code>-m</code> を付与し、使用するモジュール <code>http.server</code> を指定します。</p>
<p>つまり、実行コマンドは以下のようになります。</p>
<pre><code class="language-bash">$ python -m http.server</code></pre>
<p>デフォルトでは外部アクセス許可（ <code>0.0.0.0</code> ）の <code>8000</code> 番ポートで立ち上がります。</p>
<h2>アドレスとポートの変更</h2>
<p>このコマンドのヘルプを確認してみます。</p>
<pre><code class="language-bash">$ python -m http.server -h
usage: server.py [-h] [--cgi] [--bind ADDRESS] [--directory DIRECTORY] [port]

positional arguments:
  port                  Specify alternate port [default: 8000]

optional arguments:
  -h, --help            show this help message and exit
  --cgi                 Run as CGI Server
  --bind ADDRESS, -b ADDRESS
                        Specify alternate bind address [default: all
                        interfaces]
  --directory DIRECTORY, -d DIRECTORY
                        Specify alternative directory [default:current
                        directory]</code></pre>
<p>ここにあるように <code>--bind</code> でアドレスを指定すると、外部アクセスを許可せず、完全ローカルで立ち上げたり、ポート番号を指定したりすることができます。</p>
<p>例えば、ローカルで <code>12345</code> 番ポートにしたい時は以下のようなコマンドになります。</p>
<pre><code class="language-bash">$ python -m http.server --bind 127.0.0.1 12345</code></pre>
<h2>おわりに</h2>
<p>CGI サーバとしても動かせるので、単純な静的サイト意外にも使い道はありそうですね。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/410.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>実行中のコマンドの標準出力を変数にして別コマンドを実行する</title>
		<link>/archives/407.html</link>
					<comments>/archives/407.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Tue, 25 Feb 2020 01:15:44 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">/?p=407</guid>

					<description><![CDATA[はじめに 実行中の標準出力を受け取って、何か別のコマンドを実行したいことがあったので、それを実現する...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>実行中の標準出力を受け取って、何か別のコマンドを実行したいことがあったので、それを実現する方法を紹介します。</p>
<h2>標準出力を受け取る</h2>
<p>単純に出力される内容を別コマンドに渡すにはパイプラインを使用すれば簡単にできます。</p>
<p>ただ、少し複雑なことをやろうとすると少し自由度が低いので、<code>while</code> と <code>read</code> を使ってコマンドを自由に使えるようにしましょう。</p>
<p>以下では出力内容を <code>line</code> という変数として受け取るスクリプトです。</p>
<pre><code class="language-bash">&lt;実行したいコマンド&gt; | while read -r line
do
  &lt;出力を受け取って処理するコマンド&gt;
done;</code></pre>
<p>例えば全く意味のないことですが <code>ping</code> の実行をそのまま表示するコマンドは以下のようになります。</p>
<pre><code class="language-bash">ping 127.0.0.1 | while read -r line
do
  echo $line
done;</code></pre>
<p>これを使えば、例えば if文で何か分岐させたりなど色々と応用が効きます。</p>
<p>ちなみに、これを利用しているのが、以前に紹介している <a href="/20200223233018">マイクラのログイン通知</a> です。</p>
<h2>おわりに</h2>
<p>シェルスクリプトは特別得意なわけではないので、もっと良い方法があるかもしれません。あれば教えてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/407.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
