OmniAICreator/Qiita-1.07M huggingface dataset:
AWS RDSへのデータインポート

今回は、前回作成したAWS上のRDSにCSVデータのインポートを行った際の手順を以下に記載します。

## 前提
・前回作成したEC2インスタンスとRDSが起動されていること
・RDBにインポートしたいCSVファイルを作成されていること（**※文字コードはUTF8であること**)

## CSVファイルをEC2に転送
① 前回作成したEC2インスタンスのパブリックIPアドレスをコピーしておきます。
![EC2インスタンス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/dadd6b6e-3783-af52-9b2c-beb977298b1b.png)
② 次に、rLoginで接続情報の設定を行い、EC2に接続します。（ここでは、rLoginを使用していますが、Tera Term等の他のターミナルソフトでも構いません。）
![rLoginサーバ設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/5323e84f-4794-73fd-ed24-5ae502ad8370.png)
![rLoginクリップボード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/6d0947d3-9630-1bea-4730-5119cd44d08a.png)
③ EC2インスタンスに接続できたら、CSVファイルを格納するディレクトリを作成します。また、作成したディレクトリに移動します。

```
$ pwd
/home/ubuntu
$ mkdir csv
$ cd csv
/home/ubuntu/csv
```
④ rLoginのツールバーにある`「転送」`ボタンを押下します。
![転送ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/9eaf7aba-a6dd-2c96-bf0f-da01dd2df14c.png)
⑤ 転送ダイアログが表示されますので、対象ファイルをドラッグして転送します。
![転送ダイアログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/e3cfe541-3085-d281-2185-881e1af32e3a.png)
![転送矢印](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/9cc2d8fd-ade2-e8f6-cde0-cf10bd76c136.png)
![image-20200813160731100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/f5188ebf-84c8-49fd-07d0-d7ac700f04c3.png)
⑥ EC2インスタンスにCSVファイルが転送されたことを確認します。
![転送確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/90b64ec7-d16d-15a6-58c4-70221aaae4e0.png)
以上で、EC2インスタンスへのCSVファイルの転送は終了です。

## EC2インスタンスにMySQLクライアントをインストールし、RDSのMySQLデータベースに接続
① 以下のコマンドでMySQLクライアントをEC2インスタンスにインストールします。

```
$ sudo apt install mysql-client-core-5.7
```
インストール時に、"E:Unable to correct problems, you have held broken packages. "というエラーメッセージが表示された場合は、以下のコマンドを実行後、再度インストールを実行してください。

```
$ sudo apt-get autoclean
$ sudo apt-get clean all
$ sudo apt-get update
```

② RDSに作成したMySQL DBインスタンスのエンドポイントをコピーします。
![RDSエンドポイント](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/f64a933f-e8b4-f1b0-ee7c-4301fdd9cd58.png)
③ 以下のコマンドでMySQLデータベースに接続します。

```
$ mysql -h RDSエンドポイント -P 3306 -u admin -p
Enter password: RDS作成時のパスワード
```
![DB接続](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/fa5a6aee-d286-e21e-b0ce-d884ed754c3b.png)
以上で、MYSQLデータベースに接続できました。

## データベース、テーブルを作成し、CSVを取り込む
① 以下のコマンドでデータベースを作成し、使用するデータベースを選択します。

```
mysql> CREATE DATABASE データベース名 DEFAULT CHARACTER SET utf8mb4;
mysql> use データベース名;
```
![DB作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/e43f6834-8603-57a0-9cfa-4379ed21b449.png)
② 続いて、テーブルを作成します。
![tbl作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/9011d400-7305-21fe-52ea-4fceb081a942.png)
③ テーブルを作成したら、EC2のCSVフォルダに転送したCSVファイルをMySQLデータベースに取り込みます。

```
$ load data local infile "/home/ubuntu/csv/ファイル名" into table テーブル名 fields terminated by ',';
```
![データロード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691277/fa167599-922e-62c6-a349-02f85d83c5aa.png)
以上で、RDSのMySQL DBインスタンスへのデータインポートが終了です。


株式会社メソドロジック
赤尾　一優　@Kaz_akao
TerminalのControl-Tabの扱い

# TerminalのControl-Tabの扱い

ふと気がついたことだが、gnome-terminalやxtermなどのTerminalは、Control-Tabをforwardしないようだ。 単なるTabにしてしまっている。 そのため、Terminal版EmacsやByobuなどではControl-Tabのキーバインドを使えない。 ByobuにControl-Tabのキーバインドを設定しても動かなかったのはこのためだった。 残念だ。 

参考URL:
https://askubuntu.com/questions/133384/keyboard-shortcut-gnome-terminal-ctrl-tab-and-ctrl-shift-tab-in-12-04

forwardしないものの、gnome-terminal自身はControl-Tabを認識はしており、gnome-terminalの機能を呼び出すためのキーバインドとしてControl-Tabを設定することはできる。 例えば、gnome-terminalのタブを切り替えるキーバインドをControl-Tabに設定することができる。 設定するコマンド例は下記。

```
gsettings set org.gnome.Terminal.Legacy.Keybindings:/org/gnome/terminal/legacy/keybindings/ next-tab '<Primary>Tab'
```
【備忘録】忘れがちなVSCodeのショートカットキー

自分がちょっと忘れがちなVSCodeのショーカットをまとめます。

###### 表記について
* [A] + [B] ：　A、Bキーを同時に入力
* [B] → [B] ：　Aキーを入力後、Bキーを入力


## Markdownのプレビュー

 * プレビューをサイドエディターに表示： `[command] + [k] → [v]`
 * プレビューを同一エディターに表示： `[command] + [shift] → [v]`

いずれのコマンドもmdファイルを開いている状態で入力します。
そのmdファイルのプレビューが表示されます。

## 一括コメントアウト、コメント解除

 * 選択行をコメントアウト: `[command] + [k] → [command] + [c]`
 * 選択行のコメント解除: `[command] + [k] → [command] + [u]`

## コマンドパレッド開く

* `[command] + [shift] + [p]`

あとは好きなコマンドを探して実行するだけです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442969/f3c92718-ec1e-01f9-7a27-81cb2b79b541.png" width=50% >

ちなみに入力フォームの`>`を削除するとコマンド検索ではなく、ファイル検索ができます。
WSL2のターミナルでMacのopenみたいものを定義する

#やりたいこと

Macのターミナルで `open .`ってやるとカレントのディレクトリのパスをFinderで表示したり、`open hoge.png` ってやると画像を見れたりして便利。WSLのターミナル上でも同じことをやりたい。

#やってみた

Powershellは詳しくないのだがコマンドレット`Start-Process`を使えばいい感じにできそう。
WSLからWindowsのプロセスがいい感じに呼び出せるのでPowershell.exeを利用して呼び出せば上手くいった。

私はzsh使っているので`~/.zshrc`から呼び出されるスクリプトに下記を定義しておいた。

```
open() {
	powershell.exe -Command "Start-Process $1"
}
```

WSL上で下記は期待動作。

```
open .
open hogehoge.png
```

#結果
WSL2がとても快適に。

#課題
しかし、~などは使えないみたい・・・ wslpath を使って変換しないと駄目か・・・

```
open ~
Start-Process : このコマンドは、次のエラーのため実行できません: 指定されたファイルが見つかりません。。
発生場所 行:1 文字:1
+ Start-Process /home/hoge
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Start-Process]、InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

```
盤面の情報取得 Python3編（Aランクレベルアップセット）


```python:banmen.rb

h,w,n = [int(i) for i in input().split()]

bord = [list(input()) for i in range(h)]


for i in range(n):
    a,b = [int(i) for i in input().split()]
    print(bord[a][b])
```
AWS EC2 AmazonLinux2 インスタンスの日時を日本に合わせる

# 目的

- AWS EC2 AmazonLinux2のインスタンスにて日時設定を日本に設定する方法をまとめる

# 実施環境

- ハードウェア環境(ssh接続元)

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- EC2インスタンス環境(ssh接続先)

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| インスタンス種類 | AmazonLinux2 | こちらの方法で構築→[AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |

# 前提条件

- 下記、または下記に準ずる方法でAWS EC2 AmazonLinux2インスタンスが作成されてること。
    - [AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042)
- インスタンスに対しssh接続することができること。

# 前提情報

- インスタンス内で保持している現在の日時データは下記コマンドで確認することができる。

    ```terminal
    $ date
    ```

# 読後感

- インスタンスが現在の日本時間を保持する様になる。

# 概要

1. 設定ファイルのバックアップ
1. 設定ファイルの修正とシンボリックリンクの作成
1. cronの時間設定の変更
1. 確認

# 詳細

1. 設定ファイルのバックアップ
    1. 下記コマンドを実行して時刻設定ファイルのバックアップを作成する。

        ```terminal
        $ sudo cp /etc/sysconfig/clock /etc/sysconfig/clock_org
        ```
1. 設定ファイルの修正とシンボリックリンクの作成
    1. 下記コマンドを実行して時刻設定ファイルを開く

        ```terminal
        $ sudo vi /etc/sysconfig/clock
        ```
    1. `ZONE="UTC"`を`#`を用いてコメントアウトし下記の行を追記する。

        ```/etc/sysconfig/clock
        ZONE="Asia/Tokyo"
        ```
    1. 修正後のファイルの内容を下記に記載する。修正後保存して設定ファイルを閉じる。

        ```/etc/sysconfig/clock
        #ZONE="UTC"
        ZONE="Asia/Tokyo"
        UTC=true
        ```
    1. 下記コマンドを実行してシンボリックリンクを作成する。

        ```terminal
        $ sudo ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
        ```
1. cronの時間設定の変更
    1. 下記コマンドを実行してcronを再起動する。
    
        ```terminal
        $ sudo systemctl restart crond.service
        ```
1. 確認
    1. 下記コマンドを実行して設定が反映されていることを確認する。現在の日本の時間が出力されれば作業完了である。

        ```terminal
        $ date
        ```
WordPress と Shibboleth SP を同居させる場合の設定

# 概要

https://example.net/Shibboleth.sso/SAML2/POST に対するアクセスが、WordPress によって横取りされないように、`/var/www/.htaccess` の先頭に近い場所に以下を記述しておくこと。

```conf:/var/www/.htaccess
RewriteCond %{REQUEST_URI} ^/Shibboleth.sso(/|$)
RewriteRule . - [L]
```

# 原因

WordPress では permalink を実現するために、`/var/www/.htaccess` に以下のような設定をしておくことが一般的である。

```conf:/var/www/.htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
```

これは、実在するファイルやディレクトリに対するアクセスでなければ WordPress の `index.php` に処理を依頼するという指定である。

サーバ側設定ファイルで、ScriptAlias ディレクティブや Alias ディレクティブなどを使っている場合は、`/var/www/.htaccess` の RewriteRule ディレクティブの影響を受けない。

```conf:/etc/apache2/sites-available/default-ssl.conf
<Location /shibboleth-sp>
    Allow from all
</Location>
Alias /shibboleth-sp/main.css /usr/share/shibboleth/main.css
```

しかし、Apache2 の shibboleth モジュールが担当している `/Shibboleth.sso/` 以下に対するアクセスは、上記の RewriteRule ディレクティブの影響を受ける[^1]ため、SAML 応答が WordPress に渡されることになってしまう。これは WordPress にとっては理解不能なアクセスであるから、Apache2 の動作ログには、以下のような 404 の記録が残ることになる。

```
192.0.2.20 - - [20/Aug/2020:02:37:36 +0900] "POST /Shibboleth.sso/SAML2/POST HTTP/1.1" 404 13927 "https://idp.example.net/idp/profile/SAML2/Redirect/SSO?SAMLRequest=xxx&RelayState=cookie%yyy" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" -
```

この問題を回避するには、本稿の先頭に書いた通り、回避用の RewriteRule を挿入しておく必要がある。

[^1]: mod_shib モジュールと mod_rewrite モジュールの評価順序を勘違いしていたばかりに、この原因に辿りつくまでに半日かかりました…orz。mod_shib モジュールが mod_rewrite モジュールよりも優先して処理されるわけじゃなかったんですね。`/var/www/.htaccess` が原因だということは、`/var/www/.htaccess` を削除してみると正常動作するので、かなり早くに気付いたのですが、問題は [WordPress のセキュリティ対策プラグイン](https://ja.wordpress.org/plugins/all-in-one-wp-security-and-firewall/)が生成した RewriteRule の大群。初見ではまったく解読できなかったので、他の場所から調べ始めたのが運のつきでした。最終的には RewriteRule を解読するしかなかったものなあ…ああ疲れた。
Swiftでデザインパターン【Façade】

元ネタ → [ochococo/Design-Patterns-In-Swift](https://github.com/ochococo/Design-Patterns-In-Swift#-fa%C3%A7ade)

# クラス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37598/68817302-36fd-0fbe-0715-58076a155ad2.png)

図の引用元：[Wikipedia: Facade パターン](https://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

# 概要
The facade pattern is used to define a simplified interface to a more complex subsystem.
Facadeパターンはより複雑なサブシステムへの簡略化されたインターフェイスを定義するために使用される。
クラス図の`ModuleA,B,C`が**more complex subsystem**に相当する。


# サンプルコード
```swift
// Facade
final class Defaults {

	// ModuleA（ more complex subsystem ）
	private let defaults: UserDefaults
	
	init(defaults: UserDefaults = .standard) {
		self.defaults = defaults
		// 実質.standard以外ないので、initを書かずに以下のようなプロパティを書いても良い気がする。
		// private let defaults: UserDefaults = .standard
	}

	// subscript: instance["hoge"]のような記述ででアクセスできるようになる
	// simplified interface
	subscript(key: String) -> String? {
		// ここのUserDefaultsにアクセスする際の癖をラップして簡略化
		get {
			return defaults.string(forKey: key)
		}	
		set {
			defaults.set(newValue, forKey: key)
		}
	}
}

// usage //

let storage = Defaults()

// Store
// 何かの台詞だろうか。
storage["Bishop"] = "Disconnect me. I’d rather be nothing"

// Read
storage["Bishop"]
```

# クラス図との対応
|  サンプルコード  |  クラス図  |
| ---- | ---- |
|  **Defaults** |  **Facade**  |
|  UserDefaults  |  ModuleA  |



# 考察
UserDefaultへの値の出し入れが少々癖があり**より複雑なシステム**であるところを、`subscript`によって`instance[hoge]`という書式で値の出し入れができる**簡略化されたインタフェース**に置き換えている。
[備忘録] 情報セキュリティについて軽く勉強してみた

## はじめに
この記事は、あくまで自分が情報セキュリティの勉強としてまとめたものです。
ノート代わりに記事書いているだけです。笑笑

## 情報セキュリティ7要素
情報セキュリティ対策として重要な基本要素が7つある。

### 1. 機密性
字の通り、「機密」
むやみやたらに情報を公開しないこと。

**アクセス制限**、**アクセス認証**等で情報が必要な人にのみ公開する。

### 2. 完全性
その情報が本当に正確で完全体なのか。
意図しない所で改ざんや削除されてないか。

**暗号化**、**ログ**等で意図しない情報の改ざんや削除を防止する。

### 3. 可用性
情報が欲しいタイミングで情報を得られるかどうか。

定期的に**バックアップ**を取ることで、サーバ等に何か問題あってもいつでも情報を得ることが可能。

### 4. 真正性
情報を出している組織や媒体の主張通りの情報かどうか。
別の第三者が**なりすまし**て情報を公開していないか。

**デジタル署名**や**二段階認証**、**生体認証**によって、その情報が正規の所から出た情報と証明することで**なりすまし**を防止する。

### 5. 責任追跡性
何か起こった場合、原因を追跡可能かどうか。

**ログ**を管理して、何か起こったら**ログ**等から原因を追跡出来るようにしておく。

### 6. 否認防止性
個人や組織、媒体が行ったことを証明すること。

**5. 責任追跡性**が十分に対策出来ていたら原因が追跡できるため、個人や組織、媒体が行ったことを証明可能。

### 7. 信頼性
バグや不具合がなく、意図する処理や動作を行うことが出来るかどうか。

漏れのない設計や漏れのないテスト、定期的な保守作業を行うことで担保される。

## 情報セキュリティにおける脅威
### 1. 技術的脅威
[マルウェア](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2)、[トロイの木馬](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%AD%E3%82%A4%E3%81%AE%E6%9C%A8%E9%A6%AC_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))、[フィッシング詐欺](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0_(%E8%A9%90%E6%AC%BA))等々....

### 2. 人的脅威
人によるミス(メール誤送信等々...)

### 3. 物理的脅威
地震、火災、洪水等々...

## 脅威に対するリスクマネジメント
### 1. リスク受容
何の対策もせずに**リスクを受け入れる**。

例: 星野みなみちゃんが卒業発表しても、そのまま推し続ける。

### 2. リスク回避
**リスクを無くす**。

例: 星野みなみちゃんが卒業発表したら、完全に他の子に推し変する。

### 3. リスク低減
**リスクを減らす**。

例: 星野みなみちゃんが卒業発表したら、星野みなみちゃんを推しつつ他の子も推す。

### 4. リスク移転
**リスクを他に押し付ける**。

例: 星野みなみちゃんが卒業発表したら、乃木坂推しを辞める。

## おわりに
ネットワーク編
https://qiita.com/N46_myHearter/items/9f1b75d2432063dc11e7

データベース編
https://qiita.com/N46_myHearter/items/ea99005298c742d1934e


みなみちゃんしか勝たん。
pushまでの流れ　git github

#はじめに

人生で初めて記事というものを書いてみる
プログラミング学習を始めたばかりで、githubへのpushにだいぶ苦労したので、
具体的な手順をまとめることにした


#リポジトリの作成
##git init
ターミナルを開いて、任意の名前のディレクトリを作成する。
今回はlessonという名前をつけて、ここにディレクトリを作成する。
git initをタイプしたそのディレクトリで、gitを使えるようになる。


```
$ mkdir lesson
$ cd lesson
$ git init
Initialized empty Git repository in /home/ec2-user/lesson/.git/
ec2-user:~/lesson (master) $ 
```
##git add
次に、ディレクトリにファイルを追加する。
touchはファイルを作るコマンド
今回はlessonというファイルを作成

```
$ touch lesson
```
このままだと、トラッキング状態ではないので、gitで管理できるようにgit addコマンドをタイプする。

```
$ git add トラッキング状態にしたいファイル名
```
なお、ディレクトリ内にある全てのファイルをトラッキング状態にするコマンドもあるよ！

```
$ git add lesson
$ git add . //そのディレクトリないにあるファイル全部をトラッキング状態にする
```

コミットするファイルは事前にトラッキング状態にしておく必要がある。
トラッキング状態にするためにはaddコマンドを
トラッキング状態になったファイルは、一時的にステージング領域っていうなんか異空間的なところに保存される。

##git commit

リモートリポジトリにソースコードを保存するためには、commitと言われる確定作業が必要になるよ！
-m"コミットメッセージ"　メッセージでコミットした理由が他の人にわかるようにしよう

```
$ git commit -m"lesson commit"
```
##git log
コミットしたデータの確認

```
$ git log
commit ×× (HEAD -> master)
Author: ”yuki” <”〇〇.com”>
Date:   Wed Aug 19 23:13:43 2020 +0000

    lesson commit

```

##リポジトリの作成
[githubの操作] 
github上でリモートリポジトリを作成

#push

pushのコマンドは以下の通り

```
$ git remote add origin git@github.com:アカウント名/リポジトリ名.git
$ git push -u origin master
```
今回の場合

```
$ git remote add origin git@github.com:yuktkhs46/lesson.git                                                  
$ git push -u origin master

```
こんな感じの画面がでてきたらOK！
githubのリポジトリを確認してみよう

```
numerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 216 bytes | 216.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:yuktkhs46/lesson.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

```

ちゃんとpushできてるね！

![スクリーンショット 2020-08-20 8.36.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632035/36839973-f06b-5a2f-ce2d-15444512ad84.png)
IBM Cloud: TransitGatewayでVPC-Classic Infrastructure間の接続ができない場合のFAQ

#はじめに
IBM CloudにはTransit GatewayというVPC間およびVPC-Classic Infrastructure間を接続できるサービスがあります。これらのサービスを利用している時にClassic Infrastructureとうまく接続できないという相談を受けることがありますが、そのよくある原因についてまとめておきたいと思います。
公式docsは下記に記載があります。
https://cloud.ibm.com/docs/transit-gateway?topic=transit-gateway-helpful-tips&locale=en
https://cloud.ibm.com/docs/transit-gateway?topic=transit-gateway-faqs-for-transit-gateway&locale=en


#
##1. Classic InfrastructureでVRFが有効になっていない。
Transit Gatewayを利用するためにはVRFを有効にしておく必要があります。[こちら](https://qiita.com/testnin2/items/b3f3a112cb21ad8c07e9)も参考にしてください。

##2. Classic Infrastructureがすでに他のTransit Gatewayで利用されている。
Classic Infrastructureは１つのTransit Gatewayでしか利用できません。

##3. 自アカウントのTransit Gatewayと別アカウントのClassic Infrastructureを接続しようとしている。
自アカウントのTransit Gatewayと接続できるのは自アカウントのClassic Infrastructureのみです。

##4. Classic Infrastructureのサーバーでstatic routeを設定されていない。
Classic InfrastructureのVSIやベアメタルの場合、例えばpublic interfaceを持っているサーバーであれば、デフォルトゲートウェイはInternetに出ていくように構成されています。そのため、VPCが172.16.0.0/16のようなアドレス帯である場合、そのままだとpublic側に通信しようとしてしまいます。VPCへの通信がprivate NWを通るようにClassic Infrastructureのサーバーではstatic routeを構成する必要があります。
（private onlyのサーバーであれば、デフォルトゲートウェイがprivate NWになるように構成された状態でプロビジョニングされているので、追加設定は不要だと思われます）

##5. Classic Infrastructure内に優先ルートのあるサブネットをVPC上に定義し、そのサブネットとClassic Infrastructureに通信しようとしている。

10.0.0.0/14、10.200.0.0/14, 10.198.0.0/15, 10.254.0.0/16および各アカウントごとに割り当てられたサブネットはClassic Infrastructure側に優先ルートが設定されているため、VPC側にこれらのサブネットが存在していてもClassic Infrastructure側のサブネット帯と通信してしまいます。

##6. Classic InfrastructureのSingle Zone Regionに接続しようとしている。
Classic InfrastructureのMZR対応リージョンはTransit Gateway経由でVPCと接続することができます。例えばClassic InfrastrcutreのDAL13にあるサーバーが東京のTransit Gateway経由でVPCと接続することは可能です。しかし、SingaporeやHongKongやSeoulのようなSZRリージョンは、現在Transit Gateway経由でVPCと接続することはできません。こちらは今後改善されていく予定です。

VPC(Tokyo)とClassic Infrastructure(Singapore)をテストしてみたところ、VPC(Tokyo)とClassic Infrastructure(Singapore)へはパケットは到達しているのですが、その逆が届きませんでした。

```
[root@vpc ~]# ping 10.117.8.139
PING 10.117.8.139 (10.117.8.139) 56(84) bytes of data.
^C

[root@classincsng ~]# tcpdump -i any icmp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
18:25:43.634653 IP 172.16.0.4 > 10.117.8.139: ICMP echo request, id 31907, seq 82, length 64
18:25:43.634680 IP 10.117.8.139 > 172.16.0.4: ICMP echo reply, id 31907, seq 82, length 64
18:25:44.634616 IP 172.16.0.4 > 10.117.8.139: ICMP echo request, id 31907, seq 83, length 64
18:25:44.634658 IP 10.117.8.139 > 172.16.0.4: ICMP echo reply, id 31907, seq 83, length 64
18:25:45.634803 IP 172.16.0.4 > 10.117.8.139: ICMP echo request, id 31907, seq 84, length 64
18:25:45.634847 IP 10.117.8.139 > 172.16.0.4: ICMP echo reply, id 31907, seq 84, length 64
18:25:46.634692 IP 172.16.0.4 > 10.117.8.139: ICMP echo request, id 31907, seq 85, length 64
18:25:46.634735 IP 10.117.8.139 > 172.16.0.4: ICMP echo reply, id 31907, seq 85, length 64
```
情弱によるNuxt.jsの内容浅めな覚書

# はじめに
Nuxt.jsで試したことをまとめただけです。
お世辞にも解説とは言えませんのでご了承ください。m(_ _)m

# 環境
Mac OS X Mojave 10.14.6
Node.jsはすでにインストールしてある前提で進みます。

環境構築はこちらの動画で教えてもらいました。オススメです。
https://www.youtube.com/watch?v=7RMkGMCqYgM&list=PLh6V6_7fbbo8koq2fzoz8lN4gqtPC3Yg4

公式もかなり読みやすいです。
https://ja.nuxtjs.org/

一番お世話になったのがこちらです。色々な例があるので掴みやすいと思います。
https://reffect.co.jp/vue/nuxt-js-first-step

エディタはVisual Studio Codeを使っています。

# スタート
## プロジェクトの作成

~~~
$ npx create-nuxt-app <プロジェクト名>
~~~

今回は<プロジェクト名>をsampleにします。
いくつか質問されると思うので、公式に従ってください。
基本デフォルトでOKなのかと思います。
https://ja.nuxtjs.org/guide/installation
プロジェクトが作成されるとsampleというディレクトリができています。
sampleディレクトリに移動しましょう。

~~~
$ ls 
sample
$ cd sample
~~~
プロジェクトは作成した瞬間からローカルできちんと動きます。

~~~
$ npm run dev
~~~

上のコマンドを実行して、http://localhost:3000 にアクセスするとNuxtのロゴがどーんとなっているトップページが出てくると思います。
以下の作業は```npm run dev```を走らせたまま行います。
Nuxtが常に変更を追ってくれているのでとても便利です。

## 新しいページを追加してみる
sample/pages/にabout.vueというファイルを作成します。

~~~vue:/sample/pages/about.vue
<template>
  <div>
    ここはAboutページです。
  </div>
</template>
~~~
保存して、http://localhost:3000/about にアクセスするとAboutページが表示されます。めっちゃ簡単。

## ナビゲーションバーを追加してみる
ナビゲーションバーを作ってページ遷移を楽にしたいと思います。
全ページ共通で表示させたいので、sample/components/にNavBar.vueというファイルを作ります。
/sample/.nuxt/router.jsのroutesという配列にそれぞれのページのpathが記載されているのでそれを参考に以下のように書きます。

~~~vue:/sample/components/NavBar.vue
<template>
  <div>
    <nuxt-link to="/">Top</nuxt-link>
    <nuxt-link to="/about">About</nuxt-link>
  </div>
</template>
~~~

ページレイアウトは/sample/layouts/default.vueで指定できます。

~~~vue:/sample/layouts/default.vue
<template>
  <div>
    <NavBar />  <!-- 追加 -->
    <Nuxt />
  </div>
</template>
~~~

これでTopにもAboutにもナビゲーションバーができると思います。
ちなみにdefault.vueの```<Nuxt />```を消すとナビゲーションバー以外何も表示されなくなってしまいます。

## ボタンを押したら文字が消えたり現れたりする機能
機能というほどのものではありませんが、、
sample/pages/にbutton.vueというファイルを作成します。

~~~vue:/sample/pages/button.vue
<template>
  <div>
    <p><button @click="appearOrDisappear">{{ buttonText }}</button></p>
    <p v-if="visible">見えています</p>
  </div>
</template>

<script>
export default {
  asyncData () {
    return {
      visible: true,
      buttonText: "メッセージを消す"
    }
  },
  methods: {
    appearOrDisappear () {
      const confirmMessage = this.visible ? "メッセージを消しますか？" : "メッセージを出しますか？";
      if (confirm(confirmMessage)) {
        this.visible = this.visible ? false : true;
        this.buttonText = this.visible ? "メッセージを消す" : "メッセージを出す";
      }
    }
  }
}
</script>
~~~
Rustのsoftfloatラッパーライブラリを作った

# はじめに
ちょっと前に「[Rustのsoftfloatライブラリ比較](https://qiita.com/dalance/items/265a0fc7d64388c1db33)」という記事を書きました。その時は「最も高速なsoftfloat-sysにラッパーライブラリを作って使うといいでしょう」という他人事的な結論としましたが、自分で使っていて辛くなってきたのでちゃんとした？ラッパーライブラリを作りました。

# softfloat-wrapper

リポジトリは以下になります。

https://github.com/dalance/softfloat-wrapper

## 使い方

浮動小数点数型として`F16`, `F32`, `F64`, `F128`を提供します。
例えば16bitのビットパターンから`F16`を構成して加算する例は以下のようになります。当然丸めモードを指定可能です。

```rust
let a = 0x1234;
let b = 0x1479;

let a = F16::from_bits(a);
let b = F16::from_bits(b);
let d = a.add(b, RoundingMode::TiesToEven);
```

また、浮動小数点演算を行える型を表す`Float`トレイトを定義しており、全ての浮動小数点数型はこれを実装しています。
そのため以下のようなジェネリックな関数定義が可能です。

```rust
fn rsqrt<T: Float>(x: T) -> T {
    let ret = x.sqrt(RoundingMode::TiesToEven);
    let one = T::from_u8(1, RoundingMode::TiesToEven);
    one.div(ret, RoundingMode::TiesToEven)
}

let a = F16::from_bits(0x1234);
let a = rsqrt(a);
let a = F32::from_bits(0x12345678);
let a = rsqrt(a);
```

また、各浮動小数点数型は`Copy`としているのでプリミティブ型と同じような感覚で扱うことができます。
実際のところ内部データは単なる`u16`, `u32`, `u64`, `u128`なので`Copy`で問題ありません。
WSL1→WSL2の更新がうまくいかず、VERSION 1から変化しない時

# 環境
- Intel CPU
- Windows 10 Pro バージョン 2004
- **WSL1でLinuxディストリビューションインストール済み**

# 事象
Windowsのバージョンを2004に更新
↓
`dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart` 実行、正常終了
↓
`wsl --set-default-version 2` 実行、正常終了
↓

```powershell:PowerShell
> wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Stopped         1
```
コマンドはうまくいってるのに、バージョン1のまま...何故🤔

# 解決方法
WSL1で既にLinuxディストリビューションがインストール済みの場合、WSL2用に変換する必要があります。
参考: [Windows 10ミニTips(478) LinuxディストリビューションをWSL 2用に変換する | マイナビニュース](https://news.mynavi.jp/article/win10tips-478/)

```powershell:PowerShell
> wsl --set-version Ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
> wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Stopped         2
```
やったね！
PHPでDBに接続、CRUDを利用して掲示板を作る②　Readについて

前回（https://qiita.com/progterry/items/2f82b82a5118c16010a0）はPHPでDBに接続、CRUDのCreateの機能を実装するところまでお話をしました。
今回はRead機能について書いていこうと思います。

#そもそもReadとは？
Readとは、掲示板の機能で必須とされるCRUDの中の1つです。
CRUDはそれぞれ、
Create
Read
Update
Delete
の頭文字を取っています。それぞれの単語の具体的な機能に関しては前回の記事を参照。


#実際のコード
```
<?php 
$dsn = 'mysql:dbname=test_bbs2; host=localhost';
$username= 'root';
$password= 'root';
try{
    $dbh = new PDO($dsn, $username, $password);
    echo "接続成功";
    echo "<br>";
} catch(PDOException $e){
    echo "失敗:" . $e->getMessage() . "\n";
    exit();
}

//SELECT文を変数に格納
$sql = "SELECT * FROM contacts";

//SQLステートメントを実行し、結果を変数に格納
$stmt = $dbh->query($sql);

//foreach文で配列の中身を一行ずつ出力
foreach ($stmt as $row){
    echo "名前：" . $row['submit_name'] . ':' . "発言：" . $row['submit_content'];
    echo '<br>';
}
?>
<a href="index.php">トップへ戻る</a>
```

こまかく見ていきましょう。

DB接続までは前回記事と同様のため省略します。
毎回DB接続を行うんだ、ということさえ覚えておいたらいいと思います。

次に、

```
//SELECT文を変数に格納
$sql = "SELECT * FROM contacts";
```
この部分は変数sqlに、データベースのcontactsテーブルから取り出した内容をいれています。
SELECT * FROM contacts
この部分はPHPではなく、SQLの書き方になっているので注意です。
アスタリスク*　マークは、「すべてを」という意味になっています。
このコードは、contactsテーブルから、制限なくすべてのデータを取り出すという意味です。

次に、

```
//SQLステートメントを実行し、結果を変数に格納
$stmt = $dbh->query($sql);
```
この部分をみます。

ここでは右辺の処理を、stmtに代入しています。
CRUD処理を探しているとやたらとこの$stmtが出てきます。stmtはおそらくstatementの略で、よく使われる変数名みたいです。

```
$dbh->query($sql);
```

では、queryで、$sqlの中のSQLを実行し、オブジェクトとして返します。
参考(https://www.php.net/manual/ja/pdo.query.php)

言い換えると、このqueryを行うことでsqlが目的の形になるということです。

最後に、

```
//foreach文で配列の中身を一行ずつ出力
foreach ($stmt as $row){
```

この部分で、出力します。$stmtを$rowにしていますが、$rowの部分の変数名は何でもいいです。その後の部分とつじつまが合えば。


以上、このような形でRead機能が実装できました。
PHPの定数について

# 定数とは
宣言時に決めた値を再定義できない

## PHPで定数を定義する方法２つ
### `define()`で定数を定義する

```php
define('定数名', '値');
```
　PHP7〜 配列定数を定義できるようになった。

```php 
// 定数をクラス外に定義
define('CONSTANT', ['key1' => 'hoge', 'key2' => 'fuga']);
class Sample
{
    function printConst()
    {
        // クラス内から定数にアクセスする場合
        print_r(CONSTANT);
    }
}
$sample = new Sample();
$sample->printConst();                 // CONSTANTが出力される
// クラス外から定数にアクセスする場合（同じ）
print_r(CONSTANT);                     // CONSTANTが出力される
```

### constで定数を定義する

```php
const '定数名' = '値';
```
　
PHP5.3 以上で使える。
PHP7〜 配列定数を定義できるようになった。
`const` はクラス定数を定義できる。

```php
class Sample
{
    // 定数をクラス内に定義
    const CONSTANT = ['key1' => 'hoge', 'key2' => 'fuga'];
    function printConst()
    {
        // クラス内から定数にアクセスする場合
        print_r(self::CONSTANT);
    }
}
$sample = new Sample();
$sample->printConst();          // CONSTANTが出力される
// クラス外から定数にアクセスする場合
print_r(Sample::CONSTANT);      // CONSTANTが出力される
```

## `define()` と `const` の違い
- `define()` は関数なので、`const` の方が高速に処理される。
- `define()` は変数や関数の戻り値を使えて、`const` では使えない。

```php
$func = function(){
    return '定数';
};
define('CONST_DEFINE', $func());
echo CONST_DEFINE;  // 定数が出力される
// 定数式に無効なものが含まれているという以下のエラーで終了する
// Fatal error: Constant expression contains invalid 
const CONST_CONST = $func();
echo CONST_CONST;   
```

- `define()` は `if` 文や `function` の中でも使える。
npmのライブラリの比較と評価方法：npm trends & GitHub

# 人気のあるライブラリをnpm trendsで探す

　**[npm trends](https://www.npmtrends.com/)**は、指定したライブラリのカテゴリと近いものを提示し、選択するとダウンロード数を比較してくれます。
　たとえば、dom parserを比較すると以下の用になります。

[npm trends: dom parserの比較](https://www.npmtrends.com/dom-parser-vs-cheerio-vs-htmlparser2-vs-parse5-vs-scraper-vs-xml2js-vs-xml-js-vs-fast-xml-parser-vs-xml2json-vs-jsdom)

![screencapture-npmtrends-dom-parser-vs-cheerio-vs-htmlparser2-vs-parse5-vs-scraper-vs-xml2js-vs-xml-js-vs-fast-xml-parser-vs-xml2json-vs-jsdom-2020-08-20-07_45_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/9cc39cc3-7130-e676-a43a-bbd399cc94aa.png)

とりあえず、ネットで一つライブラリを探してきて、npm trendsに入れると、候補を提示してくれるので、それでダウンロード数を比較をします。

# npm trendsで提示されたライブラリのGitHub上でのstarチェック

 npm trendsのグラフだけでは、人気を計るのは不十分です。**GitHubのstar**もチェックします。
 例えば、上のdom parserの例だと、parse5が一番多いですが、starの数は、cheerioの方が多いのです。

- parse5 : start 2.5k
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/e587f4f6-8449-bd4f-abc5-302fc535196d.png)

- cheerio：start 22.4k

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/ed154ac1-670b-4a88-a6e5-a6519ec293d1.png)

# Google → npm trends → GitHubの順でライブラリの調査

　タイトルの順番でライブラリを調査すると良さそうなものが見つかるように思います。
　**ネットの情報**はかならず、**「比較」と「評価」が必要**になりますが、npmについてはこういう手順もよいのではと思います。
AWSのARNからアカウントIDを抽出するワンライナー

## 概要
AWSのARNを基に正規表現を使用してアカウントIDを抽出します。
ググっても見つからない＆なんだかんだ使う場面が多いのでメモ

## スクリプト
```shell
echo <ARN> | sed -e 's/^.*::\([0-9]*\).*$/\1/'
```

## 実行結果
```shell
$ echo "arn:aws:iam::123456789012:role/one-liner-role" | sed -e 's/^.*::\([0-9]*\).*$/\1/'
123456789012
```
DRFチュートリアルを終えてみて

## はじめに

チュートリアル各章についてのまとめはこちら

[DRFチュートリアル要旨1](https://qiita.com/shitikakei/items/0515deae9317093606fb)

[DRFチュートリアル要旨2](https://qiita.com/shitikakei/items/816f70309cd8a5125a71)

[DRFチュートリアル要旨3](https://qiita.com/shitikakei/items/6f2ea953f31a599315c1)

[DRFチュートリアル要旨4](https://qiita.com/shitikakei/items/1127c7f3328e14084d29)

[DRFチュートリアル要旨5](https://qiita.com/shitikakei/items/3fd1898d42726734d42a)

[DRFチュートリアル要旨6](https://qiita.com/shitikakei/items/d91d70d1b1255cd26a35)

ここではこれらを踏まえて簡単に思うところをまとめてみました。

チュートリアル終了時点の作業結果は以下のリンクです。
[GitHub](https://github.com/shitikamiyako/DRF-Tutorial)


## DRFをなぜ学習したのか

Reactのチュートリアルを終えてReact+Djangoで少し自分にとっては挑戦的なToDoアプリを作ろうと思い、そうなるとフロントとバックエンドでやり取りをするということはJSONを扱ったり、
そもそも非同期でやりとりをしたくなるだろうと思ったことと、ToDoアプリという仕様上、CRUDが処理の大半になるはずなので、それであるならこれを気にDRFを使ってみようと思ったから。


## DRFで楽になること・やれること

- シリアライズとデシリアライズ(フロントとバックエンドとでデータをやり取りする際に相互にデータ形式を変換する仕組み)の実装
- リクエストの識別、及びメソッドハンドラ(こちらからrequest.POSTなどと定義しなくても、request.dataと定義すればフレームワークがリクエストを識別し、どのHTTPリクエストメソッドを使うか判断する)
- レスポンスハンドラ(リクエストに応じて、フレームワークがデータをjsonで返すかHTMLフォーマットしたものを返すのかなどレスポンスを判断して適切なものを実行してくれる)
- HTTP status codesの明示化
- ブラウザでのAPI挙動の確認(デフォルトはHTMLフォーマット済みで表示) → 明示的にデータ形式を参照する場合は例えばhttp://localhost/snippets.jsonなどと叩くとJSON形式でデータを表示することが可能
- エンティティへのPermissionの作成(例えばToDoは作成したユーザーしか編集削除はできないが、閲覧は全ユーザーができるなど)
- APIルートエンドポイントの作成
- エンティティー間のリレーションの表現の定義(ハイパーリンクされたAPIなど)
- 上記までの項目を簡略化し、ルーティングまでほぼ自動で行ってくれるViewSets

## 完走してみて

学習コストはそこそこ高いと思います。
APIについての理解があるかどうかというのはもちろん、日本語の情報も少なく、それを抜きにしてもDjango特有の抽象化がより強い印象を受ける(特に6章)ので、
自分で公式のドキュメントを適宜参照していかないと理解は難しいと感じました。
かくいう私もまだ半分理解できているかどうかで、あとはとりあえず使いながらより深めていくという感じですね……

## 使う場合の懸念点

- ソーシャルログイン及びTwitterとの連携機能を使うような機能を実装するのでそれに使うdjango-allauthライブラリとの相性問題(普通に使うのにもやや癖があるので）
- APIの理解の不足(API=外部から呼び出せる機能の塊くらいの理解はある、だからTwitterのTLやGoogleMapの地図をサイトに埋め込むことができるわけなので)
- CRUD以外のアクションを少々実装する予定なのでそれがうまく定義できるか。


## 参考

[DRF公式](https://www.django-rest-framework.org/)
[Django REST Frameworkのチュートリアルをやってみた](https://saitosho.me/blog/2020-03-16-about-django-rest-framework-tutorial1/)
[Django REST frameworkで学んだことをまとめてみた](https://qiita.com/breakthrough/items/f845592961d8863a72c5)
ffmpegを用いてlinux版のdavinci resolveで扱うことのできるコーデック(mov)へ複数の動画を一括変換する

# どうでもいい話
ウィンドウズは高いので入れたくないし，macは入りません．
ていうことでubuntuを入れてDaVinci Resolve をインストールしたところ，linux版は対応しているコーデックは少ない！
そこで，対応しているコーデックに動画を変換してやる必要が有るのでffmpegを使うのですが，動画のクリップ一個一個を手動で変換していくのは手間ですよね？
そこでMakefileを用いて自働化してしまいましょう！

# 作業
## ffmpegのインストール
```
$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt install ffmpeg
```

## 対応しているコーデックへの変換
[変換方法のリンク](https://alecaddd.com/davinci-resolve-ffmpeg-cheatsheet-for-linux/)
上記のリンクを参考に変換するためのコマンドを書きます．

```
ffmpeg -i input.mp4 -vcodec dnxhd -acodec pcm_s16le -s 1920x1080 -r 30000/1001 -b:v 36M -pix_fmt yuv422p -f mov output.mov
```
一応これをそれぞれの動画に対して入力，出力を書き換えてやれば変換は済みます．
でもいくつものファイルに対してコマンド叩くのはめんどくさいでしょ？

## Makefileを書く
```
.
├── encode
│   ├── hoge.mov
│   └── fuga,mov
├── Makefile
├── hoge.MOV
└── fuga.MOV
```
下のMakefileは上の構造のような形で使います．


```Makefile
OUTDIR := encoded
SRCS := $(wildcard *.MOV)
TARGET := $(addprefix $(OUTDIR)/,$(patsubst %.MOV,%.mov,$(SRCS)))
$(warning $(TARGET))

CC = ffmpeg
CFLAGS = -i

.PHONY: all clean
all: $(TARGET)

$(OUTDIR)/%.mov: %.MOV
	@if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi
	$(CC) $(CFLAGS) $< -vcodec dnxhd -acodec pcm_s16le -s 1920x1080 -r 30000/1001 -b:v 36M -pix_fmt yuv422p -f mov $@

clean:
	rm -rf $(OUTDIR)

```
とりあえず説明は喫茶店でかきます
TDPC B ゲーム

■問題
Problem Statement
すぬけ君とすめけ君がゲームをしている。最初に、二つの山がある。左の山には A個の物が積まれており、上から i 番目のものの価値はai である。左の山にはB 個の物が積まれており、上からi 番目のものの価値はbi である。すぬけ君とすめけ君は、すぬけ君からはじめて交互に次の操作を繰り返す。両方の山が空であれば、ゲームを終了する。
・片方の山が空であれば、空でないほうの山の一番上のものをとる。
・両方の山が空でなければ、好きなほうの山を選び、一番上のものをとる。
・両者が最善を尽くしたとき、すぬけ君の取るものの価値の合計を求めよ。
https://atcoder.jp/contests/tdpc/tasks/tdpc_game

■ポイント 
・ゲーム結果は山からカードをすべて取り終えた、最終状態で決まる。そのため、最終状態から逆算してスコアが最大になるか、調べていく。
・自分の得点を増やすことと、相手の得点を減らすことは同義。
・相手の得点を最小にすることは、自分の得点を最大にすること、と言い換えることもできる。

```C++
#include <bits/stdc++.h>
using namespace std;


int main() {
    int A,B; cin >> A >> B;
    vector<int> a(A),b(B);
    for(int i=0; i<A; i++) cin >> a[i];
    for(int i=0; i<B; i++) cin >> b[i];

    //dp[i][j] := Aからi個、Bからj個撮った状態から最後までの先行の最適スコア
    vector<vector<int>> dp(A+1,vector<int>(B+1));
    dp[A][B] = 0;

    for(int i=A; i>=0; i--){
        for(int j=B; j>=0; j--){
            if(i == A && j == B) continue;

            //先行の番のとき
            //スコアが最大となるように
            if((i+j)%2 == 0){
                if(i==A)        dp[i][j] = b[j] + dp[i][j+1];
                else if(j == B) dp[i][j] = a[i] + dp[i+1][j];
                else dp[i][j] = max(a[i] + dp[i+1][j],b[j] + dp[i][j+1]);
            }
            //後攻の番の時
            //スコアが最小となるように(自分の番じゃないから点数が入らない)
            else{
                if(i==A)        dp[i][j] = dp[i][j+1];
                else if(j == B) dp[i][j] = dp[i+1][j];
                else dp[i][j] = min(dp[i+1][j],dp[i][j+1]);
            }
        }
    }
    cout << dp[0][0] << endl;
}
```

■参考
https://www.creativ.xyz/tdpc-b-684/
【VBA】3個以上のキーワードでAutoFilterを利用する場合

## 背景
- データ加工の際に、以下の仕様にしたいため、可能かどうか調査。
  - AutoFilterに設定するキーワードを3つ以上にしたい。
  - 設定するキーワードは、シート内に記述して、そこから追加や削除を行えるようにしたい。
  - キーワードは完全一致検索で行う。
- 今回は作業列を利用した配列でのオートフィルター設定を記述。

## 結果
- 以下のようなデータとキーワードが入ったシート2つを用意する。
  - **※指定キーワードの追加や削除をSheet2だけで行えるように、「キーワード数」はcount関数等で取っておく。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/a3c97b89-bc2d-cd13-90a9-8026537bb902.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/8a4ce0bd-1176-640e-5e19-49e16873d4e4.png)

- 以下のVBAを記述する。

```vb
Sub main()
    ' 変数定義
    Dim ws1 As Worksheet, ws2 As Worksheet, targetnumber As Long, targetArray
    Set ws1 = Sheets("Sheet1")
    Set ws2 = Sheets("Sheet2")
    targetnumber = ws2.Range("B2")  ' キーワード数
    ' キーワードの配列変換処理。セル範囲を二次元配列から一次元配列に変換
    targetArray = WorksheetFunction.Transpose(ws2.Range("A2:A" & targetnumber + 1))
    ' オートフィルター処理
    ws1.Range("A1").AutoFilter 2, targetArray, xlFilterValues
End Sub
```

- 上記のmain関数を実行して、以下のような結果になっていれば完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/5ce45b5b-deb8-21f7-9aee-bec51cddf52c.png)


## 参考
- [AutoFilter絞り込み](http://officetanaka.net/excel/vba/tips/tips190.htm)
- [tranpose関数](https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheetfunction.transpose)
vue.js <slot>タグで親からHTMLを受け取る

親からデータを受け取る方法として、`<slot>`タグがある。
親の`<template>`とその変数を受け取ることができる。

#子コンポーネントに`<slot>`を配置する
`<slot></slot>`をテンプレート部に配置する。
これが親から受け取ったデータの受け口になる。

```vuejs:child.vue
<template>
<div>
    <slot></slot>
</div>
</template>
```

#親コンポーネントで送るデータを記述する
子コンポーネントを呼び出すタグの中に送りたいHTMLを記述する。

```vuejs:parent.vue
<template>
<div>
    <Child>
      <!-- 子に送られる内容 -->
      <h1>text</h1>
      <h1>{{number}}</h1>
    </Child>
</div>
</template>

<script>
import Child from "./components/Child"

export default{
  data() {
    return {
      number: 10,
    };
  },
  components: {
    Child
  },
};
</script>
```

表示してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547333/899b1131-46c2-8021-6f83-a149ebdcaf16.png)
子コンポーネントの`<slot>`部が親で記述した内容に置き換わり、表示される。
firebase公式ドキュメント『データベースの構造化』のエッセンス


https://firebase.google.com/docs/database/web/structure-data?hl=ja

![Something went wrong]()
Firebase Realtime Database のデータは JSON オブジェクトとして保存

![Something went wrong]()
つまり、このデータベースはクラウドにホストされた JSON ツリーであると考えることができます。SQL データベースとは異なり、テーブルやレコードはありません


![Something went wrong]()
データベースでは JSON ツリーが使用されていますが、データベースに保存されているデータを、使用可能な JSON 型に対応する特定のネイティブ型で表現することで、より保守しやすいコードを記述できます。
Firebaseのログインアカウントをディレクトリ毎に切り替える、たった一つの賢い方法

# モチベーション

* `firebase-tools`を使うには`firebase login`で事前にログインしておかないといけない
  * デフォルトだと`$HOME/.config`に置かれるので**ログインユーザにつき1つ**しかログインしておけない
* **別のGoogleアカウントを使用する、複数のプロジェクトを行き来するのに都合が悪い**
  * うっかり違うアカウントで`firebase deploy`しても「アカウントが違う」とは教えてくれないので**無駄にハマったりする(1敗)**


# 解決方法
* firebaseコマンドは環境変数`XDG_CONFIG_HOME`で指定されたプロファイルを見に行くのでプロジェクト毎にこれを指定してあげる
* `direnv`を使ってディレクトリ毎に環境変数を設定する

# バージョンとか
* `Mac OSX Catalina 10.15.5`
* `firebase-tools v8.7.0`

# 実践
```bash

$ brew install direnv
...
# direnvのインストールマニュアル見てね

$ cd your-nice-project

# これでこのディレクトリではfirebaseのプロファイルは.config以下になる
$ echo export XDG_CONFIG_HOME=.config >> .envrc

# わすれずに
$ direnv allow

# ブラウザが開くので正しいアカウントを選択
$ firebase login

# なんかできていればOK
$ ls .config

# まぁ.gitignoreに入れておいたほうがいいでしょう
$ echo .config >> .gitignore

# 基本的には.envrcも.gitignoreに入れておいたほうが安心
$ echo .envrc >> .gitignore

# ご安全にデプロイ！ 
$ firebase deploy
```
GoogleForm回答の集計グラフをコピーする方法

注意: 2020/08/20時点の情報です。GoogleFormの仕様が変わっている場合があります。

# GoogleFormが作ってくれるグラフをSVG形式で出力する
GoogleFormは手軽にWebアンケートを作ることができる便利なツールだ。
Webの専門知識がなくてもアンケートの作成から集計まで手を煩わせることなく簡単に行なえるツールとしてあらゆる場面で重宝している。
標準機能として集計結果のグラフを画像としてクリップボード経由で出力できるのだが、ラスター画像であるため、大きめの印刷物にこれを用いようとすると画像を引き伸ばすしかなく画像の劣化を避けられずやや不便である。
F12開発ツールで集計ページのhtmlを覗くと、グラフはもともとSVGで作られているようである。だから、このSVGをそのまま抜き出してしまえばよいのではないかと考えた。
SVGを抜き出してしまえばそのあとは適当なツールを使ってラスター画像に変換したり、自身のWebページに埋め込んだりと自由自在である。

# 手順
1. GoogleFormを開き、「回答」タブを表示する
2. ブラウザの開発ツールを出してコンソールに後述のJavaScriptを入力する
3. ダイアログが表示されるのでファイルをダウンロード

# コード
```javascript:script.js
const downloadHTML = (html) => {
	let blob = new Blob([html], {type: "text/html"});
	let link = document.createElement("a");
	let url = URL.createObjectURL(blob);
	link.href = url;
	link.download = "download.html";
	link.click();
	link.remove();
	URL.revokeObjectURL(url);
}
var html = [].slice.call(document.querySelectorAll(".freebirdAnalyticsViewAnalyticsItem")).map(item => item.outerHTML).join("\n");
downloadHTML(html);
```

`document.querySelectorAll(".freebirdAnalyticsViewAnalyticsItem")`がみそです。もしGoogleFormの仕様が変わっていて要素にアクセスできない場合はここをいじってみて下さい。
VS CodeでSassを書こう

# VS CodeでSassをコンパイルする方法
SassはCSSよりコードの記述を短く済ませることができます。
しかし、**コンパイル**という処理によって、cssに変換する必要があります。
システムに詳しくない人にとって、Sassをコンパイルするための環境構築が挫折しやすいです。
そこで、`Visual Studio Code`であれば手軽に環境を作ることができます。

1. Vs Codeで**`Live Sass Compiler`**の拡張機能を追加し、有効にする
![スクリーンショット 2020-08-20 0.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657751/a0873b58-e98b-bcda-49f3-37b0cc686f54.png)

2. VScode下部の**`Watch Sass`**をクリックし、拡張子の**`.sassファイル`**を作成、保存
![スクリーンショット 2020-08-20 1.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657751/153e8ee1-1fd4-cb4f-099e-7144ac4b4400.png)

# Sassの書き方を簡単に紹介
**[SassMeister](https://www.sassmeister.com/)**はSass記法で書いたコードを即時CSSに変換するツールです。
左側がsass書けば、右側がcssに表示されます。

## ネスト(入れ子）
Sassでは以下のように入れ子にしてスタイルを記述することができます。
構造が把握しやすくなリます。
![スクリーンショット 2020-08-20 1.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657751/2a9cf93d-7e80-c083-cb0f-47de3102ac67.png)
### Sass
``` scss
.content {
  h1 {
    font-size: 20px;
    background: #000;
    color: #fff;
  }
  p {
    font-size: 16px;
    background: #fff;
    color: #000;
  }
}
```
### CSS
```css

.content h1 {
  font-size: 20px;
  background: #000;
  color: #fff;
}
.content p {
  font-size: 16px;
  background: #fff;
  color: #000;
}
```
## 親セレクタの参照 (&)
セレクタに**`「&」`**を使うとネストしている親セレクタを参照することができます。
以下のようにネストが深くなっても、親セレクタを参照できます。
![スクリーンショット 2020-08-20 1.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657751/001b9b18-7189-8579-d853-935fbeeebb38.png)

### Sass
``` scss
a {
  font-weight: bold;
  text-decoration: none;
  &:hover {
    text-decoration: underline;
  }
  .btn-web & {
    font-weight: normal;
  }
}
```
### CSS
```css
a {
  font-weight: bold;
  text-decoration: none;
}
a:hover {
  text-decoration: underline;
}
.btn-web a {
  font-weight: normal;
}
```
## 変数（＄）が使える
変数は繰り返し使うカラーコードなどを定義すれば、何度でも簡単に利用できる機能です。 
![スクリーンショット 2020-08-20 2.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657751/02b55873-b076-df34-3d76-e055b99c149d.png)
### Sass
``` scss
//変数の宣言
$white: #fff;
$black: #000;

#main {
  color: $white;//変数の使用
  background-color: $black;
  a {
    color: $white;
    border-bottom: 4px solid $black;
  }
}
```
### CSS
```css
#main {
  color: #fff;
  background-color: #000;
}
#main a {
  color: #fff;
  border-bottom: 4px solid #000;
}
```
## ミックスイン @mixin
これは、よく使うスタイルをあらかじめ変数として定義しておいて、欲しいときに呼び出し、使い回す機能です。
![スクリーンショット 2020-08-20 2.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657751/b81d380e-5915-23b1-76bb-076705fe5701.png)

### Sass
```scss
@mixin square($w,$h){
  width: $w;
  height: $h;
}
.box1 {
  @include square(200px,180px);
}
.box2 {
  @include square(200px,200px);
}
.box3 {
  @include square(100px,100px);
}
```
### CSS
```css
.box1 {
  width: 200px;
  height: 180px;
}

.box2 {
  width: 200px;
  height: 200px;
}

.box3 {
  width: 100px;
  height: 100px;
}
```
#　まとめ
Sassの便利な機能を使っていくと、
綺麗なコードも整理できるし、情報サイトの作業効率も上がると思います。
ぜひ、Vscodeで書いてみましょう。
Vuetifyのv-text-fieldでtype="number"の時に、表示されている値を変更する

こんにちは！
長らくプレーンJavaScriptガリゴリマンでしたが、最近仕事の関係でVue.jsを触り始めた和尚でございます:star2:

それでは早速見ていきましょう！

### 環境
- Vue.js v2.6.11
- Vuex v3.4.0
- Vuetify v2.2.11

### 注意
※かなりパワープレイです。参考程度に見てください。

# 本日の議題

ある昼下がりのこと

Aさん「数値しか入れられないフォームに文字が入っちゃうんだけど、どうにかならない？あと、最大値が999のはずなのに、キーボードで入力すると1000以上入っちゃうからついでに直して...」

和尚「まじっすかー。ちょっと調べてみまーす！」

...

## 今回の要件における Input type="number" の困った仕様
- 最大値と最小値はキーボード入力で超えることが可能
- safariは文字列を入力すると自動削除されない
- chromeは指数表現のe・Eが入力できる

# 解決しよう！
それではAさんの要件に沿って修正していきましょう！
修正前のサンプルコンポーネントとストアはこちらになります！

```vuejs:Count.vue
<template>
  <div>
    <v-text-field
      ref="count"
      label="カウント"
      type="number"
      v-model="count"
      max="999"
      min="1"
    />
  </div>
</template>

<script>
export default {
  computed: {
    count: {
      get() {
        return this.$store.getters['count'];
      },
      set(num) {
        this.$store.commit('changeCount', num);
      }
    }
  }
}
</script>
```
```javascript:index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 1
  },
  getters: {
    count: (state) => state.count
  },
  mutations: {
    changeCount(state, num) {
      if (num) state.count = num;
    }
  },
  actions: {}
})
```

### ①数値のみが入るようにする
テキストフィールドのvalueに文字列が入力された場合は空文字が返却されます。なのでsafariで文字列が入力されたままでもストアで管理している値に文字列が入ることはありません。(空文字を除く)

ということは、テキストフィールドの中にはvalueとは違う値が表示されているということです。

まずはテキストフィールドに数値のみしか入らないように修正していきましょう！
算術プロパティに記述した、countのsetterの中を少し弄ってテキストフィールドに現在のvalueの値が表示されるようにしましょう！

```vuejs:Count.vue
<script>
export default {
  computed: {
    count: {
      get() {
        return this.$store.getters['count'];
      },
      set(num) {
        num = parseInt(num)
        if (Number.isNaN(num) || num < 1) {
          num = 1;
        }

        this.$refs.count.lazyValue = num;
        this.$store.commit('changeCount', num);
      }
    }
  }
}
</script>
```

1. valueをparseIntを使用して文字列から数値にする (Input type="number"の値はString型です)
2. 数値ではない場合にnumに1を代入
3. `this.$refs.count.lazyValue`に値を入れる (v-text-fieldの表示している値を格納しているプロパティ)
4. ストアの値も変更する

### ②最大値・最小値の制御
ここまで来たらあとは簡単！
最大値と最小値の制御を入れてあげましょう！

```vuejs:Count.vue
<script>
export default {
  computed: {
    count: {
      get() {
        return this.$store.getters['count'];
      },
      set(num) {
        const min = Number(this.$refs.count.$attrs.min);
        const max = Number(this.$refs.count.$attrs.max);

        num = parseInt(num)
        if (Number.isNaN(num) || num < min) {
          num = min;
        } else if (num > max) {
          num = max;
        }
        
        this.$refs.count.lazyValue = num
        this.$store.commit('changeCount', num);
      }
    }
  }
}
</script>
```
1. `this.$refs.count`の下に`$attrs`という属性値が格納されたプロパティがあるので、そこから最大値と最小値を取り出します。
2. 文字もしくは最小値以下だった場合は、最小値を代入
3. 最大値を超えた値が入力された場合は最大値を代入

## 完成！！
これでchromeでもsafariでも問題なく、要件を満たすことができました！

`this.$refs.count.lazyValue`を見つけるまでは、ネットで似たようなことをしている記事を探しては試していました。しかし完璧に要件を満たせる方法がなくて諦めかけてたところ、何となくconsole.log(this.$refs.count)を書いてプロパティみてたらそれっぽい値を発見しました！そして、うまく値を書き換えることに成功笑

結構稀な対応かとは思いますが、同様のパターンを実装されたい方は是非参考にしていただけると幸いです。
もっと良い案があればコメントください！

ではでは！
EclipseでGitを扱う

###新規リポジトリを作成する
「Gitリポジトリー」の「新規ローカルGitリポジトリーの作成」
![スクリーンショット 2020-08-20 2.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/da7c4fbe-0b48-78e5-b050-db221f5baa3f.png)

リポジトリを作成するパスを入力し、「作成」

![スクリーンショット 2020-08-20 2.25.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/a53062ee-743c-944b-6af3-db42b4a59536.png)

###コミット
コミット対象のファイルを追加する。
![スクリーンショット 2020-08-20 2.33.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/721aea4d-d6a1-a7c9-232b-3e4467736edc.png)

対象のプロジェクトにカーソルを合わせ右クリック→「チーム」→「コミット」を選択すると[Gitステージング」が開く
あとは諸々入力してコミット
(macならoption + command + 3)
![スクリーンショット 2020-08-20 2.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/4899e808-b428-da2f-8f1e-a491ac1d83c1.png)

コミット後、コミットされたかは「チーム」→「ヒストリーに表示」から確認できる

![スクリーンショット 2020-08-20 2.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/4fe303b8-0c74-88d4-c2c3-257855c715a3.png)

###リモートリポジトリの設定
「Gitリポジトリ」タグで「リモート」右クリック→「リモートの作成」
リモート名はデフォルトのまま(origin)で「作成」
URIにリモートリポジトリのパスを入力して「完了」
![スクリーンショット 2020-08-20 3.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/09e9ff4a-12e4-640a-07c9-1ec559490b1a.png)

「追加」を選択してローカルブランチ、リモートブランチにrefs/heads/master
を入力し(masterと打ち出てくる候補を選択すれば入力される)「OK」
プッシュの構成ウィンドウで「保存」
![スクリーンショット 2020-08-20 3.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/6c38a5f0-96f9-2010-e9d0-f83e88e9e22c.png)

リモートの下に「origin」が追加される
この時点でプッシュの構成（上り）は完了
![スクリーンショット 2020-08-20 3.41.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/ec48e5d9-37cc-8e7e-361e-ce16dbd8e661.png)

フェッチの構成（下り）の設定を行う
緑の下矢印のアイコン行右クリック→「フェッチ構成」
URIは設定されているため「追加」→ソース欄にrefs/heads/masteを入力し
「完了」→「保存」

[こちらで詳細に説明されている](https://arimodoki.dip.jp/promenade/eclipse_tech_gitremote.html)

###リモートリポジトリへのプッシュ
ステージされた変更がある状態では「Gitステージング」タブの「コミットおよびプッシュ」でプッシュができる。
ステージされた変更がない状態(「コミット」のみを行っていたがその内容をプッシュしたい場合)では「チーム」→「アップストリームへプッシュ」でプッシュできる。

###コミット前の状態で変更を取り消す

「Gitステージング」タブで変更を取り消したいファイルを右クリック→「HEADリビジョンと置換」

###コミットした変更をコミット前の内容に戻す
「ヒストリー」タブで対象のコミット行を右クリック→「コミットを戻す」
すでにプッシュしていた場合も同様で、「コミットを戻す」選択後、プッシュをすれば
コミット前の内容がプッシュされる。(履歴は残る)
fatal: The current branch ブランチ名 has no upstream branchと言われた時の対処法と原因



```
$ git push
fatal: The current branch kiso06_05 has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin kiso06_05
```

というエラーが吐かれてしまった。

原因は上流ブランチが設定されていないことだった。



 [上流ブランチとは](https://www-creators.com/archives/4931 "上流ブランチとは")


指示通り

```
git push --set-upstream origin kiso06_05
```

とすると無事プッシュできた。

gitについてはまだまだこれから勉強しないと全然分からん...
amazonlinux2のhttpd + php7.4で「Uncaught Error: Call to undefined function simplexml_load_string」が出た場合の対処法

# エラー

amazonlinux2で動くwordpressにあるテーマをインストールしたら以下のエラーに遭遇。

```
Uncaught Error: Call to undefined function simplexml_load_string
```

ググった結果、どうやらSimpleXMLモジュールが入っていないとのこと。

# 動作環境

```sh
$ php -v
PHP 7.4.7 (cli) (built: Jul  2 2020 23:17:59) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

$ amazon-linux-extras | grep enabled
 24  epel=latest              enabled      [ =7.11  =stable ]
 42  php7.4=latest            enabled      [ =stable ]

$ yum list installed | grep php
php-cli.x86_64                        7.4.7-1.amzn2                  @amzn2extra-php7.4
php-common.x86_64                     7.4.7-1.amzn2                  @amzn2extra-php7.4
php-fpm.x86_64                        7.4.7-1.amzn2                  @amzn2extra-php7.4
php-json.x86_64                       7.4.7-1.amzn2                  @amzn2extra-php7.4
php-mbstring.x86_64                   7.4.7-1.amzn2                  @amzn2extra-php7.4
php-mysqlnd.x86_64                    7.4.7-1.amzn2                  @amzn2extra-php7.4
php-pdo.x86_64                        7.4.7-1.amzn2                  @amzn2extra-php7.4
```

# 対処方法

amazon-linux-extrasでepelを有効化して、php-xmlをインストールする。

```sh
sudo yum install php-xml -y
```

SimpleXMLが読み込まれていることを確認する。

```sh
$ php -i | grep -i simplexml
/etc/php.d/20-simplexml.ini
SimpleXML
SimpleXML support => enabled
```

それから、あるWebページでモジュールの読み込み順番が大切との記述を発見。

> この原因がなかなかわからず、権限変えたり色々やりましたが、結論としてモジュールを読み込む順番が大切でした。
> simplexml.so　を実行するためには、別の拡張モジュールが必要になるため、そのモジュールよりも後に拡張モジュールを読み込まないとエラーになる、ということのようです。
> 
> from [SimpleXMLがインストール出来ない時に試す方法 | 東京都｜システム開発会社｜株式会社ベスピィ](https://www.bestppp.com/tips/simplexml%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84%E6%99%82%E3%81%AB%E8%A9%A6%E3%81%99%E6%96%B9%E6%B3%95/)

そのため、simplexmlモジュールの読み込み順番の調整する。

```sh
mv /etc/php.d/{20,40}-simplexml.ini
```

最後に、php-fpmとhttpdを再起動する

```
sudo systemctl restart php-fpm
sudo systemctl restart httpd
```

これでエラーが解消された。

初め、php-fpmが動いていることに気づかず、httpdだけ再起動しても反映されなくて焦った。

# 参考

* 参考: [SimpleXMLがインストール出来ない時に試す方法 | 東京都｜システム開発会社｜株式会社ベスピィ](https://www.bestppp.com/tips/simplexml%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84%E6%99%82%E3%81%AB%E8%A9%A6%E3%81%99%E6%96%B9%E6%B3%95/)