AQUOS sense lite
2018/1/14
Nexus5のバッテリーの持ちが悪くなったので、ケータイをSHARPのAQUOS sense lite(SH-M05)に変えました。
よく使う/便利な機能
指紋認証
Nexus5はQiが付いているくせに指紋認証はなかったので、うまく反応してくれるときはとても快適です。全然認識してくれないときもありますが。
USB Type-C
向きを気にしなくてもいいので、これまた快適です。付属ケーブルはUSB Type-C to USB Standard-AのUSB2.0(だと思われる)ケーブルでした。さっそくなくしました...。
ちなみにACアダプターはSHARP製のSH-AC04で、出力は5V、1Aでした。
スクリーンショット
この機種は電源ボタンと音量ボタンの両方が本体右側面についています。スクリーンショットが少しとりずらいです。
そこで、Clip nowという機能が用意されています。
www.youtube.com 基本的にメーカー独自機能やアプリは嫌いです派ですが、これは便利で使っています。
オートスクロール
これまた独自機能のようですが、自動で画面スクロールをしてくれます。ブラウザなどで長文読むときには便利です。すこしカタつく気がしないでもないですが。
よくないところ
Wi-Fi
Wi-Fiは2.4GHzのみの対応のため注意が必要です。
カバーとガラスパネル
ガラスパネルはラスタバナナのもの。
カバーはAmazonで安かったものをとりあえず買いました。
ガラスは縁まで完全には覆えていなくて、それがちょうどよくカバーと干渉しないためよかったです。
twitter: かんな (@kannapoix_jp) | Twitter
2018/1/14
keepassのロックを指紋認証で解除するときに発生する問題。
2018/1/5
だいぶ使っていたNexus5からAquos sense lite(Aquos)に携帯を変えました。
パスワードマネージャにはkeepassを愛用しております。
Aquosは指紋認証機能を搭載しているので、keepassでも指紋認証を利用しようとしました。
このとき、ある問題が生じたので共有いたします。
環境
Aquos sense lite SH-M05
android 7.1.2
keepass 2.2.0.9
期待される動作
keepassで指紋認証を利用する場合、一度はマスターパスワードを入力する必要があります。
入力した後、OKボタンを押さずに端末の指紋認証を行います。
以後は、指紋認証のみでログインできるようになります。
生じる問題
上記のように指紋認証を一度有効化したあとに、端末の指紋認証設定を変更した場合にkeepassでの指紋認証が行えなくなります。
どのような変更を施した場合に使えなくなるか詳細に検証はしていませんが、登録されていた指紋をすべて削除したのち、新たな指紋を登録した場合、keepassには "invalid key"と表示され指紋認証機能が正常に機能しません。
解決策
これは既知の問題のようで、Githubにも報告がみられます。
How to use fingerprint sensor unlock feature · Issue #241 · bpellin/keepassdroid · GitHub
解決するには、一度keepass自体をアンインストールし、再びインストールするしかないようです...。
2018/1/5
NEM-sdkを使ってオフラインで署名して、オンラインでアナウンスする。
オフラインで簡単に署名できない暗号通貨なんて使いたくないですよね?そんなものは危なくて使えたもんじゃないとみなさんお思いになられているかと思います。取引所、webウォレットはもちろんのこと、オンラインにしているデスクトップクライアントウォレットでさえ不安なことでしょう...。
そこで、NEM-sdkを利用して、オフラインで署名した取引を作成するプログラムと、それをアナウンスするプログラムを書いてみました。
プログラミングなんか興味ないや、コード読みたくないや、という方は最後の、「NEMのいいところ」だけ読んでいただければと思います!
Github: nem_offline
準備
環境
NEM-sdk
node.js
javascrpt
ディレクトリ構造
offlineSigner ├── key.json ├── node_modules ├── offlineSigner.js ├── package-lock.json ├── sender.js └── serializedTransaction
sdkをinstall
NEM-sdk: GitHub - QuantumMechanics/NEM-sdk: NEM Developer Kit for Node.js and the browser
プロジェクトディレクトリ(offlineSigner)で
npm install nem-sdk
してNEM-sdkをインストールしておきます。
これでファイル内で
var nem = require("nem-sdk").default;
することで、sdkが使えるようになります。
signer.js
アドレス生成
まずはオフラインで署名するスクリプトを書きましょう。
が、秘密鍵がないと署名もなにもないので、アドレスも生成し、別ファイルに保存しておきます。
①ネットワークIDでテストネット、メインネット、Mijinから任意のIDを指定します。
②秘密鍵を生成しペアとなる公開鍵を生成
③公開鍵からアドレスを生成
var networkId = -104; // test net = -104 var rBytes = nem.crypto.nacl.randomBytes(32); var privateKey = nem.utils.convert.ua2hex(rBytes); var keyPair = nem.crypto.keyPair.create(privateKey); var publicKey = keyPair.publicKey.toString(); var address = nem.model.address.toAddress(publicKey, networkId);
commonオブジェクトの作成
commonオブジェクトは秘密鍵から生成します。
var private_key = PRIVATE KEY var common = nem.model.objects.create("common")("", private_key);
取引の作成(transaction entiry)
nem.model.objects.createを利用。
送金先(recipient)、送金量(amount)、NEMではメッセージも指定することができます。
var transferTransaction = nem.model.objects.create("transferTransaction")(recipient, amount, message); var entity = nem.model.transactions.prepare("transferTransaction")(common, transferTransaction, nem.model.network.data.testnet.id);
署名
nem.model.transaction.sendを利用して送金しようとすると、秘密鍵から作られるcommonオブジェクトが必要になってしまいます。
オンラインで秘密鍵を扱いたくないため、オフラインで署名済み取引を生成し、それをネットワークに送信するようにします。
①nem.model.transaction.send内の処理のうち、署名部分をSign functionとして利用。
取引の内容を保持するentityに秘密鍵から作られたcommonオブジェクトで署名しています。
function sign(common, entity) { if(!entity || !common) throw new Error('Missing parameter !'); if (common.privateKey.length !== 64 && common.privateKey.length !== 66) throw new Error('Invalid private key, length must be 64 or 66 characters !'); if (!nem.utils.helpers.isHexadecimal(common.privateKey)) throw new Error('Private key must be hexadecimal only !'); let kp = nem.crypto.keyPair.create(nem.utils.helpers.fixPrivateKey(common.privateKey)); let result = nem.utils.serialization.serializeTransaction(entity); let signature = kp.sign(result); let obj = { 'data': nem.utils.convert.ua2hex(result), 'signature': signature.toString() }; return obj }
sender.js
nem.com.requests.trasaction.announceで先ほど作った署名済み取引をネットワークにアナウンスします。
signをオフラインpcで実行し、USBなどで署名済み取引をオンラインpcにもってきてアナウンスするという形がシンプルです。が、署名済み取引をQRにしスマホで読み込むとか便利でいいですね。最近そんなようなの誰かがつくってると聞いたよう聞かないような...。
NEM Hot/Cold Wallet: The First Ever NEM Cold Offline Wallet You Can Use To Send And Receive Funds - Blog Posts - NEM Forum
)
function announce(endpoint) { fs.readFile('./serializedTransaction', 'utf8', (err, file) => { var obj = file nem.com.requests.transaction.announce(endpoint, obj).then(function(res) { console.log("announced!"); }); }); };
このプロジェクトの今後
秘密鍵ファイルの暗号化
マルチシグ対応
アポスティーユ対応
コマンドラインツール化
などをしたいですが...
あまりJavascriptは好きではないのでやる気がないです。
nem-toolchain | Command line toolchain for NEM blockchain
というのがあるようなのでgoがかけるなら(書けるようになって)こっちを手伝いたいなぁと思っております。
NEMのいいところ
アドベントカレンダー用の記事ということで...
私はBitcoinから暗号通貨の世界に踏み込みましたが、Bitcoinに関連したプログラムを作成することはハードルが高かったです。もちろんエンジニアではないからですが...。
しかし、NEMは私のような素人でも簡単にプログラムを書くことができます。
NEMに触れるようになって、実際にプログラムを書くようになりました。
コードを読むようになりました。
偉そうに開発者に質問したり、バグを報告したりするようになりました。
私にとってNEMは新しい世界に踏み込むきっかけとなりました。
そしてこの世界は楽しいです。常に新しいことであふれています。これさえあれば生きていけると皆さん思っておられることでしょう。
なにを迷うことがあるのでしょうか。今日から取引なんてくだらないとこはやめて開発しましょう。 (取引していることが暗号通貨にとって不要だと言っているわけではない。でも、取引はあなたがやらなくても誰かが絶対やってくれます!)
取引している暇があったら調査です。
取引している暇があったら開発です。
なぜならば....。
仮想通貨は詐欺です。
— もなくお (@ocknamo) 2017年12月9日
だからです。
本物にするのは開発者です。
一般人から見れば草コインもNEMも同じ詐欺に見えるでしょう。
なにが違いを生じるとすれば、それは取引している人によってではなく、開発している人によってです。
そしてこの言葉も心に刻みましょう。
Talk of tech innovation is bullsh*t. Shut up and get the work done (by Linus Torvalds) 偉そうに語ってないで、さっさとやることやれ。
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
atomにatom-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.jsonはtsc(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 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保有量,入出金を表示。
複数アドレス対応。
自分がテストネットでアドレスたくさん作ってよくわからなくなるので、それを一覧表示させるだけのやつです。
テストネット用。アドレスはハイフン無しで入力。
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
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を設定
インストール
$ 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に書き込む
$ 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接続をする
- サーバ:Arch(PINE64)
- クライアント:Ubuntu
- デフォルト username: alarm, passwd: alarm
- デフォルト root user: root, passwd: root
PINE64のIPアドレスを調べ、IPアドレスを固定 LinuxのコマンドでUbuntuから調べられるはずですが、よくわからないのでFingというアプリを利用。
PingしてEthernetケーブルが光るので判別した笑
IPアドレスとMACアドレスをメモしておき、ルーターで固定するように設定する。
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対応だし。