[ethereum] solidityで配列に格納して、値を返却する

Practice.sol
L 構造体Clientのclientsという配列に格納して、excesise関数でweightを-2として返却するコントラクトです。

pragma solidity >= 0.4.0 < 0.7.0;

contract Practice {

	struct Client {
		string name;
		string gender;
		uint256 weight;
		uint256 height;
	}
	Client[] public clients;

	function register(string memory _name, string memory _gender, uint256 _weight, uint256 _height) public returns(uint256 id) {
		id = clients.push(Client(_name, _gender, _weight, _height)) - 1;
		return id;
	}

	function excesise() public returns (uint256 newWeight){
		newWeight = clients[0].weight - 2;
		return newWeight;
	}

}

practice_test.js

	describe("practice()", () => {
		it("returns excesized weight", async() => {
			const practice = await PracticeContract.deployed();
			const expected = 63;
			await practice.register("yamada", "male", 65, 175);
			const actual = await practice.excesise.call();
			
			assert.equal(actual, expected, "Weight should be 63");
		})
	})

Contract: Practice
✓ has been deployed successfully
practice()
✓ returns weight (124ms)

2 passing (184ms)

[ethereum] solidityでtax計算

Practice.sol

contract Practice {

	function hello() external pure returns(string memory) {
		return "Hello, World!";
	}

	function tax(uint256 price) public pure returns(uint256 newPrice){
		 newPrice = price * 11 / 10;
		 return newPrice;
	}
}

practice_test.js

	describe("practice()", () => {
		it("returns tax in price", async() => {
			const practice = await PracticeContract.deployed();
			const expected = "110";
			const actual = await practice.tax(100);
			assert.equal(actual, expected, "should be 110");
		})
	})

$ truffle test

Compiling your contracts…
===========================
> Compiling ./contracts/Migrations.sol
> Compiling ./contracts/Practice.sol
> Artifacts written to /tmp/test-202209-108928-12xhvrv.xr0d
> Compiled successfully using:
– solc: 0.5.16+commit.9c3226ce.Emscripten.clang

Contract: Practice
✓ has been deployed successfully
practice()
✓ returns ‘Hello, World!’
practice()
✓ returns tax in price

3 passing (123ms)

taxのmultiplyは price * 1.1; とするとエラーになるので、price * 11 / 10;としないといけない。
なるほど、中々激しい。

opensslで暗号処理

バージョン確認
$ openssl version
OpenSSL 1.1.1f 31 Mar 2020

$ openssl enc
共通鍵暗号による暗号化と復号
ブロック暗号とストリーム暗号
ソルト、パディング、利用モード

-e: 暗号化
-d: 復号
-in: 入力ファイル(平文)
-out: 出力ファイル(暗号文)
-アルゴリズム: -aes256, -camellia256, -rc4など

-aes128
無線LANなどの通信データの暗号化に用いられる暗号化アルゴリズム。「Advanced Encryption Standard」の略
データの送信者と受信者が同じ暗号鍵を用いて、暗号化と復号を実行
128ビット長
通信データを区切り、置き換え・並べ替えのセットを複数回繰り返すアルゴリズム。最もセキュリティが強固。
base64はバイナリをエンコード

暗号化と復号化

$ echo '220104_input_text' | openssl enc -e -aes128 | base64
$ echo 'U2FsdGVkX1/miQdEamHLeWn5BmGbLJ3O+LpZTnWX8aRM1WSdbm6rr/2wZU68iqKZ' | openssl enc -d -aes128 -base64
enter aes-128-cbc decryption password:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
220104_input_text

crontabでModuleNotFoundError: No module named ‘mysql’

hoge.py

import requests
import mysql.connector
import config
from datetime import datetime
// 省略

$ sudo vi /etc/crontab

0 0    * * *   root    /usr/bin/python3 /home/ubuntu/hoge/cmd/hoge.py > /var/log/myjob.log 2>&1

$ cat /var/log/myjob.log
Traceback (most recent call last):
File “/home/ubuntu/reddit/cmd/_cardano.py”, line 2, in
import mysql.connector
ModuleNotFoundError: No module named ‘mysql’

なぜだあああああああああああ
2時間ぐらい格闘して

hoge.py

#!PYTHONPATH=/home/ubuntu/.local/lib/python3.8/site-packages
import requests
import mysql.connector
import config
from datetime import datetime

$ sudo service cron restart

これで上手くいった…

なぜ上手くいったのかさっぱりわからない….
とりあえずOKだわ、上手く動いているか明日再度確認する

pythonでmysqlを操作

$ pip3 install mysql-connector-python

mysql側の操作

create database reddit;
use reddit
create table polygon (
	id int auto_increment primary key,
	title varchar(255),
	score int
);

insert into polygon (title, score) values
("Daily Polygon Discussion Thread", 25);

db.py

import mysql.connector

conn = mysql.connector.connect(
user='root',
passwd='hogehoge',
host='localhost',
db='reddit'
)

cur = conn.cursor()

sql = "select * from polygon"
cur.execute(sql)

rows = cur.fetchall()

for row in rows:
	print(row)

cur.close

conn.close

$ python3 db.py
(1, ‘Daily Polygon Discussion Thread’, 25)

### insertの場合

sql1 = "truncate table polygon"
cur.execute(sql1)

sql2 = "INSERT INTO polygon (title, score) VALUES('Daily Polygon Discussion Thread', 4)"
cur.execute(sql2)
conn.commit()

mysql> select * from polygon;
+—-+———————————+——-+
| id | title | score |
+—-+———————————+——-+
| 1 | Daily Polygon Discussion Thread | 4 |
+—-+———————————+——-+
1 row in set (0.00 sec)

OK
これに翻訳を入れたい

from googletrans import Translator
translator = Translator()

text = "Daily Polygon Discussion Thread"
 
translation = translator.translate(text, dest='ja', src='en')
print(translation.text)

$ python3 tran.py
毎日のポリゴンディスカッションスレッド

OK
これを全部つなげる

mysql> select * from polygon;
+—-+———————————+———————————————————–+——-+———————+
| id | title | title_ja | score | date |
+—-+———————————+———————————————————–+——-+———————+
| 1 | Daily Polygon Discussion Thread | 毎日のポリゴンディスカッションスレッド | 4 | 2022-01-08 05:14:42 |
+—-+———————————+———————————————————–+——-+———————+
1 row in set (0.00 sec)

【React Native】Expoを触ってみる

$ node -v
v14.17.6
$ sudo npm install expo-cli –global
$ expo –version
5.0.3

Expoを利用するためには、Expoのアカウント作成が必要
https://expo.dev/signup

– ターミナルからログイン
$ expo login
✔ Username/Email Address: … georgia_premium
✔ Password: … **********

Success. You are now logged in as georgia_premium.

$ expo init myNewProject

$ cd myNewProject

– yarn start # you can open iOS, Android, or web from here, or run them directly with the commands below.
– yarn android
– yarn ios # requires an iOS device or macOS for access to an iOS simulator
– yarn web

$ export REACT_NATIVE_PACKAGER_HOSTNAME=192.168.34.10
$ export EXPO_DEVTOOLS_LISTEN_ADDRESS=192.168.34.10
$ expo start
http://192.168.34.10:19000/

ほう、中々すごい

Firebaseのrealtime databaseを使ってみる

$ curl -sS https://getcomposer.org/installer | php
// composer動作確認
$ php composer.phar
$ php composer.phar require ktamas77/firebase-php

$ sudo apt-get install php7.4-curl
$ php -v

require_once "vendor/autoload.php";

define("DEFAULT_URL","https://*-default-rtdb.firebaseio.com");
define("DEFAULT_TOKEN","");

$test = array(
	"name" => "Polkadot",
	"code" => "DOT"
);

$firebase = new \Firebase\FirebaseLib(DEFAULT_URL,DEFAULT_TOKEN);

$firebase->set("/users",$test);

$user = $firebase->get("/users");

echo $user;

$ php test.php
{“code”:”DOT”,”name”:”Polkadot”}

おおおおお、なんか感動した!

Beaconとは?

Beaconとは、低消費電力の近距離無線技術「Bluetooth Low Energy」を利用した位置特定技術

GPSは人工衛星から発する電波を活用して位置情報を把握する仕組み
Beaconは信号を半径数十メートル範囲に発信する発信機、建物の中や地下でも受信できる ただし、距離が限られる

Beaconの発信情報をスマホに表示されるなどができる

出席、遅刻などをbeaconを使って管理する

社会インフラがBeaconを提供すれば、それを活用してInput, Outputが出来そうではある

NFC(Near field communication)とは?

NFCとはかざすだけで周辺機器と通信できる技術
NFCのか通用でスマホ決済が利用できる
SuicaもNFCが活用されている

アメリカのモトローラが開発、CPU内蔵で高速
マイナンバーカード、運転免許証、パスワードなどに使用

Felicaはnanaco, iD, 楽天Edyなど多くの電子マネーで使用

### NFCチップ
NFCチップ(IC)が搭載されていれば、短波HF帯(13.56MHz)を利用して、すぐ近くにあるNFC対応機器とワイヤレス通信できる。ただし、通信速度は最大424kbpsと低速

ラズパイでNFCタグを読み取る例

なるほど、ICチップの中に、idやsuicaの残高や名前などの情報を埋め込んでるのね。
電流を流して、ICチップと情報のやり取りをしている

これICチップ作ってるところの独占技術だな
Android ChromeでWeb NFCってのもあるみたい