DISTRICT 37

なにか

pipでいれたパッケージを一括アップデート

pipでなんやかやパッケージを入れているのだが、これまで何をいれたのか忘れる。アップデートがあるとかそういったものは当然のように忘れる。ということで管理方法などを調べた。

パッケージの管理

まずはpipでできるコマンドから。

パッケージリストの表示

pip list

結果

click (6.6)
cycler (0.10.0)
decorator (4.0.10)
entrypoints (0.2.2)
first (2.0.1)
ipykernel (4.3.1)
略

更新状況を知りたかったらオプションを追加する

pip list --o

更新あるよというパッケージだけが出力される

ipykernel (4.3.1) - Latest: 4.4.1 [wheel]
ipython (5.0.0) - Latest: 5.1.0 [wheel]
jupyter-client (4.3.0) - Latest: 4.4.0 [wheel]
jupyter-core (4.1.0) - Latest: 4.1.1 [wheel]
略

パッケージのインストール

pip install hogehoge

アップグレードは-Uオプションを付ける

pip install hogehoge -U

アンインストール

pip uninstall hogehoge

pip-reviewで一括アップデート

いよいよ一括アップデートの仕方を。pip-reviewを使うと一括でやってくれる。

github.com

pip install pip-review

pipでpip-reviewを入れてから、pip-reviewを実行。

更新があるパッケージを表示

pip-review

微妙に文言は変わるがpip list -oと同じ結果が得られる。

ipykernel==4.4.1 is available (you have 4.3.1)
ipython==5.1.0 is available (you have 5.0.0)
jupyter-client==4.4.0 is available (you have 4.3.0)
jupyter-core==4.1.1 is available (you have 4.1.0)
略

--autoオプションを付けると更新があるパッケージを自動的に更新してくれる。

pip-review --auto

インタラクティブに更新を行う場合は--intaractiveオプションを付けて実行。これは更新する?しない?と聞いてくるので、お好みで更新ができる。

pip-review --interactive

あとはpip-review自体を忘れないようにしないと、、、、

イヤホンを買った

もう何個目かわからないくらいイヤホンは買ってる。といってもオーディオマニアとかそういうのではなく、単純になくすからだ。高いやつでそれをやっちゃうと後悔が大きいので、いつも安めのやつを買うようにしている。Beatsとか買っちゃってなくしたらきっと立ち上がれなくなる。イヤホンは消耗品として割り切るようにしている。

イヤホンに求める条件

オーディオマニアではないといってもささやかながらこだわりがある

  • L型プラグ
  • 赤い
  • 安い

L型プラグは外せない。イヤホンを買い替える理由は無くすというのが不動の一位だが、断線というのもそれに追随している。断線個所する場所はプラグ付近とイヤーピース付近だと思うのだが、そのプラグ付近への断線リスクをL型プラグは低減してくれる。なので、買ったイヤホンをL型じゃないという理由で返品をしたこともある。

その他の理由は個人的な趣味とか懐具合ですね。なぜだかイヤホンは赤という固定概念が昔からありまして買ってきたイヤホンは全部赤いですね。ほかのイヤホンでいいなと思っても赤がカラバリにないというだけであきらめたりもします。安いというのもよくなくすからからという理由で高いのは買いません。予算としては1500~2000円くらいでいつも考えてます。

よっぽどの低品質でなければ音はまったく気にしません。いい音で聴きたい場合はポタアンつけたり、ヘッドホンします。でも家を出る場合は荷物になるのでもっていきません。予算にあげたこのあたりの価格帯ならば聞くに堪えないクソ音を出すイヤホンは無いんで。

オーディオテクニカ CK330M

ということで、今回買ったのはこれ。オーディオテクニカ「CK330M」。価格としては税込で1800円くらいだったと思う。

L型だし、赤いし、安いし最高じゃないですか。さすがオーディオテクニカ。音も問題ない。ただ、コードが固いかな。固いからしまう時に少しコードが暴れてポケットとか、ケースとかに収まってくれない時がある。でもそれは裏を返すと断線に強いという長所なのかも。

ということで、しばらくはこれと付き合っていきます。

RからMySQLにつなげる

データをDBからとってきてRで分析がしたい

インストール

僕の場合、別途debパッケージが必要だったのでそれを先にやっておく

sudo apt install libmariadb-client-lgpl-dev

続いてRのパッケージをインストール

install.packages(c("DBI", "RMySQL"))

RからMySQLにつなげる

とっても簡単。

戻り値はdata.frameとなる。あとは煮るなり焼くなり

Ubuntu16でapt updateするとhashsumエラーが出る

普段使っているUbuntu15が2016/7/28でサポート切れしていた。ということでUbuntu16をこれからは使っていこうかと。LTSだし。

apt updateができない

Ubuntu16のインストールまではさっくり終わったのだが、apt updateするとハッシュサムがあわないから更新しなかったよというメッセージを受け取った。これでは使えないではないか!ということで調査の旅に出たわけだが、どうやらバグだということまでは分かった。このバグがフィックスされたとしてどうやって適用したらいいのだろうか?頼みのaptが死んでいるのに、、、

apt.confを編集

askubuntu.com

askubuntuで解決策を見つけた。どうやらプロキシ関連のバグという事なので、apt.confにプロキシの設定をちょっと入れるだけで解決するとの事。

/etc/apt/apt.conf

Acquire::http::No-Cache true;
Acquire::http::Pipeline-Depth 0;

この後にapt updateしたら通った。apt upgradeをしてみたら300近く更新が見つかった。ということで、これで解決。いつもの環境にするのに時間がかかるんだろうなぁ。

irisのデータセットをpandasで使う

タイトルまんまで

irisをpandasで使いたい

pythonのscikit-leanにはいくつかデータセットがあり、俺たちのirisももちろん用意されている。ただそれをpandasで使いたいんや。

pandas先生は自動的にいろいろやってくれる上、その後の加工にも便利。機械学習界隈でなんか新しい技術を見かけたらRにしろpythonにしろirisでやってみるというのがセオリーかと。

医療を疑え 代替医療のトリック

サイモン・シンによるシンプソンズ関連の本が出るときいてワクワクだったけど、そういえばこれを未読だったことを思い出した。サイモン・シンファンの風上にも置けないな。

代替医療のトリック

代替医療のトリック

目次

第1章 いかにして真実を突き止めるか
第2章 鍼の真実
第3章 ホメオパシーの真実
第4章 カイロプラクティックの真実
第5章 ハーブ療法の真実
第6章 真実は重要か?

代替医療プラセボである

代替医療臨床医学の見地からそれぞれ批判していくスタイルで本は進む。しかし、どの代替医療にしても効果が見られていてもプラセボ以上のものでは無いとまでしている。鍼や、カイロプラクティック、そしてハーブも何かしらの効果はあると思っていたのだが、その効果も本書ではプラセボだよと喝破する。

僕からしたらこれらの代替医療は補助的な効果を期待していたのだけど、施術する方としては万能医術として施しているのだとは思わなかった。鍼やカイロプラクティックなら、肩こりとか腰痛とかその辺の治療には効きそうなものだが、風邪にも効きますとか、内臓疾患にも効きますとかとか言われたらそら眉唾だろうと思いそうなものだが、日本とその他の国では意識に違いがあるのだろうか?

プラセボは悪か

コラーゲンを多く含む食事を前にしてプルプル~と言っている人をよく見かけるが、そんな時にただのタンパク質だよ、コラーゲンを食べても希望しているコラーゲンにはならないよと口に出して言いたくても、そこはぐっとこらえる。それは野暮だからだ。しかしプラセボによって効果がもしかして出るのでは?とちょっと思う。これがコラーゲンになるかならないかぐらいならかわいいものだが、こと医療に対してはなんとも躊躇してしまう。だが「病は気から」ともいい、患者に期待を持たせる事はいいのではないだろうか。本書の中でも「祈りは効果ある」と非科学的な事を持ち出すぐらいなので、プラセボの効果を完全には否定していない。

ホメオパシーへの徹底的な批判

第3章でふれながらもそれ以降でも折に触れてホメオパシーをくさしている。他の代替医療の話題をしながらもホメオパシーを引き合いに出して批判する姿は恨みでもあるのかと思うくらいだ。こればっかりは救いようも無いくらいインチキだと確信しているからなのだろう。何らかの成分を何万分の1に希釈したレメディを薬だと出されたら、効果はまったく期待できないと思うだろう。脱水症状には効くという皮肉がとても面白い。

代替医療に力を入れるチャールズ皇太子に対して、扉でチャールズ皇太子にささぐと書くなんてよっぽどの警鐘を鳴らしたいのだと思った。

サイモンシンにはずれなし

とにかくこの人の本は面白い。シンプソンズの本もきっと期待を裏切らないだろう。

それにしても「ビッグバン宇宙論」から「宇宙創成」に変わったようにこの本も文庫本になると「代替医療解剖」に代わる。出版界ではよくある話なんだろうか?

代替医療解剖 (新潮文庫)

代替医療解剖 (新潮文庫)

ビッグバン宇宙論 (上)

ビッグバン宇宙論 (上)

宇宙創成〈上〉 (新潮文庫)

宇宙創成〈上〉 (新潮文庫)

Scrapyチュートリアル

インストール

前回記事より。 dragstar.hatenablog.com

プロジェクトの作成

まずはプロジェクトを作る

scrapy startproject tutorial

ツリー構成はこんな感じ

tutorial/
├── tutorial
│   ├── __init__.py
│   ├── items.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       └── __init__.py
└── scrapy.cfg

一番上のディレクトリをホームとする

Itemの作成

スクレイピングした結果をItemクラスに保持することになる。items.pyにItemを定義する。

# items.py
import scrapy

class MyItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

どういった情報を保持していくか、用途に合わせて項目を定義していく。

Spiderの作成

実際にスクレイピングをしてくれるSpiderを作る。処理の中でItemにデータを入れるのを忘れずに

# spiders.py
import scrapy
from scrapy.selector import Selector
from tutorial.items import MyItem

class MySpider(BaseSpider):
    name = "MySpider" #spiderに名前を付ける。実行時に使う
    allowed_domains = ["test.com"]
    start_urls = [
        "http://www.test.com/foo/bar"
    ]

    def parse(self, response):
        item = MyItem() 
        sel = Selector(response)

        ## この辺でスクレイピング処理を書いていく
        item['title'] = sel.xpath('//html/head/title/text()').extract()
        item['link'] = sel.xpath('//a/@href').extract()
        yeild item

コツとしてはFirefoxとかで対象サイトの要素をあらかじめ見ておくと希望するものにたどり着きやすい。よっぽどのサイトでなければCSSとかちゃんとやってるのでクラス指定とかID指定とかするとよりいい感じで取得できる。

shell

scrapy shellを動かして試しながらの使い方がおすすめ。xpathの使い方に慣れることができる。また、Itemにどんな感じで帰ってくるかも確認できるのでその後のpipeline作成にも役に立つ。

scrapy shell "http://www.test.com"

Pipelineの作成

スクレイピングした結果を料理するのがPipeline

# pipelines.py
class MyPipeline(object):
    def process_item(self, item, spider):
        # Spiderが実行されてitemに格納されるのでitemをDBにいれるなりなんなり
        t = item['title']
        link_list = item['link'] # listで帰ってくると仮定
        for l in link_list:
            print(l)

        return item

パイプラインを有効にするにはsettings.pyを変える。コメントアウトされているので外して、作ったpipelineを指定する

# settings.py
ITEM_PIPELINES = {
    'tutorial.pipelines.MyPipeline': 300,
}

jsonとかで出力できるので、必要なければpipelineはなくてもいい。

実行

例は実行して結果をjson形式に出力するコマンド

scrapy crawl MySpider -o output.json

CSVで出力するコマンド

scrapy crawl MySpider -o output.json

CSVに出力するやりかた。拡張子で勝手に判定してくれる

scrapy crawl MySpider -o output.csv

他にもログを残すやり方とか

scrapy crawl MySpider --logfile scrapy.log

スケジューリング

と、うまくいったら勝手に実行してほしいですよね。スケジューラはcrontabでもなんでもいいけど、実行するときのシェルスクリプトにちょっと手間取った。

export PATH=$PATH:/home/xxxx/.pyenv/shims

cd tutorial

scrapy crawl MySpider --logfile scrapy.log

こんな感じにした。うまくscrapyへのパスを指定しないと「scrapyなんてコマンド知りませんけど」ってなる。僕の場合はpyenvを使っているのでscrapyのパスも/home/xxxx/.pyenv/shimsにあったのでそれを指定した。which scrapyとかで探せばいい。あとはプロジェクトのホームディレクトリに移動して実行コマンドを打つ、といったスクリプト。実行権限も必要に応じて。

最後に

クローラは自動ゆえ便利だが、頻繁に実行すると当然相手サーバにアクセスすることになる。先方に迷惑がかからない程度に節度をもってやりましょう。こんな事件も昔にあった事ですし、、、

岡崎市立中央図書館事件 - Wikipedia