【psql】レコードロック

データベースの機能の一つで、あるユーザが参照しているレコードに他のユーザがアクセスできないようにする

FOR UPDATE … 自分が更新する目的で行をロックしておく
FOR SHARE …他からの更新がかからないように行をロック

【PostgreSQL】トランザクション処理の実行

$ sudo -u postgres psql
psql (14.2 (Ubuntu 14.2-1.pgdg20.04+1))
Type “help” for help.

postgres=# \c testdb;
You are now connected to database “testdb” as user “postgres”.
testdb=#

CREATE TABLE book (
id serial NOT NULL,
name VARCHAR(30) NOT NULL,
author VARCHAR(30) NOT NULL,
age integer,
PRIMARY KEY (id)
);

INSERT INTO book(name, author, age) VALUES (‘SQL入門’, ‘Masumi’, 25);
INSERT INTO book(name, author, age) VALUES (‘Flutter入門’, ‘Masumi’, 25);
INSERT INTO book(name, author) VALUES (‘HTML入門’, ‘Hiro’);
INSERT INTO book(name, author, age) VALUES (‘Github入門2’, ‘Emma’, 22);
INSERT INTO book(name, author, age) VALUES (‘Flutter上級’, ‘Oliva’, 45);

testdb=# select * from book;
id | name | author | age
—-+————-+——–+—–
1 | SQL入門 | Masumi | 25
2 | Flutter入門 | Masumi | 25
3 | HTML入門 | Hiro |
4 | Github入門2 | Emma | 22
5 | Flutter上級 | Oliva | 45
(5 rows)

### BEGIN / COMMITとは?
beginはトランザクションを開始するコマンド。
beginが実行されると、自動コミットモードが解除され、それ以降のSQL文による変更が確定しない状態になる。beginをトランザクションを張ると表現することがある。
commitはトランザクションを終了し、変更を確定する

testdb=# begin;
BEGIN
testdb=*# update book set age=age+10 where author=’Emma’;
UPDATE 1
testdb=*# update book set age=age-10 where author=’Oliva’;
UPDATE 1
testdb=*# commit;
COMMIT
testdb=# select * from book;
id | name | author | age
—-+————-+——–+—–
1 | SQL入門 | Masumi | 25
2 | Flutter入門 | Masumi | 25
3 | HTML入門 | Hiro |
4 | Github入門2 | Emma | 32
5 | Flutter上級 | Oliva | 35
(5 rows)

ROLLBACKはトランザクションを終了し、変更を取り消すコマンド

beginとcommitはセットで見た方が良さそうやね

【PostgreSQL】トランザクションについて

トランザクションとはデータベースのデータを利用するときに、複数の処理を一連のものとしてまとめる単位のこと
– Aさんの銀行口座から500万円出金
– Bさんの銀行口座に500万円入金

一連の処理が問題なく行われたときはコミットで終了、途中エラーが発生したときはロールバック
DBのトランザクションはACID特性がある
Atomicity … 完全に実行されるか
Consistency … 実行前後でデータの整合性が担保
Isolation … コミットが確実に保存される

### トランザクションのコマンド
BEGIN
START TRANSACTION
COMMIT
END
ROLLBACK
ABORT

### 分離レベル
READ UNCOMMITED
READ COMMITED
REPEATABLE READ
SERIALIZABLE

なるほど、概念はなんとなく理解した

フォントのグリフ

字体とほぼ同義語だが、記述記号やスペースを含める
文字と記号を含めたものをグリフセットと呼ぶ
ビットパターンやアウトラインなども指す

Excelでも別フォントにフォールバックされる

いきなりグリフと言われても、celticsのグリフィンしか思いつかんわ

【PostgreSQL】複数レコードを一括更新

まずテーブルを作成します。

create table myschema.product (
  name varchar(10), 
  price integer, 
  stock integer
);

続いてデータを挿入します

insert into product values
  ('Orange', 200, 12),
  ('Melon', 450, 6),
  ('Grape', 320, 8),
  ('Apple', 180, 14),
  ('Peach', 380, 5);

testdb=# select * from product;
name | price | stock
——–+——-+——-
Orange | 200 | 12
Melon | 450 | 6
Grape | 320 | 8
Apple | 180 | 14
Peach | 380 | 5
(5 rows)

testdb=# update product set price=340 where name=’Grape’;
UPDATE 1
testdb=# select * from product;
name | price | stock
——–+——-+——-
Orange | 200 | 12
Melon | 450 | 6
Apple | 180 | 14
Peach | 380 | 5
Grape | 340 | 8

testdb=# update product set price=price-50 where stock < 10; UPDATE 3 testdb=# select * from product; name | price | stock --------+-------+------- Orange | 200 | 12 Apple | 180 | 14 Melon | 400 | 6 Peach | 330 | 5 Grape | 290 | 8 (5 rows) 複数更新する場合も条件式でできるのね。

Basic認証とは

Basic認証はWebの特定の領域にアクセス制限をかける認証方法
Basic認証が設定できる範囲は基本的にディレクトリ単位のみとなる
.htaccessファイルを設置したディレクトリ全体がBasic認証の範囲となる(ルートディレクトリに.htaccessを設置することで全体にベーシック認証をかけている)

### AWS WAFだけのBasic認証の設定
WAF Ruleの作成
– If a request: doesn’t match the statement(NOT)

– Inspect: Header
– Header field name: authorization
– Match type: Exactly matches string
– String to match: Basic xxxxxxx (User:PasswordをBase64エンコードした値を設定)
$ echo -n user:password | base64

Action
– Block
– Enable, 401
– Key: www-authenticate, Value: Basic

Basic認証完了後はブラウザを閉じるまで有効
ベーシック認証は、ユーザーが正しいIDとパスワードで認証に成功した場合、ブラウザを閉じるまでの間は再認証なしで何度でもアクセスすることが可能になります。ブラウザさえ閉じていなければ、仮に、違うWebサイトを閲覧した後でも認証なしで再びアクセスすることが可能です。

ブラウザがログイン情報を記録
一度ベーシック認証で認証に成功してしまえば、ユーザー名とパスワードはブラウザに記憶され、再び入力する手間を省くことができます。ただし、あくまでブラウザに依存する機能なので、ブラウザの種類やバージョン、ネットワークの状態によってはログイン情報が保存されない可能性があります。また、スマホではベーシック認証のログイン情報が保持されないことがほとんどですので、利用する際のブラウザやデバイスには注意が必要です。

なるほど、ブラウザ側の仕様なのね。少し理解した。

macでjmeterを使いたい

Test Plan -> Add -> Thread(Users) -> Thread Group

HTTP Request
HTTP RequestのGet, ip, path, paramなどを設定する

Thread Group
Thread Propertiesの Threads(リクエスト数), Ramp-up period(リクエストの作成期間), Loop Count(リクエスト量)を設定する

Listenerの追加: テスト結果を表示
Summary Reportを追加

なるほど、一通りの機能はわかったが、複数画面はどうやるんだろうか?

ApacheBenchの使い方

ApacheBenchはApache HTTP Serverに同梱されている性能テストツール
単一のURLへのリクエストを生成するツール

$ ab -n 100 -c 10 http://google.com/
nオプション: 生成するリクエスト数
cオプション: 並列実行する数
$ ab -n 100 -c 10 http://google.com/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking google.com (be patient)…..done

Server Software: gws
Server Hostname: google.com
Server Port: 80

Document Path: /
Document Length: 219 bytes

Concurrency Level: 10
Time taken for tests: 1.533 seconds
Complete requests: 100
Failed requests: 0
Non-2xx responses: 100
Total transferred: 77300 bytes
HTML transferred: 21900 bytes
Requests per second: 65.23 [#/sec] (mean)
Time per request: 153.297 [ms] (mean)
Time per request: 15.330 [ms] (mean, across all concurrent requests)
Transfer rate: 49.24 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 2 3.0 1 13
Processing: 103 134 26.4 128 225
Waiting: 103 132 25.6 126 222
Total: 104 136 26.3 130 226

Percentage of the requests served within a certain time (ms)
50% 130
66% 134
75% 139
80% 142
90% 157
95% 217
98% 226
99% 226
100% 226 (longest request)

なるほど

[AWS] Lambdaのレイヤーサンプル

$ tree
.
└── common
├── layer
│   └── python
│   └── util.py
└── serverless.yml

serverless.yml

service: sample-layer

provider:
  name: aws

layers:
  samplelayer:
    path: layer

util.py

def hello():
	print('Hello, Lambda Layers World!')

serverless.yml

service: sample-function

provider:
  name: aws
  runtime: python3.7
  iamRoleStatements:
  - Effect: "Allow"
    Action:
    - "lambda:InvokeFunction"
    Resource: "*"

functions:
  samplefunction:
    handler: handler.handle_request
    layers:
      - {上記のLayerをsls deployした時に表示されるarn}

handler.py

import util

def handler_request(event, context):
	util.hello()

Layerはデプロイされる度にバージョンが上がる

LayersのARNを確認
$ aws lambda list-layer-versions –layer-name sample-layer –query “LayerVersions[*].LayerVersionArn”
$ aws lambda update-function-configuration –function-name testFunction3 –layers “LayersのARN”

なるほど、なんとなく仕組みと概念は理解した