OmniAICreator/Qiita-1.07M huggingface dataset:
元プログラマーがQAの世界に入るまで

# はじめに

この記事は[GLOBIS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/globis) の12日目の記事です。
今回は「元プログラマーがQAの世界に入るまで」と題しまして、異色の経歴と自負している私のグロービスとの出会いやジョインまでの流れを振り返ってみたいと思います。

### 簡単な経歴
- 茨城県に生まれ、大学まで地元で過ごす。
- 都内のIT企業で4年半、社会保険労務士法人で半年勤務。
- 2022年4月にグロービスにジョイン。現在はGLOBIS 学び放題のQAを担当。

# GLOBIS 学び放題**とは？**

グロービスが持つビジネスナレッジを、基礎から実践まで、いつでもどこでも学べる動画サービスです。動画の長さは1本3分から気軽に学習ができます。また、新人・若手からリーダー層まで成長目標に合わせたコンテンツをご用意しています。

https://hodai.globis.co.jp/

# グロービスに出会うまで
### IT企業時代
私は4年半ほど都内のIT企業で働いていましたが、働いていく中で不安は募っていくばかりでした。不安に思っていたことは、「この会社で働き続けて本当に良いのか」「そもそも今の仕事は自分に合っているものなのか」「これから先、生き残ることができるのか」というものでした。
そんな中、とある受託案件に携わることになりました。現場では何度もプロジェクト崩壊の危機に直面しました。私は日々の業務をこなすことで精一杯で、飛び交う業界専門用語もあまり理解できていませんでした。周りの仲間が疲弊していく中で、私にできたことは本当に少なかったと思います。

### 社労士法人での出会い
その後の経緯は割愛しますが、私は一度IT企業から離れることになりました。
当時利用していたくらし・しごと相談支援センターの職員の方の勧めで職業訓練に通うことになり、そこで得た知識を生かすことのできる社会保険労務士法人に入社しました。
社会保険労務士法人ではさまざまな背景をもつ方々が働いていました。その中で最も印象に残っている方がいます。その方の趣味は資格を取ることで、勉学に励むことが全く苦ではないということでした。仕事も勉学の一部であると認識し、日々本当に楽しそうに働いている姿が印象的でした。

### 私が本当にやりたかったこと
私は社会保険労務士法人で生き生きと働いている人の姿を見て、これまでの自分に足りなかったものが何なのかを自覚しました。それは「学び」です。
「学び」は新しい知識やスキルを身につけることによって、生き方や働き方の選択肢を増やし、人生の幅を広げるものであると私は考えています。この「学び」を自ら実践するだけでなく、必要とする人に届けたいという気持ちが強くなり、転職を決意しました。

### グロービスとの出会い
グロービスの選考を受けるきっかけとなったのは、エージェントからの紹介でした。実を言うと、QAエンジニアという職種はグロービスの募集を見るまで知りませんでした。
QAエンジニアとしては私は完全に未経験でしたが、紹介されたのも何かの縁だし受けてみよう！ということで選考を受けることになりました。
選考を受けてみて面接回数の多さと課題（エッセイ）があることに驚きました。選考を通じて、他のどの企業よりも「私」を見てくださっていると感じ、入社後の具体的なイメージも湧いてきたため、面接の回数が増えるにつれ入社意欲も高まっていきました。
採用の連絡があったときは、これまでの自分の考えを肯定してもらえたようでとても嬉しかったです。

# グロービスにジョインしてみて
あっという間に半年が経過していた、というのが正直な感想です。諸先輩方のおかげで比較的早く組織に馴染むこともでき、存在感を発揮できるようになってきたような気もします。（勤続年数が長く見られることが多く、「○○のときはこうだったよね」と話を振られるのですが、「そのとき私はまだ入社してないです」と返しています）

### QAエンジニアとして
QAエンジニアとしてはまだまだ駆け出しの状態ですが、日々難しさとやりがいを感じつつ仕事に取り組んでいます。元プログラマーの私から見て、QAの難しさとやりがいを3つずつ挙げてみたいと思います。

- QAの難しさ
    - 幅広いテスト技法の知識が必要になる
    - 細かい仕様が定まっていない段階でテスト計画・設計を行うことがある
    - ブラックボックステストが中心なので、中身の分岐が分かりにくい

- QAのやりがい
    - 設計不備が原因の不具合を発見できる
    - ユーザーの立場に立って違和感のある挙動を発見できる
    - QA活動によってより良い品質のプロダクトを提供できる

私は将来的には、プログラマーとしての経験を活かして自動テストの実装をしたり、ユーザフィードバックを製品に還元したりするなど、単なるテストという枠に留まらない QA 活動を行うことで、より良い品質を追求していきたいと思っています。
一人でも多くのお客様に質の良い学びを提供できるよう尽力していきます。

# さいごに

この記事を読んでくださっているみなさんの中には、私と同じような不安を抱えている方もいるかもしれません。
社会人になって数年は「適職とはなんだろう」と悩んでいた私でしたが、今思うことは思い切ってキャリアチェンジに挑戦して本当に良かったということです。
少しでも新しいことに挑戦しようと思っているなら、一歩踏み出してみて欲しいなと思います。人生を変える出会いが待っているかもしれません。
ご自身のキャリアに悩まれている方や、何か新しいことに挑戦したいと考えている方の参考になれば幸いです。

# グロービス**では一緒に働く仲間を募集しています！**

グロービスの開発組織では、一緒に働けるエンジニアを探しています！まずは、カジュアル面談を通して、あなたに合う組織かどうか確かめてみませんか？

https://recruiting-tech-globis.wraptas.site/
[解決法][Houdini]SideFX Labsインストール時にパッケージの選択が出てこなかった場合

## SideFX Labsのインストール方法 
https://www.sidefx.com/ja/tutorials/sidefx-labs-installation/
上記公式サイトの動画を参照。
（日本語字幕あり）

## Update toolセットを押して、インストールしたいバージョンを選択しようとしたら、選択するものがない・・・！
ということが起きた。
![スクリーンショット 2022-12-09 095317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/ecf84e7e-e75c-2936-1e5c-88f59b82c574.png)
調べてもよくわからず、Indieはそもそもインストールできないのかなど思ったが、
解決できたのでメモ。

本来、Houdiniインストール時にSideFX Labsは同胞されているとのことだが、
先ほどの画面をよく見ると、「File path: None」となっている。

うっかり一緒にインストールするチェックを外していたのかしら・・・？？

## 実施方法
１．Launcherを開き、左側のメニューから「Labs/Packages」を選択
![2022-12-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/2f6c4a8e-d6ce-b49e-2dda-2275683a3b49.png)

２．どのパッケージをインストールするか選択。

:::note info
どれを選択すべきか迷った場合は、一番上の最新のものにチェックを入れてインストールボタンを押す。
:::

![2022-12-09 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/4977daaa-7560-b614-2639-08d54073bb1d.png)

## インストールされたか確認する方法
上記実施後、Houdiniを起動させSideFX Labsのタブを開くと下記のように
UPdate Toolset以外もでてきていることが確認できる。
![スクリーンショット 2022-12-09 101417 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/ac224c12-7815-3df5-3f29-2e486dde0603.png)
Firestore Data Bundlesをサーバーサイドから利用することは可能か？

## はじめに
Firestoreの読み取りコストを削減するための仕組みとして、Firestore Data Bundlesがあります。
基本的にはクライアントのSDK（Webやモバイル）からの利用が想定されていますが、サーバーサイドからも利用することはできないか調査しました。


https://github.com/kawamou/firestore-data-bundles-playground

## 結論

- Firestore Data Bundlesはただの静的ファイルなのでサーバーサイドからも読み取ることは可能
- ただしマッチョな実装になるので少々注意が必要


## Firestore Data Bundlesとは

https://zenn.dev/moga/articles/firestore-data-bundles

[公式ドキュメント](https://firebase.google.com/docs/firestore/bundles)もありますが、上記ブログ記事がとても分かりやすいです。
コードと内容ともかなり参考にさせていただきました。

簡単にまとめると、Firestore Data Bundlesとは**Firestore上の読み取り頻度が高いデータを静的ファイル化しCDN、ホスティング サービス、その他に展開して利用する**仕組みです。
クライアントはFirestoreを呼び出さなくてもデータにアクセスできるため、アクセスコストの削減やクエリ結果の高速な読み込みが期待できます。
下記のような流れで処理が進むイメージです。

```md:処理の流れ
1. サーバーサイド: Firestoreデータ読み取り
　　　　　　　　　　↓
2. サーバーサイド: Bundles形式に変換
　　　　　　　　　　↓
3. サーバーサイド: 静的ファイル化 ex. txtファイル
　　　　　　　　　　↓
4. サーバーサイド: CDN、ホスティング サービス、その他にアップロード
　　　　　　　　　　↓
5. クライアント: 静的ファイルを取得
　　　　　　　　　　↓
6. クライアント: Bundles形式として読み込み
```

②の「Bundles形式に変換」についてはNode.jsやJava、PythonのAdmin SDKが対応しています。
```js:Node.jsの場合（公式ドキュメントより引用）
// Build the bundle
// Note how querySnapshot is named "latest-stories-query"
var bundleBuffer = bundle.add(docSnapshot); // Add a document
                   .add('latest-stories-query', querySnapshot) // Add a named query.
                   .build()
```

⑥の「Bundles形式として読み込み」についてはWebやモバイルのSDKが対応しています。
```js:Webの場合（公式ドキュメントより引用）
await db.loadBundle(resp.body);
```

Firestore Data Bundles形式のデータは、Firestoreドキュメントの内容と、それらを生成したクエリに関するメタデータの両方が含まれたJSONのような形式です（下記のスクショ。一部黒塗り）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287774/5f1d06f5-96fc-b44e-d90a-8d6bfa9e4a14.png)

## サーバーサイドで利用する試み
前述の通り、Firsetore Data Bundlesを読み込んで利用するためのAPI（ex. `loadBundle()`）はWebやモバイルのSDKにしか用意されていません。
しかし、Firestore Data Bundlesはただの静的ファイル（先ほどのスクショの場合はテキストファイル）なので、SDKを利用せずともサーバーサイドでも読み込むことはできそうです。

https://ta-watanabe.hatenablog.com/entry/2021/07/15/165732

>中身はほぼjsonですが余分な数字が入ってるのと、複数のjsonオブジェクトがちゃんと連結されてないので配列可しました。

上記ブログ記事に記載の通り、Firestore Data Bundlesは余分な数字が入ったJSONといった面持ちで絶妙に取り回しづらくなってはいますが、正規表現等々用いてキレイにしてあげます。

```go:自身の実装より抜粋
var (
	headNumber   = regexp.MustCompile("^[0-9]{3}{")
	middleNumber = regexp.MustCompile("}[0-9]{3}{")
)

func replaceHeadNumber(str string) string {
	return headNumber.ReplaceAllString(str, "[{")
}

func replaceMiddleNumber(str string) string {
	return middleNumber.ReplaceAllString(str, "},{")
}

func bundlesToJSONString(str string) string {
	str = replaceHeadNumber(str)
	return replaceMiddleNumber(str) + "]"
}

func bundlesToJSON(str string) ([]any, error) {
	var ret []any
	formatted := bundlesToJSONString(str)
	if err := json.Unmarshal([]byte(formatted), &ret); err != nil {
		return nil, err
	}
	return ret, nil
}
```

このようにすれば、サーバーサイドでもFirestore Data Bundlesに含まれるドキュメントにアクセスすることができます。
ただし、あくまでテキストファイルを無理やり読み込んでいるだけなので、例えばFirebase Data Bundlesのデータ仕様が変更になった際には、動かなくなる可能性があります。
フルのコードはこちらに置いています。

https://github.com/kawamou/firestore-data-bundles-playground/tree/main/firestore-data-bundles-sample-go

## 終わりに

- Firestore Data Bundlesをサーバーサイドからも利用することができるか調査しました
- 結論として、利用は可能ですが、仕様変更にロバストではなく実戦投入には課題が残ります
- サーバーサイドでFirestoreのコスト削減に挑む場合の方法については今後も模索していきたいです
npm run devの実行時にthrow er; // Unhandled 'error' eventのエラーが出る時の対応

## 実際のエラー
```bash
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRNOTAVAIL 10.102.158.22:3000
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at Server.setupListenHandle [as _listen2] (net.js:1338:19)
    at listenInCluster (net.js:1396:12)
    at GetAddrInfoReqWrap.doListen [as callback] (net.js:1505:7)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:97:10)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

## 解決策１
/etc/hostsのlocalhostが書き換えられているので、戻す
```bash
sudo vi /private/etc/hosts

127.0.0.1 localhost
に戻す
```

## 解決策2
既存のプロセスが立っていないかチェック。他で既にlocalhostが立っていたらそれをキルする
```bash
$ ps aux | grep node

$ sudo kill -9 ポート番号
$ npm run dev
```

https://qiita.com/kkam0907/items/65ceedbf3c71ae086838

## 解決策3
node_modulesの依存関係に問題があるかもしれないので、npm install を再度行う
```bash
ls
# package.jsonがある階層までいく
rm -r node_modules
rm package-lock.json
npm install
npm run dev
```
創業期のIT系スタートアップ必見！ AWS Activateについて解説

# はじめに

こんにちは、[株式会社Bluezone](https://www.idaten-app.com/)でCTOをしております大熊と申します。
![d96867-3-7eda93b6f6134f1146fa-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984256/9dc731fb-f8c1-853b-2130-d208d77fb324.png)
今回は**AWSのスタートアップ向け支援パッケージ**[**AWS Activate**](https://aws.amazon.com/jp/activate/)について説明したいと思います。

# AWS Activate とは

AWS Activateとは、**AWSが提供する創業期のスタートアップ向けの支援サービス**であり、基本的には以下を提供しております。

- **1000 USD 分の AWS Activate クレジット (2 年間有効)**
- **350 USD 分の AWS デベロッパーサポートクレジット (1 年間有効)**

AWSの支払いはドル建てであり、少々落ち着いてきたとはいえ最近の円安の影響で使用料が上がってしまい大変な人も多いはず。
※ 私はFXをやっているわけでもないのに、毎日ドル円レートをチェックしていました、、、

一方このAWS Activateでドル立てでクレジットが受け取れるので、為替に関係なく一定の支援が約束されます。

ただし、**クレジットには有効期限が存在するので、一気にサーバー使用料が増加するタイミングで申請**をするのが、クレジットを無駄にしない為にお薦めです。

### 支援を受けるための条件

AWS Activateの支援を受けるためには、会社が以下の条件を満たす必要があります。

- Activate Founders を初めて利用する
- これまで AWS Activate Portfolio パートナーからクレジットを受け取ったことがない
- AWS Activate アカウントを持っている
- 初期段階のスタートアップ (資金調達なし、およびシリーズ A までの資金調達済み)
- 機関投資家から資金調達していない/Activate Provider と提携していない
- 会社のウェブサイトまたは会社のプロファイルが公開されている
- 直近 10 年以内に設立された

一般的な初期フェイズのスタートアップなら条件を満たせると思います。

# より大きな支援を受ける為に

[AWS Activate](https://aws.amazon.com/jp/activate/)にアクセスすると、以下の文言を見つけることが出来ると思います。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984256/4cf5486e-3217-4af6-3f0b-2ff3d3934a3c.png)
「最大100,000 USD 相当の AWS Acticate クレジットを申し込むことが出来ます。」
この文言を見ると、100,000ドルものクレジットを受け取れると思ってしまうかもしれませんが、こちらはを受け取るには「[Activateプロバイダー](https://aws.amazon.com/jp/activate/portfolio-detail/)」と提携する必要があります（[詳細](https://aws.amazon.com/jp/activate/credits/)）。

Activateプロバイダーは、基本的にはAWSと提携しているアクセラレーターやエンジェル投資家であり、これらの組織から支援を受けている or 出資を受けているスタートアップは最大で100,000 USDのクレジットを受け取れる、とのことです。

大量の計算リソースを必要とするプロダクトを開発しているスタートアップは、この辺りも狙いつつ支援や出資を検討しても良いかもしれませんね。
Power Pages ちょっと迷子になった3か所の「コードの編集」ボタンとヘッダー/フッターのテンプレート化について

# 前書き
* 本記事は2022年12月08日時点での試用版での動作です。
* 本機能は現時点でプレビュー扱いです。
*  [RPACommunityアドベントカレンダー](https://adventar.org/calendars/7503) の2022年12月09日分の記事です。

# Power Pages の「コードの編集」ボタンは3か所あるよ

自分が目に入ってなくて、引っかかったのでメモ書きです。
たぶん大半の方はご存じｗ

* ページ本体
* ヘッダー
* フッター

はそれぞれ別々に「コードの編集」ボタンがあるのです……。
しかもうち2か所はカーソル当てないと出てこないから、注意散漫な私は最初気が付きませんでした。

## ページ本体
何もしなくても出てくる右上のはページ内のコードを編集するためのボタンです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/b114a2fa-257b-0026-4cf7-1bdcb8d8ba8b.png)

もしくはページ名横の「・・・」＞「コードの編集」でも同じ画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/207ab799-82a0-5e50-6f28-c5032db7bfb3.png)



ここでWEB版のVisual Studio Code を開いても選択したページ部分（↑のスクショの場合はホーム）のコードしか編集出来ないのね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/727ba8f3-b85b-0a82-d3bc-217dc18ba53f.png)

じゃあ、どのページにもある「ヘッダー」とか「フッター」はどこで編集すればいいの？って話になる訳で……

## ヘッダー
ヘッダーというのはサイトの上部、メニューとかがあるところですが……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/59c1059d-6f16-0715-1e6b-f8019731e166.png)

ここのコードを編集したい場合は
「ヘッダー」部分をクリックして、コントロールを呼び出す！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/e55a6fc2-ccb2-536b-f45f-e0c16a70dee3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/88bc13d2-4d3a-7576-6aca-6bcc20d91873.png)

今度はヘッダーだけがコード編集出来るようになるわけですね。

## フッター

フッターはページ下部のこの部分……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2afa7b50-9e73-3e48-e1eb-32a3c6758cd5.png)

ここもヘッダーと同様に「フッター」部分をクリックして、コントロールを呼び出すのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/878ab3d1-f616-c4be-8146-e6c3e73c57d6.png)

そうすると、フッターだけ編集出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2c1cbcc1-43f9-5b77-a7cd-6a1f1507b92a.png)


# 【おまけ】ヘッダーやフッターのテンプレートを作りたい時は……

オリジナルのヘッダーorフッターのテンプレートを作りたい時は、ポータル管理に行く必要があります。

 1.「・・・」＞「ポータル管理」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c9237b2d-877f-098b-7722-fb83a6ca4ad2.png)

2.「Header（またはFooter）」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/bd14fe50-7e67-eb81-5fbf-cefab20d864c.png)

3.この画面で編集/保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/f21f8418-5f15-f9f5-89b9-e044fdd82669.png)

英語ですが、こちらの動画がわかりやすいかなと……(≧▽≦)
https://youtu.be/rRQQqxlKHTA

このあたりは Power Apps Portal と同様ぽいんですが、日本語で検索してもlearnとか情報が出てきてくれない💦
なので備忘録として残しておきます。
ごきげんよう💞

# 参考資料
https://learn.microsoft.com/ja-jp/power-pages/configure/visual-studio-code-editor?WT.mc_id=powerportals_inproduct_portalstudio2
【UE5】プレイヤーカメラ設定時の忘れがちな設定メモ

参考：[公式学習用動画](https://dev.epicgames.com/community/learning/courses/kry/unreal-engine-build-a-third-person-character-from-scratch/90n/unreal-engine-adding-a-basic-camera-and-placing-the-character-in-the-world)
カメラを追加するときに毎回設定を忘れるので、プレイヤーカメラ追加方法と基本設定をメモする。

#### カメラの設置方法
前準備、キャラクターBPにスケルトンメッシュ(今回はブタさんにご協力願った。)を設定する。
次に以下の手順でカメラを追加する。
1.SpringArmの追加
　「コンポーネント」にSpringArmを追加する。
2.カメラの追加
　SpringArmをクリック、選択した状態で「コンポーネント」にCameraを追加する。
　Cameraは自動的にSpringArmの終端に設定される。
　Cameraの「詳細」タブで親ソケットをSpringEndpointに設定する。
3.レベル内での設定
　BPをレベル内に配置し、設定したBPを選択、「詳細」タブでpossessを検索し、「Auto Possess Player」をPlayer0に変更
　※この設定でレベルを実行した際に設定したカメラアングルからプレイが開始される
4.カメラ位置の調整
　BP内でCameraの画角、SpringArmの長さを調整して完了

↓設定後のBP
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1235659/9b6ee120-d043-1081-4ad1-e7183f84cebb.png" width=50%>

以上。
【図解】勾配降下法を用いた深層学習による自然言語処理の流れ

## 概要

タイトルの通りですが、勾配降下法を用いた深層学習による自然言語処理の流れをまとめました。
自分がPytorch×BERTを用いてモデル構築をしているので、各フェイズの説明ではそれらを例に出して説明します。

## 流れ

大まかに以下のような流れになります。
![_深層学習を用いた自然言語処理の流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345720/7da5a463-a4dc-1a8f-0540-8e770fa496a4.png)

### ①形態素解析

まず文章を形態素解析します。
形態素解析とは、文章を形態素（＝意味を持つ最小単位）に分け、それらが品詞としてどれに当たるのか分類することです。日本語は英語など他の原語と比べると、単語間に空白がないため、単語の切り出しが難しく、形態素解析用のライブラリが必要になります。
有名なライブラリだとMecabがあります。

```bash
$ mecab
こんにちは今日はいい天気ですね。
こんにちは	感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
いい	形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
天気	名詞,一般,*,*,*,*,天気,テンキ,テンキ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
。	記号,句点,*,*,*,*,。,。,。
```

### ②ID化
次に文章をID化します。
①で形態素解析された文章（単語群）は入力する際、数値に置き換える（ID化する）必要があります。形態素解析されて切り出された単語をそれぞれ数値化することをID化と呼んでいます。
BERTを使うと①と②は`encode()`を使うだけでいっきにやってくれます。

```bash
tokenizer.encode("こんにちは今日はいい天気ですね。")
```

```bash
[2, 10350, 25746, 28450, 3246, 9, 2575, 11385, 2992, 1852, 8, 3]
```

### ③予測

次に予測を行います。
入力値と、重み、バイアスを用いて予測値を計算し出力します。いわゆるニューラルネットワークの部分になります。
Pytorchでは関数が用意されているのでそれを利用して予測部分を構築します。予測関数は例えば`nn.Sequential()`などが用意されています。
BERTなどの自然言語処理のライブラリを用いる場合、この部分は各ライブラリの機能を利用します。

### ④損失計算

次に損失計算です。
③で出力された値と、その正解ラベルを用いて、予測値がどの程度正解とずれていたか？を計算し、損失を出力します。損失は予測関数と損失関数の合成関数であり、損失計算とはこの合成関数を計算することになります。
Pytorchではこの計算に関数が用意されていて、`nn.MSELoss()`や`nn.CrossEntropyLoss()`がそれに当たります。文書分類を行いたい場合は`nn.CrossEntropyLoss()`（=つまり交差エントロピー）を使います。

### ⑤勾配計算

次に勾配計算です。
この勾配計算で算出された勾配値によって、損失を減らす方向を決めることができます。
勾配値は損失をパラメータ（weightやbias）で偏微分した値になります。
Pytorchでは`backward()`が用意されており、簡単に勾配値を計算することができます。

### ⑥最適化関数によるパラメータ修正

最後にパラメータの修正を行います。
⑤で出力された勾配値に学習率をかけ、その値だけweightとbiasを減らします。
Pytorchでは`optimizer.step()`が用意されており、これによってパラメータ修正を行います。

### 繰り返し処理

上記の③〜⑥を繰り返すことで学習が行われます。
このように損失から勾配値を計算してパラメータ修正を繰り返す方法を勾配降下法といいます。
店舗検索、レビューサイト

## サービス内容
地元香川の讃岐うどん検索サイト

## 機能
#### 利用者
* お店検索
* お店一覧
* お店詳細
* レビュー投稿
* ユーザー登録、編集、ユーザー詳細
* お気に入り
* マップ検索
* 会員登録、ログイン認証
#### 管理者
* お店登録、編集

## テーブル
* users（ユーザー）
  * roleカラムで一般利用者と管理者の利用を制御する。
  * 誰でもお店を登録できるようにしたいので、一つのテーブルにしてみました。
* user_profiles（プロフィール）
  * ユーザーのプロフィールです。
* shops（店舗）
  * お店の表示情報を登録するテーブル
  * 誰でも登録、更新できるようにしたい。初期は管理者の登録を想定。
* shop_menus（メニュー）
  * shop_idを持つお店のメニュー登録ようテーブル
  * 誰でも登録、更新できるようにしたい。初期は管理者の登録を想定。
* eat_reports（レビュー投稿）
  * userがお店のレビュー投稿データ登録ようテーブル
* prefectures（都道府県マスタ）
  * 更新されないのでテーブルにしなくてよかったのか？
* regions（地方マスタ）
  * 更新されないのでテーブルにしなくてよかったのか？
* inquiries（お問合せ情報）



![スクリーンショット 2022-11-30 9.17.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328844/80ba2ed4-27ed-d5f2-6708-59b2e8a4f5ea.png)
【LINE API】LINE API開発者向けカンファレンス「REV UP 2022」参加メモ

# 勉強になったこと　実務で使えそうなこと　メモ
## Botを作りたい
    - 使うAPI
        - MessaginAPI
    - 得られる技術
        - サーバーサイド
        - webフレームワーク
        - Cloud
    - Botのおすすめの使い方
        - AWS Lamda
        - Google App Script
        - webフレームワーク　＋ ngrok
## ミニアプリを作りたい
    - 使うAPI
        - LIFF
        - ミニアプリ
    - 得られる技術
        - AWS Amplify
            - ホスティングサービス
        - Azure Static Web Apps
            - ホスティングサービス
        - Netlify
            - ホスティングサービス
## 決済システムを作りたい
    - 使うAPI
        - LINE Pay
        - LIFF
        - MessagingAPI
    - 得られる技術
        - DB/キャッシュ
        - サーバーサイド
    - おすすめの始め方
        - Lamda + Dynamo DB
        - GAS + スプレッドシート
        - webフレームワーク + ngrok + RDB(mysql等)

- location.hrefでうまく行かない場合 => window.openで開ける場合がある。
Jetbrains Rider LiveTemplateとショートカットの壁紙設定

# 概要
JetBrains社のIDE RiderでLiveTemplateの設定を行います。
LiveTempateを使うことで手打ちの量を減らすことができます。ソースコードのドキュメンテーションの手間を減らせ、可読性を上げることができます
LiveTemplateの利用率を高めるためRiderの背景にLiveTemplateのショートカット一覧を配置します。

# 開発環境
Windows:10
IDE: Rider


# 手順



## LiveTemplateの設定

C#のLiveTemplateを開く。
File→settings→Editor→Live Templates→C#

追加したいテンプレートを追加します。
画像はplayModeTestMethodのテンプレートを追加している様子です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/a2a8271d-e317-c270-a214-09d5556f9bcb.png)

### 


## Riderの壁紙を作成する。
liveTemplateを必ず思い出せるように壁紙にリストの画像を貼ります。
### mdファイルで一覧表を作る
プレビュー側（右）の画像を取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3608c2fd-f0cb-d050-90b7-86ec2df9f7b7.png)

### スクショ取って、壁紙に貼り付ける。
File→settings→Appearance→UI-OptionのBackground imageボタンを押します。
私は右下に貼りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7ab60838-6183-1ee7-35fa-df4b9f4d2cf4.png)


##　結果
コーディングの作業効率が上がりました。
以下gifアニメはテストメソッドを追加している様子です。


![TestCodeGenerate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/1ab74067-2381-840f-2fa6-7302f79cee82.gif)



# 参考


https://pleiades.io/help/rider/Creating_and_Editing_Live_Templates.html


背景画像の設定の仕方

https://pleiades.io/help/idea/setting-background-image.html

マークダウンの作り方


https://pleiades.io/help/rider/Markdown.html#c5449a35

C#　ドキュメントコメント

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/xmldoc/recommended-tags
【合格体験記】AWS SOA(SOA-C02)合格までの勉強と試験ラボ対策

# はじめに
先日、「AWS Certified SysOps Administrator - Associate(SOA-C02)」に合格したので、
私が行った勉強方法と試験ラボ対策について記事にしました。

参考に、私のスキルはAWS SAA取得と、EC2やS3の基本操作を理解している程度です。

# 【忙しい人用】記事まとめ
#### 選択問題の対策

① テキストを読んで概要を掴む
↓
② 問題集(TechStock)を解く
↓　　　　　　　　　　　
③ 間違えたところについて調べ、自分の言葉でまとめる
↓
④ ②に戻る

#### 試験ラボ対策
S3、VPC、RDS、CloudFormationあたりのサービスを実際にコンソール画面で触ってみる


# 試験概要
受験料：15000円(税別)
試験時間：180分
問題形式：選択問題(55問)
　　　　　試験ラボ(2問)
合格点：720点以上(1000点満点)

# 勉強方法
私が実際に使った教材は以下の3つです。

・AWS認定資格試験テキスト　AWS認定SysOpsアドミニストレーター – アソシエイト(2970円)
問題集を解く前に試験の全体像を掴むために使用しました。
[AWS認定資格試験テキスト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9ASysOps%E3%82%A2%E3%83%89%E3%83%9F%E3%83%8B%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/481560908X/ref=sr_1_4?adgrpid=136114136776&gclid=Cj0KCQiA7bucBhCeARIsAIOwr--96Qb9hixCgrnRrYjsb8Aiekhaav8OLFoOUDk_Ue-mZ_iip_85miYaArP3EALw_wcB&hvadid=593560110175&hvdev=c&hvlocphy=1009239&hvnetw=g&hvqmt=b&hvrand=9421888767824241607&hvtargid=kwd-1650224253990&hydadcr=4076_13159858&jp-ad-ap=0&keywords=aws+%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88&qid=1670319184&sr=8-4&tag=googhydr-22)

・TeckStock
本番と同じレベルの問題を解説付きで600問以上解くことができます。ただ料金は少し高め(ベーシックプラン4480円)
[TeckStock](https://techstock.jp/)

・AWS公式ドキュメント（無料）
AWSの公式から出ているサービスの詳細資料です。
[AWS公式ドキュメント](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

## 選択問題の対策
　選択問題の対策は、Teckstockの問題集のみを使用しました。
Teckstockの問題集は全部で約600問ほどあり、定期的に問題が追加されています。
ただ序盤の問題はSOA-C01時の問題で、現行のSOA-C02とサービス内容にも違いがあるため、
私は後半の300問のみを解きました。(300問も解けば十分だと思います)

1週目は問題を解き、間違えたところを都度調べてエクセルにまとめる。という流れで進めました。
ここで、ノートやエクセル等にまとめる際、少し大変ですが調べた内容を自分の言葉に変えてからまとめることを意識すると、理解がより深まるのでおすすめです。
2週目以降は前の週で間違えた問題のみを解きなおし、全ての問題に正解するまで繰り返して解き直しました。



## 試験ラボの対策
試験ラボの対策ですが、実際にコンソール画面で操作(ハンズオン)してみるのが一番効率的だと思います。
（注意）作成したリソースは利用時間等に応じ料金が発生するため、ハンズオン後は必ず削除すること。

以下は私が試験ラボ対策で実際に実施したハンズオンです。
S3
・S3バケットの作成
・ライフサイクルルールの設定
・暗号化設定(KMS)
VPC
・プライベートサブネット、パブリックサブネットの作成
・セキュリティグループの作成
・VPCフローログの設定
RDS
・パラメータグループの作成
・暗号化設定(KMS)
・RDSの起動
・スナップショットの取得
CloudFormation
・EC2とVPCを構築するテンプレートの作成
・変更セットの利用

CloudFormationに関しては、試験ラボに出ないと思いますが、少し触ってみた程度でも
CloudFormationに関する選択問題の正答率がかなり上がったので是非触ってみてください。

# 試験当日の感想
選択問題はTeckstockと似たような問題が多かったので、全く分からない問題はほぼ無かったです。
見直し含めて70分程で終わったので余裕をもって試験ラボに進むことができました。
試験ラボは事前にハンズオンで対策していたこともあり、思っていたよりすらすらと進めることができました。

# おわりに
最初SysOpsを受験しようと決めたときは、試験ラボに対する不安が大きかったですが、
試験ラボの対策をしたことで、結果的にサービスに対する理解を深めることができたので、
受験して良かったなと思います。
最後まで読んでいただきありがとうございました。
【WordPress】サイドバーにカテゴリー一覧を表示して、今いるページと一致する場合はクラスを付与する

## やりたいこと

サイドバーにカテゴリー一覧を表示して、リンク先はアーカイブページにしたい！

要件としては、

- 「All, Newsの子カテゴリー1, Newsの子カテゴリー2, Newsの子カテゴリー3」と並ぶ感じ
- 全て遷移先はarchiveページでそれぞれ条件にあう投稿が表示されること
    - 現在いる場合はクラスを付与して背景色を変えたい
- 「All」はカテゴリーNews（親カテゴリー4）その子カテゴリーを絞り込みの条件にしたい

## 実装したコード
sidebar.php

```php
<aside id="secondary" class="widget-area">
	<h2 class="section-title">CATEGORY</h2>
	<ul class="category-list">
    // All
		<li class="cat-item all 
		<?php
		$url =
			(empty($_SERVER['HTTPS']) ? 'http://' : 'https://') .
			$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
		$pathArray = explode('/', $_SERVER["REQUEST_URI"]);
		$path = $pathArray[1] . '/' . $pathArray[2] . '/' . $pathArray[3];
        if ((!$pathArray[3] && $url == home_url('/category/news/')) || $path == 'category/news/page') {
			echo 'current-cat';
		}  ?>">
			<a href="<?php echo home_url('/category/news/') ?>">ALL</a>
		</li>
		// News子カテゴリー一覧
		<?php
		$catid = get_the_category();
		$args = array(
			'child_of' => 4, //親カテゴリID
			'title_li' => '', //タイトルはつけない
		);
		wp_list_categories($args); ?>
	</ul>
</aside><!-- #secondary -->
```

## 解説

Allを見ている場合のパスは `localhost://category/news` または `localhost://category/news/page/1` などになります。一致する場合はcurrent-catクラスを付与します。

ページネーションで遷移した場合URLは `localhost://category/news/page/1` のようにカテゴリー名の次に `page`　、その次にページネーション番号がきます。

URL全体の比較でも良いのですが、ページネーションで遷移したページの場合、数値が変動するので面倒。

プロトコルとホストはなしでパスの比較したい部分だけを取り出して条件分岐に使用します。

ちなみに、現在アクセスしているページのパスを取得するコードが以下になります。

```php
	$url =
		(empty($_SERVER['HTTPS']) ? 'http://' : 'https://') .
		$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
```

ニュース一覧のURLは`localhost://category/news` です。

URLのパスの `category/news` が一致しているかで条件分岐します。

ニュース一覧のページネーション遷移時のURLは`localhost://category/news/page/1` などです。

URLのパスの `/category/news/page/`　 が一致しているかで条件分岐します。

```php
// pathを取得し''
$pathArray = explode('/', $_SERVER["REQUEST_URI"]);
$newsCatPath = $pathArray[1] . '/' . $pathArray[2];
$newsChildCatPath = $pathArray[1] . '/' . $pathArray[2] . '/' . $pathArray[3];
if ((!$pathArray[3] && $url == home_url('/category/news/')) || $path == 'category/news/page') {
			echo 'current-cat';
		}
```

1行目の`$_SERVER["REQUEST_URI"]` でURLのパスを取得し、 `explod()`で「/」を区切りに配列にします。

2行目、3行目で一致させるパスと比較できるよう、配列にしたパスの必要な部分だけを結合させて加工します。

子カテゴリーに `page` とあった場合は条件を変える必要ありです。

4行目でそれぞれ条件を比較しています。どちらかの条件に一致した場合は `current-cat` クラスを出力し、クラスの付与を行います。

## おわりに

サイドバーにこだわってたけどもしかして普通search.phpとかでやるのかも…？
オブジェクト指向がわからない

# このコードは、オブジェクト指向である
~~~java:Java
class A{
    public main(String arg[]){
        ~~数万行のコード~~
    }
}
~~~~

そんなわけあるかいな、、、と思うけどそうなのかもしれない。

# オブジェクト指向って。。。
**若おじさん「Javaで継承を意識したコードを書けてるからオブジェクト指向だぜ」
(´・ω・｀)キリッ**

そんな風に思っていたこともありました。
でも、最近思うんです。オブジェクト指向が結局なんなのかわからない。

# とりあえず、オブジェクト指向って何て言われているんだっけ？
いろいろ書いてありました。

・オブジェクト指向の3大要素は、「カプセル化」「継承」「ポリモーフィズム」
・「メッセージング（メッセージ送信）による決定の遅延の徹底」
・この言葉を作った人自身が、自分が考えていた範囲と違う言葉になったことを認めてて、正しい答えはもうどこにもないんですよね
・車が、、、、、

**みんな言うとること違う(´・ω・｀)**

# 原点にさかのぼってみよう
歴史を探したらWikipediaに書いてありました。

>オブジェクト指向（object-oriented）という言葉自体は、1972年から80年にかけてプログラミング言語「Smalltalk」を開発したゼロックス社パロアルト研究所の計算機科学者アラン・ケイが、その**言語設計**を説明する過程で誕生している

ん？

上記の引用元のアランさんのSmaltalk(オブジェクト指向最初の言語)の歴史も少し読んでみました。※google翻訳だより

>プロのプログラマーの大きな問題に取り組み、初心者ユーザーが小さな問題を解決できるようにするための新しい設計パラダイム (私はオブジェクト指向と呼んでいます) 

ん？設計パラダイム？教えてWikipedia。。。

>プログラミングパラダイムは、プログラマにプログラムの見方を与えるものと言える。例えばオブジェクト指向プログラミングでは、プログラムとはオブジェクトを作りそれを管理するもの。関数型言語では、状態を持たない関数の評価の連続。

>多くのプログラミングパラダイムには禁じ手がある。純粋な関数型プログラミングでは、副作用があってはならない。構造化プログラミングでは、gotoの無制限な利用が戒められる。

これ、禁じ手みたいなのはあるけど基本的にはコードの書き方の話じゃないんじゃないか？

つまり。。。
# 勝手に結論
オブジェクト指向のコードを書くっていう表現が間違ってるんじゃないか？
オブジェクト指向なプログラミング言語のプログラミングをしているだけ。

**つまり、メソッド１つに数万行書かれたJavaのコードもオブジェクト指向(なプログラミング言語で書かれたもの)なんではないか。**

# でも、そうは言われてないよね
偉い人達は、オブジェクト指向なプログラミング言語でそれぞれ目指したものがあった。さらにオブジェクト指向という方向が画期的だったため、さらなる考えがどんどん生まれた。
それぞれオブジェクト指向があったこその考えだったので、いつの間に全部オブジェクト指向となって現在に至っているっぽい。

イメージを書いてみました。

https://qiita.com/sikimuOji/items/56b3e71c1e84ec77ab1f

# 結局
オブジェクト指向をコードの書き方として話するのであれば

>「オブジェクト指向とは、、、」

と語るのではなく、

>「オブジェクト指向の〇〇とは、、、」

ってちゃんと入れないと曖昧すぎてその言葉に何の意味もたないんじゃないかっていうお話

**これは個人の見解であり、これを信じたことによる損害について一切責任を負いません(´・ω・｀)**

## 引用(この辺りを読んでみてました)
http://worrydream.com/EarlyHistoryOfSmalltalk/

https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91

https://jp.quora.com/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B/answers/123165842?ch=10&share=7e9263d2&srid=prdMO#cwYPL

https://twitter.com/sikimuOji/status/1598286310254743552

https://nowokay.hatenablog.com/entry/2022/12/08/153543

https://www.sejuku.net/blog/10188

https://ja.m.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%91%E3%83%A9%E3%83%80%E3%82%A4%E3%83%A0
[AIX] IBM Cloud PowerVS 環境で AIX をSMS(システム管理サービス)で起動する

#### はじめに

PowerVS 環境には一般的にオンプレミス環境で LPAR を操作す るHMC/PowerVC がユーザー側で操作することができないため、HMC/PowerVC を使用した LPAR 起動ができません。

PowerVS で提供されている範囲で仮想マシンのブート・モードを SMS(システム管理サービス)で起動するために、昔ながらの手法である起動中に 1 を入力し続ける操作を確認しました。

---

#### 環境

IBM Cloud PowerVS : AIX 仮想マシン

---
#### 流れ

1. 仮想マシン起動中にコンソールを開いておく
2. 仮想マシン停止
3. 仮想マシンの起動
4. 仮想端末上のブート時に SMS メニューが開くように 1 を入力する
5. SMS メニューが開くことを確認する


* 注意事項：
　・サーバーが起動していないとWebブラウザ上でコンソールがオープンできません。
　・仮想マシンの停止時間が長いとWebブラウザで起動したコンソールでdisconnectが発生し画面表示が消失する場合があります。

---
#### 実施内容

##### 1. 仮想マシン起動中にコンソールを開いておく


サーバーが起動している際にブラウザ上で「コンソールのオープン」を実行します。


![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/c1e575b2-79c9-0d0d-d91c-087bf6edb935.png)


![スクリーンショット 2022-12-08 17.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/ae839106-0c40-898e-27c1-c49caaa4d0fa.png)


サーバーが停止状態の場合はコンソールがオープンできないので事前に実施しています。


![スクリーンショット 2022-12-08 17.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/0d7d0812-5dfa-340f-d4d7-005dec9b0ddb.png)


---

##### 2. 仮想マシン停止

![スクリーンショット 2022-12-08 17.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/2c5f4d75-423f-7713-42fa-89dd8d076a9b.png)


![スクリーンショット 2022-12-08 17.36.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/3204473c-ca95-893f-fa4a-f97d09f9574c.png)

---
##### 3. 仮想マシンの起動

PowerVS ブラウザ上で対象仮想マシンの開始を実行

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/2d86b165-2c78-6d76-91ac-e278dc4d9d90.png)


##### 4. 仮想端末上のブート時に SMS メニューが開くように 1 を入力する


事前に開いているコンソールの下記の起動中メニュー画面で 1 を連打....
すぐに次のプロセスに進むのでタイミングに注意が必要です。

![スクリーンショット 2022-12-08 16.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/e46105b4-00d8-c96c-47e7-96a1e5c86ab9.png)

##### 5. SMS メニューが開くことを確認する

無事 「1」が通っていると、SMSの画面が表示されます。


![スクリーンショット 2022-12-08 16.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/ab8f6eb4-7082-fad4-bc78-4f04d49b9f52.png)


ここから NIMでのインストールに使用する Remote IPL の設定などを実行することができます。

---

#### その他の方法

PowerVS NIM 環境では maint_boot 操作で起動ができることが IBM Cloud のドキュメントに記載されています。

[ネットワーク・インストール管理 (NIM) サーバーのセットアップ](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-provisioning-nim)

> 詳しくは、[Setting up NIM to boot into maintenance mode](https://www.ibm.com/support/pages/setting-nim-boot-maintenance-mode) を参照してください。 このプロセスに不慣れな場合は、新規サポート Case を作成してください。


筆者が実行している PowerVS NIM 検証環境ではまだ NIM の maint_boot が確認できていません。
Case を作成して問い合わせる必要がある様子です。(記載時点では Case の起票は未実施)


以上です。
SendGrid 入門


# 初めに

[システムアイ Advent Calendar 2022 ](https://qiita.com/advent-calendar/2022/systemi22) 9日目の記事になります。
今回は、以前の仕事場で使用していたSendGridのサービスを紹介します。

# 今回の環境
Node.js 16 
Visual Studio Code

# SendGridとは
クラウド上で管理されているメール配信サービスです。<br>個人での使用も可能です。

- SendGridは、販促メールに特化しています。<br>各キャンペーンごとに、リクエスト率、開封率、URLなどのクリック率を把握できます。
- WebAPIも提供されているので、DBに登録されているユーザーへ一斉送信みたいなことも可能です。
- メールテンプレートとプログラムを利用して、会社名やユーザーの名前などを動的
に変更しながらメールを送ることも可能です。


# 他サービスとの比較
|  ＃  |  SendGrid  |  Amazon SES  |  ブラストメール  |
| ---- | ---- | ---- | ---- |
|  値段  | 0円～ ※1| 1 IP あたり 24.95 USD/月 |月額 3,000円 〜 <br>＋初期費用 10,000円<br>※2
|  個人利用  |  可能  |  可能  |  不可(個人事業主なら可能)  |
|  送信可能なメールサイズ  |  30MB  |  40MB  |  50KB  |

※1・・・30日間は無料で使用可能。Proプランの場合12,000円/月
※2・・・Proプランの場合、30,000円/月 初期費用50,000円
(2022年12月調べた時点の情報)

# 登録方法
以下のサイトから登録します。
https://sendgrid.kke.co.jp/

- 右上の「無料で始める」ボタンを押すと、登録するメールアドレスを求められるので
入力して、送ります。
![新規会員登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/38f68e4d-78d2-afea-32ac-b9c45c8119da.png)

- その後、受信したファイルから登録者の名前や利用目的を聞かれるので、入力
して「登録する」を押すと、SendGridのログインIDとパスワードが表示されます。

- ログインすると、以下のようなダッシュボードが表示されます。
![ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/de69a793-5f04-a1eb-6697-ff56190d252d.png)

# メールを送信してみる

## SendGridのAPIキーを取得する
![apikey01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/cf1d288d-16cf-8ad9-c7e6-0b154fa7dc3a.png)

![apikey02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/a14a6a1c-0665-306a-5e3e-5dd92cc279a6.png)

その結果、APIキーが作成されるので、
これで、APIを利用できます。
![apikey03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/be68ff53-c239-9ca4-2197-0eeea50071cb.png)

## プログラムを実行する

SendGridはドキュメントがとても充実しており、サンプルプログラムがあるので、それを利用します。

```
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
const msg = {
 to: "info@systemi.co.jp",
 from: '自分のメールアドレス',
 subject: 'Sending with SendGrid is Fun',
 text: 'and easy to do anywhere, even with Node.js',
 html: '<strong>and easy to do anywhere, even with Node.js</strong>',
};
sgMail.send(msg);
```

実行結果は以下のとおりです。

![SendGridレスポンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/2fc7cb67-df48-e18c-0cba-10cc646bb688.png)


- SendGridダッシュボードのActivityを開くと、以下のような結果が出ます。
![メールステータス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/d084207c-323e-ef56-f7b6-6d436dac9541.png)

「Deliverd」のステータスが出ているともうメールは届いているので
実際のメールを見てみると、プログラムで送ったメールが届いていることが確認できます。

![メール受信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/8a9e5e70-a1d6-24f9-a510-896ac1429c2b.png)


# 最後に
　以上です。
　SendGridにはサービスを登録するだけで、メールの送信や送ったメールの分析が出来るので、気になった人は利用してみてください。
　~~※フリープランは30日間の利用制限があるみたいです。~~
　(2022/12/21 追記)
　後日、確認したところ、SendGridのFreeプランは制約はあるものの、基本無期限で使用できるようです。
  https://support.sendgrid.kke.co.jp/hc/ja/articles/204906155-Free%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84

# 参考資料
sendgrid
https://sendgrid.kke.co.jp/

Amazon SES
https://aws.amazon.com/jp/ses/faqs/#Amazon_SES_and_Other_AWS_Services

ブラストメール
https://blastmail.jp/
LaravelのエラーをSlackに通知する

Laravel上でREST APIを実行しているのですがエラーが起こるとユーザには何が原因でエラーになったのかがわかりにくくなります。

なので、Laravel側でFatalエラーが発生した際に開発者側にアラート通知をする仕組みが欲しいなと思ったので実装してみました。

# Laravelのログ機能を利用
こちらの記事を参考にしてLarvel側の設定を行いました。

https://hapicode.com/php/laravel-log.html#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AD%E3%82%AF%E3%82%99%E3%82%92-slack-%E3%81%AB%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86

Laravelの.envファイルに以下を記述

```.env
LOG_CHANNEL=slack
LOG_LEVEL=error
LOG_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxxxxxxxx
```

LOG_SLACK_WEBHOOK_URLのアドレスはSlack側で設定を行なって取得します。

# Slack側の設定
Slack Help Centerに記述があります。

https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8

1. Slack上で通知を受け取りたいワークスペースを作成
1. Slack APIで新しいAPIを作成
1. Slack APIのAppHomeメニューを開き、App Display Nameを設定
1. 上記記事に従ってWebHookを設定

:::note info
App Display Nameの設定についてはSlack Help Centerに記載がありませんが、行わないとエラーになりますのでご注意ください
:::

生成されたWebHookURLをLaravelの.envに設定してください。

# まとめ
今回はエラーレベルをerrorにしましたが、この辺のレベルは要件によって変更が必要ですね。
今後、他のメトリクス監視の通知もSlackに送るように設定してみたいと思います。
【Linux】/usr/bin/sudoの例から学ぶchmodによる権限変更でコマンドが使えなくなる仕組み 

## 概要
ファイルやディレクトリに対する許可属性を変更する`chmod`コマンドですが、
「安易に`chmod 777`とか使わないでねー」という注意をよく耳にします。

その理由として
- 第三者によって重要なファイルが読み取れる状態になり、セキュリティ上良くない
- sshできなくなる
- 一部コマンドが適切に実行できなくなる

などが挙げられます。

今回は「なぜ権限を変更することでコマンドが実行できなくなるのか」について、
その仕組みを学ぶため`/usr/bin/sudo`で検証してみます。

## sudoの権限を見てみる


```
$ ls -l /usr/bin/sudo
---s--x--x 1 root root      147240 Feb  8  2021 sudo
```
sudoはどのユーザーで実行してもrootで実行するというコマンドですが、「誰が実行しても所有者が実行したことになる」パーミッション属性を **「SUID」（Set User ID）** と呼びます。

`---s--x--x`
パーミッション属性にはr,w,x　（読み取り・書き込み・実行）の他に、SUIDの許可フラグがあり、実行権限が付与されているSUIDは`s`, 実行権限のないSUIDは`S`と表示される






## sudoからSUID許可フラグを剥奪する

**注意**　
以下の操作は実験用のサーバで実行しております。 
大事なサーバで安易に真似しないようにしてください。
```
$ chmod 777 /usr/bin/sudo

$ ls -l /usr/bin/sudo
-rwxrwxrwx 1 root root 147240 Feb  8  2021 /usr/bin/sudo

$ sudo echo hello
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
```

`chmod 777`を実行することによって、`usr/bin/sudo`からSUID許可フラグが剥奪される。

その状態でsudoを実行すると
`sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set`
とエラーが発生し、コマンドを実行できなくなる。

ここでいう`uid 0`とは、特権ユーザ(root)のことを指しており、rootによって所有されるべきコマンドなのに、パーミッション設定が適切でないためコマンドを正常に実行させない仕組みが働いている。
（`chown`で所有ユーザをroot以外にしても同様のエラーが発生する）

## 元に戻す

ルートユーザにログインする
`su root`

chmodで元に戻します。

```

$ chmod 4111 /usr/bin/sudo

$ ls -l /usr/bin/sudo
---s--x--x 1 root root      147240 Feb  8  2021 sudo

# 正常に使えることを確認
$ sudo echo hello
hello
```


`chmod 4111`
所有ユーザ・グループ・その他ユーザに実行権限を付与するのに加え、SUID許可フラグを付与します。

## まとめ
今回の検証では、「権限を書き換えたことによって、正常にsudoを実行できなくなる」ということが分かりました。
sudoだけが使えなくなるならルートユーザに切り替えて権限を元に戻せば大丈夫ですが、suやpasswdコマンドなど他の重要なコマンドが使えなくなったら、ルートユーザに切り替えて元に戻すこともできなくなり、**その他重要な操作も行えなくなってしまうかもしれません。**

（今回は権限変更によってコマンドが使えなくなる仕組みを検証してみましたが、`chmod 777`によってファイルにアクセスできなくなったり、sshできなくなったりと他にもいろいろと問題があるみたいなので、近いうちに検証したいと思います。）

権限操作は慎重に行い、くれぐれもルートディレクトリで実行しないように気をつけたいものです。

## 参考
https://n-guitar.hatenablog.com/entry/2020/11/13/135207

https://eng-entrance.com/linux-permission-suid

https://qiita.com/aosho235/items/16434a490f9a05ddb0dc

https://qiita.com/shyamahira/items/d9cd5d49ed61179e8227

https://qiita.com/koara-local/items/185838ea3fa37d9007f7
新米デザイナーが語る：スタイルガイドを導入して良かったこと

:christmas_tree:ディップ Advent Calendar 2022 9日目の記事です:christmas_tree:

 ## はじめに
皆さまこんにちは、ハラです。
赤いネズミでお馴染み、[dip株式会社](https://www.dip-net.co.jp/)で新米デザイナーをやらせてもらってます。

業界未経験で入社し、「デザインシステム」という言葉を耳にしはじめました。
その子属性にあたる「スタイルガイド」について知見を深めたく、個人の制作物で導入してみました。
今日は新米の観点でそのメリットをお伝えします。

 ## 記事を読んでほしい人
+ スタイルガイドとは何か知りたい人
+ 作成＆導入するメリットを知りたい人
+ 個人的に資料作成スキルを上げたい人

 ## スタイルガイドとは？
▼まずはその親である、デザインシステムとは
>デザインシステムとは「良いデザインを一貫性をもって提供するための仕組みである」
(略)
ここでいう「良いデザイン」とは見た目のことに留まらず、「良い体験」と言い換えることもできます。まずは組織のビジョンやミッション、サービスの提案価値やブランドなど実現したい姿を基点としてだんだんと具体化していきます。

https://www.concentinc.jp/design_research/2021/04/designsystem/

つまり、デザインの方向性を決める前段階の「何を良いデザインとするか」という概念のことです。

▼では本題の、スタイルガイドとは
>デザインシステムのもう１つの下位概念。デザインシステムそのものを記述した、静的なドキュメント。製品の見た目や雰囲気、UIパターンの使用事例、正しいタイポグラフィのスケールなど。

https://uxmilk.jp/69278

先述のデザインシステムに内包するものです。
このご時世といえばのクリスマス、赤と緑のカラーが連想されますね。
そのように「〇〇といえば、こんな色/こんな形」を校則手帳の様にまとめたものがスタイルガイドということです。

親のデザインシステムは、色んな職種の人を巻き込む＆構築に工数がかかるもの ですが、
子のスタイルガイドは、プロジェクト/個人単位でも作れるものと思っています。

## 導入してみた
今回、スライドを作る機会があったので、自分のスタイルガイドをつくってみました。

じゃーん！！
![Slide 16_9 - 32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957097/42a65306-e38f-da15-c882-44a0dfce753f.png)
(12/20 アプデ)



## 作り方
フォーマットは自由です。
テンプレサイトもありますが、個々人が分かりやすいように作って良いと思います。

項目は、一般的に
+ フォント(種類とサイズ)
+ カラー
+ アイコン
+ ライン
+ シャドウ
+ トーン(口調)
+ 余白
+ その他、デザインとして揃えておきたいこと

## つくってよかったこと
▼個人的に良かった点は
+ 自分の作成物のトンマナを揃えることができる
+ 作成しながら、全体のバランスを考えられる
└部分的に異なるあしらいにしてしまうのを防げる
+ カラーやフォントのパレットとして使える　
└ いちいち既出の色/文字を探したり、スポイトで抽出しなくて良い

▼ということは、組織単位となると下記が考えられる
+ メンバーの誰が手掛けてもデザインを揃えることができる
+ デザインルールの説明工数を縮めることができる

```
余談ですが...
私は駆け出しの身、なんと資料作成中に自分のデザインテイストを混同してしまうという事象がありました

そして今だから言える恐ろしいこと、
就活中、ポートフォリオの前半と後半でデザインフォーマットが異なるという現象も起こしました
スタイルガイドを作ってれば、上記の事象を防げたかも...と思いました
```
いきなりチームでガイドを作ろう！と掲げるのはハードルが高いと思いますが、
まずは個人で作ってみて そのメリットを周囲に提唱するのも良いのではないかと思います。

それでは皆さま、良いクリスマス＆年末年始を。

## 参考文献

https://www.concentinc.jp/design_research/2021/04/designsystem/

https://uxmilk.jp/69278

https://uxmilk.jp/67670
【速報】BumblebeeによってGPT2, BERT, Stable Diffusionその他，テキスト・画像の分類・生成がElixir/Livebook/Phoenixから簡単にできるようになった件

公式アナウンス

https://news.livebook.dev/announcing-bumblebee-gpt2-stable-diffusion-and-more-in-elixir-3Op73O

ひとまず下記の動画を見てください．

https://youtu.be/g3oyh3g1AtQ

超要約すると次のとおりです．

* Livebookを使ってGPT2, BERT, Stable Diffusionその他を使ったテキスト・画像の分類・生成が簡単にできるようになった
* Phoenixを使ってテキスト・画像の分類・生成を組み込んだウェブアプリを作れるようになった
* 機械学習のバッチ処理を簡単にできるようになった

続きはそのうち書きます．また，他の誰かが書いてくれても良いです．

Hex

https://hex.pm/packages/bumblebee

GitHub

https://github.com/elixir-nx/bumblebee

20221211 追記: @the_haigo さんが早速，Bumblebeeを試した記事を書いてくれました！

[ElixirのライブラリBumblebeeのStable DiffusionをM1 Macで試してみた](https://qiita.com/the_haigo/items/cbec41b5d1fd0db76ba4)

https://qiita.com/the_haigo/items/cbec41b5d1fd0db76ba4
VueのPiniaも<script setup>で書ける→もっと分かりやすい


VueではState Management SystemのVuexが公式のプラグインとして紹介されてきました。しかし、最新のVue3ではPiniaを使うようにとVue生みの親のEvan Youさんもお勧めしています。

では、State Management（状態管理）って何でしょうか？


YouTubeでも説明しています。
[![IMAGE_ALT](https://asameshicode.com/wp-content/uploads/2022/07/maxresdefault-12-1024x576.jpg)](https://youtu.be/8JCMSCRrPoE)


## **State Management（状態管理）**

State Managementとはいわばストレージ/ストア（倉庫）のことです。アプリケーションでストアを作っておいてそこにデータを保管できるようになります。

例えばユーザーがログインしたときのトークン、APIでフェッチしたデータ、アプリケーションの状態（例：フォームが提出したとかの状態）があげられます。


## **PiniaのAPIの使い方**

PiniaはVue2でもVue3でも使う事ができます。また、Options API（一般的に初心者向け）でもCompotion APIの書き方でもどちらでも対応しています。私の個人的な意見ではVue3でComspostion APIで書く方法が一番良いと思います。


## **なぜPiniaなのか**

Piniaを使う事でこの状態管理システム（Store Library）を各コンポーネントやページのどこでも使う事ができます。

もちろん、同じことが export const state = reactive({}) でもできますよね。

しかし、このやり方だとセキュリティに脆弱性があり、何を管理しているのか見られてしまう可能性があります。

この他にもデベロッパー用のツールがあったり、サーバー側でもレンダーにも対応することができるなど色々メリットがあります。


## **Piniaをインストール**

npmかyarnのコマンドでインストールしましょう。

```
yarn add pinia
# or with npm
npm install pinia
```
※NuxtJSの場合は[こちらから](https://pinia.vuejs.org/ssr/nuxt.html)

インストールが完了したらmain.jsにPiniaを追加します。

```
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const pinia = createPinia()
const app = createApp(App)
app.use(pinia)
app.mount('#app')
```

## **Piniaのファイルを作成しよう**

ではPiniaが追加できたらJSファイルでストアしたいデータを保管できる場所を作っていきましょう。

慣習的にsrcディレクトリの直下にstoreというフォルダを作成してそこにJavaScriptファイルで下記のコードを作るのが一般的になります。
```
import { defineStore } from 'pinia'
export const useCounterStore = defineStore({
  id: 'counter',
  state: () => ({
    counter: 0
  }),
  getters: {
    doubleCount: (state) => state.counter * 2
  },
  actions: {
    increment() {
      this.counter++
    }
  }
})
```


* stateは保管するデータの初期値をリターンするファンクションです。(dataと同じ概念）
* getters は stateを使ってデータをモディファイ（変更）したいときに使うファンクションです。（copmputedと同じ概念）
* actionsはasyncにできるファンクションのことです。（methodと同じ概念)


## **&lt;script setup>的なPiniaの使い方**

他のサイトでは上記のやり方でPiniaを使っていますが、今年からVueで使えるようになった&lt;script setup>を使ったやり方に合わせてPiniaも書きたい人は下のやり方をお勧めします。

※EventServiceは別ファイルのaxiosのapiコールです。
```
import { defineStore } from 'pinia'
import { ref } from 'vue';
import EventService from "@/plugins/EventService";
export const useMemberStore = defineStore('member', ()=> {
  const data = ref(null)
  const getData = () => {
    EventService.getMember()
      .then((response) => {
        data.value = response.data;
      })
      .catch((error) => {
        console.log("data:" + error);
      });
  }
  return {
    data,
    getData
  }
})
```
上のコードを見ても分かるようにgetterとかactionsとかの概念はなく普通のJavaScriptのコードで&lt;script setup>と同じように書くこともできます。

個人的にはこちらの方が書きやすいと思ったので是非試してみてください。

ではこれをコンポーネントから読み込めるようにしましょう。
```
<script setup>
import { useOfficeStore } from "@/stores/members/office";
const officePinia = useOfficeStore();
const officeData = officePinia.data
</script>
```
このようにどのコンポーネントからでもStoreにアクセスでき、グローバルにデータを管理することで後から見やすくなりますね。
WindowsFirewallで指定のIPを含む拒否ルールを無効にするPowerShellスクリプト

WindowsFirewallで指定のIPを含む拒否ルールを無効にするPowerShellスクリプトを作成してみました。

# 1.環境
Windows10

# 2.スクリプト
```firewallrule_disable.ps1
$siteiIP = "*11.22.33.44*"

# ログの出力先
$LogPath = ".\"
# ログファイル名
$LogName = "firewall_delete_ExecuteLog"
$LogFile = $LogName + ".log"
# ログファイル名
$LogFileName = Join-Path $LogPath $LogFile

function PrintMsg(
            $LogString
            ){

    $Now = Get-Date

    # Log 出力文字列に時刻を付加(YYYY/MM/DD HH:MM:SS.MMM $LogString)
    $Log = $Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + " "
    $Log += $LogString

    # ログファイル名が設定されていなかったらデフォルトのログファイル名をつける
    if( $LogName -eq $null ){
        $LogName = "LOG"
    }

    # ログファイル名(XXXX_YYYY-MM-DD.log)
#    $LogFile = $LogName + "_" +$Now.ToString("yyyy-MM-dd") + ".log"

    # ログフォルダーがなかったら作成
    if( -not (Test-Path $LogPath) ) {
        New-Item $LogPath -Type Directory
    }

    # ログ出力
    Write-Output $Log | Out-File -FilePath $LogFileName -Encoding Default -append

    # echo させるために出力したログを戻す
    Return $Log
}

PrintMsg ("Firewall規則無効化処理開始")
try {
#送信拒否ルールのName一覧取得
$RuleNameList = Get-NetFirewallRule -Action Block -Direction Outbound | Select-Object -Property Name

foreach ($item in $RuleNameList) {

   $RemoteIP = Get-NetFirewallRule -Name $item.Name | Get-NetFirewallAddressFilter | Select-Object -Property RemoteAddress

   if ( $RemoteIP -like $siteiIP ) {
       
      #DisplayNameの表示
      $RuleName = Get-NetFirewallRule -Name $item.Name | Select-Object -Property DisplayName
      
      $naiyou1 = "指定サーバ宛て送信拒否規則を含むFirewallルール名は" + $RuleName + "です。"
      $naiyou2 = "リモートアドレスは" + $RemoteIP + "です。"
      $naiyou3 = "このルールを無効化ます。"
      $naiyou4 = "このルールの無効化に成功しました。"
      Write-Output $naiyou1 | Out-File -FilePath $LogFileName -Encoding Default -append
      Write-Output $naiyou1
      Write-Output $naiyou2 | Out-File -FilePath $LogFileName -Encoding Default -append
      Write-Output $naiyou2
      Write-Output $naiyou3 | Out-File -FilePath $LogFileName -Encoding Default -append
      Write-Output $naiyou3
      #ルールの無効化      
      Set-NetFirewallRule -Name $item.Name -Enabled False

      Write-Output $naiyou4 | Out-File -FilePath $LogFileName -Encoding Default -append
      Write-Output $naiyou4
      }else{
      $naiyou10 = "指定のIPは含まれていませんでした。ルール名は" + $item.Name
      Write-Output $naiyou10 | Out-File -FilePath $LogFileName -Encoding Default -append
      Write-Output $naiyou10
     }
}
} catch {
PrintMsg ("Firewall規則無効化処理に失敗しました")
PrintMsg ($error[0])
}

PrintMsg ("Firewall規則無効化処理終了")
```

# 3.スクリプトの実行
firewallrule_disable.ps1

指定のIPを含む拒否ルールが無効化され、実行ログ(firewall_delete_ExecuteLog.log)が出力されます。
csvファイルをインポートして複数ユーザのADパスワードを変更するPowerShellスクリプト

csvファイルをインポートして複数ユーザのADパスワードを変更するPowerShellスクリプトを作成してみました。


# 1.環境
Windows10

# 2.スクリプト

```users.csv
sAMAccountName;NewPassword
hogehoge1;hogepw1
hogehoge2;hogepw2
```



```chage_ad_password.ps1
import-module activedirectory

$ADUserID = 'domain\domainadmin'

$ADPW = "password"

$ADServer = "11.22.33.44"

$SecurePassword = ConvertTo-SecureString -String $ADPW -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($ADUserID, $SecurePassword)

# ログの出力先
$LogPath = ".\"

# ログファイル名
$LogName = "chage_ad_pw_ExecuteLog"
$LogFile = $LogName + ".log"
# ログファイル名
$LogFileName = Join-Path $LogPath $LogFile

#CSVファイル指定
$users = "C:\work\users.csv"

function PrintMsg(
            $LogString
            ){

    $Now = Get-Date

    # Log 出力文字列に時刻を付加(YYYY/MM/DD HH:MM:SS.MMM $LogString)
    $Log = $Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + " "
    $Log += $LogString

    # ログファイル名が設定されていなかったらデフォルトのログファイル名をつける
    if( $LogName -eq $null ){
        $LogName = "LOG"
    }

    # ログファイル名(XXXX_YYYY-MM-DD.log)
#    $LogFile = $LogName + "_" +$Now.ToString("yyyy-MM-dd") + ".log"

    # ログフォルダーがなかったら作成
    if( -not (Test-Path $LogPath) ) {
        New-Item $LogPath -Type Directory
    }

    # ログ出力
    Write-Output $Log | Out-File -FilePath $LogFileName -Encoding Default -append

    # echo させるために出力したログを戻す
    Return $Log
}

PrintMsg ("ADパスワード変更処理開始")

try {
#ADパスワード変更処理

Import-Csv $users -Delimiter ";" | `
Foreach { 
    $NewPass = ConvertTo-SecureString -AsPlainText $_.NewPassword -Force
    $ad_id = $_.sAMAccountName
    $ad_pw = $_.NewPassword
    $naiyou = "アカウント名： " + $ad_id + " パスワード： " + $ad_pw + " で設定します。"
     Write-Output $naiyou | Out-File -FilePath $LogFileName -Encoding Default -append
     Write-Output $naiyou
    Set-ADAccountPassword -Identity $_.sAMAccountName -NewPassword $NewPass -Reset -PassThru -Server $ADServer -Credential $Credential | Set-ADUser -ChangePasswordAtLogon $false | Tee-Object -FilePath $LogFileName -append
}

} catch {
PrintMsg ("ADパスワード変更処理に失敗しました")
PrintMsg ($error[0])
}

PrintMsg ("ADパスワード変更処理終了")

```
# 3.スクリプトの実行
```
chage_ad_password.ps1
```

ADのパスワードが変更され、実行ログ(chage_ad_pw_ExecuteLog.log)が出力されます。
CTO興味ある人へ：CTOの業務についてその２　チームビルディング/採用

CTOを長年やってるとよく聞かれる質問です。
```
CTOの仕事ってどんな仕事があるんですか？
```
から始まった**CTOの業務について**のその２です。

# チームビルディング
最も大きいタスクのうちの一つです。チームメンバーが居ないと仕事は始まりません。チームビルディングが上手く出来ればCTOのタスクの半分くらい終わった感じではないでしょうか。ただこのタスクのボリュームが大きいです。
先ずは**採用**からです。
## 採用の種類
最初に採用です。これには、新卒採用、中途採用、業務委託採用等あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/c2dd11cb-912d-a59c-a57c-1a8a3a7fa301.png)

- 新卒採用
新卒採用には、大学卒業生、高専卒業、高卒とあります。最近は学歴不問も増えてきてますが、新卒の場合は、スキルが無いため、地頭力をメインで見ます。この時、学歴＝地頭力として、大学で判断する事があるのも事実です。学歴不問で取る場合は、インターンシップを利用します。実際に働いてもらうのが一番わかり易いです。
- 中途採用
経験者採用です。エンジニアは特に覚える事が沢山あります。そこへの教育コストは多大なボリュームとなります。中途採用の場合は、教育コスト・時間をスキップする事が可能なためベンチャー企業では、ここが一番のボリュームゾーンとなります。しかし、新卒採用は、文化含めて形成する上で非常に強い力になりますし、会社への帰属意識も強くなるため新卒採用は重要な採用です。中途採用と新卒採用とのバランスを取る必要があります。
- 業務委託採用
業務委託は、中途採用よりもよりプロエンジニアの採用となります。SESの場合やフリーランスの場合もありますが、スキルを指定して採用するため、より即戦力となります。
業務委託エンジニアの良さについて、こちらの記事にしてます
開発組織を全て業務委託メンバーで構築した話
https://qiita.com/k1morikawa@github/items/b2257661dd75e7365507

## 採用方法の種類
また、採用方法についても色々あります。
- 媒体採用
人材採用の媒体等に出向するやり方です。100万くらい払って、媒体に載せてもらうのですが、採用できるかどうかはコミットされません。ページビューもある程度は想定できますが企業によって成果はマチマチです。日頃から会社ブランディングを強化しておかないと、ここの効果は低いです。立上げ短いベンチャーではあまり使われません。
- イベント採用
就職イベント等にブースを出して、採用に持っていくやり方です。中途採用ではあまり効果がありませんが、新卒採用の場合は、効果があります。理由としては、中途エンジニアの場合は、ネット上で色々な企業を検索して情報を得る事が出来ますが、新卒の場合は、会社を知らないので就職イベント等でまとめて色んな企業の情報を取得できた方が便利なためです。
- 人材エージェント採用
メインは中途採用に使われてました。エンジニアとして仕事経験のある方は、忙しくもあり、自分で探すよりもエージェントを使ったほうが便利です。且つ、年収交渉等もエージェントを使うと便利というのがあります。しかし、最近はエンジニアニーズの高まりもありエージェント自体もエンジニア獲得が難しくなってきてます。一方、新卒学生はネット情報からプログラミングが勉強できるため、最初からスキルをもった学生も多く、新卒採用に関しても最近はエージェントを使うシーンも増えてきました。
- スカウトメール
最近はここが一番ボリュームが大きいと思います。エンジニア自信がサイトに登録してるので、検索して能動的にスカウトメールを打ちます。人材エージェントだと勝手に情報を絞られたり、嘘の情報があったりするので、直接やった方がスピードアップのためスカウトメールでの採用が増えてると思います。最近では、競合企業も確認出来たり、スカウト年収もチェック出来るので自社との比較にも役立ちます。
- 自社媒体採用
ブランディングされた企業では、有効に機能してます。合わせてテックブログや会社情報を常に発信する必要があります。エンジニアの場合は、特に自分で探す能力があるため、自社媒体も上手くやれば機能性が高いと思いますが、運用が非常に大変ではありますので、ある程度の規模の企業でないと厳しいかも知れません。
- 社内紹介採用
自社の社員から紹介してもらうやり方です。紹介インセンティブ等を付与したりしますが、帰属意識が高い社員が多い会社でないと有効に機能しません。10人未満の時は有効な場面もありますが、逆にそれ以上になってくると成果が出にくい部分もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/fe167492-f67e-e5c9-576b-878cb1037cfe.png)

# まとめ
ベンチャーの立上げとしては、最初としては、社員採用は社内紹介で１０人くらいまで伸ばしながら、並行で業務委託さんに入ってもらうのが良いと思います。エージェントも使える場合は、使いながら、スカウトメールも打ちましょう。
自社媒体やイベント採用系は、ブランディングが重要となりますので、長い目で最初からテックブログや会社ブログ等の情報発信を構築する必要があります。採用については、当然ながら社内の福利厚生等の働きやすい環境整備も重要となります。
ひき続きチームビルディングについて記事を書いていきますので、フォロー、イイねお願いします！
Power Automate と Logic Apps について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。

[Azure Logic Apps でバッチ処理しよう - Qiita](https://qiita.com/e99h2121/items/a69e40d016f5df01b061)
でちょっと書いたが、 Power Automate と Logic Apps は同じ部分がある。

1. [Power Automate と Power Apps からロジック アプリを呼び出す - Azure Logic Apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/logic-apps/call-from-power-automate-power-apps)
2. [Power Automate からフローを Azure Logic Apps にエクスポートする - Azure Logic Apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/logic-apps/export-from-microsoft-flow-logic-app-template)

などという具合に使いまわしができる。なので
[Microsoft Power Automateのカレンダー | Advent Calendar 2022 - Qiita](https://qiita.com/advent-calendar/2022/powerautomate) も読んでおくと良いことがあるし
[ASCII.jp：Power Automate注目の新機能！ 「説明からクラウドフローを作成する」を試してみよう](https://ascii.jp/elem/000/004/110/4110644/) みたいなこともそのうち Logic Apps 側にも応用できるのかもしれない。

https://twitter.com/AzureSupport/status/1598285787090632705?s=20

最近はやりのチャット AI さんもお試ししてみると面白かったのでまた別日に... 
今年私が知らなかったことでした :santa: