OmniAICreator/Qiita-1.07M huggingface dataset:
【UE4】2つ以上のボタンを組み合わせたコマンド入力

<h2>2つ以上のボタンを連続で入力して発射するコマンドの実装</h2>

コナミコマンドの解説である
http://unrealbussan.hatenablog.com/entry/2015/11/21/113517
こちらの記事を参考にさせていただきました。ただ、これですと、入力の間に時間が経ってもコマンドは成立します。
格闘系のコマンドでは<strong>素早く</strong>入力する必要があると思うので、制限時間をつけました。
ここでは1秒としていますが、実際はもっと短い数値にするほうがいいでしょう。
![5_コマンド.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/2a45ae73-2d37-f20c-176d-18564b6ab140.png)
全体図では見にくいと思うので、3つに分けて解説します。
![5_コマンド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/061d93e9-54bf-03e6-fd0d-638026497c56.png)
キーの入力があったとき、入力されたキーがコマンドの最初のキーと一致したときtrueになり、一致しなければCommandVarを0にします。
なお、AnyKeyはゲームパッドの入力でも判別できます。
![5_コマンド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/35104a25-8542-e72a-a19c-2ef630bb1ce1.png)
制限時間を設け、制限時間以内に次の入力がなされ、コマンドと一致したときに、CommandVarに1を加えます。
一致しなければ、CommandVarを0にします。
![5_コマンド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/f73baff2-a707-0121-7338-36f5bfc71b8f.png)
制限時間内の入力の数が、コマンドの長さと一致すればCommandVerを0にしてtrueの処理、
一致しなければ、時間切れとして、falseの処理に移ります。

もっといい方法があれば、教えて下さい。
変数に<strong>input command entry、input commande sequence</strong>というのがあるので、
これを使えばもっと簡単に実装できるのかもしれませんが、ググっても何も出てこないので、
とりあえずこれを使ってみようと思います。

動画はあまり意味なさそう。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">コマンド入力<a href="https://twitter.com/hashtag/UnrealEngine?src=hash&amp;ref_src=twsrc%5Etfw">#UnrealEngine</a> <a href="https://twitter.com/hashtag/UE4Study?src=hash&amp;ref_src=twsrc%5Etfw">#UE4Study</a> <a href="https://t.co/0IlOwM6AuO">pic.twitter.com/0IlOwM6AuO</a></p>&mdash; 特命社長 (@tokumeishatyo) <a href="https://twitter.com/tokumeishatyo/status/1231851646646247425?ref_src=twsrc%5Etfw">February 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Docker + Haskell の Hello Worldビルド

Dockerの中で Haskell をビルドして、Hello World することがゴールです。
手順をシンプルに書いていきます。

まず Docker と Docker-compose を入れておきます。これは省略します。


# Dockerディレクトリを作成

以下のようにファイルを作ります。

```
./docker
./docker/.env
./docker/docker-compose.yml
./docker/haskell
./docker/haskell/Dockerfile

./src/
./src/haskell
```

# Dockerの設定

## Docker全体用の設定

今回はコンテナは1つしか作りませんが、
今後の拡張を考えたつくりにはしておきます。
常にクセづけておくことで、迷うことがなくなります。

```shell:.env
COMPOSE_PROJECT_NAME=haskell-docker-starter
```

## Haskellビルド用コンテナ

```docker:docker-compose.yml
version: '3'
services:

  haskell:
    build: ./haskell
    container_name: '${COMPOSE_PROJECT_NAME}-haskell'
    tty: true
    volumes:
      - "../src/haskell:/opt/src"
```

```Dockerfile:Dockerfile
FROM centos:centos7

RUN curl -sSL https://get.haskellstack.org/ | sh

# stackインストール
RUN stack upgrade
RUN stack --version

# stack の初期設定
RUN stack setup
```
バージョン表示もいれておくと、ビルド時に確かめられて便利です。

# Dockerコンテナ作成

```shell
cd ./docker
docker-compose build
docker-compose up -d
```
これで Dockerコンテナが起動します。
docker-compose build せずとも、 up -d だけでもビルド一緒にしてくれているのですが、
それは気を利かせてくれているだけなので、動きを理解するためにも build してみましょう。


# Haskell の初期プロジェクト作成

```shell
docker exec -it haskell-docker-starter-haskell bash

# 以下 Docker の中
cd /opt/src
stack new sample-project
```

これにより、
./src/haskell/sample-project 
というフォルダができ、中にたくさんのファイル群ができています。

ちなみに Dockerコンテナ内からは、 /opt/src/sample-project でアクセスできます。

# sample-project のビルド

## 初期処理

stack init が必要です。
ホストOS以下のコマンドを実行すれば Docker内で stack init が動作します。

```shell
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src && stack init"
```

## ビルド

変更する度に行うビルドです。

```shell
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src && stack build"
```

どこかに実行ファイルができています。
なにかわかったら追記します。

# 実行

```shell
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src/sample-project && stack exec sample-project-exe"
# 出力結果: someFunc
```

これはなにかのファイルを読んで、実行パスを探してくれているみたいです。
なにかわかったら追記します。

# ソースコード編集

./src/haskell/sample-project/src がソースコードのようです。

```haskell:Lib.hs
module Lib
    ( someFunc
    ) where

someFunc :: IO ()
someFunc = putStrLn "someFunc"
```

"someFunc" をとりあえず "Hello World" に変更します。

そして ビルド、実行

```shell
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src && stack build"
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src/sample-project && stack exec sample-project-exe"
# 出力結果: Hello World
```

 これでホストOSの環境をいじらずに Haskell をビルド、実行することができました。

# github

https://github.com/dd0125/haskell-docker-starter

# 参考

Stackでやる最速Haskell Hello world! (GHCのインストール付き！)
https://qiita.com/igrep/items/da1d8df6d40eb001a561

ありがとうございます。
【初心者向け】Alexaカスタムスキルを作成してCognitoのユーザープールとアカウントリンクする手順

#はじめに
Alexaのカスタムスキルで認証が必要な外部サービスと連携するスキルを作成するには、外部サービスへの認証情報をどこかに保存する必要がありました。自身で認証情報を保管するサーバーを準備するのは難しいと思い、カスタムスキルの構築を諦めていましたが、AWS Cognitoのサービスを利用すれば個人レベルでも比較的容易に構築が可能であることがわかりました。しかし、いざつくりはじめてみると参考に出来るページが少なく構築まで苦労したため、自身の覚書としても使えるように手順をまとめました。

##構築するもの
認証が必要な外部サービスのデータを利用した、Alexaのカスタムスキルを構築する
※ただし今回の手順では外部サービスへ連携するところまでは行いません

##利用する環境など
- Alexaカスタムスキル
- Lambda（Python3.8）
- Cognito

##手順とリンク
[1. Alexaでカスタムスキルの呼び出し部分を作成](https://qiita.com/kurisaka/items/24f5dfe54d718e33c1c2)
[2.Lambda Python3.8でAlexaから呼び出される関数を作成](https://qiita.com/kurisaka/items/00451cb7d5551a79b68d)
[3.LambdaとAlexaを連携させてカスタムスキルの完成](https://qiita.com/kurisaka/items/e8dcadb94053a7ddc266)
[4.Cognitoで認証情報を保存するユーザープール作成](https://qiita.com/kurisaka/items/7235d058211367aaa96f)
[5.AlexaとCognitoをアカウントリンクして認証情報をLambda関数で利用できるように修正](https://qiita.com/kurisaka/items/6404f49b4d5134ee8e74)
[font-awsomeのエラー]File to import not found or unreadable: font-awesome-sprockets.のエラーについて

#１.エラーの様子

<img width="1265" alt="スクリーンショット 2020-02-24 15.34.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/c7f73cb9-995b-1ed0-1351-e40417470ecd.png">

デスクトップ（裏側で製作していたファイル）では動いていたデータをホームディレクトリ（本番のファイル）に移した時上記のようなエラーが出ました。

#2.エラーの原因

###1.一般的な原因
・Gemfileのなかに`gem 'font-awesome-sass'`が抜けている

・app/stylesheets/application.scssの中に`@import "font-awesome-sprockets"`と`@import "font-awesome";`が抜けている

###2.見落としがち（特殊）な原因
・`@import "font-awesome-sprockets"`とするところを`@import "font-awesome-compass";`としている。またはその逆。

・別フォルダで作成したファイルを移すときに、`rails s`をしたままgemを追記し、`bundle install`している

#3.解決方法
###1.Gemfileのなかに`gem 'font-awesome-sass'`が抜けている
Gemfileに`gem 'font-awesome-sass'`を追記して下記コマンドを打ちましょう

```
$ bundle install
```

###2.app/stylesheets/application.scssの中に`@import "font-awesome-sprockets"`と`@import "font-awesome";`が抜けている

app/stylesheets/application.scssの中に下記２行を追記しましょう

```
@import "font-awesome-sprockets"
@import "font-awesome";
```

###3.`@import "font-awesome-sprockets"`とするところを`@import "font-awesome-compass";`としている。

githubに記載されている公式の使用方法（readmeの部分）を読んで、どちらが自分の使用すべきコマンドか確認してみましょう。公式は下記urlです。

https://github.com/FortAwesome/font-awesome-sass

###4.別フォルダで作成したファイルを移すときに、`rails s`をしたままgemを追記し、`bundle install`している
・Gemfilはサーバーを起動したままだと反映されないため、railsを再起動しましょう。コマンドは`controll+c`でrailsサーバーを落とし、再度`rails s`をしましょう

・上記でうまくいかない場合、他のもともとあったgemと干渉しあっている可能性があるためGemfile.lock(gemの実行コードが自動生成されたファイル)を全て削除し`bundle install`をしましょう。その際もサーバーを起動中の方は`controll+c`でrailsサーバーを落とし、再度`rails s`をしましょう
Maya でメッシュにアサインされているマテリアルを outliner に表示する

## 背景

メッシュのマテリアルにすばやくアクセスしたい.

いろいろコネクションがつながっていると, attribute editor のタブをたくさんスクロールせねばならずつらい.

Hypershader は開くと重い...

## 方法

https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2018/ENU/Maya-Basics/files/GUID-4B9A9A3A-83C5-445A-95D5-64104BC47406-htm.html


Outliner で Display -> Assigned Material で, Outliner にマテリアル表示されます!

少なくとも 2018 では使えました. 古い Maya だとダメかも?
KaggleのElectric Motor Temperatureの訳

以下のデータセットタスクを解くための個人的メモです。
https://www.kaggle.com/wkirgsn/electric-motor-temperature

# Context訳
このデータセットは[PMSM(永久磁石同期電動機)](https://ja.wikipedia.org/wiki/%E6%B0%B8%E4%B9%85%E7%A3%81%E7%9F%B3%E5%90%8C%E6%9C%9F%E9%9B%BB%E5%8B%95%E6%A9%9F)を試験環境にて動作させ、いくつかのセンサーから取得したデータから構成されています。
対象のPSMSは、或るドイツのOEM企業のプロトタイプ製品であり、テスト環境での測定は[パダボーン大学のLEA学部](https://ei.uni-paderborn.de/en/lea/)で行われました。データはマイルドに匿名化されています。

# Content訳
　すべての記録は2Hzでサンプリングされました。データセットは複数の測定結果であり、それぞれの測定はprofile_id列で示されるIDでわけられています。それぞれの測定では、1~6時間あります。

　モーターは、基準速度と基準トルクを示す手動で設計された駆動サイクルによって励起されます。標準的な基準速度と基準トルクに沿って制御した結果の電流が、[d/q座標](https://nagaoka-md.co.jp/2019/09/10/pmsm-foc-no3/)でid列とiq列にて示され、電圧は同じくd/q座標でud, uqにより示されます。motor_speedとmotor_torqueは、その制御方式を行った際に実際に観測されたモータ速度とトルクです。

ほとんどの駆動サイクルは実際の駆動サイクルを模倣するために、スピード-トルク空間においてランダムウォークとなっています。

# Inspiration訳
　もっとも興味深いターゲット特徴量はロータ温度(pm)、ステータ温度(stator_*)、トルクです。特にロータ温度とトルクは実際の自動車では精度良く、そして経済的にも測定ができません。
　ロータ温度の良い推定器を得ることは、省材料のモータを作ることを手助けでき、モータの性能を最高に引き出せる駆動方法を獲得できます。
　制度の良いトルク推定ができればモータをより正確に、適切に制御でき、パワーロス、発熱を防止できます。

#Data訳
データの各行は2Hzサンプリングにより取得されたスナップショットです。各測定セッションはprofile_idにより分けられます。

| id||
|:-----------------|------------------:|
|ambient|環境温度。ステータ付近の温度センサにより測定。|
|coolant|モータは水冷で、そのクーラントの温度。出口で測定。|
|u_d|電圧。dp座標のd部|
|u_q|電圧。dq座標のq部|
|motor_speed|実測モータスピード。|
|torque|実測トルク。|
|i_d|電流。dp座標のd部|
|i_q|電流。dq座標のq部|
|pm|ロータの永久磁石の温度。赤外線サーモグラフィにより取得。|
|stator_yoke|ステータの外郭部の温度。温度センサにより取得|
|stator_tooth|ステータのtooth(電磁石以外)部の温度。温度センサにより取得。|
|stator_winding|ステータのwinding(電磁石)部の温度。温度センサにより取得。|
|profile_id|測定セッションのID.一つのセッションから他のセッションを推定しないこと。独立性が強いです。|

# 個人的感想
　車業界ってカメラ映像からの物体認識くらいにしか機械学習を使っていないイメージだったので、新鮮な内容だなと思いました。もちろん工場での生産などには用いているんでしょうけど。モータ内部の温度をサーモグラフィで測定するってどうやってるんですかね？筐体を一部透明にするとか？
Jetson Nano に Docker ＆ docker-compose をインストールする方法

# 1. はじめに
今回は、自分自身への備忘録を兼ねて、Jetson Nano に Docker ＆ docker-compose をインストールする方法を、お伝えしたいと思います。

- 参考：[NVIDIA Jetson Nano - Install Docker Compose](https://blog.hypriot.com/post/nvidia-jetson-nano-install-docker-compose/)
- 参考：[やってみた Jetson nano Docker Compose インストール](https://qiita.com/class2glass/items/18b427b2936bbbd166c2)

# 2. この記事を読んでできること
- RJetson Nanoで Docker ＆ docker-compose を使えるようになる。

# 3. 注意事項
- Docker のアーキテクチャは、arm64（ARM 64ビット）版となります。

# 4. 必要なもの
- Jetson Nano
- インターネット環境

# 5. インストール済みの標準dockerの確認
- dockerは標準インストール済みのようです。
- ここでは、動作確認を済ませます。

```plaintext:コマンドプロンプト
// dockerのバージョン確認（dockerは標準でインストールされているみたいです）
$ docker -v
Docker version 18.09.7, build 2d0083d

// 自分のユーザをdockerグループに追加
sudo gpasswd -a $USER docker

// dockerの再起動
sudo systemctl restart docker.service

// 接続を一度閉じてから、再接続する
exit
```

# 6. docker-composeのインストール
- docker-composeのインストールをインストールします。

```plaintext:コマンドプロンプト
// ディレクトリ移動
$ cd /opt

// curlのインストール
$ sudo apt -y install curl

// pythonバージョンの確認
$ python --version
Python 2.7.17

// パッケージのアップデート
$ sudo apt update

// pipのインストール
$ curl -sSL https://bootstrap.pypa.io/get-pip.py | sudo python

// pipバージョンの確認
$ pip --version
pip 20.0.2 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

// 必要ライブラリのインストール
$ sudo apt -y install libffi-dev python-openssl libssl-dev

// 環境変数の設定
$ export DOCKER_COMPOSE_VERSION=1.24.0

// docker-composeのインストール
$ sudo pip install docker-compose=="${DOCKER_COMPOSE_VERSION}"

// docker-composeのバージョン確認
$ docker-compose -v
docker-compose version 1.24.0, build 0aa5906
```

# 7. dockerの動作確認

```plaintext:コマンドプロンプト
// OS再起動（念のため）
$ sudo shutdown -r now

// dockerの実行（ハローワールド）
$ docker run --rm hello-world
```

# 8. docker-composeの動作確認
- docker-compose.ymlファイルを作成し、ファイル保存する。

```yml:docker-compose.yml
version: "2"

services:
  app:
    image: hello-world

```

- docker-composeを実行する。

```shell:コマンドライン
// docker-compose.ymlファイルが存在することを事前確認
$ ls
docker-compose.yml

// docker-composeを実行
$ sudo docker-compose up
```

# 9. 参考：Dockerコマンド、docker-composeコマンド
- [（備忘録）Dockerコマンド](https://qiita.com/zono_0/items/7a25d283cd4b09d6ffb0)

# 10. おわりに
いかがでしたでしょうか？意外と簡単にDocker ＆ docker-composeをはじめることができたのではないかなと思います。
今回の記事が、みなさまの学習の参考になれば幸いです。

2020/02/24 TAKAHIRO NISHIZONO
Golang: ピーターからの問題を解いてみた

# 問題

下記の記事で紹介されているパズルを、Goで解いてみた。


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">これをjsで解けと会社の上司に言われたんですが全然わからん。<br>誰かわかります？笑 <a href="https://t.co/ZM6VmigaVQ">pic.twitter.com/ZM6VmigaVQ</a></p>&mdash; ケイセイ＠JavaScriptと仲良くなりたい (@keisei_otsuka) <a href="https://twitter.com/keisei_otsuka/status/1223841916405440512?ref_src=twsrc%5Etfw">February 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Ruby: Array#permutationでクイズを解いてみた
https://techracho.bpsinc.jp/hachi8833/2020_02_20/88192

Haskell: ピーターからの問題を解いてみた
https://techracho.bpsinc.jp/jhonda/2020_02_21/89044



# 回答

Go (go 1.12.1)
https://ideone.com/3AB5t2

```golang
package main

import "fmt"

func main() {
	n := 9
	ans := make([]int, n)
	for i := range ans {
		ans[i] = i + 1
	}

	evaluate := func(a []int) bool {
		div0 := a[1]*10 + a[2]
		div1 := a[4]*10 + a[5]
		div2 := a[7]*10 + a[8]
		return a[0]*div1*div2+a[3]*div0*div2+a[6]*div0*div1 == div0*div1*div2
	}

	// （開発用）生成したpermutationの総数を確認
	cnt := 0
	_ = cnt

	var permutate func(int)
	permutate = func(s int) {
		if s+2 < n {
			permutate(s + 1)
		} else {
			if evaluate(ans) {
				fmt.Println(ans)
			}
			cnt++
		}
		for i := s + 1; i < n; i++ {
			ans[s], ans[i] = ans[i], ans[s]
			permutate(s + 1)
			ans[s], ans[i] = ans[i], ans[s]
		}
	}

	permutate(0)
	// fmt.Println(cnt) // must be n!
}

```
バイナリのダンプを2進数で出力し、またバイナリファイルに戻す

# Linuxコマンドだけでなんとかしたい!

バイナリファイルのダンプ結果を2進数で表示させたいときがありました(linuxコマンドのみで)。
その時にやった内容を紹介します。
(他にいい方法があるのかもしれません。)

まず、以下のようなシェルスクリプトを用意。

```sh:hex2bin.sh
#!/bin/bash

hexdump -v -e '/1 "%02X\n"' $1 | awk '{print substr($1,1,1) " " substr($1,2,1)}' | awk -f hex2bin.awk 
```

##### 説明

まず最初の hexdumpコマンドで1バイト単位で出力します。

```sh
hexdump -v -e '/1 "%02X\n"' $1
```

出力例

```terminal
$ hexdump -v -e '/1 "%02X\n"' file
7F
45
4C
46
02
01
01
00
$
```

で、この出力結果を awkにわたしてあいだに空白を入れます。

```terminal
$ hexdump -v -e '/1 "%02X\n"' file | awk '{print substr($1,1,1) " " substr($1,2,1)}' 
7 F
4 5
4 C
4 6
0 2
0 1
0 1
0 0
$
```

この出力結果をまたawkにわたします。今度は -f オプションで以下のスクリプトを指定します。

```awk:hex2bin.awk
function hex2bin(shex) {
    bins["0"] = "0000";
    bins["1"] = "0001";
    bins["2"] = "0010";
    bins["3"] = "0011";
    bins["4"] = "0100";
    bins["5"] = "0101";
    bins["6"] = "0110";
    bins["7"] = "0111";
    bins["8"] = "1000";
    bins["9"] = "1001";
    bins["A"] = "1010";
    bins["B"] = "1011";
    bins["C"] = "1100";
    bins["D"] = "1101";
    bins["E"] = "1110";
    bins["F"] = "1111";

    return bins[shex];
}

{
    print hex2bin($1) " " hex2bin($2);
}
```

これで以下のような出力ができます。

```:sample.txt
0111 1111
0100 0101
0100 1100
0100 0110
0000 0010
0000 0001
```

## 出力結果を戻してみる

ここまでできたので、せっかくだからlinuxの標準コマンドだけでバイナリ形式に戻してみます。
以下のようなawkスクリプトを用意してみました。


```awk:bin2hex.awk
function bin2hex(sbin) {
    hex["0000"] = "0";
    hex["0001"] = "1";
    hex["0010"] = "2";
    hex["0011"] = "3";
    hex["0100"] = "4";
    hex["0101"] = "5";
    hex["0110"] = "6";
    hex["0111"] = "7";
    hex["1000"] = "8";
    hex["1001"] = "9";
    hex["1010"] = "A";
    hex["1011"] = "B";
    hex["1100"] = "C";
    hex["1101"] = "D";
    hex["1110"] = "E";
    hex["1111"] = "F";

    return hex[sbin];
}

{
    printf "echo -en \"\\x%c%c\" >> hoge.bin\n",bin2hex($1),bin2hex($2)
}
```

これで

```
0111 1111
```

という文字列が

```
echo -en "\x7F" >> hoge.bin
```

というechoコマンドに変換されます。
以下のように、てきとうなファイル名にリダイレクトをして、そのファイルを実行するとバイナリファイルが出力されます。

```
$ awk -f bin2hex.awk sample.txt > text2bin.sh
$ bash text2bin.sh
```
コロナウィルスの感染者数を真面目にシミュレーションしてみたら相当やばかった

コロナウィルスの感染者数を真面目にシミュレーションしてみました。

https://www.dropbox.com/s/m3e4yvwelskwr86/COVIT19_SIM.xlsx?dl=0

結論を言うと「屋形船から1か月放置しちゃったからもう手遅れ」という話でした。後は祈るだけです。

１．シミュレーションの条件
（１）初期条件
下記の報道発表より
https://www.mhlw.go.jp/content/10906000/000596281.pdf
1月18日の新年会（屋形船）の段階で、国内に一定数の感染者がいたと推定される。
初期条件としてこの日に100名の感染者が発生していると想定した。

（２）感染者が倍増するのにかかる日数
120万人（人口の１％）以下は2.4日とした。（下記より）
https://www.medrxiv.org/content/10.1101/2020.02.07.20021154v1
感染拡大後のエビデンスはないが、本シミュレーションでは120万人以上の感染者の場合は5日とした。

（３）潜伏期間
下記より5.8日と推計される。本シミュレーションではすべての患者が6日後に発症するとした。
https://www.kansensho.or.jp/ref/d77.html

（４）感染者の内、発症する割合
７０％とした。

（５）重症化までの期間
患者ごとに個人差があるが、下記の症例の内、発症～肺炎で入院日数が平均9日程度となっていることから、感染から重症化まで15日と推定。
https://www.mhlw.go.jp/stf/houdou/houdou_list_202002.html

シミュレーションではすべての患者が感染から15日後に発症するとした。

（６）重症化率
下記の通り

>中等症（呼吸困難、呼吸回数≧30 回/分、SpO2≦93%、PaO2/FiO2＜300 及び/または肺陰影の急速な悪化）が 13.8%、重症（呼吸不全、ショック及び/または多臓器不全）が 4.7%
https://www.naika.or.jp/jsim_wp/wp-content/uploads/2020/02/Novel-coronavirus-COVID-19-disease.pdf

中国での症例は軽症患者の多くが検査を実施していないと思われるため実際はこれより低いと推定されるが、今回のシミュレーションではこの数値（13.8＋4.7＝18.5％）を使用した。

（７）感染から死亡までの日数
20日とした。

（８）致死率
３％とした。

２．結果
https://www.dropbox.com/s/m3e4yvwelskwr86/COVIT19_SIM.xlsx?dl=0

（１）現在（2月24日段階）の推定感染者数
240万人

（２）重症化患者数が10万人を超えると推定される日
3月3日

３．考察
（１）15日後（3月10日）の推定重症化患者数について
推定患者数（240万人）の18.5％（44万人）が15日以内に重症化すると考えられる。
国内の病床数およそ156万7千床から考えて、受け入れが困難になると推定される。

（２）重症化患者の顕在化について
国内の病床数はおよそ156万7千床である。
入院が必要な重症化患者が10万人を超えると、地域によって明らかな肺炎患者の増加と病床の不足が顕在化すると考えられる。
また、この時点で727万人の感染者が存在すると推計される。この内18.5％（およそ135万人）は、15日以内に重症化する。
国内の医療体制はこの患者数を受け入れることは不可能であり、医療体制の崩壊は避けられない。

（３）肺炎患者の検査について
シミュレーション結果によると、2月24日段階で既に240万人の感染者が存在し、その内1万人程度が重症化していると推計される。

・重症化患者は今すぐに確定診断が必要
・国内感染者数の実態を把握し、今すぐ対策を取る必要がある

以上の理由から、国内で肺炎症状がみられる全ての患者に今すぐウィルス検査を実施するべきである。

（４）感染の拡大防止措置について
感染の実態を把握した後、しかるべき対策をただちに取る必要がある。

（５）感染拡大の顕在化について
通常の感染症の場合、感染者数が240万人にも増えた場合には、何らかの形で顕在化すると考えられるが、2月24日現在、そのような報告はない。

新型コロナウィルス（COVIT-19）においては、下記の条件が整っているため顕在化していないと推測される。
・初期においてはほとんど風邪と同じ症状である
・8割の患者は軽症のまま完治する
・重症化まで15日程度かかる
・重症患者は1万人程度と少ない
・潜伏期間が6日と長い
・不顕性感染者が存在する
javascript(node.js)でのsubstring

#substringメソッド(引数一つ)

```javascript
文字列 . substring ( 開始位置 )
```

・引数の「開始位置」から最後の文字までを返します。
・最初の1文字目の位置は0から始まります。
・Stringオブジェクトのメソッドです。

```javascript

const a = "あいうえお";

console.log(a.substring(2)); // うえお

console.log(a.substring(3)); // えお

console.log(a.substring(4)); // お

```
ノンコーディングなアプリ作成サービスGlideで、位置情報アプリを爆速で公開してみた。

##作成動機
[Glide](https://www.glideapps.com/) というノンコーディングでアプリが爆速で作成、公開できるサービスをつい最近知りました。

先日、はこだてFOODフェスタ2020の公式サイトについて、「店舗の詳細情報が、なんで画像やねん」とtwitterで呟いていました。すると、店舗の情報などが公式facebookにtextでまとまっている、と教えていただきました。

そこで、物は試しと、実際にアプリを作成してみました。まったくの初めてで、所要時間は約2時間です。

※　アカウント登録の手順はキャプチャを取ってないですが、簡単でした。

##データ準備

店舗名や住所、コメント、公式サイトURLなどをGoogleスプレッドシートにまとめていきます。元のtextがあるとはいえ、正直、この作業が一番手間でした。
<img width="876" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/9129eea5-4672-df5e-f2bd-1072c66209e1.png">

##アプリ作成
画面構成は画像にあるようにシンプルです。ドラッグ＆ドロップするものではないので詳細な作りこみは出来ないようです。しかし、無料でコードを書かずに実現できるのは脅威を感じました。
- Layout 開いているタブの設定
- Tabs　　タブの追加など
<img width="937" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/ab4b9f62-d865-727f-658f-2f5c79599ab2.png">

<img width="949" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/8d17f75e-125c-d720-f694-cfc2cf5e2d06.png">

##アプリ公開
Reload sheetを下にスクロールすると、Share appとありますのでクリックします。
(ブラウザはクロームなのですが、クリックし辛かったです。何故だろう？)

<img width="947" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/acef42fa-bb65-7346-590b-67d19db04c21.png">

画面右側の Copy link to app をクリックすると、公開用のURLが表示されます。

**ここまでコードを書きましたか？！**

プログラマ、商売あがったりですね。恐ろしいです。
[非公式はこだてFOODフェスタ2020](https://iwjbj.glideapp.io/)
<img width="883" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/a66a13b7-d78f-3394-93ec-4ec06f1fd265.png">
※　赤枠で囲った所は、初期設定時に紐づけたGmailの名前が表示されるようですので、本名を登録されている方は、うっかり個人情報を公開しないようにご注意ください。

##アプリ画面
上記のURLに表示されるQRコードをお手持ちのスマホで読み込んでいただくと、次の画像のように表示され、アプリが利用できます。

土地勘がない、雑に作っているので、位置情報と実際の表示については確認しておりません。

<img width="375" alt="IMG_3818.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/816b449d-6a05-034c-4dec-fbd53b10c6de.png">
<img width="375" alt="IMG_3819.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/87cf94fd-7c22-5b4f-71f1-db508c042823.png">
<img width="375" alt="IMG_3820.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/90e00423-51cf-0519-ac3d-d2714541c2b2.png">

##感想
プログラマ歴は正直2,3年しかない私でもあっというまにここまで作成、公開する事が出来ました。Excel状のデータから、情報を検索する、地図を表示する、と基本機能のアプリがこのレベルで作成できた事は驚異的です。
地方都市やNGO、公共団体等のイベントで、このGlideが普及すればよいなあ、と感じました。プログラマとしては、仕事がなくなる事になりますが。

正直、一からこのレベルのアプリを作って、と指示されると手も足も出なくて泣くしかないです。

後、公式ドキュメントなどが、[Voiceflow](https://www.voiceflow.com/)に雰囲気が似ているので、親近感を持ちました。
Cent OS 8にSQL Server 2019をインストール

#はじめに
詳しいことは[MSのサイト](https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup?view=sql-server-ver15
)に書いてありますが、自分自身の備忘録として。

#構成ファイルのダウンロード
Microsoft SQL Server 2019 Red Hat リポジトリ構成ファイルをダウンロードします。

```Bash
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo
```

#インストール
次のコマンドを実行して SQL Server をインストールします。

```Bash
sudo yum install -y mssql-server
```

最後に

```Bash
完了しました!
```
と表示されます。

#セットアップ
パッケージのインストールが完了したら、mssql-conf setup を実行し、プロンプトに従って SA パスワードを設定し、エディションを選択します。

```Bash
sudo /opt/mssql/bin/mssql-conf setup
```
今回はDeveloper Edition、日本語でセットアップしました。

```Bash
SQL Server のエディションを選択します:
  1) Evaluation (無料、製品使用権なし、期限 180 日間)
  2) Developer (無料、製品使用権なし)
  3) Express (無料)
  4) Web (有料)
  5) Standard (有料)
  6) Enterprise (有料) - CPU コアの使用率は、20 個の物理コア、またはハイパースレッドが有効にされた 40 個に制限されています
  7) Enterprise Core (有料) - CPU コアの使用率は、オペレーティング システムの最 大までです
  8) 小売販売チャネルを介してライセンスを購入し、入力するプロダクト キーを持っています。

エディションの詳細については、以下を参照してください
https://go.microsoft.com/fwlink/?LinkId=2109348&clcid=0x411

このソフトウェアの有料エディションを使用するには、個別のライセンスを以下から取得する必要があります
Microsoft ボリューム ライセンス プログラム。
有料エディションを選択することは、
このソフトウェアをインストールおよび実行するための適切な数のライセンスがあることを確認していることになります。

エディションを入力してください(1-8): 2
この製品のライセンス条項は
/usr/share/doc/mssql-server で参照できるほか、次の場所からダウンロードすることもできます:
https://go.microsoft.com/fwlink/?LinkId=2104294&clcid=0x411

プライバシーに関する声明は、次の場所から確認できます:
https://go.microsoft.com/fwlink/?LinkId=853010&clcid=0x411

ライセンス条項に同意しますか? [Yes/No]:Yes


SQL Server の言語の選択:
(1) English
(2) Deutsch
(3) Espanol
(4) Francais
(5) Italiano
(6) 日本語
(7) ???
(8) Portugues
(9) Русский
(10) 中文 ? ?体
(11) 中文 （繁体）
オプション 1-11 を入力: 6
SQL Server システム管理者パスワードを入力してください:
SQL Server システム管理者パスワードを確認入力してください:
SQL Server を構成しています...

ForceFlush is enabled for this instance.
ForceFlush feature is enabled for log durability.
Created symlink /etc/systemd/system/multi-user.target.wants/mssql-server.service → /usr/lib/systemd/system/mssql-server.service.
セットアップは正常に完了しました。SQL Server を起動しています。
```
#確認
構成が完了したら、サービスが実行されていることを確認します。

```Bash
systemctl status mssql-server
```

```Bash
● mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendo>
   Active: active (running) since Mon 2020-02-24 00:24:11 EST; 21s ago
     Docs: https://docs.microsoft.com/en-us/sql/linux
 Main PID: 10532 (sqlservr)
    Tasks: 131
   Memory: 1.0G
   CGroup: /system.slice/mssql-server.service
           tq10532 /opt/mssql/bin/sqlservr
           mq10555 /opt/mssql/bin/sqlservr
```

#ファイヤーウォールの設定
リモート接続を許可するには、SQL Server ポートを開きます。 既定の SQL Server ポートは TCP 1433 です。 ファイアウォールに FirewallD を使用している場合、次のコマンドを使用できます。

```Bash
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload
```
#リモート接続の確認
ここまで設定すればSQL Server Management Studio (SSMS) 等で接続出来ます。
SELinuxは有効のままで、特になにか設定しなくても接続出来ました。

#参考/出展
SQL Server on Linux のインストール ガイド
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup?view=sql-server-ver15

https://qiita.com/Higemal/items/8c985b479a793218e63f
[Bootstrap]ドロップダウンボタンのアイコンを変更&「ドロップダウンがボタンに対して右下に出ちゃう!」と「選択肢の下に変な余白が!?」を解消

##概要
表題の通りですが、長いので下記にまとめます。

1.ドロップダウンボタンのアイコンを変更する。
2.ドロップダウンがボタンに対して右下に出ちゃう!」を解消。
3.「選択肢の下に変な余白が!?」を解消。

すべて簡単ですが、2.3に少しハマったのでメモを兼ねて共有させていただきます。

##環境
Ruby:2.6.3
Rails:5.1.6
bootstrap:4.4.1
FontAwesome 

##方法
1.ドロップダウンボタンのアイコンを変更する。
-button.btn.dropdown-toggleの中にFontawesome(iタグ)を通常通り配置。
-デフォルトのボタンを消す(.dropdown-toggle::after { display: none; })。

2.ドロップダウンがボタンに対して右下に出ちゃう!」を解消。
div.dropdown-menuにdropdown-menu-rightクラスを追加。
→position:absolute関連のleftプロパティの値をいじっていたが、これだけでよかった。
要は、ドロップダウンメニューの起点がボタンに対して左上(デフォルト)になっているのを右上に変更する。

3.「選択肢の下に変な余白が!?」を解消。
div.dropdown-item(下記link_toメソッド(HTMLではaタグ))の後にいくつかの半角スペース
→これが選択肢の内容として認識されていた為、選択肢の下の「変な余白」として反映されていた。


```erb:home.html.erb
<div class="dropdown">
  <button class="btn dropdown-toggle" type="button" id="dropdownMenuButton", data-toggle="dropdown">        
    <i class="fas fa-chevron-down"></i>
  </button>
  <div class="dropdown-menu dropdown-menu-right">
  <%= link_to "削除する", dreampost, class: 'dropdown-item', method: :delete,
                                        data: { confirm: "削除してよろしいですか？" } %>
  </div>
</div>
```

```scss:custom.scss
.dropdown-toggle::after { display: none; }
```
![スクリーンショット 2020-02-24 16.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/b9c9555a-657c-2393-2007-7f773d759e98.png)

![スクリーンショット 2020-02-24 15.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/565253d2-8f8e-15a0-f5f5-0a504fa23341.png)

![スクリーンショット 2020-02-24 15.16.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/ad1af34f-8d6a-d2be-9d30-c899d3536399.png)

![スクリーンショット 2020-02-24 15.19.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/b78ef696-d4df-cc56-89d9-9e503580a5af.png)

![スクリーンショット 2020-02-24 16.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/de6b2fc2-c64a-0860-ae82-f5a85b37a9bb.png)

##補足
ドロップダウンボタンのアイコンは、親要素にdisplay:flexとjustify-content:space-betweenで右端寄せしています。

ご指摘などございましたら、ぜひよろしくお願いいたします。
コロナウイルス状況のサイトからスクレイピングしてデータ分析してみたの巻😷

どうも、初めまして。WEB系転職活動中の**りゅう**です！

~~**引きこもりニート生活**をしているため、~~特に、外出を自粛しているわけではないですが、
コロナウイルスの状況がよろしくないというため気になって調べてみました。
そうすると、厚生労働省のサイトに
**「新型コロナウイルス感染症の現在の状況と厚生労働省の対応について」**というのがあったので、
何となくですが、スクレイピングして現状をデータ分析してみました。

#スクレイピングする
```python:tableget.py
import requests
from bs4 import BeautifulSoup
import csv


# 新型コロナウイルス感染症の現在の状況と厚生労働省の対応について（令和２年２月21日版）
url = 'https://www.mhlw.go.jp/stf/newpage_09690.html'

r = requests.get(url)
if r.status_code == requests.codes.ok:

    soup = BeautifulSoup(r.content, 'html.parser')

    data = [[[td.get_text(strip=True) for td in trs.select('th, td')]
             for trs in tables.select('tr')]
            for tables in soup.select('table')]

    # 取得テーブル数確認
    #print(len(data))

    # 2番目のテーブル ※ダイヤモンドプリンセス号以外の患者数テーブルを取得
    table = data[2]

    #確定日,年代,性別,居住地の列番号のデータを取得
    columns = [2,3,4,5]

    result = [[rows[i] for i in columns] for rows in table]

    with open("corona_data.csv", "w", encoding="Shift_jis") as f: # 文字コードをShift_JISに指定
    	writer = csv.writer(f, lineterminator="\n") # writerオブジェクトの作成 改行記号で行を区切る
    	writer.writerows(result) # csvファイルに書き込み
```
※カンマ区切りのファイルとして保存できる

#seabornでスタイリッシュに可視化
![ss.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/d106a7f1-bf5e-c76e-9909-6d698f1a4278.png)
![60.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/182ee4df-c502-c0c8-9535-cf01d48ad517.png)

#感染が確認された県をjapanmapライブラリを用いて可視化
![sss.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/57910f8a-aa74-dd5f-7e64-c0927d47d21f.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/2d218a0c-735b-7483-e7e4-ea37878e8d49.png)
→あれれ、まだ熊本は更新されてないゾ...

#まとめ
国内事例（チャーター便帰国者を除く）の公表データからですが、
割合としては男性が多く、特に中年層（50-60代）の方多いですね。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/a40c1d31-242f-cb90-0825-91604f2e5e53.png)

#最後に
今回は、BeautifulSoupを使ったスクレイピングとseaborn/matplotlibを用いたデータの
可視化を行いました。
未使用要素(確定日など)もあるのでそういうデータを使ってみるのも何らかの関係性が出せそうで
良きかもです。


あまり効果は期待できませんが、マスクなどできる対策はしましょう！
![mask_wo_shiyou_animals.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/9e58398a-d787-e492-6448-639c9abb1346.png)

それでは✋
【C#備忘録】ランダムな値を出力する

※この備忘録は初学者の私が学習した内容を忘れないために書き起こしたものとなります。

#①Randomクラスのインスタンスを生成する
~~~
using System;
public class Program{
    public static void Main(){
        var random = new Random();            
    }
}
~~~
上記のように、変数randomにRandomクラスのインスタンスを生成し代入する。

#②変数randomを、Nextメソッド、WriteLineメソッドを用いて表示させる
~~~
using System;
public class Program{
    public static void Main(){
        var random = new Random();
        var number = random.Next(1,25);  //1以上25未満の数値を指定
        Console.WriteLine("C#を1日に" + number + "時間勉強した");            
    }
}

※「C#を1日に【1～24の中のランダム値】時間勉強した」と出力される
~~~
###注意点
Nextメソッドの引数を指定しないととんでもない桁数の数値からランダムで出力されてしまう。
そのため、Next(〇〇,△△)のように引数を指定するとよい。
また、引数は、〇〇以上、△△未満を意味している。
[xcode]外部ライブラリの利用[備忘録]

#手順
1. githubからライブラリのソースコードをclone。
2. cmakeでxcodeプロジェクトの生成。
3. xcode上でビルドして、staticライブラリ(.a)を生成。
4. 使用するプロジェクト内に、staticライブラリとヘッダーファイルをコピーする。
5. staticライブラリのリンクを設定する。General > Linked Frameworks and Library
6. ライブラリのサーチパスを設定する。 Build Settings > Search Paths > Library Search Paths
7. ヘッダーのサーチパスを設定する。　Build Settings > Search Paths > Header Search Paths
8. ソースコードで使用する。 #include "headers/xxx.h"

#参考記事
https://kamino.hatenablog.com/entry/cmake_tutorial1
http://xxxxxfo.hateblo.jp/entry/2019/03/09/051213
http://aryzae.hatenablog.com/category/Xcode?page=1464969013
Windows10にXAMPPを利用してLaravel環境を作成する

1. XAMPPをインストール
https://www.apachefriends.org/jp/index.html
インストール後、Apacheサーバを起動。

2. PHPのパスを通す
コントロールパネル > システム > システムの詳細設定 > [環境変数] を開き（デスクトップの検索から「環境」を入力してもOK）、「Path」 > [編集] > [新規]でXAMMPをインストールしたフォルダの中にある「PHP」フォルダを追加。
例：　C:\xampp\php

3. コマンドプロンプトでPHPのバージョンを確認

    ```
    > php -v
    ```
    で表示される情報がPHP 7以上であることを確認。

4. Composerのインストーラーをダウンロード
https://getcomposer.org/
からComposer-Setup.exeをダウンロードして実行。
インストール先は自動で見つけて来てくれるようだが、見つけてくれない場合には自分がインストールしたXAMPPのPHPフォルダを指定（例：C:\xampp\php）。

5. コマンドプロンプトからComposerの確認
コマンドプロンプトを立ち上げ直し、以下コマンドを実行した際にComposerの情報が表示されるかを確認

    ```
    > composer
    ```
6. htdocsフォルダまで移動

    ```
    > cd C:\xampp\htdocs
    ```
    の実行などで、XAMPPのhtdocsフォルダまで移動。

7. 以下コマンドの実行でLaravel5.5.*を「csm」という名前のディレクトリに設置

    ```
    > composer create-project laravel/laravel cms --prefer-dist "5.5.*"
    ```
※自分の環境に合った最新のLaravelバージョンをインストールしたい場合には「composer create-project laravel/laravel <ディレクトリ名>」で行けるはずです
※PCの能力や回線速度によって完了するまでの時間は異なります（5分～10分程度）

8. 以下のようにset successfully.が最後に表示されたら完了
Application key [base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx+w/Fo5y/C5Fy+Q=] set successfully.

9. WebブラウザからLaravelの動作を確認
URLとしてhttp://localhost/cms/public/ （自分が指定した名前やサーバにより異なります）等を指定し、Laravelの画面が表示されることを確認。
![laravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120864/114f1a36-6026-b1ba-bad6-c6077fb8fc91.png)
SEOは終わったという話

SEOは終わったと言えます。それは古いSEO。多くの人が「昔と今では違う」「ペナルティを受けた」という話を言います。それが根拠。

しかし依然として検索結果に表示されるものは、アルゴリズムの産物。昔と今ではその仕組が違うだけ。読者に受けいられれるというあいまいなSEOは間違い。これからはさらに高度なSEOの仕組みを理解する必要があります。<a href="https://alphard-discount.com/kyutei-nyokan-jang-geum-no-chikai-review/" >チャングム感想評価口コミ</a>サイトのような1ページにいろいろなキーワードが詰まっているページ。これでいいでしょうか？

例えば「1ページ1キーワード」と言われた時代がありました。これは今では「長文、ロングテール」という流行に変わりつつあります。しかしまた最近のことでは「長文よりも的確な内容で程々の文字数」という意見も増えつつあります。

検索結果を見てみましょう。おそらく1ページ目は、多くの場合長文です。次にドメイン、被リンク効果の強いサイトが出てくるでしょう。昔「コンテンツイズキング」と言われたSEOも古くなってきたようです。
.bat バッチファイル作成 メモ　わたくし用

batファイル作成memo

1) 引数の取得

引数は複数与えることが出来る。
ファイル内のコードから引数を参照する場合、以下のようにする。
「%0」には自ファイル名称が格納され、「%1,%2,...」と順に連番で引数を取得できる。
■----------------------------
第一引数,第二引数,...第n引数
  %1, %2, ...%n
■----------------------------

ちなみにこの方法で引数が取得できるのは「%1～%9」までの9つ。
それ以上引数を扱う場合は、別途でなんかしら考慮が必要らしい。ここでは割愛。


2) 変数の扱い

変数の定義には、「set」を使用する。
■----------------------------
set 変数名=値
  set arg1=1
  set arg2=abc
  set arg3="ABC"
■----------------------------

変数を参照する場合、参照する変数名の前後に「%」を記述する。
■----------------------------
%参照する変数名%
  %arg1%
■----------------------------

また、複数の変数の値を連結して使用する場合は以下のように立て続けに並べるだけ。
■----------------------------
  %arg1%%arg2%
■----------------------------


3) ブロック内の仕様

batの仕様上、if文やfor文などのブロック内の変数の値は、ブロックの開始時点に全て展開されてしまう。
なので、ブロック内で変数に値を代入したとしても、その変数を参照するとブロック処理開始時点の値しか取れない。
この問題を回避するのが、「遅延環境変数」という仕組みである。
「遅延環境変数」を利用すれば、ブロック内においても、変数の値の評価を参照するまで遅らせることができる。

・遅延環境変数を取り扱う場合は、以下の手順が必要
  a) ブロックの開始より前に「setlocal enabledelayedexpansion」を宣言する。　
      ※遅延環境変数を使用するという宣言
  b) ブロック内で代入した値を参照するときは、
     変数名には「%」ではなく「!」を前後に記述する。
  c) 遅延環境変数の使用を終了する時点で、「endlocal」を宣言する。
■---------------------------
setlocal enabledelayedexpansion
for /f %%i in (%files%) do (
  set file=%%i
  echo ファイル：!file!>>resultFiles.txt	
)
endlocal
■----------------------------

ちなみに、ブロック内で「>」や「>>」を使用して値を出力する場合、
■----------------------------
  echo ファイル：!file! >>resultFiles.txt
■----------------------------
このように「>>」の前にスペースを入れてしまうと、そのスペースも反映されてしまうので注意。
【Nuxt.js】非同期データーをコンポーネント内で扱う方法

Nuxt.jsで作るWebサイトをでInfomationを手軽に作るため、heddresscmsであるmicrocmsを利用しようと思いました。

こちらの記事を参考にMicrocmsからのAPIを取得しNuxt内に表示される方法を参考にしました。
https://microcms.io/blog/create-nuxt-microcms-recruit/

まずはTopページに下記のように書きました。

``` index.vue
<template lang="pug">
省略
    div
      .items
        .item-box(v-for='item in items' :key='item.id')
          .name
            | {{ item.title }}
省略
</template>

<script>
export default {
  data () {
    return {
      items: ''
    }
  },
  async asyncData ({ $axios }) {
    const data = await $axios.$get('https://*******.microcms.io/api/v1/news', {
      headers: { 'X-API-KEY': ''****************************' }
    })
    return {
      items: data.contents
    }
    }
}
</script>
```

うまく表示されましたので、次にコンポーネント化し使用と思い。
info.veuとしてソースをわけました。

```index.vue
<template lang="pug">
  main
    mainvisual
    section
    information

</template>

<script>

import Mainvisual from '~/components/home/Mainvisual.vue'
import Section from '~/components/home/Section01.vue'
import Imformation from '~/components/home/information.vue'

export default {
  components: {
    Mainvisual,
    Section,
    Information
  },
}
</script>
```

```Information.vue
<template lang="pug">
    div
        .items
            .item-box(v-for='item in items' :key='item.id')
                .name
                    | {{ item.title }}

</template>

<script>
export default {
  data () {
    return {
      items: ''
    }
  },
  async asyncData ({ $axios }) {
    const data = await $axios.$get('https://*******.microcms.io/api/v1/news', {
      headers: { 'X-API-KEY': '****************************' }
    })
    return {
      items: data.contents
    }
    }
}

</script>
```

しかしいざ開いてみると表示されず、エラーも表示されない状況でした。

原因を調べてみますと公式にかいてありました。
[コンポーネント内で非同期データを扱うには？](https://ja.nuxtjs.org/faq/async-data-components/
)

どうやらasyncDataメソッドはページコンポーネントで使えるもので、通常のコンポーネントでは使用できないようです。

しかたないのでmountedに書き換えてみることにします。

```index.vue
<template lang="pug">
    div
        .items
            .item-box(v-for='item in items' :key='item.id')
                .name
                    | {{ item.title }}

</template>

<script>
export default {
  data () {
    return {
      items: ''
    }
  },
  mounted() {
    this.asyncData()
  },
  asyncData () {
    await axios.get('https://*******.microcms.io/api/v1/news',{
      headers: { 'X-API-KEY': '****************************' }
    })
    .then(res =>{
      console.log(res)
      this.items= res.data.contents
    })
  }
}
</script>
```

このように書き直したらうまく表示されました。
Service層を意識したLaravelのMVCモデル（概念編）

##はじめに
Laravelにおいて個人的な開発であればMVCモデルを意識して行えば問題ないかと思いますが、大規模なサービス開発や長期的に運用するはよりレイヤーの構造を意識した開発を行うことが、安定したサービスを運用することに大事かと思います。
そこで今回はService層を意識したLaravelのMVCモデルについて概念のおさらいをしていきます。

##Service層について
###そもそもサービス層とは？？
<img width="371" alt="スクリーンショット 2020-02-24 15.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/c7382b0d-774f-7818-d6db-82fdd2e1bed8.png">
[P of EAA: Service Layer](https://martinfowler.com/eaaCatalog/serviceLayer.html)
Laravelの公式ドキュメントに以下の記載がありました。
>Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel's core services are bootstrapped via service providers.

引用：[Service Providers - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/6.x/providers)

「サービスプロバイダはLaravelアプリケーション内の全てのserviceがbootstrapされる場所である」と述べられています。
serviceとは各クラスからから提供される機能と頭の片隅に入れておくと良いかと思います。また、bootstrapするというのは、イベントリスナ、ミドルウェア、ルートなどLaravelアプリケーションに必要な全てを起動するということになります。

###構成とそれぞれの役割
<img width="193" alt="スクリーンショット 2020-02-24 14.54.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/82ca8c8d-0690-2fcf-d748-c50dd56110fd.png">
ルーティング：ルーティング、認証、フィルタ
コントローラー：HTTPリクエスト、リクエスト、レスポンス
サービス：事前条件検証、ビジネスロジック
モデル：データーベースアクセス、エンティティ固有の処理

###結局サービス層ではなにをするのか
ビジネスルールに関わる処理を記載します。
ビジネスドメイン、事前条件検証とビジネスロジック、HTTP関連以外（arrayやobjectで渡す）などです。
例えばECで言うと、在庫がないと注文を確定できない等、ビジネスルールに即して注文確定させるような主処理などです。

##終わりに
概念的なものだけになってしまったので次回あたりで実際どんな感じに使うのかまとめていきます。
参考：
[Laravel で Service 層を取り入れるときに検討したいこと - Qiita](https://qiita.com/nunulk/items/6b7a7bbda17192f6b2f5#service-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E3%81%AF)
[レイヤードアーキテクチャを意識したPHPアプリケーションの構築](https://www.slideshare.net/shin1x1/lt-up-49929619)
【UE4】2ボタン同時押しの実装

<h2>上段パンチ、下段パンチ</h2>
十字キーの上を押したまま、パンチボタンといった、2つのボタンを同時に押したときに発するコマンド。
キーボードの十字キーを押したままでＤを押すと成功します。

![4_同時押し.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/5f8f35e8-d9de-a117-0d03-00735569b8e0.png)

最初は「Is Input Key Down」だけ取得したのですが、それではうまく行かず、
「Get Input Key Time Down」を併用する必要がありました。
図ではテストのため0.5秒も取っていますが、実際に使うときには0.1秒もあれば十分だと思います。

ボタンについては決め打ちしましたが、これを関数にして、ボタンを変えられるようにすれば応用が効くと思います。
もっといい実装方法があったら教えて下さい。

動画を見てもいまいちわからないかな(笑)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">２ボタン同時押し<a href="https://twitter.com/hashtag/UnrealEngine?src=hash&amp;ref_src=twsrc%5Etfw">#UnrealEngine</a> <a href="https://twitter.com/hashtag/UE4Study?src=hash&amp;ref_src=twsrc%5Etfw">#UE4Study</a> <a href="https://t.co/1WvLACDXvQ">pic.twitter.com/1WvLACDXvQ</a></p>&mdash; 特命社長 (@tokumeishatyo) <a href="https://twitter.com/tokumeishatyo/status/1231831868779061248?ref_src=twsrc%5Etfw">February 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
TweenMaxで「0→任意の値→0」という値の変化をつくる


#TweenMaxで「0→任意の値→0」という値の変化をつくる
```javascript:hoge.js
var obj = {
  propA: 0,
}

var forth = 10;
var tm = TweenMax.to(obj, 5, {
        onUpdate : function(){
            //進捗を0-1の値で返すtweenmaxのメソッド
            var progress = this.progress();
            //三角関数で0から180度のとき0→1→0を返すことを利用
            var num = Math.sin(progress * 180 * Math.PI / 180);
            //強度の値をかけることで、任意の時間に「0→任意の値→0」という値の変化をつくる
            var final = num * forth;
            final = Math.round(final * 100)/ 100;
            obj.propA = final;
            console.log(obj.propA);
        }
    });
```

もっと簡単な方法がある気がするす
toを続けて書く...？しかし任意のイージングのなかで変化させたい...ゆえにこのように記述しています
AWS試験対策（⑬移行とコスト管理のサービス）

ラストです。

##移行のためのサービス
TCO Calculatorによってオンプレ上で実行されているアプリケーションとAWSにおけるアプリケーションのTCOを比較できる。TCOは総所要コストのこと。

ADSによって現行オンプレの状況把握ができる。

サーバ移行にはMigration Hubで状況確認できたり、VM Import/ExportやSMSでVMの移行がそのままできたりする。SMSはVM Import/Exportの多機能バージョン的な。VMware vSphereとHyper-Vをサポートしている。

DB移行にはRDBを移すならDMS、大容量であるならSnowballを使う。標準的移行としてストレージGWを使用する方法もある。
Snowballはハードウェア送ることで物理的な転送ができる。Amazonすげえ。これによってペタバイト級でもオンラインで転送するより早く転送できる。

##コスト管理
Cost ExplorerとTrusted Advisorがある。
Cost Explorerではリソースの使用量を時系列のグラフで確認できる。また、過去の実績から参照して、今後3か月のコストを予測してくれる。
Trusted Advisorでは節約できるところを探してコスト最適化のための項目を推奨してくれる。

簡単だが以上。模試を受けて問題解いて試験を受けてこようと思う！！
build.gradle の kts 化で  Type mismatch. Required: GString! Found: String

[Browsing and invoking services with DocService](https://line.github.io/armeria/server-docservice.html#server-docservice) in Armeria を試そうとしていたとき

```gradle:build.gradle.kts
protobuf {
    generateProtoTasks {
        all().each { task ->
            task.generateDescriptorSet = true
            task.descriptorSetOptions.includeSourceInfo = true
            task.descriptorSetOptions.includeImports = true
            task.descriptorSetOptions.path =
                    "${buildDir}/resources/main/META-INF/armeria/grpc/service-name.dsc"
        }
    }
}
```

で以下のエラーが

# Type mismatch. Required: GString!


```
Type mismatch.
Required:
GString!
Found:
String
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/1c95c686-c35e-e119-ed1d-1149f748d49e.png)


# 本質的には Protobuf Plugin の Issue

* [Problem with GString in DescriptorSetOptions\.path and Gradle Kotlin DSL \#359](https://github.com/google/protobuf-gradle-plugin/issues/359)

# とりあえず

別に深追いしたい訳では無いので `groovy.lang.GString.EMPTY + ` で通るようになる

```gradle:build.gradle.kts
            it.descriptorSetOptions.path = groovy.lang.GString.EMPTY + "${buildDir}/resources/main/META-INF/armeria/grpc/service-name.dsc"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/32a8eade-0f94-b6ae-f035-74f50f65ad20.png)
signal SIGABRT の解決

signal SIGABRTにあたってしまったお。

signal abort: シグナルが途切れた、つまり、referenceできないよーってなんとなく言われているはず。

デバッグは、
<img width="838" alt="スクリーンショット 2020-02-24 15.15.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252245/8005d40c-6492-1435-3993-4a99bcdc5b58.png">

エラーコードとエラーコードググった感じから、SwifterライブラリのターゲットバージョンがiOSのバージョンとズレてるのかとかの感覚で、実際、podfileでSwifterライブラリのターゲットバージョンを変更した後だったから、これは、適切なバージョン調べないとダメか？と小１時間くらいswifterのドキュメントとか見てやったけど、
**解決法は、”cleanしてbuild”しただけ。**
参考: http://www.project-unknown.jp/entry/2015/03/28/133347

動いた↓
<img width="698" alt="スクリーンショット 2020-02-24 15.23.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252245/8da9e9c9-eb97-e778-f4c4-1f35bf8f2464.png">

バグの解決は、
可能性を列挙->簡単な選択肢から潰す。
これをキッモに銘じよう。
AWS試験対策（⑫分析サービス）

分析サービス編です。RedshiftはDBでやったんで省略します。

##分析のためのサービス概要
流れとしては、AWS SnowballやKinesisでデータを収集し、S3に保存。その後EMRやData PipelineやGlueで抽出/加工し、RedshiftやAthenaで分析する。それをQuickSightで可視化するっていった流れ。

##AmazonKinesisの各種サービス
よっつある。Kinesis Data Streams、Kinesis Data Firehose、Kinesis Data Analytics、Kinesis Video Streamsの四つ。データを大量に保存する機能はS3やEMRにもあるが、これらはIOの処理能力が低いのでKinesisを使う。

 - Kinesis Data Streams
数千、数万のデバイスから継続的に生成されるデータ(ストリーミングデータ)を収集するサービス。
アプリケーションはここからデータをリアルタイムに取り出て分析処理を行う。

 - Kinesis Data Firehose
S3/Redhift/Elasticsearch Service/Splunkにストリーミングデータをロードする機能を持つ。
こいつらに受け渡したいときはFirehoseを使おう！

 - Kinesis Data Analytics
ストリーミングデータに対して標準的なSQlクエリを行って分析できるサービス。
要するにデータをほかのDBなどに受け渡さなくてもいいため、リアルタイム分析ができる。

 - Kinesis Video Streams
アプリで動画を解析する際に使う。例えば防犯カメラのデータを取り込んで犯罪防止の解析に使ったり。

まとめると、アプリに渡し、リアルタイムな分析をしたいときはData Streams、S3/Redshift/Elasticsearch Service/splunkへ渡したいときはFirehose、DB的な使い方をしたいけどDBへ渡さずにリアルタイムな分析をしたいならAnalytics、動画ならVideo Streams。

##EMR
Hadoopのマネージドサービス。といっても当方Hadoopを知らんので簡単にまとめ。
大量のデータを処理する分散処理フレームワークであり、様々な非構造化/構造化データをデータウェアハウスや機械学習のアプリが使用できる構造に変換するサービス。要するにデータの変換をしてくれる？
従量課金制。

##Data Pipeline
AWSサービスやオンプレのサービスのデータソースについてデータの転送とかETL(抽出、変換、格納の略)を定義し、処理を自動化できるサービス。これだけだと何言ってるかわからないが、要するに、WebサーバからS3へ毎日ログを送り、それを週一でEMRに変換してもらって、それを解析に使用する場合、それらの流れをスケジューリングして自動的に行ってくれる。

##Glue
ETLとデータカタログのマネージドサービス。S3に保存されたデータをRedshiftで使用できる形に変換する。スクリプトをPythonまたはScalaで自動生成できる。Apache Spark以外の様々なエンジンで実行されるETL処理が必要な場合はPipelineのほうがいい。Apache Spark専用か。

##Athena
S3のデータに対してテーブルを作り、標準的なSQLを直接発行できるサービス。従来はS3のデータをRedshiftへロードしてからクエリ発行していたが、それが不要になった。
Kinesis Data Analyticsと違うのはS3からのデータってこと。

##QuickSighht
BIツール。AWS以外にも接続できるらしい。よーわからん。

あとは移行とコスト管理のサービスをやってよくある質問読んで模試受けて本番へ行こうかと。
[Pythonで遊ぼう] モノクロとドットに画像加工する

#はじめに
SNSアカウントの画像をそろそろ変えたいな、と思ってPythonでやりました。コードを残しておきます。
内容は以下の3つの

- 画像を読み込む
- 画像をモノクロにして出力する
- 画像をドットにして出力する

になります。注意はあまりないのですが、ドット化は多少時間がかかります。（1分程度？PCのスペックによる）

##準備
各自実行する場合は以下の点に注意してください。

- もととなる画像をアップロードしておく
- コードにおける画像ファイル名の変更（以下では shiro.jpg としています。）

##画像を読み込む
画像を準備して読み込みます。
私はJupiter Notebookでやっています。その場合は画像を準備して、あらかじめNotebookにアップロードしておきます。

```
import numpy as np
import matplotlib.pyplot as plt
import cv2

#画像の読み込み
img = plt.imread('shiro.jpg') 
type(img) 
img.size
```

```
plt.imshow(img) #画像の表示
plt.show()
```
元の画像がこれになります。
![2020-02-24 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574563/ab3f7710-3b45-22d0-5c60-c40785b154d2.png)


##モノクロ加工をして出力する
次にモノクロ（白黒）加工して出力します。

```
def img_show(img : np.ndarray, cmap = 'gray', vmin = 0, vmax = 255, interpolation = 'none') -> None: 
    plt.imshow(img, cmap = cmap, vmin = vmin, vmax = vmax, interpolation = interpolation) #画像を表示
    plt.show()
    plt.close()
    img = plt.imread('shiro.jpg')

img_mid_v = np.max(img, axis = 2)/2 +np.min(img, axis = 2)/2
img_show(img_mid_v)
img = plt.imread('shiro.jpg')
```
![2020-02-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574563/045f7da5-b090-6f37-a169-b37cf25aea71.png)

##ドット化する
ドット化します。好みしだいで"dst = pixel_art(img, 0.1, 4)"の数字をいじってみると面白いかもしれません。
実行するとJupiter Notebookに'shiro_mozaiku.jpg'といったファイルが出力されます。

```
# 減色処理
def sub_color(src, K):   
    Z = src.reshape((-1,3))
    Z = np.float32(Z)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
    ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    center = np.uint8(center)
    res = center[label.flatten()]
    return res.reshape((src.shape))

# モザイク処理
def mosaic(img, alpha):
    h, w, ch = img.shape
    img = cv2.resize(img,(int(w*alpha), int(h*alpha)))
    img = cv2.resize(img,(w, h), interpolation=cv2.INTER_NEAREST)
    return img

# ドット絵化
def pixel_art(img, alpha=2, K=4):
    img = mosaic(img, alpha)
    return sub_color(img, K)
```

```
# 入力画像を取得
img = cv2.imread("shiro.jpg") 

# ドット絵化 画像の粗さ, 色の粗さ
dst = pixel_art(img, 0.1, 4)
    
# 結果を出力
cv2.imwrite("shiro_mozaiku.jpg", dst)

from PIL import Image
mozaiku_shiro = Image.open('shiro_mozaiku.jpg')
mozaiku_shiro
```
![2020-02-24 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574563/4a894cdb-68d3-952e-7207-ffe2aede10ec.png)

#雑談
なかなかいいものができたなぁ、という感じです。旅行に行った時の写真ですが、城など建築物はうまくモザイク・ドット化できそうですね。その他、人物や風景などはどうなるかわからないですが試しにやってみると面白いかもしれませんね。
PHPで分かち書きをする意識低い方法

タグの自動生成をしようという事で分かち書きが必要になりましたが、[Yahoo!のAPI](https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html)は制約があるし、[TinySegmenter](https://omimo.net/code_snippets/php/1207/%E6%96%87%E7%AB%A0%E3%82%92%E5%8D%98%E8%AA%9E%E3%81%AB%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%EF%BC%88tinysegmenter-php%E7%A7%BB%E6%A4%8D%E7%89%88%EF%BC%89/)というライブラリは長いことメンテナンスされてないなと思案して、見つけたのが[正規表現](https://takuya-1st.hatenablog.jp/entry/20091114/1258201332)を使うというもの。

追記（2021/2/11)
Yahoo!のAPIを使うバージョンも公開しました。こちらもご参照ください
https://qiita.com/emesh/items/b1e1916f85b732c7a664

```php
<?php
$str="吾輩は猫である。名前はまだない。どこで生れたか頓と見当がつかぬ。";
//正規表現でメモを分割する
preg_match_all('/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[ａ-ｚＡ-Ｚ０-９]+/u', $str, $matches);
$match_result = $matches[0];

print_r($match_result); // マッチ結果が全出力

?>
```

で結果は

```php
Array ( [0] => 吾輩 [1] => は [2] => 猫 [3] => である [4] => 名前 [5] => はまだない [6] => どこで [7] => 生 [8] => れたか [9] => 頓 [10] => と [11] => 見当 [12] => がつかぬ )
```

おお、確かにそれっぽい。ただし「ドラえもん」「海の日」のような漢字カナ交じりの単語には対応していないのでちょっと改良してみます。

```php
<?php
$str="今日は海の日。夏だ一番ドラえもん祭り";
//正規表現でメモを分割する
preg_match_all('/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[ａ-ｚＡ-Ｚ０-９]+/u', $str, $matches);
$match_result = $matches[0];

//2つの配列の結合
$tmp_res1 = array();
if(count($match_result) > 1){
    for ($i = 0 ; $i < (count($match_result) - 1); $i++){
        $tmp_res1[] = $match_result[$i] . $match_result[$i + 1];
    }
}

//3つの配列の結合
$tmp_res2 = array();
if(count($match_result) > 2){
    for ($i = 0 ; $i < (count($match_result) - 2); $i++){
        $tmp_res2[] = $match_result[$i] . $match_result[$i + 1] . $match_result[$i + 2];
    }
}

$match_result = array_merge($match_result, $tmp_res1, $tmp_res2);


print_r($match_result); // マッチ結果が全出力

?>
```

```
Array ( [0] => 今日 [1] => は [2] => 海 [3] => の [4] => 日 [5] => 夏 [6] => だ [7] => 一番 [8] => ドラ [9] => えもん [10] => 祭 [11] => り [12] => 今日は [13] => は海 [14] => 海の [15] => の日 [16] => 日夏 [17] => 夏だ [18] => だ一番 [19] => 一番ドラ [20] => ドラえもん [21] => えもん祭 [22] => 祭り [23] => 今日は海 [24] => は海の [25] => 海の日 [26] => の日夏 [27] => 日夏だ [28] => 夏だ一番 [29] => だ一番ドラ [30] => 一番ドラえもん [31] => ドラえもん祭 [32] => えもん祭り )
```

タグの自動挿入なら配列をforeachで回して既出のワードなら挿入させるというやり方にすれば結構、良い線行くんじゃないですかな。
aws sdk goでAPIスロットリングした時のリトライ回数を指定する

aws-sdk-go を利用してAPIから `ThrottlingException: Rate exceeded` が発生した際のデバッグ方法とリトライ試行回数の指定方法


```go
package main

import (
	"context"
	"fmt"
	"log"
	"sync"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/aws/request"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
	"github.com/aws/aws-sdk-go/service/ec2"
)

func main() {
	mySession := session.Must(session.NewSession())
	loop := 10
	var wg sync.WaitGroup
	wg.Add(loop)
        
	// 意図的にスロットリングを発生させるために並列実行している
	for i := 0; i < loop; i++ {  
		go func() {
			getLogs(mySession)
			wg.Done()
		}()
	}
	wg.Wait()
}

func getLogs(sess *session.Session) {
	svc := cloudwatchlogs.New(sess, aws.NewConfig().WithMaxRetries(10)) // リトライ試行回数を指定
	t := time.Now().Add(-time.Hour).Unix() * 1000
	ctx := context.Background()
	for i := 0; i < 100; i++ {
		res, err := svc.FilterLogEventsWithContext(ctx, &cloudwatchlogs.FilterLogEventsInput{
			FilterPattern: aws.String(""),
			LogGroupName:  aws.String("/aws/apigateway/welcome"),
			StartTime:     aws.Int64(t),
		},
			request.WithLogLevel(aws.LogDebugWithRequestErrors),  // リクエストエラーのデバッグ表示(リトライの度に表示される)
		)
		if err != nil {
			e, ok := err.(awserr.Error)
			if ok {
				log.Printf("i=%d FilterLogEvents code:%s message:%s", i, e.Code(), e.Message())
				return
			}
			log.Printf("i=%d FilterLogEvents err:%s", i, err)
			return
		}

		if len(res.Events) > 0 {
			log.Printf("len(events)=%d", len(res.Events))
		}
	}
}
```
Pythonで日本語を扱う方法

初プログラミングでPython練習中、右も左もわからない状態ですがとりあえず初学備忘録的に。

Atom上で**Atom Runner: script.py**を用いてPythonを走らせようとしたところエラーが表示されたため、その解消法。

[参考にしたのはUX MILKの記事](https://uxmilk.jp/8851)

以下の1行をスクリプトに追加して解決。

```
# coding: UTF-8
```

>日本語をプログラム中で扱う場合には、プログラムの先頭で文字コードを指定し、指定した文字コードでファイルを保存する必要があります。
Pythonプログラムの文字コードを指定し日本語（UTF-8）を扱えるようにするには、プログラムの1行目もしくは2行目に次のように記述します。

とのこと。