OmniAICreator/Qiita-1.07M huggingface dataset:
google colabでssdのコードを動かしたい

## やりたいこと

- google colabでネットに落ちてたssdのコードを動かしたい
    - ****************自前のデータセットを学習させる****************という点が少しむずい

## エラー内容

trainメソッド実行時に発生

`TypeError: list indices must be integers or slices, not tuple`

和訳

リストの内容は整数かスライスでなければならない。タプルはNG

ふかぼり

trainを呼び出した後、

ssd_model.py > VOCDataset (Datasetsを作成するクラス) > pull_itemメソッドの3でエラーが起きてた

```python
def pull_item(self, index):
        '''前処理をした画像のテンソル形式のデータ、アノテーション、画像の高さ、幅を取得する'''

        # 1. 画像読み込み
        image_file_path = self.img_list[index]
        img = cv2.imread(image_file_path)  # [高さ][幅][色BGR]
        height, width, channels = img.shape  # 画像のサイズを取得

        # 2. xml形式のアノテーション情報をリストに
        anno_file_path = self.anno_list[index]
        anno_list = self.transform_anno(anno_file_path, width, height)

        # 3. 前処理を実施
        img, boxes, labels = self.transform(
            img, self.phase, anno_list[:, :4], anno_list[:, 4:])

        # 色チャネルの順番がBGRになっているので、RGBに順番変更
        # さらに（高さ、幅、色チャネル）の順を（色チャネル、高さ、幅）に変換
        img = torch.from_numpy(img[:, :, (2, 1, 0)]).permute(2, 0, 1)

        # BBoxとラベルをセットにしたnp.arrayを作成、変数名「gt」はground truth（答え）の略称
        gt = np.hstack((boxes, np.expand_dims(labels, axis=1)))

        return img, gt, height, width
```

## 調査

- ひとつづつprintして中身を確かめていった

```python

# class VOCDataset(data.Dataset)のpull_itemを1.2.3と追っていく
from utils.ssd_model import Anno_xml2list, VOCDataset, DataTransform

# 変数
xml_path = "~/manga109_path/frames/ARMS/003.xml"
width = 500
height = 500

# 1. 画像読み込み
img_file_path = train_dataset.img_list[0]
img = cv2.imread(img_file_path)
height, width, channels = img.shape
print("height, width, channels",height, width, channels)

# 2. xml形式のアノテーション情報をリストにする
anno_list = train_dataset.anno_list
print("anno_list:",anno_list)
classes = ["frame"]
transform_anno = Anno_xml2list(classes)
res = transform_anno.__call__(anno_list[100],width, height)
print("res:",res)

transform = DataTransform
print("transform:",transform)

# 3. 前処理を実施
# ここではわかりやすいように、ssd_model.pyのanno_list部分をresに変更している
img, boxes, labels = transform(img, res[:, :4], res[:, 4:])

# ↑↑ここでエラー発生?

```

## 原因

- 複数考えられる
    1. DataTransformメソッドの処理がおかしい
    2. anno_listの時点でxml2リストの変換に成功していない奴が時々ある

## 解決策

1. DataTransformメソッドの処理がおかしい
    1. こいつの中身を確認する
2. anno_listの時点でxml2リストの変換に成功していない奴が時々ある
    1. 失敗した奴を回避すれば良いのではないか？
1. **2次元配列のスライスの問題**?
    1. Numpyの形式での入力が想定されてるが、自作したのがPythonのリストだからかも。

## 参考

- ひつじさんのブログ記事
    
    [https://hituji-ws.com/code/python/python-od2/](https://hituji-ws.com/code/python/python-od2/)
東京メトロ7000系切換操作盤をリレーで制御する

東急ハンズや書泉で売られている東京メトロ7000系の切換操作盤を動かしてみます。
メトロ7000系切換操作盤は、ワンマンとツーマンをスイッチで切り替えるものになります。
# 全景
ワンマン・ツーマンのランプはAC100V、DC100Vどちらでも点灯が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ccbaa329-d749-9aa7-7cdd-64ac50d98577.png)
# 背面とコネクタ類
スイッチとランプはD101が共通になっているようですが、ランプは、ランプ、スイッチはスイッチのD101が存在するのが特徴です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/044c28fb-53af-4451-072d-0e097c7312d6.png)
# リレーでテスト
まずはリレーで回路を作ってみましょう。
リレーで回路を組む場合、コンセントからのAC100Vだけで構成することが可能です。
![リレーで組んだ例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/82545394-f5bb-54dc-e4a1-360ff814edc2.jpeg)
# 自己保持回路
今回は自己保持回路というものを作っています。
リレーの⑬と⑭が繋がるとリレーが駆動します
切スイッチは常時導通している状態になっており、スイッチを入れると非導通になるスイッチになります。
一度入スイッチを入れると切スイッチで切断するまで回路が保持されるます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8a2360c0-d10e-c6ca-1356-f371b1217304.png)
ワシ丸ドットコム!さんの動画で詳しく解説されています。
#### 【リレー回路】車側灯と運転士知らせ灯を車掌スイッチと連動させて操作してみた！

https://www.youtube.com/watch?v=BpId6cU6sSA

自己保持回路では回路を切断するスイッチが必要でしたが、切換操作盤はスイッチが2個しかない為、もう一方のスイッチのONで代替するのが今回の回路構成です。
回路を見てみましょう。
![回路図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/28518efa-6f4f-c2ea-41a9-19fc9155d1bd.png)
リレーに繋がるスイッチが繋がる事でリレーが駆動し、自己保持するようになるとともに、別のリレーを切断します。
3Dプリンタで作った筐体に組み込んだ様子です。
![内部](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/491df4da-f5d2-fc83-eb64-2bec9f9ac87b.jpeg)
# マイコンで組んだ場合
同じ内容をマイコンとリレーモジュールで作ってみます。
マイコンの場合は、コンセントからのAC100V以外にマイコンを動かすための5Vが必要になりますが
それ以外の配線は、写真の通り、少なくて済みます。
![マイコンで作った例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bc9a3467-0742-d1ac-ab51-ad762b770288.jpeg)
# リレーとマイコンどちらがいいのか？
よくリレーとマイコンどちらがいいかと聞かれることがありますが
リレーにはリレーの、マイコンにはマイコンの良さがあります。
今回のように、リレーだけで完結できる場合はリレーだけで完結する方が早いです。
ただし、もし、スイッチやランプがこれ以上増える場合は、マイコンとリレーモジュールで作った方が簡単かつ安価になります。
使用する電圧、電流などから何が簡単かつ安価にできるかで選定するといいと思います。
# 完成
最後にネジを締めたら完成です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b55b0889-e37f-1bc8-7192-d7b37da2f90d.jpeg)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">東京メトロ 7000系 切換操作盤をリレーで制御する <a href="https://t.co/pXc7kwejnp">pic.twitter.com/pXc7kwejnp</a></p>&mdash; usashirou (@usashirou1) <a href="https://twitter.com/usashirou1/status/1647723290037989376?ref_src=twsrc%5Etfw">April 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Rust】into()とinto_iter()の違い

## into()
`into`は、所有権を転送するために使用されるトレイトメソッドであり、引数を取り、**自身を別の型に変換**します。

## into_iter()
`into_iter`は、**所有権を維持**しながら要素を反復処理するために使用されるトレイトメソッドであり、**自身を反復可能なイテレータに変換**します。
【Paiza】大きい整数をエラトステネスの篩にかける

https://paiza.jp/works/mondai/prime_number_primer/prime_number_primer__eratosthenes

これに挑みました。

### そもそもエラトステネスの篩（ふるい）って何？

> 指定された整数以下の全ての素数を発見するための単純なアルゴリズムである。古代ギリシアの科学者、エラトステネスが考案したとされるため、この名がついている。

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9

上記ページには、アルゴリズムの内容が分かりやすいGIFアニメもあります。

### Github Copilotさんに聞いてみた

プログラミングの勉強にあたって、基礎知識に幅広く触れ、コードリーディングをつうじてアルゴリズムをよりたくさん身につけたい、と思っているので、根性に頼らずAI様に解かせてみました。 ~~副操縦士にメインパイロットさせとるやん、というツッコミは無しで。~~

```ruby:konna_kanji.rb
n = gets.to_i
is_prime = Array.new(n+1, true)
is_prime[0] = false
is_prime[1] = false

(2..n).each do |i|
  if is_prime[i]
    (2..n).each do |j|
      is_prime[i*j] = false if i*j <= n
    end
  end
end

puts is_prime[n] ? "YES" : "NO"
```

`予め配列の0、１にfalseを入れる` という仕様はpaizaの出題に合わせて実装しています。

2以上の整数iの倍数を、i == nに至るまで配列へ入れていくというコードですね。
`すでに配列[i]にfalseを入れてある場合はスキップする` という処理は私はすぐに思いつかなかったので、さすがAIといった感じです。

試しに `n = 1223` で計算した時、 `i * j` の部分をコンソールに出力してみたところ、

```console:出力結果
~~~
1085
1116
1147
1178
1209
1240
1271
1302
~~~
```

1223がないため、nは素数。ちゃんと機能していそうですね！

### …が、しかしnが大きい場合

paizaさんのところでは、テストケースとしてnに大きい整数を用意していました。ここでは仮に `n=400000` とします。（どこまで外部に情報を書いていいのか分からないので、すこしぼやかしています）

上記コードだと、この時に処理が重すぎて、制限時間（paizaさんのところでRuntime Error判定に使用している一定の時間）までに間に合いませんでした。

### ルートを使おう

今回のアルゴリズムに限らず、素数の判定には平方根を使うのが良いそうです。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11194625506

> 仮に、ある自然数Nが√Nより大きい素数Pを素因数に持っているとします。
その時、N=P×M（Mは自然数）と表すことができ、
このとき P>√N より M<√N
つまり P>M となります。
（中略）
つまり、Nが√Nより大きい素数を素因数に持つならば、
√N以下の素数で調べたときにすでに消去されているはずなのです。
（ベストアンサーより引用）

数学に強いわけではないのですが、 `√Nより大きい素数Pがある` ときに　`Nは、Pの何かしらの自然数Mの乗算で表すことができる` ため、今回のアルゴリズムでは `その自然数Mの倍数を先に見つけることができる` 、ということでしょうか。

```ruby:tatoeba.rb
def prime_factorization(number)
  prime_factors = []
  i = 2
  while i * i <= number
    while number % i == 0
      prime_factors << i
      number /= i
    end
    i += 1
  end
  prime_factors << number if number > 1
  prime_factors
end

prime_factorization(2446)
# => [2, 1223] 
# 1223は素数。今回だと、この「2」の倍数が、先に篩へ含まれることになる。
# 参考に↓
Math.sqrt(2446)
# => 49.457052075512955
# 2の12乗は4096なので、確かに49に至るまでに2446は先に網羅されているはずであろう。
```

### 計算量を抑えよう

修正したのがこちら。

```ruby:refactored_program.rb
n = gets.to_i
is_prime = Array.new(n+1, true)
is_prime[0] = false
is_prime[1] = false
# count = 0 <= 計算量の調査

(2..Math.sqrt(n).ceil).each do |i| # <= 変更点
  if is_prime[i]
    (2..n).each do |j|
      # count += 1 <= 計算量の調査
      is_prime[i*j] = false if i*j <= n
    end
  end
end

puts is_prime[n] ? "YES" : "NO"
```

これでpaizaさんが用意した `n = 400000` のケースも通りました。（Runtime Error→約1.5秒で完了という改善）

### 簡単に計算量を調査する

`n = 2446` の時、二重ループの内側に入った際に回数 `count` は36,675回 でした。

ループを行った総数は `Math.sqrt(n).ceil * n` = 122,300回なので、内側ループ手前の `if is_prime[i]` によるガードによって85,625回分の処理をスキップできています。ですが、それでもまあまあ膨れ上がりますね。（参考に `2446**2` は5,982,916）

すでにチューニング案を出したということで、これ以上の詮索はやめておきます。もう少しプログラミングが上達した際は、このアルゴリズムに関してさらなる速度向上を目指したいです。
乃木坂クイズアプリ開発①(Ruby)

***ruby***で乃木坂クイズアプリを開発しています。
まずは簡単に人数クイズから

```Ruby
# 新規作成 2023/4/17
# 乃木坂文字

str = "乃木坂46"
print "私は" + str + "が好きです" + "\n"

print "乃木坂46のメンバーの人数を入力してください"
num = gets.to_i

if num == 39
  print "正解です"
else
  print "不正解です"
end

```
email studio

[SFMCのまとめに戻る](https://qiita.com/Keiji_otsubo/items/f2ca9dce189979fe96f3)


# Personalize string

+ [Personalize string in email studio](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Os3I9)


```
%%[IF Empty([First Name]) THEN]%%
Member
%%[ELSE]%%
%%First Name%%
%%[ENDIF]%%
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4b16bcc1-a430-e1ea-71ea-ed7376d7c79c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f1136372-e8be-247f-40cf-f5e2d6551544.png)


**参考資料**

[Personalization Strings and AMPscript](https://developer.salesforce.com/docs/marketing/mark)


# e-mail studio がプレイグランドで使えない

+ [Can't find e-mail studio in the playground](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdzVc)

残念ながら、Marketing Cloud のデモ アカウントには簡単にアクセスできません。あなたの雇用主は Marketing Cloud を使用しているか、専用のデモ アカウントを利用できる Salesforce パートナー/ISV です: https://help.salesforce.com/s/articleView?id=000363671&type=1

それ以外は、現在、プラットフォームにアクセスするオプションはありません.

# Lists option have disappeared under Subscribers tab in Email Studio

+ [Lists option have disappeared under Subscribers tab in Email Studio](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajFjW)

:::note
You may already be aware, but if there are roles with explicit Deny selections due to permission settings, they will not appear in the list. It is recommended to first check the roles.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bf1bdfe1-48e2-f4db-564d-bdcf17d59e25.png)

If this is not the cause, are other internal users experiencing the same inability to view? If so, consulting support might be advisable. If others can view, it is likely due to role-based viewing permissions.
:::
AWS WAFとは

## AWS WAFとは
AWS WAF（Web Application Firewall）はAWSが提供するWebアプリケーションのセキュリティを強化するためのサービスです。
不正なトラフィックや攻撃を検知し、Webアプリケーションを保護するための多様な機能を提供しています。

AWS WAFは、アプリケーション層での攻撃を防ぐことができます。
例えば、SQLインジェクションやクロスサイトスクリプティング（XSS）などの攻撃を検知し、ブロックすることができます。
また独自のカスタムルールを作成してアプリケーションに特化したセキュリティ対策を実装することもできます。

AWS Marketplaceで提供されている多数のAWS WAFルールセットを利用することもできます。
これらのルールセットは、AWS WAFを使用することで簡単に適用でき、アプリケーションをさらに保護することができます。

## AWS WAF 用語説明
以下に、AWS WAFで使用される用語について説明します。

- Web ACL（Web Access Control List）: AWS WAFで定義されたセキュリティ規則の集合です。Web ACLは、HTTPリクエストを受信して、定義されたルールに基づいて、そのリクエストを許可またはブロックします。

- ルール: AWS WAFで使用されるルールは、HTTPリクエストの特定の属性を検査し、正規表現や文字列一致などの条件に基づいて、そのリクエストを許可またはブロックするルールです。

- マネージドルール: AWS WAFで提供される事前定義されたルールセットです。これらのルールは、AWS WAFを使用することで簡単に適用でき、一般的な攻撃パターンからアプリケーションを保護することができます。

- コンディション: AWS WAFルールの一部で、HTTPリクエストを評価するために使用される条件です。条件には、IPアドレス、HTTPヘッダー、URIパス、およびその他のHTTPリクエスト属性が含まれます。

- アクション: AWS WAFルールで実行されるアクションです。例えば、リクエストをブロックするアクション、またはリクエストを許可するアクションがあります。

- レートベースのルール: リクエストレートに基づいて、不正なトラフィックをブロックするために使用されるAWS WAFルールです。例えば、特定のIPアドレスからの異常な量のリクエストをブロックすることができます。

- 独自のカスタムルール: AWS WAFで作成された独自のルールです。カスタムルールを使用することで、特定のアプリケーションのセキュリティに焦点を当てたルールを作成することができます。
wemosでlcdkeypad その6

# 概要
wemos d1で、lcdkeypadを使ってみた。
練習問題、やってみた。

# 練習問題
カタカナを表示せよ。

# 写真

![lcd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dc610249-47ed-106d-d5be-7199453dca19.png)

# asciiコード



|上位4bit|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|0xA|	|	｡|	｢|	｣|	､|	･|	ｦ|	ｧ|	ｨ|	ｩ|	ｪ|	ｫ|	ｬ|	ｭ|	ｮ|	ｯ|
|0xB|	ｰ|	ｱ|	ｲ|	ｳ|	ｴ|	ｵ|	ｶ|	ｷ|	ｸ|	ｹ|	ｺ|	ｻ|	ｼ|	ｽ|	ｾ|	ｿ|
|0xC|	ﾀ|	ﾁ|	ﾂ|	ﾃ|	ﾄ|	ﾅ|	ﾆ|	ﾇ|	ﾈ|	ﾉ|	ﾊ|	ﾋ|	ﾌ|	ﾍ|	ﾎ|	ﾏ|
|0xD|	ﾐ|	ﾑ|	ﾒ|	ﾓ|	ﾔ|	ﾕ|	ﾖ|	ﾗ|	ﾘ|	ﾙ|	ﾚ|	ﾛ|	ﾜ|	ﾝ|	ﾞ|	ﾟ|



# サンプルコード

```
#include <LiquidCrystal.h>

LiquidCrystal lcd(0, 2, 4, 14, 12, 13);
char hello[] = { 
	0xca,
	0xdb,
	0x2d,
	0x20,
	0xdc,
	0x2d,
	0xd9,
	0xc4,
	0xde,
	0x21
};

void setup() {
	lcd.begin(16, 2);
	lcd.setCursor(0, 0);
	lcd.print(hello);
}
void loop() {
	delay(100);
}



```

以上。
wemosでlcdkeypad その5

# 概要
wemos d1で、lcdkeypadを使ってみた。
練習問題、やってみた。

# 練習問題
時計を表示せよ。

# サンプルコード

```
#include <LiquidCrystal.h>
#include <ESP8266WiFi.h>
#include <TZ.h>

const char * ssid = "****";
const char * password = "****";

LiquidCrystal lcd(0, 2, 4, 14, 12, 13);
void setup() {
	lcd.begin(16, 2);
	lcd.setCursor(0, 0);
	lcd.print("Hello World!");
	WiFi.begin(ssid, password);
	Serial.println("");
	while (WiFi.status() != WL_CONNECTED)
	{
		delay(500);
		Serial.print(".");
	}
	Serial.println("");
	Serial.print("Connected to ");
	Serial.println(ssid);
	Serial.print("IP address: ");
	Serial.println(WiFi.localIP());
	lcd.setCursor(0, 0);
	lcd.print("IP address: ");
	lcd.setCursor(0, 1);
	lcd.print(WiFi.localIP());
	configTime(TZ_Asia_Tokyo, "pool.ntp.org");
}
void loop() {
	time_t t = time(NULL);
	struct tm * tm = gmtime(&t);
	time_t t2 = mktime(tm) + 3600;
	struct tm * tm2 = localtime(&t2);
	Serial.print("asctime: ");
	Serial.println(asctime(tm2));
	lcd.setCursor(0, 0);
	lcd.print(asctime(tm2));
	delay(1000);
}




```

以上。
wemosでntp

# 概要
wemos d1で、ntpを使ってみた。

# サンプルコード

```
#include <ESP8266WiFi.h>
#include <TZ.h>

const char * ssid = "****";
const char * password = "****";

void setup(void) {
	Serial.begin(115200);
	WiFi.begin(ssid, password);
	Serial.println("");
	while (WiFi.status() != WL_CONNECTED) 
	{
		delay(500);
		Serial.print(".");
	}
	Serial.println("");
	Serial.print("Connected to ");
	Serial.println(ssid);
	Serial.print("IP address: ");
	Serial.println(WiFi.localIP());
	configTime(TZ_Asia_Tokyo, "pool.ntp.org");
}
void loop(void) {
	static const char * wd[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
	time_t t = time(NULL);
	struct tm * tm = gmtime(&t);
	char buff[12];
	sprintf(buff, "%04d/%02d/%02d(%s) ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, wd[tm->tm_wday]);
	Serial.print("gmtime: ");
	Serial.print(buff);
	sprintf(buff, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
	Serial.println(buff);
	time_t t2 = mktime(tm) + 3600;
    struct tm * tm2 = localtime(&t2);
	Serial.print("asctime: ");
	Serial.println(asctime(tm2));
	time_t now = time(nullptr);
	Serial.print("Local time: ");
	Serial.println(ctime(&now));
	delay(3000);
}





```

以上。
文字列をShift-JISでエンコードしたい

jsでテキストのエンコードデコードをしたいときに便利なのがTextEncoderとTextDecoderクラス
TextDecoderは文字コードを指定してUint8ArrayからStringにデコードできる
TextEncoderはStringからUint8Arrayにエンコードできるが文字コードはutf-8のみである
shift-jisでエンコードしたいときはその手のライブラリに頼るのが一般的
せっかくTextDecoderがあるのでなんとかしたいというお話

```js
const
sjis=class{
	constructor(){
		this.e={};this.d={};
		((td=new TextDecoder('sjis'),f=w=>(_=>
			_.length==1&&_!='�'&&(this.e[_]=w).reduce((a,x,i,{length:l})=>(i==l-1?a[x]=_:a[x]||(a[x]={})),this.d)
		)(td.decode(new Uint8Array(w))))=>[...Array(238)].forEach((_,i)=>
			i<191?f([i+(i<128?0:0xa1-128)]):[...Array(188)].forEach((_,j)=>f([i-191+(i-191<31?0x81:0xe0-31),j+0x40+(62<j)]))
		))();
		return this;
	}
	encode(w){return[...w].flatMap(x=>this.e[x]);}
	decode(w){return w.reduce((a,x)=>(x=a.x[x],x.length?(a.a+=x,a.x=this.d):a.x=x,a),{a:'',x:this.d}).a;}
};
```
this.e, this.dがそれぞれエンコードとデコード用のテーブル
constructorの中でshift-jisのTextDecoderを作成し
[wiki](https://ja.wikipedia.org/wiki/Shift_JIS)を参考に全ての文字の位置をf()に渡してテーブルを作成している
テーブルの作成や参照にreduceを使っている

多分同じ手法で他の文字コードもエンコードできるようになる
wemosでlcdkeypad その4

# 概要
wemos d1で、lcdkeypadを使ってみた。
練習問題、やってみた。

# 練習問題
全キャラクタを表示せよ。

# サンプルコード

```
#include <LiquidCrystal.h>

LiquidCrystal lcd(0, 2, 4, 14, 12, 13);
int i = 0;
void setup() {
	lcd.begin(16, 2);
	lcd.setCursor(0, 0);
	lcd.print("Hello World!");
}
void loop() {
	int j;
	int adc;
	adc = analogRead(A0);
	if (adc > 0 && adc < 30)
	{
		//lcd.printf("RIGHT");
	}
	if (adc > 30 && adc < 300)
	{
		//lcd.printf("UP   ");
		i++;
		if (i > 15)
			i = 15;
	}
	if (adc > 400 && adc < 600)
	{
		//lcd.printf("DOWN ");
		i--;
		if (i < 0)
			i = 0;
	}
	if (adc > 700 && adc < 1000)
	{
		//lcd.printf("LEFT ");
	}
	if (adc > 1000) 
	{
		//lcd.printf("     ");
	}
	lcd.setCursor(0, 0);
	for (j = 0; j < 16; j++) 
	{
		lcd.write(byte(i * 16 + j));
	}
	lcd.setCursor(0, 1);
	for (j = 0; j < 16; j++) 
	{
		lcd.write(byte((i + 1) * 16 + j));
	}
	delay(100);
}




```

以上。
wemosでlcdkeypad その3

# 概要
wemos d1で、lcdkeypadを使ってみた。
練習問題、やってみた。

# 練習問題
wifi接続時、ipアドレスを表示せよ。

# サンプルコード

```
#include <LiquidCrystal.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

const char * ssid = "****";
const char * password = "****";
LiquidCrystal lcd(0, 2, 4, 14, 12, 13);
void setup() {
	lcd.begin(16, 2);
	lcd.setCursor(0, 0);
	lcd.print("Hello World!");
	WiFi.begin(ssid, password);
	Serial.println("");
	while (WiFi.status() != WL_CONNECTED)
	{
		delay(500);
		Serial.print(".");
	}
	Serial.println("");
	Serial.print("Connected to ");
	Serial.println(ssid);
	Serial.print("IP address: ");
	Serial.println(WiFi.localIP());
  	lcd.setCursor(0, 0);
	lcd.print("IP address: ");
  	lcd.setCursor(0, 1);
	lcd.print(WiFi.localIP());
}
void loop() {
	delay(100);
}




```

以上。
wemosでlcdkeypad その2

# 概要
wemos d1で、lcdkeypadを使ってみた。
練習問題、やってみた。

# 練習問題
キーパッドを読め。

# サンプルコード

```
#include <LiquidCrystal.h>

LiquidCrystal lcd(0, 2, 4, 14, 12, 13);//wemos

void setup() {
	lcd.begin(16, 2);
	lcd.setCursor(0, 0);
	lcd.print("Hello World!");
}
void loop() {
	int j;
	int adc;
	adc = analogRead(A0);
	lcd.setCursor(11, 1);
	lcd.printf("    ");
	lcd.setCursor(11, 1);
	lcd.print(adc);
	lcd.setCursor(1, 1);
	if (adc > 0 && adc < 30)
	{
		lcd.printf("RIGHT");
	}
	if (adc > 30 && adc < 300)
	{
		lcd.printf("UP   ");
	}
	if (adc > 400 && adc < 600)
	{
		lcd.printf("DOWN ");
	}
	if (adc > 700 && adc < 1000)
	{
		lcd.printf("LEFT ");
	}
	if (adc > 1000) 
	{
		lcd.printf("     ");
	}
	delay(100);
}




```

以上。
セキュリティの基本：IDSについて

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回は具体的なIDSの動きについて更に詳しく調べてみましょう！
![インスタスライド_2023032801.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/89568704-d76a-6266-6b33-1793d724bd52.gif)

# IDSとは
IDSは不正アクセスを検知し通知する役割があります。 

不正アクセスを検知する方法には、シグネチャ型とアノマリ型があります。

# シグネチャ型とアノマリ型
- シグネチャ型
    正常パターンを登録し、範囲から外れた場合に異常検知とする。ホワイトリスト方式。

- アノマリ型
    不正パターンを登録し、該当アクセスを異常検知とする。ブラックリスト方式。

# IDSの利用
ネットワーク型IDS
- ＤＭＺセグメント全域を監視
- 社内の期間システムを流れるパケットを監視
- トロイの木馬などを含む社内LANからの不正侵入を監視
- ファイア･ウォールが正常に動作しているか、攻撃の兆候そのものがないかをチェック

ホスト型IDS
- ファイル･サーバーやWebサーバーなど、情報の漏洩や改竄を防止。
# まとめ
- IDSは不正アクセスを検知し通知する
- シグネチャ型とアノマリ型がある
- 利用の仕方おして、ネットワーク型とホスト型がある

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
wemosでlcdkeypad

# 概要
wemos d1で、lcdkeypadを使ってみた。


# 写真
![CIMG2524.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/42fb0a68-1a40-dc0e-3867-d6571a238e74.jpeg)

# ピン配置


| wemos      |    shield    |
|:-----------------|:-----------|
| A0          |  keypads     |   
| D10 | back light|
| D9 |  enble|
|D8|RS|
|D7|DB7|
|D6|DB6|
|D5|DB5|
|D4|DB4|

# サンプルコード

```
#include <LiquidCrystal.h>

LiquidCrystal lcd(0, 2, 4, 14, 12, 13);//wemos

void setup() {
	lcd.begin(16, 2);
	lcd.setCursor(0, 0);
	lcd.print("Hello World!");
}
void loop() {
    delay(100);
}
```

以上。
【PHP】スーパークラス(親クラス)と子クラス【オブジェクト指向】

## はじめに、オブジェクト指向とは
クラスを作り、そのインスタンスを作っていくことで、プログラムを組み立てていく考え方。
まず、”スーパークラス”を作り、それを継承させて子クラスをいくつか作り、その子クラスをインスタンス化して利用していくことで、プログラムを作っていく。

## スーパークラスとは
まず初めに定義するクラス。
全ての子クラスの親。
ここには、子クラスで使い回すことを想定して、よく使う汎用的なメソッドやプロパティを書く。
スーパークラス自体をインスタンス化することは稀で、一般的には、スーパークラスを継承させて子クラスを作り、その子クラスからインスタンスを作成していく。
スーパークラスは、継承されることが前提とされたクラスであり、単体で使用されることはあまりない。

#### スーパークラスのコンストラクタに書くことの具体例
・ワンタイムトークンの生成
　ー CSRF対策が必要な場面はたくさんあるので（フォーム送信時が代表的）、トークンを発行する処理は汎用的にしておいたほうがいい。
・バリデーションのエラーメッセージをオブジェクト形式に変換
　ー どの入力欄に対してどんなエラーメッセージを表示させるのかを、オブジェクト形式で保存しておきたい。対象ごとに出力する内容を変えたいので。
・フォームの送信内容をオブジェクト形式に変換
　ー バリデーションと同様に、どの入力欄に対してどんな値が入力されたのかを、オブジェクト形式で保存しておきたい。

など。

#### スーパークラスのコンストラクタ以外で定義するメソッドの具体例
・セッター
・ゲッター
・エラーチェック
・ログイン確認

など。

## 子クラスとは
スーパークラスを継承して作るクラス。
汎用的なスーパークラスを拡張することで、特化した機能を実装することができる。
2023/4/17主にITとかセキュリティの記事

セキュリティーも「検査」「隔離」「予防」が重要、3つのツールで守る(4/14)
https://active.nikkeibp.co.jp/atcl/act/19/00460/031300003/

北朝鮮のサイバー攻撃グループによる「デスノート」キャンペーン、標的広げて進行中(4/15)
https://news.mynavi.jp/techplus/article/20230415-2653695/

マネーロンダリング対策 国際会合 暗号資産盗難など対応強化へ(4/15)
https://www3.nhk.or.jp/news/html/20230415/k10014039191000.html

埼玉県警がSNSなどの専門家を顧問に　サイバー犯罪への対処能力強化へ(4/14)
https://news.yahoo.co.jp/articles/2add629ace132fefdc1d0bd59747b560e7498d1a

サポート詐欺、被害続々　「パソコンがウイルス感染」偽警告　石川県内で実害５件、３４６万円(4/15)
https://www.hokkoku.co.jp/articles/tym/1043189

「TikTok」はなぜアメリカで“激烈に攻撃”されたのか…？ 「圧迫公聴会」のウラにある現実(4/15)
https://gendai.media/articles/-/108684
bitnami-redmine-4.2.1-2 を redmine-5.0.5 にアップグレード

bitnamiで作ったredmineもそろそろバージョンアップしてえなぁ、となりました。
一番楽そうな方法を模索した結果、こんな感じではないかと思ったので備忘録がてら書いておきます。

## 前提

* bitnami-redmine-4.2.1-2-linux-x64-installer.runでインストールしたやつをアップグレード
* Redmineは5.0.5にアップグレード


## 最初に

bitnamiはmysqlもrubyも全部インストールしてくれます。
それらのパスを最優先させるために、以下のおまじないをします。

```
$ source /opt/redmine/use_redmine
```

## バックアップ

何かあったら戻すのでまずはバックアップ。
mysqlのパスワードはbitnaminiインストール時に最初に入力したやつ。

```
$ . /opt/redmine/use_redmine
$ mysqldump -u root -p  bitnami_redmine >  /tmp/redmine_dump.sql
```

## Redmine4 から 5へアップグレード

最初にredmineのパスへ移動します。

```
$  cd /opt/redmine/apps/redmine
```

既存のパスをリネームしてredmine5をダウンロード。

```
$ mv htdocs htdocs.old
$ wget https://github.com/redmine/redmine/archive/refs/tags/5.0.5.tar.gz
$ tar xvzf 5.0.5.tar.gz
$ mv redmine-5.0.5/ htdocs
```

あとは依存するものを更新して、セッションストアの秘密鍵を更新。

```
$ cd htdocs
$ bundle install --without development test
$ bundle exec rake generate_secret_token
$ bundle update
```

`bundle exec rake generate_secret_token`時にこのエラーになったら、Gemfileに`gem 'concurrent-ruby', '1.3.4'`を適当にいれておくｋ
```
$ bundle exec rake generate_secret_token
rake aborted!
NameError: uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger
/opt/ow/apps/redmine/htdocs/config/application.rb:5:in `require'
/opt/ow/apps/redmine/htdocs/config/application.rb:5:in `<top (required)>'
/opt/ow/apps/redmine/htdocs/Rakefile:5:in `require'
/opt/ow/apps/redmine/htdocs/Rakefile:5:in `<top (required)>'
/opt/ow/ruby/bin/bundle:23:in `load'
/opt/ow/ruby/bin/bundle:23:in `<main>'
(See full trace by running task with --trace)
```

もとの設定ファイルをコピーして マイグレーション。

```
$ cp -pv ../htdocs.old/config/database.yml  config/
$ cp -pv ../htdocs.old/config/configuration.yml  config/
$ bundle exec rake db:migrate RAILS_ENV=production
$ bundle exec rake tmp:cache:clear RAILS_ENV=production
```

ファイルやテーマをコピー。

```
$ cp -prv ../htdocs.old/files/* files/
$ cp -prv ../htdocs.old/public/themes/* public/themes/
```

bitnamiは権限が`root:daemon`なので変更しておく。

```
$ chown -R root:daemon .
```


~~サブディレクトリの場合はconfig/environmet.rbに`RedmineApp::Application.routes.default_scope = "/redmine"`を追加~~

動かないpluginがあったので別の方法で対応。
bitnamiのパッケージはPassengerもついているので`/opt/redmine/apps/redmine/conf/httpd-app.conf` に`PassengerBaseURI`を追加。

```apache
RewriteEngine On
RewriteRule /<none> / [L,R]

<Directory "/opt/redmine/apps/redmine/htdocs/public">
    Options -MultiViews
    AllowOverride All
    <IfVersion < 2.3 >
        Order allow,deny
        Allow from all
    </IfVersion>
    <IfVersion >= 2.3>
        Require all granted
    </IfVersion>

    PassengerEnabled on
    SetEnv RAILS_RELATIVE_URL_ROOT "/redmine"
    PassengerAppRoot "/opt/redmine/apps/redmine/htdocs/"
    PassengerBaseURI "/redmine"
    <IfModule pagespeed_module>
        ModPagespeedDisallow "*"
    </IfModule>

    Include "/opt/redmine/apps/redmine/conf/banner.conf"
</Directory>
```

## 再起動

再起動して終わり。

```
$ /opt/redmine/ctlscript.sh restart
```
5GのユースケースとMicrosoftの提供する5Gソリューションの概要

## 概要

#### 前提
本記事はMicrosoft社Azure Strategic Missions MarketingのGMであるJoe Biron氏のブログ ”How 5G and wireless edge infrastructure power digital operations with Microsoft(https://azure.microsoft.com/en-us/blog/how-5g-and-wireless-edge-infrastructure-power-digital-operations-with-microsoft/)” (2023/4/13)を日本語でまとめたものです。

#### 概要

5G、マルチアクセスコンピューティング(MEC)の可用性が進化する昨今においてどのようなケースで5Gが利用されMicrosoftが何を提供しているかを紹介します。

## 5Gは何を提供するか

デバイスがサーバーの要求に応答するためにより高いスループットと100ミリ秒以下の遅延を実現できます。ただし、5Gは単なるネットワークのアップグレードに留まらず、従来実現できなかった問題を解決できる新しいネットワークインテリジェントアプリケーションの到来を告げています。
5Gを使用することでクラウドネイティブの分散アーキテクチャに基づくエッジアプリケーションを構築し、低遅延と専用のサービス品質を必要とするソリューションを実現できます。

5Gアーキテクチャはローバンド、ミッドバンド、ミリ波（mmWave）の層があり、距離や速度にそれぞれ異なった長所と短所が存在します。次の主要な5Gサービスはそれぞれの機能の提供に特化しています。
+ Enhanced mobile broadband (eMBB): データ転送速度の最小レベルを定義することにより、仮想現実、コンピュータビジョン、および大規模なビデオストリーミングを処理する超高ワイヤレス帯域幅機能を提供するサービス。
+ Massive machine-type communications (mMTC): 多数のデバイスを相互に接続する必要があるシナリオや環境向けのサービス。
+ Ultra-reliable low-latency communications (URLLC): パブリックセーフティや緊急時の応答、遠隔医療、産業オートメーション、スマートエネルギーグリッド、自動運転など非常に低い遅延と高い高信頼性を必要とするユースケースに適したサービス。

## 5Gはどのように企業で使用されているか

#### 工場

製品の梱包におけるコンピュータビジョンによる補助や、ミスに関するリアルタイムに近いデータの収集をすることで品質を改善し、処理時間を短縮します。

#### ヘルスケア

医療診断、ヘルスモニタリング、医療システムの予知保全と監視、遠隔医療アプリケーションにおけるAIの使用をサポートします。

#### 小売り

低遅延の接続により、AIを活用したリアルタイムの在庫管理、店舗のビデオ監視、店舗内のリアルタイムオファーを支援します。

## Microsoftは5Gソリューションをどのように強化しているか

顧客のユースケースに合わせて簡単に5Gインフラを提供できるようにするためにAzure Private muti-access edge compute (MEC)サービス(https://azure.microsoft.com/en-us/solutions/private-multi-access-edge-compute-mec/#overview) を提供しています。

## 所感

5Gはそれ単体では低遅延性と高信頼性を提供するネットワークソリューションだが、アプリケーションも含めて統合的に設計することが重要であり、難しいところだと感じた。5Gインフラを自前で用意することはコストや実装面ともにかなりハードルが高いはずなのでAzure Private MECのようなソリューションを活用することは理にかなっており、ポイントはその際のAzure全体の設計だろう。近しい記事を見かけ次第またまとめてみたい。
【PHP】クラス、メソッド、インスタンスなどについて【オブジェクト指向】

以下を端的に説明します。
1. クラス
1. メソッド
1. プロパティ
1. インスタンス化
1. オブジェクト
1. 継承
1. コンストラクタ

## 0. オブジェクト指向
プログラミングやソフトウェア設計において、システムを「オブジェクト」と呼ばれる部品に分解し、それらのオブジェクト間の相互作用を重視する手法。
各オブジェクトはデータとメソッド（ふるまい）を持ち、他のオブジェクトとやり取りを行いながら機能を実現する。

たとえば、車には「ファミリーカー」「スポーツカー」「キャンピングカー」など、さまざまな種類があり、さらにメーカーや車種で細分化されるが、それらは共通の「自動車」という概念を持つ。
この「自動車」にあたるものが、クラス（スーパークラス）で、種別や車種にあたるものが、インスタンスである。

## 1.  クラス
よく使う処理...メソッド（関数）を取りまとめたもの。
使う際は、コピー（インスタンス）を作る。

## 2.  メソッド
クラス内に書かれた関数

## 3.  プロパティ
クラス内に書かれた変数

## 4.  インスタンス化
実体化。クラスを実際に使う。クラスを呼び出す。クラスのコピーを生成する。
予め用意されているクラス（オブジェクト）をもとに、新たなクラス（オブジェクト）を生成する。
new \クラス名

## 5.  オブジェクト
PHPにおいては、オブジェクト＝インスタンス。

## 6.  継承
新しいクラスを生成する際に、前のクラスのプロパティやメソッドも使えるようにすること。
元となるクラスを「親クラス」、新たに作るクラスを「子クラス」という。
親が持っている処理を受け継がせて、子は子で新たな処理を作っていく。
子クラスは、親クラスの関数を自由に使えるうえに、新たな処理を書くこともできる。

## 7.  コンストラクタ
PHPで用意されている関数。関数名は、__construct。
インスタンス化した際、自動で実行される関数のこと。元のクラスに書いておく。
継承したクラスをインスタンス化した場合でも自動で実行される。
つまり全ての親となるクラスにあるコンストラクタは、すべてのインスタンスで実行されることになる。
someones/package vX.X.X requires ext-crypto * but it is not present.

https://github.com/bukka/php-crypto

http://pecl.php.net/package/crypto/0.3.2/windows

DLLダウンロード▷コピー
path/to/php/ext/php_crypto.dll (※.pdb)

```diff_php.ini
#追加
extension=php_crypto.dll
```

```phpinfo
...
crypto
Crypto Support	enabled
Crypto Version	0.3.2
OpenSSL Library Version	OpenSSL 1.1.1p 21 Jun 2022
OpenSSL Header Version	OpenSSL 1.1.1m 14 Dec 2021
...
```
Amazonの20年以上の経験が生んだファウンデーションモデル、「Amazon Titan」とは？

Amazon Titanは、Amazonが提供する強力なファウンデーションモデル（FMs）の一つで、自然言語処理や画像生成などのタスクを効率的に行うことができるAIモデルです。Amazon Bedrockを通じて、開発者はAmazon Titanを簡単に利用できます。Amazon Titanは大規模なデータセットで事前学習されており、様々なタスクに適用可能です。

Amazon Bedrockについてはこちらの記事「<a href="https://recipe.kc-cloud.jp/archives/18823/">多様なAIニーズに応えるAmazon Bedrock：ファウンデーションモデルの統合力</a>」を参照ください。
<h2>Amazon Titanの特徴</h2>
<ol>
 	<li><strong>要約やテキスト生成などの自然言語タスクを自動化</strong>
Titan Textは、要約、テキスト生成（例:ブログ記事の作成）、分類、オープンエンドのQ&amp;A、情報抽出などのタスクに適した生成型大規模言語モデル（LLM）です。</li>
 	<li><strong>検索の精度向上とパーソナライズされたレコメンデーションの改善</strong>
Titan Embeddingsは、テキスト入力（単語、フレーズ、または大きなテキスト単位）をセマンティックな意味を持つ数値表現（エンベディングとして知られる）に変換するLLMです。このLLMはテキストを生成しませんが、エンベディングを比較することで、単語マッチングよりも関連性があり、文脈的な応答を提供できるため、パーソナライゼーションや検索などのアプリケーションに役立ちます。</li>
 	<li><strong>AIの責任ある使用をサポートし、不適切または有害なコンテンツを減らす</strong>
Titan FMは、データ内の有害なコンテンツを検出・削除し、ユーザー入力内の不適切なコンテンツを拒否し、不適切なコンテンツ（ヘイトスピーチ、暴言、暴力など）を含むモデル出力をフィルタリングするように構築されています。</li>
 	<li><strong>20年以上のML経験をベースに構築</strong>
Amazonでは、過去20年以上にわたってAIとMLに注力しており、Amazonが提供する多くの機能はMLによって支えられています。AmazonにはMLに専念する何千人ものエンジニアがおり、過去の経験、現在の考え方、そして未来においても大きな役割を果たしています。Amazon Titanモデルは、Amazonの何十年にもわたる経験を活用して、MLを使用したいすべての人にアクセスできるように構築されています。</li>
</ol>
<h2>Amazon Bedrockに対応しているもう1つのファウンデーションモデル AI21 Labsとの比較</h2>
Amazon TitanとAI21 LabsのJurassic-2は、どちらも高性能なファウンデーションモデル（FMs）ですが、それぞれに独自の特徴と強みがあります。
<h3>Amazon Titan：</h3>
<ol>
 	<li>Amazonが提供するファウンデーションモデルで、Amazonの長年の機械学習（ML）経験を活用して構築されています。</li>
 	<li>主に自然言語処理タスクに特化しており、要約、テキスト生成、分類、オープンエンデッドなQ&amp;A、情報抽出などのタスクに適用可能です。</li>
 	<li>責任あるAI使用をサポートし、不適切や有害なコンテンツの検出と削除を行います。</li>
</ol>
<h3>AI21 LabsのJurassic-2：</h3>
<ol>
 	<li>AI21 Labsが提供するファウンデーションモデルで、高品質な自然言語処理（NLP）タスクを目的として開発されています。</li>
 	<li>多言語対応の大規模言語モデルで、スペイン語、フランス語、ドイツ語、ポルトガル語、イタリア語、オランダ語などの言語に対応しています。</li>
 	<li>高性能で、最先端のゼロショット指示に対応し、軽量なフットプリントを提供します。</li>
</ol>
それぞれのモデルは、異なる目的やタスクに応じて選択できるように設計されており、Amazon Bedrockを通じて利用できます。開発者は、自分のニーズに合ったモデルを選択して、最適な結果を得ることができます。
<h2>Amazon Titanに期待されること</h2>
情報がまだ少ないですが、Amazon Titanに期待されることは以下のような点が考えられます。AWSが開発していることを考慮すると：
<ol>
 	<li>シームレスな統合：AWSサービスとのシームレスな統合が期待されます。これにより、開発者は迅速かつ容易にAmazon Titanを既存のインフラストラクチャやアプリケーションに組み込むことができるでしょう。</li>
 	<li>進化する機能：Amazon Titanは、AWSの機械学習分野での長年の経験に基づいて開発されています。そのため、将来的には機能が進化し、より多くのタスクや用途に対応できるようになることが期待されます。</li>
 	<li>カスタマイズと拡張性：AWSのツールや機能との連携により、開発者はAmazon Titanを自分たちのニーズに合わせてカスタマイズし、拡張することができるでしょう。</li>
 	<li>他のファウンデーションモデルの補填：Amazon Bedrockの特徴である複数のファウンデーションモデルを活用することで、Amazon Titanが他のFMが補完できない部分をカバーし、より強力なサービスが実現されます。</li>
</ol>
これらの点を考慮すると、Amazon Titanは、多様なニーズに対応できる高性能なAIサービスとして、今後の発展が期待されます。
多様なAIニーズに応えるAmazon Bedrock：ファウンデーションモデルの統合力

<img src="https://recipe.kc-cloud.jp/wp-content/uploads/2023/04/redrock-1024x247.png" alt="" width="1024" height="247" class="alignnone size-large wp-image-18824" />

Amazon Bedrockとは、AI技術の最先端を活用した革新的なプラットフォームです。このサービスは、ファウンデーションモデル（FMs）を用いたAIアプリケーションの開発を手軽に実現し、多くの開発者に利用可能にすることを目指しています。今回の記事では、Amazon Bedrockの特徴や機能、さらには利用者が得られるメリットなどをわかりやすく解説します。
<h2>Amazon Bedrockの特徴</h2>
Amazon Bedrockは、AIアプリケーション開発を容易にするための革新的なプラットフォームです。その主な特徴は以下のとおりです。
<ol>
 	<li>多様なファウンデーションモデル（FMs）の選択肢: AI21 Labs、Anthropic、Stability AI、そしてAmazon自身が開発したファウンデーションモデルを利用することができます。これにより、あなたのニーズに最適なモデルを見つけることができます。</li>
 	<li>インフラ管理の手間を省くAPI: Amazon BedrockはAPIを通じてFMsを提供しており、開発者はインフラ管理の手間をかけずにAIアプリケーションを開発できます。</li>
 	<li>組織のデータを使ったプライベートカスタマイズ: Amazon Bedrockでは、組織独自のデータを使ってFMsをカスタマイズすることができます。これにより、独自のニーズに合わせたAIアプリケーションを開発できます。</li>
 	<li>AWSのツールと連携: 開発者が既に使い慣れているAWSのツールや機能との連携が容易で、安全かつ信頼性の高いAIアプリケーションの開発・運用が可能です。</li>
</ol>
Amazon Bedrockは、これらの特徴を活かして、開発者が効率的に高性能なAIアプリケーションを構築・スケールできるようサポートします。
<h2>ファウンデーションモデル（FMs）とは</h2>
ファウンデーションモデル（FMs）とは、AI技術の一種で、大規模なデータセットを事前学習することで、さまざまなタスクやアプリケーションに対応できる柔軟性を持ったモデルのことを指します。これらのモデルは、自然言語処理（NLP）、画像認識、音声認識など、多くのドメインで応用が可能です。

ファウンデーションモデルは、一般的に以下のような特徴を持っています：
<ol>
 	<li>大規模なデータセットで事前学習される：FMsは、インターネット上のテキストや画像など、膨大な量のデータを使用して学習されます。このため、広範囲のタスクや問題に対処できる汎用性があります。</li>
 	<li>転移学習に適している：FMsは、特定のタスクに対応するために、独自のデータセットを使って簡単にファインチューニングが可能です。これにより、モデルの精度を向上させることができます。</li>
 	<li>効率的な学習：FMsは、効率的に学習することができ、新しいタスクに対応するために必要なデータ量や計算リソースを削減することができます。</li>
 	<li>複数のタスクに適用可能：FMsは、自然言語処理、画像認識、音声認識など、さまざまなドメインで使用することができます。また、生成、分類、予測など、多様なタスクに適用可能です。</li>
</ol>
ファウンデーションモデルは、AI技術を活用する企業や開発者にとって、効率的に高性能なAIアプリケーションを構築するための重要なツールです。ただし、倫理的な問題やバイアス、プライバシーなどの懸念があり、これらの問題に対処するための取り組みが求められています。
<h2>Amazon Bedrockで使えるファウンデーションモデル（FMs）</h2>
それぞれのファウンデーションモデル（FMs）について、簡潔に説明します。
<ol>
 	<li><strong>AI21 Labs（Jurassic-2）: </strong>
AI21 Labsが開発したJurassic-2は、高品質で多機能な大規模言語モデル（LLM）です。これにより、文章の生成や要約、質問応答など、さまざまな言語タスクを効率的にこなすことができます。また、複数言語に対応しています。</li>
 	<li><strong>Anthropic（Claude）: </strong>
Anthropicが開発したClaudeは、対話や質問応答、ワークフロー自動化などに特化した大規模言語モデルです。誠実で責任あるAIシステムの研究に基づいて開発されており、安全性とカスタマイズ性に優れています。</li>
 	<li><strong>Stability AI（Stable Diffusion）: </strong>
Stability AIが開発したStable Diffusionは、画像生成に特化したファウンデーションモデルです。独自の生成技術により、リアルな画像やアート、ロゴ、デザインを高品質で生成することができます。</li>
 	<li><strong>Amazon Titan: </strong>
Amazonが開発したAmazon Titanは、文章の要約・生成・分類・質問応答・情報抽出など、多様なテキストタスクをこなす大規模言語モデルです。また、埋め込みベクトルを利用した検索機能も備えています。</li>
</ol>
これらのファウンデーションモデルは、Amazon Bedrockを通じて利用でき、開発者が自分たちのニーズに合った最適なモデルを選択できるようになっています。
<h2>まとめ：Amazon Bedrockの可能性</h2>
Amazon Bedrockは、現在利用可能なファウンデーションモデル（FMs）だけでなく、今後登場するであろう新しいFMsも取り込むことができる革新的なプラットフォームです。AIスタートアップやAmazon自身が開発したさまざまなFMsを統合し、開発者が最先端のAI技術を簡単に利用できるように設計されています。

今後も技術の進化とともに、Amazon Bedrockはさらに多様なニーズに対応し、開発者にとっての価値を高めていくでしょう。このプラットフォームを活用することで、開発者は効率的に自分たちのアプリケーションやサービスにAIを組み込むことができ、より革新的でユーザーフレンドリーなソリューションを提供することが可能となります。

Amazon Bedrockの登場により、将来的にはより多くの企業や開発者がAI技術を活用し、競争力を高めることが期待されています。この革新的なプラットフォームを通じて、技術の進歩と発展がさらに加速されることでしょう。
JavaScriptのオプショナルチェーン「?.」でエラー回避

最近JavaScriptの勉強をし始めているのですが、
ChatGPT君があまり見慣れないもの「?.」を使ってきたので調べてみました。

# オプショナルチェーン「?.」
JavaScriptにはオプショナルチェーンという、オブジェクトのプロパティにアクセスする際に、プロパティが存在しないときにエラーを回避してUndifinedを返すようにするものがあるらしい。

例えば、次のようなオブジェクトがあったとします。
```js:JavaScript
const obj = {
  child1: {
    key1: value1
    key2: value2
    // ...
  }
  child2: {
    key1: value1, // key1, key2, ... はchildxで共通のプロパティ
    key2: value2,
    // ...
  }
  child3: null
}
```
このオブジェクトから`child1`の`value1`にアクセスする場合は、`obj.child1.key1`でアクセスできます。
しかし、child3のようにnullになってしまっているものにアクセスしようとすると例外が発生します。
```
console.log(obj.child3.key1)
-> TypeError
```

このような場合に、オプショナルチェーン「?.」を使うことでエラーを回避することができます。

```
console.log(obj.key3?.key1)
-> Undefined
```

欠損が存在するようなオブジェクトをループする際は便利そうな機能ですね。
【PHP】オートロード機能【MVCモデル】

MVCモデルを使用したPHPのプロジェクトにおける、オートロード機能の説明と、具体例を記します。

# オートロード機能とは
クラスファイルの読み込みを自動化する機能のこと。

クラスを作成する場合、再利用する性質上、1クラスを1ファイルで管理するのが基本。
しかし扱うファイル数が増えた時に、各ファイルの先頭で一つ一つrequireする必要が出てくる。

そこで、オートロードを使用することで、クラスを使用する際に、クラスファイルを明示的にrequireする必要がなくなる。

※ライブラリ管理ツールである「composer」を使う方法もある。


# 具体例
```autoload.php
spl_autoload_register(function($class) {
  $prefix = 'Bbs\\';
  if (strpos($class, $prefix) === 0) {
    $className = substr($class, strlen($prefix));
    $classFilePath = __DIR__ . '/../lib/' . str_replace('\\', '/', $className) . '.php';
    if (file_exists($classFilePath)) {
      require $classFilePath;
    }
  }
});
```

#### spl_autoload_register()
「spl_autoload_register()」関数はPHPの組み込み関数で、機能としては、**自動読み込み関数（オートロード関数）を登録する**。
spl_autoload_register()関数を使用して、引数として渡されたコールバック関数を自動読み込み関数として登録することを行う。

オートロード関数とは、**クラス名から、対応するファイルを探し出し、requireする関数**。
このコードでのオートロード関数は、指定された名前空間（Bbs\\\）のクラスを読み込むための処理を定義している。
クラス名を元にクラスファイルのパスを組み立て、そのパスが存在する場合はクラスファイルを読み込むという処理が行われる。
具体的には、**クラス名にBbs\\が含まれている場合、lib/ディレクトリに対応するファイルがあるかを探す。libフォルダ内にあるファイル名とクラス名が同じであれば、そのファイルをrequireする。** これがこのコードのオートロード関数の役割である。

#### strpos()
strpos() 関数は、文字列内で指定した文字列が最初に現れる位置を返す関数。第1引数に検索対象の文字列を、第2引数に検索する文字列を指定する。

この例の場合、 `$`class という文字列内で `$`prefix という文字列が最初に現れる位置が0であるかどうかを判定している。 === 演算子は、比較する値と型が等しい場合に true を返すため、 strpos(`$`class, `$`prefix) === 0 は、 `$`prefix が `$`class の先頭にあるかどうかを判定している。

つまり、 `$`class が Bbs\\\ から始まる場合に true を返し、それ以外の場合に false を返す。


### 補足・このコードで使われている組み込み関数
● spl_autoload_register()： 
オブジェクトを使う前に定義されていないクラスが出現した場合、自動的にクラスをロードするためのオートローダー関数を登録する。

● strpos()：
文字列内で部分文字列を検索し、最初に現れる場所のインデックスを返す。見つからなかった場合は false を返す。

● substr()：
文字列の一部分を取り出す。

●strlen()：
文字列の長さを返す。

●　str_replace()：
文字列内の指定されたテキストを置換する。

●　file_exists()：
ファイルが存在するかどうかを確認する。

●　require()：
指定したファイルを読み込む。読み込みが失敗した場合、エラーを発生させる。
応用情報　即日復習（午前問題）

## Q2　標準偏差
平均が60、標準偏差が10であるとは、
平均値の±10にデータのうち68%が存在していることを示す。

細かい定義ではなく、±10に存在する、というのが分かっていれば解けた問題。
経済学部のくせに間違いました。統計苦手です.....


## Q3　ROC曲線
Receiver Operating Characteristicの略。
真陽性率（=TPF =true positive fraction）と偽陽性率（=FPF =false positive fraction）の関係を示す曲線

このあたり、AWSの機械学習の資格勉強の時にちょっと勉強したけど完全に付け焼刃だったところ。
データ分析の偽陰性とか偽陽性とかのところ、面白そうやけど難しくて全然理解できない。
詳しい人に教えてほしい分野。


## Q8　CPI
Cycles Per Instructionの略。
直訳すると「命令当たりのサイクル」となる。
プロセッサが1つの命令を完了するために平均して必要なクロックサイクルの数を表す。
Instructionがinstructorから推測すると指導？？指導当たりのサイクルって何？？となり、混乱してしまった。
「命令」なんやね。なるほど。
答え見たらそらそうやろ、って思うのに、試験中は解けない現象に名前つけてほしい。

## Q23　LiDAR
Light Detection And Rangingの略。
 レーザー光を照射して、その反射光の情報をもとに対象物までの距離や対象物の形などを計測する技術。
Rangingは「測距」。
技術としては昔からあったが、近年精度が向上してきて自動運転に使えるレベルになりつつあるらしい。
運転怖いので早く自動運転が普及してほしい。


## Q24　NFC
Near Field Communicationの略。
短距離無線通信技術の一種で、スマートフォンやその他の電子機器間でデータを簡単かつ迅速に交換することができる。
ICOCAみたいな非接触式のICカードで使われている。


## Q31　PLC
Power Line Communicationの略。
電力線を通信ケーブルとして使用する通信技術の一種。
これが実現すれば、コンセントに指すだけでインターネットに接続できるようになる。すごい。
ただ、いろいろな理由で一般的に実現するのは難しいらしい。
ちなみに、PoEはイーサネットケーブルを使ってデータ通信と電力供給を行うもので、PLCとは少し違う。


## Q36　ボットネット　C&Cサーバ
ボットネットとは
ボットと呼ばれるマルウェアがネットワークを形成したもの

ボットとは
「ロボット」を由来としている言葉で、外部からロボットのようにコントロールすることができる点からこう呼ばれている。

C&Cサーバ
Command and Control serverの略。
外部から侵入して乗っ取ったコンピュータ（ボット）を利用したサイバー攻撃で、踏み台のコンピュータを制御したり命令を出したりする役割を担うサーバコンピュータのこと。

## Q44　サブミッションポート
SMTP-AUTHは、メール送信者が自身のメールアカウントのユーザ名とパスワードを提供して、メールサーバーに対して自身を認証するプロセスで、メールサーバーは、正当なユーザーがメールを送信していることを確認できる。
この認証を行うのがサブミッションポート（SMTPポート587）。

SPFは受信側のメールサーバーは、DNSサーバに送信元ドメインのSPFレコードを問い合わせ、送信元IPアドレスが許可されたサーバーからのものであるかどうかを検証する方法。

どっちもメールの送信元を確認する技術ではあるが、プロセスが違う。


## Q63　情報銀行
個人が利用してよい企業や目的を決めたうえでデータを提供し、データを活用した企業が見返りとして個人に合わせたサービスや商品を用意し、メリットを提供する枠組み

> 銀行が、「産業の血であるお金」を流通させることで、新しい価値の創発を支援する機関なら、情報銀行は、「産業の知であるデータ」を流通させることで、新しい価値の創発を支援する機関となります。

by NTT DATA
初めて聞いた単語でした。
上記のたとえ、わかりやすいし対比つかっててとても良い。

## Q77　変動費
事業を営むうえでかかる経費のうち、売上や生産量、販売数に比例して増減する経費のこと。

問題が
> 会社の固定費が150百万、変動費率が60%のとき、利益50百万円が得られる売上高は何百得られる

という問題で、変動費が60%だから固定費が40%で、固定費＋変動費が375百万だ！と思ってしまった。
今考えたら、変動費が変動しないことになっているのであり得ないが、間違えてしまった。
経済学部卒なのに......もっと勉強します。


## さいごに
本日解いた問題のうち、間違えた問題や気になった問題からピックアップしてみました。
略語が気になるから結構取り上げています。
物理的な技術や、マネジメント・ストラテジ系の用語興味が薄くて間違えていてもそんなに取り上げていません。

業務でやったことから答えが導き出せる問題が割とあって、一年間の成長を感じることができました。
今後も精進します。
設定ファイル「/etc/dovecot/conf.d/10-auth.conf」の項目

●設定ファイル「/etc/dovecot/conf.d/10-auth.conf」の項目

・listen = ~　~のアドレスで待ち受ける。すべてのアドレスで待ち受けるには「*」(IPv4)、「::」(IPv6)とする。
・protocols = ~　動作させるプロトコルを指定する
・verbose_protitle = yes　psコマンドの出力に詳細を表示する
・mail_location = ~　Maildirディレクトリに格納されたMaildir形式を指定する
・auth_mechanisms = ~　平文、SMTP認証、CRAM-MD5、APOP、Digest-MD5での認証をサポートする
・mail_max_userip_connections = 数字　同一IPとユーザからIMAP接続できる最大数を「数字」とする
AWS公式ハンズオン JP Contents Hub を片っぱしからやってみる①

IT業界3ヶ月目のうんちっちインフラエンジニアです。
転職前にSAAを取得済みですがペーパードライバー状態なので、
手を動かしてえ、実際に触って構築してえと思い、この神コンテンツをどっぷりやり込もうやとなった次第です。
きぃた初投稿。至らない点は諸々ご容赦いただきたく。
[JP Contents Hub](https://aws-samples.github.io/jp-contents-hub)

## 今回やったハンズオン

[スケーラブルウェブサイト構築 ハンズオン](https://catalog.us-east-1.prod.workshops.aws/workshops/47782ec0-8e8c-41e8-b873-9da91e822b36/ja-JP)

下記のような構成を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447887/cb0fe991-6e08-d80b-de17-5f4fbfc0274d.png)

SAAの学習をしていれば、あ〜はいはいってなりますよね。
こんなん基礎中の基礎やんと。
ただ資格持っててもイコール問題が解けるってだけで（個人の意見です）、いざイチから作ってみやがれと言われると
おぅふ...となるのがツライ。
「知ってる」と「できる」は違うというのはこのことでさァね。




## やってみた感想


### あぁ～！Auto Scalingの音ォ〜！！
聞こえました。



特に目から鱗！！みたいな部分はありません。が、
構成をイメージしながら実際に自分の手で構築してみるというのは本当に大事だなと。

実は運良く実務でAWSを触る機会があり、
流石にそれと比べると構成の複雑さが月とスッポンポンの不審者くらい違いますが、
知識を血肉にするための第一歩としてはやって良かったと感じます。

一点、EC2作成手順において
AMIデフォルトでいいよ〜と言われるのですが、
2023年4月現在ではデフォルトが違うAMIに設定されており、
そのまま進めるとWordPressの初期設定画面にアクセスできません。
Amazon Linux 2 AMI(HVM)を選択し直して進める必要アリです。

↓ハンズオンのスクショ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447887/197a9170-769d-d731-2e75-b835a8a5c2b1.png)

↓実際の画面
![スクリーンショット 2023-04-16 23.44.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447887/2f687107-9c77-3ee6-7ec1-f52b0981fed3.png)



基本的に手順こなすだけで詰まることなく構築できると思います。
ただ本当に手順こなすだけでできてしまうので、
今何のためにどんな作業をしているのか、構成図を頭でイメージしながら実行するのが良いかと思います。
まあ、逐一今の手順ではここをやったよーって最後に教えてはくれるんですが、意識の持ち方として。。。

## 次は

Fargateの音ォ〜！！を聞きにいこうかと思っています。
[Amazon ECS 入門ハンズオン](https://catalog.us-east-1.prod.workshops.aws/workshops/7ffc4ed9-d4b3-44dc-bade-676162b427cd/ja-JP)

ただこのJP Contents Hubたそ、
ジャンルごとにまとまってはいるのですが、
同じハンズオンの内容で古いものと新しいもの？がごっちゃになっていたり、
リンク先がWorkshop studioやらAWS Hands-on for BeginnersやらGithubやらだったりして正直あまりよくわかっていません。
とりあえず興味のあるタイトルを片っぱしからやっていこうと思います。
インフラ系でもそうでなくても、おすすめのハンズオンだったりご存知の方いらっしゃいましたら、
コメントでご教授いただけると幸いです。
特に何かが得られる記事ではありませんが、最後までご覧いただきありがとうございました。
""（ダブルクオーテーション）と、''（シングルクオーテーション）の違い【PHP】

""（ダブルクオーテーション）... 特殊文字や変数が値に置き換わる。
''（シングルクオーテーション）... 特殊文字や変数が値に置き換わらず、全て文字列として扱われる。

例：
```php
$name = 'Alice';
echo "Hello, $name!"; // Hello, Alice!
echo 'Hello, $name!'; // Hello, $name!
```
PHPのforとwhileの違い

どちらも反復処理を行うものだが、

・ forループ： 予めループ回数を決めておく場合に適している。
・ whileループ： ループ回数が決まっていない場合に適している。

### ■ forループ： 指定された回数分繰り返し処理を行う
```
for (初期化式; 条件式; 更新式) {
  // 繰り返し実行する処理
}
```

初期化式は、ループの最初に一度だけ実行される式。条件式は、ループが繰り返されるかどうかを評価する式であり、trueの場合にループが続行される。更新式は、繰り返し実行される処理の最後に実行される式。

例：
```php
for ($i = 1; $i <= 5; $i++) {
    echo $i;
}
```


### ■ whileループ： 条件式がtrueであり続ける限り繰り返し処理を行う
```
while (条件式) {
  // 繰り返し実行する処理
}
```

例：
```php
$i = 1;
while ($i <= 5) {
  echo $i;
  $i++;
}
```
「HTML+CSS 標準入門」＃2

htmlのheadタグ内の記述例
```
<head>
    <meta charset="UTF-8">　文字コード
    <meta name="viewport" content="width=device-width, initial-scale=1">　レスポンシブ対応
    <title>ページのタイトル</title>　ページタイトル
    <meta name="description" content="ページ内容の説明文">　description　説明文
    <link rel="stylesheet" href="CSSのファイルパス">
    <script src="JavaScriptのファイルパス"></script>　外部ファイルの読み込み
</head> 
```

---------------------------------------------------------------------------------------------------------------
Webページ全体のレイアウト

< body>タグの中身は、大まかに

< header>　< main>　< footer>　場合によって< aside>に切り分けることができる。

< header>タグ　ページのヘッダーを示す。ロゴやグローバルナビゲーションなど。

< main>タグ　ページのメインコンテンツのエリアを示す。1ページに1つまで使用可能

< aside>タグ　余談という意味。このページになくても差し支えない要素に使用。脚注や広告バナーなどに使用される。
< aside>の中に< main>を入れることはできない。

< footer>タグ　サイトマップやコピーライト情報などを記述することが多い。

---------------------------------------------------------------------------------------------------------------
セレクタの種類
```
全称セレクタ
* {    ;}　すべての要素へ指定

要素セレクタ
p {    ;}　タグ名がセレクタとなるパターン

子孫セレクタ
article p {    ;}　〇〇タグの中にある△△タグの様な親子関係を指定。半角スペースで表す

複数セレクタ
h1, h2 {    ;}　複数のタグに同一のスタイルを指定するパターン　「,」カンマで区切る

class/id セレクタ
p .text {    ;}
p #attention {    ;}
タグに付与されているclassやidを指定してスタイルを適用させる方法。
classは「.」ドット
idは「#」シャープで表す

属性セレクタ
input [type="text"] {    ;}　タグに付与されている属性や属性値を指定して適用する方法
```

--------------------------------------------------------------------------------------------------------------------------
CSSの特性
CSSは上から順番に読み込まれていく。
なので、下の方に記述していくことで上書き(上書き特性)されていく。
この特性を利用して、CSSは上方に全体共通の指定を書く。
下の方に例外の部分などを上書きして指定していく。
全称セレクタなどは上方に記述する

--------------------------------------------------------------------------------------------------------------------------
Chat GPTをPythonから呼び出すプログラム（API)

◯ライブラリのインストール

```python
!pip install openai
```

◯APIキーの取得
以下のウェブサイトでアカウント登録をした上で、ユーザーアカウント管理画面から、API KEYを取得。

https://platform.openai.com/overview

◯Pythonプログラム
（クエリを入力すると、ChatGPTに接続して、レスポンスを表示）

```python
import openai
openai.api_key = "------取得した自分のAPIキーをここに入れる--------"

query = input()
completion = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo",
    messages=[
        {"role":"user", "content": query }
    ]
  )
chat_response = completion.choices[0].message.content
print(str(chat_response))

```
※上記プログラムの利用は、自己責任でお願いします。
DjangoでAPIドキュメントを自動生成しよう

開発している家計簿アプリ[SUMUMA](https://sumuma.com/lp/general/)のAPIとAPIドキュメントを公開しました。
ドキュメントはSwaggerとRedocの2種類で公開しています。
[Swagger SUMUMA API](https://sumuma.com/swagger/)
[Redoc SUMUMA API](https://sumuma.com/redoc/)

APIとドキュメントの公開には、[Django Rest Framework](https://github.com/encode/django-rest-framework)と[drf-yasg](https://github.com/axnsan12/drf-yasg)を使いました。

# Django Rest Framework
Django Rest Framework（以下DRFで表記）は、DjangoアプリでAPIを提供するためのパッケージです。DjangoでAPIを実装するときに、必ずと言っていいほど使われています。

https://www.django-rest-framework.org/

DRFはOpenAPIという、RESTful APIを定義するためのフォーマットをサポートしています。OpenAPIを元にAPIドキュメントを生成することもできます。

DRFのドキュメントには、パッケージを使わずにAPIドキュメントを作成できる方法が紹介されていますが、認証やUIなどの設定項目が多いためdrf-yasgというパッケージを利用して簡単にドキュメントを自動生成していきます。

# drf-yasg
drf-yasgはDRFでAPIドキュメントを生成することができるサードパーティパッケージです。Swagger UIとしてドキュメントを生成でき、Redocもサポートされています。

設定は容易で、APIドキュメントのルーティングとドキュメントの情報を付加するだけです。
アクセス制限や認証、パーミッションの設定も可能です。

**Swagger UI**
![スクリーンショット 2023-04-16 23.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/361a2d29-92f6-48b1-92c7-96160a1ad67a.png)


**Redoc**
![スクリーンショット 2023-04-16 23.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/762e4c5a-84a8-ab11-fd0d-b1f830fedb32.png)

# APIクライアントも生成
drf-yasgは[Swagger Codegen](https://swagger.io/tools/swagger-codegen/)もサポートしているため、APIクライアントの自動生成も可能です。サポートしている言語も豊富なため、開発に利用しやすいこととプロダクトのスケールにも活用できます。

スキーマ駆動を検討している方はぜひご検討ください。
【Vue.js & Three.js】WARNING: export 'Math' (imported as 'THREE') was not found in 'three' の対処法

今回は，Vue.jsとThree.jsを用いて，Webアプリケーションを作成していた際に詰まったエラーを紹介します．

# 目次
- 経緯
- エラー内容
- 対処法
- 補足

# 経緯
まず，Vue.js上でThree.jsを扱うために，npmでthreeをインスールしました．
```bash
$ npm install three --no-package-lock
```

実際にエラーが出たコードが以下の``THREE.Math.degToRad``の部分です
```vue.js(Sample.vue)
<script>
import * as THREE from 'three'

export default {
  methods: {
    computeCameraOrientation: function() {
      this.phi = THREE.Math.degToRad(90);
    }
  }
}
</script>
```
# エラー内容
以下は，npm run serveした際の警告文です．
```
Warning
export 'Math' (imported as 'THREE') was not found in 'three' 
・・・・
```

以下は，Webのコンソールログのエラー文です．
```
cannot read properties of undefined (reading 'degToRad')
```


# 対処法
書き方は2通りありますが，私的には方法2がおすすめです！！！
Mathではなくて，MathUtilsを用いてることで解決します．

方法1
```vue.js(Sample.vue)
<script>
import { MathUtils } from "three"

export default {
  methods: {
    computeCameraOrientation: function() {
   　　this.phi = MathUtils.degToRad(40);
    }
  }
}
</script>
```

方法2

```vue.js(Sample.vue)
<script>
import * as THREE from 'three'

export default {
  methods: {
    computeCameraOrientation: function() {
   　　this.phi = THREE.MathUtils.degToRad(40);
    }
  }
}
</script>
```
# 補足
以下の記事を参考にして解決しました．
[Building an interactive web portfolio with Vue + Three.js — Part Three: Implementing Three.js](https://medium.com/nicasource/building-an-interactive-web-portfolio-with-vue-three-js-part-three-implementing-three-js-452cb375ef80])
【Linux】lsコマンドでファイルのみを表示する方法

## ファイルのみを出力する
```zsh
ls -F [パス] | grep -v /
```
隠しファイルも含めて表示
```zsh
ls -aF [パス] | grep -v /
```

サンプル
```zsh
$ ls -F path/to/sample | grep -v /
Gemfile
Gemfile.lock
Guardfile
README.md
Rakefile
compose.yml
config.ru
lefthook-local.yml
lefthook.yml
package-lock.json
package.json
typescript

$ ls -aF | grep -v /
.DS_Store
.dockerignore
.editorconfig
.env
.git-lint.yml
.gitattributes
.gitignore
.rspec
.rubocop.yml
.ruby-version
.solargraph.yml
Gemfile
Gemfile.lock
Guardfile
README.md
Rakefile
compose.yml
config.ru
lefthook-local.yml
lefthook.yml
package-lock.json
package.json
typescript
```
WatsonとChatGPTの精度比較 - AIテキスト分類の戦い


# はじめに
ChatGPTを使っていたら無性にやりたくなってしまった、Watsonとの精度比較。まずはテキスト分類をやってみようじゃないか。
ということで今回は、Watson Natural Language Classifier（NLC）、Natural Language　Understanding（NLU）とChatGPTのニュース記事タイトルの分類精度を比較してみました。
比較対象になるWatson NLC、NLUの分類精度の詳細は以下の記事をご覧ください。
[Watson NLCとNLUの精度を比べてみた](https://qiita.com/mihoicchi/items/4b7a96d801526a2ffe11)

# 訓練データとテストデータ
Watsonの訓練データに使ったのは[ライブドアニュース](https://news.livedoor.com/)から取得したニュースタイトル。対象は5カテゴリで、1カテゴリにつき100件ずつ。合計500件を学習させました。
ChatGPTでは、Few-Shotで5例（各ジャンル1例ずつ）と、Zero-Shot（例示無し）を試してみました。
テストデータは同じく各ジャンル20件ずつ、合計100件を準備しました。

対象ジャンル：
・スポーツ
・海外
・経済
・グルメ
・宇宙

# さっそく結論
正解率(Accuracy)で比較した結果は以下の通り。
* 3位：0.88　Watson NLC　　
* 2位：0.89　ChatGPT(GPT-4,Few-Shot)
* 1位：0.93　Watson NLU

:::note info
ChatGPTのモデルはGPT-4,プロンプトで計5例（訓練データから1カテゴリ1例）を与えました。
:::

訓練データ1クラス1データでNLCを超えてくるのか！？すごすぎる。

# ChatGPTの分類結果
ChatGPTのConfusion Matrixが下記の図です。ChatGPTはグルメと宇宙がちょっと苦手のようです。

図1.ChatGPTのConfusion Matrix
![gpt4fs_confusion_matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/f4fa2600-3488-d27a-dd9b-2f15ffa491db.png)

正解率(Accuracy),適合率(Precision),再現率(Recall),F1値(F1-measure)を見てみましょう。

表1.正解率(Accuracy),適合率(Precision),再現率(Recall),F1値(F1-measure)

|サービス|Accuracy|Precision|Recall|F1|
|--|--:|--:|--:|--:|
|NLC|0.8800|0.8826|0.8800|0.8776|
|NLU|0.9300|0.9443|0.9300|0.9286|
|ChatGPT|0.8900|0.8900|0.8900|0.8876|

# ChatGPTのPrompt
Few-Shotでは訓練データ内から各カテゴリ1例ずつ計5例を与えました。

``` ChatGPT:Prompt
文章が次のどのカテゴリに当てはまるか、文章の後に「,」をつけて回答してください。

スポーツ
グルメ
海外
経済
宇宙

質問）
トッテナムの韓国代表が転倒した際の報復行為「蹴り上げ蛮行」に英紙騒然
米の高速道路で69台玉突き　当時は路面凍結と深い霧
ＮＨＫのネット事業見直しは評価、経営改革の具体化を要求…総務省
サイゼリヤの人気ランキングが発表されたよ〜！1位はミラノ風ドリアでした
NASAが月面に人類を送る「アルテミス計画」を動画で解説

回答）
トッテナムの韓国代表が転倒した際の報復行為「蹴り上げ蛮行」に英紙騒然,スポーツ
米の高速道路で69台玉突き　当時は路面凍結と深い霧,海外
ＮＨＫのネット事業見直しは評価、経営改革の具体化を要求…総務省,経済
サイゼリヤの人気ランキングが発表されたよ〜！1位はミラノ風ドリアでした,グルメ
NASAが月面に人類を送る「アルテミス計画」を動画で解説,宇宙

質問）
SNSで話題＆大人気！この冬こそ絶対食べたい“いちご”の限定パウンドケーキ
アメリカの株価は大きく調整する可能性がある
以下、25問程列挙
```

必ず最初に「文章が次のどのカテゴリに当てはまるか、文章の後に「,」をつけて回答してください。」をつけ、質問を25問ほどに分割して送信しました。
当初、2回目以降のPromptではカテゴリや例を示さず、後続の分類対象の文章だけを送信していたのですが、途中で **指定以外のカテゴリ**（「食品」「インタビュー」「海外（犯罪）」など）が登場してきました(笑)
やり取りが長くなって、最初の質問定義が消えてしまったのでしょう。
必ず指示とカテゴリ、例示を付けて質問を送信したところ、改善されました。

ちなみに、履歴を削除してしまって残っていないのですが、ChatGPTがつけた独自カテゴリは、ニュースタイトルに沿ったかなり妥当な内容でした。

# まとめ
ChatGPTのモデルGPT-4、Few-Shot5例でニュースタイトルを分類した結果、正解率は0.89とNLCの0.88（2021年8月時点）を超える結果となりました。NLUの0.93には一歩及ばずでしたが、例示データがNLC、NLUの1%でOKと考えると非常に魅力的です。
今回はニュースタイトルを対象としましたが、より特定業界や企業内に閉じた内容の場合、どこまで精度がでるのか試してみたいところです。
結果をRPAなどと連携し自動化に使う場合は、期待通りのフォーマットでChatGPTが返却するのかは十分な検証（または、システム的なサポートを入れる）が必要と感じました。

# 補足
例示無しのZero-Shotは一部やり直しが必要なため、再度チャレンジして結果を反映させたいと思います。