OmniAICreator/Qiita-1.07M huggingface dataset:
【本番環境/production】「No 'Access-Control-Allow-Origin' header」が出た時の解決策

# 環境

・Windows
・Visual Studio
・C#
・.NET 6.0
・visual studio code
・React 18.2.0
・Typescript 4.9.5
・Node 20.11.0

# IDEを分けての開発

今回はVisual StudioでC#のバックエンド、vscodeでReact×Typescriptを開発しました。
フロントエンドとバックエンドの開発をIDEを変えてしました。
本番環境では、バックエンド側のプロジェクトをAzure web appserviceへ、フロントエンド側のプロジェクトをAzure static appsにデプロイしました。

*IDEとは、Integrated Development Environment（統合開発環境）の略で、ソフトウェア開発に必要な様々なツールを一つにまとめたものです。
例えば、コードを書くエディタやコンパイラ、デバッガ、テストツール、バージョン管理ソフトなどがIDEに含まれます。

# 解決策

結論、Azure web app service（バックエンド側のプロジェクト）のCORS設定をAzure portal上からしていなかったのが原因でした。
これに気づくまで2時間くらい悩んでいました、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754813/74636d46-b55e-721e-8613-b4921373abc8.png)

ここのCORSを開くと、フロントエンド側のURLを入力する場所があるので、入力してOKを押せばエラーは解決されました。

# 感想

今回IDEを変えてAPI側とフロント側で分けて開発したので、CORSへの理解が深まりました。
みなさんもIDEを分けて開発する場合は、CORSにお気を付けください！



# 追加情報

[Microsoftの公式ページ](https://learn.microsoft.com/ja-jp/aspnet/core/security/cors?view=aspnetcore-8.0)には、以下の文章が書かれています。

`一般に、UseCors の前に UseStaticFiles が呼び出されます。 JavaScript を使用してクロスサイトで静的ファイルを取得するアプリでは、UseStaticFiles の前に UseCors を呼び出す必要があります。`
```
app.UseRouting();

app.UseStaticFiles();　#　UseCorsの上にある
app.UseCors("_myAllowSpecificOrigins");



app.UseAuthentication();
app.UseAuthorization();
```
ReactアプリなどJavascriptを基にした言語のプロジェクトでは以下のようにUseStaticFilesの位置を変更する必要があるようです。

```
app.UseRouting();


app.UseCors("_myAllowSpecificOrigins");

app.UseStaticFiles(); #位置がUseCorsの上から下に変わっている

app.UseAuthentication();
app.UseAuthorization();
```
更新系APIの状態不整合の解決策 リトライ　文書番号A02

# はじめに　このページを読んでわかること
[更新系APIのタイムアウトで発生する課題](https://qiita.com/okotaniki/items/b4fb6210ebe6900d1f8e)でサーバ間の状態不整合の解決策として、サーバAから更新リクエストを再送する(リトライ)する設計において考慮すべきことをメモしておく。

#### やってはいけない設計
念のためやってはいけない設計をメモしておく。

:::note alert
#### 更新リクエストに一意なパラメータがない


サーバAは、更新リクエスト1回目のレスポンスが受信できなかったためリトライとして、更新リクエストを送信する。しかしサーバBでは、2回の更新リクエストを別のトランザクションとして処理するためデータが2件発生し、サーバ間において件数不整合(サーバA1件、サーバB2件)となる。
```plantuml
サーバA->サーバB : 更新リクエスト1回目
note right:処理済み1件目
サーバB-->x サーバA : OK
note left:状態遷移　初期状態→不明
サーバA-> サーバB : 更新リクエスト2回目(リトライ1回目)
note right:処理済み2件目
サーバB-->サーバA:OK
note left:状態遷移　不明→処理済み
```
:::
#### 更新リクエストの必須パラメータ(RequestID)
サーバAが設定する一意なパラメータが必須となる(ここではRequestIDと定義する)。
サーバBは同一のRequestIDを受信した場合、あらたなデータを生成しない。

```plantuml
サーバA->サーバB : 更新リクエスト1回目(RequestID=001)
note right:処理済み
サーバB-->x サーバA : OK
note left:状態遷移　初期状態→不明
サーバA-> サーバB : 更新リクエスト2回目(RequestID=001)
note right:同一RequestIDを受信したので、新たなデータは生成しない
サーバB-->サーバA:OK
note left:状態遷移　不明→処理済み
```

#### 複数のタイムアウト
複数回リトライしてもレスポンスが受領できない場合、リトライだけでは状態不整合が解決しないため、リトライ以外の方法で解決する必要がある。
リトライの上限回数に達してもリトライが成功しないことをリトライアウトという。

```plantuml
サーバA->サーバB : 更新リクエスト
note right:処理済み
サーバB-->サーバA  : OK
note left:状態遷移　初期状態→不明
サーバA->サーバB : 更新リクエスト
note right:同一RequestIDを受信したので、新たなデータは生成しない
サーバB-->x サーバA : OK
サーバA->サーバB : 更新リクエスト
note right:同一RequestIDを受信したので、新たなデータは生成しない
サーバB-->x サーバA : OK
```

# 結論
リトライにより状態不整合をできるケースもあるが、以下が課題として残る。
- 更新リクエストのリトライアウト
誰かがミスした時のポイント・やるべきこと

仕事で誰かがミスをした時に気をつけたいポイントや、やるべきことをまとめてみました。

## やるべきこと

### 事象の整理

まずは、何が起こったのかを関係各所・コミュニケーションツールから情報を集め整理するのが大事です。報告書のような形で何時・内容・誰がなどの詳細な状況をまとめると事象についての説明や、議論がしやすくなると思います。また、色々な人たちに共有することで色々な角度からの視点があるので気づきづらい問題点などの発見にも繋がります。

### 原因の解明

ミスをした本人からの声をしっかり聞き、どのような背景がありそうなったのかを理解し、運用上にも問題がなかったかを見直す必要もあります。

### 対策・回避策

まとめた報告書・原因などを元に会議で、"今後どうすれば起こらないのか"を議論する必要があります。また、回避策や対策を挙げるだけではなく誰がやるのか、その運用で問題がないかの確認もしなくてはいけません。会議などをする場合は、事象に関わるメンバーや、関連性のある部署などのメンバーも招集すると議論の幅が広がりやすくなります。

## 気を付けるポイント

### ミスした本人の気を付けるポイント

ミスに気付いた時点で謝罪と上長や、関係者に対して報告をしましょう。カバー出来る部分は急ぎ対応し、対応が終わり次第正式な謝罪や、報告書などを作成し関係者に報告した方がいいかと思います。

また、報告書を書く際には事象がわかるように時系列や、内容などをまとめ対策や、回避策も記載しておくといいと思います。

### ミスをした本人を責めるのではなく、組織的にどうすれば良かったのかを考える

ミスが起きたこと自体は当人が悪いのですが、組織的に考えた時に責めるのではなくどうすれば対策できるのかを考える必要があります。

### ケア

ミスが起きた際の会議などにも注意が必要です。まずは、本人から個別に小さい範囲(チーム内のみや、上司の1対1など)で確認を取り確認・内容の理解・回避策などをざっと話し合いその上で、正式な会議などを開くことが重要です。ミスが起きた後、すぐに正式な会議が開かれてしまうと本人は萎縮してしまい本音や、事象の背景などの細い部分を伝えきれず、最終的には離職などにつながるケースなどもあります。そうならないためにも、慎重な行動が必要になります。

## ミスは財産

ミスをして迷惑をかけてしまうのは大変なことですが、それによって問題点に気付き対策できることはいいことだと思います。ミスを起こさないように組織的にも各個人も気を付けていい環境を作れるといいと思います。
Cloudflare CDN / WAF のエラー、ブロックページを Pages を使って、オリジンレスで且つ無料で仕立てる

## はじめに
Cloudflare の CDN / WAF にはクライアントにエラーや、WAF でブロックされた際に案内するデフォルトページが用意されていますが、英語で表示されます。

サービスの内容によってはお客様にお掛けするご心配を少なくし、迅速にご対応をする目的で日本語に対応したエラーページ（Sorry Page）やブロックページをご用意したいケースは少なくありません。

しかし、このページのためにわざわざウェブサイトを作成するのも、労力やコストに見合わないと感じるのではないでしょうか。

Cloudflare では下記の面倒やコストを開放するサービスが用意されています。

1. Cloudflare Pages でオリジン（ウェブサーバー）を構築せずに、ウェブページが公開できる
2. SSL/TLS 証明書は自動的に適用され、自動更新される
3. 面倒な作業なく、配信中ドメインURL で表示してくれる

## やってみる

まずはローカル開発環境で html を作りましょう。

ここで使っている変数　::RAY_ID::　は、Cloudflare が用意している、ウェブサイトへアクセスした際に発行されるユニークなIDで、エラー時の特定などに使われます。
```
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>dd-lab　アクセス制限ページ</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            text-align: center;
            padding: 50px;
        }

        .container {
            background-color: #fff;
            margin: auto;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
            max-width: 600px;
        }

        h1 {
            color: #333;
        }

        p {
            color: #666;
        }

        .contact-info {
            margin-top: 20px;
        }
    </style>
</head>

<body>
    <div class="container">
        <h1>アクセスが制限されました</h1>
        <p>申し訳ありませんが、ご利用いただきましたサービスはセキュリティ上の理由により制限されています。</p>
        <p>この判断が誤りであると考えられる場合は、以下の連絡先まで、下記に表示されております「Cloudflare Ray ID」をメモの上ご連絡ください。</p>
        <div class="contact-info">
            <p>サポートチーム: <a href="mailto:support@example.com">support@example.com</a></p>
            <p>電話: 123-456-7890</p>
            <p>Cloudflare Ray ID: ::RAY_ID::</p>

        </div>
    </div>
</body>
</html>
```

### Pages にソースをアップロードする
![Screenshot 2024-01-15 at 16.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442885/55f6c8de-c6f9-992c-4eba-f9f836b2d10b.png)

### カスタムページの登録
各サイトのメニューにカスタムページという項目がありますので、そこから登録します。
![Screenshot 2024-03-25 at 13.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442885/9b6e86f9-0d4c-c65a-43fa-96abdacf8c81.png)

カスタムページの URL は Pages で作成したドメインとソースの場所を指定します。
この場合は custom-blockpage-dd.pages.dev という Pages のプロジェクトに custom_block_page.html をアップロードしているので、この URL (.html は指定しなくても動作しました)

![Screenshot 2024-01-15 at 18.20.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442885/fc4fb0aa-8824-7053-e307-93a40b50977e.png)

### WAF でのブロックが発生すると

このように表示されます

![Screenshot 2024-03-25 at 13.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442885/d5cdcc7b-4595-1161-8fe2-126a17332644.png)

この際、URL は公開しているサイトと同じドメインになり、SSL/TLS 証明書も自動適用された形となります。
「Aが多いほどBが多い」が成立するか見てみたい→散布図 or ヒートマップ

「xxが多いほどxxが多い」のようなものが表したいとき
= 2つの連続値に相関めいたもの（≒比例関係）が見えるかをビジュアルでみたい
（本当に相関があるかを見るなら、相関係数を取ることも可能。
だが初手はこれを見て、片方の数値のどの部分がどういうふうにもう片方と対応しているかを見て直感に訴えるほうが先）

# 強い相関がありそう→散布図
https://mukai-lab.info/pages/tech/tableau/tableau2/
<img width="1435" alt="image.png (135.4 kB)" src="https://pixta-zatsu.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/1097/2022/02/14/45778/2c48eadc-b3bb-4262-a994-60f2e6dac362.png">


# 「強い相関がありそう」ではないorわからない→ヒートマップが便利。
以下はうまく表せていないが、検索回数とCVRについて関連がありそうか出そうとしたもの。
功を奏していないが、こういうものがほしいときが多かった。
作り方: 散布図を作るときのフィールドを複製してディメンション版を作り、それの色をレコード数などで濃淡を付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/b1a76bfa-68e2-5a51-fca6-f113366c199a.png)


こういうときに散布図にすると、濃い部分が何を表しているかわからなくなり、外れ値ばかり目立つようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/d7078f76-8689-5ad0-8bb7-35edee5af04d.png)


散布図用のディメンション計算フィールド例
（計算結果は「500」とか数値だけど、別名で「500~」とかを設定すると表記では見やすくなる）
```
IF [CV時表示位置] >= 500 THEN 500
ELSEIF [CV時表示位置] >= 400 THEN 400
ELSEIF [CV時表示位置] >= 300 THEN 300
ELSEIF [CV時表示位置] >= 200 THEN 200
ELSEIF [CV時表示位置] >= 100 THEN 100
ELSEIF [CV時表示位置] >= 90 THEN 90
ELSEIF [CV時表示位置] >= 80 THEN 80
ELSEIF [CV時表示位置] >= 70 THEN 70
ELSEIF [CV時表示位置] >= 60 THEN 60
ELSEIF [CV時表示位置] >= 50 THEN 50
ELSEIF [CV時表示位置] >= 40 THEN 40
ELSEIF [CV時表示位置] >= 30 THEN 30
ELSEIF [CV時表示位置] >= 20 THEN 20
ELSEIF [CV時表示位置] >= 10 THEN 10
ELSE 1
// ELSE [CV時表示位置]
END
```
ChatGPTでJava+XML-RPCでのWordpressへの投稿方法を調べた話

## はじめに

こんにちは。いりくら＠アノードです。
完全自動運用のニュースメディア「[BizAIdea](https://bizaidea.com/ "BizAIdea Home")」 を開発/運用しているのですが、Wordpressへの記事投稿の自動化に JavaからXML-RPC を利用した際、ChatGPTに大いに助けてもらったので、その流れをご紹介します。

## なぜ Wordpressの投稿にXML-RPC を使ったか？
本来、Wordpressへのプログラムによる投稿は標準のAPIを利用するのが本筋かと思いますが、Wordpressを立てているレンタルサーバーのConohaWingではAPIの利用制限されているようで、利用できませんでした。
（私の調べ方が不足していたらすみません。）

API以外でもXML-RPCを利用することでプログラムからの記事投稿ができるようだったので、今回はXML-RPCを利用することとしました。

ちなみにJavaを利用したのは、クローラー等の関連するプログラムがJavaだった都合によるもので、もちろんPythonやPHPなどでも同様のことができると思います。

## そもそもXML-RPCとは？
ネットで調べるといろいろ出てきますが、ChatGPTに簡潔にまとめてもらいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755219/9d9e5908-ff95-be35-acf6-cf984903ffe2.png)

## 注意点
XML-RPC（xmlrpc.php） は Wordpressへのクラッキングのターゲットとされることが非常に多いです。（ほぼ確実に攻撃を受けます。）
接続元のIPを制限するなど、脆弱性対策が必須となります。

## Java + XML-RPC の実装方法が分からない、、
Javaを使ったWordpressのXML-RPCでの投稿なのですが、いろいろ調べたものの、APIの仕様書のようなものを見つけられませんでした、、（私の調べ方が不足していたらすみません。）

そんな時にやはり便利なのがChatGPT。ほぼ完璧なサンプルコードを書いてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755219/5d89e075-5220-8e3a-5768-d4c3ab7a2608.png)

## サンプルコード

機能の実現に必要となる以下の処理の仕様と実装方法について、ChatGPTに確認してみました。
 - アイキャッチ用の画像のアップロード方法
 - 本文の投稿方法
 - 記事にアップロード済のアイキャッチ画像を指定する方法
 - 投稿する記事のカテゴリーの指定方法
 - 投稿する記事のタグの指定方法

ChatGPTとのやり取りや、作成してもらったサンプルコードは下記から参照できます。

[サンプルコード作成のやり取り](https://chat.openai.com/share/a63f315e-45c0-4249-8a87-c258cf8b1b2c "サンプルコード作成のやり取り")

途中、アイキャッチ画像のアップロード処理に失敗したりしたので、修正方法も確認しています。

こちらのサンプルコードを利用することで、無事投稿をJavaから行うことができました。

## 投稿の自動化

「[BizAIdea](https://bizaidea.com/ "BizAIdea Home")」 では、以下のプログラム化を実現することで、メディア運営を完全自動化しました。

・記事キュレーションの自動化
　⇒クローラーを使って15メディアから最新のAI記事を取得
 
 ・記事作成の自動化
　⇒集めたニュース内容をChatGPTを使ってサマリーし、記事を自動作成

 ・記事の自動投稿
　⇒今回内容です

 ・記事のSNSシェア
　⇒XとFacebookへの記事シェアを自動化しています。

これらの詳細も、また時間のある時に書ければと思っています。

## おわりに
改めて実装過程を振り返ると、ChatGPTに頼りきりでした。。
ChatGPTが無くても試行錯誤を繰り返して何とか実装はできたかもしれませんが、掛かる時間を相当短縮できたと思います。

BizAIdea開発の全体については、note に書きましたので、良かったら見てみてください。
[ChatGPTで「完全自動運用」のWebメディアを作ってみた話](https://note.com/a_node/n/n63bded7d9645 "ChatGPTで「完全自動運用」のWebメディアを作ってみた話")
input[type="date"] で今日を選択する

HTMLの `<input type="date">` は、ユーザーにカレンダーから日付を選択させる便利な方法を提供します。

しかし、この要素のvalue属性は `"yyyy-mm-dd"` の形式で日付を受け取る必要があります。これは、JavaScriptの `new Date()` が返す日付オブジェクトと直接互換性がないため、少し手間がかかります。

この記事では、現在の日付をフォーマットし、<input type="date">要素の値として設定する方法を詳しく説明します。

## HTMLの準備

まず、日付入力フィールドと「今日」ボタンを含む簡単なフォームを作成します。ボタンをクリックすると、フィールドに現在の日付が設定されるようにします。

```html
<form>
  <input type="date" id="today">
  <button type="button" id="today-button">今日</button>
  <button type="submit">送信</button>
</form>
```

## JavaScriptでの日付フォーマット

次に、JavaScriptを使用して、現在の日付を `"yyyy-mm-dd"` 形式にフォーマットする関数を作成します。
この関数は、`Date`オブジェクトを引数として受け取り（デフォルトでは現在の日付）、フォーマットされた文字列を返します。

```typescript
const formatDate = (date: Date = new Date()) => {
  const yyyy = date.getFullYear();
  const mm = String(date.getMonth() + 1).padStart(2, "0"); // 月は0から始まるため、1を足す
  const dd = String(date.getDate()).padStart(2, "0");
  return `${yyyy}-${mm}-${dd}`;
};
```

### コードの解説

- **String関数**

上記のコードの `date.getMonth()` と `date.getDate()` によって返される値は一桁である可能性があるので、二桁の文字列で返されるように、フォーマットします。

これには`padStart`メソッドを使いたいのですが、上記の２つのメソッドは 数値を返すので、まずは文字列に変換します。
`String`関数は、引数に渡された値を文字列に変換します。

例えば、 `date.getDate()` が `9` を返した場合、`String`関数によって `"9"` という文字列に変換されます

- **padStartメソッド**

`padStart`メソッドは、文字列の先頭に特定の文字を追加することで、文字列の長さを指定された長さまで増やすために使用されます。このメソッドは2つの引数を受け取ります：

1. 目標の長さ: 文字列がこの長さに達するまで、指定された文字を先頭に追加

2. パディング文字（オプショナル）: 文字列の先頭部分に追加する文字。指定しない場合のデフォルト値はスペース(`" "`)

上記のコードの `padStart(2, "0")` は、日付が一桁の場合（つまり、1〜9である場合）、その前に0を追加することで、常に二桁の文字列が得られるようにします。
結果として、"9"は"09"に変換され、"12"のようなすでに二桁の値は変更されません。

## 日付フィールドの値を設定

最後に、「今日」ボタンにイベントリスナーを追加して、クリックされた際、日付フィールドに現在の日付を設定します。この時、先に定義した`formatDate`関数を使用して、日付を正しい形式に変換します。

```typescript
const todayField = document.getElementById("today") as HTMLInputElement;
const todayButton = document.getElementById("today-button") as HTMLInputElement;

if (todayButton && todayField) {
  todayButton.addEventListener("click", () => {
    todayField.value = formatDate();
  });
} else {
  console.error("要素が見つかりません。");
}
```

このコードにより、ユーザーが「今日」ボタンをクリックすると、日付入力フィールドに自動的に現在の日付が設定されます。
これにより、ユーザー体験が向上し、特定のタスクにおいてユーザーが手動で日付を入力する手間を省くことができます。
情報セキュリティマネジメント試験に合格した勉強法

# 情報セキュリティマネジメント試験に合格した勉強法
3月23日に情報セキュリティマネジメントを初めて受験し合格しました。
 
![スクリーンショット 2024-03-25 120714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741338/06e48147-6658-0aa3-1e73-b21909066e2c.png)

※著者スペック
  　社会人3年目（製造業での情シス担当）
   　文系大学出身
    　プログラミングは出来ない
     　ITパスポート所持、基本情報技術者（合格見込み）

勉強時間は平日1～2時間を10日くらい、合計20時間くらいでした。
※基本情報技術者試験の2週間後に受験したので少な目です。

## 使用したテキスト、サイト
①[情報セキュリティマネジメント試験ドットコム](https://www.sg-siken.com)
②[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/)
③[情報処理安全確保支援士 - SE娘の剣](https://sc.seeeko.com/)
    
### 選定理由
①いつものやつです。今回もお世話になりました。
②分からない単語が出てきたらここで調べました。それでも分からなければ③で調べました。
③辞書的な使い方をしていました。情報処理安全確保支援士は、情報セキュリティマネジメント試験より上位の資格ですが、分からない単語が詳しく解説されているので重宝しました。kindleで情報セキュリティマネジメント試験の教科書も購入し持っていたのですが、単語が羅列してあるだけで全く理解できませんでした。
※市販の教科書は全体像を掴むには良いかもしれませんが、逆にITパスポートや基本情報技術者をお持ちであれば不要かなと思います。

## 勉強方法
### 1.過去問道場でインプットとアウトプットを平行して行う。
過去問道場で過去問を1年ごとに解きます。分からない単語が出たら、IT用語辞典と情報処理安全確保支援士のサイトを参照して分かるまで調べました。
### 2.サンプル問題を解く。
過去問道場にサンプル問題も掲載されているため、それを解きます。科目Bの演習はここだけでした。

科目Aの対策に時間をかけ、科目Bはサンプル問題のみ勉強しました。
情報セキュリティマネジメント試験は、基本情報と異なり科目Bの文章題も科目Aと同じ120分の枠内で実施されるため（48問＋12問を120分で解く）、科目Aの完成度を上げれば科目Bに割く時間が増える試験です。
科目Bはしっかりと問題文を読み、引っ掛け・罠を見つければ点を取れます。
※ITパスポートや基本情報技術者をお持ちでなかったり、IT知識があまりない方は市販の教科書を最初に読むのもいいかもしれません。

## 所感
科目Aに関してはかなり勉強した（過去問道場で8年分＋予想問題）のですが、それでも分からない問題がいくつかありました。逆に科目Bに関してはサンプル問題、基本情報技術者試験からの出題・改題が多いように感じました。
やはり情報セキュリティマネジメント試験とあって、こと情報セキュリティにおいては基本情報技術者試験より難しかったです。最初は勉強しないでもいけるかなと思ったのですが、まずは過去問を解いて難易度を自分の目で確かめるといいですね。

4月の応用情報技術者試験は申込みし忘れてしまったので、情報処理系の資格レポはしばらく時間が空きそうです。今のところ簿記を受験する予定でいます。
文字コードに悩んでどうにかしたお話（for文の抜け方を忘れていたお話）

# はじめに
文字コードってさ、難しいよね
で、いろいろググっても概ね「頑張れ！」と言われているだけのような気がするので力技でどうにかしたお話をしようと思います。

# きっかけ
私、友人が主催している自転車の大会の運営のお手伝いをしてます。
毎月開催というふざけた開催頻度なんですが、ほぼほぼ毎月お手伝い。その中で課題が上がってきたのが、外注している「大会エントリの情報整理が大変」だということ、そして**個人情報を含むので外部に出せない**のだと。
で、「プログラムでどうにかしてよ！」とのご依頼。

マクロでできるじゃん！
その通り、でもこの友人はエクセルを持っていない！w

そしてpandasでプログラムを書いてみたら、外注先から送られてくるcsvファイルの文字コードがちょくちょく変わるんですよ。業者の問題なのか、この友人の問題なのか・・・。

# やりたいこと
csvを読み込む。
文字コードは不明（ちょくちょく変わる。）

これだけ

# 環境
2020 MacBook Air M1
pythonは3.10.8
pandasは2.0.1


# 考えたり、トライしたこと
まず考えたのが、実行できたらOK、ダメなら次の文字コードを試すということ
例えば、こんな感じ
```python
for i in ['a','c','a','4','e',]:
    print(float(i))
```
これだと、「a」はstr型なのでフロートに変換できずに終わります。
```
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[1], line 2
      1 for i in ['a','c','a','4','e',]:
----> 2     print(float(i))

ValueError: could not convert string to float: 'a'
```


なので、try、except文を使いましょう。
```python
for i in ['a','c','a','4','e',]:
    try:
        print(float(i))
    except:
        print(f'変換できへんかった: {i}')
```

でもね、最後まで行っちゃうと困っちゃう
```
変換できへんかった: a
変換できへんかった: c
変換できへんかった: a
4.0
変換できへんかった: e
```
読めた文字コードで終わりたいので、変換できた「4.0」で終わりたい。


ということで、for文に`break`を追加。
正直、for文で`break`できることを完璧に忘れてました。　<--　今回、qiitaを描きたくなたモチベはここ。
```python
for i in ['a','c','a','4','e',]:
    try:
        print(float(i))
        break
    except:
        print(f'変換できへんかった: {i}')
```
出力はこちら
```
変換できへんかった: a
変換できへんかった: c
変換できへんかった: a
4.0
```

# 実施したこと
ということでこんな風にプログラムを修正してみた。
```python
encoding_types = ['cp932', 'utf-8', 'utf_8_sig']

# 文字コード対策
for code in encoding_types:
    try:
        sports_entry_df = pd.read_csv(input_file, usecols=cols, encoding=code)
        print(f'エンコードのタイプは「{code}」です')
        break
    except:
        print(f'エンコードタイプ「{code}」では読み取れませんでした。')

```
どうやらこれで回避できたっぽい。友人からは連絡はまだない。
困ったら連絡くれるでしょ。

# まとめ
for文とtry&except文を使って、力技で回避しました。
そして、for文から`break`できることを思いだしました。w
さまざまな文字コードへの対応はあまり記述されていなくて困っている方も多いと思います。もっといい方法があれば教えていただけると嬉しいです。これマジで切実。
会社でも機種依存文字と半角カタカナで打ちのめされています。w

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

# 後日談
zennにいい投稿がありました！

https://zenn.dev/takedato/articles/c3a491546f8c58

力技でやっている僕が恥ずかしくなるほど素晴らしい記事！！
NASをUbuntuの起動時に自動マウントでディレクトリへの権限設定方法

# 結論
`/etc/fstab`に以下を記述
```terminal
//NAS_IP/共有ディレクトリ /mnt/マウント先 cifs credentials=/etc/cifs-utils/smbcredentials,file_mode=0777,dir_mode=0777,uid=1000,gid=1000 0 0
```

`/etc/cifs-utils/smbcredentials`に以下を記述し、
```
username=
password=
```
以下のコマンドを実行
```
sudo chmod 500 /etc/cifs-utils/smbcredentials
```

# 説明
前提として、Ubuntuの環境とNASがちゃんと利用できるように構築されているとします。

まず、cifsが入ってなければインストールしましょう。

```
sudo apt install cifs
```

そしたら、vimなどで`/etc/fstab`を開き、以下の内容を記述します。

```
//NAS_IP/共有ディレクトリ /mnt/マウント先 cifs credentials=/etc/cifs-utils/smbcredentials,file_mode=0777,dir_mode=0777,uid=1000,gid=1000 0 0
```

IPアドレスやパスは適宜読み替えて使ってください。
今回はcredentialsを使い、そこにユーザ名とパスワードを書くことで漏洩リスクを"多少"減らしています。
`file_mode`と`dir_mode`は通常の権限を設定するときと同様の使い方をします。これで共有ディレクトリに対して管理者権限を持っていないユーザでも書き読みできます（もちろん他の権限の設定も可能です）。

次に`credentials`の設定に移ります。`/etc/cifs-utils/smbcredentials`に以下を記述します。
```
username=
password=
```

例えばユーザ名がTakashiなら、`username=Takashi`、パスワードがHogeなら、`password=hoge`としてください。

最後に、`credentials`の権限を制限して終了します。
```
sudo chmod 500 /etc/cifs-utils/smbcredentials
```

以上です。
iOS転職後、初のtry! Swiftに参加しましたー!

昨年の10月、iOSエンジニアに転職し、初のカンファレンスはtry!Swiftでした!:)
結論から言うと、とても楽しかったです!!
最初は2万5000円!お高い!と思いましたが、それ以上の価値があったと実感しています。
運営の皆さんには本当に感謝です‥。
このような機会を設けていただき、ありがとうございました!!

## Day1
この日は会社の総会があったため行けませんでした🥺
## Day2
スピーカーのお話を聞いたり、スポンサーブースを回ったりしました！

### Accessibility APIを使ってアプリケーションを拡張する
Accessibility APIに興味がそそられてしまったので、実際に手を動かしてやってみようと思います!!
漫画の画面をスキャンして翻訳かけるのが面白かったなーと‥!!

https://speakerdeck.com/kishikawakatsumi/enhancing-applications-with-accessibility-api

### 何が写真をレトロたらしめるのか、Swiftを用いたその実現方法
フィルムカメラで味わいのある写真を撮ることを趣味とする中で、iPhoneのカメラでもそれに近づけることはできないかと試行錯誤しており、内容に惹きつけられてしまいました!!

### Swiftの型推論を学ぼう
ネット上で情報を摘んでいくと断片的な知識でわかりづらいので、お話を聞ける機会をいただけて嬉しかったです☺️

https://speakerdeck.com/omochi/lets-learn-about-type-inference-in-swift

### アプリのローカライゼーションの自動化
ローカライゼーションを行うことで、ユーザーも増加することが結果として出ていて、アプリも日本だけでなくて、国外に出していくべきだと改めて実感しました💪（スライドの公開を願いたい‥）

### 
スポンサーブースを周ってノベルティーをゲットしました😎
RevenueCatのキーキャップ可愛すぎて、新しいキーボード欲しくなってきました‥責任とってください‥
人形ももらいました!可愛すぎるー!!

<img width="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640998/a6278f4a-0edc-05d2-3f5b-1e295b9698be.jpeg">

新しく知り合えた方もいらっしゃり、満足が度を超えた2日目でした!!

## Day3
ワークショップに参加しましたー!!

### Swiftでレゴを動かそう!
BLEと、Core Bluetoothを使用して、レゴを動かすと言う内容でした!
わからないところは教えてもらいながら、進めることができました!!(とても楽しかった‥☺️)
初めて触る技術なので、戸惑いも多い中で、優しく声をかけてくださる方がたくさんいて、運営人に善人集まりすぎ注意報が発令してました。

そして、この短期間で、UIまで考えてGitHubにあげてしまう速さと、色センサーをつける凄さはもう、、脱が帽しております‥。

お隣の人がサンフランシスコから来た方で、英語だったのですが、ノリと勢いで乗り切りました!!笑
明るくて、好奇心いっぱいの方だったので最初から最後まで楽しかったです!!
###
Swift以外では、この2日間で、英語でのコミュニケーションが必須になってくるなと感じました、、（今更）
半分は外国の方で、セッションも英語が主流でした‥!

## まとめ
Swiftについては、ペーペーですが、そんな私でも楽しめる素敵な会でした!!
色々な出会いを与えてくれたこの機会に感謝です!
もっと色々な方に出逢いたい!!Swiftやりたい!!と思わせてくれました☺️

お仕事と運営とを両立して行うのは大変だったと思います‥、それでもこの機会を作ってくださった運営の皆さん本当にありがとうございました🙇
次回も必ず参加しますーー!!
周期的にセルに関数を入れる方法


```vb

Sub InsertFormulaAcrossColumns()
    Dim ws As Worksheet
    Set ws = ActiveSheet ' 現在アクティブなシートを使用
    
    Dim startRow As Long
    startRow = 3 ' 開始行
    
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row ' 最終行をD列の最終行に設定
    
    Dim startCol As Integer
    startCol = 4 ' D列（4として表される）
    
    Dim lastCol As Integer
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ' 最終列を特定
    
    Dim rowIdx As Long
    Dim colIdx As Integer
    Dim cycleStart As Long
    
    For colIdx = startCol To lastCol Step 2 ' D列から始めて、一つ飛ばしでループ
        cycleStart = 3 ' 各列の周期の開始行をリセット
        
        For rowIdx = startRow To lastRow
            If (rowIdx - cycleStart) Mod 7 <> 0 Then ' 7行ごとの周期の最初の行を除外
                ws.Cells(rowIdx, colIdx).Formula = "=IF(" & ws.Cells(cycleStart, colIdx).Address(False, True) & "=0, 0, " & ws.Cells(rowIdx, colIdx).Address & "/" & ws.Cells(cycleStart, colIdx).Address(False, True) & ")"
            Else
                If rowIdx <> startRow Then ' 開始行ではない周期の最初の行でインデックスを更新
                    cycleStart = cycleStart + 7 ' 次の周期のために基準点を更新
                End If
            End If
        Next rowIdx
    Next colIdx
End Sub

```
10Gエレクトリカルポートモジュールの応用：超高速ネットワーク伝送を実現

まとめ：
この記事では、10G電気インターフェースモジュールの利点と、さまざまな応用分野でのその応用について詳しく紹介します。 10 ギガビット電気ポート モジュールの速度は、ギガビット イーサネットの 10 倍である 10Gbps に達することができ、高速かつ大容量のデータ伝送と低消費電力の要件に適しています。
文章：
インターネットの急速な発展とデータ量の継続的な増加により、従来のギガビット イーサネットでは大規模なデータ伝送のニーズを満たすことができなくなりました。 10ギガビットイーサネットは現在最も一般的なイーサネット規格として様々な分野で普及しており、超高速なネットワーク伝送を実現します。 この記事では、10G電気インターフェースモジュールの利点とさまざまな応用分野での応用について詳しく紹介します。
1. 10G 電気ポート モジュールの利点。
10 ギガビット電気インターフェイス モジュールの速度は、ギガビット イーサネットの 10 倍である 10 Gbps (つまり、1 秒あたり 10 GB のデータを送信できる) に達します。 これにより、高速かつ大容量のデータ伝送の要求に応えることができる。 さらに、10G 電気インターフェース モジュールは低消費電力という特徴を備えており、エネルギー消費を削減し、運用コストを削減できます。 同時に、10G 電気ポート モジュールは高い互換性も備えており、大規模なハードウェアのアップグレードを必要とせずに、既存のギガビット イーサネット機器やネットワーク インフラストラクチャと互換性を持たせることができます。
2. 10G電気ポートモジュールの適用
データセンター: 10G 電気インターフェイス モジュールは、サーバーの相互接続やストレージ ネットワークの構築に広く使用されています。 データセンターは通常、大量のデータを処理する必要がありますが、10G 電気インターフェース モジュールは高速で信頼性の高いネットワーク伝送のニーズを満たすことができるため、データセンターの処理効率とパフォーマンスが向上します。
エンタープライズ ネットワーク: 企業の内部ネットワークの重要な部分として、エンタープライズ ネットワークは大量の情報交換とビジネス アプリケーションを伝送します。 10 ギガビット電気ポート モジュールは、企業に高速で安定したネットワーク接続を提供し、企業内のさまざまな部門間の情報交換と協力を促進します。
ビデオ伝送: ビデオ会議やオンライン教育などのアプリケーションの普及に伴い、高解像度ビデオ伝送の需要は増加し続けています。 10G 電気インターフェース モジュールの高帯域幅は、高解像度ビデオ伝送のニーズを満たし、ビデオ通話や会議のスムーズさと安定性を保証します。
リモート作業とクラウド コンピューティング: リモート作業とクラウド コンピューティングの台頭により、ネットワーク通信の品質は共同作業の効率にとって非常に重要です。 10 ギガビット電気ポート モジュールは、安定した効率的なネットワーク接続を提供し、リモート オフィスおよびクラウド コンピューティング アプリケーションのニーズを満たし、企業情報化の構築と発展を促進します。
科学研究と教育: 科学研究機関や教育機関では、研究者や学生は通常、大量のデータを処理し、高性能コンピューティングを実行する必要があります。10 ギガビット電気インターフェース モジュールは、高速で安定したネットワーク接続を提供し、大規模なネットワークをサポートできます。データ伝送と高性能コンピューティングが必要です。
以上をまとめると、10ギガビット電気インターフェースモジュールは、超高速ネットワーク伝送を実現するキーテクノロジーとして、その高速性、低消費電力性、互換性などの利点により、さまざまな分野で広く使用されています。 大規模データセンター、エンタープライズネットワーク、科学研究や教育などの分野において、10ギガビット電気インターフェースモジュールは高速かつ大容量のデータ伝送のニーズを満たし、ネットワークの効率とパフォーマンスを向上させることができます。![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736721/26652981-2782-c804-6c75-03e8577f64b0.jpeg)
ネットワーク機器産業チェーンにおける 10G 電気インターフェース モジュールの生産、販売、市場配置

まとめ：
この記事では、ネットワーク機器産業チェーンにおける 10G 電気インターフェイス モジュールの状況と影響について説明します。 生産プロセスには、エレクトロニクス、光学、パッケージングなどの複数の技術分野が関係します。 企業は先進的な生産設備と製造プロセスを導入し、品質管理を強化する必要があります。 主要な技術と課題には、チップ、回路設計、パッケージングなどが含まれます。
文章：
ネットワーク通信技術の急速な発展に伴い、10G電気インターフェースモジュールは新世代の高速ネットワーク接続ソリューションとして、ネットワーク機器産業チェーンにおいて重要な位置を占めています。 この記事では、10G 電気インターフェース モジュールの生産、販売、市場レイアウトを深く調査し、ネットワーク機器産業チェーンにおけるその地位と影響を明らかにします。
1. 10G電気インターフェースモジュールの生産
生産工程
高度に統合されたネットワーク通信コンポーネントとして、10G 電気ポート モジュールの製造プロセスには、エレクトロニクス、光学、パッケージングなどの複数の分野のテクノロジーが関与しています。 生産プロセス中、企業はモジュールの信頼性と安定性を確保するために、高度な生産設備と製造プロセスを使用する必要があります。 同時に、企業は製品の認定率と一貫性を確保するために品質管理を強化する必要もあります。
主要なテクノロジーと課題
10G 電気インターフェイス モジュールの製造には、チップ、回路設計、パッケージングなど、多くの重要なリンクが含まれます。 企業は、製品のパフォーマンスを向上させ、生産コストを削減するために、これらの重要なリンクを継続的に突破する必要があります。 さらに、テクノロジーの継続的な進歩に伴い、企業は市場の需要と技術トレンドを常に把握し、継続的に技術のアップグレードとイノベーションを実行する必要があります。
2. 10ギガビット電気インターフェースモジュールの販売
販売チャネルとモデル
10G電気インターフェースモジュールの販売チャネルには、主に直販、流通、電子商取引モデルが含まれます。 直販モデルは主に大企業の顧客に適しており、顧客と直接コンタクトを確立してカスタマイズされた製品やサービスを提供します。 販売モデルはディーラーまたは代理店を通じて販売するため、幅広い顧客グループに適しています。 電子商取引モデルは、オンライン販売にインターネット プラットフォームを使用するため、便利で効率的です。
市場拡大とマーケティング戦略
企業が市場シェアを高め、売上規模を拡大するためには、効果的な市場拡大戦略やマーケティング戦略を策定する必要があります。 これには、ブランドプロモーションの強化、製品認知度の向上、新しいアプリケーション分野への拡大、パートナーとの関係強化などが含まれます。 また、質の高いアフターサービスやサポートを提供することも、顧客を獲得し、顧客ロイヤルティを維持するための重要な手段です。
3. 10G電気ポートモジュールの市場レイアウト
地域市場分布
10G 電気インターフェース モジュールの市場レイアウトは世界的な特徴を示しています。 ネットワーク通信技術のボーダレスな性質により、10G 電気インターフェース モジュールの市場分布も比較的広範囲にわたっています。 さまざまな地域で市場の需要と発展には違いがあり、企業は顧客のニーズとさまざまな地域での競争に基づいて、対応する市場戦略を策定する必要があります。
産業応用分野
10G 電気インターフェース モジュールは、通信、データ センター、キャンパス ネットワーク、クラウド コンピューティングなどのさまざまな業界で広く使用されています。 10G電気インターフェースモジュールの需要特性や応用シナリオは分野ごとに異なり、企業はさまざまな分野の市場需要や技術トレンドを深く理解し、特化したカスタマイズされた製品やサービスを提供する必要があります。
4. 結論
要約すると、10G 電気インターフェイス モジュールは、ネットワーク機器産業チェーンにおいて重要な位置と影響力を持っています。 生産の観点から見ると、企業は製品の信頼性と安定性を確保するために主要なテクノロジーと生産プロセスを習得する必要があります。 販売の観点から見ると、企業は市場シェアを拡大​​し、販売規模を拡大するために効果的な販売戦略とマーケティングツールを開発する必要があります。 市場レイアウトの観点から、企業は世界市場の分布とさまざまな産業分野の需要特性に注意を払い、それに対応した市場戦略を策定する必要があります。 将来的には、ネットワーク通信技術の継続的な進歩と応用分野の拡大に伴い、10G電気インターフェースモジュールの市場需要は成長し続けるでしょう。 企業は市場競争に対抗し、発展の機会を掴むために、技術革新と市場拡大能力を強化する必要がある。![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736721/b4c1f057-fb26-0666-a08f-b0ceef5cba50.jpeg)
10G電気ポートモジュールの産業開発状況と展望

まとめ：
この記事では、10G電気ポートモジュールの現在の産業開発状況と将来の展望について説明します。 市場の需要は急速に成長しており、企業、データセンター、キャンパスネットワークなどのニーズが業界の急速な発展を促進し続けています。 産業チェーンのレイアウトが完成し、技術革新が産業の発展を促進します。 今後も市場は拡大し続けるため、産業チェーンの上流と下流の企業は連携を強化する必要がある。
文章：
ネットワーク通信技術の急速な発展に伴い、新世代の高速ネットワーク接続ソリューションとして、10G電気インターフェースモジュールが徐々に市場の注目を集めています。 この記事では、10 ギガビット電気インターフェース モジュールの現在の産業開発状況について詳しく説明し、その将来の開発の見通しを展望します。
1. 10G電気ポートモジュール産業の発展状況
市場需要の成長
クラウド コンピューティング、ビッグ データ、人工知能などの新興テクノロジーの発展に伴い、データ トラフィックは爆発的に増加し、ネットワークの通信速度と帯域幅に対する需要は増加し続けています。 このような背景から、10 ギガビット電気インターフェイス モジュールは、その高速データ伝送機能と幅広いアプリケーション シナリオにより、市場で徐々に人気のある製品になってきました。 10G電気インターフェースモジュールの需要は企業、データセンター、キャンパスネットワークなどのさまざまな分野で増え続けており、業界の急速な発展を推進しています。
産業チェーンの改善
10G 電気ポート モジュール市場が拡大し続けるにつれて、業界チェーンの上流および下流企業が導入を進め、完全な業界チェーンを形成しています。 チップ設計、モジュール製造、機器統合からアプリケーションサービスまで、あらゆる面で企業が業界の持続可能な発展を促進するために積極的に参加しています。 同時に、産業チェーンの改善によりコストがさらに削減され、製品の品質と競争力が向上しました。
技術革新によって促進される
10G 電気ポートモジュール業界の発展は、技術革新の促進と切り離せません。 企業は、10G 電気インターフェース モジュールの互換性、安定性、エネルギー消費、その他の側面における画期的な進歩を促進するために、研究開発への投資を増やし続けています。 さらに、人工知能やモノのインターネットなどの新技術も、10G 電気インターフェース モジュール業界の発展に新たな機会と課題をもたらします。 企業は技術開発のトレンドを把握し、市場の変化するニーズに対応するために革新を続ける必要があります。
2. 10ギガビット電気ポートモジュール業界の展望
市場規模の継続的な拡大
ネットワーク通信技術の継続的な進歩とデジタルトランスフォーメーションの深化に伴い、10G電気インターフェースモジュールの市場規模にはまだ大きな成長の余地があります。 今後、5G、エッジコンピューティング、クラウドコンピューティングなどの技術の普及と応用に伴い、10G電気インターフェースモジュールはより多くの分野で応用され、市場規模は拡大し続けると予想されます。
産業チェーンの協調的発展
10G電気ポートモジュール業界の今後の発展には、業界チェーンの上流企業と下流企業の協力が必要です。 チップの設計や製造からアプリケーションサービスに至るまで、企業はあらゆる面で協力を強化し、業界の持続可能な発展を共同で推進する必要がある。 協力的なイノベーション、リソース共有、その他の方法を通じて、企業はコストを削減し、効率を向上させ、競争力を強化し、10G電気インターフェースモジュール業界の繁栄と発展をさらに促進することができます。
市場競争環境の変化
10G 電気ポートモジュール市場が拡大し続け、テクノロジーが革新し続けるにつれて、市場の競争環境も変化すると考えられます。 企業は、市場競争の圧力に対処するために、技術力とイノベーション能力を継続的に向上させる必要があります。 同時に、企業は市場の変化や顧客のニーズに注意を払い、新しいアプリケーション分野を積極的に拡大し、市場シェアと競争力を向上させる必要もあります。
3. 結論
要約すると、10G電気インターフェースモジュール業界は急速に発展しており、市場規模は拡大し続けており、技術革新はブレークスルーを続けています。 将来的には、技術の徹底的な開発と産業チェーンの協力協力により、10G電気インターフェースモジュール業界はより広範な発展の展望をもたらすことが期待されています。 企業は市場の変化と技術開発の動向を把握し、市場競争に対抗して発展の機会をつかむために自社の技術革新と産業チェーンの協力を強化する必要がある。![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736721/e3568e03-4d93-ba12-fffd-6f8a84f9ee1e.jpeg)
電気ポートモジュールの応用：高速ネットワーク通信を実現

まとめ：
ネットワーク通信の重要な部分である電気ポート モジュールは、高速伝送、優れた安定性、柔軟な拡張性という特徴を備えています。 エンタープライズ ネットワークやデータ センターでは、ローカル エリア ネットワーク、ワイド エリア ネットワークを構築し、サーバーやストレージ デバイスを接続するために電気ポート モジュールが広く使用されています。 高速伝送と安定性により、企業内コミュニケーションの効率と品質が保証されます。
文章：
インターネットの普及と情報化時代の到来により、ネットワーク通信は現代社会に欠かせないものとなっています。 ネットワーク通信の重要な部分として、電気ポート モジュールはますます広く使用されています。 この記事では、電気インターフェースモジュールの利点と応用分野について詳しく紹介します。
まず、電気ポート モジュールには高速伝送機能があります。 電気ポート モジュールは、100M、100M、10G などのさまざまな伝送速度をサポートできます。さまざまなニーズに応じてさまざまなモジュールを選択できます。 特に大規模なデータ伝送および処理シナリオでは、電気ポート モジュールの高速伝送機能が高速通信のニーズを満たすことができます。
第二に、電気ポートモジュールは安定性が良いという特徴があります。 高度な伝送技術とプロトコルを使用することにより、電気ポート モジュールは伝送中のデータの安定性と信頼性を確保できます。 エンタープライズ ネットワークであっても、データ センターなどの高性能コンピューティング環境であっても、電気インターフェイス モジュールは安定したネットワーク接続を提供し、通信品質を保証します。
さらに、電気ポート モジュールは柔軟で拡張性があります。 電気ポート モジュールは、さまざまなデバイスやネットワーク環境に適応でき、スイッチ、サーバー、ネットワーク カード、その他のデバイスに接続できます。ネットワーク機器では、電気ポート モジュールは、光ポートを RJ45 に適合する電気ポートに変換できます。ネットワーク機器のインターフェイス（ネットワーク ケーブル インターフェイスが不十分な場合）、電気ポート モジュールはさまざまな伝送速度と動作モードをサポートできます。 この柔軟性と拡張性により、電気ポート モジュールのネットワーク通信における応用範囲が広がります。
次に、電気ポートモジュールのさまざまな分野での応用例を見てみましょう。
電気インターフェイス モジュールは、企業ネットワークで広く使用されています。 企業では、電気ポート モジュールを使用してローカル エリア ネットワーク (LAN) とワイド エリア ネットワーク (WAN) を構築し、企業内のさまざまな部門間の通信とデータ送信を実現します。 電気ポート モジュールの高速伝送機能と安定性の利点により、企業内の内部通信の効率と品質が保証されます。
次に、電気ポート モジュールはデータ センターで重要な役割を果たします。 データセンターでは、ほとんどのリンク長は 10m ～ 100m であり、電気ポート モジュールはサーバーとストレージ デバイスの接続に使用され、100m 以内の大規模なデータ送信と処理を実現します。 高速ケーブル (スタック ケーブル) では約 7M しか伝送できないという制限を補い、100M アクティブ光ケーブルの使用に伴う高額なコストを節約でき、大幅なコスト削減が可能になります。
さらに、電気ポートの動作速度は自動的に一致し、下位互換性があるため、10 ギガビット イーサネットをアップグレードする場合、以前のツイスト ペア ケーブル リソースをネットワーク アップグレード中に再利用できるだけでなく、前世代のイーサネットでも使用できます。 100 Mbps イーサネット ケーブル ポート モジュールには互換性があり、10GE ネットワーク導入をシームレスに完了します。 ただし、光モジュールを使用する場合は、アップグレードを実現するためにネットワーク機器と併用する必要があるため、銅線ケーブルのインフラストラクチャのコストは光ファイバーのコストよりもはるかに低いため、予算を大幅に節約できます。
上記の応用分野に加えて、電気インターフェースモジュールはスマートホーム、医療、産業オートメーションなどの分野でも広く使用されています。 企業ネットワークで内部通信を実装する場合でも、データセンターで大規模なデータを処理する場合でも、電気インターフェイス モジュールは効率的な伝送と安定したネットワーク接続を提供できます。 科学研究と教育の分野では、電気インターフェース モジュールは高性能コンピューティングと実験データ送信のサポートを提供します。 スマートホーム、医療、産業オートメーションの分野において、電気インターフェースモジュールは、高速で安定したネットワーク通信を通じてインテリジェンスの発展と自動化を実現します。 また、人工知能やモノのインターネット技術の急速な発展に伴い、ビッグデータ処理や機器相互接続の需要が高まっており、電気インターフェースモジュールはこれらの分野でのネットワーク通信を強力にサポートすると考えられます。
全体として、電気ポート モジュールはネットワーク通信に不可欠な部分として、さまざまなアプリケーション分野で重要な役割を果たしています。 科学技術の進歩とネットワーク要件の変化に伴い、電気インターフェースモジュールの用途は拡大と革新を続け、現代社会のネットワーク通信に大きく貢献すると考えられます。![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736721/32108c87-33af-b868-f50f-a9f73a1d177f.jpeg)
【ChatGPT有＋DALL-E3】で塗り絵画像を作るPromptShare。


　どうも、カーブミラーです。

　今回は、塗り絵画像を作るPromptをシェアしたいと思います。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　まずは
　　ChatGPTアプリ版のニュース。

　今まで、
　　パソコン上で
　　　Web版では、
　　　　GPTsの呼び出しができる
　　　　　メンション機能が
　　　　　　ありました。

　それが
　　Android版だけですが
　　　アプリ版にも
　　　　メンション機能が
　　　　　使えるようになりました。

　使い方は、
　　Web版と同じ、
　　　“@”を入力するだけです。
　　　　ポップアップメニューが
　　　　　出てきて、そこから
　　　　　　選択します。

　アプリ版では
　　GPTsは作成できませんが、
　　　普段使いならば
　　　　アプリ版の方が
　　　　　いいのかもしれませんね。
***
　さて、
　　本題です。

　塗り絵というと
　　子ども用のものが
　　　思い浮かびますよね。

　ですが
　　大人用も
　　　出版されています。

　以下のようなことが言われています。
　・集中力アップ
　・リラックス効果
　・気分転換
　・モチーフが豊富で飽きがこない
　・短時間で楽しめるから続けやすい
***
　そんな塗り絵を
　　自作しよう、というのが
　　　今回の目的になります。

　自作と言っても
　　印刷するのは
　　　当然ながら、
　　　　ふつうのプリンターで
　　　　　A4とかの印刷用紙に
　　　　　　なるかと思います。

　そうなれば、
　　水彩ではなく、
　　　色鉛筆やボールペンなどに
　　　　なるかと思います。

　印刷用紙に
　　画用紙はありませんのでね(汗)

　そうしたことに
　　留意してもらう必要があります。
***
　では
　　Shareする
　　　Promptをどうぞ。
```Text:大人の塗り絵Prompt
[description of the subject: ❶]
[specific elements: ❷]
[choose a style: ❸]

Depict [description of the subject] in a line art style suitable for coloring. The drawing should be detailed with clear, distinct lines and separated areas to facilitate easy coloring. Features like [specific elements] should be emphasized, capturing the essence of the subject in a dynamic and engaging manner. The style should be [choose a style], with clean lines and spaces that invite coloring.
```
　最初の三行は
　　変数になります。
　　　内容は以下のとおり。
　❶. **[description of the subject]**: 
　　描きたい対象の具体的な説明。
　　これは、描画されるシーンや
　　キャラクターの詳細を示します。
　　（例：庭に座っている猫）

　❷. **[specific elements]**: 
　　対象物の詳細な特徴や要素。
　　これは作品にリアリティや
　　特別な特徴を加えるためのもの。
　　（例：詳細な毛の質感、
　　　　　　表情豊かな目）

　❸. **[choose a style]**: 
　　描画に使用するスタイル。
　　これはアートワークの全体的
　　な雰囲気や感じを決定します。
　　（例：リアル、カートゥーン、
　　　　　　アニメなど）
***
　ただし、
　　スタイルに関しては
　　　あまり変化が見られません。
　　　　まぁ、線画ですからね。

　ちなみに
　　画像サンプルが
　　　こちらの二点です。
![A_line_art_illustration_of_the_Rhine_River,_emphas.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/07079e1c-88dd-fd01-a689-5519aa5fed89.jpeg)
![A_magical_girl_wielding_magic,_standing_in_front_o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/c981870d-9130-a919-175f-9ccf0221aac7.jpeg)

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ギガビット電気ポート モジュールと 10G 電気ポート モジュール: ネットワーク速度の進化

まとめ：
この記事では、ギガビット電気ポート モジュールと 10G 電気ポート モジュールの技術的な進歩、コスト効率、および利点について説明します。 イーサネットは、オリジナルの 100 メガビット イーサネットから今日のギガビット イーサネットおよび 10 ギガビット イーサネットに進化し、ビッグ データ、クラウド コンピューティング、人工知能などの新たなアプリケーションのニーズを満たしています。 その中でも、10G 電気ポート モジュールは、ネットワーク接続の重要なコンポーネントとして重要な役割を果たします。
文章：
情報技術の急速な発展に伴い、ネットワーク通信技術も日々進歩しています。 過去数十年間で、イーサネットの速度は、ビッグデータ、クラウド、コンピューティングなどの新興アプリケーションのニーズを満たすために、当初の 100M イーサネットから今日のギガビット イーサネットと 10G イーサネット、さらには 40G および 100G イーサネットに至るまで、大きな変化を遂げてきました。そして人工知能。 このプロセスでは、10G 電気ポート モジュールがネットワーク接続の主要コンポーネントとして重要な役割を果たします。 この記事では、ギガビット電気ポート モジュールと 10G 電気ポート モジュールの技術的な進歩、費用対効果、利点について説明します。
1. 100M およびギガビット イーサネットの制限
最も初期のイーサネットは 100 Mbps の速度で、当時のネットワーク ニーズのほとんどを満たすことができました。 インターネットの普及とビッグデータ時代の到来により、100M イーサネットの限界が明らかになり始めています。 大量のデータ伝送を扱う場合、100M イーサネットの速度では高速通信のニーズを満たすことができなくなります。
その結果、人々はより高速なソリューションを求め始め、ギガビット イーサネットがすぐに登場しました。 ギガビット イーサネットの速度は 1000Mbps で、これは 100M イーサネットの 10 倍です。 この技術的進歩により、大量のデータの送信がより高速かつ効率的に行われます。 ギガビット イーサネットの出現と発展により、不十分な伝送速度の問題が大幅に解決され、ネットワーク通信がより効率的になりました。
2. 10ギガビットイーサネットの登場と発展
クラウド コンピューティング、データ センター、インターネット アプリケーションの発展に伴い、データ トラフィックが爆発的に増加しており、ギガビット イーサネットは、大規模なデータと低コストのデータを処理する必要がある大企業、データ センター、科学研究機関などの特定のシナリオのニーズを満たすことができません。待ち時間。 ギガビット イーサネットの限界を解決するために、10 ギガビット イーサネット (10Gbps イーサネット) が登場しました。 10 ギガビット イーサネットは、ギガビット イーサネットと比較して伝送速度が 10 倍に向上し、ギガビット イーサネットでは満たせないギャップを埋め、ネットワークの伝送速度をより高速かつ安定にします。 大規模なデータ送信と処理のシナリオでは、10 ギガビット イーサネットの利点が特に明白です。
10 ギガビット イーサネット テクノロジーの継続的な開発により、そのアプリケーション シナリオもさらに拡大しています。 初期の大規模データ センターやハイエンドのエンタープライズ ネットワークから、その後のキャンパス ネットワーク、メトロポリタン エリア ネットワーク、ワイド エリア ネットワークに至るまで、10 ギガビット イーサネットは徐々にネットワーク通信の主流テクノロジーになってきました。 同時に、さまざまなシナリオのニーズを満たすために、電気ポート モジュールも常に進化し、最適化されています。
3. 電気ポートモジュールの進化
10 ギガビット イーサネットの開発に適応するために、電気ポート モジュールも技術的なブレークスルーを経験しました。 ギガビット電気ポート モジュールと 10G 電気ポート モジュールの出現により、ネットワーク通信のためのより良い選択肢が提供されます。 ギガビット電気ポート モジュールは、ギガビット イーサネット用に設計されており、ギガビット イーサネットの高速伝送を実現できます。 10 ギガビット電気ポート モジュールは、ギガビット電気ポート モジュールに基づいてアップグレードされ、伝送速度が 10 ギガビット イーサネットのレベルまで向上します。
技術的に言えば、ギガビット電気ポート モジュールと 10 ギガビット電気ポート モジュールは両方とも、ネットワークの速度と負荷条件を自動的に識別して適応できる適応型テクノロジーをサポートし、より安定した効率的なデータ伝送を実現します。 コストの面でも、10G 電気インターフェース モジュールの費用対効果は常に向上しています。 技術の進歩と市場競争の激化に伴い、10G電気インターフェースモジュールの価格は徐々に低下し、幅広い応用分野への普及が徐々に進んでいます。
10G 電気ポート モジュールは、ネットワーク接続の重要なコンポーネントとして、ギガビットから 10G への移行において重要な役割を果たします。 10G 電気ポート モジュールには、ギガビット電気ポート モジュールと比較して多くの利点があります。 まず、10G電気インターフェースモジュールは伝送速度が速く、大容量のデータ伝送と処理タスクをより速く処理できます。 第 2 に、10G 電気インターフェース モジュールはハイ パフォーマンス コンピューティングと大規模データ センターのニーズを満たし、企業により安定した効率的なネットワーク アーキテクチャを提供します。 さらに、10G 電気ポート モジュールはギガビット イーサネットとも互換性があり、既存のネットワーク機器にシームレスに接続できるため、アップグレードと拡張性が向上します。
一般に、ギガビット電気ポート モジュールと 10G 電気ポート モジュールの出現は、ネットワーク伝送速度の飛躍的な発展を示しています。 ギガビット イーサネットの制限により、10 ギガビット イーサネットの出現と開発が生まれ、ネットワーク通信がより効率的かつ高速になりました。 電気ポート モジュール技術の進歩と費用対効果の向上により、10G 電気ポート モジュールは企業に優れた通信ソリューションを提供するために徐々に普及しており、10G 電気ポート モジュールは将来的に重要な役割を果たし、ネットワーク通信技術を促進するでしょう。継続的な進歩の。![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736721/b34bd040-fa4e-5e11-a910-d7889f4e8b9b.jpeg)
[Next.js+FullCalendar v5] イベントがある日付にGitHubの草のように背景色をつける方法

# この記事で行いたいこと

**FullCalendarを使ってイベントがある日付にGitHubのように背景色をつけることができるようになります。**

![スクリーンショット 2024-03-25 10.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517030/b30ef7e3-19e2-8f28-b92f-0168a38dca1e.png)


# 前提

Next.jsを使用してnpmのライブラリFullCalendarを使ってカレンダーを表示していること。

インストール方法は以下の公式や記事を参考にしてください。

https://fullcalendar.io/

https://qiita.com/tak001/items/b57459db58f6ff8658a4

https://qiita.com/dende-h/items/e6c65198e3d7debf0f1e

# 実装

## イベントを表示する

関数を設定して、FullCalendarタグにイベントを設定する。しかし、背景色はありません。

※dataはFetchなどして取得したものと仮定してます。

![スクリーンショット 2024-03-25 10.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517030/c2f0fd73-f6af-183d-450d-7815856b5851.png)

```jsx
// イベントを設定
const eventExample = data.map((data: any) => ({
  title: "イベント",
  start: deta.date,
  backgroundColor: "green",
  borderColor: "green",
}))
~~省略~~
return(
 <>
	 <FullCalendar
	  plugins={[dayGridPlugin, interactionPlugin]}
	  locale={jaLocale}
	  initialView="dayGridMonth"
	  events={[...eventExample]}
	  headerToolbar={{
	    start: "prevYear,nextYear",
	    center: "title",
	    end: "today prev,next",
	  }}
	  contentHeight={"700px"}
	/> 
	
~~省略~~
```

## 【主題】イベントがある日付に背景色をつける

新たに関数を設定して、FullCalendarタグのイベントに関数を追加する。

これでイベントに加えて背景色が表示されます。

![スクリーンショット 2024-03-25 10.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517030/c3574e02-a193-36de-c59a-e342b83b2c4e.png)


```jsx
const eventExample = data.map((data: any) => ({
    title: "イベント",
    start: deta.date,
    backgroundColor: "green",
    borderColor: "green",
  }))

// 以下を追加
// 同じイベントに対して背景色をつける関数を設定
const backgroundEvents = data.map((data: any) => ({
  start: data.date,
  backgroundColor: "green",
  display: "background",
}))

~~省略~~
return(
<>
	<FullCalendar
	  plugins={[dayGridPlugin, interactionPlugin]}
	  locale={jaLocale}
	  initialView="dayGridMonth"
	  events={[...eventExample, ...backgroundEvents]} //関数を追加
	  headerToolbar={{
	    start: "prevYear,nextYear",
	    center: "title",
	    end: "today prev,next",
	  }}
	  contentHeight={"700px"}
	/>
~~省略~~
```

# 最後に

Next.jsでの実務経験がない私が投稿しているため、もっと効率のいいやり方があるかもしれません。その際はコメントをいただけると幸いです。
VC++/MASMでx64 DLLを作る

# 環境
Windows 11 Pro (x64)
Visual Studio Community 2022

Visual Studio 2022
x64 Native Tools Command Prompt for VS 2022

# 作成

## C++

```fig_c.cpp
/*
cl /LD /MD fig_c.cpp
*/
#define DLL_EXPORT extern "C" __declspec(dllexport)

DLL_EXPORT int hoge(int a, int b)
{
	return a * b;
}
```

## MASM64

```fig_a.asm
comment *
ml64 /c /Fl fig_a.asm
link /dll /entry:DllMain fig_a
*
.code
DllMain proc
	mov	eax, 1
	ret
DllMain endp

hoge proc export
	imul	ecx, edx
	mov	eax, ecx
	ret
hoge endp
end
```

# 確認

## C++

```fig1.cpp
/*
cl /MD fig1.cpp
*/
#pragma comment(lib, "fig_c")

#include <stdio.h>

extern "C" int hoge(int a, int b);

int main(void)
{
	int x = hoge(3, 4);
	printf("%d\n", x);
}
```

## Python

```fig2.py
# "C:\Program Files\LibreOffice\program\python" fig2.py
import ctypes

dll = ctypes.WinDLL(r"./fig_c")
print(dll.hoge(3, 4))
```
Salesforce認定アドミニストレーター過去問+時々解説　Q71 ~ Q80

## Q71. ケースはどのオブジェクトと関連していますか？

A キャンペーン
B 予測
C 取引先
D 取引先責任者

<details><summary>解答</summary>
C, D
</details>

## Q72. ユーザーにダッシュボードへのアクセス権を与えるためにはどうすべき？

A 実行ユーザの指定
B データカテゴリを作成し共有する
C パブリックグループとフォルダを共有する
D ロールとフォルダを共有する

<details><summary>解答</summary>
C, D

解説: ダッシュボードぼアクセス管理は, ダッシュボードが保存されるフォルダの共有設定から管理する. フォルダの共有とアクセス権を設定することでダッシュボード管理が行え, 共有先ではロールや公開グループが選択でき, アクセス権では「表示」「編集」「管理」を選択することができる.
</details>

## Q73. 複数選択リスト値は制御項目に設置できますか？

<details><summary>解答</summary>
いいえ

解説: 連動リストに複数選択リストを設置することはできるが, 制御項目に設置することはできない.
</details>

## Q74. データインポートウィザードで商談またはケースのインポートを行えますか？

<details><summary>解答</summary>
いいえ

解説: データインポートウィザードでできる標準オブジェクトは, 「取引先と取引先責任者」「リード」「ソリューション」「キャンペーン」のみ.
</details>

## Q75. データやグラフのグルーピングを使用することができないのは, どの形式のレポート？

A 表形式レポート
B サマリーレポート
C マトリクスレポート
D 上記のどれでもない

<details><summary>解答</summary>
A

解説: サマリーレポート形式とマトリクスレポート形式の場合, [グルーピングを作成するには、ここに項目をドロップします。]というフィールドがあるが, 表形式には無い.
</details>

## Q76. ステージ設定フローでカスタマイズできる2つのオブジェクトはどれ？

A キャンペーン
B 商談
C キャンペーンメンバー
D リード

<details><summary>解答</summary>
B, D

解説: 商談とリードにはフェーズがあるから, ステージ設定フローのカスタマイズが可能.
</details>

## Q77. ユーザーが活動を追加またはケースレコードから電子メールを送信するたびに, エスカレーションアクション実行までの経過時間がリセットされますか？

<details><summary>解答</summary>
いいえ

解説: エスカレーションルールから[エスカレーションアクション]の設定を行うことができ, [経過時間]項目でエスカレーションアクションが実行されるまでの時間設定を行うことができる.
</details>

## Q78. リストビュー, 検索結果, レポートに特定の項目を表示する機能はどれか？

A ページレイアウト
B 項目レベルセキュリティ
C プロファイル
D どれでもない

<details><summary>解答</summary>
B

解説: 項目レベルセキュリティの「参照可能」「参照のみ」チェックボックスでアクセスコントロールすることができる.
</details>

## Q79. 「取引の開始」時, リード数式項目の値をどのおように取引先レコードにマッピングしますか？

A 取引先レコードの積み上げ集計項目にマッピングします
B 取引先レコードの数式項目にマッピングします
C 取引先レコードの標準項目にマッピングします
D 取引先レコードの数値項目にマッピングします

<details><summary>解答</summary>
D

解説: リード数式項目は, 数値型あるいはテキスト型のカスタム項目にしかマッピングできない.
</details>

## Q80. キャンペーンのROIを測定するために, ROI分析レポートでどの計算式を利用しますか？

A 予想収入/予算コスト
B 獲得商談数/予算コスト
C 商談数/期待収入
D （成立商談金額 - 実際原価）/実際原価

<details><summary>解答</summary>
D

解説: ROI=投資利益率(費用対効果も同義？知らんけど). キャンペーンの効果測定を行う際に, キャンペーンによって獲得できたリード数や商談数, 受注数を追跡し, それらの情報を基にROI(投資利益率)を確認することになる.
</details>

## Q81~Q90
https://qiita.com/taiga-shiokawa/items/5b25729e9e24c259a0af
WordPressカスタムCSS・JSの編集が反映されなくなる事象の対処

WordPressの編集画面で更新ボタンを押下してもカスタムCSS・JSの編集内容が反映されなくなった際の備忘録です。
![20240325_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713493/d37dded9-4d44-5ddc-eb5c-9f96b6aa6f88.png)


# 環境
サーバ：ロリポップ！
CMS：Wordpress(6.4.3)
テーマ：Cocoon Child
Web server：nginx
PHP version：8.1.23
Database：MySQL 8.9.16

Local( https://hub.localwp.com/ )で検証環境を作成後、WordPressのプラグイン「All-in-One WP Migration」でロリポップ！のサーバ内に作成したWordPress環境へインポート。


# 発生した対処
編集後、保存ボタンを押下しても環境に対象のコードが反映されない。
（※編集後の画面でスーパーリロードすると編集前のコードが表示される
　　サーバ / ブラウザ / テーマ のキャッシュ削除も効果なし
  　　Local環境からインポートした際は編集内容が反映される）



# 実施した対処
保存ボタン押下時にHTTP403(権限エラー)が表示されていたため、ロリポップサーバ内のWAF設定を一時的に解除することで編集内容の反映が可能。
（※有効にすると再度同事象が発生）
![20240325_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713493/43c05d09-eb89-a6f8-d5c8-d0a268687107.png)



# 備考
構築直後はWAFを無効にしなくても編集可能だったように思うので、厳密なエラーの原因が分からず実質的な暫定対応になります。
（HTTP → HTTPSに変更した影響かな、とは思っていますが調査途中ですので…）

推奨環境的にもあまり無効で作業したくないので、もっと別の対処が出来ればと思っています。
Maui Blazor HybridでDBマイグレーションする。

# 経緯
Maui Blazor hybrid限定なのかわからないがEntityFramework を使ったマイグレーションがうまくいかなかったため
作成日2024年3月25日

# 対象
　超初心者向け
  VisualStudio2022 + .net8　＋Mysql
　Maui Blazor hybridでEntityFramework でマイグレーションしたい人
# 内容
EntityFrameworkでマイグレーションするなんて特に難しい内容ではないはずなのだが、なぜかエラーになる。
## エラー１ Add-Migrationができない
Add-MigrationするとMacCatalystはダメといわれる。（正確なエラーメッセージは忘れた）
プロジェクトの設定でiOSを外しても消えないためcsprjファイルを編集してmaccatalystのところをコメントアウト
```<!--<TargetFrameworks>net8.0-maccatalyst</TargetFrameworks> -->```
とする。
## エラー２ Add-Migrationができない
次はUnable to create a 'DbContext' of type '' ・・・・
というエラーが出る。なんとなくDBContextが悪いのかと思うが、全く同じファイルを.net7だとマイグレーションできる。
これもcsprjファイルの `<PropertyGroup>`内に下記を追加するとエラーが出なくなる。
```<WindowsAppSdkDeploymentManagerInitialize>false</WindowsAppSdkDeploymentManagerInitialize>```

##### 感想
本当にMaui Blazor hybridを使って大丈夫かと思うようなエラーばかりでした。
まあ、マルチプラットフォームにするつもりがないのにMauiを使っている自分も良くないが、Macを手動でコメントアウトしないとEntityFrameworkが使えないというのもおかしくないか？
E資格2024#1 受験メモ

# 1. はじめに
E資格2024#1に合格しました。
勉強するうえで参考になった情報や行ったことをメモしたものです。
インプットとアウトプットに分けて記載していきます。

# 2. インプット
## 1. 認定講座
認定講座はキカガクさんの「E資格対策コース」を選択しました。

https://www.kikagaku.co.jp/

1週目は移動時間などの隙間時間で講座をただ見るだけでした。
全部見終わった後、何も頭に残っていなかったので、2週目はノートを取りながら講座を視聴しました。

問題演習をする際に認定講座を振り返るのは大変なので、簡単に振り返れるノートを取っておいてよかったと思います。

## 2. Youtube
有名ですが、データサイエンスVtuberのアイシア=ソリッド（AIcia Solid）さんの動画が非常に勉強になります。

https://www.youtube.com/@AIcia_Solid

認定講座だけでは足りない知識や深堀りできなかった内容を初心者にも分かりやすく解説されています。
自然言語処理や画像認識など、E資格の範囲を広くカバーされています。
こちらもノートを取りながら視聴しました。

## 3. 書籍
書籍はゼロ作の①を読みました。
（結局時間が無くて①の途中までしか読めていません。ある程度自然言語処理や画像認識の知識があったので何とかなりました・・・）

https://www.amazon.co.jp/dp/4873117585

実装の教材としてよく取り上げられていますが、細かい処理まで解説されているので、勉強中に生じた細かい疑問などを解消するのに役に立ちました。
細かい部分に疑問を抱くとなかなか先に進めなくなってしまう性分なので。

また、実装も理解しないといけないため、途中までですがゼロつく①のコードを写経しました。
ただ写経するだけではなく、疑問に思ったことはメモをしておき、後からノートにまとめました（特にnumpyの仕様など）。

## 4. Web記事
上3つでもE資格のシラバスすべてをカバーするのは難しいと思います。
E資格のシラバスに載っていて、聞いた覚えがない単語などは結局様々なWebページで情報を集め、ノートにまとめました。

# 3. アウトプット
## 1. 認定講座の問題演習
キカガクさんでは認定資格を得るために問題演習で満点を取る必要がありました。
この問題演習は何回も受けることができたので、認定資格を得た後も2週ほど解きました。

## 2. 黒本
E資格のメインの問題集です。

https://www.amazon.co.jp/dp/B096YB4WLQ

2024年3月21日現在、第2版が最新なので、最新のE資格のシラバスと範囲が違うということに注意は必要ですが、それでも共通する内容は多いです。

これを周回することが主なアウトプットでしたが、周回する際に過去の記録を管理するのが面倒だと思っていたところ、Excelの解答シートを公開されている方がいらっしゃいました。

https://note.com/itc_kmta/n/n5328f94554ed

このシートを使って黒本周回を記録することで苦手な分野を特定し、試験前に重点的に勉強することができました。
非常に感謝しています。

# 4. さいごに
E資格の勉強をしている中で、過去に受験された方の記事をたくさん読ませていただいたので、簡単ですが自分でもメモを残してみました。
少しでも次に受験される方の助けとなれば幸いです。
VisualforceページのDatatableのスクロールバーの自前

## 要件
VisualforceでのDatatableのスクロールバーの設定で、ヘッダーとボディーのずれがあります。
原因はヘッダーとボディーが別々のテーブルで、調整がずれある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/420cb285-3273-4d50-0aa7-6792d1eff2be.png)
 
## 対応
Datatableのスクロールバーの自前する

### ヘッダー固定

```

            table#templateSearchResultTbl thead th {
                visibility: visible;
                /* 縦スクロール時に固定する */
                position: sticky !important;
                top: -1px;
                /* tbody内のセルより手前に表示する */
                z-index: 1;
            }

            .mini-hospital{
                min-width: 120px !important;
            }
            
```

### テーブルの外DivはOverflow:autoにする

```
            div#templateSearchResultTbl_wrapper>div>div[class^="col-sm-12"][class $="col-sm-12"] {
                overflow: auto;
                width: 40vh;
                min-width:300px;
                height: 40vh;
                padding-right:0px;
            }
```

datatableの初期化にスクロールの制御を外す

```
templateSearchResultTbl = $('#templateSearchResultTbl').DataTable({
                data: dataSet,
                autoWidth: true,
                columns: [
                    { title: "{!$Label.JP_TEXT_Parent_Number}" },
                    { title: "{!$Label.JP_TEXT_Inquiry_Name}" },
                    { title: "{!$Label.JP_TEXT_Hospital}", className:"mini-hospital"},
                    { title: "{!$Label.JP_TEXT_Dealer}"},
                    { title: "{!$Label.JP_TEXT_SalesRep}"},
                    { title: "{!$Label.JP_TEXT_CreatedName}" },
                    { title: "作成日時", className:"button-column2"},
                    { title: "{!$Label.JP_TEXT_Select}"},

                ],
                oLanguage: {
                    /* 日本語化設定 */
                    sLengthMenu : "表示　_MENU_　件", // 表示行数欄(例 = 表示 10 件)
                    oPaginate : { // ページネーション欄
                        sNext : "次へ",
                        sPrevious : "前へ"
                    },
                    sInfo : "_TOTAL_ 件中 _START_件から_END_件 を表示しています", // 現在の表示欄(例 = 100 件中 20件から30件 を表示しています)
                    sSearch : "検索 ", // 検索欄(例 = 検索 --)
                    sZeroRecords : "表示するデータがありません", // 表示する行がない場合
                    sInfoEmpty : "0 件中 0件 を表示しています", // 行が表示されていない場合
                    sInfoFiltered : "全 _MAX_ 件から絞り込み" // 検索後に総件数を表示する場合
                },
                order: [[ 6, "desc" ]],
                aoColumnDefs: [
                    { bSortable: false, aTargets: [7] }
                ],
                info: false,
                searching: false,
                lengthChange: true,
                paging: true,
                retrieve: true,
                destroy:true
            });
```

## 結果
問題としてはスクロールバーがすこし外枠になっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/793c0c99-0a62-6452-6a6d-36ba1a753ce8.png)
[SwiftUI] XCTestにおけるRealmの扱い方(2パターン)

今回はXCTestにおけるRealmの扱い方について、書いていきたいと思います
現状私が知る限りでは2パターンあって、それぞれの特徴を説明して、それを踏まえどちらがおすすめかという流れで進めていこうと思います。

### 方法1: インメモリオプションを使用する
前提として、テスト実行時に毎回実稼働しているRealmに保存されるのは避けたいです。なのでベタにやるのであれば、テスト終了後に毎回データを削除しにいく手もありますが、それはかなり手間です。そんな時に便利なのがインメモリというオプションで、このオプションを付与したRealmインスタンスでデータを保存すると、データが永続化されずインスタンス解放時には自然と消えてくれます。使い方は下記の通りです。

```swift
var config = Realm.Configuration(schemaVersion: SchemaVersion.schemaVersion.rawValue)
config.inMemoryIdentifier = "inMemory"
Realm.Configuration.defaultConfiguration = config
let realm = try! Realm(configuration: config)
```

### 方法2: テスト用のRealm保存ファイルを用意する
通常Realmにデータを保存すると、default.realmというファイルに保存されます。テストの際はここに保存するのではなく、そもそも保存するファイルを分けようという考え方です。使い方は下記の通りです。

```swift
var config = Realm.Configuration(schemaVersion: SchemaVersion.schemaVersion.rawValue)
let documentDirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let path = documentDirPath[0] + "/test.realm"
let url = URL(fileURLWithPath: path)
config.fileURL = url
Realm.Configuration.defaultConfiguration = config
realm = try! Realm(configuration: config)
```
RealmファイルはDocumentsディレクトリ以下に作成されるので、そこにtest.realmというファイルを作ってこのRealmインスタンスを通して保存されたデータはtest.realmに保存されます。

### どちらを使うべきか?
テストのケースにもよりますが、「方法2」を個人的にはおすすめします。
理由としては、主に下記の2点からです。
### ① Realmインスタンスをテスト対象のファイルに渡す必要がない
インメモリオプションを使用する場合、そのオプションをつけた同一のRealmインスタンスをテストファイル側とテスト対象のファイル側双方で使い回す必要があります。双方で別々のインスタンスを立てて、インメモリオプションをつけてデータを保存してもあくまで保存されるのはそれぞれのインスタンス内に一時的である為、テスト対象のファイル側でRealmにデータを保存してもテストファイル側でそれをアサートすることはできないのです。なのでインメモリオプションを使用する場合は、テストファイル側でオプションをつけたRealmインスタンスを作成して、テスト対象のファイルに渡す必要があります。方法2であれば別々のインスタンスで保存しようと、保存先は作成した共通のファイルになるので、テストファイル側も気にせずそのファイルからアサートを書くことができます。

### ② スレッド跨ぎで更新を行う場合、インメモリオプションでは対応できない
上記の続きでじゃあテストファイルから渡すようにすれば良いじゃんと思うかもしれませんが、下記のようなケースの場合それも難しくなります。

```swift
let realm = "テストファイル側から渡されたメインスレッドで生成されたインスタンス"
DispatchQueue.global().async {
  realm.write {} // Realm accessed from incorrect thread.
}
```
Realmインスタンスは生成時のスレッドと更新する際のスレッドを一致させる必要があります。上記の場合はメインスレッドで生成したインスタンスをバックグラウンドスレッドで使用してエラーになっている為、エラーを回避する為には再度バックグラウンドスレッド内で新しくインスタンスを生成させる必要があります。
ただしその場合、上記で説明した通り同じインスタンス内で保存する必要があるので、インメモリオプションを使うことは難しくなります。(※もし回避方法があれば教えてください!)

上記の理由から方法2の方が何かと悩まずに、使いやすいかなと思います

## 終わりに
以上がXCTestにおけるRealmの取り扱い方です。XCTestを書くにあたってRealmの扱い方をどうしようかと一通り試行錯誤した結果上記の結論に至りました。ぜひXCTestを書く際の参考にして頂ければと思います。この他にも最適な方法がありましたら、ぜひ共有して頂けるとありがたいです!