OmniAICreator/Qiita-1.07M huggingface dataset:
WebAppsを配置する

####  リソースの作成
まずはリソースグループを設定する。リージョンは西日本に設定。
どこ隠したらいいかわからないからとりあえず隠す。
![スクリーンショット 2021-06-18 23.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/67ef34bf-d553-4185-4183-6670c7cce43a.png)

WebAppを配置する。
今までは各属性を適当に決めていた部分もあったが、これを機に詳しく調べてみる。

- サブスクリプション、リソースグループを設定する。
- 名前を任意で設定。
- ウェブアプリを自分で開発したいので公開を"コード"で設定。
 - Dockerコンテナを選択する場合、既存のコンテナを載せるイメージ
- .NETで開発を行うので、".NET Core 3.1(LTS)"を選択
 -  最新は".NET 5"だが、監視が使えなくなるので上記を設定
- オペレーティングシステムはWindowsを設定。
 - "Linux"を選択すると監視が使えなくなる。同じスペックでもLinuxの方が安価
- 地域は自分に近い場所を選択
- SKUとサイズは無料枠でF1を選択 
![スクリーンショット 2021-06-23 18.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/fcfe5b77-f47f-95bd-1516-4f0f5763a451.png)

- 継続的なデプロイは無効で設定
 - Gitで管理したコードをデプロイするから
![スクリーンショット 2021-06-23 18.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/808383ea-d7d4-8f32-2a61-ed3744412589.png)

- Application Insights を有効にするをはいにして作成
![スクリーンショット 2021-06-23 18.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/ce71fc46-a473-fc3c-811c-5b26a3dc5e53.png)

#### リソース作成後の設定の変更


#### 疑問
- SKUとサイズの値段が上がると何ができるようになるか
選択可能な範囲で、最もスペックの高いプランと最もスペックの低いプランを比較
![スクリーンショット 2021-06-23 19.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/a2e3e78d-809a-a289-4717-0b75b8497115.png)
![スクリーンショット 2021-06-23 19.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/c6a50e66-4c76-fce0-caca-35bd89713d95.png)

 - メモリと記憶域の容量が大きくなる
 - 「[ACU=VMの性能](https://docs.microsoft.com/ja-jp/azure/virtual-machines/acu)」。WebApps用がVM選択したACUに対応したVMの上に構築される？
 - カスタムドメイン（SSL）。カスタムドメインのみのものは、SSLが使えないので注意。
 - 手動or自動スケール。スケールアウトに関する機能。自動の場合、スケールアウトする条件を設定する。
 - ステージングスロット。デプロイ前にテストで使えるスロット。作成・回収したアプリを配置してテスト、デプロイする。
 - 毎日のバックアップ。規定の回数/1日　バックアップを作成する。
 - Trafic Manager。複数のWebAppsインスタンスに対して、不可分散が可能。スケールアウトは単一のインスタンス内での分散。

#### まとめ
WebAppsインスタンスを作成した。
内容は適宜更新していく。
エクセルからコマンドとコマンドの引数を読み込んで結合

["参考にした記事"](https://qiita.com/noca/items/966f4c5ae5eee8195fe0)

```python
import pandas as pd
import random
from tkinter import filedialog

def multi_columns(data_frame):
    df = data_frame.copy()
    if type(df.columns) is not pd.MultiIndex:
        return df

    # 列にUnnamedという文字の入った内容を削除しインデックスを振り直す
    df = df.rename(columns=lambda x: x if not 'Unnamed' in str(x) else '')
    df = df.reset_index()

    cols = df.columns
    copy_col = list(cols)

    # column.namesを新しいcolumnの一番上(インデックスセルの一番左)に持ってくる
    name_col = tuple([(name if name is not None else '') for name in cols.names])
    copy_col[0] = name_col

    # 無効セルは上に詰める
    for i, col in enumerate(copy_col):
        pack = [content for content in col if content != ""]
        copy_col[i] = tuple(pack + ([""] * (len(col)  - len(pack))))

    df.columns = pd.MultiIndex.from_tuples(copy_col)
    cols.names = tuple([None for x in cols.names])
    return df

#テストパターン読み込み
typ = [('テストパターン(excelファイル)','*.xlsx')]
excel_file_path = filedialog.askopenfilename(filetypes=typ) 
df = pd.read_excel(excel_file_path, skiprows=0, header=[0, 1])
t_p = multi_columns(df)

#テストパターン読み出してコマンドを作成
#テストパターンは、０列目：インデックス、１列目：イベント、２列目：引数の数、３列目以降は引数の最小値、最大値２列おきに続く
for i in range(len(t_p)):
    eve = t_p.iloc[i]["イベント"]
    arg_num = t_p.iloc[i]["引数の数"]
    command = eve
    #引数の数分だけ引数を結合
    for j in range(int(arg_num)):
        arg_min = t_p.iloc[i, 3+j*2]#３列目以降２列ごとにデータがある前提
        arg_max = t_p.iloc[i, 4+j*2]#４列目以降２列ごとにデータがある前提
        command += " " + str(random.randint(arg_min, arg_max))
    #キャリッジリターンも結合
    command += "\r\n"
```
カルマンフィルターその5

# カルマンゲイン
本日は、[前回のブログ](https://qiita.com/yukio_takagi/items/e678769e77eac05862af)で登場したカルマンゲインについて、解説する。

改めて、前回の2変量正規分布の式を再掲する。2つの変数$Z,Y$のうち、$Y=y$が得られた時のZは次のように表すことができた。

$E(Z|Y=y)=\mu_{z|Y=y}=\mu_z + K (y-\mu_y) \tag{11}$
$K = \frac{Cov(Z,Y)}{Var(Y)} \tag{12}$

そして、この2変量正規分布の過程を観測変数$Y_t$と状態変数$\tilde \beta_t$に当てはめたのが次の式であった。

$\hat \beta_{t|t}= \hat \beta_{t|t-1}+ K_t (Y_t - \hat Y_{t|t-1}) \tag{13}$

式(13)の$K_t$も式(12)に倣い、同様に求めてみると次のようになる。

$$K_t = \frac{Cov(\tilde \beta_t, Y_t|\Omega_{t-1})}{Var(Y_t|\Omega_{t-1})} = \frac{Cov(\tilde \beta_t, c + X_t \tilde \beta_t + \tilde e_t |\Omega_{t-1})}{Var(c + X_t \tilde \beta_t + \tilde e_t |\Omega_{t-1})}$$

右辺への展開には、[2回目ブログ](https://qiita.com/yukio_takagi/items/ec321d0fffd556e11c62)の式(1)を用いた。

まず、上記の式の右辺の分子は、次のようになる。
$$Cov(\tilde \beta_t, c + X_t \tilde \beta_t + \tilde e_t |\Omega_{t-1})=Cov(\tilde \beta_t, X_t \tilde \beta_t|\Omega_{t-1})+Cov(\tilde \beta_t, \tilde e_t|\Omega_{t-1})$$
右辺の2項目の$\tilde \beta_t$と$\tilde e_t$は互いに独立であるので、0となる。よって、

$$= X_t Cov(\tilde \beta_t,\tilde \beta_t|\Omega_{t-1})+0=X_t \Sigma_{t|t-1}$$
となる。

また分母は次のようになる。
$$Var(c + X_t \tilde \beta_t + \tilde e_t |\Omega_{t-1})=0+X_t^2 Var(\tilde \beta_t|\Omega_{t-1})+Var(\tilde e_t|\Omega_{t-1})$$
これは左辺のVarの()の中はいずれも無相関の関係であり、また定数の分散は0となることを利用している。そして、次の式は、残った2つの項に対して、各々の定義から導き出せる。

$$=X_t^2 \Sigma_{t|t-1}+\sigma_e^2$$

最後に$K_t$の式に戻す。

$$K_t=\frac{X_t \Sigma_{t|t-1}}{X_t^2 \Sigma_{t|t-1}+\sigma_e^2} \tag{15}$$


これがカルマンゲイン$K_t$である。右辺の分母は元々、$Var(Y_t|\Omega_{t-1})$であるから、観測変数の1期先の分散の予測値であり、分子は式展開した結果、状態変数の1期先の分散の予測値となっている。この比がカルマンゲインであり、式(13)で観測値$Y_t$とその期待値$Y_{t|t-1}$との差に、観測変数の分散の予測値と状態変数の分散の予測値の比を重みとしてかけている。

では、なぜ(15)のような式展開をしたのか、これは$K_t$に$X_t$をかけてみるとわかる

$$X_t K_t = \frac{X_t^2 \Sigma_{t|t-1}}{X_t^2 \Sigma_{t|t-1}+\sigma_e^2} $$
この式の右辺から明らかになるのは、$0 < X_t K_t \leqq 1$となることである。

前回示した状態変数のフィルタリング値の分散の式(14)に当てはめてみると、1期前の情報から予測した分散$\hat \Sigma_{t|t-1}$よりもフィルタリング値は小さくなることが明らかである。

$$\hat \Sigma_{t|t}= (1 - X_t K_t) \hat \Sigma_{t|t-1}\tag{14}$$

このようにフィルタリングを行うことで、予測の精度を高めていることになる。

次回はスムージングの解説に入る予定である。
bundle install でmysql2インストール時にエラーになる

## 起きたこと
久しぶりにローカル環境にRuby on Rails環境を構築しようとしたところ、
`bundle install`実行時にエラーが発生したので、解決までの記録を書きました。

環境：
- MacOS Big Sur 11.4
- Ruby on Rails 6.0.2
- Ruby 2.7.2

## 発生したエラー
mysql2のコンパイル実行時にエラーが発生した模様。
出力したログではいまいち原因がよくわからないので色々ググります。

```
$ bundle install
~ 省略 ~
/Users/<ユーザー名>/.rbenv/versions/2.7.2/lib/ruby/2.7.0/mkmf.rb:1050:in `block in find_library': undefined method `split' for
nil:NilClass (NoMethodError)
	from /Users/<ユーザー名>/.rbenv/versions/2.7.2/lib/ruby/2.7.0/mkmf.rb:1050:in `collect'
	from /Users/<ユーザー名>/.rbenv/versions/2.7.2/lib/ruby/2.7.0/mkmf.rb:1050:in `find_library'
	from extconf.rb:87:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/<ユーザー名>/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-20/2.7.0/mysql2-0.5.3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/<ユーザー名>/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mysql2-0.5.3 for inspection.
Results logged to
/Users/<ユーザー名>/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-20/2.7.0/mysql2-0.5.3/gem_make.out

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
```

## 試したこと
- エラー文で支持されているmysql2のインストールを実行 `gem install mysql2:0.5.3 --source 'https://rubygems.org/'` (いつの間にかgemのバージョン指定時のコマンド構文が変わっていた。。)
  → bundle install と同じエラーが発生
- エラー文の一部をググって同じ事象が発生、解決している人がいないか探す


## 結果(というかオチ)
以下のスタックオーバーフローの回答内容を実行して解決しました
https://stackoverflow.com/questions/51228905/rails-error-installing-mysql2-mysql2-0-3-20

```
$ brew install mysql
$ gem install mysql2:0.5.3
```

そもそもローカル環境にMySQLをインストールしていなかったというオチ。。。
もともとDockerやVagrantなどを使って仮想環境にインストールしてやっていたので、ローカル環境にインストールしたことなかったのに気づけませんでした。

同じことになる人がいるかわかりませんが、エラー文を見るだけではパッとわからなかったので、備忘録として残します。
quandlから消費者物価指数（CPI）を取得し騰落率を計算する

## はじめに
株式投資を始めたことがきっかけで世界的な経済や金融に興味をもつようになりました。
[前回](https://qiita.com/pomta/items/4bbeb5b60a921291e618)は[Quandl](https://www.quandl.com/)というサイトから各国のインフレ率を取得し表示してみるということをしました。
[Quandl](https://www.quandl.com/)ではインフレ率以外にもさまざまな経済指標をWebAPIで取得することができます。
今回は個人的な研究で消費者物価指数（CPI）の騰落率が欲しかったので[Quandl](https://www.quandl.com/)でデータを取得しpandasでその騰落率を計算してみました。
## 実行環境

- Windows バージョン20H2
- Python 3.9.4
- jupyterlab 3.0.16
- Quandl 3.6.1
- pandas 1.2.5

## コードと説明
### ライブラリのインポート

```Python:get_CPI.ipynb
import quandl
import pandas as pd
```

インポートするモジュールは[前回](https://qiita.com/pomta/items/4bbeb5b60a921291e618)とほぼ同じですが今回はグラフをファイル出力しませんのでmatplotlibをインポートしていません。

### コンフィグ

```Python:get_CPI.ipynb
apikey = 'XXXXXXXX'
datatype = {'USA':'RATEINF/CPI_USA',
           'Japan':'RATEINF/CPI_JPN'}
```

APIKeyは[前回](https://qiita.com/pomta/items/4bbeb5b60a921291e618)と同じです。アカウント登録時に提供されたものに置き換えてください。今回はアメリカと日本のデータのみが欲しかったためdatatypeは2国のみ定義しています。
また[前回](https://qiita.com/pomta/items/4bbeb5b60a921291e618)はインフレ率の取得でしたのでシンボルは'RATEINF/INFLATION_XXX'でしたが今回は'RATEINF/CPI_XXX'を指定している点がポイントです。
詳しく知りたい方は[RATEINF Infration RatesのAPIのドキュメント](https://www.quandl.com/data/RATEINF-Inflation-Rates)を参照してください。

### データ取得と整形と出力

```Python:get_CPI.ipynb
# データ取得関数
def getdata(dtype):
    data = quandl.get(dtype, column_index = '1')
    return data

# APIキーのセット
quandl.ApiConfig.api_key = apikey

# データ取得
for dk in datatype.keys():
    # データ取得
    tempdata = getdata(datatype[dk])
    tempdata.rename(columns = {'Value':dk + '_value'}, inplace = True)
    # NaNの穴埋め
    tempdata = tempdata.fillna(method = 'ffill')
    # 騰落率の計算
    tempdata['tempval'] = tempdata.pct_change()
    tempdata['RoR'] = tempdata['tempval'] * 100
    tempdata = tempdata.drop(columns = 'tempval')
    # CSVの出力
    tempdata.to_csv('CPI_' + dk + '.csv')
```

今回はquandl.get(～)で期間を指定していない点やグラフ出力のために表を1つにまとめていないなど[前回](https://qiita.com/pomta/items/4bbeb5b60a921291e618)よりも構造はかなりシンプルです。
ポイントとしては騰落率の計算です。騰落率の計算式は[こちら](https://indexes.nikkei.co.jp/atoz/2016/06/changeratio.html "日経平均 読む・知る・学ぶ")のサイトを参考にさせていただきました。以下の通りです。

```
騰落率（%） ＝ {(基準日の値 / 前回の値) - 1} * 100
```

pandasのpct_change関数を用いることで{(基準日の値 / 前回の値) - 1}までの計算が行われるため次の行でpct_changeの結果に対し100をかけていることがコードからわかるかと思います。

## 出力されるファイル例
![RoR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610469/5b6c957e-eeb9-1a01-0412-d833a9c3b1b3.png)
出力されたファイルのRoR列が騰落率です。

## さいごに
いかがでしたでしょうか。Pythonではpandasなどデータを扱う強力なライブラリが多数ありまたそれに合ったデータを提供してくれているところなども様々ありデータ分析が非常にやりやすく楽しいですね。

また何か気になることがあれば投稿します。それではまた。
Linux環境でのAWS Clientのインストール、初期設定

# AWS Clientのインストール
zipファイルのダウンロード

```bash:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
```
ダウンロードしたzipファイルの解凍

```bash:
unzip awscliv2.zip
```
インストール

```bash:
sudo ./aws/install
```

# プロファイルの設定
AWSのインストール後、アクセスキーなどを使用するユーザー毎に設定しなければいけない。
下記コマンドを実行し、ユーザー毎にアクセスキーID、シークレットアクセスキーを設定する。

```bash:
aws configure (--profile ユーザー名)
```
↓

```bash:
[default]
aws_access_key_id=アクセスキーID
aws_secret_access_key=シークレットアクセスキー

[user1]
aws_access_key_id=アクセスキーID
aws_secret_access_key=シークレットアクセスキー
```
Markdownのテーブル内のコード記法でパイプを書く


## 概要

GitHubやQiitaのMarkdownにおいて、テーブル内にパイプ(`|`)を含んだコード記法を書く方法

---

`value1 || value2`のようなコードが書きたい時、下記のように書くことはできない

### 記述例

```.md
 a   | b
 --- | ---
   1 | `value1 || value2`
   2 | `value1 &#x7c;&#124; value2`
   3 | <code>value1 || value2</code>
```

### 表示例

 a   | b
 --- | ---
   1 | `value1 || value2`
   2 | `value1 &#x7c;&#124; value2`
   3 | <code>value1 || value2</code>

---

正しくはこのように書く

### 記述例

```.md
 a   | b
 --- | ---
   1 | <code>value1 &#x7c;&#x7c; value2</code>
```

### 表示例

 a   | b
 --- | ---
   1 | <code>value1 &#x7c;&#x7c; value2</code>
Symfony4 Serviceクラスを使用してみる ～CURD編～【1】

Symfony4の教本を読んでみて、CRUDなどは一通り作成してみたが、
DBからデータを取得する部分やレコードを追加する部分などをすべてControllerでやってしまっていたため、
きちんとServiceクラスに定義して、そこから呼び出せるようにしてみる。

### 作成するDBの定義

Userテーブル

|項目名|日本語名|型|必須|ユニーク|デフォルト|備考|
|----|----|----|----|----|----|----|
|id|ID（連番）|integer|〇|〇|----|Auto Increment|
|user_name|ユーザー名|string|〇|〇|----|----|
|password|パスワード|string|〇|----|----|----|
|email|メールアドレス|string|〇|〇|----|----|
|age|年齢|integer|----|----|----|----|
|role|役割|string|〇|----|TRUE|admin、normal、other<br>※管理者（admin）のみ変更可能|
|isActiveted|有効フラグ|boolean |〇|----|----|管理者（admin）のみ変更可能|
|created_at|登録日時|datetime|----|----|----|----|
|updated_at|更新日時|datetime|----|----|----|----|

※role・isActivetedをadminユーザーのみ変更可能は余裕があったらやってみる。。。

### bootsrapを使えるようにしておく

```diff:teplates/base.html.twig
<meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
```

```diff:config/packages/twig.yaml
twig:
    default_path: '%kernel.project_dir%/templates'
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'
    exception_controller: null
+     form_themes: ['bootstrap_4_layout.html.twig']

```

### 以下目次

|タイトル|URL|
|----|----|
|タイトルページ|https://qiita.com/RyotaIhara/items/6159bbc38a729293fde0|
|READを作成してみる|https://qiita.com/RyotaIhara/items/ec5a5dff9bf00de87af7|
|CREATEを作成してみる|https://qiita.com/RyotaIhara/items/54942b2122d05ed561b1|
|UPDATEを作成してみる|https://qiita.com/RyotaIhara/items/f1fd3c17d6fa5ef78d34|
|DELETEを作成してみる|https://qiita.com/RyotaIhara/items/f1fd3c17d6fa5ef78d34|
C#でブラウザを開く【.NET 5.0以降】

#概要
 .NET 5.0環境において、ブラウザアプリケーションから任意のURLを開く方法は以下の通り。
   
```csharp
var startInfo = new System.Diagnostics.ProcessStartInfo("https://google.com/");
startInfo.UseShellExecute = true;
System.Diagnostics.Process.Start(startInfo);
```

もしくは

```csharp
System.Diagnostics.Process.Start(@"C:\Program Files\Google\Chrome\Application\chrome.exe", "https://google.com/");
// 第1引数にブラウザのアプリケーションの絶対パス、第2引数にURL
```

#以下、時間のある方向け
　曖昧な箇所あり。ご了承お願い致します。

##遭遇した事象
　以下のコードで、windowsコンソールアプリからブラウザを開くことができなかった。

```csharp
System.Diagnostics.Process.Start("https://google.com/");
```

遭遇したエラーは<code>Win32Exception</code>

ちなみに環境は以下の通り
・Windows10 Home
・Visual Studio Community 2019
・.NET 5.0

##エラー理由
.NET Core 2.1以降、つまり.NET Core 3.1や、.NET 5.0において、<code>StartInfo.UseShellExecute</code>の既定値の変更が行われていることが原因。.NET Framework（少なくとも4.7.2）では規定値が<code>true</code>だが、.NET 5.0や.NET Core 2.1以降では<code>false</code>となっている。

<code>StartInfo.UseShellExecute</code>について
・trueの場合
　システムにインストールされているアプリケーションに関連付けられている拡張子のファイルであれば、
　ファイル名を指定するだけでアプリケーションを起動できる。
　例：引数に<code>hoge.txt</code>を指定 → メモ帳アプリで指定したtxtファイルを開く
・falseの場合
　実行可能形式であるファイル名を指定し、プロセスを作成する。
　※URLは実行可能形式ではないため、ここでエラーが発生する。

##解決策
`StartInfo.UseShellExecute`プロパティを自分で`true`に設定する。

```csharp
var startInfo = new System.Diagnostics.ProcessStartInfo("https://google.com/");
startInfo.UseShellExecute = true;
System.Diagnostics.Process.Start(startInfo);
```

もしくは

```csharp
System.Diagnostics.Process.Start(@"C:\Program Files\Google\Chrome\Application\chrome.exe", "https://google.com/");
// 第1引数にブラウザのアプリケーションの絶対パス、第2引数にURL
```

場合によっては、前者を共通関数みたいにしてしまうのがいいかなぁと、素人なりに思った。

## 対象環境
.NET 5.0 以降
.NET Core 2.1, 3.1 以降

##参考文献
https://uchukamen.com/Programming1/Process/

https://jeremybytes.blogspot.com/2019/08/converting-net-framework-to-net-core.html

https://www.fixes.pub/program/395794.html
C# 拡張メソッドの使い方

#●拡張メソッド
既存クラスに、継承を使わずにメソッドだけ追加するための仕組み


#●拡張メソッド定義構文
拡張メソッドであることの条件は2つ
・staticクラスのstaticメソッドであること
・第1引数として、thisキーワードをつけて拡張するクラスを指定すること

```C#
public static 戻り値の型 拡張メソッド(this 拡張するクラス 引数名, その他の引数)
{
    メソッド本体
}
```



#●ソース

Sringクラスを拡張して、新たなRepeatメソッドを定義する。
指定回数だけ繰り返した文字列を取得

```C#
// Stringクラスを拡張したstaticクラス
// クラス名は、(対象のクラス+Extensions)とするといい
static class StringExtensions
{
    // thisキーワードでStringクラスを拡張することを指定
    // 第2引数意向で、拡張メソッド本来の引数を指定する(この場合はcount)
    public static string Repeat(this string str, int count)
    {
        var builder = new StringBuilder();
        for (int i = 0; i <= count; i++)
        {
            builder.Append(str);
        }
        return builder.ToString();
    }
}
```

DateTimeクラスを拡張して、EndOfMonthメソッドを定義する。
指定した日付の月の最終日を取得する

```C#
// DateTimeクラスを拡張したstaticクラス
static class DateTimeExtensions
{
    // thisキーワードでDateTimeクラスを拡張することを指定
    public static DateTime EndOfMonth(this DateTime date)
    {
        return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1);
    }
}
```

```C#
static void Main(string[] args)
{
    var str = "Wow!";
    Console.WriteLine(str.Repeat(5));

    var date = DateTime.Now;
    Console.WriteLine(date.EndOfMonth());

}
```

#列挙型、インターフェースでの拡張メソッド
拡張メソッドは列挙型(Enum)やインターフェースにも使用することができる

##列挙型

```C#
// 調味料を列挙
enum Seasoning
{
    Salt,
    Soy_Sauce,
    Sugar
}

// Seasoningの拡張メソッド
static class SeasoningExtensions
{
    public static string GetSeasoningString(this Seasoning kind)
    {
        switch (kind)
        {
            case Seasoning.Salt:
                return "塩";
            case Seasoning.Soy_Sauce:
                return "醤油";
            case Seasoning.Sugar:
                return "砂糖";
            default:
                return "";
        }
    }
}
```

```C#
static void Main(string[] args)
{
    // 全ての列挙子(値)を取得して表示
    foreach (Seasoning kind in Enum.GetValues(typeof(Seasoning)))
    {
        Console.WriteLine(kind.GetSeasoningString());
    }
}
```

##インターフェース
実装を定義できないインターフェースでも拡張メソッドが利用可能。


```C#
static class Extensions
{
    // 条件で絞る機能の追加
    public static IEnumerable<int> Where(this IEnumerable<int> array, Func<int, bool> pred)
    {
        foreach (var x in array)
            if (pred(x))
                yield return x;
    }
    // 値を加工する機能を追加
    public static IEnumerable<int> Select(this IEnumerable<int> array, Func<int, int> filter)
    {
        foreach (var x in array)
            yield return filter(x);
    }
}
```

```C#

static void Main(string[] args)
{
    var input = new[] { 8, 9, 10, 11, 12, 13 };

    var output = input
        .Where(x => x > 10)
        .Select(x => x * x);
}
```

***

#まとめ
コードが読みやすくなったり、もう少し機能が欲しかったものに追加することができる反面、定義箇所が分かりづらくなるなどのデメリットもあるので、濫用は避けた方がいい。




#・参照
[拡張メソッド　++C++; // 未確認飛行 C ]
(https://ufcpp.net/study/csharp/sp3_extension.html#interface)
【Go入門】A tour of Go 【Flow control statements】

A tour of Go のBasicsの続きです。
引き続き、他言語と違う箇所を中心にピックアップします。

# Flow control statesment
## for

### for 初期化(変数宣言); 条件式; 後処理{}

- セミコロンで3つのセクションに分かれる
- セクションを()で括らない
- 後処理の{}は必要

```golang:for.go
package main

import "fmt"

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}
```
- 条件式以外の記述は必須ではない
- セミコロンも省略可なので他言語のwhileはforで記述

```golang:for-is-gos-while.go
for sum < 1000 {
		sum += sum
	}
```

- 条件式を省略すると無限ループになる

```golang:forever.go
package main

func main() {
	for {
	}
}
```

## if
### if 条件式 {true処理} else{false処理}
- forと同じく条件式を()で括らない

```golang:if.go
package main

import (
	"fmt"
	"math"
)

func sqrt(x float64) string {
	if x < 0 {
		return sqrt(-x) + "i"
	}
	return fmt.Sprint(math.Sqrt(x))
}

func main() {
	fmt.Println(sqrt(2), sqrt(-4))
}
```
xの平方根を文字列で出力する関数。xが負の場合、虚数になるので分岐

- forと同様に、条件句の前で簡単な変数宣言もできる(スコープはif-else内)

```golang:if-with-a-short-statement.go
if v := math.Pow(x, n); v < lim {
		return v
	} else {
		fmt.Printf("%g >= %g\n", v, lim)
	}
	return lim
```
x^n(xのn乗)がlimを超えないときはそのまま、超えたらlimを返す

## Exercise 

```golang:exercise-loops-and-functions.go
package main

import (
	"fmt"
	"math"
)

func Sqrt(x float64) (float64, int) {
	z:=1.0
	var delta float64
	for i := 1; i <= 30; i++ {
		delta = (z*z - x)/(2*z)
		if math.Abs(delta) < 0.1 {
		return z, i
		}
		z -= delta		
	}
	return z, 30
}

func main() {
	fmt.Println(Sqrt(4))
}
```
30回ニュートン法による近似を行う関数。30回未満で変動幅が0.1以下になった場合、その回数を出力します。Exerciseは10回未満かどうかを判定する内容なので、あとはbooleanで出力したり、近似回数を変えてみたりしても楽しい

## switch
### switch 変数宣言; 変数{case 値: 処理..., default: 処理...}
- Goでは条件が一致したcaseでbreakし、他のcaseは実行されない
- caseは定数でなくてもよく、整数以外も可

```golang:switch.go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Print("Go runs on ")
	switch os := runtime.GOOS; os {
	case "darwin":
		fmt.Println("OS X.")
	case "linux":
		fmt.Println("Linux.")
	default:
		// freebsd, openbsd,
		// plan9, windows...
		fmt.Printf("%s.\n", os)
	}
}
```
runtime.goosは実行しているOSの種類を返す。
https://golang.org/pkg/runtime/#pkg-constants

## defer
### defer 関数
関数を渡すとdeferの呼び出し元の関数の処理が終わったあとに、遅延して処理する。

- deferに渡す関数の引数はその場で評価する
- 複数の関数をdeferでスタックさせた場合、実行はlast-in-first-out

```golang:defer.go
package main

import "fmt"

func main() {
	x := 4
	defer fmt.Println(x)
	x += 1
	defer fmt.Println(x)
	x += 1
	fmt.Println(x)
}
->
6
5
4
```
x=6の次に最後にスタックしたx=5から出力される。
応用情報技術者試験に合格するまでの勉強まとめ

２０２１年４月実施の応用情報技術者試験に合格したので、その勉強方法をまとめました。

####受験する前の知識
・基本情報技術者を１０年前に取得済み
・過去にエンジニアを２年経験
・大学では情報系以外を専攻

####応用情報技術者受験歴
**・１回目受験：２０２０年１０月　＜不合格　午前８５点 / 午後５３点＞**
午前対策で５０時間、午後対策で６０時間ほど勉強したと思います。

【勉強方法】
午前の学習→過去問道場（https://www.ap-siken.com/apkakomon.php) + テキスト１冊

スキマ時間にやっていました。午前問題の約４割は過去問から出題されるので、過去問さえ解いていれば全く同じ問題も出るので午前の突破は可能だと思います。過去問からは直近よりも少し前の問題が出やすいので、設定を「★おすすめ」をチェック、気軽にやりたかったので「計算問題を出題しない(β版)」にチェックを入れてやっていました。この過去問道場では正解数が記録されるので、毎日30問ほど解いて８割取れるまでひたすら繰り返しやり、出やすいものや間違えたキーワードについて紙にまとめて、あとでそれを振り返るということをしました。また並行して適当なテキストを一冊買って読んでいました。過去問に出ていない部分を補うためのテキストですが、これは正直どの本もあまり大差がないのでなんでも良いと思います。

午後の学習→IPA（https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html)

過去問道場でも問題解答はありますが、IPAのサイトでも過去問が見放題です。ここで印刷をして本番と同じ紙ベースで解いていました。１１問ある中から選択したのは、１情報セキュリティ（必須）、２経営戦略、４システムアーキテクチャ、６データベース、１１システム監査を選択しました。理由としては、経営戦略は日頃の業務内容が出る可能性があったため、データベースは興味があったのと国語問題だけでなくエンジニア寄りの問題も解いて合格したいと思ったから、システムアーキテクチャとシステム監査は前提知識無しで解けると思ったからです。これら選択する問題について過去４年分ほどをやりました。

**結果は午後試験で不合格でした。**

【不合格になった原因】
1.必須であった情報セキュリティの学習不足
2.過去問と関連の薄いシステムアーキテクチャとシステム監査の問題演習に時間を使いすぎた

改善して次は絶対に合格しようと思い、２０２１年４月も受験しました。

**・２回目受験：２０２１年４月　＜合格　午前７７.５点 / 午後７５点＞**

【勉強方法】
午前の学習→過去問道場（https://www.ap-siken.com/apkakomon.php)

今回は午前にほとんど時間をかけませんでした。前回の記憶が残っており、試験２カ月前に過去問道場で安定して８割を取れていたので午前対策の学習時間は約５時間でした。午後対策は分野ごとの本も読んで６０時間ほどです。

午後の学習→[1.応用情報技術者 午後問題の重点対策](https://www.amazon.co.jp/gp/product/4865752218/)
　　　　　　[2.図解まるわかり セキュリティのしくみ Kindle版](https://www.amazon.co.jp/dp/B07FTN333K/)
　　　　　　[3.スッキリわかるSQL入門 第2版 ドリル222問付き](https://www.amazon.co.jp/gp/product/4295005096/)

これらの本が評判が良かったので購入して午後問題を重点的に理解しようと思いました。
前回は情報セキュリティの理解不足で得点を稼げなかったので、まずは上記１の本でセキュリティの過去問をやって解説を丁寧に読みました。理解できないところは２の本で調べて補完、自分なりに説明できるところまでもっていきました。特に攻撃手法と対策、鍵の仕組みなどは頻出なので絶対に抑えたほうがいいです。データベースについてはSQL問題が必ず出題されるので、１の本を全問解いて３の本で実際にSQLを入力しながら覚えました。

今回の戦略としては、情報セキュリティとデータベースで満点をとり計４０点稼ごうと考えました。そうすれば残り３問の６０点分のうちの２０点（３割強）取れれば合格になるので気楽です。

**結果は合格でした！**

公式解答で午後試験を採点すると、情報セキュリティは１つだけ間違えており他は正解でした。データベースは基礎問題とSQL問題は正解できました。経営戦略は出来が悪かったですが、システムアーキテクチャとシステム監査で無難に乗り切ったという結果です。

####まとめ
・午前は応用情報のテキストを１冊読みつつ過去問を繰り返し解くことが効果的で、１つ１つの内容を完全に理解しなくても大丈夫です。
・午後は必須である情報セキュリティともう１問得意な分野を見つけて集中的に学習したことが良かったと思います。私はデータベースを選択しましたが、国語の問題が得意な方であれば他の分野を選択することをお勧めします。残り３問の選択については、勉強時間がほとんど取られないものを選び、感触を掴むために過去問数年分をやりました。
ArduinoUNOと温度センサーMCP9701で液晶表示 (Arduino)(AQM0802A)


x MCP9701-E/TO 販売コード 103199

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を液晶に表示する。

構成
MCP9701-E/TO I-03199
AQM0802A-RN-GBW P-06669

説明
MCP9701は、
0℃の時、400mV
1℃あたり19.5mV
精度は、±4℃
電線が引き出しやすい位置のA0をアナログ入力にする
計算には、容量削減の為に浮動小数点と割り算は、使わない
MCP9700は、ファミリー、オフセット500mV、10mV/1℃ 今回は、使わない


```c++


#include <Wire.h> //I2C library

//STM32G031J6M6
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

// I2C  address. 
#define I2Cadr  0x3e  // 固定

int     tempval;                //温度
char    data_read[2]={'@','t'}; //i2cバッファー
int     ii;                     //ループカウンター

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

char INIT_cls[]={0x0,0x1};

void i2c_led_w(char *buff1){
  Wire.beginTransmission(I2Cadr);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}//i2c_led_w

void setup()
{  

  //i2cの初期化
  Wire.begin(); // initialise the connection //767 UNO
  //Wire.begin(sdaPin,sclPin); //STM32G031J6M6

  //液晶の初期化
  for(ii=0;ii<11;ii++){
    i2c_led_w(&INIT_com[ii*2]);
  } //for

} //end setup

void loop()
{

  //画面のクリア
  i2c_led_w(INIT_cls);

  //センサーの値を読み込む
  tempval = analogRead(A0); // UNO

  //tempval = 20 << 2; //0  debug
  //tempval = 40 << 2; //20 debug

  //センサーの値を温度に変換
  tempval = (tempval >> 2) - 20;

  //液晶に表示
  data_read[1] = '0' + (tempval / 10);
  i2c_led_w(data_read);
  data_read[1] = '0' + (tempval % 10);
  i2c_led_w(data_read);

  delay(1000); //1秒待つ
}//loop



```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d246a019-5186-3520-c1f8-6e13877ef809.png)
【Javascript】mapメソッドー学習ノート

# 初めに
javascriptのmapメソッドについて学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

# mapメソッド
配列の要素に対し、メソッド内で定義した関数を適用した結果をもとに新たな配列を生成するメソッド。関数を引数にするため、高階関数の一つ。

# 使ってみる
mapメソッドは配列に対して使います。

```javascript
const changes = [100, 400, -300, 120, -50, -330, 1400, 500];
```

配列の要素の値を２倍にした新たな配列は次のように定義することができます。

```javascript
const newChanges = changes.map(function callback(arr) {
  return arr * 2;
});
```
newChangesの中身をコンソールで確認してみるとそれぞれの要素の値の２倍になっていることが分かります。

```javascript
console.log(newChanges);
//(8) [200, 800, -600, 240, -100, -660, 2800, 1000]
```

コールバック関数はアロー関数を使って簡潔に書くことができます。

```javascript
const newChanges = changes.map(arr => arr * 2);
```

for of文を使えば同じような結果を得られます。空の配列newChanges2にpushメソッドで２倍にした配列の要素を格納します。

```javascript
const newChanges2 = [];
for (const change of changes) {
  newChanges2.push(change * 2);
}

console.log(newChanges2);
//(8) [200, 800, -600, 240, -100, -660, 2800, 1000]
```
mapで使われるcall back関数の引数はvalue, index, arrayの順になります。

```javascript
const newChanges3 = changes.map((value, i, arr) => {
  return `${i} : ${value * 2} , ${arr}`;
});

console.log(newChanges3);
//(8) ["0 : 200 , 100,400,-300,120,-50,-330,1400,500", "1 : 800 , 100,400,-300,120,-50,-330,1400,500", "2 : -600 , 100,400,-300,120,-50,-330,1400,500", "3 : 240 , 100,400,-300,120,-50,-330,1400,500", "4 : -100 , 100,400,-300,120,-50,-330,1400,500", "5 : -660 , 100,400,-300,120,-50,-330,1400,500", "6 : 2800 , 100,400,-300,120,-50,-330,1400,500", "7 : 1000 , 100,400,-300,120,-50,-330,1400,500"]
```

# 参考サイト
Docker Desktop for WindowsにIngressをインストール

[NGINX Ingress ControllerのInstallation Guide](https://kubernetes.github.io/ingress-nginx/deploy/
)の「Docker Desktop」セクションにあるコマンドでyamlファイルを指定することによりインストール出来ました。

具体的には以下コマンド

```
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/cloud/deploy.yaml
```
最新バージョンは随時変わるので、毎回NGINX [Ingress ControllerのInstallation Guide](https://kubernetes.github.io/ingress-nginx/deploy/
)を見に行った方がいいと思います。
AWS API Gateway 一人勉強会 ～REST API統合について～

# REST API 統合

- REST API 統合の設定（[REST API 統合の設定](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-integration-settings.html)）

  - API メソッドを設定したら、バックエンドのエンドポイントに統合する必要がある
- API統合
  - **統合リクエスト**
      - API Gateway がバックエンドに送る HTTP リクエスト
  - **統合レスポンス**
      - API Gateway がクライアントに返す HTTP レスポンス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/f176dd2b-c9a2-7dfc-396c-4d43ddf703fc.png)

[AWS サービス別資料 API Gateway](https://d1.awsstatic.com/webinars/jp/pdf/services/20190514_AWS-Blackbelt_APIGateway_rev.pdf) より引用

- API統合タイプの選択
  - バックエンドのエンドポイントは、**統合エンドポイント**とも呼ばれ、Lambda 関数、HTTP ウェブページ、AWS のサービスアクションがある

| 統合エンドポイントのタイプ | 使用可能なAPI統合タイプ                    |
| -------------------------- | ------------------------------------------ |
| Lambda関数                 | Lambdaプロキシ統合<br />Lambdaカスタム統合 |
| HTTPエンドポイント         | HTTPプロキシ統合<br />HTTPカスタム統合     |
| AWSサービスアクション      | 非プロキシタイプの AWS 統合のみ            |


| API統合タイプ                              | typeプロパティの値 |
| ------------------------------------------ | ------------------ |
| Lambdaプロキシ統合                         | AWS_PROXY        |
| Lambda カスタム統合・他のすべての AWS 統合 | AWS              |
| HTTP プロキシ統合                          | HTTP_PROXY       |
| HTTP カスタム統合                          | HTTP             |
| モック統合                                 | MOCK             |



- API統合タイプ（[API ゲートウェイ API 統合タイプの選択](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-integration-types.html)）

| typeプロパティの値（統合タイプ） | 必要な設定やAPI Gateway の処理                                                         |
| -------------------------------- | ------------------------------------------------------------ |
| AWS                            | AWS のサービスアクションを公開<br />統合リクエスト・統合レスポンスを設定<br />メソッドリクエスト→統合リクエスト、統合レスポンス→メソッドレスポンスへのマッピングを設定 |
| AWS_PROXY                      | 統合リクエスト・統合レスポンスの設定は不要<br />API Gateway は、クライアントから受け取ったリクエストを Lambda 関数へ渡す |
| HTTP                           | バックエンドの HTTP エンドポイントを公開<br />統合リクエスト・統合レスポンスを設定<br />メソッドリクエスト→統合リクエスト、統合レスポンス→メソッドレスポンスへのマッピングを設定 |
| HTTP_PROXY                     | 統合リクエスト・統合レスポンスの設定は不要<br />API Gateway は、クライアントから受け取ったリクエストを HTTP エンドポイントに渡し、HTTP エンドポイントから送り出されたレスポンスをクライアントに渡す |
| MOCK                            | API Gateway はリクエストをバックエンドに送信することなく、レスポンスを返す |

# 参考記事

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-integration-settings.html

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-integration-types.html

https://d1.awsstatic.com/webinars/jp/pdf/services/20190514_AWS-Blackbelt_APIGateway_rev.pdf
データクレンジングに活用！！[ pythonコード]

##データクレンジングに活用！！[ pythonコード]
![名称未設定のデザイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/14a865ae-4125-c48b-b1a5-b4854589c166.jpeg)


###概要
pythonでクレンジングを実行したい場合によく使用するコード

###引数コマンドの実行と引数を受ける方法
コマンドで引数を渡してpythonを実行する方法

```shell:shell
$ python3 sys_argv.py abc 10
```

「abc」と「10」を2個引数として渡して実行されたので
受け皿を二つ作って二個とも変数に格納

```python:sys_argv.py
import sys
file1(変数)=sys.argv[1]
file2(変数)=sys.argv[2] 
```

###int型をstr型に変換する方法
型変換が必要な場合に使用するコード

```python:sys_argv.py
str_file2(変数)=str(file2)
```

###.formatメソッド
文字の中に変数を埋め込んで連結させる方法
↓こちらは変数を{}の中に埋め込まれテキストが連結されてfile3(変数)に格納される

```python:sys_argv.py
file3(変数) = "file_{}.txt".format(str_file2(変数))
```

文字の中に変数を埋め込んで連結させる方法
↓こちらは変数を{}の中に埋め込まれテキストが連結されてfile3(変数)に格納される

```python:sys_argv.py
file3(変数) = "file_{}.txt".format(str_file2(変数))
```

.formatメソッドを使用することでPATHを作成することが可能

```python:sys_argv.py
out_path(変数)='./[0]'.format(file3(変数))
```

###jsonの読み込み
JSONファイルを読み込みして変数に格納

```python:sys_argv.py
import pandas as pd
df_a(変数) = pd.read_json(JSONファイル)
df_b(変数) = pd.read_json(JSONファイル)
```


###カラムの可否を確認するif分岐
↓カラムがなければ「= None」を記載してnullの空列を追加することが可能

```python:sys_argv.py
if 'カラム名' not in df_a(変数).columns 
　　　　　　　　df_a(変数)['カラム名'] = None
else:
```

### Pythonでjoin(merge)させる方法
mergeというSQLでいうjoinさせる方法

```python
pandas.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=None)
```
不要カラムを削除するdrop文

```python
.drop(columns='colmun_name')
```


### nullの空白部分の追記
mergeさせた二つのカラム列を一つに集約させる方法
nullの空白部分のみ片方のカラムから追記させるコード

```python:sys_argv.py
df_a.loc=[df_v['カラム名'].isnull() 'カラム名'] = df_a[カラム名2]
```


###トリミング
コードの中で空白が内容ト空白のトリミングをする方法

```python
str.strip()	
```

まとめ
Pythonでやりたい実装があれば検索を変えれば情報は無数に表示される。
なので大事なことは何をやりたいかの基本を大事にすることであり、大枠を考えて小さく考えていけば実装は実現可能となる。


>参考資料: [note.nkmk.me](https://note.nkmk.me/python-pandas-nan-dropna-fillna/)
【AWS】Cognito ユーザプールをAzure ADをIdPとして構築する(前編)

## きっかけ
とある案件で既存のAD FSをIdPとしたCognitoユーザプールを構築する必要が出てきたため、
AD FSの代わりにAzure ADで上記が構築できるか試してみた。
※自分は構築担当ではない

## 前提
- Azure: 無償アカウント利用(新規作成)
- AWS: 社用アカウント利用

## 構築Step
- 前編 
 - 1. AWS Cognito ユーザプール構築
 - 2. AWS AppClient構築、設定
- 後編
 - 3. Azure AD構築、Enterprise Application構築
 - 4. AWS Cognito ユーザプール IdP設定

### 1. AWS Cognito ユーザプール構築
- 1. AWSコンソールからCognitoを選択、以下画面で"ユーザープールを作成する"を押下
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/25b0db9c-5cbe-4742-42fc-f5ed30b31a29.png)
- 2. ユーザプール名を入力、"デフォルトを確認する"を押下
 ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d7c85be5-6091-0cfc-922d-cf475aab81b5.png)
- 3. 属性領域右上の鉛筆ボタンを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/725e1385-4591-a520-99ec-2d6323f9cba9.png)
- 4. サインインの設定を"Eメールアドレスおよび電話番号">"Eメールアドレスを許可"に変更、設定を保存
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/0c3a9f7f-937b-c9f5-13eb-0c5bbb3152a1.png)
- 5. "プールの作成"ボタンを押下、ユーザプールを作成
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/df82ab39-c167-f124-8571-30e5462d7e30.png)
- 6. ユーザプールが正常に作成されたことを確認、プールIDを控えておく
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/bfedfb70-f1db-b786-6ce5-f66961f85013.png)
- 7. 画面左メニューから"ドメイン名"を選択、任意のAmazon Cognito ドメインを設定、保存し、ドメインを控えておく
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d14554d8-cffe-7961-1d99-1e1fabc60879.png)

### 2. AWS AppClient構築、ユーザプール連携
- 1. 画面左メニューから"アプリクライアント"を選択、"アプリクライアントの追加"を押下
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/801c443c-1841-bb78-8b1a-383a013d7049.png)
- 2. 任意の"アプリクライアント名"を入力、"アプリクライアントの作成"ボタンを押下
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/54a70cd9-e14d-7749-783a-fadd0dc82c7e.png)
- 3. 作成完了後、アプリクライアントIDを控えておく
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/3d3c639f-5471-d39f-6496-0177b6935fd8.png)
- 4. 画面左メニューから"アプリクライアントの設定"を選択、以下の設定を修正し、保存
 - コールバックURL: http://localhost:8080 (動作確認用)
 - 許可されているOAuthフロー: Authorization code grant, Implicit grant
 - 許可されているOAuthのスコープ: email, openId, aws.cognito.signin.user.admin
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d5e336fc-6798-018d-41a5-5fa41ca8be23.png)
 
## 後編は以下
【AWS】Cognito ユーザプールをAzure ADをIdPとして構築する(後編)

https://qiita.com/kei1-dev/items/c8ae68e975dccb2902be

## 参考サイト
前後編に渡って以下サイトを参考にさせていただきました。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-ad-fs-saml/

https://medium.com/@zippicoder/setup-aws-cognito-user-pool-with-an-azure-ad-identity-provider-to-perform-single-sign-on-sso-7ff5aa36fc2a
「git push -u origin --all」実行時にrejectedされてしまう

#Ruby on Rails チュートリアルの「1.4 Gitによるバージョン管理」でつまづいた
Bitbucketへの接続は問題ないし、SSHの認証鍵やプロジェクトを再作成しても
「git push -u origin --all」がうまくいかない...。


```terminal:Bitbucketへのリポジトリ追加とリポジトリへのプッシュ
$ git remote add origin git@bitbucket.org:ユーザー名/hello_app.git
$ git push -u origin --all
To bitbucket.org:ユーザー名/hello_app.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@bitbucket.org:ユーザー名hello_app.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```


#結論
「-u」ではなく「-fu」を指定したところ解消

```terminal:-fuへ変更
$ git push -fu origin --all
```
(静的領域とスタック領域とヒープ領域)と(ガーベッジコレクション)について

「オブジェクト指向でなぜ作るのか(第二版)」の第五章を読んだメモ。
Javaの場合について説明する。
TODO: 本の図を貼るなり自分で書くなりする。


## 静的領域

- グローバル変数(クラス情報)とコード情報が確保される。
- プログラムの開始時に保持され、終了まで配置は固定される。

以下Javaの場合、

- クラスは必要になった際に逐次ロードすることから、クラス情報が乗る場所は実行時に決まるので静的領域ではなく、メソッドエリアと呼ばれるヒープ領域の一部に載せる。このメソッドエリアはGCの対象にならない。
- メソッドの一覧を「メソッドテーブル」として持っており、メソッドを呼び出した際には、これを経由して、同じく静的領域内にロードされた目的のメソッドのデータを呼び出している。
- `ChildClass`が`ParentClass`を継承している場合、overrideされていないメソッドに関しては、ChildClassのメソッドテーブルはParentClassとして保持されているメソッドの実体を参照している。

## ヒープ領域

- プログラムの実行時に動的に確保される(ここを使いすぎると、メモリリークが生じる)


以下Javaの場合、

- インスタンスの実体はこの領域にロードされている。
    - インスタンスを指定してメソッドを呼び出す仕組みを実現するため、メソッドエリア内のクラス情報への対応づけもされている。

- `ChildClass`が`ParentClass`を継承している場合、`ChildClass`のインスタンス変数は親のものをコピーし、独自の物として保持している。(メソッドのように、親クラスのものを参照しているわけではない)

## スタック領域

- 一つのスレッドに一つのスタック領域が確保される。
- LIFOで、(実行中のサブルーチンに与えられた引数、ローカル変数、戻り先)を突っ込んでいく。


以下Javaの場合、

- ローカル変数が保持されている。
    - ローカル変数としてオブジェクトを宣言・代入した場合、実際のところ、その変数に入っているのは「ヒープ内のどこにインスタンスのデータがロードされているのかを表すポインタ」。


---


## ガーベッジコレクションの仕組み

以下、(少なくとも)Javaの場合、

- ヒープ内のもう使われていないオブジェクトのデータを消して回る
    - もう使われていない = ヒープからもスタックからも直接あるいは間接的に参照されていない
- ガーベッジコレクション専用のスレッドが立っていてこの中で行われる。


## メモ

確保していく<---- ヒープ | スタック --->確保していく
OSによって、メモリのバッファの最大値は決まっている倍もあるしやりくりできる場合もある。
(再帰の深さによる制限もある)
BigQueryで正規分布の乱数を作成する

現状(2021/06/27)BigQuery内に関数がないのと、ググった感じ誰も書いてなかったようなので。
PythonやRなら関数で一発ですが、それをBQに持ってくるの面倒だし、BigQuery上で実験したいって時に。

# 概要
[ボックス・ミュラー法](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95)を用いて一様分布(RAND関数)から正規分布の乱数を作成する

# クエリ
```{sql}
WITH
generate_random AS (
    SELECT
        index,
        RAND() AS x,
        RAND() AS y,
    FROM (SELECT GENERATE_ARRAY(1, 1000, 1) AS idx)
    ,UNNEST(idx) AS index
)
,
generate_norm AS (
    SELECT
        index,
        SQRT(-2*LOG(x))*COS(2*ACOS(-1)*y) AS norm
    FROM generate_random
)
SELECT 
    *
FROM generate_norm

-- 平均/分散を確認
-- SELECT 
--     AVG(norm),
--     VAR_POP(norm),
--     VAR_SAMP(norm)
-- FROM generate_norm
```
タイトルとURLを同時にコピーするChrome拡張機能

自分が楽したくて、最近作ったChrome拡張機能の紹介です。

こんな方へおすすめ
・業務でJira/Redmine/Backlogなどのチケットを、チャットで連携することが多い
・調べ物をする際に、URLをコピペしておくことがある

# What is 「Clip the title and URL」？

https://chrome.google.com/webstore/detail/clip-the-title-and-url/pjcljckglimdagimmjhldcalnoglacop

![USER-27-06-2021-11-53-08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179992/cfa7f6d6-056e-169d-2954-48f159082c2d.gif)


コピーしたいサイト上でコピーボタンを押して、エディタやチャット上にペーストするだけです。
簡単にタイトルとURLを同時にペーストすることができます。

※コピーボタンは2種類からお好きな方を。
・右クリックメニュー(ContextMenu)
・ブラウザ上部の拡張機能ボタン

 ペーストした時のフォーマットはこんな感じです。
>▼h1タイトル
https://domain.xxxx/testtestetst

Jiraチケットの場合はこんなイメージ

> ▼[TEST-1] IE11でコメント欄表示が崩れる - Jira
> https://ay123x.atlassian.net/browse/TEST-1



# Souce
利用している権限はContextメニューのみ。

```json:manifest.json
{
    "manifest_version": 2,
    "name": "Clip the title and url",
    "version": "1.0.2",
    "description": "URLとタイトルをクリップボードにコピーするChrome拡張機能",
    "icons": {
      "16": "image/icon16.png",
      "48": "image/icon48.png",
      "128": "image/icon128.png"
    },
    "background" : {
        "scripts" : ["js/background.js"]
    },
    "permissions": [
        "contextMenus"
    ]
  }
```

```javascript:background.js
{
  chrome.contextMenus.create({
    "type"  : 'normal',
    "title" : 'このサイトのURLとタイトルをコピー',
    "contexts" : ['all'],
    "onclick" : copy()
  });

  /**
   *
   * @param Object info 
   * @param Object tab 
   * @returns
   */
  function copy(info, tab) {
    return function(info, tab) {
      let url = tab.url;
      let title = tab.title;
      let str = `▼${title}\n${url}`;
      copyToclipboard(str);
    }
  }

  /**
   *
   * @param string str
   */
  function copyToclipboard(str) {
    let textArea = document.createElement('textarea');
    document.body.appendChild(textArea);
    textArea.value = str;
    textArea.select();
    document.execCommand('copy');
  }
}

```

## Souce補足
chrome.contextMenus.createを呼び出し、onclickでcopyメソッドが呼ばれるようにしています。

```javascript
  chrome.contextMenus.create({
    "type"  : 'normal',
    "title" : 'このサイトのURLとタイトルをコピー',
    "contexts" : ['all'],
    "onclick" : copy()
  });
```

Onclickから引数で[OnClickData](https://developer.chrome.com/docs/extensions/reference/contextMenus/#type-OnClickData
)と、[タブの情報](https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab)を受け取ることができます。


今回はタブ情報から、タブのURLとタブのタイトルを取得し、フォーマット整形しています。

```javascript
  function copy(info, tab) {
    return function(info, tab) {
      let url = tab.url;
      let title = tab.title;
      let str = `▼${title}\n${url}`;
      copyToclipboard(str);
    }
  }
```


そして最後に、
copyToclipboardメソッドで仮想的にテキストエリアを生成し、整形したデータをテキストエリアのvalueとして代入。選択した状態でコピーを実行しています。

```javascript
  function copyToclipboard(str) {
    let textArea = document.createElement('textarea');
    document.body.appendChild(textArea);
    textArea.value = str;
    textArea.select();
    document.execCommand('copy');
  }
```


# 今後について
今後考えている拡張として、
コピーするときにサイト名などが入ってしまうことが多いので、
ホスト名を指定して特定の文字列を除く設定をできるオプションページなどを考えています。

気になる点や、要望などありましたら、コメントください。
使ってくれる人が増えたら嬉しいです。
いまさら聞けないprocess.envの基本

# はじめに
Node.jsでパスワードや環境変数などを扱うとき、`process.env`を使いますよね。
`process.env`についてきちんと理解していなかったので整理しました。

# 環境変数とは
お使いのPCがMac/Linuxの場合、下記bashコマンドでPCの環境変数が見れます。

```bash
$ ENV
```

上記結果と、下記結果は同じものになります。

```index.js
console.log(process.env)
```
```
$ node index.js
```

# process.envの使い方
`dotenv`をインストールしたあと、`.env`ファイルを作ってその中に独自の環境変数を宣言することができます。

```bash
$ yarn add -D dotenv
```
```..env
TEST_VARIABLE=hello!!!
```
```index.js
require('dotenv').config();
console.log(process.env.TEST_VARIABLE)
```
```bash
$ node index.js
hello!!!
```

# 環境変数の上書き
先ほどの`.env`の中で宣言した環境変数は、下記のように上書きすることができます。

```bash
$ TEST_VARIABLE=bye!!! node index.js
bye!!!
```

```bash
$ export TEST_VARIABLE=byebye!!!
$ node index.js
byebye!!!
```

# クライアントサイドでの環境変数
今回説明したのは、当然ながらサーバーサイド、つまり特定された環境下における環境変数の設定方法です。
なので、このやり方ではReactやVueなど、他人のデバイス上でコードが動いているクライアントサイドSPAでの環境変数を設定することはできません。
クライアントサイドで環境変数を指定する方法はもちろん存在しますが、APIのクレデンシャルなど秘匿情報は扱うべきではありません。コードを解析すれば分かってしまうからです。
クレデンシャルを扱うにしても、漏れても良いように権限を絞っておくべきです。
基本的には環境変数はサーバーサイドで扱うことを覚えておきましょう。
例外処理を使ったプログラム実験です

例外処理を使ったプログラム実験です


```Java
//例外処理を使ったプログラム実験
// Author 2021/06/27  乃木坂好きのITエンジニア

public class Moshi17A {
	public static void main(String[] args) {
		String[] ary = new String[3];
		for(int i=0;i<ary.length;i++) {
			try {
				System.out.println(ary[i].concat("Java "));
			} catch(NullPointerException e) {
				System.out.println("データに問題があります");
			} finally {
				System.out.println("続きます");
			}
		}
	}
}
```
Gradleでjavaをビルドする際、ユニットテストをスキップする方法

# 経緯
実装途中でも、検証環境で一部機能を確認したいことがあったので、
ビルド時に実行されるユニットテストをスキップしてビルドを実行しました。

# 対応内容
普段実行しているgradle buildに「-x test」を付加してビルドを実行します。

```
gradle build -x test
```

# 参考文献

http://gradle.monochromeroad.com/docs/userguide/userguide_single.html
【応用情報】シンプルな勉強法

# はじめに
先日(2021/6/25)、応用情報処理技術者試験の合格発表があり、無事合格しておりましたので私が行った勉強法を残そうと思います。
私の応用情報受験歴は新型コロナの影響で１度中止になり、もう一回は申し込みはしていたのですが受験会場に行かなかったので、（一応？）一発合格でした。

今回ご紹介する内容は、あくまで資格取得を最優先に考え、合格に不要と思われる部分を削りました。（ほんとうに身になる勉強は資格を取得してからでもできると考えたため）

受験者のバックグラウンドによって受験準備に必要な勉強時間や補助教材に違いがあるのは当然なので、参考までに私のバックグラウンドを紹介いたします。
>筆者のバックグラウンド
>・大学では非情報系専攻からITについてほとんどわからない状態のまま2年前に新卒でSIerにSEとして就職し、現在はSE歴3年目
>・関連資格としてITパスポートと基本情報処理技術者試験は取得済み



# 使用した教材
使用した教材は３つです。
過去問道場は無料、参考書は２冊で7000円ちょっとです。（痛い出費ですが合格すれば十分に元はとれる資格だと思います。）
1. [過去問道場](https://www.ap-siken.com/apkakomon.php)
　超定番、午前対策に使用　午前問題は過去問道場をやりこむだけで完結します。
2. 応用情報技術者 午後問題の重点対策 (重点対策シリーズ)  ：[Amazonへのリンク](https://www.amazon.co.jp/2021-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E5%8F%A3%E9%81%94%E5%A4%AB/dp/4865752218/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1&qid=1624759887&sr=8-7)
　午後対策に使用　解説が丁寧でいい感じです。
3. キタミ式イラストIT塾 応用情報技術者：[Amazonへのリンク](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C03%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297117835/ref=sr_1_2_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F&qid=1624759996&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExOUxLUFJLVjdHVkYwJmVuY3J5cHRlZElkPUEwOTA5NzcwTjJMUlQyNlgwQ0dFJmVuY3J5cHRlZEFkSWQ9QThEUzZBN0JEMTRVOCZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)
　補助教材として使用　用語の意味などが分からないときに辞書的に使用します。

# 勉強法
###午前対策
午前問題は過去問と全く同じ問題が多数出題されるので、いかに過去問をこなし見たことがある問題を増やすかがキーになります。
まったく同じ問題が出題されれば、最悪意味は分からなくても答えの選択肢さえ覚えていれば得点できます。

過去問道場をスキマ時間などを利用してたくさん数をこなしましょう。
どのくらいやりこめばいいかについてですが、私は下記の画像のとおりで、本番は８割程度の得点でした。
私は基本情報の時はもっとやりこんでいて本番では９割程度得点できたのですが午後試験が本番なので午前対策はほどほどにして午後試験対策に時間を割きましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539054/b000a042-5ef0-4444-2b95-c02bf5ba9579.png)


### 午後対策
午後対策は選択式になるのですが、私は本番で選択する分野を絞り、それ以外の分野については午後試験の勉強は全くしませんでした。
対策した分野は以下の表のとおりです。

|  大問  |  分野  |  優先度  |
| ---- | ---- | ---- |-|
|  1  |  情報セキュリティ  |必須|
|  2  |  経営戦略  |-|
|  4  |  システムアーキテクチャ  |-|
|  7  |  組み込みシステム  |高|
|  9  |  プロジェクトマネジメント  |高|
|  10  |  サービスマネジメント  |-|
本番の試験では１の情報セキュリティについては必須選択になっており、大問２～１１のうち４問を選択することになります。
優先度が「高」となっている「組み込みシステム」と「プロジェクトマネジメント」は得点しやすいので基本的に選択することになり、のこり「経営戦略」「システムアーキテクチャ」「サービスマネジメント」から２問を選択することが基本戦略になります。

よって、「2. 応用情報技術者 午後問題の重点対策 (重点対策シリーズ)」の問題集で上記の６分野だけ対策を行いました。
私が使用した2020年度版の問題集では、上記分野に絞れば問題数が３３問でした。
その３３問について２～３回繰り返しといて、ほかの問題には一切手を出しませんでした。

# おわりに
本当は試験前に本番の試験時間に合わせて自分で模擬試験を実施することで時間配分の感覚をつかんでおくのがよいのですが、私は実施することができませんでした。
案の定本番で時間配分で焦ることになるのですが、、、
試験時間の感覚をつかむための模擬試験はやってみることをおすすめします。

午前問題を数百問、午後問題は３０問ちょっと勉強すれば合格に届く可能性があると思うとちょっとやる気がわいてこないでしょうか？

この記事がお役に立てることがありましたら、幸いです。
ニュートン法の導出

# この記事について
非線形最小二乗法の数値解法であるニュートン法とその改良型のLM法までを解説していきます．

# ニュートン法の導出 
$x\in \mathbb{R}^n$を引数とする$F(x):x\rightarrow F(x)\in \mathbb{R}^m$という関数を考えます．ちなみに、$x$と$F(x)$の元（要素）を$x_i|i= \\{1,\dots,n\\} $と$f_i(x)|i=\\{1,\dots,m\\}$とすると以下のような列ベクトルとして表せます．

```math
\begin{eqnarray}
x &=&
\begin{bmatrix}
x_1 \\
\vdots \\
x_n
\end{bmatrix} \\
F(x) &=&
\begin{bmatrix}
f_1(x) \\
\vdots \\
f_m(x)
\end{bmatrix} \\
\end{eqnarray}
```

最小二乗法では以下のように定義される残差平方和$S(x)$を最小とするな$x$を求めます．

```math
S(x)=\frac{1}{2}||F(x)||^2
```

$S(x)$をある$x_k$周りにテイラー展開します．すると、以下が成り立ちます．

```math
S(x_{k+1}) = S(x_k)+ \nabla S(x_k) (x_{k+1}-x_k)+\frac{1}{2}(x_{k+1}-x_k)^T\Delta S(x_k)(x_{k+1}-x_k)+\cdots
```

$S(x)\rightarrow \min$となる時、$\nabla S(x_{k+1})=0$が成り立ちます．テイラー展開した式を$x_{k+1}$で偏微分することで以下の式が求まります．

```math
\nabla ^T S(x_k)+\frac{1}{2}(\Delta S(x_k) ^T+\Delta S(x_k))(x_{k+1}-x_k)+\cdots = 0
```

上の式の導出にあたって$\nabla (xAx)=2(A+A^T)x$を使いました．更に、$\nabla S(x_{k+1})$は対称行列であることから以下のように式は簡略化されます．

```math
\nabla ^T S(x_k)+\Delta S(x_k)(x_{k+1}-x_k)+\cdots = 0
```

さらに、3項以降を無視して

```math
\nabla ^T S(x_k)+\Delta S(x_k)(x_{k+1}-x_k) \approx 0
```

これを$x_{k+1}$について解くと

```math
x_{k+1} \approx x_k - (\Delta S(x_k))^{-1} \nabla ^T S(x_k)
```

# ガウス・ニュートン法の導出

このままでも使える式なのですが、$S(x_k)$があるとフロベニウス和を計算しなればなりません．面倒なので$S(x)$を使わない形にできないかを考えていきます．手始めに、$\nabla S(x)$を簡略化することを考えます．

```math
\begin{eqnarray}
\nabla ^T S(x) &=& \nabla ^T (\frac{1}{2}\sum _{i=1}^m f_i(x)^2) \\
&=& 
\begin{bmatrix}
\frac{\partial S(x)}{\partial x_1} & \cdots & \frac{\partial S(x)}{\partial x_n}
\end{bmatrix}
\end{eqnarray}
```

$\nabla ^T S(x)$の第$j$列成分$\frac{\partial S(x)}{\partial x_j}$は以下の式で表すことができます．

```math
\frac{\partial S(x)}{\partial x_j} = \sum _{i=1}^n \frac{\partial f_i(x)}{\partial x_j} f_i(x)

```

このことより、$F(x)$の定義と$\nabla F(x)$の定義を考慮すると

```math
\nabla ^T S(x)= \nabla F(x)F(x)=F(x)^T J_{F(x)}
```

となります．ここに$J_{F(x)}$は$F(x)$のヤコビアンです．

次に$\Delta S(x)$を簡略化します．$\Delta S(x)$の$j$行$l$列の成分を$\Delta S(x)_(j,k)$とすると

```math
\begin{eqnarray}
\Delta S(x)_{(j,l)} &=& \frac{\partial}{\partial x_l}(\frac{\partial S(x)}{\partial x_j} ) \\
&=& \frac{\partial}{\partial x_l}(\sum _{i=1}^n \frac{\partial f_i(x)}{\partial x_j} f_i(x)) \\
&=& \sum _{i=1}^n (\frac{\partial f_i(x)}{\partial x_j} \frac{\partial f_i(x)}{\partial x_l} +  \frac{\partial  ^2f_i(x)}{\partial x_j \partial x_l}f_i(x)) 
\end{eqnarray}
```

$S(x)\rightarrow \min$の時、$F(x)\rightarrow 0$なので、$f_i\rightarrow 0$が成り立つ．したがって、


```math
\Delta S(x)_{(j,l)} \approx \sum _{i=1}^n \frac{\partial f_i(x)}{\partial x_j} \frac{\partial f_i(x)}{\partial x_l} 
```

行列の形式に直すと、

```math
\Delta S(x) \approx J_{F(x)}^TJ_{F(x)} 
```

さて、得られた近似式を

```math
x_{k+1} \approx x_k - (J_{F(x)}^T J_{F(x)})^{-1} J_{F(x)}^T F(x)
```

さらに$J^+ _{F(x)}$を$J_{F(x)}$のMP逆行列（疑似逆行列）とすると

```math
x_{k+1} \approx x_k - J_{F(x)}^+ F(x)
```

ちなみに、$n=m$のときに限り、$J^+ _{F(x)}=J^{-1} _{F(x)}$となります．この時、この解法はニュートン・ラフソン法と呼ばれます．ニュートン・ラフソン法の式は以下で定義されます．


```math
x_{k+1} \approx x_k - J_{F(x)}^{-1} F(x)
```
ダイエット＋食品管理アプリ構築の道程（７）

記事を書きながら進めて行きます。
やはりなぜこう書くのかコーディングするのか分からなまま書いていてもどこかで綻びが出るかまた、自分の実現したいものができないまま諦めてしまうかのどちらかなので、じっくりと腰を据えてネットで細かく検索しながら粘り強くすすめていきました。

##実現したいことは

１．検索機能持ついたフォーム
２．そのフォームから登録編集ができる機能を実装
３．FormObjectで作ること。
→理由：複数テーブルへの保存。詳細「食材ページ（食材の確買ってきてある量と使用料の管理）調理して作る料理の登録ページの２つの内容をそれぞれのテーブルに保存しないといけないため）」


イメージ図
![20210627-115254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/d41ca275-9e64-7bd7-2ee4-89f6e5d172b8.png)

またテーブルの関係性でいくと「多対多」なので中間テーブルが必要。

![20210627-121144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/7affbcc4-61b3-2937-db8a-296c43ee1c60.png)

テーブルの確認も終了。
ここからまず食材と料理のモデル、コントローラー、ビューを作って登録編集まで持っていきます。
CodeBuildでビルドする際、jarファイル内にElastic Beanstalk構成ファイル ( .ebextensions ) を差し込む

# 目的
CodeBuildでjarを作成する工程で、Beanstalk構成ファイルである「.ebextensions」ディレクトリをjarの中に差し込みたい。

# 経緯
プロジェクトでBeanstalkを使用しており、WEBアプリを動作させるために.ebextensionsをjarを差し込む必要がありました。

これまでは7zip等で別途差し込んでいましたが、CodeBuild内で完結出来るようなので試してみました。

# 修正ポイント
CodeBuildの設定ファイルである「buildspec.yml」を修正します。

今回は、jarファイル作成後にコマンドを実行したいので、buildspec.ymlの「phases/post_build/commands」を修正します。

jarファイルを更新するにはjarコマンドのuオプションを指定して差し込みます。

※.ebextensionsはプロジェクト直下にプッシュしておけばそのまま指定できます。

結果は以下の通り

```
phases:
  build:
    commands:
      # 任意の設定
 
  post_build:
    commands:
      - jar -uf sample.jar .ebextensions
      # ↑の1行を追加する
　　　　　　　　　　　　# ※jarファイル名は適時変更すること

artifacts:
  files:
      # 任意の設定

```

# 参考文献

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html

https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/jar.html#BGBFFFGG