OmniAICreator/Qiita-1.07M huggingface dataset:
【ServiceNow】特定の列の要素一覧を取得したい～応用編～

### はじめに

- バージョン
  - ServiceNow: Rome

　前回の記事[【ServiceNow】特定の列の要素一覧を取得したい～基礎編～](https://qiita.com/masa2223/items/c71d942773ee38518780)では、
**欲しいデータが1つのテーブルで完結している場合**で使えます。今回は**欲しいデータが1つのテーブルで
完結していない場合**、列の要素一覧をどのように取得するかを紹介します。
　例としては、以下テーブル``Requested Items[sc_req_item]``の列Additional commentsの要素を
取得する場合です。Requested Item(RITM0010057)の列Additional commentsを見ると、
Requested Itemに紐づくAdditional commentsが全て(3つ)記載されています。また、Requested Item内の
``Activities``を見ると、Additional commentsの内容が確認可能です。
　前回の記事との違いは何でしょうか？

- テーブル``Requested Items[sc_req_item]``

![table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/6c2526e2-ec43-a34d-deea-cbb73d29f8f9.png)

- Activities

![comments.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/c7cc9601-969d-b368-8841-07169b71a15b.jpeg)

### 1. テーブル連携の確認

　前回の記事の通りに、テーブル``Requested Items[sc_req_item]``の列Additional commentsの要素一覧を
取得しようとしても失敗してしまいます。なぜならば、列Additional commentsの内容は他のテーブルを
参照しているからです。ServiceNowは**複数のテーブルが複雑に連携しているので、同じテーブルや
画面上で見えるからといって、1つのテーブルで全ての情報が得られるとは限らない**ということを
念頭に置く必要があります。
　今回では、以下のようにテーブル``Requested Items[sc_req_item]``の列Additional commentsが、
他のテーブル``Journal Entries[sys_journal_field]``と連携しています。

![journal_2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/8b065057-a4bf-c3df-4738-616cb93c9c28.jpeg)

### 2. コード紹介

　連携しているテーブルさえわかってしまえば、``GlideRecord``でテーブルの内容が取得できます。
今回はテーブル``Journal Entries[sys_journal_field]``から以下の条件で列Valueの内容を取得します。

- Name: sc_req_item
- Element: comments
- Element ID: Requested Item(RITM0010057)のSys ID

```javascript
var column_array = [];
var table_data = new GlideRecord('sys_journal_field');
table_data.orderBy('sys_created_on');
table_data.addQuery('name', '=', 'sc_req_item');
table_data.addQuery('element', '=', 'comments');
table_data.addQuery('element_id', '=', 'Requested Item(RITM0010057)のSys ID');
table_data.query();
while(table_data.next()) {
    column_array.push(table_data.getValue('value'));
}
gs.info(column_array);
```

### 3. ログの確認

　想定通り、Additional commentsの内容を取得できていることが確認されました。

![log.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/9cb5917d-d986-441c-f9b9-9f87f01af267.jpeg)

### 参考記事

[GlideRecord - ServiceNow Developers](https://developer.servicenow.com/dev.do#!/learn/learning-plans/rome/new_to_servicenow/app_store_learnv2_scripting_rome_gliderecord)
[GlideRecord(API Reference) - ServiceNow Developers](https://developer.servicenow.com/dev.do#!/reference/api/rome/server/c_GlideRecordScopedAPI)

### 関連記事

[【ServiceNow】特定の列の要素一覧を取得したい～基礎編～](https://qiita.com/masa2223/items/c71d942773ee38518780)
動くグラデーションが入ったテキストをCSSで実装する

# はじめに
最近は、インスタのロゴのようなおしゃれなグラデーションを取り入れたデザインが多く、実装してみたかったので簡単にまとめました。
背景だけでは物足りないのでグラデーションにCSSアニメーションで動きをつけて文字色として入れてみます。

**こんな感じ**
![Gradient.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249131/8068d7da-3b4a-32ca-8c87-942f0571acf8.gif)
コードはこちら
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="NWyLgxa" data-user="takuma348" 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/takuma348/pen/NWyLgxa">
  Gradient heading</a> by takuma348 (<a href="https://codepen.io/takuma348">@takuma348</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## アニメーションとグラデーションに関するCSS
各プロパティのより詳しい仕様に関しては割愛させていただきます。
- animation & keyframes
  - CSSだけで実装できるアニメーション
- background: linear-gradient();
  - CSS関数で２つ以上の色を指定して画像を生成する
- background-clip: text;
  - 背景をテキストで切り抜く感じ 

## 実装
### HTML
```html:index.html
<div class="gradient">
  <div class="gradient__wrap">
    <h1 class="gradient__title">Gradient<br>animation!</h1>
    </div>
  </div>
</div>
```
### CSS
```scss:main.scss
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@600&display=swap');

.gradient {
  &__wrap {
    height: 100vh;
    
    display: flex;
    align-items: center;
    justify-content: center;
  }
  &__title {
    animation: AnimationTitle 5s ease infinite;
    background: linear-gradient(to right, #833ab4, #fd1d1d, #fcb045);
    background-size: 200% 100%;
    background-clip: text;
    -webkit-background-clip: text;
    color: transparent;
    
    font-size: 100px;
    font-family: 'Space Grotesk', sans-serif;
    font-weight: 600;
    line-height: 1;
  }
}
@keyframes AnimationTitle {
    0%{background-position:0% 50%}
    50%{background-position:100% 50%}
    100%{background-position:0% 50%}
}
```

## おわりに
全体的な背景に使用する場合は、アニメーション速度を３０秒くいらいでもう少しゆっくりめにした方がいい感じになります。
テキストだと表示範囲が狭いため３０秒くらいにすると色の変化が分かりずらいです。

### 参考サイト
いい感じのグラデーションをサクッと作れます。
いじっているだけでも楽しいです。
- [uigradients](https://uigradients.com/)
- [ColorSpace](https://mycolor.space/gradient)
Amplify で Next.js の プレビューモード(Preview Mode) を利用したい場合

## 結論

先に結論を書きますと、 **ちゃんと** プレビューモードを利用することはできません。

以下、雑記としてご覧ください。


## プレビューモード

ヘッドレスCMSなどでコンテンツを取得してきている場合に、プレビューモードとして記事などの公開前に確認したいという要件がある場合があります。

そんな場合にも、さすがの Next.js には以下のような機能が既に搭載済みです。

https://nextjs.org/docs/advanced-features/preview-mode

## Amplify のホスティングについて

まず、 Next.js を Amplify でホスティングする場合、
Amplify Console からホスティングすると非常に楽にホスティングができ、 CI/CD も自動で設定されます。

https://docs.aws.amazon.com/amplify/latest/userguide/getting-started.html

これが Amplify の良い点でもあります。
この方法でホスティングした場合、 Amplify は package.json の値を見てこのアプリケーションが SSR モードであるか SSG モードであるかを判断します。

そして、Next.js のプレビューモードは SSG モードでホスティングされている場合は当然動かず、 SSR の機能を使えるようにしてあげる必要があります。

https://docs.aws.amazon.com/amplify/latest/userguide/server-side-rendering-amplify.html#redeploy-ssg-to-ssr

通常、Amplify Console からホスティングした場合、 CloudFront と S3 が自動で設定されますが、それらは開発者が直接設定することはできません。

ですが、**SSR モードの場合は例外的に CloudFront と S3 を直接触ることができます。**

「書き換えて、リダイレクト」に
`/<*>`に対して CloudFront のディストリビューションのURLが追加されていると思います。
それが SSR モードで利用する CloudFront です。

## プレビューモードの設定

Next.js のプレビューモードは cookie を Next.js に送って、それをもとにレスポンスを作成しています。
上記のホスティング方法では CloudFront はデフォルトでは cookie を受け付けないため、手動で変更する必要があります。

CloudFront へ移動し、 対象のディストリビューションを選択し以下のように 4つ のパスパターンそれぞれに、
`__prerender_bypass`, `__next_preview_data` の ２つの　cookie を許可するようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632997/624202e0-153f-a4f4-45bd-0201584411a8.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632997/7f0db348-605a-430d-7bac-983b2a214dca.png)

## できはするけど...

これでプレビューモードで記事などを見ることができるようになります！
しかし、欠点があります。

**デプロイのたびに上記の設定がリセットされてしまい、プレビューモードを利用する場合は再度 CloudFront の設定を行う必要があるのです。**

サポートにも問い合わせたのですが、 サポートの方の見解としては、 Next.js のプレビューモードは本来 Amplify では利用できないことになっております。

なので、上記のような対応は若干非公式で強引なやり方として受け取ってもらえるとありがたいです。
【Git】git pull時のNot possible to fast-forward, aborting.解消法

## 状況
`git pull`を実行した際に以下のように出力され、`git pull`を正常に実行できませんでした。

```:ターミナル
$ git pl origin main
From github.com:UserName/sample-app
 * branch            main       -> FETCH_HEAD
fatal: Not possible to fast-forward, aborting.
```
`git pull`を実行する前にローカルリポジトリを編集し、`commit`したことが原因のようです。

## 解消法
以下のように実行することで解消しました。
```:ターミナル
$ git pull --rebase origin main
```
上記のコマンドを実行することで`git fetch` + `git rebase`が実行されます。

`git pull`と`git pull --rebase`の違いについては以下のページをご参照ください。

https://kray.jp/blog/git-pull-rebase/
動的に表示したDOMに対してjQueryでfocus()する方法

jQueryの.focus()を使ってinputタグに自動的にマウスカーソルのフォーカスを当てようとしていたのだけれど、うまくいかない。
しかしこの方法で別のDOMに対してはfocusできていたので、jQueryのバージョンだとかそういう要因ではなさそうだった。

よく考えると今回フォーカスを当てたいDOMは普段は隠れていて、ボタンを押した時だけ出てくるミニモーダルの中のinputタグだった。このボタンを手動で押してミニモーダルを開いた場合には自動的にフォーカスが当たるのだけれど、それ以外の方法（今回は onclick → trigger("click")による自動？クリックでミニモーダルを出現させていた）では動作していないようだ。

<h1>解決した方法：</h1>
ミニモーダルをdisplay:blockなりで出現させてから.focusするまでにsetTimeoutで１００ミリ秒待つようにしたら普通に動いた。

<h1>ちなみに：</h1>
.focus（)だけじゃなく.select()もこの方法で動いた。
せっかくなので.focusを.trigger("focus")に変えておいたが、これは何の意味があるのだろうか。
[golang] Go言語は、map、slice、arrayは定数化出来ない仕様。では代用策は？

【参考資料】
- [Effective Go: Constants](https://go.dev/doc/effective_go#constants)
- [[Golang] array と slice と map を定数として使えない](https://tech.notti.link/02b52f2)
- [go - Declare a constant array - Stack Overflow](https://stackoverflow.com/questions/13137463/declare-a-constant-array)

【実行環境】
- Go for Windows:1.18

## 理由
定数として使えるのは「数字」「文字(runes含む)」「boolean」であり、定数はコンパイル時に生成されます。
対して配列やスライスはプログラム実行時に生成されます。

## 代用策

### 1:　[要素数]string(またはint){要素1,要素2,・・・}　形式で定義。
- Pros: 直観的で、行数も少なくて済む。  
- Cons: 結局は変数なので、簡単に内容が変更できてしまう。  
- (補) [要素数]のところは[...]でも良い。

コード例：
```main.go
var TestArray = [4]string{"Alpha","Bravo","Charlie","Delta"}
// ただし内容変更できてしまう
TestArray[3] = "Foxtrot"
fmt.Printf("%v \n", TestArray) // 結果：[Alpha Bravo Charlie Foxtrot]
```

### 2:　Getterメソッドのように関数として定義する。
- Pros: 関数を呼ぶだけなので扱いが楽になる。
- Cons: コード量が増加してしまう。変数のため変更可能なのは変わりはない。

コード例：
```main.go
const TM01 = "team1"
const TM02 = "team2"

func main() {
	fmt.Printf("%v \n", getArray(TM01))   // 結果[Alpha Bravo]
	fmt.Printf("%v \n", getArray(TM02))   // 結果[Charlie Delta]
}

func getArray(key string) []string {
	switch key {
	case TM01:
		return []string{"Alpha","Bravo"}
	case TM02:
		return []string{"Charlie","Delta"}
	default:
		return []string{}
	}
}
```

PHP脳になってしまうと、ついつい配列の定数化やin_array()などが思い浮かんでしまいますが、
静的型付け言語のおかげで目が覚めました。
JREが指定されてなくてjava servletの勉強になかなか辿り着けなかった話

環境
Eclipse Version: 2022-03 (4.23.0)
Tomcat v10.0
java version: "18.0.1.1" 2022-04-22
Java(TM) SE Runtime Environment (build 18.0.1.1+2-6)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.1.1+2-6, mixed mode, sharing)


やろうとしたこと
UdemyでJavaサーブレットの勉強をしようとサーブレットを作成したところ、java.io.IOExceptionがインポートできない状況になった。他にもインポートするライブラリが見つけられず動的webプロジェクトが動作しなかった。

解決方法
Eclipseのプロジェクトエクスプローラから、該当する動的webプロジェクトを右クリックしてプロパティを選択する。その後Java ビルドパス内のライブラリタブから、JRE System Libraryを選択して編集をクリックする。Alternate JREでJREのバージョンを選択して適用することで解決した。

未解決事項
Eclipseの設定が間違っているのか、動的webプロジェクトを作成する際には毎回上記の手続きを行わなければならないです。対処方法をご存知の方は教えて頂けると嬉しいです。

参考（ほぼここに書いてあった手順通り）
https://stackoverflow.com/questions/19696613/getting-jre-system-library-unbound-error-in-build-path
PowerShellでExcelを開く

# PowerShellでExcelを開く

問題がいくつかある。

1.ファイルをフルパスで指定する必要がある。
2.オブジェクト操作には入力支援が使えない
3.New-Objectに対応するRelease-Objectがない。

エクセルオブジェクトのジャグリングは一度VBAで記述してから
PowerShellに移植するほうが簡単なのかもしれない。

```PowerShell:openExcel.ps1
$xlfile = "C:\Users\setsu\powershell\aaa.xlsx"

$xl = New-Object -ComObject Excel.Application

$wb = $xl.Workbooks.Open($xlfile)

$ws = $wb.Worksheets.Item("Alpha")

Write-Host $ws.Cells.Item(1,1).Text

$wb.close()

$xl.quit()

#release-object($xl)
[void][system.runtime.interopservices.marshal]::FinalReleaseComObject($xl)
```


# Release-Objectの代替

Release-Refを定義して使用するか、

```PowerShell
function Release-Ref ($ref) {
[System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) | out-null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
```
または

```PowerShell
[System.Runtime.InteropServices.Marshal]::ReleaseComObject( $ref )
```
を使用する。
関数はスクリプトの前後に配置して記述してよい。
明示的に呼び出さない限り定義された関数は実行されない。
AUTOSAR R22-11 春のDemonstratorに期待

AUTOSAR Adaptive Platformの実際に動くコードでの実演は、2020番から翌年の春に改定がある。

R22-11も、たぶん春に改定があるはず。　

くわえて、AOC2022では、Demonstratorについての発表がなかったが、　
AOC2023では予定したいという関係者の希望表明があった。　

実際、AOC2021が一般公開になり、AUTOSARの方向性が、これまでのClosedな姿勢から、　
Openな姿勢に切り替わったことがわかる。　

日本の地域代表にDensoの方が就任されたのも、おおきな変化だろう。　

Adaptive PlatformのDemonstratorのほとんどがOpen Sourceからなり、　
BMWがはじめた　車載Linuxでもオープンソースで公開しており、　
BMWとBroadCOMがやっている、車載Ethernetでも、オープンソースの成果が出ようとしている。　

Tesraが、Linuxの改良部分の公開をどれだけしているかは確かめていない。　
Linuxの改良部分の公開度を判定するためにも、社外取締役になろうという意思を表明している。　

社外取締役はいかがでしょう 

https://qiita.com/kaizen_nagoya/items/a77a81da08b17194699f
Demonstrator Design of Functional Cluster Diagnostics, No.844, AUTOSAR 21-11 (328) CP

Demonstrator Design of Functional Cluster Diagnostics, No.844, 

検索中

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)





# 文書履歴(document history)
ver. 0.01 初稿 20220607
Mokurenをメジャーアップデートした理由【個人開発】


個人開発のアプリを育てるのって難しくないですか?

最近、個人開発のアプリを**Version2**にしました。
そのためにどんなことをやったかを書きます。
同じく個人開発をしている人や、エンジニアの方に届けば幸いです。

# MokurenというChrome拡張を作っています。

まず、どんなアプリを作ってるか紹介させてください！


GitHubを使っている方は多いと思います。
仕事等でアクティブに使ってる人ならわかってくれると思うのですが、気づいたらIssueタブばかりになりませんか?
僕はひどい時、こんな感じになっていました。

![スクリーンショット 2022-06-07 22.15.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195882/c9758932-842a-755e-26dd-d7c64a385da0.png)

Issueを見る時に別タブで開いちゃうんです。
でもタブ移動の時間を考えると結構な時間ロスになっていますし、ストレスも結構ありますよね。
Mokurenを使えば**Issueをサイドバー**で開くことができます！
つまり、1つのタブで今までとまったく同じことができます。
しかも**ログインなしで**

⏬⏬⏬MokurenをインストールしたIssueの画面⏬⏬⏬
![スクリーンショット 2022-06-07 22.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195882/2fd75c64-2732-1ace-5f87-568ef63eea23.png)

今すぐインストールできます

https://chrome.google.com/webstore/detail/mokuren-20-for-github/nikennffbfoadbajdgnhlngjahofhdef?hl=ja&authuser=3


# Version1ではログイン離脱が多かった

Version1でもサイドバーで開く機能はありました。
ではVersion1の何が良くなかったのでしょうか。

GitHubの情報をChrome拡張が取得するため、GitHubログインが必要でした。

(GitHubのログイン画面)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195882/30665773-c940-3438-ebdc-b144aae0adf8.png" width=400/>


でもGitHubログインって不安ですよね?セキュリティ的に怖い。
**だからログインで離脱する人が多かったのです。**

もちろん安全な実装はしていたけど、ユーザーにとっては不安は消えない。
「せっかくよさそうなプロダクトだから使いたい」と言ってくれる方もいました。
それなのに、ログインすらできないなんて...
だから**ログインなしでも使える**方法にしました。

# Version2ではログインが必要ない！

**Version2ではログインせず、すぐに使えるようにしました！**
もちろんVersion 1.0ほどサイドバーに最適化されてないけど、今までの業務効率を格段に上げられるようにはしました。
ここらへんのどういった技術を使ってるかの記事も書こうかなと考えています。
もし需要があれば書こうと思うのでこの記事のLGTMで教えてください！

Version2はリリースして日が浅いですが、既に好反応のお声をいただいています！
やはりログインなしはユーザーにとって安心だし、使いやすい！
やってよかったと思っています

# ありがとう

旧Mokurenの時代から含め、使ってくれてる方はもう一年以上も使ってくださってる方もいます。
さらにはあたたかいフィードバックをいただき、本当に感謝しかないです。

MokurenのユーザーさんとTwitterで繋がれるのが何よりも嬉しいです。
たまに個人開発や技術周り、プロダクトの伸ばし方なども発信しています。
よかったらここからTwitterでわたしをフォローしてください!

[@imasiroo](https://twitter.com/imasirooo)

また、Mokurenは友人と一緒に開発しています。
最高のプロダクトをありがとう。

[@uesholib](https://twitter.com/uesholib)
[@buzou_muzou](https://twitter.com/buzou_muzou)


# 有料化、考えています

個人開発とはいえ、運用にもお金がかかります。
Mokurenの改良を続けていくためにも、有料化を検討しています。

もしMokurenに興味を持っていただけたら、ぜひ今のうちにインストールしてください！
騙されたと思って1日使ってみて！
そしてぜひフィードバックをください！！

https://chrome.google.com/webstore/detail/mokuren-20-for-github/nikennffbfoadbajdgnhlngjahofhdef?hl=ja&authuser=3

最後までありがとうございました😊
【pandas】1行ずつ追加するときのスマートな書き方

# 前提
データ加工や分析でお世話になるPythonのライブラリ「pandas」。
「__forループで処理した結果を1行ずつ格納したデータフレームを作成する__」
ということはよくある（と思う）のだが、なかなかスマートな書き方が分からない。

例えば以下のような感じ。

```py
dic = {'i': [], 'i^2': [], 'i^3': [], 'i^4': []}

for i in range(10):
    dic['i'].append(i)
    dic['i^2'].append(i**2)
    dic['i^3'].append(i**3)
    dic['i^4'].append(i**4)

df = pd.DataFrame(dic)
```

上のコードは

|i|i^2|i^3|i^4|
|-|-|-|-|
0|0|0|0|
1|1|1|1|
2|4|8|16|
3|9|27|81|
4|16|64|256|
5|25|125|625|
6|36|216|1296|
7|49|343|2401|
8|64|512|4096|
9|81|729|6561

のようなデータフレームを作成するものだが、append()を4回も書くのがしんどい。
4回ぐらいなら許せるかもしれないが、これが仮に __100列とかになったら・・・__

本記事では、このようなコードをいかにスマートに書くかを考えてみる。

なお、処理速度に関しては[こちらの記事](https://qiita.com/studio_haneya/items/35951c56decd212ba41e)で議論されているのでそちらを参照されたい。

同記事に記載の通り、「作っておいたデータフレームに1行ずつ追加する」よりも「__各列をリストとして作っておき、最後にデータフレーム化する__」ほうが高速らしいので、本記事ではこちらの方法を採用する。

# 書き方いろいろ
## for文でappend

```py
keys = ['i', 'i^2', 'i^3', 'i^4']
dic = {key: [] for key in keys}

for i in range(10):
    values = [i, i**2, i**3, i**4]
    for key, value in zip(keys, values):
        dic[key].append(value)

df = pd.DataFrame(dic)
```
列名を変数`keys`、要素を`values`とおき、for文化してみた。
append()を書くのが1回で済み、すっきりした印象。
ただ、リストの順番をしっかりチェックしないと、意図しないデータが入れられてしまうかもしれない。

```py
### 意図しない挙動をするパターン ###
keys = ['i', 'i^2', 'i^3', 'i^4']
dic = {key: [] for key in keys}

for i in range(10):
    values = [i, i**3, i**2, i**4] # 順番間違い
    for key, value in zip(keys, values):
        dic[key].append(value) # i^2の列にi**3が入ってしまう

df = pd.DataFrame(dic)
```
こういうことを防ぐためにも、列名と追加する要素の対応が見やすいほうがよい。

## ループ中に対応表を記述した上で、for文でappend
```py
keys = ['i', 'i^2', 'i^3', 'i^4']
dic = {key: [] for key in keys}

for i in range(10):
    append_data = {
        'i': i,
        'i^2': i**2,
        'i^3': i**3,
        'i^4': i**4
    }
    for key in keys:
        dic[key].append(append_data[key])

df = pd.DataFrame(dic)
```
列名と追加する要素の対応が見やすい。

## 辞書に一括appendする関数を作る
```py
def multi_append(dic, **kwargs):
    # dic[列名].append(要素)を一括で行う
    for arg in kwargs:
        dic[arg].append(kwargs[arg])
        
dic = {key: [] for key in ['i', 'i^2', 'i^3', 'i^4']}
for i in range(10):
    multi_append(dic, **{'i': i, 'i^2': i**2, 'i^3': i**3, 'i^4': i**4})

df = pd.DataFrame(dic)
```
上とほとんど同じことだが、appendの処理を関数`multi_append()`にまとめることもできる。

`multi_append()`は以下のように書いてもよい。

```py
def multi_append(dic, **kwargs):
    # dic[列名].append(要素)を一括で行う
    for arg in dic: # argをdicのほうから取り出す
        dic[arg].append(kwargs[arg])
```
上のように列名を辞書の方から取り出すようにしておけば、
multi_append()の引数を指定し忘れたときに例外を投げてくれる。

# まとめ
記述量が少なく、かつ可読性も高いコードが書ければ最高。
ぱっと思いつくものを挙げてみたが、もっとスマートに書く方法があれば是非ご教授ください。
Kubernetes構成入門①

ECSや他のコンテナオーケストレーションツールを使っているとKubernetesの基礎を忘れがちなのでメモとして残します。

# コンポーネント
マスターノードとワーカーノードでクラスタが構成される。
コンテナをワーカーノードのコンテナランタイムで動かす。
大きく分けてコントロールプレーンとノードがある。
| 名前 | 役割 |
|:-:|:-:|
| ControlPlanes  |  Masterノードとも呼ばれる。クラスタ全体の動作を担う。 |
| Nodes  |  Workerノード。実際にコンテナが動作する環境。 |

### Control Plane
- kube-api-server
    - API server。KubernetesのクラスターはAPIを介して動作する
- kube-scheduler
    - Podをワーカーノードに割り当てる
- cloud-controller-manager
    - クラウド(AWS/GCP)の機能と連携
- kube-controller-manager
    - クラスタの操作全般を担当する
    - Pod起動、障害検知など
- etcd
    - クラスタ情報の保存場所。
    - key/valueストア

### Nodes
- kubelet
    - 各ノードで実行されるエージェント
    - マスターノードと通信する
- kube-proxy
    - NodeのNetworkルールを追加・削除・変更
- コンテナランタイム
    - コンテナを実行するためのソフトウェア
PowerShellメモ

# PowerShellの文

PowerShellの式を改行すると文となる。
PowerShellの式が文となり値を持つ場合はそれがコンソールに出力される。
このとき単純にコンソールに値を出力するだけであれば特別な出力コマンドレットを使用する必要はない。

以下はミニマリスト的なPowerShellのHello Worldである。

```PowerShell:hello.ps1
"hello"
```
PowerShellのスクリプトに渡された引数にアクセスするには$args[]配列を使用する。

$args[]は配列なので0から始まり自分のスクリプト名自身は含まれない。
引数の数を調べるには **.Length** プロパティを使用する。

```PowerShell:hello.ps1
"hello"
$args.Length
$args[0]
$args[1]
$args[2]
"world"
```

一方でより柔軟に引数を扱えるParamsもある。
これについては後報する。
Overview of Acceptance Tests, No.643, AUTOSAR 21-11 (325) CP

Overview of Acceptance Tests, No.643, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/tests/1-2/AUTOSAR_EXP_AcceptanceTestsOverview.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|ATS |Acceptance Test Specification
|IUT |Implementation Under Test (see ISO/IEC 9646-1)
|PCO |Point of Control and Observation (see ISO/IEC 9646-1)
|SUT |System Under Test (see ISO/IEC 9646-1)
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

no



# 文書履歴(document history)
ver. 0.01 初稿 20220607
Requirements on  Acceptance Tests, No.608, AUTOSAR 21-11 (324) CP

Requirements on  Acceptance Tests, No.608, 2021-11

https://www.autosar.org/fileadmin/standards/tests/1-2/AUTOSAR_ATR_Requirements.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|:--|
|SHALL| This word means that the definition is an absolute requirement of the specification.
| SHALL NOT| This phrase means that the definition is an absolute prohibition of the specification.
| MUST| This word means that the definition is an absolute requirement of the specification due to legal issues.
|MUST NOT| This phrase means that the definition is an absolute prohibition of the specification due to legal constraints.
| SHOULD| This word, or the adjective "RECOMMENDED", mean that there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course.
|SHOULD NOT| This phrase, or the phrase "NOT RECOMMENDED" mean that there may exist valid reasons in particular circumstances when the particular behavior is acceptable or even useful, but the full implications should be understood and the case carefully weighed before implementing any behavior described with this label.
| MAY| This word, or the adjective „OPTIONAL“, means that an item is truly optional. One vendor may choose to include the item because a particular marketplace requires it or because the vendor feels that it enhances the product while another vendor may omit the same item. An implementation, which does not include a particular option, MUST be prepared to interoperate with another implementation, which does include the option, though perhaps with reduced functionality. In the same vein an implementation, which does include a particular option, MUST be prepared to interoperate with another implementation, which does not include the option (except, of course, for the feature the option provides.)


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
[2] Glossary, AUTOSAR_TR_Glossary.pdf
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf


# 文書履歴(document history)
ver. 0.01 初稿 20220607
SwiftUIでViewの背景をぼかす

iOS15から`background`モディファイアを使って簡単に背景をぼかすことができたので、その紹介です。

|ライトモードの場合|ダークモードの場合|
|:-:|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/2f1c8899-5ff5-85d3-731a-4dee53413dcf.png">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/ded29207-601d-3b12-291d-687b72214e84.png">|

やることは`background`モディファイアにぼかし度合いを設定するだけ。

```swift
Text(".ultraThinMaterial")
    .frame(width: 200, height: 100)
    .background(.ultraThinMaterial)  // 極薄のぼかし
```

こうすることで、表にくるView(上記の例ではText)と背景のViewの間にすりガラスのようなレイヤーが挟まり、ぼかし効果が得られます。

ぼかし度合いは上記のスクショの５種類の他にツールバーと同じぼかし効果を得る設定があります（この動作は未確認）。

参考URL：
* [Appleドキュメント - Material](https://developer.apple.com/documentation/swiftui/material)
* [StackOverFlow - Is there a method to blur a background in SwiftUI?](https://stackoverflow.com/questions/56610957/is-there-a-method-to-blur-a-background-in-swiftui)
[備忘録]Docker環境でコーディングしたい

備忘録です。
Docker環境を構築したものの、その環境でプログラミングするには？どのフォルダにコーディングファイルを配置するんだ？となっているので、書き留めます
気が向いたら内容整理します。


<h2>目的</h2>
Docker環境でプログラミングしたい
.pyファイル（Pythonファイル）を実行したい

<h2>下準備</h2>
Docker環境を構築する
→




<h2>参考文献</h2>
【VScodeプラグイン Remote Containers解説】Docker×docker-compose開発で必須


https://niwakatech.info/vs-code-docker/
Feature Specification of the Acceptance Tests, No.607, AUTOSAR 21-11 (323) CP

Feature Specification of the Acceptance Tests, No.607, 2021-11

https://www.autosar.org/fileadmin/standards/tests/1-2/AUTOSAR_ATR_Features.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|SUT| System Under Test
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

no



# 文書履歴(document history)
ver. 0.01 初稿 20220607
Methodology for Classic Platform, No.68, AUTOSAR 21-11 (322) CP

Methodology for Classic Platform, No.68, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_TR_Methodology.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|ECU|Electronic Control Unit(in CP context often used as synonym for a single instantiation of a CP stack)
|OEM| Original Equipment Manufacturer
|VFB| Virtual Functional Bus

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Requirements on Methodology for Classic and Adaptive Platform
AUTOSAR_RS_Methodology
[2] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[3] Software Process Engineering Meta-Model Specification
http://www.omg.org/spec/SPEM/2.0/
[4] Integration of Franca IDL Software Component Descriptions
AUTOSAR_TR_FrancaIntegration
[5] Virtual Functional Bus
AUTOSAR_EXP_VFB
[6] Software Component Template
AUTOSAR_TPS_SoftwareComponentTemplate
[7] System Template
AUTOSAR_TPS_SystemTemplate
[8] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral
[9] General Specification of Transformers
AUTOSAR_ASWS_TransformerGeneral
[10] Basic Software Module Description Template
AUTOSAR_TPS_BSWModuleDescriptionTemplate
[11] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration
[12] Specification of Memory Mapping
AUTOSAR_SWS_MemoryMapping
[13] Specification of Compiler Abstraction
AUTOSAR_SWS_CompilerAbstraction
[14] Specification of Module E2E Transformer
AUTOSAR_SWS_E2ETransformer
[15] Diagnostic Extract Template
AUTOSAR_TPS_DiagnosticExtractTemplate
[16] Specification of RTE Software
AUTOSAR_SWS_RTE
[17] Specification of Safety Extensions
AUTOSAR_TPS_SafetyExtensions
[18] ISO 26262:2018 (all parts) – Road vehicles – Functional Safety
http://www.iso.org
[19] Generic Structure Template
AUTOSAR_TPS_GenericStructureTemplate
[20] Specification of ECU Resource Template
AUTOSAR_TPS_ECUResourceTemplate



# 文書履歴(document history)
ver. 0.01 初稿 20220607
Linuxコマンド備忘録

Linuxコマンドについての備忘録(常時更新していく)

# ファイル操作系
## chmod
 ファイルやディレクトリのアクセス権を変更する

```
例
chmod 777 -R /var/log
　  -R : 指定したディレクトリ配下も変更する
```
## chown
 ファイルやディレクトリの所有者を変更する

```
例
chown -R root:root /var/log
  -R : 指定したディレクトリ配下も変更する
```
## df, du
ディスク全体の容量表示 df
ディレクトリ単位での容量表示 du

```
例
df -h
du -sh /var/log/*

```

## df
 容量確認

 

# yum 系

# curl 系

# viコマンド系
今更ながら ランチャー ってなに？

## 勉強前イメージ

聞いたことはあるんだけどなぁ・・・・スマホとかで見る気がする

## 調査

### ランチャー とは

アプリケーションやソフトをアイコンで表示し、簡単に起動・実行できるようにする機能のこと。
GUIでの利便性を高めるものとしてデスクトップに表示され、すぐに表示できる。

windowsとMacOSでは標準で搭載されており
windowsではクイックツールバー だったり、 MacOSではDock という名前で用意されています。

スマホでもランチャーアプリといって、アプリの表示方法を変えるものなど存在します。
同様に、PCでもランチャーアプリは存在します。

## 勉強後イメージ

あーなるほど、なんか正直タイトルにするようなもんでもなかったけどw

## 参考

- [ランチャ 【launcher】](https://e-words.jp/w/%E3%83%A9%E3%83%B3%E3%83%81%E3%83%A3.html)
- [「ランチャーアプリ（英語: launcher app）」とは #IT用語辞典 #ランチャーアプリを使わないと人生で損をする](https://smatu.net/2020/12/21/launcher-application-meaning-of-the-it-word/)
【Laravel】すべてのはじまりはどこから？

なんとなく使っているけど、Laravelのライフサイクルってちゃんと理解できていないな？

# 起点

>Laravelではすべての処理の始まりが/public/index.phpのファイルになるので、WEBサーバの設定でどのURLに対するリクエストでも、全て/public/index.phpにリダイレクトするようになっています


https://qiita.com/minato-naka/items/f05b023950ce544a8bec

# デバッグ

ブレークポイントを/public/index.phpに設定すると、絶対動くファイルなのでデバッグがうまくいっているのか確認するのに便利:sparkles:
pymongoを使う

# まずすること
```sh
 pip install pymongo
```
[mongodb](https://www.mongodb.com)にアクセスしてアカウント作成。

## Databaseを立てる
[mongodb](https://www.mongodb.com)の左のメニューから`database`を選択して`Build a database`をクリック。
`shared`を選択して、名前を`Cluster0`から好きな名前に変更し、`create`をクリック。
そしたら、`quick start`に飛ぶので`username`と`password`に好きな値を入れる。
このuserとpasswordは後に使うのでメモしておいてください。
`create user`をクリック。
`network access`をクリックして、`add ip address`をクリック。
`connect from anywhere`を選択して追加。
`database`に戻り、`connect`をクリックし、
`connect your application`を選択。
`Python`を選択し、下に出てくるアドレスをコピー。
`<password>`のところを先程のパスワードに置き換えて、replitなら`secret`に入れる。
## コード
```py
import pymongo
from pymongo import MongoClient
import os
class DataBase(object):
  def __init__(self):
    self.client=MongoClient(os.getenv("client"))
    self.db=self.client['test']
  #def …………
```
cookieの確認方法 googlechrome

１
グーグルクロームの右上のタブから　”設定”　をクリック

２
”プライバシーとセキュリティ”　をクリック

３
”サイトの設定”　をクリック

４
”cookieとサイトデータ”　をクリック

５
”すべてのcookieとサイトデータを表示”　をクリック

６
グーグルクロームに保存されているcookie一覧が表示される
自分が知りたいクッキーを調べることができる
【JSTQB FL】レビュータイプの整理

# はじめに
JSTQBのレビュータイプがとてもとても紛らわしかったのでまとめます．


## レビュータイプ
- 非形式的レビュー
- ウォークスルー
- テクニカルレビュー
- インスペクション

## 形式的度合い
**非形式的**
1. 非形式的レビュー
1. ウォークスルー
1. テクニカルレビュー
1. インスペクション
**形式的**

## 主な目的
### それぞれの特徴
|レビュータイプ|特徴|
|--|--|
|非形式的レビュー|「潜在的な欠陥の検出」のみ|
|ウォークスルー|唯一「潜在的な欠陥の検出」が主な目的にない|
|テクニカルレビュー|合意の獲得！|
|インスペクション|信頼の積み上げ，将来に向けての取り組み|

### 主な目的表

![主な目的.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/9020bdbd-35ca-951c-83c1-71cffbddcb97.png)

## その他目的
### それぞれの特徴
|レビュータイプ|特徴|
|--|--|
|非形式的レビュー|新しいアイデア，小規模迅速解決|
|ウォークスルー|アイデアの交換，トレーニング|
|テクニカルレビュー|信頼の積み上げ，異なる実装検討|
|インスペクション|ソフトウェア開発プロセスの改善！|

### その他の目的表
![その他の目的.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/fd178885-497e-e238-e8be-5e03c60d831e.png)

## 文章化，チェックリスト，書記
|レビュータイプ|文章化|チェックリスト|書記|
|--|--|--|--|
|非形式的レビュー|することもある|任意|記載なし|
|ウォークスルー|する|任意|必須|
|テクニカルレビュー|する|状況次第|必須(理想は作成者以外)|
|インスペクション|する|記載なし|必須|

## レビューミーティング
|レビュータイプ|レビューミーティング|
|--|--|
|非形式的レビュー|行わないことがある|
|ウォークスルー|する|
|テクニカルレビュー|開催は任意|
|インスペクション|する|

## ファシリテーター
|レビュータイプ|ファシリテーター|
|--|--|
|非形式的レビュー|記載なし|
|ウォークスルー|作業成果物の作成者（典型的には）|
|テクニカルレビュー|経験を積んだファシリテーター（作成者ではない）が理想|
|インスペクション|経験を積んだ進行役（作成者ではない）|

## レビューミーティング前の準備
|レビュータイプ|レビューミーティング前の準備|
|--|--|
|非形式的レビュー|記載なし|
|ウォークスルー|レビューミーティング前の個々のレビューアによる準備は任意|
|テクニカルレビュー|レビューミーティング前に個々のレビューアが準備する|
|インスペクション|レビューミーティング前に個々のレビューアが準備する|

## レビューア
|レビュータイプ|レビューア|
|--|--|
|非形式的レビュー|作成者の同僚（バディチェック）やその他の人|
|ウォークスルー|記載なし|
|テクニカルレビュー|作成者の技術領域の同僚，技術分野が同じまたは別の専門家|
|インスペクション|作成者の同僚，作業成果物に関する別の専門家|


## 参考文献
- [JSTQBシラバス](https://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018V31.J03.pdf)
【PHP】デバッグがしたいよ～！

VSCodeでLaravelのプロジェクトを扱っています。
PHPのデバッグがしたい！

# やることリスト

1. Xdebug のインストール
1. PHP Debug のインストール
1. launch.json の作成
1. php.ini の編集

# 1.Xdebug のインストール

## Xdebugとは
- PHPのエクステンション
    - エクステンション：コンパイルしてPHP環境にインストールするもの
- PHPのデバッグ用の拡張モジュール
    - モジュール：機能単位、交換可能な構成部分などを意味する英単語。部品ってイメージでOK

## 現在使用しているPHPにXdebugが入っているか確認する

1. Laravelのプロジェクト内、public/index.php（処理の起点）と同じ階層にphpinfo.phpファイルを作成
   ```php:phpinfo.php
     <?php
       phpinfo( );
     ?>
   ```

2. ウェブサイトのドメインの末尾に/phpinfo.phpと入力して、phpinfoページにアクセスする
こんな感じのページがでてくるよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524160/d6755116-30cf-ffa8-c6a2-426882fff2f6.png)

3. phpinfoページ内を検索して、「xdebug」の項目があればOK！
なかったときのインストール手順はこれから勉強予定:joy:

参考：

https://kinsta.com/jp/knowledgebase/phpinfo/

# 2.PHP Debug のインストール

VScodeの拡張機能で「PHP Debug」を検索＆インストール

# 3.launch.json の作成

## launch.jsonとは
VSCodeでデバッグ実行するための設定ファイル

## launch.json の作成

https://amateur-engineer-blog.com/vscode-launchjson/#:~:text=Copy-,launch.json%E3%81%AE%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95,%E3%81%BE%E3%81%99%E3%80%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

# 4.php.ini の編集

## php.iniとは？
PHPプログラムの全体的な動作や環境を設定するファイル

## Xdebugのバージョンを確認する
どっちのやり方でもOK！
- phpinfoページにアクセスして確認
- docker（PHP）のコマンドラインにて、以下のコマンドを実行
```sh
# php -v
Cannot load Xdebug - it was already loaded
PHP 7.2.33 (cli) (built: Sep 10 2020 15:18:34) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v3.0.2, Copyright (c) 2002-2021, by Derick Rethans
```

## Xdebugのバージョンにあわせてphp.iniを編集

https://pleiades.io/help/phpstorm/configuring-xdebug.html#on_demand_mode
テスト67

```vb
Sub shName_Check()
'Excelファイルを開かずにシート名のチェック...〆(･ω･ )ﾒﾓﾒﾓ

Dim str As String
Dim sh_Name As String

str = "C:\Users\User\Desktop\VBA練習\test.xlsx"

sh_Name = "テスト1"

If Getsh_Name(str, sh_Name) = False Then

    MsgBox Dir(str) & "に" & sh_Name & "シートがありません。確認をお願いします。", vbCritical, "確認"
    End
    
End If


End Sub

Function Getsh_Name(ByVal str_path As String, _
                                  ByVal sh_Name As String) As Boolean

Dim cn As Object
Dim rs As Object
Getsh_Name = False

Set cn = CreateObject("ADODB.Connection")

cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & _
         "Data Source=" & str_path & ";" & _
         "Extended Properties=Excel 12.0;")
            
Set rs = cn.OpenSchema(20)

Do Until rs.EOF
    
    If InStr(rs.Fields("TABLE_NAME").Value, sh_Name) > 0 Then
    
        Getsh_Name = True
    
    End If
    
    rs.MoveNext
    
Loop

rs.Close
Set rs = Nothing

cn.Close
Set cn = Nothing

End Function
おうちkubernetes構築記③　Kubernetesの設定

### おうちkubernetesの構築した記録全3回のうちの3回目となります。
### ※この内容は、masterノード / workerノード別々の設定を行います。


## 環境
 #### S/W
  -  OS　　　　　： Ubuntu22.04
  -  docker　　　　: 20.10.12
  -  kubernetes　　: 1.24.1
  -  terterm　　　 ：4.106

#### H/W
  - 本体　　　　　：rasberry Pi4 8GB × 2
  - ルータ　　　　：LINKSYS 5PORT
  - SDカード　　　：64GB


## 1. masterノードの設定
1)以下のコマンドを実行し、super userに切り替える。
```
$ sudo -s
```

2）以下のコマンドを実行し、kubeadmを初期化する。
```
$ kubeadm init --cri-socket=/run/containerd/containerd.sock --pod-network-cidr=10.244.0.0/16
```
※大体4分程度で終わる。

3）以下の画面が表示されたら、初期処理は正常終了となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/367337b1-d7db-6126-de9f-96d44d5ab702.png)
※赤枠の内容は、workerノードの設定で必要となるので、メモ帳などにコピっておく。

4）以下のコマンドを実行し、super userを解除する。
```
$ exit
```

5）以下のコマンドを実行し、kubernetesを管理するローカルユーザに.kubeフォルダを作成する。
```
$ mkdir $HOME/.kube
```

6）以下のコマンドを実行し、/etc/kubernetesフォルダから、admin.confファイルをconfigファイルとしてコピーする。
```
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
```

7）以下のコマンドを実行し、confファイルの所有ユーザと所有グループをkubernetes管理ユーザに変更する。
```
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

8）以下のコマンドを実行し、flannelのインストールを行う。
```
$ sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

9）以下の内容が表示されたら、正常にインストールされたことになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/a2c8d502-4ac3-3f40-b0e1-6157c3bb1abc.png)

10）以下のコマンドを実行し、masterノードのSTATUSがReadyになっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/c5704c90-f15c-8694-a515-e0e007828062.png)

以上で、masterノードの設定は終了となります。

## 2. workerノードの設定
1）TerTermでWorkerノードにアクセスする。

2）masterノードの設定3)で表示された赤枠の内容をTerTermに張り付ける。
```
$kubeadm join 192.168.2.119:6443 --token jurzc4.3m2lo7ieys961uve \
        --discovery-token-ca-cert-hash sha256:1bc3587ff15fb92bf0bbbb35289306b691bbaf17ef58f42a8673207eb3aea205
```

3）しばらく待つ。

4）以下の内容が表示されたら、設定終了となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/7e7be95f-5bb8-65d6-0d44-7d98aeb49474.png)

以上で、workerノードの設定は終了です！はや！


## 3. 動作検証
1）TerTermでmasterノードにアクセスする。

2）以下のコマンドを実行し、連携されているnodeを確認する。
```
$ kubectl get node
```

3）以下の内容が表示されたら、正常にmasterノードがworkerノードを認識していることとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/e2c978a5-b267-b35c-3112-63079f9ecbe1.png)
※workerノードが、Not Readyになっているのは、Readyに変更されるまで少し時間が掛かったためです。
このあと、正常にReadyに変わりましたｗｗｗｗ

以上で、masterノードとworkerノードの設定は終了となります。

これで、3回にわたって投稿したkubernetesインストール手順は終了となります。
次回は、kubernetesインストールで躓いた点を投稿したいと思います。

では！
【AWS SES】エラーEmail address is not verified. The following identities failed the check in  region

## 現状
Laravelでメール機能を、メールサーバーにSESを使用しメール送信を実際にしたところ下記のエラー


```
Email address is not verified. The following identities failed the check in 
region AP-NORTHEAST-1: \"サービス名\" <送信元メアド>, (サービス名) <送信元メアド> 
- <ErrorResponse xmlns=\"http://ses.amazonaws.com/doc/2010-12-01/\">
```

## 解決法

送信元のメアドをSESで検証したメアドに変更する。

SESで検証したメアド**からのみ**送信でき、サンドボックス外に設定して制限がなくなるのは**送信したいメアド**。

## 参考

https://bbh.bz/2019/08/31/ses-not-verified-err/
moviepyで出力した動画をアップロードすると音が消えてしまう問題

:::note alert
この記事の内容は、イーロン・マスク氏率いるX社の横暴により、2024年8月現在無価値なものとなっています。
:::

# 動画の一部を切り出すスクリプトを書いた

moviepyを使っています。手始めに開始後10～20秒を切り出してみます。

```python:videocut.py
import sys
import moviepy.editor as mp

for filename in sys.argv[1:]:
    clip_in = mp.VideoFileClip(filename).subclip(10, 20)
    clip_in.write_videofile('./outtest3.mp4')
    clip_in.close()
```

実行します。

```
python videocut.py MY_MOVIE.mp4
```

# 音が出ない

ローカルでは音が出ましたが、Twitterにアップロードしたら音が出なくなりました。

確認できていませんが、一部の動画プレイヤーでも音が出ない問題の発生する場合があるとのこと。

# どうすればよかったのか

`VideoFileClip#write_videofile()` の `audio_codec` は、未指定の場合は *libmp3lame* が選択されるようです。
上記スクリプトを実行すると、中間ファイルとしてmp3ファイルが出力されていたのがわかると思います。

ということで、 `audio_codec` に違うのを指定してやればOKです。

```python:videocut.py
import sys
import moviepy.editor as mp

for filename in sys.argv[1:]:
    clip_in = mp.VideoFileClip(filename).subclip(10, 20)
    clip_in.write_videofile('./outtest3.mp4', audio_codec = 'aac')
    clip_in.close()
```

なお、コーデックの違いについては、AACが比較的新しい規格だということくらいしか知りませんし、今のところ調べる気もありません。このあたりの説明は詳しい人に委ねます。
未経験からエンジニアに転職して1年が経った振り返り


## はじめに

2021年7月からにエンジニアに転職して早1年が経とうとしています。

この1年でどのように自分が変化したのか、何がまだまだ足りていないのかを
自信の振り返りの為にも書き綴りたいと思いました。

まず率直な感想としては
「1年では自分がエンジニアだと自信をもって言えない」です。

その理由や詳細については順を追ってお話したいと思います。




### 入社前
営業やコールセンターなど、日本語をちゃんと話せれば誰でもできる仕事をふらふらとしていました。友人がエンジニア転職して、辛いながらも充実した生活を送っているのを知って、興味が湧きエン転職に登録しました。

当初は開発とかインフラとかそういった基本的なIT知識もありませんでした。(今もだがｗ)
当たり前のように「未経験からエンジニアへ！」みたいなキャッチフレーズの企業に応募しまくりました。

5社くらい受けて3社と面接し2社内定が決まりました。
一つは穏やかな雰囲気の会社、もう一つは割とスパルタな感じの会社。

まよわずスパルタを選びました。
20歳くらいのころにフィリピンにスパルタ英語留学をしていたので、その影響があったのかもしれませんｗ

### 2カ月の研修
実際入ってみてスパルタでした。
研修初日にいきなりコードを書かされましたｗ

事前学習の課題が出ていたものの、よくわからずパラパラと呼んでいただけでした。(やさしいJava)
当たり前に10問中0点でしたｗ

初日でもう挫折しそうでした・・・
実際、他の研修生で2日目で辞めていく人がちらほらいましたｗ

「こりゃ完全にエンジニア舐めてたわ・・・」

22歳くらいの自分ならすぐに辞めていました。
でも当時は27歳。

当初は3年働いて手に職つけようと意気込んでいたのでさすがに逃げませんでした。

#### 魅力的な講師
毎日8時間くらい自己学習をしていました。
質問したい時だけ研修講師に聞きにいくスタイルでした。

質問しない人は、どんどん辞めていきました。
逆に質問を積極的にできる人は生き残っていました。

それに途中から気づき、自分も質問しだすようになりました。
質問の仕方がめちゃくちゃでしたがｗ

質問すれば講師陣はとてもウェルカムで熱心に教えてくれました。
今でもとても感謝しています。

なんだかんだありましたが(なんやそれｗ)
なんとか研修クリアして初現場決まりました。

ここでエンジニア業界の闇も知りましたw

### 初現場入場
幸いなことに先輩がいる現場に入場することができました。
しかも同期と共に！

当時は先輩から色んなことを吸収して、いち早く成長してやるぜ！という気持ちでした。
しかし実際に業務についてみると、辛いことばかりでした・・・


### 何を言っているの？
まず、プロパーさんや先輩が話している用語やワードについていけない！
MTGで何を話しているのか意味不明なので、ニコニコ愛想打つことしかできませんでした。
下手に会話に入っていったら、見当違いな発言をして信用を失ってしまいますからねーｗ


### エクセルが使えない
研修で習ったことを活かして、ガンガンコード書くぞー！と思っていた矢先、
振られたタスクはエクセルを使った資料作成や修正業務。

えっとコピペくらいしか知らない・・・
エクセルの行追加ってどうやってやるの？

本当にこのレベルでした(今も大して変わらんがなｗ)
隣の席の優秀な同期にこっそり聞いて、なんとかその場をしのいでいましたｗ

### コードが読めない！
仕様書の修正ばかりしていたら、スポット的にコード修正のタスクが振られました。
おお！びっくりしたけどプログラミングできるぞーと思いソースを見てみると・・・

ん？？

なーーーに言ってんの？ｗ

日本語とは思えませんでした！！(いや日本語じゃない、Pythonやてｗ)

研修と現場の違いを肌で感じました。
全く役に立てず先輩に引き取ってもらいそのタスクは終わりました。

いや、自分、しに来てん・・・

このころからエンジニア無理かも。。と思い始めました。

### 環境構築ができない
いやコードとかの前にこれでしたね！
環境構築！

必要なツールとか開発環境を手順書に沿ってインストールしたはずなのに！
周りは出来ていて。自分だけできない・・・

泣きますってｗ
てか泣いてました・・・

そのせいで、なぜか関係のない先輩を自分の作業が終わるまで会社の外で22:30まで待たせました。
もう、申し訳なさからその場から逃げ出したくなりました。

明日、行きたくねえ・・・
まあ行ったけど。


### 上手く質問ができない
はい！未だにこれは難しいですね！
・何がしたいのか
・どこで詰まっているのか
・原因は何なのか
・何を試したのか
これくらい伝えられればOKってのは頭ではわかっています。

実際はテンパってて支離滅裂なことを話してました。

「まずは結論から話せ！」
「結局何が聞きたいの？ｗ」(冷ややかな目線)
何度先輩から言われたことか・・・

これはエンジニアとか関係なく自分に足りないスキルです。
ちゃんと向き合っていきたいと思います。

### 気づいたら仕事中に泣いてた
さっきも少し話しましたけど、
振られたタスクが全く進まず。調べても解決できず、

気が付いたら涙出てた・・・ｗ

あ、これヤバいと思ってそそくさとトイレに行きました。
あんまり考えすぎるのは良くないですね。

周りと比べ過ぎず、マイペースでやるのが継続のコツだとも思いました。
人間としてもまだまだ未熟だと痛感しました。

### そして飲み会幹事へ・・・
何を勘違いしたのか、実務では役立たないと感じて
プロジェクトのリーダーなどに声をかけて交流会という名の飲み会を企画するようになりました。

目的としては、
・もっと質問とかやり取りをしやすくしたかった
・周りの為に出来ることはないかと考えた結果
・飲み会とかの雰囲気がなかった為

いやそんなこと頑張るより、エンジニアとしてのスキル磨けよ！！！
そんな声が聞こえてきます・・・ｗ

その通りです。

でも人間追い込まれたら何しだすか分かりませんなぁ
何を勘違いしたのか飲み会を企画しだしたコイツｗ

まぁ割と盛り上がって質問しやすい環境にはなりました。
直接的な効果はなくとも、何かした影響は与えれました。


### 1年エンジニアやってみて
ここから頑張れるかがカギだということが分かりました。
個人的には逃げずになんとか頑張れたと、自分を甘やかしていますｗ

今は本当によわよわエンジニア見習いなので
つよつよにはなれなくとも、そこそこのレベルまで到達できるように

日々少しづつ積み重ねていきたいです。



## おわりに
ここまで読んでくださりありがとうございます。
拙い文章で申し訳ないです。

今回はできなかったことばかり書きましたが、
少なくとも成長したこともあります。

なので次は成長したことを書き綴りたいと思います。
FlutterでSQLiteのDBの中身を確認する

## はじめに
FlutterでSQLiteを使用する際、
実際に作成されているデータを確認する方法についてまとめています。

## 前提
- Android Studioを使用
- Android Emulatorの中からdbファイルを探す

## 確認方法
1. Android Studioで「Ctrl+Shift+A」からFind Actionを開く
2. 「Device File Explorer」を開く
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529362/e63e9b07-7b6c-75ef-e0b3-85f1ff4064fe.png)

3. Device File Explorer上部のコンボボックスから対象のデバイスを選択
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529362/74ea9d84-f237-7e38-091e-10adab1853cd.png)


4. data>data>[自分のプロジェクト]>databases>[DB名].dbを右クリックし、「Save As...」で任意の場所に保存
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529362/ae5765ea-6342-9225-a0db-966109316204.png)


5. 任意のDBクライアントから保存した.dbファイルを開けばOK!

DBクライアントは何でもOKです。
[PupSQLite](https://www.eonet.ne.jp/~pup/software.html)や[DBeaver](https://dbeaver.io)などを筆者は勝手におすすめしておきます。
【heroku】デプロイ後に何も表示されない Mixed Content エラー

Laravelで作成したアプリをherokuにデプロイ後、アクセスしても何も表示されませんでした。
コンソールを確認すると以下のようなエラーが出ていました。

```
Mixed Content: The page at 'https://appname.herokuapp.com' was loaded over HTTPS, 
but requested an insecure script 'http://appname.herokuapp.com/js/app.js'. 
This request has been blocked; the must be served over HTTPS.
```


中身を確認すると、src及びhref属性で読み込んでいるリンクが `http://` になっており、これが原因と思われます。
![エラー内容.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697067/9735844a-d8a2-46f1-5715-a424028a27d2.png)


エラー内容を検索したところ以下の記事を発見しました。
[https対応したLaravelプロジェクトでassetを使う時の注意点](https://qiita.com/e_tyubo/items/c25df0c545b1af8494c7)

まさしく、ソースコードではassetを使用していました。
```
<script src="{{ asset('js/app.js') }}" defer></script>
```



そこで記事の回避方法の通り書き換えてデプロイし直したところ、無事アプリが表示されました。

```php:TrustProxies.php
protected $proxies = '**';
```

```php:AppServiceProvide.php
public function boot()
  {
      if (request()->isSecure()) {
          \URL::forceScheme('https');
      }
  }
```
heroku push 時にエラー[PROJECT_PATH is undefined]

heroku にpushした際に以下エラーが発生

```
remote: PROJECT_PATH is undefined
remote:  !     Push rejected, failed to compile Subdir buildpack app.
remote: 
remote:  !     Push failed
```

`PROJECT_PATH is undefined`
ということなので、PROJECT_PATHを以下コマンドで設定したところ解決
```
heroku config:set PROJECT_PATH=src/
```
今週の学び　第8回

# 今週の学び

jQueryなど

- .text()
    - 引数を設定しなかった場合はjQueryオブジェクトで指定した要素のテキスト情報を取得引数を設定した場合はjQueryオブジェクトで指定した要素のテキストを設定する

- prop()
    - 属性プロパティに値を設定、または設定されている値を取得する
    val()などと同様の使い方

- disabled属性
    - <form>～</form> 内で使用する要素で、無効 を指定する
    この属性の指定により要素が無効化されるとユーザーからのその要素への操作は一切受け付けなくなる

- Math.random()
    - 0 以上 1 未満 (0 は含むが、 1 は含まない) の範囲で浮動小数点の擬似乱数を返す

# まとめ

今週は特に学びが少なかったように思う
進捗が良くないので、積極的に調べたり教えてもらうようにする
StateNotifierのMock方法

## 課題

riverpodを使った開発で、テストコードを書くとき、`StateNotifier`のMockをなかなかうまくいかない。
build runnerで自動生成のmockだと、`addListner`のstubが見つからないエラーが出る。

色々調べて、ようやく正しい書き方見つかったので、ここにメモ。

## 書き方
reference: https://github.com/rrousselGit/riverpod/discussions/1398
結局作成者本人の情報が一番正確、当たり前だけど。

```dart
class MockedNotifier extends StateNotifier<Model> with Mock implements MyNotifier {
  MockedNotifier(Model model): super(model);
}
```

## 感想
なぜこの書き方がうまくいくのかはわかっていない。
おそらく、`with Mock`を紐解けばわかるはず。
ちなみに、今までは`extends Mock implements MyNotifier`で書いたのだが、stateをうまく捉えられない。
サクラエディタマクロ（C関数Grep）

# サクラディタのマクロ

### C言語の関数をGrep

```C関数Grep.js
var str1 = '^[_a-zA-Z][^\\(=;:]*[\\t ]+\\**[_a-zA-Z][_a-zA-Z0-9]*\\([^;]*$';
var str2 = "*.c";
var int4 = 0x4631d;
var int5 = 0x63;
var str3 = FolderDialog("フォルダを指定", ExpandParameter("$e"));
if(str3){
    Grep(str1, str2, str3, int4, int5);
}
```

int4のパラメータは

https://sakura-editor.github.io/help/HLP000067.html

を参照（少し記述が食い違っているような気がしますが）してお好みで変えてください。

正規表現のパターンは

https://qiita.com/archboys/items/088c903aede5b928eb03

から流用させていただきました。

### Grep結果をタグファイル化

```Grep結果タグ化.mac
SetDrawSwitch(0);
AddRefUndoBuffer(); // Redo用

// Grep結果以外の部分を削除
S_GoFileTop(0); // ファイルの先頭に移動

//S_ReplaceAll('^□検索条件', '', 2860);
S_ReplaceAll('^検索対象', '', 2860);
S_ReplaceAll('^フォルダ', '', 2860);
S_ReplaceAll('^除外ファイル', '', 2860);
S_ReplaceAll('^除外フォルダ', '', 2860);
S_ReplaceAll('^    \\(', '', 2860);

S_ReplaceAll('^\\r\\n', '', 2860);

S_ReplaceAll('^\d+ 個が検索されました。', '', 44);

// 整形処理
S_ReplaceAll('^・', '.\\\\', 44);    // 行頭の・を相対パスに置換
S_ReplaceAll('\\t', '    ', 44);    // TAB→空白置換
S_ReplaceAll('(^.*?)\\(', '$1\\t', 44); // すべて置換
S_ReplaceAll('(^.*?),\\d+\\)  \\[\S{3,9}\\]: +', '$1\\t', 44); // すべて置換
S_GoFileTop(0); // ファイルの先頭に移動


S_SelectAll(0); // すべて選択
S_Copy(0);  // コピー
S_CancelMode(0);    // 各種モードの取り消し

S_SearchClearMark(0);   // 検索マークの切替え
SetDrawSwitch(1);
SetUndoBuffer();
S_ReDraw(0);    // 再描画
```

https://qiita.com/t_o01/items/758c8297c8aced95cf95

のGrep結果成型の改造です。

テキスト保存してもF12でタグジャンプできるようになります。
ctagsを使ったタグジャンプと併用すると便利かと。
インフルエンサーにはなれない私はサイトを作って推し活をDXしようと思う

# 要約

- 推しのVsingerの情報まとめサイトを作った
- Next.js で開発して、AWS Amplifyでホスティング
- サイトを作って運用してみると色々勉強になる
    - SEO・多言語対応・モバイルファースト・高速化とか
    - 個人開発で手動テストは辛いのでテストコードは大事

# 動機

- 推しの個人勢Vsingerを布教・拡散しようにも、ネットも現実も交友関係がゼロなので全く役に立てない
- フロントエンド・SEO・広告運用の勉強がてら布教用の情報まとめサイト作ってみようと思い立つ


# やったこと

- [GitHubリポジトリ](https://github.com/01G271BR9H8WH1VNE8QHKYGDCX/yorudokimayu-info)作成
- 要件定義・基本設計・技術選定などを[README.md](https://github.com/01G271BR9H8WH1VNE8QHKYGDCX/yorudokimayu-info/blob/9ed82063d65fa20dd5c80121c0d04a8f239925c4/README.md)にまとめる
- GitHubのProjectsで最初のリリースに向けてタスクを切る
    - [最初のリリースのカンバン](https://github.com/01G271BR9H8WH1VNE8QHKYGDCX/yorudokimayu-info/projects/1)
- ローカル環境構築・開発
    - faviconとかはFigmaで作成
- 本番環境構築・リリース
    - AWSアカウント作成
        - AWS Organizationsでrootと本番環境のアカウントを別々にしてSSOを設定
    - 本番環境AWSアカウントのRoute53でドメイン購入
        - AWS Route53は個人利用だとにWhois代行やってくれる
    - 本番環境AWSアカウントのAWS AmplifyでGitHubリポジトリ連携してデプロイ
- リリースしてみたがサイトにトラフィック流入させても即離脱するレベルなのでコンテンツをブラッシュアップ
    - [改善のカンバン](https://github.com/01G271BR9H8WH1VNE8QHKYGDCX/yorudokimayu-info/projects/2)
- sitemapとrobots.txtなどを自動生成して、Search Consoleから登録
- 多言語対応

公開したサイトは[こちら](https://kimayu.rocks) 

日中は仕事があるので、夜や休日の勉強時間で作業してだいたい2週間ぐらいで最初のリリース。
その後は直したい箇所に気づいたらIssueを立てては細かくリリースを繰り返し。
最近はCypressで多言語化部分のテストを書いたりしてる。

# 得られた知見・所感

- Webアプリケーションフレームワークとフルマネージドホスティング環境はとっても楽
    - ハッカソンとか製品開発前のプロトタイピングとかにも使えそう
- Tailwind使えばCSSのスキルが雑魚でもレスポンシブ対応できた
- AWS Amplifyでだいぶインフラの手抜きができた
    - インフラのプロビジョニングやらデプロイパイプラインの構築作業が不要
        - ECSで同じことをやろうと思うとぞっとする
- Next.jsの多言語対応が予想以上に使いやすかった
    - 言語ごとのディレクトリやページファイルを作らなくてよい
- CIでのテスト実行は早めに導入すべき
    - 多言語対応するとE2Eを自動化しないと回らない
- 最初から立派なものを作ろうとせず、割り切ってリリースして後から改善するのがよさげ
    - 動くものができると楽しい
    - GoogleAnalyticsやSearchConsoleで改善が目に見えるので次のモチベにつながる
- サイトの構築・運用費用が思っていた以上に安かった
    - ドメイン購入費用含めて5月の請求が 13.75ドル (内ドメイン購入が12ドル)
    - CloudFrontでコンテンツキャッシュが効くため、この先もお安く運用できそう


運用費用なんてYouTubeで黄色のスパチャ投げる程度でしかないから、
エンジニアリングスキル持っている人は推し活DXすればいいと思う。
Live2Dを始める

「Live2Dを始めよう」と思い立った時、気合を入れて初めからお金を払って始める方もいるかもしれない。
ただ、公式では初回の利用は42日間の無料トライアル版からを推奨している。
無料トライアル版は有料のPro版と変わりない機能が使える物であり、これは初回はLive2Dが問題なく使える環境かを確認してもらうことも目的としている。

・ダウンロードページ
https://www.live2d.com/download/cubism

入力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/046c6d73-b418-93a5-13e1-47aece2187c2.png)

手順
１．ダウンロードページをスクロールしていくと利用規約とその確認のチェックボックスが出てくる。
２．初回の場合は「初めてダウンロードする」を選ぶ。
３．メールアドレスが入力できるようになるため記入する。
４．メールアドレスの入力が終わると「最新のリリース版をダウンロード」ボタンが有効になる。
　　ダウンロードを始めると入力したメールアドレスにメールが届くが、無料版を始めるためには必須ではない。
　　（主に公式のチュートリアル動画や書籍、コミュニティなどの案内が並んでいるので見ておくとよい。私は自動で迷惑メールに入れられていた。）
５．ダウンロードしたファイルを実行し、「PRO版の無料トライアルを開始」を選択する。
　　無料トライアルを始めるにあたってライセンスキーは必要ない。

どのモードで開始するかを選択する画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/035448d3-e2b1-46fe-470d-e03a21a6c386.png)

補足
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/0476267b-49a0-3494-82b5-f40d8df3e0aa.png)
ダウンロードページの下にいかにもクリックすればトライアル版がすぐにダウンロードできそうな表示があるが、ここをクリックしてもダウンロードページのトップに戻されるだけなので
ここをクリックして「トライアル版がダウンロードされない！」とはならないように
MongoDB・MongooseのObjectIDに関して

## ObjectIDってなんだ？

MongoDBの_idにデフォルトでセットされる値ですが、文字列(string)ではなく、ObjectIdクラスのインスタンスのようです。

なので、以下に挙げますが、_id同士を単純に比較しても常にfalseになってしまいますし、_idの文字列の値(`313263686172313263686172`)と_idを比較しても、文字列とインスタンスなので、こちらも常にfalseとなってしまいます。

## _idの値の文字列をクエリの検索条件としたい

`findById()`は引数にstringを受け付けるので、そのまま渡せます。

```
const result = await UserModel.findById('313263686172313263686172')
```

集計関数である`aggregate()`の中で検索条件としたい場合は、`$convert`というaggregation演算子を使ってObjectIdインスタンスに変換してあげる必要があります。

以下は、_idの配列のフィールドの中に、特定の_idが含まれているかを検索する例で、他に`$in`という演算子を使っています。

```
// 配列のフィールド(memberIds)にuserIdが含まれているTeamを検索
const userId = '313263686172313263686172'
const result = await TeamModel.aggregate([
  $match: {
    $expr: {
      $in: [
        $convert: {
          input: userId,
          to: 'objectId'
        },
       'memberIds'
      ]
    }
  }
])
```

https://www.mongodb.com/docs/manual/reference/operator/aggregation/

※ObjectIDへの`$convert`は以下でもいいらしい。
```
{
  $toObjectId: userId
}
```

https://www.mongodb.com/docs/manual/reference/operator/aggregation/toObjectId/

## _id同士の比較

ObjectIdインスタンスの`.equals()`というメソッドを使用します。

```
const user = await UserModel.findById('313263686172313263686172')
const team = await TeamModel.findOne({})

// x これだとインスタンス同士の比較なので常にfalseになってしまう
const isTeamMember = team.memberIds.some((memberId) => memberId === user._id)

// o equals()というメソッドを使う
const isTeamMember = team.memberIds.some((memberId) => memberId.equals(user._id))
```


## そのほか

[ObjectIds in Mongoose - Mastering JS](https://masteringjs.io/tutorials/mongoose/objectid)

Mongooseは24個の16進文字列や任意の12個の文字列(12byteの文字列)はObjectIDインスタンスに変換するようです。

また、ObjectIDの値(の文字列)は12byteの文字列で構成され、最初の4byteはタイムスタンプで、`_id.getTimestamp()`というメソッドでタイムスタンプの値を取得できるらしい。。。

間違いがありましたら、ぜひご指摘をお願いいたします🙏