OmniAICreator/Qiita-1.07M huggingface dataset:
基本情報技術者試験の擬似言語とPHPの比較

# 1. はじめに

この記事では、基本情報技術者試験で用いられる擬似言語と、PHPを比較した表を記載します。今までPHPに触れたことがあり、擬似言語（基本情報のアルゴリズム）をこれから学び始める方は、参考になるかもしれません。

# 2. 擬似言語とは

基本情報技術者試験科目B試験では、架空のプログラミング言語である擬似言語が使われる。 この擬似言語は、様々なプログラミング言語の構文を寄せ集めたような表記方法となっている。オブジェクト指向プログラミングの採用しており、実務に近いプログラミングの問題が出題される。

# 3. 擬似言語の記述形式

IPA（独立行政法人 情報処理推進機構）が公開している擬似言語の記述形式は下記の通り。試験問題にも記載されている。

![擬似言語の記述形式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935364/db0fce09-c7c8-c20d-8cff-6c613aae9c64.png)

# 4. 擬似言語とPHPの比較

![擬似言語とPHPの比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935364/144d8b12-e269-d36d-08f7-2f3113dd77af.png)
[VMware Tools の再インストール]ができないときの対処法

# 環境
```
VMware(R) Workstation 16 Player
16.2.3 build-19376536

# ゲストマシン
Ubuntu 22.04.3 LTS \n \l
# ホストマシン
Windows 10 Home
```

# 現象
ホストマシンからVMware Workstation Playerにインストールしたubuntu(ゲストマシン)にコピペしようとしたら、出来ない。
VMware Toolsをインストールしようにも、 [Player] > [管理] > [VMware Tools の再インストール]となっており、[VMware Tools の再インストール]がグレーアウトされて、再インストール出来ない。
![スクリーンショット 2024-01-07 141851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697344/f078a2b2-b48f-ace1-a031-a9c281e19734.png)

# 原因
不明。

# 経過
ホストマシンの
{VMwareインストール先}\VMware Player配下の linux.iso をubuntuにコピーする。
　{VMwareインストール先}の例 D:\Program Files (x86)\VMware 
linux.isoでVMware Toolsのインストールをする。
コピーはGoogleDrive経由なりネットワークフォルダ経由なりで行う。

コピーしたら、
linux.isoをダブルクリックで開いて、
中身のVMwareTools-*.tar.gzを展開する。
展開先に移動して、vmware-install.plを端末で実行する。
```
sudo perl vmware-install.pl
```

さらに、以下のコマンドを実行する。
```
sudo apt update
sudo apt install open-vm-tools
sudo apt update
sudo apt install open-vm-tools-desktop
```
ubuntuを再起動する。

以上で、コピペできるようになった。

# 感想
[VMware Tools の再インストール]になっていたのは、過去にインストールしていたからだと思います
(覚えていないが、インストールしたはず)。
コピペも出来ないし再インストールもできないので困りましたが、解決できて良かったです。
open-vm-tools*のインストールだけでは、解決できない方は試してみて下さい。

# 参考
https://shigeo-t.hatenablog.com/entry/2021/06/20/050000

https://kb.vmware.com/s/article/1003910?lang=ja
paizaラーニング解答: データセット選択メニュー[Ruby]

# データセット選択メニュー
https://paiza.jp/works/mondai/data_structure/problem_index?language_uid=ruby

この問題集にチャレンジする前にハッシュ（辞書）と集合について学んでおくことをお勧めします。
## STEP: 1 ランダムアクセス
```ruby
n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
puts a[m - 1]
```

## STEP: 2 複数回のランダムアクセス
```ruby
n = gets.to_i
a = gets.split.map(&:to_i)
q = gets.to_i
b = gets.split.map(&:to_i)
b.each do |i|
    puts a[i - 1]
end
```

## STEP: 3 最大値と最小値
```ruby
a, b, c = gets.split.map(&:to_i)
puts [a, b, c].max - [a, b, c].min
```

## FINAL問題 動的配列
```ruby
n, q = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
q.times do
    query = gets.split.map(&:to_i)
    if query[0] == 0
        a << query[1]
    elsif query[0] == 1
        a.pop
    else
        puts a.join(' ')
    end
end
```

## STEP: 1 とても大きな数値の入力
```ruby
puts gets.chomp
```
文字列型で処理しています。
## STEP: 2 とても小さな数値の入力
```ruby
puts gets.chomp
```

## FINAL問題 文字列の配列
```ruby
h, w, r, c = gets.split.map(&:to_i)
maze = []
h.times { maze << gets.chomp.split('') }
if maze[r - 1][c - 1] == "#"
    puts "Yes"
else
    puts "No"
end
```
迷路の2次元配列mazeを作って処理。
## STEP: 1 数値の出現率
```ruby
n = gets.to_i
counters = {}
(0..9).each do |i|
    counters[i] = 0
end
array = gets.split.map(&:to_i)
array.each do |i|
    counters[i] += 1
end
puts counters.values.join(' ')
```
今回はハッシュで処理しました。
## STEP: 2 英小文字の出現率
```ruby
n = gets.to_i
s = gets.chomp
# デフォルト値0でハッシュを作成することでsに含まれない文字はカウント0になる
count = Hash.new(0)

s.each_char do |char|
  count[char] += 1
end

puts ('a'..'z').map { |char| count[char] }.join(' ')
```

## STEP: 3 文字列の出現率
```ruby
n = gets.to_i
count = Hash.new(0)
n.times do
    s = gets.chomp
    count[s] += 1
end
# ハッシュをsortすることで二次元配列になる
count = count.sort
count.each do |s, a|
    puts "#{s} #{a}"
end
```

## STEP: 4 価格の算出
```ruby
n, m = gets.split.map(&:to_i)
hash = Hash.new(-1)
n.times do
    a, b = gets.chomp.split
    hash[a] = b
end
m.times do
    s = gets.chomp
    puts hash[s]
end
```

## FINAL問題 商品の検索
```ruby
n, q = gets.split.map(&:to_i)
hash = Hash.new(-1)

(1..n).each do |i|
    s = gets.chomp
    unless hash.key?(s)
        hash[s] = i
    end
end

q.times do
    t = gets.chomp
    puts hash[t]
end
```
ポイントはunlessでハッシュに登録するか否かのルールを考えること。
## STEP: 1 集合の探索
```ruby
n, b = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
puts a.include?(b) ? "Yes" : "No"
```
シンプルな式なら三項演算で分かりやすく。
## STEP: 2 重複の削除
```ruby
n = gets.to_i
a = gets.split.map(&:to_i)
puts a.uniq.join(' ')
```

## STEP: 3 重複の判定 1
```ruby
n = gets.to_i
a = gets.split.map(&:to_i)
array = [a[0]]
(1...n).each do |i|
    puts array.include?(a[i]) ? "Yes" : "No"
    array << a[i]
end
```

## STEP: 4 重複の判定 2
```ruby
n = gets.to_i
a = gets.chomp.split
array = [a[0]]
(1...n).each do |i|
    puts array.include?(a[i]) ? "Yes" : "No"
    array << a[i]
end
```

## FINAL問題 集合の結合
```ruby
n = gets.to_i
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
puts (a + b).uniq.sort.join(' ')
```
1 ≦ A_i, B_i ≦ 1,000,000,000 (1 ≦ i ≦ N)ですが処理時間は問題ありませんでした。
yamlの基本を学ぶ


# yaml入門

YAML (YAML Ain’t Markup Language) とは、意味的は**わかりやすいデータ シリアライズ (serialize) という言語** という言葉になります。

設定ファイルの記述に使用されることが多く、あらゆるプログラミング言語に対応し、よく使われています。

YAML では、エンジニアにとっての使いやすさが重視されて書かれています。

YAMはJSONと違う点は、**改行とインデント** が明確な意味を持ちます。

YAML は形式的に、設定するものに関して適しています。

## YAML の書き方

YAML ファイルの基本構造は、キーと値を組み合わせるだけです。

> キー : 値

### スカラー

YAMLは、数字や文字列、真偽値など基本的な値を表現できます。

```yaml
version: 2.0
author: "taihong"
rank: 5
visible : false
```

### シーケンス

YAMLは要素の集合をシーケンスで表現できます。

```yaml
prefecture:
 - tokyo
 - osaka
 - aichi
 - fukuoka
```

### マッピング

YAMLは、key:value型のコレクションをマッピングとして表現できます。

```yaml
 prefecture:
  tokyo: 13
  osaka: 27
  aichi: 23
  fukuoka: 40
  
```
認証と認可についてまとめてみた


## はじめに
RailsでJWTを使用するに認証と認可の違いについて調査したため、基本的な情報をまとめます。

## 認証と認可について
### 認証（Authentication）
認証は、ユーザーが彼らが主張する人物であることを確認するプロセスです。
アクセスを試みる個人が彼ら自身であることを証明するために必要です。

### 認可（Authorization）
認可は、認証されたユーザーがアクセスできるリソースや実行できるアクションを決定するプロセスです。
認証に成功した後、システムはユーザーの権限をチェックして、彼らが特定のファイルにアクセスしたり、特定の操作を実行したりできるかどうかを決定します。

図で表すと以下のようなイメージです。
青色部分が認証、紫部分が認可を表しています。

```mermaid
sequenceDiagram
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#6A7FAB','primaryTextColor':'#FAFBF9','primaryBorderColor':'#6A7FAB','lineColor':'#6A7FABCC','textColor':'#000000','fontSize':'20px'}}}%%

    participant Client
    participant Server
    participant DB
    
    rect rgb(191, 223, 255)
    note left of Client: 認証
        Client->>Server: ログイン(ユーザー情報を含む)したい！
        Server->>DB: DBにユーザー情報ある?
        DB->>Server: ユーザー情報あったよ!
        Server->>Server: トークン生成するよ！
        Server->>Client: トークンあげる!
        Client->>Client: トークン localstorageに保存!
    end

    rect rgb(200, 150, 255)
    note left of Client: 認可
        Client->>Server: リクエスト(トークン含む)
        Server->>Server: トークン検証するよ!
        Server->>Server: 検証問題なかったよ!
        Server->>DB: Clientがリクエストしてるデータ欲しい！
        DB->>Server: あげる！
        Server->>Client: ポジティブレスポンス!(DBからのデータを含む)
    end

```

## まとめ
認証と認可は似たような概念で理解しづらい部分がありますが、ログイン時とログイン以外のリクエスト時で違いがあることがわかりました。
【GitHub】2要素認証の有効無効を切り替える

GitHubにログインする。

右の自アイコンをクリック、『設定』をクリックして設定画面に遷移する。

![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/ec142925-46ec-73a2-ef2c-ac05c680fdbe.png)


設定画面の、左セクションにある『Password and authentication(パスワードと認証)』をクリック。


![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/365861fc-e266-9270-de67-242a86897690.png)




右セクションをスクロールダウンすると、下の方に『Two-factor authentication』がある。
ここで、有効無効の切り替えができる。


![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/20ec15dc-6fe9-b7a1-8047-8128cf4e0106.png)



※無効化の場合は、右側に「…」ボタンがあるので、これをクリックすると切り替えができる。

以上。
Java初心者の失敗メモ

私がJavaの学習中に引っ掛かった内容を纏めています。
※内容は今後変更・追記する可能性があります。
　

・エラー： 構文解析中にファイルの終わりに移りました

正

	public static void main(String[] args)
	{
			System.out.println("Hello!");			
	}



誤

	public static void main(String[] args)
	{
			System.out.println("Hello!");			


原因：｛｝の不足
☆プログラムが長くなると｛｝の数が合わなくなりがちになり発生する
　

・newの扱い
オブジェクトの作成で用いるコマンド。
☆配列の宣言にも必要だが忘れがち

 　
・static
クラス変数とクラスメソッドに用いる。
インスタンスと異なりオブジェクトに関連付けられていない。
☆クラス全体を管理する変数等で用いる。

  　
・エラー：InterruptedException 
原因：スレッド実行中の他スレッドによる割り込みの発生
☆スレッド内でsleepを使用した、joinを忘れた場合に発生しやすい。
→例外処理(try文)に入れておくととりあえず動かす事が出来る。
[初心者向け]はじめてのNext.js - ページの追加とルーティングの追加

こんにちは。Kaneyasuです。
先日からNext.jsとVercelを始めました。
前回分はこちら。

https://qiita.com/satoshi256kbyte/items/6821bd0d4de8aeb46201

今回は、ページの追加とルーティングの追加をやってみます。
手順を自分のような初心者の方向けに書き残しておくのでよろしければご覧ください。

# ページの追加

https://nextjs.org/learn/dashboard-app/creating-layouts-and-pages

参考はこちら。
bashで言うと、こんな操作です。

```bash
mkdir -p src/app/dogs
cat << 'EOF' > src/app/dogs/page.tsx
export default function Page() {
    return <p>Hello World!</p>;
}
EOF
```

`export default function Page()`の`Page`の部分は何でもいいようです。
関数名ではなくて、`export default`により、これがデフォルトで呼ばれる関数と示すことが大事なようです。
上記コマンドは、Next.jsのインストール直後、このようなディレクトリ構造を想定しています。

```bash
tree ./ -L 2 -I 'node_modules'
./
├── README.md
├── next-env.d.ts
├── next.config.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
├── src
│   └── app
├── tailwind.config.ts
└── tsconfig.json
```

ちなみに、作法を守ったファイル・ディレクトリを都度手で作るのは嫌だなあと思い、Ruby on Railsのscaffoldingのような専用コマンドはないかと思いましたが、調べた限りそのようなコマンドはないようです。
残念ですね。

# リンクの追加

https://nextjs.org/docs/pages/api-reference/components/link

`Link`コンポーネントを使います。
まずはTOPページにリンクを追加してみます。
TOPページのファイルは、`src/app/page.tsx`なので、中身を豪快に消して以下のように修正。

```tsx
import Link from 'next/link'

export default function Home() {
    return (
        <div>
            <Link href="/dogs">dogs</Link>       
        </div>
    )
}
```

# 画像を表示する

画像というか、静的ファイルは`public`フォルダに置くのが一般的の模様です。

https://nextjs.org/docs/pages/building-your-application/optimizing/static-assets

`public`フォルダに`shiba.png`を配置します。

```bash
tree ./ -L 2 -I 'node_modules'
./
├── README.md
├── next-env.d.ts
├── next.config.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
│   └── shiba.png
├── src
│   └── app
├── tailwind.config.ts
└── tsconfig.json
```

`Image`コンポーネントなどで`/shiba.png`と指定すると、`public/shiba.png`を探しに行きます。
画像を、先ほど追加したページに表示するようにします。
`Image`コンポーネントを使います。

https://nextjs.org/docs/pages/api-reference/components/image

```tsx
import Image from 'next/image'

export default function Page() {
    return (
        <div>
            <p>Hello World!</p>      
            <Image
            src="/shiba.png"
            width={500}
            height={500}
            alt="Picture of shiba"
            />
        </div>
    )
}
```

# ブラウザのタブに表示されるタイトルを変更する

`src/app/layout.tsx`を開き、Metadataを修正します。

```tsx
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import './globals.css'

const inter = Inter({ subsets: ['latin'] })

export const metadata: Metadata = {
  title: 'Create Next App', // ここの文字列がブラウザのタブに表示される
  description: 'Generated by create next app', // こちらはメタタグに表示される文字列
}

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body className={inter.className}>{children}</body>
    </html>
  )
}

```

Metadataのtitleを修正すると、ブラウザのタブの文字列が変わることを確認できます。
descriptionは、ブラウザの開発ツールでmetaタグを見ると確認できます。

![メタタグ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/5e7b9a5f-892e-322c-4d67-4ebdc308d64c.png)

# 次は

本記事はここまでです。
次は、FigmaからNext.jsのコードを出力して自分のプロジェクトに取り込んでみます。

https://qiita.com/satoshi256kbyte/items/af6f8abed3c059d95da9
[chrome]翻訳ポップアップを非表示にする手順

chromeブラウザ利用時、翻訳のポップアップ表示を無効化する手順をまとめる。

chromeブラウザのアドレスバー横にある「…」をクリック、『設定』を選択して設定画面に移動する。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/c5c5324b-e4bc-9c10-ec6d-08f69a6ae43a.png)


左セクションにある「言語」をクリックする。
右領域が言語の設定画面に切り替わるので、この領域を下方向にスクロールする。
『Google翻訳』にて、「Google翻訳を使用する」のOnOffの切り替えができる。

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/0a418cd0-8264-79cd-a5a1-6abe2b4421ad.png)


※もしも翻訳が必要な場合は、ブラウザのアドレスバー隣の「…」ボタンをクリック、『翻訳』ボタンをクリックすると、スポット的に翻訳できる。

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/0decf1eb-003d-4e16-1ab3-a1655e619680.png)


以上。
FE ストラテジ　ビジネスインダストリ

今日はストラテジ分野のビジネスインダストリです

### EC(Electric Commerce, eコマース)
- インターネット技術を活用したビジネスである「e-ビジネス」の一つで、ネットショッピングなどの電子取引のこと

### ECの取引形態
- 誰と取引を行うかによって取引形態が異なり、売り手と買い手の頭文字を使って表現
Consumer(個人)、Employee(従業員)、Business(企業)、Government(政府)
CtoC Btoc BtoB BtoE GtoC BtoB GtoG

### EDI(Electronic Data Interchange)
- 受発注、請求、支払など商取引に「関する情報を、ネットワークを介して電子データとしてやりとりすること
郵送やFAX等のやりとりだと管理が頻雑でミスも多発するが帳票を電子化してシステム化することにより紙の帳票作成を削減、手作業での入力ミス削減

### 暗号資産（仮想通貨）
- インターネット上でやりとりできる財産的価値（ビットコイン）
- ブロックチェーンの技術により、改竄などの不正を防ぐ
#### マイニング
取引の確認や記録の計算家業に参加して、報酬として仮想つうかを得ること

### Webマーケティング手法
- Webサイトを用いて自社商品の販売を促進することが重要になっている

### Webサイトを用いた販売促進例
#### SEO(Seach Engine Optimization)(検索エンジン最適化)
検索サイトで自分のページを上位に表示させるようにする
#### アフィリエイト
- 成果報酬は他広告
- 個人のWebサイトやブログに企業の広告を掲載し、ユーザーがそのアフィリエイト広告を経由し、商品を購入するなどの成果条件を満たした場合、報酬が発生する
#### ソーシャルメディア(Social Networking Service)SNS
- 利用者同士のつながりを促進させることで、利用者が発信する情報を多数の「利用者に伝播させる
#### CGM(Consumer Generated Media)
- 掲示板や口コミサイトなど、ユーザーが参加してコンテンツが作成されるメディア

##### コンバージョン率
- 評価指標　: Webサイトに訪れた人のうち実際に商品を購入した人の割合

### オムニチャネル
- 店舗やネット通販、SNSなど、オンライン/オフライン問わず、あらゆる販売チャンネルを持ち、どの手段でも不便なく購入できるようにする
- オンラインからオフラインに誘導するOtoO(Online to Offline)の考え方もある

### ロングテール
- 売れ筋商品の売り上げ合計よりも、あまり売れていない商品の売り上げ合計の方が、無視できないクライ大きくなっている現象

### エンジニアリングシステム
-  設計や製造、生産管理、在庫管理など、生産工程において効率化・自動化を図る
#### JIT(Just In Time)
- 必要なものを、必要な時に必要な分だけ生産
- カンバン方式ともいう
#### セル生産方式
- 1人または数人のチームが、製品の組み立て工程を完成まで作業を行う
#### MRP(Material Requirements Planning:資材所要量計画)
必要なものを、必要な時に、必要な量だけ購入・製造するため、生産計画をもとに発注量・発注時期を決める
#### CAD(Computer Aided Design)
- 設計作業をコンピュータを使って支援する

### IoTの応用事例
#### HEMS(Home Energy Management System)
家庭での電力使用量を可視化して、エネルギー消費の最適化を図る
####デジタルサイネージ
ディスプレイに映像、文字などを表示する電子看板
PHP入門 - 他言語からPHP触った時用

# 概要
他言語からPHPを触った時に戸惑うPHP独特の変数宣言や代入、処理についてまとめ

# 宣言関連
## 変数の宣言, 代入, 定数
```
// 宣言
$a;

// 代入
$a = b;

// 定数
const $a = b;
```
※ 変数名はアルファベット, もしくわアンダーバーから始まる必要がある

文字列は`'`か`"`で囲う

## boolean
```
$bool = true
$bool = FALSE
```
※ 小文字, 大文字は区別しない

## 配列, 連想配列
### 配列
```
$array = [
    '要素1',
    '要素2',
    '要素3',
    '要素4'
];
```

### 連想配列
```
$array = [
    "id" => 1,
    "name" => "日本 太郎"
];

// keyでの要素呼び出し
$array["id"]
```

## オブジェクト
```
class object {
    public $id = 1;
    public $name = "日本太郎"
}

// オブジェクトの初期化
$user = new object;

// オブジェクトのプロパティ参照
$user->id;
$user->name;

// プロパティへの代入
$user->name = "二ホン タロウ"

// オブジェクトへプロパティの追加
$user->age = 29;

// 追加するプロパティのkeyを文字列にする
$text = "age";
$user->$text = 29;
↓
こんな感じになる
object {
    ["age"]=>29
}
```

# 基本処理関連
## 他言語と変わらないもの
`if ($bool) {}`
`for ($i = 0; $i < 10; $i++) {}`

## foreach
```
$array = [1, 2, 3, 4, 5];
foreach ($array as $value) {
    $value = $value + 1;
}
unset($value)  // ※1
```
$arrayは`[2, 3, 4, 5]`になる
typescriptのfor-ofと違って、左辺/右辺が逆になる

※1
foreachが最後の処理を終えた後、$valueは$arrayの最後の要素を参照したままになる
unset($value)をすることで、参照を解除することができる
Hyper-Vの固定IPアドレス設定手順

### Hyper-Vの固定IPアドレス設定手順

1. **仮想スイッチの作成**
   Hyper-Vマネージャーで「内部」タイプの新しい仮想スイッチを作成し、`NAT-Internet`という名前を付けます。

2. **ゲストOSのネットワーク設定**
   ゲストOSの設定を開き、ネットワークアダプターで`NAT-Internet`仮想スイッチを選択します。

3. **ホストOSのIPアドレス設定**
   コントロールパネルから「ネットワークと共有センター」を開き、`NAT-Internet`に対応するアダプターのプロパティでTCP/IPv4を選択し、「次のIPアドレスを使う」にチェックを入れて、IPアドレスに`172.16.0.1`、サブネットマスクに`255.255.255.0`を設定します。

4. **NATネットワークの構成**
   管理者権限でPowerShellを開き、以下のコマンドを実行します。
   ```
   New-NetNat -Name "NAT-Internet" -InternalIPInterfaceAddressPrefix 172.16.0.0/24
   ```
   コマンド実行後、以下のような出力が得られることを確認します。
   ```
   Name                             : NAT-Internet
   InternalIPInterfaceAddressPrefix : 172.16.0.0/24
   Store                            : Local
   Active                           : True
   ```
   これは、NATが正常に作成され、アクティブになっていることを示します。

5. **NATの設定確認**
   正しく設定されたかを確認するために、次のコマンドを実行します。
   ```
   Get-NetNat
   ```
   これにより、作成したNATインスタンスの情報が表示されます。出力はステップ4で確認したものと同じです。

6. **ゲストOSのIPアドレス設定**
   ゲストOSにもホストOSと同様のIPアドレス設定を行い、ホストOSからのSSH接続と外部ネットワークへのアクセスを可能にします。
[対処法 WSL2] Docker エラー：Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running

# Docker が起動できなかった備忘録

## バージョン

```shell:powershell
> wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

```sh:wsl2
> cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
```

## 結論

公式の通りインストールして実行したけど、 `sudo docker run hello-world` をやってもうまく動かない！という私
Windows10 の wsl2 を利用していますが、後述のよく見るあれで解決しない

とのことでしたが、以下のコマンドで何とかなりました！

```bash:wsl2
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo service docker restart
```

## 現象

```bash:wsl2
> docker -v
Docker version 24.0.7, build afdd53b

> sudo docker run hello-world
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running

> sudo service docker restart
 * Starting Docker: docker                                                                [ OK ]
```

`docker -v` が問題なく動作しているから、インストールはできていそう？なのにrunができない？？？となっていました

これがそう、よく見るあれ「docker デーモンの再起動」でしたが、うまく動かず
restart を設定しているのに、stop してない時点でおかしいのですが…

とのことでログをチェック

```bash:wsl2
> sudo cat /var/log/docker.log
failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain:  (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables):  RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
 (exit status 4))
```

何かネットワークエラーっぽいぞとのことで検索、解決に至りました。

## 参考

https://remix-yh.net/2281/
HashSetとListのパフォーマンスの違い

## 結論:HashSetの方が高パフォーマンス
### 使用問題文-LeetCode 345
文字列 s を指定すると、文字列内のすべての母音のみを反転して返します。

母音は「a」、「e」、「i」、「o」、「u」で、小文字と大文字の両方で複数回出現することがあります。

### コード HashSetを使用　実行時間:5ms メモリー:44.46MB
```java
class Solution {
    public String reverseVowels(String s) {
        char [] c = s.toCharArray();
        HashSet<Character>list = new HashSet<>();
        list.add('a');
        list.add('i');
        list.add('u');
        list.add('e');
        list.add('o');
        list.add('A');
        list.add('I');
        list.add('U');
        list.add('E');
        list.add('O');

        int Rindex=0, Lindex=c.length-1;
        while(Rindex < Lindex){
            if(!list.contains(c[Rindex])){
                Rindex++;
            }

            if(!list.contains(c[Lindex])){
                Lindex--;
            }

            if(list.contains(c[Rindex])&& list.contains(c[Lindex])){
            char tmp = c[Rindex];
            c[Rindex]=c[Lindex];
            c[Lindex]=tmp;
            Rindex++;
            Lindex--;
            }
        }

        String result= new String (c);

        return result;  
    }
}
```

### コード　listを使用 実行時間:10ms メモリー:45.10MB
```java
class Solution {
    public String reverseVowels(String s) {
        char [] c = s.toCharArray();
        List<Character>list = new ArrayList<>();
        list.add('a');
        list.add('i');
        list.add('u');
        list.add('e');
        list.add('o');
        list.add('A');
        list.add('I');
        list.add('U');
        list.add('E');
        list.add('O');

        int Rindex=0, Lindex=c.length-1;
        while(Rindex < Lindex){
            if(!list.contains(c[Rindex])){
                Rindex++;
            }

            if(!list.contains(c[Lindex])){
                Lindex--;
            }

            if(list.contains(c[Rindex])&& list.contains(c[Lindex])){
            char tmp = c[Rindex];
            c[Rindex]=c[Lindex];
            c[Lindex]=tmp;
            Rindex++;
            Lindex--;
            }
        }

        String result= new String (c);

        return result;  
    }
}
```

## 理由
HashSetは重複する要素を含まないコレクションであり、その要素が特定の順序で存在しないからです。

## Listの特徴
①順序や②重複がListでは実現できます。そのため、高パフォーマンスではなく①や②を重視する場合はListを使用した方がいいかもしれません。

## 参考
https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.hashset-1?view=net-5.0
AWS Lambda


# 0.はじめに

この記事はAWS SAA試験勉強のための、AWS Lambdaに関する知識のまとめです。

# 1.AWS Lambdaの基本

AWS Lambda では、Amazon EventBridgeによってイベントスケジュールに沿ったLambda関数を設定します。

リクエストに応じてLambda関数は並列起動されるため、アプリケーション処理負荷に耐えることができます。


外部の画像識別APIを利用して構成され、処理するデータ容量も大きくないアプリケーションを構築する場合は、画像識別APIを呼び出して解析を実行するLambda関数を作成することで、EC２インスタンスなどの<font color="red">**サーバーを用いることなく**</font>、コスト効率が良いアプリケーションを構築することが可能です。




# 2.Lambda関数で出来ることの例

- ファイルをjpg形式に変換する
- テキストファイルをJSONファイルに変換する

# 3.実行時間

Lambda関数の最長実行時間(タイムアウト)は15分までの任意の値に設定可能です。

# 4.他のAWSサービスとの連携

### 4.1.IAMロール

他のAWSリソースと連携するLambda関数を作成する際は、IAMによる実行ロールをLambda関数に設定してアクセス権限を付与することが必要です。


### 4.2.S3との組み合わせ
Amazon S3 イベント通知機能を使用して、S3 バケットで特定のイベントが発生したときに通知を受け取ることができる。S3イベント通知からLambda を起動して、ファイルを処理することができます。Amazon S3 は、オブジェクトを作成または削除するときに、イベントを Lambda 関数に送信します。このイベントをトリガーにしてLambda関数を実行して、Lambda関数がファイルをjpg形式に変換することができます。そして、Lambda関数は再度Amazon S3に処理結果を保存することも可能です。

### 4.3.API Gatewayとの組み合わせ
API GatewayをLambda関数に統合して、APIを起動することで、HTTPリクエストによってLambda関数を呼び出してDynamoDBテーブルからデータを取得する処理を実施することができます。
従来はHTTP経由でLambda関数を実行するためには、API Gateway を経由する必要がありました。しかし 関数 URL(Function URLs) という新機能が実装されたため、API Gatewayを省略してパブリックに公開するAPIや、簡易な認証実装でも差し支えの無いAPIを AWS Lambdaで実装することができるようになりました。

### 4.4.Snowballとの組み合わせ
Snowballではオプションとして事前にEC2 AMIやLambda関数をデバイスに設定しておくことができます。転送するデータに特殊な処理を行いたい場合や分析を行いたいようなケースで活用します。

## 5.アクセス
作成したLambda関数は<font color="red">**Lambda専用のセキュアなVPCに配置されます。**</font>このLambda専用のVPCからは、インターネットや、インターネットを経由してパブリックサブネット内のAWSリソースにはアクセスできますが、プライベートサブネット内のAWSリソースへはアクセスできません。

# 6.料金
### 6.1.AWS Lambdaを使用する際に、利用料金を決定する要因
- 利用時間
- ファンクションのリクエスト数

データ配信量はコストに影響しません。

無限に課金されてしまうのを防ぐため、タイムアウトがあります。デフォルトのタイムアウトは3秒で、AWS Lambdaのリクエストあたりの最大実行時間は900秒です。

EC2はインスタンスの起動時間に対して課金される一方、Lambdaは実行時間と選択したメモリの容量に対して課金されます。Lambdaはリクエストのない期間は料金が発生しないので、リソースの効率化とコスト削減が期待できるケースがあります。

# 7.Lambda Layer

Lambda Layerは**複数のLambda関数で**ライブラリを共有できる仕組みであり、Lambda関数間で利用する共通機能などをLayerにまとめて、構成することができます。


# 8.Lambdaプロキシ統合

Amazon API Gateway Lambda プロキシ統合は、単一の API メソッドのセットアップで API を構築するシンプル、強力、高速なメカニズムです。


# 9.環境変数の暗号化

AWS Lambdaはデフォルトで環境変数を暗号化しますが、特定のキーで暗号化することも可能です。
【JWT】復号後データのハッシュキーに関するエラー

## はじめに

私がJWT認証で発生したちょっとしたエラーを紹介します。

## JWTとは

JWT(JSON Web Token)は、認証情報をJSON形式で安全に交換できる方法のことです。

詳しい説明は以下の記事を参考にしてください。

https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/

## 実行内容

Postmanで`http://127.0.0.1:3000/api/users`にGETメソッドを送り、全ユーザー情報の取得。

※Requestのheaderに以下の認証情報を設定しています。
　キー：Authorization　値：Bearer {{jwt token}}　

```ruby:routes.rb
Rails.application.routes.draw do
  namespace :api do
    resources :users

#    　・
#	 　・
#	　 ・

  end
end
```

```ruby:users_controller.rb
module Api
	class UsersController < ApplicationController
		include JwtAuthenticator
	  before_action :jwt_authenticate, only: %i[index]

	  def index
	    users = User.all.map { |user| user.slice(:id, :email) }
	    render json: { users: users }
	  end

#	　　・
#	　　・
#	　　・

	end
end
```

```ruby:jwt_authenticator.rb
module JwtAuthenticator
  require "jwt"

  SECRET_KEY_BASE = Rails.application.secrets.secret_key_base

  def jwt_authenticate
    render json: { error: "認証情報が不足しています。" }, status: :unauthorized if request.headers["Authorization"].blank?
    encoded_token = request.headers["Authorization"].split("Bearer ").last
    payload = decode(encoded_token)
    @user = User.find_by(id: payload[:user_id])
    render json: { error: "認証に失敗しました。" }, status: :unauthorized if @user.blank?
    @user
  end

  # 暗号化処理
  def encode(user_id)
    expires_in = 1.month.from_now.to_i
    preload = { user_id: user_id, exp: expires_in }
    JWT.encode(preload, SECRET_KEY_BASE, 'HS256')
  end

  # 復号化処理
  def decode(encoded_token)
    decoded_dwt = JWT.decode(encoded_token, SECRET_KEY_BASE, true, algorithm: 'HS256')
    decoded_dwt.first
  end
end
```

## エラー内容

以下のresponseボディが返ってきました。

```
{
    "error": "認証に失敗しました。"
}
```

## 原因

データの復号後、`payload[:user_id]`のようにシンボルでキーを指定していたことが原因でした。

```ruby
payload = decode(encoded_token)
@user = User.find_by(id: payload[:user_id])
```

jwtはJSON形式のデータを暗号化・復号化するため、暗号化する際にデータを一度JSON形式に変換しています。JSON形式は文字列のみで構成されるため、シンボルをキーとしていた場合、文字列のキーに置き換えられてしまいます。暗号化前と復号後の`preload`は以下のとおりです。

暗号化前：`preload = { user_id: user_id, exp: expires_in }`

復号化後：`preload = { "user_id" => user_id, "exp" => expires_in }`

## 解決策

解決策としては、キーを文字列からシンボルに変換させる方法、キーを文字列で指定する方法の2種類あります。

### 解決策１：キーを文字列からシンボルに変換

`transform_keys(&:to_sym)`で文字列からシンボルに変換することが出来ます。

```ruby
payload = decode(encoded_token).transform_keys(&:to_sym)
@user = User.find_by(id: payload[:user_id])
```

### 解決策２：キーを文字列で指定

`:user_id`ではなく`”user_id”`で指定してあげることで、復号後データを変換しなくてもキーを指定することが可能です。

```ruby
payload = decode(encoded_token)
@user = User.find_by(id: payload["user_id"])
```

## まとめ

- JWT認証はJSON形式のデータを暗号化していること。
- JSON形式はシンボルで記載出来ないこと。

## 参考文献

- [基本から理解するJWTとJWT認証の仕組み](https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/)
- [JSON Web Token(JWT)を用いたAPIの認証の実装(Rails)](https://qiita.com/sagahi/items/755782874695b8ceff20)
LAN ケーブル、どう選ぶ？

## 要旨

家電量販店に行くと、多くの LAN ケーブルが売っています。
Cat 5 / Cat 5e / Cat 6 / Cat 6a / Cat 8。
（果ては規格が存在しない Cat 6e / Cat 7 (RJ45) などの謎ケーブルまで）

『ウチのインターネット遅いから新しいケーブルに買い替えないと』
そう思っている方も多いと思います。

ケーブルの買い替えにあたって、どの規格を買えばいいのでしょうか？
この記事では、『数字が大きい方が良い！』という幻想を消して、現実的な一つの選択肢を与えたいと思います。

## ケーブル、どう選ぶ？

ケーブルを選ぶ際に、ケーブルの性能を語るのは、サギ師か家電量販店の店員くらいです。

例えば私の場合は、以下のような分類ごとに用途とリンク速度を考えます。
（なお、逸般の誤家庭や大企業でのリンク速度です、一般の御家庭には不要な速度です）

| 分類 | リンク速度 | 用途 |
| :-- | :-- | :-- |
| フロアケーブル | 1Gbps | フロアスイッチ - パソコン間のケーブル |
| 基幹ケーブル | 10Gbps | フロアスイッチ - 基幹スイッチ間のケーブル |
| SAN ケーブル | 40Gbps | ストレージ - サーバー間のケーブル |
| WAN ケーブル | 1Gbps | 基幹スイッチ - インターネット (ONU) 間のケーブル |

こういった分類を行い、必要な規格、必要なコネクタ、必要なスイッチを選ぶというのが選定方法です。
大切なのは、安定してリンク速度を出すためには、どのような選択があるかを考えることです。
『40Gbps だから Cat 8 だな！』のような考え方は絶対にしません。

（あと、当たり前の話ですが LAN ケーブルをいくら早くしても、プロバイダ契約以上に早くはなりません。）
（アパートぐらしのときは、モデムと電話線を利用した接続で 40Mbps がインターネットの最大速度でした）

### どのケーブルがいいの？

品質が安定していて、今後のリンク速度向上を考えると、フロアケーブルは『Cat 6a』が最適な選択肢です。
Cat 6a の最大リンク速度は 10Gbps です。
現在の、一般的なパソコンやスイッチの最大リンク速度が 1Gbps であることを考えると、10倍の性能を有したケーブルであり、十分な性能があることがお分かりいただけるかと思います。

また、パソコンなどの一般的な接続端子である『RJ45』でそもそも安定した運用ができるのは、現時点で Cat 6a までです。

もしあなたの利用しているパソコンが、一般的な接続端子であるなら、Cat 7 などの規格はそもそも不正なものです。

### 早いケーブルがいい！

逸般の誤家庭や、会社などの基幹ケーブル・SAN ケーブルなどには 10Gbps や 40Gbps のリンク速度を持つ製品が利用されています。

であれば、自宅のケーブルも同じような 40Gbps のリンクを行いたい！ と考える方もいると思います。

現実の話をします。
これらの接続は、家電量販店で販売されている LAN ケーブルとは全く別物です。

基幹スイッチ間の接続で利用されるのは、LC SMF / LC MMF といった光ケーブルです。
通常の LAN ケーブル （UTPケーブル） では伝送距離やノイズの影響があるため、まず利用されません。

これらの高速通信には、一般的に利用される RJ45 でなく、SFP+ や QSFP+ という専用モジュールを備えたケーブルが利用されています。

高速通信の現場でも、Cat 7 などのケーブルは、一般的に利用されていません。

## 逸般の誤家庭の話

じゃあ、逸般の誤家庭はどんな構成を組んだの？ という話をします。
ここでの話は N=1 の話なので、話半分でお願いします。

### 家を立てるとき

家を立てるとき、どのケーブルを選んだらいいか悩みます。
それこそ、CAT 8 ケーブルを入れたいと考えるかもしれません。

しかし、家を立てるときこそ使う選択肢は一つしかありません。
『空配管を通してください』とオーダーしてください。

家は 30年40年持ちますが、LAN ケーブルは消耗品です。　
壁の中に消耗品を埋設しないでください。

規格が古くなった、通信が安定しなくなった、コネクタが壊れた。
引き直しが必要となる機会はたくさんあります。

埋設したケーブルは交換できないため、交換できる空配管しか選択肢はありません。

また、家を立てたあとにケーブルを増やすことができません。
多少お金がかかっても、今後必要になるかもしれない場所に埋設で事前に通しておくとよいです。
一度、配管が通っている場所には、簡単に端子を増設できます。

### ケーブルを買うとき

では、家が建ったあとにはケーブルを購入しに行きます。

とりあえず、フロアケーブルなので『Cat 6a』とします。
しかし、いろいろな長さや、特徴のあるケーブルが売っているため、製品選定に悩むものです。

その時は、『300m 巻きバルクケーブル』を買ってください。
端子がついただけで、値段が跳ね上がるケーブルを買う必要は全くありませんし、長さが足りないみたいなことからも開放されます。

必要なときに、必要な長さを切り出して、自分でカシメるのが正しい LAN ケーブルの買い方です。

私は、ケーブルと RJ45 はサンワサプライ、モジュラージャックは Panasonic を選びました。

### ルーター / スイッチを買うとき

まず、ここまでたどり着いた人には 無線 LAN ルーターのような製品を買う人はいないと思います。

すべて同じメーカーで、集中コントロールが可能なアクセスポイント・スイッチ・ルーターを購入してください。

昔は、きしめんケーブルで繋いで、1台ずつ制御していましたが、時間の無駄を悟りました。
今の時代は、Web GUI / 集中コントロールが正義です。

QSFP+ は不要でも、最低でも SFP、あれば SFP+ があると、今後の拡張の際に心の余裕ができます。
また、PoE+ に対応していると、アクセスポイントの電源を取る必要がないため余裕ができます。

私は、Meraki Go を利用しています。
プロ用の機材を購入する際は、年次ライセンスが必要な製品であるかは事前確認が必要です。（1敗）

## まとめ

- LAN ケーブル （UTP ケーブル）は Cat 6a があれば十分。
- 家を立てるときは、『空配管』を通して自分で施工する。
- ネットワーク構成の集中制御の便利さには抗えない。

以上
Thợ Lặn Bá Chủ: Bắn Cá và Xây Dựng Đế Chế Thu Hoạch Biển Sâu

Trong thế giới độc đáo của trò chơi bắn cá online, "Thợ Lặn Bá Chủ" mở ra một cuộc phiêu lưu đặc biệt, nơi người chơi không chỉ trải nghiệm sự hồi hộp của việc săn cá mà còn có cơ hội xây dựng đế chế thu hoạch biển sâu của riêng mình.

Bắt Đầu Sự Nghiệp Thợ Lặn Bá Chủ
Người chơi sẽ bắt đầu cuộc phiêu lưu của mình như một thợ lặn tầm thường, nhưng qua từng cuộc săn cá, họ có cơ hội thu thập kinh nghiệm, vàng, và ngọc để nâng cấp trang thiết bị và kỹ năng, từ đó xây dựng lên một đế chế thu hoạch biển sâu.

Xây Dựng Cơ Sở Hạ Tầng Biển Độc Đáo
Để trở thành bá chủ thợ lặn, người chơi cần phải xây dựng cơ sở hạ tầng biển độc đáo. Những cái hang lớn, trạm thu hoạch và bãi đậu tàu biển đều là những yếu tố quan trọng để nâng cao hiệu suất thu hoạch và mở rộng đế chế của họ.

Thách Thức Săn Cá ở Cấp Độ Cao
Cuộc phiêu lưu không chỉ dừng lại ở việc săn cá cơ bản mà còn mở rộng đến việc đối mặt với những thách thức săn cá ở cấp độ cao. Những con cá khủng và những loài quái vật biển khác nhau đều đang đợi chờ để thách thức sự tài năng và chiến thuật của người chơi.

Thương Thảo và Giao Thương Biển Phong Phú
Thương thảo và giao thương biển là một phần không thể thiếu trong "Thợ Lặn Bá Chủ". Người chơi có thể mua bán cá và nguyên liệu với những thợ lặn khác, xây dựng liên minh và tạo ra các mối quan hệ kinh doanh mạnh mẽ để thúc đẩy sự phồn thịnh của đế chế biển sâu của mình.

Nâng Cấp Tàu Biển và Trang Thiết Bị
Để đối phó với những cuộc săn cá và thách thức nguy hiểm, người chơi cần phải nâng cấp tàu biển và trang thiết bị của mình. Từ súng cá mạnh mẽ đến bảo vệ cá nhân, mỗi nâng cấp đều mang lại sự mạnh mẽ và khả năng phát triển đế chế.

Đồ Họa Đẹp Mắt và Âm Nhạc Sôi Động
"Thợ Lặn Bá Chủ" không chỉ ấn tượng với đồ họa sống động mà còn bởi âm nhạc sôi động. Hiệu ứng âm thanh và những giai điệu biển sâu tạo nên một không khí sôi động và hứng khởi cho người chơi trong mỗi cuộc phiêu lưu.

Kết Luận - Bá Chủ Dưới Đại Dương Sâu Sắc
Với "Thợ Lặn Bá Chủ," người chơi sẽ trải qua một cuộc phiêu lưu độc đáo, kết hợp giữa sự hồi hộp của việc săn cá và niềm vui của việc xây dựng một đế chế biển sâu. Hãy sẵn sàng đối mặt với thử thách, xây dựng đế chế của bạn và trở thành bá chủ dưới đại dương sâu sắc!
Mọi thông tin chi tiết liên hệ : https://79kingfun.com/tro-choi-ban-ca-online-la-gi/

#79king #nhacai79king #79kingfun #linkvao79king #79kingfuncom
アジャイル開発って結局何なの？？

今年もよろしくお願いいたします。なおぽんです。🐹
アジャイルについての本を読了したため、こちらにてまとめました。
アジャイル開発の導入方法は省きます。
もし気になった方がいらっしゃいましたら、お手に取ってみてくださいね！🐹

## 読んだ本
「[図解即戦力　アジャイル開発の基礎知識と導入方法がこれ1冊でしっかりわかる教科書](https://amzn.asia/d/1soemEF)」

## 本書籍の内容
* アジャイル開発とその他の開発方法の説明と違い
* アジャイル開発の考え方
* アジャイル開発の導入方法（今回は省きます）

## アジャイル開発の4ヶ条
「[アジャイルソフトウェア開発宣言](https://agilemanifesto.org/iso/ja/manifesto.html)」という宣言がある。
その宣言には以下の4項目を主軸として開発が進められる。
1. 人同士のコミュニケーションを大切にすること。
2. 仕様書通りに作るのではなく、それを基に動くソフトウェアを作成すること。
3. 顧客と契約を結んで終わるのではなく、方向転換できるように顧客と協調しておくこと。
4. 常時変化する市場の中でも適応させること。

#### ※そもそも、なぜアジャイル開発が作られたのか
　アジャイル開発はウォーターフォール開発の欠点を補うために開発されたとされている。ウォーターフォールとは上流工程から下流工程に情報が流れるようになっている。不具合があれば下流から上流に戻ることもあり、時間的、行動的制約を受けることが多い。そのため、それらの制約をできるだけ排除するためにアジャイル開発が考えられた。

## スクラムとXP（エクストリーム・プログラミング）
　アジャイル開発では、価値観の共有（スクラム）と個人能力の最大限の発揮（XP）を目標としている。「スクラム開発」では、作業は違えど、同じ目標に向かって開発が行われる。「スクラム」の意味はラグビーの用語から取り入れられているようだ。対して、XP（エクストリーム・プログラミング）では個人の能力を最大限に活かしながら時間的効率化のために行われている。例えば、単体テストされるコードを記述した人がその単体テストを書いたほうがいいと考えることだ。スクラムとXPをアジャイル開発に組み込むことにより、アジャイルソフトウェア宣言の実行を行いやすくなるのだ。

## チケット駆動
　書籍にはスクラムやXPと異なる、手軽なアジャイル開発方式としてチケット駆動の説明もされている。チケット駆動では、マイルストーン（タスクの期限）を考慮したチケット（タスク）の減り具合により、全体的なチケットの増減を行いながらチームで開発が行われている。著者はスクラムとXPとは異なると捉えているようだが、共通点が多いと考えられる。1つのものを開発するにあたり、チームでチケットを分業している点ではスクラムである。また、チケットを誰に割り当てるのかを考えることは、個人の能力を最大限に活かす「XP」であると捉えられる。

## まとめ
　アジャイル開発とは「アジャイルソフトウェア開発宣言」を主軸として開発が行われている。まとめると、チームと顧客とのコミュニケーションを大切にし、変化を柔軟に取り入れながら動くソフトウェアを作ることがアジャイル開発である。

## 最後に
　ここまでお読みいただき誠にありがとうございます。今回は書籍を通してアジャイル開発がどういうものなのかをまとめました。アジャイル開発についてもっと詳しく知りたい、導入するにはどうしたらいいのかわからないという方は、ぜひ書籍をお読みになってくださいね！
　ではでは、Sexy Thank You!🌹
Redshift



## Redshiftとは
Amazon Redshift は、 クラウド内でのフルマネージド型、ペタバイト規模のデータウェアハウスサービス。

## 基本的性質
Redshiftはスナップショット用に無料ストレージを提供していますが、上限のストレージ容量を超過すると課金が発生します。

Redshiftは主にクラスターの起動時間に応じて課金が発生しますが、バックアップとなるスナップショットも含めたデータ量に応じても料金が高くなります。

## Amazon Redshift Spectrum
Amazon Redshift Spectrumを使うことで、Redshiftへのアップロードを行わずに**S3バケット上に保存された**ファイルに対して直接、高度なクエリ処理を実行することが可能になります。
Amazon Redshift Spectrumを使用することにより、外部テーブルを結合し、変換済クリックストリームデータを照合することがあります。


## Work Load Management（WLM）

Redshiftのクエリ処理に対して割り当てるRedshiftのリソースを指定する機能。
WLMを利用することでクエリ処理をキューに登録して実行順序を定義することが可能となります。

## 拡張VPCルーティング

Redshiftクラスターに対する拡張VPCルーティングを有効にすることで、VPCに出入りするRedshiftクラスターのすべてのCOPYおよびUNLOADトラフィックを監視することができます。

インターネットに出ないでS3とRedshiftを接続する際は、Amazon S3 VPCエンドポイントを構成し、Redshift拡張VPCルーティングを有効にします。

## スナップショット

Redshiftは暗号化されたSSL接続を使用して、スナップショットをS3に保存できます。
Redshiftのスナップショットには手動と自動の2つのタイプがあります。
手動スナップショットはいつでも取得でき、クラスターを削除した後も継続して保持されます。
Redshiftはスナップショット用に無料ストレージを提供していますが、上限のストレージ容量を超過すると課金が発生します。つまり、スナップショット容量が上限に達すると課金されてしまいます。 そのため、自動スナップショットの保存期間を見直して古いスナップショットが削除されるようにしたり、自動スナップショットと併用している手動スナップショットを削除することでスナップショットの保存料金を削減することができます。

スナップショットは異なるリージョンへ保存することもできます。これを**クロスリージョンスナップショット**と呼びます。
異なるリージョンへとったスナップショットからRedshiftクラスタを再構築できるので、DRや異なるリージョンでRedshiftクラスタを構築する場合に有効です。

## Leaderノード
各クラスタに一台だけ存在するLeaderとなるノードです。
アプリケーションなどからのリクエストを受け付けて各Computeノードへ割り振り、またその結果を取りまとめてアプリケーションへ返す役割を果たします。

## Computeノード
Leaderノードからの命令を処理するノードです。

## HyperLogLog

Amazon Redshiftでは、HyperLogLog (HLL) を使用することで、大量のデータに対してユニークカウント（DISTINCT COUNT）を効率的に計算できます。HLLは近似アルゴリズムであり、正確なカウントではなく、精度を犠牲にして高速な集計を可能にします。

## サードパーティーとの接続

- [Tableau](https://help.tableau.com/current/pro/desktop/ja-jp/examples_amazonredshift.htm)

- [Looker](https://cloud.google.com/looker/docs/db-config-amazon-redshift?hl=ja)

※勿論Amazon QuickSightとも連携できます。
gas aside で 開発環境を作ってみる

仕事でやることになったので自分用にまとめる

### 前提条件
- VSCodeがインストールされている
- Node.jsがインストールされている (npm が使える)

### GoogleAppsScriptAPIの有効化
下記リンクからGoogleAppsScriptAPIを有効化する。
[GoogleAppsScriptAPIの設定画面](https://script.google.com/home/usersettings " GoogleAppsScriptAPIの設定画面")
これで外部からAppsScriptを操作できるようになる。

### asideを用いたプロジェクト作成
#### asideでできる環境の特徴
- claspの設定がなされている
- 快適にTypescriptで記述できるような環境である (デプロイ時には自動コンパイルされる)
- ESLint,Prettierの設定がなされている
- Jestによるテスト環境が整っている
- 開発環境と本番環境を簡単に切り替えができる設定がなされている

#### 作成
プロジェクト用のディレクトリを作っておく
```shell
$ mkdir gas_sample
$ cd gas_sample
```
プロジェクト作成
対話式で設定を聞かれるので答えながら進める
```shell
# プロジェクト作成
$ npx @google/aside init

? Project Title: › gas_sample
? Generate package.json? › No / Yes
✔ Adding scripts...
✔ Saving package.json...
✔ Installing dependencies...
✔ Installing src template...
✔ Installing test template...
✔ Script ID (optional): … 
✔ Script ID for production environment (optional): … 
✔ Creating gas_sample...

-> Google Sheets Link: https://drive.google.com/open?id=sheetId
-> Apps Script Link: https://script.google.com/d/scriptId/edit

```
ScriptID, ScriptID for production environment の入力を求められる。
未入力のまま進めると新規でスプレッドシートとAppsScriptプロジェクトが作られる。
最後にスプレッドシートとAppsScriptのリンクが表示されるのでどこかに記録しておく。

### プロジェクトの設定
#### タイムゾーンの設定

```diff_shell:/gas_sample/appsscript.json
-  "timeZone": "America/New_York",
+  "timeZone": "Asia/Tokyo",
```
#### ライセンスの設定変更

```diff_shell:/gas_sample/license-config.json
{
  "ignore": [
    …
    "build",
+   "src",
+   "test",
    "dist"
  ],
  …
}
```
デプロイ前のプロジェクト自体を公開または配布する場合は上記設定の代わりに下記設定とする。


```diff_shell:/gas_sample/license-header.txt
- Copyright 2023 Google LLC
+ Copyright 2023 自分の名前など
```

### デプロイ
```
# 開発環境にデプロイ
$ npm run deploy
# 本番環境にデプロイ
$ npm run deploy:prod
```
プロジェクトを作成した時点では開発環境も本番環境も同じ設定になっている。
切り替える場合は、clasp-dev.jsonとclasp-prod.jsonの内容を変更する。

### 既存のプロジェクトからscriptをとってくる場合

```shell
# claspインストール
$ npm install @google/clasp -g
# claspのログイン
$ clasp login
```
ログイン画面が表示されるので、ログインする

#### pull元（デプロイ先）を変更
`.clasp-dev.json`から`.clasp.json`を作成。
scriptIdを既存のGasのIDに変更する。
parentIdは削除。
```shell:.clasp.json
{"scriptId":"scriptId","rootDir":"./dist"}
```


ダウンロード
```shell
$ clasp pull
```
dist ディレクトリにscriptがダウンロードされる。

#### 参考にした記事

https://dev.classmethod.jp/articles/gas-aside/

https://dev.classmethod.jp/articles/vscode-clasp-setting/
Amazon SQS(Simple Queue Service)

## はじめに
この記事はAWS SAA試験勉強のための、Amazon SQSに関する知識のまとめです。

## Amazon SQSとは
Amazon Simple Queue Service（SQS）は、フルマネージド型のメッセージキューサービスで、大量のメッセージを効率的にキューイングすることが可能です。

アップロードされたメディアファイルから複数のEC2インスタンスで<font color="red">**非同期処理**</font>する場合のジョブ制御に用います。

コンポーネント障害によってコンポーネント間のメッセージが失われないようにするキューイング処理を実装します。

マイクロサービス、分散システム、およびサーバーレスアプリケーションの切り離して、**疎結合化**されたアーキテクチャ構成を実現します。
- <font color="red">**リクエスト数の増減が予測困難である状況を考慮して**</font>SQSキューを間に入れることで、より安定的に処理リクエストをキューに蓄積しつつ実行することができます

- 有料ユーザーには優先的に処理するキューを設定し、無料ユーザーにはデフォルトのキューを利用することが可能

- フロントエンドからの依頼をSQSでキューイングし、バックエンドへ処理を連携かつ並列化することができます
- SQSのキューイングを利用してコンポーネント間の連携をする際に、処理されなかったキューを4日間保持します
- CloudWatchと連携してオートスケーリングによる負荷軽減を行えます
- **データプロデューサー**と**データコンシューマー**を分割することにより、アプリケーションを疎結合します

## キューのポーリング

キューのポーリングは、メッセージキューシステムにおいて、キューに新しいメッセージが到着しているかを定期的にチェックし、それに応じて処理を行う方法です。コンシューマーはポーリングを利用しています。

## FIFO
キュー(待ち行列)は、最初に格納したデータを最初に取り出すことができるFIFO(First-In First-Out)の処理に適したデータ構造です。

SNS FIFO トピックを導入することで、複数のサブスクライバーに厳密なメッセージの順序付けと<font color="red">**重複を排除した**</font>メッセージ配信を提供できるようになりました。





## 可視性タイムアウト

可視性タイムアウト(DefaultVisibilityTimeout)とは、コンシューマーがキューのメッセージを取得してから、他のコンシューマーがそのメッセージを取得できない期間です。

ユーザがメッセージを取得した時に初めて、キューからメッセージを消します。

可視性タイムアウトを設定するには、**ChangeMessageVisibility API**を使用して、適切な可視性タイムアウト値を設定することになります。
これを利用して、他のコンシューマーがメッセージを二重に取得しない待機時間を設定することで、**Amazon RDSデータベースに重複データが保存されないようにできます。**


## デッドレターキュー

SQS で正常にメッセージが処理されなかった場合に未処理のメッセージを DLQ（デッドレターキュー）に移動することが出来ます。削除はしません。

## SNSとSQSを連携させたファンアウト構成

SNSによるプッシュ通知によってリクエストをSQSキューに送信できます。
SNSでは送信側をパブリッシャー、受信側をサブスクライバーと言います。このようなデザインパターンをPub/Subと言ったりします。受け渡すメッセージはトピックと言います。

## DynamoDBテーブルへの書込処理機能
Amazon SQSキューだけではDynamoDBテーブルへの書込処理機能を実現できません。SQSキューからメッセージをポーリングして、Lambda関数がデータ処理を実行する必要があります。

## SQSアクセスポリシー

異なるAWSアカウントに対してSQSキューへのアクセス権限を付与するためには、SQSアクセスポリシーを作成して、そのAWSアカウントを指定してキューへのメッセージ送受信を許可する設定を行います。

## SQSメッセージ重複排除ID

メッセージ重複排除 ID は、送信されたメッセージの重複排除に使用されるトークンです。特定のメッセージ重複除外ID を持つメッセージが正常に送信されると、同じメッセージ重複除外ID で送信されたメッセージは正常に受け入れられますが、5分間の重複除外間には配信されません。

## EC2のAuto ScalingとSQSキュー

EC2のAuto ScalingとSQSキューが使用されるケースとしては、キューのサイズに基づくAuto Scalingのターゲット追跡スケーリングを設定して、CloudWatchで監視する方法が考えられます。
RHELサーバの調査でよく使うコマンド

## RHEL(互換含め)のちょくちょく使うコマンド
※個人用メモ(随時更新)

## 負荷にかかわるもの

### CPU
#### CPU関連のコマンド
```
top
sar -P
ps -aux
```
-----
### メモリ
#### メモリ関連のコマンド
```
free -h
```
#### メモリ関連の確認するログ
```
/var/log/messages
/proc/meminfo
```
-----
### ストレージ容量
#### ストレージやディレクトリ容量を確認するコマンド
```
df -h
du -h --max-depth=1 {対象のディレクトリ}
```
【反応しない練習】ざっくりアウトプット

# 初めに
草薙 龍瞬著 【反応しない練習】を読んできたのでざっくりアウトプットです。

# まとめ
- 心の状態を言葉で確認して、ムダな反応をしない
- 良し悪しを判断しない
- 反応しないことこそが「最高の勝利」

# 解説

## 心の状態を言葉で確認して、ムダな反応をしない練習をする

反応を作り出しているのは"快"を求める心
求める心が7つの欲求を生み出し、その欲求の中で「喜び」や「悲しみ」が生まれる。
  
ムダな反応をしない為には言葉で確認する。
  
>言葉で確認することを、仏教の世界ではラベリング（ラベル貼り）と呼ぶことがあります。
心の状態にぺたりと「名前」を貼って、客観的に理解してしまうのです。

言葉で確認すると、反応から抜け出せるそうです。
言葉で確認するだけでムダな反応はほとんど消えると記載されています。

## 良し悪しを判断しない

人が悩んでしまう理由の一つは、「判断しすぎる心」にあります。
判断とは決めつけや思い込みのことで、これらは頭の中にしか存在しない「妄想」であることを理解します。

頭の中の判断は、ただの妄想で真実ではない。
現実に役に立っていないなら、有益でもない。
ということは、人間が考える多くの判断は、真実でもないし、有益でもないということです。

## 反応しないことこそが「最高の勝利」

ムダな感情を防ぐ上で一番重要なのは「反応しない」こと。
CloudFront

## はじめに
この記事はAWS SAA試験勉強のための、CloudFrontに関する知識のまとめです。

## CloudFrontとは

コンテンツの効果的な配信を達成するのに役立つCDN(Content Delivery Network)のサービス。<font color="red">**エッジロケーション**</font>に**キャッシュ**を保存します。


(CDNとは、動画や音声などの大容量のデータを利用する際に，インターネット回線の負荷を軽減するようにサーバを分散配置するネットワーク。)

AWSには世界中に400を超えるエッジロケーションと13のリージョン別エッジキャッシュがあり、CloudFrontを使うと、利用者から最も近いエッジロケーションからコンテンツを高速に配信することができます。

オンプレミスサーバーをポイントしてカスタムオリジンとして設定することで、オンプレミス環境のサーバーにも適用可能なコンテンツ配信サービスとなっています。

## CloudFrontの基本的性質
- CloudFrontを導入することで、導入したサービスは自動的に通信のSSL/TLS暗号化が行われます

- CloudFront では、Gzip および Brotli 圧縮形式を使用してオブジェクトを圧縮できます。ビューワーが両方の形式をサポートしている場合、Brotli が優先されます。エッジロケーションによる圧縮処理を実施することでコストを削減できます

- S3のtransfer accelerationを利用することはできません
- EC2インスタンスを複数のアヴェイラビリティゾーンに分散させることはできません

## S3バケットの配信コンテンツに対してアクセスを制限するための方法

CloudFrontのOrigin Access Identity(OAI)を作成し、S3バケット内のオブジェクトへのアクセスをそのOAIに許可します。

## WAFとの連携
Amazon S3バケットにCloudFrontディストリビューションによるコンテンツ配信を構成することで、AWS WAF を利用してReferer制限を実装することができます。
AWS WAF は、CloudFront に転送される HTTP および HTTPS リクエストをモニタリングして、WEBアクセスの拒否ルールなどを設定できるウェブアプリケーションファイアウォールです。**AWS WAFのReferer制限によって直接にURLリンクを参照することを制限することができます**。

## 署名付きCookies機能
CloudFrontの署名付きCookies機能によりプライベートファイルにアクセスできるユーザー権限を管理することができます。現在のURLを変更したくない場合に用います。

## 署名付きURL
個別のファイルへのアクセスを制限する場合や、ユーザーがCookieをサポートしていないクライアントを使用している場合に用います。

## Cache-Control
Cache-Controlのmax-ageディレクティブが低い値に設定されている場合、キャッシュ保持期間が非常に短いためリクエストは頻繁にオリジンサーバーに送信されます。

## Route53の位置情報ルーティングとの違い

Route53はあくまでも既存のオンプレミスサーバーのルーティング方法を構成するだけですが、CloudFrontであればユーザーの近くにキャッシュサーバーにコンテンツを配置して、高速なアクセスを実現することができます。

## ALBとの関係

ALBをオリジンとしてAmazon CloudFrontディストリビューションを設定できます。

## HTTPS通信の有効化

CloudFrontにACM(AWS Certificate Manager)の証明書を連携して、HTTPS通信を有効化することで、Amazon CloudFrontからのコンテンツ配信はすべてHTTPS通信にすることができます。

## OACとOAI

CloudFrontとS3を使用して静的Webサイトを構成する場合に、<font color="red">**S3バケットのオブジェクトへ直接アクセスさせずにCloudFront経由のアクセスのみ許容する**</font>方法には、Origin Access ControlとOrigin Access Identityがあります。

OAIは高可用性かつセキュリティが強化されたWebサイトを公開する時などに用います。

## Accept-Languageリクエストヘッダー

各地域に応じた言語表示を実施するためにはCloudFrontのAccept-Languageリクエストヘッダーを利用します。

## 地理的制限（Geo Restriction）

AWS CloudFrontには地理的制限（Geo Restriction）機能があります。この機能を使用すると、特定の国や地域からのアクセスを許可または拒否することができます。

## キャッシュを保持する時間

CloudFrontキャッシュを保持する時間はTTL(Time to Live)値で制御できます。設定するTTL値の期間を短くすると動的なコンテンツに対応します。反対に、期間を長く設定すると、元々のサーバーやストレージにファイルを取りにいかなくなるため、ユーザー側のパフォーマンス向上とともに、オリジン側の負荷軽減になります。

## フィールドレベル暗号化

フィールドレベル暗号化では、特定のデータフィールド(個人情報などの機密データがあるフィールド)に対して、特定のアプリケーションのみがアクセスできるようにデータを保護することができます。


## Lambda@Edge

CloudFrontには、アプリケーションのユーザーに近いロケーションでLambda関数のコードを実行できるLambda@Edgeというサービスがあります。これによりエッジロケーションでプログラミングを実行することが可能になります。
Amazon Aurora


## Amazon Auroraとは

従来のMySQLのデータベースと比較して、最大5倍の処理能力を達成できる分散型のリレーショナルデータベースサービス。**Amazonが独自に開発。**
- MySQL と PostgreSQL の完全な互換性を持ちます。PostgreSQLは大規模データの処理や高度なインデックス構築、パーティショニングに強みがあります。データベースの成長に伴ってよりスケーラブルなソリューションが求められる場合には有利です。
- デフォルトで自動バックアップを実行します。
- Auroraには、クラスタエンドポイント、読み取りエンドポイント(リーダーエンドポイント)、インスタンスエンドポイント、カスタムエンドポイントの４種類の接続方法があります。

## Aurora Serverless
Aurora サーバーレスは、アイドル状態のときにコンピューティングコストが発生しません。
不規則なピークが発生する時に使います。
Aurora Serverlessにはv1とv2の２つのバージョンがあります。v2には、v1にはなかったマルチAZ機能が利用可能となっています。

## Auroraレプリカ
プライマリDBが配置されているアベイラビリティゾーン（それを構成するデータセンター）に障害が発生した場合は、レプリカの１つをプライマリDBに昇格させることで、ダウンタイムを最小限にしてデータベース処理を継続させることができます。

Auroraレプリカを増設して、リードエンドポイントに対してレポーティング機能を接続すれば、レポーティング処理をレプリカ経由で実行することができるため、プライマリDBのパフォーマンスに影響を与えることなく、レポーティングを実施できるようになります。
※ここでいうレポーティングとは、データの分析ダッシュボードのような意味であり、データベースのメトリクスやアラームのことではありません。

## Amazon Aurora Global Database

グローバルデータベースの大きな利点は以下の2点です。
- データベースアクセスを世界中から高速に行える（レイテンシの向上）
- リージョン単位で発生した大規模な障害の災害対策（DR）になる

各リージョンの**ライター**エンドポイントを利用してデータベースにアクセスすることはできません。
Auroraグローバルデータベースでは、一般的にディザスタリカバリの指標として使用されるRPO（目標復旧時点）を 1秒、RTO（目標復旧時間）を1分未満と定めています。

## RDS Proxy

Auroraクラスタデータベースへの多くの接続とリクエストにより接続拒否が発生しているときは、RDS Proxyを用いることによってSQLリクエストを調整することができる。


## Auroraデータベースのデータを複製する方法

#### リードレプリカを作成する
データのリアルタイムな同期が必要な場合はリードレプリカを使用するのが適切です。

#### スナップショットを取得して復元する
Auroraデータベースからスナップショットを取得し、それを新しいAuroraクラスターに復元することでデータを複製することができます。これにより、元のデータベースの状態がそのまま複製されます。ただし、スナップショットの取得や復元には時間がかかる場合があります。

#### データベースレプリケーションを使用する
<font color="red">**AWS Database Migration Service(DMS)**</font>を使用して、Auroraデータベースのデータを他のAuroraデータベースに複製することもできます。これにより、異なるリージョンにデータを複製するなど、複雑なデータ複製シナリオを実現できます。

DMSはEC2インスタンス上のMySQLデータベースをAurora MySQLに移行する場合などにも用いられます。

## Amazon Aurora PostgreSQL

pgvector 拡張機能をサポートしていて、埋め込みデータの保存、管理を効率的にできる。
DynamoDB

## はじめに
この記事はAWS SAA試験勉強のための、DynamoDBに関する知識のまとめです。

## DynamoDBとは

DynamoDBとはシームレスで拡張性のある高速パフォーマンスを提供する、フルマネージドでサーバーレスの <font color="red">**key-value**</font> NoSQLデータベースサービスです。
SQLクエリ処理は実行できません。

## DynamoDBの基本的性質
- JSON形式のデータを保存・処理するドキュメント型データベースとして利用することが可能。セッションデータの処理に向いていて、高速でデータ処理を実行できます
- 自動的に3つのAZにデータが保存されます
- ユーザーが設定することなく、初めからマルチAZ構成のフォールトトレランスを考慮して設計されています

- パーティションキーとソートキーを組み合わせたものをテーブルのプライマリキーとして定義できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/0018be39-81c2-8ecc-f891-2c8f1a916e6b.png)

## キャパシティ設定
DynamoDB テーブルにおいて、利用負荷があらかじめ予測できる場合はプロビジョンドスループットモードを選択します。
逆に、予測できない場合はオンデマンドモードを設定します。

## データ整合性モデル

Amazon DynamoDBテーブルからデータを読み込む際に、ユーザーはその読み込み処理実行時に結果整合性のある読み込みを利用するか、強い整合性モデルを利用するかを指定できます。

## Auto Scaling
DynamoDBテーブルに対してAuto Scalingを設定することで、DynamoDBテーブルへの処理負荷に応じて、テーブルとグローバルセカンダリインデックス（GSI）のパフォーマンス向上を自動化できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/34c93bce-42c2-9583-30ec-6ad0baed6bd7.png)

この機能により予測不能なスループットキャパシティの自動管理ができます。

## DAX
Amazon DynamoDB Accelerator (DAX) は、フルマネージド型高可用性インメモリキャッシュで、DynamoDB 用に特化しています。インメモリ型のキャッシュレイヤーなので高コストです。
DAXを有効化することで、1 秒あたりのリクエスト数が数百万件になる処理に対しても、ミリセカンドからマイクロセカンドまでの最大 10 倍のパフォーマンス向上を実現します。

キャッシュを利用して読み込みは高速化できますが、書き込みは高速化できません。

## DynamoDB ストリーム

データベースに保存されたデータ項目に対する追加・変更・削除の 発生時に**履歴を保持します。**
DynamoDBストリームはDynamoDBテーブルのデータに変更が発生した場合に、それをトリガーに変更データをキャプチャする機能です。したがって、月次でAmazon S3バケットにデータをエクスポートすることはできません。

## ポイントインタイムリカバリ


ポイントインタイムリカバリを有効にすると、テーブルデータが自動でバックアップされます。バックアップデータは35日間保存され、現在時刻から5分前までの任意の時点(day:hour:minute:second)のデータに復旧できます。
オンデマンドバックアップとは違い、<font color="red">**差分バックアップ**</font>が定期的に自動で取得されます。

<font color="red">**DynamoDBのS3へのエクスポート機能**</font>は、内部的にDynamoDBの継続的バックアップの機能（ポイントインタイムリカバリの前提となる機能）を使用しています。
## TTL(Time to Live)

アイテムごとにTTLを属性で指定することにより、DynamoDBは期限切れのアイテムを見つけて削除します。
WSL Ubuntu に Vim 9.1 を導入した

WSL の Ubuntu で Vim 9.1 にしてみたかったので、記録を残します。

以前の記事 [WSL の Ubuntu に Vim 9.0 を入れる](https://qiita.com/tnishida05/items/73f9cfcbd1c4f734cbfd) では PPA リポジトリを利用しました。
今回は [GitHubのソース](https://github.com/vim/vim) からインストールします。

# PPA リポジトリを削除

以前の記事で導入した PPA リポジトリ及び Vim を削除します。[How to Install Latest Vim 9.0 on Ubuntu Based Linux Distributions](https://itsfoss.com/install-latest-vim-ubuntu/) に Vim の削除とリポジトリの削除が書いてあります。

ターミナルで次を実行しました。
```
sudo apt remove vim*
sudo add-apt-repository -r ppa:jonathonf/vim
```
おそらく削除が完了です。ターミナルの再起動が必要かもしれません。
というのも、Vim 9.1 をインストールした後この操作をしたので、よくわかっていません。

# Vim 9.1 のインストール

詳しくは、<https://www.vim.org/download.php> 及び [Linuxシステムに最新のVimエディターをインストールする方法](https://tutorialcrawler.com/linux/linux%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E6%9C%80%E6%96%B0%E3%81%AEvim%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99/) を参照してください。

以下のコマンドを実行するとインストールできます。
```
sudo apt install ncurses-dev
git clone https://github.com/vim/vim.git
cd vim/src
make
sudo make install
```

また、アンインストールは`sudo make uninstall`で出来るようです。導入したディレクトリの指定などが必要になる場合もあるようですが、まだ必要ないので試していません。

__追記(2024/01/27)__ : `vim/src/configure`で色々できるようで、特に、オプションの設定はこれを走らせると変更できるそうです。私は次の記事を参考にしました。update用のスクリプトも書かれており、とても有益な記事です。
[vimをアップデートするスクリプト](https://qiita.com/laddge/items/34f8ce911ed4761aac45)

# 最終結果

Vim 9.1 導入後は次のようになりました。
```
user@HOST:~$ vim --version | head -5
VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Jan  7 2024 10:57:10)
Included patches: 1-15
Compiled by user@HOST
Huge version without GUI.  Features included (+) or not (-):
+acl               +file_in_path      +mouse_urxvt       -tag_any_white
```
+clipboard で、クリップボードの連携も切れていませんでした。
以上です。

追記(2024/0526): 色々やっていたらgitのエディタがvimでなかったので以下を参照しました。
[git commit時のエディタをvimにする](https://qiita.com/oouaioi/items/0383747c58ce82d94a51)

# 参考サイト

- [WSL の Ubuntu に Vim 9.0 を入れる](https://qiita.com/tnishida05/items/73f9cfcbd1c4f734cbfd) <- 自分の Qiita 記事
- [Vim -- Ubunt の vim を 8.1 から 9.0 に上げる](https://dev.to/kaede_io/vim-ubunt-no-vim-wo-81-kara-90-nishang-geru-38o5)
- <https://github.com/vim/vim>
- <https://www.vim.org/download.php>
- [Linuxシステムに最新のVimエディターをインストールする方法](https://tutorialcrawler.com/linux/linux%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E6%9C%80%E6%96%B0%E3%81%AEvim%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99/)
- [vimをアップデートするスクリプト](https://qiita.com/laddge/items/34f8ce911ed4761aac45)
- [git commit時のエディタをvimにする](https://qiita.com/oouaioi/items/0383747c58ce82d94a51)