くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

Javascript Numberの挙動(変換誤差)

Numberで数値変換する時にちょっとやられたので記載。

やられたというか当たり前だろという話ですが。

「9999999999999999」をNumerで変換すると「10000000000000000」に丸められる。

sample-number

Number | MDN

次の例は、Number オブジェクトで表現可能な最小の整数値と最大の整数値です (詳細は、ECMAScript 標準の 6.1.6 The Number Type の章を参照してください)。

const biggestInt = Number.MAX_SAFE_INTEGER // (2^53 - 1) => 9007199254740991

const smallestInt = Number.MIN_SAFE_INTEGER // -(2^53 - 1) => -9007199254740991

という事らしい。上記の値を超えると丸められる事がありますね。

「9007199254740993」⇒「9007199254740992」

「9007199254740994」⇒「9007199254740994」

「9007199254740995」⇒「9007199254740996」

「9007199254740996」⇒「9007199254740996」

「9007199254740997」⇒「9007199254740996」

「9007199254740998」⇒「9007199254740998」

「9007199254740999」⇒「9007199254741000」

15桁くらいで制限かけておかないとか。用途次第ですが。

JavaScript if文の挙動まとめ

完全にメモ。

if(""): false
if(0): false
if(NaN): false
if(null): false
if(undefined): false
if(x): true
if(1): true
if([]): true
if([1]): true
if([].length): false
if([1].length): true

AWSでDockerのビルドが上手くいかないやつ

Dockerfileで例えばapt updateとかしてると下記エラー。

Err:1 http://security.debian.org/debian-security buster/updates InRelease
  Temporary failure resolving 'security.debian.org'

どうも、名前解決が出来てない。

理由は色々あると思うのですが、ホスト側のnameserverがdocker側のプライベートIP的なのと

似た感じになってるとdockerから見れて無くてエラーになるっぽい。

この場合はdockerのdns指定して立ち上げるようにする。

dnsはGoogleが公開してるDNSサーバ(8.8.8.8)使う事が多い模様

コマンドでやる場合

docker run --dns 8.8.8.8 -it busybox nslookup www.example.com

docker-compose

dns: 8.8.8.8

ただ、docker-composeはどうもうまくいかなかった。

docker-composeの場合、ホスト側の 「/etc/resolv.conf」がそのまま取り込まれてるっぽいのですが、

上記のdnsの指定が効かないんですよね。。。

何でなんだろ。

dockerのサービスに登録しちゃう場合

下記ファイルを編集(無かったら作成)

sudo vi /etc/docker/daemon.json

{
    "dns": ["8.8.8.8"]
}

# あとリスタート
sudo systemctl restart docker

※多分このやり方はあまりお勧めじゃないように思うけど、compose側の設定効かない時はこれでいくしかなさそう。


参考

Docker imageの名前の部分一致指定で複数一括削除

docker imagesで出てくるimageをrepositryの名前部分一致指定で一括で削除したい場合。

docker rmi -f `docker images "hogename*" -q`

composeとかで、プレフィクス的に名前揃えたテスト用のコンテナ丸ごと消したりするのにたまに使う。けどすぐ忘れる。

AWS EC2でドメイン取得してHTTPSのサーバ作る流れ

何となく、とりあえずやりたい場合の全体的な手順ってあまり見ないので、

とりあえずやるって場合で肝のところ。


構成

だいたいこんな感じ。

sample01

流れ

  • ドメイン取得とDNS(Route 53)
  • インスタンス(EC2)
  • LB作る(証明書も)
  • DNS側にLBのAレコードを作る
  • セキュリティーグループとかの設定

ドメイン取得とDNS(Route 53)

Route53のサービスからドメイン登録選んで色々入力。

個人の管理者なら画像くらいの情報で。ここはちゃんとした情報を入力しないとダメ。

ドメイン名は結構取られてる事が多いと思うので頑張ってひねり出す。

個人的な利用なら.netでいいかなと思いました。

sample00

sample00-1

sample00-2

昔は個別にDNSやらなきゃいけなかったみたいですが、今はここで登録すれば

DNS側も勝手に登録してくれる。↓のところで確認。

sample05

インスタンス直にEIPとか関連付けてそっちにドメインつけたい場合は、ここのDNSに該当インスタンスへのAレコードを登録してあげる。(今回はLB側に付けるのでここまででOK)

インスタンス(EC2)

いったんインスタンス作る。インスタンスは適当に。Webサーバなら何でもいい。

LB作る(証明書も)

sample06

sample07

sample08

※ HTTPSを選んでおかないと、次のステップでその辺の設定が出てこない。

sample09

ACMを選択して、ACMで新しく証明書作るのリンクから証明書作りに行く。

sample10

sample11

sample12

検証中の状態になったら、上記の詳細を開いて、ここからRoute53へCNAMEレコードを追加する。手でやってもいいかもだけど、何か上手くいかなかったのでここからやった方が無難。

登録されたかどうかは、Route53で該当のホストゾーンの中のレコードを見る。CNAMEが追加されてるはず。↓

sample13

証明書の検証自体は、数分~10数分くらいで終わるはず。終わったら下記の発行済み状態になる。

sample14

↑まで終わったら、元のLBの登録の画面に戻って、「証明書の名前」のところに今のモノを入れる。

あとは適当にLBの設定をして作る。

DNS側にLBのAレコードを作る

LB作り終わったら、DNSにLBの情報を入れてあげる。

sample20

sample21

sample22

↑。対象のLBを選択。

セキュリティーグループとかの設定

あと、セキュリティというかACLの設定。

Webサーバ側にLBのセキュリティグループを追加してあげないとダメ。

CentOS7 Docker初期セット

完全にメモ。

sudo yum update -y
sudo yum upgrade -y

# docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install -y docker-ce docker-ce-cli containerd.io

sudo usermod -aG docker $USER
sudo gpasswd -a $USER docker

sudo systemctl start docker
sudo systemctl enable docker

# docker-compose
sudo yum install -y wget
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# あと要らない解凍ファイルとか消す。
# 再起動

https://docs.docker.com/compose/install/

CypressとJestのカバレッジをマージする

以前、Nuxtの単体テストをCypress使ってやる奴を書きましたが、実際にやってみてこれはこれでつらかった。

やっぱりメソッドとか簡単な部分はJestというかVue-test-util使ってちょこちょこっと書けた方が良い。

でもやっぱりあれこれやり始めるとVue-test-utilだとつらい・・・。

じゃー、使い分ければいいじゃんと。

で、そういう時に問題になるのが、カバレッジのマージ。

nycはいちをそれも出来るんだけど、マージの仕方が何か微妙な気がするのですが・・・。

どっちかにあるものの、MAXで見るか、平均で見るかって感じ?

単純に通ったコードのカウント部分マージしてくれればいいんだけどなー。

何でこういう感じになってるんだろ?何かやり方が間違ってるのかしら?

公式にも載ってるサンプルのリポジトリと同じやり方してみても、上手くいかない。

というか、ぶっちゃけ現状バグってますよね?istanble-lib-coverageがおかしいのかしら?色々やってみると大体結局↓のエラーが出る。

TypeError: Cannot read property 'start' of undefined

多分これ、coverage.jsonのファイルって下の感じの定義じゃないですか。

statementMap:{
 "0":{
     start:1,end:1
  },
 "1":{
     start:2,end:2
  }
},
s:{"0":3, "1", 4}

で、sのオブジェクトがstatementMapの定義してる行数を通った回数になってると思うのですが、

マージすると、statementMap側に存在しないキーがs側に出来る場合があるっぽ。

ダメじゃん。

同一ソースなら一緒になるはずなのですが、

jestとcypressで微妙に定義の仕方が違うん場合があるんですよね。行数は一緒なんですけど。


なので、cypressとjestの組み合わせ限定ですが、coverage.jsonをマージするスクリプトを作った。

別に大した事はやってないのですが、だいぶ面倒くさいところなので、何かに使えれば参考にどうぞ。

下記にあげました。

https://github.com/n79s/cy-jest-coverage-merge

10億人が笑うSVGからナゼか正規表現の話

Billion laughs攻撃っていうのがある。

XMLで参照を多重に定義して、メモリを食いつぶさせてPCとかアプリを固まらさせるやつ。

で、これってSVGでも可能だったんですね。

下の画像をFireFoxで見るとFireFoxのタブが固まる。(Chromeは大丈夫だった)

https://github.com/cirosantilli/web/blob/master/svg-billion-laughs.svg

上の画像をDLして、例えばパワーポイントとかに画像挿入しようとするとパワポも固まる。


上の画像のソースを見ればわかりますが、この程度の参照の組み方だけで、

組み合わせ爆発でヤバイ事になるという訳なんですが、

参照をネストさせるようなものはやっぱり考え物って事ですね。

正規表現なんかも、例えば

(a|b|c)(e|d|f)

みたいに組み合わせで色々やるとエライこっちゃになるパターンがあったと思う。

↑だけじゃ再現させられなかったんですが、昔どこかのコードで見たんだよなー。

組み合わせ爆発って怖いですね。結構意識せずにやっちゃいそうな気もする。


正規表現でいうとMSDNの正規表現のベストプラクティスのページがすごく面白かった。

長さが 5 文字を超えると、文字列の文字が 1 文字増えるたびに処理時間が約 2 倍に増加します。 つまり、有効に近い文字列の長さが 28 文字になると処理に 1 時間以上かかり、33 文字になるとほぼ 1 日かかることになります。

確かに正規表現作ってる時って、正しい文字列ばっかり考慮してるきらいがありますよね。

「*」とか「+」とかのネストとかもやばそう。

正規表現だと楽ーとか早いとかいう話は良く見聞きしますが、

やっぱり一概にそうも言えないですよね。

MariaDBのクエリログ

完全にメモ。ささっと確認したい時にいっつも忘れる。

SET GLOBAL general_log=1;
SET GLOBAL log_output='TABLE';
SELECT * FROM mysql.general_log\G

戻すときは0にセット。

FILEの場合は多分この辺り。

/var/log/mysql/mariadb.log

公式DOC

AWSにVMイメージをインポートしてインスタンス作る(WindowsServer 2003)

WindowsServer2003という古のOSがありまして、

そのVMイメージをAWSで動かせるのかというお試し。

結果から言うととりあえず動かせはした。


VMインポートの手順は大まかに下記の流れ。

1. VMをエクスポートしておく
2. S3にバケット用意(既存を使うならそれはそれで
3. IAMで作業用のユーザ作っておく
4. aws cliをインストールしてconfig
5. aws cliでロールとか作る
6. aws cliでS3にVMイメージをアップロード
7. aws cliでアップロードしたイメージをAMIに変換
8. AMIからインスタンスを起動

基本的に公式のココのページ通りやっていけば大丈夫。


1. VMをエクスポート

色々やり方あると思うのですが、基本的にこのページのやり方でやらないとだめ。

2. S3にバケット用意

これはS3のサービス開けば問題ないでしょう。

3. IAMで作業用のユーザ作っておく

既存のユーザでも問題ないですが、後続のaws cliでアクセスキーとシークレットアクセスキーを使うのでそれが分からない場合は作るしかないかなと。

色々面倒そうなので、adminグループのユーザ作ってやった。。。

4. aws cliをインストールてconfig

公式のインストールのページから。windowsでやるのでwindows用をDLしてインストール。v2でやる。

インストールできたら、コンフィグ。

aws configure

> AWS Access Key ID [None]: *******
> AWS Secret Access Key [None]: *******
> Default region name [None]: ap-northeast-1
> Default output format [None]: json

東京リージョンは ap-northeast-1
5. aws cliでロールとか作る

公式のドキュメント

  • trust-policy.jsonを作成
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}
  • JSON作ったら vmimport っていう名前で作成
aws iam create-role --role-name vmimport --assume-role-policy-document "file://C:\work\trust-policy.json"
  • role-policy.json を作る
{
    "Version":"2012-10-17",
    "Statement":[
       {
          "Effect": "Allow",
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket" 
          ],
          "Resource": [
             "arn:aws:s3:::ines-wr-tempdata",
             "arn:aws:s3:::ines-wr-tempdata/*"
          ]
       },
       {
          "Effect": "Allow",
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket",
             "s3:PutObject",
             "s3:GetBucketAcl"
          ],
          "Resource": [
             "arn:aws:s3:::ines-wr-tempdata",
             "arn:aws:s3:::ines-wr-tempdata/*"
          ]
       },
       {
          "Effect": "Allow",
          "Action": [
             "ec2:ModifySnapshotAttribute",
             "ec2:CopySnapshot",
             "ec2:RegisterImage",
             "ec2:Describe*"
          ],
          "Resource": "*"
       }
    ]
 }
  • JSON作ったら vmimport に反映
aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file://C:\work\role-policy.json"

※ローカルのファイルパスはフルパスで作ったJSONファイルを指定。

6. aws cliでS3にVMイメージをアップロード

下記の感じ。

aws s3 cp "C:\work\hogehoge.disk1.vmdk" s3://work/vm

vmdkだけあればよいっぽいけどとりあえずエクスポートで作られたファイルは全部上げた。

7. aws cliでアップロードしたイメージをAMIに変換
  • containers.json ファイルを作る
[
  {
    "Description": "Disk01",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "work",
        "S3Key": "vm/hogehoge.disk1.vmdk"
    }
  },
  {
    "Description": "Disk02",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "work",
        "S3Key": "vm/hogehoge.disk2.vmdk"
    }
  },
  {
    "Description": "Disk03",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "work",
        "S3Key": "vm/hogehoge.disk3.vmdk"
    }
  }
]

vmdk複数ある場合は↑の感じ。

  • インポートする
aws ec2 import-image --description "HogeTestVM" --disk-containers "file://C:\work\containers.json"
8. AMIからインスタンスを起動

インポートが終わったら、AMIにイメージが出来てるのでそれを選んで起動すればOK。


ここまでで、大体動くようにはなってると思う。

ただ、本当はここから下記の設定をした方がよいっぽい。

インスタンス上げてみてみると、EC2Configの方は勝手にインストールされてた。

ただ、ENAとNVMe のドライバーのインストールはWindowsServer2003では不可能っぽい。

何でかって言うとPowerShellが2.0しか入れられないから。

がんばれば3.0以降も入るのかな?どこかで2003は2.0しか動作しないような事を見た記憶ががが...

ENAとNVMeはあきらめましたとさ。

でも、とりあえず動いてはいる。

顧客向け用の環境としてはあり得ないんだけど、開発用でどうしても一時的に必要な状況はあるので、何かの参考に置いておきます。

windows server 2003をAWS上に復元するのとか検索しても全然出てこなかった。

まーやる人なんかいないですよね。。。

問合せ