Nginx で CGI が実行できるようにする
TL;DR
CentOS8のコンテナ環境があり、そこにNginxをインストールしたが、デフォルトではCGIが実行できない。 今回はCGIが実行できるようにするために、環境設定を行う。
fcgiwrap のインストール
標準リポジトリに無いようなので、EPEL からインストール。
# dnf -y install epel-release ~~省略~~ Installed: epel-release-8-8.el8.noarch Complete! # dnf --enablerep=epel -y install fcgiwrap ~~省略~~ Installed: fcgi-2.4.0-36.el8.x86_64 fcgiwrap-1.1.0-12.20181108git99c942c.el8.x86_64 Complete!
Nginx の設定
/etc/nginx/fcgiwrap.conf を新規作成し、[/cgi-bin] 配下は CGI を有効にする
location /cgi-bin/ { gzip off; root /usr/share/nginx; fastcgi_pass unix:/var/run/fcgiwrap.socket; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
必要なディレクトリ作成と権限設定
# mkdir /usr/share/nginx/cgi-bin # chmod 755 /usr/share/nginx/cgi-bin
設定をしたいサイト定義の [server] セクション内に追記
vim /etc/nginx/conf.d/default.conf
server { listen ...... server_name ...... include fcgiwrap.conf; }
Nginx をリスタート
# systemctl restart nginx
FastCGI Wrap サービス用の Systemd ファイルを作成して起動する
/usr/lib/systemd/system/fcgiwrap.service を新規作成する
[Unit] Description=Simple CGI Server After=nss-user-lookup.target Requires=fcgiwrap.socket [Service] EnvironmentFile=/etc/sysconfig/fcgiwrap ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS} User=nginx Group=nginx [Install] Also=fcgiwrap.socket
/usr/lib/systemd/system/fcgiwrap.socket を新規作成する
[Unit] Description=fcgiwrap Socket [Socket] ListenStream=/run/fcgiwrap.socket [Install] WantedBy=sockets.target # 起動する # systemctl enable --now fcgiwrap Created symlink /etc/systemd/system/sockets.target.wants/fcgiwrap.socket → /usr/lib/systemd/system/fcgiwrap.socket.
テストCGIページ作成
/usr/share/nginx/cgi-bin/index.cgi を新規作成する。
#!/usr/bin/python3 print("Content-type: text/html\n") print("<html>\n<body>") print("<div style=\"width: 100%; font-size: 40px; font-weight: bold; text-align: center;\">") print("CGI Script Test Page") print("</div>") print("</body>\n</html>")
ブラウザからhttp://localhost/cgi-bin/index.cgi
問題なくできた。
特別感謝
Installing Google Translate to Vim
TL;DR
Things to do:
* Install Google Translate to Vim
My environment:
* macOS Catalina 10.15.7
Google Translate
Dependencies
Installation
$ which gawk $ brew install gawk
- translate-shell
$ cd /usr/local/share $ git clone https://github.com/soimort/translate-shell $ cd translate-shell/ $ make $ sudo make install $ which trans /usr/local/bin/trans
- translate-shell.vim
Installation with vim-plug:
Plug 'echuraev/translate-shell.vim'
- Creating key mapping for these commands e.g
nnoremap <silent> <leader>t :Trans<CR> vnoremap <silent> <leader>t :Trans<CR> nnoremap <silent> <leader>tc :Trans :zh<CR> vnoremap <silent> <leader>tc :Trans :zh<CR>
Translation
In Bash
action | example | explanation |
---|---|---|
basic usage | $ trans -s=zh -t=ja "你好吗?" | same with $ trans zh:ja "你好吗?"" |
auto identify | $ trans :zh "How are you!" | en to zh |
brief mode | $ trans -b :ja "How are you!" | お元気ですか? |
dictionary mode | $ trans :en word | used as a dictionary |
language identification | $ trans -id 世界你好 | 简体中文 |
Text-to-Speech | $ trans -b -p :zh "Saluton, Mondo" | -play (-p) option to listen to the translation |
Text-to-Speech | $ trans -sp "你好,世界" | -speak (-sp) option to listen to the original text |
Terminal Paging | $ trans -d -v word | -view (-v) option to view the translation in a terminal pager such as less or more |
Pipeline, Input and Output | echo "Hello world" | trans -b :zh | or $ trans -b -i input.txt :ja |
Translate a File | $ trans :ja file://input.txt | Brief mode is used when translating from file URI schemes |
Translate a Web Page | $ trans :zh https://www.yahoo.co.jp | Default broswer is launched and contents are translated while browsing |
Translate a Web Page | $ trans -browser firefox :ja http://www.w3.org/ | The specified broswer is launched and contents are translated while browsing |
Interactive Translate Shell (REPL) | $ trans -shell [en:zh] | Start an interactive shell using the -shell (or -I) option |
In Vim
- Translate a word under cursor
Using<Leader>t
likes
- Translate some lines in visual mode
The following example is using<Leader>tc
to translate to Chinese.
- Translate something via shell mode in Vim
Command
:!trans -b "Peace begins with a smile."
will show the following result
平和は笑顔から始まります 続けるにはENTERを押すかコマンドを入力してください
Summary
It is easy to install Google Translate to bash and Vim, and it's convenience to translate a word or some lines to any language you like, either in bash or Vim. It will make anyone more efficiently to to their work.
PreVimでPlantUMLをPreviewできるようにする
概要
以前、このブログで、Google Chromeの拡張機能を使って、PlantUMLのシーケンス図を書く記事を書きました。すごく便利ですが、Chromeの拡張機能が必要なので、環境によっては使えない方法でした。
今日は、previmという素晴らしいPluginを見つけたので、これの利用方法を書いておきます。
何のPluginか
何ができるか
インストール方法
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上では、以下のように表示される。
まとめ
previmプラグインを使えれば、普通のブラウザで簡単にVimでPlantUMLを含めた形式の画像をプレビューすることができた。今後自分がはてなブログをVimで書きながらプレビューで確認できるようになったため、超楽になります。
参考資料
PHPのpassword_hashによるパスワードハッシュ化
TL;DR
password_hash() は crypt() よりも簡単に強力なパスワードハッシュを作ることができる、 crypt() のラッパーであり上記互換性を持つ。
今回はこの関数によるハッシュ化の特徴をみていくことにする。
特徴
- サポートしている暗号化アルゴリズム
- ソルト
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画面では、
よくあることで、2回パスワードを聞かれる。
編集して、保存した後に、同じファイルを開くと、次のようにパスワードの入力を求める。
編集中に暗号化する
:X
コマンドすると、パスワードを求める画面が表示され、同じく2回入力すれば暗号化される。
パスワードを変更する
$ vim +X file
現在のパスワードの入力を求められて、正しく入力すると、新しいパスワードを求める画面が出る(同じく2回)
暗号化を解除
新しいパスワードを未入力にすることで解除できる。
暗号化のタイミング
実際に暗号化が行われるのはファイル保存時、書き込みせずに強制終了したら暗号化は適用されない。
暗号化方式
: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等でバージョン管理できる
環境
- macOS Catalina 10.15.7
- Vim 8.2
- Google Chrome 87.0.4280.88(Official Build)x86_64)
手順
必要なもの
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
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" | MacでGoogle 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 ウェブストア
インストール後、以下の設定にする
動作確認
@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
:OpenUml
注意点:Chromeブラウザを閉じた状態で実行する必要がある、さもなければ、CORS制限解除にならない。
Chromeが立ち上がり、以下の警告メッセージが出ていればCORS制限解除になっている証拠。
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等でバージョン管理できる。現役エンジニア時代に出会っていればよかった。
以下のドキュメントが大変参考になり、ありがとうございます。
仮想通貨の理解
仮想通貨とは
特徴
仮想通貨と電子マネーの違い
- 発行元が異なる
- 対応する法律が違う
- 中央集権があるかないか
- 利用できる場所が違う
- 価格変動性が大きいかどうか
- ポイントが貯まるかどうか
仮想通貨の分類
BTCは仮想通貨の代表ともいわれる、主要な通貨。一方、アルトコインは、BTCを除くすべての仮想通貨を指し、それぞれが独自の特徴をもっている。 BTCがaltcoinに比較した時の特徴
- 時価総額トップ 誕生してからずっとトップの時価総額を維持しており、取引量も多いことから、他のアルトコインとは一線を画している。
- 決済利用がある 日本国内でも、大手家電量販店など、BTCを使って買い物ができる場所が増えてきてる。
- アルトコインを購入できる
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つのデータをハッシュ関数に入れる。
マイニングによって確認される正しいハッシュ値は、必ず先頭に一定のゼロが並ぶ仕組み。
Nonceを探す方法をProof Of Work(プルーフ・オブ・ワーク)という。
altcoin
BTCを除くすべての仮想通貨のことをいい、Alternative Coin略称。オルトコインとも呼ばれ、BTCの代替コインという意味がある。
日本で買えるaltcoin
- イーサリアム(ETH)「以太坊」
- リップル(XRP)
- 国際送金に強み
- 大手企業と提携
- 発行上限がある
1000億枚と定められていて、すでに発行済。
- ビットコインキャッシュ(BCH)
- BTCから分岐
発行上限はBTCと同様2100千万枚 - ブロックサイズを拡大
8MBに拡大
- BTCから分岐
- ライトコイン(LTC)
- BTCよりもブロック生成時間が短い
BTCの時間の1/4 - 発行上限枚数がBTCの4倍
- BTCと同様4年に一度の半減期がある
- BTCよりもブロック生成時間が短い
- ネム(XEM)
- PoI(プルーフ・オブ・インポータンス)を採用
- コミュニティが活発
- リスク(LSK)
- サイドチェーン
- 開発言語がJavaScript
- ファクトム(FCT)
- 書面やデータの管理
- 様々な業界での活用
記録の証明に強みを持つFCTは、データの公平性を重視する様々な業界での活用が期待されている。
- イーサリアムクラシック(ETC)
- イーサリアム(ETH)から分岐
- 発行上限がある
- モナコイン(MONA)
- 世界で初めてSegwit(セグウィット)を採用
ほかの仮想通貨と比べて送金速度が速い(90秒程) - アトミックスワップの導入
- 世界で初めてSegwit(セグウィット)を採用
マイニングする3つの方法と仕組み
ビットコイン(BTC)マイニングの3つの方法と仕組みを解説 | Coincheck
- ソロマイニング
- プールマイニング
大人数で協力してマイニングを行う方法、報酬は参加人数で分けることになる。 - クラウドマイニング
マイニングを行う事業者に投資し、成果を分配してもらう。
ハッシュレート
マイニングをする際の1秒あたりの計算力、採掘速度のこと。単位は hash/s で、「毎秒 ◯ ハッシュの計算ができる」ことを意味する。
マイニングマシン
参考資料:
【最新版】誰でもノートパソコンで仮想通貨をマイニングできるHoneyMinerの使い方まとめ
lifeforearth.com
販売場 / 取引場
Coincheck
口座開設手続き
- Coincheckのアカウント登録
- 基本情報を入力する
- 本人確認書類の提出
- 顔と本人確認書類の撮影
購入手続き(BTCの例)
- 暗号資産取引所に登録する
- 銀行振込で日本円を入金する
- 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%を超えそうになり、ビットコインが大暴落した。
- 51%攻撃(https://coincheck.com/ja/article/218)
- 管理運用コストが安い
- システム全体としての安定性が高い
BTCは2009年に取引が始められてから、これまで一度もシステムが停止したことはない。
Blockchainのデメリット
- 時間あたりの取引数が小さい
1つのブロックの記録容量が小さく、BTCのさばけるTX数は1秒間に7件ほどと言われている。
課題解決に、メインのBloackchainから分岐する「サイドチェーン」を作り、Bloackchainの外側で取引を繰り返して最終的な結果だけをメインチェーンに記録する「オフチェーン」の手法を使ったりして、取引速度を上げる対策が進められている。 - スケーラビリティ問題を抱えている
取引量が増えると、送金に時間がかかったり、送金要求が承認されなかったり、取引手数料が高騰するといったスケーラビリティ問題が発生する可能性がある。 - 関連法規の未整備
日本では、2017年4月1日に施行された「改正資金決済法」によって、仮想通貨として暗号資産が定義された。
Blockchainの将来性
- 未来的な取引法「スマートコントラクト」
Bloackchain上で契約を自動的に実行するしくみのこと。 - 金融(貯蓄、送金、証券取引、資金調達など)
- 認証(本人確認、著作権管理、公証など)
- 公共サービス(各種申告、納税、投票、医療など)
- エンターテイメント
- その他(データ管理、各種登記の自動化など)
エストニア共和国は、Blockchain技術を生した「電子政府」として有名。