2018年12月12日水曜日

PayPayのキャンペーン、1万円×10件と10万円×1件はどちらが得か

入門編的な確率の問題。

電子決済サービスのPayPayが、2018年末に「100億円あげちゃうキャンペーン」というのをやっている。決済1回ごとに抽選を行い、当選したら決済金額相当(最大10万円まで)を丸々ポイントバックするというものだ。

たとえばこれで買い物をする場合、同じ10万円分の決済を
  • 『10万円まとめて決済する』のと
  • 『1万円ずつ10回に分けて決済する』のと
どちらが得と言えるだろうか?という話。(明日の講義でそのまま出そうかな)

当選確率は加入者のステータスによって変わるが(ワイモバやSBのユーザーだと確率が上がるとか、まあそういうことね)、とりあえず標準の「40回に1回の確率」=0.025をベースに考えよう。別にここが0.05でも0.1でも、この後の議論に本質的には影響しない。

平均で比べる

一番分かりやすいのは、「平均いくらのポイントがもらえるか」の比較だろう。

10万円まとめて決済する場合、確率$0.025$で当選した場合10万円が得られ、確率$(1-0.025)=0.975$で0円が得られる。すなわちポイントバック額の平均は
\[ 100000\times 0.025 + 0\times (1-0.025) = 2500 \]
ということで平均2500円。
これに対して、1万円ずつ10回に分けた場合は1回のポイントバック額平均が
\[ 10000\times 0.025 + 0 \times (1-0.025) = 250 \]
となり、これを10回行うので平均はやはり2500円となる。つまり平均額に違いはない

当たる確率・外れる確率で比べる

「外れる」といっても、これは何回かの抽選を行って「一度も当たらない」という意味である。
10万円まとめての決済だと、抽選の機会は一度きりなので、当たる確率は$0.025$, 外れる確率は$(1-0.025)=0.975$。
これに対して、1万円ずつ10回決済する場合は抽選が10回行われる。これで一度も当たらない確率は
\[(1-0.025)^{10} = 0.7763\ldots\]
である。言い換えれば最低1回は当たる(場合によっては2回3回…10回当たるかも)確率は0.22程度であり、「当たった!」という喜びを得られる確率は高くなる

当たった時のポイントバック額で比べる

確率が高いとは言え、これは当たった際のポイントバック額を犠牲にして当たる悦びを追っているとも言える。10万円まとめての決済だと、確率0.025で当たった時は当然10万円が得られる。
これに対して、1万円ずつ10回の決済だと、10回のうちちょうど1回当たる確率はおおよそ0.2だが、ポイントバックは1万円だけ。10回のうち2回当たる確率は0.023で、1回だけの抽選で当たる確率より既に低いのである。しかもその時に得られるポイントバックは2万円。10回やって10回当たる確率は小数点のうしろに0が16個も付くほどの小さな値であり、10万円が得られる可能性はほぼ無いと言える。

分散という指標

つまるところ、10万円の決済を1回でやる場合と、1万円の決済を10回やる場合の違いは

  • 確率は低いが、当たった時のポイントバックが大きい方がいいと考えるか
  • ポイントバックの額は犠牲にして、当たって欲しいと考えるか
という違いであり、平均としては変わらない。これをうまく表現するための指標が、分散である。
この例でいくと、分散とは当たった時/外れた時のポイントバック額と、平均額とのずれがどの程度大きく生じるかを表している。分散が大きければ損も得も大きく、小さい場合は損得それぞれ平均に近いところで小さく振れる。分散には2乗の計算が含まれるので、元の数値(ここでは円という通貨)に単位を合わせるため、標準偏差(分散の平方根を取った値)を用いることも多い。

具体的には、10万円の決済1回の場合の標準偏差$\sigma$は
\begin{align*}
\sigma & = \sqrt{(100000-2500)^2 \times 0.025 + (0 - 2500)^2 \times (1-0.025)} \\
& = 15612.5\end{align*}
であるのに対して、1万円の決済10回の場合は
\begin{align*}
\sigma & = \sqrt{10 \times ((10000-250)^2 \times 0.025 + (0 - 250)^2 \times (1-0.025))} \\
& = 4937.1\end{align*}
となり、決済を10回に分ける方が標準偏差が小さい(=分散も小さい)ことが分かる。これが、損得の振れ幅が小さくなっているという意味である。

2018年6月28日木曜日

CentOS7でOpenVPNを動かしてみた件

はいはい備忘録備忘録。

1. インストール

以下、全部管理者権限で。
標準ではパッケージが用意されていないが、ソースから作るのも(アップデートとかを考えた際に)めんどいのでEPELを追加する。
# yum install epel-release
続いてopenvpnと、お手軽な証明書生成スクリプトのeasyrsaをインストールする
# yum install openvpn easy-rsa

2. 証明書と鍵の生成

 この辺のページこの辺のページを参考にしつつ作業。要するにまず認証局(CA)を作り、それをベースにサーバ側の証明書と秘密鍵の生成、という順序でやる。EPELパッケージでのeasyrsaスクリプトは/usr/share/easy-rsa//の下にある。
まず初期化。
/usr/share/easy-rsa/3/easyrsa init-pki
続いてCAの作成。
 # /usr/share/easy-rsa/3/easyrsa build-ca
鍵を利用するためのパスフレーズを2回入力し、Common Name(適当な名前)を入力する。このとき、カレントディレクトリにpkiというディレクトリが作成され、pki/ca.crt(証明書)とpki/private/ca.key(秘密鍵)が出来る。
次にサーバ証明書と鍵のペアを生成。
# /usr/share/easy-rsa/3/easyrsa build-server-full server nopass
 pki/issued/server.crt(証明書)とpki/private/server.key(鍵)が生成される。
(これは順不同)DHパラメータの生成。ちょっと時間がかかる。
# /usr/share/easy-rsa/3/easyrsa gen-dh
pki/dh.pemが生成される。まとめると、以下のファイルがカレントディレクトリ下に出来たことになるので、これらをまとめて/etc/openvpn/にコピる(設定ファイルで絶対パスを指定できるので、適当なディレクトリに置いても構わない)。
pki/ca.crt
pki/private/ca.key
pki/issued/server.crt
pki/private/server.key
pki/dh.pem

3. OpenVPNサーバの設定

設定ファイルは標準で/etc/openvpn/server.confだが、とりあえずサンプルをコピって修正してもよい。
# cp /usr/share/doc/openvpn-/sample/sample-config-files/server.conf /etc/openvpn/
以下の設定が有効になっていることを確認する。(行頭にシャープまたはセミコロンがあるとコメントアウトされた状態なので、有効にしたい場合は外す)
proto udp #tcpだと遅くなる
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
topology subnet
push "route 192.168.0.0 255.255.255.0" #VPN経由でアクセスしたいサブネット
tls-auth /etc/openvpn/ta.key 0
user nobody
group nobody
で、tls-authで用いるta.keyを生成する。
# openvpn --genkey --secret /etc/openvpn/ta.key
標準ではポート1194を使うので、開けておく。
# firewall-cmd --add-service=openvpn --zone=public --permanent

2018年6月13日水曜日

VMware ESXiにLet's Encryptで作成した証明書をぶっこむ件

手順を忘れないように記録。たとえばVMware ESXi  6.5がvmw.example.comで動いている前提。

  1. 手元のホスト(certbotが動けば何でもいい)でDNS-01 challenge validationを使った証明書取得を行う。以下では$PWD/certにcertbotの各種生成ファイルがあると仮定する。
  2. ESXiでSSHを有効にする
    • ナビゲータ→ホスト→アクション→サービス→SSHの有効化
  3. 取得した秘密鍵(privkey.pem)、証明書(cert.pem)、中間証明書(fullchain.pem)をESXiに転送。
    • scp cert/config/live/vmw.example.com/{privkey,cert,fullchain}.pem root@vmw.example.com:
  4. SSHでESXiにリモートログインし、ファイルをコピー。一応丁寧にバックアップを取っておく。
    • cd /etc/vmware/ssl
    • cp rui.key rui.key.old && mv /privkey.pem rui.key
    • cp rui.crt rui.crt.old && mv /cert.pem rui.crt
    • cp castore.pem castore.pem.old && mv /fullchain.pem castore.pem
  5. Web UIの再起動。
    • /etc/init.d/hostd restart
    • /etc/init.d/vpxa restart
    • 一部サイトではservice.sh restartで良いとも書いてあるが、VMwareのサポートページではやってくれるな(仮想マシンが全部死ぬ)とあるので、稼働状態ではやらない。
  6. 不正な証明書などの警告が出なくなることを確認。

英語配列のノートPCで日本語配列設定にしちゃった時に、アンダースコアを入力するTips

US配列のLG gram SuperSlimを購入した。で、Windowsの初期セットアップを始めたところ、最初に選択できるキー配列はMicrosoft IME(まあ要するに日本語配列)だけ。で、その後に「追加のキー配列」を選択できるのだが、後でやればいいやと思ってスルーしてしま...