homebrewでPS4リモートプレイをインストールしてMacでPS4をプレイする

homebrewでPS4リモートプレイをインストールする方法が見当たらなかったので、インストール方法とプレイまでの流れを簡単にまとめておきます。

インストール

brew cask install homebrew/cask-drivers/sony-ps4-remote-play

準備

Mac

PS4のコントローラーを一般のUSBケーブルでMacに接続しておきます。

PS4

PS4の設定画面からリモートプレイを有効にしておきます。

PS4リモートプレイ設定
PS4リモートプレイ設定

PS4リモートプレイの起動

  1. PS4 Remote Playをクリックします。

    PS4リモートプレイ
    PS4リモートプレイ

  2. PS4 Remote Playが起動したらPS4アカウントのIDとPasswordを入力します。

  3. PS4を自動的に探しに行くのでしばらく待ちます。

    PS4サーチ
    PS4サーチ

  4. PS4をプレイします。

    PS4ホーム画面 f:id:slowquery:20181230162919p:plain

なかなか快適にプレイできます。設定で720p以上、フレームレートをHighにしておくとよいです。

BeagleBoneで仮想通貨をCPUマイニング

BeagleBoneで仮想通貨をマイニングしてみます。CPUで様々な仮想通貨をマイニングできるcpuminer-multiを使います。

環境

cpuminer-multiをビルドする

準備

cpuminerのビルド必要なライブラリをインストールします。

sudo apt-get install -y automake autoconf pkg-config libcurl4-openssl-dev libjansson-dev libssl-dev libgmp-dev make g++ zlib1g-dev

※ cpuminer-multiのGitHubには書いていませんが、BeagleBoneのStretch IoTだとzlib1g-devが無いとビルドに失敗します。

cpuminer-multiのダウンロード

  1. 最新版をgitでcloneします。

    sh git clone https://github.com/tpruvot/cpuminer-multi.git cd git cpuminer-multi

cpuminer-multiのビルド

  1. ビルドします。

    sh ./build.sh

  2. cpuminerという実行ファイルが出力されているのを確認します。

仮想通貨のマイニング

cpuminerでマイニングします。

  • [mail],[pass]: MinerGateのEメールとパスワード
  • -a: マイニングのアルゴリズムを選択できます。--helpで一覧がみられます。
  • -t 4: BeagleBoneに搭載されているCPUのARM Cortex-A8(1GHz)が、4コアなので-t 4として、4スレッドでマイニングしています。
  • -o: あくまでもMinerGateに送る例ですが、他のマイニングプールにも対応しています。

f:id:slowquery:20180204120148p:plain

Bytecoin [BCN]

./cpuminer -a cryptonight -o stratum+tcp://bcn.pool.minergate.com:45550 -t 4 -u [mail] -p [pass]

Monero [XMR]

./cpuminer -a cryptonight -o stratum+tcp://xmr.pool.minergate.com:45560 -t 4 -u [mail] -p [pass]

QuazarCoin [QCN]

./cpuminer -a cryptonight -o stratum+tcp://qcn.pool.minergate.com:45570 -t 4 -u [mail] -p [pass]

DigitalNote [XDN]

./cpuminer -a cryptonight -o stratum+tcp://xdn.pool.minergate.com:45620 -t 4 -u [mail] -p [pass]

Fantomcoin [FCN]

./cpuminer -a cryptonight -o stratum+tcp://fcn.pool.minergate.com:45610 -t 4 -u [mail] -p [pass]

MonetaVerde [MCN]

./cpuminer -a cryptonight -o stratum+tcp://mcn.pool.minergate.com:45640 -t 4 -u [mail] -p [pass]

Dashcoin [DSH]

./cpuminer -a cryptonight -o stratum+tcp://dsh.pool.minergate.com:45720 -t 4 -u [mail] -p [pass]

Infinium-8 [INF8]

./cpuminer -a cryptonight -o stratum+tcp://inf8.pool.minergate.com:45750 -t 4 -u [mail] -p [pass]

XDN+XMR

./cpuminer -a cryptonight -o stratum+tcp://xdn-xmr.pool.minergate.com:45790 -t 4 -u [mail] -p [pass]

FCN+XMR

./cpuminer -a cryptonight -o stratum+tcp://fcn-xmr.pool.minergate.com:45590 -t 4 -u [mail] -p [pass]

FCN+QCN

./cpuminer -a cryptonight -o stratum+tcp://fcn-qcn.pool.minergate.com:45600 -t 4 -u [mail] -p [pass]

FCN+DSH

./cpuminer -a cryptonight -o stratum+tcp://fcn-dsh.pool.minergate.com:45730 -t 4 -u [mail] -p [pass]

FCN+INF8

./cpuminer -a cryptonight -o stratum+tcp://fcn-inf8.pool.minergate.com:45760 -t 4 -u [mail] -p [pass]

MCN+QCN

./cpuminer -a cryptonight -o stratum+tcp://mcn-qcn.pool.minergate.com:45670 -t 4 -u [mail] -p [pass]

MCN+DSH

./cpuminer -a cryptonight -o stratum+tcp://mcn-dsh.pool.minergate.com:45740 -t 4 -u [mail] -p [pass]

MCN+INF8

./cpuminer -a cryptonight -o stratum+tcp://mcn-inf8.pool.minergate.com:45770 -t 4 -u [mail] -p [pass]

マイニング結果の確認

MinerGateのダッシュボードで確認します。

f:id:slowquery:20180204121049p:plain

BeagleBoneにLinuxをインストールする

使ってなかったBeagleBone Blackが家にあったので、新しいLinuxをインストールしてみました。 ここでは公式サイトで推奨されているDebianをインストールします。

環境

  • OSX: 作業環境
  • BeagleBone Black (Rev.C)
  • MicroSDカード

Linuxイメージの入ったSDカードを作成する

EtcherというElectron製のツールを使って、SDカードにLinuxイメージを書き込みます。

  1. OSイメージをBeagleBoardのサイトからダウンロードします。

  2. Etcherをインストールします。

    brew cask install etcher

    Etcher: Electron製のフラッシュ書き込みツール

  3. MicroSDカードをMacにマウントします。

  4. Etcherを起動します。

    f:id:slowquery:20180203233733p:plain

  5. Flashをクリックして、OSイメージをMicroSDカードに書き込みます。

BeagleBoneをMicroSDカードのLinuxから起動する

  1. BeagleBoard電源ケーブル(5Vアダプタ or USB)を抜いておきます。

  2. OSイメージの書き込まれたMicroSDカードをBeagleBoneのMicroSDカードコネクタに差し込みます。

  3. BeagleBone BlackのMicroSDコネクタ近くの"USER/BOOTボタン"を押しながら、電源ケーブルを接続します。

    f:id:slowquery:20180121164723j:plain

  4. OSXにBeagleBoneがマウントされていることを確認します。

  5. ブラウザで http://192.168.6.2にアクセスしてBeagleBoneの説明ページが出ることを確認します。

LinuxイメージをeMMCに書き込む

BeagleBoneにはeMMS(Embedded Multi Media Card)というフラッシュメモリが内蔵されています。SDカードなしで起動できるようにするため、イメージをBeagleBone BlackのeMMCに書き込みます。

  1. Debianにログインします。

    ssh debian@192.168.6.2 //パスワードはtemppwd

  2. Debianのバージョンが最新版であることを確認します。

    cat /etc/dogtag BeagleBoard.org Debian Image 2017-10-10

  3. /boot/uEnv.txtを以下のように修正して保存します。

    ##enable BBB: eMMC Flasher: cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh

  4. (任意)LANケーブルを接続してインターネットに接続して以下のコマンドで書き込みスクリプトをアップデートします。

    cd /opt/scripts/ git pull

  5. SDカードを抜かずに再起動して終了します。

    sudo reboot sudo shutdown -h now

eMMCから起動する

  1. SDカードを抜いて起動してログインします。

    ssh debian@192.168.6.2 //パスワードはtemppwd

  2. 最新であることを確認でします。

    cat /etc/dogtag BeagleBoard.org Debian Image 2017-10-10

以上で完了です。

Claudia.jsでES2015を使う

AWS LambdaのNode.jsコンテナは残念なことに2017年1月現在でv4.3という古いバージョンで、ES2015に対応していないです。 公式の"USING BABEL WITH AWS LAMBDA"に書いてある通りで、babelを使ってES2015でClaudiaやBabelを書く方法をまとめます。

前提

下記のようにAWS API GatewayAWS Lambda用のapp.jsとcustom認証のauthorizer.jsをES2015で書いていると仮定します。

  • app.js : AWS API GatewayAWS Lambda用のClaudiaの定義 (ES2015)
  • authorizer.js : カスタム認証用のLambda関数 (ES2015)

手順

ディレクトリ作成

srcbinを作成し、src配下に作成したファイルを格納します。binには後々babelでtranspileされたファイルが格納されるので、現時点では空で構いません。

mkdir src bin
mv *.js src

npm設定

npm init
npm install --save claudia-api-builder
npm install --save-dev babel-cli babel-preset-es2015 claudia

package.jsonscriptsfilesを以下のように設定します。

  "scripts": {
    "transpile": "babel --presets es2015 src --out-dir bin",
    "create": "npm run transpile && claudia create --region us-east-1 --handler bin/authorizer.auth --name [任意] --config claudia-auth.json && claudia create --region us-east-1 --api-module bin/app",
    "update": "npm run transpile && claudia update --config claudia.json",
    "update-auth": "npm run transpile && claudia update --config claudia-auth.json"
  },
  "files": [
    "bin"
  ],

現時点では以下のようになっています。

src/app.js
src/authorizer.js
bin/
package.json

実行

  • デプロイします。初回のみの作業です。claudiaの設定ファイルclaudia.jsonとカスタム認証の設定ファイルclaudia-auth.jsonも作成されます。
npm run create

更新

  • カスタム認証を修正した後に実行します。
npm run update-auth
  • app.jsを修正した後に実行します。
npm run update

以上

Claudia.jsで簡単サーバレスアーキテクチャー

サーバレスアーキテクチャと聞いて、どのようなアーキテクチャを思い浮かべるでしょうか。Martin Fowler.comのサーバレスアーキテクチャの解説記事ではいくつかのサーバレスアーキテクチャの実装例がリストアップされています。

ここでは、最もよく使われると思われるフロントエンドアプリのためのサーバレスアーキテクチャを考えてみます。

フロントエンドアプリのためのサーバレスアーキテクチャ

API Gateway、Lambdaを中心とした標準的な構成です。

  • フロントエンド(SPA/Native)
  • 認証認可API
    • 代表的なサービス: Facebook, Twitter, Google, Auth0
    • 役割: ユーザの認証認可、OAuth Access TokenやJWTの発行・更新・検証
  • API Gateway
    • 代表的なサービス: AWS API Gateway, Apigee
    • 役割: フロントエンドが利用するAPIの公開、APIの共通処理(認証認可)、FaaS連携
  • FaaS (Function as a Service)
    • 代表的なサービス: AWS Lambda
    • 役割: BaaS連携、業務ロジック実行
  • BaaS (Backend as a Service)
    • 代表的なサービス: AWS DynamoDB, S3

しかしながら、実際にAWS上で一から実装しようとするとAPI GatewayとLambdaの連携、認証認可の実装、Lambdaの管理、デプロイや更新処理など面倒極まりない作業に直面します。何らかの抽象化レイヤーやツール無しにAWS上でサーバレスアーキテクチャを実現するのは困難だと実感しています。

ここでは、Claudia.jsというNode.js製のフレームワークを用いてこれらの課題を解決し、フロントエンドアプリのためのサーバレスアーキテクチャーを簡単に実現してみます。

Claudia.jsとは

AWS上でサーバレスアーキテクチャを実現するためのフレームワークの一つです。同様のフレームワークとしてServerlessやApex等が知られています。

  • Apex: Lambdaにフォーカス。作者のTJがAPI Gatewayをの1st citizenで無いと言っており連携が煩雑。
  • Serverless: YamlAWSの設定を大量に記述するスタイル。抽象化度合いが低い。

Claudia.jsはこれらと比較した際に、API Gatewayや外部認証までをも含めたサーバレスアーキテクチャ全体を通して実装するのが簡単です。Node.jsでExpressを用いたAPIサーバを書いていくようなイメージで、設定ファイルを記述していくServerless等と比較して柔軟な処理が行えます。

準備

1. Claudia.jsをインストールします。

npm install -g claudia

2. プロジェクトを作成します。

mkdir [Proj Name] && cd [Proj Name]
npm init
npm install --save claudia-api-builder
npm install --save aws-sdk
npm install --save axios

実装

以下のようなフロントエンドアプリを実装してみます。エラー処理や詳細は割愛します。また、Hello World的なものはCloudia.jsのTutorialをみた方が手っ取り早いです。

  1. フロントエンドアプリがSNSの認証認可APIからOAuthのアクセストークンを取得する。(略)
  2. フロントエンドアプリがアクセストークンを付与してAWS API Gatewayにリクエストを投げる。(略)
  3. AWS API GatewaySNSの認証認可APIを用いてアクセストークンを検証する。
  4. AWS API GatewayがFaaSの関数を呼び出す。
  5. AWS Lambdaの関数がAWS DynamoDBのテーブルからデータを取得してフロントに返す。

1. カスタム認証の作成

1. カスタム認証用のLambda関数を作成します。

authorizer.jsを作成します。Access Token検証APIを呼び出して有効な場合にAPI実行権限を付与しています。

var axios = require('axios');
    
//API実行ポリシーの生成
var generatePolicy = function(authToken, methodArn, context) {
    var awsInfo = methodArn.split(':');
    var region = awsInfo[3];
    var accountId = awsInfo[4];
    
    var apiInfo = awsInfo[5].split('/');
    var restApiId = apiInfo[0];
    var stage = apiInfo[1];
    var method = apiInfo[2];
    
    //アクセスさせたいリソース
    var resource = 'arn:aws:execute-api:' + region + ':' + accountId + ':' + restApiId + '/' + stage  +'/' + method + '/*';
    
    return {
        'principalId': authToken.split('-')[0],
        'policyDocument': {
            'Version': '2012-10-17',
            'Statement': [{
                'Effect': 'Allow',
                'Action': ['execute-api:Invoke'],
                'Resource': [resource]
            }]
        }
    };
};
    
var url = "Access TokenのValidateを行うAPIのURL";
    
//Tokenの検証とポリシーの付与
exports.auth = function auth(event, context, cb) {
  axios.get(url, {
    params: {
      access_token: event.authorizationToken //HTTP headerのAuthorizationキーの値
    }
  }).then(function (res) {
    var is_valid = true|false; //Tokenの有効性を検証して結果を格納
    if (is_valid) {
       cb(null, generatePolicy(event.authorizationToken, event.methodArn));
    } else {
       cb("Invalid Access Token");
    }
  });
};

2. デプロイ

claudiaコマンドでカスタム認証用のLambda関数をAWSにデプロイします。

claudia create --name custom-authorizer --region us-east-1 --handler authorizer.auth --config claudia-auth.json
  • --name: AWS Lambda上の関数名
  • --region: AWSのリージョン名
  • --handler: カスタム認証の関数名
  • --config: Claudia.js用の設定ファイル名(自動作成されるので任意)
{
  "lambda": {
    "role": "custom-authorizer-executor",
    "name": "custom-authorizer",
    "region": "us-east-1"
  }
}

2. APIとLambda関数の作成

1. APIとLambda関数を作成します。

app.jsという名前にします。

var ApiBuilder = require('claudia-api-builder');
var api = new ApiBuilder();
    
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});
    
api.registerAuthorizer('apiGatewayAuthorizer', {
  lambdaName: 'custom-authorizer', //AWS Labmda上のカスタム認証の名前
  headerName: 'Authorization' //Tokenを格納するHTTP headerのKey名
});
    
api.get('/news', function (req) {
  return dynamodb.get({
    TableName:'news',
    Key:{ "id": req.headers.id }
  }).promise().then(function(res) {
    return res.Item;
  });
},{ 
  customAuthorizer: 'apiGatewayAuthorizer' 
});
    
module.exports = api;

2. デプロイ

claudiaコマンドでAWSにデプロイします。設定ファイルclaudia.jsonが自動で作られます。

claudia create --region us-east-1 --api-module app
{
  "lambda": {
    "role": "myproj-executor",
    "name": "myproj-proj",
    "region": "us-east-1"
  },
  "api": {
    "id": "[PID]",
    "module": "app",
    "url": "[エンドポイントのベースURL]"
  }
}

3. AWS上の設定

  1. AWS DynamoDBのテーブル作成

    newsテーブルを作成する

     aws dynamodb create-table --table-name news --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
    

    idキーで検索できるようにレコードを追加。

     aws dynamodb put-item --table-name news --item '{"id":{"S":"id001"}, "content":{"S":"News content 001"}}'
     aws dynamodb put-item --table-name news --item '{"id":{"S":"id002"}, "content":{"S":"News content 002"}}'
         :
    
  2. AWS Lambdaのrole設定

    1. IAM > Roles > [作成したRole名]
    2. Attach Pollicy > AmazonDynamoDBFullAccess
      • 強すぎるので実際は適当なPolicyを作成

4. API実行

  1. PostmanなどでHTTPヘッダのAuthorizationキーにAccess Tokenを、idキーに存在するidを付与して投げます。

    Claudia.jsでAPIを作成した際にはCORSはデフォルトでONになっていますが制限することもできます。

5. アップデート

  1. スクリプトを修正します。
  2. claudiaコマンドを実行します。
claudia update --config claudia-auth.json
claudia update --config claudia.json

まとめ

Claudia.jsを利用すれば、外部の認証認可APIを用いたフロントエンドアプリのためのサーバレスアーキテクチャを簡単に実装できます。

以上