OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder AGC023 A - Zero-Sum Ranges

AtCoder AGC023 A - Zero-Sum Ranges をやってみた。


## 問題
> 長さ N の整数列 A があります。
A の 空でない 連続する 部分列であって、その総和が 0 になるものの個数を求めてください。 ただし、ここで数えるのは 部分列の取り出し方 であることに注意してください。 つまり、ある 2 つの部分列が列として同じでも、取り出した位置が異なるならば、それらは別々に数えるものとします。
( https://atcoder.jp/contests/agc023/tasks/agc023_a より引用)

## 制約
$0 \le N \le 2 \times 10^5$
$-10^9 \le A_i \le 10^9$

## 考え方

とりあえず [累積和](https://qiita.com/drken/items/56a6b68edef8fc605821) をとって全パターン数え上げるか、とやってみたら無事 TLE で死亡。（よく考えたら計算量は $O(2^{N+1}-1)$ くらい？）

結局ギブアップで解説を見ました。

累積和の数列 $S$ を作って、$S$ のなかで異なる位置の値が同じ値であれば、その範囲の数値の和が0になることを利用すれば良いようです。
たしかに、累積和の数列を $S$ とすると、普段これを利用して2要素間の合計を計算するには、$S_j - S_i$ などで計算するわけで、これが0になるのは $S_i$ と $S_j$ が同じ値のとき、といえます。

同じ値になる物であれば、Sの要素がいくつかあれば、そこから2つ選べば合計が0になるので、 S の各値について、それぞれ出現数 x とすると、 $2 \le x$ の場合に $ {}_x C_2 $ を計算して合計すれば答えになります。

## 提出コード

次のようなコードを書きました（抜粋）。全体は[こちら](https://atcoder.jp/contests/agc023/submissions/5417500)

```go
func main() {
	defer stdout.Flush()
	n := readInt()
	a := make([]int64, n)
	for i := range a {
		a[i] = readInt64()
	}
	m := make(map[int64]int64)
	var s int64 = 0
	m[s]++
	for i := range a {
		s = s + a[i]
		m[s]++
	}
	var ans int64
	for _, v := range m {
		if 1 < v {
			ans += v * (v - 1) / 2
		}
	}
	println(ans)
}
```

## 余談

drken さんの [累積和の記事](https://qiita.com/drken/items/56a6b68edef8fc605821) を改めて読んでみたところ、この問題についても解説されていました。
Webサービス実装時に注意したい脆弱性


構築、実装、運用、etc…。
どの場面においてもセキュリティは欠かせないものですが、今回は実装時に行うセキュリティ対策についてまとめていこうと思う。
とは言え、場合によって対策しなければならないものはたくさんあるので今回は、Webページなどで起こる、

- SQLインジェクション
- XSS
- CSRF
- セッションハイジャック

の４つを見ていこうと思う。

# SQLインジェクション
　SQL文を入力し、データベースから不正に情報を流出させるもの。
情報漏洩だけでなく削除や改ざんの恐れなどもある。

```PHP
$query = "SELECT * FROM user WHERE id = '$user_id'";
```

という脆弱性のあるプログラムがあったとして、$user_idに対し

```
' or 'A' = 'A
```

という文を入れるとする。
WHERE文の前半部分で通らずとも'A' = 'A'が通ってしまうので実質

```SQL
SELECT * FROM user;
```

というSQL文を実行したのと同じ結果となってしまう。

## 対策方法

- プレースホルダを使用する
- エスケープ処理を行う

ことで対策することができる。
例としてプレースホルダを使用した場合

```PHP
$query = "SELECT * FROM user WHERE id = ?";
execute($user_id);
```

こういったプログラムを書けばあくまで値として文を入れるので不正なSQL文を実行しないようになる。

参考：[SQLのプレースホルダはどういった目的で使われるのか](https://website-planner.com/sql%E3%81%AE%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%81%AF%E3%81%A9%E3%81%86%E3%81%84%E3%81%A3%E3%81%9F%E7%9B%AE%E7%9A%84%E3%81%A7%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B/)


# XSS(クロスサイト・スクリプティング)

ウェブアプリなどで、スクリプトを埋め込むことができる脆弱性を悪用し、利用者のブラウザ上で不正なスクリプトが実行され、情報漏洩などを起こす。

```PHP
<div>
    検索結果：<?php echo $keyword;?>
</div>
```

というプログラムで、$keywordに対し、

```HTML
<font color="red">
```

などを入れると検索結果として出てきたものより後が全て赤文字で表示されてしまう。
入れる文によってはアラートを発生させたり、別ページに飛ばしたりと色々できてしまう。

## 対策

- HTML文の入力を許可しない
- 文字コードを指定する

ことで対策できる。
例としてHTML文の入力を許可しない(一部の文字を変換させる)もので、


```PHP
<div>
    検索結果： <?php echo htmlspecialchars($keyword,ENT_QUOTES);?>
</div>
```

というようなプログラムで先ほどのHTML文を入れたとしても「<」などの文字が「&lt;」などといった文字に変換され、表示自体に問題はなく、かつセキュリティ対策にもなる。

# CSRF(クロスサイト・リクエスト・フォージェリ)

Webアプリにログインした状態を維持したまま、悪意のあるURLをクリックするなどして、利用者の意図しないリクエストを実行してしまい、設定を変更されたり強制的に投稿されたりする。

## 対策方法
指定のフォームを利用して投稿しているかどうか確認(トークンを発行し正しいかどうか検証)することで対策できる。

トークンの発行時

```PHP
$csrf_token = get_csrf_token();
$_SESSION['csrf_token'] = $csrf_token;
```

情報を渡す時

```PHP
<form action="~~" method="post">
    <input type="text" name="text">
    <input type="hidden" name="scrf_token" value="<?php $csrf_token?>">
    <input type="submit" name="comment" value="投稿">
</form>
```

リクエスト受け取り時

```PHP
if($_POST['scrf_token']!=$_SESSION['csrf_token']){exit();}
```

参考：[３分でわかるXSSとCSRFの違い](https://qiita.com/wanko5296/items/142b5b82485b0196a2da)

# セッションハイジャック

推測・盗用・固定化などがある。
一例として推測の場合を見てみる。

セッションIDの生成規則を割り出して有効なセッションIDを推測し利用者になりすます。

## 対策

- セッションIDを推測困難なものにする
- ログイン成功後、新しいセッションを開始させる

# まとめ
　自分のしたいことに対してどんな脆弱性が発生するかを考え、その対策をとっていくことが必要になってきます。
少しの油断がセキュリティに穴を開けるので注意しないといけないですね。
CentOS7.6 に Python3系をインストール手順

+ CentOSバージョン確認

```
cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
```


+ リポジトリ追加

```
yum install -y https://centos7.iuscommunity.org/ius-release.rpm
```

/etc/yum.repos.d 下に `ius.repo` などのリポジトリが追加されます。



+ Python3のパッケージを検索します、結果ある数字大きいほうをご利用ください。

```
yum search python36
```
 
+ インストール 

```
yum install -y python36u python36u-libs python36u-devel python36u-pip
```

+ 確認

```
python3.6 --version
Python 3.6.7


 which python3.6
/usr/bin/python3.6
```

+ pip 確認

```
pip3.6 --version
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)
```
+ pipでパッケージインストール

```
sudo pip3.6 install requests
```

+.pyファイルの一番上に python3.6 明確に指定


```
#!/usr/bin/python3.6
```
【さくらのVPS】wordpressを外部DBから内部DBに切り替えた時の作業メモ

#はじめに

外部DB構築の検証の為に借りていたさくらのVPSのお試し期間が無情に過ぎ去った為、内部DBに切り替えました。その時の作業手順メモです。

```
[DBサーバ]---[Webサーバ]---[インターネット]
⬇︎
[Webサーバ/DBサーバ]---[インターネット]
```

ちなみに外部DB側にDBは作ったものの中身は空だったので、内部DB側もただ新規にDBを作成してwordpressのDB接続エラーを解消しただけの内容です。

#webサーバのあるホストにDBと作業用ユーザを作成

```
$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select user, host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
| root | localhost |
+------+-----------+
3 rows in set (0.01 sec)

MariaDB [(none)]> CREATE DATABASE databasename;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON databasename.* TO "database_username"@"localhost" IDENTIFIED BY "database_userpassword";
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select user, host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
| root | localhost |
| New! | localhost |   ⬅︎New!のとこに作成したusernameが表示されてたらOK
+------+-----------+
4 rows in set (0.00 sec)

MariaDB [(none)]> exit
Bye

```

#wordpressのDBの参照先を変更

```
$ cd /var/www/html
$ ls -la wp-config.php
-r-------- 1 apache apache 3874  5月 11 01:07 wp-config.php
$ sudo chmod 600 wp-config.php 
$ sudo vi wp-config.php
[sudo] username のパスワード:

///

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'database_name');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'database_username');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'database_userpassword');

/** MySQL のホスト名 */
define('DB_HOST', '192.168.0.3');    ⬅︎ローカルIPから"localhost"に書き換え

///

```

#書き換え権限を外す

```
$ sudo chmod 400 wp-config.php 
$ ls -la wp-config.php
-r-------- 1 apache apache 3872  5月 16 19:07 wp-config.php
```

ブラウザでURL叩いてみましょう。

```
http://111.222.333.444/wp-admin/install.php
```

はい、この通り。

![screencapture-160-16-126-146-wp-admin-install-php-2019-05-16-19_20_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391107/f9aa5f24-0ae7-5f64-ecef-bd6bc89adc87.png)

お疲れ様でした。
【学習メモ】MakemigrationsとMigrateについて

#概要
モデルをデータベースに反映するために`migrate`を実行しますが、`makemigrations`があるのを知ったので、少しまとめてみます。

#MakemigrationsとMigrateの違い
- `migrate`はモデルをデータベースに反映させる
- `makemigrations`はマイグレーションファイルを作成する

つまり`migrate`をすることで、データベース構成を変更したり、その変更を取り消したりすることが出来るが、データベース構成のバージョン管理をするのに、`makemigrations`でマイグレーションファイルを作成する。

- 公式からは下記のように記載されています。

>マイグレーション (Migrations) は、Django でモデルに対して行った変更 (フィールドの追加やモデルの削除など) をデータベーススキーマに反映させる方法です。

>マイグレーションというのは、データベーススキーマに対するバージョン管理システムのようなものです。makemigrations はモデルの変更点を1つのマイグレーションファイルにパッケージングし(コミットのようなものです)、migrate はその変更点をデータベースに適用する、というわけです。
引用：https://docs.djangoproject.com/ja/2.2/topics/migrations/

- 図にすると、わかりやすいですね。

![makemigrations_migrate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403981/170b1642-387d-16da-3a1f-5fa2a321f388.png)



#コマンド
実行方法はシンプルで、下記のようになります。

`makemigrations`

```:terminal
$ python manage.py makemigrations
```

`migrate`

```:terminal
$ python manage.py migrate
```

以上
C言語で素因数分解

C言語で素因数分解するプログラムを作ってみました。
#方法
1. ユーザから2以上の整数(num)を入力してもらう
2. 偶数の素数が2のみであることを利用し、numを2で割っていく
3. 2以外の素数は全て奇数なので、入力された整数を3以上 sqrt(num)（2でnumは奇数となっている）以下の奇数で割る

##割る数が、3以上 sqrt(num) 以下である理由
自然数nが素数でないとき、nの素因数をk (k <= sqrt(n)) とすると、必ず sqrt(n) <= n/k となります（等号成立条件は n=k^2）。割る数と商の大小がnの平方根前後で反転することから、平方根以降の数については約数であるかを調べる必要がないのです。
...うーん、上手く説明できない。

#実装例
```soinsu.c
#include <stdio.h>
#include <math.h>

int inputNum(void){
	int num = 0;
	while (1){
		printf("素因数分解したい整数を入力：");
		scanf("%d", &num);
		if (num < 2)
			printf("2以上の整数にしてください\n\n");
		else
			break;
	}
	return num;
}

int findFactors(int num){
	int i, cnt = 0;
	printf("%d =", num);
	while (num % 2 == 0){ // 偶数の素数は2のみ
		cnt += 1;
		num /= 2;
	}
	if (cnt > 1)
		printf(" 2^%d *", cnt);
	else if (cnt == 1)
		printf(" 2 *");
	for (i = 3; i <= sqrt(num); i += 2){ // 他の奇数で割っていく
		cnt = 0;
		while (num % i == 0){
			cnt += 1;
			num /= i;
		}
		if (cnt > 1)
			printf(" %d^%d *", i, cnt);
		else if (cnt == 1)
  			printf(" %d *", i);
	}
	// ここまでで num は1または sqrt(num) 以下で最大の素数
	if (num != 1) printf(" %d *", num); // 後者なら追記
	printf("\b \n");
	return 0;
}

int main(void){
	int num;
	num = inputNum();
	findFactors(num);
	return 0;
}
```

#実行結果

```
素因数分解したい整数を入力：90
90 = 2 * 3^2 * 5

素因数分解したい整数を入力：517
517 = 11 * 47
```
Goでcommandをremote server(Linux)にssh経由で送信

# やりたいこと
```
app := cli.NewApp()
```
のようなものや

```
sshConfig := &ssh.ClientConfig{
	User:            c.String("user"),
	Auth:            auth,
	HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	}
```

といったものを都度都度用意せず、importするだけでssh経由でcommandを送るものを作りたい!!!

# ツール
今回、もともと自分用意作るつもりでしたが、せっかくならばと思い、githubに上げました。

https://github.com/ryojsb/paramigo

# 使い方
READMEに上げているのですが、すごい簡単に使えるようにしました。

## StdinCommand
こちらは標準入力からoption経由でパラメータを指定して実行できます。
書くコードは、たったこれだけです。

```example.go
package main

import (
	"github.com/ryojsb/paramigo"
)

func main() {
	paramigo.StdinCommand()
}
```

あとは、実行する際に以下のようにパラメータを渡してあげるだけです。

```
$ go run exapmle.go -host <IP> -port <port> -u <user> -p <password> -cmd <command>
```

## InnerCommand
こちらは、code内でパラメータを定義してあげて、InnerCommand()関数に渡してあげることで、実行されます。

もともと、自動化を進めていく中で、mdファイルやjsonファイルからパラメータやcommandを読みとり、
あるサーバに対して、commandを自動で投げたい!!って思ったので、pythonのparamikoに似たものを作りたかったわけです。

書くコードは簡単に書くとこんな感じです。

```example.go
package main

import (
	"github.com/ryojsb/paramigo"
)

func main() {
    var host string = "192.198.1.1"
    var port string = "22"
    var u string = "user"
    var p string = "password"
    var cmd string = "ls"
	
    paramigo.InnerCommand(host, port, u, p, cmd)
}
```

あとは、実行するのみです。

```
$ go run exapmle.go
```

# まとめ
初めてツールを作ったので、こうしてほしいとかがありましたら、言っていただけるとすごい勉強になりますので、よろしくお願いいたします。
VB.netプログラマがC#で割り算を行うときに気をつけること。

C#で「商」を求めるには「/」を使いますが、その際に割られる数と割る数をともに整数型にしておく必要があります。逆に、小数が必要な場合には小数型に変換してから割り算を行わなければなりません。

<<商を求める>>

```vb:test.vb
  Dim num as Integer = 0
  num = 50 \ 3   '16が返る
```
```c#:test.cs
  Int num = 0;
  num = 50 / 3   //16が返る
```
<<小数を求める>>

```vb:test.vb
  Dim num as Single = 0
  num = 50 / 3   '16.666...が返る
```
```c#:test.cs
  Single num = 0; 
  num = 50.0 / 3.0;   //16.6666...が返る
```
このアプリケーションのサイド バイ サイド構成が正しくないため

Visual Studio 2013上で、C#の開発をしていた時の事。
開発環境からは動くのに、実行ファイルを動かそうとすると、

このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。詳細については、アプリケーションのイベント ログを参照するか、コマンド ライン ツール sxstrace.exe を使用してください。

のメッセージが出る。

イベントログを見ると、Configファイルがおかしいというメッセージ。
結局、名指しされた行は問題ないのだけど、それに続くコメントの書き方が気に入らなかったらしい。

<-- コメント
　　コメント -->

コメントを削除したら、正常に動作した。
確かにイベントログに出力してくれているけれど、謎のメッセージだわ。

と思ってたら、コメントの書き方が間違っていただけなのでしたという事を、コメントで指摘されたのでした...
うん、なんで気付かなったんだろ。
ABC - 020 - A&B&C

#AtCoder ABC 020 A&B&C
[AtCoder - 020](https://atcoder.jp/contests/abc020)

**2019/05/16** - 問題名追記



#A - クイズ

```java
	private void solveA() {
		int n = nextInt();

		out.println(n == 1 ? "ABC" : "chokudai");
	}
```

#B - 高橋くんと文字列圧縮

```java
	private void solveB() {
		String res = IntStream.range(0, 2).mapToObj(i -> next()).collect(Collectors.joining());

		out.println(Integer.parseInt(res) * 2);
	}
```

#C - 壁抜け：DFS(メモ化再帰)でAC

 想定解法だと以下なんだけど
　1. ワーシャルフロイド/ベルマンフォード/ダイクストラで最短経路計算
　2. 二分探索でtを絞り込んでいく

　最初想定解法と同じように考えたのでワーシャルフロイドで実装したのだけど、sampleとか自分の想定テストケースだと通るのに、実際にジャッジに投げると4分の1ほどがWAになってしまいかつ、WAの理由がわからないのであきらめてDFSで実装。
　どこかで再度想定解法で解かないといけない。
　
　**ワーシャルフロイドの方はマジで誰かソースみてWAになる点教えてほしいWA**

####メモ化再帰で実装したときにはまった備忘（TLE対策）

 - 当たり前の様に行っている実装方法の中に、おもったよりも遅いものがある
    - 最初、ずっとTLEだったのでいくつかコード修正しながら検証していった結果、以下をやめるだけで一気にTLEが解消できた（実際には修正しているうちに戻り値なくしてvoidにしたりもしてるけど。voidにするのも微妙に効果あったりはした）
    
    - Long#min()の利用を止める
        - メモ(dist[][])を更新するときにメモの中身をminで比較するのをやめたら劇的に速度改善した
            - dist[][]の値を更新するときにLong#min()で見ていたのを止めるように（min()しなくても済むように）ソースを修正しただけでTLE解消できた


```java
	private void solveC() {
		int h = nextInt();
		int w = nextInt();
		long t = nextLong();
		char[][] wk = new char[h][w];

		int sX = 0;
		int sY = 0;
		int gX = 0;
		int gY = 0;
		for (int i = 0; i < wk.length; i++) {
			wk[i] = next().toCharArray();
			for (int j = 0; j < wk[i].length; j++) {
				if (wk[i][j] == 'S') {
					sX = i;
					sY = j;
				} else if (wk[i][j] == 'G') {
					gX = i;
					gY = j;
				}
			}
		}
		long low = 1;
		long high = t;
		long[][] memo = new long[h][w];

		while (high - low != 1) {
			long mid = (high + low) / 2;
			for (long[] l : memo) {
				Arrays.fill(l, Long.MAX_VALUE);
			}
			dfsC(wk, h, w, t, sX, sY, mid, 0, memo, new boolean[h][w]);
			if (memo[gX][gY] <= t) {
				low = mid;
			} else {
				high = mid;
			}
		}

		out.println(low);
	}


	static final int[] dx = new int[] { 0, 0, -1, 1 };
	static final int[] dy = new int[] { 1, -1, 0, 0 };

	private void dfsC(char[][] wk, int h, int w, long t, int currentH, int currentW, long x, long val,
			long[][] dist, boolean[][] pass) {

		/*
		 * 検索範囲越え
		 * または
		 * 既に探索済み
		 */
		if (currentH < 0 || currentH >= h || currentW < 0 || currentW >= w || pass[currentH][currentW]) {
			return;
		}

		/*
		 * 現在の値がすでに入っている値より小さいならこれ以上の探索は不要
		 * 現在の値がtを超えているならこれ以上の探索は不要
		 */
		if (dist[currentH][currentW] < val || val > t) {
			return;
		} else {
			/*
			 * 探索対象なので値を更新
			 * 本当はminとしたいけど、minすると間に合わない
			 */
			dist[currentH][currentW] = val;
		}
		/*
		 * Gなので終了
		 */
		if (wk[currentH][currentW] == 'G' || (val > 0 && wk[currentH][currentW] == 'S')) {
			return;
		}
		pass[currentH][currentW] = true;
		/*
		 * 4方向の探索を行う
		 */
		for (int i = 0; i < 4; i++) {
			int wkH = currentH + dx[i];
			int wkW = currentW + dy[i];
			if (wkH < 0 || wkH >= h || wkW < 0 || wkW >= w) {
				continue;
			}
			long currVal = 0;
			switch (wk[wkH][wkW]) {
			case 'S':
			case 'G':
			case '.':
				currVal = 1;
				break;
			case '#':
				currVal = x;
				break;
			default:
				break;
			}

			dfsC(wk, h, w, t, wkH, wkW, x, val + currVal, dist, pass);
		}
		pass[currentH][currentW] = false;
	}

```
独学でプログラミングを始めて一か月の成果

#1.はじめに
　無職になり、プログラミングを学び始めて1か月。
そもそも「プログラミング」って言う単語を聞いても、毛ほどの知識も持ち合わせておらず、
HTMLやJavaScript,RubyやらPHPやら様々な言語が存在することも知らない状態から一人細々とプログラミング学習をマイペースにやってきました。

そんな私が学習開始してから約一か月で作り上げた(すべて何かしらのチュートリアルですが)物と、大まかな学習内容を公開します。(ついでにこう言った記事作成も初めてです。どう書けば良いんだろう…。)

内容としては全く誇れるものでもなく、逆に恥を晒しているレベルのものばかりですが、
これからプログラミングを学ぼうか悩んでいる方や、学び始めた初心者の方に向けて、多少なりとも参考や、モチベーション維持に繋がれば幸いです。

#2.学習時間
######学習期間
2019年4月9日～5月13日現在
(学習に取り掛かることが出来ない日も含む)

######一日当たりの学習時間
約3h/日

######総学習時間
約 100 時間

#3.学習環境
######使用PC
東芝製ノートPC　OS:Windows
######テキストエディター
Atom
######学習言語
HTML CSS JavaScript

#4.主な学習内容
###初めに申し上げておくと、独学でプログラミングを学ぶなら、書籍から入るのはハードルが高いです。
書籍は著者によってプログラミングの書き方も多少変わってきますし、初見のコードが突如現れます。
これに何度も翻弄され、その度に一旦手を止めてググる作業を繰り返すことに。(そして調べ終わった頃には途中経過が頭から全部抜けちゃっててまた1から確認しなおし…)
おススメなのは一つのサービスのweb教材(個人的おススメは下記のProgateかTechAcademy)でまずはじっくり学んでから、
ほかの教材に手を伸ばす方が挫折しにくいかと思います。
では、以下が主に利用した教材です。

1. 書籍
 1. ゼロからわかる　JavaScript超入門　たのしいプログラミング　(河西朝雄　著)
 1. 高校生からはじめるプログラミング　(吉村総一郎　著)
 1. できるキッズ　子供と学ぶJavaScriptプログラミング入門　(大澤文孝＆できるシリーズ編集部　著)　←現在学習中　(追記：結構誤記が多いので注意する必要があります)
1. web教材
 1. Progate　(有料版)
 1. ドットインストール　(無料の範囲)
 1. TechAcademy　(無料視聴できるyoutube動画)

####やってないけど学習しておけばよかった(利用すればよかった)と思ったもの・サービス
- Progate　(jQuery学習)←容易に動きを持たせることが出来て楽しい

#5.チュートリアルで製作したアプリ　(作成順)
お題通り、学習教材のチュートリアルで製作したアプリの紹介です。

- カードめくりくじ　(ドットインストール)

 
![kuji.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415956/c1c05633-c943-247c-809e-d0c930a3671d.jpeg)
5枚(何枚でも可能だが)の中にランダムで一枚だけ当たりが混ざっているカードめくりゲーム
個人的には最初にこのアプリを作ったことで、コーディングよりもGitHubへのアップロード方法が少し身に付きました。
まずは、どんなものでもいいから作ってみて、それを実際にweb上にあげてみると言う作業を是非行うべきだと思いました。

---

- おみくじ　(ドットインストール)

![omikuji.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415956/1f007423-e691-b830-99c2-625e7110f673.jpeg)
カードめくりと同様にランダム要素を使ってよくあるおみくじを製作。
EventListenerでおみくじマークをクリックした時だけポチッと押したような動きを持たせていました。

---

- パスワードジェネレーター　(ドットインストール)

![PWGenerator.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415956/37178232-ea8e-3045-516e-caed6914d8ed.jpeg)
Options内のinput要素をいくつか利用しました。
今まで当たり前のように利用していたチェックボックスやラジオはこんなに大変なものだったのかと実感。

---

- 割り勘電卓　(ドットインストール)

![warikan.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415956/cf8f9108-c328-25c2-a5c1-556e9c55620d.jpeg)
プログラミングと言うのは数学と英語に多少は強くないとハードルが高いと実感したアプリでした。(私はボロボロ)
正規表現を使って金額や人数が正しく入力されているか確認する仕様や、リセットボタンの設置と方法を学びました。
この正規表現というのは個人的にかなり理解が困難です。未だに理解が追い付かないし、種類も多いです。

---

- 性格診断　(高校生からはじめるプログラミング)

![shindan.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415956/5c4420ce-b51c-8b2f-1e84-d6fe59015d56.jpeg)
チュートリアルの性格診断にこれまでに学習したチェックボックス要素やフィールドを少し足したようなもの。
今じゃ当たり前のように見かけるツイッター連動ボタンの実装。オブジェクトもこれまで以上に使用しました。

#6.おわりに
　以上が私がJavaScriptを学び始めてから約1か月の進捗となっております。
あくまで私と言う一個人が独学でマイペースに学習した内容です。
元々あまり物覚えが良い方では無かった(中学等の成績では下から数えた方が圧倒的に早い)ので、一般的な方々であれば100時間学習すればもっと成果があるかもしれません。
価格は徐々に上がってきていますが、プログラミングスクールに通えば更に学習速度は上がる事でしょう。
今後も引き続きJavaScriptを学習していきたいと思います。３歩進んで２.９歩下がる貧弱脳で頑張りますので、同じような初心者の方や、これから学習を始めようとしている方、一緒に頑張りましょう！
PostgreSQLでINDEXをテーブルロックしないで作りなおす

PostgreSQLの`REINDEX`では実行中にテーブルロックが発生します。これを回避するには、`CREATE INDEX`に`CONCURRENTLY`を指定します。また、この操作はShareLockを取得するので同じテーブルに対して同時に実行するとDeadLockとなるので注意が必要。

## 一時インデックスを作成

```
CREATE INDEX CONCURRENTLY idx_new ON tbl (i);
```

## 古いインデックスを捨てる

```
DROP INDEX idx_old
```
パイプを使うとリターンコードが0になってしまう

✕~~aws cliでjqを使うとリターンコードが0になってしまう~~
〇パイプを使うとリターンコードが0になってしまう

~~タイトル通りなのですが、コマンド実行結果によって分岐したい場面で、jqを使うとリターンコードが0になってしまいます。~~

~~**<font color="Red">結論から言うと--queryオプションを使うとよいです。</font>**~~

******2019/5/22追記******
jqがどうとかではなく、パイプを使用した場合は一番最後（一番右側）の処理のリターンコードが$?に格納されることが原因でした（無知でした）。そして、
**<font color="Red">$PIPESTATUSを使用することで解消できる</font>**と教えていただきました。
ありがとうございます。。



例えばrdsインスタンスのパラメーターグループ名を取得するのに~~jq~~パイプを使った場合、
下記のとおりエラーにも関わらずリターンコードが0になっています。

-------------------------------------------------------------------
〇成功時

```
$ aws rds describe-db-instances --db-instance-identifier hogeDB |jq 
"hogeDB-myrdsparamgroup-xxxxxx"
$
$ echo $?
0
```


✕失敗時

```
$ aws rds describe-db-instances --db-instance-identifier hogDB |jq '.DBInstances[].DBParameterGroups[].DBParameterGroupName'
An error occurred (DBInstanceNotFound) when calling the DescribeDBInstances operation: hogDB  not found.
$
$ echo $?
0  ← 失敗なのにリターンコードが0
```
---------------------------------------------------------------------

$PIPESTATUSですと、パイプで区切られた処理ごとにリターンコードを配列で保持しますので、

✕失敗時

```
$ aws rds describe-db-instances --db-instance-identifier hogDB |jq '.DBInstances[].DBParameterGroups[].DBParameterGroupName'
An error occurred (DBInstanceNotFound) when calling the DescribeDBInstances operation: hogDB  not found.
$
$ echo "${PIPESTATUS[0]}"
255  ← うまくリターンコードが取得できました
```

---------------------------------------------------------------------
$PIPESTATUSはLinux環境で使用できるものなので、Windows環境でしか作業できない場合は、
AWS CLIの--query オプションを使用するなど工夫する必要がありそうです。

ちなみに出力結果のダブルクォートを取りたいとき、jqだと-rオプションをつけますが、
--query　オプションの場合、併せて--output text オプションをつけることで実現可能です。



```
$ aws rds describe-db-instances --db-instance-identifier hogeDB |jq -r '.DBInstances[].DBParameterGroups[].DBParameterGroupName'
hogeDB-myrdsparamgroup-xxxxxx
$
$
$ aws rds describe-db-instances --db-instance-identifier hogeDB --query "DBInstances[].DBParameterGroups[].DBParameterGroupName" --output text
hogeDB-myrdsparamgroup-xxxxxx
```
tsv形式とcsv形式のファイルを相互変換

# はじめに
tsvファイル、またはcsvファイルを変換スクリプトファイルにドラッグ&ドロップで相互変換するプログラム

何番煎じかっていう＆ゆくゆくは死に言語であるvbsのため、完全に自分用メモ

# 使い方
1.以下のスクリプトを保存し、拡張子をvbsにする
2.変換したいファイルをドラッグ&ドロップ（複数ファイルの一括ドロップ可）
3.同一ディレクトリに変換後のファイルが出力される

```VBScript
Option Explicit
'*******************************************************************************
'CSV TSV_converter.vbs
'  tsv(タブ区切り)形式とcsv(カンマ区切り)形式を相互変換
'  INPUT : 変換元ファイル(複数可)
'  OUTPUT: 変換元ファイル名.tsv、または変換元ファイル名.csv
'*******************************************************************************

Dim objFSO                        'As Object
Dim objArg                        'As Object
Dim objInput                      'As Object
Dim objOutput                     'As Object
Dim strLine                       'As String
Dim i                             'As int
Dim pathName, fileName, fileExt   'As String
Dim cnvExt, chrBefore, chrAfter   'As String

Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")
Set objArg = Wscript.Arguments

For i = 0 To objArg.Count - 1
  Set objInput = objFSO.OpenTextFile(objArg(i), 1)                                 'ForReading
  pathName = objFSO.GetFile(objArg(i)).ParentFolder
  fileName = objFSO.GetBaseName(objArg(i))
  fileExt = objFSO.GetExtensionName(objArg(i))

  '拡張子を判定し、区切り文字を指定
  If fileExt = "csv" Then
    cnvExt =".tsv"
    chrBefore = Chr(44)
    chrAfter = Chr(9)
  ElseIf fileExt = "tsv" Then
    cnvExt =".csv"
    chrBefore = Chr(9)
    chrAfter = Chr(44)
  End If

  Set objOutput = objFSO.OpenTextFile(pathName & "\" & fileName & cnvExt, 2, True) 'ForWriting
  Do Until objInput.AtEndOfStream
    strLine = Replace(objInput.ReadLine, chrBefore, chrAfter)
    objOutput.WriteLine (strLine)
  Loop
  objInput.Close
  objOutput.Close
Next 'i

Set objFSO = Nothing
Set objArg = Nothing

Wscript.Quit (0)
```
Slackチャネルにアイコンがほしい

## Slackのチャンネルが見つけづらくなってきた
最近ワークスペース内のチャネルが増えてきて、自分の見たいチャネルがすぐに見つからなくなってきました。
ショートカットでチャネル見つければ？という意見はもっともですが、[ガイドライン](https://get.slack.help/hc/ja/articles/217626408-チャンネル名のガイドラインを作成する#prefixes)に沿ってプレフィクスをつけたチャネル名だと、それもなかなかツラいものがあります。
プレフィクスが英字でその他の部分が漢字、とかありますしね・・・。

## じゃあチャネルにアイコンがついていたら見つけやすいのでは？
と思って作ったものがこちらです。
GitHub: https://github.com/tomoki1207/Slicon

Firefox： https://addons.mozilla.org/en-US/firefox/addon/slicon/
Chrome: https://chrome.google.com/webstore/detail/slicon/ngpdjiifhboeigkafinflcicbekcggao

<img width="1280" alt="スクリーンショット 2019-05-22 23.25.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111100/2b800844-5240-8fa6-a081-64019e62b00c.png">

## 設定方法
各チャネルのpurposeに `__icon[http://example.com/image.png]` のような行を追加すると、設定したURLの画像がチャネルのアイコンとして設定されます。
この設定がない場合は、チャネル名から作成したIdeniticon(GitHubのアバター風アイコン)が設定されます。
DMではユーザのアバターがアイコンとして設定されます。

アイコンはSlack上の情報のみを利用して設定されるので、この拡張機能をいれた他のユーザからも同様のアイコンが設定されて見えるはずです。

## 注意
+ アドオン追加時と更新後に一度全アイコンが消えた場合は画面をリロードしてください。

---
PR/Issue お待ちしています
Angularでtextareaの改行\nを超簡単に`<br>`にして表示する

# Angularでtextareaの改行\nを超簡単に`<br>`にして表示する


検索すると変換処理コードを書いてそれをHTML側でng-bindするとかなんとか…

そーんな面倒なことしなくても良いはずとわたしの勘が叫ぶ。

<br>

やはり簡単でした。の備忘録


### リプロ
textareaに入力した文章を表示するHTML側で、

```html
<div class="showbox">{{ message }}</div>
```

```css
.show-box {
    border: 1px solid red;
    width: 500px;
    min-height: 100px;
    margin: 5px 0 20px;
    word-break: break-all;
  }
```

だと、こうなる。

![1557810554964.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/b8d251f4-ba76-c138-7493-82ee60b6c835.png)


<br>
### 解決方法

CSSに**pre-wrap**をつけるだけ。


```html
<div class="show-box pre-wrap">{{ message }}</div>
```

```css
.show-box {
    border: 1px solid red;
    width: 500px;
    min-height: 100px;
    margin: 5px 0 20px;
    word-break: break-all;
  }

.pre-wrap {
    white-space: pre-wrap;
}
```
![1557810622229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/e618eab3-5211-b1d7-3efa-39bd3a273980.png)



以上

<br>
参考：[AngularJSで改行を含むテキストを超簡単にng-bindする](http://yoshiko.hatenablog.jp/entry/2015/02/26/AngularJSで改行を含むテキストを超簡単にng-bindする)
.gitignoreしたファイルをレポジトリから削除する方法

# はじめに

はじめまして株式会社ナイトレイの渡辺です。
この記事では「.gitignoreしたファイルをリポジトリから削除する方法」をまとめます。具体的には、git管理対象から外したファイルやディレクトリをインデックス環境から削除して、レポジトリからも削除する方法です。

# .gitignoreしてもファイルは消えない
　開発途中で.gitignoreを設定しても、今までgit管理下に置かれていたファイルやディレクトリは消えません。なので、過去にアップロードした画像ファイルなどはレポジトリに残っています。
今回はそれらをレポジトリから消し去り、今後のgit管理対象からも外していきます。

※ git知識の確認は[こちらをどうぞ](https://backlog.com/ja/git-tutorial/intro/01/)

# インデックス環境からファイルを消す

```bash:実行例
・ファイルをインデックス環境から削除
$ git rm --cached ファイル名

・ディレクトリごとインデックス環境から削除
$ git rm --cached -r ディレクトリ名
```

```bash:結果(public/uploadsディレクトリごと削除した場合) 
　　　deleted:　public/uploads/~~
```
　これで、インデックス環境から完全に消し去りました。
そして、この結果を`commit`し、リモートレポジトリに`push`します。
すると、今まで消したかったファイルが、リモートレポジトリからも消すことができます。

# 結果
　開発途中で.gitignoreを設定した場合でも、レポジトリ内にはgit管理対象から外したファイルやディレクトリが残っています。（今まで管理していたわけですから。）
それらをインデックス環境から削除することで、レポジトリ内にある今回ignoreしたファイルやディレクトリも削除できました。

# ※補足
　今回、レポジトリ内にあるignoreしたファイルやディレクトリを削除したとしても、コミット履歴をたどることで削除したファイルを閲覧することができます。
なので、画像アップロードをテストする際など、不適切な画像をignoreせずコミットしないようにしましょう。
結論、gitignoreはignoreするべき時にしましょう。

# 最後に
私たちの会社、ナイトレイでは一緒に自社開発のWebサービスを盛り上げてくれるエンジニアメンバーを募集しています！ 
基本的には直接ユーザーと接することのないポジションですが、セールス部門から
「顧客の声」を教えてもらったり、希望すればユーザーとのMTGに参加することも可能です。
モチベーションの高め方はあなた次第。

このような方は是非Wantedlyからお気軽にご連絡ください（もしくはこちらまで recruit@nightley.jp ）

 ✔︎ 自社Webサービスの開発で事業の発展に携わってみたい
 ✔︎ 自分が開発したサービスで地域活性化に貢献したい
 ✔︎ 位置情報ビッグデータに興味があり、新しい活用方法を提案したい
 ✔︎ 地理や地図が好きで仕事中も眺めていたい 

一つでも当てはまる方は是非こちらの記事をご覧ください 

https://www.wantedly.com/projects/467606 

▼ナイトレイとは？

https://www.wantedly.com/companies/nightley


# 参考リンク
+ [gitの基礎知識](https://backlog.com/ja/git-tutorial/intro/01/)
+ https://qiita.com/ytkt/items/a2afd6be8e4f06c1ea25
+ https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0#rm
S3署名方式をSigV2からSigV4に

2019年6月24日にS3への署名方式をSigV4にしていないと、アクセスできなくなるというまずい状況になるため、早急にアップデートしたときのメモ

AWS CLIとpythonのboto3使っていたので、boto3もアップグレード

# アップデート前環境
・python 2.7.12
・Amazon Linux AMI release 2016.09

-root
boto (2.42.0)
boto3 (1.4.0)
botocore (1.4.81)

-vertualenv
boto (2.42.0)
boto3 (1.4.0)
botocore (1.4.81)


・aws cli
aws-cli/1.11.17 Python/2.7.12 Linux/4.4.30-32.54.amzn1.x86_64 botocore/1.4.74


# アップデート
適宜バージョン指定を変えて実施する

・アップデートコマンド

```
pip install --upgrade awscli==1.16.137
pip install --upgrade boto3==1.9.127
```

・ダウングレードコマンド

```
pip uninstall awscli
pip uninstall boto3
pip install awscli==1.11.17
pip install boto3==1.4.0
```


・確認コマンド

```
pip list | grep "boto"
aws --version
```

# アップデート後環境

-root
boto (2.42.0)
boto3 (1.9.127)
botocore (1.12.127)

-vertualenv
boto (2.42.0)
boto3 (1.9.127)
botocore (1.12.127)

・aws cli
aws-cli/1.16.137 Python/2.7.12 Linux/4.4.30-32.54.amzn1.x86_64 botocore/1.12.127


これで一見落着！！
Railsチュートリアル後、はじめてのWebアプリ開発（Rails5 + Bootstrap3)【個人開発】

皆さん、ごきげんよう。大池っていいます。
少し前からwebを勉強しはじめて、railsチュートリアルも一通り終わったので
Timesカーシェアみたいなアプリを作り、Herokuにリリースしました。
シェアハウスで実際に使うので、無闇に予約とかしないで下さいね、マジで。

##作ったもの
![20190516_160608.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259510/2f76000e-bb14-d1f3-3363-ef38573f4950.gif)

[AntiTimes](https://antitimes.herokuapp.com/)
[ソースコード](https://github.com/shutooike/antitimes_app)


##仕様
####静的ページ
- ホーム
- ヘルプ
- 使用例

####ユーザー機能
- ログイン
- プロフィール
- ユーザー一覧

####予約機能
- 予約
- 予約一覧 

####データ構造

- User
 
| Column     |  Type   |   
|------------|---------|
| id         | integer |       
| name       | string |    
| room       | integer |      
| license    | boolean |   
| created_at | datetime|    
| updated_at | datetime|
| password_digest | string |
| remember_digest | string |
| admin           | boolean |
| activation_digeset | string|
| activated | boolean |
| activated_at | datetime |
|reset_digeset| string|
|reset_sent_at | datetime |

- Reservations

| Column | Type | 
| ------ | ---- |
| id | integer |
| user_id | integer |
|start_time | datetime |
|end_time | datetime |
|created_at | datetime |
|update_at | datetime |
|use_time | integer|
|category | name |
##技術周り

- Ruby on Rails5
- Bootstrap3
- Gem
    - fullcalender
- Heroku

##お世話になったサイト

- [ミニドット絵メーカー](http://neutralx0.net/dot/)
- [RailsでFullCalendarを使って予定を表示するまで](https://qiita.com/sasasoni/items/fb0bc1644ece888ae1d4)
- [プログラミング初心者が簡単な（架空の）Webシステムを作ってみた](https://qiita.com/hiroshi125/items/cf1a4fa483961cd0bcd8)

##感想
時間が割とかかってしまいましたが、一応使えるものが出来て良かったです。
どんどん機能拡張とリファクタリングするぜ。

##今後の課題

- 予約ページのデフォルト時刻を正しく表示（15分単位）
- イキって英語で作ったので日本語対応
- ~~Rails 5.2~~
- ~~ReservationsControllerにbefore_action追加~~
- ~~全く書いていないテストを書く~~
- リファクタリング
- ~~予約完了メール~~
- ~~プロフィール画像~~
- ~~AdminUserはvalidateをスキップ(ReservationModel)~~
- ~~料金の表示~~
- Information
- ~~favicon~~
- ~~LINEログインの実装~~
- デザインの向上
- 配車機能の追加
swift webkitに関して

初めまして、現在日本で留学している学生です。

最近swiftを勉強しているんですが、分からないことがありまして質問します。よろしくお願い致します。

他の .swiftファイルにあるURLを下の写真のところから使いたくてコードを書きましたが、最初開いた時はちゃんとWeb siteが開けるんですが、２番目からはひらけない状態です。

ご意見頂ければと思います。

下手な日本語で申し訳ありませんでした。よろしくお願い致します。

![スクリーンショット 2019-05-16 17.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261851/5845c90f-9c25-3b71-d4f4-f4fa1029fb18.png)
英語(57) BAPI: Business Application Process Interface

BAPI: Business Application Process Interface

業務(business)の適用(application)は、過程(Process)の界面(Interface)を定義すればよいというありがたい教え。

くれぐれも、中身を定義してはいけないという戒め。

処理定義（Process Definition)といって、人のやることを定義する人がいる。

処理定義(Process Definition)が必要なのは、計算機が処理することだけ。

人のやることは定義するのではなく、界面（Interface)だけ決めればよい。

そうでないと、人が考えて、効率的に、改善しながらやるということがなくなってしまう。

RPAを導入する失敗は、やらなくてもいいことまでRobotにやらせようとして無駄な処理をすること。

日本に限らず、欧州でも一緒だということを、
ISO/IEC TR 33014:2013 Information technology -- Process assessment -- Guide for process improvement
のco-editorをしえちたときにおしえてもらいました。

# BPR
Business Process Re-engineering

# BPA
Business Process Automation

# RPA
robotic process automation

## 自己参考(self reference)
英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴(document history)
ver. 0.01 初稿 20190516 午後
ver. 0.02  RPA追記 20230516 夕
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
EC-CUBE翻訳ブロック

EC-CUBEの管理画面から、以下のブロックを挿入すると、Bing翻訳が導入できます。
（Googleウェブサイト翻訳ツールは提供終了のため、代替を探していて、Bing翻訳にたどりつきました）

```html
<div id='MicrosoftTranslatorWidget' class='Dark' style='color:white;background-color:#555555'></div>
<script type='text/javascript'>setTimeout(function()
{var s=document.createElement('script');
s.type='text/javascript';s.charset='UTF-8';
s.src=((location && location.href && location.href.indexOf('https') == 0)?'https://ssl.microsofttranslator.com':'http://www.microsofttranslator.com')+'/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKkd965FeEGM5JtQ**&ctf=False&ui=true&settings=Manual&from=';
var p=document.getElementsByTagName('head')[0]||document.documentElement;p.insertBefore(s,p.firstChild);
},0);
</script>
```
jqを使ってAWS CLIの出力を見やすくしよう

例えばAWS CLIで　RDSインスタンスの一覧を取得したい場合、、、

```
C:\Users\hoge>aws rds describe-db-instances
！！！！！JSONでずらずらと出力される！！！！！
```

見づらいので、jqを使って必要な出力に絞ります。
例）RDS一覧から、DBInstanceIdentifierのみ出力

```
C:\Users\hoge>aws rds describe-db-instances | jq '.DBInstances[].DBInstanceIdentifier'
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Windows cmd shell quoting issues?) at <top-level>, line 1:
'.DBInstances[].DBInstanceIdentifier'
jq: 1 compile error
```
エラーになる。。。

Windowsだとシングルクオートではなくダブルクオートのようです。

```
C:\Users\hoge>aws rds describe-db-instances | jq ".DBInstances[].DBInstanceIdentifier"
"hoge-rds-01"
"hoge-rds-02"
"hoge-rds-03"
"hoge-rds-04"
```

  

また、-rオプションでダブルクオート抜きの出力となります。

```
C:\Users\hoge>aws rds describe-db-instances | jq -r ".DBInstances[].DBInstanceIdentifier"
hoge-rds-01
hoge-rds-02
hoge-rds-03
hoge-rds-04
```


[メモ]Postgresql RDSのログをきれいにみる方法

```
aws rds download-db-log-file-portion --db-instance-identifier hoge-postgresql --log-file-name error/postgres.log | jq -r ".LogFileData"
```
AWS CLI でS3のログをgrepしたい（Windows環境）

S3バケットへのアクセスログを有効にしたものの、ログファイルが細かく分かれてしまい検索が難しい。。。
そこで一括で検索できればよいなと思い、作成しました。

下記を参考にさせていただきました。
こちらはシェルスクリプトでしたが、Windows環境で実行する用にバッチファイルに変換しました。
https://dev.classmethod.jp/cloud/aws/grep-s3-files-by-aws-cli/



```s3loggrep.bat
rem You need to install jq.

rem どのログファイルに文字列がヒットしたか知りたいため、あえてecho on にしています。
rem @echo off


rem AWS CLIのクレデンシャル情報を分けている場合は、プロファイル名を指定します。
rem 分けてなければ"default"でよいです。
set PROF_NAME="default"

rem 検索対象のバケット名を指定します。
set S3_BUCKET=testbacket

rem ログファイルの接頭辞を指定します。
set S3_KEY_PREFEX="testlog"

rem 検索したい文字列を指定します。
set SEARCH_STR="hogehoge"

rem list-objects-v2の出力を、jqを用いることで"Key"のみを抽出し、
rem さらに↑で指定した接頭辞で絞ってテキストファイルに出力します。
aws s3api list-objects-v2 --bucket %S3_BUCKET% --profile %PROF_NAME% |jq -r ".Contents[].Key" |findstr %S3_KEY_PREFEX% > list.txt

rem ログ名の降順でソートして別のテキストファイルに出力します。
sort /r list.txt > list2.txt


rem テキストファイルから順番にKeyを呼び出し、文字列を検索するループ処理です。
for /f %%i in (list2.txt) do (
  aws s3 cp s3://%S3_BUCKET%/%%i - --profile %PROF_NAME% | findstr %SEARCH_STR%
)
```
[Ruby]参照の値渡しと破壊的メソッド

# 困ったこと
困ったことが起こりました。

```ruby:sample.rb
a = "hello"
b = a
c = b.concat(" world")

puts a
puts c
```
```:ターミナル
$ ruby sample.rb
hello world
hello world
```

aは"hello"で、それと同じにしたbに"world"をくっつけたものをcにしたはずなのに、aとcが同じになってしまいました。

a　は　"hello"
c　が　"hello world"
でないと納得いきません。

#それぞれのオブジェクトはどうなっているのか

原因を探るべくobject_idを調べてみました。

```ruby:sample.rb
a = "hello"
puts a.object_id

b = a
puts b.object_id

c = b.concat(" world")
puts c.object_id

puts a
puts c
```
```:ターミナル
$ ruby sample.rb
70135239344220
70135239344220
70135239344220
hello world
hello world
```
なんと、すべて同じobject_idです。
問題の根源はこの辺にありそうです。

# 変数とは
冒頭で困った原因は、変数についての考え方にありました。
そもそも、変数について勘違いしていたようです。

事件はここで起きていました。

```ruby
b = a
```
ここではてっきり、"hello"という文字列が b に代入されたものだと思っておりました。
しかし、代入されたのは……そもそも代入という言葉がよくなく、ここでは

「aはbに値（"hello"）の参照を渡した」

といったぐあいでした。
言い換えると、

「bもaと同じくobject_idが70135239344220である"hello"を参照するようになった」

ということです。
だから a と b のobject_idが同じだったのです。

これが**参照の値渡し**。

変数というものは、値そのものではなく値を参照していただけだったのです。

# 破壊的メソッドとは

破壊的メソッドとは、参照元そのものを変えてしまうメソッドです。
今回でいうとobject_idが70135239344220である"hello"そのものを変えるということです。

今回は、文字列をくっつけるconcatメソッドが破壊的メソッドでした。

 ```ruby:sample.rb
c = b.concat(" world")
```
ここではobject_idが70135239344220である"hello"に"world"をくっつけ、それを c にも参照させています。

よって、いままでの"hello"は"hello world"に変わり、それを a, b, c すべてが参照しているというシチュエーションが出来上がりました。

だから、a と c は共に同じ値だったのです。　

# まとめ
Rubyの変数はほとんどすべてがオブジェクトを参照しており、そのオブジェクトが変わればそれを参照していたすべての変数が変わるということでした。

代入って言葉も、よくある値が箱にはいるようなイメージの説明も、すべてはわかりやすくするためで、実際のところ少し違うんですね。

オブジェクト指向の理解が少しだけ進んだような気がします。
東大松尾研から新たに無償公開されたDeep Learning講座「DL4US」が良い、という話

5/15より東大松尾研究室からDeepLearningエンジニア養成講座「DL4US」の演習コンテンツが無償公開されました。
※講義パートは公開されていない
[DL4USコンテンツ公開ページ](https://weblab.t.u-tokyo.ac.jp/dl4us/)


私は業務でデータ分析に携わっており、sklern等での機械学習には触れたことがありますが
Deep Learningは「いつか勉強しよう...」と思ってできていない状況でした。
※一度Udemyで講座を受講しましたが、挫折しています。

まだDL4USのLesson0,1をやってみただけですが、非常に良いものだと感じたのでシェアしたいと思います！！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160512/3329f9fc-be18-322c-f1ba-80d35eeb7d14.png", width=50%>
# DL4USについて
DL4USの紹介記事から本講座の特徴を引用させていただきます。
>- アプリケーション指向 
- 高度な数学的知識は不要
- 1人1台独立した仮想GPU環境を用意
- 実際にモデルを学習させながら技術を習得
- コードはすべてKeras （TensorFlow）と標準的なライブラリ（Numpy、Scipy、 Scikit-learnなど）で構成

また、本講座の目次は以下の通りです。
> - Lesson 0: 機械学習・Deep Learningのキソ
 機械学習概観
- Lesson 1: 手書き文字認識をしよう
  - Keras入門、MNIST、MLP、前処理、勾配に関するテクニック、過学習に関する手法、Fashion MNIST
- Lesson 2: 畳み込みニューラルネットワーク
  - CNN基礎、Data Augmentation、画像データの正規化、Batch Normalization、Skip Connection
- Lesson 3: 系列データで予測させてみよう
  - RNN、BPTT、Gradient Clipping、LSTM、GRU
- Lesson 4: ニューラル翻訳モデルをつくってみよう
  - 言語モデル、分散表現、Seq2Seq、Keras Functional API、Attention
- Lesson 5: 画像からキャプションを生成してみよう
  - MSCOCO、学習済みモデルの利用、キャプション生成、Attention
- Lesson 6: ニューラルネットに画像を生成させよう
  - 生成モデル入門、GAN、Conditional GAN、VAE
- Lesson 7: ニューラルネットでゲームを攻略するAIをつくろう
  - 強化学習入門、Q学習、DQN、OpenAI Gym、Double DQN、Dueling Network


本講座は「エンジニア向けに実装に重きを置いて、より実践的な内容」になっているとのことで
モデルを作成して実際に動かすところが何度も出てくる内容になっています。

本講座はPythonを使いますが、目次をご覧いただければわかるようにPythonについての解説はありませんので
Pythonをまだ使ったことが無い方は、さらっと文法を確認する必要があります。
Kerasについては基礎的な文法から解説してくれているので、Pythonの基礎文法がわかっていればとりあえず理解できると思います！

# 少しやってみて
とにかく書き方が初学者に優しいです。
「エンジニア向け」と書かれているので、もっととっつきにくいかと思っていましたが
DeepLearningにおいては、全くの初心者が想定されて書かれていると思います。

「講義パートはなく演習パートのみ」とのことでしたが説明が不足しているということはなく､
特に関数の成り立ちや特性、パラメータが毎回しっかり解説されていて
「ここは毎回こう書いてください」という、おまじない的な覚え方にならず非常に良いなと思いました。

個人的に非常によいコンテンツだと思い、引き続き学習していく予定なので
Deep Learningに興味がある方は是非一度覗いてみてください！！
【Unity】AsObservable()メソッドについて【UniRx】

# はじめに
UniRxを用いた開発を行っている時に、`subject.AsObservable()`という形で目にすることが多い`AsObservable()`メソッドの意味を調べてみました。

# 環境
Unity 2019 1.1f1
UniRx 6.2.2

# 結論
いくつかのインターフェースを実装している`subject`を`IObservable`にアップキャストして、`IObservable`以外のインターフェースが持っている処理(OnNextなど)を禁止するためです。

# 実例

```C#
Subject<int> subject = new Subject<int>();

//IObservable<int>にアップキャスト
IObservable<int> stream = subject.AsObservable();

stream.Subscribe(l => Debug.Log(l));

stream.OnNext(1); //エラーになる

subject.OnNext(1); //エラーにならない
```

# 理由
まず`Subject<T>`は

```C#
public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T> { ... }
```
のように、`ISubject<T>`を実装しています。
そしてこの`ISubject<T>`は、

```C#
public interface ISubject<T> : ISubject<T, T>, IObserver<T>, IObservable<T> { ... }
```
のように`IObserver<T>`インターフェースと`IObservable<T>`インターフェースを継承しています。
つまり、`Subject<T>`クラスは`IObserver<T>`インターフェースと`IObservable<T>`インターフェースを実装しています。
また、`AsObservable()`メソッドは、

```C#
public static IObservable<TSource> AsObservable<TSource>(
    this IObservable<TSource> source
)
```
のように`IObservable`インターフェースの拡張メソッドとして定義されていて、`subject`から流れてくる値を`IObservable`型にキャストして返す役割を持ちます。
`IObservable`型にキャストされると、`IObservable`以外のインターフェースの持つメソッド(`OnNext()`や`OnError()`など)が使えなくなります。

# まとめ
- `IObservable`インターフェースを実装している`Subject`型のインスタンスは、`IObservable`の拡張メソッドである`AsObservable()`メソッドを使うことができる。
- `AsObservable()`メソッドは`subject`から流れてきた値を`IObservable`型にキャストして返す処理を行う。

- `AsObservable()`メソッドを使うことによって、元々`IObservable`以外のインターフェースのメソッドを使うこともできた(`Subject`型のインスタンスである)`subject`に、`IObservable`以外のインターフェースのメソッドの使用を禁止させることができる。

# 参考
- [Reactive Extensions再入門 その７「LINQスタイルの拡張メソッド」](https://blog.okazuki.jp/entry/20111110/1320849106)
- [UniRx入門 その1](https://qiita.com/toRisouP/items/2f1643e344c741dd94f8)
- [Observable.AsObservable<TSource> Method](https://docs.microsoft.com/en-us/previous-versions/dotnet/reactive-extensions/hh211761(v%3Dvs.103))
【CraftCMS】共通ファイルにパラメータを渡す

とにかく共通化出来るものはしておきたい
=================

htmlのヘッダとかフッタを共通化して使う時にファイルを分けて
twigでincludeすることはよくやる。
URL直叩きでファイルを開かれないようにするためには
ファイル名に_を付けておく。

```twig:index.html
{% include "_head.html" %} {# _head.htmlの中身が出力される #}
```

これでOK。

_head.htmlは例えばこんな感じ

```twig:_head.html
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
        <meta name="description" content="なんかのページはなんかします。">
        <title>なんかのページ</title>
    </head>
```

ところがこの場合、titleやdescriptionをページ別で切り替えることが出来ない。

とにかく楽したい
=====================
そこで思い出したのが「Smartyのタグに引数を付けてCSSを切り替える」こと
アレは確かタグ内でパラメータ渡してたような〜？

と思ってtwigのリファレンスを見てみたら…ありました。

>Included templates have access to the variables of the active context.
>If you are using the filesystem loader, the templates are looked for in the paths defined by it.
>You can add additional variables by passing them after the with keyword:

```twig:sample.twig
{# template.html will have access to the variables from the current context and the additional ones provided #}
{% include 'template.html' with {'foo': 'bar'} %}

{% set vars = {'foo': 'bar'} %}
{% include 'template.html' with vars %}
```

with付けて変数渡せば良さげなのでマネします。

```twig:index.html
{% 
set head = {
	"title":"test",
	"desc" : "description"
    }
{% include "_head.html" with head %} 
```

```twig:_head.html
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
        <meta name="description" content="{{head.desc}}">
        <title>{{head.title}}</title>
    </head>
```

headが未定義にならないよう

```twig
{% if head is not defined %}
    {% set head = { "title" : "DefaultTitle" , "desc" : "DefaultDescription" }
{% endif %}
```

もし「Descriptionは変えたいがtitleはデフォルトでいい！わざわざ書きとうない！」
という場合は呼び出し元で補完しといたらよいのかなー

```twig
{% if head.title is not defined %}
	{% set head = head|merge({"title":"DefaultTitle"}) %}
{% endif %}
```

配列を追加する場合はmergeを使うんだと

これでOK
Notification Content app extension  にいろんなViewをのっけてみる

この記事は、以下の資料をqiita用の記事にしたものです。
https://speakerdeck.com/satoshin/using-various-views-on-notification-content-app-extension

## はじめに
Notification Content app extension は iOS 10 から導入されました。
NotificationにViewControllerを追加し、様々な情報を表示できるExtensionです。
受信した通知に特定の操作（3D Touchなど）で表示されます。

[WWDC 2018 の What’s New in User Notifications](https://developer.apple.com/videos/play/wwdc2018/710/)で、iOS 12より Notification に追加した ViewController でユーザインタラクションのハンドリングができるようになると発表されました。
操作ができるということで、今回はいろいろなViewをのせてみてどうなるか？を実験してみましたので、紹介します。

Notification Content app extension について知りたい場合は以下の記事が詳しいです。
[【Xcode】Notification Content Extension で Notification のカスタマイズ (iOS12対応版)](https://qiita.com/rc_code/items/cc005d593d184fb262aa)

## 試してみる
### UIStackView
スイッチの個数に応じて、Notification Viewの高さを変えることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46792/8f01c234-ce70-3f89-7038-60f57cffcc1e.png)

### MapView
拡大・縮小、移動なども普通にできました。
ただし、縦方向のスワイプはNotification自体のイベントと被ってしまうので、相性が悪いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46792/bc0199a9-7582-2f6a-d718-1618a8bdee7e.png)

### SKView
2Dゲームなどでおなじみの`SpriteKit`のViewものりました。
こちらも縦方向のスワイプはNotification自体のイベントと被ってしまうので、相性が悪いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46792/5560294d-9c10-a0e3-7432-512d9270b682.png)

### SCNView
3Dゲームなどでおなじみの`SceneKit`のViewものりました。
こちらも縦方向のスワイプはNotification自体のイベントと被ってしまうので、相性が悪いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46792/c1e7d433-0a83-5296-a038-727e5e2f13f4.png)

### InputView
Keyboardのように下からViewを出したい場合は、InputViewにViewを設定します。
InputViewで受け付けたイベントを元にNotification Viewの状態を変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46792/f4bf07aa-8f69-2944-c2fb-ea17fbe79394.png)

### SKView on InputView
Notification ViewにSKViewなどをのせた場合に、縦方向の操作と相性が悪かったため、InputViewにSKViewなどをのせることで操作性を解決できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46792/fe2a7bfd-005d-3f2a-abeb-9b1c6ee0a0eb.png)

## 最後に
結構いろいろなことができそうです。
ただし、Notification Content app extensionはNotificationの主役ではなく、気付かれづらい機能です。使い所に気をつけましょう。

サンプルコード: https://github.com/sato-shin/NotificationContentAppExtensionSample
量子コンピューティングやってみた


# 動機
技術書展で購入した、[高校数学からはじめる量子コンピュータ](https://booth.pm/ja/items/1311149)を読んでなんとなく、イメージはできた気がするので実際に手を動かして理解を深めようと思いました。

# Blueqat
ツールは[Blueqat](https://github.com/Blueqat/Blueqat)を使用します。

## Install
```bash
$ pipenv --python 3.7
$ pipenv install blueqat
```

## 1量子ビット

```python
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1) # 1量子ビットを作成
>>> c.run() # 状態を確認
array([1.+0.j, 0.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 100})
```

ここで状態に着目してみると`array([1.+0.j, 0.+0.j])`と表示されています。
これは下記のベクトルに対応しています。

```math
  {|0〉} := \left(
    \begin{array}{c}
      1 \\
      0 \\
    \end{array}
  \right)
```

```math
1^2 + 0^2 = 1
```

ということで単位ベクトルですね。
また、100回観測した結果`Counter({'0': 100})`と表示されているので、100%の確率で`|0〉`が観測できました。

## Xゲートでビット反転

反転させたビットを確認するためにXゲート（[パウリ行列X](https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A6%E3%83%AA%E8%A1%8C%E5%88%97)）を適用してみます。

```python
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).x[0] # 1量子ビットを作成してXゲートを適用
>>> c.run() # 状態を確認
array([0.+0.j, 1.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'1': 100})
```

ここで状態に着目してみると`array([0.+0.j, 1.+0.j])`と表示されています。
これは下記のベクトルに対応しています。

```math
  {|1〉} := \left(
    \begin{array}{c}
      0 \\
      1 \\
    \end{array}
  \right)
```

```math
0^2 + 1^2 = 1
```

ということで単位ベクトルですね。
また、100回観測した結果`Counter({'1': 100})`と表示されているので、100%の確率で`|1〉`が観測できました。

## Hゲートで重ね合わせ状態
量子ビットの重要な特性である重ね合わせ状態を作るためにHゲート（[アダマール行列](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%80%E3%83%9E%E3%83%BC%E3%83%AB%E8%A1%8C%E5%88%97)）を適用してみます。

```python
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).h[0] # 1量子ビットを作成してHゲートを適用
>>> c.run() # 状態を確認
array([0.70710678+0.j, 0.70710678+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 53, '1': 47})
```

また、数字に着目してみると

```math
\frac{1}{\sqrt{2}} = 0.70710678118
```
なので

```math
(\frac{1}{\sqrt{2}})^2 + (\frac{1}{\sqrt{2}})^2 = 1
```

ということで単位ベクトルですね。
また、100回観測した結果`Counter({'0': 53, '1': 47})`と表示されているので、ほぼ50%の確率で`|0〉`または`|1〉`が観測できました。

また、可逆性も確認してみます。

```python
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).h[0].h[0] # 1量子ビットを作成してHゲートを2回適用
>>> c.run() # 状態を確認
array([1.+0.j, 0.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 100})
```

元に戻ってますね！

## Zゲート
Zゲート（[パウリ行列Z](https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A6%E3%83%AA%E8%A1%8C%E5%88%97)）も確認してみます。

```python
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).z[0] # 1量子ビットを作成してZゲートを適用
>>> c.run() # 状態を確認
array([ 1.+0.j, -0.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 100})
```

観測結果は適用前と変わりませんが、符号が反転していますね。

# まとめ
次は実際に量子回路を組み立てることで理解を深めたいと思います。
子供の安全



子供の安全を確保するためには、大人視点では不十分である。
子供に、危ないこと、怖いこと、嫌なことを無理やり教えようとしたり、考えさせようとしても失敗することがあると聞いている。
まず、楽しいこと、嬉しいこと、面白いことを考えられるようになり、いろいろ自信がついてきたら、ちょっと逆を考えてみるというのはいいかもしれない。
JIS Z 8050:2016(ISO/IEC Guide 50:2014) 安全側面－安全側面－規格及びその他の仕様書における子どもの安全の指針
https://kikakurui.com/z8/Z8050-2016-01.html
それまでながらくJISを発行してこなかった仕様書における子どもの安全の指針が2014年に
ISO/IEC GUIDE 50:1987
ISO/IEC GUIDE 50:2002
もJISにならなかった。三度目の正直である。

似た状況がIEC HAZOPでもある。
IEC 61882:2001
IEC 61882:2016
どちらもJISになっていない。


p.s.
Qiitaのシステムの不調により、
不具合対処報告(案)は、
https://researchmap.jp/jou1mevs4-50024/#_50024
にひっこさせていただきました。
高階関数（map, filter, reduce）

##はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている松井です。
ハッカーランクで高階関数が出てきたため調べました。
＊プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

##高階関数とは
[@may88seiji](https://qiita.com/may88seiji)さんの[JavaScript 高階関数を説明するよ](https://qiita.com/may88seiji/items/8f7e42353b6904af5e9a)に**「関数を引数、戻り値として扱う関数」**とありました。
この言葉が1番わかりやすかったため、引用させてもらいました。

高階関数を使うことで変数や定数だけでなく、関数も引数として使えます。

##高階関数（map, filter, reduce）について
###1.map()
``map()``は``map(func, iterator)``の形で使います。

各要素の絶対値を計算する処理を書きます。



```
numbers = [-8, 5, -1, 4, -9, 2]

print(list(map(abs, numbers)))
#[8, 5, 1, 4, 9, 2]
```
簡単な処理でないため、あまり役に立っているように見えませんが、
複雑な処理になると、非常に便利だそうです。

###2.filter()
``filter()``はリストやタプルの要素の中で関数を適用させた後、
``True``となるものだけイテレーターをして返します。

絶対値が3より大きい要素だけ返す処理を書きます。

```
numbers = [-8, 5, -1, 4, -9, 2]

print(list(filter(lambda x: abs(x) > 3, numbers)))
#[-8, 5, 4, -9]
```
ここで使った[無名関数lambda](https://note.nkmk.me/python-lambda-usage/)はこちらを参照してください。
ここでの``lambda``は「絶対値が3より大きいときTrueを返す」関数です。

###3.reduce()

``reduce()``はリストやタプルの要素を四則演算する関数です。

全ての要素を足し合わせる処理を書きます。

```
from operator import add
from functools import reduce

numbers = [-8, 5, -1, 4, -9, 2]
print(reduce(add, numbers))
# -7
```

``add``はpythonの演算子の「＋」と同じ処理を行う関数です。
「＋」は``reduce()``に渡せないため、``add``を使いました。
``reduce()``はpython3では``import``で持ってくることが必要です。
Amazon Lightsail データベースのタイムゾーンを変更

## はじめに
Amazon Lightsailにて、EC2エクスポート機能が実装されていたので一先ず、軽めのサイトをAmazon Lightsailで構築してみた。
その際に、DBのタイムゾーンの設定を行う必要があり少し戸惑ったのでメモ。

以下のコマンドを使用する。
`aws lightsail update-relational-database-parameters`

time_zone を "Asia/Tokyo" に変更する場合は以下の設定内容となります。
`parameterName=time_zone,parameterValue=Asia/Tokyo`

### 変更コマンド
```bash
aws lightsail update-relational-database-parameters --relational-database-name [DB Name] --parameters "parameterName=time_zone,parameterValue=Asia/Tokyo,applyMethod=immediate
```

##### 参考URL
- [1] update-relational-database-parameters
https://docs.aws.amazon.com/cli/latest/reference/lightsail/update-relational-database-parameters.html

- [2] get-relational-database-parameters
https://docs.aws.amazon.com/cli/latest/reference/lightsail/get-relational-database-parameters.html