蟹者

Python系技術メモ+20代土木技術者焦燥日記

【雑記】VPSでCoincheck APIをPythonで動かしてデータベース自動更新するのを作ったよ【自由研究】

勝った。という感じです。よろしくお願いします。

f:id:russENG:20180224133825j:plain


というわけで、VPSとPaaSとレンタルサーバーとの違いもわかっていなかった、ド素人の七転八倒の記録です。

1. プログラミングできないのにMacbookを買ってPythonなど入れる。

Coincheck API使って云々を知りたい人は読み飛ばしてください。

・結果として必ずしも必要な作業ではないですが、初めてMac OSを触ってターミナルとかコマンドに慣れたのはのちにVPSLinuxを触る上で大きかったです。bash云々、いちいちビビらなくなるし。

・大学院生の時Windows PCからさくらのVPS借りてWebサービスを作ってみようと試みたことがあるのですが、本当に「何やってるのかわからない」というか、「何がどうわからないのかすらわからな」くて挫折した経験を考えると、普段しているフォルダ作成とか移動とか削除とかをコマンドでやって、慣れておくのはイメージが湧いてよかったと思います。

Pythonを入れるのは、統計とかTensorFlowで遊びたいな、という目的もありました。最初Anacondaで環境作って、それからローカルに素のPythonと必要なパッケージを入れ直す、という作業をしました。*1

 ・まずAnacondaのインストールでも問題が。元から入っているpip と競合する。
 ・Anaconda、消したら消したでしつこく残っている。pyenvを消したり、bashにpathが残っているのを掃除したりする。
 (っていうかこの辺、本当によくわかっているとは言い難い・・・)
 ・Anacondaが退治できたと思ったらPythonの代表的なモジュール(NumPyとか)がPermission errorとやらで入らない
 →Mac OS のシステム保護機能が原因。リカバリーモードでこいつを無効にしていじりたい権限を編集する、というおっかないことをする。


参考にした情報:
【決定版】MacでPythonを使って『機械学習』を学ぶための環境構築 - Qiita
Anacondaを退治した話 - Qiita
pyenv自体のアンインストール方法 - Qiita
PATHを通すために環境変数の設定を理解する (Mac OS X) - Qiita
OS X 10.11 El Capitanのシステム保護機能「Rootless」を無効にするcsrutilコマンドの使い方。 | AAPL Ch.



2. さくらのVPSを契約&初期設定


・基本的にはこれに沿ってやって行っただけですが・・・。
 【さくらのVPS】サーバの初期設定ガイド – さくらのサポート情報

・一番詰まったのが、一番最初の認証でした。
 


 なんという初見殺し・・・・。あとはそこまで詰まったのはありませんでした。



他に参考にした情報:
 さくらのVPS初期設定 - Qiita
 インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識 - Qiita



3. CoincheckAPIPythonで動かす


コインチェックの価格データ集め — Mazarimono Note
Pythonでcoincheck APIを使ってみる。 ~自動取引プログラム作成に向けて~ - Qiita
jsonやrequestモジュールについて理解しているとは言い難いですが、とりあえずこれらを参考に、以下の動くスクリプトを得ました。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Feb 16 2018
"""

'''
==================
コインチェックAPIからデータとってDBに格納する
・ver 1.0 :1分毎でTicherを取得する
==================
'''
import requests
import json
import sqlite3

URL = 'https://coincheck.com/api/ticker'
coincheck = requests.get(URL).json()
ticker = {}
for key, item in coincheck.items():
    #print("%-9s : %-10.9s " % (key, item))
    #print(key, item)
    ticker[key] = item

tictup = tuple(ticker.values())

#insert data into db
conn = sqlite3.connect('Crypto.db')
cur = conn.cursor()

cur.execute('''create table if not exists cctickers(last, bid, ask, high, low, volume, timestamp)''')
sql = '''INSERT INTO cctickers (last, bid, ask, high, low, volume, timestamp) VALUES(?,?,?,?,?,?,?)'''
cur.execute(sql, tictup)

conn.commit()
cur.close()
conn.close()

SQLiteというかSQL文の理解は、これも参照しました。
(ちょうど、基本情報処理技術者試験も受けるところだったので)
SQLite入門 (全30回) - ドットインストール



4. 机と椅子を買って組み立てる。


・一人暮らしして10年以上経つんですが、今までちゃんとしたオフィスチェアとそれに合った机を持っていたことがなくて、こうして家での作業が多くなってくると、それではいけないと思い、買いました。

オフィスチェア 肘付 メッシュ ハイバック ブラック

そしてわかったんですけど、机と椅子、すっっっっっっごく便利じゃないですか?

こうして科学の歴史の中では最新の成果を享受するのもいいですが、こういうローテクなものにも、良さがありますね。



5. VPSPythonなどをインストールする


1.の通り、手元のMacではHomebrewをパッケージ管理として使っているのですが、

Cent OSでパッケージを管理するの、何がいいのだろうと思って yum か Linuxbrew かな、となっていて、

後者の方がアイコンが可愛かったのですが、こういう時に迷った時は、使用人数というか二次情報の資料が多い方を選んだ方が初心者にとってはいい、という万年初心者なりの経験則があり、yum を選択しました。

参考にした情報:
 CentOS6にPython3入れる - Qiita



6. のじゃロリおじさんのスタンプを買う


買ったのじゃ〜〜。大学の知り合いくらいにしか、使えないのじゃ〜〜。
panora.tokyo



7. Cronにてスケジューリング 価格情報等の自動収集

 ・目標としては、1分ごとに動かしつつ、データの取り出し等も同時にしたいし、負荷*2がどんくらいかわからないので、&(アンパサンド)を使ってバックグラウンドでも動く設定にしました。

 ・最初、crontabに書いたスクリプトをどうやって検証するのか、疑問でしたが、「現在の時間より少しだけ先の時間に設定して、待つ」という、存外原始的プリミティブなメソッドがPythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-に書いてあり、そうしました。

 ・そもそもシェルスクリプトを知らなかったけど、なんとかなりました(多分)
  (いまだにshとbashの違いよくわかってないけど・・・)


 ・そして、VPSの設定のところをいじる、というのも、なんかちょっと怖いし、現在より、少し後の時間に設定する、というのも時限爆弾作ってるみたいな、謎のドキドキ感があって高揚しました。

 ・最終的にできて、勝ったッ!という感じになったし、実際に動いてる(動き続けている)ものを作るって楽しいですね。何度もls -ltを叩いて、.dbファイルの更新日時を確認しました。


参考にした情報:
 Linux初心者のシェルスクリプト入門 - Qiita
 【 chmod 】 ファイルやディレクトリのアクセス権を変更する | 日経 xTECH(クロステック)
 【 chmod 】 ファイルやディレクトリのアクセス権を変更する | 日経 xTECH(クロステック)
 Linuxコマンド【 crontab 】cronの設定 - Linux入門 - Webkaru
 シェルスクリプトを使って「これから毎日金相場をスクレイピングしようぜ?」という話 - Qiita



8. 今までを振り返り、人生に特別な意味などないことを知る。


・まあ初心者でもやってやれないことはない。

・おそらくどの作業も作業量的には全然大したことはないんですけど、心理的な大きさでいえば、1. 2. ....7. 8. まで行くに従い、加速度的に簡単になっていく印象でした。
 それは、環境設定が大変だ、ということ以上に、「知らないこと」と「できそうなこと」のバランスが取れていくというか、頭の中に地図ができていく、というか、パスが通っていく、みたいな感覚です。
 初学者を効率的に教育するなら、まず1. 2.の作業をメンターが用意してしまう、あるいは、課題として強制的に圧力かけてやらせてまず慣れさせる、みたいなことが考えられると思います。

・これで色々、目的もなく、断片的に、機械学習とかデータ可視化とか勉強してましたが、これをようやく、具体的なサービスとか諸々のことと繋げられる第一歩を踏んだ感じがしています。
 本当にやりたいレベルまではまだまだあるので精進します。

*1:TensorFlow公式ドキュメントで、Anacondaで提供される仮想環境condaではなく、virtualenvで仮想環境作ってくれって書いてあったからだけど、後から色々調べると別にAnaconda+TensorFlowでも問題はない・・・と思う。

*2:実際動かしてみたら一瞬だったけど・・・。