insta360 go 操作

電源オン/オフ 初期化

・アクションボタンを長押しするとGOが起動します。その際に2回振動します。
・アクションボタンを3秒間長押しすると電源が切れます。
・アクションボタンを20秒間長押しすると強制終了します。

※GOをスタンバイモードで30秒間放置すると自動的に電源が落ちます。

基本機能

・クイックキャプチャ
設定により秒数は変えられますが、30秒間の撮影を行います。
電源オフの状態でアクションボタンを1度押下します。
録画終了後、振動します。

・ハイパーラプス
電源オンの状態で素早く2回アクションボタンを押下します。
30分間の撮影を行います。撮影中は白色で早く点滅し、終了すると振動し電源が落ちます。

・スローモーション
電源オンの状態で素早く3回アクションボタンを押下します。
15秒間の撮影を行います。撮影中は白色で遅く点滅し、終了すると振動し電源が落ちます。

https://www.insta360.com/support/supportdetail?name=go
https://www.insta360.com/download/insta360-go
https://www.insta360.com/support/supportcourse?post_id=11139

BitDB query マニュアル

datapayのこれまで使ったクエリーまとめ。

特定のトランザクションデータを取得する

{
  "v": 3,
  "q": {
    "find": {
      "tx.h": "トランザクション"
    }
  }
}

特定のアドレスのデータを取得する

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "アドレス"
    }
  }
}

特定のアドレスで文字列検索する(AND検索)
検索対象の文字列.半角スペースで区切るとorで検索を行う。Not検索はワードの前に"-"をつける。(例:A not B -> A -B) また、A B Cという単語を検索する場合には "\"A B C \""とダブルクオーテーションを使用する。

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "アドレス",
      "$text": { "$search": "\"aaa bbb ccc\"" }
    },
    "limit": 5
  }
}

特定のカラム?で検索する

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "アドレス",
      "out.s4": { "$regex": "^正規表現", "$options": "i" }
    },
    "limit": 5
  }
}

オプションとかはmongodb参照
$regex — MongoDB Manual


5件表示の2ページ目を取得する

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "アドレス"
    },
    "limit": 5,
    "skip": 5
  }
}

最新のトランザクションでソートする

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "アドレス"
    },
    "limit": 5,
    "sort": {
      "blk": -1
    }
  }
}

取得データをjqで整形する

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "アドレス"
    }
  },
  "r": {
    "[.[] | .out[0] | { sample: .lb3} ]"
  }
}

BitCoinブロックチェーンに大きい?データをぶっっこんでみるテスツ

さて今回は画像をdatapayでぶっ込めるのかテスツです。
16進数にするなら画像だろうが、音声だろうが、動画だろうが入るはずなんですが、気になるのはお値段ですよね \(^0^)/

さてその前にですよ。僕らはbitdbを手に入れました。というかそのさらにビジュアライズなエクスプローラー。そしてbitstagramですよ。
そう、先に念のためにどうやって使用しているか確認するんですね!

bitstagramはURLがtxになっていました。
サンプルにこのお空のやつ引用させていただきます。
https://bitstagram.bitdb.network/m/raw/9aa7d98372890e2f929d9de9958fe7c6902a61d4a31df9e9ff12b454bb97cdc7

URLからTXは
9aa7d98372890e2f929d9de9958fe7c6902a61d4a31df9e9ff12b454bb97cdc7
と分かります。

ではレコードを拝見します。
https://genesis.bitdb.network/query/1FnauZ9aUH2Bex6JzdcV4eNX7oLSSEbxtN/ewogICJ2IjogMywKICAicSI6IHsKICAgICJmaW5kIjogewogICAgICAidHguaCI6ICI5YWE3ZDk4MzcyODkwZTJmOTI5ZDlkZTk5NThmZTdjNjkwMmE2MWQ0YTMxZGY5ZTlmZjEyYjQ1NGJiOTdjZGM3IgogICAgfQogIH0KfQ==

lb,lh2ってなんだろ。どうもそこに画像が入ってるっぽい

strをみると、編綴はないので、long base64, long hexかな(^^;

よし!!では"小さい"画像でやってみよう(笑)

test005.jsを作って、画像も同じ階層に入れます。
では150x150で。画像のサイズは13.6kb(13,931b)これ16進数にしてとりあえず長さ測ろう(笑)

89504e4...4ae426082

27863文字 27863bytes うーん1satoshiのfeeで投げて...3円くらい?何とも言えない。150pxだしな。画質にもよるか。今回はpngです。

参考
0.00000001
0.00027863

よしやってみよう。高くはない。

データペイ読み直したら(https://github.com/unwriter/datapay)
build:トランザクションを構築するため(ただし送信しない)
send:トランザクションの送信用
ってあった。テスト(build)して問題なければsendするんだね。

そしてついでに文字列やjsonも同時に送ってみるテスツ。ここまで出来ると色々データ設計できます。悪く言えばカオス。

var fs=require("fs");
var datapay = require('datapay');

fs.readFile("テスト画像.png",function(err,data){
	//Buffer(data).toString("hex")

	const tx = {
		safe: true,
		data: [
			 "0x6d02"
			,Buffer.from(data)
			,"テキストいれたり"
			,"jsonの配列入れたり"
		],
		pay: {
			key: "秘密鍵",
			feeb: 1
		},
	};

	datapay.send(tx, function(err, res) {//send build
		console.log(res);
	})
});

とりあえず実行!どりゃ!!!

"unconfirmed": -14211

あれ?予想より少ないぞ??画像でも抜けたんかな。
おぉお。。。おっぉおぉぉぉおおぉ!!!登録できてる臭いwwww
すぐにエクスプローラーでtxで検索して出てきました。いやふぅ

0.00014211なので1.5円以下でした。テキストとjsonも追加したけど。
これはちょっとやってみないと分からんもんですな!!ぎゃははワロチ

エクスプローラーで

{
  "v": 3,
  "q": {
    "find": {
      "tx.h": "トランザクション"
    }
  },
  "r": {
    "[.[] | .out[0] | { base64_png_img: .lb3} ]"
  }
}

ついでにリターンファンクションにjqとかつかって整形した。
OP_RETURN前の0ってなんだろう。datapayの時入ってる気がするぞ。あとで調べよう。
lb3が最初になるのがちょっと癖ある気がする。先頭のゼロがなくてもlb2だし。

しかしコードの記法覚えた。見やすいワロチ
画像はここで確認しました。
https://tomari.org/main/java/base64d.html

bitdbを活用しよう。

dbとquery使えたら便利ですよね。ということでbitdbを試します。
ノードを必ずしもたてる必要はない、APIを試してねということなのでAPIを試します。
sqlのベースはmongodbとのことで、その知識が使えます。

https://bitdb.network/

アカウントを作成してAPIキーをゲットします。これはDDos攻撃予防の為らしく、そこまで深い用途ではないそうです。

さて、html+jsのサンプルなどはありますが飛ばします。そこは重要ではないからです。

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "ウォレットアドレス"
    }
  }
}

これです。in.e.aは入力のe...のアドレスです。で、エクスプローラーで見ます。
サンプルURLはこちら

https://genesis.bitdb.network/query/1FnauZ9aUH2Bex6JzdcV4eNX7oLSSEbxtN/ewogICJ2IjogMywKICAicSI6IHsKICAgICJmaW5kIjogewogICAgICAib3V0LmIwIjogeyAib3AiOiAxMDYgfSwKICAgICAgIm91dC5zMSI6ICJoZWxsbyIKICAgIH0sCiAgICAibGltaXQiOiAxMCwKICAgICJza2lwIjogMTAKICB9Cn0=

これはbitdbにあるサンプルをちょっと加工してOP_RETURNにhelloってあるレコード取得するんだけど、これだと自分と関係ないレコード沢山取れてしまいます。最初はこれ興味本位で見たりするけど、我に返ると、こんな他人のデータ何ていらん訳です

で、上の様に自分のサーバで発行したアドレスで絞り込む
あとはなんだこの沢山のbやらsやらはーですが、

bitdbのマニュアルを翻訳して眺めてもらうとなんとなく分かります。
https://docs.bitdb.network/docs/intro_v3#bitdb-101

こことかもね。
https://docs.bitdb.network/docs/query_v3
b0、b1、b2、b3、b4、...:これらを使用して、base64エンコーディングでプッシュデータを照会します
h0、h1、h2、h3、h4、...:これらを使用して、16進エンコーディングでプッシュデータを照会します
s0、s1、s2、s3、s4、...:これらを使用して、UTF8エンコーディングでプッシュデータをクエリします(s属性は全文検索用にインデックス化されます)

これ生のレコードと、マニュアルを見て(・_・D フムフムって確認していかないと頭に入らない。
で、たぶんselectしかない!データ入れるのはdatapayかな。

BSV OP_RETURNにテキストを入れてみるテスツ

まずデータいれます。
アドレスから手数料引かれるのをみます。
トランザクションみます。
刻まれたのを見ます。

moneybuttonに送金、OP_RETURN入れるっていうスクリプトはなさそうだったので、
(moneybutton向けに送金とテキスト入れるみたいなのはある。)
datapayを使う事にしました。datapayを最初にやらんかったのはmemo.cashに投稿するみたいな文面があったから。

いや、memo.cashには投稿したくないなぁと思った次第。でも多分勘違いでmemo.cashには投稿されない。
memo.cash内で検索したけど出てこなかったし、普通にそんな意味不明なライブラリ作らんでしょ(笑)
memo.cashのAPIを使用するみたいなニュアンスととらえました。違うかな。

今後容量が大きくなってもこのまま使えるかは調べないと分からない。
画像を上げるbitstagramがあるので、そっちがどうやってるか確認すればいいかな。
https://bitstagram.bitdb.network/

とりあえず今はそれを考えない。一歩ずつ。

で、最初にどっかからどっかへ送金してそれでテキストなり刻むと思ったんですが、基本OP_RETURN使うときは
宛先は空みたいです。そう、送金せずに手数料だけ払う。送金は自分から自分へ?みたいなイメージですかね。

あと、バグってんのかライブラリ間のバージョンが合わないのか宛先を指定しても自分から自分にしかいかんかった。
まぁ送る予定はないのでいいかな。

まずサーバにアドレスを用意します。それは作れればこんな感じでみれます。

https://api.bitindex.network/api/v2/addrs/balance?address=サーバにあるアドレス

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 0,
      "unconfirmed": 0
    }
  ]
}

そこに着金させると、確認待ちになる。

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 0,
      "unconfirmed": 10000
    }
  ]
}

10分待つと

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 10000,
      "unconfirmed": 0
    }
  ]
}

みたいになります。これは送金した側で大抵見れるtxでも体験できます。
https://blockchair.com/bitcoin-sv/transaction/送金したトランザクション
https://whatsonchain.com/tx/送金したトランザクション

では、ついにサーバにあるアドレスにbsvが届きましたので、OP_RETURNにテキスト刻んでみます。

test.js

var datapay = require('datapay')

const tx = {
	safe: true,
	data: ["0x6d02", "刻みたいテキスト"],
	pay: {
		key: "前回作った秘密鍵",
		feeb: 1
	},
};
datapay.send(tx, function(err, res) {
	console.log(res)
})

これでtxアドレスが出力される。すぐにウォレットアドレスを見てみると...

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 10000,
      "unconfirmed": -252
    }
  ]
}

こんな感じで確認中の送金ってことでマイナスになって、いずれconfirmedが減額されます。
さて、トランザクションアドレスをみてみると...どっちでも見れるけど、whatsonchainの方がOP_RETURNは少し見やすい。

OP_RETURNのASCIIはちょい文字化けしているが、まー読める。
Scriptは16進数エンコードなんで、デコード(HEX変換)すれば読める。

テキストがマルチで入るかはまだ試してません。0x6d02ってなに?って方は以下プロトコル読めばすっきり。
https://memo.cash/protocol

ライブラリを使えば、ほんの数行で、実施できる。無駄のないスクリプトを目指したそうで、最高に処理も軽くて速いはずです。実際に速かったです。
次は、容量を増やしてチャレンジしてみます。画像とか、ながーいテキストとか。それをさらに取得。

するとできますね、(すべてではないけど)サーバレスなシステムが。

BitCoinSVで変わるブロックチェーンエンジニアの未来と簡単なプログラム導入部分

色々学んでビットコインブロックチェーンするならBSV一択の状況です。
法律、特許周りなども加味すれば、客観的に見てもBSV一択の状況です。
仮想通貨に熱狂する方は金儲けと損したくない一心で盲目になっています。

多数の会社が特許戦争を水面下で進めており、ITトップ企業同様に特許の多い会社しか残らないと思います。
nChain,IBM,アリババ...マスターカードなんてのもあります。
中国の会社が非常に多いので、今後世界は中国中心に動くことが伺えます。

さて、本業で時間がないながらもジワジワ学習に励んでいます。
何となく人様のブロックチェーンサービスを利用し、ライブラリも増え、
日本でも両手で数えられるくらいですが技術ブログを公開してくれるエンジニアも出てきました。

私はそれらの方を参考に「で、できたよ!」って記事を書きます。
まずnode.jsを触ったことない方、数年とんと触ってない方は、サーバ設定で敷居があります。
centosも6なら7,8くらいにしといた方がいいです。多分ね。

私は久しぶり過ぎて、npm initでpackage.jsonを作る事さえせずに、モジュールはいらねーぞと苦闘していました(笑)
やったら思い出すんですけどね、あーやったわみたいな。

さてさて、まずやったのが、アドレスをサーバで生成することです。そして、そのアドレスに少額送金すること、
そしてそして、承認待ちからOKに変わる感動(^v^

一旦ここまでで。

まずnodeモジュール、以下インスコします。まぁ、素直に入らなかったけど、入りました(^^;

npm init
...
npm install -g bsv
npm install -g bsv-mnemonic
npm install -g datapay

でtest.jsつくって、まず秘密鍵つくりまーす。
参考:https://docs.moneybutton.com/docs/bsv-private-key.html

var bsv = require('bsv')
var Mnemonic = require('bsv/mnemonic')
var datapay = require('datapay')

let privateKey = bsv.PrivateKey.fromRandom('mainnet')
console.log(privateKey.toWIF())

この出力した秘密鍵を大事に取っておきます。
次は公開鍵、からのアドレスです。test2.js

let publicKey = bsv.PublicKey.fromPrivateKey(秘密鍵)
console.log(publicKey.toHex())

let address = bsv.Address.fromPublicKey(publicKey)
console.log(address.toString())

はい、アドレスできました。残高みたい。しかしmoneybuttonのbsvライブラリにはない模様。
で、APIをサクッと叩きます。

https://api.bitindex.network/api/v2/addrs/balance?address=作ったアドレス

{
  "data": [
    {
      "address": "作ったアドレス",
      "confirmed": 0,
      "unconfirmed": 0
    }
  ]
}

ここに少額どっかから送金テストします。
すると...

{
  "data": [
    {
      "address": "作ったアドレス",
      "confirmed": 100000,
      "unconfirmed": 0
    }
  ]
}

こんな感じで着金されます!確認待ちも10分かな。確認前なら即座ですね。fee次第でしょうけど。
さて次回はここから、op_returnにテキストぶち込んでトランザクション確認して、無事埋め込みを確認しまーす。

moneybuttonの設置の仕方。

これはすでにmoneybuttonを使っている方なら簡単です。

< script src="https://www.moneybutton.com/moneybutton.js" >< /script >< div class="money-button"
data-to="****"
data-amount="0.01"
data-currency="JPY"
>< /div >

単位はJPYとして量を0.01とすれば自動で0.01円相場で支払いにできます。
docs.moneybutton.com