OmniAICreator/Qiita-1.07M huggingface dataset:
Mathematics, ボッシュ自動車handbook 11版(13)p.204

Mathematics, ボッシュ自動車handbook 11版(13)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2

残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>

# ボッシュ自動車ハンドブック version 11, 2022
Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

# Mathematics
p.204
## Numbers 
### Quantities 
### Number system 
Table 1 Decimal system 
Table 2 Decimal and hexadecimal system 
### Polynomial 
Table 3 Polynomial 
Figure 1 Straight line (dashed) and parabola as polynomials of thd first and second degree 
### Root function 
Table 4 Root function 
Figure 2 Curve of the root function 
### Absolute values and sign function

# Reference
[1] T.Arens et al Mathematik, 3rd Ed., Verlag Springdr Spektrum, 2015

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9

ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9


自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221016

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
TypeScriptでのenumの定義を整理する

## TypeScriptでenumを使いたいんじゃ
先日「TypeScriptでenumを定義したい！」ということがあり、その時に調べたことを整理しながらアウトプットしたいと思います。

とりあえず、enumは下記のように定義することができます。
```ts
enum Position {
  Top,
  Right,
  Bottom,
  Left,
}
```
ですが、調べてみるとどうやらこの記述には問題点があるそうです。
その問題点と解決方法を、[こちら](https://typescriptbook.jp/reference/values-types-variables/enum/enum-problems-and-alternatives-to-enums)をもとに整理したいと思います。（いつも参考にさせてもらってます。ありがとうございます。ビッグラヴ）

## 問題点
### 1. 数値列挙型には型安全上の問題がある
数値列挙型とは、下記のように数値をenumで定義することです。
```ts
enum ZeroOrOne {
  Zero = 0,
  One = 1,
}
```
この数値列挙型、実はnumber型ならなんでも代入できてしまうという問題があるのです。
なので、上記のように0か1のみのenumを定義したつもりでも、それ以外の数値が代入できちゃいます。困ったもんだ。

そして、enumは下記のようにオブジェクト型でアクセスすると値が取得できます。
```ts
console.log(ZeroOrOne[0])
// => 'Zero'
```
これの何が問題なのかというと、存在しない値でアクセスしてもエラーが起きないことです。
```ts
console.log(ZeroOrOne[9])
// => undefined
```
…😫😫

### 2. 文字列列挙型だけ公称型になる
型システムには**公称型**と**構造的部分型**の二種類があり、TypeScriptは後者の構造的部分型を採用しています。
この２つの違いは[こちらの記事](https://qiita.com/suin/items/52cf80021361168f6b0e)を参考にさせていただきました。（これもsuinさんの記事）

**公称型**：２つのオブジェクトが全く同じプロパティを持っていても、継承関係が無ければ代入できない。（Java, C++など）
**構造的部分型**：２つのオブジェクトが全く同じプロパティを持っている場合、そのオブジェクトに代入できる。（Go, TypeScriptなど）

先程も書いたようにTypeScriptは構造的部分型を採用しているのですが、文字列列挙型（文字列を定義したenum）は例外的に公称型となるそうです。
ちなみに数値列挙型は公称型にはなりません。なぜなんだろうか…🤔
このようにばらつきが出てしまうのも問題とされています。

### 3. 呼びされない不要なコードがコンパイルされる
TypeScriptで定義されたenumは、即時関数としてコンパイルされます。
即時関数でコンパイルされると、Tree-shakingというwebpackなどでバンドルする際に実行されないコードを削除してくれる機能がうまく動作しないという問題があるそうです。

## 解決方法

### 1. union型を使う
union型とは、「いずれかの型」を表すものです。
この場合、Hoge型にはstring型かnumber型かundefined型が入ります。
```ts
type Hoge = string | number | undefined
```

enumとして使用する場合は下記のようになります。
```tsx
type FrameWork = 'React' | 'Vue' | 'Angular'

type Props = {
  name: FrameWork
}

const Frontend = ({name}: Props) => {
  return (
    <p>{name}</p>
  )
}

// 呼び出し
<Frontend name={'React'} />
```
こうすることで、`name`にはFrameWork型で定義されている3つの値しか指定できなくなります。

### 2. オブジェクトリテラルを使う
オブジェクトで型の値を定義します。
そのオブジェクトのプロパティを`as const`を使ってReadOnlyにし、さらに`keyof typeof`を使って型として定義します。
`keyof typeof`については[こちらの記事](https://qiita.com/tak001/items/bec3ab7c1bb4df52a7e7)が分かりやすかったです🙌
```tsx
const FrameWork = {
  React: 'React',
  Vue: 'Vue',
  Angular: 'Angular'
} as const

type FrameWork = typeof FrameWork[keyof typeof FrameWork]

type Props = {
  name: FrameWork
}

const Frontend = ({name}: Props) => {
  return (
    <p>{name}</p>
  )
}

// 呼び出し
<Frontend name={FrameWork.React} />
```

## まとめ
enumは特に理由が無い場合使わない方が良さそうです。
他にもこんな方法があるよ〜などありましたら教えて下さい😌
Railsバージョンの問題解決

こんにちは！！

今回は**Rails6**のバージョンで開発を進めたいのに
**Rails7**のバージョンでしか開発ができない人に向けての記事になります！！！

**①ターミナルに以下のコードを入力**

```ruby:ターミナル
gem install -v 6.1.5 rails
```

**②バージョン６が入っているか確認**
```ruby:ターミナル
rails -v
```

以下のように表示されれば良き！！
＊rails 6～のようになっていればなんでもいいよ！！
```ruby:ターミナル
Rails 6.1.7
```

**③アプリの作成**
```ruby:ターミナル
rails _6.1.5_ new app_name
```

以上になります！
開発頑張っていきましょう！！
Firebase CLI と GOOGLE_APPLICATION_CREDENTIALS


[Firebase / quickstart-js の試し方 - Qiita](https://qiita.com/propella/items/2712577df57c1616e179) で `firebase login:ci` を使うと deprecated 警告が出たので、代わりに使える `GOOGLE_APPLICATION_CREDENTIALS` についてメモする。

`GOOGLE_APPLICATION_CREDENTIALS` というのは Firebase Function を使ってサーバー側で Firebase を操作する Firebase Admin SDK で使う認可方法だ。まず

Firebase コンソールの歯車アイコン > プロジェクトの設定 > サービスアカウント > 新しい秘密鍵の生成

で秘密鍵をダウンロードする。このファイルを /path/to/service-account-file.json のような場所に置いて

    export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-file.json

とすると `firebase login` なしで Firebase CLI 各種コマンドを使える。`firebase login:ci` と違って警告も出ないし CI に使える。

## 参考

* [Add the Firebase Admin SDK to your server](https://firebase.google.com/docs/admin/setup)
JavaScriptのセレクトフォームでの取得する際に気を付けること

セレクトボタンに躓く。
HTMLでセレクトフォームをつくり、その値を取得しようと思ったが、できなかったので共有したいと思う。
キーポイントは関数の内側か外側か、だ。

〇
~~~javaScript
//成功例
var select_button = document.getElementById("format-select");
select_button.addEventListener('change', function(){
  var selectedValue = document.getElementById("format-select").value;
//value取得を関数内に
  var target = document.getElementById("target");
  text= ""
  if (selectedValue == 1){
    text = "1";
  } else if (selectedValue == 2){
    text = "2";
  } else {
    text = "3";
  }
  target.innerHTML = text;
});
-----
> 2
~~~

✖
~~~Javascript
//失敗例
var select_button = document.getElementById("format-select");
var selectedValue = document.getElementById("format-select").value;
//value取得を関数外に
select_button.addEventListener('change', function(){
  var target = document.getElementById("target");
  text= ""
  if (selectedValue == 1){
    text = "1";
  } else if (selectedValue == 2){
    text = "2";
  } else {
    text = "3";
  }
  target.innerHTML = text;
});
-----
> 1
~~~
セレクトボックスのバリューを取得し、その値をテキストとして出力したかった。
HTMLに選択すると、
しかし、下のコードの、関数の外に値を取得しようとすると、pタグに表示されるのが行いたい数字ではない。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="XWqVeBW" data-user="tukaskas7777" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tukaskas7777/pen/XWqVeBW">
  Untitled</a> by nishiura tsukasa (<a href="https://codepen.io/tukaskas7777">@tukaskas7777</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

解決策としては関数内にvar変数を入れてしまうことだ。
この理由はなにかよくわからないから教えてもらったりしたい。
勉強中でご勘弁を。
レンダリングエンジンについて気になった

# 0.はじめに
この前Flutterを学習していたら、たまたまレンダリングの知識に出会った。「そういえばとある仕事でレンダリングにだいぶ悩まされたな〜、しかも結局あやふやなまま終わった...」と思い、それではいけないと改めてレンダリングの知識について調べてみた。

# 1.0 そもそもレンダリングとは
レンダリングとはWebページを表示するための工程の１種で、「***HTMLやCSSなどのプログラム上のコードを解析し、人間の目に見える形で画像などを表示すること***」である
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783573/ef8381cb-7bf6-6cba-28c1-ef294d8dea4c.png)

# 2.0 レンダリング処理は大きく4つの処理に分かれている
調べてみると、レンダリングには大きく4つの処理が動いているみたい。それがこちら
1 Loading
2 Scripting
3 Rendering
4 Painting

# 2.1 Loading
このLoadingは主にdownloadとparsingの処理に分かれていて、downloadでは「HTMLなどのファイルを読み込みこむ処理」がおこなわれ、parsingでは「HTMLをDOMツリーに、CSSをCSSOMツリーに変換する処理」がおこなわれる。

※実はここがscriptタグをbody最下部に書くようにいわれる所以で、HTMLをパースしている際にscriptタグを見つけたら、それを優先して読み込もうとする。そうなると、ページを表示するのが遅くなる。だからscriptタグは最後に書こうねというお話です

# 2.2 Scripting
これはJavascriptのコードをJavascriptエンジンに引き渡して実行させる処理

# 2.3 Rendering
ここではDOMツリーに対して、どのようなCSSプロパティが当たるのかを計算し、レイアウト情報の計算をおこなう。

# 2.4 Painting
実際に、描画がおこなわれる処理

これでレンダリング完成

# 3.0 実際にみてみよう
適当なWebページを開き、F12キーで開発者ツールをひらく。そしてその中の「Performance」をひらき、shift+⌘Eを押す。
すると以下の画像のようなものやその他たくさんのものが表示されている。
![スクリーンショット 2022-09-23 9.54.42（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783573/7ee5bac2-95bd-14a1-d36e-c1b5fd414057.png)

# 4.0 レンダリングエンジンについて（おまけ）
最後にレンダリングエンジンについてみていく。レンダリングエンジンとは、***レンダリングをおこなうソフトフェア***のこと
ブラウザによってレンダリングエンジンの種類が異なる。（例えばGoogle ChromeだとBlink、Safariだとwebkit)
レンダリングエンジンによって、処理速度や見え方が違うみたい。（細かな違いはわからないが...）

# 5.0 最後に
ここまでレンダリングエンジンについてみてきたが、かなり興味深いものだった。
Webアプリを開発していて、iphoneとandroidで画像などの見え方が全く異なっていた理由がわかった気がした。調べてよかった。また色々と投稿していきます！
悲観的リターンレシオ(PRR)をOnTester結果として出力する

# 悲観的リターンレシオ(PRR)とは
　バックテストの取引回数が少ないほど統計的なデータの信頼性は下がってしまいます。

　例えばプロフィットファクター(PF)でいえば、取引回数が少ないときほどその値は大きく見積もってあげないといけないわけです。

　じゃあ具体的にどれだけ大きく見積もる必要があるのかを数学的な根拠をもって考慮したEAの評価指標が「悲観的リターンレシオPRR」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/f962b7b9-833a-a91e-6827-f2f51d9600d5.png)

　そもそも、ランダムなトレードのプロフィットファクター(PF)の偶然起こりうる振れ幅をどうやって導いているのかの解説はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/a4ff8d32-83dc-c0cb-344d-810b53e2ae2c.png)

# 悲観的リターンレシオ(PRR)のソースコード
__手持ちのEAにコピペするだけ！__

```.cpp
#include <Math\Stat\Math.mqh>

//+------------------------------------------------------------------+
//| OnTester                                                         |
//+------------------------------------------------------------------+
input group    "●--カスタム指標--●"
input bool Carry = true; // 最適化するときに計算結果に100をかける
//+------------------------------------------------------------------+
//|  悲観的リターンレシオ(PRR)
//+------------------------------------------------------------------+
double OnTester()
{
  const int dig = 2;   // ←悲観的リターンレシオを小数点以下何桁まで表示するか
  double n, PF, PRR;

//--- プロフィットファクターと取引回数
  PF = TesterStatistics(STAT_PROFIT_FACTOR);
  n  = TesterStatistics(STAT_TRADES);

//--- 悲観的リターンレシオの計算
  PRR = PF / ((n + 1.96 * sqrt(n)) / (n - 1.96 * sqrt(n)));

//--- 桁数の設定
  PRR = MathRound(PRR, dig);
  
//--- 最適化のときにのみ結果に100をかける(MT5のバグ対策)
  if(Carry == true && MQLInfoInteger(MQL_OPTIMIZATION))
    PRR *= 100;

  return PRR;
}

```
※最適化のときにのみ結果に100をかけている理由はMT5の最適化結果のOnTester結果の数値の表示で小数点以下が見えないバグがあるために、100をかけて無理やり小数点以下2桁を見ています。

悲観的リターンレシオ(PRR)についてツイートしたのがこれです。
https://twitter.com/FX180507/status/1572156118226255872?s=20&t=KIEqK_hNa7h8Hdkg8c9WXA

# ラルフ・ビンスの悲観的リターンレシオ(PRR)

　ラルフ・ビンス(著)「投資家のためのマネーマネジメント」(パンローリング)の中で紹介されている悲観的リターンレシオの計算式です。考え方は同じでこちらの式は上の悲観的リターンレシオより少し楽観的な数値が出ます。どちらがいいかはお好みで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/4f1ca4dc-94f8-5ed1-d94c-2b9a4ce76394.png)

```.cpp
#include <Math\Stat\Math.mqh>
//+------------------------------------------------------------------+
//| OnTester                                                         |
//+------------------------------------------------------------------+
input group    "●--カスタム指標--●"
input bool Carry = true; // 最適化するときに計算結果に100をかける
//+------------------------------------------------------------------+
//|  悲観的リターンレシオ(PRR)
//+------------------------------------------------------------------+
double OnTester()
{
  const int dig = 2;   // ←悲観的リターンレシオを小数点以下何桁まで表示するか

  double PT = 0, LT = 0, PRR = 0;

//--- 勝トレード数と負トレード数
  PT = TesterStatistics(STAT_PROFIT_TRADES);
  LT = TesterStatistics(STAT_LOSS_TRADES);

//--- 悲観的リターンレシオの計算
  PT = (PT - sqrt(PT)) * (TesterStatistics(STAT_GROSS_PROFIT) / PT);
  LT = (LT + sqrt(LT)) * (-TesterStatistics(STAT_GROSS_LOSS) / LT);
  PRR = PT / LT;

//--- 桁数の設定
  PRR = MathRound(PRR, dig);

//--- 最適化のときにのみ結果に100をかける(MT5のバグ対策)
  if(Carry == true && MQLInfoInteger(MQL_OPTIMIZATION))
    PRR *= 100;

  return PRR;
}
```
【Git】複数プロジェクトのコードを一つのリポジトリで管理することになった話

# はじめに
現在開発しているプロダクトでは、プロジェクト毎にスクラッチでプロダクトを開発しています。
作り始めは数が少なかったので**リポジトリの1ブランチ**ですべてのプロジェクトのコードを管理していました。
しかし、プロジェクトの数が増えるごとに煩雑化してきたためうまく分割できないか？と考え始めたのが始まりです。

## 前提
今回決定した構成はおそらく100点の回答じゃないだろうなと自分でも感じています。
ただ、ほかの会社でも似たような現象があるんじゃないか？と思って記事にしてみました。
いろいろ意見をもらえると嬉しいです。

## 私について
Gitにちょっとだけ詳しいPythonエンジニアです。
SIerで言ってた派遣先でリリース担当になった際にGitを猛勉強して以来、転職先では自分が一番Gitに詳しいという理由でリポジトリの管理者をよくやっています。
よりよいリポジトリの構成については勉強中なので、この記事で行った施策に疑問を抱いている節があります。

# 困っていたこと
大きく以下の3つの点で困っていました。
- プロジェクトごとに異なるバージョンの自社ライブラリを使いたい
- mainブランチの肥大化
- 各プロジェクトのリリースが煩雑

## 異なるバージョンのライブラリを使いたい
Pipfileでライブラリのバージョンを管理しているのですが、rootディレクトリにあるPipfileをプロジェクトを変えるたびに変更する必要がありました。
プロジェクトごとに管理をしたかったが、現状のリポジトリ構成ではできないのが問題となっていました。

## mainブランチの肥大化
プロジェクトが増えれば増えるほどmainブランチが肥大化し、ソースコードを管理し辛くなっていました。

## リリースが煩雑
リリースのたびにプロジェクトに必要なファイルを精査する必要があり手順が煩雑になっていた

# 解決策
これらを解決するために以下の2つの手段を考えました。
- プロジェクトごとのリポジトリを作成する
- リポジトリごとのブランチを作成する

## リポジトリを作成する
### メリット
- ほかのプロジェクトと完全に切り離せる

### デメリット
- 別プロジェクトとの切り替えが行いにくい
- 全プロジェクトにかかる変更があったときに反映させにくい
- 似たようなリポジトリを大量に作成することになる

## ブランチを作成する
### メリット
- 別プロジェクトとの切り替えが容易
- 全プロジェクトにかかる変更を反映させやすい(リポジトリ分割と比較した場合)

### デメリット
- ブランチを大量生成することになる

# どの解決策を選んだか
どちらを選んでもブランチorリポジトリが大量に増えてしまうデメリットはなくせませんでした。
業務の都合上複数プロジェクトを掛け持ちで作業することが多かったため別プロジェクトとの切り替えが容易なブランチをプロジェクトごとに作成する方針に決定しました。

# おわりに
似たような分野のプロダクトを開発しているのでそもそもアーキテクチャから見直してあげれば解決しそなところが悔しい部分です。
個人的にブランチが大量に生えちゃっているのがかなり不健全だと思うのでそのあたりが改善できるように今後も検討を続けていきたいです。
もっといい方法がありそうなので募集しています；；
Laravel×AdminLTEで言語を取得する

AdminLTEインストール後、以下のファイルでメニューの設定をしたが、
どうやって取得するかけっこうはまってしまったので、メモとして記載。
`/lang/vendor/adminlte/ja/menu.php`

取得方法
```
\Lang::get('adminlte::menu');
```

更に調査すると以下でも取得できました。
```
trans('adminlte::menu')
```
チームメンバーのあの子のこと…もっと知りたい❗️【おすすめチームビルディングワーク紹介】

# はじめに
新人が入ってきた時、チーム編成が変わった時、新しくチームができた時、、、
もっとチームメンバーのことを知りたい！と思っても、打ち解けるのが難しいことってないですか？(酒抜きで)

私の開発チームでは新しいメンバーが増えた時にチームビルディングワークをしています。
チームビルディングワークは **メンバー同士の相互理解** や **コミュニケーションの活性化** に繋がります。
過去に行なって良かったチームビルディングワークを紹介していこうと思います。


# チームビルディングワーク
- 価値観共有カード
- ドラッカー風エクササイズ
- 16Personalities

## 価値観共有カード
https://wevox.io/valuescard

[Wevox](https://get.wevox.io/) の、個人の持つ価値観をカード形式で共有するワークです。

### やり方
1. カードが1人5枚ずつ配られる(残ったカードは全て伏せた状態で中央に「山」として置かれる)
2. 自分の順番になったら「山」または「テーブルの上」にあるカードから1枚カードを引く
3. 手元にあるカードの中から自分の価値観に一番遠いカードを捨てる
4. 次の人に進み、カードの山がなくなるまで2〜3を繰り返す
5. 残った5枚のカードを使い、自分の価値観とその理由を参加者に説明する
::: note
カードを捨てるときは伏せずにオープンに捨てる
人が捨てたカードから手札に加えることもできる
自分が捨てたカードを再度手札に加えることも可能
:::

### やってみた感想
ゲーム感覚で明るい雰囲気で行なえるワークです。
カードを捨てると「それ捨てるの！？」や「それは確かにいらないな〜」なんていうのもあり、楽しくコミュニケーションをとりながら行なえます。

自分が速攻で捨てた価値観が他のチームメンバーの大事な価値観上位5位以内に入ることもあり、人それぞれ大事にする価値観が全く異なる点が面白いです。
また、時間を置いて数ヶ月後にもう一度やる面白さもあります。前回から変わったことや、変わらず大事にしている価値観を発見できます。

## ドラッカー風エクササイズ
### やり方
1. 4つの質問を用意する(何が得意か/どういう風に仕事をするか/自分が大切に思う価値は何か/チームメンバーは自分にどのように貢献することを期待していると思うか) 
![スクリーンショット 2022-09-27 14.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/1e5009db-831b-2708-8860-5973ef3b6ba8.png)

2. 思いついた回答からどんどん付箋を貼っていく(10分)
3. 上から順に参加者の回答の共有を行なう

他の人が挙げたものの中で共感するものがあればグッドスタンプを置いたり、質問をして内容を掘り下げてみましょう。

### やってみた感想
私のチームでは、「大切に思う価値」の他に「地雷(ここに触れられると怒る/悲しくなること)は何か」という項目を追加しました。
そうすることで「ある人はどういうときにマイナスの感情を抱くか」を把握できるため、「こういうことはしないようにする」といった暗黙のルールができ、お互いを尊重しながらチームで動けるようになるのがとても良いです。

このワークを行なったのは私がチームに入りたての新人の頃だったため「チームメンバーは自分にどのように貢献することを期待していると思うか」の回答には悩みましたが、「こういう貢献ができるように頑張るぞ」という一種の決意表明のようになって、気持ちが鼓舞されたのも良かったです。

## 16Personalities(MBTI診断)

https://www.16personalities.com/ja/%E6%80%A7%E6%A0%BC%E8%A8%BA%E6%96%AD%E3%83%86%E3%82%B9%E3%83%88
### やり方
1. 12分以内に次々と出される質問に正直に答えていく
2. 診断結果を共有する

結果を見て、自分でしっくりきた内容や「こう書かれていて驚いた」内容を共有してみましょう。
### やってみた感想
上2つのワークとは異なって、客観的に自己分析をする事ができます。
自分やチームメンバーへの理解が深まったり、反対に意外な一面を発見することもあります。
また、強みと弱みがわかるだけでなくそれぞれのMBTIには相性があり、たとえその相性が良くても悪くても場は盛り上がります。

自己分析にも便利なワークですが、診断結果を共有して相手の思考や行動のクセを知ることで、コミュニケーションが促進されたり心理的な安全性が少しずつ生まれ、打ち解けあうきっかけになります。

# 終わりに
チームビルディングワークを行なって、自分のこと・チームメンバーのことを知り、より良いチームを作り上げていきましょう！
GitLabのMR上に.NETアプリのカバー率を表示する

# ご挨拶
お世話になっております。
都内の某企業でエンジニアをやっている ひろしま という者です。

とあるお仕事で、GitLabを使って.NETアプリのパイプライン構築をしていたのですが、
**MRにユニットテストのカバー率を表示する際**に、WEB上に最新情報が落ちていなくてハマったので
記事にしてみようと思います。

# 参考サイト
参考にしたWEBサイトは、GitLab公式の１年前の記事です。
https://www.gitlab.jp/blog/2021/09/27/gitlab-coverage-dotnet/

# 本題
このサイトに書かれている内容が古く、ハマってしまいました。
主に古いのは、`dotnet-reportgenerator-globaltool`が吐き出すHTMLレポートファイルの形式です。

参考サイトのサンプル画像を見て分かる通り、１年前の時点ではのっぺりとしたデザインのレポートでした。
しかし、どうも最近デザインがシャレオツになってしまった結果、**面倒くさいHTMLファイルになってしまいました。**
もちろん正規表現バリバリLinuxのコマンドサクサクみたいな人はつまづかないのでしょうけど……。

具体的にはこの部分です。
```
  after_script:
    - dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:Html
    - grep 'Line coverage:' coverage/index.html
  coverage: "/Line coverage:/"
```
１年前はたったこれだけでよかったのですが、どうもシャレオツになった結果、
１行分取れば良いわけではなく、２行目を取らないとカバー率が取得できなくなっています。
しかも、アクセシビリティに配慮してか、`title`属性まで付与されており、その中に`123 of 123`のように数字が入っています。

# 結論
こうしてください。
```
  after_script:
    - dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:Html
    - grep -A 1 'Line coverage:' coverage/index.html
  coverage: "/\\<td.*\\>(\\d+.\\d+)%/"
```

# 解説
まず、 `grep -A 1 'Line coverage:' coverage/index.html`の`-A 1`についてです。
新デザインではカバー率の値の部分が改行されているので、マッチした１行分だけでは取れません。
なので、`-A 1`オプションを付けて、マッチした行＋１行分下まで表示するようにします。

次に、`coverage: "/\\<td.*\\>(\\d+.\\d+)%/"`についてですが、
これは`grep`でひっかけてきた２行分のうちの**２行目のカバー率の値だけ**にマッチさせています。
どうやら `coverage:` は、その文字列中に最初に見つかった数字をカバー率として認識するらしく、
冒頭でも書いた通りこの`td`タグには`title`属性で`123 of 123`のような数字が含まれています。
なので、その部分を無視するようにマッチさせています。

# 最後に
簡単ではありますが、これからGitLabを使って同じことをしようと思っている方の助力になれば幸いです。

# 追記：2022/11/10
出力するレポートの種類をHTMLではなくTextSummaryにすれば、こんなことしなくても取れるみたいです。

```
  after_script:
    - dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:TextSummary
    - grep 'Line coverage:' coverage/Summary.txt
  coverage: "/(\\d+.\\d+)%/"
```

勉強不足でした。。
paizaラーニング レベルアップ問題集 Aランクレベルアップメニュー JavaScript 最長の区間

最長の区間 (paizaランク B 相当)

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_twopointers_step4

しゃくとり法で解きます。

区間の左端と
右端の更新条件は次の通りになります。
区間の総和が M を超えたとき : 左端++
区間の総和が M 以下のとき : 右端++

# 解答例(C++の場合を参考に)
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [N, M] = lines[0].split(" ").map(Number);
let sum = 0;//区間和
let ans = 0;//最長の区間の長さ
let l = 0;//左端
let u = 0;//右端

const A = lines[1].split(" ").map(Number);

sum += A[0];

while (1) {
    //区間の総和が M を超えたとき : 左端++
    if (M < sum) {
        sum -= A[l];
        l++;
    //区間の総和が M 以下のとき : 右端++
    } else { // (sum < M)
        u++;
        ans = Math.max(ans, u-l);
        if (u === N) {//右端が全区間の右端に到達したら抜ける
            break;
        }else{
            sum += A[u];    
        }
        
    } 
}//while
console.log(ans);
```

# 解答例(Python3の場合参考)

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, m] = lines[0].split(" ").map(Number);
const numbers = lines[1].split(" ").map(Number);

let sums = [0];//累積和
for (let i = 0; i < n; i++) {
    sums.push(sums[i] + numbers[i]);
}

let count = 0;//最長の区間の長さ
let start = 0;//左端
let end = 0;//右端

while (true) {
    if (end >= n) {//全区間調べ終わったら抜ける
        break;
    }
    //区間の総和が M 以下のとき : 右端++
    if (sums[end + 1] - sums[start] <= m) {//区間和を累積和で計算
        //最長を更新
        if (end - start + 1 > count) {
            count = end - start + 1;
        }
        end += 1;//左端を進める
    //区間の総和が M を超えたとき : 左端++
    } else {
        start += 1;//右端を進める
    }
}//while

console.log(count);
```


# 解答例(Ruby の場合を参考に)

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, m] = lines[0].split(" ").map(Number);
const a = lines[1].split(" ").map(Number);

let [head, tail] = [0, 0];//右端、左端
let [sum, ans] = [0, -1];//区間和、答え

while (true) {
    //区間の総和が M 以下のとき : 右端++
    if (sum <= m) {
        ans = Math.max(ans, head - tail);//最長更新
        //調べ終わったら抜ける
        if (head === n) {
            break;
        }
        
        sum += a[head];
        head += 1;
    //区間の総和が M を超えたとき : 左端++
    } else {
        sum -= a[tail];
        tail += 1;
    }
}//while
 
console.log(ans);
```
[Vite] vite-plugin-plain-textを導入しようとして沼った話

タイトルの通りです。備忘録枠です。

# 現象
https://www.npmjs.com/package/vite-plugin-plain-text

のusageにあるのと全く同じように`vite.config.ts`を書いたつもりだが、`yarn dev`しても下記のようなエラーが出て起動しない。

```bash
$ yarn dev
yarn run v1.22.19
warning ../../../../package.json: No license field
$ vite
failed to load config from /home/na2na/develop/temp/todo-app/packages/client/vite.config.ts
error when starting dev server:
TypeError: plainText is not a function
    at file:///home/na2na/develop/temp/todo-app/packages/client/vite.config.ts.timestamp-1664265021247.mjs:10:5
    at ModuleJob.run (node:internal/modules/esm/module_job:193:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:527:24)
    at async loadConfigFromBundledFile (file:///home/na2na/develop/temp/todo-app/packages/client/node_modules/vite/dist/node/chunks/dep-557f29e6.js:63494:21)
    at async loadConfigFromFile (file:///home/na2na/develop/temp/todo-app/packages/client/node_modules/vite/dist/node/chunks/dep-557f29e6.js:63380:28)
    at async resolveConfig (file:///home/na2na/develop/temp/todo-app/packages/client/node_modules/vite/dist/node/chunks/dep-557f29e6.js:62997:28)
    at async createServer (file:///home/na2na/develop/temp/todo-app/packages/client/node_modules/vite/dist/node/chunks/dep-557f29e6.js:62063:20)
    at async CAC.<anonymous> (file:///home/na2na/develop/temp/todo-app/packages/client/node_modules/vite/dist/node/cli.js:700:24)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

# 原因

`package.json`内
```json:package.json
{
    "type": "module",
}
```
になっていた。

# 解決法

該当行の削除をしたところ、起動するようになった。
そもそもなんで`"type": "module"`なんて入っていたのか謎かも。
初学者でもカンファレンスの現地参加は怖くないよというお話【phpcon2022】

今年になって、技術イベントがようやく現地開催されるようになってきました。
コロナ禍でエンジニアになった自分が、初めてカンファレンスにオフライン参加したところとてもよかったので、
「新人さんもぜひ参加してほしい！」という気持ちで書いたポエムです。

## 筆者について
SE3年目ですが上流に関わることが多く、純粋な技術に関してはジュニアちょっと上くらいです。
PHPに関しては、業務でLaravelを利用しています。（逆にノーマルのPHPはほとんど書いた経験が無い）

## そもそもPHP Conference Japan とは
 PHPカンファレンスは1999年から実施されている、PHP関連の技術をテーマを主とした技術者イベントです。
公式サイトに以下の記載があるように、PHPユーザーの方々が自分の発表したいと思ったテーマで発表に事前応募し、その提案が通った方が登壇・発表する場です。
今年は9/24, 25の土日2日間の開催でした。
[Youtubeにアーカイブ](https://www.youtube.com/c/PHPConferenceJapan/playlists)が上がっており、今からでも見ることが可能です。

[PHPカンファレンス 2022](https://phpcon.connpass.com/event/255324/)
> 国内の業界トップランナーによるPHP最新動向や、コアテクノロジーからPHP初心者向けセッションまで、40以上のセッションをお届けします。 これからPHPをはじめる方から、さらにPHPを極めていきたい方まで幅広く楽しめるイベントになるようプログラムをご用意しておりますので、ぜひご参加ください！


## 初めてのオフライン参加
2020年の開催分はYoutubeで見ていたので、発表内容はなんとなーくわかっていたのですが、
現地の雰囲気が分からず行くのを躊躇していました。（一人で行く人いるのかな...ベテランの人ばかりなのかな...と)
ですが、1年目の時に上長に「カンファレンスとかぜひ行ってみてね！」と言われていたのを思い出し、勇気を出してconnpassから参加登録をすることに...

## 感想
行ってみて良かったです！
やはり現地だとその場の空気感もあり、オフラインよりも集中して聞くことができました。
また、「せっかく現地まで来てるんだから！」と、オンラインだったら見なかっただろう発表も聞くきっかけになりました。（そしてそういう発表こそ面白いことがままある）

事前に気になっていた会場の雰囲気ですが、自分含め一人で来ている方がかなり多いように見えました。
なので、「一人で来ている人が浮く」とか、「内輪感が強い」とかもないので、だれでも気兼ねなく参加できると思います。（女性一人の方も自分だけじゃなかったです！）

そしてなによりも、やっぱりこういうテーマの話を真剣に聞いていると、コード書きたくなりますよね...!
知らなった技術の存在をたくさん知ることができ、発表者の方の熱量を直接感じて、
技術勉強へのモチベーションが大きく上がったのは、一番良かったと思います。
（そしてノベルティがたくさんもらえるのも地味にうれしいところ）

## 初心者でも大丈夫
初学者向けの発表も充実しており、「PHPについてはProgateレベルの知識しかない...」という方でも置いて行かれずに参加できると思います。
以下[タイムテーブル](https://fortee.jp/phpcon-2022/timetable/2022-09-24)でも「初心者向け」とついている発表があることを確認できますので、それを選んで見てみるのもよいと思います。
（実際に一つ参加しましたが、参加者も多く、かなり人気の様子でした）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771526/e5d36bbf-664f-0a04-bf6e-8e9355a78c1d.png)

## こうすればもっと有意義に
自分のおすすめとしては、事前に以下2点を検討しておくことです。
これをしておかないと、当日現地であたふたしてしまうように思います。
* 1日のタイムテーブルのうち、どれを見に行くか
* 見に行きたい発表は、どのTrack(会場)で実施しているのか

また、多くの発表について、事前に登壇者の方がスライドを発表内容ページやTwitterで共有してくださいます。
それを見て、どれを見に行くか決めるのが良いと思います。

ちなみに、自分は初日のみ現地参加だったのですが、以下の発表を聞きました。
どれもめちゃくちゃ面白かったです...アーカイブをぜひ見てください...
* [AWS CDK に魅入られた PHPer がオススメする IaC から入るインフラの話](https://fortee.jp/phpcon-2022/proposal/66d8d2f7-0c5d-4df0-9fe1-cca5501be520)
* [なるべくJavaScriptを書かないでSymfonyのUIをリッチにする、『Symfony UX』。](https://fortee.jp/phpcon-2022/proposal/816cdfd9-8738-4b8a-b50a-607d3af289eb)
* [AWSの「今」 - PHPのコードを素早く動かすためのサービスのご紹介](https://fortee.jp/phpcon-2022/proposal/6e41e1c1-b967-40c5-8e86-55577dfced93)
* [PHPで学ぶシステム設計　依存関係のコントロール編](https://fortee.jp/phpcon-2022/proposal/2a07ae7f-0b02-42d5-a5f3-53d397a7dcfc)
* [PHP メモリ管理術 ](https://fortee.jp/phpcon-2022/proposal/be58ddfa-15cb-4938-9868-b56d7ebf1144)
* [実践！ユニットテスト入門 ](https://fortee.jp/phpcon-2022/proposal/41cd9cd5-7d1f-4659-b31f-d31545d286aa)


## 最後に
カンファレンス情報は[こういうところ](https://anti-pattern.co.jp/hub/tech-conference-2022/)で一覧になってたりします。
「（自分の興味のある技術） + カンファレンス」で検索するのでも、興味のあるテーマのイベントを見つけられるのではないかと思います。↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771526/c857aa6a-e4dd-6527-c4b5-67a8023f8371.png)

自分は次はVue Fesに参加してみようと思います！（オンライン開催なのはちょっと残念ですが）
いつか自分も登壇する側になれるよう頑張りたいです～
Xcode のwindows organizerでcrashを見る

1.XcodeでApple Store Connectのアカウントをログイン
2.download all profilesを押す
3.windows organizerからcrash レポートが見れるようにできた。

## 参考：
https://stackoverflow.com/questions/45358504/how-to-see-app-crashes-on-xcode-organizer
Processing Video Library 問題まとめ

# はじめに
ProcessingのVideoライブラリが使えないときの対策メモ．
随時更新していきます．

以前，書いた記事も載せておきます．

https://qiita.com/kikpond15/items/7daf65a8b539813fb2de

https://qiita.com/kikpond15/items/9add46a0edef25a0c51e

https://qiita.com/kikpond15/items/9cb21d9091034bd3ae71

# まず確認すること
最初に、Processingのバージョンが最新か確認してください。またMacの場合IntelかApple silicon正しいバージョンがインストールされているかも確認しましょう。

最新版をインストールしたら、Video libraryも再インストールし、Processingを再起動して、動作するか確認してみましょう。

# 次に確認すること
Windows環境でよくあるのが，Processing.exeとライブラリや作成したスケッチを管理するProcessingフォルダがあるディレクトリに日本語が含まれていると動かないことがあります．
```C:Users/user/OneDrive/デスクトップ/Processing-4.0.1/processing.exe```
```C:Users/user/OneDrive/ドキュメント/Processing/libraies ```


Processing.exeはwindowsなら Cドライブ直下か，C:Program Filesに入れておきます．
```C:Program Files/processing-4.0.1/processing.exe```

videoライブラリはC直下にProcessingフォルダを作りlibrariesに入れるか，ユーザディレクトリに"Documents"フォルダを作り，その中にProcessing/libraries/videoとするのが良いと思います．

```C:Processing/libraries/video```
```C:Users/user_name/Documents/Processing/libraries/video```



**フォルダを移動させたら，Processingの設定からSketchbook folderのパスも変更後のパスに設定し直しましょう．**
#### Macの例
![スクリーンショット 2022-10-05 15.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/dbef980b-a2fa-2705-ebdc-2777392a53a3.png)



# サンプルが動かないとき
Videoライブラリのサンプルが動かないときは，以下のプログラムを実行してみて下さい．
```java
import processing.video.*;
Capture cap;

void setup() {
  size(640,480);
  //カメラデバイス一覧を取得しコンソールに表示
  String[] cameras = Capture.list();
  println(cameras);
  
  //カメラに接続できるまでカメラデバイス一覧を取得
  while (cameras.length == 0) {
    cameras = Capture.list();
  }
  //検出された最初のカメラデバイスに接続
  cap = new Capture(this, 640,480,cameras[0]);
  cap.start();
}

void draw() {
  image(cap, 0, 0);
}
void captureEvent(Capture c) {
  c.read(); 
}
```

# GStreamer Erorrが出たとき
修正中
以下参照

https://github.com/processing/processing-video/issues/204


# Internal data stream error が出たとき
videoライブラリのCaptuerクラスをインスタンス化する時に，fpsを30に設定するといけると思います．

```java
import processing.video.*;
Captuer cap;

void setup(){
    size(640, 480);
    String[] cameras = Capture.list();
    cap = new Captuer(this, 640, 480, cameras[0], 30)
    cap.start();
}
```

#### Mac OS（Processing4）で症状が出る時
2022/10/03現在，Githubに最新のVideo Library Release 11 (2.2.1)が上がていて，Macでの```Internal data stream error```に対応している様です．

https://github.com/processing/processing-video/releases


# カメラは動いてるけど画面が真っ暗なとき

cam.read();が入っていない場合，カメラ映像が読み込まれていない可能性があります．

```java
void draw() {
  //カメラが使用可能であればread()する
  if (cap.available() == true) {
    cap.read();
  }
  image(cap, 0, 0);
}
```
または
```java
void captureEvent(Capture cap) {
  cap.read();
}
```


## 稀なケース

### Microsoft Surface で映像が緑がかる，または遅延する

Microsoft Surface特有のバグぽいです．正式な解決方法がなさそうで，ファームウェアアップデートで直る人や，レジストリーエディタで設定をいじると直るとか直らないとか...
応急処置としてはUSBカメラを繋げ，デバイスを指定してあげるのが良さそうです．

参考
[matablo：SurfaceでprocessingのVideo.Capture映像が緑がかりフレームレートが落ちる現象について](https://matatsuna.hatenablog.com/entry/2018/01/15/122023)

https://github.com/processing/processing-video/issues/72


### fpsを30以下にすると動く
TAで授業のサポートをしていたときに，上記の対策を色々試してみたけど，Videoが動かない生徒がいて，試しにfpsを1にしてみたら動きました．その生徒のPCではfps25でVideoを動かせました．
**実行環境**
MacOS BigSur
Processing 4.0.1
GStreamer 1.20.2
正規表現について

# 正規表現とは
正規表現とは、文字列の一部分を抽出・置換したり<br>文字列が制約を満たしているかを調べるための表現方法で
メールアドレスに@が入っていないと登録できない等の制約をかける事が出来ます。

# 正規表現のパターン
| パターン | 意味 | 例 |
|:-:|:-:|:-:|
| [ ]  | 正規表現における[ ]（角括弧）は<br>[ ]内に囲まれた文字がマッチします<br>[a]だとaがマッチします、また文字列の間に<br>ハイフンを入れる事により<br>[a-z]aからzの文字がマッチする。  |[a-z][ぁ-ん]<br>[ァ-ヶ]/\p{Han}/<br>[ぁ-んァ-ヶ一\p{Han}]|
| \d  | \dは数字のみマッチする。  | [\d][a-z\d] |
| {n, m}  | 直前の文字がn回、多くてもm回出現するものにマッチする。  | /\d{10,11}/  |
| {n} | 直前の文字がn回出現するものにマッチする。  | /\d{10}/  |
| .  | 改行以外のどの文字にもマッチする。  | (?=.*?\d)  |
| +  | 直前の文字の1回以上の繰り返しにマッチする。  | [a-z\d]+\z  |
| \A  | 直後の文字が先頭にある文字列にマッチする。  | \A[ぁ-んァ-ヶー]  |
| \z  | 直前の文字が末尾にある文字列にマッチ  | [ぁ-んァ-ヶー]+\z |

# 正規表現の参考例
### 忘備録も兼ねてる為、今後勉強中に覚えた事を追記していく予定です。

```:ひらがな、カタカナ、漢字のみ許可
/\A[ぁ-んァ-ヶ一\p{Han}]+\z/
```

```:ひらがなのみ許可
/\A[ぁ-んー]+\z/
```

```:カタカナのみ許可
/\A[ァ-ヶー]+\z/
```

```:漢字のみ許可
/\p{Han}/
```

```:半角英数字のみ許可
/\A[a-z0-9]+\z/i
```

```:ハイフン無し電話番号のみ許可（10桁）
/\A\d{10}\z/
```

```:ハイフン付き郵便番号のみ許可
 /\A[0-9]{3}-[0-9]{4}\z/
```

```:ハイフン無し郵便番号のみ許可
 /\A[0-9]{7}\z/
```

# 参考にさせた頂いたサイト
[正規表現リスト](https://qiita.com/yait/items/8a28a56bc584780b8d8a)
[【Ruby のまずいコード】漢字を数える](https://qiita.com/scivola/items/905225bf4175392bc359)
Core Web Vitalsとは

## コアウェブバイタルとは

GoogleがWebページUXの重要指標である「ウェブバイタル」を発表した。
その中でも特に重要なものとして挙げている以下３つの指標のことを指す。

### LCP
Largest Contentful Paint
ユーザーの認識としてのページ表示速度を測る指標。
メインコンテンツが表示されるまでの時間を表す。


### FID
First Input Delay
ユーザーが第一印象として感じるサイトの反応速度を測る指標。
クリック・タップなどのアクションに対してブラウザが反応するのにかかった時間を表す。

### CLS
Cumulative Layout Shift
要素の安定性を示す指標。
ユーザーが意図せぬコンテンツのズレがどれぐらい発生したかを表す。


### つまり

- すぐに表示され
- 反応が早く
- がたつかない

上記を満たすWebページこそがユーザー体験を向上させるものである、ということ。

## 影響は？

2021年5月以降、Googleの検索結果のランキングにコアウェブバイタルが組み込まれることが発表されました。SEO対策として見逃せないものになります。

> Google 検索の使命は、ユーザーがウェブ上で最も関連性が高く質の高いサイトを見つけられるようにすることです。上述の更新の目的は、優れたエクスペリエンスのページをハイライト表示して、ユーザーが求める情報を確実に見つけられるようにすることです。
https://developers.google.com/search/blog/2020/11/timing-for-page-experience

Webに関わる人々を混乱させる目的ではなく、ユーザーにとってより良いものを提供するための目的であることが伺えます。


## 数値の調べ方

いろいろ色々用意されている。
https://web.dev/vitals-tools/

今回は手っ取り早く確認できそうなChromeの開発者ツールを見てみる。
開発者ツール > Lighthouse > Analyse page load

![スクリーンショット 2022-09-27 12.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/ac4366c5-4f47-2319-5e75-c1dd181e20db.png)
![スクリーンショット 2022-09-27 12.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/9a715e8e-270f-3fd2-c30b-337aef8d929f.png)
（FIDは現状見られないらしい）


## どのような数値なら良いのか

### LCP
数値は秒で表し、値が小さいほどUXが良い。
読み込み開始から最大コンテンツが表示されるまでが2.5秒未満であることが理想的とされている。

### FID
数値はミリ秒で表し、値が小さいほどUXが良い。
遅延時間は100ミリ秒未満が理想とされている。

### CLS
数値は「レイアウトシフト」という独自スコアで表し、値が小さいほどUXが良い。
スコアは0（移動なし）～1（画面における最大の移動量）で表され、0.1未満が理想的とされている。


## 対策例

### LCP

- 不要なファイルの読み込みを削除する。
- JavaScriptやCSSや画像を圧縮して軽量化する。
- CDNを導入する。
- サーバー側の処理を改善して応答時間を短くする。

### FID

- 不要なJavaScript処理を削除する。
- JavaScriptの長いタスクを分割する。

### CLS

- 画像はwidthとheightを設定する。
- 動的コンテンツの配置を見直す。（ページ下部であれば影響が出にくい）
AWS Certified Cloud Practitionerを取得したので振り返り

今月にAWS Certified Cloud Practitionerを受験し、合格したので勉強方法など振り返りをしようと思います。
これから受験する方の参考になれば幸いです。

# 前提
 - AWS歴は３年ぐらい
 - SDKで利用することが多く、コンソールなどはあまり触らない
 - 使ったことあるサービスは、S3、RedShift、DynamoDB、KDS、IAM、ECRなど


# AWS Certified Cloud Practitionerとは
AWSのプラットフォームに関するもっとも基礎的な試験で、クラウドへの理解と基礎的な AWS の知識について問われます。
受験対象は以下（公式から抜粋）
> AWS Certified Cloud Practitioner は、AWS プラットフォームの基本的な知識をお持ちの方を対象としています。この試験を受ける前に、以下のことをお勧めします。
> - AWS クラウドに 6 ヶ月間触れている
> - IT サービスのベーシックな知識と、AWS クラウドプラットフォームにおけるそれらのサービスの使用に関するベーシックな知識がある
> - AWS のコアサービスとユースケース、課金、料金モデル、セキュリティコンセプト、クラウドがビジネスに与える影響についての知識がある

日本語公式ページ

https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

# 勉強方法について
勉強した期間は１ヶ月ぐらいになります。
仕事が終わってから毎日1~2時間ぐらい勉強しました。

## 使用した教材
勉強に使った教材は以下の３つです。
 - [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://onl.sc/NV9jZzW)
 - [AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)
 - [【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)

それぞれ解説していきます。
### AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー
とりあえず資格の勉強をするなら本を読もうと思って買った１冊になります。
試験の概要、対象範囲の大まかな知識、章末の問題など１回読むだけで、どういう内容の試験なのかを把握することができました。
ただ、この１冊だけで試験内容をすべてカバーしてるわけではないので、別な教材で保管する必要があると思います。
特に問題に関しては、とても少ないので別途用意するのがおすすめです。

### AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得
AWSをちゃんと触ったことがなかったので、なにか良い教材はないか？と思って買ったコンテンツになります。
AWS、EC2、VPC、Route53、RDS、ELB、S3、IAM、CloudWatchなどAWSの重要なサービスを実際に触ることができます。
解説がとても丁寧で、AWSを触ったことがない人でも非常に頭に入りやすいと思います。
コンテンツの流れとしては、インフラを構築して、WordPressを立ち上げて、それを拡張するという流れになっています。
講師の方は[YouTube](https://www.youtube.com/channel/UC452hry4DI_pDn_CVT9ZKhQ)もやっているので、いきなりお金を出すのは怖いという方はまずそちらを見てみるのも良いと思います。

### 【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）
先程記載したテキストに問題が少ないと感じたので、別途購入した問題集になります。
試験機関までこれをひたすら解いて、わからないことは回答に載ってる解説や本を見て復習するのを繰り返してました。
最終的には7個目の応用コンテンツ以外はすべて9割を超えて回答できるようになるところまでやりました。
7個目の応用問題は正直、やらなくても良いかなと思います。

# 受験の流れ
試験は自宅とテストセンターどちらかで受けれるのですが、私はテストセンターで受験しました。
自宅であればほぼ毎日受けることができます。
試験は24時間前までに登録する必要があります。また、変更やキャンセルも同様に24時間前までであれば可能になっています。
テストセンターで受ける場合は15分前までに到着している必要があります。
到着後、受付を済ませて、写真を取ります。
受付の際は、身分証明書が2種類必要なので気をつけてください。
私は「運転免許証」と「マイナンバーカード」を使用しました。
受付が終わると、荷物をすべて預けて試験を受けるためのPCに案内されます。
そこで試験を受け、アンケートを答えると即合否がわかるという形になっています。

# 試験を受けてみて
結果は793/1000で合格でした。
合格ラインが700なので、思ってたよりもギリギリでした・・・。
合否はすぐわかり、詳細に関しては後日メールで送られてきます。
試験の内容的にはAWSの基本的なサービスの概要を押さえていれば、そこまで難しくないと思います。
どちらかというと、ひたすら暗記に近いイメージでした。
サービス名と特徴をしっかりと抑えて、相互に変換できるようになってると良いと思います。
あと、今回は使わなかった（使えなかった）のですが、バウチャーチケットという少し割引されてるチケットがあるので興味がある方は調べてみようと思います。



# まとめ
AWS Certified Cloud Practitionerを受験したことで、今まで知らなかったサービスや概念を改めて勉強する良い機会になりました。
今回のAWS Certified Cloud Practitionerを合格したことで、特典の１つに次回の資格受験が50%OFFになるクーポンがあります。
これをちゃんと忘れずに使って、次はAWS Certified Solutions Architectを狙おうと思います。
95％予測区間を求める(SPSS Modeler データ加工逆引き8-13)

# 95％予測区間を求める

![スクリーンショット 2022-09-23 15.04.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/060121cf-cd8a-4c1b-bd28-670a11a1db16.png)

## 1.想定される利用目的

・時系列予測モデルの性能評価と異常値検知
・実装後の時系列モデルメンテナンスのための性能確認
・機械学習モデルによる時系列予測を行った場合の性能評価と異常値検知


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/confidence_interval.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-09-23 15.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5b3f90c9-a0fa-1ab5-ff9e-bd20e9e90693.png)

a.入力するデータは以下の通りです。日毎の来場者の実績と予測のフィールドの３列です。
![スクリーンショット 2022-09-23 17.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a3b820ee-6fbb-858d-92fd-7ff255a6ce70.png)

*逆引き8-11/12と予測値が異なったサンプルデータです。

b.[フィールド作成]ノードを編集します。
![スクリーンショット 2022-09-23 14.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1595ec38-8f75-81dd-0227-10202d0bc0ff.png)

c.[レコード集計]ノードを編集します。[キー]をブランクにして誤差平方和を求めます。
![スクリーンショット 2022-09-23 17.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5749cb7e-28a6-f6c3-ba4c-04b62e40371f.png)

d.[レコード結合]ノードを編集します。[結合キー]をブランクにしてcで求めた１レコードの誤差平方和をオリジナルデータの全てに付与します。
![スクリーンショット 2022-09-23 17.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/95a799a6-1735-ae43-77f1-7ca036bdb058.png)

e.[フィールド作成]ノードを編集します。各レコードの推定値の標準誤差を求めます。
![スクリーンショット 2022-09-23 17.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/814648b8-1257-e2c0-7b4a-4d29d9d19c92.png)

f.[フィールド作成]ノードを編集します。各レコードの予測フィールドからeを引いて95%予測下限が作られます。
![スクリーンショット 2022-09-23 17.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0bbf9dbc-bf17-ba0d-c564-4c0152eced60.png)

g.[フィールド作成]ノードを編集します。各レコードの予測フィールドにeを加えて95%予測上限が作られます。式は[予測 +  (1.96 * 推定値の標準誤差)]です。

[プレビュー]します。予測区間の下限と上限が作成されました。
![スクリーンショット 2022-09-23 17.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d5864888-6f64-260c-4798-c985e9579325.png)

h.[条件抽出]ノードを編集します。[日付 >= datetime_date(2022, 8, 15)]で8月15日以降にフォーカスします。

i.[時系列グラフ]ノードを編集します。
![スクリーンショット 2022-09-23 17.41.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/af84a862-78b1-0819-8205-9c9adff83737.png)

[実行]ボタンを押します。
![スクリーンショット 2022-09-23 14.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/db83883e-9782-f8fd-b71c-6cf5148a5235.png)

#### 注意事項

時系列予測ノードを利用すると95%予測区間は求まります。この手続きが必要なのは、実装後に異常検知を行う場合や、機械学習モデルでトレンド分析を実施ているケースです。

## 4.参考情報

#### 95%予測区間を扱った記事

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-10/

#### ストリーミング時系列ノードで95%予測区間の外側を異常値判定する

https://qiita.com/416nishimaki/items/11d1581bef7fff2a9ede

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
ゴリ押しで起動させるDocker compose

# とりあえず動いてほしい 
Docker (& Docker compose)で開発を始めるとき、慣れない種類の環境は立ち上げが辛い。execでbashに繋いで試行錯誤できればまだしも、ビルドでコケるわ起動と同時に異常終了するわで前段が長く感じることがしばしばある。

全知全能、百戦錬磨の技術者なら必要なもの全てを1発でDockerfileに書ききってしまうかもしれないが、どちらかというと稀な気がするのだ。

とにかく最初は、とりあえず動いてほしい。ゴリ押し上等だ。いいからテーピングだ。

# 結論
## RUN命令でのエラー潰し
ビルド失敗の主原因であるRUN命令のエラーを無視する。別途shellを起動してcオプションで実行、or条件で"exit 0"すればよい。
```
RUN sh -c "something bad command || exit 0"
```
停止はしないが、エラー内容は標準エラー出力に流れたものが"docker compose logs"で確認できる。

## CMD命令/commandでのエラー潰し
DockerfileのCMD命令はdocker-compose.yamlのcommandで上書きされる。なのでdocker-compose.yaml側でハックすればCMD命令がコケる場合もcommandでコケる場合も対処可能。

or条件で失敗時に適当なインタラクティブシェルを起動させる。shでOK。

```
services:
    node:
        command: sh -c "npm run dev || sh"
        tty: true
```

# なぜうまくいく?
## ビルド失敗の条件は終了ステータス1以上
少なくともRUN命令では、実行コマンドの終了ステータスが1以上の時にビルド失敗として扱われて中断される。

```
RUN sh -c "something bad command || exit 0"
```

上の書き方にするとshが別途立ち上がってダブルクォーテーション内のコマンドを実行する為、Dockerが認識するのはshの終了コードになる。それでも通常は"something bad command"終了ステータスがそのままshの終了のものになるが、終了ステータスが0でないときも"exit 0"に渡してやればshの終了ステータスは常に0となり、エラーとして扱われなくなる。

## コンテナが稼働し続けるのはプロセスが継続している間
例えばnginxイメージの起動コマンド"nginx"や、node系開発サーバでよく指定される"npm run dev"などは常駐プログラムの起動コマンドで、起動されたプロセスが動いている限りコンテナは終了しない。

```
        command: sh -c "npm run dev || sh"
```

常駐系プログラムの起動が失敗した場合に適当なインタラクティブシェル(コンテナ内で起動可能なものならなんでもよい。"sh", "bash", "perl", "node", "php -a", "php artisan tinker"...)を代わりに起動するように指定する。

これだけだとインタラクティブシェルはttyを必要とするので結局停止してしまうが

```
        tty: true
```

ttyを作成させることでインタラクティブシェルが無事に起動、常駐してくれる。

## (参考)ttyとは何か
[tty【コマンド】](https://wa3.i-3-i.info/word11668.html)
わかりやすい!!

ttyコマンドで表示されるファイルの正体はデバイスファイルというものらしい。

[Linuxのファイルの種類](https://qiita.com/angel_p_57/items/1faafa275525469788b4#%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
わかりやすい!!

```
tty | xargs -I @ ls -la @
crw--w---- 1 ming tty 136, 12 Sep 27 15:27 /dev/pts/12
```

削除するとターミナルが落ちるかなと思って試してみたが、謎の力に守られているようだ。
```
sudo rm /dev/pts/12
[sudo] password for ming:
rm: cannot remove '/dev/pts/12': Operation not permitted
```
Web開発　見つけた論争をまとめてみた

## きっかけ
Web開発について勉強する中でfont-sizeについて落とし込むのに苦戦しました。
というのも、「px」「em」「rem」が何なのかは理解できても、「どう使いこなせばいいのか」を調べると
様々な主張がネットには溢れかえっており、「絶対にコレ」というものが存在しません。
そして、最終的には<strong>「ケースバイケース」「各自の判断」という結論が待っています</strong>。

「ケースバイケース」「各自の判断」じゃ困る！答えを決めてくれ！というのが本音ですが
そんなわけにもいかないので、そもそも世の中ではどのような論争が行われているのかを探してみて
自分はどの派閥に属するのかを1個1個検討してみようと思ったのがきっかけです。
今回は試しに3つほどピックアックしました。

みなさんも「こんな論争あるよね」といったものがあればコメントで教えていただけますと嬉しいです。

### font-sizeには「px」と「em」「rem」どちらを使用するべきか
自分が記事を書くきっかけになった疑問
単位がいくつかあるが結局のところどれを使えば問題が無いのか？
<dl>
<dt><strong>pxのほうがいい</strong></dt>
<dd>馴染みがあるのはピクセル指定だし、初学者や未経験者がいきなりemやremを使いこなすのはハードルが高い。</dd>
<dt><strong>em,remのほうがいい</strong></dt>
<dd>pxを使用するとブラウザのフォントサイズ変更が効かなくなるし、レスポンシブ対応はremを使う方が楽である。</dd>
<dt><strong>使い分けなさい</strong></dt>
<dd>px指定にもem,rem指定にもそれぞれのメリットデメリットがあるのだから必要に応じて使い分けなさい。</dd>
</dl>

これについては個人的に「使い分けなさい」派がしっくりきています。
「どう使い分けるか」が直観的に分かるようになるまで経験を積んでいくのが大事なのだろうか・・・

※参考にした記事

https://zenn.dev/tak_dcxi/articles/26280e7607bcd2

https://coliss.com/articles/build-websites/operation/css/about-pixels-and-accessibility.html


### remを使用する場合ルート要素にfont-size:62.5%を指定するべきか
font-size:100%とした時に、16pxとなるのでこのままではremの計算が面倒。
62.5%にすれば10pxとなり、remに指定する値はピクセルで指定する場合の数値×0.1なので計算しやすい。
<dl>
<dt><strong>指定した方が良い</strong></dt>
<dd>コーディングの高速化および計算ミスを防ぐにはこの指定をするのがよい。</dd>
<dt><strong>指定すべきでない</strong></dt>
<dd>サードパーティーのライブラリの中にはroot要素が100%を想定して作られているものもあり<br/>
フォントサイズなどが更に小さくなってしまうデメリットがある。<br/>
また、開発者都合でありこの設定をする事でユーザ側のメリットが無い。</dd>
</dl>

これについては指定せずにかつrem→pxの計算を簡潔にする仕組みがあればベストだと思っており
調べたところSaSSにあるmixin機能を使えば実現できそうです。(関数みたいな感じで使える）

https://www.cherrypieweb.com/4353

ただ、そもそもSaSSを使うかどうかも人や状況によるような・・・
（簡単なLPを用意するのにわざわざSaSSの環境を用意するのか等）
他にはCSS変数というものを使う方法もあるらしく、アプローチの仕方ってかなり多いんですね。


### 余白(margin)の取り方はどのようにしているか
他にどんな論争があるのか調べていると
余白の取り方について対談をしている記事があったので紹介いたします。

https://www.monosus.co.jp/posts/2016/02/000177.html

記事から抜粋させていただき概要を記載すると
<dl>
<dt><strong>基本、上に取る派（margin-top派）</strong></dt>
<dd>要素と要素の間に余白＝自分が要素の最後の場合は下に余白はいらない。<br/>
自己完結してくれるのでmargin-topで指定している。</dd>
<dt><strong>基本、下で取る派（margin-bottom派）</strong></dt>
<dd>
上から下にサイトは閲覧されるので要素の下に余白があった方が見やすい。<br/>
但し、まったくmargin-topを使わないわけではない。</dd>
<dt><strong>臨機応変派</strong></dt>
<dd>デザインの要件などを基に決めていく、またはプロジェクト内で決めたルールに合わせる。</dd>
</dl>

基本上に取る派、基本下に取る派で共通していたのは「理由によっては違う余白の付け方をする」という事でした。
余談ですが記事を見ていると自分にはまだ備わっていないこだわりのポイントがあり奥深いなと思いました。
まだコーディング経験が少ないのでこの辺りはやりながらスタイルを決めていこうと思います。
なんとなーく上に取る方がやりやすそう。

## 終わりに
HTMLコーディングのトレンドについて
実際にTwitterで様々な「あなたはどうする？」をアンケートされた方がいましたのでそちらの記事を紹介します。
下の記事が最新のアンケート結果まとめで、この記事が第8回だそうです。

https://ics.media/entry/220719/

他にもどのような論争がWeb開発界隈にあるのか気になるので、
「こういうのがあるよ！」
と教えていただけると大変うれしいです。
学習記録（Amazon Web Services）

初心者向けAWS本を読んだので、学習した内容をざっくりとまとめた記事です。

## 学習に使用した書籍
[Amazon Web Services 基礎からのネットワーク＆サーバー構築 改訂3版](https://www.amazon.co.jp/dp/B084QQ7TCF/ref=cm_em_r_mt_dp_8EGCJ03D0EHYA5JJ4EA)
初心者向けの書籍を購入したが、AWSとは無関係な章がそれなりにあったため、個人的には物足りなかった。
※IPアドレスは、8bit毎にピリオドで区切って表記するよ！って説明が出た時は焦りました。。。

## 注意点
* 実際にAWSに触れながらやっているわけではないので、画像はありません。
* 書籍を基に書いているため、情報が古い可能性があります。

## 用語
|用語|説明|
|:-|:-|
|リージョン（Region）|世界各地に存在するデータセンター群。<br>各リージョンは複数のAZで構成されている。|
|アベイラビリティゾーン（AZ、Availability Zone）|物理的に距離が離れたデータセンター。<br>複数のAZにインスタンスを分散配置して耐障害性を高める。|
|Amazon VPC（Amazon Virtual Private Cloud）|仮想的なネットワークを構築できるサービス。<br>全体のネットワークを作成し、それをいくつかのサブネットに分割して利用する。|
|Amazon EC2（Amazon Elastic Compute Cloud）|仮想的なサーバーを構築できるサービス。<br>Amazon VPCのサブネットの中にインスタンスを作成する。|

# ネットワーク構築
手順は概ね以下の通りのようです。
1. 全体のネットワーク（VPC）を作成
2. サブネットを作成
3. インターネットゲートウェイを作成
4. ルートテーブルの設定

## 全体のネットワーク（VPC）を作成
1. AWSマネジメントコンソールからVPCを選択
2. ［VPC］メニューを選択し、［VPCの作成］ボタンをクリックする。
3. VPC名とCIDRブロックを入力し、［作成］ボタンをクリックする。

## サブネットを作成
1. ［サブネット］メニューを選択し、［サブネットの作成］ボタンをクリックする。
2. サブネット名とアベイラビリティゾーン、CIDRブロックを入力し、［作成］ボタンをクリックする。

## インターネットゲートウェイを作成
1. ［インターネットゲートウェイ］メニューを選択し、［インターネットゲートウェイの作成］ボタンをクリックする。
2. インターネットゲートウェイ名を入力し、［作成］ボタンをクリックする。
3. 作成したインターネットゲートウェイにチェックを付けて、［アクション］をクリックし、［VPCにアタッチ］をクリックする。
4. 結びつけるVPCを選択し、［アタッチ］ボタンをクリックする。

## ルートテーブルの設定
1. ［ルートテーブル］メニューを選択し、［ルートテーブルの作成］ボタンをクリックする。
2. ルートテーブル名の入力と作成先VPCを選択し、［作成］ボタンをクリックする。
3. 作成したルートテーブルを選択し、［サブネットの関連付けの編集］をボタンをクリックする。
4. 割り当てるサブネットにチェックを付け、［保存］ボタンをクリックする。
5. 作成したルートテーブルを選択し、［ルートの編集］をボタンをクリックする。
6. ［ルートの追加］をクリックし、送信先とターゲットを入力し、［ルートの保存］ボタンをクリックする。

# サーバー構築（EC2インスタンス作成）
1. AWSマネジメントコンソールからEC2を選択する。
2. EC2ダッシュボードから［インスタンス］を選択し、［インスタンスの作成］をクリックする。
3. 使用するAMI（Amazon Machine Image）を選択する。
4. 使用するインスタンスタイプを選択し、［次のステップ：インスタンスの詳細の設定］をクリックする。
5. インスタンスの詳細設定の各項目を入力し、［次のステップ：ストレージの追加］をクリックする。

|項目|説明|
|-|-|
|ネットワーク|インスタンスを作成するVPCを選択する。|
|サブネット|インスタンスを作成するサブネットを選択する。|
|自動割り当てパブリックIP|インターネットからインスタンスにアクセスさせる場合は［有効］に設定する。<br>アクセスさせない場合は［無効］に設定する。|
|ネットワークインターフェース - プライマリIP|プライベートIPアドレスを設定する。|
6. インスタンスで利用する仮想ディスク（EBS：Elastic Block Store）の設定を行い、［次のステップ：タグの追加］をクリックする。
7. インスタンス名を入力し、［次のステップ：セキュリティグループ設定］をクリックする。
8. インスタンスに対するセキュリティグループを構成を行い、［確認と作成］をクリックする。
9. ［起動］ボタンをクリックします。
10. キーペアを作成後、秘密鍵のダウンロードし、［インスタンスの作成］ボタンをクリックします。

# NAT構築
AWSでNATを構築する場合、2つの方法がある。
|方法|説明|
|-|-|
|NATインスタンス|EC2インスタンスをNATとして使用する方法。<br>NATソフトウェアがインストールされたAMIから起動する。<br>料金体系は通常のEC2インスタンスと同じ。|
|NATゲートウェイ|NAT専用に構成されたコンポーネント。<br>配置対象のサブネットを選択するだけで構成できる。<br>稼働時間と転送量で課金される。|

どちらで構築するかの基準的なものの説明は書籍ではなかったけど、料金と使用頻度とかが基準になりそう。
書籍では、NATゲートウェイで構築を進めていたので、ここでもNATゲートウェイについて書きます。

# NATゲートウェイの構築
1. AWSマネジメントコンソールからVPCを選択する。
2. VPCダッシュボードから［NATゲートウェイ］を選択し、［NATゲートウェイの作成］をクリックする。
3. NATゲートウェイを配置するサブネット選択し、ElasticIPを割り当てて、［NATゲートウェイを作成］をクリックする。
4. NATゲートウェイを配置するサブネットに適用されているルートテーブルを更新する。

# 最後に
書籍を読んで、学習した内容をざっくりまとめました。
物足りない部分はありましたが、AWSでインフラを構築する全体像は把握できたと思います。
あとは、実際に使いながら、この記事を更新する予定です。
wp-cliでのエラー｜Your table prefix is 'wp_'. Found installation with table prefix: example_.

# 解決方法
wp-config.phpに指定されていた以下の行を修正しました。

```error.php
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
```

↑を↓に修正しました。

```ok.php
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'example_');
```

# 状況
wp-cliでプラグインアップデートをかけようとした時に以下のエラーが出ました。

```error.sh
$ wp plugin update --all
Error: The site you have requested is not installed.
Your table prefix is 'wp_'. Found installation with table prefix: example_.
Or, run `wp core install` to create database tables.
```

エラーメッセージとは違いますが実態としてはデータベースの接頭子の設定が'wp_'と設定されているところと'example_'と設定されているところがあるということでした。具体的にいうと前述の通りWPからデータベースに読みに行っている設定が'wp_'となってしまっている状況でした。

# 環境
docker composeでプロキシコンテナ＋wp-cliコンテナ＋wpコンテナ＋mysqlコンテナという構成でした。

# 原因
以下調査ログになります。

1.docker-compose.yml内のprefix指定しているところを確認しましたがexample_になっていました。
2.起動時にshellスクリプトを走らせているんですがその中でもprefix指定しているところがあり確認したところexample_になっていました。
3.次にmysqlコンテナにdocker execで入りデータベースのprefixを確認したところexample_になっていました。
4.次にwpコンテナにdocker execで入り以下の行を確認しました。
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
wp_の設定が残っている部分を確認しました。
5.冒頭の解決方法を実施しました。
C# メインスレッドのUIからパラメータを受ける方法他

System.Timers.Timerのようにタスク実行する関数の中でFormのUI(例えばTextBox)などを操作するにはInvokeメソッドを使ってdelegateを実行する必要がある。

例
タイマーが実行される度にTextBox値を1ずつ増やしていく

```cs
int counter = 0;

public void CallbackFunc(Object source, ElapsedEventArgs e){
  counter++;
  textbox1.Invoke((MethodInvoker) delegate { 
    textbox1.Text = counter.ToString();
  });
}
```

逆にTextBoxのTextプロパティの値を受け取りたい場合は、delegateの戻り値を使うのではなく、直接delegateの中で受け取れば良い。

```cs
public void CallbackFunc(Object source, ElapsedEventArgs e){
  string txt="";
  textbox1.Invoke((MethodInvoker) delegate { 
    txt = textbox1.Text;
  });
}
```
AWS Lambdaのイベントソースマッピングを一括処理するコマンド

# はじめに

LambdaのイベントソースマッピングはAWS CLIで操作できますが、多くのコマンドがUUID指定なので使いづらいと感じ、jqコマンドを使ってコマンド一発で実行できるようにしたときのメモです。

# コマンド

## イベントソースマッピングの作成と開始

以下コマンドの\<functionName>\<eventSourceArn>を置換する。

```bash
aws lambda create-event-source-mapping --function-name <functionName> --event-source-arn <eventSourceArn>
```

## イベントソースマッピングの無効化

### UUID指定

以下コマンドの\<uuid>を置換する。

```bash
aws lambda update-event-source-mapping --uuid <uuid> --no-enabled
```

### LambdaファンクションArn指定

以下コマンドの\<functionArn>を置換する。

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.FunctionArn | contains("<functionArn>")) | .UUID' | \
  xargs -I{} aws lambda update-event-source-mapping --uuid {} --no-enabled
```

### イベントソースArn指定

以下コマンドの\<eventSourceArn>を置換する。

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.EventSourceArn | contains("<eventSourceArn>")) | .UUID' | \
  xargs -I{} aws lambda update-event-source-mapping --uuid {} --no-enabled
```

## イベントソースマッピングの有効化

### UUID指定

以下コマンドの\<uuid>を置換する。

```bash
aws lambda update-event-source-mapping --uuid <uuid> --enabled
```

### LambdaファンクションArn指定

以下コマンドの\<functionArn>を置換する。

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.FunctionArn | contains("<functionArn>")) | .UUID' | \
  xargs -I{} aws lambda update-event-source-mapping --uuid {} --enabled
```

### イベントソースArn指定

以下コマンドの\<eventSourceArn>を置換する。

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.EventSourceArn | contains("<eventSourceArn>")) | .UUID' | \
  xargs -I{} aws lambda update-event-source-mapping --uuid {} --enabled
```

## イベントソースマッピングの削除

### UUID指定

以下コマンドの\<uuid>を置換する。

```bash
aws lambda delete-event-source-mapping --uuid <uuid>
```

### LambdaファンクションArn指定

以下コマンドの\<functionArn>を置換する。

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.FunctionArn | contains("<functionArn>")) | .UUID' | \
  xargs -I{} aws lambda delete-event-source-mapping --uuid {}
```

### イベントソースArn指定

以下コマンドの\<eventSourceArn>を置換する。

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.EventSourceArn | contains("<eventSourceArn>")) | .UUID' | \
  xargs -I{} aws lambda delete-event-source-mapping --uuid {}
```

## イベントソースマッピングの件数

### イベントソースマッピングの総件数

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | .State' | wc -l
```

### 無効なイベントソースマッピングの件数

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.State=="Disabled") | .State' | wc -l
```

### 有効なイベントソースマッピングの件数

```bash
aws lambda list-event-source-mappings | \
  jq -r '.EventSourceMappings[] | select(.State=="Enabled") | .State' | wc -l
```

# 参考
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/index.html#cli-aws-lambda