OmniAICreator/Qiita-1.07M huggingface dataset:
aws-sdkでSTSを利用してDynamoDBにputItemする時の注意点

# はじめに
Lambdaを使って別アカウントのDynamoDBにputItemする際にハマったことをメモ。

DynamoDBにputItemするのは初めてだったので、
事前に同一アカウントのDynamoDBにputItemをした。

# やったこと
- Lambdaから同一アカウントのDynamoDBにputItem
- LambdaからSTSを使って別アカウントのDynamoDBにputItem

# Lambdaから同一アカウントのDynamoDBにputItem

[AWS.DynamoDB](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#putItem-property)クラスを使用

```index.js
const AWS = require('aws-sdk');

exports.handler = async (event, context) => {
    const dynamodb new AWS.DynamoDB()
            
    const param = {
        TableName: "テーブル名",
        Item: {
          "name": { S: "tuaaasa" }, 
          "age": { N: 23 }
        }
    };
    
    await dynamodb.putItem(param, (err, data) => {
        if(err) console.log(err);
        else console.log(data);  
    });
};

```

問題なく送信されました。

# LambdaからSTSを使って別アカウントのDynamoDBにputItem
今回は別アカウントのため、STSを使い別アカウントから許可されたロールを利用する。

[AWS.DynamoDB.DocumentClientクラス](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property)を使用して、こんな感じで実装。


```index.js
const AWS = require('aws-sdk');

const arn = "別アカウントから許可されたロールARN";
const myAccountId = '自分のアカウントID';

exports.handler = async (event, context) => {l;
    const sts = new AWS.STS();
    const role = await sts.assumeRole({
      RoleArn: '別アカウントから許可されたロールARN',
      RoleSessionName: 'test'
    });

    const credentials = new AWS.Credentials(
      role.Credentials.AccessKeyId,
      role.Credentials.SecretAccessKey,
      role.Credentials.SessionToken
    );
    const dynamodb new AWS.DynamoDB.DocumentClient({ credentials });

    const param = {
        TableName: "テーブル名",
        Item: {
          "name": { S: "tuaaasa" }, 
          "age": { N: 23 }
        }
    };
    
    await dynamodb.putItem(param, (err, data) => {
        if(err) console.log(err);
        else console.log(data);  
    });
};
```

`TypeError: dynamodb.putItem is not a function`で怒られた。

ドキュメントをよくみてみると、
`DocumentClient`の場合は`put`メソッドのようだ。

```index.js
    ...

    const param = {
        TableName: "テーブル名",
        Item: {
          "name": { S: "tuaaasa" }, 
          "age": { N: 23 }
        }
    };
    
    await dynamodb.put(param, (err, data) => {   // putに修正
        if(err) console.log(err);
        else console.log(data);  
    });
```
今度はこんなエラーで怒られた。

`"One or more parameter values were invalid: Type mismatch for key id expected: S actual: M","code":"ValidationException"`

Itemの型が合っていない模様。
しかし`name`は文字列型で`age`は数値型で間違っているはずがない...

# ハマりポイント
[AWS.DynamoDB.DocumentClientクラス](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property)をよく見ると、`param`で指定する`Item`のJSON構造が違った。

```js
    // AWS.DynamoDBクラスの場合
    const param = {
        TableName: "テーブル名",
        Item: {
          "name": { S: "tuaaasa" }, 
          "age": { N: 23 }
        }
    };

    // AWS.DynamoDB.DocumentClientクラスの場合
    const param = {
        TableName: "テーブル名",
        Item: {
          "name": "tuaaasa", 
          "age": 23
        }
    };
```

`AWS.DynamoDB.DocumentClient`クラスを扱う場合は`Item`に**型と値のオブジェクトにしないこと**です。

# おわりに
ちゃんとドキュメントは読みましょう(自戒)。
学内限定サーバーでしかオンラインアクティベートできないMathematicaを学外からアクティベートする方法(MacOS)

# はじめに

Mac使いでMathematicaを使いたいが、ライセンスサーバーが学内にあるので学外からアクティベートできず使えない！

こんな経験がある方はこの記事を見れば解決します。(ただしVer.11以前のMathematicaでは成功していません。)

sshでDynamic Port Forwardingを飛ばしてしまえば解決するはずだったのですが、どうやらMathematicaはMacのネットワーク設定からsocksプロキシを設定しても見てくれないようです。。。
この現象によって筆者はずっと悩んでいましたが、tsocksというソフトを利用することによって解決しました。

(また、この記事はMacOSを標的としていますが、LinuxやWindows Subsystem for Linux(WSL)でも同様の手順で解決するはずです。
純正Windowsはtsocksが使えないのでもう少し工夫する必要がありそうです。)

# 環境

* MacOS Mojave 10.14.6
* Mathematica 12.0

※ Mathematica 11.1以前の32bit版を使用している方は後ろの方の[Mathematica 11.1で起動しない問題](#mathematica-111で起動しない問題)も参照してください。

# Dynamic Port Forwarding

まず、Mathematicaのライセンスサーバーにpingが通る踏み台サーバーを用意し、
sshでDynamic Port Forwardingします。
Dynamic Port Forwardについての詳細な説明は省きます。
詳しくはググるか、[sshによるポートフォワーディングまとめ](https://www.xmisao.com/2013/09/12/ssh-portforwarding.html)などを参照してください。

```shell-session
$ ssh {ユーザー名}@{学内に置いてある踏み台サーバーIP} -D 10080
```

ここでは10080ポートを利用していますが、基本何でもいいです。ただし、小さい数字はすでに何かのサービスが専有している可能性があるので10000以上を指定するのが無難です。

本来はここまでやってsocksプロキシを設定すればよいのですが、今回は追加の手順が必要です。

# tsocks

tsocksは任意のアプリケーションの通信を強制的にsocksプロキシ経由にするソフトです。
[githubで公開](https://github.com/pc/tsocks)されています。

homebrew版もありますが、上手く動かなかったのでソースからビルドします。

まず別のターミナルを開いて、ローカルにcloneします。(今回は`~/opt`を作業ディレクトリとします。)

```shell-session
$ cd ~/opt
$ git clone https://github.com/pc/tsocks.git
```

あとは[githubで記された手順](https://github.com/pc/tsocks/blob/master/INSTALL.osx)に従って作業しますが、`/usr`にソフトをインストールすることは推奨されていませんし、SIPで保護されているので、`/usr/local`以下にインストールするように変更します。

以下の手順を実行してください。

```shell-session
$ cd tsocks
$ autoconf
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
```

次に`/usr/local/bin/tsocks`を以下のdiffのように修正します。

```shell-session
$ vi /usr/local/bin/tsocks
```

```diff:diff
45c45
< LIBDIR="/lib"
---
> LIBDIR="/usr/local/lib"
```

さらにtsocks用の設定ファイルを作ります。

```shell-session
$ sudo vi /etc/tsocks.conf
```

```shell-session
$ cat /etc/tsocks.conf
server = 127.0.0.1
server_type = 5
server_port = 10080
```

ここでの`server_port`は先程ポートフォワーディングで設定したポートです（今回は10080）。

# 実際に起動する

以下で起動します。

```shell-session
$ tsocks /Applications/Mathematica.app/Contents/MacOS/Mathematica
```

これでsocksプロキシ経由でMathematicaを起動することができました。

毎回これを入力するのはめんどくさいので、エイリアスを設定しておくと良いです。

```shell-session
$ echo "alias math-socks='tsocks /Applications/Mathematica.app/Contents/MacOS/Mathematica'" >> ~/.bashrc
```

次回からは以下でsocksプロキシを経由して起動できます。

```shell-session
$ math-socks
```

あとは起動したMathematica上でいつものようにネットワークアクティベートすればOKです。

# Mathematica 11.1で起動しない問題

同様の手順でMathematica 11.1を起動しようとすると、

```shell-session
$ tsocks /Applications/Mathematica.app/Contents/MacOS/Mathematica
dyld: could not load inserted library '/usr/local/lib/libtsocks.dylib' because no suitable image found.  Did find:
	/usr/local/lib/libtsocks.dylib: mach-o, but wrong architecture
	/usr/local/lib/libtsocks.dylib: stat() failed with errno=1

[1]    66718 abort      tsocks ./Mathematica
```

と怒られます。
これはVer.11以前のMathematicaが32bitアプリであるため発生している現象です。

これに対応するためにはtsocksを32bitでmakeする必要があると思われますが、、、勉強不足でやり方がよくわかりません。
どなたか教えて下さい。
Gsuiteに新規ドメインを登録し、Gmailを利用する

# 概要
「[レジストラでのドメイン取得から利用まで](https://qiita.com/ryosuk/items/8bfb7cd46baf81f60f4d)」の続きです。
ムームードメインで新しく取得したドメインをGmailで使うためにGsuiteにドメインを追加します。
ネームサーバとしてはAWSのRoute53を利用し、Route53のTXTレコードにGsuiteのセキュリティトークン情報を持たせることによって、取得したドメインでのGmailアカウントの利用が可能となります。

# 手順
## Gsuite側設定
Gsuiteに管理アカウントでログインし、管理コンソールから「ドメインの管理」を選択します。
「ドメインの管理」画面で「ドメインを追加」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/754834d5-1179-7fd6-3942-4f6e8dc936a7.png)

取得したドメインを入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/a1ff2257-40c7-7b02-12ee-8fa89d6a9545.png" width=50%>

ムームードメインを選択し、表示される手順に従ってセキュリティトークンをコピーし、ムームーDNSの設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/12f1dd5e-4303-701f-2e49-ef71be076c2e.png)

## ムームードメイン側設定
ムームードメインの管理画面を開き、ムームーDNSのセットアップ情報から取得したドメイン行から「利用する」を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/40c6ba0b-39db-53fe-44db-e30ade7afc19.png" width=70%>

カスタム設定を押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/ca91dc6f-3a6a-7b29-cfa7-3ab8d0972e9e.png" width=70%>

TXTレコードを選択し、Gsuite側で取得したセキュリティトークンを入力します。
この操作により、Gsuite側にドメインを割り当てることが可能となります。
その後、「セットアップ情報変更」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/1c8dfe15-deff-4d9a-8e17-e487305aa23e.png)

## AWS側の設定
追加するドメインを管理するアカウントでRoute53を開き、レコードセットの作成を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/b890153d-919a-3e31-ec62-d07a51bf3a1e.png" width=70%>

TXTレコードを選択し、Gsuite側で取得したセキュリティトークンを入力します。
この操作により、Gsuite側ではTXTレコードを使用してドメインの所有権を確認することが可能になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/40df1eed-0d07-c28e-fef4-b24d570e7bb8.png" width=60%>

Gsuiteのドメイン設定画面に戻ると、所有権の確認が完了します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/39bdaff1-fbd1-61eb-ad5b-b4ab7cc8bce0.png" width=50%>

# 結果
Gsuiteでドメインを利用できるようになりました。
これにより、Gmailアカウントとして登録したドメインを利用してメールの送受信が可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/76e12aa1-799b-3d4a-4f75-131d944f194f.png)
Go言語でAWS SNSにメッセージを送信する

## 概要
Amazon Simple Notification Service(SNS)で、Go言語のSDKを使ってトピックに対してメッセージを送信します。

## 環境
 - Go : 1.14.3
 - Mac OS X : 10.15.4
 - AWS SDK for Go

## シンプルな実装

```go:シンプルなメッセージ送信
package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/sns"
)

// TopicARNとRegionは環境に合わせます
const (
	TopicARN  = "arn:aws:sns:XXXXXXXXXXXXXXXXX"
	AwsRegion = "XXXXXX"
)

func main() {
    // SNSクライアントの作成
	mySession := session.Must(session.NewSession())
	svc := sns.New(mySession, aws.NewConfig().WithRegion(AwsRegion))

	message := "This is sample message."

    // メッセージを送信するための構造体を作成
	inputPublish := &sns.PublishInput{
		Message:  aws.String(message),
		TopicArn: aws.String(TopicARN),
	}

    // メッセージの送信(Publish)
	MessageId, err := svc.Publish(inputPublish)
	if err != nil {
		fmt.Println("Publish Error: ", err)
	}

	fmt.Println(MessageId)

}
```

シンプルにメッセージを送る場合の実装です。登録されたサブスクリプションに対してメッセージが送信されます。例として、SQSをサブスクリプションにした場合、以下の通り確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451175/5a4f6331-2134-cf12-0a96-a21d2b8a2628.png)

## サブスクリプションごとにメッセージを変える場合
```go:サブスクライブするプロトコルごとのメッセージ
package main

import (
	"encoding/json"
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/sns"
)

const (
	TopicARN  = "arn:aws:sns:XXXXXXXXXXXXXXXXX"
	AwsRegion = "XXXXXX"
)

func main() {
	mySession := session.Must(session.NewSession())
	svc := sns.New(mySession, aws.NewConfig().WithRegion(AwsRegion))

	message := "This is sample message."

    // サブスクリプションのプロトコルごとにメッセージを指定
	messageJson := map[string]string{
		"default": message,
		"sqs": "This is sample message for sqs.",
	}
    // メッセージ構造体はJSON文字列にする
	bytes, err := json.Marshal(messageJson)
	if err != nil {
		fmt.Println("JSON marshal Error: ", err)
	}
	messageForSQS := string(bytes)

	inputPublish := &sns.PublishInput{
		Message:  aws.String(messageForSQS),
		MessageStructure: aws.String("json"),    // MessageStructureにjsonを指定
		TopicArn: aws.String(TopicARN),
	}

	MessageId, err := svc.Publish(inputPublish)
	if err != nil {
		fmt.Println("Publish Error: ", err)
	}

	fmt.Println(MessageId)

}
```

このソースの実行結果は以下の通りです。SQS用に設定したメッセージが送信されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451175/8be8df37-26a0-2d10-c605-9a80fd98c68b.png)

このようにサブスクリプションのプロトコルごとに異なるメッセージを送る場合、`MessageStructure`に`json`を設定します。また、メッセージはJSON文字列として、トップレベルにプロトコル(今回の例では`sqs`)を指定します。トップレベルに`default`は必須です。
プロトコルとして指定する値はCLIのリファレンスを参照。
[subscribe - Options](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html#options)


なお、メッセージ属性を設定する場合は`MessageAttributes`を使います。詳細は以下の公式ドキュメントを参照。
[type PublishInput](https://docs.aws.amazon.com/sdk-for-go/api/service/sns/#PublishInput)

## 参考
 - [AWS SDK for Go API Reference](https://docs.aws.amazon.com/sdk-for-go/api/service/sns/)
 - [AWS SNSで複数プラットフォーム上のアプリへのメッセージを送るときにはJSON文字列を渡さないといけない](https://qiita.com/toihrk/items/2097c699b655b6a6d8a5)
Azure のクイックスタートで日本語音声認識を試す方法

Azure の日本語音声認識を試そうとしたら、めちゃくちゃハマったのでメモ。

GitHub URL
https://github.com/Azure-Samples/cognitive-services-speech-sdk/tree/master/samples/js/browser

ドキュメント URL(~~一応載せておくが、ドキュメント見てわかるならこの記事をそもそも書いていない~~)
https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/quickstarts/speech-to-text-from-microphone

環境:
Mac Book Pro ( macOS Catalina 10.15.4 )
Chrome 83.0.4103.61
JavaScript(言語はいろいろと選択できます）


## Clone する

```bash
git@github.com:Azure-Samples/cognitive-services-speech-sdk.git
```

## Azure の無料アカウントを作成する

https://azure.microsoft.com/ja-jp/free/

## Cognitive Services を作成する

ホーム -> リソースの作成 -> Cognitive Services で検索 で作成できる

## 作成したリソースから API キーをコピーする

作成した Cognitive Services リソースを開く -> サイドメニューのキーとエンドポイントを選択 -> キー 1 と 場所をコピペしておく

<img width="1259" alt="ss 2020-05-25 0.19.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210875/6698ecfa-5a05-9dcf-148a-e7bcde1cd8da.png">


## SDK をサンプルのディレクトリに配置する

zip を[ダウンロード](https://aka.ms/csspeech/jsbrowserpackage)し、 `microsoft.cognitiveservices.speech.sdk.bundle.js` を `browser` ディレクトリに配置する。

## index.html を編集する

一番のハマりどころはここ（ 3 時間はハマった）。 Region に japaneast が存在せず、何を選択しても接続ができないというエラーが出てしまいます。エラーメッセージは下記です。

```bash
undefined
ERROR: Unable to contact server. StatusCode: 1006, undefined Reason:  undefined
```

エラーメッセージわかりづらい・・・


このエラーを回避するために、下記 select に japaneast を value に持つ option を追加する。

```html
                    <select id="regionOptions">
                        <!-- 略 -->
                        <option value="japaneast" selected="selected">Japan East</option>
                        <!-- 略 -->
                    </select>
```

僕は japaneast を選択しましたが、 japanwest も存在します。そのため、キーとエンドポイントのページで場所を確認し、適宜読み替えて値の変更を行ってください。

## localhost で起動する

[Chrome は files:// でのマイクの取得を許可してない](https://html5experts.jp/mganeko/6956/)ため、 index.html を Chrome で表示してもマイクが利用できない。そこで、 localhost で起動する。起動できれば何でもいいが、僕は PHP で起動した。

```bash
cd ~/cognitive-services-speech-sdk/samples/js/browser/
php -S localhost:8888
```

ブラウザで http://localhost:8888 を起動すると、 index.html が表示される。

## 開いたページで各種設定を行う

開いたページで、下記値を入力していきます。

Subscription: Cognitive Services のキーとエンドポイントから取得したキー 1 or 2 をペーストする
Language: 話す言語を設定する（日本語だったら、 Japanese -JP)
Region: Japan East を選択する
Format: どちらでも
Input: Microphone を選択。最初、横にある select が空になるが、いったん無視。

設定完了後、 `recognizeOnceAsync()` のボタンを押すと、マイクの許可を求めるダイアログが出るので、許可します。許可すると、 Input の横にある select に利用可能なマイク一覧が表示されるので、使いたいマイクを選択します。

ちなみに、 Chrome M80 以下だと許可がなくてもマイクの一覧が取得できていたため、最初からマイク一覧が出ていたという方は Chrome のアップデートをおすすめします。 M81 から許可がないとデバイス一覧の取得ができなくなるように修正されました。
参考: https://tech-blog.optim.co.jp/entry/2020/03/06/160000

## 音声認識をお楽しみください！

マイクに向かってコンニチハ！

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210875/da8fd99e-174b-bf19-c525-80d2b50dfcdd.gif)

何か話すと認識された結果が表示されます。

## まとめ

クイックスタートってなんだよ（真顔）
[Test for Qiita API publish] my article

#  私の Qiita ポートフォリオ

※この記事は自動生成です。

※現在表示されている内容はテストデータを使用しています。 (2020.04.26)

Qiita の投稿履歴を収集し、サマリを表示します。

## Tag Distribution




- Python 15

- AWS 15

- 機械学習 3

- PyConJP 3

- EC2 3

- 自然言語処理 2

- word2vec 2

- 技術書典 2

- AppSync 2

- GraphQL 2



## Pickup

Sorted by likes




- [Excel方眼紙で手順書作るのやめ隊 - AWS/GitHub/CircleCI/mkdocs でドキュメント管理- ](https://qiita.com/hassaku_63/items/83daf4dac111f0b5390f) / likes = 92

- [AWSソリューションアーキテクト プロフェッショナル 合格メモ](https://qiita.com/hassaku_63/items/8e12cfbd4fbc5aa4c49a) / likes = 36

- [[Python/pandas] DataFrameの欠損値をカウントする](https://qiita.com/hassaku_63/items/2c2c2cb01901bbffec0b) / likes = 13

- [AWSのセキュリティ方針について](https://qiita.com/hassaku_63/items/71d2a64ca47cf4e8c8c2) / likes = 10

- [VSCodeでエディタ画面とターミナル間のフォーカスを楽して移動したい](https://qiita.com/hassaku_63/items/4d14d949c3ce9edd9909) / likes = 9
goose設定ファイルに環境変数を読み込めない（Docker環境）

# 概要
Docker環境でGo製マイグレーションツールのgooseを使用する際、設定ファイルである`dbconf.yml`が環境変数を読んでくれませんでした。

### dbconf.yml
~~~yml
development:
  driver: mymysql
  open: $MYSQL_URI
~~~
環境変数は、**$変数**という形式で読み込んでくれるはずなのですが・・・([公式参照](https://bitbucket.org/liamstask/goose/src/master/))

### Dockerfile
~~~dockerfile
FROM golang:1.14.2-alpine

WORKDIR /go/src/server
COPY . .
ENV GO111MODULE=on

RUN apk add --no-cache \
        alpine-sdk=1.0-r0 \
    && go get github.com/pilu/fresh \
              bitbucket.org/liamstask/goose/cmd/goose
CMD ["fresh"]
~~~
コンテナ内でgooseコマンドを使うため、コンテナ内にもgooseを導入してあります。

# 原因
コンテナ内では外部ファイルやコマンドで指定してあげないと、環境変数を読み込むことができないみたいです。
コンテナ内を確認したところ、`.env`がコピーされていなかったので、Dockerの使用上コピーできないようになっているんですかね？
[Docker で環境変数をホストからコンテナに渡す方法（ホスト OS 側からゲスト OS に渡す方法各種）](https://qiita.com/KEINOS/items/518610bc2fdf5999acf2)

# 解決
### `docker-compose.yml`にオプション追加
~~~yml
version: "3.7"

services:
  server:
    container_name: server
    build:
      context: ./
      dockerfile: Dockerfile.dev
    ports:
      - 8000:8000
    env_file:  # 左記オプション追加
      - .env
    depends_on:
      - db
    tty: true
    stdin_open: true
    volumes:
      - ./:/go/src/server
~~~
リチウムイオン電池を充電する回路を作ってみる

#目次
・目次
・目的
・回路設計
・測定結果

#目的
　ESP32をIoT他に活用したい。
　となると電源を引っ張ってくるのではなく、リチウムイオンバッテリーでうごかしたいが、充電をどうするのか。
　というところで充電回路の作成にトライする。Qiitaの投稿内容でもない気がするが...
　以下のサイトを参考に作成した。
https://denshikousakusenka.jimdofree.com/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81/%E9%9B%BB%E6%BA%90%E9%96%A2%E4%BF%82/mcp73831/
#回路設計
　充電IC（MCP73831）は秋月電子で購入する。
http://akizukidenshi.com/catalog/g/gI-13288/　
　電池はAITENDOで保護回路付（←ここ重要）のものを購入する。
https://www.aitendo.com/product/16085
　以下のような回路を作成した。
<img width=60% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184089/8d30fb50-f1b4-7892-57fc-22f6fcdba4d9.png>

　保護回路まで作成すると手間のため、保護回路付きのバッテリーを購入した。
　PROGに2kΩをつけると最大充電電流を500ｍAに制限できる。
　※ここをオープンか数百kΩの抵抗を付加すると充電を停止できるようだ。
　充電中は赤色LED、充電完了すると青色LEDが点くようにしてみた。
　5VはUSBから給電する。
　コネクタのVBATとGNDを電池に接続する
　
　回路のパターン設計、発注、部品実装を行う。ほかにもいろいろ回路を載せているが、充電回路は左上の赤いLEDの周辺にある。
<img width=40% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184089/8aa192b7-0faa-edd8-dc8c-b038ca0e4497.png>

#測定結果
　バッテリーに実際に充電を行い。電圧の時間変化を見ていく。
　AITENDOで買った2000mAhの電池を放電させ2.7Vまで下げた後、充電回路に接続してみた。
　結果は以下の通り、4時間半程度で充電が完了し、青のLEDが光るようになった。
<img width=40% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184089/252cb869-a2d1-2fca-cd56-8b167c456462.png>
　図　充電特性：バッテリー電圧の時間変化

<img width=40% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184089/a2598408-e094-8740-ec8f-c1e15a85063f.jpeg>
　図　回路：充電中なので赤が点灯

<img width=40% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184089/c00ee0dd-6a16-abad-2486-ca2374b6b116.jpeg>
　図　回路：充電完了なので青が点灯

以上、まずは充電できて良かった。電池も熱くなってはおらず、まずは何とか今後も使っていけそうだ。
THEOSで簡単なTweakを作ってみよう！ホーム画面にボタン追加する編

#THEOSで簡単なTweakを作ってみよう！ホーム画面にボタン追加する編

どーも。高校生のクソガキです。
Twitterはこちら
[twitter](https://twitter.com/DevTweak)

##theos構築
これはいちいち手動で構築する人がめんどくさい人向けのtweak
theos instaler2を使ってください
インストールしたらterminalにてroot権限で
`theosinstaller 12.2`
と打って実行すれば構築できるはずです。

##プロジェクトの作成
terminalで
`$THEOS/bin/nic.pl`
とうって指示通りに進めていけば作成できます。
詳しくは前記事にしたのでみてみてください。

##tweak作成
さっき作成したプロジェクトにtweakのコードを記述していきます。
Tweak.xというファイルができているはずなので、
そこに書いてある内容を全て消してください
今回はホーム画面にボタンを追加するコードを書いていきます。

```objective_c
#import <spawn.h>
%hook SBHomeScreenViewController
-(void)viewDidLoad {
//viewが読み込まれたとき
    %orig;
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(10, 10, 100, 30);
    //btnを大きさ指定して生成
    [btn setTitle:@"押してね" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(hoge:)
    forControlEvents:UIControlEventTouchDown];
    //btnを押したときに呼び出されるmethodの名前を決める
    [self.view addSubview:btn];
    //btnをSBHomeScreenViewControllerのviewに追加
}
%new
-(void)hoge:(UIButton *)sender {

    UIViewController *view = [UIApplication sharedApplication].keyWindow.rootViewController;
    while (view.presentedViewController != nil && !view.presentedViewController.isBeingDismissed) {
            view = view.presentedViewController;
    }

    UIAlertController *alertController =
    [UIAlertController alertControllerWithTitle:@"Respring"
    message:@"respringしたいか?"
    preferredStyle:UIAlertControllerStyleAlert];

       [alertController addAction:[UIAlertAction actionWithTitle:@"Yes"
                style:UIAlertActionStyleDefault

                handler:^(UIAlertAction *action) {
                    //respring
                    pid_t pid;
                    int status;
                    const char* args[] = {"killall","-9","backboardd",NULL};
                    posix_spawn(&pid,"usr/bin/killall",NULL,NULL,(char* const*)args,NULL);
                    waitpid(pid,&status,WEXITED);

                }]];

       [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
                style:UIAlertActionStyleDefault

                handler:^(UIAlertAction *action) {
                }]];

       [view presentViewController:alertController animated:YES completion:nil];
}
%end
```
こんな感じでtweak.xを書いてください。
1行目のspawn.hはリスプリングするときに必要になるのでインポートしといてください。
ちなみに四行目の%origがないと、既存の処理が全て消え、今回書いたコードだけになるので、絶対つけてください。

ではコードが書き終わったので、次はmakefileを開いてください。
開きましたら一番上に
`ARCHS = arm64 arm64e`
とかいてください。
書かなくても一応コンパイルはできますが、
arm64eという記載がないと、A12プロセッサーに対応したtweakが作れません。

では作業が終わったので、コンパイルしてみましょう。
terminalを開いて、
tweak.xとかmakefileがあるディレクトリにcdコマンドで移動します。
`cd /var/mobile/test`
みたいな感じでやってください。
できましたら、
`makefile`
と入力してください。
何もエラーが出なければdebian packageの出来上がりです。
先ほどのディレクトリにpackageというフォルダーができてるはずなので、
そこにいき、debをインストールしてみてください。

respringしてホーム画面にボタンが出現すれば完成です！！
##ターミナルいくのめんどくさい！！て方
わざわざfilzaからターミナルに行ってコンパイルするのめんどくさいよという方は、
僕がfilzacompilerというtweakを作ったので、
twitterのdmくればあげます

#まとめ
簡単でしたね！！何か質問があればtwitterのdmとかにくれば教えます。
お疲れ様でした。
Vue.js用のVSCode拡張 vetur でメソッドの先頭一文字が認識されない

6行目(最初の)abc('a')で「bcというメソッドが無い」というエラーが出る。バージョンは `octref.vetur@0.24.0`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/ed749283-06dd-cd96-2ed4-eca85d60694e.png)


```vuejs:index.vue
<!-- CRLF -->
<template>
  <div class="root">
    <button
      data-xxxx="↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline ↓newline "
      v-on:click="abc('a')"
    >xxx</button>
    <button v-on:click="abc('a')">←ok</button>
  </div>
</template>

<script lang="ts">
import Vue from "vue";
export default Vue.extend({
  methods: {
    abc(a: string) {}
  }
});
</script>

<style lang="scss" scoped>
</style>
```

原因は改行コード。vueファイルの改行コードをLFにする。それか、2つ目のabc('a')と同じく1行に書く。

と、言うことを調べたら既出でマージ済みでしたとさ。windows環境でもlfに統一した方がいいのかな？

Template Interpolation Issue - First letter not recognized in event variable assignment · Issue #1319 · vuejs/vetur
https://github.com/vuejs/vetur/issues/1319

Fixed wrong location calculation when including CRLF. by ota-meshi · Pull Request #74 · mysticatea/vue-eslint-parser
https://github.com/mysticatea/vue-eslint-parser/pull/74?w=1
mysql on Alibaba cloud

###AsparaDB for RDS(mysql)を作成する
- インスタンス作成
![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/12214bef-cef3-335d-9cf5-fd3dbfc2cf45.png)
![instance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/e6bfb4d5-7468-957f-0a64-1a57e9c076ff.png)
- サンプルデータベース作成（[リンク](https://dev.mysql.com/doc/index-other.html)）
![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/62377425-2034-e761-546f-b57bec5c7247.png)
- unzip後にインポートする(ESCインスタンス経由）  
`mysql -u <user> -p -h <host name>.mysql.japan.rds.aliyuncs.com`  
`SOURCE /home/projects/world.sql;`  
![show.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/a2355622-6227-23a1-3fcc-a7442434b300.png)
- エラー処理
  - mysqlがない場合インストールする（`yum install mysql`）
  - unzipがない場合インストールする（`yum install unzip`）
- IntelliJ IDEAでアクセス
![intelliJ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/aef1fd77-0c7e-5d38-34a9-d48a8bd94e61.png)
DNSとは

#まえがき
qiitaへの投稿は約1ヶ月と少しぶりになります。
約1ヶ月と少しの間に仕事ではCisco ISRシリーズでBRIポートの設定を行ったりDNS(キャッシュ)サーバの設定を行ったりと色々ありました。
今回はDNSサーバを設定していて勉強になったことを投稿しようと思います。
#DNSとは
まずDNSとは何者なのかというところから
簡単に説明すると「ドメイン名とIPアドレスを紐づけて管理しているシステム」です。
（ドメイン名とIPアドレスの説明は下のほうに書かせていただきます。）

何故ドメイン名とIPアドレスを紐づける必要があるのかというところで、
webページを見る際にPCはDNSサーバに「このドメイン名を持っているIPアドレスを教えてください」と聞きに行きます。そしてDNSサーバから帰ってきたIPアドレスを持つサーバを見に行くためにドメイン名とIPアドレスを紐づけておく必要があるのです。
また、ブラウザでIPアドレス「183.79.135.206」と打ち込み検索してもwebページは出てきますが、ドメイン名「yahoo.co.jp」の方が圧倒的にわかりやすくなっています。

※IPアドレス：インターネット上の電話番号みたいなもの（ネットワーク上で同じ番号は使用されない）
※ドメイン名：インターネット上の住所みたいなもの（インターネット上で同じドメイン名は使用されない）
（例）Qiitaのurlの場合「https://qiita.com/ 」 の「qiita.com」の部分がドメイン名になります。
#DNSサーバの動き
こちらwebページが開かれるまでのインターネット上の動きを図にして説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612471/23f0d574-5cd1-3e93-51df-3930cb028643.png)
① ブラウザでドメイン名と紐づいているIPアドレスをDNSサーバに問い合わせを行います。（ここでは例としてgoogle.comとします）

② ルートDNSサーバにgoogle.comに紐づいているIPアドレスを問い合わせに行きます。
（ルートDNSサーバの説明は下の方に書かせていただきます）

③ ②の問い合わせに対しトップレベルドメインDNSサーバのIPアドレスを返します。
（トップレベルドメインの説明は下の方に書かせていただきます）

④ ③で返ってきたIPアドレスを持つトップレベルドメインDNSサーバにgoogle.comに紐づいているIPアドレスを問い合わせに行きます。

⑤ ④の問い合わせに対しgoogle.comを管理している下位のDNSサーバのIPアドレスを返します。

⑥ ⑤で返ってきたIPアドレスを持つDNSサーバにgoogle.comに紐づいているIPアドレスを問い合わせに行きます。

⑦ ⑥の問い合わせに対しgoogle.comのwebサーバのIPアドレスを返します。

⑧ ⑦で返ってきたwebサーバのIPアドレスをPCに教えます。

上記の①～⑧の動きがDNSサーバの仕事になります。⑧の最後にPCがDNSサーバから返ってきたwebサーバのIPアドレスを見に行きます。

※ルートDNSサーバ：DNSサーバが最初に問い合わせに行きトップレベルドメインの名前解決を行います。世界に13個あり、日本にも設置されているようです。
※トップレベルドメイン：urlの「jp」や「com」といった部分の事です。調べてみると結構種類がありました。どれを選んでも同じみたいなので、作成するwebサイトの内容によって選ぶ人が多いようです。
（例）非営利団体なら「.org」、個人サイトなら「.com」
#さいごに
学生時代はDNSは名前解決みたいな感じで覚えていましたが、今回仕事で使ってみて詳しく調べてみるとかなり奥が深いと感じました。
（インフラの基礎的な部分でも深く掘り下げて調べてみると面白いですし勉強になりますね....）
今回も図をExcelで作成しましたが他に良いソフト無いですかね....
#参考サイト
https://www.kagoya.jp/howto/rentalserver/dns-server/
https://www.nadukete.net/domain-guide/setting/dns.html
【Flutter】Firestore ConnectionState.waiting が永久に続く

## 事象

Firestoreを組み込み時に、

```
ConnectionState.waiting
```
が永久に続く事象が発生。

## 解決方法

Firebaseコンソールでセキュリティ設定を変更することができます。**本番モード**で作成した場合(テストではなく)は、セキュリティルールが付いているので、それを許可するまで接続がブロックされてしまう可能性があります。

データベース画面のRulesタブを開いて、以下のように変更してみてください。本来的には認証が必要かと思います。

```
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/b6b1dda1-2bc6-646b-32b5-d0906ec7802e.png)


## 参考記事
- [Firestore ConnectionState is in Waiting state forever in flutter app](https://stackoverflow.com/questions/57744082/firestore-connectionstate-is-in-waiting-state-forever-in-flutter-app)
Aws Linux 2 へのMySQLインストールとテストデータ用意

# MySQLインストール

## yumリポジトリ追加
```bash
$ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
```

## MySQLインストール
```bash
$ sudo yum install mysql-community-server
```

## MySQL起動 
```bash
$ sudo systemctl start mysqld.service
```

## rootユーザの初期パスワード 
次の工程で使用する。 →　+nu&TAHRi7p=

```bash
$ sudo cat /var/log/mysqld.log | grep "temporary password"
2020-06-12T08:50:36.870252Z 1 [Note] A temporary password is generated for root@localhost: +nu&TAHRi7p=
```

## MySQLセキュリティ
```bash
$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: # 初期パスワードの入力　→　今回は +nu&TAHRi7p=

The existing password for the user account root has expired. Please set a new password.

New password: # rootユーザの新規パスワードの入力

Re-enter new password: # 確認用の入力
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y # rootユーザのパスワードの変更

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y # 匿名ユーザーを削除
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y # リモート用rootユーザを削除
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y # testデータベースの削除
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y # 権限テーブルを再起動
Success.

All done!
```

## MySQLへのログイン
```bash
$ mysql -u root -p
```

# テストデータ用意
## テストデータ取得
公式のものを使用。
[MySQL公式-テストデータ](https://dev.mysql.com/doc/index-other.html)
<img width="769" alt="test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241421/9a512017-02de-c204-3c9b-bbaf31866907.png">

## 解凍
```bash
$ unzip world.sql.zip
```

## AWSへの送信
```bash
$ scp world.sql DataLamda_Outer:/home/ec2-user/
```
## MySQLへの読み込み
```bash
$ mysql> SOURCE /home/ec2-user/world.sql;
```
database.worldが作成される。
go modで自作パッケージの新バージョンを認識してくれない時

## 状況
自作パッケージにAPI破壊を伴う変更を入れたので、v2.0.0としてリリース。タグも切ってGitHub上にPush。
その後、このパッケージに依存する別パッケージのimport文を`github.com/yourorg/repo/sub/pkg`から`github.com/yourorg/repo/v2/sub/pkg`に変更して`go mod tidy`したところ、以下のようなエラーメッセージが出た。

```bash
go mod tidy
go: finding module for package github.com/yourorg/repo/v2/sub/pkg
your/another/package imports
        github.com/yourorg/repo/v2/sub/pkg: module github.com/yourorg/repo@latest found (v1.0.0), but does not contain package github.com/yourorg/repo/v2/sub/pkg
```

## 解決策
go.modをinitしなおす。（ `go mod init github.com/yourorg/repo/v2`）
やり方としては、以下のようなやり方がある様子。v1をメンテし続けるかどうかで判断すればいいのだろうか。

1. v2ブランチを独立させる
2. リポジトリ内にv2ディレクトリを作ってv2はそちらで作業する
3. go.mod, go.sumを一度消してv2のgo.modを作り直す
[Rails]トップページの背景を動画にしようとしたらハマった


トップページの背景を画像から動画にしようと思い実装していたら、ハマりました。

##video_tagを使う


```ruby:index.html.erb
<%= video_tag("/videos/top-video.mp4", autoplay: :true, loop: :true, muted: :true, class: 'video-content') %>
```

###ひとつひとつ見ていく

```ruby
"/videos/top-video.mp4"
#/assets/videos/埋め込む動画

autoplay: :true
#ページ更新時に自動再生

loop: true
#繰り返し再生

muted: true
#無音になる　railsではこの設定をしないといけないらしい

class: 'video-content'
＃クラス名の指定
```

video_tagは初めて使ったのですが、中身は問題なさそう。
基本的には、これで行けると思っていました。
が、ブラウザでみると全く動画が現れない。

拡張子をmp4からwebmにコンバーターで変換して再度試してみたり、VSエディタで動画ファイルをみようとすると文字化けするのでVSエディタの拡張機能を色々調べてたら、時間が過ぎ去りました。

***結論からいうと、動画ファイルを置く場所がダメだったみたい。***
画像とと同じノリで、```app/assets/video(自作)/#動画ファイル```だとダメでした。
```public/videos/top-video.mp4```のように、publicさんの元におかしていただければ、反映されました！！！

ちなみに、```public/assets(自作)/videos(自作)/top-video.mp4```では、ダメだったので気をつけてください。

**以下参照サイト**
[Railsでhamlファイルに動画を埋めこむ](https://qiita.com/naoki00m/items/76a2a8b0f6cde5c03f45)
[【rails】videoタグを使って背景に動画を埋め込んでみたよ](https://www.for-engineer.life/entry/rails-video/)
[背景に動画を使ったWebサイトの作り方 | Webクリエイターボックス](https://www.webcreatorbox.com/tech/video-background)
コールバック関数

# プログラミングの勉強日記
2020年6月13日　Progate Lv.87
JavaScript Ⅶ

##コールバック関数とは
　JavaScriptでは、引数に関数を渡すことができ、引数に渡される関数のことをコールバック関数という。関数の呼び出し時に渡される関数の種類には、文字列や数値、真偽値、関数がある。

<img width="458" alt="コールバック関数.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/ae115f95-b64f-2d99-e664-7217b4904335.png">

```javascript
const print =() => {
  //処理
}
const call = (callback) => {  //callbackは引数名。関数printが代入される。
  //処理
}
call(print);  //printは関数名。関数printを引数に渡す。
```

　関数は関数名の後に`()`をつけると呼び出され、`()`をつけなければ関数そのものを指す。（上の例を用いると`print()`とすれば、関数が呼び出されるが、`print`とすると関数そのものである。）

```javascript:事前に定義した関数
const print =() => {
  console.log("Hello World");
};
const call = (callback) => {
  console.log("コールバック関数を呼び出す");  //2.printをcakkbackに代入
  callback();   //3.関数callbackを呼び出す
};
callback(print);  //1.引数にprintを渡し関数callを呼び出す
```
コンソール結果は
「　コールバック関数を呼び出す。
　　Hello　World　」

##関数を直接引数の中で定義する
　ここまでは事前に定義した関数をコールバック関数として渡していたが。関数を直接引数の中で定義することもできる。

```javascript:直接引数の中で定義した関数
const call = (callback) => {  //2.printをcakkbackに代入
  console.log("コールバック関数を呼び出す");
  callback();  //3.関数callbackを呼び出す
};
//1.引数で関数を定義して関数callを呼び出す
call()=> {
  console.log("Hello World");
});
```

コールバック関数でも普通の関数と同じように引数を渡すこともできる。

```javascript:普通の関数
 const introduce = (name) => {
  console.log(name);
};
introduce("田中太郎"); //コンソール結果は「田中太郎」
```

```javascript:コールバック関数
const introduce = (callback) => {
  callback=("田中太郎");
};
introduce(name) => {
  console.log(name);  //コンソール結果は「田中太郎」
});
```

また、複数の引数を渡すことも可能である。

```javascript
const introduce = (callback) => {
  callback=("田中太郎",24);
};
introduce((name,age)) => {
  console.log(`$(name)は$(age)歳です`);  //コンソール結果は「田中太郎は24歳です」
});
```
とりあえずJavaの外部ライブラリを使う

#プロローグ
なんでもいいのでライブラリを使ってみます。

#やり方
ライブラリのファイルを入手します。
今回はログ操作で有名なslf4jを使ってみます。

[こちら](https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/)のslf4j-api-1.7.25.jarからjarファイルをダウンロードします。
<img width="423" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/e905c437-6324-4df5-47a1-e6396cca967a.png">

Eclipseの対象プロジェクトを右クリックし、「ビルドパス」の「外部アーカイブの追加」を開きます。
<img width="555" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/a9ab176c-a47f-5df4-999e-ceac07740f9e.png">

対象のライブラリを選択して、「ビルドパス」の「ビルドパスの構成」を開きます。
<img width="814" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/4f8457fc-1aa8-6ded-2f02-36c798d74f3a.png">

「適用して閉じる」を押下します。
<img width="518" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/4d42d22a-2a1e-8a34-682e-7fb6331bd36b.png">

実行用のコードを書きます。

```java
package test1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Test1 {

	public static void main(String[] args) {

		Logger logger = LoggerFactory.getLogger("testLoger");
		logger.info("テスト");
		// TODO 自動生成されたメソッド・スタブ
		System.out.println("Hello World");

	}

}
```

実行すると、本編とは関係ありませんが、エラーがでました。
どうやら「slf4j-simple-1.7.25.jar」も必要なようなので、そちらも同様にjarをダウンロードしてビルドパスに追加しました。

再度実行すると、正常に実行できました。
<img width="1128" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/22352991-cac4-bfc7-9ea8-d10433cb17b0.png">

ライブラリの使い方がわかったので、ガンガン使っていきたいと思います。
VSCodeでWSLを使いながらC++を扱うための設定メモ

自分用のメモです。下記の記事を参考にしました。感謝いたします。
一部の設定値を変えています。
(https://qiita.com/2019Shun/items/5ab290a4117a00e373b6)

環境
OS:Windows10 Pro
バージョン: 2004(OSビルド 19041.329)

Visual Studio Code
バージョン: 1.46.0

WSL
OS:Ubuntu18.04.4
aptの更新後、build-essentialとgdbをインストール

ワークスペース内の.vscodeに配置するjsonファイルと中身
下記3つ
c_cpp_properties.json
launch.json
tasks.json

```json:c_cpp_properties.json
{
    "configurations": [
      {
        "name": "WSL",
        "intelliSenseMode": "gcc-x64",
        "compilerPath": "/usr/bin/gcc",
        "includePath": ["${workspaceFolder}/**"],
        "defines": [],
        "cStandard": "c11",
        "cppStandard": "c++17"
      }
    ],
    "version": 4
}
```

[2020/06/16 自分用に追記]
 `"program"` と`"args"` の設定値に`${fileBasenameNoExtension}`を使用した。(現在開いているファイル名から拡張子を除いたもの)
[2020/06/16 自分用に追記ここまで]

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Bash on Windows Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${command:extension.vscode-wsl-workspaceFolder}/${fileBasenameNoExtension}.exe",
            "args": ["<", "${command:extension.vscode-wsl-workspaceFolder}/${fileBasenameNoExtension}.in"],
            "stopAtEntry": false,
            "cwd": "${command:extension.vscode-wsl-workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "pipeTransport": {
                "debuggerPath": "/usr/bin/gdb",
                "pipeProgram": "${env:windir}\\system32\\bash.exe",
                "pipeArgs": ["-c"],
                "pipeCwd": "/"
            },
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "sourceFileMap": {
                "${command:extension.vscode-wsl-workspaceFolder}": "${workspaceFolder}"
            },

        }
    ]
}
```

[2020/06/16 自分用に追記]
 `"args"` の設定値に`${fileBasenameNoExtension}`を使用した。(現在開いているファイル名から拡張子を除いたもの)
[2020/06/16 自分用に追記ここまで]

```json:tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "C:\\Windows\\System32\\wsl.exe",
                }
            },
            "command": "g++",
            "args": [
                "-std=gnu++1y",
                "-g",
                "-O0",
                "-I/opt/boost/gcc/include",
                "-L/opt/boost/gcc/lib",
                "-o",
                "`wslpath",
                "'${workspaceFolder}\\${fileBasenameNoExtension}.exe'`",
                "`wslpath",
                "'${file}'`",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```
以上。
GradleでCodeArtifactの認証をプロファイル由来の自動化

## はじめに
レポジトリがマネージドになってすこぶる便利になりそうです。
が、[公式ドキュメント][doc]を読むと環境変数にトークンをロードしておけと、、、
毎回そんなめんどくさいことやれと？やりたくない！

というわけでAWS CLIで設定されてるであろうプロファイルから読むように書いてみました。

## 前提
任意のCodeArtifactにアクセスできるAWS CLIのプロファイルが設定済みのこと

## 使い方
以下を丸ごとコピー
※直接ファイルで落としたいときは[こっち][gist]

```build.gradle
buildscript {
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath 'com.amazonaws:aws-java-sdk-codeartifact:1.11.801'
	}
}

import com.amazonaws.services.codeartifact.AWSCodeArtifactClient;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.codeartifact.model.GetAuthorizationTokenRequest;
def setAuthorizationToken = {mavenArtifactRepository, profile ->
	def domainLevels = mavenArtifactRepository.url.getHost().split('\\.')
	def artifactDomain = domainLevels[0].substring(0,domainLevels[0].lastIndexOf("-"))
	def artifactOwner = domainLevels[0].substring(domainLevels[0].lastIndexOf("-")+1)
	def region = domainLevels[domainLevels.length -3]

	def client = AWSCodeArtifactClient.builder()
		.withCredentials(new ProfileCredentialsProvider(profile))
		.withRegion(region)
	.build();

	def result = client.getAuthorizationToken(new GetAuthorizationTokenRequest()
		.withDomain(artifactDomain)
		.withDomainOwner(artifactOwner)
	);

	mavenArtifactRepository.credentials {
		username "aws"
		password result.authorizationToken
	}
}


apply plugin: 'java'
apply plugin: 'eclipse'

repositories {
	maven {
		url 'https://trial-558497472117.d.codeartifact.us-west-2.amazonaws.com/maven/trial/'
		setAuthorizationToken(owner, "profileName")
	}
}

dependencies {
	implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.801')
	implementation 'com.amazonaws:aws-java-sdk-codeartifact'
}


```

以下の```ここ```をプロファイル名に置き換えればOK

```groovy
setAuthorizationToken(owner, "ここ")//←プロファイル名
```


## 参考先
* [公式ドキュメント][doc]

[gist]:https://gist.github.com/tac-yacht/f6d6e6c760e0485c0ef66e0ed41252ce
[doc]:https://docs.aws.amazon.com/codeartifact/latest/ug/env-var.html

## 余談
s3だったらgradleのwrapperの中に入ってる(```lib\plugins\aws-java-sdk-s3-1.11.xxx.jar```)からbuildscriptで引いてこなくていいんだけどなぁ、、、
buildscriptのaws-java-sdk-codeartifactが最初引けないから完全CodeArtifactのみのスタンドアローンにはできない。ローカルにキャッシュした後ならいけるんだけども、、、
AWS 管理ポリシーに```AWSCodeArtifactReadOnlyAccess```的なやつはまだなかった。（将来できる？
CodeArtifactだけじゃ足りなくて、```sts:GetServiceBearerToken```も必要なので注意を！
Railsビギナーやってみた【第1章】

##この記事について
ProgateのWeb開発コースを終えた後に始めたRailsチュートリアルが難しすぎて途方に暮れていた私が、Railsビギナーを通して、アプリ開発ができるようになるための学習記録です。

##Railsビギナーとは
[Railsビギナー](https://maki-nomad.com/rails-beginner/)
フリーランスでプログラマーをされている、真木裕也さんが作成されたプログラミング初心者向けの教材です。
第0章〜３章まであり（2020/6/13現在）、丁寧な説明に沿って質問サイトを作っていきます。無料とは思えない丁寧さと内容です。感謝。。。




##第1章「質問投稿機能を作ろう」
（第0章については、VSCodeの簡単なセットアップですので省きます）

desktopに移動し、beginner_appを作成（`rails new`コマンド）
フォルダを開き`rails s`起動

#####⚠️rails s起動時のエラー
`Please run rails webpacker`などと言われることがあります。起動が成功するまでとにかく言われた通りのものをインストールしていきます
➡️`zsh: command not found: yarn`
yarnが無いよと言われました。Homebrewをインストールし、brewからyarnをインストールします（`brew install yarn`）
終わったらバージョン確認しておきます（`yarn --version`）

無事起動後localhost:3000にアクセスするとあの画面が出ます

####とりあえずページを作る
・questionsコントローラーの作成（`rails g controller コントローラ名`）
・questionsコントローラーにindexアクションを追加
・ルートファイルに追加(`get "/questions", to: "questions#index"`)
・indexアクションに対応するビューの作成(viewフォルダ内部のquestionsフォルダにindex.html.erbを手動作成)
・作成したら`<%= @test %>`を追加　←同名のコントローラーで定義した@testをビューで使用可能

####質問を保存するデータベースを用意
●モデル（データベースとのやりとりを行う）の作成　`rails g model モデル名`
※モデル名は単数
・マイグレーションファイルを開き、テーブルを追加する `t.型名 :カラム名`　
　※カラム＝データの種類（タイトル・投稿時間など）
　※データ型：stringは255字以下の文字列、textはstringよりも長い文字列
・データベースに反映させる　`rails db:migrate`

####質問の新規作成機能を作る
●newアクションを定義しルーティング、ビューを作成
　⭐️ビューのコードにある`<%= form_with(model: @question, local: true) do |f| %>`って何？
　データベースに保存するためのフォームを作成するコード。
　[localの意味](https://qiita.com/hayulu/items/5bf26656d7433d406ede)
　`do |f|`については「ブロック引数」で検索。

・作成したフォームの送信ボタンは/paramsにpostでアクセスするようになっているため、その通りルーティングを行う

●createアクションを定義する
・Question.new(question_params)によって、フォームに送られた値でインスタンスが作成されるので、それを@questionに代入する
➡️@question.saveでデータベースに保存
➡️保存に成功すれば新規作成ページに移動(`redirect_to"/questions/new"`）、そうでなければviews/questions/new.html.erbファイルを画面に表示する（`render "questions/new"`）

●フォームで受け取る要素を指定
・Question.newの引数となるquestion_paramsを、privateメソッド下に定義する
　ストロングパラメータ（`params:require(:モデル名).permit(:テーブル名)`）を使うと、指定されたパラメータのみ受け付けることができる

●適切なデータか検証する–バリデーション
・questionモデルのファイルで`validates :テーブル名`に続けて指定する
　指定する内容は　入力必須にする`presence: true`、文字列の長さ`length: { maximumまたはminimum: 数値 }`などがある
・createアクションとapplicationビューにflashを追加する
　⭐️[:notice]キー・[:alert]キーについて：通知・警告用にあらかじめ用意されているが、キーには好きな名前を付けられる

####質問表示機能を作る
●showアクションの定義とルーティング、ビューファイルの作成
●localhost:3000にアクセスしたときのルーティング：`root to: "URL"`


第１章はここまで。

***
###学んだこと

基本的なことが頭に入っていないことに気づかされ、もっとしっかりしようと思いました（小並感）

●ルーティング➡️コントローラー➡️ビューの流れで処理が行われる
●newアクションで空のインスタンスを変数に代入し、その変数をビューで引数として渡すことで新規作成と判断してくれる（インスタンスが空である＝新規作成）
●form_withヘルパーでフォームを簡単に作成できる　text_fieldは１行、text_areaは複数行のフォーム
●ストロングパラメータ：セキュリティを強固にするために、指定されたパラメータのみ受け付ける仕組み　
●redirectした時はflash、renderの時はflash.nowを使う
●redirect_toの後は"URL"で、新しいリクエストを発行する。入力したフォームが空欄になる
　redirectの後は"ビューのファイル名"で、ビューを呼び出す＝コントローラを介さない。入力内容が保持される
ssh-config作成とssh-configのホスト一覧取得コマンド作成

# SSHコマンドの簡略化
ssh接続を行う場合は、以下のコマンドを実行することになる。

```bash
ssh -i 証明書パス ユーザ名@IPアドレス
```

よく使う場合はconfigを使うと、以下のコマンドで実行できる。

```bash
ssh ホスト名
```

# configファイル作成
格納先　→　　`~/.ssh/config`
ファイル内容は以下の通り。

```sh:config
Host DataLamda_Outer
    HostName IPとかDNS
    User 接続ユーザ
    Port 接続先ポート
    IdentityFile 鍵ファイル
```

# configのホストわからなくなる人は
以下のように、接続ホスト一覧を取得できるシェルを作成した。

```sh:sshls
#!/bin/sh

SSH_CONFIG=$HOME/.ssh/config

echo "known hosts:"

if test -e $SSH_CONFIG; then
    for i in `grep "^Host " $SSH_CONFIG | sed s/"^Host "//`
    do
        echo "  ${i};"
    done
else
    echo "nothing ssh-lsconfig file"
fi
```

コマンドにするための手順は以下の３つ。
1. ファイルに権限付与　→　`chmod 755 sshls`
2. alias登録　→　bashの人はbash_profile, fishの人はfish.configに`alias sshls '~/bin/sshls'`を記載
3. コンソール再起動

実行結果はこんな感じ

```bash
$ sshls                                                            土  6/13 23:08:17 2020
known hosts:
  DataLamda_Outer;
```
Appleに似たページを作る【HTML下準備編】 ~1日10行コーディング 〜~

## 10日目

前回までのは一区切りついたので、今日からはまた別のものを作ろうと思います。
一旦初心に帰って普通にHPを作ろうかなって....
ただ、テーマがないとなんのページ作るかで求められるものが全然違うので、自分が最近ハマっているYoutuberの紹介ページをAppleのHPのMacの部分を真似て作ろうかなと思います。

Mac - Apple（日本）
https://www.apple.com/jp/mac/?afid=p238%7CsKItUSOhE-dc_mtid_18707vxu38484_pcrid_396708056104_pgrid_17843521221_&cid=aos-jp-kwgo-Mac--slid---product--

![スクリーンショット 2020-06-13 22.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/7ea29c84-2620-e82c-6d98-d45feeb3b42a.png)

↑
こんな感じで、Macの画像のところが動画のサムネになるイメージ...!!

### 【技術テーマ】
ホームページ制作

### 言語
* HTML
* CSS

### 目標成果物
サイトのベースとなるHTMLを記述する!


### コードと資料

もうできる人からしたらそんなところ？って言う部分を今日はやっていきます。

1. HTMLファイルを用意しベースを作成

まずはHTMLの基礎の基礎となる部分を用意します。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>僕のすすめる料理動画3選</title>
</head>
<body>
    
</body>
</html>
```

2. 動画情報を埋め込む

現状ではほんとに真っ白なページなのでタイトルの通りおすすめの動画を3つ埋め込みます。

```index.html
<body>
    <h1>僕のすすめる料理動画3選</h1>
    <h2>料理研究家が辿り着いた最高の一皿【至高のペペロンチーノ】</h2>
    <iframe width="560" height="315" src="https://www.youtube.com/embed/Jx-tqntWPCM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
    <h2>もう、醤油には戻れない【悪魔の万能ネギTKG】</h2>
    <iframe width="560" height="315" src="https://www.youtube.com/embed/MQFEBR4Eo1Y" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
    <h2>もう市販のサラダチキンはいらない【レンジサラダチキン】</h2>
    <iframe width="560" height="315" src="https://www.youtube.com/embed/7il2sEYzMYA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</body>
```

上記の情報記述することで一旦動画の情報を埋め込むところはできました。
![](https://i.imgur.com/D6LBzhs.png)


ただ、こんなのほんとにひどいのでここからAppleのページに寄せていきたいと思います....
プログラミング初心者はこの本を買えばOK

## この内容について
この内容は、プログラミングをまだやり始めたばかりの人、これからプログラミングを学びたい人で本で勉強したいけど、どの本選べば良いかをまとめた記事です。

## この本を買えばOK
### 1冊ですべて身につくHTML&CSS Webデザイン入門講座
この本では、HTMLとCSSを学ぶ事が出来て、かなり新しめの情報も多いので、仕事でもそのまま使っていけます。
フルカラーで分厚すぎず、まとまっているのが有難いです(^^)
![1冊ですべて身につくHTML&CSS Webデザイン入門講座.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/2304552f-0960-09f4-acf6-6c317369e813.png)

### 確かな力が身につくJavaScript超入門
JavaScriptの勉強はまずこの本で学ぶのをオススメします。
タイトル通り、この1冊で確かな力が身につきます。
![確かな力が身につくJavaScript超入門.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/3c6e54a2-ef4f-ec5f-5a00-29d245fbe617.jpeg)

### ふりがなプログラミング シリーズ
プログラミングをふりがなをつけて解説してくれるので、初心者にとってこれ以上ないくらい分かりやすくなっています。
現在までで、JavaScript・PHP・Ruby・Java・Unityなど様々な言語の本が揃っています。
たぶんこれ以上分かりやすく書いてる本はないかな(^^)
![ふりがなプログラミング.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/b32d7966-055e-dd48-c00c-c1a977819677.jpeg)

## まとめ
今回紹介した本は、僕個人の感覚でのわかりやすさでのオススメで、人によって合う合わないあるでしょうから、まずは書店に行って中身を少し見てから買うかどうか決めると良いでしょう。
僕もプログラミングの情報を発信してるので、Twitter・Qiitaをフォローして頂けると嬉しいです。

この記事が良いと思った方は、LGTMをしていただければ嬉しいです！
フォローも是非お願い致します(^^)
[PHP]静的・動的について※学習用メモ

# 静的・動的について
業務をしつつプログラミングを勉強し始めて、静的・動的について当たり前のように使っているがしっかり調べられておらず、整理しようと思ったので整理。

## 静的とは
・静的型付け（せいてきかたづけ、英: static typing）とは、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチンの引数や返り値などの値について、その型が、コンパイル時など、そのプログラムの実行よりも前にあらかじめ決められている、という型システムの性質のことである。(wikipediaより抜粋)

### 小難しいので自分なりに整理
・プログラム実行時に値が切り替わったりせず、**事前に設定された状態を保持し続けている**状態、というか型

PHPで静的なプロパティを宣言する際、こんな感じ。

```PHP:静的に変数を宣言
class test
{
    public static $A = 1;
}
```
上記のようにstaticを付けて宣言すると、静的に定義された状態となる。

staticで静的にクラスのプロパティやメソッドを定義すると、クラスをインスタンス化せずに用いることができる。
また、staticなプロパティは、インスタンス化されたクラスオブジェクトからアクセスすることはできない。
(staticなメソッドはアクセス可能。)

## 動的とは
・動的型付け（どうてきかたづけ、英: dynamic typing）とは、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチンの引数や返り値などの値について、その型を、コンパイル時などそのプログラムの実行よりも前にあらかじめ決めるということをせず、実行時の実際の値による、という型システムの性質のことである。(wikipediaより抜粋)

### こちらも小難しいので自分なりに整理
・静的のように状態を保持するのではなく、**プログラム実行時の実際の値となる**型

静的に対して、動的な変数は中身がその時その時の状態で変わりますよ、ということ

```PHP:動的に変数を宣言
class test
{
    public $A = (初期値);
}
```

上記のようにstaticつけずに定義すれば、プログラムによって変数内の値が編集可能となる。

また、静的な定義に対し、動的なクラスのプロパティ、メソッドはインスタンス化しないとアクセスができない。

## まとめ

・静的な定義をすると、そのプロパティやメソッドは**事前に設定された状態を保持し続ける**

・動的な定義をすると、そのプロパティやメソッドは**プログラム実行時の実際の値がそのものの値となる**

基本を一つ一つ着実に学習していき、よりよいコードを書けるようになっていきたいですなぁ。。。(勉強あるのみ)
gitのコマンドをよく忘れるので、自分のメモ用に記録しておく

##環境
・macOS Catalina 10.15.5
・iTerm2 3.3.11

###最初に使うコマンド
```git init```

###最初にコミットする
1.``` git status ```
2.``` git add . ```
3.``` git status ```
4.``` git commit -v ```

###GitHubにリポジトリを作る
GitHub:https://github.com/

RepositoriesからNew　Repositoriesをクリックして作成

remoteリポジトリを登録 ```git remote add origin https://github.com/ユーザー名/レポジトリ名 ```

githubにpush　```git push -u origin master```


###ブランチを切る
ブランチの確認 ```git branch```
開発用(develop）ブランチを切る ```git branch develop```
機能用（feature）ブランチを切る　```git branch feature```

###ブランチを切り替える
developブランチに切り替える ```git checkout develop```

作成して切り替えるコマンド
```git checkout -b （新ブランチの名前) ```

###ブランチを統合するmasterブランチにfeatureブランチをマージする(Auto merge)
```git checkout master```
```git merge　feature　```

簡単にこれだけ。
適当だけど、初心者が使うのはこれくらいな気がする

logを見るには
```git log ```

簡単にみるには
```--oneline```
【Rails6】Dockerコンテナを再起動しないとソースコードが反映されない

#いちいちコンテナの再起動めんどくさすぎ問題
環境構築は初学者には難しいと言われていたがなんとかDockerでの環境構築に成功で歓喜！！

せっかく環境構築したしAPIでも叩いてみるか、、と思いコードを書いていたらリロードしても変更が即時反映されない、、**docker-compose restart**でコンテナ再起動したら変更反映されるけどコード変更のたびにこれするの時間もったいなすぎる、、これの解決策を備忘録として投稿させていただきます。
やり方はめちゃくちゃ簡単です。

##環境
- Windows 10 Pro
- Docker for Windows
- Rails 6.0
- Ruby 2.7
- MySQL8.0

##方法
Railsのアプリケーションファイルにある```config/environments/development.rb```の末尾の方にある

```ruby

config.file_watcher = ActiveSupport::EventedFileUpdateChecker
```

を

```rb
config.file_watcher = ActiveSupport::FileUpdateChecker
```

に変更するだけです！

##補足説明
ファイルの変更を検知しているのは```config/environments/development.rb```の```file_watcher```という部分です。
この設定ファイル内で```config.file_watcher = ActiveSupport::EventedFileUpdateChecker```によって変更イベントを検知しています。（名前にもEventedとありますね。）

しかし、Dcokerによる環境構築ではvolumeで共有ファイルとしてホスト側のディレクトリを仮想環境にマウントしており、この方式だと変更イベントが発生しないようです。故にファイルの変更を検知することができず、コンテナを再起動しないとソースコードの変更がされないという事態になります。

```config.file_watcher = ActiveSupport::FileUpdateChecker```はソースコードの更新をサーバー起動中にチェックする機能なのでこれでviewだけでなくController処理の変更も再起動せずによくなります。

#最後まで読んでいただきありがとうございます。
今後ともアウトプットの一環として投稿させていただきます。
一人でも多くの方の問題解決に役立てれば幸いです。
なにか間違った点があればご指摘いただけると幸いです。