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]
新しいシェルプログラミングの教科書はわかりやすくておすすめです。
- 作者: 三宅英明
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/11/21
- メディア: Kindle版
- この商品を含むブログを見る
Apache2.2の設定
久しぶりにやったので、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(認証局)による認証によって、本物であることを証明する
何が必要でしょうか
てなわけでインストール
# 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
カレントディレクトリの表示
- $PWD
ログインユーザーのログインシェル
- $SHELL
現在動作しているbashコマンドのフルパス
- $BASH
現在動作しているbashのバージョン情報
- $BASH_VERSION
現在実行しているシェルスクリプトの行番号を格納している。 いま何行目なのか出力できるのでデバックなどに使える。
- $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標準
- アンシーは米国内の工業分野の標準化組織で、ベンダーに依存しないSQLのこと
ANSI/ISO SQL標準 が定義する分離レベルについて
非コミット読み取り(リードアンコミッテッド)
- 読込 のタイミングによっては読込がブロックされる場合がある時に選ぶとブロックしない
コミット済み読み取り(リードコミッテッド)
- 初回クエリ発行時にコミットされているデータを読み込み、その後は最新のクエリの実行開始時点でコミットされたデータを読む
再読み込み可能読み込み(リピータブルリード)
- 初回クエリ発行時にコミットされているデータを読み込み、その後も同じ結果セットが返され他のトランザクションがコミットしても、反映されない
直列化可能(シリアライザブル)
- 複数のトランザクション処理を順次実行させる
分離レベルの緩和によって起こる 3 つの現象について
ダーティリード
曖昧な読み取り
- あるトランザクションが以前読み込んだデータを再度読み込んだ時、2回目以降の結果が1回目と異なる現象
ファントムリード
- あるトランザクションを読み込んだ時、選択できるデータが現れたり、消えたりする現象
ロックタイムアウトとデッドロック
ロックタイムアウトについて
デッドロックについて
- ロックを保持したまま、お互いにロック済みのリソースに対してロックが必要な処理を行っても、状況が変わらない状態
テーブル設計の基礎
ルール
主キーについて説明できる
- 必ずレコードを一行に特定できる情報
識別子
- データを一意に特定できるID
正規形について
第1正規形について
- テーブルのセルに複合的な値を含んでいない
第2正規形について
- 全ての列が主キーのみに関数従属をもち、主キーの一部にだけ従属するという列は存在しない
第3正規形について
- 推移関数従属がある場合はテーブルを分ける。
ER 図
ER 図について
エンティティ
- 現実世界にある特定の型(クラス)
リレーションシップ
- エンティティ間に成立する1:多、多:1, 多:多の写像
バックアップとリカバリ
DBMS が持つ 3 つの仕組み
WAL について
DBのデータファイルへの変更を直接行わず、「ログ」として変更内容を記述した「ログレコード」を書き込み、同期する仕組み * ディスクに連続的に書き込むため、ランダムに書き込むよりパフォーマンスがいい * ディスクへの書き込み容量、回数を減らすことができる * データベースバッファを利用して、データベースのデータファイルへの変更を効率よく行える * MySQLではInnoDBログ
データベースバッファについて
データファイルへの入出力をデータベースバッファ経由に一本化 MySQLの場合
- 更新対象のデータを含むページが、バッファプールにあるかどうか確認され、なければデータファイルからバッファプールに読み込まれる
- 更新がバッファプールの当該ページに対して行われる
- 上記2の更新内容が、コミットとともにログに記録される。バッファプールで変更されたが、まだデータファイルに書き込まれていないページは、ダーティページとしてバッファプール内で扱われる
- ダーティページは後から適当なタイミングでまとめてデータファイルに書き込まれる(チェックポイント)
- チェックポイント以前のログファイルは不要になる。また、更新とともに手順が繰り返される
クラッシュリカバリについて
- WAL: 最後にコミットしたトランザクションの更新情報をもつ
- データベースバッファ:クラッシュにより内容はすべて失われる
- データベースファイル:最後のチェックポイントまでの更新情報を待つ
- ロールフォワード
リカバリ
PITR(Point-in-time recovery) について
- MySQL(バイナリログ)
- PostgreSQL(WALログ)
バックアップ 3 つの観点
ホットバックアップとコールドバックアップ
- ホットバックアップについて
- オンラインバックアップとも呼ばれ、バックアップ対象のデータベースを停止せず、稼働したままバックアップデータを取得する
- mysqldump
- コールドバックアップについて
論理バックアップと物理バックアップ
- 論理バックアップについて
- 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でアプリをリリースしている企業が少ないということなんでしょう。 PHPかRubyでアプリを書いて、分析基盤を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
- 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
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
- 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の並列分散処理フレームワーク
- Hadoopクラスタ上で動作する、Amazon EMRやGoogle DataProcなどのマネージドサービスを使うと楽
- Sparkの3つのプログラミングモデル
- RDDとDataframe
- RDD
- ワーカーノードでの処理ではPythonプロセスで行われる
- Dataframe
- ワーカーノードでの処理はJVM上で行われる
- ただしUDHはPytohonプロセスで実行される
- パフォーマンス上の問題点
- 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へのサーバへデータを移すとき
- 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
- service downtime and update
- timezone
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
- free, open source, research sources
- scrape data off the internet
- whatsapp,FB,Hike,Line - any messageing app!
- ebooks
- 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
- gensim
- 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
- 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
Respect is built-in names
誰でも簡単に暗号取引botができるライブラリを作った
- Zaifbot
OSSFriday
- OSSに貢献しよう
ローカル環境でもDockerをドカドカ使う
- builderscon来年もやるらしい
- テスト環境でも使うのはよい
Pythonの実装をみる
カラオケおじさん
- 英日中の歌詞判別
ジョブフェア
- モノタロウ
- 東京オフィス作る
- データ分析に基づき仕事をしている
- Line
- サーバレスでLINE botつくれる
- Retty
- もくもく会とかやっているらしい
- iRidge
- 何やっているかよくわからない会社
Closing
Pyconのスタッフ多い。40人ぐらい? 1クラス分以上いた気がする。