OmniAICreator/Qiita-1.07M huggingface dataset:
土壌肥沃度試験市場調査：シェア、歴史的成長、分析、機会、2036年までの予測

Research Nester の最近の市場調査分析 <b>「<a href="https://www.researchnester.jp/reports/soil-fertility-testing-market/5243">土壌肥沃度試験市場調査</a>:世界的な需要分析と機会展望2036」</b> では、タイプ、アプリケーション、方法、地域別の市場区分の観点から、詳細な競合他社分析と世界的な土壌肥沃度試験市場の詳細な概要が提供されています。
<h3>精密農業の導入拡大が世界の土壌肥沃度試験市場の成長を促進</h3>
土壌肥沃度試験の世界市場は、精密農業の採用拡大により成長する見込みです。多くの裕福な国で精密農業が採用されています。精密農業は、土壌検査で発見されたニーズに応じて肥料を散布することで、肥料使用効率を高めることを提案しています。精密農業技術は、圃場の特定の場所の土壌検査結果を使用して、特定の場所で作物生産のための栄養素やその他の投入物を正確に施用することを可能にすることを目的としています。したがって、精密農業の台頭とともに市場が発展すると予想されます。

さらに、健康な土壌の価値と土壌肥沃度が作物の生産量と品質に与える影響は、農家の間でますます認識されています。土壌の健康状態を評価し、作物の成長を妨げている可能性のある栄養不足を見つけるには、土壌の肥沃度を検査することが不可欠です。
<h2>土壌肥沃度試験市場概要</h2>
当社の土壌肥沃度試験市場調査によると、市場規模は2036年末までに40億米ドルに達し、予測期間（2024～2036年）を通じて約7％のCAGRで成長すると予想されています。2023年の土壌肥沃度試験業界の規模は約10億米ドルでした。

![Soil Fertility Testing Market.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491677/68c80530-fa31-5f25-aca2-519c86349f0f.jpeg)

<b>このレポートの詳細情報:</b> <a href="https://www.researchnester.jp/sample-request-5243" target"_blank">無料サンプルをダウンロード</a>
<h3>土壌肥沃度試験市場の成長要因と課題</h3>
世界の土壌肥沃度試験市場の成長に関連する主な成長要因と課題は次のとおりです。

<b>成長要因:</b>
<ul>
<li>高品質の食品に対する顧客の嗜好の高まり</li>
<li>作物病害の蔓延の増加</li>
</ul>

<b>課題:</b>
土壌肥沃度試験の世界市場における潜在的な障壁の1つは、熟練した知識豊富な土壌検査員の不足です。実施する必要がある検査の量に比べて、土壌評価者とシステム検査員の数は多くありません。資格のある検査員が不足しているため、データ検査に不備が生じることがあり、不適切なデータ解釈につながることもあります。さらに、これらの検査員や評価者は現在の技術に精通していないため、プロセス全体の精度が低下します。

<b>詳細なレポートは以下からアクセスできます:</b>
<a href="https://www.researchnester.jp/reports/soil-fertility-testing-market/5243">https://www.researchnester.jp/reports/soil-fertility-testing-market/5243</a>
<h3>土壌肥沃度試験市場セグメンテーション</h3>
土壌肥沃度試験の市場はタイプ別に、化学的、物理的、生物学的検査に分類されます。これらの区分のうち、予測期間中に化学的区分が約65% と最も高いシェアで成長すると予想されています。ただし、物理的区分も成長すると予想されています。土壌肥沃度を測定するための最も一般的で確立された手法は物理的検査です。保水性と排水性、通気性/透水性、圧縮性、総溶解固形物 (TDS)などの物理的特性に加えて、pH、電気伝導性、有機含有量 (窒素と水分)、TDSの検査も含まれます。有史以来、土壌の物理的検査は農業研究における重要な手段となっています。
<h3>土壌肥沃度試験市場地域別概要</h3>
地域別に見ると、ヨーロッパの土壌肥沃度試験市場は、予測期間中に約40% のシェアを獲得する見込みです。この地域の市場の成長は、農業規制の強化によるものと考えられます。たとえば、EUは有機栽培とこれらの有機製品のラベル付けに関する規則を導入しており、2022年に施行される予定です。
<h3>土壌肥沃度試験市場の主要企業</h3>
このレポートでは、世界の土壌肥沃度試験市場における主要企業の現在の競争状況も提供しており、JFE Techno-Research Corporation、Weathernews Inc.、Japan Food Research Laboratories、Iwasaki Electric Co., Ltd.、Eurofins Scientific、SGS SA、ALS Limited、Intertek Group plc、Bureau Veritas、Waters Agricultural Laboratories, Inc.などの企業プロファイルが含まれています。

<b>無料サンプルレポートをリクエストする @</b>
<a href="https://www.researchnester.jp/sample-request-5243">https://www.researchnester.jp/sample-request-5243</a>
<h2>Research Nester について</h2>
Research Nester は、戦略的市場調査およびコンサルティングサービスを提供する大手企業です。当社は、公平で比類のない市場洞察と業界分析を提供し、ヘルスケアおよび製薬などの業界、複合企業、経営チームが将来のマーケティング戦略、拡張、投資などについて賢明な意思決定を行えるようにすることを目指しています。私たちは、どんなビジネスも新たな可能性を秘めていると信じています。戦略的思考によって適切なタイミングが生まれます。当社の独創的な考え方は、クライアントが将来の不確実性を回避するために賢明な決定を下せるよう支援します。
<h3>詳細についてのお問い合わせ:</h3>
ナオミコスギ

<b>Eメール：</b> <a href="mailto:info@researchnester.jp">info@researchnester.jp</a>

<b>日本の電話番号:</b> +815050508480

<b>URL:</b> <a href="https://www.researchnester.jp/">https://www.researchnester.jp/</a>
AdGuard DNS for Windows

## 広告除去用

### IPv4

優先DNS、代替DNS
94.140.14.14
94.140.15.15


### IPv6

優先DNS、代替DNS
2a10:50c0::ad1:ff
2a10:50c0::ad2:ff

### HTTPS経由のDNS
オン(手動テンプレート)
https://dns.adguard-dns.com/dns-query


https://support.microsoft.com/ja-jp/windows/tcp-ip-%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-bd0a07af-15f5-cd6a-363f-ca2b6f391ace#WindowsVersion=Windows_11
【SharePoint】Listsのダミーデータをパパっと作りてェんだ！

# はじめに

こんにちは、reireです。

皆さん、Power Appsで作成したアプリのデータソースには何を使用していますか？

私はもっぱらSharePoint Listsを使用することが多いのですが、
Listsを作成して、
アプリと接続して、
よし、アプリの各機能もある程度できてきたし動作確認するか…

っていうときに、まとまったダミーデータがListsにほしくなりませんか？

# 素のChat-GPTにデータを生成させるのは結構大変

そこでChat-GPTを使用すれば楽勝なのでは！？
というのは、2024年となっては当然の流れですよね。

ただ、これが意外と大変なのです。

各列のデータ型はもちろん、選択肢や入力必須の有無、デフォルト値などを教えなければいけません。
また、入力する文字列の規則など、運用面的な部分も伝えなきゃいけません。
(SN列は「SN+○○○(3桁の数字)」である、など)

それらを過不足なくプロンプトに書き起こすって、想像以上に大変なんですよね。
皆さんは↓の画像の情報を文字に書き起こしてChat-GPTに伝えられる文章力と根気はありますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/130ea052-6da0-92b7-4476-eb34cf57e721.png)
私にはとてもありません。

これをさらに列の数だけ…、心が折れてしまいます。

ということで、
今回はChat-GPTでなるべく簡単かつ思い通りにダミーデータを生成する方法を紹介できればと思います。

# やり方

前提として今回は以下のようなSharePoint Listsを使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/bb7548ce-5b88-1428-4af3-90a364b21972.png)


## 1. 各列の説明欄に指示を入力する

まず前述の運用面などの指示ですが、これは各列の説明欄に書いておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/582fed25-0480-98b9-413b-c215cee28366.png)
これでどの指示がどの列に紐づいているか明確になります。

ちょっと面倒ですが、どのような列なのかを明記することで保守性も上がりますので頑張って書きましょう。

## 2.SharePoint Listsスキーマをエクスポートする

次にCSVエクスポートを行います。
ただし、通常のCSVエクスポートではありません。
「**スキーマを含むCSVにエクスポート**」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/09f10952-d7ca-d75d-f823-48a11159d2cf.png)

ダウンロードされたCSVを開いてみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/0b5b8923-64cd-0fc1-1427-082235816e54.png)
このようになっています。

2行目はただのCSVのヘッダーですが、
1行目はLists自体のXMLなどが記載されたスキーマとなっております。

ここには各列の列名やデータ型、入力必須の有無、先ほど記入した説明欄の内容など、さまざまな情報が記載されています。

つまりこの情報をChat-GPTに渡すことで、Listsの設計がGPTに一発でかなり正確に伝わってくれるということです！

## 3.MyGPTを活用する

この時点でGPTに渡して「ダミーデータを作って」というだけでもいいのですが、可能であればスキーマ情報のみを投げるだけでいい感じのダミーデータを作成してほしいですよね。
というわけで、せっかくなのでMyGPTを構築してみました！

[Dummy Lists Create](https://chatgpt.com/g/g-PiEWidcUq-dummy-lists-create)

こちらのGPTには

- スキーマ情報からダミーデータ作って
- 特に指示がなければ20件くらい
- 応答は簡潔かつスピード重視

というような指示がプリセットされています。

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/00a54583-d715-1490-5f88-24efc12abd87.png)

CSV 1行目のスキーマ情報だけを送っただけ、追加の指示は全くなしでこのようなデータを自動で生成してくれました！

あとはこれをコピーして…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/a71056d5-3ecb-29d0-5db5-49bedcbb579c.png)

グリッドビューで張り付けると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/5f593454-aafc-a71f-b317-cf68f30c2850.png)

できた！！
素晴らしい！！！

# おわり

今回はChat-GPTを利用したSharePoint Listsのダミーデータ生成を少し工夫してやってみました。
プロンプトを書く手間を極力省きつつ、精度の高いダミーデータを作成することができたのではないでしょうか！

とはいえ、
ユーザー列はどうするんだとか、
そもそも列名などに社内の固有情報があるのでChat-GPTに送るのはちょっと…
など課題はいくつかありますが、それでも十分な効率化を行うことができたと思います。

ぜひ皆さんも、Chat-GPTなどの生成AIを活用してちょっとした手間を効率化してみてはいかがでしょうか？

それでは
Jupyternotebook + Cursorエディタがやばい

# やばい
JupyterNotebookでエラーが出てしまったときにcurosorエディタで「エラーをとって」というだけですごい確率で正しいコードを表示してくれる。

これがなぜか.pyファイルをコンソールで実行してエラーがでたときに「エラーをとって」と頼んでも正しいコードを返してくれない。

おそらく.ipynbファイルにソースコードとエラーが両方記載されているため、それを読み取ったAIは正解率が高いのだろう。
OpsRamp - アラートをSNS・Voiceで通知する方法 (Alert Escalation編)

本記事では、OpsRampでアラート発生時にSNSおよびVoice(架電)で通知する方法について説明します。

# 概要
OpsRampでは、アラートのメール通知のほかにSNSおよびVoiceでも通知することができます。

# 設定方法
アラートをSNSおよびVoice通知する方法は、以下のように設定します。
自アカウントのプロファイルから電話番号(国際電話番号)を登録および認証します。
![enable_voice_notification1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/f677dbcb-0f77-d91f-c8fd-16e44a803e3a.png)
![enable_voice_notification2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/9ae31b38-fc02-5a6b-910c-a8da3e77e183.png)
![enable_voice_notification3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/28e07869-0935-a5ef-5d24-2b37a719d67b.png)
SNSおよびVoice通知の有効化します。Send Alert Notification as FollowsセクションのSNSまたはVoiceにチェックを入れます。
![enable_voice_notification4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/e08b8fdc-f41f-0ca2-00de-aa5fde6f5027.png)
![enable_voice_notification5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/595bd8fc-ec70-0f88-5a86-b88b3a84c02b.png)

Setup > Alerts > Alert Notificationからアラート通知ポリシーを設定します。
![alert-notification1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/421a23ef-6b71-68ef-bf2e-485fb997db0e.png)
Define Escalation Rules for Alert Escalation PolicyセクションでEscalate asにNotificationを選択し、Send Alert Notifications toに対象のユーザを選択します。
![alert-notification2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/3cfcbdf9-4bbc-1e0b-a366-59a771545e13.png)



---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
UnrealEngine初心者の為の超基本的な５つのUPROPERTY

### 概要
UnrealEngine初心者の為に、忘れがちなUPROPERTYの使い方を超簡単に要約してまとめます

------------

### EditAnywhere
```
UPROPERTY(EditAnywhere)
```
**意味**
Blueprintエディタとレベルに配置したアクタの値を変更することができる。

-------
### EditDefaultsOnly
```
UPROPERTY(EditDefaultsOnly)
```

**意味**
Blueprintエディタで値を変更することができる。
レベルに配置したアクタの値は変更できない。

---------------------------------------
### VisibleAnywhere
```
UPROPERTY(EditDefaultsOnly)
```
**意味**
Blueprintエディタとレベルに配置したアクタの値を確認することができる
(値を変更することはできない)

-------------------------
### BlueprintReadWrite
```
UPROPERTY(BlueprintReadWrite)
```
**意味**
Blueprintイベントグラフで値のGet(取得)、Set(設定)を行うことができる

------
### BlueprintReadOnly
```
UPROPERTY(BlueprintReadOnly)
```
**意味**
Blueprintイベントグラフで値のGet(取得)を行うことができる
(Set(設定)はできない)
Webエンジニアのためのデータベース技術[実践]入門

# はじめに
データベース設計についてを復習するため

# 1章

- 排他制御をしなければ整合性が崩れる
- 排他制御の範囲が広いと並列性が落ちる

# 2章
- 全件検索は大量データに向かず、O(N)の計算量になる（データ数がN倍になればN倍の計算量（時間）がかかる
- ハッシュインデックス...キーの値をハッシュ関数にかけてそのハッシュ値と値のペアを持つ
- B+Treeインデックス...木構造のインデックス、レコード数が多ければ階層も増える。必要な計算量はレコード数Nに対しO(log2N)
- 一意性が保証されたインデックスを「一意インデックス」
- 複数の条件によるインデックスを「マルチカラムインデックス」

# 3章
- 必要なデータ項目を洗い出してテーブル設計に落とし込んでいく作業を「データモデリング」と呼ぶ
- テーブル設計では、行を一意に識別するための「識別子」を導入するのが一般的でこれを「主キー」と呼ぶ
- 値が存在しないコードを入力したときエラーを返す検知を自動で行うデータベース標準機能の「参照整合性制約」
- アプリケーション側で入力確認をさせるのを「チェックデジット」という
- チェック処理の基本形は、「そのID（識別子）が関連するテーブルに存在しているかどうかを参照確認する」
- 「１：N」の関連を２系統持ったマッピングテーブル（中間テーブル）

# 4章
- テーブル単位で複数のサーバに分散することを「sharding(シャーディング）」と呼ぶ。シャーディングをすると同じサーバ内にJOINするテーブルがあるかわからないためJOINを使うことが難しくなる
- 「EXPLAIN」はSQLの実行結果が適切か判断してくれる機能
- Oracleには「PL/SQL」という専門言語まである
- ストアドプロシージャーはデータベースが提供している機能で、何十回も実行する必要のあるSQL文の代わりにまとめたもの

# ５章
- 同じデータを二箇所以上のHDDに分散させる技術を「RAID」と呼ぶ。余裕があれば「RAID1」、ない場合は「RAID5」
- RAID1...2台のHDDに同じデータを書き込む方式。利用可能容量はディスク本数分の半分
- RAID5...誤り訂正符号であるパリティをデータと共に分散して書き込む方式。利用可能容量はディスク本数N本の場合にN-1本文になる
- HDDが一本目壊れた時に新しいHDDに変えることを「ホットスワップ」という
- レプリカ（複製）を別サーバ上に作成する技術「レプリケーション」と呼ぶ
- 片方向レプリケーション...「マスタ」に更新した結果が「スレーブ」に「非同期」で電波する

# 6章
- 整合性の取れた状態に自動的に修復することを「トランザクション」と呼ぶ

# 8章
- 全体としてシステムが一瞬の間止まったように見える現象を「ストール」と呼ぶ

# 9章
- MySQLの稼働を止めてバックアップすることを「コールドバックアップ」と呼ぶ
- MySQLの稼働を止めずにバックアップすることを「オンラインバックアップ」と呼ぶ
- 論理バックアップ...人間が読めるフォーマットでバックアップ
- 物理バックアップ...バイナリ形式でそのままバックアップ
- 論理バックアップと物理バックアップの違いはリストアの差
- バイナリログを当ててリカバリする操作のことをポイントインタイムリカバリ（PITR)またはロールフォワードリカバリと呼ぶ

# 10章
- MySQLでエラーログチェック方法

# 11章
- サービスの中でどのようなデータ項目を扱うかを整理して、それをテーブル関連として落とし込むことを「データモデリング」と呼ぶ
- 列指向データベースとは、列（カラム）を処理単位としている
- NoSQLの用途は、RDBMSのキャッシュとして使う


# 終わりに
データベース周りで基本情報やSQLで勉強していたことも出てきてたので取っ付きやすくはあった
ただ本当に入門でデータベースがどういうのかを知りたい人向けだったかな
StoryBookでHooksを利用する

本記事の対応に至るまで時間がかかったので、執筆 :memo:

## 結論
対象コンポーネントをラップしたコンポーネントを作成して`render()`でレンダリングする

## 対応
表示状態をコンポーネント外部で管理する`Modal`コンポーネントを例とします。

1. 拡張子が`.tsx`でない場合は`.tsx`に変更
    - `Modal.stories.ts` => `Modal.stories.tsx` <br /><br>
2. `Modal.stories.tsx`に以下を追記


```tsx
type StoryWithHooks = StoryObj<typeof ModalWithHooks>;

export interface ModalAnyProps {
  prop: string;
  // ...
}

// 対象コンポーネントをラップしたコンポーネント
const ModalWithHooks: React.FC<ModalAnyProps & PropsWithChildren> = (args) => {
  const [showModal, handleOpenModal, handleCloseModal] = useModal();

  return (
    <>
      <Modal
        {...args}
        showModal={showModal}
        handleOpenModal={handleOpenModal}
        handleCloseModal={handleCloseModal}
      />
    </>
  );
};

// ラップしたコンポーネントをrender
export const Default: StoryWithHooks = {
  render: () => {
    return (
      <ModalWithHooks>
        Contents
      </ModalWithHooks>
    );
  },
};
```

## まとめ
以上です。
ニッチな記事だと思いますが、どなたかの役に立てば...
React(TypeScript) + ViteのアプリをGitHub Pagesにデプロイする！

# はじめに

Reactで作成したページをGitHub Pagesでデプロイする方法についての備忘です。
下記ページを参考にしています。

https://dev.classmethod.jp/articles/deploying-reactvite-website-in-github-pages/

# 手順
## アプリの作成
- Github リポジトリを作成してローカルにcloneし、Reactアプリを作成します

```
npm create vite@latest
```

- コードをGitHubリポジトリにpushします


## vite.config.tsの修正

```vite.config.ts
// https://vitejs.dev/config/
export default defineConfig({
  base: '/<GitHubリポジトリ名>/',
  plugins: [react()],
})
```

## gh-pagesパッケージのインストール
`gh-pages`パッケージをインストールする。


```
npm install gh-pages --save-dev
```

## package.jsonの修正
`predeploy`スクリプトは、アプリケーションをデプロイする前に自動的にビルドプロセスを実行します。
`deploy`スクリプトは、gh-pages パッケージを使用して、dist ディレクトリの内容を GitHub リポジトリの gh-pages ブランチに公開します。
（`npm run build`コマンドを実行すると、`dist`ディレクトリが作成され、Reactアプリの全ての最適化されたファイルが格納されます。）

```package.json
{
  "homepage": "https://<GitHubアカウント名>.github.io/<GitHubリポジトリ名>/",
    ～略～
  "scripts": {
    ～略～
    "predeploy": "npm run build",
    "deploy": "gh-pages -d dist"
  },
  "dependencies": {
    ～略～
  },
  "devDependencies": {
    ～略～
  }
}

```

## デプロイ
デプロイコマンドでデプロイを実行する。

```
npm run deploy
```

## ページの表示
GitHubの`Settings`->`Pages`の項目の`Visit site`からページに飛べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738663/066af8fe-f687-fe3b-8eba-1a350f6864a4.png)


表示されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738663/2556ec5c-68ce-1e63-341e-92f5e32c520c.png)
新卒2年目エンジニアの成長記録: React学習6か月目

# はじめに
新卒2年目エンジニアのA.Kと申します。
これまでは運用保守やテストの案件に参画しておりましたが、フロントエンドの開発案件を希望しているため、**個人でReact、Next.js、TypeScriptを使ってアプリを作成しています。**
毎月このような記事を投稿していますが、**ついに学習から半年が経過しました！**

# 学習6カ月目にやったこと

<font color="Red">**Next.jsで技術ブログを作成**</font>

作成過程や詳細はこちらの記事にあります。

https://qiita.com/AK_React/items/869a52adbb3363064231

Reactを約半年ほど勉強し、**さらなるWebアプリのパフォーマンス向上が見込めるNext.jsを触ってみました。**
学習スタイルはこれまでと全く変わらず、**Udemyで最低限のインプット→手を動かして何か作る　という流れ**です。

やはり手を動かすことで「他のフレームワークとの違い」を実感しやすいと思います。
ずっとReact一筋でやってきた自分からすると、新鮮な経験でした。

また、**React学習当初の自分と比較して、「エラー解消のスピードが少しだけ上がっているのでは・・？」**　と感じました。
おそらく、これまで数々のエラーに遭遇してきた分、解決手段の引き出しが増えているのだと思います。

# 学習6カ月目に感じたこと

<font color="Red">**自分がコントロール可能な事象にフォーカスする**</font>

キャリアに関してです。
現職にて8月から案件移動のタイミングがあり、元々強く希望していたフロント開発案件に参画する予定でした。

しかし、「タイミングが悪い」との理由でテスト打鍵のスポット案件に参画する事態となりました。（営業側は頑張ってくれているようですが）

私自身、フロント案件参画への強い希望は半年前から伝えており、学習成果物の共有を済ませて「いける！」と思っていたので、正直かなり落ち込みました。

「何がダメなんだろう。。」と一瞬（5分くらい）考え込んだのですが、
そもそもの理由である「タイミング」に関しては**自分でコントロールしようがありません。**　なので**ここで悩むのは無駄**だと考えました。

**今私ができることとしては、
引き続きフロント案件に参画できるよう必要な技術力をつけていくこと。
つまりこれまで通り学習を続けていくこと
そして、その経験をアピールし続けること
のみだと思います。**

それでもダメなのであれば、環境を変えるのみです。

このように、**思い通りにいかない時期やタイミングは往々にして訪れますが、自分がコントロール可能であること・そうでないこと　を切り分けて前者にフォーカスすること**を意識しています。


# おわりに
以上、React学習6か月目の振り返りでした。
**キャリアも含めて、人生はすべてが順調にいくわけではないと実感した一カ月**でした。
引き続きやるべきことをやっていきます。



# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp
ついでにMac miniにもProxmox入れてみた(仮想化技術に触れてみよう)

# はじめに
<!-- 発端や概要を記載 -->
昨日はWindows用のデスクトップパソコンにインストールしましたが、
自宅に使っていない`Mac mini(Late 2014)`が3台転がっているので、
これにもProxmox VEをインストールしてみます。

今回はMac OSとのデュアルブートは必要なかったため、
シングルブート前提でProxmoxVEをインストールします。

# 目次

1. [①ブートUSBを用意する](#ブート用usbを用意する)
1. [②USBからProxmox VEをインストールする](#usbからproxmox-veをインストールする)
1. [③さいごに](#さいごに)

# ①ブート用USBを用意する

今回は、[前回の記事](https://qiita.com/yusaku-creative/items/2f1eec4b4924c243ce07)で作成したブート用のUSBをそのまま流用します。

前回の記事↓
[Proxmoxをインストールしてみた(仮想化技術に触れてみよう)](https://qiita.com/yusaku-creative/items/2f1eec4b4924c243ce07)

# ②USBからProxmox VEをインストールする

Mac miniにブート用USBを差し込み、マシンを起動してBoot画面を開きたいが、
通常のMBとはBoot画面の呼び出しのショートカットキーが異なります。

>Macの場合: Optionキーを押したままMacを起動します。
[Apple公式 macOSユーザガイド-Startup Manager](https://support.apple.com/ja-jp/guide/mac-help/mchlp1034/12.0/mac/12.0)

例に倣って`option`を押しながら起動すると`Startup Manager`が起動したので、
`EFI Boot`を選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260705/b02c3264-d666-6716-b9bc-089cc5421c7a.png
" width=90%>

キャプチャーボードの影響で解像度がおかしいことになっているが、
見慣れてきたインストーラー画面が起動しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260705/48625c64-6c84-ecc4-415b-68092d1d8ab4.png">

インストール中の画面は前回の記事で紹介しているので割愛しますが、
今回は３台のマシンを下記のように設定してみました。
 
 |  | ホスト名 | IPアドレス |
|:-:|:-:|:-:|
|１台目| pve31.local | 192.168.0.201 |
|２台目| pve32.local | 192.168.0.202 |
|３台目| pve33.local | 192.168.0.203 |

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260705/630807b5-dfe3-acd1-5261-f9e828afa1f1.jpeg" width=50%>

全台インストール後、整線やらなんやらすませて全台起動し、
別PCから各端末に設定した`IPアドレス:8006`でWEBコンソールに接続。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260705/9a5eaceb-3359-3374-6dc6-bc9136b2b5b1.png">

無事WEBコンソールにアクセスできるところまで行けました。

# ③さいごに
Late2014のIntelCPU Macminiでは特殊な対応を必要とせずに、インストールをすることが出来ました。
今回はデュアルブート構成を想定していなかったですが、MacOS側でパーティション分割をすればできそうですかね。
折角同スペックマシンが３台も揃っているので、そのうちクラスタ構成にも挑戦したみたいなと思います。
MacBookで時刻がズレた時の調整方法

# 目的

1ヶ月ほど個人のMacBookを使わずにいたら、現在時刻から1ヶ月ほど時刻がズレていました。

dateコマンドを2024/8/14 14時ごろに起動したら、時刻が2024/7/14 9:40になっています。

```
$ date
2024年 7月14日 日曜日 09時40分53秒 JST
```

Appleのコミュニティを見て解決。下記のコマンドで現在時刻になりました。

```
sudo rm /var/db/timed/com.apple.timed.plist
sudo sntp -sS ntp.nict.jp
```

サーバ運用している訳ではないのですが、NTPサーバはこれを機にntp.nict.jpにしました。

# 参考
https://discussionsjapan.apple.com/thread/252960467?sortBy=rank
受注に対する納期を算出する【Excel】【PowerBI】説明②

下記①の続きの記事となります。
実用性はやや？ですが、思考実験としてエクセルの数式で納期回答をさせる手法です。
https://qiita.com/inu_mata_leon/items/cf336e4cdb53788397d9


前提条件：FILTER関数を使用します。EXCEL365もしくはEXCEL2021が必要となります。

![1660297184057-rjyyIBCvva.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/bf139b8e-25f9-3606-7d69-440470646c92.png)

上記の画像のように簡単なモデルを組んでみます。
左側が顧客からの任意の受注数。右側が予測に基づいた発注です。
本来なら「在庫を常に持つ＝即納の前提で」予測に基づいた発注をしているのですが、市況は割と簡単に予測を裏切ります（よくあるというよりしょっちゅうですよね）

そんなわけで受注残が出た場合（残念ながら実務においては「多種多様な品目が」「複数の受注に対して」受注残になるのが世の常です）

１．受注・発注それぞれに対し「基本時系列で」ソートします。ソートのやり方は下記の通り。
（１）受注：受注日を基本としますが、緊急受注分のみ受注日より上位のソート順とします。
（２）発注：納入予定日をもってソート順とします。

２．表中黄色で着色された列のように、受注・発注それぞれの累計値を算出します。このモデルの場合、2行目にそれぞれ下記の数式を記入します。

（１）受注側のE2列に「=SUMIF($A$2:A2,A2,$D$2:D2)」を記入して後はドラッグして下端まで数式を投入します
（２）発注側のL2列に「=SUMIF($H$2:H2,H2,$K$2:K2)」を記入して後はドラッグして下端まで数式を投入します

３．受注側の判定（F列）2行目に描きの数式を記入します。
（１）受注側のF2列に「=INDEX(FILTER($J$2:$J$7,($H$2:$H$7=A2)*($L$2:$L$7>=E2)),1)」を記入して後はドラッグして下端まで数式を投入します。

ここまで記入したところで、発注側の累計値が受注側の累計値を上回った一行目の納入予定日がF列に表示されるはず。

本来であればこれはテーブル化した方がやりやすいのですが、思考実験としての説明のためあえてそこは省いています。次回は「データベースとしてどう処理するか」編となります。
Poetryを利用した場合にVSCodeで依存関係がうまく効かない場合の対応

# Poertryを利用した場合のVSCodeで依存関係がうまく効かない時の対応

## TL;DR

1. Cmd + Shift + p でコマンドパレットを開く
1. Python interpreter を選択する
1. poetry env info --pathの値を入れる

## 1. Cmd + Shift + p でVSCodeのコマンドパレットを開く

## 2. Python Interpreterを選択する

開いたコマンドパレットに `Python Select Interpreter`と入力して歯車マークを押す

![スクリーンショット 2024-08-14 17.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/6e7c0edb-ded7-6787-a142-b8b10c909e22.png)

## 3. poetryのvenvのpathを入力する

```terminal
% poetry env info --path
でもいいけど、pbcopyの方が楽
% poetry env info --path | pbcopy
```

で取得したパスを打ち込む。


打ち込んでも変わらない場合は、VSCodeを一度再起動する
Paiza×Qiitaキャンペーン Javaで解説してみた【D 文字の一致編】

# はじめに
私はIT講師をやっています。
Paizaは初心者や、新しく言語を学んだ後の軽いコード練習用に丁度いい難易度の問題が多いサイトです。
せめて生徒には"Rank Bくらいまでは解けた方がいいよ"という形でやらせているのですが、今まで一切プログラミング的思考に触れてきていなかった方には難しいですね。
Rank Bあれば最低限、日本語による指示の理解及び、コードに変換できる能力が保証されますので、有象無象だらけの未経験の中ではマシということになりますので。

というわけで、折角のキャンペーンですので解説を記事にまとめてみました。
一度自力で解いてみてから読む方がいいかとは思います。
対象ランクへ挑戦する方向けの記事ですので、あえて解説していない部分もあることはご了承願います。

# 問題へのリンク

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/diff_str

# 解答コード
<details>

~~~
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		final String A = scanner.next();
		final String B = scanner.next();
		scanner.close();
		
		System.out.println(A.equals(B) ? "OK" : "NG");
	}
}
~~~

</details>

# 解説

<details>
文字列同士の比較は

~~~
A == B
~~~
ではなく
~~~
A.equals(B)
~~~
になることです。
Javaの場合、Stringをはじめとする大文字で始まる型は == で**中身が同じか**どうかは比較できません。
Stringは**参照型**です。intやlongといった、小文字で始まる**プリミティブ型**と異なり、値の中身を直接保存していません。
どこにデータを保存しているかという情報しか入っていない為、 == だとデータの**中身が同じか**ではなく**保存場所が同じか**どうかという判定になります。
Stringは文字が連なって文字列になっています。ですので、データの保存領域がintやcharと比較しても沢山必要です。大きなデータを取り扱う場合、全部まとめて処理するのではなく、必要なデータを必要な分だけ取り出して扱う方が楽なので、このような仕様になっています。人力で桁の多い計算を行う際、全桁一気に計算するより、一桁ずつ計算していった方が楽なのと一緒です。保存場所ではなく、直接値が入っていて、それをそのまま計算できるデータが**プリミティブ型**です。Stringはデータが大きすぎるわけですね。
equalsを使用すると、保存場所から中身を取り出して比較してくれます。

</details>

# 終わりに
キャンペーン期間内に全問解説記事の作成が終わるのかが一番の課題ですね...⇒無理でした
解答コードの作成は終わっているのですが、解説記事の作成の方が大変。
途中で飽きないよう応援お願いします。
ECサイトのテーブル設計 


ECサイト作成時のテーブル設計の一例を示す。

#### 商品テーブル

| 概要 | カラム名 | 制約 |
|:-:|:-:|:-:|
| PK  |  id |  not null  |
|   | name  | string, not null  |
|   | price  | integer, not null  |
|   | description  | string, not null  |
|   |  deleted | boolean  |

#### カートテーブル（carts）
| 概要 | カラム名 | 制約 |
|:-:|:-:|:-:|
| PK  |  id |  not null  |

#### カート商品テーブル（cart_products）
| 概要 | カラム名 | 制約 |
|:-:|:-:|:-:|
| PK  |  id |  not null  |
| PK  | cart_id  | bigint, not null  |
| FK | product_id  | bigint, not null  |
| FK | quantity  | integer, not null  |


#### 請求情報テーブル（billingInfos）
has_many :purchase_details
| 概要 | カラム名 | 制約 |
|:-:|:-:|:-:|
| PK  |  id | not null  |
|   | first_name  | string, not null  |
|   |  last_name |  string, not null |
|   | user_name  |  string, not null |
|   |  email |  string, not null |
|   |  address | string, not null  |
|   |  address2 | string,   |
|   | country  | string, not null  |
|   |  state |  string, not null |
|   |  zip | string, not null  |
|   |  same_address_flag | boolean, not null  |
|   |  save_info_flag |  boolean, not null |
|   |  payment_method |  string, not null |
|   |  name_on_card |  string, not null |
|   |  credit_cart_number | string, not null  |
|   |  credit_cart_expiration |  string, not null |
|   |  credit_cart_cvv | string, not null  |
|   |  discount_amount | integer  |


#### 購入明細テーブル（purchase_details）
belongs_to :billing_info

| 概要 | カラム名 | 制約 |
|:-:|:-:|:-:|
| PK  |  id |  not null  |
|  FK |  billing_info_id |  bigint, not null  |
|  FK |  product_id |  bigint, not null  |
|   |  quantity |  integer, not null  |

#### プロモーションコードテーブル（promotion_codes）

| 概要 | カラム名 | 制約 |
|:-:|:-:|:-:|
| PK  |  id |  not null  |
|   |  promotion_code |  string, not null  |
|   |  discount_amount |  integer, not null  |

#### カートプロモーションコード
| 概要 | カラム名 | 制約 |
|:-:|:-:|:-:|
| PK  |  id |  not null  |
|   |  cart_id |  integer, not null  |
|   |  promotion_code |  string, not null  |
javascriptでテキストボックスの値を取得する

## 作成する画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/2946c145-f75c-851d-b3f0-49f3e3f5c1d7.png)

値をそれぞれ入力し、ボタンをクリックするとアラートが入力した値が画面に出てくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/ae9e534d-2b24-68eb-6d03-29688eed8ff7.png)


## 実装

### javascriptの実装
document.getElementByIdにIdを指定して、テキストボックスのオブジェクトを取得する。
取得したオブジェクトの.valueからテキストボックスに入力された値を取得する。
```js
function ShowAlert() {
    let txt_name = document.getElementById('name');
    let txt_age = document.getElementById('age');
    let txt_email = document.getElementById('email');
    alert(txt_name.value + txt_age.value + txt_email.value);
}
```

### 画面の実装
```html
<!DOCTYPE html>
<html lang="ja">
 <head>
    <meta charset="UTF-8">
    <script src="js/http.js" async></script>
    <link rel="stylesheet" href="css/sample.css" type="text/css">
    <title>HTML入門-JavaScriptの基本</title>
 </head>
 <body>
    <div class=container>
    <h1>文書の主見出し</h1>
    <div class="flexbox">
            <label>Name</label>
            <input id="name" class="nice-textbox" type="text"/>    

            <label>Age</label>
            <input id="age" class="nice-textbox" type="text"/>

            <label>Email</label>
            <input id="email" class="nice-textbox" type="text"/>

            <a href="" class="btn_04" onclick="ShowAlert()">ここをクリック</a>
        </div>
    </div>
 </body>
</html>
```

```css
h1 {
    /*線の種類（二重線）太さ 色*/
    border-bottom: double 5px #FFC778;
  }

.container {
    font-family: arial;
    font-size: 24px;
    margin-left: 250px;
    margin-right: 250px;
    outline: solid 2px gray;
  }

.flexbox {
    display: flex;
    flex-direction: column;
    /*text-align: center;*/
}

a.btn_04 {
	display: block;
	text-align: center;
	vertical-align: middle;
	text-decoration: none;
	width: 180px;
    /*margin: auto;*/
    margin-top: 1px;
    margin-bottom: 1px;
	padding: 1rem 4rem;
	font-weight: bold;
	border: 2px solid #27acd9;
	background: #27acd9;
	color: #fff;
	border-radius: 100vh;
	transition: 0.5s;
}
a.btn_04:hover {
	color: #27acd9;
	background: #fff;
}

/* テキストボックス */
.nice-textbox{
    position: relative;
    display: block;
    /*width: 500px;*/
    margin-top: 5px;
    margin-bottom: 15px;
    margin-left: 5px;
    margin-right: 10px;
    padding: 15px;
    border: solid;
    border-radius: 5px;
    border-color: #a0a0a0;
    font-size: 16px;
    /*outline: solid;*/
}
```

## 参考
https://www.javadrive.jp/javascript/form/index1.html
Linuxとは何なのか？


## Linuxとは
- UNIX互換のOSで、非常に多くの人々から使用されている
- GPL（一般公衆利用許諾）というライセンス形式のため、実質無償でかつ自由に利用・改変可能

### カーネルとユーザランド
- ソフトウェアは、基本ソフトウェアと応用ソフトウェアに分かれるが、基本ソフトウェアはさらに「カーネル」と「ユーザランド」の２つに分かれる
- カーネル：OSの中核で、ハードウェアと直接やり取りを行う部分。プログラムがどにようなハードウェア上でも同じように動作する役割
- ユーザランド：OSが動作するのに必要な、カーネル以外の部分。ファイルシステムやファイル操作コマンド、シェルなどの基本的なソフトウェア群
- シェル：Linuxにある対話型のコマンド入力環境。コマンドを受け付けてシェルスクリプトを実行する

### Linuxディストリビューションとは
- Linuxを使う上で必要なプログラムをまとめ、簡単にインストールできるようにしたもの
- Linuxディストリビューションを開発する団体をディストリビューターという

### パッケージとは
- 応用ソフトウェアを簡単に導入できるように、ソースを事前にディストリビューターがビルドしたもの

### パッケージマネージャ
- パッケージを簡単にインストールしたり、アップデートしてくれるもの
- 応用ソフトウェアやライブラリ間の依存関係を考慮してくれる
- Linuxディストリビューションは何等かパッケージマネージャが必ず用意されている
IPアドレス割り当て台帳

| Organization | IP                                                               |
|--------------|------------------------------------------------------------------|
| NEC          | 192.168.0.1<br>192.168.1.1<br>192.168.10.1<br>192.168.11.1       |
| Buffalo      | 192.168.11.1<br>192.168.10.1<br>192.168.12.1<br>192.168. 11. 210 |
| Logitec      | 192.168.2.1                                                      |
| PLANEX       | 192.168.111.1                                                    |
| au           | 192.168.0.1<br>192.168.0.254<br>192.168.1.254                    |
| Fon          | 192.168.10.1                                                     |
| NTT          | 192.168.1.1                                                      |
| BBIQ         | 192.168.0.1	                                                      |
| IODATA       | 192.168.0.1<br>192.168.1.1                                       |
| TPLink       | 192.168.0.1                                                      |
| ELECOM       | 192.168.2.1<br>192.168.2.245                                     |
| YAHOO        | 172.16.255.254	                                                   |
| SoftBank     | 172.16.255.254	                                                   |
| ASUS         | 190.168.50.1<br>192.168.1.1                                      |
| Corega       | 192.168.1.1	                                                      |
| NETGEAR      | 192.168.0.1<br>192.168.1.1                                       |
| YAMAHA       | 192.168.100.1	                                                    |
| MOTOROLA     | 192.168.1.1	                                                      |
| Linksys      | 192.168.1.1	                                                      |
| WiMAX        | 192.168.1.254	                                                    |

https://www.fiberbit.net/connection/router/

https://computerlabo.fc2.page/router/

https://www.aterm.jp/support/qa/qa/00033.html

https://www.hikamoba.com/hikari/router-firmware/
２つのテーブルを比較して不一致レコードを確認する(SPSS Modeler データ加工逆引き6-15)

# ２つのテーブルを比較して不一致レコードを確認する

![スクリーンショット 2024-08-07 9.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/479e8b91-9c75-7712-b899-ffb74d2191f5.png)

## 1.想定される利用目的

・設備や顧客マスタなどの更新確認

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/mismatch.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-08-07 9.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a67b187a-c590-0c8d-70db-3ca206d74012.png)

a.入力するデータのひとつめは以下の通りです。
![スクリーンショット 2024-08-07 9.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/55c816fa-3c15-95c3-30b6-61d7e4e4c78d.png)

b.入力するデータふたつめは以下の通りです。
![スクリーンショット 2024-08-07 9.22.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/210046b5-da1d-8a84-20d1-971494d01633.png)

#### 逆結合を利用してテーブルbの更新分を表示する

c.[レコード結合]ノードを編集します。最初に矢印を繋げたテーブルがオリジナルとして扱われるので順序に気をつけます。
![スクリーンショット 2024-08-07 9.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8ff45b54-a6de-a7d9-8d5e-cb4176e84e59.png)

[テーブル]を実行します。
![スクリーンショット 2024-08-07 9.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5285524d-a65c-db67-d8f3-88148b95edea.png)

#### レコードを追加した上で重複またはレコード集計を利用する方法

d.[レコード追加]ノードを編集します。二つの構造の同じテーブルを縦方向にアペンドします。[フィールドに入力データセットを...]にチェックをします。

![スクリーンショット 2024-08-07 9.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e1d6ee55-ff87-fce0-0362-1fe967e5882b.png)

e.[重複]ノードを編集します。
![スクリーンショット 2024-08-07 9.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/be9de8b2-3064-464d-ae4f-656b34bb5dc7.png)

[プレビュー]します。テーブルaとテーブルbのペアが一致すると1行に統合され[Record_Count=2]になります。
![スクリーンショット 2024-08-07 9.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0f282838-64e5-bbba-b95f-57e120ab4150.png)

Record_Count=2]で変化のなかったレコードメニュー[生成]から[条件抽出ノード（AND）]で排除のためのノードを自動生成させます。
![スクリーンショット 2024-08-07 9.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8fbb18ba-a311-1056-2181-5349519b0851.png)

f.[条件抽出]ノードを編集します。先の手続きで自動生成されたノードの[モード]を[破棄]に変更します。
![スクリーンショット 2024-08-07 9.28.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7c763ae9-49b5-9e1b-76bc-73562a482b89.png)

g.[ソート]ノードを編集します。
![スクリーンショット 2024-08-07 9.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c2127854-7a23-1550-8ed7-1206a90be9c0.png)

[テーブル]を実行します。変化のあったテーブルのみペアで出力されます。
![スクリーンショット 2024-08-07 9.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/367651b5-3cfc-f312-9c6b-98b3fba1cf4d.png)


#### 注意事項

変化の箇所を知る必要がある場合には後者のパターンを利用します。また[重複]ノードを[レコード集計]で代替えすることも可能です。


## 4.参考情報

#### レコード結合を解説した記事

https://qiita.com/416nishimaki/items/be61a82c12cd83558def

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
RyeやPoetryでPyPIに登録されていないバージョンのPyTorchをインストールする

旧バージョンの **PyTorch** はPyPIに登録されておらず，インストールするには外部ソースを参照する必要があったりします
```shell
pip install torch==1.9.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
```

**Rye** や **Poetry** には`pip`の`-f` (`--find-links`) のようなオプションは無いので，外部ソースを参照するには別途設定する必要があります

## Ryeの場合
`pyproject.toml`で外部ソースを設定します
- https://rye.astral.sh/guide/sources

```pyproject.toml
[[tool.rye.sources]]
name = "torch"
url = "https://download.pytorch.org/whl/torch_stable.html"
type = "find-links"    
```

これで旧バージョンのPyTorchをインストールできるようになります

```shell
rye add torch==1.9.0+cu111
```

## Poetryの場合
Poetryでも`pyproject.toml`で外部ソースを設定します．私の環境ではhttps://download.pytorch.org/whl/torch_stable.html からtorchをインストールできなかったのでURLを変えています
- https://python-poetry.org/docs/repositories

```pyproject.toml
[[tool.poetry.source]]
name = "torch"
url = "https://download.pytorch.org/whl"
priority = "supplemental"
```

これで旧バージョンのPyTorchをインストールできるようになります
```shell
poetry add torch==1.9.0+cu111
```


## 直接パッケージを入れるやり方 (非推奨)

私は推奨しませんが，URIから直接wheelファイルを入れることもできます

```shell
rye add torch --url https://download.pytorch.org/whl/cu111/torch-1.9.0%2Bcu111-cp38-cp38-linux_x86_64.whl
```

`pyproject.toml`はこうなります
```pyproject.toml
dependencies = [
    "torch @ https://download.pytorch.org/whl/cu111/torch-1.9.0%2Bcu111-cp38-cp38-linux_x86_64.whl",
]
```

Poetryだとこんな感じ
```shell
poetry add https://download.pytorch.org/whl/cu111/torch-1.9.0%2Bcu111-cp38-cp38-linux_x86_64.whl
```

```pyproject.toml
[tool.poetry.dependencies]
python = "^3.8"
torch = {url = "https://download.pytorch.org/whl/cu111/torch-1.9.0%2Bcu111-cp38-cp38-linux_x86_64.whl"}
```

以上．まだ環境を動かしてないので不具合があるかもしれません

今回の環境です

https://github.com/tf63/docker-images/tree/master/pytorch-poetry

https://github.com/tf63/docker-images/tree/master/pytorch-rye
プレビュー機能の実装

# プレビュー機能実装

## 概要
新規投稿、投稿編集時に選択した画像がプレビューとして表示される機能

## preview.js作成
プレンビュー機能実装のため、app/javascriptの直下にファイル名 "preview.js"　を作成する。

## importmapの編集
configフォルダにあるimportmap.rbへ下記を追記する。
pin "preview", to: "preview.js"

## application.jsの編集
app/javascript/application.jsへ下記を追記する。
import "preview"

## プレビュー機能の実装
取得した画像をブラウザへ表示するためにjavascript側で生成する。

    // 画像を表示するためのdiv要素を生成
    const previewWrapper = document.createElement('div');
    previewWrapper.setAttribute('class', 'preview');

    // 表示する画像を生成
    const previewImage = document.createElement('img');
    previewImage.setAttribute('class', 'preview-image');
    previewImage.setAttribute('src', blob);

    // 生成したHTMLの要素をブラウザに表示させる
    previewWrapper.appendChild(previewImage);
    previewList.appendChild(previewWrapper);
chrome headlessで簡単にスマホ画面のキャンプチャを撮る方法（mac）

ターミナルで実行します
chromeがインストールされている前提です

エイリアス設定：
alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome" 

以下を実行する：
chrome --headless=new --disable-gpu --screenshot=[画像を保存するパス]/[画像名].jpg --window-size=480,2732 --user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1" '[ページURL]'

解説：
chrome >> エリリアスで設定。設定後単体で叩いて、chromeが起動したらOK
--headless=new　>> headlessモードで起動するよ
--disable-gpu　>> なんだっけ...
--screenshot >> 画像を保存するパスと画像名
--window-size　>> 画像サイズの横と縦
--user-agent >> iphone safariのユーザエージェント
[ページURL] >> 最後にスクショを撮りたいURLを
Tableau DesktopからTableau Serverへのログイン(ブラウザ認証)でエラーになる

## 環境
Tableau Desktop/Server > 2023.1
Mac OS 14.4

## 事象

Tableau DesktopでTableau Serverへログインする際に、ブラウザで認証を行ったあと下記の画面に遷移するが、Tableau Desktop側ではエラーになり認証に失敗してしまう。
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/1c428ae0-08d4-5b5b-0f3a-93e7887f25b0.png">

## 解消法

ターミナルで下記を実行する。

```shell
defaults write com.tableau.tableau-{Version}.plist Settings.WorkgroupUseEmbeddedBrowserServerSignIn "1"
```

## 参考
https://help.salesforce.com/s/articleView?id=001458405&type=1
Cloud Runでデプロイしたサービスにカスタムドメインを設定する

Cloud Runでデプロイしてみたサービスにカスタムドメインを設定してみたときの手順のメモ

ドメインは以前Route53で取得していたものがあったため、Route53でカスタムドメインを設定しました

## 1. Route53上でホストゾーンを作成
![スクリーンショット 2024-08-14 135840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/2ad119b5-b580-e7e6-c644-2c07758ca742.png)

ホストゾーンのホストゾーンの作成からRoute53に登録済みのドメインを入力してホストゾーンの作成を押下
## 2. Cloud Run コンソールからカスタムドメインの設定
1. Cloud Runのコンソールからカスタムドメインを管理を選択
![スクリーンショット 2024-08-14 140149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/84f3d6a0-f4ff-2601-b89f-a9a3d39e3680.png)
2. マッピングを追加からマッピングしたいサービスを選択し、Cloud Runのドメインマッピングを選択
![スクリーンショット 2024-08-14 140338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/eae9260f-db0a-e3da-bcbf-d4a7e9353c33.png)
3. 検証するベースドメインにRoute53で作成したホストゾーンのドメインを入力
![スクリーンショット 2024-08-14 140609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/80bb3ab6-f6cf-ba8e-6204-49f69336a70c.png)
4. Google Search Consoleに移動してTXTレコードを取得
![スクリーンショット+2024-08-14+140846~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/671c1c54-2758-95f4-50b8-106c9fa0f9d5.png)

## 3.Route53のホストゾーンにTXTレコードを作成
![スクリーンショット+2024-08-14+141338~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/3d929add-91e9-9b8f-fe65-58af804dd4c0.png)

値の部分に先ほど取得してきたものを貼りつけ

## Search Consoleでレコードの反映を確認
確認おしたら以下のエラーが、、、
![スクリーンショット 2024-08-14 141706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/188aad78-7856-c2ca-2038-4e59cf42613e.png)

調べてみると、Route53に登録したドメインのNSレコードとホストゾーンのNSレコードの値がずれていたので、登録したドメインのNSをホストゾーンのNSに変更して、再度トライすることで無事に完了

![スクリーンショット 2024-08-14 153525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/7fdd5c53-786c-f50d-3d7e-1d5f72f05d94.png)

完了ボタンを押してCloud Runの画面へ戻る。

## DNSレコードを更新
![スクリーンショット 2024-08-14 155418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/0080afd2-01d1-8ff5-44b9-df17ae6d4d30.png)

確認済みドメインを選択の部分に先ほど所有権を確認したドメインが表示されるのでそれを選択して続行をクリック

![スクリーンショット+2024-08-14+155455~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/4c578450-51e4-e07a-97a5-588e6d0ad5fd.png)

DNSレコードが表示されるので、Route53のホストゾーンのレコードにこれらを追加

![スクリーンショット+2024-08-14+155633~2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/c7729c7f-2fca-f5e7-fd7a-be61cd1132f1.png)



追加されてる!!!:relaxed::blush::cat:
![スクリーンショット 2024-08-14 163034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355689/b03da819-4004-5584-1072-d764ace24572.png)
Djangoでエラーメールを送信する

# 概要
Djangoでエラーメールを送信する場合は、Django提供のAdminEmailHandlerを使う。ただし利用するうえで注意点があるので、これを記載する。


 - 500エラーの際に、エラーメールが2通飛んでしまう
 - settingsの情報がすべて飛んでしまう。（本来はパスワードなどの機密情報は別で管理すべきであるが、プロジェクトによっては記載している場合もあるはず）

そこでこれらを解決すべく、AdminEmailHandlerを継承したクラスを作成してこれを利用する。

# CustomEmailHandler

messageから不要な情報を削除したものを送るようにカスタマイズする。

```logs.py
import re
from django.utils.log import AdminEmailHandler
from django.core import mail


class CustomEmailHandler(AdminEmailHandler):
    def send_mail(self, subject, message, *args, **kwargs):
        if "HTTP/" not in subject:
            message = re.sub(r'(COOKIES:|Settings:)[\s\S]*', '', message)
            message = re.sub(r'Django Version:[\s\S]*?Installed Middleware:[\s\S]*?\]', '', message)
            message = re.sub(r'Traceback \(most recent call last\):\n[\s]*?None', '', message)
            message = re.sub(r'(\n){3,}', '\n\n', message)
            mail.mail_admins(subject, message, connection=self.connection(), fail_silently=True, html_message=None) 
```

以下、settingsの必要な箇所のみ抜粋。

```settings.py
LOGGING = {
    "filters": {

        "require_debug_false": {
            "()": "django.utils.log.RequireDebugFalse",
        },
        "require_debug_true": {
            "()": "django.utils.log.RequireDebugTrue",
        },
    },
    # ハンドラ
    "handlers": {
        
        "mail_admins": {
            "level": "ERROR",
            "filters": ["require_debug_true"],
            "class": "common.utils.logs.CustomEmailHandler",
        },
    },
    "loggers": {

        "": {
            "handlers": ["file", "console", "mail_admins"],
            "level": "DEBUG",
            "propagate": False,
        },

        "django": {
            "handlers": ["file", "mail_admins"],
            "level": "INFO",
            "propagate": False,
        },
    },
} 

```
DASへの初回接続で毎回タイムアウトしてしまうときの対処法

# 概要
<!-- 発端や概要を記載 -->
Bizrobo!のDesign Studio（DS）で、Desktop Automation Service（DAS）への接続をして開発をすることがあると思います。

いくつかの端末で開発をしていたところ、なぜか初回の接続で毎回タイムアウトしてしまう端末を発見。

ワイヤーシャークやログから通信を追っかけてみたところ、どうやら閉域ネットワーク（閉域網）の環境だと起こる様子。
※補足
閉域環境…インターネットから切り離された独自のネットワーク
参考記事：[閉域網とは? 種類やメリット、選び方、セキュリティ対策の方法を解説](https://www.ntt.com/business/services/rink/knowledge/archive_07.html)

これについて調査した結果と、実施した対処方法を書いていきます。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [確認できた挙動](#Chapter1)
1. [対処方法](#Chapter2)
1. [補足情報](#Chapter3)
<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 確認できた挙動
Design Studio（DS）とRoboServer（RS）が、Desktop Automation Service（DAS）と初めて通信を行うときに、WindowsはSSL/TLS通信によって証明書を確認しにいきます。
応答がない場合、3～5秒でタイムアウトします。

上記の証明書を確認するときに、DNSでの名前解決も行います。
応答がない場合、こちらは約30秒でタイムアウトします。

それに対して、Bizrobo!側はというと、DSとDASの通信開始して10秒間応答がないとタイムアウトしてしまいます。

つまり、SSL/TLS通信を行う環境でDNSサーバー（ルーター含む）と疎通でき、かつDNSのリクエストが外部通信できない閉域ネットワークの環境では、DNSの名前解決よりもBizrobo!のタイムアウトの時間が先に来てしまい、結果的に初回の接続で毎回タイムアウトしてしまうようです。

この時、証明書の確認自体をさせなければDNSの名前解決もする必要がなくなるため、証明書の確認を無効にするといった方法で回避することができました。

<a id="#Chapter2"></a>
# 対処方法
グループポリシーより、[コンピュータの構成] - [ポリシー] - [Windowsの設定] - [セキュリティの設定] - [公開キーのポリシー] - [証明書パス検証の設定]を選択。
ネットワークの取得タブから、”これらのポリシーの設定を定義する”にチェックをいれ、”Microsoftルート証明書プログラムで証明書を自動更新する”のチェックを外すことで、閉域ネットワークの環境でも問題なく初回接続できるようになりました。
![Microsoftルート証明書プログラムで証明書を自動更新する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/2f7445c7-2095-4d00-d0db-efaa7a94c396.png)

<a id="#Chapter3"></a>
# 補足情報
1. ネットワークが完全に切断されているオフラインの環境の場合、TCPのタイムアウトが先に発生してくれるので、証明書を無効にしなくてもDSとDASが問題なく初回接続できました。（LocalDAでのテスト結果です）
参考：[Local Desktop Automationの機能と設定方法について](https://knowledge.bizrobo.com/hc/ja/articles/360033350252)

1. DNS名前解決は端末でキャッシュされるため、ipconfig /flushdnsでキャッシュを破棄することで、2回目以降の接続でも発生させることができました。

1.
v11.3.0.4とv11.4以降では、Design Studio.confもしくはRoboServer.confに以下を追記することでタイムアウトの設定を最大で20秒まで伸ばせるようです。
参考： [Communication defaults between different Kofax RPA (Kapow) components](https://knowledge.tungstenautomation.com/bundle/z-kb-articles-salesforce2/page/22875.html)
```
#DAS Timeout 
wrapper.java.additional.30=-Ddas.timeout.seconds=20 
```
1. HOSTS、LMHOSTSで「ctldl.windowsupdate.com」を設定しても、特定のURLは設定を無視してDNSを問い合わせてしまうようで、回避策には使えませんでした。
 
 <a id="#reference"></a>
# 参考
- [閉域網とは? 種類やメリット、選び方、セキュリティ対策の方法を解説](https://www.ntt.com/business/services/rink/knowledge/archive_07.html)
- [Communication defaults between different Kofax RPA (Kapow) components](https://knowledge.tungstenautomation.com/bundle/z-kb-articles-salesforce2/page/22875.html)
Bizrobo!のKappletを使う際の権限

# はじめに
<!-- 発端や概要を記載 -->
Bizrobo!のKappletを使用する際、v11以降になるとユーザーに権限の設定が必要になったようです。

色々調べてみたところ、権限が設定できる箇所は**3つ**あり、**それぞれ4種類**の権限が選択できました。
それとは別に、MCの方でもKappletに関する**2つ**の権限から選択する必要があるようなので、権限のパターンは128パターンとなり、とても把握するのは難しいです。

そこで、利用手順書を見てみると、異なる権限が設定されている場合には上位の権限が優先されると記載がありました。
つまり、128パターンの中でも、同様の挙動となる権限設定が存在するということになります。

それらを全て重複として数えると全部で10種類というところまで絞り込めました。これなら把握しきるのも難しくなさそうです。
参考：[BizRobo! Basic Kapplets管理手順書(11.x 共通)　旧：利用手順書](https://my.bizrobo.com/product/detail/0a265622-a963-49c1-be46-260e85be1599)

この記事では、設定項目の種類と設定箇所と、私が調べた10種類の権限の中で実用性がありそうな権限設定を紹介します。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Kapplet内で権限が設定できる箇所](#Chapter1)
1. [Kapplet内で設定する権限の一覧](#Chapter2)
1. [MC内で設定する権限](#Chapter3)
1. [実用性がありそうな権限](#Chapter4)
1. [参考](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Kapplet内で権限が設定できる箇所
①ユーザー画面のグローバルメンバーの権限
　⇒ユーザーの編集画面からのみ編集可能
![1-1ユーザー画面のグローバルメンバーの権限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/71870611-6da2-34b5-302d-cd6bd275f8f9.png)


②ユーザーグループ画面のグローバルメンバーの権限
　⇒ユーザーグループの編集画面からのみ編集可能
![2-1ユーザーグループ画面のグローバルメンバーの権限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/f9aaa837-421f-6e0a-432e-97c720eded82.png)


 ③ワークスペースに対するユーザーグループの権限
　⇒ユーザーグループの編集画面と、ワークスペースの編集画面の両方で編集可能
![3-1ワークスペースに対するユーザーグループの権限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/3166d3c7-f2f3-fcbd-688d-f57a79a49012.png)
![3-2ワークスペースに対するユーザーグループの権限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/4a2070c7-b9ea-865e-74a6-f6270bb1bd81.png)


<a id="#Chapter2"></a>
# Kapplet内で設定する権限の一覧
①管理者
（Kappletの実行、Kappletとテンプレートの作成、ユーザーグループへの権限設定）

②開発者
（Kappletの実行、Kappletとテンプレートの作成）

③ユーザー
（Kappletの実行）

④なし


<a id="#Chapter3"></a>
# MC内で設定する権限
①Kapplet Administrator

②Kapplet User

![MC内で設定する権限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/6ae8b718-8a51-cfe0-2daf-46af8147a8a0.png)


<a id="#Chapter4"></a>
# 実用性がありそうな権限
**＜adminユーザーと同じように、Kapplet内の全ての操作が行うためのユーザー＞**
MC上の権限：全てのプロジェクトにKapplet Administrator

Kapplet上の権限：
①ユーザー画面のグローバルメンバーの権限
　⇒管理者
②ユーザーグループ画面のグローバルメンバーの権限
　⇒管理者
③ワークスペースに対するユーザーグループの権限
　⇒管理者

**＜自身が所属しているプロジェクトの全ての操作を行うためのユーザー＞**
MC上の権限：Kapplet Administrator

Kapplet上の権限：
①ユーザー画面のグローバルメンバーの権限
　⇒なし
②ユーザーグループ画面のグローバルメンバーの権限
　⇒なし
③ワークスペースに対するユーザーグループの権限
　⇒開発者

**＜自身が所属しているプロジェクトのKappletを実行するためのユーザー＞**
MC上の権限：Kapplet User

Kapplet上の権限：
①ユーザー画面のグローバルメンバーの権限
　⇒なし
②ユーザーグループ画面のグローバルメンバーの権限
　⇒なし
③ワークスペースに対するユーザーグループの権限
　⇒ユーザー


 <a id="#reference"></a>
# 参考
- [BizRobo! Basic Kapplets管理手順書(11.x 共通)　旧：利用手順書](https://my.bizrobo.com/product/detail/0a265622-a963-49c1-be46-260e85be1599)
- [Kappletsユーザー権限情報【v11.x】](https://my.bizrobo.com/product/detail/2d8b6815-f4ae-4ed5-ab40-3828f4afdbdd)
Salesforce 認定 Platform デベロッパー 合格体験記録

## Salesforce 認定 Platform デベロッパー概要
* 内容: 多肢選択/複数選択方式の 60 問 
* 試験の所要時間: 105 分 
* 合格点: 68% 
* 受験料: 20,000 円 (税抜) 
再受験は10,000 円 (税抜)

## 私のSalesforceに関する経験と受験結果
【Salesforceの経験】
* 製造会社でSalesforceの保守・運用を3年半ほど
* Apexについては、業務では軽微なバグ修正で触れたことがある程度で、自己学習としてUdemyでトリガーやLWCの講座を受講した経験があります
* 過去にJavaやPythonの経験もあるので、プログラミングが全くの初心者というわけではありません

【受験結果】
![受験結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640548/29cc0b3c-2e6f-418b-c0e1-6915b195e78a.png)
※オンラインで受験

## 勉強方法
以下の３つの問題集を利用しました。

無料で解説も丁寧で一番おすすめ

https://tysonblog-whitelabel.com/category/salesforce/salesforce-developper1

こちらも解説が丁寧でわかりやすい

https://note.com/salesforce777/m/m57906608ef4a

100問にまとまっているので、とっかかりとしておすすめ

https://note.com/salesforce_pq/n/n11be443ec506

実際の取り組み方は以下の通りです
・問題を解く
・暗記事項をまとめる
・間違えた問題を記録
・暗記事項の暗記。間違えた問題の理解と再回答を繰り返し実施

暗記は上記問題集で知らなかったこととか、存在は知ってるけど試験用に覚えないといけないことをまとめて暗記シートみたいなのを作って暗記しました

実際の試験では上記問題集で出てこなかったような知識が4,5問あったかな？とういう感じでした

次は何かSalesforceの「上級」とつく資格を取りたいと思っています！
Leptosで#[server]内の補完が効かないときの対処法 (ServerFunctions) [rust-analyzer] 

# feature "ssr" を有効にする

Server Functions はプロジェクトにssrという名前でfeatureを作ることでサーバー、クライアントのコンパイル先を分けています。このssrフィーチャーをrust-analyzerで補完する設定ができていないかもしれません。

VSCodeのrust-analyzerで、補完時に特定のfeaturesを有効にするように設定します。

これにより、補完ツールがそのfeaturesを考慮した状態でコードを解析します。以下のように、プロジェクトごとの設定を行います。

```jsonc
// settings.json
{
    "rust-analyzer.cargo.features": ["ssr"]
}
```

以上を`.vscode/settings.json`の中に書くことで、#[server]をつけた関数でも補完が効くようになります。
＃29　【SQL】CASE式の基本的な使い方

## はじめに
今回はCASE式の基本構文と使用例について紹介します。
CASE式を使うことで、SQLで条件分岐を行なうことができます。

## CASE式について
CASE式を使い条件を指定することで、その結果に応じ処理を分岐させることができます。
CASE式には、単純CASE式と検索CASE式があります。

### １.単純CASE式
#### 基本構文
```
CASE 評価する式や値
WHEN 値1 THEN 値1のときに返す値
WHEN 値2 THEN 値2のときに返す値
ELSE 条件に当てはまらない場合に返す値
END
```

#### 使用例
```
SELECT user_id,user_name, 
CASE favorite_animal_id WHEN 1 THEN '犬' 
WHEN 2 THEN '猫' 
ELSE '犬と猫以外' END AS favorite_animal 
FROM user 
ORDER BY user_id;
```

### 2.検索CASE式
#### 基本構文
```
CASE WHEN 条件1 THEN 条件1のときに返す値
WHEN 条件2 THEN 条件2のときに返す値
ELSE 条件に当てはまらなかった場合に返す値
END
```

#### 使用例
```
SELECT user_name, 
CASE WHEN score >= 90 THEN 'S' 
WHEN score >= 70 THEN 'A' 
WHEN score >= 30 THEN 'B' 
WHEN score < 30 THEN 'C' 
ELSE '不明です' END AS rank 
FROM game_score 
ORDER BY score DESC;
```

### 【応用】条件付きの集計をしてみる
CASE式とSUM関数を使った条件付きの集計を行います。
WHERE句を使って分岐させるより読みやすくなります。

#### 使用例
```
SELECT team, 
SUM(CASE WHEN user_age < 20 THEN 1 ELSE 0 END) AS "20歳未満", 
SUM(CASE WHEN user_age >= 20 THEN 1 ELSE 0 END) AS "20歳以上" 
FROM user 
GROUP BY age;
```

## 最後に
CASE式について簡単に紹介しました。
参考になりましたら幸いです。
ご覧いただきありがとうございました。

出典：[スッキリわかるSQL入門 第3版](https://book.impress.co.jp/books/1121101090)
Global Secure AccessはARM版Win11に対応していない

# 現象
- タイトル通りとなりますが、Parallels上のWin11にGlobal Secure Accessクライアントをインストールしようとすると以下のエラーとなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/5ed750ea-1945-8292-317a-d218fe31ac24.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d8cdb9d4-4a02-1080-2040-2fee2456b5b0.png)

# 結論
:::note warn
- ARM版には対応していませんでした。
- ロードマップ上にはあるとのことですので、期待します。
https://learn.microsoft.com/ja-jp/entra/global-secure-access/how-to-install-windows-client
:::

https://learn.microsoft.com/en-us/answers/questions/1465386/is-there-a-method-to-get-the-global-secure-access

# 想定していた設計（ポエム）
- Mac MiniはデバイスライセンスでユーザーアフィニティのないマシンとしてEntra IDでログイン。
- 2つのVMを作って、マシンAはOfficeアプリをメインとした通常業務用。
- マシンBはShare PCモードにしてGlobal Secure Accessクライアントを通して特定の通信と特定サイトだけ許可。
- Bはゲストログインもできるキオスク端末みたいな使い方を想定。
- これにより、マシンBを残し最低限の業務ができる状態で、マシンAを初期スナップショットに戻すだけでユーザーの付け替えが可能になる（のでは）。
- 再キッティングが不要でユーザーPCの取り回しが効率化すると。
- 実際は初期に戻すとSysprepやらWindows Updateとか走っちゃうので、その間はマシンBで業務してもらう。
- クラウドストライクでBSoDとか起きちゃったときにもマシンBを使ってもらう。
- これによりPC交換のダウンタイムがほぼゼロに！？
- 情シスしかわからないネタでごめんなさい。

# 期待すること
- 早めにARM版に対応してほしいなあ（ﾁﾗﾁﾗｯ 

# 関連リンク
- 共有PCモードについては以下をどうぞ。

https://www.slideshare.net/slideshow/it-windows-windows-pc/251616132

https://qiita.com/ao_Tetsu/items/e9930b285d8e7264a2f7

https://qiita.com/minoden_works/items/234cb9840c1119b8b0b0

https://qiita.com/hisaho/items/403bb87c2ed0dbf27727