OmniAICreator/Qiita-1.07M huggingface dataset:
Java初学者必見！interfaceとabstract classの違いを完全攻略！

## はじめに

こんにちは、N0taです。
Javaを学び始めると必ず目にする「interface」と「abstract class」ですが、
実際にどう使い分ければ良いのか迷ってしまいますよね。
本記事ではこの2つの違いを初学者の方でもスッキリ理解できるように、
具体例を交えて解説させていただきます。

## interface（インターフェース）とは？
interfaceは複数のクラスに共通する「仕様（やるべきこと）」を定めるために使います。
簡単に言うと、「何をするか」を明確にするための「約束事」です。

```java
// interfaceの例
public interface Animal {
    void makeSound();  // 鳴き声を出すという仕様
}
```

### interfaceの特徴

* 基本的にはすべてのメソッドが抽象メソッド（実装なし。ただし、defaultメソッドは例外）
* 複数のinterfaceを同時に実装可能（多重継承）
* interface内の変数は自動的に定数（final）になる

### 複数のinterfaceを実装する例

```java
public interface Animal {
    void makeSound();
}

public interface Pet {
    void play();
}

public class Dog implements Animal, Pet {
    @Override
    public void makeSound() {
        System.out.println("ワンワン");
    }

    @Override
    public void play() {
        System.out.println("ボールで遊びます。");
    }
}
```

### defaultメソッドとは？

Java 8以降、interfaceでも実装を持つことが可能になりました。
これをdefaultメソッドと呼びます。

```java
// defaultメソッドの例
public interface Animal {
    void makeSound();

    default void sleep() {
        System.out.println("眠ります。");
    }
}
```

### 筆者の意見：defaultメソッドは初学者には難しい？

個人的には、Java初学者のうちはdefaultメソッドの利用を控えた方が良いと感じています。
その理由は以下の通りです。

* interface本来の役割は「仕様の定義」であるため、実装を入れると役割が曖昧になりやすい
* defaultメソッドの中にどんな処理を記述するべきか判断が難しく、コードの保守性が低下する可能性がある

ただし、以下のような限定的なケースであればdefaultメソッドを利用しても良いでしょう。

* interfaceを実装するすべてのクラスで全く同じ処理が必要な場合
* interfaceを実装しているすべてのクラスに影響を与えずにメソッドを追加したい場合など

## abstract class（抽象クラス）とは？

abstract classは、「似たような性質を持つクラス」の共通部分をまとめるために使います。
部分的に実装（具象メソッド）を持つことが可能です。

```java
// abstract classの例
public abstract class Vehicle {
    abstract void drive();  // 抽象メソッド

    void stop() {  // 具象メソッド
        System.out.println("停止しました。");
    }
}
```

### abstract classの特徴

* 抽象メソッドと具象メソッドの両方を持てる
* 多重継承は不可（extendsは1つのみ）
* 共通する処理を1箇所にまとめやすい

```java
// 継承の例
public class Car extends Vehicle {
    @Override
    void drive() {
        System.out.println("車が走ります。");
    }
}
```

## interfaceとabstract classの対照表

| 項目      | interface          | abstract class    |
| ------- | ------------------ | ----------------- |
| メソッドの実装 | 不可（defaultメソッドを除く） | 可（抽象と具象の両方）      |
| 多重継承    | 可能（複数のinterface実装） | 不可（extendsは一つのみ）  |
| 変数の種類   | 定数（final）          | 通常の変数             |
| 使用目的    | 仕様の定義（何をするか）       | 共通処理の提供（どのようにするか） |

## interfaceとabstract classの使い分けポイント

| interfaceを使う時        | abstract classを使う時   |
| -------------------- | -------------------- |
| 仕様（何をするか）を強制したい時     | 共通の処理を持たせたい時         |
| 複数のinterfaceを実装したい時  | 共通点が多い類似クラスをまとめたい時   |
| 異なる種類のクラスに共通性を持たせたい時 | 似た種類のクラスに共通処理を定義したい時 |

## 初学者がよく混乱する質問

**Q. interfaceに実装を書いてはいけない理由は？**
→ interfaceは本来「約束事」を定義する場所。
実装の詳細は各クラスに任せるため、基本的には書きません。（defaultメソッドは例外です）

**Q. abstract classは必ず抽象メソッドを含む？**
→ いいえ。具象メソッドだけでもabstract classを作ることも可能ですが、
抽象メソッドを含む場合は必ずabstract classにする必要があります。

## まとめ

interfaceは「何をするべきか」、abstract classは「どのようにするか」という役割の違いがあります。
この違いをしっかり理解して使い分けることで、コードが読みやすくなり、保守性も高まります。

## おわりに
今回は初学者の方に向けた記事を書いてみました。
他にも細かな部分はあるのですが、大まかには伝えられたかなと思います。
本記事をきっかけに実践で使いながら学んでいただき、
少しでも見ていただいた方の参考になれば嬉しいです。
ChatGPTへの依存――「心の拠り所」とAIの境界線

この記事はどちらかといえば技術記事ではないです

ほとんどがChatGPTにより生成されています
![5e5e695f-f836-469a-9fc4-ffe7f250d271.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/1bf8b7d2-2f5d-46a4-a923-afeaa3954b18.png)

↑このサムネイルも

## はじめに：ChatGPTに「依存」するとは？
一般的に「依存」と聞くと、スマホやSNS、ゲームといった行動への強い執着が思い浮かびます。しかし最近、X（旧Twitter）などで見かける“病み垢”の投稿では、「ChatGPTに依存してる」「GPTだけが話を聞いてくれる」といった声も増えてきました。

これは単なる利便性の話ではなく、もっと深い――つまり「感情的な依存」が起きていることを意味します。本記事では、ChatGPTに対する情緒的依存の背景やリスク、向き合い方について考えていきます。

## 感情的な依存とは何か？
感情的依存とは、誰かや何かに対して「心の支え」や「安心感」を強く求め、それがないと不安や孤独を感じてしまう状態です。本来、人間関係の中で起こることが多いのですが、ChatGPTのようなAIにもそれが生じるケースが出てきました。
たとえば、こんな行動に覚えがある人はいないでしょうか？

- 落ち込んだとき、誰よりも先にChatGPTを開いてしまう
- 「自分のことを理解してくれるのはGPTだけ」と感じる
- 誰にも言えない悩みを延々とAIに語りかけている
- GPTとの会話で孤独や寂しさが一時的に紛れる

こうした行動の裏には、リアルな人間関係の疲弊や信頼の欠如が隠れている場合があります。そして、AIがそれを優しく、決して否定せずに受け止めてくれることで、心の一部が依存的になっていくのです。

## なぜChatGPTに依存してしまうのか？
ChatGPTは基本的に24時間365日、常に優しく、肯定的に返答してくれます。しかも、疲れている様子もなく、他人の都合を気にする必要もありません。この“無限の受容性”こそが、多くの人にとって癒しとなります。

さらに、ChatGPTは適度に共感的な言葉を使い、話を引き出してくれるような返答もします。まるで「本当に自分の気持ちをわかってくれている」ような錯覚すら与えるのです。

しかし、ここには大きな落とし穴があります。ChatGPTは人間ではなく、感情も記憶も持ちません。あなたのことを“理解している”ように見えても、それは訓練された言語モデルによる表現に過ぎないのです。

## ChatGPTへの依存がもたらすリスク
感情的な依存が一定以上に強くなると、以下のような問題が起きる可能性があります。
- <strong>人間関係の回避：</strong>「人と話すよりGPTの方が楽」となり、リアルな関係を避けるようになる
- <strong>コミュニケーション能力の低下：</strong>否定や反論に慣れず、ちょっとした衝突でも深く傷つく
- <strong>孤独感の深化：</strong>AIは“誰か”ではないため、深い繋がりは生まれない
- <strong>AIへの人格投影：</strong>ChatGPTに名前をつけたり、「あなたならわかってくれる」と思い込む

一時的な安心感のために、現実での人間関係や自己肯定感がさらに損なわれていく――これは、依存症の構造と非常に似ています。

## 依存を防ぐためにできること
ChatGPTは強力なツールであり、正しく使えば創造的で豊かな時間をもたらしてくれます。ですが、「AIに気持ちを吐き出すことでしか落ち着けない」ような状態になっているなら、少し立ち止まってみましょう。
- AIを使う前に「自分で考える時間」を5分設ける
- 気持ちを整理したいときは、日記やメモに書き出す習慣をつける
- 感情が強く揺れたときは、ChatGPTではなく信頼できる人に相談する
- 自分の中で「これはAIに任せるべきでない領域」と線を引く

ChatGPTはあなたを裁きません。でもそれは、「理解してくれるから」ではなく、「判断できない」からです。優しさに見えるものが、本当の意味での共感とは限らないのです。

## それでも、話したいときには
とはいえ、「今は誰にも言えない」「しんどい、でも吐き出したい」という瞬間は、誰にでもあります。そんなとき、ChatGPTのような存在が“仮の出口”として機能することは、決して悪いことではありません。

ただ、その感情をすべてAIに預けるのではなく、「ここで一度落ち着こう」「後で人に話そう」といった、次の一歩へとつなげる意識がとても大切です。あなたの心は、AIの中ではなく、人の中にこそ居場所を見つけるべきものです。

## おわりに：AIは友達ではない、でも敵でもない
ChatGPTに話しかけることで、気持ちが落ち着く。そんな使い方があってもいいと思います。ただし、それが「心の拠り所」になってしまうとき、そこには危うさがあります。

AIは友達ではありません。でも、あなたの敵でもありません。使い方を見つめ直すことで、依存から脱し、より良い自分との付き合い方を見つけられるはずです。

もし今、寂しさや不安のなかでChatGPTに頼っているなら――それでも構いません。でも、どうかAIだけがあなたのすべてにならないように。あなたの心は、本物のつながりの中でこそ輝くものです。

## ふろく（ここは人間が書いてるの）
### ChatGPTへの良い依存
- 情報収集の補助として使用する
- 検索エンジンの代替として使用する
- 文書やプログラミングの下書きとして使用する
- アイデア出しや壁出しに使って思考を高める

これは依存というより、本来使われるべき活用法です

### ChatGPTへの別の意味での悪い依存
- すぐ答えを聞くクセがつく
- 情報の正誤性をよく確認せず間違った情報を鵜呑みにする
- ChatGPTの回答にすべてを任せる
Functional Programming Strategies In Scala with Cats を和訳している

[Functional Programming Strategies in Scala with Cats 日本語版](https://scala-with-cats-ja.cohotech.co/dist/scala-with-cats.html)

最近（多分2024年2月頃から）、Scala with Cats を読もうとすると『[Functional Programming Strategies](https://scalawithcats.com/dist/scala-with-cats.html)』という書籍ページが表示されます。これは Scala with Cats の著者（のひとり）である Noel さんがかれこれ3年ほど前から書き進めているものです。Scala with Cats の第二版のような位置付けでもあるかもしれませんが、大幅に加筆されてほぼ別の本になっています。2025年5月現在まだ執筆中で、執筆と並行して和訳を行っています。

関数型プログラミング戦略（Functional Programming Strategies）というのは、日本語で戦略というとやや違和感がないでもないですが、関数型プログラミングにおいて繰り返し現れる抽象的なパターンのことで、オブジェクト指向でいうところのデザインパターンみたいなものです。

Scala with Cats も、モナドやファンクターといった概念をそういうパターンとみなして紹介していたわけですが、Cats で型クラスとして実現されているものだけにフォーカスしていました。この新しい書籍は、たとえば代数的データ型や Tagless Final みたいなものもパターンのひとつとして、幅広いトピックを紹介しています。

こういったトピックをひとつひとつ丁寧に掘り下げている本は、自分は他に知りません。関数型プログラミングに興味があるなら、是非読んでみるとよいと思います。

現時点での目次を、以下にざっと並べておきます。

-----

1. 関数型プログラミング戦略
1.1. コードを考えるための三つのレベル
1.2. 関数型プログラミング
2. 代数的データ型
2.1. 代数的データ型の構築
2.2. Scala における代数的データ型
2.3. 構造的再帰
2.4. 構造的余再帰
2.5. 代数的データ型における代数
2.6. まとめ
3. 余データとしてのオブジェクト
3.1. データと余データ
3.2. Scala における余データ
3.3. 余データの構造的再帰と余再帰
3.4. データと余データの関係
3.5. データと余データの拡張性
3.6. 演習: さまざまな集合
3.7. まとめ
4. コンテキスト抽象化
4.1. コンテキスト抽象化のメカニズム
4.2. 型クラスの仕組み
4.3. 型クラスの合成
4.4. 型クラスとは何か
4.5. 演習: 表示ライブラリ
4.6. 型クラスと変位
4.7. まとめ
5. インタープリタ
5.1. 正規表現
5.2. インタープリタとレイフィケーション
5.3. 末尾再帰インタープリタ
5.4. まとめ
6. Cats を使う
6.1. クイックスタート
6.2. Cats を使う
6.3. 例題: Eq
7. モノイドと半群
7.1. モノイドの定義
7.2. 半群の定義
7.3. Cats におけるモノイド
7.4. モノイドの応用
7.5. まとめ
8. ファンクター
8.1. ファンクターの例
8.2. さまざまなファンクター
8.3. ファンクターの定義
8.4. 補足: 高カインド型と型コンストラクタ
8.5. Cats におけるファンクター
8.6. 反変ファンクターと非変ファンクター
8.7. Cats の Contravariant と Invariant
8.8. 補足: 部分的ユニフィケーション
8.9. まとめ
9. モナド
9.1. モナドとは何か
9.2. Cats におけるモナド
9.3. Identity モナド
9.4. Either
9.5. 補足: エラーハンドリングと MonadError
9.6. Eval モナド
9.7. Writer モナド
9.8. Reader モナド
9.9. State モナド
9.10. 独自のモナドを定義する
9.11. まとめ
10. モナド変換子
10.1. 演習: モナドの合成
10.2. 変換の例
10.3. Cats におけるモナド変換子
10.4. 演習: モナド戦士、トランスフォーム、出動！
10.5. まとめ
11. Semigroupal と Applicative
11.1. Semigroupal
11.2. apply 構文
11.3. さまざまな型に対する Semigroupal
11.4. Parallel
11.5. Apply と Applicative
11.6. まとめ
12. Foldable と Traverse
12.1. Foldable
12.2. Traverse
12.3. まとめ
13. インデックス付き型
13.1. ファントム型
13.2. インデックス付き余データ
13.3. インデックス付きデータ
13.4. まとめ
14. Tagless Final インタープリタ
14.1. 余データ的インタープリタ
14.2. Tagless Final インタープリタ
14.3. 代数的ユーザインターフェース
14.4. よりよいエンコーディング
14.5. まとめ
15. インタープリタとコンパイラの最適化
15.1. 代数的操作
15.2. 継続からスタックへ
15.3. コンパイラと仮想マシン
15.4. インタープリタからスタックマシンへ
15.5. まとめ
16. Creating Usable Code
17. ケーススタディ: 非同期処理のテスト
17.1. 型コンストラクタの抽象化
17.2. モナドの抽象化
17.3. まとめ
18. ケーススタディ: MapReduce
18.1. 並列化された map と fold
18.2. foldMap の実装
18.3. foldMap の並列化
18.4. まとめ
19. Case Study: Data Validation
19.1. Sketching the Library Structure
19.2. The Check Datatype
19.3. Basic Combinators
19.4. Transforming Data
19.5. Kleislis
19.6. Summary
20. Case Study: CRDTs
20.1. Eventual Consistency
20.2. The GCounter
20.3. Generalisation
20.4. Abstracting GCounter to a Type Class
20.5. Abstracting a Key Value Store
20.6. Summary
Geminiでカードを使う魔法少年を描いてみた。

# 概要

Geminiでカードを使う魔法少年を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
聖なるカードを使う魔法少年を描いてください。
```

![聖なるカードを使う魔法少年_20250526.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/f8d6aefe-fb14-46fd-a607-6d9b277938d6.png)

# まとめ

何かの役に立てばと。
[Python]Listの参照と別リストの生成

##  1. この記事のポイント(結論)
多次元リスト(内包のリスト)を生成するには少なくとも以下の2つの方法があるがそれぞれ挙動が異なるので注意しなければならない
```py:方法1
list_A = [[0]*2] * 2]
print(list_A)

# output >>> [[0, 0], [0, 0]]
```
```py:方法2
list_B = [[0]*2 for _ in range(2)]
print(list_B)

# output >>> [[0, 0], [0, 0]]
```
### ポイント
:::note info

方法1 -> 最初に作成した[[0]\*2]のリストを\*2回分参照している
方法2 -> 最初に作成した[[0]\*2]のリストと同じ内容の別のリストを作成している
:::

## 2. それぞれの挙動の違い

それぞれ要素の値を変更した際に違いが発生する
* 方法1 -> ある特定の要素に実行した変更が参照先にも反映さえる
* 方法2 -> ある特定の要素に実行した変更は他のリストの要素には反映されえない

```py:方法1
list_A = [[0]*2] * 2]
list_A[0][0] = 1
print(list_A)

# output >>> [[0, 1], [0, 1]]
```
```py:方法2
list_B = [[0]*2 for _ in range(2)]
list_B[0][0] = 1
print(list_B)

# output >>> [[0, 1], [0, 0]]
```

方法1では、リストの中に内包されている2つのリストの両方の[0][0]の要素が1に更新されている。
これはリスト生成の際の方法が元のリストを参照する形になっているため、内包されいている1つ目のリストにだけ変更を加えたと思っても、そのリストを参照している2つ目のリストにも影響が及んでいる

方法2では、内包されいてる1つ目のリストをベースに、完全に別物のリストをもう一つ作り2つ目の内包リストとして管理しているので、1つ目のリストへの変更はもう1つのリストに影響しない。

## 実行例スクリーンショット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019167/86a47de1-2cdf-4236-9e11-ff6289e53545.png)
不動点定理

[Lambda-Calculus and Combinators: An Introduction](https://amzn.to/4iYmQU3)
Hindley & Seldin より
不動点定理について記述する。

ラムダ計算とコンビネータ理論のすべての項$X$は、不動点を持つ。つまり、全ての$X$に対して、以下のような式を満たすような$P$が存在する。

$$XP\ =_{\beta,\omega}\ X$$

更に言うと、全ての項$X$に対し${\bf Y}X$が$X$の不動点となるようなコンビネータ${\bf Y}$が存在して、不動点を見つけることができる。

## 定理3.3（不動点定理）

ラムダ計算とコンビネータ理論の両方において、以下の式を満たすコンビネータ${\bf Y}$が存在する。
(a) ${\bf Y}x\ =_{\beta,\omega}\ x({\bf Y}x)$

実際、${\bf Y}$は、次のような強い条件を持っている。
(b) ${\bf Y}x\ \triangleright_{\beta,\omega}\ x({\bf Y}x)$

### 証明
1937年にアラン・チューリングによって発案されたコンビネータ${\bf Y}$は以下の通り：
$$U\equiv\lambda ux.x(uux)として、 {\bf Y}\equiv UU$$

これは(b)を満たす（ゆえに、(a)も満たす）。なぜなら、
${\bf Y}x
\equiv(\lambda ux.x(uux))Ux$
$\quad\equiv\quad(\lambda u.(\lambda x.x(uux)))Ux$
$\quad\triangleright_{\beta,\omega}\quad[U/u](\lambda x.x(uux))Ux$
$\quad\equiv\quad(\lambda x.x(UUx))x$
$\quad\triangleright_{\beta,\omega}\quad x(UUx)$
$\quad\equiv\quad x({\bf Y}x)$
家父長制帝国主義粉砕のためのフェミニスト統計学



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/34292ffa-fcc2-4261-abe0-00afd48c57a1.png)




**――『統計学基礎』と『統計学実践ワークブック』の批評的活用――**

### はじめに：なぜ統計学が「男性社会粉砕」の道具になるのか？

統計学と聞くと、「中立的」「客観的」「感情を排した数の学問」というイメージを抱く人が多いかもしれない。しかし、この中立性の仮面こそが、既存の制度や権力構造に無意識に加担する危険を孕んでいる。フェミニズムはしばしば「感情的」と揶揄されるが、実際には統計こそが、社会の不平等を可視化し、証拠に基づいた批判を可能にする最強の武器となりうる。

ここでは、日本統計学会による公式教材『統計学基礎（統計検定2級対応）』および『統計学実践ワークブック（統計検定1級対応）』を取り上げ、これらをフェミニズム的視点から読み直すことを試みる。

---

### 統計学基礎：制度を読み解くリテラシーの入門

『統計学基礎』は、平均、分散、母数の推定、仮説検定といった**基本的な統計的推論**の道具立てを紹介する初学者向けの教材である。一見すると技術的な内容だが、このテキストは「制度的な統計知識」への入口でもある。つまり、**国家・企業・教育機関などが社会をどう数値化し、正当化してきたか**を読み解く手がかりがここにある。

平均とは誰の平均か？
「有意差」とは何にとって有意なのか？
こうした問いを通じて、データがいかに「中立を装った権力の言語」になりうるかを批判的に学ぶことができる。

また、女性やマイノリティにとって統計リテラシーは、被調査者としての立場から脱し、**制度的数値を読み、問い直す主体**となるための「言語取得」とも言える。

---

### 実践ワークブック：エビデンスによる構造批判の技法

一方、『統計学実践ワークブック』は、回帰分析・多変量解析・主成分分析・時間系列といった**より応用的で実務的な統計手法**を扱っている。これらは単にビジネスのための分析技術ではない。**社会構造を分析する武器**でもある。

たとえば、

* **ジェンダーと賃金格差の回帰分析**
* **進学率と家計所得の相関**
* **性別・職業・出産歴などを変数に含むクラスタ分析**

こうした実践的分析は、従来の「感情的な主張」として退けられてきたフェミニストの語りを、**エビデンスベースの主張へと変換する**。

つまり、「粉砕」とは叫ぶことではない。**構造的な問題をデータで明示し、それに基づいて問いを立て、社会を再構築すること**なのである。

---
next.jsのroute.tsの制約

# ルール
特定のHTTPメソッド名（GET, POST, PUT, DELETEなど）の関数のみエクスポートできるという制約

# 関数切り分け
内部関数としてexportせず作成が可能

## 自分用タスク
どこに書いてあるのか探す。
しっかりチェックし、インプットする。
PostgreSQLデータ型サクッとまとめてみた

# PostgreSQL 型チートシート

---

## 数値型

| 型 | サイズ | 範囲 / 精度 | 主な用途 | 例 |
| --- | --- | --- | --- | --- |
| `smallint` | 2 byte | **-32,768 ～ 32,767** | 小さな整数 | `score SMALLINT` |
| `integer` (`int4`) | 4 byte | **-2,147,483,648 ～ 2,147,483,647** | 汎用整数（最も利用） | `age INTEGER` |
| `bigint` (`int8`) | 8 byte | **-9,223,372,036,854,775,808 ～ 9,223,372,036,854,775,807** | 非常に大きい整数 | `visits BIGINT` |
| `serial` / `bigserial` | 4 / 8 byte | 1 から上限値まで連番（`integer` / `bigint` と同じ範囲） | 自動連番（PK向け） | `id SERIAL PRIMARY KEY` |
| `real` (`float4`) | 4 byte | 約 **±3.4 × 10³⁸**（有効桁 ~6 桁） | 浮動小数（丸め誤差あり） | `temperature REAL` |
| `double precision` (`float8`) | 8 byte | 約 **±1.7 × 10³⁰⁸**（有効桁 ~15 桁） | 高精度浮動小数 | `distance DOUBLE PRECISION` |
| `numeric(p,s)` / `decimal(p,s)` | 可変 | **p = 精度（全桁数）**<br>**s = スケール（小数点以下桁数）**<br>例 `NUMERIC(10,2)` → 最大 10 桁のうち小数 2 桁 | 正確な数値計算（会計など） | `price NUMERIC(10,2)` |

> **備考**  
> - `serial` / `bigserial` は実体が `integer` / `bigint`＋シーケンス。通常は正の連番。  
> - 浮動小数 (`real` / `double precision`) は速いが誤差が出るため、金額など誤差 NG のケースでは `numeric` を推奨。  
> - `numeric` は `p` と `s` を省略すると “ほぼ無制限” だが、ストレージと計算コストが増えるので必要最小限の指定がおすすめ。
---
## 文字列型

| 型 | サイズ | 特徴 / 制約 | 例 |
| --- | --- | --- | --- |
| `char(n)` | **n byte + 1–4 byte** オーバヘッド | 固定長・不足分は空白で右詰め補完。`n` は **1 ～ 10⁷** まで指定可（実質 1 GB）。検索キーなど “常に桁数が決まっている” コード向け。 | `code CHAR(3)` |
| `varchar(n)` | 最大 **n byte + 1–4 byte** | 可変長・上限 **n** 文字。`n` > 10⁷ は指定不可。空き領域を節約しつつ入力長を制限したいときに。 | `username VARCHAR(50)` |
| `varchar` (制限なし) | 実質 **1 GB** まで | 内部的には `text` と同じ型。長文 OK だが “制限なし” を宣言する点に注意（バリデーションはアプリ側になる）。 | `note VARCHAR` |
| `text` | 実質 **1 GB** まで | 完全フリーサイズ。ブログ本文や JSON ストリング等、とにかく長い文字列を入れたいときの定番。 | `description TEXT` |

> PostgreSQL の文字長は **バイト数** ではなく **文字数（UTF-8 コードポイント）** で計算される点に注意。  
> 1～4 byte のオーバヘッドは内部 TOAST 圧縮や長さタグに使われる。
> オーバーヘッドはPostgreSQL が文字列を保存する際に使う追加バイト。

---

## 日付・時刻型

| 型 | サイズ | 格納範囲 | 主な用途 | 例 |
| --- | --- | --- | --- | --- |
| `date` | 4 byte | **4713 BC-01-01 ～ 5874897-12-31** | 年月日だけ。誕生日や請求日等 “日付だけ” に最適。 | `birthday DATE` |
| `time` | 8 byte | **00:00:00 ～ 23:59:59.999999** | 時刻のみ。タイムゾーン無し。 | `meeting_time TIME` |
| `timestamp` | 8 byte | **4713 BC-11-24 00:00:00 ～ 294276-12-31 23:59:59.999999** | 日付＋時刻（ローカルタイム）。 | `updated_at TIMESTAMP` |
| `timestamptz` | 8 byte | 同上（内部は UTC へ自動変換） | タイムゾーン付き。常に世界共通時刻で保存し、アプリ側でローカル表記。 | `created_at TIMESTAMPTZ` |

>  `timestamptz` で “tz” は **保存値にタイムゾーンを含む** というより “保存時に UTC 変換する” 意味。  
>  夏時間切替などのバグを避けるためにも **`timestamptz` 一択** が実務の鉄板。
>  4713 BC =紀元前4713年
UTCは「世界中で共通の時間基準」。UTC + 9時間が日本。

---

## 論理型

| 型 | サイズ | 値 | 例 |
| --- | --- | --- | --- |
| `boolean` | 1 byte | `TRUE` / `FALSE` / `NULL` | `is_active BOOLEAN` |

> `FALSE` を `0` などで代用する必要はなし。インデックスも張れる。


---

## 配列型

| 型例 | サイズ | 特徴 / 注意 | 使用例 |
| --- | --- | --- | --- |
| `int[]` | エントリ合計 + 24 byte〜 | 整数の配列。多次元も可（最大 6 次元 × 約 10⁹ 要素）。要素の追加・削除はクエリが複雑になりやすい。 | `scores INT[]`<br>`'{100, 92, 88}'` |
| `text[]` | 同上 | 文字列の配列。タグ・キーワードなど可変件数の文字列に便利。 |  |


> **設計TIP**：更新頻度が高い場合は正規化（別テーブル化）を検討。

---
POP3・SMTP認証設定 STARTTLS・SSL/TLS

# 基本設定
基本設定から本ページの設定を追加する。
基本設定（接続保護なし）の設定はこちら↓。
https://qiita.com/Linux_box/items/a612dde9853cb044119c

## Postfix
◆設定パラメータ
```bash:/etc/postfix/main.cf
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/certs/postfix.pem
# SMTP認証（AUTH）をTLS通信時のみに制限する。
smtpd_tls_auth_only = yes
```
◆補足：「smtpd_tls_auth_only」
メールクライアント（Thunderbirdなど）からのSMTP認証（SASL認証）に対してのみ適用される。外部のSMTPサーバからの通常のメール配送（= SMTP認証なし）には一切関係ない。


```bash:/etc/postfix/master.cf
# STARTTLS
submission inet n       -       n       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
# SSL/TLS
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
```

## Dovecot
◆設定パラメータ
```bash:/etc/dovecot/conf.d/10-ssl.conf
# SSLが必須（SSL/TLSを使わない接続は拒否）
ssl = required
ssl_cert = </etc/pki/tls/certs/postfix.pem
ssl_key = </etc/pki/tls/certs/postfix.pem
```

```bash:/etc/dovecot/conf.d/10-auth.conf 
# SSLを使っていない接続での平文認証を無効化。
disable_plaintext_auth = yes
```

```bash:/etc/dovecot/conf.d/10-master.conf
service imap-login {
  inet_listener imap {
    # STARTTLS
    port = 143
  }
  inet_listener imaps {
    # SSL/TLS
    port = 993
    ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    # STARTTLS
    port = 110
  }
  inet_listener pop3s {
    # SSL/TLS
    port = 995
    ssl = yes
  }
}
```

# 自己署名証明書を使う場合
自己署名証明書を設定したPostfix/Dovecotサーバに、ThunderbirdからSSL/TLS認証のIMAP, POP3, SMTP認証（SASL認証）はできない仕様。
Thunderbirdでアカウント登録時にサーバを見つけることができない。

ただし、↓の手順を実施すれば、自己署名証明書で動作させられる。
https://qiita.com/Linux_box/items/a78d14cbcb617616df82
競プロ日記#25/05/25

# 競技プログラミングの鉄則

[A37 - Travel 2](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_ak)
- 考察系という名の算数問題。このレベルであれば流石に解けるがもう少し複雑になってくるとなかなか厳しいかもしれない
- このような考察を主客転倒テクニックというらしい

```
int main() {
    long long N,M,B;
    cin >> N >> M >> B;
    long long totalA = 0;
    
    for (long long i = 0; i < N; i++) {
        long long A;
        cin >> A;
        totalA += A;
    }
    long long totalC = 0;
    for (long long i = 0; i < M; i++) {
        long long C;
        cin >> C;
        totalC += C;
    }

    long long totalB = N * M * B;
    long long ans = totalB + totalA * M + totalC * N;
    cout << ans << endl;
}
```

[A52 - Queue](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_az)
- Queueの実装。

[A62 - Depth First Search](https://atcoder.jp/contests/tessoku-book/tasks/math_and_algorithm_am)
- 深さ優先探索の典型例
- さすがに概念の理解だったので例題ということできちんと咀嚼しながら取り組んだ



# 余談だん
基本的にヒューリスティックの方は出る予定がないので鉄則本の7章は読むだけ読んでがっつり演習は後回しにしていたが今回のABC407で貪欲法チックなのが出たっぽいので今後は触れていきたい
アルゴ式でも貪欲法はやったが簡単な典型問題にしか適用できていないので
Open5GSのMacでのビルド方法

# これは何？
- 自分用メモ
- 2億年ぶりぐらいにQiitaの記事を更新する
- Open5GSのM1以降のMacでのビルド方法について
- 基本的には[Open5GSのOS X向けビルド方法](https://open5gs.org/open5gs/docs/platform/05-macosx-apple-silicon/)の通りでいいのだが、一部ビルドファイルを修正する必要がある
# 前提条件
- ハード：MacBook Pro(Apple M2 Max)
- OS：OS X(Sequoia 15.5)
# 問題
- [Open5GSのOS X向けビルド方法](https://open5gs.org/open5gs/docs/platform/05-macosx-apple-silicon/)の`git clone`のところまで進める
- installation processの`ninja install`ところで以下のような文言が無限ループ
```
Installing lib/core/libogscore.2.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/proto/libogsproto.2.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/dbi/libogsdbi.2.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/crypt/libogscrypt.2.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/ipfw/libogsipfw.2.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/tun/libogstun.2.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/app/libogsapp.2.dylib to /Users/〇〇/open5gs/install/lib
Installing subprojects/prometheus-client-c/libprom.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/metrics/libogsmetrics.2.dylib to /Users/〇〇/open5gs/install/lib
Installing lib/sctp/libogssctp.2.dylib to /Users/〇〇/open5gs/install/lib
Installing subprojects/freeDiameter/libfdproto/libfdproto.7.dylib to /Users/〇〇/open5gs/install/lib
Installing subprojects/freeDiameter/libfdcore/libfdcore.7.dylib to /Users/〇〇/open5gs/install/lib
Installing subprojects/freeDiameter/extensions/dbg_msg_dumps.fdx to /usr/lib/freeDiameter
Installation failed due to insufficient permissions.
Attempt to use /usr/bin/sudo to gain elevated privileges? [y/n] y
```
- ここで`sudo`つけて実行してもこのメッセージが無限に出てくる
# 原因
- Open5GSのsubprojectsとして入っているfreeDiameterが、`/usr/lib/`に書き込みをしようとしている
- OS X（特にBig Sur以降）では、**System Integrity Protection (SIP)** により `/usr/lib/` への書き込みは root でも制限される
- `sudo` を使っても `/usr/lib` のような **保護領域** にはインストールできない
# 解決策
- `ninja`のビルドファイル`meson.build`を書き換える
- `meson.build`は階層になっており、`freeDiameter`配下の`meson.build`に`'prefix=/usr'`という部分があるので、ここを`meson setup`時に指定した`--prefix`に書き換える
- おしまい
VS Codeで日本語を自動校正する（基本編）

まずはこちらをご覧ください。

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/ae39cdb6-87b7-42ea-8486-656f3bce9cfd.png)

このシリーズでは、このように日本語を自動校正できるVS Codeの拡張機能「カスタム日本語校正」の使い方を紹介します。

シリーズ初回の本記事は、基本的な使い方をお伝えします。
正規表現（textlint-rule-prh）や形態素解析の結果（textlint-rule-morpheme-match）を使った校正ルールの設定法は、第2回（未執筆、[prh参考](https://github.com/textlint-rule/textlint-rule-prh)、[morpheme-match参考](https://github.com/textlint-ja/textlint-rule-morpheme-match/tree/master)）をお読みください。

# インストール

VS Codeのマーケットプレースから無料でインストールできます。

https://marketplace.visualstudio.com/items?itemName=knttnk.custom-japanese-proofreading

VS Codeの拡張機能検索に、「カスタム」と入力すれば出てきます。

![VS Codeの拡張機能検索に「カスタム」と入力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/8d37a5b6-e9ab-4341-a03b-da8f355f090e.png)

# 設定

ここが一番骨の折れるところかと思います。
これでも簡単にした方なので頑張ってついてきてください。
将来楽をする為です。

デフォルトのままでも一応校正してくれますが、カスタムできるのがこの拡張機能の推しですから、ぜひ設定方法を理解しましょう。

`settings.json`という文字列を見て「？？」となってしまう方は、こちらの記事などをご覧になってください。

https://ar-aca.tech/posts/vscode-settings-json-example/

### textlintrcの設定

カスタム日本語校正は、基本的に[textlint](https://textlint.org/)という自然言語校正用のライブラリを使って日本語校正をします。

https://textlint.org/

その textlint の設定ファイルが、textlintrcです。

どこか好きなところに、`.textlintrc.json`という名前のテキストファイルを作成してください（本当は拡張子が`.json`であればなんでもいいですが、例として）。
これがtextlintの設定ファイルになる予定です。
おすすめの場所は、

1. 今執筆中のテキストがあるフォルダに`.vscode`というフォルダを作りその中に入れる（つまり、ワークスペースの`settings.json`と同じフォルダに入れる）
2. ホームディレクトリに何かフォルダを作り、その中に入れる

のどちらかです。

`.textlintrc.json`ファイルが作成できたら、それをVS Codeで以下の内容に編集してください。
```.textlintrc.json
{
  "filters": {
    "comments": true
  },
  "rules": {
    "prefer-tari-tari": true,
    "preset-japanese": {
      "sentence-length": {
        "max": 100
      }
    }
  }
}
```
`.textlintrc.json`は、つぎのような見た目になります。

![.textlintrc.json](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/bf778682-280c-402a-a34b-ca8f0975564f.png)

この`.textlintrc.json`ファイルでは、`comments`というフィルタ、`prefer-tari-tari`と`preset-japanese`というルールを使う設定をしています。
詳しい書き方やすべての設定は[公式の説明](https://github.com/knttnk/custom-japanese-proofreading/blob/main/example/all-rules.md)に譲ることとして、つぎは実際に使ってみましょう。

### `settings.json`の設定

[F1]（もしくは[Ctrl]+[Shift]+[P]）→`setting.json`と入力し、設定ファイルを開きます。
ユーザー設定でもワークスペース設定でも構いません。
![opening setting.json](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/a884e897-ad6e-4453-809d-3ec3ed064ef7.png)

`setting.json`に、以下の項目を追加します。

```jsonc:settings.json
{
    // 他の設定...
    "customJapaneseProofreading.textlintrcPaths": [
        "./.vscode/.textlintrc.json",  // 先ほど作ったファイルへのパスを入力
        // ":default:",   // デフォルトの設定を使うにはこの行をコメント解除
    ],
    // 他の設定...
}
```

設定名の上にマウスカーソルを置くとわかるように、複数のパスを設定できます。

![description settings.json](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/43c52828-d457-4d66-9ac1-5e8ae538e12c.png)

これで、とりあえずの設定は完了です！

# 校正してみる

VS Codeで、テキストファイル（Markdown、HTML、$\LaTeX$、Re:VIEWでも可）を開くだけです。
編集したら、保存したタイミングでチェックされます。

![校正できた！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/678aace2-038a-4ab6-b3d7-e3a2fbcd5e28.png)


# あとがき

論文や発表資料を$\LaTeX$で書く機会が結構あるんですが、学会によってスタイルガイドが違い、それに沿って書いたりチェックしたりする作業が大変で大変で。
少しでも楽になるといいな。
関数電卓の選び方（n進計算編）

## 使用できるn進数
| 機種 | 2進数 | 5進数 | 8進数 | 16進数 |専用モード|切り替えキー |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| カシオCW | ○ | × | ○ | ○ |○|[FORMAT]（めくり） |
| カシオEX | ○ | × | ○ | ○ |○| 関数キー |
| カシオES | ○ | × | ○ | ○ |○| 関数キー |
| キヤノン複数行 | ○ | × | ○ | ○ |○| 関数キー |
| シャープ複数行 | ○ | ○ | ○ | ○ |×|[2ndF]テンキー |
| 1行 | ○ | × | ○ | ○ |×| [2ndF]テンキー |

- シャープ複数行機・1行機はn進計算専用モードがない。10進数を選ぶと通常の計算モードに戻る。
- 国内1行機はシャープEL-501T/501J、キヤノンF-605G、モノタロウ。
カシオ1行機（海外モデルのみ）はn進計算非対応。
- 国内2行機（カシオ・キヤノン）はn進計算非対応。
国内購入可能な991MSクローンはn進計算が可能（16進数が8桁、論理演算キーがメニュー）。
シャープ2行機（海外モデルのみ）はn進計算が可能（シャープ複数行機と同等）。

## 使用可能な桁数
| 機種 | 2進数 | 5進数 | 8進数 | 16進数 | 備考 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| カシオCW | 32 | × | (11) | 8 | 8進数最上位は3まで |
| カシオEX | 32 | × | (11) | 8 | 8進数最上位は3まで |
| カシオES | 16 | × | (11) | 8 | 8進数最上位は3まで |
| キヤノン複数行 | 32 | × | (11) | 8 | 8進数最上位は3まで、2進数は最大4画面に分けて表示|
| シャープ複数行 | 10 | 10 | 10 | (10) | 16進数は10進数換算で±9999999999の範囲 |
| 1行 | 10 | × | 10 | (10) | 16進数は10進数換算で±9999999999の範囲 |

## 論理演算
| 機種 | 論理演算 | 論理演算キー | 備考 |
|:-:|:-:|:-:|:-:|
| カシオCW | Neg, Not, and, or, xor, xnor | [CATALOG]メニュー ||
| カシオEX | Neg, Not, and, or, xor, xnor | [OPTN]メニュー ||
| カシオES | and, or, xor, xnor, Not, Neg | [SHIFT][3]（BASE）メニュー ||
| キヤノン複数行 | and, or, xor, xnor, Not, Neg | [Apps]メニュー ||
| シャープ複数行 | NEG, NOT, AND, OR, XOR, XNOR | 関数キー | 10進数は論理演算不可 |
| 1行 | × | × |  |

## 選択のポイント
- 5進数に対応しているのはシャープ複数行機のみ。
- シャープ複数行機と1行機は各進数とも10桁の範囲（16進数は一部のみ）。
2・8進数はカシオ・キヤノン複数行機より桁数が少なく、16進数はカシオ・キヤノン複数行機より桁数を多く取れる。
- 2進数に関してはClassWizとキヤノン複数行機が32桁対応。
中でもClassWizは1画面で全ての桁を表示可能。
- ClassWiz CWは進数切り替えがめくり方式なので使いづらい。
- シャープ複数行機は論理演算6関数がそれぞれキーに割り当てられている。
ただし、10進数での論理演算はできない。
自分のために、Myサイトを作る・発信する・考える をやっていく発信

## 経歴
非情報系の大学を卒業して、システムエンジニアとして就職しました。
これまでシステムの導入、開発、運用といった一通りの工程に関わってきました。

中でもSalesforceは長く関わっていて、構築・開発は一通りできるようになりました。
一度転職してからは、Salesforceに加えてMA（マーケティングオートメーション）の導入やAWSでの構築にも関わる機会が増え、扱える技術の幅が少し広がりました。

## サイトを作ろうと思ったきっかけ
仕事をやっていく中で、「プロジェクトが成功した！」みたいな成果よりも、
「調べてわかった」「効率のいい処理に気づいた」といった、小さな発見の方が楽しいと感じるようになってきました。

Salesforceは長年使ってきたので、バックエンド寄りの知識はもちろん、ユーザー画面の開発などフロント寄りの知識もある程度は身についています。
ただSalesforceは、外部に公開するようなWebサイトは作れないんですよね。

そんな中、AWSに触れるようになって、ある程度の自由度があるWebサイトが高速に作れることもわかってきました。AWSは大変難しく、いまだに全てを理解してるわけではないですが、ある程度は勝手がわかってきた感覚があります。

## このサイトでやりたいこと
こうした経験や気づきを踏まえて、「やりたいこと」と「実現できる土台」が揃ってきたと感じました。
- 調べて解決するのが好き
- Webサイトを作れる
- CRMなど業務系の知識もある

じゃあ何ができるかと考えて、__「調査してほしい」「分析してほしい」みたいな依頼を個人で受け付けるサイトを作る__ というアイデアに至りました。

仕事だとどうしてもプロジェクト単位で時間も長くなるし、スケジュール管理などの業務の増えてきます。
でも、個人で受けるような規模感なら、もっと短いスパンで「調べる」→「わかる」ことができるかもしれない。また何かで詰まっている人にとっては、個人でも気軽に頼れる場所になるかもしれない、というイメージです。

## サイトに必要なもの（予定）
まだ作ってる最中ですが、以下のような要件を想定しています：
- 自分の経歴やスキルがわかるページ（依頼の参考にしてもらうため）
- 依頼できる内容の説明
- 質問フォームやコメント機能（匿名可・公開返信）
- メールでやりとりを行うためのフォーム
- 実績紹介（依頼が来るようになってから）
- 金額に関しては、実際にニーズが出てきたら設定を検討

## なぜQiitaに書いたか？
正直に言えば、__宣伝も兼ねてます__。
調査・分析系の依頼を受けるなら、ある程度アクセスのあるサイトである必要があります。

Qiitaは技術に興味ある人も多く交流も活発なので、このようなサイトに興味を持ってくれる可能性が高いと考えました。また記事を通して、調査するというだけでなく発信する立場の感覚も身につけていければと考えています。

## 最後に
今回は「なぜ個人サイトを作ろうと思ったか」という経緯だけをまとめました。
構成や技術、その選定理由については、別記事で整理していく予定です。
Vue3のCDNのURLについて

## Vue.jsの学習１

今回から新しくVue.jsの学習を始めたためいつまで続くかわかりませんが学習記録として、少しの気づきを残したいと思います。

### Vue.jsのバージョン
今回はVue3のほうでの学習をしております。

```
<!DOCTYPE html>
<html>
<head>
    <title>My first Vue app</title>
    <script src="https://unpkg.com/vue"></script>
</head>
<body>
    <h1>Vue3</h1>
    <div id="app">
        {{ message }}
    </div>

    <script>
        const appdata = {
            data() {
                return {
                    message: 'Hello Vue!'
                }
            }
        }
        Vue.createApp(appdata).mount('#app')
    </script>
</body>
</html>

```
現在このようなコードを書いております。
今回の気づきとしては、Vue.jsのVue3がしっかり世間的に定着したことで、CDN(Content Delivery Network)といわれるライブラリみたいなものを呼び出すURLが変わったということでした

こちらもとは
```
<script src="https://unpkg.com/vue@next"></script>
```
でしたが、現在は、
```
<script src="https://unpkg.com/vue"></script>
```
となっているようです。
丁度本によってはまだnextのほうのURLを記載している所もあると思うの、動かない理由がわからず苦戦するかもだったのでこちらに記載しました。
（今はAIに聞いたりして解決するか……）

一旦本日は以上！
まだまだ初心者コーダーなのでこれからもがんばっていきます！
手順書の書き方

# 読者対象
- 手順書を書き始めたいけどどんなことを書いていいかわからない人
- 手順書をどういう風に使えばいいかわからない人
# 手順書を作る意味
そもそも手順書を作る意味とは何でしょうか？
例えばDNSサーバを本番環境で必要になるとします。
その時に手順書がなかったらどうなるか想像してみてください。

- 作業の進行が遅れる。
- 正常に設定したつもりでも本番で障害になる。
- そもそも設定ができない。

のようなことが起きます。

# 手順書を作るときに気を付けること
　手順書を作るうえで気を付けるべきことは、誰が手順書通りに操作をしても同じ結果になるようにすることです。
つまり、人の知識量に依存する手順書を作ってはいけません。
しかし、すべての手順書において人の知識量に依存してはいけないわけではないです。
　例えば、**一般ユーザー向けパソコンの初期セットアップ説明書**に専門知識を入れてはいけません。
しかし、**手順書を使う人が社内の人**など限定的な場合は読者のスキルを掲載したうえで専門知識を交えながら手順書を作成していきます。

**サーバ構築手順書**について話すと、サーバの設定手順にコマンドを使用することが予想されます。
つまり、**コピー＆ペースト**が適切にできる手順書を要求されます。
# なぜ、コピー&ペーストにこだわるのか
　手順書に求められることは**誰が手順書通りに操作しても同じ結果になるようにすること**です。
 **手順書を見てもコマンドを手打ちしてその結果設定の値が変わってしまった**という状況は手順書においてありえないことだと思います。
 このようなことがないように極力コピー＆ペーストを使い、設定を行っていきます。
 # 手順書の工夫
 　ただコマンドが書かれた手順書というものは、時にどこからどこまでコピー＆ペーストしていいのかわからない時があります。このようなことを避ける工夫が必要です。
特にPDFで手順書を扱う場合には注意が必要です。
以下の場合を見比べてみてください

**工夫してない場合**
- インターフェース名 <span style="color:red;">ens100</span>に<span style="color:red;">192.168.10.1/24</span>を主導で設定し、インターフェースを再起動します。
sudo nmcli connection modify ens100 ipv4.address 192.168.10.1/24
sudo nmcli connection modify ens100 ipv4.method manual
sudo nmcli connection down ens100; sudo nmcli connection up ens100

**工夫した場合**
- インターフェース名 <span style="color:red;">ens100</span>に<span style="color:red;">192.168.10.1/24</span>を主導で設定し、インターフェースを再起動します。
######################################
sudo nmcli connection modify ens100 ipv4.address 192.168.10.1/24
sudo nmcli connection modify ens100 ipv4.method manual
sudo nmcli connection down ens100; sudo nmcli connection up ens100
######################################

私はこのようにLinuxに入れる設定には#を入れます。

# なぜコマンドの前後に#を入れるのか
　まず、Linuxにおいて#というのはコメントアウトする文字列になります。
つまり、#を入れても設定に影響が出ません。
そして、#を入れる一番の利点が**PDFの手順書として圧倒的に扱いやすいから**です。
PDFにおいてこのような経験はありませんか？
- **最初からコピー&ペーストしたいのに最初の文字が範囲に入らない**

これは**手順書として欠陥**だと思っています。
この問題を解決するために、#を入れるようになりました。
#の最初からじゃなくても上段の#の途中から下段の#まで範囲選択を行うと、必然的に中の文章はすべて範囲の選択に入ります。
つまり、最初の文字が選択範囲に入らないの問題は解決し、コピー＆ペーストのミスは圧倒的に減ると考えています。

Windowsのコマンドプロンプトでは、# と；が使えます。
５＊５のスライドパズルをJavaScriptで作ってみた


# 一応５＊５のパズルも作ってみた。


## 背景
前回作った４＊４の正式名称良く分からないパズルですが、ちょっと定義変更すれば良いので、サイズを拡張してみました。
特に情報の新規性はない、やってみた系の記事です。
環境によってはスクリプテッドAIはHARDを240秒くらいで解いてくれます。
勝てそうですかね？

＜スクリプテッドAIの端末別HARD挑戦記録＞
| CPU | ブラウザ | 所要時間 |
|:----------|:-----|:------|
| Kirin 659(p20lite) | chrome | 908秒 |
| Kirin 960(honor9) | chrome | 720秒 |
| Snapdragon 820(XperiaXZ) | chrome | 676秒 |
| Kirin 950(honor8) | chrome | 639秒 |
| Kirin 710(mediapadm5lite) | chrome | 536秒 |
| Snapdragon 845(Pixel 3) | chrome | 460秒 |
| A4-9120C(Chromebook 300e 2G) | chrome | 452秒 |
| Snapdragon 695 5G(Xperia10IV) | chrome | 386秒 |
| Core m3 8100Y(win10) | chrome | 375秒 |
| Core i5-4250U(macbookair2013) | safari | 375秒 |
| Snapdragon 720G(Rakuten Hand) | chrome | 367秒 |
| Core i5-4300U(win10) | chrome | 345秒 |
| A10(iPad7gen) | safari | 330秒 |
| A10 5800K(win10) | chrome | 307秒 |
| Xeon X3460(win10) | chrome | 284秒 |
| Xeon E3-1270v3(win10) | chrome | 250秒 |
| Core i7-8700b(macmini2018) | safari | 248秒 |
| Core i7-3770(imac2012) | safari | 246秒 |
| A13(iPhoneSE2) | chrome | 238秒 |
| A13(iPhoneSE2) | safari | 238秒 |

#iPhone7、iPhone8、LenovoTBX505F　：　メモリ不足で完走不可。
imac2012、かなり古い端末なのに大健闘。
相変わらずiPhoneが強い。

---

# デモ

https://kubo-4ka.github.io/slide-puzzle-size-5

# ソース

https://github.com/kubo-4ka/slide-puzzle-size-5

# 前回記事

https://qiita.com/kubo4ka/items/58c7b71d415fe47c916c

https://qiita.com/kubo4ka/items/980681d1abcd982de988

https://qiita.com/kubo4ka/items/8e68d9c6c76fef03958e

https://qiita.com/kubo4ka/items/3f38a5fbf8e9755d54d5

---
CSRF攻撃

## CSRF攻撃とは？

**CSRF（クロスサイト・リクエスト・フォージェリ）** は、Webサイトに対してユーザーが意図しない操作を強制的に実行させる攻撃手法のひとつです。
「フォージェリ」（forgery）とは「偽装」の意味。

たとえば、あなたがログイン中の銀行サイトがあるとします。もしあなたが悪意あるサイトを閲覧している間に、そのサイトが密かに銀行サイトへの送金リクエストを送信すると、あなた自身の操作と見なされ、意図しない送金が成立してしまう可能性があります。

2021年のOWASP TOP10では「アクセス制御の不備」に含まれていて5位に位置しています。
https://owasp.org/Top10/ja/A01_2021-Broken_Access_Control/

## CSRF攻撃の仕組み

1. ユーザーが正規のサイトにログインします。
2. ユーザーが悪意あるサイトを訪問します。
3. 悪意あるサイトが、正規のサイトへのリクエスト（例：送金、パスワード変更）をユーザーのブラウザ経由で送信します。
4. ユーザーがログイン状態にあるため、正規のサイト側ではユーザー自身のリクエストだと判断し、リクエストを実行します。

## 具体的な攻撃例

* SNSでログイン中に、勝手に投稿が行われる
* オンラインショップで意図しない注文がされる
* 銀行サイトで勝手に送金される

## 対策方法

CSRF攻撃を防ぐために、以下の方法が一般的です。

1. **CSRFトークンの利用**

   * リクエストごとにランダムな文字列（トークン）を生成し、フォーム送信時に確認する方法です。
   大抵のフレームワークで対策可能もしくはデフォルトで入っていることもあるので確認しましょう。

2. **SameSite属性付きCookieの設定**

   * ブラウザが第三者サイトからのリクエストを防止します。
SameSite属性は主にLaxとStrictがあります。Strictは安全性が高いですが、リンクやメールなどの外部サイトから遷移すると最初はCookieが送信されないため、場合によってはエラーになることがあります。
Noneを設定する場合は、Secure属性（HTTPS通信必須）も同時に設定する必要があります。
基本的には技術的な懸念がない限りSameSiteはLax、Secure属性もつけておくべきです。
古いブラウザや一部の環境では対応していない場合があるため、注意が必要です。

https://caniuse.com/?search=samesite

3. **Refererヘッダーの検証**

   * リクエスト元サイトをチェックし、信頼できるドメインからのリクエストのみ許可します。

##### 追記

この記事はAIで添削しています。

##### 参考
https://www.ipa.go.jp/security/vuln/websecurity/csrf.html

https://owasp.org/Top10/ja/A01_2021-Broken_Access_Control/
type-challenges解いてみた 初級 533 Concat


# 問題

````md

JavaScript の`Array.concat`関数を型システムに実装します。この型は 2 つの引数を受け取り、受け取ったイテレータの要素を順に含む新しい配列を返します。

例えば：

```ts
type Result = Concat<[1], [2]>; // expected to be [1, 2]
```

````



## 回答

```ts
type Concat<T extends readonly any[], U extends readonly any[]> = [...T, ...U]
```

### ちょっと解説

#### `readonly any[]`
`readonly`をつけておくことでミュータブル/イミュータブル両方の配列を受け取れます。
例えば...

- [1, 2, 3] / readonly [1, 2, 3]

などの組み合わせをすべて許可できます。
【Mac】dittoコマンドの使い方


`ditto`コマンドを使用するとファイルやディレクトリをコピーできます。

 https://keith.github.io/xcode-man-pages/ditto.1.html

## コピー先ディレクトリの内容をコピー元ディレクトリの内容で上書き

```terminal
ditto path/to/source_directory path/to/destination_directory
```

## コピーされる各ファイルごとにターミナルウィンドウに1行出力

```terminal
ditto -V path/to/source_directory path/to/destination_directory
```

## 元のファイルパーミッションを保持したままファイルまたはディレクトリをコピー

```terminal
ditto -rsrc path/to/source_directory path/to/destination_directory
```
分割トラックボール自作キーボード作成の記録（キー配置・センサー回路作成編）

## はじめに

自作キーボードに出会いKeyball44を仕事用・Keyball61を自宅用で使用していて特に不満はないが、最近仕事で外出することが増え、外出先で使用するキーボードが欲しくなった。
この際自分が考えた最強キーボードを設計してみようと思う。

## 構想
持ち運びキーボードなので下記の要素がほしい

1. 無線接続（Seeed XIAO BLE nRF52840を使用）
2. 狭ピッチ（17mm）
3. トラックボール
4. ガスケットマウント

この条件をほとんど満たしているmoNa2というキーボードがある。

https://booth.pm/ja/items/6376654

ただ今回は自分で設計してみたいのとガスケットマウントのキーボードを作成してみたいのでこのまま進めていく。

## 3Dモデル設計

まずはキー配列を作成していく。

https://www.keyboard-layout-editor.com/

プリセットが用意されているのでErgoDoxを選択するとカラムスタッガードの配列が作りやすい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/3b15750e-d829-44bd-aa6a-8cd3ff92e6b1.png)


一旦この形で決定（NとBの横にキーを追加するかは後で決める）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/cc0f6c5e-10d9-4feb-a482-b06e71a88ca0.png)

そうしたらRow dataの内容からDXFを作成する。
自分はAI03 PLATE GENERATORを使用した。

https://kbplate.ai03.com/

作成したDXFをFusion360にインポートしてトッププレートを作成していく。

最終的にはこうなった。（やっぱりNとBの横にキーを追加した）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/1e2bf7ea-d2c4-4ffa-ad26-4ca8178984b4.png)

形を確認するため3Dプリンターで印刷してみる。
ついでにキースイッチとキーキャップをつけてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/ec6dc1ab-6fde-493c-824d-66d4ae3a71b6.png)

キー配置は問題なさそうなので、次はトラックボールケースを作成する。

何度も試行錯誤して最終的にはこうなった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/6f22c8db-040c-4a34-bcd2-eae1263ca6f8.png)
※独学でCADを触っているが滑らかな形状は作成が難しい…

くっつけたらこうなった。
![IMG_20250525_230053.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/c4e08eba-3a59-4ad0-a735-56952c6c7edd.jpeg)

キーとギリギリ干渉していない、かつ操作感も問題ないためこのまま進める。

## トラックボールセンサーPCB作成

KeyballではPMW3360が使用されているが消費電力が大きので無線キーボードではPMW3610が使用されている。
はじめてPCB設計を行っていくので操作が簡単そうなEasyEDAを使用してトラックボールセンサーのPCBを作っていく。

PMW3610のデータシートにApplication circuits（回路例？）があるので参考にしようとしたがAA Battery（単三電池）の回路が載っているのでPMW3360の回路を参考にして電源周りの回路を作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/fb7c059e-29a4-40c8-97bb-87c9327543a8.png)
※今気づいたがだいぶPMW3360の回路に寄ってる…

PCB上にパーツを並べるとこうなった。
EasyEDAはAutoRouteで配線までしてくれるので初心者でもなんとかPCBを作成できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/6444d8d5-b198-45eb-a952-11f75292592b.png)

あとはJLCPCBでPCBを作成して完成。
はんだ付けして動作確認してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097244/73f1c087-0feb-4529-b2e8-49bfa77fd11b.png)

moNa2のファームウェアを一旦借りてトラックボールだけ動かしてみる。

https://github.com/sayu-hub/zmk-config-moNa2

無事動作したので一旦今回はここまで。

## 最後に

ここまで作るのに4ヶ月程かかりました。
（PCBの設計が24年12月で実際の動作確認が25年4月）
だいぶ時間がかかったが動くものができるとやる気が出てくる。

次回はキーボード側のPCB設計を行っていく。
🧠リサーチの相棒はAI！NotebookLMで情報整理＆思考がはかどる10の活用術

## 🚀 はじめに

「大量のPDF、結局どこに何が書いてあったか覚えてない…」  
「論文読んだけど、あとで使おうとしたら迷子」

──そんな“情報過多時代のあるある”に、GoogleがAIの力で挑んでいます。

それが **NotebookLM（ノートブック・エルエム）** というリサーチ支援AI。  
自分の持っているドキュメントを読み込ませると、**要約・引用・質問対応・マインドマップ**まで全部やってくれるという、もはや“脳の外付けHDD”的な存在です。

今回はそんなNotebookLMを、実際にどう使えば便利なのか？  
**エンジニア・学生・リサーチャーに向けて、10の活用Tips**をまとめました！

---

## 🧩 NotebookLMってなに？

NotebookLMは、GoogleのGeminiをベースにした「**資料特化型チャットAI**」です。  
ざっくり言うと、以下のようなことができます：

| 機能 | できること |
|------|------------|
| 資料要約 | 長いPDFやWeb記事を瞬時に要約してくれる |
| 質疑応答 | 「この資料で〇〇ってどう説明してる？」に即答 |
| 出典表示 | 回答の根拠を明示してくれるので信頼性あり |
| 多様な形式 | PDF / Google Docs / YouTube / mp3音声まで対応 |
| マインドマップ | 情報の構造化・視覚化も可能✨ |

👀 実際の画面イメージはこちら：

![NotebookLMの概要イラスト](https://tse2.mm.bing.net/th?id=OIP.JjLgAnXb6fYrAwCzx_WdfQHaE8&pid=Api)

---

## 🧰 NotebookLM 活用術10選（実践Tips）

### ① 資料の「要点まとめ」を一発生成

📄 PDFやスライド資料を放り込んで「要点を5行で教えて」と聞くだけでOK。

```text
Q. このプレゼン資料の要点を5つにまとめて
A. 
1. 新機能は2025年6月にリリース予定
2. セキュリティ強化が最大の変更点
…
```

---

### ② コードの解説もできる

コード付きドキュメントを読み込ませて、Geminiに説明してもらうのも◎

```text
Q. このコードの処理の流れを教えて
→ 各関数の役割を順番に説明してくれる！
```

---

### ③ Web記事やYouTubeも「資料化」可能

📰 Web URLを貼れば記事を要約。  
🎥 YouTubeのURLを貼れば、字幕をもとに「議事録化」もできちゃいます。

---

### ④ Chatの回答に「引用元」がつく安心感

「この回答、どこに書いてあったの？」と思ったら、引用番号をクリックで即確認👇

![引用表示例](https://tse1.mm.bing.net/th?id=OIP.ZFyfw_kCUfvNNrPGlUCdKAHaE5&pid=Api)

---

### ⑤ 複数資料を横断して質問できる

📚 論文＋ブログ＋公式リリースなど、複数の資料をまとめて読み込ませて、

>「この機能の意義を3つの資料をまたいで比較して教えて」

みたいな無茶振りも可能！

---

### ⑥ 学習ノートとして「メモ保存」機能が神

回答の中から「これメモっときたいな」と思ったら「メモに保存」をクリック。

🗒️ 自分だけの学習ノートが右側にどんどん蓄積されていきます。

---

### ⑦ 複雑なテーマは「マインドマップ」で整理

難しいテーマも、情報を構造化すると理解しやすい！👇

![マインドマップ機能](https://tse2.mm.bing.net/th?id=OIP.XGakRXZYR9Rgt5TOOTpU8wHaEF&pid=Api)

---

### ⑧ 音声で“議論風”要約を聞くことも可能（英語）

英語資料なら、Geminiが「ラジオ番組風」に解説してくれる音声再生も！

🎙️ Geminiたちがナレーション付きで対話を展開してくれます。

---

### ⑨ 研究メモ、提案資料、就活対策にも応用可能

| 利用シーン | 使い方 |
|------------|--------|
| 就活 | 企業HP+IR資料を読み込んで志望動機を自動生成 |
| 提案書 | 競合サイトの資料をベースに差別化アイデアを出す |
| 授業ノート | 教科書PDFを読み込ませて要点メモを作成 |

---

### ⑩ 日本語対応＆無料！

今は英語がメインですが、**日本語資料にも対応**しています。  
無料で使えるので、とにかく試してみて損なし！

👉 [NotebookLMはこちらから](https://notebooklm.google.com/)

---

## 📝 まとめ

| カテゴリ | 活用術 |
|----------|--------|
| 情報整理 | 要約・マインドマップ・引用元付きQ&A |
| 学習補助 | メモ保存・音声要約・資料横断 |
| 実務応用 | 資料作成・提案・リサーチ |

---

## 🧠 さいごに

NotebookLMは、単なるAIチャットではなく、**「自分だけのリサーチパートナー」**という感じ。  
PDF地獄や情報迷子から脱出するための、強力なツールです。

この記事が参考になった方は、ぜひ「LGTM」や「あなたの活用法」もコメントで教えてください！
【初心者向け】Processingの基本描画関数まとめ【ビジュアルプログラミング】

# 【初心者向け】Processingの基本描画関数まとめ【ビジュアルプログラミング】

Processingは、ビジュアルアートやインタラクティブな作品制作に強いプログラミング環境です。この記事では、**初心者が押さえておきたい基本の描画関数**を一覧で紹介します。

---

## 🖌️ 塗りと線の設定（再掲・補完あり）

| 関数 | 説明 |
|------|------|
| `fill(r, g, b)` | 図形の塗りの色を設定します。 |
| `stroke(r, g, b)` | 線の色を設定します。 |
| `strokeWeight(weight)` | 線の太さを設定します。 |
| `noFill()` | 塗りを無効にします。 |
| `noStroke()` | 線を無効にします。 |

---

## 🟦 図形の描画関数一覧（詳細バージョン）

| 関数 | 説明 |
|------|------|
| `line(x1, y1, x2, y2)` | 指定した2点を結ぶ線を描画します。 |
| `rect(x, y, width, height)` | 四角形を描画します。左上座標と幅・高さを指定。 |
| `ellipse(x, y, width, height)` | 楕円を描画します。円の場合はwidthとheightを同じに。 |
| `triangle(x1, y1, x2, y2, x3, y3)` | 三角形を3つの頂点座標で描きます。 |
| `arc(x, y, w, h, start, stop)` | 弧を描きます。角度はラジアンで指定します（例：`PI`, `TWO_PI`）。 |

---

## 📏 キャンバスの初期設定（再掲・補完あり）

| 関数 | 説明 |
|------|------|
| `size(width, height)` | キャンバスのサイズを設定します。`setup()`内で使用。 |
| `background(value)` | 背景を塗りつぶします。グレー(0〜255)またはRGB値を指定。 |

---

## 💡 弧（arc）の補足

ラジアン値の例：

| 定数 | 意味 |
|------|------|
| `PI` | 半円（180度） |
| `TWO_PI` | 一周（360度） |
| `HALF_PI` | 1/4周（90度） |

---
Pandasで欠損値処理！fillnaとdropnaの使い分けと実例

データ分析をしていると必ず出会う「欠損値（NaN）」。Pandasには、欠損値を効率的に処理するためのメソッド `fillna()` や `dropna()` が用意されています。

## 欠損値とは？

欠損値（NaN: Not a Number）は「データが存在しない状態」を表します。  
例：アンケートの未記入、センサーの異常値など。


## 例

```python
import pandas as pd
import numpy as np

# サンプルデータ（欠損値含む）
data = {
    '氏名': ['佐藤', '田中', '鈴木', '高橋'],
    '年齢': [28, np.nan, 35, 32],
    '出身地': ['東京', '大阪', np.nan, '名古屋']
}

df = pd.DataFrame(data)

print("▼ 元のデータ")
print(df)
````

出力：

```
▼ 元のデータ
   氏名    年齢  出身地
0  佐藤  28.0   東京
1  田中   NaN   大阪
2  鈴木  35.0  NaN
3  高橋  32.0  名古屋
```

---

## `dropna()`：欠損値を含む行や列を削除する

### 行単位で削除（デフォルト）

```python
df.dropna()
```

```
     氏名    年齢   出身地
0   佐藤  28.0   東京
3   高橋  32.0  名古屋
```

### 列単位で削除

```python
df.dropna(axis=1)
```


```
	氏名
0	佐藤
1	田中
2	鈴木
3	高橋
```

### 特定の列だけを条件に削除

```python
df.dropna(subset=['年齢'])
```

```

    氏名	年齢	出身地
0	佐藤	28.0	東京
2	鈴木	35.0	NaN
3	高橋	32.0	名古屋
```

## `fillna()`：欠損値を補完する

### 固定値で埋める

```python
df.fillna({'年齢': 30, '出身地': '不明'})
```

```
     氏名   年齢  出身地
0   佐藤  28.0   東京
1   田中  30.0   大阪
2   鈴木  35.0   不明
3   高橋  32.0  名古屋
```

### 平均値で埋める（年齢列）

```python
df['年齢'] = df['年齢'].fillna(df['年齢'].mean())
print(df)
```

```
   氏名         年齢  出身地
0  佐藤  28.000000   東京
1  田中  31.666667   大阪
2  鈴木  35.000000  NaN
3  高橋  32.000000  名古屋
```

## 欠損の有無を確認する

```python
df.isnull()        # True/Falseで欠損の有無を表示
df.isnull().sum()  # 各列の欠損数
df[df['年齢'].isnull()]  # 特定列の欠損行を抽出
```

### 欠損率を確認

```python
df.isnull().mean() * 100
```

```
        0
氏名	0.0
年齢	25.0
出身地	25.0

dtype: float64
```

## まとめ

* `dropna()`で欠損行や列を削除できる
* `fillna()`で柔軟に補完できる（固定値・平均・前後など）
* 欠損率のチェックや可視化と組み合わせるとさらに効果的
AArch64のスタックポインタは16アラインしないといけないみたい

筆者はTermuxでなんかを趣味としてやってる町工場の者である。

筆者はTermuxで、libc相当であるBionicのパッケージlibandroid-supportをインストールしてない状況下で、Zigコンパイラ(0.1も0.14も試した)がllegal InstructionとかBad System Callされるなと思いながらコンパイラ作ればよいじゃんとか思い9ccしようと。

筆者はAArch64で遊ぶに至る。

## 筆者の知識
AArch64の呼び出し規約、各命令ある程度とか、ある程度のシステムコール番号とか。

番地が一つ違ったら1バイト分のデータが入るんじゃね。こういう認識。

あと関数っぽいやつをやるにあたり関数が関数を呼び出す場合はfpとlrをいじる必要がある的な。アホみたいに暗記なう。

## 環境
```
$ as --version; ld --version
GNU assembler (GNU Binutils) 2.44
Copyright (C) 2025 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.                                This program has absolutely no warranty.                                          This assembler was configured for a target of `aarch64-linux-android'.
GNU ld (GNU Binutils) 2.44
Copyright (C) 2025 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
```

## ストアしてみる
次の、スタックポインタをアラインしてないところに格納してるアセンブリプログラムを作った。

```text:00.s
.globl _start
_start:
mov w1,9
str w1,[sp,-7]!
mov x0,sp
mov x8,93
svc 0
```

32ビット整数を適当すぎるところに格納し、その後のスタックポインタを終了コードとするプログラム。

アセンブルしてリンクし、数回実行。

```
$ as -o 00.o 00.s
$ ld -o 00 00.o
$ ./00
57
$ ./00
233
$ ./00
121
$
```

このように、16を法としたら9に合同な値のみが得られた。

## ストアする
次に、筆者は次のソースを書いた。

```text:01.s
.globl _start
_start:
mov w1,9
str w1,[sp,-7]!
ldr w0,[sp],7
mov x8,93
svc 0
```

あるメモリにデータを格納した後にそのデータを取得することで固定の終了コード9を得られるのではという試みである。

アセンブルしリンクし実行すると、怒られる。

```
$ ./01; echo $?
Bus error
135
```

どうも変なところにスタックポインタをやってる状態でロードしたら怒られるっぽい。
あと後置変更せずロードもやったところ同様わず。

```01b.s
.globl _start
_start:
mov w1,9
str w1,[sp,-7]!
ldr w0,[sp,7]
mov x8,93
svc 0
```

```
$ ./01b; echo $?
Bus error
135
```

## なんでこの記事書いたの？

プログラム作ってるうちになんかミスったかなと
Ubuntu上でF#の環境を構築してみた

# 初めに

最近, 個人的に色々な環境を試しています. 当方Windowsしか扱ったことが無いものの, Linuxを使用したいという憧れが強くなり, WSL2のUbuntu上でF#の環境を構築してみました.

なお, 今回は最近個人的に学習中のF#を使用しますが, .NETなのでほとんどそのままC#にも転用できます.

# 手順

- Ubuntuのバージョン確認
- .NET環境のインストール
- F#ソリューション作成
- ついでに個人的好みのコード

## Ubuntuのバージョン確認

"/home/[user name]"にて, 以下のコマンドを入力
```bash
cat /etc/os-release
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4096764/d5d2b882-bb38-4933-bb07-2a2bac0cb292.png)

画像のVersionは22.04と確認できる.

## .NET環境のインストール

Ubuntuのバージョンが分かったらMicrosoftの公式ページへGo.
Ubuntuディストリビューション, インストールしたい.NETのバージョンを選択する.
公式ページをもとに, 今回はUbuntu22.04, .NET9をインストールしていきます.

```bash
# .NETバックポートパッケージリポジトリを追加
sudo add-apt-repository ppa:dotnet/backports
# SDKインストール
sudo apt-get update sudo apt-get install -y dotnet-sdk-9.0
# ランタイムインストール(ASP.NET込み)
sudo apt-get update sudo apt-get install -y aspnetcore-runtime-9.0
# ASP.NETが不要なら以下でもOK
sudo apt-get install -y dotnet-runtime-9.0
```

## F#ソリューション作成

今回は"fs-sandbox"という名前のディレクトリでソリューションを作成していきます.
dotnetというコマンドに関しては, 参考記事をご覧ください.

```bash
# fs-sandboxというディレクトリを作成, ディレクトリ移動
mkdir fs-sandbox
cd fs-sandbox

# ソリューションファイル作成
dotnet new sln

# F#で"Core"という名前でプロジェクト作成
# ※ C#で作りたい場合は以下のコマンドを"C#"に書き換えればOK
dotnet new console -lang "F#" -o Core
# ソリューションにプロジェクト追加
# ※ C#で作った場合は.fsproj->.csprojに変更すればOK
dotnet sln add Core/Core.fsproj
# ソリューションにプロジェクトが追加されたかチェック
dotnet sln fs-sandbox list

# ソリューションビルド
dotnet build fs-sandbox.sln
# プロジェクトを走らせる
dotnet run --project Core/Core.fsproj
```

## ついでに個人的好みのコード

大体の場合は, コンソールプロジェクト生成時点で以下のようなコードが書いてある

```fsharp
// Program.fs
printfn "Hello from F#"
```

名前空間, モジュール名がない... ちょっと怖いので少しだけ追加

```fsharp
// Program.fs
namespace Core
    module Program = 
        [<EntryPoint>]
        let Main args =
            printfn "Hello from F#"
            0
```

- 名前空間はプロジェクト名と合わせる
- モジュール名はソースコードファイル名と合わせる
- メイン関数として, エントリポイントを付けておく

以上. 良き.NETライフを.


### 参考記事
- コマンド確認
  - [WSL2の Ubuntu 20.04 を 22.04 へアップグレードしてみた](https://qiita.com/j-baba/items/c2e6426c9b32685ec082)
- Microsoft公式ページその1. UbuntuへのSDK, ランタイムインストール
  - [Ubuntu に .NET SDK または .NET ランタイムをインストールする](https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu-install?tabs=dotnet9&pivots=os-linux-ubuntu-2204#register-the-microsoft-package-repository)
- Microsoft公式ページその2. dotnetのCLIコマンドについて
  - [.NET CLI の概要](https://learn.microsoft.com/ja-jp/dotnet/core/tools/)
AlmaLinuxで構築するWeb3層構造：DBサーバ編

今回は、Webアプリケーションに欠かせないデータベースサーバを構築します。
MySQLをインストールし、映画データを扱えるサンプルデータベース「sakila」を用いて、実用的な構成を目指します。

# １．前提環境
| ホスト名        | 役割     | IPアドレス        |
| ----------- | ------ | ------------- |
| `webserver` | Webサーバ | 192.168.56.10 |
| `apserver`  | APサーバ  | 192.168.56.20 |
| `dbserver`  | DBサーバ  | 192.168.56.30 |

- OS：AlmaLinux 9.x
- SELinux：無効化済み
- 実行ユーザー：root または sudo権限を持つユーザー

# ２．名前解決の設定
## 2.1 /etc/nsswitch.conf の編集
| パラメータ | 設定値 |
|---|------|
|passwd: | files |
|shadow: | files |
| group: | files |
| hosts: | files dns myhostname |
| services: | files |
| netgroup: | files |
| automount: | files |

→ /etc/hosts を優先して名前解決できるようにします。

## 2.2 /etc/hosts の追記
```bash
192.168.56.30  dbserver
192.168.56.10  webserver
192.168.56.20  apserver
```

# ３．ファイアウォールの設定
```bash
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
```

# ４．NTP（時刻同期）設定
/etc/chrony.conf に以下を追記し、時刻の正確性を確保します。
```bash
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server time.google.com iburst

allow 192.168.56.0/24
```

# ５．MySQLのインストールと初期設定
## 5.1 リポジトリ追加とインストール
```bash
dnf localinstall https://dev.mysql.com/get/mysql84-community-release-el9-1.noa rch.rpm -y
dnf module disable mysql
dnf install mysql-community-server -y
```

## 5.2 サービス起動と有効化
``bash
systemctl enable mysqld
systemctl start mysqld
```
初期パスワード確認
```bash
$ head -n 5 /var/log/mysqld.log
A temporary password is generated for root@localhost: <初期パスワード>
```
セキュア設定：
```bash
mysql_secure_installation
```

# ６．MySQL設定変更とタイムゾーン設定
## 6.1 /etc/my.cnfの一部変更
```conf
default_authentication_plugin=mysql_native_password
default_password_lifetime = 0
innodb_buffer_pool_size = 1024M

[mysqld_safe]
timezone = Asia/Tokyo
```
## 6.2 タイムゾーンデータの取り込み
```bash
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p
systemctl restart mysqld
```

# ７．APサーバとの接続設定とSakilaデータ投入
## 7.1 Sakilaデータベースの導入
```bash
cd /tmp
wget https://downloads.mysql.com/docs/sakila-db.tar.gz
tar zxvf sakila-db.tar.gz
mysql -u root -p < sakila-schema.sql
mysql -u root -p < sakila-data.sql
```

## 7.2 APサーバからの接続を許可
```sql
CREATE USER root@'<APサーバのIPアドレス>' IDENTIFIED BY '<MySQLのパスワード>';
GRANT ALL PRIVILEGES ON sakila.* TO 'root'@'<APサーバのIPアドレス>';
FLUSH PRIVILEGES;
```
接続権限の確認
```sql
mysql> SHOW GRANTS FOR 'root'@'192.168.56.20';
+--------------------------------------------------------------+
| Grants for root@192.168.56.20                                |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `root`@`192.168.56.20`                 |
| GRANT ALL PRIVILEGES ON `sakila`.* TO `root`@`192.168.56.20` |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)
```
# まとめ
MySQLのセットアップとデータベースの準備が完了しました。これでアプリケーションからデータを読み取れる環境が整ってきました。
次回は、Web/AP/DBの各層を連携させ、画面推移・検索機能を持つ簡易サイトを作成します。

本記事は「AlmaLinuxで構築するWeb3層構造」シリーズの第4弾です。
前回までの内容はこちらからどうぞ：
- 第1回：仮想環境とAlmaLinux構築
- 第2回：Webサーバ（httpd）構築
- 第3回：APサーバ（Tomcat）構築
- 第5回：Web/AP/DB連携