OmniAICreator/Qiita-1.07M huggingface dataset:
非推奨になったErrorControllerのgetErrorPathの対応

### はじめに
こちらの[issues/19844](https://github.com/spring-projects/spring-boot/issues/19844)の要約記事

### 概要
Spring Boot 2.3.0以降から、
404などのエラーハンドリングで使用する`ErrorController`のgetErrorPathが非推奨になった。

```java:ErrorController.java
	/**
	 * The return value from this method is not used; the property `server.error.path`
	 * must be set to override the default error page path.
	 * @return the error path
	 * @deprecated since 2.3.0 in favor of setting the property `server.error.path`
	 */
	@Deprecated
	String getErrorPath();
```



### 問題
コンパイル時に警告が出るくらい。
そもそもJavadocに記載されている通りで、該当メソッドをOverrideしても特に意味はない。
( `server.error.path`の設定内容が有効なため )

```java:ErrorControllerの実装クラス
    @Override
    public String getErrorPath() {
        return null;
    }
```


### 対応
#### 修正対象
警告が気になる場合は`@Deprecated`を付与して警告を消す。

```java:ErrorControllerの実装クラス
    @Deprecated
    @Override
    public String getErrorPath() {
        return null;
    }
```

#### 補足
ErrorControllerは実装しないとデフォルトの`BasicErrorController`が有効になるので注意。

```java:ErrorMvcAutoConfiguration.java
	@Bean
	@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
	public BasicErrorController basicErrorController(ErrorAttributes errorAttributes,
			ObjectProvider<ErrorViewResolver> errorViewResolvers) {
		return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
				errorViewResolvers.orderedStream().collect(Collectors.toList()));
	}
```
【学習記録(PHP)】ハッシュ化のいろいろ

日々の学習を忘れないように記録をつけています。
<h2>ハッシュ関数って？</h2>
ハッシュ関数は、「ある引数を渡すしたら、でたらめな値を返す関数」です。
このとき、返される値をハッシュ値と呼びます
返ってくる値はでたらめですが、同じ値を渡すと必ずそれに対応した
同じ値が返ってくるという特徴があります。
ハッシュ化には、hash関数、md5関数、sha1関数、password_hash関数がよく用いられます。


<br>
暗号化とすこし似ていますが、仕組みは異なるようです。
ハッシュ化は不可逆な変換で、元のデータへの復元ができないのに対して、
暗号化は適切な鍵を使うことで元データを復元することができます。

<h2>sha1関数</h2>
sha1関数は、16進数・40文字のハッシュ値を生成するハッシュ関数です。


```php:qiita&nbsp;shal1.php
$str = "yahhooo";
$number = sha1($str);
```
第一引数で入力文字列、
第二引数で返り値の形式を指定できます。


<h2>sha1の脆弱性</h2>

sha1は便利な関数である反面、脆弱性が知られています。
2017年、googleは２つの異なるファイルを使って同じハッシュ値の生成する
“衝突実験”に成功しました。
sha1衝突が悪用されれば、ハッシュ値に依存するシステムで、
ファイルを不正なものに入れ替えられる可能性があるとのこと。
現在ではよりハッシュ値の長いsha2の利用が推奨されています。
ヘイトスピーチを含むTweetの分類をDataRobotを使ってやってみた。

#はじめに
今日やっていたDataRobotの[イベント](https://aiexperience.datarobot.com/?utm_source=datarobot&utm_medium=events&utm_campaign=aiexpjapan2020)に仕事の休憩の時とか参加してて、面白そうなので、触ってみました。ちょうどQiita夏祭りだったので、記事にします！

背景としては、修士学生のときの、HateSpeechの検出を研究していたので、その時使っていた手法の一つで抽出した特徴量を入力として、DataRobotを使ってみたという感じです。
使いやすさだったり、精度だったり、見ていこうかなと思います。

#論文概要
[こちら](https://ieeexplore.ieee.org/document/8292838)の論文ですね。興味ある方は読んでみてください。
Hate, Clean の2クラス分類と、Hate, Offensive, Clean の3分類で実験しています。それぞれ使用する特徴量は同じものを使っていました。2クラスだと正解率が 87.4 % で、3クラスだと正解率が78.4%でした。Offensiveクラスは分類が難しいので、正解率だけで判断はできないですが、テストデータは各クラス、同数用いていたので、それなりの結果だと思います。

#使用したデータと特徴量を抜粋
使用するデータは過去の英語の Tweet データから特徴量を抽出したものです。

Number_of_Posirive_Words:Positiveな単語の数(Long型)
Number_of_Negative_Words:Negativeな単語の数(Long型)
Number_of_Posirive_Emoticons:Positiveな絵文字の数(Long型)
Number_of_Negative_Emoticons:Negativeな絵文字の数(Long型)
・
・
・
Pattern[x]:各クラスに特徴的に出現する品詞パターンの有無(Boolean型)
TopWords[x]:各クラスに特徴的に出現する単語の有無(Boolean型)

今回はデータが100MBしか入らなかったので、少しデータ量が少ないものを使用。
トライアルじゃなければ、もっと入力できるのかな。
![スクリーンショット 2020-07-14 1.05.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/eb4a014f-0902-c614-5819-cd0fa13bc4dd.png)


#DataRobot使ってみた
データの入力画面はこんな感じでした。ローカルファイルを選択します。
サポートされているファイル形式は、「.csv, .tsv, .dsv, .xls, .xlsx, .sas7bdat, .bz2, .gz, .zip, .tar, .tgz」で、
サポートされている特徴量の型は、「数値、カテゴリー、ブール、テキスト、日付、通貨、割合、および長さ」でした。マルチモーダルAIでは画像とか、位置情報も組み合わせられるらしいです。![スクリーンショット 2020-07-14 19.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/c25a8189-7a6a-6af9-5d9e-4addf69a75f3.png)

![スクリーンショット 2020-07-14 19.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/861e8a6c-895e-ad3e-bf0d-24a1a0bff8e4.png)


データ数：5355 , 特徴量数：862でした。
![スクリーンショット 2020-07-13 23.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/358272f1-a0b1-66ad-4f31-a03293fd9214.png)

外れ値チェックとか、欠損値チェックとか、地味にありがたいですね。
![スクリーンショット 2020-07-13 23.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/d535154a-58ac-39b6-4120-4b8b0b0e3bf2.png)

予測モデル一覧とCVの結果などは、こちらの画面になります。ホールドアウトで正解率が 72%くらいなので、良いのでは。トータルの作業時間も試すだけであれば、1時間くらいなので、便利だなあという感じ。まだまだ使いこなせていない感じがあるので、チューニングとかいろいろしたら、もっと上がりそうではあります。
![スクリーンショット 2020-07-14 19.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/6e57e5d4-01d6-5294-ffa6-9fab296131dc.png)

#感想
入力のデータの前処理が済んでいれば、秒でモデルをつくって、予測できるのは、楽ちんで良い！

論文を執筆した時よりもデータ数少なかったので、単純比較できないのですが、まあまあ良い精度出て、お手軽なので、コード書く人がいなくて、価格払える企業さんとかは使いやすそう。
とはいえ、前処理とかできないとどうしようもないから、[こういうところ](https://jp.techcrunch.com/2019/12/16/2019-12-12-datarobot-to-acquire-data-prep-startup-paxata/)を買収したり、[自動特徴量探索](https://www.datarobot.com/jp/lp/trial/)があるって感じなんですかね。

イベントの[このセッション](https://aiexperience.datarobot.com/agenda/session/272670)でも、言及されていましたが、予測だけではなく、データ準備とか、運用周り、意思決定のための説明が機能として実装されてるのはすごいなと。

あとは、モデルを並列でバンバン実行してくれるので、いろいろ試しながら、比較とかすごくしやすいのもよいのかなとおもいました。

デプロイとかも、[いろんなやり方](https://www.datarobot.com/jp/blog/2017-08-31-datarobot-model-deploy/)あるみたいだし、お手軽はお手軽ですね！！
情報処理技術者試験の論文試験に合格するためのコツ

# 論文の構成
設問ア～ウに対して、起承結で構成する。
設問に目を通したら、まず設問ウに論述する内容(結)を決める。
設問ウに論述する内容と辻褄が合うように、設問イとアの内容(起承)を決める。

わかりやすさを求めるために、多少の嘘はついても良いと思います。
読み手に共感させるような内容となっていることも重要です。

# 自分の立場を明確にする
複数の立場を経験したことがある人の方が陥りやすいと思います。

システムアーキテクト試験では、システムアーキテクトであること。
プロジェクトマネージャ試験では、プロジェクトマネージャーであること。

# 項目の充足
論文試験は、問題文の言葉を使ってそれを膨らませれば良いです。
問われていることに対する答えとして、抜けがあってはならないのは当然ですが
余計なことも書いてはいけない。(文字数や時間に限界があるため)

複数の問題点を挙げて、複数の解決策を書いていくと
充足性、具体性、そして主張がそれぞれ削られていきます。

またレベルの高い内容が必要ではなく、日常業務の延長レベルの内容で問題ないと思います。
身近なテーマの方が、より具体的に論述できるのは明白です。
bashの編集

ターミナルでエイリアスという
コード省略機能があったので、試してみたら
色々学べたのでそのまとめを


# シェルについて
ターミナルと行っても、ターミナルのOSには種類があり
ある程度触ってない人にはピンこないものです。

bash,zshなど種類があります。

気になるコマンドはこちら

```
echo "$SHELL"              シェル名。ただし、この環境変数を設定しないシェルもある
ps -p $$                   現在のシェルのプロセス情報を表示
echo $0                    現在のシェル名を表示
cat /etc/shells            シェルを一覧表示
grep "^$USER" /etc/passwd  デフォルトシェルを表示 
chsh                       デフォルトシェルを変更
```

# bash
今回使用するのはbashです。

プログラミングを始めると色々インストールすると思いますが

いつのまにか、シェルが変更されエラーが頻発したことが
あったので要注意です。

それと編集に必要なファイルは下記の通り
bashrcとbash_profileです。

macの場合
ファインダーで確認する時は隠しファイルなので

```
command + shift + "."
```

こちらの操作をファインダー上でやれば確認できます。

## bashrc
bash を起動する時に毎回実行されます。

こちらの編集でやれることは

* エイリアスを定義
* 環境変数でない変数を設定する (export しない変数)
* シェル関数の定義
* コマンドライン補完設定

## bash_profile

ログイン時にのみ実行されます。

* 環境変数を設定する (export する変数)

環境変数はプロセス間で勝手に受け継がれるのでログイン時のみ設定すれば十分です。

# bashの編集
基本はviコマンドを使用して編集します。

```
vim ~/.bashrc
vim ~/.bash_profile
```
vimでの編集手順をざっくり書くと

```
i     編集モードに入り、書きたいコードを書く
esc   編集モード解除
:wq   保存して終了
```


# sourceコマンド

編集したあと下記のコマンドを実行しないと反映されないので
注意が必要です。

```
$ source .bash_profile
$ source .bashrc
```
ESLint 7.4.0

前 [v7.3.0](https://qiita.com/mysticatea/items/e155bd2fee35c22ee423) | 次 [v7.5.0](https://qiita.com/mysticatea/items/b61e0b453f16e7dd08de)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v7.4.0 has been released: <a href="https://t.co/Vp5njHITPj">https://t.co/Vp5njHITPj</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1279151369430224901?ref_src=twsrc%5Etfw">July 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `7.4.0` がリリースされました。小さな機能追加とバグ修正が含まれています。

- Optional Chaining 構文対応は[こちら](https://github.com/eslint/eslint/pull/13416)で進行中です。もうしばらくお待ちください。
- 前回発生していたリグレッションは Revert されました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://discord.com/channels/688543509199716507/718026066001788958) ([招待リンク](https://discord.gg/wfTnWvE))
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://discord.com/channels/688543509199716507) ([招待リンク](https://eslint.org/chat))

---

[PR] ESLint は開発リソースを確保するための寄付を募っています。
応援してくださると嬉しいです。

- [ESLint の GitHub Sponsors](https://github.com/sponsors/eslint)
- [私個人の GitHub Sponsors](https://github.com/sponsors/mysticatea)

---

# ✨ 本体への機能追加

特になし

# 💡 新しいルール

## [id-denylist]

🔖 [#13408](https://github.com/eslint/eslint/pull/13408)

既存の [id-blacklist] は [id-denylist] に名称変更されました。
[id-blacklist] も、[id-denylist] の別名として、引き続き利用できます。

[id-blacklist]: https://eslint.org/docs/rules/id-blacklist
[id-denylist]: https://eslint.org/docs/rules/id-denylist

# 🔧 オプションが追加されたルール

## [camelcase](https://eslint.org/docs/rules/camelcase) `ignoreGlobals`

🔖 [#12782](https://github.com/eslint/eslint/pull/12782)

グローバル変数を無視するオプションが追加されました。

```js:例
/*eslint camelcase: [error, { ignoreGlobals: true }] */
/*globals fizz_buzz */

//✔ GOOD
fizz_buzz = 0

//✖ BAD
const foo_bar = 0
```

> [Open Online Demo](https://eslint.org/demo#eyJ0ZXh0IjoiLyplc2xpbnQgY2FtZWxjYXNlOiBbZXJyb3IsIHsgaWdub3JlR2xvYmFsczogdHJ1ZSB9XSAqL1xuLypnbG9iYWxzIGZpenpfYnV6eiAqL1xuXG4vL+KclCBHT09EXG5maXp6X2J1enogPSAwXG5cbi8v4pyWIEJBRFxuY29uc3QgZm9vX2JhciA9IDBcbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6MTEsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)
【Prefix】

##Prefixとは

<img width="888" alt="prefix.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/32aad6c4-323d-2a95-e8ef-560cf10397dd.png">

ルーティングを確認する際にrails routesコマンドを実行すると上の画像のような画面が表示されるが、上の画像の一番左の項目のことであり、何を表しているかというと真ん中あたりの項目のURI patternのルーティングを変数にしたもの。

なのでlink_toメソッドを使用する際の遷移先の記述を以下のように

<img width="495" alt="prefix4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/36afe340-0674-18cb-4597-8717d63e7661.png">


としてルーティングにURI patternを記述していたところを以下のように


<img width="512" alt="prefix2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/e19a7463-257b-655e-610b-d122bf10517e.png">

のようにPrefixで記述することができる。
二つとも遷移先は全く同じ。

tweet_pathというprefixの引数であるtweet.idは今回の場合はdestroyアクションへのルーティングなのでどのツイートを削除するのかという情報が必要なため該当のツイートのidを引数に指定している。
Raspbery PIに専用のカメラを接続

#概要
今日はRaspberry PIに専用のカメラを接続してカメラの動作確認及びコマンドから画像を撮影してみます。

#事前準備
以下の用意するものがあります。

①Raspberry PI3 本体
＞専用のカメラを繋げることができる本体であれば￥OKです。

②Raspberry PIの専用のカメラ
＞Rev 1.3バージョンです。

③最新のRaspbian OSをSDカードへインストールする。

④ネットワークに接続しておく。

#事前コマンド実行
最初OSをインストールした場合、以下のコマンドを必ず実行してください。

```bash
①sudo apt-get update
②sudo apt-get -y upgrade
```

#専用カメラが正常に接続されているか確認
以下のコマンドを実行すると次の結果が表示されれば正常にカメラが認識している状態です。

```bash
pi@raspberry:~ $ vcgencmd get_camera
supported=1 detected=1
pi@raspberry:~ $
```
上記の結果で「supported=1 detected=1」が表示されたら問題なく動作していることです。
次のコマンドでカメラから直接画像を撮ってみましょう。

```bash
pi@raspberry:~ $ raspistill -o firstpic.jpg
pi@raspberry:~ $ ls
Bookshelf  Desktop  Documents  Downloads  firstpic.jpg  Music  Pictures  Public  Templates  Videos
pi@raspberry:~ $
```

上記の画像ファイルをデスクトップで確認したい場合、Sambaを設定して、画像ファイルをローカルのデスクトップにコピーします。

※Samba インストール及び設定は以下のサイトを確認してください。
[「SambaをインストールしてWindows間にファイルを共有ができます。」](https://qiita.com/neomi/items/645e2c7184210f989828)

#ファイルを確認
Raspberry PIのIPアドレスを確認し、エクスプローラーからアクセスします。

```bash
pi@raspberry:~ $ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 25  bytes 1484 (1.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 25  bytes 1484 (1.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.22  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::ac31:cf0a:2ef2:c438  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:d6:9d:8f  txqueuelen 1000  (Ethernet)
        RX packets 6662  bytes 5641106 (5.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4457  bytes 1619851 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

上記のIP「\\\192.168.1.22」にアクセスします。

#IPアドレスでアクセスした場合の表示
下記のフォルダをダブルクリックするとSambaで設定したパスワードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/6a8f9bdd-513f-4fb3-d449-a76afa5533d5.png)

次のパスに移動しましょう
[/home/pi]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/e14ef533-64c8-70b8-6e33-86df33efe6ad.png)

[raspistill]コマンドで撮ってた画像ファイルをダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/9a15523b-642f-968c-2b34-fa21e4c095e9.png)

次のように画像が撮れていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/5cb82253-08f4-a614-56d1-f75d7896e700.png)

#終わりに
本当はZoomの動作も確認したかったですが、今試しているRPI3A＋はダメでした。
メモリが512MBであるためブラウザを起動すると本体が固まったので、中止しました。
近いうちにRPI4へカメラを繋げて再度試してみます。
SwiftUI でアプリ全体の TintColor を変更する

## SceneDelegate で色を指定する

SwiftUI プロジェクトを新規作成すると、 SceneDelegate 内に UIWindow を生成するコードがデフォルトで用意されるはずです。
生成された window の `tintColor` プロパティに任意の色を指定すると、アプリ全体の **TintColor** を変更することができます。

```swift:SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    let contentView = ContentView()

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: contentView)

        // この 1 行を追加する
        window.tintColor = .systemGreen

        self.window = window
        window.makeKeyAndVisible()
    }
}
```

今回の例では systemGreen を指定していますが、 型は UIColor なのでアプリのイメージカラーに応じて自由に設定できます。
例のように systemColor にしておくと、ダークモード時にシステム側が上手く色を調整してくれるので大変便利です。
カスタムカラーを用いるかどうかはデザイナーさんと相談して決めてください。

```swift
window.tintColor = UIColor(displayP3Red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
```

ちなみに残念ながら `window.tintColor` で指定した値は Preview には反映されません。

## 余談

SwiftUI で色を変更する手段として、 `foregroundColor()` , `accentColor()` , `background()` などを設定する方法があります。
これらを `ContentView` のようなルートとなる View に設定して色を変えるという方法も考えられます。

```swift
struct ContentView: View {
    var body: some View {
        TabView {
            ...
        }.accentColor(.green)
    }
}
```

この場合は Preview にも反映されるため、その恩恵を受けることができます。しかし、

**色の指定が反映されない View もあるので注意が必要です。**


例えば Button 内の Text がデフォルトカラーのまま表示されることを確認しています。
この挙動はおそらく不具合ではなく SwiftUI の仕様です。

全体の色を一括で変更したい場合は `tintColor` を指定し、`accentColor()` などは各 View に対して細かな指定をしたい場合のみ設定する方が良いと思います。
Windows で一部のキーボードが勝手に入力 連打される




タイトルの通りだが、
起きたので一応メモ。



# 起きたこと

突然Windows7 ノートの キーボードの不調、 `9` の連打が始まった。(これでは妨害されてなにもできない。)
キー入力試してみると、周りの`i` `8` `0` を押すときに反応し連打が開始するようだ。

# 試したこと

* Keyboard test ツール (以下リンク)
* Safe boot (普通に連打が起きたで、ソフトウェアが問題ではなさそう)

https://www.passmark.com/products/keytest/

# 解決法

どうやら、ハードウェアに問題がありそうなので、
とりあえず、以下のキーバインドを変更できるソフトでレジストリを変更して
問題のあった  `9` を無効にした

https://keytweak.informer.com

結果、9キーは使えないが、
連打は止まり、周りのキーはまともに使えるようになったので
とりあえず、。
GUIテストにおけるUFTのレポート2種類の違いについて

#はじめに

ここ最近業務上UFTを使うことが多くなってきています。
なんでレポートの出力方式が2つあるの？違いは？どう使い分ける？と疑問を持ったのでちょっと書いておこうと思います。
まだまだ使い始めたところなので、何かあれば教えていただけると嬉しいです。

**GUIテストで使用したときのことのみ**記載をします。
後にAPIテストで使用したら書き加えます。 

# UFTのレポートについて

UFTでは下記の2種類でレポートを出すことが可能です。

- HTMLレポート
- Run Results Viewerレポート

今の所、自分はHTMLレポートを使用しています。

## 設定の方法について

違いについてまとめる前にこの2つをどこで切り替えているかだけ記載しておきます。
ツール > オプションから下記のウィンドウが開きます。
その中の「実行セッション」で変更が可能です。
<img width="572" alt="UFT_Report.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/b62f4fea-de1c-5221-618a-f31ab46768fc.png">


## HTMLレポートとRun Results Viewerレポートの違い

違いは端的に言うと**テストフローが見やすいか否か**だと思います。
HTMLレポートのほうが見やすい。
なのでGUIテストではHTMLレポートを使用するほうがよい、と私は考えています。
実際の画面の感じは下記のとおりです。

HTMLレポートだと
<img width="960" alt="UFT_HTML.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/6033258e-1506-09a6-910a-faab5ce22bba.png">
こんな感じで実行結果が確認できます。（UFT内でするのか、標準設定のブラウザで見るのかは先の設定画面で変更可能）

テストがFailしたときもこんな感じでどのステップでFailになったのか、スクリーンショットもあります。
<img width="960" alt="UFT_HTML_F.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/b7c2d8f3-c553-47b3-c86f-6725c17a6bbd.png">

一方RunResultsViewerレポートでは、初期設定にそもそもテストフローを見る画面が表示されておらず…
<img width="670" alt="UFT_RunResult.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/3931a763-fe31-b4d5-8a38-0a4af49f8a45.png">

メニューバー>表示>テストフロー
から表示を行っても、GUIテストでは何も表示されません。
<img width="960" alt="RunResults_F2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/d8723603-1ded-3142-f8e4-856df8a8a08c.png">

一応どこで落ちたのかの確認はできます。
左のバーをポチポチ開いていって、バツマークが出ているところを見ていけばどこのステップで落ちたのかがわかります。
ただちょっと手間がかかって面倒。

<img width="960" alt="UFT_Run_F.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/14ddd9b0-f1d6-fb1d-e7b9-e1f651cd5d37.png">


結論として、GUIテストで結果を簡単に確認するにはHTMLレポートのほうが便利だと思います。
TerminalでPython使ったときの終了の仕方(Mac)

# はじめに
はじめまして！初めての投稿です。
投稿練習、自分用メモとして書きます。

#環境
macOS Catalina 10.15.5

#内容
macには標準でpythonが入っていて、Terminalから使うことができます。
起動の仕方と終了の仕方を記します。

#手順
- はじめ方  
terminalを立ち上げて、"python"と入力するだけです。

```command
~$ python
```

- 終わり方  
ctrl + Dと入力するとpythonから抜けられます。  
または、`exit()` あるいは `quit()` と入力してもOKです。
細かいことまとめ

##はじめに

pythonでのいろんな操作を忘れてしまうのでまとめていこうと思います！
勉強したら更新していく予定です:mushroom:

##zipファイルの解凍

google colaboratryなどのnotebookを用いた時にデータセットなどのzipを解凍する方法です:hugging:

```googlecolab
!unzip "drive/My Drive/~/nyannyan.zip"
```

##.csv, .tsvを読み込む

```python
import pandas as pd
#csvを読み込む
csv = pd.read_csv('path.csv')

#tsvを読み込む
tsv = pd.read_table('path.tsv')
```

zipなどで圧縮されたcsvファイルをそのまま読み込むこともできる。

```python

df_zip = pd.read_csv('Path.zip')
```

##DataFrameの値をリスト型に変換

```python
import pandas as pd

df = pd.DataFrame([['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], ['a', 'b', 'c', 'd', 'e', 'f', 'g']])

#valuesのtolistでリスト形式に戻す
df.values.tolist()
```

##DataFrameのカラム抽出
カラム名(列名)を指定して特定の列を抽出できる

```python
import pandas as pd
#"A"列を抽出
df['A']

# . (ドット) を利用しても同じ結果が得られます。
df.A

#複数のカラムを抽出
df[['A', 'B', 'C']]
```

##DataFrameのカラムの名前を変更
```python
#'A'のカラム名を'a'に変更、'C'のカラム名を'c'に変更
df.rename(columns={'A': 'a', 'C': 'c'})
```

#DataFrameから条件を指定して値を抽出
```python
#'age'のカラムの値が25未満のものを抽出
df[df['age'] < 25]

#.query()を使っても同じ結果を得られる
df.query('age < 25')

#複数選択も可能
#ageの値が25　かつ　pointが50以上のものを抽出
df_store.query('(age == "25" & point > 50)')

#notも使える(age=50またはpoimnt>50でないものを抽出)
#| = OR, & = AND,  
df_store.query('not(age == "25" | point > 50)')
```

##特定の文字列を含む行を抽出
これはデータ処理100本ノックで初めて使いました:sunglasses:

```python

#str.contains('li')：特定の文字列を含む
df[df['name'].str.contains('li')]

#str.endswith():特定の文字列で終わる
df[df['name'].str.endswith('e')]

#str.startswith(): 特定の文字列で始まる
df[df['name'].str.startswith('B')]
```




##参考文献

[Google Colaboratoryでzipファイルの解凍とか。あれこれメモ](http://tsukiblog.net/?p=641)

[pandasでcsv/tsvファイル読み込み（read_csv, read_table）](https://note.nkmk.me/python-pandas-read-csv-tsv/https://note.nkmk.me/python-pandas-read-csv-tsv/)


[【便利】Python 標準のリストと Pandas のDataFrame, Seriesを相互に変換する方法をまとめてみた](https://yolo.love/pandas/tolist/#Series)


[Pandas でデータフレームから特定の行・列を取得する](https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA)

[pandas.DataFrameの行名・列名の変更](https://note.nkmk.me/python-pandas-dataframe-rename/)

[pandas.DataFrameの行を条件で抽出するquery](https://note.nkmk.me/python-pandas-query/)

[pandasで特定の文字列を含む行を抽出（完全一致、部分一致）](https://note.nkmk.me/python-pandas-str-contains-match/)
Windows Server 2019日本語化をPowershellで実行してみる

# 背景
AWSのEC2インスタンスでWindows serverを作成したとき、毎回日本語化するのが面倒でPowershellを使って自動化するためにまとめた記事です。
今回は、Powershellに手打ちで入力しています。自動化にはほど遠いので徐々にアップデートします…

# 環境
- AWS EC2　
- インスタンスタイプ：t2.medium （無料枠t2.microでも可能です）
- メモリ使用量：1.5GB、CPU：大体50%なのでt2.microだと動作が遅くなることがあります
![WS000002 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96755/f8f8e15c-7be0-bfef-3432-d2195407208c.jpeg)

- AWSを利用しましたがAzureでもVMでも変更点はありません
- Windows serverがインターネットへ接続できる設定は各自でお願いします（インターネットゲートウェイやルーティングなど）

# 手順
日本語化するまでの手順とPowershellのスクリプトを紹介。
なおEC2インスタンスの起動やリモートデスクトップの接続は割愛しています。

## 言語パッケージの準備
```powershell
Invoke-WebRequest -Uri https://software-download.microsoft.com/download/pr/17763.1.180914-1434.rs5_release_SERVERLANGPACKDVD_OEM_MULTI.iso -OutFile C:\lang.iso
```
ISOのダウンロードです。2.6GBもあるので、かなり時間がかかります。。。
　![WS000001 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96755/907e6bae-2f15-8400-ee91-f75492f342f7.jpeg)

ダウンロードが完了したあと、下記のコマンドを実行する。
（ダウンロード完了するとコマンドが入力できる状態に戻ります）

```powershell
$mountResult = Mount-DiskImage C:\lang.iso -PassThru
$driveLetter = ($mountResult | Get-Volume).DriveLetter
$lppath = $driveLetter + ":\x64\langpacks\Microsoft-Windows-Server-Language-Pack_x64_ja-jp.cab"
C:\windows\system32\Lpksetup.exe /i ja-JP /f /s /p $lppath
Restart-Computer 
```
Cドライブ直下にはダウンロードしたlang.isoファイルがあります。
![WS000003 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96755/9c1ced83-83dc-ffb8-ec3f-d6ca77fb19d5.jpeg)

上記のコマンド入力が完了したら、WindowsServerを再起動します。（インストール直後なので再起動にも時間がかかります）
※リモートデスクトップで接続できないときは、OSの画面を確認してみてください。（インストール中の青い画面のことが多いです）
　EC2では「インスタンスの設定」→「インスタンスのスクリーンショットの取得」から画面の状況がわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96755/bef3fc49-42d3-a262-175d-f4d248901fca.png)

```powershell
Set-WinUserLanguageList -LanguageList ja-JP,en-US -Force
Set-WinDefaultInputMethodOverride -InputTip "0411:00000411"
Set-WinLanguageBarOption -UseLegacySwitchMode -UseLegacyLanguageBar
Restart-Computer 
```
上記コマンドを実行すると、再起動が実行されます。
リモートデスクトップで接続ができるようになったら、下記コマンドを実行する

```powershell
Set-WinUILanguageOverride -Language ja-JP
Set-WinCultureFromLanguageListOptOut -OptOut $False
Set-WinHomeLocation -GeoId 0x7A
Set-WinSystemLocale -SystemLocale ja-JP
Set-TimeZone -Id "Tokyo Standard Time"
Restart-Computer
```
これで日本語化パッケージのインストールが完了します。（見慣れた日本語が表示されるようになります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96755/663ee453-bc95-6ca3-4f47-19f0d8d2ebcd.png)

# 参考
https://dev.classmethod.jp/articles/windowsserver2019_to_japanese/
PowerShellを引用させていただきました。ありがとうございます

# 課題
日本語パッケージのダウンロード、再起動など待ち時間があり、接続してコマンド入力しての手間があるので、ここあたりも自動化してみたいと思います。
Agile、DevOpsそして運用にTPSのプラクティスをマッピングする。

AgileはTPS（Toyota　Production　System)を真似たLeanとトヨタ自動車の主査の仕事を観察してScrumのProduct Owner　と　Scrum Masterが生まれています。
今回はAgile、DevOpsそして運用へ適応できるTPSのプラクティスを紹介します。
先ずは全体のマッピングを紹介して、今後の投稿で適宜、個々のプラクティスの説明を加えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621379/15e63e3f-9966-22b6-fdb9-23b7b4c49a54.png)
～ローカルからサーバーへ～：webページを公開するには？？

#前提
webページを作成後、世に自分の制作物を。
その際に、必要となる物は？

#必要なものは？
1.ドメインを取得する
2.サーバーを借りる
3.**FTP：webページをサーバーへアップロードする。**

##ドメインって？
ホームページのURLに記載されている。ホームページの「住所」みたいなものです。

https://www.～～～.com

～～～.comの部分がドメインに当たります。

ドメインには、独自ドメインとサブドメインがあります。

サブドメインは、独自ドメインを分割して、サブドメインとして複数人に配布しています。無料で借りれます。

独自ドメインは、自分で好きなように使うことが出来ます。

##サーバーとは？
データを保管しておく場所です。

##FTPって？
FTPは、File Transfer Protocolのことで、「ファイルを転送する際の通信規約」の事です。

通信の行うには、FTPサーバーとFTPクライアントの間で通信が行われています。

FTPは**「サーバーから、クライアントへの受け渡しの中継役」**という事ですね。

主に、ファイルをアップロードしたり、ダウンロードする際に使われます。

その際には、ソフトが必要となります。
例として、「FFFTP」や「FileZilla」などがあります。

FTPの気を付ける点として、**セキュリティ面**です。
ファイル転送の際、通信は暗号化されていません。
そのため、通信内容が外部に漏れる危険性があります。

そのため、FTPの代わりにSSHを使って暗号化した「SFTP」が使うのが良いとされています。

#参考
・[ホームページをアップロード！初心者でもわかるホームページ公開方法](https://kukuli-blog.com/homepage-upload/)
・[ファイル転送の「FTP」とは？通信の仕組みやデメリットなどを解説](https://it-trend.jp/file_transfer/article/104-0004)
【Swift】NSLayoutAnchorを使用し、AutoLayoutをコードで実装してみる（画面の右下に固定したボタンを表示）

##はじめに
いつもはStoryboardからAutoLayoutを使用し制約を付けていたのですが、
コードから制約をつける機会があり、NSLayoutAnchorを使用したので、その方法を記載したいと思います。
今回はTwitterのように、画面の右下に固定されたボタンを表示させる方法を書いていきます（UITableViewの上に設置しています）。
<img width="400" alt="概要" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590610/09ac9130-8c8c-fab4-e9ce-430197973f95.png">

##環境
- Swift：5.1.3
- Xcode：11.3.1

##NSLayoutAnchorの使い方
[こちら](https://qiita.com/dddisk/items/8001598ea7951bcdcc30)の記事が詳しいです。
どの位置を起点にして制約をつけるかは、先ほどの記事を引用させていただくと下記のようになります。

| プロパティ名 | 位置 |
|:--|:--|
| leadingAnchor | 左端 |
| trailingAnchor | 右端 |
| topAnchor | 上端 |
| bottomAnchor | 下端 |
| centerYAnchor | オブジェクトのY座標軸の中心 |
| centerXAnchor | オブジェクトのX座標軸の中心 |
| widthAnchor | オブジェクトの横幅 |
| heightAnchor | オブジェクトの縦幅 |

##実装してみる

```swift
// UIButtonを生成する
let plusButton = UIButton()
// 必ずfalseにする（理由は後述）
plusButton.translatesAutoresizingMaskIntoConstraints = false
// tintColorを黒にする
plusButton.tintColor = .black
// グレーっぽくする
plusButton.backgroundColor = UIColor(red: 0.92, green: 0.92, blue: 0.92, alpha: 1)
// 正円にする
plusButton.layer.cornerRadius = 25
// plustButtonのImageをplus（+）に設定する
plusButton.setImage(UIImage(systemName: "plus"), for: .normal)
// ViewにplusButtonを設置する（必ず制約を設定する前に記述する）
self.view.addSubview(plusButton)

// 以下のコードから制約を設定している
// plustButtonの下端をViewの下端から-50pt（=上に50pt）
plusButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50).isActive = true
// plustButtonの右端をViewの右端から-30pt（=左に30pt）
plusButton.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -30).isActive = true
// plustButtonの幅を50にする
plusButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
// plusButtonの高さを50にする
plusButton.widthAnchor.constraint(equalToConstant: 50).isActive = true
```

###注意点
####制約は必ず部品を配置してから
部品を配置していないのに制約をつけることはできません。
つまり、今回で言うと制約を設定する前に`self.view.addSubview(plusButton)`を記述しておく必要があります。
そうしないとビルドは通りますが、下記実行時エラーでクラッシュします。

```
Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with anchors <NSLayoutYAxisAnchor:0x600003dec2c0 "UIButton:0x7fa4a7704d90.bottom"> and <NSLayoutYAxisAnchor:0x600003d6b140 "UIView:0x7fa4a77024c0.bottom"> because they have no common ancestor.  Does the constraint or its anchors reference items in different view hierarchies?  That's illegal.'
```

####translatesAutoresizingMaskIntoConstraints は false に
translatesAutoresizingMaskIntoConstraintsはAutoLayout以前に使われていたAutosizingというレイアウトの仕組みを、AutoLayoutに変換するかどうかを設定するフラグらしいです。
デフォルトでは、trueになっていますが、Autosizingの制約とAutoLayoutの制約がコンフリクトを起こす可能性があり、意図した動作にならないことがあるのでfalseにしましょう。
今回の場合、falseに設定しないとplusButtonが表示されませんでした。
Rustで256bitの暗号論的疑似乱数を取得する

# はじめに
普段の生活で256bitの暗号論的疑似乱数を取得したいなぁって思うことありませんか？　僕はありませんが......。
この記事ではそんな願いを叶えるために、Rustでのプログラムを解説します。

# 暗号論的疑似乱数って？
暗号論的疑似乱数生成器 ( *CSPRNG* ) を用いて作られた乱数のことで、再現可能な周期が排除されています。
ただの疑似乱数発生器( *PRNG* )とちがい、それによって生成される乱数は推測することができないので、その分だけセキュリティ的に強固なわけですね。

アクセストークンの生成などのユースケースが考えられます。

## 暗号論的疑似乱数生成器の性質

暗号論的疑似乱数生成器には以下のような性質（というか、仕様）があります。

* 全ての暗号論的疑似乱数生成器は 乱数列の最初の k ビットを与えられたとき、k+1 番目のビットの値を多項式時間で2分の1をこえる確率で予測するアルゴリズムが存在しない。
* 全ての暗号論的疑似乱数生成器はその状態の一部または全部が明らかになっても（あるいは正しく推測されても）、明らかにされた状態より以前に生成された乱数列は再現できない。さらに、実行中にエントロピーの入力がある場合、その入力を知っていても暗号論的疑似乱数生成器の将来の状態を予測できない。



# 使ったクレート
* rand (乱数生成のクレート)
* rand_chacha (CSPRNGのアルゴリズム)
* bigint (64bit以上の大きなintを扱うクレート)

```toml:cargo.toml
rand = {version = "0.7.3"}
rand_chacha = "*"
bigint = "4"
```

# コード

```rust:main.rs

use rand::prelude::*;
// rand クレートは乱数を扱うクレート
// 疑似乱数生成器の実装のほか、暗号的乱数生成器も用意されている

use rand_chacha::ChaCha20Rng;
// randクレートの暗号的乱数生成器のアルゴリズムは内部的に隠蔽されていて、
// 将来に渡って変更可能性があるため、こちらのrand_chachaクレートのアルゴリズムを直接使うのが公式で奨励されている

use bigint::U256;
// rustの標準では256bitの整数の型は用意されていないため、こちらのクレートを用いる。

fn main() {
    let mut csp_rng = ChaCha20Rng::from_entropy();
    // ChaCha20Rngは暗号的乱数生成器のアルゴリズムの名前らしい。
   // from_entropy()関数は引数を与えなければ実行機のハードウェアの状態から乱数生成器を作成する。

    let mut data = [0u8; 32];
    // randクレートは直接256bitの乱数を扱えないため、8bit x 32ブロックのスライスとしてデータを保持する。
    csp_rng.fill_bytes(&mut data);
    // dataのスライスを埋める

    let num :U256 = U256::from(data);
    // U256の型には[u8; 32]へのFromトレイトが実装されているため、これで変換ができる。 
    println!("CSPRNG Generates: {:?}", num);
}

```

# 終わりに

暗号/セキュリティ関連は何も知らないので何か間違えたことや補足があれば教えて頂きたいです。
Kubernetes基礎(11)：DaemonSet, Job, CronJobの概要

##DaemonSet
<img width="358" alt="スクリーンショット 2020-07-14 14.17.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/ee41a504-3225-3e92-bf6c-6500544fbf62.png">
ReplicaSetはPodをスケジューラによってNodeに配置する時、上記の図のようにNode1にresourceが多く残っている状態ならNode1にPodを多く生成し、Node3のようにresourceがなければPodを生成しない。
一方、DaemonSetはNodeのresource状態とは関係なく、すべてのNodeにPodを一つずつ作る特徴がある。
もしNodeが10個なら、それぞれのNodeに1ずつ合計10個のPodが生成される。

このように、それぞれのNodeにインストールをしなければならServiceが下記のように3つあります。
**性能収集**
各Nodeの性能状態はすべて監視対象になる。
Prometheusのようなagentがインストールされていると全てのNodeの性能状態をモニタリングシステムに送信することができる。
**Log収集**
特定のNodeに障害が発生した場合は問題を把握するためにLogを分析する必要があるがfluentdのようなサービスが各NodeのLog情報を収集してくれる。
**Storage活用**
NodeをStorageに活用することができ、GlusterFSのようなサービスをそれぞれのNodeにインストールするとNodeのresourceを使ってネットワークファイルシステムを構築できる。

※Kubernetesもネットワーク管理をするために、各NodeにDaemonSetでProxyの役割をするPodを作成する。
				
###Job&CronJob
<img width="371" alt="Job&amp;CronJob.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/9deb4caf-4dbc-2681-5154-99f672e6259a.png">
上の図のようにPodを直接作成する場合もあるし、ReplicaSetを使って作成したPodもあるし、Jobを使って作成したPodもある。
全て同じPodだが直接作成したかそれともControllerで作成したかによってPodの違いを説明すると
**Podを直接作成した場合は**、Node1がダウンされた場合はサービスの運用ができなくなる。(Service Down)
**PodをController(ReplicaSet、Job)で作成した場合は**、Controllerが障害を検知すると、他のNodeに再生成するので
サービスを引き続き提供できる。
ReplicaSetで作成されたPodは仕事をしないとPodをrestartさせるから、このPodのサービスは、何が起きてもサービスを維持する目的で使わなければならない。
※recreate：Podを再作成するので、Pod name、IP addressが変更される。
※restart：Podは変更せずいにPod内のContainerだけ再起動させる。
**Jobで作成されたPodは**、プロセスが動いてないとPodは終了となる。
終了の意味はPodが削除されるのではなく、resourceを使用していない即ち止まっている状態である。この状態でもPodの中に入ってLogを確認することができる。
このようにPodを作成する主体によって状況に応じてPodの動作が異なるので、よく知って使う必要がある。
**CronJob**はJobを定期的に生成する。
殆どJobを1つの単位としては使わずにCronJobを作成して特定の時間に繰り返して実行する目的で使う。
複数のユースケースがありますが
毎日のデータのバックアップとか定期的なアップデートの確認、予約メールやSMSのメッセージを送信などの作業にも使える。
AWS Budget でアラームの設定方法について（Amazon SageMakerの例）

### 背景
AWSでBudget・予算作成時にアラート設定ができます。これで予算がしきい値を超えた時、アラートを発信するようになる。
今回は「特定のMLプラットフォームサービスAmazon SageMakerに対して、プロジェクト（pjt）毎のコストを観察・アラートする」を目的にして、AWS Budget でのアラーム設定方法を説明。

### 予算作成方法
まずは、AWS Console ホームページでBudgets選択し、「予算を作成する」をクリックする。これで、「予算作成」画面に飛んで行く。
![Screen Shot 2020-07-14 at 19.07.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/a5ba755c-9dd7-0792-0e1a-f8cc5f583b53.png)

予算作成には主に以下４つのステップがある。
ステップ１：予算タイプの選択
ステップ２：予算の設定
ステップ３：アラート設定
ステップ４：予算の確認

#### ステップ１：予算タイプの選択
予算タイプの選択のために、各予算タイプの特徴を以下にまとめた。

**コスト予算：**サービスとタグでフィルタリングし、アラート設定できる
**使用量予算：** EC2、RDS、S3についての使用単位数を観察対象となる。全てのサービスに対してフィルタリングはできない
**予約予算：**RIタイプのEC2インスタンスを対象とする
**Savings Planの予算：**Saving Plansの使用率とカバレッジ２つのSavings Planタイプに分かれて、更にSavings Planタイプ、関連アカウント、リージョンなどのパラメータでフィルタリングできる。サービスとタグでのフィルタリングはできない


「特定のサービスSageMakerに対して、PJT毎のコストを観察・アラートする」という目的に対して、コスト予算のみ使えますので、「コスト予算」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/03355eb0-61fb-3e57-b614-9c7b3b36433b.png)

#### ステップ２：予算の設定
続いて予算の名前、開始日などを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/10af1fb1-fd7f-11ad-f04a-a987b7215710.png)

予算パラメータ（オプション）内、サービスとタグに基づいたフィルタリングができる。ここでサービスをSageMakerを選択し、タグにSageMakerリソースを作成時に設定したタグを選択することで、フィルタリングできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/1edabb35-449e-cf15-2e90-6d31459e2646.png)

※ 今回はタグ作成していないため、空白にした。タグの作成方法は以下「SageMakerのリソースのタグ付け」をご参照ください。

##### SageMakerのリソースのタグ付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/7a1e7514-ca3c-77dd-af12-291596912871.png)

* SageMakerが使用されるリソースを、タグ付けでpjt単位で分けれる<br>例えば、pjt１のNotebook Instanceにタグ「pjt１」を付ける

* SageMakerのタグ付けができるリソース対象は、ノートブックインスタンス、トレーニングジョブ、モデルになる。

#### ステップ３：アラートの設定
以下「次に基づいてアラート送信」に実際のコストまたは予測のコストを選択し、アラート閾値を設定する。AWSよりメール通知できるため、連絡メールを入力。SNSトピックを通じて通知することが要る時、SNSトピックのARNを入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/9aab7a59-8bd7-8215-5db2-c13c1e0d1fa3.png)


#### ステップ４：予算の確認
最後、予算の確認画面で設定した情報を確認ください。
ここの例では、「SageMaker」でフィルタリングし、「メール通知」には１Contactと設定している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/f2e1950e-426c-fa92-ee06-7d89d49962f6.png)
ターミナルのcalコマンドで土日祝日に色をつける

## やりたいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444546/ece7f3e9-bc46-7054-ccc7-57133da9a7ef.png)


## 環境
・go getできる($GOPATHが通ってる)

## 手順

jpcalをgo get

```
$ go get github.com/y-yagi/jpcal
```

~/.zshrc（~/.bashrc）に以下を追記

```
alias cal='jpcal' 
```

あとは `sorce　~/.zshrc` で読み込み直せば終わり。

## 圧倒的感謝

[y-yagi/jpcal](https://github.com/y-yagi/jpcal)
hogeプロジェクトにbarでアクセスする設定

```configuration:nginx.conf
# location プレフィックス
# = 完全一致 
# ^~ 前方一致。一致したら正規表現を適用しない。 
# ~ 正規表現(大文字・小文字を区別する) 
# ~* 正規表現(大文字・小文字を区別しない) 
# なし 前方一致 
location /bar {
    # よくわからん時はエラーログを参考にする
    # error_log logs/laravel_error.log  debug;

    # rootとalias違い
    # root → /nginx/html/hoge/public/bar
    # alias → /nginx/html/hoge/public
    alias /nginx/html/hoge/public;
    
    # try_files
    # $uri $uri/ ファイル検索
    # /index.php?$query_string rewriteと同様
    try_files $uri $uri/ /index.php?$query_string;
    
    # /hoge/foo にアクセスがあった場合はファイルがないので
    # rewriteして再評価している
    # REQUEST_URIは変更されずlaravelで読み込まれる
    if (!-e $request_filename) { rewrite ^ /bar/index.php last; }
    
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        # laravelはindex.phpしかアクセスしない
	fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    }
}
```
SwiftUI で @State の初期状態を外から受け取る

## <span>@</span>State private var の場合

例えば、テキストを編集するための View について考えてみましょう。

1. 前画面から既存の文字列を受け取り、 TextField の初期値として表示する
2. 表示された文字列を修正することができる

このような仕様の場合、 1 は以下のようなコードで実現できます。

```swift
struct TextEditView: View {
    @State private var text: String

    init(text currentText: String) {
        _text = State(initialValue: currentText)
    }

    var body: some View {
        TextField("", text: $text)
    }
    ...
}

let currentText = "Today was a good day."
TextEditView(text: currentText)
```

あれ？こっちは？？

```swift
struct TextEditView: View {
    @State private var text: String

    init(text currentText: String) {
        text = currentText    // ❗️ Return from initializer without initializing all stored properties
    }
    ...
}
```

初期化が完了していないというエラーが出ます。text に代入してるのに。。

実は初期化する必要があるのは、 

`文字列` ではなく `文字列の状態`
`String` ではなく `State<String>`
`text` ではなく `_text` [^1]

[^1]: _ (アンダースコア) を付けることで Property Wrapper 自身にアクセスできる。

です。 text の **初期状態** をセットしてあげる必要があります。
(初期値ではなく、初期状態と表現する方が適切かと思います。)

今回の例では `currentText: String` を `State` でラップし **状態** として代入しています。

```swift
_text = State(initialValue: currentText)
```

## <span>@</span>State var の場合

こちらは素直にコンパイルが通ります。

```swift
struct TextEditView: View {
    @State var text: String
    ...
}

let currentText = "Today was a good day."
TextEditView(text: currentText)
```

イニシャライザが内部でうまく処理してくれてるのかな。
LambdaからAuthFlow=USER_SRP_AUTHでCognitoの認証を通す

## 目的

Lambdaから`InitiateAuth`の`AuthFlow`を`USER_SRP_AUTH`でCognitoの認証を通す。

※`AdminInitiateAuth`の`ADMIN_USER_PASSWORD_AUTH`を使って良いならそっち推奨
（boto3の`admin_initiate_auth`使ってID/PWだけで簡単に実装できる。）

## 方法

自力でやろうとすると、`initiate_auth`、`respond_to_auth_challenge`を実行する必要があるが、
`respond_to_auth_challenge`の方の`PASSWORD_CLAIM_SIGNATURE`の計算で挫折してしまうため、
[こちら](https://github.com/capless/warrant)を拝借する。。
※`pip install`できる（はず）だが、ファイル数が少ないので直接ダウンロードして使う。

`__init__.py`が居ると、色々インストールしないといけなくなるため、削除してしまってOK。
（↓になるように）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/71b02435-087d-e025-ee67-d613a29a3abd.png)

Lambdaに下記を実装する。

```python
from warrant.aws_srp import AWSSRP

u = AWSSRP(pool_id='ユーザプールID', client_id='クライアントID', username='ID', password='PW')
res = u.authenticate_user()
id_token = res['AuthenticationResult']['IdToken']
```

## スペシャルサンクス

* [Warrant@GitHub](https://github.com/capless/warrant)
[WIP]プロダクト開発の"方針"は誰が決めるべきか

# プロダクト開発の"方針"
誰が決めるべきか
誰のものか

# そもそも


# 方針と言っても色々なことがある
プロダクト開発ロードマップ
注力(新規機能の開発か、インフラ整備か、技術的な負債の解消か、既存機能の解消か、マーケとの連携か)
採用言語・採用アーキテクチャ・採用基盤
レビューの柔軟度
Lint・コーディング規約の方向性
採用(誰・どんな人と働きたいか)
分業の方法(水平か・垂直か)
利用規約・データ管理
バグ対応

# 組織の大きさ
学生ベンチャー
メガベンチャー
サイドプロジェクト
少人数ベンチャー
中規模ベンチャー

# 担当可能なメンバー
CEO
PO
CTO
リードエンジニア
エンジニア

# 大事なこと
売上
事業の手触り感
テスト環境をぶっ壊しかけた話

この記事は、[Qiita夏祭り](https://qiita.com/summer-festival)企画の、[Qiita夏祭り2020_パソナテック](https://qiita.com/tags/qiita夏祭り2020_パソナテック?page=2)カテゴリにある

「テーマページ②:システム開発における過去の失敗と乗り越えた方法について共有しよう！」

です。
（長い）

他の方の記事は、[qiita夏祭り2020_パソナテック](https://qiita.com/tags/qiita夏祭り2020_パソナテック)タグでぜひどうぞ。

# え、誰でも通る道じゃないの？
本番環境、テスト環境に限らず環境をぶっ壊す話、結構あると思う（あっちゃいけないでしょ）けど、もちろん私も経験しています（偉くないから。。。）。

# 昔はよかった（のか？）
こう書くと「あなた幾つ？」となるんですが、汎用機([メインフレーム](https://ja.wikipedia.org/wiki/メインフレーム)ともいう)がシステム開発として普通だった頃からこの業界にいます。
汎用機の頃に新人だったのですが、汎用機を扱うプロジェクトでは、とにかくマシンにコードを載せるだけでもいくつもいくつも手順があり、何重にも人の目が通り、チェック項目もたくさんあり、という状況なので、「この手順を踏めば大丈夫」「コードを担当者に渡せば後は○時にはテスト環境が新しくなってテストができるはず」という環境でした。
このお役分散は、やることが分担されているため、自分のやることが明確でした。
なので、自分の範囲は完璧なのです。

はい、自分の範囲が。

そして、汎用機の場合は、マシンルームがあるので実務的な部分は全て丸投げです。（でした）

# それからちょっとして
入社した会社が倒産しました。
バブルに弾け飛んだんです。
転職した業界は同じでしたが、時代は汎用機よりも[ワークステーション](https://ja.wikipedia.org/wiki/ワークステーション)（これすら懐かしい）でしょう、という時代になり、データのやり取りを[フロッピーディスク](https://ja.wikipedia.org/wiki/フロッピーディスク)（！）で自分の開発したコードをテスト環境に足で（今はネットですが）持っていってました。
ワークステーションなのに、なぜフロッピーディスクを持っていっていたかというと、開発環境は[スタンドアロン](https://ja.wikipedia.org/wiki/スタンドアローン)(て、わかります？)のPCだったからです。
なので、出来上がったコードはフロッピーディスクに入れて、テスト環境まで持っていきます。
フロッピーディスクに限らず、endコードを書き込むまでに少し時間かかります。

# 「急いでいた」は言い訳にならない
とあるプロジェクトは結構急かされる環境で、自分の実力不足もあってあわあわしながらコードを書き、「よし、後はフロッピーディスクに保存して、、、」とフロッピーディスクに保存しました。
しかし、先ほども書いたようにendコードを書き込むまで少し時間がかかります。
今のように「終わりました」というようなメッセージが出るわけでもなく、終わると物理的に「かちっ」と音がするので、その後にフロッピーディスクを抜き取ります。
焦っていた私は、「かちっ」の「か、、、」で

終わった！

と思い、すかさずフロッピーディスクを抜いて持って行きました。

もうお分かりですね。

endコードが正常に保存されていない状態でテスト環境のマシンに読み込まれたフロッピーディスク。
テスト環境がみるみるうちに動かなくなる現象を目の当たりにし、さーーー、、、、と音を立てて血の気がひいていきました。

ほんとにやばい時って、ほんとに首が回らないというのを初めて経験しました。

その場で硬くなる私。
フロッピーディスクを受け取ってマシン作業をしていた先輩がすかさず鬼の形相で復旧。

「急いでいたは言い訳にならないぞ！」

ほんとに申し訳ない。。。
本番環境でなくてほんとによかった。。。

# とにかく慌てるな
この経験から、「保存」するという作業に神経質になった私。
キーボードのショートカットで保存をする時も、何度も何度も保存してしまいます。
そして、PCの電源を落とす時も気を使うようになり、シャットダウンして黒い画面になった後も３秒くらい待つようになりました。
終電が後５分後だとしても、ここで保存やシャットダウンをしたら、お泊まりコースだし、駅までは7cmヒールでとにかく突っ走ればなんとか間に合う（よくそんなヒールで走ってたな、私）、最後は駅員さんに大声で叫んで一瞬待ってもらおうという気持ちで、とにかく、慌てるな、慌てたら負け（何に？）と呪文のように唱えていました。

# 今でもとにかく慌てるな
今は、保存していないと開発アプリ側から「保存してないけど、いいの？」と聞いてくれます。
なんて親切。
きっと、いろんな人が私のように（？）失敗を重ねてアプリを便利にしてきたんでしょう。
ありがたいことです。
開発現場は、とにかく時間との戦いです。
でも、慌ててポカミスをしてしまったら、時間がない中積み重ねてきたことが全て崩れますので、ファイルを保存するときに限らず一区切りする時間を作り、見直したり確認する作業は大事です。
防げるミスは、防ぐ努力を。（自戒を込めて）
React Native でView コンポーネントのキャプチャ画像を取得する

# はじめに
React Native でUI 要素のキャプチャを取得したいと思ってやり方を調べたのでメモ。
Android については割愛します。


# 検証環境


- React Native v0.63.0
- iOS 13


## react-native-view-shot でキャプチャ画像を取得する

あるUI コンポーネントのキャプチャ画像を取得したいとします。

[gre/react-native-view-shot: Snapshot a React Native view and save it to an image](https://github.com/gre/react-native-view-shot) を使います。

```
$ npm i react-native-view-shot --save
$ npx pod-install
```

撮影したい要素を `ViewShot` コンポーネントでラップし、 `capture()` でキャプチャを取得します。

```tsx
import ViewShot from 'react-native-view-shot';

export const YourComponent: React.FC<Props> = (props: Props) => {
  const viewShot = useRef<any>(null);

  const capture = useCallback(() => {
    viewShot.current.capture().then((uri) => {
      console.log(uri);
    });
  }, []);

  return (
    <View style={styles.container}>
        <ViewShot ref={viewShot} options={{format: 'jpg', quality: 0.9}}>
           <View style={styles.targetView} />
           <TouchableOpacity onPress={capture} style={styles.button} />
        </ViewShot>
    </View>
  );
}
```


## @react-native-community/cameraroll で画像をフォトライブラリに保存する

取得したキャプチャ画像をiOS 端末のカメラロールに保存します。


[react-native-community/react-native-cameraroll: CameraRoll is a react-native native module that provides access to the local camera roll or photo library.](https://github.com/react-native-community/react-native-cameraroll) を使います。
 
```
$ npm i @react-native-community/cameraroll --save
$ npx pod-install
```

Info.plist に記述を追加します。

```plist
<key>NSPhotoLibraryUsageDescription</key>
<string>YOUR DESCRIPTION</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>YOUR DESCRIPTION</string>
```

`CameraRoll.save` でカメラロールに画像を保存します ( `CameraRoll.saveToCameraRoll` はdeprecated になっていました)。

```tsx
    viewShot.current.capture().then((uri) => {
      CameraRoll.save(uri);
    });
```

# さいごに

条件によっては上手くキャプチャされないような気が？
複雑なコンポーネントでも使えるのか要検証です。
【cluster】unity高速化【unityアクセラレータ、compressアセット】

- 要は、unityを細かいところで高速化するための記事です。
- clusterのワールドアップロードがすんごい時間かかるのは、windowsビルド、Macビルド、iOSビルド、アンドロイドビルドをすべて行っているため。
- そのため、これらの工程内の無駄を省くいくつかのオプションがあるというお話が、この記事。

# Unity Accelerator

[Speed up your team with the Unity Accelerator](https://blogs.unity3d.com/2019/09/11/speed-up-your-team-with-the-unity-accelerator/)
[日本語訳](https://blogs.unity3d.com/jp/2019/09/11/speed-up-your-team-with-the-unity-accelerator/)

[Unity Accelerator](https://docs.unity3d.com/ja/current/Manual/UnityAccelerator.html)

- コラボレート機能と合わせるとなんかすごいらしい
- 公式ではunity2019.3以降とあるが、clusterのクリエイターキットの対象が2019.4.1LTSになったので、問題なく実行できるようになった。

<img width="802" alt="assetpipeline01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/2d671705-43a8-c0cd-a337-237565947db4.png">

<img width="801" alt="assetpipeline02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/b6995e62-edaf-aa0c-5830-6723b326414e.png">

---

# Compress Assets on Import

- 各ビルド時にいちいちアセットなどを圧縮しないから早くなる雰囲気。

<img width="662" alt="CompressAssetsonImport01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/d4b69c5e-d15f-bc0f-9809-6ce02b457bb9.png">

<img width="660" alt="CompressAssetsonImport02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/438c6729-cc8b-118c-ed1f-d663b5679a94.png">
【ストロングパラメーター】

#ストロングパラメーターとは何か

<img width="701" alt="ストロングパラメーター.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/5e72c78b-edc3-b807-ab85-92d416305057.png">

コントローラーにアクションを定義する際に出てくるストロングパラメータとは何か解説していきます。

createアクションの実行内容の部分にcreate(tweet_params)と記述がありますがこの引数であるtweet_paramsはprivateメソッドの中に定義されています。

##privateメソッド
privateとはクラスの外から呼び出すことのできないメソッドのことです。
privateメソッドを使うことのメリットは以下の二点です

###1.classの外部から呼び出されると困るメソッドを隔離する
メソッドの中にはclassの外部から呼び出されるとエラーを起こすメソッドもあるため隔離しておくことでエラーを事前に防ぐことができる。

###2.コードの可読性を高める
privateとそうでない部分を明確に分離することでコードとしての可読性が上がる


このprivateメソッドの中に
tweet_paramsというメソッドが定義されており、処理の内容は以下のようになっています。

<img width="428" alt="ストロング2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/daa94f1e-bb0b-0018-44de-d7e784050c2f.png">

requireの引数にtweetモデルを取り、
permitの引数に:name :image :textを取っています。

この意味はフォームから送られてきたデータのうち、:name :image :textというpermit以下で指定したキーを持つパラメーターのみを受け取るように制限するということです。

###この指定したキーを持つパラメーターのみを受け取る仕組みのことをストロングパラメータといいます。

ストロングパラメータを指定しておくことによって仕様以外のパラメータが送信されてくることを防ぎ、意図しないデータの更新をされないようにすることができます。

例えば、他人のログインパスワードを更新するパラメータを送信すれば勝手に他人のパスワードを変更できてしまうため、
こういったことを防ぐためにストロングパラメータを使用する必要があります。


再度コードを見ていくと

<img width="701" alt="ストロングパラメーター.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/fddbdfbb-93de-8eaf-64b0-76b95409e90f.png">


createメソッドは引数にtweet_paramsを指定しているため、tweet_paramsメソッドを経由して新たなデータが作成、保存される。
そのためこの場合は新しいツイートは必ずpermitの引数に指定したストロングパラメータのみを持っているということになります。
【Nuxt.js】Nuxt文法編：mixin

# mixinとは

🎈 この記事はWP専用です
https://wp.me/pc9NHC-s6

再利用可能な部品たちを
まとめて書いて使いまわせるもの✨
変更したい時はmixinだけ変更すればOK🙆‍♀️
管理がとっても便利になります！

実際に例を見ていきましょう👀


# 簡単な使い方( js )

jsファイルを使いまわしてみます🌟

グローバルで使用することはないので
ローカルでご紹介🎀🧸


## ローカルで使用
<img width="505" alt="スクリーンショット 2020-07-13 14.30.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/6e4eaf0b-d4f0-4e09-331f-8ebc5523710d.png">

ただconsoleを出すだけのシンプルなもの


```bash:file
mixins/
--| mixin.js
pages/
--| index.vue
```

【mixin.js】
mixinsフォルダを作成し
その中にmixin.jsを作成

```mixin.js
export default {
 created () {
   this.hello()
 },
 methods: {
   hello () {
     console.log('hello from mixin!')
   }
 },
}
```

【index.vue】
mixinをimportするだけ

```index.vue
<template>
 <div class="page">
 </div>
</template>

<script>
import Mixin from '../mixin/mixin.js'

export default {
 mixins: [ Mixin ],
}
</script>
```

# コンフリクトが起きた場合はマージされる
🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-s6
php:7.3-fpm-alpineでWP Offload Media Liteを動作させる

php:7.3-fpm-alpine コンテナで、
WordPressのWP Offload Media Liteプラグインを動作させたところ、
pngだとS3にアップロードできるのに
jpgだとアップロードできなかった。

gdに必要なライブラリが足りないと、S3にアップロードできない様子。

jpegが正しくアップロードできたときのDockerfileの設定は以下のとおり。

```Dockerfile
FROM php:7.3-fpm-alpine

RUN apk update && \
    apk upgrade && \
    apk add --update --no-cache \
    autoconf \
    bash \
    build-base \
    freetype-dev \
    g++ \
    gcc \
    libjpeg \
    libjpeg-turbo \
    libjpeg-turbo-dev \
    libpng \
    libpng-dev \
    libxml2-dev \
    libxpm-dev \
    libxslt-dev \
    libwebp-dev \
    jpeg-dev \
    make \
    mysql-dev \
    nginx \
    openssh \
    openssl \
    supervisor \
    tzdata \
    yaml-dev \
    zlib-dev

RUN docker-php-ext-configure gd \
        --with-freetype-dir=/usr/lib/ \
        --with-png-dir=/usr/lib/ \
        --with-jpeg-dir=/usr/lib/ \
        --with-gd

RUN docker-php-ext-install pdo_mysql soap mysqli gd
```
GoogleDiveファイル移動

GoogleDriveのデータを@gmailアカウントから@G-Suiteアカウントに移動した際の備忘録です。


同じドメイン間(AAA@gmail.com→BBB@gmail.com)は共有機能を使えば一括で移動ができますが[1]、異なるドメイン間(AAA@gmail.com→BBB@nulpo-ga.com)へは一括で移動するツールやサービスがありません。(2020年06月現在)

注意点
・今回は@gmail.comのデータのリンクを保ったまま移動する必要がありました。
・ファイルのオーナーを変更する必要があります
　（共有機能を使ったり、ダウンロードしてしまうとリンクが切れてしまいます）


---
方法
1.Google同期とDriveFileStreemの活用
2.Pythonでコーディング




## 1.Google同期とDriveFileStreemの活用
https://www.google.com/intl/ja_ALL/drive/download/
にて公式アプリをダウンロード・インストールします。設定は順々に行えばできます。
移動元：Google同期と移動先：DriveFileStreemがエクスプローラーのナビゲーションウィンドウに表示されます。
まず、Google同期のフォルダから移動したいフォルダ/ファイルを一度ローカルに移動します。ローカルに移動したフォルダー/ファイルをDriveFileStreemに移動します。

Google同期からDriveFileStreemへはファイルの移動しかできませんが、ローカルを挟むことでフォルダの移動が可能になります。


## 2.Pythonでコーディング
こちらもGoogle同期とDriveFileStreemを使います。

```python

import shutil
FROM='G:/マイドライブ/対象元フォルダー'
TO='G:/共有ドライブ/自宅用/対象先フォルダー'
new_path = shutil.move(FROM, TO)
```
一度実行すれば放置でいいのですが、1の方法より時間がかかります。エラーが発生する場合もあるので自己責任でお願いします。


---
他にいい方法やご意見がありましたら、ご気軽にご連絡ください。
殴り書きで書いたのでいずれ分かりやすい記事に直します。

参考
[1] https://codeaid.jp/blog/gdrive-move/
【Rails】form_withに記述するlocal: trueについて

#なぜlocal: trueを記述するのか

railsでフォームを送信する際にform_with以下にlocal: trueを記述するが、
最初は意味も分からずにそういうのなんだろうと深く考えもせずに真似てコードを記述していました。

<img width="488" alt="form_with.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/34175d6f-1873-b835-e44c-3df173988665.png">


しかし意味も分からずに学習を進めるのは気持ち悪いため改めて調べて見たところ、
rails5においてはlocal: trueを記述しないとajax通信によるフォームの送信という意味になってしまうためHTMLとしてフォーム送信をする場合はlocal: trueの記述が必要とのことです。
【AmazonConnect】問い合わせフロー内でのLambda呼び出し

#概要
AmazonConnectでは問い合わせフロー内でLambda関数を呼び出すことができます。
また、Lambda関数を呼び出す際にはJSONリクエストをやり取りしており、これを利用することで条件分岐などが可能になります。

#紐づけ
問い合わせフローから直接ARNを指定して呼び出すことも可能ですが、前もってマネジメントコンソールからインスタンス情報にアクセスし、「問い合わせフロー」からLambda関数を登録できます。
こうすれば、Lambda関数を呼び出す際、プルダウンで登録した関数が一覧で出てくるので選びやすいです。
![QiitaBlog001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612635/1056b2cc-d731-2ca7-19b1-1eab165101b9.png)

以下、問い合わせフロー内におけるLambda関数の設定画面
![QiitaBlog004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612635/30ea55e0-597c-07c7-52f7-5aaf2afab4fd.png)


#問い合わせフロー内での操作
AmazonConnectからLambda関数を呼び出す際、以下のようなJSONリクエストがLambda関数に引き渡されます。
Lambda関数の戻り値は"Attributes"にJSON形式で格納され、AmazonConnectに渡されます。

```
{
    "Details": {
        "ContactData": {
            "Attributes": {"ここに":"Lambda関数の値"},
            "Channel": "VOICE",
            "ContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
            "CustomerEndpoint": {
                "Address": "+1234567890",
                "Type": "TELEPHONE_NUMBER"
            },
            "InitialContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
            "InitiationMethod": "INBOUND | OUTBOUND | TRANSFER | CALLBACK",
            "InstanceARN": "arn:aws:connect:aws-region:1234567890:instance/c8c0e68d-2200-4265-82c0-XXXXXXXXXX",
            "PreviousContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
            "Queue": "QueueName",
            "SystemEndpoint": {
                "Address": "+1234567890",
                "Type": "TELEPHONE_NUMBER"
            }
        },
        "Parameters": {
            "sentAttributeKey": "sentAttributeValue"
        }
    },
    "Name": "ContactFlowEvent"
}
```

##Lambda関数に値を渡すとき
Lambda関数に値を渡すときは以下の順でブロックを並べます。
![QiitaBlog002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612635/4fe4ae69-1ca1-10bc-93f3-232f8162a50c.png)
![QiitaBlog003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612635/3d325bb4-fc1e-8b41-4f72-09f8277518f1.png)

ここで設定した属性はLambda関数で
```
event["Details"]["ContactData"]["Attributes"]["key"]
```
で参照できます。

##Lambda関数から値を受け取るとき
Lambda関数の戻り値は問い合わせフロー内で「属性」として扱われます。また、タイプは「外部」として扱われます。
問い合わせフロー内で、属性を確認することで分岐ができます。
![QiitaBlog005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612635/08427ef9-915c-27c6-5333-d13dd1e5ef82.png)
![QiitaBlog006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612635/bdcf999d-a735-a4af-23ac-8e291139b54f.png)
チェックする条件は、「別の条件の追加」から追加可能であり、「等しい」以外でも不等号などを選択できます。