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ファイルから値を取得できたことを検証できているのに、ループを抜け後に、値を入れたはずのcurrency連想配列には何も入っていない、なぞで仕方ありません。

原因

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

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.

macOS CatalinaにMongoDBをインストール

概要

MacにMongodbをインストールする。

手順

以下のコメントではだめだった

$ brew install mongodb
~~(省略))
Error: No available formula or cask with the name "mongodb".
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
==> Searching taps on GitHub...
Error: No formulae found in taps.

mongodb-communityをインストール

この資料を参考にした

$ brew tap mongodb/brew
Updating Homebrew...
==> Tapping mongodb/brew
Cloning into '/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew'...
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (80/80), done.
remote: Total 462 (delta 38), reused 42 (delta 17), pack-reused 365
Receiving objects: 100% (462/462), 101.47 KiB | 298.00 KiB/s, done.
Resolving deltas: 100% (207/207), done.
Tapped 11 formulae (39 files, 171.5KB).
$
$ brew install mongodb-community
Updating Homebrew...
==> Installing mongodb-community from mongodb/brew
==> Downloading https://fastdl.mongodb.org/tools/db/mongodb-database-tools-macos-x86_64-100.2.0.zip
######################################################################## 100.0%
==> Downloading https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.4.1.tgz
######################################################################## 100.0%
==> Installing dependencies for mongodb/brew/mongodb-community: mongodb-database-tools
==> Installing mongodb/brew/mongodb-community dependency: mongodb-database-tools
🍺  /usr/local/Cellar/mongodb-database-tools/100.2.0: 13 files, 172.9MB, built in 4 seconds
==> Installing mongodb/brew/mongodb-community
==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
==> Summary
🍺  /usr/local/Cellar/mongodb-community/4.4.1: 11 files, 136.8MB, built in 3 seconds
==> Caveats
==> mongodb-community
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf

以下のファイルが作成されるということだ。

設定ファイル(/usr/local/etc/mongod.conf)
ログディレクトリパス(/usr/local/var/log/mongodb)
データディレクトリパス(/usr/local/var/mongodb)

$ ls -ld /usr/local/etc/mongod.conf /usr/local/var/log/mongodb /usr/local/var/mongodb
-rw-r--r--  1 liu  admin  161 10 25 11:52 /usr/local/etc/mongod.conf
drwxr-xr-x  2 liu  admin   64 10 25 11:52 /usr/local/var/log/mongodb
drwxr-xr-x  2 liu  admin   64 10 25 11:52 /usr/local/var/mongodb

設定ファイルの内容

systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1

バージョンを確認

$ mongod --version
db version v4.4.1
Build Info: {
    "version": "4.4.1",
    "gitVersion": "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1",
    "modules": [],
    "allocator": "system",
    "environment": {
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

2020/10月時点で最新の 4.4.1 である。

起動と停止

mongdbのバックグランドプロセスを自動起動させたい場合は

$ brew services start mongodb-community

自動起動を停止する場合は

$ brew services stop mongodb-community

手動で起動したい場合は、設定ファイルを指定して起動を行う(以下はバックグランドで起動させる場合)

$ mongod --config /usr/local/etc/mongod.conf &
[1] 5301

手動起動したmongodbを停止する場合は、Ctrl + C で止めるか、バックグランド起動した場合は、$ fgでフォアグランドにしてからCtrl + Cで止めればいい。

mongodbへ接続

mondodbを起動させた状態で接続するには

$ mongo

起動していない状態で接続すると、以下のようなエラーが表示される Error: couldn’t connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :

DB操作

DB確認

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

mongodbでのテーブルと行の概念

RDB mongodb
テーブル コレクション
ドキュメント

DB作成

> use test_db
switched to db test_db

test_db が存在するならそのdbに接続し、存在しなければ新しく作成する。

接続中のdbを表示するには

> db
test_db

dbを作成しただけでは、show dbsコマンドでは追加されない

>show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

追加するには、コレクションを作成する必要がある(下の例では vuln というコレクションを作成した)

db.createCollection('vuln')
{ "ok" : 1 }
> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
test_db  0.000GB

ドキュメントの作成

mongodbでは、列名やデータ型などを先にきめてから行を追加することはない。
1件のドキュメントを作成するには inserOne コマンドを使う。

> db.vuln({ name: "Apache Struts 2の脆弱性", level: "S0", limit_date: "2020-12-31"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5f954c22051b138e6af85465")
}

insertOneでドキュメントを作成する時、もし vuln コレクションが存在しない場合、その時に一緒に作成してくれる(便利!)。

作成したドキュメントを確認するには

> db.vuln.find()
{ "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S0", "limit_date" : "2020-12-31" }

もう1つを作成する

> db.vuln.insertOne({ name: "ATS DDoS脆弱性", level: "S1", limit_date: "2021-01-31"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5f95571d051b138e6af85467")
}
> db.vuln.find()
{ "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S0", "limit_date" : "2020-12-31" }
{ "_id" : ObjectId("5f95571d051b138e6af85467"), "name" : "ATS DDoS脆弱性", "level" : "S1", "limit_date" : "2021-01-31" }

find()で確認する内容をきれいにしたい場合は、pretty() を使う。

> db.vuln.find().pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}
{
    "_id" : ObjectId("5f95571d051b138e6af85467"),
    "name" : "ATS DDoS脆弱性",
    "level" : "S1",
    "limit_date" : "2021-01-31"
}

まさにjson形式。

ドキュメントを探す

2つの方法があり、1つはObjectIdを使うこと、もう1つはキーとその値を使って探すことができる。

> db.vuln.find(ObjectId("5f954d22051b138e6af85466")).pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}
> db.vuln.find({"name": "Apache Struts 2の脆弱性"}).pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}

ドキュメントの更新

Apache Strusts 2の脆弱性のレベルをS1に更新したい、

> db.vuln.update({"name": "Apache Struts 2の脆弱性"}, {$set: {"level": "S1"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.vuln.find().pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S1",
    "limit_date" : "2020-12-31"
}
{
    "_id" : ObjectId("5f95571d051b138e6af85467"),
    "name" : "ATS DDoS脆弱性",
    "level" : "S1",
    "limit_date" : "2021-01-31"
}

#### ドキュメントの削除
1件削除するにはdeleteOneを使う。

db.vuln.deleteOne({"name" : "ATS DDoS脆弱性"}) { "acknowledged" : true, "deletedCount" : 1 }

db.vuln.find().pretty() { "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S1", "limit_date" : "2020-12-31" }

#### コレクション一覧

show collections vuln

#### コレクションの削除
drop()コマンドを使う。

db.vuln.drop() true

コレクションがなくなると、先に作成したtest_dbが表示されなくなった。

show dbs admin 0.000GB config 0.000GB local 0.000GB

#### DBの削除

use test_db switched to db test_db db.dropDatabase() { "dropped" : "test_db", "ok" : 1 }

### まとめ
mongodbをMacにインストールし、一番初歩的な操作方法を体験した。使った感想としては、DBのスキーマに気にする必要がなく、json形式なドキュメントであれば、簡単に追加することができた。しかし、手打ちでDB操作コマンドを打つには、ちょっと慣れが必要と感じた。

大量な構造化されたjsonデータを追加し、表示させるような単純な動作(Webスクレイピング等)であれば、mongodbは手軽に利用できていいのではないかと思った。

### 参考資料
- [https://reffect.co.jp/windows/mac-mongodb-install:title]
- [https://qastack.jp/programming/58283257/mongodb-cant-find-data-directory-after-upgrading-to-mac-os-10-15-catalina:title]

Docker centos:centos8のロケール等を設定

概要

dockerでcentos:centos8のコンテナを作った時に、日本語ロケールになっていなかったので、設定した。

設定した手順をメモ書きする。

現在のロケール値を確認する

# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
# 
# locale -a | grep  ja_JP
#

日本語ロケールが定義されていない。

日本語の言語パックを入れる

glibc-locale-source と glibc-langpack-ja をインストール

# dnf install glibc-locale-source glibc-langpack-ja
~~(省略)~~
#
# locale -a | grep ja_JP
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
ja_JP.eucjp
ja_JP.utf8

ja_JP.eucjp と ja_JP.utf8 が入るようになったが、以前とエラーが出ている。
エラーの原因は、おそらくen_US.utf8 がインストールされていないことを推測。
以下のように対処する。

英語の言語パックを入れる

#  LANG=C dnf install langpacks-en glibc-langpack-en
Last metadata expiration check: 2:17:15 ago on Thu Oct 22 13:03:32 2020.
Package langpacks-en-1.0-12.el8.noarch is already installed.
Dependencies resolved.
========================================================================================
 Package                    Architecture    Version               Repository       Size
========================================================================================
Installing:
 glibc-langpack-en          x86_64          2.28-101.el8          BaseOS          821 k

Transaction Summary
========================================================================================
Install  1 Package

Total download size: 821 k
Installed size: 6.0 M
Is this ok [y/N]: y
Downloading Packages:
glibc-langpack-en-2.28-101.el8.x86_64.rpm               3.6 MB/s | 821 kB     00:00
----------------------------------------------------------------------------------------
Total                                                   993 kB/s | 821 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                1/1
  Installing       : glibc-langpack-en-2.28-101.el8.x86_64                          1/1
  Running scriptlet: glibc-langpack-en-2.28-101.el8.x86_64                          1/1
  Verifying        : glibc-langpack-en-2.28-101.el8.x86_64                          1/1

Installed:
  glibc-langpack-en-2.28-101.el8.x86_64

Complete!

現在のロケール値を再確認する

# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

これまで出ていたエラーがでなくなったが、英語ロケールになっている。

日本語ロケールに設定

# cat /etc/locale.conf
LANG=ja_JP.UTF-8
# source /etc/locale.conf ← これが重要!
# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
#
# echo $LANG
ja_JP.UTF-8
# date
2020年 10月 22日 木曜日 15:28:22 UTC

日本語環境にはなったが、TZが日本になっていない。

日本TZに設定する

# timedatectl set-timezone Asia/Tokyo
# date
2020年 10月 23日 金曜日 00:31:30 JST

ようやくロケールタイムゾーンを正しく設定できた。

参考資料

Adobe CS6は最新macOSでは起動できない

Adobe Illustrator&Photoshop CS6は最新のmasOS Catalinaでは動かない。
原因はmasOS Catalinaからは32bitアプリケーションが全部使えなくなったからだ。

以下のサイトにはいい参考情報が書かれている(ありがとうございます)

321web.link

ちょっと待ってよ、みれる方法があるみたい。

shinbido.com

不勉強だが、初めて「Parallels Desktop」というmasOSの最強と言われている仮想マシンを知った。