OmniAICreator/Qiita-1.07M huggingface dataset:
Session Managerで接続するための踏み台EC2を立てるCloudformation

# やること
今回はPublic Subnetの中に置いたEC2にSessionManagerで接続できるCloudformationを作成します。（下図左）
今回と同様のやりかたで、NATに紐付けたPrivate Subnetの中に置いたEC2にも接続できます。（下図中）

![スクリーンショット 2022-04-24 9.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/75736b01-1081-8b97-8b07-7f85c3f1fd06.png)


ただし、NATに紐づかないPrivate Subnetの中のEC2に対しては、VPCエンドポイントの作成が必要です。（上図右）
この場合の対応は下記参照ください。

https://dev.classmethod.jp/articles/session-manager-ec2-cloudformation/

https://dev.classmethod.jp/articles/session-manager-pattern/

# 実装
```ec2.yml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvironmentName:
    Type: String
    Default: sample
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Default: sample-key-pair
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  InstanceType:
    Type: String
    Default: t2.micro
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
  VpcId:
    Type: String
  PublicSubnetId:
    Type: String

Resources:
  SessionManagerRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${EnvironmentName}-SessionManagerRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service: ec2.amazonaws.com
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} SessionManagerRole

  SSMInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref SessionManagerRole

  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Default setting
      VpcId: !Ref VpcId
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-EC2-sg

  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      ImageId: !Ref LatestAmiId
      IamInstanceProfile: !Ref SSMInstanceProfile
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          GroupSet:
            - !Ref InstanceSecurityGroup
          SubnetId: !Ref PublicSubnetId
      UserData: !Base64 |
        #!/bin/bash
        sudo yum update
        sudo yum install -y https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/linux_amd64/amazon-ssm-agent.rpm
        systemctl enable amazon-ssm-agent
        systemctl start amazon-ssm-agent
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} EC2 to connect via session manager
```

# 参考
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started.html
STM32L010でLED2を割込みで点滅させます(タイマー割り込みで遊ぶ)


x まだ試していない 成功しました。2022/4/32 22:48


参考


https://os.mbed.com/users/okini3939/notebook/ticker_jp/


もとの資料


https://os.mbed.com/users/okini3939/notebook



STM32L010のプログラム
変更点は、PA_4とPA_5


```c++


#include "mbed.h"
 
Ticker flipper;
DigitalOut led1(PA_4);
DigitalOut led2(PA_5);
 
void flip() {
    led2 = !led2;
}
 
int main() {
    led2 = 1;
    flipper.attach(&flip, 2.0); // the address of the function to be attached (flip) and the interval (2 seconds)
 
    // spin in a main loop. flipper will interrupt it to call flip
    while(1) {
        led1 = !led1;
        wait(0.2);
    }
}



```




サンプル

本プログラムは、イメージです。
性能を保証するものでは、ありません。
個人的な感想です。　みるみる若返りました。(冗談)　ただのサンプル(冗談)


いろいろ
余計な情報　現時点21:04 ふろ入ってくるわ


```c++


#include "mbed.h"
 
Ticker flipper;
DigitalOut led1(LED1);
DigitalOut led2(LED2);
 
void flip() {
    led2 = !led2;
}
 
int main() {
    led2 = 1;
    flipper.attach(&flip, 2.0); // the address of the function to be attached (flip) and the interval (2 seconds)
 
    // spin in a main loop. flipper will interrupt it to call flip
    while(1) {
        led1 = !led1;
        wait(0.2);
    }
}


```
Failed to start Remount Root and Kernel File Systems.(Arch linux)

ここの[Arch LinuxのGUIのインストーラー](https://sourceforge.net/projects/blue-arch-installer/files/arch-installer/)でインストールしたところ、/etc/fstabにいろいろ指定がされていました。
ファイルシステムをbtrfsに指定したところ、space_cacheが指定されていました。

Failed to start Remount Root and Kernel File Systems.という、
表題のエラーは、この指定が問題でした。

btrfsのspaca_cacheオプションは、現在v2がデフォルト値になっているので、space_cacheのみではなく、space_cache=v2と明示的に指定するか、標準で有効化されているので、むしろ指定をしないほうが良いかと思います。
(あるいは無効化して、nospace_cacheを指定するのもありなのでしょう。)
（おそらくインストーラーで、genfstabを実行するときに指定しているのだと推測されます。）

/etc/fstabを適切に修正することで、Failed to start Remount Root and Kernel File Systems.エラーがでなくなりました。

```
systemctl status systemd-remount-fs.service
```
HTMLもJavaScriptも何もわからないけど英単語4択クイズを作った

# 実際の様子
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591409/329f041f-55a1-4826-fd56-552fae270841.gif)


#### GitHubにあげてみた
https://github.com/NightWatchWife/4words

### おおまかなつくり
- csvファイルを読み込む
- それを配列にする
- ランダムな値を1つ決め、配列の[1]要素の英単語をlabelにセットする
- ランダムな値を重複がないように他に3つ取り、合計4つのランダムな整数を配列に入れる
- その配列をシャッフルする(正解の位置をバラバラに)
- それらを選択肢として[0]要素の日本語をbuttonにセットする(選択肢は動的に(自動的に?))(csvなどに不正解選択肢を持ちたくない)
- buttonにこっそり正解の属性を入れてある(改良の余地がありそう)
- 押下時に正解なら「正解」と出る(出るだけ、エフェクトはほしい)


### 感想など

HTMLを触るのもJavaScriptを触るのもほぼほぼ初めてで、今回登板はなかったがCSSももちろん触ったことがない。

ファイル名も「html JavaScript 紐づけ」などで調べて出てきたサイトに書いてあるとおりに練習をしていた名残で「sample.js」となっている。

HTMLをよく知らないので
```javascript
 <input type="button" id="btn1" onclick="clickfun(event)" ans="" />
```

のように勝手に属性「ans」を追加していい事に驚いた。(とても便利)

ボタン押下時に値を持っていきたいが、click関数の中にいるので正解を表示するのにはどうしたら良いのか悩んだのでとても助かった。
おそらくはもっといい方法があるはず。
正解かどうかはソースに書いてあるのでどうしても正解したい人に配慮する形になってしまっている。

クリックイベントと属性の追加に関してだが、
```javascript
e.target.ans == "True"
```
としたかったが、世の中そんなに甘くなかった。
こちらも譲歩して
```javascript
e.target.getAttribute("ans") == "True"
```
と書きたかったがこちらも認められなかった。
正規の(?)属性のidには使えたので仕方なくこのように書いた。
```javascript
let btn = document.getElementById(e.target.id);
btn.getAttribute("ans") =="True"
```
<br><br>

あとはmain()が存在しなくても良い(？)っぽいので楽だなと思う。
だが、最初に参考にしたcsvを配列にする関数がfetchを使っていたので関数内で配列をセットしてくれなくて困った。
そのせいで、JavaScriptには参照渡しが存在しないんだと思ってしまった。

非同期処理はまだ、私には早いとされている。



### 今後の課題
- CSSで選択肢のサイズを統一したい(静的に)
- 英語のLableを大きくしたい(すぐにでもできることはわかる)
- 中央表示にしたい
- 正解時にマルを表示させたい
- 「次の問題」には自動的に行っていいと思う
- 不正解時に正解表示をした方が良い
- 正答率や間違えた問題など記録できたら良い
- 発音音声があると良い(とても難しそう)
- 他のモードもあると良い(時間制限でいくつ正解できるかなど)
- 他の4択もできると良い
- よくわからないがReactやTypeScriptなども学んでいきたい
- GCPなどでWebサイトにしたい
- ドメインが欲しい
- RaspberryPiが入荷してほしい
- GitHubの使い方がよくわからないのでちょっと怖い
- Qiitaの記事の書き方もよくわからない


### コーディング面での課題
- 変数、関数の命名が下手(ハンガリアン記法大好きマンなのでホントはこれで書きたい)
- コピペのコメントなどを整理しようとする気がない
- htmlやjsのマナーを知らないので我流の処理がある気がする
- 関数は必ずしも　};　としなくても　}　だけで良い？
- codepenを使いたかったがサインインできなかったのでやめた
- 恐縮だがコードの指摘があればぜひともお願いしたい...


##### 今後に向けて
その2があればまた記事を書きたい。

<details><summary>Special thanks</summary>
参考にしたサイトの人たち <br>
配列の要素シャッフル関数を作ってくれたサイトの人<br>
勝手に属性を追加することを許してくれたHTMLの人</details>
【AWS】SOA合格体験記 - 2022年4月23日 - 2度目の正直

# AWS SOAについて
SOA(AWS Certified SysOps Administrator - Associate)は
AWSの資格だと中レベルの資格になります。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512673/b92e754d-59fa-cea7-4e9f-099d5f64d2f2.png)

# 結果
2022年4月23日に再受験し、無事「合格(804点)」でした。

# 勉強方法
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)の有料会員になって
#50-#96を2周半しました。

# 総評
前回の試験から期間を開けずに再受験しました。
正直悔しかったので毎日2～3時間ほど時間とって、みっちり2週間勉強しました。
前回の試験と比べてレベル感は変わりませんでしたが、問題内容・ラボ内容ともに
全然違ったので問題セットがいくつかあるんだと思われます。

koiwaの問題集を実施して内容を理解できれば選択問題は大丈夫だと思います。
あとはラボ問題なので、個人アカウント作って無料の範囲でいろいろ触って勉強しましょう。
正直コンソール触ってないとラボ問題は解けないので200点くらい損します。

だいたい下記のような内容でした。
・通常の問題が55問
・ラボ①：S3の各種設定
・ラボ②：NWの初期構築系
ソフトウェア

復習回数1
## OS
<font color = blue>オペレーションシステム</font>は<b>ハードウェアやアプリケーションソフトウェア(応用ソフトウェア)を管理・制御するソフトウェア。<font color = blue>基本ソフトウェア</font>とも呼ばれている。
例：windows, mac os,Linuxなど
### アプリケーションソフトウェア
<b>OS上で稼働する特定の目的を実現するためのソフトウェアのこと
### ミドルウェア
<b>OSとアプリケーションソフトウェアの中間に位置し、統一的なインターフェースや共通の基本機能を提供するソフトウェア
## 制御プログラム
<b>ハードウェア資源の状態を常に監視して、コンピュータの効率的な利用を実現するソフトウェア群

<b>主な機能の一覧
・ジョブ管理 - ジョブのスケジュール管理
・タスク管理 - CPUを効率よく使用するための割当てを行う
・記憶管理 - 主記憶を効率よく管理
・ファイル管理 - DirやFileを管理するファイルシステムの機能を提供
・その他 - 入出力、通信、セキュリティ、運用、障害管理など

## API
<b>アプリケーションから、OSが用意する各機能を利用するための仕組み

## デバイスドライバ
<b>PCに接続した周辺機器を制御するソフトウェア。ハードウェアを直接制御する。

## プラグアンドプレイ
プラグを挿すだけで必要な設定をしてくれるもの

## OSS
<b><font color = blue>オープンソースソフトウェア</font>はソースコードを公開していて、無保証で誰でも改変できます。発展が目的。非営利団体のOSIでは、OSSの最低条件を挙げている。

## ディストリビュータ
用途に応じてOSやGUI環境、フォントなどを組み合わして、パッケージにして、再分布する団体のこと。

## OSSのライセンス
### BSD
<font color = blue>BSDライセンス</font>は無保証・改変後は元のソフトウェアの著作権表示部分やライセンス条文は残すこと、の二つの制約がある。
### GPL
上記に加え、コピーレフトがある。
#### コピーレフト
<b>著作権を保持したまま、プログラムの複製・改変・分布を制限せず、そこから派生した二次著作物には、オリジナルと同じ配布条件を適応する考え方
Emacs Lispの funcall と apply の違いについて調べた

Emacsで [request.el](https://github.com/tkf/emacs-request) を使ってAPIを叩くプログラムを作成するため、いわゆるコールバック函数を実現する方法を調べてました。

ある函数の引数に、コールバックさせたい函数を渡し、それを実行させればよいのですが、それには2つの方法があります。

引数 `cbfunc` にコールバック函数が設定されているとき、

```el
(funcall cbfunc)
```

または

```el
(apply cbfunc)
```

のどちらかで 引数が示す函数を呼び出しすことができます。

ここで `funcall` と `apply` の違いが分からず悩みました。函数の定義はどちらも同じです。

    Function: funcall function &rest arguments

    Function: apply function &rest arguments

これらが使われているいろいろなソースコードを読んだりし、小一時間は悩みました。

・・・が、結局のところマニュアルに書いてあったではないですか。

-   [実行時にいくつの引数を渡すか決定する必要があるときは、applyを使用します。](https://ayatakesi.github.io/emacs/24.5/elisp_html/Calling-Functions.html)

逆に言えば、 **実行時にいくつの引数を渡すか決まっている時は、funcallを使用すればよい** わけですね。

ドキュメントはきちんと読みましょう、でした。
Laravelでパンくずリストを使う

# 参考サイト
https://poppotennis.com/posts/laravel-breadcrumbs

diglactic/laravel-breadcrumbsというパッケージが便利
Composerでインストール
`composer require diglactic/laravel-breadcrumbs`

パンくずリストを定義するファイルを作成
```routes/breadcrumbs.php
<?php
// Home
Breadcrumbs::for('home', function ($trail) {
    $trail->push('Home', route('home'));
});
```
`route('home')`がルーティングのname。
なので、web.phpのルーティングの設定でnameがつけられてないとエラーになる。
以下のようにnameをつける
```routes/web.php
Route::get('/', [App\Http\Controllers\CookController::class, 'index'])->name('home');
```
delikaにデータセットをアップしてみた

## はじめに
以前試しにdelikaからデータを取得してみました。今度は自分のデータをアップしてみたくなったのでトライしました。

https://qiita.com/dem_kk/items/82cb9740f806b36ffea9

https://qiita.com/official-events/30be12dd14c0aad2c1c2

## 方法
[delikaのHP](https://delika.connecto-data.com/)にアクセスして、ログインする。
登録手続きの説明は今回省きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/cf380a17-56ca-afa4-0d8b-687def755532.png)

ログインしたら上記の画面が出るので、Datasetの部分にある「Create your fist dataset」をクリックする。

次の画面で、新しいデータセットに関する情報を設定する。無料アカウントであれば、基本Dataset Nameを決めればよさそう。終わったらCreatをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/73dfbea6-b22c-0beb-633b-1fc3be21a980.png)

付けた名前が反映されている。Description>Editを押すと、概要を書くことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/64aa3215-d417-adb3-8b38-b2ec6bcb0593.png)

書き終わったらUpdateをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/4a644924-27b1-4c4a-b647-c873b84895c0.png)

Upload Filesのタブを押すと、アップロード画面が出てくる。ドラッグ&ドロップで対象のファイルを持ってくれば完成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/a934bdb6-0391-2d2f-28e5-657d0aeb8c5a.png)

ちゃんとデータが反映されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/5bedc06e-710b-1b28-6b27-b1750225275f.png)

自分の食費関連をデータにしてみたけど、需要あるのか…？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/5d521872-6d53-c0ec-210f-39c6dd61fd66.png)

## まとめ
delikaにデータをアップしてみました。Gitと比べると制限はあるものの、やりやすいんじゃないかと思います。
こんなデータでもいいよ、という心優しい方がいたら活用してもらえると嬉しいです。
[データはこちら](https://delika.io/talkdrum372/kakeibo)
UiPath Studio 2022.4.0 Activity 標準全ツリー（チートシート）

# UiPath Studio 2022.4.0 Activity 標準全ツリー（チートシート）

## 注釈
UiPath Studio 2022.4.0で取得したツリー（デフォルトのままで追加/削除Activityはなし maybe）ですが、ざっと見たところ以前取得した 2021.10.5と同じです（既に 2022.4だった可能性も…）。
モダン使用のツリーですが、クラシック分も後ろの方にあります。
皆さんなりのビューアで見るでしょうし、等倍でなく少し縮小しても内容は判別できますし、少しスクロールして見るのは許容範囲という方もいると思うので、いくつかのサイズを置いておきます。
（下に行くほど横長です。サイズが半端値なのは、できるだけ小さい矩形範囲に納めるためです。）

## ツリー取得時のプロジェクトの依存関係（Windows - レガシ）
UiPath.Excel.Activities = 2.11.4
UiPath.Mail.Activities = 1.12.3
UiPath.System.Activities = 21.10.4
UiPath.UIAutomation.Activities = 21.10.5

## Activityツリー
2496x1409
![US2022.4.0_Activity_利用可能以降_PadL2_H1409_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/93b85e71-0820-7316-93a2-adc2e7d039a6.png)

2806x1267
![US2022.4.0_Activity_利用可能以降_PadL2_H1267_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/f017dc89-d36c-8b08-d5b5-0271a4decd22.png)

2962x1148
![US2022.4.0_Activity_利用可能以降_PadL2_H1148_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/971f6663-7c17-78b6-ea00-c83ee74374af.png)

3260x1052
![US2022.4.0_Activity_利用可能以降_PadL2_H1052_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/a39a01db-ff91-7c26-ec51-4ae91921f17b.png)

3503x978
![US2022.4.0_Activity_利用可能以降_PadL2_H978_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/cce98bca-ba2d-5d5c-72ab-01ca219a272e.png)
入出力インターフェース

復習回数1
## 入出力インターフェイス
<b>PC本体と周辺機器を接続するための規格の総称</b>
### USB
<b>PCと周辺機器を接続する標準的なシリアルインタフェース</b>
マウスやキーボードなどの周辺装置が接続できる。
<font color = blue >USBハブ</font>を使用すれば、最大127台まで機器を接続できる

### ホットプラグ・バスパワー
#### -ホットプラグ
<b>接続されている機器の電源を入れたままで抜き差しできる
#### -バスパワー
<b>USBのケーブルを介して、パソコン本体から電源を供給する方式</b>

### HDMI
<b>映像や音声、制御信号を1本のケーブルで入出力できるインタフェース

### Bluetooth
<b>免許不要の2.4GHz帯の電波を利用した、インタフェース。半径100m。最大通信速度は24Wbps。
<font color = blue>BLE</font> - Bluetoothの通信方式の一つ

### Zigbee
<b>免許不要の2.4GHz帯の電波を利用した、インタフェース。低コスト、低消費電力
### PAN
<b>LANより狭い、数m程度の近距離のIT機器同士が通信するネットワーク

参考文献：イメージ&クレバー方式でよくわかる 栢木先生の基本情報技術者教室
スコープ演算子（::）　アロー演算子（->）　PHP

## スコープ演算子（::）
インスタンス化していない状態でプロパティ（変数）やメソッド（関数）にアクセスしたいときに使う。
```php:クラス外からアクセスする際の例
<?php
class Hoge {
    // プロパティ（変数）定義
    $name = "田中";
    $color = "赤";

    // メソッド（関数）定義
    function hogehoge() {
        echo "self::colorです。"; // クラス内から呼ぶ場合は、 「 self:: 」 の形で書く。
    }
}

echo Hoge::$name; // Hogeクラスの$nameにアクセス。プロパティ（変数）にアクセス。
// 結果
"田中"

Hoge::hogehoge(); // Hogeクラスのfunction hogehogeにアクセス。メソッド（関数）にアクセス。
// 結果
"赤です。"

?>
```
※クラス外からアクセスする場合は　
`クラス名::アクセスしたいプロパティ（変数）やメソッド（関数）;`
※クラス内からアクセスする場合は　
`self::アクセスしたいプロパティ（変数）やメソッド（関数）;`

## アロー演算子（->）
インスタンス化した状態でプロパティ（変数）やメソッド（関数）にアクセスしたいときに使う。
```php:例
<?php
class Hoge {
  // プロパティ（変数）定義
  $name;

  // メソッド（関数）定義
  function hogehoge() {
    echo "{$this->name}です。"; // クラス内からアクセスする場合は `$this->` の形で書く。
  }

$hoge = new Hoge(); // Hogeクラスに＄hogeという名前のインスタンスを作成。
$hoge->name = "田中"; // 上記で作成したインスタンスの$nameにアクセスして、田中という値を入れる。
$hoge->hogehoge(); // hogehoge関数にアクセス。

// 結果
"田中です。"
}
?>
```
※クラス外からアクセスする場合は `$インスタンス名->` の形で書く。
※クラス内からアクセスする場合は `$this->` の形で書く。
※`$` マークはつかないことに注意。
入出力装置

復習回数1
## 入力装置
<b>コンピュータにプログラムやデータのほか、音声や画像などを入力したり、コンピュータに指示を与える装置</b>
キーボードなどの文字、数字を入力する装置
マウス・タブレットなどの位置情報を入力する装置
イメージスキャナなどのイメージを入力する装置などに分けられる
位置情報を入力する装置を総称して、<font color = blue>ポインティングデバイス</font>という
### 静電容量方式タッチパネル
<b>タッチした部分の表面電荷の変化を捉えて位置を検出する用法</b>
例：銀行のデバイス・スマホ・タブレットなど
### バーコードリーダー
<b>商品などに印字された帯状のバーコードを読み取る装置</b>
### POSシステム
<b>バーコードを使い、商品の販売情報をリアルタイムで収集し、売筋商品や死筋商品を把握できるシステム</b>

<b>・バーコードの種類</b>
<font color = blue>JANコード</font> - <font color = blue>日本で流通している様々な商品を管理するためのコード</font>
<b>国コード・メーカーコード・商品アイテムコード・チェックディジット</b>で構成されている
<font color = blue>QRコード</font> - <font color = blue>小さな領域に多くの情報を格納でき、エラー訂正機能を持つ二次元コード</font>

### RFID
<b>極小のICチップにアンテナを組み合わせた電子荷札。電磁波を用いて情報を非接触で読み取る。
別名 <font color = blue>ICタッグ<font></b>
例：商品タグや電車の定期券など。<font color = blue>NFC</font>はRFIDの国際規格

## 出力装置
<b>コンピュータ内部で処理したデータを外部に出力する装置</b>
### ディスプレイの種類
#### -液晶ディスプレイ
カラーフィルタを用いて色を表現する。液晶は発光しないので、外部の光を要する。
#### -有機ELディスプレイ
特殊な有機化合物を挟んでいる。自ら発光する。薄型にでき、<font color = blue>低電圧駆動・低消費電力</font>
### 解像度
ディスプレイは点（ドット）が集まって表現されている。このドットを<font color = blue>画素</font>や<font color = blue>ピクセル</font>という。ドット数が大きいほど解像度が高く、きめ細やかな表現ができる。
<font color = blue>dpi</font>は解像度の単位。1インチ(約2.54cm)あたりのドット数で表す。
### VRAM
<b>ディスプレイに表示される内容を一時的に記録するために使用される専用のメモリ</b>
ディスプレイに表現できる解像度や色数は、VRAMの容量によってきまる。
一般に、<font color = blue>nビットでは2ⁿ通り</font>の色を対応させれる。

### プリンタの種類
#### -レーザープリンタ
ビジネス用で用いられる。一分間に印刷できるページ数を示す<font color = blue>PPM</font>がある
#### -インクジェットプリンタ
印字ヘッドのノズルからインクを吹き付けることで印刷。個人向け
#### -ドットインパクトプリンタ
衝撃によって印刷。複写式の伝票印刷に用いられる。

### 3Dプリンタ
<b>3Dのデータに基づいて、熱で溶かした樹脂や金属粉末を層状に積み重ねることで立体物を作成できるもの</b>

参考文献：イメージ&クレバー方式でよくわかる 栢木先生の基本情報技術者教室
amazonlinux2 imagickをインストール

imagick入らんがや

```
sudo yum install php81-php-imagick
```

エラー

```
 依存性解決を終了しました。
エラー: パッケージ: ImageMagick6-libs-6.9.12.45-1.el7.remi.x86_64 (remi-safe)
             要求: libraw_r.so.19()(64bit)

```

はぁ！？

参考
https://qiita.com/t-kigi/items/f6850abaaee1db2df5a4



# libraw を取ってこいと。

http://rpm.pbone.net/info_idpl_60334575_distro_centos_7_com_LibRaw-0.19.2-1.el7.x86_64.rpm.html

上記らへんを調べて
Download の リンク先を右クリックプロパティで調べて指定


```
sudo rpm -ivh ftp://ftp.pbone.net/mirror/vault.centos.org/7.6.1810/cr/x86_64/Packages/LibRaw-0.19.2-1.el7.x86_64.rpm
```


もういっちょ

```
sudo yum install php81-php-imagick
```



```
php -m
```

で一覧に imagick が出ればok
Heroku CLIを用いたDeploy

# githubからherokuにdeployできなくなった⁉
2022年4月23日付けの[heroku security 通知](https://status.heroku.com/incidents/2413) によると、

> We take the protection of our customers very seriously, and as a result, we will not be reconnecting to GitHub until we are certain that we can do so safely,

和訳 (google)
> お客様の保護を非常に重要視しており、その結果、安全に再接続できることが確実になるまで、GitHubに再接続することはありません。

つまりgithubからherokuにしばらくの間deplyすることはできなくなりました(多分)。
さてどうしましょう。

# 自分はheroku CLI を使った。
[参考元](https://devcenter.heroku.com/articles/git)
git がインストールされていて、かつherokuのアカウントがある前提で話します。


ちなみに新しくAppを作る必要はないです。CLI側から作れるので。


## 1. [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#install-with-an-installer) をダウンロード

```bash
heroku --version
```
 でバージョンが表示されれば成功です。(特にいじる必要はないです。)

## 2. Herokuにログイン

```bash
heroku login
```

このあと、
`heroku: Press any key to open up the browser to login or q to exit`
と出るので `q` 以外のキーを押します。
するとブラウザが立ち上がり、herokuへのログイン画面が出ます。

ログイン認証をしてタブを閉じると、コンソール側で 
`Logged in as 'Your_Email_Address'`
が出ます。
これでログインは完了です。

## 3. ローカルに.gitを作成
最新コミットまで出来ている人は次の章に進んでください。

```bash
git init

git add .

git commit -m 'initial commit'
```

ここまでセットしてください。

githubにリモートリボジトリを用意してる方は remote add をしてもいいですが、今回のherokuのアップロードには関係しません。

## 4. Herokuにappを作る

app: Heroku上の自分用のアプリケーションフォルダみたいなものです。

```bash
heroku create -a 'app名'
```
エラーが出たら存在するapp名で被ったのかもしれません。別の名前で作成してください。

すでにappがある場合、
```bash
heroku git:remote -a 'app名'
```
とすれば追加できます。

作成に成功すると、 `heroku` がリモートに登録されています。

## 5. Herokuにpushする

ここはgithubにpushするのと同じです。

起動するのに必要なもの(Pythonだと`Procfile`, `requiremonts.txt`, `runtime.txt` の3つ)

```bash
git push -u heroku main
```

mainブランチ以外からpushする場合:
```bash
git push branch_name:main
```

この後、
`Initializing repository, done.`
`updating 'refs/heads/main'`
と出れば成功です。

## 6. 起動
![f7d77dbc396e0234dfaa75c921c90be2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581903/49f43f5c-875a-168d-99ba-86fe804dd073.png)

右側のトグルボタンを右に動かし、confirmを押せば起動します。

以上です。
amazonlinux2 に nodeとnpmをインスコ

普通にインストールするとエラーが出るので、
nvmをインスコしてからインスコする。


# nvm をインスコ

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
. ~/.nvm/nvm.sh

//最新版だとエラーになるので、ちょっと古めを指定
nvm use 17
nvm install 17

nvm install node
```

って感じでエラーが出なくなる

```

node -v
v17.9.0

npm -v
8.5.5


```


node17 だとエラーになるな。
```
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
```

ということで、
node 16 を使いましょう。
Arc<impl trait>をスレッドに渡す方法

# 結論
```diff_rust
trait Trait : Send + Sync + 'static{
    fn func(&self);
}
```

これでスレッドに渡せるようになる。
```rust
fn spawn_thread(arg:impl Trait){
    let arc = Arc::new(arg);
    thread::spawn(move || arc.func());
}
```
Send + Sync + 'static をサブトレイトとして追加するだけ。
Traitの実装側では特に何もしなくて良い。

# 解説
SendとSyncはスレッド間でのデータ共有が出来ることを示すマーカートレイトで、'staticはメンバに参照が無いことを担保するstaticライフタイム境界と呼ばれる物らしい。
これらのトレイトが無いとスレッドにデータを送ろうとしても、安全性が担保されていないから拒否されるということだと思う。

そもそもスレッド間共有前提のArcがこれらが実装されていない型を許容してしまう仕様になっているのが、Arcでラップさえすればスレッド間で共有できるという誤解を招く原因な気がする。
ちなみに自分はこの答えにたどり着くのに3時間くらいかかりました。調べても斜め下の解決法ばっかり出てくるんだもん...(Arc\<Trait>にimpl Traitしろとか)
結局ネットの情報は一切役に立たなかったのでエラーメッセージ読んで解決した。
ただ、エラーにはSend Syncを実装しろって書いてあるけど、それら実装してもまたエラー出てくるからこれじゃダメなのかと誤解したり、SendとSyncググったら自分で実装するべきではないとか書いてあってそれも誤解したりしたせいでめちゃくちゃハマってしまった。
namespeceの重複【::】

## 名前空間の重複
名前空間の重なりにより、``undefind method new``のエラーが出たのでその忘備録。

## エラー箇所
```routes.rb
Rails.application.routes.draw do
  namespace :api, format: 'json' do
    namespace :v1 do
      resources :articles, only: %i[index show]
      namespace :user do
        resources :articles, only: %i[index create update destroy]
      end
      post 'authentication', to: 'authentication#create'
      post 'registration', to: 'registration#create'
    end
  end
end
```
```api/v1/registration_controller.rb
# 一部抜粋
def create
 @user = User.new(user_params)　#⬅️ここでエラー発生
 if @user.save
  json_string = UserSerializer.new(@user).serialized_json
  set_access_token!(@user)
  render json: json_string
 else
  render400(nil, @user.errors.full_messages)
 end
end
```
恐らく``namespace``の``user``も加わり、railsがどこの``user``を呼び出しているのか分からなくなり、``new``メソッドが呼び出せなくなったと思われる。

そこでこの``User``に絶対位置を指定することによってこのエラーは解決された。

## ``User``に絶対位置を指定
```api/v1/registration_controller.rb
# 一部抜粋
def create
 @user = ::User.new(user_params)　#⬅️ここ
 if @user.save
  json_string = UserSerializer.new(@user).serialized_json
  set_access_token!(@user)
  render json: json_string
 else
  render400(nil, @user.errors.full_messages)
 end
end
```
絶対位置の指定は上記の通り、``::(ダブルコロン)``を先頭につけるだけで解決した。

``::``から始まる場合は一番上位の階層レベルを指すため、module内などで使う場合にモジュールの絶対的な位置を表現することができる。

[この記事](https://zenn.dev/noraworld/articles/what-is-double-colon-at-the-head-of-class)でわかりやすく解説している。

上記記事から抜粋
・``ClassA``は相対指定、``::ClassA``は絶対指定
・絶対指定は、トップレベルを指す
・``::ClassA``と``Object::ClassA``は同じ挙動になる

## 参考記事
[Rubyでクラス名のはじめに::(コロンを2つ)をつけるとそのクラスの絶対的な位置表現をすることができる)](https://shinkufencer.hateblo.jp/entry/2018/10/27/233000)
[Ruby: クラス名の先頭につける :: (先頭二重コロン) は何？](https://zenn.dev/noraworld/articles/what-is-double-colon-at-the-head-of-class)
Ruby on Rails 6.1.5 を Ruby 2.7.6 から Ruby 3.0.4 にあげるときにやること

掲題の作業を実施したところ、色々とハマったので、備忘録として残しておきます。

## 環境

* Ruby 2.7.6 -> 3.0.4
* Ruby on Rails 6.1.5


## Ruby 3.0.4 にあげるときに必要なこと

### (WEBrick 以外を使っていない場合) WEBrick をインストールする
#### 理由

Ruby 3.0.0 より WEBrick が標準ライブラリから削除されました。そのため、Ruby 3.0.0 以降で WEBrick を使いたい場合は、別途インストールが必要になります。

https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/

### bootsnap 1.9.3 以上にする

Ruby 3.0.4 で `rails s` を実行すると以下のエラーが発生します。
```
% bundle exec rails s
$RUBY_HOME/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:13:in `to_binary': wrong argument type false (expected Symbol) (TypeError)
```

#### 原因

https://www.ruby-lang.org/en/news/2021/11/24/ruby-3-0-3-released/

https://github.com/Shopify/bootsnap/pull/380

https://github.com/Shopify/bootsnap/issues/378

> Updating to 1.9.3 helped us with this issue. Thanks!

Issue に上記解決方法が書いてあるので、

```
% bundle update bootsnap
```

を実行し、bootsnap を 1.9.3 以上にすることでエラーは解消します。
C++でmicro:bit (v2.2) にbluetooth UART通信をペアリングなしでする

## 概要
micro:bitで動き、デバッグ用の出力をBluetoothで吐き出すソフトをC++で開発しようとしたところ、Bluetooth通信（特にペアリング不要の通信の場合）の疎通がなかなかできず結構ハマりました。
そこで、備忘録かねてやり方を書きます。
（microbit v2.2を使用していますが、たぶんv2でも同様にできるはずです）

## できたこと
* micro:bitからbluetoothを使ってメッセージを出力し、ペアリング操作をせずスマホで受信するようにする

## 環境
以下の環境を使用しました。
・Windows 11
・micro:bit v2.2
・スマホ（Xperia 10 III lite）

なお、今回はスマホからbluetooth接続・シリアルメッセージ送受信を行うので、以下のアプリをスマホにインストールしてください
[https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=en&gl=US](https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=en&gl=US)
※Android向けアプリです。iPhoneも同様のものがあると思いますが確認していません

## 開発環境構築
意外と書くことがあったので、別の記事として書きました
[Windows上にC++でのmicro:bit v2.2開発環境を作る](https://qiita.com/Ke_N_551/items/6fa463fb5aae347362f7)

## Bluetooth通信
### プログラム準備
[サンプルのリポジトリ](https://github.com/lancaster-university/microbit-v2-samples)でBLEのサンプルアプリが提供されているのでこれを利用します。
`[cloneしたリポジトリのルート]/source/main.cpp`を以下のように編集します。
```cpp
#include "MicroBit.h"
#include "Tests.h"       //追加

MicroBit uBit;

int 
main()
{
    uBit.init();

    ble_test();          //追加
    // 以下はコメントアウト
    //while(1)
    //    uBit.display.scroll("HELLO WORLD!");
}
```

### `codal.json`編集
* cloneしたリポジトリのルートにある`codal.json`を削除もしくはリネームします
* 同じ階層にある`codal.ble.json`をコピーし、`codal.json`にリネームします
* `codal.json`を以下のように編集します
```json
{
    "target": {
      "name": "codal-microbit-v2",
      "url": "https://github.com/lancaster-university/codal-microbit-v2",
      "branch": "master",
      "type": "git",
      "test_ignore": true,
      "dev": true
    },
    "config": {
      "SOFTDEVICE_PRESENT": 1,
      "DEVICE_BLE": 1,
      "MICROBIT_BLE_ENABLED": 1,
      "MICROBIT_BLE_PAIRING_MODE": 0,
      "MICROBIT_BLE_DFU_SERVICE": 1,
      "MICROBIT_BLE_WHITELIST": 0,
      "MICROBIT_BLE_DEVICE_INFORMATION_SERVICE": 1,
      "MICROBIT_BLE_EVENT_SERVICE": 1,
      "MICROBIT_BLE_PARTIAL_FLASHING": 0,
      "MICROBIT_BLE_SECURITY_LEVEL": "SECURITY_MODE_ENCRYPTION_OPEN_LINK"
    }
}
```
元の`codal.ble.json`からの変更点は以下の通りです。
* `MICROBIT_BLE_PAIRING_MODE`を1から0に変更します
* `MICROBIT_BLE_SECURITY_LEVEL`を`"SECURITY_MODE_ENCRYPTION_NO_MITM"`から`"SECURITY_MODE_ENCRYPTION_OPEN_LINK"`に変更します
* `"MICROBIT_BLE_WHITELIST": 0,`を追加します
おそらくキモは三番目で、これを設定しないと接続できない＋サンプルプログラムに説明が記載されていない状態のようです。

ここまでできたら、あとはビルドしてバイナリを書き込めば、micro:bit側の準備は完了です

### 携帯から接続
* micro:bitの電源を入れます
* スマホのbluetooth機能を有効にし、Serial Bluetooth Terminalアプリを立ち上げます
* 左上の`≡`メニュー > `Devices` > `Bluetooth LE` > `SCAN`（右上にあります）で表示される`BBC micro:bit`を押して接続します
* 正常に接続が行われたら、スマホ側には`Connected`のメッセージが、micro:bitには`C`の文字が表示されるはずです
* スマホからメッセージを送信すると、以下の画像のようにmicro:bitがエコーバックします。正しくエコーバックされていたら、正常にmicro:bitースマホ間のbluetooth シリアル通信ができている状態です。![Screenshot_20220423-180533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166634/c189f40f-8d22-878c-6986-a8fc7afb1fb5.png)
Windows上にC++でのmicro:bit v2.2開発環境を作る

## 概要
micro:bit v2で動くソフトをC++を使って開発できる環境をWindows上に構築した手順を、備忘録兼ねて書きます。  
※手元にあるのがmicro:bit v2.2なのでそちらで試していますが、micro:bit v2でも同様に動作すると思います（たぶん・・・）

bluetooth通信ができるまでを書きたかったのですが、環境構築の段階で案外書くことが多かったので記事を分けることにしました。
このC++開発環境でbluetooth通信できるようになるまでは以下の記事に書いたので、よかったらそちらもご覧ください。  
[C++でmicro:bit (v2.2) にbluetooth UART通信をペアリングなしでする](https://qiita.com/Ke_N_551/items/76a475728041dc1652a6)

## できたこと
* lancaster-university提供のライブラリを使い、micro:bit v2上で動くソフトをC++で開発できる環境を、Windows上に構築する

## 環境
以下の環境を使用しました。
・Windows 11
・micro:bit v2.2

## 開発環境構築
以下のリポジトリが提供するツール・ライブラリ・サンプルを利用することで、windows上にmicro:bit v2のC++ソフトを作成できるようになります。
[https://github.com/lancaster-university/microbit-v2-samples](https://github.com/lancaster-university/microbit-v2-samples)

手順は以下の通りです。
* `README.md`記載の必要なツール群をダウンロードし、インストーラでインストールします**（※補足１）**
  * [GNU Arm Embedded Toolchain](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)
  * [CMake](https://cmake.org/download/)
  * [Python](python.org/downloads/) **（※補足２）**
* `README.md`に記載ありませんが、ビルドツールとして`Ninja`が必要なのでインストールします。（以下では適当なディレクトリに配置+環境変数PATHの編集で呼び出せるようにしています）    
    1. NinjaのリポジトリのReleaseからWindows向けの実行ファイルが入ったzipファイル（`ninja-win.zip`）をダウンロードします  
 [https://github.com/ninja-build/ninja/releases](https://github.com/ninja-build/ninja/releases)
    1. zipを解凍して出てきた実行ファイル（`ninja.exe`）を、適当なディレクトリに配置します。
    1. `ninja.exe`を配置したディレクトリを環境変数PATHに追加します  
(参考：[https://atmarkit.itmedia.co.jp/ait/articles/1805/11/news035.html](https://atmarkit.itmedia.co.jp/ait/articles/1805/11/news035.html))
    1. コマンドプロンプトを起動し、`ninja`コマンドが通ることを確認します
```
>ninja --version
1.5.3
```
* リポジトリを`clone`します  
[https://github.com/lancaster-university/microbit-v2-samples](https://github.com/lancaster-university/microbit-v2-samples)
* クローンしたリポジトリのルートで、`python build.py`を実行します
* ビルドが完了するとバイナリファイル（`MICROBIT.hex`）が生成されるので、USB接続したmicro:bitにドラッグアンドドロップなどでコピーし、プログラムを書き込みます
* 書き込みが完了すると、micro:bitが自動で再起動します。「HELLO WORLD!」の表示がLEDに表示されれば成功です

#### ※補足1
開発環境についてはdockerイメージも提供されています（試してないのでここには特に何も書かないです）

#### ※補足2
[CODALのリポジトリ](https://github.com/lancaster-university/codal)にも記載があるとおり、Pythonを使わずビルドすることが可能です。（この場合、Pythonのインストール自体不要です）
* リポジトリを`clone`します  
[https://github.com/lancaster-university/microbit-v2-samples](https://github.com/lancaster-university/microbit-v2-samples)
* クローンしたリポジトリのルートで、ビルド用フォルダ（ここでは`build`とします）を作成し、そこに`cd`します
```
mkdir build && cd build
```
* 以下のコマンドを実行し、ビルドファイル生成およびビルド実行します
```
cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=RelWithDebInfo
ninja
```
これでバイナリファイルが生成されます

案外サクッとできるので記事にするほどでもなかったかもしれないですが、なんかの役に立てばうれしいです
子コンポーネントのuseStateの初期値にpropsを使う場合


```App.tsx
const App = () => {
  const [count, setCount] = useState<number>(0);

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>add</button>
      <div>{count}</div>
      <Child count={count} />
    </div>
  );
}

export default App;
```

```Child.tsx
const Child = (props: { count: number }) => {
  const [count, setCount] = useState<number>(props.count);
  return <div>{count}</div>;
}
```

これでは、親のカウントしか更新されない

react では再レンダリングが起きる条件が

<strong>
・stateが更新されたときは再レンダリング
・propsが更新されたときは再レンダリング
・親コンポーネントが再レンダリングされたときの子要素は再レンダリング
</strong>

なので、子コンポーネントにコンソールを仕込んでやると
きちんと再レンダリングされているのがわかる

なぜ、子コンポーネントの count が更新されないかというと

<strong>`useState()`の初期値は一度しかセットされないから</strong>

である

```Child.tsx
const Child = (props: { count: number }) => {
  const [count, setCount] = useState<number>(props.count);
  useEffect(() => {
    setCount(props.count);
  }, [props.count]);

  return <div>{count}</div>;
}
```

子コンポーネントの count を更新したいなら、
useEffect を使用するべきである
certbot nginx書き方 ssl 移転

# まずサーバー移転方法


/etc/letsencrypt/live/twikon.club/
のフォルダごと新しいサーバーに移転するだけでOK

移転先のサーバーに tmpフォルダを作成
(パーミッションエラー防止)
```
chmod 777 tmp
```


旧サーバー で以下のコマンド

```
scp -i id_rsa -pr /etc/letsencrypt/live/twikon.club/ hideki@xx.xxxx.xxx.x.:/home/hideki/tmp
```

新サーバー でフォルダを移動

```
mv tmp/twikon.club /etc/letsencrypt/live/
```

これで nginx を同様のパスにするだけで設定完了

```
server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/twikon.club/fullchain.pem; # 大事
    ssl_certificate_key /etc/letsencrypt/live/twikon.club/privkey.pem; # 大事

    server_name twikon.club;
}

```


# 移動させたらcronで更新するため再度certonlyする。

```
certbot certonly --webroot -w /var/www/html -d twikon.club
```



# ssl制限にひっかかってもサブドメインと一緒に指定すれば取得できる。

https://qiita.com/nanasess/items/c8decbe3eaa27557f099


nginxを設定するとうまく動かなくなる。

```
sudo certbot renew --dry-run
```

その場合は

・well-known の場合は port 80
・それ以外は ssl に飛ばす

という設定にする


# nginx 書き方

```
server {
    listen 80;
    server_name yomiplus.com;

//これが味噌
    location ^~ /.well-known/acme-challenge/ {
        default_type    "text/plain";
        root            /var/www/html;
    }

//これも味噌
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name yomiplus.com;

..以下略

}

```
mac Book Pro WinSCP文字化けに対応

mac Book Pro MacOS Monterey に WineskinでWinSCP 5.17.7 をインストールしたが「新しいセッション」画面の日本語が文字化けするので対応した
WindowsフォントをmacアプリのフォントにコピーすればOK

【Windows】
c:¥Windows¥Fonts¥
  msgothic.ttc
  msmincho.tts

【mac】
・SAKURAの場合のコピー先
Applications/Wineskin/SAKURA.app/Contents/Resources/drive_c/windows/Fonts
・WinSCPの場合のコピー先
Applications/Wineskin/WinSCPWrapper64.pp/Contents/Resources/drive_c/windows/Fonts
Githubに置いているSSH公開鍵を取得する

Githubに置いている公開鍵を簡単に取ってこられることを友人から教えてもらったのでメモ
# 結論
Githubに置いている公開鍵は https://github.com/settings/keys から確認できる。
この公開鍵の一覧は`https://github.com/ユーザ名.keys`で取得することができる。

これを使えば公開鍵をSSHサーバの`authorized_keys`ファイルに書き込む際に、
```sh
$ (echo; curl https://github.com/ユーザ名.keys) >> ~/.ssh/authorized_keys
```
のようにすればscpで公開鍵を送信したりする手間が省ける。
阿部寛のホームページは私達の一足先を行っていた(暴論)

<p>こんにちは。<a href="https://qiita.com/handcreamde" target="_blank">handcreamde</a>と申します。</p>

<h1>最初に</h1>
<img src="https://image.itmedia.co.jp/nl/articles/1903/31/kontake1607966_180331abehiroshi01.jpg" alt="阿部寛のホームページ」トップの写真が変更 歴史が動くも爆速表示は変わらずネット民歓喜 - ねとらぼ"/><br>
<p>みなさん、阿部寛のホームページをご存知でしょうか。(引用: itmedia)</p>
<p>このけっこう時代を感じるホームページ。</p>
<p>だか、このスタイル、様々なところで使用されているのをご存知だろうか？</p>

<h1>具体例</h1>
<h3>Windowsのファイル管理ソフトウェア</h3>
<img src="https://www.pc-koubou.jp/magazine/wp-content/uploads/2020/04/windows10_find_file_main.jpg">
<p>これはWindowsのファイル管理ソフトウェア。(引用: パソコン工房)</p>
<p>このスタイル、阿部寛のホームページと酷似しているじゃないか！！</p>
<p>なんと。Microsoftにも阿部寛のホームページのスタイルが採用されていた。</p>
<br>
<h3>MacのFinder</h3>
<img src="https://support.apple.com/library/content/dam/edam/applecare/images/ja_JP/macos/Big-Sur/macos-big-sur-finder-search-files.jpg">
<p>これはMacのデフォルトのファイル管理ソフトウェア、「Finder」だ。(引用: Apple Support)</p>
<p>あれ、これも阿部寛スタイル...!?(?)</p>
<p>そう、Appleも阿部寛スタイルを採用していた。</p>
<h1>結論</h1>
<p>他にもざっくざく阿部寛スタイルのホームページは出てくる。</p>
<h3>結論: 阿部寛のホームページは最先端！</h3>
<br>
<br>
<p>頭おかしい記事を見ていただきありがとうございまし！！た。</p>
<h3><a href="http://abehiroshi.la.coocan.jp/" target="_blank">Special Thanks 阿部寛のホームページ</a><br>
<a href="https://hedge.guide/feature/ukraine-donation-support-embassy-account-support-group.html" target="_blank">ウクライナの募金先</a></h3>
Ruby 配列の中にあるハッシュをeachで回す方法

## 実現させたこと
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248903/bf5eb9a1-d8fd-7661-7bad-b195478d4bd1.png)
上の写真の左側は画像、右側はaタグでそのアカウントに飛ぶようになっている。
ここまでやったこと順番に解説する。

## 実装手順
### データ取得
```
apps/controllers/application_controller.rb

    insta_accounts = LvtInstaAccount.all
    @insta_info = []
    insta_accounts.each do |insta_account|
      data = {}
      data["screen_name"] = insta_account.screen_name
      data["profile_picture_url"] = insta_account.profile_picture_url
      @insta_info << data
    end
```
解説: 
LvtInstaAccount.allで全てのレコードを取得している。空の配列を作成し、全てのレコードが入っている、insta_accountsをeachで回す。
```
data["screen_name"] = insta_account.screen_name
```
この処理が終わった後、dataの中身を確認してみると、以下のようになっている。
```
{"screen_name"=>"miluher_miroir"}
```
次に、画像のURLを取得する。
```
 data["profile_picture_url"] = insta_account.profile_picture_url
```
この処理が終わった後、dataの中身を確認してみると、以下のようになっている。
```
 {"screen_name"=>"miluher_miroir",
 "profile_picture_url"=>
  "https://scontent.fkix2-2.fna.fbcdn.net/v/t51.2885-15/243664630_277797164017044_2103917131738579717_n.jpg?_nc_cat=101&ccb=1-5&_nc_sid=86c713&_nc_ohc=mduLz9nzVtsAX_aE8Q4&_nc_ht=scontent.fkix2-2.fna&edm=AGaHXAAEAAAA&oh=00_AT_6-d-yz2wHTafyWWP0SxGRy1IHHGRdadasdklmkARsaAgFaw&oe=626548AB"}
```
最後に配列を追加している。
```
@insta_info << data
```
```
 [{"screen_name"=>"miluher_miroir",
  "profile_picture_url"=>
   "https://scontent.fkix2-2.fna.fbcdn.net/v/t51.2885-15/243664630_277797164017044_2103917131738579717_n.jpg?_nc_cat=101&ccb=1-5&_nc_sid=86c713&_nc_ohc=mduLz9nzVtsAX_aE8Q4&_nc_ht=scontent.fkix2-2.fna&edm=AGaHXAAEAAAA&oh=00_AT_6-d-yz2wHTafyWWP0SxGRy1IHHGRctd8bdaddaRsaAgFaw&oe=626548AB"},
 {"screen_name"=>"miluher_miroir",
  "profile_picture_url"=>
   "https://scontent.fkix2-2.fna.fbcdn.net/v/t51.2885-15/243664630_277797164017044_2103917131738579717_n.jpg?_nc_cat=101&ccb=1-5&_nc_sid=86c713&_nc_ohc=mduLz9nzVtsAX_aE8Q4&_nc_ht=scontent.fkix2-2.fna&edm=AGaHXAAEAAAA&oh=00_AT_6-d-yz2wHTafyWWP0SxGRy1IHHGRctdadassaAgFaw&oe=626548AB"}]
```
### view表示
```
app/views/layouts/application.html.erb

<ul class="change_account_area_list is-open">
  <% @insta_info.each do |info|%>
     <li class="change_account_area_item <%= 'bg-change' if current_page?("/#{info["screen_name"]}/home")%>">
       <%= image_tag "#{info["profile_picture_url"]}", class: "change_account_area_image" %>
       <%= link_to "@#{info["screen_name"]}", "/#{info["screen_name"]}/home", { class: "change_account_area_link" } %>
     </li>
  <% end %>
</ul>
```
解説: 
@insta_infoの中身。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248903/4d3cef6b-aca1-aaba-27f0-bd110e175d83.png)
eachで一個ずつ取り出している、infoの中身を確認してみる。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248903/e95edc6b-0ded-8a62-24dc-47b0e527d7dd.png)
infoの中でscreen_nameの値を取り出してみる。
![aaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248903/9422dc0f-57b1-6037-3424-a0edfef7cb5b.png)
Get the index of the list as the argument

* test.py
```python3
import sys

class Test:
    l = [[1,3],[2,4]]

a = [1,3]
print(",".join(map(str,a)))

for k,v in enumerate(Test.l):
    jmv = ",".join(map(str,v))
    if jmv == sys.argv[1]:
        print("hit, argv,k",sys.argv[1],k)

```

* execution
```sh
# python3 test.py 1,3
1,3
hit, argv,k 1,3 0
# python3 test.py 3,9
1,3
# python3 test.py 2,4
1,3
hit, argv,k 2,4 1
```
【Spring】ローカル環境からAWSを使うときのgradleの設定

# 概要
Eclipse（ローカル環境）で開発しているSpringアプリケーションから、APIを用いてAWSのサービスに接続しようとした際に出てきたエラーへの対処法についてまとめます。

# エラー内容
下記記事を参考にapplication.propertiesを記述してみたところ・・・
- [spring-cloud-starter-awsがローカル環境でエラーになる場合の最低限の対応](https://www.bunkei-programmer.net/entry/2019/01/26/232605)
- [Spring Bootでローカル環境からAWSを利用する際の設定](https://reasonable-code.com/spring-boot-aws-local/)

```:application.properties
# アクセスキー ID
cloud.aws.credentials.accessKey=${AWS_ACCESS_KEY_ID}
# シークレットアクセスキー
cloud.aws.credentials.secretKey=${AWS_SECRET_ACCESS_KEY}
# CloudFormationのスタック名を自動取得しない
cloud.aws.stack.auto=false
# リージョン名を自動取得しない
cloud.aws.region.auto=false
# リージョン名（例. ap-northeast-1）
cloud.aws.region.static=${AWS_REGION}
```

`cloud.aws`から始まる記述が`unknown property`であると警告が出ました。
![6_unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1643541/c2821670-58e3-7986-e809-12e926110a8b.png)

開発環境は以下の通りで
- Windows 10
- Eclipse 2019
- Java 11
- Spring Boot 2.6.4

`build.gradle`を以下のように記述していました。

```:build.gradle
dependencies {
    ...
    implementation 'org.springframework.cloud:spring-cloud-starter-aws'
    ...
}
```

# 解決策
どうやら[Spring Cloud AWS](https://spring.io/projects/spring-cloud-aws)の[最新版リリース](https://spring.io/blog/2021/03/17/spring-cloud-aws-2-3-is-now-available)に伴ってGradleの記述も変わっているようでした。ということで[こちら](https://github.com/stratospheric-dev/stratospheric/blob/main/getting-started-with-spring-boot-on-aws/build.gradle)を参考に`build.gradle`の記述を下記のように見直しました。

```:build.gradle
//追記
ext {
    set('awsSpringVersion', '2.3.3')
}

//'org.springframework.cloud'から'io.awspring.cloud'へ変更
dependencies {
    ...
    implementation 'io.awspring.cloud:spring-cloud-starter-aws'
    ...
}

//追記
dependencyManagement {
    imports {
        mavenBom "io.awspring.cloud:spring-cloud-aws-dependencies:${awsSpringVersion}"
    }
}
```

無事に警告が消えました！

# まとめ
全体的にMavenでのエラー対処方法のほうが多く見つかるので、Gradleの情報ももっと増えてほしいなと感じました。また、`org.springframework.cloud:spring-cloud-starter-aws`で検索ヒットする記事も多いので注意が必要です。やはり最新情報は英語での公式ドキュメントを確認したようがよいと実感しました。今回は以上です！
Mapboxを使って超絶簡単にオープンワールドゲームを作る方法

# UnityとMapboxの連携
前回書いた記事を参照下さい

https://qiita.com/soh_mitian/items/57f5cd12499529b41887

# ワールドを作る
ヒエラルキーで空のオブジェクトを作成します。
作成したオブジェクトにコンポーネントととしてAbstract Mapを追加します。

以上でワールドの作成は完了です。
Enable Previewを押して確認してみましょう。
![スクリーンショット 2022-04-23 16.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/b873ea36-8a9d-a97c-9106-5c2b15889217.png)

　## Mapの設定
Locationから地図の位置座標を決められます。
Searchからはテキストで検索できます（Tokyoとか）

FEATURESでBuildingをAdd Featureすると地図上にビルの３Dモデルが表示されます。

# プレイヤーを作る
次にプレイヤーオブジェクトを作っていきます。

ヒエラルキーで3Dオブジェクト＞キューブを作成します。
とりあえずY位置を１にしておきましょう。

作成したキューブにカメラを追加します。
カメラの位置はXYZ全部０で良いと思います。

すると一人称視点で地図の世界に入り込めます。
![スクリーンショット 2022-04-23 16.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/07cad93b-6598-9ab3-431e-dc27b575d8be.png)

## プレイヤーを操作する
Assetsフォルダ（なかったら作る）にC#スクリプトを作成して、プレイヤーを操作するスクリプトを書いていきます。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 3.0f;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey("up")) {
            transform.position += transform.forward * speed * Time.deltaTime;
        }
        if (Input.GetKey("down")) {
            transform.position -= transform.forward * speed * Time.deltaTime;
        }
        if (Input.GetKey("right")) {
            transform.Rotate(0f, speed * Time.deltaTime * 10f, 0f);
        }
        if (Input.GetKey("left")) {
            transform.Rotate(0f, -speed * Time.deltaTime * 10f, 0f);
        }
        if (Input.GetKey(KeyCode.X)) {
            transform.Rotate(speed * Time.deltaTime * 50f, 0f, 0f);
        }
        if (Input.GetKey(KeyCode.Z)) {
            transform.Rotate(0f, 0f, speed * Time.deltaTime * 50f);
        }
    }
}
```

スクリプトを作成したら、プレイヤーオブジェクトにアタッチ（ドラッグ＆ドロップ）します。


実行して十字キーで操作しましょう。
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/2b248d83-9533-c233-06cb-379b6996bfc8.gif)

## ワールドの表示をプレイヤーを基準にする
最初にワールドをすべて描画すると重すぎるので、ある程度範囲を限定して表示します。
プレイヤーが移動したら、都度続きのワールドが表示されるようにして、オープンワールドとしています。

MapのGENERALにあるExtent OptionをRange Around Transformにします。
Target Transformをプレイヤーオブジェクトに設定すれば完了です。

![スクリーンショット 2022-04-23 17.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/47dbc931-62ca-06a9-245d-6bd67909848f.png)

これでオープンワールドの完成です。
MySQL外部キーの設定と設定するとできること

Userテーブルのidを参照してPostテーブルのuser_idを外部キーに設定する場合
```
CREATE TABLE IF NOT EXISTS `db`.`User` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`deleted_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`))
```

```
CREATE TABLE IF NOT EXISTS `db`.`Post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`deleted_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
,FOREIGN KEY fk_user_id(user_id) REFERENCES User(id)) //この一文
```
↑の最後の行が当該文。
`FOREIGN KEY 外部キー名(参照元カラム名) REFERENCES 参照先テーブル名(参照先カラム名)`

## 外部キー設定するとできること
https://www.dbonline.jp/mysql/table/index11.html#section3
値の整合性を担保するために、親テーブルの参照元のカラムの値を更新、削除するとエラーが発生する。
エラーの振る舞いも設定することができる
```
RESTRICT
親テーブルに対して削除または更新を行うとエラーとなります。設定を省略した場合は RESTRICT を設定したのと同じです。

CASCADE
親テーブルに対して削除または更新を行うと、子テーブルで同じ値を持つカラムのデータに対して削除または更新を行います。

SET NULL
親テーブルに対して削除または更新を行うと、子テーブルの同じ値を持つカラムの値が NULL になります。

NO ACTION
親テーブルに対して削除または更新を行うとエラーとなります。 RESTRICT を設定した場合と同じです。

SET DEFAULT
現在この設定を行うとテーブルの作成が行えません。
```
puppeteerでshadowRoot内の要素を取得する

# 背景
[Wordle](https://www.nytimes.com/games/wordle/index.html)のスクレイピングしようとしたが、ゲーム説明モーダルの閉じるボタンをpuppeteerでクリックする際にちょっとつまづいたので備忘録を残しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519419/da045bd3-f792-cebf-3d97-7217a41f206e.png)

# 結論
puppeteerの`page.evaluate`を使用しshadowRoot以下を取得するようなJSを実行する。

```ts
  await wordlePage.evaluate(() => {
    const closeModalIcon = document.querySelector("body > game-app")?.shadowRoot?.querySelector("#game > game-modal")?.shadowRoot?.querySelector<HTMLElement>("div > div > div")
    closeModalIcon?.click()
  })
```

# おわり
ひねりもなく素直にやっただけだが、shadowRootを取得するようなpuppeteerのメソッドを探して変に時間がかかってしまった...
`page.evaluate`で素直にJSを実行できるので困ったらこれを使えば大体解決しそう。

# おまけ
ブラウザの開発者ツール(下の画像はOpera)からある要素に対するセレクタとかJSパスをコピーすることができるのでスクレイピングする際にかなり重宝する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519419/f89a39d9-4bdb-ae09-d02e-b68f6d787dfb.png)

# 参考
https://zenn.dev/atom/articles/750f9660f6a70a
https://github.com/puppeteer/puppeteer/issues/858#issuecomment-359750382
https://developer.mozilla.org/ja/docs/Web/API/Element/shadowRoot
インフラエンジニアがRubyでAPI作ってみた

## 自己紹介
はじめまして。
普段はインフラエンジニアとして業務に当たっております。
未経験からエンジニア転職をした身なので、業務の中でこんなにもコードを書かないものかと、転職前とのギャップに驚いています。
あまりにコードを書かなくて成長を実感しなくなったため、業務外でAPIを作って遊んでみることにしました。
どうぞお付き合いください。

## 今回作るAPI
バンド名とバンドID,曲の名前を返す簡単なものを作成したいと思います。
ただし最初はローカルにサーバーを立てて実行しますが、次回にはDB側をコンテナに、最終的にはAPIもDBもコンテナで動かすという風に、徐々に難しくしていけたらと思います。

## 手順（１）
①railsプロジェクトを立ち上げる
↓
②modelを作る
↓
③仮のデータを流し込む
↓
④ルーティングを設定する
↓
⑤コントローラを記述する
↓
⑥実際に叩いてみる

シンプルですがこの手順でいこうと思います。
のちに難しくしていきます。
あくまで作って動かしてみることを目的としていますので。

### railsプロジェクトの立ち上げ

ターミナルから以下を実行します。
```
$ rails new band-api --api
```

![スクリーンショット 2022-04-23 0.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/4c6bd589-632a-cf38-3873-aa2acb5dbb60.png)

この画面がでたら成功しています。
やっぱり安心感ありますねー。

②modelを作る。
```
$ rails g model Band name:string title:string
```
今回はバンド名と曲名を返すだけのシンプルなものを作成します。


```
$ rails db:migrate
```
DBにテーブル/カラムを作成します。

③仮のデータを流し込む
```seeds.db
band = [
["sigure", "unravel"] ,
["UNISON", "sugarsong"],
["jihen", "invisible"]
]

bands.each do |name, title|
 Band.create(name: name, title: title)
end
```

好きな邦楽バンドと有名曲のタイトルを登録しています。
色々とツッコミどころがありますが、ここはテキトーなのでご容赦ください。

⑤ルーティングを設定する
```routes.rb
Rails.application.routes.draw do
  resources :bands, only: :index
end
```
一覧を表示する以外に特にルーティングは設けません。
シンプルイズベスト！

⑥コントローラーを記述する

```
$ rails g controller Bands
```

```bands_controller.rb
class BandsController < ApplicationController
  def index 
    bands = Band.all 
    render status: 200, json: { bands: bands}
  end
end
```

Bandというコントローラーを作成します。
最後にlocalhost:3000/bandsにアクセスします。

![スクリーンショット 2022-04-23 1.19.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/e274173e-a5ce-cfeb-78ef-aae0be3ab6b3.png)

画像のような表示がされたら大成功しています。
健康診断で学ぶ業務カイゼン

## はじめに

先日健康診断を受けた時に、そんなとこで業務カイゼンできるんだなと驚きまして。
まだまだ常識にとらわれてしまっているなと反省しましたので記事を書きます。


## 視力検査

- before
「上から順に、穴のあいている方を教えてください」

- after
「どこらへんまで見えますか？」

**そこそこの視力がある人にとっては当然見えるに決まっているものを上から順に読み上げる謎の儀式** に何の疑問も抱いていなかったのですが、言われてみてなるほどと驚きました。

### 気づき
適切な質問、コミュニケーションによってコストを下げられるのだなと思いました。
日頃反復している中にも無駄がないか今一度振り返りたいと思います。


## 採血

- before
「いつもどっちから取ります？」
「ぐーぱぐーぱーしてください」

- after
「好きな方の手を出してください」

採血の注射器の針とスピッツ(試験管)が分かれているタイプになってからは、そんなに痛くないのでは？と薄々思っていたのですが、いよいよ聞かれなくなりました。

刺した時に **なんか血が出てましたが** 顧客満足度としてはあんまり変わらなかったって感じです。

### 気づき
顧客に提供する価値ってなんだろうなと考えさせられました。
健康診断の時は完全に油断していて早く終る事に価値を見出していませんでしたが、検査用に血を抜くことが目的なら、短時間で終わることに価値があるのではと思いました。

熟練の看護師さんの技能がなくても業務が行える程度に技術が進歩しているのだとしたら、業務も変えられるんだろうなぁと思いました。

脳死で業務のツールを使ってしまっていますが、新しいツールをウォッチしてやり方を変えていこうと思いました。


## まとめ

今回の気付きは２点でした。

- 質問とコミュニケーション
- ツールとワークフロー

世間ではDXっていうワードに丸められちゃってますが、現場のカイゼンは小さな積み重ねで実現すると思います。
様々な事象をきちんと観察してカイゼンしていければと思います。
LambdaをDockerコンテナイメージで動かす場合、rootユーザで実行されないらしい

ここにも記載されているが、`sbx_user1051`というユーザで実行しているらしい。
https://dev.classmethod.jp/articles/check-os-layer-because-change-amazon-linux-2/
（しかも`$HOME`などは設定されていない）

そのため、自前のDocker環境でroot権限を使用してコマンドが成功しても、Lambdaで起動時にエラーになる場合がある。
私が現在seleniumでchrome動かそうとしてこの問題にぶち当たっている。
VIX 指数が 30 以上の場合に、LINE に通知を送る。

## 今までの流れ
この記事で、
VIX 指数を LINE Notify で通知するというのをやりました。

https://qiita.com/karaage_0921/items/ed18a9c543a83e0b8eed

将来的には、決まった時間にプログラムを実行させたいです。
とはいえ、毎日送ってこられても鬱陶しいので、
VIX 指数が x 以上だったら通知するというようにしたいです。
今回はそのプログラムを実装してみます。

## やりたいこと
取得したVIX 指数が 30 以上の場合、通知する。
なんでこの値なのかについては正直適当ですw
ご自由にいじってもらえればと思います。

## コード
```
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options 
import time

option = Options()                          
option.add_argument('--headless')           
driver = webdriver.Chrome(ChromeDriverManager().install(),options=option)

URL = r"https://www.bloomberg.co.jp/quote/VIX:IND"
driver.get(URL)

vix_value = driver.find_element_by_xpath(r"/html/body/div[5]/main/div/div/div[1]/div/div[3]/div[2]")
vix_value = float(vix_value.text)

import requests

url = "https://notify-api.line.me/api/notify"
access_token = 'トークン'
headers = {'Authorization': 'Bearer ' + access_token}

# condition は、基準になる値です。
condition = 30
if vix_value > condition :  
    payload = {'message': vix_value }
    r = requests.post(url, headers=headers, params=payload,)
else : 
    print("the value does not meet the condition.")

driver.quit()
```
マイコン（ATMega328P）もやっぱ壊れるんだな・・・

![IMG20220423164801.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/6ad15dcf-1c6c-1ddd-d1e4-cac876a300d3.jpeg)
色んなプログラムパターンを検証していたら
突然ATMega328Pに書き込みができなくなった。。。
（書込方法は、https://qiita.com/Kurogara/items/e19ccd6a307d43e221c7
を参照）

書込の際に出たエラーメッセージは
```
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.
```
どうも配線間違いをしている時に出るみたいなのだが
何回確認しても配線は間違っていない。

試しに同じ配線で別のATMega328Pを接続したところ正常に書込ができた！

どうもマイコンが故障した時もこのメッセージが出るみたいなので、
皆さんも配線が間違っていないのにこのメッセージが出る場合は、
マイコンが壊れれいる可能性がありますので注意です！！
MacMiniへWindows10をインストールする方法

# 方法
## Windows10のBootableUSBを用意
Ubuntu20.04の場合の方法

https://qiita.com/tnch023/items/fd694e631e19d0a44435

## インストール
USBをMacMiniに挿して、optionキーを押しながら起動する。
いくつかドライブの候補が出てくるはずなので、そこからUSBを選んで進み、インストールする。

## インストール後
最初の段階ではWi-Fi等繋がらないため、MacOSを起動し、Windows用のドライバ設定プログラムをusbに入れる。

https://support.apple.com/ja-jp/HT204923

Windows10で実行すればドライバのインストールも完了する。