何やらGoogleのスマホPixel7が祭りになっているようですね。

最近はAppleもそうですが、カメラの機能や性能とソフトウェアの進化がすごいですが。。。

だったらスマホではなく、カメラ出せばいいんじゃないか?と思いますね。。。
カメラ性能は進化してもそもそもスマホの性能は?進化したのか?

そこはもう進化していないことが明確ですね。
写真や動画撮影に特化してしまって、そこに何十万も掛ける必要あるのかな?

日常的に情報発信している方でもそこまで高画質が必要かな?と思います。
もちろん筆者も興味はありますがそこまで使いこなすことも難しいと思うので、
しばらくこのままiPhoneSE2でいいかなという状態ですね。

むしろ最近ではハック可能な自由度があるかどうかがポイントで、そういうのに手を出したくなりますね、となるとターゲットは中華泥スマホか笑


ArchLinuxにMariaDBをインストールして、起動する

前置きはこれくらいにしておいて、今回はArchLinuxでmariaDB10.9をインストールして設定していこうと思います。

現在ArchLinuxでMariaDBをインストールするとバージョンは10.9.3となりました。

インストール方法は以下

$ sudo pacman -S mariadb
$ sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

インストールしてディレクトリが設定できたらサービスを起動していきましょう。

$ sudo systemctl start mariadb

起動しているかステータスを確認します。

$ sudo systemctl status mariadb

 Active: active (running) になればOKですね。

再起動しても自動で起動するように以下の設定もしておきましょう。

$ sudo systemctl enable mariadb

MariDBにデータベース環境を構築

続いて、MariaDBのサービスが起動したのでアクセスしていきましょう。

ログインする際のコマンドは以下です。

$ sudo mysql -uroot

mariadbなのにmysql というコマンドで操作するのは違和感がある方もいるかもしれませんが、
元々はmariadbはmysqlのOracle買収に伴うOSS派生DBなので、そこを理解しておけば納得ですかね。

このままだとパスワードなしでmaridbにログインできてしまうので、パスワードを設定しましょう。

MariaDB [(none)]> grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
MariaDB [(none)]> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;

上段は外部接続、下段はローカル接続用のコマンドです。

では、パスワード設定して再度ログインしてみましょう。

MariaDB [(none)]> exit

パスワードなしでログイン。

$ sudo mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

はい、蹴られますね。
パスワードを追加してみましょう。

$ sudo mysql -uroot -ppassword

これでログインできればパスワード設定は完了ですね。
データベースを作成するにはmariaDB上で以下構文を使います。

MariaDB [(none)]> CREATE database cryptcoin;

今回は「cryptcoin」というデータベース名にしました。
作成できたか以下コマンド「show databases」で確認します。

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| cryptcoin          |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.002 sec)

一番上の列にcryptcoinがありますね。

次はテーブル作成します。

まずは以下コマンドで使うデータベースの選択をします。

MariaDB [(none)]> use cryptcoin

すると、今まで左の(none)だった箇所が使用中のデータベース名へと変更になります。

Database changed
MariaDB [cryptcoin]>

尚、データベースを利用する際はこのようにmariadbログイン後にuse で指定する場合と、
以下のようにログイン時に「-D」で指定する方法があります。

$ sudo mysql -uroot -ppassword -Dcryptcoin  

それでは実際にテーブルを作成していきましょう。

今回は以下のような構成で作成しました。

名称用途
idbigint(20) unsigned not null auto_increment通しの管理番号
datevarchar(10)日付
hourvarchar(2)時間
minvarchar(2)
ltpdouble約定金額
product_codevarchar(8)仮想通貨名、BTCとETHを含める
create table cc_onemin(id bigint(20) unsigned not null auto_increment,date varchar(10), hour varchar(2), min varchar(2),ltp double,product_code varchar(8),unique key `id`(`id`));

テーブルを作成したら以下のdescコマンドで確認してみましょう。

MariaDB [cryptcoin]> desc cc_onemin;

テーブルが期待通りにできているのが確認できました。


BitFyerからデータを取得してMariaDBのテーブルに格納するPythonコード

取得するのはBitFlyerの以下のURLです。
https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY
https://api.bitflyer.jp/v1/ticker?product_code=ETH_JPY

ブラウザでもアクセス可能です。
すると以下のJSONデータが表示されるかと思います。

{"product_code":"BTC_JPY","state":"RUNNING","timestamp":"2022-10-08T05:17:23.497","tick_id":1715241,"best_bid":2831740.0,"best_ask":2832985.0,"best_bid_size":0.052,"best_ask_size":0.025,"total_bid_depth":598.98592484,"total_ask_depth":406.65934684,"market_bid_size":0.0,"market_ask_size":0.0,"ltp":2832987.0,"volume":7163.02527439,"volume_by_product":1132.62400078}

以下のコードでJSONデータを取得して、先程作成したテーブルに必要な項目である「product_code、ltp」だけを抽出し、Python側で日付を取得し、合わせたデータをMariaDBに蓄積するようにしていきます。

##!/usr/bin/python3
#----------------------------------------------------------------------------------------------------
# Settings
import os
import sys
import time
import json
import datetime
import locale
import pymysql
import requests
#----------------------------------------------------------------------------------------------------
# DB Connect(MySQL/MariaDB)
conn = pymysql.connect(
        user = 'root',
        password = 'password',
        host = 'localhost',
        db = 'cryptcoin',
        charset='utf8mb4'
        )
#----------------------------------------------------------------------------------------------------
# Urls
bfurl = 'https://api.bitflyer.jp'
btpath = '/v1/ticker?product_code=BTC_JPY'
etpath = '/v1/ticker?product_code=ETH_JPY'
#----------------------------------------------------------------------------------------------------
# Public Get
def get_json(urlpath):
        response = requests.get(
                urlpath
        )
        data = response.json()
        return data
#----------------------------------------------------------------------------------------------------
def put_value(data1):
        d = datetime.datetime.today()
        d_date = d.strftime("%Y/%m/%d")
        d_hour = d.strftime("%H")
        d_min = d.strftime("%M")
        ltp = data1['ltp']
        pd = data1['product_code']
#       
        con = conn.cursor()
        sql = "insert into `cc_onemin` (`date`,`hour`,`min`,`ltp`,`product_code`) values(%s,%s,%s,%s,%s)"
        con.execute(sql,(d_date,d_hour,d_min,ltp,pd))
        conn.commit()

#----------------------------------------------------------------------------------------------------
#------ BTC_JPY
data1 = get_json(bfurl+btpath)
put_value(data1)
#
#------ ETH_JPY
data1 = get_json(bfurl+etpath)
put_value(data1)
#

続いて、crontab に1分おきに実行されるよう設定していきます。


crontabに設定する

以下コマンドでcrontabに設定していきます。

$ crontab -e
*/1 * * * * /home/osmaniax/dev/python/.bitcoin/bf2mariadb.py 

まだcrontab をインストールしてない場合は以下でインストールします。

$ sudo pacman -S cronie
$ sudo systemctl start cronie
$ sudo systemctl enable cronie

10分程度経過してMariaDBを確認したところ、しっかりとデータが蓄積しているのを確認できました。


まとめ

今回はArchLinuxをベースにMariDBとPythonでBitFlyerのAPIを利用して仮想通貨のデータを取得してみました。何かの参考になれば幸いです。