まだタイトルはありません。

まだタイトルはないのです。

typescript入門 with nem library

2017/09/22
自分が記事を読む立場から、この記事はいつ書かれたのだ!?というのが気になることが多々あったので冒頭と末尾に書き加えるようにします。

nem libraryがtypescriptで作られている、かつtypescriptをおすすめしているようなので、javascriptもまともに書けませんがなにかやってみようということです。

環境

ubuntu 16.04 LTS
npm v5.4.2
atom v1.20.0
typescript v2.5.2

参考

Can't find tsconfig.json command in Atom's toggle panel
TypeScriptってどんなもの? プロ生ちゃんと始めてみよう!
nem-library
NEM Libraryを使ってみる(1)

準備

Install atom-typescript

atomatom-typescript をインストールした。
ミスなどいろいろ教えてくれるし、保存したら自動でコンパイルさせることもできる。(はずだができていない...)
このパッケージ自体が他に必要なものがあるようで、いろいろと入れていいかと聞いてくるのでいれた。

ディレクト

プロジェクトディレクトを作成。

npmで管理する。
$ npm init

いろいろ聞かれてpackage.jsonが作られた。テストようなのであまり調べず全部yes。
ただし、ここでnameをtypescriptと指定したら後でtypescriptをインストールしするときに"Refusing to install as a dependency of itself"と言われた。
同じ名前はダメらしい。
参考:【エラー】Refusing to install as a dependency of itself

tsconfig.jsonを作成。
$  tsc –init

tsconfig.jsontsc(typescript compiler)の設定ファイル。 tsconfig.jsonを編集。自分の場合はもっと長かったが、最後に二行書き加えた。意味はsaveすると自動でjavascriptコンパイルしてくれる。
はずだったが"Unknown compiler option "strict""と言われ続けるのであきらめた。プラグインのエラーか私がなにか間違えているか...そもそもstrictを指定しなくてもエラーがでてしまう。

{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"noImplicitAny": false,
"sourceMap": false
},
"compileOnSave": true,  # この二行を
"buildOnSave": true     # 書き加えた。
}

なのでコンパイルtscで行った。

$ tsc fileName.ts    #コンパイル

Install nem-library and typescript

typescriptとnem-libraryをプロジェクトフォルダにインストール

$ npm i -D typescript nem-library

nem-libraryを使ってコンパイル => 実行までしてみた。

サンプルとしてblock chainの高さを参照しました。

main.ts
import {ChainHttp, NEMLibrary, NetworkTypes, Address} from "nem-library";
NEMLibrary.bootstrap(NetworkTypes.TEST_NET); //MAIN_NETも指定可
 
const chainHttp = new ChainHttp();
chainHttp.getBlockchainLastBlock().subscribe(block => {
console.log(block.height);
});

保存時の自動コンパイルができないため手動でコンパイル

$ tsc main.ts

実行

$ node main.js

以下のjsonが返されるので、block.heightとしてlogにはheightだけを表示させた。

Block {
height: 1125052,
type: 1,
timeStamp: 78220063,
prevBlockHash: { data: 'fce75e7787bff3549045bd5f506f0871c41815791eb6c03c0c8af6b2a7dc0ba0' },
signature: 'f051cc25acccb6442687aa34e2df9ab80de759462d0800867feea75651f5572e1099e8478cdea371a0dec42bcee8d0d82ce049ac67f69bd8983533896c5af606',
signer:
PublicAccount {
address:
Address {
value: 'TALIC367CZIV55GIQT35HDZAZ53CN3VPB3G55BMU',
networkType: 152 },
publicKey: '595613ba7254a20f1c4c7d215103509f9f9c809de03897cff2b3527b181274e2' },
transactions: [],
version: -1744830463 }  

2017/09/22

NEMのjavascript SDKを使ってみた!

NEM-sdkを使ってモザイクの情報を表示するサイトをつくってみました。
TEST netのアドレスがいくつかあってそのnamespaceとかmosaicの情報一覧したいなということで。

NEM-sdkの使い方

NEM-sdk
Githubからダウンロードし、NEM-sdk-master/dist内のnem-sdk.jsをプロジェクトのディレクトにいれる。

var nem = require("nem-sdk").default;

で利用できるようになる。
com, crypto, model, utilsの4つのnamespaceがあり、さらにいくつかのsubnamespaceがある。
namespaceに対して、Keywordsとともにメソッドを適用することでオブジェクトを取得したり生成したりするようです。
たとえば、アクセスするNISをオブジェクトとして生成する場合は

var endpoint = nem.model.objects.create("endpoint")("http://xxx.xxx.xxx.xxx", 7890);

とする。endpointをキーワードにすることで、endpoint生成時の引数としたIPにあるNISに対してAPIリクエストを行う、といったことができる。

通信するノードを設定する

var endpoint = nem.model.objects.create("endpoint")("http://xxx.xxx.xxx.xxx", 7890);

APIリクエス

nem.com.requestsネームスペースを使用。
例えば…
ブロックチェーンの高さを得るには

nem.com.requests.chain.height(endpoint).then(function(res){}

あるアドレスが保有するnamespaceを得るには

  nem.com.requests.account.namespaces.owned(endpoint, yourAddress).then(function(res){}
  // yourAddressにはNEMのアドレスをハイフンなしで

すると “data”: [{
“fqn”: “makoto.metal.coins”,
“owner”: TD3RXTHBLK6J3UD2BH2PXSOFLPWZOTR34WCG4HXH",
“height”: 13465
}]
が返される。どのようなデータが返されるかはNEMのAPIドキュメント を参照。

namespace, mosaic情報を表示

あるアドレスが保有するnamespace, mosaic保有量,入出金を表示。 複数アドレス対応。 自分がテストネットでアドレスたくさん作ってよくわからなくなるので、それを一覧表示させるだけのやつです。
テストネット用。アドレスはハイフン無しで入力。 f:id:kanna0000:20170914095017g:plain

nem info

PINE64をNEMのNISにする!/NISをPINEに入れる編

環境

  • PINE64
  • Arch
  • microSD(Transcend microSDHCカード 16GB)

    必要なもの

  • Java8
  • NIS
  • ufw
  • screen

    Install Java8

    jre8-openjdk-headlessをインストールした。

$ sudo pacman -Syu (pacmanをupdate)
$ sudo pacman -S jre8-openjdk-headless (インストール)
$ archlinux-java status (確認)
$ source /etc/profile (PATHを反映するようだ)

headlessというのはGUIがないもののことのようです。
参考
Java

nisをダウンロードしPINEに送る

NEMのサイトからダウンロードする。
なんだかリニューアルしたようです。
scpコマンドでpineに送った。

$ scp ~/Downloads/nis-0.6.93.tgz pine: 

ホストをpineとしArchインストール編でconfigに設定済み。コロンを忘れるとpineというファイルがローカルに生成された笑

nisファイルを解凍

$ tar -xvzf nis-0.6.93.tgz

参考
[Linux]ファイルの圧縮、解凍方法

nisを実行

とりあえず動作するか確認。

$ cd package
$ ./nix.runNis.sh

ブラウザでhttp://192.168.X.X:7890/node/info にアクセスして情報が見れれば動作しているはず。

firewallを設定

ufwをインストール

ufwとはUncomplicated Firewallというiptablesを私みたいな初心者でも扱いやすくしてくれたフロントエンドのようです。ありがたいですね。

$ sudo pacman -Syu
$ pacman -Si ufw
$ pacman -S ufw 

開けるところは開けて、余計なポートは閉じる

root権限が必要な設定が続くようなのでrootで操作した。 $ su

# systemctl start ufw
# ufw limit 2222 (前記事でsshに設定したポートを指定/ limitにすると30秒に6回以上アクセスしてくるのを拒否してくれるようだ)
# ufw allow http ()
# ufw allow 7890 ()
# systemctl enable ufw
# ufw status (設定を確認できる)

ルーターの設定で外部に対しても開く

この設定は各ルーターによって異なる。
だいたい同じだとは思うが…
1. ルーターにログイン
2. ポート転送に開放するポートとpine64のipを設定 (前記事で固定済み)
ポート転送で設定した。
TCP/7890/7890/192.168.X.X

screenを設定

SSHを切断してもPINEでNISを動かし続けるために利用

インストール

$ sudo pacman -S screen
$ screen -S nis (nisと言う名前のセッション開始)
$ ./nix.runNis.sh (nisを起動)
Ctrl-a d (デタッチ/デタッチすればsshを切ってもnisは動き続けてくれる。SSHを切るときはでタッチする)
再び戻るときは
$ screen -r nis
セッション一覧は
$ screen -ls

参考 screenコマンドの要点
Linux screenコマンド使い方

ねむい

とまあ一応動いてはいるのですが、同期が異常に遅すぎます。
なにか私側に原因があるよう。なぜなら、私より後に立てたのにもう全部同期している人がいる。
TEST NETも途中までのデータとかあるのかな?

とりあえず様子見ます。
セキュリティ的にまずい設定とかあれば、ご指摘くださいm(__)m

PINE64をNEMのNISにする!/PINE64にArch LinuxをインストールしSSH接続をする編

PINE64をNEMのNISにするまでの工程を記録したものです。
1. PINE64にArch LinuxをインストールしSSH接続をする。
2. PINE64にNISをインストール
の二部構成になると思われる。

PINE64にArch Linuxをインストール

基本的にはPINE64のWikiにしたがいます。

環境

1. ArchをmicroSDに書き込む

  • fdiskコマンドで書き込み先SDカードを探す。
  • ArchのimageファイルをWiki からダウンロードしddコマンドでmicroSDカードに書き込む。
$ sudo fdisk -l
$ sudo dd bs=4M if=/path/to/archlinux-20160501-longsleep-pine64-8GB.img of=/dev/yourDevice! && sync

microSDの容量を最大限利用できていなかったため、PINE 64でArch Linux +パーティション拡張の記事を参考にパーティションを拡張した。
microSDをPINE64に差し込み電源を入れる。電源ケーブルを差すだけ。ついでにEthernetも差し込んでおく。

2. SSH接続をする

2-1. SSH接続 

rootでログインした。 “@”のうしろは先程調べたローカルIPアドレス。 パスワードを求められるので初期パスワードrootを入力。

$ ssh root@192.168.X.X

3. PINE64を設定する

3–1. rootのパスワードを変更

新しいパスワードを設定する。
userを追加、newUserNameには任意のユーザー名を指定して追加する。パスワードも設定する。
alarmをwheelから外す。 詳しくはArch Wiki/ユーザーとグループを参照。

# passwd root
# useradd -m -G wheel newUserName
# passwd newUserName
# gpasswd -d alarm wheel

3-2. pacmanのupdate

ArchWiki/pacmanを参考に…
pacmanからインストールするときにはまずアップデートしなさいとWikiに言われました。

# pacman -Syu

3-2. sudoのインストールと設定

sudoをインストールし、wheelグループのユーザーに権限を与える。 sudoの設定方法にしたがって行った。

# pacman -S sudo
# visudo

   # %wheel ALL=(ALL)ALL の#を削除する。

4. サーバー側SSH接続設定

4–1. 公開鍵方式で接続

サーバーとクライントどちらで操作しているかに注意! 「Raspberry Piに公開鍵認証を使ってssh接続する」を参考にさせていただいた。

サーバー(Arch: PINE64)側の準備
$ mkdir .ssh (userのしたに.sshディレクトリがない場合は作成)
$ touch authorized_keys ("key"ではなく"keys")

クライアント(Ubuntu)側で鍵を作成(私はすでにed25519鍵を作成してあったのでそれを利用)  
$ ssh-keygen

それをサーバー側に送る
$ scp .ssh/id_ed25519.pub username@192.168.X.X:

サーバー側で送られた鍵をauthorized_keysファイルに書き込む
$cat ~/id_ed25519.pub >> .ssh/authorized_keys

ディレクトリやファイルのパーミッションを確認
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys


サーバー側で /etc/ssh/sshd_configファイルを編集
$ sudo vi /etc/ssh/sshd_config
#PubkeyAuthentication yes の#を消してコメントアウト

正しく接続できるか確認。
$ ssh username@192.168.X.X 

うまくいけばこの後の設定変更をすすめる。私はだいぶハマりました。
authorized_keysファイルをrootで作ってしまっていたようで…アクセスできなかったもよう。たぶん…。
うまくいかないときは権限に問題があるときが多いそうです。

4–2. パスワードログインの禁止

sshd_configファイルを編集するのですがそのまえにバックアップをとっておくという記事を後から発見。やってないので書きませんが…。

$ sudo vi /etc/ssh/sshd_config 

#PasswordAuthentication no をコメントアウトしパスワードログインを禁止。 ランダムにパスワード突っ込んで入るのを防ぐため、だと思う。

4–3. SSHポートの変更

つづけて #Port22 をコメントアウトし、どこか開いているポートを指定。
例えばPort12345

4–4. rootでのssh接続の禁止

さらに #PermitRootLogin ~を コメントアウトし PermitRootLogin no にした。
最後にsshdを再起動!忘れずに。

$ systemctl start sshd.service

7. クライアント側SSH接続設定

7–1. .ssh/configを編集

$ vi .ssh/config (configがない場合は作っておく)

/configに以下を書き込む

Host hostName(任意の名前, 接続時に仕様する)
    HostName 192.168.X.X
    User username
    Port 先ほど指定したport番号
    IdentityFile ~/.ssh/id_ed25519

7–2. SSH接続

上の設定により以下で接続できる。

$ ssh hostName

で接続できればうまくいっているはず。

NISを入れるの次の記事に続く…。

にしてもMediumは使いづらい。なにか書くのが心地よいものを使いたいところである。 ということではてなにした。書くのが心地よいわけではないが、書くのはworkflowyが便利、markdown対応だし。