Macにionicをインストールしてサンプルプロジェクトを作成する

1

クロスプラットフォームアプリケーションのフレームワークであるIonicをMacにインストールする方法について紹介します。

まず、node.jsをインストールする必要があります。インストールしていない方はこちらに最も簡単なインストール方法を記載していますのでご覧ください。

インストール方法

npm経由でのインストールとなりますので、sudo npm install -g @ionic/cliコマンドを打ちます。

% sudo npm install -g @ionic/cli
Password:
⸨   ░░░░░░░░░░░░░░░⸩ ⠇ loadDep:yallist: sill resolveWithNewModule smart-buffer@

ionic -vでバージョンが表示されたらインストール完了です。

% ionic -v
6.12.3

アプリを作ってみる

ionic startコマンドで簡単なアプリを作ってみます。

 % ionic start

Pick a framework! ?

Please select the JavaScript framework to use for your new app. To bypass this
prompt next time, supply a value for the --type option.

? Framework: (Use arrow keys)
❯ Angular | https://angular.io 
  React   | https://reactjs.org 

今回はAngularを選びます。プロジェクト名やCapacitorがいるかなど聞かれますので、入力します。CapacitorはIonicのプロジェクトをAndroid,iOS,デスクトップアプリとして動作させる環境(ランタイム)です。Web用なら入りませんが、今回は入れておきます。

? Project name: my-first-app

Let's pick the perfect starter template! ?

Starter templates are ready-to-go Ionic apps that come packed with everything
you need to build your app. To bypass this prompt next time, supply template,
the second argument to ionic start.

? Starter template: tabs
✔ Preparing directory ./my-first-app in 1.93ms
✔ Downloading and extracting tabs starter in 998.19ms
? Integrate your new app with Capacitor to target native iOS and Android? (y/N) 
y

ダウンロードしたら、プロジェクトへ移動します。

% cd my-first-app/

ionic serveコマンドでビルドしてみます。

% ionic serve    
> ng run app:serve --host=localhost --port=8100

アプリケーションが立ち上がったら完了です。

参考文献

https://ionicframework.com/docs/intro/cli

MacにFileZillaをインストールする

Macで無料で使えるFTPソフトであるFIleZillaをインストールする方法について解説します。

まず、公式サイトからFileZillaの圧縮ファイルをダウンロードします。

https://filezilla-project.org/download.php?type=client#close

FileZilla_3.51.0_macosx-x86.app.tar.bz2というファイルがダウンロードされますので、ダウンロード先でダブルクリックして解凍します。

下記のようなアイコンのついたものが作成されます。

これがアプリケーション本体なので、このファイルをコピペして、アプリケーションフォルダへ移動して完了です。

普通にダブルクリックしたら起動するので、あとはサーバ情報を入力して接続します。

Macでnode.jsをインストールする

1

日本ではhomebrewでインストールする方法ばかりが紹介されていますが、海外ではほとんど情報がなくマイナーな方法です。node.jsの公式からダウンロードしてインストールする方法が多く紹介されていますが、こちらの方が簡単なので今回はその方法を紹介します。

installerを公式から落とす

https://nodejs.org/en/にアクセスしてinstallerをダウンロードします。

LTSと書いてあるものがサポートの長い安定版です。

ダウンロードしたら、ファイルをクリックして起動させます。

途中、インストール先が表示されるのでメモっておきます。あとは画面の指示に従って進みます。完了したらインストーラはゴミ箱に移動していいですかと聞かれます。これが表示されたらもうこれだけでインストール完了です。

動作確認

ターミナルで下記のように打ち込んでバージョンが表示されたらOKです。

% node -v
v14.15.1

もしバージョンが表示されない場合、下記のコマンドを打って現在のパスを通している場所を表示させ、インストーラで保存先に指定していた場所が入っているかどうかを確かめます。

% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

簡単なプログラムを書いてみる

node.jsがちゃんと動作しているか簡単なコマンドで調べてみます。

% node
Welcome to Node.js v14.15.1.
Type ".help" for more information.
> console.log('hello node.js')
hello node.js
undefined

ちゃんと動作していることが確認できたら、control + cを2回打って終了します。

【oandapyV20】OandaAPIでオーダブック、ポジションブックを取得する

1

この記事ではoandapyV20を使ってオーダブック、ポジションブックを取得する方法について記載します。

oandapyV20では、オーダーブックをとるためにはoandapyV20.endpoints.instrumentsのInstrumentsOrderBookというクラスで/v3/instruments/{instrument}/orderBookをGet通信で叩きます。

ポジションブックの場合は、oandapyV20.endpoints.instrumentsのInstrumentsPositionBookというクラスで/v3/instruments/{instrument}/positionBookをGet通信で叩きます。

いずれの場合もparamsで指定できるパラメータはinstrumentとtimeだけです。instrumentは必須引数ですが、timeは指定しない場合は最新が返されます。timeだUNIXTIMEを文字列型で渡します。最新を取りたい場合は、paramsは{}でいいと思います。

オーダーブックもポジションブックもほとんど同じなので、今回はオーダブックで説明したいと思います。

ドル円の最新のオーダーブックを取得するコードはこちらです。ポジションブックを見たい場合はInstrumentsPositionBookを使ってください。

# -*- coding: utf-8 -*-
import json
from oandapyV20 import API
from oandapyV20.endpoints.pricing import PricingInfo
from oandapyV20.exceptions import V20Error
import oandapyV20.endpoints.instruments as instruments
import datetime
import pandas as pd

def main():
    account_id="XXX-XXX-XXXXXXX-XXX"
    access_token = "***************************************************************"
    api = API(access_token=access_token, environment="practice")#or live

    params ={}
    r = instruments.InstrumentsOrderBook(instrument="EUR_USD",
                                         params=params)
    api.request(r)
    data = (r.response)
    print(data)

if __name__ == "__main__":
    main()

返り値の中身を詳細に見てみます。所期のデータはdata[‘orderBook’][‘buckets’]にリストで返ってきています。

#まずはなんの型が帰ってきているかきます。
(Pdb) type(data)
<class 'dict'>
(Pdb) data.keys()
dict_keys(['orderBook'])

(Pdb) type(data['orderBook'])
<class 'dict'>
(Pdb) data['orderBook'].keys()
dict_keys(['instrument', 'time', 'unixTime', 'price', 'bucketWidth', 'buckets'])

(Pdb) data['orderBook']['instrument']
'EUR_USD'
(Pdb) data['orderBook']['time']
'2020-12-07T12:00:00Z'
(Pdb) data['orderBook']['price']
'1.21131'
(Pdb) data['orderBook']['bucketWidth']
'0.00050'

(Pdb) type(data['orderBook']['buckets'])
<class 'list'>
(Pdb) len(data['orderBook']['buckets'])
5548
(Pdb) data['orderBook']['buckets'][0]
{'price': '0.00000', 'longCountPercent': '0.4861', 'shortCountPercent': '0.3107'}
(Pdb) data['orderBook']['buckets'][1000]
{'price': '1.12050', 'longCountPercent': '0.0351', 'shortCountPercent': '0.0200'}
(Pdb) data['orderBook']['buckets'][3000]
{'price': '7.59750', 'longCountPercent': '0.0000', 'shortCountPercent': '0.0150'}
(Pdb) data['orderBook']['buckets'][5000]
{'price': '107.77800', 'longCountPercent': '0.0025', 'shortCountPercent': '0.0000'}

綺麗な最終結果だけが欲しいならdata[‘orderBook’][‘buckets’]をPandasに変換します。

(Pdb) pd.DataFrame(data['orderBook']['buckets'])
                 price longCountPercent shortCountPercent
0              0.00000           0.4861            0.3107
1              0.00050           0.1428            0.0802
2              0.00100           0.2956            0.0451
3              0.00150           0.0576            0.0251
4              0.00200           0.0401            0.0225
...                ...              ...               ...
5543    34887878.00000           0.0025            0.0000
5544   100000000.00000           0.0025            0.0000
5545  1000000000.00000           0.0000            0.0050
5546  7000000000.00000           0.0000            0.0025
5547  9999999999.00000           0.0025            0.0000

[5548 rows x 3 columns]

参考文献

https://developer.oanda.com/rest-live-v20/instrument-ep/

https://developer.oanda.com/rest-live-v20/instrument-ep/

ローソクを取得したい場合はこちらをご覧ください

https://top.np-sys.com/hacks-with-it/oanda%e3%81%a7%e3%81%ae%e7%82%ba%e6%9b%bf%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%8f%96%e5%be%97/

現在の価格をリアムタイムに欲しい場合はこちらをご覧ください

https://top.np-sys.com/hacks-with-it/%e3%80%90oandapyv20%e3%80%91oandaapi%e3%81%a7%e4%be%a1%e6%a0%bc%e3%82%92streaming%e9%85%8d%e4%bf%a1%e3%81%a7%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b/

【oandapyV20】OandaAPIで価格をStreaming配信で取得する

1

この記事ではoandapyV20を使ってStreaming配信でリアルタイムに価格を取得する方法について記載します。

Streaming配信は非常に便利であるものの、最大で250msごとのデータしか提供されませんので急激な値動きまで把握できるわけではない事に注意が必要です。公式では「1秒間に4回のウィンドウを作成し、それぞれのウィンドウの最後で有効な値を返す」という記載があります。詳細は記載されていないものの、250ms程度のデータであること、アカウントごとにデータを生成するので、すべての人に同じデータが配信されるわけではない事に留意が必要です。

ストリーミング配信は/v3/accounts/{accountID}/pricing/streamにGet通信でアクセスする事で提供されます。

oandapyV20を使った基本のコードはこちらです(ドル円の価格を取得)。

# -*- coding: utf-8 -*-
import json
from oandapyV20 import API
from oandapyV20.endpoints.pricing import PricingInfo
from oandapyV20.exceptions import V20Error
import oandapyV20.endpoints.pricing as pricing
import oandapyV20.endpoints.instruments as instruments
import datetime
import pandas

def main():
    account_id="XXX-XXX-XXXXXXX-XXX"
    access_token = "******************************************************************"
    api = API(access_token=access_token, environment="practice")#or live

    params ={
            "instruments": "USD_JPY,EUR_JPY"
            }
    r = pricing.PricingStream(accountID=account_id, params=params)
    rv = api.request(r)
    maxrecs = 100
    for ticks in rv:
        print(json.dumps(ticks, indent=4),",")
        if maxrecs == 0:
            r.terminate("maxrecs records received")

if __name__ == "__main__":
    main()

これを実行すると、価格のリアルタイムデータが取得でします。ticksという変数にはこのような値が入ります。

{
    "type": "PRICE",
    "time": "2020-12-04T21:59:55.602697089Z",
    "bids": [
        {
            "price": "104.185",
            "liquidity": 250000
        }
    ],
    "asks": [
        {
            "price": "104.191",
            "liquidity": 250000
        }
    ],
    "closeoutBid": "104.177",
    "closeoutAsk": "104.199",
    "status": "non-tradeable",
    "tradeable": false,
    "instrument": "USD_JPY"
} ,

基本的には通貨ペア(Instruments)しかカスタマイズしないと思います。通貨ペアを変更したいときはparamsの値を変えてください。2つ以上のペアを同時にデータ取得したいときは、paramsにそれぞれのペアをカンマで区切って指定すればOKです。例えば、2つを指定したいときはこのように指定します。

    params ={
            "instruments": "USD_JPY,EUR_JPY"
            }

そうすると下記のデータが返ってきます。

{
    "type": "PRICE",
    "time": "2020-12-04T21:59:53.324563034Z",
    "bids": [
        {
            "price": "126.254",
            "liquidity": 250000
        }
    ],
    "asks": [
        {
            "price": "126.320",
            "liquidity": 250000
        }
    ],
    "closeoutBid": "126.238",
    "closeoutAsk": "126.336",
    "status": "non-tradeable",
    "tradeable": false,
    "instrument": "EUR_JPY"
} ,
{
    "type": "PRICE",
    "time": "2020-12-04T21:59:55.602697089Z",
    "bids": [
        {
            "price": "104.185",
            "liquidity": 250000
        }
    ],
    "asks": [
        {
            "price": "104.191",
            "liquidity": 250000
        }
    ],
    "closeoutBid": "104.177",
    "closeoutAsk": "104.199",
    "status": "non-tradeable",
    "tradeable": false,
    "instrument": "USD_JPY"
} ,
{
    "type": "HEARTBEAT",
    "time": "2020-12-06T11:28:32.333476447Z"
} ,

リアルタイムでデータが取得できるのはとても便利です。

通貨ペアの指定について

円関連

“USD_JPY”,’EUR_JPY’,’GBP_JPY’,’AUD_JPY’,’NZD_JPY’,’CAD_JPY’,’CHF_JPY’,

ドル関連

“EUR_USD”,’GBP_USD’,’AUD_USD’,’NZD_USD’,’USD_CAD’,’USD_CHF’,’USD_CNH’,

ユーロ関連

‘EUR_GBP’,’EUR_AUD’,’EUR_NZD’,’EUR_CHF’,’GBP_AUD’

参考文献

https://developer.oanda.com/rest-live-v20/pricing-ep/

https://developer.oanda.com/rest-live-v20/pricing-ep/

ローソクチャートを取得したいときはこちらの記事をご覧ください。

https://top.np-sys.com/hacks-with-it/oanda%e3%81%a7%e3%81%ae%e7%82%ba%e6%9b%bf%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%8f%96%e5%be%97/

GCP(Google Cloud Platform)の特徴を解説。主要サービスの紹介も。

GCP(Google Cloud Platform)は、GoogleがGmail,Youtubeなど一般向けに開発しているサービスのバックエンドで使われているクラウド基盤を外部に公開したものです。GoogleはGCPですべてのサービスを運用しており、同じ環境を安価に利用することができます

「Datacenter as a Computer」という言葉に集約されるように、GCPではGoogleの世界中にあるコンピュータをまとめて一つのコンピュータのように扱えるようにするというコンセプトがあり、エンジニアに取って使いやすいサービスとなっています。

歴史

GCPは2008年に公開されたGoogleAppEngineが元になっており、IaaSとして始まったAWSとは異なり当初はPaaSとして導入されました。その後、2011年にGoogleCloudSQL ,GoogleCloudStoragが導入され、2013年にIaaSであるGCEが導入され現在の主要サービスがそろいました。

東京リージョンが開設されたのは2016年であり、まだまだ日本では導入後まもないサービスです

基本概念

GCPではユーザー、課金アカウント、プロジェクトという3つの基本概念があります。ユーザーとは、Googleのサービスを利用するときに利用しているIDのことです。GCP専用のアカウントは存在せず、GoogleアカウントにGCPの情報を紐づけることとなります。プロジェクトとは、GCPの中で機能やサービスを束ねるためのものです。プロジェクト内では各サービスの連携は容易ですが、プロジェクトを跨ぐことは基本的にはできません。さらにプロジェクトには1つの課金アカウントが設定されている必要があり、こちらに対して請求が来る事になります。

コンポーネントについて

GCPには様々なサービスがありますが、代表的なものを下記にまとめました。

分類名称機能
コンピューティングComputeEngineクラウド上で仮想マシンを立ち上げられます。OS以上のレイヤーを自由に設定できる一方で、環境構築やメンテナンスを自分でやらなければならないため上級者向けです。
コンピューティングAppEngineアプリケーションを運用してくれるPaaSサービス。GUIのアプリのホスティングサービス。基本的にはリクエスト受け取り後、60秒以上の処理はできない。ローカルファイルへのアクセスは禁止されている。
コンピューティングCloudFunctions関数ベースでGUIを伴わないサービスについてはこちらで十分。関数プログラムをホスティングできるサーバレスなコンピューテング環境
分類名称機能
ストレージCloud Storageストレージサービス。データ保存だけではなく、HTMLや画像などの静的なデータを直接Webに公開することも可能。バケットと呼ばれるコンテナで管理される。ファイルやフォルダと言ったGCS上のデータはオブジェクトと呼ばれる。オブジェクト数に上限はないが、1オブジェクト5TBまで。
ストレージSQLMySQLなどのリレーショナルデータベース
ストレージFirestoreNoSQLサービス
ストレージBigtableスケーラブルなNoSQLサービス
ビッグデータBigQuery低コストなビッグデータ解析用サービス。SQLでデータ取得可能。読み出しに強いのがSQLとの違い。

その他、様々なAPIが提供されています。

特徴

AmazonやMicrosoftと比較したGoogleの特徴の一つは、インフラを自社で保有していることです。Googleでは、データセンタ、光ファイバ回線などを独自で設計し導入しています。世界規模のクローズトネットワークを保有している数少ない事業者がGoogleですが、これによりサーバ間のデータ転送は極めて高速で可用性に優れているという特徴があります。また、元々、世界中の個人に対してサービスを提供してきた背景から、スケーラビリティと大規模処理に非常に強く大量のデータを保有しているために機械学習などのモデル精度に優れています。日本ではAWSが最も勢いに乗っていると思いますが、独自のサービスやデータに強いというところで一定の存在感を持ったサービスであり続ける可能性が高いです。

サービスアカウントとメンバーについて

https://cloud.google.com/iam/docs/service-accounts?hl=ja

GCPではメンバーとサービスアカウントという概念があります。メンバーはプロジェクトに登録した個々のGoogleアカウント(ユーザーアカウント)とサービスアカウントであり、サービスアカウントはアプリケーションなどで使用される特別なアカウントです。リソースへのアクセスの際はサービスアカウントを介する必要があります。

重要なのは、サービスアカウントを作成するとメンバーにも登録されることです。メンバーを登録してもサービスアカウントは作成されないです。サービスアカウントの方が強いイメージです、

もし証明書を介してリソースにアクセスする際、下記の手順を踏みます。

  • サービスアカウントを作成する
  • そのサービスアカウントはメンバーとしても登録されているので、メンバーの画面から権限を編集
  • サービスアカウントの画面から証明書の発行

という流れになります。確証はありませんが、証明書の権限は発行された際のメ権限を反映しているような挙動になりました。そんなはずはないですが、でもそれで少し詰まりました。おそらく多少はタイムラグがあるということかもしれないです。