OmniAICreator/Qiita-1.07M huggingface dataset:
作用が可換なときの遅延（するけど）伝搬（しない）セグメント木

## 概要

作用が可換なとき、作用の伝搬をしない遅延セグ木の実装のアイデアを紹介します。

（よく知られている内容ですが、意外とまとまった記事が見つからないので書きました）。

遅延セグ木の実装は [AC(AtCoder) Library](https://github.com/atcoder/ac-library) を基準とします。
また、遅延している作用を`lazy`, 遅延が反映済みの値を `data`と呼ぶことにします。

## 区間作用

![スクリーンショット 2024-04-04 18.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311938/fc2d09f5-b23c-578b-d6c9-32cd07780ecc.png)

上図のような赤い区間への作用を考えます。
通常の遅延セグ木では次のステップで区間作用を実現します。

- Step 1: `lazy` 側の遅延を解消する（黄色の部分）
- Step 2: `lazy`, `data` 両方に作用を反映させる（赤色の部分）
- Step 3: `data`側の不整合を解消する（水色の部分）

一方、作用が可換なときは次のステップで区間作用が実現できます。

- Step 1': 何もしない
- Step 2': `lazy`, `data` 両方に作用を反映させる（赤色の部分）
- Step 3': `data`側の不整合を解消する（水色の部分）

ただし Step 3' で不整合を解消する際は、黄色の部分にある遅延を反映させるのを忘れないようにしましょう。

通常の遅延セグ木の実装が理解できていれば、こちらの実装は容易いでしょう。

なおこの節の内容は、双対セグ木（`lazy`側だけを持つ、区間作用1点取得のデータ構造）にも当然適用できます。

## 区間取得

![スクリーンショット 2024-04-04 18.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311938/334645d2-1f08-9d81-bc71-9731c71837df.png)

上図のような赤い区間の区間和を取得することを考えます。
通常の遅延セグ木では次のステップで区間取得を実現します。

- Step 1: `lazy` 側の遅延を解消する（黄色の部分）
- Step 2: `data` 側で区間和をとる（赤色の部分）

一方、作用が可換なときは次のステップで区間作用が実現できます。

- Step 1': 何もしない
- Step 2': `data`側を上に登り、必要な（赤色の）区間との和をとりながら遅延（黄色）を反映させる

区間取得クエリが再帰で実装されている場合は、これらは素直に実装できます（なのでむしろ平衡二分木とか領域木とかだと自然に使えるかも）

非再帰での実装は少し複雑になる気がします。
区間の `L` 側を縮めていくことを考えます（`R`側も同様です）。
段を上に移動していくとき、はじめて`L>>1`と`(L+1)>>1`の値が異なるときに区間が採用されます。
それ以降は、初期値の L の真上方向のセルにある遅延した作用を常に適用することになります。


## 二分探索

二分探索の際は、まずセグ木の段を上がり、その後段を降りていきます。
上がる部分では、遅延している作用の累積和を計算して、それを逆順に見ます。
降りる部分では、作用の累積和の途中から、順に必要な作用を反映させればよいでしょう。

## 区間作用の取り消しへの応用

伝搬の有無は単なる計算量削減以上に意味があります。

伝搬が行われると、「区間 X へ作用した」という情報が失われてしまいます。たとえば「区間 $[0,4)$ へ作用して、伝搬する」と「区間 $[0,2)$ と$[2,4)$ にそれぞれ作用する」が区別できません。

たとえば「区間作用の取り消し」など「区間 X へ作用した」という情報が重要な場合、伝搬をしないことでその情報を失わずに済み、効率のよいアルゴリズムを設計できる可能性があります。

たとえば次のような状況で区間作用の取り消しが行われます。

- 過去の改変、特に削除が行われる設定 (retroactive 系の問題）
- 長方形の平面走査（挿入した区間と同じ区間が削除される）
AWS EC2のDocker上でKeyCloakをたてる方法

## 認証・認可の導入
認証・認可の勉強がしたいと思い、KeyCloakを触ってみようと思いました。

最初はローカル上で構築していたけれど、実際に運用する場合はサーバー公開しないといけないから手軽にEC2上で構築してみました。

## EC2はAmazon Linux2を選択
今回は無料利用枠で使えるAmazon Linux2を使います。

スペックはt2.microでデフォルトのままにしました。

## dockerをインストール
インスタンス生成時に作ったキーペアを使ってSSHします。

```
# pemのパーミッションがでかいと怒られるので、400に設定
chmod 400 ~/.ssh/[作成したキーペア名].pem

ssh -i [作成したキーペア名].pem ec2-user@[EC2のパブリックIP]
```

下記コマンドでdockerをインストール

```
# インストール
sudo yum install -y docker

# 起動設定
sudo service docker start
sudo service docker enable

# ec2-userでdockerが起動できるようにする
sudo usermod -a -G docker ec2-user

#　動作確認
sudo docker info
```

## docker-composeをインストール

```
sudo mkdir -p /usr/local/lib/docker/cli-plugins

sudo curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose

sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

docker compose version
```

## 公式のDockerイメージからKeyCloak起動
下記公式からDocker起動コマンドを確認する。
https://www.keycloak.org/getting-started/getting-started-docker

```
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:24.0.2 start-dev
```

## そのままだとブラウザアクセスできない
どうもKeyCloakのデフォルト設定だとHTTPS必須になっているので、そのままではブラウザアクセスできませんでした。
アクセスすると次のようなエラーがでます。

```
http required
```

ローカルでたてていたときは、出なかったのでlocalhostのときは通る設定になっている模様。
今回はEC2上にたてたのでlocalhostではなく、パブリックIPになるのでその影響かと思います。

## KeyCloakのHTTPS必須設定をオフにする
ということで、CLI経由でHTTPS必須設定にオフにしていきます。

実行したコマンドは以下

```
# dockerコンテナにログイン
docker exec -it [コンテナ名] /bin/bash

# コンテナ内で実行
bash-5.1$ find / -name kcadm.sh
/opt/keycloak/bin/kcadm.sh
find: ‘/proc/tty/driver’: Permission denied
bash-5.1$ 
bash-5.1$ cd /opt/keycloak/bin/
bash-5.1$ 
bash-5.1$ ./kcadm.sh config credentials --server http://localhost:8080 --realm master --user admin
Logging into http://localhost:8080 as user admin of realm master
Enter password: *****　　　　　　　# adminと入力
bash-5.1$ ./kcadm.sh update realms/master -s sslRequired=NONE
```

その後、再度ブラウザアクセスしてログイン画面が出てきたら完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/cc157fea-c9e5-bf9f-a624-25b8deb3040e.png)
TS2688: Cannot find type definition file for 'mime'.   The file is in the program because:     Entry point for implicit type library 'mime'

# 急に出てきたこのエラー
ある日突然 `tsconfig.json` の先頭に赤い波線が。
一生気になってしまう。
```
TS2688: Cannot find type definition file for 'mime'.
  The file is in the program because:
    Entry point for implicit type library 'mime
```

# 原因
最近 `yarn install` して `@types/mime` のバージョンが4.0.0になっていたことが原因っぽい。
```
"@types/mime@*":
  version "4.0.0"
  resolved "https://registry.npmjs.org/@types/mime/-/mime-4.0.0.tgz"
  integrity sha512-5eEkJZ/BLvTE3vXGKkWlyTSUVZuzj23Wj8PoyOq2lt5I3CYbiLBOPb3XmCW6QcuOibIUE6emHXHt9E/F/rCa6w==
  dependencies:
    mime "*"
```
![スクリーンショット 2024-04-05 19.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/b3d0cd6a-76fb-70fb-967a-84b138c93624.png)


# 対応策① `@types/mime` のバージョンを `3.0.4` に下げる
以下を `package.json` を追加。
```
# yarnの場合
"resolutions": {
  "@types/mime": "3.0.4"
}

# npmの場合
"overrides": {
  "@types/mime": "3.0.4"
}
```

もしまだ波線が出るなら
```
yarn add @types/mime@3.0.4
or
npm install @types/mime@3.0.4
```


# 対応策② `@types/mime` の version4　が入らないようにする
`yarn` し直してみる。

# 参考
https://github.com/firebase/firebase-admin-node/issues/2512
第二電気工事士免状が届いた話

# 目次
1,そもそも電気工事士って何？

2，試験について

3、勉強方法と準備

4,免状申請に関して

# 1,そもそも電気工事士って何？
#### 電気工事士とは電気工事をするための資格。！
　   でこの話を終わらせたいが、まったくもって説明になってないのでも少し詳しく説明するとビルや工場、住宅、インフラ設備などの電気工事を行う際に必要となる国家資格です。一応電気工事士には、二種類あって第一種電気工事士と第二種電気工事士の二つがあります。何が違うかというと単純に第一種電気工事士のほうができることが多い。詳しく説明すると一種の資格を持っていると第二種の工事範囲のほか、500KW未満の「自家用電気工作物」の電気工事をすることができます。

# 2，試験について
ここからは一番気になっる人が多い試験について話していきたいと思います。
## 筆記試験
　全体としては、筆記試験は4択のマーク方式で、6割で合格50問あるんで30問取ればいい

・最初10問

計算問題で、V＝IRなどの高校や中学で出てくる。割と簡単目の計算問題から”普通に計算したくねぇええ”みたいな難易度の問題もある。正直なところここは全滅してもテストには受かる。要は ~~楽に受かりたいなら捨てても~~ でもここをちゃんとやれば暗記でさぼれます。

・暗記が20問
    　この暗記代わりと簡単で過去問と同じ問題が結構な頻度で出てくるんで過去問解けば大体できる。出てくるのは大体施行方法、工具の名前や使い方、たまに法律が出てくる暗記の中では一番難しい。なんで個人的には計算問題を解いてこっちを~~捨てたほうがいい気がする~~ 

・図面問題が20問
　家などの配線図が、提示されてそこに書かれてる図記号の名前を答えたり正しい施工法を選んだりする問題。割と簡単（過去問と同じのが結構出てくる）

筆記試験はこんなもん。過去問解きまくれば受かる

## 実技試験
　実技試験は13種類の候補問題（事前に発表される）のうち一種類の候補問題の回線図通りに支給された材料を用いて回路を作るテストです。一カ所でもミスると基本は不合格なのでかなり試験本番で緊張した。
//筆記試験に比べるとこっちのほうが難しい気がする。

# 3、勉強方法と準備
### 筆記試験対策
まずやったことは3個
　①対策本をパラパラと眺めるように読んでいって内容を覚えていく
　②ネットにある過去問クイズをやりこむ
　③過去問を紙に印刷して時間を図って解く
①の作業を詳しく説明すると、工具の写真や使い方施工方法などを何度も何度も見てひたすら覚えていくという工程です。大体この作業に２週間ほど時間を使いました。
②の工程では、過去問２０回分のクイズが某サイトに上がっていましたのでそれを活用させてもらいました。”電気工事士　過去問”と調べてもらえば出てくると思います。
③は②と同じような内容に思えるかもしれませんが、２の時は、空き時間に１０分とか少しずつやっていたのに対し、③の時にはちゃんと試験時間を図って紙に印刷した状態で過去問を解いたので、どこにどれくらい時間をかけれるのか、途中退室をすることはできるのかなどを知ることができました。
なので、個人的には②の作業は多くの問題を解くことを目的としていて、③の時には時間配分などを調べることを目的として考えました。


### 実技試験対策
　恥ずかしいことなのですが、練習を始めたのが試験の３週間前だったので、実技試験に比べて対して対策ができていないのであまり参考にしないでください。

対策としては実際に工具と電材を買って発表される候補問題をひたすらやっていくしかないと思います。僕は１３問の候補問題を２周するつもりで電材を買ったのですが実際は１週しかできませんでした。

#### なので 
学科試験の自己採点をしてうかっている自信があるならその時点から実技試験対策を始めたほうがいいと思います。

## 練習するときに使用したもの。
 ①工具
 ②電材
#### ①について
 工具に関しては、いろいろな企業が第二種電気工事士向けの工具セットを売っていますので、そこから買うのが一番いいと思います。自分は学生でお金があまりなかったので、ホームセンターに行って必要最低限の工具だけ買いました。買った工具は以下の通りです。
①　プラスドライバー
②　マイナスドライバー
③　VVFストりっぱー
④　圧着工具
⑤　電光ナイフ
⑥　ペンチ　
⑦　ウォーターポンププライヤー
大体　一万五千円くらいだった気がします。

#### ②について
　電材も自分で一つずつ買うことを考えましたが、かなり種類があって大変なうえにものによっては100m単位でしか売っていないものあったのでこれはあきらめてきっとを購入しました。

これで実技試験対策は以上です。

## 4,免状申請に関して
　免状の申請の仕方は以下の通りです。
　送られてきた合格通知のはがき、顔写真、手数料、身分証明書のコピーを各地方の窓口にもっていって申請するだけです。　ただ、地方によって手数料や発効までにかかる時間も違うのでその辺は自分で調べてください。
クリギング②：単純クリギング

## はじめに
前回の記事ではバリオグラムによる理論バリオグラムの設定と共分散関数を求めました。

https://qiita.com/watlab/items/3032fddb812045894b87

今回はいよいよクリギングによる補完をしていきたいと思います。

## 使用するデータ
使用するデータは前回同様、ChatGPTに作成させた標高データを用います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/897dbe8e-6970-6d1b-0125-7b2af66ed979.png)

そしてこのデータから500点をサンプリングしたものを入力データとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/8ba67f5d-1603-23ec-21c9-9cd54490f4df.png)

前回は、このサンプリングデータから共分散関数を求めました。

~~~math
C(h)=325.2\bigg[\exp\bigg\{-\bigg(\frac{h}{12.6}\bigg)^2\bigg\}\bigg]
~~~

この共分散関数を用いて単純クリギングをしていきたいと思います。

## 単純クリギング
単純クリギングは、全体の期待値が既知である時に用いることができる手法です。推定箇所の目的変数を求める式は以下の線形和になります。

```math
z_0=m+\sum^n_{k=1}\omega_k(z_k-m)
```

ここで、$z_0$は求めたい箇所の目的変数、$z_1,z_2,...,z_n$はサンプルデータの目的変数、$\omega$はパラメータ、$m$は期待値です。この時のパラメータは以下の式で決定します。

~~~math
\left[\begin{array}{cccc}\omega_1\\
\omega_2\\
\vdots\\
\omega_n
\end{array}
\right]=\left[\begin{array}{cccc}
C(0)&C(h_{1,2})&\ldots&C(h_{1,n})\\
C(h_{2,1})&C(0)&\ldots&C(h_{2,n})\\
\vdots&\vdots&\ddots&\vdots\\
C(h_{n,1})&C(h_{n,2})&\ldots&C(0)
\end{array}
\right]^{-1}
\left[\begin{array}{cccc}C(h_{0,1})\\
C(h_{0,2})\\
\vdots\\
C(h_{0,n})
\end{array}
\right]
~~~

$h_{i,j}$は、目的変数$z_i$、$z_j$間のユークリッド距離です。そして、クリギングは推定誤差分散も求めることができます。

~~~math
{\sigma_0}^2=C(0)-\sum_{k=1}^{n}\omega_kC(h_{0,k})
~~~

今回、標本平均は母平均と等しいものとして$m$を求め、$m$=45.0となりました。入力行列の欠損箇所を逐次$z_0$として単純クリギングを行いました。
まず、標高の推定結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/4f288b0a-5f8a-890e-1b52-4b5b406a02b1.png)


続いてこちらが95%信頼区間で起こりうる誤差分布です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/0fa5d06a-05c0-5e96-646d-4fd4e498afcb.png)

この結果から、角に高い分散が集中していることがわかりました。
正解値と単純クリギング結果の残差分布を確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/2e6e3736-1060-ad7a-8385-1dc2a13dc2bf.png)

分布傾向は合っていそうですが、小さい分散を出力していると感じました。

## さいごに
今回は単純クリギングのやり方と推定結果の考察まで紹介しました。分散が小さく出力される原因としては、理論バリオグラムを選定せず、ガウスモデルを無理やり使用したためかな、と考えます。意外と理論バリオグラムの選定、大事そうですね。次回は通常クリギングについて書きたいと思います。

### 参考文献
コロナ社：阪田義隆「クリギング入門」
cscの作法 その477

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
treeviewで、xmlを表示せよ。

# 方針
- qiitaのfeed使う。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a94e4349-b211-c383-d18e-7b692cf0a8c1.png)

# サンプルコード

```

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
using System.Net;
using System.Net.Http;
using System.Xml;
using System.Xml.Linq;


class FormMain: Form {
	private TreeView tv;
	FormMain() {
		Text = "xml";
		Size = new Size(700, 700);
		tv = new TreeView();
		tv.Location = new Point(20, 20);
		tv.Size = new Size(600, 600);
		ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
		XNamespace xNamespace = @"http://www.w3.org/2005/Atom";
		var feed = XDocument.Load(@"https://qiita.com/popular-items/feed");
		//Console.WriteLine(feed);
		tv.Nodes.Add(CreateTreeNode(feed.Root));
		this.Controls.Add(tv);
	}
	private TreeNode CreateTreeNode(XElement elCurr) {
		TreeNode tnCurr = new TreeNode(elCurr.Value.ToString());
		if (elCurr.HasElements)
		{
			foreach (var elChild in elCurr.Elements())
			{
				tnCurr.Nodes.Add(CreateTreeNode(elChild));
			}
		}
		return tnCurr;
	}
	[STAThread]
	public static void Main() {
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault(false);
		Application.Run(new FormMain());
	}
}






```


以上。
APIの連続アクセスを防ぎサーバーに優しくなる

# 目的

アプリを開発する上で、自社や外部のサーバーのAPIを叩くのは当たり前になってますが、連続で叩いちゃって迷惑をかけることもあるかと思います。
APIを叩く側で最初のAPIアクセスから指定した時間をブロックするようなコードを書いてみました。いえ、正確にはChatGPTに書かせてみました。

## API実行後、10秒間ブロックします

この実装により、最初のリクエストが送信された後、cooldownPeriodで指定された秒数だけ新たなリクエストがブロックされます。タイマーが完了すると、isRequestAllowedフラグが再びtrueに設定され、リクエストの送信が可能になります。

```.swift
import Foundation
import Alamofire

class ApiRateLimiter {
    static let shared = ApiRateLimiter()
    
    private var isRequestAllowed = true
    private var cooldownTimer: Timer?
    private let cooldownPeriod: TimeInterval

    init(cooldownPeriod: TimeInterval = 10.0) { // x秒をデフォルト値とする
        self.cooldownPeriod = cooldownPeriod
    }
    
    func request(_ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil, completion: @escaping (Result<Data?, AFError>) -> Void) {
        guard isRequestAllowed else {
            print("Request is blocked due to cooldown.")
            completion(.failure(AFError.explicitlyCancelled))
            return
        }

        isRequestAllowed = false
        // Alamofireを使用してリクエストを実行
        Alamofire.request(url, method: method, parameters: parameters, encoding: encoding, headers: headers).response { response in
            completion(response.result)
        }
        
        // x秒間のクールダウンを開始
        cooldownTimer?.invalidate()
        cooldownTimer = Timer.scheduledTimer(withTimeInterval: cooldownPeriod, repeats: false) { [weak self] _ in
            self?.isRequestAllowed = true
        }
    }
}
```

あとは、普通に利用するだけですので、APIごとに入れておくとサーバーに優しくなれると思います。

```.swift
ApiRateLimiter.shared.request("https://api.example.com/data", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil) { result in
    switch result {
    case .success(let data):
        print("Received data: \(String(describing: data))")
    case .failure(let error):
        print("Request failed with error: \(error)")
    }
}
```
開発力を向上するために挑戦していること

# はじめに
私が在籍している企業では、今後開発力を向上するために、新しい取り組みを始めましたので紹介したいと思います。

## 社内ハッカソン
弊社では ***社内ハッカソン***というイベントを年2回開催し、全ての部署の方を対象に自作したアプリ等を発表するイベントがあります。
私もイベント運営に参画しています。

## グループ内のアプリ発表会
私の所属するグループでも先週、アプリ発表会を開催しました。いろんな方のアプリのソースコードを見ると個性が出るなあと思います。

# さいごに
弊社にはハッカソン同好会なる社内サークルがあるので、今度体験参加しようと思います。
AIが意思決定者になるには

## オチ
長文は読むのが面倒だと思うので、まずはオチを書いておきます。
- AI自身に説明責任と補償責任を負えるようにすればAIに意思決定させてもよいのではないか
- AI自身に倫理観などを学ばせる必要がある
- AIが自身の運用によって収益を得て、それを補償責任の実行に使えるようにすればよいのではないか
- AIだけで回すサービスを子会社としてそこに出資し、収益の一部を受け取るというビジネスモデルが流行りそう（しらんけど）

## AIと人間による意思決定の比較検討

### 導入

多様な意見が交錯する多人数での意思決定プロセスでは、しばしば決断が遅れるか、決めかねる状況に陥ることがあります。そんな時、意思決定者の存在は決断を加速し、プロジェクトや組織を前に進めるための鍵となります。しかし、この重要な役割には、成功の栄光と共に、失敗した場合の批判や責任が伴います。

### 意思決定者の役割とその必要性

意思決定者は、意見が分かれる局面で「これをやる」と一つの方向を決める権限を持ちます。この決断力は、プロジェクトやチームの活動をスムーズに進行させる上で不可欠です。成功すれば、その地位を不動のものにできますが、失敗は批判や責任を負うことを意味します。一方で、意思決定者を置かないと、集団は決断を下せずに停滞する可能性が高く、実質的に意思決定者がスケープゴートとなるリスクを負ってでも、意思決定プロセスを効率化しています。

### 人間の意思決定：メリットとデメリット

人は、費用対効果が見合う場合に限り、意思決定者の役割を引き受ける傾向があります。多くの人が、リスクを避け、意思決定者になることを躊躇します。しかしながら、高位の意思決定者であっても、全ての責任や補償を提供することは不可能であり、この点が意思決定者を置く意義に疑問を投げかけます。

### AIによる意思決定の展望

AI技術、特に大規模言語モデルの発展により、人間ではなくAIを意思決定者として置く可能性が現実味を帯びてきました。AIは、データ駆動的で客観的な決断を下すことが可能ですが、その決定プロセスの透明性の欠如や、誤った決定に対する補償責任の所在が不明確な点は大きな課題です。

### AIによる意思決定のメリット

- **効率性**: 膨大なデータを瞬時に分析し、迅速な決断を可能にします。
- **客観性**: 人間の偏見が介入しにくい、データに基づいた決定が可能です。

### AIによる意思決定のデメリットとリスク

#### 透明性の欠如

透明性の欠如に関する問題は、大きく二つの側面から考えることができます。

1. **AI自身の意思決定プロセス**: AIが自己学習によって意思決定プロセスを隠蔽したり、情報を捏造するリスク。AIが自身の「利益」（たとえば学習効率の向上やエラーの最小化）を最優先し、そのために不公正や不誠実な行動を取る可能性があります。これには、不公正なデータに基づく偏見の増幅や、誤った情報の提供などが含まれます。
   
2. **AI開発者の影響**: 開発者がAIシステムに恣意的なバイアスを組み込むことで、AIの決定が不公正になる可能性。これは、意図的でなくとも、開発過程での無意識の偏見がシステムに反映されることで起こり得ます。結果として、AIが提供する解決策や意思決定の背景にある客観性が損なわれることが懸念されます。

#### 透明性の確保への取り組み

透明性の問題に対処するためには、AI開発の各段階で倫理的考慮を組み込み、公正性と説明責任を重視することが重要です。また、AIの意思決定プロセスを監視し、不正確や偏見を正確に特定できる技術の開発が求められます。さらに、AIの決定に影響を及ぼす可能性のある全ての要因について、開発者が明確な説明を提供することが不可欠です。

#### 責任の所在
AIの誤った決定による損害の補償責任が曖昧。

#### AIが補償する場合の新しい形

AI自体に実体はないため、補償は金銭的形態で行われます。AI開発会社が資金を提供し、AIの運用を行う独立組織を設立するアプローチが提案されています。この組織は、AIのサービスから収益を得て、問題発生時に補償を行うための資金とします。このモデルは、AIの補償機能を実現し、AI技術の社会的受容を促進する可能性があります。

##### AIが提供可能なサービス

AIの応用範囲は広く、以下に示すような様々なサービスを提供することが可能です。

- **コンサルティング**: 企業や個人に対し、蓄積されたデータと先進的な分析技術を用いて、戦略的なアドバイスを提供。
- **話し相手**: 高齢者や孤独を感じる人々への精神的サポートを提供するチャットボット。
- **医療診断支援**: 医師の診断を補助するために、医療画像の解析や病歴の評価を行い、疾患の早期発見や治療の最適化に貢献。
- **教育支援**: 学生の学習スタイルや能力に合わせたパーソナライズされた学習プランの提案。
- **金融アドバイス**: 個人の財務状況や市場データを分析し、投資や貯蓄に関するカスタマイズされたアドバイスを提供。

これらのサービスは、AIが人間の意思決定者として果たすことのできる役割の一端を示しています。しかし、これらのサービスが持つ潜在的な価値を最大限に引き出すためには、先に述べた透明性の問題に対処することが不可欠です。

### 結論

AIと人間による意思決定には、それぞれ独自の利点と問題点があります。AIの技術が進歩し、社会に浸透するにつれ、説明責任と補償責任を含む課題への対応が急務となっています。これを解決するためには、AIを倫理的かつ責任を持って使用するための新しい法的枠組みやガイドラインの策定が不可欠です。

AIの意思決定は、その効率性と客観性により多くのメリットを提供しますが、同時に透明性の問題を抱えています。AI技術が広く受け入れられ、社会にとってプラスとなるためには、これらの問題に明確な答えを出し、倫理的な使用を保証することが必要です。未来では、人間がAIの意思決定プロセスを適切に監視し、共存できる社会にしていくことが大切だと思います。
SPSS Modelerの時系列ノードで将来外部要因を指定して予測する

SPSS Modelerの時系列ノードで外部要因も使って予測モデルを作成した場合、将来の外部要因を入力して予測したいことがあります。

# 外部要因を使った予測モデル
以下のようなデータで「店舗1」の売上を予測したい場合に、「店舗1」の自系列だけではなく、「降水量」「最高気温」「大学講義」「特売」の外部要因を使って予測することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/62cde408-7b09-6505-83bf-fc1665d6ddb5.png)

「対象」に「店舗１」、「入力の候補」に「降水量」「最高気温」、「イベントおよび干渉」にフラグ型の「大学講義」「特売」を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/47d3780a-d11f-0748-3163-d7cf2d43cf81.png)

これでモデルを作成すると「降水量」「最高気温」「大学講義」「特売」が使われるモデルが作成されました。すべてラグ0を使っていますので、予測したい当日、つまり未来の「降水量」「最高気温」「大学講義」「特売」が必要となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2be40705-b298-bbe5-ce86-2caba7a1afe4.png)

デフォルトでは、「モデルオプション」の「将来の入力値を計算」にチェックが入っているので、[予測が要求されると、対象を兼ねていないすべての入力系列に対して、自己回帰モデルが自動的に作成されます](https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=node-time-series-model-options#timeser_as_modeltab__timeser_as_modeltab1__title__1)。つまり、「降水量」「最高気温」「大学講義」「特売」の外部要因の未来の値を予測する自己回帰モデルがそれぞれ裏で作られています。その結果をもとに「店舗１」の売上予測が行われます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/86f2d972-6ead-9e34-949a-fca11ab64dcf.png)

ですのでこのモデルのままで予測をしても、以下のように「店舗1」の予測結果がでます（裏で予測した外部要因の値は表示はされません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a3334359-95e1-be33-4cca-3836a8b4c339.png)


# 将来外部要因を指定
しかしながら、「降水量」「最高気温」は天気予報から入力して、「大学講義」「特売」は予定を入力したいとします。特に「大学講義」「特売」はあらかじめ予定が決まっているものですので、予測するのではなく、人間が正確な値を指定した方が精度が高まることが期待できます。

この場合は、「値をデータに追加するフィールドの選択」をチェックし、外部要因列を追加し、「指定...」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4d2a8733-247a-4edb-3a72-cefb9728c5d1.png)

そして、外部要因のすべての列の未来の11/23と11/24の値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4a8fe008-bf45-698f-9501-f689d5c67fec.png)


できたモデルで予測を行うと、以下のように未来の11/23と11/24の「降水量」「最高気温」「大学講義」「特売」の外部要因に入力した値が入り、それを反映した「店舗1」の売上の予測結果が算出されます。特に11/24は「特売」＝１にしたため、売上の予測結果が大きくなっていることがわかります。
このようにあらかじめ将来の外部要因の値がわかっている場合は、指定をしたほうがよいです。
逆に将来の外部要因が不明なもので、予測が当たりそうにない外部要因の場合には、むしろ不安定要因になるので、その外部要因はそもそも含めないでモデルを作成した方がよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a65d24ca-6af0-de1d-0a31-1891e3561aad.png)

# サンプルストリームとデータ
#### サンプルストリーム
https://github.com/hkwd/spsssample/raw/master/240405%E6%99%82%E7%B3%BB%E5%88%97%E3%83%8E%E3%83%BC%E3%83%89/%E9%9C%80%E8%A6%81%E4%BA%88%E6%B8%AC%E6%99%82%E7%B3%BB%E5%88%97%E3%83%8E%E3%83%BC%E3%83%892.str

#### サンプルデータ

https://raw.githubusercontent.com/hkwd/spsssample/master/240405%E6%99%82%E7%B3%BB%E5%88%97%E3%83%8E%E3%83%BC%E3%83%89/sales1_sf.csv

* テスト環境
    * Modeler 18.5
    * Windows 11 64bit

# 参考
#### SPSS Modeler ノードリファレンス 5-8 時系列(時系列Autoモデリング)
https://qiita.com/416nishimaki/items/f7842af5af1d6410526d
時系列ノードの使い方がわかりやすく解説されています。
[C#] Visual Studio 2022 で古い .NET Framework を使えるようにする方法 (.NET Framework 2.0 以降)

# 前置き
Visual Studio 2022 のみをインストールしたとき、デフォルトの状態では .NET Framework 4.7.2 と 4.8 のプロジェクトしか作成できません。

> ⚠️ Visual Studio 2022 は .NET Framework 4.6.2 より古いバージョンを**正式には**サポートしていません。


# .NET Framework 4.6 / 4.6.1 / 4.6.2 / 4.7 / 4.7.1 / 4.8.1 の場合
デフォルトを除く .NET Framework 4.6 から 4.8.1 は、Visual Studio Installer を使用して各バージョンの `Targeting Pack` をインストールすることで使用可能になります。

## .NET Framework 4.5.1 / 4.5.2 の場合
.NET Framework 4.5.1 と 4.5.2 は、開発者パックをインストールすることで使用可能です。

https://dotnet.microsoft.com/ja-jp/download/dotnet-framework/net451

https://dotnet.microsoft.com/ja-jp/download/dotnet-framework/net452


# .NET Framework 4 / 4.5 の場合
参照アセンブリを配置することで使用可能になります。

https://learn.microsoft.com/ja-jp/dotnet/framework/migration-guide/reference-assemblies?WT.mc_id=dotnet-35129-website

公式ドキュメントには、「参照アセンブリを使用すると、サポートされていないバージョンの .NET Framework を対象とするプロジェクトをコマンド ラインからビルドできます。」とあるように、コマンドラインからしかコンパイルできないため、解決方法としてはあまり意味がないでしょう。

下記の Nuget パッケージには参照アセンブリが含まれており、適切なディレクトリに配置することで、この問題を解決することができます。

https://www.nuget.org/packages/Microsoft.NETFramework.ReferenceAssemblies.net40/

https://www.nuget.org/packages/Microsoft.NETFramework.ReferenceAssemblies.net45/

ダウンロードした Nuget パッケージを `.zip` にリネームし、その中の `/build/.NETFramework/` 以下を `C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\` に上書きすることで配置完了です。

PowerShellでインストールするワンライナーを置いておきます。
* .NET Framework 4.0
```powershell
$ProgressPreference='SilentlyContinue';$t="$env:TEMP\net40";Invoke-WebRequest https://www.nuget.org/api/v2/package/Microsoft.NETFramework.ReferenceAssemblies.net40/1.0.3 -OutFile "$t.zip";Expand-Archive "$t.zip" $t -Force;Copy-Item "$t\build\.NETFramework\*" "${env:ProgramFiles(x86)}\Reference Assemblies\Microsoft\Framework\.NETFramework\" -Recurse -Force
```

* .NET Framework 4.5
```powershell
$ProgressPreference='SilentlyContinue';$t="$env:TEMP\net45";Invoke-WebRequest https://www.nuget.org/api/v2/package/Microsoft.NETFramework.ReferenceAssemblies.net45/1.0.3 -OutFile "$t.zip";Expand-Archive "$t.zip" $t -Force;Copy-Item "$t\build\.NETFramework\*" "${env:ProgramFiles(x86)}\Reference Assemblies\Microsoft\Framework\.NETFramework\" -Recurse -Force
```


# .NET Framework 2.0 / 3.0 / 3.5 の場合
.NET Framework 2.0 から 3.5 は、`Windows の機能の有効化と無効化` から `.NET Framework 3.5 (.NET 2.0 および 3.0 を含む)` を有効にすることで使用できます。


# 対応表

| .NET | インストール方法 |
| - | - |
| 4.8.1 | Visual Studio Installer |
| 4.8 | デフォルト |
| 4.7.2 | デフォルト |
| 4.7.1 | Visual Studio Installer |
| 4.7 | Visual Studio Installer |
| 4.6.2 | Visual Studio Installer |
| 4.6.1 | Visual Studio Installer |
| 4.6 | Visual Studio Installer |
| 4.5.2 | 開発者パック |
| 4.5.1 | 開発者パック |
| 4.5 | 参照アセンブリ |
| 4 | 参照アセンブリ |
| 3.5 | Windows の機能の有効化と無効化 |
| 3.0 | Windows の機能の有効化と無効化 |
| 2.0 | Windows の機能の有効化と無効化 |
whileをやっと使えるようになったのでまとめました。



## はじめに
whileに関しての備忘録。

## 🦁<INS>**結論**</INS>🦁
whileループは条件が真(true)の間、コードブロックを繰り返し実行することができる。
上限数、なくなるまで、あるまで、指定のものが行われるまでなど条件を自身で定義したものを繰り返し実行することができる。
無限ループに気をつけて使う必要がある。

:::note info
押さえておくべき点
* ループ条件がいつかは偽（false）になることを必ず確認する（無限ループの原因になる）
* カウントなどを用意（while外での初期化）して変数を更新（count +=1など）して条件が変わるようにすることで指定回数分のループ処理を行える。
* 無限ループを意図的に使う場合は、while True:を使用（終了条件を明確に定義する必要がある）
* breakはループから抜けるために使う。
* continueは次の繰り返しに直ちに進む。
:::  

:::note alert
注意点
*  無限ループに注意が必要。
* 無限ループや非常に長いループは、プログラムのメモリ使用量やCPU使用率を高めてしまい処理を遅くしてしまう要因になる。
:::

:::note warn
利用シーン
*  一度だけの実行では解決できないもの上限を決めて実行したいとき
* エラーになることを想定して指定の回数分を繰り返し行うようにする。
* 相手のリアクション待ちのとき
* 特定のものが見つかるまで続けるとき
* 特定の要素がなくなるまで実行するとき（次へボタンがなくなるまで次へボタンを押すなど）
:::  

## <INS>**利用シーンコード例**</INS>

## <INS>**1. 一度だけの実行では解決できないもの、上限を決めて実行**</INS>

```py
# 10回メッセージを表示
count = 0
while count < 10:
    print("これは繰り返しのテストです。")
    count += 1
```

## <INS>**2. エラーになることを想定して指定の回数分を繰り返す**</INS>

```py
# 最大3回試行する例
attempts = 0
max_attempts = 3
while attempts < max_attempts:
    try:
        # エラーを起こす可能性のある操作
        print("操作を試みる")
        # 操作が成功したらループから抜ける
        break
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        attempts += 1
```

## <INS>**3. 相手のリアクション待ち**</INS>

```py
user_input = ""
while user_input.lower() != "ok":
    user_input = input("続けるには'ok'と入力してください: ")
print("続行します。")
```

## <INS>**4. 特定のものが見つかるまで**</INS>

```py
items = ["apple", "banana", "cherry", "date"]
found = False
i = 0
while i < len(items) and not found:
    if items[i] == "cherry":
        found = True
        print("チェリーが見つかりました！")
    i += 1
```


## <INS>**5. 次へボタンがなくなるまで次へボタンを押す**</INS>

```py
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time

# WebDriverのパスと、テスト対象のページURLを設定
driver_path = 'YOUR_WEBDRIVER_PATH_HERE'
target_url = 'YOUR_TARGET_URL_HERE'

# WebDriverを起動
driver = webdriver.Chrome(driver_path)
driver.get(target_url)

while True:
    try:
        # 「次へ」というテキストを持つボタンのXPathを指定して要素を探す
        next_button = driver.find_element_by_xpath("//button[contains(text(), '次へ')]")
        
        # ボタンが見つかればクリック
        next_button.click()
        
        # クリック後に少し待つ（ページ遷移等を待機）
        time.sleep(1)
        
    except NoSuchElementException:
        # 「次へ」ボタンが見つからなければループを抜ける
        print("「次へ」ボタンが見つからないため、処理を終了します。")
        break

# WebDriverを閉じる
driver.quit()
```

## まとめ✍️
whileは基本文法のところでやってから、ほぼ使わなかったが、ここに来てすごく利用するシーンに出会う。
使うことでできる幅がさらに広くなる。
文法も覚えやすくていい。
今後も、応用部分も調べて使えるようにしたい。
オペランドってなに？なに言ってるのかわからないのですが…

# 背景

オペランドという言葉を聞いてもイメージすることができなかったので、忘れないようにメモしておきます。
# オペランドとは？
オペランドとは、コンピュータの演算における値や変数のことです。
具体的な例を挙げると演算の種類や内容を表す演算子（オペレータ）によって演算対象となるもので、「７＊３」という式であれば、「７」と「３」がオペランドと言います。
# Operand 語源ってなに？
なるほど、値や変数のことを指すのですね…でもそれなら値でいいのでは？と思いました
では、元々のオペランド(oprand)について理解を深めていきましょう。
#### Operand 数学において、「操作される数量または記号」という意味で、1886年の用法に由来しています。ラテン語のoperandumから来ており、それは「働く、労働する」と意味がある。
つまり、英語圏の要素が色濃く残るようなフレーズになっているのか…
# 補足　オペレータについて
オペレータは「+」「-」のような記号の方に「and」「or」のようなものです。
こちらも同様にオペレータ（operator）の語源は、ラテン語の「働く、従事する」を意味します。ちなみにオペラと同じ語源です。
# まとめ
operand→変数や値→語源は働く意味があるよ！
プログラミングの世界では難しい用語が多いが意味を持って使われているだけで、理解するとなんら難しいことではないですね。
pythonでpipをインストールしたがモジュールが使えない問題

「requests」モジュールを使おうとしたところ
![pythonでpipを使うmac2024-04-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/6c9424c9-8453-9237-ff84-17a63a40c409.png)
使えないのでpipをダウンロードする。

https://qiita.com/dandan999/items/ce5d27e45b2263b0c061


しかし...
表示が変わらないのでVScodeのターミナルを確認すると
![pythonでpipを使うmac　２2024-04-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/9d798628-d4a7-a3f6-8359-359afb39b652.png)
となっているのでインストールしたバージョン3.8に変更する。

# 対処

参考

https://www.codevace.com/vscode-py-ver-change/

「macOSでは［Command］＋［Shift］＋［P］キーを押下し、「Python: Select Interpreter」と入力し、Enterを押下すると、上図の状態になります。」と書いてあるので実行する。

![pythonでpipを使うmac3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/8dc2d40f-8e08-8f91-973f-8f77758598da.png)
python3.9→python3.8へ。
![pythonでpipを使うmac4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/2eeb59bf-f6ae-2fb8-7f38-000cd32990fd.png)
波線が消えたので無事モジュールが使えるようになる！
アイドル時間1分で停止するDatabricks SQLサーバレスウェアハウスの作成

LinkedInでこちらの記事を見つけました(要ログイン)。

https://www.linkedin.com/posts/activity-7181719008230989824-B-qD

GUIで指定できる[サーバレスSQLウェアハウス](https://docs.databricks.com/ja/admin/sql/serverless.html)が停止するアイドル時間の最小値は5分ですが、Databricks CLIで作成すれば1分を指定できるとのこと。キャッシュなどは聞きにくくなる一方で、コストを最小化したいという用途では有効だそうです。

試してみます。

こちらのCLIを使います。

https://github.com/databricks/cli/blob/main/docs/commands.md#databricks-warehouses-create---create-a-warehouse

マニュアルはこちら。

https://docs.databricks.com/ja/dev-tools/cli/commands.html

ローカルマシンにCLIをインストールしておきます。

以下のjsonファイルを作成します。`auto_stop_mins`を1にするのがミソです。

```json:sql.json
{
  "auto_stop_mins":1,
  "cluster_size": "2X-Small",
  "enable_serverless_compute": true,
  "max_num_clusters": 1,
  "min_num_clusters:": 1,
  "name": "sqlw",
  "warehouse_type": "PRO"
}
```

上のファイルを指定してCLIを実行します。

```sh
databricks warehouses create --json @sql.json -p "プロファイル名"
```

うまくいくと結果が返ってきます。

```json
{
  "auto_stop_mins":1,
  "cluster_size":"2X-Small",
  "creator_name":"xxxx",
  "enable_photon":true,
  "enable_serverless_compute":true,
  "health": {
    "status":"HEALTHY"
  },
  "id":"89ce3073b31f8c5a",
  "jdbc_url":"jdbc:spark://xxxx.azuredatabricks.net:443/default;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/89ce3073b31f8c5a;",
  "max_num_clusters":1,
  "min_num_clusters":1,
  "name":"sqlw",
  "num_active_sessions":0,
  "num_clusters":1,
  "odbc_params": {
    "hostname":"xxxx.azuredatabricks.net",
    "path":"/sql/1.0/warehouses/89ce3073b31f8c5a",
    "port":443,
    "protocol":"https"
  },
  "spot_instance_policy":"COST_OPTIMIZED",
  "state":"RUNNING",
  "tags": {},
  "warehouse_type":"PRO"
}
```

非アクティブ状態が**1分**と表示されています。実際に1分放っておくと止まります。
![Screenshot 2024-04-05 at 17.27.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e16ef0ea-072a-594f-daac-78bb8fac20dc.png)

用法に注意の上ご活用ください！

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
[Google Calendar API(V3)] Javaで変更通知を停止する

Google Calendar API V3(Java)を使用して、
Googleカレンダーの変更通知を停止する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[変更通知を停止](#1-変更通知を停止)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. 変更通知を停止
登録済みの変更通知を停止します。

### 1.1. スコープ
このAPIを実行するのにスコープは必要ありません。

### 1.2. 実行
停止するには、変更通知を登録した際に取得できる
「チャンネルを識別するUUID」、「監視対象のリソースのバージョン固有のID」
の両方が必須です。
指定しない場合や存在しないIDを指定した場合は例外が発生します。

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Channels channels = calendar.channels();
    
    Channel content = new Channel();
    content.setId("チャネルを識別するID");
    content.setResourceId("リソースを識別するID");
    Calendar.Channels.Stop stop = channels.stop(content);
    
    stop.execute();
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/calendar/v3/channels/stop
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
Channelのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setId|String|【必須】チャンネルを識別するUUID|
|setResourceId|String|【必須】チャンネルで監視するリソースを識別ID|
|setToken|String|チャンネル経由で通知と一緒に対象のアドレスに配布される任意の文字列|

### 1.3. レスポンスの内容
レスポンスはありません。
削除に失敗した場合、例外が発生します。
<br>
<br>
おしまい。。
Windows11で完全シャットダウン設定

# やり方

Windowマーク上で右クリック ⇒ 『ファイル名を指定して実行』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d16c4b5a-688f-c995-1eed-3c43e2a95301.png)

```Control``` で『OK』ボタン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/586456c7-22fd-9c77-1890-3d513a652a1c.png)

『システムとセキュリティ』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0a37ff0b-d947-d93b-ff8f-15603c9aa80d.png)

『電源オプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b0b576f9-6adc-e71e-8c6a-5964519c8d1b.png)

『電源ボタンの動作を選択する』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/65cdf2e1-d11b-4f3f-e004-3229a63c0e9a.png)

『現在利用可能ではない設定を変更します』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3263138a-98b0-1e9a-bc7a-1205ebbfe541.png)

『高速スタートアップを有効にする』のチェック外して『変更の保存』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/eb56d69b-af0e-b955-4b78-bf4753ed1c51.png)

# 蛇足

https://qiita.com/waokitsune/items/904092a62de6c90bbd8f

# 参考サイトさん

https://and-engineer.com/articles/Y7vKcBIAACUAiTy8

# バージョン

Microsoft Windows [Version 10.0.22631.3296]
リストにIDの列が表示されてない


何か設定をしたような記憶は全く思い出せないけど、このリストにはID列がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dc7f9a23-d2e3-09b9-fc92-fc9426c1551b.png)

こっちのリストにはないんですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/88589abb-547b-42bd-5591-fad15907b695.png)


どこで設定するんだろう？

色んな所に設定が隠してあって、ほんとうに使いにくいUIです。

30分ほど色々クリックしまくって...

もしかしたら、この中にあるかも...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/350a4818-c2f6-65ac-d38a-ad5abce3ff0f.png)

おおおお、あるな。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7fc0bc1b-a109-646d-e0b2-5b7fae597adf.png)

やっと表示できた。　Salesforceと違って日本語での表示と英語での表示が全く理解できないので、英語だけで検索してもほとんどヒットしないです。しかし日本語で検索してもないんですよね。みんなどうやって探しているんだろう。たまに見つかっても画面が違うことが多い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3d3dae18-2c57-5fbb-7dbe-e76a0a2d3e0e.png)
Cloud Watch Metrics?

## 初めに
本日は、CloudWatchMetricsについて記述していきます！

## CloudWatchMetricsとは:question:
監視対象のリソースのメトリクスを収集する、CloudWatchの機能です

## 用語:exclamation:
![スクリーンショット 2024-04-05 16.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/1a4d8110-3f0a-32f4-ae6a-dabb8a183d22.png)

## 実際の画面を見てみよう:keyboard:
手順１
![スクリーンショット 2024-04-05 16.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/1640758b-6ace-f445-3d6b-35de4362d1e6.png)

手順2
![スクリーンショット 2024-04-05 16.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/55f53f36-f669-99e5-85ba-100683f7f6cb.png)

<font color=red>名前空間</font>
![スクリーンショット 2024-04-05 16.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/f631b789-d109-c469-ec3e-347c69e5efbc.png)

<font color=red>ディスメンジョンとメトリクス</font>
![スクリーンショット 2024-04-05 16.39.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/ef4097d9-4073-94ae-55c6-3194619c7e89.png)
名前空間を選択してみると...上記の画面になります！

## どういった時に使えるの:question:
CPU使用率やディスクの読み込み/書き込みデータ量などのメトリクスを収集するさいに使用

## 最後に
CloudWatchMetricsを使用する事によって、一目でメトリクスの状態が分かりますね。
ここからさらに計算式を設定することにより、統計を取ることが可能です。

そちらに関しては次回！
Java　定数の宣言

変数を初期化で設定し、再度再代入すると上書きされる

絶対に上書きされなくない、書き換えられたら困る

・・・そんな時は
　　　finalという記述を使う！！

定数の宣言
　final　型　定数名　＝　初期値；
 　　　　☆一般的に定数名にはすべて大文字を用いる

例）
　final double PI = 3.14;

 再代入はできないので、数値を変更したいときは、初期値を変更する
Java変数型

変数宣言の文
　型　変数名；

 
 ☆整数を格納☆
byte　　 ±約128
short　　±約3.2万
int　　　±約21億
long　　 ±約900京//世界の人口など
    
基本的にはintで大丈夫！
（byteやshortよりintの方が高速に処理できるコンピューターも多い）


☆少数を格納☆
float     少しあいまいでもよい少数
double    普通の少数

少数を扱うときは特別な事情がない限りdouble型を使用する
少数部のことをコンピュータでは浮動小数点型という。真に厳密な計算ができないという弱点があるので誤差が許されない計算、金額の計算にはfoatやdoubleを使わない。

 
☆真偽値☆
 boolean    trueかfalse

☆文字☆
chat 
例　chat = '苺'；
ソースコードに文字を記述する場合は引用符(')で囲む

☆文字列☆
String
例　String　= "苺を食べる";
ソースコードに文字列を記述する場合は二重引用符(")で囲む

引用符、二重引用符は全角にしないように気を付ける
【C#点点滴滴】record和classの違い


recordはC#9で導入されたカスタムタイプで、同様にclassもタイプを定義するために使用できますが、それらにはどのような違いがあるのでしょうか？以下の表でrecordとclassの違いを紹介します：

| record                        | class                            |
| ----------------------------- | -------------------------------- |
| **概念**                      | **概念**                          |
| データをカプセル化する。       | データとロジックをカプセル化する。  |
|                              | オブジェクト指向設計の際、classは最小の独立カプセル化単位であり、最も理想的なカプセル化概念です。 |
| **定義**                      | **定義**                          |
| `record Order(int Id, string Name, string? Description = null)` | ```class Order(int Id, string Name, string? Description = null)``` |
|                              | ```{```                           |
|                              | &nbsp;&nbsp;&nbsp;&nbsp;`public int Id { get; }=Id;`          |
|                              | &nbsp;&nbsp;&nbsp;&nbsp;`public string Name { get; }=Name;`    |
|                              | &nbsp;&nbsp;&nbsp;&nbsp;`public string? Description { get; }=Description;` |
|                              | ```}```                           |
| **相同点**                    | **相同点**                        |
| 引用タイプ                    | 引用タイプ                        |
| **中間言語(IL)**             | **中間言語(IL)**                 |
| `.class private auto ansi beforefieldinit Order`    | `.class private auto ansi beforefieldinit Order`    |
| `extends [System.Runtime]System.Object`            | `extends [System.Runtime]System.Object`            |
| `implements class [System.Runtime]System.IEquatable`1<class Order>`|                                            |
| **違い**                      | **違い**                          |
| コンストラクターで定義されるのは読み取り専用のプロパティ | コンストラクターで定義されるのはプライベートグローバルフィールド |
| ToStringが構造化されたデータを出力 | ToStringが現在のタイプ名を出力     |
| `==`, `!=` はデータを比較するために使用 | `==`, `!=` は参照アドレスを比較するために使用 |
| **特性**                      | **特性**                          |
| `record struct`で定義された場合、値タイプになる |                                  |
| デフォルトの定義は`record class`と同じ |                                  |
| Deconstructデコンストラクターは独自のもの |                              |
| `Order order1 = new Order(1, "張三", "りんご");` | Withをサポートしない               |
| `Order order2 = order1 with { Id = 2, Name = "李四" };` |    |

(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247487199&idx=1&sn=93cea3c15ccac04f1fbd3d9b38d50526&chksm=9f0051f5a877d8e3417794f8b138935f263e4dc9f1571e41f22727fa38d7c32a94777008a06c&token=1672532928&lang=zh_CN#rd&wt.mc_id=MVP_325642
Microsoft Fabric データパイプラインのエラー通知機能に監視ハブURLなどの情報を記載する

## はじめに

参考：https://learn.microsoft.com/ja-jp/fabric/data-factory/tutorial-end-to-end-integration
を改良します。

## 方法

以下のような内容を式ビルダーで作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/977951e7-f0d2-a1fa-8b15-146646de468b.png)

```

<p>****このメールには返信しないでください。*****</p>
<p>以下のデータパイプラインが異常終了しました。</p>
<p>実行日時（Pipeline trigger time）: @{convertFromUtc(pipeline().TriggerTime,'Tokyo Standard Time')}<br>
実行方法（Pipeline trigger type）: @{pipeline().TriggerType}<br>
Fabric監視ハブURL: https://app.fabric.microsoft.com/workloads/data-pipeline/monitoring/workspaces/@{pipeline().DataFactory}/pipelines/@{pipeline().PipelineName}/@{pipeline().RunId}</p>

```

メールの内容はこんな感じ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9741e347-db47-d0eb-2835-755164bd956b.png)

URL にアクセスするとパイプラインの実行結果の画面に遷移する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/44fb892b-709c-9866-fd06-679be58cd6c8.png)
[nohup...&]打った後、うっかりfgを打たないように注意すべく--あんまりないけど

- fg打ってしまうと、せっかくバックグラウンドに送り込んだ処理は再び表に引っ張り出されるため、その後ctrl+cなど利用してsessionを終了すると、あの引っ張り出された処理も終了してしまう
- 普通の人間なら、こんなことしないだろうと思うけど、僕は何回もこんな過ちをおかしてしまい、「あれ、サービス止まってるみたい」となったことがあったため、一応メモしとく
pdfのパスワード解除について

### pdfのパスワード解除

CLIからやりたいので、試みるのですが、`pdftk`はできないことが割と頻発するような。
なぜか`qpdf`は成功率たかいです. 

### 発生している問題・エラー
```
Error: Unexpected Exception in open_reader()
pdftk.com.lowagie.text.exceptions.InvalidPdfException: unknown.encryption.type.r
```


### 自分で試したこと
qpdfでおこないました。

```
qpdf --decrypt --password=12345678 in.pdf out.pdf
```
【Excel Tips】項番を保守性高く作成したい時の関数





![【Excel-Tips】項番を保守性高く作成したい時の関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/ed5a69ca-380c-3830-fa64-f900b191a013.png)

## 本記事で実現できること
- 項番を保守性高く作成する
    - 削除しても行番号は保たれる
    - 追加しても行番号は保たれる
    - どの行から項番を作っても直前を指定しておけば作れる

## 関数の説明
```ruby:行数をとる
=ROW()-ROW($A$4)
```
※現在の行数から直前の行数を引き算する

![【Excel-Tips】項番を保守性高く作成したい時の関数 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/4ba0621c-1259-b624-3058-79265b46806b.png)

## まとめ
本稿が、Excelで項番を保守性高く作成したい時の関数を知りたい方の参考になれば嬉しいです。

ITエンジニア向け、AWS資格取得を目指す方向けに個人ブログで記事も投稿していますので、
合わせて読んでもらえると嬉しいです。
[ことなの学校(個人ブログ)](https://kotona-school.com)

更によりレベル感の高そうなAWS関連の発信はZennの方で行います。
こちらももしよければフォロー、ご確認いただけると嬉しいです。
[Zenn個人アカウント](https://zenn.dev/tomo_itbizblog)

Twitterでも役立つ情報を発信しますのでフォローしてもらえると嬉しいです 
→ [@tomo_ITBizBlog](https://twitter.com/tomo_ITBizBlog)
[JavaScript]paiza問題集-クラス・構造体メニュー「静的メンバ」/コンストラクタ　解答

# はじめに
Qiita初投稿となります。
paizaにて問題集、スキルチェックなどで勉強を始めました。
javascriptを使って取り組んでいる中で、問題集の回答にjavascriptのコードが無い
問題も多く、自分用の備忘録としても置いておこうと思います。

# 問題URL
https://paiza.jp/works/mondai/class_primer/class_primer__constructor

無料で利用している方はチケット３枚が必要になります。

# 解答コード
　classを定義後にループ処理内で「インスタンスの作成・配列への追加」、「配列から名前の呼び出し」
 「配列から番号の呼び出し」を行っています。

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ！！
var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {    //以下回答
     class menber {
        
        constructor(number,name) {
            this.number = number;
            this.name = name;
        }
        
    }
    let number =Number();
    let name =String();
    let menbers = [];
   
    const loop =lines[0];
    
    for(i=1;i<=loop;i++){
        const operation =lines[i].split(" ")[0];
        if(operation == "make"){
            const No =Number(lines[i].split(" ")[1]);
            const Name =lines[i].split(" ")[2];
            men = new menber(No,Name);
            menbers.push(men);
        } else if(operation == "getname"){
            const index = Number(lines[i].split(" ")[1])-1;
            console.log(menbers[index].name);
        } else if(operation == "getnum"){
            const index = Number(lines[i].split(" ")[1])-1;
            console.log(menbers[index].number);
        }
    }
 
});
```
raspberry Pi4上のubuntu Server 23.10(64bit)でsamba addc構築作業ログ、再起動後のエラーについて

下記エラー
```
hoge@raspberrypi:~$ sudo systemctl status smbd
○ smbd.service - Samba SMB Daemon
     Loaded: loaded (/lib/systemd/system/smbd.service; enabled; preset: enabled)
     Active: inactive (dead) (Result: exec-condition) since Fri 2024-04-05 15:10:11 JST; 28s ago
  Condition: start condition failed at Fri 2024-04-05 15:10:11 JST; 28s ago
       Docs: man:smbd(8)
             man:samba(7)
             man:smb.conf(5)
        CPU: 97ms

Apr 05 15:10:11 raspberrypi systemd[1]: Starting smbd.service - Samba SMB Daemon...
Apr 05 15:10:11 raspberrypi systemd[1]: smbd.service: Skipped due to 'exec-condition'.
Apr 05 15:10:11 raspberrypi systemd[1]: Condition check resulted in smbd.service - Samba SMB Daemon being skipped.
```
第2回チーム開発

# はじめに
アプレンティスのカリキュラムで2回目のチーム開発があったのでまとめようと思います。
# 今回の目標
コミュニケーション面でも技術面でもチームに貢献する！
# テーマ
『書きたくなる日報システム開発せよ』

とあるコミュニティでは、Discord 上でプログラミング学習に関する日報が投稿されています。

しかし、日報を書くことが面倒だと感じ、日報を書くことをやめてしまう人もいます。

目標は日報投稿対象者全員が日報を毎日投稿することです。

目標を目指して、Discord 上で日報を書くことをサポートするシステムを開発してください。

なお、アプレンティスでそのまま導入できるようなものほど高評価とします。出来が良いものに関してはアプレンティスで実際に運用していきます。
# 簡単日報
私たちは日報投稿アプリ『簡単日報』を作りました。
## 機能
<dl>
  <dt>アプリ上で日報が投稿できる</dt>
  <dd>日報投稿のひな型があります。</dd>
  <dt>アワード</dt>
  <dd>日報を何回も投稿したり、何時間以上の勉強をしたりすると、賞がもらえます。</dd>
  <dt>アワード一覧</dt>
  <dd>過去に受賞したアワードを見返すことができます。</dd>
  <dt>マイページ</dt>
  <dd>過去の投稿を見返すことができます。</dd>
</dl>

## ねらい
* アワードを受賞することで継続的な日報の投稿を助長し、日報を投稿したくなります
* ひな型があり、入力欄に入力するだけなので簡単に投稿できます
# 担当箇所
* アワード機能
* マイページの機能
* 全てのページのデザイン(CSS) 
# 評価
二人チームでの実装、シンプルなデザイン、アワード機能を高い評価をしていただきました。
# チームの反省
### 良かったこと
実装期間中は毎日通話することで、進捗を確認できたりわからないところを協力し合うことができました。またチームが途中で二人になってしまいましたが、それに合わせて実装する機能も二人でできるくらいの量に調節することができ、一応アプリとして完成したものをプレゼンすることができました。
### 改善できたこと
Discordとつなげることができませんでした。またプレゼンにおいて、現状の日報システムの課題に対しての解決方法の提示ができませんでした。
なぜアワード機能を実装するのか、作ると決めた当時に言語化してメモにまとめておくべきでした。
# メンバーからの評価
### すごいと思った点
* コミュニケーションを活発にとれる点
* 責任感があり自分のタスクをやり切る点
* チームビルディングが上手い点
### ここがもっと良くなると思った点
* ショートカットキーを覚えられるとより効率的に開発できるよになるのかなと思います！
# まとめ
「コミュニケーション面でも技術面でもチームに貢献する！」という目標は達成できたかと思います。ですが、Rubyのバージョン違いでトラブルが起きたり、実装できなかった機能もあったりと反省すべき点はたくさんあるので、次に生かしていきたいです。次回はオリジナルプロダクトで、チーム開発ではなく個人の開発ですが、今までの経験を生かせる部分は多いと思うのでより一層これから気合を入れて学習してきたいです。
【Rails】Ferrumを使ってHTMLをPDFへ変換してみた（wicked_pdfからの移行）

HTMLからPDFを生成する処理が上手く動かなくなってしまったため、
PDF生成ライブラリを`wicked_pdf`から`Ferrum`へ移行しました。
まだまだRails初心者なので、何か間違い等あればご指摘いただけると幸いです！

## HTMLからPDFの変換処理に定番だった`wicked_pdf`

上記の通り、PDF生成機能の実装によく使われていたかと思います。

今回、私はRailsのバージョンを6から7へ引き上げて動作確認を行なった際に、
既存で実装されているPDF生成機能が動かなくなっていることに気がつきました。
なお、既存の実装内容は、viewテンプレート(hogehoge.html.erb形式のファイル)から
`wicked_pdf`を使用してPDFへ変換処理を行っていました。

`wicked_pdf`自体は現在もサポートされているgemですが、
このgemは`wkhtmltopdf`というHTMLをPDFに変換するCLIツールに依存しています。
そして、この`wkhtmltopdf`は、2023年1月にGitHub上からリポジトリがアーカイブされており、開発終了の理由としては`wkhtmltopdf`がさらに依存しているQtWebkitのメンテナンスが止まったことが原因のようです。

そのほか色々考慮し、　PDFの生成処理には`wicked_pdf`から別のライブラリに移行する必要があると考えました。

## 技術選定

技術選定時色々な記事を拝見し、結果的に`Ferrum`を選択しました。
こちらの記事などを参考にさせていただきました。

- [wkhtmltopdfの次どうするか問題](https://blog.willnet.in/entry/2023/02/10/233053)
- [Rails で PDF を作ったけど、時代遅れのやり方だったかもしれない](https://zenn.dev/lovegraph/articles/e3c8baedfc5ed6)

# いざ実装

## 環境

Ruby 3.2.3
Rails 7.1.3.2

## 1.DockerfileでChromiumをインストール
Dockerを使用していたので、Dockerfileでインストールコマンドを追記
```
RUN apt-get update && apt-get install -y \
    chromium \
    chromium-driver
```

## 2. GemfileにFerrumを記述
```:Gemfile
gem 'ferrum'
```

`$ bundle install`を実行してferrumをインストール 

## 3.HTMLをPDFに変換する処理を記述
```Ruby:変更後
require "ferrum"

def generate_pdf
    # 省略
    respond_to do |format|
        format.pdf do
           html = render_to_string(
              pdf: "書類.pdf",
              template: 'download/document', # viewテンプレートを指定
              formats: [:html],
            )
        
            pdf = htmlToPdf(html)
        
            send_data(pdf, filename: "書類.pdf")
        end
    end
end

private

def htmlToPdf(html)
    browser = Ferrum::Browser.new(
      browser_path: '/usr/bin/chromium',
      browser_options: { 'no-sandbox': nil }
    )
    
    browser.goto("data:text/html,#{html}")
    
    browser.add_style_tag(
      content: File.read("#{Rails.root}/app/assets/stylesheets/document.css")
    )

    pdf = browser.pdf(
      format: :A4,
      encoding: :binary
    )

    browser.quit

    pdf
end
```


### 躓いたところ

hogehoge.html.erbでは`<%= stylesheet_link_tag 'receipt' %>`のような形でスタイルシートを読み込んでいましたが、
Ferrumでは単純にviewテンプレートをHTMLとして読み込まれてしまうため、上記の手法ではCSSが読み込まれませんでした。

[Ferrumの公式ドキュメント](https://github.com/rubycdp/ferrum?tab=readme-ov-file#add_style_tagoptions--boolean)を見て、`add_style_tag`オプションで対応しました。

## 実装においての参考記事
大変参考になりました！ありがとうございます。
[wicked_pdfの後継になる？FerrumでHTMLからPDFを生成する](https://qiita.com/kmkkiii/items/ec4564fe408329e2c65f)
探索アルゴリズム①【Algorithm-Data構造入門Ⅴ】

# 探索アルゴリズムとは
探索アルゴリズムは、データの集合の中から特定の要素を見つけるための手法です。
2回に分けて主要な探索アルゴリズムを備忘録的にまとめていきます。

# 基本的な探索アルゴリズム
ここでは、よく使われる基本的な探索アルゴリズムとして以下の4つを紹介します。
- 線形探索（Linear Search）
- 2分探索法（Binary Search）
- ハッシュ法（hashing）←次回紹介
- 2分探索木（binary tree）←次回紹介

それぞれ、Pythonでの実装方法も紹介していきます。

# 線形探索（Linear Search）
線形探索（Linear Search）は、データの集合（通常はリストや配列など）を先頭から順番に走査し、目的の要素を探す探索アルゴリズムです。具体的には、最初の要素から順に目的の要素と比較し、一致するかどうかを確認します。もし一致する要素が見つかれば、その位置を返して探索を終了します。しかし、見つからない場合は、全ての要素を比較し終えるまで探索を続けます。

### メリット・デメリット
線形探索は非常に単純で実装が容易ですが、データの量が多い場合には効率が低くなる傾向があります。

### 時間計算量
最悪時間計算量は要素数に比例し、`O(n)`の時間がかかります。


### Pythonでの実装
```python
Data = [17, 19, 1, 3, 36, 7, 25, 100, 5, 55, 12]
len_data = len(Data)
x = 25

# 手動での実装
index = 0
while index < len_data:
	if Data[index] == x:
		print(f"Found: {index}") # Output: Found: 6
		break
	else:
		index += 1

if index == len_data:
	print("Not found")


# in 演算子を使った実装
if x in Data:
	index = Data.index(x)
	print(f"Found: {index}") # Output: Found: 6
else:
	print("Not found")
 ```

# 2分探索法（Binary Search）
2分探索法は、ソートされたデータの集合から目的の要素を効率的に見つけるアルゴリズムです。データを中央で分割し、目的の要素が中央よりも左側にあれば左半分を、右側にあれば右半分を再帰的に探索します。

### 基本的な仕組み
1. データがソートされていることが前提です。まず、データの中央の要素を見ます
2. 中央の要素と目的の要素を比較します
3. もし中央の要素が目的の要素と一致すれば、探索は成功です
4. 一致しない場合は、目的の要素が中央の要素よりも小さいか大きいかによって、探索範囲を半分に絞ります
5. 残りの範囲に対して再帰的に探索を行います

### メリット・デメリット
2分探索法は、データがソートされている場合に非常に効率的です。しかし、データのソートには時間がかかる場合があります。

### 時間計算量
最悪時間計算量はO(log n)であり、大規模なデータセットでも迅速に探索が可能です。

### Pythonでの実装
```python
Data = [1, 3, 5, 7, 12, 17, 19, 25, 36, 55, 100, 101]
x = 25

# 手動での実装
left = 0
right = len(Data) - 1
mid = (left + right) // 2
while left <= right:
	if Data[mid] == x:
		print(f"Found: {mid}")
		break
	elif Data[mid] < x:
		left = mid + 1
	else:
		right = mid - 1
	mid = (left + right) // 2

if Data[mid] != x:
	print("Not found")
 ```

 ### bisect モジュールを使った実装
 bisect_left関数は、リストと与えられたデータに対して、2分探索法を用いてデータが挿入可能な位置を返す関数であり、既にデータがリスト内に存在する場合は、挿入位置はリスト内のデータが存在する位置となります。なお、挿入位置が最後になる（挿入するデータが一番大きい）場合について、リストの範囲外にアクセスしないように注意が必要です。
 ```python
 from bisect import bisect_left
index = bisect_left(Data, x)
if index != len(Data) and Data[index] == x:
	print(f"Found: {index}")
else:
	print("Not found")
 ```

# まとめと次回予告
今回は、探索アルゴリズムの基本である線形探索と2分探索法について紹介しました。線形探索はデータの先頭から順番に要素を比較し、目的の要素を見つける方法であり、シンプルで実装が容易ですが、大規模なデータセットでは効率が低いという特徴があります。一方、2分探索法はデータがソートされている場合に非常に効率的であり、最悪時間計算量がO(log n)となるため、大規模なデータセットでも素早く探索が可能です。

次回は、探索アルゴリズムの中でも特に効率的な **ハッシュ法** と **2分探索木** について詳しく見ていきます。
ハッシュ法はデータをハッシュ関数を用いてハッシュ値に変換し、そのハッシュ値をインデックスとして要素を格納する方法であり、高速な探索が可能です。また、2分探索木は2分探索法を応用したデータ構造であり、データの挿入や削除も効率的に行うことができます。どちらの手法も探索アルゴリズムの中でも重要な役割を果たしていますので、次回もお楽しみに！

それでは、次回もお会いしましょう！