OmniAICreator/Qiita-1.07M huggingface dataset:
[Java]MS932をUTF8にエンコードしなおす

## ユースケース
IDEでデフォルト・エンコードがMS932になってる際に、無理やりUTF8の文字列を用意したい。

## コード

MS932文字列をMS932方式でバイトに分解し、そのバイト文字列をUTF8方式で文字列に組み替える。

```java
public String convertToUTF8(String ms932String){
  String result = "";
    
  try {
    String tempString = new String(ms932String.getBytes("MS932"), "MS932");
    String encodedUtf8 = new String(tempString.getBytes("UTF-8"), "UTF-8");
    result = encodedUtf8;
  } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
  }

  return result;
}
```

なんか他にいい方法ないかなあ？
~~最初からUTF8で全部やりたい~~
ESP32-S3-DevKitCのUSBポートを使用してプログラムを書き込んでみた

いつもESP32-S3-DevKitCの使用する場合は、
UARTポートを使用してプログラムの書き込みを行っていたのですが
今回はUSBポートで書き込みをしたので記録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/91a0fe55-fde3-04bf-5a90-baeaaa2a5b77.png)


1、以下のサイトにアクセスします。
https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/windows-setup.html#get-started-windows-tools-installer

2、インストーラーをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/a3fc43cf-1d31-00d5-0433-cda8eb558e09.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/84dc2bef-d696-2742-b5d9-79f6f35c7660.png)


3、ドライバーのみインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/76a6bf97-82ca-1e75-5ad1-f748b358be8e.png)

以上でドライバのインストールは完了です。

あとはarduinoでBlinkを書き込んでみます。
書き込み設定は以下です。

今回はCOM7に設定されたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/e23e6f32-29e0-758c-8d00-ba10534f4ff9.png)

これでESP32のLEDが点滅すれば正常に完了です。
学習なしPhi2でARCを解いてみた。


## 目的  

何も学習させていないPhi-2でARCを学習させるとどれくらいの正解率になるのか？  
また、どのような種類の問題が解けるのかを大まかに示す。

## Phi-2以外のモデルの正解率

下記のサイトで計測されている。やはりGPT-4は性能が高く
21%の正解率となっている。

https://github.com/alxndrTL/ARC_LLMs

## 計測したコード

自作リポジトリのarc_evaluate_phi2.pyで推論を実行し、arc_phi2_analyze.pyで正解率と正解したタスクの視覚化を実装した。

https://github.com/SoseSose/phi-2-train

## プロンプト

次のようなプロンプトを採用した。  
以下はタスク017c7c7bでの例。

```txt
-example0-
010
110
010
011
010
110
->
020
220
020
022
020
220
020
022
020

-example1-
010
101
010
101
010
101
->
020
202
020
202
020
202
020
202
020

-example2-
010
110
010
010
110
010
->
020
220
020
020
220
020
020
220
020

-test-

111
010
010
111
010
010
->
```

回答は次のような形で返ってくる。

```txt
020
202
020
202
020
202
020
202
020

A:

I think you are looking for something like this:
#include <stdio.h>

int main(void) {
    int a[10][10];
    int i, j, k;
    int n = 10;

    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            a[i][j] = 0;
        }
    }
...
    return 0;
}
```

このプロンプトを使用すると、おおよそ回答の数字の羅列 or 数字の羅列＋その羅列を作成するためのC言語系のコードと言う形が多かった。  
この返答に対して２行以上改行されているところまでをPhi-2の回答とし、その回答と
本当の答えが同一かを判定することで今回の正解数を計測した。

## 正解数と正解したタスク

### 正解数

|  | 正解数| タスク数 |
| ---- | ---- | ---- |
| training | 8 | 400 |
| evaluation | 0 | 400 |

### 正解した画像

#### 画像1　(445eab21)

![445eab21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/f9ab3fda-b75c-5705-cd62-a77fb60fa1ab.png)

#### 画像2　(44f52bb0)

![44f52bb0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/d23b1729-8300-5797-5b4e-322c94bb337b.png)

#### 画像3　(239be575)

![239be575.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/d081616f-ca36-a702-c42e-72525fec1992.png)

#### 画像4　(7b7f7511)

![7b7f7511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/55154002-68f5-db1a-c2e1-968e12323e2b.png)

#### 画像5　(6fa7a44f)

![6fa7a44f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/faf08eb2-855f-6ab4-da82-f122780d661f.png)

#### 画像6　(53b68214)

![53b68214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/88411e9c-c681-6aeb-5515-64e1ffa616ad.png)

#### 画像7　(68b16354)

![68b16354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/b80afb89-f8de-ea73-1031-f301f002a904.png)

#### 画像8　(8be77c9e)

![8be77c9e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/c1359819-d61c-7f0d-f040-d5f9591d843d.png)

## 考察

### 正解したタスクのパターン

1. 計数 → 1つの色を回答(画像1~3)
2. パターンの拡張・縮小と回転(画像4~8)

上記の２つに分けられると考えられる。  
正解したタスクは２パターンしかないが、実際のARCには他にも色々な種類のタスクがある。
またパターン1は１つの色を回答するだけなので、パターン２はタスク内のパターンを移動するだけのARCの中でも簡単なタスクだと考えられる。  
すなわちARCの思考力はまだ至らない部分がかなりあると考えられる。

### trainingしか正解しなかった原因

原因としては

1. trainingのみがPhi-2の学習データ元に入っていた。
2. evaluationがtrainingより難しい。

の２つが考えられる。  
ただし、2のほうが有り得そうと思っている。
わざわざtrainingだけにフィルタリングをして学習データ元を作成するとは考えづらいし
私が見た限りでは全体的にevaluationはtrainingより難しい。
１問も解けなくてもおかしくないと考えている。

## その他

### Phi-2の回答のクセ

他にもいくつかのプロンプトの形式を試したが、文章のようなものを入れ込んでしまうと文章やC言語系のコードだけで回答されることが多かった。
コードで回答される事が多い理由はおそらくPhi-2のトレーニングにも
コードが多く、特にこのような数字の羅列とプログラム以外にはなかなか
ないので、そのような回答をしたのかと。
ただ、そのような形式で受け取ってしまうと処理が難しいので
数字と記号とインデックスだけの[プロンプト](#プロンプト)を採用した。

AIの面倒を見るのも中々、大変で。
ChatGPTにAWSの教えを乞う

# はじめに
オンプレからAWSクラウドへの移行案件を初めて担当することになりました。
途中まで懇切丁寧に教えてくれるパートナーさんがいて安心しきっていましたが、
諸事情により、今度から一人で設計構築を行うことに。
途方に暮れていたところ、BingのChatgptが無料で使えると聞いたので、さっそく教えを乞うてみました！

※随時更新予定

# 対象者
AWSサービス設計中の方

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [CopilotGPT](#CopilotGPT)
1. [基本プロンプト](#基本プロンプト)
1. [応用プロンプト](#Chapter3)
1. [参考文献](#reference)

# 結論
結構使えそう

<!-- 各チャプター -->

<a id="#Copilot GPT"></a>
# Copilot GPT
- 「より厳密に」を選択

https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx

<a id="#基本プロンプト"></a>
# 基本プロンプト

```
# 指示
- あなたは{役割}です。
- 以下の{制約条件}と{参考情報}と{入力文}をもとに、回答を作成して{出力フォーマット}の形式で出力してください。

# 役割
- AWSに精通したITエンジニア

# 制約条件
- わかりやすく説明すること
- 出力の際は{出力フォーマット}を遵守すること
- 出力の際は{参考情報}も合わせて参考すること
- 出力の際はMarkdown記法を使って出力すること
- 回答を出力する前に、前提条件が不足していないかチェックすること
- 不足している情報があれば、どんな情報が必要なのか箇条書きで出力すること
- 回答にコマンドやコーティングが含まれる場合は、内容を詳細に出力すること
- 参考にしたWebサイトが存在すれば、WebサイトのURLをすべて回答の最後尾に出力すること

# 参考情報
- 指定なし

# 入力文:
- <質問内容>

# 出力フォーマット
- 指定なし

```

- 必要に応じて以下の文も追加
```
・このタスクで最高の結果を出すために、追加の情報が欲しい場合は、質問してください。
```

<a id="#reference"></a>

## おわりに
今回はChatGPTにAWS関連の知識を得るために、必要なプロンプトを作ってみました。
独りで設計構築するのはすごく不安が付きまとうと思います。
そんなときにChatGPTを使って色々聞いてみると、知識が身につくばかりではなく、
誰かと一緒に設計しているようで、孤独感を和らげる効果もあると感じました。


# 参考文献
- [ChatGPTのプロンプトデザインの秘密を解明｜深津式・シュンスケ式・ゴールシークプロンプトを紹介](https://weel.co.jp/media/chatgpt-prompt-design#index_id4
)
- [エンジニア向け】コピペで使えるChatGPTプロンプト構文20選！現役エンジニアが厳選](https://ai-island-media.com/2023/08/28/chatgpt-prompt-20/)
React製作者でも知らないこと

# はじめに

Dan AbramovというReactの共同作成者の方の記事がいろいろ面白かったので紹介です。

技術記事ではなくコラム的なものです。Google翻訳で十分読めます。

# 私が知らないこと

https://overreacted.io/things-i-dont-know-as-of-2018/

最オススメ記事です。
Reactの作成者というカリスマであっても、自分より知らないこともあるんだなあ・・・
と、心が軽くなります。

いくつかピックアップして見ていきましょう。

## Unixコマンド

> - **Unix commands and Bash.** I can `ls` and `cd` but I look up everything else.

<font color="LimeGreen">「UnixコマンドとBashについて、`ls`と`cd`以外は全部調べて使う」</font>そうです。
私は`mkdir`を知っているので、彼よりも知識があるようですね🤭

## ネットワークの知識

> - **Networking stack.** I know computers have IP addresses, and DNS is how we resolve hostnames. I know there’s low level protocols like TCP/IP to exchange packets that (maybe?) ensure integrity. That’s it — I’m fuzzy on details.

<font color="LimeGreen">「コンピュータはIPアドレスというものを持っている。DNSはホストの名前をわかりやすくする。（たぶん）TCP/IPは整合性を保証するパケットを交換している。くらいしか知らない」</font>と言っています。

彼を超えたい方は、この動画シリーズがおすすめです。

https://www.youtube.com/watch?v=aYbUDGn61cU&list=PLXXalsdlzX-J7AUuw2zSHit5nRUZ3eDdz

視聴するだけでも、（忘れるまでは）彼より詳しくなるでしょう。
大部分を忘れても、彼と同じくらいの知識量だと言えるかもしれません。

## コンテナ技術

> - **Containers.** I have no idea about how to use Docker or Kubernetes. (Are those related?) I have a vague idea that they let me spin up a separate VM in a predictable way. Sounds cool but I haven’t tried it.

コンテナについて・・・<font color="LimeGreen">Dockerを全く使えない</font>ようです。
意味を理解していなくても、とりあえず`docker compose up`してDockerを使用できる私の方が、彼よりも優れていると言えそうですね🤭

## アルゴリズム

> - **Algorithms.** （略）I understand the O(n) notation but my understanding isn’t much deeper than “don’t put loops inside loops”.

最後にアルゴリズムについて。<font color="LimeGreen">`O(n)`表記法については知ってるけど、「ループの中にループを入れない」以上の理解はしていない</font>ようです。

先ほどの話を掘り返しますが
「理由はわからないけど`docker compose up`で動く」
と理解している私とだいたい同じですね。どうもそうした方がいいらしいぞ、と。
<br>

この記事は2018年のものであり、今の彼がどうなのかはわかりません。
しかし重要なのは、「知らないものは知らないんだなあ」で良いということです。
心を軽く、ウキウキしながら日々学ぶ。
そのための特効薬として使いましょう。

**ぜひ元記事も読んでくださいね！**

# その他

## Goodbye, Clean Code

https://overreacted.io/goodbye-clean-code/

「コードの重複を減らして『綺麗』にした結果、後の変更を難しくしてしまったことから、きれいなコードへの執着がチームの適応性や協力に悪影響を与えることがあると気づいた」
・・・というような内容の記事です。

必ずしも（自分が思う）きれいなコードであることは正義ではない、と。
コードがどうこうということもそうですが、
自分もこの「ベストプラクティスとされているもの / こだわり」に執着しすぎていないかな？
と、楽しく自分を省みることができます。

## What Is JavaScript Made Of?

https://overreacted.io/what-is-javascript-made-of/

`value`とは何か？`value`の種類とは？「等しい」とは？・・・と、JavaScriptの基礎の部分を教えてくれます。各トピックが簡潔にまとまっているので、読みやすいです。

## On let vs const

https://overreacted.io/on-let-vs-const/

`let`と`const`の使い分けについて、「なるべく`const`を使う」ことのメリットとデメリットを通して教えてくれます。個人的に「『イミュータブル』との混同」というのはやらかしたことがあります。こちらは今までのどの記事より短いですが、内容はしっかりとあります。

もちろんこのほかの記事もあります！ぜひ読んでみてください。
# おわりに

親しみがあって、簡潔で読みやすい記事、最高でしたね。

Reactが好きになりだしてるので、まずはProgateから触ってみようかな～
UiPathExcelモダンアクティビティのメリット・デメリットについて

# 1.はじめに
ネットなどで調べたり、自分で試したことをまとめています。
モダンは覚えることが多いですが、覚えてしまうと結構楽にできます。
アクティビティにエラーマークがありますが、その点は無視して重要事項のみに赤枠などを使用していますので、そこに注視してください。

# 2.メリット
## (1)クリック操作で設定ができる

下記の手順で行うと簡単にシートを指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/3d586ec8-e58c-5afd-87e8-a51cd8e76f34.png)

:::note warn
手順④として、①のフルパスをConfig(設定)ファイルの変数に変更しないといけないですね。
:::


## (2)インプットのフィルターかけたままのときにエラーになるのを回避することができる。

下記のようにフィルタアクティビティの「既存のフィルターをクリア」にチェックをすることでフィルターを解除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/be9dfe39-2cbf-5b2a-ec42-85fc21bfecd8.png)

## (3)様々なアクティビティがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/9764d799-dbde-ea69-2c3b-b7ce644b1ed5.png)

### ①PDF化するのが楽にできます(赤枠)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/3e18861b-a946-2979-ad6a-81469e6f9470.png)


### ②Vb.Netができなくても範囲を並び替えることが簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/3bc1db7a-8430-ec1e-937c-1ff1c6473a9b.png)


# 3.デメリット

環境によって異なるかもしれないので、エラー時に参考してください。

## (1)処理時間がかかる。
### ①エクセルプロセススコープの前に待機が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/6d113971-0bd0-0898-b043-e03c5b3e629d.png)

### ②範囲を読み込み時にデータ数が多いと時間がかかります。

下記の手順で楽に設定することができますが、データ数が多いものを対象とすると3分以上もかかる場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/c29bacbc-9cd1-1455-61e5-753431d6b46c.png)


### ③繰り返し各行(赤枠)はかなり時間がかかります。
:::note warn
データテーブル化して繰り返した方が速いです。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/b426afeb-21ef-6896-7735-b19d41adbab4.png)

## (2)パソコン操作が苦手やアプリを使い慣れていない人には覚えることが多くて大変
:::note warn
私は市民開発者を育てている立場にいて、上記のような人にはモダンアクティビティを習得するまでに時間がかかります。
何度も練習して覚えさせることをさえた方がいいです。
:::

# 3.おわりに
これからクラシックアクティビティが使用できなるという話をよく聞き、モダンの使用方法とそのメリットとデメリットを理解していないと移行後、運用保守で痛い目にあうかもしれないです。
移行予定やモダンを使用してみようという方に参考となれば幸いです。
「独学エンジニア」での学習を始めました

# 自己紹介
初投稿ということで、まず初めに僕の超絶簡単な紹介をさせていただきます。
・某市私立大学の文系卒
・23歳（2024年2月時点）　男
・趣味と言えるほどの趣味はなく、休日は街ブラ/古着屋・リサイクルショップ巡りをしておりドラマバラエティ音楽は平成以前に作られたものが好きです。

# 経緯
さて本題。
今回山浦清透さんの「独学エンジニア」で学習を始めようと思った経緯ですが、
僕は2023年4月に新卒未経験でSierの企業に就職し、そこで2か月半ほど自社研修を受け、とあるWEBサービス開発の現場に参加させていただいています。

　この業界は毎日学習をしてスキルを身に着けていかなければ生き抜いていけないと知っていながらも現場に参加後は何かと理由を付けたりサボってしまい自己学習はほとんど0に近いものでした。
 そんなこんなで特に技術力が上がるわけでも無くヒューマンスキルが身につくわけでも無くあっという間に1年が経ち、自社の査定面談（この面談で来季の給与が決まる）で何もアピールすることができず撃沈しました。
　さすがにこのままでは自分がクソ人間になってしまうと思い何か学習に取り掛かろうと辿り着いたのが「独学エンジニア」です。
 
 　では、なぜこの学習サービスを選んだかというと、そもそも僕自身が書籍での学習が向いていないというのが前提であったので、（ハリーポッターは10周以上読み返しましたが）学習サイトを探しているうちに
言語：PHP
フレームワーク：Laravel
DB：MySQL
インフラ：AWS
バージョン管理：GitHub
仮想環境：Docker
エディタ：VScode
以上の使用されているツール等が見事に現在の現場と”全マッチ”していたので今の仕事に直接つながると思い選ばせていただきました。

# まとめ
今回は超絶簡単な自己紹介と「独学エンジニア」を選んだ理由でした。
◆独学エンジニアウェブサイト
https://dokugaku-engineer.com/course/serverside

　そもそも継続することや学習することが得意ではない僕がエンジニアという職種を選んだ事自体が間違っていると言う方もいらっしゃると思いますがそこはあまりつつかないでいてあげてください。（僕の心が折れちゃいます。適当に応援してください㎜）
 
 　同じ駆け出しエンジニア（駆け出しの土俵にも立てていませんが）の方読んでいただいていたら共に頑張りましょう！

　 次回からレッスン1以降のアウトプットを綴らせていただきます。
 
※このようなブログ投稿も初めてということで拙い文章で読みにくいと思いますが、これからも学習のアウトプットの場として続けていきたいと思います。
よろしくお願いします。
authorizeメソッドについて

## authorizeメソッドとは

authorizeメソッドとは、`Pundit`というgemを導入することにより、Rubyで使用できるメソッドのこと。

### 役割
引数のオブジェクトの認可を確認するメソッドとして、よく使用される。

例えば、下記の`authorize(current_site)`の場合、
authorizeメソッドの引数である`(current_site)`が、認可されているかどうかを確認するメソッドとして、`authorize`メソッドが使用されている。

（`current_site`サイトにログインしているユーザーがadminかそれ以外かの認可の確認を行っている。）

#### authorizeメソッドの呼び出し元であるコントローラー
```Ruby:app/controllers/admin/site/attachments_controller.rb
class Admin::Site::AttachmentsController < ApplicationController
  def destroy
    authorize(current_site)
    image = ActiveStorage::Attachment.find(params[:id])
    image.purge
    redirect_to edit_admin_site_path
  end
end
```

#### SiteオブジェクトのPolicy
```Ruby:app/policies/site_policy.rb
class SitePolicy < ApplicationPolicy
  def update?
    user.admin?
  end

  def destroy?
    user.admin?
  end

  class Scope < Scope
    def resolve
      scope
    end
  end
end


```

### authorizeメソッドが呼び出された際の挙動

#### ①authorizeメソッドの呼び出し

`authorize(current_site)`メソッドで、Punditにより`current_site`オブジェクトに対する認可チェックが要求される。

#### ②ポリシークラスの決定

Punditは、`authorize`メソッドに渡されたオブジェクトのクラス（引数のクラス）に基づいて、対応するポリシークラスを決定する。

この例では、`current_site`オブジェクトが`Site`クラスのインスタンスであるため、`SitePolicy`クラスが使用される。

#### ③ アクション名に基づくポリシーメソッドの呼び出し
`authorize`メソッドは、呼び出されたコントローラーアクション名に基づいて、対応するポリシーメソッドを呼び出す。

この場合、**`destroy`**アクションに対応するため、`SitePolicy`クラス内の`destroy?`メソッドが呼び出される。

#### ④`destroy?`メソッドの実行

`SitePolicy#destroy?`メソッドが実行される。このメソッド内で、`user.admin?`を評価し、現在のユーザーが管理者であるかどうかをチェックする。`user`はPunditによって自動的に現在のユーザー（通常は`current_user`メソッドによって提供される）にセットされる。

#### ⑤認可の結果

- **許可**: `destroy?`メソッドが`true`を返した場合、ユーザーは`destroy`アクションを実行する権限があるとみなされ、処理は続行される。
- **拒否**: `destroy?`メソッドが`false`を返した場合、Punditは`Pundit::NotAuthorizedError`例外を発生させる。この例外は通常、アプリケーションコントローラーで捕捉され、適切なエラーメッセージと共にユーザーをエラーページや別のページへリダイレクトさせる処理が行われる。

## まとめ
`authorize(current_site)`は、`SitePolicy`クラスの`destroy?`メソッドを通じて`current_site`オブジェクトに対するユーザーの認可をチェックする。このプロセスは、ユーザーが特定のアクションを実行する権限を持っているかどうかを確認するために、Punditが提供する認可システムの一部である。

#### 要点
実行される`policy`クラスは、`authorize`メソッドの引数のオブジェクトクラスの名前に命名されたクラスである。


※誤りがあれば、教えていただけますと幸いです。🙏


#### 参考記事
https://qiita.com/mmaumtjgj/items/c7fc40619a15cce5ccfc
せんせー、ゲノムフォールディングってなに？

![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)

## ゲノムフォールディングって何？

みんな、人間や動物、植物が生きていくためには、体の中でいろんな指示を出す必要があることを知ってる？その指示を出しているのが「ゲノム」っていうとても大切な情報なんだよ。

## どういうこと？

ゲノムは、私たちの体を作る設計図みたいなもの。でも、この設計図はただの平らな紙じゃなくて、とても複雑に折りたたまれたオリガミみたいなものなんだ。この折りたたみ方を「ゲノムフォールディング」と呼ぶよ。

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

このオリガミみたいに折りたたまれた形があるから、私たちの体は正しく動くんだ。例えば、手が手のように動いたり、目がちゃんと見えたりするのも、この折りたたみ方がうまくいっているからなんだよ。

## だから、ゲノムフォールディングってなに？

ゲノムフォールディングは、私たちの体の中で起こる、ゲノムという生命の設計図が複雑に折りたたまれること。この折りたたみ方によって、私たちの体が正しく機能するようになるんだ。

# まとめ

このように、ゲノムフォールディングは私たちの体を正しく動かすためにとても大切な役割を果たしているんだ。ちょうど、オリガミが特定の形に折りたたまれることで、いろんなものを表現できるのと似ているね。
決定木のアンサンブル学習について

※ここで載せる情報については、僕のアウトプットの為の情報なので、間違っている部分もただあると思いますが、もしここ違うよ、とかあれば教えて頂けると幸いです。

・決定木のアンサンブル学習について
　アンサンブルの学習手法については2つある。
 1)　ブースティング
 2)　バギング

 それぞれについて解説する。
 1)　ブースティングについて
 　これは、弱学習器を直列に並べて、一つずつ順番に学習させ、予測値を出す手法のこと。ここで大事になってくるのが、順番に学習させるが、一つ前の学習で出た予測値を次の学習でも使用することだ。こうすることで、予測値と実測値の誤差が少なくなっていく。

2)　バギング
　これは、先程のブースティングとは逆で、弱学習器を並列に並べて、それぞれ独自で学習させる。そして、それぞれで出た予測値を平均、もしくは多数決を取って一つの予測値を出す手法のこと。
Pandasのデータの探索と操作



## はじめに
Pandasのデータの探索と操作に関しての備忘録です。
コードを書き始めて1年以内の若輩者です😅
もし間違いがあれば、ご指摘いただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
データを選択できる操作を理解して取得方法を理解することでデータフレームの扱いの基本が学べる。

.loc[], .iloc[]: 行列の選択
.items(): カラム名とデータをペアとして取得
.values: データフレームの値のみを取得（numpy形式）
ブールインデックスで抽出に条件をつけて取得

この4つを理解する。

:::note info
DataFrameの基本操作
* df['列名']で列の選択にて選択するのが基本。
* df[['列名1', '列名2']]にて列名1と列名2を選択。
* この形では列名1から列名5までを選択することはできない。（.loc[]を使う）
:::  
***

:::note alert
注意点
*  items()を使って列を反復処理する順序が重要な場合は、データフレームの列の順序を事前に確認しておく必要がある。
:::  

***

## <INS>**メソッド一覧**</INS>

## <INS>**.loc[]**</INS>
DataFrameやSeriesのラベルに基づいてデータを選択できる。
スライスを使用して範囲選択が可能。
論理値のリストを使って条件に基づく選択が可能。
行と列の両方を指定してデータを選択できる。

### .loc[]の基本の型
```py
df.loc['index', '列名']
```

### 1行目から5行目までの中の金額の列を選択。
```py
df.loc[0:4, '金額']
```

### 金額の列を選択。
※基本使わない→df['金額']  これで書くことが多い。
```py
df.loc[ :, '金額']
```
***  

## <INS>**.iloc[]**</INS>

```py
print(df.iloc[0])  # 最初の行を選択
print(df.iloc[:, 0])  # 最初の列を選択
```
***  

## <INS>**.items()**</INS>
column+列の全てのデータをペアで取得できる。
全ての列に対して繰り返し処理を加えたりできる。
columnごとに処理を行える。
columnの順序はデータフレームの順序に依存する。
```py
for label, content in df.items():
    print(f"Label: {label}")
    print(f"Content:\n{content}\n")
```
***  

## <INS>**.values**</INS>
データフレームの値をNumpy配列として取得する。
列名やインデックスなしでデータにアクセス可能。
大規模なデータセットの操作に適している。
```py
values = df.values
print(values)
```
***  

## <INS>**ブールインデックス**</INS>
ブールインデックスとは<INS>**「真偽値で表すindex」**</INS>
index部分にそのソートしたい内容のtrueか falseで示されたindexを発行してソートすることができる（indexに上塗りなどはしない）

columnを指定して、データをソートして絞り込める。
例）年齢のcolumnから20歳以上に絞り込んでデータを取得する

```py
df = pd.read_csv('xxx.csv')
df[df['年齢'] >= 20]
```
![IMG_1572.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/a5611d70-b19d-7d04-bb66-92e05187db0e.jpeg)

## and条件→ &
20歳以上　かつ　A型以外の方のデータを抽出
```py
df[(df['年齢'] >= 20) & (df['血液型'] != 'A')]
```

## or条件→ |
20歳以上　または　B型の人を抽出
```py
df[(df['年齢'] >= 20) | (df['血液型'] == 'B')]
```


## まとめ✍️
事前準備は重要だなと再認識。
データがあってるかあってないか？それが漏れただけで、やり直しは時間の無駄になる。


## 参考にした記事📕
[【Pythonプログラミング】Pandasの基本～表形式データ・データ分析～初心者向けのDataFrameの操作入門！]（https://youtu.be/HYWQbAdsG6s?si=WRW_Ld81eWhSVSSP）
[ブールインデックス](https://python-data-analysis.readthedocs.io/en/latest/pandas/boolean_indexing.html)
設定ミスで WSL の Neovim の起動が激遅になってしまった話

# 何があったか
新しい Windows 環境をセットアップする際に、Windows と WSL に Neovim をインストールしたのですが、Windows の Neovim は数十 ms 程度で起動したのに対し、WSL の Neovim は起動に 数 s かかることがわかりました。

以前の環境では、起動時間に不満を感じることはなかったのに、どうしてこんなに遅くなってしまったのか…

# 原因
WSL の Neovim が遅くなった原因は、`init.vim` として Windows ファイルシステム上のファイルを使ってしまったことでした。

実は私の環境では、 Windows と WSL の Neovim で共通の `init.vim` を使用するため、 WSL の `init.vim` は　Windows の `init.vim` のシンボリックリンクとして作成してしまっていました。
そのため、`init.vim` のロード時に WSL から Windows ファイルシステムへのアクセスが発生し、このアクセスに時間がかかるために起動が遅くなっていました。

実際、`init.vim` を WSL 上の実ファイルに置き換えたところ、 Windows の Neovim と同程度の時間で起動できるようになりました。

# まとめ
Windows 上の `init.vim` のシンボリックリンクを WSL の `init.vim` に使っていたため、WSL の Neovim の起動が激遅になってしまいました。

WSL 上の設定ファイルの実体を、Windows のファイルシステムに置かないように気を付けましょう！(戒め)
Excel ユーザー定義の表示形式 クイックリファレンス

# はじめに

Excelにはセルの書式設定を自分で設定する「ユーザー定義」があります。以下のURLに詳細な説明がありますが、その中からピックアップして説明します。  

[表示形式のカスタマイズに関するガイドラインを確認する - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E8%A1%A8%E7%A4%BA%E5%BD%A2%E5%BC%8F%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B-c0a1d1fa-d3f4-4018-96b7-9c9354dd99f5)  

# ショートカットキー

* `Ctrl+1`で書式設定が開きます。  

# セミコロンで条件分け
![semicolon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/cda29880-9604-3400-dfda-87f90aa6babc.png)  

例）  
|分類|書式設定|正の値|ゼロ|負の値|文字列|
|:---|:----|:----|:----|:----|:----|
||`G/標準`|10|0|-5|あ|
|区切りなし|`0"m"`|10m|0m|-5m|あ|
|正とゼロ;負|`0"m";"(-"0"m)"`|10m|0m|(-5m)|あ|
|正;負;ゼロ|`0"m";"(-"0"m)";"±0m"`|10m|±0m|(-5m)|あ|
|正;負;ゼロ;文字列|`0"m";"-"0"m";;@"!"`|10m||-5m|あ!|

* 文字列を`"`で囲うことにより文字列を追加できます。  
* 負の値用にマイナスをつける場合は、`"-"0`のように明示的な設定が必要です。  
* 何も指定しないと空白になります。  
* `@`は元の文字列を示します。  

# 日時

例）2024/02/01 06:03:09.123  
|書式設定|表示|
|:----|:----|
|`yyyy/mm/dd hh:mm:ss.000`|2024/02/01 06:03:09.123|
|`yy/m/d h:m:s`|24/2/1 6:3:9|
|`gee/mm/dd`|R06/02/01|
|`gge"年"m"月"d"日("aaa")"`|令6年2月1日(木)|
|`ggge"年"m"月"d"日" aaaa`|令和6年2月1日 木曜日|
|`AM/PMh:mm`|AM6:03|
|`[h]"時間"`|1087758時間|

* h,m,sに括弧をつけることで経過時間を表示します。  

# その他

|項目|概要説明|
|:----|:----|
|`0`|桁指定。桁なしはゼロ埋め `1`→`01.00`（`00.00`の場合）|
|`#`|桁指定。桁なしは非表示 `1.36`→`1.4`（`##.#`の場合）|
|`?`|スペース埋め `1.2`と`1.234`→`1.2˽˽` `1.234`（`?.???`の場合）|
|`,`|桁区切りの記号 `1200`→`1,200`（`#,###`の場合）|
|`.`|小数点|
|`%`|パーセント表示 `0.8`→`80%`（`0%`の場合）|
|`E` (E-、E+、e-、e+)|指数形式 `10.23`→`10.2e+00`（`#0.0e+00`の場合）|
`_`|直後に指定した1文字の幅分スペースを表示<br>`12`→`12˽˽`（`##_z_z`の場合）|
|`[色]`|色指定。`[青]G/標準;[赤]"-"G/標準` の場合、正/ゼロが青、負が赤|
|`条件分け`|`[緑][<=100];[黄][>100]` の場合、100以下が緑、100超が黄<br>※セミコロンの意味が[セミコロンで条件分け](#セミコロンで条件分け)と異なります。|
|`=TEXT(値,表示形式)`|Excel関数。値を表示形式で表示|

詳細説明は下記URL参照  
* [表示形式のユーザー定義ってどう使うの？日付や金額、カンマをわかりやすく表示！データ活用の基本](https://exceljoshi.cocoo.co.jp/media/excel-number-formats)  
* [エクセル「ユーザー定義」の設定方法とは？実務に即役立つ！｜Udemy メディア](https://udemy.benesse.co.jp/business/office/excel-user-definition.html)  
* [TEXT関数 - 数値に表示形式を適用した文字列を返す | Excel関数 | できるネット](https://dekiru.net/article/4509/)  
* [TEXT 関数 - Microsoft サポート](https://support.microsoft.com/ja-jp/office/text-%E9%96%A2%E6%95%B0-20d5ac4d-7b94-49fd-bb38-93d29371225c)
Ruby 　instance_variable_get(set)メソッドについて

はじめまして、jjj0331です。

最近、Rubyを勉強していた際に、
classからインスタンスを作成し、開発していたのですが、
インスタンス変数に直接アクセスできるメソッドがありましたので、情報を共有します。

## インスタンス変数に直接参照可能なメソッド
- instance_variable_get
 
```ruby:test.rb
    
class Test
  attr_reader :name

  def initialize(name)
    @name=name
  end
end

test=Test.new("aaa")
puts test.instance_variable_get("@name")
#=>aaa
```
`(インスタンス名).instance_variable_get("@インスタンス変数名")`
インスタンスにアクセスできインスタンス変数を直接参照することができます。

インスタンス変数を直接参照するとはどういうことなのかは
instance_variable_setの挙動を見てもらえればわかると思います。

- instance_variable_set

```ruby:test.rb
    
class Test
  attr_reader :name

  def initialize(name)
    @name=name
  end
end

test=Test.new("aaa")
puts test.instance_variable_set("@name","bbb")
#=>bbb
```
`(インスタンス名).instance_variable_set("@インスタンス変数名",更新後の値)`
instance_variable_setを使うことで、インスタンス変数(name)を「aaa」⇒「bbb」に変更することができました。

ここで注目してほしいのが、
`attr_reader :name`です。
「attr_reader」で宣言された変数は読み取り専用になり、変更はできませんがinstance_variable_setを使用することでインスタンス変数にメソッドを介さづアクセスするため変更がされてしまいます。

## 最後に

複数のインスタンスを一つの配列にまとめ作業していた際に、
配列の一つ目の要素のインスタンス変数を取り出したいと思い、instance_variable_getに行きつきました。
しかし、attr_readerの変数を変更できてしまう怖さがありますので、
地道にeachメソッドでデータを参照しようと思いました。

以上です、読んで頂きありがとうございます。
【Salesforce認定アドミニストレータ試験】公式模擬試験の英日翻訳と図解解説 (4)

この試験を受けるための勉強をした際に思わぬ苦戦をしたので、英語公式模擬問題を翻訳しながら図解解説として整理しました。

第1回目、第2回目、第3回目では、「出題分野2：Object Manager & Lightning App Builder（オブジェクトマネージャとLightning アプリケーションビルダー）」[出題率 20%]の範囲である「レコードタイプ」に関する問題を投稿しました。

今回（第4回目）は「出題分野4：Service and Support Applications（サービス＆サポートアプリケーション）」[出題率 11%]の範囲である「ケース」に関する問題と図解解説です。

Aung

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/35d5243a-dce8-55fa-f0ce-3637e6b37325.jpeg)
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/ccdead6d-f9f2-bb9e-17d7-d4de8bf03375.jpeg)
![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/7ae302b4-9b07-aa96-a9b6-69ca7b876d96.jpeg)
![スライド4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/356fe6e1-1428-3169-57e3-ffa2b4c2fa83.jpeg)

■ これまでの投稿

① 出題分野2：Object Manager & Lightning App Builder（オブジェクトマネージャとLightning アプリケーションビルダー）[出題率 20%]

　＜レコードタイプに関する問題＞
　　第1回目の投稿　～レコードタイプと営業プロセスに関する問題～
　　https://qiita.com/Aungz/items/204d20c5c2c72a52c9df

　　第2回目の投稿　～営業プロセスと選択リスト値に関する問題～
　　https://qiita.com/Aungz/items/5ecaa907ff6500924420

　　第3回目の投稿 ～レコードタイプとページレイアウトに関する問題～
　　https://qiita.com/Aungz/items/37058a7e6cb4d59025c1

② 出題分野4：Service and Support Applications（サービス＆サポートアプリケーション）」[出題率 11%]

　＜ケースに関する問題＞
　　第4回目（今回）の投稿 ～ケース割り当てルールに関する問題～
TypeScript(JavaScript)で配列の開始indexを1始まりに偽装する 

## Proxyオブジェクトを使用して実現します

```typescript
const org = [1, 3, 5];

const array: any[] = new Proxy(org, {
  get(target: any[], prop: PropertyKey) {
    const index = Number(prop);
    if (!isNaN(index)) {
      // プロパティが数値であれば1を引く
      prop = index - 1;
    }
    return Reflect.get(target, prop);
  },
  set(target: any[], prop: PropertyKey, value) {
    const index = Number(prop);
    if (!isNaN(index)) {
      // プロパティが数値であれば1を引く
      prop = index - 1;
    }
    return Reflect.set(target, prop, value);
  }
});

array[2] = 9;
for (let i = 1; i <= array.length; i++) {
  console.log(i, array[i]); // 1, 9, 5 を順に出力
}

console.log("元の配列は0始まり");
for (let i = 0; i < org.length; i++) {
  console.log(i, org[i]); // 1, 9, 5 を順に出力
}

```
実行結果
```
1 1
2 9
3 5
元の配列は0始まり
0 1
1 9
2 5
```
ChatGPTに力を借りました

ChatGPTという言葉を最近耳にする機会が増えました。
実際、どんなことができるのでしょうか？

私自身の体験をもとにお話しします。

## どんな場面 ##
売場にて、特売商品の価格に合わせるため、前日の残りを売価合わせのための値引きを行います。
その都度、電卓で計算して、割引率を求めていました。

### 現状 ###
電卓を片手に計算をしています。
例：定番価格100ｇあたり158円の商品を
　　特売価格100ｇあたり98円相当に値引きます。
式：割引率= （158-98）÷158×100
　　割引率⁼　60÷158×100
　　割引率⁼　37.97％
  　割引率≒40％

以上のように求めます。
所要時間30秒


## ChatGPT ##

### 指示文章 ###
158円の商品を[98円と128円の2パターン］値引きするにはそれぞれ何％引きすればよいかWEBアプリのHTMLコードを教えてください。

### コード ###
![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655358/468f449d-25a7-e546-d74a-241f93c8a90f.png)

### 結果 ###
所要時間15秒
15秒の時間短縮に成功

### 余剰時間 ###
ほんの少しですが、余剰時間が生まれました。作業時間にまわせることができました。

## まとめ ##
今回初めて使用してみて、とても便利なものだと感じます。指示文章の具体性が求められると思います。使い方次第で無限の可能性を秘めています。
AZ-104 合格体験記

## １．はじめに
2023年8月にAZ-900を取得しましたが、少し期間が空いてしまいました。
しかし、AZ-104に合格することができたので、この記事では、その勉強方法をまとめたいと思います。

2024/2/25
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628466/71c0c8f3-4a05-9b87-85b3-aac38acf1426.png)

これからAZ-104の取得を目指す方の参考になれば幸いです。

## ２．勉強方法
では、早速勉強方法を紹介します。
主にUdemyとExamTopicsを利用し、不明点はMicrosoft Learnで確認しました。

## ２-１．Udemy
[【AZ-104合格講座】動画での解説とポイントを通じ、AZ-104合格に必要な知識を効率的に身につけよう](https://www.udemy.com/share/109Gsc3@WIylvm-oS-dvToX5y6VU85XWHGo0GLxpYdxM8DNmehlRZwSlIWim97ZKEKaSxfRHYQ==/)

https://www.udemy.com/share/109Gsc3@WIylvm-oS-dvToX5y6VU85XWHGo0GLxpYdxM8DNmehlRZwSlIWim97ZKEKaSxfRHYQ==/

おすすめ度：★★★★☆
問題集を解いて全く解けなかった方や、AZ-900取得から期間が空いてしまっている方におすすめです。
主に基礎知識を学ぶために利用しました。
問題解説形式となっており、丁寧な解説で理解がしやすかったです。

[受講生30万講師のAZ-104: Microsoft Azure Administrator模擬試験問題集（400問）](https://www.udemy.com/share/109evM3@TspEwiVFtxkMkdN6EIeytpgPZVb3d9BkQVe9ODti-3LqOxL-0VnBl_vjVRsKKL4rsQ==/)

https://www.udemy.com/share/109evM3@TspEwiVFtxkMkdN6EIeytpgPZVb3d9BkQVe9ODti-3LqOxL-0VnBl_vjVRsKKL4rsQ==/

おすすめ度：★★★☆☆
問題の形式に慣れたり、知識を定着させたりするのにおすすめです。
実際の試験では、問題集に似たような問題は出題されませんでした。
しかし、最新の傾向を加味した問題集が追加され、それはやってよかったと思いました。

## ２-２．書籍
[合格対策Microsoft認定試験AZ-104:Microsoft Azure Administratorテキスト&演習問題](https://amzn.asia/d/77zviby)

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628466/e53c1bc2-350a-5f3a-5ba7-8c4c2dbc35c3.png)](https://amzn.asia/d/77zviby)

おすすめ度：★★★☆☆
Udemyや海外サイトで理解しにくい箇所があればこちらで確認しました。
また、試験直前に章末問題や模擬試験を実施しました。

## ２-３. サイト
[ExamTopics](https://www.examtopics.com/exams/microsoft/az-104/)

https://www.examtopics.com/exams/microsoft/az-104/

おすすめ度：★★★★★
正直これだけやっていれば合格は間違いないと思います。
同じような問題が多数出題されました。試験の1週間前にこのサイトの存在を知り、非常に助かりました。（もっと早く知りたかった...）
ただし、解答が間違っている問題も多くあるので、公式ドキュメントの確認や回答者のディスカッションを確認する必要があります。

## ３．終わりに
上記の勉強方法でAZ-104に合格することができました。
次はAZ-305の合格を目指して頑張りたいと思います。ありがとうございました！

---
追記：無事AZ-305に合格できました。

https://qiita.com/nemu3/items/a814c20a580fb1ba60f2
Discord.pyで使用すべきライブラリ達

## はじめに
この記事は私のメモ的なものですので、読むなら軽く参照程度で構いません。

## 待機処理
`asyncio`モジュール、`time`ではDiscord API Gatewayへの接続が途切れてしまうため`asyncio`をつかう
```py:main.py
import asyncio

# 中略

@bot.event
async def on_message(msg: discord.Message):
    if msg.content == "wait":
        await asyncio.sleep(5) # 一応コルーチンなのでawaitつける
        await msg.channel.send("waited")
```
音楽コマンドなどでは`asyncio.Queue()`を使う

コード省略(←?)

## データベース系
`pymysql`が一般的だが非同期処理をするため`aiomysql`を使う
```py:main.py
import aiomysql
import aiomysql.cursors

id = 12345

async with aiomysql.connect(host="localhost", user="root", password="password", cursorclass=aiomysql.cursors.DictCursor) as conn:
    async with conn.cursor() as cur:
        await cur.execute("SELECT * FROM table WHERE id = %s", (id, ))
        result = await cur.fetchone()
```
`aiomysql`でもプレースホルダーは使える。execute()に第一引数としてSQLクエリ(変数には`%s`)、第二引数としてプレースホルダーに代入する値をタプルで渡す
ちなみにプレースホルダーに代入する値が一つしかないとき、タプルは`(変数, )`のようにコンマを一つつける。

## ファイル読み書き
こちらもビルドイン関数の`open()`を使用せず、`aiofiles`を使用する。Discord.py上ではでっかいファイルを読み書きするときこれでハートブレイクを起こさずに済む。
```py:main.py
import aiofiles
async with aiofiles("hoge.txt", "w", encoding="utf-8") as f:
    await f.write("Hello World!")
```

## 終わり
以上メモでした。ﾁｬﾝﾁｬﾝ
Storybookのバージョンを7系に上げてみた

# はじめに
storybookのバージョンが6系だったので、バージョンを7系に上げる対応をしました。

## 環境
- NextJs: 14.0.1
- react: 18.2.0
- storybook: 6.5.13 →　7.6.12

# バージョンアップ
[公式](https://storybook.js.org/docs/configure/upgrading)によると下記コマンドでバージョンを上げることができるとのことなので早速打ってみる
```terminal
$ npx storybook@latest automigrate
```

最新は`7.6.12`なのでそこまでバージョンを上げる
バージョンアップ中いくつか質問されますが、基本的に`yes`で進行

# 動作確認
環境やバージョンアップ後
```sh
$ yarn storybook
```
storybookが表示された！

ここから沼にハマっていく...

## エラー1
コミットができない。
husky & lint-stagedを使用してコミット時にlintを走らせるがlintが通らない
```
TypeError: Error while loading rule 'react/jsx-no-target-blank': `[[GeneratorState]]` is not present on `O`
```

早速エラーメッセージで検索をすると[StackOverflow](https://stackoverflow.com/questions/77464177/how-to-solve-error-while-loading-rule-react-display-name-generatorstate)で同じ事象っぽいのがヒットした

> After some research, I found out similar issues reported on the eslint-plugin-react repo and on its dependencies. This issue is related with errors in dependency resolution, when multiple incompatible versions of the same package are installed by the package manager. A similar issue was reported here. The solution is to remove duplicate dependencies

要するに依存関係が重複しているようだ。
> If you are using yarn, you can do the same by installing yarn-deduplicate

に従いコマンドを打ってみる

```sh
$ npx deduplicate yarn.lock
```

依存化解消されコミットできた！

## エラー2
コミットができて無事解決！と思ったがそんなことはなかった。
storybookが動かなくなってしまった

```
SB_BUILDER-WEBPACK5_0003 (WebpackCompilationError): There were problems when compiling your code with Webpack.
Run Storybook with --debug-webpack for more information.
```

調べてみるとbabel周りのエラーが起きているようでモジュールをうまく解決できないらしい

## 解決へ
問題は単純でした。
エラー1のタイミングで`npx deduplicate yarn.lock`をするのではなく単純に
- `node_modules/`を削除
- `yarn.lock`を削除
- `yarn install`

これで重複したパッケージも解決され、storybookも動くことが確認できました！

## まとめ
解決方法は基本的な事かもしれませんが、ハマると意外と視野が狭くなってしまいがちなので何かハマった際の糸口になってくれると嬉しいです。

こういったエコシステムは便利ですが運用で意外とコストをかけてしまうことが多いです。
精進しないとですね :cry:
Excelの TEXTBEFORE / TEXTAFTER でファイルパスからパスやファイル名を抽出する

# 概要
例えば、 `/aaa/bbb/ccc/ddd.txt` のような文字列から `/aaa/bbb/ccc` や `ddd.txt` をエクセルで簡単に抽出するやり方です。
検索すると RIGHT + LEN + SEARCH のような説明が多いため、関数名を忘れると探すのが面倒なので備忘録も兼ねて残しておきます。

# 環境
Office for Mac

# 使い方

## ファイル名を抽出する - TEXTAFTER
![TEXTAFTER_filename.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123946/5993a6c1-255c-f37a-4110-031f3ab9439b.png)

`=TEXTAFTER(text,delimiter,[instance_num], [match_mode], [match_end], [if_not_found])`

instance_numを負値にすることでテキスト末尾からの検索になります。
TEXTAFTERなのでdelimiterで指定した文字を最初に見つけた位置から**以降**の文字列を抽出します。

## パス名を抽出する - TEXTBEFORE

![TEXTBEFORE_filepath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123946/822e74ec-bb8d-de7a-b80b-4fb8e2056812.png)

TEXTBEFOREなのでdelimiterで指定した文字を最初に見つけた位置から**以前**の文字列を抽出します。

# 簡単にまとめ
TEXTBEFORE / TEXTAFTER の方が分かりやすい指定で行うことができるのでおすすめです。
ファイルパスだけでなく、 `aaa.bbb.ccc.ddd` のようなJavaのパッケージ名からクラス名だけを抽出したい時とかにも使えます。
ただし、古いエクセルでは存在しない関数だと思うので、互換性には注意してください。


# 参考
https://support.microsoft.com/ja-jp/office/textbefore-%E9%96%A2%E6%95%B0-d099c28a-dba8-448e-ac6c-f086d0fa1b29

https://support.microsoft.com/ja-jp/office/textafter-%E9%96%A2%E6%95%B0-c8db2546-5b51-416a-9690-c7e6722e90b4
Rubyの基本（文法）

# Rubyにおける定数
Rubyでは変数だけでなく定数を定義することができる。
名前をすべて大文字で書くことにより定数となる。
簡単に更新したくないものは定数として定義すると良い。
```ruby:sample_01.rb
name = "変数のMito" # 変数
NAME = "定数のMito" # 定数
```
しかし、これらは値を更新しないように注意を促すにすぎず、値自体は更新できる。
実行時にWarningが表示される。

# 複数行のコメントアウト方法は以下の３つ
```ruby:sample_02.rb
# ① １行ずつ「#」でコメントアウト（範囲選択後、「Command + /」）
# ここがコメントになる

# ② 「=begin」と「=end」で囲む
=begin
ここがコメントになる
=end

# ③ 「__END__」（以下すべてコメントアウト）
__END__
以下すべてコメントになる
!!!俺もコメント！!!
!!!私もコメント！!!
```

# 入力の受け取りについて
「gets」で入力を受け取ることができる。
単に「gets」としても受け取り可能だが、受け取った値の直後が改行される。
「gets.chomp」の場合は改行されない。
```ruby:sample_03.rb
name_01 = gets # 直後に改行が入る
name_02 = gets.chomp # 直後に改行が入らない
```
以下を参照した。
[Rubyのgetsメソッドにおけるgets.chompの意味と使い方](https://qiita.com/Nagao-S/items/8c03b1996b2c27846937)

# 文字列の特定の位置へアクセス
文字列はインデックスを持っている。
1文字目のインデックスは「0」、2文字目のインデックスは「1」......となる。
```ruby:sample_04.rb
name = "Mitoshima"
puts name[0] #インデックス0の「M」が出力される

name[0] = "*"
name[1] = "*"
name[2] = "*"
puts name #先頭3文字が「*」に置き換えられるため、「***oshima」と出力される
```
# 文字列の長さを調べる
「length」と「size」は機能的に違いはない。
```ruby:sample_05_01.rb
name = gets
# "Mito"と入力されたとする
puts name.length # 「5」が出力される（「4」ではない）
puts name.size   # 「5」が出力される（「4」ではない）
```
上記の例のように1文字分多く結果が出力されてしまうのは、入力時のEnterキーによって改行が含まれるからである。
「strip」を使えば改行や余計な空白を取り除くことができる。
```ruby:sample_05_02.rb
name = gets.strip
# "Mito"と入力されたとする
puts name.length # 「4」が出力される
puts name.size   # 「4」が出力される
```
# 値の詳細を調査する
先の例では、対象のリテラルは4文字のはずなのに5文字であるという結果が返ってきた。
そのような場合は「p」を使えば値の詳細を調べることができる。
```ruby:sample_06.rb
name = gets
# "Mito"と入力されたとする
puts name.length # 「5」が出力される（「4」ではない）
puts name.size   # 「5」が出力される（「4」ではない）

# 値の詳細を調べる
p name # 「"Mito\n"」と出力される
```
文字列の末尾に余計な改行が入っていることが分かる。
VMをOVFでESXiにデプロイする

VMwarePlayerWorkstation17proで作成したVMをESXi6.5にデプロイしたところエラーが出たので5年まえにデプロイが成功したVMwarePlayerWorkstation15proで作成しなおした。
互換性や環境の差分でovfファイルを修正した他、WebUIでディスクを認識されなかったのでOVFtoolsを使ってデプロイできた。

### 環境
仮想化：VMware workstation-pro15
ホスト：Windows10
ゲスト：ubuntu22.04.3TLS
ESXi：ESXi6.5
### 作成したVMをOVFエクスポート
- VMをシャットダウンしてから実施する。
- VMware workstation-pro15でファイル→OVFへエクスポート


以下のとおり.ovfを含む4つのファイルができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340841/6dece67b-71a0-746d-f834-c45ecbb666e8.png)

### ESXiでデプロイする
webUIでインポートしを実行するとエラーが出たので`ovftool.exe`を使った。
#### OVFファイルを修正
xxx.ovfファイルをテキストエディタで開き、以下変更
`<vmw:Config ovf:required="false" vmw:key="videoRamSizeInKB" vmw:value="2048"/>`
の行でvmw:value="**2048**"に変更

`<vssd:VirtualSystemType>vmx-12</vssd:VirtualSystemType>`
の行で**vmx-12**に変更

#### .mfファイルを削除
xxx.mfファイルはMD5が記載されているためOVFファイルを書き換えると値が変るため削除（なくてもデプロイには影響ない）

#### OVFtoolで実行
DOSを開いて`ovftool.exe` のインストールパスに移動する。一般的には以下のパスになる。
``` sh:ovftool.exe のインストールパスに移動
cd C:\Program Files (x86)\VMware\VMware Workstation\OVFTool
```

``` sh:デプロイ実施
ovftool.exe --datastore=datastore1 --name=Ubuntu15 --network=xxxNW "C:\Users\xxx\Documents\Virtual Machines\Ubuntu_15.ovf" "vi://Username:Password@EsxiHost/"
```
**--datastore=datastore1** は、VMがデプロイされるデータストアを指定。
**--name=Ubuntu15** は、ESXi上で作成されるVMの名前を指定。
**--network=xxxNW** は、VMが接続されるネットワークを指定。これはOVFテンプレート内で定義されているネットワークインターフェースにマッピングされまる。
最後の引数 **vi://Username:Password@EsxiHost/** は、デプロイ先のESXiサーバーのアドレスと、そのログインに必要なユーザー名とパスワードを指定。

### デプロイ時ログ
``` sh:
C:\Program Files (x86)\VMware\VMware Workstation\OVFTool>ovftool.exe --datastore=datastore1 --name=Ubuntu15 --network=xxxNW "C:\Users\xxx\Documents\Virtual Machines\Ubuntu_15.ovf" "vi://root:xxxcom0033@192.168.x.x/"
Opening OVF source: C:\Users\xxx\Documents\Virtual Machines\Ubuntu_15.ovf
Opening VI target: vi://root@192.168.x.x:443/
Deploying to VI: vi://root@192.168.x.x:443/
Transfer Completed
Warning:
 - No manifest file found.
 - No supported manifest(sha1, sha256, sha512) entry found for: 'Ubuntu_15-disk1.vmdk'.
 - No supported manifest(sha1, sha256, sha512) entry found for: 'Ubuntu_15-file1.iso'.
Completed successfully

C:\Program Files (x86)\VMware\VMware Workstation\OVFTool>
```
※”No manifest file found”とWarningがあるがMD5の確認用のため特になくても問題なし。
Arduinoと簡単な回路でFreeRTOSの動作を試す

# この記事は何？
以前から組込み向けのリアルタイムOSに興味がありました。
そして、Arduinoで比較的簡単にFreeRTOSを動作させている方がいたので、
私も試してみることにしました。

その際の検証手順と内容を備忘録として残しておきます。

#### 参考にさせて頂いたURL
https://qiita.com/infinite1oop/items/aac04a70c1ed71cb83cc

https://qiita.com/ikenohotori/items/8c6285812bc4177c2564

# 検証内容
マルチタスクが期待通りに動作しているかを、以下のシンプルな回路とプログラムで確認します。

最初に、Arduinoに2つのLEDと1つのスイッチを接続し、
1つのLEDを3秒ごとに点滅させ、もう1つのLEDはスイッチが押されている間だけ消灯するプログラムを作成します。

RTOSのないプログラムでは、3秒ごとの点滅をdelay関数で実現するため、待機中はスイッチの入力を受け付けません。
一方、RTOSを利用したプログラムでは、2つのLEDの制御を別々のタスクとして実行するため、待機中でもスイッチの入力を受け付けます。

これらのプログラムを実際に実行し、スイッチを押してみることで、
その違いを確かめることができます。

# 準備

#### 回路設計

部品リストと配線図を以下に示します。
| 部品名 | 個数 |
| ---- | ---- |
| Arduino Uno R3 | 1 |
| ブレッドボード | 1 |
| LED(赤) | 1 |
| LED(緑) | 1 |
| カーボン抵抗(560Ω 1/6W) | 2 |
| タクトスイッチ | 1 |

![20240224回路図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111593/c37bd426-ad2b-bfa9-2b32-889ccd78a775.jpeg)

※こちらの画像をお借りしました。

https://denkikaiden.com/

#### FreeRTOSのインストール
Arduino IDEのライブラリマネージャから、FreeRTOSを見つけてインストールします。

![20240224_freertos.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111593/26aa17d3-d206-a381-5faa-153432f08ec3.jpeg)


#### プログラム作成

以下に、RTOSなしのコードと、RTOSありのコードを示します。

* RTOSなし
```C:sketch_twinLED_noRTOS.ino
void setup() {
  // put your setup code here, to run once:
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  pinMode(8, INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:

  int SW = digitalRead(8);

  if(SW == HIGH){
    digitalWrite(6, HIGH);
    //digitalWrite(7, HIGH);
  }
  else{
    digitalWrite(6, LOW);
    //digitalWrite(7, LOW);    
  }

  digitalWrite(7, HIGH);
  delay(3000);
  digitalWrite(7, LOW);
  delay(3000);
}
```

* RTOSあり
```C:sketch_twinLED_RTOS.ino
#include <Arduino_FreeRTOS.h>

void TaskA( void *pvParameters );
void TaskB( void *pvParameters );


void setup() {
  // put your setup code here, to run once:
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  pinMode(8, INPUT_PULLUP);

  xTaskCreate(
    TaskA
    ,  "TaskA"
    ,  128
    ,  NULL
    ,  1
    ,  NULL );

  xTaskCreate(
    TaskB
    ,  "TaskB"
    ,  128
    ,  NULL
    ,  2
    ,  NULL );
}

void loop() {
}

void TaskA(void *pvParameters) 
{
  (void) pvParameters;

  for (;;)
  {
    int SW = digitalRead(8);

    if(SW == HIGH){
      digitalWrite(6, HIGH);
    }
    else{
      digitalWrite(6, LOW);
    }
  }
}

void TaskB(void *pvParameters)
{
  (void) pvParameters;

  for (;;)
  {
    digitalWrite(7, HIGH);
    delay(3000);
    digitalWrite(7, LOW);
    delay(3000);
  }
}
```

# 検証結果

実際に回路を接続し、スイッチを押してみて、予想通りの動作が確認できました。

![20240224_写真.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111593/de310ffd-408f-60d6-8a8a-9f1a381ace24.jpeg)

今後は自宅で利用できるIoTデバイスや、簡単なロボットの制作に活用してみたいと思います。以上です。
関数とメソッドの違いについて

## はじめに
私は最近プログラミングスクールにて学習をスタートした初学者で、学習していく中で疑問が生じたので記事にしたいと思います。

それは関数とメソッドの違いについてです。

難しく説明はできませんが、今の自分でも理解できるような簡単な説明文でしたので、記事として残しておきたいと思います。

書籍を読んでいて気づいたことなので、簡単な説明で終わってしまいますがご了承ください。






## 関数とメソッドの違い

```swift:関数とメソッド

//関数
func thisIsAFunction() {
}
//メソッド
struct Person {
    func thisIsAMethod() {
    }
}
```

説明すると、メソッドはstructやclassのの中で定義されていて、関数はそうではありません。

## おわりに
今は、難しく考えるのではなく、簡単に違いを説明できる形で留めておきたいと思います。
buttonの縦位置

# はじめに
`html`の`button`が横に並んでいる中で、`hover`したときに`font-size`をちょっと大きくしてやろうとしたとき、若干上に浮く！？と気づいたので、その調査結果と、対策です。

# 課題
課題と解決策まで１つで書いてしまいますが、大げさにするとこんな感じ。
フォントサイズを大きくしてるだけなのに、なんでボタン自体がずれてるの！？という問題。フォントサイズを小さくすると下にずれる。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="dyrBxdO" data-user="yo16" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yo16/pen/dyrBxdO">
  ボタンの縦位置</a> by yoichiro ikeda (<a href="https://codepen.io/yo16">@yo16</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 解決方法
そろえたい`button`たちに、`vertical-align:middle;`をつける。

上のサンプルコードでは、`b1`というクラスを追加していますが、`button`に設定すればいいです。わかりやすくしたかっただけ。

# 問題の原因と解決方法の根拠（推測込み！）

## ① インライン要素たちの縦方向位置の決定ロジック
まず前提として、文字の高さ方向の位置を示す用語があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/a5012eb6-d720-59b7-8a52-11f3e04525d3.png)

これはインライン要素の１行ごとに、決まります。１行で大きい文字があったり、小さい文字があっても、１行で１つ決まります。その決め方は、一番大きな文字に合わせる、です。これは推測です。一番大きな文字からインライン要素のものさしが確定するので、上の画像では、「あ」という一番大きな文字を見つけてそこからtopとかbaselineとかが決まります。（[vertical-align - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/vertical-align) によると "包含する行ボックス" という言葉が使われていて、私の解釈でいう "インライン要素のものさし" がそれに相当。

つぎに、そのインラインの枠の中に、文字やボタンや画像のインライン要素を並べていきます。大きな文字はぴったり入り、それ以外の小さな文字たちは上下に余裕がある状態になり、どこに合わせよう？ってなります。

小さな文字たちの縦方向は、"インライン要素のものさし" に対して、"小さな文字なりのものさし"であわせに行きます。デフォルトは `baseline` なので、小さな文字なりの`baseline`を、インライン要素のものさしの`baseline`に合わせることで、行の中の縦方向が決まります。


## ② ボタンの縦方向
ボタンは、四角い箱の中に文字があるのではなく、文字を囲った四角い枠という考え方。なので縦方向の位置は、文字で決まります。これも推測です。


## ③ ボタンがあるときのインライン要素の高さ
ボタンがbaselineでそろって並んでいるときは、①②の理由によってボタンの上下がズレるんですが、そのときインライン要素のものさしのtop、bottomは、ボタンによって上書きされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/11cd77f8-79e1-14cb-5e10-1592e6f24950.png)

top、bottomはわかりやすいけど、middle等がどう変わるかは、調査できてないです。


# まとめ
かなり中途半端感があるんですが、これ以上調べてもタイパがよろしくないので、この辺りでいったん〆め。ちゃんとしたものを書かなければならない！と思っていると、モチベーションも下がってしまうので。

厳密には違うよ！という専門家の方もいらっしゃると思いますので、もし正しい論理、正しい解決方法、参考になるサイト等がありましたら教えてください。:grinning:
【Android】Jetpack composeサクッと簡単に点線を描く【kotlin】

# はじめに
jetpack composeでサクッと簡単に点線を描く方法を紹介します。

# 実践

        val points = ArrayList<Offset>().apply{
            for (i in 50 .. 1000 step 20) {
                add(Offset(100f, i.toFloat()))
            }
        }

        Canvas(
            modifier = Modifier.fillMaxSize(),
            onDraw = {
                drawPoints(
                    points = points,
                    pointMode = PointMode.Points,
                    color = Color.Black,
                    strokeWidth = 10f,
                )
            }
        )


![スクリーンショット 2024-02-25 17.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/3d408773-82b6-622a-7207-10897296a901.png)


# アレンジしたい場合

**１\. 横向きにしたい場合**
```
 add(Offset(100f, i.toFloat()))
```
の Offset()の引数に設定している数値を逆にすると横向きになります。

***


**２\. 間隔を狭めたいor広げたい場合**
```
for (i in 50 .. 1000 step 20) {
```
の stepの後の数を小さくすると間隔が狭くなり、大きくすると広くなります。
***


**3\. 点の大きさを変えたい場合**
```
strokeWidth = 10f,
```
の数を増やすと大きな点になります。
***

**4\.破線にしたい場合**
drawPoints()の引数に

```
pathEffect = PathEffect.dashPathEffect(floatArrayOf(20f, 10f))
```
を追加すると破線になります。

:::note warn
floatArrayOfの第一引数に
```
for (i in 50 .. 1000 step 20) {
```
のstepの後ろの数よりも小さい数を入れると点同士が全て繋がってしまうので、それぞれ調整が必要。
:::





# アレンジ後の実装

```diff
        val points = ArrayList<Offset>().apply{
-            for (i in 50 .. 1000 step 20) {
+            for (x in 50 .. 1000 step 50) {
-                add(Offset(100f, i.toFloat()))
+                add(Offset(x.toFloat(), 100f))
            }
        }

        Canvas(
            modifier = Modifier.fillMaxSize(),
            onDraw = {
                drawPoints(
                    points = points,
-                    pointMode = PointMode.Points,
+                    pointMode = PointMode.Polygon,
                    color = Color.Black,
                    strokeWidth = 10f,
+                    pathEffect = PathEffect.dashPathEffect(floatArrayOf(20f,10f))
                )
            }
        )
```

![スクリーンショット 2024-02-25 17.48.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/53a22929-3d46-be60-497e-3a5f50eeb89d.png)
AWS Public IPv4アドレス課金

## AWSのPublic IPv4アドレスに課金されていた

### AWSのBilling and Cost Managementをチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733402/a9d596e9-44a8-0ca7-65fc-b4c1465401ed.png)

AWSを最近使っていないはずなのに、VPCのところで**public IPv4 address per hour**で899hoursとなっている。これで$4.5(645円くらい）。

大したことないように思われるが、これがチリも積もれば・・となって、700円×12=8400円。一年でこれだけの額となるのはまずい。


## Public IPv4に関するAWSの発表


[こちら](https://aws.amazon.com/jp/blogs/news/new-aws-public-ipv4-address-charge-public-ip-insights/)によると

* **2024年2月1日**から1つのPublic IPv4アドレスにつき1時間あたり$0.005の請求が行われるようになる
* EC2 Public IPv4アドレス、Elastic IPアドレス、サービス管理のPublic IPv4アドレスが含まれる。（BYOIPアドレスは料金がかからない）([詳細](https://aws.amazon.com/jp/blogs/news/identify-and-optimize-public-ipv4-address-usage-on-aws/))

とのこと。

## Amazon VPC IP Address Manager Public IP Insights

[Public IP Insights](https://ap-northeast-1.console.aws.amazon.com/ipam/home?region=ap-northeast-1#PublicIpInsights)によって料金が発生するリソースをPublic IP アドレスにフォーカスして確認が可能となる。


私の場合はElastic IPアドレスが課金されていたので、解放。
【Arduino初心者メモ】Bootボタンを押すとLINEに通知

# はじめに
プログラミングとはほぼ無縁な職業についているのですが、学生のころからプログラミングに興味があり、少しずついろいろなものをかじってきました。
最近、「インターホンが押されたらDiscordに通知を送る」装置の記事を何かで読み、これなら私でも作れそうかも、と思い立ってESP32開発ボードを購入しました。
最終的な目標は「設定された時刻にDHT22で温度と湿度を計測し、LINEで通知する」ものの作成です。
まずは手始めに「BOOTボタンを押したらLINE通知」を作成してみました。

# その1　環境設定
これについては省略します。Windowsとmacの両方で環境を作りました。
macでやっているとなんだかかっこよく思えたためです。

# その2　コード設計
これも、いろいろなサイトを巡回して使えそうなものをかき集め、あとは少しだけ手を加えただけで完成しました。
便利な時代になったものです。

```#Boot_LINE
#include <WiFi.h>
#include <WiFiClientSecure.h>

// WiFi設定
const char* ssid     = "YOUR_SSID";
const char* password = "YOUR_PW";

// Bootボタンを設定
const int swPin = 0; 

// LINE Notify設定
const char* host = "notify-api.line.me";
const char* token = "YOUR_TOKEN";
const char* message = "押されたぜ！";

// もろもろ設定
void setup()
{
    Serial.begin(115200);
    delay(10);

    // WiFi接続
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    // Bootボタンを入力状態にする
    pinMode(swPin, INPUT_PULLUP);
}

// line通知
void send_line() {

  // HTTPSへアクセス（SSL通信）するためのライブラリ
  WiFiClientSecure client;

  // サーバー証明書の検証を行わずに接続する場合に必要
  client.setInsecure();
  
  Serial.println("Try");
  
  //LineのAPIサーバにSSL接続（ポート443:https）
  if (!client.connect(host, 443)) {
    Serial.println("Connection failed");
    return;
  }
  Serial.println("Connected");

  // リクエスト送信
  String query = String("message=") + String(message);
  String request = String("") +
               "POST /api/notify HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Bearer " + token + "\r\n" +
               "Content-Length: " + String(query.length()) +  "\r\n" + 
               "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
                query + "\r\n";
  client.print(request);
 
  // 受信完了まで待機 
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  
  String line = client.readStringUntil('\n');
  Serial.println(line);
}

// スイッチの変数宣言
int sw_val = 0;

void loop()
{
  // put your main code here, to run repeatedly:
    int sw_state = digitalRead(swPin);

  if (sw_state==LOW){ 
    send_line();  
  }
}
```

# その3　書き込み
とりあえず、これを書き込んでからBOOTボタンを押すと、設定したLINEの宛先にメッセージが飛ぶはずです。

あとは、これを「設定した時刻に」「DHT22で計測した温度と湿度を」送信するように直せば当初の思惑通りのものができるはず、です。

# その4　謎
- 通信速度？を115200に設定するのはなぜ？文字化けするから？
-
セキュリティ設計にSOLIDを用いてみる

# 背景
セキュリティ設計にも何かSOLID原則や、コンポーネント原則といった
設計原則の思想を持ち込めるのではないか？と考えていた矢先に、
Findy主催の認証系のイベントで自分の仮説の検証ができるいい気付きを得られたので
ここに残したいと思います。

# 前提知識
## リスコフの置換原則
これはSOLID原則のLです。
よく見かけるインターフェイスの公開メソッドをオーバーライドした実装側では、
インターフェイス側の戻り値の型がXと指定されていたら、XまたはXのサブタイプの型でないといけないなど、
インターフェイス側で指定された、事前事後条件を共に満たしていないといけない。
そうでないとポリモーフィズムが成立しない。

これは抽象クラスや具象クラスを継承し、スーパータイプの方だけをクライアントに公開したい場合も同様。
この場合には、事前事後以外にも、属性があり得るので不変条件まで継承先では満たさないといけません。

インターフェイス側でのアクセス修飾子を引き継いだpublicのままであったりは(publicより緩いアクセス修飾子ないから)、ここから来ています。

ここでは継承元がインターフェイスなのか、抽象クラスなのかに依らず、
実装先でオーバーライドして呼び出し側からは、インターフェイスまたは抽象クラスしか視えていない
ような時の継承を　型を継承しているとして意味継承と呼ぶことにします。
また投げる例外とかは事後条件に該当していますね。

※ここでは省略しますが、非検査例外時の意味継承は気を付けてください。
検査例外と違ってコンパイラーがエラー出してくれないので、最悪クライアント側が例外処理できず落ちます。

## 演繹法
演繹法は前提法則に当てはめて未来に起こる結果を推測する推論法です。
もしもその結果が外れた場合には、当てはめた前提が違っていたということになり得ます。
そのように検証することから個人的には、
この前提法則がインターフェイスに、各具体な事象が実装クラスに相当すると考えると、
演繹法はリスコフの置換原則と似た関係構造になっていると感じます。

# セキュリティポリシー
ポリシーとは方針であり、それは抽象的なものです。
ポリシーパターンなどといった名前のデザインパターンがあったりしますが、
あれは具象ルールの上位概念のインターフェイス部分を抜き取ったものを方針として定義しています。
その方針の事前事後条件という制約に従ってさえいれば、各々具体なルールはなんでもOKというもの。

これと同じことがこのセキュリティポリシーにも言えると感じました。

またセキュリティポリシーには、その企業ごとに取り決めているものから、
組織に依存しない業界ポリシーというものもあります。
それらをレイヤーで分けて考えると下図のようになります。
組織ポリシーの方が当然、業界ポリシーより具体な概念となります。
そしてそれらの間の関係は、意味継承でリスコフの原則を満たした関係性。

そして組織の抱えるプロダクトのセキュリティ要件は、
もしも組織セキュリティポリシーが存在していれば、図のように組織セキュリティポリシーを実現する形になっていなくてはいけません。

<img width="300" alt="スクリーンショット (409).png (23.7 kB)" src="https://img.esa.io/uploads/production/attachments/5827/2024/02/25/135213/2cf44e35-d13d-4188-8c94-c7d6d747e782.png">

そしてもしも組織の抱えるプロダクトのセキュリティ要件を変えた方が、
顧客にとってかちのあるものであると、具体なプロダクトを通して知見として得られたなら、
前提となっている自分たちの組織のセキュリティポリシーを見直す必要があります。
これが具体での検証を通して、前提の抽象概念を変更するという上記の演繹法の発想です。

またこの組織のセキュリティポリシーを変える際には、
業界のポリシーの条件を満たすように変更しなくてはいけません。