OmniAICreator/Qiita-1.07M huggingface dataset:
(axiosで)叩いて(corsで)弾いてボタンクリック！！

# はじめに
フロントからaxiosでバックエンドの処理を実行させたかったが、何度クリックしてもcorsエラーでふせがれてしまった

# システム構成
Lambda × serverless構成
フロントからaxiosを叩くことでバックエンドのハンドラーが実行される仕組み

# 原因と解決

```
Provisional headers are shown
```

開発者ツールのネットワークタブを確認すると見たことない表示が…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/ae6e6428-2c22-a7aa-81db-dcebc24cb99f.png)

結論として、serverless.ymlに記載しているパス名が間違っており、Request URLが間違っていることが原因でした。

```yml
  get_hoge:
    handler: get_hoge.handler.main
    layers:
      - Ref: PythonRequirementsLambdaLayer
    events:
     - http:
          method: post
          path: /get_hoge # ここが原因だった
          cors:
            origins:
              - '*'
```

# おわりに
気づくのに時間がかかってしまったのでここに供養します。
【AWS Systems Manager Parameter Store】パラメータを一括で取得したい

# はじめに
環境構築の情報をドキュメントにする作業において、パラメータストアから手作業で情報を取得するのが手間だったので、AWS CLIから良い感じに取得してみました。

# パラメータを一括で取得したい

(パラメータを取得したい環境のProfileに切り替えている前提です)

## リスト形式で出力
"/hoge/"でhogeを含むパスのパラメータを取得できます
```
$ aws ssm get-parameters-by-path --path "/hoge/" --recursive --region ap-northeast-1 > output_list.txt
```

## リスト形式イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/a360a10d-c9c0-90cf-a951-dcd471dd0b72.png)


## テーブル形式で出力
```
$ aws ssm get-parameters-by-path --path "/hoge/" --recursive --output table --region ap-northeast-1 > output_table.txt
```

## テーブル形式イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/463d97d7-cd8a-f117-136f-fdd0e4594689.png)

公式ドキュメント

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ssm/get-parameters.html

# おわりに
しばらくお世話になりそうです。
DocuSignとCongaの統合

たまに見かけますね。この２つのアプリの連携

# There was an issue processing the Composer request.

+ [Custom Button with connection to Conga and Docusign not working](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4X5jSAF)

送信先に対するアクセス権が無かったみたい。

:::note
Self solved! I dug into the code last night and found out user didn’t have access to the Contacts that were listed as a signer. Once I shared the Account with her, this issue went away and she was able to send.
:::

+ [Getting error on conga composer Custom button. "There was an issue processing the Composer request."](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UsXtq)


# 関連資料

+ [APXTConga4__Conga_Composer <-- OAuthボタンみたいです](https://documentation.conga.com/composer/latest/salesforce/convert-non-oauth-buttons-to-oauth-143198577.html)

:::note
+ URL の最初の 3 行が以下のような場合、それは非 OAuth ボタンであるため、変換する必要があります。
https://composer.congamerge.com
?sessionId={!API.Session_ID}
&serverUrl={!API.Partner_Server_URL_290}

+ URL の最初の行が以下のような場合、ボタンを変換する必要はありません。
/apex/APXTConga4__Conga_Composer
:::

+ [DocuSign1ID](https://documentation.conga.com/composer/latest/salesforce/docusignr1id-158341829.html)

パラメータ値: [Salesforce の連絡先、リード、またはユーザー ID]
パラメータの説明: DocuSign1ID は、配信される文書の受信者を設定します。
[Linux][Mac]カレンダーを表示させる方法

## 要　旨
Linux及びMacにおいて、カレンダーを表示させる方法について記述します。
## 実施要領
今月のカレンダーを表示させる
```linux
cal
```
指定した年の一年分のカレンダーを表示させる。
2024年の場合
```linux
cal 2024
```
指定した年月のカレンダーを表示させる。
2024年12月の場合
```linux
cal 12 2024
```
[Macのみ]今年の指定した月の１か月分のカレンダーを表示させる。
今年の12月のカレンダーを表示させる場合
（Linuxでは表示されないので注意）
```linux
cal -m 12
```
## 結　言
今回は、Linux及びMacにおいて、カレンダーを表示させる方法について記述しました。
mindの研究 その53

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
mindでweb serverを書け。

# 方針
- server side mindを実装。
- GUIを手に入れる。
- localhost:40001で呼び出し。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/be989d69-07e0-d707-7384-b020d542e0d8.png)

# サンプルコード

```
レスポンスとは
　xは　変数
　vは　小数変数
　変換後は　文字列実体　長さ　2048
　変換後を　クリア
　変換後に　「HTTP/1.1 200 OK」を　追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　変換後に　「Content-Type: text/html」を　追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　変換後に　「<html><head></head><body>」を　追加し
　変換後に　「<canvas id="canvas" width="500" height="500"></canvas>」を　追加し
　変換後に　「<script type="text/javascript">」を　追加し
　変換後に　「var canvas = document.getElementById("canvas");」を　追加し
　変換後に　「var ctx = canvas.getContext("2d");」を　追加し
　変換後に　「function draw(data) {」を　追加し
　変換後に　「    ctx.strokeStyle = "#f0f";」を　追加し
　変換後に　「    ctx.lineWidth = 2;」を　追加し
　変換後に　「    ctx.moveTo(0, 250);」を　追加し
　変換後に　「    for (var i = 1; i < canvas.width; i++)」を　追加し
　変換後に　「    {」を　追加し
　変換後に　「        ctx.lineTo(i, data[i]);」を　追加し
　変換後に　「    }」を　追加し
　変換後に　「    ctx.stroke();」を　追加し
　変換後に　「}」を　追加し
　変換後に　「var src = [」を　追加し
　vに　0.0fを　入れ
　３００を　回数指定し
　　vに　0.03fを　f加え　vに　入れる
　　sin(v)に　200.0fを　f掛けて　250.0fを　f加える　整数化し　文字列変換し　変換後に　追加し
　　変換後に　「,」を　追加し
　繰り返す
　変換後に　「];」を　追加し
　変換後に　「draw(src);」を　追加し
　変換後に　「</script></body></html>」を　追加し
　変換後を　返すこと
。

メインとは
　ホスト名は　文字列
　ポート番号は　変数
　待ちソケットは　変数
　データソケットは　変数
　エラーコードは　変数
　文字列１は　文字列
　「localhost」を　ホスト名に　入れ
　40001を　ポート番号に　入れ
　「ホスト名 」を　表示し　ホスト名を　表示し　「 、」を　表示し　ポート番号を　数値表示し　「 番ポートで待つ。」を　一行表示する
　ホスト名と　ポート番号と　１個で　ｌｉｓｔｅｎし　待ちソケットに　入れ
　エラー？
　ならば
　　エラー文字列で　重大エラー
　つぎに
　「ｌｉｓｔｅｎの後」で　このメッセージでスタック検査し
　「ｌｉｓｔｅｎ完。待ちソケット = 」を　表示し　待ちソケットを　数値表示し　改行する
　ここから
　　「ａｃｃｅｐｔします」を　一行表示し
　　待ちソケットで　ａｃｃｅｐｔし　データソケットに　入れ
　　エラー？
　　ならば
　　　「エラー：」を　エラー出力し　エラー文字列を　一行エラー出力し
　　　打ち切り
　　つぎに
　　「ａｃｃｅｐｔ完。データソケット = 」を　表示し　データソケットを　数値表示し　改行する
　　ここから
　　　データソケットから　ハンドル指定で一行読み出し　文字列１に　入れる
　　　データ終り？
　　　ならば
　　　　「[EOF]クライアントが終了しました。」を　一行表示する
　　　　打ち切り
　　　つぎに
　　　文字列１が　「」に　等しい文字列
　　　ならば
　　　　「クライアントが終了しました。」を　一行表示する
　　　　打ち切り
　　　つぎに
　　　「データ ＝ 」を　表示し　文字列１を　一行表示し
　　繰り返し
　　レスポンスを　文字列１に　入れ　文字列１を　データソケットに　ハンドル指定で一行書き込み
　　「データソケットをクローズします」を　一行表示する
　　データソケットを　ハンドル指定でクローズする
　　「待ちソケットをクローズします」を　一行表示する
　　待ちソケットを　ハンドル指定でクローズする
　　打ち切り
　繰り返し
　「終わります。」を　一行表示する
。





```

以上。
Playwright Component Testに思いを馳せる


## はじめに

(今更ですが) Playwright Component Testの存在を最近知りました。

https://playwright.dev/docs/test-components

PlaywrigthはE2Eテストライブラリで、NodeJS上でchromium, firefox, webkitのようなブラウザ・レンダリングエンジンでのWebアプリケーションの操作を自動化してくれます。

個人だとAngularをメインで触っていることもあり、Headless Browserの実行はPuppeteer、E2EテストはCypress、のような印象を持っていましたが、React・Vue・SvelteのプロダクトではPlaywrightが採用されるケースを多く見ます。

https://tech-blog.rakus.co.jp/entry/20230509/playwright

上記のブログのように、Page(一画面)に対してテストコードを書いて実行する...というのが基本的な使い方ですが、experimentalでComponent Test Runnerも提供されています。

## コンポーネントの単体テストにおける課題

私は普段の業務で、コンポーネントの単体テストに対して以下のような課題を感じることがあります。

### 1. 本来テストするべき内容がブラックボックス化している

以下のようなテストコードを見かけることがあります。

```ts
/**
 * 例1
 */
it('保存ボタンをクリックしてAPIリクエストに成功したらスナックバーが表示されること。', async () => {
  render(<FormComponent />);

  // 保存ボタンをクリックする
  const submitButtonEl = screen.getByRole('button', { name: 'Submit' });
  const user = userEvent.setup();
  await user.click(submitButtonEl);

  // スナックバーが表示されることを検証する
  expect(screen.getByRole('alert')).toHaveTextContent('Success!');
});


/**
 * 例2
 */
it('全選択のチェックボックスがクリックされたら全てのチェックボックスが選択状態になること', async () => {
  render(<CheckboxGroupComponent />);

  // 全選択のチェックボックスを選択する
  const selectAllCheckboxEl = screen.getByTestId('select-all');
  const user = userEvent.setup();
  await user.click(selectAllCheckboxEl);

  // コンポーネントのチェックボックスが全て選択されていることを検証する
  const checkboxEls = screen.getAllByRole('checkbox');
  for (const checkboxEl of checkboxEls) {
    expect(checkboxEl).toBeChecked();
  }
});
```

どちらも極端な例なので全テストが上記のようなものというわけではありませんが、もしコードレビューをする立場の方であれば以下のような指摘を行うでしょう。

- `onClick` で何のハンドラが呼ばれているかが不明瞭。引数はどうなっている?
- テストあたりの規模が大きすぎる。スナックバーがHooksの副作用処理ならそちらのテストに切り離すべきではないのか?
- 全選択用のチェックボックスをクリックしたらStateが変わるだけであって、他のチェックボックスはそのStateを見ているだけではないのか(matcherが不適切ではないか)

上記のサンプルではコンポーネント表面上の動きを追っているだけであって、処理の妥当性は評価できていないためテストコードとして不適切です。

### 2. そもそもテストが書けない

以下のようなケースだと、そもそもコンポーネントの品質を単体テストで担保することが困難です。

- viewportのサイズに依存するもの
- Desktop/Mobileに依存するもの
- タイムゾーンに依存するもの

Vitest・Jestのようなテストランナーではブラウザそのものをエミュレートするのは不可能です。そのため、VRT(Visual Regression Testing)や手動テストのような方法に頼らざるを得ないことが多くあります。

## Playwright Component Testが解決する課題 + Testing Libraryとの住み分け

良くないテストコードの例を挙げましたが、単体テストとして不適切というだけであって、実際のコンポーネントの動きを追うという観点は重要だと考えています。
事実として結合テストでは似たような操作を手動でも行っているため、その強化材料としてPlaywrightのComponent Testを使えないか?と考えました。

細かい実装を変更する度に手動でポチポチ確認するのもいいですが、Playwright Component Testであればブラウザのエミュレーションが必要なコンポーネントテストもCIで回せばいいでしょう。

https://playwright.dev/docs/ci-intro

また、Vitest(Jest) + Testing LibraryのUnit Testで書いてしまっている中途半端なE2Eテストとの住み分けも可能になり、単体テストのテストコードはビジネスロジックのテストに寄せられるのではないかと考えています。

## まとめ

まだ実験的機能ですが、個人的にはこれからガッツリ使っていきたい機能です。
Testing Library + happy-dom(jsdom) のテストコードでは実際のブラウザ上でのUIの振る舞いを検証するものとして不十分なものもあり、手動テストの比重が大きくなることもありました。そこの改善に役立ちそうです。

しかし(それはそれとして)、メソッドレベルの妥当性を評価するUnit Testにおいて、テストコードをE2Eのように(user-eventに依存させて)書いてしまっているといったことは業務でも改善していきたい課題だと捉えています。

「中身の動きが正しいこと」の担保はTesting Library、「実際にブラウザでコンポーネントが正しく動くこと」の担保はPlaywright Component Test、のような切り分け方だとお互いのテストが被らなくていいのかなと思います。

## 参考

https://playwright.dev/docs/test-components

https://tech-blog.rakus.co.jp/entry/20230509/playwright
DevOps on AWS大全 実践編

# はじめに
この記事ではDevOpsを切り口に実プロジェクトでどのようにアーキテクチャを策定していくかについて私がまとめている記事を目次形式でまとめます。

DevOpsで使う各サービスの超詳細解説は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)にまとまっています。

# この記事を読んでほしい人
- AWSにおけるDevOpsを現場で採用したい人
- DevOpsの各サービスの説明ではなく各サービスをつなげたアーキテクチャの説明を知りたい人
- 私が書いている記事の前後性や一覧がわかりづらく困っている人

# DevOps on AWS実践編 目次
## 準備
1. AWS内にセキュアなリモートデスクトップ環境を作って自端末からVPNでつなぎたい
https://qiita.com/tech4anyone/items/6503fb9da262e8104435

2. インターネットからアクセスできないリポジトリをAWS上に作成したい
https://qiita.com/tech4anyone/items/023eca84a9f7ac6db474

## CICDパイプライン
1. Fargate上のGitLab起点でCloudFormationを更新するGitOpsを実現したい
https://qiita.com/tech4anyone/items/4b395f7a4a6189376b39

2. 別のアカウントにあるCodeCommitを起点にCodePipelineを動かしたい
https://qiita.com/tech4anyone/items/184c04b4ffc2ac6a99e9

3. Fargate上のGitLab起点でECSを更新するGitOpsを実現したい
https://qiita.com/tech4anyone/items/7a3b481c385df3bccce3

4. Fargate上のGitLab起点でLambdaを更新するGitOpsを実現したい
https://qiita.com/tech4anyone/items/1f8e8b04d10d111ad00c

5. Fargate上のGitLab起点でEC2を更新するGitOpsを実現したい
https://qiita.com/tech4anyone/items/9057e188a1c43e609bd3

6. Fargate上のGitLab起点でGitOpsを実現するパターンのまとめ
https://qiita.com/tech4anyone/items/4a2a9aae986bfe6beec9

## モニタリング・ロギング
1. AWSを使ってると出てくる様々なログを整理して分析したい
https://qiita.com/tech4anyone/items/131f14f8665476431225

2. AWSであらゆるものをモニタリングする方法を考える
https://qiita.com/tech4anyone/items/8c6dd74c126e93710f54

## 障害対応
1. AWSの障害やメンテナンスを通知して自動で対応したい
https://qiita.com/tech4anyone/items/4c80888aa46a9cd36995

## セキュリティ対策
1. AWSアカウントをあらゆるAWSのセキュリティサービスで守り切る
https://qiita.com/tech4anyone/items/c655529ad7a73e8bc3f8
Add an External Serviceの問題

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



# Add a schema relative URL path that begins  with "/" or when I do add a "/"

+ [Cannot create an External Service](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007IfjXz)

:::note
I manage to solve it as follows :-

a. In the Name credential = I follow the instruction select the "Bank"
b. In the Service Schema Relative URL = just type in /accounts/schema and it works. Anyway, tks for your help. 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8nerSAB
:::

# Add an External Service not workin : Next button が表示されない

+ [Add an External Service not workin](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UtJcz)
+ [Hello, when I try to create the External Service indicated in this challenge i can´t advance after select the API SOURCE Api Specification. I don't see an error or the buttom to click next. What's wrong here?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000PA7N)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a2439cd3-a311-9c02-0afb-3f367407ca4f.png)

:::note
You just have to change your company currency, go to Setup > Company Information > Currency > select: English (United States) USD. 

Make sure that your user lenguage and your company Lenguage are on english.

That's gonna fix your issue.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077CXVoSAO
:::


# フローのアクションでExternal Service が表示されない

+ [I cannot see the External Service in the prompt window. I checked all of the items when I filtered by Type. ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KBqkm)

:::note
Hello, I went back to Setup/External Services and edited the BankService line, I selected all the operations as shown in the image and saved the new configuration. Now the External service option is shown in the flow.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ae1268f7-16c6-198b-832f-d8aeb17ad3c3.png)

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A9AhxSAF
:::
Logic Apps を使ってインテリジェントな OpenAI アプリケーションを構築する (Use Logic Apps to build intelligent OpenAI applications)

https://techcommunity.microsoft.com/t5/azure-integration-services-blog/use-logic-apps-to-build-intelligent-openai-applications/ba-p/4014121

「Use Logic Apps to build intelligent OpenAI applications」という記事のざっくりとした翻訳です。

## コンテキスト

>エンタープライズ・アプリケーションにおけるデータとのインタラクションは、ますます広まりつつあります。開発者は現在この目的のため RAG（Retrieval Augmented Generation）モデルを多く採用しています。この方法は、OpenAIとCognitive Searchのようなベクトルストレージ技術を統合し、ユーザーがその形式に関係なく、エンタープライズデータと自然言語で会話することを可能にします。

GitHubのサンプル:

https://github.com/Azure-Samples/azure-search-openai-demo




## コードフルな手段

> 洗練されたアプリケーションの構築には、通常、いくつかの重要なステップとなるビルディング・ブロックを組み合わせる必要があります。主に、動的な取り込みパイプラインと、ベクターデータベースや大規模言語モデル（LLM）と通信できるチャット インターフェースの作成がそれです。様々なコンポーネントを組み合わせることで、データ取り込みプロセスを実行するだけでなく、チャットインターフェース用の堅牢なバックエンドを提供することもできます。このバックエンドは、プロンプトの送信を容易にし、対話中に信頼できる応答を生成します。しかし、コードでこれらのすべての要素を管理し、制御することは、非常に困難な場合があります。

## Logic Appsによるコードレス・アプローチ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/9860c33f-9bb9-81a1-8ca1-2a08df0bb1a6.png)

> このコンテキストでは、バックエンド管理を簡素化するLogic Appsの役割に主眼が置かれています。Logic Appsは、あらかじめ構築されたコネクターをビルディング ブロックとして提供し、バックエンドのプロセスを合理化します。これにより、データのソーシングのみに集中し、プロンプトを受信したときに、検索によって最新の情報が得られるようにすることができます。Azure OpenAI + Cognitive Servicesで使用されているサンプルの例を見てみましょう。

	
> Azure Open AI とAI Search の新しいサービス プロバイダ コネクタを紹介できることを嬉しく思います。このコネクタは、開発者がデータを取り込み、簡単なチャット会話を促進するアプリケーションを作成できるように設計されています。よりよく理解するために、バックエンドロジックを2つの主要なワークフローに分解してみましょう

### 取り込み ワークフロー

> 開発者は、SharePoint や OneDrive のような選択したストレージ システムに新しいファイルが到着したときなど、定期的または特定のイベントに応じて PDF ファイルを取得するトリガーを設定することができます。以下は、その取り込みがどのように見えるかについて、簡略化したワークフロー・プロセスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/70a9ba9e-4335-6b65-00e3-fb73d2ae4a63.png)

 
> データの取得： サードパーティのストレージシステムからデータを取得する。
データのトークン化： このシナリオでは、PDFドキュメントをトークン化する。
埋め込みデータの生成： Azure OpenAIを利用して埋め込みデータを作成する。
ドキュメントのインデックス化： AI Searchを使って、ドキュメントにインデックスを付ける。

							
> あらゆるデータソースでこのパターンを実装することで、開発者は取り込みパイプラインを構築する際の時間と労力を大幅に節約できます。このアプローチはコーディング面を単純化するだけでなく、ワークフローが効果的な認証、モニタリング、デプロイメント プロセスを備えていることを保証します。本質的には、Logic App (Standard)が現在提供している全ての利点が集約されています。

### チャット ワークフロー

> データはベクターデータベースに取り込まれ続けるため、ユーザーが質問したときに、ロジックアプリのバックエンドがプロンプトを処理し、信頼できる応答を生成できるように、簡単に検索できるようにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/e4df6e2a-96ba-3fb0-16c2-5b51c3d4a334.png)

> プロンプトのキャプチャ： HTTPリクエストトリガーを介してJSONをキャプチャする。
モデルのトレーニング： サンプルレスポンスへの適応（GitHubの例をモデル化）
クエリーの生成： ベクトルデータベースの検索クエリの作成
埋め込み変換： クエリをベクトル埋め込みに変換
ベクトル検索操作： 優先データベースでの検索実行
プロンプト作成とチャット補完： プロンプトを作成し、チャット補完APIと接続するために簡単なJavaScriptを使用し、チャット会話で信頼性の高い応答を保証します。

> エンベッディングの生成、トークン化からベクトル検索まで、プロセスのすべてのステップは、ステートレスワークフローによる迅速なパフォーマンスを約束するだけでなく、AIがデータファイルからすべての重要な洞察と情報をシームレスに抽出することを保証します。

## お試しください

> 新しいコネクタは現在プライベートプレビュー中です。お気軽にお試しください。2024年1月にパブリックプレビューを行う予定です。
GraphAPI連携とUiPathで気を付けること

　UiPathのOffice365スコープでの使用に苦労したため、今後のためにGraphAPI連携に必要な項目をまとめてみた。

 １，まず、最低限アプリケーションIDとテナントIDが必要
 ２，１を取得するにはMicrosoftEntraIDにログインして設定したアプリケーション名で検索（もしくは、別部署で設定したならばアプリケーションIDを聞く。）
 ３，２だけだと、「InteractiveToken」しか使えない。
 ４，３の場合個々の端末での認証になる。
 ５，「ApplicationIdAndSecret」だと、クライアントシークレットIDとクライアントシークレット（値）も必要。ただし、クライアントシークレット（値）は初期設定時にしか手に入らない。
 ６，３と５の際にMicrosoftEntraIDのアプリケーションのAPIのアクセス許可設定に気を付けること
 ７，３は対象のアクティビティに関連した項目の種類が「委任済み」、５の場合「アプリケーション」になっているか確認が必要

 　以上。
the nvidia driver on your system is too old との闘い

自分用メモ。

# いきさつ
autoAWQを使いたかった。

## 現象
Pytorchで"the nvidia driver on your system is too old"が出る。

## 色々調べたが、そもそもの依存関係が複雑...
- ホストのドライバーを更新
- 対応するnvidia-toolkit を入れろ
- CUDAドライバーを更新
- ...
依存関係複雑問題は起きる前にたたきましょう。

# そもそもthe nvidia driver on your system is too oldを出さない方法

1. 動作させたいライブラリが要求するPytorchのバージョンを調べておく
2. そのPytorchのバージョンが使えるCUDAバージョンを調べる。
2. 現在のホスト側CUDAバージョン(nvidia-smi)を調べる。
2. 3のCUDAバージョン >= Pytorchのバージョンが使えるCUDAバージョンなら、対応するnvidiaのdockerイメージを探して、必要なバージョンのPytorchを入れる。
    - RUN pip install torch==1.2.3 みたいな
2. 3のCUDAバージョン < Pytorchのバージョンが使えるCUDAバージョンならホスト側のGPUドライバーを更新しないかぎりライブラリを動作させることはできない（はず）

# 実施例

## AutoAWQ
- Your CUDA version must be CUDA 11.8 or later.
- torch >= 2.0

## host側nvidia-smiの結果
- NVIDIA-SMI 450.172.01   Driver Version: 450.172.01   CUDA Version: 11.3
- この時点でauotoAWQは（ホストGPUドライバーを更新しない限り)使えない。

## (以下は無駄でした）CUDAが11.3なのでnvidia Docker imageは11.3.1を選ぶ
- https://developer.download.nvidia.com/compute/cuda/opensource/image/11.3.1/

## 先のエラーが出る可能性があるのはPytorchなので pip list | grep torchの結果を確認
- torch                    2.1.2
- pip install torch ではいるバージョン。

## しかし CUDA 11.3 ならpytorchは1.12.1+cu113までしか使えない。

- https://pytorch.org/get-started/previous-versions/
- 但しpythonは3.8以前でないといけない
https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/5485

## なので、AutoAWQは使えない
- Your CUDA version must be CUDA 11.8 or later　& torch >=2.0なので、ホスト側のGPUドライバを更新しないと使うことはできない。
2023/12/26主にITとかセキュリティの記事

三菱UFJ銀行がCrowdStrikeのレッドチーム演習を採用(12/23)
https://www.jiji.com/jc/article?k=000000076.000031049&g=prt

「本物の証」のはずだが……S/MIME電子署名ファイル付の詐欺メールが登場(12/23)
https://ascii.jp/elem/000/004/177/4177246/?rss

Telegram（テレグラム）ってなに？　闇バイト御用達の理由は？(12/24)
https://ascii.jp/elem/000/004/177/4177278/?rss

サイバー防御、議論進まず　装備品輸出協議の遅れ影響(12/24)
https://www.47news.jp/10308081.html

SNSアップした写真＆動画で“身バレ”　ストーキングや犯罪に遭う可能性＆防御法を専門家が解説(12/24)
https://otonanswer.jp/post/189095/

もしもの時のためのログの保存と解析(12/23)
https://developers.freee.co.jp/entry/logging

AIモデルのトレーニングデータを開示することを義務付ける法案が提出される(12/24)
https://gigazine.net/news/20231224-ai-required-disclose-training-data-bill/

新人研修でHardening! 2023(12/24)
https://developers.freee.co.jp/entry/hardening-training-for-newgrads-2023

就活前に改めて確認したい用語集（３０選）(12/23)
https://qiita.com/jinta_02/items/63b8d68c254ac87b97f7

意外と知らない「アウトソーシング」の種類とメリット、デメリット(12/22)
https://dime.jp/genre/1685985/

QRコードから不正サイトに誘導　学習院大学やいなげやで(12/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/121800058/

止まらない内部不正、NTTグループ「USBメモリー全面禁止」の真意(12/25)
https://xtech.nikkei.com/atcl/nxt/column/18/02693/122100003/

ランサムウエアでの業務停止に現行BCPで対応可能？　120組織がサイバー演習に挑む(12/25)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08742/

パナ系が車載セキュリティーを多段化、安全性を常時監視(12/25)
https://xtech.nikkei.com/atcl/nxt/column/18/01537/01032/

日立がハイブリッドストレージを強化、新生Hitachi Vantara軸に生成AIの需要もつかむ(12/15)
https://xtech.nikkei.com/atcl/nxt/column/18/02686/121500003/

クアルコム系がエッジ実装LLM、ロボットを自然言語で操作可能に(12/25)
https://xtech.nikkei.com/atcl/nxt/news/18/16382/

ファイアウオールの負荷分散(12/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/121800023/
【解決】ピアソンVUEオンライン受験 75%での失敗について

ピアソンOnVUEオンライン受験で、「システムテスト：診断-ネットワークチェック75%でエラー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46510/9d1732a5-be02-d30a-42bb-7136e1cdd8b7.png)

トラブルシューティングにはネットワーク設定を確認しろとあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46510/e958c272-72e8-5c3d-6ce0-f8524d143755.png)


**解決方法**

・OnVUEはアクセスコードが一意。
・例えば、強制的に途中で落ちたとしても、ピアソンOnVUEにアクセスしアクセスコードの再取得が必要です。
・再取得しない場合でもデフォルトで前回のアクセスコードがペーストされていますが使えません。

わかりにくいエラーで対処方法を見つけるのに苦労したので残しておきます。
QEMU v8.2.0  のリリースと変更点

# QEMU v8.2.0 リリース

QEMU v8.2.0 がリリースされました。

# 詳細

https://www.qemu.org/2023/12/20/qemu-8-2-0/

上記のページを機械翻訳したものを掲載しておきます。

> QEMU 8.2.0のリリースが発表されました。このリリースには238人の著者から3200以上のコミットが含まれています。
> 
> ハイライトには以下が含まれます：
> 
> - 新しいvirtio-soundデバイスエミュレーション
> - Androidエミュレーターで使用される新しいvirtio-gpu rutabagaデバイスエミュレーション
> - Hyper-Vゲスト用の新しいhv-balloon
> - 新しいUniversal Flash Storageデバイスエミュレーション
> - Network Block Device（NBD）64ビットオフセットによるパフォーマンス向上
> - dump-guest-memoryの標準kdumpフォーマットサポート
> - ARM: Xilinx VersalボードのCFU/CFI、TRNGデバイスモデル
> - ARM: cortex-a710とneoverse-n2のCPUエミュレーションサポート
> - その他多数の機能と修正
> 
> リリースに貢献した全員に感謝の意を表しています。完全な変更リストはチェンジログでご覧いただけます。
雑記

## 良いコードとは
* 他人が見て理解しやすいコード
* 将来の自分が見て理解できるコード（過去の自分に感謝できるコード）

もちろん、オブジェクト指向の知識がある前提。
ドメイン知識はコードに収めるように書く。つまり、コードを読めばドメイン知識が得られるように書く。
→ ドメイン知識は変化が激しい。よって、ドメイン知識に係る処理も頻繁に変更できるように、アーキテクチャ及びデプロイ環境を整備する必要がある。

## Webアプリフレームワーク
Webアプリに必要な機能は凡そ出揃っている。下記の機能をクラスで明示的に実装すればそれはもうフレームワークと言ってよいと思う。
* URIルート処理・ディスパッチャー（フロントコントローラーや.htaccess）
* リクエストの処理
* バリデーター
* 出力（HTML・JSON・他）の処理（テンプレートエンジンを含むView系クラス）
* セッション管理
* 永続データの制御（ORMを含むModel系クラス)
* 環境別設定管理（.envやconfig）
* 定数管理（Enum含む）
* グローバル関数（Helper系）
* 認証
* 認可
* ドメイン知識を司るクラス（例えばService系クラス）
* 上記の機能を順序だてて呼び出して処理を明示するくらす（いわゆるController）
* パッケージ管理（vendor/ や autoloader）
2023年12月版 Scalaの導入方法

プロキシ環境では次の設定を追加。
```sh:.bashrc or .zshrc
export proxy=http://ユーザ名:パスワード@サーバ名:ポート番号
export http_proxy=$proxy
export https_proxy=$proxy
export HTTP_PROXY=$proxy
export HTTPS_PROXY=$proxy
export no_proxy=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
```

Mavenのローカルミラー（プロキシ）環境では次の設定を追加。
```:.sbt/repositories
[repositories]
  local
  maven-proxy: http://Mavenのプロキシサーバ名
```

SDKMANを導入。
```sh:
curl -s "https://get.sdkman.io" | bash
```

SDKMANでJavaを導入。
```sh:
sdk install java 20.0.1-tem
```

SDKMANでsbtを導入。
```sh:
sdk install sbt 1.9.6
```

SDKMANでScalaを導入。
```sh:
sdk install scala 3.3.1
```
[Swift] 整数型のfloor演算子

# floor とは、切り捨てる関数ですが、

Swiftに限らず、大抵のコンパイル言語には、 整数型のfloor関数は有りません。
なぜなら、普通に、整数型の除算が『切り捨て』だからです。

# ところが、負数だと、演算結果が異なる!

-10から+10までの整数を3で割ってみると、下表の値になります。
同じ値を浮動小数点にしてfloor関数した結果を併記します。

<img width="400" alt="floor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a8c367dc-3a3b-2215-c243-9aeb8b4907c4.png" />

網掛けしたところの演算結果に差が出ています。整数型を単純に除算すると、0の方向に切り捨てられるためです。でも、Pythonの`//`演算子のようにfloorした結果が欲しい。

そこで、整数型のfloor演算子を定義します。

# floor演算子

Pythonに合わせて`//`演算子としたいところですが、`コメント`になってしまうため、`|/|`としてみました。

```swift
infix operator |/| : MultiplicationPrecedence // floor
func |/|(lhs: Int, rhs: Int) -> Int {
    return (lhs - ((lhs % rhs + rhs) % rhs)) / rhs
}
```

_より汎用的にするならば、`Int`を`BinaryInteger`にするのがよいかも。_

使い方は、`/`のところを`|/|`とするだけ。

```swift:floor演算子
let a10 = -10 |/| 3  //-4
let  a9 =  -9 |/| 3  //-3
let  a8 =  -8 |/| 3  //-3
```

# floor関数

`|/|`を忘れそうなので、整数型のfloor関数も用意しておきます。

```swift
func floor(_ lhs: Int, _ rhs: Int) -> Int { lhs |/| rhs }
```

```swift:floor関数
let a10 = floor(-10, 3)  //-4
let  a9 = floor( -9, 3)  //-3
let  a8 = floor( -8, 3)  //-3
```

これで安心して除算できます。

以上
ウォーターフォール型アプリ開発における設計の概要

メリークリスマスでした。
が、こちらのアドベントカレンダーは続きます。
12/30頃にクローズ予定です。
年末で忙しいと思いますが、投稿の余裕がある方はぜひ！楽しみにしています。

# はじめに
### この記事を読んだらどうなる
設計書を管理する新人が、
設計の存在意義を理解するようになる

...ことを願いつつ書いてまいります

### 前提
システム開発における設計についてまとめています。
そこで想定しているのは、
開発手法:ウォーターフォール (アジャイル等ではなく)
開発対象：アプリケーション (インフラ等ではなく)
  
 


# まず、システム開発とはどういうものか
設計書は何かを達成するためのツール、手段だと捉えます。その目的を達成できるなら、正直設計書ではない別の方法に乗り換えてもよいのです。では、設計書はどのような目的を達成することを期待されているのでしょうか。そして、それを設計書はどのように達成していくのでしょうか。
 
設計書はシステム開発のためのツールのようです。
(一生開発する気ゼロのプロジェクトに設計書はあるでしょうか。)
 
それではシステム開発を理解する必要がありそうです。
まず、システムとは。システムの構成要素を見てみると、以下のスタック通りです。
ちなみに開発後には、移行や運用も起きます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/de91fa2e-6f8f-add0-b761-6a76f475761e.png)
 
システム開発は、それぞれの図の四角の部分を開発、調達します。
 
 
# では、設計とは
## 設計は何のためか　その役割

設計は要件定義のアウトプットをもとに行い、成果物は実装のインプットとなります。
(開発方法がウォーターフォールであることを思い出してください)

イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/00eec9eb-f845-977c-63f5-154b2f2bf52c.png)


たとえば、よくある要件定義のアウトプットには以下が挙げられます。
- ユースケース分析
- 概念モデリング
- 非機能要件定義
 

この要件定義から開発の間にある設計をすっ飛ばしてはいけないのでしょうか？
設計の必要性を考えるために思考実験もどきを挟みたいと思います。
- 絶対に設計してはいけない24時でシステムの開発・運用をするとします。
設計すると即座に罰が与えられる世界。

- その世界で、ユーザーが頭の中に思い描くアプリを受注者は作ることができるか?
- プログラマは何に基づいてプログラミングをするのか。できるのか?
- 保守、運用担当者はどうやってプログラムを理解し、修正or機能追加するのか?
 
プログラマが敏腕だったり、ユーザーとコミュニケーションが上手くとれたら良いかもしれません。一方、これが現実として難しいこともあります。また、保守・運用担当者がアプリの仕様をちゃんと理解できたらいいですが、開発に参加していない場合もあります。そうなると、運用時に修正などをする際、他人のコードを読み、修正箇所などを考えることになります。コードより自然言語でまとまってたらいいなと思うかもしれません。

設計があった方が品質や効率の点でよい場合がありそうです。
 
つまり、設計により達成したい目的には
***開発関係者がシステムがどういうものかについて把握する
開発終了後の保守開発や機能拡張の際に参照される***
が挙げられます。

ちなみに、
要件定義で詰められていない外部仕様があれば設計でカバーすることがあります。
 

 
## 設計とは何か　その実体

### 設計のトレーサビリティ
設計には、要件からのトレーサビリティが必要です。
トレーサビリティとは、要件→要件を実現するための機能→その機能を実装する方法
とつながっているということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/816bac64-615e-3263-3828-f2ddd3721e00.png)

このトレーサビリティができているかチェックするために、目の前の設計は、どの要件を満たすためのものか？をチェックするとよいでしょう。

### 設計の種類
さらに設計にも種類があります。
ここでは外部設計、内部設計を扱います。

***外部設計***
何のためのものか？：外部仕様を設計する。外部仕様とは、ユーザーや外部システムにとって、システムがどんな機能をもたらしてくれるか？の仕様。あるいは、システムの視点でとらえると、システムの入力と出力を明確にすること。
この仕様は業務や業界のやり方に沿っていなければならず、そこで業界知識が求められます。例えば、商品配送システムの場合。一般の小売業界だと、発注→配送という順序が通常です。しかし、物流倉庫会社だと、発注なしで配送するケースがあります。相手が得意先の場合など。このように、要件定義と外部設計のためには業界知識が必要となることがあります。

具体的には？：
- 画面設計
(→画面モックアップ、画面遷移図、画面入力チェック仕様書etc.)
- 外部システムI/F設計
- バッチ設計
- 帳票設計
- データベース論理設計
※括弧内はドキュメント
 
***内部設計***
何のためののものか？：
入力と出力の間で行う内部処理を設計します。

具体的には？：
- 画面プログラム設計(→Controller設計書)
- ビジネスロジックプログラム設計
- データベースプログラム設計(→エンティティクラス図, CRUD設計書)
- データベース物理設計(→物理ER図、テーブル定義書)

 
以上、外部設計･内部設計をシステムの構成要素で対応付けるとこのようになっています。
入力と出力ー外部設計　処理ー内部設計
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/153d6785-aaf0-4748-9fef-8b8875484451.png)

 
 
さて、設計はドキュメントを通して表現し、管理していくことが多いようです。(ウォーターフォール型では)
既に先ほどちらっと出ましたが、設計書の概念を整理します。

# 設計書の種類
 
ただし、各設計書の作成されるフェーズはプロジェクトごとに異なることがある。
種類が多いので、個別の設計書は別の記事で扱いたいと思います。
~~サラミ出版じゃないです(震え声)~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/9f733b40-32f9-259c-516c-c8054135f509.png)

 
 
 
 

 
 
## 参考書籍
『はじめての設計をやり抜くための本 第二版』
『エンジニアなら知っておきたい システム設計とドキュメント』
chatGPTを使って効率よく勉強しよう！

# はじめに
こんにちは　最近ヨガをやりはじめましたしんいちです。30分間に合いませんでしたまじでごめんなさい
こちらの記事は[watnow Advent Calendar 2023](https://qiita.com/advent-calendar/2023/watnow-calendar)の16日目です！
今回の記事は学生エンジニア必見chatGPTを上手に使って効率よく勉強する方法を紹介したいと思います。
学期終わりに勉強を効率よくし単位を確保したい方はぜひ最後まで見ていってください！
# 活用法①小テスト
まずは誰もが知っている活用方法です。
小テストの問題をそのままコピーアンドペーストしてchatGPTに解いてもらう方法です。
私もよく活用している方法です。肝心な正答率ですがこれは正直小テストの内容によって変わってきます。
基礎的な問題や簡単な数学の問題であればかなり高い正答率を出すことができます。
実際に提出日時が10分後に迫っている小テストでも満点回答をすぐに出すことができました。
正直1回生の頃にあったらもっと楽に単位が取れていたと思います。
# 活用法②レポート
chatGPTはレポートでも大活躍します。
レポート課題をする上でで「何を書けばいいのかわからない。」「書き始めのとっかかりがうまく掴めない...」などさまざまな問題が発生します。
しかしchatGPTをうまく活用することでスムーズに書き始めることができます。
### 情報収集問題
まずは何を書けばいいのかわからない場合はGoogle先生に尋ねるのもとても良い手段ですがchatGPTでも調べれる内容はあります。
Google先生の方が情報量としてはとても多いと思いますが情報量が多すぎて何から見たら良いのかわからない場合もあります。
そんな時はとりあえずchatGPTに聞いてみて書きたい内容の背景などざっくりとした情報を把握してからGoogle先生に助けてもらうとかなりの情報量を効率よく手に入れることができます。
### 書き始め問題
ここまでうまく情報を収集することができたらその情報を箇条書きにしてみましょう。
箇条書きにしたものをchatGPTにコピペし、レポート課題の条件や問題文とともにchatGPTに入れることで自分自身でまとめた情報でレポートを作成してもらえます。(箇条書きの情報を使用してください等条件を細かく指定すると自分が求めているものが出来上がりやすくなります)
ここまで来たらレポートはほとんど完成しています。
あとは若干おかしいところなど稀にあるのでうまく手直しをしたら完成です。
### 自分で頑張って書いたレポートの添削
自分でレポートを書いた場合でもchatGPTは活用することができます。
レポートなどの文章ではレポートにふさわしい言葉を使用しなければなりません。
私はレポートに相応しい文章で上手に書くことができませんがこの方法で上手に書くことができます。
![スクリーンショット 2023-12-26 0.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391275/124ca854-6f29-7e5b-1682-303ec51b3b28.png)
この記事の文章の一部を入れてみました。
めっちゃ話し言葉な文章がレポートにふさわしく勇ましい文章になっています。
このような形で文章の添削にも活用することが可能です。
# 活用法③テスト勉強
ここ最近で1番感動した使い方です。
大学も終盤になってきていてテストとても多いですよね。
テスト対策にchatGPTは活用することができます。
chatGPT4からファイルを読み込ませることが可能になりました。
この機能を活用してテスト勉強を効率よくすることが可能です。
まずはレジュメなどのテスト範囲に関連するファイルを読み込ませます。
次に
**この資料を元に穴埋め型の問題を生成してください。
資料の中で赤文字になっているところはこの資料で重要なところです。
問題の回答は資料の中の言葉を使用してください。**
といった感じで文章を入力します。
そうすると読み込ませたレジュメの内容から作られたテスト問題ができます
![スクリーンショット 2023-12-25 23.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391275/1bd32aaf-9f20-9b1b-d8e2-64093836aef3.png)
こんな具合になかなか良い感じの問題を生成してもらえます
今まで漠然と資料を眺めていただけだったのが問題があることで手を動かしやすくなり覚えないといけない知識がすんなりと頭の中に入っていく気がします。
# 終わりに
今回はchatGPTを活用した課題とテストのこなし方を紹介しました。
他にもさまざまな活用法があると思いますのでぜひ皆さんオリジナルな活用法さがしてみてください！
みんなで秋セメスター乗り切って良い春休みを迎えましょう。
最後までお付き合いいただきありがとうございました:bow_tone1:
Swiftを独学で勉強した1年振り返り〜やってよかったこと・悩んだこと〜

# はじめに
異業種で会社員として働きながら、iOSエンジニアを目指して、Swiftを独学で勉強しています！もうすぐSwiftを勉強し始めて1年になるので、今年1年を振り返り、やってよかったこと・悩んだことを共有したいと思います。

# やってよかったこと
## 1. エンジニアコミュニティに参加する！
私にとって最初の一歩を踏み出してコミュニティに参加することはとても勇気が必要でした。私みたいなレベルでも参加してもいいのかな？と思っていましたが、いざ参加してみると、杞憂であったことがわかりました。
### カンファレンス動画鑑賞会に参加
まず、地元の**徳島で開かれているカンファレンス動画鑑賞会**に参加してみました。iOSDCやDroidKaigiの過去の動画を鑑賞し、意見交換をするという内容でした。ここでiOSDCの存在を知り、技術的なお祭りみたいで、やっぱりエンジニアって面白いなと思いました。参加しているエンジニアの方々も快く受け入れてくださり、意見交換をするのも楽しく、もっと技術力を高めてお話しできるようになりたいと思いました。

### アプリ道場サロンに参加
アプリ道場サロンは、**iPhoneアプリ開発・Swift・Xcodeに興味のある方々が集まるオンラインサロン**です。オンラインサロンに入ったことがなく、最初は抵抗がありましたが、エンジニアの方に勧めていただき、勇気を持って参加してみました！同じように独学でiOSエンジニアを目指している方、エンジニアとして働いている方、個人開発をしている方とオンラインで気軽に話すことができました！私にはとても合っていて、一緒に頑張っている仲間がいて、相談し合ったり、励ましあったりしたおかげで、独学を続けれたと思います！

## 2. 勉強会参加・勉強会主催をする！
### 勉強会参加
対面の勉強会は東京に行った際、**DeNAさんが開催しているiOSTestNight**に参加しました！個人開発で使っているライブラリを作成した方がいて直接感謝を伝えることができたり、いろいろなエンジニアの方の面白いお話が聞けて楽しかったです！
オンラインの勉強会は**アプリ道場サロンの仲間が開催している勉強会**に参加し、知識を深めたり、わからないところを質問すると、サロンを運営しているあきおさんや勉強会に参加している方々が答えてくれ、とても勉強になりました！

### 勉強会主催
最近は、**アプリ道場サロンでオンラインの勉強会を主催**させてもらっています。勉強会の主催となるとハードルが上がるイメージがあり、なかなか主催することができていませんでした。今となってはもっと早く主催をしていればよかったと思っています。主催することで書いたコードを言葉で説明する練習になったり、自分の理解があやふやなところに気づくことができて、参加者の方からアドバイスをもらい、より深くまで知識を深めれているように感じます！

## 3. アウトプットをする！
アウトプットとして**Qiitaで記事**を書いています。最初は間違ったことを書いてしまったらどうしようという気持ちがあったのですが、その気持ちより今までお世話になったエンジニアの方々のように私も記事を書くことで誰かの役に立ちたい！という気持ちで今はアウトプットを行なっています！アウトプットをする中でQiitaに編集リクエストやコメントをくださる方々もいて、知らないことをたくさん知ることができました！
アウトプットとして**Xで日々の勉強の投稿**をしています。返信でアドバイスや応援をしてくださったり、iOSエンジニアの方々と繋がれて、新しい技術を知れてよかったです。

# 悩んだこと
勉強する中でiOSエンジニアになりたい！という気持ちがあるのに、自分の成長スピードが遅いと感じて、悩んだ時期がありました。一緒に勉強している仲間やエンジニアの方々に相談することで悩みを少しずつ解消することができました。焦りから目的を見失っていました。
どのようなエンジニアになりたいかをもう一度考えた時に、今まで自分が教えてもらったエンジニアの方々みたいに**基礎を理解し、わかりやすく説明することで、誰かに貢献できるようなエンジニアになりたい**と思いました。
そのためには文法の理解を深める必要があると感じているので、今勉強に励んでいます！

# 最後に
**徳島県の阿波踊りの歌の出だしに「踊る阿呆に見る阿呆 同じ阿呆なら踊らにゃ損損」という言葉**がありますが、いろいろなことに挑戦して得られるものがとても多いことに気づいたので、これからも積極的に挑戦したいと思います！
来年はiOSDC参加やiOSエンジニアに転職することに挑戦したいと考えています！
今年はSwiftw通じて、いろいろな方々に出会えて素敵な楽しい一年になりました！ありがとうございました！そして長くなってしまったのですが、最後まで記事を読んでくださりありがとうございました。
オフラインカンファレンス 当日スタッフの話【Vue Fes Japan 2023】

## はじめに
この記事は フューチャーアドベントカレンダー2023 の11日目です。
遅れてごめんなさい！本当にごめんなさい。
HIGの永井です。コロナ禍で開催されていなかった、オフラインでのカンファレンスが今年は続々と開催されるようになりました。2018年ぶりにオフラインでの開催となったVue Fes Japan 2023にボランティアスタッフ（当日スタッフ）として参加しましたので、スタッフ参加記を ~~書こう書こうと思って忘れていた~~ アドカレのために温めていた~~どころか、温めすぎて期日すっかり忘れていた~~ので、このタイミングで記事にいたします。

## 技術コミュニティへの貢献とカンファレンススタッフ

### 技術コミュニティへの貢献
OSSやその周辺のコミュニティ（以下OSSコミュニティ）の発展は、私たちの生活に大きく寄与します。業務上の開発でも様々なOSSにお世話になっています。様々なOSSのおかげで仕事が出来ている、お給料が貰えているといっても過言ではなく、まさに「飯のたね」なわけです。そういったことから、OSSやOSSコミュニティの発展のために、何かしら貢献したいと私は思っていましたし、多くの方も同じ気持ちであると思います（そうだと信じたい！）

技術コミュニティへの貢献方法はいろいろありますが、オープンソースへのプルリクエストなどはなかなかハードルが高いなあと感じている人も多いのではないでしょうか。比較的ハードル低く関われる活動の１つにカンファレンスのスタッフがあります。カンファレンスによって呼び方は異なりますが、スタッフには1年かけて運営準備を行う「コアスタッフ」、当日（前日の設営に）稼働する「当日スタッフ」に分かれます。興味がある方は、まずは当日スタッフをやってみることをおすすめいたします。

コロナ禍も明けて今年はオフラインでのイベントも増えてきました。

Vue Fes Japan 2023は2018年以来のVue Fes Japanのオフラインイベントとなります。2020年以降はご存じの通り、コロナ禍でオンラインイベントが出来ない状況でしたが、2019年も台風のため中止となっており、待ちに待ったイベントでした。今回Vue.jsを業務で使っていることもあって、スタッフとして参加してみることにしました。

## やった仕事
稼動日は3日で、1か月前くらいに当日スタッフキックオフ、前日に設営、当日本番、という形でした。
誘導チームにアサインされたので、当日朝〜最後まで会場内で人を誘導していました。

具体的には会場の入り口でチケット（名札）をチェックしたり、講演のルーム内でなるべく詰めてもらって座ってもらったり、立ち見が出た場合は、いい感じにばらけてもらったりと、名前の通り誘導していました。

入り口での誘導の間に、参加者にクリエイティブウォール（自由にお絵描きできるボード）に描いてもらうよう声がけもしていました。

![3F2D3E66-C021-489E-8D9D-4B479080FEAD_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322052/5d702e13-606e-316a-6d07-a019a4acb18f.jpeg)


当日は当社（フューチャーアーキテクト株式会社のほう）がスポンサーしていたり、当社の@ota-meshi sanが登壇していたりと、知っている人も多く出入りしていて、なんだかフレンドリーな気持ちになりました。

なお直前に怪我をして、左小指が折れてました。スタッフ内では骨折した人、として認知されていた気がします。
ご迷惑をおかけしました。

スタッフ間ではのちに打ち上げもやったりと交流があり、いろいろと技術や業務の話ができました。
[「Vue.jsのslotの機能を初心者にわかるように解説してみた」](https://future-architect.github.io/articles/20200428/)を読んでくださった方も複数人いてちょっと感動しました。


## 「ロビー」

ここ数年のコロナウイルスへの対応を理由に、多くのイベントが中止、もしくはオンラインイベントで実施されました。
今年に入り、各イベントが実施されるようになり、2020年以前のような光景が戻ってきました。
技術的にもオンラインでやれてしまうことがわかった中で、オフラインイベントを行う意味・意義とはなんでしょうか。
オフラインイベントにあってオンラインイベントにないものがあって、それを取り戻すかのように、多くのイベントがオフラインへと回帰しましたし、実際、オフラインのイベントっていいなあと感じた方も多かったと思います。

コロナ禍で様々なオンラインイベントが開催されていくようになった当初、知り合いのイベント会社の方とお話しする機会がありました。
彼曰く、オフラインイベントにあってオンラインイベントにないものとは、**「ロビー」** である、とのことです。
これは物理的な「受付の場所」という意味以上に、なんとなく人が集まっていることでうまれる**思いがけぬ出会いやそこでの雑談、ワクワク感や熱量のことを比喩的に表現**しているものです。
オンラインイベントをいくつかお手伝いしてきた中で、オンラインイベント中にこの「ロビー」に代わるものをなにか提供できないかは大きな課題でした。いろいろ工夫をしたところもありますが、結局、見つからず。
オフラインイベントに参加して「ロビー」の強みを再認識しました。

ロビーに集える、オフラインイベント、来年も盛り上げていきましょう。
STM32でToFセンサー単体を動かす

# STM32でToFセンサーを動作させる
今回はSTMマイコンでToFセンサーを動作させたときのことをまとめます。
STM公式のToF評価ボードを使った例はたくさん出てきますが、sparkfunなどの単体のToFセンサーを使った例はほとんどなかったので、初心者の自分にとってはまあまあ苦労しました。

## 環境(必要な機材)
マイコン:
STM32Hシリーズ
(これじゃなくても動くと思います)

ToFセンサー:
[Qwiic VL53L5CX搭載 ミニToF測距センサ](https://www.switch-science.com/products/7934)

抵抗:
2.2kΩ 2個(SDAとSCL)
47kΩ  2個(INTとRST)

## 手順
前提としてプロジェクトは作成済みとする。
### 1.ドライバーをPCにダウンロードする
最初はソフト側の設定です。
STMマイコンでToFセンサーを動作するためのドライバーが用意されているので、以下のリンクからダウンロードする。
https://www.st.com/ja/embedded-software/stsw-img023.html

### 2.ドライバーをプロジェクトに追加する
以下のリンクの"Add the Driver"を参考に、ドライバーをプロジェクトに追加する。
[Getting Started with the VL53L5CX ToF Sensor](https://forum.digikey.com/t/getting-started-with-the-vl53l5cx-tof-sensor/20900)

### 3.プロジェクト内でピンの設定をする
以下のリンクの"Configure the STM32 Device"を参考に、ピンの設定をする。
[Getting Started with the VL53L5CX ToF Sensor](https://forum.digikey.com/t/getting-started-with-the-vl53l5cx-tof-sensor/20900)

今回はSDA、SCL、I2C_RST_C、INT_Cを設定しました。

### 4.コード上に組み込む
2で追加したドライバーのパッケージ内にサンプルコードがあるため、そのコードを参考に自分のコード上に関数を追加する。
(サンプルコードの1の内容だけで基本的なデータを取得するプログラムは書けます)

### 5.ToFセンサーをSTMマイコンに繋げる
次にハード側の準備です。
SDA、SCL、GND、3Vを使うため、ToFセンサーのこの4つのピンとSTMマイコンの該当するピンを繋げます。
SDA、SCLはマイコンによってピンが決まってるのでマイコンの仕様書を読んで確認してください。
またSDA、SCLはI2Cなのでプルアップ抵抗を使います。
繋ぎ方はデータシートの7ページを参照。
(INTとRSTはコードによっては繋げなくても大丈夫です、今回は繋げなくても動く)

# 参考サイト
## 直接参考になったサイト
[Getting Started with the VL53L5CX ToF Sensor](https://forum.digikey.com/t/getting-started-with-the-vl53l5cx-tof-sensor/20900)
"Configure the STM32 Device"と"Add the Driver"を参考にした。

[Qwiic ToF Imager - VL53L5CX Hookup Guide](https://learn.sparkfun.com/tutorials/qwiic-tof-imager---vl53l5cx-hookup-guide)
レジスタアドレスなどのセンサーのインターフェイス周りを参考にした。

[vl53l5cx_neopixel_demo](https://github.com/eewiki/vl53l5cx_neopixel_demo)
platform.cの内容はユーザが書かないといけないが、その内容はこのリポジトリの内容をそのままコピーした。

## 知識として参考になったサイト
[Using the STM32Cube HAL I2C Driver in Master Mode](https://forum.digikey.com/t/using-the-stm32cube-hal-i2c-driver-in-master-mode/15122)

[Getting Started with STM32 - I2C Example](https://www.digikey.be/en/maker/projects/getting-started-with-stm32-i2c-example/ba8c2bfef2024654b5dd10012425fa23)

[]()
創英角ポップ体でプログラミングするの巻

# はじめに
皆さんは、創英角ポップ体という書体をご存知でしょうか。
創英角ポップ体は、例えば店内のPOPなどに使われる書体で、巷ではダサいフォントの一例として挙げられているようです。

では、このフォントをプログラミング用フォントとして使用してみたらどうなるでしょうか？
実際に確かめてみましょう！

# 環境
- OS: Windows Server 2022
- IDE: JetBrains CLion
- Repo: https://github.com/arumino-om/kirikiri-x

# どうなるの？
![IMG_0221.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350467/7b56cc61-017b-da4a-c45d-261f224e6a89.jpeg)

良い気分でコーディングするにはもってこいのフォントでした。

~~正直二度とやりたくない~~

# まとめ
プログラミング用フォントはちゃんとしたものを選びましょう！！！！！！
React について簡単なまとめ 3


## Map, ForEach, Filter and Reduce

#### Map
.map() メソッドは配列を反復処理し、マップ本体内に記述したロジックを計算して、新しい配列を返す。

#### ForEach
ForEach は .map() に似ているが、配列を返さない。


#### Filter
フィルターメソッドは、ブール条件に基づいて配列内の値をフィルターで除外するのに役立つ。
ブール条件が true の場合、結果が返され、最終配列に追加される。
そうでない場合はスキップ。 Filter も .map() メソッドと同様に配列を返す。


#### Reduce
.reduce() メソッドは、以前の値、現在の値、およびアキュムレータを考慮する。
.reduce() メソッドの戻り値の型は常に単一の値。
配列のすべての値を処理し、累積された結果を導き出したい場合に便利。

## ポリフィルの実装方法

ポリフィル（Polyfills）・・・最近の機能をサポートしていない古いブラウザーで、その機能を使えるようにするためのコード

https://developer.mozilla.org/ja/docs/Glossary/Polyfill



## デバウンスとは何か？
デバウンス（debounce）・・・
関数が頻繁に呼び出されないようにして、最後に呼び出されるまで一定時間待機してから呼び出す方法。
アマゾンのページだと、検索バーに何かを入力して、0.5秒間停止すると、結果が取得されて表示される。これがまさにデバウンス。


https://qiita.com/itinerant_programmer/items/5900b3ea0e6823223ee7

https://qiita.com/KokiSakano/items/b327cbeed020a2872ae6

## クロージャとは何か？
クロージャ（closures）・・・
クロージャは、一緒にバンドルされた (囲まれた) 関数とその周囲の状態 (語彙環境) への参照の組み合わせ。
クロージャを使用すると、内部関数から外部関数のスコープにアクセスできるようになる。 JavaScript では、関数が作成されるたびに、関数の作成時にクロージャが作成される。


https://zenn.dev/takiko/articles/5400a6b0c6bd7d


## React Hooks

React フックに関して、フロントエンド コーディングの面接でよく聞かれる内容。

- useState()
- useReducer()
- useEffect()
- useRef()
- カスタムフックとその実装


## サイドプロジェクトを作成して開発者としてアピールする、目立つ


サイドプロジェクト（Side Project） ・・・本業以外の空いた時間を、自分の趣味や好きなことに使うこと。サイドプロジェクトは、将来的に大きなビジネスに発展する可能性を秘めている。InstagramやUberは、元はサイドプロジェクトが起点となっている。

https://www.finchjapan.co.jp/dictionary/dc-bizdev/2532/#:~:text=%E3%80%90%E3%82%88%E3%81%BF%E3%80%91%E3%81%95%E3%81%84%E3%81%A9%E3%81%B7%E3%82%8D%E3%81%98%E3%81%87%E3%81%8F%E3%81%A8%E3%80%90,%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AB%E4%BD%BF%E3%81%86%E3%81%93%E3%81%A8%E3%80%82

React/HTML/CSS/JavaScript のすべての概念と、これまで学習してきたことすべてを実装したプロジェクトを 1 つまたは 2 つ構築する。

他の候補者より目立つために、ユニークなプロジェクトを作成する。
Amazon / Netflix などのクローンではなく、1,000 回のリンク訪問ごとに 1 ドルを請求する短縮 URL サイトを作成したら、あなたに興味を持つ可能性が高くなるかもしれない。

サイドプロジェクトを作成すると、開発者としてのスキルアップにも役立つ。
開発する過程で、さまざまなスキルを学び、上達できる。

自分のスキル（React、HTML、CSS、JS) について深い知識を持つ。
目立つために一通りのプロジェクトを作成して、シェアする。

## 参考

https://www.freecodecamp.org/news/prepare-for-react-technical-interviews/
JavaとCなどに対応した静的コード解析 infer on mac

# 静的コード解析 inferを使う

JavaとCなどに対応した静的コード解析 [infer](https://github.com/facebook/infer.git) の source code build手法について

```brew install infer``` ができませんので、ソースコードからbuildしたいわけですが、 ```./build-infer.sh java``` はできても ```./build-infer.sh clang``` でエラーになったので、 ```Install Infer from source without opam``` を試していたが、いろいろとエラーになったので、その対策のメモ

# Build成功した方法

なお、下のsectionにある各種try & error & 対策も参照のこと

```
brew install autoconf automake cmake opam pkg-config sqlite gmp mpfr java
```

```~/.zprofile
export C_INCLUDE_PATH=/opt/homebrew/include
export LIBRARY_PATH=/opt/homebrew/lib
```

```
source ~/.zprofile
```

```
cd ~/work
git clone https://github.com/facebook/infer.git
cd infer
```

```
./facebook-clang-plugins/clang/src/prepare_clang_src.sh
./autogen.sh
./configure
make
// ここでなぜかinfer.exeのbuildでerrorになるが、ここまでbuildしてから以下を実行すればbuildできるようになった！
./build-infer.sh clang java
sudo make install
```

# OCaml atdgenでエラー (mlgmpidlのinstall エラー (gmprとmprf))

下が ```./configure```の実行中に
```
checking for OCaml findlib package atdgen... not found
configure: error: missing OCaml dependency: ocamlfind

If you are using opam, please run

  opam update
  opam install --deps-only infer .
```

が出た場合は、

```
opam install mlgmpidl
eval $(opam env)
```

なお、mlgmpidlのinstallは、 ```mpfr.h``` と ```gmp.h```がinclude解決できず、エラーとなっていて、本当は、```GMP_PREFIX```と```MPFR_PREFIX```を設定してbuildせよとのことだが、```GMP_PREFIX```は効いたが、```MPFR_PREFIX```は効果が無く、 ```C_INCLUDE_PATH``` や```LIBRARY_PATH``` で解決した(上の```~/.zprofile```と```source ~/.zprofile```参照

ちなみに、```GMP_PREFIX```と```MPFR_PREFIX```を設定してbuildは以下である。
```
brew install gmp mpfr
ln -s /opt/homebrew/Cellar/mpfr/4.2.1 /usr/local/mpfr
ln -s /opt/homebrew/Cellar/gmp/6.3.0 /usr/local/gmp
env GMP_PREFIX=/usr/local/gmp MPFR_PREFIX=/usr/local/mpfr opam install mlgmpidl
```

# Make中にclang_pluginの問題の修正

以下をpull request中
https://github.com/facebook/infer/pull/1804

```Makefile
.PHONY: clang_plugin
clang_plugin: clang_setup
	$(QUIET)$(call silent_on_success,Building clang plugin,\
	$(MAKE) -C $(FCP_DIR)/libtooling all \
	  CC="$(CC)" CXX="$(CXX)" \
	  CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" \
	  CPP="$(CPP)" LDFLAGS="$(LDFLAGS)" LIBS="$(LIBS)" \
	  LOCAL_CLANG="$(CLANG_PREFIX)/bin/clang" \
	  CLANG_PREFIX="$(CLANG_PREFIX)" \
	  CLANG_INCLUDES="$(CLANG_INCLUDES)" \
	  SDKPATH="$(XCODE_ISYSROOT)" \
	)
	$(QUIET)$(call silent_on_success,Building clang plugin OCaml interface,\
	$(MAKE) -C $(FCP_DIR)/clang-ocaml build/clang_ast_proj.ml build/clang_ast_proj.mli \
	  CC="$(CC)" CXX="$(CXX)" \
	  CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" \
	  CPP="$(CPP)" LDFLAGS="$(LDFLAGS)" LIBS="$(LIBS)" \
	  LOCAL_CLANG="$(CLANG_PREFIX)/bin/clang" \
	  CLANG_PREFIX="$(CLANG_PREFIX)" \
	  CLANG_INCLUDES="$(CLANG_INCLUDES)" \
	  SDKPATH="$(XCODE_ISYSROOT)" \
	)
```
React について簡単なまとめ 2


## リストのレンダー 

コンポーネントのリストをレンダーする場合は、
for ループ や 配列の map() 関数 
といった JavaScript の機能を使う。

## イベントハンドラ

イベントへの対応は、コンポーネントの中でイベントハンドラ関数を宣言して対応。
下記だと、 handleClick() の関数内で対応を記述。

```
function MyButton() {
  function handleClick() {
    alert('You clicked me!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}
```

※ onClick={handleClick} の末尾には括弧は付かない。 
イベントハンドラ関数を呼び出すわけではなく、渡すだけ。
ボタンがクリックされたときに、React がイベントハンドラを呼び出す。

## useState

コンポーネントに情報を「記憶」させて表示したい場合は、
コンポーネントに state を追加して対応する。
（ボタンがクリックされた回数を数えるケースなど）

まず、React から useState をインポート。

useState からは 2 つのものが得られる。
1. 現在の state (count) 
1. それを更新するための関数 (setCount) 

（※慣習的に [something, setSomething] と記述）

同じコンポーネントを複数の場所でレンダーした場合、それぞれ場所で独自の state を持つ。
（各ボタンがそれぞれ count という state を「記憶」し、他のボタンには影響を与えない）

## フック

use で始まる関数は、フック (Hook) と呼ばれる。
useState は React が提供する組み込みのフックの一つ。

（※API リファレンスで他の組み込みフックを見ることができ、
また、既存のフックを組み合わせて独自のフックを作成することも可能）

フックには通常の関数より多くの制限がある。

フックはコンポーネントのトップレベル（または他のフック内）でのみ呼び出すことができます。

条件分岐やループの中で useState を使いたい場合は、
新しいコンポーネントを抽出してそこに配置します。

コンポーネントが同じフックを利用し、一緒に更新されるようにするには、
状態を個々のボタンから「上に」移動して、それらすべてを含む最も近いコンポーネントに入れる。
 -> こうすれば、どちらのボタンをクリックしても、同一のフックが利用され、連動して更新される。

## props

渡される情報は props と呼ばれる。
コンポーネントはフックの状態とイベントハンドラを保持しており、それらをどちらも props として各ボタンに渡します。

例えば、ボタンをクリックすると、onClick ハンドラが発火する場合、
各ボタンの onClick プロパティは コンポーネント内の関数となっているので、その中のコードが実行される。
setCount(count + 1) というような関数が呼び出されて、count という state 変数をインクリメントした場合、
新しい count の値が各ボタンに props として渡されるため、すべてのボタンに新しい値が表示される。

（※この手法は「state のリフトアップ（持ち上げ）」と呼ばれており、
リフトアップすることで、state をコンポーネント間で共有ができる）

## 参考

https://ja.react.dev/learn
React について簡単なまとめ 1


## コンポーネント

React アプリはコンポーネントで構成されています。

##### コンポーネントとは・・・
独自のロジックと外見を持つ UI（ユーザインターフェース）の部品
- コンポーネントは、ボタンのような小さなものである場合も、ページ全体を表す大きなものである場合もある

React におけるコンポーネントとは、マークアップを返す JavaScript 関数

※ React のコンポーネント大文字で始まる（例. <MyButton /> など）、HTML タグは小文字

## JSX 

JSX は HTML より構文が厳格。
`<br />` のようにタグは閉じる必要があります。

* コンポーネントは複数の JSX タグを return することはできません。
    * `<div>...</div>` または、空の `<>...</>` で囲む


## スタイル

CSS クラスを className で指定、 HTML の class 属性と同じ方法で動作。
CSS ルールは、別の CSS ファイルに記述する。


## データ表示

JSX の利用によって、JavaScript 内にマークアップを入れることができる。

JSX の中から JavaScript に戻る場合は、波括弧を使う。
- コード内の変数を埋め込んで表示

```
return (
  <h1>
    {user.name}
  </h1>
);
```

## 参考

https://ja.react.dev/learn
【JavaScript】イベントを発生させる方法

以下のように記述すると指定したイベントを発生されることができます。

```js
const evt = new Event("click")
document.dispatchEvent(evt)

```

```js
// バブルアップし、キャンセルできない look イベントを作成

const evt = new Event("look", { bubbles: true, cancelable: false })
document.dispatchEvent(evt)
```

https://developer.mozilla.org/ja/docs/Web/API/Event/Event
AmbientのデータをZabbixに取り込む

# はじめに
ESP8266などのデータを手軽に可視化、蓄積するには[Ambient](https://ambidata.io/)が手軽でとても便利です。
Ambientにデータを送信するための各種サンプルコード等もWeb上にたくさん情報があり便利に使用させていただいています。
ただ、我が家は各種データをZabbixで管理しているため、AmbientとZabbixの二重管理になってしまいます。
今回、AmbientのデータをAPIにてZabbixより取得してZabbixに一元化することができたので、その手法を記事にします。

## 環境
・ZabbixServer 6.0.25
・Debian 11.8

# Zabbixでの設定
## データ取得の流れ
ZabbixからAPIを叩いてデータ取得をし、ZabbixDBまでに格納するまでの流れは以下の通りです。
１．アイテムのタイプ：URLエージェント を使用して、Ambientの最新データをJSON形式で取得する。
２．アイテムのタイプ：依存アイテム　を使用して、１．で取得したアイテムから目的の項目（d1～d8）のデータを取得する
３．取得したい項目の数だけ２．と同様のアイテムを作成する。

Ambientは、データの送信回数については明記されていますが、APIの実行回数の制限については確認できませんでした。（誰かご存知の方がいらっしゃったら教えてください）
一応毎分データ取得（1,440回/日）をしていますが問題なくデータを取得し続けられています。

## 事前準備
### ・チャンネルIDとリードキーの確認
データを取得したいAmbientのチャンネル管理画面にアクセスし、以下の図の箇所の**チャンネルID**と**リードキー**をメモしておきます。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696364/8867193a-26da-5b66-7f17-3b93b6efe09e.jpeg)

## Zabbixの設定
### ・Zabbixホストの作成
私の[別の記事](https://qiita.com/d_yan/items/805f50a6f1139fa94215)のように、テンプレートを作成しても良いのですが、今回は取り急ぎ1つのデータだけなので、ホストに直接アイテムを作成します。

名前は任意のもので構いません
インタフェースも不要です。
![09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696364/db97ed88-8a6a-8f14-9c67-09abfc436a20.jpeg)

#### ホスト-マクロ
マクロ：{$CHANNEL_ID}
値　　：管理画面で確認したチャンネルID

マクロ：{$READ_KEY}
値　　：管理画面で確認したリードキー
![08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696364/76d72caf-006f-b77a-cce5-8a9894621d57.jpeg)

#### ホスト-アイテム
名前　　：Ambientからのデータ取得　※任意で構いません
タイプ　：HTTPエージェント
キー　　：Ambient.api.get　※任意で構いません
データ型：テキスト
URL 　　：https://ambidata.io/api/v2/channels/{$CHANNEL_ID}/data?&readKey={$READ_KEY}&n=1
ヘッダー：
　名前：Content-Type
　値　：application/json
監視間隔：1m
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696364/87a3a9ff-2df1-f451-75b3-2158dcc968bb.jpeg)

このアイテムはあくまでも事前のデータ取得用なので、ヒストリの保存期間はデバッグが終わったら「ヒストリを保存しない」としても良いかもしれません。

#### ホスト-アイテム-保存前処理
名前　　　：JSONPath
パラメータ：$[0]
![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696364/258c08e5-52af-5e3d-19da-a43d20fc981c.jpeg)


#### ホスト-アイテムその2-アイテム
名前　　：温度　※取得する値の種類にあわせる
タイプ　：依存アイテム
キー　　：.d1　※任意で構いません
データ型：数値(不動小数)　※取得する値の種類にあわせる
マスターアイテム：先程作成したアイテム
単位　　：℃　※取得する値の種類にあわせる
![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696364/304327af-5b82-183f-a52d-15c72652712a.jpeg)

#### ホスト-アイテムその2-保存前処理
名前　　　：JSONPath
パラメータ：$.d1　※取得したいデータにあわせる
![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696364/6f8295f7-c15d-c2c0-0002-ad6ee771bfc3.jpeg)

このように、一旦メインのアイテムですべての値を一括取得し、そこから依存アイテムで必要な値を抜き出す形を取ります。
取得したいデータ（d1～d8）数だけ同じようにアイテムを作成します。


# 最後に
これで当該ホストの最新データを確認し、データが取得できていれば成功です。
無事AmbientのデータをZabbixで取得することができました。
あとはグラフ化するなり、ダッシュボードするなり通常のZabbixアイテムのデータと同じように扱えるようになりました。

Zabbixはcurlで取ってこれるデータであれば特に個別にスクリプト等作成する必要無くアイテムを作成できるので便利ですね。
【Salesforce】インテグレーションライセンス使ってみた

Spring'23でリリースされたSalesforce Integrationライセンスを今更ながらに使ってみたので記事にします。
詳細な説明は省きますので細かな設定は @TaaaZyyy さんの以下の記事をご参照ください。

https://qiita.com/TaaaZyyy/items/7feb7d03cb1f5248d2e9

# Salesforce Integrationライセンス

Spring'23で各組織にSalesforce Integrationライセンスが付与されました。
ぴえが確認した範囲ではEnterprise Editionでは5つ、Developer Editionは1つ自動で付与されていました。
もっと必要な場合はアドオンで購入できるようです。

これまで外部システムの連携にはシステム管理者プロファイル（Salesforceライセンス）のユーザを利用していましたが
Salesforce Integrationライセンスを使うことによってセキュリティやライセンス料のメリットがあります。

参考↓
[Spring '23 リリースノート](https://help.salesforce.com/s/articleView?id=sf.integration_user.htm&type=5)
[インテグレーションユーザーへの API 限定アクセス権の付与](https://help.salesforce.com/s/articleView?id=release-notes.rn_api_integration_license.htm&release=242&type=5)

# 使い方
これまでのシス管ユーザと特段変わりはないですが、使い方を記載しておきます。

### 接続アプリケーションを用意
接続アプリケーションを用意し、「コンシューマーの鍵」「コンシューマーの秘密」を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/6d713254-73af-8df0-1a39-98d1baf2ebfc.png)

### 連携用ユーザを作成
ユーザライセンス：Salesforce Integration
プロファイル：Salesforce API Only System Integrations
の設定でユーザを作成し、初回ログインをします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/65ae6db9-3e4d-2eb6-22f0-c3d052f2cc19.png)

:::note info
ここで作成したユーザはインテグレーション用のためSalesforceのUI上では操作できません。
:::

# つまづきポイント

### ログイン検証
ここまで特に問題なく設定できたのでAPI Testerで認証を飛ばしてみたところ、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/a140daef-77c9-1aef-eb02-e911023be878.png)

400 Bad Request になりました (´；ω；`)ぴえん

連携用ユーザのログイン履歴を見ると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/a42deabf-a303-2c3f-1bd0-6e7d410c81ff.png)


「ユーザー名-パスワードフローが無効になっています」とありましたので
ググったら以下がヒットしました。

https://help.salesforce.com/s/articleView?id=release-notes.rn_security_username-password_flow_blocked_by_default.htm&release=244&type=5

Summer'23以降に作られた組織はOAuth 2.0 ユーザ名パスワードフローはデフォルトでブロックされるそうです。
リリースノート公開時に一通り読んでいるのですが、文章だけ読んでもピンと来てませんでした。。

言われた通り「OAuth および OpenID Connect 設定」で「OAuth ユーザー名パスワードフローを許可」を有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/66015a08-5519-ec1d-66f8-ed6e5103d946.png)


### 気を取り直して
もういっちょ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/de311dc3-4f7f-168f-9d51-132d03a2040c.png)
今度はうまくいきました(\*'ω'\*)

今後はインテグレーションライセンス活用していきましょう！