俺、サービス売って家買うんだ

Swift, Kotlin, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

クレジットカードに関する覚書

f:id:ie-kau:20191003234248p:plain

用語

  • マーチャント
    • 加盟店、お店
  • カスタマー
    • カード利用者(僕ら)、 card holder

国際ブランドとは

Visa, Mastercad とか決済システムを提供している企業のこと。 やっていることは

  • 決済システムの提供
    • 残高(balance)計算

勘違いしていたけど、(自社のカードを発行してない限り)与信管理はやってない。無論ポイント管理もやっておらず、顧客情報を持たない。
国際ブランドは現在7つ存在している。

  • Visa
  • MasterCard
  • American Express
  • JCB
  • 銀聯(UnionPay)
  • Discover Card
  • Diners Club

発行会社(issuer)

国際ブランドからライセンスを得てカードを発行する会社のこと。 一般的にカード会社といえばこちら側を指す。
ポイントとかサービスに関する情報を持っているケースが多い。有名所では、クレディセゾン、UCカードなど。アメリカだと銀行が発行会社となる。 またマーチャントへの支払い責任を持つのは発行会社となる。

提携カード

発行会社が自社以外の企業や団体と提携して発行するカードのこと。提携元の特典が得られる。
早稲田カードとか。

※参考

カード番号

最初の6桁はBIN(Bank Identification Number, 銀行識別番号)またはIIN(Issuer Identification Number, 発行者識別番号)と呼ばれ、カードのイシュア(発行事業者)を特定する。

wikipediaによると、↑とのこと。

カード プレフィックス 番号長
Visa 4 16
MasterCard 510000 - 559999, 222100 - 272099 16
American Express 34, 37 15
JCB 3528 - 3589 16
銀聯 622126 - 622925, 624 - 626, 6282 - 62883 16
Diners Club International 300 - 303574, 3095, 36, 38 - 39 14
Discover Card 60110, 60112-60114, 601174 - 601179, 601186 - 601199, 644 - 649, 65 16

BINLists.COM。これを使う issuer がチェックできる。 ビューカードでルックアップすると、ユーシーカードが出てくるので、ビューカードはユーシーカードが大本の issuer になるっているようだ。

プリペイドカードとは?

僕ら世代にわかりやすいのはテレカ。前払式支払手段の一種。
最近よく聞くところで。

参考

DNSやらまとめ ③ - レジストリ/レジストラ🤔 -

f:id:ie-kau:20190917003240p:plain

トップレベルドメイン

  • ドメイン名のヒエラルキーの最上位(google.comのcom)とか
    • gTLD
      • Generic top-level
        • com, info, org などのカテゴライズされたトップレベルドメイン
    • ccTLD
      • Country code top-level domain
        • jp, us など国を表すトップレベルドメイン

ルートドメイン(ルートドメインサーバー)

  • ドメインに割り当てられる名前空間の最上位 ' ' (empty string) で表現される
  • ルートドメインサーバーのゾーンはトップレベルドメインのホスト名とIPをアドレスを管理している
  • 記事投稿現在、730のgTLDと301のccTLDを管理しているとのこと。

ICANN

  • トップレベルドメインを管理する、非営利団体
  • IANA
    • Internet Assigned Numbers Authority
    • もともと、名前空間なのどのインターネットにおける資源の管理を行っていたが、現在はその役割をICANNに引き継いでいる
    • ICANNの機能名としてその名前が現存している

レジストリ(a domain name registry)

  • トップレベルドメイン名と登録者情報のデータベース

レジストラ(a domain name registrar)

  • ユーザーの要求を受けてドメインをレジストリに登録する業者の総称
  • 日本だとGMOのお名前.comが有名
    • ここで一覧が見られる
  • 勘違いしていたけどムームードメインは代行業者であってレジストラではな
    • => SRS(※後述)へのアクセス権はない

SRS(Shared Registry System)

  • レジストラがレジストリに変更を加えるられるシステム
  • ICANNから認定を受けているレジストラのみがアクセス可能

関連事項

噂では知っていたのだけど、特定の国のトップレベルドメインを利用した場合、Google側がその国の記事と判断してしまうため、実際の国内でのSEOが弱くなってしまうらしい。
以下はnoteはmu(モーリシャスの国別トップレベルドメイン)にしているけど、comに変えようとしているという内容。

note.mu

参考記事

DNSやらまとめ ② - CAAレコードについて覚書 -

f:id:ie-kau:20190917003511p:plain

まぁ、本題はこちらでLet's Encrypt の CAA 周りの設定ですっころんだので覚書。

CAAレコードとは

A Certification Authority Authorization (CAA) record is used to specify which certificate authorities (CAs) are allowed to issue certificates for a domain.

証明書が発行できる CA に制限をかけられるレコード.

If no CAA record is present, any CA is allowed to issue a certificate for the domain

  • CAAレコードがない場合はすべてのCAが該当のドメインに対して証明書を発行できる。
  • CAAレコードがある場合はレコードに存在するCAのみ証明書を発行できる.
  • 本仕様の目的としては予期しない証明書の発行リスクを低減させるもの。

CAAレコードは継承でき、expamle.com に設定した場合同様に、subdomain.example.com にも適応される。

example.com.        CAA 0 issue "letsencrypt.org"
alpha.example.com.  CAA 0 issue "comodoca.com"
beta.example.com.   CAA 0 issue "letsencrypt.org"
beta.example.com.   CAA 0 issue "comodoca.com"

上記でいうと、デフォルトで Let's Encrypt の証明書に設定されている。
ただし、 alpha.example.com は Comodo CA からの証明書発行しか受け付けない。
また、 foo.example.com はexpample.com の設定を継承するので Let's Encrypt の 証明書の発行を受け付ける。

※参考元

support.dnsimple.com

Let's EncyptにおけるCAA

こちらに色々書いてある

letsencrypt.org

Since Let’s Encrypt checks CAA records before every certificate we issue, sometimes we get errors even for domains that haven’t set any CAA records.

Let's Encrypt ではすべての証明書を発行するまえに、CAAのチェックを行っているので、 CAA レコードを設定していなくてもエラーを返すことがある。

さて、すっころんだ内容

実際におこったやつ(example.comは伏せ字)

Failed authorization procedure. www.example.com (http-01): urn:acme:error:dns :: DNS problem: SERVFAIL looking u
p CAA for example.com

のエラーで証明書が作れなかった。

SERVFAILが起こったときに見るもの

  • 最も多く発生するのがこのエラーとのこと(実際に起きた)

可能性1

可能性2

  • 権威サーバーがNOTIMP を返している
    • DNS プロバイダーに問い合わせよう!

可能性3

  • 権威DNSサーバーが止まっている
    • nsの設定を見直そう

何したらなおったか?

www.example.com の権威サーバーにCAAレコードを設定したらなおった。
こっからは予想なんだけど、当時、example.com にnsを設定してなかったので Let's Encrypt の CAA レコードをルックアップする機構が再帰的に www.example.com -> example.comと検索してきた際に exapmle.com へ DNSアクセスできずに転んでいたのではと憶測している。 ちょい実験してみないと真実はわからない。

DNSやらまとめ ① - 基礎力編 -

f:id:ie-kau:20190911214620p:plain

今思い返せば10代からDNS周りで障害を起こしまくっているのに、真剣に勉強しようと思ったことがなかったので一旦ここいらいで整理をば。
ついでに今回はLet's Encrypt の CAA も絡んできててんやわんやだったのでそこも整理してみる。 今回は DNS まわりのみ。

DNS関連

連用語整理

用語が散っていたり、レイヤーによって呼び方が違うのでDNS関係の文献を読みこなすために理解しておく。

FQDN

Fully Qualified Domain Nameの略。
ぶっちゃけ、各種文献内ではドメインと読み替えても意図が通じる。 何がFullyかというと、サーバーの設定次第ではwwwなどは省略できるケースがあるので、それを省かずに書いたものをFQDNと呼ぶ。
また、ドメインの最後には必ずルートドメイン . がつくがこちらは各所で省略してある。ホントは、google.com. らしい。

ネームサーバー

ドメインとIPアドレスの名前解決を行うサーバー。= DNSサーバー

権威サーバー

ゾーン情報を保有しているDNSサーバー。
ゾーンファイル(※後述)に対応表を持っている。

ゾーン

DNSサーバーが管理を行うドメインの範囲のこと。
管理権限を持つドメインとそのサブドメインが含まれている。
その設定はSOAレコードに記述されている。

※参考

SOAレコード

ゾーンファイルの中身で、ゾーン管理の情報が記載されている。
google.comでいうとこれ。dig の結果.

google.com.      59  IN  SOA ns1.google.com. dns-admin.google.com. 269064631 900 900 1800 60

細かくは参考先を読めばいいのだが、 SOAの後ろは、dnsサーバーのドメイン お問合せ先とのこと。

※参考先

便利コマンド整理

DNS周りで問題が起きたときに調査に利用するコマンド。
以下、両者とも疎通確認ができる。

dig

何ができる?

  • domain information groper の略
    • grope とは 「手探りする、(…を)手探りで捜す、(心の中で)探る、暗中模索する」 とのこと、ちなみに groper は「痴漢」の意味もあるらしい
      • 魚のハタは grouper で綴に u が入る
  • DNSサーバーに問い合わせてドメインからIPのアドレスを引いたりIPアドレスからドメインを引くことができる
    • リモートにあるDNSサーバーのレコードが適切に設定されているかを確認できる
      • => つまるところ、疎通確認やレコードが正しく設定されているか確認ができる

例えば Googleを引いてみたらこうなる

$ dig google.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41717
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     167 IN  A   216.58.197.206

;; Query time: 1 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Sun Sep 15 19:45:07 JST 2019
;; MSG SIZE  rcvd: 55
  • デフォルトではAレコードを探索してくれる。
  • ANSWER SECTION を見れば調査したいレコードの確認ができる。

また、-t をつけると任意のレコードのタイプを指定することができる。
以下では CAA レコードを検索している。

$ dig google.com -t caa

; <<>> DiG 9.10.3-P4-Ubuntu <<>> google.com -t caa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62610
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN  CAA

;; ANSWER SECTION:
google.com.     21599   IN  CAA 0 issue "pki.goog"

;; Query time: 70 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Sun Sep 15 19:48:05 JST 2019
;; MSG SIZE  rcvd: 66
  • ドメインが存在しなければ、 HEADER 部分に、NXDOMAINが表示され、何かしらのエラーがあれば SERVFAIL が出力される。
$ dig google-hogehoge.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> google-hogehoge.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 63258
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google-hogehoge.com.       IN  A

;; AUTHORITY SECTION:
com.            899 IN  SOA a.gtld-servers.net. nstld.verisign-grs.com. 1568544628 1800 900 604800 86400

;; Query time: 3 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Sun Sep 15 19:50:51 JST 2019
;; MSG SIZE  rcvd: 121

nslookup

何ができる?

  • FQDNを入力してIPアドレスを取得できる
    • => こちらも DNSの疎通確認に使える

※2つ目のパラメータはGoogle Public DNS のアドレスをしてい。

nslookup google.com 8.8.8.8
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.24.142

dig vs nslookup

大体できることは同じに思える、両者のシステム的な違いとしては、内部のリゾルバライブラリを利用しているかいなか。 dig はOSのリゾルバライブラリを利用しているが、nslookupは内包している。 MACでdigが動かないときは OS 側にリゾルバがいないからなので要注意。

一旦ここまで、随時追記。

未整理事項

  • レジストリ
  • レジストラ

その他参考

ngx_http_proxy_connect_module を使って forward proxy で SSL 通信を利用可能にする

f:id:ie-kau:20190911214620p:plain

前提

SSL通信を nginx を利用してプロキシさせようとすると、暗号化された payload が見れないのでアクセス対象の URL にデータ通信を送る事ができない。
そのために HTTP tunnel という技術を利用することになる。

※ 参考
Nginx as forward proxy for HTTPS - Super User

proxyについて知識整理

  • forward proxy
    • インターネットにつながる手前にあるプロキシ
    • トンネルとかゲートウェイとかよばれる
    • 主な用途はIPアドレスを隠すこと
    • 名前解決は、こいつとDNSサーバー間でやることがほとんど 
  • reverse proxy
    • 内部ネットワークでアプリケーション・サーバーの手前にあるプロキシ
    • 主な用途はロードバランシングや、アクセスコントロール

今回の主眼は forward proxyの方

まずトンネリングとは

ネットワーク技術におけるトンネリングとは、インターネット等のなんらかのネットワークで接続されている、物理的、または、論理的に離れた2点間を、仮想の回線(トンネル)によりあたかも同一点であるかのように扱えるようにすることである。

※ 参考
トンネリング - Wikipedia

HTTP tunnelとは?

具体的に何をやってくれるかというと

  1. クライアントがHTTPメソッド(※:後述)プロキシと目的のサーバーに対してTCPのコネクションをはるように要求する
  2. プロキシが目的のサーバーとクライアントの代わりにコネクションをはる
  3. 後続の通信は1,2ではられたコネクションの上で行われる(つまりTCPより上はTSLだろう上位のプロトコルであれば何でもいい)

  4. CONNECTメッドとは?

    • 上記、でいう1のときに投げられるHTTPメソッド
    • このリクエストについているFQDNを利用してプロキシは名前解決及びTCPコネクションの作成を行う
    • RFCで仕様化されている

※参考

ngx_http_proxy_connect_module

でnginxでこれをやろうと思うと、モジュールが必要になってくるので以下を利用する。

github.com

nginx.conf

ser www-data;
worker_processes auto;
daemon off; # Don't run Nginx as daemon, as we run it in Docker we need a foreground process.
events {}

http {
  server_names_hash_bucket_size 128;

  access_log /var/log/nginx_access.log;
  error_log /var/log/nginx_errors.log;

  server {
    listen 80;
    proxy_connect;
    proxy_max_temp_file_size 0;
    resolver 8.8.8.8;
    proxy_connect_allow 443 563;
    location / {
      proxy_pass http://$http_host;
      proxy_set_header Host $http_host;
    }
  }

}

8.8.8.8はGoogleのパブリックDNS

構築

便利なDockerを使うぞ!

github.com

docker pull reiz/nginx_proxy:latest
docker run -it -p 80:80 -v $(pwd)/nginx.conf:/usr/local/nginx/conf/nginx.conf reiz/nginx_proxy:latest

【おまけ】 ruby の open-uri でproxyに繋ぐ例

open("https://hogehoge.com", {:proxy => URI::parse("http://proxy_example.comm"),})

可変の五角形を使って横幅可変の花屋の屋根っぽいCSSを構築するよ

f:id:ie-kau:20190711095410p:plain


要件

  • 花屋の軒に垂れてるピラピラしたやつっぽいデザイン
  • スマホ・PCで表示崩れを起こさないようにレスポンシブデザインで
  • CSSだけで

成果物

iPhone X size
f:id:ie-kau:20190711093843p:plain

PC size
f:id:ie-kau:20190711093633p:plain

ソースコード

z-index周りとか適当だけど、製品にしたときはちゃんと書くぞ!

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>花屋</title>
   <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.css">
<style>

header {
    width: calc(100%-20px);
    border-bottom: 80px solid #ffbcff;
    border-left: 20px solid transparent;
    border-right: 20px solid transparent;
    height: 0;
    position: relative;
    z-index: 4;
}

nav {
  width: 100%;
  position: relative;
  z-index: 3;
  display: flex;
}

nav > a {
    position: relative;
    height: 65px;
    flex: 1;
    color: #FFF;
    text-align: center;
    font-weight: bold;
    display: block;
}
    
nav > a:after {
    content: '';
    position: absolute;
    top: 65px;
    left: 0;
    background-color: inherit;
    padding-bottom: 50%;
    width: 57.7%;
    z-index: -1;
    transform-origin: 0 0;
    transform: rotate(-30deg) skewX(30deg);
    box-shadow: 0 0 4px rgba(0, 0, 0, 0.4);
}

nav a:nth-child(odd) {
    background-color: #FC5C65;
}

nav a:nth-child(even) {
    background-color: #ffc7ca;
}

div {
    width: 96%;
    height: 500px;
    margin: 0 auto;
    background-color: #feede3
}

</style>

</head>
<body>

   <header>
   </header>
   
   <nav>
        <a href="#">
        </a>
        <a href="#">
        </a>
        <a href="#">
        </a>
        <a href="#">
        </a>
        <a href="#">
        </a>
    </nav>

    <div>
    </div>

</body>
</html>