OmniAICreator/Qiita-1.07M huggingface dataset:
rex0220 一括更新プラグイン ユーザー選択にゲストユーザーを設定

[rex0220 一括更新プラグイン](https://qiita.com/rex0220/items/f90ca06fde6b6e362583)で、ユーザー選択にゲストユーザーを設定する例です。

# 概要

一括更新画面で、ユーザー選択項目にゲストユーザーを指定します。
オプション指定で、ユーザーの選択肢を制限することもできます。
※一括更新プラグイン Ver.9 で、ゲストユーザー指定に対応

ログインユーザーがゲストユーザーの場合、一括更新でユーザー選択・組織選択・グループ選択の項目を更新できません。
※ゲストユーザー認証で、ユーザー関連の REST API を利用できないため。

![2024-06-01_12h47_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f0547dfd-300e-8df1-5c9e-ab303c1e9467.png)

# 操作例

![2024-06-01_13h10_03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d7cdd027-83b5-265f-64ae-c80a41d23229.gif)

# 一括更新の操作
- 対象レコードを選択
![2024-06-01_12h46_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c740ae45-b34d-778d-caf8-affe5649e48c.png)

- 一括更新のボタンクリックで、一括更新ダイアログ表示
![2024-06-01_12h47_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bb375bae-e17f-052c-bd16-337acae684a6.png)

- ユーザーを選択
![2024-06-01_12h47_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c48ad113-d4d8-3ea6-4ce1-24a0809ee6e7.png)

- 「次へ」ボタンクリックで、確認画面へ
![2024-06-01_12h48_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/29464777-9efd-72a9-612b-83294a2b6fa5.png)

- 「更新」ボタンクリック
![2024-06-01_12h48_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/dcb11ea2-3362-455c-da4b-f5ad015b3651.png)

- 更新結果確認
![2024-06-01_12h48_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f3584b82-f256-3fca-09a7-c0c0995a2465.png)

- 一括更新後の一覧画面で、ユーザー選択項目を確認
![2024-06-01_12h49_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7b84d28b-f19f-b070-da9a-e5f4ed013c14.png)


# 一括更新プラグイン設定

ゲストユーザーの設定と更新対象項目の設定を行います。
ゲストスペースにおいて、ゲストユーザーを権限やユーザー選択項目に指定する場合は、プラグイン設定でゲストユーザーの登録が必要です。
※REST API でゲストユーザーを取得できないため、マニュアルメンテが必要

- ゲストユーザーの設定
- 更新対象項目の設定

![2024-06-01_12h57_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2743e1a3-db72-7a6b-83ef-16b029a96e9a.png)


## ゲストユーザーの設定

ゲストユーザーの管理画面から、ゲストユーザーをコピペします。
一括更新プラグインで、利用するゲストユーザーを有効にします。


- クリア：　すべてのゲストユーザーを削除
- リセットID：　現在の並び順で、ID を振りなおす
    - ID の順番に、ゲストユーザーの選択肢に表示される
- ＋：　1行追加

![2024-06-01_12h11_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/eb018d68-e274-3cb7-7d6a-d756a12ea061.png)

## 更新対象項目の設定

更新対象項目とオプションを指定します。
ユーザー選択項目に、オプションをしていすることで、一括更新時に選択できるユーザーを限定することができます。

![2024-06-01_13h03_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8a0cb982-7c46-5c7a-d2a9-77bb3d0c5741.png)
[初級] C++: クラスの基本 - 特殊メンバ関数

C++ のクラスの基礎
デフォルトコンストラクタ、デストラクタ
コピーコンストラクタ、コピー代入演算子
ムーブコンストラクタ、ムーブ代入演算子

:::note info
本記事の前提条件は以下の通りです。
* 初心者向け
* とは言っても、何らかのプログラムはそれなりに書けるけど、C とか C++ はちょっと、という人向け
* ざっくり概要しか説明しないので細かいことは気にしないでいただきたい
* Visual Studio 2013 くらい～
* Windowsプログラム (CUI, GUI)
* コードの検証
    * 開発環境: Visual Studio 2022, x64, Release ビルド
    * 実行環境: Windows 10
:::

:::note info
* 本記事は上から順番に読む前提となっている
:::

:::note info
* 「Windowsプログラム (CUI, GUI)」と書いてあるが、本記事の内容だとどの OS でもほぼ同じ
:::

:::note info
前提知識として必要と思われる情報
* [[初級] C++: クラスの基本 - 拙著](https://qiita.com/yasu62347/items/f544e486ea2cc1965c95)
:::

:::note info
ムーブコンストラクタとムーブ代入演算子については、コンパイラのバージョンによっていろいろと挙動が変わっているので注意が必要。
あと、ムーブコンストラクタとムーブ代入演算子については、本記事では特に詳細な説明はしないのであしからず。
:::

# 特殊メンバ関数
例えばこんなクラスを作ったとする。
```cpp
class DoNothing
{
};
```

普通に使うことはできる（なにも起こらないので意味はないが...）。
```cpp
DoNothing doNothing;
DoNothing doNothing2 = doNothing;
```

実はこの時、コンパイラはいくつかのメンバ関数を勝手に作っている（かもしれない）。
対象となるメンバ関数は以下の通り。

* デフォルトコンストラクタ
* デストラクタ
* コピーコンストラクタ
* コピー代入演算子
* ムーブコンストラクタ
* ムーブ代入演算子

```cpp
// デフォルトコンストラクタ
DoNothing();
// デストラクタ
~DoNothing();
// コピーコンストラクタ
DoNothing(const DoNothing& src);
// コピー代入演算子
DoNothing& operator=(const DoNothing& src);
// ムーブコンストラクタ
DoNothing(DoNothing&& src) noexcept;
// ムーブ代入演算子
DoNothing& operator=(DoNothing&& src) noexcept;
```

これらがないと、上記のプログラムは動かない。というかそもそもコンパイルできない。

:::note info
ムーブコンストラクタとムーブ代入演算子については、本記事ではこれ以上の説明はしないのであしからず。
:::

# デフォルトコンストラクタ
引数なしでクラスオブジェクトが構築されるときに呼ばれる。
したがって、
```cpp
DoNothing doNothing;
```
と書いた時点でデフォルトコンストラクタが呼ばれる。

# デストラクタ
クラスオブジェクトが解放されるときに呼ばれる。
したがって、
```cpp
DoNothing doNothing;
```
のスコープが外れるときに呼ばれる。

# コピーコンストラクタ
コピー初期化されるとき。
```cpp
DoNothing doNothing2 = doNothing;
```

# コピー代入演算子
代入演算子で代入されるとき。
```cpp
DoNothing doNothing;
DoNothing doNothing2;
doNothing2 = doNothing;
```

# 特殊メンバ関数の暗黙的な定義について
特殊メンバ関数が暗黙的に定義されるかどうかについては、いろいろとややこしい条件がある。
例えば、コピーコンストラクタが明示的に定義されていた場合は、デフォルトコンストラクタは暗黙的には定義されない、など。
（詳細についてはここでは説明しないが、コンパイラの気持ちになってよく考えればわかるかも？）
暗黙的に定義されない場合は、明示的に定義するか、明示的なデフォルト定義を行う必要がある。

```cpp
// 明示的な定義の例
class DoNothing
{
public:
    DoNothing()
    {
        // オブジェクトの初期化に必要な処理
    }
    ~DoNothing()
    {
        // オブジェクトの解放に必要な処理
    }
    DoNothing(const DoNothing& src)
    {
        // オブジェクトのコピーに必要な処理
    }
    DoNothing& operator=(const DoNothing& src)
    {
        // オブジェクトのコピーに必要な処理
    }
};
```

```cpp
// 明示的なデフォルト定義の例
class DoNothing
{
public:
    DoNothing() = default;
    ~DoNothing() = default;
    DoNothing(const DoNothing& src) = default;
    DoNothing& operator=(const DoNothing& src) = default;
};
```

以上。
[初級] C++: クラスの基本

C++ のクラスの基礎の基礎
class

:::note info
本記事の前提条件は以下の通りです。
* 初心者向け
* とは言っても、何らかのプログラムはそれなりに書けるけど、C とか C++ はちょっと、という人向け
* ざっくり概要しか説明しないので細かいことは気にしないでいただきたい
* Visual Studio 2013 くらい～
* Windowsプログラム (CUI, GUI)
* コードの検証
    * 開発環境: Visual Studio 2022, x64, Release ビルド
    * 実行環境: Windows 10
:::

:::note info
* 本記事は上から順番に読む前提となっている
:::

:::note info
* 「Windowsプログラム (CUI, GUI)」と書いてあるが、本記事の内容だとどの OS でもほぼ同じ
:::

# クラスとは
ざっくり言うと、データと、関連する処理をまとめたものである。

例えば足し算をする場合、クラスを使わないとこのようになる。
```cpp
int Add(int augend, int addend)
{
    return augend + addend;
}
int Subtract(int minuend, int subtrahend)
{
    return minuend - subtrahend;
}

int value = 0;
// -> value: 0
value = Add(value, 3);
// -> value: 3
value = Subtract(value, 1);
// -> value: 2
```

クラスを使うとこのようになる。
```cpp
class IntCalc
{
public:
    int value = 0;
    void Add(int addend)
    {
        value += addend;
    }
    void Subtract(int subtrahend)
    {
        value -= subtrahend;
    }
};

IntCalc calc;
// -> calc.value: 0
calc.Add(3);
// -> calc.value: 3
calc.Subtract(1);
// -> calc.value: 2
```

データ (`value`) と処理 (`Add`, `Subtract`) の関係がすっきりした。
引数も減ったし、戻り値もなくなったのでコーディングミスも少なくなりそうだ。

以上！
絵文字を一文字ずつ処理する方法

# 結論
[emojiモジュール](https://pypi.org/project/emoji/)を使うと、できます。
```python
import emoji
text="👧🏻"
emoji.replace_emoji(text,replace=lambda e, data_dict:print(e,end=" "))
# 👧🏻
```
# 解説

一般的に、Pythonで一文字ずつ処理したい場合、これでいけます。
```python
text="ABCD"
[print(e,end=" ") for e in list(text)]
#A B C D
```
しかし、ZWJ emojiが含まれている状態で行うとうまくいきません。
```python
text="👧🏻"
[print(e,end=" ") for e in list(text)]
# 👧 🏻
```

## 参考
https://carpedm20.github.io/emoji/docs/#non-rgi-zwj-emoji
決定的意思決定モデルを確率的意思決定モデルに変換：ε-greedy method

### 方法
```math
\pi_{b}\big(a|U_{i}\big)
```
$\pi_{b}$はポリシー
$U_{i}$はあるユーザーiの属性情報などが入ったベクトル
$a$はポリシーに$U_{i}$を与えた時にポリシーが出力する行動選択


上記を確率的意思決定モデルに変換する


```math
\pi_{\epsilon}\big(a|U_{i}\big) = \epsilon * \pi_{random}\big(a|U_{i}\big) + \big(1-\epsilon\big)*\pi_{b}\big(a|U_{i}\big)
```

$\epsilon$は任意の確率。
上記は確率$\epsilon$でランダムに行動選択し、$1 - \epsilon$で最適化したポリシーから行動選択するモデルである。


### 確率的意思決定モデルを利用することのメリット
・行動選択の確率を保存しておけば、IPWなどを用い全データを次のモデル学習に利用できる。

・次回モデルの学習の布石として、ランダムに選択したユーザー群を作って、それを施作に組み込むことがある。施作終了後そのわずかなランダムで選択したユーザー群のみで学習させるなくてもよくなる。


### 参考文献
https://deus-ex-machina-ism.com/?p=58448#:~:text=%CE%B5%2D%E3%82%B0%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E6%B3%95%EF%BC%88%CE%B5%2Dgreedy%EF%BC%89%E3%81%AF%E3%80%81%E5%BC%B7%E5%8C%96,%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A8%E3%81%AA%E3%82%8B%E3%80%82

https://web.archive.org/web/20220809194900id_/https://www.jstage.jst.go.jp/article/jjsai/35/4/35_517/_pdf

施策デザインのための機械学習入門〜データ分析技術のビジネス活用における正しい考え方：

https://www.amazon.co.jp/%E6%96%BD%E7%AD%96%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80%E3%80%9C%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E6%8A%80%E8%A1%93%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E6%B4%BB%E7%94%A8%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%AD%A3%E3%81%97%E3%81%84%E8%80%83%E3%81%88%E6%96%B9-%E9%BD%8B%E8%97%A4-%E5%84%AA%E5%A4%AA/dp/4297122243/ref=sr_1_fkmr1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3EVQW21SRLPOW&dib=eyJ2IjoiMSJ9.azgi9JWSWVU6rQZw369z8gUGQUIIPdBmjv5U8PV4BPTpinq-t0iWGJAbRZFnyTjmDum9pRNGemESjg48G1NLILDp9A4oirRQsIQgoullt644wlaAwR7gCFPgw34t6VW5.zDed0aytVshR2QQjjR7BfAiF9KNJChpjz842csyuM0s&dib_tag=se&keywords=%E6%96%BD%E4%BD%9C%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92&qid=1717207704&sprefix=%E6%96%BD%E4%BD%9C%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%2Caps%2C186&sr=8-1-fkmr1
【ChatGPT＋DALL-E3】鉛筆画を描こう。


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

　今回は、鉛筆画を描こう、というお話です。カーブミラー企画のテーマになります。

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

　まずは、ニュース、ではなくて
　　GPT-4oのデータ分析について
　　　記事がありましたので、ご紹介。
[ChatGPT新データ分析機能](https://note.com/it_navi/n/nfab00cb42254#3419cc51-6b14-4932-8398-0c14ed49d043)
***
　次は、
　　Code Interpreterで
　　　グラフなどを出すと
　　　　日本語が文字化けして
　　　　　しまいます。

　　以前であれば、
　　　フォントのアップロードが
　　　　必要でした。

　　それが一部のグラフでは
　　　必要ないことが
　　　　わかりました。

　　下記のポストが、
　　　そのテスト結果です。

　　Hiroya Iizukaさん、
　　　ありがとうございます🙇
[日本語文字化け問題の行方](https://x.com/0317_hiroya/status/1796476206826897454?t=X0XbiEtDXHRKUndLPX-U9w&s=03)
***
　ニュースはないので、
　　さっそく、本題です。

　昨日から日曜日までの
　　三日間（2024/05/31〜06/02）
　　　カーブミラー企画を
　　　　実施しています。

　今回は、
　　『#AI鉛筆画』と題したもの。

　鉛筆で絵を描くものです。

　もちろん、
　　画像生成AIでのお話です。

　やり取りをどうぞ。
***
***user***
若い女性が森の中を歩いている。正方形で描画

***ChatGPT***
![1717212891153.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/0244f0eb-f46a-b4f9-d41b-928e25ea3297.jpeg)

***user***
色鉛筆スタイルにして

***ChatGPT***
![1717212912517.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/28fd9d0e-c2a6-094d-95b3-ed77bd6628db.jpeg)

***user***
リアルすぎるので、雑さを出して

***ChatGPT***
![1717212933794.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/7c46b251-a219-db6a-4f06-f2ab144984e1.jpeg)

***user***
もう少しラフな感じで

***ChatGPT***
![1717212942361.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/c6e49dbe-b6d9-c4f3-fdc9-f17abd1e9545.jpeg)

***user***
さらにラフにして

***ChatGPT***
![1717212951649.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/80dcada3-6191-f45c-153d-e6235997716e.jpeg)

***user***
それぞれの画像スタイルを教えてください

***ChatGPT***
以下のようにそれぞれの画像スタイルが異なります：

1. 最初の画像は、通常の色鉛筆スタイルで、自然の静けさと探索の美しさを表現しています。
2. 次に、もう少し明確な色鉛筆スタイルで、色とテクスチャの筆遣いが強調されています。
3. その後、さらにラフなタッチの色鉛筆スタイルで、もっとスケッチ風に描かれています。
4. 最後の画像は、非常にラフで抽象的な色鉛筆スタイルで、詳細が最小限に抑えられ、生のエネルギーに焦点を当てています。

各画像は、スタイルが徐々に抽象的でラフになるように調整されています。

***user***
指示するならば、なんと言えば？

***ChatGPT***
画像のスタイルを指示する際には、以下のような表現が適しています：

1. 「通常の色鉛筆スタイルで、自然の静けさと探索の美しさを表現してください。」
2. 「色鉛筆スタイルで、色とテクスチャの筆遣いを強調してください。」
3. 「色鉛筆スタイルで、さらにラフなタッチとスケッチ風に描いてください。」
4. 「非常にラフで抽象的な色鉛筆スタイルで、詳細を最小限に抑え、生のエネルギーに焦点を当ててください。」

これらの指示を用いて、望むスタイルの画像を具体的に依頼することができます。

***user***
新たな依頼です。
若い日本人女性。非常にラフで抽象的な色鉛筆スタイル。正方形で描画

***ChatGPT***
![1717212960813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/43f896b8-ec79-9df8-893d-94d4811c725b.jpeg)
***

　こんな感じですかね。

　ちなみに、
　　今回は色鉛筆スタイルでしたが、
　　　鉛筆画ならば、
　　　　そう指定すれば
　　　　　行けます。

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

　今回は、ここまで。
AWS Certified Solutions Architect - Professional(SAP-C02) を取得しました

# 初めに
AWS Certified Solutions Architect - Professional(SAP-C02)(https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/) を受験して合格しました。
これから試験を受験される方の参考になれば幸いです。

# プロフィール
- ITエンジニア歴：9年
- AWS歴：3年
- Azure歴：1年
- 取得資格
    - IPA：SA, DB, SC
    - AWS：DVA（期限切れ）, SAA(C02), SCS(C01)
    - Azure：AZ-500

AWSは期限切れだったり更改前の試験だったりしたので、ちゃんと現行版の試験を受けようということでSAPに挑戦。

# 学習方法
3つのコンテンツで学習。といっても主に学習に使っていたのはCloudLicenseでした。

1. CloudLicense
1. Udemy
1. AWS 公式模試

## 1. [CloudLicense](https://cloud-license.com/)
CloudLicenseの有料プラン（プロフェッショナル）に加入。5,000円かかるけど問題の量と質はかなり良く、実質ここでの勉強だけで十分賄えました。一問一答形式で学習可能かつ問題セットが7問1セットで区切りをつけやすかったため、継続して学習できました。また解説が丁寧で分かりやすく、単なる試験対策で終わることもなかったように思えます。

## 2. [Udemy Practice Exam AWS Certified Solutions Architect Professional](https://www.udemy.com/course/practice-exam-aws-certified-solutions-architect-professional)
SCSの学習時お世話になったStephane MaarekのSAP用模擬試験。30問+75問+75問の3セット。CloudLicense慣れをしてしまわないようにUdemyの模試を購入しましたが、1回のボリュームが多い & 問題の難易度が高い（レビューコメントにも難しいと散見されてました）ため、あまり役立てられませんでした。「学習を十分にしたから腕試しをしたい！」という人ならおすすめです。

## 3. AWS 公式模試
AWS Skill Builderで受講可能な公式模試。20問1セットなので、学習というよりAWS試験の文章に慣れるための教材でした。

## 試験までの学習
学習期間は2ヶ月ほど。学習教材はほとんどCloudLicenseでした。各教材の学習量と正解率は大体こんな感じです。

- CloudLicense：40セットほど + 模擬試験モードを実施。正答率は60%～65%くらい
- Udemy：30問 + 75問 + 75問を1周。正解率はどれも56%
- AWS 公式模試：試験1週間前に1回受験。正解率は75%

# 試験について
春に受験料が値上がりした結果、1回4万円。半額バウチャー使っても高く感じますね（涙）
試験会場はピアソンのテストセンターを予約。秋葉原の会場は1週間前の予約でもそこそこ席数が空いていました。
SAPの試験時間は3時間と長丁場のため、集中力を保てる方法を考えおくとよさそうです。私は半分解いた段階で3分ほど小休憩を取りました。
130分くらいで解き終わり、見直しフラグの問題を確認し、試験終了して退出。


# 結果
試験結果は当日の19時くらいに通知。
842点で無事合格していました :tada:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296651/c56fae1b-f3ba-8355-abdb-42d0acd0e0a7.png)
各セクションのコアコンピテンシーも満たせていました :clap:

(余談)
SCSを受験したときは翌日の夜に結果が届きました。SAPは午前受験、SCSは午後受験だったので、早く結果が欲しい場合には午前試験開始にすると良さげ（？）

# 感想
AWSのプロフェショナル領域の試験を無事に突破できて、とても嬉しいです。
SAPの学習を進めると「AWSのサービスにこんな機能があったのか」と驚きが多く、知見の拡大にとても役立ちました。
また、学習の中で前回受けたSCSの知識が結構役に立っていたと思います。AWSの試験難易度的には
> DVA < SAA <<(壁)<< SCS≒SAP 

という印象でした。SAPの試験でもDeveloper領域っぽい試験が出てきたりしたので、プロフェッショナル領域は問題が一部重複しているのかもしれません。

以上、AWS SAPの感想でした。
chatGPTのプログラミング質問回答は52%が誤り

タイトルは以下の論文
https://arxiv.org/abs/2308.02312
の調査結果です。

## 要約の要約

StackOverflowで517のサンプルでChatGPTのプログラミングに関する質問回答は​
・52%は誤情報
・78%は人間の解答と矛盾​
・35%が包括性にかけ​
・77%が冗長、無関係、不要なコードが入っている
そして、39%の人が誤情報に気づかずAIの回答をそのまま使ってしまっている。

----

論文要約。文中のSOとはStackOverflowのこと。

## 概要

1. **研究の背景**：
   - プログラマーはAPIの学習、バグの修正、コードや概念の理解などのためにオンラインリソースを頻繁に利用します。これにはSOのようなコミュニティQ&Aプラットフォームが含まれます。
   - 最近のLLM（大規模言語モデル）の登場により、プログラマーのオンライン支援行動が変わりつつあります。特に、2022年11月にリリースされたChatGPTは多くの注目を集めています。
   - ChatGPTの人気にもかかわらず、そのプログラミング質問に対する回答の特徴を評価する包括的な研究は行われていませんでした。

2. **研究方法**：
   - SOに投稿された517のプログラミング質問に対するChatGPTの回答を収集し、手動で分析しました。
   - ChatGPTの回答の正確性、一貫性、包括性、簡潔さを評価し、SOの人間の回答と比較しました。
   - 大規模な言語分析およびユーザー調査を実施し、ChatGPTの回答の言語的特徴とユーザーの評価を理解しました。

3. **主な結果**：
   - ChatGPTの回答の52%には誤情報が含まれており、77%が冗長です。
   - ユーザー調査の参加者は、包括性とよく整った言語スタイルのために、回答の35%のケースでChatGPTの回答を好みましたが、回答の39%のケースで誤情報を見逃しました。
   - ChatGPTの回答は、人間の回答に比べて形式的で分析的な言語を使用し、ポジティブな感情をより多く含んでいます。

4. **結論**：
   - ChatGPTは多くのケースで優れたパフォーマンスを発揮する一方で、頻繁にエラーを犯し、不要に長い回答を生成します。
   - ChatGPTの回答には豊富な言語的特徴があり、ユーザーは時折その誤りや不整合を見逃すことがあります。
   - この研究は、プログラミングにおけるChatGPTの使用に関連する課題とリスクを示し、AI支援プログラミングのための新しいインタラクションと計算方法の設計の機会を強調しています。

## 調査結果の概要

1. **ChatGPTの回答の正確性と品質**：
   - **正確性**：ChatGPTの回答の52%には誤情報が含まれています。
   - **一貫性**：78%の回答が人間の回答と一貫していません。
   - **包括性**：ChatGPTの回答の65%は包括的ですが、35%は不十分です。
   - **簡潔さ**：77%の回答が冗長です。

2. **誤りの内訳**：
   - **概念的誤り**：54%
   - **事実的誤り**：36%
   - **コードの誤り**：28%
     - 内訳：誤ったロジック（48%）、誤ったAPI/ライブラリ/関数の使用（39%）、不完全なコード（11%）、文法エラー（2%）
   - **用語の誤り**：12%

3. **質問の種類による影響**：
   - **質問の人気度**：人気のある質問や古い質問に対する回答は、他の質問に比べて誤りが少ない。
   - **質問の種類**：デバッグに関する質問は、他の質問に比べて一貫性が低いが、冗長性は少ない。

4. **言語的特徴**：
   - ChatGPTの回答は、より分析的で自信に満ちた言語スタイルを持ち、ポジティブな感情をより多く含んでいます。
   - 人間の回答は、より即興的で個人的な観察や洞察が多く含まれます。

5. **感情分析**：
   - ChatGPTの回答の85.35%がポジティブな感情を示し、1%未満がネガティブな感情を示しています。
   - 人間の回答の73.30%がポジティブな感情を示し、1.05%がネガティブな感情を示しています。

6. **ユーザー調査結果**：
   - ユーザーはChatGPTの回答を34.82%のケースで好みましたが、そのうち77.27%は誤情報を含んでいました。
   - ユーザーは正確性、簡潔さ、有用性の面で人間の回答をChatGPTの回答よりも高く評価しました。

これらの結果は、ChatGPTが多くのケースで優れたパフォーマンスを発揮する一方で、頻繁にエラーを犯し、冗長な回答を生成することを示しています。ユーザーはChatGPTの包括的で整った言語スタイルを評価する一方で、誤情報を見逃すことが多いという課題が明らかになりました。

---

## エビデンスなしの無責任な感想

体感でもそのくらいかなぁと思う。
正常系しか必要ないコードの場合はかなりの精度で仕事をしてくれると思う。（たまにハルシネーションするがそれは時間の問題で改善していくと思う。）

しかしながら準正常系などは人間がフィードバックを与えたり、こっちで手直ししたりしないと動かないことが多い。

この論文で出てきた数値達は今後のAIの進化である程度までは改善してくると思うが、どこかで頭打ちにはなると考える
それはAIの問題というよりは人間の指示の限界の問題だと思う。

AIが人間の仕事を完全補完して奪うのではなく、AIと協働できる人間が仕事を奪っていく。これに尽きる。
Salesforceリストビューにカスタムボタンを表示させよう

本橋孝昭です

今回はSalesforceリストビューにボタンを表示させる方法を紹介します

今回は例として商談に特定のダッシュボードフォルダに遷移するボタンをリストビューに設定する方法をお伝えします

今回の内容は動画でも公開しています

https://youtu.be/lDYdLAG-6lw?si=m8bj0C0xh4GJgTOS

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

このように「フォルダー移動」ボタンをクリックし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c96c8ab7-25e9-c214-e026-26f3b16d870f.png)

ダッシュボードフォルダに遷移します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5482aecb-9fad-c635-1da8-1e8c82926df0.png)


## ステップ1 ダッシュボードフォルダのURLを取得しよう


ダッシュボードフォルダのURLを確認します

今回のURLは
https://wise-moose-uij26h-dev-ed.trailblaze.lightning.force.com/lightning/r/Folder/00lGA00000282aNYAQ/view?queryScope=userFolders
です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5482aecb-9fad-c635-1da8-1e8c82926df0.png)



## ステップ2 商談オブジェクトのリストボタンを作成しよう

商談オブジェクトからリストボタンを作成します


先ほどのダッシュボードフォルダのURLを元に数式は以下のように設定します

/lightning/r/Folder/00lGA00000282aNYAQ/view?queryScope=userFolders


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0ece3602-3653-cec1-edcf-96b62025e3f3.png)

## ステップ3 商談のリストビューの設定変更を行う


「選択したボタン」に先ほど作成したボタンを表示させて保存をします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/18f7db3f-c973-4c44-019e-2a2500e7d5d4.png)


これで商談のリストビューに表示をさせることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c96c8ab7-25e9-c214-e026-26f3b16d870f.png)
初投稿とQiitaを選らんだ理由

# 目次
- [初めての投稿](#初めての投稿)
- [普段の活動](#普段の活動)
- [Qiitaを選んだ理由](#Qiitaを選んだ理由)

---

## 初めての投稿
おはようございます、Qiitaの皆さん！ついに、一昨日Qiitaに登録してから初投稿です🎉。何を書けばいいのか全くわからないので、まずはテスト感覚で始めてみます。今回は、なぜQiitaを始めようと思ったのか、そのきっかけについてお話しします。

## 普段の活動
私はエンジニアですが、実はアプリ開発の経験はほとんどありません。でも、何か自分で作ってみたいという気持ちが昔から強く、半年前からFlutterを使ったアプリ開発を始めました。とはいえ、プログラムに関する知識はほぼゼロからのスタートで、独学でなんとか勉強を進めてきました。

そして、なんとかして初めて作ったアプリのダウンロード数は...なんと"5"! しかも、全て身内だけでした😂。

## Qiitaを選んだ理由
そこで考えたのが、アプリの内容改善だけではなく、もっと知名度を上げる方法はないかということでした。アプリが無名すぎて見つけてもらえないのも一因だろうと感じ、Qiitaで記事を書いて知名度を少しでも上げてみようと思ったのです。

大学での研究で調べ物をする際にも、Qiitaの記事にはよくお世話になっていたので、名前も知っていました。だからこそ、記事を書くことに抵抗はありませんでした。しかし、最大の理由は「無料」であることです。他のプラットフォームで記事を書こうとすると、初期費用がかかることが多く、その費用を賄える自信も勇気もありませんでした。

その点、Qiitaは馴染みがある上に無料で使えるので、記事を書き始めるには最適だと思いました。エンジニアとしての知見も広まるし、一石二鳥ですね。

以下にざっくりとQiitaと他のブログとの差を表にしてまとめてみました。

![スクリーンショット 2024-06-01 12.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804252/822fec00-bd0b-09ef-82be-92f1f51c7928.png)

---

これからもどうぞよろしくお願いします！👋
RHEL サブスクリプション設定メモ

# アクティベーション

```bash
subscription-manager register
```
IDとパスワードを入力

# 設定とかを見る

```bash
subscription-manager status
subscription-manager list
```

# 保守作業を怠った場合

保守作業を行っていないと、「NetworkException: Network error code: 400」が表示される。  
データをクリーンアップして古い証明書と破損したデータをいったん消去します。  

```bash
subscription-manager clean
subscription-manager register 
subscription-manager attach --auto
```

# プロキシ認証とかが必要な場合

## `/etc/rhsm/rhsm.conf`に直接記入

```:/etc/rhsm/rhsm.conf
proxy_hostname = <proxy_ip>
proxy_port = <proxy_port>
proxy_user = <proxy_user> # basic http proxy auth
proxy_password = <proxy_password> # basic http proxy auth

# SSLサーバー証明書を追加しなくてはいけない特殊なネットワークの場合
# 下記のpem形式のファイルにpem形式に変換したSSLサーバー証明書を追記
# (あるいはそのファイルをコピーして追記し、そのファイル名に変更する。)

# Server CA certificate location:
ca_cert_dir = /etc/rhsm/ca/

# Default CA cert to use when generating yum repo configs:
repo_ca_cert = %(ca_cert_dir)sredhat-uep.pem
```

## `subscription-manager config`で書き換える

```bash
subscription-manager config \
--server.proxy_hostname=SERVER.PROXY_HOSTNAME \
--server.proxy_port=SERVER.PROXY_PORT \
--server.proxy_user=SERVER.PROXY_USER \
--server.proxy_password=SERVER.PROXY_PASSWORD \
--rhsm.ca_cert_dir=RHSM.CA_CERT_DIR \
--rhsm.repo_ca_cert=RHSM.REPO_CA_CERT
```
Laravelでのデータ分析機能実装：SQL vs ORMのメリットとデメリット

## はじめに

Laravelを使った開発の中で、データ分析機能のコードレビュー時に、データ取得と計算をSQLでするのかORM（Eloquent）でするのか議論になったことがありました。
そこで感じた各メリットでメリットを紹介していきたいと思います！

## 前提条件
### サンプルの条件

**前提：ECサイトの売上分析**

1. **データベース構造**
    - **products** テーブル
        - `id`: 製品ID
        - `name`: 製品名
        - `price`: 製品価格
    - **sales** テーブル
        - `id`: 売上ID
        - `product_id`: 製品ID（`products` テーブルとの外部キー）
        - `quantity`: 売上数量
        - `total_price`: 売上総額
        - `sold_at`: 売上日時

2. **取得したい情報**
    - 各製品の月別売上集計（売上数量と売上総額）
    - 各製品の平均販売価格
    - 特定の期間内の売上データ

3. **使用するツール**
    - **データベース**: MySQL
    - **フレームワーク**: Laravel


## 1. SQLでの計算とデータ取得

### 1.1 メリット

- **パフォーマンスの向上**
  - 大量データの処理が速い
  - ネットワークトラフィックの削減

- **複雑なクエリの柔軟性**
  - 高度な集計や結合の容易さ

### 1.2 デメリット

- **SQLの学習コスト**
  - 複雑なSQLを書くための知識が必要

- **データベース依存性**
  - DBMS特有の機能や文法に依存しがち

### 1.3 具体例

#### サンプルクエリとその解説
```sql
SELECT
  product_id,
  MONTH(sold_at) AS sale_month,
  SUM(quantity) AS total_quantity,
  SUM(total_price) AS total_sales,
  AVG(total_price / quantity) AS average_price
FROM
  sales
WHERE
  sold_at BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY
  product_id, sale_month
ORDER BY
  product_id, sale_month;
```

## 2. ORM（Eloquent）を使用したデータ取得と計算

### 2.1 メリット

- **コードの可読性と保守性**
  - Laravelのコードベースに統一感が生まれる
  - 直感的なオブジェクト指向の操作が可能

- **フレームワークの機能を活用できる**
  - 関係性の管理やデータの操作が簡単
  - バリデーションやイベント、ミドルウェアなどのLaravelの他の機能との統合が容易

- **簡単なスタートアップ**
  - Laravelに標準で組み込まれているため、セットアップが簡単
  - 簡単にデータのリレーションを定義できる
  - デバッグで、どこが間違っているのかの調査が簡単

### 2.2 デメリット

- **パフォーマンスの問題**
  - 大量データ処理での速度低下
  - メモリ使用量の増加

- **複雑なクエリの困難さ**
  - 複雑なデータ取得は困難になる
  - N+1問題などのパフォーマンスに関する課題が発生しやすい


### 2.3 具体例

#### Eloquentを使ったサンプルコードとその解説
```php
use Carbon\Carbon;
use App\Models\Product;
use App\Models\Sale;

$startDate = Carbon::parse('2023-01-01');
$endDate = Carbon::parse('2023-12-31');

$products = Product::with(['sales' => function ($query) use ($startDate, $endDate) {
    $query->whereBetween('sold_at', [$startDate, $endDate])
          ->selectRaw('product_id, MONTH(sold_at) as sale_month, SUM(quantity) as total_quantity, SUM(total_price) as total_sales, AVG(total_price / quantity) as average_price')
          ->groupBy('product_id', 'sale_month');
}])->get();

foreach ($products as $product) {
    foreach ($product->sales as $sale) {
        echo "Product: {$product->name}, Month: {$sale->sale_month}, Total Quantity: {$sale->total_quantity}, Total Sales: {$sale->total_sales}, Average Price: {$sale->average_price}\n";
    }
}
```

## 3. どちらを使うかの判断基準

### 3.1 小規模データ vs 大規模データ
- 小規模データ処理には、Eloquentを使用することで開発の効率する
- 大規模データ処理には、SQLを使用することでパフォーマンスが向上する

### 3.2 開発チームのスキルセット
- SQLに精通しているチームの場合、SQLを使った方が効率的
- Laravel/Eloquentに慣れているチームの場合、Eloquentを使った方が開発がスムーズ


## 4. 終わりに
自分は、SQLでのデータ取得が苦手なのでORMを使うことがほとんですが、SQLで取得した方がパフォーマンスの向上にもなるので次回データ分析機能を実装するときはSQLでの取得をしてみたいと思っています！


## 一緒に働く仲間を募集しています！
株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています！

事業拡大に伴い、エンジニアを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/companies/cnctor/projects
Kotlin2.0で向上したスマートキャストについて

## 概要

Kotlin2.0からスマートキャストが向上したことにより、いくつか変更されたので紹介します。

## 変更されたこと

### ifスコープ外で評価した結果を使用したスマートキャスト

``` Sample.kt
sealed interface State {
    data object Loading : State
    data class Success(val result: String) : State
    data class Failed(val throwable: Throwable): State
}

fun printResult(state: State) {
    val isSuccess = state is State.Success
    if (isSuccess) {
        print(state.result)
    }
}

fun main() {
    val state = State.Success("Hello World!!")
    printResult(state)
}
```

例えば、上記のようなコードがあった場合

#### 2.0以前

`if` 条件内でならスマートキャストされるが、条件外で評価した値を使用してもキャストはされませんでした。
そのため、 `isSuccess` の値を `if` の条件判定で使用しても、 `state` は `Any` として扱われ、 `result` プロパティにアクセスできません。

https://pl.kotl.in/1yWWQ7ChQ?theme=darcula

#### 2.0以降

`if` 条件外で評価した値でもスマートキャストできるようになりました。
そのため、`isSuccess` の値をifで条件判定しても、 `state` は `State.Success` として扱われ、 `result` プロパティにアクセスできます。

https://pl.kotl.in/i5tlSWGzd?theme=darcula

### 論理和演算子による型チェックを使用したスマートキャスト

``` Sample.kt
sealed interface State {
    sealed interface HasResult : State {
        val result: String
    }

    data object Initializing : State
    data class Loading(override val result: String) : State, HasResult
    data class Success(override val result: String) : State, HasResult
    data class Failed(override val result: String, val throwable: Throwable): State, HasResult
}

fun printResult(state: State) {
    if (state is State.Success || state is State.Failed) {
        print(state.result)
    }
}

fun main() {
    val state = State.Success("Hello World!!")
    printResult(state)
}
```

#### 2.0以前

論理和演算子で条件判定をしても、Any型として扱われます。
そのため、 `result` プロパティにアクセスできません。

https://pl.kotl.in/oIIYCDM0J?theme=darcula

#### 2.0以降

論理和演算子で条件判定を行うと、最も近い共通のスーパータイプへスマートキャストされます。
そのため今回の例では、 `HasResult` へスマートキャストされ、 `result` にアクセスすることができます。

https://pl.kotl.in/_lNqapZHN?theme=darcula

## まとめ

このようにスマートキャストが便利になっています。
他にも、向上しているものはいくつかあるため、[公式サイト](https://kotlinlang.org/docs/whatsnew20.html#smart-cast-improvements)を確認するといいかもしれません。

## 参考

- [Kotlin - Smart cast improvements﻿](https://kotlinlang.org/docs/whatsnew20.html#smart-cast-improvements)
Ubuntu24.04LTSをWI-U3-866DSを使ってWi-Fi接続する方法

UbuntuはWi-Fi接続が一番の難関と言われるほどのレベルなので、
自分が成功した方法をここに載せておきます

### 更新履歴
2024-06-01 11:36 - 記事投稿
2024-06-01 22:40 - ping値の確認方法と更新履歴を追加

## 環境
バージョン - Ubuntu24.04LTS 
カーネル - 6.8.0-31-generic

## 1. Wi-Fiドライバのインストール
まずはWi-Fiドライバをインストールしていきます
ターミナルを開き、以下のコマンドを順番に実行してください
(makeらへんでCPU使用率が100%になることがありますが,正常なので無視してください)
```
cd ~
mkdir .work
cd .work
git clone https://github.com/gnab/rtl8812au
cd rtl8812au
vi os_dep/linux/usb_intf.c
make
sudo make install
sudo modprobe 8812au
```
実行し終わりましたら、Ubuntuを再起動しましょう

## 2. 一回Wi-Fiアダプタを抜き差しする
ドライバ追加直後のときはそのままだと認識しないので、
Wi-FIアダプタを抜き差ししましょう

## 3. Wi-Fiに接続
これでWi-Fiに接続できるはずです
設定を開いて、Wi-Fiを選択してください
![Screenshot from 2024-06-01 11-25-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691296/8d4dbf24-b066-3ddb-f2c9-84394fcc6962.png)
そしたら、入力画面が出てくるので、
パスワード・暗号化キーを**正確に**打ってください
右上のアイコンが、
![Screenshot from 2024-06-01 11-36-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691296/b3d2a571-471f-8be0-a1c8-ebf1dec2d166.png)
のようになれば、成功です！
お疲れ様でした！

## おまけ - Ping値を確かめたい場合
Wi-Fi接続でのPing値を確かめたい場合は、
ターミナルを開き、以下のコマンドを実行してください
```
ping 8.8.8.8
```
Databricksノートブックにおけるmarkdownセルエディタ

Databricksノートブックではmarkdownをセルに記述できます。ただ、これまでは全部手打ちしないとなりませんでした。

今朝、ノートブックをいじっていたらmarkdownセルが進化してました。プレビューやメニューが追加されている。
![Screenshot 2024-06-01 at 11.28.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6b3b4d76-41ef-41a2-214a-975f63afab90.png)

# 太字

テキスト選択状態で**B**を押します。太字になります。
![Screenshot 2024-06-01 at 11.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ab8e18e8-3f39-0964-80a5-c3adc3a37bc3.png)

# イタリック

*I*を押します。
![Screenshot 2024-06-01 at 11.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eaadb835-71ba-e5a5-0ff6-7f1442087195.png)

# コーディング

`<>`を押します。
![Screenshot 2024-06-01 at 11.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7103d9f2-3698-e294-6875-c4e8eafa0847.png)

# ハイパーリング

チェーンマークを押します。urlを置き換えます。
![Screenshot 2024-06-01 at 11.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fcf4d3ef-f0e4-a3ab-8c23-949f9b332fd9.png)

# 見出し

H1からH3を押します。
![Screenshot 2024-06-01 at 11.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/60346cef-9369-02aa-2573-40a8b0c99798.png)

# 箇条書き

複数行を選択して、箇条書きマークを押します。
![Screenshot 2024-06-01 at 11.30.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/70dd0835-c413-9b4a-8fc9-73c224ff9f40.png)
![Screenshot 2024-06-01 at 11.30.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7405b785-9ce3-fbba-3bde-6bb82cd80733.png)

# 引用

一番右の引用マークを押します。
![Screenshot 2024-06-01 at 11.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4895ff81-0738-c980-f7ee-2d6bb51268ff.png)

# プレビュー

プレビューを表示/非表示でプレビュー画面を切り替えることができます。これは便利。
![Screenshot 2024-06-01 at 10.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9ebac3ab-973e-9eed-1e81-f642d812d700.png)

ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
テトリスの著作権について考える

# 1\. このページで目指すもの
「テトリスを参考にしたゲームを作り公表したいけど、どこまでオリジナルのテトリスから離れれば著作権の保護対象外となるのか」について調査・考察し、自分なりの結論を出します。

# 2\.参考にしたもの
> A) [ゲームの「ルール（アイデア）／表現」の境目が示された！？米国テトリス事件ーTetris Holding, LLC v. Xio Interactive, Inc.ー](https://maeshibu.com/2023/01/07/tetrisvxio/) 2023年1月7日

> B) [“砂テトリス”こと 『Setris』、テトリス社側より「タイトルと音楽似すぎ」と著作権侵害通知受けたとして配信停止。しかし改名などして配信マッハ再開](https://automaton-media.com/articles/newsjp/20230703-254324/)

> C) [テトリスの著作権について【自作テトリスを公開したら違法？】](https://hotnews8.net/society/tetris-copyright)

# 3\.結論(括弧書きは参考サイト番号)
::: note alert
### 最低でも「ブロックの4マスの形状」「縦20マス・横10マスのピット」を真似しない、「サービス名・アプリ名やドメインの一部にテトリスを彷彿とさせる表現」を使用しない
:::

日本国内では、ソフトウェアの機能が類似していても著作権侵害にはならないようです。 (C)

米国ではドクターマリオ程違うと、テトリスの著作権に引っかからないようです。(A)
しかし、昨今ではAndroidアプリやiPhoneアプリの配信が世界中に行われることを考えると、厳しい方の基準に合わせることが重要なのでしょう。Playストアなどの審査も厳しくなっているようです。
> - ゲームフィールドの大きさを変える
> - １つのピースの大きさを変える
> - ピースの色彩、光沢感、質感を変える
> - ピースのアクションの雰囲気を変える
> - その他、ゲームのGUIを変える
> - タイトルを変える(B)
> - 音楽を変える(B)
> - サービス名・アプリ名やドメインの一部（または全部）に、「テトリス」「テトリミノ」「Tetris」「Tetrimino」といった名称を使わない(テトリスの商標権侵害(C)

以下は単独では、侵害の認定に至らない可能性がありますが、他の要素で似通った表現を使っているとその限りでないようです(A)
> - ガベージライン（※対戦モードで出てくる相手へのお邪魔ラインのこと）
> - ゴーストまたは影のピース（※落下予定位置に出る影）

# 4\.理由
- 著作権法とは、「創作性のある表現(著作物)」を守る法律
    
- 「ゲームのルールは著作物ではない」
    GUIを構築することで「表現」となるが、万国共通の判断ラインは存在しない様子

    カードゲーム：著作権の適用は難しい
    ブロックゲーム（落ちゲー）：著作権の適用は検討しやすい

::: note 
- ### ゲームのルール：著作権保護対象外
    - 落ちゲー
    - 幾何学形状で、幾つかの異なる形のものが落ちる
    - 水平ラインが揃うと消える
    - 画面の一番上までくるとゲームオーバー
- ### ゲーム表現：著作権保護対象内
    - ブロックに明るい色、ブロックは個別に線引きされたレンガ形状、各レンガには質感を示す内側の境界線、色の陰影とグラデーションはほぼ同様、光がピースに注がれている
    - ブロックは、4つの同じサイズの正方形をさまざまなパターンで組み合わせられている
    - ブロックの動きと回転のビジュアル（アニメーション）
    - ピットの寸法（20マス x 10マス）、
    - 「ガベージ」ラインの表示、
    - 「ゴースト」の出現、
    - 次に落ちるピースの表示、
    - 蓄積されたピースとロックするときのピースの色の変化、
    - ゲームオーバーによりゲームボードに自動的に埋められる正方形の表示
:::

4マスで構成されたピース、縦20×横10マスというのは、 **ゲーム性** に深くかかわる部分です。これらの表現がアイデア(ルール)ではなく、表現なのか？という問題を通して著作物（表現）として認められたということは、 **ゲーム性の一部は著作権として認められた**　ことを意味するようです。

この他、
- マージ理論（Merger doctrine）
- ありふれた情景理論（Scènes à faire）
など、勉強になりますが、この点は参考にしたページ(A)をご参照ください。

# 5\. おわりに
決して法律の専門家ではありませんが、考察することに意味のあるテーマと思います。
誰かのお役に立ちますように。
毎日ABC day9【c++】ABC337 A-C問題解説【ACコード付き】

# AtCoder Beginner Contest 337

https://atcoder.jp/contests/abc337

## A - Scoreboard
チーム高橋とチーム青木が $N$ 回の試合を行い、合計点が高い方が勝ち。

チーム高橋とチーム青木に分けて総得点を求めて比較する。

```cpp
int N;
int X[109];
int Y[109];

int main()
{
	cin >> N;
	for (int i = 1; i <= N; i++) cin >> X[i] >> Y[i];
	int total_takahashi = 0;
	int total_aoki = 0;
	for (int i = 1; i <= N; i++)
	{
		total_takahashi += X[i];
		total_aoki += Y[i];
	}
	if (total_takahashi == total_aoki) cout << "Draw" << endl;
	else if (total_takahashi > total_aoki) cout << "Takahashi" << endl;
	else cout << "Aoki" << endl;
	return 0;
}
```

## B - Extended ABC
文字列 $S$ が与えられる。その文字列がA,B,Cの順番で文字が出現し、それ以外の文字が出現しないときは`Yes`、それ以外の時は`No`を出力せよ。ただA,B,Cともに何文字連続しても問題ない。

```cpp
string S;

int main()
{
	cin >> S;
	int i = 0;
	while(S[i] == 'A') i++;
	while(S[i] == 'B') i++;
	while(S[i] == 'C') i++;
	if (i == S.size()) cout << "Yes" << endl;
	else cout << "No" << endl;
	return 0;
}
```

## C - Lining Up 2
$N$ 人が一列に並んでいる。誰が誰の後ろに並んでいるかの情報が渡されるので、列に並んでいる順に出力せよ、という問題。

配列 $people$ に$i$さんの後ろに $people_{i}$ さんが並んでいる、という情報を保持させておき、あとは先頭の人から後ろの人を順番に辿っていけばよい。

```cpp
int N;
int A[300009];

int main()
{
	cin >> N;
	vector<int> people(N + 1, N + 1);
	int front = -1;
	for (int i = 1; i <= N; i++)
	{
		cin >> A[i];
		if (A[i] == -1) front = i;
		else people[A[i]] = i;
	}
	cout << front;
	front = people[front];
	while (front < N + 1)
	{
		cout << " " << front;
		front = people[front];
	}
	cout << endl;
	return 0;
}
```
gitを入れるとUNIXがついてくる

# お伝えしたい情報
Windowsにgit入れるとUNIXコマンドがもれなくついてきて、とっても便利。インストールできるアプリが制限されている作業環境でもgitあれば困らない。perlもあるよ。

# 実際にあったできごと
とあるお客様現地で作業しなければいけなかったのですが、配布された事務用PC(Windows10マシン)にインストールできるアプリがものすごく制限されていました。というか配布状態から追加インストールできない。外との接続は制限されており、事務用Windows10マシンと本番用Linuxマシンがクローズド環境にあるだけ。
事務用PCでいろいろデータ整理しなければいけないのだけどExcelでがんばるかWindowsPowerShellでやるか迷っていました。Linuxにデータ送って処理する方がよいのかな、とも。
ただ事務用PCにはgitが入っていました。それでgitのインストールフォルダ見てみると．．．

# bashやその他UNIXコマンド一式
「bashやその他UNIXコマンド一式」があるじゃないですか。
事務PCが外に繋がっていないのでスマフォで調べてみると、かなり有名な話なのですね。
私は全く知りませんでした。
ならデータ処理はperlでやろう、ということになり快適（？）な事務作業環境となりました。

# どうでもいいまとめ
perlって最近では流行っていない感がありますが、古いUNIX環境でも使えるし、Windowsでもいろいろなアプリに同梱されている（oracleとか）ので覚えておくとちょっとした作業には便利。
正規分布(normal distribution)

##  正規分布(normal distribution)
・正規分布は最もよく使われる分布で、統計学の理論でもよく出てくる分布になります。
・平均$\mu$と分散$\sigma^2$で形状が決まります。
正規分布が平均$\mu$と分散$\sigma^2$に従うことを省略して、$N(\mu, \sigma^2)$に従うと表記します。

下記の図のように、分散が大きくなると、山は低くなり左右に広がって平らになります。分散が小さくなると、山は高くなり、より尖った形になります。
![正規分布.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/d8ce89fe-3101-355c-019c-5e498ce3bc51.png)

確率変数$X$が$N(\mu, \sigma^2)$に従うとき、確率密度関数は次の式で表されます。

```math
f(x)=\frac{1}{\sqrt{2\pi\sigma^2}}exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
```
**Pythonで実践**
正規分布
・　stats.norm
引数
・loc : 平均
・scale : 標準偏差

```
from scipy import stats
# 平均10, 標準偏差3の正規分布からランダムに1つとってくる
stats.norm(loc=10, scale=3).rvs()
```
結果
6.562147535575372

上記を実行すると、10に近い値をとってくる確率が高いです。


では、正規分布を描画してみましょう。

```
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

# x軸を設定
x = np.linspace(-5, 20, 100) 

# y軸を設定 
# N(10,3)に従う確率密度関数
y = stats.norm(loc=10, scale=3).pdf(x)

# N(8,3)に従う確率密度関数
y2 = stats.norm(loc=8, scale=3).pdf(x)

# N(8,1)に従う確率密度関数
y3 = stats.norm(loc=8, scale=1).pdf(x)

# 描画する
plt.plot(x, y)
plt.plot(x, y2)
plt.plot(x, y3)

```

![スクリーンショット 2024-06-01 10.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/8958c5bc-e5af-2e0c-28fc-7ccd59ece61b.png)
Perlのbinmodeでハマる

# はじめに
WindowsでSJISデータをperlで処理するときに、ハマりました。
コマンドプロンプトにSJISデータを標準出力表示させたら、文字化けするのです。
同じワナにハマる人がいるかもしれないので、備忘録として書いてみます。

# ポイントだけ
・binmodeのレイヤはスタックされるので注意。
・複数ファイルに分かれるperlスクリプトではbinmodeでencoding変えるのは注意。
・スタック回避にはrawが使えるが、出力データ毎にencodeした方が安全。

# 何が問題だったか
「コマンドプロンプトにSJISデータを標準出力表示」させるために以下を入れました。

```perl
binmode STDOUT, ':encoding(cp932)';
```
スクリプトはUTF-8で書いています。

ここで、「binmode」を複数個所で入れていました。
ところが、binmodeのレイヤはスタックされるので、2重変換になって文字化けします。

ダメだったスクリプトを単純化したものが、以下です。これ、文字化けします。
```perl
use strict;
use utf8;

binmode STDOUT, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';

my $word = "ソート機能\n";
print $word;
```

こんな風に１つのファイルに2個書いていたらすぐ気づくのですが、スクリプトを分割してモジュール化し、そのモジュールにもbinmodeを入れていました。
スクリプトもモジュールもステップ大きいと、すぐに気づきません。
```perl
use strict;
use utf8;
use MyModule;

binmode STDOUT, ':encoding(cp932)';

MyModule::MyFunc();   #  この中にbinmodeあり

my $word = "ソート機能\n";
print $word;
```

## じゃぁ、どうしたらいいの？
私はモジュール側のbinmodeを外しました。
モジュールの中でSTDOUTに出力していたのはデバッグ用途のためで、必須ではなかったからです。

でも、本当にモジュール側でもbinmodeでのencoding指定が必要な場合にはどうしたら良いのでしょうか？
この場合、:rawレイヤを付けると既存の変換を無効化してくれそうです。

例えば、本体スクリプトもモジュール側も以下で書くと正しく動作します。
```perl
binmode STDOUT, ':raw:encoding(cp932)';
```


Perl自身の説明
```
The implementation of :raw is as a pseudo-layer which when "pushed"
pops itself and then any layers which would modify the binary data stream.
```


「STDOUTなど共通出入口にbinmode ncoding」はまとめて設定できるので楽ですが、複数ファイルに分かれるperlスクリプトでは注意が必要です。面倒だけど外に出すデータ毎にencodeした方が失敗少なそうです。
Difyは一部がOSSではない(2024年5月現在)→OSS化されました

# 結論(2024-07-11)
Difyは、これまで一部がクローズドでしたが、2024-07-11 のリリースで、OSS(オープンソースソフトウェア)化されました。 https://github.com/langgenius/dify-sandbox をご覧ください。


# 以下は古い内容ですが、参考情報として残しておきます


## (古い)結論
DifyはOSSをうたっていますが、一部で中身が非公開のコンテナイメージを使っており、完全なOSS(オープンソースソフトウェア)ではありません(2024年5月現在)


## 詳細
- Difyは複数のDockerコンテナで構成されていますが、利用者が作成したpythonコードを実行するコンテナ`sandbox`は中身が非公開です(→2024-07-11に公開されました)
    - https://hub.docker.com/r/langgenius/dify-sandbox からダウンロードできます
    - セキュリティのためとの事ですが、検証できません
        - 何かを記録したり、外部に送信したりしているかもしれません

     - [GitHubのディスカッション](https://github.com/langgenius/dify/discussions/3279) で、「適切な時期が来たら、オープンソース化します」と回答があります


## 弊害
- 使用できるpipパッケージが [GitHubのDiscussions](https://github.com/langgenius/dify/discussions/3580) で挙げられていますが、それ以外のパッケージを追加できません
    - pandasなど使いたいパッケージが使えないのは不便です
        - requirement.txtを書き換えるとpipでインストールまではできますが、コード実行時にエラーが出て実行できません
        - Dockerfileを作って、`langgenius/dify-sandbox:0.2.1` のイメージに対して、後からpipでインストールしても、pythonコード内でimportする際にエラーが出ます

``` Dockerfile
# Dockerfile
FROM langgenius/dify-sandbox:0.2.1
RUN apt-get update && apt-get install -y gcc
# RUN pip install pandas
RUN python3 -m pip install pandas
```

``` python
# Difyの「ブロック」で追加したコード
import pandas

def main(arg1: int, arg2: int) -> dict:
    return {
        "result": arg1 + arg2,
    }
```
    
``` sh
Traceback (most recent call last): File "/tmp/code/dc8e539b_c2c3_41cc_911c_8532c9f4ecdd.py", line 45, in <module> ModuleNotFoundError: No module named 'pandas' error: exit status 255
```
[Python / typing_extensions] ImportError: cannot import name 'TypeAliasType' from 'typing_extensions' の対策

# 概要

jupyter で遊んでいたら、タイトルに記載のエラーが発生した。
普段発生したことがなく、焦ったので記録する: (´ºωº｀):


# 環境

Item|Version
--|--
Docker image|python:3.10.12-slim
python|3.10.12
jupyter|1.0.0
typing-extensions|4.3.0


# エラー内容

jupyter を起動して、 `import numpy as np` を実行しようとしたら、docker の標準出力ログの方に、以下のエラーが出現した。

```bash
dev-python-1  | [I 2024-06-01 10:01:51.551 ServerApp] AsyncIOLoopKernelRestarter: restarting kernel (1/5), new random ports
dev-python-1  | Traceback (most recent call last):
dev-python-1  |   File "/usr/local/lib/python3.10/runpy.py", line 196, in _run_module_as_main
dev-python-1  |     return _run_code(code, main_globals, None,
dev-python-1  |   File "/usr/local/lib/python3.10/runpy.py", line 86, in _run_code
dev-python-1  |     exec(code, run_globals)
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/ipykernel_launcher.py", line 16, in <module>
dev-python-1  |     from ipykernel import kernelapp as app
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/ipykernel/kernelapp.py", line 21, in <module>
dev-python-1  |     from IPython.core.application import (  # type:ignore[attr-defined]
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/IPython/__init__.py", line 55, in <module>
dev-python-1  |     from .terminal.embed import embed
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/IPython/terminal/embed.py", line 16, in <module>
dev-python-1  |     from IPython.terminal.interactiveshell import TerminalInteractiveShell
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/IPython/terminal/interactiveshell.py", line 48, in <module>
dev-python-1  |     from .debugger import TerminalPdb, Pdb
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/IPython/terminal/debugger.py", line 6, in <module>
dev-python-1  |     from IPython.core.completer import IPCompleter
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/IPython/core/completer.py", line 219, in <module>
dev-python-1  |     from IPython.core.guarded_eval import guarded_eval, EvaluationContext
dev-python-1  |   File "/usr/local/lib/python3.10/site-packages/IPython/core/guarded_eval.py", line 40, in <module>
dev-python-1  |     from typing_extensions import TypeAliasType
dev-python-1  | ImportError: cannot import name 'TypeAliasType' from 'typing_extensions' (/usr/local/lib/python3.10/site-packages/typing_extensions.py)
```

最後の方に、

> ImportError: cannot import name 'TypeAliasType' from 'typing_extensions'

と書かれているのを手掛かりに解決策を調べた。


# 解決策

`typing-extensions` のバージョンを `4.3.0` から `4.12.0` にアップデートしたら解決したよ🍀*゜

# 参考リンク

この GitHub issue に、 「`typing-extensions` アップデートするといいよ」って書いてあったので、解決することができたよ( ⑉>ᴗ<⑉)ありがとう

https://github.com/alexdelorenzo/cast_control/issues/16#issuecomment-1535801713
UT Mockito when使い方

## whenとは
スタブを実現させる際に使用します。メソッドが呼ばれた際に特定の値を返すように操作することができます。
ex)
```java
when(mock.someMethod()).thenReturn(10);
```
また、whenは同じメソッドが2回使用される場合や例外処理のUTで有効です。
ex)
```java
when(mock.someMethod()).thenReturn(10).thenReturn(0);
```

```java
when(mock.someMethod()).thenThrow(new RuntimeException());
```


## 参考
https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#when(T)
TypeScript勉強してみた⑦

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:

**「いいね」か「ブックマーク」**
を頂けると僕のモチベーションアップになります！:thumbsup:
少しでも気に入っていただけたらよろしくお願いいたします！:thumbsup:


# 今回の目的
TypeScriptがわからなくてやばたにえんなので、ハンドブックで学んでみました。
（前回）

https://qiita.com/mr_noppo/items/71f18d8c73ecff7e4c47

# 主に参考にさせていただいた記事

https://www.typescriptlang.org/docs/handbook/intro.html

# 関数の詳細
### 関数型
typeで関数の型を定義できます。
```ts
// 関数を引数で受け取る型定義
// stringの引数を受け取り、stringを返します。
function greeter(fn: (a: string) => string) {
  return fn("Hello, World");
}
 
function printToConsole(s: string) {
  return s;
}
 
console.log(greeter(printToConsole));
```
typeで定義ももちろん可能です。
```ts
type GreetFunction = (a: string) => void;
```

※関数のプロパティ
自由に追加できます。
```ts
function myFunc(someArg: number) {
  return someArg > 3;
}
myFunc.description = "default description";
myFunc.a = "a";
```

### 汎用関数
下記の場合、引数と戻し値ともにanyとなります。
```ts
function firstElement(arr: any[]) {
  return arr[0];
}
```
下記の場合、ジェネリクスに定義した型が採用されます。
```ts
function firstElement<Type>(arr: Type[]): Type | undefined {
  return arr[0];
}
```
ジェネリクスを使用することで型を定義できます。TypeScriptの推測でもメソッドは使用可能です。
```ts
// s is of type 'string'
const s = firstElement<string>(["a", "b", "c"]);
// n is of type 'number'
const n = firstElement<number>([1, 2, 3]);
// u is of type 'any'
const u = firstElement<any>([]);
```

### 汎用関数をpropertyの有無により制限する(extends)
extends{~:~}を使用することにより、該当のpropertyにアクセスできる型のみに制限することが可能です。
```ts
function longest<Type extends { length: number }>(a: Type, b: Type) {
  if (a.length >= b.length) {
    return a;
  } else {
    return b;
  }
}
 
// longerArray is of type 'number[]'
const longerArray = longest([1, 2], [1, 2, 3]);
// longerString is of type 'alice' | 'bob'
const longerString = longest("alice", "bob");
```

### Type型との不一致
下記の場合、else文でエラーが発生します。
Typeと同じようにプロパティを持っている想定になりますが、Typeとの関連性がなく、Typeが他のプロパティも持っている可能性があることから、別のインスタンスが生成される可能性を警告される為です。
```ts
function minimumLength<Type extends { length: number }>(
  obj: Type,
  minimum: number
): Type {
  if (obj.length >= minimum) {
    return obj;
  } else {
    return { length: minimum };
  }
}
```

# 次回の予定
https://qiita.com/mr_noppo/items/57fe7b35b047b1535f41
時代遅れの年寄が初めてのDocker

# 初めてDockerに触れる
いまさらながら、年寄りがDockerに触れてみた。ここでは、組み込みLinuxを構築できるbuildrootの開発環境を、ubuntuのDockerイメージをもとに作成（Export）して異なるホスト環境にイメージをコピー（Import）し、その環境でBuildできることをトライ（さらには実行）したときの記録。

## Docker自体の詳細は省く
Docker初心者であったが、各種サイト情報が充実している。以降、各種コマンドが用いられているが、小生がこれはと思う以外の事項についての内容は省く。

## buildrootの開発環境
まずは、buildrootの開発環境をubuntuのDockerイメージをもとに作成。なお、ホストはubuntuである。

### build環境
```
$ docker pull ubuntu
$ docker run -it --privileged ubuntu

root@e04c8ea70dbf:/#
root@e04c8ea70dbf:/# apt update
root@e04c8ea70dbf:/# apt upgrade
root@e04c8ea70dbf:/# apt install build-essential
root@e04c8ea70dbf:/# apt install libncurses-dev
root@e04c8ea70dbf:/# apt install file
root@e04c8ea70dbf:/# apt install wget
root@e04c8ea70dbf:/# apt install cpio
root@e04c8ea70dbf:/# apt install unzip 
root@e04c8ea70dbf:/# apt install rsync
root@e04c8ea70dbf:/# apt install bc
```
buildrootのmakeのたびに、あれがないこれがない、、と言われたので、一つずつパッケージをインストール。なお、なぜか「apt install a b c ,,,」のように同時に複数指定できず、一つずつインストールした。

### buildroot
```
root@e04c8ea70dbf:/# make proj
root@e04c8ea70dbf:/# cd proj
root@e04c8ea70dbf:/proj# git clone git://git.busybox.net/buildroot buildroot
root@e04c8ea70dbf:/proj# cd buildroot
root@e04c8ea70dbf:/proj/buildroot# make pc_x86_64_efi_defconfig
root@e04c8ea70dbf:/proj/buildroot# make menuconfig
root@e04c8ea70dbf:/proj/buildroot# make
```
ターゲットはIntelPC。buildrootについては、記事「[初めてのbuildroot](https://qiita.com/infinite1oop/items/161db8b093000508a92d)」参照。
```
$ docker cp e04c8ea70dbf:/proj/buildroot/output/images/disk.img ~/tmp
```
作成されたディスクイメージをホストにコピーし、ddコマンドにてSDカードにコピーし、起動することを確認。

### Dockerイメージ作成
当然ながら、objectサイズが大きいので、イメージ作成前に、それらは削除する。
```
root@e04c8ea70dbf:/proj/buildroot# make clean
```
ホストにて、現在のコンテナからDockerイメージを作成する。
```
$ docker commit e04c8ea70dbf ubuntu:buildroot

$ docker images
REPOSITORY                            TAG                          IMAGE ID      CREATED            SIZE
localhost/ubuntu                      buildroot                    b2ba352011d3  About an hour ago  1.44 GB
docker.io/library/ubuntu              latest                       ca2b0f26964c  4 weeks ago        80.4 MB
```

### Dockerイメージをファイルに保存
他の環境にてImportするため、イメージをファイルに保存（Export）する。
```
$ docker save ubuntu:buildroot > ubuntu-buildroot.tar
```

## ホストWindows 10（WSL2）へのImport
作成した「ubuntu-buildroot.tar」をWindows 10 PCにコピー後、Import実施。
```
$ docker load < ubuntu-buildroot.tar
5498e8c22f69: Loading layer  80.41MB/80.41MB
812ea3b69c30: Loading layer  68.96MB/68.96MB
fa395c84d829: Loading layer  1.287GB/1.287GB
Loaded image: localhost/ubuntu:buildroot
$ docker images
REPOSITORY         TAG         IMAGE ID       CREATED       SIZE
localhost/ubuntu   buildroot   b2ba352011d3   3 hours ago   1.41GB
```
IMAGE IDが”b2ba352011d3”、ホストubuntuで作成したIDと同じである。まずは、起動する。
```
$ docker run -it b2ba352011d3
root@2419dfbfdae0:/# 
```
ここからは、先ほどとほぼ同じ。
```
root@2419dfbfdae0:/# cd proj/buildroot
root@2419dfbfdae0:/proj/buildroot# make pc_x86_64_efi_defconfig
root@2419dfbfdae0:/proj/buildroot# make menuconfig
root@2419dfbfdae0:/proj/buildroot# make
```
同じく、作成されたディスクイメージをホストにコピーし、ddコマンドにてSDカードにコピーし、起動することを確認。

なお、Fedoraへも同様の方法でImport、Build、イメージの動作確認OKで、まずは初歩を理解。

EOF
ハードコードとは

## ハードコードとは
プログラムに直接、固定値を書き込むことを指します。直接書き込みことにより、変更が困難になることから避けるべき行為です。

どのように避けることができるでしょうか

## ソフトコード
ハードコードの反対をソフトコードと言います。具体的には、固定値を事前に定数として定義しておくことを指します。

ソフトコードをすることにより、修正が発生しても変更箇所を限定的に抑える事ができます。また、変更漏れを防げる可能性を高めることができます。また、初めてコードを触る方も各変数の役割を理解することが瞬時にできます。

このため、ハードコードは避けるべき行為と言われています。

## 参考
https://it-biz.online/it-skills/hard-coding/
【Swift】ローカル通知の最大登録数は64が限界なのか調べた

きっかけは５年前のこの記事
[【Swift5】ローカル通知（UNUserNotificationCenter）の最大登録数について](https://exgyaruo.com/programming/swift/maximum-number-of-unnotificationrequest)
記事の内容は「実験の末、ローカル通知の登録数は64が限界」だという結論だった。

ただ、私には以下の疑問が。
* iPhoneの機種によって変わるのでは？
* iOSのバージョンによって変わるのでは？

他の「最大数が64」と書かれている日本の記事を見ても根拠がない。なので調べてみることにした。

# 結論

公式ドキュメントに最大登録数が64という記載がありました。また、実験的にも2024/5/31時点では64個が限界でした。
[UILocalNotification(公式ドキュメント)](https://developer.apple.com/documentation/uikit/uilocalnotification#)

![passcheck2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692824/bd1e2dc5-c3f7-20bc-45b2-55fbae6e022a.png)

>アプリは、限られた数のスケジュール通知しか持つことができません。システムは、（自動的に再スケジュールされた通知が1つの通知としてカウントされる）**最新の64個の通知を保持し、残りを破棄します。**

`UILocalNotification`は`UNNotificationRequest`の前身？（著者はよくわかってない）ぽいです。
`UNUserNotificationCenter`や`UNNotificationRequest`の公式ドキュメントページを見ても最大登録数が64という記載はないですが、前身が言ってるんだから本当っぽいですね。

また、調べた感じiOS9（2015年）から現在に至るまで、最大数は64です。なので、これからも<font color="Red">**最大登録数64が変わるのは期待しない方が良い**</font>と思います。
[参考：Is there still a ~64 local notification limit for the new UserNotifications in iOS 10?](https://stackoverflow.com/questions/40685128/is-there-still-a-64-local-notification-limit-for-the-new-usernotifications-in-i)

# 最大登録数64を超える方法
海外では最大登録数を超える方法が議論されていました。
[参考1：How to overcome Local Notifications limits](https://www.reddit.com/r/iOSProgramming/comments/xuo3rb/how_to_overcome_local_notifications_limits/)
[参考2：LocalNotification limit](https://stackoverflow.com/questions/45601375/localnotification-limit)

結論として、64個以上を登録する方法はありません。
ただ、手段として「**アプリを開いたときに直近の通知64個を組み込む**」が紹介されていました。
Todoアプリなど、頻繁に開くアプリであればこの方法を使えそうな気がしますね


# 実験もしてみた
この方の記事は2019年更新であり、「現在(2024/5/31)と5年前では状況が変わるのでは？」と微かな希望を抱き、実験もしてみました。
[【Swift5】ローカル通知（UNUserNotificationCenter）の最大登録数について](https://exgyaruo.com/programming/swift/maximum-number-of-unnotificationrequest)

実験内容：1~100のローカル通知を順番に作成

![passcheck.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692824/cbd9e1ac-f5d9-73fa-da9e-8591021e0627.png)

5年前と全く同じ結果でした。64個を超えると古い通知が削除されています。

# おわりに

#### 最後に宣伝です。
このような誕生日を通知するiosアプリをリリースしています。
[誕生日book-通知とメモをリストで管理](https://apps.apple.com/jp/app/誕生日book-通知とメモをリストで管理/id6496679663)
![スクリーンショット 2024-05-31 17.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692824/440d9c08-0882-3678-f122-9a9ca6276fe9.png)

このアプリも通知最大数64であることを記載しないといけないな〜