OmniAICreator/Qiita-1.07M huggingface dataset:
初学者がブロックチェーンをキャッチアップするためにしたこと（エンジニア向け）

私は新卒でなんの知識もなく、暗号資産（仮想通貨）の業界に入りました。新卒で配属が決まっているわけではなかったので、まさかその業界に入るなんて思いもしなかったのです。そのため、最初はビットコインやブロックチェーン、NFTといった単語しか知らない状態だったのです。そこで、配属されてからの4ヶ月間でキャッチアップしてきました。簡単に学習内容を共有できればと思います。

# 書籍で学ぶ

浅く広くを暗号資産業界だけでなく、Web3業界といったものを知りたいということで、さまざまな本を読みました。技術的なものではなく、一般的な書籍から入りました。あと、これに時間かける必要もないのでなるべく薄いものを選びました。

### web3全体の大枠を知る
- 『決定版Web3』
https://amzn.to/40y3kGm 

- 『Web3とは何か～NFT、ブロックチェーン、メタバース』
https://amzn.to/47ae14H


### 暗号資産に絞って大枠を知る
- 『60分でわかる-暗号資産-超入門』
https://amzn.to/3skNB12

- 最新 いまさら聞けないビットコインとブロックチェーン
https://amzn.to/47tLmHn

<br>
これらは、大枠のもので専門的な知識というより、web3業界、暗号資産業界に必要な基礎知識が簡単に載っているものになります。ブロックチェーンが簡単にいえばどのような仕組みになっているのか、暗号資産はなぜブロックチェーン技術によりなりつのか、そもそもどのような取引が行われて、既存の金融業界とはどう違うのか理解するのには良い教材になります。


# 動画で学ぶ

正直、書籍の文字だけでは伝えきれない部分があります。特にブロックチェーンの根幹となる暗号化技術や分散型という考え方は文章だけではわかりません。そういったものは、youtubeで理解するのが一番早いと感じました。


### ブロックチェーンについて知る
一番最初にブロックチェーンを理解しようとした時にビットコインの仕組みから始まることが多いです。
そこで、ビットコインの仕組み（PoW）についての仕組みを理解するために一番わかりやすいものは以下の2つでした。

- 『結局ビットコインってどういう仕組みなの？』

https://www.youtube.com/watch?v=o-xhOBn4S60

- 『Blockchain Technology Explained (2 Hour Course)』（英語しかありませんが...）

https://www.youtube.com/watch?v=qOVAbKKSH10

上記のセクション：
> - Technology overview：技術の概要
> - Blockchain evolution：ブロックチェーンの進化
> - Decentralized web：分散型ウェブ
> - Distributed organizations：分散型組織
> - Distributed ledger：分散台帳
> - Smart contracts：スマートコントラクト
> - Distributed applications：分散アプリケーション
> - Internet of value：価値のインターネット
> - Token economies：トークン経済


# 実践してみる
Coincheckなどのプラットフォームを提供しているところで、送金やステーキングなどについてGUIで体験してみることは重要です。しかし、それより、エンジニアであれば、プログラムを書いてみることがいいかもしれません。


#### TypeScriptで書いてみる
Stacksという仮想通貨の銘柄があります。この送金体験をしてみましょう。以下に自分で書いたtypescriptで送金体験が一通りできる記事を書いてみましたので、やってみてください。

https://zenn.dev/jin237/articles/b349576b0fc769

#### JavaScriptで書いてみる
エンジニアファーストな仮想通貨のSymbolという仮想通貨もあります。

https://learn.ja.symbol-community.com/

送金体験に付随して、さらにロックや署名の部分などさまざまなものがjavascriptで体験できます。


#### Pythonで書いてみる

solanaという仮想通貨の送金体験も以下の記事でできます。

https://nft-aiueo.com/crypto/python%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6solana%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AE%E9%80%81%E9%87%91%E3%82%92%E8%A9%A6/


#### Rustで書いてみる

NEARという仮想通貨の送金にスマートコントラクトの説明やDApps体験ができます。有料ですが、損はしないと思います。

https://zenn.dev/masa0317/books/f1b2f614ce2bf4/viewer/48c5cd


# 専門的に学ぶ

上の送金体験では、特にこれといったちゃんとしたことを知らずとも、送金までたどり着くことができます。秘密鍵が必要なんだな、チェーンによって、必要なものが変わるんだな、などわかると思います。

しかし、今後開発をしていくにあたってしっかりとした基礎が必要です。そこで出てくるのがみんなの味方(?)オライリーです。

仮想通貨に関するもの

https://www.oreilly.co.jp/books/9784873119021/

https://www.oreilly.co.jp/books/9784873118963/


DAppsに関するもの

https://www.oreilly.co.jp/books/9784873118758/

必要な部分だけでもいいと思います。ビットコインの送金をするためのコードを書いているときには、UTXOの理解などにはとてもとても役に立ちました。


# その他

### 論文
ビットコインのはじめとされるサトシ・ナカモトの論文やそれらから発展した論文なども読みました。


### 記事
日本の仮想通貨の状況などは野村総研の調査結果や金融庁などのドキュメントを読み漁ってみるのも良いでしょう。


### 自分でまとめて、人に話してみる
正直、仮想通貨に関する情報を集めてわかりやすく説明することはとても難しいです。書籍や動画を聞いていても理解できにくいのは、そもそもの仕組みが難しいからです。でも実際、私自身は資料を作り、それを記事や人への説明などをしていくことでさらに理解が深まりました。
PHP 変数について

# 対象読者
[こちらの記事と同様](https://qiita.com/bpg_ts/items/1a25f6bd3d4656fb0bda#%E5%AF%BE%E8%B1%A1%E8%AA%AD%E8%80%85 "対象読者")

# 変数とは
### 変数
一言で言えば、「**データを入れるための箱**」。変数を宣言すると、メモリ上に領域が確保される。

変数（箱）を使うメリット
* **名前を付けることができる**
* **再代入が可能**

### 変数の宣言
以下は、`$wallet`（変数：財布）に、1000（1,000 円）を入れて変数を宣言する例。**イコール** (`=`) は、**代入**を表す。
```php:PHP
<?php
    $wallet = 1000;    // 変数宣言の例、 (=) は代入を表す
?>
```
:::note info
PHP は **動的型付け** 。`$wallet`（財布）という **変数名** として名前を付与することで、人間が直感的に理解しやすいものとなっている。
:::

### 変数の命名規則
* 「`$ ～`」の形式とする
例．$name
* 名前の先頭は、任意の文字 or アンダースコア (_) 、**数字はダメ**
* 名前の 2 文字目以降は、**数字可**
* 大文字、小文字は区別される
* 誰が見てもデータ内容を推測できる名前が望ましい
:::note warn
全角文字、予約語も変数とすることができる。しかし、一般的な慣例として、 **半角英数字** 、 **アンダースコア (_)** までの使用に限定した方がいい。
:::

### 可変変数
(`$`) を 2 つ重ねることで、間接的に別の変数の値を出力できる。とりあえず具体例を。
```php:PHP
<?php

/*
    $varName に ($) を重ねることで、
    間接的に $name1 にアクセスして出力
*/

$varName = 'name1';
$name1 = '佐藤';
$name2 = '鈴木';
print $$varName;

/* 実行結果：
    佐藤
*/

?>
```
:::note info
`$varName` の値を 'name2' に書き換えて出力すると、「鈴木」と出力される。
:::
Javaの境界ワイルドカードについて

## はじめに
Javaの境界ワイルドカードについてまとめてみた。
主に3つの形式がある。
・非境界ワイルドカード
・上限境界ワイルドカード
・下限境界ワイルドカード

## 非境界ワイルドカード
```<?>```のようにジェネリクス宣言時にワイルドカード「?」を使用することで型パラメータとして使用できるクラスを制限せずに扱うことができる。主に２つの特徴がある。
・メソッドの戻り値の型はObject型になる。
・メソッドの引数にはnullリテラルのみ渡せる。
```Main.java
public class Main {
    public static void main(String[] args) throws Exception {
        // 非境界ワイルドカードを使用しリストを宣言
        ArrayList<?> list = new ArrayList<>();

        ArrayList<String> strList = new ArrayList<>();

        ArrayList<Integer> intList = new ArrayList<>();
        
        list.containsAll(strList);
        list.containsAll(intList);
    }
}
```
## 上限境界ワイルドカード
```<? extends T>```のようにジェネリクス宣言時に「extends」を使い、型パラメータとして使用できるクラスの範囲を制限する仕組みである。
```<? extends T>```の場合、TまたはTのサブクラス型のみ扱うことができる。
・メソッドの戻り値は任意の型にすることができる。
・メソッドの引数にはnullリテラルのみ渡せる。
```Main.java
public class Main {
    public static void main(String[] args) throws Exception {
        
        ArrayList<Integer> intList = new ArrayList<>();
        
        ArrayList<String> strList = new ArrayList<>();

        // IntegerはNumberのサブクラスのため呼び出すことができる
        testList(intList);
        // StringはNumberのサブクラスではないためコンパイルエラー
        testList(strList);
    }

    // 上限境界ワイルドカードを使用したメソッド    
    public static void testList(List<? extends Number> list) {
        // listに関する処理
    }
}
```
## 下限境界ワイルドカード
```<? super T>```のようにジェネリクス宣言時に「super」を使い、型パラメータとして使用できるクラスの範囲を制限する仕組みである。
```<? super T>```の場合、TまたはTのスーパークラス型のみ扱うことができる。
・メソッドの戻り値の型はObject型になる。
・メソッドの引数には任意の型を渡せる。
```Main.java
public class Main {
    public static void main(String[] args) throws Exception {
        
        ArrayList<Number> numList = new ArrayList<>();
        
        ArrayList<String> strList = new ArrayList<>();

        // NumberはIntegerのスーパークラスのため呼び出すことができる
        testList(numList);
        // StringはIntegerのスーパークラスではないためコンパイルエラー
        testList(strList);
    }

    // 下限境界ワイルドカードを使用したメソッド    
    public static void testList(List<? super Integer> list) {
        // listに関する処理
    }
}
```
【Golang】構造体をJSONにマッピングする際の挙動について

実務において、レスポンスとしてJSONを返却しているのですが、DBにないカラムを構造体に追加した状態でリリースするとレスポンスはどうなりますか？という質問を受けたため、これに回答するためにGolangの構造体がJSONにマッピングされる時にどういう挙動をするのか調べたため、備忘録として残すもの。


### 公開フィールドとして定義した場合
```go
package main

import (
	"encoding/json"
	"fmt"
)

// User 構造体の定義
// フィールド名の最初を「大文字」で定義した場合は公開フィールドとなる。
type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
	Sex  int    `json:"sex"`
}

func main() {
	user := User{
		Name: "John Doe",
		Age:  25,
		Sex:  1,
	}

	// User構造体をJSONにマーシャル
	jsonData, err := json.Marshal(user)
	if err != nil {
		fmt.Println("Error marshalling JSON:", err)
		return
	}

	// マーシャルされたJSONデータを表示
	fmt.Println(string(jsonData))

    // 結果：　{"name":"John Doe","age":25,"sex":1}
}
```
公開フィールドで定義してた場合は、JSONにマッピングされる。

https://go.dev/play/p/lkcu8VqyIMl

### 非公開フィールドで定義した場合
```go
package main

import (
	"encoding/json"
	"fmt"
)

// User 構造体の定義
// フィールド名の最初を「小文字」で定義した場合は公開フィールドとなる。
type User struct {
	Name string `json:"name"`
	age  int    `json:"age"`
	sex  int    `json:"sex"`
}

func main() {
	user := User{
		Name: "John Doe",
		age:  25,
		sex:  1,
	}

	// User構造体をJSONにマーシャル
	jsonData, err := json.Marshal(user)
	if err != nil {
		fmt.Println("Error marshalling JSON:", err)
		return
	}

	// マーシャルされたJSONデータを表示
	fmt.Println(string(jsonData))

    // struct field age has json tag but is not exported(構造体フィールド age には json タグがありますが、エクスポートされません)
    // struct field sex has json tag but is not exported（構造体フィールド sex には json タグがありますが、エクスポートされません）
    // 結果：　{"name":"John Doe"}
}
```
「struct field age has json tag but is not exported」というエラーは発生するが動作する。
また、公開フィールドのNameは表示されるが、非公開フィールドであるage及びsexについてはマッピングされていない。

https://go.dev/play/p/MBnZD-GUwDg


### jsonタグで出力を制御する場合
```go
package main

import (
	"encoding/json"
	"fmt"
)

// User 構造体の定義
// 「jsonタグで"-"」と定義する
type User struct {
	Name string `json:"name"`
	Age  int    `json:"-"`
	Sex  int    `json:"-"`
}

func main() {
	user := User{
		Name: "John Doe",
		Age:  25,
		Sex:  1,
	}

	// User構造体をJSONにマーシャル
	jsonData, err := json.Marshal(user)
	if err != nil {
		fmt.Println("Error marshalling JSON:", err)
		return
	}

	// マーシャルされたJSONデータを表示
	fmt.Println(string(jsonData))

    // 結果: {"name":"John Doe"}
}

```
`json:"-"`というように定義すると公開フィールドで定義していてもJSONにマッピングされない。

https://go.dev/play/p/hiDlqyOK9PO


### まとめ
非公開フィールドもしくはjson:"-"で定義した場合はJSONにマッピングされないことがわかった。
個人的にはjson:"-"の方がわかりやすいと感じたため、JSONにマッピングさせたくないフィールドがある場合は、json:"-"を使用していきたいと感じた。

### 参考資料
https://maku77.github.io/p/dsbs9p5/#google_vignette

https://zenn.dev/hsaki/articles/go-convert-json-struct
Tableau Prep Ver.2023.3_新機能フィルダウン計算



今回はPreppindata　2023: Week 45 - Fill Down
の課題をもとにTableau Prep Ver.2023.3_新機能「フィルダウン計算・下を埋める 」
を使用したデータ加工のアプローチ方法をご紹介します。

個人的にExcelでよくある行が結合セルになっているのもこれで一撃解決できる、便利な機能だと思います。




## 問題のダウンロードはこちら

https://preppindata.blogspot.com/2023/11/2023-week-45-fill-down.html







#### 要件
1. プロジェクトフィールドでプロジェクト名を金融取引から分離します。
　・金融取引の名前には請求書または経費のいずれかが含まれます
2. Null がある場合はフィールドに入力します 
　・ヒント: Prep を使用している場合は、このフローの早い段階で変更を加える必要がある場合があります。
3.コストまたは請求金額が含まれていないプロジェクト名の行を削除します。
4.プロジェクトごとの総費用と請求金額 
5.プロジェクトごとの利益を計算します (請求金額から経費を差し引いたもの)



<br>

## 入力の確認

ダウンロードしたフォルダを見てみると、Costカラムに値が入っているレコードはinvoicedAmountがNull、反対に、invoicedAmountカラムに値が入っているレコードはCostカラムの値がNullと互い違いになっています。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/53380e8f-6c42-84bd-08d9-82f6891dd58e.png)


## 出力の確認

ProJectカラム内のExpence,Invoiceが含まれる値は削除されていて、各ProJect名にまとめられています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/bdf7f17f-ed84-f62b-a739-22b521db34dc.png)


## 公式ヘルプページをもとにわかりやすく言うと
Expence,Invoiceの値を本来ヘッダーのような役割である、Scatter-my-plots, Data-versity ,Data Prep Schoolのの値として扱い1レコードに各ProJectごとに1レコードにまとめたい。というのが今回の課題です。
つまり添付画像の空欄の部分を今回はExpence,Invoiceバージョンで同じように処理する感じですね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/e4a653ae-2075-fc45-c204-65e0bf655d01.png)


##  カラムから不要な値をを削除しフィルダウン計算で欠損値を埋める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/8927f81d-2d58-965c-e0f2-5192c51f025a.png)
#### 1.デフォルトでは削除されているSource Row Numberを含める
この後のフィルダウン計算で使用します。
これによりExcelファイルの行No.が取得できる

#### 2.Projectフィールドの値にExpenseもしくはInvoiceが含まれるものをNullに変える処理

```
IF
REGEXP_MATCH([Project],"Expense|Invoice") THEN NULL
ELSE
[Project]
END
```
(REGEXP_MATCH、正規表現関数は計算式スッキリするのでオススメですよ✨)

#### 3.LAST_VALUE関数を使用したフィルダウン計算

```
{ ORDERBY [Source Row Number] asc : LAST_VALUE([Project],TRUE)}
```
計算式の意味:
1. ORDERBY [Source Row Number] asc  →　Source Row Number昇順に並び替える
2. LAST_VALUE([Project],TRUE) →　Null値を上の行の値に置き換えます、今回の例でいうと、[Project] フィールドの NULL 値を上記の行に基づく値に置き換えた結果を返します。

## ビジュアル計算エディター使用して簡単に実装

プロファイル カードまたは [結果] ペインで、[その他のオプション] メニューをクリックし、[計算フィールドの作成]、[下を埋める] の順に選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/268a0d20-689e-129c-fdab-9ab76368fe7e.png)

[グループ化] セクションでは、計算を実行するときにデータを分割するフィールドを選択できます。データを分割したくない場合は、デフォルト値の [フルテーブル] を選択。
結果もわかりやすく確認できるので楽ですよね～～✨
これでフィルダウン計算の説明はおしまいです！！



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/7213c55c-6e00-004e-4365-c8938c2c6531.png)


##  集計して1レコードにして、利益の計算



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/2395d429-99b4-58e4-861e-d18a2ad784d3.png)
利益の計算後は出力のソート順を合わせるために以下の計算加えてます。
「第8回 Tableau Prepユーザー会」で1:04:00~Komatuさんが紹介していた手法です。

https://www.youtube.com/live/RRL9oiSW9pY?si=-Z7cn8tNLxFIfntF

丁寧なデータ加工に脱帽です。

```
{ ORDERBY [Invoiced Amount] desc : LOOKUP([Invoiced Amount],0)}
```

## おわりに
今回はPreppindata の課題を基に、Tableau Prep Ver.2023.3_新機能フィルダウン計算処理をご紹介しました。
Excelでよくある行が結合セルになっているのもこれで一撃ですね。
本当に痒い所に手が届く便利な機能が多くて感動してます。
是非使ってみてください。

最後までご覧いただきありがとうございました。
React(Next)でなぜコンポーネントを使うか

## はじめに
現代のフロントエンド開発では、効率的かつ保守しやすいコードを書くことが不可欠です。Reactは、このニーズに応えるための強力なツールを提供しています。その核心にあるのが「コンポーネント」という概念です。この記事では、Reactでコンポーネントを利用する理由と、その利点を探求します。

## コンポーネントの効果
大まかに次の要素に分けられます。

### 1. 再利用可能性（Reusability）:
Reactのコンポーネントは、繰り返し利用可能なコードのブロックのようなものです。一度作成すれば、様々な場所で簡単に再利用できます。これは、コードの重複を減らし、開発の速度を上げる大きな利点です。

### 2. 保守性（Maintainability）:
コンポーネントベースの設計は、大規模なアプリケーションの保守を簡素化します。コードを小さな部分に分割することで、問題の特定、修正、機能の更新が容易になります。

### 3. 可読性（Readability）:
コードがコンポーネントによって整理されていると、アプリケーションの構造が一目で理解できます。これは、新しい開発者にとって特に有益です。

### 4. テストの容易さ（Ease of Testing）:
個別のコンポーネントを隔離してテストすることが可能です。これにより、バグを迅速に特定し、信頼性の高いアプリケーションを構築できます。

### 5. ステートとライフサイクル管理（State & Lifecycle Management）:
各コンポーネントが独自の状態とライフサイクルを持つため、データフローとUIの更新が効率的に行えます。

### 6. コンポジション（Composition）:
小さなコンポーネントを組み合わせることで、より複雑な機能を構築できます。これは、柔軟性と拡張性を提供します。

### 7. カスタムフック（Custom Hooks）:
React Hooksを活用することで、ロジックの共有が容易になり、コンポーネントの再利用性がさらに向上します。


## いくつかの例示
考えを具体化するために、ある特定のケースを想定しましょう。例えば、1ページの定義に2500行のコードが必要な機能を開発する状況です。このケースにおいて、コンポーネントを利用するか否かによる違いを見ていきましょう。

### 保守性の比較
#### コンポーネントを利用しない場合
2500行のコードが一つの大きなファイルに集中します。このような構造では、小さな変更やバグの修正が困難になり、さらには一箇所の変更が他の部分にも影響を与えるリスクが増加します。
```jsx
// すべての機能が1つの大きなファイルに集中
function Page() {
  // ナビゲーションロジック
  // ...

  // ユーザーインターフェースのロジック
  // ...

  // データフェッチングのロジック
  // ...

  // 他の多くの機能
  // ...

  return (
    <div>
      {/* すべてのUIコンポーネントがここに含まれる */}
    </div>
  );
}
```

#### コンポーネントを利用する場合
同じ量のコードでも、それを小さな、再利用可能な部分に分割することができます。これにより、特定の機能やバグに対する修正がより簡単になり、他のコンポーネントへの影響も最小限に抑えられます。また、それぞれのコンポーネントは別ファイルによってExportし、必要な場所でImportとして使えます。（下の例よりもっと見やすくなる）これにより、Page単位での処理やUIの流れを追いやすい形式になります。

```jsx
// 別ファイルに移動出来る
function Navigation() {
  // ナビゲーションロジック
  // ...
}

// 別ファイルに移動出来る
function UserInterface() {
  // ユーザーインターフェースのロジック
  // ...
}

// 別ファイルに移動出来る
function DataFetching() {
  // データフェッチングのロジック
  // ...
}

function Page() {
  return (
    <div>
      <Navigation />
      <UserInterface />
      <DataFetching />
      {/* 他のコンポーネント */}
    </div>
  );
}
```

### 可読性の比較
#### コンポーネントを使用しない場合
2500行の長いコードは読み解くのが非常に困難です。新しい開発者がコードベースを理解するのが難しくなり、プロジェクトの進行において大きな障壁となることがあります。

※具体例は省略(上の例で大体同じ)

#### コンポーネントを利用する場合
各機能は短く明確なコードブロックに分けられます。これにより、コードの理解と追跡が容易になり、新しい開発者が迅速にプロジェクトに参加し、効率的に作業を進めることができます。

※具体例は省略(上の例で大体同じ)


### 例から考えて
この比較から、特に大規模な機能開発や長期的なプロジェクト管理において、Reactのコンポーネントを利用することの重要性が明らかになります。保守性と可読性は、開発の効率性と品質を決定する上で不可欠な要素であり、これらを高めるためにはコンポーネントの適切な利用が鍵となります。

## 最後に
Reactのコンポーネントを使用することは、単にコードを整理する以上の意味を持ちます。それは、効率的で、保守しやすく、読みやすいアプリケーションを開発するための重要な鍵です。これらの利点は、小規模から大規模プロジェクトに至るまで、あらゆるレベルの開発において重要です。Reactのコンポーネントを活用することで、より良い開発体験と、より強力なアプリケーションを実現できることでしょう。

PS.個人開発ではあまり遭遇しない利点が多かった
Poetry install がタイムアウトする

## 問題

Poetry で Torch をインストールするときに、コネクションがタイムアウトしてしまった。

エラー文抜粋：

```
  • Installing torch (2.0.1): Failed

  timeout

  The read operation timed out

  ReadTimeoutError

  HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.  
```

<details>
<summary>エラー文全体</summary>

```py
# 前略...

  • Installing torch (2.0.1): Failed

  timeout

  The read operation timed out

  at /usr/lib/python3.8/ssl.py:1099 in read
      1095│         if self._sslobj is None:
      1096│             raise ValueError("Read on closed or unwrapped SSL socket.")
      1097│         try:
      1098│             if buffer is not None:
    → 1099│                 return self._sslobj.read(len, buffer)
      1100│             else:
      1101│                 return self._sslobj.read(len)
      1102│         except SSLError as x:
      1103│             if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:

The following error occurred when trying to handle this error:


  ReadTimeoutError

  HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

  at ~/.local/pipx/venvs/poetry/lib/python3.8/site-packages/urllib3/response.py:715 in _error_catcher
       711│
       712│             except SocketTimeout as e:
       713│                 # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but
       714│                 # there is yet no clean way to get at it from this context.
    →  715│                 raise ReadTimeoutError(self._pool, None, "Read timed out.") from e  # type: ignore[arg-type]
       716│
       717│             except BaseSSLError as e:
       718│                 # FIXME: Is there a better way to differentiate between SSLErrors?
       719│                 if "read operation timed out" not in str(e):

The following error occurred when trying to handle this error:


  ConnectionError

  HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

  at ~/.local/pipx/venvs/poetry/lib/python3.8/site-packages/requests/models.py:822 in generate
       818│                     raise ChunkedEncodingError(e)
       819│                 except DecodeError as e:
       820│                     raise ContentDecodingError(e)
       821│                 except ReadTimeoutError as e:
    →  822│                     raise ConnectionError(e)
       823│                 except SSLError as e:
       824│                     raise RequestsSSLError(e)
       825│             else:
       826│                 # Standard file-like object.

Cannot install torch.
```

</details>

## 解決

インストールしようとしていた Torch が大きすぎてタイムアウトしていた様子。

環境変数でタイムアウトを伸ばせるようになっているらしい。

https://github.com/python-poetry/poetry/pull/7081

```
POETRY_REQUESTS_TIMEOUT=600 poetry install
```

うまくいった。
AtCoder初心者 DailyTrainingメモ 2023/11/12

# ABC277 A-問題
https://atcoder.jp/contests/adt_easy_20231018_1/tasks/abc277_a

![277A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547298/5026dada-87cf-b30a-86be-96ed7f1337d3.png)

**ポイント**
リストから要素を検索し、その位置を知るには　indexを使う

````Python:277A.py
# 入力
N,X = map(int,input().split())
P = [0] + list(map(int, input().split()))

# リスト P の中で、X を検索する
ans = P.index(X)

print(ans)
````
# ABC220 B-問題
https://atcoder.jp/contests/abc220/tasks/abc220_b

**問題文**
整数 A,B が K 進法表記で与えられます。A×B を 10 進法表記で出力してください。

**ポイント**
先人の残した　N進数の値を10進数に変換する関数を利用する

````Python:220B.py
# （N進数の数値,N進法）を10進数に変換する
def base_10(num_n,n):
    num_10 = 0
    for s in str(num_n):
        num_10 *= n
        num_10 += int(s)
    return num_10

# 入力
K = int(input())
A,B = map(int,input().split())

X = base_10(A,K)
Y = base_10(B,K)

print(X * Y)
````
さんぽビンゴのためのwebアプリを作ろう！

## 今日はなんとなくお散歩にきっかけが欲しい     
いつもは当てもなく歩いている自分ですが、今回はただ歩くだけではなく、何か外に出るきっかけが欲しい... 
どうせならお散歩中に運良く見つけたものたちでビンゴができたら、散歩に行きたくなるかも！    
という訳で、今回はweb上でさんぽビンゴができるwebアプリを作成しました。  
  
https://effortless-boba-23d32a.netlify.app/

  
## 使い方  
https://x.com/mmmrym112/status/1723663042096042337?s=20

1. マス目を触るとチェックを付けることができます。
※チェックされたマスをもう一度触るとチェックが外れます。 
2. やり直したい場合はやり直すボタンを押すと、すべてのチェックをリセットできます。
3. 散歩の行き場所に迷ったら、検索マークを押してみましょう。

## 作り方  
### 環境設定  
- CodePen
- Netlify
- jQuery.js （JavaScriptライブラリ）
- iTyped.js （JavaScriptライブラリ）

### コード
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="OJdgyNd" data-user="mmmrym" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mmmrym/pen/OJdgyNd">
  CSS Grid: Bingo Card</a> by mmmrym (<a href="https://codepen.io/mmmrym">@mmmrym</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>  

  
  
  [こちらのコード](https://codepen.io/oliviale/pen/OrxWyK)から、
- ビンゴのマス目、配置、ビンゴの内容を変更
- iTypedでタイピングアニメーションを追加
- 散歩のアイディアとして「散歩の達人」のリンクを添付

そして、完成したのが上記のコードになります。

## 反省点  
web上ではビンゴのレイアウトに見えるが、スマホの縦方向で閲覧するとリスト表示になってしまい、一見ビンゴなのかわからなくなってしまいました。  

## お散歩が更に楽しくなりました  
なんとなく歩くのも良いですが、周りのものをよく見てビンゴを狙うのもまた楽しいです。ビンゴできたら帰りにアイスを買いましょう。(ビンゴするために歩き回ると思うのでアイスは食べても大丈夫な計算です)
みなさんもぜひお散歩のお供に使ってみてくださいね！
MySQLをインストールしようとしたらエラー出た

Qiita初投稿です:writing_hand_tone1:

# MySQLをインストールする

環境
macOS：Big Sur 11.4
Homebrew： 2.7.1
MySQL：5.7
<br>
まずはターミナルを起動。
MySQLをインストールするコマンドを実行します。
```console
% brew install mysql@5.7
```

## 吐き出されたエラー
上のコマンド実行後、しばらくしてからこのようなエラーが出ました。

```console
% brew install mysql@5.7
# ~省略~
Error: Xcode alone is not sufficient on Big Sur. Install the Command Line Tools: xcode-select --install
```
<br>
英語よわよわ人間なので翻訳

>エラー：Big Sur ではXcodeだけでは十分ではありません。
コマンドラインツールをインストールします: xcode-select --install

xcode-selectというものが何なのかはよく分からないのですが、とりあえず言われた通りにインストールしてみました。
<br>
えいやっと
```console
% xcode-select --install
# ~省略~
xcode-select: note: install requested for command line developer tools
```




翻訳
>xcode-select: 注: コマンドライン開発者ツールのインストールが要求されました

<br>

おや？うまくいったんかなと思い、もう一度MySQLインストールコマンドを実行。
```console
% brew install mysql@5.7
# ~省略~
Error: Xcode alone is not sufficient on Big Sur. Install the Command Line Tools: xcode-select --install
```

また同じエラーが出てしまいました:cry:

## 対処
もしかして、Xcodeをしばらく使ってなさすぎるせいでバージョンが古いのが原因？
と思い、ダメ元でアップデートをかけてみました。

```console
% brew update
Installing from the API is now the default behaviour!
You can save space and time by running:
  brew untap homebrew/core
  brew untap homebrew/cask
Already up-to-date.
```

翻訳
>APIからのインストールがデフォルトの動作になりました。
以下を実行すると、スペースと時間を節約できます。
  brew untap homebrew/core
  brew untap homebrew/cask
すでに最新です。

とりあえず最新にできたっぽい、、、？

## 3度目の正直でMySQLインストール実行

```console
% brew install mysql@5.7
```

約1時間後↓↓
（こんな時間かかる？？？）
```console
% brew install mysql@5.7
# ~省略~
==> Successfully started `mysql@5.7`
```

どうやらうまくいったようです:clap_tone1::sparkles:
あとはPWの設定やらをして、完了です。
<br>

## さいごに
念の為、バージョン確認。
```console
% mysql --version
mysql  Ver 14.14 Distrib 5.7.44, for osx10.16 (x86_64) using  EditLine wrapper
```

ちゃんとMySQL5.7がインストールされたようです。よかった、、、。
<br>

参考にさせていただきました:pray_tone1:
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
【Android】端末のスリープモードの操作【Kotlin】

# はじめに
今回は端末のスリープモードに関する操作をアプリ内でおこうなえるようにしていきます。


# 実践
以下は、参考記事をもとに　画面をスリープさせないようにするコードです。

    private lateinit var wakeLock: PowerManager.WakeLock

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        wakeLock = powerManager.newWakeLock(
            PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP,
            "MyApp::MyWakelockTag"
        )
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        wakeLock.acquire()
    }

    override fun onDestroy() {
        super.onDestroy()

        if (wakeLock.isHeld) {
            wakeLock.release()
        }


このままコピペで使えると思います。

wakeLockをonCreate（）で定義し直すときに、条件を増やしたり上の例とは違う条件を設定することができます。

|左揃え||
|:---|:---|
|PARTIAL_WAKE_LOCK|CPUだけ設定|
|SCREEN_DIM_WAKE_LOCK|CPUとScreenが一段階暗い状態に設定|
|SCREEN_BRIGHT_WAKE_LOCK|CPUとScreenを設定|
|FULL_WAKE_LOCK|CPU、Screen、KeyBoardを設定|
|ACQUIRE_CAUSES_WAKEUP|wakeLock取得されたときに、強制的にON|
|ON_AFTER_RELEASE|wakeLock取得時に照明がすぐに消えないようにする|

また、acquire()の引数に時間を指定することで設定した時間の経過時間後に、wakeLockを動かすこともできるようです。


# 参考

https://techbooster.org/android/application/4429/


https://developer.android.com/topic/performance/vitals/wakelock?hl=ja

http://kotlin.goodlook.jp/2023/04/06/%e7%94%bb%e9%9d%a2%e3%82%92%e3%82%b9%e3%83%aa%e3%83%bc%e3%83%97%e3%81%95%e3%81%9b%e3%81%aa%e3%81%84%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b-kotlin/
ESP32のSPIで遊ぶ


目的
遊ぶ


![o_cop774.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/505b8567-e730-f1b5-5791-78141b127e40.jpeg)



```c++



//SPI_test1_esp32

#include <SPI.h>


#define DW    digitalWrite

//#define s60() for(ii=0;ii<60;ii++)delay(1000);
#define s60() delay(1000);

void setup() {
  
  int ii; //ループカウンター
  
  // SPIの初期化
  SPI.begin(); // CLK-18 MOSI-23
  //DW(SS, LOW); // 
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // 2Mhz
  
  //0
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //1
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0x55);//DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //2
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0xaa);//DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //3
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0xff);//DW(SS,HIGH);DW(SS,LOW);
  
} //setup

void loop() {
  delay(1);
} //loop


```
Hugging Face で Wikipediaのデータを Dataset として公開する


# JSONデータ

Wikipedia のダンプファイルから以下のような改行区切りJSONファイルを作成したとします。

```json:jawiki-20230101-pages-articles-multistream_type1.jsonl (読みやすいように成形済み)
{
    "id": "5",
    "url": "https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%91%E3%82%B5%E3%83%B3%E3%83%89",
    "title": "アンパサンド",
    "text": "アンパサンドは、並立助詞「…と…」を意味する記号である。...(以下略)"
}
{
    "id": "10",
    "url": "https://ja.wikipedia.org/wiki/%E8%A8%80%E8%AA%9E",
    "title": "言語",
    "text": "言語は、狭義には「声による記号の体系」をいう。...(以下略)"
}
```

# Hugging Face にアップロードして公開

これをHugging Face にアップロードするためのコードは以下の通りです。

```python
# 必要なライブラリと関数をインポート
from datasets import DatasetDict, load_dataset
from datasets import load_dataset, DatasetBuilder, BuilderConfig, Version
import datasets

# BuilderConfigクラスをconfigとしてインスタンス化
config = datasets.BuilderConfig
# configの言語設定を'ja'（日本語）に設定
config.language = 'ja'
# データセットのバージョンを定義
_VERSION = datasets.Version("2.0.0", "")

# Wikipediaデータセットの設定クラスを定義
class WikipediaConfig(datasets.BuilderConfig):
    def __init__(self, language=None, date=None, version=_VERSION, **kwargs):
        super().__init__(
            name=f"{date}.{language}",
            description=f"Wikipedia dataset for {language}, parsed from {date} dump.",
            version=version,
            **kwargs,
        )
        self.date = date
        self.language = language

# WikipediaConfigを日本語と特定日付でインスタンス化
config = WikipediaConfig(date='20230101',language='ja')

# データセットのファイル名を定義
filename = 'jawiki-20230101-pages-articles-multistream_type1.jsonl'

# JSON形式のデータセットをロード
dataset1 = load_dataset('json', name='20230101.ja', data_files='/local/wiki/jawiki/20230101/'+filename, split='train')

# データセットをDatasetDictオブジェクトとして定義
dataset_dict = DatasetDict({
    'train': dataset1
})

# ユーザー名とデータセットの名前を設定
username = 'nlp4j'
dataset_name = 'wikipedia'

# DatasetDictオブジェクトをHugging Face Hubにアップロード。トークンとconfig名を指定
dataset_dict.push_to_hub(f"{username}/{dataset_name}", token='【あなたのト－クン】',config_name='20230101.ja' )

```

# 結果

このコードを実行してアップロードしたものが以下になります。

https://huggingface.co/datasets/nlp4j/wikipedia/viewer/20230101.ja



---



何かのお役に立てばさいわいです。

以上.
Jetson Orin NanoのSDカードを使ったOSイメージのセットアップ手順

# はじめに

Jetson Orin Nano Developer Kit 8GBのSDカードイメージのセットアップ手順をメモとして残します。

# 対象モデル

Jetson Orin Nano Developer Kit (P3766)
1024 core Ampere architecture GPU
6 core ARM Cortes-A78AE v8.2 64-bit CPU
8GB Memory
2 camera connector
Micro SDXC  UHS-I 128GB

# セットアップ

## JetPack SDKのダウンロード

[JetPack SDK](https://developer.nvidia.com/embedded/jetpack)の最新版をダウンロードしました。[NVIDIA DEVELOPER](https://developer.nvidia.com)最下部にあるPopular SDKsのリストにあるJetpackからも同じページに辿ることができます。

先に案内したページはJetPack SDKのトップページとなっており、常に最新が案内されるようです。作業したタイミングでは、 JetPack 5.1.2となっていました。

今回はSDカードで起動する予定なので、SD Card Image Methodを開き、JETSON Orin Nano DEVELOPER KITをクリックするとイメージがダウンロードできます。

## OSイメージをSDカードに書き込み

ダウンロードしたOSイメージをSDカードに書き込みます。32GB以上のSDカードを用意し、balenaEtcherなどを使ってOSイメージを書き込みます。左からOSイメージの指定、ドライブ(SDカード)の指定、実行ボタン、となります。画像はRaspberry Piのイメージを指定していますが、先にダウンロードしたJetPackのイメージを指定して下さい。

![balenaEthcher.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1557529/99ccf1fc-2dd7-a944-b41a-1589cde69695.png)

:::note info
マイクロSDカードは64GB以上が推奨となっています。32GBでもインストールできますが、https://github.com/dusty-nv/jetson-containers に紹介されているコンテナをダウンロードしようとすると足りずに途中で停止します。
:::

## 動作確認

pythonのバージョンを確認してみました。

```sh
python3 --version
Python 3.8.10
```

PyTorchも確認しようとしたのですが、インストールされていないことが分かりました。コンテナ環境でセットアップするため、ホストOS側にインストールする必要はない、ということです。

```python
import torch
print(torch.cuda.is_available())
```


# 参考情報

- [JetPack SDK](https://developer.nvidia.com/embedded/jetpack)
`innerHTML` と `insertAdjacentHTML`の違い

## `innerHTML` or `insertAdjacentHTML`?

### innerHTML

`innerHTML` は、特定の要素のHTMLコンテンツ全体を置き換えるために使用されるプロパティです。このプロパティを使うと、指定した要素内のHTML全体を新しいHTMLで置き換えることができます。

```javascript
const element = document.getElementById('myElement');
element.innerHTML = '<p>New HTML content</p>';
```

`innerHTML` を使用すると、指定された要素の中身全体が置き換えられます。これにより、新しいHTMLコンテンツが表示される際に以前の内容は消去され、完全に新しいHTMLで置き換えられます。

### insertAdjacentHTML

`insertAdjacentHTML` は、要素に新しいHTMLコンテンツを追加するためのメソッドです。このメソッドを使用すると、指定された場所に新しいHTMLを追加できます。

```javascript
const element = document.getElementById('myElement');
element.insertAdjacentHTML('beforeend', '<p>New HTML content</p>');
```

`insertAdjacentHTML` は4つの引数を持ちます。
1. **position**：挿入位置を示す値（beforebegin, afterbegin, beforeend, afterend）
2. **text**：挿入するHTMLコード

`position` パラメーターは次のように機能します：
- `beforebegin`: 要素の直前に挿入
- `afterbegin`: 要素の最初の子要素として挿入
- `beforeend`: 要素の最後の子要素として挿入
- `afterend`: 要素の直後に挿入

このメソッドを使用すると、指定された位置に新しいHTMLを追加できます。元のコンテンツは置き換えられるのではなく、追加されます。

---

`innerHTML` は要素の中身を完全に置き換えるのに対し、`insertAdjacentHTML` は要素に新しいHTMLを追加します。適切なタイミングと状況に応じて、それぞれの機能を使い分けることが重要です。
AndroidStudio: Junit5 の使い方

## プロジェクトの作成
プロジェクト名: Calc03

## 環境

```app/build.gradle.kts
（省略）
dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.1")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.1")
  （省略）
  ```

  ## プログラム

  ```Calculator.kt
  package com.example.calc03

class Calculator {

    fun add(a: Int, b: Int): Int {
        return a + b
    }

    fun div(a: Int, b: Int): Double {
        assert(b != 0) { "Division by Zero" }
        return a / b * 1.0
    }
}
```

## テストプログラム
Calculator.kt をテストする。

Calculator にカーソルを置いて、
Ctrl + shift + t
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/aa1e3d7c-efc9-25e7-cd2b-39773922e4d2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/cbc8b1b1-db4d-9ae5-1bca-6543a2991d16.png)

次のファイルが作成される。

```CalculatorTest.kt
package com.example.calc03

import org.junit.jupiter.api.Assertions.*

class CalculatorTest {

    @org.junit.jupiter.api.Test
    fun add() {
    }
}
```

次のように改造する

```CalculatorTest.kt
package com.example.calc03

import org.junit.Test
import org.junit.jupiter.api.Assertions

class CalculatorTest {

    @Test
    fun add() {

val calculator = Calculator()
        Assertions.assertEquals(5, calculator.add(3, 2), "1 + 1 should equal 2")
    }
}
```

## テスト

結果

```text
Tests passed
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8cb439aa-f3a0-8dca-7b32-5cf13a793eab.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0c87d185-011e-3873-6655-8ad9f240f48e.png)

## テストを失敗させる

次のように改造

```CalculatorTest.kt
(省略)
Assertions.assertEquals(6, calculator.add(3, 2), "1 + 1 should equal 2")
(省略)
```

```text
Tests failed
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5ca44abb-a573-25bc-4932-1758f0fbb29b.png)
オブジェクト存在チェックメソッド5つの違いを徹底解説

# オブジェクト存在チェックメソッド5つの違いを徹底解説
この記事では、`.nil?`, `.empty?`, `.blank?`, `.present`, そして `.presence` のそれぞれの使い方と違いについて説明していきます。


## 1. `.nil?`

`.nil?` メソッドは、オブジェクトが `nil` かどうかを判定します。`nil` であれば `true` を返し、それ以外の場合は `false` を返します。つまり、オブジェクトが何も参照していないかどうかを確認するためのメソッドです。

```ruby
value = nil
value.nil?  # => true

number = 10
number.nil?  # => false
```

## 2. `.empty?`

`.empty?` は、オブジェクトが空であるかを判定するためのメソッドです。例えば、文字列の場合、中身が空であれば `true` を返します。

```ruby
empty_string = ""
empty_string.empty?  # => true

full_string = "Hello!"
full_string.empty?  # => false
```

## 3. `.blank?`

`.blank?` は、オブジェクトが「何もない」状態を判定します。`nil?` が `true` であるか、または `.empty?` が `true` である場合、`.blank?` は `true` を返します。

```ruby
empty_string = ""
empty_string.blank?  # => true

nil_value = nil
nil_value.blank?  # => true

non_empty_string = "Hello!"
non_empty_string.blank?  # => false
```

## 4. `.present`

`.present` は `.blank?` の逆です。オブジェクトが空でないかを確認します。`.blank?` が `true` の場合、`.present` は `false` を返し、その逆も同様です。

```ruby
empty_string = ""
empty_string.present?  # => false

non_empty_string = "Hello!"
non_empty_string.present?  # => true
```

## 5. `.presence`

`.presence` は、値が存在する場合はその値自身を、存在しない場合は `nil` を返します。主に `nil` を排除する際に使用されます。

```ruby
empty_string = ""
empty_string.presence  # => nil

non_empty_string = "Hello!"
non_empty_string.presence  # => "Hello!"
```

---

これらのメソッドを使いこなすことで、プログラムをより効率的に記述できます。各メソッドの特性を把握することで、データの有無や空状態を正確に判断し、適切な処理を行うことができます。
Java で Sliding Window処理

# 動機
（時）系列処理とかでしばしば利用するSliding Window処理をJavaでやりたい。
SQLだと標準で（大半の実装で？）Window関数があるので悩まなくていいのですが、Javaでは無いので本記事を記載します。

[StackOverflow](https://stackoverflow.com/questions/34158634/how-to-transform-a-java-stream-into-a-sliding-window)にコードはあったのですが、Listでデータを持ってしまっているか、ライブラリを使っているかのどちらかでした。

引用させて頂くと以下のような感じ。
> ```java
> public static <T> Stream<List<T>> sliding(List<T> list, int size) {
>    if(size > list.size()) 
>        return Stream.empty();
>    return IntStream.range(0, list.size()-size+1)
>                    .mapToObj(start -> list.subList(start, start+size));
>}
> ```

このコードの気に入らない点は一つだけです。パラメータがListなところです。これだとメモリの消費が大きくなってしまう場合があります。

# コード
特段、工夫せずに素直に書き直しました。

```java
public static <T> void sliding(Stream<T> stream, int size, Consumer<List<T>> consumer) {
	Iterator<T> itr = stream.iterator();
	List<T> buffer = new LinkedList<T>();
	while (itr.hasNext()) {
		buffer.add(itr.next());
		if (buffer.size() > size)
			buffer.remove(0);
		consumer.accept(buffer);
	}
}
```

## 動作確認

呼び出しの例は以下のような感じです。

```java
sliding(Stream.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 3, System.out::println);
```

### 実行結果
上記の実行結果は、以下のような感じです。

```shell
[0]
[0, 1]
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
[8, 9, 10]
```

# 参考資料
[StackOverflow - How to transform a Java stream into a sliding window?](https://stackoverflow.com/questions/34158634/how-to-transform-a-java-stream-into-a-sliding-window)
データベースの用語

データベース、SQLについて学習した為、備忘録として残します。
## データベースとは
一定の形式で整理されたデータの集まり。

:::note info
データベース化する利点
・複数のデータの管理ができる
・データの検索、抽出が簡単
・データの編集や加工をして使用することができる
:::
こんな便利なデータベースはDBMS(Data Base Management System)を使用して管理されている。
### DBMS(Data Base Management System)とは
その名の通り、データベースを管理するシステムのこと。
データベースの検索・整理を専門とするソフトウェア。
大きく２つに分類される。
#### 1. RDBMS(Relational DataBase Management System)
こちらもその名の通り、リレーショナルデータベースを管理する。
RDBMSではSQLという専用の言語を使用して、
・データの検索
・別テーブルの情報を結合
などの操作を行うことができる。

:::note info
リレーショナルデータベースとは
「テーブル」といわれる表形式の構造でデータを管理し、テーブルごとに関連性のあるデータが保存されている。
「テーブル」は**列**と**行**で構成されている。
この列を「カラム」、行を「レコード」と呼ぶ。また、レコードの中の1つの項目に相当するのが「フィールド」
:::

リレーショナルデータベース例
|商品番号|商品名|値段|
|:----:|:----:|:----:|
|1|りんご|150円|
|2|みかん|80円|
|3|バナナ|100円|
#### 2. NoSQL
「Not Only SQL」の略。RDBMSとは違い、非リレーショナルなデータベースを管理するシステム。名前の通り、SQLを使用しない。

RDBMSとNoSQLはどちらが優れているというわけではなく、得意分野が違うというイメージ。
Langchainを使って、メール（Gmail）を管理してくれるChatbotを作る

LangchainのToolkitsには、メールを管理するためのツール（GmailToolkit）があります。
これをGoogleのGmail APIとLLMと組み合わせることで、Langchainを介してLLMがメールの内容を確認し、メールに関する質問に答えられるようになります。
少し面倒ですが、色々試してようやく質問ができる状態が整いました。

質問を２つ用意して試してみました。

## 問1
まずGmailを簡単に確認したところ、最新のメールは"ドミノピザ"からだったので、"今日ドミノピザからメール来ましたか？内容を100字以内にまとめてください"という質問を投げてみました。(中国語で)
回答は以下となります。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/44eb4067-a97c-c8a2-cb23-499b7e0b38de.png)


なかなかいい回答ができました。


## 問2
「MediumDailyDigest」というサイトを購読していて、そこから毎週長い通知メールが届きます。今週の内容について聞いてみました。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/89824fce-3cad-fcca-4782-29177beb0e84.png)

いい感じにメールから情報を抜き出し、回答生成できていますね。

今回はGmailの読み取り機能のみを試しましたが、APIに書き込み権限を設定すれば、メールの作成や自動回答も可能になります。
トークンをクエリパラメータとリクエストヘッダーのどっちに書くのが安全か？

## 結論
- リクエストヘッダーに書く方が安全。リクエストヘッダーに書くと、https通信において暗号化される。

## 経緯
- chatworkのapiのページを見ていたら、「・・・APIトークンはURLのクエリーストリングではなく必ず HTTPリクエストヘッダ で送信するようにしてください。」との説明があった。
  - https://developer.chatwork.com/docs/endpoints

## Chat GPT先生に聞いてみた
- 最近はGoogle先生よりも、Chat GPT先生の方が良い答えを出してくれるので、Chat GPT先生の回答を書いておきます。

### Chat GPTへの質問
- クエリパラメータに書くとセキュリティ的に良くないので、リクエストヘッダーに書くべきと言われたが、通信最中に読み取られる危険性は、クエリパラメータに書く場合と、リクエストヘッダーに書く場合でどのようにちがうのか？

### Chat GPTからの回答
- アクセストークンをクエリパラメータに含める場合とリクエストヘッダーに含める場合、セキュリティの観点からそれぞれ異なる利点と懸念事項が存在します。以下に、それぞれのアプローチの比較を提供します。

#### アクセストークンをクエリパラメータに含める場合:

- 利点:

- 簡単にデバッグ可能: ブラウザのアドレスバーなどでトークンを直接表示でき、デバッグが容易です。
- キャッシュされない: 一般的に、クエリパラメータはブラウザにキャッシュされないため、セキュアな情報を格納するのに適しています。
- 懸念事項:

  - URLがログに記録される: アクセストークンがURLに含まれるため、サーバーログやブラウザの履歴などに記録される可能性があり、セキュリティリスクとなります。
リファラ情報: 他のウェブサイトにリンクされた場合、アクセストークンがリファラ情報に含まれる可能性があります。

#### アクセストークンをリクエストヘッダーに含める場合:

- 利点:

- より安全: アクセストークンがリクエストヘッダーに含まれるため、URLやリファラ情報に含まれません。
- セキュアな通信: HTTPSを使用して通信する場合、リクエストヘッダー内のデータは暗号化され、盗聴者からの保護が得られます。
- 懸念事項:

  - ヘッダー内の情報: リクエストヘッダーは通信の一部として送信され、中間者攻撃などのセキュリティリスクに対処する必要があります。
  - アクセストークンをリクエストヘッダーに含める方法は、セキュリティの観点から一般的により安全です。HTTPSを使用して通信することで、データが暗号化され、セキュリティが向上します。ただし、セキュリティに対する注意が必要であり、適切なセキュリティ対策を講じることが重要です。また、アクセストークンの管理とリフレッシュも考慮する必要があります。
Rails初心者によくあるエラーとその解決策

# Rails初心者によくあるエラーとその解決策

Railsを使い始めると、初心者がよく遭遇するエラーがいくつかあります。これらのエラーは、基本的な概念やフレームワークの理解が不足していることが原因で発生することが多いです。

## 1. NoMethodError
**エラー内容:** `NoMethodError`は、存在しないメソッドを呼び出そうとしたときに発生します。

**解決策:** よくある原因は、メソッド名のスペルミスや、メソッドが定義されていない場合です。クラスやインスタンスに定義されているかを確認し、正しいメソッド名を使用しているかをチェックしましょう。

## 2. ArgumentError
**エラー内容:** `ArgumentError`は、メソッドが予期しない数の引数を受け取ったときに発生します。

**解決策:** メソッドが期待する引数の数や型を確認し、それに合わせて引数を渡す必要があります。メソッドの引数の数や種類が適切かを確認しましょう。

## 3. SyntaxError
**エラー内容:** `SyntaxError`は、構文エラーがある場合に発生します。

**解決策:** コードをよくチェックし、括弧の対応やクォーテーションの閉じ忘れ、キーワードのスペルミスなど、構文エラーがないかを確認しましょう。

## 4. Undefined Method in Views
**エラー内容:** ビューで定義されていないメソッドを使用しようとすると、`undefined method`のエラーが発生します。

**解決策:** ビューでは、コントローラーから渡されるインスタンス変数やヘルパーメソッドを使用するため、それらが正しく定義されているかを確認しましょう。

## 5. ActiveRecord::RecordNotFound
**エラー内容:** レコードが見つからない場合に発生するエラーです。

**解決策:** `find`メソッドや`find_by`メソッドを使ってレコードを検索する際、そのIDや条件に合致するものが存在するかを確認しましょう。

## まとめ
これらのエラーは、初心者にとっては混乱を招くことがありますが、正しいデバッグや問題解決の手法を身につけることで、Railsでの開発スキルを着実に向上させることができます。
rex0220 関連レコード集計プラグイン 担当別売上集計

[関連レコード集計プラグイン](https://qiita.com/rex0220/items/8cbe764670b0e6431a42)で担当別売上集計を行ってみます。

# 概要
売上管理アプリから売上集計アプリへ、担当者別に売上金額を集計します。
売上管理アプリのレコード追加・更新・削除時に、自動集計します。
売上管理アプリの一覧で、ボタンクリックにより対象レコードを集計できます。

主担当・責任者は、必須で別の社員であることが前提
主担当・責任者に下記の比率で集計します。

- 主担当：売上金額の30%
- 責任者：売上金額の70%

![2023-11-12_18h30_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5007efad-04ed-e94b-8ddb-7e35639fd9a6.png)

# 一括集計の操作例
売上管理アプリの一覧で、ボタンクリックで一括集計
![2023-11-13_09h36_29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c8afb1e2-9a43-43c4-4a27-0e62fbc2dd9b.gif)

# レコード追加時の集計処理
売上管理アプリのレコード追加・編集・削除時に、集計処理が実行されます。
![2023-11-13_09h41_03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ceeba61f-66cb-73aa-2076-149c4ba2710d.gif)

- 売上集計アプリの集計結果
![2023-11-13_09h44_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3d50f854-8155-bb08-1cd8-354b0586c692.png)

# 売上管理アプリ
売上月・会社別に売上金額を入力
- 主担当・責任者は、必須で別の社員であることが前提
![2023-11-12_18h37_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a470c167-b110-0294-e481-ef48b0cb526a.png)

# 売上集計アプリ
売上月・担当者別に主担当金額・責任者金額を集計
金額合計は、計算項目で、主担当金額+責任者金額
![2023-11-12_18h38_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/90e262b3-aa03-479f-dd91-c171e2f3bc3f.png)

# 関連レコード集計プラグインの設定
主担当分と責任者分を分けてアプリ集計を設定します。
![2023-11-12_18h36_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9c3327f4-a7b4-9174-e301-e4808b3e9802.png)

## ボタン別設定
CSV 読み込みやAPIによるレコード追加・更新等で、関連レコード集計プラグインが動作しない場合に、一覧画面からボタンクリックで集計処理を実行
![2023-11-12_18h42_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/54828074-0509-d462-b529-a275647f4985.png)

## 主担当の集計項目
- 「集計先レコードが無ければ追加」をチェック
![2023-11-12_18h36_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9a6701f1-4266-b1ae-e842-9cfd60e6eb1c.png)

## 責任者の集計項目
- 「集計先レコードが無ければ追加」をチェック
![2023-11-12_18h36_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3613a335-dac9-8d5c-ad1c-5f054f619445.png)

# 項目検証プラグインによるチェック
主担当・責任者は、必須で別の社員であることをチェックします。
![2023-11-12_23h16_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/331021d6-7750-1d08-175e-e52a5fec04d6.png)

## 項目検証プラグインの設定
![2023-11-12_23h13_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ac4ec598-7454-56a7-e3d4-ea53455f1a4c.png)

## 主担当のチェック
![2023-11-12_23h13_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7574f5e6-c26a-f804-4a71-f05aa9b653c2.png)

## 責任者のチェック
![2023-11-12_23h14_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/47eb17d8-8df4-cf66-25dc-a6d6b1e2a1d5.png)
【package-lock.json】【初心者むけ】コンフリクトの解消方法

## はじめに
gitを活用して複数人で開発を行っているおり、pull requestを出したときに`package-lock.json`のコンフリクトが起きてしまった事がありました。
`package-lock.json`のコード量はとても多いため、`package-lock.json`をエディタで開いて修正を行おうとすると、全てを確認してコンフリクトの解消を行うのは大変だし間違いも起きやすくなってしまいます。
実際に私もコンフリクトの解消に時間がかかってしまって苦労した経験がありました。

そんな中、もっと`package-lock.json`のコンフリクトの解消を楽に行える方法を知る事ができたので、記事として残したいと思い書く事にしました。

とても初歩的な事だと思うのですが、少しハマってしまったので同じように時間を無駄にしてしまう人を減らすために記事にしてみました。

## package-lock.jsonのコンフリクト解消方法
`package-lock.json`のコンフリクトの解消方法の解消の仕方はとても簡単で、`package.json`の中身をmainブランチと同じ内容にして、下記のコマンドを実行するだけです。
```
npm i
```
このコマンドを実行することよって、`package-lock.json`の中身もmainブランチと同じ中身になりコンフリクトが解消されます。
aptコマンド

- ```apt```
    - インタラクティブ(プログレスバーなどが出る)
- ```apt-get```
    - インタラクティブでない
    - (シェルやdockerなどに使う)

- ```apt-get install``` 
    - パッケージのインストール

- ```apt-get update``` 
    - インストール可能パッケージの**一覧**を更新
    - 実際のパッケージには触らない
    
- ```apt-get upgrade```
    - 上で更新されるインストール可能パッケージ一覧を元に実際にパッケージを更新する。

- ```dpkg -l```
    - インストール済パッケージを一覧表示
【Android】Headerを設定したListViewから任意のAdapterを取得する方法

# はじめに
リスト系の表示はAndroidViewではほぼ、RecyclerViewを使うのが一般的だと思いますが、ListViewというものもあるのをご存知でしょうか？
正直新しく実装することになった画面などの場合は、ListViewを使用して実装する必要はほぼないかと思います。
ただし、古いプロジェクトだと諸々の理由によりListViewがまだ息をしていることもあると思います。
今回はそんな状況において現状でもListViewを触らなければならない方向けに、ListViewにHeaderを設定している際に任意のAdapterを取得する方法をまとめておこうと思います。

# 任意のadapterの取得方法
RecyclerViewの場合はViewTypeなどを指定する形でヘッダーを実装可能だと思いますが、ListViewの場合はヘッダーを設定する関数を備えています。
この違いにより、任意のadapterを取得する方法が異なっているため注意が必要です。

```main.kt
val headerViewListAdapter = binding.listView.adapter as HeaderViewListAdapter
val adapter = headerViewListAdapter.wrappedAdapter as ListViewAdapter
```
取得方法としては以上になりますが、ListViewの場合Headerを設定していると、設定したAdapterがHeaderViewListAdapterへラップされる仕組みとなっています。
その為、Adapterに設定した任意のAdapterを取得したい場合は、HeaderViewListAdapterが抱えているwrappedAdapterを操作する必要があります。

Headerを簡単に設定できるのは一つ強みであるListViewですが、現状非推奨にはなっていないものの、正直古い設計と呼ばざるおえません。
また、RecyclerViewの方がより柔軟で最適化された機能を提供しているのは明白なので、できる限りRecyclerViewを使うことをお勧めします。

# さいごに
ListViewを見ていると、現状の最新であるComposeとの違いを比べてしまい、より一層古さを感じてしまいますね、、、。
これも一つ歴史なんだと思いますが、少しずつでも最新に追随できるように調整を進めていくのが良いと思います。
snykを使ってみる

# 書いていること
簡単な概要とWeb UIを使ってのスキャンとその結果のみです。
間違っていたらご指摘ください。

# What is Snyk
Snykはソースコード、依存のオープンソース、コンテナイメージ、IaCの設定の脆弱性をスキャンし優先順位をつけ修正するサービス。

## 提供サービスたち
それぞれ役割がある様です。
- [Snyk Open Source](https://docs.snyk.io/scan-using-snyk/snyk-open-source): オープンソースのスキャン
- [Snyk Code](https://docs.snyk.io/scan-using-snyk/snyk-code): 自分のソースコードのスキャン
- [Snyk Container](https://docs.snyk.io/scan-using-snyk/snyk-container): コンテナイメージのスキャン
- [Snyk Infrastructure as Code](https://docs.snyk.io/scan-using-snyk/scan-infrastructure/scan-your-iac-source-code): IaCの設定のスキャン
    - [IaC+](https://docs.snyk.io/scan-using-snyk/scan-infrastructure/iac+-code-to-cloud-capabilities): AWS account, Azure subscriptionの設定ミスのスキャン(?)

## 選べる実行環境
4つの方法が提供されている
- Web
- CLI
- IDE
- API

## サポート
### 言語
主流の言語は大体サポートされています。
[ Supported languages and frameworks.](https://docs.snyk.io/scan-using-snyk/supported-languages-and-frameworks)

### OS
[Supported operating system distributions](https://docs.snyk.io/scan-using-snyk/snyk-container/how-snyk-container-works/supported-operating-system-distributions)

### IaC
Terraformに加えて、k8s manifestやHelm Chartもある模様。
[Supported IaC languages, cloud providers, and cloud resources](https://docs.snyk.io/scan-using-snyk/scan-infrastructure/supported-iac-languages-cloud-providers-and-cloud-resources)

## インテグレーション
かなり数が多いので割愛。
[Integrate with Snyk](https://docs.snyk.io/integrate-with-snyk)

## プラン
気になるお値段は...
[Snyk Pricing Plans](https://docs.snyk.io/more-info/plans).

|プラン  |月額 |
|---|---|
|Free |$0 |       
|Team |$52 |
|Enterprise | お見積もり |

EnterpriseでもIaC, Containerのスキャンには上限があるとのこと。
インサイトやレポートはEnterpriseのみの提供。

## How Snyk handles your data
企業の人は大事。
[How Snyk handles your data](https://docs.snyk.io/more-info/how-snyk-handles-your-data).

Snykはユーザーの以下の情報を**保管します。**
これらは一般的なデータで、製品(Snyk Code等)固有のデータもありますのでリンクを一読することをお勧めします。
- 脆弱性のソースコードおよびデータ
- Snykをセットアップするのに必要なデータ(トークン等)
- ユーザー名、email, IPアドレス等
- 請求に必要なデータ
- 実行されたCLIコマンドなどのユーザー行動

# スキャンしてみる
簡単のためSnyk Open Sourceのみ紹介します。
**Snykアカウント作成済み**の状態から説明します。

## スキャン対象のコード
個人で作成した[snyk-sandbox](https://github.com/naruse666/snyk-sandbox/tree/main/gin)を使います。

内容はgolangの[gin](https://github.com/gin-gonic/gin)というwebフレームワークの簡単なコードです。
現在の最新は`v1.9.1`ですが、テストのため`v1.8.0`を使用してみました。

## スキャン対象の設定
DashboardのAdd Projectから以下の画面が出てくるので、対象リポジトリとパス、スキャン対象外のディレクトリを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/3d09f6eb-725f-c1b3-3f82-0737d3b5ea48.png)

## 結果
### Snyk Open Source
ダッシュボードに結果が出てきました。ginの検出内容を覗いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/445bc885-553f-3a54-bbbf-d4b135350bea.png)


スコア付けとCVE等、fixされたバージョンが出てきました。
結構見やすい印象。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/11e3c3da-0571-68eb-5ef9-d459881c0cdd.png)

### その他
スキャンの設定をしているリポジトリにPRを上げると自動でスキャンしてくれる。
このようなアイコンでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/1f288b62-e41d-c34a-0f46-a04c2c89e49b.png)
Ubuntu Server 22.03でWi-Fiに接続する

# Ubuntu Server 22.03でWi-Fiに接続する方法
**ネットワークインターフェースの確認**
まず、使用しているマシンでWi-Fiに接続可能なネットワークインターフェースが存在するのか、認識されているのかを確認します。
`ip link show`のコマンドで利用可能なネットワークインターフェースの一覧を取得します。

以下が実行結果
```shell
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether c8:5b:76:22:06:83 brd ff:ff:ff:ff:ff:ff
3: wlp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
    link/ether e4:b3:18:7e:05:63 brd ff:ff:ff:ff:ff:ff
```
実行結果から3つのネットワークインターフェースがあるのがわかります。
- 1: `lo`はループバックインターフェースでIPv4では127.0.0.1、IPv6では::1が割り当てられます。
　システム内部での通信を可能にするための仮想的なインターフェースです。
　localhostにアクセスすると、このループバックインターフェースを通じて処理されます。
- 2: `enp0s31f6`は有線のネットワークインターフェースです。prifixのenはEthernetを意味しています。
- 3: `wlp4s0`は無線のネットワークインターフェースです。prefixのwlはWirelessを意味しています。

無線のネットワークインターフェースがあることを確認できました。

**ネットワーク設定の編集**
/etc/netplanはネットワーク設定を管理するためのファイルとディレクトリが格納されている場所です。
そちらに移動して、既存のファイルの一覧を確認します。
```shell
~$ cd /etc/netplan/
/etc/netplan$ la
total 8
-rw------- 1 root root 216 Nov  9 22:51 00-installer-config-wifi.yaml
-rw-r--r-- 1 root root 120 Nov  9 22:34 00-installer-config.yaml
```
00-installer-config-wifi.yamlというファイルがWi-Fiの設定を管理しています。
このファイルを編集していきます。
```shell
/etc/netplan$ sudo vim 00-installer-config-wifi.yaml
```
（うろ覚えですが、初めて開いた時はこんな感じでした。）
```vim
# This is the network config written by 'subiquity'
network:
  version: 2
  wifis:{}
```
以下を入力し、保存します。
- 使用しているマシンの無線のネットワークインターフェース（今回はwlp4s0）
- 接続したいWi-Fiの名前
- 接続したいWi-Fiのパスワード
```vim
# This is the network config written by 'subiquity'
network:
  version: 2
  wifis:
    wlp4s0:
      dhcp4: true
      optional: true
      access-points:
        your_wifi_network_name:
          password: "your_wifi_password"
```
ℹ️passwordの""を忘れないように!

**設定の適用**
以下のコマンドで設定を適用します。
```shell
sudo netplan apply
```

**接続の確認**
Wi-Fiに正常に接続されているかを確認するには、次のコマンドを実行します
```shell
ip a
```
これにより、アクティブなインターフェースとそのIPアドレスが表示されます。
mySQL学習目録

## データベースとは

大量の情報を保存し、コンピューターから効率良くアクセス出来るように加工したデータの集まりのこと

## DBMSとは


DBMS=データベースマネジメントシステム
多人数でデータを安全に共有することができる。高度なプログラミング知識がなくても扱える


## RDBMSとは

RDBMS=リレーショナルデータベースマネジメントシステム
「関係データベース」とも呼ばれ、現在最も広く利用されているデータベース
列と行からなる二次元表の形式でデータを管理している
・Oracle Datebase
・MySQL
・PostgreSQL

## SQLとは

RDBMSにどんなデータを送って欲しいのか、どこのデータをどのように書き換えてほしいのかを指示する


## テーブルとは


列と行で管理している二次元表の形式をテーブルという
リレーショナルデータベースはデータをテーブルで管理している

## カラムとは

テーブルの列（縦）のことをカラムと呼ぶ
テーブルに保管するデータ項目を表している

## レコードとは

テーブルの行（横）のことをレコードと呼ぶ
リレーショナルデータベースでは、必ず行単位でデータを読み書きする

## クエリとは

管理システムに対する問合せ（処理要求）のこと
データの抽出や更新などの処理要求を文字列で表す。処理対象のテーブルやデータの抽出条件、並べ方などを指定する。
##