PreVimでPlantUMLをPreviewできるようにする

概要

以前、このブログで、Google Chrome拡張機能を使って、PlantUMLのシーケンス図を書く記事を書きました。すごく便利ですが、Chrome拡張機能が必要なので、環境によっては使えない方法でした。

今日は、previmという素晴らしいPluginを見つけたので、これの利用方法を書いておきます。

何のPluginか

プレビュー用のVimプラグインです。

何ができるか

インストール方法

vimの設定

.vimrcに以下を追加(vim-plugの場合)

call plug#begin('~/.vim/plugged')
...省略...
Plug 'godlygeek/tabular'
Plug 'plasticboy/vim-markdown'
Plug 'previm/previm'
...省略...
call plug#end()

let g:previm_open_cmd = 'open -a Safari'
nnoremap <Leader>p :PrevimOpen<CR>
let g:vim_markdown_folding_disabled = 1
let g:previm_enable_realtime = 1

上記設定により、filetypeがMarkdownのファイル(拡張子がmd)を編集する時に、コマンドで:PrevimOpen を実行すればSafariにてほぼリアルタイムで確認することが可能となる。

ブラウザの設定

.vimrcではプレビューにSafariを使う設定したため、Safariブラウザに次のように設定変更する 1. メニューバーの Safari > 環境設定 > 詳細 > メニューバーに"開発"メニューを表示にチェック 1. メニューバーの 開発 > ローカルファイルの制限を無効にする を選択

動作確認

PlantUMLのマインドマップを買いてみる

@startmindmap
+[#orange] 人
++[#pink] 女
++[#lightblue] 男
++[#lightgreen] その他
@endmindmap

Safari上では、以下のように表示される。

f:id:lgx:20210111010151p:plain:w200

まとめ

previmプラグインを使えれば、普通のブラウザで簡単にVimでPlantUMLを含めた形式の画像をプレビューすることができた。今後自分がはてなブログVimで書きながらプレビューで確認できるようになったため、超楽になります。

参考資料

PHPのpassword_hashによるパスワードハッシュ化

TL;DR

password_hash() は crypt() よりも簡単に強力なパスワードハッシュを作ることができる、 crypt() のラッパーであり上記互換性を持つ。
今回はこの関数によるハッシュ化の特徴をみていくことにする。

特徴

  • サポートしている暗号化アルゴリズム
    • PASSWORD_DEFAULT → bcrypt アルゴリズムでハッシュかする
    • PASSWORD_BCRYPT → CRYPT_BLOWFISH アルゴリズムでハッシュ化する
    • PASSWORD_ARGON2I → Argon2 を有効にしてコンパイルした場合のみ利用可能
    • PASSWORD_ARGON2ID → Argon2 を有効にしてコンパイルした場合のみ利用可能
  • ソルト
    PHP 7.0.0 以降、ソルトの自動生成が推奨された(より安全に)。
  • cost 2桁のコストパラメータは反復回数(ストレチング)の2を底とする対数で、値は 04 から 31 の範囲にいる必要があり、 それ以外の値の場合は crypt() は失敗。
    つまり、costデフォルトの10は、210 = 1024 回のストレチングになる。
  • ハッシュ値に、ソルトやcost等の値が付いている(ソフト付きパスワードハッシュ値

検証関数

password_verify() を利用し、生のパスワードとパスワードハッシュ値をパラメータにとり、パスワードがマッチするかを検証(true or false)。 * アルゴリズムやソルト値、cost等を知らなくてよい
パスワードハッシュ値にすべて含まれているため、別の場所から取得する必要がない。 * タイミング攻撃に対して安全(のようだ)

動作確認

<?php

$password = "abcdefg1234";

// Blowfishでパスワードハッシュを作る
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);

// 検証
if (password_verify($password, $hashedPassword)) {
    echo "hashedPassword=$hashedPassword" . "\n";
    echo "Hash match ok!\n";
}

?>

まとめ

crypt() では、開発者がアルゴリズム、ランダムなソルト、cost値を指定する必要があり、バグると、脆弱なハッシュ化処理になってしまう可能性はあるが、password_hash() ではcrypt() のラッパーとして、ほとんどの部分を中で自動指定されるようになったことで、より簡単に安全なハッシュ化処理を実現できる。

crypt() ではなく、password_hash() を使うべし。

Vimでファイルを暗号化

概要

Vimでファイルに暗号化して保存することができる。

操作方法

開く時に暗号化

$ vim -x file

開いたvim画面では、

f:id:lgx:20210103123437p:plain:w450

よくあることで、2回パスワードを聞かれる。
編集して、保存した後に、同じファイルを開くと、次のようにパスワードの入力を求める。

f:id:lgx:20210103124013p:plain:w450

編集中に暗号化する

:Xコマンドすると、パスワードを求める画面が表示され、同じく2回入力すれば暗号化される。

パスワードを変更する

$ vim +X file

現在のパスワードの入力を求められて、正しく入力すると、新しいパスワードを求める画面が出る(同じく2回)

f:id:lgx:20210103124636p:plain:w450

暗号化を解除

新しいパスワードを未入力にすることで解除できる。

暗号化のタイミング

実際に暗号化が行われるのはファイル保存時、書き込みせずに強制終了したら暗号化は適用されない。

暗号化方式

:set cryptmethodで分かる、vim8.2では cryptmethod=blowfish2 になっている。

参考資料:Vimとセキュリティ問題 - Vim と暗号化機能 | 株式会社創夢 — SOUM/misc
によると、以下のような方式がある(あった)

cryptmethod 解説
zip Pkzip 互換の暗号化方式。使用するべきではない。
blowfish blowfish というブロック化暗号方式。Vim 7.3 以上が必要。脆弱性が報告されている。使用するべきではない。
blowfish2 blowfish というブロック化暗号方式。Vim 7.4.399 以上が必要。暗号化シードを毎回再生成する。

blowfishについて

参考資料:Blowfish - Wikipedia
によると、blowfishは64bit単位ブロック暗号の共通暗号化方式であり、鍵長は32ビットから448ビットまでの可変長で、ライセンスフリー

Vim+Chrome+PlantUML Viewer→UML Sequence Diagram

TL;DR

Vimでテキストファイルを作成/編集すると、Google Chromeブラウザ上でシーケンス図がリアルタイムに書ける/変更されるようにするための手順をまとめる。

メリット

  • 作図ソフトウェア等に頼らなくてもよい
  • 普段慣れているエディタだけですらすら書ける
  • シーケンス図(に限らず、クラス図やアクティビティ図など)をテキストファイル形式でgit等でバージョン管理できる

環境

手順

必要なもの

  • Vim へ “plantuml-syntax” Pluginをインストール
  • Chromeに "PlantUML Viewer" 拡張機能をインストール

Vim へ “plantuml-syntax” Pluginをインストール

本家:https://github.com/aklt/plantuml-syntax

  • .vimrcとかに以下を追加(vim-plug方式の例)
call plug#begin('~/.vim/plugged')
Plug 'aklt/plantuml-syntax'
call plug#end()
  • 保存後、以下のコマンドでインストール
:PlugInstall
  • VimからChromeを起動できるコマンドを追加 .vimrcとかに以下を追加
au FileType plantuml command! OpenUml :!open "/Applications/Google Chrome.app" --args --disable-web-security --user-data-dir="dummy" file:///Users/liu/dev/plantuml/%

各オプションの説明

オプション 意味
plantuml plantuml形式のファイルの場合(@startumlで始まる)
OpenUml vimにて:OpenUml コマンドで打つ場合
open "/Applications/Google Chrome.app" MacGoogle Chrome.app をダブルクリックして開く
--args おまじない。openコマンドに送っているオプションなので必ず必要
--disable-web-security ChromeにCORS制限解除のオプション
--user-data-dir="dummy" ユーザデータフォルダを切り替えるオプションらしいが、--disable-web-security とセットで使わないと、CORS制限解除できなかったため、追加設定した。値がないと動かないため、ダミーを設定した
file:///Users/liu/dev/plantuml/% Chrome起動時に開くファイルURLを設定(任意。ない場合、Chromeから直接開けばいいので)

これで、(自分の環境の場合)Vimの設定が整えた。

Chromeに "PlantUML Viewer" 拡張機能をインストール

本家:PlantUML Viewer - Chrome ウェブストア

インストール後、以下の設定にする f:id:lgx:20210102152059p:plain:w450

動作確認

  • plantuml形式のテキストファイルを作成
    (自分の環境の場合)file:///Users/liu/dev/plantuml/ 以下に、vimで以下のテキストファイルを作成(hoge.uml
@startuml
participant User

User -> A: DoWork
activate A

A -> B: << createRequest >>
activate B

B -> C: DoWork
activate C
C --> B: WorkDone
destroy C

B --> A: RequestCreated
deactivate B

A -> User: Done
deactivate A

@enduml
  • VimからChromeブラウザを起動できるようコマンドを実行
:OpenUml

注意点Chromeブラウザを閉じた状態で実行する必要がある、さもなければ、CORS制限解除にならない。

Chromeが立ち上がり、以下の警告メッセージが出ていればCORS制限解除になっている証拠。
f:id:lgx:20210102135517p:plain

Chromeに実際に表示されているシーケンス図:

Vimでテキストファイルを編集すると、Chrome場ではリアルタイムに反映されることを確認済。

応用

Yahoo!ID連携(YConnect V2)のクライアントアプリの認可フローをVimでシーケンス図を書いてみた。

Yahoo! ID連携:Authorization Codeフロー - Yahoo!デベロッパーネットワーク

書いたシーケンス図(名称や番号は異なる)

まとめ

Vim+Chrome+PlantUML Viewer→UML Sequence Diagram を、環境整備から動作確認まで一通り終えたが、順調ではなくて、一番手こずったのは、ChromeのCORS 制限解除の設定あたりで、シーケンス図がうまく表示できない。javaやplantumlのソフトウェアをinstallしたり、試してNGしてはまたuninstallしたりしていた。

手軽にシーケンス図を作成できて、またテキストファイルなので、簡単にgit等でバージョン管理できる。現役エンジニア時代に出会っていればよかった。

以下のドキュメントが大変参考になり、ありがとうございます。

仮想通貨の理解

仮想通貨とは

ブロックチェーン技術に基づく、P2Pの電子決済システム。

特徴

  1. 中央に管理者がいない
  2. ブロックチェーン技術 ブロックチェーン技術とは、情報や取引履歴を正しく記録できる技術。改ざんが不可能で、セキュリティ性に優れているのが特徴といえる。
  3. 価格の変動が激しい

仮想通貨と電子マネーの違い

  • 発行元が異なる
  • 対応する法律が違う
  • 中央集権があるかないか
  • 利用できる場所が違う
  • 価格変動性が大きいかどうか
  • ポイントが貯まるかどうか

仮想通貨の分類

  1. ビットコイン(BTC)
  2. アルトコイン(altcoin)

BTCは仮想通貨の代表ともいわれる、主要な通貨。一方、アルトコインは、BTCを除くすべての仮想通貨を指し、それぞれが独自の特徴をもっている。 BTCがaltcoinに比較した時の特徴

  1. 時価総額トップ 誕生してからずっとトップの時価総額を維持しており、取引量も多いことから、他のアルトコインとは一線を画している。
  2. 決済利用がある 日本国内でも、大手家電量販店など、BTCを使って買い物ができる場所が増えてきてる。
  3. アルトコインを購入できる

BTC

国家という権威から離れた場所で、中央集権的な管理を受けない通貨がビットコインの目指した姿。

BTCの仕組・特徴

  • 中央銀行が存在しない
  • インターネット上に分散保存される取引台帳
  • 発行枚数に上限がある
    誕生した当時から、発行枚数が2,100万枚と決められている。
  • 世界中にリアルタイムで送金できる
    それまで数日かかっていた海外送金を、ほんの數十分のうちに完了させることが可能。

BTCの3つのメリット

  • 個人間で直接送金ができる
    理論的には10分、通常では長くとも40分程度あれば、相手がどこにいようと送金することが可能。
  • 手数料が安い
  • 世界中で両替せずに利用できる

BTCの3つのデメリット

  • 価格の変動が激しい
  • 即時決済が難しい
  • 決済サービスが少ない

BTCの価格推移の歴史

初めて値が付いたのは、2009年10月に「New Liberty Standard」というサイトによって提示された、1BTC=約0.07円という価格(マイニングにかかる電気代から算出された)。2010年5月には、フロリダ州に住むプログラマーがピザ2枚を1万BTCで購入したのが初めての決済と言われた(当時1BTC=約0.2円)。

およそ9年間で約200万倍も価値が上がった、ROI(投資利益率)の高い金融商品と世界中の投資家から注目を集めるようになる。

BTCの価格上昇につながる5つのポイント

  • ETFが承認されると価格が上昇する可能性が高まる
  • 決済が拡大すれば価値が上がる
  • ライトニングネットワークの実装で取引しやすくなる
  • AIの活用でビットコイン予測がしやすくなる
  • 法整備が整えば投資家が利用しやすくなる

BTCの半減期

半減期とは、BTCのマイニング報酬が半分になるタイミングのこと。
半減期に注目が集まる理由は、半減期を迎える仮想通貨は価格が上がる可能性が高いから。 半減期は、新規発行のペースを緩やかにするとともに、急激なインフレを防ぐ役割を担っている。 Bitcoin半減カウントダウン | Binance Academy

BTCのマイニング

マイニング=Mining=採掘=「挖矿」= 暗号を解読し新しいブロックを繋ぐ作業=取引記録の検証・確定作業

  • ブロックをチェーンにつないだ人に対してBTCが発行され、報酬が与えられる。
  • BTCが新たに発行されるのはマイニングに成功したときだけ。
  • マイナー = Miner = 採掘者

マイニング作業は、検証行為を行うブロック内のデータと、取引検証完了済の証である1つ前のブロックのハッシュ値と呼ばれる値、さらに、正解を導くことになる数値(ノンス)の3つのデータをハッシュ関数に入れる。

マイニングによって確認される正しいハッシュ値は、必ず先頭に一定のゼロが並ぶ仕組み。

f:id:lgx:20201229153824p:plain
マイニングの仕組み

Nonceを探す方法をProof Of Work(プルーフ・オブ・ワーク)という。

altcoin

BTCを除くすべての仮想通貨のことをいい、Alternative Coin略称。オルトコインとも呼ばれ、BTCの代替コインという意味がある。

日本で買えるaltcoin

  • イーサリアム(ETH)「以太坊」
    • 発行上限がない
    • スマートコントラクト
    • ICOInitial Coin Offering)によく利用される
    • トークンを発行しやすい、ウォレットの管理が簡単、多くのトークンの基盤を成している。
    • メリット
      • 送金の速さ(マイニングは15秒に1回)
      • 発行上限がない
      • 信頼性
      • 汎用性
    • デメリット
      • スケーラビリティの問題
      • スマートコントラクトの弊害
  • リップルXRP
    • 国際送金に強み
    • 大手企業と提携
    • 発行上限がある
      1000億枚と定められていて、すでに発行済。
  • ビットコインキャッシュ(BCH)
    • BTCから分岐
      発行上限はBTCと同様2100千万枚
    • ブロックサイズを拡大
      8MBに拡大
  • ライトコイン(LTC)
    • BTCよりもブロック生成時間が短い
      BTCの時間の1/4
    • 発行上限枚数がBTCの4倍
    • BTCと同様4年に一度の半減期がある
  • ネムXEM
    • PoI(プルーフ・オブ・インポータンス)を採用
    • コミュニティが活発
  • リスク(LSK)
  • ファクトム(FCT)
    • 書面やデータの管理
    • 様々な業界での活用
      記録の証明に強みを持つFCTは、データの公平性を重視する様々な業界での活用が期待されている。
  • イーサリアムクラシック(ETC)
  • モナコイン(MONA
    • 世界で初めてSegwit(セグウィット)を採用
      ほかの仮想通貨と比べて送金速度が速い(90秒程)
    • アトミックスワップの導入

マイニングする3つの方法と仕組み

ビットコイン(BTC)マイニングの3つの方法と仕組みを解説 | Coincheck

  1. ソロマイニング
  2. プールマイニング
    大人数で協力してマイニングを行う方法、報酬は参加人数で分けることになる。
  3. クラウドマイニング
    マイニングを行う事業者に投資し、成果を分配してもらう。

ハッシュレート

マイニングをする際の1秒あたりの計算力、採掘速度のこと。単位は hash/s で、「毎秒 ◯ ハッシュの計算ができる」ことを意味する。

マイニングマシン

  • ASIC(エーシック)というマイニング用に特化された集積回路
  • GPUジーピーユー)という高速描画処理の部品。 が使われている。

参考資料:
【最新版】誰でもノートパソコンで仮想通貨をマイニングできるHoneyMinerの使い方まとめ lifeforearth.com

販売場 / 取引場

Coincheck

口座開設手続き

  1. Coincheckのアカウント登録
  2. 基本情報を入力する
  3. 本人確認書類の提出
  4. 顔と本人確認書類の撮影

購入手続き(BTCの例)

  1. 暗号資産取引所に登録する
  2. 銀行振込で日本円を入金する
  3. BTCを購入する

購入方法

  • 販売所で購入
    運営会社からユーザーが仮想通貨を購入・売却することができる。運営会社が保有するコインを、提示価格で購入したり売却したりする仕組。
    • メリット
      常にコインを購入/売却する窓口が開かれている。
    • デメリット
      コインの価格に加え、スプレッド手数料が課される。
  • 取引所で購入
    ユーザー同士が仮想通貨を売買する。
    • メリット
      自分自身が購入/売却したい通貨の価格を決められる、販売所のようにスプレッド手数料が高く付くことはない。
    • デメリット
      販売所のように常に通貨が売られているわけではないため、取引相手を見つけるのに時間がかかる場合がある。

売買手数料(Coincheckの場合)

送金・売買・入出金手数料 | 仮想通貨取引所のCoincheck(コインチェック)

  • 日本円の入金手数料
    銀振は入金手数料無料(振込手数料はユーザー負担)
  • 日本円の出金手数料
    • 1回につき手数料は407円固定
    • 出金上限は1回あたり5000万円
  • 日本円の送金手数料

BTCの取引方法

ブロックチェーン(Blockchain)

ブロックチェーン技術及び関連技術(ブロックチェーン実装あり) - Qiita

仮想通貨で採用されている情報を記録・管理するための「分散型台帳技術」。

Blockchainのメリット

  • 改ざんが非常に難しい
    • 51%攻撃(https://coincheck.com/ja/article/218
      PoW(プルーフ・オブ・ワーク)を悪用して、全体の50%を超えてマイニングすると、不正な取引も承認することができてしまう。
      51%攻撃の脅威が話題となったきっかけに、2013年12月の「Ghash.io」というマイニングプールがあります。当時このプールの計算能力が50%を超えそうになり、ビットコインが大暴落した。
  • 管理運用コストが安い
  • システム全体としての安定性が高い
    BTCは2009年に取引が始められてから、これまで一度もシステムが停止したことはない。

Blockchainのデメリット

  • 時間あたりの取引数が小さい
    1つのブロックの記録容量が小さく、BTCのさばけるTX数は1秒間に7件ほどと言われている。
    課題解決に、メインのBloackchainから分岐する「サイドチェーン」を作り、Bloackchainの外側で取引を繰り返して最終的な結果だけをメインチェーンに記録する「オフチェーン」の手法を使ったりして、取引速度を上げる対策が進められている。
  • スケーラビリティ問題を抱えている
    取引量が増えると、送金に時間がかかったり、送金要求が承認されなかったり、取引手数料が高騰するといったスケーラビリティ問題が発生する可能性がある。
  • 関連法規の未整備
    日本では、2017年4月1日に施行された「改正資金決済法」によって、仮想通貨として暗号資産が定義された。

Blockchainの将来性

  • 未来的な取引法「スマートコントラクト」
    Bloackchain上で契約を自動的に実行するしくみのこと。
  • 金融(貯蓄、送金、証券取引、資金調達など)
  • 認証(本人確認、著作権管理、公証など)
  • 公共サービス(各種申告、納税、投票、医療など)
  • エンターテイメント
  • その他(データ管理、各種登記の自動化など)

エストニア共和国は、Blockchain技術を生した「電子政府」として有名。

注目サイト

勉強会資料

bashでtsvファイルを連想配列に入れる時にハマったこと

概要

bashtvsファイルを読み込んで連想配列に入れたい処理があり、うまくできず2時間程度ハマりました。最終的にはうまくできましたが、結構典型的なことだと思いますので、まとめてみました。

tsvファイル

例示するため、tsvファイルは以下のものを使います。

JPY<tab>日本円
USD<tab>ドル
CNY<tab>中国人民元
EUR<tab>ユーロ

このtsvファイルを詠込んで、次のような連想配列に入れる想定

currency(
["JPY"]="日本円"
["USD"]="ドル"
["CNY"]="中国人民元"
["EUR"]="ユーロ"
)

shell script

#!/usr/bin/env bash

TSV_FILE =./currency.tsv

declare -A currency
cat $TSV_FILE | while read code name; do
    echo [$code] [$name]
    currency+=([$code]=$name)
done

echo ${currency[@]}

実行結果

$ bash tsv2dict.sh
[JPY] [日本円]
[USD] [ドル]
[CNY] [中国人民元]
[EUR] [ユーロ]

あれれ、whileループ内でちゃんとtsvファイルから値を取得できたことを検証できているのに、ループを抜けt後に、値を入れたはずのcurrency連想配列には何も入っていない、なぞで仕方ありません。

原因

whileが悪いではなく、cat $TSV_FILEの結果をパイプで whiile ループに渡してたのがいけませんでした。

bashでは、パイプでデータを while ループに渡した後の処理は、子プロセス(fork)として動くため、親プロセスの変数は受け取れて使えるが、子プロセス内に変更した値が、親プロセス内には反映されないことになるため、currency連想配列は空のママになっている訳です。

参考:シェルスクリプトのwhile文の中の変数を外で使う方法 - Qiita

解決方法

パイプで標準出力を渡すのではなく、ヒアドキュメントでwhileループにデータを渡せば、whileループ内の処理も親プロセル内になるため、currency変数の値は後から引き継がれる。

while read code name; do
    echo [$code] [$name]
    currency+=([$code]=$name)
done << EOF
$(cat $TSV_FILE)
EOF

echo ${currency[@]}

実行結果

$ bash tsv2dict.sh
[JPY] [日本円]
[USD] [ドル]
[CNY] [中国人民元]
[EUR] [ユーロ]
ドル 日本円 中国人民元 ユーロ

連想配列から正しく出力できました。

参考:シェルスクリプトのwhile readループが悪いのか?回避策は? - Qiita

イントラネットからの情報収集

ローカル情報収集

ペネトレーションテスト(侵入テスト)の本質は情報収集。 * アカウント情報検索 今のアカウントのロールと権限を知り、権限昇格する必要があるかを判断するため。

win:whoami、net user username
linux:whoami、id、cat /etc/shadow、cat /etc/passwd 
  • NWとPortの情報検索
win:ipconfig、netstat -ano 
        ARP表:arp -a  
        ルーティングテーブル: route print 
        dnsキャッシュ:ipconfig/displaydns 
 
linux:ifconfig、ip a、netstat -anplt 
        ARPテーブル:arp -a / ルーティングテーブル:route -n 
        ログインログを操作しログイン元IPを特定 
  • プロセス一覧 特にセキュリティ関連アプリケーションが動いているかどうを確認する。
win:tasklist  
linux: ps、 top 
  • システムとパッチの情報検索 OSバージョンやパッチの更新情報を検索し、権限昇格の補助となる。
win:systeminfo,OSやパッチ情報 
       wmic qfe get Caption, description, HotfixID, installedOn   パッチ情報、説明へのリンク、パッチの説明、KB番号、更新情報等
       wmic qfe list full  全情報
 
Linux: uname -a でカーネルバージョン、rpm -qa でインストールパッケージを検索
Windows: 
パスワードHash、平文パスワード / ブラウザからパスワードを窃取 / サーバの平文パスワード etc.
linux: 
history記録 / shadowファイルを総当り攻撃 / mimipenguin でパスワード窃取 / Strace でログインパスワードの窃取  etc.