my.cnfの中身を見てみよう

datadir, socket, character_set_server, default-storeage-engine, innodb_file_per_table, symbolic-link, log-err, pid

[vagrant@localhost app]$ cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Settings user and group are ignored when systemd is used (fedora >= 15).
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
user=mysql

# Semisynchronous Replication
# http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
# uncomment next line on MASTER
;plugin-load=rpl_semi_sync_master=semisync_master.so
# uncomment next line on SLAVE
;plugin-load=rpl_semi_sync_slave=semisync_slave.so

# Others options for Semisynchronous Replication
;rpl_semi_sync_master_enabled=1
;rpl_semi_sync_master_timeout=10
;rpl_semi_sync_slave_enabled=1

# http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html
;performance_schema

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

なるほど、ディレクトリパスを記載していますね。

シェルスクリプト

#!/bin/sh
echo "Hello World!"

./hello.sh で動かします。
[vagrant@localhost app]$ ./hello.sh
-bash: ./hello.sh: 許可がありません

permission denied.

[vagrant@localhost app]$ cat -e hello.sh
#!/bin/sh^M$
echo “Hello World!”

改行コードがおかしいみたい。
[vagrant@localhost app]$ sed -i ‘s/\r//’ hello.sh
[vagrant@localhost app]$ ./hello.sh
Hello World!

What is Amazon EBS?

Amazon Elastic Block Store (Amazon EBS) provides persistent block level storage volumes for use with Amazon EC2 instances in the AWS Cloud. Each Amazon EBS volume is automatically replicated within its Availability Zone to protect you from component failure, offering high availability and durability. Amazon EBS volumes offer the consistent and low-latency performance needed to run your workloads. With Amazon EBS, you can scale your usage up or down within minutes – all while paying a low price for only what you provision.

Elastic Block Store

スナップショットは作られてますね。
スナップショットとは… Amazon EBSボリュームのデータを Amazon S3 にバックアップ

volumeを作成してEC2にattachする。

actionからattachする

snapshotの作成でS3にバックアップされる。

modify

なるほど~

EBSスナップショット

ポイントインタイムスナップショットを作成することで、Amazon EBSボリュームのデータを Amazon S3 にバックアップできる。
スナップショットは増分バックアップ。
最後にスナップショットを作成した時点から、ボリューム上で変更のあるブロックだけが保存される。これにより、スナップショットを作成するのに要する時間が最小限に抑えられ、データを複製しないことで、ストレージコストが節約されます。スナップショットを削除すると、そのスナップショットに固有のデータだけが削除されます。各スナップショットには、(スナップショットを作成した瞬間から) データを新しい EBS ボリュームに復元するために必要な情報がすべて含まれる。

Amazon Elastic Block Store (Amazon EBS) は、AWS クラウド内で Amazon EC2 インスタンスと組み合わせて使用できる、永続的なブロックストレージボリューム

php artisan

[vagrant@localhost agile]$ php -v
PHP 7.1.21 (cli) (built: Aug 15 2018 18:11:46) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

composerを入れてlaravelを入れます。
[vagrant@localhost agile]$ php composer.phar create-project –prefer-dist laravel/laravel

[vagrant@localhost agile]$ cd laravel
[vagrant@localhost laravel]$ php artisan –version
Laravel Framework 5.7.4

access時間をinsert

mysql> use redirect
Database changed
mysql> select * from url
-> ;
+—-+——+—————————+
| no | id | url |
+—-+——+—————————+
| 1 | 001 | https://www.facebook.com/ |
| 2 | 002 | https://www.amazon.com/ |
| 3 | 003 | https://www.apple.com |
| 4 | 004 | https://www.google.com |
+—-+——+—————————+
4 rows in set (0.00 sec)

mysql> create table accesstime (
-> no int unsigned auto_increment primary key,
-> id varchar(11),
-> time datetime
-> );
Query OK, 0 rows affected (0.21 sec)

$date = new DateTime();
$datetime = $date->format('Y-m-d H:i:s');
echo $datetime;

if(isset($_GET["id"])){
	$id = $_GET["id"];
} else {
	$id = "001";
}
try {
$pdo = new PDO('mysql:host=localhost;dbname=redirect;charset=utf8','root','',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM url where id = $id");
$row = $stmt -> fetch(PDO::FETCH_ASSOC);
$url = "location: " .$row["url"]. "";


$stmt1 = $pdo -> prepare("INSERT INTO accesstime (id, time) VALUES (:id, :time)");
$stmt1->bindParam(':id', $id, PDO::PARAM_STR);
$stmt1->bindParam(':time', $datetime, PDO::PARAM_STR);

$stmt1->execute();

header($url);

idとaccess時間がtable accesstimeに入ってますね♪
mysql> select * from accesstime;
+—-+——+———————+
| no | id | time |
+—-+——+———————+
| 1 | 001 | 2018-09-19 01:03:54 |
+—-+——+———————+
1 row in set (0.00 sec)

さあ、laravelをやりましょう。

idとurlを格納

mysql

mysql> insert into url(id, url) values
-> (‘001’, ‘https://www.facebook.com/’),
-> (‘002’, ‘https://www.amazon.com/’),
-> (‘003’, ‘https://www.apple.com’),
-> (‘004’, ‘https://www.google.com’);
Query OK, 4 rows affected (0.15 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from url;
+—-+——+—————————+
| no | id | url |
+—-+——+—————————+
| 1 | 1 | https://www.facebook.com/ |
| 2 | 2 | https://www.amazon.com/ |
| 3 | 3 | https://www.apple.com |
| 4 | 4 | https://www.google.com |
+—-+——+—————————+
4 rows in set (0.00 sec)

あら、idが001ではなく、1になってますね。
drop tableしてvarchar(11)に変更します。

create table url (
no int unsigned auto_increment primary key,
id varchar(11),
url varchar(255)
);

パラメーターのURLをfetchする。

if(isset($_GET["id"])){
	$id = $_GET["id"];
} else {
	$id = "001";
}
try {
$pdo = new PDO('mysql:host=localhost;dbname=redirect;charset=utf8','root','',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM url where id = $id");
$row = $stmt -> fetch(PDO::FETCH_ASSOC);
echo $row["url"];

リダイレクト処理。awsでキャッシュさせれば、少し早くなるか。

if(isset($_GET["id"])){
	$id = $_GET["id"];
} else {
	$id = "001";
}
try {
$pdo = new PDO('mysql:host=localhost;dbname=redirect;charset=utf8','root','',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM url where id = $id");
$row = $stmt -> fetch(PDO::FETCH_ASSOC);
$url = "location: " .$row["url"]. "";
header($url);

Amazon ElastiCache:Amazon ElastiCache は、クラウドでのインメモリデータストアまたはキャッシュのデプロイ、運用、およびスケールを容易にするウェブサービスです。このサービスは、低速のディスクベースのデータベースに完全に依存せずに、高速のマネージド型インメモリデータストアから情報を取得できるようにすることで、ウェブアプリケーションのパフォーマンスを向上させます。
これか?
>メモリはディスク (磁気または SSD) よりも桁違いに高速であるため、インメモリキャッシュからのデータ読み取りは非常に高速 (ミリ秒以下) です。このきわめて高速なデータアクセスにより、アプリケーションの全体的なパフォーマンスが向上します。

TinyMCE

文章を見たまま編集(WYSIWYG。What you see is what you get)できるエディタのライブラリ

-プラグインなどによる機能が豊富
-WordPressに採用
-ツールバーの追加、ボタン位置の入替や削除、独自ボタンの追加などカスタマイズが柔軟

tinyMCEのself hostedからdownloadする
https://www.tiny.cloud/download/self-hosted/

4.8.2が最新版
CDNもあるようですが、今回は最新版パッケージをダウンロードします。

minifiedされた jquery.tinymce.min.jsを使うようですな。
プラグインはthemesなどバリエーションが豊富ですね。

githubはこちら
https://github.com/tinymce/tinymce
とりあえずforkしておきましょう。

早速vagrantで使ってみましょう。

<!Doctype html>
<html>
<head>
	<meta charset="UTF-8">
	<script src="tinymce/js/tinymce/tinymce.min.js"></script>
	<script>
	tinymce.init({
		selector: "#foo",
	});
</script>
</head>
<body>
	<h1>TinyMCEの動作テスト</h1>
	<textarea id="foo" name="foo">最初に入力する文章</textarea>
	<h2>入力チェック</h2>
</body>
</html>

devtoolで見てるが、仕組みがようわからん。。。

RDS リードレプリカを追加する

リードレプリカの作成を押下すると、
– 送信先リージョン
– サブネットグループ
– アベイラビリティーゾーン
– 暗号化
– インスタンスの仕様

インスタンスのクラスも設定できる

レプリケーションロールがマスタとレプリカとなる。

CPU クレジット残高は、CPU 利用率がベースラインを上回り、前の 5 分間に消費したクレジットが獲得したクレジットよりも多かった場合に減少します。

パラメーターの値を取得する

$_GET[“id”] で取得できます。

-サンプル

if(isset($_GET["id"])){
	$id = $_GET["id"];
}

echo $id;

次に、mysqlにidと紐づくURLを格納します。

まず、create tableします。
mysql> create database redirect;
Query OK, 1 row affected (0.11 sec)

続いてtableを作ります。
create table url (
no int unsigned auto_increment primary key,
id int,
url varchar(255)
);

次に、insert tableしていきます。