OmniAICreator/Qiita-1.07M huggingface dataset:
次世代AIエージェントの構築： 進化するパターンとベストプラクティス

ジェネレーティブAI（GenAI）は急速に産業を変革し、企業がインテリジェントな自己学習システムを構築することを可能にしている。しかし、初期段階のプロトタイプから本格的な生産に移行するには、大きな課題があります。このブログシリーズでは、実世界のシナリオで活躍するスケーラブルなAgent-poweredアプリケーションを構築するための主要なパターンとベストプラクティスを探ります。

## エージェント開発の未来
私たちは、OmniSearchエージェントとAIエージェントマーケットプレイス（インテリジェントエージェントが部門代表者を模倣し、チーム間のシームレスなコラボレーションを可能にする）の構築から得た実践的な洞察を提供します。主なイノベーションは、「Agent-as-a-Service」モデルです。これは、ビジネスが効率的にAIエージェントを導入、管理、拡張するための柔軟でモジュール化されたアプローチです。

直接的なプロンプト、埋め込み、評価、エージェント検索による拡張生成、微調整などのトピックをカバーしています。エンタープライズ検索を強化する場合でも、スケーラブルなAI駆動型サービスを作成する場合でも、このシリーズは次世代のエージェント型製品を構築するための実践的なガイダンスを提供します。

### ダイレクト・プロンプティング LLMを活用する最も簡単な方法
ラージ・ランゲージ・モデル（LLM）と対話する最も簡単な方法の1つは、ダイレクト・プロンプティングです。この方法は余計なロジックを必要としないため、AIをワークフローに統合する最速の方法となります。

高度に最適化されたプロンプトの作成については、プロンプト・エンジニアリングのブログをご覧ください。

例 Eコマース用AIチャットボット
💬 ユーザー："注文はどこですか？」 🤖 AI: "注文IDを教えてください、ステータスを確認できます！」

ビジネスユースケース：このアプローチは、カスタマーサポート、コンテンツ生成、迅速なAIプロトタイピングに最適です。

このセットアップでは、ロジックの追加レイヤーはなく、ユーザーとLLMの間で直接やり取りするだけなので、シンプルで実装が簡単なソリューションです。


### 評価（エバリュエーション）： LLMを検証する新しい方法
与えられたタスクとその文脈の関連性に応じて、LLMの応答を評価する。ソフトウェアを開発する際、期待通りのパフォーマンスを保証することは極めて重要である。従来のシステムでは、特定の入力が一貫した出力をもたらすテストケースによってこれを実現していた。システムが期待に沿えば、テストに合格する。

しかし、LLMベースのシステムは動作が異なる。LLMベースのシステムは非決定論的であり、同じ入力がさまざまな応答を生み出す可能性がある。この変動性により、従来の合否判定テストは効果がない。代わりに、AIの信頼性はEVAL（評価）メトリクスを使って評価される。
ExpoとReact nativeの構成でD3.jsをインストールしてスマホアプリ上でデータビジュアライゼーションを行う

# D3.jsとは
D3.jsは、JavaScript製のデータ駆動型ドキュメント作成ライブラリです。データをもとにして動的な、インタラクティブなビジュアライゼーションをウェブブラウザ上で作成できます。

D3.jsの主な特徴は以下の通りです：
データバインディング: HTMLやSVGの要素をデータにバインドすることが可能で、そのデータの変更に基づいて自動的にビジュアルを更新します。

多様なビジュアライゼーション: バーグラフ、散布図、地理空間データマップ、階層構造図（ツリーマップやパーティション図）など、あらゆる種類のビジュアライゼーションを作成できます。

カスタムアニメーション: データの変更時にエレメントがどのように振る舞うかを細かく制御できます。これによってスムーズなトランジションやアニメーションを実現できます。

大量のデータ: D3.jsは大量のデータを処理する能力を持っており、そのデータを効果的に可視化するためのツールを提供します。

インタラクティブ: ユーザーがデータに交互作用を持つ、ズーム、ブラッシング＆リンクセレクションなどのインタラクティブな機能をサポートしています。

それぞれの要素に対して、D3.jsは低レベルな操作を提供しますが、再利用可能なモジュールのコミュニティも活発で、特定の目的のためのライブラリやプラグインも多数提供されています。

## 各種ライブラリインストール

## react-native-svgをインストール　
まずはExpo用のreact-native-svgをインストール　
スマホアプリ上でSVGを扱えるようにするライブラリ

```
npx expo install react-native-svg
```
## d3.jsをインストール　
　
データビジュアライゼーション用のライブラリ




```
npm install d3
```

## サンプルコード
```React
import React from 'react';
import { Svg, Path, G } from 'react-native-svg';
import * as d3 from 'd3';

const PieChart = () => {
    const data = [10, 20, 20, 50];
    const colors = d3.scaleOrdinal(d3.schemeCategory10);
    const pie = d3.pie();
    const arc = d3.arc().outerRadius(100).innerRadius(0);
    const w = 200;
    const h = 200;

    return (
        <Svg width={w} height={h}>
            <G x={w / 2} y={h / 2}>
                {pie(data).map((slice, index) => {
                    const sliceColor = colors(index);
                    return (
                        <Path
                            key={`pie-slice-${index}`}
                            d={arc(slice)}
                            fill={sliceColor}
                        />
                    );
                })}
            </G>
        </Svg>
    );
};

export default PieChart;
```

## 参考リンク

https://github.com/JoBerkner/d3_dashboard_react_native

公式ドキュメント

https://d3js.org/what-is-d3

React + D3.jsを使用するときに助けになりそうな記事

https://2019.wattenberger.com/blog/react-and-d3

youtubeのチュートリアル

https://www.youtube.com/watch?v=5oYE61y4os4

youtubeのチュートリアルのGithubリポジトリ

https://github.com/MattRoelle/matt-roelle-react-native-youtube-app
[Linux][command] システムシャットダウン_shutdown, systemctl, init, telinit

# システムシャットダウン一覧

| コマンド | 説明 |
|:--|:--|
| `shutdown` | システムのシャットダウンスケジュール・ユーザーへの警告メッセージの送信|
||**使用例**:<br>- `shutdown -h now`：即座にシャットダウン<br>- `shutdown -h +5 "システムは5分後にシャットダウンします"`：5分後にシャットダウンし、メッセージを表示<br>- `shutdown -h 22:00`：当日の22:00にシャットダウンをスケジュール |
| `systemctl` | `systemd` システムでのサービスやシステムを管理 |
||**使用例**:<br>- `systemctl poweroff`：即座にシャットダウン<br>- `systemctl start poweroff.target`：即座にシャットダウン|
| `init` | ランレベルを変更することでシステムの状態を変更 |
||**使用例**:<br>- `init 0`：シャットダウン|
| `telinit` | ランレベルを変更することでシステムの状態を変更 |
||**使用例**:<br>- `telinit 0`：シャットダウン|

# shutdownコマンド
~~~terminal:
$ shutdown [オプション] 時間 [メッセージ]
~~~
~~~terminal:
$ shutdown [オプション] +現在からの経過時間 [メッセージ]
~~~

| オプション   | 英語の由来      | 説明                                                        |
|:--|:--|:--|
|              | デフォルト | システムをシャットダウンする（デフォルトでは `-h` オプション） |
| `-h`         | halt | システムを停止する（シャットダウン）                          |
| `-r`         | reboot | システムを再起動する                                          |
| `-k`         | kick        | シャットダウンするが実際にはシステムを停止しない、警告のみを表示 |
| `-c`         | cancel  | 進行中のシャットダウンまたは再起動をキャンセルする             |

# Ping-t
- [3011_shutdown -h](https://mondai.ping-t.com/question_subjects/31/question_sessions/31162945/progressing_questions/477525083)
- [3014_shutdown -r, reboot, telinit 6](https://mondai.ping-t.com/question_subjects/31/question_sessions/31718661/progressing_questions/486071299)
- [3316_shutdown -k](https://mondai.ping-t.com/question_subjects/31/question_sessions/30339661/progressing_questions/464809425)
- [3618_telinit 0, systemctl start poweroff.target](https://mondai.ping-t.com/question_subjects/31/question_sessions/31719854/progressing_questions/486088048)
【Koyeb】DjangoをGitHub経由でデプロイしてみた

## 概要
個人で作成したDjangoのアプリを無料でアップしたいなと思い、[Koyeb](https://www.koyeb.com/)というサービスを試してみました。
Koyebのサービス概要等は[【Koyeb】Discord Botを無料で24時間運用](https://zenn.dev/amano_spica/articles/24c5f288cf9595)の記事でまとめられている通りですが、2025年2月時点ではクレジットカードの登録が不要で24時間稼働できるサーバーが利用可能でした。ちなみに無料枠のスペックは以下の通りです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/f3d9d9d6-8db1-c44d-f095-f666dbc5e0cc.png" width=80%>


## 前提等
* 使用したDjangoのバージョンは`5.1.5`です。
* GitHub経由でのデプロイを行います。
* デプロイ先のリージョンはアメリカにしました。2025年2月時点では、無料枠だとアメリカとドイツだけが選択可能な模様。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/84be8a3f-d968-d2ae-c40f-f44fdc17b7fd.png" width=80%>

## GitHub経由でDjangoをデプロイする際の要点
基本的には[Deploy a Django App](https://www.koyeb.com/docs/deploy/django)のドキュメントに書かれている手順で大丈夫ですが、要点だけ何点か書いておきます。
* GunicornとWhiteNoiseのライブラリを入れる必要があります。WhiteNoiseについては、settings.pyのmiddlewareとSTATIC_URLに設定を追加します。
* gunicornの起動コマンドをBuild時の設定に追加します。以下のような感じで設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/3fc758c8-63b3-4784-065e-cd951bc858db.png" width=80%>

* 入れたライブラリは、requirements.txtに出力する必要があります。
* Koyebにデプロイしたドメインを、Djangoの`ALLOWED_HOSTS`に設定します。
組合せ最適化問題の難しさとは


# 組合せ最適化問題とは

組合せ最適化問題とは、有限個の選択肢の中から、特定の制約条件を満たしながら、目的関数を最適化(最大化または最小化)する組合せを見つける問題です。

### 代表的な例
- **巡回セールスマン問題（TSP）**：複数の都市を1回ずつ訪問し、出発地点に戻ってくる最短経路を求める問題

- **ナップサック問題** ：重さと価値が異なる複数のアイテムがある時、容量制限の中で価値の合計を最大化する組み合わせを求める問題

- **スケジューリング問題**：限られたリソースを使って、複数のタスクを効率的に割り当てる問題

### 問題を解くためのアプローチ

- **厳密解法**（分枝限定法、動的計画法など）
- **メタヒューリスティクス**（遺伝的アルゴリズム、焼きなまし法など）
- **数理計画法**（整数計画法、混合整数計画法など）

があります。問題の規模が大きくなると計算時間が指数関数的に増加するため、実用的な時間で近似解を得るためのアルゴリズムが求められています。

# 組合せ最適化問題の難しさとは

組合せ最適化問題の本質的な難しさは、以下の要因から生じています。

### 1. 解空間の爆発的な増大
- 基本的な難しさは、可能な組合せの数が入力サイズに対して指数関数的に増加すること
    - 例. n個の都市を巡回するセールスマン問題では、可能な経路の数は(n-1)!通りとなり、都市数が増えるとすぐに全探索が現実的ではなくなる

### 2. 局所最適解の存在
- 多くの組合せ最適化問題では、局所的には最適だが大域的には最適ではない解が多数存在する
- これは、単純な貪欲法や局所探索法では最適解を見つけられない可能性が高いことを意味する

### 3. NP困難性
- 代表的な組合せ最適化問題の多くは、計算複雑性理論においてNP困難であることが証明されている
- これは、現在知られているアルゴリズムでは、問題サイズが大きくなると必要な計算時間が非現実的になることを意味する

### 4. 制約条件の複雑さ
- 実務上の組合せ最適化問題では、多くの場合、複数の制約条件が絡み合っている
- これらの制約を満たしながら最適解を探索することは、問題をさらに難しくする

---

# 量子コンピュータで取り組むべき組合せ最適化問題とは？

NISQ (Noisy Intermediate-Scale Quantum) の量子コンピュータで取り組むべき組合せ最適化問題について。現在のNISQデバイスの制約（50-100量子ビット程度、ノイズの存在）の中でも、有意義な結果を得られる可能性が高い問題を選定しています。

| 問題タイプ | 問題の特徴 | 実装上の課題 |
|------------|------------|--------------|
| ポートフォリオ最適化 | - 資産配分の最適化<br>- 制約条件が明確<br>- リスク・リターンのトレードオフ | - リスク制約の量子表現<br>- 市場データの更新頻度への対応 |
| 配送ルート最適化 | - 巡回セールスマン問題の部分問題<br>- 距離と時間の最小化<br>- 動的な制約条件 | - 動的な制約の組込み<br>- リアルタイム性の確保 |
| グラフ分割問題 | - ネットワーク構造の最適化<br>- 明確な評価指標<br>- スケーラブルな問題設定| - グラフ構造の量子表現<br>- 分割数の最適化 |
| 施設配置問題 | - 地理的制約が明確<br>- 複数目的の最適化<br>- 離散的な決定変数 | - 地理的制約の表現<br>- 多目的最適化の実装 |
JavaScriptのホイスティングって何!? 謎の動きを徹底解説

「JavaScriptを学んでるんだけど、急に undefined とか出てきて意味わかんない！
なんか“ホイスティング”とか言われてもピンとこないし…正直めんどくさい！！」

そんな衝撃を受けているそこのあなた。大丈夫です、みんな最初はそう思います。
というわけで、今回は **JavaScript独特の「ホイスティング」** について、ムリなくわかるようにまとめてみました。

# そもそもホイスティングって何なの？(震え声)

ホイスティング（hoisting） とは、「変数や関数の宣言が、実際に書いた位置より上にあるかのように扱われる仕組み」のことです。
要するに、JavaScriptエンジンが「このコードを動かす前に、変数や関数をまとめて宣言しておこう」と裏で準備しちゃうわけですね。
そのおかげ（？）で、宣言前に変数を使っているのにエラーにはならなかったり、
逆に「エラーになるはずがないのになぜかエラーが出た…」みたいな状況が起こるわけです。

## 1. var のホイスティング

**コード例**
```
console.log("変数 myVar の値:", myVar);
// ここでは "undefined" と表示（なぜエラーにならない！？）

var myVar = "Hoisted!";
console.log("変数 myVar の値:", myVar);
// ここでは "Hoisted!" と表示
```
**解説**
見てのとおり、宣言より前の行で myVar を出力しているのに、エラーが起きないのは不思議ですよね。
これは JavaScriptが「varで宣言された変数」を先に確保（宣言だけ）しているから なんです。
しかし、変数が「存在」するだけで値の代入は後になるので、最初の出力は undefined、その後に "Hoisted!" が入るという流れになります。

要するに「変数名だけ先に登録しておいて、中身は後で入れる」というイメージです。
（実行したときの挙動と、コードの見た目が一致しないので、ちょっとややこしいんですよね。）

## 2. 関数宣言 vs 関数式

「じゃあ関数も同じなの？」と思ったら、これがまたホイスティングをさらに複雑に見せるポイントです。

### (1) 関数宣言
**コード例**
```
// --- function宣言の場合 ---
hoistedFunction();  
// => "function宣言のhoistedFunctionが呼び出されたよ！" と表示される

function hoistedFunction() {
  console.log("function宣言のhoistedFunctionが呼び出されたよ！");
}
```
**解説**
`function hoistedFunction() { ... } `という書き方を関数宣言と呼びます。
「変数の宣言」と違って、関数の本体そのものもまとめて上に持ち上げられるため、宣言より前の場所でも関数を呼び出すことができます。

### (2) 関数式（function式）
**コード例**
```
// --- function式の場合 ---
hoistedExpression();  
// => 実行時にエラー！！！ ("まだ中身が入ってない！")

var hoistedExpression = function() {
  console.log("function式のhoistedExpressionが呼び出されたよ！");
};
```
**解説**
`var hoistedExpression = function() { ... }; `の書き方をfunction式といいます。
これは「変数に関数を代入している」だけなので、変数自体が先に宣言されるだけで、実際の「関数の中身」が代入されるのは後からになります。
結果として、宣言より前の行で呼び出そうとすると「まだ関数が入ってない！」とエラーになるわけですね。

## 3. let / const の場合は？
最近のJavaScriptでは、var よりも let や const を使うのが一般的です。
これらを使うとホイスティングはどうなるんでしょうか？
**コード例**
```
console.log("myLetVar の値:", myLetVar);
// => ここはエラー(ReferenceError)！ 

let myLetVar = "これは myLetVar だよ";
console.log("myLetVar の値:", myLetVar);
// => "これは myLetVar だよ"
```
**解説**
var のときは undefined になっていたのに、let や const だとエラー。
これは 「宣言される前に使ったらダメ！」 というルールがあるからです。
こうすることで、「うっかりミスで宣言前に変数を使っちゃった！」みたいな状況を減らせるわけですね。
いわば、安全装置みたいなものと考えるといいかもしれません。

## まとめ
ホイスティングとは
- 実行前に変数や関数宣言をまとめて上に持ち上げてしまう（hoisting）JavaScriptの仕組みのこと
- varの場合
    - 変数の「存在」だけが先に作られるため、宣言前に呼び出すと undefinedtとなる
- function宣言の場合
    - 「関数本体」も含めて先に読み込まれるので、宣言前から呼び出せる
 - function式 (`var x = function() {...}`)の場合
    - 変数だけ先に用意される。関数本体は後から代入されるので、宣言前の呼び出しはエラーとなる
- let や constの場合
    - 宣言される前に使うとエラーになる
    - 「宣言前に使っちゃダメ！」が明確になっているので、安全性が高い

要するに、「宣言はなるべくコードの上部にまとめる」 ことやですね。
「let と const で変数を管理する」 ことで、ホイスティングによる混乱を減らすことができます。

## おわりに

ホイスティングって最初は「えっなんで？」となりがちですが、JavaScriptをちゃんと理解するうえで避けては通れないポイントです。
「思った通り動かないぞ？」というときは、「あ、ホイスティングのせいかな」と疑ってみましょう。
そのうえで、宣言位置を見直してみたり、let / const を使うようにしてみたりすると、すっきり解決するかもしれません。

そんなわけで、ホイスティングをざっくり解説してみました。
実際にコードを書いてみると「本当に undefined なの？」とか「まじでエラーになるの？」と体感できるはず。
ぜひ試してみて、「おお、こういうことだったのか！」と納得してもらえたら嬉しいです！
AWS Chatbot が Amazon Q Developer で AWS リソースに関する質問をチャットで回答

#  内容

AWS Chatbot が Teams や Slack と連携し、Amazon Q Developerを使用して、AWSリソースに関する質問に対して自然言語で回答を提供する。

(例)

`@aws show ec2 instances in running state in us-east-1`
`@aws what is the size of the auto scaling group XX in us-east-2?`

のような質問を入力し、必要な AWS リソースを見つけたり、詳細情報を取得したりできます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-chatbot-chatting-amazon-q-developer-microsoft-teams-slack/

# やってみる

## アクセス許可

https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/cbt-awsq.html

### IAM ロール

IAM ロール に `AmazonQDeveloperAccess` のアクセス許可が必要です。

### チャネルガードレールポリシー

チャネルガードレールポリシーに `AmazonQDeveloperAccess` のアクセス許可が必要です。

## サービスに関する質問

https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/service-questions-q.html

ドキュメントの通り、`@aws what is fargate?` と質問してみます。

![スクリーンショット 2025-02-08 19.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/085e483e-b3d1-1c01-e5f0-ecf87693192b.png)

## リソースに関する質問

https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/resource-questions-qdev.html

ドキュメントの通り、`@aws can you show ec2 instances running in ap-northeast-1?` と質問してみます。

![スクリーンショット 2025-02-08 19.39.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cf1246cc-34b8-bde2-6ad0-124e2e0267fe.png)

権限がないとおこられたので、IAM ロールに EC2 へのアクセス権を付与し、再度同じ質問をしてみます。

![スクリーンショット 2025-02-08 19.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ec254a50-8974-fb68-86ff-4190f36fb6d0.png)


# 最後に

Amazon Q は日本語み対応ですので、利用するとしても実用性としてはまだ先というのが個人的な感想です。
rex0220 計算式プラグイン リッチエディターから文字列複数行へ

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、リッチエディターから文字列複数行へ値をセットしてみます。

# 概要

リッチエディターは、文字列の大きさ・色などをタグで指定されています。
文字列複数行にリッチエディターのテキスト部分をセットしてみます。
※ Ver.86 以降で動作

- html 変換：　リッチエディターの設定内容
    - リッチエディターは、font タグなど古い形式が使われている
- 文字列変換：　リッチエディターのテキスト部分
    - リスト部分は、「- 」に変換
- タグ関数変換：　リッチエディターの設定内容を計算式プラグインのタグ関数に変換
    - 同じ書式でリッチエディターに設定する計算式へ変換

![2025-02-08_19h20_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2b03f2ed-a9ff-e5d9-435f-9d0a8202d8b6.png)

# 操作例

リッチエディターは、値変更イベントが発生しないので、計算ボタンをクリックして、最新の値を文字列複数行に反映します。
通常は、他の計算式で使われている項目の変更時やレコード保存時に反映されます。

![2025-02-08_19h23_06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/281f6a58-a3e2-2391-1d0c-7834cb7a5956.gif)


# 計算式プラグイン設定

- header1：　手動で計算するためのボタンを配置
- html変換：　リッチエディター項目をそのまま指定
- 文字列変換：　STRIP_TAGS 関数で、タグ情報を除いてテキスト部分を取り出す
- タグ関数変換 ：　HTML_TAGS 関数で、計算式プラグインのタグ関数に変換

![2025-02-08_19h34_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/65d9b1dd-c234-1b10-b5d5-3fa6124b3e95.png)

```.js
OPTION: 

// header1:($HEADER1) HEADER
BUTTON("計算","")

// html変換 MULTI_LINE_TEXT
リッチエディター

// 文字列変換 MULTI_LINE_TEXT
STRIP_TAGS(リッチエディター)

// タグ関数変換 MULTI_LINE_TEXT
HTML_TAGS(リッチエディター)
```
【備忘録】Github SSH登録手順

## 鍵の生成
```
ssh-keygen -t rsa -b 4096
```

## 公開鍵の登録
https://github.com/settings/keys

ここに生成した公開鍵を登録する

## Githubサーバへのssh接続のための設定
```.ssh/config
Host github.com
  User git
  IdentityFile ~/.ssh/github/id_rsa
  StrictHostKeyChecking no
  ForwardAgent yes
```

## パスフレーズの省略設定（追加設定）
パスフレーズを省略できるようにする設定？
多分下2つのコマンドを.bashrcに登録すると良い

新しい SSH エージェントを起動
```
eval "$(ssh-agent -s)"
```
SSHエージェントに登録された鍵の確認
```
ssh-add -l
```


## 接続テスト
```
ssh -vT git@github.com
```
M5StackでLVGLを使う

M5StackでLVGLを使っているサンプルってあまりない。
モニタ搭載のマイコンキットで構成ので入手性が良いのに日本語のドキュメントがあまりないからだろう。

## LVGLのマニュアル分かり難いんだよ
[Add LVGL to Your Project](https://docs.lvgl.io/master/intro/add-lvgl-to-your-project/index.html)ってLVGLの公式のドキュメントを読めばそれなりに書いてあるんだけど分かり難い。

## 必要な作業
- lv_conf.h の作成
- ディスプレイの登録
とりあえずこの２工程でLVGLが動作します。

・lv_conf.h の作成
platformioで開発している場合はLibraresから登録するとlv_conf_template.hが登録されているのでlv_conf.h にリネームして中を編集する。
（M5 CARDPUTER(Stamp S3)だとデフォルトで動いた。）

・ディスプレイの登録
M5stackというかArduino用のサンプルが
\lvgl\examples\arduino\LVGL_Arduino\
に置いてある。LVGL_Arduino.inoを参考にmian.cppを編集するといい。

[Connecting LVGL to Your Hardware](https://docs.lvgl.io/master/intro/add-lvgl-to-your-project/connecting_lvgl.html)に編集方法が書いてあるがやはり分かり難い。
具体的にはDisplay Interfaceの登録とTick Interfaceの登録。

LVGLの最終出力先はLCDなので、最初にディスプレイを使えるようにする必要がある。
M5 CARDPUTERはM5GFXが標準で使われているので
```
M5GFX display; 
M5Canvas canvas(&display);
display.begin();
```
のようにして有効化。(意外とこれを忘れがちみたいで公式のドキュメントにも書いてある。)

続いてLVGLの設定をする。
LVGLに設定するdefineを追加
```
#define TFT_HOR_RES   240
#define TFT_VER_RES   135
#define TFT_ROTATION  LV_DISPLAY_ROTATION_90
#define DRAW_BUF_SIZE (TFT_HOR_RES * TFT_VER_RES / 10 * (LV_COLOR_DEPTH / 8))
uint32_t draw_buf[DRAW_BUF_SIZE / 4];
```

こんな感じでデイスプレイを登録
```
lv_display_t * disp;
disp = lv_display_create(TFT_HOR_RES, TFT_VER_RES);
lv_display_set_flush_cb(disp, my_disp_flush);
lv_display_set_buffers(disp, draw_buf, NULL, sizeof(draw_buf), LV_DISPLAY_RENDER_MODE_PARTIAL);
```
LVGLと実際のディスプレイを次の関数で接続する
```
void my_disp_flush( lv_display_t *disp, const lv_area_t *area, uint8_t * px_map)
{
  uint32_t width = (area->x2 - area->x1 + 1);
  uint32_t height = (area->y2 - area->y1 + 1);
  lv_draw_sw_rgb565_swap(px_map, width*height);
  display.startWrite(); 
  display.pushImageDMA<uint16_t>(area->x1, area->y1, width, height, (uint16_t *)px_map);
  canvas.pushSprite(0, 0);
  display.endWrite();
  lv_display_flush_ready(disp);
}
```

最後に定期的にLVGLを更新するためにTickを登録する。
```
static uint32_t my_tick(void)
{
    return millis();
}
```
で　lv_tick_set_cb(my_tick);　としてLVGLに登録する。
lv_timer_handler();をloop()で定期的に呼び出すとLVGLは動作する。

全然最適化していないけど、最低限これだけで動作するので試してみて欲しい。
強化学習手法：GRPO(Group Relative Policy Optimization)

## はじめに
DeepSeek R1 で提案された、GRPO(Group Relative Policy Optimization)に関するメモです。

## 参考資料
deepseek
https://arxiv.org/pdf/2501.12948

## GRPO(Group Relative Policy Optimization)
Group Relative Policy Optimization（GRPO）は、強化学習（RL）のアルゴリズムの一種で、特に大規模言語モデル（LLM）などの大規模なモデルにおける学習コストを削減することを目的としています。

**GRPOの基本的な考え方:**

従来の強化学習アルゴリズム（例えばPPO）では、方策（Policy）モデルに加えて、価値（Value）を推定するためのクリティック（Critic）モデルを必要とすることが一般的です。クリティックモデルは通常、方策モデルと同程度のサイズになるため、学習には大きな計算リソースが必要となります。

GRPOは、このクリティックモデルを不要にし、代わりに「グループスコア」を用いてベースラインを推定することで、学習コストを削減します。

**GRPOの具体的な手順:**

1.  **サンプリング:** 各質問（`q`）に対して、現在のポリシー（古いポリシー `πθold`）から複数の出力（`{o1, o2, ..., og}`）をサンプリングします。
2.  **グループ内での比較:** サンプリングされた各出力（`oi`）に対して、その出力の報酬（`ri`）を計算します。そして、各出力の「アドバンテージ」(`Ai`) を、グループ内の報酬の平均と標準偏差を用いて計算します。
    ```
    Ai = (ri - mean({r1, r2, ..., rg})) / std({r1, r2, ..., rg})
    ```
3.  **ポリシーの更新:** 計算されたアドバンテージと、古いポリシーと新しいポリシー（`πθ`）の確率比を用いて、新しいポリシーを最適化します。目的関数は、クリップされた確率比と、KLダイバージェンス項を含みます。
    ```
    LGRPO(θ) = E[q ~ P(Q), {oi} ~ πθold(O|q)] [ Σ( min(Ai, clip(πθ(oi|q) / πθold(oi|q), 1-ε, 1+ε) Ai) - βDKL(πθ||πref) ) ]
    ```
    ここで、εとβはハイパーパラメータ、πrefは参照ポリシー（通常は初期ポリシー）です。

**GRPOの利点:**

*   **計算コストの削減:** クリティックモデルが不要なため、学習に必要なパラメータ数が減り、計算コストが削減されます。
*   **シンプルさ:** アルゴリズムが比較的シンプルで、実装が容易です。
*   **大規模モデルへの適用性:** 計算コストの削減により、大規模言語モデルのような巨大なモデルにも適用しやすくなります。

**GRPOの欠点/注意点：**

*   グループのサイズが性能に影響を与える可能性がある：グループサイズはハイパーパラメータであるため、計算コストと性能のバランスを取るために調整が必要である.
*   サンプル効率：グループを用いた推定を行うので、サンプル効率の観点では若干劣る可能性がある.

GRPOは、大規模モデルの強化学習において、計算コストを削減しつつ、効率的な学習を可能にする有望なアプローチです。
強化学習手法の歴史：TRPO〜PPO

## はじめに
DeepSeek-R1で提案された強化学習方法 GRPO（Group Relative Policy Optimization）を理解するための前提となる手法、John Schulman (OpenAI)のTRPO (Trust Region Policy Optimization)やPPO (Proximal Policy Optimization)についてのメモです。
TRPOとPPOは、どちらも強化学習における方策勾配法のアルゴリズムで、方策（Policy）を直接最適化することで、良い行動戦略を学習することを目的としています。

## 参考資料
John Schulman
https://arxiv.org/pdf/1502.05477
https://arxiv.org/pdf/1707.06347

## TRPO (Trust Region Policy Optimization)
*   **概要:**
    *   方策の更新時に、新しい方策が古い方策から離れすぎないように、信頼領域（Trust Region）と呼ばれる制約を設けます。
    *   具体的には、KLダイバージェンスを用いて、新旧の方策間の距離を測り、この距離が一定値以下になるように制約します。
    *   この制約により、方策の更新が安定し、性能の急激な悪化を防ぐことができます。
    *   目的関数（期待収益）の改善が理論的に保証されている点が大きな特徴です。

*   **仕組み:**
    1.  **目的関数の設定:** 通常の方策勾配法では、方策の期待収益を最大化するように目的関数を設定します。TRPOでは、この目的関数に加えて、新旧方策間のKLダイバージェンスに関する制約項を追加します。
    2.  **制約付き最適化:** この制約付き最適化問題を解くことで、方策を更新します。この際、共役勾配法などの手法を用いて、近似的に解を求めます。
    3.  **信頼領域の調整:** KLダイバージェンスの制約の厳しさを調整することで、信頼領域の大きさを制御します。

*   **メリット:**
    *   性能の安定性: 方策の更新が安定し、性能の急激な悪化を防ぐことができます。
    *   理論的保証: 目的関数の改善が理論的に保証されています。

*   **デメリット:**
    *   計算コスト: 制約付き最適化問題を解く必要があるため、計算コストが高くなります。
    *   実装の複雑さ: 実装が比較的複雑です。


## PPO (Proximal Policy Optimization)

*   **概要:**
    *   TRPOの考え方を基に、よりシンプルで計算効率の良いアルゴリズムとして提案されました。
    *   TRPOと同様に、方策の更新時に新しい方策が古い方策から離れすぎないようにしますが、その方法が異なります。
    *   具体的には、目的関数にクリップされた確率比を導入することで、方策の更新が大きくなりすぎるのを防ぎます。

*   **仕組み:**
    1.  **目的関数の設定:** PPOでは、TRPOの目的関数を簡略化したものを使用します。具体的には、以下の2つの要素を組み合わせた目的関数を用います。
        *   **クリップされた確率比:** 新旧方策の確率比を、ある範囲内にクリップすることで、方策の更新が大きくなりすぎるのを防ぎます。
        *   **KLペナルティ:** 新旧方策間のKLダイバージェンスにペナルティ項を設けることで、方策が離れすぎるのを防ぎます（オプション）。
    2.  **最適化:** この目的関数を、確率的勾配降下法（SGD）などの一般的な最適化手法を用いて最大化します。
    3.  **複数回の更新:** 同じデータサンプルを用いて、複数回の更新を行うことで、より効率的な学習を可能にします。

*   **メリット:**
    *   計算効率: TRPOに比べて計算コストが低く、高速に学習できます。
    *   実装の容易さ: 実装が比較的簡単です。
    *   性能: TRPOと同等、あるいはそれ以上の性能を示すことがあります。

*   **デメリット:**
    *   理論的保証: TRPOのような厳密な理論的保証はありません。
    *   ハイパーパラメータ: クリップの範囲やKLペナルティの係数など、調整が必要なハイパーパラメータがあります。


## まとめ


*   TRPOは、信頼領域の概念を用いて方策更新の安定性を高め、理論的な保証も持つアルゴリズムです。
*   PPOは、TRPOの考え方を基に、よりシンプルで計算効率の良いアルゴリズムとして提案されました。
*   どちらのアルゴリズムも、方策勾配法の代表的な手法として、様々な強化学習タスクで高い性能を示しています。

どちらを選択するかは、タスクの複雑さ、計算リソース、実装の容易さなどを考慮して決定する必要があります。一般的に、PPOの方が実装が簡単で計算コストも低いため、最初に試してみるのに適しています。
採点業務の現在フロー（原型）（Before 改善）

# 採点業務の全体像

- 【プレテスト前】
- 【テスト前】
- 【テスト中】
- 【テスト後】
- 【提出】

## 各業務のプロセス

【プレテスト前】
1. 「問題用紙」を作成する
1. 「解答用紙」を作成する
1. 「確認シート」を作成する
1. 「確認シートの回答・解説」を作成する
1. 「復習用ノート」を作成する

【テスト前】
1. 「座席表」を作成する
1. 「先頭者の学籍番号」を作成し、先頭に配置する
1. 「テスト当日のアナウンス・スライド」を作成する
1. 「座席表」を入り口に配置する

【テスト中】
1. バインダーと「座席表」で受講者のチェックをする（欠席者にチェック）
    1. テスト直後に、すぐに「テスト出欠表」に記入する
1. （回収時）学籍番号が固まるように、紙の回収用紙を区別する

【テスト後】
1. ポートからCSVを出力する
1. CSVをもとに 「講義出欠表」を作成する
    1. Googleフォームの回答結果を元に、スコアリングをする（改善の余地あり）
    1. 学年が異なると、名前の昇順をしても意味がないので注意が必要
1. 「回答用紙」をソート（順番に並び替え）する
1. ページごとに「回答用紙」をソートしたもので固める
1. 「採点基準」「各問の点数」を記載した「解答用紙」を作成する
    1. 記述の採点基準は、S、A、B、C、Fなどで配分を変える（5点単位など）
1. ページごとに採点をする
1. 「講義出欠表」→「テスト採点表」に変えて、採点を入力する（改善の余地あり）
1. S.A.B.C.Dを振り分ける
    1. なお、「失」「欠」がある点も注意

【提出】
1. 必ずポートには、CSVで提出するようにする
1. 提出後にCSVをDLし、自分が作成したCSVとの真偽値をチェックする
一人でやると身につかないからORACLE MASTER Silver DBA 2019の勉強ログをつける　3日目

昨日おとといでお休みしちゃったので今日はがやっていきます。

今日はoracleのソフト周りがメイン。
### DBCAってなんぞや
DataBase Configration Assistantのこと。
ORACLE_HOMEに含まれている。DBCAコマンドで起動できる。
### 出来ること
・DBの作成
→標準構成と拡張構成がある。
・既存DBの構成変更
・DBの削除
・テンプレートの管理（作成と削除）
→テンプレートとはDBのひな型のこと。ひな形を作ったり、削除ができるということ。
・PDBの管理（作成、切断、削除、構成変更）

##### テンプレートについて補足
テンプレートに含めた既存のDBを「シードデータベース」と呼ぶ。

### 拡張構成での設定項目
・デプロイメント・タイプ（データベーステンプレートの指定）

・データベース識別情報
→グローバルデータベース名とインスタンスSIDを指定する。

・記憶域オプション
→データベースファイルをどの記憶域に配置するか指定する。
ファイルシステムと自動ストレージ管理を選択できる。そのなかで、Oracle Managed Files（OMF）を使用するかを指定できる。

#### OMFのいいところ

・Oracleがファイル名を自動で決定するので、DB管理者がファイル名を決定しなくていい。
・不要になったファイルを自動で削除してくれる。
##### データファイルについて
ディレクトリは初期化パラメータで設定したところ（DB_CREATE_FILE_DEST）に配置される。DATAFILE句を指定しないと、サイズが100MB、自動拡張ONでデータファイルが作成される（でかい）

##### 制御ファイル、REDOログファイルについて
a.DB_CREATE_ONLINE_LOG_DEST_nを設定する
上記の場所に保存されたディレクトリで、OMF管理された制御ファイルとREDOログファイルが作成される。
2つ以上のDB_CREATE_ONLINE_LOG_nを指定すると、制御ファイルとREDOログファイルは多重化される。

b.DB_CREATE_ONLINE_LOG_DEST_nを設定しない
DB_CREATE_FILE_DESTと、DB_RECOVERY_FILE_DESTで設定されたディレクトリにOMF管理された制御ファイルおよびREDOログファイルが出来る。片方しか設定されていない場合、ファイルは多重化されない

・高速リカバリ
→高速リカバリの場所とサイズ、またアーカイブを有効化するかを決定する。

・ネットワーク構成
→リスナーの選択、作成を行う。

・Oracle Data Vault構成
→Oracle Data VaultおよびOracle Label Securityを使用するか指定する。
Oracle Data VaalutとOracle Label Securityとは：セキュリティがつよくなる

・構成オプション
→OracleDBで使用する各メモリー領域のサイズ、データブロックのサイズ、起動プロセスの最大数、キャラクタセット、地域の設定、接続モード、サンプルスキーマを導入するかを指定する。
データブロックのサイズは、テンプレートによっては変更できない。
**キャラクタセット**：DBに使用される言語および地域の設定のこと
**接続モード**：専用サーバーモードと共有サーバーモードがある。専用サーバーモードはユーザープロセスとサーバープロセスが一対一、共有サーバーモードだと一対一にならない形。共有サーバーモードのときは、ユーザープロセスを**ディスパッチャ**に接続して、それを共有プロセスサーバーに送信して接続する。

・管理オプション
→作成したDBにEMExpressを構成するか指定する。また、作成したDBをCloud Controlの管理対象として登録するか指定する。
※ただし、oracle Management Service（Cloud Controlの管理サービス）が構成済かつDBのサーバーにOracle Management Agent（Cloud Controlの管理エージェント）が導入済であることが必須。

・ユーザー資格証明
→管理用ユーザ（SYSユーザー、SYSTEMユーザー）のパスワードを入力する。（ユーザは自動作成）

### 標準構成での設定項目
・グローバル・データベース名
→DBの識別名。"DB名"、もしくは"DB名.ドメイン名"の形で指定する。基本的には、DB名=SIDの関係。

・記憶域タイプ
→ファイルシステムもしくは自動ストレージ管理でデータベースファイルをどの記憶域に配置するかを指定する。

・データベースファイルの位置
→記憶域タイプオプションで「ファイルシステム」を選択したときに、データベースファイを格納するディレクトリパスを指定する。

・高速リカバリ領域
→バックアップとリカバリの領域を指定する。

・データベース文字セット
→データベースに使用するキャラクタセットを選択する。

・管理者パスワード

・コンテナデータベースとして作成

標準構成をもっと詳しく設定しようとすると拡張構成になる、って認識でいいんすかね。
設定欲張りセット。
AngularFire でFirestore を型付きで扱うまで

## 前置き
AngularFire でFirestore を使おうとした。  
サンプルの通りにやったら、とりあえず取得はできた。  
ただ、せっかくTypeScript を使っているので型を定義したいと思ったけど、詰まった。  
この記事はその時に調べたことをまとめたものです。  

## 本編
結論は`FirestoreDataConverter`と`CollectionReference.withConverter()`を使用する。  
↓は公式リファレンスのリンク。  

https://firebase.google.com/docs/reference/js/firestore_.firestoredataconverter?_gl=1*zti0bt*_up*MQ..*_ga*MTMyNDE1NTgwNy4xNzM4ODQ1NjI3*_ga_CW55HF8NVT*MTczODg0NTYyNi4xLjAuMTczODg0NTYyNi4wLjAuMA..&hl=ja

https://firebase.google.com/docs/reference/js/firestore_.collectionreference?_gl=1*1n40tiv*_up*MQ..*_ga*MTEyMDAxMDY5LjE3Mzg4NDU0MDU.*_ga_CW55HF8NVT*MTczODg0NTQwNC4xLjAuMTczODg0NTQwNC4wLjAuMA..&hl=ja#collectionreferencewithconverter

これで`CollectionReference`オブジェクト事態に型付けをすることができ、アップロード・ダウンロード時も型付けの恩恵を受けることができる。はず…  
(僕が使っているIDEだと、HTMLテンプレートでうまく型がきかないこともあったけど…)  


## おまけ
ここからは僕用のメモというかそんな感じの。  

最初は、サンプルにのっとって`collection`で特定のコレクションを指定し、`collectionData`で取得した。  
これでもドキュメントをまとめて取得できたが、型の恩恵を受けることができなかった。  
`collectionData`にジェネリクスしたところ、エラーとなった。  
同様に`collection`もエラーとなった。  

ChatGPT 先生に聞いたところ、`collectionData`をas でキャストする方法を教えてもらった。  
これでも問題ないが、せっかくジェネリクスが使えるのにキャストは違和感があった。  
加えて、アップロード時の処理も考えると、`collection`で型を指定し、アップロード・ダウンロード時に使いまわす方がスマートだと思ったので、別のやり方を探した。  

そこで、見つけたのが↑の公式リファレンスだった。  
こうすることで、`collection`に型を適用することができた。  

また、調べる中で、以下のことが分かった。  
- firestore とfirestore/lite の2つがあること。
  - firestore にはオフライン機能があり、一時的にネット接続が途切れてもアップロード・ダウンロードをキャッシュし、ネット接続時に自動で反映してくれる。ただし、サイズが大きい。
  - lite はオフライン機能等をオミットして、純粋なREST API として使用できる。その分サイズが小さい。
- firestore はアプリの型(AppModelType)とdb の型(DbModelType)を別々で定義できる。
  - 2つの差異は`FirestoreDataConverter`で吸収できる。
  - 例えば、ドキュメント作成日時をFirestore でやってもらいたいときなどに使用する。


## 感想
楽しかった。  
NoSQL は初めてだったので、RDB との違いに戸惑った。  


今回の記事は以上です。  

前回記事はこちら  

https://qiita.com/magurouhiru/items/2917d1477ab80e74e013

詳細見たい人はこちら  

https://github.com/magurouhiru/mysite/pull/100

https://mysite-with-firebase.firebaseapp.com/study/angularfire-firestore
Android：LiveData LifecycleOwnerの注意事項！

# はじめに
FragmentでLiveData#observeメソッドを使う際の注意事項について記載する。
アプリがクラッシュしたり予期せぬ動作になる可能性があるため、注意が必要。

# 注意事項
FragmentでLiveData#observeメソッドを使う際は、引数にviewLifecycleOwnerを使用した方が良い。

理由は以下の通り：

1. **メモリリークの防止**: 
viewLifecycleOwnerを使用することで、Fragmentのビューが破棄されたときに自動的にObserverが解除されます。

2. **多重生成の回避**: 
thisを使用すると、Fragmentが再作成されるたびに新しいObserverが追加され、同じイベントに対して複数回反応する可能性があります。

3. **ビューのライフサイクルに合わせた適切な管理**: 
viewLifecycleOwnerはFragmentのビューのライフサイクルに紐づいているため、onCreateView()からonDestroyView()までの間でのみObserverが有効になります。

使用例:
```kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel.liveData.observe(viewLifecycleOwner) { data ->
        // データの更新処理など
    }
}
```

この方法を使用することで、Fragmentのビューが破棄されても適切に停止され、不要な処理や潜在的なバグを防ぐことができます。

---
参考資料
　https://qiita.com/sdkei/items/100580137e7b2f705205
　https://qiita.com/d_forest/items/6b411c9e8093e8a1f5ae
 
以上
Visual Studio Codeの穴場拡張機能(再改)

## Pythonでは無力なBracket HighlighterとScoper
[前回](https://qiita.com/KLaboratory/items/6b46afb12a0452b72b61 "Visual Studio Codeの穴場拡張機能(改)")、[前々回](https://qiita.com/KLaboratory/items/46a536839a32a7efcbe8 "Visual Studio Codeの穴場拡張機能")と二回に分けて、**Bracket HighlighterとScoper**という拡張機能の使いやすさについて説明しました。確かに多くの言語では{}の対応や関数のスコープの表示が見やすくなって便利なことに変わりはありません。だがしかし、{}を関数で使うことのないPythonのような言語では全くの無力です。例えばこのようなコードでは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/deb42fa9-77b1-471b-bd66-e0c31144ec36.png)
[Python初心者として学ぶ！面白いプログラムのコピペより](https://note.com/s_t877/n/n2456125e6597)
カーソル行が強調されるだけという結果となります。Bracket HighlighterとScoperが全く活きません。


## frame-indent-rainbow
新たに見つけたのが**frame-indent-rainbow**です。
[拡張機能のページ](https://marketplace.visualstudio.com/items?itemName=firejump.frame-indent-rainbow)
これを使うと、インデントされたブロックごとに色を変えてくれます。上記のコードでは次のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/c27b9b86-3d6b-21c3-4121-b6ccdcd5e4b3.png)
while文の中、if～elifの中もわかりやすく表示されます。もちろん、C#などの言語でも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/533f0008-afc4-5d67-0045-5f5491166b0d.png)
とてもわかり易く表示されます。図はデフォルトのままですが、自分で色を変えればもっと見やすくなるでしょう。これからはframe-indent-rainbowを使っていこうと思います。
DOOMをWindowsで動かしてみた

## はじめに
PDFでもGoogleの検索バーでも大体何でも動作する「DOOM」、自分も何かで動かしてみたいと思ったのでとりあえずWindows上で動かしてみる。ちなみに、DOOMは1997年からオープンソースとしてコードが公開されているので、著作権関連とかは問題ない。

https://github.com/id-Software/DOOM

## 実行環境
- win11
- wsl2(ubuntu22.04)

## 依存ライブラリの用意
C言語の特性上、64bitだとint型とpointer型のバイト数が不一致になり、正常にビルドできない為、32bitでビルドできるようにパッケージを導入する。

https://docs.oracle.com/cd/E19205-01/820-1209/bjami/index.html


| Type    | ILP32 (bits) | LP64 (bits) |
|---------|--------------|-------------|
| int     | 32           | 32          |
| pointer | 32           | 64          | 

```bash
sudo apt update
sudo apt install make
sudo apt install gcc
sudo dpkg --add-architecture i386
sudo apt-get install libx11-dev:i386 libxext-dev:i386 libnsl-dev:i386
sudo apt-get install xserver-xephyr
```

## DOOM本体
```
git clone git@github.com:id-Software/DOOM.git
cd DOOM/linuxdoom-1.10/
```

## 修正
なぜかは知らないが、DOOMのコードにはいくつかバグがあるにも関わらず、そのまま放置されている。わびさび的な何からしいが、普通に動かないので修正をかけていく。

### linuxファイルの作成
ビルドしたもの配置するフォルダが作られてないので作ってあげる
```bash
cd DOOM/linuxdoom-1.10/
mkdir linux
```
### WADファイルの準備
設定ファイルはレポジトリに含まれていない為、別途用意する必要がある。
自分はdoom wikiにお世話になった。

https://doomwiki.org/wiki/DOOM1.WAD

ダウンロードした`doom1.wad`は`DOOM/linuxdoom-1.10/linux`配下に配置する。
何らかの要因で`make clear`した場合、`DOOM/linuxdoom-1.10/linux`配下のファイルは全て消えるので注意されたし。

### i_sound.cの修正
```c
# line 166
extern int	errno; // これをコメントアウト
```
ヘッダにライブラリを追加
```c
#include <errno.h>
```

### i_video.cの修正
ライブラリ名にタイポがあるので修正
```c
#include <errnos.h> // 正しくは<errno.h>
```
画面サイズの修正

値が1だと解像度が320*200で画面が小さいので、2にする事で倍の解像度にする。
```c
static int	multiply=2;
```

カラーマップの設定追加
```c
# line 820
XInstallColormap( x_display, x_cmap ); // これを追加
```

### Makefileの修正
```make
CFLAGS = -g -Wall -DNORMALUNIX -DLINUX -m32 # -m32 オプションを加え、32bitでビルドすることを明示
```
## ビルド
ここまで来たら`/DOOM/linuxdoom-1.10`の中で`make`するだけ
```
make
```

## 起動
ビルドで出来たものに`linuxxdoom`があるので、これを叩いて起動する。
まず、適当なターミナルで描画用の画面を生成
```bash
Xephyr :2 -screen 640x480x8 -br -reset -terminate -title DOOM &
```
次に、ビルドフォルダに移動し、先ほど生成した画面を指定して起動
```bash
cd DOOM/linuxdoom-1.10/linux
DISPLAY=:2 ./linuxxdoom
```
起動したら成功
![スクリーンショット (222).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956485/eb8f1d89-4023-9153-e2be-5efd738ba7e8.png)

## おわりに
思ったよりすんなりビルドしてプレイできた。先人たちがDOOM道を整備してくれたおかげですね。当然ここで終わるわけではなく、自作OS上で動かしたり、色々試行してみたいモノがあるので、うまく行ったらそれらも公開していく。
localstackを構築して、s3バケットを作成してみる

# localstackとは
localstackとは、AWSの主要なサービスをローカル環境でエミュレートできるサービスだよ。s3やDynamoDB、Lambda、SNS、SQSなどのサービスをインターネット接続なしで動作確認できるよ。


# 動作環境
* Windows11
* DockerDesktopインストール済み

# 作業内容
作業としては、以下の3ステップで完了するよ。

* docker-compose.ymlの作成
* AWS-CLIのインストール
* credentialsの設定

では、実際にlocalstackを構築してみるよ。
## docker-compose.ymlの作成
公式サイトのDocker-Composeでの起動手順を参考に起動するよ。ymlの内容は少しアレンジしているので、公式をみながらアレンジしてね。保存場所は任意のディレクトリでOK。

https://docs.localstack.cloud/getting-started/installation/#docker-compose


```yml
version: "3.8"

services:
  localstack:
    container_name: localstack
    image: localstack/localstack:latest
    ports:
      - "4566:4566" # LocalStack Gateway
      - "4510-4559:4510-4559" # external services port range
    environment:
      - DEFAULT_REGION=ap-northeast-1
      - DEBUG=1 # トラブルシューティングに役立つため、DEBUGログをonに設定
```

cmdで以下コマンドを実行し、起動するよ。
```
docker-compose up -d
```


## AWS-CLIのインストール

AWS公式より、AWS-CLIのインストールを行ってね。

https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/install-windows.html

インストールが完了したら、以下コマンドでインストールの確認を行ってね。
```
aws --version

## 実行結果
aws-cli/1.37.16 Python/3.12.6 Windows/11 botocore/1.36.16
```

## credentialsの設定
cliからLocalStackにアクセスするためにはまずcredentialsの設定が必要だよ。以下コマンドで設定出来るよ。
```
aws configure --profile localstack
```

credentialsの設定値は任意でOKで、今回は以下のように設定したよ。
```
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

## バケットの作成をしてみる

次にs3のバケットを作成してみるよ。以下コマンドを実行してね。
```
# 作成コマンド
aws s3 mb s3://[任意の名前] --endpoint-url=http://localhost:4566 --profile localstack

# 実行結果
make_bucket: [任意の名前]
```

また、バケットの削除やアップロードのコマンドなども記載しておくよ。
```
# 削除コマンド
aws s3 rb s3://[削除したいバケット名] --force --endpoint-url=http://localhost:4566 --profile localstack

# s3バケット一覧
aws s3 ls --endpoint-url=http://localhost:4566 --profile localstack

# ファイルのアップロード
aws s3 cp [アップロードしたいファイル] s3://[アップロード先のバケット名] --endpoint-url=http://localhost:4566 --profile localstack

# アップロードできたかの確認
s3 ls s3://[アップロード先のバケット名]/ --endpoint-url=http://localhost:4566 --profile localstack
```


## （参考）CORS設定
フロントエンドからファイルをダウンロード/アップロードする場合、CORS設定が必要なのでその備忘録を記載するよ。

任意のディレクトリに、cors-configuration.jsonを作成するよ。内容は、権限に合わせて作成してね。
```json
{
    "CORSRules": [
        {
            "AllowedHeaders": ["*"],
            "AllowedMethods": ["GET", "PUT", "POST"],
            "AllowedOrigins": ["*"],
            "ExposeHeaders": [],
            "MaxAgeSeconds": 3000
        }
    ]
}
```
作成したファイルを、バケットに設定するよ。
```
aws --endpoint-url=http://localhost:4566 --profile localstack
s3api put-bucket-cors --bucket [設定したいバケット名] --cors-configuration file://cors-configuration.json 
```

設定が出来たかの確認を行うよ。
```
aws --endpoint-url=http://localhost:4566 --profile localstack s3api get-bucket-cors --bucket sample-bucket 

## 実行結果
{
    "CORSRules": [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "GET",
                "PUT",
                "POST"
            ],
            "AllowedOrigins": [
                "*"
            ],
            "MaxAgeSeconds": 3000
        }
    ]
}
```
以上でlocalstackでs3を作成する手順が完了したよ。お疲れ様でした！
Android：LiveData observeメソッドの注意事項！

# はじめに
LiveDataは非常に便利だが、、設計上の仕様を把握していないとアプリがクラッシュしたり、意図していない処理が何度も走ってしまうことがある。
この辺りの注意事項についてまとめてみる。

# 注意事項
LiveDataのobserveメソッドを呼び出した際、LiveDataにイベントが保持されていればそのイベントを即座に処理してしまいます。
これは LiveData の設計上の仕様です。

LiveData は最新の値をキャッシュしており、Observer への通知は以下の状況で行われます：

1. Active な状態（Lifecycle が STARTED または RESUMED）で LiveData の値が更新された場合
2. Inactive から Active になった場合

この挙動により、一度だけ実行したい処理（例えば、Fragmentの遷移時）に不都合が生じる可能性があります。例えば、あるFragmentに戻った際に、以前にセットされた値が再度処理されてしまう問題が起こりうるのです。

この問題に対処するためには、いくつかの方法があります：

1. SingleLiveEvent や Event クラスを使用して、一度だけ処理されるイベントを実装する。
2. StateFlow を使用して、初期値を明示的に設定し、null 対応の問題を回避する。
3. observe メソッドの呼び出しタイミングを適切に管理する。

LiveData の使用には注意が必要ですが、適切に使用すれば UI とデータの状態を一致させ、メモリリークを防ぎ、ライフサイクルに応じた適切な処理を行うことができます。

# 結論_解決策１：SingleLiveEvent
イベントを流した時に一度だけobserveするクラスを作成して使うのが良いかと。
この辺りは以下記事が超詳しく記載されている
　https://qiita.com/yogita109/items/c2fae2ff7aafd671ddad

# 結論_解決策２：observe メソッドの呼び出しタイミング
・Activityの場合：onCreateのタイミングでコールする
・Fragmentの場合：onViewCreatedのタイミングでコールする
　→onResumeとかonCreateViewとかのイベントだとコールされるタイミングが増えるため、検討が必要になる。
 　検討は必要だが、公式にも記載されている通り予期せぬ動作になる（処理が二重に走ったりね）可能性があるため、素直に公式に従った方が良いと思われる。

この辺りはAndroid公式を見るべし
　https://developer.android.com/topic/libraries/architecture/livedata?hl=ja#observe_livedata_objects

以上
ssh-keyscanをプロキシ環境下で使う

## 背景

`ssh-keyscan` コマンドは `~/.ssh/config` の設定を無視し、直接ターゲットホストへ接続を試みます。また、HTTP/HTTPS プロキシを利用するオプションもありません。そのため、プロキシ環境下で `ssh-keyscan` を利用するには工夫が必要です。

## 解決方法

この問題は `socat` を利用することで解決できます。`socat` はデータ転送を柔軟に制御できるツールで、今回のようなプロキシ経由の TCP 通信を簡単に実現できます。

| | ホスト | ポート |
| -- | :--: | :--: |
| プロキシサーバー | proxy | 3128 |
| ターゲット | ssh.github.com | 443 |

表のような条件の場合の実行例を次に示します。

### 1. socat をバックグラウンドで実行する

```bash
socat TCP-LISTEN:1234,fork PROXY:proxy:ssh.github.com:443,proxyport=3128 &
```

- `TCP-LISTEN:1234,fork`
  - ローカルのポート `1234` でリッスンし、接続ごとに新しいプロセスを生成（fork）
- `PROXY:proxy:ssh.github.com:443,proxyport=3128`
  - `proxy:3128` を介して `ssh.github.com:443` に接続

### 2. ssh-keyscan を実行する

起動した `socat` 経由で `ssh-keyscan` を実行します。

```bash
ssh-keyscan -p 1234 localhost
```

取得された結果のホスト名は `localhost` になるため適宜読み替えてください。

### 3. socat プロセスを終了する

```bash
fg %1   # バックグラウンドジョブをフォアグラウンドに戻す
Ctrl+C  # 停止
```
フレッツ光クロスへのプラン変更 (2025年2月)

# はじめに
フレッツ光クロスへのプラン変更を実施した。
法人向けOCNについて、情報がWebになかったので記録とする
開通までに徐々に情報更新する

# 既設回線
フレッツ品目： フレッツ光ネクスト ファミリー・ギガラインタイプ（戸建て）
ONU： 小型ONU 
OCN： フレッツ 光ネクスト(IPoE 標準プラン) 固定IP1 
ルータ：自営ルータ
> 第6種OCN カテゴリ8タイプ4コースU標準プラン1、専用ルータなし
> 既設回線の回線IDはCAF番 (COPではない)
> NTT東日本エリア

# プラン変更後のフレッツ品目
フレッツ品目： フレッツ 光クロス
ONU: 10G-EPON ONU
ホームゲートウェイ：なし
ルータ：自営ルータ

> 品目変更において住所やオプションサービスの変更無し


# 時系列
- 2025/2/4 NTT東日本Web申込
- 2025/2/8 NTT東日本Web申込から工事日の確定

:::note info
CAF番変更なし
派遣工事要
:::

# B-OCN申込内容
アクセスタイプの変更（フレッツ 光クロス(IPoE 標準プラン) 固定IP1 

> 第6種OCN カテゴリ8タイプ4コースX標準プラン1、専用ルータなし


# メモ
- CAF番が変わる場合はB-OCNは廃止新設扱い

# フレッツIPv6アドレス変更
- 2025/2/25 昼間フレッツ側のIPv6アドレス/56が変更された。工事との関連性は不明



# 工事日当日以降の時系列
### 2025-03-05T05:17:28.208237+09:00
網側切替開始？
- フレッツギガライン ONU認証なし、
- ひかり電話反応無し、
- DHCP IPv6-PD 反応無し

### 2025-03-05T09:40:20.335877+09:00
再度チェックで以下を確認
- フレッツギガライン ONU認証あり
- ひかり電話設定あり
- DHCP IPv6-PD 反応あり、直前までとIPv6 /56が変更
- IPv6アドレスセグメントは OCN のIPv4 IPアドレス共通型のセグメントが割り当てられており、ルータの設定変更により個人向けのOCN相当インターネット接続可能
- PPPoEセッションは不可
PPPoEが繋がらないところをみると、網仕様は朝5時から9時までの間に光クロスになった？
スピードテストの結果も従来せいぜい600Mbps程度だったものが上がっているので、同一10G-EPONに1Gでぶら下がっている状態？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/62e0d048-6c63-4694-ac47-7e2bb708e7b0.png)

### 2025-03-05 10時
工事実施。
三菱電機製と思われる10G ONUが設置された。こちらにあるものと同じ。

https://note.com/0ift0/n/n2cad0281545e

切替工程をみていると、クロージャー作業はなかったので、朝5時の時点で網側の収容を10G側に切り替えていたと思われる。（上記のPPPoE接続不可を考えると、切替時には10Gと1GのEPONを混在収容していると思われる）
ONUのMACを登録して、新ONUでの通信を確認、その後ひかり電話の収容替えをリモートで実施。

### 2025-03-05 16時
NTT東日本工事後、6時間経ってもIP1が復旧しないため、カスタマポータルにて問い合わせを実施。
OCN側工事は終わっている旨の返信あり。NTT東日本の工事竣工があがっていないのだろうか。待つしかないと判断。

### 2025-03-07T04:34:22.863720+09:00
DHCP IPv6-PD が本来のIPoE 固定IP1向けのOCN IPv6 /56 に切り替わり、IP1による通信が可能に。
ルータ設定変更を見直して接続正常化。

### 2025-03-20
最終的なルータ設定等の見直しにより、ここまでスループットがでることは確認できた。
1Gbpsのインタフェースを考えれば優秀といえよう。
最高速度より落ち込みがすくないことを狙ってのチョイスのチョイスなので問題ない。
![Screenshot 2025-03-20 at 23.35.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/cdcd9941-1ca6-4b59-aaa1-326a4595defc.png)

# 気がついたこと
暫定構成時には YAMAHA NVR-510により OCN IPアドレス共有型による接続設定を行っていた。
IP1に戻ったあともインターネット疎通が継続しており、NVR-510が内部的にIP1による通信に切り替えていたと思われる。なんて優秀。

https://network.yamaha.com/products/routers/nvr510/index


# まとめ
同一プロバイダでの光クロスへの切替(同一CAF番)であってもIPoE部分の最終切替に2日程度かかった。
仕事でつかっている場合においては、新設廃止での切替の方が手間はかかっても切替時間がすくなくなるので、のぞましいといえる。
切替途中で個人向けIPアドレス共有型相当での接続を担保してくれたので最低限助かったが、事前案内などは特になかったので、一般人でこれを理解して設定するのは困難と思われる。
アジャイル開発：ドキュメントについて

# はじめに
これはアジャイル開発に限ったことではないが、必要最低限のドキュメントすら作成していないプロジェクトがちらほらある。

というか、作る文化が全く無いプロジェクトすら。
つまり、<INS>**作る文化がないので、チームメンバも必要なドキュメントと認識していないのだ**</INS> :angel_tone2:

嘘だと言ってよ⚪︎ーニー！
と嘆いても現実にこういうプロジェクトは結構あるのだから仕方ない。
ドキュメントがあるのは当たり前ではないのだ。

前置きはさておき、、、
この記事ではアジャイル開発において、最低限必要なドキュメントについて記載していく。

※本当に必要最低限のドキュメントしか書いていないから、案件によってはアジャイル開発と言っても必要なドキュメントはこれ以外にも結構あると思うので、適宜必要に応じてドキュメントを作成すべき。

# 最低限必要なドキュメント
1. **ユーザーストーリー（USM）**: 
サービスが実現したい機能や目的を簡潔に記述したもの。
例えば、「顧客として、商品を検索できるようにしたい」といった形式で記載します。

2. **プロダクトバックログ**: 
ユーザーストーリーを含む、開発すべき機能や要件のリスト。
優先順位付けされており、プロジェクトの進行に応じて更新されます。
→カンバンとかで見ることができ、チームメンバがいつでも確認できる状態になっていればOK

3. **スプリントバックログ**: 
各スプリントで実装する機能や作業項目のリスト
→こちらもカンバンとかで見ることができ、チームメンバがいつでも確認できる状態になっていればOK


3. **要件定義書**: 
ユーザーストーリーを具体的なシステム要件に落とし込んだ文書。プロジェクトの進行に応じて動的に管理され、定期的に見直されます。

4. **システム設計書**: 
プロジェクトの技術的側面を記述した文書。以下のような要素が含まれます:
   - ER図: データベースの構造を示す図（テーブル定義書など）
   - API仕様書: 外部システムとの連携インターフェースの定義
   - システム構成図: システム全体のアーキテクチャを示す図
   - データモデル: アプリで使用するデータの構造や関連を示す図
   - 環境構築手順書、リリース手順書、開発ルールやチェックリスト、運用/保守作業に関するドキュメント、分析手順書など ... and more!!!
6. **テスト計画書**: 
アプリケーションのテスト方針や範囲を記述したドキュメント。

7. **リリースノート**: 
各リリースの変更点や新機能をまとめたドキュメント。

:::note info
システム設計書について
コードのxxxクラスにまとまっているからドキュメントはいらないよね？
アプリとサーバAPI開発者が一緒だからAPI仕様書いらないよね？
→<font color="red">**絶対そんなことは無い**</font> :angry: 

↑こんなこと言っている人がいたら、ドキュメントを作らない理由付けのために言っているに過ぎないと思うよ
 
この辺りの仕様書が無いと100%属人化されていることになるし、新しい人が入った時にコードからがっつり仕様を確認する or リバースエンジニアリングしなきゃいけないことになる。
ハッキリ言って無駄。

また、APIやDBを修正する際にドキュメントがあったら、実際に手を動かす実装者だけでなくマネージャー側も設計に入れるし、レビュアーも確認しやすいでしょ？（もちろん修正されたコードもレビューすることになるが）
設計は実装者一人でするものでは無いので、API仕様書やテーブル定義書くらいは必要かと。
:::


これらのドキュメントは、プロジェクトの進行に合わせて適宜更新し、チーム内での情報共有や意思決定の基盤として活用します。

# 技術的なドキュメントについて
作成するかどうかの観点は以下だと思う。
・属人化せず、チームメンバに共有されるべきドキュメントか？
・今後別の担当者が触った時に無いと困るドキュメントか？

# まとめ
アジャイル開発では、過度に詳細なドキュメントよりも、必要最小限の情報を効果的に共有することが重要です。
また、ソースコードの可読性を高め、重要な決定事項のトレーサビリティを確保することで、ドキュメント作成の負担を軽減しつつ、プロジェクトの透明性を維持することができます。





以上
isucon練習記録

途中経過の個人的な記録

参考：達人が教えるWebパフォーマンスチューニング 技術評論社

## 環境構築
チュートリアルどおりに進める
1. `git clone git@github.com:{{フォークした自分のユーザー名}}/private-isu.git`
1. `cd webapp/sql`
1. `curl -L -O https://github.com/catatsuy/private-isu/releases/download/img/dump.sql.bz2`
1. `bunzip2 dump.sql.bz2`
1. `docker compose up`

ここで問題２つ発生
1. 別pjで `3306` ポートを使っておりエラーとなった
    ```
    Error response from daemon: driver failed programming external connectivity on endpoint private-isu-mysql-1 (c0082d1461c3e9632461292ee5c07485f7afdfc7ae45c40017c8e1ba2ccded4e): Bind for 0.0.0.0:3306 failed: port is already allocated
    shimakura@shimakuraMacBookAir webapp % docker compose up
    ```
1. mysqlサービスのポート割当を3306→3366に修正
    ```
        ports:
          - "3366:3306"
    ```
1. 改めて `docker compsoe up` 実行し `localhost:80` にアクセスするもusersテーブルが無いと出る
1. DBの状況を確認するためmysqlに入って調査委
    1. `docker compose exec -it mysql bash`
    1. `mysql -uroot -proot`
    1. mysql> use isuconp
    1. mysql> show tables;
    1. 確かにusersテーブルが無いのでinitに失敗したのだろう
       ```
        +-------------------+
        | Tables_in_isuconp |
        +-------------------+
        | comments          |
        | posts             |
        +-------------------+
        ```
1. ボリューム消してリトライ `docker compose down`
1. `docker volume rm private-isu_mysql`
1. `docker compose up` 
1. 改めて80番にアクセスすると期待しているtopページ見が見られたので解決

## ベンチマーク実行
### ベンチマーク用のコンテナ作成
1. `cd benchmarker/userdata`
1. `curl -L -O https://github.com/catatsuy/private-isu/releases/download/img/img.zip`
1. `unzip img.zip`
1. `rm img.zip`
1. `cd ../`
1. `docker build -t private-isu-benchmarker .`
### ベンチマーク実行
1. `cd benchmarker`
1. `docker run --network host -i private-isu-benchmarker /bin/benchmarker -t http://localhost -u /opt/userdata`
1. 上記実行時に `docker stats` 実行すると `private-isu-mysl-1` コンテナのCPU使用率が90%超えとなり、mysqlに負荷かかっている事がわかる
1. しばらくして以下の結果得られた
    ```
    {"pass":true,"score":1241,"success":1066,"fail":0,"messages":[]}
    ```
src配下にあるファイル参照時に"Cannot find module '@/***' from 'src/***' "のエラーが出る

# はじめに

next.js×TypeScriptで作成したアプリに対して、Jestでテスト実行したところ、下記のようなエラーが出ました。
```
  Cannot find module '@/infra/api' from 'src/__tests__/posts/page.test.tsx'
```
# 原因
**Jest側でsrc配下のフォルダが正しく認識されていない**ようでした。
従って、Jestの設定を修正していきます。
# 解決方法
### １．`Jest.config.ts`に設定を追加

`moduleDirectories`はデフォルトだと`"node_modules"`ですが、ここに **`"src"`を追加します**。
そうすることで**Jestが`src/`を基準にモジュールを探してくれます**。
```ts:Jest.config.ts
const config: Config = {

  moduleDirectories: ["node_modules", "src"], // 追加
  moduleNameMapper: {
    "^@/(.*)$": "<rootDir>/src/$1",
  }
};
```
### ２．`tsconfig.json`に設定を追加

**`compilerOptions`の`paths`を`["*"]`から` ["./*"]`に修正し、`"baseUrl": "src"`を追加**します。

両者の違いは下記です。

・`["*"]`→ **プロジェクトルート (/) 直下**を基準に解釈する
・`["./*"]` → **baseUrl (src) を基準に相対パス**で解釈する
```json:tsconfig.json
  "compilerOptions": {
  
    "baseUrl": "src",
    "paths": {
      "@/*": ["./*"]
    }
  }
```
# おわりに
Jestの設定ファイルは自動作成されるため、あまり中身を理解できていませんでした。
今回の件で少しだけJestについて詳しくなれたと思います。
# 参考

https://jestjs.io/docs/configuration#modulenamemapper-objectstring-string--arraystring

https://qiita.com/ryokkkke/items/390647a7c26933940470#%E6%A6%82%E8%A6%81
Ruby on Rails：超基本

 #はじめに
 Ruby on Railsについて概要や学習方法について調べた結果をこの記事にまとめてみる。
 まずはイメージをつけるところから。

 # 主な特徴
 Ruby on Railsは、Rubyプログラミング言語を使用したWeb開発向けのフレームワークです。2004年に登場して以来、効率的で生産性の高いWeb開発を可能にし、多くの開発者に愛用されてきました。

 以下に主な特徴について記載していきます。

## MVCアーキテクチャ

Ruby on Railsは、Model（データ処理）、View（表示）、Controller（制御）の3つの役割に分けるMVCアーキテクチャを採用しています。これにより、以下の利点があります：

- コードの再利用性が高まる
- アプリケーションの保守性や拡張性が向上する
- 開発者が分担して作業しやすくなる

## CoC（Convention over Configuration）

「設定よりも規約」という原則に基づき、Ruby on Railsが用意した規約に従うことで、設定の記述量を大幅に削減できます。これにより：

- 開発者はロジックのプログラミングに集中できる
- 開発速度が向上する

## DRY（Don't Repeat Yourself）

同じコードや情報を繰り返し書かず、1カ所にのみ記述するという設計哲学です。Ruby on Railsには、この原則を守るための仕組みが備わっており：

- 少ないコード量で高品質なアプリケーションを開発できる
- コードの保守性が向上する

## RESTfulな設計

リソースを中心としたアプリケーション設計を促進し、標準的なHTTPメソッドを使用してリソースを操作します。

## 生産性の高さ

Ruby on Railsは、以下の特徴により高い生産性を実現しています：

- Scaffoldジェネレーターによる基本的なCRUD操作の自動生成
- 豊富なプラグインやライブラリの存在
- アクティブなコミュニティによるサポート

## セキュリティ機能

Ruby on Railsには、セキュリティ対策が組み込まれており、開発者は安全なアプリケーションを容易に構築できます。

これらの特徴により、Ruby on Railsは効率的で保守性の高いWeb開発を可能にし、特に短期間でのプロトタイプ開発や迅速なプロダクトリリースに適しています。

# メリット/デメリット
## メリット

1. 高い開発速度: Ruby on Railsは、少ないコード量で効率的に開発できるため、開発スピードが非常に速くなります。特に、プロトタイプの作成が短期間で可能です。

2. 生産性の向上: MVCパターン、DRY原則、CoC原則などの特徴により、開発者は本質的な部分に集中でき、生産性が向上します。

3. フルスタックフレームワーク: Ruby on Railsは開発に必要なツールが全て揃っているため、すぐに開発に着手できます。

4. 柔軟性: 少ないコード量で開発できるため、サービス内容の変更や最新トレンドへの対応が容易です。

5. メンテナンス性: コードがシンプルで直感的なため、テストやメンテナンスが比較的容易です。

## デメリット

1. 処理速度の遅さ: Ruby言語の特性上、処理速度が他の言語と比べて遅い傾向があります。

2. 大規模開発への不向き: Ruby on Railsの特徴が大規模開発では逆効果になる場合があります。

3. 学習の難しさ: 多くの機能が備わっているため、使いこなすのに時間がかかる場合があります。

4. 機械学習への不向き: 機械学習などの特殊な用途には適していません。

Ruby on Railsは、高速な開発と生産性の向上が求められる中小規模のWebアプリケーション開発に特に適していますが、処理速度や大規模開発には課題があります。プロジェクトの要件に応じて、これらのメリットとデメリットを考慮して選択することが重要です。

# 学習ロードマップ
学習ロードマップは以下の通りです：

## 1. 基礎知識の習得

- HTML、CSS、JavaScriptの基本を学ぶ
- Rubyプログラミング言語の基礎を習得する
  - Progateなどのオンライン学習サービスを活用

## 2. Ruby on Railsの基礎学習

- Ruby on Railsチュートリアルを1回目実践
  - 3〜5日で完了させ、Railsの雰囲気をつかむ

## 3. 基礎知識の深化

- Rubyの文法やオブジェクト指向プログラミングの概念を深く学ぶ
- データベースの基本概念を理解する

## 4. Ruby on Railsの本格的な学習

- Ruby on Railsチュートリアルを2回目実践
  - 今度は理解を深めながら進める
- MVCアーキテクチャ、RESTful設計などの概念を学ぶ

## 5. 実践的なアプリケーション開発

- 自作のWebアプリケーションを開発する
- オープンソースプロジェクトにコントリビュートする

## 6. 応用スキルの習得

- テスト駆動開発（TDD）を学ぶ
- セキュリティ対策やパフォーマンス最適化について学ぶ

## 7. 継続的な学習と実践

- 最新のRuby on Railsの機能や best practices を学び続ける
- 実際のプロジェクトに参加し、経験を積む

このロードマップに沿って学習を進めることで、効率的にRuby on Railsのスキルを習得できます。ただし、個人の学習ペースや目標に応じて調整することが重要です。



 以上
[Linux][command] ファイルシステム管理_df, du, fsck, e2fsck

# ディスクの確認
## dfコマンド
- `df`: disk free
~~~terminal
# df [オプション] デバイス名
~~~
| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
| (default) | disk free | ファイルシステム全体のディスク使用量、空き容量を表示 |
| `-h` | human-readable | 人間が読みやすい単位（KB, MB, GB）でディスク容量を表示 |
| `-i` | inodes | 使用中および空いているiノードの数を表示 |
| `-k` | kilobytes | ディスク使用量をキロバイト単位で表示 |
| `-m` | megabytes | ディスク使用量をメガバイト単位で表示 | 



## duコマンド
- `du`: disk usage
~~~terminal
# du [オプション] [ファイルまたはディレクトリ]
~~~
| オプション | 英語の由来        | 説明                     |
|:--|:--|:--|
|(default)| disk usage | 特定のディレクトリやファイルのディスク使用量を表示|
| `-h`  | human-readable| 人間が読みやすい単位（KB、MB、GB）でディスク使用量を表示|
| `-a`   | all  | 全てのディレクトリとファイルのディスク使用量も表示    |
| `-s` | summarize          | 合計ディスク使用量<INS>**のみ**</INS>表示 |
| `-c`   | cumulative | 合計ディスク使用量<INS>**を追加**</INS>表示  |
| `-S`   | separate dirs | ディスク使用量にサブディレクトリの容量を含めない |
| `-k`      | kilobytes    | ディスク使用量をキロバイト単位で表示  |
| `-m`      | megabytes          | ディスク使用量をメガバイト単位で表示 |


# ファイルシステムの確認
## fsckコマンド
- `fsck`: fail system check
~~~terminal:
# fsck [オプション] デバイス名 
~~~

| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
| (default) | fail system check | - ファイルシステムの検査を行い、修復が必要な場合は確認を促します。 |
| `-t` | type | - ファイルシステムの種類を指定します。 |
| `-A` | All | - `/etc/fstab` に記載されているすべてのファイルシステムをチェックします。 |
| `-N` | No execute | - 実際には修復を行わず、実行されるであろうコマンドを表示します。 |
| `-a` | Automatic repair | - 自動的に修復 |
| `-r` | Interactive repair | - 対話的に修復 |

## e2fsckコマンド

- `e2fsck`: ext2 file system check

~~~terminal
# e2fsck [オプション] デバイス名
~~~

| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
| (デフォルト) | ext2 file system check | ファイルシステムの検査を行い、修復が必要な場合は確認を促します。 |
| `-p` | preen | 問題を自動的に修正します。 |
| `-y` | yes | すべての修復確認に対して自動的に「yes」と応答します。 |
| `-n` | no | すべての修復確認に対して自動的に「no」と応答します。 |




# Ping-t
df
- [3105_df](https://mondai.ping-t.com/question_subjects/31/question_sessions/30870646/progressing_questions/472924566)
- [3217_df -i](https://mondai.ping-t.com/question_subjects/31/question_sessions/31602419/progressing_questions/484263623)

du
- [3017_du -sh](https://mondai.ping-t.com/question_subjects/31/question_sessions/32581786/progressing_questions/499228220?result=true)
- [3218_du](https://mondai.ping-t.com/question_subjects/31/question_sessions/32581786/progressing_questions/499228196?result=true)
- [3219_du -ah](https://mondai.ping-t.com/question_subjects/31/question_sessions/31551465/progressing_questions/483453578)
- [3220_du -chS](https://mondai.ping-t.com/question_subjects/31/question_sessions/32163062/progressing_questions/492736600)
- [3298_du -m](https://mondai.ping-t.com/question_subjects/31/question_sessions/31140772/progressing_questions/477192462)

fsck
- [3223_fsck -A](https://mondai.ping-t.com/question_subjects/31/question_sessions/31763145/progressing_questions/486763767)
- [3300_fsck -r](https://mondai.ping-t.com/question_subjects/31/question_sessions/31232403/progressing_questions/478592408)

e2fsck
- [3020_e2fsck -n](https://mondai.ping-t.com/question_subjects/31/question_sessions/31511309/progressing_questions/482837160)
- [3021_e2fsck -p](https://mondai.ping-t.com/question_subjects/31/question_sessions/32581786/progressing_questions/499228200?result=true)