OmniAICreator/Qiita-1.07M huggingface dataset:
Angular7,ngx-translateで動的にi18nする

# はじめに
日々Qiitaの集合知に感謝。lovedと申します。
今回はAngular7で軽く詰まった点を共有致します。お役立て下さいませ。

# お題
Angularでi18n対応する場合にはAngular公式のi18n機能とは別に、
[ngx-translate](https://github.com/ngx-translate/core)が使用可能です。
今回はngx-translateを使用して、動的に多言語文言をアプリの中に組み込む方法を解説します。
理解していると「なるほど、まぁそうだよな」という話ですが、誰かの助けになれば幸いです。

# 対象読者
Angular7でのi18n対応に追われる諸兄姉の皆様
基本的な入れ方・使い方は下記投稿に親切な解説があります。
https://qiita.com/daikiojm/items/def764b12c8ff2ebbc92

# シンプルに使用する場合
```html
<span translate>多言語対応したい文言</span>
<input [type]="'text'" placeholder="{{'多言語対応文言' | translate }}"></span>
```
Angularでhtmlに{{}}パイプをする場合は、属性名に[]を付けないよう注意しましょう。
(良いエディタだと怒られるので心配ありませんが)

# 動的に使用する場合(本題)
例えば下記ポップアップをi18nしたいとします。

```typescript
window.confirm('こうかいしませんね？');
```

この場合は上記のシンプルな方法では実現できません。(できたらすみません!)
以下のようにhtml内に隠し要素を記載して取得できます。

```html
<span  [hidden]="true" id="confirm-i18n-text" translate>こうかいしませんね？</span>
```

```typescript
// 簡略に記載
window.confirm(document.getElementById('confirm-i18n-text').innerText);
```

~~ngIfの場合は[hidden]と違い、DOMに現れないので基本的には外から見えません。~~
こちら訂正しました。DOMから取得するのでngIFでは動作しない恐れがありますm(__)m

たくさんある場合はi18n文言部分のみ別コンポーネントとして切り出し、includeするとよいでしょう。
切り出し~includeは動作確認していないので、うまく動作しない場合は工夫してみて下さい。

以上です。
御観覧ありがとうございました。

余談ですが、、、
慣れてくると、AngularJSには戻れませんね。
これまでは「npmこわい」「CDNと$scopeがあれば食っていける」とか思っていたこともありましたが、
今では新規にフロントエンドを構築しようと思ったらAngularを選択したい、いやすると思います。
lambdaのVPCを設定するときに注意すること

# 1. VPCを設定するとinternetに出れなくなる

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc.html

> Lambda 関数に VPC 設定を追加した場合、関数でアクセスできるのは、その VPC 内のリソースのみになります。Lambda 関数から VPC リソースとパブリックインターネットの両方にアクセスする必要がある場合は、VPC 内に NAT (Network Address Translation) インスタンスが必要になります。

解決策: インターネットアクセスが必要な場合は、NATの設定が必要になるが、具体的には以下の二通りがある

1. VPC内にNAT instanceを設定
2. Amazon VPC NAT gatewayを使う

# 2. AWSリソース、サービスへのアクセスもできなくなる

S3, KMS, SNSなども、インターネット経由で行うので、同じようにNATの設定が必要になる。

または、VPCのEndpointという設定をすることで回避できる。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html

設定の仕方は、VPCページから、Endpointsを選択肢、使いたいサービスのEndpointをVPCを選択して作成するだけ
mordredの記述子計算でコア数を指定する

# 背景
Jupyter NotebookでmordredのCalculatorクラスのpandasメソッドにより記述子計算をしていたところ、高負荷となりブラウザが全く反応しなくなった。

# 環境
Windows 10 (6コア12スレッド)
Python 3.6
mordred 1.1.1

# 原因
mordredの並列計算の数のデフォルトが、multiprocessing.cpu_count() 
により決まる仕様であり、ほぼCPU使用率が100%となってしまったため（今回12であった)

# 対応
df_mordred = calc.pandas(mols)
とするのではなく、以下のようにnproc引数に並列計算したい数を指定すればよい。
df_mordred = calc.pandas(mols, nproc=2)


#ベンチ(2020/02/29追加)

本当に利いているようかベンチをとってみよう。環境はCPU i7-8700 3.70GHzでありCPUコア数は12である。データはRDKit付属のSolubilityのTrainデータ(1025件)である。

- nproc指定なしの場合 20秒
- nproc指定10の場合 20秒
- nproc指定5の場合 23秒
- nproc指定1の場合 1分28秒

ということでnprocは利いているようだ。この例だと並列計算により計算時間は3～4倍高速になっている。
Target Board for RX family上でmruby/cを動かしてみた

ルネサスエレクトロニクス社製の低価格評価ボードであるTarget Board for RX family上でmruby/cを動かしてみました。

Target Board for RX familyでmruby/cを動作させるために実施したことは以下の通り、

- mruby/cのソースコードをプロジェクトの「src」フォルダにコピー
- クロック設定、ソフトウェアディレイ、ベクタテーブル、レジスタプロテクトのソースコードを「hal」フォルダに作成
- 「main.c」を作成して、I/Oポートのトグル関数とスイッチの状態をリードする関数を作成
- mruby/cの公式サイトにあるチュートリアル通りにmain関数を作成
- mrubyコンパイラでチュートリアルのsample1.rbをコンパイルして生成された.cファイルをプロジェクトに登録
- リンカスクリプトでistack、ustackの値を調整

これでRX65N、RX231、RX130の各Target Boardでmruby/cのLED点滅プログラムを動かすことができました。
作成したサンプルプログラムは以下の場所に置いてあります。

https://github.com/nizuki926/mrubyc_targetboard_rx

以上です
[R]RSeleniumの環境構築（Windows）



ウェブスクレイピングをしてみたいと思い色々調べていると、Rにおいては、`rvest`と`RSelenium`パッケージを組み合わせてやれば良いらしい。`rvest`は通常のパッケージと同様に使用可能ですが、`RSelenium`は環境構築が必要だったので備忘録として残しておきます。

#RSelenium
WEB UIテストの自動化ツールであるSeleniumをRから実行できるパッケージ。
ローカルで立ち上げたSeleniumサーバを通して、ウェブページを操作することができます。


##環境構築
ローカルでSeleniumを立ち上げて、Google Chromeを利用してウェブページの操作を実施する場合。
Seleniumを利用する際は、操作したいブラウザに適したドライバを、OSに合わせて[こちらの配布サイト](https://sites.google.com/a/chromium.org/chromedriver/downloads/)よりダウンロードしてフォルダへ格納し、パスを通しておきます。

- [参考：Windowsの環境パスを通す(path)](http://realize.jounin.jp/path.html)

<img src="https://i.imgur.com/UAKztIO.png" width="100%">
該当のドライバをダウンロード後、[公式サイト](https://www.seleniumhq.org/download/)から最新のSeleniumのバイナリファイルをダウンロードします。先ほどダウンロードしたドライバと同じフォルダに保存しておきます。

<img src="https://i.imgur.com/dCDCTzL.png" width="100%">

こんな感じでフォルダに一緒に格納。

<img src="https://i.imgur.com/f0BFnBN.png" width="100%">

#Seleniumサーバの立ち上げ
コマンドプロンプトを開き、格納したディレクトリへ移動した上で以下のように入力すれば、seleniumサーバが立ち上がります。

```
java -jar selenium-server-standalone-3.141.59.jar
```
うまくいっていれば～Selenium Server is up and running on port 4444、といったINFOが表示されていると思います。

#Rでの使用
サーバを立ち上げた状態が整えば、Rからの各種ウェブ操作が可能になります。

```r:例
#立ち上げたいページのurl
url <- "https://www.google.co.jp/"

#ブラウザを立ち上げる
rem <- remoteDriver(port=4444L,browserName = "chrome")
rem$open()

#ブラウザで目的のページに移動する場合
rem$navigate(url)
```

その他RSeleniumの細かい各種操作については以下の記事に非常に分かりやすくまとまっています。

- [参考：[翻訳] RSelenium vignette: RSeleniumの基本](https://qiita.com/nakamichi/items/ad186633ae249b26d032#fn2)

#参考ページ・本
1. 「Rによるスクレイピング入門」C&R研究所
2. [[翻訳] RSelenium vignette: RSeleniumの基本](https://qiita.com/nakamichi/items/ad186633ae249b26d032#fn2)
3. [ChromeDriver - WebDriver for Chrome](https://sites.google.com/a/chromium.org/chromedriver/downloads/)
4. [Windowsの環境パスを通す(path)](http://realize.jounin.jp/path.html)
FileMaker//ポータルを使うとチャットもできる

私事ながら、「仕事でFileMaker開発」からは離れることになりました。端的にいうと転職することになりました。
今後は趣味全開でFileMakerを触っていきたいと思います
A3RTというサービスを使ってみようと思って、チャットAppを試作しました
---
まずはTalkAPIを使って、会話ができるように作ってみた画面が以下
![IMG_4016.png](https://qiita-image-store.s3.amazonaws.com/0/181254/ac500575-2ae9-e7f0-dc72-40e2fb2a6b21.png)

ポータルを使うことで1時間ほどで作成できました。(次第に作成時間が短くなってるなあ成長してるなあと自画自賛)

このA3RTというのは [ANALYTICS & ARTIFICIAL INTELLIGENCE API VIA RECRUIT TECHNOLOGIES](https://a3rt.recruit-tech.co.jp/) のことで、リクルートが開発・提供しているサービスになります
提供されているサービスの組み合わせでいろいろとこのチャットAppを拡張することもできそうです。FileMakerのカスタムAppのインターフェイスにこういうチャットサービスを導入しても面白いことができそうな気がします

構成は
・チャットウインドウのテーブル
・会話を格納するテーブル
をChatKeyフィールドでリレーションして実現しています
途中に
`スクリプト一時停止/続行 [ 間隔（秒）: 1 ] `
を入れているのは、このスクリプトだと返答が早く、返答が食い気味で返ってきてしまうため、ちょっと間を作っています
1.メッセージを送信
2.メッセージ内容を記録
3.TalkAPIを叩いて返答を得る
4.返答を記録
という会話の流れなので、２のメッセージの記録後に別のAPI,「Named Entity API」を叩きに行って固有表現を得て、キーワードに応じた対応を行う。なんてこともできそうな気がします。

```FileMaker:サンプルスクリプト
# ------------------------------
# A3RT TalkAPIにメッセージをリクエストする
# ------------------------------
ウインドウの固定
変数を設定 [ $$ChatKey ; 値: A3RT_TalkChat::ChatKey ] 
# APIキー
変数を設定 [ $API_Key ; 値: "***************************" ] 
# ------------------------------
# 送信するメッセージ
変数を設定 [ $query ; 値: A3RT_TalkChat::Message ] 
# ------------------------------
# メッセージレコードを保存する
レイアウト切り替え [ 「A3RT_TalkHistory」 (A3RT_TalkHistory) ; アニメーション: なし ]
新規レコード/検索条件
フィールド設定 [ A3RT_TalkHistory::Query ; $query ] 
フィールド設定 [ A3RT_TalkHistory::ChatKey ; $$ChatKey ] 
レイアウト切り替え [ 元のレイアウト ; アニメーション: なし ]
# ------------------------------
スクリプト一時停止/続行 [ 間隔（秒）: 1 ] 
# ------------------------------
# URI
変数を設定 [ $URL ; 値: "https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk" ] 
# ------------------------------
URL から挿入 [ SSL 証明書の検証 ; 選択 ; ダイアログあり: オフ ; $Response ; $URL ; cURL オプション: "-X POST -F \"apikey=" & $API_Key  & "\" -F \"query="  & $Query & "\"" ] 
# ------------------------------
ウインドウの固定
レイアウト切り替え [ 「A3RT_TalkHistory」 (A3RT_TalkHistory) ; アニメーション: なし ]
新規レコード/検索条件
フィールド設定 [ A3RT_TalkHistory::StatusCode ; JSONGetElement ( $Response ; "status" ) ] 
フィールド設定 [ A3RT_TalkHistory::Perplexity ; JSONGetElement ( $Response ; "results[].perplexity" ) ] 
フィールド設定 [ A3RT_TalkHistory::Reply ; JSONGetElement ( $Response ; "results[].reply" ) ] 
フィールド設定 [ A3RT_TalkHistory::ChatKey ; $$ChatKey ] 
レイアウト切り替え [ 元のレイアウト ; アニメーション: なし ]
# ------------------------------
フィールド設定 [ A3RT_TalkChat::Message ; "" ] 
```
Unityの各種Vector型を分解

この投稿ではC#の分解の例として、Unityゲームエンジンの各種Vector型の分解を紹介します。

C#の分解は、C# 7.0から利用可能です。

# 事前知識

* 公式ドキュメント[タプルとその他の型の分解](https://docs.microsoft.com/ja-jp/dotnet/csharp/deconstruct)
* ufcppさんの[複合型の分解](https://ufcpp.net/study/csharp/datatype/deconstruction/)

# ValueTupleの分解の例

C#における`ValueTuple`の分解の例を次に示します。

```csharp
public static void Main(string[] args)
{
    IEnumerable<int> source = LoadSource();

    // ValueTupleとしでなく、分解して受ける 
    var (minValue, maxValue) = FindMinAndMax(source);        
    // 中略
}

(int min, int max) FindMinAndMax(IEnumerable<int> source)
{
    int min, max;
    // 中略
    // ここでsource中の最小値・最大値を探す。空なら例外を投げる
    return (min, max);
}
```


さて、この分解ですが各種`ValueTuple`型でなくても、その型が`Deconstruct`という名前のインスタンスメソッドか拡張メソッドを持っていれば使うことができます。

標準ライブラリでは、各種`Tuple`クラス、`KeyValuePair<TKey, TValue>`クラスなどでも（環境によっては）利用可能です。これについては、こちらの「[DeconstructメソッドがKeyValuePair<TKey, Tvalue>などに追加されて、ValueTupleみたいに分解宣言できるようになる](https://qiita.com/RyotaMurohoshi/items/dda4b2d623ddc9e0f6ff)」を参照してください。

# Unityの各種Vector構造体を分解

Unityゲームエンジンの各種`Vector`構造体を分解できるようにします。

次のようなVector3構造体の拡張関数`Deconstruct`を用意します。

```csharp
using UnityEngine;

namespace VectorExtensions
{
    public static class Extensions
    {
        public static void Deconstruct(this Vector3 value, out float x, out float y, out float z)
        {
            x = value.x;
            y = value.y;
            z = value.z;
        }
    }

    // 略
}
```

これを次のように利用すると、`Vector3`を分解することができます。


```csharp
using UnityEngine;
using VectorExtensions;
    
public class Example : MonoBehaviour
{
    void Start()
    {
        var (x, y, z) = transform.position;
        Debug.LogFormat("{0}, {1}, {2}", x, y, z);
    }
}
```

最初がxで、次がy、最後がzであることに注意してください。


# 分解の乱用は非推奨

なんでもかんでも分解できるように拡張関数を生やすことはオススメしません。分解の乱用は推奨しません。

「どの順序でどの要素が分解されるか、利用者がコード・リファレンスを読まなくても、（ほぼ）正しく伝わる型」

のみで、分解を提供すべきだと思っています。

Vector3型などはコンストラクタに

```csharp
float x = 0.0F;
float y = 1.0F;
float z = 2.0F;

var position = new Vector3(x, y, z)
```

があり、大抵のUnity開発者ならば、「分解されるならば、x、y、zの順番で分解されるだろう」、という共通認識を持てると思います。

# コード例

以下、各種`Vector`構造体の`Deconstruct`拡張関数群を示します。

```csharp
using UnityEngine;

namespace VectorExtensions
{
    public static class Extensions
    {
        public static void Deconstruct(this Vector2 value, out float x, out float y)
        {
            x = value.x;
            y = value.y;
        }

        public static void Deconstruct(this Vector3 value, out float x, out float y, out float z)
        {
            x = value.x;
            y = value.y;
            z = value.z;
        }

        public static void Deconstruct(this Vector4 value, out float x, out float y, out float z, out float w)
        {
            x = value.x;
            y = value.y;
            z = value.z;
            w = value.w;
        }

        public static void Deconstruct(this Vector2Int value, out int x, out int y)
        {
            x = value.x;
            y = value.y;
        }

        public static void Deconstruct(this Vector3Int value, out int x, out int y, out int z)
        {
            x = value.x;
            y = value.y;
            z = value.z;
        }
    }
}
```

# 注意

お使いのUnity・環境がC# 7.0に対応している環境・設定かを確認してください。
フィルターをかけてシートごとに転記するマクロ　その2

今回は
『シートと一致する項目をフィルターで抽出し可視セルでコピペする』
マクロを、マクロシートの3行目のセルを参照して、シートを生成するように改修しました。
下図のような感じです。
マクロ使用前<img src=https://qiita-image-store.s3.amazonaws.com/0/265756/9077e51b-ef2e-4c72-e9bc-78de6f5a89d9.png width=80%>
マクロ使用後<img src=https://qiita-image-store.s3.amazonaws.com/0/265756/79c98002-a55e-3d0e-7641-187abe357389.png width=80%>

```VB
Sub buntatu02()
    
'   1つ目・2つ目のシートを指定
    Dim makuroWs As Worksheet
    Set makuroWs = Worksheets(1)
    Dim bunkatumaeWs As Worksheet
    Set bunkatumaeWs = Worksheets(2)
    
'   3行目の一番右のセルを指定
    Dim maxSheetCount As Long
    maxSheetCount = makuroWs.Cells(3, Columns.Count).End(xlToLeft).Column
   
'   セルを参照して3つ目以降のシートを作る
    Dim j As Long
    For j = 1 To maxSheetCount - 1
    
        Worksheets.Add After:=Sheets(1 + j)
        Dim newWs As Worksheet
        Set newWs = Worksheets(2 + j)
        Dim group As String
        group = makuroWs.Cells(3, 1 + j)
        newWs.Name = group
        
    Next j

'   シート名を参照してフィルターで抽出し可視セルでコピペ
    Dim i As Long
    For i = 3 To Worksheets.Count

        Dim wsName As String
        wsName = Worksheets(i).Name

        With bunkatumaeWs.Range("A1")
            .AutoFilter Field:=5, Criteria1:=wsName
            .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets(i).Range("A1")
            .AutoFilter
        End With

    Next i
    
'   1つ目のシートのセルA1をアクティブにしてブックを閉じないで保存する
    makuroWs.Activate
    Range("A1").Activate
    ThisWorkbook.Save

End Sub
```
マクロでシートを手作業で作る必要がなくなると、だいぶ汎用性が高くなる気がします！
下記のコードでセルを参照して新しいシートを作れるので、他の場面でも結構生かせそうです。

```VB
' シートを追加していく（jは整数）
Worksheets.Add After:=Sheets(1 + j)
' 作ったシートに名前を付ける 
group = makuroWs.Cells(3, 1 + j)
newWs.Name = group
```        
次回は
抽出する列の項目を自動で検出してシートの作成～可視セルでコピペできるよう改修したいと思います。
【Blender】Unityに取り込む際のキャラクターの向きfbxエクスポート

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Blender v2.79.6

1.平行投影「７」キー　の向きにする
<img width="533" alt="スクリーンショット 2019-03-12 23.00.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/4547f033-ccd4-dc56-f5f5-ad5b49598732.png">

2.fbxエクスポートの時に、Yが前方にする
<img width="433" alt="スクリーンショット 2019-03-12 23.01.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/3acd245e-86cf-deeb-8bd4-b5c6efc64c80.png">


3.Unityに取り込む
<img width="1139" alt="スクリーンショット 2019-03-12 23.40.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/bd6d4523-edd8-4853-e685-6a3233d58917.png">
横幅を縮小したテキストを表示する方法

横幅を縮小したテキストを表示する方法を解説します。
## 横幅を縮小したテキストを表示する方法
以下のようなCSSを適用します。

```html
<style>
div {
  transform: (0.8, 1);
}
</style>
```

これでOKです。
注意: `<span>`などのインライン要素にはこの方法は適用できないので注意してください。`<div>`などのブロック要素を使いましょう。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【Java】char型はint型にキャストできる


# はじめに

Java SE8 Silverの問題集を読んでいたら、「char型は暗黙的にint型やdouble型にキャストできる」と書かれていました。
恥ずかしながら、業務で何年もJavaを使っていましたが、この事実を全く知りませんでした。

そこで、「なぜchar型がint型やdouble型にキャストできるのか？」という理由を調べようと思ったのですが、問題集の中にはその理由が書かれていなかったので、私なりに調べた結果をまとめてみました。
※誤っている記述等がありましたら、ご指摘頂けると幸いです。

# 調査に使ったコード

```java:TypeCast.java
public class TypeCast {
	public static void main(String[] args) {
		char ch = '1';

		// 暗黙的にint型、double型にキャストする。
		int i = ch;
		double d = ch;
		System.out.println(ch + "をint型にキャストした結果: " + i);
		System.out.println(ch + "をdouble型にキャストした結果: " + d);

		// 引数がdouble型のメソッドに対して、char型を引数として渡す。
		foo(ch);
	}

	static void foo(double d) {
		System.out.println("double型: " + d);
	}
}
```

# 出力結果

* 何のエラーもなく、コンパイルして実行できました。
* ですが、char型の「1」をint型にキャストすると、なぜか「49」になってしまいます。

```
1をint型にキャストした結果: 49
1をdouble型にキャストした結果: 49.0
double型: 49.0
```

# char型の「1」をint型にキャストすると「49」になる理由

char型のラッパークラスである[Character型のAPI](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Character.html)を見ると、「Unicode文字表現」と書かれています。
そこで「1」を[Unicodeの表](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF)で見ると、「U+0031」という値で表されていることが分かります。

Unicodeの表の値は16進法であり、実際には「0x31」となっているため、これを10進法に改めると「49」となります。
つまり、char型の「1」が暗黙的にint型にキャストされた場合、この「49」がint型の変数に格納されていることになります。

# まとめ

* char型は「文字のデータ型」という認識だったので、int型やdouble型にキャストできることに驚きましたが、理由を調べて何となく腑に落ちました。
* 資格試験の勉強をすると、「普段は業務で使わない部分」まで学習する必要があるので、試験の合否に関わらず自身の知識レベルを知る良い機会になります。
LaravelのSession管理について理解しておきたいところ

# 環境

* Laravel5.8で確認しました。バージョンによっては仕様は変わる可能性があるので必ず正しいとは言えません。

# 先に理解をしたほうが良いこと

### Laravelは独自のSession管理を行っている

### SessionのIDは個々人のCookieに保存されている(session.cookieの値=>Laravel上で用意した40文字のランダム文字列)

ここを勘違いしていると悩ましいことになる。
Laravelは独自のSessionの仕組みを持っているがIDはCookie上で管理している。

### 認証のGuardすべてがセッションに関連があるわけではない

認証のGuardにSessionだったりTokenがあるから認証のときに関わりがあるのではと感じてしまうが、SessionGuardのみManagerから情報を貰っている。
Tokenの場合は基本的にAPIであり、セッションを開始するMiddlewareは実行されない。

# Session(中身)の読み出され方

## 接続の部分

SessionはSessionManagerによって管理がされている。SessionDriverは`config.session.driver`にセットしているもの。

```
SessionManager
↓
SessionDriver(SessionHandler)
```

あくまでもSessionManagerはSessionDriverを作成して接続を保証しているだけ。ここでStoreも作成しているけど、Readはまだしてない。(Storeがコンストラクタでidをセットしている処理があるので勘違いしやすいが、これは初回のセッション用である)

## 読み出しに関して

実際にSessionをReadしているのは`Illuminate\Session\Middleware\StartSession`。
`getSession`メソッドで、SessionManagerからSessionDriverを取得しCookieに保存されている値をセットしてstartしている。(Storeに既存ユーザーのIdをセットしているのはここ)

```php
public function getSession(Request $request)
{
	return tap($this->manager->driver(), function ($session) use ($request) {
		$session->setId($request->cookies->get($session->getName()));
	});
}
```

```php
protected function startSession(Request $request)
{
	return tap($this->getSession($request), function ($session) use ($request) {
		$session->setRequestOnHandler($request);

		$session->start();
	});
}
```

# セッションの書き込みについて

これに関してもStartSessionミドルウェアにかかれている。
LaravelのSessionは**レスポンスを返すまで保存されない**とよく言われてるのはこれ。
特に言うこともない。。。

```php

public function handle($request, Closure $next)
{
	if (! $this->sessionConfigured()) {
		return next($request);
	}

	// If a session driver has been configured, we will need to start the session here
	// so that the data is ready for an application. Note that the Laravel sessions
	// do not make use of PHP "native" sessions in any way since they are crappy.
	$request->setLaravelSession(
		$session = $this->startSession($request)
	);

	$this->collectGarbage($session);

	$this->storeCurrentUrl($request, $session);

	$this->addCookieToResponse(
		$response = $next($request), $session // ここで$nextを実行してレスポンスを貰っている
	);

	// Again, if the session has been configured we will need to close out the session
	// so that the attributes may be persisted to some storage medium. We will also
	// add the session identifier cookie to the application response headers now.
	$this->manager->driver()->save(); // セッションが保存されるのはそのレスポンスを貰った後

	return $response;
}
```

# さいごに

これを調べることになったのはGuardの存在でした。
Guardのセッション管理方法を変更する必要があり、そこで行き詰まったのでとりあえず親の方を見ていこうと。
正直よい知識を得れたと思います。SessionHandlerやSessionManagerがどうしているか理解できたことが今回の一番の収穫です。
VS Codeの設定をキレイに変数置換【VS Code使い方①】

# 変数置換構文

launch.json や tasks.json では ${variableName} という構文で変数置換を行うことができます。どの言語でコーディングするときでも使えるので一読しておくと後で役に立ちそう。

# 役に立ちそうな状況や対象

- OSが混在するチーム開発
- 不特定多数が利用するプロジェクトテンプレート
- ReactNativeやUnity、Flutterなどのクロスプラットフォーム開発

# 定義済み変数置換

|変数|中身|
|:--|:--
| ${workspaceFolder} | VS Codeで開かれたフォルダのパス
| ${workspaceFolderBasename} |VS Codeで開いたフォルダの名前、スラッシュ（/）なし
| ${file} | 現在開かれているファイル
| ${relativeFile} |  workspaceFolderを基準にした現在開いているファイル
| ${relativeFileDirname} |  workspaceFolderを基準にした現在開いているファイル
| ${fileBasename} | 現在開かれているファイルのベース名
| ${fileBasenameNoExtension} | ファイルを拡張子なしで現在開かれているファイルのベース名
| ${fileDirname} | 現在開かれているファイルのディレクトリ名
| ${fileExtname} | 現在開いているファイルの拡張子
| ${cwd} | タスクランナー起動時のカレント作業ディレクトリ
| ${lineNumber} | VSCodeの編集画面で現在選択されている行番号
| ${selectedText} | VSCodeの編集画面で現在選択されているテキスト
| ${execPath} | 実行中のVS Code実行可能ファイル「code.exe」のアドレス
| ${defaultBuildTask} | デフォルトのビルドタスクの名前

# 定義済み変数置換の実例

ルートワークスペースとして、「/home/your-username/your-project」を開き、「/home/your-username/your-project/folder/file.ext」を編集していると仮定します。
すると変数は以下のようになるでしょう。

|変数|中身|
|:--|:--
|${workspaceFolder} | /home/your-username/your-project
|${workspaceFolderBasename} | your-project
|${file} | /home/your-username/your-project/folder/file.ext
|${relativeFile} | folder/file.ext
|${relativeFileDirname} | folder
|${fileBasename} | file.ext
|${fileBasenameNoExtension} | file
|${fileDirname} | /home/your-username/your-project/folder
|${fileExtname} | .ext
|${lineNumber} | VSCodeの編集画面で現在選択されている行番号
|${selectedText} | VSCodeの編集画面で現在選択されているテキスト
|${execPath} | 実行中のVS Code実行可能ファイル「code.exe」のアドレス

# 変数の中身の確認方法

例えば`${fileDirname}`の中身を見たい場合、
`${workspaceFolder}/.vscode/tasks.json`の中身を下記の状態にして、
タスク「`check variable`」の実行を行ってください。
ショートカットキーは、

- Winの場合
  - `Ctrl`+`Shift`+`P`→`Tasks: Run Task`
- Macの場合
  - `Command`+`Shift`+`P`→`Tasks: Run Task`

```json-doc:./.vscode/tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "check variable",
      "type": "shell",
      "command": "echo",
      "args" : ["${fileDirname}"]
    }
  ]
}
```

# 引用元

https://code.visualstudio.com/docs/editor/variables-reference

# 関連

https://qiita.com/ShortArrow/items/0bacd3a4bcbcbac50e60

**Excelsior!**
Mongoose OSとESP32 Dev-Kit Cを使ったときのエラー


# エラー
`mos flash`をかけると、ESP32 Dev kitに書き込めない。

```bash
Error: /go/src/cesanta.com/mos/flash/esp/rom_client/rom_client.go:156: failed to connect to ESP32 ROM
```
# 解決法
`Connecting to ESP32 ROM, attempt 1 of 10...`
というのが出てきたら、Bootボタンを押す。
なにかメッセージが現れたら離す。

# まとめ
Arduino関連でも同様の問題が起きているようです。
Quiverのnoteはどのように管理されているか

# Quiverのいいところ
Quiverは特にコードの管理に強いノートアプリです．

* JupyterNotebook的なCellという概念がある→文章がより構造化されてあとで見やすい．位置の入れ替えも容易
* Markdown以外にもLaTeXや画像，PDF，... 様々な形式に対応している
* Import, Exportも簡単にできる（PDF出力など）
* コードハイライトが強い（かなり多くの言語に対応）
* notebookの概念がある
* タグ機能もある
* もちろんMarkdownが使える
* 使用するカラースキームを変えたり，CSSを直接編集することで見た目を自分好みにいじれる
* デフォルトでも十分UIかっこいい
* vim, emacsキーバインドまである
* プレゼンテーションモードもある
* ノートの共有も容易

ぱっと思いつくだけでもまだまだたくさんありますが，中でも
**ノートの実態がプレーンなJSONファイルである**というのがQuiverの魅力的なところだと思います．
このおかげで，以下で述べるように

ちなみに競合アプリと比べてあえて欠けているところをあげるとすれば

* mac版しかない
* Evernoteみたいな音声録音機能は無い
* 手書き機能は無い

ぐらいでしょうか．

# 1. ノートの実態がプレーンなJSONファイル = データの同期がめちゃくちゃシンプル

Quiverでは，環境設定から`Quiver.qvlibrary/`というファイルを自分の好きなクラウドに（僕はGoogle Driveにいれてます）置いておくだけでデータのバックアップと同期が出来ます．


ディレクトリ構造も非常にシンプルで，わかりやすい階層構造になっています．

```
Quiver.qvlibrary/
　　├ xxx.qvnotebook/
　　├ yyy.qvnotebook/
　　├ Tutorial.qvnotebook/
　　│　 └ aaaa.note/
　　│　　　　├ content.json
　　│　　　　├ meta.json
　　│　　　　└ resources/
　　│　　　　　　├ 0123.png
　　│　　　　　　└ 3456.png
　　└ meta.json　
```

例えば，Tutorialというノートブックの中の 5- Preview and Presentationというノートは以下のようにjsonファイルに定義されています．


```json:Tutorial.qvnotebook/aaaa.note/meta.json

{
  "created_at" : (略),
  "tags" : [
    "tutorial"
  ],
  "title" : "5 - Preview and Presentation",
  "updated_at" : (略),
  "uuid" : "(略)"
}%
```



# 2. ノートの実態がプレーンなJSONファイル = 画像やノートの管理もシンプルで安心(?)
HackMDなどは，挿入した画像が自動的にimgurにアップロードされてしまうので，大事な画像などは挿入することができません．Quiverの場合，すでにご覧の通り画像ファイルは自分のクラウドの中の1ファイルとして扱われるので，クラウドの管理をしっかりしておけば気にせず画像やpdfを挿入出来ます．

これについてはあまりわかっていませんが，
もし大事なデータが有るなら，Quiver.qvlibrary/をEncryptoなどのセキュリティをかけるソフトで暗号化しておけばより良いかもしれません．（詳しい方いたらコメントいただけると幸いです．）



# 3. ノートの実態がプレーンなJSONファイル = バージョン管理ができる

>
コードやドキュメントを管理するために、バージョン管理システムを使用している場合、Quiverのノートもバージョン管理下に置きたいと思います。QuiverのノートはプレーンなJSONファイルですので、通常のテキストファイルとしてリポジトリにコミットすることができます。
>
全体をバージョン管理下へ置くこともできますし、いくつかのノートブックだけを管理することもできます。 バージョン管理システムを使用する副次的な利点として、2人のユーザが同時に同じノートを編集した場合に、マージの競合が自動的に解決される点があげられます。

これはなかなか他のアプリでは難しいのではないでしょうか．この機能のおかげで，単純なメモ帳としてだけではなく他にも様々な使い方ができそうです．




# さいごに
ということでQuiver最高．

## References
[Quiverをはじめよう · HappenApps/Quiver Wiki](https://github.com/HappenApps/Quiver/wiki/Quiver%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86)
Handsontable 7.0.0を使う人へ

## Handsontableのエディション統合
Handsontable7.0.0は6.2.2と大きく変わりました。
まずHandsontable ProはHandsontable Community Editionと統合されてHandsontableは1つだけになりました。 

これに伴い、**非営利目的以外はライセンスキーを購入しなくてはなりません。**
7.0.0に変えるとすぐわかりますがlicenseKeyに何も入れてないと

```
The license key for Handsontable is missing. Use your purchased key to activate the product. Alternatively, you can activate Handsontable to use for non-commercial purposes by passing the key: 'non-commercial-and-evaluation'. Read more about it in the documentation or contact us at support@handsontable.com.
```

という文が出ます。地味にこの文は日本語化されてません。

この文を非表示にするにはHandsontableのlicenseKeyオプションを購入したライセンスキーにするか'non-commercial-and-evaluation'にする必要があります。

```javascript:例
    hot=new Handsontable(container, { 
    data: data,  
    contextMenu: true,
    language: 'ja-JP', 
    licenseKey:'non-commercial-and-evaluation'
    });
```


## ライセンスの変更
こうなってしまったのはライセンス回りの変更があります。**MITライセンスではなくなり、**非商用および評価版のみ無償のライセンスになりました。ただ、引継ぎソースは公開されています。

資金が厳しいところがあるようでgithubによるとhttps://github.com/handsontable/handsontable/issues/5831


> However, it never developed all the traits of an authentic open source project. In an ideal world, it would gather a community of people collaborating and sharing ideas over a common goal. In such a situation you would expect the open source project to sustain itself with the help of the community. However, this wasn’t the case with Handsontable CE. Essentially, it was kept running thanks to the money earned from Handsontable Pro. Unfortunately, our observation is that the ratio of commercial to free users is about 1 to 25. Hence, the only way for us to keep investing in the product is to convert more free users into paying.
> We want to grow as a company whose only mission is to continuously improve Handsontable. We have an ambitious roadmap and a passionate team. What we need is a more balanced business model that would support our long-term goals.

> しかし、それは本物のオープンソースプロジェクトのすべての特性を開発したことはありません。 理想的な世界では、共通の目標の上でアイデアをコラボレーションし共有する人々のコミュニティが集まります。 そのような状況では、コミュニティの助けを借りて、オープンソースプロジェクトがそれ自身を支えることを期待するでしょう。 しかし、Handsontable CEの場合はそうではありませんでした。 基本的に、それはHandsontable Proから得たお金のおかげで走り続けました。 残念ながら、コマーシャルとフリーユーザーの比率は1から25です。したがって、フリーユーザーへの投資を継続する唯一の方法は、より多くのフリーユーザーを有料に変換することです。 
> Handsontableを継続的に向上させることが唯一の使命である企業として成長したいです。 私たちは野心的なロードマップと情熱的なチームを持っています。 私たちが必要としているのは、私たちの長期目標をサポートする、よりバランスのとれたビジネスモデルです。 

MITライセンスのグリッドライブラリがまた少なくなってしまうのは悲しいことです。


## まとめ
Handsontable6.2.2以前のバージョンなら以前と同じライセンスが適用されるようので、商用利用の方でお金に余裕がないかたはアップデートをしない検討を…
【世界最大の中高生ロボコン】FRCのプログラムについて~Lift関係~

この記事は[こちら](https://qiita.com/amidaandhero02/items/59c69d8facd2335f96ce)の記事の一部です。まずはこちらをご覧ください。


この部分は自分は書いてないので、この部分を書いた人に書いてもらう(~~書かせる~~)予定です。
今はできてないので次へどうぞ


前の記事⇒[Drive関係](https://qiita.com/amidaandhero02/items/271215e677c54f7fb045)
次の記事⇒[Grabber関係](https://qiita.com/amidaandhero02/items/4c4e628f90eec0ddc3a5)
ワイのテスト苦労開発〜転職したら最年長ザコーダーになった件〜

**※今回はほぼ実話です。**

# 再就職して1週間経った35歳ワイ
ワイ「あー、お腹へったわ」
ワイ「先週から**1食置き換えダイエット**をしとるから、すぐお腹が空くねん」
ワイ「なにしろ**炭水化物**を**筋トレ**に置き換えとるから」
ワイ「**脳みそ**が───」

> 脳「**せめて食べ物に置き換えてや！？**」

ワイ「───って叫んでんねん」
ワイ「まあそんなん言うててもしゃあない、お仕事ガンバルで」

# お仕事開始

リーダー「今日はこのサイトの修正をしてもらうで」

ワイ「はい〜」
ワイ「まずはGitHubのリポジトリからクローンして、と」
ワイ「ローカル開発環境はどないして起動すんのかいな？」
ワイ「npmとかいうやつか？」
ワイ「よっしゃ、よう分からんから隣の席の**カリポリ君**に聞いてみよか」

ワイ「なあ、カリポリ君」
ワイ「ローカルサーバーを起動するにはターミナルで`npm start`とかいうコマンド打てばええのんかな？」

カリポリ君（23歳）「**違うやーん、デブ**」

ワイ「**！？**」
ワイ「（おっと・・・？）」
ワイ「（今**デブ**言うた・・・？）」
ワイ「（確かにワイはちょっと**ポッチャリ体型**やけど）」
ワイ「（**炭水化物を筋トレに置き換えダイエット**のおかげで多少スリムになったはずなんやけど・・・）」
ワイ「（聞き間違えか・・・？）」
ワイ「（あっ、カリポリ君ヘッドホン着けてもうた・・・）」

ワイ「しゃあない、Slackで他の人達に聞いてみよか」

> ワイ「ローカルサーバーを起動するにはターミナルで`npm start`とか打てばええのですか？」

ワイ「送信、と」
ワイ「おっ、早速お返事が来たで」

> カリポリ君「**違う、`yarn dev`だってば**」

ワイ「`yarn dev`・・・」
ワイ「おお、**体型について中傷**されてたんやなくてコマンドのことやったんか」

> カリポリ君「その前に`yarn install`ね」

ワイ「なるほどな」
ワイ「なんや、カリポリ君やさしい子やないか」

ワイ「よっしゃ、`yarn install`と」
ワイ「お、なんや、色々と必要なパッケージがダウンロードされとるみたいや」
ワイ「ほんで`yarn dev`やな」

ワイ「おお、ローカルサーバーが立ち上がったで」
ワイ「ワイのようなザコーダーが途中から参加してもサクッと開発環境が構築できるようになってんねんな」
ワイ「ありがたいこっちゃ」

# サイトの修正開始
ワイ「ほな、言われた修正をしていこか」
ワイ「ここのVueコンポーネントに、動的にクラス名が付いたり外れたりすればええんやから、」
ワイ「チョイチョイチョイ、と」
ワイ「こんな感じやな」
ワイ「よっしゃ、SourceTreeでGitにコミットや」

> SourceTree「エラーやで」

ワイ「**！？**」

> SourceTree「クラス名がBEMの命名規則に反してるで」

ワイ「Oh...」
ワイ「ちゃんと命名規則を守らんとコミットもできひんのかいな」
ワイ「ワイのような**ザコーダー**が**ウンコミット**をせんように、」
ワイ「ちゃんとシステムがチェックしてくれるんやな」

リーダー「せや」
リーダー「**Gitフック**で、コミット前に各種テストが走るようにしてあんねん」

ワイ「（フック・・・何やそれ）」
ワイ「（よう分からんときはこのセリフや）」
ワイ「**アーキテクチャが素晴らしいですね**」

リーダー「・・・」
リーダー「要は、変なコードを書くと**コミットすらできへん**いうことや」

# 修正は続く
ワイ「つぎはここのJSの関数をいじれば良さそうやな」
ワイ「チョイチョイチョイ！と」
ワイ「コミットや！」

> SourceTree「Jestのエラーやで」

ワイ「Oh...またかいな」

リーダー（年下）「クックックッ・・・」
リーダー「JSのプログラムも自動テストが用意されとるからな」
リーダー「想定通りの挙動をせん場合はコミットできひんねや」

ワイ「ちょっと面倒くさいでんな・・・」

リーダー「いやいや、ちゃうで」
リーダー「コミット前に必ずテストが走ることで、防げる事故が沢山あんねん」
リーダー「例えば」
リーダー「新しい機能を追加したことによって**逆に以前からある機能がバグってしまったり**」
リーダー「そういう事故を最小限に抑えられんねん」
リーダー「**デグレ[^1]**が起こらん事を**自動テストが保証してくれる**おかげで」
リーダー「思いっきり**追加機能のプログラミングに集中できる**言うことや」

ワイ「言われてみればそうでんな・・・」
ワイ「やっぱモダンな開発ってええもんなんですな〜・・・」

# なんとかコミット完了
ワイ「カリポリ君、さっきはありがとうな」

カリポリ君「**やめ太郎の服、パジャマみたいだね**」
カリポリ君「（ヘッドホンを装着）」

ワイ「**！？**」
ワイ「（**文脈を無視しての服装ディスり！？**）」
ワイ「いやいやいや、カリポリ君はそんな子ちゃう」
ワイ「きっと今のも**聞き間違い**や」
ワイ「また何かの**コマンド**とかの話なんや」
ワイ「**Bulma（ブルマ）**いうCSSフレームワークがあるくらいやから」
ワイ「**Pajama（パジャマ）**いうライブラリがあったって不思議やない」
ワイ「**そのフック、Pajamaみたいだね**とか言うてたんやろ多分」

ワイ「Slackでもう一回聞いてみよか」

> ワイ「さっき**フックが何とか**って言うてたけど何のことでっか？」

ワイ「お、お返事が来たで」

> カリポリ君「**やめ太郎の服、パジャマみたい**」

ワイ「**ほんまに言うてたんかい！**」

**〜おしまい〜**

# まとめ
+ 技術力のあるチームに入ると学びがハンパない
+ 自動テストで、**ザコーダー**による**ウンコミット**が防止されてたりする
+ エンジニアの中には変な人もいるが、必ずしも悪い人ではないらしい


[^1]: 以前修正した不具合やバグが再発・復活すること。
SchemaSpy6.1.0でPostgreSQLからER図を出力する

コマンド一発でSchemaSpyを使ってER図を出力する方法が記載されていますので、こちらの方が便利だと思います！
https://qiita.com/ap8322/items/b93dfb2ff29b026ffa72

(2020/5/25 更新)

# はじめに
SchemaSpyでER図を出力することがあったので、出力方法を残しておきます。
またSchemaspy6.1.0(2019年3月12日時点で最新)からGraphvizのインストールが不要になり、`-vizjs` オプションを付けるだけでER図の出力が可能になりました。

# 前提環境
- macOS Mojave 10.14.3
- Java 1.8.0_121
- PostgreSQL 11.2

# SchemaSpy6.1.0をダウンロード
Githubの「Latest Build」から6.1.0をダウンロード
https://github.com/schemaspy/schemaspy
最新のschemaspyはここからしかダウンロードできません。安定版は6.0.0なのでしょうか？

# PostgreSQLのJDBCドライバーをダウンロード
SchemaSpyからPostgreSQLに接続するにはPostgreSQL用のドライバが必要です。
2019年3月12日時点では `postgresql-42.2.5.jar` が最新でした。
ドライバのダウンロードが可能なURL↓
https://jdbc.postgresql.org/

# 作業用ディレクトリの準備
以下のようにファイルを配置し、結果出力先のディレクトリを生成しておきましょう。

```
[任意のディレクトリ名]
├── postgresql-42.2.5.jar
├── result (schemaspyの結果出力先ディレクトリ)
└── schemaspy-6.1.0-SNAPSHOT.jar
```

# schemaspy.propertiesの生成と編集
schemaspy実行時のデフォルトで読み込まれる設定ファイルを書きます。（`schemaspy.properties` をデフォルトで読み込む仕様になっています。）

```
vi schemaspy.properties
```

```schemaspy.properties
# type of database. Run with -dbhelp for details
schemaspy.t=pgsql
# optional path to alternative jdbc drivers.
schemaspy.dp=./postgresql-42.2.5.jar
# database properties: host, port number, name user, password
schemaspy.host=任意のhost(ex: localhost)
schemaspy.port=任意のport(ex: 5432)
schemaspy.db=任意のdatabase名
schemaspy.u=任意のuser名
# output dir to save generated files
schemaspy.o=./result/
# db scheme for which generate diagrams
schemaspy.s=public
```

# schemaspyの実行
```bash
java -jar schemaspy-6.1.0-SNAPSHOT.jar -vizjs
```

**-vizjs** をつけるのがポイントです。

あとは `result/index.html` を開いたら結果が確認できます。簡単！

# おわりに

いかがでしたでしょうか？
簡単にERが出力できるので、phpMyAdminなどツールが入れられない場合に重宝しますね！

Happy Coding!
Nginx on Bitnami on Windows

# なぜBitnami?

* [Nginx](https://nginx.org/)を試したいけど設定面倒
* Bitnamiはクロスプラットホームっぽい
* Nginx公式ドキュメントがもっさりなので読まない
* モジュール化されてて使いやすい
* 「Bitnami ?? Stack Manager Tool」が使いやすい
* mySQLも同梱インストール
* PHPも同梱インストール

→[Bitnami](https://bitnami.com/)使えばラクなんじゃないかな？

# きっかけ

ところが、Dockerコンテナ用とかLinux用しかない！
そして時が経ち、[Nginx](https://www.nginx.com/)の[windows用インストーラー](https://bitnami.com/stack/nginx/installer)が
[Bitnamiアプリケーションカタログ](https://bitnami.com/stacks)にて公開されたので、試したくなった。

# 環境

* Windows 10 Home 64bit

# 方法

Bitnamiドキュメント→[カスタムPHPアプリケーションを作成する](https://docs.bitnami.com/installer/infrastructure/nginx/administration/create-custom-application-php/)

## つまづいたところ

`fastcgi_pass` がデフォルトで `fastcgi_pass unix:C:/Bitnami/NGINXS~1.2-3/php/var/run/www.sock;`だけど、
これだとサーバーがエラーでStoppingになって立ち上がらない。そこで `%installdir%\apps\phpmyadmin\conf\nginx-app.conf`を見てみると、`fastcgi_pass 127.0.0.1:9000;`だったので、書き換えた。

<details><summary>Before(編集前の設定)</summary>
<div>

```:%installdir%\apps\myapp\conf\nginx-app.conf
index index.php index.html index.htm;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_read_timeout 300;
    fastcgi_pass unix:C:/Bitnami/NGINXS~1.2-3/php/var/run/www.sock;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME $request_filename;
    include fastcgi_params;
}
```

</div>
</details>
<details><summary>After(編集後の設定)</summary>
<div>

```:%installdir%\apps\myapp\conf\nginx-app.conf
index index.php index.html index.htm;


location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_read_timeout 300;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME $request_filename;
    include fastcgi_params;
}
```

</div>
</details>

### nginx Stopping

設定ファイルの書き換えミスで一度Stoppingになったら、設定ファイルを書き変えてもBitnami Nginx Stack Manager Toolでは再起動をかけれなかったので、Windowsごと再起動をかけた。

**Excelsior!**
MacでDockerにMysql作成から接続まで

#１．インストール
(1).イメージのプル 
```docker pull mysql```
(2).イメージのプルの結果確認
```docker images```
(3).コンテナ作成・起動
```docker run --name ly-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql```
#2．MySQLWorkbench接続
(1).コンテナの接続
```docker exec -it ly-mysql bash```
(2).mysqlの接続
```mysql -uroot -p
(3).リモート接続ユーザー作成
```CREATE USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY '123';```
(4).権限付与
```GRANT ALL PRIVILEGES ON ```*.*``` TO 'user'@'%';```
```flush privileges;```
#3．Mysql再起動
(1).終止コンテナ検索
```docker ps -a```
(2).コンテナ起動
```docker start　コンテナID```
(3).コンテナ削除
```docker rm　コンテナID```
【iOS】【アプリ開発】不適切なレビューの削除依頼

アプリをストアにリリースすると遊んでくれた方がレビューしてくれます。
ありがたいことです。

ですが、中にはスパムレビューもあります。
そういったスパムは削除依頼をすることができます。

見つけたらなるべく早く依頼しましょう。
（削除されるとは限らないけど....）

ググるとPCのiTunesから行う方法が出てきますが、この方法はできませんでした。
iPhoneのAppStoreから申請することができたので、その方法をまとめます。

###1. AppStoreで対象のアプリを開きます

###2. 対象のレビューを表示して長押しします
![IMG_3002.PNG](https://qiita-image-store.s3.amazonaws.com/0/237014/4c2149bf-4a2e-ea7e-aa56-0729d6f8d2bd.png)

###3. ダイアログが開くので「問題を報告」を押します
![IMG_3003.PNG](https://qiita-image-store.s3.amazonaws.com/0/237014/1e0588aa-49dc-febf-e521-a95b72a3e701.png)

###4. 該当する理由を選びましょう
![IMG_3004.PNG](https://qiita-image-store.s3.amazonaws.com/0/237014/d879cca9-2ed3-eeb3-9cb1-d84558891d2a.png)

###5. 正当な理由を詳しく書きます
画像では4で「主題から外れています」を選択した時の記載例です。
![IMG_3005.PNG](https://qiita-image-store.s3.amazonaws.com/0/237014/573eefcb-918f-ad23-b4c9-d20420782ffc.png)


実際に削除されるには2,3日掛かるようです。
Qiitaやブログに記事でも書いて待ちましょう。

おわり
[Amazon WorkSpaces]AmazonLinux2にDockerインストール

Amazon Linux release 2 (Karoo)

amazon-linux-extrasではなくでyumでインストールすると最新版入ります(2020/03/29追記)
[Amazon Linux2でDockerをインストールする方法が2種類ある](https://qiita.com/rururu_kenken/items/6e8298867313b36d50dc)

```sh
# amazon-linux-extras install -y docker=18.03.1のようにバージョン指定でインストールも可能
sudo amazon-linux-extras install -y docker

# dockerサービス起動
sudo systemctl start docker

# DockerはUnixソケットをTCPポートにバインドするため、
# rootユーザーでしか動作しません。sudoコマンドを
# 使いたくないという場合は、dockerグループを作成して
# そこにユーザーを追加してください
# なお、sudoコマンドでdockerコマンドを実行できるように
# するには、dockerグループにユーザー追加後にログオフして
# 再度ログインする必要があります
sudo usermod -a -G docker $USER

# 確認コマンド
cat /etc/group | grep docker

# dockerサービスの自動起動を有効にする
sudo systemctl enable docker

# docker-composeのインストール
# 以下の場合は、1.29.2のバージョンをインストール
# https://github.com/docker/compose/releases
#
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# docker-composeに実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose

# Docker用にDNS Serverを指定
sudo vi /etc/docker/daemon.json

{
    "dns": ["8.8.8.8", "8.8.4.4"]
}

# Docker deamonを再起動
sudo service docker restart
```
フィルターをかけてシートごとに転記するマクロ　その1

今回は
『シートと一致する項目をフィルターで抽出し可視セルでコピペする』
マクロを作成しました。下図のような感じです。
マクロ使用前<img src=https://qiita-image-store.s3.amazonaws.com/0/265756/23ccce12-a48d-4fc5-ace6-cf4e9847abcc.png width=80%>
マクロ使用後<img src=https://qiita-image-store.s3.amazonaws.com/0/265756/316f9910-e478-d02d-fdef-948f110d7214.png width=80%>

```VB
Sub buntatu01()
    
'   フィルターをかけるシートを指定
    Dim bunkatumaeWs As Worksheet
    Set bunkatumaeWs = Worksheets(2)
   
'   繰り返し開始（3つ目～最後のシートまで）
    Dim i As Long
    For i = 3 To Worksheets.Count
    
'   転記先のシートを指定
        Dim wsName As String
        wsName = Worksheets(i).Name
        
'   フィルターをかけてE列を指定したシート名と一致したもののみ抽出して可視セルでコピぺ
        With bunkatumaeWs.Range("A1")
            .AutoFilter Field:=5, Criteria1:=wsName
            .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets(i).Range("A1")
            .AutoFilter
        End With
    
    Next i
    
'   ブックを閉じないで保存する
    ThisWorkbook.Save

End Sub
```
今まで作成したマクロとは異なり、別のブックを操作しないので、意外とシンプルになりました。
次回はシートを自動生成してコピペできるよう改修したいと思います。
[numpy] データの各要素を大小関係でランク付ける

$[x_1,x_2,\ldots,x_n]$のデータが与えられた時に、それぞれの要素の（小さい方から数えた）順位を返すには, np.argsortを二回使えば良い。

```python
import numpy as np

x = np.random.randn(6)
rank = np.argsort(np.argsort(x))
print(x)
print(rank)

>>>
[-0.6828045  -0.93062684 -0.994558    0.03204029  0.26457471  1.3978161 ]
[2 1 0 3 4 5]
```

それぞれの要素の順位に変換されていることがわかる。
RaspberryからAWS IoT にsubscribe/publishする

##モチベーション
前回の[RaspberryからAWS IoT にsubscribeする](https://qiita.com/atmaru/items/139e2cb352fe37809ce6)の逆のpublishをしたい。

##環境
- RaspberryPi3B+
- Raspbian 9.8


##参考文献
こちらを参考に
https://github.com/aws/aws-iot-device-sdk-python/blob/master/samples/basicPubSub/basicPubSub.py

##ソースコード
コマンドラインから様々な変数を変更できるようにしていますが、前回のコードと同じように、pythonコードの中に定義する形にして、一度subscribeし、1秒毎に無限回publishするようにしたコードが以下。

```mqttsubpub.py
# coding: utf-8
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import logging
import time
import argparse
import json

CLIENT_ID = "test_client_id"
ENDPOINT = "a1zpik1blw3qlv-ats.iot.us-east-1.amazonaws.com"
PORT = 8883
ROOT_CA = "./cert/AmazonRootCA1.pem"
PRIVATE_KEY = "./cert/786b47188a-private.pem.key"
CERTIFICATE = "./cert/786b47188a-certificate.pem.crt"
TOPIC = "RasPi3B/sample"


def main():
    client = AWSIoTMQTTClient(CLIENT_ID)
    client.configureEndpoint(ENDPOINT, PORT)
    client.configureCredentials(ROOT_CA, PRIVATE_KEY, CERTIFICATE)
    
    # AWSIoTMQTTClient connection configuration
    client.configureAutoReconnectBackoffTime(1, 32, 20)
    client.configureOfflinePublishQueueing(-1)  # Infinite offline Publish queueing
    client.configureDrainingFrequency(2)  # Draining: 2 Hz
    client.configureConnectDisconnectTimeout(10)  # 10 sec
    client.configureMQTTOperationTimeout(5)  # 5 sec
    
    # Connect and subscribe to AWS IoT
    client.connect()
    # TOPICが起動したら呼ばれる関数を登録する
    client.subscribe(TOPIC, 1, mycallback)
    time.sleep(2)
    
    # Publish to the same topic in a loop forever
    loopCount = 0
    while True:
        message = {}
        message['message'] = 'Hellow AWS IoT'
        message['sequence'] = loopCount
        messageJson = json.dumps(message)
        # publish(topic, payload, QoS)
        client.publish(TOPIC, messageJson, 1)
        loopCount += 1
        time.sleep(1)

# Custom MQTT message callback
def mycallback(client, userdata, message):
    print("Received a new message: ")
    print(message.payload)
    print("from topic: ")
    print(message.topic)
    print("--------------\n\n")


if __name__ == "__main__":
    main()

```

実行結果も載せておきます。
5回pub/subした後に、Ctrl-zで中止しました。

```
pi@raspberrypi:~ $ python mqttsubpub.py
Received a new message:
{"message": "Hellow AWS IoT", "sequence": 0}
from topic:
RasPi3B/sample
--------------


Received a new message:
{"message": "Hellow AWS IoT", "sequence": 1}
from topic:
RasPi3B/sample
--------------


Received a new message:
{"message": "Hellow AWS IoT", "sequence": 2}
from topic:
RasPi3B/sample
--------------


Received a new message:
{"message": "Hellow AWS IoT", "sequence": 3}
from topic:
RasPi3B/sample
--------------


Received a new message:
{"message": "Hellow AWS IoT", "sequence": 4}
from topic:
RasPi3B/sample
--------------


Received a new message:
{"message": "Hellow AWS IoT", "sequence": 5}
from topic:
RasPi3B/sample
--------------


^Z
[3]+  停止                  python mqttsubpub.py
pi@raspberrypi:
```

APIリファレンス
https://s3.amazonaws.com/aws-iot-device-sdk-python-docs/sphinx/html/index.html#
ftpでWordpressのプラグインをアップロード

# 概要
この後に書く予定の記事でShibbolethでWordpressをSAML連携してみたで記載する予定のスピンオフ記事。
Shibboleth連携のプラグインをそのままSCPでサーバへ転送しただけじゃ面白くないので、今までのキャリアで全然触れてこなかったftpを利用してみて、ファイル転送してみようじゃないかという記事です。

## 使ったもの
サーバ
　AWS EC2インスタンス　t2.micro
サーバOS
　CentOS 7.5.1804
パッケージ
　vsftpd 3.0.2-25
クライアント
　MAC Mojave 10.14.3

## 設定の流れ

１　FTPパッケージの追加
２　FTP用のユーザ追加/パスワード変更
３　FTPの初期設定
４　FTP接続用のユーザ登録

## 設定内容
１　FTPパッケージの追加

```bash:パッケージ追加
yum install vsftpd -y
```

２　FTP用のユーザ追加/パスワード変更

```bash:ユーザー追加/パスワード変更
useradd ftp-user
passwd ftp-user
```

３　FTPの初期設定
前提条件：
　・セキュリティグループでTCP 21ポート(FTPクライアントからFTPサーバに対してコントロールコネクションを貼る際に利用するポート番号)を開けておく

```bash:バックアップ取得/設定ファイル編集
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
vi /etc/vsftpd/vsftpd.conf
```

```bash:編集内容
tcp_wrappers=NO #アクセス制御しない
pasv_enable=YES #パッシブモードを許可する
pasv_min_port=60001 #パッシブモードで利用するポート番号
pasv_max_port=60010 #パッシブモードで利用するポート番号
force_dot_files=YES #ドットから開始するファイルを含める
use_localtime=YES #ファイルのタイムススタンプはサーバ上のものを使用
user_config_dir=/etc/vsftpd/user_conf #ユーザー接続設定
chroot_local_user=NO #FTPで接続するユーザーが上位ディレクトリにアクセスすることも許可する
chroot_list_enable=YES #ファイルで指定されたユーザーのみchrootを除外される
chroot_list_file=/etc/vsftpd/chroot_list #アクセスを許可するユーザーを指定する
```

４　FTP接続用のユーザ登録

```bash:アクセス許可ユーザーの指定（ファイル作成）
vi /etc/vsftpd/chroot_list
```

```bash:chroot_listファイルの内容
ftp-user
```

```bash:FTPユーザー用のアクセス制御ファイル作成
mkdir /etc/vsftpd/user_conf
vi /etc/vsftpd/user_conf/ftp-user
```

```bash:ftp-userファイルの内容
local_root=/var/www/html/wordpress/wp-content
```

ファイル作成後にサービス再起動

```bash:サービス再起動
systemctl restart vsftpd
systemctl status vsftpd
```

無事にFTPクライアントソフトから接続できるようになったことを確認しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/02aab0ac-dc7a-f37a-f970-550031420357.png)
ワンライナーで設定ファイルの一部をコメントアウトする

こんな設定ファイルがあって対象の行だけワンライナーでコメントアウトしたい

```nginx.conf

location hogehoge {
 なんかの設定
}

```

これでいけた

```
sed -i '' -e '/hogehoge/,/}/ s/^/ # /g' ./nginx.conf
```

- `hogehoge`で始まって`}`で終わる行の先頭(正規表現で^)に`#`をつけるワンライナー

- macだと`-i ''`オプションがないとうまくいかない。LinuxであればなくてもOK



（冪等性はともかく）これをAnsibleにshellモジュールで実行させてサーバ設定したりとかできます
AWS 逆引き申請手順(rDNS)

## はじめに

EC2からメールを送信したい場合、AWSへの申請が必要になります。

- メール送信制限解除申請
- 逆引き設定申請

なお逆引き設定申請をすると、同時にメール送信制限解除もされるので申請は実質一つで問題ありません。

## 注意点

**申請はルートアカウントでしかできない**
申請はルートアカウントでしかできません。administrator権限でもできません。

**正引きのDNS登録が必要**
逆引き設定申請を行う前に正引きのDNS(Aレコード)登録を行っておく必要があります。
正引きの登録をせずに逆引き設定申請をおこなっても、AWSの方で申請が却下されてしまいます。

## 申請手順
### マネジメントコンソールにログイン
ルートアカウントでログインをしてください。
![Amazon co jpへのログイン.png](https://qiita-image-store.s3.amazonaws.com/0/306374/166680ae-e91f-e29f-1b03-5fc0ef095d2f.png)
![AWS マネジメントコンソール.png](https://qiita-image-store.s3.amazonaws.com/0/306374/28948b65-717d-7a6b-3e80-4b025c193daa.png)
### 申請フォームにアクセス

マネジメントコンソールにログインした状態で、以下のURLをクリックしてください。
https://aws.amazon.com/forms/ec2-email-limit-rdns-request

### 各項目に申請内容を入力
各項目に、今回の依頼内容を入力します。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/306374/018010e6-abbc-3adb-7580-c11525077c04.png)

**Email Address**
ルートアカウントのメールアドレスが自動で表示されます。そのままで問題ありません。

**Use Case Description**
一律以下のような内容で問題ないはずです。
「メールサーバー構築のため。(rDNS registration.)」

**Elastic IP Address**
逆引きを可能にしたいグローバルIP(Elastic IP)を入力します。

**Reverse DNS Record for EIP**
逆引きの結果として設定してほしいドメイン名を入力します。

`Elastic IP Address` と `Reverse DNS Record for EIP` は1回の申請で2セットまで依頼することが可能です。

各項目への入力が完了したら、`Submit` ボタンを押してください。

設定が完了するとAWSからメールで連絡が来ます。早いと1時間弱。遅いと3日ぐらいかかる場合もあるそうです。

## 参考記事

AWS EC2 Eメール上限緩和 / 逆引き(rDNS)設定 申請手順
https://www.slideshare.net/AmazonWebServicesJapan/aws-42885668

AWSからのメール送信
https://www.slideshare.net/AmazonWebServicesJapan/aws-30934799
AnsibleでLBのiRuleを読み込む

#はじめに
AnsibleでBIG-IPのロードバランサに入っているiRuleを読み込み、変数として格納します。
私のぐぐる力が雑魚なだけかもしれませんが、
個人的に調べた限りでは、iRuleの単純な追加や削除しか方法が見つかりませんでした。
（もしかしたらbig-ipのモジュール自体その機能しか無い…のかも。
　ドキュメントは目を通しましたが、英語は読めないので本当に目を通しただけです。）

#REST-APIを使おう
tmshを元に作ったWEBAPIみたいなもの…って聞いた気がする。

```
shell: curl -k -u bigipのユーザ名:bigipのパスワード  -H "Content-Type: application/json" -X GET https://BIG-IPのIPアドレス/mgmt/tm/ltm/rule/iRuleの名前
register: irule
```
※03/13 会社で確認したらrulesではなくruleだったので記載を修正しました。

JSON形式で戻り値が帰ってきます。
上の例だと「iRuleの名前」というiRuleの中身が「irule.apiAnonymous」というところに入ります。
apiAnonymousという名前ですが、ちゃんとiRuleの中身だけのデータが入ってくれます。

会社でやったことを記憶を頼りに書いてるので、記載誤り等あったらごめんなさい。
ともかく、REST-APIが使えればAnsibleのbig-ipモジュールで出来ないことも可能になります！
現在の設定が確認できればべきとうせいとやらの担保もしやすくなりそうですね。
研究分野

私のやっていることについて少し紹介しておきます。

#侵入検知システムの性能向上
普段私達が使っているPCやスマホなどの機器は、危険と隣り合わせになっています。なかには、マルウェア、ランサムウェアなどの言葉を聞いたことがある方もいらっしゃるかもしれません。
それらはひとまとめにしてしまえば「サイバー攻撃」と言うことができます。
通常であれば、ファイアウォールと呼ばれる防御システムによって大体の攻撃は防げます。防げないものに関しては侵入検知システムによって検知されたアクセスをユーザ側が通すか通さないかを選択しますが、その侵入検知システムはアクセスが正常か攻撃かを100%見破ることはできません。
現在ではシグネチャ型侵入検知システムという、これまでの攻撃パターンを登録しておいて登録したものと同じアクセスを検知するというものが主流ですが、これだと未知のアクセスに対応できない可能性があります。（登録されていないものはすべて正常だという判定になるため）
そこで、機械学習によるAI型の侵入検知システムが注目を集めています。
機械学習による検知における利点は、未知の攻撃に対応できる可能性があるということです。パターンが一部異なるものに関しては、シグネチャ型では対応できない場合がほとんどであるのに対し、AIでは特性上、似ているものはひとまとめにするのでこのように考えられています。

#具体的な事例
トレンドマイクロ株式会社さんから、「[ウイルスバスタークラウド](https://www.trendmicro.com/ja_jp/forHome/products/vb/xgen.html)」、「[ウイルスバスターモバイル](https://www.trendmicro.com/ja_jp/forHome/store/vbm.html)」が販売されているのをご存知でしょうか？
これらは従来のシグネチャ型の検知に加え、機械学習型のスキャンも行うハイブリッドな侵入検知システムを構築しています。

#目指している内容
**シグネチャ型と機械学習型を組み合わせた侵入検知システムを作成し、ソフトにすることです。**

現在、「[Kyoto 2016 Dataset](http://www.takakura.com/Kyoto_data/)」というネットワーク型侵入検知システムの評価用データセットが契約を交わすことなく無料で使用可能です。これを用いた場合における、機械学習による分類精度に関する指標は「Kyoto 2016 Dataset」の作成者である[多田ら](https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=183607&item_no=1)の論文に掲載されています。
まず、[この論文](https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=183607&item_no=1)に掲載されている分類精度に関する指標を更に理想に近づけることから始めます。
Pythonでjira操作してみた

# はじめに
jiraと言えば、知る人ぞ知るATLASSIAN社の課題管理ツールですよね。
https://ja.atlassian.com/software/jira

弊社では課題管理をjiraで実施しており、ITのプロマネをやっていると常にBoardやBacklogとにらめっこしながら、
進捗状況を確認したり、タスクの過不足をチェックしたりしています。

ひょんなことから、jiraチケットが簡単に作れたら今までとは異なる粒度で管理が可能になるかな、と思い、
API等を調べたところ色々あることを発見。
自分に馴染みがあるPythonで実装してみました。

実際には100個近くの親チケットを作成し、それに子チケットを紐付けて作成する、というという作業を、
データ準備の部分だけ手作業で実施しています。
（エクセルでデータ整理してリストや辞書形式にし、pythonに持ってきている）

子チケットを2パターン作成したのですが、それでも300個以上あり、手作業だと膨大な時間がかかります。
（途中で心が先に折れると思います・・・）

# やってみたこと
- チケット自動作成
- ウォッチャー追加
- 他の課題との紐付け

## ログイン
まずは、JIRAを操作するためにログイン。

```python:login
from jira import JIRA
from jira.exceptions import JIRAError

options = {'server': 'https://xxxxx.com', 
           'verify': False}

usr = 'YOUR_ACCOUNT'
pas = 'YOUR_PASSWORD'

try:
    jira = JIRA(options=options, basic_auth=(usr, pas))
except JIRAError as e:
    if e.status_code == 401:
        print ("Login to JIRA failed.")
print ("Login!!")
```

## チケット作成など
そしてチケット作成。Summaryなどをパラメータとした関数にして、実行

```python:create_ticket
epicLink1 = 'ZZZZ-490'
sprint = 7870 # sprintは数字形式

labels=['label1', 'label2']

new_issue = jira.create_issue(
                            project = 'ZZZZ',
                            summary = 'Summary',
                            description = 'Description',
                            issuetype = {'name': 'Task'},           # 他にTicketなど
                            customfield_10001 = sprint,             # Sprintはカスタムフィールド
                            customfield_10002 = epicLink1,          # epic linkはカスタムフィールド
                            labels = labels
                            )
print ('Done!', new_issue, 'was created!')

```

ウォッチャー紐付けと関連チケット紐付け。
実際はチケット作成と直列で実施。

```python:link/watcher
# Link
new_issue = jira.issue('ZZZZ-0001')
parent_issue =  jira.issue('ZZZZ-0002')
jira.create_issue_link('Tests',new_issue, parent_issue) # Link typeはblocksなど色々

# Add watcher
jira.add_watcher(new_issue, 'taro.tanaka')
jira.add_watcher(new_issue, 'jiro.suzuki')
```

# 終わりに
チケット大量生産が簡単にできるようになりました。あとはマネージするだけ〜。
ところでパフォーマンスがひたすら悪かったです。1件作成してwatcherつけてLinkし終わるまでに、
1分弱かかっていました。

もしかしたら、弊社の場合JIRAの管轄がUS本社で行われていて、サーバー等も日本から離れているから、
なのかもしれない。。。

カスタムフィールドもいじれたので、基本的にはなんでもいじれるんじゃないかなと思います。
ではまた。
最新日付と過去の日付の差分を計算するSQL

こんなテーブルから最新と過去の各日付の値を抜き出すSQLを書く

| hogehoge_countsテーブル|日付と何かの数を持つテーブル|
|---|---|
|hogehoge_type|種別|
| date |日付|


```SQL
SELECT DISTINCT new.type,
    new.count 最新の数,
    old.count 過去日付の数,
    new.date 最新日付,
    old.date 過去日付,
    new.count - old.count 最新と過去の差分
FROM
(SELECT * FROM hogehoge_counts WHERE date = (SELECT max(date) FROM hogehoge_counts)) new
,
(SELECT * from hogehoge_counts WHERE date NOT IN (SELECT max(date) FROM hogehoge_counts)) old
WHERE new.hogehoge_type = old.hogehoge_type
ORDER BY old.date DESC, new.hogehoge_type;
```

FROM区のサブクエリで最新の日付と最新以外の日付を持つ値を引っ張ってそれを表示。
AWS lambdaとAPI Gatewayを繋げる

AWS LambdaとAPI Gatewayを接続します。

lambda関数とAPI Gatewayを初期状態で準備してください。




API Gatewayのリソースで、今回はGETを作成しましょう。

リソースのtest-lambdaを選択し、アクションボタン→メソッドの作成で作成することができます。



リソースの作成が出来たら、対象のlambda関数を指定します。
ここで、リージョンとlambda関数を指定するのですが、lambda関数名を選択するときにドロップボックスに出てこないことがあるので、そういうときは手入力しましょう。

![lambda.png](https://qiita-image-store.s3.amazonaws.com/0/203857/7a7bebb2-2cc0-c687-9d3f-9eba3159c9f7.png)


lambdaとつながると、

![lambda.png](https://qiita-image-store.s3.amazonaws.com/0/203857/331ee81e-20e5-6457-cb0e-08e7cae408be.png)

lambda関数にAPI GateWayが出現しますね！！！

その前に、API Gatewayに戻り、作成したメソッドでデプロイしておきましょう。
testというステージ名でステージを作成します。
URLが出てきますが、いまのところ無視してください。
エラーで返ってくると思われます。

lambdaに戻りましょう。
lambda関数内のコードは以下の通り


`
exports.handler = async (event) => {
    return {
        "statusCode": 400,
        "body": '繋がった!'
    };
};
`

でいきます。
return以下がAPI Gatewayを通して処理されるものです。Console.logでは出力されないので注意してください。(汚いのはご容赦を。笑)

![lambda.png](https://qiita-image-store.s3.amazonaws.com/0/203857/4edaec8b-78c7-e379-942d-eeae9c5c04e1.png)

urlを見ると、test/test-lambdaとなっていると思います。
ApI Gatewayのステージ作成でステージの作成を行ったときに出てきたurlにlambda関数名を追加したものです。

こいつをクリックすると、

*{"statusCode":400,"body":"繋がった!"}*

と出力されるはずです。

簡単ですが、これでlambdaとAPI Gatewayは繋がりました。