OmniAICreator/Qiita-1.07M huggingface dataset:
Power Platformハッカソンでの心構え・ポイント

こんにちは！
今回はPower Platformを使用した開発ハッカソンでのポイントについてご紹介します。
最近、PowerPlatformを使用して、市民開発者・初心者の方が開発を体験するイベント（ハッカソン）が増えています。

一般的なハッカソンにも共通するところがあるかと思いますが、Power Platformの担当をしている私がこの1年間で継続的にいろんなハッカソンにメンターとして参加させていただいた中で感じたことや意識したほうがいいことをまとめていますので、今回「Power Platformハッカソン」とさせていただいてます！

初めてハッカソンに参加する方や、どのように取り組んだら**充実した時間が過ごせるのか**気になる方はぜひご一読ください☺



🌟ゴールを見据えて開発スケジュールを計画！
🌟現場にこだわりすぎず、できることからやってみる！
🌟メンターへの相談時間を有効活用！
🌟自分のアプリのアピールポイントを考える！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/752064e0-86fe-1e3b-5af4-c2c55d993463.png)


# 🌟ゴールを見据えて開発スケジュールを計画！
ハッカソンは開発期間が短期(数日～数か月)で設定されていることが多いです。
ここで重要なのはすべての機能を実装する前提にするのではなく、**欲しい機能の優先順位をつけて、重要な機能から実装していくスケジュールを立てる**こと、そして、それに沿って開発する**担当者を割り当てる**ことです。

ハッカソンが始まったタイミングでは、開発時間が十分あるように感じますが、意外と一瞬で終わってしまいます。
重要な機能、後回しにしてもいい機能を取捨選択しつつ、チームでの参加であれば、機能ごとやサービス領域ごとにだれが開発するのか役割分担して、力を合わせて、取り組むことができると、限られた時間の中で最大限素敵なものが作れると思います。

また、最初に取捨選択しておくと、捨てた機能の計画自体立てなくてもよくなりますので、効率よく取り組むことができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/598c102b-3de3-bc51-1e36-0d138133d0eb.png)


# 🌟現場にこだわりすぎず、できることからやってみる！

２つ目は、現場にこだわりすぎず、できることからやってみる！です。
こちらはハッカソン以外でも重要になってきますが、
技術的に難しい現場の要件にこだわりすぎて、ほかのところができないということや、やる気がなくなってしまうということではもったいないです。
まずは機能を簡略化して、できるところから開発し、システムが動くところを見ることを目標に置いてみてください。

動くところを実際に見るとイメージができたり、やる気も出てきますので、その繰り返しでより難易度の高い、現場のニーズに合ったアプリを作成していけると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/646ac52b-0125-3c15-5bd2-4fb3dfaaf768.png)

# 🌟メンターへの相談時間を有効活用！
3つ目に、ぜひメンターへの相談時間を有効活用していただきたいです。
メンターはハッカソン参加チームのアドバイザーとして動いてくれる存在で、ハッカソン中は1、２週間に一回くらいの頻度で定期的に相談時間を設ける運用がよくあります。

定期的に直接有識者へ個別で質問できる環境が整っているというのは貴重なことで、ハッカソンならではだと思います。
自分の時間で勉強は進めつつ、相談時間にメンターへ詰まったところを相談してみて下さい。
相談日の日程を見ながら手を動かして計画的に質問したいことをまとめておくと効率的・効果的に進めることができます。
この有識者との時間を有効に使うことで、短期間であっても、学びが多い時間になると思います。

::: note warn
忙しくて、メンターへの相談時間に手を動かす時間を確保される方もいらっしゃいますが、せっかくの機会なので、できれば、ご自身でできる範囲は自習の時間をとりながら進めていただき、相談する時間ではわからないことをどんどん聞いていくことがおすすめです😉
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/968ed3b3-5572-3040-5e86-95e349999cf1.png)


# 🌟自分のアプリのアピールポイントを考える！
あとは、ハッカソンの終わりにアプリの発表会が開催されたりしますが、こちらに向けて、どういう点を自分のアプリの推しポイントにするのかを意識しながら開発できるといいと思います。
わくわく感をプラスしてみたり、高いROI効果を出せる機能を追加してみたり、デザインを凝ってみたり、いろいろあると思いますが、普段から意識しながら開発に取り組んでいると、最後の発表でも気持ちをこめて発表できると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/698949d9-9c5a-d5a6-5dd7-5e39378d1d1c.png)



# まとめ
ハッカソンを通して、皆さんには業務効率化・DXのためのソリューションを構築していただき、そのアプリ・システムを使うことで、
- 少しでも早く家に帰れるようになる
- 新しいことに挑戦する時間を作れるようになる
- もっと重要な業務に時間を割く

という世界観を実現していただきたいと思っております！

そこがもちろんPower Platformの価値であるのですが、それに加えて
「尊重し協力しあう文化」、「コミュニケーション・コラボレーション」を生んでくれるツールでもあるのかなと思っています。（私個人の意見ですが、私がPower Platform大好きな理由の一つがここにあります。）

これから始まる開発ぜひ皆さんで楽しみながら、協力しあって、コミュニケーションをとり合って取り組んでみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/14239c4c-d95f-413a-50a1-7d38846619a8.png)


ぜひハッカソンの時間、楽しんでください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f87dbbb5-211b-4e7d-fb24-d75a8ef00147.png)
AWS　クラウドプラクティショナー合格勉強法

2024年2月3日にクラウドプラクティショナーに合格しました。
この記事では合格までの勉強方法について書いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/a998354a-d9c3-67ab-1d19-25691f84eac5.png)

## かかったコスト
トータル3000円未満

・amazon kindle unlimitedで読める本

https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%90%88%E6%A0%BC%E3%81%B8%E5%B0%8E%E3%81%8F%E8%99%8E%E3%81%AE%E5%B7%BB-CloudTech%E5%88%B6%E4%BD%9C%E5%A7%94%E5%93%A1%E4%BC%9A%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-CloudTech%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E6%9B%B8%E7%B1%8D%E4%BD%9C%E6%88%90%E5%A7%94%E5%93%A1%E4%BC%9A-ebook/dp/B0B1HXPSH8

月 980円

・模試用　Udemy　

https://www.udemy.com/course/aws-4260/learn/quiz/4766842#overview

セール時で1500円

## 勉強内容

### どれくらい勉強したか？
本を３周
1周目は読み終えることを意識
2周目は試験で出てきた内容を特に重点的に
3周目は気楽な気持ちで

Udemyの講座１，２は１００％、そのほかは８０％を超えるまで勉強し続けました。
トータルの学習期間は2週間から4週間ほど。
勉強時間は感覚で30~50時間といったところでしょうか？
元々インフラの基礎的な内容を知っていたので少なくて済んでいる面があるとは思います。
そのためITに不慣れであれば40~60時間を目安にされるといいと思います。
勉強の流れは朝起きて模試をして仕事終わりに本を読む、食事や風呂などが済んでまた模試。休憩して寝る前に本を読むという流れでしょうか。
もちろん全然できなかった日もあるのであくまでうまくいった1日の流れですが。

## その他
AWSの理解のため試験突破だけを目的とした問題傾向の把握などをせず、ざっくばらんにこんなサービスがあるんだと半ば感心しながらの勉強でした。
もちろん1度で覚えられない概念や用語もあったのでそこは模試を何度もこなすことにより感覚的に覚えていきました。
勉強の際にはXに学んだことを投稿するやり方をとっていました。
誰かが見える箇所に内容を投稿するので自然と文言を整えようという意識が出ますし、あとから見返した時に小さな勉強の記録は自信にもつながります。

## 最後に
受験するだけで結構な費用がかかりますし、極力コストを抑えた方法を提示いたしました。
この内容が読んでくださった方のためになれば幸いです。
Kali Linuxのターミナルでコマンドを打つ時にサジェスチョンがうざい

[シェル(zshなど)の変更方法について](https://qiita.com/umeekaede/items/3af8561cb01cbe1b0651)を参考にしてシェルを/bin/bashに変えれば解決
最初のシェルでも設定を変えればサジェスチョンが出なくなるが、面倒くさいのでこの方法をとった
また、シェルが切り替わらない時はKaliを再起動すればたぶん反映される
YOLOの家系図（2024）


## 概要

[YOLO Unraveled: A Clear Guide](https://www.opencv.ai/blog/yolo-unraveled-a-clear-guide?utm_source=reddit&utm_medium=article&utm_campaign=yolo)を読み解いていき、それぞれの違いや特徴を把握し、業務に活かせるレベルで知見を得る


## YOLOの家系図（2024）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/bf6db90b-1754-7cdc-d3b0-7061922667d3.png)

:::note info
本家はJoseph RedmonのYOLOV1
:::


### ライセンスの観点


> Understanding the license of a model is important. Models with licenses that allow commercial use are marked in green, and those that prohibit such use are marked in red. This knowledge is essential for developers to ensure that the use of the model is legally valid, especially for commercial purposes.

と記載があり、緑色は商用利用が可能らしい。が、記事の
画像で緑色のライセンス該当部分が見当たらず。

主要なフレームワークを表にしてみる。

|model|year|license|url|
|-|-|-|-|
|YOLOX|2021|APACHE|https://github.com/Megvii-BaseDetection/YOLOX|
|PP-YOLOE|2022|APACHE|https://github.com/Gaurav14cs17/YOLOE|
|DAMO YOLO|2023|APACHE|https://github.com/tinyvision/DAMO-YOLO|
|YOLO V6|2023|GPL|https://github.com/meituan/YOLOv6|
|YOLO V7|2022|GPL|https://github.com/WongKinYiu/yolov7|
|YOLO V8|2023|AGPL|https://github.com/ultralytics/ultralytics|
|YOLO NAS|2023|CUSTOM|https://github.com/Deci-AI/super-gradients|



## YOLO系のCOCOの成績

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/44783439-1e11-a052-d844-3f7ed21c91c4.png)

10msで100FPSなので、30FPS目標値であればこの表に載っているモデルは全て問題なく使用できそうである。60FPS出したければAIモデル以外の処理速度を考えると6ms以下のモデルを選択する必要がありそう。DAMO-YOLOというのが精度的にはかなり良さそう。ライセンスもAPACHEであるし、かなり有用そう。次に良さそうなのは、YOLO V8。[YOLO V8のライセンス](https://github.com/ultralytics/ultralytics?tab=readme-ov-file#license)に読解力を必要としており、一癖はありそうだけれども、商用利用はできるらしい。この表で1番芳しくなさそうなのがYOLO V5とYOLOX。これらは少し古いのかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/7f07263a-abf7-ebab-85b2-9f05b8b1aaa0.png)

エッジデバイスでYOLOを使用する場合は、軽量なモデルが好まれる。INT8での精度を見てみると、YOLO-NAS-INT8系の成績がかなり良い。時点で黄色のYOLO V6 3.0の成績が良さそう。

[YOLO-NAS](https://github.com/Deci-AI/super-gradients)は2024-02-07時点ではAPACHE-2.0ライセンスと記載がありますが、LICENSEページがリンク切れを起こしているので使用する際は念のため確認する必要がありそう。

![Screenshot 2024-02-07 at 22.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/a01d7278-9fd7-747d-af22-4bab381bcb56.png)


## MMYOLOに掲載されているかどうか

[mmyolo](https://github.com/open-mmlab/mmyolo)にてモデルが使える状態であれば、比較や実装の難易度が下がるが、DAMO YOLOやYOLO NASはopen-mmlabにて使える状態ではないので、個々のリポジトリから実装する必要がありそう。

|model|year|license|MMYOLO|
|-|-|-|-|
|YOLOX|2021|APACHE|yes|
|PP-YOLOE|2022|APACHE|yes|
|DAMO YOLO|2023|APACHE|no|
|YOLO V6|2023|GPL|yes|
|YOLO V7|2022|GPL|yes|
|YOLO V8|2023|AGPL|yes|
|YOLO NAS|2023|CUSTOM|no|


## 結論
- 現時点(2024.02)でライセンス的にはDAMO-YOLOが良さそう
- YOLOXは若干古くなってきており、モデルのアップデートを検討しても良い時期らしい
- YOLO V6も良さそうだけれどもライセンスがGPLなので商用利用はネガティブ
- エッジデバイスで使用する場合は、YOLO-NAS（ライセンス要確認）やYOLO V8などが良さそう
- COCOの成績やLatencyだけではなく、個々のモデルの学習手法やネットワーク構造をもう少し深めていく必要あり
Kali Linuxで「E: Unable to locate package」が発生した際の対処法

[Kaliの公式ページ](https://www.kali.org/docs/general-use/kali-linux-sources-list-repositories/)を参考にしてブランチを切り替えた後に、下のコマンドによってパッケージリストを更新すれば解決した
```
$ sudo apt update
```
このコマンドについては「[sudo apt-get update と sudo apt-get upgrade の違いは何ですか?](https://note.com/yutaworklife/n/n83feff4763cc)」を参照
Python リスト内包表記の書き方

 最近Pythonについて勉強していて、リスト内容表記が便利だったので備忘としてまとめます。

 # 基本形

リスト内包型表記の基本形は以下です。

```py
new_list = [new_item for item in list]
```

一言で簡単に説明すると、

「`list`の1つ1つの要素を`item`として取り出し、新要素`new_item`として`new_list`に追加する。」

という感じです。


例としては、リスト内包表記を使わず以下のように書いていたプログラムを

```py
list = [1, 2, 3]
new_list = []
for item in list:
    new_item *= 2
    new_list.append(new_item)
    # new_list = [2, 4, 6]
```

以下のように簡潔に書くことができます。

```py
list = [1, 2, 3]
new_list = [item * 2 for item in list]
# new_list = [2, 4, 6]
```

ちなみにリストだけでなく文字列でも使うことができ、
文字列の場合は先頭から1文字1文字取り出して処理することができます。

# ifとの組み合わせ

リスト内包表記は`if`と組み合わせることができます。
`if`と組み合わせることで、元となるリストから取得する要素をフィルタできます。

書き方は以下です。

```py
new_list = [new_item for item in list if condition]
```

例として、リスト内包表記を使わず以下のように書いていたプログラムを

```py
list = [1, 2, 3, 4]
new_list = []
for item in list:
    if item % 2 == 0:
        new_item *= 2
        new_list.append(new_item)
        # new_list = [4, 8]
```

以下のように書くことができます。

```py
list = [1, 2, 3, 4]
new_list = [item * 2 for item in list if item % 2 == 0]
# new_list = [4, ８]
```

---

一旦以上ですが、
`if else`のあわせ技や、タプルで使えたりもするようなので
それら今後追記したいと思ったことがあれば追記します。

---

【宣伝】
Next.jsを使って技術系ブロクを作りました。
めちゃくちゃのんびり投稿しているので記事は少ないですが、よかったら見てやってください。
こちら
↓
https://www.nattomatofu.com/
【Swift】摂氏と華氏を切り替える

# はじめに
摂氏・華氏の切り替えを実装しようとするとめんどそうです。
そこで、用意されているMeasurementを使用します。
これは色々な単位の計算をコネコネしてくれてめっちゃ便利です。

今回はその例で摂氏・華氏を実装してみようと思います。
私たち日本人がよく触れる温度の単位は摂氏です。

摂氏20℃は、華氏何°Fでしょう？と言われても全然わかりません。

なので[こちら](https://kunisan.jp/gomi/sesshi_kashi.html)のツールを使用させてもらいます。

![スクリーンショット 2024-02-07 22.02.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e0b12a33-1c64-c920-56c0-f47a477cb372.png)

摂氏20℃は、華氏68°Fらしいです。

ではiOSではどのように実装したらこの変換ができるでしょうか
実装してみます。

# サンプルアプリ
いい感じですね。
四捨五入すれば、先ほど使用したツールと同じ結果になります。
![Simulator Screen Recording - iPhone 15 - 2024-02-07 at 22.01.18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d19ac598-1103-f977-9985-982ac0cee0e5.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    // 現在表示している温度単位
    @State private var unit: UnitTemperature = .celsius
    
    // 摂氏20℃（これを摂氏や華氏に切り替えられるようにしたい）
    private var temperature = Measurement(value: 20.0, unit: UnitTemperature.celsius)
    
    var body: some View {
        VStack {
            Picker("温度単位", selection: $unit) {
                Text("摂氏").tag(UnitTemperature.celsius)
                Text("華氏").tag(UnitTemperature.fahrenheit)
            }
            
            Text(temperature.converted(to: unit).description)
        }
    }
}
```

# おわり
`Measurement`便利ですね
他の単位でも使ってみたいです
【Python】複数のJSONファイルを一つのJSONファイルにする方法を2つ紹介（os / globモジュール）

# 概要
大量のJSONファイルを一つにまとめる、ということが必要になったのでPythonで実装しました。

ここでは2つの方法（`os`モジュールと`glob`モジュール）を紹介します。

# サンプルコード２種
以下の2つ、どちらのコードでも、複数のJSONファイルを一つのJSONファイルにできます。

- 1つ目の方法(`os`モジュール利用)
- 2つ目の方法（`glob`モジュール利用）

## 1つ目の方法(`os`モジュール利用)

```py
import json
import os

def combine_json_files(input_folder, output_file):
    combined_data = []

    # フォルダ内の各JSONファイルを処理
    for filename in os.listdir(input_folder):
        if filename.endswith(".json"):
            file_path = os.path.join(input_folder, filename)

            # JSONファイルを読み込み
            with open(file_path, 'r', encoding='utf-8') as file:
                data = json.load(file)
                combined_data.append(data)

    # 結合したデータを出力ファイルに書き込み
    with open(output_file, 'w', encoding='utf-8') as output_file:
        json.dump(combined_data, output_file, indent=4, ensure_ascii=False)

# 入力フォルダと出力ファイルの指定
input_folder = "./raw_json_files"
output_file = "./combined_file/combined_data.json"

# JSONファイルを結合
combine_json_files(input_folder, output_file)
```

`input_folder`ディレクトリに大量のJSONを置いて、このディレクトリと同階層にあるファイルを実行します。
結合されたJSONは`output_file`に生成されています。

こちらは主に`os`モジュールを利用してディレクトリ内のファイルを操作しています。
例えば、`os.listdir()`によって対象ディレクトリ内を指定し、その中のファイルが`.json`で終わるかどうかを確認しています。

## 2つ目の方法（`glob`モジュール利用）

```py
import json
import glob

json_dir = "./raw_json_files"
output_file = "./combined_file/combined_data.json"

data = []

# ディレクトリ内の全てのJSONファイルを読み込む
for json_file in glob.glob(f"{json_dir}/*.json"):
    with open(json_file, 'r') as f:
        data.append(json.load(f))

# 結合したデータを新しいJSONファイルに保存
with open(output_file, 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)
```

こちらは`glob`モジュールを使用してパターンにマッチするファイルを探す方法です。
`json`を探す場合、`glob.glob(f"{json_dir}/*.json")`という方法で可能です。一つ目よりだいぶ簡潔になりますね。

`glob`モジュールとは、指定されたパターンに一致するファイルのリストを取得するためのPythonの標準ライブラリで、`glob.glob`はその関数です。

> glob モジュールは Unix シェルで使われているルールに従い指定されたパターンに一致するすべてのパス名を見つけ出します
> 引用元：[glob --- Unix 形式のパス名のパターン展開](https://docs.python.org/ja/3/library/glob.html)


例えば、`raw_json_files`ディレクトリ内に以下のようにあるとします。

```
raw_json_files
├── apple.json
├── banana.json
└── lemon.json
```

この時、以下のコードを実行すると結果は以下の通り。

```py
import glob

json_dir = "./raw_json_files"

json_files = glob.glob(f"{json_dir}/*.json")
print(json_files)
# ['./raw_json_files/apple.json', './raw_json_files/banana.json', './raw_json_files/lemon.json']

for json_file in json_files:
    print(json_file)

# ./raw_json_files/apple.json
# ./raw_json_files/banana.json
# ./raw_json_files/lemon.json
```

上記を見てわかるように、指定されたパターンに一致するファイルパスのリストを返すことがわかります。リストなので`for`ループで中身を取り出すことができますね。
PowerShellのwingetコマンドでシェルが動かなくなるわ、MicrosoftStoreで更新できないわで難儀した話

# 今回困ったこと
- PowerShellの`winget`コマンドに不具合があって動けない。
- `winget`コマンドをアップデートして対処しようにも、社内プロキシとセキュリティポリシーでMicrosoft Storeが使えない。

# 俺の顔も青くなった。
PowerSellにおけるパッケージ管理コマンドとして`winget`がありますが、アプリのキッティングを実行しようとすると、下記の画像のようにシェルの文字色が青くなるだけで何も応答しないという不具合がありました。
PowerShellのアイコンもぐるぐる回転して、なんらかの処理がずっと走るようになります。ろくでもないことが起きてることは確かですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238406/50b7ba56-84e2-cdcb-7591-712bd8e1a254.png)

### 環境
- Windows11
- PowerShell 5系

# なんでなん？
https://github.com/microsoft/winget-cli/issues/3741

調べて回った結果、どうやらWindows11 22H2のリリースから`winget`のCDNの参照先が無効化される不具合が発生してた模様です。
バージョン`1.2`系のみに見られる現象とのことで、アップデートすれば改善できるとのことです。

````
 >winget -v
 v1.2.10691
````
`winget`のバージョンを確認してみたら、ちょうど不具合の対象になっていました。

# またしてもプロキシが邪魔をする。
wingetコマンド自体はMicrosoft Storeでアップデートが可能ですが、残念ながらここは職場。セキュリティポリシーによってMicrosoft Storeが使えません。なんてこったい。
というわけでPowerShell上でMicrosoftのリポジトリから最新版を引っ張ってきてサイレントインストールを敢行します。
PowerShellのプロキシ認証は既に設定済みとします。設定方法はこちら。

https://qiita.com/kztktr/items/e3a75cd4a06190100180

# 作業手順
- リポジトリから最新版のwingetをダウンロード

https://github.com/microsoft/winget-cli

上記リポジトリから最新安定版の`Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle`をダウンロードします。

https://github.com/microsoft/winget-cli/releases/tag/v1.6.3482

今回はバージョン1.6です。

- PowerShellを管理者で起動<br>
- ダウンロードしたmsibundleファイルのパスをコピー
- `Add-AppPackage`コマンドでインストール
```
Add-AppPackage -Path "msibundleのファイルパス"`
```

- 問題無くインストールできたかバージョン確認
```
 winget -v
 v1.6.3482
```

やりましたね。
あとはアプリのキッティングを行って想定通りの挙動をするか確認しましょう。
[VSCode] the remote host may not meet vscode server prerequisites for glibc and libstdc++




2024年1月にあったVSCodeのアップデート(v1_86)によりssh接続不良。VSCode上からのssh接続をした際以下のメッセージが出現

the remote host may not meet vscode server prerequisites for glibc and libstdc++

以下のステップで対処した
1. 以前のバージョンをhttps://code.visualstudio.com/updates/v1_85. からダウンロード。この操作では、現在のバージョンを自動的にリプレースするため、アンインストールする必要はありません
2. ダウンバージョンにより、Extentions(拡張機能）の中で、無効になっているもの（例えばRemote-SSHなど）がある。これらを、Switch to pre-release Versions(以前のバージョンに変更）によって有効化。
3. VSCodeの設定から、自動アップデートを無効にする
4. VSCodeを再起動する

（ステップ3に関しては、v1_86に自動的にアップデートされることを防ぐ目的で行っている。）

参考ページ
https://github.com/microsoft/vscode/issues/177963
sig_atomic_t型について

---
<font color="Tomato">sig_atomic_t</font>型について
---

**鉄腕**

　鉄腕アトムと聞くと高田馬場駅を思い出されます。

なぜかは調べてみてください。

ラララ~ ラララ~ ラララ~

**目次**
- [1. sig_atomic_tとは](#1-sig_atomic_tとは)
- [2. volatileとの関係](#2-volatileとの関係)
- [3. コード例](#3-コード例)
- [4. おわりに](#4-おわりに)

## 1. sig_atomic_tとは

　`sig_atomic_t`は、C言語（およびC++）で使用される特別なデータ型で、シグナル処理の文脈でのアトミック（不可分）操作を保証するために設計されています。

　この型は、`<signal.h>`（C言語）または`<csignal>`（C++）ヘッダファイルで定義されています。`sig_atomic_t`型の変数への読み書きは、シグナルハンドラとプログラムの他の部分との間で、割り込みが入らずに一つの操作で完了することを保証します。

　わかりやすく書くと『シグナルを受け取った時に、安全に読み書きができる特別な種類の変数』という意味です。

<br>

<font color="low blue">**sig_atomic_tの単語の意味**</font>

　`sig_atomic_t`の名前は、「Signal Atomic Type」の略です。
 
「Signal」は、この型がシグナル処理の文脈で使用されることを指します。

「Atomic」は、「分割不可能な」や「一つの単位として扱われる」という意味で、`sig_atomic_t`型の変数への読み書きが途中で割り込まれることなく、一連の操作として完結することを意味しています。

　つまり、sig_atomic_t型の変数に対する操作は、中断されることなく始めから終わりまで安全に行われることが保証されています。
 

> 参考
[man sig_atomic_t](https://programming-place.net/ppp/contents/c/appendix/reference/sig_atomic_t.html)



## 2. volatileとの関係

　`volatile`型修飾子は、プログラミング言語（特にCやC++）において、変数が予期せずに変更される可能性があることをコンパイラに伝えるために使用されます。

　この型修飾子が変数に適用されると、コンパイラはその変数の値がいつでも変更され得ると仮定し、その変数に対する読み込みや書き込み操作を最適化しないようにします。

 　つまり、プログラムがその変数を使用するたびに、コンパイラは直接メモリからその値を読み取るか、または直接メモリに値を書き込むようにします。
 
> 参考
[volatile](https://www.ibm.com/docs/ja/i/7.1?topic=ssw_ibm_i_71/rzarg/volatile_type_qualifier.html)


<font color="low blue">**volatileの単語の意味**</font>

　`volatile`は「揮発性のある」や「不安定な」という意味ですが、プログラミングの文脈では「予期せずに変更されうる変数」という意味で使われます。

<font color="low blue">**volatileとsig_atomic_tの関係**</font>

　sig_atomic_t型の変数は、シグナルハンドラとプログラムの他の部分との間で安全にデータをやり取りするために設計されています。
 
 　一方で、volatile型修飾子は、その変数が予期しない方法で変更されうることを示すために使用されます。
  
　シグナルハンドラ内でsig_atomic_t型の変数を使用する際にvolatile型修飾子を併用することは、その変数がシグナル処理によって予期せず変更され得るという事実をコンパイラに伝え、適切な読み書き操作が行われるようにするために有効です。


| 特性/役割 | `volatile` | `sig_atomic_t` |
|---------|------------|---------------|
| **目的** | コンパイラに変数が予期せずに変更され得ることを通知する。 | シグナル処理中の変数への読み書きが一回の操作で完了することを保証する。 |
| **役割** | 最適化による読み書きの省略を防ぎ、毎回直接メモリから値を読み書きするようにする。 | シグナル処理と通常のプログラム実行の間でのデータの安全なやり取りを確実にする。 |
| **使用シーン** | - 外部イベントや割り込みによる更新<br>- マルチスレッド環境での変数共有<br>- ハードウェアからのデータ読み取り | - シグナルハンドラ内で使用する変数<br>- シグナル処理と通常のプログラム実行間のデータ共有 |
| **コンパイラ最適化** | 最適化を抑制し、変数の読み書きを直接行う。 | 特に指定なし（型自体は最適化の抑制ではなく、操作のアトミック性を保証）。 |
| **例** | `volatile int flag;` | `sig_atomic_t flag;` |


<font color="low blue">**まとめると**</font>


**`volatile` ＋ `sig_atomic_t` ＝ 安全かつ予期せず変更され得る変数の、安定した扱いをする型。**

です。

## 3. コード例



```c
#include <signal.h>
#include <stdio.h>

volatile sig_atomic_t flag = 0;

void signal_handler(int sig) {
    flag = 1;
}

int main() {
    signal(SIGINT, signal_handler);

    while (!flag) {
        // メインループの処理を続ける
    }

    printf("SIGINT received, exiting.\n");
    return 0;
}
```


　この例では、SIGINT（通常はCtrl+Cによって生成される）シグナルを受け取ると、flag変数が1に設定され、プログラムが終了するまでのループを抜けることができます。
 
 　flagがvolatile sig_atomic_t型であることにより、シグナルハンドラ内でのこの変数への書き込みが安全に行われることが保証されます。

## 4. おわりに

　あんまりよくわかってなかったので、理解できてよかったです。

 正直これ外したから、バグったという経験がないので、もしもコードバグるコード例があればコメントに書いていただけると助かります。
Replicate にサインインする & API キーを発行する


## はじめに

この記事では、 Replicate の利用を開始するための準備手順を説明します。


<!-- ../parts/replicate/about.md -->
## Replicate とは？

[![image](https://i.imgur.com/R4kKcAZ.png)](https://replicate.com/)

https://replicate.com/

- オープンソースなモデルの実行環境で、数千のモデルを利用可能
- APIが提供されており、機械学習やPythonの知識がなくても自身のアプリに組み込むことができる
- カテゴリや人気順などでモデルを探すことができる

![image](https://i.imgur.com/u1c4mhk.png)

### 価格

[Replicate](https://replicate.com/) を利用するのにかかる金額はマシンのスペックと実行時間によって決まります

https://replicate.com/pricing

![image](https://i.imgur.com/Km1qpzA.png)

> 計算例
>
> CPUのマシンで1分間実行した場合
> `$0.000100/sec x 60sec = $0.006 ≒ 0.882円`
>
> ※$1=147円で計算
> ※2024/02/07時点の情報
> 価格が変わっているがあるので詳細は必ず公式ページをご確認ください。



<!-- ../parts/replicate/registration.md -->
## Replicate の利用準備

### ゴール

- [ ] Replicate にサインインできていること
- [ ] クレジットカードの登録が完了していること
- [ ] API キーをコピーできていること

### 事前準備

- GitHub アカウント作成
  - 参考：[Creating an account on GitHub](https://docs.github.com/ja/get-started/start-your-journey/creating-an-account-on-github)
- クレジットカード

### Replicate にサインインする

#### 操作

- https://replicate.com/signin?next=/ を開く
- `Sign in with GitHub` を選ぶ
- ダッシュボードが表示されれば OK

#### イメージ

![image](https://i.imgur.com/Ibxaw28.png)

![image](https://i.imgur.com/ekFC5yr.png)

### クレジットカードを登録する

#### 操作

- https://replicate.com/account/billing を開く
- `Manage Billing` を選ぶ
- `支払い方法を追加` を選ぶ
- クレジットカード情報を入力して、`追加` を選ぶ
- 支払い方法が表示されれば OK

#### イメージ

![image](https://i.imgur.com/itzCq4s.png)

![image](https://i.imgur.com/Pb0AyqG.png)

![image](https://i.imgur.com/pMtyhDM.png)

![image](https://i.imgur.com/tXfye59.png)

### API キーを発行する

⚠ 悪用される危険があるので API キーは他の人に知られないようにしましょう ⚠

#### 操作

- https://replicate.com/account/api-tokens を開く
- `Token name` を入力し、 `Create token` を選ぶ
  - `Token name` は何でも OK です
- コピーボタンを選ぶ
  - 後で使うのでメモ帳などに貼り付けておきましょう
- `r8_******` のような文字がコピーできていればOK

#### イメージ

![image](https://i.imgur.com/YNhNtHK.png)

![image](https://i.imgur.com/0WW3avP.png)
モノレポで開発時にESLintがうまく効かない時

に、試すべきこと。

# 事象
プロジェクトにTailwind CSSと併せてESLintのプラグインである[eslint-plugin-tailwindcss](https://github.com/francoismassart/eslint-plugin-tailwindcss)を導入したが、独自クラスとして定義したカラーパレットのクラスを使うと警告が出てしまうという事象が発生。

```frontend/tailwind.config.ts
const config: Conifg = {
  ...
  theme: {
    extend: {
      colors: {
        'my-white': '#ffffff',
        ...
      }, 
    },
  },
  ...
}
```

```frontend/.eslintrc.json
{
  "extends": [
    ...
    "plugin:tailwindcss/recommended",
    ...
  ],
  ...
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505169/b7e8c87f-53da-9cb5-a3e8-09f02f260913.png)

`Classname 'bg-my-white' is not a Tailwind CSS class! eslint(tailwindcss/no-custom-classname)`ということで、独自に定義した`my-white`が読み込めていない様子。
画面で見ると色は正しく反映されているのでlint側の問題のはずだが、whitelistの追加やconfigファイルのパス指定などを試しても警告が消えない。

# 原因
モノレポ、つまりプロジェクトのroot直下に`frontend` `backend`のようなディレクトリを切っており、かつrootディレクトリでVSCodeを開いた場合、eslintが正しく読み取れない場合がある。そんな時は対象のパス指定が必要。

```.vscode/settings.json
{
  "eslint.workingDirectories": ["./frontend"]
}
```

今回の`eslint-plugin-tailwindcss`の場合は下記設定でもOK。
```frontend/.eslintrc.json
{
  ...
  "settings": {
    "tailwindcss": {
      "config": "./frontend/tailwind.config.ts"
    }
  }
}
```

これで無事警告が消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505169/240ff16a-cc3b-db21-c978-477b448b6091.png)

configでパス指定をする際、`.eslintrc.json`と`tailwind.config.ts`が同じ階層にあるので`"config": "./tailwind.config.ts"`と書きたくなってしまうが、rootからのパスを記述しないと読み込めないため注意が必要（これでハマった）。

# 参考

https://github.com/microsoft/vscode-eslint/issues/1706#issuecomment-1785746444

https://zukucode.com/2020/10/eslint-vscode-subdirectory.html
PubMedID(PMID)を指定して引用文献一覧のPMIDのリストを取得する

### 目的： 論文のPubMedID(PMID)を指定して、その参考文献一覧のPMIDのリストを取得したい。
レビュー論文を読んでいると、引用文献の各原著論文を確認するにあたり、それらのPDFファイルをすべて取得したい場合がある。PubMedのページで引用文献の一覧をリンク付きで表示できるのだが、PMID一覧で表示するオプションがない（PubMedでの検索結果をPMIDで表示するオプションはある）。いちいちリンクをたどるのは面倒なので、引用文献のPMID一覧を取得できれば、EndNoteなどの文献管理ソフトで引用文献のPDFファイルを自動で取得することが簡単にできる。
#
### 解決法：対象論文のPubMedページをスクレイピングしてPMID一覧を取得する。
#
### Step 0. 準備
Pythonでは、以下のライブラリをインストールしておく。
・bs4
・requests
・numpy 

Beautiful Soupの詳細は以下を参照。

https://www.crummy.com/software/BeautifulSoup/

Requestsの詳細はこちら。

https://requests.readthedocs.io/en/latest/#

Rでは、以下のパッケージが必要
・rvest
・tidyverse

rvestの詳細は以下を参照。

https://rvest.tidyverse.org

tidyverseの詳細はこちら。

https://www.tidyverse.org

必要に応じてプロキシの設定をしておく。

### Step 1. スクレイピング
ここでは文献PMID:36960167の引用文献のPMID一覧をダウンロードする場合を考える。

https://pubmed.ncbi.nlm.nih.gov/36960167/

### Pythonバージョン
```python:get_ref_pmid.py
import re
import requests
from bs4 import BeautifulSoup
import numpy as np 

pmid = '36960167' #your_target_PMID

print("Getting reference PMIDs in the paper PMID:" + pmid)
url = 'https://pubmed.ncbi.nlm.nih.gov/' + pmid + '/references/'
response = requests.get(url)
# If your envirnment uses proxy, "verify=False" is required.
# response = requests.get(url, verify=False)
response.encoding = response.apparent_encoding

bs = BeautifulSoup(response.text, 'html.parser')

# Extract <a>tag containing "PubMed" as a content
pubmed_tag_list = []
for i in bs.find_all("a"):
    if re.search('PubMed', i.text):
        pubmed_tag_list.append(i)

# Extract PMIDs as integer
pmid_number_list = []
for i in pubmed_tag_list:
    pmid = i.get('href').strip('/')
    pmid_number_list.append(int(pmid))

np.savetxt("pmid_number_list.csv", pmid_number_list, delimiter =",", fmt="%.0f")

print("Reference PMIDs in the paper PMID:" + pmid + " were saved!")
```
Proxy環境によっては、`requests.get()`にSSL認証を無視するための`verify=False`の設定が必要となる。
For文を使わずにpandaのDataFrameを使ってPMIDの抽出を行いたかったのだが、Beautiful Soupオブジェクトの構造解析が面倒くさかったので、パス。
Pythonのデフォルトのライブラリを使って保存するとファイルのopen/closeが面倒くさいので、検索結果を整数に変換してnumpyでCSVファイルとして保存した。

### Rバージョン
```r:get_ref_pmid.R
library(rvest)
library(tidyverse)

pmid = 36960167 #your_target_PMID
print(paste("Getting reference PMIDs in the paper PMID:",pmid))
url = paste('https://pubmed.ncbi.nlm.nih.gov/', pmid, '/references/', sep="")

html <- read_html(url)

ref_link_text <- html %>% html_elements("a") %>% html_text(trim = TRUE)
ref_link <- html %>% html_elements("a") %>% html_attr("data-ga-action")

ref_df <- data.frame(ref_link_text, ref_link)
result_df <- ref_df %>% filter(ref_link_text == "PubMed") %>% select(ref_link)
write.table(result_df, "pmid_number_list_r.csv", row.names = F, col.names = F, sep = ",")

print(paste("Reference PMIDs in the paper PMID:",pmid, "were saved!"))
```
行名と列名を出力したくなかったので、`write.csv`ではなく`write.table`を使用している。


**注意：** 当然、PMIDがない文献は取ってこれないので、その場合はマニュアルで。
Google Colaboratory で Google Material icons が使いたい！

## 背景

- Google Colaboratory の使い方をノートブックのテキストセルに書いている
- Colaboratory の UI の アイコンを Google Material icons を使って表現したい

## 問題点

- Colaboratory のテキストセルでは一部の HTML タグは使えるが、外部リソースの読み込みはできない (Googleどうしなのだから読み込ませてほしい…)
- Colboratory で使える絵文字の中に Google Material icons が見当たらない。

## 解決策

SVG をダウンロードしてきて画像として挿入。

https://fonts.google.com/icons

すきなアイコンを選んで右下の 📥 SVG をクリックでダウンロード。
Colaboratory のテキストセルに埋め込む。

終わり！
Reactで冗長なpropsをまとめる

chakra-uiなどのuiライブラリを使ってUIを作っていると、スタイリング用のpropsが冗長になったりする。

テーマいじったりコンポーネント化したりできればいいけど、そこまではしたくない・・・みたいなとき
```tsx
    <Text fontSize="0.875rem" fontWeight={400}>hello world1</Text>
    <Text fontSize="0.875rem" fontWeight={400}>hello world2</Text>
    <Text fontSize="0.875rem" fontWeight={400}>hello world3</Text>
```


以下の`textStyles`のような定数を定義しておき`getTextStyles`で取得してスプレッド演算子で展開する。
それっぽい名前をつけてその粒度でコンポーネントのスタイル設定しておけば、変更も容易だし、grepで影響範囲もわかるから良さそうだと思った。

```tsx
const textStyles = {
    "text-md": {
        fontSize: "0.875rem",
        fontWeight: 400,
    }
} as const;

type TextStyles = keyof typeof textStyles;

function getTextStyles(name: TextStyles) {
    return textStyles[name];
}

function App() {
    return (
        <>
            <Text {...getTextStyles("text-md")}>hello world1</Text>
            <Text {...getTextStyles("text-md")}>hello world2</Text>
            <Text {...getTextStyles("text-md")}>hello world3</Text>
        </>
    )
}
```

他に良い方法あったら教えてほしいです。

---

chakra uiだったらdefineStyleを使うと型がついて補完されて良い。

```tsx
const textStyles = {
    "text-md": defineStyle({
        fontSize: "1rem",
        // ここ入力するときに補完される
    })

}
```
---

一応Chakra uiにはtextStylesやlayerStylesといった似たような機能が備わっている。
https://chakra-ui.com/docs/styled-system/text-and-layer-styles
```tsx
const theme = extendTheme({
    textStyles: {
        "text-md": {
            fontSize: "0.875rem",
        },
    },
});

function Page() {
    return (
        <Box textStyle="text-md">hogehoge</Box>
    )
}
```

ただし、これはButtonやHeadingなどのスタイルを上書きできない。BoxやFlex, Textなどのstyled-systemのコンポーネントにしか適用できない。


```tsx
// これは反映されない
<Button textStyle="text-md"></Button>
```
監視テストの異常状態の再現方法

# 監視テストの異常状態の再現方法

監視テスト時の異常状態の再現方法ですね。ツールを使用せずLinux標準コマンドで出来る方法だけを記載してます。

## 0. 目的

初心者で監視の試験を実施したいが、異常状態を再現させる手段が分からない方は参考にしてください。

## 1. リソース

### 1.1. CPU

CPU使用率を監視対象としている場合は、以下コマンドにて異常な状態を再現して監視異常を検知しアラートを出すことを確認してください。リソースの使用状況は`vmstat`などで確認してください。

```
yes > /dev/null &
```

※リソースの状況を見つつ複数回実行してください。
いきなり、いくつも実行するとCPU使用率が100%となり、まったく応答しなくなることもあるので、注意すること。
終了したらプロセスをkillするのも忘れないようにしてください。(特にAWSなどのクラウドは)

### 1.2. Memory

Memory使用率を監視対象としている場合は、以下コマンドにて異常な状態を再現して監視異常を検知しアラートを出すことを確認してください。リソースの使用状況は`vmstat`などで確認してください。

```
/dev/null < $(yes)
```

※リソースの状況を見つつ複数回実行してください。
これもいきなり、いくつも実行するとメモリ使用率が100%となり、まったく応答しなくなることもあるので、注意すること。

### 1.3. Disk

Disk使用率を監視対象としている場合は、以下コマンドにて異常な状態を再現して監視異常を検知しアラートを出すことを確認してください。

```
dd if=/dev/zero of=/dummy bs=[バイト数] count=[個数]
```

※リソースの状況を見つつ複数回実行してください。
これもいきなり、使用率100%を超えるファイルを作成してしまうと
/var/logのようにログが出力できなくなりシステム停止する場合があります。アラートが出力する容量に留めておくこと。

## 2. プロセス

### 2.1. プロセス

プロセスを監視対象としている場合は、Linuxのサービスを停止するコマンドを実行しプロセスがなくなった状態を再現して監視異常を検知しアラートを出すことを確認してください。

RHEL7系の場合

```
systemctl stop [サービス名]
```

また、Apacheのように複数プロセスが起動する場合はサービス停止コマンドでは全てのプロセスが停止してしまうので、個別に停止してください。
また、自動で再起動するミドルウェアも存在しますが、その場合は監視タイミングに上手くひっかかるように何度も停止してください。

```
kill -9 [プロセス番号]
```

## 3. ログ

### 3.1. システムログ

システムログを監視対象としている場合は、以下コマンドにて異常な状態を再現して監視異常を検知しアラートを出すことを確認してください。

```
logger -ip [facility].[priority] [message]
```

[message]の内容は、なるべく想定しているメッセージをそのまま記述してください。
ログ監視の場合、正規表現で監視していることが殆どだと思いますので、それに合ったメッセージにすることも留意してください。

### 3.2. その他ログ

システムログ以外のログを監視対象としている場合は、以下コマンドにて異常な状態を再現して監視異常を検知しアラートを出すことを確認してください。

```
echo "[監視対象メッセージ]" ›› [ログファイル名]
```

※ログファイルに直接リダイレクトすると不具合が出てしまうミドルウェアも存在しますので、プロセスを停止状態で実施してください。まリダイレクトを1つしか付けず過去のメッセージを全て消してしまうリスクもあるので事前にバックアップも取得しましょう。また、ログローテーションのタイミングにかち合わないように実施するタイミングも気を付けましょう。

## 4. ノード

### 4.1. ノード

ノードを監視対象としている場合は、以下コマンドにて異常な状態を再現して監視異常を検知しアラートを出すことを確認してください。

```
shutdown -h now
```

※環境によっては、テスト終了後の電源オンが困難な場合でリモートコンソールが使える場合はサーバのネットワークインターフェースをダウンさせるなどしてください。

## 5. SNMP

### 5.1. SNMP

SNMPを監視対象としている場合は、以下コマンドにて異常な状態を再現して監視異常を検知しアラートを出すことを確認してください。

```
snmptrap -v [version] -c [community name] [Manager IPaddress] [OID]
```
SwiftUI 等幅フォントについての備忘録


本稿は、SwiftUIに限らず Storyboardを使用した場合でも当てはまり、
iOS / macOS とも共通の内容である。

# 等幅フォントの見た目

![fixedFont.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/47ef6020-eb91-62e4-e6dc-e3cbcc1d571f.png)

例を示すまでもないが、上図の②と③の数字部分が等幅フォントである。
（赤線部分）

## コード

```swift:①
Text("0123456789:Oabc")
    .font(.system(size: 60))
```

```swift:②
Text("0123456789:Oabc")
    .font(.system(size: 60, weight: .regular, design: .monospaced))
// OR
//  .font(Font(UIFont.monospacedSystemFont(ofSize: 60, weight: .regular)))
```

```swift:③
Text("0123456789:Oabc")
    .font(Font(UIFont.monospacedDigitSystemFont(ofSize: 60, weight: .regular)))
```

:::note warn
**macOS**の場合は、`UIFont`を`NSFont`に書き換える。
ソースコードを共有する場合は、次の`#if`で切り替えるとよい。

```swift
#if os(macOS)
typealias UIFont = NSFont
#endif
```
:::

# 考察

- ②は数字も含めて記号やアルファベットもすべて等幅表示だが、①のプロポーショナルフォントと比べると、数字もアルファベットも**書体**が異なる

- ③は数字だけが等幅表示で、記号やアルファベットはプロポーショナルである。**書体**は①と同じに見える


# 結論

数字の等幅表示に関しては、③を使うことにする。（個人的な見解）

<br><br><br>
**以上**
私のエンジニア人生を振り返る

Qiita様の「私のエンジニア人生を振り返る」というお題で私のエンジニア人生をご紹介します。

私は新卒で小規模のソフトウェアハウスに入社
入社3年目に入ってすぐ、会社が倒産しました。

やっていた仕事は
ソフトウェアハウスでは主に生産管理システムのプログラマー(***COBOL!***)
文房具店の在庫管理、発注システムの開発(VB、ExcelVBA)
公立病院のレセコンのソフトウェア開発と保守(開発言語はVBとAccessVBA、Windows NT Serverの運用保守)
です。
当時はサーバーインフラ系にあまり興味がなく開発志向でした。

ソフトウェアハウス倒産後、紹介会社を通じ、中堅SIerに転職しました。
だいたい5年ほど
やっていた仕事
・設備会計システムの開発(Java)
・Notesサーバーの構築(Windows 2000 Server、Notes)
・NASサーバーの構築(Linux,Samba)
・金融系のサーバー構築、運用設計(HP-UX、AIX、DB2、Oracle、HACMP、Tivoli、JP1、Shell Script)
・SAPのBasis(MSCS、SAP R/3の保守（ABAP)、運用スクリプトの開発(VBScript))
を中心にシステム構築業務を行っていました。

***30歳になって、Webサービスの会社に転職***

>やっていた仕事(技術的な仕事)
社内システム、Webサービスのデータベースの物理設計、論理設計(Oracle、MySQL、PostgreSQL、DB2)、ストアドプロシージャーの設計・開発(PL/SQL)
サーバーの多重化(RAC、Veritas Cluster、heartbeat+BRBD)
ナレッジシステムの構築運用、Webシステムの設計・開発(perl、PHP、JavaScript、HTML+CSS)
ネットワーク設計(当時CCNPの資格を保有していたので。現在は資格失効)
インターフェースの開発(C、C++で苦戦)

>管理的な仕事
部下の人事考課、目標設定
サービスマネージメント(ITILの資格保有)
ISO 27001の社内監査

**この当時、一番仕事が楽しかったですね。**

***36歳になり、リーマンショックを機にフリーランスエンジニアに転向***

>やっていた仕事(技術的な仕事)
Webサービスのデータベースの物理設計、論理設計(Oracle、MySQL、PostgreSQL、DB2)、ストアドプロシージャーの設計・開発(PL/SQL)
MySQLのレプリケーション設計、実装
サーバーの仮想化、プライベートクラウドの設計、構築(vSphere、Hyper-V)
データ分析(SQL、ストアドプロシージャー)

>管理的な仕事
プロジェクトマネージャー、PMO

技術者からマネージメント側に移ったので苦労しました。

43歳になり、サーバーの運用保守の仕事をするも、メンタル疾患を患いました。
心療内科を受診し、以前から疑問に感じていた発達障害(ASD、ADHD)の診断を受けました。

障害特性を理解してから、フリーランスエンジニアとして1年半活動しました。
>やっていた仕事①(クラウド)
Microsoft Azureのクラウドエンジニア(クラウド上でドメインサーバーを構築、ドメイン切り替え用のPowershellの開発)
Microsoft365、SharePoint Online、OneDrive、Teams、Intuneの要件定義、基本設計、構築・設定、テスト、サービス陰
の仕事を1年。

>やっていた仕事②(開発)
就労継続支援事業所の体調管理Webシステムの開発(PHP、Laravel、JavaScript)
XAMPPの構築(オンプレミス環境でWindows 2018 Server)
運用シェルの開発(Powershell)

現在、障害者枠で自社サービス企業に転職し、データ分析エンジニア、自動化エンジニア、社内SEとして以下の案件に参画中
>・データ分析エンジニア(Python3、jupyter notebook、Ruby)
・WordPressのプラグイン開発(PHP)
・細々としたExcel VBAを使った開発
・RPAツールを使った自動化ツール(Power AutoMate)


将来の立ち位置
**Tech Leadを目指し、高度なスキルを身に着ける**
**英語力の向上**
parted パーティションの作成や削除

```
[root@xxxx linuxstudy]# parted
GNU Parted 3.1
/dev/sda を使用
GNU Parted へようこそ！ コマンド一覧を見るには 'help' と入力してください。
(parted) help                                                             
  align-check TYPE N            パーティション N のアライメント(TYPE: min|opt)をチェックする
  help [コマンド]               ヘルプ表示。コマンド指定でそのヘルプを表示
  mklabel,mktable ラベルの種類  新しいラベル(パーティションテーブル)を作る
  mkpart パーティションの種類 [ファイルシステムの種類] 開始 終了
        　　　　　　　　　　　　パーティションを作る
  name NUMBER 名前              パーティションに名前をつける
  print [devices|free|list,all|NUMBER]
        　　　　　　　　　　　  パーティションテーブルや、利用可能なデバイス、空き領域、
        　　　　　　　　　　　  見つかった全てのパーティション、あるいは特定のパーティションについて表示する
  quit                          プログラムを終了する
  rescue 開始 終了              開始、終了で指定した範囲付近にあるパーティションを復活させる
  
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                     パーティションを削除する
  select デバイス               操作するデバイスを選択
  disk_set FLAG STATE           選択したデバイスの FLAG を変更
  disk_toggle [FLAG]            選択したデバイスの FLAG の状態をトグル
  set NUMBER フラグ 状態        ファイルシステムのフラグと状態を設定する
  toggle [NUMBER [FLAG]]        パーティションのフラグの状態を反転する
  unit UNIT                     デフォルトの単位を UNIT にする
  version                       GNU Parted のバージョンと著作権情報を表示
(parted)                              ```
BlueskyのAPIを試してみる

2024年02月07日、Blueskyが招待なしで登録可能となりました。
せっかくなのでBlueskyのAPIを試してみたいと思います。
とりあえず、単純にPOSTを行うだけのプログラムです。

実際のところ、次の公式ページに記述のある内容そのままでできます。

https://www.docs.bsky.app/docs/get-started

X(旧Twitter)と違ってDeveloperとして登録してAPIキーを生成、のようなことは2024年02月07日現在の段階では不要のようです。

今回はPythonでの実装方法を記述します。
Python自体はインストール済みであることを前提とします。
(筆者の環境は、Windows11のVSCode上でPython 3.10.11を実行しています)

#### １．atprotoのインストールを行う

プログラムに必要なatprotoライブラリのインストールを行います。
次のコマンドを実行し、ライブラリをインストールしてください。

```shell:
pip install atproto
```

#### ２．Pythonのプログラムを実装する

次のプログラムを実装して実行します。

```python:
from atproto import Client

client = Client(base_url='https://bsky.social')

client.login(login='your_account.bsky.social',password='your_password')

client.send_post('こんんちは、Bluesky')

```
your_account.bsky.socialは投稿を行うアカウントの先頭の@を抜いた文字列、your_passwordは実際のパスワードに置き換えてください。

send_postの内容は投稿する文章です。

上記を実行し、正常に動作すると、以下のように対象アカウントにPOSTが行われます。

![konnnichiha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317688/6c0db263-53c2-8b12-a861-a6ecbcc797ac.png)

実行時に401エラーが出る場合、ユーザー名及びパスワードを再確認してみてください。

以上で簡単ですがBlueskyに対してPOSTを行うプログラムが作成できました。
A summary of AWS from the basics [VPC]

## VPCとは？

- VPC: Amazon Virtual Private Cloud
- AWS上に作成できるプライベートな仮想的ネットワーク空間を構築するもの

- AWSのアカウント内に専用のネットワークを作成して、ネットワーク内にEC2、RDSなどのAWSリソースを配置すること

- ファイアウォールなどセキュリティ関連の機能もVPCの一部として用意されている

- VPCに用意されたVPNの機能で企業ネットワークと接続することも可能

## サブネット

○ パブリックサブネット（Amazon EC2）

- インターネットとの通信が可能
- サブネットを作成後、インターネットゲートウェイへのルーティングを設定することでパブリックサブネットを作成することができる

○ プライベートサブネット(RDS)

 - インターネットとの通信が不可

## ゲートウェイ

①　インターネットゲートウェイ
- VPCとインターネット間の通信を可能にするために使用する

② ナットゲートウェイ
- プライベートサブネットからインターネットにアクセスする際に使用する

③ 仮想プライベートゲートウェイ
- オンプレミス環境とインターネットVPNを接続する際にVPC側で使用する

④カスタマーゲートウェイ
- オンプレミス環境とインターネットVPNを接続する際にオンプレミス側で使用する

⑤トランジットゲートウェイ
- 複数のVPCとオンプレミス環境をインターネットVPNで接続する際に使用する


## ルートテーブル

- VPC 内のサブネットからインターネットや他のネットワークへの接続を制御する仮想的なルーティングテーブル

- サブネットは、サブネットに関連付けることで、サブネット内リソースの通信経路を設定することができる

## セキュリティグループ

- 仮想ファイアウォール機能で、EC2、RDSなどのVPC内リソースのトラフィックを制御することができるサービス

## ネットワークACL

- 仮想ファイアウォール機能で、サブネットに対して通信の設定をすることができる


## リージョンとは？

- AWSのデータセンターが存在するエリアのこと
- リージョン毎に提供しているサービス、未提供のサービスがある

## アベイラビリティゾーンとは？

- リージョン内に存在する物理的に離れた個々のデータセンターのこと

## VPC構成例

① VPCを作成する →  ② サブネットを2つ作成する　→  ③　インターネットゲートウェイをVPCにアタッチする　→  ④ ルートテーブルで、サブネットのうち1つをインターネットゲートウェイにルーティングして、パブリックサブネットにする　→ ⑤ もうひとつのサブネットは、パブリックサブネットに通信するプライベートサブネットにする　→ ⑥ パブリックサブネットにEC2を構築し、Webサーバーとする → ⑦ プライベートサブネットにはRDSを構築し、データベースとして使用する → 
⑧　パブリックサブネットにあるEC2は、Webサーバーとして使用するので、セキュリティーグループで、全ての送信元からポート443（HTTPS）を許可する　→  ⑨ プライベートサブネットにあるRDSは、セキュリティグループで、Webサーバーからのポート3306を許可する

## VPCエンドポイント

- インターネットを経由して、アクセスする必要があるS3などのAWSサービスにVPCから直接アクセスすることが可能になるサービス

## VPCピアリング

- 異なる複数のVPC間での通信を可能にするサービスで、他のアカウント、他のリージョンとも通信をすることが可能
- AWS環境内の通信のため、一般的なエクスプロイトやDDoS攻撃などの脅威を減らすことがメリット

## ダイレクトコネクト

- ダイレクトコネクトを使用するとオンプレミスからAWSまでインターネットを経由せず、プライベートな接続を確立できる
- インターネット回線ではなく、専用回線を使用するので、セキュリティ面の向上と通信の安定がメリット


## Reference site
[Amazon Web Service マスターコース VPC編](https://itplusjp.udemy.com/course/amazon-web-service-vpc/learn/lecture/11694542#overview)
[【AWS VPC】ソリューションアーキテクト アソシエイト(SAA) 第9回講座](https://www.youtube.com/watch?v=080H8Ll6lek)
rcloneのGUIモードでbasic認証のID/PASSを設定する方法

```bash
rclone rcd --rc-web-gui --rc-user x --rc-pass x
```

rcloneのGUIモードはローカルホストでWebサーバーが起動するタイプ。ブラウザでアクセスするんだけど、ほっとくとbasic認証も動く。

GUIモードを起動する際に、ユーザIDとパスワードを引数で設定する。
【メモ】Amazon Linux2 サーバーにVSCodeが接続できなくなった話

　2024年の2月に入っていきなり発生したやつです。
　原因も解って一先ず解決したので書き残します。

　Windows11で、これまでVSCodeの拡張機能の「`Remote-SSH`」を使ってトンネル経由でサーバーに接続できていたのが急に出来なくなった状況です。

## 目次

[1.原因](#原因)
[2.解決方法](#解決方法)
[3.その時行った原因調査](#その時行った原因調査)

## 原因
　VSCodeの新しいバージョン`1.86`でLinuxに求める最小構成が更新されたため。
　アップデートの通知もなく、気づかないうちに自動更新されていた。

* 発生の流れ
　VSCodeの`v1.86`がリリースされる。（1月）
　↓
　`v1.86`が求めるLinuxの最小構成だと`Amazon Linux2`サーバーが対象外になる。
　↓
　VSCodeの自動更新が裏で動いて`v1.86`にアップデートされる。（2月）
　↓
　接続できなくなった。

 参考：VSCodeの`v1.86`のリリースノート
https://code.visualstudio.com/updates/v1_86

:::note info
 このリリースノート内の「`Linux minimum requirements update`」に色々書いてあります。
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536297/8099e2cc-31a3-22f7-7bbf-5c1879f726d8.png" width="600px">

## 解決方法
 公式に書いてあることとだいたい同じです。

 **方法1）サーバーのアップデートをする。**
　これがセキュリティ的にも最も良い方法です。
　`glib`を、2.28 以上に。`glibcxx` を3.4.25以上に上げると良いらしい。

 **方法2）VSCodeのバージョンを1.85に落とす。**
　VSCodeのバージョンを落とす方法はリリースノートにも案内があって「`you can download the VS Code release 1.85.`」という文言でリンクが張ってありおます。
　リンク先は`v1.85`のリリースノートになっていて、その画面からダウンロードが可能です。
　なお、**先にVSCodeの自動更新をOFFにしないと、VSCodeの自動更新が走って**すぐ`v1.86`になってしまいます。
***
**●VSCodeの自動更新をOFFにする方法**
 1.メニューから「`ファイル`」→「`ユーザ設定`」→「`設定`」と移動。
 2.設定の検索ボックスに`update mode`と入力する。
 3.Update Modeを`none`にする。
 4.VSCodeを再起動
 5.ヘルプのバージョン情報からバージョンが狙ったものになっている事を確認

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536297/2136dfb5-9cd0-b1f1-9960-23a51c62b400.png" width="400px">

## その時行った原因調査

* `teraterm`で接続先のサーバーに普通に接続できる事を確認
・接続できたので、回線や接続先のサーバーは原因ではない。
↓
* windowsの`OpenSSH`クライアントからも接続先のサーバーに繋がることを確認
・VSCodeの`ssh`接続は`OpenSSH`を使っているため確認する。
・windowsのターミナル（`cmd`）を開いて`ssh`コマンドで確認。
・接続できたので、windowsや`OpenSSH`が原因では無い。
↓
* 接続先サーバー上のvs-codeのログを確認
・`ssh`接続自体は出来てるっぽいため、接続先に残されるログを確認。
・`/home/{自分のアカウント}/.vscode-server/` のディレクトリに`.{ハッシュ値}.log`というドット（`.`）から始まるファイルがあるため、それらのうち更新日時がVSCodeが繋がらなかった時のものになっているものを探す。
・みつけたログファイルの中身見る。すると`glib`と`glibcxx`のバージョンがどうのと読めるエラー文が残されている。
```コマンド
Warning: Missing GLIBCXX >= 3.4.25! from /usr/lib64/libstdc++.so.6.0.24
Warning: Missing GLIBC >= 2.28! from /usr/lib64/libc-2.26.so
Error: Missing required dependencies. Please refer to our FAQ https://aka.ms/vscode-remote/faq/old-linux for additional infomation.
```
　・けれど接続先のサーバーは特に`gcc`など関連するものを更新した話はない。
　・なので、VSCode側の仕様が変わった可能性が大きい。
↓
* VSCodeの公式サイトからリリースノートを探し出して読む
・VSCodeのバージョン情報を確認してみると通知もなく最新になっていた
・最新のバージョンのアップデート内容を確認したことで原因が判明。

　VSCodeに限らず、自動アップデートの更新の通知が無い（あるいは非常に目立たない）ソフトウェアはたまにあるので、急に動きがおかしくなったら使ってるツールの自動アップデートも疑うのもアリかもしれません。
　少なくとも今回は更新されたことに全く気づきませんでした。

　そして今回はAmazon Linux2サーバーが古いというのも原因なので、サーバーのアップデートをこまめにできる運用体制である事が一番良いのだろうなぁと思いつつ、それが難しいなとも思った一件でした。
なんでもかんでもRDBに入れるやつら

私の周辺では、ファイルとして作りそうなものも結構RDBのバイナリオブジェクトに格納している

こんなの

- Logとか
- 画像とか
- ただのファイルとか

### RDBに入れてなにがいいの？

- そもそもDBにファイルのパスを入れるのはアンチパターン
    - ってSQLアンチパターンに書いてある
- 圧縮してくれる
    - MySQLのBLOBは圧縮してくれるので
- 削除しやすい
    - ファイルシステムだと一つのディレクトリに入る上限があるため、複数の階層に入れないといけなくてその削除のCPUコストがばかにならない
    - RDBのテーブルならTruncateだけで削除できる
    - テーブルを曜日別にパーティションとっておけば、一週間前をTruncateできます
    - 本気でバックアップを取っておきたければ、月単位などでアーカイブしてそこで初めてクラウドストレージにアップします（ほとんど取り出すこともしません）
- 検索しやすい  
    - 複数の観点で検索できるので、ディレクトリに置くことに比べると検索しやすいです
    - それこそS3に置いちゃうと検索だけでかなりお金かかっちゃいます
- プレビューしやすい
    - SequelAce なら以下のファイルは最初からプレビューできます（DBeaverも画像くらいならプレビューできる）
        - 画像
        - PDF
        - HTML
- 権限管理しやすい
    - RDBにアクセスできるユーザを公開鍵認証でアクセス許可できちゃう
    - SequelAceもDBeaverもクライアント側の機能として公開鍵認証ベースでのSSHトンネル機能があります
    - シンプルでありながら強いです
    - 本当はファイルサーバーにも公開鍵認証が欲しいくらいです
        - S3でさえも公開会議認証のゲートウェイサービスを追加で用意しているくらい公開会議認証は強力かつ便利
- あなた達のスマホにも大量のsqliteが動いている
    - なんでもかんでもRDBというのは業務系の人たちだけの話しではない
    - スマホアプリの大半は通信して取得した結果をスマホ内のsqliteにキャッシュとして保存している
    - よくあるタイムラインのデータはsqliteに保存しているからこそオフラインでも見れている
    - さらにどの投稿をみたか、どこまでスクロールしたかなどもsqlite上のDBに記録されている
- 1TBくらいは自前で確保できる
    - 仮想マシンにストレージをLVMで入れる場合でも、100Gくらいから始まって1TBまで伸ばしながらコストを調整している
    - ざっくり1TBくらいが上限なんだけど、小さめのファイルがたくさん出てくるとむしろクラウドストレージのAPIコストの方が目立つ。やっぱりRDBでいい
ギター マルチエフェクター MOD Dwarf を無料で使ってみよう(4) -Ver 0.0.8-

MOD Audioから矢継ぎ早にVer 0.0.8がリリースされました。

MOD Desktop をよく知らないという人は[過去の記事](#過去の記事)『ギター マルチエフェクター MOD Dwarf を無料で使ってみよう(1) 』を読んでみてください。すぐに使いたいという人は[ダウンロード](#ダウンロード)からダウンロードしてインストールしてください。

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129361/6fcf6713-5233-a84f-3865-c8926c0fa965.png)

## 変更点

* Arch系Red Hat系Linuxのpipewireで使えるようになりました。
* 左下のボタンからファクトリーペダルボードをロードできるようになりました。
* 【追記】Windows11でファクトリーペダルボードが表示されない不具合があるようです。
* 【追記】Ubuntuでは起動しない不具合があるようです。

今回のプリセットでは上記スクリーンショットのギターシンセなどのペダルボードが追加されています。

将来的にストアなどを使えるようにアプリごとにユニークIDを割り振ることもおこなわれたようです。

https://forum.mod.audio/t/introducing-the-mod-app-for-desktops-beta-release/10495/197

下記はManjaro LinuxのQpwgraphでのMOD Desktopの表示画面です。これでLinux上ではMOD DesktopからDAWへ入力することができるようになりました。

![screenshot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129361/f11f3423-2d46-9914-6567-5f7de05c1f8e.png)


## ダウンロード

https://github.com/moddevices/mod-desktop/releases/tag/0.0.8

## 過去の記事

[ギター マルチエフェクター MOD Dwarf を無料で使ってみよう(1) -Ver 0.0.5-](https://qiita.com/Inqb8tr_jp/items/eee71a8c5453574cf11b)
[ギター マルチエフェクター MOD Dwarf を無料で使ってみよう(2) -Ver 0.0.6-](https://qiita.com/Inqb8tr_jp/items/cf61fffbb48ae361cfaa)
[ギター マルチエフェクター MOD Dwarf を無料で使ってみよう(3) -Ver 0.0.7-](https://qiita.com/Inqb8tr_jp/items/a24d261da46f9665c8f5)
[MOD Dwarfを無料で使ってみよう(1)](https://qiita.com/Inqb8tr_jp/items/ee3a30838e90c3ee9589) (mod-live-usbの作り方と使い方）
[MOD Dwarfを無料で使ってみよう(2)](https://qiita.com/Inqb8tr_jp/items/897432306eb404bd9a6b)
[MOD Dwarfを無料で使ってみよう(3)](https://qiita.com/Inqb8tr_jp/items/461625cf450c01ddb74d)
setodaNote CTF unallocated_space を Autopsy で解く


削除されたファイルをエクスポートしたらフラグ出てきた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/80c647f1-bbc1-e891-8b21-ff3280839697.png)
【WSL2】ssh公開鍵をコピーするコマンド

# はじめに
WSL2 でssh公開鍵をコピーするコマンドについてです。
なお、鍵の作成～接続の手順は下記を参考にしました。

https://qiita.com/shizuma/items/2b2f873a0034839e47ce
# 問題
調べて出てきたコマンドを打ってみましたが、失敗しました。
```
$ clip < ~/.ssh/{ファイル名}.pub
```
# 解決方法
こちらで成功しました。
コマンド実行後に"sudo apt install xsel"が出てきたらこちらも実行してください。
```
$ cat {ファイル名} | xsel -bi
```
# おわりに
コマンド系は情報が古かったりするので、定期的にこういった情報発信をしていきたいです。
QMKで「error: 'ENCODERS_PAD_A' undeclared here (not in a function); did you mean 'ENCODER_ENABLE'?」と出る問題

# QMKファームウェアでコンパイル時にエラーが出る問題

## 前書き
- 2024/2/7に発生し、対応した時の記事です。よって変更が入っている可能性はあります
- 私はQMKにあまり詳しくありません、内容は間違っている可能性があります、文鎮化しても責任は取りません
- `sphh jp`という名前のキーボードを使っています、自分の使っているキーボード名に読み替えてください
 - この方法で治るのはおそらく、ロータリーエンコーダーのついていないキーボードです
    - (ロータリーエンコーダー= ノブを回して音量調節とかするやつ)

---
qmk firmwareで 以下のようなコマンドでhexファイルを作っている人向けです
```sh
qmk compile -kb sphhjp/rev1 -km (キーマップ名)
```


## エラー発生

一年振りくらい？に`sphh jp`のキーマップを変えようとした時に今までは出ていなかった下記のようなエラーが発生した。
おそらく`qmk firmware`をアップデートした際に過去のものと何かが変わったのであろう



```sh: エラーメッセージ (一部抜粋)
Compiling: quantum/encoder.c                                                                       quantum/encoder.c:31:6: error: #error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B"
 #    error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B"
      ^~~~~
quantum/encoder.c:35:33: error: 'ENCODERS_PAD_A' undeclared here (not in a function); did you mean 'ENCODER_ENABLE'?
 static pin_t encoders_pad_a[] = ENCODERS_PAD_A;
                                 ^~~~~~~~~~~~~~
                                 ENCODER_ENABLE
quantum/encoder.c:36:33: error: 'ENCODERS_PAD_B' undeclared here (not in a function); did you mean 'ENCODER_ENABLE'?
 static pin_t encoders_pad_b[] = ENCODERS_PAD_B;
                                 ^~~~~~~~~~~~~~
                                 ENCODER_ENABLE
quantum/encoder.c:36:33: error: invalid initializer
 [ERRORS]
 | 
 ```
## 解決方法

```text:ファイル構成図の例 
qmk_firmware
└─keybords
　　└─sphhjp/rev1
　　　　├─rules.mk
　　　　├─config.h
　　　　├─keymaps/(省略)
　　　　└─(省略)
```
の`rules.mk`に
```sh:rules.mk
ENCODER_ENABLE = no
```
を追加する。
(追加位置は多分どこでもいいけど、先頭はやめた方がいいと思う、私は末尾にする)

---
 終わり

---

## 詳細について
> 内容のほとんどが予想です、ご注意ください

おそらく、ロータリーエンコーダー(ノブで回すやつ)周りの設定

ロータリーエンコーダーを使っていない場合は
昔は明確に`rules.mk`の書いていなくてもデフォルトでoffだったので問題なかったのだが、
>`rules.mk`に`ENCODER_ENABLE = no`を明示しないと
>`config.h`に`#define ENCODERS_PAD_A `を探しに行ってしまいエラーになる

ようになった

余談だが、ロータリーエンコーダーを使っている場合は
>`rules.mk`に`ENCODER_ENABLE = yes`
>`config.h`に`#define ENCODERS_PAD_A {hoge}`(など)

が定義されているはず


[ロータリーエンコーダー設定 公式](https://docs.qmk.fm/#/feature_encoders?id=encoders)


## 検索するとこのような記事

[[Bug] Using only right side encoder in split keyboard · Issue #10096 · qmk/qmk_firmware · GitHub](https://github.com/qmk/qmk_firmware/issues/10096)


[QMK Firmware with Rotary Encoder error : r/MechanicalKeyboards](https://www.reddit.com/r/MechanicalKeyboards/comments/lp69ge/qmk_firmware_with_rotary_encoder_error/)



機械翻訳
>  爆笑、3か月遅れましたが、文字通りまったく同じエラーに遭遇しました。 ENCODER_ENABLE = yes を rules.mk の一番下ではなく一番上に移動しました。 次に、ENCODERS_PAD_A と ENCODERS_PAD_B の定義に対しても同じことを行い、 これらの行を config.h の最後ではなく先頭に移動しました。コンパイルが完了しました:)

ここでは
`rules.mk`に`ENCODER_ENABLE = yes`
とあるが、これはロータリーエンコーダーを使っている場合なので今回は違う
Empowering Minds: Virat International School in Dharuhera

Nestled in the vibrant town of Dharuhera, Virat International School emerges as a catalyst for educational excellence and character development. Established with a mission to provide a nurturing and inspiring learning environment, this institution has quickly become a cornerstone in the local education landscape.

At Virat International School, the commitment to academic excellence is evident in its thoughtfully crafted curriculum. From early childhood education to the final years of high school, the school aims to provide a comprehensive educational experience that equips students with the knowledge and skills needed for a successful future. The curriculum is designed to foster critical thinking, creativity, and a love for learning, laying the foundation for lifelong intellectual growth.

A standout feature of Virat International School is its dedicated and passionate faculty. Comprising experienced educators who are deeply invested in the success and well-being of their students, the teaching staff brings a wealth of knowledge and innovative teaching methods to the classroom. Through a student-centric approach, the faculty members ensure that each child receives personalized attention and guidance, promoting not only academic achievement but also the development of essential life skills.

Virat International School goes beyond traditional education by placing a strong emphasis on co-curricular and extracurricular activities. The school believes in the holistic development of its students and provides ample opportunities for them to explore their interests in sports, arts, music, and more. These activities contribute to the overall growth of the students, fostering qualities such as teamwork, leadership, and resilience.

The school's modern infrastructure complements its commitment to excellence. Well-equipped classrooms, state-of-the-art laboratories, and extensive sports facilities create an environment conducive to both academic and personal development. Virat International School strives to provide a setting where students can thrive, explore their potential, and build a strong foundation for future success.

Virat International School in Dharuhera is not just an educational institution; it is a community that values diversity, fosters inclusivity, and promotes a sense of belonging. The school actively engages students in community service initiatives, instilling in them a sense of social responsibility and empathy.

In conclusion, Virat International  <a href="https://www.viratschool.com/">School in Dharuhera</a> stands as a beacon of educational empowerment, where young minds are nurtured, challenged, and inspired to reach their full potential. With its holistic approach to education, dedicated faculty, and commitment to character development, the school is shaping the future leaders and contributors of tomorrow.