OmniAICreator/Qiita-1.07M huggingface dataset:
SeleniumBasicでブラウザの最大化（サイズや位置の指定も）

# 概要

AccessのVBA ⇒ SeleniumBasic ⇒ Chromeの処理自動化
をやってる。

SeleniumBasic経由でChrome起動するとウィンドウが最大化しない。
最大化で処理結果確認したい場面になったら、毎回手動で最大化してる。
それ面倒なので、最大化も自動でやらせたい。

ついでにウィンドウサイズや位置の指定方法についても知っておく。

# やり方

```vb:動作確認サンプル
Option Compare Database
Option Explicit


'関数終了時にChromeが終了しないように、関数外で変数定義。
Dim WEB_DRIVER_ As Selenium.WebDriver


Private Function Tester()
    
    Set WEB_DRIVER_ = New Selenium.WebDriver
    
    'Chromeで動作確認
    Call WEB_DRIVER_.Start("chrome")
    
    '動作確認用に3秒待つ
    Call WEB_DRIVER_.Wait(1000 * 3)
    
    'ウィンドウサイズ変更
    Call WEB_DRIVER_.Window.SetSize(100, 100)
    
    '動作確認用に3秒待つ
    Call WEB_DRIVER_.Wait(1000 * 3)
    
    'ウィンドウ位置変更
    Call WEB_DRIVER_.Window.SetPosition(100, 100)
    
    '動作確認用に3秒待つ
    Call WEB_DRIVER_.Wait(1000 * 3)
    
    'ウィンドウ最大化
    Call WEB_DRIVER_.Window.Maximize
    
    '動作確認用に3秒待つ
    Call WEB_DRIVER_.Wait(1000 * 3)
    
    'フルスクリーン
    'ここでなぜか例外
    Call WEB_DRIVER_.Window.FullScreen

End Function
```

# 未解決の問題

```Window.FullScreen``` で下記になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/04b0e58e-0872-54a7-6df0-f80b4f9d1bf1.png)

```Window.Maximize``` でやりたいことできたし、フルスクリーンでの動作テストってほとんどやらないから一旦放置。

# 参考サイトさん

https://bookalittle.com/seleniumbasic-window-size-position-etc/

https://www.iceprobe.net/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E/selenium/selenium-%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-vba/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B-selenium-vba/

https://qiita.com/waokitsune/items/4148ddae42fc86a412f5

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2364
Microsoft Access for Microsoft 365 MSO (バージョン 2211 ビルド 16.0.15831.20098) 32 ビット
SeleniumBasic 2.0.9.0
Google Chrome 108.0.5359.125（Official Build） （64 ビット）

TODO:フルスクリーン時の例外解消。（Chromeのセキュリティ設定？）
指定された配列の要素を削除する(JavaScript)

指定された配列の要素を削除する方法です。JavaScriptで実装してみます

```JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ！！
var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const data = lines[0];
  const array0 = data.split(' ');
  const N = array0[0];
  const T = array0[1];
  const array1 = lines[1].split(' ');
  array1.splice(T-1,1);
  array1.forEach(data => {
      console.log(data);
  });
});
```

ポイントは
```JavaScript
array1.splice(T-1,1);
```

でspliceメソッドを使って１番目の引数が配列の要素の順番(番目)、２番目の引数が削除する要素数になります。
firebase loginできない　zsh: command not found: firebaseを解決


## 環境
Mac(M1, 2020)
vscode５

# [概要]
チャットアプリを作成中firebase loginしようとしたら下記のエラーにぶつかった。
色々調べるとnodeのパスが通してないのが原因の記事が多いので試してみても解決できなった。
firebaseの理解不足が原因でのエラー（初歩的な見落とし）
最終的には自己解決できたので理解を深めるため、自分なりに調べたことを記録しておきます
## ぶつかったエラー
```
ユーザー名MacBook-Air redelivery-app % firebase login
zsh: command not found: firebase
```
翻訳・意味
zsh: コマンドが見つかりません: firebase
## やったこと
1.nodeのパスをとうしてみた（×）
2.nodebrewのインストールができていなかったnodebrew -vで確認（できていた）
3.pakege.jsonを見返してみた（○）
4.$ npm install -g firebase-toolsを実行（○）

### 3.pakege.jsonを見返してみた（○）
```
 "dependencies": {
    "@material-ui/core": "^4.12.4",
    "@material-ui/icons": "^4.11.3",
    "@material-ui/system": "^4.12.2",
    "firebase": "^9.15.0",

    "react": "^18.0.0",
    "react-dom": "^18.0.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },

```
firebase-toolsがない（見やすいようにあえて行間開けてます）
### 4.npm install -g firebase-toolsを実行（○）
```
"dependencies": {
    "@material-ui/core": "^4.12.4",
    "@material-ui/icons": "^4.11.3",
    "@material-ui/system": "^4.12.2",
    "firebase": "^9.15.0",
    "firebase-tools": "^11.19.0",
    "react": "^18.0.0",
    "react-dom": "^18.0.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },
```
## 結果
loginできた。

## firebase-toolsがないとなぜfirebase loginできないのか？
firebaseプロジェクトの管理、表示、デプロイ等をするため


firebase奥が深いと感じています💦
わかったことがあれば追記します。
間違った認識などあれば教えて頂けたら嬉しいです🙇

## 追記
nerdctlのcompose upで出る警告を外す Ignoring: volume: Bind: [CreateHostPath]

しばらくdocker有料化で離れていたらrancher-desktopで同じことが出来るようになっていたのでコンテナベースに戻していた際に発生した警告シリーズ

WARN[0000] Ignoring: volume: Bind: [CreateHostPath]

原因
ショートパス↓の指定をやめたがっている模様
```
    volumes:
      - ./redmine/files:/usr/src/redmine/files
```


書式的な置き換え
```
    volumes:
      - type: bind
        source: ./redmine/files
        target: /usr/src/redmine/files
```

ただし、windows版rancher-desktopはwslを利用しているので
sourceの指定はwsl上の/mntのアドレスを指定することになる

最終案
```
    volumes:
      - type: bind
        source: /mnt/c/redmine/files
        target: /usr/src/redmine/files
```
PLATEAU-SDKを試してみる

PLATEAU-SDK（テスト版）が出たという情報をいただいたので（感謝）
勉強もかねて、早速動作チェックをしてみました。

~~スタンダードのみの対応のようですので、構築時にはご注意ください。~~
2022.12.23 追記：URPでも問題なく動きました。確認不足ですいませんでした・・・。

## DL
GitHubからtgzファイルをDLして、パッケージマネージャーから
「Add pacakge from tarball...」でインストールが楽でした。

https://github.com/Synesthesias/PLATEAU-SDK-for-Unity

解説記事はこちら

https://synesthesias.github.io/PLATEAU-SDK-for-Unity/manual/Installation.html

## 起動方法
ファイルを追加後、上のタブに「PLATEAU」が追加されます。
![gg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/00a3503a-0938-458f-97c7-a57ac84a6495.png)

そのまま「PLATEAU SDK」を押すとウィンドウが開くようです。
![hh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/00039c84-db29-fc9d-e73a-0e06abc1c5df.png)


## 建物のデータを全てもってくる
どうやら、データが必要なようなのでPLATEAUからデータを持ってきます。
寒いので今回は那覇市の「CityGML」を選択してDLしました。

https://www.mlit.go.jp/plateau/open-data/

DL後、SDKの画面で「選択」ボタンから該当のファイルを選択して
エラーを解消しています。
![ii.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/9d6b99fe-cd64-8edb-184e-f8be59f8146c.png)

#### この際、DLしたデータはすべてUnityに入れないとうまく反映されないようですのでご注意ください。

## モデルの範囲選択
SDKでエラーがない状態で「範囲選択」をすると、Sceneビューが切り替わるので
マップに切り替えたい場所を指定します。

![jj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/582643a7-dc08-d07e-ff7e-f57183d74209.png)

ちょっとここが判りづらいのですが、Sceneの中に「決定」というボタンがあるので
そちらを押します。
![kk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/60422519-20f1-9aa1-1a01-132c0c0ed234.png)

## モデルのインストール
すると、今度はSDKに項目「地物別設定」という項目が増えていますので
適宜内容を変更します。
今回は何も触らず、一番下の「モデルをインポート」を選択しました。
![ll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/9dc1c9a8-4b54-4ac7-c48c-3ad7f8946c40.png)

## Sceneを確認
コツを掴んだらもっと臨んだ風景が手に入るかもですね。

![mm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/d44109f1-1cf2-acc4-0928-fed0cf5be669.png)
Outlookで終了時に削除済アイテムフォルダーの中身を空にする設定

# やり方

左上の『ファイル』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b94f6a07-a1ed-79cd-2df0-4f04064f2349.png)

左下の『オプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/28969755-d284-219a-d8a9-8f22c153e607.png)

『詳細設定』の『Outlookの終了時に、削除済みアイテムフォルダーを空にする』にチェック入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/12dcb12b-16a4-f63e-cd4a-d07a8dd60cef.png)

# 蛇足

オプションに『メール』っていう項目あるから、「そこにあるのかな？」って思って探したけど無かった。

# 参考サイトさん

https://support.microsoft.com/ja-jp/office/-%E5%89%8A%E9%99%A4%E6%B8%88%E3%81%BF%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E7%A9%BAoutlook-9196f9a0-7c10-4802-9afa-269a7dcfd11f

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2364
Microsoft Outlook for Microsoft 365 MSO (バージョン 2211 ビルド 16.0.15831.20098) 32 ビット
[go] [terraform] lambdaのsource_code_hashが毎回更新される

# 前提
goのバージョンとterraformのバージョンは以下
今回の記事の対象は恐らくgo 1.18以降を使っている人
```shell
go version
go version go1.19.2 darwin/arm64
terraform -v
Terraform v1.3.6
```

# 今回の問題
terraformで以下のようなコードでlambdaのリソース管理をしていた
```terraform
resource "aws_lambda_function" "go_function" {
  filename         = "go_function.zip"
  function_name    = "go_function"
  handler          = "main"
  source_code_hash = filebase64sha256("go_function.zip")
  runtime          = "go1.x"
}
```
`go_function.zip` はgithub actionsのworkflow内でbuildしたbinaryをzip化していた。
その際のコマンドは以下
```sh
GOOS=linux GOARCH=amd64 go build -o dist/go-function go-function
zip -j go_function.zip dist/go-function
```
なおbinaryファイルとzipファイルはgitignoreしている。


lambda以外にもAWSのリソース管理を同じリポジトリでおこなっており、他のリソースをコード化しcommit後planを確認した。
goのソースコードに変更はないのだが、planでlambdaの`source_code_hash`の差分が出る
```
 # aws_lambda_function.go_function will be updated in-place
  ~ resource "aws_lambda_function" "go_function" {
        id                             = "go_function"
      ~ last_modified                  = "2022-01-01T00:00:00.000+0000" -> (known after apply)
      ~ source_code_hash               = "old hash" -> "new hash"
        # (3 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }
```
## 試した事
zip化する際に日付とかの余計な情報を持ってしまっているのでは？
と思い調べたが、よく分からず...
たどり着いたのがterraformの [archive_file](https://registry.terraform.io/providers/hashicorp/archive/latest/docs/data-sources/archive_file)を使えばzip化を行うことができ、`output_base64sha256` を `source_code_hash`に使えば良いという記事
早速以下に変更し試してみる
```terraform
data "archive_file" "go_function_zip" {
  type        = "zip"
  source_file = "../dist/go-function"
  output_path = "../dist/go_function.zip"
}

resource "aws_lambda_function" "go_function" {
  filename         = data.archive_file.go_function_zip.output_path
  function_name    = "go_function"
  handler          = "main"
  source_code_hash = data.archive_file.go_function_zip.output_base64sha256
  runtime          = "go1.x"
}
```
一度applyし、その後READMEだけを更新したコミットで差分を見てみる
```
 # aws_lambda_function.go_function will be updated in-place
  ~ resource "aws_lambda_function" "go_function" {
        id                             = "go_function"
      ~ last_modified                  = "2022-01-01T00:00:00.000+0000" -> (known after apply)
      ~ source_code_hash               = "old hash" -> "new hash"
        # (3 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }
```
上手くいかず。
色々試行錯誤していくうちに気付く。あれ？build後のbinaryファイルのhashが違う
READMEのみ更新したコミットでbuildしたbinaryファイルのhashと、一つ前のコミットでbuildしたbinaryファイルのhashが違った

# 結論
どうやらgo1.18以降ではbinaryファイルにコミットハッシュなどのmeta情報を持っているらしい
```sh
go version -m dist/go-function
dist/go-function: go1.19.2
	...省略
	build	-compiler=gc
	build	CGO_ENABLED=0
	build	GOARCH=amd64
	build	GOOS=linux
	build	GOAMD64=v1
	build	vcs=git
	build	vcs.revision=commit hash
	build	vcs.time=2022-01-01T00:00:00Z
	build	vcs.modified=false
```
この`vpc.revision`にcommit hashを持っていたため、goのリソースに何も変更がなくてもコミットする度に差分が出ていた模様
これはbuildする際に`-buildvcs=false`をつければbinaryファイルにこの情報を含めないよう出来るとのこと
って事でbuildする際のコマンドを以下に変更
```sh
GOOS=linux GOARCH=amd64 go build -buildvcs=false -o dist/go-function go-function
```
無事毎回差分が出なくなりました
メールアラート


+ [メールアラートの「追加のメール」に可変のアドレスを追加したい。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000LH0j4)

アイデアにccアドレスを使えるようにして欲しいというのがあって、その中で回避策が紹介されています。
[Workflow Alerts need EMail TO, CC, BCC control](https://ideas.salesforce.com/s/idea/a0B8W00000Gddu3UAB/workflow-alerts-need-email-to-cc-bcc-control?_ga=2.51078954.2027986920.1671601692-1934978597.1671601692)

While we don't have immediate plans to change Email Alerts, it's possible today to generate emails with rich control of To, CC, and BCC using the procedure described here: https://unofficialsf.com/using-send-rich-email-to-improve-workflow-rules-communication/

Basically, you can use Flow to generate rich, controllable emails, and you can trigger Flow to do that using either Workflow Rules or Process Builder. 

メールアラートのbefore insertができれば、Apexのトリガーで捕まえてccアドレスを追加できそうですが、個人的には見たことはないです。
メールアラートを出したいオブジェクトのafter insertトリガーとしてメールを送るものは探せば検索して出てきます。
メールアラート自体を捕まえるというよりはメールを出すオブジェクトにApexトリガかフローでメール送信するのが一般的な方法のように思いました。（今ある資産を使えなくとても面倒に感じますが...）


+ [フローでメールアラートを作成⇒本文にレコードのリンクを貼りたい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G5DU1SAN)

+ [ループのあるフローにメールアラートを追加する方法](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Fxabi)

+ [Flowからアラートメールをメールテンプレートから作成する時の注意](https://qiita.com/Keiji_otsubo/items/24b531b9e8c70428de4f)

# Send Email アクションを使用してフロー内でこれを回避することはできません (試してみました)。また、Salesforce以外のユーザーのメールからも送信できないため、連絡先のメールは論外です。

+ [mail Alerts "FROM:" email address - Opp or Contact owner](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfhVUSAZ)

# メールアラートでテンプレートを使う

+ [How do I enable the option to select classic or lightning email template in email alert?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jfusa)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f1fded66-9f49-2910-b9be-25f95b758fa9.png)
【ハッカソン】技術サポートを活用しよう

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の5日目の記事です。
5日目は、**技術サポート**について書きます。

## ハッカソンは技術サポートが充実
半数以上のハッカソンでは、**技術サポート**があると思います！
様々な企業が各社提供する**技術**の利用で困ったときに**サポート**してくれます
※国内最大級のハッカソン（[Digital Hack Day2022]()）では、なんと12サービスが技術提供されました！

提供技術を利用することはサポートを受けられる以外にも嬉しいことがあります！

## 技術サポートを活用するメリット
* **提供技術ごとに賞が用意されている**
提供技術をうまく活用すると獲得できることが多いです

* **ハッカソン用のアカウントがもらえる**
無料で利用できることが多いです

* **サポートが手厚い**
ハッカソン開催期間中は、常時サポートしてくれる人がいることがほとんどです

* **未公開のサービスに触れるチャンス**
たまに公開されていないサービスも提供されます

# おわりに
**提供技術**を使うと新たな発想が生まれることがあるので、時間がある場合は『**とりあえず触ってみる**』のが良いと思います！
baseUrlで設定したディレクトリにconstants.tsという名前のファイルを置くのは避けるべき

# はじめに

Advent Calenderの準備をするべく、Reactアプリケーションの開発を行なっていた時の話です。
baseUrlに指定したsrc直下に```constants.ts```を作成し、
定数を定義してimportすると下記のようなエラーが起きました。

```
モジュール '"constants"' にエクスポートされたメンバー 'BASE_URL' がありません。
```

### 「あれ、baseUrlの設定を間違えたかな? それとも定数をexportし忘れている?」

そう思い```tsconfig.json```や```constants.ts```を何度も確認しましたが、
間違っている様子はありません。
不審に思って調べていると、どうやら```constants```という名前が悪さをしていたことがわかりました。

# 再現方法

## 1. tsconfigにbaseUrlを設定する
```ts:tsconfig.json
{
  "compilerOptions": {
    ...
    "baseUrl": "./src"
  },
  ...
}

```

## 2. src/constants.tsを作成し、定数を定義する
```src/constants.ts```に定数を定義します。
例えば、```API_BASE_URL```を定義するとしましょう。
envファイルなどを追加すると余計な要素が増えるので、今回はベタ書きします。

```ts:src/constants.ts
const API_BASE_URL = "http://localhost:3000"

export {
  API_BASE_URL
}
```

## 3. 定義した定数を他ページから呼び出す。

定義した、```API_BASE_URL```を別のページでimportしてみます。

```ts:src/pages/sample.tsx
import { API_BASE_URL } from "constants"

export const Sameple = () => {
  ...
}
```

すると、```API_BASE_URL```に対して前述したようなエラーが出ます。
```
モジュール '"constants"' にエクスポートされたメンバー 'API_BASE_URL' がありません。
```

# 原因

原因は@types/nodeに"constants"という名前のmoduleが存在するためでした。

https://microsoft.github.io/PowerBI-JavaScript/modules/_node_modules__types_node_constants_d_._constants_.html

つまり、この"constants"モジュールの```API_BASE_URL```をimportしようとしていたけれど、
そんな定数は存在しないため、importに失敗してしまったというわけです。

# 解決策

### 1. 相対パスで指定する

解決策の一つは相対パスで指定することです。

```tsx:src/pages/sample/index.tsx
// import { API_BASE_URL } from "constants"
import { API_BASE_URL } from "../../constants"
```

ただ、深い階層になると、"../"が増えて見通しが悪くなるので、あまりお勧めできません。

### 2. constants.tsという名前を変更する

```constants.ts```という名前であるせいで、"constants"モジュールとコンフリクトするので、
```const.ts```などとすれば、importできるようになります。

```ts
import { API_BASE_URL } from "const"
```

### 3. constants.tsをベースディレクトリに置かない

べースディレクトリより下の階層に```constants.ts```を置くという解決策です。
ページ固有の定数なら、```src/pages/sample/constants.ts```としたり、
各ページやコンポーネントで共通のものなら、```src/common/constants.ts```としたりすれば

```ts
import { API_BASE_URL } from "./constants"
```
や
```ts
import { API_BASE_URL } from "common/constants"
```
というふうにimportできるので、"constans"モジュールとコンフリクトすることはありません。

# おわりに

以上、ベースディレクトリに```constants.ts```という名前の定数ファイルを置くのは避けた方が良い、という話でした。

そもそも、```constants/api_config.ts```などのように、
定義した定数の意図がわかるようにファイルを作成すれば良いだけのことかもしれません。

ただ、意外と知らなかった現象なので記事にしてみました。
みなさんは自分のように無駄に```tsconfig.json```と```constants.ts```を行ったり来たりする時間を送らないように気をつけてください。
Sudachi辞書：新語収集

## はじめに

[Sudachi辞書](https://github.com/WorksApplications/SudachiDict)は現在、約3カ月ごとにメンテナンスを行っています。
今回は、その作業のうち、新語の収集についてご紹介します。

## 語彙の収集
語彙をどうやって集めているのか。それは、人手です。実は、地道な作業です。
機械的に集めることもできますが、本当に目新しい語か、必要とされる語かは、やはり人での判断が必要と考えます。
そのため、日々ニュースやSNS等で語彙をウォッチし、辞書に登録していっています。

## 基準
語彙を集めるといっても、単に目新しいものをただ集めるというわけではなく、いくつか基準を設けています。

#### 既に登録されているジャンルの語か、関連する同意語や類義語、反意語などがあるか

たとえば、ニュース記事等で見聞きする各国の首脳名はすでに登録されているので、
定期的に新しい情報を確認し、対応するようにしています。

・各国首脳名
例：

    尹錫悦（韓国大統領2022年5月から）
    リズ・トラス（イギリス第78代首相。登録したときは現役でしたが、45日でまさかの辞任…）

銀行名や省庁名なども同様です。

・銀行名
例：

	徳島大正銀行（2020年に発足）
	三十三銀行（2021年に発足）

・省庁名
例：

	デジタル庁（2021年9月に設置）
	こども家庭庁（2023年4月に設置予定）

#### 枠がある語か
"枠がある"、というのは、あるジャンルで範囲が決まっている語があることを指します。
たとえば政党名、プロ野球の球団名などです。
こういったものは、一部が欠けているとバランスが悪いですし、同じ話題で使われる可能性が高いので、網羅するよう気をつけています。

・政党名
例：

	立憲民主党、国民民主党、参政党（いずれも2020年結党）

・プロ野球球団名
例：

	東京ヤクルトスワローズ
	オリックス・バファローズ


#### より多くの人が利用したり見聞きする語か
ニュースやSNSで見聞きする話題の語も登録しています。
例：

	黙食、ドラレコ/ドライブレコーダー、モデルナ、パルスオキシメーター
	リスキリング、ヤングケアラー、全国旅行支援、リングフィットアドベンチャー

日常的によく使う語でも登録されていない場合は、気づいたものから適宜登録しています。
例：

	入園券、赤鉛筆、不明点、過充電、未接種、置き配


## おしまいに
辞書には、あれがあってこれがない、ということができるだけないように、
バランスを取りながら登録するよう心がけています。
が、きりがない場合もあるので、取捨選択せざるをえません。

語彙は日々新しく生まれ、消えていきます。残るものもあります。
できるだけ多くの方にとって使い勝手がよいものになるよう、今後もメンテナンスを続けていく予定です。


※事例はすべてfull辞書
エンジニアに転職して1年が経ちました

# 1年経って...

[エンジニアに転職して３週間が経ちました](https://qiita.com/to-nakashima/items/036911e186b2acd115eb) を投稿してから、あっという間に1年が経ってました。
未経験でエンジニア転職した1年は怒涛の日々でしたが、成長を感じれたことも多いので、記事にしてみようと思います。
※ 入社当初の感想については、[上記記事](https://qiita.com/to-nakashima/items/036911e186b2acd115eb)を参考にしていただけると幸いです。

# 1年経って成長したこと

1. 自己完結でコーディングできることが多くなった

   - 入社後半年くらいまでは、やりたい挙動をどう実現していいか分からず（設計ができず）、まず人に相談しないと進められませんでした。
   - さらにいざコーディングを始めると、今後は実装に詰まってしまい、また人に相談しないと進められません。
   - 人に聞くことは悪いことではないですが、自分だけで作業できる範囲が極端に狭く、めちゃめちゃ時間がかかっていました。
   - より効率的なコーディングのためのアドバイスなどはレビュワーからもちろん頂くものの、今は実装したい機能がある程度、動作するところまで自分でコーディングできるようになってきたと感じます。

2. エラーに感謝できるようになった

   - 最初の頃はエラーが発生すると、めちゃめちゃテンパってました。エラーコードを翻訳し、内容を調べてみるもののなかなか原因を特定できず、「エラー＝起こってほしくないもの」でした。
   - エラーに対する知識や経験のストックがなく、原因を紐づけるのが難しかったことと、エラー発生に対するネガティブな感情からエラー内容の深掘りを無意識に避けていたように思います。
   - 今は、膨大コードの中から問題の箇所を特定してくれるエラーメッセージに対して、またその原因や対処方法の情報をWeb媒体で共有してくれている先輩エンジニアの方に対して、「ありがとう」と思いながらエラーと向き合えるようになりました。

3. 既存コードの編集が怖くなくなった

   - 当初作業が遅かった大きな理由の一つに、実装作業中に不要なコードが消せないことがありました。
   - 類似コーディングなどを参考にしながら実装するのですが、コード全体を理解できていないため、コードを消してしまい想定の挙動をしなくなった際に、変更前の状態に復元できなくなることが怖かったからです。
   - そのためなんでもかんでもコメントアウトで、コーディング画面がゴチャゴチャになり、さらに混乱するという悪循環に陥ってしまっていました。
   - 今は、別コードに変更して、ダメだったらもとに戻してといったことを自然にできるようになり、コードに埋もれることが少なくなりました。

# 1年前の自分かもしれない人へ
もちろんエンジニアとしてまだまだなのですが、1年経って、成長できたところは大きいなーと感じます。
くじけそうな時は何度も訪れますが、イヤなことじゃなければ、続ければなんとかなると思います。
またこの先1年も成長できるようにがんばります。
【GMC-4】ブロックを1行揃えて消すゲーム (笑)

学研の4ビットマイコン GMC-4 で、~~テトリス的な~~ブロックを1行揃えて消すゲームを作ってみた。
(「行」は横向きの並びを意味する)

# 遊び方

2進LEDの0の側を下にして構える。
プログラムを実行すると、4個セットのブロックが上から落ちてくる。
「1」キーを押すと、ブロックの落下を速くすることができる。
「0」キーを押すと、ブロックを即座に一番下まで落とすことができる。
ある行の枠が全てブロックで埋まると、その行のブロックは消え、上の行のブロックがその分下がる。

# プログラム

以下のプログラムは、[MikeAssembler](https://mikecat.github.io/mike_assembler/) でアセンブルできる。

```
target gmc4

	; 消去演出の準備
	TIY 0xF
	TIA 0
	AM
main_loop:
	; ブロックの位置を初期化
	TIY 6
drop_loop:
	; ブロックが底にあってさらに落ちようとしたら、消去へ
	AIY 1
	JUMP erase
	; ブロックを1段落とす
	AIY -1
	CAL SETR
	; 上部に (消灯させるべき) 空きがあるかを判定する
	AIY 4 + 0x10 - 7
	JUMP no_off
	AIY 7
	CAL RSTR
	AIY -7
no_off:
	; 判定用の加算を相殺、さらに1段落とす
	AIY -4 + 7 - 1
	; 落下間のウェイト
	CH
	TIY 9
wait_loop:
	TIA 0
	CAL TIMR
	KA
	JUMP no_key
	CIA 0
	JUMP no_hard_drop
	; 0 : ハードドロップ (即消去)
erase:
	; 下4個を点滅させる
	TIA 2
erase_loop:
	CH
	TIY 0xE
	TIA 0xF
	AM
	CAL DSPR
	TIA 0
	CAL TIMR
	AM
	CAL DSPR
	CAL TIMR
	CH
	AIA -1
	JUMP erase_loop
	JUMP main_loop

no_hard_drop:
	CIA 1
	JUMP no_key
	; 1 : 落下加速
	TIY 0
no_key:
	AIY -1
	JUMP wait_loop
	CH
	JUMP drop_loop
```

以下は、このプログラムの機械語表現である。

```
  | 0 1 2 3  4 5 6 7  8 9 A B  C D E F
--+-----------------------------------
0 | A F 8 0  4 A 6 B  1 F 2 D  B F E 1
1 | B D F 1  B B 7 E  2 B 9 B  2 2 A 9
2 | 8 0 E C  0 F 5 0  C 0 F 4  9 8 2 2
3 | A E 8 F  4 E D 8  0 E C 4  E D E C
4 | 2 9 F F  2 F F 0  5 C 1 F  5 0 A 0
5 | B F F 2  0 2 F 0  7
```

# 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/C6fPllCVRz0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

このゲームのフィールドは1列しか無いため、ブロックが底に着くと必ず1行揃い、必ず全てのブロックが消える。
(仕様です)
graphile-workerを使ったバックグラウンド処理

[Next.js + サーバーサイドTypeScript + 関数フレーバーでクリーンなアプリを作ったので実装意図とか書く Advent Calendar 2022](https://qiita.com/advent-calendar/2022/shwld)
の**22日目**。[株式会社mofmof](https://www.mof-mof.co.jp/)に生息している[shwld](https://twitter.com/shwld)です。

前日は[Next.js+URQL環境でPostgreSQLのPub/Subを使ったGraphQL Subscription](https://qiita.com/shwld/items/5ad8304683b3cd18e0e0)について書きました
# Next.jsでGraphQL Subscription環境を構築する

https://github.com/graphile/worker

プロジェクトでは、 `/apps/worker` 配下にワーカーを配置しています。
graphile-workerを選択した理由は、Redisを使わずに使えるというところです。
ただこちらも、前日書いた、pg-pubsubと同様、Redisを使ったほうが使いやすいライブラリが多いような気がします。

graphile-workerも特に使いづらいというわけではないのですが、turbopackの中ではbundleができなかったので、別途rollupでTypeScriptをコンパイルしています。
(この辺結構いろいろ改善点ありそう...)

## バックグラウンドタスクを作成する
使い方はわかりやすく、指定したディレクトリにタスクとなるファイルを作成するだけです。

```ts:tasks/calculateVelocity.ts
import type { JobHelpers } from 'db-background-job';
import type { CalculateVelocityPayload } from 'domain-interfaces';

module.exports = async function calculateVelocity(
  payload: CalculateVelocityPayload,
  helpers: JobHelpers
) {
  // TODO: バックグラウンドでベロシティを計算する処理
}
```

タスクを作成したら、以下のようなファイルをnodeで実行してあげれば、ワーカーが起動します。

```ts:index.ts
import { startWorker } from 'db-background-job';

startWorker().catch(err => {
  console.error(err);
  process.exit(1);
});
```

## タスクを指定してキューに入れる

`quickAddJob` を叩いてあげるとキューに入り、バックグラウンド処理が実行されます。

```ts
import { quickAddJob } from 'graphile-worker';

quickAddJob(
  // makeWorkerUtils options
  { connectionString: process.env.DATABASE_URL },

  // Task identifier
  taskId: 'calculateVelocity',

  // Payload
  payload
);
```
# 次回予告
明日はNext.jsとgraphile-workerをRailwayにデプロイするについて書きます
STM32G071とカラーOLED SSD1331で遊ぶ3 (「46」よろーを表示)



x Adafruit SSD1331 OLED Driver Library for Arduino を　インストール
x Adafruit GFX Library を　インストール

x 配線とプログラムは、Arduino UNOと同じ


目的
カラーOLEDのテスト

sclk 13　, SCL
mosi 11 , SDA
cs 10 , CS
rst 9 , RES
dc 8 , DC

有機ＥＬディスプレイ　０．９５インチ　９６×６４ドット　ＲＧＢ
[QT095B]
通販コード　P-14435
発売日　2019/09/02




![o_cop262.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3f5e1e64-5daa-8ac3-03f6-556497edab4b.jpeg)





https://qiita.com/caa45040/items/d63294769e833b6a29cd



https://qiita.com/caa45040/items/35a7ee9c49a6d78bd535





Arduino UNO と全く同じ。



```c++




//OLED_SSD1331_NUM_TEST1

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>


// You can use any (4 or) 5 pins
#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8


// Color definitions
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF


Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, cs, dc, rst);

//初期化
void setup() {

  display.begin();

  //display.fillScreen(BLACK);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.fillScreen(BLACK);

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  //46を設定
  int tempval = 46;

  //表示変換する
  char str1[3];
  str1[0] = '0' + (tempval/10);
  str1[1] = '0' + (tempval%10);
  str1[2] = 0;

  // 1行目に数字を表示
  display.println(str1);

  delay(1000); //1秒待つ

}//loop





```
enebularでnode-red その5

# 概要
enebularでnode-redやってみる。
クラウド実行環境を、やってみた。
ログに記録するには

# ログに記録する手順

debugノードをダブルクリックして、設定を行います。
システムコンソールのチェックボックスにチェックをいれ、完了ボタンを押下します。

# 実行結果

```
[Dec 22nd 2022, 06:33:59]:  2022-12-21T21:33:59.395Z	4ca364c5-1fdd-4d8f-ad3b-c5d99f814e08	INFO	21 Dec 21:33:59 - [info] [debug:4450b170f2529a69] 1671658439393

```

以上。
CTO興味ある人へ：CTOの業務についてその１１　働き方チェック

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

# 働き方チェック
## １．リモートワーク
コロナの影響でエンジニアのリモートワークは、一般的になってきて、エンジニアにとっては、リモートワークは必須となってます。
今後は、出勤に戻る可能性はありますが、フレキシブルな勤務体系を検討する必要があります。地方ワークも人財確保の大きな力になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/f8433236-4803-f0a3-5aed-358fec1a5216.png)
## ２．勤務時間の多様性導入
・フレックスタイム
・裁量労働
・出勤日のフレキシブル化（土日）
・時短勤務
・朝型、夜型の人向け整備
等の勤務時間を自由に選択できる働き方導入する。
## ３．集中タイムの導入

プログラミングをしている時には、集中する必要がありますが、集中モードに入るには、２０分程度時間が必要と言われてます。せっかく集中モードに入ったのに中断されると再度集中するには２０分が必要となり時間の無駄となります。
集中タイムを導入して、集中モードのみの時間を作りましょう
## ４．副業の導入
副業については、賛否両論あると思いますが、副業に許可するか、しないのかを議論し、社内に理由も含めて明確にしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/7aacd38a-dfc4-5b8e-c3bf-ae93df6649ee.png)
## ５．女性働き方改革
エンジニア部門の女性比率は、低い傾向があります。
女性にとっての労働環境を改善し、活躍環境を整備しましょう。
## ６．国籍の多様性
外国籍の方の雇用促進も視野にいれた多様な働き方環境の構築も重要です。


# まとめ
優秀なエンジニア人財の確保のために働き方の多様性は必要ですし、今いるメンバーの生産性向上、モチベーションアップのためにも、働き方の多様性は重要な問題です。
CTOが定期的なチェックを行い、必要であれば見直しを行います。

ひき続き記事を書いていきますので、フォロー、イイねお願いします！

# シリーズ記事まとめ
CTO興味ある人へ：CTOの業務についてその１　会社組織内での話
https://qiita.com/k1morikawa@github/items/5e9022a99a51d9a57576
CTO興味ある人へ：CTOの業務についてその２　チームビルディング/採用
https://qiita.com/k1morikawa@github/items/b2b3fb2246bd0984bab1
CTO興味ある人へ：CTOの業務についてその３　チームビルディング/評価制度
https://qiita.com/k1morikawa@github/items/edb2e3c20ce02a201eec
CTO興味ある人へ：CTOの業務についてその４　チームビルディング/キャリア戦略
https://qiita.com/k1morikawa@github/items/9a6573dbba510c699362
CTO興味ある人へ：CTOの業務についてその５　チームビルディングまとめ
https://qiita.com/k1morikawa@github/items/7a4c9163a69cd9303e90
CTO興味ある人へ：CTOの業務についてその６　組織設計
https://qiita.com/k1morikawa@github/items/0b59893da6ecbb886a64
CTO興味ある人へ：CTOの業務についてその７　技術力アップ
https://qiita.com/k1morikawa@github/items/fa50105d0e6af34a9961
CTO興味ある人へ：CTOの業務についてその８　セキュリティ管理
https://qiita.com/k1morikawa@github/items/a4d773ac12b4c4c745a5
CTO興味ある人へ：CTOの業務についてその９　システムチェック
https://qiita.com/k1morikawa@github/items/e2c1b5d3e16c88d2f250
CTO興味ある人へ：CTOの業務についてその１０　アジリティチェック
https://qiita.com/k1morikawa@github/items/319e5a5c594a92adc482
人生初めて転職してみるまで知らなかったこと

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

[自ら機会をつくりだし自らを変える発信 - Qiita](https://qiita.com/e99h2121/items/c4de1ecb072cb694a7e8)

で書いておいたとおりなのですが 2022 年は、人生初めて会社を辞めました。辞めてみただけではただの無職なのですが、いちおうそうではなく普通に次の職をいただけたので今まさに新人です。

突然の新人あるある～

- 先輩が忙しそうで話しかけづらい
- 初日何やかやで事務作業で終了してしまう
- [なにがわからないかわからない](https://qiita.com/K_Noko_224/items/745ecc0b604fd71177df)

だとかだと働いていてこのかた思っていたのですが、2022 年、人生 2 度目新人になってみて初めに感動したことをここに記録しておきます。

- なんか物理的に色々もらった
- オフィスすごかった (語彙力)
- と思いきや物理だけじゃなかった
- 製品たるソフトウェアにやっぱ感動した
    - 自社製品を使い倒すことで「ここをもっとこうしたらいいのにな」をすぐフィードバックできる。それが次の開発のアイディアの種になる。それが実現できたら十分製品への貢献になる、と改めて認識 ([前職も自社製品屋さん](https://qiita.com/advent-calendar/2022/advent-works-hi) だったので、一緒)
- で、結局 人
    - すごい開発者がいる
    - すごいひとたちがいる

... みたいな結果

- 先輩が忙しそうで話しかけづらいのでは
	- 話しかけて良い！
- 初日何やかやで事務作業で終了してしまうのでは
	- 初日から自己紹介させてもらって、顔合わせ！
- [なにがわからないかわからない](https://qiita.com/K_Noko_224/items/745ecc0b604fd71177df)のでは
	- [質問のパターン](https://qiita.com/e99h2121/items/95129fe0e94d2ed1120b#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE) さえあれば、どんどん冒険していける！

みたいな肌感が 3 か月かけて非常にリアルに体感値として引き上げられてきたような気がしています。それだけじゃない、前職に自分のアイデンティティってやっぱりあって、そこを卒業させてもらえた自信みたいなものに助けられていま楽しくやれているのがまたもう感謝です。人生は体力と胆力さえあればどうにかなりますね。


今年私が知らなかったことでした :christmas_tree:
Googleファイルのオーナー移行処理

# この記事について
- 業務都合によりGoogleファイルのオーナー移行が必要だったんですが、結構手間だったのでGAS書きました（4000ファイルぐらい）
- 異動時、退職時など、オーナー移行を自分でやる方は参考になるかもです
- 大量にオーナー移行のメールが飛ぶと受け取り側が困ると思うのでサイレント移行しています

# 1.自分がオーナーであるファイルの取得

## 書き出し先のスプレッドシート

- 自分がオーナーのファイルをシートに書き出します
- 書き出すデータは以下としました
    - parents:親ディレクトリ
    - filename:ファイル名
    - URL:ファイルURL
    - mimeType:ファイルタイプ

## サンプルコード

- 「dump??」にて個別に実行でもよし、「dumpAll」にてまとめて実行でもよし
- 処理時間制限があるので、一度お試しでも良いかも
- １行づつ書き出していますが、まとめて書き出すでOKです

```javascript:dump.js
function dumpFilesListMine(mimeType) {

  var query = "'me' in owners and mimeType = '" + mimeType + "'":
  var files = DriveApp.searchFiles(query);
  const sps = SpreadsheetApp.getActiveSpreadsheet();
  const sht = sps.getSheets()[0];

  var list = [];
  while (files.hasNext()){ 
    var file = files.next()

    var parentlist = [];
    var parents = file.getParents();
    while(parents.hasNext()){
      var parent = parents.next();
      parentlist.unshift(parent.getName());
      parents = parent.getParents();
    }

    var attiribute = [parentlist.join("/"),file.getName(),file.getUrl(),mimeType];
    
    var lastrow = sht.getLastRow()+1;
    sht.getRange(lastrow,1,1, attiribute.length).setValues([attiribute])
  }
}

function dumpAll(){
  dumpFolder();
  dumpSS();
  dumpSlide();
  dumpDocs();
  dumpForm();
  dumpPNG();
}
function dumpFolder(){
  dumpFilesListMine('application/vnd.google-apps.folder');
}
function dumpSS(){
  dumpFilesListMine('application/vnd.google-apps.spreadsheet');
}
function dumpSlide(){
  dumpFilesListMine('application/vnd.google-apps.presentation');
}
function dumpDocs(){
  dumpFilesListMine('application/vnd.google-apps.document');
}
function dumpForm(){
  dumpFilesListMine('application/vnd.google-apps.form');
}
function dumpPNG(){
  dumpFilesListMine('image/png');
}

```


# 2.オーナーの切り替え

## 切り替え情報を記載しているスプレッドシート

- オーナーを変更するシート「setOwner」を作成し、以下の情報を準備します
    - fileId:対象ファイルのID
    - mail:オーナー権限付与先のメールアドレス


## サンプルコード

```javascript:changeOwner.js
function readData(){
  const sheetName = 'setOwner';
  const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const lastRow = ss.getLastRow();
  const dataList = ss.getRange(2,1,lastRow - 1,5).getValues();

  const drv  = DriveApp;

  var fileId, mail;
  for (row of dataList){
    fileId = row[0];
    mail  = row[1];

    var chFile = drv.getFileById(fileId);
    var fileOwner = chFile.getOwner().getEmail();

    if(mail != fileOwner){
      var ret = ownerChange(mail, fileId);
      Logger.log([fileId, ret.role, ret.emailAddress]);
    }
  }
}

function ownerChange(mail, fileId) {
  
  //ファイルオーナー権限を移譲する
  var ret = Drive.Permissions.insert(
    {
      'role': 'owner', //writerとすると編集者権限になる
      'type': 'user',
      'value': mail 
    },
    fileId,  //ここにfileid変数のファイルのIDを入れる
    {
      'sendNotificationEmails': 'false'   //trueとすると通知が飛んでしまう
    }
  );
  return ret;
}
```
いかにして問題を解くか

# 逆向きに解く
　ずいぶんと昔にタイトルの書籍を読んだ記憶がある。その内容かはもう忘れてしまったが、「逆向きに解く」というやり方を行った。逆算思考とか、帰納的手法とかそのように呼ばれるあれだ。

　といっても過去の記事を紹介するのみとなる。

https://qiita.com/kyokucho1989/items/386e56b8a454288e8116

　以前、vuetifyを導入しようとしたさいにページ遷移がうまくいかない、という不具合に出会った。そうしてvue側が用意していた、`vue-turbolinks` をyarnで読み込んでやって解消した。解消したのはいいが、なぜこれでうまくいったかがわからない。

　turbolinkの挙動をうまいこと変更・修正している気がする。

　これは答えを見たほうが早かった。vue-turbolinksのコードを見た。わかった。

# 答えからみる

　「どうやってエラーを解決するか」はもっと抽象的に表現すると「いかにして問題を解くか」につながる。問題解決の手法を網羅的に扱ったのが、その本だ。ちょうどwikipediaに内容が書かれていた。

https://ja.wikipedia.org/wiki/%E3%81%84%E3%81%8B%E3%81%AB%E3%81%97%E3%81%A6%E5%95%8F%E9%A1%8C%E3%82%92%E3%81%A8%E3%81%8F%E3%81%8B

　特殊化などはよくやるやつで、「例えばこの条件だけ揃っていたらどうなる」「もっとシンプルな場合をつくってみる」などを行うことがある。

　良い本だが、売ってしまった。また書い直そうか。
react-router-dom v6 によるSPA実装

# はじめに

ReactでSPAをやろうと思っていろんな例をなぞっているのですが、なかなか動かない。ローカルで動いてもcodepenで動かない。やっと動いたので載せて置きます。テンプレート用。

元記事と言うか参考にしたサイト:  
React Router v6 はじめでもわかるルーティングの設定方法の基礎  
【最新バージョン対応】React Routerの使い方を解説  
など。


# 実行例 1
<p class="codepen" data-height="295" data-default-tab="result" data-slug-hash="dyjPqJO" data-user="kalz2q" style="height: 295px; 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/kalz2q/pen/dyjPqJO">
  hello-react-router-v6</a> by kalz2q (<a href="https://codepen.io/kalz2q">@kalz2q</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 実行例 2
<p class="codepen" data-height="260" data-default-tab="result" data-slug-hash="poZvqrq" data-user="kalz2q" style="height: 260px; 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/kalz2q/pen/poZvqrq">
  react-router-welcome-home</a> by kalz2q (<a href="https://codepen.io/kalz2q">@kalz2q</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 説明
reactとreact-domとreact-router-domが必要でバージョンにズレがあると動かない。

このcodepenの例ではcodepenサイトが用意してくれているskypackと言うcdnを使うことによって解決しました。

SPAはsingle page applicationでcodepenとかでページ遷移のあるサイトを作る時には必須だと思う。

ReduxとかNext.jsとかを使えばもっと簡単なのかもしれない。

Routeでpathを定義してLinkで飛ぶ。最初のページをどうするのかがまだわからない。実行例 1 では最初のページには飛び先のリストを表示して、実行例 2 ではページを指定しなかったり無いページを指定した場合ホームを表示すると言う結果になっている。後者が良いのではないか。
MySQLで更新した行を確認する

こちらは [MySQL Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mysql) 22 日目の記事です。

昨日は @hmatsu47 さんの [RDS for MySQL（8.0.30 以降）で Optimized Writes を試してみた](https://qiita.com/hmatsu47/items/5dd4528e2c22570bd29e) でした

----

MySQLでupdate文を実行すると以下のようにChangedで更新の有無を教えてくれます
```sql
mysql> update category set name = 'Action' where category_id = 1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> update category set name = 'Haction' where category_id = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```
CSVから更新クエリ生成して実行したときに、実際に更新された行を検知できたら嬉しかったのでその時の対応を記載します

## 想定しているケース
* CSVやらなんやらで渡されたデータをもとに更新クエリを作成し実行する
* 何らかの言語・ライブラリを使ってやるほどではない（差分見てupdated_at更新してくれるの便利）
* 一行ずつの更新クエリが大量にある（複数行更新ではない）

## 実装
もとの更新クエリ(update.sql)がこんなシンプルな作りだったとして
```sql
update category set name = 'Haction' where category_id = 1;
update category set name = 'Animation' where category_id = 2;
```
以下のように修正する
```sql
update category set name = 'Haction' where category_id = 1;
select 1 where row_count() > 0;
update category set name = 'Animation' where category_id = 2;
select 2 where row_count() > 0;
```

そして実行 ( `-N` はヘッダーを出力しないオプション )
```bash
bash-4.4# mysql sakila -N < update_with_return.sql > updated_ids
bash-4.4# cat updated_ids 
1
```

### 別実装
変数を使ったパターン
- 変更行のid取得クエリが変わるのが気になる
- 条件（クエリ生成元）にidがない
```sql
set @changed = null; -- ここは一回の宣言で使いまわしておｋ
update category set name = 'Haction' where name = 'Action' and (select @changed := category_id); 
select @changed where row_count() > 0;
update category set name = 'Animation' where name = 'Animation' and (select @changed := category_id); 
select @changed where row_count() > 0;
```

```bash
bash-4.4# mysql sakila -N < update_with_variable.sql > updated_ids
bash-4.4# cat updated_ids 
1
```

条件に引っ掛かる行が複数あるときは update文に `limit 1` を付けて、リダイレクトを追記モード( `>>` )で実行、実行後にupdated_idsファイルが増えなくなるまでループするとか
シンプルだけどスマートじゃないのでもっと適切な方法あったら教えてください

----

明日は @yk0807 さんの [MySQLが遅いと思ったときにやること](https://zenn.dev/kitam7987/articles/9392ce00d3a125) です
GCP動画分析AI（Video Intelligence API）を使ってみた①

はじめまして日本情報通信の片山と申します。

今回、GoogleCloud(GCP)の動画分析API（Video Intelligence API）を使ったサンプルアプリを作成してみました。

## まずGCPが提供する動画分析AIとは？

GCPの動画分析AIは、Video AIと呼ばれ、大きく分けて以下の二つの機能があります。

①AutoML Video Intelligence
②Video Intelligence API

それでは、二つの違いについて説明していきます。

## 「AutoML Video Intelligence」と「Video Intelligence API」の違いについて

まず「Video Intelligence API」ですが、これはGCPが事前に用意したモデルをもとにラベルを生成してくれます。
例えば、指定した動画に、子供が映っているとか、芝生の上にいるなど、動画コンテンツ情報のラベリングを行ってくれるものになります。

一方で「AutoML Video Intelligence」は、自らがカスタムラベルを作成し、それをもとにラベルを生成することができます。
事前に自らが学習用の動画を用意し、学習させ、その動画からラベル生成し、モデルを作成する必要があります。
例えば、子供が「踊っている」動画を用意し、学習させることで事前に「踊っている」のラベルを作成し、そのラベルをもとに動画を分析させるようなものになります。

つまり「Video Intelligence API」はGCPが作成したAIを利用し、「AutoML Video Intelligence」は自分で独自のAIを作成することができるものになります。

## 操作・機能について

操作に関しては、「AutoML Video Intelligence」はAPIだけでなくGUIも用意されていますが、「Video Intelligence API」の方は名前の通りで、APIのみでの操作となります。

次に機能に関してになります。
「AutoML Video Intelligence」と「Video Intelligence API」の共通で提供されている機能としましては、
保存された動画分析はもちろん、ベータ版としてストリーミング動画の分析があります。
その他には、「オブジェクトの検出とトラッキング」の機能があり、これは物体検知をすることができる機能となります。
例えば、動画のどこにボールがあるか等を検知することが可能です。

以下は、「AutoML Video Intelligence」でのみ使用できる機能となります。
一つ目は、「テキスト検出と OCR による抽出」です。
こちらは動画内に映っている書類の文字であるとか、Tシャツの文字などを検出してくれるものとなります。
次に「不適切コンテンツ検出」に関しては、アダルトコンテンツやバイオレンスなものを検出、「ロゴ検出」は、ブランド等のロゴを検出することが可能となります。
「クローズド キャプションと字幕の自動化」は、音声認識をして文字化する機能、「Celebrity recognition（アクセス制限）」として、有名人を検出する機能もあります。
またベータ版ではあるものの「顔検出」や、「姿勢推定機能付き人感センサー」と呼ばれる骨格検知機能も提供されています。

## まとめ
GoogleCloud(GCP)が提供する動画分析AIには、GCPが用意したAIと、個人が独自で学習・作成するAIの「Video Intelligence API」の2種類があり、
GCPが用意したAIの「AutoML Video Intelligence」には、文字や人物、ロゴなどを検出する機能が予め用意されています。

以上、GCPが提供する動画分析AIの概要の取り纏めとなります。
次回以降は、「AutoML Video Intelligence」について、深堀していく予定となります。
golang-migrateでmigrateできない時の確認事項【備忘録】

## 問題
golang-migrateでmigrateしようとするとエラーを吐かれる．
なぜ今roleの問題が発生する？
```
$ migrate -path db/migration -database "postgres://postgres:pass@localhost:5432/postgres?sslmode=disable" up
$ error: pq: role "postgres" does not exist
```

## 対処
先に対処法から紹介．
Path等に誤りがない場合、**ローカルでPostgresが起動しているか確認**．
起動している場合は停止させてから再度migrateを試みると通る！．．かもしれない．

ちなみにMacで停止させる場合は以下のコマンドを使う．
```
$ brew services stop postgresql
```

## 原因
ローカルでPostgresが同一のポート（大抵は5432）で動いている場合はローカルの方に接続されてしまうらしい．

## 参考
[Go言語とPostgreSQLで遊ぼう!~マイグレーション編~](https://selfnote.work/20201223/programming/playing-with-golang-postgresql2/#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85)
何故思うように動かないのか

[【完走目指す】初心者が25日で強くなる Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aruhitoganbaru) 
20日目です。
とりあえずここまでで躓いてきたことについてまとめておこうと思います。
# 動かない　　
せっかく書いたプログラムが動かない。　
今までも何度かあった。　
原因を探す→直す→また動かない　
動くようになるまでこの繰り返し。疲れる。　
ではどうするべきなのか。
# 考えた原因 
主に3つ　
1.スペルが間違っている　
たまにあるやつ。でも、これはちゃんとエラーが出てくれる。危ないのは大文字と小文字の打ち間違い。　
例:　
```
public int a;
public int A;
```
滅多にないが、大文字と小文字で別の変数が呼ばれる場合があるとする。この場合、エラーが出ないので動いてくれない原因を探るのに時間を要することがある。ちなみに、自分もアドベントカレンダー4日目で最初やらかしていた。　
対処法としては、似た名前にするのを極力控えることくらいしかないだろう。　
2.出来ると思い込む　
かなり多い。例えば、オブジェクトの角度を指定するために位置を取得するように書くとエラーになる。　
↓こんな感じ。
オブジェクト「A」があったとします
```
 A.transform.position = new Vector3(0, 0, 0);
```
位置はこれで取得できます。
しかし角度を同じように

```
A.transform.rotation = new Vector3(0, 0, 0);
```
こう書いてしまうと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/e1db02dd-22f3-1f67-7b4e-e77dfc88f900.png)
こうなります。
以下がうまくいく例です。
↓
```
 HariM.transform.rotation =Quaternion.Euler(0,0,6f);
```
初心者をだましに来ているのでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/2ddd724d-d72b-626f-51cb-dbf19f7fed4b.png)
ちょっとpositionがrotationに代わっただけなのに。
今の例には、落とし穴がもう一つ潜んでいますね。
数字にfをつけるかつけないかです。
２つを見比べてみましょう
```
 A.transform.position = new Vector3(0, 0, 0);
```
```
 HariM.transform.rotation =Quaternion.Euler(0,0,6f);
```
かっこ内の数字にfが付いているものといないものがあります。
中身をよく理解していないとごちゃごちゃになります。
# エラーが出ないことの大変さ
中身をあまり理解せず何となく作ったら、きっと動かなくなるでしょう。
現に自分も、作ったものに後々不具合が起きて直しています。
エラーが出ないとそれはそれで何かあった時に大変であることがよくわかりました。
3.可能性の見落し
エラーが出ない場合もある面倒な奴です。if文を使ったときとか条件分岐のどこかで、自分の考えていなかった答えが出てきてしまう。そういうことがあるでしょう。
でも、複雑になればなるほど見落しも増えるだろうしこれは実際に動かさない限り見つけることもできないのではないでしょうか。
# 対処法
これはもう、自分がちゃんと文の中身と起こりうる可能性を把握する以外にないでしょう。
文の中身の理解は頑張ればできるでしょう。しかし、起こるかもしれない可能性をすべて考えるのはなかなか難しいでしょう。
個人的には一気に作り上げるよりも、一文書いたらどんな動きをするのかその都度考えたほうがかえって早く済むのではないかと思います。

# まとめ
理解は、大事
この記事を書いた理由:
18にちめのスタンプカードにおいて、ちゃんと保存されない不具合が出ていました。
その時はエラーが出なかったのでそのままにしていたけど、あとでちゃんと動かなくなりました。
この不具合を直すために１日かかりました。やはり中身を理解しきれていなかったのが一番の原因だと考えています。これからは、気を付けて作ろうと思います。

20日目　終わり
【Unity初学者必見】知らないと損する<XMLタグ>の使い方

# はじめに


タイトルにもあります通り、この記事では、XMLタグの活用方法について書いています!


# この記事を書いた背景
現在私は、C#を使ったメタバースを開発を行なっているのですが、後から読んでも分かりやすいように、コーディングの際にXMLタグをよく使っていました。そしたら、プルリク時に「読みやすくていいコードだ」とCTOに褒められたので、**どこで、どのように記述するか**をまとめてみました。


※XMLタグをコメントとして使える言語は調べた限りC#でしか使えませんでした:sob:


# XMLとは？
XML (eXtensible Markup Language) は、データを記述するための標準的なマークアップ言語です。XML は HTML と似ていますが、HTML は特定の目的のために設計されているのに対して、XML は柔軟性を重視して設計されており、様々な種類のデータを扱うことができます。XML は、そのデータを記述するためのタグを自由に定義することができるので、XML ファイルにはそのデータに特化したタグが用いられます。


# 用意されているタグ
|タグ名|内容|
|:--|:--|
|summary|型また型のメンバの概要|
|remarks|追記(追加情報)|
|value|プロパティ値説明|
|para|記タグ内で段落作成が可能<br>summary・remarks・returns|
|param|メソッドパラメータ、型自動判定|
|typeparam|ジェネリック型[^1]パラメータ、型自動判定|
|paramref|インラインのパラメータ参照|
|typeparamref|ジェネリック型[^1]パラメータ参照|
|returns|戻り値|
|exception|例外|


# よく使うタグの使い方サンプル(C#での記述)
### `<summary>`の記述例
`<summary>`は**関数**に対して、コメントをつけることができます！すでに戻り値のある関数の１行上に<XMLタグ>開始の合図である"///"を入力すると、自動的に**summary**が生成されます！
![スクリーンショット 2022-12-22 2.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/738629af-a126-1a4e-5b14-c19a7a116749.png)


### `<return>`の記述例
`<return>`は**関数の戻り値**に対して、コメントをつけることができます！すでに戻り値のある関数の１行上に<XMLタグ>開始の合図である"///"を入力すると、自動的に**summary**と**returnタグ**が生成されます！
![スクリーンショット 2022-12-22 2.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/1654deb8-9726-0293-bc27-b561f1b4609c.png)


### `<param>`の記述例
`<param>`は**関数の引数**に対して、コメントをつけることができます！すでにある引数のある関数の１行上に<XMLタグ>開始の合図である"///"を入力すると、自動的に**summary**と**paramタグ**が生成されます！
![スクリーンショット 2022-12-22 2.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/fed0780a-e280-2a73-fb3c-8e2f558299d9.png)


XMLタグのコメントは、引数にマウスをホバーすると参照できます！
![スクリーンショット 2022-12-22 2.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/90650bc1-d101-a910-8648-2cf7fa65f83c.png)



# 参考
公式ドキュメント

https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/xmldoc/


# まとめ
コメントで使うXMLタグを使用していると、コーディング時のルールとして追加しても良いくらい、C#開発者には使用してほしいものです。しかし、XMLタグが使用されているかどうかは、マウスホバーでしか確認することができないため、拡張機能で関数に下線を引くなどがあればもっと使いやすくなると思いました！

ここまで読んでいただき、ありがとうございました！
難解プログラミング言語

# 難解プログラミング言語とは
端的に言うと簡単に読解できないプログラミング言語のことである.
いろいろあるが今回はBrainf*ckについて書いていく.
wikiペディアとかで調べても割と出てくるため, n番煎じのネタではあるが見守ってほしい.
また, 独自の解釈などが出てくるため詳しく知りたい人や, 正確に理解したい人はwikiペディアに逃げてほしい.

## BrainF*ckとは
文字通り脳が破壊される言語である.
なんとたったの8種類の記号だけで書けるため美しい.(あくまで個人の感想です)
チューリング完全なため非常に美しい.(あくまで個人の(以下略))
そのため簡潔に書けることから多くの派生言語が生まれた.

では実際にコードを見ながらどのようなものなのか見ていく.
これはBrainf*ckでHello, world!するプログラムである.
```
+++++++[>++++++++++<-]>++.<++[>++++++++++<-]>+++++++++.+++++++..+++.<++++++[>----------<-]>-------.<+[>----------<-]>--.<++++++++[>++++++++++<-]>+++++++.--------.+++.------.--------.<++++++[>----------<-]>-------.
```
本当に動くのか疑問に思った人もいるかもしれないが, これで本当にHello, world!ができてしまう.
動かしてみたい人には以下のサイトとかがおすすめだ.
https://kachikachi.net/brainfuck/

実際に上記のコードはどのようなロジックで書かれたか解説していく.
まず前提として, Brainf*ckはメモリに値を増やしたり減らしたりする言語である.
一つの列に大量の数字が入るそろばんをイメージするといいだろう.
それを下記の8つのシンボルで制御していくだけの簡単なお仕事だ.
| シンボル | 意味 |
| :----: | :----: |
| > | メモリの番地を一つ増やす|
| < | メモリの番地を一つ減らす|
| + | メモリの中身をインクリメントする|
| - | メモリの中身をデクリメントする|
| [ | メモリの中身が0なら対応する]の直後まで飛ぶ|
| ] | メモリの中身が0でないなら[の直後まで飛ぶ|
| , | キー入力をasciiコードに則って解釈しメモリの中に代入する|
| . | メモリの中身をasciiコードに則って解釈し出力する|

ここまで理解してしまえば, asciiコード表とお友達になればどこでも読めてしまう.
ここで最初のHello, world!のコードに戻り読み方を解説していく

## 読み方
どうせ標準出力であるとあたりを付けて"."が出てくるまでを一区切りと解釈して読んでいく.
そうすると最初の部分は
```
+++++++[>++++++++++<-]>++.
```
こうなっていることがわかる.
[の直前までの"+"は7個あるので, 現在のメモリの中身を7回インクリメンタルする.

|カレント|メモリ2|メモリ3|
| :----: | :----: | :----: |
| 007 | 000 | 000|

次に, 現在のメモリは0ではないので">"で次のメモリを見る
|メモリ1|カレント|メモリ3|
| :----: | :----: | :----: |
| 007 | 000 | 000|

次は"+"が10個あるので10回インクリメントする.
|メモリ1|カレント|メモリ3|
| :----: | :----: | :----: |
| 007 | 010 | 000|

"<-"とあるのでメモリを一つ左にずらしてデクリメントする.
|カレント|メモリ2|メモリ3|
| :----: | :----: | :----: |
| 006 | 010 | 000|

これがループするため,
|カレント|メモリ2|メモリ3|
| :----: | :----: | :----: |
| 005 | 020 | 000|

という具合で進み, 最終的に
|カレント|メモリ2|メモリ3|
| :----: | :----: | :----: |
| 000 | 070 | 000|

となる.
この時点で"]"にいて現在のメモリの値は0のためループを抜ける.
ループを抜けた後は">++"なので一つメモリを右に動かして2回インクリメントする.
|メモリ1|カレント|メモリ3|
| :----: | :----: | :----: |
| 000 | 072 | 000|

最後に"."なので72をasciiで解釈し出力する.
asciiコード表で72を見るとちゃんと"H"である.
そして出力してもメモリの中身はリセットされず値を保持する.

想定以上に長くなったため"H"の出力までで割愛する.
この後の処理は似たようなことの繰り返しのため気合で読めるはずだ.

## 最後に
最初の方にも触れたがBrainf*ckはその特性上とても派生言語が生まれやすい.
様々なものがあり見ていて楽しい.
次回はそんな特性を使ってさらに難読化をしようと考えた末に生まれたものを解説していく.
ここまでのご高覧ありがとうございました.
RPAツールとの上手い業務分担

## RPAツールとの上手い業務分担

DX推進の一環で、RPAツールを使用する機会が増えています。
RPAツールでは他アプリケーションとの操作切り替えをし、連続した操作ができる。
Excel操作を代替して操作してくれるなどあります。

いざ、RPAツールを使ってスクリプト開発をすると。。。全てRPAで完結させようとして躓いてしまうというのを良く見かけます。
例：データ加工時のクロス集計、文字列の整形など

そんな時は、Excelアプリケーションで操作過程を見やすくさせましょう。

### ファイルがある間処理をしたい。指定フォルダ内のファイル名を取得しわかりやすくしたい
この処理はRPAツールによってはRPAツール内で完結することもできますが
Excelを活用することもできます。

事前準備：データ加工用のExcelを作成保存しておく。
１．取得したファイルパス＆ファイル名を変数取得
２．データ加工用のExcelへ格納して変数の中身を貼り付けていく。
３．Excel機能の区切り位置で￥マークで区切る
４．ファイル名だけデータが入っている一番右の列に残ります。
**※一度設定すると設定したシート内で追加貼り付けする際も設定内容が保持されます**

その後にRPAで処理をするという流れだと、安定的に実行ができます。
【RPAのコマンド例】
Excelファイルを開く
＞繰り返し開始コマンド
（条件が同時に入れられるのであれば同時に入れる）
　条件はファイル名の入っている列内にデータがある間、処理を繰り返す。
　Excelセルコピー
　対象の貼り付け先を選択
　　・・・
＞繰り返し終了

![区切り位置設定１.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500721/93f66092-9c21-4c23-90b7-6a247a5467c0.png)
![区切り位置２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500721/ca985e66-332d-dd17-507d-2a2b9a04efd8.png)
![区切り完成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500721/c3e19bdc-8acf-30ad-79f4-17b8fc9ddaa2.png)
エンジニアリングマネージャーとしてのスクラムチームとの関わり方

# はじめに

この記事は[TDCソフト株式会社Advent Calendar](https://qiita.com/advent-calendar/2022/tdc)の25日目の記事です。

正直に言います。
今まで自身の役割を「エンジニアリングマネージャー」と名乗ったことはありません！
その前提で読んでいただければと思います。(前提条件)

私は約20年ぐらいシステムエンジニアを経験し、ここ5年ぐらいはアジャイル関連の業務に携わっています。
最近とあるエンジニアリングマネージャーの記事をみて、自身もエンジニアリングマネージャー的なロールだなと思い、自部門のスクラムチームとの関わり方を振り返ってみました。

# エンジニアリングマネージャー

### 定義
明確に定義されてはいないようですが、以下の4領域に関係するロールを指すことが多いようです。

- ピープルマネジメント
- テクノロジーマネジメント
- プロジェクトマネジメント
- プロダクトマネジメント

各領域の関与度は人それぞれですが、主としてはピープルマネジメントになります。
似たロールとしてはテックリードやプロジェクトマネージャーがありますが、テックリードは技術面のみカバーしますし、プロジェクトマネージャーはマネジメントするスコープがプロジェクトに限定されるので、そのあたりが異なります。

### ピープルマネジメント
では、主となるピープルマネジメントとはなんだと言うことになりますが、調べてみるとこちらもさまざまな観点があります。
それらを踏まえて、私が考えるピープルマネジメントとは、**いかにしてチームやエンジニアのパフォーマンスを最大限引出し、発揮させる**ことだと考えています。

# スクラムチームとの関わり方(自己流)

### 可能な限りスクラムイベントに参加する

今は私自身がスクラムチームのメンバーになることはありませんが、関係するスクラムチームのイベントには可能な限り参加するようにしています。
そうすることで、スクラムチームのメンバーに個別に状況をヒアリングしなくても、自身の目と耳で状況を把握することができるからです。
百聞は一見にしかずですね。

### 指揮(指示)しない

スクラムチームに自己組織化して欲しいという思いがあるため、スクラムイベントやそれ以外のコミュニケーションの場でも、スクラムチームの活動に関わる部分について指揮命令をしないようにしています。
ただし、スクラムチームが困っているときや、スクラムチームもしくはメンバーが大事なポイントに目が向けられていないと判断したときには、自身の経験則からアドバイスやフォローを行う事はあります。
その時も、上司からの指示と受け取られないように、最善の注意を払うようにしています。

### 雑談や1on1でのコミュニケーション

コロナ禍ということもあり、大半がフルリモートでスクラムをしています。
そのため、以前までのような社内での対面のコミュニケーションができない環境にありますが、[oVice](https://ovice.in/ja/)で雑談したり、1on1を活用してコミュニケーションを取ることで、適切な距離感を維持できるようにしています。
距離ができてしまうと、さまざまなところでネガティブな影響がでないとも限らないので。

### 情報開示

社内や部門の状況、お客様との調整事など、スクラムチームや各メンバーにとって関係しそうな情報は可能な限りオープンにしています。
提供する側がある程度フィルターした方がいいという考えもあると思います。
しかし、信頼関係構築や、自身では気付かなかったポイントなどがスクラムチームから出てくる事もあるので、情報を開示する方がメリットが大きいと考えています。

# さいごに

つらつらと述べてきましたが、全体的に理論的なバックボーンがないなぁということを痛感しているので、一度エンジニアリングマネージャーについて学んで、しっかりと**チームやエンジニアのパフォーマンスを最大限引出し、発揮させる**ことができるように勉強したいと思います。
この本[^1]とか良さそうですね。
[^1]:[エンジニアリングマネージャーのしごと ―チームが必要とするマネージャーになる方法](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%AE%E3%81%97%E3%81%94%E3%81%A8-%E2%80%95%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%99%E3%82%8B%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E6%96%B9%E6%B3%95-James-Stanier/dp/4873119944)