OmniAICreator/Qiita-1.07M huggingface dataset:
LeetCodeを1日1題解いてみる (day42)

42日目に取り組んだ問題はこちら！

# 586. Customer Placing the Largest Number of Orders

https://leetcode.com/problems/customer-placing-the-largest-number-of-orders/description/?lang=pythondata

## 問題文
Table: `Orders`
```
+-----------------+----------+
| Column Name     | Type     |
+-----------------+----------+
| order_number    | int      |
| customer_number | int      |
+-----------------+----------+
```
order_number is the primary key (column with unique values) for this table.
This table contains information about the order ID and the customer ID.
 
Write a solution to find the customer_number for the customer who has placed the largest number of orders.

The test cases are generated so that exactly one customer will have placed more orders than any other customer.


## 僕の回答 (ヒントあり)
```py
import pandas as pd

def largest_orders(orders: pd.DataFrame) -> pd.DataFrame:
    result = dict()
    for row in orders.itertuples(index=False):
        if row.customer_number in result:
            count = result[row.customer_number] + 1
            result[row.customer_number] = count
        else:
            result[row.customer_number] = 1
    if not result:
        return pd.DataFrame({"customer_number": []})
    max_key = max(result, key=result.get)
    return pd.DataFrame({"customer_number": [max_key]})

```

## より効率の良い回答例

```py
import pandas as pd

def largest_orders(orders: pd.DataFrame) -> pd.DataFrame:
    return orders['customer_number'].mode().to_frame()
```

## 学んだこと
- `.mode()`: この列で最も頻繁に出現する値（最頻値）を計算する
- `.to_frame()`: 結果をデータフレーム形式に変換する
- `max(dict, key=dict.get)`: `dict`内の最も大きい`value`を探し、その`key`を返す

## コメント
方針は思いついたが、完成まで自力でできず、GPTにヒントをもらって完成させた。辞書から最大値を探す方法やdfでreturnする方法がわからなかった。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/7b95967043fe8f538533
blenderで棒人間に顔を付ける

# はじめに

この記事は私が自身の研究で必要だったちょっとした方法をその時発生した問題を交えてお知らせするものです．

# 棒人間を用意する

今回使用する棒人間はbvhファイル形式のモデルです．bvhファイルのまとめサイトが少ないので軽く説明します．

<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955026/c5c7990f-2910-af39-a40d-cee015555c87.png">


まずHIERARCHYという文字で始まり，次に以下のノードで関節名が記述されます．

- ROOTノード：最初の1つのみで基準の関節
- JOINTノード：ROOT，END以外はすべてのこのノード
- ENDノード：最後の１つのみ

全てのノードはOFFSET（関節の初期位置を表す）を持ち，ROOTノード・JOINTノードはCHANNELS（x,y,z位置と回転角名）を持ちます．CHANNELSはROOTのみ６個必要で他ノードは回転角３個のみでも動きます．xyzの順番は作成者によってさまざまで動作再生時は記述順に動かします．

それではblenderでbvhファイルを読み込みます．

「ファイル」→「インポート」→「モーションキャプチャ(.bvh)」で開きたいbvhファイルを指定します．インポート欄にモーションキャプチャ(.bvh)がない場合は「編集」→「プリファレンス」→「アドオン」のインポート/エクスポート: BioVision Motion Capture（BVH）フォーマットにチャックを入れてください．


# 顔を用意する

顔はフリー素材を使うか，自分で球体を作成してください．

今回用意したのはこの顔です．

<img width="200" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955026/affafd49-ae2d-b8e5-0ecc-bfb3df168d37.png">

# 実際に顔を付ける

それでは実際に棒人間に顔を付けてみます．

顔オブジェと棒人間をちょうどよい場所に移動させて両方選択します．移動させるときは左側の「移動」ボタンを押すとオブジェを動かすことができます．また，Shiftキーを押しながら両方選択できます．

<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955026/716b3b3c-8830-450c-251a-a915fd02cd5a.png">

次に左上にあるオブジェクトモードをポーズモードに変えます．その後Shiftキーを押しながらくっつけたい首の骨の部分を選択します．

<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955026/c095317c-5925-beb3-8241-7801345a598c.png">



この状態になればオッケーです．

次に選択した顔と首の骨の部分をくっつけます．Cntrlキー+ p を押し，ペアレント対象にボーンを選択します．これで顔と棒人間をくっつけることができました．ちなみにAltキー+ p でペアレントを解除できます．

# 再生してみる

<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955026/82df3220-5bcc-f94d-415d-6ac76f80a9a9.gif">


顔が飛んでいきました．．．．
くっつけたはずの顔がろくろ首のように離れてどこかに消えました．
顔と首のくっつける手順は正しいはずなので原因を探していきます．

<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955026/5ee99bde-cf19-dd86-14bd-231c3d623a49.png">


実は横から見ると棒人間の位置と顔の位置がずれていることが分かります．みなさんは顔とくっつけるときはちゃんと３方向から確認しましょう．

では正しい位置に顔を戻し再び再生してみると，このようにしっかり顔と棒人間が一体になって動きました．
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955026/8d342ef7-b54b-838a-c7ce-b77f86e5571c.gif">



# まとめ

今回は顔と棒人間の付け方を紹介しました．ここでの機能はblenderのちょっとした機能なので他のものも調べてみてblenderを使いこなしていきたいと思います．

またここでのサブテーマは，物事は多角的にみることが重要であるということです．正面でくっついているように見えて横から見ると全然離れていることのように１つの見方だけでは正しく判断できないことが多いです．普段から様々なものの見方ができるように思考力を鍛えていきたいです．
Linux：基本操作（自分用）

# Shellの基本操作
**入力補完**
```bash
#途中まで入力してTabキーを押すとファイル名やディレクトリ名を補完してくれる。
Tab
```

**カーソルの移動**
```bash
#カーソルを先頭行に移動
Ctrl + a
#カーソルを末尾に移動
Ctrl + e
```
**画面のクリア**
```bash
#画面をクリアする
Ctrl + l
```
**処理の中断**
```bash
#実行中の処理を中断
Ctrl + c
#実行中の処理を一時停止
Ctrl + z
```
**画面出力の停止と再会**
```bash
#画面出力の停止
Ctrl + s
#出力の再開
Ctrl + q
```
入力したコマンドの履歴
```bash
#入力した履歴が番号付きで表示される
history

1 ls
2 cd ..
3 cat

#履歴からコマンドを使用する「!番号」
!1
```

# ディレクトリの指定
| 記号 | 説明 |
| :-- | :-: |
| ~ | ホームディレクトリ |
| . | カレントディレクトリ（現在いる場所） |
| .. | 一つ上のディレクトリ |
【備忘録】Azure Private Linkの留意点


# はじめに

Azure Private Linkを使用前提で色々と構築をしていた際
注意点について勉強したので備忘録として書き記します。

# 割り当てられるIPアドレス

本来パブリックIPでアクセスしなければならないPaaSサービスですが、
Private Linkを使用することでプライベートIPにて通信可能にしてくれます。

しかし、この割り当てられるIPアドレスは次のような留意点があります。

> サブネットからの動的プライベート IP アドレスが割り当てられます。

https://learn.microsoft.com/ja-jp/azure/private-link/private-endpoint-overview

きちんとFQDNで名前解決させてあげる必要があります。

※私はこの仕様に気づかず、静的に無理やり解決させていたことがあったりします（しばらく使えていましたが、よくないやり方）

# Azure DNS(168.63.129.16)

通信例の図を見るとわかりますが、
Azure DNSと通信してからPrivate DNSと通信します。

https://learn.microsoft.com/ja-jp/azure/private-link/private-endpoint-dns-integration

そして、このAzure DNSはAzure上からの名前解決リクエストのみ応答するようになっています。

> Azure では、パブリック DNS 名の解決と共に、同じ仮想ネットワークまたはクラウド サービス内に存在する VM とロール インスタンス用に内部の名前解決が提供されます。

https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances?tabs=redhat

# DNSフォワーダ

Azure DNSの仕様があるため、オンプレからの通信をする際はDNSフォワーダが必須です。

オンプレ環境から参照しているDNSがAzure上に存在する場合は、
Azure上のDNSからフォワーダでAzure DNS(168.63.129.16)を指定しれあげればOKです。

逆にオンプレミス側のDNSを参照していた場合は、直接Azure DNS(168.63.129.16)をフォワーダ登録しても名前解決できません。そのためオンプレDNSの参照先用にAzure上へDNSサーバ※をたて、Azure上のDNSサーバからAzureDNSを参照させます。

※Azure上のDNSはいくつか選択肢があります
1. VM上にDNSを構築する
1. Azureプライベートリゾルバーを使う
1. Azure FWのDNSプロキシを使う

https://learn.microsoft.com/ja-jp/azure/private-link/private-endpoint-dns-integration

https://learn.microsoft.com/ja-jp/azure/firewall/dns-settings?tabs=browser#dns-proxy

# 複数のフォワーダが登録されている場合

Private Linkを使う際は実質フォワーダが必須になるわけですが、
既にフォワーダとして登録しているサーバがあった場合は下記を留意しておく必要があります。

#### フォワーダの場合
フォワーダ
⇒無条件にフォワードする設定
・クエリ応答までの待機時間：既定値3秒
・フォワーダ全体に対しての待機時間：既定値８秒
1つ目のDNSへ3秒⇒2つ目のDNSへ3秒⇒・・・4台目は到達不可能

#### 条件付きフォワーダの場合
条件付きフォワーダ
⇒指定したドメイン名の名前解決を指定フォワーダへフォワードする設定

・クエリ応答までの待機時間：既定値5秒
・フォワーダ全体に対しての待機時間：既定値８秒
1つ目のDNSへ5秒⇒2つ目のDNSへ5秒⇒・・・3台目は到達不可能

https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/forwarders-resolution-timeouts

既存環境の設定値は要チェックです。
ターミナルでvimライクに使えるファイルマネージャ、yaziを使う

ターミナルでvimライクに使えるファイルマネージャのyaziがいい感じです。

タイル型ウィンドウマネージャを使っていて、エディタはvimで、ブラウザにはvimiumが入っていて...という人なら気にいると思います。

# インストール
```
sudo pacman -S yazi
```

# .zshrcの設定
yaziでディレクトリを移動した後、ターミナルへ戻ったときに直前までyaziで表示していたディレクトリを表示するようにします。

以下を.zshrcに追記してください
（Bashを使ってる場合は.bashrcです）
```
function y() {
	local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd
	yazi "$@" --cwd-file="$tmp"
	if cwd="$(command cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
		builtin cd -- "$cwd"
	fi
	rm -f -- "$tmp"
}
```

# 基本的な操作
基本的な操作は以下のとおりです↓

・yで起動、qで終了します。
・ディレクトリの移動はvimのようにhjklでできます。

・yでヤンク（コピー）、pでペーストできます。
・xにすると切り取りになります。

・rでリネーム、dでファイルをゴミ箱に移動します。

詳しくは[公式のドキュメント](https://yazi-rs.github.io/docs/quick-start/)を見てください！
Next.jsとprismaでアプリを作ったとき、Vercelデプロイすると「Method Not Allowed」エラーが起きる

### はじめに

表題通りのエラーに遭遇しましたので簡単に書き残しておきます。

### 概要

Next.jsとprismaでアプリを作成し、Vercelでデプロイすると、apiにPOSTリクエストした際に"Method Not Allowed"エラーが生じる。このエラーはローカルでは生じない。

### 解決策

VercelのビルドページのLogに以下のようなログがあるのを発見
```
⨯ Error [PrismaClientInitializationError]: Prisma has detected that this project was built on Vercel, which caches dependencies. 
This leads to an outdated Prisma Client because Prisma's auto-generation isn't triggered. To fix this, make sure to run the `prisma generate` command during the build process.
```

調べてみると、Vercelのデプロイ時にprisma generateができていなかったのが原因らしい。
package.jsonの"scripts"を以下のように書き換えることで解決した。

```
  "scripts": {
    "postinstall": "prisma generate",
    "build": "prisma generate && next build",
    "dev": "next dev",
    "start": "next start"
  },
```
SpresenseでLチカ　Arduino IDE編【備忘録】

# はじめに
2024年 SPRESENSE™ 活用コンテストの作品作りに向けて、まずは動作検証と環境構築も踏まえてSpresenseでＬチカができるか試したいと思います。

# Sony Spresenseの概要
Sony Spresenseとは、低消費電力ながらマルチコアプロセッサ処理を可能とするIoT向けのマイコンです。最近では人工衛星の制御メインボードとして使われた実績もあります。それ以外にも、Sonyの強みである "音"を生かしてハイレゾオーディオ機能も搭載しています。（筆者は今のところ使う予定なし）

# 目次
- [必要な準備](#必要な準備)
- [環境構築](#環境構築)
- [コード](#コード)
- [コードの解説](#コードの解説)
- [実行結果](#実行結果)
- [おわりに](#おわりに)

# 必要な準備
- ハードウェア
    - Sony Spresenseメインボード
https://www.sony-semicon.com/ja/products/spresense/index.html
    - USBケーブル
- ソフトウェア
- Arduino IDE
# 環境構築
Arduino IDEで使用するために公式サイトの手順に従って、環境構築を行います。
1\. メニューバーの「ファイル」から「基本設定」を開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/8526834b-9d19-7062-ac63-3b192ce50e59.png" width="400" style="height:auto;">







2\. 「基本設定」にある「追加のボードマネージャのURL」の記入欄に下記URLを入力し OK をクリックします。

↓追加するURL
https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/generic/package_spresense_index.json


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/4fd8ff00-4506-2e45-05db-0eebed2c66b8.png" width="500">




3\. メニューバーの「ツール」からボードを開き、横にあるボードマネージャーをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/7feaf91c-3526-efbc-f068-d2f9fff0d82e.png" width="400" style="height:auto;">


4\. ボードマネージャーの検索欄に[spresense」と入力して、検索結果のパッケージをインストールします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/34959a5c-08d6-0f19-0e71-d785371ad2f4.png" width="400" style="height:auto;">

5\. メニューバーの「ツール」→「ボード」→「Spresense Reference Board」→「Spresense」の順に選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/bc5dd3dd-91e2-a2ba-c580-deef921f66e7.png" width="600" style="height:auto;">


6\. SpresenseメインボードにUSBケーブルを接続します。そして、メニューバーの「ツール」からSpresense ボードが接続されている COMポートを選択します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/cfd91b96-f494-fdc6-6877-265c3dd3b092.png" width="400" style="height:auto;">


7\. ツール → 書き込み装置 で Spresense Firmware Updater を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/787ef3d6-70a0-a827-03bf-9550f0d63dd1.png" width="400" style="height:auto;">







7\. 「ツール」から「ブートローダを書き込む」を選択します。
ブートローダの書き込みは、マイコンが動作するための初期設定やプログラム受け取り機能をインストールする作業です。プログラムをマイコンに書き込む前にこれを実行します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/c8a4d5d4-6517-d260-2c3b-9303cbd2f3d7.png" width="400" style="height:auto;">

参考サイト
https://developer.sony.com/spresense/development-guides/arduino_set_up_ja.html





# Lチカのコード

```c++
void setup() {
    pinMode(LED0, OUTPUT);
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
}

void loop() {
    digitalWrite(LED0, HIGH);
    delay(100);
    digitalWrite(LED1, HIGH);
    delay(100);
    digitalWrite(LED2, HIGH);
    delay(100);
    digitalWrite(LED3, HIGH);
    delay(1000);

    digitalWrite(LED0, LOW);
    delay(100);
    digitalWrite(LED1, LOW);
    delay(100);
    digitalWrite(LED2, LOW);
    delay(100);
    digitalWrite(LED3, LOW);
    delay(1000);
}
```
# おわりに
これでArduino IDE上でSpresenseのプログラムを実行することができるようになりました。
"Macストレージを最適化"はオフにした方がいい

## Gitの履歴が消えた

VSCodeで開発中、突然Gitの操作ができなくなった。
僕は普段GUIでコミットなりプッシュなりをしてますが、VSCodeのソース管理タブの下にあるソース管理グラフがまっさらになっており、"選択したソース管理プロバイダーには、ソース管理履歴項目が存在していませ..."のような表示がされていました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774078/a78a04b4-dfa1-9f19-89fa-9107a07ee055.png" width=50%>

> VSCodeのソース管理タブ(これは解決後の画像)

そこでターミナルでもプッシュやプルを試してみたが、どれもエラーになってしまいました。
どうやらGit reflogがクラッシュしたらしい。

```
$ git push
error: pack-objects died of signal 10
error: pack-objects died of signal 10
fatal: the remote end hung up unexpectedly
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly
error: failed to push some refs to 'https://github.com/
```

## 原因 : "Macストレージを最適化"のせい

Finderで作業ディレクトリを確認したところ、`.git`ファイルにiCloudのマークが付いていました。
![スクリーンショット 2024-12-14 23.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774078/17d3f6e4-904c-a9e1-f53e-eb0b0e3f8031.png)

これはMacのローカルストレージの空き容量が足りない時に、ローカルから削除してiCloud上にのみ保存する"Macストレージを最適化"機能によるものです。
256GBのMacBook Airを使っているので、容量が足りない判定でローカルから削除されてしまったようです。

`.git`ファイルを右クリック→今すぐダウンロードでローカルストレージ上に復元した結果、ソース管理履歴がすぐに戻りました。

## "Macストレージを最適化"をオフにする方法

→システム設定→自分のApple IDタブ→iCloud→"Macストレージを最適化"をオフにする

## おわりに
おそらく、Macストレージの最適化でローカルにない状態だった開発中のファイルは他にもたくさんあるので、通常なら問題にならないと思います。
もしファイルが見つからないと言われた場合に試してみてください。
(あとそもそもストレージ256GBは少ないね)
Napkin AIでSVG保存可能な図を生成する

## はじめに

Napkin AIは、テキストベースの入力から図解を自動生成してくれる便利なツールです。今回は、apkin AIで生成した図をSVG形式で保存する方法をテーマに、具体的な使い方を紹介します。

https://www.napkin.ai/

## Napkin AIとは

Napkin AIは、シンプルなテキスト入力からフローチャートやダイアグラムなどを作成できるAIツールです。特に以下の特徴があります。

* **直感的な操作性**: テキストでフローを書くと瞬時に図として可視化。
* **多様な出力形式**: PNGやSVGといった形式で保存可能。
* **リアルタイム編集**: 図を生成した後も簡単に調整可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/465f2a6c-e882-ae6d-e4c2-4dde48b11bc6.png)

## SVG形式の保存とは？

SVG（Scalable Vector Graphics）は、XMLベースのベクター画像フォーマットです。以下の特徴があります。

* **解像度に依存しない**: 拡大縮小しても品質が劣化しない。
* **ファイルサイズが小さい**: テキストベースの記述のため軽量。
* **カスタマイズが容易**: コードを直接編集してデザイン変更が可能。

Qiitaの記事や開発資料に埋め込む際にも適しています。

## Napkin AIで図を生成し、SVG形式で保存する方法

### 1. 図の作成

1. Napkin AIにアクセスします。
2. New napkindを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/550fcf00-7d9d-7cf7-40e9-1a7ebdadac78.png)
3. 文章を書きます。図解を作成したい範囲を選択します。左側のGenerate Visualsのアイコンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4ece7243-4712-4326-7c67-15c69ebfdc8f.png)
4. そのアイコンをクリックすると、図解が生成されます。複数のパターンが生成されるので、その中から選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/aff39458-f238-fc43-c600-3b104b1a5bca.png)


### 2. SVG形式で保存

1. 図が生成されたら、右上の「Export」メニューをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/aa8dbb59-d0a6-c579-b3e9-8826c5a318f2.png)

2. 表示されたオプションの中から「SVG」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/afacf5a3-9fc6-c797-4e51-e44ac9147af7.png)

3. 保存先を指定してファイルをダウンロードします。

4. SVGファイルを直接編集して色や形状を調整したり、他のツールと統合することが可能です。

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7bb04ed2-e6e6-d607-95e0-55ec8933c32e.png)

Napkin AIは、文章から素早く図を生成できる便利なツールであり、SVG形式で保存することでさらなる活用の幅が広がります。Qiita記事やチームでの情報共有の場で、ぜひ活用してみてください。勉強会の資料をまとめるときに役にたつかもしれません。一般的な情報がテーマの場合など。

## リンク

* Napkin AI公式サイト: https://www.napkin.ai
* SVG仕様詳細: https://developer.mozilla.org/ja/docs/Web/SVG
int型（4バイト）とchar型の処理時間の違い

## 1.はじめに
いきなりですが質問です！！int型とchar型の違いは何だと思いますか？
バイト数が違う？たしかにそれ"も"ありますね。
## 2.果たして本当に違うのはバイト数だけなのだろうか
たしかに、int型は４バイト（今回は4バイトとして扱います）、char型は1バイトとバイト数が違います。
しかし、私はふと疑問に思ったんです。
バイト数が違うなら処理速度も違うのではないか？と・・・。
## 3.となれば実際に調べるしかない
ということで実際にプログラムを書いていきます！！
果たして、int型とchar型のどちらの処理速度が速いのでしょうか？それともどちらの処理速度も変わらないのでしょうか？
ちなみに私はint推しです。
フレー！フレー！i・n・t!負けるな！負けるな！c・h・a・r!

```ruby:プリプロセッサ命令
#include <stdio.h>
#include <time.h>
```
まず、使用するプリプロセッサはこの二つです。
突然ですが、私は**time.h**を使ったことがありません！
そして、この記事を見ている方の中にもわからない方がいると思います（多分）。なので、time.hについて軽く説明していきたいと思います。
**time.h**は、時間を扱うためのマクロ、型、関数が定義・宣言されてるプリプロセッサ命令です。そのため、今回の記事のように時間を求めるときなどに使われます。

次に、main関数の中身は
    このようになっています

```ruby:main関数中身
int main() {
    clock_t start, end;
    double char_time, int_time;

    // char型の処理時間を計測
    char character = 0;
    start = clock();
    for (long i = 0; i < 100000000; i++) {
        character += 1;
    }
    end = clock();
    char_time = (double)(end - start) / CLOCKS_PER_SEC;//clock_tの値を秒変換

    // int型の処理時間を計測
    int integer = 0;
    start = clock();
    for (long i = 0; i < 100000000; i++) {
        integer += 1;
    }
    end = clock();
    int_time = (double)(end - start) / CLOCKS_PER_SEC;////clock_tの値を秒変換

    // 結果を表示
    printf("char型の処理時間: %.5f秒\n", char_time);
    printf("int型の処理時間: %.5f秒\n", int_time);

    return 0;
}
```
最初に変数を定義した後、char型の変数characterとint型の変数integerをそれぞれiが1億になるまで反復させます。
そして、printf結果を小数点第5位まで出力します。
## 4.結果発表ぉぉぉー！
出力結果は以下のようになりました！ﾃﾞﾃﾞﾝ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943866/8da10211-28e8-60b5-d5fc-f7f0bfc5f315.png)

また、毎回同じタイムで処理を終えているわけではなく（当たり前ですが ^^;）実行するたびにタイムはバラバラになりました。

一応、例として他のタイムも載せておきます。

↓一番僅差だった時のタイム↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943866/5a945156-b3de-9764-877b-7a68830b954a.png)

↓5回連続で実行を行った時のタイム↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943866/31e4a45d-3adf-72d8-a069-9a4353018f68.png)

↓処理の順序を逆にした時のタイム↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943866/5b3cbeac-8624-074a-86ad-239ff3cf083f.png)


## 5.考察・感想
### 考察
今回のプログラムから、
**・連続で実行を行うと処理が遅くなる**
**・0.02秒の差が生まれることもあれば、その半分にも満たない差しか生まれないこともある**
**・処理の順序を逆にしても処理時間は変わらない**
という三つの結果が得られました。
ですが、いずれの結果も
### int型の変数がchar型の変数の処理速度を上回っていた

という共通点がありました。
では、なぜint型のほうが速いのか？それについて私なりに考えてみましたが、残念ながら「int型を主として作られているから」程度の考えしか浮かびませんでした...。
考察らしい考察はできませんでしたが、次回記事を書く機会があればこのことについて追及してみたいです。
### 感想
まず、今回初めてQiitaを使用して記事を書いたので、そのことについて少し述べようと思います。初めてQiitaを使用しての感想を一言で表現するならば、ずばり！「楽しかった！！」です。今まで苦手分野だと思っていた自分の考えを文字に起こすという作業が思いのほかスムーズに進み、記事を書くことの楽しさに気づきました。
また、プログラムについては、冒頭にも書いてある通り、私はtime.hを用いてプログラムを組んだことがありませんでした。ですが、今回time.hを使用したことで、C言語で時間を計測することが可能であるという知識を得ました。
さらに、以前から気になっていた処理時間の違い（誤差レベルではありましたが）についても知ることができ、スッキリしました。
## 6.最後に
最後に、ここまで記事を読んでいただきありがとうございました！
もしこの記事が気に入っていただけたらフォロー、goodボタンを押していただけると幸いです。
それでは、またどこかで　( ˙꒳​˙ )ﾉｼ
#
以下、参考にさせていただいたサイト：

[C言語 標準ライブラリ] time.hの使い方
https://captain-cocco.com/time-h-c-standart-library/
clock() — プロセッサー時間の判別
https://www.ibm.com/docs/ja/i/7.3?topic=functions-clock-determine-processor-time
Google Workspace Administrator 学習メモ：その3

# 学習メモ

1. セキュリティセンター
    - 利用する組織のアカウントに関するセキュリティ状況の可視化、調査、対処に役立つツールセット
    - 利用可能なエディションは Enterprise と一部の Education(Standard、Plus)
    - セキュリティダッシュボード、調査ツール、セキュリティの状況ページ が主な機能
        - セキュリティダッシュボード
            - セキュリティレポートの視覚化
            - ファイルの共有情報や認証されたメール数、ユーザーログイン試行回数などをレポート可能
        - 調査ツール
            - セキュリティとプライバシーに関する問題を調査することができるツール
            - デバイスに関連するデータやメールコンテンツ、ログデータへのアクセスなどへアクセス可能
        - セキュリティの状況ページ
            - 利用サービスのセキュリティ設定(ステータス)の確認ページ
            - Gmailやドライブ、デバイスなどの各種設定のセキュリティ状況を確認可能
:::note info
参考
[セキュリティ センターについて](https://support.google.com/a/answer/7492003?hl=ja)
[セキュリティ ダッシュボードを使用する](https://support.google.com/a/answer/7492330?sjid=12188760564541109689-AP)
[セキュリティ調査ツールについて](https://support.google.com/a/answer/7575955)
[セキュリティの状況ページを使ってみる](https://support.google.com/a/answer/7491656)
[Google Workspaceのセキュリティセンターを解説](https://blog.g-gen.co.jp/entry/google-workspace-security-center-explained)
:::


1. コンテキストアウェアアクセス
    - ユーザーのデバイスが組織の IT ポリシーに準拠しているかどうかなどに基づいて、そのユーザーがどのアプリにアクセスできるかを制御することが可能
    - 利用可能なエディションは Enterprise と一部の Education(Standard、Plus)
    - ユースケース
        - IP アドレスの適用
        - デバイスポリシーの適用
        - 管理対象の Chrome ブラウザの適用
:::note info
参考
[コンテキストアウェア アクセスの概要](https://support.google.com/a/answer/12645308?hl=ja)
:::

1. メール関連のセキュリティ機能
    - セキュリティサンドボックス
        - メールに添付されている不審なファイルがマルウェアか否かを検査可能
    - 検疫
        - 受信者への配信前に、管理者や組織内の他のユーザーがメールを審査可能に
           → 誤送信、情報漏洩、迷惑メール防止に役立つ
    - TLS 強制
        - 管理者権限で設定可能
    - 許可リスト、拒否リスト、承認済み送信者リスト
        - 許可リスト：自組織のドメインへのメール送信を承認している IP アドレスのリスト
        - 拒否リスト：自組織またはドメインへのメールの送信をブロックするメールアドレスのリスト
        - 承認済み送信者リスト：自組織へのメールの送信を承認する信頼できるユーザーのリスト
          → 承認済み送信者リストのユーザーからのメールは Gmail の迷惑メールフィルタをバイパスし、受信者がそれらを迷惑メールかどうかを自分で判断できるようになる
:::note info
参考
[Gmail の詳細管理](https://support.google.com/a/topic/2683865?hl=ja&ref_topic=10012113&sjid=12188760564541109689-AP)
[有害な添付ファイルを検出するルールを設定する Gmail のセキュリティ サンドボックス](https://support.google.com/a/answer/7676854?sjid=17675489710472754894-AP)
[Quarantine email messages](https://support.google.com/a/topic/14174989?hl=ja&ref_topic=2683865)
[安全な TLS 接続でメールを送信する](https://support.google.com/a/answer/2520500?hl=ja&ref_topic=2683828)
[許可リスト、拒否リスト、および承認済み送信者](https://support.google.com/a/answer/60752?hl=ja)
:::

1. 暗号化
    - デフォルトで暗号化される
    - セキュリティ要件により独自の暗号鍵による暗号化が必要な場合は、クライアントサイド暗号化(CSE)を利用可能
        - 利用可能なエディションは Enterprise Plus と一部の Education(Standard、Plus)
:::note info
参考
[ユーザーのデータに対してクライアントサイド暗号化を使用する](https://support.google.com/a/topic/10742486?hl=ja&ref_topic=7556782&sjid=12188760564541109689-AP)
:::
Pythonでおしゃれな進捗バーを作る

# はじめに
実行に長時間かかる処理で`logger`や`print`を使って進捗を表示することがあるかと思いますが、代わりに進捗バーを表示することで、より直感的に処理の進行状況を視覚的に確認できます。
本記事では進捗バーを作成するのに便利なライブラリ**tqdm**を使って、簡単に進捗状況を表示する方法を紹介します。


# tqdmとは

**tqdm**はPythonで進捗バーを簡単に表示するためのライブラリで、名前の由来はアラビア語(taqadum, تقدّم)で進行という意味だそうです。

tqdmのドキュメントはこちら

https://tqdm.github.io/

## tqdmの導入方法

**tqdm**を使用するためには、まずインストールが必要です。
以下のコマンドを使って簡単にインストールしましょう。

```bash
pip install tqdm
```

## tqdmの使い方

**tqdm**は反復処理の前に`tqdm()`をラップするだけで、進捗バーを表示することができます。例えば、以下のように使います。

```python
from tqdm import tqdm
import time

# tqdmで進捗バーを表示
for i in tqdm(range(100)):
    time.sleep(0.1)
```

今回はサンプルでrange(100), time.sleep(0.1)を使っていますが、実際に進捗バーを表示したい処理に適宜置き換えてください。

以下は実際に動作させている光景です。

![2024-12-1422.10.26-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/dcf5cc90-b9fe-ec9a-0589-e71ec6493387.gif)


### tqdmのオプション
`tqdm`はデフォルトで非常に便利な進捗バーを提供しますが、いくつかのオプションを使うことで自分好みのカスタマイズが可能です。
今回はそのオプションの一部を解説してみます。
- desc: 進捗バーの前に表示する説明文を指定します
- ncols: 出力メッセージ全体の幅を指定します
- colour: 進捗バーのカラーを指定します(例: "#00ff00")
- ascii: 進捗バーを埋める文字やブロックを指定します

### カスタマイズしたサンプルコード

```python
from tqdm import tqdm
import time

# tqdmで進捗バーを表示
for i in tqdm(range(100), desc="カスタマイズしたよ", ncols=80, colour="#00ff00", ascii="-="):
    time.sleep(0.1)
```
以下は実際に動作させている光景です。

![2024-12-1422.31.38-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/e074d5a1-b640-9f31-f924-dddbcce1689c.gif)

**desc**で進捗バーに説明が追加
**ncols**で進捗バーの幅がコンパクト化
**ncols**で進捗バーに色を変更
**ascii**で`-=`が進捗バーを埋める文字が変更
されていることがわかります。
色や進捗バーを変えると一気におしゃれになりますね！

## まとめ
今回はPythonで進捗バーを作成するための便利なライブラリ**tqdm**を紹介しました。
自分好みのカスタマイズにすることで退屈な長時間の処理を少しでも楽しく感じることができると思います！
ご拝読いただきありがとうございました🐈‍⬛
Philips Hueで遊んでみた

この記事は[技術チャレンジ部アドベントカレンダー2024](https://qiita.com/advent-calendar/2024/challenge_club)の14日目の記事です。

## Philips Hueの紹介

Philips Hue LEDテープライト ライトリボンプラス 2 mを買いました。

https://www.philips-hue.com/ja-jp/p/hue-white-and-color-ambiance-lightstrip-plus-base-v4-2-meter/8718699703509

これ単体とスマホとでBluetooth接続して操作できるのですが、PCや音楽ストリーミングサービス経由で制御したかったのでブリッジも買いました。ちなみに合わせて2万円しました。~~たっか~~

https://www.philips-hue.com/ja-jp/p/hue-bridge/8719514342460

HueブリッジをWi-Fiに接続すると、ネットワーク経由でライトを制御できます。

Hueブリッジのセットアップにはスマートフォンが必要ですが、セットアップが完了するとPCのアプリからも接続できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25047/da653521-4340-b625-ad71-f42849f0f811.png)
PCのアプリで4つのモードに設定できる。

Hueブリッジ + ライトリボンでできることは[公式サイト](https://www.philips-hue.com/ja-jp)を見て頂くと分かるのですが、せっかくなのでデモ動画を用意しました。これはSpotifyと連携させたときの様子です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/27whYnXg3L0?si=ykDXH-L9hn_hqNrq" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

（著作権の都合上音楽は載せられなかったのですが）音楽と同期して光っている様子が分かります。

次にPCのアプリでビデオモードに設定したときの様子がこちら。

<iframe width="560" height="315" src="https://www.youtube.com/embed/d3YTH7yMYKk?si=SEoneD2YNnR4RChC" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

元動画はこちら。

[【3D LIVE】げまずえでぃしょん!!!!【#ホロゲマズ結成記念LIVE2024】
](https://www.youtube.com/watch?v=qIbjRU2Mo8I)

素晴らしい体験ですね。~~2万円払って良かったことにしておきましょう~~

## APIで操作する

Postmanを使ってAPIで操作してみます。まずスマートフォンのHueアプリでHueブリッジのIPアドレスを取得します。次にPostmanでPOST `http://{{ip}}/api` のリクエストを作成し、Bodyに適当なJSONを入れます。

```json
{
    "devicetype": "Postman"
}
```

![スクリーンショット 2024-12-14 222749-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25047/b7b5cbaa-d4a3-66e3-9969-b139c6ab762d.png)

`username` が返ってくるので変数に設定します。GET `http://{{ip}}/api/{{username}}/lights` のリクエストを送信するとライトの状態が返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25047/5071e303-1cf8-e9b3-151f-c56b109b8e22.png)

`bri` と `hue` 、 `sat` を設定すればいいっぽいです。POST ` http://{{ip}}/api/{{username}}/lights/1/state` に適当なJSONを送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25047/85db57ec-4f9d-2a3e-1c1c-18590b2fce4d.png)

![PXL_20241214_134921394.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25047/6b89a449-98a9-9fd2-3d38-1aa80fa97e21.jpeg)

hueを0にしたので赤くなりました。

これを応用すれば[MIDIコントローラーでライトを操作する](https://developers.freee.co.jp/entry/asobiba-hue)などもできますが、今日はもう時間がないのでこの辺にしておきます。
ABC384をPythonで（A～E）

トヨタ自動車プログラミングコンテスト2024#12（AtCoder Beginner Contest 384）の解答等の速報的まとめ

https://atcoder.jp/contests/abc384



# A問題
https://atcoder.jp/contests/abc384/tasks/abc384_a

c1と一致しなかったやつをc2に置き換える
```python:A
n, c1, c2 = input().split()
s = input()

ans = []
for s_i in s:
    ans.append(c1 if c1 == s_i else c2)

print(*ans, sep="")
```

# B問題
https://atcoder.jp/contests/abc384/tasks/abc384_b

問題文の通り
```python:B
n, r = map(int, input().split())

for _ in range(n):
    d, a = map(int, input().split())
    if d == 1 and 1600 <= r <= 2799:
        r += a
    elif d == 2 and 1200 <= r <= 2399:
        r += a

print(r)
```

# C問題
https://atcoder.jp/contests/abc384/tasks/abc384_c

全参加者のスコアを計算してソートする
```python:C
p = list(map(int, input().split()))

data = []
for bit in range(1, 1 << 5):
    name = ""
    score = 0
    for i in range(5):
        if bit >> i & 1:
            name += chr(ord("A") + i)
            score += p[i]
    data.append((-score, name))

data.sort()
for _, name in data:
    print(name)
```

# D問題
https://atcoder.jp/contests/abc384/tasks/abc384_d

根本は尺取り法
複数回Aを跨ぐと尺取りはうまくいかないので、事前に合計でmodを取って端の部分だけ尺取りを行えばいいようにSを小さくする
```python:D
n, s = map(int, input().split())
a = list(map(int, input().split()))

if s >= sum(a):
    s = s % sum(a)

a += a

left = 0
sum_a = 0
for right in range(n * 2):
    while left < right and sum_a > s:
        sum_a -= a[left]
        left += 1
    if sum_a == s:
        exit(print("Yes"))

    sum_a += a[right]

print("No")
```

# E問題
https://atcoder.jp/contests/abc384/tasks/abc384_e

自身に隣接するスライムをheapqで管理して、小さいほうから吸収できるか確かめていく
```python:E
from heapq import heappop, heappush

h, w, x = map(int, input().split())
p, q = map(lambda x:int(x) - 1, input().split())

field = [list(map(int, input().split())) for _ in range(h)]

check = [[False] * w for _ in range(h)]
check[p][q] = True
power = field[p][q]
heap = []
for i, j in [(p, q + 1), (p, q - 1), (p + 1, q), (p - 1, q)]:
    if 0 <= i < h and 0 <= j < w:
        heappush(heap, (field[i][j], i, j))
        check[i][j] = True

while heap and heap[0][0] * x < power:
    p_i, x_i, y_i = heappop(heap)
    power += p_i
    for i, j in [(x_i, y_i + 1), (x_i, y_i - 1), (x_i + 1, y_i), (x_i - 1, y_i)]:
        if 0 <= i < h and 0 <= j < w and not check[i][j]:
            heappush(heap, (field[i][j], i, j))
            check[i][j] = True

print(power)
```
Sequence Makerでたくさん測定してみる

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerを使うと様々な計測器を使って効率よく測定することができます。特に大量のデータを取得したいときなどにはとても便利です。この記事では繰り返し測定をする場合のコツを紹介します。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 測定値を取得する通信コマンド
測定値を取得する通信コマンドは測定器によって異なります。詳細は通信取説を確認するのが一番ですが、大体以下のようなコマンドで取得するケースが多いです。PDF取説などでコマンドを調べるときの検索ワードとして覚えておくと良いです。

```
:READ?
:MEASure?
:FETCh?
```

あと、測定値の取得と密接に関係しているのがトリガーコマンドです。例えば以下のようなコマンドです。

```
*TRG
:TRG SGL
```

これらは「トリガーシステム」というものを理解しないとなかなか使いこなせないです。ただし測定器によっては「トリガーシステム」がめちゃくちゃ複雑だったり、理解しにくかったり、マジわからん！となることが多いので、そんな時は大体測定器メーカーがシンプルな測定のためのサンプルコードを（VBAとかC#とかPythonとか）をネットで公開してくれていたり、通信取説内に掲載してくれたりするので、それらのコマンド部だけを抜き出してExcelのシートに書けば、大抵はいい感じに動くと思います。

例えば、AgilentのE4980A プレシジョンLCRメータのオペレーションマニュアルにはこんな感じのサンルコードが掲載されています。

https://www.keysight.com/jp/ja/assets/9018-06158/user-manuals/9018-06158.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/cb6efe38-a7a1-2fce-059c-2956e5ac890d.png)

こういうのを見れば、最初に初期セットアップで本体設定やらトリガー設定をしておいて、あとは「FETCh?」を送れば、測定器が読み出せるんだな、とういのがすぐにわかります。なお、この例では繰り返し測定のためにFor～Next文でぐるぐると回していますが、Sequence Makerでやる場合は無理にループを作らずに、素直に「FETCh?」を測定回数分並べてしまったほうが楽です（セルのコピペ万歳！）


## 実際に書いてみる
せっかくなので上記のE4980AのサンプルコードをExcelのシートに書いて、Sequence Makerで測定値を取得してみましょう。こんな感じになります。10回測定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/a7a64a2f-a229-6e2c-3a5c-89f48b718237.png)

<details><summary>コピペ用</summary>

#Setup Start
*RST;*CLS
FORM ASC
APER LONG,5
TRIG:SOUR BUS
COMP ON
INIT:CONT OFF
INIT:IMM
TRIG:IMM
#Meas Read
FETCh?

</details>

## 繰り返し回数を設定してみる
先ほどの例で、さらに10回測定を1セットとして、10セット測ってみます。そのような場合はコントールの「繰り返し回数」を10回にすればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/4534985c-7591-4bcb-4212-b26345ed9d4d.png)

繰り返し回数を10回にして「コマンド送受信」ボタンを押すと・・・ほらできた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/7c47edb9-d8a3-b8d6-047c-087bace6d2f9.png)

なお、繰り返し回数は「#COUNT?」コマンドで取得できるので、「FETCh?」する前に入れておくと、何セット目のデータなのかがすぐにわかって良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/1e8b6848-8e60-f828-94e8-85a0f80b07f2.png)

ちなみに「#Setup Start」のセルからスタートすると、最初の初期設定の部分も10回処理されてしまいます。もし、測定**だけ**を10回やりたいなら「#Meas Read」のセルを選択した状態でスタートすればOKです。

## まとめ
今回はSequence Makerで繰り返し測定する方法を紹介してみました。この他にも、#JMPコマンドを組み合わせて、自分で繰り返しのループを作る方法もありますが、少し複雑になるので今回は省略します。ぜひSequence Makerを使って測定器からたくさんのデータを取得してみてください！
共働き育児生活1年目の振り返りと工夫

:::note info
この記事は[mediba Advent Calender 2024](https://qiita.com/advent-calendar/2024/mediba)の16日目の記事です。
:::

# はじめに

こんにちは。medibaでバックエンドエンジニアをやっている者です。

私の家庭では、昨年子どもが誕生しました。
そして今年は、子供が保育園に通い始め、妻が職場に復帰するという、生活スタイルががらりと変わった1年でした。そんな1年を簡単に振り返りたいと思います。

# 家族構成

- 私
- 妻
- 犬
- 子(1歳・保育園1年生)

犬と子がいるおかげでかなり賑やかです(笑)
主に私が朝保育園に送り、夕方のお迎えは妻が担当するという分担で毎日を過ごしております。

# 今年をざっくり振り返る

子は、今年の4月から保育園に通い始めました。

通い初めの頃は常に何かしらの病気にかかっていることがほとんどで、それが親にも移ることが多かったです。
毎日早寝早起きで、休日は公園なりショッピングモールなりに出掛けるので1日1万歩前後は歩くので、かなり健康的な生活を送れているはずなのですが、私自身、誇張なしにこの1年弱で数年分の風邪を引いた気がします...笑

また、同時に自分の学習や趣味の時間を確保する難易度も上がりました。

というわけで、体調と時間確保の面で工夫していることをつらつらと書いていきたいと思います。

# 工夫しているポイント

## 体調編

毎日の早寝早起きに加え、家の中では手洗いマスクを徹底していても風邪をしょっちゅう引いていたのですが、[免疫ケア](https://www.imuse-p.jp/plasma/oishii-meneki/)を毎日飲むようにしてから、明らかに風邪を引く回数が減りました。引いたとしても、比較的軽症で済むことが多いです(単に耐性がついたというのもありそうですが)

お財布事情的に、少し前からサプリメント形式の[免疫サポート](https://www.fancl.co.jp/healthy/meneki/index.html?srsltid=AfmBOooDOOW-btuRFB67_XI6gUNzeC4V5KrF_FUxPzH_XGrDeHIZOCZa)に切り替えましたが、変わらず(ほぼ)健康に過ごせています。

## 時間確保(と自己研鑽)編

寝かしつけ後の時間を自分の時間に充てられるようにしております。

そのために始業前の時間を使って、家事タスクをできる限り終わらせるようにしております(気合いで)。これはリモートワークだからできることなので、本当にありがたいです。

また、以前のようにパソコンと長く向き合える時間を確保することは難しくなったので、手を動かさずに目で学習を進められるような本や技術記事を使ってインプットしたり、資格試験の勉強を行うことが多いです。

資格については、主に基礎＋インフラ領域のスキル向上を目的に、基本情報技術者とAWS SAAを取得しました。どちらも書籍やネットにある問題演習メインで対策できるものだったので、細切れの時間でも学習を進めることができました。

技術記事については、読みたい技術記事をストックして、読むタイミングでランダムで記事を選定してくれる[LINE Bot](https://line.me/R/ti/p/@235ogljw?ts=06071057&oat_content=url)を作ったりして、少ない時間でも効率良くインプットできるように尽力してます。
このLINE Botを作ったことで、読みたい記事を貯める箇所がスマホやPCのブラウザタブやメモ帳だったり、はてなブックマークのあとで読むだったりと散らばってしまう＋どれを読むか選ぶ時間が惜しいという課題を多少は解決することができたかなと思います。

# さいごに

最後まで読んでいただき、ありがとうございます。

現在medibaでは、一緒に働けるメンバーを募集しています。
ご興味ある方は、お気軽にお問合せください。
採用サイト：https://www.mediba.jp/recruit
SharePointエージェント使ってみた【Copilot Agent】

# SharePointエージェント使ってみた

最近、SharePoint に「エージェントを追加する」ボタンが新たに登場しました。今回は、このエージェント機能を実際に試してみたので、どのようなものなのかを簡単にまとめてみます。

---

## **1. エージェントの追加ボタンが登場**

まず、SharePoint サイトの「新規」ボタンをクリックすると、従来のリストやページの追加に加えて、「エージェント」という新しいオプションが表示されるようになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/2d95460f-a6d0-2a2a-ad83-db6cfe6848de.png)


「エージェント」の横に目立つ「新規」ラベルが付いており、試してほしい感が出ています。

---

## **2. エージェントを追加すると何が起きる？**

エージェントを追加してみると、「何か特別なものが始まるのかな？」と思いきや、右側に Copilot がパネルとして登場します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/cc826aeb-be8c-07d3-b8f4-f1a42b7f6fb3.png)


このパネルでは、以下のような推奨プロンプトを提供してくれます。

- **Summarize any key highlights**  
  資料やデータの重要なポイントをまとめてくれる。
  
- **これらのリソースに基づいて FAQ を作成してください**  
  ドキュメントやリストから FAQ を生成する。

- **これらのリソースを使用するにはどうすればよいですか？**  
  使用方法を説明してくれる。

「エージェント」という名称ですが、実態は Copilot が提供するサポート機能の追加、と言った感じですね。

---

## **3. Copilot ボタンが追加されるだけ？**

結局のところ、エージェントを追加しても、「SharePoint サイト内に何か新しいオブジェクトが作られる」というよりは、**右側に Copilot 機能を有効化するボタンが現れる**、ということでした。

リストやページを追加するような具体的なコンテンツの作成ではなく、**Copilot を使うか使わないかを切り替えるためのボタン**といった感覚に近いです。

---

## **4. 従来の追加機能と違う視点**

SharePoint サイトのホームでは、リストやページ、ニュース投稿などのさまざまな要素を追加できます。一方で、このエージェント機能は、これまでの「具体的なコンテンツを作る」方向性とは少し異なる印象を受けました。

「有効にするか、無効にするか」という設定要素の追加に近いかもしれません。

---

## **5. まとめ**

今回のエージェント機能の追加により、SharePoint での作業を Copilot がより積極的にサポートしてくれるようになります。ただし、このエージェント自体が新しいコンテンツを作成するものではなく、**Copilot を活用するためのインターフェースを提供する**という位置づけのようです。

「どんな場合にエージェントを使うのか」「具体的にどう業務が効率化するのか」を考えながら、今後さらに活用方法を探っていきたいと思います！
寿司打を極めたい

この記事は[群馬高専 Advent Calendar 2024](https://adventar.org/calendars/10444) 14日目の記事です。

# 寿司打と僕の挑戦記録
タイピングゲームにハマったことはありますか？  
世界中が今、夢中になっているのは「**寿司打**」というゲーム。  
流れてくる寿司ネタ???を、いかに素早く正確に打てるかを競うシンプルなゲームですが、その奥深さは侮れません。

## 壁
僕の現在の記録は5回/秒
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757883/7c78ef28-862e-2143-dbe2-d52f2361fce6.png)

ランキング上位のプレイヤーたちのスコアを見ると、まだまだ遠い存在。  
「もっと速く…もっと上達したい！」  
そんな向上心が沸き起こり、何度も練習を繰り返しましたが、どうしても壁を突破できませんでした。  
このままでは終われない――。  


## チートツールの開発
というわけで僕は**チートツール**の開発を始めました。  
仕組みは至ってシンプル：  
1. **画面に流れる文字**を画像としてリアルタイムで認識する。  
2. 認識した文字をそのまま**自動でタイピング出力**する。  

ツールは見事完成！  
そして試しに実行してみると
![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757883/7474b5ed-cabe-f99e-2685-70ea0faa5e6c.gif)


自分でも思わず笑ってしまうほどのスピードでした。  
寿司打の画面はもはやタイピングというより、流れる文字を次々と飲み込む機械のように変貌していました。  
「これが本当の寿司打だ！」

## 禁断の利用規約
しかし、ふとある疑問が頭をよぎります。  
「これって、ルール的には大丈夫なのか？」  
そこで寿司打の利用規約を確認してみると、そこには冷たく響く一文がありました。  

> **３．サーバに過度な負荷をかけたり、サイト運営の妨げや他のユーザの迷惑になるような行為、サイトの趣旨に反するような外部ツール、プログラムの使用は禁止します。**  

その瞬間、僕は自分が手に入れた「速さ」が、本当になにも意味がないことを理解したのです。  

## 気づきと反省、そして次の目標

寿司打が求めているのは、純粋に「自分のタイピング力」 
これからは改めて自分の力で挑むことを決意しました。  
努力を積み重ねて、少しずつ自分の限界を超えていこうと思います。
Private Linkでハマった話


# はじめに
Private Link with Azure Virtual Desktopの検証してみていた時のことです。（Private Link自体触るのは初めて）

公式ドキュメントやブログを参考に進めていたのですが、中々うまくいかなかった時の体験を記事にしました。

# 前提

#### ネットワーク

プライベートIPで接続

https://qiita.com/yuyanz/items/ac88f795b29faf92753d

#### ADサーバ

Entra IDについては
Azure上にADサーバを立てて、Entra Connectしました

https://qiita.com/yuyanz/items/69f38e80c798b1caf16f

#### AVDデプロイ

https://qiita.com/yuyanz/items/ee09866011b75644fadc

# Private Link 設定をしてみる

https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-overview

https://learn.microsoft.com/ja-jp/azure/virtual-desktop/private-link-setup?tabs=azure%2Cportal%2Cportal-2

上記を元に設定したものの、アプリからアクセス出来ないと言われました。

そこで、該当のFQDNが名前解決されているかをプライベートdnsのレコード一覧から調べて手元のPCからコマンドプロンプトnslookupで確認。

何故かプライベートIPでなく、パブリックIPに名前解決されていました。

# DNS問題を解決する

AVDのドキュメントをいくら見ても解決しそうになかったので、Private Linkを勉強していくと下記を発見

https://learn.microsoft.com/ja-jp/azure/private-link/private-endpoint-dns-integration

簡潔にまとめると下記のような感じです。
・　Azure DNSで名前解決する必要がある
・　Azure DNSはAzure上からのリクエストにしか応答しない
・　オンプレからAzureDNSに名前解決してほしいならAzure上にDNSフォワーダが必要

ということで、DNSフォワーダが無かったのでうまくいかなかったようです。　

私の場合はAzure上にADサーバがあったので、手元のPCのDNSをAzure上にADサーバにして、ADからAzure DNSへフォワードさせることでうまくいきました。

無事、AVDの設定からパブリックルートを閉じて仮想デスクトップが表示されました！

# 補足

手元のPC⇒Azureのvnetの通信がうまくいかない場合
コマンドプロンプトで「route print」して、ルートテーブルを確認後
ルーティングを追加しないと疎通できない場合があります。

ルーティング追加コマンド
~~~
route ＜オプション＞ add ＜宛先＞ mask ＜ネットマスク＞ ＜ゲートウェイ＞ 
~~~

例：route -p add 10.10.10.0 mask 255.255.255.0 192.168.0.1
※-pはPCをシャットダウンしてもルーティングが残るオプション
※add後はAzureのVnetサブネットを指定することになります。
【UiPath】無くそう！「プレビューイメージを利用できません。」

あちらこちらでちらほら見かける「プレビューイメージを利用できません。」の表示。
UiPathではターゲット指定時に自動的にプレビューイメージを作成してくれるが、プレビューイメージの元となる画像ファイルが何らかの理由により失われていると「プレビューイメージを利用できません。」と表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/5cd6c6d9-0cdb-52d4-ec5a-ba303de9de07.png)

この状態でもワークフローの動作自体に問題はないが、やはりソースの可読性は落ちるので、プレビューイメージは表示できるようにしておきたい。

# 原因1：別のプロジェクトからxamlだけコピーした
よくあるのは別のプロジェクトからxamlだけコピーしているケース。単にWindowsのエクスプローラーでコピーペーストするだけだと画像がついてこず、「プレビューイメージを利用できません。」と表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/a99ee43a-6331-53c6-1aa4-fadb1fc5e43a.png)

## 対処1-1：「ファイルをインポート」を使ってコピーする
別のプロジェクトからxamlを持ってきたい場合は、プロジェクトパネルで右クリックして「ファイルをインポート」を選び、対象のxamlをインポートする。この方法であればプレビューイメージの画像も同時にコピーしてくれるので、「プレビューイメージを利用できません。」になることはない。ついでに依存関係の差もチェックしてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/74c76f4f-2de7-5aec-4cb9-a18b6865755f.png)

## 対処1-2：「.screenshots」も一緒にコピーする
既にコピーしてしまった等の場合は、コピー元のプロジェクトの「.screenshots」下のファイルを全て選び、コピー先の同フォルダに貼り付ける。この方法でも元のプロジェクトと同じプレビューイメージを表示させることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/0e3c03a0-e7ec-04f0-34c2-dae771c7253e.png)

全てコピーすると余計な画像ファイルもコピーすることになるが、「未使用を削除」機能で使っていない画像ファイルを一括で削除することができるため、あまり気にする必要はない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/1fe67599-2d60-6cde-01ab-a0823688d3db.png)

# 原因2：Windowsの標準機能で圧縮・解凍した
Windowsの標準機能でフォルダを圧縮してZIPにする場合、「ドットから始まるフォルダが複数ある場合、2個目以降のフォルダがzip化ファイルに格納されない」という仕様がある。
前述の通りプレビューイメージの画像は「.screenshots」フォルダに保存されているため、Windowsの標準機能で圧縮→解凍するとプレビューイメージも全て失われる。

https://qiita.com/Davoi/items/5fbb9e2bd8928456340c

## 対処2：Windowsの標準機能で圧縮しない
圧縮前のプロジェクト一式が残っていれば、「.screenshots」フォルダを丸ごとコピーすることで回復できる。そうでなくZIPしか残っていない場合はプレビューイメージを取り戻すことは難しい。ZIP化する際はWindowsの標準機能以外を使おう。

# 動作環境
UiPath Studio 2025.0.157
米田の補題 #1 なにそれ美味しいの？

![qiita 用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/d623abc6-b235-7906-892f-fe613b76bb05.png)
# 米田の補題は、圏論でもっとも重要な定理です
圏論は、数学の基礎理論です。いままで、[万物の理論](https://amzn.to/3ZLmCJH)
といわれていましたが、[数理科学 11月号](https://amzn.to/4iz6NgM)では、なんと　<font color="Red">万物・万事・万人</font>のための数学理論とまでいわれるようになりました

# 米田の補題を数学的に厳密な理解するのは非現実的です

Wikipedia を見ればわかるように理解不能です。<font color="Red">東大理学部情報科学科　4年程度の学力</font>が必要です。でも大丈夫

# 関係は内容よりも重要だ（川柳で理解）

米田の補題川柳として<font color="Red">体験的</font>に理解できます。
例をみてみましょう
<hr>

- (内容)　上司のXさんは、既婚者で夫婦です
- (関係) xさんの夫婦仲は悪いです
**※ xさんに、贈答品を贈るときに、奥さん宛にと言って贈るのはどうでしょうか？
関係のほうが重要でしょう。**
<hr>

- (内容)　近隣諸国には、A国、B国、C国があります
- (関係) B国は、友好国がどうかわかりません
**※友好国かどうかわかったほうがいいでしょう**
<hr>

- (内容) 高市早苗さんは有名人です
- (関係) 高市早苗さんとは関係がありません
**※関係はつくればいいでしょう**
![XbJall9c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/6921b932-88fe-3625-a516-281bc7040b7d.png)

[高市早苗さん　米田の補題（ よねだのほだい ）をぜひ担いでください！](https://x.com/zanjibar/status/1838224621881147505)
関係ない有名人とも関係をもてます。4.3万件の表示で、私のつぶやきではじめての表示回数です。


# 米田の補題は、おいしいかもと体験的に理解できましたか？

# このAdventCalendar の目的
米田の補題をプロジェクトマネジメントに応用することを目的としています。さて
**米田の補題川柳 を更につくりました**

- プロセスはコンテンツより重要だ
- やる気こそ理解するより重要だ
- きめこそが理解するより重要だ
- こころざしあればなんとかなるものだ
- 説明は役に立たないそうだろう
- いちをしりじゅうをしるならさいこうだ
- 真実はどうでもよいかもそう思う
- 今ここではすぐやるのには大切だ
AWS Certified AI Practitionerを取得しよう

# はじめに
みなさん、AWSのAIサービスを使っていますでしょうか。
直近ではre:inventではBedrockの新モデルが発表されたりと、AWSでは生成AIに力を入れていることが伺えます。
そんなAIサービスの勢いがすごい中で、私からは今年度新しく追加されたAWSの認定資格について紹介できればと思います。


# 2024年度に追加された２つのAWS認定資格
既にご存知の方も多いと思いますが、今年はAWS認定資格として以下の2つの資格が追加されました。

![スクリーンショット 2024-12-14 19.20.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875356/5b34cab1-8a5e-1237-5c8a-f20c1c78162b.png)

こちらの２つの資格は、2025 Japan AWS All Certifications Engineersの受賞条件にも含まれております。
(Data Engineerまでが条件だと勝手に思っていたのは私だけではないはず...)

https://aws.amazon.com/jp/blogs/psa/2025-japan-aws-all-certifications-engineers-criteria/

特にAWS Certified AI Practitionerは基礎レベルの資格であるため、AI/MLについての知識獲得のために取得を目指しているかたもおられるかと思います。

# AWS Certified AI Practitioner（AWS AIF-C01）について
### 試験の概要
AIFは、人工知能 (AI)、機械学習 (ML)、生成 AI の概念とユースケースに関する需要の高い知識を実証する試験となっています。

- 受験対象者：AWSのAI/MLテクノロジーを使用するソリューションを熟知してはいるが、必ずしも構築するわけではないという個人
- 試験時間：90分
- 問題数：65問
- 合格スコア：700点以上

https://aws.amazon.com/jp/certification/certified-ai-practitioner/

### 学習に使用した教材
AIFは今年新しく出た試験なため、WEB問題集などではまだ未対応なところもありますが、AWS公式からの供給が豊富で、学習教材自体はある程度揃っていると思います。私が学習に使用した教材は以下となります。

- Udemy
AIFに対応した説明動画と問題集となります。いずれも説明や文字は英語になりますが、日本語字幕や日本語翻訳を使えば問題な意と思います。ハンズオンも多くなっており、サービスの理解が進めることができました。

https://www.udemy.com/course/aws-ai-practitioner-certified/?srsltid=AfmBOoqEUAtAIFUDRJTu9RR8917lTCHsr9tsSo58kBjowOr7J2iJ8BK7&couponCode=24T3MT120924

https://www.udemy.com/course/practice-exams-aws-certified-ai-practitioner/?couponCode=24T3MT120924

- AWSサービス別資料 (Blackbelt)
おなじみのAWS公式サービス別資料となります。AWS AI/MLサービスごとの機能が図などでまとめられており、試験対策としておすすめです。

https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all

- AWS Skill Builder
AWSが提供する学習用のサイトです。こちらも試験範囲のサービスを学ぶことができるので、対策にはおすすめです。

https://explore.skillbuilder.aws/learnby=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all

### 受験結果
ここまで、試験の概要やどういう教材を使って学習したかを簡単に紹介してきましたが、1ヶ月の学習期間を経て試験を受けた結果として、**無事合格することができました**。
(早期合格特典のEarly Adopterのデジタルバッジももらえました。)

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875356/ae172b53-ede4-806f-d9bc-2dfdef813777.png"> 
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875356/72d15907-96a4-02c1-3e97-c25c454aa751.png">

# 受験してみて
ANGEL Dojo中でも使用したBedrockなどのAWSの生成AIについて知ることができるため、勉強も楽しくできました。特にANGEL Dojo中は、ナレッジベースやエージェントといった要素を漠然とした雰囲気でしか捉えられていなかったので、そこが明確になったのが試験を受けて良かったと思える部分でした。あとは私の会社の中では、（おそらく）初の取得者になれたというところも良かった点かと思います。
ただ、この試験はFOUNDATIONALレベルの資格ですが、AWSに入門したばかりで挑戦するのは少しハードルが高いと感じました。というのも、試験範囲のAWSサービスだけでなく、AI全般の基礎知識についてもしっかり押さえておかないと回答が難しい問題も出題されるからです。今ならEarly Adopterのデジタルバッジの特典と並行して、再受験1回無料のキャンペーンもやっているようなので、生成AIに興味がある方はぜひ挑戦してみてください。

# おわりに
今回は今年新しく追加されたAIFの資格について紹介してみました。次は同じく今年追加されたMachine LearningのAssociateを取得に向けて、学習を進めていきたいと思います。
最後まで読んでくださりありがとうございます。
Salesforce 認定 Platform アプリケーションビルダー資格の更新 (Winter '25)をやってみた感想

今回の内容は動画でも解説しています

<iframe width="560" height="315" src="https://www.youtube.com/embed/94vc9vrENBA?si=DepabZvjx6EU4zmz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


こんにちは
今回はSalesforce 認定 Platform アプリケーションビルダー資格の更新 (Winter '25)をやってみたので感想を共有します

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-certification-maintenance-winter-25?trail_id=maintain-your-salesforce-certifications

これはSalesforce 認定 Platform アプリケーションビルダー資格保有者が資格の更新をするTrailheadとなります

## 資格更新対象者

まずはご自身のプロフィールを見てみましょう
このように
Salesforce 認定 Platform アプリケーションビルダーの資格を見てみて
更新期限 の更新期限: 2025年12月5日
と書いてある人は資格更新の対象者です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/88741192-2ff0-9bb3-1951-75cdeff18aae.png)


すでにこの認定 Platform アプリケーションビルダー資格の更新 (Winter '25)モジュールは完了していてもまだ
更新期限 の更新期限: 2025年12月5日
と書いてある人はWebassessorアカウントとTrailheadアカウントのリンクができていないなど何かしら問題が発生している可能性が高いのでSalesforceに問い合わせることをお勧めします


なお、資格更新がきちんとされた場合このようなメール通知が届きます



## 認定 Platform アプリケーションビルダー資格の更新 (Winter '25)モジュール 内容

内容は選択問題とハンズオンチャレンジです

選択問題は最近のTrailheadの仕様変更により何度も解きなおせるようになりました
もしも一度解いて復習をしたい人は「再受験」をクリックすれば解きなおせます

ハンズオンチャレンジは
・動的フォームの条件付き書式のハンズオンを実行する
として動的強調表示パネルを設定する内容です

問題文はこのように日本語になっているので何をすればいいか分かりやすいですね


>動的強調表示パネルを使用してハンズオンを実行しましょう。
セールスアプリケーションに移動します。
取引先責任者レコードのページを編集し、デフォルトはそのままにしておきます。
Name (名前): Contact Record Page (取引先責任者レコードページ)
API Name (API 参照名): Contact_Record_Page
標準の強調表示パネルを削除します。
[Fields (項目)] タブから動的強調表示パネルをドラッグし、動的強調表示パネルで [Name (名前)] がプライマリ項目として選択されていることを確認します。
動的強調表示パネルに以下のアクションボタンを追加します。
Edit (編集)
Delete (削除)
以下の項目を動的強調表示パネルにドラッグします。
Title (役職)
Account Name (取引先名)
Phone (電話)
Email (メール)
Contact Owner (取引先責任者 所有者)
Level (レベル)
保存して、組織のデフォルトとして有効にします。


では、ここで私なりにハンズオンチャレンジで躓いたこと　分かりにくかったこと　について説明します

## 分かりにくかったこと1 Playground作成時に環境が英語になっている

まず分かりにくかったこととしてPlayground環境を作成した際に環境が英語になっていることでした
（なお、ハンズオンチャレンジの一般的な解き方として新規Playground環境を作成して解くことをお勧めします）

英語のままでは解きにくいと思いますのでまずは日本語に環境を戻すことをお勧めします

なお、たまに日本語のままのPlayground環境の場合チャレンジが通らない場合がありますが、今回のハンズオンチャレンジは日本語の環境のままでもチャレンジは通るようです。

言語の設定変更や新規Playground環境作成をするべき　などTrailheadハンズオンチャレンジの注意点はこちらにまとめています


https://qiita.com/Takaa/items/9a4543b39c886fe2729a

## 分かりにくかったこと2 Lightningページ作成について

最初の文章で
>セールスアプリケーションに移動します。
と書いてありますが、いきなり「何をすればいいんだろう」と戸惑いました

要はLightningページを新規作成すればいいので、新規でLightningページを作成しましょう

## 分かりにくかったこと3 動的強調表示パネルの設定について
動的強調表示パネルの設定についてはこちらの記事でもまとめておきました

https://qiita.com/Takaa/items/ea87aeefe215e55b1ad6

## 分かりにくかったこと4 作成したLightningページのデフォルトの組織のデフォルトとして有効


組織のデフォルトは普段の業務でも躓くところですね

いくつものボタンをクリックしないと組織のデフォルト設定にできないので過去私はデフォルト設定をする手順をまとめてあったのでこの手順を元に設定完了ができました

https://qiita.com/Takaa/items/8a1b8abec0c7fb7e8a9e


とまあ、いくつか分かりにくい部分はございますが、落ち着いて取り組めば簡単に出来ると思います

ぜひまだチャレンジしてない人はチャレンジしてみてください。
SwiftUIで魅力的なショッピングカート追加アニメーションを実装する方法

## はじめに
SwiftUIでアニメーションを実装する練習として、今回は「ショッピングカートにアイテムを追加するアニメーション」を例に取り上げます。

## 環境
- Xcode 16.1
- Swift 6.0.2

## アニメーションのイメージ
ユーザーが「Add to Cart」ボタンをタップすると、アイテム（CircleのView）がアニメーションでカートに追加される動きを再現します。アニメーションの要点は、アイテムがボタンからカートへスムーズに移動することです。

![simulator.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63985/1346bc5b-78bc-c49c-7285-b09f96e7f7ed.gif)

## 実装のポイント

### 1. 座標を取得する
まず、アニメーションを実現するために、アイテムを配置する位置（座標）を正確に把握する必要があります。下記の記事を参考に、idを指定して座標を取得できるようにします。

https://zenn.dev/ueshun/articles/3ee837c881905e

```swift
struct CoordinatePreferenceKey: PreferenceKey {
    static var defaultValue: [UUID: CGRect] = [:]
    
    static func reduce(value: inout [UUID: CGRect], nextValue: () -> [UUID: CGRect]) {
        value.merge(nextValue(), uniquingKeysWith: { $1 })
    }
}

struct CoordinateModifier: ViewModifier {
    let id: UUID
    
    func body(content: Content) -> some View {
        content
            .background(
                GeometryReader { proxy in
                    Color.clear.preference(
                        key: CoordinatePreferenceKey.self,
                        value: [id: proxy.frame(in: .global)]
                    )
                }
            )
    }
}

extension View {
    func reportCoordinates(using id: UUID) -> some View {
        self.modifier(CoordinateModifier(id: id))
    }
}
```

このコードでは、`GeometryReader`を使用してビューの`CGRect`を取得し、それを`PreferenceKey`に保持します。呼び出す時は`reportCoordinates`を使って座標を取得できます。

### 2. 移動アニメーションの調整
取得した座標を基にアニメーションを実装します。しかし、このままだとSafeAreaが含まれた値になってしまい、位置がずれてしまいます。下記の記事を参考に、SafeAreaの値を取得しました。

https://stackoverflow.com/questions/57116723/how-to-access-safe-area-size-in-swiftui

`window`のSafeAreaを取得し、アニメーションの座標計算時にSafeAreaのtopを引いて調整しました。

### 3. まとめ
- **座標取得**  
  `GeometryReader`と`PreferenceKey`を使用して、Viewの座標を取得します

- **SafeAreaの考慮**  
  取得した座標を基にSafeAreaを調整し、アニメーションの位置がずれないようにします

### サンプルコード

https://github.com/t-osawa-009/StoreAppSample