InnoDBの行ロック

トランザクションのロック待ちでタイムアウトしてしまうことがある。

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

mysql> use app
Database changed
mysql> create table lock_test (
-> id int primary key auto_increment,
-> name varchar(32) not null,
-> value int not null
-> ) engine = innoDB default charset=utf8;
Query OK, 0 rows affected (0.55 sec)

mysql> insert into lock_test (name, value) values (‘tanaka’, 80),(‘suzuki’, 30),(‘sato’, 50),(‘takahashi’, 40);
Query OK, 4 rows affected (0.07 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from lock_test;
+—-+———–+——-+
| id | name | value |
+—-+———–+——-+
| 1 | tanaka | 80 |
| 2 | suzuki | 30 |
| 3 | sato | 50 |
| 4 | takahashi | 40 |
+—-+———–+——-+
4 rows in set (0.00 sec)

コマンドラインを二つ立ち上げて、同時にupdateしようとすると、片方が止まります。これがlock wait

片方をcommitすると、以下のメッセージが出ます。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

カラムが異なればロックされない。
インデックスだと、ロックされる。
update lock_test set value = value + 10 where name = ‘tanaka’;

RDSメンテナンスウィンドウ

Amazon RDS では、Amazon RDS リソースのメンテナンスを定期的に実行する。通常、メンテナンスには DB インスタンスや DB クラスターの基盤となるオペレーティングシステム (OS) あるいはデータベースエンジンの更新が伴う。通常、オペレーティングシステムの更新はセキュリティの問題に関連しているため、できるだけ早急に適用する必要がある。

すぐに適用とすると、開始される。
CLIで調整することもできる。 AWS CLI の modify-db-instance コマンドを使用する。

aws rds modify-db-instance \
--db-instance-identifier mydbinstance \
--preferred-maintenance-window Tue:04:00-Tue:04:30
https://rds.us-west-2.amazonaws.com/
?Action=ModifyDBInstance
&DBInstanceIdentifier=mydbinstance
&PreferredMaintenanceWindow=Tue:04:00-Tue:04:30
&SignatureMethod=HmacSHA256
&SignatureVersion=4
&Version=2014-09-01
&X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIADQKE4SARGYLE/20140425/us-east-1/rds/aws4_request
&X-Amz-Date=20140425T192732Z
&X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
&X-Amz-Signature=1dc9dd716f4855e9bdf188c70f1cf9f6251b070b68b81103b59ec70c3e7854b3

マネジメントコンソールからの設定も可能。

RDS リードレプリカ

リードレプリカというのは、読み込み専用として利用することができるマスターの複製データベース
非同期のため常にマスターと完全に内容が一致しているわけではなく常に最新のデータが取得できるということではありませんので、マスターの負荷分散用として利用するのがよい

Amazon RDS リードレプリカによって、データベース (DB) インスタンスのパフォーマンスと耐久性が向上する

1 つの DB インスタンスのキャパシティーを伸縮自在にスケールし、読み取り頻度の高いデータベースのワークロードを緩和

Amazon RDS for MySQL、MariaDB、PostgreSQL、および Amazon Aurora
読み込みクエリをアプリケーションからリードレプリカにルーティングすることにより、ソース DB インスタンスへの負荷を減らすことができる

AWS Athena

Amazon Athena は、標準的な SQL を使用して Amazon S3 のデータを簡単に分析できるインタラクティブなクエリサービス
S3 のデータを指定し、スキーマを定義して、標準的な SQL を使用してデータのクエリを開始するだけ

Examples include CSV, JSON, or columnar data formats such as Apache Parquet and Apache ORC. You can use Athena to run ad-hoc queries using ANSI SQL, without the need to aggregate or load the data into Athena.

([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*):([0-9]*) ([.0-9]*) ([.0-9]*) ([.0-9]*) (-|[0-9]*) (-|[0-9]*) ([-0-9]*) ([-0-9]*) “([^ ]*) ([^ ]*) (- |[^ ]*)” (“[^”]*”) ([A-Z0-9-]+) ([A-Za-z0-9.-]*)$

AWS SNS

概念図

putty

console

aws iot create-keys-and-certificate --set-as-active \
--certificate-pem-outfile certs/certificate.pem.crt \
--public-key-outfile certs/public.pem.key \
--private-key-outfile certs/private.pem.key \
--region us-west-2

backlogの課題を取得

<?php
$params = array(
    'apiKey' => 'API key',
    'projectId[]' => 'project id',
    'statusId' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4),
    'sort' => 'updated',
    'count' => 100,
);
$url = 'https://{$hoge}.backlog.com/api/v2/issues?'.http_build_query($params, '','&');
$headers = array('Content-Type:application/x-www-form-urlencoded');
$context = array(
    'http' => array(
        'method' => 'GET',
        'header' => $headers,
        'ignore_errors' => true,
    )
);
$response = file_get_contents($url, false, stream_context_create($context));
$json = mb_convert_encoding($response, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$json = json_decode($json, true);
echo "<pre>";
var_dump($json);
echo "</pre>";
?>

複数projectなら、こんな感じで書く。

'projectId' => array(42107 => 42107, 42116 => 42116),

$jsonは連想配列で返ってくる。
foreachでいってみよう!

foreach($json as $value){
     echo $value["issueType"]["name"] ." ".$value["issueKey"]." ". $value["summary"]." " .$value["assignee"]["name"]. " ".$value["status"]["name"]." ".$value["priority"]["name"]."".$value["created"]." ".$value["dueDate"]." " .$value["updated"]." ".$value["createdUser"]["name"]."<br>";
}

うお。

tableで表示したい。その前に、日付フォーマット。date(‘m/d’, strtotime($value[“created”]))とする。

foreach($json as $value){
     echo $value["issueType"]["name"] ." ".$value["issueKey"]." ". $value["summary"]." " .$value["assignee"]["name"]. " ".$value["status"]["name"]." ".$value["priority"]["name"]."".date('m/d', strtotime($value["created"]))." ".date('m/d', strtotime($value["dueDate"]))." " .date('m/d', strtotime($value["updated"]))." ".$value["createdUser"]["name"]."<br>";
}

うお、nullだと01/01になる。。冗長だが。。

foreach($json as $value){
     if(!is_null($value["dueDate"])){
        echo $value["issueType"]["name"] ." ".$value["issueKey"]." ". $value["summary"]." " .$value["assignee"]["name"]. " ".$value["status"]["name"]." ".$value["priority"]["name"]."".date('m/d', strtotime($value["created"]))." ".date('m/d', strtotime($value["dueDate"]))." " .date('m/d', strtotime($value["updated"]))." ".$value["createdUser"]["name"]."<br>";
     } else {
        echo $value["issueType"]["name"] ." ".$value["issueKey"]." ". $value["summary"]." " .$value["assignee"]["name"]. " ".$value["status"]["name"]." ".$value["priority"]["name"]."".date('m/d', strtotime($value["created"]))." "." "." " .date('m/d', strtotime($value["updated"]))." ".$value["createdUser"]["name"]."<br>";
     }
}

backlog api

1. APIキーを取得
Backlogログイン -> 個人設定 -> API -> 新しいAPIキーを設定 -> APIキー発行
2. spaceIdを確認
https://{$spaceID}.backlog.com/
3. 課題の種別のID
https://{$spaceID}.backlog.com/ListIssueType.action?projectId={$課題の種別のID}

string(66) “{“errors”:[{“message”:”Not Found Space.”,”code”:6,”moreInfo”:””}]}”

スペースがない!?

https://hoge.backlog.jp/api/v2/issues?

よくみたら.jp ではなく、.com ならいけますな

https://hoge.backlog.com/api/v2/issues?

Embulkを使ってみる

wget -O test.tar.gz https://github.com/livedoor/datasets/blob/master/ldgourmet.tar.gz?raw=true

[vagrant@localhost embulk]$ ls
test.tar.gz
[vagrant@localhost embulk]$ tar xvfz test.tar.gz
areas.csv
categories.csv
prefs.csv
ratings.csv
rating_votes.csv
restaurants.csv
stations.csv