DISTRICT 37

なにか

mysqlclientでCRUDする

というよりmysql-connector-pythonがインストールできなかった。

dragstar.hatenablog.com

mysql-connector-pythonをpipからインストールしようとしたら下記のエラーが出た

Could not find a version that satisfies requirement mysql-connector-python(from versions: )
No matching distribution found for mysql-connector-python

残念だが君はバージョンを満たしてないようだね。というご宣託。

MySQL :: MySQL Connector/Python Developer Guide :: 3 Connector/Python Versions

公式リンクによるとpython3.3と書いてあるのでPython3.5の僕はアウトらしい。ということでmysqlclientをしばらく相棒にしようかと思う。インストールはpipで。

pip install mysqlclient

エラーがでるようならaptでライブラリを入れておく

sudo apt insatall libmysqlclient-dev

接続と終了

import MySQLdb

con = MySQLdb.connect(
        user = "user",
        passwd = "pass",
        host = "yourhost",
        db = "yourdb")
cur = con.cursor()
cur.close
con.close

以降はこの接続と変数を使うという前提です

Read(SELECT)

CRUDといいながらまずはセレクト

cur.execute("select * from tbl")
for row in cur.fetchall():
    print(str(row[0]))

cur.close

Create(INSERT)

続いてINSERT

cur.execute("INSET INTO tbl(id, value) VALUES (1, 100)")
con.commit
cur.close
con.close

一括INSERTはこんな感じ。

cur.executemany("INSET INTO tbl(id, value) VALUES (%s, %s)", [(1, 100), (2, 200), (3, 300)])
con.rollback
cur.close
con.close

Update

なんかSQLさえ流せればという感じがしてきた。

cur.execute("UPDATE tbl SET value=400 WHERE id = 2")
con.commit
cur.close
con.close

Delete

結局これも。

cur.execute("DELETE FROM tbl WHERE id = 3")
con.rollback
cur.close
con.close

まとめ

途中でも書いたけど、SQLさえかければという感じがする。というよりRDBのドライバに求められているのって結局それなんでしょうね。あとはJavaでいうところのPreparedStatement#addBatch()みたいなやつが欲しいんだけどなぁ。どうだろ?Documentを探せばあるかな。

Welcome to MySQLdb’s documentation! — MySQLdb 1.2.4b4 documentation

Pythonのドライバがいくつもある件

どのドライバ使えばいいんだってばよ

なんでこんなにあるんだ

ここにいくつもある

MySQL - Python Wiki

で、日本語で情報が検索できたものとしてピックアップしたのがこのへん

概要を表にしてみた

プロダクト python2 python3 備考
PyMySQL PyMySQL3ってのがあったけど今はこれ1本
mysql-connector-python MySQL公式
MySQL-Python × Python3には使えない
mysqlclient × 3を使えないMySQL-Pythonを3に対応したもの

PyMySQL

github.com

PurePythonを謳うドライバ。ググるとだいぶ上位に出てくるので、まずは試そうかなという気持ちにさせられる。python2系とpython3系の両方に対応している。

mysql-connector-python

MySQL :: Download Connector/Python

公式によるドライバ。公式ってことはですよ、あのOracleのサポートでもあるんですよ。心強いですねぇ。これがドライバを試す初めの一歩にはいいと思います。

MySQL-Python

Index of Packages : Python Package Index

古株のドライバらしいんですけどね、python3には対応してないっていう。比較的新参pythonistaなので、僕はpython3を使っている。よってこれはお話になりませんという話。python3に対応するよって言いながらここ何年も進んでいない気がする。

mysqlclient

pypi.python.org

という事で業を煮やしたハッカーが、MySQL-Pythonからforkしていって、しまいにはpython3に対応したというオープンソースならではのプロダクト。WebフレームワークであるDjangoの推奨ドライバにもなっているので導入しておいて損はないかも。

まとめ

mysql-connector-pythonをメインに使って、適材適所で他のドライバを使うのがいいかと。サブとしてDjango用にmysqlclientも入れておくと隙が無い。

TBSラジオポッドキャストからTBSクラウドラジオへ

あーあ

www.itmedia.co.jp

Podcastを支えたTBSラジオ

これまでAppleはいろいろなサービスをiTunesをはじめとしたプロダクトに組み込んできたが、いくつか死んでいったサービスもある。その中でPodcastは死ななかった。なぜか。PodcastTBSラジオがあったからこそ死にコンテンツにならなかったんだと思っている。だいぶ誇張してしまったけど、日本以外の事情はしらないので間違っているともいえる。そのTBSラジオがこのたびPodcastでの配信を停止してストリーミングサービスに移行することになった。確かに金も払わずにサービスだけを受けていたのでマネタイズできんと言われたらなんも言えない。

TBSの聴衆率を上げることが目的ではなかったのか

Podcastが始まった10年前に、TBSラジオがどのような目的でPodcastを始めたのかはわからない。ただ新しい波に乗っかってみただけなのかもしれない。タマフルなんかはプロデューサーの感覚が若かったのかいち早く導入し、初期の初期は全コンテンツに加えていまは特別なときにしかやらない放課後も毎週配信していた。Podcastではしきりに本放送も聞いてくださいねと言っていたのを覚えている。ラジオ本体を配るなんて事もやっていた。ラジオリスナーが減っている昨今で、Podcastをきっかけにしていかにしてリスナーを増やすかを試行錯誤していた。

タマフルや土曜日も含めたJunk、今は終わってしまったがキラキラといった日中のワイド番組をPodcastをきっかけに聞くようになったリスナーも少なからずいると思う。そういう意味で目的を果たしたから次のステージへという事だろうか?TBSクラウドラジオに移行することでこれまで積み上げてきたものが崩れてしまわないか心配してしまう。もちろんだれだって金は欲しいし、金にならないサービスを続ける意味を問われたら当然窮してしまう。この決断がラジオへの入り口を狭めてしまい、結果として将来のラジオリスナーを減らしてしまわないことを願う。

ラジオを聴くシチュエーションとPodcast

特別な事情が無い限り、ラジオは「ながら」で聞くものが一般的だと思う。勉強しながら、運転しながら、料理しながら。その中でも移動しながら、つまり通勤通学しながらというのがよくあるのではないだろうか?そしてその場面にマッチしたのがPodcastであった。radikoもそうだがストリーミングとなると通信料とか気になるし地下だったり新幹線だったりでまともに電波を拾えるかは保証できない。Podcastでダウンロードしておけばいつでもラジオを聴けるというのがリスナーにとって本当にいいサービスだったのだと思う。

TBSクラウドラジオはYouTubeになりえるか

ストリーミングサービスといえば言わずと知れたYouTube。ダウンロードできないとかそんな事で不満を言っている人はいない。電車の中でYouTubeを見ている人なんてちょっと探せばすぐに見つかる。TBSクラウドラジオもストリーミングサービスとしてその位置に並ぶようになれば安泰だ。きっとライフスタイルも変わっていいものになる。なんならradikoだってあるし。

さいごに

あまりにも僕の日常の一部だったので悲観的な見方しか今はできない。でもTBSクラウドラジオのアプリが出るようになったら変わってくるかな?それにしても東京ポッド許可局なんてどうするんだろ、ポッドキャスト関係なくなるじゃん。

Ubuntu15.10にScrapyをインストール

データがなければ自分で加工すればいいじゃない

Scrapyとは

Scrapy | A Fast and Powerful Scraping and Web Crawling Framework

ScrapyとはPythonスクレイピングライブラリというかフレームワークで、Webサイトの情報を抽出することができる。要はFireFoxとかChromeといったWebブラウザを使ってWebサイトを見るのではなく、プログラムがWebサイトを見る事を可能にするものだ。Pythonにはいくつかスクレイピング用のライブラリがあるのだが、情報も多そうだしScrapyを使っていこうかと思う。

インストール

pipで一撃

pip install scrapy

といいたいところだけど、Ubuntu15ではライブラリがいくつか必要だった

sudo apt install libxml2-dev libxslt1-dev libffi-dev

これをした後にpipしたらできた。

Python関連のプロジェクトはSphinxを使ったドキュメントがそろってていいね。

Scrapy 0.24 documentation — Scrapy 0.24.6 documentation

何を得て、何を失ったか。映画「スリーデイズ」

いやー、こういう映画大好き。

スリーデイズ [DVD]

スリーデイズ [DVD]

リーアムニーソン映画ではない

繰り返す。これはリーアムニーソン映画ではない

ameblo.jp

リンク元と同じようにこの話のあらすじを知った時に「これはリーアムニーソンパターンだな」と勝手に思ってた。実際リーアムニーソンも出るし。ラッセルクロウはただのおっさんではなく本当は凄腕の元エージェントかなんかで、エンディングでは監獄が爆発して脱獄に成功した嫁とキスをしながら終わる映画だなとか云々かんぬん。

チンピラにボコボコにされたり、合鍵作戦に失敗して嘔吐したり、偽造パスポートを取得するときにも「焦りすぎ、あんたみたいなやつは失敗するよ」とか忠告されたりと、ハリウッド界隈でよく見かける超人とはかけ離れた存在となっている。そりゃそうだ、もし自分の奥さんが無実と思われる罪で投獄されても脱獄させようなんて思うだろうか?よしんば脱獄させようと決心したとして、平常心を保ち続けることができるだろうか?

何を得て何を失ったか

結果として脱獄は成功する。その過程でジョンは人を殺す。妻ララは人を殺していないのにだ。家族三人、新たな地で過ごすことができるようになりハッピーなはずだが、ジョンの表情がなんとも表現しがたい。

はたしてこれで良かったのだろうか?この家族のこの先を思うとハッピーエンドといっていいのだろうか?得たものと失ったものの評価がどうもできない。

ただ、脱獄させる過程は素晴らしく面白い。ここまで綿密な計画だったとはとうならされる。

Pythonで近似曲線を描く

Rでやった事をPythonでもやる。

dragstar.hatenablog.com

準備

  • scipy
  • numpy

ライブラリはこの辺を使う。データも前回同様気象庁のデータを使います。

ライブラリの準備

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
from scipy import optimize as opt

データを読み込みと確認

kion = pd.read_csv("kion_20160501.csv")
kion.head()

やはりこんな感じで内容が得られる。pandasマジ便利

time temp
0 2016-05-01 00:00 13.9
1 2016-05-01 01:00 13.9
2 2016-05-01 02:00 12.3

早速プロット

Px = np.arange(0, len(kion), 1)
Py = kion['temp']
plt.plot(Px, Py)
plt.show()

f:id:dragstarclassic:20160524141120p:plain

今回もこのプロットに対して近似曲線を描く

scypi.optimize.curve_fitを使う

{ \displaystyle
y = ax{^3} + bx{^2} + cx + d
}

例によって上記のモデルの変数a, b, c, dについて計算ができるのがcurve_fit関数。ドキュメントをみるとこんな感じで使えとある。

scipy.optimize.curve_fit — SciPy v0.17.0 Reference Guide

Assumes ydata = f(xdata, *params) + eps Parameters:

f : callable

The model function, f(x, ...). It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments.

xdata : An M-length sequence or an (k,M)-shaped array

for functions with k predictors. The independent variable where the data is measured.

ydata : M-length sequence

The dependent data — nominally f(xdata, ...)

引数にcallableな関数を渡せと。あとは普通にXデータとYデータ。ということでこんな感じでコーディング。

def fit_func(x, a, b, c, d):
    return a * x**3 + b * x**2 + c * x + d

res = opt.curve_fit(fit_func, Px, Py)

このモデルに限らず引数とか関数とかを任意に変えてcurve_fitに渡すことで、使い方を変える。

それで、変数a, b, c, dについてはこんな感じで得られる。

a = res[0][0]
b = res[0][1]
c = res[0][2]
d = res[0][3]

a, b, c, dをもとに近似曲線のyを計算

Px2 = []
for x in Px:
    Px2.append(a * x**3 + b * x**2 + c * x + d)

そしてプロット

plt.plot(Px, Py)
plt.plot(Px, np.array(Px2))
plt.show()

f:id:dragstarclassic:20160524143941p:plain

Rで計算した値とPythonで計算した値はそれぞれこんな感じ。微妙に差がありますが、ほぼオーケーかと。そもそも近似曲線に正確性を求めるものでもないですし。

R Python
a -0.0092 -0.0092
b 0.2859 0.2580
c -1.6403 -1.0963
d 14.6270 13.2633

おソース

Jupyterの構築

いやぁ、捗りますね。今回はJupyterをインストールしてさらにRを使える様にする所までを。

Jupyterとは

前の名をipythonといい、pythonのコーティングをインタラクティブに行うものだった。それだけに飽きたらなかった凄腕のハッカー達がrubyもやらせろとかRもやらせろとかその他もろもろをできるようにしたのが始まり。notebookを使用するとインタラクティブな環境だけでなく、webサービスとして立ち上げて、ブラウザ上でコーディングを可能にするアプリケーションがこのJupyterだ。

Jupyterのインストール

インストールは簡単。pipで一撃

pip install jupyter

実行も簡単

jupyter notebook

このコマンドを打つとJupyterが起動し、自動的にブラウザも起動する。デフォルトではポート8888のローカルホストへと接続するとJupyterコマンドを実行したディレクトリが見えるようになる。基本的にはpython用なのだが、後述のKernelを言語ごとに入れるとそれぞれJupyter上で使える様になる。

JupyterでRを使えるようにする

JupyterでRを使えるようにするにはIRKernelを入れる必要がある。このサイトに手順が載っているのでその通りにやれば問題ない。

Installation · IRkernel

libzmq3-devパッケージをaptでインストール

sudo apt install libzmq3-dev

RのIRKernelパッケージをインストール

install.packages(c('rzmq','repr','IRkernel','IRdisplay'),
                 repos = c('http://irkernel.github.io/', getOption('repos')),
                 type = 'source')

インストールできたら、続けてIRkernelを有効に

IRkernel::installspec()

最後のコマンドの実行後はなんとも手ごたえがないのだが、これでjupyter notebookを起動するとRが使えるようになっている。Jupyterに適用できるカーネルはほかにもrubyとかperlとかscalaとか色々ある。下記リンクでたくさん紹介されているので使いたいものがあれば。

qiita.com

githubとgist

githubにファイルをアップするとjupyterの結果がそのまま表示される。まぁJupyterで作られるファイルはただのJSONだからね、できちゃうよね。ちなみにgistでも同じように表示される。gistに置いておけばこんな感じでブログに貼り付けることもできちゃう。Rのggplotにしろpythonのmatplotlibにしろ、ソースコードからプロットされた画像とかは勝手に描画してくれるのでアップロードも必要なくなるのがいい。

jupyterを普段動かすディレクトリをgithubでのリポジトリとして管理しておく使い方とかがいいかもしれない。

terminalも使える

なんとterminalも使える。画面端のnewを押すとterminalが出てくるので、それを押すとブラウザ内にterminalが現れる。これが便利すぎて濡れた。

f:id:dragstarclassic:20160518212806p:plain

magic command

jupyterは基本的にはその言語のソースを書いていくだけなのだが、ちょっと別の言語で書きたいとか、bashしたいとか色々できるコマンドがmagic commandだ。前項のterminalの存在に気付く前はmagic commandを使ってbashしていた。pythonやりながらRをやったりとかあれこれできる。magic commandはいろいろあるので下記リンクを参照。

マジックコマンドのリンク

Built-in magic commands — IPython 3.2.1 documentation

ゲストOSで起動させてホストOSで動かす

UbuntuVMで動かしてJupyterを起動してる方々向けに。VMといってもVirtualBox限定ですが、おそらくほかのVMソフトでも同じことができるかと。

ネットワークの設定 → NAT → ポートフォワーディング f:id:dragstarclassic:20160518213719p:plain

ポートフォワードの設定。特定のポートをゲストOSのポートにフォワードする f:id:dragstarclassic:20160518213809p:plain

んで、Jupyterの実行時にオプションを付ける。

jupyter notebook --ip=0.0.0.0

こんな感じで設定しておけばホストOS側のブラウザからJupyterを使える。もちろん演算はゲストOS側となりますが(VMなので結局はホスト側)ですが、描画とかはホスト側のマシンパワーを余すことなく使えるようにになる。

まとめ

いいですねjupyter notebook。pythonでデータの前処理を行ってRで分析、そしてmarkdownで結果のレポートをするとかバッチ処理的な事も行うハイブリッドな実行環境を作ることも可能になる気がする。しかもPDFとしてダウンロードする機能が標準であるので提出資料を作るのにもよさげです。