OmniAICreator/Qiita-1.07M huggingface dataset:
C#の遅延実行の基本

## はじめに
遅延実行とは
プログラムの処理をすぐには実行せず、結果が必要になるまで「後回し」にする仕組み
どういうタイミングで実行されているのか、イメージしづらかったため、記事に起こして整理していく

## なぜ知っておくべか
メモリ効率の向上
大量のデータを扱う場合、すべてのデータを一度にメモリは読み込む必要がなくなり、必要な分だけ処理するため、メモリ使用量を抑えることができる

パフォーマンスの最適化
必要のない処理をスキップできる
例えば、最初の10件だけ必要な場合取得して、残りのデータは処理しないとか


## 遅延実行と即時実行
C#のLINQには今すぐ実行される「即時実行」と後から実行される「遅延実行」の2つのパターンが存在する

### 遅延実行
以下コードは遅延実行を使ったサンプルの実装
任意の配列で作られた数字がある
Where()を使って、偶数を取得して、それを表示させるというプログラム
Where()ではただ、「偶数を取り出す」という計画を作っただけで、実際の処理はforeachで使うときに実行される
```csharp:test.cs
var numbers = new int[] { 1, 2, 3, 4, 5 };

var evenNumbers = numbers.Where(n => n % 2 == 0);

// この時点ではまだ、フィルタリングは実行されていない

// フィルタリングが実行される
foreach (var number in evenNumbers)
{
    Console.WriteLine(number);
}
```


### 即時実行
ToList()をつけることで、フィルタリングされたものがすぐに実行され、反映される

```test.cs
// 即時実行
var evenNumberList = numbers.Where(n => n % 2 == 0).ToList();

foreach (var number in evenNumberList)
{
    Console.WriteLine(number);
}
```

## 遅延実行の仕組み
裏側ではC#の「イテレータ」という機能使われている

```csharp:test.cs
public static IEnumerable<int> GetEvenNumbers(int[] numbers)
{
    foreach (var n in numbers)
    {
        if (n % 2 == 0)
            yield return n; 
    }
}
```
このyield returnが遅延実行の鍵となる
foreachなどで値が要求されるたびに、次の条件に合う値を1つずつ返す
全ての値を一度に処理して配列を作るのではなく、必要なときに必要な分だけ処理する

実際に動きを確認出来る例
```csharp:test.cs
// 遅延実行の様子を視覚的に確認
var numbers = new[] { 1, 2, 3, 4, 5 };

Console.WriteLine("クエリ作成");
var query = numbers.Where(n => {
    Console.WriteLine($"Where: {n}を処理中");
    return n % 2 == 0;
});

Console.WriteLine("foreach開始");
foreach (var item in query)
{
    Console.WriteLine($"結果: {item}");
}
```

結果
>クエリ作成
>foreach開始
>Where: 1を処理中
>Where: 2を処理中
>結果: 2
>Where: 3を処理中
>Where: 4を処理中
>結果: 4
>Where: 5を処理中

Whereの処理がforeachの中で行われており、遅延実行がされていることが確認できる

## どういうケースで遅延実行を使うのか
1. 大量データを扱う場合
2. I/O操作（ファイルなど）の効率化

## どういう点を気をつけるべき
副作用
後から何か書き換えたりすることがある処理については、想定外の結果になるので気をつける
```test.cs
// 危険な例
int counter = 0;
var query = numbers.Select(n => counter++); // counterは後で増加

counter = 100; // ここでcounterを変更

// 実行されるのはここ - counterは100から始まる！
foreach (var item in query)
{
    Console.WriteLine(item); // 想定外の結果になる
}
```

## まとめ
遅延実行は「今すぐやる」というよりも、「必要になった時必要な分だけやる」という考え方
何も考えずにLINQを使っていると、思わぬところで想定外のことが起きるかもしれない
遅延実行を使った方がいいケース以外の時は、ToList()などを使って即時実行してた方が安全だと思った
【3分クラスタ講座①】クラスタってなに？（Pacemaker + Corosync）

## 目的

クラスタの概要を、クラスタ初心者に向けてざっくり説明することを目的としています。

## そもそもクラスタって何なの？

システムやサービスを止めないための、複数のサーバーで協力する仕組みのことです。

仮にサーバーが1台だけだと、ハードウェアの故障やOSがおかしくなったときに、提供しているサービス（Webサイト、データベースなど）に影響が出てしまいます。

そういったときに、「2台以上のサーバーで協力し合い、もしどれか1台に障害が起きても、自動的にもう1台に処理を引き継ぐ」という構成を作ります。これをクラスタと呼びます。

今回は、このクラスタを実現するためにLinuxではよく使われるPacemakerと Corosyncというソフトウェアを例にして説明します。

---

## この記事でわかること

* Pacemaker / Corosync の基本的な役割
* クラスタがどのように障害を検知し、リソースを守るのか

---

## Pacemaker と Corosyncってなに？

クラスタを構成する各サーバー（ノード）上で、PacemakerとCorosyncが連携して動作しています。

![概要図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56869/454a6940-f37f-4173-81cb-aff597cdc6e3.png)

* **Corosyncの役割:**
設定されたネットワークを通じて、お互いのノードに定期的に「生きてる？」という信号（ハートビート）を送り合います。 相手からの信号が一定時間途絶えると、「相手は停止した（または通信できなくなった）」と判断し、その情報をPacemakerに伝えます

* **Pacemakerの役割:**
Corosyncから受け取った情報や自身が管理するリソースの情報を保持し、障害時には自動的に別のサーバーへリソースを移動させたり、再起動したりといった復旧処理を行います


## 障害が起きると？

![障害時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56869/58d0edbe-adde-46cc-ba65-895bd10a5c07.png)




* **異常発生時の動作:**
もしNode1上のリソースに障害が発生した場合、Pacemakerはその障害を検知します。まずは同じノード上でリソースを再起動して復旧を試みます。
それでも復旧できなかった場合、Pacemakerはリソースを別ノード（Node2）へフェイルオーバーさせて起動し直します。
これにより、アプリケーションなどの重要なサービスを速やかに復旧し、停止時間を最小限に抑えることができます。

---

## まとめ
* **クラスタ：** 複数のサーバが協力してサービスを止めない仕組み
* **Pacemaker：** クラスタの管理者でありリソースの管理と障害時の復旧指示担当
* **Corosync：** ノード間の生存監視役であり、ハートビートで状態を把握しPacemakerに連携
【Salesforce】画面フローにてレコードを作成した際に自動的にリダイレクトはできない

〇結論
・画面フローを使用してレコード作成を行う際、Auraコンポーネントを使用して作成されたレコードへの自動リダイレクトを試みたが実現することができなかった

〇やりたかったこと
・リストビューや関連リストからレコードを作成する際、特定のレコードタイプを選択した場合のみ複数項目にデフォルト値を設定したい

〇試したこと
・項目デフォルト値設定：参照項目やName項目は設定不可のため却下
・アクションはリストビュー、関連リストに配置することができないため却下
・カスタムボタンを作成して画面フローにて初期値を設定する方針でデモ作成
→画面フローだけでは標準機能のようなレコード作成完了のメッセージとリダイレクトが再現できないため、以下サイトを参考にAuraコンポーネントを使用してローカルアクションを作成し、レコードへの自動リダイレクトとメッセージ表示を実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/c4b40356-22c2-4cef-8b8e-727ec2f3621d.png)
参考にしたサイト：https://qiita.com/DEKA_PIYO/items/85edf7804f15d056d738

→ただ動作せずサポートに確認したところ以下の通り回答あり
＞しかしながら下記資料に記載がございますようにリストボタンを利用した場合、リダイレクトやトースト表示といったローカルアクションが動作しないことを確認しております。
また、フロー完了後の遷移先を制御する方法として、リストボタン URL のパラメーターに [retURL] を追加いただく方法がございますが、こちらはフロー変数を使用することができないため、作成したレコードへリダイレクトを指定いただくことができかねておりました。
■参考資料
ローカルアクションを使用したフローユーザーのリダイレクト
https://help.salesforce.com/s/articleView?id=platform.flow_concepts_finish_override.htm&type=5

完了動作を制御するようにフロー URL をカスタマイズ
https://help.salesforce.com/s/articleView?id=platform.flow_distribute_internal_url_retURL.htm&type=5
--- 抜粋 ---
retURL パラメーターの値としてフロー変数を使用することはできません。
フロー変数を使用してユーザーを特定のレコードなどにリダイレクトする場合は、Visualforce を使用してフローを割り振ります。

→上記回答を踏まえ、レコード作成後にURLが表示される画面を作成しユーザに毎回URLを踏んでいただく手順をご提案
参考にしたサイト：https://qiita.com/Takaa/items/dd2d9dd4842ca6d7c602
Playwrightを対話形式で実行したい

Playwrightのテストコードを書く際に、対話形式(REPL)でPlaywrightコードを実行できると色々調査しやすいなぁ、と思っていたところ以下のリポジトリを見つけました。

https://github.com/marcusNumminen/playwrepl.ts

## セットアップ

1. リポジトリをクローンしてくる
    ```
    git clone https://github.com/marcusNumminen/playwrepl.ts.git
    cd playwrepl.ts
    ```
1. 依存ライブラリが軒並み古いので、自分が使っている@playwright/testのバージョンに書き換えつつ、他のOSSもアップデートしておきます([npm-check-updates](https://www.npmjs.com/package/npm-check-updates) を使うと楽ちん）
1. 依存ライブラリのインストール
    ```
    npm install
    ```
1. playwrightで起動するchromium のインストール
    ```
    npx playwright install chromium
    ```
1. 対話形式の起動（ブラウザが立ち上がり、対話形式が始まります）
    ```
    $ npm run playwrepl:node20 
    ```
( nodeのバージョンが20未満の場合は、`npm run playwrepl`)

## 利用方法

以下の変数が設定済みで、プロンプト上からは `this.xxx` で利用できます。

|変数名 | 説明 |
|------|-----|
| browser |  起動したブラウザに接続されているBrowser オブジェクト |
| context | 起動したブラウザに接続されているBrowserContext オブジェクト |
| page | 起動したブラウザに接続されているBrowserContext オブジェクト |
| expect | アサーションのための関数。参照: https://playwright.dev/docs/test-assertions |
| request | APIリクエストをするための関数。参照: https://playwright.dev/docs/api-testing |

### 簡単なデモ

[saucedemo.com](https://www.saucedemo.com/) (SauceLabから提供されているサンプルWebサイト） に対して、以下を実行していくと起動したブラウザ上で操作されていくのを確認できます。
もちろん、ブラウザを直接操作することも可能です。試行錯誤したいページまで手動で操作し、そこから`locator` を試すという使い方ができます。

```
-> void await this.page.goto('https://www.saucedemo.com/')
-> await this.page.locator('[data-test="username"]').fill('standard_user')
-> await this.page.locator('[data-test="password"]').fill('secret_sauce')
-> await this.page.locator('[data-test="login-button"]').click();
-> await this.page.locator('.inventory_item').count()
```


また、.load コマンドを使うことで、外部ファイルからスクリプトを読み込み実行することもできます。

```
-> .load scripts/sample.mts
void await this.page.goto('https://www.saucedemo.com/')
await this.page.locator('[data-test="username"]').fill('standard_user')
await this.page.locator('[data-test="password"]').fill('secret_sauce')
await this.page.locator('[data-test="login-button"]').click();
await this.page.locator('.inventory_item').count()
... 6
```

### 実行履歴

これまでの実行履歴は、`.history` ファイルに保存されてます。

### その他

注意点として対話形式内での `import` はうまくいかないようです（[参照](https://github.com/marcusNumminen/playwrepl.ts/blob/main/README.md#known-issues))。
とはいえ、このツールの主な利用用途しては、テストを書く際のブラウザ操作のトライ&エラーになりそうなため、あまり気にする必要はないと思います。


`playwrepl.mts` のファイルひとつで完結しており複雑でもないので、初期設定など自分用にカスタマイズして使うとかも有用です。
MCPって何ですか？→AI(エージェント)が「あらゆるシステム・サービスを」横断的に動ける統一ルールです。

色んな記事を読んで腑に落ちた部分を記録。

MCPとは何ですか？→AIが「あらゆるシステム・サービスを」横断的に動ける統一ルールです。
「○○サーバーを使った△△の処理を実装して、単体テストを行って、問題があれば修正してGitにPRして。疑問点があれば発生の度に、修正や実装の反映前に質問して」が日本語でそのまま打って、実行出来るということです。

家電で言うところだと、
2014年ごろ登場した「Alexa」
　当初：一部のキーワードによるオートメーション
　現在：自然言語の理解、音声による人識別、エージェントによるWeb検索、他サービス連携等


開発で言うところだと
2010年代
　当初：AIは研究分野、発展途上、子供程度の知能
　現在：IDEに標準装備、アプリ作成レベルでコード生成、新入社員位の知能
　これから：サービス(MCP)の標準化、AIのセキュリティ問題、利用へのメリット・デメリット・ハードルが変化していく

　・指示の粒度を細かくするほど、生成される成果が上がる＝ウォーターフォールそのもの。
　・指示がドキュメントになる
　・推論を含めてシステム自体の強度や速度は上がる可能性が高い（高級言語なら）
何歳までコード書きますか？

ぼくは建築CADの開発を生業としています。CADはOSネイティブな機能を頻繁に使うので必然的にデスクトップアプリケーション（Windows）となるわけですが、この界隈は若手が大いに不足しています。初老のプログラマーが老眼と闘いながら奮闘している世界なんです、かくいう私も。

自分がこの仕事を始めたころは、プログラマー35歳引退説が唱えられていて、ふーんそうなんだ？って思ってたけど、必要に駆られるとできてしまうんですね。一般的な会社だと35歳くらいで管理職になり、実戦から離れるから書けなくなるのではないでしょうか？むろん、目が悪くなる、集中力が無くなる、徹夜する体力が無くなる、など不利益なことが増えますが、コードを書いてさえいれば、経験でなんとかカバーしながら続けていけるようです。

しかしながら、とても難しいことが一つ、それは新しいものを受け入れる能力です。ラムダ式やらActionが出てきた時もGitが出てきた時も拒否反応が尋常ではありませんでした。結局試すまで３年くらいかかり、使ってみてもっと早く使えばよかったと後悔しきり。

長く現役でいるには、書き続ける事、新しいことを厭わず試してみる事、そして作りたいものがある事なのかなと思います。現段階でいうと自分は少なくとも60代後半くらいまで行けそうな気がしています、生きていれば

最後に若手の方へ。デスクトップアプリケーション作りも楽しいです。見捨てないで！！
【MCP】結局MCPって何がすごいん？

## 何が変わるの？
今までは**各サービスにAI機能があった**けど、MCPのおかげで、**AIが各サービスを使える**ようになった！！

### 従来
![従来.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640746/4d3a8f5d-9865-4fdf-b438-a0994ef2adfa.png)
### MCPがあると
![今回.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640746/db5e9ba1-d953-4d37-b0ef-aca4f3703eb8.png)

なるほどなるほど、、、え？あんま変わってなくない？

**いいえ、だいぶ違います**

AI to ServiceがMCPによって統一されたら、AIがサービスを横断できるんです。
つまり、、、？　**人間みたいな動きをさせやすい！**

例えば
- タスク管理はBacklog
- コード管理はGit
- デザインはFigma

みたいなプロジェクトの場合、人間の動きとしては、

①Backlogでタスクを確認
②Gitにブランチ作成
③Figmaでデザイン見ながらコーディング
④PR作ってBacklogのタスクにリンクを共有。。。。

みたいなことをすると思うのですが、自分のgithub copilotとかにツールを繋いでおけば、この辺りを自動でやってくれる、、、はず！（理論値）

## それだけじゃないよ？
実は開発者にも恩恵がある！！（と思ってる）
独自のサービスを作るとき、MCPサーバー作っちゃえば、あら不思議。
AI機能爆誕

セキュリティや、サービスへの影響範囲をちゃんとコントロールしながらやれば、コンテンツ管理は全てAIがやります！みたいなことができそう。。。

## まとめ
MCPって結局「ルールを作った」みたいなニュアンスで新しい技術ではないから、概念はそんなに難しいものじゃない。
でもルールが作られたことによって、開発者も利用者も使いやすい環境になったことは間違いないはず。
実案件の補助ツールとしてなのかサービスの一つとして使われるのかまだ想像つかないけど、色々試しやすくなったのはとってもいいなぁ、、、
BigQueryでBase36デコードする方法

# 経緯

TROCCOでBigQueryに転送したX adsの情報がBase36エンコードされている
https://documents.trocco.io/docs/data-source-twitter-ads

これを元の値で利用したかった

# 方法1: ユーザー定義関数 (UDF)
```sql
CREATE FUNCTION
  decodeBase36(base36_string STRING)
  RETURNS INT64
  LANGUAGE js AS """
    if (base36_string === null) {
      return null;
    }
    const decoded = parseInt(base36_string, 36);
    if (isNaN(decoded)) {
        return null;
    }
    return decoded;
  """;
```
```sql
SELECT dataset.decodeBase36('kf12oi')
```

ビューを保存するために永続的なUDFを定義してますが、
クエリで保存する場合は一時的なUDF (`CREATE TEMP FUNCTION`) でも問題ありません。

該当のフィールドは`INTEGER`で出力されます。

# 方法2: [`bigquery-utils`](https://github.com/GoogleCloudPlatform/bigquery-utils)

[cw_convert_base](https://github.com/GoogleCloudPlatform/bigquery-utils/blob/master/udfs/community/cw_convert_base.sqlx) を利用する
```sql
SELECT bqutil.fn.cw_convert_base('kf12oi', 36, 10);
```

こちらの場合は `STRING` で出力されます。

# 結論
UDFでもbqutilでもお好きな方を使用してください。
Chromeでキャッシュが残り、最新のページが表示されていない時の対処法

WebサイトのSSL設定やサーバー側の変更を行った後、「保護されていない通信」と表示されたままになる、あるいは画像や文章の修正が反映されない、といった経験はありませんか？  
これは多くの場合、**ブラウザのキャッシュ**が原因です。キャッシュは一度表示したページの情報を一時的に保存し、再表示時の速度向上に役立ちます。しかし、更新内容が反映されない場合にはキャッシュが障害となることがあります。

この記事では、**Google Chromeで特定のページだけキャッシュを削除し、最新状態を反映させる方法**を、初心者にも分かりやすく解説します。

## 前提条件・準備

- パソコン版Google Chromeを利用していること
- キャッシュの削除対象となるWebページを開いていること

## 手順

### 1. キャッシュを削除したいページを表示

まず、キャッシュをクリアしたいページをGoogle Chromeで開きます。

### 2. デベロッパーツールを開く

- Windowsの場合：`F12`キーを押します。
- Macの場合：`Command + Option + I`キーを押します。

画面右側や下部にデベロッパーツールが表示されます。

### 3. 「ページ更新」アイコンを右クリック

ブラウザのアドレスバー左側にある「再読み込み（丸い矢印）」アイコンの上で**右クリック**（または長押し）します。

### 4. 「キャッシュの消去とハード再読み込み」を選択

表示されたメニューから **「キャッシュの消去とハード再読み込み」** をクリックします。
![強制リロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268351/1e50fd34-d6c2-44c8-8e0b-a0ba7d564f97.jpeg)

これで、**そのページのキャッシュが削除され、最新の情報でページが再読み込みされます**。

---

#### 補足：ショートカットによる再読み込み

- Windows：`Ctrl + F5`
- Mac：`Shift + Command + R`

この「スーパーリロード」もキャッシュを使わず再読み込みしますが、**デベロッパーツール経由の「キャッシュの消去とハード再読み込み」の方が確実**にキャッシュをクリアできます。

## まとめ

Chromeでページの更新が反映されない場合は、 **「キャッシュの消去とハード再読み込み」** が最も手軽かつ確実です。特定のページだけキャッシュをクリアできるため、他のサイトの履歴やログイン情報を消す心配もありません。

Web制作や運用に関わる方はもちろん、普段からChromeを利用しているビジネスパーソンにも役立つテクニックです。ぜひ覚えておいて、いざという時に活用してください！

---

参考記事：  
- https://d-amus.com/web/whole/17/  
- https://atmarkit.itmedia.co.jp/ait/articles/1811/14/news038.html  
- https://support.design-inc.jp/column/6562/  
- https://www.e-presence.jp/archives/6034
【Salesforce】行動とToDo、活動の記録の違いについて

お客様から以下の質問をいただいた際の上司の解答が非常に分かりやすかったので残します。

Q.活動タイムラインにある「行動」、「ToDo」、「活動の記録」のつかいかｔ違いが分からない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/e59712cd-bf4e-4cfd-bebe-824aaa441351.png)

A.大きく分けると「行動」と「ToDoと活動の記録」の2種類
　・行動・・・カレンダー上に登録でき、FromとToの概念があるためスケジュールを登録するイメージ
　・ToDo・・・ToDoリストのようなタスクのイメージ、いつまでに実施すべきか期限の概念がある
　・活動の記録・・・既に完了したToDoを記入する際に使用する

Tips
・期限切れのToDoは赤字で期限が協調表示された状態で表示される
→ToDoを完了にしたい場合、チェックボックスにチェックを入れるだけで完了にできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/40cace2d-4bee-4a20-86bb-45e19a2aa291.png)
契約完了メールを ノーコード で Salesforce 商談に反映する ―― Mail to Salesforce × Gmail 転送 ＋ ref:{レコードID} の超シンプル連携

# 1.背景 ―― なぜ今さら “メール連携” なのか？
弊所では
* 契約書の締結（ベクターサインなど）
* 発注・請書の発行（Misocaなど）

を**Salesforce外のSaaS**で運用しつつ、
案件管理・売上予測は**Salesforceの商談**で行っています。

**課題の整理**

|やりたいこと|障壁|
|------|-------|
|契約完了通知が届いた瞬間に商談ステージを更新したい|AppExchange製品は高価/API開発はリソース不足|
|通知メールも証跡として残したい|メールを手動でコピー＆ペーストは手間|

そこで着目したのが、**Salesforce標準「メールtoSalesforce」**。
**本文または件名に　`ref:{18桁レコードId}`を書くだけで、メール内容が対象レコードへ自動紐づけ**されます。
（公式ヘルプ→<https://help.salesforce.com/s/articleView?id=sf.email_my_email_2_sfdc.htm&language=ja&type=5>）

## 2. 全体アーキテクチャ

```mermaid
sequenceDiagram
    participant SaaS as SaaS<br>(契約完了通知)
    participant Gmail as Gmail<br>(フィルタ転送)
    participant MTS as Mail to Salesforce
    participant SF as Salesforce
    participant Flow as レコードトリガーFlow
    participant Opp as Opportunity

    SaaS->>Gmail: 契約完了メール(ref:006ABCDEF123456789)
    Gmail->>MTS:  自動転送
    MTS-->>SF: Taskレコード作成(WhatId=006…)
    SF->>Gmail:メールtoSalesforce送信結果通知
    SF-->>Flow: Task作成イベント
    Flow-->>Opp: StageName = Closed Won
```

## 2. 実装ステップ

### 2-1. 事前設定（初回のみ）

| 手順 | 作業 | 詳細 |
|------|------|------|
| 1 | **メール to Salesforceアドレス取得** | 個人設定 → **メール** → **私の メール to Salesforce** |
| 2 | **許可ドメイン登録** | Googleの転送確認通知用アドレス（`noreply@google.com`）及び通知元 (`system@contractsaaS.co.jp` 等) を “私の受け入れ可能メールアドレス” に追加 |
| 3 | **Gmailフィルタ転送** | `from:system@contractsaaS.co.jp subject:"契約完了"` → Mail to Salesforce アドレスへ自動転送 |

### 2-2. SaaS側メールの完成イメージ

```plaintext
件名: 【契約完了】◯◯社_□□ref:006ABCDEF123456789案件
本文:
ご契約ありがとうございます。
```
契約管理や注文管理のSaaSでは完了時にメール通知する機能がついていることが多いです。
案件名等を登録する際に末尾にSalesforceのレコードIdを`ref:006ABCDEF123456789`の形式で入れておけば仕込みは完了です。


### 2-3. Salesforce フロー（完全ノーコード）

1. **オブジェクト** : `Task`  
2. **開始条件** : 新規 Task 作成時 & 件名に「契約完了」などを含む  
3. **Get Records** : `Task.WhatId` で `Opportunity` を取得  
4. **Update Records** : `StageName = 'Closed Won'`（または `Commit` など任意）  

> **安全策** : *Decision ノード* で「すでに `Closed Won` ならスキップ」などのガードを入れると安心です。

---

## 3. メリット早見表

| 観点 | メリット |
|------|----------|
| 完全ノーコード | Gmail フィルタ + Flow だけ |
| 導入スピード | 最短 30 分・追加費用ゼロ |
| 証跡管理 | 通知メール全文・添付を Task に保存 |
| セキュリティ | API 連携なし。許可アドレス制御でスパム耐性◎ |

---

## 4. 実践 Tips

| Tip | 概要 |
|-----|------|
| 添付ファイル活用 | 契約PDFが Task 経由で商談 **「ファイル」** タブに表示 |
| ダッシュボード化 | Task レポートで “月次契約完了数” を KPI 可視化 |
|

---

## 5. まとめ

- **本文／件名に `ref:{18 桁 ID}` を書くだけ**  
- Gmail で Mail to Salesforce 宛に転送すれば **Task → 商談** が自動で紐づき、ステージも更新  
- 開発・追加コスト **ゼロ**

まずはサンドボックスで 1 通送信し、Task に Opportunity が紐づくことを確認してみてください。
【Salesforce】Einstein活動キャプチャについて

〇Einstein活動キャプチャとは
・有効化するとGoogleカレンダーやGmailがSalesforce上に表示されるようになる



〇連携されたメールやカレンダーの情報を削除したい場合
・Einstein活動キャプチャ→設定→メールと行動削除→メールアドレス別 or ユーザ別で削除可能
→削除後に活動キャプチャを取得したい場合は再度連携する必要あり
https://www.yoshidumi.co.jp/collaboration-lab/GWS-SF-01

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/76087f3e-133d-437a-a531-c64569c9bc19.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/1c9bac38-54b7-45de-9876-e4aec867ce83.png)
JavaでExcelのセルをロックする

マイクロソフトExcelでは、特定のセルをロックすることで、その中のデータや数式が他のユーザーによって変更されるのを防ぐことができます。この記事では、無料のJavaライブラリを使ってJavaでプログラム的にExcelのセルをロックする方法を説明します。

## 無料APIのインストール（2つの方法）
Java で Excel ファイルを処理するために、[**Free Spire.XLS for Java**](https://www.e-iceblue.com/Introduce/free-xls-for-java.html) ライブラリを使用することができます。このライブラリをインストールする方法は 2 つあります。

**方法 1：** 以下のリンクから無料のライブラリをダウンロードして解凍し、その後、Spire.Xls.jar ファイルを依存関係としてプロジェクトに追加します。

https://www.e-iceblue.com/Download/xls-for-java-free.html

**方法2：** 次の構成をpom.xmlに追加することで、jarの依存関係を直接Mavenプロジェクトに追加します。
```xml
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls.free</artifactId>
    <version>5.3.0</version>
</dependency>
```
:::note warn
注：この無料のライブラリには、一定のページ制限があります。
:::

## Excelのセルをロックする手順とJavaコード
通常、ワークシート内のすべてのセルにはロックオプションが有効になっています。そのため、特定のセルやセル範囲をロックする前に、すべてのセルをロック解除する必要があります。また、ワークシートが暗号化されるまでセルのロックは有効にならないことにご留意ください。

詳細な手順は以下の通りです:
1. Excel ファイルを読み込み、その中の特定のワークシートを取得します。
1. ワークシート内で使用されているセル範囲にアクセスし、**`XlsRange.getStyle().setLocked()`** メソッドを使ってその範囲内のすべてのセルをロック解除します。
1. 特定のセルにアクセスし、**`XlsRange.getStyle().setLocked()`** メソッドを通じてそれらをロックします。
1. **`XlsWorksheetBase.protect()`** メソッドを使って、ワークシートをパスワードで保護します。
1. **`saveToFile()`** メソッドを使って結果ファイルを保存します。



Javaコードのサンプル:
```java
import com.spire.xls.*;

import java.util.EnumSet;

public class LockCells {
    public static void main(String []args){
        // Excel ファイルを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("input.xlsx");

        // 最初のワークシートを取得する
        Worksheet sheet = workbook.getWorksheets().get(0);

        // ワークシートの使用範囲内のすべてのセルをロック解除する
        CellRange usedRange = sheet.getRange();
        usedRange.getStyle().setLocked(false);

        // 特定のセルをロックする
        CellRange cells = sheet.getRange().get("D2:E10");
        cells.getStyle().setLocked(true);

        // ワークシートをパスワードで保護する
        sheet.protect("abc123", EnumSet.of(SheetProtectionType.All));

        // 結果ファイルを保存する
        workbook.saveToFile("LockCells.xlsx", ExcelVersion.Version2016);
    }
}
```
![LockExcelCell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/4314f71a-8500-44c7-b51e-a7eaf77b5759.png)

* * *
この無料のJava APIを使ったさらなるExcel処理機能については、以下をご確認ください：

https://www.e-iceblue.com/Tutorials/Java/Spire.XLS-for-Java/Program-Guide/Spire.XLS-Program-Guide-Content-for-Java.html
始めて２週間でWebアプリを作る最低限のツール4選

初めまして、sakuraです。

現在、大学生活も落ち着いてきたため、プログラミングの学習を本格的に始めることにしました。それに伴い、Qiitaでの投稿もスタートしてみます。

文章の中には、誤りや拙い表現が多々あるかもしれませんが、温かい目で読んでいただけると嬉しいです。

また、もし間違いやご指摘があればぜひ教えてください！泣いて喜びます。

では、私がプログラミングを始めて２週間でアプリを作ってみて最低限必要とわかったツールを4つ紹介します。

### 前提
・この記事は、初学者・学習者向けとなっている。
・筆者はコードの文法などはある程度習得済み(if,while文など）
・Todoリストを管理するwebアプリを作成した。
・ここでの「最低限」とは、「開発 → 公開 → ポートフォリオ化」までの流れを実現できた状態を指す。
・使用言語はPython

# VScode (Visual Studio Code）
##### 役割：コードを書く・管理するためのアプリケーション
##### 具体的な使い方
・フォルダ構成を作る（例：app.py, templates/, static/, todos.json）

・コードを書く（Flaskルーティングや処理）

・ファイル操作・保存・実行（ターミナルから python app.py）

・HTMLテンプレートやCSSもここで編集できる

・Gitの操作もVSCode内で可能（ステージ→コミット→プッシュ）

##### 初心者（筆者)の解釈
非開発者が想像する**THE・プログラミング**の部分を担当するツールで、コードを書いたり、作成したプログラムを実行したりするのに必要。

# GitHub
##### 役割:作成したコードをクラウド上で管理し、公開・共有もできる
##### 具体的な使い方
・VSCodeのプロジェクトをリポジトリ化→アップロード

・進捗を保存・履歴を残す

・他人にもコードを見せられる（ポートフォリオになる）

・Renderと連携することで自動で最新コードをデプロイできる

##### 初心者(筆者）の解釈
学習、開発の記録を残し、外部への技術の証明するのに必要。

# Flask
##### 役割：Webページの表示・ユーザーの入力処理・データ保存などを担当
##### 具体的な使い方
・ユーザーの入力を取得

・HTMLテンプレートを表示

・入力されたデータをファイルに保存・読み込み

・ローカルでアプリのプログラムを実行すると、ブラウザで動作確認できる
##### 初心者（筆者）の解釈
ユーザーのリクエストに応じて、VSCodeで作成したプログラムに対して、どこのページで何をするか・何を見せるかを決めるのに必要

# Render
##### 役割:GitHubにあるコードをそのまま動くWebアプリにし、ネット上に公開する
##### 具体的な使い方
・デプロイを行うため、グローバルサーバーのURLを取得する
##### 初心者（筆者）の解釈
Flaskでローカルサーバー上でのみ動かせるようになったアプリを、グローバルサーバーで公開するためURLを取得するのに必要。



### ※ 注意
今回紹介したツールは、あくまで私が使った“ひとつの例”にすぎません。他にも色々な方法やツールがあると思いますので、その点はご了承ください。
seedに記述したデータで サンプル状態に戻す

# やりたいこと
・DBを 初期化 したい
・開発中に テーブル構成やデータをリセットしたい
・seedに記述したデータで サンプル状態に戻す


# コマンド
```bash
php artisan migrate:fresh --seed
```
実行内容：
①全テーブル削除（DROP）
②再マイグレーション（php artisan migrate）
③シーディング（php artisan db:seed）


# 注意点
migrate:fresh は本番環境でやると データが全削除されるので要注意！！
これは基本的に ローカル専用コマンドです。
【Salesforce】GmailとSalesforce連携のやり方（Chrome）

〇やりたいこと
・Gmailにてお客様とやり取りしている内容をSalesforceのレコードに紐づけた状態で表示できるようにしたい



〇設定手順
1．Gmailにログインした状態でChromeの拡張機能「Salesforce」を追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/2e4c0e67-c511-4a2d-8e39-5ddd0e700100.png)

2．画面リロードし、表示される「Salesforceへのログイン」からSalesforceユーザ情報を入力してログインする

3．お客様とのメールを開くと、取引先責任者レコード（既にお客様が登録されている場合）か取引先レコード、活動レコードなどが表示されるので、どのレコードに紐づけたいかを設定する

い



【参考】：SalesforceとGmailをさらに便利に！
Gmail インテグレーションで情報をSalesforceに手軽に記録♪
https://www.sunbridge.com/blog/column/salesforce-gmail-integration/
Turbonomic・webMethods・Envizi連携活用例

昨今、データセンターなどのIT資産における電力消費量が急増し、効率的な運営が求められています。また、SASB基準、IFRS S2号、それを基としたSSBJ基準の発表により、データセンターの電力消費量の取得と開示は、環境負荷削減や規制対応、透明性向上の観点から重要視されています。

大規模なIT環境を持つ企業のIT環境における電力消費量の取得、連携、最適化プランの考案と実行、およびその結果をESGレポートとして情報開示する流れを、Turbonomic、webMethods、Envizi用いて実現するソリューションをご紹介します。

ソリューションのイメージ、対応するお客様の課題等は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666924/82597d5f-f014-44a3-b565-6a0adf731b65.png)

本ソリューションの中で登場される３つの製品（Turbonomic・webMethods・Envizi）それぞれの特徴とメリットを生かして、IT資産運用の効率化、迅速柔軟なシステム連携、サステナビリティデータの開示を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666924/0e7abc13-684b-4975-bf06-08ddd9637ddd.png)

以下はソリューションの全体像です。
IBMのTurbonomic・webMethods・Enviziを活用することで、電力消費量の取得・連携・削減およびその情報開示をトータルソリューションとして提供いたします。
IT資産の電力消費を計画的に削減し、その成果を効率的にサステナビリティレポートで公開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666924/54ea5a70-f43d-42ce-a6e4-f1679737518d.png)

Turbonomic、webMethods、Enviziそれぞれの特徴とお客様の課題をどのように対応するのかについて、以下ご参考ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666924/e4366f4d-954a-4b0f-a424-7d058b910ad2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666924/b9203643-df3b-415b-b45d-ceffe06daa70.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666924/b0ac897c-db19-40e6-9732-88e064092a8a.png)
opam publishコマンドを使ってRocqのコードをopamに登録する

Rocqのライブラリやツールは次のリポジトリが広く使われている[^1].

* rocq-released: Rocq利用者のための推奨opamリポジトリ
* rocq-extra-dev: 開発者向けリポジトリ，開発中のRocqのライブラリなどがある

両方のリポジトリは `coq/opam` というgithubプロジェクトで管理されており，ここに自分の開発しているプロジェクトのopamファイルを pull request することで登録申請をする．それを自動的にやってくれるのが `opam publish` コマンドというわけ．

## `rocq-released` に自分のプロジェクトを登録申請する手順

### 1. プロジェクトのopamファイルを作成する
`rocq-<PROJ>.opam` というような名前で作成する．
### 2. 自プロジェクトでtagを打つ

```console
git tag X.X.X
git push --tags
```

### 3. (初回のみ) github アクセストークンを発行して
「Settings」→「Developpers Tool」→「Personal access tokens」→「Tokens (classic)」から「Generate new token」して，PRを発行できる権限を付けたトークンを発行する．

### 4. `opam publish`

* `--tag`: 自プロジェクトでのtag
* `-v`: opam上でのバージョン番号(tagと同じ場合が多いかも)
* `--repo`: packageを管理するgithubのリポジトリの場所なので今回は `coq/opam`
* `--packages-directory`: 上記リポジトリ上でのディレクトリの場所，今回は `released/packages`

使用例:
```sh
opam publish --tag=rocqnavi.0.2.0 -v 0.2.0 --repo=coq/opam \
  --packages-directory released/packages
```


[^1]: https://rocq-prover.org/docs/using-opam#installing-rocq-packages
BashでAPIテスト自動化！？ローカル環境でもE2Eに近づけた話

## :cherry_blossom: はじめに
こんにちは！  
以前、BashでE2Eテスト的なことを試みた話を書いたのですが、今回はその続編（というか応用編）になります！

前回の記事はこちら👇  
👉 [BashでE2Eテストっぽいことをやってみた話](https://qiita.com/shinkawa_misaki/items/95276a9cfa871e06a7e5)

## 今回の舞台：APIのまとめテストプロジェクト

某プロジェクト群（仮に「Aプロジェクト群」と呼びます）では、複数のAPI群が開発されています。  
それらの**APIエンドポイントの疎通チェックや構成確認**を手軽に行えるよう、  
とある Bash + JSON + Redis で構成されたテストユーティリティが作られていました。  
今回はそのユーティリティ（以下、**API Test Shell**）について紹介します！

## 目指したゴール

- ローカル環境で、**Redisキャッシュを考慮しながらAPIのレスポンス検証**ができる  
- JSONファイルからテスト対象を切り替えられる（stg/prdなど）  
- CI/CDに載せなくても**1コマンドで一通りの確認が済む**
- **フロントエンドの疎通確認もAPIと一緒に実行し、サービス全体の整合性をチェック**

つまり、「雑に壊れてないかをサッと見たい」ときにめちゃくちゃ便利なやつです。

## ディレクトリ構成（ざっくり）

```
api-test/
├── config/
│   └── service-a/
│       ├── stg.json
│       └── prd.json
├── redis/
│   └── prepare_redis_cache.sh
├── helpers/
│   ├── api/
│   ├── front/
│   └── common.sh
├── execute.sh
└── Makefile
```

- `config/` 配下の JSON に、対象サービス・環境ごとのエンドポイント一覧が記載されています  
- `redis/prepare_redis_cache.sh` は内部的にキャッシュの操作を担います（ユーザーが直接叩くことは想定されていません）  
- `execute.sh` がメインのテストランナーで、**API・フロント・Redisの一連のテストフローを一括実行**します  
- `Makefile` を使えば `make run` などで楽に操作できます  

## Redisも考慮してる！？

このツールの特徴は、ただのAPI疎通確認ではない点です。  
**テストの各ステップでRedisキャッシュを細かく制御**していることがポイント！

具体的には、

- **各APIエンドポイントやフロントエンドのURLに対してアクセスする前に、関連するRedisキーのバックアップ**を実施  
- テストの実行中に変更されたRedisの状態を**ロールバックまたはクリア**できるよう設計  
- 想定外の状態が検出された場合でも、**環境を壊さずに即復元可能！**

この制御は全て `execute.sh` 内部で行われるため、開発者は **ただコマンドを叩くだけ** でOK🙆‍♀️

## Makefileでのお手軽実行

実際にテストを実行する際には
```make
make run
# → ./execute.sh service-a
```

とか、

テストの結果を分析するなら

```make
make analyze
# → ./execute.sh service-a analyze
```

のように、複雑な構成のわりに操作感はスッキリしています。  
こういうの、個人開発でも見習いたい……！

## フロントエンドの疎通チェックも自動で！

APIの確認だけでなく、**フロントエンド側の動作確認もAPIテストとセットで実行されます**。

つまり `make run` を実行すると、以下の流れが自動で進みます👇

1. エンドポイント単位でRedisキーをバックアップ  
2. APIに対するリクエスト送信＆レスポンス検証  
3. フロントエンドの対象URLにアクセスし、ステータスや構成をチェック  
4. テスト成功時：キャッシュのクリーンアップ  
5. テスト失敗時：キャッシュのロールバック

**すべてが統一されたログフォーマットで出力される**ため、ログを見て「どこで失敗したか」がすぐ分かるのも地味に嬉しいポイントです！

## 工夫ポイント

- `set -euo pipefail` でBashらしい堅牢性確保  
- ログを `log.sh` 経由で出力し、ステージごとの状況を追いやすく  
- Redisへのバルク操作は `--pipe` モードで高速化＋並列制御（`xargs -P`）なども検討  

## 実装済みの強み

すでに以下のような実装も進んでおり、安定運用が見込める状態になっています。

- **Redisクラスタ環境への対応済み**
- **各ステージにおける統一的なログ出力**
- **Makefile経由の直感的な操作体系**
- **APIとフロントエンドの疎通確認をまとめて実行**
- **各エンドポイント・URLごとにRedisキャッシュの自動バックアップ・ロールバックに対応！**

Bashとは思えないほど整った構成で、チーム内での開発効率も向上しました！

## 最後に

この記事が役に立ったら、ぜひ「LGTM」してくれると嬉しいです！ 💖  
では、また次回の記事でお会いしましょう👋
PowerAppsのインポート・エクスポートの時、UserMissingRequiredPermissionエラーの対応方法

# エラー詳細：
The user with object id ‘[id]’ in tenant ‘[id]’ does not have access to permission ‘ExportEnvironmentPackage’ in environment ‘[id]’ Error Code: ‘UserMissingRequiredPermission’

# 対応方法
https://jackyincrm.wordpress.com/2019/02/07/microsoft-flow-admin-center-security-and-security-roles/
OAC：デプロイ済のセマンティックモデルをインポートしてセマンティックモデラーで開発後、デプロイした際の"接続"がないエラーについて

はじめに
---
OACでは、データベースやデータソースにアクセスしてデータをとってくるときに、データセットと、セマンティックモデルを利用します。
セマンティックモデルは、たとえばDBの列名がprod_nmなど英語の短縮名のような名前で定義されているときに、利用者にわかりやすいような名前、たとえば商品名称というふうに利用者がわかりやすいようにつけかえるようなOAC側でビューを定義するようなものです。
OACでは従来、モデル管理ツール(OAC Client　Tool)でセマンティックモデルを開発していましたが、現在ではWebブラウザで開発できるセマンティックモデラーという機能を提供しています。2025/4 現在、モデル管理ツール、セマンティックモデラー、どちらでもセマンティックモデルの開発に利用できます。

既にモデル管理ツール(OAC Client　Tool)でセマンティックモデルを開発していて、OACで利用している場合で、セマンティックモデラーにデプロイ済のセマンティックモデルをインポート後、OACにデプロイした際に発生する"接続がない"というエラーが発生するときの対処についてみていみます

![g14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/20b53752-8378-423d-9b23-869aa09882a3.jpeg)

記事記載時のOAC ver：Jan 2025 Update

前提
---
OACでモデル管理ツールを使ってセマンティックモデルを使っている
記事で利用するセマンティックモデル
本記事では、下記のようなセマンティックモデルをOACでモデル管理ツールを使ってOACにデプロイしています
![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/cfd2deb7-3a03-47cb-a6d8-da63bd58debe.jpeg)

接続プールに、下記のようにOracleDBの接続文字列を直接記載しています。
![g2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fb481ae4-0da6-411b-a094-32475f827b8e.jpeg)


接続プールの変更
---
セマンティックモデラーでは、OACの"接続"で定義した接続情報が、接続プールで利用できます。本記事の前提のように接続文字列等を使用していると、セマンティックモデラーにインポートした際に空白になります。
![g15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f2f56674-bfb5-4039-ac4e-aee4e9444358.jpeg)


対処としては、接続を作成し、接続プールにセットします。
左上部の接続タブをクリックします
![g16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/16eca3eb-277a-4260-a92e-6a1474613ecb.jpeg)

＋アイコンをクリックします。接続の作成をクリックします
![g17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/90aa2f65-be2b-498c-befd-609389fa9db4.jpeg)

接続タイプを指定します。本記事ではOracle Autonomous Data Warehouseを指定しています。
![g18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/35aee06d-4875-474e-88a7-650f8782f199.jpeg)

接続に必要な情報をセットします。システム接続にチェックされています。セマンティックモデルの接続プールで使用するためにはシステム接続にチェックがなされている必要があります。保存をクリックします。
![g19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6b68df05-1991-4415-b208-ee596f1adb55.jpeg)

物理レイヤーを開き、物理レイヤーのデータベースで接続プールのタブをクリックし、接続のところに作成した”接続”をセットします。作成後すぐに表示されない場合は、時間をおいて物理レイヤーのデータベースを開きなおします。
![g20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/05b43d94-6f9d-4f54-ab60-1d23bcd32f33.jpeg)

接続をセットしたら、デプロイします。
![g21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/2f818a2f-40a2-4ff7-8a6a-736739cf0387.jpeg)

OAC Client Tool のモデル管理ツールでの見え方
---
OAC Client Tool のモデル管理ツールでセマンティックモデルをひらき、接続プールをみてみると図のようになっています。
![g22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a055ae28-2220-4e97-9a4e-dd296a0ed3c9.jpeg)

まとめ
---
既にモデル管理ツール(OAC Client　Tool)でセマンティックモデルを開発していて、OACで利用している場合で、セマンティックモデラーにインポートして開発後、"接続"でエラーが発生する場合についてみてみました。接続プールに、下記のようにOracleDBの接続文字列を直接記載している場合は、システム接続にチェックが入った接続の作成および接続プールのセットが必要になります

以上
App Routerって？

# App Routerとは？

**App Router** は、Next.js 13以降で導入された新しいルーティングシステムです。
従来の `pages/` ディレクトリを使ったルーティング（Pages Router）に代わり、
`app/` ディレクトリを使ってより柔軟でモダンなページ設計ができるようになりました。

---

## 特徴

- **`app/` ディレクトリでルーティングを管理**
- **ファイルとフォルダ構成＝URL構造**
- **サーバーコンポーネント対応（デフォルト）**
- **レイアウトやエラー画面を個別に管理できる**
- **並列ルーティングや部分的ローディングが可能**

---

## 従来（Pages Router）との違い

| 項目 | Pages Router (`pages/`) | App Router (`app/`) |
|:---|:---|:---|
| ルート管理 | `pages/` フォルダ | `app/` フォルダ |
| ページ作成方法 | ファイル単位（例：`about.js`） | フォルダ+page.tsx（例：`about/page.tsx`） |
| レイアウト管理 | `_app.js`で一括管理 | 各ディレクトリで`layout.tsx` |
| サーバーコンポーネント | 利用不可 | デフォルトで利用可能 |
| 柔軟なUI制御 | △ | ◎ |

---

## App Routerのフォルダ構成例

app/ layout.tsx // 全体レイアウト
page.tsx // トップページ
about/ page.tsx // /about ページ
blog/ [slug]/ page.tsx // /blog/任意のslug（動的ルーティング） 
error.tsx // エラーページ



### 各ファイル・フォルダの意味

- **layout.tsx**
  - 全体共通の見た目や構成を作る
  - 例えば、ヘッダー・フッターをここで設定する

- **page.tsx**
  - 実際に表示するページの中身を書く
  - 例えば、トップページならここに書く

- **[slug]/page.tsx**
  - URLによって中身が変わるページを作る
  - 例えば `/blog/first-post` と `/blog/second-post` みたいに、記事ごとにページを自動生成できる

- **error.tsx**
  - ページがエラーになった時（例えば 404）に表示する画面を作る

---

## まとめ

- **ファイルやフォルダを作るだけで自動的にルーティングされる**
- **共通レイアウトも各ページ専用レイアウトも自由に作れる**
- **ブログみたいに記事がたくさんあるサイトも、動的に楽に作れる**

---
OAC：セマンティックモデラーによるセマンティックモデルのつくりはじめ

はじめに
---
OACでは、データベースやデータソースにアクセスしてデータをとってくるときに、データセットと、セマンティックモデルを利用します。
セマンティックモデルは、たとえばDBの列名がprod_nmなど英語の短縮名のような名前で定義されているときに、利用者にわかりやすいような名前、たとえば商品名称というふうに利用者がわかりやすいようにつけかえるようなOAC側でビューを定義するようなものです。
OACでは従来、モデル管理ツール(OAC Client　Tool)でセマンティックモデルを開発していましたが、現在ではWebブラウザで開発できるセマンティックモデラーという機能を提供しています。2025/4 現在、モデル管理ツール、セマンティックモデラー、どちらでもセマンティックモデルの開発に利用できます。

既にモデル管理ツール(OAC Client　Tool)でセマンティックモデルを開発していて、OACで利用している場合で、はじめてセマンティックモデラーをつかうときの初めの一歩についてやってみました。

![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7cc6f7ef-e54e-4afc-8a61-1c6e051ec9ba.jpeg)

記事記載時のOAC ver：Jan 2025 Update

前提
---
OACでモデル管理ツールを使ってセマンティックモデルを使っている

記事で利用するセマンティックモデル
本記事では、下記のようなセマンティックモデルをOACでモデル管理ツールを使ってOACにデプロイしています
![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/13a6d6f8-fbe6-4cc9-8a48-b7fb84fda9af.jpeg)

モデル管理ツールとセマンティックモデラー、セマンティックモデラーへインポート
---
はじめの一歩は、下記の４つのオプションのうち"デプロイ済みのモデルをセマンティックモデラーにインポートする"。を利用します。
OACにログインします。作成からセマンティック・モデルをクリックします
![g3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/664f3d60-8866-4170-8f91-71e806f67f89.jpeg)

セマンティック・モデルの作成で、セマンティック・モデルの名前を入力します。作成者のオブジェクトとして作成されます。
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/696128de-6b94-4567-bfe4-9bcc0297bc2f.jpeg)

４つオプションがあるうち、"デプロイされたモデルのインポート"をクリックします。OACにデプロイされているセマンティック・モデルを作成者のオブジェクトとして複製しているイメージです。
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f5941e23-965d-405f-a71f-af4ea7d51068.jpeg)

しばらく待ちます
![g6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1bbcbd53-cc21-4307-a4da-a8403e713d96.jpeg)

インポートに成功しました。でOKをクリックします。
![g7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1d88d3bc-ef68-4271-a325-51d9ed928380.jpeg)

デプロイされているセマンティック・モデルがインポートされ、開くことができます。
![g8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fc244f44-c91d-486b-bfad-da2bae443ea9.jpeg)

左部の物理レイヤーのタブをクリックします。物理レイヤーのオブジェクトをクリックします。定義情報が見えます。
![g9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5763ed78-e339-43e1-81bf-88ef098039a4.jpeg)

左部の論理レイヤーのタブをクリックします。論理レイヤーのオブジェクトをクリックします。定義情報が見えます。
![g10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/05dee817-faa0-4313-a6a3-e230b5b9e14b.jpeg)

左部のプレゼンテーション・レイヤーのタブをクリックします。プレゼンテーション・レイヤーのオブジェクトをクリックします。定義情報が見えます。
![g11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/50b6b92e-ef04-48c4-9197-3dee0cc1c1e0.jpeg)

セマンティックモデラーで更新したモデルのデプロイ
---
セマンティックモデラーで更新したモデルをOACに反映するには、整合性チェックを実施し、デプロイを実行します。デプロイはセマンティックモデラーで、右上部のメニューを開き、デプロイをクリックします。
![g12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/39a3e981-03c2-4ec3-9420-ca856ee06746.jpeg)

まとめ
---
既にモデル管理ツール(OAC Client　Tool)でセマンティックモデルを開発していて、OACで利用している場合で、はじめてセマンティックモデラーをつかうときの初めの一歩についてやってみました。

以上
STM32CubeIDE の live Expression、static な local 変数を見られるよ

STM32CubeIDE の live Expression は便利です。リアルタイムに変数の中身が見られます。

ですが、global 変数に限られます。
local変数をモニタしたいがために一時的に global にしたりしてませんでしたか？

その必要、ないです！

``` c
void func3()
{
    static int j;
    いろいろ
}
```
static である必要がありますが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36775/e332b8df-2b6f-429f-b28d-78262426cfc3.png)

``` c
func1::hensu_1   
```

のようにすれば見られます！　便利！
一時的にglobalするのは面倒です。まだ、一時的にstaticなら楽かと
🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』をつくる④【センサー半田付け〜動作テスト編】

## はじめに

こんにちは、piyovateです🐣✨

前回の記事では『Raspberry Pi Pico WH』のセットアップを行い、LEDを点滅させるところまで成功しました！

今回は、購入した温湿度センサー『BME280』を半田付けして、ラズパイPico WHと接続し、実際に温度・湿度・気圧を取得する動作テストを行います。

---

## 📌 今回の目標

- BME280センサーの半田付け
- ラズパイPico WHとの配線（I2C接続）
- MicroPythonを使ってセンサーデータを取得

---

## 🔧 Step1：人生初！半田付けにチャレンジ

BME280センサーを使うためにはピンヘッダの半田付けが必要でした。

はじめての半田付けでドキドキしましたが、なんとかピンヘッダを基板に固定することができました！

少し斜めになったりもしましたが、接触は問題なさそう。次の配線へ進みます。

---

## 🔌 Step2：配線（ジャンパーワイヤ＋ブレッドボード）

半田付け後、ジャンパーワイヤとブレッドボードを使って以下の配線を行いました。

| BME280のピン | Pico WHのピン        |
|--------------|----------------------|
| Vio          | 3.3V（36番ピン）     |
| GND          | GND（38番ピン）      |
| SCK          | GP1（2番ピン・SCL）  |
| SDI          | GP0（1番ピン・SDA）  |

この時、SDOピンは何も繋げていませんでした。

---

## 📥 MicroPython用のBME280ドライバを追加

BME280センサーのデータを簡単に取得するため、MicroPython用のドライバを導入しました。使用したのは以下のGitHubリポジトリのドライバです。

- [robert-hh/BME280](https://github.com/robert-hh/BME280)

上記リポジトリから`bme280_float.py`ファイルをダウンロードし、Raspberry Pi Pico WHのMicroPython環境に`bme280.py`という名前で保存しました。

※外部リポジトリの利用は自己責任で行ってください。

これでBME280のデータ取得が簡単に行えるようになりました。

---

## ⚠️ 通信がなぜか不安定に...

実際に以下のコードを動かしてみました。

```python
from machine import Pin, I2C
import bme280
import time

i2c = I2C(0, sda=Pin(0), scl=Pin(1))
sensor = bme280.BME280(i2c=i2c)

while True:
    try:
        temperature, pressure, humidity = sensor.values
        print('温度:', temperature)
        print('湿度:', humidity)
        print('気圧:', pressure)
        print('-------------------')
    except OSError as e:
        print("通信エラーが発生しました。再試行します...", e)
    time.sleep(2)
```

すると...

```
OSError: [Errno 5] EIO
```

通信エラーが頻発。時々データが取得できるものの、かなり不安定でした💦

---

## 🔍 原因発見！I2Cアドレスが固定されていなかった！

調べてみたところ、センサーのI2Cアドレスが、通信のたびに0x76と0x77の間で変化していました。

原因は **「SDOピンが浮遊状態（未接続）」** であったためでした。

---

## ✅ 対策（SDOピンをGNDに接続して解決！）

問題を解決するために、BME280のSDOピンを以下のように接続しました。

| BME280のピン | Pico WHのピン |
|--------------|---------------|
| SDO          | GND（33番ピン） |

これで、センサーのI2Cアドレスが常に`0x76`に固定され、通信が安定しました✨

---

## 🎉 最終的な結果（成功！）

以下のように安定してデータを取得できるようになりました。

```
温度: 24.50C
湿度: 25.13%
気圧: 1011.34hPa
-------------------
温度: 24.51C
湿度: 25.08%
気圧: 1011.35hPa
-------------------
温度: 24.51C
湿度: 25.10%
気圧: 1011.37hPa
-------------------
温度: 24.52C
湿度: 25.08%
気圧: 1011.35hPa
-------------------
```

湿度が25%…加湿器買いましょう！😂

---

## 🔜 次回の予定

次回は、今回取得した温度・湿度・気圧のデータをブラウザで確認できるよう、**Raspberry Pi Pico WHで簡単なWebサーバーを立ち上げます！**

センサーデータをAPIのように配信し、最終的には弊社のホームページでいつでも確認できるようにする予定です✨

次回もぜひお楽しみに🐣✨

## 🔗 シリーズリンク

* 次回：[🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』をつくる⑤【Pico WHでWebサーバーを立ち上げ＆ローカルで取得テスト編】](https://qiita.com/Piyovate/items/44dc907d20254653da4c)
* 前回：[🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』をつくる③【Pico WH セットアップ〜Lチカ編】](https://qiita.com/Piyovate/items/e1c1403d4b6c29978ea7)
* 第１回：[🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』をつくる①【アイデア決定編】](https://qiita.com/Piyovate/items/b0e5a4b2c4c1ed7a3bf8)

📚 シリーズ全記事はこちら：[Qiitaストックページ](https://qiita.com/Piyovate/stocks/657201b660bed4ebf50c)
Typeerror / method not allowed / bootstrap

# 最初にアクセスする / が POSTのみの時

![スクリーンショット 2025-04-24 19.33.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/34bdc623-7bb5-4365-ad78-b98122fae9bb.png)

```ruby:問題code
@app.route("/", methods=["POST"])
```

```ruby:解決策
@app.route("/", methods=["GET", "POST"])
```

## アクセスするのが"/"以外、 POST専用にしてもエラーにならない

```ruby:例
@app.route("/submit", methods=["POST"])
def submit():
    if request.method == "POST":
        name = request.form["name"]
        message = request.form["message"]
        return render_template("index.html", name=name, message=message)
```

## データが問い合わせformで送信された時だけ、ある文章を表示したい

```ruby:index.html
{% if name and message %}
<h1>ありがとうございました、{{ name }}さん</h1>
<p>メッセージ: {{ message }}</p>
{% endif %}
```

## methods=["GET", "POST"]があり、elseがない時

```ruby:
TypeError: The view function for 'submit' did not return a valid response. The function either returned None or ended without a return statement.
```

```ruby:解決策
if request.method == "POST":
    return render_template("index.html", name=name)
else:
    return render_template("index.html")
```

### いいcodeと悪いcode
```ruby:悪いの
@app.route("/", methods=["GET", "POST"])
def submit():
    if request.method == "POST":
        name = request.form["name"]
        message = request.form["message"]
        return render_template("index.html", name=name, message=message)
    else:
        return render_template("index.html")
```

```ruby:いいの
@app.route("/", methods=["GET", "POST"])
def submit():
    name = ""
    message = ""
    result = ""

    if request.method == "POST":
        name = request.form["name"]
        message = request.form["message"]

        if name and message:
            result = f"{name} / {message}"
        else:
            result = "not found"

    return render_template("index.html", name=name, message=message, result=result)

```
```ruby:after-html
<form action="/" method="POST">
  <label for="name">名前:</label>
  <input type="text" id="name" name="name" required>
  <br>
  <label for="message">メッセージ:</label>
  <textarea id="message" name="message" required></textarea>
  <br>
  <input type="submit" value="送信" class="btn btn-primary">

</form>

{% if name and message %}
<p>{{ result }}</p>
{% endif %}
```


### bootstrap 入れたい

```ruby:index.html
<!DOCTYPE html>
<html>
  <head>
  <meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
```
【Xcode16】内蔵されたswift-formatを使ってpre-commit時に自動フォーマットする

## 背景

2024年9月17日にリリースされたXcode16から内蔵ツールチェーンにswift-formatが同梱されるようになりました。これにより、SPMやHomebrewを用いてインストールしなくてもswift-formatが利用できるようになっています。
XcodeのIDE内においては、`^+⇧+I`などのコマンドによってファイル毎にフォーマットすることは可能ですが、コミット時に自動フォーマットでき、かつチームメンバーの初期設定が不要だと便利そうだったので、その手順をメモします。

## ビルド時の自動フォーマットはあまり良くなかった
XcodeのBuild Phasesでビルド時にswift-formatを実行することも可能ですが、ビルド時にファイルが書き換えられると、Undo（⌘+Z）で元に戻すことができないという問題がありました。そのため、ビルド時ではなく、Gitコミット時のタイミングで自動フォーマットを行う構成にしました。

## 1. `Scripts/install-git-hooks.sh` を作成
```bash
#!/bin/bash

HOOKS_DIR=$(git rev-parse --show-toplevel)/.git/hooks
cp Scripts/hooks/pre-commit "$HOOKS_DIR/pre-commit"
chmod +x "$HOOKS_DIR/pre-commit"
echo "✅ Git hooks installed!"

```
## 2. `Scripts/hooks/pre-commit` に swift-format 実行処理を記述

```bash
#!/bin/bash

TARGET_DIR=$(git rev-parse --show-toplevel)

if xcrun --find swift-format >/dev/null; then
  xcrun swift-format format --in-place --recursive "$TARGET_DIR"
else
  echo "⚠️ swift-format が見つかりませんでした。"
  exit 0
fi

if ! git diff --quiet; then
  echo ""
  echo "✨ swift-format によりファイルが修正されました。"
  echo "変更を確認し、もう一度コミットしてください。"
  echo ""
  echo "🔍 修正されたファイル:"
  git diff --stat
  exit 1
fi


```

## 3. `.swift-format`を設定する(任意)
```json
{
  "maximumBlankLines" : 1,
  "indentConditionalCompilationBlocks" : false,
  "lineLength" : 100,
  "lineBreakBeforeEachGenericRequirement" : true,
  "lineBreakBeforeEachArgument" : true,
  "indentation" : {
    "spaces" : 4
  }
}
```

この時点でプロジェクトのディレクトリ構造が以下のようになっていればOKです。
![ 2025-04-25 13.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326888/c3ac0920-ab98-4f23-9f97-d9e21fbfbef8.png)


## 4. `install-git-hooks.sh`をBuild Phasesから実行する

```bash
bash "${SRCROOT}/Scripts/install-git-hooks.sh"
```
これにより、Xcodeビルド時に自動で .git/hooks/pre-commit がセットアップされます。


## 🎉動作確認

初回の動作確認の前に1回以上ビルドしてください。.git/hooks/pre-commit がセットアップされます。
ここまでの手順で Xcode 等で commit する際にフォーマットがかかり、アラートウィンドウとして表示されるようになります。

![ 2025-04-25 13.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326888/585516b4-0a79-4381-8063-a486016cc653.png)
TROCCOでZAICOのデータ転送してみた2️⃣移動平均出してみた


前回⏬️、TROCCOを用いてZAICOから在庫データ一覧をSnowflakeに転送しました。

https://qiita.com/MK0000/items/344cb7049b7319565a35

今回はその応用として、Snowflake上で在庫の移動平均を求めたいと思います。

# 時系列での在庫変動を記録しつつSnowflakeにデータを送る

## 【TROCCO】転送設定の作成

### 転送設定STEP1～STEP2（プレビュー表示）までの設定
前回の記事と同じ手順で、転送設定STEP2（プレビューが表示されるところ）まで作成します。

https://qiita.com/MK0000/items/344cb7049b7319565a35


### 転送設定STEP2 ▶ 転送日時カラム設定

今回、日々の在庫変動を記録していきたいので、転送日時カラム設定を用いて「いつ転送したデータか」を記録するよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/1feeb4f3-1ce9-48c9-82fd-985e3fbbbdca.png)


### スケジュールの設定と転送実行
設定を保存したら、毎日決まった時間にデータを転送するように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/b197a8d6-d615-4adf-91c9-ff1afa101ad5.png)

***

設定は以上です。

毎日のスケジュール実行で、Snowflake上には⏬️のようにデータが積み上がっていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/c5ea5b03-bf55-4750-8d83-f6481287b515.png)


ここまできたら、後はSQLを使って移動平均を計算します。

***

# 移動平均をもとめる

## そもそも移動平均とは

時系列データにおいて、ある一定期間のデータの平均値を、期間をずらしながら計算していく手法。
 **短期的なノイズを平滑化** し、長期的なトレンドを把握する目的で使用します。

「短期的なノイズを平滑化」というところがポイントです。

・TROCCOは基本バッチ実行でのデータ転送を行う
・ZAICOの在庫データ一覧は、その時点での在庫量を返す

という特性があります。
そのため、バッチ実行で取得した在庫データは、取得タイミングによる一時的な変動（例えば、ちょうど大量入庫直後や出荷直後など）を含む可能性があります。
移動平均を使うことで、このような短期的なスパイクをならし、より安定した在庫量の推移を見ることができます。

そのため、日々の細かな増減に惑わされず、在庫の大まかな傾向（増加傾向なのか、減少傾向なのか、安定しているのか、とか）を捉えやすくなります。


## 移動平均の種類

移動平均には「単純移動平均」「加重移動平均」「指数平滑移動平均」という3種類があるようです

おおまかな使い分け方⏬️

* 年間の大まかな在庫推移や、安定的な平均在庫を知りたい ▶ 長期間の単純移動平均 (例: 60日, 90日)
* 月次での発注計画の参考に、最近の傾向を少し重視して見たい ▶ 中期間の単純移動平均 or 加重移動平均 (例: 20日, 30日)
* 日々の在庫チェックで、危険水準への接近などを早めに検知したい ▶ 短期間の指数平滑移動平均 or 加重移動平均 (例: 5日, 10日)

***

今回は最もシンプルな単純移動平均をSQLで求めたいと思います!!




## 単純移動平均の求め方
ざっくりとした計算プロセス
* 一定期間のデータを合計し、その期間数で割る。
* 計算する期間を一つずつずらしながら平均値を算出していく。

### 例（7日移動平均）:
ある日の移動平均値は、その日を含む過去7日間のデータの平均。
次の日の移動平均値は、その日を含む過去7日間のデータの平均（最も古い日のデータは除く）。

## 単純移動平均を求めるクエリサンプル


```sql
SELECT
    ID,
    DATE(TIME) as "日付",
    SUM(TRY_CAST(QUANTITY AS NUMBER)) as "在庫数",
    AVG(SUM(TRY_CAST(QUANTITY AS NUMBER))) OVER (ORDER BY DATE(TIME) ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as "移動平均"
FROM
    ZAICO_LIST
GROUP BY
ID,DATE(TIME)
;
```

### ポイント💡
* ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  * 計算対象とする行（ウィンドウフレーム）の範囲を指定します
    * CURRENT ROW: 現在処理している行（日付）
    * 6 PRECEDING: 現在の行の前6行（6日前）
⏩️ つまり、「現在の行（当日）とその前の6行（6日前まで）の合計7行（7日間）」を指定しています

* `TRY_CAST(QUANTITY AS NUMBER)`
  * もし QUANTITY の値が数値に変換できない形式（例: 空文字列、テキスト文字など）だった場合に、エラーを起こさずに NULL を返す関数です
  * おまじないとして設定しておきました


## クエリを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/9b1cc5aa-229b-4ba8-a895-817183046567.png)

スプレッドシートにエクスポートして、グラフ化してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/604a7838-0e5f-4164-9eab-1992a08e6a53.png)

増減は激しいものの、ならすと大体60～70ぐらいの在庫量であることがわかりました。

***

今回はスプレッドシートでグラフ化しましたが、BIツールと組み合わせることで、ID別・期間別の絞り込んだ、よりリッチで実用的な可視化ができそうです!!


# いかがでしたでしょうか
今回はZAICOの在庫一覧データから、移動平均を求めてみました。
日次でDWHにデータを積み上げていけば、他にも色々なデータ活用方法がありそうですね。

この記事を読んでいただいたかたの、なにか少しでもお役に立てば幸いです🙏
SharePoint上のファイルをデフォルトで閲覧専用にしたい

# はじめに
チーム内で昔のファイルをアーカイブとして保存するための置き場としてSharePointを使っており、ユーザの権限を閲覧のみにしたいという要望に対応したときの記録です。

# 今回やりたかったこととやったこと
やりたかったこと：Teamsに招待したメンバが閲覧権限でファイルに触れるようにしたい。
やったこと：デフォルトの権限が閲覧権限になるようにSharePointのアクセス許可設定を変更。

# 設定手順

設定 > サイトのアクセス許可 > 高度なアクセス許可の設定を開く。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/56717dff-c35a-43b4-b553-436e626645ad.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/0127932c-b5ef-43e5-b0cc-bf9cb11a079d.png)


ユーザーとグループ > {チーム名}閲覧者 グループを選択

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/079a5395-ba69-4c13-92ef-d8e2e038b205.png)

新規 > ユーザーの招待 で、{チーム名}メンバーを招待

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/8695bcbb-9312-48f0-8216-a7296dfd7dcb.png)

{チーム名}メンバー グループからは{チーム名}メンバーを削除

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/d9f11d97-a023-4a08-a435-5bd2d2cabaac.png)

{チーム名}所有者 グループに個別で所有者を招待

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/0b01b392-384a-44cc-84a4-e3c7d98a67c3.png)

# おわりに
ファイルやユーザに対して権限を個別に設定しなくて良くて便利ですね。

# 参考
https://learn.microsoft.com/ja-jp/sharepoint/dev/general-development/authorization-users-groups-and-the-object-model-in-sharepoint

https://learn.microsoft.com/ja-jp/sharepoint/teams-connected-sites
Mattermostのヘッダーでハッシュタグによる検索をする方法

# 前提知識
Mattermostでは`#`は見出しに使われることが多いですが、半角スペースを埋めることで**ハッシュタグ**として使うことが可能になります。
例.
```markdown
# 見出し
半角スペースを空けることで見出しになりますが...

#ハッシュタグ
空白を埋めてハッシュタグ化！
```
### `#ハッシュタグ`をクリックすると...
![ハッシュタグ検索結果](https://i.gyazo.com/55c80f5b660dd1174ba168dbbee4483b.png)
ハッシュタグを付けた投稿が検索される。
# `#ハッシュタグ`をそのままヘッダーに書くと...?
エンジニアの方であればMatterMostで日々timesを書く方がいらっしゃると思います。
そこで後で見返しやすくなるよう、ヘッダーに`#ハッシュタグ`を書くようにしました。
![ヘッダーにハッシュタグ記述](https://i.gyazo.com/07660fec902ab358924e2e2330dc84b1.png)
そしてヘッダーの`#ハッシュタグ`をクリックすると...
### 検索画面が表示されない！？
どうやらヘッダーに記述した内容は検索機能の範囲外になってしまうようです。これでは**ハッシュタグ**の意味が無い...
# 対策方法
Mattermostにはヘッダーの文章がウインドウ幅に収まりきらないと**モーダルウインドウ**が表示されるという特性があります。
モーダル内では検索機能が適用されるので、今回はこちらを利用していこうと思います。
## モーダルが出現するまで文章を書く
荒療治な方法ではありますが、これが一番手っ取り早いです。例えばハッシュタグの後に軽く自己紹介を書いてみるとか...
![ヘッダー 自己紹介文](https://i.gyazo.com/954fcb7daab3ff8226d3b0eb9f1fe512.gif)
もしくはひたすら絵文字を載せてみるとか...
![ヘッダー 動物園](https://i.gyazo.com/211ea2d788881d63f626fb90e67282f4.gif)
※賑やかで面白いですが、肝心のハッシュタグが埋もれないよう注意が必要です。
# 最後に
今回はMattermostのヘッダーの特性について紹介させていただきました。
Mattermostでtimesを書いている方は、自分だけのオリジナルヘッダーを作り上げていくのも楽しいかもしれません✨
Power Apps でアプリのバージョン情報を表示する

# はじめに
ごきげんよう、百合宮桜（Miyu）です。
今回はアプリのバージョン名の取得についてお話ししたいと思います。
Power Apps のアプリ上に現在のバージョン名を表示したいという要望はよく聞きます。
確かにバージョン名でアプリの最終更新日が分かれば、こまめにアップデートしてくれているのが分かって使いたくなりますもんね♪

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/9e1f14ba-0a07-4fe9-b6eb-56054c5abebd.png)

Power Apps では「作成者向け Power Apps 」というコネクタを利用して、アプリのバージョン履歴の変更済み列のデータをバージョン名として表示することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/7759695e-2cf1-4e4f-943b-8c644198f9cc.png)

# 表示方法
1. アプリのID を取得します

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/1499799c-55da-4989-957b-e9465eb775ab.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/cb0c19ff-2d7c-4bb2-87e9-716be2154144.png)
    
2. データの追加 > 作成者向け Power Apps をクリックします

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2b7a6bf3-9b2f-41d7-8291-733a80795871.png)

3. 画面右側に出てくるウィンドウで「接続」をクリックして、データを追加します

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2c923100-a761-4e72-9709-54e432ac4864.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/294d47b1-d069-4464-8f39-6d2815704b68.png)

4. テキストラベルを追加し、テキストプロパティに以下の式を入力します

    ```
    First(
        作成者向けPowerApps.GetAppVersions("アプリID").value
    ).properties.appVersion
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/ab916159-7293-4bc5-bbae-094717b61695.png)

# 終わりに
いかがでしたか？　
作成者向け Power Apps コネクタはバージョン名の他にも様々な情報を取得できます。

https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/

ぜひ活用してみてくださいね。