<?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>Python | hgrs&#039;s Blog</title>
	<atom:link href="/archives/tag/python/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>文字好きエンジニアの技術メモ</description>
	<lastBuildDate>Sat, 10 Sep 2022 22:16:38 +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>Python | 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>【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>Minecraft のマルチサーバでログイン通知を Slack / Discord / LINE に送る</title>
		<link>/archives/401.html</link>
					<comments>/archives/401.html#comments</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Sun, 23 Feb 2020 14:30:18 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Minecraft]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">/?p=401</guid>

					<description><![CDATA[はじめに 研究室の人たちとマイクラのマルチで遊んでるんですが、誰がインしているかを知りたいため、ログ...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>研究室の人たちとマイクラのマルチで遊んでるんですが、誰がインしているかを知りたいため、ログイン通知をつけています。せっかくなのでその方法を公開します。</p>
<h2>前提条件</h2>
<p>通知を送信する際に Python 製のライブラリを使用するので Python が使用できることが前提です。</p>
<p>僕の環境の場合は <code>3.8.0</code> で動作しています。</p>
<p>必要ライブラリのインストールは以下のコマンドでできます。</p>
<pre><code class="language-bash">pip install pynotificator</code></pre>
<p>インストールした PyNotificator は Slack、Discord、LINE にメッセージを送信することができるので、受け取り先を決めて必要なURL、トークンを以下から取得します。</p>
<p>-Slack: <a href="https://api.slack.com/apps">Slack API</a><br />
-Discord: サーバー設定 &gt; ウェブフック より、Webhook 用の URL を取得<br />
-LINE: <a href="https://notify-bot.line.me/">LINE Notify</a></p>
<h2>通知用のスクリプト</h2>
<p>マイクラのサーバ実行スクリプトからパイプで通知用コマンドにログを流します。</p>
<p>実行コマンドの大枠は以下のとおりです。</p>
<pre><code class="language-bash">&lt;マイクラのサーバ実行コマンド&gt; | while read -r line
do
  if [[ $line == *joined\ the\ game* ]]; then echo &quot;${line:33}&quot; | &lt;slack|discord|line&gt;-notify -m &quot;$(cut -d &#039; &#039; -f 1) がログインしました。&quot; &lt;URL|token&gt; ; fi
  if [[ $line == *left\ the\ game* ]]; then echo &quot;${line:33}&quot; | &lt;slack|discord|line&gt;-notify -m &quot;$(cut -d &#039; &#039; -f 1) がログアウトしました。&quot; &lt;URL|token&gt; ; fi
done;</code></pre>
<p>これをもとに Slack か Discord か LINE を選択して、上記の <code>&lt;&gt;</code> で囲まれた部分を書き換えてください。<br />
例えば以下のようなコマンドになります。</p>
<pre><code class="language-bash">java -jar server.jar nogui | while read -r line
do
  if [[ $line == *joined\ the\ game* ]]; then echo &quot;${line:33}&quot; | slack-notify -m &quot;$(cut -d &#039; &#039; -f 1) がログインしました。&quot; https://hooks.slack.com/services/xxx ; fi
  if [[ $line == *left\ the\ game* ]]; then echo &quot;${line:33}&quot; | slack-notify -m &quot;$(cut -d &#039; &#039; -f 1) がログアウトしました。&quot; https://hooks.slack.com/services/yyy ; fi
done;</code></pre>
<h2>動作例</h2>
<p>僕の環境では Discordに送っているので、このようになります。</p>
<p><img decoding="async" src="/wp-content/uploads/2020/02/89910b38358d76a8d22755b7f8edc910.png" alt="" /></p>
<p>ちなみに、このスクリプトを少し応用すると、死亡通知などもつけることができるようになります。</p>
<p><img decoding="async" src="/wp-content/uploads/2020/02/d14862fc9f102ea9a3c63a3ee3156edf.png" alt="" /></p>
<h2>おわりに</h2>
<p>情報系の研究室っぽく、マイクラをやる環境もどんどん便利にしていきたいですね。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/401.html/feed</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>pyenv で Framework / Shared library でインストール</title>
		<link>/archives/373.html</link>
					<comments>/archives/373.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Fri, 03 Jan 2020 18:13:30 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">/?p=373</guid>

					<description><![CDATA[はじめに py2app など一部ライブラリを使う際に必要となるので紹介です。 Framework /...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>py2app など一部ライブラリを使う際に必要となるので紹介です。</p>
<h2>Framework / Shared library とは</h2>
<p>素の Python では出来ないことを実現するために OS のバックエンドを利用することがあります。</p>
<p>そこで Python をフレームワークとしてインストールをすることで、OS のバックエンドを利用できるようにするのです。</p>
<p>Shared library も共有のライブラリを使用可能にすることで Python だけでは出来ないことを可能にします。</p>
<p>これらがない状態で使用すると <code>Python is not installed as a framework.</code> や <code>A Python runtime not could be located.</code> といったエラーが発生してしまいます。</p>
<h2>インストール</h2>
<h3>Framework</h3>
<p>インストール時に <code>PYTHON_CONFIGURE_OPTS=&quot;--enable-framework&quot;</code> というオプションを付けます。</p>
<p>例えば <code>3.8.1</code> をインストールするのであれば以下のようなコマンドになります。</p>
<pre><code class="language-bash">$ env PYTHON_CONFIGURE_OPTS=&quot;--enable-framework&quot; pyenv install 3.8.1</code></pre>
<h3>Shared library</h3>
<p>インストール時に <code>PYTHON_CONFIGURE_OPTS=&quot;--enable-shared&quot;</code> というオプションを付けます。</p>
<p>例えば <code>3.8.1</code> をインストールするのであれば以下のようなコマンドになります。</p>
<pre><code class="language-bash">$ env PYTHON_CONFIGURE_OPTS=&quot;--enable-shared&quot; pyenv install 3.8.1</code></pre>
<h2>おわりに</h2>
<p>仮想環境は便利ですけど、たまにややこしいのでもうちょっと便利に使いたいですね。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/373.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PythonからMac、Slack、Discord、LINEに通知を飛ばすライブラリを作った</title>
		<link>/archives/359.html</link>
					<comments>/archives/359.html#comments</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Tue, 24 Dec 2019 19:55:32 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">/?p=359</guid>

					<description><![CDATA[はじめに 実行時間がちょっと長いプログラムを走らせる時とかに、終わったことを通知して欲しかったので、...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>実行時間がちょっと長いプログラムを走らせる時とかに、終わったことを通知して欲しかったので、作った。</p>
<h2>ライブラリ</h2>
<p><a href="https://github.com/higurashi-takuto/pynotificator">ここ</a> にあります。</p>
<p>使い方とかは README 見れば、基本全部書いてあるので、言ってしまえばこの記事は特に読む必要もないです。</p>
<p>以下余談。</p>
<h2>なぜつくったのか</h2>
<p>僕の環境だと仕事だったり、研究で使ってるコードの多くが実行に結構な時間がかかります。具体的には数十分から数日とかです。</p>
<p>それだと、いちいち実行経過を追うのも無駄だけど、気付いたら終わってかなり時間がたっていたとかももったいないです。</p>
<p>そこで、実行経過だったり終了を知らせてくれたらいいなということで、作りました。</p>
<p>昔にもコード中に毎回書き捨てで通知を送るコードを書いていたりしたんですが、書き捨てもよくないし、利便性を高めたかったので、ちょっとちゃんとしたライブラリにしてみました。</p>
<h2>使用している技術</h2>
<h3>macOS 系</h3>
<p>ビープと通知センターの通知を出すのには AppleScript を実行することができる <code>osascript</code> コマンドを利用しています。このコマンドを Python から <code>subprocess</code> で呼び出しています。</p>
<p>AppleScript は結構いろいろなことができて、今回実行している通知センターへの通知の送信は結構豊富なオプションがあります。</p>
<p>わかりやすいところだとタイトルとサブタイトルですね。実際にこのように表示されます。</p>
<p><img decoding="async" src="/wp-content/uploads/2019/12/center-sample.png" alt="通知センター" /></p>
<h3>Slack、Discord、LINE</h3>
<p>Slack と Discord ではそれぞれ API として提供されているウェブフックを利用した通知になっています。こちらは Python の <code>requests</code> を利用して投げています。LINE についても LINE Notify を利用して流れはウェブフックと似た感じですね。</p>
<h2>その他</h2>
<h3>ライセンス</h3>
<p>MIT License にしてみました。自由に使っていただきたいので。</p>
<h3>コメントアウト・ドックストリングもどき</h3>
<p>日本語で少し書いています。最近コメントを日本語にするぐらいならコード自体日本語でいいんじゃないかなって気がしてきているので、時間があったら試してみたい。</p>
<h3>アイコン？</h3>
<p>この記事のアイキャッチにも設定している「py!」って書いてあるやつですね。「py」が小文字なのに「!」と位置を揃えたり、なんかそれっぽいグラデーションを使ってみたり、遊んでいます。文字だけですけど。フォントは Futura です。</p>
<h3>クラス図</h3>
<p>Pylint の Pyreverse を使用して出力しています。ただフォントが気に食わなかったので、SVG で出力してフォントを変更しています。</p>
<p><img decoding="async" src="/wp-content/uploads/2019/12/classes-1.png" alt="クラス図" /></p>
<h3>今後のアップデート</h3>
<p>Slack と Discord は詳細設定を足せそうなのでやれたらやろうかなと。あとファイルとか送れたら便利そうですよね。</p>
<h2>おわりに</h2>
<p>よかったら使ってみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/359.html/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>macOS で起動時に JupyterLab を自動で立ち上げる方法</title>
		<link>/archives/355.html</link>
					<comments>/archives/355.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Wed, 11 Dec 2019 05:10:28 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">/?p=355</guid>

					<description><![CDATA[はじめに JupyterLab は便利なので使っていきたい。でも毎回立ち上げたり、ターミナルが開きっ...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>JupyterLab は便利なので使っていきたい。でも毎回立ち上げたり、ターミナルが開きっぱなしなのが嫌なので、自動起動にする方法です。</p>
<h2>macOS での自動起動</h2>
<p>macOS でデーモンやエージェントを管理するには <code>launchctl</code> コマンドを使用します。</p>
<p>この <code>launchctl</code> で起動するためのアプリなり、コマンドなりの設定を書き記すプロパティファイルを作る必要があります。これは以前書いた <a href="/20191017130747">MacBook の充電音を消す記事</a> でも出てきた <code>.plist</code> の拡張子を持つファイルです。</p>
<p>今回はこの設定ファイルの作り方と、自動起動にするため設定について書いていきます。</p>
<h2>ファイル作成</h2>
<p>はじめに Jupyter の実行ファイルのパスを調べます。仮想環境を使用している場合はそれぞれの環境の <code>bin</code> に入っていると思います。そのほかの環境でも <code>which jupyter</code> で調べられると思います。</p>
<p>次に設定ファイルを作成します。保存場所は <code> ~/Library/LaunchAgents/</code> にします。ファイル名はなんでも良いですが、僕は <code>jupyterlab.plist</code> としています。以下のような内容です。</p>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&lt;plist version=&quot;1.0&quot;&gt;
&lt;dict&gt;
    &lt;key&gt;Label&lt;/key&gt;
    &lt;string&gt;jupyterlab&lt;/string&gt;
    &lt;key&gt;ProgramArguments&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;ここに調べた実行ファイルのパス&lt;/string&gt;
        &lt;string&gt;lab&lt;/string&gt;
    &lt;/array&gt;
    &lt;key&gt;RunAtLoad&lt;/key&gt;
    &lt;true/&gt;
    &lt;key&gt;StandardOutPath&lt;/key&gt;
    &lt;string&gt;標準出力を記録するファイルのパス（必要なければ /dev/null ）&lt;/string&gt;
    &lt;key&gt;StandardErrorPath&lt;/key&gt;
    &lt;string&gt;エラーを記録するファイルのパス（必要なければ /dev/null ）&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;</code></pre>
<p>となります。実際に僕が使用しているファイルは <a href="https://github.com/higurashi-takuto/mac-setup/blob/master/jupyterlab.plist">GitHub</a> で見ることができます。</p>
<p>これで設定ファイルが用意できたので、起動設定をしましょう。</p>
<h2>自動起動設定</h2>
<p>はじめに出てきた <code>launchctl</code> コマンドを使用します。コマンドは以下の通りです。</p>
<pre><code class="language-console">launchctl load ~/Library/LaunchAgents/jupyterlab.plist</code></pre>
<p>ちなみにやめたい場合は上記コマンドの <code>load</code> を <code>unload</code> にすれば停止されます。</p>
<h2>おわりに</h2>
<p>この方法はほかのコマンドなどにも使用できるので、よかったらカスタマイズして macOS を便利に使ってみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/355.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SVG ⇄ グリフ をするときの座標変換</title>
		<link>/archives/348.html</link>
					<comments>/archives/348.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Mon, 02 Dec 2019 05:46:56 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SVG]]></category>
		<guid isPermaLink="false">/?p=348</guid>

					<description><![CDATA[はじめに SVG から UFO のグリフを作る際の座標変換についての図を作る機会があったのでついでに...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>SVG から UFO のグリフを作る際の座標変換についての図を作る機会があったのでついでに書きます。</p>
<h2>SVG からグリフにする</h2>
<p>これについては、いくつか方法があります。</p>
<p>Illustrator と Glyphs などがあれば、コピペでもできます。</p>
<p>Python で作る場合には <a href="https://github.com/fonttools/fonttools">fonttools</a> の <a href="https://github.com/fonttools/fonttools/blob/master/Snippets/svg2glif.py">svg2glif</a> や <a href="https://github.com/fonttools/fonttools/blob/ab2f8d9338b6e011ca2f44d38c344f3391376fe1/Lib/fontTools/svgLib/path/__init__.py#L12">SVGPath</a> を使うとできます。</p>
<p>Illustrator と Glyphs を使用すれば特に問題はないですが、Python を使った方法だと、上下が反転しまします。これは SVG が下向きプラスでグリフが上向きプラスだからです。これを修正してあげる必要があります。</p>
<h2>座標変換</h2>
<p>グリフの変形にはよく 2 次元のアフィン変換が用いられます。式は以下の通りです。</p>
<ul>
<li>Python の変形用タプル</li>
</ul>
<pre><code class="language-python">(a, b, c, d, e, f)</code></pre>
<ul>
<li>数式</li>
</ul>
<pre><code class="language-katex">\begin{pmatrix}
 a &amp; b \\ c &amp; d
 \end{pmatrix}
 \begin{pmatrix}
 x \\ y
 \end{pmatrix}
+
\begin{pmatrix}
 e \\ f
 \end{pmatrix}</code></pre>
<p>このようになります。つまり <code>a, b, c, d</code> の部分で拡大縮小回転を指定して <code>e, f</code> で移動を指定します。</p>
<p>では、上下逆になる問題はどのように解決すれば良いかと言うと、行列計算がわかる人は問題ないと思いますが、以下のようにすることで上下が逆転します。</p>
<pre><code class="language-katex">\begin{pmatrix}
 1 &amp; 0 \\ 0 &amp; -1
 \end{pmatrix}
 \begin{pmatrix}
 x \\ y
 \end{pmatrix}
+
\begin{pmatrix}
 0 \\ 0
 \end{pmatrix}</code></pre>
<p>実際にやってみればわかりますが、これだけではうまくいきません。このままだと下にずれて配置がされてしまいます。</p>
<p>これはグリフの原点がグリフの高さの底辺にないからです。と言ってもわかりにくいので図にしました。右側の水色の線が Y 軸が 0（ベースライン）です。</p>
<p><img decoding="async" src="/wp-content/uploads/2019/12/svg2ufo.png" alt="svg2ufo" /></p>
<p>ここで出てくる謎の 880 という数字はフォントのアセンダーを表しています。つまり、上下反転しアセンダー分のオフセットをします。</p>
<h2>おわりに</h2>
<p>数式書くのに久しぶりに TeX の式書きました。フォントでも数学を使わなきゃいけないんですね。大変です。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/348.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>フォントを扱うPythonライブラリたち</title>
		<link>/archives/334.html</link>
					<comments>/archives/334.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Mon, 30 Sep 2019 14:58:58 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[フォント]]></category>
		<guid isPermaLink="false">/?p=334</guid>

					<description><![CDATA[はじめに フォントをPythonから扱うときに便利なライブラリ集です。フォントの見かけばかり気にせず...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>フォントをPythonから扱うときに便利なライブラリ集です。フォントの見かけばかり気にせず、たまにはフォントファイル自体をいじってみませんか？</p>
<h2>一覧</h2>
<h3>変換系</h3>
<h4><a href="https://github.com/googlefonts/ufo2ft">ufo2ft</a></h4>
<p>UFOからOTFを作ることのできるライブラリです。</p>
<h4><a href="https://github.com/robotools/ufo2fdk">ufo2fdk</a></h4>
<p>UFOからAFDKOへの変換ライブラリです。</p>
<h4><a href="https://github.com/robotools/extractor">UFO Extractor</a></h4>
<p>OTF、TTFとかのバイナリからUFOへの変換ライブラリです。</p>
<h4><a href="https://github.com/googlefonts/fontmake">fontmake</a></h4>
<p>Glyphs、UFOをOTF、TTFにするライブラリです。</p>
<h4><a href="https://github.com/adobe-type-tools/afdko">AFDKO</a></h4>
<p>有名なやつ。</p>
<h3>編集系</h3>
<h4><a href="https://github.com/robotools/fontParts">fontParts</a></h4>
<p>比較的新しいUFO編集ライブラリ。</p>
<h4><a href="https://github.com/robotools/defcon">defcon</a></h4>
<p>UFOのフォントオブジェクトを諸々定義してくれているライブラリです。</p>
<h4><a href="https://github.com/fonttools/fonttools">fonttools</a></h4>
<p>TrueType、OpenTypeをいじるためのライブラリです。<a href="/20190801033545">以前紹介したTTX</a>も含まれています。</p>
<h4><a href="https://github.com/googlefonts/glyphsLib">glyphsLib</a></h4>
<p>Glyphsファイルを扱うためのライブラリです。内部的にはUFOを使用します。</p>
<h4><a href="https://github.com/fonttools/ufoLib2">ufoLib2</a></h4>
<p>UFOを扱えるライブラリです。まだ実験段階。</p>
<h3>その他</h3>
<h4><a href="https://github.com/fonttools/ttfautohint-py">ttfautohint-py</a></h4>
<p>TTFの自動ヒンティングライブラリです。</p>
<h4><a href="https://github.com/googlefonts/fontbakery">fontbakery</a></h4>
<p>品質チェック用のライブラリです。</p>
<h4><a href="https://github.com/adobe-type-tools/kern-dump">kernDump</a></h4>
<p>カーニングの諸々。</p>
<h2>おわりに</h2>
<p>こうして並べてみると結構あるんですね。皆さんもフォントをいじってみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/334.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>「カクカクゴシック」を作った話</title>
		<link>/archives/325.html</link>
					<comments>/archives/325.html#respond</comments>
		
		<dc:creator><![CDATA[hgrs]]></dc:creator>
		<pubDate>Mon, 05 Aug 2019 17:25:44 +0000</pubDate>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[フォント]]></category>
		<guid isPermaLink="false">/?p=325</guid>

					<description><![CDATA[はじめに フォントを作ったので、試しにこのブログで配布してみようと思います。 フォントについて 4方...]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>フォントを作ったので、試しにこのブログで配布してみようと思います。</p>
<h2>フォントについて</h2>
<p>4方向にそれぞれすぼまったスタイルがあるフォントです。スタイル名はそれぞれ細くなっている方向を指して「上」「下」「左」「右」の4つとなっています。</p>
<p>シュッとした感じで変な形の割には意外と使いやすいんじゃないかなって勝手に思ってます。</p>
<h2>ライセンス</h2>
<p>ダウンロードページにも書いてありますが、以下のようになっています。</p>
<ul>
<li>M+ FONTSを使用しています</li>
<li>個人/商用ともに利用可能です</li>
<li>利用報告の必要はありません</li>
<li>再配布（Webフォントを含む）は認めておりません</li>
<li>改変は認めておりません</li>
<li>ダウンロード/使用について、いかなる保証も行いません</li>
<li>発生したいかなる損害についても、提供側は責任を負いません</li>
</ul>
<p>使用する場合は必ず守ってください。</p>
<h2>ダウンロードページ</h2>
<p><a href="https://booth.pm/ja/items/4159428">こちら</a>から。</p>
<h2>おまけ話</h2>
<p>せっかくこのブログなので、どうやって作ったかなど技術的な話をしようと思います。</p>
<h3>自分でパスを引かないフォント作り</h3>
<p>今回のフォント作りは一度も自分でパスを引きませんでした。フォントの確認にGlyphsは使いましたが、そこでもパスは引いていません。</p>
<p>全てプログラムで作成しました。つまり線が描けなくてもコードが書ければフォントが作れるんです！</p>
<p>では、どうやったか順に見ていきましょう。</p>
<h3>仕様</h3>
<p>元にしている「M+ FONTS」はTTFですが、このフォントでは（PostScript 形式の）OTFに変換してからベースとして使用しています。そのため、このフォントはOpenTypeのフォントです。</p>
<p>登録されているグリフは「M+ FONTS」から足しても引いてもいないので、「M+ FONTS」と同じものです。</p>
<h3>グリフの加工</h3>
<p>グリフの加工はPythonのスクリプトを作成し、変形を行なっています。</p>
<p>フォントをPythonで扱うにはOpenTypeのままでは少し都合が悪いのでUFO形式に変換してから使用します。UFO形式にしたフォントのグリフに一括で変換をかけるのですが、今回は台形のような変換なのでちょっとややこしい変換を行っています。</p>
<p>普通、移動や回転、拡大縮小などの変形であれば、アフィン変換という計算を用います。こちらであれば、Pythonのスクリプト上でもグリフに対して簡単に計算をしてくれます。しかし、台形にしたいという変換では、アフィン変換は使えません。</p>
<p>そのため、各アンカーポイントについてアフィン変換ではなく、自分で作った行列の計算を行います。今回は台形という比較的簡単な形状に合わせた変換なので、あまり複雑にはなりませんでしたが、波打った変形などでは式がどんどん複雑になると思います。</p>
<h3>UFOからOTFに</h3>
<p>こちらもPythonから行っています。Glyphsでもできることですが、正直に言うとGlyphsよくわかってなく、どれぐらいちゃんと生成されるかわからなかったのでプログラムで出力しました。そっちの方が僕的には楽だったんです。</p>
<h3>OTFを綺麗に</h3>
<p>出力したOTFのままでもよかったのですが、フォント名の設定などが不十分な点がありました。そこでOTFから一旦TTXに変換して、TTXを手書きします。笑</p>
<p>今回はnameテーブルに日本語の表記を足しました。なので、フォント名やスタイル名などソフトが対応していれば、ちゃんと日本語で「カクカクゴシック 上」みたいな感じで表示されると思います。</p>
<h2>おわりに</h2>
<p>せっかくエンジニアなので、それっぽい話を最後に書きましたが、とりあえずフォント使ってみてください！</p>
]]></content:encoded>
					
					<wfw:commentRss>/archives/325.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
