OmniAICreator/Qiita-1.07M huggingface dataset:
８年物のMacBook Proから移行アシスタンスでデータ移行したら、画面上のアップルメニューやDockが出せなくなった話

個人で使用しているMacBookのキーボードが壊れかけてきたということで新しいMacBookProを買い替えたときにうまく移行できなかったのでその対応をまとめました。

※あくまで個別の端末の問題なので全ての端末で起きるわけではないと思うので、こんなことがあるんだ程度に読んでいただければと思います。何か問題があればAppleのサポートに頼ることをお勧めします。

# 移行元端末および移行先端末のスペック
　今回移行した端末のCPUなどを記載しておきます。

・移行元
2016年発売 Intelチップ　MacBook Pro　
画面サイズ　15インチ
メモリ 16G

・移行先
2023年発売 M3Proチップ　MacBook Pro
画面サイズ 14インチ
メモリ 18G

# 移行に使用したツール
　Mac標準の移行アシスタント

# 発生した問題
　標準ツールで移行した結果アカウントの移行までは問題なく完了しましたが、パスワードでログインしても正常に表示されませんでした。細かな部分は不明ですが、背景の画像が画面の一番上層に表示されて全てを覆ってしまっているような表示になっていたのではないかと思われる症状でした。
その結果、以下のような問題が発生しました。

1.下のようなMacの上部に表示されるメニューが出てこない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869077/9153c793-8ca5-8861-d549-9784b0f17a49.png)

2.画面下部に出てくるDockが表示されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869077/1b9201f0-df35-c7c0-44ec-7a4ba92d4989.png)


3.外部モニターを繋ぐとメニューが見えたが、画面をミラーリングなどをするとメニューが消えて出せなくなる

4.画面上でクリックなどを行っても下記のようなメニューも表示されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869077/f4f74cfb-0a9f-e506-d93d-37852fa2eb9b.png)

# 対応方法
　移行アシスタントで移行する際に設定関連は移行対象から外して移行の再実行を実施した。
おそらく端末の互換性や画面サイズの違いで背景がおかしくなっていたと考えられる。

# 実際の流れ
1.初期起動
2.移行アシスタントでデータや設定全てを選択した状態でデータ移行を実行
3.ログインできることを確認したが、ログインしても画面上で何も操作できない状態(発生した問題の内容)が発生
　セーフモードでの起動を試したが解消せず
4.Appleサポートに連絡
　以下の5以降の手順の案内があった
5.macOS を再インストールする
　OSのバージョンを最新にするもので移行したデータは残るらしい
　ただしこちらでは解消しなかったので6以降の手順を実行

　実際のサポートページ
　https://support.apple.com/ja-jp/102655

6.ディスクユーティリティを使って Apple シリコン搭載の Mac を消去する

　実際のサポートページ
　https://support.apple.com/ja-jp/102506

7.もう一度5の手順でOSの再インストールを実施

8.1の初期起動と同じ操作を実行

9.２の移行アシスタントの段階で移行するデータをアプリケーションや実際にあるファイルのみとし設定を対象外として実行

10.正常に移行されメニューも表示される

 # まとめ
 　今回個人のMacBookの買い替えが初ということでデータ移行も初でした。標準の移行ツールでも問題が起きることはあるんだと実感しました。ただ、そこからの復旧手順も用意されており、サポートの人の案内も丁寧だったのでなんとか移行作業が完了しました。
 　中には新しいMaBookが出た時点で買い替えをされている方もいると思いますが、Macbook自体のOSのアップデートが長期間だったりすることで、かなり長い期間使っている人もいるかと思います。そうなると端末のOSのバージョン差が大きいことで移行に失敗するかもしまれせん。また今回背景に画像をランダムに切り替える設定をしていた大きな画面の端末から少し小さい端末に移行したことももしかしたら要因かもしれません。
 　根本的な原因は不明ですが、移行アシスタントでのデータ移行は本当に内部のデータだけに限定した方が無難かもしれません。(データ量にもよりますが、今回の一連の手順を行った時間としては、8時間程度かかりました)
 

 # 余談
 　問題が起きた時Appleのサポートに電話したのですが、自動応答の選択が番号のプッシュではなく「はい」「いいえ」という言葉だったことに驚きました。確かにいろんな選択肢を言われて選択肢が番号だと、聞き直すのも時間がかかるので直感的な「はい」「いいえ」の選択肢が提示されるのは良いなと思いました。(音声がしっかり判別されているのも新鮮でした)
[ruby初心者向け]　rubyの単体テストってどうすればいいの？　test-unit編

# 単体テストはどうすればいいの？
プログラミングを始めたてだと、書いたコードのテストが苦手だと感じる人が多いと思います。
1つ1つ確認するのは面倒くさいし、そもそもどうすればいいのか分からない人もいるはず...
そこでrubyの単体テストのやり方をまとめました！
# 結論
簡単に手早くするならtest-unitを使おう！！
# test-unitとは？
Rubyインストール時に一緒にインストールされる単体テスト用フレームワークです。
単体テスト用フレームワークを使うことでテストを自動化し、無駄な労力を減らすことができます。

# 単体テスト例
## test-unitで簡単なテスト
### テストコード
```ruby is_odd_test.rb
require 'test/unit'

#テストしたいメソッド
def is_odd?(n) 
    n % 2 == 1
end

#テスト用のクラス
class OddTest < Test::Unit::TestCase
  #テストメソッド
  def test_is_odd
    #検証メソッド
    # assert_equal b, a => aとbが等しければパスする 
    assert_equal true, is_odd(1)
    assert_equal false, is_odd(2)
    # assert a => aが真であればパスする 
    assert is_odd(3)
    # refute a => aが偽であればパスする 
    refute is_odd(4)
  end
end
```
### テスト実行
ターミナルで実行
```console
ruby is_odd_test.rb
```
実行結果
```console
Loaded suite is_odd_test
Started
.
Finished in 0.000１50 seconds.
------------------------------------------------------------------------------------------------------
1 tests, 4 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
------------------------------------------------------------------------------------------------------
6102.72 tests/s, 30500.61 assertions/s
```
### 解説
- ３行目：　実行したテストメソッドの数だけピリオドが表示される
- ４行目：　テスト終了までにかかった時間
- ６行目：　テスト結果
  - tests：　実行したテストメソッドの件数
  - assertions：　実行した検証メソッドの件数
  - failures：　検証に失敗したテストメソッドの件数
  - errors：　検証中にエラーが発生したテストメソッドの件数
- ７行目：　検証に成功してパスされた割合
## test-unitでデータ駆動テストをやってみよう！
```ruby upcase_test.rb
require 'test/unit'

class OddTest < Test::Unit::TestCase
  def test_upcase_1
    assert_equal 'BLUE', 'blue'.upcase
  end
  
  def test_upcase_2
    assert_equal 'GREEN', 'green'.upcase
  end

  def test_upcase_3
    assert_equal 'RED', 'red'.upcase
  end

  def test_upcase_4
    assert_equal 'YELLOW', 'yellow'.upcase
  end
end
```
上記のようなテストする場合、
```ruby upcase_test.rb
require 'test/unit'

class OddTest < Test::Unit::TestCase
  data \
    :blue => ['BLUE', 'blue'],
    :green => ['GREEN', 'green'],
    :red => ['RED', 'red'],
    :yellow => ['YELLOW', 'yellow']

  def test_upcase(data)
    expected, target = data
    assert_equal expected, target.upcase
  end
end
```
という感じでシンプルにまとめることができる！

記述するコード量も減って単体テストが楽になること間違いなし！！

# まとめ
いかがでしょうか？
これで、test-unitを使った単体テストを楽々こなせるはずです。
忘れたとしてもこの記事を見れば大丈夫！
少しでもあなたの役に立てたのなら幸いです。
良いプログラミング生活を！！！

# 参考文献
[プロを目指す人のためのRuby入門［改訂2版］](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80%EF%BC%BB%E6%94%B9%E8%A8%822%E7%89%88%EF%BC%BD-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus-%E4%BC%8A%E8%97%A4-ebook/dp/B09MPX7SMY?ref_=ast_author_mpb)
[test-unit Ruby用単体テストフレームワーク](https://test-unit.github.io/ja/index.html)
[Qiita test-unit vs. minitest](https://qiita.com/scivola/questions/dfc339b3639336649355)
Javaで「for文を使った繰り返し処理」の動作を確認してみた

# 概要

Javaで「for文を使った繰り返し処理」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/for/index2.html

# 実装

以下のファイルを作成しました。
```JSample2_1.java
class JSample2_1{
  public static void main(String[] args){
    int sum = 0;

    for (int i = 1; i <= 5; i++){
      System.out.println(i);
      sum += i;
    }

    System.out.println("合計=" + sum);
  }
}
```

```JSample2_2.java
class JSample2_2{
  public static void main(String[] args){
    int i;
    double d;

    for (i = 1, d = 2.4; i <= 5; i++, d += 0.1){
      System.out.println("i = " + i + ", d = " + d);
    }
  }
}
```

```JSample2_3.java
class JSample2_3{
  public static void main(String[] args){
    for (int i = 1; i < 3; i++){
      for (int j = 1; j < 3; j++){
        for (int k = 1; k < 3; k++){
          System.out.println("i = " + i + ", j = " + j + ", k = " + k);
        }
      }
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample2_1.java 
$ java JSample2_1 
1
2
3
4
5
合計=15
```

```
$ javac JSample2_2.java 
$ java JSample2_2 
i = 1, d = 2.4
i = 2, d = 2.5
i = 3, d = 2.6
i = 4, d = 2.7
i = 5, d = 2.8000000000000003
```

```
$ javac JSample2_3.java 
$ java JSample2_3 
i = 1, j = 1, k = 1
i = 1, j = 1, k = 2
i = 1, j = 2, k = 1
i = 1, j = 2, k = 2
i = 2, j = 1, k = 1
i = 2, j = 1, k = 2
i = 2, j = 2, k = 1
i = 2, j = 2, k = 2
```

# まとめ

何かの役に立てばと。
NVIDIA Driverをコマンドだけで更新 (Ubuntu)

# モチベーション

SSHでつないでいる研究室のPCを使って，機械学習用のDockerコンテナを作ろうとしました．ところが，NVIDIAのバージョンが古いって怒られてうまくいきませんでした．
このためにわざわざ研究室行くのも面倒なので，コマンドだけでNVIDIAドライバーを更新できないか試したので，うまくいった方法を投稿します．

# 手順

### 1. `apt-get` と `apt` のアップデート
    
```bash
sudo apt-get update -y && sudo apt update -y
```

このとき， `NO_PUBKY` って怒られたら次のコマンドでPUBKEYを追加してあげましょう（このコマンドを毎回忘れて調べているので，今回はちゃんとメモします）

```bash
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [ほしいキー]
```

### 2. インストールできるドライバーを確認
    
```bash
 ubuntu-drivers devices
```

こんな感じで出てくる

```
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-515 - distro non-free
driver   : nvidia-driver-530 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin
```
    
### 3. インストール
    
`recomended` となっているバージョンを指定してインストールしていく．

上の例だと `nvidia-driver-530` が該当．

```bash
sudo apt install -y nvidia-driver-530
```
    
### 4. 再起動
    
```bash
sudo reboot
```
再起動するとSSH接続が切れるので，起動したらSSHサーバーが立ち上がるのか事前確認しておきましょう．

### 5. 確認

```bash
nvidia-smi
```
    
これでバージョンが更新されていれば成功！
    

# まとめ

今回はCLIだけでアップデートする方法を試しました．
リモートワーク中だったので何とかなってよかったです．

# 参考

https://qiita.com/porizou1/items/74d8264d6381ee2941bd

https://docs.nvidia.com/cuda/cuda-installation-guide-linux/
バイナリーパッチ

リバースエンジニアリングのためにバイナリにパッチを当てるスクリプトをrubyで作ってみました。

```ruby:binpatch.rb
#
# binary path for reverse engineering
#

argc = ARGV.size
if argc >= 4 && argc % 2 == 0 then
  old = ARGV[0]
  new = ARGV[1]
  p = 2
  bindata = File.binread(old)
  while 2 + p <= argc
    offset = ARGV[p].hex
    inst = ARGV[p+1].hex

    bindata[offset] =  (inst >> 24).chr
    bindata[offset + 1] =  ((inst >> 16) & 0xff).chr
    bindata[offset + 2] =  ((inst >> 8) & 0xff).chr
    bindata[offset + 3] =  (inst & 0xff).chr
    p = p + 2
  end
  File.binwrite(new, bindata)
else
  print "usage: binpatch.rb oldfile newfile offset data\n"
end
```

使い方は

```
% ruby binpatch.rb org.bin new.bin 0x100 0xffff0010
```

0xffff0010は置き換える32bitの値でMIPSELの命令で無限ループになります。

これでオリジナルのバイナリーにパッチを当ててどこまで進んでいるか調べようと思ったのですが、逆アセンブラを自力で流れを追って、書き換える場所を探す必要があり、条件で通らないところもあり、あまり有効な方法ではありませんでした。

パッチ当てて、イメージ作って、Flashに焼いて、実機に実装して実行して確認していたのですが、効率が非常に悪いです。

パッチはcmp -lやobjdump -Dなどで確認できます。

FreeBSDにはbspatchというコマンドがありますが、これはbsdiffで作ったバイナリ形式のdiffでパッチを当てることができて、任意のパッチは当てられないようです。

パッチは無限ループの他に、NOPや不正命令で例外を吐かせる方法なども考えられます。
VueでProxy(object)となっている状態から、普通のオブジェクトに戻したい場合

VueでProxy(object)となっている状態から、普通のオブジェクトに戻したい場合。

```✖-1.js
unreactive(obj)
```

```✖-2.js
unref(obj)
```

```〇.js
toRaw(obj)
```
【CSS】MacとiPhoneで異なる電話番号の見た目を揃える方法

# はじめに
<!-- 発端や概要を記載 -->
本記事は、iPhoneで見ると「電話番号が勝手に青色になってしまうな〜」とか、「なんか下線ついちゃうんだけどなんで？」という現象をCSSを使って解決しよう！という記事です。




# 目次
<!-- タイトルとアンカー名を編集 -->
1. [どんなことが起きていたか？](#現象)
1. [原因は何だったのか？](#原因)
1. [どうやって解決したか？](#解決策)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#現象"></a>
# どんなことが起きていたか？
以下のコードを記述した時に、Chromeの検証ツールで見ていたときは色を変更するCSSが当たっており、表示も正しく反映されていた。
ただ、iPhoneで見たときにsafariでは文字の色が青色に、Chromeでは色はいいけど青色の下線がついてしまっている状態になっていた。

```index.html
<div class="tel">090-111-2222</div>
```
```style.css
.tel {
  color: #4C93AA;
}
```

>PCでの正しい表示 ⭕️
>色が想定通り当たっている状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746825/320e677d-b8cf-e1d5-5c96-42a21318db92.png)
>
>iPhone（safari）で見た時の状態 ❌
>→cssで色も当ててるのに、青色になってしまっている状態。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746825/7ee93248-86ba-a404-944e-5293e329ab8c.png)
>
>iPhone（Chrome）で見た時の状態 ❌
>色は変わっているが、下線が入ってしまっている状態。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746825/460dff29-6b61-729b-1996-79021f6b8d12.png)

<a id="#原因"></a>
# 何が原因だったのか？
iPhoneのsafari・Chromeだと、電話番号のような数字を認識するとタップで電話がかけられるよう自動でリンクを付与してるらしい。そのため勝手にaタグに変わり、リンク扱いになるため文字の色が青になり下線が入ってしまうみたいです。

<a id="#解決策"></a>
# 解決策
1. 電話番号をaタグの中に記述する
    ```index.html
    <div class="tel">
        　<a href="#">090-111-2222</a>
    <div>
    ```
    <br>
1. aタグに対して下線と色の変更を指定するCSSを記述する

   ```style.css
   .tel a {
       pointer-events: none;
       text-decoration: none;
       color: #333;
    }
   ```

# 終わりに
なかなか気づきづらい部分ですが、見る側からしたら違和感しかないので、
今回のようなこともしっかりと考慮する必要があるということを学べたいい機会でした！

<a id="#参考文献"></a>
# 参考文献
- [iphone/safariで電話番号の文字が青くなってしまうのをCSSで解決](https://webdesign.perlzemi.com/blog/20200225082049.html)
- [【CSS】iOSの電話番号の自動リンクを無効にする方法](https://code-sq.com/invalid_tell_link/)
- [iOS safariで電話番号リンクを無効にする方法](https://note.com/kani_web/n/nb2ac01eac42c)
0020002400060003BGP

各クラウドプロバイダーでIPsecおよびBGPのログやステータス情報を取得する方法について説明します。以下に、AWS、Azure、IBM Cloudそれぞれの手順を詳述します。

AWS (Amazon Web Services)
IPsecログの取得方法

VPCフローログ:
VPCフローログを有効にして、IPsecトラフィックをキャプチャします。フローログはVPC、サブネット、ネットワークインターフェースレベルで設定できます。
VPCフローログの設定方法
VPN接続のログ:
AWS CloudWatch LogsにVPNの接続ログを出力するように設定します。
CloudWatch Logsの設定方法
BGPステータスの取得方法

VPN接続のステータス確認:
AWS Management Consoleで、VPN接続のBGPステータスを確認します。
VPN接続の詳細ページで、BGPセッションのステータスを表示します。
AWS CLIまたはSDK:
AWS CLIを使用してBGPセッションのステータスを取得します。
sh
コードをコピーする
aws ec2 describe-vpn-connections --vpn-connection-ids vpn-xxxxxxx
AWS CLIのドキュメント
Azure
IPsecログの取得方法

Network WatcherのNSGフローログ:
Azure Network Watcherを使用してネットワークセキュリティグループ（NSG）のフローログを有効にします。
NSGフローログの設定方法
VPNゲートウェイの診断ログ:
Azure Monitorを使用してVPNゲートウェイの診断ログを有効にします。
VPNゲートウェイの診断ログの設定方法
BGPステータスの取得方法

Azure Portal:
Azure PortalでVPNゲートウェイのBGPピアリングの状態を確認します。
VPNゲートウェイの設定ページでBGPセッションのステータスを表示します。
Azure PowerShellまたはCLI:
Azure PowerShellを使用してBGPステータスを取得します。
powershell
コードをコピーする
Get-AzVirtualNetworkGatewayConnection -ResourceGroupName "MyResourceGroup" -Name "MyConnection"
Azure CLIを使用してBGPステータスを取得します。
sh
コードをコピーする
az network vpn-connection show --name MyConnection --resource-group MyResourceGroup
Azure CLIのドキュメント
IBM Cloud
IPsecログの取得方法

ログ収集サービスの利用:
IBM CloudのLog Analysis with LogDNAやMonitoringサービスを使用して、IPsecトラフィックのログを収集します。
Log Analysisの設定方法
VPNゲートウェイのログ:
IBM Cloud VPNサービスのログ設定を確認し、ログを有効にして収集します。
IBM Cloud VPNサービスのドキュメント
BGPステータスの取得方法

IBM Cloudコンソール:
IBM CloudコンソールでVPNゲートウェイのBGPステータスを確認します。
VPNゲートウェイの詳細ページでBGPセッションのステータスを表示します。
IBM Cloud CLI:
IBM Cloud CLIを使用してBGPステータスを取得します。
sh
コードをコピーする
ibmcloud is vpn-gateway <gateway-id>
IBM Cloud CLIのドキュメント
まとめ
各クラウドプロバイダーでIPsecおよびBGPのログやステータスを取得する方法を以下にまとめました。

AWS: VPCフローログ、CloudWatch Logs、AWS CLI
Azure: Network WatcherのNSGフローログ、Azure Monitorの診断ログ、Azure PowerShell、Azure CLI
IBM Cloud: Log Analysis with LogDNA、VPNサービスのログ、IBM Cloud CLI
これらの手順に従って、IPsecおよびBGPのログとステータス情報を取得し、ネットワークの健全性を監視することができます。
gitでGitHubから取ってきたNext.jsのプロジェクトを動かすやつ入門


シリーズのトップは↓こちら

https://qiita.com/every-month/items/a6a9f481ac31eb695d25

前回の記事は↓こちら

https://qiita.com/every-month/items/9a3d7f1e53d8572525a2

たまたまプライベートで人にNext.jsを叩き込む過程でgitを叩き込む機会がありまして、せっかくなので再びこの場をお借りしていっしょに復習します。

## 前回までのポイント（再掲）（抜粋）

- `cd`
    - フォルダの中に入る
- `npm run dev`
    - （作ってる途中の）Next.jsを動かす
    - だいたい`http://localhost:3000`で見れる

## 今回のポイント

- `git`はバージョン管理のツール
    - 作業のきりがいいところ毎にフォルダまるごと記録するツール
- `..`は上のフォルダ
- `git clone ほしいやつ`
- `git`で取ってきたNext.jsのプロジェクトには`npm i`

## `git`をインストール

今回も環境によってまちまちなので、説明をふんわりさせてください😢
多くの場合↓このページの説明にそって、コマンドでインストールするのがかんたんではないでしょうか。

https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

特にWindowsを使っている場合は。

https://git-scm.com/download/win

ここに載っているコマンド、`winget install --id Git.Git -e --source winget`を使うとかんたんなようです。

## 前回までのお手本フォルダを取ってくる

そうです。みんなに大人気のGithubです。今回からお手本フォルダを公開しています。

https://github.com/tenshoku-2024/typescript-oni-spartan-dojo

ではまずターミナルでもPowerShellでもOKなのでコマンドの画面を出します。

```bash:コマンドの画面に入力してエンター
cd お手本フォルダを置く場所
```

たとえば、Next.jsのフォルダがまとめてあって、その中のNext.jsのフォルダの中で作業中であれば、`cd ..`などとしてもいいかもしれませんね。`..`というのは１つ上のフォルダです。ちなみに`.`は今のフォルダです。

では早速取ってきましょう。

```bash:コマンドの画面に入力してエンター
git clone https://github.com/tenshoku-2024/typescript-oni-spartan-dojo
```

これを実行すると、

```
Cloning into 'typescript-oni-spartan-dojo'...
remote: Enumerating objects: 38, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 38 (delta 8), reused 38 (delta 8), pack-reused 0
Receiving objects: 100% (38/38), 62.05 KiB | 3.10 MiB/s, done.
Resolving deltas: 100% (8/8), done.
```

具体的な数値は変わるかもしれませんが、だいたいこんなのが出てくるのではないでしょうか。これで取ってこれています。

## 取ってきたお手本を動かす

まずはお手本のフォルダに移動します。

```bash:コマンドの画面に入力してエンター
cd typescript-oni-spartan-dojo
```

次に、Node.jsのパッケージをインストールします。

```bash:コマンドの画面に入力してエンター
npm i
```

次はいつもの動かすときのコマンドを実行します。

```bash:コマンドの画面に入力してエンター
npm run dev
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782801/ee73e308-a474-5851-e13b-8a0d965e3f8f.png)

このような画面が出るようにしたつもりです。意図した画面が出ました🎉

今回はここまでにしました✨

## 今回のポイント

- `git`はバージョン管理のツール
    - 作業のきりがいいところ毎にフォルダまるごと記録するツール
- `..`は上のフォルダ
- `git clone ほしいやつ`
- `git`で取ってきたNext.jsのプロジェクトには`npm i`
Grafanaダッシュボード作成の自分なりベストプラクティス

# はじめに

Grafanaダッシュボードを今まで作ってきて気を付けていることをまとめます。

# 外部ダッシュボードをインポートしてまねる

初めてGrafanaを触った際は、グラフの種類の多さに面くらいましたし、PromQLの書き方も理解できていませんでした。
そのため、使っている公式Grafanaなど公開されているダッシュボードをインポートして書き方をまねていました。
見栄えの良さだけでなく、知らなかったクエリの書き方も知れて勉強になりました。

https://grafana.com/grafana/dashboards/

有名なミドルウェアは検索してみると、出てくる場合も多いのでかなり参考になりました。
ただ、エクスポーターの設定などでそのまま使えない場合も多いのであくまで参考程度の気持ちでした。

* Elasticsearchの場合

https://grafana.com/grafana/dashboards/14191-elasticsearch-overview/

* PostgreSQLの場合

https://grafana.com/oss/prometheus/exporters/postgres-exporter/?tab=dashboards

# 目的別にダッシュボードを作る

Grafanaでの監視をするうえで、１次対応のためなのか詳細な状況を知りたいのかで作るグラフが変わります。
異常が起きているか知りたいだけであれば、詳細なグラフは不要です。グラフが多すぎると見る人に困惑させてしまいます。
また、必要な情報が網羅されていることは必要です。ダッシュボードを分けるとすべて見るために余計な手間が発生します。
ダッシュボードを作り終えたら、関係者に見方を説明する必要もあると思います。グラフの意味や見てほしいポイントを伝える必要があります。

# Prometheus、システムへの負荷を考える

GrafanaはPrometheus、エクスポーターを通してメトリクスを収集しています。
収集間隔が短すぎたり一度に実行するクエリが多いと、Prometheusがダウンする可能性があります。
また、エクスポーターは監視対象にアクセスしてメトリクスを収集します。そのため監視対象であるシステム本体の負荷が上がりすぎないように気を付ける必要があります。

# クエリの意味を理解する

Grafanaで使用しているクエリが何を意味しているか理解する必要があります。
gaugeなのかcounterなのか、平均値なのか、平均値であれば間隔はどの程度かなどです。
Prometheusはエクスポーターが定義したメトリクスを集めているだけなので、エクスポーターの開発ページなどを見てどういった意味なのか理解しておく必要があります。

# アラートを挙げる閾値を明確にする

グラフがどういった状態であれば異常なのか明確にしておく必要があります。
GrafanaにメールやSlackに通知する機能もあるので併せて利用するとよいと思います。

# 定期的にメンテナンスする

システムの変更によりグラフがうまく表示されないことがあります。
定期的に見直して、必要なメトリクスが網羅されているか、不要なメトリクスがないか見る必要があると思います。

# 変数はわかりづらいのでなるべく使わない

Grafanaにはダッシュボードごとに変数を設定できるようになっています。例えば、変数を使うことで、複数のノードで動いているミドルウェアで表示するノードを切り替えることなどができます。
しかし、いざ使ってみると変数が今どの値なのか誤解し間違った理解をしてしまうことがありました。複数人で使っているとなおさら気づきづらいです。
ただ、変数を使うことで複数のグラフで共有できるというメリットもあります。そのため、変数を使うにしても初期値を固定し変えないなど使い方を決めるとよいと思います。

# その他

Grafanaの公式ページにもベストプラクティスが載っています。

https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/best-practices/
EC-CUBE4引越手順（商品・受注・会員データなし）

# 基本環境
EC-CUBE4.2.3　→　4.2.3
サーバー：レンタルサーバー

開発環境で作成したEC-CUBEサイトを公開サイトへお引越する手順

# プラグイン同期
元EC-CUBEにインストールしているプラグインを手作業で新EC-CUBEにインストール

アップデート表示をアップデートしておく

# サーバーファイル引越
カスタマイズしたファイルを引越

`app`
root/app/template/default/index.twig
root/app/template/default/Block/...twig
root/app/template/default/Cart/...twig
root/app/template/default/Help/...twig
root/app/template/default/Mail/...twig
root/app/template/default/Mypage/...twig
root/app/template/default/Product/...twig
root/app/template/default/Shopping/...twig

root/app/template/user_data/...twig

`html`
root/html/template/default/assets/img/top/...png, ...jpg
root/html/template/default/assets/img/common/...ico

root/html/user_data/assets/css/customize.css

`src`
root/src/Resource/template/admin/Order/...pdf.twig
root/src/Service/...PdfService.php

# ブロックファイルコピー
管理画面　＞　コンテンツ管理　　＞　ブロック管理

root/app/template/default/Block/...twig　を引越ししても登録されないことがある

# レイアウト調整
管理画面　＞　コンテンツ管理　＞　レイアウト管理
引越し元　→ 引越し先　合わせる

# 
# 
#
SnowflakeのSTORAGE INTEGRATIONについて

気づいたことがあって( ..)φメモメモ。

この公式ドキュメントを見ながら何度かS3バケットとSnowflakeをつなげてみたことがあり。

https://docs.snowflake.com/ja/user-guide/data-load-s3-config-storage-integration

で、ですよ。
YoutubeのSnowVillageに上がっていたfrosty_fridayの[第0回目（パイロット版）](https://youtu.be/0T8P_bw6GgE)を見たんですよ。

さらさらーっと外部ステージ作ってlistで取ってきてるの。
「ありゃ？STORAGE INTEGRATIONは？？」ってなりまして。

STORAGE INTEGRATIONの公式ドキュメント見るか。

https://docs.snowflake.com/ja/sql-reference/sql/create-storage-integration

>ストレージ統合は、外部クラウドストレージ用に生成されたIDおよびアクセス管理（IAM）エンティティを、許可またはブロックされたストレージの場所（Amazon S3、Google Cloud Storage、またはMicrosoft Azure）のオプションセットとともに格納するSnowflakeオブジェクトです。組織のクラウドプロバイダー管理者は、生成されたエンティティにストレージの場所に対するアクセス許可を付与します。このオプションにより、ユーザーは、ステージの作成時またはデータのロードまたはアンロード時に認証情報の提供を回避できます。

こーゆーこと？
- YouTubeでやってたS3のバケットは全公開されてるから認証情報はなくてもいい。
- 会社とかで使う自社のバケットは全公開じゃないから、STORAGE INTEGRATIONが必要。

うん、賢くなった。
STORAGE INTEGRATIONを作る意味がわかってなくて、手順として「おまじない」程度にとらえていたけど、これがあることで「認証情報の提供を回避」してくれるというわけっぽいぞ。
「おまじない」じゃなかった。

# 追記
この[投稿](https://qiita.com/Ayumu-y/items/5a6569e43c5ecc327c0e "【Snowflake】外部ステージを使うためになぜ統合ストレージを使用するのか")でちゃーんと説明してくれてるじゃん。

「おまじない」とか思ってた自分、ﾊｽﾞｶｼｲ(｡•ω<｡)وﾃﾍﾍﾟﾛ。
Gcore のはじめ方、アカウント作成


## Gcoreとは

Gcoreは2014年に設立された、エッジ AI、クラウド、ネットワーク、セキュリティのグローバルソリューションプロバイダです。本社はルクセンブルク、600人以上の従業員と世界各地に10の営業拠点を擁しています。
2024年５月現在、Gcore の IT インフラストラクチャは自社運用、拠点は6大陸にまたがり、グローバル平均レスポンスタイムは30ms、ヨーロッパ、アフリカ、LATAM における屈指のネットワークパフォーマンスを実現しています。ネットワークはTier IVとTier IIIのデータセンタに配備された世界各地の180以上のPoPで構成され、２００Tbps以上の帯域を誇ります。

## アカウント作成
まず、[GcoreのWebサイト](http://www.gcore.com/) 内のSign up for freeをクリックする。
![スクリーンショット 2024-05-22 15.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/8578c131-4627-3913-aa73-52fbb8af5659.png)

Gcoreプラットフォームのオプションが表示されます「Go to Gcore Platform」を選択します。
（下部のGcore　Hostingサービスは日本でサービスを展開していないので、基本日本からはCloud Platform を選択します。）

![スクリーンショット 2024-05-22 15.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/cabc4dcb-07e5-9a94-d094-1e051776a6f0.png)

次にGoogle, GitHubまたはメールアカウントを使用してアカウントを作成します。

![スクリーンショット 2024-06-03 15.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/f4aa768a-098b-e355-f64d-0137fdc36359.png)

メールでサインアップした場合、登録確認リンクが指定されたメールアドレスに送信されます。

![スクリーンショット 2024-06-03 15.36.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/485cd89d-39c6-d04e-a79c-15f3601e08d8.png)

リンクは 24 時間のみ有効です。受信トレイに登録確認メールが見つからない場合は、スパム フォルダーを確認するか、確認メールを再送信してください。

![スクリーンショット 2024-06-03 15.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/99a20e79-0a91-837f-e9dc-55259eda94d5.png)

登録を確認すると、Gcore カスタマー ポータルで Gcore ダッシュボードにアクセスできるようになります。
まず、CDNを試してみたいと思うので、CDNの「Next」をクリックして次へ。

![スクリーンショット 2024-06-03 15.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/1f84e8ef-563f-ef04-536b-a295cbdb180a.png)

1TBまで無料であるFreeプランを選んで「Next」で次へ
各プランの詳細についてはこちらを参照してください
https://gcore.com/cdn

![スクリーンショット 2024-06-03 15.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/9b5a3810-6585-c2ed-3ad7-7aa676d5c584.png)

住所の入力が求められるので住所を情報を入力して、「Save」

![スクリーンショット 2024-06-03 15.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/fd8d7129-4bd8-3444-2062-f102d576f5fa.png)

確認画面が出るので内容を確認して「Get Start」をクリックして次へ

![スクリーンショット 2024-06-03 15.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/6e233807-7016-ee3a-f247-4221f1313490.png)

そうするとサービスがアクティベーションされるので２−3分待ちます。

![スクリーンショット 2024-06-03 15.49.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/6a4372ee-7f38-77ad-36c0-089c8bccd43b.png)

アクティベーションが完了すると、ダッシュボードが作成されて、CDNのリソースが追加できるようになりました。

![スクリーンショット 2024-06-03 15.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88887/30e1fcb2-1715-47aa-0aa3-d12dc16010b2.png)

## まとめ

アカウント作成は簡単に行えたと思います。
それぞれの有料サービスなどを開始するには、クレジットカードやPaypalでの支払い情報の紐付けが必要になりますが、無料プランで始めるには特に、カード情報を入力することなく利用可能となりました。
次回は、実際にCDNのリソースを追加してパフォーマンスなどを計測していきたいと思います。
[Android/Jetpack Compose]Failed to resolve: <パッケージ名>の原因と解決方法

# 問題
Android WebRTCライブラリ[Sora](https://sora-android-sdk.shiguredo.jp/quickstart#a8b57b)の依存関係の設定をしようとして、`build.gradle.kts`(モジュール側)を書いていたときハプニング。

**`import org.webrtc....`のサジェストが効かない？？？？**

`import`できない問題は大抵依存関係の問題なので、もう一度Syncしてログを見ると以下のログが出力されている

```
Failed to resolve: <パッケージ名>
```

ちなみにSync時はエラーではなく警告が出るだけなので、コードを書こうとしてサジェストされないことで問題が発覚。

# 原因と解決方法
`settings.gradle.kts`へ以下の記述が必要
```
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven("https://jitpack.io")// ここを追加
    }
}
```
ちなみに[公式HP](https://jitpack.io/#shiguredo/shiguredo-webrtc-android/123.6312.3.0)にも行を追加するようにという旨は載っている

以上の行を追加することで、無事サジェストが効いてimportできるようになりました！
RDSのスナップショットを削除する方法

## はじめに
ポートフォリオとしてAWSにデプロイしたサービスが不要になり、AWSのリソースを削除する際に、
RDSのスナップショットが削除できずにつまづいたので、解決方法をまとめました。

## 目次
[1. 発生した事象](#発生した事象)
[2. 解決方法](#解決方法)
[3. 自動バックアップとスナップショットの違い](#自動バックアップとスナップショットの違い)

## 発生した事象
AWSのリソースを全て削除したつもりの私でしたが、
数日後、AWSの支出が無料利用枠の制限を超えたというメールが届きました。
請求書を確認すると、RDSのリソース内で`Amazon Relational Database Service Backup Storage`が0.02ドル使っていることがわかりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/3ad90f97-bfad-20a0-db40-14d9c0eb6fe4.png" width="100%">

RDSのリソースを確認すると、DBの自動バックアップとして保存されてあるシステムスナップショットがあることがわかりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/9abe597a-2cb3-1587-d40a-3ab955fb19d1.png" width="100%">

そこで、手動で削除しようと思いましたが、以下のようなメッセージが出て削除できませんでした。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/5bd5dfb0-d6c1-6007-b52c-bd83c96904b5.png" width="70%">


## 解決方法
エラーメッセージに「削除されたインスタンスのシステムスナップショットを削除するには、保持されている自動バックアップを削除します」とあったので、
これを手がかりにRDSのリソースを隅々まで調べてみた結果、以下で手順で削除できることがわかりました。

左側のメニューから自動バックアップを選択し、保持というタブを選択すると自動バックアップされているDBインスタンスが表示されます。
この自動バックアップを削除した後であれば、スナップショットを削除することができるようになります。
[:page_facing_up:[公式ドキュメント]保持している自動バックアップの削除](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ManagingAutomatedBackups.html#USER_WorkingWithAutomatedBackups-Deleting)


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/ade680df-dd21-bf94-eb22-787d78877f41.png" width="100%">


## 自動バックアップとスナップショットの違い
**＜自動バックアップ＞**
- RDSの機能の1つであり、デフォルトで有効となっている
- DBインスタンスのストレージボリュームのスナップショットを自動的に作成し、個々のDBだけではなく、そのDBインスタンス全体をバックアップする

**＜スナップショット＞**
- バックアップ機能によって作成されたデータ
- スナップショットからDBインスタンスを復元することができる
- スナップショットのストレージ使用分に対して課金される

ちなみに...
公式ドキュメントによると、DBインスタンスを削除する際に、自動バックアップ保持するか否かを選べるらしい。
[:page_facing_up:[公式ドキュメント]自動バックアップの保持](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ManagingAutomatedBackups.html#USER_WorkingWithAutomatedBackups.Retaining)


## まとめ
- 自動バックアップはRDSの機能であり、スナップショットはバックアップによって作成されたデータである。
- 自動バックアップという機能を無効化した後でないと、スナップショット（バックアップされたデータ）が削除できない仕様になっている。

最後までお読みいただきありがとうございます！

## 参考資料
- [:page_facing_up:[公式ドキュメント]データのバックアップ、復元、エクスポート](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.BackupRestore.html)
- [:page_facing_up:[公式ドキュメント]Amazon RDS のバックアップと復元](https://aws.amazon.com/jp/rds/features/backup/)
【paizaラーニング】レベルアップ問題集 ソートメニュー応用編 「スケジューリング」 PHP

### 問題

https://paiza.jp/works/mondai/sort_advanced/sort_advanced__problems_speedup_step6?language_uid=c

### 解答
　最初にコードを書いた時に、`キャンペーンxの終了日`と`キャンペーンx+1の開始日`を比較してました。それだとこっちのテストが通らなくて...
 
>`n = 3, l = [ 1, 3, 6 ], r = [ 8, 5, 9 ]`

　なのでキャンペーンごとの終了日だけに注目しました。終了日だけを昇順にして、キャンペーンを確認していく方針ですね。そうすると早い終了日を選択していくことになるので、できるだけ多くのキャンペーンに参加できます。
 
### 関数定義
```php
<?php
    function maxCam($x, $l, $r) {
        $maxCam = 0;
        $endTime = 0;
        // カウント変数の初期化
        // 終了日の初期化
        array_multisort($r, $l);
        //　ここの操作を逆にしていたのでうまくいきませんでした。
        for($i = 0; $i < $x; $i++) {
            if($endTime < $l[$i]) {
                // 前回のスケジュールが終わった日と、次のスケジュールの開始日を比較
                $maxCam++;
                $endTime = $r[$i];
                // 終了日の更新
            }
        }
        return $maxCam;
    }
```
### 入力と出力

``` php
    $n = trim(fgets(STDIN));
    for($i = 0; $i < $n; $i++) {
        list($a, $b) = explode(" ", trim(fgets(STDIN)));
        
        $left[] = $a;
        $right[] = $b;
        
    }
    
    echo maxCam($n, $left, $right);
?>
```
Graphvizでタイムライン図作成

# 前提
ここでは、時系列で起こるイベントを、依存関係つきで表す図をタイムライン図と呼びます。
要求としては以下があります。
* 横軸または縦軸が日付
* イベントを日付に揃えるのは必須
* 依存関係があるイベントは→でつないだ上でなるべく揃えたい

たとえばこんな図です。
![timeline0603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335774/a5ad6acc-fa03-198a-b36c-3aa8e8aa270d.png)

手で書くと、イベントの追加があった場合に揃え直すのが面倒なので、宣言的に書いて生成したいところです。

# D2はどうか
こういう場合にふだん使っているのは[D2](https://d2lang.com/)ですが、リファレンスやサンプルを見るかぎり、イベントを日付にうまく揃える機能が見当たりません。[grid](https://d2lang.com/tour/grid-diagrams)もちょっと使いにくそう。

# Stack Overflowの記事
Stack Overflowで[それらしい話題](https://stackoverflow.com/questions/61550137/using-graphviz-yed-to-produce-a-timeline-graph)を見つけたので、[Graphviz](https://graphviz.org/)のdotで書いてみることにしました。

# Graphvizでのポイント
* 日付を`日付1->日付2->…`で並べ(これがやや面倒)、`[style=invis]`で→を消す
* `{ rank=same 日付 イベント }`でイベントを日付に揃える

# 結果
上記の図は以下で書けました。
```
digraph retirement {
    graph [ranksep=0.2]
    node [fontsize=16, shape=plaintext]
    "4/19"->"4/20"->"5/31"->"6/1"->"6/2" [style=invis]

    node [fontsize=14, shape=box]
    { rank=same "4/19" "退職所得の受給に関する申告書\n兼退職所得申告書受取" }
    { rank=same "4/20" 返送 }
    { rank=same "5/31" 退職->"退職手当金(一時金)振込" }
    { rank=same "6/1" 保険証返送 "任意継続被保険者\n資格取得申出書発送" }
    { rank=same "6/2" "健康保険・厚生年金保険\n資格喪失連絡票受取" }
    "退職所得の受給に関する申告書\n兼退職所得申告書受取"->返送->"退職手当金(一時金)振込"
    退職->保険証返送
    退職->"任意継続被保険者\n資格取得申出書発送"
    退職->"健康保険・厚生年金保険\n資格喪失連絡票受取"->国民年金・付加年金加入
}
```

# 日付edgeのweight
subgraphなどを使ったときに日付がまっすぐ並ばない場合は、`[style=invis, weight=3]`のようにweightを増やすといいようです。

# Graphviz以外の方法
JavaScriptだと[Timeline.js](https://github.com/Aonrud/Timeline.js)というのもありますが、日付が年でしか指定できなさそうなのが難点です。
TODO: とかアノテーションコメントについてまとめてみた

## はじめに

コメントを種類ごとに分類できる**アノテーションコメント**を採用しています。
使っている内に経験的なベストプラクティスが自分なりにつかめてきたのでまとめてみました。


### この記事でわかること

- アノテーションコメントの使い方と例がわかる


### この記事の対象者

- アノテーションコメントを使いたいエンジニア


### 動作環境・使用するツールや言語

- Python3
- その他言語


## アノテーションコメントとは
コメントの先頭に`TODO: `とかをつけて分かりやすくする試みです。

- コメントにメタデータを追加できる
- コードの欠陥が分かりやすくなる



## よく使っている記法と意味

使って欲しい順に並べてみました。
レビュアー視点で思うことも書いています。


|記法| 意味 | 思うこと |
|:-:|:-:|:-:|
|INFO: |関数の動作説明などの情報|あるとなんだかんだ嬉しい<br>(良い命名で省略できるかも)|
|NOTE: |**なぜこうしたのか、こう考えたのか**という情報|**コードからは読み取れない情報**なので**あると嬉しい！**|
|TODO: |**後で**追加する機能がある<br>修正するべき機能がある|終わったら消してね|
|HACK: |**汚いのでリファクタリングしたい**|直してからコミットして欲しい|
|WARNING: |修正などには**注意が必要** |なるべく使わずに済むようにして欲しい|
|FIXME: |**不具合が分かっている**ので修正する必要がある|**直してからコミットして欲しい。** 修正したら消してね|
|XXX: |**何が起こっているのかわからない** 危険な箇所| **使わないで欲しい。** 解決したら消してね

`TODO: `より下は承認する時は(仕方ないな…)という気持ちが出てきます。
(現場のスケジュールもあるので辛い部分もありますが…)

:::note info

その他`CHANGED:`とかもありますが、GitHubのdiffやPull Requestで分かると判断したので使っていません。
その他も統合可能だと思ってまとめています。

:::



## 使用例(Python)

Pythonで例を出してみます。

```python calculate_area.py

def calculate_area(radius):
    # INFO: この関数は与えられた半径の円の面積を計算します。 
    # TODO: 半径が負の場合のエラーハンドリングを追加する。
    
    # HACK: mathモジュールのインポート方法が分からなかったので、πを3.14として近似しています。
    pi = 3.14


    # WARNING: 近似しているので結果は若干不正確です。
    # NOTE: 円の面積の公式は πr^2 。
    area = pi * (radius ** 2)
    
    return area

def main():
    radius = 5
    
    # FIXME: 入力のバリデーションをしてません。
    print("円の面積は:", calculate_area(radius))
    
    # XXX: この辺はネットからコピペしてきただけなので、なんで動いてるのか知りません。
    for i in range(10):
        print(f"イテレーション {i}: 面積 = {calculate_area(i)}")

if __name__ == "__main__":
    main()


```

## 参考資料

https://zenn.dev/aiq_dev/articles/dedaa47a413363#%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99

https://qiita.com/taka-kawa/items/673716d77795c937d422

## まとめ

多少最初は手間ですが、スニペットや辞書に登録したりすると気軽かと思います。
VSCodeだとTODOS:TREEとかで一覧を出せて便利です。
Volta Node.js 20.11.1をインストールしてカレントディレクトリ直下のNode.jsのバージョンを20.11.1に固定する

## 概要

Voltaを使ってカレントディレクトリのNode.jsのバージョンを固定する方法を簡単にまとめる

## 方法

1. 下記を実行してNode.jsの20.11.1をインストール

    ```shell
    volta install node@20.11.1
    ```

1. 下記を実行してカレントディレクトリのNode.jsのバージョンを固定

    ```shell
    volta pin node@20.11.1
    ```
【効率UP】アロマで集中力を高めよう！おすすめ精油をアドバイザーが解説

毎日同じ姿勢で何時間も作業をしていると、集中力がもちません。
デスクワークのときこそ、脳内をクリアにして打ち込みましょう。
https://hearoma.com/aroma-improve-concentration/
Github Readme Statsを導入する

## はじめに
初めまして、Sawawa42です。
就職活動をするにあたって、Githubアカウントを載せてね〜と言われることが多くなってきて、いつまでも寂しいマイページじゃな...と思いGithub Readme Statsできれいにしようと思い立ち、今回備忘録がてら記事を書きました。

## やり方
### 1. vercel.comにログイン

アカウントを作ります。sign up押して、利用用途聞かれるのでとりあえずHobbyを選び、名前を入力してcontinue。  
Githubアカウントで入ります。
![Screenshot 2024-06-03 at 14-18-03 Sign Up – Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/07509e10-e4f2-898d-2182-e297843b56f2.png)

https://vercel.com/

### 2. github-readme-statsをfork

これをforkしてきます。

https://github.com/anuraghazra/github-readme-stats

### 3. リポジトリをimport

[Vercel Dashboard](https://vercel.com/dashboard)に移動し、Import Projectを選択します。
![Screenshot 2024-06-03 at 14-31-21 Dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/f61df7fe-a0d5-bf91-b323-bbbf0bc5dce5.png)

Installを押します。
![Screenshot 2024-06-03 at 14-39-44 New Project – Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/5d81ba0b-9e2a-29da-cbf8-6557f67b42b5.png)

自分のやつを選びます。
![Screenshot 2024-06-03 at 14-43-19 Build software better together.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/38da515a-97bc-46e7-ff6d-0781455fb9b3.png)

権限とか確認してInstallを押します。
![Screenshot 2024-06-03 at 14-46-07 Installing Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/5ef6f925-c0a2-9319-6855-3ffb2461be6d.png)

さっきforkしたやつをImportします。
![Screenshot 2024-06-03 at 14-49-21 New Project – Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/f6de460f-1798-2a6d-f4dc-ada09fdab86f.png)

### 3. デプロイする

Importボタンを押すとDeployボタンがあるページに飛びます。Environment VariavlesのKeyにPAT_1と入力し、Valueに[ここ](https://github.com/settings/tokens/new)で作ったGithubのアクセストークンを入力します。  
ちなみに、アクセストークンのScopeはrepoとuserを指定します。
![Screenshot 2024-06-03 at 15-18-08 New Project – Vercel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/ed74d06f-d440-74ab-6126-16a65e2b5838.png)

Deployを押します。しばらく待つと、こんなのが表示されます。これが出たらデプロイは完了です。
![Screenshot 2024-06-03 at 14-52-12 Dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/23dea131-02be-f8d7-2b6e-1d02bef3433f.png)

Dashboardに戻り、DOMAINSと書かれてる場所の文字列をコピーしておきます。

### 4. README.mdを編集する

これを貼り付けます。github-readme-stats.vercel.appの部分を先程コピーしたDOMAINSに入れ替え、UsernameをGithubの名前にしてください。
```
<p align="left"> 
  <img alt="Top Langs" height="150px" src="https://github-readme-stats.vercel.app/api/top-langs/?username=Username&layout=compact&show_icons=true&theme=onedark" />
  <img alt="github stats" height="150px" src="https://github-readme-stats.vercel.app/api?username=Username&theme=onedark&show_icons=true" />
</p>
```

## 結果

Privateリポジトリもちゃんと反映されました！(圧倒的C言語なのは気にしないでください。好きなのはGoなんです...)
![Screenshot 2024-06-03 at 16-05-31 Sawawa42 - Overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763486/a550762f-ef8d-b896-7b83-ffac57be3480.png)

## まとめ

少しREADME.mdに追加するだけで、中々きれいになって個人的に満足しています。これからもプロフィールをきれいにしていきたいです。

## 参考

https://github.com/anuraghazra/github-readme-stats

https://zenn.dev/a_ichi1/articles/0411396e6b887d
cscの作法 その503

# 概要
cscの作法、調べてみた。
wpf見つけたので、msbuildでコンパイルしてみた。

# 参考にしたページ


https://qiita.com/t13801206/items/ad1a9d61ede2274c7de2

# 環境
windows11

# ビルドを書く。

```

<Project DefaultTargets='Build' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
	<PropertyGroup>
		<Configuration>Debug</Configuration>
		<Platform>AnyCPU</Platform>
		<RootNamespace>Test</RootNamespace>
		<AssemblyName>Wpfmain2</AssemblyName>
		<OutputPath>.\bin\Debug\</OutputPath>
	</PropertyGroup>
	<ItemGroup>
		<Reference Include='System' />
		<Reference Include='System.Xml' />
		<Reference Include='WindowsBase' />
		<Reference Include='PresentationCore' />
		<Reference Include='PresentationFramework' />
		<Reference Include="System.Xaml">
			<RequiredTargetFramework>4.0</RequiredTargetFramework>
		</Reference>
	</ItemGroup>
	<ItemGroup>
		<Compile Include='Wpfmain2.cs' />
	</ItemGroup>
	<Import Project='$(MSBuildBinPath)\Microsoft.CSharp.targets' />
	<Import Project='$(MSBuildBinPath)\Microsoft.WinFX.targets' />
</Project>



```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2b9ea41b-69d0-1802-3041-6d18178e494f.png)

以上。
マウスカーソルごとスクショしたい！(Windows11)

マウスカーソルが画面に映った状態でスクショする方法
備忘録として残す。

1．｢設定｣→｢アクセシビリティ｣→｢拡大鏡｣
2．拡大鏡をオンにし、ズームレベルを100％、ビューを固定にする
![スクリーンショット 2024-06-03 155028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804250/215e674b-3004-f576-851f-a9642aae0f8f.png)
3．｢拡大鏡｣を起動(Windows + ＋ or 検索で)
4．[ここ大事！]
　　スクショしたい画面に重なるように拡大鏡を移動し、Alt + PrtScnでスクショする
5．ペイントやExcelなどに貼り付ける

2画面それぞれにスクショしたいものと拡大鏡がばらばらに配置しているとうまくいかなかった。
MySQLのサブクエリとエイリアスの使い方

## サブクエリとは
サブクエリとは、クエリの中に含まれる別のクエリのことです。サブクエリは通常、データを絞り込むために使用され、親クエリに対して追加のデータを提供します。

### サブクエリの例
以下は、`employees`テーブルから最高給与を持つ従業員の情報を取得する例です。

```sql
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
```

この例では、サブクエリ `(SELECT MAX(salary) FROM employees)` が、最高給与を取得します。

## エイリアスとは
エイリアスは、テーブルやカラムに一時的な名前（別名）を付けるために使用されます。エイリアスを使うことで、クエリを簡潔にし、読みやすくすることができます。

### テーブルエイリアスの例
以下は、`employees`テーブルにエイリアスを付ける例です。

```sql
SELECT e.first_name, e.last_name, e.salary
FROM employees AS e;
```

ここで、`employees`テーブルに`e`というエイリアスを付けています。

### カラムエイリアスの例
以下は、`salary`カラムにエイリアスを付ける例です。

```sql
SELECT first_name, last_name, salary AS employee_salary
FROM employees;
```

ここで、`salary`カラムに`employee_salary`というエイリアスを付けています。

## サブクエリとエイリアスの組み合わせ
サブクエリとエイリアスを組み合わせることで、さらに複雑なクエリを簡潔に記述することができます。

### 例: サブクエリとエイリアスの組み合わせ
以下は、サブクエリを使って特定の条件を満たすデータをフィルタリングし、その結果にエイリアスを付けて使用する例です。

```sql
SELECT 
    *, 
    4 * (carbohydrates + protein) + 9 * fat AS total_calories 
FROM (
    SELECT 
        food_name, carbohydrates, protein, fat
    FROM foods
    WHERE protein >= 40
        AND carbohydrates < 20
        AND fat < 10
) AS filtered_foods;
```

この例では、サブクエリが`foods`テーブルから特定の条件を満たす行を選択し、結果に`filtered_foods`というエイリアスを付けています。外側のクエリは、このエイリアスを使用して、総カロリーを計算しています。
おいオブジェクト指向、野球しようぜ　「オブジェクト指向を野球を使って10分で解説する」

# 初めに
インターン先を決めようと思い面接を受ける中でオブジェクト指向について尋ねられました。
でも私はオブジェクト指向についてさらっと勉強したぐらいであまり詳しく知らずうまく答えられませんでした。なのでこの機会にオブジェクト指向について調べたので、アウトプットを兼ねて解説しようと思います。今回は概念の理解のためにプログラムはなるべく使わないようにしました。間違っている部分があるかもですがお許しください。

# オブジェクト指向とは
ずはり
### プログラムの設計手法のこと
です。

# 例を挙げていきます。

## 太郎と次郎の2人でキャッチボールをするプログラムを設計しましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/62982bd6-7fb7-c283-3925-d2422fd234e8.png" width=50%>


必要な情報は
・太郎、次郎という人
・太郎、次郎のグローブ
・ボール
・太郎、次郎が投げるという動作
・太郎、次郎がボールをキャッチするという動作
これらの情報が必要になります。

処理の流れとしては
1. 太郎、次郎という人を出現させる
2. 太郎、次郎という人にグローブをはめてもらう
3. 太郎がボールを持つ
4. 太郎が次郎にボールを投げる
5. 次郎がボールをキャッチする
6. 次郎が太郎にボールを投げ返す
7. 太郎がボールをキャッチする

3.~7.を繰り返すことで2人がキャッチボールをするプログラムは完成します。

## 次は1チーム11人東と西というチームで野球をするプログラムを設計しましょう

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/0c38f5b9-791b-a078-c318-e9fcd1b859c6.png" width=50%>

必要な情報は
・ピッチャーなどのポジション別で11人の情報を2チーム分作る
・審判
・選手分のグローブ、バット
・ベース
・9回というイニング
・ボールやストライクといったカウント
・点数
・ボールを投げるという動作
・ボールを打つという動作
・ボールをキャッチする動作
・ベースに向かって走る動作
などなどデータと動作が2人でキャッチボール比べて多いことがわかります。

処理の流れも複雑で
1. 2チームの選手を出現させる
2. 2チームの選手にグローブをはめてもらう
3. 東のチームのピッチャーがボールを持つ
4. 東のチームのピッチャーがキャッチャーにボールを投げる
5. ストライクならストライクのカウントを増やす
6. ボールならボールのカウントを増やす
7. ファールならストライクのカウントを増やす
8. フィールド内にボールを打てばバッターは走る
9. 西チームの野手はボールをファーストに投げる

などなど様々な処理が行われます。

# 設計方法
## 従来の設計方法
従来の設計手法は手続き型と呼ばれる考え方で、文字通り手続きを上からベタ書きしていくやり方でした。
この設計なら処理を上から読んでいけばいいので処理の流れがわかりやすいです。
ですが、今回の例のように2チームで野球をする場合は処理が何千、何万と書かれるでしょう。
そのなかでコードを読み取るのは難しくなります。
また保守をする場合もどの機能がどこにあるのかまたメソッドの影響範囲がどこまでなのかを考える手間が増え開発効率が下がってしまうことが問題でした。
以下はc言語で野球の処理をおこなうプログラムです。
mainメソッドの中に処理を書いていきます。
```baseball.c

int main() {
// 2チームの選手の情報
// 選手の動作をもとに処理を書く
// 上から下へ処理をベタ書き
}
```

## オブジェクト指向の設計
そこで誕生したのがオブジェクト指向です。
これはコードを現実世界の物や概念で整理していく考え方になります。
具体的に野球をする場合を考えましょう。
まずクラスと呼ばれる設計図を作ります。
そこで扱うデータと処理を記述します。
今回はチーム編成についてのクラスを作成しました。オブジェクト型言語のjavaを使いました。
```Team.java
class Team {
// 選手の情報
// ピッチャーなどのポジション

// 選手の動作
// 投げる、打つのような処理
}
```
このようにクラスごとに情報をまとめるメリットは
チームの情報、道具の情報、野球の進行の情報のようにクラスごとにどのようなデータがあり、どのような処理が行われているのかが分かりやすくなることが1つ挙げられます。
また作成したクラスを呼び出して使用することで保守をする際に影響範囲が小さくなり、変更がしやすくなるメリットも生まれます。
他には機能追加をする際に変更がしやすいこともメリットの一つです。
例えばチームの情報に監督を追加したくなったとします。そうであればTeam.javaに監督の情報を追加すれば解決できます。

# 最後に
今回はオブジェクト指向とは何かについて書きました。
オブジェクト指向ってなんかとっつきにくくて勉強したくないなって思ってました。
でも具体例を用いて考えるとかなり理解できました。
オブジェクト指向でつまずいている方の参考になればうれしいです！
イラストはいらすとやさんを使いました。

https://www.irasutoya.com
DjangoのHTMLファイルで動画ファイルを識別して表示させるには

 ###### HTMLでの動画ファイルを識別するために私が使ったものを紹介します
 ###### 技術検証中にまとめたため、コメントアウトは気にしないでください
 

## カスタムフィルター

カスタムフィルターとはテンプレート内でDBから受け取ったデータを変換・整形するための仕組みです。今回はmp4ファイルとmovファイルを識別するために使用しました。

## カスタムフィルターの導入方法

カスタムフィルターを導入するためにはまず下の図のようにアプリケーションファイル内に[templatetags]フォルダーを作成し、その中に__init__.pyとcustom_filters.pyという２つのPythonファイルを作成します。
ここでの__init__.pyはフォルダー内のPythonファイルを認識させるためのものです。

![スクリーンショット 2024-06-03 145344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627826/6123681a-3e4b-e4e0-382e-c74b5a291139.png)

### カスタムフィルターの設定
custom_filters.pyの中身を書いていきます。まずdjangoモジュールからtemplateをインポートします。templateの中にあるLibraryにはDjangoのテンプレートシステムで使用されるカスタムテンプレートタグやフィルタを作成するためのクラスがあります。
ここから関数を書いていきます。まず @register.filter でライブラリからフィルターを取り出します。そして関数を定義し、返り値は今回だとmp4ファイルかどうかを識別したいので、id.lower().endswitch('.mp4')とします。ここではlower()により文字列を小文字にして処理しやすくし、endswitch()で条件に当てはまるかどうかを判別しています。

![スクリーンショット 2024-06-03 153245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627826/b8f5ae30-f524-c45a-4a6f-f510e903ae56.png)

## HTMLファイルに適用させる
htmlファイルに適用していきます。定義した関数を使用するには、Djangoですと
{% code %} （ここではcodeにif文を追加する）とする必要があり、
{% if|is_mp4 %} と書きます。下の図はファイル識別のコードです。

![スクリーンショット 2024-06-03 153614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627826/1adf0c12-16b4-e079-350d-46da81a53069.png)

## 感想
カスタムフィルターを使用することで、簡単にファイル識別を実装することができました。初めての投稿でしたが、ここまで読んでいただきありがとうございます！
QAエンジニアってなに？テスターと何が違うの？

<h2>QAエンジニアの「QA」とはなにか</h2>
まず名称の概念から理解していきます。<br>
QAとは「<strong>Quality Assurance</strong>」の略であり、「<strong>品質保証</strong>」という意味を持ちます。
<br>従って、QAエンジニアとは<strong>品質を保証を行っているエンジニア</strong>ということです。
<h2>品質保証とはなにか</h2>
では、そもそも「品質保証」とはどういう意味なのでしょうか。
品質保証について調べて見ると以下のような定義が見られました。<br>

```
品質保証とは自社製品の品質が規定値を満たしているか確認して、納品後も買い手に安心や満足を保証する活動のこと
```

「品質」を「保証する」というだけあって、購買時に高品質のものを提供するだけではなく、納品後も満足してもらうために動いていくことがわかります。

<h3>品質の定義</h3>
ではこの「品質」とはどのように定義づけされているのでしょうか。<br>
品質を管理するとなると基準であったり、それを審査する機関が存在するのでは？と考えますよね。
それがJIS、PSE、ISO9000シリーズなどと言われているものとなります。<br>
JISは日常生活の中でも見聞きしたことがあるのではないでしょうか。
その品質の基準に則って製品をつくり、提供後もサポートを行っていくことがQAエンジニアの仕事となります。

<h2>具体的なQAエンジニアの業務</h2>
開発中及び開発後もシステムのサポートをしていくという役割を担うのがQAエンジニアであることがわかりました。
では具体的にシステム開発を行う上でのQAとは何を行っているのでしょうか。

ざっくり分けると業務フローは以下のように分類されるようです。
```
１.品質保証テストの設計・計画
２.テストの実行・検証
３.品質テストの自動化検討
４.テスト結果の分析・フィードバック
```

<h3>1.テストの計画・設計</h3>
QAエンジニアの業務フローにおいて上流にあたるテストの計画、設計は、具体的には以下のような作業を行います。

```
・何が必要なテストなのかを考える。
・どのように行うかテストの実施計画を立てる。
・機器や人的リソースの手配、管理を行う。
```
製品やサービスへの理解がないと何が必要かわからないため、最低限その知識や理解はしておかなければなりません。
計画においても誰が、どこに、何を使って、どれだけ時間をかけるかを把握しなければならないので、テストそのものやメンバーの理解も必要になりますね。
また、QAエンジニアのテスト工程は、製品リリースが間近に迫っていることが多いという話も聞きます。
その状況下でこの工程を担うとなったら、やはり<strong>実績や業界知識、それなりのマネジメント力</strong>が問われるのではないでしょうか。
ただ、シビアではあるものの、納期までのカウントダウンに神経をすり減らしながら取り組むよりは、**早い段階から介入することでそのリスクを減らせる**ので、QAエンジニアの価値はここにありといったところでしょうか。

<h3>2.テストの実行・検証</h3>
QA＝テスターと捉えられることが多いようで、もしかしたらQAとしての業務イメージとしては、この「テスト実行・検証」が主戦場なのではないかと思われる方も多いのではないでしょうか。
<br>
実はここに明確な違いがあり、テストエンジニア（テスター）の主な守備範囲がこの領域になります。<br>
仕様どおりに動作すること、バグがないこと、性能面で問題がないことを通して、不具合がない製品/サービスを世に送り出すことを目的とした作業となります。<br>
<strong>QAはそもそもそういった検証を行う上で何をどのように行うのかを定めるというのが役割</strong>となるため、実行する側とその実行内容を企画する側としての違いがQAとテスターの主な違いと言えるでしょう。<br>
QAエンジニアの守備範囲の中にテスターの守備範囲があるイメージをしてもらえると理解しやすいのではないでしょうか。

<h2>QAエンジニアの未来</h2>
QAエンジニアとしての概念は比較的新しいものであるものの、需要の高さは時代の変化に裏付けられています。
<h3>ソフトウェアの複雑化と規模の拡大</h3>
初期のソフトウェアは比較的小規模で単純なものでしたが、インターネットの普及やテクノロジーの進化に伴い、ソフトウェアはどんどん複雑化し、システム全体で数百万行以上のコードを扱うようになりました。<br>
また、企業の業務に不可欠なシステムやサービスがソフトウェアによって支えられるようになり、システムの規模や依存関係が増大しました。

このようにソフトウェアが大規模・複雑になる中で、バグや不具合が発生しやすくなり、それらを迅速に発見し解決する必要性が増しました。
そのため、ソフトウェアの品質を保証する専任の担当者としてQAエンジニアが求められるようになっています。
<h3>アジャイル開発とソフトウェアのリリースサイクルの短縮</h3>
従来のウォーターフォール開発（段階的な開発）から、アジャイル開発（迅速かつ反復的な開発）への移行が進んだことで、ソフトウェアはより短い期間で頻繁にリリースされるようになりました。
このような環境では、品質の確保とリスクの低減がより重要になります。

そのため、QAエンジニアは開発の早い段階から関与し、リリースのたびに品質保証を行う役割が必要とされるようになりました。
リリースサイクルが短縮されたことによって、自動化されたテストや迅速なフィードバックが求められ、それを実現するためにQAエンジニアの役割が増しています。

時代の変化に伴った複雑性や規模の拡大、技術の進化などに加え、競争力の強化や効率化など様々な背景からQAエンジニアは今後も求められていくことが伺えます。

<h2>終わりに</h2>
今回はQAエンジニアとはなにかという概念の部分と、テスターとの違いについて触れていきました。
今後需要の高まる役割であるものの、前述した通り複雑な環境ゆえにこの経験が備わっていればQAエンジニアであるという明確な定義付けも少し難しいのではないかと考えております。
そのため、市場でも手探りである今のタイミングがQAエンジニアへキャリアチェンジするチャンスとも言えるのではないでしょうか。
【専門実践教育訓練給付金】プログラミングスクールが56万円お得に！

エンジニアを目指してプログラミング学習に励んでいる方、どのようにして学習を進められていますか？私はプログラミングスクールに通い、未経験からITエンジニアへとなりました。

ただ当時の私も思っていたのですが、<strong>プログラミングスクールって高くないですか？</strong>そう思っていろいろと調べて、**専門実践教育訓練給付金**という制度を国がやっていることを知り、これを受けることで格段に安くプログラミングスクールで学習をすることができました。今回は以前の私と同様にプログラミングスクールで学習したいけれど、金銭的にちょっとという方に向けて専門実践教育訓練給付金を使って格安でプログラミングスクールに通うことについてご紹介します！

<iframe width="560" height="315" src="https://www.youtube.com/embed/NOZPz7_mYAM?si=zVE_mdEUm2Risyzz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## プログラミングスクールをお得にする専門実践教育訓練給付金とは？
専門実践教育訓練給付金とは、国が労働者の中長期的なキャリア支援する制度です。**雇用保険に加入**していた方で、一定条件を満たしていれば申請ができます。厚生労働大臣の指定するプログラミングスクールの受講が完了すると、受講者がプログラミングスクールに支払った受講料の一部がハローワークから給付金として支給されるシステムです。

### 専門実践教育訓練給付金の支給額
専門実践教育訓練給付金は受講料の80％（上限64万円）が、最大で支給されます。また支給は2段階に分かれており、以下のようになっています。

**◆支給額**
- **プログラミングスクールの受講が完了したとき**
→受講料の50％（年間上限40万円）を支給

- **プログラミングスクール修了後、1年以内に転職成功したとき**
→受講料の80％（年間上限64万円）を支給

### 専門実践教育訓練給付金の受給条件
今回は話をシンプルにするために、初めて専門実践教育訓練給付金を受給する方に絞って条件をご紹介します。2回目以降は受給条件が変わるためご注意ください。初めての給付金を受給する場合、条件は以下の2点を満たすこととなります。

**◆支給条件**

- 雇用保険に**通算2年以上**加入している方
- 在職しているまたは**離職1年以内**の方

### 専門実践教育訓練給付金を利用する注意点
専門実践教育訓練給付金の利用にあたって注意点があり、それは以下の2点です。

- 給付金を受け取るまでに時間がかかる
- 申請手続きが煩雑

[>> 注意点に関する詳しい解説はコチラをご覧ください！](https://taishi-official.com/2023/12/29/1393/#toc4)

## プログラミングスクールをお得になる専門実践教育訓練給付金の申請手順
![Procedures-for-Applying-for-Benefits.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/5e4fa3fe-425d-3bd9-4ae2-fdd6e56d9974.jpeg)
具体的な申請手順や注意点については、以下リンクにて詳しく解説しております。詳しく知りたい方は、ぜひこちらをご覧ください。

[>> 専門実践教育訓練給付金の申請手順について完全解説！](https://taishi-official.com/2023/12/29/1393/#toc5)

## 専門実践教育訓練給付金対象のおすすめプログラミングスクール
専門実践教育訓練給付金の対象となっているプログラミングスクールで、おすすめなものは以下の３つです。

- DMM WEBCAMP
- テックキャンプ

紹介した各プログラミングスクールについて、以下に個別で詳しく解説していますのでこちらをご確認ください。ちなみにですが、私は上記の中のDMM WEBCAMPに通って未経験エンジニア転職をしました。

[>> 体験談あり：DMM WEBCAMPについて徹底解説！](https://taishi-official.com/2020/04/19/324/)
[>> 30代からでも未経験転職が狙えるテックキャンプについて紹介！](https://taishi-official.com/2024/03/09/1889/)

## まとめ
今回は私が未経験からエンジニアになるにあたって、お世話になった専門実践教育訓練給付金について紹介しました。<strong>国からの支援を活用することで、エンジニアになるための本来高価な質の高いカリキュラムをお安く受講できるようになります。

この給付金を受けても高いと思われるかもしれませんが、エンジニアになってしまえば受講料くらいすぐに取り返せますので投資効果は高いです。この記事を参考に専門実践教育訓練給付金をうまく活用して、コスパ良くエンジニアを目指しましょう❗

### おまけ

https://qiita.com/taishi_will_be/items/70a8ce8938944286b487

https://taishi-official.com/learning-programming/

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- TikTok：https://www.tiktok.com/@taishi_will_be
- note：https://note.com/taishi_wii_be/

<br>

最後にいいねお願いします:thumbsup:
ELEGOO Mega 2560 (Arduino Mega互換) と MH-Z19C

# ELEGOO Mega 2560 (Arduino Mega互換) と MH-Z19C

## ArduinoとMH-Z19Cの接続

### 注意事項

[Serial Class](https://www.arduino.cc/reference/en/language/functions/communication/serial/)

> On older boards (Uno, Nano, Mini, and Mega), pins 0 and 1 are used for communication with the computer. Connecting anything to these pins can interfere with that communication, including causing failed uploads to the board.

古いボードだと0ピン/1ピン(RX/TX)使うとスケッチのアップロードに失敗することがあるよ的なことが書いてありますが、Serial.print系でプリントデバッグする場合はSerial(Serial0)に吐き出すので衝突防止のためにSerial1以降にセンサーをつないでおいたほうが安全です。


### 配線

|Mega 2560|<--->|MH-Z19C|<--->|NJM7805FA|
|-----|-----|-----|-----|-----|
|GND|<--->|<--->|<--->|Pin 2|
|||GND|<--->|Pin 2|
|||VIN|<--->|Pin 3|
|TX1(18)|<--->|RX|||
|RX1(19)|<--->|TX|||

Elegoo Mega 2560はMega互換で複数のSerial用ピンがあります。今回はSerial1(RX1/TX1)を使用します。

## コード

Arduino IDEから以下のコードを書き込みます。

```c
// Varb
const byte readCommand[] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
const size_t commandLength = sizeof(readCommand);

// setup method
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial1.setTimeout(3000);
  pinMode(LED_BUILTIN, OUTPUT);
  //
  while(!Serial1){
    ;
  }
}

// main loop
void loop() {
  // put your main code here, to run repeatedly:
  // local verb
  byte returnValue[9];
  int arrayPosition = 0;
  int Co2Value = 0;
  // send command
  Serial1.write(readCommand, commandLength);
  Serial1.flush();
  // read result
  while(Serial1.available()){
    returnValue[arrayPosition++] = Serial1.read();
    if(arrayPosition >= 9){
      break;
    }
  }
  // check
  if(returnValue[0] == 0xFF && returnValue[1] == 0x86){
    // led blink
    digitalWrite(LED_BUILTIN, HIGH);
    // execute
    Co2Value = returnValue[2]*256 + returnValue[3];
    Serial.print("Co2: "); Serial.println(Co2Value);
  }
  // 
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
}

```

### 地味にはまる恐れがある点

普通に考えると「まとめてデータを取得できる関数があるんだからそっちを使ったほうが楽」と考えて以下のようなコードを書くと思います。

```c
byte returnValue[9];
size_t returnLength = sizeof(returnValue);
Serial1.readBytes(returnValue, returnLength);
```

ところが、Serial.readBytes()で読もうとすると読めません。
読めませんというか、以下のようなフォーマットで返ってきます。

|Byte[0]|Byte[1]|Byte[2]|Byte[3]|Byte[4]|Byte[5]|Byte[6]|Byte[7]|Byte[8]|Byte[9]|
|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
|本来のByte[0]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[1]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[2]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[3]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[4]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[5]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[6]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[7]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[8]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|
|本来のByte[9]|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|ノイズ|

このまましばらく読み続けると、0xFFしか返ってこなくなります。