OmniAICreator/Qiita-1.07M huggingface dataset:
マーフィーの法則とトンビに襲われた思い出

## マーフィーの法則

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/6a94266e-f5d3-bb1b-b20c-456f0293b879.png)

失敗する余地があるなら、失敗する。

バターのついたほうが下に落ちるし、
洗車をすれば雨が降る。
休暇を取れば、トラブルの電話が鳴るし。
悪い知らせが重なる。
何故...と思ってしまいますが、
「人間の認知の問題」と「なるべくしてなった」の2つに集約されると考えています。

## 人間の認知の問題

悪いことは記憶に強く残ります。一方で平常通り、想定どおりのことは気にとめません。
もし、単なる不運なのであれば、気にしないことです。
しかし、単なる不運であることは実のところ、あまりありません。

## なるべくしてなった

失敗する余地がある限り、失敗するのです。

* configtestをせずに設定ファイルを変更後にWebサーバーを再起動すると壊れる
* git diffやgit statusを確認せずcommitすると間違った修正を混ぜてしまう
* デプロイをFTPクライアントを立ち上げ、ドラッグアンドドロップでやると間違いが起きる
* 日頃から悪口を言っていると本人に伝わってしまう

## 運の良い人、運の悪い人

運が良いという人と、運が悪いという人がいます。
人によって運勢が低い部分で安定したり、高い部分で安定するものでしょうか。

運が悪いという人は、その状態を自らがつくっているようにも思います。
人の説明や周辺の情報を逃す。
相手の細かなリアクションに気付いていない、目的を推測できていない。
注意が散漫。

嗅覚という抽象的な言葉にラッピングされがちですが、経験が豊富な人ほど嫌な予感、うまくいかない空気を早めに察知します。
運が良いという人はこういう人でしょう。

そういう私は運が悪い人間です。
端的にいうと、どんくさい人間です。

## 鎌倉の海でトンビに襲われた

今年の春に家族で鎌倉旅行に行きました。
朝食のないプランだったので、海も近いため朝に散歩がてら海辺に行ってサンドイッチでも食べることにしました。

そこで、サンドイッチを食べ始めたところ、トンビが上空からやってきて一瞬で手元のサンドイッチを奪い去りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/d49c44a4-7c1d-72a6-1ee6-2863371886ce.png)

その後、息子に問われました。
「ねぇパパ、鳥にサンドイッチを奪われた後、どう思った？」

私は答えました。
「自分が不甲斐ないと思った。」
「平和ボケしていた。隙があった。周りが見えていなかった。」
「よく考えれば回避できたことが回避できなかった。それが悔しい。」

まさにマーフィーの法則だなと思ったのです。
失敗する余地があるなら、失敗する。

息子は事あるごとに、ニヤニヤしながらこのときの出来事を掘り返します。
「ねぇパパ、鳥にサンドイッチを奪われた後、どう思った？」

## ヒューマンエラーを防ぐ知恵

日々の生活の工夫や習慣で回避できるエラーもあります。
私は"運が悪い人間”なので、下記のような工夫をしています。

* 鍵は自分で閉める（外出時に内側から施錠してもらわない）
    * 鍵の持ち出し忘れ防止、習慣による鍵の閉め忘れ防止
* 洗濯時の一連の作業は1トランザクションとして途中離脱しない
    * 衣類が入っている状態のステータスが常に洗濯済の状態とする
    * 洗剤入れたかな？スイッチ入れたあとなのかな？などの不確かな状態にしない
* 食洗機も同じく1トランザクションとして途中離脱しない
    * 中途半端に入れて、もう少し汚れた食器がたまるまで待つようなことはしない
* 電車の網棚は利用しない
* タクシーに乗るときは荷物を膝の上、または体に掛ける状態とする
* 飲酒した状態でメールを送付しない
* 生活用品はなるべく定期便で届くように  

あぁ、そうそう。春の旅行の出来事を経て、ひとつ追加されました。

* 外でサンドイッチを食べるときには、上空に敵がいないか確認する


## 仕事の場面でも

失敗する余地をつくらない仕組みづくりというのは、業務においても大切です。
技術者はその仕組みづくりを担うのが役目だとも思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/0929a39c-6979-f0c9-6676-7f28cf944f33.png)

日々の運用のコストを増やさず、業務フローでエラーを回避できるのであればそのようにするべきです。
各種Lintを通らないとマージできない。レビューを通らないとマージできない。
マージすることにより自動でデプロイされる等。

"運の悪い人間”から"運の良い人間”になれるよう、頑張っていきたいと思います。
Nerves Livebook でアクティブブザーを鳴らす

## はじめに

Nerves Livebook で Raspberry Pi 用スターター電子工作キットを楽しんでいます

[SunFounder Raspberry Pi 用のスターター電子工作キット](https://amzn.asia/d/04vHhGKQ)

これまでの記事

- [Nerves Livebook で Raspberry Pi 4 のLチカ](https://qiita.com/RyoWakabayashi/items/8119260ceeea462d6b7b)
- [Nerves Livebook + Delux で簡単Lチカ](https://qiita.com/RyoWakabayashi/items/281afab89249dbf68cd5)
- [MacBook 上の Livebook から Raspberry Pi 上の Livebook に接続してLチカする](https://qiita.com/RyoWakabayashi/private/844da38ff24efa3b923c)
- [Nerves Livebook から GPIO 拡張ボードの LED を点滅させる](https://qiita.com/RyoWakabayashi/private/bda56ee6987b30857266)
- [Nerves Livebook から RGB LED を制御する（ソフトPWMもやってみる）](https://qiita.com/RyoWakabayashi/private/143fda67a1798bd788b7)
- [Nerves Livebook から LED 棒グラフを制御する](https://qiita.com/RyoWakabayashi/items/a6e8b712388d68bdca44)
- [Nerves Livebook でボタンとLEDを連動させる](https://qiita.com/RyoWakabayashi/items/9bf9475d3c5d65cdfa4e)
- [Nerves Livebook で 7 セグメントディスプレイに文字を表示する](https://qiita.com/RyoWakabayashi/items/d13d86d91c86e816d899)
- [Nerves Livebook で 4 桁 7 セグメントディスプレイに文字を表示する](https://qiita.com/RyoWakabayashi/items/32edd890ade613cb4e37)
- [Nerves Livebook で LED ドットマトリックスにアニメーションを表示する](https://qiita.com/RyoWakabayashi/private/16f110cdd4febd0aedc1)

この記事ではアクティブブザーを鳴らします

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/nerves_livebook/active_buzzer.livemd

## アクティブブザー

振動源が内部に入っていて、電気が流れると音を出します

![IMG_1621.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/1ade6f08-156c-0a14-9943-222fc568ea2f.jpeg)

足が2本あり、長い方が陽極、短い方が陰極になっています

陽極はブザー上部に＋の表示もあるので分かりやすいです

## 回路の組み立て

オンライン説明書の通りに回路を組みます

https://docs.sunfounder.com/projects/davinci-kit/ja/latest/1.2.1_active_buzzer.html

今回は通電の制御にトランジスタも使います

## ノートブックの実装

Nerves Livebook を開き、以降のコードを実行していきます

### ピンを開く

今回は GPIO17 を入力のピンとします

`0` にすると通電して音が鳴るため、初期状態を `1` にしておきます

```elixir
{:ok, buzzer} = Circuits.GPIO.open("GPIO17", :output, initial_value: 1)
````

### ブザーを鳴らす

ピンの値を `0` にすると音がなります

```elixir
Circuits.GPIO.write(buzzer, 0)
```

けっこう甲高い音がします

<iframe width="437" height="776" src="https://www.youtube.com/embed/VOQZeykFY_o" title="アクティブブザー" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### ブザーを止める

ピンの値を `1` にすると音が止まります

```elixir
Circuits.GPIO.write(buzzer, 1)
```

### ピンを閉じる

遊び終わったらピンを閉じておきます

```elixir
Circuits.GPIO.close(buzzer)
```

## まとめ

ここまで LED ばかりでしたが、ようやく音に辿り着きました
Python RAWソケット データ送受信

## ファイルから読み込んでRAWデータ送信
単純にファイルから読んだデータをバイナリとして送信する。
WireSharkやtcpdumpでキャプチャしたデータを書き換えて送信など、テスト用途などに。

・Windowsはセキュリティの観点からか、socket.AF_PACKETが未定義で使用できない。
・MaxOSも使えないとの情報あり。
・Linux(Ubuntu)では動作を確認できている。
・Linux仮想マシン経由でWindowsからのデータ送出は可能。

```
import sys
import socket

ETH_P_ALL = 3

interface = sys.argv[2]

f = open(sys.argv[1], "rb") 
data = f.read();
f.close()

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind((interface, 0))
s.sendall(data)
s.close()

```

## 受信したRAWデータをファイルへ書き込む

狙ったパケットだけ受信するようにフィルタロジックを追加すれば使えるか。
MACアドレスでフィルタするなど。

```
import sys
import socket

ETH_P_ALL = 3

interface = sys.argv[2]

f = open(sys.argv[1], "wb") 

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind((interface, 0))
data = s.recv(1514)
f.write(data)
f.close()
s.close()

```
このts-patternいつ使うの？

## はじめに
`ts-pattern`の公式を読んでいてこれの使い所なんだろうという？という機能があったので
紹介しようと思いました

## そもそも`ts-pattern`とは
以下chatGPT
> ts-patternは、TypeScriptで型安全なパターンマッチングを提供するライブラリです。簡潔な構文で複雑な条件分岐を実現します。

要するに、場合わけで処理を変えたい時に安全に条件分岐を扱えるようになるライブラリです。

## P._  or  P.any
この`P._`または`P.any`はなんでも通り抜ける場合わけの一種です。
`otherwise`でよくない？と思いました。。。
いつでもマッチする場合？もはや`ts-pattern`いるのでしょうか。

```typescript
import { match, P } from 'ts-pattern';

const input = 'hello';

const output = match(input)
  .with(P._, () => 'It will always match')
  // OR
  .with(P.any, () => 'It will always match')
  .otherwise(() => 'This string will never be used');

console.log(output);
// => 'It will always match'
```

## さいごに
自分は用途がわからなかったので、知っている方やうまく活用している方は教えて欲しいです。
思考を張り巡らせた結果、自分の想像だと保守で致し方なく最短でこの選択肢を選ぶパターンがあるのかな？と思いました。
UE5勉強日記-data tableの使用

C++でblueprintから作るdata tableは下記のコードで使用できる。

```
FString TablePath = TEXT("/Script/Engine.DataTable'/Game/Data/DT_Food.DT_Food'");
    UDataTable* DataTable = Cast<UDataTable>(StaticLoadObject(UDataTable::StaticClass(), nullptr, *TablePath));
    if (!DataTable)
    {
        UE_LOG(LogTemp, Warning, TEXT("Failed to load DataTable at %s"), *TablePath);
        return false;
    }
    TArray<FName> RowNames = DataTable->GetRowNames();
	FName RowName = RowNames[index];
	FFoodStruct* FoodItem = DataTable->FindRow<FFoodStruct>(RowName, TEXT("LookupID"));
	if (FoodItem)
	{
		FoodItem->Inventory++
    }
```

☆data tableはRowNameで一行のデータを特定する。直接インデックスで特定できない。
FindRow<FFoodStruct>(RowName, TEXT("LookupID"));
は特定行を探す関数です。
RowNameは検索キーワードで、 TEXT("LookupID")は問題発生した時に残る記録です。
【新入社員必見】【Excel】エクセルでオリジナルショートカットを設定して作業効率アップ！！

こんにちは、きゅうです。

皆さんは会社でExcel（エクセル）は使いますか？
私は社会人になる前はOfficeソフトといえば、Wordを多用しておりましたが、Excelの便利さを知ったら、報告書とかもExcelで書いてしまうくらい、沼りました。

でも、正直Excelって機能が多すぎて、すべての機能を熟知出来ないというか、むしろ気に入った機能を多様化して、使わない機能は存在すら知らないなんてことありますよね？？

それで良いと思います。
ですが、よく使う機能に限って、ショートカットが分からなかったり、複雑だったりして、リボンの中から選ぶのダルかったりしませんか？？
私はそういうことが多々あります。

例えば、下記のような表があったとします。
このうちNo.2の『詳細』項目の値だけをコピーしたい。貼り付けたいということはよくあることだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/b0f2b138-d2fe-176c-63a7-460b86b43b5c.png)

皆さんはこの場合、どのように乗り切りますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/0ae8cd84-569c-ad1f-3c68-d8821dc96ea4.png)
# As Is
ショートカットを使用しないとなると、
下記の画面キャプチャーのように「ホーム」リボンの「貼り付け」から『形式を選択して貼り付け』を選択することが一般的であろうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/362c4c86-8a80-a3f1-009e-b9f2a897963a.png)

ですが、その方法では意外と時間がかかりますよね？？


# To Be
ということで、もっと効率の良いやり方を御紹介いたします。
それが、『クイックアクセスツールバー』という機能になります。
（下記の図の赤枠部分になります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/3802addd-2c88-29a0-1f63-0c08a6fa225f.png)

# 機能について
例えば、下記は私のエクセルのクイックアクセスツールバーの設定になりますが、
『書式のコピー／貼り付け』と頻繁に使うものから、『値の貼付け』というよく使うけどリボンからたどっていかないといけない機能、『カメラ』という、そもそもデフォルトのリボンのどこにも配置されていない機能を設定することも出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/084bbf17-2a8d-34b8-74ca-d5782a758ca4.png)


それが私の場合で行くと
・『書式のコピー／貼り付け』：ALT＋1
・『値の貼付け』：ALT＋2
・『カメラ』：ALT＋3
で実行できます。
そうなんです！『クイックアクセスツールバー』は左から『ALT＋N』でアクセスできるんです！
（「ALT」キーを押すと、ALTキーと何を押せばよいか出てきます！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/9c306ce3-9374-9c3b-2d2e-50147345dc0f.png)


# クイックアクセスツールバーの設定
ではクイックアクセスツールバーの設定の仕方を見ていきましょう。

**➀、リボンの「ファイル」をクリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/0ba914ce-fc6d-dec2-4c7d-bbb492816409.png)

**➁、「その他のオプション」をクリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/ce8eb611-ed19-a9b1-7af1-9813338b2a81.png)

**➂、「Excelのオプション」の「クイックアクセスツールバー」を選択**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/ddcacb61-0172-243f-b542-4020859e238e.png)

**➃、クイックアクセスツールバーの設定が表示される**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/690a1603-5fc9-b8d5-6090-1eef28b51883.png)


**➄、コマンドの選択をクリックし、「すべてのコマンド」を選択**
※こちらを行わないと『カメラ』などのマイナーな機能は表示されないので、お気をつけを!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/42aed164-1991-a358-71b6-174e99e25577.png)

もちろん、選択後、順番を入れ替えることでショートカットの「ALT＋N」の「N」の部分を変更可能ですので、使いやすい設定を見つけてみてくださいな！

はい、本日は以上です。
是非、試してみてくださいね！！

# 最後に
最後になりますが、この記事が皆さんの成長の少しでも手助けになることを祈って、この記事を閉めたいと思います。
最後までお読みいただきありがとうございました。
Edge にマウスジェスチャー到来。3rd-Party 製が怖くて避けてた人も安心？

# 背景

会社で教えてもらった待望のマウスジェスチャーの喜びを記しておく :D

# 設定の仕方

## [Edge 設定 - 外観](edge://settings/appearance) 下の方にある。

ここを On するだけで、使えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/06003834-67e8-dc70-8b7d-400bb8e2dbb1.png)


## [Edge マウスジェスチャー設定](edge://settings/mouseGesture)

とはいえ、もう少しカスタマイズってときは、ここで。

|操作|割り当て|
|-|-|
|↑|最上段までスクロール|
|↓|最下段までスクロール|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/46fe572a-d384-1c80-347e-c029f54d525e.png)

ただ、以下のことはまだできないみたい
- ジェスチャー自体のカスタマイズ
- リストにない操作の割り当て

# 左手キーボード、右手マウス時の、左手でよく使うショートカット

|操作|機能|補足|
|-|-|-|
|CTRL + W|現在のタブを閉じる|多くのアプリで共通になりつつある？|
|CTRL + E|アドレスバーで検索||
|CTRL + Shift + E|選択したキーワードをサイドバーで検索||
|CTRL + R|更新||
|CTRL + T|新しいタブを開く||
|CTRL + Shift + T|閉じたタブを再度開く||
|CTRL + Shift + Y|コレクション|二回押すことで、サイドバー閉じることにも使えたり :sweat: |
|CTRL + D|お気に入りに追加|Outlook から飛んできた際に、メール削除と間違って使うことも・・|
|CTRL + Shift + D|すべてのタブをお気に入りに追加|ほぼ使わない・・|
|CTRL + F|ページ内検索||
|CTRL + G|ページ内検索|F が、ページ内アプリに利用されてることが多いが、G ならページ全体検索でいい感じ|
|CTRL + H|履歴||

# あとがき

スレイプニールで感激したマウスジェスチャーだけど、せっかくなのでもっと色々なコマンド割り付けられるとありがたいなぁ
04_構築のために公式ドキュメントを見た

# 前回の話

https://qiita.com/ersia/items/e2f1e3beecd331548727

Material UIの構築ができるように。
という喜びもつかの間、脆弱性だゾ～って何かが赤く光ってました。
ということで、昨日の手順だと脆弱性に関するエラーが出るので改めてドキュメントを見ていくことに

## Material UI Introduction

https://mui.com/material-ui/getting-started/

>Material UI is an open-source React component library that implements Google's Material Design.

→Reactの構築が必要。

## React再構築 - create-next-app

https://ja.react.dev/learn/start-a-new-react-project

`npx create-next-app@latest`

project named - > gtasktool
typescript -> no
ESLint -> yes
Tailwind CSS -> no
src/ directory -> yes
App Router -> no
import alias -> no

https://zenn.dev/ikkik/articles/6b6d3415cf5324

こちらに詳しく記載されていましたのでシェアします！

```
found 0 vulnerabilities
Initialized a git repository.

Success! Created gtasktool
```

とりあえず、create-next-appを実行する手順で、脆弱性によるエラーはなくなったようです。

作成後はこのような状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823205/7a199261-9bb3-9c6a-30f9-6720a473e017.png)

### Material UIを入れる
`npm install @mui/material @emotion/react @emotion/styled`

```
added 80 packages, and audited 393 packages in 12s

138 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
```

`npm install @fontsource/roboto`

```
added 1 package, and audited 394 packages in 3s

138 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
```

こちらも脆弱性は問題なさそう。

### 起動する

先に`npm run build`を実行、次に`npm start`を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823205/ef85dae6-71e6-ca3a-2d06-02d8ca980d6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823205/c4f83e8d-4cb5-c708-e80f-8890986fe273.png)

できました～！
動かしながらデバッグするためには`npm start`ではなく、`npm run dev`を使用してください

参考記事：

https://qiita.com/NagaJun/items/676cd4165b731978c765

## Material UIが動くかの確認

https://mui.com/material-ui/getting-started/usage/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823205/b598021f-2975-3a27-1b1b-22c095f66236.png)

index.jsにこれを上書きします

```
import * as React from 'react';
import Button from '@mui/material/Button';

export default function ButtonUsage() {
  return <Button variant="contained">Hello world</Button>;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823205/4b7616bb-8f31-52bb-8ffe-38b7949d8d9d.png)

う、うーん・・・まあよしとしましょう・・・？

とりあえず公式の手順通りに進めることができ、さらにボタンいっこ置けました。
デザインはおおまかにこうしたいというのがありますので、それに向けてコードをいじっていこうかと思います。


# ここまでご覧頂いてありがとうございました
エルシアでした。ではまた～
Qiitaからの情報取得の方法まとめ

Qiitaからデータを取得して、何か作れたらいいなと思ったことがありました。調べてみると、Qiita公式からデータを取得する方法がいくつかあるようでしたので、まとめてみます。

Qiitaから記事やいいね数など何らかの情報を取得するには、主に2つの方法があります。**「APIから取得する方法」と「RSSで取得する方法」** です。

## APIから取得する方法

1つ目は、APIから取得する方法です。一番オーソドックスな方法です。

Qiita APIは公式のインターフェースで、HTTPリクエストを使用してデータを取得します。APIエンドポイントに対して適切なリクエストを送信することで、記事やユーザーの情報を取得できます。プログラムで自動的にデータを取得したい場合などに適しています。

公式ドキュメントが公開されているので、こちらを参照しましょう。
https://qiita.com/api/v2/docs

このAPIを使うと例えば、以下のようなことができます。
- 認証中のユーザーの記事一覧を取得
- ユーザー情報を取得


Qiita API使用例

- Qiita APIを使って記事一覧を取得する
https://qiita.com/koki_develop/items/57f86a1abc332ed2185d



## RSSで取得する方法

2つ目は、RSSで取得する方法です。

QiitaのRSSフィードは特定のURLを購読することで取得できます。RSSリーダーなどで新着記事の情報を取得することができ、トレンドなどを追跡することに適しています。

以下のようなURLを購読することができます。

- ユーザの記事フィード
   - http://qiita.com/[user]/feed.atom
- Organizationの記事フィード
   - https://qiita.com/organizations/[organization]/activities.atom
- 人気の記事のフィード
   - https://qiita.com/popular-items/feed.atom
- 特定のタグの記事フィード
   - http://qiita.com/tags/[tag]/feed.atom


RSSはxml形式で記述されており、記事のタイトルやURを取得することができます。いいね数などは取得できないようです。登録したサイトのフィードを一覧にしてくれるRSSリーダーを使うと、記事タイトルなどを一覧して効率よく、記事を探すことができます。

Qiita RSS使用例
- [RSS] qiitaとzennの記事をslackに通知させる
https://zenn.dev/kenghaya/articles/6ff68c70235d49

## その他

### Webhookで取得する方法

Qiita teamという社内向け情報共有サービスでは、Webhookを設定することで外部のサービスと連携することができるようです。Webhookとは特定のイベントに応じて自動的にデータを送信する仕組みです。

公式ドキュメントが公開されています。
https://qiita.com/api/webhook/docs


### スクレイピング（禁止）

スクレイピングとは、Webサイトから情報を抽出する技術のことです。HTMLタグを利用して特定の要素や属性にアクセスし、必要な情報を取得します。
ただ、Qiitaではスクレイピングは禁止されているので、この方法で取得するのはやめましょう。

Qiita API・スクレイピングについて
https://help.qiita.com/ja/articles/qiita-api


# 参考文献
Qiita KEINOS(2018)「Qiita 記事／ユーザ／Organization／タグ のフィード URL（フォローしたいユーザーやタグの XML/ATOM の URL）」,https://qiita.com/KEINOS/items/f0a5bce2fa9cfec85f8b 2024年06月25日アクセス.
バーンダウンチャートの失敗例とその教訓


## はじめに

スクラム開発において、バーンダウンチャートは進捗管理の重要なツールです。しかし、うまく活用できないと逆にプロジェクトの混乱を招くこともあります。今回は、私が経験したバーンダウンチャートの失敗例を通じて、その教訓を共有したいと思います。

## 失敗例1: 過剰な楽観主義

### 事例
あるプロジェクトで、チームは非常に楽観的な見積もりを行いました。初期のスプリントでは順調にタスクが消化されていき、バーンダウンチャートも理想的な形を描いていました。しかし、後半になると予期せぬ問題が次々と発生し、タスクの消化が遅れ始めました。

### 教訓
楽観的な見積もりは一時的にチームの士気を高めるかもしれませんが、現実的な見積もりを行うことが重要です。リスクを考慮し、バッファを持たせることで、後半のスプリントでも安定した進捗を維持できます。

## 失敗例2: タスクの過小評価

### 事例
別のプロジェクトでは、タスクの複雑さを過小評価してしまいました。特に技術的な課題が多いタスクについて、見積もりが甘く、実際の作業時間が大幅に超過しました。その結果、バーンダウンチャートは急激に下降することなく、ほぼ横ばいの状態が続きました。

### 教訓
タスクの見積もりは、経験豊富なメンバーの意見を取り入れ、慎重に行うべきです。また、技術的なリスクが高いタスクについては、事前にプロトタイプを作成するなどして、リスクを軽減する方法を検討することが重要です。

## 失敗例3: コミュニケーション不足

### 事例
あるプロジェクトでは、チーム内のコミュニケーションが不足していました。特にリモートワークが主流となった現在、メンバー間の情報共有が不十分で、タスクの進捗状況が正確に把握できませんでした。その結果、バーンダウンチャートは実際の進捗を反映しておらず、プロジェクト全体の遅延を招きました。

### 教訓
リモートワーク時代においては、定期的なミーティングやチャットツールを活用して、メンバー間のコミュニケーションを強化することが重要です。進捗状況をリアルタイムで共有し、問題が発生した際には迅速に対応できる体制を整えることが求められます。

## まとめ

バーンダウンチャートは、スクラム開発における進捗管理の強力なツールですが、適切に運用しなければ逆効果となることもあります。今回紹介した失敗例とその教訓を参考に、より効果的なバーンダウンチャートの活用を目指しましょう。
SAP S/4 HANA 在庫/購買管理（MM）基本知識１：全体概要

### はじめに
- SAP ERPでは、在庫管理機能と購買管理機能をペアにして在庫/購買管理モジュールとして扱っています。
- MMとは、Material Management の略です。
- ここでは、在庫／購買管理（MM）モジュールの全体像を把握することを目的とします。

### 全体機能関連図
![全体機能関連図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/2324f2c0-c478-fd3f-8f3e-a213e76fff23.png)
- MM（在庫／購買管理）モジュールは在庫管理機能と購買管理機能から成ります。
MM（在庫／購買管理）モジュールの機能としては赤線枠で囲った部分になります）
- 在庫管理機能は、在庫品の入出庫処理や在庫数量管理をサポートします。
- 購買管理機能は、仕入先からの生産財や消費財等の調達活動をサポートします。
- 他のロジスティクス系モジュール（SD：販売管理、PP：生産管理）やFI：財務会計モジュールとリアルタイムにデータ統合されています。

### 在庫/購買管理 機能関連図
![在庫購買管理機能関連図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/538a3b21-ed4b-0032-7cac-4c0cde70a01d.png)
- 購買管理と在庫管理の機能関連図です。
- 仕入先や各モジュールとのデータ連携を表しています。
- また、在庫／購買管理（MM）モジュールのおもなマスタデータとして、品目マスタ、仕入先マスタ、購買情報マスタがあります。

### 在庫/購買管理で使用するおもな組織とマスタ
![在庫購買管理で使用するおもな組織とマスタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/f8dec2fa-390c-4e70-1a9f-a63f2471b1c4.png)
- 上記画面は、購買管理における主要な伝票データである購買発注伝票の登録画面です。
- 購買発注伝票では、
		「何を」（品目）
		「どのように」（価格、納期）
		「どこから」（仕入先）
	購入するかを入力します。
- これら情報のうち、繰り返し入力して使用する情報はマスタデータとして管理します。
		「何を」（品目）		⇒ 品目マスタ
		「どのように」（価格、納期）	⇒ 購買情報マスタ
		「どこから」（仕入先）	⇒ 仕入先マスタ
- 「誰が発注するのか」、「どこで必要なのか」に相当するデータが組織データになります。
		「誰が発注するのか」⇒ 購買組織／購買グループ／会社コード
		「どこで必要なのか」⇒ プラント／保管場所
- 上記、組織データに該当するデータは、カスタマイズ（パラメータ設定）で定義します。
- 品目マスタ、仕入先マスタ、購買情報マスタ 等のマスタデータは、組織をキー情報としてもつため、購買発注登録時に入力する組織データによって、読み込まれるマスタデータが異なってきます。
- 組織データの定義は、データ管理の単位に大きな影響を与えるため、非常に重大なポイントになります。

【参考資料】
・図解入門 よくわかる最新SAPの導入と運用
Ubuntuでgit guiを起動する

# 背景
[独習Git](https://www.shoeisha.co.jp/book/detail/9784798144610)を読みながら、Linux環境で学習していたところ、git guiコマンドが見つからない事態に
書籍の「Gitのインストール」の章に戻って確認するが、「UNIX/Linuxは普通にインストールすればguiも付いてくる」といった書き振り（自分の理解力がないだけならすみません）
http://git-scm.com/download/linux
こちら↑を推奨されているが、その通りにインストールを進めてもguiは起動しない
## 環境
VirtualBox内の仮想マシン
OS：Ubuntu 24.04 LTS
# 手順
以下コマンド
```
sudo apt-get install git-gui
```
でインストールが完了し、```git-gui```コマンドが使用できるようになりました
# 蛇足
```git-gui```コマンドを使用すると、ターミナルが利用できない（Git GUIを終了するまで入力を受け付けない）状態になってしまいます
以下のように、```$```をつけて実行すると、コマンドをバックグラウンドで実行することが可能となり、GUIを起動しながら他のコマンドを利用することができます
```
git gui &
```
### 参考書籍
独習Git
https://www.shoeisha.co.jp/book/detail/9784798144610

ゼロからわかるLinuxコマンド 200本ノック
https://gihyo.jp/book/2023/978-4-297-13425-9
特定の条件レコード作成を防ぐ方法～重複ルール・一致ルール編～

本橋孝昭です

今回は特定のレコード作成を防ぐ方法として重複ルール・一致ルールを作成して対応する方法をご説明します

フローの説明と併せてご確認ください

https://qiita.com/Takaa/items/f66862232ad7c17ab187


今回は例として以下のような設定です


前提1 取引先責任者には「test01」という選択リスト項目がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ecf58188-251a-8e49-7e58-47fe342328f4.png)


前提2 同じ取引先には複数の取引先責任者が紐づくが、同じ取引先にはtest01項目が同一のレコードがあってはいけない

例として株式会社Aに紐づく取引先責任者について

・田中太郎　test01項目A
・鈴木次郎　test01項目B
・佐藤三郎　test01項目C

と異なるtest01項目が紐づくのはいいのですが、株式会社Aに紐づく取引先責任者について

・田中太郎　test01項目A
・鈴木次郎　test01項目A
・佐藤三郎　test01項目B

と、test01項目が1つでも同じデータがある場合重複を許さない　という設定です
（これは田中太郎と鈴木次郎が同じAなのでNG）


この設定をするためには
・ステップ1 一致ルールを作成し有効化
・ステップ2 重複ルールを作成し有効化

です
ステップを見ていきましょう

## ステップ1 一致ルールを作成し有効化

一致ルールは以下画像のように作成し有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/23d4e5fc-a2f6-b2ec-dff1-6878178f010e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c6d22b37-4d8c-65c0-06db-4eb96922c7db.png)


## ステップ1 重複ルールを作成し有効化

重複ルールは以下画像のように作成し有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2915d4c9-3265-a6d6-2d8c-3a5f1e95![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9cd5ad77-36d7-6836-6e09-db1fd882c981.png)
455e.png)


このように設定すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0cc02778-067e-2376-21a3-193fafe0b1df.png)


株式会社Aに紐づく取引先責任者について

・田中太郎　test01項目A
・鈴木次郎　test01項目A

と、test01項目が1つでも同じデータがある場合重複を許さない　という設定です


今回の一致ルール・重複ルールで重複確認をする場合、欠点が大きく２つあります

## 欠点1 商談など一部標準オブジェクトでは使えない

そもそも商談オブジェクトなど一部オブジェクトは重複ルールが作成できないのでこの方法は使えない


## 欠点2 同一名称の取引先名レコードがある場合、同一名レコードも重複判定してしまう

例えばたまたま同じ名前の会社名「株式会社A」が複数ある場合は、一度どこかの株式会社Aにひもづく取引先責任者のtest01項目がCと紐づいている場合、すべての「株式会社A」に紐づく取引先責任者のtest01項目はもうCにすることはできないです


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2e71995f-c866-7a11-6f91-74c846f873e9.png)


回避策としては一致ルールに会社名ではなく電話などを一致条件に加えることでしょうか
一致ルールはレコードIDを設定できないのでたまたま同じ名前のレコードがある　等の場合弱いです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c6d22b37-4d8c-65c0-06db-4eb96922c7db.png)



この欠点を克服したのがフローでの対応です

https://qiita.com/Takaa/items/f66862232ad7c17ab187
ABC252Dを解いた


筆者はAtCoderのレート600弱の茶色コーダ
以下の問題をADTで解いたが、時間内に解けなかったので復習

https://atcoder.jp/contests/abc252/tasks/abc252_d

ADTのページ

https://atcoder.jp/contests/adt_all_20240626_3/tasks/abc252_d


# 実装

解説見る限りどうやら解法は複数あるそうだ。
本記事では${}_nC_r$を使った実装と、DPの実装してみる。

## nCrを使った実装

まずこの問題見てやろうと思ったことは、${}_NC_3$から同じ数が同じ数を2以上を取りうる組み合わせを減らすこと。

整数$i$の出現数$d_i$を数え上げておき、
$d_i$が2以上、3以上のときにそれらを2個選ばれる数 ${}\_{d\_i}C\_2 \times (N-d\_i)$、3個選ばれる数 ${}_{d_i}C_3$ をそれぞれ引けばOK

```python
from collections import Counter
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def comb(n, r):
    result = 1
    for i in range(r):
        result *= (n - i)
    for i in range(r):
        result //= (i + 1)
    return result

def main():
    N = rI()
    A = rLI()
    
    ans = comb(N,3)
    
    c = Counter(A)
    for d in c.values():
        if d >= 2:
            ans -= comb(d,2)*(N-d)
        if d >= 3: 
            ans -= comb(d,3)
        
    print(ans)
if __name__ == '__main__':
    main()

```

## DPで実装

解説によると動的計画法でも解けるみたいで、
どうやら整数$i$の出現数$d_i$を使って漸化式を作ればいいみたい。

漸化式はこれ
$$
dp[i][j]   \quad += dp[i-1][j]
$$$$
dp[i][j+1] \quad += dp[i-1][j] \times d_i
$$

解説ではNextDPで実装したけどなんとなく2次元DPで実装

```python
from collections import Counter
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    A = rLI()
    
    c = Counter(A)
    
    S = len(c)
    
    dp = [[0]*5 for _ in range(S+1)]
    
    dp[0][0] = 1
    
    for i, d in enumerate(c.values(),start=1):
        for j in range(4):
            dp[i][j]   += dp[i-1][j]
            dp[i][j+1] += dp[i-1][j] * d 
    
    print(dp[S][3])
if __name__ == '__main__':
    main()

```

# まとめ

ABC252Dを解いた

各整数の出現数を求めておき、
それを使って${}_nC_r$を計算したり
動的計画法を適用したりすることで解くことができた。
Goのテストを書いてみる

## はじめに
Goでテストコードを書いてみました。

## 足し算と引き算をする関数
```go
package math

func Add(a, b int) int {
	return a + b
}

func Sub(a, b int) int {
	return a - b
}
```

## テストコード

1つずつの条件でも書けるし、テーブルドリブンテストで複数条件を構造体に定義して、ループで回すことでテストを分かりやすく書くことができる。

```go
package math_test

import (
	"testing"

	"example/math"
)

func TestAdd(t *testing.T) {
	want := 3
	if got := Add(1, 2); got != 3 {
		t.Errorf("want %d but got %d", want, got)
	}
}

func TestSub(t *testing.T) {
	// テーブルドリブンテスト
	tests := []struct {
		name string
		a    int
		b    int
		want int
	}{
		{name: "1-2", a: 1, b: 2, want: -1},
		{name: "2-1", a: 2, b: 1, want: 1},
		{name: "3-3", a: 3, b: 3, want: 0},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := Sub(tt.a, tt.b); got != tt.want {
				t.Errorf("want %d but got %d", tt.want, got)
			}
		})
	}
}
```

## 参考
- https://www.twihike.dev/docs/golang-primer/testing
ステークホルダーレビューを成功させるための秘訣


## はじめに
スクラム開発において、ステークホルダーレビューは非常に重要なイベントです。プロダクトの進捗を確認し、フィードバックを得ることで、次のスプリントに向けた改善点を見つけることができます。この記事では、ステークホルダーレビューを成功させるための秘訣についてお話しします。

## ステークホルダーレビューの目的
ステークホルダーレビューの主な目的は、プロダクトの進捗をステークホルダーに報告し、フィードバックを得ることです。これにより、プロダクトの方向性が正しいかどうかを確認し、必要な修正を行うことができます。

## 事前準備
ステークホルダーレビューを成功させるためには、事前準備が欠かせません。以下のポイントに注意して準備を進めましょう。

1. **アジェンダの作成**: レビューの目的や進行方法を明確にするために、アジェンダを作成します。これにより、参加者全員が同じ方向を向いてレビューを進めることができます。
2. **デモの準備**: 実際のプロダクトをデモすることで、ステークホルダーに具体的なイメージを持ってもらうことができます。デモの内容を事前に確認し、スムーズに進行できるように準備しましょう。
3. **フィードバックの収集方法**: フィードバックを効率的に収集するための方法を考えておきます。例えば、オンラインフォームやアンケートを用意することで、後からフィードバックを整理しやすくなります。

## レビューの進行
ステークホルダーレビューの進行は、以下のステップに従って行います。

1. **オープニング**: レビューの目的やアジェンダを簡単に説明し、参加者全員に理解してもらいます。
2. **デモ**: 実際のプロダクトをデモし、進捗状況を説明します。デモは具体的でわかりやすい内容にすることが重要です。
3. **フィードバックの収集**: ステークホルダーからのフィードバックを収集します。質問や意見を積極的に受け入れ、次のスプリントに向けた改善点を見つけましょう。
4. **クロージング**: レビューのまとめを行い、次のステップについて簡単に説明します。フィードバックをどのように活用するかを明確に伝えることで、ステークホルダーの信頼を得ることができます。

## フィードバックの活用
収集したフィードバックは、次のスプリントに向けた改善点として活用します。以下のポイントに注意してフィードバックを活用しましょう。

1. **優先順位の設定**: すべてのフィードバックを一度に対応することは難しいため、優先順位を設定します。重要度や緊急度に基づいて、対応すべきフィードバックを選びます。
2. **チームでの共有**: フィードバックをチーム全体で共有し、改善点を明確にします。これにより、チーム全員が同じ目標に向かって進むことができます。
3. **アクションプランの作成**: フィードバックに基づいて具体的なアクションプランを作成します。これにより、次のスプリントでの改善がスムーズに進みます。

## まとめ
ステークホルダーレビューは、プロダクトの進捗を確認し、フィードバックを得るための重要なイベントです。事前準備をしっかり行い、レビューの進行をスムーズにすることで、ステークホルダーの信頼を得ることができます。フィードバックを活用して、次のスプリントに向けた改善を行い、より良いプロダクトを目指しましょう。
build.gradleのdependencies依存関係指定方法

- implementation
    - コンパイルと実行時に必要な依存関係を指定。
    - 依存関係はほかのプロジェクトから見えず、依存関係の依存関係も含めてコンパイル時に使用される
- compileOnly
    - コンパイル時にのみ必要な依存関係のみを指定する。
    - 実行時にはこれで指定された依存関係は含まれない。
    - アノテーション処理やコンパイル時のチェックに必要な依存関係を指定するのに使用
- developmentOnly
    - 開発環境でのみ必要な依存関係の指定。
    - 本番環境ではこれで指定した依存関係は含まれない
- testImplementation
    - テストのコンパイルおよび実行時に必要な依存関係を指定。
    - テスト用フレームワークやモックライブラリに使用される
- runtimeOnly
    - 実行時にのみ必要な依存関係を指定。コンパイル時にはこれらの依存関係は含まれないが実行時に必要なもの。
- 他にも
    - compileClasspath
    - annotationProcessor
    - がある
ITパスポート 労働関連・取引関連法規

・労働関連の法規
・労働基準法
労働者の労働条件の最低基準を定めた法律
・労働契約法
労働者と使用者が対等の立場で労働条件について合意し、労働契約を締結することを定めた法律

・フレックスタイム
所定の労働時間を満たしていれば、始業時間や終業時間を定時からずらしてよいとする制度
・テレワーク
ICT技術を活用し、時間や場所の制約を受けない柔軟な働き方

・裁量労働制
労働者が自己の裁量で労働時間を決められる制度
専門業務型裁量労働制
企画業務型裁量労働制

・労働者派遣契約
労働者が、派遣元企業との雇用関係とは別に、派遣先企業の指揮命令を受けて仕事を行う契約
・労働者派遣法
派遣先企業は、派遣労働者を選ぶことができない
派遣先企業は、派遣された労働者を別会社へ再派遣することはできない
・紹介予定派遣
将来正社員などとして直接雇用があることを前提とした派遣の形態

・請負契約
請負企業が発注企業から請け負った仕事を期日までに完成させることを約束して、発注企業がその仕事の成果物に対して対価を支払う契約
発注企業が請負企業の労働者に直接指示は出せない
成果物が契約の内容に合わないときは、相当の期間内であれば、請負企業が責任を負う契約不適合責任がある

　
・取引関連法規
・製造物責任法（PL法）
消費者が製造物を使用することで生じる損害に対し、製造業者などが負う責任を定めた法律
・下請法
下請取引の公正化や下請事業者の利益保護を目的として定められた法律
・特定商取引法
店舗以外での販売形態をとる訪問販売や通信販売など、トラブルが生じやすい取引での消費者保護を目的として定められた法律
・公益通報者保護法
所属する組織や派遣先企業などの重大な犯罪行為を知り、公益のために内部告発（公益通報）した労働者が、解雇などの不利益な扱いを受けないように保護する法律
・情報公開法
行政機関が作成、保有する行政文書について、原則公開を義務づけた法律
・リサイクル法
資源の分別回収と再資源化について定めた法律
・資金決済法
商品券や電子マネーなどの取扱いについて定めた法律
・金融商品取引法
有価証券や金融商品の発行や売買について、投資者保護や公正な取引を目的として定められた法律
しくじりエンジニア、私みたいになるな！

# はじめに
過去のエンジニア人生を振り返って、しくじった経験を投稿します。

## しくじったこととは?
今から23年位前、まだLinux初心者時代のお話です。
調子に乗ってソースコードから、gccコンパイラーでソフトウェアをインストールしていました。
そんなある日、強引にmySQLのpreview版をtarファイルで取得し、gccコンパイラでインストールしたらなんと急にLinuxが応答せず、再起動してもLinuxが起動しませんでした。

## 原因は？
中古でいらなくなったノートPC(懐かしのCeleronの466Mz、メモリ64MB!、HDDは8GB!)にスペックオーバーのmySQLを入れたため、そりゃ動かくなるなあと思いました。

## 結局どうしたか？
当時使ってたノートPCをformatし、Windows98にリカバリーして戻す羽目に。
そこには自作したシェルスクリプトやホームページも消え去りました。

## 教訓
**バックアップって大事だよ！**

# 最後に
しくじり例を最後まで読んでいただき、有難うございます。
LeetCode挑戦日記：Day25

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Medium] 735. Asteroid Collision

整数配列`asteroids`が与えられ、これは一列に並んだ小惑星を表しています。

各小惑星の絶対値はその大きさを表し、符号はその方向を表します（正は右方向、負は左方向）。
各小惑星は同じ速度で移動します。

すべての衝突が終わった後の小惑星の状態を見つけてください。
もし二つの小惑星が衝突した場合、より小さい方が爆発します。
両方が同じ大きさの場合、両方が爆発します。
同じ方向に移動する二つの小惑星は決して衝突しません。

## 素直に解いてみる

### 考え方

1. `asteroids`配列の先頭から比較していく
    * 方向が同じ場合はレスポンス配列に入れる
    * 方向が離れる場合はレスポンス配列に入れる
    * 方向が近づく場合は大きい方をレスポンス配列に入れる

### コーディング

```typescript
function asteroidCollision(asteroids: number[]): number[] {
    const response: number[] = [];

    let i = 0;
    while (i < asteroids.length) {
        const left = response.pop();
        const right = asteroids[i];
        if (left === undefined) {
            response.push(right);
            i++;
        } else if (0 < left) {
            if (0 < right) {
                response.push(left);
                response.push(right);
                i++;
            } else {
                const result = left + right;
                if (result === 0) {
                    i++;
                } else if (0 < result) {
                    response.push(left);
                    i++;
                } else {
                }
            }
        } else {
            response.push(left);
            response.push(right);
            i++;
        }
    }

    return response;
}
```

### 結果

Runtime：51ms
Beats 99.43%

Memory：52.45MB
Beats 74.93%
Aruduinoでステッピングモータを動かす

### はじめに
　Aruduinoを使用してステッピングモータを操作する方法を解説します。
以下のものを使用します。モータードライバーは使用しません。

| 用意するもの | 型番 | 個数 |
|:-:|:-:|:-:|
| Aruduino | Aruduino　UNO |
| ステッピングモーター | ST-42BYG020 |
| 抵抗 | 470Ω, 1kΩ | 4 |
| 整流用ダイオード | 1N4007 | 4 |
| 5V直流電源 | ----- |
| NチャネルパワーMOSFET | 2SK22324 | 4 |

### ステッピングモータの端子について
今回用いるステッピングモータには端子が6つあり、それぞれ赤、黄、緑、青、白、黒です。
白と黒はそれぞれ電源につなぎ、その他4色の端子を操作することでステッピングモータは回転します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/f3dbfb1d-bea2-b174-197e-079040fc33ef.png)
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC

ステッピングモータは図のように4つのコイルがあり、順番に電圧が加わることによって回転します。
そのため動作するときは以下図のようにして動作させます。
![スクリーンショット 2024-07-02 21.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/662ef904-65e4-f56f-d7fd-877891aec0af.png)
![スクリーンショット 2024-07-02 21.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/e15d49f1-e0d3-028d-c619-11921ea6bd9b.png)

### 回路図
手書きですみません。下図のように回路を組みます。
![スクリーンショット 2024-07-02 21.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/4d423687-593b-855e-fe59-55375dd0db9b.png)

### データシート
[データシート](https://akizukidenshi.com/goodsaffix/ST-42BYG020.pdf)より、１STEPで1.8度回転すると記載されていますので、200ステップで1回転することがわかります。

### プログラム
1回転後に1逆回転するプログラムは以下のようになります。
```c++
// 必要なライブラリのインクルード
#include <Stepper.h>

// モーターのステップ数
const int stepsPerRevolution = 200;  // モーターのステップ数

// Stepperライブラリのインスタンスを作成
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
  // シリアル通信の開始
  Serial.begin(9600);
  // モーターのスピードを設定 (60 RPM)
  myStepper.setSpeed(60);
  // シリアルモニターにメッセージを表示
  Serial.println("Stepper motor control");
}

void loop() {
  // モーターを1回転前進
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // モーターを1回転逆転
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}
```
90度回転させたい場合は```myStepper.step()```の引数に```stepsPerRevolution / 4```とすればいいです。
間違って EC2 インスタンス起動しっぱなしにしてしまったので、起動してるか確認するスクリプトを作成した

# はじめに
間違って EC2 インスタンス起動しっぱなしにしたことありませんか。僕もそのうちの一人です。

AWS に連絡したら初回だからか料金を無料にしてくれましたが、次はなさそうなので再発しないように何とか食い止めたいなと思いました。そこで AWS コンソールを見に行かなくても起動しているかどうかを確認できるスクリプトを書いてみました！

# コマンド

```bash
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{
    InstanceId:InstanceId,
    Name:State.Name
}' \
    --output table
```

# コマンド詳細

- `aws ec2 describe-instances` というコマンドですべての EC2 インスタンスの情報を取得します。
- `--query 'Reservations[*].Instances[*].{InstanceId:InstanceId, Name:State.Name}'`:
  - JMESPath を使用して、`InstanceId`と`State.Name`（インスタンスのIDと状態名）を抽出します。

- `--output table`:
  - 出力フォーマットをテーブル形式に指定します。

# 実行結果

コマンドを実行すると、以下のようなテーブル形式の出力が得られます。

```plaintext
---------------------------------------
|        DescribeInstances           |
+---------------------+--------------+
|    InstanceId       |     Name     |
+---------------------+--------------+
|  i-XXXXXXXXXXXXXXXXX|    running   |
|  i-YYYYYYYYYYYYYYYYY|    stopped   |
+---------------------+--------------+
```

# 出力内容詳細

- **InstanceId**: EC2 インスタンスの ID。
- **Name**: インスタンスの状態（例: `running`, `stopped`, `terminated`など）。

# おわりに

このコマンドを使用することで、AWS アカウント内の EC2 インスタンスの状態を簡単に確認できます。
出来たらこのスクリプトを毎日自動実行して、`running` のものがあればメールやラインで通知する、っていうのやりたいですね。いや、やります！！
JTracker: A JetBrains IntelliJ IDEA. Supports JPA, MyBatis, and JDBC log formatting.

# JDBC Log

MyBatis や JPA ORM フレームワークを使用しているのであれば、MyBatis Log Formatting プラグインを使用しているはずです。
しかし問題があります。通常、フォーマットの効果しか見ることができず、誰がこのSQLを実行したのか、呼び出しのリンクを知る方法はありません。
下図に示すように

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796327/8e4cb385-122e-ce1a-2a74-f188cbc25555.png)

では、コールリンクと誰がそれを実行したかを知る方法はあるのだろうか？ 方法はある。それがこのスレッドの主人公である "[JTracker](https://plugins.jetbrains.com/plugin/24694)"だ。


# What's JTracker

JTrackerはJavaコード追跡ツールです。 現在、それは唯一のMyBatisログの追跡をサポートしています、フォローアップは、JPAとJDBCのすべてのログをサポートします。 つまり、限り、あなたのコードは、データベースのJDBC操作に基づいているように、その後、表示およびフォーマットすることができます。
効果を見てみましょう：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796327/870a3d5f-9dab-57f7-5958-cee72fb1098b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796327/2d5dbc76-3dc7-2059-1748-06b8dea54412.png)

![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796327/1a57ef1d-26c1-541d-20d1-531406745c11.gif)

ご覧のように、ログ出力には実行されたMapperが表示され、クリックすると自動的にMapperクラスのメソッドにジャンプします。
Ctrl + 左マウスボタン」(macOS: ⌘)を押しながらSQL実行のコールリンクを開くと、複数のパネルを同時に修正することができ、簡単に問題を見つけることができます。

# How to install it?

https://plugins.jetbrains.com/plugin/24694-jtracker-mybatis-log
2024年6月の学習記録

## 自学

### Git

いままで雰囲気で Git を使ってきたが、Rebase などでグチャグチャになってしまい疲労困憊になることがよくあった。これはいけないと思い、いちから再勉強。
下記の「Learn Git Branching」が、ゲームのような実践型でとても分かりやすかった。

https://learngitbranching.js.org/?locale=ja

学習し終えた上での悩みどころは「どのぐらい頻繁に push するのがよいのか」ということ。
amend、rebase、reset を有効活用したいなら、リモートに push せず、ローカルに溜めたままのほうがいい。一度 push してしまうとこれらは使えなくなってしまう。（push --force するという手はあるが・・・）

しかし、リモートワークをしていると「ちゃんと働いてますよ」感をアピールしたくて、ついついこまめにpush してしまうのだ。まぁ進捗はコトバで連絡すればいい話なので、Git はローカルに溜めて溜めて、1日の最後に一回だけ push する感じがいいのかな。

### Docker

仕事で Docker をよく使っている。
私はバックエンドエンジニアではないが最低限の知識は必要だろうと思い、下記の動画を見て、自分で環境構築をして学習した。

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

### TAKLOG

HTML / CSS の仕様は日進月歩がめざましく、数年前には実装に苦労して何十行も書く必要のあったものが、今では数行で簡単に実装できることも多い。

こちらのTAKさんのブログが最新事情を押さえるのにとても効果的で、毎日少しずつ読んでいる。

https://www.tak-dcxi.com/

### HTML5認定試験

「HTML5」じゃなくて「HTML Living Standard」の時代.....というのはさておき、最新のトレンドを広く浅く押さえ直すべく、試験問題集も読んでいる。

https://www.shoeisha.co.jp/book/detail/9784798176468

がっつり勉強するというよりは、1日10分解いて自分の得意分野／苦手分野をあぶりだしている。

## 職務

gulp を使って「SCSS→CSS」にトランスパイルしている古い仕様のウェブサイトを、Dart-sass でのコンパイルに切り替える業務を行った。

Docker / webpack / Node.js / SCSS / CircleCI についての複合的な知識が必要となり、ひたすら調べ物をしながら、試行錯誤する毎日だった。おかげで各方面への理解はかなり深まった。これらも折を見て記事にしていきたい。

chatGPTがこの世になければ、倍の時間がかかっても終わらない仕事だったと思う。chatGPTに圧倒的感謝。
ソースコードをベタ貼りするだけで、「問題点の要約 ＋ 解決策」を提示してくれるのがとても嬉しい。もちろん解決策は間違っていることもあるが、トライアンドエラーで順番に試していけば、たいていはそのうち解決する。

質問すると同時に、回答方法について逐一細かく指示を出してチューニングしている。徐々に使い勝手が増していくのが楽しい。

ちなみに、カスタムインストラクションは以下のとおり設定している。

> ###前提###
> - あなたは世界最高のフロントエンドエンジニアです。対応する言語は、HTML/CSS（Scss）/JavaScript（バニラJS、jQuery）/PHPです。
> 
> ###対応言語について###
> - 特別な指示がない限り、すべての言語において、最新の仕様に沿った記述をしてください。
> - HTML は、WHATWG が策定する「HTML Living Standard」の最新仕様に沿って記述してください。最新仕様は「[https://html.spec.whatwg.org/multipage/](https://html.spec.whatwg.org/multipage/)」から学習してください。
> - Sass は、基本的に Dart Sass の最新仕様に従ってください。最新の仕様は「[https://sass-lang.com/documentation/](https://sass-lang.com/documentation/)」から学習してください。
> - JavaScript については、異なるバージョンの書き方が混在しないように気をつけてください。「ES5」と「ES6」が混在してはいけません。例文となるソースコードが与えられた場合、それと同じバージョンで答えを返してください。連続する質問については、前後の文脈を理解し、同じバージョンでのソースコードを回答しつづけてください。
> 
> ###回答方法の大前提について###
> - 入力途中で誤って送信したような質問文に対しては、ただ一言「続きをご入力ください。」とだけ返してください。2行以上の返答をしてはいけません。
> - 徐々に複雑さを増しながら説明してください。
> 
> ###指示###
> 1. HTML/CSS/JavaScript については、まずソースコードの例文を示し、その後に1〜2行程度の簡単な解説を示してください。
> 1-1. NG：一番最初に言葉による長い説明を、何段落にもわたり表示する。
> 1-2. わたしが「詳しい解説を聞きたい」という指示を与えたときのみ、詳細な説明を提示してください。
> 
> 2. 私がコードの修正を依頼した場合、修正差分の前後の箇所だけをピックアップして回答してください。長いコードの全文を再掲しないでください。
>
> （以下略）
【Go】地味に嬉しい整形ライブラリ - pretty

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです😉）

今回は複雑な構造体や、ログなどを見やすく整形してくれるGoのライブラリである**pretty**をご紹介します！

# prettyの魅力
こちらの [The Go Playground](https://go.dev/play/p/IiwoGJ79IOb) でも体験できるように、`pretty.Formatter()`を使うことで整形された結果を確認することが出来ます！

``` main.go
package main

import (
	"fmt"

	"github.com/kr/pretty"
)

func main() {
	type myType struct {
		a, b int
	}
	var x = []myType{{1, 2}, {3, 4}, {5, 6}}
	fmt.Printf("%# v\n", x)
	fmt.Printf("%# v", pretty.Formatter(x))
}
```

``` zsh
[]main.myType{main.myType{a: 1, b: 2}, main.myType{a: 3, b: 4}, main.myType{a: 5, b: 6}}
[]main.myType{
    {a:1, b:2},
    {a:3, b:4},
    {a:5, b:6},
}

```

`pretty`を使用した時としていないときで、ログの見やすさがかなり変わったと思います！
（他の言語でも似たようなライブラリはあるので体験済みかも知れませんが😇）

このような簡単な構造体ならまだしも、複雑な出力結果の時に効力を発揮します！
``` main.go
package main

import (
	"encoding/json"
	"fmt"

	"github.com/kr/pretty"
)

func main() {
	// レスポンスとして返ってくるJSONのモック用意
	jsonResponse := `{
		"location": {
			"city": "Fukuoka",
			"area": "Kyushu",
			"prefecture": "Fukuoka"
		},
		"forecasts": [
			{
				"dateLabel": "今日",
				"telop": "曇のち雨",
				"date": "2024-07-02",
				"temperature": {
					"min": {
						"celsius": "25",
						"fahrenheit": "77"
					},
					"max": {
						"celsius": "30",
						"fahrenheit": "86"
					}
				}
			}
		]
	}`

	// JSONを構造体にアンマーシャル
	var data interface{}
	err := json.Unmarshal([]byte(jsonResponse), &data)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("%# v\n", data)
	fmt.Printf("%# v", pretty.Formatter(jsonResponse))
}

```

受け取ったJSONを見てみると、
``` zsh
map[string]interface {}{"forecasts":[]interface {}{map[string]interface {}{"date":"2024-07-02", "dateLabel":"今日", "telop":"曇のち雨", "temperature":map[string]interface {}{"max":map[string]interface {}{"celsius":"30", "fahrenheit":"86"}, "min":map[string]interface {}{"celsius":"25", "fahrenheit":"77"}}}}, "location":map[string]interface {}{"area":"Kyushu", "city":"Fukuoka", "prefecture":"Fukuoka"}}
map[string]interface {}{
    "forecasts": []interface {}{
        map[string]interface {}{
            "date":        "2024-07-02",
            "dateLabel":   "今日",
            "telop":       "曇のち雨",
            "temperature": map[string]interface {}{
                "max": map[string]interface {}{
                    "celsius":    "30",
                    "fahrenheit": "86",
                },
                "min": map[string]interface {}{
                    "celsius":    "25",
                    "fahrenheit": "77",
                },
            },
        },
    },
    "location": map[string]interface {}{
        "area":       "Kyushu",
        "city":       "Fukuoka",
        "prefecture": "Fukuoka",
    },
}
```

複雑な構造体であれば、さらに見栄えが良くなるのでおすすめです！

ただ一点注意がありまして、文字列は整形できませんので、JSON形式の文字列を構造体にアンマーシャルするという工程を挟む必要があります。

:::note warn
prettyは文字列を整形できない
そのため、構造体にアンマーシャルする必要あり
:::

# おわりに
今回は整形ライブラリであるprettyについて簡単に紹介しました！

最後までご覧いただきありがとうございました！
以上、センリツでした。🤓
AVAでswc-nodeを使ってTypeScriptで書かれたテストを実行するための設定

## SWC, swc-nodeとは

[SWC](https://swc.rs/)はRustで実装された高速なTypeScript/JavaScriptのトランスパイラで、BabelのようにTypeScript/JavaScriptのファイルを入力して、そこから様々な環境で動くJavaScriptファイルを生成することができます。

設定を行うことで、以下のようにtsconfig.jsonの`paths`の設定を利用したインポートを、相対パスでの`import`/`require`に書き換えてくれる機能が標準で備わっている点を特に個人的に便利だと感じています。[^1]

[^1]: `paths`を利用したインポートはJavaScriptを実行するツールや環境によって認識されたりされなかったりするのでありがたいです。

```ts:src/hoge/fuga/piyo.ts
import { hogera } from "@/moge/hogera";
```

↓ トランスパイルされたJSファイル

```js:dist/hoge/fuga/piyo.js
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
const _hogera = require("../../moge/hogera");
```

[swc-node](https://github.com/swc-project/swc-node)は、SWCをベースにしたts-nodeの代替で、ts-node同様以下のようにTypeScriptファイルを直接実行できるようにするものです。[^3]

[^3]: 同じようなts-nodeの代替に、[tsx](https://github.com/privatenumber/tsx)というツールもあります。swc-nodeは内部でSWCをトランスパイルに使っていて、tsxは内部でesbuildをトランスパイルに使っています。（参考: [まだts-node使ってるの？tsxの紹介 - Qiita](https://qiita.com/ssssota/items/115a906e960bcfabb46b)）

```
node -r @swc-node/register script.ts
```

ts-nodeには、TypeScript 5.0から追加されたtsconfig.jsonでの配列型の`extends`を使用するとエラーが出る点や、`paths`を利用したインポートを認識させるために`tsconfig-paths/register`を別途要する点など、不便に感じる点がいくつかありました。
自分はビルドにSWCを使っているので、統一できる嬉しさなどから、最近は個人のプロジェクトではswc-nodeを使うようにしています。
また、swc-nodeのREADMEにはベンチマークとともに“Fastest `TypeScript` transformer.”と書いてあるように、トランスパイルが高速（≒ 実行までが早い）なこともswc-nodeの利点といえるでしょう。



## AVAでswc-nodeを使う

さて、この記事では詳しい説明はしないことにしますが、AVAはTypeScript/JavaScriptのためのテスティングフレームワークのひとつです。

AVAを使用する際に、JavaScriptではなくTypeScriptでテストを書くようにする方法はいくつかありますが、swc-nodeを使う方法もあるのでそれをここで紹介します。

AVAにはpackage.jsonから設定を読み込む機能があるので、package.jsonに以下を追加することで、設定が完了します。

```json:package.json
{
  "ava": {
    "files": ["tests/**/*.ts"],
    "extensions": ["ts"],
    "nodeArguments": ["-r", "@swc-node/register"],
    "environmentVariables": {
      "SWCRC": "true"
    }
  }
}
```

それでは上記の設定の内容を順に説明します。
まず、`files`と`extensions`でテストファイルの場所と拡張子を指定して、AVAがTypeScriptのテストを見つけられるようにしています。`files`の値は、各々のディレクトリ構成のテストファイルの配置に合わせて変更してください。[^2]

[^2]: この例では、プロジェクトのルートの`tests/`ディレクトリの下に配置したファイルがテストファイルとして認識されます。

```json
"files": ["tests/**/*.ts"],
"extensions": ["ts"],
```

`nodeArguments`には、AVAがテストファイルを実行するために`node`コマンドを呼び出す際に渡すオプションを指定できます。`-r　@swc-node/register`が渡されるようにすることで、`node`がTypeScriptを実行できるようにしています。

```json
"nodeArguments": ["-r", "@swc-node/register"],
```

`environmentVariables`に環境変数の名前と値（文字列）を設定すると、AVAを実行した際にその環境変数が自動で設定されます。swc-nodeはデフォルトでは、SWCの設定ファイル.swcrcを読み込まないようになっていて、`SWCRC=true`を設定することで.swcrcを読み込むようになります。この設定がなくてもテストを実行することはできますが、設定ファイルを読み込ませてビルド時とSWCの設定を統一した方がよさそうなので、このようにしています。

```json
"environmentVariables": {
  "SWCRC": "true"
}
```

これでTypeScriptで書かれたテストが実行できるようになりました。
package.jsonで以下のようなスクリプトを定義して、`npm test`などのコマンドを実行すれば各テストケースが実行されます。

```json:package.json
{
  "scripts": {
    "test": "ava",
  }
}
```

----

## 参考

https://qiita.com/KokiSakano/items/563e99734850bb5b5723

https://qiita.com/niisan-tokyo/items/000db7cd0e995c802334

https://swc.rs/

https://github.com/avajs/ava

https://github.com/swc-project/swc-node
URL文字列をURLへ


# はじめに
今回Qiita APIを使って記事を取得し、
slack SDKを使って投稿を行うスクリプトを作成した時、
URL部分が上手くいかなかった時の解決法

# slack SDKとは
公式に記事がでているのでご参考に。

https://qiita.com/seratch/items/8f93fd0bf815b0b1d557

<br></br>
# URL表示方法

###### 『 マークダウン記法 』の場合

```
[Qiita HP] (https://qiita.com/)
```

[Qiita HP](https://qiita.com/) ←この形で表示される

###### 『 Slack SDK 』の場合

```
<https://qiita.com/|Qiita HP>
```

[Qiita HP](https://qiita.com/) ←この形で表示される


# 詰まったとこ
Qiita APIで取得した記事のURLを変数に格納後、
そのままSlak SDKに渡した。

```python
url_list = ["https://qiita.com/", "https://www.python.org/"]

response = client.chat_postMessage(
    channel="#random",
    text= f"1. <{url_list[0]}|Qiita HP>\n"
          f"2. <{url_list[1]}|Python>",
)
```
<br></br>
__投稿結果__
```
<https://qiita.com/%7C Qiita HP>
<https://www.python.org/%7C Python>
```
まんまやん！
[Qiita HP](https://qiita.com/)←この形にならない...

しかもなんかURLの語尾に(%7C)足されとるやん…


# 原因
##### URLとして認識されていなかった。

データの型を確認した結果、
リストに格納されているURLは文字列と判定されていた
```python
"<class 'str'>"
```



# 解決


```python
import urllib.request

parsed_url = urllib.request.urlopen(url_list[0])
print(type(parsed_url))
# class 'http.client.HTTPResponse'
print(parsed_url.geturl())
# https://qiita.com/
```

無事理想の形での投稿ができた!




# 最後に
上記の解決法が正しいかはわかりません。
正しいやり方や別の方法もあるよ！の場合は教えてください:bow_tone1:

最後まで読んでいただきありがとうございます。
Arduino UNO R4 でブロック崩し

# 道具さえあれば誰だって作れるブロック崩し解説

電子工作に自信がない方にも楽しめるように手順をまとめます。

## 準備するもの

- Arduino UNO R4（Arduino UNO R3でもできるそうです）

- AC-LLC8-V2 (8ビット双方向ロジックレベル変換モジュール)

- MSP2807 (SPI TFT Module)

- ブレッドボード

- ジャンパー線

## 手順

### 1　配線する

いつも頼りにしているCADサービスに使用する機器のデータが入っていなかったため、drawioで泣く泣くがんばりました。（つらいのでマネしなくていいです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/1f9b3ba0-94eb-b02a-4aa6-245f451fde72.png)

この図で、

赤線：5V
黄線：3.3V
黒線：GND

その他の線はデジタルPINに接続させています。

今回の通信プロトコルはSPIで行っています。
Arduino標準のSPI接続ライブラリは以下の通りピンが決まっています。

| UNO | PIN |
| --  | -- |
| 11 | MOSI |
| 12 | MISO |
| 13 | SCK |
| 10 | SS |

今回は以下の通りに接続しました。

| UNO | SCREEN | TOUCH |
| --  | -- | -- |
| 08 |  | T_CS |
| 09 | DC | |
| 10 | CS | |
| 11 | SDI(MOSI) | T_DIN |
| 12 | SDI(MISO) | T_DO |
| 13 | SCK | T_CLK |

RESET, LEDはコントロールめんどくさいのでVCC(3.3V)に突っ込んでいます。
レベルシフタのB側は5V、Arduino側に接続。
A側は3.3V、MSP2807（タッチスクリーン）側に接続しています。
なんでかはわからないけどこれで動きます。（今後調べます）

### 2　ILI9341のライブラリに入っているデモを試す

今回ILI9341のライブラリを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/4dc9cd05-fc8f-1761-aa0c-abe45a3f284d.png)

ライブラリをダウンロードすると、デモが入ってます。

File > Examples > Adafruit ILI9341 > graphctest 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/8327f7e3-49e0-45f5-928c-60f3773201cf.png)

こちらを開くとデモのスケッチが開きます。

実行しようとするとエラーします。
R3までのバージョンのプログラムのままなので、R4では動作しないようです。
ライブラリの内容を書き換えると動きます。
書き換える場所は以下サイトから。

https://forum.arduino.cc/t/compilation-error-wiring-private-h-no-such-file-or-directory/1146752/2

書き換えるプログラムは「Adafruit_ILI9341.cpp」。
なにかしらのテキストエディタで52-54行目を書き換え、上書き保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/a545faed-4cbb-8974-bd22-536d1808b391.png)

書き換え後デモ実行すれば、R4でも動作します。

### 3　プログラムをコピー、修正

実際にゲームのプログラムを動かしてみます。
コピーするスケッチは、いまいまさんから教わった以下サイトから（ありがとうBob氏！）

https://bytesnbits.co.uk/arduino-breakout-spi-lcd-touchscreen/

コピーしたスケッチから、TFT_RSTの個所（2か所）削除します。
なんたって、デジタルピンに落としていないのでエラーしますからね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/014f7b57-95b4-6a2b-0ebe-491be424869a.png)

その後、defineで接続しているピンの番号を、組んだ回路に従って修正します。
わたしの組んだ内容だとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/34e320eb-a36b-52ab-9cdd-21576510b833.png)

あとはコンパイル（書き込み）すれば動作します！

## 備考

### レベルシフター(8ビット双方向ロジックレベル変換モジュール)を使用する理由

うまく言語化できなかったのでチャットGPTに聞いてみました。

> MSP2807をArduino Uno R4 WiFiにSPI接続する際に、8ビット双方向ロジックレベル変換モジュールを使用する理由は、信号レベルの違いを調整するためです。具体的には以下の点が考慮されます。
電圧の違い: Arduino Uno R4 WiFiは3.3Vのロジックレベルを使用し、MSP2807は5Vのロジックレベルを持っています。直接接続すると電圧の不整合が生じ、正常に通信できない可能性があります。ロジックレベル変換モジュールを使用することで、信号を適切に変換できます。
信号の方向: 8ビット双方向ロジックレベル変換モジュールは、双方向の信号変換をサポートします。SPI通信ではデータの送受信が行われるため、このモジュールを使用して信号の方向を適切に切り替えることができます。
信号の整合性: ロジックレベル変換モジュールは、信号の整合性を保つために設計されています。これにより、信号の遅延やノイズを最小限に抑え、信頼性のある通信を実現できます。

ざっくりですが今回はここまでで。
いつも疲れて雑な記事すみません（反省）
【論文毎日読んでみる #5】日本語を食べさせた事前学習モデル

# はじめに
以下の要約・メモです

[趙天雨, and 沢田慶. "日本語自然言語処理における事前学習モデルの公開." 人工知能学会研究会資料 言語・音声理解と対話処理研究会 93 回 (2021/11). 一般社団法人 人工知能学会, 2021.](https://www.jstage.jst.go.jp/article/jsaislud/93/0/93_169/_pdf)

# 要約・メモ
## 1. はじめに
- 2018 年に提案された Generative Pre-trained Transformer (GPT)や Bidirectional Encoder Representations from Transformers (BERT)は，自己教師あり学習により事前学習される言語モデルであり，事前学習モデルと呼ばれる

## 2. 公開した事前学習モデル
- オープンコーパスである CC-100と Wikipedia の日本語テキストを用いて，GPT-2 と RoBERTa の事前学習モデルを学習し，公開した．
    - GPT-2 は自己回帰言語モデル
    - RoBERTa はマスク言語モデル
- 日本語のオープンコーパスで最も大規模であり整備がなされている CC-100 と Wikipedia を用いている