OmniAICreator/Qiita-1.07M huggingface dataset:
Databricks dbdemos にてコンテンツをインポート時にクラスターなどのリソースを自動で作成しないようにする暫定対応方法

## 概要

Databricks には dbdemos というデモをすぐに実行できる便利な機能が提供されているのですが、クラスターなどのリソースも同時に作成される仕様であるため、リソースを作成せずにノートブックのみをインポートする暫定対応方法を共有します。現時点では docstring の記載もなく、Github 上の[dbdemos/dbdemos.py](https://github.com/databricks-demos/dbdemos/blob/3768cd2ef94fb6f23ce37f3c58c9a8a232a01072/dbdemos/dbdemos.py#L194)の記載内容から判断しただけであるため、想定通りに動作しない可能性もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6c91dae3-9737-de0b-9314-6d520681a080.png)

引用元：[dbdemos - Install demos for Databricks Lakehouse](https://www.dbdemos.ai/)

 ## 暫定対応方法

`install`メソッド実行時に、`start_cluster`、`use_current_cluster`、および、`skip_dashboards`のパラメータを変更することでリソースが作成されませんでした。

```python
dbdemos.install(
    '{demo_name}',
    # overwrite = True,
    start_cluster = False,
    use_current_cluster = True,
    skip_dashboards = True,
)
```

実行例を次に示します。

```python
dbdemos.install(
    'lakehouse-fsi-credit',
    # overwrite = True,
    start_cluster = False,
    use_current_cluster = True,
    skip_dashboards = True,
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/33d9f5cd-b64c-3380-f151-bfe361cea860.png)
dejirenでMotionboardと繋ぐときの注意点

私は社内でオンプレ版Motionboardを使っております。社内VPN内にありますので、社外からは基本アクセスが出来ないですが、社外から見たい！情報を取得したい！という声があります。

そんな時にdejirenというツールを使って取得できる情報は制限されるもののアクセスすることが可能になりました。
https://www.dejiren.com/

dejiren側でmotionboardと接続するためのクライアントブリッジをインストールする必要があります。
https://www.dejiren.com/contents/1859

## 注意①
個人のPCでインストールするとPC起動時のみdejiren-motionboardが動作します。dejirenは動くのですがmotionboardからレポートなどを抽出することができないということです。
なので私はMotionboardサーバーにインストールしました。



さてインストールしたらmotionboardとの接続設定をします。
https://www.dejiren.com/contents/4082

URLの解説ではMotionboard Cloudとなっていますがオンプレ版Motionboardも同じです。
さて、ここで入力するMotionboardユーザーについて、Motionboard側で必ず設定するところがあります。

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635610/f7aabb6b-7202-3a5a-5114-f9acd1c9adc1.jpeg)

ここで
## 注意②
dejirenで使用するユーザーのロールにWebAPIの権限が与えられていること！

ユーザーの設定画面ではわかりやすく露骨に表記していますが、設定してあるロールIDにWebAPIの権限があることが必須です。これが無いと接続確認でコケます。

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635610/82215eb4-db3d-c1fe-722d-f002b5284782.jpeg)

まずはWebAPIの権限を持つロールを設定します。
下図を参考に設定しましょう。私はWebAPIオンリーのロールを作りました。

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635610/d3c84a04-0dd4-f336-2f32-593218187c96.jpeg)

次にグループの設定で、該当するグループを選択してロールの部分で先ほどつくったWebAPIのロールを加えて上書き保存すればOKです。

![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635610/085c1ed4-1fd8-ce65-525d-aa0f03b40932.jpeg)

この設定をすれば、dejirenとMotionboardが繋がるはずです。
ちょっと沼った経験があったので忘れないようにまとめました。

もし沼った方いらっしゃったら参考にして頂ければ幸いでございます。
CDKのデプロイ時に発生した「Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting」に対処する

CDKを使ってS3をデプロイしようとした際に遭遇したエラーと、とりあえず実施した対応について紹介します。
※別環境で同様の設定で作成してもエラーが再現しなかったため具体的な発生要件は分かりませんでした・・・
　作成した構成を眺めている感じは、CloudFront等のLogを格納するように作成しているBucketでエラーが出ているため、そのあたりにエラーを起こす何かがありそう・・・


## 各種バージョン
```bash
aws-cdk-lib==2.60.0
Python 3.7.16
```

開発環境はCloud9を利用しています。

## エラー内容とコード
### エラー内容
2023/5/23にS3をデプロイしようとしたところ以下のエラーが発生しました。
2023/3頃にデプロイした際には同様の構成でもエラーが発生しなかったため、2023/4にあったS3のデフォルト設定の変更が関係しているものと思っています。

```
Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting (Service: Amazon S3; Status Code: 400; Error Code: InvalidBucketAclWithObjectOwnership; Request ID: KW3CT7MV5
GGDAECY; S3 Extended Request ID: bwGXYmFJlgJKDADmInLsDbMOzQsKQ6JM184mNwpQQolZOuaG1eXtTeWWltIZm5HgMgFwnzWMEkM=; Proxy: null)
```

### CDKコード
以下は、S3へのアクセスLogを格納するBucketを作成するコードとなっています。

```python
server_access_log_bucket = s3.Bucket(
    self,
    'ServerAccessLogBucket',
    block_public_access=s3.BlockPublicAccess.BLOCK_ALL,
    bucket_name=bucket_name,
    encryption=s3.BucketEncryption.S3_MANAGED,
    lifecycle_rules=[s3.LifecycleRule(expiration=Duration.days(60))],
    removal_policy=RemovalPolicy.DESTROY,
)
```

## 解決策
同じようなエラーについてのIssueがあったため、そちらを参考にしました。
[GithubのIssueはこちら](https://github.com/aws/aws-cdk/issues/25288)

修正後のコードは以下です。

```python
server_access_log_bucket = s3.Bucket(
    self,
    'ServerAccessLogBucket',
    block_public_access=s3.BlockPublicAccess.BLOCK_ALL,
    bucket_name=bucket_name,
    encryption=s3.BucketEncryption.S3_MANAGED,
    lifecycle_rules=[s3.LifecycleRule(expiration=Duration.days(60))],
    removal_policy=RemovalPolicy.DESTROY,
    # 下を追加
    object_ownership=s3.ObjectOwnership.OBJECT_WRITER,
)
```

ここでは、Object Ownershipの設定を追加しています。
これによって、エラーは解消できました。

## まとめ
今回は、CDKで発生したエラーについての対処法を紹介しました。
別環境で再現できていないことも有り、具体的なエラーの内容については触れることができませんでしたが、同様のエラーに悩まれる方のお役に立てれば幸いです。
webカメラ映像からピント合った画像を保存(opencv)

今後もたまに使いそうなのでコードを残しておく。

Python+OpenCVでwebカメラ映像を取得して好きなタイミングで画像を保存する。
実行後、キーボードの'S'で画像を保存、'Q'でプログラムの終了。
エッジ検出で使われるラプラシアンフィルタを用いてピントが悪い時には画像が保存されないようにする。

~~~python:Python
import cv2

# ピント測定関数
def adjust_focus(frame):
    # ラプラシアンフィルタ（エッジ検出）に基づくピントの測定
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    focus_measure = cv2.Laplacian(gray, cv2.CV_64F).var()

    # ある値より大きければTrueを返す(値は適宜調整)
    return focus_measure > 100

# カメラ起動（カメラが複数台存在する場合はカッコ内を1とかにする）
video_capture = cv2.VideoCapture(0)

# 保存画像の名前付けのための番号
image_number = 0

while True:
    # フレームを1枚ずつ読み込む
    ret, frame = video_capture.read()

    # 上手くフレームが読み込めなければ終了
    if not ret:
        break

    # 映像を表示する
    cv2.imshow("Webcam", frame)

    # キー入力を待つ
    key = cv2.waitKey(1) & 0xFF

    if key == ord('s'):
        # 's'キーが押されたら画像を保存
        if adjust_focus(frame):
            # ピントが合っている場合のみ画像を保存
            image_number += 1
            cv2.imwrite(f"image_{image_number}.png", frame)
            print(f"Image saved: image_{image_number}.png")

    elif key == ord('q'):
        # 'q'キーが押されたら終了
        break

# デバイス、ウィンドウ閉じる
video_capture.release()
cv2.destroyAllWindows()
~~~

やっすいwebカメラで画像取得してましたがぼけまくりで、ピント自動調節してくれるwebカメラが欲しいと思いました。
PHPでEUC-JPをUTF-8に変換する。はしご高（髙）

# PHPでEUC-JPをUTF-8に変換する。はしご高（髙）

- php5.2.1以降からCP51932が使える模様
- はしご高（髙）がうまく変換されない
- とはいえ、CP51932では3byte文字がないらしい

```php
// EUC-JP -> UTF8
// 1, 2byte文字は'CP51932'、3byte文字は'EUC-JP'として扱う
function convertEUCtoUTF8($text) {
    $len = strlen($text);
    $ret = '';
    $pos = 0;
    for ($i=0; $i<$len; $i++) {
        $b = substr($text, $i, 1);
        if ($b == "\x8f") {
            $ret .= @mb_convert_encoding(substr($text, $pos, $i-$pos), 'UTF-8', 'CP51932');
            $ret .= @mb_convert_encoding(substr($text, $i, 3),         'UTF-8', 'EUC-JP');
            $i += 2;
            $pos = $i + 1;
        }
    }
    if ($pos != $len) {
        $ret .= @mb_convert_encoding(substr($text, $pos, $len-$pos), 'UTF-8', 'CP51932');
    }
    return $ret;
}
```
【Paiza問題集】標準出力メニュー/特定の文字で区切り1行で出力

# Paiza問題集
Pythonで回答

## 標準出力メニュー/

### Step01 カンマ区切りで2つ出力
```Python
"""
カンマ区切りで2つ出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step1
"""

# 数字を受け取る
num1, num2 = map(int, input().split(' '))

# 数字を表示する
print(num1, end=',')
print(num2)
```

別解 
replaceを使用した書き方
```Python
# カンマ区切りで表示
print(input().replace(' ', ','))
```
replaceを使用し、スペースをカンマに変えることでワンライナーで書くことができる


### Step02 バーティカルライン区切りで3つの文字列を出力
```Python
"""
バーティカルライン区切りで3つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step2
"""

# 配列を作成する
strings = []

# 文字を受け取り配列に追加する
for i in range(3):
    str = input()
    strings.append(str)

# 文字列を表示する
print('|'.join(strings))
```

別解 
f-stringsを使用した書き方
```Python
# |区切りで表示
print(f'{input()}|{input()}|{input()}')
```
f'{}'もしくはf"{}"で表示形式を指定することでワンライナーで書くことができる


### Step03 カンマ区切りで10個出力 1 
```Python
"""
カンマ区切りで10個出力 1 
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step3
"""

# 数字を受け取る
numbers = list(map(int, input().split(' ')))

# 数字を表示
for i in numbers:
    print(i, end=',')

# 改行
print()
```

別解
```Python
# カンマ区切りで表示(一番最後にもカンマが付く)
print(input().replace(' ', ',') + ',')
```
replaceを使用し、スペースをカンマに変えて表示


### Step04 カンマ区切りで10個出力 2
```Python
"""
カンマ区切りで10個出力 2
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step4
"""

# 数字を受け取る
numbers = input().split(' ')

# 数字を表示
print(','.join(numbers))
```

別解
```Python
# カンマ区切りで表示
print(input().replace(' ', ','))
```
replaceを使用し、スペースをカンマに変えて表示


### Step05 半角スペースとバーティカルライン区切りで10個出力
```Python
"""
半角スペースとバーティカルライン区切りで10個出力 
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step5
"""

numbers = []

for i in range(10):
    number = input()
    numbers.append(number)

print(' | '.join(numbers))
```

別解 
sepを使用し区切り文字を変える
```Python
print(*[input() for i in range(10)], sep=' | ')
```
print関数でsepを使用することで、指定した文字で区切ってくれる


### Step06 大きな数値を3けたごとにカンマ区切りで出力
```Python
"""
大きな数値を3けたごとにカンマ区切りで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step6
"""

# 数字を受け取る
numbers = input()

# 数字を表示、iが3の倍数の時は,を表示
for i in range(len(numbers)):
    if i % 3 == 0 and i != 0:
        print(',', end='')

    print(numbers[i], end='')

print() 
```

### Final問題 【特定の文字で区切り1行で出力】大きな数字を3桁ごとに出力 2
```Python
"""
【特定の文字で区切り1行で出力】大きな数字を3桁ごとに出力 2
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_boss
"""

# 数字を受け取る
numbers = input()

# 3で割った余りを求める
diff = len(numbers) % 3

# 数字を,区切りで表示する
for i in range(len(numbers)):
    if (i - diff) % 3 == 0 and i != 0:
        print(',', end='')
    
    print(numbers[i], end='')

print()
```

Step06とFinal問題の別解
f'{}'のタイプ指定に　:,　を使用する
```Python
# 3桁ごとに区切る
print(f'{int(input()):,}')
```
タイプ指定に　:,　を使用すると、カンマで桁区切りをしてくれる
スクロールの動きに合わせてアニメーションを実装[AOS.js]

# AOS.jsとは
- スクロールの動きに合わせてアニメーションを実装することができる拡張機能。

# 実装
今回はCDNを使用して実装していきます。

### 1.CDNを読み込むためのコードを記述
- コードが変わっている場合があるので、公式を参考にしてください。
[AOS.js公式](https://michalsnik.github.io/aos/)

```:html
<!-- CSS読み込み -->
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">

<!-- js読み込み -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
```

これだけで実装できます。

# 使い方
### 1.HTMLでアニメーションを設定したい要素に属性を追加する
アニメーションを設定したい要素の属性に、アニメーションのタイプを設定するだけです。

記述例
```html
<div data-aos="fade">
    アニメーションを起こしたい
</div>
```
下記４つの基本的なアニメーションがあります。

- Fade　フェードイン
- Flip　回転して表示
- Slide　スライドしながら表示
- Zoom　ズーム

他にも、左からスライドする、右からスライドするなどがあります。
AOS公式ページに紹介されているので確認して使ってみてください。

# JavascriptでAOS.jsを動作させるためのプログラムを記述する
```
<script>
AOS.init();
</script>
```
これだけで動作します。
AOSを動かすための記述です。


# 参考資料
- [AOS.js公式](https://michalsnik.github.io/aos/)
- [スクロールアニメーションライブラリ「AOS.js」の使い方解説！](https://pengi-n.co.jp/blog/aos-js/)
「プログラマーになりたい! 」2020/4/23に関するメモ

「プログラマーになりたい! 」2020/4/23
に説明されている、開発について詰まった箇所に関して
解決方法を探した際のメモ(2023年5月時点）
使用環境はAmazon cloud9
フレームワークはdjango
使用言語はpython3 django
デプロイにはheroku

開発の大きな流れに関して理解しやすいが、
開発時のディレクトリ構成について説明が足りない気もする。
（最新の本を読めと言われたらそれまでだが）


これ以降の問題はほとんどが
python 起動とpython3　の起動の違いについて理解していなかったのが原因。

1.Amamzon cloud9 からpsycog2のインストールができない点について
下記の記事を参考にしてpip3インストールしたらエラーが起こらなくなった。

https://qiita.com/b2bmakers/items/d1b0db5966ac145b0e29

Herokuへのデプロイ時にエラーが多発。
原因はrequirements.txtを触っていなかったこと。
不要ファイルの削除と、本に記載のverではなく最新verのまま
設定を記載することが必要。

https://qiita.com/taku_hito/items/52c6c52385386544aa62

heroku上での起動エラーに関して、
起動時にpython3での起動を行えば解決した。

https://qiita.com/Kohey222/items/2a1aebb1439bf68768c9

おまけ（これから勉強する。）

https://hisuiblog.com/django-error-manage-py-cant-run/#toc4
openpyxlでセルの値（数式ではなく計算結果）を取得する方法

openpyxlでセルの値を取得する際にハマったことについて簡単にまとめてみました。
- 動作環境
    - Windows 10
    - python 3.9.13
    - openpyxl 3.1.2

# やりたいこと
- openpyxlでxlsxファイルのセルの値（数式ではなく計算結果）を取得したい

例えば、以下のようなシートがあって、A1とB1に数値が入っていて、C1ではSUM関数を使ってA1とB1の合計を出力するとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/6be6c540-4b10-ea81-77a9-53d352726eb6.png)

 


# ハマったこと
通常以下のようにworkbookとsheetを読み込みます。
```python
import openpyxl

wb = openpyxl.load_workbook("sample.xlsx")
sheet1 = wb["Sheet1"]
```
以下のようにC1セルの値を取得できます。ただこれだとセルに数式が入っている場合、計算結果ではなくそのまま数式を取得することになります。
```python
c1 = sheet1["C1"].value
print(c1)
```

```
=SUM(A1, B1)
```

# 解決方法
計算結果のみを取得したい場合は、workbook読み込む際に`data_only=True`と指定します。（デフォルトではFalse）
```python
wb = openpyxl.load_workbook("sample.xlsx", data_only=True)
```

もう一度c1の値（計算結果）を取得してみます。
```python
import openpyxl

wb = openpyxl.load_workbook("sample.xlsx", data_only=True)
sheet1 = wb["Sheet1"]

c1 = sheet1["C1"].value
print(c1)
```
```
2
```

これで数式ではなく計算結果を取得できました。

# 参考
- https://openpyxl.readthedocs.io/en/stable/
アルゴリズムと数学 演習問題集 042 - Sum of Divisors

# 記事概要
アルゴリズムと数学 演習問題集 042 - Sum of Divisorsのとりあえず動くコードと説明．https://atcoder.jp/contests/math-and-algorithm/tasks/abc172_d

# 注意
アルゴリズム初心者が書いています．時間内の動作は確認してますが、必ずしも最適解ではないです．

# とりあえずコード
~~~c++:042_main.cpp
///////////////////////////
// 042 - Sum of Divisors //
///////////////////////////

#include <iostream>
#include <vector>

using ll = long long int;

using std::vector;

int main(void) 
{
	//-------------------------------- 入力 --------------------------------//
	int N;
	std::cin >> N;

	//-------------------------------- 計算 --------------------------------//
	vector<ll> divisor_num(N + 1, 1);

	// divisor_num[i]にiの約数の個数を格納する
	for (int i = 2; i <= N; ++i) {
		for (int j = i; j <= N; j += i) {
			divisor_num[j] += 1;
		}
	}

	// 出力値を計算
	ll ans = 0;
	for (int i = 1; i <= N; ++i) {
		ans += i * divisor_num[i];
	}

	//-------------------------------- 出力 --------------------------------//
	std::cout << ans << std::endl;
}
~~~

# 説明
この問題は、整数nの約数の個数の計算をN回繰り返して答えを計算すると時間が足らなくなります．
整数nの約数を求めるのではなく、1～Nまでの内nを約数として持つものはどれかという考えで計算していかなければなりません．

例えばn=2のときであれば、nを約数としてもつ値は2つおきに現れます．同じようにn=3であれば3つおき現れます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305871/949164fe-99ed-64c5-5251-4db5a517deba.png)



この性質を利用して、配列divisor_numをn間隔で1増やす操作を$n:1～N$繰り返します．

これによりdivisor_num[i]にはiの約数の個数が格納されているので、最後に$\sum^N_{k=1}k \times divisorNum[k]$を計算すれば、求める答えが得られます．
Pythonの例外処理逆引き

## 基本
```python
try:
    foo_bar()
except Exception as e:
    print(str(e))  # エラーメッセージが欲しい場合
```
```python
try:
    foo_bar()
except Exception:
    print(traceback.format_exc())  # スタックトレースが欲しい場合
```

## 例外の再送出
```python
try:
    foo_bar()
except Exception as e:
    print(str(e))
    raise e
```

## 例外クラスを変更して再送出

```python
try:
    foo_bar()
except Exception as e:
    raise MyException from e
```

```python
# ！！！ ダメな例 ！！！
try:
    foo_bar()
except Exception:
    raise MyException("foo_bar")  # 元々のエラー情報が消える
# ！！！ ダメな例 ！！！
```

## 例外オブジェクトを使用せずに再送出
```python
try:
    foo_bar()
except Exception:
    print("foo_bar")
    raise
```
```python
# 以下のように変数に受けても一概にダメとは思わない… が、冗長ではある
try:
    foo_bar()
except Exception as e:
    print("foo_bar")
    raise e
```

## 元々の例外オブジェクトを握り潰して再送出
例外オブジェクトがユーザに解析され得るシステムの場合にOS系のエラーを潰す… など。
```python
try:
    foo_bar()
except Exception:
    raise MyException from None
```

## 特定の例外のみ処理する
```python
try:
    foo_bar()
except MyException as e:
    print(str(e))
```

```python
# ！！！ ダメな例 ！！！
try:
    foo_bar()
except MyException as e:
    print(str(e))
except Exception:  # いらない
    raise
# ！！！ ダメな例 ！！！
```

## 特定の例外のみ処理せず再送出
```python
try:
    foo_bar()
except MyException:
    raise
except Exception as e:
    print(str(e))
```

## 戻り値を返す
```python
try:
    foo_bar()
    return "OK"
except Exception:
    return "Error"
```
```python
# 戻り値 or 再送出でも同様
try:
    foo_bar()
    return "OK"
except Exception as e:
    print(str(e))
    raise e
```
```python
# ！！！ ダメな例 ！！！
try:
    foo_bar()
except Exception:
    return "Error"
return "OK"  # 処理の繋がりが離れれば離れるほど可読性が下がる
# ！！！ ダメな例 ！！！
```

## 何もしない
```python
foo_bar()
```
```python
# ！！！ ダメな例 ！！！
try:
    foo_bar()
except Exception:
    raise
# ！！！ ダメな例 ！！！
```
NPMでインストールしたパッケージをJavaScriptとHTMLで使うためのセットアップ

# 調べた発端
素のjavascriptには落とし穴がある。初心者の方も、React使いの方もハマる落とし穴がある。
今回、素のJavascript+HTMLの構成で、npm installで落としたパッケージを活用して開発していたところ、ブラウザ上に以下のエラーが出た。
```
Uncaught SyntaxError: Cannot use import statement outside a module`
```
直訳すると、importが使えない書かれている。
素のJavascriptを使った状態で`npm install`でインストールしたモジュールをimportしようとするとこのようなエラーが出てしまう。
この解決には、**Webpackでのビルド**が必要であることがわかった。
Webpackでのビルドとは、一言で言うと、npmでインストールしたモジュールをhtmlで使えるようにするための手続きである。
webpackの使い方がわかればなんとかなるので、私の示す手順をフォローしてみてほしい。一回私にフォローしてこの問題を解決すれば、自分のプロジェクトにwebpackを適応する方法がわかると思う。
# 結論
「npm installを活用したjavascriptの開発では、作成したjavascriptをwebpackでビルドしないとhtml上でエラーになるよ。」

ではwebpackの使い方を例を通して紹介する。
# 素のJavascriptでNPMを活用した開発環境を整えるまでのセットアップ
## サンプルのjavascriptを記述
今回、説明用にimportのテスト用にquillというモジュールをインストールする。これは便利に拡張されたテキストエディタだ。これをインストールして使う。
```
npm install quill
```
そしてsrc/index.jsを作成し、以下のようにコピペ。
```javascript: index.js
import Quill from 'quill';
import 'quill/dist/quill.bubble.css';
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';

var quill = new Quill('#editor', {
    theme: 'snow'
});
```
これをindex.htmlから<script src="src/index.js"></script>と呼び出してもimportに関連するエラーが出てしまう。なぜか。
npmで作ったものを使用するには「ビルド」という作業が必要だからである。ビルドせずにnpm installしたものをそのまま使おうとするとエラーになってしまう。
ビルドとは、要するにこのjsをわちゃわちゃしてエラーの出ないjsにする作業のことだ。
ではやっていこう。
## JavascriptをWebpackでビルド
### webpackをインストール
まず、ビルドに必要なwebpackをインストールしておく。
```
npm install --save-dev webpack webpack-cli
npm install --save-dev webpack-dev-server
npm install --save-dev css-loader style-loader
```
### webpack.config.jsonを作成
ビルドの設定を書く。
直下にwebpack.config.jsonを作成し、以下をコピペ。
設定値は後で説明する。
```js: webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      },
    ],
  }
};

```
２点重要な点があるので説明する。

- まず、```entry: './src/index.js'```はめちゃくちゃ重要である。ビルド対象のjsである。今回、先ほど作成した```src/index.js```をビルドしたいのでこのように指定した。
- ```filename: 'main.js',path: path.resolve(__dirname, 'dist')```も重要だ。こちらは、二行まとめて```dist/main.js```にビルドしたjsを出力するという設定だ。

その他の設定は、後々の落とし穴を回避するために私が勝手に付け足した設定である。気にしないでほしい。

### ビルドの実行
ビルドの設定も済んだわけなので、webpackを用いて実際にビルドしていこう。
以下のコマンドを入力する。
```
npx webpack
```
すると、出力先に指定した```dist```フォルダに```main.js```ができているはずである。
開いてみるとわかるが、ビルド元のindex.jsをもとにした、新たなjavascriptファイルになっている。これがビルドである。
この```dist/main.js```をhtmlから読み込めば、importのエラーが出ない。
ではやっていこう。

### ビルド済みのjsをHTMLから呼び出す
index.htmlを作成し、以下をコピペ。
```HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <div id="editor"></div>
    <script src="dist/main.js"></script>
</body>
</html>
```
重要ポイントは```<script src="dist/main.js"></script>```である。
ビルド済みのmain.jsを使うことが今回の肝になる。
LiveServer等でhtmlをブラウザで開いてみてほしい。
importのエラーが出なかったと思う。

# 再びまとめ
```npm install```を活用したjavascriptの開発では、作成したjavascriptをwebpackでビルドしないとhtml上でエラーになる。
webpackのビルドは、npmでインストールした後、```webpack.config.json```を設定し、```npx webpack```コマンドを押せばできる。
できたjsをhtmlで呼び出せばエラーが出ない。
Azure OpenAI Service で使用可能なモデルと料金

# はじめに
Azure OpenAI Service について調査をしていますが、
使用可能なモデルが複数あり、その違いがよくわからなかったので、簡単にまとめました。

Azure OpenAI Service について
→[Azure登録から始める、Azure OpenAI Serviceの使用手順](https://qiita.com/shmp-dev/items/be46a688d387fb484056)

# Azure OpenAI Service のモデルについて
利用できるモデル(prompt)は、大きく２つのグループに分けることができます。

### 通常の言語モデル(prompt)
基本１つの入力に対して１つの出力を返すモデル。
- Ada
- Babbage
- Curie
- Davinci
- GPT-3モデル
※上から順に高性能となります

### チャットモデル(completion)
会話インターフェースように最適化されたチャットモデル。
チャット形式で文脈を理解した回答を生成することができる。
- GPT-4モデル
  - 8K コンテキスト
  - 32K　コンテキスト
- ChatGPT (gpt-35-turbo)

>- [Azure OpenAI Service モデル - Azure OpenAI | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/models#gpt-4-models)
>- [ChatGPT および GPT-4 モデルの操作方法 (プレビュー) - Azure OpenAI Service | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/how-to/chatgpt?pivots=programming-language-chat-completions)

**＜コンテキストウィンドウ＞**
モデルによって、チャットの文脈を理解できるサイズが異なります。
| モデル | コンテキストウィンドウ | トークン |
| --- | --- | --- |
| ChatGPT (gpt-35-turbo) | 4Kコンテキスト | 2,048トークン |
| GPT-4 | 8Kコンテキスト | 8,192トークン |
| GPT-4 | 32Kコンテキスト | 32,768トークン |

### その他：微調整されたモデル(fine-tuning)
既存のモデルに(トレーニング)をさせることで、個人用データセットに合わせて調整されたモデルを使用することができる。
**※現在、使用可能モデルは通常の言語モデルのみ**
>[Azure OpenAI Service を使用してモデルをカスタマイズする方法 - Azure OpenAI | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/how-to/fine-tuning?pivots=programming-language-studio)

# Azure OpenAI Service 利用料金
各モデルによって使用料金が異なります。
一部抜粋してまとめるので、その他モデルについては[公式サイト](https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/)を参照してください。

### チャットモデル
| モデル | 1,000トークンあたりの料金 |
| :--- | --- |
| ChatGPT (gpt-35-turbo) | ¥0.266691 |

| GPT-4 | プロンプト (1,000 トークンあたり) | 完了 (1,000 トークンあたり) |
| :--- | --- | --- |
| 8K コンテキスト | ¥4.001 | ¥8.001 |
| 32K コンテキスト | ¥8.001 | ¥16.002 |
cmakeList.txt debug message


`message()`
```CMakeLists.txt
cmake_minimum_required(VERSION 3.7)

# Set the project name - This is used later in this script to set filenames
project(CMAKE CXX)

# Set the cmake modules path to find the cmake Find* files
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules)

message("CMAKE_MODULE_PATH")
message(${CMAKE_MODULE_PATH})
```
MySQLで出力されたエラーとその解決メモ

MySQLを使っているときに、遭遇したエラーとその解決方法を記録しておく。

##### ○エラー　その１
```
mysqlimport: Error: 1049 Unknown database 'aa'
```
発生内容：DATABASE 'aa'が見つからない。  
入力内容：mysqlimport -u root -p --local aa /home/hogehoge/mywork/test.csv
原   因：インポート先のDB名を間違って’aa’と入力したため。
対   応：正しいDB名に変えた。

##### ○エラー　その2（よくやってしまう）
```
ERROR 1046 (3D000): No database selected
```
発生内容：DATABASEが選択されていない。  
入力内容：ログイン後、すぐにSELECT文やCREATE文を実行。
原   因：USE DB名で作業したいデータベースを指定しなかったため。
対   応：USE DB名を実行した。

##### ○エラー　その3（定番）
```
ERROR 1064 (42000): You have an error in your SQL syntax;
```
発生内容：構文にエラーがあります。
入力内容：SELECT * FORM tbl_stocks WHERE order_id = '90';など
原   因：予約語などの綴り間違い、()の閉じ忘れなど。
対   応：正確に入力した。

##### ○エラー　その4
```
ERROR 1068 (42000): Multiple primary key defined
```
発生内容：PrimaryKeyが複数定義されています。
入力内容：ALTER TABLE tbl_staff ADD PRIMARY KEY (staff_name);
原   因：CREATE文で既にキーを設定していたため。
対   応：一度、PRIMARYキーを外して、ALTER文でまとめて指定する。もしくはテーブルを作り直す。  

＊AUTO_INCREMENTを指定している場合は、CHANGEでAUTO_INCREMENTを外し、その後、キーを外して、とか手間がかかる。  

##### ○エラー　その5
```
mysqlimport: Error: 3948, Loading local data is disabled;   
```
発生内容：データのロードが出来ない。
入力内容：mysqlimport -u root -p --local test1 /home/hogehoge/mywork/test.csv
原   因：ファイル読み書きの許可をしていなかった。
対   応：サーバー側、クライアント側双方で、使用できるよう許可を出す。

・サーバー側　local_infileの値を１にセット  
```
SET PERSIST local_infile= 1;
/*確認*/
mysql> SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)
```
・クライアント側　　ログイン時にオプションで許可を示す値をセット
```
mysql -u root -p --enable-local-infile
```

##### ◯　メモ
・エラー番号と説明で、何となく何が起こったのかは推測できるが、今後はエラーログの出力等を詳しく調べ、不具合だけでなく、動作状況の確認（処理の遅いものなど）ができるようにしたい。
AWS CloudFormation S3バケットでSSL/TLSアクセス強制

S3バケットに対して、より安全にアクセスしたい。

* SSL/TLSアクセスを強制したい
  * S3には、HTTPSのみならずHTTPのエンドポイントも存在する
* TLSv1.2以降を強制したい
  * そもそも2023年6月28日以降、[v1.0とv1.1はアクセスできなくなる](https://aws.amazon.com/jp/blogs/security/tls-1-2-required-for-aws-endpoints/)が……

## CloudFormation例

当たり前ではあるが、ダメなものをとにかく弾けばOK。

```yaml
# ...略...
Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      # ...略...

  MyS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref MyS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Deny
            Principal: '*'
            Action: 's3:*'
            Resource:
              - !GetAtt MyS3Bucket.Arn
              - !Sub ${MyS3Bucket.Arn}/*
            Condition:
              Bool:
                'aws:SecureTransport': 'false'
          - Effect: Deny
            Principal: '*'
            Action: 's3:*'
            Resource:
              - !GetAtt MyS3Bucket.Arn
              - !Sub ${MyS3Bucket.Arn}/*
            Condition:
              NumericLessThan:
                's3:TlsVersion': '1.2'
# ...略...
```
Rails7にFont Awesomeをいれる方法

# 開発環境
rails 7.0.4.3
ruby  2.7.6

## yarnを使用して追加する
```terminal:terminal
$ yarn add @fortawesome/fontawesome-free @fortawesome/fontawesome-svg-core @fortawesome/free-brands-svg-icons @fortawesome/free-regular-svg-icons @fortawesome/free-solid-svg-icons
```


::: note
yarnとは

https://www.sejuku.net/blog/96866

:::

## アプリケーションに導入する
```js/app/javascript/application.js
// (以下略)
import { fas } from '@fortawesome/free-solid-svg-icons'
import { far } from '@fortawesome/free-regular-svg-icons'
import { fab } from '@fortawesome/free-brands-svg-icons'
import { library } from "@fortawesome/fontawesome-svg-core";
import '@fortawesome/fontawesome-free'
library.add(fas, far, fab)
```
【初投稿】Rustの文字連結をベンチマークしてみました。

## はじめに

見ていただいて、ありがとうございます。
とある大学生のn0taです。

初めてのqiita投稿なので、優しい目で見ていただけると嬉しいです。

また、プログラミングについても知識不足のため、間違っている点などがございましたら、教えていただけると幸いです。

今回は、Rustの文字連結方法をベンチマークしてみました。

## なぜ行ったのか？

今回、私がなぜベンチマークを行ったのかというと、文字連結を大量に行うコードを書く機会があり、どの書き方が一番速くなるのかが気になったからです。

皆さんも今回のベンチマークを参考にしてみてください。

## 文字連結方法

下記の3つで試みてみました。

- Stringにstrを追加する
- Stringとstrを連結させ、新しいStringを作成する
- Sringとstrをformatマクロに入れる

## 関数紹介

関数の内容は下記の通りです。

```rust
// Stringにstrを追加する関数
pub fn string_push_str() -> String {
    let mut s1: String = String::from("Hello");
    let slice: &str = ", World!";
    s1.push_str(slice);
    s1
}

// Stringとstrを連結させ、新しいStringを作成する関数
pub fn string_concat_str() -> String {
    let s1: String = String::from("Hello");
    let slice: &str = ", World!";
    let s2: String = s1 + slice;
    s2
}

// Sringとstrをformatマクロに入れ、新しいStringを作成する関数
pub fn string_format_str() -> String {
    let s1: String = String::from("Hello");
    let slice: &str = ", World!";
    let s2 = format!("{}{}", s1, slice);
    s2
}
```

## 実行環境

- rustc 1.71.0-nightly

## 実行コマンド

```bash
# bash or terminal
# cargoのbenchコマンドがnightlyのみ対応しているので、変更しています。
$ rustup default nightly

$ cargo bench
```

## 結論

下記の結果となりました。

```bash
running 3 tests
test bench_string_concat_str ... bench:          36 ns/iter (+/- 0)
test bench_string_format_str ... bench:          99 ns/iter (+/- 4)
test bench_string_push_str   ... bench:          36 ns/iter (+/- 0)

test result: ok. 0 passed; 0 failed; 0 ignored; 3 measured; 0 filtered out; finished in 0.94s
```

formatマクロを使った場合、著しく速度がかかりました。(約3倍ほど…)

マクロは汎用的に使えるため、非常に便利なのですが、今回は単純な処理だったので、帰って遅くなってしまったのではないでしょうか？

## 使用したソースコード

https://github.com/tarou1226/bench-string-concat

## 感想

今回はRustの文字連結方法をベンチマークしてみました。

Rustは非常に安全性の高い言語であり、今後もさらに繁栄していくと思うので、これからも挑戦していきたいです。
VSCodeで覚えておきたいもの

# エディターレイアウトを、三分割に分ける
参考：[VSCode： よく使うレイアウト（画面分割）を一発で呼び出す](https://at.sachi-web.com/vscode_split.html)

Macでoption+enterで分割させたかったので、
`"key": "option+enter"`
に変更したところ。うまく動かない。

`"key": "alt+enter"`
でいけました。

optionってaltのことなんですね。
ちなみに[ ]は既存で書いてあったので、そのままで [ と ] の中に書きました。
初心者だとそれさえも分からなかった。
```
[
{
"key": "alt+enter",
"command": "layoutEditorGroups",
"args": {
"orientation": 0,
"groups": [
{ "size": 0.7, "groups": [ {}, {} ] },
{ "size": 0.3 },
]
}
},
]
```

# エディターを消すとレイアウトも消される。
参考：[VSCode – エディターレイアウトを保存する](https://localhost8888.net/visual-studio-code/824/")
せっかく上記で設定したのに、エディターを消すとレイアウトも消されちゃう。

設定→検索
`workbench.editor.closeEmptyGroups`をオフにする。

# ファイルを複数開きたい→ファイルが閉じてしまう
参考：[【VSCode】開いたファイルが勝手に閉じられてしまう現象の対処法](https://daeudaeu.com/vscode-autoclose/)

`Workbench > Editor: Enable Preview`をオフ（チェックを外す）にすればいい
【その３】実際にPowerAutomateでロボットを作る

<br>[【その１】RPA初心者と歩むPower Automate活用日記【ポイ活】](https://qiita.com/tantanshio/items/2b741584f65d8ce967f8)


# ◆PowerAutomateでロボットを作る


新しいフローから作成
![画像１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/2724cc7c-e8e2-7d57-fa2d-87efc5fadd55.jpeg)


新規ロボットを作成（ここではtest作成という名前で作成してます。）
![画像２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/f3a8d9e0-641f-fde3-8b73-3790b7653ae7.jpeg)

作成後、上書き保存を忘れずに。





## ◆ループ処理を入れる

1時間に2回の実行を繰り返し行いたい
そのため、ループ処理を入れる



ループには
・回数指定のループ
・行、データのループ
・条件型のループ
と存在。



設定内容が分かりやすい「回数指定のループ」を利用






![画像３.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/6f18c820-29bb-9ed4-e1ca-a70fe7dece43.jpeg)



開始値、終了、増分を0に設定することでループ回数を無限に設定が可能


回数上限を設ける場合は、終了に数値を入れる




PowerAutomateでは処理を新規追加した際、自動的に変数が用意されるケースがある

今回はLoopindexがそれにあたる
編集から変数名を変更も可能





## ◆処理内容をループの間に入れていく


ループ処理はLoop～Endの間を繰り返し処理が進みます。

赤枠内に行いたい処理を入れることで処理が繰り返し行われるようになります。
![画像４.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/8a001d1f-6d70-9f01-f966-b8bebc7caf6f.jpeg)


# ◆次回　【その４】具体的な処理を入れる
Web業界で働く上で意識したいことや心構えなど

Web業界で働く上で意識したいことや心構えをいくつかご紹介します。

1. 継続的な学習と自己成長:
Web業界は急速に進化しています。新しい技術やトレンドに対応するために、継続的な学習と自己成長を意識しましょう。
技術の変化に追いつくために、オンラインコースや専門書籍、業界のイベントやカンファレンスへの参加を積極的に行いましょう。

2. ユーザーエクスペリエンスの重要性:
Webサイトやアプリの成功は、ユーザーエクスペリエンスに大きく依存しています。
常にユーザーの視点に立ち、使いやすさ、アクセシビリティ、パフォーマンスなどの面で最高のエクスペリエンスを提供することを意識しましょう。

3. チームワークとコミュニケーション:
Webプロジェクトは通常、複数の人々が関与するため、チームワークと効果的なコミュニケーションが重要です。
他のメンバーとの協力、意見の交換、情報共有を積極的に行い、プロジェクトの成功に貢献しましょう。

4. ユーザーフォーカスとデータに基づく意思決定:
ユーザーのニーズや行動を理解し、データに基づいた意思決定を行うことが重要です。ユーザーのフィードバックや行動データを活用し、改善を続ける姿勢を持ちましょう。

5. クオリティとテストの重要性:
Webサイトやアプリの品質は、ビジネスの成功に直結します。品質管理とテストプロセスを重視し、バグやエラーを最小限に抑える努力をしましょう。
自動化テストツールやベストプラクティスを活用し、品質向上に取り組みましょう。

6. プロジェクト管理とタイムマネジメント:
Webプロジェクトはスケジュールや予算に厳しい制約があることが多いため、プロジェクト管理とタイムマネジメントのスキルが重要です。
プロジェクトのスコープや目標を明確にし、優先順位を設定し、効率的なタスク管理を行いましょう。

7. プロフェッショナリズムとコミットメント:
Web業界はクライアントやユーザーの期待に応えるために、高いレベルのプロフェッショナリズムとコミットメントを求められます。約束を守り、品質を追求し、責任を持って仕事を遂行しましょう。

8. マーケットトレンドと競争環境の把握:
Web業界は競争が激しいため、マーケットトレンドや競合情報を把握し、自社のサービスやプロジェクトを差別化することが重要です。
常に市場の動向を注視し、他社との差異化を図る戦略を考えましょう。

9. クライアントやユーザーとの関係構築:
クライアントやユーザーとの良好な関係は長期的な成功につながります。
コミュニケーションを円滑にし、ニーズを理解し、信頼関係を築くことを心掛けましょう。

10. ワークライフバランスの取得:
Web業界はプロジェクトの締切や急な変更が発生することがあり、忙しい状況になることがあります。
しかし、自身の健康とワークライフバランスを大切にし、適切な休息やリフレッシュを心掛けましょう。
Javaのバージョン管理ツールである、jEnvの導入方法メモ

久々にGoからJavaの案件に戻ってきたのですが、Javaのバージョンを8から17に上げる事になりました。  
いい機会なので、Java版のrbenv的なjEnvを使ってみようかなと。  
誰かに伝える時の備忘録として記載しておきます。

## 導入方法

### 現在のバージョンを確認

```shell
$ java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment Corretto-8.362.08.1 (build 1.8.0_362-b08)
OpenJDK 64-Bit Server VM Corretto-8.362.08.1 (build 25.362-b08, mixed mode)
```

### jEnvのインストール

Homebrewからインストール。

```shell
$ brew install jenv
```

シェルに環境変数を追加。

```shell
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
```

シェルに設定を反映。

```shell
$ source ~/.zshrc
jenv has been updated, process to refresh plugin links
```

versionsの確認。

```shell
$ jenv versions
* system (set by /Users/mitsuaki1229/.jenv/version)
```

versionsへ既にインストールされているJavaを追加。

```shell
$ jenv add /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home
corretto64-1.8.0.362 added
1.8.0.362 added
1.8 added
 1.8.0.362 already present, skip installation
```

### JDK17の追加

下記からJDK17をダウンロードし、インストール。

https://www.oracle.com/java/technologies/downloads/#jdk17-mac

versionsへインストールしたJavaを追加。

```shell
$ jenv add /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
oracle64-17.0.7 added
17.0.7 added
17.0 added
 17.0.7 already present, skip installation
```

バージョンの切り替え。

```shell
$ jenv local 17.0.7
$ jenv rehash
```

### 実施後のバージョンを確認

```shell
$ java -version
java version "17.0.7" 2023-04-18 LTS
Java(TM) SE Runtime Environment (build 17.0.7+8-LTS-224)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.7+8-LTS-224, mixed mode, sharing)
```
読書研修ーWebを支える技術　第17章リソースの設計

## ３つのリソースの設計方法
* 関係モデルからの導出
* オブジェクト指向モデルからの導出
* 情報アーキテクチャからの導出

## 関係モデルからの導出
関係モデル(Relational Model)はRDBMSの基礎となっているデータモデルであり、数学的基盤を持っていることが特徵です。ー-タの冗長性を排除するための正規化の手法か確立されており、効率的なデータベース設計ができます。
### 郵便番号データのER図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330699/417c9ca0-dc79-8bbc-d392-2dd569d70e44.png)

### 中心となるテーブルからのリソースの導出
関係モデルからのリソース抽出の一つの定石は、中心となっているテ-ールの1行を1リソースとすることです。テープルの行をリソースに切り出した場合は、そのテープルの主キーを URIに組み込むと実装する。
ただし、今回は郵便番号自体が一意なので郵便番号自身を入れたURIを採用しました。こちらのほうが、クライアントから見たときのURIの可読性が向上し、URIが変わりにくくなります。

### リソースが持つデータの特定
まず、その中心となったテープル持っている属性をリソースに持たせます。
郵便番号テ-プルが持つ「郵便番号」「町域名」「町域名フリガナ」属性を郵便番号リソースに持たせます。
次に、そのテープルが外部キー参照している別のテープルもたどり、その属性も郵便番号リソースに持たせます。つまり、都道府県テープルと市区町村テープルの正規化を崩し、すべてのデータを郵便番号リソースに入れます。郵便番号リソースは郵便番号、住所(都道府県、市区町村、町域)、住所のフリガナ(都道府県、市区町村、町域)の３つのデータを特定できる

### 検索結果リソースの導出
検索のような機能は、検索行為をモデル化するのではなく、「検索結果」をリソースとして表現します。
検索結果リソースは、このデータベースから具体的に何を検索したいのか、というユーザの利用シナリオに基づいて導出します。
郵便番号データベースの場合、次の検索条件：
* 住所の全部または一部による検索
* 郵便番号の全部または一部による検索

それぞれの検索条件をURIに入れるように設計します。（検索キーワードを一括で受け付けるよう）
### 階層の検討
関係モデルの隱れた階層構造は別途ドキュメントなどから理解し、必要であればリソースの設計に反映します。
### トップレベルリソース
ER図からは直接導出できないリソースとして、トップレベルリソースカあります。これはほかのリソースへリンクする大本となるリソースです。例：検索フォーム

### リンクによる結合
リソース間を結合するリンクの設計にはER図の関連が利用できます。

## オブジェクト指向モデルからの導出
### 郵便番号データのクラス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330699/002e6bcd-0185-b9ce-de3a-c737b4280253.png)
### 主要データクラスからのリソースの導出
まず、主要なデータを表現しているクラスを見つけます。
今回は、郵便番号を表現する Zipcodeクラスが主要なクラスになります。この主要なデータを表現しているクラスのインスタンス一つ一つが、それぞれURIを持ったリソースとなります。
### オプジエクトの操作結果リソ-ス
注意しなければいけないのは、クラスのメソッドで表現している処理そのものをリソースとして切り出そうとしないことです。
###階層の検討
PrefectureクラスとCityクラス、CityクラスとTownクラスはそれぞれ1対nのhas-a関係(あるクラスがほかのクラスの一部に属する関係)を持つ。
has-a関係以外にも、is-a関係(あるクラスが別のクラスのサプクラスである関係)やクラス自身の继承関係など、クラス間の構造を表現している場合があります。
### トップレベルリソース
関係モデルと同様に、オプジエクト指向モデルにもトップレベルリソースを直接表現するクラスがないので、別途意識して導出する必要があります。

### リンクによる結合
リソースそのものを表現するオプジエクト(Zipcodeや検索結果のリストなど)は相互に参照を持ちます。この参照はそのままリンクとして表現できます。

## 情報アーキテクチャからの導出
>情報アーキテクチャ(Information Architecture)は、知識やデータの組織化を意味し、「情報をわかりやすく伝え」「受け手が情報を探しやすくする」ための表現技術である。

### 日本郵便のWebサイトの情報アーキテクチャ
郵便番号検索サイトを例として:
http://www.post.japanpost.jp/zipcode
トップページには検索方法として
* 全国地図からの検索
    * 全国地図→都道府県名のリンク→市区群のページ（五十音順にが並んだ）→市区町村のページ
    * 市区郡と市区町村のページでは、その地域内の郵便番号か一覧され、それぞれ個別の郵便番号表示ページにリンク
* 住所での検索
    * プルダウンで都道府県名を選択し、住所の一部を検索フォームに入力
    * 検索結果では条件にマッチした地域の一覧を表示し、町域へとリンクします
* 郵便番号での検索
    * 郵便番号を検索フォームに入力
    * 検索結果では条件にマッチした地域の一覧を表示し、町域へとリンクします
が用意されています。

### パンくずリスト
市区町村などの各ページには、パンくずリストがあります。これによって市区町村から上位の都道府県に戾れるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330699/271b0413-44a9-cbb8-b4ec-4bdb03fa8ad1.png)
pytorchインストール時のnumpyエラー

## numpyエラーで詰まったので解消備忘録

[こちら](https://qiita.com/seichi25/items/fc6c22042f926baa08e6)の記事に従ってubuntuにGPU環境作成時にnumpyのエラー発生。

エラー内容
```
ERROR: Could not install packages due to an OSError:
[Errno 2] No such file or directory: 
'/home/username/espnet/tools/miniconda/envs/espnet/
lib/python3.8/site-packages/numpy-1.24.3.dist-info/METADATA'
```

解決策は[こちら](https://github.com/googleapis/google-cloud-python/issues/6647)のissuesにありました。

該当ファイルを削除し、numpyをインストールしなおしてpytorchを入れるといけるっぽい
```
pip3 uninstall numpy
pip3 install numpy==1.23

pip3 install torch==1.8.2+cu111 torchvision==0.9.2+cu111 to
rchaudio===0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html
>> killed
```
killedされて入らない。。。。。

https://a1026302.hatenablog.com/entry/2021/01/12/150748

`--no-cache-dir`をつけるといいらしい。

```
pip3 --no-cache-dir install torch==1.8.2+cu111 torchvision==0.9.2+cu111 to
rchaudio===0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html
```

無事インストールが通りました

一応確認
```
python
>> import torch
>> print(torch.cuda.is_available())
True
```
Trueが帰ってきてGPUが使える状態になりました。


## 参考
https://qiita.com/seichi25/items/fc6c22042f926baa08e6

https://github.com/googleapis/google-cloud-python/issues/6647

https://a1026302.hatenablog.com/entry/2021/01/12/150748
ユーザーを作成してみる

## 環境
Ubuntu20.4

## はじめに
ローカルの開発環境だけを触っていると、新規でユーザーを作成したり、削除したりすることはまずありません。サーバー管理者であれば、新人が入ってきたら、ユーザーを登録してあげたり、退職者のユーザーを削除するといったことはあるでしょうが、そうでもない限り、自分１人のユーザー以外を登録することは、まずありません。唯一、ユーザーが登録された例は、PostgreSQLをインストールしたときに、postgresユーザーが自動で登録されたときだけです。ユーザー登録にとんと慣れていないことに気づき、勉強のために、ユーザー登録をやってみました。

## 動作確認
ユーザーを新規で追加します。Ubuntuの場合、デフォルトではユーザーを作成しても、homeの配下にユーザーのディレクトリが作成されないようになっています。RedHat系では作成されます。
```
$useradd testuser
```
 
ユーザーが追加されていることを確認します。
```
$cat /etc/passwd
testuser:x:1001:1001::/home/testuser:/bin/sh
```

ユーザーと同じ名前のグループも一緒に追加されていることを確認します。
```
$cat /etc/group
testuser:x:1001:
```

パスワードが登録されているファイルにも、新規ユーザーが追加されています。しかし、パスワードはまだ設定していないため、パスワード欄には！が表示されます。
```
$sudo cat /etc/shadow
testuser:!:19312:0:99999:7:::
```

パスワードを設定します。
```
$sudo passwd testuser
```

パスワードが設定されていることを確認します。パスワードはハッシュ化されて表示されます。
```
$sudo cat /etc/shadow
testuser:$6$rXy8IY1GML...:19312:0:99999:7:::
```

一度設定したパスワードは変更することができます。
```
$sudo passwd testuser
```

設定したパスワードを削除することもできます。削除する場合は、オプションdをつけます。
```
$sudo passwd -d testuser
```

パスワードを削除すれば、パスワード欄の２カラム目は空白になります。
```
$sudo cat /etc/shadow
testuser::19312:0:99999:7:::
```

作成したユーザーでログインできるか確認します。
```
$su testuser
$su - testusr
```

確かに、testuserでログインできていることが確認できます。
```
$id
uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)
```

## 後始末
確認が終わったので、作成したユーザーは削除します。
```
$sudo userdel testuser
```

ユーザー、パスワード、グループと、最後にそれぞれ削除されていることを確認します。
```
$cat /etc/passwd
$cat /etc/group
$sudo cat /etc/shadow
```
XIAO-ESP32-C3 Seed Studio の Arduinoとの違い（メモ）

XIAO-ESP32-C3 SEEDUINO で制作する時のメモ
メモなので、正しいかどうかはご利用前にデバックしてください。（ファームで挙動が変わるかもしれませんので）

### Arduino IDEで書き込み失敗
#### ESP32-C3がビジー
Adruino　IDEで前に入れたプログラムにエラーがあり、
シリアルがビジーになると、以下みたいなエラーで書き込めなくなる場合がある。
~~~
A fatal error occurred: No serial data received.
A fatal error occurred: No serial data received.
~~~
（原因は、IDEの検証はパスしてプログラムの送信ができるが、ESP３２の内部でカーネルパニックでシリアルが応答しない場合などがある）
その場合は、電源入れる前に、ハードウェア左のB（BOOT）タクトボタンを押しながら、USBをPCに挿して、Adruinoでプログラムの書き込みがおわるまで、押し続けるとプログラムが送信される。
![board-pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120804/bae812c0-3a05-141a-a9cc-4af8b102094d.png)

#### ESP32-C3との接続
上記でもダメな場合は、ArduinoIDEとESP32-C3との接続が固まっている場合もあるので、IDEを再起動する。

### ポートの指定
digitalRead(1)とすると、GPIO1が指定される。
digitalRead(D1)とすると、GPIO3が指定される
digitalRead(A1)とすると、GPIO3が指定される

以下のピンマップを参照して、ポート指定するべし。
![pin_map-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120804/d786ddaa-59ee-d929-adc8-4203ab8e6f03.png)


### digitalRead()

INPUTだと、入力値が異常な値になる。必ず、OUTPUTを指定するべし。
```C++:digitalRead.h
int buttonState = 0;
const int buttonPin = 3;// ！GPIO３ を意味する。D3ではないので注意

void setup() {
  Serial.begin(115200);
  pinMode(buttonPin, OUTPUT);//！OUTPUT出ないと動かないので注意
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    Serial.println("HIGH");
  } else {
    // turn LED off:
    Serial.println("LOW");
  }
  delay(100);
}
```
[SES企業]2年目のエンジニアから警笛(転職活動を通して)

# なぜこの記事を書こうと思ったのか
　皆さん、SES企業で過ごしている2年目の底辺エンジニアです。第1回目の投稿になるのですが、なぜ自分がQiitaを使用して衝動的に書こうと思ったのかお話しようと思います。このようなサイトを使って何かを発信していくことは不慣れなのでご了承ください。

　もうタイトル回収をさせていただくと、自身の実力を過大評価してしまっていたので、ショックを受けている最中でして、「エンジニアという道は甘くないよ、キャリア最初楽すると危ないぞ、周りより出来ても天狗になるな」ということを伝えるために、エンジニアとしてこれからキャリアを歩んでいく方(未経験の方)や駆け出しのエンジニアとして順当に歩んでいる方に読んでいただければと思い、執筆しております。多分、デジタルタトゥーを残すと思いますので、もしかしたらこのアカウントを捨てて、別アカウントに乗り換えるかもしれません。ですので、これが最初で最後かもしれません。前置き長くなりました…

# 何者なのか
　あまり詳しく書くと特定されそうなので簡易的に書きます。未経験としてエンジニア業界に入り、要件定義ちょこっとやり、基本設計ちょこっとやり、詳細設計、開発、テスト、AWSの障害対応や機能の改善をガッツリ担当しているフルスタックモドキのWebエンジニアです。一応、フロントからバックエンドと一人で開発したこともあり、DB設計なども携わりました。現在はAWSのとあるサービスについて改善を行っています。
　一見、未経験SESから入り、既に様々なことをして順当にキャリアを歩んでいるように見えますが、現実はそうでもないのです。これから話します。

## 自信過剰になった理由
　ええ、自分でも順当にキャリアを歩んでいるように見えたのです。自分と同様、何もできない人として入った同期は未だに、
* テストばかりで未だにコードすら触っていない
* コードを触っていたとしてもバックエンドのみ
* Excelとの睨み合いっこ
* フロントとバックエンドを触っていても、新規機能追加やDB設計に携わっておらず、ちょっとコード触ったことがある人なら簡単だと思う改修のみ

で、ふと周りを見渡してみたら、自分と同じ年齢で同じスキルまたはそれ以上のスキルを持っている人がいなかったのです。(スマホ系エンジニアの同期除く、そもそもスマホ系専門外でわからん)
1個上の先輩も大したことないなと。そう…同期の中でぶっちぎりに成長した自分。それは愚かな自分を生み出すトリガーになる要因になってしまったのです。

　別件で自分の成長に関しても鈍化しているなと感じていたので、次のアクションとして話題になっている転職ドラフトに登録してみました。で、正直オファー来ないだろうなと思っていたところで、1件だけオファー来たんですよ。はい、すみません、有頂天になりました。自分はできる人間なんだととんだ勘違いを起こしてしまったのですよ。

# 有頂天になった人間が転職活動を開始
　ええ、全く恥ずかしい限りです。有頂天になった自分は、転職サイトに登録して、第二新卒枠として無双できるのではと思っていました。しかし、実際にエージェントから言われたことといえば、「自社開発は今の段階だと無理です」「転職ドラフトで明示された金額は高すぎます、今のスキルから希望年収を見ると書類選考で落ちます」「経験が浅すぎます」「今のあなたの技術的なところで強みってないですよね」と言われるしまつでした。ええ、ごもっともだと思います。挙句の果て、オファーを頂いた企業さんと1次面接をしたのですが、技術面接でそれはもうボロボロにされて落とされました。「エンジニアとして1年何か月しか働いていないのに、そんな高度なこと聞く？」みたいなものも質問として出されました。

# 皆さんにお伝えしたいこと
　<b>基本的にエンジニアは経験年数どうのこうのより(一部大手Sler除く)、確かな技術力があるかないかが残酷なことにあって当然だよねという基本ベースで見られ、そのうえで人柄も見られる世界ですよ。</b>
### エンジニア未経験の方へ
　エンジニアは稼げるとか、プログラミングさえできていればいいとか、色々安直な考え方をしている方多いと思います。昨今、エンジニアがなぜかもてはやされる時代といいますか、プログラミングスクールが安易な広告を出し、それにつられてしまう時代だと思うのですが、そんなに甘っちょろい世界じゃないですよと言いたいです。入ったからには技術力というのが常に求められ、さも知っていて当然だよねが前提条件であり、それがあってこその人物像を見られていく業界です。未経験の方でエンジニアのことを調べた時に、上流工程、下流工程みたいなものを見つけた方もいらっしゃるかと思いますが、「どちらも経験しているから自分最強」にはならないです。しっかりと内容を深堀られます。つまり、表面上に仮面をかぶせたところで通用しない業界です。なので、そのようなことを加味してエンジニアの業界に入られるのであれば、よいのですが、エンジニアとしての面白みや自分をとどめて置けるものがないのであれば、去るべくして去るもしくは底辺でいつまでも過ごすことになりますので、ご了承ください。

### 駆け出しエンジニアの方へ
　駆け出しとは言っても様々なスキル格差が既に生まれていると思います。できる人もいればできない人もいる。で、できない人に関しての記事は多くあると思いますので、できる方に対して執筆していきたいと思います。賢い人は自分を律し、自分の実力がどの程度あるのか冷静に市場価値と日々照らし合わせていくでしょう。そして、足りないと思ったものに対して、日々埋めようとするでしょう。しかし、会社内である種なんらかの比較対象があり、ほぼ全てにおいて他者よりも秀でていた場合は自身を過剰評価してしまうケースもあるでしょう。なので、「あれ、自分できるんじゃね」って思ったら冷静に、いいですか、冷静になって社外に目を向けてみましょう。そうすると、今まで盲目的になっていたものが、急に視野が広がります。そうすると、エンジニアとして次へのステップアップに何が必要なのかが初めてそこで確かな情報が得られます。なので、転職する、しないにしろ転職サイトに登録したり、様々な社外のエンジニアと交流していったり、そのような自発的な行動を推奨します。例えば、転職活動中、最初はメガベンチャーを狙っていたけど、やっぱりスキルが足りないと思ったから、スタートアップでバリバリやってスキルを伸ばしていきたいなどの転換も見つけられると思います。
1Passwordの特定のアカウントのワンタイムパスワードをクリップボードにコピーしたい

- ScriptEditorを開き、
- AppleScriptで下記のコードを書いて、
- `アプリケーション` として ファイル名を適当に `otp-copy.app` として保存する

```
do shell script "/usr/local/bin/op item get '1Passwordのアイテム名' --otp | /usr/bin/pbcopy"
```

- `otp-copy.app` を実行するとクリップボードにワンタイムパスワードがコピーされる
Power Appsによるアプリ開発(Part1-2)

# 目次
- 初めに
- 今回作成するアプリについて
- 作成した内容
- 完成形
- 最後に

# 初めに
こちらの記事は前回から作成しているアプリケーションの続きです。
前回の記事は[こちら](https://qiita.com/gun_lee/items/f930f0c086b88eff4dfe)から見れます。
# 今回作成するアプリについて
今回作成するアプリケーションは、前回に引き続き来店客の人数等を記録する来店記録アプリを作っています。
前回はSharePointによるデータベースの作成、アプリの登録画面の作成を行いました。
今回は登録した記録を参照、変更できるページを作成していきます。
# 作成した内容
- 前回から変更した点
前回作成したアプリの登録画面を少し改良しました。
改良した内容は以下の通りです

    - リアルタイムの日時曜日の表示
    - 参照画面に遷移するためのアイコンの設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/f076547d-8db5-e106-b16c-6b0d4d7ac917.png)

細かいところですが、更にアプリらしくなったと思います。

- 記録参照画面作成
それではアプリ画面を作成していきたいと思います。
まずは登録された記録を確認する画面を作成していきます。
ギャラリーでデータベースに登録されたデータを表示させるようにし、探しやすくするために日付、時間、店舗名で絞り込みができるようにします。
```:Items(キャラリー)
Filter(
    来店記録,
    IsBlank(DatePicker1.SelectedDate) || 日付 = DatePicker1.SelectedDate,
    IsBlank(Dropdown1.Selected.Value) || 時間.Value = Dropdown1.Selected.Value,
    IsBlank(Dropdown2.Selected.Value) || 店舗名.Value = Dropdown2.Selected.Value
)
```
更に、ギャラリーで選択した記録の詳細を見るための表示フォームを設置します。
それに加えて、ギャラリーで選択したデータがどれか分かりやすくするために選択されたら色を付けるようにします。
選択した記録を変更するためのボタンの設置、前回作成した登録画面へ移動するためのアイコンを設置したらこのようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/25e5daf1-b8cb-a465-1acc-64f8c9216001.png)

動作も問題なく動いてくれて、見た目もかなりアプリっぽくなってきました。

- 記録変更画面作成
それではこれから登録した記録を変更するための画面を作成していきます。
また1からフォームを作成するのは大変なので、前回作成した登録画面を複製し、編集用に改良していきたいと思います。
主に変更したのは以下の通りです。
    - フォームのモードを編集モードにする
    - 日付、時間、店舗名を変更できないようにする
    - 天気、気温の自動取得機能の撤廃
    - 編集画面から戻るためのアイコンの設置
    - 変更完了したら参照画面に移動する

これらをやってみたらこのようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/c0c5efea-dc80-9db8-3739-088d48fde48a.png)

登録画面をうまく利用することで簡単に作成できました。
しっかり変更したデータが登録されていることも確認できました。
最後に各画面に遷移できるように設置したアイコンに遷移する機能を導入して完成です。

# 完成形
そして、実際に出来たアプリの全画面はこのようになりました。
- 登録画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/f076547d-8db5-e106-b16c-6b0d4d7ac917.png)
- 記録参照画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/25e5daf1-b8cb-a465-1acc-64f8c9216001.png)
- 変更画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/c0c5efea-dc80-9db8-3739-088d48fde48a.png)
これでアプリの画面は一通り完成出来ました。
# 最後に
今回は来店記録アプリの残りの画面の作成を行いました。
前回作成したものを再利用したりしたので前回よりも簡単に作ることが出来ました。
次回はこのアプリを使って登録されたデータを可視化し分析できるようにしたいと思います。
【🔰初心者メモ🔰】figmaでプロトタイプが使えない

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

figmaでプロトタイプを使おうとした時に、遷移を設定するための丸ポチが出ない場合の解決方法を共有というかメモレベルです。:sweat_smile:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e6bb1b7a-8490-5013-62e2-2b85ce13ffb7.png)

# 結論
グループ化ではなく**フレーム**が必要でした。

# 設定
対象のオブジェクトを選択し、右側のメニューからグループ→フレームに変更します！

# おわりに
フレームに変更するとプロトタイプ設定が可能になりました！
mysqldumpを「8.0.32」にアップグレードするとRDSのMySQL環境に対して、mysqldumpができなくなったときの対応メモ

# 発生した事象について（2023/5月時点）
Amazon RDSのMySQL8環境に対して「mysqldump」コマンドを使用して、指定したスキーマのバックアップを取得しようとしたところ次のエラーが発生した。

```console
$ mysqldump --defaults-extra-file=設定ファイル --single-transaction -R --set-gtid-purged=OFF --default-character-set=utf8 --hex-blob スキーマ名
 mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user ユーザ名 (using password: YES) (1045)
```

# 原因
おそらくこれが原因：[公式ドキュメント](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-32.html)

>The data and the GTIDs backed up by mysqldump were inconsistent when the options --single-transaction and --set-gtid-purged=ON were both used. It was because in between the transaction started by mysqldump and the fetching of , GTIDs on the server could have increased already. With this fixed, a FLUSH TABLES WITH READ LOCK is performed before the fetching of to ensure its value is consistent with the snapshot taken by mysqldump. GTID_EXECUTEDGTID_EXECUTED

↓以下翻訳↓
>single-transaction と --set-gtid-purged=ON のオプションを両方使用すると、mysqldump でバックアップしたデータと GTID に矛盾が生じました。
これは、mysqldumpによって開始されたトランザクションと、サーバ上のGTIDのフェッチの間に、既に増加している可能性があるためです。
この修正により、FLUSH TABLES WITH READ LOCK がフェッチの前に実行され、その値が mysqldump によって取得されたスナップショットと一致することが確認されました。

つまり「8.0.32」のバージョンアップでFLUSH TABLES WITH READ LOCKを実行する際に権限が必要になったため、権限がないと怒られている。
じゃあ、権限付与してあげればいいじゃん。。というわけにもいかなかった↓

# 解決方法
- 対処法１：実行ユーザーに権限を付与する方法（不採用）
    - Amazon RDS環境だとrootユーザでログインして実行ユーザに権限を付与することはできないため不採用（2023/5月現在）

- 対処法２：mysql実行時に「--single-transaction 」オプションを外して実行する（不採用）
    - テーブルロックが外れるため一貫性が保てない可能性があるため不採用

- <b>対処法３：mysqldumpのダウングレード（決定）</b>
    - 上の対応方法ではダメそうなので暫定的に「8.0.31」にダウングレード

# mysqldumpのダウングレード方法
[ここ](https://downloads.mysql.com/archives/community/)から目的のバージョンの「MySQL Community Server」をダウンロードする

※私の環境ではUbuntuだったのでUbuntu20.04の場合の方法
```console
$ wget -P https://downloads.mysql.com/archives/get/p/23/file/mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar
$ tar xf mysql-server_*bundle.tar
```

おそらく依存関係の問題でエラーが出るので、依存関係のあるパッケージをインストールする
※私の場合、以下が必要でした
- mysql-common_8.0.31
- mysql-community-client-plugins_8.0.31
- mysql-community-client-core_8.0.31
- mysql-client_8.0.31
【Salesforce】新規ToDoの項目を必須化したい

# 問題

ToDoのページレイアウトで必須項目を設定したが、活動タブで表示している「新規ToDo」では反映されてなかった。

# 解決策

活動タブで表示している「新規ToDo」のレイアウトはページレイアウトとは別。

設定→グローバルアクション→新規ToDo、またはアクションのレイアウトから変更可能。
Kubernetes: field selectorで利用できるフィールド一覧

Kubernetesのfield selectorで指定できるフィールドの一覧です。

**Pod リソース:**

- metadata.name
- metadata.namespace
- spec.nodeName
- spec.restartPolicy
- spec.schedulerName
- spec.serviceAccountName
- spec.hostNetwork
- status.phase
- status.podIP
- status.podIPs
- status.nominatedNodeName

**Node リソース:**

- metadata.name
- spec.unschedulable

**ReplicationController リソース:**

- metadata.name
- metadata.namespace
- status.replicas

**Event リソース:**

- involvedObject.kind
- involvedObject.namespace
- involvedObject.name
- involvedObject.uid
- involvedObject.apiVersion
- involvedObject.resourceVersion
- involvedObject.fieldPath
- reason
- reportingComponent
- source
- type
- metadata.namespace
- metadata.name

**Namespace リソース:**

- status.phase
- metadata.name

**Secret リソース:**

- type
- metadata.namespace
- metadata.name


## 情報源

- https://github.com/kubernetes/kubernetes/blob/6d6d858ef28b7049243ebf17ae85359b79708010/pkg/apis/core/v1/conversion.go#L34-L100
SonarQubeServerをdockerを使って秒で構築する

備忘録的なもの

dbはpostgresqlで立てる

下記のものを対象のserverへコピペする

https://github.com/SonarSource/docker-sonarqube/blob/master/example-compose-files/sq-with-postgres/docker-compose.yml

貼り付け先はどこでも良いが、こんな感じに配置してみた

```
/sonar-qube/docker-compose.yml
```

sonar-qube配下へ移動し、下記コマンドを実行
```
docker-compose up -d
```

少しするとsonarqubeのコンテナが落ちてしまった
下記のものを参考にして対応してみたら問題なくport 9000にアクセスできた

https://stackoverflow.com/questions/63739600/while-running-the-docker-compose-up-it-exited-error-code-0

初期のログイン情報はid admin , pass admin
これ以降の情報はかなりあるので調べてみて（使用するCIツールによって多少違いがある）
低レベルなプログラミングとは？

### はじめに
レベルが低いプログラミングを指す言葉ではありません。

### 低レベルなプログラミングとは
低レベルなプログラミングは、コンピュータのハードウェアやアーキテクチャに直接アクセスする方法です。
これにより、細かい制御や高速な処理が可能になりますが、同時に複雑さも増します。

### 例
例えば、低レベルのプログラミング言語としては、アセンブリ言語があります。
アセンブリ言語では、コンピュータの命令セットアーキテクチャに基づいて、機械語に近い形でプログラムを書きます。
具体的な処理を命令の塊（アセンブリコード）として表現することができます。

### 一番シンプルな例
アセンブリ言語の一番シンプルな例として「Hello, World!」を表示するプログラムは以下のようなものです。

```
section .data
    hello db 'Hello, World!'

section .text
    global _start

_start:
    ; writeシステムコールの準備
    mov eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, 13

    ; writeシステムコールの実行
    int 0x80

    ; プログラム終了の準備
    mov eax, 1
    xor ebx, ebx
    int 0x80
```

### コードの説明

このアセンブリコードは、Linux環境で実行されることを想定しています。_startというエントリーポイントからプログラムが始まります。
このプログラムでは、まずhelloというメッセージをメモリ上に定義します。その後、writeシステムコールを使用して、メッセージを標準出力に表示します。
最後に、exitシステムコールを使用してプログラムを終了させます。

### 終わりに
このように、低レベルなプログラミングでは、具体的なメモリアドレスやレジスタの値を直接操作する必要があります。
そのため、より高度な抽象化や自動化は提供されませんが、それにより細かい制御が可能になります。

ただし、低レベルなプログラミングは初心者にとっては難しいです。
一般的には、高レベルなプログラミング言語（例：Python、Java、C++）を使った方が簡単で効率的な開発ができます。