日本には7重内陸区市町村が存在する

f:id:lastline:20180515135054p:plain

n重内陸区市町村問題

世界には、48の内陸国が存在するが、その中でも海に出るために二つの国境を越える必要のある二重内陸国は、リヒテンシュタインウズベキスタンの2国しかない。
二重内陸国を日本の都道府県に当てはめてみようと思ったが、二重内陸都道府県は存在しない。海なし県として、栃木県、群馬県、埼玉県、長野県、山梨県岐阜県滋賀県奈良県があるものの、これらの県は一つの県境をまたげば海に出ることができる。奈良県以外は、互いに他の海なし県と接しているのが面白い。
二重内陸国の概念を市町村に拡張すると、二重ではすまないことが容易に想像できるだろう。言い換えると「日本の市町村において、海に出るまでに n 個の境界を越える必要のある市町村を n重内市町村としたとき、最大の n はいくつか」という問題になる。

市町村の区分としては、基盤自治体を元とする。つまり、東京都の「特別区」は「区」を、政令指定都市の「区」は「市」を境界とする。これは、東京都の「特別区」は「市町村」と同等の基盤自治体であることによる。

白地図に海岸線を有する市町村から順に内陸方向へ塗りつぶすことで、最大のnは7であることが分かった。つまり、7重内陸市町村が存在する。
各地域毎の結果を最後にまとめて表示した。

解法の指針

日本の中心はどの県だ?グラフ理論(ネットワーク)の基本的な諸概念 - アジマティクス
市区町村隣接関係一覧
当初は市町村の隣接データを元に、スクリプトを書いてグラフ理論で解こうと考えていた。しかし、「日本一マクドナルドから遠い場所」において、力業で求めた方がもっともらしい回答が得られていたので、白地図を地道に塗り塗りすることにした。
そもそも、市町村が多すぎるためデータの取り扱いが煩雑である。また、結果を可視化する場合にも色分けされた地図が必要となる。得られた結果を確認するためにも、ある程度手を動かす必要がある。結果を知りたいだけならスクリプトを書くよりも、地道に塗った方が早そうである。
都道府県における、n重内陸市町村をリストアップするならスクリプトを書いた方が間違いは少ないだろうが、興味があるのは最大の n のみなので、やはり手作業の方が単純で容易そうだ。

日本一マクドナルドから遠い場所 - Qiita
「本当に」日本一マクドナルドから遠い場所|🌏地図川さん🌏|note

高解像度の白地図

地図を塗るにも、それなりの高解像度の白地図が必要である。これは、スクリプトを書く場合も同様で可視化のためにベクター形式の地図情報があると便利である。

そこで、白地図 KenMap (白地図作成ソフト)白地図を用いることにした。関東付近は市町村が非常に過密なため、境界がやや曖昧になるものの、塗り分け用の地図としては必要十分である。

ちなみに、国土地理院から白地図を得られるが、市町村の区分まで表示するには倍率を上げる必要がある。一つの県を表示するのがやっとである。これをつなぎ合わせも良いが、手間がかかりすぎる。

Shapefileを読んでみる - 日々適当
shape形式のファイルを読み込む手も考えられるが、全国区で市町村を表示するとかなりの数のポリゴン数になるようである。そもそも、市町村を全国区の表示で見る用途など、想定されていないのだろう。

7重内陸市町村が最大

1重内陸市町村までしか有しない都道府県

1重内陸市町村しか存在しないのは、沖縄県、鹿児島県、長崎県佐賀県山口県愛媛県香川県福井県、石川県、富山県三重県の11県である。
中でも、沖縄県長崎県山口県は、1重内陸市町村を一つしか有しない。それぞれ、沖縄県南風原町長崎県波佐見町山口県美祢市である。島からなる沖縄県に内陸市町村があるのは興味深い。

7重内陸市町村は埼玉県と群馬県にある

n の最大値は7である。つまり、日本には7重内陸市町村が存在する。埼玉県の美里町滑川町東松山市、吉見町、北本市行田市羽生市、および、群馬県千代田町明和町が該当する。

次に、各7重内陸市町村が海へ出るルートを考えてみよう。千代田町群馬県を抜け新潟県へ、明和町は一旦栃木県に入り、再度群馬県に戻り、新潟県側へ出るルートが最も境界が少ない。
また、美里町は、千代田町とほぼ同じ道筋を辿る日本海ルートの他に、長野と山梨を経由して静岡県側から出るルートもある。その他の市町村は東京湾に出た方が境界が少ない。東松山市、吉見町、北本市などはさいたま市を経由し、東京へ出るルートが距離的にも短くなる。行田市羽生市は、細く長く伸びた千葉県野田市のお陰で越えるべき境界数が少なくなっている。

埼玉と群馬にnが最大となる市町村が存在する理由は、関東の市町村が非常に多いことに起因する。特に、埼玉県は小さな市町村が非常に多い。そのため、海に出るために経由すべき境界が増加しやすい。

その他の地域は市町村の合併により、市町村数が減少し、また、本来海外線を有しなかった市町村が海外線を有するようになり、n が減少した可能性が考えられる。恐らく、旧市町村の区分だと、 n はより大きくなるだろう。

地域別のn重内陸市町村

地域別に見ると、九州では福岡県と佐賀県に3重内陸市町村が存在する。これは、福岡県に市町村が多いためだ。
中国地方では、岡山県のみに3重内陸市町村がある。山がちな地域のため納得ではある。一方で、四国は2重内陸市町村までである。その中でも徳島に2重内陸国市町村が多いのも山によるものだろう。
関西は奈良県に4重内陸市町村があり、橿原市田原本町などが該当する。山がちな点と、大阪府奈良県に市町村が多いためと考えられる。長野県と岐阜県は意外にも3重内陸市町村しか存在しない。岐阜県高山市や長野県松本市の面積が広いため、多くの市町村と接することになるためだ。
東北地方は福島県に4重内陸市町村があり、北海道は3重内陸市町村までとなる。東北は、海岸線を有する市町村が割と内陸まで入り込んでいる場合が多い。その中で、福島県の場合は地形的のも内陸に入り込み、また市町村が多いため、内陸市町村が多くなっている。

海岸線を有するにも拘わらず、茨城県には5重内陸市町村が存在する。それぞれ、古河市結城市、八千代町であるが、これは海あり県では、最大である。そもそも、海なし県である、群馬県と埼玉県が最大の7重、次いで栃木県に6重があり、5重で茨城県山梨県が並んでいる。他の海なし県である、長野県、岐阜県滋賀県奈良県よりも多いのだ。これは、茨城県の内陸部が海なし県と接しているためであろう。

やっぱりスクリプト書いてみるかなぁ

日本の市町村において、海に出るまでに n 個の境界を越える必要のある市町村を n重内市町村としたとき、最大の n は 7 である。この時、東京都の「特別区」は境界とし、政令指定都市の「区」は「市」を境界とした。
ちなみに、地図は掲載しないが、東京23区をひとまとめにした場合もnの最大値は7となる。また、政令指定都市の区を境界とすると、nの最大値は8となる。

7重内陸市町村は、埼玉県の美里町滑川町東松山市、吉見町、北本市行田市羽生市、および、群馬県千代田町明和町である。それぞれ、日本海側、東京湾および静岡経由で海に抜けるルートが存在する。今回は、最長のルートを有する市町村は考慮しなかったが、これを求めることで、最内陸市町村を決定できそうである。また、今回のルートは山による境などを加味していないため、踏破できないことも十分考えられる。

海あり県では、茨城県に5重内陸市町村が存在する。長野県、岐阜県滋賀県奈良県より多いn重内陸市町村を有している。

スクリプトを書けば、より詳細なリストやルートが得られそうだが、これは今後の課題にしたい。

塗り分けた結果

緑が濃くなるごとにnが大きくなる。
f:id:lastline:20180515133921p:plain
f:id:lastline:20180515134119p:plain
f:id:lastline:20180515134208p:plain
f:id:lastline:20180515134327p:plain
f:id:lastline:20180515134346p:plain
f:id:lastline:20180515134431p:plain
f:id:lastline:20180515134518p:plain

Pythonでスペクトルのフィッティング

非プログラマーがPythonを学ぶために読んだ本 - 最終防衛ライン3 の「2. 一ヶ月勉強して、できるようになったこと」で書いた、Pythonでスペクトルのフィッティングを行った例を示します。matplotlib と pandas などを扱ったグラフの出力に関しては、別当まとめようと思います。matplotlib は手に取ってみるとなんとなくで扱えるのですが、真面目に取り組むと結構ややこしく、自分のためにも備忘録をしっかりまとめておきたい。
フィッティングだけならExcelでもできますが、データを大量に取り扱うとなるとマクロを組む羽目になりますし、マクロよりも、スクリプト言語を扱った方が拡張性があります。デーだ処理だけなら、Rを使う手もありますが、グラフを出力すること以外にもPythonを使った方が、やりたいこと、またできることが多いので。

フィッティングする適当なデータがなかったので、放射線スペクトル表示ツール SPViewer / 説明ページ における スペクトル例(FNF-401) を利用しました。確認用データを生成してそれをフィッティングしても良いのですが、それだとフィッティングできて当たり前ですし。
放射線スペクトルは、正規分布を取ることが知られているのでガウシアンフィッティングに最適。またバックグラウンドも二次式程度で近似できそうなので、丁度良いかなと。

f:id:lastline:20180412092647p:plain

スペクトルのフィット:例2Pythonでやった結果を表示しています。
先ず、pandas で CSV ファイルを読み込み、
フィッティング関数を定義し、scipy.optimize の curve_fit でフィッティングを実行します。
そして、その結果を matplotlib で描画しています。
フィッティング関数の定義や、データの取り扱いには numpy を利用しています。

以下のコードを実行すると、グラフが出力されます。
CSVファイルは、先述のように 放射線スペクトル表示ツール SPViewer / 説明ページ から スペクトル例(FNF-401) をダウンロードし、同名のフォルダに保存してください。URLから直接取得することもできますが、本質ではないのでカット。
過剰とも思えるコメントを付記しています。調べた際に、分かりにくかったポイントをまとめてあります。。そのくせに、関数の document は記述していない。

#モジュールのインポート
#import モジュール名 as * は非推奨。使っているコードを見かけますけど。
import pandas as pd
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

#データの読み込み
#関連として df を用いるが、データに即した変数名を使うべき。
#ベクトルとして取り出すことも可能。
#ただし、x, y を個別に取り出した方がフィッティングの際に扱いやすい。
#engine='python' と指定すると日本語ファイルも読み込めます。
file = 'fnf401_milk.csv'
df = pd.read_csv(file, engine='python', skiprows=250, nrows=350, header=None)

#元データがint値で、そのままではフィッティングできないので、float型に変換している。
channels = np.array(df.iloc[:, 0], dtype=float)
counts = np.array(df.iloc[:, 1], dtype=float)

#フィッティング関数の定義
#n次式を定義しやすいように、0次から記述した。
def quadratic(x, a, b, c):
    return a + b * x + c * x**2

#ガウシアンはより簡素に記述できるが、初期値を類推しやすい式にした。
def gauss(x, a, sigma, mean):
    return a / np.sqrt(2.0*np.pi) / sigma * np.exp(-((x-mean)/sigma)**2/2)

#フィッティング関数は二次関数とガウシアンをまとめて定義してもよい。
#ガウシアンを三度呼び出すので、分けて記述した。
#文頭のアスタリスクのついた*paramaters は引数を幾らでも渡せる。
#本来ならば引数を個別に指定すべき。
#今回はあまりにも冗長になるため、*paramaters と指定した。
def fitting(x, *paramaters):
    a0, b0, c0, a1, sigma1, mean1, a2, sigma2, mean2, a3, sigma3, mean3, = paramaters
    return quadratic(x, a0, b0, c0) + \
           gauss(x, a1, sigma1, mean1) + \
           gauss(x, a2, sigma2, mean2) + \
           gauss(x, a3, sigma3, mean3)

#初期値の設定。
#ガウシアンの場合、meanを適切に設定しないと発散しやすい。
#線形近似であっても適切に設定することが望ましい。
#関数の引数が複数ある場合は、タプルで渡すこと。
initial_quadratic = 70., 0.1, 0.1 #a0, b0, c0
initial_gauss1 = 1., 1., 300. #a1, sigma1, mean1
initial_gauss2 = 1., 1., 325. #a2, sigma2, mean2
initial_gauss3 = 1., 1., 395. #a3, sigma3, mean3

#初期値が多いので、個別に指定して接続した。
initial_parameter = initial_quadratic + initial_gauss1 + initial_gauss2 + initial_gauss3

#フィッティングの実行
#paramater_optimalが最適化されたパラメータで、covarianceは共分散。
paramater_optimal, covariance = curve_fit(fitting, channels, counts, initial_parameter)

#matplotlibの設定
plt.rc('font', family='Arial', size=14) #フォントの設定
plt.rc('xtick.major', width=1, size=6) #x軸の主目盛りの設定
plt.rc('xtick', direction='in', top=True) #x軸目盛りの向き、上側に表示するか
plt.rc('ytick.major', width=1, size=6) #y軸の主目盛りの設定
plt.rc('ytick', direction='in', right=True) #y軸目盛りの向き、右側に表示するか
plt.rc('axes', linewidth=1.5) #枠線の太さ
plt.rc('lines', linewidth=1.0) #プロットの太さ

#今回は、Axes が一つしかないので fig, ax1 = plt.subplots() の方が簡素。
#慣例として ax1 を用いるが、df 同様に意味のある変数名にすべき。
fig = plt.figure(figsize=(8, 6), dpi=80)
gs = gridspec.GridSpec(1, 1)
ax1 = fig.add_subplot(gs[0])

#データをグラフに表示する。
ax1.plot(channels, counts, ls='-', c='g', label='row data')
ax1.set_xlabel('Channel', fontsize=16)
ax1.set_ylabel('Count', fontsize=16)
ax1.yaxis.set_data_interval(0, 100) #set_ylim を使う方が一般的

#フィッティングした曲線の表示
#np.corrcoef で相関係数を求める。
#結果が2×2の行列で返るので、1行目2列目もしくは2行目1列目の値を取得。
ax1.plot(channels, fitting(channels, *paramater_optimal),
         lw=1.5, ls='--', c='k', label='fitting curve\n' + \
         f'$R^2$ = {np.corrcoef(counts, fitting(channels, *paramater_optimal))[0][1]}')

#二次関数のパラメーターを利用したいので、スライスで取り出す。
a0, b0, c0 = paramater_optimal[0:3]

ax1.plot(channels, quadratic(channels, a0, b0, c0), c='b',
         label=r'$y = a_0 + b_0x + c_0x^2$' +'\n'+ f'$a_0$ = {a0}\nb$_0$ = {b0}\nc$_0$ = {c0}')

#各meanをグラフ上に表示する。繰り返しのため for 文を利用。
for i in range(3,12,3):
#この関数内の、a0, b0, c0 はグローバル変数である。
    def quadratic_gauss(x, *paramaters):
        a1, sigma1, mean1, = paramaters
        return quadratic(x, a0, b0, c0) + \
               gauss(x, a1, sigma1, mean1)

#annotate で Axes 内にテキストや矢印を表示できる。
    mean = paramater_optimal[i+2]
    ax1.annotate(int(mean), fontsize = 14,
                 xy=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+3),
                 xytext=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+15),
                 ha="center", va='top',
                 arrowprops=dict(shrink=0.05, facecolor='k'))

#凡例の表示。Figure の判例を出力することもできる。
ax1.legend(loc='upper right', frameon=False)

gs.tight_layout(fig) #グラフ描画前に行うべし。慣例では、fig.tight_layout()
plt.show(fig) #慣例では plt.show() と fig を指定しない。

参考文献やサイト

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

matplotlib や numpy が簡単ではありますが、まとまっています。

matplotlib や numpy の取り扱いで大変役に立ちました。

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

主に、pandas の取り扱いを参考にしました。

非プログラマーがPythonを学ぶために読んだ本

関連:Pythonでスペクトルのフィッティング - 最終防衛ライン3

プログラミングの経験はほとんどないのですが、最近Pythonの勉強を始めました。自分のやりたいことがそれなりにできるようになりつつあります。いろいろな本を購入したり、図書館で借りたりして勉強したので、折角なのでそれらをまとめておきます。
プログラミング未経験者ではないものの、興味のある人がぴったりのまとめだと思います。
私の目標は、業務で扱う大量のデータ処理の自動化が主で、機械学習にもつなげられたらと考えています。特に科学技術計算を自動化したい。たとえば、大量のデータを同一フォーマットのグラフとして出力するなどですが、この目標は既に達成できました。

1. 私のプログラム歴

プログラム歴はほとんどありません。ビギナーに毛の生えた程度だと思います。

ゲーマーなので、プログラム的なものの親和性は普通の人よりは高いでしょう。一応、HTMLもCSSもそれなりに書けるので、それもアドバンテージではあります。また、大学の授業で一応はC言語をやったので、整数型、浮動小数点型などがあるのも知っています。ただし、それが面倒くさすぎてプログラムを諦めた口です。

その後にウェブページを弄るために、JavaScriptなども触ってみましたが、既存のプログラムを流用するだけだったため、基本的なことが分からず、結局やめてしまいました。
Pythonもたくさんのコードが公開されているので、それらを流用すればそれなりのことができるはずですが、JavaScript に手を出した時の二の舞にならないためにも、基礎をしっかり勉強しようと考え、本を購入したり、図書館で借りたりして、独学で勉強しました。

2. 一ヶ月勉強して、できるようになったこと

基礎を勉強してから、他人のコードを流用しつつ、理解できない部分があったらwebで調べたり、本を読んだりしていたら、大体一ヶ月くらいで、最初の大きな目標に到達できました。
たとえば、スペクトルのフィット:例2 のようなスペクトルのフィッティングができるようになりました。フィッティングなら、有料ソフトを使えば可能ですが、無料かつ自動化が容易なのが Python の利点でしょう。

f:id:lastline:20180411152639p:plain
Pythonでスペクトルのフィッティング - 最終防衛ライン3

pandas で CSV ファイルを読み込み、numpy と scipy.optimize でフィッティングし、それらのデータを matplotlib で描画したグラフを示します。カーブフィッティングを含めた、グラフの描画に関しては、近いうちにエントリーを書くつもりです。

また、私が使用している3DCGソフトであるShadeのスクリプトPythonなので、それが書けるようになったのは渡りに船でした。

クラスの取り扱いがまだまだ不慣れです。自分用のプログラミングなら、そこまで必要はないですが、今後自動化を進める上でも、できるようになった方が楽ができるので、精進するつもりです。

3. 非プログラマー向けの入門書

プログラミングの経験のない人向けの本を紹介しますが、場合によってはもっと簡単な本の方が向いていることもあるでしょう。たとえば、Pythonではなく、プログラミングの概念を紹介している本など。

多くの入門書が、オブジェクトやクラスの説明をかみ砕こうとしていますが、そのほとんどは飲み込めるまでには至っていません。そもそも、それらを理解するには、プログラマー向けの本を読むべきだと思います。また、初等ならばそのような概念があることを頭に入れておく程度で充分でしょう。

どのように書くか、そして何ができるかを指し示した本が、入門書として最適だと考えます。
コードを見ながら入力することを念頭においているため、大判の本を選びました。「みんなのPython」はA5版で小さいため、このような用途には向きません。ハンドブックとして使うには丁度よいサイズではありますが。
広げて読むことを念頭に置いたので、基本的には電子版ではなく書籍を購入しました。広い画面とリッチなタブレットがあれば、電子版でも良いかも知れません。

ここで紹介していない本も、いくつか本屋で見繕ってみましたが、ゲームや会話AIを作る本などは、実践が重視されすぎていて基本が疎かになっている場合が多く、基礎を学びたい自分には適当ではないと感じました。

Pythonスタートブック

オススメ度:☆☆☆☆

Pythonスタートブック [増補改訂版]

Pythonスタートブック [増補改訂版]


プログラミングの経験がなければ、まずこれから始めると良いでしょう。ただ、Python 2をベースに書かれていたので、購入は見送りました。
最近、改訂版が出たので、そちらの購入をお勧めします。

実践力を身につける Pythonの教科書

オススメ度:☆☆☆☆☆

プログラマー向けの入門書として、非常によくまとまっています。基本から、少し発展的なことまでできる構成になっているので、次へとつなげることもできます。
説明も過不足なくなされており、初心者がつまずきやすい「なぜ」を解消できるので、プログラミングの入門書としてもオススメです。

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

オススメ度:☆☆☆☆
コードやその結果を対比しやすいレイアウトが特徴。余計な図がなく淡々としています。各ライブラリについて、一通りの結果が示されており、割と細かいことまで明示されているので、レシピブックとしても有用です。

本書のコードを一通り書き写せば、基本的なことは身につきますが、淡々としているので、なかなかつらい作業です。Pythonでやりたいことが明確でないと、挫折するかも知れません。

行列を扱う Numpy や グラフ描画のための matplotlib にも軽く触れられており、科学技術計算を目標としている自分としては、役に立ちました。

確かな力が身につくPython「超」入門

オススメ度:☆☆☆

前半は非常に分かりやすく、丁寧に説明されています。図がイラストレーターの方によるものなので、プログラミングの本としては分かりやすいのが特徴です。むしろ、プログラミングの本の図はなぜ分かりづらいのが多いのか。
入門書の中では、オブジェクトやクラスの説明が比較的分かりやすかったです。ただ、後半の実践は「何ができるか」は示される者の、前半で散々説明された「なぜそうするのか」が皆無のため、自分が何をやっているのかが分かりづらいです。つまり、前半と後半のギャップが非常に大きいです。
後半は、Pythonでできることの例示と割り切って読むのもありでしょう。

特に、Webスクレイピングとして Amazon を扱うのはいただけないです。先ず、本書の通りにコードを書いて実行しても同じ結果が得られません。それは、本書の執筆時から、AmazonのHTMLの構成が変更されているため。また、本書を元に書き換えるにしても、 AmazonのHTMLの構成は、非常に解析しづらいです。そもそも、規約上は禁止されていますし。

学生のためのPython

オススメ度:☆☆☆

学生のためのPython

学生のためのPython

学生のためと銘打っているだけあって、他の入門書よりも簡単でした。説明も分かりやすいですが、少々かみ砕きすぎで、正確性に欠ける向きもあります。基本的なことは理解できますが、発展には弱いので、きちんと勉強したい人には物足りないかも知れません。
turtle での描画を軸にコードが例示されるので、結果が見た目でわかりやすいのも初学者向きかなと感じました。

簡単なフラクタルを描画するため、高階関数まで扱っているのが他の入門書にはない特徴で印象に残りました。

Pythonプログラミングのツボとコツがゼッタイにわかる本

オススメ度:☆

Pythonプログラミングのツボとコツがゼッタイにわかる本

Pythonプログラミングのツボとコツがゼッタイにわかる本

ブラックジャックのゲームプログラムを作成し、それをウェブで対戦できるようにしたり、また対戦AIなどを作ったりします。
とりあえず Python で動くプログラムをを作ってみたい!って人には向いていると思いますが、書籍の完成度としてレベルが低いので、個人的にはオススメしません。

著者代表は人工知能の専門家で、人工知能のパートはその方によるものですが、その他の部分は大学生が執筆してるようです。大学生が執筆したパートを著者代表がきちんと監修しているように思えません。文章は平易ではありますが、構成がよくありません。図などを見れば分かりますが、非常に理解しづらいです。

4. 非プログラマーPythonビギナー向き

コードは読めるし、書き方は分かるけど、何ができるか分からない人向けの本を紹介します。
自分のためにプログラムを書くのに適した本を紹介します。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

オススメ度:☆☆☆☆

「何ができるか」の特化した本です。初心者向きではありますが、それなりにPCに詳しくないと躓く部分が多々あります。Pythonを体系的に学ぶには向いていません。
色々な演習も用意されており、O'Reilly Japan - 退屈なことはPythonにやらせよう に回答が用意されているので、基礎を学んでチャレンジすると、それなりの歯ごたえがあります。

Webスクレイピングだけでなく、CSVExcel、PDF、Wordの操作など、主に事務作業の自動化に特化しています。Word や PDF の処理などは、他の本ではあまり取り扱っていない話題なので、その辺に興味のある人にもオススメです。

速習 Python 3

オススメ度:☆☆☆☆

上編を読めば、Pythonの基礎は身につきますが、非プログラマーには説明が不十分な箇所もあります。また、プログラミング経験者には優しすぎるかもしれません。Python にどんな特長があるのかをさっと読むには適していますが、それなら公式ドキュメントを読むべきでしょう。

中編では、プログラミングの概念や哲学について書かれており、関数型、オブジェクト指向、クラスなどが理解できない自分は、とても役に立ちました。
初学者向きとしては、クラスなどを使う利点がわかりやすい事例で丁寧に説明されています。

世界標準MIT教科書 Python言語によるプログラミングイントロダクション第2版

オススメ度:☆☆☆

プログラムを学ぶ大学生のための教科書です。プログラミング経験のない人には少々難しいかもしれません。
実践向けのプログラミング例もありますが、例示の内容が限界利益率の計算などやや古典的です。レイアウトや配色も、少々読みづらいです。

5. プログラマー向けの入門書

プログラミングの経験のある人向け、あるいは初心者向きの入門書を読破した人向けの本を紹介します。中級者向けと思われる本も含めています。結局、オライリーになっちゃうよね。

入門 Python 3

オススメ度:☆☆☆☆☆

入門 Python 3

入門 Python 3

例示が小粋で面白く、それでいて細かな点も過不足無く説明されています。。
章ごとにステップアップしていき、また少しだけ先の章を先取りするなど、理解のしやすい構成になっています。
プログラマーには少々難しいですが、これから挑戦するのもありでしょう

Python 3 プログラミング徹底入門

オススメ度:☆☆☆☆

Python 3 プログラミング徹底入門

Python 3 プログラミング徹底入門

  • 作者: マーク・サマーフィールド,Mark Summerfield,長尾高弘
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2009/12/01
  • メディア: 単行本
  • 購入: 1人 クリック: 61回
  • この商品を含むブログ (21件) を見る

私は三冊目に手を出したのですが、「なせそうしなければならないか」を理解する上で役に立ちました。たとえばメソッドや関数の実行方法。なぜメソッドを「ドット」でつなげるのか。なぜ import文には、色々な書き方があるのか。そして、どのような書き方が推奨されるかも。

初学者向けの本でも「なぜそうしなければならないか」は書かれていますが、ツッコんだ説明まではなされていません。プログラムを本格的に学ぶ人に書かれているため、その点もきちんと書かれています。演習問題も適度に難しく作られているので、力がつきやすいです。

Python3の本ではありますが、2009年に出版されたため内容が古いのが残念です。原本の第二版が出版されていますが、日本語訳はないようです。プログラミングの知識がない人が英語で読むには難しい内容だと思います。

Effective PythonPythonプログラムを改良する59項目

オススメ度:☆☆☆☆☆

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

より読みやすいPtyhonのコードを書くための本。見た目は薄いですが、内容は濃いです。どのように書くべきに留まらず、なぜそう書かなければならないかがきちんと示されています。
基礎が固まってきたら、変なクセが付く前に読んでおくと独りよがりなコードを書かなくてすみそうです。
邦訳がやや残念なので、英語が読めるなら英語版の購入をお勧めします。

6. レシピ集

組み込み関数やモジュールをいちいち覚えられないので、リファレンが手元にあると便利です。
プログラマー向けの入門書がレシピブックとしても流用できるので、それらを持っているなら購入する必要はないかなぁと思います。

pythonライブラリ厳選レシピ

オススメ度:☆☆☆

Python ライブラリ厳選レシピ

Python ライブラリ厳選レシピ

一通りは載っていますが、多くのビギナー向けの本がレシピブック集としても機能するので、それを所有していると、かゆい所に手が届かないと感じました。著者が日本人なので、日本語の取り扱いについても書かれているのが利点でしょうか。

逆引きPython標準ライブラリ 目的別の基本レシピ180+!

オススメ度:☆☆☆☆

逆引きPython標準ライブラリ 目的別の基本レシピ180+! (impress top gear)

逆引きPython標準ライブラリ 目的別の基本レシピ180+! (impress top gear)

評判が良かったので購入しましたが、やはりビギナー向けの書籍を持っていると少々物足りなさを感じました。
A5版は手に取りやすいのでレシピブックとしては最適な大きさだと感じました。

7. 科学技術計算、データサイエンス、ディープラーニング

私が科学技術計算を目標としているので、そのために読んだり、購入したりした本を紹介します。

これ一冊あれば大丈夫!という本がありません。特に、グラフを描画するための Matplotlib がなかなかのじゃじゃ馬で、これに特化した専門書が欲しかったのですが、見つけられませんでした。最近、公式ドキュメント*1が改定され、読みやすくなったそうですが、初心者が読むにはハード。お陰で、関数やクラスの勉強にはなりましたが。

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

オススメ度:☆☆☆

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

どのような対象に向けて書かれているのかがよく分からない本でした。
Numpy, Scipy, Matplotlib, pandas などが紹介されているものの、簡単なメソッドしか紹介されていません。これは高速化も同様で、この本を読んだからといって科学技術計算ができるようになるわけでも、コードを高速化できるようになるわけでもありません。

私にとっては、Pythonが科学技術計算に向いていることを再確認するためのアリバイ作りのような本でした。科学技術計算をPythonで始めようと思っている人を後押しする本と考えると最適化も。

巻末にPythonの組み込み関数と標準ライブラリ、およびNumpyの関数リファレンスがまとめっているのは便利でした。

Pythonによるデータ分析入門 : NumPy、pandasを使ったデータ処理

オススメ度:☆☆

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

pandas や Numpy およびそれをIPyhonで扱うための本です。評判は良いのですが、残念ながらPython2ベースのため、Python3と互換性のないコードで書かれている箇所が多々あります。

第二版が出版されましたが、邦訳版はまだ発売されていません。

Python for Data Analysis: Data Wrangling with Pandas, Numpy, and IPython

オススメ度:☆☆☆☆

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

というわけで、英語版を購入しました。レシピブックなので、英語が分からなくてもそんなに困らないと思います。

ただし、そのまま利用すると、日本語ファイルを取り扱う場合にエラーが起こる可能性があります。自分で解決策を見つける力が必要です。
日本語を扱わない手もありますが、それじゃあクールじゃないですよね。

Pythonによる科学技術計算 基礎編

オススメ度:☆☆☆☆☆

早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiitaはてなブックマークのコメントで紹介されていたので読んでみたのですが、説明が丁寧で分かりやすかったです。

Matplotlib の記述法として、MATLAB準拠とオブジェクト指向の違いがきちんと説明されているのがすばらしいです。多くのデータサイエンスの本では、その点が全然書かれていないんですよねぇ。

Scipy Lecture Notes

オススメ度:☆☆☆☆☆

書籍ではありませんが、非常によくまとまっています。残念ながら日本語版は2015年で更新が止まっていますが、それでも十分に役に立ちます。SciPyを中心としたガイドではありますが、Matplotlib のレシピ集やクイックリファレンスが大いに役に立ちました。
その他に、SciPyによる画像処理などもまとまっており、一度目を通しておくのをオススメします。

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

オススメ度:☆☆☆

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

データ処理のレシピが一通りまとまっており、何ができるのかをざっくりと見渡せますが、コードに関しても理論に関しても、紹介に留まっており、ツッコんだ説明がありません。たとえば、なぜそうするのか、関数を実行した際に何が返ってくるのは書かれていません。
入門書としては微妙だと感じました。統計処理を中心に学びたいのなら役に立つのかも。

ゼロから作るDeep LearningPythonで学ぶディープラーニングの理論と実装

評判が良いので購入してみましたが、まだ読めていません。

8. 私の勉強方法

最後に、私の勉強変遷をまとめておきます。

先ず「詳細! Python 3 入門ノート」を一通りやって、基本的なことを身につけました。次に、目に見える実践的なことをやりたかったので「退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング」を6章くらいまで演習をやりながら、進めました。
「退屈なことはPythonにやらせよう」の演習問題はプログラミング的な思考の勉強にはなりましたが、関数、メソッド、オブジェクト、クラスなどが今一つ把握できませでした。裏を返せば、それらを意識する必要があまりないので、初心者の演習としては丁度良かったかも知れません。

クラスを理解したかったので、内容は難しかったのですが「Python 3 プログラミング徹底入門」に挑戦してみました。その合間に「確かな力が身につくPython「超」入門」や「学生のためのPython」を読みつつ、図書館や本屋でPythonの本を漁っていました。
それと並行して、matplotlib や pandas などを利用してグラフの作図などを始めました。できる範囲でやりたいことを実現させた方がモチベーションを維持しやすいです。その際に「Pythonによる科学技術計算 基礎編」が役に立ちました。
これを読むために、Kindle Unlimited を再契約したのですが、「速習 Python 3」もKindle Unlimitedだったので試しに読んでみたら、中編がちょうど知りたかった、関数、メソッド、オブジェクト、クラスを取り扱う内容で、理解が深まりました。合わせて「Python 3 プログラミング徹底入門」もそれらの理解を助けてくれました。
さらに、Shadeのスクリプトも書いていました。こちらは、結果が見えやすく、実践につながるため、Pythonを勉強するモチベーションにもなりました。

現在は、「入門 Python 3」や「Effective PythonPythonプログラムを改良する59項目」などを読み進めています。

諸君 私はスカイリムが大好きだ

Nintendo Switch版は弓の狙いをジャイロでつける

気がついたらNintendo Switch版のスカイリムがリリースされていたので、ダウンロード版を購入していた。
Nintendo Switch版ならではの機能として、モーションコントロールamiiboなどがあるものの、どちらも試していない。モーションコントロールについては後述するが、amiiboはそもそも持っていない。
地味に嬉しかったのは、弓をジャイロで操作できる点。ブレスオブザワイルドのような操作感で弓を扱うことが可能だ。

Nintendo Switchの魅力は手軽さ

PS3版で飽き足らず、PC版も購入し、スペシャル・エディションもプレイして尚Nintendo Switch版に手を出す意義は、やはり持ち歩けることにある。
とはいうものの、Nintendo Switchのバッテリーは長くもたないので、結局、家の中で遊ぶことになるけれど。それでもプレイできる場所を選ばないのは魅力的だ。ソファにベッドに、トイレでだってできる。もちろん、Android 端末でリモートプレイすることも可能だが、ゲームをスタートするまでのセットアップが多くて面倒だし、スマートフォンでゲームをやりながら、他のアプリを使うのは、なかなかに煩わしい。その点、Nintendo Switchならさっと始めることができるし、スマートフォンもフリーになる。スリープ機能もあるので、すぐに止められるし、再開もしやすい。これらの点が、ゲームをゲーム専用ハードで遊ぶ利点だろうか。ただまぁ、スカイリムはバグが多いため、MODを導入しない場合でも、コンソールを使用できるPC版でプレイした方が快適だけども。

モーションコントロールは、コントローラーを本体から外すのが面倒なので試していない。Nintendo Switch版の魅力である手軽さが失われてしまうためだ。
スカイリムに限ったことではないが、本体からコントローラーを外すのは、思った以上に億劫である。かといって、外しっぱなしで運用はできない。なぜなら、コントローラーにもバッテリーが内蔵されているからだ。適宜充電するために、本体などにスライドさせながら接続する必要がある。このスライド機構がなかなかに手間である。
マリオ・オデッセイではモーションコントロールにより、多彩なアクションを繰り出せるのだが、コントローラーを外すのが面倒で主にProコンで遊んでいた。今後も、モーションコントロールを使ったゲームがリリースされるだろうから、コントローラーを本体から外した状態で運用できればいいのになぁとつくづく思う。たとえば、コネクタを接続してコントローラーの充電ができれば、本体から外したままにしておけるのに。

Nintendo Switch版のスカイリムで気になったのは、画面がやたらと暗いこと。モニターへ出力する場合は、モニターの輝度を上げれまくればよいが、Nintendo Switch本体の画面だと、輝度を最大にしても暗い。恐らく、この暗さが本来想定される明るさなのだろう。松明や周囲を明るくする「灯明」などの魔法が用意されているのに、それを使わずにプレイできていたのが、異常なのである。
画面の暗さが気になるなら、種族をカジートにするか、早々にドーンガードを初めて吸血鬼になって、固有パワーである「暗視」を使う手もある。

プレイ開始時におけるロードの長さが気にはなるが、スペシャル・エディションのロード時間が短すぎただけで、通常版と比較すると、そんなに変わらないかもしれない。そもそも、スペシャル・エディションは通常版よりも画質が高いはずなのにロードが速い。恐らく、最適化がなされているのだろう。

スカイリムを通算1000時間くらいプレイしているのでは

繰り返し遊んだゲームとしては、FF5聖剣伝説2クロノ・トリガー夢をみる島メタルギアソリッドなどがあるが、プレイ時間を合算するとスカイリムが一番長いのではなかろうか。

FF5はジョブによって、攻略の幅がある点が何度もプレイしたくなる所以だろう。クロノ・トリガーは「つよくてニューゲーム」の恩恵が大きい。移植される度に、結局周回を重ねてしまう。
夢をみる島メタルギアソリッドシリーズは、ゲーム内で色々なアクションを起こせることが楽しい。
これらの4作はゲームプレイの幅があるのが特徴で、これはスカイリムにも通じる。聖剣伝説2は攻略の幅はあまりない。それでもついついプレイしたくなるのは、聖剣伝説2の中を歩き回るのが楽しいからだ。つまり、純粋に共に箱庭感が好きなのだろう。この箱庭感は、夢をみる島メタルギアソリッドシリーズ、そしてスカイリムにもあり、スカイリムはその中でも随一の世界観である。

また、スカイリムはランダム性が高い。クエスト数が非常に多いため、攻略ルートには様々な組み合わせが存在し得る。また、ランダムクエストとしてドラゴンが振ってきたり、暴漢に襲われたりもする。時には、その両方が起こることもあるし、クエスト中に発生することすらある。そのため、同じようにプレイしても、異なるシチュエーションが発生しやすい。たとえば、私は懐を暖めるために盗賊ギルドのクエストから始めることが多い。それでも、メインクエストの進行度合いやレベルアップの具合、サイドクエストの受註などによって、毎回異なる体験をしているように感じる。

盗賊ギルドの利点はトニリアの存在である。彼女は盗品を買い取ってくれるが、それ以上にプレイヤーにとってありがたいのは、なんでも買い取ってくれることだろう。スカイリムの店主は特定のアイテムしか買い取ってくれないが、トニリアなら文句を言わずにゴールドに換金してくれる。その上、所持しているゴールドが多いのも大変嬉しい。
盗賊ギルドの欠点は、隠術のスキルばっかり上がって、その結果敵のレベルも上がってしまうことだ。戦闘スキルが釣り合わなくってしまう。これは、敢えてレベルを上げないことで回避することも可能ではある。それを補うために、闇の一党を進めても良い。

今回は、この後にメインクエストを進めて、ドラゴンレンドを取得してから、闇の一党なりドーンガードを進める予定だ。スペシャル・エディションをプレイした際に、ドラゴンを出現させないままゲームを進めたら、ドラゴンソウル不足に陥ってしまった。ドラゴンの出現しない世界は快適ではあったけども、シャウトが使えなくなるのは厳しい。
ちなみに、ドーンガードで吸血鬼になるなら、同時に闇の一党を進めると、暗殺しながら吸血鬼のスキルを上げることができて一石二鳥である。

薬疹の原因をDIYする羽目に。「医者はなんのためにあるんだ!!」

薬でアレルギーが出て全身にじんましんが出たのですが、薬局も皮膚科もまったく当てにならず、結局自分で原因となる薬を特定する羽目になりました。お薬手帳も役にたってない。

原因は、恐らく腰痛で処方された湿布薬と痛み止めで、経皮と服用から二つの経路で同系統の成分を摂取したことで、アレルギー反応が出やすくなったのだと思います。
当初は湿布薬のみが原因だと考えていたのですが、全身の赤身が引くどころか手足にも広がっていきます。おかしいなと思い、薬について自分で調べたら、痛み止めが湿布薬と同種の薬効であることが判明。そこで、痛み止めの服用とやめたら症状が引いて行きました。

痛み止めが原因であると特定する以前に、薬局で飲み合わせの確認や、皮膚科にも行ったのですが、飲み薬を止めるよう説明されませんでした。
知人の内科医に愚痴混じりにこの話をしたら、全身に症状が出ているなら、内服薬に決まっているよねとのこと。また、薬に関しても、ダメ押しで薬局に確認したら、湿布薬と痛み止めが同系統の薬なので、アレルギー反応が出たら、二つとも使用を止めるべきとも言われました。なぜ、それをもっと早く言わないのか。かかった皮膚科と調剤薬局が無能すぎたのでしょうか。対処をDIYしなければならないなら「医者はなんのためにあるんだ」。そりゃ、医療系デマサイトが蔓延るよなぁ。

ググレカス

アレルギーの症状が出たのは、ロキソプロフェンナトリウムの湿布薬と、セレコックス錠。ロキソプロフェンナトリウムはCOX1とCOX2阻害、セレコックス錠はCOX2阻害で、共に炎症や痛みを抑える薬です。私は、腰痛で整形外科へ行ったら処方されました。

処方されたロキソプロフェンナトリウムの湿布薬はカプサイシン入りだそうで、薬局で肌に合わなかったら使用を止めて下さいと言われました。今にして思えば、その言葉が余計な先入観になって、何かあったら湿布薬は貼らずに、痛み止めだけ飲めばいいやと考えていました。
湿布薬を貼ってみると、体中がポカポしました。そして、なぜか体中から唐辛子の臭いがしました。ただ、思い返してみると、これは恐らくアレルギーの症状だったのでしょう。

アレルギーの症状が出てからは、湿布薬はやめて痛み止めとしてセレコックス錠のみを飲んでいました。痛み止めもアレルギーの原因だったので、症状が引かないのは当たり前なのですが、薬局で飲み合わせの確認をしてもらって、また皮膚科にかかっても抗アレルギー剤は処方されましたが、内服薬の方は見向きもされませんでした。
後から分かったことですが、湿布薬なら貼ったところを中心に症状が出るはずですし、使用を止めたのに症状が全身に広がるのはおかしいです。

症状がまったく引く気配がなく、広がるので、ググったらセレコックス錠もアレルギーの原因になり得ると。で、再度薬局にかかったら、ロキソプロフェンナトリウムと、セレコックス錠は同系統なので、どちらかでアレルギー反応が出たら、両方とも使用を止めるべきと言われました。

律儀にお薬手帳を持っていたので、特定する際に調べやすかったのですが、それは本来薬局がするべき仕事でしょう。別々の病院から処方された薬ならまだしも、同じ整形外科から処方された薬です。湿布薬を止める際にも、薬局に相談し、その後に皮膚科で抗アレルギー剤が処方された際にも確認しているのに、痛み止めにはまったく注意が払われていませんでした。
結局、自分で原因を特定して、薬局に確認したら、おっしゃるとおりですとの対応されました。今回は、幸いにも症状が軽かったんですが、重くなる場合もありえます。皆さんも、ご注意下さい。おかしいとおもったら、しつこく聞くくらいが調度よいのかなぁと思いました。