Foreverly

メモ帳

REST(Representational State Transfer)

REST(Representational State Transfer)

Webシステムアーキテクチャの原則を定義したもの

原則

  • Client-server
  • Stateless
  • Cacheable
  • Uniform
  • interface
  • Layered system
  • Code-on-demand(optional)

こういう考え方にしたがって作ろうよっていうもの Webシステムのデザインといってよい

以下のものが求められている

  • 可用性
    • いつでもちゃんと返事が来る,応答待ちにならない
  • スケーラビリティー
    • 大量のリクエストを捌ける
  • 耐故障性
    • サーバ側でマシンが落ちていても構わない

WEB系企業が推奨しているけど、原則6個を全て使えとは言っていない。

原則6個が言っていること

  • Client-server:ユーザインタフェースとデータストレージの関心事を分離
  • Stateless:リクエスト内にそれを理解するための情報を全て含み、サーバ側に状態を持たせない
    • スケーラビリティ、監視の容易性、故障からの復帰の容易性
    • ステートフルだとやりとりしていたサーバが落ちたら情報が消える。
  • Cacheable:キャッシュ可能なものを明確に区別
    • 効率、スケーラビリティ
  • Uniform interface:単一インターフェースに統一
    • 単純さ、インターフェースと機能の分離
    • オブジェクト指向プログラミングのメソッドが沢山でてくる。
    • インターフェースはGET、PUT、POST、DELETEの4種類にする。
    • デザインをするのはGET、PUT、POST、DELETEのでしよう。
  • Layered system: 階層構造による不要な詳細の隠蔽
    • 複雑さの軽減、依存性の低減
    • 自分の直下のレイヤーだけを知っていればいい
  • Code-on-demand(optional):必要な機能の、クライアント側へのオンデマンドでの読み込み(オプション)
    • 実行時の拡張性

シェルスクリプト②(declare,配列,連想配列)

declareでの変数宣言

オプションをつけることで、変数に属性を付与できる

オプション 意味
-r 変数を読み取り専用
-i 変数を整数とする
-a 変数を配列とする
-A 変数を連想配列とする

指定しない場合は、型は文字列になる

読み取り専用ならreadonlyコマンドをつかうとよい

配列

配列は要素を並べて格納し、インデックスという番号で参照できるデータ構造。 インデックスは0からはじまる。

  • 配列の作成

配列変数の右辺に()を書いて、要素を記述する。これを複合代入と呼びます。

# fruit=(apple orange banana)

空の配列

# list=()

declareでの配列宣言

# declare -a arr1
  • 要素の参照

配列の要素の参照は${配列名[インデックス]}

# echo ${arr1[0]}

インデックスを指定しない場合は、インデックス0が参照される。

要素の数を取得するにはインデックス"@"を指定 ${#配列名[@}}

# echo ${#arr1[@]}
  • インデックスを利用した代入

bashの配列は連続している必要がないので、空のある配列は複合代入がつくれる。 以下だとインデックス2と4が空文字列の配列ができる。

# arr2=(test0 test1 [3]=test3 [5]=test5 test6 )
  • 配列の中身を変更
# test3=(hoge1 hogehoge)
# test3[1]=hoge2
# 
# echo ${test3[0]}
# echo ${test3[1]}
  • 要素の削除
# unset test3[1]
  • すべての要素の参照

配列のすべての要素を参照する場合は、インデックスに*や@を指定

# test4=(hoge0 hoge1 hoge2 hoge3 hoge4)
# echo ${test4[*]}
# echo ${test4[@]}

""でくくった違いも"$@"と"$"と同じで、 "${配列[@]}"は要素が個別の文字列として展開される "${配列[]}"は配列全体をIFS変数の最初の1文字(たいていはスペース)で連結した1つの文字列として展開される 基本的には"${配列[@]}"を使うのがよい。

配列のコピーに使える

# test4_2=("${test4[@]}")
  • 要素の追加

"${配列[@]}"の他の使い方は、元の配列の先頭や末尾に要素を追加した、新しい配列の作成です

# test4_3=(hoge5 hoge6 "${test4[@]}") # 配列の先頭に要素を追加
# test4_4=("${test4[@]}" hoge7 hoge8) # 配列の末尾に要素を追加
  • 値の存在するインデックスの取得

${!配列名[*]}や&{!配列名[@]}みたいに、配列名の前に!をつけると、配列の中で値が存在するインデックス一覧を取得できる

# echo ${!arr2[@]}

連想配列

連想配列はkeyとvalueのデータ構造 hashとかmapとかdictとか言われるやつ

declare -Aで連想配列宣言をする。 これを忘れると配列になってしまうので、注意。

# declare -A user=([id]=1 [name]=testuser)
  • 要素の参照
# echo ${user[id]}
# echo ${user[name]}
# echo ${#user[@]}
  • 要素の代入

連想配列ではキーを指定して、キーに対応する値があれば上書き。なければキーと値を追加します。

# user[name]=testuser2 # 上書き
# user[country]=Japan  # 新規にキーと値を追加
  • 要素の削除
    • unsetコマンド
# unset user[name]
  • すべての値の参照

  • キー一覧の取得

新しいシェルプログラミングの教科書はわかりやすくておすすめです。

新しいシェルプログラミングの教科書

新しいシェルプログラミングの教科書

Apache2.2の設定

前回のCentOS6.7の設定続き!

久しぶりにやったので、CentOS6.9でやりました... ipもよしなにお願いします。 2017年にApache2.2で申し訳ない

Apache2.2の設定

CentOS6系の設定を想定なのでApache2.2です。(古いね)

  • 以下内容

VirtualHostの設定をしてドメインにアクセスできること 名前ベースの仮想ホストで複数のホスト名をつける SSL通信ができること

Apacheインストール

インストール

# yum install httpd
# httpd -version
Server version: Apache/2.2.15 (Unix)

自動起動の設定

# chkconfig --list |grep httpd
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
#  chkconfig httpd on
# chkconfig --list |grep httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

Apache設定ファイル

全体の設定と範囲を指定した設定の2つあります。 この範囲を「セクションコンテナ」といいます。 セクションコンテナの中で設定した項目はセクションコンテナ内だけの設定になるのです。

セクションコンテナの種類

    • ファイルを示す
    • URLを示す

Apacheの設定ファイルは、行毎に「ディレクティブ」と呼ばれる設定内容を記述します。 Apache2.2と2.4では記述の仕方が違うので設定ミスに注意が必要。 2.4使うならNginxを使ったほうがいいかも。。

ディレクティブの大文字小文字の区別はされません。 優先順位はの順番で解釈され、 先に解釈された設定は、後で解釈された設定で上書きされてしまうので、 アクセス制限などには気をつける点ですね。

編集が終わったら設定ファイルの書式が間違っていないかを確認するようにしましょう。

# service httpd configtest
Syntax OK

名前ベースの仮想ホスト

リクエストヘッダ内で指定されているHost:ヘッダーの情報からアクセス先のホストを識別できる

VirtualHostの設定

設定をスッキリさせたいので、conf.d配下に vhosts.confというVirtualHost専用の設定ファイルを作りました。 VirtualHostで指定したIPアドレスに一致した場合のみ設定が適用されます。

# cat conf.d/vhosts.conf
# 仮想ホストのIPアドレスを指定(Apache2.4では不要)
NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin sysadmin@test1.jp
DocumentRoot /var/www/vhosts/www.apachetest1.jp
ServerName www.apachetest1.jp
</VirtualHost>

<VirtualHost *:80>
ServerAdmin sysadmin@test1.jp
DocumentRoot /var/www/vhosts/www.apachetest2.jp
ServerName www.apachetest2.jp
</VirtualHost>

DocumentRootも作っておくます。 index.htmlも置いておきました。

# mkdir /var/www/vhosts/www.apachetest1.jp/
# cat /var/www/vhosts/www.apachetest1.jp/index.html
apachetest1 is OK
# mkdir /var/www/vhosts/www.apachetest2.jp
# cat /var/www/vhosts/www.apachetest2.jp/index.html
apachetest2 is OK

動作確認してみましょう。 Hostヘッダーを指定してcurlコマンドを実行すると見事index.htmlの情報をとってこれました;-)

# curl -H 'Host: www.apachetest1.jp' 192.168.33.111
apachetest1
# curl -H 'Host: www.apachetest2.jp' 192.168.33.111
apachetest2

Apache再起動時に以下のメッセージが出たので、hostsに記載。localhostで名前解決させればよさそう。

[root@www ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for www.apachetest1.jp
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
# vim /etc/hosts
# cat /etc/hosts
127.0.0.1   www.apachetest1.jp localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         www.apachetest1.jp localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@www ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

QUIZ:ブラウザでindex.htmlの中身を確認したい場合はどうすればいいでしょうか?

SSL通信

let's encryptはローカルドメインには使えんので、今回はおれおれ証明書で! 本番環境ではlet's encryptもしくはverisignやcybertrustやrapid-sslなど商用のCAを使ってください!

商用CAもCSRをCAに送って、入金して、証明書がもらえたら、よしなに設定の流れです。

SSL化する理由はなんでしょうか

  • データの改竄防止
  • データ盗聴防止
  • CA(認証局)による認証によって、本物であることを証明する

何が必要でしょうか

  • openssl
    • SSLを利用するのに必要なソフトウェア
  • mod_ssl
    • OpenSSLを使ってApacheSSLに対応させるmodule

てなわけでインストール

# yum install -y mod_ssl openssl
# httpd -M | grep ssl
Syntax OK
 ssl_module (shared)

OpenSSLコマンドで以下のファイルを用意します。 複数ドメインを持つ場合は命名規則を立てたほうがよいですね。 CommonName.作成日.ファイルタイプなど

鍵の置き場所はmod_sslをインストールしたらデフォルトはconf.d/ssl.confになると思います。 また、443ポートで受けます。

# grep SSLCert conf.d/ssl.conf
# Point SSLCertificateFile at a PEM encoded certificate.  If
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
# grep Listen conf.d/ssl.conf
Listen 443

今回はvhosts.confに設置場所を以下に指定してそこに置いてみましょう。

mkdir /etc/httpd/conf/ssl
# vim vhosts.conf
<VirtualHost *:443>
  ServerName www.apachetest1.jp
  DocumentRoot /var/www/test1
  SSLEngine on
  SSLCertificateFile /etc/httpd/conf/ssl/server.crt
  SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key
</VirtualHost>

デフォルトのssl.confでSSLEngine onコメントアウトしておきましょう~~

# grep SSLEngine /etc/httpd/conf.d/ssl.conf
# SSLEngine on

上のコメントアウトをしなかったら、以下のエラーメッセージが出てApacheが起動しなくなりました..

[error] Illegal attempt to re-initialise SSL for server (theoretically shouldn't happen!)

秘密鍵の作成

# openssl genrsa -out server.key 2048

genrsa: RSA形式の秘密鍵を作成 -out 秘密鍵: 秘密鍵の名前指定 2048: 2048バイト長の鍵を作成

CSR作成

今回はwww.apachetest1.jpだけHTTPS

# openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.........................................+++
...+++
e is 65537 (0x10001)
[root@localhost ssl]# openssl req -new -sha256 -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinjuku-ku
Organization Name (eg, company) [Default Company Ltd]:Default Company Ltd
Organizational Unit Name (eg, section) []:section
Common Name (eg, your name or your server's hostname) []:www.apachetest1.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

CommonNameとbit長など間違いないか確認

# openssl req -in server.csr -text
Certificate Request:
   Data:
       Version: 0 (0x0)
       Subject: C=JP, ST=Tokyo, L=Shinjuku-ku, O=Default Company Ltd, OU=Technology, CN=www.apachetest1.jp
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
               Public-Key: (2048 bit)
               Modulus:
                   00:ca:d9:de:81:97:43:ff:21:d9:4b:7c:26:50:e1:
  • CSR作成の前に以下の項目を確認しておくといいです。
DN フィールド 説明
Country Name (2 letter code) 二文字の国名 JP
State or Province Name (full name) 都道府県 Tokyo, Tokyo-to
Locality Name (eg, city) 市区町村 Shinjuku-ku
Organization Name (eg, company) 会社名・組織名 Default Company Ltd
Organizational Unit Name(eg, section) 部署名 Technology
Common Name (eg, YOUR name) ドメイン名と同。間違えるとサイトみれなくなるので注意!!! 「http://」や「https://」は入力不要
www有りの場合 www.example.com
wwwなしの場合 example.com
サブドメインの場合 japan.example.com
サブドメイン無制限の場合 *.example.com
Email Address メールアドレス test@example.jp(値なしでも可)
A challenge password 値なし
An optional company name 値なし

証明書を作成し自己署名する

# openssl x509 -in server.csr -days 365 -req -signkey server.key -out server.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Shinjuku-ku/O=Default Company Ltd/OU=Technology/CN=www.apachetest1.jp
Getting Private key

-req: 入力ファイルがCSRファイルであることを指定 -days: 証明書の有効期限 x509: X.509形式の証明書を作成 -signkey 秘密鍵ファイル: 自己証明書作成時に使用するオプション。秘密鍵ファイルを指定

iptablesの設定を行う

iptablesがインストールされていることを確認

# which iptables
/sbin/iptables

iptablesのポリシー

以下の基本ポリシーを”DROP”(拒否)、”ACCEPT”(許可)のどちらかに設定します。

INPUT:サーバーに入ってくる通信のポリシー。基本ポリシーを”DROP”にして、あとで個別のポートに対して許可する設定にする。 OUTPUT:サーバーから出て行く通信のポリシー。基本ポリシーは”ACCEPT“にする。 FORWARD:受信したデータを他のサーバーへ転送する際に適用される設定。ここでは、特に転送するサーバーは無いので”DROP”。

現状設定されていないです。  

# iptables -nvL --line
Chain INPUT (policy ACCEPT 6332 packets, 472K bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3243 packets, 254K bytes)
num   pkts bytes target     prot opt in     out     source               destination

以下の設定ファイルを作成していきます。 記載内容はさくらインターネットさんの記事を参照で

# vim /etc/sysconfig/iptables

設定を反映させます。

# service iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

22,53,80,443ポートが開放されていることが確認できました。

# iptables -nvL --line
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
2        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x3F/0x00
3        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:!0x17/0x02 state NEW
4        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x3F/0x3F
5        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 limit: up to 1/min burst 10 mode srcip htable-expire 120000
6       11   576 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
7        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp spt:53
8        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 flags:0x17/0x02 limit: up to 1/min burst 10 mode srcip htable-expire 120000
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6 packets, 448 bytes)
num   pkts bytes target     prot opt in     out     source               destination

コマンドなら以下ですね

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

graceful再起動で反映

/etc/init.d/httpd graceful

https://www.apachetest1.jpにアクセスできることを確認

シェルスクリプト①

シェルスクリプトまとめ

一行目のおまじない

1行目にシェバンと呼ぶ、bashで動作しますよというおまじないがある。

#!/bin/bash

変数

変数宣言では空白文字列は入れてはだめ

変数=値

declareで宣言していない場合は値は文字列とされる。

値にスペースやタブを含みたい場合はシングル[ダブル]クォートでくくる

test='test test'

空白文字も格納できる

empty1=

or

empty2=''

変数を参照する場合は変数名の前に$をつける

$test

宣言していない変数を参照してもエラーにならず、空白文字として実行されてしまうので注意

環境変数

環境変数は親プロセスから子プロセスに引き継がれるもので、親プロセスのシェルで設定されていた環境変数の値は子プロセスにコピーされコマンドから参照可能。

printenvコマンドで環境変数の一覧を表示可能

環境変数の定義

exportコマンドで環境変数の定義が可能

CONFIG_NAME=test #変数CONFIG_NAMEを宣言
export CONFIG_NAME #exportで環境変数にする

or

export CONFIG_NAME=test #一行で変数定義と環境変数にするのもできる

特殊なシェル変数

ホームディレクトリの表示

  • $HOME

カレントディレクトリの表示

ログインユーザーのログインシェル

  • $SHELL

現在動作しているbashコマンドのフルパス

現在動作しているbashのバージョン情報

現在実行しているシェルスクリプトの行番号を格納している。 いま何行目なのか出力できるのでデバックなどに使える。

  • $LINENO

ロケールを指定

  • $LANG

localeコマンドで現在設定されているロケールが確認できる

PATHは、シェルがコマンドを探すディレクトリを指定するための変数 ディレクトリは:で区切る コマンド検索パスと呼ばれ、左から順に探していく

  • $PATH

コマンドを配置するためのディレクトリを作成した場合、コマンドを探すパスを追加したい場合、このPATHを使う。 以下は現在のパスに加えてホームディレクトリ配下のbinディレクトリからもコマンドを探すように指定

PATH=$HOME/bin:$PATH

IFSはシェルの区切り文字を指定するための変数 bashは文字列を単語に分割する必要があるときは、ここの文字列を区切り文字として使う。 通常はスペース、タブ、改行が設定されている。

$ echo "$IFS" |od -a
0000000  sp  ht  nl  nl
0000004

odコマンドはファイルの内容を8進数で表示しますが、-aをつけると、制御文字などが文字の名前で出力される sp=スペース、ht=タブ、nlは改行

位置パラメータ

$1,$2のように1から始まる数値を名前に持つ変数で、 引数を参照することができる。

位置パラメータをすべて参照する場合は、$*や$@で可能

ダブルクォートでくくると動作が変わるので注意 "$@"=位置パラメータそれぞれが文字列として展開される "$*"=連結した一つの文字パラメータとして展開されてしまう。

なので$@を使ったほうが意図しない動作を起こさない。

特殊パラメータ

変数名 内容
$# 位置パラメータの個数
$? 直前に実行したコマンドの終了ステータス値
$$ 現在のプロセスのプロセスID
$! 最後に実行したバックグラウンドコマンドのプロセスID

シェルスクリプトに与えられた引数の個数

  • $#

コマンド終了ステータス値 0は成功,0以外は失敗

  • $?

現在のプロセスIDを表示

  • $$

ユニークなファイル名を作る時にも使える

tempfile=/tmp/tempfile$$

バックグラウンドのプロセスIDを表示

  • $!

バックグラウンドで実行したプロセスをkillするときに使える

データベース①

データベースについて必要なキーワードをまとめていきます。

トランザクションと同時実行制御

トランザクションについて

  • 複数のクエリをひとまとまりにした処理で、commit時に処理を確定する

ACID

特性について、各頭文字それぞれ

Atomicity(原子性)

  • データ操作が全部成功or全部失敗のどちらかになることを保証

Consistency(一貫性)

  • データ操作での整合性が守られていること

Isolation(分離性もしくは隔離性、独立性)

  • それぞれの処理が矛盾なく実行されること

Durability(持続性) * トランザクション処理が完了し、完了通知をユーザが受けた時点で、その操作が永続的となり結果が失われないこと

ANSI/ISO SQL標準

ANSI/ISO SQL標準 について

  • アンシーは米国内の工業分野の標準化組織で、ベンダーに依存しないSQLのこと

ANSI/ISO SQL標準 が定義する分離レベルについて

非コミット読み取り(リードアンコミッテッド)

  • 読込 のタイミングによっては読込がブロックされる場合がある時に選ぶとブロックしない

コミット済み読み取り(リードコミッテッド)

  • 初回クエリ発行時にコミットされているデータを読み込み、その後は最新のクエリの実行開始時点でコミットされたデータを読む

再読み込み可能読み込み(リピータブルリード)

  • 初回クエリ発行時にコミットされているデータを読み込み、その後も同じ結果セットが返され他のトランザクションがコミットしても、反映されない

直列化可能(シリアライザブル)

分離レベルの緩和によって起こる 3 つの現象について

ダーティリード

曖昧な読み取り

  • あるトランザクションが以前読み込んだデータを再度読み込んだ時、2回目以降の結果が1回目と異なる現象

ファントムリード

  • あるトランザクションを読み込んだ時、選択できるデータが現れたり、消えたりする現象

ロックタイムアウトデッドロック

ロックタイムアウトについて

  • 更新と更新で、後からきたトランザクションがロックを取得しようとして、ブロックされる。一定時間まって、その間にロックが取得できない場合はロック待ちタイムアウトとなる

デッドロックについて

  • ロックを保持したまま、お互いにロック済みのリソースに対してロックが必要な処理を行っても、状況が変わらない状態

テーブル設計の基礎

ルール

主キーについて説明できる

  • 必ずレコードを一行に特定できる情報

識別子

  • データを一意に特定できるID

正規形について

第1正規形について

  • テーブルのセルに複合的な値を含んでいない

第2正規形について

  • 全ての列が主キーのみに関数従属をもち、主キーの一部にだけ従属するという列は存在しない

第3正規形について

  • 推移関数従属がある場合はテーブルを分ける。

ER 図

ER 図について

エンティティ

  • 現実世界にある特定の型(クラス)

リレーションシップ

  • エンティティ間に成立する1:多、多:1, 多:多の写像

バックアップとリカバリ

DBMS が持つ 3 つの仕組み

WAL について

DBのデータファイルへの変更を直接行わず、「ログ」として変更内容を記述した「ログレコード」を書き込み、同期する仕組み * ディスクに連続的に書き込むため、ランダムに書き込むよりパフォーマンスがいい * ディスクへの書き込み容量、回数を減らすことができる * データベースバッファを利用して、データベースのデータファイルへの変更を効率よく行える * MySQLではInnoDBログ

データベースバッファについて

データファイルへの入出力をデータベースバッファ経由に一本化 MySQLの場合

  1. 更新対象のデータを含むページが、バッファプールにあるかどうか確認され、なければデータファイルからバッファプールに読み込まれる
  2. 更新がバッファプールの当該ページに対して行われる
  3. 上記2の更新内容が、コミットとともにログに記録される。バッファプールで変更されたが、まだデータファイルに書き込まれていないページは、ダーティページとしてバッファプール内で扱われる
  4. ダーティページは後から適当なタイミングでまとめてデータファイルに書き込まれる(チェックポイント)
  5. チェックポイント以前のログファイルは不要になる。また、更新とともに手順が繰り返される

クラッシュリカバリについて

  • WAL: 最後にコミットしたトランザクションの更新情報をもつ
  • データベースバッファ:クラッシュにより内容はすべて失われる
  • データベースファイル:最後のチェックポイントまでの更新情報を待つ
  • ロールフォワード
    • クラッシュ後、再起動するとWALとデータベースファイルのチェックポイント後の更新情報を使って、データベースファイルをクラッシュ時までにコミットされた状態に戻す
    • ロールフォワードリカバリ(バイナリログ(WAL)を使用してフルバックアップ時点以降、任意のポイントまでリストアする)

リカバリ

PITR(Point-in-time recovery) について

バックアップ 3 つの観点

ホットバックアップとコールドバックアップ

  • ホットバックアップについて
    • オンラインバックアップとも呼ばれ、バックアップ対象のデータベースを停止せず、稼働したままバックアップデータを取得する
    • mysqldump
  • コールドバックアップについて
    • オフラインバックアップとも呼ばれ、バックアップ対象のデータベースを停止し、バックアップデータを取得
    • データディレクトリ以下のディレクトリとファイルをOSのコマンドでコピー

論理バックアップと物理バックアップ

  • 論理バックアップについて
    • SQLベースのバックアップで、テキスト形式に準じるフォーマットでバックアップ
  • 物理バックアップについて
    • データ領域をダンプして、バイナリなどバックアップ

ISUCON7に参加〜そして敗北へ〜

ISUCON初参加しました。

敗北

お題は「isutaba」というチャットツール

画像はファイルに書き出して参照させるぞ!! →できんな? 

やったこ

当日まで

  • 社内ISUCON(復習)

当日(まずはじめに)

  • 複数台サーバまじ?構成確認
  • DBのスキーマ情報確認
  • show create table hoge;
  • SELECT * FROM hoge LIMIT 10;
  • myprofilerを入れる
  • pt-query-digest (percona-toolkit)
  • アクセスログ集計

Nginx

  • worker_connections
  • proxy_pass
  • expires

MySQL

  • INDEX追加
    • (user.name)
    • (message.user_id)
    • (message.channel_id, message.created_at)
    • (haveread.user_id, haveread.channel_id)
    • (image.name)

アプリ改修

画像はファイルに書き出して参照させるぞ!! → できんな? 

やればよかった(忘れていた)

  • ソケット通信化

やりたかったけど、できなかった

  • 画像の脱DB化
  • /icons/* を倒す
  • N+1撲滅

きづけない(次回は気づけるようにしような)

  • SELECT *の撲滅
  • Cache-Control
  • If-None-Match、If-Modified-Since、eTag
  • 304
  • /fetch
  • JSONレスポンス

感想

FlaskとMySQLdbを使ってアプリかこうな やるべきこと気づいて、実装できず悶々して無力だった

PyCon2017 一日目のれぽーと

PyCon2017 一日目

後日に動画とslideがまとまってくれると嬉しい。

英語のセッションばかり聴いていたらとっても難しかった。 VOES 稼働後 after VOES launchが一番おもしろかったです。 VOESという音ゲーを開発している台湾の人のセッションで ゲームのbackend開発でDB周りやCDN、キャッシュ周りの話をしてくれました。 メンテナンスの話ではF○Oの48時間メンテナンスをネタにしたりもしていました。

Industrial Test Automation with Asyncioでは asyncioの実装例周りを実際に書いておきたいと思います。 3.6系を勉強するならnon-blockingIOとか使いたい。。 以外とpyramid使いがいた気がします。人数としてはすくないですが。 Tornadoの話は特に聞かなかったです。

そういえばアンケートではPythonでWEBアプリを書いている人は3割ほどでした。 PyConはデータサイエンティストの集まりと化しているようです。 そもそもプロダクション環境でPythonでアプリをリリースしている企業が少ないということなんでしょう。 PHPRubyでアプリを書いて、分析基盤をPythonを使うという使い分けなのが多そう。

Keynote

Pythonは教育として使われる言語で、いろんな分野の人が使う共通言語になる データサイエンスはソフトウェア開発ではない。 解析に使うのはsoftware(ソフトウェア)なく、thoughtware(思考)である。 予測できることはほとんどない。「未来を予測する最もよい方法は、それを発明すること」byアランケイ ビジネスがオープンソースを好む理由。ベンダーロックインを防ぐ(特にデータ)。 また、自分たちの都合に合わせて変更、機能追加できる。 Pythonはレゴのようなもので組み立てていろんなものを作り上げることができる。

  • Peter Wang
    • Anacondaデータサイエンスエコシステムの製品エンジニアリングチームを率いている人。
  • Over 20 Million Downloards
  • Other Problebms in 2012
  • Pythonは人気がある
    • イブサンローランの香水のCMでIPython のプロンプトが出てくる
  • Why Python for Data
    • not system language but intended to teaching language for prototype
  • Pythonにはいくつかの部族がある
    • Analyst,Data Developer,programmerも使える共通言語
  • Data Science !=Software Development
  • Era of Data Literacy
  • A Few Predictions
    • 未来を予測する最もよい方法は、それを発明すること
  • Open Source and Developers
    • Pythonはレゴのようなもの
  • ビジネスがオープンソースを好む理由。ベンダーロックインを防ぐ(特にデータ)。また、自分たちの都合に合わせて変更、機能追加できる。
  • 解析に使う言語は'thoughtware'で'software'ではない

セッション

Industrial Test Automation with Asyncio

asyncio

  • Industry use
    • Railway Test Automation Project
    • Communication via TCP and UDP based protocals
  • How to talk to N computers at the same time?
  • Trying without Asyncio
  • import socket
  • とても長い、
  • Since the network is the bottleneck
  • and we only talk to
  • The Splution
  • socketモジュール使うより短く書けるよ
import asyncio

tasks - {
     machine.sya("Hello, hoe are you?")
     for maching is machines
}

await asyncio.wait(tasks)
  • The difference
    • In the second ecample ,there is no immediate ececution
    • Only promise creates"please
    • Calling asyncio,wait forces runtime ri ewaolce taskas
  • How do N things at the same time
    • Missing ingeedient Non-blocking IO
    • Many implementations pthread,libuOS level"kqueue,select,epoll
    • How t do N things at the same time
    • リクエスト⇔レスポンスを一台ずつやるのがblocking-IO
    • 一気に複数にリクエストを投げつけるのがnon-blockingIO
    • asyncioの使用例
Python asyncio sockets
reader, wtiter = loop.open_connvtion()
writer.senf(b'Hello, World)
awsit wruterr,drain(
  anser - await reader,read(199)
    )
  • Test Usage
    • シナリオ例
    • ABCからDへ同じパケットを送る
    • DhaAkaradakeケットを受け取るか、
  • slow and incorrect eith blocking I/O
    • In the eqal world
    • network devices do not wait
    • Now with non-blockingI/O
  • 正しい振る舞いだけでなく、テスト実行が3倍早くなった
  • Ecaluation
    • think about use cascadefind tools,and learng about best practices
    • apply,improce,share
  • Synchronoously
    • Code is easy to understand
    • No mental overhead for locking/transactions
    • Easy oo interface with existing
  • Asynchtronously
    • Specian sysntax needed asunc awaot
    • locking always necesary,even though single threaded
    • necessary for teatm to learn new programmin paradigm
  • What you should avoid
    • Using asyncio because It is fast I/ve been thereSpeedup onluy observable in I/O biund
    • If you mix COU and I/O bound rasks and need adcice taks to me
  • Why I like asyncio
    • Incerediblu powerful standard library
    • Easy to implement protocals o n TCP useing OOP:asyncoo.protocalo
    • Context managers for locking promitives
  • If you create something aweasome write a blof post
  • Got o your local python meetio and tals aavuoit Asynip
  • Contribute back to ppen souece :Rreport Bugs,Help Beginners,Write

Pythonで大量データ処理!PySparkを用いたデータ処理と分析のきほん

  • Apache Sparkの紹介
  • PythonといえばPyDataというくらいライブラリがそろっている
  • 大規模データを扱いたい、データ量がスケールしても動く仕組みがほしい
  • SparkはOSSの並列分散処理フレームワーク
    • 処理が失敗してもリカバリフレームワークがやってくれる
    • タスクのスケジューリングもやってくれる
    • サーバのスケールアウトによって、スループットが線形に近い形で向上する
    • リソース値用最適化ノク婦がされている
    • オンメモリベースの処理
    • JVMのオーバヘッドを改善sるProject Tungsten
    • キャッシュ、遅延評価
    • S[ark2.2だと3.4以上に対応
    • 機械学習やストリーム処理、処理の流れが見えるUI
    • サーバ一台でも動く
    • Spark2.2.0からpipでもインストールできたけど、localのみで分散処理はできない
    • Dockerでもお試しできる
  • Hadoopクラスタ上で動作する、Amazon EMRやGoogle DataProcなどのマネージドサービスを使うと楽
  • Sparkの3つのプログラミングモデル
  • RDDとDataframe
    • RDD,コレクション操作のように処理を記述する
    • DataframehaSQLライクに処理を記述する
    • Dataframeはオプティマいさによる最適化
    • Dataframenoオプティマイザによる最適化
    • 高地的な処理の順番に入れ替えれ実行してくれる
    • データソースによててはギル田処理をデータ・ソース側d行い必要なデータのみを読み込むようにする
  • RDD
    • ワーカーノードでの処理ではPythonプロセスで行われる
  • Dataframe
    • ワーカーノードでの処理はJVM上で行われる
    • ただしUDHはPytohonプロセスで実行される
  • パフォーマンス上の問題点
    • Iterator単位でのserializationとpythonプロセスへのパイプが発生
  • RDDPythonは遅い
  • DFだったらScalaと同じくらい
  • RDDの中でNumpyやScipyを使う
  • 集計結果をPandas DataFrameに変換してMatplitlibで可視化する
  • PySParkではppandas DataFrameとDparkDataFtaneの相互変換可能

  • Apache Arrow

    • データフォーマットの仕様とそれをりようするためのライブラリ
    • 異なる言語プロダクト感でのデータ連携コストを下げる
  • Apache Zeppelom
    • レコメンデーション、異常検知とか
  • DAたFrameをつかう 
  • 処理するデータ量を減らす
  • ストレージの利用
    • D3,HDFA
  • データフォーマットはParwuetを利用
  • メモリ
  • yarnによってコンテナが きっlareruera-ga
  • okiyasui

VOES 稼働後 after VOES launch

Hsueh-Tsung Kuo

how to resolve problems of mobile game server development and service maintenance

  • VOES
  • DBのアトミックを守る
  • database chache mechanism
    • redis or memchached in RAM:fast
  • AからBへのサーバへデータを移すとき
  • database server reliableを保つ
  • def gacha
  • FGOメンテナンス48時間突破
  • Python is so slow
  • from database to static failures
  • statistics
    • crontabでBigQueryを叩いて結果を初滅
    • 結果はGoogle Cloug Storageなどに突っ込む
  • Server operation with CSB
    • CDNでキャッシュミスしたらServerにリクエストを投げる
    • CDNのCache invalidationは不毛だしrevisionごとにURL作ろう
  • service downtime and update
  • timezone
    • TZ=Asia/Taipei
    • イベント処理には困らないからUTC使わない

Why you should do text analysis in python

Bhargav Srinivasa Desikan

https://github.com/hari-allamraju/pycon-talk-taxidata/tree/master/slides

  • why python
    • ease of use
    • regex,parsing, adn generators(pipeline text)
    • incredible suport in form of libraries
    • awesome community
  • why text proxessing
    • data everywhere
    • with machine learning,deep insights
    • fun - from a personal point of view
    • employability - from a progessinal point of view
  • so what can you do?
    • glean insights from your own text
    • chatbots
    • language translation
      • machine learning,deep learnings,tenserflow
    • research - especially in the humanities
  • where is the data
  • pre-processing
    • garbage in , garbage out
    • ease of reading and writing to files
    • also - libraried for pre-processing
  • machine learnng in text
    • gensim
      • トピック分析できるライブラリ
    • scikit- learn
    • keras/tensorflow
  • world embeddings
    • king - man + woman = Queen
  • computational linguitstics
    • Part of Speech tagging
    • Named Entity Recognition
  • Japanse relevance
    • spaCy has started alpha suppprt for Japanese
    • you can contribute and help expand it
    • as for ML, it is largely language agnostic
  • so now
    • python is great at quick and dirty text pre-processing
    • and has a great ,great library support
    • and woth data everywhere

PythonでOauthサーバを構築した話

設定やパラメータの話 規約があるので、規約どおりに実装しようという話

  • Tech bureau Coap.で働いている
  • APIの話
    • secret & key を利用する場合
    • OAuth(token)を利用する場合
  • OAuthサーバの作り方
  • OAuthとは
  • OAuth2.0の話
    • 日本語で規約がある
    • 全て規約が決まっている
  • 使ったもの
    • Python3
    • Pyramid
    • SQLArchemy
    • Nginx
  • トークン発行、利用、再発行
  • 名称、サービス名称
  • cliend_id
    • どのサーバに紐付ければいいのか
  • responce_type
  • state
    • なりすまし対策
  • redirect_url
    • リダイレクト用のURL必須ではない
  • 認証が通ったあと

How (and Why) We speak in Unicord

Devon Peticolas

  • Morse
    • Encording
  • Baudot
    • パンチカード
  • ASCⅡ
  • The 8th bit
    • Latin-1
    • Hebrew
    • Meanwhile in Japan
    • Kanji
    • Katakarna
    • AA
  • Japanese Encodeiisa
  • Unicodeはどの言語でもつかる
  • utf-8
  • utf-16
  • utf-32

Secrets of a WSGI master

Graham Dumpletonさん

  • WGSI == Web Server Gateway Interfaces
    • Webサーバとアプリをつなぐもの
  • WSGI is a specification for an Application Programming Interface
  • Friends don’t let friends use raw WSGI
  • django,Flask,Bottle,などなど
  • You still need a way to host a WSGI Application
  • The development servers builtin to a framework are not good enough
  • Installing mod_wsgi the easy way
    • pip install mod_wsgi
  • Run mod_wsgi from the command Line
    • mod_wsgi-express start-server wsgi.py
    • No Apache configuration required
  • Automatic code reloading
    • python manage.pu runmodwsgi –reload-on-changes
  • Friends don’t let friends use Python without a Python virtual enviroment
  • warpdrive
  • Same tools for development
    • warpdrive project mypyapp
    • warpdrive build
    • warpdrive start
  • Generate image with no Dockerfile
    • warpdrive image mypyapp
    • docker run –rm -p 80:8080 mypyapp
  • Source-to-Image
  • Embedded mode
  • Daemon mode
  • Request monitoring
  • Openshift
  • Friends don’t let friends use Windows for running Python web Applications
  • Friends don’t let friends use the mod_wsgi which comes packaged with the operating system
  • Friends don’t let friends use those other WSGI servers
  • Friends don’t let friends make things too complicated,simple is good

LT

ギャル語翻訳

  • pyladiesの人たちのプロジェクト
  • hack-a-thon
  • ニュースサイトをギャル語にした
  • Mecab,Tornado,Azure,Data ScirnceVM,Azure Redis cache
  • 辞書は手書き
  • Cheomeの拡張機能で設定
  • 辞書をディープラーニング化したい
  • ギャル語の情報を取得したい

ymyzk

  • 計測する
  • profileをつかう
  • wsgi_lineprof
  • PythonでISUCONかちましょう

Respect is built-in names

  • sum,idに代入しない
  • list に listを突っ込まない
  • dictにdictを突っ込まない
  • jsonjsonをつっこまない

誰でも簡単に暗号取引botができるライブラリを作った

  • Zaifbot

OSSFriday

  • OSSに貢献しよう

ローカル環境でもDockerをドカドカ使う

  • builderscon来年もやるらしい
  • テスト環境でも使うのはよい

Pythonの実装をみる

カラオケおじさん

  • 英日中の歌詞判別

ジョブフェア

  • モノタロウ
    • 東京オフィス作る
    • データ分析に基づき仕事をしている
  • Line
    • サーバレスでLINE botつくれる
  • Retty
  • iRidge
    • 何やっているかよくわからない会社

Closing

Pyconのスタッフ多い。40人ぐらい? 1クラス分以上いた気がする。