OmniAICreator/Qiita-1.07M huggingface dataset:
GSEC受験記

# はじめに
GSECとは、GIAC試験の1つで、正式名称は「GIAC Security Essentials」です。その名の通り、内容的にはセキュリティ入門向けの内容です。
ただし、入門向けのレベルではありますが、出題範囲は非常に広く、セキュリティ業界入門者が受験して合格するのは決して簡単ではありません。出題範囲については公式サイトに記載されていますが、セキュリティの重要な概念であるCIAに始まり、NISTやCISコントロールなどのセキュリティフレームワーク、多層防御、暗号アルゴリズム、パスワード管理、ホスト型IPS、IDS、Windows Server（主にActive Directory関連）、Linuxの基礎、Snort、インシデントハンドリングとフォレンジック、ペネトレーションテスト、ログ、AzureやAWSなどのクラウドサービス、ネットワークプロトコルなどなど、非常に広い範囲から出題されます。

https://www.giac.org/certifications/security-essentials-gsec/

GIACは基本的にトレーニングを受けるのが普通ですが、GSECについては対応するトレーニングであるSEC401を受けずにチャレンジしました。

# 勉強法
私の勉強法に入る前に、GSEC受験のためにこの記事を読んでいる方にお断りしておきますが、私はセキュリティ業界で15年ほどの経験を持っており、セキュリティ入門者ではありません。そのため、私の勉強方法は参考にならないと思います。

私の勉強法は2回の模擬試験を受験し、間違えた問題を徹底的に復習することだけです。間違えた問題については、正解以外の選択肢に含まれるワードまで調べて持ち込み用のシートに記録しておきました。
それ以外に特別なことは何もしていません。

## GIACが初めての方向けの勉強法
GIACが初めてという方は、以下を参考にしてみてください。ポイントは持ち込むための資料作りです。

https://qiita.com/log0417/items/78f1e3136f508d54784d

対応するトレーニングであるSEC401のテキストがある方は、テキストを読みながら（英語はDeeplなどを活用しましょう）インデックスを作成します。
インデックスを作成したら、模擬試験を受けましょう。間違えた問題を復習し、必要に応じてインデックスを更新しましょう。この際に知らない英単語についても記載しておくと良いです。
2回目も模擬試験を受け、同様に復習します。1回目では合格点、2回目では合格点＋10%程度取れていれば十分合格できると思います。

# 持ち込み物
GIACは印刷物であれば基本的になんでも持ち込むことができます。（模擬試験のコピーまたは類似したものは不可）
今回持ち込んだのは、これまでのGIAC試験対策で作った英語の単語表と、GSEC模擬試験を受けて作成したシート、英和辞典です。
トレーニングを受けている方は、これに加えて自作のインデックスとテキストを持ち込むと良いと思います。

# 本番試験
当日は1時間前に会場付近に到着し、カフェで炭水化物を補給してから挑みました。
問題数は106問、うち95問が選択式、11問がCyberLive（仮想マシンを操作して回答するハンズオン）、これを4時間で解答します。（公式サイトには問題数、時間ともに106-180問、4-5時間と幅をもって書かれていましたが、実際の試験では前述のとおりでした）
本番では何度か英和辞典を引いたり、持ち込んだ自作の単語集を参照したくらいで、基本的には何も見ずに解答しました。結果として約3時間で終了しました。うちCyberLiveは40分程度かかったと思います。
途中50問程度解いたタイミングで一度休憩を入れ、残りは一気に終わらせました。

# 感想
入門向けということもあり、問題は全体的に難しくはないものの、意外と解答に迷う問題も多く、2回の模擬試験、本番共に概ね80%前後の得点でした。テクニカルな部分は比較的解答できましたが、セキュリティフレームワークだったり、普段使っていない技術については得点できていませんでした。自分の弱点を改めて知ることができたという点で収穫があったと思います。

# 次の目標
GSECを受験した動機は、上位資格であるGX-CSの踏み台とするためです。
ということでGX-CSを目標とします。
リハビリアプリを作ろう（その2）

こちらの続きです

https://qiita.com/t-yamanashi/items/4b2288544613d09da4c9

1-25の数字押していくゲームを作りたいです
このコラムの範囲
- 1-25の数字をランダムに表示

# 1-25の数字のシャッフルされたリストを生成
```elixir:lib/num_web/live/user_live/index.ex
defmodule NumWeb.UserLive.Index do
  use NumWeb, :live_view

  @impl true
  def mount(_params, _session, socket) do
    num =
    1..25
    |> Enum.shuffle()
    socket = assign(socket, num: num)
    {:ok, socket}
  end

end
```

# 5づつ改行する
```elixir:lib/num_web/live/user_live/index.html.heex
<%= for {s, i} <- Enum.with_index(@num, 1) do %>
  <div class="float-left w-28 h-28 m-2 bg-blue-200 text-center ">
    <p class="pt-7 text-5xl text-blue-700 "><%= s %></p>
  </div>
  <%= if rem(i, 5) == 0 do  %>
    <br>
  <% end %>
<% end %>
```

# 現時点結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/bfe6f275-1e6a-92b5-5551-ace8f312f61c.png)

今回はここまで
オフショア開発チームとオフラインで「熱気球」のふりかえりを実践した。

こんにちは。KDDIアジャイル開発センターのtakateinです。アドカレ7日目ですね！

先日、オフショア開発先のベトナムにある企業さんへ訪問する機会を頂いたので、チームビルディングをしてきました。

スクラムマスターとして「熱気球」の振り返りを実践したのでこの記事に書いていこうと思います。

# "オフショア" とは？
そもそもオフショアって何？ってなる方もいると思うので説明しておきます。

オフショア ＝ off shore = 離れた 岸 
ってことで、"**海外のシステム開発ができる企業**"をパートナーとして、開発を委託することを指します。
日本のIT業界は人材不足と言われてますし、委託されている企業さんは日本でも多い印象です。

図にすると以下のような感じです。
![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553613/d0e80c13-005f-6023-2f93-ec95d8be2920.png)

母国語は通じないのですが、プログラミング言語を通じてやりとりが出来るのが凄いですね。

# 今回の目標

プロジェクト業務を除き、ベトナムに訪問してやったことは以下

- 自己紹介(アイコン、名前、顔を一致させる。)
- アイスブレイク(なぜエンジニアになったのか。)
- 熱気球(ふりかえり)

普段、業務をしてて「言語違う」「顔が見えない」「声が低くて少し怖い」などがあると少し心理的にも遠のいてしまうことがある。
そのため、現地でしっかり喋り顔を覚えて、"**困りごとをメンバーから聞き出す**" ことが今回の訪問の目標でした。

# 熱気球(ふりかえり)

とりあえず、見た目はこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553613/ede65731-1aed-575a-9938-804115fa7668.png)

採用した理由は2つあって、、、
1. **「良い意見」「悪い意見」の両方に追加の付箋を貼れること**
→たくさん意見を出して欲しいから。

2. **熱気球に乗ってベトナムから日本に帰りたいから。**
→それっぽい理由でなんか面白いから。


### この手法について
熱気球をもっと高く飛ばすには、どうすればいいかを考えていく手法
良かった点、悪かった点ともに改善点があれば出し合う。

### 手順
1. チームが乗った気球をイメージし、気球が推進・上昇する事実を赤色の付箋に記載し、気球の絵に貼っていきます（推進・上昇する)
2. チームが乗った気球の飛行の妨げになった事実を青色の付箋に記載し、貼っていきます。 （妨げになった）
3. それぞれの付箋に対して、「さらに気球を推進・上昇させるアイデア」「飛行の妨害を軽減するアイデア」を黄色の付箋に記載し貼っていきます。
4. チームで出し合った事実とアイデアの中から、重要だと考えるものをそれぞれ選択し、アイデアを元に改善アクションを行う。

### 実施結果

振り返りの範囲「3日間のワーク＋普段の業務全般」

#### Goodな意見

🟥 Goodな意見：23件　🟨 改善・追加意見：15件

🟥「いつも急な依頼を助けてくれてThank you!!!」
🟨「もっと仲良くなって、心理的安全性を高めよう。」

🟥「日本メンバーのみんなとプライベートでも遊びたいよ」
🟨「オンラインゲームをしてチームビルディングしてみたい！」

🟥「日本のみんなとアニメや漫画や音楽の話をできたのが嬉しい！」
🟨「アニメや漫画に関しては本当にそう！ただ、言語の壁がなかったらもっと話せた気がする・・・」

🟥「BridgeSEには本当に感謝している。ビジネスや技術のことも知っていてすごい。」
🟨「もっと僕らでも相談しあいタスクを円滑に進めましょう！」

🟥「新技術の実装は楽しい！日本の企業は古い技術を使いがちな傾向なのって本当ですか？」
🟨「そうですね。。。でも、KDDIは新しい技術を取り入れるように頑張ってます。」

---- 
#### Badな意見

🟦 Badな意見：10件 🟨 改善・追加意見：8件

🟦「BridgeSEの方が負担になっていないか心配」
🟨「本当にそうです。みんなで負担を分かち合いましょう。」

🟦「今、対応している実装が仕様通りに対応すると難しい。もっと技術側を優先してどうにかならないのか？」
🟨「それは日本チームも同感です。調整したいので、困ったときは気軽に相談してください。」

🟦「英語を理解しているが、喋るのは難しい・・・」
🟨「わかる。難しい・・・」

🟦「バックエンドの開発をやっているがフロント側の開発をやって、新しい言語を学んでみたい。」
🟨「勉強会とかも開いてみたいです！プロジェクトでも担当を割り当てられると嬉しいのですが・・・」

### 感想

ふりかえりをやるときは、やっぱり顔を見ながら話せると良いですね。
特に熱気球のような内容は追加で付箋をどんどん貼るものなので、”現地”の雰囲気が大事です。

事前のワークでしっかり喋れたので、内容もたくさん引き出すことができました。
ここには記載できないような本当に大事な困りごとも聞けたのでよかったです。

事前の自己紹介ワークでアニメについてかなり盛り上がったので、本当に日本のアニメ文化はすごいと思いました・・・
「象死んだ魚嘔吐」の振り返りをワークでやるか悩んでいたのですが、今回はやりませんでした。
次回はやってみたいです。

## その他

出張のvlog📹が以下のリンクから観れます！作曲＋撮影＋編集全部やったので楽しかったです。
今回の旅のイメージ掴みやすそうなので是非見てください！

https://youtu.be/llAlWdKAEKs
【Swift】ジェネリクスでよく使記号＆意味一覧

# 目次
[1.ジェネリクスで使用する大文字アルファベット](#1-ジェネリクスで使用する大文字アルファベット)
[2.実例](#2-実例)
[3.参考サイト](#3-参考サイト)

# 1. ジェネリクスで使用する大文字アルファベット
関数シグネチャを確認すると時々？？となるジェネリクスでよく使う記号ありますよね？(EとかTとか、、)
あれなんなんでしょうね？
そんな時に便利な表を書いておきます。

※シグネチャ...メソッド名、パラメータの型、数、順序、戻り値の型等で構成された、メソッドを識別するための情報

# 2. 実例
|  |略  |意味  |使用シーン  |
|---|---|---|---|
|T  |Type  |タイプ  |汎用的に利用。とりあえず迷ったらこれ  |
|E  |Element  |要素  |配列の要素などに使われる  |
|K  |Key  |キー  |連想配列やマップのキー等  |
|V  |Value  |値  |配列の値や結果  |
|N  |Number  |数値  |数値を表す（個数や最大値等）  |
|A  |Array  |配列  |JavaではA[]という形式で使われる  |
|Args  |Arguments  |可変引数  |C++で使われることが多い  |
|F, Fn, Func  |Function  |関数  |コールバック関数、クロージャー、ラムダ等  |

# 3. 参考サイト
https://marycore.jp/coding/generics-types/
【Flutter x Supabase】ログイン(magic link)＋おまけつき

![スクリーンショット 2023-12-04 16.09.15（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/3104de81-b334-602d-ce1b-6a48a1790923.png)


:::note info
この記事は、<b>株式会社ゆめみの23卒 Advent Calendar 2023</b>のアドベントカレンダーになります！！
色々な種類の記事が投稿されるので、お楽しみに🤗
:::

https://qiita.com/advent-calendar/2023/yumemi-23-graduation

こんにちは。いせりゅーです。今回は、Flutter x Supabaseでログイン（magiclinkの実装）をするやり方に加えて、必要そうな記載を書いてみました。(あくまでも一例です)

:::note warn
Supabaseを学習し始めてからまもないため、間違えた実装を記載するかも知れません。その場合はコメントなどで教えていただけると幸いです🙇
:::


１、記載の漏れがないかを確認する
２、magic linkでログインを試みる

こんな感じで進めていきます〜〜！！

# 記載の漏れがないかを確認する

こちらについては、さまざまな確認方法があると思いますが、今回はメールアドレスが記載できているかどうかの確認をしています。メールアドレスについては別の確認作業が必要そうですが、今後記載をしてみようと思います
お好みの方法で、警告文を出してください。

```dart
final emailTextController = TextEditingController();

void post() {
  if (emailTextController.text.isNotEmpty) {
    // ログインの処理を記載する
  } else {
  print('メールアドレスが入力されていません！');
}
```


# magic linkでログインを試みる

今回はmagic linkの流れは割愛させていただきます🙇。
くわしくはこの後でリンクを載せておきます。こちらの方がわかりやすいと思います！

https://pregum-fox.hatenablog.jp/entry/2023/10/29/235736

https://www.youtube.com/watch?v=X3ZvBsHlYJY


では実装のみを記載していきます。

```dart
 final _shouldCreateUser = true;

 Future<void> login() async {
  try {
    // キーボードを閉じる
    primaryFocus?.unfocus();
    await supabase.auth.signInWithOtp(
      email: emailTextField.text.trim(),
      shouldCreateUser: _shouldCreateUser,
      emailRedirectTo: 'io.supabase.flutterquickstart://login-callback/',
    );
    print('メールを確認してみてください');
  } on AuthException catch (error) {
    print(error.message);
  } 
}

```


# ソースコード

```dart
Future<void> login() async {
  if (emailTextController.text.isNotEmpty) {
    try {
      // キーボードを閉じる
      primaryFocus?.unfocus();
      await supabase.auth.signInWithOtp(
        email: emailTextField.text.trim(),
        shouldCreateUser: _shouldCreateUser,
        emailRedirectTo: 'io.supabase.flutterquickstart://login-callback/',
      );
      print('メールを確認してみてください');
    } on AuthException catch (error) {
      print(error.message);
    }
  } else {
    print('メールアドレスが入力されていません！');
  }
}
```


# 最後に

自分もまだまだ学習中ですが、Supabaseのいいところが毎日見つかってきてとてもいいですね。個人的にはこれからの発展に期待したいですね😁


# ちょっとした宣伝

株式会社ゆめみの23卒のメンバーでアドベントカレンダーを作成しています。
新卒のフレッシュな記事がたくさん投稿予定なので、少しでも興味があれば購読いただけると幸いです！！


https://qiita.com/advent-calendar/2023/yumemi-23-graduation



<img width="1240" height="112" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/6d8a7098-9aef-a19a-54fe-83a2d493e033.png" alt="YUMEMI New Grad Advent Calendar 2023">
秒でわかるWebAPI

# #1 はじめに
メリークリスマス！！←早くない？？
いかがお過ごしでしょうか！！
僕はめちゃくちゃ元気ですよーー！！←風邪引いてます
:santa:｛今日はみんなにささやかなプレゼントを贈るよ！！）
今日はWebAPIについてまとめてみました。
# #2 WebAPIについて
今回はWebAPIをHTTP/HTTPSリクエストで情報を取得したり、
動作をさせたりすることのできるAPIのことを指します。
例えばWebAPIによって天気やニュースを取得したり、LINEメッセージを送ったりできます。
# #3 こんなWebAPIがあるよ
### Open Weather Map
https://openweathermap.org/

天気を取得できます。
### News API
https://newsapi.org/

ニュースを取得できます。
### X API
https://help.twitter.com/ja/rules-and-policies/x-api

X（旧Twitter）をコントロールできます。
### CoinCheck 取引所API
https://coincheck.com/ja/documents/exchange/api

仮想通貨の価格を取得したり仮想通貨を売買したりできます。
### Mastodon API
https://docs.joinmastodon.org/api/

Mastodonをコントロールできます。
### Misskey API
https://misskey-hub.net/docs/api/

Misskeyをコントロールできます。
### LINE Messaging API
https://developers.line.biz/ja/docs/messaging-api/overview/

LINEでメッセージを送ったりすることができます。

# #4 さいごに
今回はWebAPIについてまとめてみました。
この記事が皆さんの助けになれば幸いです。
PowerAutomateのフロー上でプリザンターにファイルを添付する方法

## はじめに
初めての投稿になります。稚拙な文章ですがどうかご容赦ください。
今回はPowerAutomateを使ったフローの中でプリザンターに添付ファイルを添付する方法について書いていきたいと思います。

## 概要
PowerAutomateにはプリザンター用のカスタムコネクタが用意されています。
カスタムコネクタとは何ですか？という方は[こちら](https://qiita.com/teppei12345/items/ff0532bcd1a37d654919)の記事をご参照ください。
以下は使用できるカスタムコネクタ一覧です。
- Items Create(指定したテーブルに新規レコードを作成します。)
- Items Delete(指定したレコードを削除します。)
- Items Get(指定した単一のレコードまたは、指定したテーブルの複数レコードを取得します。)
- Items Update(指定したレコードの内容を更新します。)

### 「Items Update」アクション
Power Automateのフローでは、プリザンターで用意されているレコード更新APIを利用できます。
レコード更新APIの仕様は下記ユーザマニュアルを参照してください。
[開発者向け機能：API：テーブル操作：レコード更新](https://pleasanter.org/manual/api-record-update)
[開発者向け機能：JSONデータレイアウト：Item](https://pleasanter.org/manual/api-item)

フロー全体の流れとしてはこのようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551590/c2a58845-cd67-79f5-1539-d93908957e18.png)


## 手順
1. 必要な変数を一通り初期化します。
    今回はレコードにファイルを添付したいだけなので必要な要素は下記3点です。
    それぞれstring型です。
    - contenttype
    - ファイル名
    - Base64
    
    また、この後のフローで使用する為Array型の変数を1つ用意します。
    今回はTESTfileとします。

    contenttypeの指定に関しては下記の例から添付するファイルにあったものを使用してください。
    今回はプレーンテキストなのでtext/plainを使用します。
    - text/plain テキストファイル
    - text/csv CSVファイル
    - text/html HTMLファイル
    - text/css CSSファイル
    - image/jpeg JPEGファイル(.jpg, .jpeg)
    - image/png PNGファイル
    - application/json JSONファイル
    - application/pdf PDFファイル

    　
1. 添付したいファイルの中身をBase64に変換し、1.で作成したBase64の変数に格納します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551590/8ce5f5a3-1d1e-1ea1-6c83-e94bdfc28de6.png)

    

    　
1. プリザンターの添付ファイルの仕様に合わせて1.で作成したTESTfileに変数を格納していきます。
    
    ```
    {
      "AttachmentsA": [
        {
          "contenttype": @{variables('contenttype')},
          "name": @{variables('name')},
          "base64": @{variables('base64')}
        }
      ]
    }
    ```
    
   ::: note info
   PowerAutomateでは@以降は動的な要素として選択することが可能です。
   :::

     　
1. 3.で作成したTESTfileを使用しJSONの作成を実施し、一度フローの実行を行います。
　
1. JSONの解析アクションを挿入し、4.で出力されたJSONを解析を行います。
    これにより解析された要素が指定できるようになります。
　
1. プリザンターのItems Updateカスタムコネクタを挿入します。
    指定する条件は下記
    RecordId : 添付したいレコードのIDを指定します。
    RequestBody/ApiVersion : 1.1
    RequestBody/AttachmentsHash : 下記参照
    ```
    {
      "AttachmentsA": [
        {
          "contenttype": @{items('Apply_to_each_2')['ContentType']},
          "name": @{items('Apply_to_each_2')['Name']},
          "base64": @{items('Apply_to_each_2')['Base64']}
        }
      ]
    }
    ```
    @以降は5.で解析したJSONにより追加されている動的な要素を選択します。


以上でフローの実装は完了です。
では実際にフローを動かしてみましょう。

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551590/7ee77f18-195b-0dc2-bea9-b6cd7c67504c.png)

ちゃんとファイルが添付されています。
中身はどうでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551590/a0a31e9f-2c11-2e75-ad14-a9dbb0a1d516.png)

中身も問題なさそうです。

## さいごに
今回はただファイルを添付するだけでしたが、プリザンターのカスタムコネクタにはレコードから取得する機能もあるので、
例えば
1. 毎月自動実行されるフローを設定する
1. 添付ファイルがあるレコードから添付ファイルを持ってくる
1. 持ってきたファイルの中身を書き換え
1. 再度アップロードする
なんてことができれば月次報告書類の日付や値を手で書き換える手間から解放されるかもしれません。

JSONの解析をしないとうまく機能しないということで、それに気づくまで苦戦しましたが、
フロー自体もシンプルなので実装にはそこまで時間はかからないと思います。
ぜひやってみてください。
Raspberry Piでネットワーク帯域制御「tcconfig」のインストール方法

Pythonのpip ver 23.0からPEP668対応で従来のインストール方法では不具合がある様子です。
当方で動作した方法を紹介します。

# 動作環境
Raspberry Pi 4 (4GBモデル)

Raspberry Pi OS with desktop 64bit (2023-10-10)

pi@raspberrypi:~ $ python -V
Python 3.11.2

pi@raspberrypi:~ $ pip -V
pip 23.0.1 from /usr/lib/python3/dist-packages/pip (python 3.11)

# tcconfigインストール方法

- https://github.com/thombashi/tcconfig

```
$ sudo apt install pipx
$ pipx install tcconfig
  installed package tcconfig 0.28.0, installed using Python 3.11.2
  These apps are now globally available
    - tcdel
    - tcset
    - tcshow
??  Note: '/home/pi/.local/bin' is not on your PATH environment variable. These apps will not be globally accessible until
    your PATH is updated. Run `pipx ensurepath` to automatically add it, or manually modify your PATH in your shell's config file
    (i.e. ~/.bashrc).
done! ? ?? ?
```

ユーザーローカル環境にインストールされます。

```
pi@raspberrypi:~ $ ls .local/bin -l
total 0
lrwxrwxrwx 1 pi pi 49 Dec  4 05:35 tcdel -> /home/pi/.local/pipx/venvs/tcconfig/bin/tcdel
lrwxrwxrwx 1 pi pi 49 Dec  4 05:35 tcset -> /home/pi/.local/pipx/venvs/tcconfig/bin/tcset
lrwxrwxrwx 1 pi pi 50 Dec  4 05:35 tcshow -> /home/pi/.local/pipx/venvs/tcconfig/bin/tcshow
```

# コマンド実行例

設定変更する際にはsudoコマンドで管理者root権限が必要です。

## tcshow(設定確認)

```
pi@raspberrypi:~ $ .local/bin/tcshow eth0
{
    "eth0": {
        "outgoing": {},
        "incoming": {}
    }
}
```

## tcset(設定変更)

```
pi@raspberrypi:~ $ sudo .local/bin/tcset --device eth0 --delay 10
```

```
pi@raspberrypi:~ $ .local/bin/tcshow eth0
{
    "eth0": {
        "outgoing": {
            "protocol=ip": {
                "filter_id": "800::800",
                "delay": "10ms",
                "rate": "1Gbps"
            }
        },
        "incoming": {}
    }
}
```

---

## tcdel(設定削除)

```
pi@raspberrypi:~ $ sudo .local/bin/tcdel eth0 -a
[INFO] delete eth0 qdisc
[INFO] no qdisc to delete for the incoming device.
[INFO] delete eth0 ingress qdisc
```

```
pi@raspberrypi:~ $ .local/bin/tcshow eth0
{
    "eth0": {
        "outgoing": {},
        "incoming": {}
    }
}
```

---
### 参考情報

- [Raspberry Pi OSでもbookwormでpipインストールエラー「externally-managed-environment」](https://raspida.com/pip-error-pep668)
- [俺流！PEP668とうまくやっていく方法](https://blog.jp.square-enix.com/iteng-blog/posts/00043-play-with-the-pep668/)
【UEFN】Verseでcreative_deviceクラスの多用をやめてみる

## 背景
Verse書き始めた時に毎回`creative_device`クラスを宣言してワールド常にいつものモニターが大量に存在してしまう状況があった。そこでふと思い出したのがUnityを使っている時に`Monobehavior`を継承したクラスを作りすぎず必要なければピュアC#を使っていこうというお話だった。
```
creative_device　≒ Monobehavior
```
今回は設計について話すことはなく単純に純粋なクラスを使ってみるという記事になっています。

## まず純粋なVerceクラスとは
いつものVerceコード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

hello_world_device := class(creative_device):

    var count : int = 0

    OnBegin<override>()<suspends>:void=
        loop:
            Sleep(1.0)
            set count += 1
            Print("Hello World! Count: {count}")
```
このようにクラスの宣言時に`(creative_device)`と宣言していますよね。このようにすることでワールド上に配置しなければならなくなります。

ピュアVerceコード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

hello_world2_device := class:

    var count : int = 0

    OnInitial<public>()<suspends>:void=
        loop:
            Sleep(1.0)
            set count += 1
            Print("Hello World2! Count: {count}")
```
このように宣言することでデバイスを配置することなくクラスを作れます。

:::note warn
ピュアVerceコードはこれだけでは動きません。
:::

## 純粋なVerceクラスの懸念点
-　エントリーポイントがない
-　`@editable`がないためクラス内で直接別のVerceデバイスをいじれない

## 懸念点の解決方法
### エントリーポイントがない件
`OnBegin`メソッドのようにゲーム開始時に呼ばれるデバイスがないため別の`creative_device`でインスタンスを立ててそこで呼ぶことで解決できる。
以下がサンプルコード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


call_hello_world2_device := class(creative_device):

    hello_world2:hello_world2_device = hello_world2_device {}

    OnBegin<override>()<suspends>:void=
        hello_world2.OnInitial()
```
### `@editable`がないためクラス内で直接別のVerceデバイスをいじれない件
コンストラクタや通常のメソッドを立てて依存性の注入を行うことで解決ができます。
以下がサンプルコード

ピュアVerceコード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

hello_world2_device := class:

    OnInitial<public>(Trigger : trigger_device)<suspends>:void=
        Trigger.TriggeredEvent.Subscribe(CallTrigger)

    CallTrigger(QAgent : ?agent):void=
        Print("Triggered!")
```

ピュアVerceコードに依存性を注入するクラス
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


call_hello_world2_device := class(creative_device):

    @editable
    Trigger:trigger_device = trigger_device {}

    hello_world2:hello_world2_device = hello_world2_device {}

    OnBegin<override>()<suspends>:void=
        hello_world2.OnInitial(Trigger)
```
## 純粋なVerseクラスを利用することによるメリット
- パフォーマンスが上がる可能性がある？
- Verceのクラスを綺麗に分けることができ視認性が上がる
- 効率の良いコードが書ける
- より柔軟なコードが書ける

### あとがき注意点
以下のように`count`変数で何も初期値を指定しなかったらクラス宣言時にその値を指定して宣言する必要があります。
```
hello_world2_device := class:

    var count : int
```
呼び出し側はこのようにする
```
call_hello_world2_device := class(creative_device):

    # 初期化時に指定する変数名に値を代入する
    hello_world2:hello_world2_device = hello_world2_device { count := 0 }
```

## まとめ
Verceは最近できたプログラミング言語になるので誰かがこのような設計で書くべきだという提言が少ないのでその辺りをふかぼって自分なりの正解を探していきたいと思う。

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/cK4daQyD
Microsoft Copilot Studioを日本リージョンで使うための設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/95708ede-a01c-9221-a5ef-f6dc3ee3befc.png)

本記事は [OpenAI活用法 Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/openai-knowledgecommunication) の3日目の記事です。

OpenAI活用法 Advent Calendar 2023 by ナレコム ではGPTsを含めた最新のOpenAIの活用法について紹介します。

### はじめに

「Microsoft Copilot Studio」は、Microsoftによって開発された先進的なソフトウェア開発アシスタントです。このツールは、プログラマーや開発者がより効率的にコードを書くのを支援するために設計されています。

主な特徴は以下の通りです：

1. **コード生成と補完**：Microsoft Copilot Studioは、ユーザーが開始したコードに基づいて、関連するコードスニペットや機能を自動的に生成し提案します。これにより、開発者は時間を節約し、より複雑なタスクに集中できます。

2. **自然言語処理**：このツールは自然言語のクエリを理解し、それに応じたコードを生成する能力を持っています。例えば、「ユーザーのログイン機能を作成する」といった要望に対して適切なコードを提供します。

3. **学習と適応**：Microsoft Copilot Studioは、利用するほどにユーザーのコーディングスタイルや要件を学習し、よりパーソナライズされたサポートを提供します。

4. **エラー検出と修正の支援**：コード中のエラーやバグを特定し、修正案を提供する機能を備えています。

5. **広範な言語サポート**：多くのプログラミング言語に対応しており、多様な開発環境で利用可能です。

Microsoft Copilot Studioは、開発者がより迅速かつ効果的に作業を進めるための強力なツールとして機能し、プログラミングの質と速度を大幅に向上させることが期待されています。


### 日本にも展開開始

https://forest.watch.impress.co.jp/docs/news/1550378.html

このニュースにあるように2023年11月27日より日本でも利用できるようになりました。
ただし標準の状態では「 **この環境では生成AIを利用する機能を利用できません。** 管理者にお問い合わせください。」となり、日本リージョンで利用することができません。


### 日本リージョンで Microsoft Copilot Studio を使うためには

Power Platform 管理者が [管理センター](https://admin.powerplatform.microsoft.com/) から利用している環境に対する設定を変更する必要があります。

1. [管理センター](https://admin.powerplatform.microsoft.com/) にアクセス
1. 「**環境**」から設定変更したい環境を選択（環境名をクリック）する
1. 環境詳細画面に行くと画面右下に「**生成AI機能**」を確認します。標準では「リージョン間でデータを移動する」の許可されておりません。
1. 「**生成AI機能**」の「編集」をクリックし、以下のようにチェックして保存する。（※Bingについては必須ではありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/752d5d41-f57f-73c1-df39-d98349c9152a.png)

この設定が完了すると数分で日本リージョンを選んでCopilot Studioを利用することができます。

### まとめ

Microsoft Copilot Studioが日本でも利用できるようになりましたが、生成AIは国内で動作していないために本設定が必要と思われます。様々な企業が新しい機能を利用することで、より多くの業務にCopilotが入ってくることになってくると思います。

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
要素数の出力 Python3編

https://paiza.jp/works/mondai/array_primer/array_primer__2dmatrix_output_step1

二次元配列の要素数を出力せよという問題。
二次元配列はちょっとPHPでも苦手にしている部分なので、これを機会にしっかり覚えたいところ。

今まで勉強してきたところからこういうふうにしたが
```py
x = "1 2 3 4 5 6".split()
y = "8 1 3 3 1 8".split()
x.append(y)
print(sum(len(v) for v in x))

```
このときのxをみてみるとこうなるので多分間違えてる気がする。
```
['1', '2', '3', '4', '5', '6', ['8', '1', '3', '3', '1', '8']]
```


答えを見てみると

```py
li = [[1, 2, 3, 4, 5, 6], [8, 1, 3, 1, 3, 8]]
print(len(li) * len(li[0]))

```
え、そういうふうな書きかたでよいのか。

 >(配列の行数) * (配列の列数)

 配列の行数・・・`len(li)`
 配列の列数・・・`len(li[0])`

もう一つ。

 https://paiza.jp/works/mondai/array_primer/array_primer__2dmatrix_output_step2

 ```py
li = [[6,5,4,3,2,1],[3,1,8,8,1,3]]
for i in range(len(li)):
    for j in range(len(li[0])+1):
        if j < len(li[0])-1:
            print(li[i][j],end=" ")
        elif j == len(li[0])-1:
            print(li[i][j])

 ```
PDFの内容をCSVにする

## PDFってなんだよ、いらんだろ
たまにExcelの内容をそのままPDFにしただけみたいなファイルがある。
PDFもExcelも俺嫌いなんだよ。

## それってどんなPDF？
「月間売上 pdf」で検索すると一番上に出てくるこう言うやつ。PDFファイルだけどこんなんただのExcelやん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175961/c79fc3ba-0d3e-0f9b-23aa-8f6bf1ec0bd9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175961/3a1053ee-1062-1e1a-04ca-899d6ece3bd4.png)

## 実態Excelのくせしてテキストが表形式で取れない
テキストデータが取れない。マウスでドラッグするのもめんどくさいのにそのテキストもまともに取れない。PDFってなんなんマジ。

## pythonでPDFのデータを抜き取る
本題です。ムカついたからpdfplumberと言うライブラリを使ってpythonでCSV化します

```python:pdf is dead

import pdfplumber

pdf_url = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx.pdf"

# PDFファイルを保存
r = requests.get(pdf_url, allow_redirects=True)
open('local.pdf', 'wb').write(r.content)

# PDFファイルを開く
with pdfplumber.open('p.pdf') as pdf:
    # ページごとにループ処理
    for page in pdf.pages:
        # これでテキスト取れる
        text = page.extract_text()
        print(text)

        # これでCSVでデータ取れる
        tables = page.extract_tables()
        for table in tables:
            for row in table:
                print(row)

#### local.pdf 消したい人はここでファイル削除なりして
                    
```
こんな感じで出てくる（ネット上のファイルでやってるから一応ぼかしとく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175961/fbd22a62-45f7-4f1b-a59e-dac5fd3e72c6.png)

# PDFとかデファクトスタンダードツラしてるのが嫌すぎる。
### PDFとかデファクトスタンダードツラしてるのが嫌すぎる。
#### PDFとかデファクトスタンダードツラしてるのが嫌すぎる。
##### PDFとかデファクトスタンダードツラしてるのが嫌すぎる。
###### PDFとかデファクトスタンダードツラしてるのが嫌すぎる。

PDFとかデファクトスタンダードツラしてるのが嫌すぎる。jsonでくれ。
１つのWAFからWebアプリごとにグローバルIPアドレスを制限する方法

# はじめに
AzureのFrontDoorもしくはApplicationGatewayを利用して、複数のアプリを振り分けるケースがあると思います。
その際にアプリごとに接続可能なグローバルIPアドレスを制限するWAFの設定方法を説明していきます。

# Azure WAFとは？
Azure WAF（Web Application Firewall）
SQL インジェクションなどの一般的な Web ハッキング手法や、クロスサイト スクリプティングなどのセキュリティ脆弱性から Web アプリを保護するクラウドネイティブ サービスです。

https://learn.microsoft.com/ja-jp/azure/web-application-firewall/overview

# 構成例
今回は例としてFrontDoorのリソースからAアプリとBアプリをそれぞれ異なるグローバルIPアドレスで制限する方法を紹介します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321769/09858397-5d43-100f-e731-681d35daa24b.png)
	
# 事前準備

## WAFのリソース作成
事前にWAFリソースを作成しておく必要があります。

■Application GatewayでWAFを作成する場合

https://learn.microsoft.com/ja-jp/azure/web-application-firewall/ag/create-waf-policy-ag

■Front DoorでWAFを作成する場合

https://learn.microsoft.com/ja-jp/azure/web-application-firewall/afds/waf-front-door-create-portal

## ドメイン名の確認

FrontDoorからAアプリとBアプリのそれぞれのWebアプリを呼んでいるドメイン名を確認しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321769/b62b148e-ef98-28e6-f3bf-845b1e2db357.png)

	
# 設定方法の流れ


## カスタムルールの作成		
左メニューの「カスタムルール」を選択し、「カスタムルールの追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321769/b4563e28-a4c3-3e3e-999b-01d5a0084e74.png)

## カスタムルールの設定（Aアプリ側）
カスタムルールを以下の通り設定します。
### 1つ目の条件
- 一致の種類：IPアドレス
- 一致変数：SocketAddr
- 演算：次の値を含まない
- IPアドレスまたは範囲：Webアプリ「Aアプリ」に接続させたいグローバルIPアドレス
### 2つ目の条件
- 一致の種類：文字列
- 一致変数：RequestUri
- 演算：次の値に一致する
- 演算子：次の値を含む
- 一致する値：Webアプリ「Aアプリ」に紐づくFrontDoorのドメイン名

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321769/4997afe7-451d-cf00-1487-5879e7ea99bf.png)


## カスタムルールの設定（Bアプリ側）
カスタムルールを以下の通り設定します。
### 1つ目の条件
- 一致の種類：IPアドレス
- 一致変数：SocketAddr
- 演算：次の値を含まない
- IPアドレスまたは範囲：Webアプリ「Bアプリ」に接続させたいグローバルIPアドレス
### 2つ目の条件
- 一致の種類：文字列
- 一致変数：RequestUri
- 演算：次の値に一致する
- 演算子：次の値を含む
- 一致する値：Webアプリ「Bアプリ」に紐づくFrontDoorのドメイン名

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321769/7be147bf-894b-b43c-e485-d7dbe3f6bdf4.png)

# おわりに
WAFを初めて作成した際は「検知モード」になっていて先程設定したカスタムルールでブロックされない状態になっているので、「防止モード」に変更することは忘れないようにしましょう。

構成例を元に設定方法をご紹介しましたが、この情報がどなたかの参考になれば嬉しいです。
なにかあれば随時、情報を追記したり修正したりしようと思います。
秒でわかるProtoPedia

# #1 はじめに
メリークリスマス！！←早くない？？
いかがお過ごしでしょうか！！
僕はめちゃくちゃ元気ですよーー！！←風邪引いてます
:santa:｛今日はみんなにささやかなプレゼントを贈るよ！！）
今回はProtoPediaについてまとめてみました。
# #2 ProtoPediaとは
ProtoPedia（https://protopedia.net/）
とはIT系の作品を気軽に投稿できるWebサービスです。
作品にはソフト・アプリやハードウェアなどが含まれます。
開発中の作品やアイデアも投稿することができます。
時々コンテストやハッカソンなども行われています。
### どうやって使うのか
主な使い方には、
* みんなの作品を見る
* 自分の作品をみんなに見てもらう
* コンテストやハッカソンに応募する

などがあります。
その他にも、自分の作った作品をストックすることができるので、
IT系のものづくりをしているクリエイターさんにはとても便利です。
同時にモチベーションもアップします。自己紹介にも役立つ場合があります。
ProtoPediaの作品にはいいねをつけられるので、
みんなの作品を評価したり、自分の作品を評価してもらったりすることもできます。
# #3 今年開催されたコンテスト
* Mouser Make Awards（https://www.mouser.jp/mousermakeawards-japan/）
* M5Stack Japan Creativity Contest
（https://www.switch-science.com/pages/m5stack-creativity-contest-2023）
* エンジニアフレンドリーシティ福岡（https://efc.fukuoka.jp/）
* ヒーローズ・リーグ（https://heroes-league.net/）

この中のコンテストは締め切りましたが、すべて毎年開催していますので、
一度も参加していない人は来年のコンテストに是非参加してみてください。
# #4 さいごに
今回はProtoPediaについてまとめてみました。
この記事が皆さんの助けになれば幸いです。
Pleasanter Tips: OnSelectingWhereで複雑な検索条件を設定する。

# はじめに
Pleasanterではアクセス権の設定がいろいろな方法で出来ます。また、サーバスクリプトでも検索フィルルターを設定できます。  
但し、更に複雑な条件が必要な場合には拡張SQLのOnSelectingWhereでWhere部を設定できるという機能があり、今回はこの機能を紹介してみます。  

# 参考にするPleasanterの情報
拡張SQL
https://pleasanter.org/manual/extended-sql
FAQ：一覧表示するレコードを所属組織別に分けたい
https://pleasanter.org/manual/faq-extended-sql-selecting-where

# 要件
下記の条件は検索対象になります。
1. 自分が作成したデータ（作成者）の場合
0. 担当者の場合
0. 管理者の場合
0. 作成者と同じ組織に所属していて、ステータスが100と200の場合
0. 閲覧可能部署（ClassD）に所属していて、ステータスが100と200の場合
閲覧可能部署（ClassD）には[[Deps]]で複数選択を可能にしています。

# 拡張SQL設定
SiteIdListに関しては環境に合わせて修正してください。    
サンプルSQLはSQL-SERVER用になります。
## OnSelectingWhereTest.json
```
{
  "Name": "OnSelectingWhereTest_MSSQL",
  "Description": "OnSelectingWhereテスト",
  "SiteIdList": [999999],
  "OnSelectingWhere": true
}
```
## OnSelectingWhereTest.json.sql
```
(
  (
    --作成者
    [Results].[Creator]=@_U
  )
  OR (
    --テナント管理者
    (SELECT [TenantManager] FROM [Users] WHERE [UserId]=@_U)=1
  ) 
  OR (
    --担当者
    [Results].[Owner]=@_U 
  )
  OR (
    --管理者
    [Results].[Manager]=@_U
  )
  OR (
    --所属部署
    (SELECT [DeptId] FROM [Users] WHERE [UserId]=[Results].[Owner])=@_D AND [Results].[Status] IN (100,200)
  )
  OR (
    --閲覧可能部署
    @_D IN (SELECT VALUE FROM OPENJSON([Results].[ClassD])) AND [Results].[Status] IN (100,200)
  )
)
```

# ポイント
閲覧可能部署を複数選択にした場合、ClassにはJSON形式で格納されます。従って、JSONをリスト化したデータで検索する必要が有ります。
複数選択にしない場合
```
CAST(ISNULL([Results].[ClassD],-1) AS INT)=@_D AND [Results].[Status] IN (100,200)
```
のようになります。  
複数選択しない場合、ClassDには単一の組織IDが格納されますが、未選択の場合は空白またはNULLが角のされます。@_D(INT)を直接比較するとエラーになるので、ISNULLとCASTで変換しエラー回避します。

# 最後に
はじめに書いたとおりに、Pleasanterの設定画面で設定できる方が便利な点が多いです。しかし、ローコード開発においては様々な制限事項も多く、仕様に合わない事も有ります。  
Pleasanterではユーザーが設定できる範囲が広く様々な要件に対応できると思います。

# 注意点
記録テーブルの場合[Results]になりますが、期限付き記録テーブル場合は[Issues]になります。
また、[Results]を指定しなくても動作しますが、使用するフィールドによってはエラーが発生します。  
エラーを確認したフィールド[Creator]
検出技術の習得: ACFE 試験問題の包括的なガイド

Certified Fraud Examiner (CFE) は、誠実さと専門知識をテストする試験です。 金融の分野では、CFE 証明書は不正行為の防止、調査、取引明細の確認において無限の機会の扉を開きます。

準備：
CFE を取得することは、思っているほど簡単ではありません。 それには少なくとも 2 年間の懸命な努力、徹底的な理論的および実践的な知識が必要です。 ここでは、練習して理解を確認するためのリソースをいくつか紹介します。

![100% valid.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634530/6b2fd0cd-1bb0-d3d4-6335-aac7383b3884.jpeg)
<a href=https://www.buddy4exam.com/acfe-exams/quiz>CFE 試験の問題</a>:
から無料の CFE <a href=https://www.buddy4exam.com>Buddy4exam </a> 試験問題を PDF 形式でダウンロードできます。 すべての問題は ACFE のシラバスに従って更新されます。 デスクトップ模擬テストをダウンロードして、自分で簡単に試験ダンプを練習できます。 あなたの専門知識を評価するための実際の試験環境を作成します。 最も興味深いのは、幅広い演習を提供する Web ベースの模擬テストを深く掘り下げることができることです。 いつでもどこでも、実際の CFE 試験のような感覚で練習することができます。 時間を設定し、間違いを確認し、パフォーマンスを追跡し、結果を確認することができます。

試験名: 認定不正検査士
試験コード: CFE
メーカー: ACFE
試験形式: MCQS
試験時間: 90 分

試験の利点:
CFE 認定資格は、無限の機会に恵まれた新たな旅へあなたを歓迎します。 不正行為の防止と調査は無制限に拡大します。 CFE は、金融機関、政府機関、企業など、さまざまな業界の組織から非常に人気があります。 CFE の給与中央値は、専門知識への需要を反映して、全職業の平均よりも大幅に高くなります。
wsl2 samba 開発環境構築

# wsl2 samba 開発環境構築手順
### wslで作業
1. sambaをインストール
    ```
    sudo apt update
    sudo apt install samba
    ```
1. sambaの設定ファイルの末尾に追記
    /etc/samba/smb.conf
    ```
    [share]
    path = {共有したいディレクトリパス}
    read only = no
    guest ok = yes
    writable = yes
    force user = {username}
    force group = {groupname}
    ```
1. samba起動用シェルスクリプトを作成
    ~/start
    ```
    #!/bin/bash
    
    set -eax
    
    sudo mkdir -p /run/samba/ncalrpc
    sudo systemctl restart smbd
    sudo systemctl status smbd --no-pager
    sudo systemctl restart nmbd
    sudo systemctl status nmbd --no-pager
    ```
    ~/startの権限を実行可能に変更
    ```
    sudo chmod 777 ~/start
    ```
### windowsで作業
1. 起動用バッチを作成
    wslmount.bat
    ```
    wsl -d Ubuntu exec sh -c "~/start"
    FOR /F "usebackq" %%i in (`wsl -d Ubuntu exec hostname -I`) do set IP=%%i
    echo %IP%
    net use Z: /delete
    net use Z: \\%IP%\share /persistent:no
    ```
1. マシン起動時に自動実行する
    wslmount.batを`C:\Users\{UserName}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`に移動
VSCodeにて対応するカッコの左側に色付きの線を表示させる方法です

# はじめに
VSCodeにて対応するカッコの左側に色付きの線を表示させる設定の共有です😃

![Screenshot 2023-12-04 at 14.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e8351ef3-3aaf-5a24-02e8-3bdb713bb580.png)

# 方法
1. VSCodeの設定画面を開く（Mac:`⌘`+`,`キー）
1. `Bracket Pairs`と検索する
1. デフォルトが`false`なので`true`とする
1. 完了です！😆

![Screenshot 2023-12-04 at 14.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/cc66f678-dc2d-9dcc-c0ba-81dd5c51fbc9.png)

# 参考

https://webrandum.net/vscode-settings-bracket-pair-colorization/
Clean Code Cookbook

Clean Code Cookbookは、「Clean Code」と名がつくが、Uncle Bobの同名書籍とは関係はありません。

ソフトウェア開発（主にソフトウェア設計）において、過去から言われてきた原則やプラクティスは山ほどありますが、それらを網羅するかのごとく、実装例およびコード改善例とともに紹介された本は多くはありません。Clean Code Cookbookは、SOLIDの原則やDRYの原則からA/Bテストなんかまで、レシピに関連して非常に多くのものが引用されています。

<a href="https://www.amazon.co.jp/dp/B0CHWMP78L/"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/9ce2194d-145c-3ef7-f19f-ffc4f8fd3033.png" alt="clean code cookbook書影" width="200"></a>

その点においては、[ミノ駆動本](https://www.amazon.co.jp/dp/B09Y1MWK9N/)との類似点があります。情報の詰め込み度でいうとClean Code Cookbookの方が上回るくらいです。

したがって、まだ経験の浅いソフトウェアエンジニアに、まずこれ読もう、という一冊になって欲しいのですが、現実はそうはなりません。（そもそもO'Reilly出版の洋書の単体価格が上昇しているのもあり、金銭面からも単体ではお勧めしにくい）

## 双射

本書で特徴的なのは、あらゆるシーンで設計の良し悪しを議論する時に、「双射(bijection)になっているかどうか」をよりどころにしている点です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/4afc4a77-a2ad-5dc9-0e1a-06abd3ca8460.png)

「モデルとは抽象的で部分的でプログラム可能な現実の物事の説明」と位置付けて、モデルが現実世界のものの捉え方と１対１対応していることを要求します。「抽象的で部分的で」というところが重要で、単なる現実世界との対応でないことに注意しなければなりません。Uncle Bobの「物事の表現は、それらが表す物同士の関連や結びつきを必ずしも共有しない」という説明も、この注意を言い表しています。

https://twitter.com/unclebobmartin/status/1594754424009801742

1対1対応していないと問題があるケースとして、現実世界としては別の概念として解釈されるもの（「1000円」と「1000メートル」は違う）を、ソフトウェアの中では単なる数値1000として扱うと、値の取り違えが発生する恐れが出てくる、という話が紹介されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/aaf5c6e6-9190-552a-f0c7-1c1fabce3aa6.png)

逆に、現実世界としては同一性を持つものを、ソフトウェア上別の概念をモデルとして作るのはファットモデルを作ることに繋がります。現実世界の同じモノでも、ロールの違いによって振る舞いが異なるのであれば、このロールをモデルとして見出さなければなりません。

双射自体は重要なアイデアで、ドメイン駆動設計におけるユビキタス言語を構築するのに役に立ちます。が、ドメインレイヤでないところまで、双射にこだわると、過剰な設計につながることになります（そこまではClean Code Cookbookでは言及されていないので注意が必要です）。

## パターン本の問題点

この本はCookbookと言う名のとおり、レシピ集すなわちパターンの形態をとっています。世の中に同様の形態の書籍も多く存在しますが、これらを読みこなすには注意が必要です。

パターンは最低限、以下の要素で構成されます。

* **パターン名**
* **問題**: パターンが解決する問題
* **コンテキスト**: パターンを使うことが想定される利用者を限定する背景の説明
* **フォース**： 問題の状況のもとで、このパターンの解決策が有効となる状況や制約
* **解決策**

http://www.s-lagoon.co.jp/pattern_use_nf.html

ただ世の中に溢れるパターン形態の書籍は、コンテキストとフォースの記述が弱く、ただの「べき論」集に見えてしまうことがあります。

Clean Code Cookbookも残念ながら、コンテキスト、フォースが不十分で、「こういうコードは問題だ、だからこう書き換えよう」みたいにとれてしまうのです。

例えば、
* **パターン名**: DTOの削除
* **問題**: 完全なオブジェクトを持ち、それらをレイヤ間で受け渡したい
* **解決策**: 実オブジェクトを使用し、データオブジェクトを避ける。代わりに配列やディクショナリを使ってデータをやり取りもできる。

のようなレシピが本書には載っていますが、すべてのレイヤのやり取りにおいてDTOが悪かのように読めます。他のレシピもこのくらい「問題」の記述が薄いので、「えっ、そんな言い切っていいの？」みたいな解決策に見えてしまいます。

この例に関しては、暗黙のフォースとして「双射が適用されるところにおいては」があるの本の先頭から読んでいれば明らかです。しかし、この「本の先頭から読んでいれば」という前提は、つまみ読みできるレシピ集の書き方としては、残念ながら受け入れ難いものです。

## パターン本の読み方

パターン自体は、現場の問題解決事例を多く観察し、そこに見られる共通の解法を抽出したものです。なので、どのパターン本に書かれているものも基本的には、単なる「僕の考えた最強の設計」ではありません。足りないのはコンテキスト、フォースなのです。
そこで、逆手にとって、コンテキストやフォースの不足を前提に補う読み方、「この解決策を適用するとよい場合とそうでない場合とは？」というのを、手がかりはそこ書かれているので、チームで話し合ってみたりすると学びになるのではないかと思います。
paiza就活してみた話

MYJLab Advent Calendar 2023　4日目を担当します3年の岡田です。
先月からスキルアップを兼ねてpaizaを使い始めたので記事にしてみました。

## paizaとは
paizaとはIT企業に特化したエンジニアの就活支援サービスです。
paiza新卒とpaiza転職がありますが、今回はpaiza新卒の紹介です。
paizaでの就活は　スキルチェック→スカウト→応募　という流れで進みます。
応募後はpaiza経由でやり取りをする企業と直接やり取りをする企業に分かれます。

## スキルチェック
対応言語は Java、PHP、Ruby、Python2、Python3、Perl、C、C++、C#、JavaScript、Objective-C、Scala、Go、Swift、Kotlinです。
問題のレベルに応じてランクが異なり、高い順にS、A、B、C、Dとなっています。

### 受験方法
はじめに問題を選びます。出題内容の詳細は始まるまでわからないので題名・ランク・平均スコア・回答時間などを見て適当に選んでください。（問題は毎週追加されていて、現在は622問が出題中のようです。）
スタートすると問題文が表示されるので言語を選択し、回答します。
複数の例題でコードを実行して出力結果の確認ができるので途中経過や提出前に確認します。
提出すると回答時間と実行結果で点数がつけられ、自身のスコアとランクに反映されます。

### 難易度
私はPython3で解いています。
以下個人的な難易度の感覚です。
D、Cは余裕です。Bで少し難易度が上がりますが宮治研の人であれば問題なく解けると思います。Aは複雑になるので処理時間を意識しないとタイムオーバーになってしまうことがありました。Sはまだ手を付けていません。

下記サイトでサンプル問題が見れます

https://paiza.jp/challenges/practice#samplesubject

## スカウト
スキルチェックを受けると企業から選考やインターンのスカウトが届くようになります。
スカウトは通常スカウト・ゴールデンスカウト・プラチナスカウトの3種類があります。
ゴールデンスカウトは企業が1日5件しか送れないスカウトのようです。Bランクからゴールデンスカウトが増えた気がします。
プラチナスカウトはこちらからアクションをおこすと届く可能性があります。
paizaには気になる企業の求人に対し「気になる！」をして企業に知らせることができます。企業がスキルランクやプロフィールを見て興味を持った場合届くのがプラチナスカウトです。
「気になる！」は企業からも届くのでそこから応募や「気になる！」を送り返すこともできます。

## 応募
興味を持った企業に応募します。
求人には選考とインターンシップがありました。選考ではカジュアル面談と通常面接が選べます。
あくまで選考ではありますが、説明会のような面談で双方の方向性を確認します。
スカウトでなくても求人に応募することができますが、応募可能なランクが企業ごとに設定されています。

## 使ってみた感想
IT企業しか出てこないので見やすかったです。開発内容タイプなど希望条件も設定できました。
メールが結構来るので煩わしいですが、受信設定でどうにかなりました。
担当の方がいるみたいで応募した企業の次のステップについてリマインドメールが来るのはありがたかったです。
あとは単純にスキルチェックが楽しいので言語の勉強に使ってます。

## おわりに
最近本格的に就活を始めましたが、マルチタスクがすごく苦手だと自覚しました、、、、
paizaは応募も楽なので少しでも気になるところはカジュアル面談申し込んでいましたが、自分の限界を超えないようにしないとだめですね^^
私は複数社とやり取りするとすぐパンクしてしまうみたいなので、企業を絞って焦らず進めていこうと思います。

文字だけの記事でしたが最後までお読みいただきありがとうございました！
来年は技術的な記事が書けるように頑張ります。
【Unity】PUN2を学習する　サーバー接続、ルーム作成（参加）

この記事は、[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の５日目の記事です。
マルチプレイはぜひ作りたいと思っていたのでこの機会に勉強します。
この記事はたった3日でPhotonのPUN2を学習します。

１日目:通信の仕方を学ぶ
２日目：オブジェクトを動かせるようにする
3日目：ゲームを作ります。

# 通信がしたい
何人かで通信して楽しめるものを作ります。
何かしらゲームを作ります。


# const
チュートリアルに突然出てきたけど、まだ習っていなかったので覚えました。
constは、定数として宣言するために使用するもののようです。
メリットは、一度決めた値を変えることができなくすることができるようです。
デメリットとして、定数として宣言するとその後値を代入できなくなるようです。

# 作り方
大体のやり方は

https://doc.photonengine.com/pun/current/getting-started/pun-intro

公式のものにちゃんと書いてあります。


参考にしたページ

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/lobby

に以下のコードについて詳しく解説がされています。
（ここに書いてあるコードは自身の勉強用のために日本語説明を入れたものです）

↓接続用コード
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
   
    public class PhotonAdokare : MonoBehaviourPunCallbacks
    {
    [Tooltip("The maximum number of players per room. When a room is full, it can't be joined by new players, and so new room will be created")]
    [SerializeField]
    private byte maxPlayersPerRoom = 4;
    //普段は絶対１にする
    string gameVersion = "1";
    // Start is called before the first frame update
    void Awake()
    {
        PhotonNetwork.AutomaticallySyncScene = true;   
    }

    void Start()
    { //ゲーム開始時に自動的に接続する時に使う。
         // Connect();

        }
    public void Connect()
    {//Photonのネットワークに接続したら
        if (PhotonNetwork.IsConnected)
        {
            PhotonNetwork.JoinRandomRoom();

        }
        //そうでなければ、
        else
        {
            PhotonNetwork.GameVersion = gameVersion;
            PhotonNetwork.ConnectUsingSettings();
        }
    }
    public override void OnConnectedToMaster()
    {//マスターサーバーへ接続したとき
        Debug.Log("Pun Basics Tutorial/Launcher: OnConnectedToMaster() was called by PUN");
        PhotonNetwork.JoinRandomRoom();
    }
    public override void OnDisconnected(DisconnectCause cause)
    {//切断したとき
      Debug.LogWarningFormat("PUN Basics Tutorial/Launcher: OnDisconnected() was called by PUN with reason {0}", cause);
    }
    public override void OnJoinRandomFailed(short returnCode, string message)
    {//ルームへの参加に失敗したとき（ランダム）
        Debug.Log("PUN Basics Tutorial/Launcher:OnJoinRandomFailed() was called by PUN. No random room available, so we create one.\nCalling: PhotonNetwork.CreateRoom");

        // #Critical: we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.
        PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = maxPlayersPerRoom });
    }

    public override void OnJoinedRoom()
    {//ルームに入った時
        Debug.Log("PUN Basics Tutorial/Launcher: OnJoinedRoom() called by PUN. Now this client is in a room.");
    }
}
```
チュートリアルを参考にしました。
これで、サーバーに接続、切断ができるようになりました。
ここに解説を書くとかなり長くなりそうなので、コードの中に書いておきました。
void start()の中にある// Connect();の//を取れば、動くようになっています。


# まとめ
定数の使いかたとphotonのサーバーへの接続の仕方を学んだ。
接続するときや切断するときに、どうすればよいかを知ることができた。



参考

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

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/lobby
Postman を日本語化する

本記事は[Postman Advent Calendar 2023](https://qiita.com/advent-calendar/2023/postman)の3日目の記事です。

https://qiita.com/advent-calendar/2023/postman

## はじめに

日本語版 Postman のベータ版がリリースされたそうです！
本記事ではさっそく日本語化していこうと思います。

https://twitter.com/postman_japan/status/1730726594397016512

### ゴール

Postman デスクトップアプリを日本語化する。
※本記事では Windows 環境で実施

## Postman 日本語化の手順

公式 X 掲載の手順通り実施していく。

### アプリ画面右上⚙️ → Settings を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983766/0da2fb45-50ed-bb38-bb2c-7c16d4b11f3d.png)

### General→Application→Language で日本語を選択する

![Pasted image 20231204140442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983766/c2ba8f35-b79d-5c3b-328e-9cac839917ef.png)

※Language という項目自体表示されない場合はバージョンが古い可能性があるので、Settings→Update からアプリを最新化してください。

## 結果

無事、日本語化されました！:clap:

![Pasted image 20231204140547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983766/f2f17580-9fd1-5901-bc54-d79a9fa05f32.png)

ワークスペースのホーム画面

![Pasted image 20231204141103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983766/969d54b3-a33c-44b8-072d-19f1a7073fdb.png)

## おわりに

開発業務で利用することが多いのでかなり嬉しいアップデートです。
これで DeepL にコピペする手間がなくなりました！
【WordPress】ACFのDate Time Pickerを使って期間限定コンテンツを出す

期間限定でバナー画像を出すようなお仕事があったので作業メモ

# やること
ACF（Advanced Custom Fields）のDate Time Pickerを使って、WordPressの管理画面から開始日時と終了日時を設定し、その期間だけコンテンツを表示するようなものを作ります。
![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288781/91f74470-f13e-7782-bece-ae4bdc4848ff.gif)

# ACFで新規フィールドを作成して以下のように設定
![img1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288781/af966b9f-e645-d18a-d761-b8c6080c47c0.jpeg)

フィールドラベルを`開始日時`
フィールド名を`start_date_time`
としました。

フィールドタイプは`Date Time Picker`
カレンダー状のUIから日付を選択し、時間も設定することができるようになります。

表示フォーマットは管理画面側のUIに表示される日時のフォーマットです。
初期設定（`d/m/Y g:i a`）は少しわかりにくいため、ここではカスタム（`Y年n月j日D H:i:s`）にしました。

同様に終了日時も
フィールドラベルを`終了日時`
フィールド名を`end_date_time`
で登録していきます。

ラッパーの属性：widthを50%にすることで、開始日時と終了日時の入力フォームを横並びにすることができます。

# 期間を設定する
作ったフィールドグループを設置したページの設定画面で日時をそれぞれ指定します。
![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288781/91f74470-f13e-7782-bece-ae4bdc4848ff.gif)
フォームに入力された日時のフォーマットがACF側で設定したカスタムフォーマット（`Y年n月j日D H:i:s`）になっているのが確認できます。


# コンテンツの出力
出力するページのPHPファイルに下記のようにコードを書きます。
```PHP:PHP
  <?php
    //現在の日時を取得
    $current_date_time = esc_html(current_time('Y-m-d H:i:s'));
    //ACFのデータを取得
    $start_date_time = esc_html(get_field('start_date_time'));
    $end_date_time = esc_html(get_field('end_date_time'));

    //$start_date_timeと$end_date_timeが存在する場合、かつ現在の日時がその範囲内にある場合
    if ($start_date_time && $end_date_time && $start_date_time <= $current_date_time && $end_date_time >= $current_date_time):
  ?>

    <!-- 期間限定で出したいコンテンツ -->

  <?php endif; ?>
```
※上記のコードではエラーの場合何も起きないので必要に応じてエラーハンドリングを入れてください。
ポイントは`current_time()`のフォーマットがACF側の`返り値のフォーマット`と同じになるようにすること。
![スクリーンショット 2023-11-29 16.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288781/032b7cec-df63-1dc6-044b-dc1e54730c92.png)

ここが違うとデータの比較ができず、正しく動作しません。
また`current_time()`関数はWordPressの設定に基づいて時刻を取得するため、うまくいかない場合はタイムゾーンの設定が正しく行われているかも要確認です。

<hr>

実際は表示するコンテンツも管理画面から登録できるように作りました。
ちなみにトップページに表示したい場合はACFの有料版を使うか、設定用の非公開固定ページを作る、WordPressの設定で特定の固定ページをトップページ化して使うなどしてACFのフィールドグループを設置することができます。
さわってみよう watsonx.data #1 ~初めの一歩編~ Part 4

**Part 4の内容**
「さわってみよう watsonx.data #1 ~初めの一歩編~」の最終回となるPart 4では、
下記のうち

・watsonx.dataへのログイン
・インフラストラクチャー・マネージャー(3階層コンポーネントを知る)
・データ・マネージャー(データの探索)
・照会ワークスペース(データの照会)
・照会履歴(照会の監査(過去に実行されたSQLの表示))
・スキーマの作成
・データの取り込み(都内WiFiスポットの緯度、経度が記録されたCSVファイル)
・データの照会(地理空間関数で東京駅に近い都内WiFiスポットの件数を調べる)
**・アクセス制御(インフラとデータに対するユーザー単位での制御)**

太字部分の
**・アクセス制御(インフラとデータに対するユーザー単位での制御)**
を取り上げます。

**アクセス制御**
アクセス制御は画面左アイコンの並びの中で一番下のアイコンで呼び出すことができます。watsonx.dataのインフラとデータの両方のアクセス制御がユーザー単位で可能です(一部はグループ単位も可能です)。
“インフラストラクチャー”タブが選択された状態で、任意のものを選び、画面右端のドットアイコンを選択し、プルダウンから”アクセスの管理”を選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/24a317f3-ba3a-922c-0c23-fc69f1ef7452.png)

このハンズオンの対象外となりますが、選択したインフラのコンポーネントへのアクセス権限付与がユーザー単位でできます。
付与する役割(管理者、ユーザーなど)も指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/905cdd91-eaad-a186-1d67-98ec23fc5822.png)

次にデータに対するアクセス制御をポリシーとして定義してみます。”ポリシー”タブを選択します。画面右上の”ポリシーの追加”を選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/c82dc883-d0ae-9e7e-23b9-db80fed25558.png)

ポリシー名を入力します。英数字であれば、任意のもので構いません。他の欄はそのままにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/9f81be26-9523-2268-7e39-e4c8bb9eb0f5.png)

(このハンズオンでは実際には有効にしないので)任意のポリシー対象のスキーマ、表、列を選択し、”次へ”ボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/e4eeeb52-cf7d-511a-b72e-51d151cf23ef.png)

ポリシー内にルールを作っていきます。”ルールの追加”ボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/d552f6df-db23-7059-731a-7d26b2fda7b2.png)

列に対するルールを定義します。ポリシー作成の際指定した列に対して、「ユーザー”ibmlhadmin”によるSELECTを拒否」の場合は下記のような定義になります。(このハンズオンでは有効化しないので)自由に設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/fc9a7cec-515a-01fa-4e1e-58ef52939e01.png)

“レビュー”ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/b5638235-fa2a-098e-980f-2309e1a1a6f9.png)

“保存”ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/73362857-5d59-32b3-9cac-704ce1c80db3.png)

このハンズオンの対象外となりますが、ポリシーを選択し、右端のドットアイコンをクリックし、”アクティブ”を選択すると、作成したポリシーが活動化されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/56f5bcb6-d7fc-7e6a-5dec-d352d74c030a.png)

**Part 4のまとめ**
・アクセス制御では、ポリシーを作成し、そのポリシーに紐づけられるルールを作りました。
・アクセス制御ポリシーの作成では、ポリシー対象のスキーマ、表、列を指定することを学びました。
・ルールの作成では、各操作(SELECT/INSERT/DELETEなど)の許可(GRANT)、拒否(REVOKE)をユーザーまたはグループ単位で設定できることを学びました。

以上で4つのPartに分けてご紹介してきました「さわってみよう 「watsonx.data #1 ~初めの一歩編~」は終わりです。全Partを修了された方、お疲れ様でした。
TiDB ServerlessのRU消費を計測する

みなさん TiDB Serverless使ってますか〜？
TiDB Serverlessは従量課金となっていて、利用量とDisk利用量で課金されるようになっています。
この「利用量」がRequest Unitと呼ばれるもので、リクエスト毎にDBで消費される様々なリソース（主にCPU）に対して課金されるようになっているのです。で、このRUの計算方式ですが...

https://www.pingcap.com/tidb-serverless-pricing-details/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/4858f0a1-93a8-9e29-b168-6d78fa003bd1.png)

と書いてあり、分かりづらいと思います。計算するにしても、一つのクエリでどのくらいCPUを消費するか、Read/Writeリクエストを消費するかを知る必要がありますが、簡単ではありません。
ところで、最近、TiDB Serverlessに、実行したSQLのRU消費量を表示する機能ができたのでその機能について紹介していきます。

# RUの計測方法

## EXPLAIN ANALYZEを使う

:::note 
`EXPLAIN ANALYZE` を使ってクエリの実行計画を表示した際に、RUも合わせて表示されます。
:::

この値を使って特定のクエリがどれくらいのRUなのかを見積もることができます。
代表的なクエリをいくつか計測してみてベースラインとすることで、そのクエリを月何回くらい実行するかで見積もることができそうです。

RUの計算テーブルから分かる通り、実際にRUの大半を占めるのはクエリレスポンスのデータ量の多さです。
例えば、簡単なテーブルを100件返す以下のクエリのRUは1未満ですが

![スクリーンショット 2023-12-04 13.54.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/202942e3-839a-6ffb-58de-1788ac05ea89.png)

これを1000件返すようにすると、10倍程度RUを消費します。ほぼ比例しています。
これはデータ量に応じたRUと、EgressのネットワークRUもかかっているのではないかと思われます。

![スクリーンショット 2023-12-04 13.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/ee56d21a-9a5b-1b29-cee6-b326e10904d9.png)

結果セットが小さい単純なクエリが多い方がコスト的には良いということになるかと思います。

## クエリメトリクスを参照する

:::note
最近追加された機能で、SQLのメトリクスでRUが表示されるようになりました。
DiagnosisのSQL Statementから確認できます。
:::

RUの列でソートもできるので、特定の期間でRUを多く消費しているクエリを探すことができます。
![スクリーンショット 2023-12-04 13.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/e6f2df78-7ec5-1ef6-6503-c6803b944208.png)

# さいごに

TiDB ServerlessでのRUの把握方法について記載しました。
またTiDB Serverlessは利用上限を設定できますので（これは＄で設定）、RUの計算によらず一定額で利用料を抑えることができます。
RUの見積もりで概算を立てつつ、利用上限を設定して実際に運用してみて、実際の利用感を確認していくのが良いかなと思います。
Amazon CloudWatch Agent、Alarm、Syntheticsの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAmazon CloudWatch Agent、Alarm、Syntheticsに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- Amazon CloudWatch Agentとは
- Amazon CloudWatch Alarmとは
- Amazon CloudWatch Syntheticsとは

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- Amazon CloudWatch Agent、Alarm、Syntheticsがどういうサービスか説明できるようになりたい人
- Amazon CloudWatch Agent、Alarm、Syntheticsを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# Amazon CloudWatch Agentとは
Amazon CloudWatch Agentは、複数のデータソースからメトリクス、ログ、カスタムデータを収集し、CloudWatchに送信するエージェントです。

EC2インスタンスやオンプレミスサーバーのWindowsおよびLinuxで使用可能です。
また、CloudWatchAgentではプラグインが用意されており、例えばのprocstat プラグインでプロセスメトリクスを収集することが可能になります。

# Amazon CloudWatch Alarmとは
Amazon CloudWatch Alarmは、特定のメトリクスに対して定義した条件が満たされるとアクションをトリガーし、通知を生成するサービスです。

![](https://storage.googleapis.com/zenn-user-upload/8a339461e452-20231204.png)

Amazon CloudWatch Alarmで閾値の設定を設定し、閾値を超えた際にアクションのトリガーをすることが可能になります。

Amazon CloudWatch Alarmを活用することで、自動スケーリングや運用監視、コスト管理など、さまざまなシナリオで活用されます。

具体的にはEC2が障害を起こした時のリブートやリカバリのトリガーやAuto Scalingのアクションのトリガーとして用いることができます。

また、複合アラームを用いると複数の条件にマッチしたときのみアラームを上げることができます。
これによって、CPU使用率だけではなくIOPSも閾値を超えたらアラームを上げるなど高度な監視が可能になります。

# Amazon CloudWatch Syntheticsとは
Amazon CloudWatch Syntheticsは、エンドユーザーの視点からアプリケーションの可用性とレイテンシーをモニタリングするためのサービスです。
APIやURL、ウェブサイトを監視するためのスクリプトを定義し、シナリオテストを定期的に実行してアプリケーションの健全性を確認します。

監視をするためにはCanaryを設定する必要があり、設定に使えるのはNode.jsとPythonです。

ちなみに、Canary BlueprintというアプリケーションのエンドユーザーエクスペリエンスをモニタリングするためのCanaryの設定を効率的に行うための設計テンプレートがAWSで準備されています。

そのため、Canary Blueprintを用いるとCanaryの定義が比較的容易に行えます。

# まとめ
この記事ではAmazon CloudWatch Agent、Alarm、Syntheticsに関連する内容を超詳細にまとめました。

- Amazon CloudWatch Agentとは
- Amazon CloudWatch Alarmとは
- Amazon CloudWatch Syntheticsとは

次回はAmazon Athenaを超詳細解説します。
Zoomミーティングに参加中であるか判定する（Windows）

[インフォ・ラウンジAdvent Calendar 2023](https://qiita.com/advent-calendar/2023/info-lounge) 5日目の記事です。
前日は、@ituki_b さんの[【WordPress】ACFで作ったブロックのデータを他のページで取得する](https://qiita.com/ituki_b/items/66ff469a99e4a8a8b511) です。

## はじめに
Windows上でZoomミーティングに参加中であるかを判定する機会があり、調べたところプロセス状態から判定することができたので共有してみます。

この方法は記事公開時点である2023年12月時点では有効な方法ではありますが、プロセスを監視するという仕組みであるのでZoomクライアントの更新により使えなくなる可能性もございます。ご了承ください。

## 方法
`CptHost`という名前のプロセスが実行されているか確認します。
実行中であればZoomミーティングに参加中です。

タスクマネージャーの詳細画面から確認できました。

## PowerShellを用いて判定する
タスクマネージャーから目視でチェックすることはできますが、やりたいこととしては判定結果を用いて別の処理を自動化するという文脈になると思われます。
今回はPowerShellを使用して判定します。バージョンは5.1と7.4.0で確認しました。

### コマンド
単純に取得するだけなら以下のコマンドになります。
```powershell
Get-Process -Name CptHost
```

ただし、上記のコマンドだとZoom未実行の際にエラーを返してしまい処理が煩雑化するので、エラーを出ないようにします。
```powershell
Get-Process -Name CptHost -ErrorAction SilentlyContinue
```

ミーティング参加中であれば返り値があり、そうでなければなにも返ってこないです。

各々の処理を実行したり、whileを用いて定期的にプロセス取得したりすると思いますが用途によって処理が変わる部分となってしまうので割愛します。

## あとがき
今年初めてVue Fesなどのイベントに参加し、周りに触発されて情報発信してみたいと思っていましたが、ネタが無くてここまで遅くなってしまいました。そして何故かPowerShellの記事を書きました。
公開記事を書くのも初めての経験で拙い文章となってしまいましたが何かのお役に立てば幸いです。

---
明日以降の予定は未定です。