OmniAICreator/Qiita-1.07M huggingface dataset:
SharePoint OnlineでREST APIを使ってリストアイテムを登録/更新/削除する

# はじめに

[前回の記事](https://qiita.com/newbee_abs/items/cc39a9ff3941d0f349cd)の続きです！

SharePointOnlineで作成したリストに対してJavaScriptからデータの登録/更新/削除を行うメソッドについてまとめています。

# リスト名と対象アイテム
今回は以下のSharePointリソースに対して操作を行います。

## リスト
|リスト名|
|-|
|Fruits|

## リストアイテム
|カラム名|プロパティ|
|-|-|
|Title|テキスト|
|Quantity|数値|
|HasStock|はい/いいえ|

# POSTメソッドによるリストデータの登録
POSTメソッドでデータを追加する場合は、リクエストの`data`部分に登録するデータを設定します(各プロパティに対応する値を指定)。
また、リストの`ListItemEmptyTypeFullName`の値をHTTPリクエストボディに記述する必要があります。[^1] 

```javascript
// 登録データを設定
const data = JSON.stringify({
  '__metadata': { 'type': 'SP.Data.FruitsListItem' }, // typeにListItemEntityTypeFullNameの値を指定
  'Title': 'Orange',
  'Quantity': 1,
  'HasStock': true,
});

// SharePointリソースにアクセスするためのURLを設定
const url = `${(組織名)}/sites/${(サイト名)}/_api/web/lists/getbytitle('Fruits')/items`;

// ajaxリクエストを発行
$.ajax({
  contentType: "application/json;odata=verbose",
  data: data,
  headers: {
    "accept": "application/json;odata=verbose",
    "X-RequestDigest": $("#__REQUESTDIGEST").val(),
    "IF-MATCH": "*",
  },
  method: "POST",
  url: url
})
.done(() => {
  // 成功したときの処理をここに記述
})
.fail(() => {
  // 失敗したときの処理をここに記述
});
```

# MERGEメソッドによるリストデータの更新
MERGEメソッドを使用して、指定したIDのリストアイテムを更新することができます。  
POSTメソッドと同様に対象のリストの`ListItemEntityTypeFullName`の値をHTTPリクエストボディに含める必要があります。[^1]

```javascript
// 更新アイテムのIDを設定
const id = 1;
// 更新データを設定
const data = JSON.stringify({
  '__metadata': { 'type': 'SP.Data.FruitsListItem' }, // typeにListItemEntityTypeFullNameの値を指定
  'Title': 'Banana',
  'Quantity': 2,
  'HasStock': false,
});

// SharePointリソースにアクセスするためのURLを設定
const url = `${(組織名)}/sites/${(サイト名)}/_api/web/lists/getbytitle('Fruits')/items(${id})`;

// ajaxリクエストを発行
$.ajax({
  contentType: "application/json;odata=verbose",
  data: data,
  headers: {
    "accept": "application/json;odata=verbose",
    "X-RequestDigest": $("#__REQUESTDIGEST").val(),
    "IF-MATCH": "*",
  },
  method: "MERGE",
  url: url
})
.done(() => {
  // 成功したときの処理をここに記述
})
.fail(() => {
  // 失敗したときの処理をここに記述
});
```

# DELETEメソッドによるリストデータの削除
DELETEメソッドでデータを削除する場合は、削除したいアイテムのIDを指定してajaxリクエストを発行します。

```javascript
// 削除するアイテムのIDを設定
const id = 1;
// SharePointリソースにアクセスするためのURLを設定
const url = `${(組織名)}/sites/${(サイト名)}/_api/web/lists/getbytitle('Fruits')/items(${id})`;

// ajaxリクエストを発行
$.ajax({
  contentType: "application/json;odata=verbose",
  headers: {
    "accept": "application/json;odata=verbose",
    "X-RequestDigest": $("#__REQUESTDIGEST").val(),
    "IF-MATCH": "*",
  },
  method: "DELETE",
  url: url
})
.done(() => {
  // 成功したときの処理をここに記述
})
.fail(() => {
  // 失敗したときの処理をここに記述
});
```

# 参考ページ
[RESTを使用してリストとリストアイテムを操作する](https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest)

[^1]:GETメソッドを使用して確認できます。[参考](https://www.sjlewis.com/2022/02/09/using-sharepoint-rest-api-to-get-list-properties-listitementitytypefullname/)
RubyOnRailsでGoogleTextToSpeechを使う。

GoogleTextToSpeechに関する記事は、いくつかあるが、Rubyに絞ると良い記事がなく、比較的ハマったので、備忘録として、記録しておく。

## 結果として、こうなります。


``` Gemfile *.rb
gem 'google-cloud-text_to_speech', require: false
```

```*.rb
  require "google/cloud/text_to_speech"

  def self.generate_speech
    # client生成
    client = Google::Cloud::TextToSpeech.text_to_speech do |config|
      # サービスクライアントを作成し、ダウンロードした秘密鍵を指定する。
      config.credentials = "config/xxxxxxxx.json"
    end
　　# 設定値はこちら
    speech = {
      audio_config: {
        audio_encoding: "MP3",
        pitch: 0,
        speaking_rate: 1
      },
      input: {
        text: "こんにちわ"
      },
      voice: {
        language_code: "ja-JP",
        name: "ja-JP-Neural2-B"
      }
    }

    # The three arguments are all positional.
    response = client.synthesize_speech speech    
    # ここに音声ファイルが入ってます。
    return response.audio_content
  end
```


## 参考資料と解説

2023-01-10時点で、GoogleTextToSpeechのトップページに、Rubyのコードスニペットはなく、一番良い資料にたどり着くまでのリンクも見つけられません。

https://cloud.google.com/text-to-speech?hl=ja

参考にするべきは、こちらのRubyのAPI資料である。

https://cloud.google.com/ruby/docs/reference/google-cloud-text_to_speech/latest/MIGRATING

こちらの資料も、コードスニペットは、1.0からの移行に関するページしかないので、若干読みづらい。

## 認証について

ココらへんかなぁ。
サービスクライアントの作成については、下記記事など参照。

https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja


TextToSpeechの利用方法として、ユーザーの個人情報を利用するユースケースが想定されており、
その場合は、サービスクライアントは利用しないほうが良い。（そのためにカスタム質問が用意されている。）

単なる音声読み上げとしてつかったり、利用規約で正しくやり取りができていれば、サービスクライアントを使う方法で問題ないだろう。
あと、APIキーを利用した、アクセス方法はTextToSpeechでは利用できない。



上記のGEMを使わない方法は、サービスクライアントのキー情報を利用して、一時的なアクセスキーを作る必要があるので、google-cloud-text_to_speechのGemを利用した方がとても簡単。
[google-api-ruby-client](https://github.com/googleapis/google-api-ruby-client)というGEMもあるが、こちらを使わなくても、問題はない。

サービスクライアントがどういう認証を行っているかは、[認証方式の解説はこちらの記事がが良さそうです。](https://yosshiblog.jp/gcp%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AAapi%E8%AA%8D%E8%A8%BC%E6%96%B9%E6%B3%95/)


## まだ未解決の課題

サービスクライアントの設定情報をCredentialsで保存したいが、File読み込み以外の手順が必要そう。
Bootstrap5のメニューが閉じない

Bootstrap5のNavbarのハンバーガーメニューがなぜか閉じなくて、解決までに時間がかかったのでメモします。

以前のbootstrap4では、Navbarデフォルトのままだと、メニューが閉じないということがあったみたいですが、今回使用しているのはBootstrap5なのに。。。なぜ。。。

## 結論
**bootstrap.bundle(.min).jsとbootstrap(.min).jsを同時に呼び出していたため**でした。
どうやら、bootstrap.bundle(.min).jsはbootstrap(.min).jsを内包しているようです。
なので、二つ同時に呼び出すとbootstrap(.min).jsが二回呼ばれてコードが競合してしまっていたため不具合が起きたのかなと思います。

※minは圧縮ファイルのことです。
SQLで小計と合計を出力する（GROUP BY ROLLUP)

Synapse Analytics 専用SQLプールはSQL Serverと高い互換性を持っている一方で、一部使えないSQL構文もあります。
ただ、GROUP BYオプションでROLLUPはサポートされているようです。

すこし、案件でこのGROUP BY ROLL UPを使う機会がありまして、便利だなと思ったのでこちらで紹介します。

# 用途
**対象のデータの小計や総計（合計）を取得する。**
例えば、`ORDERS`と言うテーブルには`O_ORDERDATE`と言うdate型のカラムがあります。
年毎、月毎にどれくらいの件数があって、全体で何件ぐらいあるのかと言うのを調べるときに、この`GROUP BY ROLL UP`を使うといとも簡単に出力することが出来ます。

`ORDERS`全体件数
```SQL
select
	count(*) cnt
from
	dbo.ORDERS
;

--結果
cnt
150000000
```

`ORDERS`の`O_ORDERDATE`の年ごとの件数
```SQL
select
	 YEAR(O_ORDERDATE) YEAR
	,count(*) cnt
from
	dbo.ORDERS
group by
	YEAR(O_ORDERDATE)
order by
	YEAR
;

--結果
YEAR	cnt
1992	22810359
1993	22751520
1994	22760819
1995	22754973
1996	22819651
1997	22760815
1998	13341863
```

`ORDERS`の`O_ORDERDATE`の月ごとの件数
```SQL
select
	 YEAR(O_ORDERDATE) YEAR
	,MONTH(O_ORDERDATE)  MONTH
	,count(*) cnt
from
	dbo.ORDERS
group by
	 YEAR(O_ORDERDATE)
	,MONTH(O_ORDERDATE)
order by
	 YEAR
	,MONTH
;

--結果
YEAR	MONTH	cnt
1992	1	1932789
1992	2	1806307
1992	3	1930727
1992	4	1869426
1992	5	1931316
1992	6	1870607
1992	7	1932411
1992	8	1933741
1992	9	1868410
1992	10	1931810
1992	11	1870784
1992	12	1932031
1993	1	1934070
--省略
```

# 使い方
**SELECT文のGROUP BY句にROLLUPを追加**
実際に先ほど出てきた`ORDERS`テーブルを使って、`O_ORDERDATE`を全体の総計、年毎、月毎にROLLUPを使って集計してみます。

ROLLUPを使って、`ORDERS`の`O_ORDERDATE`の合計、年毎、月毎の小計を出力
```SQL
select
	 YEAR(O_ORDERDATE) YEAR
	,MONTH(O_ORDERDATE)  MONTH
	,count(*) cnt
from
	ORDERS
group by rollup(
	 YEAR(O_ORDERDATE)
	,MONTH(O_ORDERDATE)
	)
order by YEAR,MONTH;

--結果
YEAR	MONTH	cnt
NULL	NULL	150000000
1992	NULL	22810359
1992	1	1932789
1992	2	1806307
1992	3	1930727
1992	4	1869426
1992	5	1931316
1992	6	1870607
1992	7	1932411
1992	8	1933741
1992	9	1868410
1992	10	1931810
1992	11	1870784
1992	12	1932031
1993	NULL	22751520
1993	1	1934070
1993	2	1746810
1993	3	1933438
--省略
```

このように、小計や総計も取得して調べたい場合、ROLLUPを知っているととても便利である事がわかります。

# 備考
ちなみに、上記の例では年毎、月毎の小計と総計をそれぞれ出力していますが、年毎だけでROLLUPするとこんな感じになります。

ROLLUPを使って、`ORDERS`の`O_ORDERDATE`の合計、年毎の小計を出力
```SQL
select
	 YEAR(O_ORDERDATE) YEAR
	,count(*)  cnt
from
	ORDERS
group by rollup(
	 YEAR(O_ORDERDATE)
	)
order by YEAR;

--結果
YEAR	cnt
NULL	150000000
1992	22810359
1993	22751520
1994	22760819
1995	22754973
1996	22819651
1997	22760815
1998	13341863
```

便利です。ちょっと便利になる小技です。
動かして学ぶ！Python Django開発入門 第2版　メモ

## 注意

pycharm
references>プロジェクト>Pyhtonインタープリター
でDjangoを入れる

pythonのバージョンが違う場合
psycopg2あたりでバグる
解決策: venvを入れ直す

リスト7.3
タイポ
stylesheetじゃなくてstylsheet
jsdelivrじゃなくてjsdellivr

1つのファイルを作るたびにrunserverしてもエラーになることがよくある
例: 48%のビューを追加
次節で作成するフォームを書いてからじゃないとエラー

リスト8.4
INQUIRYのところを1箇所変えるだけ
図が長いからたくさん修正があると思うけど

リスト10.8
verification_sent.html
図10.7で作るファイルにない

リスト11.27
```diary: diary_detail```
スペースなくさないとバグる
```diary:diary_detail```

```ssh ec2_ec2-user```
途中から
```ssh ec2_app_admin```

HTTPS化でnginx.confいじったらバグった
戻せないからインストールし直し
```sudo yum remove nginx```

86%
```pip install -r requirements.txt```
でエラー
先にpsqlをインストール

90%
SES HomeにDomains>Email Addressesがない
検証済みIDで作成

90%
図12.29のSES制限の解除申請ではねられた
新たに
```
情報を追加します．

メールを送信する頻度: 1日100件
ウェブサイトやアプリの管理方法: https://github.com/XXX/private_diary 
ウェブサイトの URL: https://private-diary.XXX.com 
EC2, nginx, gunicornを起動しているときにアクセスできます．
```
と返信すると採用された

94%
空白がわかりやすいよう
```リスト12.10
0 4 * * * source~/venv_private_diary/bin/activate;cd~/venv_private_diary/private_diary;pythonmanage.pybackup_diary>~/cron.log2>&1
```

nginx.conf
バグったらリスト12.9に戻す
独自ドメインではなくElastic IPでなら動く

97%
リスト13.2
```return 301 https://$host$request_uri;```
でurlにしないように

## 誤植

58%
password_rest_from_key.html

リスト10.7
kindleでインデントがおかしい
<div class="mb-4 col-4">

リスト10.9
再申請\</a>.\</p>
の . いる？

リスト12.7
''が必要なところがある

## 本番環境　実行方法

何回も実行するのでメモ
1. awsでインスタンスを実行中にする
2. nginxを起動する
まずはSSH接続する
```
cd .ssh
ssh ec2_app_admin
```
```sudo systemctl start nginx.service```
確認する
```systemctl status nginx.service```

3. gunicornを起動する
まずはPython仮想環境に入る
```
source ~/venv_private_diary/bin/activate
cd ~/venv_private_diary/private_diary
```
```gunicorn --bind 127.0.0.1:8000 private_diary.wsgi -D```
確認する
```ps ax | grep gunicorn```

### 本番環境　終了方法

1. gunicornを停止する
```pkill gunicorn```
2. nginxを停止する
```sudo systemctl stop nginx.service```
(1. 2. はexitするだけでいいのだろうか)
3. awsでインスタンスを停止中にする

## 未完了のこと

Inquiryがどこにとぶのか

Log inのメールが送られない．

```python manage.py collectstatic```
requests.txtを読めないせい
代わりに自分でdjango-allauth, django-bootstrap5, Pillowをインストールした
```python manage.py makemigrations```
で怒られた

## 参考

AWSで独自ドメインの取得
https://dev.classmethod.jp/articles/relaxing-send-limit-and-removing-sandbox-restriction-in-ses/

ドメイン名をEC2インスタンスに接続
検索「aws ec2 ドメイン 接続」
https://aws.amazon.com/jp/getting-started/hands-on/get-a-domain/

Sourcetreeでコミットできなくなったら
https://otani-rest.site/sourcetree-github/
差分の反映は11章のメモ参照

github
https://github.com/j4pngthr/private_diary
xcodebuild で躓いた時の解決方法（備忘録）


## 環境
Mac
Ventura

## やったこと
Xcode コマンドラインツールの version を確認しようとするが、以下の error が表示される。
```
$ xcodebuild -version
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
```

Path がおかしいのかも？と思い、Path を確認。

```
$ xcode-select -p
/Library/Developer/CommandLineTools
````

以下に変更する。
```
$ sudo xcode-select -s /Applications/Xcode.app
```

再度 version を確認

```
$ xcodebuild -version
Xcode 14.2
Build version 14C18
```
いけたぽい！
ガッチャモールやっているグランドデザインがQiita始めます！

はじめまして、グランドデザイン株式会社のCTOの森川です。
2023年からグランドデザイン株式会社としてもQiitaにて情報発信をしていこうと思います。
メンバー全員で情報発信していきますのでよろしくおねがいします！

第一発目としての記事は、会社の説明とサービスの説明です。

# 会社説明とサービス説明
グランドデザイン株式会社は、ガチャモールというサービスを運営している会社です。

https://jp.gotchamall.com/

https://youtu.be/1C1JJw6gZpA

「Gotcha!mall(ガッチャモール)」は、生活者と商品・店舗をつなぐプラットフォームです。
行動経済学、脳科学に基づく“報酬システムデザイン”を核に、“テクノロジーで社会のあらゆる課題を解決し、新たな市場の創出やイノベーションを起こす”ことを目指しています。

# 具体的には
生活者と商品・店舗をマッチングするプラットフォームとして、独自のクーポンを配布しているサービスです。コンビニ、スーパー、ドラッグストア等も含まれていますので、きっとほとんど全ての皆さんで使う事が出来るサービスだと思います。
従来型では、クーポンを一律配布していたものをユーザー目線、店舗目線の両方からの最適なクーポンを配布するという事をAIを使って実現しています。
## ユーザー視点
- 1to1で最適なクーポン取得（一番使い易いクーポン）
- 学習する事でより良いクーポン取得
- 購入実績（レシート）でポイントバック
## 店舗視点
- ばら撒きではなく適切なクーポン配布
- 予算内でのコントロール
- 購入額、購入頻度の向上

等を実現させる仕組みを実現するためのサービスです。

# AIの利用事例の紹介
## 予算内でのクーポン配布コントロール
クーポンの配布に関しては、店舗にて予算が必要です。そのため配布に関しては予算内でのコントロールが必要となります。一ヶ月内での予算からクーポン配布数を機械学習にてコントロールする仕組みを実現してます。
月初の予測から日々の実績を消し込み精度高い予測を実現させていきます。

## 日々のログインユーザー数、プレイ数予測
ユーザーはガチャモールにて、該当店舗のガチャをプレイする事によりクーポンを取得します。日々のログインユーザー数やプレイ数を機械学習にて予測し、各種パラメータをチューニングしています。

# AIに関しては北海道大学と連携
グランドデザインでは、特にAIの分野に関して、北海道大学と連携し2017年からラボを設置して研究開発を行っています。
https://www.hokudai.ac.jp/news/2017/08/-aipdf.html

# 何故AIに力を入れているか
実は、ガッチャモールのユーザー数、アクセス数って凄いんです。
- 2,900万人/年のユニークユーザー数
- LINE公式友達数1,410万人

この数値凄くないですか？　過去には、LINE砲と言われるものにサイトが落ちそうになりかけましたが、優秀なエンジニアメンバーのお陰で凌ぐことが出来てます。私自身、ソーシャルゲームの運営会社でもCTOをやっていた経験から言っても、GREEさん、DeNAさんの以上の威力があります。ユーザー数が多いというよりも、レスポンスが早いですね。なのでユーザーのアクセスが一気に集中します。これはシステム側としては、かなり大変です。
これだけのユニークユーザーを抱えているサービスですのでデータ量も凄いです。大量のデータからインサイトを見つけたり、レコメンデーション、予測エンジン、因果推論等をやってたりしてるのでAIに力を入れる必要があるという事です。
今後は、店舗側のPOSデータや顧客データと連携させる事により更にデータ分析の幅を広げていきたいと思います。現在、段階的に実現させている状況です。

# 今後
上記の通りAIに関して色々とやっているグランドデザインですが、森川の方では、この辺りを中心に記事をアップしていきたいと思ってます。
モチベーションアップのためフォロー、イイねお願いします。
teratermマクロをExcelVBAで作成する

次のようにExcelで作成する

A1にNoを持ってきてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291303/bcd115e2-8264-d3f2-a424-7b900d6c8ca0.png)



```VBAのソース

Sub teraterm()

start_count = 2

Max = Cells(1, 1).End(xlDown).Row

For i = 2 To Max


'B列 6行目からスタート
  UserName = Cells(i, 2).Value
  Password = Cells(i, 3).Value
  hostname = Cells(i, 4).Value
  IPADDR = Cells(i, 5).Value
  INIFILE = Cells(i, 6).Value
 
'マクロ作成

    Dim ttlPATH As String
    Dim FN As Integer

    ttlPATH = "C:\work\" + hostname + ".ttl"
    INIFILE = "C:\work\TERATERM.INI"
    FN = FreeFile

    Open ttlPATH For Output As #FN
    Print #FN, "COMMAND = '" + IPADDR + "'"
    Print #FN, "strconcat COMMAND ':22 /ssh /2 /auth=password /user='"
    Print #FN, "strconcat COMMAND '" + UserName + "'"
    Print #FN, "strconcat COMMAND ' /passwd='"
    Print #FN, "strconcat COMMAND '" + Password + "'"
    Print #FN, "strconcat COMMAND ' /f='"
    Print #FN, "strconcat COMMAND '" + INIFILE + "'"
    Print #FN, "connect COMMAND"
    Print #FN, "end"
    
    Close #FN
　Next
　End Sub




```



参考URL
https://qiita.com/Diavolo/items/30a12f8e533f0bf806b6
Microsoft365 メール導入Tips

Microsoft365でのメールの導入時のよくあるトラブル解決法を中心に技術ナレッジをご案内します。Microsoft365の設定をおおむね10案件対応した経験を生かしての内容となります。Microsoft365はSaaSとなりますため、日々設定項目や提供内容がアップデートされていますので、ココで記載する内容は、あくまで参考情報としてください。

●メール転送トラブル


●メーリングリスト（エイリアス）作成方法
IT用語メモ

## DevOps(デブオプス)
> 開発担当と運用担当が連携・協力し、フレキシブルかつスピーディーに開発するソフトウェアの開発手法

## eKYC
> 「electronic Know Your Customer」の略称で、オンライン上で本人確認を完結するための技術
AWS Cloud Practitioner Essentials 学習メモ

## クラウドコンピューティングとは
> 従量課金制による、インターネット経由の IT リソースとアプリケーションのオンデマンド配信

## オンプレミスデプロイの別の呼び方
> プライベートクラウドデプロイ

## クラウドコンピューティングの規模はコスト削減にどのように役立ちますか?
> 多くのユーザーによるクラウド使用量が集約されるため、従量課金制の料金を低く抑えることができる。

## Amazon Elastic Compute Cloud (Amazon EC2)を使用するメリット
Amazon EC2 インスタンスでは、仮想サーバーを使用して AWS クラウドでアプリケーションを実行できます。

> - Amazon EC2 インスタンスは数分以内にプロビジョニング[^1]、作成できます。
> - ワークロード[^2]の実行が終了したら、使用を停止できます。
> - 料金は、インスタンスの実行時に使用したコンピューティング時間に対してのみ支払います。停止時や終了時に料金は発生しません。
> - 必要なサーバー容量に対してのみ支払うことで、コストを節約できます。

[^1]: 設備やサービスに新たな利用申請や需要が生じた際に、資源の割り当てや設定などを行い、利用や運用が可能な状態にすること
[^2]: 仕事量、作業負荷など。コンピュータやシステムにかかる処理の負荷の大きさを指す。

## Amazon EC2 インスタンスタイプ
- 汎用インスタンス
>汎用インスタンスは、コンピューティング、メモリ、ネットワークのリソースをバランスよく提供します。以下のようなさまざまなワークロード[^1]: に使用できます。

> - アプリケーションサーバー
> - ゲームサーバー
> - エンタープライズアプリケーションのバックエンドサーバー
> - 小規模および中規模のデータベース

> コンピューティング、メモリ、ネットワークのリソースが同じくらい必要なアプリケーションがあるとします。このようなアプリケーションではどのリソース領域でも最適化を必要としないため、汎用インスタンスで実行することを検討できます。

- コンピューティング最適化インスタンス
> コンピューティング最適化インスタンスは、高パフォーマンスプロセッサの恩恵を受けることができるアプリケーションに最適です。このインスタンスは、汎用インスタンスと同様、ウェブサーバー、アプリケーションサーバー、ゲームサーバーなどのワークロードに使用できます。
> ただし、コンピューティング最適化インスタンスは、高性能のウェブサーバー、計算負荷の高いアプリケーションサーバー、専用のゲームサーバーに最適です。また、1 つのグループで多くのトランザクションを処理する必要があるバッチ処理ワークロードに使用することもできます。

- メモリ最適化インスタンス
> メモリ最適化インスタンスは、メモリ内にロードした大規模なデータセットを処理するワークロードに対して、高速なパフォーマンスを実現するように設計されています。コンピューティングにおいて、メモリは一時的なストレージ領域です。中央演算装置 (CPU) がアクションを完了するために必要なすべてのデータと命令を保持します。コンピュータプログラムやアプリケーションは、ストレージからメモリにロードされた後に実行可能となります。このプリロードプロセスによって、CPU からコンピュータプログラムへの直接アクセスが可能になります。

> アプリケーションを実行する前に大量のデータをメモリに読み込む必要があるワークロードがあるとします。こうしたシナリオには、高パフォーマンスのデータベースや、大量な非構造化データをリアルタイムで処理するワークロードなどがあります。このようなユースケースでは、メモリ最適化インスタンスの使用を検討できます。メモリ最適化インスタンスを使用することにより、大量のメモリを必要とするワークロードを実行し、優れたパフォーマンスを実現できます。

- 高速コンピューティングインスタンス
> 高速コンピューティングインスタンスは、ハードウェアアクセラレーターやコプロセッサーを使用して、一部の機能を CPU で実行中のソフトウェアよりも効率的に実行します。こうした機能には、浮動小数点数計算、グラフィックス処理、データパターン照合などがあります。

> コンピューティングにおいて、ハードウェアアクセラレーターは、データ処理を高速化できるコンポーネントです。高速コンピューティングインスタンスは、グラフィックアプリケーション、ゲームストリーミング、アプリケーションストリーミングなどのワークロードに最適です。

- ストレージ最適化インスタンス
> ストレージ最適化インスタンスは、ローカルストレージの大規模なデータセットに対する高速シーケンシャル読み取りおよび、書き込みのアクセスを必要とするワークロード用に設計されています。ストレージ最適化インスタンスに適したワークロードの例には、分散ファイルシステム、データウェアハウジングアプリケーション、高頻度のオンライントランザクション処理 (OLTP) システムなどがあります。

> コンピューティングにおいて、IOPS (input/output operations per second) は、ストレージデバイスのパフォーマンスを測定するメトリクスです。デバイスが 1 秒間に実行できるさまざまな入出力操作の回数を示します。ストレージ最適化インスタンスは、数万回の低レイテンシーと、ランダム IOPS をアプリケーションに提供するように設計されています。

> 入力操作は、データベースに入力されるレコードなど、システムに配置されるデータと同じように考えることができます。出力操作は、サーバーによって生成されるデータです。出力の例には、データベースのレコード上で実行される分析などがあります。高い IOPS を必要とするアプリケーションがある場合、ストレージ最適化インスタンスは、こうしたユースケース向けに最適化されていない他のインスタンスタイプよりも優れたパフォーマンスを提供します。
VisualStudio2019にてUnityの入力補完（予測変換）が機能しないときの対処法［備忘］

## はじめに
Unityにて、スクリプトファイルを開くとVisualStudioは起動してコードの編集はできるが、入力補完（予測変換）が機能しなくなってしまいました。
なんどか同じ現象にブチ当たっていて、毎度ゼロから調べているので備忘。

［環境］Unity2021.3.16f1 / Microsoft VisualStudio 2019
## Unity側の必要モジュールを確認
まず、UnityHubにて必要なモジュールが追加されているか確認します。

1. UnityHubを起動し、インストールの項目を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/42021e55-300e-9ccd-6d0b-835973a24585.png)

2. 現在使っているUnityのバージョンの「歯車のマーク」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/ac4b9464-d929-857e-1e57-92f593e4daa9.png)

3. 表示されたポップアップの「モジュールを加える」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/014b57d3-e6c0-885e-ebe5-239befcf2001.png)

4. 開発者ツールの欄にある、「Microsoft Visual Studio Community 2019」がインストール済みになっていることを確認します。
:::note warn
インストールできていない場合は、チェックをつけて、インストールします。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/566b22d0-af34-9dd9-2a0d-984c7480d480.png)
5. 確認が終了したらこのウィンドウは必要ないので閉じておきます。


## VisualStudio側の必要なインストールの確認
Unity用のワークロードがインストール済みか確認をします。

1. スタート画面の検索欄にて「Visual Studio Installer」を検索して、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/cd0859dd-90c7-d8d4-29f6-4c2b748a2a10.png)

2. 「Visual Studio Community 2019」の「変更」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/91275ccb-784d-ac82-85ae-34a1dc70ee47.png)

3. 「ワークロード」のタブに表示されている機能の中から、「Unityによるゲーム開発」にチェックがついていることを確認します。
:::note warn
チェックがついていなければ、チェックをつけてインストールします。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/7ee1a039-6b99-561e-6da2-77bea1b70321.png)

4. 確認が終了したらこのウィンドウは必要ないので閉じておきます。
## Unity側の設定の確認
1. 現在開発中のプロジェクトを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/683cc8f6-149e-ec72-7669-1eabc23d7633.png)

2. メニューバーの「Edit > Preferences...」をクリックして開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/27af468e-3fc4-8f56-6b6c-be99b7602f9d.png)

3. 「Preferences」の「External Tools」の項目をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/70db9360-b7e2-d081-aa3d-330e9d65ba1f.png)

4. 「External Script Editor」の項目を「Microsoft Visual Studio 2019」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/2a4e0dbe-202d-bdb8-dde3-3187bb73cc69.png)

5. 設定が完了したらこの「Preferences」ウィンドウは必要ないので閉じておきます。

## 設定が適用されたか確認
:::note warn
VisualStuidoがすでに起動している場合は、×ボンタンで閉じておきます。
:::
1. Unityから編集したいC#スクリプトファイルを開きます。

2. 自動でVisualStudioが起動するので、補完機能が有効になっているか適当なコードをかいて確認します。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103886/ed4f89f4-5acb-f5d0-4c90-ac66f568d500.gif)


## おわりに
下記の記事を参考にさせていただきました。この場をお借りしてお礼をさせていただきます。
ありがとうございます。
［unityで予測変換が出ないときの解決法］
https://qiita.com/kazuki-otomo/items/90983c943a549e19996b
［Visual Studio 2019でワークロードを再表示する方法］
https://qiita.com/mirokarosuc/items/be08267ae720efd59591
【Android】テストを書くときに使う@get:RuleとかRuleChainってなんぞよ

# はじめに

Androidでインストゥルメント化単体テストを作成するとき、`@get:Rule`を使ってテストを書いたことはありませんか？

```kotlin
@HiltAndroidTest
class AppTest {

    private val hiltRule = HiltAndroidRule(this)
    private val composeTestRule = createAndroidComposeRule<MainActivity>()

    @get:Rule
    val rule: RuleChain = RuleChain
        .outerRule(hiltRule)
        .around(composeTestRule)
    ...
}
```

この、`@get:Rule`や`RuleChain.outerRule().around()`がよくわからない状態で、今まではテストを書いてきました。

ということで今回は、`@get:Rule`とかの**Rule**ってなんぞやということをまとめていきたいと思います。

# Ruleとは何なのか

公式ドキュメントにて、次の一文を発見しました。

> JUnit ルールはテストの柔軟性を高め、必要なボイラープレート コードを削減します。
> https://developer.android.com/training/testing/junit-rules?hl=ja

**Guide to JUnit 4 Rules**の記事内で、次のような記述を見つけました。

> JUnit 4 rules provide a flexible mechanism to enhance tests by running some code around a test case execution. In some sense, it’s similar to having @Before and @After annotations in our test class.
> 
> https://www.baeldung.com/junit-4-rules

そして、次の一文。

> By using a rule, we can have everything isolated in one place and reuse the code easily from multiple test classes.
> https://www.baeldung.com/junit-4-rules

つまり、今まで`@Before`や`@After`を使って行っていた処理をルールとしてまとめることで、いろいろなテストから呼び出せるようになり再利用できるようになる。これこそがルールのメリットということです。

例えば、`@Before`でデータベースに接続して、`@After`で接続を解除するという処理をルールとしてまとめることで、いろいろなテストで何度も同じ処理を書かずに済むといったことが可能となります。

# RuleChainとは何なのか

実は、RuleChainもルールです。なので、ドキュメントなどでは`The RuleChain rule ...`などと書かれたりします。

このRuleChainを使うと、ルールの順序づけを行うことができるようになります。

RuleChainが一番使われるユースケースは、複数のルールを順序通りに実行した上で各テストケースを実行したい場合です。

RuleChainを使わなくても、テストに複数のルールを配置することは可能です。しかし、その際に実行されるルールの順番はランダムになります。この順番をコントロールするために、RuleChainは使われます。

最初に実行したいルールを`outerRule()`を使って指定します。次に続くルールは順番に`around()`を呼び出しすことで繋げていきます。

```kotlin
private val hiltRule = HiltAndroidRule(this)
private val composeTestRule = createAndroidComposeRule<MainActivity>()

@get:Rule
val rule: RuleChain = RuleChain
    .outerRule(hiltRule)
    .around(composeTestRule)
```

# ちなみに、`@get:Rule`と`@Rule`の違いは？

Javaでは、`@Rule`を使ってルールを指定します。

しかし、Kotlinで同じように`@Rule`を使おうとするとエラーが出てしまうようです。

https://qiita.com/SYABU555/items/36ba6967447df2330776

Kotlinでは、`@get:Rule`を使ってルールを宣言することで、getterプロパティに対して`@Rule`アノテーションを適用するという意味を持たせることができます。

これにより、エラーの発生を抑えて安心してルールを使えるようになります。

```kotlin
...省略

class Tests {
    // apply @Rule annotation to property getter
    @get:Rule val tempFolder = TemporaryFolder()

    @Test fun simple() {
        val f = tempFolder.newFile()
        assertEquals(42, getTheAnswer())
    }
}
```
https://kotlinlang.org/docs/annotations.html#java-annotations

# まとめ

久しぶりに、Androidのインストゥルメント化単体テストを書こうと思ったときに、過去に自分が書いたテストに`@get:Rule`が存在したため、ルールってなんだっけって思ったところがこの記事の出発点でした。

今回はあくまで用語解説に過ぎないので、いつかルールを自分で書いてみた記事も公開できればよいなと思います。

# 参考にした記事

https://junit.org/junit4/javadoc/4.12/org/junit/rules/RuleChain.html

https://qiita.com/maple_syrup/items/dfb9c9936bb48588fae9

https://qiita.com/NagaokaKenichi/items/4c0659bcbeff7764dd7f
AWS Cloud Practitionerを受験するのでやること・やったことまとめ　2023/2 合格

追記：この度合格しました！
私はudemyの問題集を5周ほど繰り返しました。
基本的には問題集を繰り返しやっていたら分からない問題はほとんどありませんでした。

## AWS Cloud Practitionerとは？
`AWS Certified Cloud Practitioner は、AWS クラウドの概念、サービス、および用語の基礎的な理解を提供します。過去に IT やクラウドの経験がない非技術職の方や、オンプレミスでの IT 経験があり、AWS クラウドへの基本的な知識が必要な方にとって、良いスタート地点となる資格です。この認定は、ロールベースの AWS 認定に挑戦する候補者に自信を与えてくれます。`
参考：https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

AWSの基礎を固めるための試験です。初歩的な知識も多く、料金形態や各サービスについての問題が出題されます。

## やること
1.AWS SkillBuilder
↓のAWS 公式が出しているSkillBuilderで勉強しました
動画形式なので文字を読みたくない人におすすめ
https://d1.awsstatic.com/ja_JP/training-and-certification/ramp-up_guides/Ramp-Up_Guide_Cloud_Essentials.pdf

2.ハンズオン
実際に手を動かしてAWSを操作します。CloudPractitionerを合格するだけなら不必要かもしれないですが、一度ハンズオンをすることで問題にも取り掛かりやすくなると感じます。
私が取り組んでいたもの↓
https://www.udemy.com/course/aws-and-infra/
こちらはUdemyの講座ですが、無料のサイトでハンズオンの紹介をしている人がいるのでそちらで構わないと思います。

3.問題集
これがメインになると思います。
Cloud Practitionerの試験は「択一選択問題・複数選択問題」の形式で出題され、1000点満点で700点以上で合格です。
試験では65問が出題され、試験時間は90分あります。

問題集では80~85%の正答率があると安心かなと思います。
主に取り組む問題集は
・[web問題集](https://aws-exam.net/clf/clf_question.php)
・[udemy過去問](https://www.udemy.com/course/aws-4260/)
の2つです
vscodeのシンタックスハイライト(色付け)

https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight

上記をインストール

# 結果
```javascript
{

// デフォルトの強調表示↓
    "todohighlight.defaultStyle": {
        "color": "#75A9FF",
        "backgroundColor": "default"
    },
    "todohighlight.keywords": [
        "DEBUG:",
        "SELECT",
        "FROM",
        "LEFT",
// デフォルトの強調表示↑

// 個別の強調表示
        {"text": "=", "color": "white",}
        {"text": "!=","color": "white",}

        {"text": "MAX","color": "#FFFF66"}
        {"text": "SUBSTRING","color": "#FFFF66"}

        {"text":" 0","color": "#99FFFF"}
        {"text":" 1 ","color": "#99FFFF"}
    ],
}
```

↓こっちもあるよ

https://marketplace.visualstudio.com/items?itemName=jgclark.vscode-todo-highlight
アルゴリズム実技検定(PAST) 第11回 H問題 Python解答例(ナップサック問題 / 動的計画法)

[Supership](https://supership.jp/)の名畑です。
[うる星やつらの2クール目のOP](https://www.youtube.com/watch?v=stb-BpPpJ7U)も好きです。テンちゃんと竜之介が加わると一気にうる星やつら感が増します。

## はじめに

[アルゴリズム実技検定(PAST)](https://past.atcoder.jp/)の過去問シリーズです。
第11回H問題の解答例です。

難易度としてはABC(AtCoder Beginner Contest)のC〜Dぐらいという肌感ですが、[ナップサック問題](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C) / [動的計画法](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E8%A8%88%E7%94%BB%E6%B3%95)を知っていればほぼノータイムで解けそうではあります。

:::note info
「そもそもアルゴリズム実技検定ってなんですか？」という方は[こちらの記事](https://qiita.com/nabata/items/0421f20e8ec849ee70ad)を合わせてご覧いただけますと幸いです。
:::


## 第11回 H問題 2つのナップサック

### 問題

[H - 2つのナップサック](https://atcoder.jp/contests/past202206-open/tasks/past202206_h)

### 言語

- PyPy3 (7.3.0)

Python(3.8.2)だとTLEがとれなかったのでPyPyを使いました。

### 解答例

有名な**ナップサック問題**です。
注意点としては、ナップサックが2つあるため**動的計画法**(Dynamic Programming 略してDP)に用いる配列を三次元配列にしている点です。

```
N, A, B = map(int, input().split())

# 入力値wとvを配列に格納
w = [[] for i in range(N)]
v = [[] for i in range(N)]
for i in range(0, N):
    w[i], v[i] = map(int, input().split())

# 動的計画法のために三次元配列dp[N + 1][A + 1][B + 1]を用意
# 値（美味しさ）の初期値は0とする。
dp = [[[0 for k in range(B + 1)] for j in range(A + 1)] for i in range(N + 1)]

for i in range(N):
    for w1 in range(A + 1):
        for w2 in range(B + 1):
            # i番目のお菓子をいずれかのナップサックに入れられる
            if w[i] <= w1 or w[i] <= w2:
                # 1つ目のナップサックに入れられる
                if w[i] <= w1:
                    dp[i + 1][w1][w2] = max(dp[i][w1 - w[i]][w2] + v[i], dp[i][w1][w2])

                # 2つ目のナップサックに入れられる
                # 1つ目のナップサックに入れられたケースを考慮してdp[i + 1][w1][w2]もmaxの引数に追加
                if w[i] <= w2:
                    dp[i + 1][w1][w2] = max(dp[i][w1][w2 - w[i]] + v[i], dp[i][w1][w2], dp[i + 1][w1][w2])

            # i番目のお菓子を入れられないためi-1番目格納時点の美味しさのままとする
            else:
                dp[i + 1][w1][w2] = dp[i][w1][w2]

print(dp[N][A][B])
```

動的計画法とは、段階を踏んだ場合分けをして計算結果を記録して解いていく手法です。
今回の場合ですと

- 1つ目のループ(i)：お菓子が0番目、1番目、2番目……N-1番目(0からなので合計N個です)
- 2つ目のループ(w1)：1つ目のナップサックに入れられる重さの上限が0、1、2……A
- 3つ目のループ(w2)：2つ目のナップサックに入れられる重さの上限が0、1、2……B

という3重のループでの総当たりです。
そして最終的に **dp[N][A][B]** には「**お菓子がN-1番目まで**」「**1つ目のナップサックに入れられる重さの上限がA**」「**2つ目のナップサックに入れられる重さの上限がB**」という問題分の条件通りの結果が格納されることになります。

### もしもナップサックが1つなら

ナップサックが1つの時はこんなコードです。
シンプルな方が考え方を理解しやすいかと思いますので参考までに。

```
# 入力
N, A = map(int, input().split())
w = [[] for i in range(N)]
v = [[] for i in range(N)]
for i in range(0, N):
    w[i], v[i] = map(int, input().split())

# dp用の二次元配列準備
dp = [[0 for i in range(A + 1)] for j in range(N + 1)]

for i in range(N):
    for w1 in range(A + 1):
        if w[i] <= w1:
            dp[i + 1][w1] = max(dp[i][w1 - w[i]] + v[i], dp[i][w1])
        else:
            dp[i + 1][w1] = dp[i][w1]

print(dp[N][A])
```

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。

是非ともよろしくお願いいたします。
TypeScriptの基本文法まとめ


TypeScriptの基本的な書き方を整理した個人的なメモ
※TypeScript 4.8.2 で動作確認済み


## 基本文法

### ■ if文の使用例

```typescript
const sample: string = '3';

if (sample === '1') {
  console.log('sampleの値は1です。');
} else if (sample === '2') {
  console.log('sampleの値は2です。');
} else {
  console.log('sampleの値は1でも2でもありません。');
}
```

### ■ 3項演算子の使用例

```typescript
const sample: number = 1;
const result = sample === 1 ? true : false;
console.log(result);
```

### ■ for文の使用例

```typescript
for (let count = 0; count < 10; count++) {
  console.log(count);
}
```

### ■ Array.prototype.forEach()メソッドの使用例

```typescript
const arrays: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

arrays.forEach((value) => {
  console.log(value);
});
```

### ■ Array.prototype.map()メソッドの使用例

```typescript
const arrays: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// この例では、元々の配列の各要素の2倍の値を要素に持つ配列を生成している
const resultList: number[] = arrays.map((value) => {
  return value * 2;
});

console.log(resultList);
```

### ■ Array.prototype.filter()メソッドの使用例

```typescript
const arrays: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// この例では、元々の配列の各要素のうち、2の倍数の値のみを要素に持つ配列を生成している
const resultList: number[] = arrays.filter((value) => {
  return value % 2 === 0;
});

console.log(resultList);
```

### ■ Array.prototype.reduce()メソッドの使用例

```typescript
const arrays: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// この例では、配列の各要素の和を計算している
const total: number = arrays.reduce((accumulator, currentValue) => {
  // accumulator 側に、配列の各要素の値が加算されていく
  return accumulator + currentValue;
});

console.log(total);
```

### ■ 分割代入の使用例

```typescript
const arrays: number[] = [1, 2, 3];

type ObjectType = {
  key1: number;
  key2: string;
};

const obj: ObjectType = {
  key1: 1,
  key2: 'a',
};

// 配列の分割代入
const [one, two, three] = arrays;
console.log(one, two, three);

// オブジェクトの分割代入
const { key1, key2 } = obj;
console.log(key1, key2);
```

### ■ スプレッド構文の使用例

```typescript
const arrays: number[] = [1, 2, 3];

type ObjectType = {
  key1: number;
  key2: string;
};

const obj: ObjectType = {
  key1: 1,
  key2: 'a',
};

// 配列のスプレッド構文
console.log([...arrays, 4]);

// オブジェクトのスプレッド構文
console.log({ ...obj, key2: 'b' });
```

## 少し応用的なTIPS

### ■ 整数が順番に並んだ配列を生成する方法

```typescript
const listSize: number = 3;

const resultList = [...Array(listSize)].map((_, index) => {
  return index + 1;
});

console.log(resultList);
```

### ■ 対象の値が配列の中に含まれているか確認する方法

```typescript
const targetString: string = 'cat';
const referenceStringList: string[] = ['cat', 'dog'];

if (referenceStringList.indexOf(targetString) !== -1) {
  console.log(targetString + 'は配列に含まれています。');
} else {
  console.log(targetString + 'は配列に含まれていません。');
}
```

### ■ 対象のキーがオブジェクトの中に含まれているか確認する方法

```typescript
type ObjectType = {
  key1: number;
  key2: string;
};

const obj: ObjectType = {
  key1: 1,
  key2: 'a',
};

const tagetKeyName: string = 'key1';

if (tagetKeyName in obj) {
  console.log(tagetKeyName + 'はオブジェクトに含まれています。');
} else {
  console.log(tagetKeyName + 'はオブジェクトに含まれていません。');
}
```

## 参考資料

[[...Array(n).keys()] はやめた方がいいのでは？](https://zenn.dev/uhyo/articles/array-n-keys-yamero)
「整数が順番に並んだ配列を生成する方法」について、同様の処理が何度も出てくるようであれば上記のサイトで紹介されている方法を採用した方が良さそう
【Qiita Night】エンジニアから“爆速”で プロダクトマネージャーに なる方法

# はじめに
こんにちわ。
出張撮影プラットフォームOurPhotoにてプロダクトマネージャー（PdM）をしているdoueです。

先日、2022/12/16に
[Qiita Night～プロダクトマネジメント～](https://increments.connpass.com/event/267415/)に
登壇させていただきました。
その際に発表した内容を、qiitaに書き起こしをさせていただきます。

かなりネタ要素もございますが、業務の隙間時間の息抜きにどうぞご覧ください。

# 爆速でプロダクトマネージャーになる
私は新卒で今の会社に入り
エンジニアからキャリアをスタートし、エンジニアリングマネージャーを経て
まだまだ経験も実績も浅いながらも、5年半でプロダクトマネージャーという立場になりました。

そんな経験から
とにかく爆速でプロダクトマネージャーになる方法をみなさんにお伝えしたいと思い
LTをさせていただきました。

「これからプロダクトマネージャーになりたい」などと興味を持っていただけている方々のためになれば幸いです。

# 爆速でPdMになるための、２つのPoint

* ①PdMのスキルを手っ取り早く身につける
* ②“できそうなやつ”感を出す

今回はこの2つのPointにフォーカスして話を進めたいと思います。

## ①PdMのスキルを手っ取り早く身につける

まず、爆速でPdMになるためには、スキルも爆速で身につけていく必要があります。
有名なプロダクトマネジメントトライアングルを例に出してみます。
![スクリーンショット 2023-01-10 11.27.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/51330fe2-dae4-aa2b-d219-453cc459f604.png)
私の場合は、
エンジニアというキャリアゆえ、UI/UX、CS、マーケティングが専門外でした。

この部分のスキルを身につけるわけですが
今回は爆速なので、**「できる」は不要。「わかる」で十分です。**

そのためには以下に二つを取り掛かるといいでしょう。

* ブログ、書籍、カンファレンスなどで学ぶ
* 社内の専門家と仲良くなり、**聞きまくる/相談しまくる**

特に社内の人材は余すことなく有効活用しましょう。
個人的お薦めは、トップセールスマンと仲良くなることです。
それだけではなく、CS、マーケターなども幅広く仲良くなりつつ、幅広い知識やノウハウをインプットしましょう。

オフィスでの雑談、ランチ、飲み会など、業務外の時間を目一杯有効活用することは
本当に大切だと個人的には思っています。

## ②“できそうなやつ”感を出す
PdMというポジションは
事業において重要なポジションであることが多いと思います。
つまり、ステークホルダーからの信頼が不可欠になので、「できそうなやつ感」は割と重要です。

そのためにまず、**身につけた知識を会話の中でアウトプットにつなげることを怠らない**ようにしましょう。
会話の中で幅広い知識をアウトプットに繋げられれば「できそうなやつ感」を出せます。
(もちろん前提となる実績はある程度必要です)

今回は、爆速なので
「あいつできそうだな...」感を周りに感じてもらえればOKです。

![スクリーンショット 2023-01-10 11.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/64a9f872-0b4d-93e1-f4a3-0f515c39e9ab.png)

# 爆速でPdMになるための最後の一歩

「PdMになれる」チャンスはいつ降ってくるかわかりません。
そのため、常に「チャンス」を掴む意識を持つことが必要です。

今回は爆速なので、**舞い降りたチャンスは逃してはいけません。**

では、どうやってチャンスを掴むのか。。。？
簡単です。

**考えるより先に「手を挙げる」**

これにつきます。（笑）

みなさんは仕事をする中で
「プロジェクトを誰に任せようか..」など、上司の方などが悩んでいるような光景を見たことはないでしょうか？
実は目を見張れば、会社の中では大小様々なチャンスが転がっています。

そんなチャンスを、好き嫌いせずに、何も考えず手を挙げるのです。
そして、**やれるかどうかは、手を挙げた後に考えるのです。**

これを続けるだけで、PdMになるチャンスを爆速で掴むことができます。


これであなたもプロダクトマネージャーに☆

# 最後に
ここまで読んでいただいた方、ありがとうございます。

今回はとにかく爆速でプロダクトマネージャーになるためには
という内容でした。

実際はもっとたくさんのことが必要で、こんなに簡単なものではありませんが
私個人の考えとしては、できなくでもいい。やる覚悟があるかどうか。
というところが一番大事だと思っています。

皆様がこれからキャリアアップを考える際、もし悩まれたときの手助けに少しでも慣れたら嬉しいです。

さらに詳しく話したい！
という方は、Devトークを開設しておりますので、是非ご応募お待ちしております。
いろんな方と気軽にお話ししたいです！
https://jobs.qiita.com/employers/uluru/dev_talks/463
EKSでk8sクラスター作成時にサブネットの紐付けをラクにするTips

# 記事の目的

eksctlコマンドでクラスターを作成する際、サブネットを紐付けるためにサブネットIDを調べて指定するのが面倒くさいので、サブネットにタグをつけて自動認識できるようにする


# 前提

### 動作確認環境
- k8sバージョン 1.23
- aws cliバージョン 2.7.31
- eksctlバージョン 0.122.0
- kubectlバージョン 1.25.2


# 本題

## k8sクラスターを作成したい対象のサブネットすべてに任意のタグをつける
タグのKey、Valueは何でも良いが、今回は`ForK8SPrivateCluster=true`とする

> Key: ForK8SPrivateCluster
> Value: true

![aa547f90feeafb5d4f59b4979f695ab6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149745/0cfb496f-9692-f5b7-2ccb-a3334602274d.png)


## クラスター作成
```shell
# タグ「ForK8SPrivateCluster=true」がついているサブネットのIDリストをカンマ区切りで取得
K8S_CLUSTER_SUBNETS=$(aws ec2 describe-subnets --filters "Name=tag:ForK8SPrivateCluster,Values=true" --query 'Subnets[].SubnetId | join(`","`, @)' --output=text)

# 取得したカンマ区切りのサブネットID一覧を表示
echo "subnets: $K8S_CLUSTER_SUBNETS"

# 取得したサブネットIDを使ってクラスター作成
eksctl create cluster \
--name hoge-cluster \
--region ap-northeast-1 \
--vpc-private-subnets $K8S_CLUSTER_SUBNETS \
--with-oidc \
--without-nodegroup
```
日付取得の際にやらかした件

# はじめに
PoCフェーズで現行環境の再現を行うためにSQLを抽出してみたのは良かったのですが、
まんまと落とし穴にはまってしまった出来事を備忘録を兼ねて書いてみます。

# 目次
1.出てくるワード
2.経緯
3.はまった罠
4.原因
5.解決方法
6.おわりに
7.参考ドキュメント


# 1.出てくるワード
今回の記事で出てくるワードについて

    BO・・・SAP BusinessObjects　※1
    BCP・・・Business Continuity Planの略で、日本語では「事業継続計画」
    EOS・・・企業の製品やサービスの取り扱い期限に関する略語で、何かが終了する時期や日付を表したもの。「S」を何の略とするかにより、何の終了を意味するかが異なる。
    End Of Support・・・「サポート終了」の意味で、製品についての問い合わせ受け付けや修理、交換などのサポートサービスの提供が打ち切られる期限を表す。
    PoC・・・（Proof of Concept：概念実証）とは、新たなアイデアやコンセプトの実現可能性やそれによって得られる効果などについて検証すること
    ユニバース・・・ビジネス用語とデータベースの専門用語との間の通訳を行う、BusinessObjectsで利用するオブジェクト
    

# 2.経緯
SAP BusinessObjectsがEOSに伴い、BCPの観点から他ツール＋Oracleへの移行を検討。
そのためのPoCを今回行っていた際のできごと。


# 3.はまった罠
BOからSQLを抽出してOracleSQL Developerで再現しようとしたのですが、一旦見てみましょう。

```sql:検証.sql
substr(to_char('出納年月日'),7,4) || substr(to_char('出納年月日'),4,2) = '202210'
```
とあるSQLの一節を取ってきたのですが、
この一節は出納年月日カラムのデータを文字型に変えて、左から7番目開始4文字と左から4番目開始2文字をがっちゃんこして比較する。といった内容になります。
ここでおかしくね？って気づくべきでした汗　気づけませんでした。
お気づきになった方は流石です・・・。

# 4.原因
最初はBOとOracleSQL DeveloperでDATEの表示が違うから正しくソートできず件数がおかしい！
と思っていました。
というのも、BOではDATEの持ち方はDD-MM-YYYYに対し、
OracleSQL DeveloperではYYYY-MM-DDでした。
しかし、DATE型の表示はどちらもYY-MM-DD・・・？おかしい・・・

・・・待ってください？
**BOではDATEの持ち方はDD-MM-YYYYに対し、
OracleSQL DeveloperではYYYY-MM-DDでした。**?

"文字型変換を行ったことで年月がうまく取れなくなっている・・・？"
↑これが原因でした。
BO環境で文字型に変えると上記の構文で問題はないかもしれないですが、
OracleSQL Developerだと大変なことになるのは容易に想像できるでしょう・・・
(M-DDYYみたいなことになる)



# 5.解決方法

BeforeとAfterのSQLを書き出します。

```sql:Before.sql
substr(to_char('出納年月日'),7,4) || substr(to_char('出納年月日'),4,2) = '202210'
```
DATE型の状態で'YYYYMM'を取り出してから文字型にする処理に書き換えます。
```sql:After.sql
to_char('出納年月日','YYYYMM')='202210'
```
無事、OracleSQL Developerで条件抽出することができました汗

# 6.おわりに
正直かなり焦りました。
"そのまま移行できるだろう！"
↑これ慢心ですからね、ほんとに気を付けましょう(マジ気を付けます)

PMに相談して一緒に探していただき、発見できました。
ありがとうございます・・・！

移行等を行うときは各環境の仕様を把握すること、
SQL文がちゃんと機能しているか確認する。

年末の教訓になりました。

# 7.参考ドキュメント
※1

http://www.nec.co.jp/middle/bo/feature.html
matplotlibでクリックしたら、そこを通る3次近似式を書く

# 任意の3次近似式を書きたい(そんな人いないだろうけど)
色々な3次近似式の係数を求めたかったので、ちょっと作ってみた。
クリックしたら、点を追加して、追加した点群で近似式を求めて描画。
ついでに一定の幅を持った線も追加。

そのまま捨てるのももったいないので、公開。

```python
%matplotlib widget 

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as wg

fig = plt.figure(figsize=(20,5))
ax = plt.gca()
ax.set_xlim(-10, 110)
ax.set_ylim(-20, 20)
ax.set_aspect("equal")
plt.grid()

x0 = np.array([])
y0 = np.array([])
pLine0, = plt.plot(x0, y0, "x")
pLine1, = plt.plot([], [], "-")
pLine2, = plt.plot([], [], "-")
pLine3, = plt.plot([], [], "-")
pText1 = plt.text(-9, -17, "")
pText2 = plt.text(-9, -19, "")

x = np.linspace(0, 100, 1000)

def onclick(event):
    global x0, y0
    x0 = np.append(x0, event.xdata)
    y0 = np.append(y0, event.ydata)
    idx = np.argsort(x0)
    x0 = x0[idx]
    y0 = y0[idx]
    pLine0.set_data(x0, y0)
    
    c3, c2, c1, c0 = list(np.polyfit(x0, y0, 3))
    y1 = c3 * x ** 3 + c2 * x**2 + c1 * x + c0
    pLine1.set_data(x, y1)
    
    
    d = 3.3 / 2
    dy1 = 3 * c3 * x ** 2 + 2 * c2 * x + c1
    l = d / np.sqrt(1 + np.power(dy1, 2))

    x2 = x - dy1 * l
    y2 = y1 + l
    
    x3 = x + dy1 * l
    y3 = y1 - l

    pLine2.set_data(x2, y2)
    pLine3.set_data(x3, y3)
    
    # ax.relim()
    # ax.autoscale_view()
    plt.draw()
    pText1.set_text(f'dblclick={event.dblclick}, button={event.button}, x={event.x}, y={event.y}, xdata={event.xdata:.3f}, ydata={event.ydata:.3f}')
    pText2.set_text(f'c3={c3}, c2={c2}, c1={c1}, c0={c0}')
    
        
cid = fig.canvas.mpl_connect('button_press_event', onclick)
```

## 動作イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455423/fe65d9d5-1871-746a-39fe-e7545ee60b78.png)

### ほんとは
スケールも自動でしてほしかったけど、面倒だったのでなしで。
あとはredoも。。。
```python
ax.relim()
ax.autoscale_view()
```
画面エディタ付きのライフゲームを作ってみた python3

画面エディタ付きのlifegameを作ってみました。
エディットモードで、画面上をマウスでクリックすると、セルがオンオフします。
ゲームモードでも、セルをクリックしたら、画面が止まり、自動的にエディットモードになります。

キー操作：
w save.txtにセーブ
l save.txtからロード
e エディットモード
g ゲームモード
r ランダムに初期化する
c クリア
q quit

```lifegame.py
#!/usr/bin/python3
from pygame.locals import *
from scipy import signal
import pygame
import sys
import numpy as np
import os
import binascii



scale=5
height=100
width=100

def draw_grid(screen):
  screen.fill((0,0,0))
  for i in range(width):
    pygame.draw.line(screen,(0,255,0),(0,i*scale),(scale*width,i*scale),1)
  for j in range(height):
    pygame.draw.line(screen,(0,255,0),(j*scale,0),(j*scale,scale*height),1)

def set(screen,cx,cy,c):
  screen.fill((c*255,c*255,c*255),(cx*scale+1,cy*scale+1,scale-1,scale-1))

def put(F,screen):
  for i in range(len(F)):
    for j in range(len(F[1])):
       set(screen,j,i,F[i][j])

def rev(F,cx,cy):
  F[cy][cx]=int(F[cy][cx])^1
  return(F)

def clear():
    return(np.zeros((height,width)))

def initrandomseed():
    f=open("/dev/random",'rb') # /dev/randomを開く
    random32bitdata=f.read(4) # ４バイト読み出し
    f.close()
    randomhex=binascii.hexlify(random32bitdata) #１６進の文字列に変換
    randomint=int(randomhex,16) # 整数に変換
    np.random.seed(seed=randomint) # ランダムシードを初期化

def initrnd():
    N = width*height
    v = np.array(np.random.rand(N) + 0.1, dtype=int)
    return v.reshape(height, width)

def count_neighbor(F):
    return signal.correlate2d(F,np.ones((3, 3),dtype=int),mode="same",boundary="wrap")

def nextgen(F):
    N = count_neighbor(F)
    G = (N == 3) + F * (N == 4)
    return G

def eventloop(F,screen):
    run='e'
    while run!='q':
        for event in pygame.event.get():
            if event.type == QUIT:
                run='q'
            if event.type == KEYDOWN:  # キーを押したとき
                k=pygame.key.name(event.key)
                if k== 'q':
                    run='q'
                elif k=='e':
                    run='e'
                elif k=='g':
                    run='g'
                elif k=='r':
                    F = initrnd()
                    put(F,screen)
                elif k=='l':
                    if os.path.exists("save.txt"):
                      F = np.loadtxt("save.txt")
                    put(F,screen)
                elif k=='w':
                    np.savetxt("save.txt", F, "%d")
                elif k=='c':
                    F=clear()
                    put(F,screen)
            elif event.type == MOUSEBUTTONDOWN:
                    x, y = event.pos
                    F=rev(F,x//scale,y//scale)
                    put(F,screen)
                    run='e'
            elif event.type == MOUSEMOTION:
                    x, y = event.pos
        if run=='g':
          F=nextgen(F)
          put(F,screen)
        pygame.display.update()

def main():
    pygame.init()    # Pygameを初期化
    screen = pygame.display.set_mode((scale*width,scale*height))    # 画面を作成
    pygame.display.set_caption("lifegame")    # タイトルを作成
    initrandomseed()
    draw_grid(screen)
    F=clear()
    put(F,screen)
    eventloop(F,screen)
    pygame.quit()
    sys.exit()

if __name__=='__main__':
    main()

```
駆け出しエンジニアへ：ドメインを取得する方法

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はドメインの取得方法についてです

![インスタスライド_202301013.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/61d13b52-dd31-20d3-be62-dd0373b9f107.gif)


# ドメイン取得
お名前.com等で簡単に取得できます。他にもありますが、一番有名です。“お名前”で検索できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6d1b79b3-0177-663f-711b-36f243a65982.png)

# 試しに欲しい名前で検索してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/2cb6617c-36d1-35a1-f245-a9a0f9b4640f.png)

色々選択できます
.com以外にも.net .jp .Tokyoとか取れますが、
.co.jpは法人の登記とか必要です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/abf6f71f-7526-5135-fb41-6c9a575c28c7.png)

# サービスを公開するには
一緒にレンタルサーバーも借りれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4df97e67-2e16-8858-66a7-51bb1c20b2de.png)

# まとめ
自分だけのドメイン名は簡単に取得できます。金額もお手頃です。

採用面談の時に自分のサーバー、ドメインを持っていると勉強していると評価があがります！
ぜひ取得してみましょう！

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
他の端末で作ったEKSのk8sクラスタを管理できるようにする

# 記事の目的

eksctlコマンドでクラスターを作成すると、操作した端末に自動的に認証トークンが設定され、特に何も意識しなくてもkubectlコマンドが使えるようになる。
ただし、これだけだと他の端末でクラスターを操作することはできないため、適切なアクセス権を付与する必要がある。
この記事ではとりあえず`system:masters`のフル権限を付与する手順を記載する。（実環境ではRBACによる適切なロールの付与が必要）

#### 参考ドキュメント
クラスター認証
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/cluster-auth.html

Amazon EKS でクラスターを作成した後、他の IAM ユーザーおよびロールにアクセス権を付与するにはどうすればよいですか?
[https://aws.amazon.com/jp/premiumsupport/knowledge-center/amazon-eks-cluster-access/](https://aws.amazon.com/jp/premiumsupport/knowledge-center/amazon-eks-cluster-access/)

クラスターへの IAM ユーザーおよびロールアクセスを有効にする
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.html

RBAC認可を使用する
https://kubernetes.io/ja/docs/reference/access-authn-authz/rbac/




# 前提

### 動作確認環境
- k8sバージョン 1.23
- aws cliバージョン 2.7.31
- eksctlバージョン 0.122.0
- kubectlバージョン 1.25.2


# 本題

## 以下の作業はクラスター作成者のIAMユーザー権限で実施

- 自身がクラスター作成者のIAMユーザーになれない場合は、この作業をクラスター作成者に依頼する
- そもそもクラスター作成者がわからない場合は、CloudTrailの履歴から「CreateCluster」を呼び出したユーザーを検索し特定する → [参考](https://aws.amazon.com/jp/premiumsupport/knowledge-center/amazon-eks-cluster-access/#Identify_the_IAM_user_or_role_for_the_cluster_creator)
- クラスター作成者がIAMユーザーではなく、IAMロールの場合は'aws sts assume-role'コマンドで一時的な認証情報を引き受ける → [参考](https://aws.amazon.com/jp/premiumsupport/knowledge-center/amazon-eks-cluster-access/#Add_designated_user_to_the_ConfigMap_if_the_cluster_creator_is_an_IAM_role)
- 今回の手順ではgroupに`system:masters`を指定するが、このgroupは無制限に何でもできてしまう権限なので、実際の環境ではRBACで適切なgroupを作成すること → [参考](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.html)
 
### クラスターにIAMユーザー(またはロール)を追加する
以下のコマンドで、アクセス権を与えたいIAMユーザーをconfigMapに追加する

```shell
eksctl create iamidentitymapping \
--cluster クラスタ名 \
--arn アクセス権を与えるIAMユーザー(またはロール)のARN \
--username アクセス権を与えるIAMユーザー(またはロール)名 \
--group system:masters
```

```shell:実行例
eksctl create iamidentitymapping \
--cluster hoge-cluster \
--arn arn:aws:iam::111122223333:user/other-user \
--username other-user \
--group system:masters
```

#### （オプション）aws-authのconfigMapを直接編集する方法もある
```shell:configMapを直接編集する場合
kubectl edit -n kube-system configmap/aws-auth
```

## 以下の作業はクラスターを操作したい端末で実施

### 操作したいクラスタをkubectlの管理対象に加える
```
# EKSで作成されているk8sクラスターの一覧を参照
aws eks list-clusters

# 管理対象に加えたいクラスターを現在のIAMユーザーに紐付ける（クラスタ名は上記で参照した名称を指定、リージョン名は適宜修正）
aws eks update-kubeconfig --region ap-northeast-1 --name hoge-cluster

# 現在のkubectl管理対象コンテキストが切り替わっていることを確認※
kubectl config current-context

# クラスターの情報が取得できることを確認
kubectl get all
```

※コンテキストが切り替わらない場合は[こちら](https://qiita.com/value-urano/items/b86dca80f97b2eb81227)を参考に手動でコンテキストを切り替える
MSYS2環境でpacmanを使って新たなコマンドをインストールする

(小ネタ)
`MSYS2`環境で必要なパッケージは、`pacman`コマンドを使ってインストール可能です。
また、どのコマンドがどのパッケージに含まれているか`pkgfile`コマンドで調べられます。

### 例) xxdコマンドをインストールするまでの手順

#### pkgfile コマンドをインストールする
```shell-session
$ pacman -S pkgfile
```

#### repo ファイルリストを更新する
```shell-session
$ pkgfile --update
```

#### xxd.exe コマンドがどのパッケージに含まれているかを調べる
```shell-session
$ pkgfile --search xxd.exe
msys/vim
```

#### vim パッケージをインストールする
```shell-session
$ pacman -S vim
```
uipath Task Capture Community Editionインストール方法

※Task Captureインストール方法備忘録

以下参照
https://docs.uipath.com/installation-and-upgrade/docs/task-capture-installation

コミュニティエディションを使用しているユーザーはUiPathAssistantよりインストールを行う。

①UiPathAssistantを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/cf018a6d-c6bb-858f-e6cd-29d53d8a1c57.png)

②展開する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/6aefbcd7-759f-ba00-99c8-270b9ee1f5d1.png)

③タスクの文書化をクリック

④インストールとあるのでクリックしインストールを行う

⑤インストール完了後、アクティベート方法を求められるのでCommunityライセンスを選択する。

以上
Ruby 日付と曜日を出力する



今日の日付と曜日を出力するコードを作りましょう

```ruby:出力例
現在は西暦2020年5月27日（今日の日付が入ります）
水曜日です（今日の曜日が入ります）
```
ヒント
Time.newメソッドを使用しましょう

### Timeクラスとは
TimeクラスはRubyの標準ライブラリにある。時刻を表すクラス。

```ruby:使用例
# 現在時刻
now = Time.new
puts now
```


```ruby:自分の解答
now = Time.new
week = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
week[now.day]

puts "現在は西暦#{now.year}年#{now.month}月#{now.day}日"
puts "#{week[now.wday]}です"
```
```:ターミナル
現在は西暦2023年1月10日
火曜日です
```



```ruby:模範解答
now = Time.new
puts "現在は西暦#{now.year}年#{now.month}月#{now.day}日"
week = ["日","月","火","水","木","金","土"]
puts week[now.wday] + '曜日です' 
```

模範解答に沿って解説したいと思います。
1行目では、Timeクラスを使って現在時刻を取得しています。
2行目は、Timeクラスのメソッドを利用して年月日をそれぞれ取り出しています。
現在の年、月、日、を１つずつ取り出したい場合は、以下のように記述します。
```
now = Time.new
now.year
now.month
now.day
```

3,4行目は
```
puts %w(日 月 火 水 木 金 土)[now.wday]
```
と書くこともできるそうです。
%w記法と言って、
week = ["日","月","火","水","木","金","土"]　と同じ意味になります。
eksでkubectlの管理対象コンテキストを切り替える

# 前提

### 動作確認環境
- k8sバージョン 1.23
- aws cliバージョン 2.7.31
- eksctlバージョン 0.122.0
- kubectlバージョン 1.25.2


# 本題
## コンテキスト一覧確認
```shell
kubectl config get-contexts
```

## 目的のコンテキストがkubeconfigに未登録の場合
以下のコマンドでkubeconfigを更新する（クラスター名、リージョンは適宜修正）
```shell
# クラスター一覧参照
aws eks list-clusters
# kubeconfig更新
aws eks update-kubeconfig --region ap-northeast-1 --name hoge-cluster
```

## 操作したいコンテキストに切り替える
```shell
kubectl config use-context arn:aws:eks:ap-northeast-1:111122223333:cluster/hoge-cluster
```

## 現在のコンテキストを確認
```shell
kubectl config current-context 
```
[Sysdig] You have chosen a scope variable that isn't defined in the current scope

初めてSysdigを触った時に詰まった部分についてメモ。
sysdigでカスタムダッシュボードを作成してクエリーの中で変数を使用しようとすると以下のエラーが発生

![スクリーンショット 2022-07-26 20.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552745/86c00cbc-4cd4-bac3-3ca9-f755e7f7fa7d.png)

>Data Load Error: You have chosen a scope variable that isn't defined in the current scope

参考：https://docs.sysdig.com/en/docs/sysdig-monitor/dashboards/dashboard-scope/

sysdigでは、ダッシュボード単位とパネル単位でScopeが設定できるよう。

ダッシュボードのスコープは「Entire Infrastructure」
![スクリーンショット 2022-07-26 19.51.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552745/e4e9ca50-e4a3-4b9f-e3b4-b29fad6e9b96.png)


パネルのスコープは「ダッシュボードを継承」
![スクリーンショット 2022-07-26 19.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552745/e6832fa2-5fe8-24af-59c7-862ba58c4b26.png)


よくよく見るとエラーメッセージの通りで、クエリーを投げる際に変数を使う場合は、事前に設定が必要とのこと。
また、promQLで実行する場合はパネルレベルのスコープが利用できないのでダッシュボードレベルのスコープで
設定方法は、ダッシュボードのスコープで設定する必要があるよう。
https://docs.sysdig.com/en/docs/sysdig-monitor/dashboards/using-promql/#apply-a-dashboard-scope-to-a-promql-query

以下は、kube_cluster_nameというラベルに対してclusterという変数名を設定している例：
![スクリーンショット 2022-07-26 20.18.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552745/7a6b6005-b472-0a15-263b-623c15493fd2.png)


設定を保存するとグラフが表示できた。