OmniAICreator/Qiita-1.07M huggingface dataset:
オブジェクト指向

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/13f65630-faf9-da16-9490-132890d8eaeb.png)
１：クラス間の関係
　様々なくランスを定義すると、クラス間に関係が生じる場合もあります。クラス間の関係を下記にまとめます。

「クラス間の関係」
・集約ー分解関係：全体と部分の関係。part-of関係ともいう。
・汎化ー特化関係：親子の上下関係
・スーバクラス、親クラス、基底クラス：汎化ー特化関係における上位クラス
・サブクラス、子クラス：ハンカー特化関係における下位クラス
・インヘリタンス、継承：上位クラスの構造を下位クラスが引き継ぐこと
・ポリモルフィズム、多相性：同じ名称のメソッドを出しても、オブジェクトごとに異なる動作を行うこと

※試験例：インヘリタンスとは、「基底クラスの性質を派生クラスに受け継がせること」
※試験例：汎化は「クラス間に共通する性質を抽出し、基底クラスを作る」こと

２：インヘリタンス（継承）
　クラスに上下関係を作ると、上位クラスで定義した内容を自動的に下位クラスに引き継がせることができるようになります。上位クラスで定義したデータ項目やメソッドを自動的に下位クラスが引き継ぐことをインヘリタンス（継承）と言います。
　インヘリタンスの考え方も、私たちは日常的によく使っています。例えば、「ランブータン」をご存知でしょうか。知らなくても、「フルーツの一種です」と言えば、だいたい納得できるはずです。フルーツという概念で定義されている「食物」、「なにかの実」、「甘そう」といった事柄が、自動的に「ランブータン」に当てはめられたからです。つまり、インヘリタンスを行ったわけです。あとは、「ランブータン」特有の特徴を聞けば、完全に納得できます。
　このように、インヘリタンスが可能であると、いちいち最初から説明しなくても良くなりますから便利です。プログラムの場合も、全く同じです。下位クラスでは、上位クラスとの違いだけをプログラムすれば良いのです。これを差分プログラミングと言います。上位クラスで定義されているデータ項目やメソッドは自動的に下位クラスに引き継がれ、下位クラスでも利用できます。

４：オーバライドとポリモルフィズム
　上位クラスからメソッドを引き継ぐ際に、上位クラスでの定義とは異なった動作にしたいこともあります。この場合、下位クラスで再定義（オーバライド、上書き）することも可能です。
samba 覚書

よく忘れるのでメモ

ここでの対象は Debian 11.7 です。

## samba インストール 
インストール
~~~ shell
$ sudo apt install samba
~~~

## ユーザ作成
LOGIN-USER  は自分の名前に。
~~~ shell
$ sudo pdbedit -a LOGIN-USER
~~~

## 設定
samba の設定
~~~ diff:/etc/samba/smb.conf
  [homes]
-   read only = yes
+   read only = no
-   create mask = 0700
+   create mask = 0666
-   directory mask = 0700
+   directory mask = 0777
~~~

## ファイアウォール
ポート 139, 445 を解放
~~~ shell
$ sudo ufw allow 139
$ sudo ufw allow 445
~~~

## サービス再起動
~~~ shell
$ sudo systemctl restart smbd
~~~
Arduino UNO R3（互換機）とWindowsPCの接続

# 概要

・Arduino UNO R3互換機を入手。
・WindowsPCに接続してスケッチを書き込めるように設定。

# 使用機材

・Arduino UNO R3（互換）
　ODSeven　UNO R3 (CH340G) MEGA328P for UNO

https://odseven.com/products/uno-r3-ch340g-mega328p-for-uno-r3-no-usb-cable

https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-63EG

・WindowsPC
　適当に。


# 接続

WindowsPCとArduino（互換機）を接続する。
インタフェースはUSB Type-B。

# 環境設定

WindowsPCにArduino IDEをインストールする。
いくつか種類があるが、IDE2をインストール。

https://docs.arduino.cc/software/ide-v2

IDEの環境設定については、ボード選択で「Arduino UNO」を選択するだけ。さすが互換機。
ポートはUSBケーブルを抜き差しして現れるポート名を選択。

# 書き込み

Arduino IDEを起動し、スケッチをArduinoに書き込む。
ファイル/スケッチ例（Examples）にサンプルスケッチがあるので、「01.Basic」の「Blink」を選択。
「Blink」はボード上のLEDを点滅させるプログラムで、接続&書き込みテストにはちょうどいいでしょう。
書き込みボタンをクリックし、書き込み完了すれば成功。
いろいろ設定変更や書き込みをしていると、書き込みエラーが起こることがある。そのときはUSBケーブルを抜き差しすると復旧することが多い。

# Blink

グレー部分はコメントなので、必要な部分は以下のとおり。

~~~:Blink.ino
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
~~~

1行目「void setup() {」と3行目の「}」はセットで毎回書く。
意味は起動時に1回だけ処理する。
2行目はボードのインタフェースを入力に使うか出力に使うかを指定。
サンプルでは「LED_BUILTIN」を出力に使うと宣言。
ちなみに「LED_BUILTIN」はボード上のLEDで、ピン番号では13番。
なので「pinMode(13, OUTPUT);」でも動く。

5行目「void loop() {」と10行目の「}」もセットで必要に応じて書く。
意味は無限ループ。
6行目　13番ピンに5vを出力。（LED点灯）
7行目　1000ms待機。
8行目　13番ピンに0vを出力。（LED消灯）
9行目　1000ms待機

待機秒数を書き換えて再度書き込みし、想定通りに点滅したらチェック完了。
Webを支える技術 ―― HTTP，URI，HTML，そしてREST まとめ

今回は表題の通り、こちら　「Webを支える技術 ―― HTTP，URI，HTML，そしてREST」を読み、以下にまとめます。

<h3>なぜ、まとめようと思ったのか?</h3>

A. 現在、レガシー環境の大規模なサイトに携わっており、基本的なWebの仕組みを説明できない自分を克服したいと考えているため、まとめてアウトプットしようと思い、まとめております。


::: note warn
ただし、一部抜粋しています。基本的には、初歩的なHTMLや文字列、数値などの項目は、省略しています。各自、学習していただければと思います。

読者様のターゲット層は、Webエンジニアとして １年目くらいで　業務をおこなしているが、Webの仕組みについて、特にHTTPやステータスコードについて説明できない人をターゲットにしています。もし、気になる章がありましたら、ご一読して、役に立っていただけると幸いです。

::: 

随時、更新していきます。

::: note 
表題の書籍 「Webを支える技術 ―― HTTP，URI，HTML，そしてREST まとめ」 
第３章 HTTP ~HTTPの基本~ (6章~)からまとめています。
:::

1 . [6章 HTTPの基本](https://qiita.com/takechanel/items/14f963fa0714553518c1)

2 .[7章 HTTPメソッド](https://qiita.com/takechanel/items/b9d816d22df8662ae60f)

3 . [8章 ステータスコード](https://qiita.com/takechanel/items/dc4f04531587710b698d)

4 . [9章 HTTPヘッダ](https://qiita.com/takechanel/items/c720c463237f046d1328)

::: note warn

10章~13章は省略。

:::

5 .[14章 JSON](https://qiita.com/takechanel/items/402d81be590af3039e20)
ソフトウェアテスト・10/9~10/15のテーマ

# 1.はじめに
+ あくまで学習テーマを決めるための記録
+ 学んだものを後で見直すため
+ アウトプットの習慣化
+ 情報収集の時間を短縮するためChatGPTを使用する

# 2.ソフトウェアテスト
### 経緯
+ チーム開発でバグ処理のやり方が手当たり次第になってしまった。
+ まとめてテストするのではなくて最小単位で試すようにしたい

### これから学ぶもの（学んだらリンクにします。）
+ [エラーについて[論理エラー,実行時エラー,構文エラー,例外]](https://qiita.com/yuyas7/items/8e27cbd6b2799385503b)
+ [TDD（テスト駆動開発）について](https://qiita.com/yuyas7/items/e631bf0c44784238c952)
+ [プログラムのテスト[ブラックボックステスト（外部）, ホワイトボックステスト（内部）]について](https://qiita.com/yuyas7/items/ac4b2ad1f6a8ff3d7676)
+ [アサーションと汎用テスト関数](https://qiita.com/yuyas7/items/1d42317913b4a52b97b9)
+ [手動テストと自動テストについて](https://qiita.com/yuyas7/items/03d4664b661fc3f4bd08)
14章 JSON 「Webを支える技術」


<h3>14.1JSONとは何か</h3>
JSONは、「JavaScript Object Notation」の略で、RFC4627が規定するデータ記述言語です。その名の通り、JavaScriptの記法でで０田を記述できる点が最大の利点である。シンプルさが故に、プログラミング言語間でデータを受け渡せれる。

WebサービスではJavaScriptが相性良いことと、XMLと比べ**データの冗長性**
が低いことなどの利点からAjax通信におけるデータフォーマットとして活用できる。

<h3>14.2 メディアタイプ</h3>
JSONのメディアタイプは「application/json」です。JSONは仕様上
UTF-8、UTF-16などにエンコードできるようになっているため、最初の文字を確認すれば、エンコーディングを特定できるが、メディアタイプにも設定できる。

```
Content-Type : application/json; charset=utf-8
```

<h3>14.3 データ型</h3>
JSONにはデータ型があります。基本的なことであるため、抜粋します。

1. オブジェクト
    オブジェクトは、名前と値の集合体である。オブジェクトの名前は文字列である。値は、ブーリアン型や数値、文字列、オブジェクト、配列の値が取れる。

```
{
"name" : "Name",
"number" : 5,
"hobby": ["book", "movie", "eat food" ],

}
```

1. 配列
1. 文字列
1. 数値
1. ブーリアン
1. null

::: note warn

※配列と、文字列、ブーリアン型などは割愛する。理由は基本的な用語であるから。

:::

リンク
ハイパーメディアフォーマットには欠かせない。JSONでリンクを表現するには、
単純にリンクを文字列で持つことは簡単です。

```
{
"link" : "http:://www.exaple.jp",
}
```

::: note warn

URIを相対パスにすることは可能ですが、絶対パスの方がベストです。
理由：相対パスだと、相対パスURIをはっきりする必要があるからです。

:::

<h4>JSONPによるクロスドメイン通信</h4>
JSONでリソース表現を提供する副次的効果として「JSONP」が利用できる。

JSONPを説明する前に、「Ajaxで用いるXMLAPIは、セキュリティ上の制限から、
JAvaScriptファイルを取得した同じサーバとしか通信できません」。

::: note  warn

JavaScriptと異なる別サーバと通信できてしまうと、ブラウザで入力した情報をユーザが知らぬ間に不正なサーバと通信できてしまうからである。

:::

このように、不特定多数のドメインに属するサーバに通信できるような仕組みをクロスドメイン通信と呼ぶ。
しかし、不特定多数のサーバと通信できず、単一なドメインとしか通信できないのは不便である。
例えば、地図データと郵便番号データを保持せずに、APIを使用し、そこから便宜データを取得するのは、できないからである。


しかし、XMLHTTPRequestでも、複数のドメインサーバと通信できる方法はあります。

HTMLに複数の**scriptタグ**を用いて、複数のドメインから取得する方法である。
script要素は、歴史的に複数のドメイン要素を取得できるからである。

<h4>14.5コールバック関数を取得するJSONP</h4>

JSONPはブラウザの特性を利用して、JSONPではクライアントがオリジナルのJSONをコールバック関数でラップしてドメインの異なるサーバからデータを取得する。

つまり、コードに落とすと以下のようになる。

```test.html
<html>
  <head>
    <title>クロスドメイン通信</title>
  </head>
  <body>
    <script type="text/javascript">
      function foo(zip) {
        alert(zip['zipcode']);
      }
    </script>
    <script src="http://www.zip.ricollab.jp/1120002.json?callback=foo">

    </script>
  </body>
</html>
```

[イメージ図]
(https://www.figma.com/file/Ms3Ul4BPUrW9gcCRADK61O/JSONP%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%80%9A%E4%BF%A1?type=design&node-id=0%3A1&mode=design&t=IwwHMMViPjhjVXG0-1)

リクエストとレスポンスについては以下のようになります。

| リクエスト |                                   |     | 
| ---------- | --------------------------------- | --- | 
| GET        | 1120002.json?callback=foo HTTP1.1 |     | 
| Host       | zip.recollab.jp                   |     | 

| レスポンス   |                        |     | 
| ------------ | ---------------------- | --- | 
| HTTP1.1      | 200 OK                 |     | 
| Content-Type | application/javascript |     | 

```
foo({
    "zipcode" : "1120002",
    "address" : {
      "prefecture": "東京都",
      "city" : "文京区",
      "town": "小岩川",
    },
    "yomi": {
      "prefecture" : "とうきょうと",
      "city": "ぶんきょうく",
      "town" : "こいわかわ",
    }

  })
```
【プラクティス紹介】1分でさらっと分かる「完成の定義」

## プラクティス名（別名）
完成の定義　（DoD、Definition of Done、Doneの定義、完了の定義、Cut-over Criteria、DONE-done）

## プラクティスの目的・狙い
* スプリントの成果物（インクリメント）を「完成」と見なす品質基準を揃える
（＝完成させるためにすべきことが明確化される）

## どんな時に使うか
* スクラムでは必須（スプリント0などで定義し、随時更新）
* 何をもって「完成」とするか、人によって認識が異なる状況を是正したい時

## 実施手順
1. プロダクトをリリースする際に満たしていなければならない条件をチームで話し合い、リスト化する
1. リストの内容はステークホルダーとも合意し、チームが常時参照できる場所に掲載する
1. スプリントプランニングでは「完成の定義」から逆算したタスクも含めるようにする
1. スプリントレビューでは「完成の定義」を満たしているものだけをインクリメントとして扱う
1. リストはレトロスペクティブなどで定期的に見直し、不足があれば随時更新する

:::note info
「完成の定義」として例えば以下のような観点が挙げられる(どこまで定義に含めるかは現場による)
* テスト完了条件（例：ユニットテスト完了、既存機能の自動テストパス）
* 非機能要件　　（例：パフォーマンステスト完了、セキュリティ基準合格）
* ドキュメント化（例：設計書作成＆レビュー完了）
* 社内手続き　　（例：本番移行申請準備）
* 法令遵守　　　（例：関連法規に違反がないことを確認済み）
* 付帯作業　　　（例：ソースリポジトリにコミット済み、自動テスト作成済み）
* 引継ぎ　　　　（例：運用チームへの説明、リカバリ手順確立）
* 他チーム調整　（例：I/F先チームとの初回稼働フォロー体制）
* ユーザ説明　　（例：ユーザアナウンス＆マニュアル提供済み）
* 残課題整理　　（例：暫定措置やバグの取り扱いに関する関係者合意）
:::

## アレンジ例
* スプリント中には行えないが、リリースまでには行うこととした作業を別途「Undoneタスク」として一覧化する。
 
:::note warn
公式スクラムガイドでは上記の運用を認めていない。Undoneタスクを溜め込むとリリース不能に陥るリスクが増すため注意が必要。極力スプリント中に消化することが理想ではあるが、Undoneタスクを完全に無くすことは難しい。
:::
## アンチパターン
* 「完成の定義」の記述自体が曖昧で、人によって解釈が異なる
* 「完成の定義」を詳細かつ網羅的に書こうとして、長々としたチェックリストになってしまう
（＝項目が多すぎると、かえってルールは守られない）

## 参考情報
[公式スクラムガイド(2020年日本語版)](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)

https://www.agile-studio.jp/post/apm-definition-of-done

## こぼれ話（私的コメント）
チームは最初から完璧な「完成の定義」を持つことはできないので、やりながら定義を育てていくことが大切です。とはいえ、スプリントを重ねていくとリストがどんどん長くなる「育ちすぎ問題」が発生することも。個人的な意見としては、リストが長くなってきたら、もう当たり前になった項目を削除してダイエットした方が良いと思います。そもそも関係者間の認識齟齬防止が目的なので、認識が揃った後はただの備忘録でしかありません。もしもリストから項目を削ることにPOが難色を示す場合はそもそもベースとなる信頼関係が築けていない、ということかもしれません。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
Webコーディング - (模写)1CulumnPF(2023/10/09)


2023/10/09 模擬コーディング_1CulumnPF
<制作時間 3時間>
>descriptionは必須
>”main”を忘れない
>imgにクラス属性をつける、「target=_blank rel=“noopener noreferrer”」
>picture、<source media=“(max-media)” srcset=>でスマホ用画像と切り替え
>object-fit: coverで画像の高さを固定
>text-align:justifyで文章の両端が揃うように設定
>flex-wrap: フレックスアイテムの折り返し
<form action="#" method="post">

>フォームの設置
label for="name">NAME</label>
input type="text" id="name" name="your-name">
>送信ボタン
div class="button"><input type="submit" value="送信">
「プロを目指す人のためのRuby入門」を読んでみた

## はじめに
今回Rubyの学習を進める上で「プロを目指す人のためのRuby入門」を読みました。
初学者が読んだ感想を書いていきたいと思います。

https://gihyo.jp/book/2021/978-4-297-12437-3


## 良かったところ
1. 充実した内容
　第1章から第13章までの537ページに渡りRubyの技術を豊富に学ぶことができます。
本書の全体や進め方についてしっかりと説明されています。

1. 例題の豊富さ
　各章で例題が用意されており実際に手を動かして学ぶことができます。

1. 現場で求められる書き方を学ぶことができる
　現場でよく使う書き方だけでなく、使われなくなった書き方などの細かい技術まで記載されています。

1. 最後まで読み切るコツがあること
　本書は初学者に向けて「頭の中にインデックスを作る」ことを目的に学習することを薦めています。初学者にとっては内容が複雑で、わからない事がたくさん増えることで学習から遠ざかってしまうことも想定されます。そのため学習のハードルを下げて進めて良しとしてくれているところがありがたいです。


## 学んだこと
### Minitestを使用したテストの自動化
用意されている例題はテストを使用しつつ解いていきます。なぜテストが必要なのかの解説ややり方などが丁寧に解説されています。

### 

### 正規表現
正規表現とは「パターンを指定して文字列を効率よく検索/置換するためのミニ言語」のことです。
書籍の中でも1章かけて学びますが、初学者は以下の解説記事で学習してから書籍に戻ってくる方が理解が深まります！
[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)
[初心者歓迎！手と目で覚える正規表現入門・その２「微妙な違いを許容しつつ置換しよう」](https://qiita.com/jnchito/items/64c3fdc53766ac6f2008)
[初心者歓迎！手と目で覚える正規表現入門・その３「空白文字を自由自在に操ろう」](https://qiita.com/jnchito/items/6f0c885c1c4929092578)
[初心者歓迎！手と目で覚える正規表現入門・その４（最終回）「中級者テクニックをマスターしよう」](https://qiita.com/jnchito/items/b0839f4f4651c29da408)

### モジュール
継承を使わずにクラスにインスタンスメソッドを追加することやミックスインする事ができる機能です。
Rubyは単一継承を採用しているが、ミックスインを利用することで多重継承に似た仕組みを実現する事ができます。
モジュールは以下のような構文で定義します。
```:Ruby
module モジュール名
　　#モジュールの定義(メソッドや定数など)
end 
```




## 難しかったところ
　この本は、プログラミングの入門書ではないため基礎知識が必要な初学者にとっては難しい内容でした。私は一度別の入門書を学習してから本書の内容に入りました。

当たり前ではありますが、、、
現場で使うような高度な技術に加え、ある程度プログラミング言語を使用したことのある人向けの内容を数日〜数週間で完全に理解することは困難でした。


## おわりに
　今回は「プロを目指す人のためのRuby入門」を読んだ感想を書いてみました。
初学者の私にとって本書の内容を1周しただけでは理解できるものではありませんでしたが、とても力が付いたように感じます。
ですが、まだまだ基礎を含め学習が不十分であるため基礎力を上げ再度本書にトライしたいと思います。

次回この教材を手に取るときには今よりもレベルアップした自分で入れるよう日々精進したいと思います。
せんせー、アクセラレータ駆動システムってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、アクセラレータ駆動システムってなに？

# アクセラレータ駆動システムとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## アクセラレータ駆動システムって何？

みんな、遊園地の乗り物で、すごく速く走ったり、高く飛んだりするのが楽しいよね？「アクセラレータ駆動システム」は、特別な研究のための「速くする機械」の一部だよ。この機械は、とても小さい粒子を速く飛ばすのに使われるんだ。

## どういうこと？

アクセラレータ駆動システムは、小さい粒子をすごく速くして、特定の目的のために使われるもの。例えば、これを使って新しいエネルギーを作ったり、物質の中身を調べたりするのに役立てられるよ。

## どうしてそれがすごいの？

このシステムを使うと、普通の方法ではできないような特別な実験や研究をすることができるんだ。それによって、新しい知識や技術を生み出すことができるから、とてもすごいことなんだよ。

## だから、アクセラレータ駆動システムってなに？

アクセラレータ駆動システムは、特別な研究のための「速くする機械」のこと。これを使って、新しいことを発見するための研究が行われているんだ。

# まとめ

このように、アクセラレータ駆動システムは、私たちの知らない新しいことを発見するための特別な機械。それがあるおかげで、科学者たちはたくさんの新しい発見をして、私たちの未来をもっと良くするための研究を進めているんだよ。
せんせー、オプティカルトゥイーザーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、オプティカルトゥイーザーってなに？

# オプティカルトゥイーザーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## オプティカルトゥイーザーって何？

みんな、太陽の光で虫眼鏡を使ってものを焦点に合わせたり、小さなものをよく見たりしたことがあるよね？オプティカルトゥイーザーは、特別な光を使って、とても小さなものをつかんだり、動かしたりする道具だよ。

## どういうこと？

オプティカルトゥイーザーは、光の力を使って、とても小さなもの、例えば細菌や細かい粒子を、動かすことができるんだ。手ではつかめないほど小さいものも、この光のトゥイーザーで扱うことができるよ。

## どうしてそれがすごいの？

私たちの目には見えないくらい小さいものを、直接手でつかむことはできないよね。でも、オプティカルトゥイーザーを使うと、そんな小さなものも簡単につかんだり動かしたりすることができる。それは、まるで魔法のようだね！

## だから、オプティカルトゥイーザーってなに？

オプティカルトゥイーザーは、光の力を使って、とても小さなものをつかむ特別な道具なんだ。

# まとめ

このように、オプティカルトゥイーザーは、私たちが普通の手ではできないような、小さなものを操作するための魔法のような道具なんだ。それによって、科学者たちはとても小さい世界をもっと深く研究することができるようになったんだよ。
SQLに特化したLLMモデルをFine-tuningで作ってみました（Mistral-7Bに基づいて）

# 1.Mistral-7Bとは
「Mistral-7B」は、一週間前にヨーロッパAI企業「Mistral AI」が公開された、最近すごい人気なLLMモデルです。
特徴は7BですがLlama2の13Bよりも性能が良いです。（Bはbillionのことで、7Bなら70億個分のパラメータが持っていることです。）
HuggingFaceでは、このモデルを基にFine-tuningされたモデルが最近結構多いです。
私も、もともとは、「英語から日本語への要約モデル」をFine-tuningしたかったですが、やはりデータの準備が時間かかりますし、難しかったので、少しシンプルなモデルにしました。
そこで、日常的にも使えそうなSQL特化モデルが良いかなと思って、SQLクエリデータを使ってトレーニングしを試してみました。
手法はQLoRAで、１日ほどトレーニングしました。

# 2.データの準備とトレーニング
SQLの処理なので、一番シンプルなQA形式データを使用しました。Huggingfaceで78K件のデータセットを見つけ、プラスChatGPTを利用して50k件学習データを作成し、合計120K件データでトレーニングしました。
そこまで大量なデータではないので、あまり時間かけずに学習できます。
なので、全部３回学習を実施しました。
パラメータなどの調整でこちらは一番よかった回のLossです。（0.69）
個人的にはこのSQL文生成のケースでは0.5-0.8くらいのlossは一番よいかと感じていました。（0.000Xくらいまでにすると汎化性能なくなりますので、SQLには向いてないかと思います。）
ちなみに、過学習を防ぐと時間を節約するためにはEpochも１回だけにしました。

![屏幕截图 2023-10-09 171808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/bbf11b41-cf90-0e80-1e3b-53eaa62b53e4.png)

# 3.性能確認
ネットで見つけたSQL練習問題を試してみました。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d4dd35bb-6163-ca0f-b63d-322e1c7af6f5.png)
１枚目は私のモデル、２枚目はchatGPT4の回答です。どちらも正しいですが、GPT4は説明もあって、DIFFERENCEという集計項目も作ってくれました。（QUESTIONにはないですが）

他の練習問題も試したところ、同じような感じで、両方ともほぼ間違っていることはなかったです。
今回Fine-tuningで特化したモデルがGPT4より優れたことは多分処理時間だけですね。（SQL特化モデルは3-5秒、GPT4は5-10秒くらい）

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/39c5e4cc-602e-600c-ae40-19b344c7d956.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/44d893a0-84e6-2d3c-1154-c5616849d0ea.png)



こちらのモデルについてはhuggingfaceにも公開していますので、興味ある方は試してみてください。
https://huggingface.co/kanxxyc/Mistral-7B-SQLTuned

Mistral-7Bについて
https://mistral.ai/product/
Excelにあるデータをmatplotlibを使って円グラフで並べたい場合

# やりたいこと

以下のようなデータExcelに入っている時に、A部・B部・C部のレベルの内訳をそれぞれ円グラフで示したいのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/c2cb366e-03d8-be8a-bb97-0cfb9099edf4.png)

# ソリューション

`matplotlib`を使います。もっといい書き方がありそうですが。

~~~ Python:en.py
#!/usr/bin/env python
# coding: utf-8

# 必要なモジュールのインポート
import matplotlib.pyplot as plt
import japanize_matplotlib  # <- これ
import numpy as np
import pandas as pd

# 不要な警告を非表示にする
import warnings
warnings.filterwarnings('ignore')

# 入力Excelのファイル名、シート名
in_file = 'data.xlsx'
in_sheet1 = 'リスト'

#----------
# Excelの読込
df_1 = pd.read_excel(in_file, sheet_name=in_sheet1, index_col=0, header=0)
df_1 = df_1.drop('合計')

print(df_1)


# RGB値での色の指定（0から255の値）
colors = [
    (255, 170, 180),  # 赤
    (255, 255, 128),  # 黄
    (140, 255, 140),  # 緑
    (128, 192, 255),  # 青
    (128, 128, 128)   # 灰色
]

# RGB値を0から1にスケーリング
colors = [(r / 256, g / 256, b / 256) for r, g, b in colors]

# グラフの設定
pie_num = len(df_1.columns)
fig, axes = plt.subplots(1, pie_num)
fig.suptitle('レベル分布')

for i in range(pie_num):
    axes[i].pie(df_1[df_1.columns[i]], labels=df_1.index, startangle=90, colors=colors, counterclock=False, labeldistance=None)
    axes[i].axis('equal')  # 円を円形に保つ
    axes[i].set_title(df_1.columns[i])


# グラフを表示
plt.show()
~~~

とりあえず出力されたので、よかったです。今後コードは改善予定。

（おわり）
AWS Cloud Practitioner 学習記録１

:::note info
AWS Skill Builder における下記コンテンツの学習記録（ポイントとメモ）です
AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)
:::

# モジュール１：AWSの紹介

### 概要
コンピューティングの世界をコーヒーショップに見立てて説明してくれる

+ コーヒーショップの従業員（サーバのインスタンス）に注文（リクエスト）すると、リクエスト内容を確認してコーヒーを淹れ（コンピューティング）、商品（レスポンス）をくれる
+ コーヒーショップや従業員は、お客さんの需要に応じて複数用意したり、１日中そこにいる必要があったりする（**いわゆるオンプレミスはこの状態にならざるをえない**）
+ AWSにおいてはこのような準備は必要ではなく、１クリックで**コーヒーショップの従業員を呼び出し、コーヒーを淹れ終わったらいなくなってもらう**、ということが実現できる

AWSにおいてのクライアントサーバモデルは、以下で構成されるモデルをイメージすればよい

+ クライアント：Webブラウザやデスクトップアプリケーション
+ サーバ：Amazon Elastic Compute Cloud (**Amazon EC2**) で提供されるサービス


### クラウドコンピューティング
クラウドコンピューティングで大事な部分は以下の文章のとおり

> クラウドコンピューティングは IT リソースをインターネット経由でオンデマンド配信するもので、料金は従量課金制です

AWSが「画一的で面倒なITの作業」と呼ぶ、他社と差別化できない（する必要がない）IT要素・リソースの確保を、AWSを活用することで実現できるようになっている

##### クラウドコンピューティングのデプロイモデル
+ クラウドベースのデプロイ
    + アプリケーションのすべてをクラウドへ
+ オンプレミスデプロイ（プライベートクラウドデプロイ）
    + アプリケーション管理と仮想化技術でリソースを最適化
+ ハイブリッドデプロイ
    + クラウドリソースとオンプレミス環境を接続して併用

##### クラウドコンピューティングの利点
+ 先行支出を変動費にできる
    + 事前のインフラ構築がいらない（イニシャルコスト最小化）
+ データセンタの維持費用が不要になる
    + 自分でインフラを管理しなくてよい（ランニングコスト最適化）
+ 容量の予測が不要になる
    + 状況に応じてリソースは増やせる／減らせる
+ クラウド規模のスケールメリットを享受できる
    + 利用者が多い分だけ従量料金が抑えられていく
+ スピードと俊敏性が向上する
    + 実験とイノベーションに時間を費やすことができる。思い立ったが吉日
+ 数分で世界中にデプロイ
    + アプリケーションは世界中にデプロイでき、低レイテンシーを実現できる


#

ここまで20分程度
導入だけなのでまだ「Amazon EC2」くらいの用語しか出てきません

AWS Skill Builderのコンテンツはとても簡潔にできていて、
導入として非常にわかりやすいです
画面幅によって画像を切り替える方法

# はじめに
レスポンシブなサイトを制作する際に、PC用とスマホ用で、違う画像を表示させたい場合に使えます。

# 方法
pictureタグの子要素に、sourceタグとimgタグを書きます。

:::note warn
・imgタグ必須
・sourceは何個でもOK、なくてもいい
:::

```html:HTML
    <picture>
        <!-- PC用の画像 -->
        <source media="(min-width: 768px)" srcset="./img/fv.png" />
        <!-- スマホ用の画像 -->
        <img
          src="./img/sp/fv.png"
          alt="素材の美味しさをそのままに Sweet Delight"
        />
    </picture>
```

sourceタグのmedia属性によって、画面幅を指定できるため、PC用とスマホ用で異なる画像を指定できます。

上記のコードを見ると、sourceタグのmedia属性には、768pxより大きい画面幅を指定しているので、PC用の画像を指定しています。また、srcset属性に画像のURLを書きます。

imgタグに指定した画像は、自動的に画面幅が768pxより小さい場合に表示されるため、スマホ用の画像を指定しています。
Windows環境(cmd)でSaasの環境構築

学校の図書館で手に取ったこちらの本でSaasを導入しようとして、
Chapter1から詰んで時間かかったので、備忘録メモ

ちなみに書籍では、gulpを使って、saasファイルを更新するたびにcssファイルを掃き出す様になるらしい

https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%AE%E3%83%97%E3%83%AD%E3%81%8C%E6%9C%AC%E6%B0%97%E3%81%A7%E6%95%99%E3%81%88%E3%82%8B-HTML-CSS%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E8%AC%9B%E7%BE%A9-Design-IDEA/dp/4797386533


（なお、本の☆レビューは酷評の模様）

### 実行環境

        OS：Windows 11 Home
        バージョン：22H2

## エラーの対応方法

https://qiita.com/mdrq/items/b815bd360d46d22ea6d8

上記記事を参照して、ゴミデータになりそうな以下の項目を削除

・node_modules ディレクトリ
・package-lock.json
・yarn-lock.json


## Pythonのバージョン

pythonは3だとエラー起きるから、2.x系がいいという記事を多くみたので、3を消して2.7を入れた。
![スクリーンショット 2023-10-09 180917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573602/085fd385-df2c-f911-58eb-0e8eae2e9fc6.png)


## Node.jsのバージョン

https://qiita.com/mdrq/items/b815bd360d46d22ea6d8

こちらの記事でv12,v14系だとエラーが起きるとのことで、
私も同様エラーが発生していたのもあり、v10に変更。

![スクリーンショット 2023-10-09 180546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573602/dad33f52-6374-b039-fe9b-70b332b3b602.png)



## Nodeとnode-sassのバージョンをあわせる

以下のサイトでnode-sassのバージョンが公開されている。
また、Node.jsとnode-sassのバージョンは互いに対応しているバージョンを入れないといけないと他の記事で書いてあった。



https://www.npmjs.com/package/node-sass

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573602/32ac8735-e072-e6a9-e58e-c6cf3c0639d2.png)

さっき、Node.jsはv10にしたので、上記表から対応するnode-sassは4.10以上だとわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573602/1f1de7c3-3a2f-11b7-716e-baa4faf185a9.png)

4.10以上のバージョンのうち、4.14.1がdownloadが多いからpackage.jsonに以下を追記する

```
"node-sass": "^4.14.1"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573602/af5dc5bf-a8ca-d9a7-e87d-7e679f9556c5.png)


## npmのインストール

あとは書籍のインストールに従って、Node.jsパッケージ、およびgulp(ガルプ）の導入をした。

```
npm install gulp -g
```

```
npm install
```


### バージョン詳細
一応、実行時のバージョンをスクショしておく

![スクリーンショット 2023-10-09 180810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573602/a5281a4a-dce7-1ab5-c558-4f18dc32c5f4.png)
AWS Lambdaでseleniumを使う方法

# はじめに

備忘録がてらAWS Lambdaでseleniumを使う方法を記載していきます。

- seleniumはサードパーティのライブラリなのでlambda layerでの利用が必須
- また、headless chromium (GUIがないgoogle chromeのようなもの)とchromedriverの導入も必須
- 以下のウェブサイトが非常に参考になるので基本的にはこれを見ればいい
    - [AWS Lambda上でheadless-chromiumを動かすときのchromedriverとheadless-chromiumのバージョンの組み合わせ調査 | Create it Myself](https://create-it-myself.com/research/research-combination-of-chromedriver-and-headless-chromium-versions/)
- ライブラリ等の条件
    - Python 3.7 (3.7はAmazon Linux、3.8以降はAmazon Linux 2という違いがあり、それが影響しているのか3.8以降では上手く動作しない)
    - Selenium 4.1.0（他のバージョンは未検証だが、おそらく動くのではないか）
    - severless-chromium v1.0.0.37
    - chromedriver 2.37
    - 上記のウェブページで言及があるが、chromiumとchromdriverの組み合わせは上記以外はほぼ動かない
- AWS Cloud9でlambda用のレイヤーを準備する方法が上記のウェブページで述べられているが、WindowsのWSLでも問題ない。自分はそれで実施した。

# 自分が実行したコード

lambdaのレイヤーは、seleniumと、headless-chromium+chromedriverの2つがある。

## 1. selenium

```bash
mkdir python
pip3 install selenium==4.1.0 -t ./python/lib/python3.7/site-packages
zip -r python.zip python
```

## 2. headless-chromium+chromedriver

```bash
mkdir headless
cd headless
curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
unzip -o chromedriver.zip -d .
unzip -o headless-chromium.zip -d .
rm chromedriver.zip
rm headless-chromium.zip
cd ..
zip -r headless.zip headless
```

## lambdaのコード

```python
from selenium import webdriver

def lambda_handler(event, context):

    URL = "https://news.yahoo.co.jp/"

    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    options.add_argument("--disable-gpu")
    options.add_argument("--hide-scrollbars")
    options.add_argument("--single-process")
    options.add_argument("--ignore-certificate-errors")
    options.add_argument("--window-size=880x996")
    options.add_argument("--no-sandbox")
    options.add_argument("--homedir=/tmp")
    options.binary_location = "/opt/headless/headless-chromium"

    # ブラウザの定義
    browser = webdriver.Chrome(
        "/opt/headless/chromedriver",
        options=options
    )

    browser.get(URL)
    title = browser.title
    browser.close()

    return title
```

# エラー一覧

- chromedriver unexpectedly exited. Status code was 127
    - -> ランタイムがpython3.7以外になっている
- Unable to import module 'lambda_function': No module named 'selenium'
    - -> レイヤーのzipの階層を作るとき、seleniumを入れるパスが間違っている。./python/lib/python3.7/site-packagesが正解

# 最後に

実はlambdaでseleniumを使えるようにするまで2週間丸々かかりました。原因は、pip3 installするときのインストール先が、「python」という名前のフォルダ以下でなくてはならないのを忘れていて、
自分で勝手に名付けたフォルダに入れていたのが原因でした。いや～～～疲れた。
この備忘録が、同じ課題を抱えている人の助けになれば幸いです。
sqliteで列の差分を抽出、テーブルに列追加、新規データ登録

まだ書きかけです。フォルダーツリーとか載せてません。

データをsqlliteのテーブルに登録するとき、
列(カラム)が新規データと差分が出てしまうのを自動で
解決したくてつくりました。

データ分析に使うので、データ型はINTで決め打ちになってます。
これをstreamlitに応用したら、また記事書きます。

```python
import sqlite3
import csv

open_csv = open("test.csv")
read_csv = csv.reader(open_csv)
master_row_columns = []
for row in read_csv:
    master_row_columns.append(row)
master_columns = master_row_columns[0]

open_csv = open("test2.csv")
read_csv = csv.reader(open_csv)
insert_row_columns = []
for row in read_csv:
    insert_row_columns.append(row)
insert_columns = insert_row_columns[0]

master_columns_list = master_columns

print(master_columns)
print(insert_columns)
diff_list = set(master_columns) ^ set(insert_columns)
diff_list = list(diff_list)

insert_name = ''
for name in insert_columns:
    insert_name = insert_name  + name + ","
insert_name = insert_name[:-1]
print(insert_name)
print(diff_list)
for diff in diff_list:
    master_columns_list.append(diff)
print(master_columns_list)

insert_count_text = ''
for i in range(len(insert_columns)):
    insert_count_text = "?," + insert_count_text
insert_count_text = insert_count_text[:-1]
print(insert_count_text)

#test.dbを作成し、接続（すでに存在する場合は接続のみ）
con = sqlite3.connect("test.db")
cur = con.cursor()

#testテーブルを作成（IF NOT EXISTSは「存在しなければ作成する」という意味）
create_test = "CREATE TABLE IF NOT EXISTS test (id INTEGER, name TEXT, height INTEGER, weight INTEGER)"
cur.execute(create_test)

#マスターのカラム更新
if diff_list is not None:
    for column in diff_list:
        alter_columns_test = "ALTER TABLE test ADD COLUMN "+ column +" INTEGER"
        cur.execute(alter_columns_test)

#testテーブルのデータを削除（何回もコード実行すると同じデータ追加されるので）
delete_test = "DELETE FROM TEST"
cur.execute(delete_test)
#csvファイルの指定
open_csv = open("test2.csv")

#csvファイルを読み込む
read_csv = csv.reader(open_csv)

#next()関数を用いて最初の行(列名)はスキップさせる
next_row = next(read_csv)

#csvデータをINSERTする
rows = []
for row in read_csv:
    rows.append(row)

#executemany()で複数のINSERTを実行する
cur.executemany(
    "INSERT INTO test (" + insert_name +") VALUES ("+ insert_count_text +")", rows)

#テーブルの変更内容保存
#csvも閉じておきましょう
con.commit()
open_csv.close()

#testテーブルの確認
select_test = "SELECT * FROM test"
select_test_result = cur.execute(select_test)

with open('test.csv', 'w', newline="") as f:
    writer = csv.writer(f)
    writer.writerow(master_columns_list)
    writer.writerows(select_test_result)


print("—————————-")
print("fetchall")
print("—————————-")
print(cur.execute(select_test))
print(cur.fetchall())
print("—————————-")
print("for文")
print("—————————-")
for i in cur.execute(select_test):
    print(i)

#データベースの接続終了
con.close
```
エラー：SyntaxError circular argument referenceの解決方法

## 【開発環境】
Ruby 2.7.5
Rails 6.1.7.6

### どういう時にエラーが発生したか
秀和システムの「Ruby on Rails 6 超入門」で学んでいます。
進めていく中、「2-6 メッセージボードを作ろう」で「circular argument reference」というエラーが発生。

![スクリーンショット 2023-10-08 19.23.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568360/14982102-8a26-9d83-4214-849a9ee3a8ea.png)

### エラーの原因
以下のサイトによると、ruby2.2.0以降から、メソッドの引数のデフォルト値に同じ名前の変数を使おうとするとcircular argument referenceというエラーが発生するようです。
https://qiita.com/a_ishidaaa/items/47a8459aa5fe5512871a

### エラーの解決方法
こちらは、キーワード引数に括弧（）を付ける事でエラーを解消しました。

修正前　※以下のコードでエラー発生
```
def initialize(msg:mag, name:name, mail:mail)
  self.name = name
  self.mail = mail
  self.msg = msg
end
```

修正後　※以下のコード修正後、エラー解消
```
def initialize(msg:mag(), name:name(), mail:mail())
  self.name = name
  self.mail = mail
  self.msg = msg
end
```

### 【まとめ】　
2.2.0以降はなんでこのような仕様になってしまったのか疑問がありますが、とりあえずはエラー解決できてよかったです。
何かご指摘がありましたらお願いします！ここまで読んで下さり、ありがとうございました！
Python仮想環境 コマンド辞書

Pythonの仮想環境の構築にあたり、必要だったコマンドをまとめました。

## 環境構築
### 仮想環境の構築（Pythonのバージョンを指定）
```
$ py -3.11 -m venv <環境名>
```
`-3.11`の部分を任意の数字に変えることでバージョンを指定できます。

### 仮想環境の有効化
```
$ <環境名>\Scripts\activate.bat
```
### 仮想環境の終了
```
$ deactivate
```

## その他よく使いそうなコマンド 

### Pythonのバージョン確認
```
$ py -V
```
### インストール済みのライブラリの確認
```
$ pip list
```
### 現在のディレクトリに新しいフォルダを作成
```
$ mkdir <フォルダ名>
```
Sprintf関数は本当に遅いのか、検証してみた

## 経緯
Goのプログラムで、文字列を結合する処理を行うために以下のようなコードを書いてプルリクを出したところ、

```go
    id := "1000"
    url := fmt.Sprintf("https://example/path?id=%s", id)
```
以下のような指摘をもらった。
>Sprintfは遅いので、文字列結合を使ってください

当時は、素直に```url = "https://example/path?id=" + id```のように書いて終わったのだが、本当に遅いのか、実証できていなかったので確認する事にする。

## 検証環境
macOS Ventura 13.2.1

```shell
$ go version
go version go1.21.2 darwin/amd64
```

## 検証
Sprintfと、単純に文字列を結合する処理にかかる時間を比較するため、以下のメソッドを用意する。
```go
func formatStringUsingUnion() {
	_ = "Hello" + "," + "world"
}

func formatStringUsingFmt() {
	_ = fmt.Sprintf("%s,%s", "Hello", "world")
}
```

そして、main関数でそれぞれのメソッドを実行し、かかった時間（ナノ秒数）を計測する
``` go
func main() {
    fmt.Println("formatStringUsingUnion")
    then := time.Now()
    formatStringUsingUnion()
    fmt.Println(time.Now().Sub(then).Nanoseconds())
}
```
``` go
func main() {
    fmt.Println("formatStringUsingFmt")
	then := time.Now()
	formatStringUsingFmt()
	fmt.Println(time.Now().Sub(then).Nanoseconds())
}
```

すると、以下のような結果が得られた。
```shell
% go run main.go
formatStringUsingUnion
124
```

``` shell
% go run main.go
formatStringUsingFmt
2203
```

単純に文字列を結合するのに比較し、fmt.Sprintfは10倍近く時間がかかることが分かる。
また、runtime.ReadMemStats関数を用いても、消費されるメモリの量は2倍近くになっていることがわかった

## なぜ、Sprintfは遅いのか
Sprintfの実装を見てみる。
```go
// Sprintf formats according to a format specifier and returns the resulting string.
func Sprintf(format string, a ...any) string {
	p := newPrinter()
	p.doPrintf(format, a)
	s := string(p.buf)
	p.free()
	return s
}
```

ここでは、ppポインタを生成している。
```go
p := newPrinter()
```
そして、ここが異様に長い。
``` go
p.doPrintf(format, a)

func (p *pp) doPrintf(format string, a []any) {
...
}
```
doPrintfの中身は、長くなるので、ここに貼ることは省略するとして、
以下のような処理が行われている。

まず、入力されたフォーマット文字列の内容を解析し、処理している。
フォーマット文字として%s,%v,%dなどの他にも、
#や空白文字が渡る場合がある。
どういったフォーマットが指定されているのか、全て確認している。

そして、フォーマットに基づいて内部で保持しているbufferに1文字ずつ追記し、```string(p.buf)```の部分で文字列に変換されている。

Go Forumを探してみたところ、既に同じような[指摘](https://forum.golangbridge.org/t/fmt-sprintf-vs-string-concatenation/23006)があった。

>I was testing a simple function and noticed that the benchmarks for fmt.Sprintf seem much slower as opposed to just concatenating the strings.
訳) fmt.Sprintfのベンチマークが、単に文字列を連結するよりもずっと遅いことに気づいた。

デベロッパーの回答として、文字列フォーマットは遅いですとあった。
やはり、フォーマット文字列をパースするためにコストがかかっているらしい。

> Formatting strings is slower. The arguments to Sprintf (or Printf, Fprintf, etc.) have to be wrapped into interface{}s, then put into an []interface{} slice, then the format string has to be parsed for formatting directives, an underlying buffer has to be created, and then the parsed format string is written into it

## 対応
Sprintfが遅いという事で、文字列を繋げる程度の処理であれば、基本は結合した方が良さそう。結合された後のフォーマットが決まっているのであれば、結合する処理をラップして専用のメソッドに切り出すなどをした方がいいと思う。また、スレッドの中で提案されている通り、[```strings.Join```](https://pkg.go.dev/strings#Join)を使うのも1つの策にはなると思う。
Unsupported major.minor version 52.0 の原因と解消法

## 環境
- 言語　Java
- 開発環境 IntelliJ

## 事象
昨日、プロジェクトコンパイル時に以下のエラーが出力された。
```kotlin:エラーログ
org/jetbrains/kotlin/idea/gradleTooling/AndroidAwareGradleModelProvider : Unsupported major.minor version 52.0
```

## 調査結果
JDKとJREのバージョン差異で発生する。

## 対応
以下３つを統一させる。

・システム環境変数「JAVA_HOME」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/e8c13b32-3fab-bfb0-8ae2-7a05acac14a6.png)

・プロジェクトのSDK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/cda9b897-09b6-4446-2f98-af93839f6abf.png)
・GradleプロジェクトのJVM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/4aa3f646-2f66-67a6-e553-72fa2e6cc9fc.png)



## 参考資料
https://rollbar.com/blog/java-unsupported-major-minor-version-52-0/
【iOS】輸出コンプライアンスの回答を省略する

# はじめに
AppStoreに審査に出す際やテストフライトに出すときなど、毎回輸出コンプライアンスの設定をするのが面倒なので聞かれないように設定します

# やりかた
`Info.plist`にITSAppUsesNonExemptEncryptionを追加して、`NO`を設定します
```Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>ITSAppUsesNonExemptEncryption</key>
	<false/>
</dict>
</plist>
```

![スクリーンショット 2023-10-09 17.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/623e20ff-4007-dd0a-a076-50e93a7b4df8.png)

# おわり
これだけなのでやったほうがいいですね
H2データベースにuserのテーブルを作る方法

# 結論
userをクォート「"」で囲むと作成できる
## 結論に至るまでの経緯
Entityクラスの作成で、テーブル名userを次のコードで作成するとエラーが発生した。
```.java
@Table(name = "user")
```

```:エラー内容(一部省いている)
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table user (id bigint not null, gender varchar(6) not null, name varchar(20) not null, primary key (id))" via JDBC Statement
…
…
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "create table [*]user (id bigint not null, gender varchar(6) not null, name varchar(20) not null, primary key (id))"; 期待されるステートメント "identifier"
Syntax error in SQL statement "create table [*]user (id bigint not null, gender varchar(6) not null, name varchar(20) not null, primary key (id))"; expected "identifier"; SQL statement:
create table user (id bigint not null, gender varchar(6) not null, name varchar(20) not null, primary key (id)) [42001-214]
```

Webで色々と調べても解決できなかったため、Chat-GPT-3.5にエラーコードを入力し解決方法を質問してみると
`テーブル名「user」がH2データベースの予約語や制約に違反している可能性がある`
と回答が返ってきた
試しにテーブル名を`usertest`で実行するとエラーがなくなった。
H2の予約語について調べると次のサイトが見つかった。

https://zenn.dev/rstliz/articles/69c1fd6c7401eb

内容を見ると、H2データベースで`user`は予約語として指定されており、このままでは使えないが
userをクォート「"」で囲めば使えることが分かった。
当初のコードに適用すると、次のコードになる。
```.java
@Table(name = "\"user\"")  //javaの文字""内に記載のため「"」は「\"」と書く必要がある
```
この内容で実行すると問題なく実行できる。
[React]React IframeでHTMLの情報を表示する

## はじめに
React Ifameを使って、HTMLを表示するURLを表示する方法を書いていきます。

## 参考
こちらがドキュメントになります。
https://www.npmjs.com/package/react-iframe

## React Iframeをインストール
まずは、以下のコマンドでReact Iframeをインストールしていきます。
```: ターミナル
npm install react-iframe
```
packege.jsonを確認します。
```:packege.json
"dependencies": {
    "react-iframe": "^1.8.5",
  },
```

## コードに適用する
React Ifameを使用するには、以下のようなコードにします。
今回は、News APIで取得できるURLを使用します。

```
import Iframe from "react-iframe";

<Iframe 
 url={"https://www3.nhk.or.jp/news/html/20231007/k10014218571000.html"} 
 width="100%"
 height="1000px"
/>
```

すると、、、
![スクリーンショット 2023-10-09 17.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/f7650441-9321-92fc-8fe9-06b0ea80cf26.png)
このように、表示できるようになりました！

## 最後に

他にも色々な記事を書いているので、よければ読んでいってください、、、
[基本設計について](https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc)
[Vue.jsとNode.jsでチャットアプリを作った](https://qiita.com/hukuryo/items/265c676d17fe21e75242)
[Next.js×TypeScriptでTODOアプリを作成する](https://qiita.com/hukuryo/items/ebeb26823f944f143b11)
オーバーレイネットワークについて

# オーバーレイネットワークについて

**1. 序論**

**オーバーレイネットワークの必要性**
近年、クラウドコンピューティングやデータセンターの複雑化に伴い、柔軟でスケーラブルなネットワーク構成が求められています。オーバーレイネットワークは、物理的なネットワークの制約を超えて仮想的なネットワークを構築する手法として注目を浴びています。

**オーバーレイ技術の概要**
オーバーレイネットワークは、既存のネットワーク上に仮想的なネットワークレイヤーを追加する技術です。これにより、物理的な接続や配置に関係なく、任意のノード間で仮想的なネットワークを形成することができます。

---

**2. 基本的なネットワークの復習**

**OSIモデルの概要**
ネットワークを理解するための基本モデルとして、OSIモデルがあります。このモデルは、ネットワークの動作を7つのレイヤーに分けて説明しています。

**各レイヤーの役割と特徴**
ネットワークの各レイヤーは、物理的な接続からアプリケーションまでの異なる側面を担当しています。具体的には、物理的な接続を担当する物理層から、ネットワーク間の通信を実現するネットワーク層、さらにアプリケーション間の通信を担当するアプリケーション層までの役割が存在します。

---

**3. オーバーレイネットワークの原理**

**カプセル化とは何か？**
カプセル化は、一つのデータパケットを別のプロトコルヘッダで包み込むことを指します。オーバーレイネットワークにおいては、元のネットワークパケットを新しいヘッダで包み、それを転送する形となります。

**デカプセル化とは何か？**
デカプセル化は、カプセル化されたパケットから元のデータを取り出す過程を指します。オーバーレイネットワークにおいては、受信側で新しいヘッダを取り除き、元のネットワークパケットを取り出します。

**オーバーレイにおけるLayer 2とLayer 3の役割**
オーバーレイネットワークでは、Layer 2がカプセル化とデカプセル化の役割を担い、Layer 3がカプセル化されたパケットの転送を担当します。

---

**4. オーバーレイネットワークのメリットとデメリット**

**仮想的なネットワークの利点**
オーバーレイネットワークの最大の利点は、物理的なネットワーク構成や

位置に関係なく、柔軟にネットワークを構築・変更できる点です。これにより、リソースの追加や移動が容易になり、スケーラビリティと柔軟性が向上します。

**オーバーレイの限界と課題**
一方、オーバーレイネットワークには、カプセル化に伴うオーバーヘッドや、物理的なネットワークの問題を隠蔽することによるトラブルシューティングの困難さなどの課題もあります。

---

**5. 実際のオーバーレイ技術**

**VXLANの紹介**
VXLANは、オーバーレイネットワークを実現するための代表的なプロトコルの一つです。VXLANを使用することで、大量の仮想ネットワークを物理的なネットワーク上で柔軟に構築することができます。

**他のオーバーレイ技術の例**
VXLANの他にも、NVGREやSTTなど、様々なオーバーレイ技術が存在します。それぞれの技術には、特有の特徴や利点、適用シーンがあります。

---

**6. Kubernetesにおけるオーバーレイネットワーク**

**CNIとオーバーレイ**
Kubernetesのコンテナネットワークを実現するためのインターフェースとして、CNI(Container Network Interface)があります。CNIを使用して、Kubernetesクラスタ内でのオーバーレイネットワークを実現することができます。

**Kubernetes環境でのオーバーレイの利用例**
Kubernetesにおいて、オーバーレイネットワークは、Pod間の通信やクラスタ間の通信を効率的に実現するための手段として広く使用されています。

---

**7. 結論**

**オーバーレイネットワークの今後の展望**
オーバーレイネットワーク技術は、クラウドコンピューティングやネットワークの複雑化に伴い、ますます重要な位置を占めるようになるでしょう。特に、5Gやエッジコンピューティングの普及に伴い、オーバーレイネットワークの重要性はさらに高まることが予想されます。

**まとめ**
オーバーレイネットワークは、現代のネットワーク環境において不可欠な技術となっています。この技術を理解し、適切に利用することで、柔軟でスケーラブルなネットワーク構築が可能となります。
Figma使用tips

- figmaはスマホンやパソコンのUI画面を設計するための製品
- 一個のfigmaプロジェクトは page→frame→コンポーネントの順で作成
  - コンポーネントはアプリ画面上の図形や文字のこと、frameは一個のアプリ画面、pageは複数frameを含める
  ![スクリーンショット 2023-10-09 16.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/eaec2ce7-bcc7-f91c-edc0-cd375752cd17.png)
  - frameの作成と画面種類
  ![スクリーンショット 2023-10-09 16.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/37143273-01be-c3b3-59cb-759c38662640.png)
- 編集モードは Design（画面編集）と prototype（画面遷移や動画）がある
  ![スクリーンショット 2023-10-09 16.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/05c7fd82-349d-5d3f-289c-df00b4d6b57a.png)
- 一般では、画面コンポーネントがframeの外に移動されると、frameに属していないと判定されるが、手動でframeのリストに移動するで、所属関係になる
  ![スクリーンショット 2023-10-09 17.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/67a40ecb-a7cb-7c65-b0ea-e9fffa9e1166.png)
- shift+1 で画面中の内容全てを表示できるようにzoom調整
- 素材探しは画面左下のcommunityで探す
  ![スクリーンショット 2023-10-10 14.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6cea883c-3b43-6278-75b2-14a4086df143.png)
- 画面をパーツに分けて設計の時、frameのlayout　gridで、２で分けやすい数字のcolumnをいれる
  ![スクリーンショット 2023-10-10 15.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/8f165da7-2007-1342-b464-c32e51f6bb1c.png)

- ショットカットのの確認
  ![スクリーンショット 2023-10-18 7.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/f004510e-ae89-a270-0138-302ec1f44735.png)
C#のEntityからER図作ってみた


フリーランスやってます。  
最近、その年で本当にプログラムできるんですか？  
と疑われることが多いので作ってみました！


## トピック

- 簡単なプログラムですが、一応クリーンアーキテクチャ（DI、テストファースト）
- 構文解析エンジはRoslyn
- 最速で作る

## 仕様

最速で作るためとにかく手抜き
- mermaid記法のテキストを出力
- 面倒なリレーションの記述はテンプレートファイルに記述
- やることは、クラスのプロパティ情報をRoslynで抜き出すのみ

## 動かし方
1. コードの取得＆ビルド
  https://github.com/tag8851/ERGenerator

1. テンプレートファイル作成     
サンプルを参考にしてテンプレートを作成する。  
※@@に続いてクラス名を記述するだけ
    ```bash
    #サンプルテンプレートファイル     
    erDiagram
      Company ||--o{ Emp : emplyess
	    @@Emp
	    @@Company
    ```
1. 実行
  第１引数：テンプレートファイル名  
  第２引数：Entityコードフォルダ名  
  第３引数：出力ファイル名
    ```bash
    >ERGenerator ”Samples\Sample.tmpl" "Samples" "outER.txt"
    ```

## 出力イメージ

```mermaid
erDiagram
  Company {
    int Id "ID"
    string Name "会社名"
    string Address "住所"
    string Tel "TEL"
    DateTime CreatedDate ""
    DateTime UpdatedDate ""
  }
Company ||--o{ Emp : "従業員"
  Emp {
    int Id "ID"
    string LastName "姓"
    string FirstName "名"
    string Sex "性別"
    string ComapyId "会社ID"
    DateTime CreatedDate ""
    DateTime UpdatedDate ""
  }
Company ||--o{ Branch : "支店"
  Branch {
    int Id "ID"
    string Name "支店名"
    string Address "住所"
    string Tel "TEL"
    DateTime CreatedDate ""
    DateTime UpdatedDate ""
  }

```

## 次の展開
- nothionへの自動アップデート
- Roslynの深堀
- Githubからコードを取得して完全自動化？
AWS Organizations

Organizations導入でできること
- SCP(サービスコントロールポリシー)によるOU単位のポリシー設定　（ガードレール）
- 一括請求
- 各AWSサービスの統合

SCPの考え方
- 上位のOUでできないことは、下位のOUでできない。<BR><B>下位に行くにしたがって権限がどんどん狭くなる

一括請求
- 1枚の請求書
- ボリュームディスカウントを受けやすい
- リザーブドインスタンスの共有によりディスカウントを受けやすい

統合
- CloudFormation StackSetsで複数アカウント操作可能
- CloudTrailを複数アカウントで有効化して組織証跡用S3に保管
- ServiceCatalogで組織管理の製品を素早くリリース
-
せんせー、ターニング完全マシンってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ターニング完全マシンってなに？

# ターニング完全マシンとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ターニング完全マシンって何？

みんな、お絵かきツールの中にたくさんの色や形があること知ってるよね？ターニング完全マシンは、考えられるすべてのお絵かきや計算をすることができる魔法のような機械のことを指すよ。

## どういうこと？

ターニング完全マシンは、とても賢いコンピュータのようなもので、どんな問題でも解決できる力があるんだ。もちろん、時間や材料が必要だけど、理論的には何でもできるんだよ。

## どうしてそれがすごいの？

考えられるすべてのことができる機械って、すごいと思わない？それがターニング完全マシンなんだ。これを知ることで、コンピュータがどれほど強力で、何ができるのかを理解する手助けになるよ。

## だから、ターニング完全マシンってなに？

ターニング完全マシンは、どんな問題でも解くことができる、とても賢い機械のことを言うんだ。

# まとめ

このように、ターニング完全マシンは、私たちが考えることができるすべてのことを解決できる特別な機械のこと。それを知ることで、コンピュータのすごさや可能性をもっと深く理解できるようになるんだよ。
せんせー、非ニュートン流体ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、非ニュートン流体ってなに？

# 非ニュートン流体とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## 非ニュートン流体って何？

みんな、コーンスターチと水を混ぜた遊びをしたことがあるかな？手でゆっくり触ると柔らかいのに、強く押すと固くなるあの不思議な液体のことを指すよ。このような、普通の液体とは違って動きが変わるものを「非ニュートン流体」と呼ぶんだ。

## どういうこと？

普通の水やジュースは、どう触っても同じように流れるよね。でも、非ニュートン流体は違う。ゆっくり触ると液体のように動き、強く押すと固体のようになる。不思議だね！

## どうしてそれがすごいの？

この特別な動きは、科学の実験や新しい製品を作るのに役立つことがあるんだ。例えば、衝撃を吸収するヘルメットの中に使ったり、特別な液体を作るのに利用されることもあるよ。

## だから、非ニュートン流体ってなに？

非ニュートン流体は、触る強さによって柔らかさや固さが変わる不思議な液体のことだよ。

# まとめ

このように、非ニュートン流体は普通の液体とは違う、とても興味深い性質を持っているんだ。それを使って、色々な新しいものを作ることができるのが、科学の楽しいところだね。
Ubuntu上にTomcatをインストール

# インストール背景
お久しぶりです．
Web3層の勉強としてTomcatを用意せねばと思ったのがきっかけです．
様々なサイトを見ていると，WindowsにTomcatを導入する方法がほとんどであり，時たまUbuntu上にインストールする方法が書かれた記事を見つけるものの，古いためかインストールできず…．
ということで，自分でごちゃごちゃしながらインストールしました．

# 使用した環境
|項目|種類|ver|
|:--|:-:|--:|
|OS|Ubuntu|22.04.3LTS|
|java|OpenJDK|19.0.2|
|MW|Tomcat|10.1.13|

バージョン確認は他の記事でも書いてそうなのでここでは省略します．


# Tomcatの前にJavaのインストール
## Javaをインストールする理由
TomcatはJavaベースのWebアプリケーションサーバです．TomcatはJavaで書かれており，Java仮想マシン（JVM）上で実行されます．そのためTomcatを動作させるためにはJavaが必要です．
具体的な理由は以下の3つです．
1. **TomcatはJavaで記述されている．**
Tomcatの本体および多くのウェブアプリケーションはJavaプログラムです。Javaで書かれたプログラムを実行するには、Javaランタイム（JREまたはJDK）が必要です。
2. **ServletとJSPの実行**
TomcatはJava ServletおよびJavaServer Pages（JSP）のコンテナとして動作します。これらの技術はJavaで書かれており、Tomcatがこれらのコンポーネントを実行できるようにJavaランタイムが必要です．
3. **Java仮想マシン（JVM）の利用**
omcatはJavaアプリケーションを実行するためにJava仮想マシン（JVM）を使用します。JVMはJavaバイトコードをホストマシンのネイティブコードに変換し、アプリケーションを実行します．

## Javaのインストール
0. まずはOSのアップデートを実施する．
1. まずJavaがインストールされているか確認をします．
2. インストールするJavaのバージョンを確認します．
3. Javaをインストールします．

```bash
[root@DESKTOP-xxx]:/# apt update
[root@DESKTOP-xxx]:/# java -version
[root@DESKTOP-xxx]:/# apt info default-jdk
[root@DESKTOP-xxx]:/# apt install -y default-jdk
```
# Tomcatのインストール
0. 私はtmp上にダウンロードしたかったので，カレントディレクトリをtmpに移動しました．
1. Tomcatをダウンロードする．ここで他の記事ではミラーサーバのファイルをダウンロードしようとしていたため，そこのURLをダウンロードしてもずっと404エラーでNot Foundとなっていました．
2. ダウンロードしたファイルをtarコマンドで解凍．gzファイルなのでオプションは-z，取り出しなのでオプションは-x，ファイル指定なのでオプションは-f，おまけで詳細を知りたかったのでオプションは-v．
3. Tomcatの起動
4. ブラウザで確認します．`http://localhost:8080`にアクセスします．Tomcatのデフォルトのトップページが表示されれば、正常にインストールされています．
5. Tomcatの停止．

```bash
[root@DESKTOP-xxx]:/# cd /tmp
[root@DESKTOP-xxx]:/tmp# wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.13/bin/apache-tomcat-10.1.13.tar.gz
[root@DESKTOP-xxx]:/tmp# tar -xzvf apache-tomcat-10.1.13.tar.gz
[root@DESKTOP-xxx]:/tmp# cd apache-tomcat-10.1.13/bin
[root@DESKTOP-xxx]:/tmp/apache-tomcat-10.1.13/bin# ./startup.sh
[root@DESKTOP-xxx]:/tmp/apache-tomcat-10.1.13/bin# ./shutdown.sh
```

# 最後に
とりあえずインストールから起動，停止までの手順は以上です．細かいところはこれから追記していきます．あと，Javaを動かすだけならTomcatはいらず，JDKだけインストールすればよいので…と疑問に思うかもしれないのでTomcatに関する詳細な記事も書きたいです．
せんせー、MEMSってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、MEMSってなに？

# MEMSとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## MEMSって何？

みんな、小さなおもちゃの時計を見たことがあるよね？中には小さな歯車や針が動いている。MEMSも似たようなものだけど、もっともっと小さいんだ。それをコンピューターや電話の中で使ってるんだよ。

## どういうこと？

MEMSは、本当に小さな機械の部品を、特別な方法で作る技術なんだ。例えば、スマートフォンが地面に落ちそうになった時に、それを感じ取って画面を守るための部品としても使われているよ。

## どうしてそれがすごいの？

この小さな部品を作ることで、たくさんの便利な機能を、小さな電話やコンピューターに入れることができるんだ。だから、私たちの生活がもっと楽しくて便利になるんだよ。

## だから、MEMSってなに？

MEMSは、とても小さいけれど、たくさんのことができる魔法のような機械の部品のことなんだ。

# まとめ

このように、MEMSは私たちの持っている電気製品をスマートにするための小さなヒーローみたいなもの。それがあるおかげで、私たちは便利な生活を楽しんでいるんだよ。
AWS IAMアイデンティティセンター

AWSアカウント、SalesforceなどにSSOできる仕組み

下記のアイデンティティソース（認証ディレクトリ）を利用してSSOできる。
| アイデンティティソース | 特徴 | 
|:-:|:-:|
|アイデンティティセンターディレクトリ|デフォルト<BR>ユーザ名、パスワードを管理|
|ActiveDirectory|既存オンプレAP利用|
|外部IDプロバイダー|AzureAD,Okta等利用|
せんせー、マイクロエレクトロメカニカルシステムってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、マイクロエレクトロメカニカルシステムってなに？

# マイクロエレクトロメカニカルシステムとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## マイクロエレクトロメカニカルシステムって何？

みんな、小さなロボットやおもちゃの車を見たことあるよね？MEMSは、それよりももっともっと小さな機械と電気の部品を組み合わせた特別なものだよ。

## どういうこと？

MEMSは、とても小さなチップの中に、動く部品やセンサーが入っているんだ。たとえば、スマートフォンを振ったときに、それを感じるセンサーとして使われていることもあるよ。

## どうしてそれがすごいの？

こんなに小さいのに、動く部品やセンサーが作れること自体がすごいんだ。そして、これを使うことで、私たちの日常の中でたくさんの便利な技術が実現されているんだよ。

## だから、マイクロエレクトロメカニカルシステムってなに？

MEMSは、とても小さな機械と電気の部品を組み合わせた、未来のテクノロジーのひとつなんだ。

# まとめ

このように、MEMSは私たちの身の回りの技術やガジェットをもっと賢く、便利にしてくれる特別な小さなシステムなんだよ。それによって、たくさんの驚きや楽しさが広がっていくんだ。
【MlFlowLogger】log_artifactが変なところに保存される

# log_artifactが変なところに現れる
通常log_artifactを呼び出すと、mlruns/{experiment_id}/{run_id}/artifactsに保存されるはずである。しかし、自分の場合、mlruns/{run_id}/artifactsに保存されてしまい、mlflowを呼び出す度にmalware experiment_idと大量のWarningがでるということに苦しめられた。原因はわかっていないが、解決はできた。
2時間以上これで飛んだので(論文の締め切りがぁぁぁ...)、備忘録として残しておく。

# 解決方法
experiment_idをいったん削除して、新しい実験を作りなおすことで解決できた。
解決策発見までの流れも示しておくと、決して、Pythonのコードの問題ではなさそうである。
自分の場合、Pythonを直接呼び出す場合は{実験種類名}\_TESTという実験が生成され、shファイルから実行する場合は、{実験種類名}\_{日付}という実験が生成されるようにしていた。実験種類名をAとすると、実験名がA_20231009の時はlog_artifactが変なところに保存されるが、A\_TESTのときには通常通り動いていることが確認できた。

# 考えられる原因
mlflowのログの場所を変えようと、MlFlowLoggerのartifact_locationや、trainerのdefault_root_dirなどを変更したりしていた。この設定のままmlflowのmetaファイルが作成され、それが悪さしていたと考えられる。
ActiveHashにてcurrent_scopeを含むエラーが出た場合に考えること

# はじめに
@rinrin_abc1818 と申します。
今回は自分用に記録として残したいと思い投稿させていただきました。

:::note warn
筆者はプログラミング経験半年です。
至らない点があるかと思いますので、その際はご指摘いただけると幸いです。
:::

# 概要
現在Ruby on Railsを用いて投稿型のアプリケーション作成中です。
Deviseを使用してのユーザー管理機能実装時にActiveHashを加えて実装しようと考えていました。

そこで今回出現したエラーがこちらです。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333436323331322f34306130373631652d333130652d633731362d363964342d3938343036646562323137342e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3462312/e0932d33-a5be-40e6-f7d6-583586d3fe2a.png)

# 該当のソースコード
```ruby
models/occupation.rb
class Occupation < ActiveHash::Base
  self.data = [
    { id: 1, name: '---' },
    { id: 2, name: '理学療法士' },
    { id: 3, name: '作業療法士' },
    { id: 4, name: '言語聴覚士' },
    { id: 4, name: 'その他' },
  ]

  include ActiveHash::Associations
  belongs_to :user
end
```

# 対応
NoMethodErrorということでスペルミスかなと思いましたが、、、
「そもそもCurrent_scopeなんてメソッドは使っていない！」
ということで、とりあえずGoogle検索を実施しました。

同様のエラーがちらほら確認はできましたが、自分と同じエラー内容の人はいませんでした。。。
ですが、よくよく考えてみると、皆さん解決方法はActiveHashのファイル関連の修正なんですよね。

# 結果
```ruby
    { id: 4, name: '言語聴覚士' },
    { id: 4, name: 'その他' },
```
このid 4が二つになっていたことが原因でした。
確認不足ですね。
寝て起きて、再確認すると見つけることができました。

# まとめ
最終的に今回何が言いたいかということなのですが、
Current_scopeを含むエラーが出た場合はActiveHash関連の記述にエラーがある場合が多いということでした。また落ち着いてよく見るとその後ろにクラス名まで書いてあるので、そこを中心に探すのが良いのかなと思いました。
とりあえずスペルミスは気をつけます。。。
AWSサブネットのIPアドレスについて

192.168.1.0/29で例を挙げる
- 192.168.0.0	ネットワークアドレス
- 192.168.0.1	AWS予約（VPCルータ用）
- 192.168.0.2	 AWS予約（DNS用）
- 192.168.0.3	 AWS予約（将来予備）
- 192.168.0.4	 利用可能
- 192.168.0.5	 利用可能
- 192.168.0.6	 利用可能（/29の場合8-5=3個のIPが利用可能）
- 192.168.0.7	ブロードキャストアドレス


192.168.1.0/28で例を挙げる
- 192.168.0.0	ネットワークアドレス
- 192.168.0.1	AWS予約（VPCルータ用）
- 192.168.0.2	 AWS予約（DNS用）
- 192.168.0.3	 AWS予約（将来予備）
- 192.168.0.4	 利用可能
- ...
- 192.168.0.14	 利用可能（/28の場合16-5=11個のIPが利用可能）
- 192.168.0.15	ブロードキャストアドレス