OmniAICreator/Qiita-1.07M huggingface dataset:
EKS on Fargateのリソースリクエストの落とし穴

# Fargateのリクエスト量の組み合わせ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/2318cb62-f3da-98f2-3c38-1130fa1c17a7.png)


# 期待していたこと
以下のようなdeploymentマニフェストを書いて、`0.5vCPU, 4GB`がリクエストされることを期待していた。
```yaml
〜〜〜
# .spec.template
resources:
  limits:
    cpu: 500m
    memory: 4000Mi
  requests:
    cpu: 500m
    memory: 4000Mi
〜〜〜
```

# 実際のリクエスト量
スケジュールされたPodを`kubectl describe pod`で見てみると.
以下のように一つ上のvCPUがリクエストされていた。
```
Annotations: CapacityProvisioned: 1vCPU 5GB
```

# なぜ起こった？
Fargateは上で明示的に指定したリソースリクエストに加え、kubernetesのコンポーネント(kubelet, kube_proxyなど)用に256MBを確保します。

そのため、`0.5vCPU, 5GB`を確保しようとしますが、この組み合わせはないため`1vCPU, 5GB`を予約します。

なので、256MBを踏まえて以下のように指定することで解決しました。
```yaml
resources:
  limits:
    cpu: 500m
    memory: 3500Mi
```

# 参考
[Fargate タスク定義の考慮事項](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/fargate-task-defs.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%E3%82%BF%E3%82%B9%E3%82%AF%20CPU%20%E3%81%A8%E3%83%A1%E3%83%A2%E3%83%AA,-Fargate%20%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF)

[Fargate Podの設定](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/fargate-pod-configuration.html)
Qiitaの記事の画像のサイズを変更する方法


- Qiitaで記事投稿を執筆する際、画像を挿入したのですが、サイズが大きすぎてみづらいと感じました。
- htmlタグがそのままQiitaの投稿編集に使えるということを知った。
- 画像アップ時の表示サイズを変更する方法について、備忘録としてここに記録します。


## Qiita投稿記事にて、画像をアップする際、表示サイズがデカすぎる

- 以下のようにやればOK

```
<img src="ファイル名.jpg" width=50%>
```
- 以上。
- サイズは50%だけでなく、任意のパーセンテージ表示に変えてOK



## 参考サイト

https://qiita.com/soratyan/items/6c47abaf92dded703d0c
FreeBSD/armがくそな理由

以前FreeBSD/armをいじって感じた事を書いておきます。

* armv5でパフォーマンスが出ないので消された

FreeBSD/armのサポートはarmv5の頃にNetBSDから持ってきたもので、おそらくもともとはちゃんと動いていたのが、独自にarmv6のサポートを入れたときに壊したようです。そういうコードになるアーキテクチャのCPUを作るarmも悪いのですが。

* armv4が動かなくなって消された

StarのportがFreeBSD 8で入ったのですが、11前くらいですでにうごかなくなっていました。FDT化してもだめで、おそらくOSとして潜在的な問題があるような気がします。

* armv6が1176からで1136で動かすとぐたぐた

これはarmv6は1176なラズパイをターゲットにサポートを入れたので、1176に依存したコードになっていました。

* A10のコードもぐてぐて

A10のclockのコードがおかしくてHDMIが使えなかったのを直したのを思い出しました。hintsだったものをfdtにしたときにおかしくしたようでした。

FreeBSDでは力技でコードを綺麗にしていますが、動かないコードはゴミです。

StarはNetBSDにryoさんの古いコードがあったので10-BETAで動くようにして、十分実用レベルになっています。

1136なc1kもNetBSDで問題なく使えています。NetBSDも1176をarmv6のメインターゲットとしていて微妙におかしなところありますが、致命的な問題はありません。
SQLの作成と方針

JOIN LEFT

```
SELECT
    dates.date AS task_date,
    COALESCE(SUM(task_count), 0) AS cumulative_tasks
FROM (
    SELECT DISTINCT DATE(completion_date) AS date
    FROM tasks
) AS dates
LEFT JOIN (
    SELECT
        DATE(completion_date) AS task_date,
        COUNT(*) AS task_count
    FROM
        tasks
    GROUP BY
        task_date
) AS task_counts
ON dates.date >= task_counts.task_date
GROUP BY
    dates.date
ORDER BY
    dates.date;

```

METABASEを使用してプロジェクト管理データを可視化

## ステップ1: データの理解と前処理

データベース内のデータ構造を理解。必要に応じてデータの取り込みや変換を。
プロジェクト負担を管理するためのデータがどのテーブルに格納されているか確認。
プロジェクト名、締め切り、開始日、終了日、担当者など。

## ステップ2: データ可視化の目的確認（依頼主への質問）

#### 1.どのプロジェクトまたは業務を可視化したいか？

すべてのプロジェクトを含めるのか、特定のプロジェクトを選択するのか確認。

#### どの期間のデータを含めるべきか？

特定の期間内のデータを可視化するのか、現在の状況を把握するのか、期間を確認。


#### どのような情報が必要ですか？
プロジェクトの進捗、達成度、遅延、担当者の稼働率など、どの情報を可視化するかを確認。

## ステップ3: グラフの選択と作成

依頼主からの情報をもとに、適切なグラフを選択し、作成。以下は一般的なグラフの例です。

#### ガントチャート:

プロジェクトの進捗状況、開始日、締め切り日を示すために使用。
プロジェクトの進行状況を一目で把握。
#### 棒グラフまたは折れ線グラフ:

プロジェクトごとの進捗率、担当者ごとのタスク数、期限切れのタスク数などを可視化するのに役立つ。

#### 円グラフ:

プロジェクトの進捗をカテゴリごとに示すために使用できます。
タスクの状態（進行中、完了、遅延）を示すのに適しています。

#### ヒートマップ:

日付と担当者の組み合わせで、担当者ごとの作業量や期間ごとのプロジェクトの進行状況を視覚化するのに役立ちます。

#### 散布図:
担当者の稼働率とプロジェクトの進捗率を比較するのに役立ちます。

## ステップ4: インタラクティブなダッシュボードの作成

METABASEでは、複数のグラフを組み合わせてダッシュボードを作成できます。プロジェクトマネージャーやチームリーダーがデータをインタラクティブに検討できるように、ダッシュボードを作成しましょう。ダッシュボードには必要なフィルターや選択肢も含めることができます。

## ステップ5: 定期的な更新と共有

データの可視化は常に最新である必要があります。データの自動更新スケジュールを設定し、関係者と共有する方法を確立します。

依頼主の要件やビジョンに合わせて、具体的な可視化の方法を調整してください。プロジェクトの進捗状況やプロジェクトメンバーのパフォーマンスをモニタリングし、迅速な意思決定をサポートするための情報を提供できるように設計しましょう。

## タスククラウドマップ:
#### データの準備:

タスクやプロジェクトの関連度を示すデータを準備します。通常、タスクの関連度は重み付けされたテキストデータとして存在します。
#### METABASEの設定:

METABASEにデータをインポートし、データモデルを設定します。必要に応じてテーブルやカラムの別名を設定します。
#### SQLクエリ:

タスククラウドマップを生成するためのSQLクエリを作成します。以下は、関連度スコアが含まれるデータベーステーブルを使用した例です。

```
SELECT task_name, SUM(relatedness_score) AS score
FROM tasks
GROUP BY task_name
ORDER BY score DESC

```
#### グラフの作成:
METABASEのダッシュボードで、カスタムSQLクエリを使用してデータを取得し、ワードクラウドを表示するカードを作成します。カードにはタスク名を表示し、関連度スコアに基づいてフォントサイズや色を調整します。


## タイムライン3Dビジュアライゼーション:
#### データの準備:

プロジェクトや業務の進捗データを準備します。データにはプロジェクト名、進捗率、日付が含まれることが一般的です。
#### METABASEの設定:

METABASEにデータをインポートし、データモデルを設定します。必要に応じてテーブルやカラムの別名を設定します。
#### SQLクエリ:

タイムライン3Dビジュアライゼーションを生成するためのSQLクエリを作成します。以下は、プロジェクトの進捗データを使用した例です。
```
SELECT project_name, progress, date
FROM project_progress
ORDER BY date
```
#### グラフの作成:
METABASEのダッシュボードで、カスタムSQLクエリを使用してデータを取得し、3Dタイムラインを表示するカードを作成します。カードにはプロジェクト名が横軸、日付が縦軸、進捗率が高さ（Z軸）にマッピングされます。ユーザーは時間経過に沿ってプロジェクトの進行状況を視覚的に追跡できます。

。
リプラットフォームへの挑戦

<font color="Grey">*[The replatforming challenge](https://aiven.io/blog/the-replatforming-challenge)の翻訳です。*</font>

2023年1月16日

# リプラットフォームへの挑戦

観測可能性市場はオープンソースに向かって進化している。ジョナ・コウォールが考えるその方向性をご覧ください。

観測可能性市場とそれを支える技術が進化するにつれ、オープンソースはデータ収集の課題を解決するための中心的存在となっている。より大きな困難は、データストレージの拡張と、可視化とともに分析を改善することです。[OpenSearch®](https://aiven.io/opensearch)や[Prometheus](https://docs.aiven.io/docs/platform/howto/integrations/prometheus-metrics)のような技術によって、我々は多くの組織で観測可能性を解決するために新しいデータベースやデータプラットフォームがその地位を占めるのを見てきた。


この変化には2つの大きな理由がある：


* 観測可能性ツールの変更に伴い、アプリケーションやインフラストラクチャの再計測を行うことは、コストと時間がかかる。
* 観測可能性ツールに関して、組織はベンダーロックインにうんざりしている。


## 潮流との戦い


現在の観測可能性ツールの最後の世代は、プロプライエタリな計測器を維持するために懸命に戦っているが、オープンソースをサポートしなければならなくなるのは時間の問題だ。そして、リップサービスでは十分ではないだろう--彼らは、彼ら自身のプロプライエタリな計測器をサポートしてきた方法と同等の、有意義なサポートを提供しなければならないだろう。


長年の実務家、アナリスト、エンジニアリング、製品リーダーとして、私が過去3年間のキャリアでオープンソースの観測可能性に焦点を当ててきた理由はここにある。私は、データ・プラットフォームの全体像を見なければならないと考えています。これが、最近Aivenに入社した理由です。私の仮説は、観測可能性とモニタリングの市場は、データ・プラットフォームが受けてきたのと同じような進化を遂げるだろうということです。


データ・プラットフォームやアーキテクチャーにおいても、独自コンポーネントと同じ傾向が見られる。主要なクラウド・プロバイダーは同じ間違いを犯している。例えば、なぜクラウド・プロバイダーは独自のメッセージング・コンポーネントやデータベース・クエリ言語、APIを構築するのだろうか？プロプライエタリなコンポーネントは、ポータブルな環境を構築しようとするユーザーに課題をもたらす。ユーザーは閉じ込められてしまう。


一部のクラウド・プロバイダーはオープン・ソース・ソフトウェアの採用に長けているが、そのほとんどはプロプライエタリ・システムと協調している。すべての主要なクラウド・プロバイダーは、オープンソースの提供や互換性に弱点を持っており、ロックインの深さはサービス提供によって異なるものだ。


## オープンソースの優位性


これらが、クラウド間で完全に移植可能で、移行可能で、簡単に管理できるオープンソースベースのデータプラットフォームとストリーミングというAivenのアプローチが優位であると私が考える主な理由です。ダウンタイムをほとんど発生させることなく、ボタンをクリックしたりAPIを呼び出すだけで、これらの重要なコンポーネントをクラウド間で移動できるツールを私は他に知らない。多くの面で印象的であり、管理のしやすさは他の追随を許さない。



> ![](/build/_assets/shape-quote-WGSAHX4E.svg)
> ボタンをクリックするかAPIコールをするだけで、ダウンタイムをほとんど発生させることなく、これらの重要なコンポーネントをクラウド間で移動できるツールを私は他に知りません。
>
>
>


クラウド間の移動はかつてないほど重要になっている。ほとんどの組織は、景気が良いときには5年ごとにコンポーネントの再プラットフォームを実施しているようだ。現在の不景気とクラウド・サービスの高コストにより、クラウドのポータビリティのタイムラインは早まる可能性が高い。したがって、データ・プラットフォームは、ポータビリティとともに、すべての主要クラウドをサポートすることが不可欠である。


サービスを簡単に移行できることは、コア・データ・サービスの移行を解決することで、クラウド・プロバイダーと可能な限りベストな価格を見つけるのに役立つ。クラウド・プロバイダー同士を競争させ続けることは、IT支出を最適化する上で非常に重要であり、かなりのコスト削減につながる。


#### 変革の到来

さまざまな業界で成功を収めている企業は、変革戦略の一環としてマネージド・データ・プラットフォームをどのように活用しているのだろうか。彼らがどのようにビジネスや技術的な課題を解決したのか、電子書籍でご覧ください。

[こちらから](https://aiven.io/ebook/how-a-cloud-data-platform-can-drive-transformation-in-your-business?utm_source=ebook&utm_medium=internal&utm_campaign=transformation_ebook&utm_content=the-replatforming-challenge)
## 未来のデータパイプライン


私たちのデータ・プラットフォームの将来的な道筋は、Aivenの壁の中でプラットフォームを拡張するために、より多くのユーザー定義コードとアプリケーション・コードを組み込むことです。オープンソース技術によって駆動されるこれらのデータパイプラインは、ユニークな方法でデータを再構成し、分析する柔軟性を提供します。


これは、将来性のあるデータ・アーキテクチャを構築する上で非常に重要である。これにより、データ・パイプラインのサポート・コードをデータベースやストリーミング・プラットフォームの近くで実行できるようになる。


私たちは、[Apache Flink®](https://aiven.io/flink)と[Apache Kafka® Connect](https://aiven.io/kafka)がAivenプラットフォームのためにできることにとても興奮しています。これらのトレンドに関する続報にご期待ください。



Aivenと私たちのサービスに関する最新ニュース、さらにオープンソース全般に関するちょっとした情報を入手するには、[月刊ニュースレターを購読](https://aiven.io/newsletter)してください！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。


サービスのアップデート情報を知りたい方は、[変更履歴](https://aiven.io/changelog)をご覧ください。
【高先さんの電子工作】第11回：第6回の補足 ブレッドボードを理解する

https://youtu.be/YXhf_zahBoQ

液晶ディスプレイの接続確認用プログラムです。

```python:main.py
import machine

sda = machine.Pin(6)
scl = machine.Pin(7)
bus = machine.I2C(1,sda=sda, scl=scl, freq=400000)
print(bus.scan())
```
sakuracloud Windows Server

## condition を使う場合

```
data "sakuracloud_archive" "tekitouna_namae" {
  filter {
    condition {
      name     = "Name"
      values   = ["Windows Server 2022 for RDS"]
      operator = "exact_match_or"
    }
  }
}
```

conditionを使う場合、nameは `Name` じゃないとダメな模様。
`Name1` とかにすると source_archive_id が 113300112270 ( `CentOS 7.9 (2009) 64bit` ) になる。
`name` は必須項目なので変えられないんですね。
`Name` のままであれば、 `113500691241` ( `Windows Server 2022 for RDS` ) が選択される。

## names を使う場合

```
data "sakuracloud_archive" "tekitouna_namae" {
  filter {
    names   = ["Windows Server 2022 for RDS"]
  }
}
```

こちらは最初から `113500691241` ( `Windows Server 2022 for RDS` ) が選択される。

## source_archive_id を使う場合

```
data "sakuracloud_archive" "tekitouna_namae" {
  filter {
    id = "113500691241"
  }
}
```

これで良いじゃん、という気もするんですが、 `source_archive_id` ってものすごい勢いで 更新？変更？インクリメント？ されるんですよね。
ちょっと前にメモったのが `113500691192` で、そこから `49` 増えてるんですよね…… パッチが当たる度に更新してるんだろうか🤔
だから、 `source_archive_id` 直指定は下手をすると1日で

```
Error: Your query returned no results.
 Please change your filter or selectors and try again
```

というエラーになってしまうかも。
Markdownテーブル → LaTeXを簡単に変換できるWebベースのツールを作りました


# Markdownテーブル → LaTeXを簡単に変換できるWebベースのツールを作りました 🚀

こんにちは！今回Markdownテーブルを簡単にLaTeXに変換できるツールを作ったので紹介します。
Markdownでのドキュメント作成の魅力は、多くの人がすでに知っていますよね。しかし、MarkdownのテーブルをLaTeXに変換するのは意外と面倒…そんな経験はありませんか？このツールはそんなあなたの悩みを一発解消します！


![ツールのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285897/22e19963-ceb0-de2f-63a1-8f8389dff118.png)

## 🔥 このツールのすごさを3つのポイントで！

1. **使いやすさ**：UIはシンプルで直感的。初めての方でもすぐに使いこなせます。
2. **速さ**：テキストをペーストして「Convert」ボタンを押すだけで、瞬時にLaTeXフォーマットに！
3. **安全性**：全ての処理はブラウザ上で行われ、データは一切外部に送信されません。プライバシーを守りつつ、安心してお使いいただけます。

## 🚀 さっそく使ってみよう！

1. まずは[Markdown Table to LaTeX Converter](https://argonism.github.io/MdTable2Latex/)にアクセス。
2. Markdown形式のテーブルをコピーして、入力エリアにペースト。
3. "Convert" ボタンを一押し。
4. あっという間にLaTeX形式が出力されます！これをコピーしてお好きなTeXエディタに貼り付ければ完了。

## 🧐 背景：なぜこのツールを作成したのか

今論文を執筆中なんですが、表形式の実験結果はMarkdownで書き出しています。
実験結果を論文に載せようとした時、MarkdownのテーブルをLaTeXの形式に変換するのは、手作業で行うにはつらすぎます。特に、数多くのデータや複雑なテーブルを取り扱う場合、その変換作業は非常に煩雑です。この問題を解消するため、Markdownのテーブルを瞬時にLaTeXに変換することができるツールを作成することを決意しました。

## 🛠 技術スタック

このツールはReactとChakra UIを駆使して開発されました。特にChakra UIはデザインの一貫性を保ちつつ、レスポンシブなデザインを実現するのに非常に役立ちました。これはSPAであり完全にClientサイドで簡潔するため、github pagesで公開しています。

## 👋 あなたのフィードバックをお待ちしています！

このプロジェクトはオープンソースとして[GitHub](https://github.com/argonism/MdTable2Latex)で公開しています。もしバグを見つけたり、新しい機能のアイディアがあれば、ぜひプルリクエストやIssueで教えてください！コミュニティとしてツールをより良くしていくことを楽しみにしています。

![thumbson_160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285897/8b8b5076-ec68-ccd8-7219-b548203e669a.png)


---

以上、新しいプロジェクトの紹介でした！LaTeX変換の際の悩みが少しでも軽減されれば嬉しいです。ぜひお試しください！
PowerAutomateでメールを一括送付できないかな

### 職場で役立つプチＤＸ化を図ります
私の職場では様々なメールを定期的に一括配信しています。例えば、２週間おきに実施するミーティングの案内、会計処理の変更事項、部内で管理しているシステムのユーザーへ配信するメール等々･･･対象者も内容も様々です。
そこで、習いたてのPower　Automateを活用し、メーリングリストからメールを一括送信できる仕組みを作り、同僚から意見をもらいました。

### Power Automate Desktopについて
プロセスの自動化を実現するRPAツールです。無料ダウンロードできます。メールアドレス等を登録するお手続きがあります。

### 準備
*１．メーリングリスト*　
エクセルで作成します。項目は、名前・店名・アドレス・テンプレートにしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/ec039ff8-5015-0227-bdcb-cff1b11208f2.png"widh=50%>

*２．メールのテンプレート*　
テキストで作成します。今回は会議案内にしてみました。サンプルです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/f99fecd4-af28-1ab8-1af2-ec52b4a4aed8.png"widh=50%>

### フローの作成
*1.Excelの起動*
*2.Excel ワークシートから最初の空の列や行を取得*
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/76bc742d-3954-5e70-1740-a01cefdafd71.png"widh=50%>

*3.Excel ワークシートから読み取り*
*4.現在の日時を取得*
*5.変数の設定*
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/1dfdd83e-1ddc-00e7-ccb8-4abdc16d5c39.png"widh=50%>

*6.変数の設定*
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/08075aa6-801a-d525-4a18-2fc0d933e031.png"widh=50%>

*7.変数の設定*
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/d9309375-23f5-5c08-bdb9-88c790be13f0.png"widh=50%>

*8.For each*ループの中にあります　
 変数の設定・テキストの置換・メールの送信を設定していきます
*9.Excelを閉じる*
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/3ca31448-ffd3-e479-9f55-062060f57de0.png"widh=50%>

*10.メッセージの表示*
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/a76d1723-9afd-9d00-02c3-47875d4f0e38.png"widh=50%>
自分ではとても考えつかなかったので、ネットや書籍等々で調べてこのような設定を作りましたが、もっと良い方法があるかと思います。

実行ボタンを押下。サンプルでは無事メールが着信しました。（宛先は隠させていただきます。）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516547/195b63be-c3d3-a67e-bc6c-08f7f840fc38.png"widh=50%>


#### メンバーからの辛口コメント
部内ミーティングの場で出来上がった仕組みを職場のメンバーの前でデモンストレーションし、点数と率直な意見をもらいました。

≪**80点**≫
いつも私を助けてくれるアシスタントのＡさんの意見
メーリングリストやテンプレートがクラウド上で共有されていれば、メンバー内で必要に応じて配信できると思う。残りの２０点は、PowerAutomateをみんなが使えるようにすることが課題。
≪**80点**≫
１年半前から同じメンバーになったＢさんからの意見
便利だと思う。会議案内はOutlookスケジュールに連携させたいので、そういう技術があると良いと思う。
≪**70点**≫
上司からの意見
配信日時、配信データも自動化される等、もっと活用できるものを作れるのでは？

#### メンバーからのフィードバックを受けて
メーリングリストや、テキストのフォーマットは、部内で共有しているサーバで共有することで対応可能だと思います。
Ａさんと上司のリクエストをクリアする為に、更に勉強を続けて実際に活用してもらえる作品に仕上げたいと思います。

読んでいただきありがとうございました。
VMインスタンスにパスワード認証なSSH接続を可能にする

## 前提
- ブラウザ上でSSH接続可能である　　

こんな感じ。
## ほんへ
### ブラウザ上でシェルを開く
ググってください。
### SSHの設定を変更
```shell:command
sudo nano /etc/ssh/sshd_config
```
で設定ファイルを開き→
```
PasswordAuthentication no
```
を
```
PasswordAuthentication yes
```
に変更。

```
sudo systemctl restart sshd
```
でsshを再起動。

## 終わり
これでパスワードでSSH接続が可能になった。SFTPもできちゃいます。
2の32乗は覚えておくべきか？

1年だけ専門学校に通ってプログラマの勉強をしていました。
元々デザイン科でウェブデザインの勉強をしていたのですが、プラスアルファで必要だなと感じてシステム科に入学したというわけです。

PCは自作するぐらいには知識があったのですが、色々面白い体験ができました。

その中の一つが基本情報技術者試験対策の座学の授業。
前期の講師が、おそらく会社を経営されている方だと思うのですが、なかなか厳しかった記憶があります。
私は大卒向け学科だったのですが、合同で受けている生徒たちは高卒が多いのでそうなったのかもしれません。
とにかく教科書の使い方まで指定され、書き込むなと言われました。
理由を言うのですが、いやいや勉強の仕方はそれぞれやろとか心の中で思っていたんですね。

最初の授業。
おもむろに入ってくると自己紹介もなく、真っ白なコピー用紙を全員に配り始めました。
すると黒板だったか口頭だったか忘れましたが、問題を出して、答えをコピー用紙に書かせるのです。
そして、できた者から採点すると並ばせて、採点。

なんのことやら。

そういうのをだいたい毎回やるんです。
例えば、2の2乗、2の3乗、2の4乗・・・2の16乗・・・2の24乗・・・2の32乗というのは、何回も出されました。
2のべき乗は重要な指数のものは暗記させられました。
間違えるたびに「いつまで間違えてんねん」と言われたものです。
これになんの意味があるのかと思うこともたくさんありました。

後期、その講師の授業を受けていた人に聞いてみると、講師曰く「こんなの覚えていても役に立つことなんかない。お前らプログラマになるんやろ。覚えんねん。」とかなんとか。
そして、合格点を取ったものは立たされるのだと言います。
これを __スーパーメンタルアタック__ というらしく、勝者が敗者を見下すということらしいです。（又聞きなので本当かどうかはわかりません）
今ならアウトでしょうが、社会に出ればそういうこともいっぱいあるでしょう。

それから就職して、数年経ったとき思いもよらないところで、この2のべき乗が役に立つときが来ます。
ソーシャルゲーム案件で、会社独自の通信ライブラリを使って開発しているときに、システム全体で一意になるように採番していたユーザーアイテムのIDが20億に届きそうだったのです。
当時の通信ライブラリは、整数型は32ビット、つまり2の32乗通りしか表現できませんでした。
2の32乗、今でも言うことができます。

__4,294,967,296（42億9496万7296）__

通信ライブラリは符号付き32ビットでやり取りするので、単純に2分の1した21億が限界であることがすぐにわかりました。
幸いなことに、IDの発行具合を調べてみると1ヶ月ぐらいはまだ余裕があったと思います。

DBテーブルはBIGINT型（64ビット）にしていたので問題はなかったのですが、APIでやり取りされる数値は約21億に達するとオーバーフローするので、正しくデータが取得、更新できなくなります。大問題です。
ただライブラリが64ビット整数に対応していなかったので、仕方なく文字列型としてやり取りすることで解決しました。

たしかデータ集計などをしていて気づいたのですが、21億でアウトと説明できたのも当時の開発メンバーの中では自分ぐらいだったかもしれません。
いうてもエンジニア出身者も多かったので、すぐに理解はしてくれましたが。

2の32乗は覚えておくべきか。
私は覚えていて、命拾いをしました。
流石に2の64乗とか、128乗はとてつもない数字というぐらいの認識しかありませんが、0～10、16、24、32乗の大まかな数字は覚えておくといいかもです。
ほら、SSDの容量とかも128GBとか256GBとか512GBとかあるし。

このお仕事の話はもう10年経つのかな。
学校の話は15年以上前か。
エンジニアは特定の数字を覚えておいたほうがいいと思った話でした。

先生、役に立っているよ。現在進行形でも。

https://ja.wikipedia.org/wiki/2%E3%81%AE%E5%86%AA

ちなみに基本情報はしっかり落としました。
でも一応エンジニアやれています。

ちなみに講師の先生は授業外でもかなりの話しかけがたい人なのですが、すごくいい方でした。
「自分の会社持つんやったら、1日8時間仕事して、朝や夜の8時間でそれにパワー使う。でも残業とかあるから休日に取り返すんや」とか。
あれも仕事の一部と思えば・・・ですね。
【JavaScript】ポップアートと化した野獣先輩【アンディ・ウォーホル】

## 結論

https://mogamoga1024.github.io/PopArt/

![スクリーンショット 2023-09-12 204708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/a0f84a9d-1350-14ab-5bf5-709126877789.png)

## 作り方

1. 画像を用意する
1. 画像をSVGにする
1. いい感じに色を変える（rgbよりhslで調整するとポップな感じでよい）

画像をSVGに変換するライブラリは以下を利用しました。

https://github.com/jankovicsandras/imagetracerjs

以下はソース

https://github.com/mogamoga1024/PopArt/blob/master/main.js

https://github.com/mogamoga1024/PopArt/blob/master/createRandomStrSVGWorker.js

またrgbからhslに変換する際には以下のソースを使わせていただきました。

https://note.kiriukun.com/entry/20181206-rgb-and-hsl-conversion
Pythonを使ってて ModuleNotFoundError: No module named 'chardet' が出たとき

事案が発生した環境
- Python 3.10
- wsl Ubuntu(22.04)
- conda 環境を作成

ModuleNotFoundError: No module named 'chardet'
というエラーが出たときの対処法です。

##### 問題
pythonでプログラムを実行しようとしたところ、上記のエラーが出ました。
原因を軽く調べてみると文字を識別するパッケージが入っていないとのことでした。


##### 対処法
パッケージを入れてあげると問題なく動作します。

```bash
pip install chardet
```
CM4Stackをなるべくまっさらで作る

# 焼き
まず、下記いづれかの手順に従い、ホストPCの環境を整える
+ https://docs.m5stack.com/en/quick_start/cm4stack/arduino
+ https://www.raspberrypi.com/documentation/computers/compute-module.html

手順通り、BOOTを押しながら起動し、USBケーブルを繋ぎ、rpibootを使ってSDカードとしてマウントする。

SDカードとしてフォーマットしたあと、通常のraspiosを焼き込む。

一度普通に起動する。(ファンが回らない、液晶が動かないなどが起きるが、HDMI接続のモニタで普通に起動するはずである)

https://docs.m5stack.com/en/quick_start/cm4stack/arduino

ここで配布されているCM4Stack custom imageをダウンロードし、7-zipなどで開く。
イメージ内のイメージを開き0.fatを開いて、以下のファイルを取り出す。

+ /config.txt
+ /overlays/aw88xx.dtbo
+ /overlays/m5stack-cm4.dtbo

※ここからダウンロードできるものと多分同じ: https://github.com/m5stack/m5stack-linux-dtoverlays/tree/main

一度電源を落とし、BOOTを押しながら起動し、USBケーブルを繋ぎ、rpibootを使ってSDカードとしてマウントする。
認識した領域で、上記の取り出しておいたファイルを上書きする。

これで、液晶とタッチパネルが使えるようになる。

# 音がならない原因
なお、音を鳴らすには、aw882xx_drv.koを用意し、

```bash
sudo insmod aw882xx_drv.ko
```

する必要があるが、イメージに入っているものや[github](https://github.com/m5stack/m5stack-linux-dtoverlays/tree/main)にあるものは、カーネルバージョンが一致していないのか読み込まれない。
再ビルドが必要と思われる。

```
sudo nano /boot/config.txt
```
し、
```
arm_64bit=0
```
を追記して保存。rebootします。

これ対策。

https://akkiesoft.hatenablog.jp/entry/20230322/1679411927

次に、ドライバのビルドをします。

```
cd ~
git clone https://github.com/m5stack/m5stack-linux-dtoverlays.git
cd ~/m5stack-linux-dtoverlays/modules/aw882xx/src
```

Makefileを修正

```
LINUX_DIR=/lib/modules/$(shell uname -r)/build
```

aw882xx.cを修正
+ /*free gpio*/ の下4行をコメントアウト
+ int aw882xx_i2c_removeを、void aw882xx_i2c_removeに修正
+ void aw882xx_i2c_remove内のreturn 0;をreturn;に修正

```
make
```

で生成される。そのまま

```
sudo insmod aw882xx_drv.ko
```

でドライバが読み込まれる。

でも通信ができてないのか、dmesgでエラー吐いてて動かない。
無理やりスキップさせても別に動かない。


# ファン
ファンが回らない問題に関しては、GPIOの13を1にすれば回る。

```bash
sudo su
echo 13 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio13/direction
echo 1 > /sys/class/gpio/gpio13/value
```

```
bash: echo: write error: Device or resource busy
```

と出て回らないときは、/boot/config.txtの

```
dtoverlay=gpio-fan,gpiopin=13,temp=60000
```
を消すかコメントアウトすると回ります。

# カーネルのビルド
下記に従う。
途中注意書きに書かれているが、CM4は64bitカーネル32bitユーザーランドになるので、Raspberry Pi上でビルドする場合でも、クロスコンパイル手順を実行する必要がある。

https://www.raspberrypi.com/documentation/computers/linux_kernel.html
Electronでのアプリビルド方法(備忘録)

# 初めに
Electronを使用したデスクトップアプリのインストーラーをGithubにアップロードするためにアプリをビルドする際の一連の作業と詰まったポイントを備忘録として記録。

# 開発環境
Windows11
Node.js: 18.14.1
electron: 14.2.9
electron-builder: 23.4.0

# 手順
1. electron-builderのインストール
    今回はelectron-builderを使用してアプリをビルドするのでまずはelectron-builderをインストール。
    npmよりyarnが推奨されているのでyarnが無ければ先にやyarnをインストール。
    ```
    > npm install -g yarn
    > yarn add electron-builder --dev
    ```
2. アプリのビルド（Windows）
    以下のコマンドを実行して.exeファイルを作成。コマンド実行後、/distフォルダ内に作成されます。
    ```
    > npx electron-builder --win --x64 
    ``` 
3. アプリのビルド（Mac）
    結論から言うとWindowsPCでMac用インストーラーを作成することはできないようです。
    [別の記事](https://qiita.com/gabuchaan/items/6ebf650a4920857c2810)でいろいろ試したことを紹介してます（結局配布するにはAppleのライセンスを購入しなければならない:unamused:）。
    一応コマンドだけ、、、
    ```
    > npx electron-builder --mac --x64
    ``` 
# まとめ
electron-builderを使えば非常に簡単にアプリが配布できる。
Macはややこしい:zipper_mouth:
Prisma Clientって何?

# 説明
Prismaの機能の1つで、DB操作をJavaScript/TypeScriptで実現する。
ローカル環境では、`npx prisma generate`でDB操作で使用するコードのライブラリを生成する。
「PrismaClientを生成する」といった場合、このライブラリを生成することを指す。

格納場所: node_modules/.prisma/client
## ライブラリは以下を含む
 - 型付けされたデータベースクライアント:
   - Prisma Client主要部分。
   - データベースとの実際のやり取りを行う部分で、接続情報やトランザクション管理をする。
   - 開発者とPrisma間のインターフェース。
 - 型定義:
   - schema.prisma ファイルに基づいて、JavaScript/TypeScriptのコードで使用される型が生成される。
   - データベースとのやり取りが型安全になる。
 - クエリエンジン:
   - Prisma Clientの背後で動作するバイナリファイル。
   - 実際のデータベース操作を担当する。
 - モデルに基づくCRUD API:
   - 各モデルに対して、CRUD操作をサポートするAPIが生成される。
 - 関連するヘルパーAPI:
   - リレーションやトランザクションなど、データベース操作に関連する追加のAPIを提供する。
 - ランタイム:
   - PrismaClientのランタイム。
   - クエリの生成や実行、クエリエンジンとの通信など。


# 例
以下記述の実行を考える。
```javascript
 ...
const prisma = new Prisma;
 ...
await prisma.users.create({
 ...
});
```
1. `const prisma = new Prisma`などという記述でデータベースクライアントのインスタンスを生成する。
1. `prisma.users.create()`のPrismaClient APIが呼び出される。
2. ランタイムにより、`prisma.users.create()`がSQLに変換され、クエリエンジンに渡される。
3. クエリエンジンにより、SQLクエリはDBに送信され、レスポンスを受け取る。
4. クエリエンジンは、レスポンスをランタイムに渡し、その結果がコードとして表示される。
【Unity】ShaderGraph(2D)でステンシルバッファってのを作る

# ■はじめに
UnityでShaderGraphを利用して、こんな感じのやつを作れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/29f54f80-5336-1f14-df44-39790fdf17aa.png)

物陰に隠れたら、隠れた部分が円で描画される感じの表現ができます
これのことを **ステンシルバッファ(Stencil Buffer)** っていうらしいです

# ■紹介
## ●ShaderGraph
### ・画像アスペクト比調整
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/28bb4e3e-3b6f-ca69-6d5a-2b189b053701.png)
詳しくは記事の[一番下の参考サイト](https://qiita.com/kiku09020/items/fe6350e9915af663a4c5#%E5%8F%82%E8%80%83)からどうぞ

### ・円形パターン作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/22581223-b899-a777-86e0-13c405c6ad13.png)
円模様作ってます。参考サイトでは、白黒チェッカー柄の柄で表現していました。
お好きな表現でいい感じに作ってみてください。


### 色調整
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/1433ee17-f7f4-9885-6491-c571269072be.png)
透明度とか色とか。

一応色も変更できますが、前面のオブジェクトに透明箇所があると、このように透明箇所にも適用されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/7bf4192f-689b-7586-3d96-d395813fe216.png)
改善案あればぜひ教えてください！

## ●Renderer2D
URPプロジェクト作成時に自動的に生成されるSettingsフォルダ内のRenderer2Dで色々いじります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/75e0ecee-4d5c-01da-405a-b914d8c8acc7.png)

最終的なのはこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/979e2536-d966-9723-6306-41a0a29fe3eb.png)
なんか項目いっぱいあってわけわからんと思うので、解説します

1. 一番下のAdd Renderer Featureってのをクリックして、RendererObjectってのを2回選択して追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/1d42fa9b-a2da-8cee-9823-0a688706aa87.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/ab58ae27-bf55-2940-3689-31b9af35f3de.png)

1. 追加したやつにそれぞれ名前を付けて、前面のオブジェクト用のやつには`BeforeRenderingOpaques`ってのを選択して、後面用には`AfterRenderingTransparents`ってのを選択する
(※ほかのシェーダーとかとの併用とか、その他諸々で描画順が異なってくるので、実際に試しながら適当に決めてください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/3008a805-fab0-9930-4538-7e7a318035b7.png)

1. その下のFiltersってとこを開いて、`LayerMask`に適用したいLayerをそれぞれ追加する
1. Overrideってところを開いて、後面用の方の`OverrideMode`を`Material`に変更して、さっきのShaderGraphのマテリアルを適用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/239d6fc2-32ec-ed19-78d7-bfef50d47375.png)

1. 前面の方はこんな感じに設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/329665e9-3938-180b-cd27-f338b4532d7e.png)
1. 後面の方はこんな感じに設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/a92ddc37-a18b-ecae-fa8c-a7cdb934576a.png)





# ■さいごに
ちょっとめんどいけど、ShaderGraoh使えば結構リッチになるからいいよね

## ●参考
https://www.cyanilux.com/tutorials/sprite-stencil-overlay-breakdown/

https://qiita.com/Putinu/items/9de81bceaa96662236b2
フロントエンド開発の変遷③ SPAの登場とMVC/MVVMフレームワーク

フロントエンド開発の変遷シリーズ第3回です。
第2回はこちら。

https://qiita.com/yusuke2310/items/2c58a1fb08b1bb5b3350

---

:::note
**SPA**（シングルページアプリケーション）とは、起動時に一度HTML全体をロードし、以後はユーザーインタラクションに応じてAjaxで情報を取得し、動的にページを更新するWebアプリケーションのこと。
:::

|  | 説明 |
|:-:|:-:|
| 従来のWebアプリケーション|HTML全体をページ遷移の度に読み込む   |
| SPA  |ページ遷移をクライアントサイドで行う。Ajaxを使用して必要な時に必要な部分だけデータを取得してViewを表示するため、オーバーヘッドが軽減される   |

従来型のWebアプリケーションよりも、より高速なUIの動作を実現でき、ネイティブアプリのような、より滑らかなユーザー体験を提供できる。現在では多くのWebアプリケーションがSPAで実装されている。

また、SPAの流行に合わせてサーバーサイドの実装も変化しています。SPA以前はJavaのStrutsや、Ruby on RailsなどのサーバーサイドのMVCフレームワークが備えているビューの機能によってUIを実装するのが一般的でした。この形式では、サーバーサイドがビュー（HTMLの生成）までを担当し、都度HTMLをクライアントサイドに渡していた。

SPAの登場によりJSON形式のAPIがサーバーサイドとフロントエンドのつなぎを担うという設計が普及した。サーバーサイドはJSONをクライアントサイドに渡し、そのJSONをもとにクライアントサイドはビューを構築する。HTMLを逐一渡すのに比べ、JSONを渡す場合はビューの部分的な更新・高速な更新が可能になるメリットがあります。

|Webフレームワークのスタイル |フロントエンドの役割 |サーバーサイドの役割 |
|:-|:-|:-|
|SPA以前   |補助的・限定的   | MVC全てを担う。HTMLの生成までを担当。  |
|ReactなどのSPA   |ビューの構築などの大きな役割を果たす   |シンプルな実装が好まれるように。JSONを返す。   |

#### SPAを導入するメリットとデメリット
##### メリット  
+ ハイパフォーマンスなアプリケーションを提供できる
+ サーバーサイドエンジニアとフロントエンドエンジニアの分業が容易になる
+ JSON APIによる疎結合の設計ができる
+ iOSやAndroidなどネイティブアプリクライアントに対してもAPIによる疎結合なシステム構成が対応可能になる

##### デメリット 
+ JavaScriptの読み込みとレンダリングが発生するため対策しないと初期表示に少し時間がかかる
+ フロントエンドの学習コストが高い
+ フロントエンドのコード量が多くなる
+ 経験のある人材の採用が難しい


#### SPAを支える技術要素
+ URLパスとViewのルーティング管理
+ クライアントサイドでのブラウザ履歴管理によるページ遷移
+ 非同期によるデータ取得
+ Viewのレンダリング
+ モジュール化されたコードの管理

Reactはこの中でView関連に注目したライブラリ。そのためReact Routerなどのルーティング機能を持つライブラリを利用してSPAを実装するのが一般的。


第4回はこちら

https://qiita.com/yusuke2310/items/d6851137b00c9df42fc4
eclipseとGitHubの連携

連携手順
1.GitHubアカウント作成
2.リポジトリ作成
3.eclipseプロジェクトのリポジトリ化
4.GitHubの新規登録

４.GitHubの新規登録でつまずきました。

ユーザー名とパスを入力してもパスワードが存在しません、とポップアップが表示される。
調べたところパスはGitHubのトークンを入力するとのこと。
GitHubでトークンを取得し再度登録。
レポジトリはありません、とポップアップが表示される。。
初めに間違えたパスが登録されていたので【一般】→【セキュア・ストレージ】→【GIT】→【内容】→登録されているGITを削除。

再度、トークンをパスに貼り付けし、プッシュ。　
無事コミットプッシュできました。
Windowsタスクスケジューラを用いたGPUの電力制限

## 概要
機械学習やゲームなど、グラボ（RTX 2080Ti）に高負荷をかけたときの電力消費をおさえるために、GPUの電力制限を設定している。ただ、Windowsを再起動するたびにリセットされてしまうので毎回設定しなおすのが手間だった。そこで、バッチファイル＋タスクスケジューラを使用し、OS起動時に電力制限を自動設定する運用に変更した。その時の手順を記事として残しておく。

なお、アイドル状態におけるGPUの電力消費は低いので、GPUをフルで回さないなら電力制限を設定する必要はないと思う。


## バッチファイルの作成

電力制限を変更するバッチファイルのサンプルは以下の通り。
任意のファイル名で保存する。（例：c:\work\gpu_power_limit.bat）


```
@echo off
setlocal

REM -- REMから始まる行はコメント行

REM -- 電力制限ワット数のパラメータ（例：150Wに設定する場合）
set UPPER_LIMIT_W=150

REM -- nvidia-smiコマンドのパス
set NVIDIA_SMI=C:\Windows\System32\nvidia-smi.exe

REM -- 電力制限の実行
call %NVIDIA_SMI% -pl %UPPER_LIMIT_W%

endlocal
```

このスクリプトは、[GPU にパワーリミットを設定する](https://blog.amedama.jp/entry/nvidia-smi-gpu-power-limit#GPU-%E3%81%AB%E3%83%91%E3%83%AF%E3%83%BC%E3%83%AA%E3%83%9F%E3%83%83%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)のサイトを参考にした。

[備考]
電力制限を設定するとGPUの動作が不安定になる可能性がある。そのため、ためしに手動で電力制限を行い問題が起きないか事前に確認するのが望ましい。
なお、電力制限を行うnvidia-smiコマンドは、管理者モードのコマンドプロンプトで実行する必要がある。

## タスクスケジューラの設定

- タスクスケジューラを起動
スタートメニュー＞Windows管理ツール＞タスクスケジューラ

- タスクの作成

タスクの作成をクリック
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/1c45d8dd-a0ac-8e58-cd0a-19fe0ef1a8fe.jpeg)


「全般」タブ
　タスクの名前を入力（例：GPU電力制限タスク）
　「ユーザーがログオンしているかどうかにかかわらず実行する」を選択
　「最上位の特権で実行する」をチェック
　構成はWindows10に変更（何となく）
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/7af3e3c0-f823-3f12-0635-07dc48c3bf4e.jpeg)

続いて「トリガー」タブ
　トリガーを新規作成。タスクの開始を「スタートアップ時」に変更してOK
![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/04288a41-92a8-8768-ce87-cc01db7da272.jpeg)

トリガーを設定したら、となりの操作タブへ
![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/04ae0073-0a23-64b2-a914-32ee9d94dac2.jpeg)

「操作」タブ
　作成済みのバッチファイルをセットしてOK
![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/6c591f23-03eb-a4ae-72fa-d70841736d96.jpeg)

操作を設定したら、となりの条件タブへ
![07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/79cea81d-066e-7888-7611-5688e9ab34ed.jpeg)


「条件」タブ
　特に変更しなくてよい
![08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/1aae9368-eb06-ef1d-ffe8-70729b9bbeb3.jpeg)

「設定」タブ
　特に変更しなくてよい
![09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/34dfd0cb-c25b-d3ce-4d39-ecfd3b0e298e.jpeg)

最後にOKをクリックすると認証が求められる。
タスクが作成されると、アクティブなタスクとして登録される。
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/e35adf4f-b114-1350-4020-9a368fce92bd.jpeg)


## 確認(OS再起動後の確認)

nvidia-smiコマンドで電力の上限が確認できる。

設定前
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/e27de4d0-cd10-c31c-39c0-d8e7d81fac13.jpeg)

設定後
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238113/de26b420-b75c-9a14-651d-96c0dab72893.jpeg)

## 参考

nvidia-smi(1) で GPU にパワーリミットを設定して消費電力や発熱を減らす
https://blog.amedama.jp/entry/nvidia-smi-gpu-power-limit#GPU-%E3%81%AB%E3%83%91%E3%83%AF%E3%83%BC%E3%83%AA%E3%83%9F%E3%83%83%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B


おしまい。
Ubuntu22.04におけるローカルにクローンしたGitリポジトリの管理を楽にするために

## はじめに
エンジニアにいつかなろうとしている情弱WANNABEがチャレンジしました。

## きっかけ
めちゃめちゃ親切な友人から下記の記事をおすすめしてもらいました。
https://zenn.dev/obregonia1/articles/e82868e8f66793
pecoとかghqとかわからんかったので、最初は入れる気がなかったのですが、勉強がてらいれることにしました。

いろんなサイトをみまして、インストールが複雑な文字列ばっかりで難しかった。
**（注意）なので、とりあえず動かすために最低限必要な要素をまとめてました。**

## 参考にしたサイト
go：https://qiita.com/m-tmatma/items/3477e2a107c20a33e6f1
peco:https://github.com/peco/peco
ghq:https://github.com/x-motemen/ghq

## 実施前の環境
golang入れていない。もちろんpecoとghqも入れていない。
gitは入れていました。

## 実施前の課題
git cloneしてローカルリポジトリ作るのがめんどくさい作業だと感じていました。（git使うの難しい、、、）

## 実施したこと
基本的には公式ドキュメント通りに作業しました。

### インストール作業（1/3）
```terminal
sudo apt update
sudo apt install -y golang-go
go install github.com/x-motemen/ghq@latest
sudo apt install peco
```
### パス通す作業（2/3）
bashrcにgolangへのPATHを通すらしい。
bashrcとはシェル（bash）を読み込んだときに読まれる設定ファイルらしい。（https://wa3.i-3-i.info/word13649.html）
```terminal
nano ~/.bashrc
```
```.basrc
# golang configure
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
```
sourceはシェル（bach）上に設定ファイルを読み込むらしい。
```terminal
source $HOME/.bashrc
```
### 確認作業（3/3）
コマンド
```terminal
go version
peco version
ghq --version
```
結果
```terminal
$ go version
go version go1.18.1 linux/amd64
$ peco --version
peco version v0.5.10 (built with go1.17)
$ ghq --version
ghq version 1.4.2 (rev:HEAD)
```

あれっ、、、pecoでbuilt with go1.17ってなってるなぁ。
よくわからないから無視しよう（ちゃんと調べます。）

［2023/9/13 追記］
親友の@RIckyBan氏から速攻で回答きました。マジで天才。頑張ります。
> これは不思議なことではなくて、aptではビルド済みのバイナリを配信してるからじゃないかな
> 仮にソースからビルドする場合であればローカルに存在するgoのランタイムを使うはずだけど、今回ズレてるのは全然あり得る話

ビルド済みのバイナリを配信ってことなので、ローカルに入ってるGoのバージョンとは特に関係なく動くみたいですね。セキュリティ修正があったときにビルドしたバージョンは重要みたいですね〜。

うまく入っていたら以下のようなバージョンになると思います。（2023年9月12日現在）
|ライブラリ|version|
|--|--|
|go|go1.18.1|
|peco|v0.5.10|
|ghq|1.4.2|

## 実施後
以下のコマンドでいい感じにクローンしてくれる。
```terminal
 ghq get git@github.com:（ディレクトリ部分）
```
pecoは単体だけだとうまく使えないので下記のようにaliasでコマンドを登録しておくといい感じにクローンしてきたリポジトリを変更できるようになる。
```terminal
nano ~/.bash_aliases
```

```.bash_aliases
alias gitcd='cd $(ghq root)/$(ghq list | peco)'
```
```terminal
source $HOME/.bash_aliases
```


これで`gitcd`をterminal上で打てばいい感じにディレクトリ移動できるようになる。

## 結果
いい感じになった！
みなさんも試してみよう〜
友人の@RIckyBan氏ありがとう。

まだgit使いこなせていないからだが、レポジトリのbranch切り替えも難しく、どうにかかんたんにしたいです。（勉強せよっ）
環境によって変化するディレクトリコピー時の振る舞い

cpコマンドで-r以外のoptionを付けずにディレクトリをコピーする際や、Dockerfile内でCOPYコマンドを使う際、環境やディレクトリ名に/を付けるか否かによって振る舞いが異なったので、備忘録的にまとめておきます。

- macOSのcpコマンド
- ubuntu linux (on Docker)のcpコマンド
- Dockerイメージビルド時のCOPYコマンド

について投稿者のmacbook上でのテスト結果をまとめたものになるので、もしかすると実際の挙動とは異なるところがあるかもしれません。

扱うパターンは以下の通りです。

```bash
# mac, ubuntu linux (on Docker)
cp -r dir1 dir2
cp -r dir1/ dir2
cp -r dir1 dir2/
cp -r dir1/ dir2/
```
```Dockerfile
# Dockerfile (dir2は既にコンテナ側に存在)
COPY dir1 dir2
COPY dir1/ dir2
COPY dir1 dir2/
COPY dir1/ dir2/
```

大元のディレクトリ構成は以下のようになっています。

```bash
├── dir1/
│   └── child_dir1/
└── dir2/
    └── child_dir2/
```

# cp元dirがcp先dirの子になるパターン

```bash
cp -r dir1 dir2

├── dir1/
│   └── child_dir1/
└── dir2/
    ├── child_dir2/
    └── dir1/
        └── child_dir1/
```

- ubuntu linux (on Docker)では必ずこうなる
- macOSではcp元ディレクトリ名に/を付けない時（`cp -r dir1 dir2`もしくは`cp -r dir1 dir2/`とする場合）にこうなる

# cp元dirの中身がcp先dirにコピーされるパターン

```bash
cp -r dir1 dir2 # macOSの場合
COPY dir1 dir2 # Dockerfileの場合

├── dir1
│   └── child_dir1/
└── dir2
    ├── child_dir1/
    └── child_dir2/
```

- Dockerfile上のCOPYコマンドでは必ずこうなる
- macOSではcp元ディレクトリ名に/を付ける時（`cp -r dir1/ dir2`もしくは`cp -r dir1/ dir2/`とする場合）にこうなる
【VSCode】言語別にタブサイズを設定する方法

`settings.json`に以下のように記述すると言語別にタブサイズを設定できます。

```json:settings.json
{
  "[設定した言語]": {
    "editor.tabSize": タブのサイズ
  }
}
```

`javascript`の設定をする際には以下のように記述します。

```json:settings.json
{
  "[javascript]": {
    "editor.tabSize": 2
  }
}

```
めちゃくちゃに出来る！LXD内でOpen Interpreterを構築してみた！

## 目的
openinterpreterのデメリットとして、メインの環境で実行するとファイルの削除など、めちゃくちゃにされてしまう事があげられる。それならば、いくらめちゃくちゃにされても怖くない環境で構築すれば良い。
Docker内で実行するのとは違ってVMの様な環境で実行するので自由度が高い。

## 前提
以下二つのソフトをインストールしてください

- lxd環境のインストール
- lxdcliのインストール

インストールしていなかったら以下の記事を参考にしてください

https://qiita.com/engishoma/items/89b041b6903739f77ec9

https://qiita.com/engishoma/items/f691303c10978d75aad7


## LXDFILEの作成
lxdfile
```dockerfile
CONTAINERNAME ubuntu-interpreter
FROM ubuntu/22.04


RUN export DEBIAN_FRONTEND=noninteractive
RUN timedatectl set-timezone Asia/Tokyo && hostnamectl set-hostname ubuntu-interpreter
RUN apt-get -y update

RUN dpkg --configure -a
RUN echo "\n\n\n" | apt-get -y install openssh-server build-essential
RUN apt-get -y install curl

RUN echo -e "root:password" | chpasswd
RUN echo -e 'PermitRootLogin  yes' >> /etc/ssh/sshd_config


RUN systemctl enable ssh
RUN systemctl restart ssh
RUN systemctl start ssh


RUN apt-get -y install python3-pip nano
RUN mkdir .pip
RUN touch .pip/pip.conf
RUN echo "[global]" >> .pip/pip.conf
RUN echo "break-system-packages = true" >> .pip/pip.conf

RUN pip install open-interpreter
RUN pip install llama-cpp-python
```

## ビルド
ちょっと時間がかかる
```bash
$ lxdcli build lxdfile
```

## ログイン
```bash
$ lxc shell ubuntu-interpreter
```

## openinterpreterの起動
```bash
interpreter
```

## 設定
Open AIのAPI keyを求められるが、エンターを押すと、LLaMAを使える（無料）
```bash
root@shoma:/home/shoma # lxc shell ubuntu-interpreter
root@ubuntu-interpreter:~# interpreter

Welcome to Open Interpreter.

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

? OpenAI API key not found

To use GPT-4 (recommended) please provide an OpenAI API key.

To use Code-Llama (free but less capable) press enter.

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

OpenAI API key:
```

設定を進めて、最終的に下の様な表示になれば後はプロンプトを入力するだけ！
```bash
>
```

システムコンテナ内なので、めちゃくちゃにしても何も怖くない！
トリガとフローなどの実行順序



トリガとフローなどの実行順序
1.元のレコードがデータベースから読み込まれるか、upsertステートメント用にレコードが初期設定されます。
2.要求から新しいレコード項目の値が読み込まれ、古い値を上書きします。
3.レコードの保存前に実行されるように設定されたレコードトリガフローを実行します。
4.すべてのbeforeトリガが実行されます。
5.入力規則やシステム検証の手順
6.重複ルール
7.レコードはデータベースに保存されますが、まだ確定されません
8.すべてのafterトリガが実行されます。
9.割り当てルールが実行されます。
10.自動応答ルールが実行されます。
11.ワークフロールールが実行されます。
12.エスカレーションルールが実行されます。
13.次のフロー自動化を実行しますが、順序は保証されません。
・プロセス
・プロセスによって起動されたフロー
14.レコードの保存後に実行されるように設定されたレコードトリガフローを実行します。
15.エンタイトルメントルールが実行されます。
16.積み上げ集計
17.クロスオブジェクトワークフロー
18.条件に基づく共有の評価が実行されます。
19.すべてのDML操作がデータベースで確定されます。
20.変更がデータベースにコミットされた後、コミット後ロジックが実行されます。
・メールの送信
・キューに登録された非同期Apexジョブ
・レコードトリガフローの非同期パス

公式サイト：https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm
SQL tips 1: 試すときはなるべく絞る

大きいデータベースを使うことになって、どんなデータがあるのかを見たいときには、データを絞りましょう。
クエリとしては以下みたいに。
```sql
SELECT A
    FROM X
    WHERE C = "~"
```
取ってくる列をSELECT句で、行をWHERE句で絞ってます。
ちなみに一番簡単なクエリはこんなもので、全部の列を取得します。
```sql
SELECT *
    FROM X
```

簡単な内容ですが3日に一回くらい書いてみます。
【SQL】UNION と UNION ALL

`生徒`テーブル

|所属 |学年|名前|
|:-:|:-:|:-:|
|スターライト学園  |1  |星宮いちご  |
|スターライト学園  |1  |霧矢あおい  |
|スターライト学園  |1  |紫吹蘭  |
|ドリームアカデミー  |1  |音城セイラ  |
|ドリームアカデミー  |1  |冴草きい  |

`転校生`テーブル
同姓同名の「星宮いちご」が転校してきた
|所属 |学年ID|名前|
|:-:|:-:|:-:|
|スターライト学園  |1  |星宮いちご  |
|ドリームアカデミー  |2  |風沢そら  |


# UNION 
```SQL
SELECT * FROM スターライト学園
UNION
SELECT * FROM ドリームアカデミー
```

|所属 |学年ID|名前|
|:-:|:-:|:-:|
|スターライト学園  |1  |星宮いちご  |
|スターライト学園  |1  |霧矢あおい  |
|スターライト学園  |1  |紫吹蘭  |
|ドリームアカデミー  |1  |音城セイラ  |
|ドリームアカデミー  |1  |冴草きい  |
|ドリームアカデミー  |2 |風沢そら  |

縦に結合するので、カラム数は一致必須
このとき重複は削除する

# UNION ALL
重複あり

```SQL
SELECT * FROM スターライト学園
UNION ALL
SELECT * FROM ドリームアカデミー
```
|所属 |学年ID|名前|
|:-:|:-:|:-:|
|スターライト学園  |1  |<font color="DeepPink">星宮いちご</font>|
|スターライト学園  |1  |霧矢あおい  |
|スターライト学園  |1  |紫吹蘭  |
|ドリームアカデミー  |1  |音城セイラ  |
|ドリームアカデミー  |1  |冴草きい  |
|スターライト学園  |1  |<font color="DeepPink">星宮いちご</font>  |
|ドリームアカデミー  |1  |風沢そら  |
【備忘録】cakePHP4でControllerと違う名前のModelを使いたいとき

# Model側に処理を作っておく
データのやり取り自体は`controller`の中ではなく、`Model/XXTable.php`に書くのがスマートらしい。
```php:Model/UsersTable.php
public function findUserDataOneByUsername($username)
{
    if(empty($username)) {
        return null;
    }
    return $this->find()
                ->where(['User.username' => $username])
                ->first();
}
```

# 同じ名称のModelを使用する場合
```php:UsersController.php
class UsersController extends AppController
{
    public function view($username = null)
    {
        // findUserDataOneByUsername は Model/UsersTable.php に定義
        $user = $this->Users->findUserDataOneByUsername($username);
        $this->set(compact('user'));
    }
}
```



# 名称違いのModelを使いたい場合
`PostsController`の中で、`Users`モデルを使いたいとき等。

```php:PostsController.php

class PostsController extends AppController
{
    public function view($username = null)
    {
        $usersTable = $this->fetchTable('Users');

        $user = $usersTable->findUserDataOneByUsername($username);
        $this->set(compact('user'));
    }
}
```
`cakePHP4.0`では`$this->loadModel('モデル名')`でよかったけど、
`cakePHP4.3`以上では非推奨で、代わりに`$this->fetchTable('モデル名')`を使うらしい。

# 余談：Modelで別のModelを使いたい場合
`Posts`モデルの中で、`Users`モデルを使いたいとき等。
```php:Model/PostsTable.php
use Cake\ORM\TableRegistry;

public function findUserDataOneByUsername($username)
{
    $usersTable = TableRegistry::getTableLocator()->get('Logs');

    if(empty($username)) {
        return null;
    }
    return $usersTable->find()
                      ->where(['User.username' => $username])
                      ->first();
}

```

`TableRegistry::getTableLocator()->get('Model名')`はModelの中で使うみたいです。
souceryを使った新規登録ができない

今回の記事はあまり役立つものではないが一応記録として残しておく
新規登録をする際にこのエラー文が出ていた
```
NoMethodError in UsersController#create
undefined method `crypted_password=' for #<User id: nil, email: "r@a", password_digest: nil, salt: "ykCB6gjaxMiesGxRoC3B", first_name: "あ", last_name: "あ">
Did you mean?
encrypt_password
Extracted source (around line #9):
```
これに苦しんでいたわけだが有料chatGPTに登録して使ってみるとものの30分で解決してしまった

直した点は
・usersコントローラーの
```
def user_params
        params.require(:user).permit(:email, :password, :password_confirmation,:last_name,:first_name)
    end
```
にcrypted_passwordを追加した（カラムをcrypted_passwordにしたときは一緒に変更していた）

・Userテーブルのカラムをpassword_digestからcrypted_passwordに変更した
　（何度も変更していたのになぜ解決しなかったかはわからない）

要するに技術的なことは何もわかっていない

この件で学んだこと
・chatGPTは絶対に課金するべきだということ
・人間のアドバイスは必ず当たっているわけではないこと

有料chatGPTと結婚したいレベルで惚れた
VScode Web版でのおすすめ拡張機能

VScode Web版のおすすめの拡張を共有したいと思います。
## おすすめの拡張機能一覧
VScode Web版に対応している拡張機能は限られているためそのなかから、おすすめのものを紹介したいと思います。
### Prettier

https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

言わずとしれたコード整形ツール。
整形するには、編集画面で
　右クリック→`ドキュメントのフォーマット`
を選択してフォーマット構成に`Prettier`を設定することで整形できます。
`Format on save`にチェックをつけておくと、なお使いやすい。
### indent-rainbow

https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow

インデントに色をつけてくれます。HTMLとかは本当に虹みたいできれい。
### Material Icon Theme

https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme

フォルダやファイル名の横にアイコンをつけてくれます。見やすいアイコンで目に優しい。
また、対応しているものも多く。[このサイト](https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme "Material Icon Theme")で対応しているもの一覧が見れる。
### Import cost

https://marketplace.visualstudio.com/items?itemName=wix.vscode-import-cost

インポートしたファイルのサイズを教えてくれる。

こんな感じ：
<font color="DarkSlateBlue">import</font> Head <font color="DarkSlateBlue">from</font> <font color="FireBrick">"next/head"</font>; <font color="LimeGreen">5.4k (gzipped: 2k)</font>

~~どうでもいい~~
### Live Share

https://visualstudio.microsoft.com/ja/services/live-share/

URLを共有するだけで、誰かと共有できる。
なお、共有するためにはGithubアカウントか、Microsoftアカウントが必要。

## まとめ
私のChromebookでの環境では、VScodeの動作が不安定なため、Web版を利用してローカル上のファイルを編集してLinux仮想環境のターミナルで動かすという開発をしています。

もしよかったら、VScode web版を使うときの参考にしてみたください！！！
GoでPDFを作成する

## はじめに
表題通り、GoでPDFを作成する記事となります。

## 成果物
```shell:ディレクトリ構成
~/go/src/go_pdf$ tree
.
├── example.pdf
├── go.mod
├── go.sum
└── main.go

1 directory, 4 files
```

```go:main.go
package main

import (
	"fmt"

	"github.com/jung-kurt/gofpdf"
)

func main() {
    // PDFを新規作成
    pdf := gofpdf.New("P", "mm", "A4", "")
    pdf.AddPage()

    // フォントの設定
    pdf.SetFont("Arial", "B", 16)
    pdf.Cell(40, 10, "Hello World")

    // ファイルに保存
    err := pdf.OutputFileAndClose("example.pdf")
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println("PDFファイルが作成されました。")
}
```

→実行すると、`example.pdf`が作成されます。
Golangでファイルをzip化する

## はじめに
表題通り、Golangでファイルをzip化します。

## 成果物
```shell:ディレクトリ
~/go/src/go_zip$ tree
.
├── files
│   ├── pdf1.pdf
│   ├── pdf2.pdf
│   └── pdf3.pdf
├── go.mod
├── main.go

1 directories, 5 files
```

## 1ファイルのみZip化
```go:main.go

func main() {
	// ZIPファイルの作成
	zipFile, err := os.Create("output.zip")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer zipFile.Close()

	// ZIPライターの初期化
	zipWriter := zip.NewWriter(zipFile)
	defer zipWriter.Close()

	// PDFファイルをZIPに追加
	if err := addFileToZip("files/pdf1.pdf", zipWriter); err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("ZIPアーカイブが作成されました")
}

func addFileToZip(filename string, zipWriter *zip.Writer) error {
	// ZIPファイルに新しいファイルエントリを作成
	fileToZip, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer fileToZip.Close()

	// ZIPファイル内のファイルエントリを作成
	fileInfo, err := fileToZip.Stat()
	if err != nil {
		return err
	}

	header, err := zip.FileInfoHeader(fileInfo)
	if err != nil {
		return err
	}

	header.Name = filename
	header.Method = zip.Deflate

	// ZIPファイルにファイルを書き込む
	writer, err := zipWriter.CreateHeader(header)
	if err != nil {
		return err
	}

	_, err = io.Copy(writer, fileToZip)
	return err
}
```

```go:実行結果
~/go/src/go_zip$ go run main.go
ZIPアーカイブが作成されました
```
→これで`output.zip`作成されている事を確認しましょう！

## 複数ファイルZip化

```go:main.go
package main

import (
	"archive/zip"
	"fmt"
	"io"
	"os"
	"path/filepath"
)

func main() {
	// ZIPファイルの作成
	zipFile, err := os.Create("output_multi.zip")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer zipFile.Close()

	// ZIPライターの初期化
	zipWriter := zip.NewWriter(zipFile)
	defer zipWriter.Close()
	
	// 圧縮したいファイルのリスト
	filesToZip := []string{"files/pdf1.pdf", "files/pdf2.pdf", "files/pdf3.pdf"}

	for _, filename := range filesToZip {
		if err := addFileToZip(filename, zipWriter); err != nil {
			fmt.Println(err)
			return
		}
	}

	fmt.Println("複数のファイルがZIPアーカイブに圧縮されました")
}

func addFileToZip(filename string, zipWriter *zip.Writer) error {
	// ZIPファイルに新しいファイルエントリを作成
	fileToZip, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer fileToZip.Close()

	// ZIPファイル内のファイルエントリを作成
	fileInfo, err := fileToZip.Stat()
	if err != nil {
		return err
	}

	header, err := zip.FileInfoHeader(fileInfo)
	if err != nil {
		return err
	}

	// ZIPファイル内のパスを設定（ファイル名のみ）
	header.Name = filepath.Base(filename)
	header.Method = zip.Deflate

	// ZIPファイルにファイルを書き込む
	writer, err := zipWriter.CreateHeader(header)
	if err != nil {
		return err
	}

	_, err = io.Copy(writer, fileToZip)
	return err
}

```
→これで実行すると、`output_multi.zip`が作成され、3つのpdfファイルが作成されています！！
Nuttx Flahsing

# はじめに
前回の環境準備からマイコンが届き、ビルドしたプログラムを書き込む準備ができました。
その際にあったものもろもろメモ書きで残そうと思います。

# Flshing
早速、公式ドキュメントから用意されているコマンドを実行し書き込みます。
```
openocd -f interface/stlink.cfg -f target/stm32bluepill.cfg -c init -c "reset halt" -c 'flash write_image erase nuttx.bin 0x08000000' -c 'shutdown'
```
ここで使うstm32bluepill.cfgについて下で説明します。

このあと想定通りのアドレスに書き込まれているかを確認します。
下記のコマンドからデバックツールのgdbを実行します
```
arm-none-eabi-gdb
target remote :3333
where #->現在プログラムがどこまで来ているかを確認します。
```
結果として0x80000000以降のアドレスだったので書き込まれたプログラムは問題なく動いているようです。

次は書き込んだアプリの動作確認を行いたいと思います。
マイコンのUART(A9, A10)シリアルからアクセス可能です。ツールは以前インストるした`minicom`を使います。
`minicom -s`
ダーゲットを指定しポートを開くと、普通のCMDが出てきます。
この画面が見えたら動作確認終了です。



# issue
1. 動作確認の際にあったこと
プログラムを書き込みを完了しマイコンにアクセスしたところフリーズしてました。
GDBから見てもPC（プログラムカウンター）が進められてない状態です。

1. 書き込み際にあったこと
対象のマイコンID識別ができずopenocdの設定ファイルを修正する必要がありそうです。
ご参考に　https://community.platformio.org/t/debugging-of-stm32f103-clone-bluepill-board-wrong-idcode/14635

# solve
1. １日程度、問題がわからずコンパイルバイナリファイル確認、リンカーローダーの確認などもろもろ実施しても解決できず。
翌日になって解決でき、意外と簡単でGDBからPCを進めるコマンドで解決できました。
    ```
    c
    ```
    マイコン内部のClockがあるので勝手に動くとイメージしてましたが、動かすプログラムがないと止まるみたいです。

1. openocd問題について
設定ファイルを新規で作成し、CPUTAPIDの値を`0x2ba01477`に変更します。


# 終わりに
試しプログラムを動かせることができました。ついでにGDBの使い方も少し慣れてきてます。
WEB開発のようにCICD構築まではいきませんが、開発環境の構築なども終えてます。
開発環境などもろもろについても別途残しておきたいと思います。追加でタスクスイッチングを可視化できるツールがあるので導入予定です。
開発言語は制約があり、C言語、RUSTができそうです。（CPPもありますが、BluePillだとできない。。）
Nuttxライブラリ言語とオーバヘッドを避けたいので一旦ここはC言語で実装することにしました。
使ってるマイコンにGPIO、I2Cなどもろもろ使ってセンサー付けなどしたいと考えてます。
あとはインシデント想定のタスクスケジューリングなども実装できればと思います。
【プラクティス紹介】1分でさらっと分かる「モブプログラミング」

## プラクティス名（別名）
モブプログラミング　（モブプロ、モブワーク、モビング、モビングセッション）

## プラクティスの目的・狙い
* フロー効率の最大化
* チームワーク向上
* チーム学習促進
* 属人化解消

## どんな時に使うか
* チームの総力を結集して最短でバグを解消したい時
* プロダクトの核となる重要プログラムを全員で共有したい時

## 実施手順
1. DEV全員が集合し、最初のタイピスト役を決める（他のメンバーはモブ役）
1. 全員で同じ画面を見ながら、モブがコーディングの指示を出す
1. タイピストは**私情を挿まず**に、指示通りにタイプすることに徹する
1. 10分前後でタイピストを交代する
1. 集中力を持続させるために30～60分毎に休憩をとる

全員が同じ作業に従事するのでリソース効率は落ちるが、その分フロー効率が上がるため適切に機能すれば生産性はむしろ高まる。レビュー/承認/コード同期/情報共有といったプロセスが全て不要となるためフローが極めてシンプルになる。自然と「問題vs私たち」の構図が出来上がり、チームの連帯感が生まれる。問題解決も早く、学習効果も高い。

## アレンジ例
* 属人化しているプログラムに手を入れる時はモブプロにして、有識者はモブに徹する

## アンチパターン
* タイピストが主導権を握ってしまい自分の書きたいようにコードを書き進めてしまう
（＝モブが観客化してしまう）
* タイマーが鳴った後、区切りのよいところまでやってから交代するルールにする
（＝間延びする原因になりやすい）


## 参考情報

https://www.agile-studio.jp/post/apm-mob-programming

## こぼれ話（私的コメント）

ソロ/ペア/モブの使い分けが良く分からないという人のために（というか、そんな僕自身のために）、それぞれの特徴を整理してみました。主観100％ですが、少しでも参考になれば幸いです。

| 比較観点 | ソロワーク | ペアプロ | モブプロ |
|:-:|:--|:--|:--|
|参加人数   | 1人  | 2人  | 3～10人  |
|役割   | ー  | ドライバ、ナビゲータ  | タイピスト、モブ  |
|目的  |リソース効率を最大化する（手分けして誰もが手を動かしている状態にする）   |メンバー間のスキル差/知識差を緩和し、コード品質を一定に保つ（手戻りを減らす）   |フロー効率を最大化する（全員の力を結集して最速で仕上げる）  |
|メリット   |①自分のペースで仕事ができる　②個人毎の生産性が分かりやすい   |①間違いを減らせる　②相談しやすい　③互いに当事者意識を持てる　④スキルアップにつながる   |①共通認識とチーム意識の醸成 ②多角的なチェック　③迅速な問題解決　④レビューがいらない  |
|デメリット   |①品質が個人依存　②第三者チェックが必要 ③行き詰まりやすい ④属人化しやすい ⑤個人主義に陥りやすい  |①1on1に緊張してしまう人もいる ②ペアの相性で生産性が変わる ③ペアのローテーションを考える手間 |①人数が増えると発言機会が減る ②傍観者になってしまう人がでる ③意見が分かれると時間がかかることも ④全員のスケジュール調整が必要   |
|適用対象   | 誰でも簡単にこなせる単純なもの、相談する必要がないもの  | 考えながら進めた方がいいある程度複雑なもの、スキトラしたいもの  | 緊急度や重要度が高く、注意力を要するもの（緊急障害対応や最重要機能など）  |


　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
Kotlin の forEach の中で continue や break のような動作をさせる方法

## 問題

Kotlin の forEach の中で continue や break を使おうとしたら、以下のようなエラーが発生しました。

```
'break' and 'continue' are only allowed inside a loop
```

このエラーを解決するにはどうすれば良いか。

## 解決法

Kotlin では、continue や break といったキーワードは、for や while などの伝統的なループの中でしか使えません。そのため、forEach という関数型のループを使っている場合、エラーが発生します。

forEach の中で continue や break のような動作をさせたい場合は、ラベル付きの return を使うことができます。ラベル付きの return とは、return@ラベル名 という形式で、特定の関数やラムダ式から戻ることを指定するものです。

例えば、以下のコードでは、forEach の中で return@forEach を使って、条件に合致した場合に次の要素に移ることができます。

```kotlin
val nums = listOf(1, 2, 3, 4, 5)
nums.forEach {
    if (it % 2 == 0) return@forEach // 偶数ならスキップ
    println(it) // 奇数なら出力
}
// 出力
// 1
// 3
// 5
```

このように、return@forEach は continue のように機能します。同様に、break のようにループを抜けたい場合は、run や run breaking@ { ... } のようにラベル付きの関数を使って囲み、return@breaking を使うことができます。

```kotlin
val nums = listOf(1, 2, 3, 4, 5)
run breaking@ {
    nums.forEach {
        if (it > 3) return@breaking // 3より大きいならループを抜ける
        println(it) // それ以外なら出力
    }
}
// 出力
// 1
// 2
// 3
```

このように、return@breaking は break のように機能します。ただし、この方法は forEach や run のようなインライン関数（inline function）でしか使えません。インライン関数とは、コンパイル時に関数呼び出しの箇所に関数本体のコードが展開されることでパフォーマンスを向上させる仕組みです。

以上が、Kotlin の forEach の中で continue や break のような動作をさせる方法です。


## 参考
: [Bing AI - Microsoft]
: [Break or Continue a Functional Loop in Kotlin]
: [`break` and `continue` in `forEach` in Kotlin]
: [Returns and jumps - Kotlin Programming Language]
: [Break or Continue a Functional Loop in Kotlin]
: [Returns and jumps - Kotlin Programming Language]
: [Inline functions - Kotlin Programming Language]
: https://www.microsoft.com/en-us/research/project/bing-ai/
: https://www.baeldung.com/kotlin/break-continue-functional-loop
: https://stackoverflow.com/questions/32540947/break-and-continue-in-foreach-in-kotlin
: https://kotlinlang.org/docs/returns.html#return-at-labels
: https://www.baeldung.com/kotlin/break-continue-functional-loop
: https://kotlinlang.org/docs/returns.html#return-at-labels
: https://kotlinlang.org/docs/inline-functions.html