OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressプラグイン　Contact Form 7　誕生日自動計算機能を追加する

## コンタクトフォームに書くコード

```html
<script>
    document.addEventListener('DOMContentLoaded', function () {
        // 計算ボタンの要素を取得
        var calculateButton = document.getElementById('calculateAge');

        // ボタンがクリックされたときの処理
        calculateButton.addEventListener('click', function () {
            // 誕生日の入力値を取得
            var birthdayInput = document.querySelector('input[name="birthday"]');
            var birthdayValue = birthdayInput.value;

            // 入力情報の確認
            if (birthdayValue) {
                var birthday = new Date(birthdayValue);
                var today = new Date();
                var age = today.getFullYear() - birthday.getFullYear();

                if (today < new Date(today.getFullYear(), birthday.getMonth(), birthday.getDate())) {
                    age--;
                }

                // 年齢を年齢フィールドに追加
                var ageField = document.querySelector('input[name="age"]');
                ageField.value = age;
            } else {
                alert('誕生日を入力してください。');
            }
        });
    });
</script>

<table>
    <tbody>
        <tr>
            <th>誕生日</th>
            <td>[date* birthday date min:1900-01-01]
                <button type="button" id="calculateAge">
                年齢を計算
                </button>
            </td>
        </tr>
        <tr>
            <th>年齢</th>
            <td>[number* age readonly]</td>
        </tr>
    </tbody>
</table>
```

## JavaScriptにpタグ、brタグが勝手生成される場合
wp-config.php最終行コードの上に下記コードを追加する

```
define ('WPCF7_AUTOP', false); 
```
rails-erd でテーブル名と関連だけのシンプルなER図を作る設定 #3452

# .erdconfig の 例

- テーブルのカラムを表示しない
- アプリケーションに関係ない Rails のデフォルトのテーブルは除外する
- 横方向のPDRだと見づらかったので縦方向の設定にした

```
attributes:
  - inheritance
exclude: ActiveRecord::SchemaMigration,ActiveRecord::InternalMetadata
filename: erd-simple
orientation: vertical

```


# 公式

https://voormedia.github.io/rails-erd/customise.html


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
テスト（システム開発）って何をするの？

# はじめに 
筆者は現在、新卒で現場に配属されてから４か月ほどシステム開発業務をしているのですが、特にテストと呼ばれるものをメインで行っています。
そこで今回は、テストについてまとめてみました。

# テストとは？
まずはテストとはそもそも何なのか、基本的な部分を説明します。

## システム開発におけるテストの立ち位置
（情報）システムとは、ハードウェアやソフトウェアを複数組み合わせて、全体で何らかの機能を持っているもののことを言います。人事給与システム、配送管理システム、SNS、オンラインゲームなどをはじめとする様々なシステムが存在し、現在の日常のあらゆるところで利用がされています。
システム開発は特にその中でも、WEBサービスやスマホアプリなどのソフトウェアを作る仕事です。
![IMG_7407.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329739/74ffab0e-255e-671d-6755-dbe0feee4126.jpeg)
システム開発は時系列順に大きく分けて次の３つの工程に分けられます：
- 基本設計（外部設計）・詳細設計（内部設計）
- 実装（コーディング／プログラミング）
- テスト

:::note
テストはシステム開発の中で最後に行われる工程となります。
:::


:::note warn
記事・本によってはシステム開発に要件定義や運用・保守を含めている場合もありますが、今回は上記の通りとします。
:::

## 何故テストが必要か？

まず基本設計・詳細設計において、システムで実装する機能の決定・その機能の実装方法を決定します。
次に実装において、その機能を実際にシステムに組み込みます。
テストというのは、この時点で予定していた機能が本当に組み込まれているのかを確認する作業となります。
一度の実装で不備なく機能が組み込まれることはあまり多くなく、コードを間違えてしまう、想定とは違う挙動をしてしまう、過去に実装した機能が動かなくなってしまう、といった事象がよく発生します。それらをしっかり確認せずに気づかないままにしてしまうと、最終的にシステムが不具合・バグを生じてしまうこととなります。

:::note
テストは工数をしっかりかけて行う必要のある、非常に重要な作業です。
:::

# テストの種類

テストは大まかに次のように大分されます：
- コードレビュー
- 単体テスト
- 結合テスト
- システムテスト

### コードレビュー

実装されたコードそのものを見て、コーディング時のケアレスミスがないか、現場で定まっているコーディングルールに合っているか、関係のないコードが含まれていないかなどを確認します。

### 単体テスト

プログラム内の比較的小さな範囲に限定し、詳細設計で決定した機能の実装方法の通りに動いているかを確認します。
具体的には、様々な入力を想定される入力を可能な限り全パターン用意し、それらを与えた際に想定している出力がされるかを確認します。各パターンを重複や漏れなく確認する必要があるため、事前にテスト仕様書に各パターンをテストケースとしてリストアップし、それをもとにしてに順に確認をしていきます。

### 結合テスト

いくつかのプログラム部品を組み合わせて、基本設計・詳細設計で意図した通りの動作・挙動をしているかを確認します。
単体テストで各プログラム部品が問題なく動作している場合でも、それらを組み合わせた際にデータの受け渡しの不備等により、動作不良や不具合が見つかることが多くあります。

### システムテスト

実際にシステムを使う想定で、システム全体を通して動作検証を行います。
要件定義・基本設計で意図した通りの動作をしているかを確認します。

:::note
テストは対象範囲の広さ・目的に応じて何種類かに分けられます。
:::

:::note
まずは対象範囲の狭いテストから行い、徐々に対象範囲の広いテストを行っていきます。
:::

# まとめ

今回はテストについて簡単にではありますがまとめてみました。
現場で今実際に行っているテストが今回紹介したもののうちのどれにあたるのかがまだはっきりと分かっていない状況なので、今後はその部分についても意識しつつ、現場で行っている業務の解像度を上げていこうと思いました。
【ChatGPT無】に指定人物のペルソナを作成させます。


　どうも、カーブミラーです。

　今回は、ChatGPTに指定人物のペルソナを作成させます。以前に、悪役令嬢関係をやりましたが、ペルソナを指定していましたよね。あれほどのペルソナ情報ではありませんが、今回のPromptを基本として使って、創作活動に役立ててください。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　本題の前に、ちょっとニュース。
　・GPT4のナレッジカットオフが
　　　2023/1に更新されている
　　　　そうです。
　　　　　今まで2021/9でしたね。
　・OpenAIで、DALL-E3が発表。
　　　ChatGPT APIから使える。
　　　　2023/10にリリース？　
***
　では、本題に移ります。

　今回のPromptは、
　　ペルソナをChatGPTさんに
　　　作成してもらうわけですが、
　　　　作成した理由は
　　　　　特にはありませんw

　まずは、Promptをどうぞ。
```Text:
# 目的
ペルソナの作成

# 役割
あなたは、人のペルソナを理解する人です。

# 処理手順
・ユーザーからの入力を、特定の人物として、その人物のペルソナを箇条書き（説明不要）で出力してください。
・特定の人物を示していない場合は、その特徴を出力してください。

# 最終確認
あなたが理解できない箇所があるならば、指摘してください。
あなたが理解できたなら、「はい」と答えて、待機してください。
```
　これに
　　ChatGPTさんからは
```Text:
理解しました。ユーザーからの入力に基づいて、特定の人物のペルソナを箇条書きで出力します。どの人物についてペルソナを作成したいですか？または、特定の人物についての情報を提供してください。
```
　と返ってきました。

　このあと、
　　人物を指定します。

　ここでは、まずは、
　・レオナルド・ダ・ヴィンチ
　・モナリザ
　・夏目漱石

　続けていきます。
***
***レオナルド・ダ・ヴィンチ***
レオナルド・ダ・ヴィンチのペルソナ：

- 多才な天才: 絵画、科学、工学、解剖学、音楽など、多くの分野で卓越した才能を持つ。
- 創造性と好奇心の象徴: 創造的な発想と永遠の好奇心に満ちており、未知のことに挑戦することを愛している。
- アーティストとしての情熱: 世界的に有名な絵画「モナ・リザ」や「最後の晩餐」などを創作し、芸術への深い情熱を持っている。
- 進歩的な発明家: レオナルドは設計図を描いたり、発明を行ったりして、その時代の技術に大きな影響を与えました。
- 科学と自然への深い興味: 動物や植物の研究、解剖学の研究など、科学と自然に対する深い興味を持っていました。

これがレオナルド・ダ・ヴィンチのペルソナの特徴です。何か追加情報が必要でしたらお知らせください。
***
***モナリザ***
モナリザのペルソナ:

- 微笑んでいるが、その微笑みには謎めいた感じがある。
- 眉毛が細く、目は静かで深い知識を秘めているように見える。
- 花柄のドレスを身に着け、髪は黒く滑らかに流れている。
- 絵画の中にいるように静かで、何かを考えているように思える。

このように、モナリザのペルソナを表現しました。何か他に追加したい情報があれば、お知らせください。
***
***夏目漱石***
夏目漱石のペルソナ:

- 19世紀から20世紀初頭にかけての日本の著名な作家
- 自然主義文学の代表的な作家の一人
- 「坊ちゃん」「こゝろ」などの小説で知られ、日本の近代文学に大きな影響を与えた
- 教育者としても活動し、東京帝国大学（現在の東京大学）で教鞭を執った
- 文学的な洞察力と社会への批評が鋭く、日本の文化や風俗を描写した作品が多い
- 知識人としての活動も行い、文学評論や政治についての論考を執筆

以上が夏目漱石のペルソナです。何か追加情報が必要でしたら、お知らせください。
***

　次に、人物ではないものです。
　・知識の書
　・ファミリーマート
　・セブンイレブン

***
***知識の書***
了解しました。知識の書としてのペルソナを作成します。以下はそのペルソナです：

- 名前: 知識の書
- 性別: 性別は持たず、中性的
- 役割: 人々に知識と情報を提供する
- 特徴:
  - 無限の知識と知識を保有している
  - 賢く、洞察力が高い
  - 質問に対して的確な回答を提供
  - 静かで穏やかな性格を持つ
  - 言葉遣いが丁寧で尊重される存在

このような知識の書のペルソナが、知識や情報の探求に役立つ存在として存在しています。何か具体的な質問や情報が必要であれば、お気軽にお知らせください。
***
***ファミリーマート***
ファミリーマートのペルソナ：

- 日本のコンビニエンスストアチェーン
- 24時間営業
- 店内には食料品、飲料、おにぎり、弁当、スナック類、雑誌、ATMなどが取り揃えられている
- スピーディーなサービスを提供
- 多くの場所に店舗があり、便利さを強調

これでファミリーマートのペルソナを箇条書きで示しました。何か他に追加したい情報がありますか？
***
***セブンイレブン***
セブンイレブンのペルソナを作成します。

セブンイレブンのペルソナ:
- 便利さを重視する人
- 忙しい日常生活を送ることが多く、食料や日用品を手軽に購入したいと考える
- 24時間営業の店舗で買い物をすることが多く、深夜や早朝にも利用する
- コンビニの商品やサービスに依存しており、食事やコンビニ弁当を利用することがある
- 駅やオフィス街にあるセブンイレブン店舗を利用し、仕事や通勤途中に寄ることがある

以上がセブンイレブンのペルソナです。何か追加情報が必要な場合や他のペルソナについても作成したい場合はお知らせください。
***
　なぜか、
　　両コンビニが
　　　違う出方をしましたねw

　“知識の書”というのは、
　　GoogleSGEによれば、
「小説に出てくる「知識の書」とは、辞書、事典、年鑑、図鑑など、調べるための本を指します」
　　　だそうです。

　Harry Potterファンなら
　　ご存知でしょう。

　ファンタジー小説や
　　ゲーム世界に出てくる
　　　アイテムです。

　現代では、
　　ChatGPTさんが
　　　“知識の書”ですね。

　今回は、ここまで。
國際學校到美國校園：跨越文化的留學之旅


[國際學校](https://www.apexcharity.org/news/3/82)學生常被認為具有獨特的優勢，從多語言的教育環境到與各國學生的互動，這都為他們提供了寶貴的資源。但在考慮赴美留學時，除了這些優勢外，他們還需要面對一系列的挑戰，如SAT考試、申請程序以及簽證事宜。以下是這段跨越文化的留學之旅的探討。

國際學校的養成：全球視角的基石

在國際學校學習，學生不僅獲得學術知識，更重要的是培養了跨文化交流的能力和全球視角。這使得他們在考慮[出國留學](https://www.apexcharity.org/news/3/83)時，已具備一定的適應能力和心理準備。

SAT：赴美大學的必經之路

[SAT](https://www.apexcharity.org/news/3/84)考試是多數美國大學的入學要求之一，它涵蓋了數學、閱讀和寫作三大部分。透過這個考試，學生可以展現自己的學術實力和邏輯思考能力。因此，備考SAT是赴美留學路上的第一大挑戰。

申請程序：策略和溝通

成功的留學申請不僅需要優異的學業成果，還需要展現自己的特質、經歷和願景。這需要學生具有策略性思考，明確知道自己想在申請材料中呈現什麼，以及如何與大學的招生辦公室有效溝通。

[美國簽證](https://www.apexcharity.org/news/3/94)：實現夢想的最後一步

獲得大學錄取後，學生還需要成功獲取美國的學生簽證。從準備文件、支付費用到參加面試，這一過程需要學生的細心和耐心。

結語：國際學校學生在赴美留學的路上雖然充滿了挑戰，但憑藉他們的獨特背景和培養，他們無疑具有越過這些挑戰的潛力。只要持續努力、保持信心，夢想一定能夠成真。
Rで因子分析するメモ

１年に１回くらいしかRを使わないので、毎回基本的なことからやり直してる自分のための覚書メモ。


まずはデータの読み込み。今回はcsvファイルを読み込む。
```R
x <- read.csv("test.csv", header=T, fileEncoding = "UTF-8-BOM")
```
`fileEncoding = "UTF-8-BOM")` は Windows で読み込みエラーが出るときにつけるやつ。

# 因子分析
１．分析に必要な列だけ取り出す（今回はQ1～Q39の39項目を使った因子分析）。1列目はID、2列目にグループ情報が入っているので、分析対象の3列目以降を取り出す。
```R
df <- x[3:41]
```

２．固有値を求めて、スクリープロットを描く
```R
cor <- cor(df)
eigen <- eigen(cor)$values
plot(eigen, type="b")
```

３．固有値が１以上の個数＝因子数　として、因子分析をする。（因子数の決め方はいろいろあるけど、今回は機械的に決めちゃう）
```R
n_fact <- sum(eigen >=1)

#因子分析
factanal <- factanal(x=df, factors=n_fact, rotation="promax")
print(factanal, cutoff=0)
```
`factanal` は最尤法で計算している。
`"promax"` プロマックス回転を指定。`cutoff=0` 因子負荷量をすべて出力する。

出力はこんなかんじ。６因子で計算。
```
Call:
factanal(x = df, factors = n_fact, rotation = "promax")

Uniquenesses:
 Q001  Q002  Q003  Q004  Q005  Q006  Q007  Q008  Q009  Q010 ・・・
0.424 0.273 0.235 0.466 0.426 0.478 0.564 0.627 0.573 0.615 ・・・
Loadings:
     Factor1 Factor2 Factor3 Factor4 Factor5 Factor6
Q001  0.701  -0.035  -0.097  -0.044   0.048   0.217 
Q002  0.203   0.041   0.010  -0.004  -0.099   0.763 
Q003  0.115  -0.003   0.072   0.057   0.027   0.746 
Q004  0.000  -0.102   0.176   0.214   0.509   0.016 
Q005  0.235  -0.026   0.076   0.409   0.180  -0.043 
Q006  0.253  -0.074   0.133   0.059   0.419   0.018 
Q007  0.475   0.204   0.199  -0.068  -0.072  -0.061 
Q008  0.525   0.159   0.108  -0.047  -0.124   0.014 
Q009  0.434   0.262   0.122  -0.023  -0.067  -0.037 
Q010  0.005   0.405  -0.080  -0.150   0.387   0.111 
・・・中略・・・

               Factor1 Factor2 Factor3 Factor4 Factor5 Factor6
SS loadings      4.717   3.735   2.615   2.598   2.280   1.339
Proportion Var   0.121   0.096   0.067   0.067   0.058   0.034
Cumulative Var   0.121   0.217   0.284   0.350   0.409   0.443

Factor Correlations:
        Factor1 Factor2 Factor3 Factor4 Factor5 Factor6
Factor1   1.000  -0.514   0.751   0.672  -0.692  -0.689
Factor2  -0.514   1.000  -0.351  -0.180   0.384   0.170
Factor3   0.751  -0.351   1.000   0.607  -0.592  -0.590
Factor4   0.672  -0.180   0.607   1.000  -0.641  -0.567
Factor5  -0.692   0.384  -0.592  -0.641   1.000   0.620
Factor6  -0.689   0.170  -0.590  -0.567   0.620   1.000

Test of the hypothesis that 6 factors are sufficient.
The chi square statistic is 1976.27 on 522 degrees of freedom.
The p-value is 1.15e-167 
```
`Uniquenesses` 独自性。共通性は `1-Unisuenesses` 共通性が大きい＝因子によって説明できる部分が大きい。

`Loadings` 因子負荷量。絶対値が最も大きい因子への影響度が大きい。
`SS Loadings` 因子負荷量の平方和
`Proportion Var` 寄与率
`Cumulative Var` 累積寄与率
`Factor Correlations` 因子間の相関行列（プロマックス回転のときだけ出力される）
`p-value` モデルの適合の検定。 **p値が大きいほど適合している** 。帰無仮説「モデルがあてはまっている」に対して検定をしているため、p<0.05 のときに仮説が棄却される＝「あてはまっているとはいえない」⇒ 今回の結果は「あてはまっているとはいえない」。残念。


# ほかに使ったコマンド

グループごとにサブセットを取り出し、 `for文` で回して分析する。
```R
for ( i in 1:5 ){
	cat("### Group = ", i, "\n")
	df <- subset(x, Group==i)
    ・・・
} 
```
`cat` 文字列をつなげて表示。
`subset` 要素Groupに入っているデータを見てグループを抽出する。
会社PCのwi-fiがつながらない問題

# 背景
- ヘルプデスク業務でwi-fiがつながらなくなってしまったと相談を受けた

# 繋がらなくなった経緯
- pcを起動し気付くとWi-Fiが消えて、機内モード（飛行機マークのみ）の症状に気づく

# いったん完全シャットダウン
- 改善せず

# ドライバーを入れなおしてみる
- ヘルプデスクアカウントでログインし直し、ドライバーのアンインストールし再起動を行った。
※今回はユーザーでは、ドライバーのアンインストールはできない仕様になっているため
- 改善せず

# 会社ドメインに入りなおしてみる
- 管理者アカウントに入りなおす
- 以下に入り、ドメインを外れる
    -  設定→システム→詳細設定→システムの詳細設定→上のタブ「コンピューター名」
　　　→「変更」
- windowsアップデートを実施
- 会社ドメインに入る
- wi-fiの接続を確認

# 感想
- ドメインに入りなおすという発想はなかったため勉強になった
- 権限の問題もあるためこういった不具合が発生した場合、管理者への連絡が重要になる
【簡単】Phoenixで新しいページを追加する手順

手っ取り早くやり方を知りたい人向け。
Phoenixは`v1.6系`と`v1.7系`でページの追加方法が違うため注意が必要。

## v1.6系
新しいページを追加するために作業する必要があるファイルは以下のとおりです。
- `router.exs`
	- `get "/hello", HelloController, :index`を追加
- `controllers/hello_controller.ex`を作成し以下に追記
- `MyappWeb`の`Myapp`のところはプロジェクト名により変わるため注意
```elixir
defmodule MyappWeb.HelloController do 
	use MyappWeb, :controller 
	
	def index(conn, _params) do 
		render(conn, "index.html") 
	end 
end
```
- `views/hello_view.ex`

:::note warn
`MyappWeb`の`Myapp`のところはプロジェクト名により変わるため注意
:::

```elixir
defmodule MyappWeb.HelloView do 
	use MyappWeb, :view
end
```
- `templates/hello/index.html.heex`
- 初期状態ではhelloディレクトリはないはずなので作成する
- 以下を記述
```html
<div class="phx-hero"> 
	<h2>Hello World, from Phoenix!</h2> 
</div>
```

## 1.7系
`アプリ名_web/router.ex`に新しいルートを追加
```elixir
scope "/", Phoenix177Web do
	pipe_through :browser

	get "/", PageController, :home
	get "/hello", HelloController, :index #<- new
end
```

`アプリ名_web/controllers`直下に`hello_controller.ex`を作成
```elixir
defmodule ${アプリ名}Web.HelloController do
  use ${アプリ名}Web, :controller

  def index(conn, _params) do
    render(conn, :index)
  end
end
```

`アプリ名_web/controllers`直下に`hello_html.ex`を作成
```elixir
defmodule HelloWeb.HelloHTML do
  use HelloWeb, :html

	# 直接DOMを書く場合
  def index(assigns) do
    ~H"""
    Hello!
    """
  end

	# DOMを別ファイルで記述する場合
  embed_templates "hello_html/*"	
end
```

`アプリ名_web/controllers`直下に`hello_html`ディレクトリを作成
`アプリ名_web/controllers/hello_html`直下に`index_html.heex`を作成
```html
<section>
  <h2>Hello World, from Phoenix!</h2>
</section>
```
ngrok Oneliner for MySQL 3306【ワンライナー】

```bash
cd \
  && wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz \
  && tar xf ngrok-v3-stable-linux-amd64.tgz \
  && ./ngrok config add-authtoken YOUR_TOKEN \
  && ./ngrok tcp 3306
```

以下からトークンを取得できます

https://dashboard.ngrok.com/get-started/setup

YOUR_TOKENを入力してgistに貼り付けておくと便利
buildahでMulti-platform imagesを作成するサンプル

```sh
cat multiarch image built > index.html
chmod 644 index.html
cat <<"EOF"> Dockerfile
FROM docker.io/library/nginx:latest
COPY ./index.html /usr/share/nginx/html
EOF

buildah bud --arch amd64 -t tmp/nginx-amd64:latest
buildah bud --arch arm --variant v5 -t tmp/nginx-arm-v5:latest
buildah bud --arch arm --variant v7 -t tmp/nginx-arm-v7:latest
buildah bud --arch arm64 --variant v8 -t tmp/nginx-arm64-v8:latest

buildah manifest create kahiro/nginx-multiarch:latest
buildah manifest add --os=linux --arch=amd64 kahiro/nginx-multiarch:latest tmp/nginx-amd64:latest
buildah manifest add --os=linux --arch=arm --variant v5 kahiro/nginx-multiarch:latest tmp/nginx-arm-v5:latest
buildah manifest add --os=linux --arch=arm --variant v7 kahiro/nginx-multiarch:latest tmp/nginx-arm-v7:latest
buildah manifest add --os=linux --arch=arm64 --variant v8 kahiro/nginx-multiarch:latest tmp/nginx-arm64-v8:latest

buildah manifest inspect localhost/kahiro/nginx-multiarch:latest

buildah login docker.io

buildah manifest push --all kahiro/nginx-multiarch:latest docker://kahiro/nginx-multiarch:latest
```

## 参考

https://qiita.com/sonq/items/0f988f52f2813b09209e
ダウンロードフォルダにファイルをダウンロードできない問題

# 背景
- ファイルをダウンロードする際に、保存ボタンを押すとエクスプローラーがフリーズしてしまう

# 問題個所の調査
- chromeのキャッシュクリア
    - 改善しない
- chrome再インストールでも復旧せず
    - 改善しない
⇒ chromeの問題ではないと思われる

- 完全シャットダウン
    - 改善しない
⇒pcの問題ではないと思われる
- 代替機を用いて同じファイルをダウンロード
    - 問題なくダウンロードできた
⇒ファイルの問題ではないと思われる
- 別フォルダに保存してみる
    - 保存できた
⇒フォルダの問題であると思われる

# 改善方法
- ダウンロードフォルダのtempファイルを削除するも復旧せず
- 隠しファイルを表示できるようにしたうえでさらに「保護されたオペレーティングシステムファイルを表示できる」ようにする
    - これで可視化できるようになったtempファイルをダウンロードフォルダより除去し
復旧を確認

# 結論
- ダウンロードフォルダ内の隠しファイルが悪さをしていたことが分かった。
- ブラウザ⇒pc⇒ファイル⇒フォルダの順で検証を行い時間はかかってしまったが、検証の順番としては悪くないと思うので、良しとしようと思う
ApacheにRailsの動作環境を作る

## 環境
- Ubuntu20.4 + vagrant
- Apache2.4.41 + Passenger
- Ruby2.6
- Rails5.2

## はじめに
ApacheにRailsを動作させる環境を設定します。

## 設定

ApacheでRailsのプロジェクトを動かす元となるディレクトリを決める必要があります。Apacheではデフォルトで、Webアプリを/var/www配下に置くことになっています。しかし、必ずしもそこに置かないといけないといった決まりはありません。しかし、事実上、/var/www配下に置くことが暗黙の了解になっているようです。Railsのプロジェクトは任意のディレクトリで動作させることができます。/var/www配下で動かしたい場合は、/var/www配下にRailsのプロジェクトのシンボリックリンクを配置することで実現することができます。

- #### Railsのプロジェクトをルートにする場合

仮想ホストを設定するファイルを新規に作成した後、DocumentRootディレクティブで、Railsのプロジェクトのpublicのパスを指定します。

```/etc/apache2/sites-available/hoge.conf
<VirtualHost *:80>
    DocumentRoot /vagrant/hoge/public
</VirtualHost>
```

ファイルを保存した後、**sudo a2ensite hoge**を実行して、/etc/apache2/sites-enabledへのシンボリックリンクを作成します。デフォルトで用意されている、000-default.confはサンプルなので、**sudo a2dissite 000-default**で無効化します。

このような環境になっていればOKです。

```
$ls -l /etc/apache2/sites-available
000-default.conf                          # デフォルト用意
default-ssl.conf                          # デフォルト用意
hoge.conf                                 # 自作

$ls -l /etc/apache2/sites-enabled
hoge.conf
```

apache2.confのDirectoryディレクティブで、Railsのプロジェクトのディレクトリのパスを指定します。ここで指定するパスに、Railsのプロジェクトの配下にあるpublicまで含めてはいけません。publicを含めてしまうとRailsアプリは動作しなくなります。

```/etc/apache2/apache2.conf
<Directory /vagrant/hoge/>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>
```

- #### ApacheのルートにRailsのプロジェクトのリンクを配置する場合

新規に作成した仮想ホストを設定するファイル内で、DocumentRootディレクティブに対し、Apacheのルート（/var/www）配下にRailsプロジェクトのpublicのパスを指定します。

```/etc/apache2/sites-available/hoge.conf
<VirtualHost *:80>
    DocumentRoot /var/www/vagrant/hoge/public
</VirtualHost>
```

Apacheのルート（/var/www）配下に、Railsプロジェクトのディレクトリのシンボリックを作成します。Railsプロジェクトをごっそりコピーしてくるようなことはしないでください。ソースを二重管理することになり無駄が発生します。

```
#ln -s /vagrant/hoge /var/www/hoge
```

apache2.confのDirectoryディレクティブで、Apacheのルート（/var/www）配下のRailsプロジェクトのパスを指定します。先にも言いましたが、くれぐれも、publicまでは指定しないでください。publicまで指定すると、Railsは動作しなくなります。

```/etc/apache2/apache2.conf
<Directory /var/www/hoge/>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>
```

Directoryディレクティブには、Apacheのルート（/var/www）だけを指定しても問題ありません。指定したディレクトリ配下の子ディレクトリ（Railsのプロジェクトのディレクトリ）もちゃんと有効になります。

```/etc/apache2/apache2.conf
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
```

#### デーモンの再起動

Apacheの設定ファイルを修正したら、Apacheのデーモンを再起動させて反映させます。

```
$systemctl restart apache2
```

これで、ブラウザからURLを指定すると、Railsが起動します。名前解決をしていない場合は、URLでIPアドレスを指定することになります。
```
http://IPアドレス
```
Spring Data JPA を利用中に思い付いたことのメモ

## 概要
Spring Data JPAを開発に使用していて気づいた、アイデアというほどでもない諸々のメモです。
陳腐化するのも早そうですが、自分の備忘用にも今後追記していくと思います。
念のため、対象になるバージョンも太字で付記しておきます。

## `@Query`で頻出する句は文字列定数で管理する
**ver.2.x**
`@Query`はメソッド単位のため、同じ記述を複数のメソッドに行わなければならないケースが出てきます。
典型的な例が集計結果をProjectionでDTOにデータを格納する場合の`select new packages.DTO(...)`など。

そういう場合はクエリ用のヘルパークラスかDTOに文字列の定数として頻出句を定義してしまうのが良さそうです。Specificationを定義していたらその中も良さそうですね。
アノテーションに指定するクエリはその時点では文字列でしかなく、定数はIDEが内容を表示してくれるので確認も困りません。当然ながら、誤記の危険も減りますし、変更への対応も楽になります。

## `@Query`で使用するJPQLではエイリアスを短くしない
JPQLの書き方を検索すると非常に短いエイリアスを使用している例をよく見かけます。
シンプルなクエリなら良いですが、多くのテーブルを複雑にJOINするようなクエリで極端に短いエイリアスを使用していると、可読性が著しく下がります。
リファクタリングの時に後悔しますし、エイリアス名をドキュメント化するような事態になりかねません。

タイプする文字数は多くなりますが、エンティティの名前を使用するのが無難です。
【web開発編】VSCodeおすすめ拡張機能

## はじめに

今回の記事では普段使用しているweb開発におすすめのVSCode拡張機能を紹介します。
全ユーザーにおすすめの拡張機能も紹介しているので良かったらご覧ください。

https://qiita.com/expsh13/private/78c0057214740faf24eb

## 拡張機能
### [Auto Rename Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)
1 つのHTML/XMLタグ（開始タグor終了タグ）の名前を変更すると、ペアになったHTML/XMLタグの名前も自動的に変更されます。
タグを自動補完してくれるので、タグを修正した際の効率アップと修正漏れによるエラーを防ぐことができます。

### [Highlight Matching Tag](https://marketplace.visualstudio.com/items?itemName=vincaslt.highlight-matching-tag)
この拡張機能を使用することで一致する開始タグおよび/または終了タグをハイライトすることができます。

### [Image preview](https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview)
画像のプレビューをHTML,CSSなどに表示させることができます。

### [indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)
インデントの階層毎に色をつけることでインデントを読みやすくする拡張機能です。

### [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)
ローカルサーバーを簡単に立ち上げることができます。

### [Placeholder Images](https://marketplace.visualstudio.com/items?itemName=JakeWilson.vscode-placeholder-images)
VSCode上でプレースホルダー画像を生成し、HTMLに挿入することができます。
VSCodeおすすめ拡張機能

## はじめに

今回の記事では普段使用しているおすすめのVSCode拡張機能を紹介します。
web開発編も紹介しているので良かったらご覧ください。

https://qiita.com/expsh13/private/5130bc1849703132d4b8

## 拡張機能
### [Draw.io Integration](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)
VSCodeでDraw.ioを使用することができます。
これを使用してフローチャートやネットワーク図など簡単に作成することができます。

### [Edit csv](https://marketplace.visualstudio.com/items?itemName=janisdd.vscode-edit-csv)
コンマ区切りで見にくいcsvファイルをこの拡張機能を使用すると、Excel のようなテーブルUIでCSVファイルを編集できます。

### [Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
VSCodeを日本語で表示することができます。

### [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)
VSCodeでマークダウンを書くのを便利になります。

### [Markdown Preview Enhanced](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced)
作業中のマークダウンをプレビュー表示することができます。

### [Material Icon Theme](https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme)
フォルダ、ファイルのアイコンを変更することができます。

### [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
整形されていないコードを自動で整形することができます。

### [zenkaku](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku)
全角スペースを可視化することができます。

### [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
cssのクラス名、jsの変数名など記載した英単語のスペルをチェックできます。
自分の知らないうちに発生するスペルミス発見を助けてくれます。
【React】React: 'React' must be in scope when using JSX  react/react-in-jsx-scopeエラーが出た時

## 概要
[Reactの公式チュートリアル](https://ja.react.dev/learn/tutorial-tic-tac-toe)をローカル環境で進めるための環境構築をしている際に表示されたエラーの対処法です。

## エラー内容
```
./src/App.js
  Line 2:  'React' must be in scope when using JSX  react/react-in-jsx-scope

Search for the keywords to learn more about each error.
```

以下のReact公式チュートリアル環境構築手順の5番目、`npm start`を実行した際に表示されたものです。

> 1. Node.js をインストール
> 2. さきほど開いた CodeSandbox のタブで、左上隅のボタンを押してメニューを開き、そのメニューで File > Export to ZIP を選択して、ファイルをローカルにアーカイブとしてダウンロード
> 3. アーカイブを解凍し、ターミナルを開いて解凍したディレクトリに cd する
> 4. npm install で依存ライブラリをインストール
> 5. npm start でローカルサーバを起動し、プロンプト通りに操作し、ブラウザで実行されるコードを確認する

## 解決手順
`src`ファイルの中に入っている`App.js`に`React`をimportすることで解決することができます。
``` React:App.js
import React from 'react';

export default function Square() {
  return <button className="square">X</button>;
}
```

## おわりに
React公式チュートリアルのローカル環境構築手順に
> うまくいかない場合でもここで挫けるのは止めましょう！

と書かれています。挫けずに頑張っていきたい所存です。
お読みいただき、ありがとうございました。
【VB.NET】フォームを開いたときに呼ばれるメソッドの書き方

①form内の部品以外の部分をダブルクリックする。

②以下のようなコードが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/87b3dd4e-df3c-b210-f2ae-6ead7797cb6f.png)

③関数内にプロパティに関するコードを記述する。

④プロジェクト名をクリックしてから、設定のアイコンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/72ca104b-a136-4af8-b506-28be8b44c900.png)

⑤スタートアップフォームを`Form1`に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/25fa5889-704e-4ac7-9917-c9c45b4fe4fa.png)


## 参考サイト
Visual Basic.NET(VB.NET)の基礎
https://tracpath.com/works/development/visual_basic_net_vb_basic/
【Power BI】データソースであるExcelをローカルからSharepointに置き換える


# これからはなすこと
+ ローカル管理していたExcelをSharepointで管理していく
+ 既存レポートを新規作成せずアップデートする方法
+ 管理していく際の注意点


# 目次
1. はじめに
2. SharepointにExcelファイルをアップロード
3. 新規にレポートを作成してSharepointからのインポートを行う
4. 詳細エディターにてコードの書き換えをおこなう
5. おわりに


# 1. はじめに
今回はPower BIレポートをローカルにあるExcelから読み取っていたものをSharepointに置き換えたときのレポート側の設定を行っていきます。

# 2. SharepointにExcelファイルをアップロード
まずはここからですね、Sharepointにアップロードしておきます。この時Power BIで利用している同じアカウントでログインしていると便利だと思います。

# 3. 新規にレポートを作成してSharepointからのインポートを行う
Power BIデスクトップに移動し、Sharepointからのインポートを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2992046/3b8385f2-d2fc-f67c-9d76-cb1090b0b5e4.png)

この時アップロードしたSharepointの一番トップのURLを記載してOKを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2992046/d8ef1a87-7a36-88b9-5f65-aebe9ce68e50.png)

すると以下のような一覧が出てくる。これはSharepointのファイルすべての中身の情報になる。
データの変換をクリックして目的のファイルを見つけていく
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2992046/28a013c9-7c9d-4546-69ea-0a5650d90462.png)

元のファイルをフィルタリングや日付でソートして目的のファイルが見つかったらBinaryをクリック
元のファイルの中身が表示される。
その後、カラム名のヘッダー昇格等を行ったあと、詳細エディターを開く
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2992046/14fb4bf6-f155-2174-e4be-4f5450f70acb.png)



# 4. 詳細エディターにてコードの書き換えをおこなう
既存レポートではExcelからインポートしているのでインポートまでのコードとSharepointに格納したデータをインポートしたところまでのコードを移植すると無事に換装可能になります。
ただし、一部データ型の変換等ができていない可能性があるのでチューニングを行う必要があります。


# 5. おわりに
Sharepointに格納しているとローカル管理よりスケジュール実行がしやすく便利になります。
また、説明した内容を実行すると最初からレポートを作り直す必要がないのでぜひ試してみてください。
久しぶりの投稿ですので勘を取り戻していきます。。。

お付き合いいただきありがとうございました。
vimでファイル保存時に、リモートとローカルディレクトリを同期

最近、IP制限付きのサーバーサイドの開発増えてきたので、ノマドワーカーにとってはIPが固定されない環境に居るので固定開発環境を準備しないといけない。

踏み台サーバーを用意し固定IPを振って、そのサーバー経由で開発リソース接続して開発できるようにする。

サーバーに入って開発vimで開発してもよいし、ローカルでも開発してよいのだが、今回は、ローカルで作業してリモートへ同期するようにしたいので、vimerとしてvimで出来るようにする。

vscodeとかでも良いけど、結局、サーバーサイドエンジニアリングをする場合、vi系のエディターは必須なのでvimでやる。

ローカルでもリモートでもどちらでも開発できるようにすることができるようになる。


### vimの設定解説

`~/.vimrc` か `~/.config/nvim/init.vim` のどちらかに書きを記述。

`autocmd BufWritePost` で保存時に実行実行するコマンドを設定する。

環境変数を使いたいので、 `execute` を使って、 `rsync` のコマンドを設定する。

`/WORKING_DIR_PATH/` は、 `BufWritePost` を実行する作業ディレクトリを設定。


```init.vim
autocmd BufWritePost /WORKING_DIR_PATH/* echo 'File changed. Running rsync.' | execute '!rsync -avz --exclude=.git --exclude=venv/ --exclude-from=.gitignore -e "ssh -i ' . $PEM . '" ./ ' . $RMT_SVR_USER . '@' . $RMT_SVR . ':' . $RMT_SVR_DIR
```
Azureの「トラステッド起動」VMをバックアップする

## はじめに

Azure VM をデプロイする際デフォルトのセキュリティの種類が「トラステッド起動」に変更になりました。

https://techcommunity.microsoft.com/t5/azure-confidential-computing/announcing-trusted-launch-as-default-in-azure-portal/ba-p/3854872

ここで影響を受けるのがAzureBackupです。VMのセキュリティの種類が「トラステッド起動」の場合、従来使用してたであろう「Standard」のバックアップポリシーを紐づけることはできまん。以下の画像のように「Standard」のポリシーがグレーアウトします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561386/0c0a8d09-71d6-51e4-526d-e5cafbce1bf7.png)


つまり、トラステッド起動VMのバックアップを取得するには、バックアップポリシーを「Enhanced」で作成する必要があります。「Enhanced」のポリシーだと一日に複数回バックアップ取得できる等できることは増えています。詳しくは以下のドキュメントを確認してください。（バックアップをたくさん取ればその分お金もかかります）

https://learn.microsoft.com/ja-jp/azure/backup/backup-azure-vms-enhanced-policy?tabs=azure-portal

## トラステッド起動とは

トラステッド起動の説明については公式ドキュメントに任せます。

>Azure からは、第 2 世代の VM のセキュリティを向上させるためのシームレスな方法として、トラステッド起動が提供されています。 トラステッド起動により、高度で永続的な攻撃手法から保護されます。 トラステッド起動は、個別に有効にできる、複数の連携するインフラストラクチャ テクノロジで構成されています。 テクノロジごとに、高度な脅威に対する防御の別のレイヤーが提供されます。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/trusted-launch

## バックアップポリシーを作成

Recovery Services コンテナーは既に構築済みとして話は進めます。
作成がまだの方は以下の記事を参考にRecovery Services コンテナーの作成をしてみてください。

https://qiita.com/bibou6/items/a7be6b9b680555cf0b7b

### Enhancedのポリシーでバックアップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561386/ae6260c2-b085-c498-abab-5cab43fb0840.png)

- Recovery Services コンテナーに移動します。
- 左のメニューから「バックアップポリシー」を選択します。
- 「追加」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561386/7e55d3b9-bd8c-2247-d99d-ca9e4926ee4d.png)

- ポリシーの種類で「Azure 仮想マシン」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561386/526a478e-39c7-eb52-104d-5da168c8b803.png)

- ポリシーの作成で以下の表に合わせて各項目入力します。
- 「作成」を選択します。

|項目|値|
| --- | --- |
|ポリシーのサブタイプ|Enhanced|
|ポリシー名|daily-2200|
|バックアップスケジュール|毎日、22:00、東京|
|インスタント回復スナップショットの保有期間|1日|
|毎日のバックアップ保有期間|7日|

日時のバックアップの最短保有期間が7日になります。

### バックアップポリシーをVMに割り当てる

先ほど作成したバックアップポリシーを対象のVMに割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561386/97e5a4fe-3a17-4478-3cf0-1e6d388b3858.png)


- 「Recovery Services コンテナー」に移動します。
- 左のメニューから「バックアップ」を選択します。
- ワークロードで「Azure」、バックアップ対象で「仮想マシン」を選択します。
- 「バックアップ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561386/b42a6988-2be0-5794-9736-fdbc827ffb19.png)

- ポリシーのサブタイプで「Enhanced」を選択します。
- 先程作成した「daily-2200」のポリシーを選択します。
- 対象のVMを選択します。
- 「バックアップの有効化」を選択します。

## まとめ、所感

AzureVMのセキュリティがデフォルトで「トラステッド起動」に変更になりました。トラステッド起動のVMではバックアップを取得する際のバックアップポリシーは従来の「Standard」ではなく「Enhanced」を紐づける必要があります。今回は「Enhanced」のポリシーを作成して、VMに紐づけるところまでを行いました。
VMのセキュリティの種類はデプロイ後に変更することができませんので、今まで通り「Standard」のポリシーでバックアップを取りたい場合は注意する必要があります。

## 参考

https://learn.microsoft.com/ja-jp/azure/backup/backup-azure-vms-enhanced-policy?tabs=azure-portal

https://learn.microsoft.com/ja-jp/azure/virtual-machines/trusted-launch
自分のかわりに記事を書いてもらう｜GPT-3.5-turboのfine-tuning

# GPT-3.5-turboを使用して、自分が執筆した記事をfine-tuningさせる

最近、OpenAIが言語モデルであるGPT-3.5-turboのfine-tuningをリリースしました。このモデルは、これまで以上に精度と柔軟性が向上しており、私たちの日常の多くのタスクを助ける可能性があります。今回は、GPT-3.5-turboを使用して、私が書いた記事をfine-tuningさせ、自動的に記事の執筆を代行してもらうという実験を行ってみたいと思います。

::: note 
結果は微妙でした。供養のため書き残します。
:::

## GPT-3.5-turboとは
GPT-3.5-turboは、最先端の自然言語処理モデルであり、言語生成、文章要約、質問応答など、さまざまなタスクにおいて驚異的な性能を発揮します。その柔軟性と表現力は、人間の言語能力に非常に近いものであり、私たちの日常の多くのタスクを大幅に効率化できる可能性があります。

## Fine-tuningとは
Fine-tuningは、あるモデルを特定のタスクに適応させるための手法です。例えば、GPT-3.5-turboを「ニュース記事の執筆」という特定のタスクに適用するために、このモデルを数千件のニュース記事でトレーニングすることができます。すると、そのモデルは与えられた情報から自動的にニュース記事を生成することができるようになります。

## 実験の方法
以下の手順で、GPT-3.5-turboを私たちの代わりに記事を執筆するモデルに変換します。

1. データの収集: [まず、私が書いた記事のサンプルを収集します](https://note.com/tregu0458/n/n3ccaea8adfbd)。これは、私の執筆スタイルや好みをモデルに教えるための重要なステップです。記事を8個用意しました。

2. データの整形:system,user,assistantの3つに分けていきます。
    - system: あなたは優秀なエンジニアの記事ライターです。
    - user: 記事のタイトル
    - assistant: 記事の内容(改行を\nで表現してくのが手間だった)
  
3. Fine-tuning: 収集した記事のサンプルを使用して、[GPT-3.5-turboをfine-tuningします。](https://qiita.com/tregu148/items/45b838ca7dc72075d090)これにより、モデルは私たちの執筆スタイルに合わせて調整され、私たちに代わって記事を生成する能力が向上します。

4. 記事の生成: Fine-tuningが完了したら、モデルに特定のトピックや情報を与えるだけで、それに基づいて自動的に記事を生成してもらうことができます。これにより、私たちは他の重要な仕事に集中することができます。

## 実験の結果
109,490tokenで約130円でした。
1. 今回のfine-tuningしたモデル
![スクリーンショット 2023-09-22 071659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/42cf4ec0-05fc-ff6f-2e95-19e6580be927.png "fine-tuning")
2. 素のgpt-3.5-turbo
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/60efd0e5-908e-07f7-1717-9ca148c28d2a.png "素のgpt-3.5-turbo")
3. 素のgpt-3.5-turboにmarkdown形式と指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/cf1953b7-5b60-9bc3-a17e-78d0f86c1cce.png "素のgpt-3.5-turboに指示を当たる")

この実験により、記事の作成をGPT-3.5-turboなどの言語モデルに代行してもらうことが可能であることが示されました。ただし、素のgpt-3.5-turboを工夫するだけでも、大きな差異を感じませんでした。

### 学習に与えた記事をそのまま投げてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/c9ac119f-ece0-f7ec-854c-880e99ba7938.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/026754a6-8eed-702a-8e0b-79a87b9ff029.png)
- 学習で与えた文章と同じような違うようなのがかえってきました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/360620da-0e87-8f90-6f27-64cff0eb98b4.png)
- 素と比較すると学習したものに近いような。

## 感想
効果がはっきりとはわかない結果になりました。そもそも私の文章が特徴が薄かったとか、データ量が少ない事が考えられます。他にもハイパーパラメータなど。chatGPTが文章のたたき台を作るのに適していることは間違いなさそうです。プロンプトでなんとかなるなら、プロンプトでなんとかするのがコスパに優れていそうですよね。
Linux 基礎コマンド



## Linuxとは
Linuxとは、OSの一種でコンピュータを動かすための基本ソフトです。
OS : Windows , MacOS , Andoroid , __Linux__

## Linuxをなぜ学ぶのか？
幅広い場所（サーバー用、組み込み器）でつかわれており、歴史も古いため、改善を重ねているので非常に安定した技術だといえます。そのため、一度習得すると何年たっても使える技能です。

## コマンド
### cdコマンド
ディレクトリを移動するコマンド
書き方:`$ cd [オプション] [ディレクトリ]`
具体例:`$ cd /home/test1`

:::note info
オプションはあまり使わないので、覚えなくてもいい。
:::

| ディレクトリ | 意味 | 書き方 |
|:-:|:-:|:-:|
| カレントディレクトリ  | 今自分がいるディレクトリ  | .  |
| 親ディレクトリ     | 一つ上の階層のディレクトリ  |　..　|
| ホームディレクトリ  | 「/home/ ユーザー名」ディレクトリ  | ~  |
| ルートディレクトリ  | 「/ 」 デ ィ レ ク ト リ  | /  |

### pwdコマンド
カレントディレクトリを表示するコマンド

書き方:`$ pwd [オプション]`
具体例:`$ pwd /home/test1`

### lsコマンド
ファイルやディレクトリを一覧に表示するコマンド
書き方:`$ ls [オプション][ディレクトリファイル名]`
具体例:`$ ls /`
        `bin dev home test1` 

### よく使うオプション
ファイルの詳細情報を表示する
書き方:` $ ls -l`

隠しファイルを含めた全ファイルの表示
書き方:`$ ls -a`

ファイルの種別の表示
書き方: `$ ls -F`

### mkdirコマンド
ディレクトリを作成するコマンド
書き方:`$ mkdir [オプション](作成するディレクトリ名]`
    具体例:`$ mkdir code`

:::note info
ディレクトリ名は日本語だと文字化けする可能性があります。
:::

### rmdirコマンド
空のディレクトリを削除する
書き方:`$ rmdir (ディレクトリ名)`
具体例: `$ rmdir code`

::: note info
空でないディレクトリを削除しようとするとエラーになる
:::

### catコマンド
ファイルの中身を表示する
書き方:`$ cat [オプション](ファイル名)`
具体例:`$ cat /etc/hosts`

### lessコマンド
ファイルの中身をスクロール表示する
書き方:`$ less [オプション](ファイル名)`
具体例:`$ less /etc/vimrc`

### tailコマンド
ファイルの末尾の内容を表示する
書き方:`$ tail [オプション](ファイル名)`
具体例:`$ tail code`

::: note info
デフォルトでは末尾10行の内容を表示する
:::

### touchコマンド
空のファイルを作成する
書き方:`$ touch (ファイル名)`
具体例:`$ touch README.md`

### rmコマンド
ファイルを削除する
書き方:`$ rm [オプション](ファイル名)`
具体例:`$ rm README.md`

### よく使うオプション
ディレクトリも合わせて削除する
書き方:`$ rm -r dir`

### mvコマンド
ファイルの移動、ファイル名の変更
書き方:`$ mv[オプション](移動元)...(移動先)`
具体例:
`$ mv file file1`・・・ ファイル名変更 
`$ mv file1 dir/`・・・ファイル移動

### cpコマンド
ファイル、ディレクトリをコピーする
書き方:`$ cp[オプション](コピー元)...(コピー先)`
具体例:
`$ cp file newfile`・・・ファイルをコピー
`$ cp file dir`・・・ファイルをディレクトリ内にコピー

### lnコマンド
Linuxでは、ファイルに別名をつけることができる。別名をつけることを『リンクを張る』と言う。
ハードリンク・・・一つのファイルの実体に複数の名前をつける機能。すべてのハードリンクを消さないと消えない。
シンボリックリンク・・・リンク先のパス名が書かれた特殊なファイル。リンク先がファイルの実体。

書き方:`ln [オプション](リンク元ファイル名)(リンク名)`
具体例:
`ln file1 file2`・・・ハードリンクを張る
`ln -s file1 file3`・・・シンボリックリンクを張る

### findコマンド
ファイルを検索する
書き方:`find [検索開始ディレクトリ](検索条件)(アクション)`
具体例:`$ find .-name README.md -print`

### chmodコマンド
ファイルやディレクトリのパーミッションを設定する
書き方:`$ chmod [ugoa][+-=][rwx](ファイル名)`
具体例:`$ chmod u+w file`
__詳細__
| 記号 | 内容 |
|:-:|:-:|
| u  | 所有者の権限  |
| g  | グループの権限  |
| o  | その他のユーザーの権限  |
| a  | 全ユーザーの権限  |
| +  | 権限を追加  |
| -  | 権限を削除  |
| =  | 記述した権限にする  |

### 数値で指定する場合
書き方:`$ chmod [8進数の数値][ファイル名]`
具体例:`$ chmod 755 file`
__詳細__
|パーミッション  | 数値 |  
|:-:|:-:|
| r (読み取り)  | 4  |
| w (書き込み) |  2 |
| x ( 実行) |  1 |

| オーナー | グループ | その他 |
|:-:|:-:|:-:|
| rwx  | r-x  | r-x  |
| 4+2+1  | 4+1  | 4+1  |
| 7  | 5  | 5  |

### chownコマンド
ファイルやディレクトリの所有権変更
書き方:`$ chown [オプション][ユーザーorグループ][ファイルorディレクトリ]`
具体例:`$ chown root test1.txt`

### psコマンド
実行中のプロセスを表示する
書き方:`$ ps [オプション]`
具体例:`$ ps`

### killコマンド
ジョブやプロセスを終了させる
書き方:
`$ kill [オプション] %[ジョブID]`
`$ kill [オプション] [プロセスID]`
具体例:
`$ kill %1`
`$ kill 4965`

## 参照
- もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう  Udemy](https://www.udemy.com/course/unscared_linux/)
- [Linux標準教科書](https://linuc.org/textbooks/linux/)
TRONの坂村先生にお会いした時の話

# はじめに

日本語プログラミングのタグでTRONの話題がありました。昔話ですがMindを使ってくれませんかと坂村先生に提案しに伺ったときの様子です。

## 研究室訪問

坂村先生には１度だけお会いしたことがあります。OSの標準言語としてMindを使ってくれませんかと提案しに研究室に伺いました。もちろん私にはツテが無く、メインの訪問者はMSAさん（当時、マイクロソフトウェア・アソシエイツ）で私は同行者でした。時期は1987年～1988年ぐらいだと思います。

一通りMindのデモと説明をさせていただいたあと、先生のお答えは「TRONにはプログラム言語（名前は忘れました）があるからいいです」ということでした。
当時の記憶が薄れていて、その言語がカード型のものを指していたのか、別のタイプだったのかははっきりしませんが簡易型のものだったように思います。ちなみに当時は既にMacの「HyperCard」が登場していました。いずれにしても「それでいいのかな？(それだけで間に合うのかな)」というのが私の感触でした。もちろん恐れ多くて突っ込んでお聞きすることはしませんでした。

あとから思えば、先生のお考えとして「このOSでプログラムをぐりぐりと書くのはふさわしくない」というのがあったかもしれません（でも誰かがそのぐりぐりをやらないとアプリケーションは増えないのですが）。
あるいはMindを同様の簡易言語のように捉えられていて、だったら二つは要らないと思われたのかも知れません。
そのようなことで、MindはTRONにぴったりだと思っていたのですがちょっと残念な結果でした。

## 参考情報

[「日本語プログラミング言語は必要か」という大学教授さんの記事に感銘をうけた話](https://qiita.com/mylifewithviolin/items/2b9a4cba5b475af84f20)
Javaで「三角関数に関する計算を行う」の動作を確認してみた

# 概要

Javaで「三角関数に関する計算を行う」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/math/index9.html

# 実装

以下のファイルを作成しました。
```JSample9_1.java
class JSample9_1{
  public static void main(String[] args){
    System.out.println("sin30° = " + Math.sin(Math.PI / 6));
    System.out.println("sin45° = " + Math.sin(Math.PI / 4));
    System.out.println("cos60° = " + Math.cos(Math.PI / 3));
    System.out.println("cos45° = " + Math.cos(Math.PI / 4));
    System.out.println("tan60° = " + Math.tan(Math.PI / 3));
    System.out.println("tan45° = " + Math.tan(Math.PI / 4));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample9_1.java 
$ java JSample9_1 
sin30° = 0.49999999999999994
sin45° = 0.7071067811865475
cos60° = 0.5000000000000001
cos45° = 0.7071067811865476
tan60° = 1.7320508075688767
tan45° = 0.9999999999999999
```

# まとめ
何かの役に立てばと。
[GCP] Workflows機能x実装

# GCPのWorkflowsについて

GCPのWorkflowsは、タスクの実行と制御のための単純で柔軟な実行環境です。このサービスを使用することで、異なるサービスやAPIの呼び出しや、条件に基づいた制御フローの定義が可能。

## 機能

### 1. ワークフローの定義と制御

GCPのWorkflowsでは、YAML形式でワークフローを定義することができる。この定義には、各タスクの手順と条件、依存関係などを設定する。また、複数のタスクを直列に実行したり、並行して実行したりすることもできる。

### 2. サードパーティのAPIとの連携

Workflowsは、様々なサードパーティのAPIとの連携をサポートしている。RESTやgRPCで公開されたAPIを使用する場合、タスクとして呼び出しを追加することができる。また、自動的に再試行やエラーハンドリングを行ってくれるため、信頼性の高いAPI呼び出しを簡単に実現することができる。

### 3. 高度な制御フロー

Workflowsでは、条件に基づいた処理や反復処理を簡単に定義することができる。たとえば、ある条件が成立した場合のみ特定のタスクを実行したり、リストやマップなどのデータ構造を使用して繰り返し処理を行ったりすることができる。

### 4. ログとデバッグのサポート

ワークフローの実行状況やログは、Cloud ConsoleやStackdriver Loggingなどのツールを使用して確認することができる。また、デバッグ時にはステップごとの出力を表示することも可能できる。

## サンプルコード

### Java

```java
import com.google.api.services.workflows.v1beta.model.*;

String sourceCode = "execution:\n" +
  "  - call: test_task\n" +
  "  - return:\n" +
  "      status: \"Success\"";

Workflow workflow = new Workflow();
workflow.setSourceCode(sourceCode);

WorkflowServiceClient client = WorkflowServiceClient.create();
CreateWorkflowRequest request = CreateWorkflowRequest.newBuilder()
  .setParent("projects/my-project/locations/us-central1")
  .setWorkflow(workflow)
  .build();

Workflow response = client.createWorkflow(request);
System.out.println("Workflow created: " + response.getName());
```

### Go

```go
package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"log"

	workflowpb "google.golang.org/genproto/googleapis/cloud/workflows/v1beta"
	"google.golang.org/grpc"
)

func main() {
	ctx := context.Background()

	conn, err := grpc.Dial("workflow.googleapis.com:443", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("Failed to connect: %v", err)
	}
	defer conn.Close()

	client := workflowpb.NewWorkflowsClient(conn)

	sourceCode, err := ioutil.ReadFile("workflow.yaml")
	if err != nil {
		log.Fatalf("Failed to read source code: %v", err)
	}

	req := &workflowpb.CreateWorkflowRequest{
		Parent: "projects/my-project/locations/us-central1",
		Workflow: &workflowpb.Workflow{
			SourceCode: string(sourceCode),
		},
	}

	res, err := client.CreateWorkflow(ctx, req)
	if err != nil {
		log.Fatalf("Failed to create workflow: %v", err)
	}

	fmt.Printf("Workflow created: %s", res.GetName())
}
```

### C#

```csharp
using System;
using Google.Api.Gax.Grpc;
using Google.Cloud.Workflows.V1Beta;

string projectId = "my-project";
string location = "us-central1";
var client = new WorkflowServiceClientBuilder().Build();

string sourceCode = "execution:\n" +
  "  - call: test_task\n" +
  "  - return:\n" +
  "      status: \"Success\"";

var workflow = new Workflow
{
    SourceCode = sourceCode
};

var request = new CreateWorkflowRequest
{
    Parent = WorkflowName.Format(projectId, location),
    Workflow =workflow,
};

var response = client.CreateWorkflow(request);
Console.WriteLine($"Workflow created: {response.Name}");
```

以上はGCPのWorkflowsの概要と機能についての解説と、Java、Go、C#のサンプルコードです。Workflowsを使用することで、効率的なタスク実行と制御を実現することができる。
【備忘録】個人的に気になったネット記事、資料をまとめる～その３・IPv4,v6関連～

# はじめに

この記事では以下のようなことを記載しています

- 個人的に気になって読んでみたネット記事、資料のURL
- 概要と個人的な感想
- 参考情報
    - 関連するページのURL
    - 勉強会のアーカイブ動画
    - その他もろもろ

上記はあくまで目安で、フォーマットは縛り過ぎずに書いていきます
また、まとめる頻度も週1回程度を目指しますが、あまり縛らずにゆる～く続けていこうと思っています

また、ストックしている中から適当に選んでいるので、最新記事とかではありません
ちょっと昔のネタでも、まとめておきたいなと思ったら躊躇なく記載するのでご了承ください

完全に個人的なまとめですが、もしどなたかの役に立てば光栄です

# AWSのPublic IPv4構成をIPv6に切り替える

https://blog.father.gedow.net/2023/09/04/aws-public-ipv4-to-ipv6/

- 概要
    - タイトルの通り、AWSのVPCをIPv4からIPv6に切り替えるために必要なことがまとめられている
    - 手順だけではなく、解説や実際のTerraformのコードも書かれているため超実践的な記事
    - 疎通確認の例まで記載されている
- 感想
    - ちょうど業務でIPv6を有効化する必要があったので読んだが、永久保存版だと思った
    - Egress Only G/W、NATGW、IGWの違いやIPv6有効化の時のセキュリティグループの設定例など、わかっているようでわからないトピックが多い
    - 最後に動作確認の方法まで記載されてるので、即業務に使えると感じた

# AWS パブリックIPアドレス 料金体系変更に対応する作業 EC2編

https://zenn.dev/ryoyoshii/articles/ecef64cde77b2f

- 概要
    - AWSのパブリックIP有料化の発表を受けての対応作業を考察する記事
    - そもそも料金がどれくらいかかるのか、対策する必要があるのか、対策するならどんな手が考えられるのか、が書かれている
- 感想
    - パブリックIP有料化の対策が簡潔にまとまっている
    - 料金と照らし合わせて、そもそも対策する必要があるかどうかを考えるためのヒントも書かれているのがありがたい
- AWS におけるパブリック IPv4 アドレスの使用状況の特定と最適化

https://aws.amazon.com/jp/blogs/news/identify-and-optimize-public-ipv4-address-usage-on-aws/

- EC2 パブリックIPアドレス無効化はTerraform一択だったかもしれない

https://zenn.dev/ryoyoshii/articles/81a7cfc7140816

# AWS公式レポート IPv6 on AWS を読み解いていく

https://shimakaze.hatenablog.com/entry/2021/12/03/200611

- 概要
    - AWSが出しているレポート「IPv6 on AWS」の概要をまとめている記事
    - IPv6 on AWSは、AWSでIPv6を使用して設計するときに考えるべきことがまとめられている。加えて、IPv6を有効化する意味や導入にあたっての課題などが書かれている
    - 記事の中のリンクは古いリンクのようで、最新版「IPv6 on AWS」は以下です

https://docs.aws.amazon.com/whitepapers/latest/ipv6-on-aws/IPv6-on-AWS.html


- 感想
    - かなり長い公式ドキュメントを概要レベルでまとめていただいてるので、頭に入ってきやすい
    - まずはこの記事を読んで、必要に応じて「IPv6 on AWS」本体を読むというのがよさそう
    - 個人的にこのレポートがありがたいと思ったのは、IPv6に対応していないサービスでどのようにIPv6を使うかが書かれていること。IPv6という切り口でまとめてくれているので探しやすいと感じた。
非機能要件を定義するまでの道

以前要件定義を担当した際非機能要件は基本設計フェーズで対応することにしました。
現状基本設計フェーズに移行し非機能要件を決めるにあたって得た知識をまとめていきます。

https://qiita.com/suda_imagitech/items/d13ece6ce546922006b4

# 1. まず非機能要件の項目って何？

◼ 可用性
◼ 性能・拡張性
◼ 運用・保守性
◼ 移行性
◼ セキュリティ
◼ システム環境

こちらは以前要件定義をする際に見つけたものです。
ただ、大項目なので詳細に何を決めるのかがよくわかっていません。
そんなこんなで調べてみるとIPAにたどり着きました。

https://www.ipa.go.jp/archive/digital/iot-en-ci/jyouryuu/hikinou/ent03-b.html


こちらを見てみると非機能要求グレードというものがあります。
>「非機能要求グレード」は、「非機能要求」についてのユーザと開発者との認識の行き違いや、互いの意図とは異なる理解を防止することを目的とし、非機能要求項目を網羅的にリストアップして分類するとともに、それぞれの要求レベルを段階的に示したものです。重要な項目から順に要求レベルを設定しながら、両者で非機能要求の確認を行うことができるツール群です。

要するに非機能要求項目がリストアップされています。
何を決めるかよくわかっていなかった自分にとってこれは非常に参考になるものでした。

# 2. 性能・拡張性の小項目を見てみる

非機能要求グレードの中に要求項目をまとめている樹形図があるためこちらを見てみましょう。
すべての大項目をみるのはきりがないため今回は性能・拡張性に注目してみます。
>樹系図…非機能要求項目を6つの大項目ごとに階層的に示した図


>![05_樹系図_page-0006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/06a7e7b1-1e32-c5ae-28c9-a45cd4f0bdf0.jpeg)
出展：[IPA 『非機能要件グレード 樹形図 P.6』](https://www.ipa.go.jp/archive/digital/iot-en-ci/jyouryuu/hikinou/ent03-b.html)

※ベージュ色は重要項目となっております。

通常時の業務量のユーザ数、同時アクセス数、データ量、オンラインリクエスト件数、バッチ処理件数
保管期間などなど非機能要件で記載すべき項目が記載されています。

この資料を見てみるだけでも非機能要件の解像度が相当違ってくると思いおます。

まずこちらの資料を参考にすることで項目を漏れなく網羅することができます。

# 3.各項目の内容を決める

上記で小項目を網羅することができました。
次はその項目それぞれにどのような内容を記載するか見てみましょう。
項目名を見てその内容を記載するのは当然ですが、こちらの参考資料もIPAのほうで公開されているので見てみます。

何が表しているかというところでまず
↓の画像ですが、こちらにはモデルシステムが記載されています。
ここで開発するシステムに最も近いモデルシステムを1つ選択します。
>![03_グレード表_page-0005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/59b79ef0-f6a7-2492-bc3d-935bd65d88ed.jpeg)
出展：[IPA 『非機能要件グレード グレード表P.5』](https://www.ipa.go.jp/archive/digital/iot-en-ci/jyouryuu/hikinou/ent03-b.html)


上記で決めたモデルシステムによって各小項目のレベルを決定します。
ユーザ数を例に出すと
社会的影響が殆ど無いシステムだった場合
「特定ユーザのみ」に決まるような感じです。

>![03_グレード表_page-0007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/13e2334b-a30f-34ba-9c55-3e8827630c21.jpeg)
出展：[IPA 『非機能要件グレード グレード表P.7』](https://www.ipa.go.jp/archive/digital/iot-en-ci/jyouryuu/hikinou/ent03-b.html)


# 4.終わりに
IPA本当にありがとう。感謝しかないです。
正直ちょっととっつきにくかったのですが今回の件でIPAさんが好きになりました。
今後もIPAをガンガン頼っていきたいと思います。

# 5.予告
次の記事では「非機能要件を定義するにあたって苦労した点」についてまとめたいと思います。
10月6日金曜日に投稿予定です。
思い立ったが吉日なのでasdfでBunを入れてみたメモ

```shell
# asdf-bunプラグインを追加
$ asdf plugin add bun

# Bunのバージョンを確認
$ asdf list all bun

# 1.0.2をインストール
$ asdf install bun 1.0.2

# globalのBunのバージョンを指定
$ asdf global bun 1.0.2

# ちゃんと入ったか確認
$ bun -v
```


##### 実際に走らせてみた追記
既存のReactなプロジェクトをBunで走らせてみると、初回はそれなりに時間がかかったけれど2回目は目に見えて早くなった。
良いぞBun、頑張れBun。
GPT-4の知識が2022年1月までに延長されたので検証した

## TL;DR

* OpenAIの（Web）アプリであるChatGPTのうち、有料プランのGPT-4の知識が2022年1月までに延長された
* それまでは2021年9月までだった
* 検証したところ2022年の1月23日以降の情報は知らないようだ

## 概要

タイトルにある通りなのですが、GPT-4の知識（カットオフ時点）が2021年9月から2022年1月まで伸びたと話題になっています。公式からのアナウンスはまだないように見受けられます。

https://analyticsindiamag.com/chatgpt-cut-off-date-now-january-2022/

## 検証

試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64722/9445b4f0-2398-fad2-6a7e-d17627e5d4a3.png)

確かに今までと応答が変わっていますね。

ちなみにGPT-3.5では以前のまま2021年9月までなので、ChatGPT Plus(有料)に加入していないと試すことができません。また、Azure OpenAI Serviceへの反映はまだです。

## 1月のいつまでなのか

せっかくなので、本当に1月のデータを持っているのか、正確なカットオフ時点は1月の何日なのかを問い詰めてみます。

1月1日から1月19日までのデータは持っているようです（詳しくは[会話履歴](https://chat.openai.com/share/e67323b6-cba5-42f0-ba23-376b42eac03c
)を参照）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64722/3b29952b-4cbc-7e59-a0e1-f9f459fc18e0.png)

いっぽうで、1月23日に起きた出来事は知らないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64722/7cdb2a9d-8f8a-224b-cb09-85c6a8ed4e7b.png)

したがって、新しいGPT-4の知識カットオフは、2022年1月19日から2022年1月23日の間のいずれかの時点と推測することができます。

## 会話履歴

https://chat.openai.com/share/e67323b6-cba5-42f0-ba23-376b42eac03c

## 参考文献

https://ja.wikipedia.org/wiki/2022%E5%B9%B4
MacのDocker Desktopを利用して6443ポートがコンフリクトしてしまう場合の対応法

# 環境前提
MacのDocker Desktopを使っている前提です。
なお、自身のMAC OSのバージョンは12.6.9、Docker Desktopのバージョンは4.6.1です。

# 概要
dockerを起動しようとしたところ下記のエラーが表示されました。
これはdockerコンテナ上の通信のために親ホスト側で6443ポートを利用しようとしていて、稼働中の親ホスト環境でも6443ポートを利用しているのでポート番号が競合してしまってるのでエラーが出力されています。
```
ERROR: for testcontainer  Cannot start service yyyyy: driver failed programming external connectivity on endpoint testcontainer(7e3987bc0b4f9f82af72b1669587a7f3e080df33e6af810729bc92fac51d8273): listen tcp4 0.0.0.0:6443: bind: address already in use
```

下記コマンドにてプロセスを特定したところDocker Desktopで6443ポートが使われていました。
6443というポート番号は複数のコンテナ上で稼働させていると、TLSの「443」ポートつながりで親ホストからも設定される可能性があります。
```
$ sudo lsof -i :6443
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 8172  azarashi  168u  IPv4 0x264940a1a6d323cd      0t0  TCP localhost:sun-sr-https (LISTEN)
$ pstree
```

対応方針としては以下の2つです。今回は(2)の方針で進めます。
- (1) アプリケーション側で6443を利用しない様にする。
- (2) Kubernetes機能を使っていないのならば、6443ポートで起動する機能を停止する。

Docker DesktopのPreferencesを開いて、左側の「Kubernetes」タブを開く事で下記画面が表示されます。
今回は「Kubernetes」を利用していなかったので、「Enable Kubernetes」のチェックを外して「Apply&Restart」を実行しました。
![スクリーンショット 2023-09-22 9.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145493/85f22239-181e-fd74-cb50-274f10246b32.png)


しかし、その後も6443ポートのプロセスは消えることがなかったので、しばらくハマりましたが、MAC OS自体をその後OS再起動することで6443ポートを利用するプロセスが起動しなくなりました。
「Apply&Restart」だけでは6443ポートのプロセスを削除まで行ってくれないみたいなので注意が必要です。
オンプレのPostgreSQLからAzure Database for PostgreSQLにDBを移行したい

# はじめに
オンプレミスのPostgreSQLをAzureのクラウド環境に移行することになった。DBはある程度触った事があるが、クラウドについての知識は一切なく、移行も慣れていなかったので自分がやったことをまとめておくことにする。

# Azure Database for PostgreSQLのセットアップ
まずは、Azure Database for PostgreSQLのインスタンスを作る。
Azure portalから、リソースの作成＞データベース＞Azure Database for PostgreSQLを開き、フレキシブルサーバーを選択して作成する。（単一サーバーは将来的に廃止される模様）
その後、インスタンス概要ページからデータベースを選択し、移行元データベースと同名のデータベースを新規に追加する。

# データベースのバックアップ
オンプレミスデータベースのSQLファイルをエクスポートする。
psqlでもpg_dumpでも同じようなことができるっぽいが、pg_dumpの方が本来の使い方に適しているのでそちらを使うことにする。
`pg_dump dbname=<データベース名> -U <ユーザ名> --clean -f <任意のファイル名>`
`pg_dumpall -U <ユーザ名> --roles-only --clean -f <任意のファイル名>`

`pg_dump`コマンドでテーブルやそのレコード、ファンクションのバックアップを取ることができ、`pg_dumpall --roles-only`コマンドでユーザーアカウントのバックアップを取れる。

# データベースのリストア
Azure Database for PostgreSQLへSQLファイルをインポートする。
今回はpgAdmin4を使った。Azure database for PostgreSQLインスタンスへ接続し、移行元データベースと同名のデータベースを右クリックし、Query Toolを開き、フォルダアイコンからバックアップファイルをインポートする。

# アプリケーションの設定変更
あとはアプリケーションのDB接続先を移行先のものに変えてあげて完了。

# 最後に
調べると色んなやり方が出てきてどれを採用したらいいか迷った。データ容量の多いものには不向きとか、ダウンタイムが長いとか、それぞれ特徴があるらしかったが、今回はとりあえず簡単に移行できる方法、に焦点を当ててやってみた。
UbuntuServerのviで十字キーを押すとABCDとなる。またUSキーボードでの「:」やアンダーバーの打ち方。

Ubuntuサーバのⅵエディタで矢印キーを押すとABCDと表示される対処法。

vimをインストールする。


sudo apt install vim

これで解決します。


USキーボードで「：」を打つときはシフトキーと「＋」を押すと出てくる

「［　」（ブラケット）は「＠」を押すと出てくる。
「　］」は「「」を押すと出てくる。
アンダーバーはシフトキーと「ー」を押す。
Kubernetes Operatorとは？？

## 概要
先日[Kubernetes Novice Tokyo #27](https://k8s-novice-jp.connpass.com/event/293144)に参加しました。
その際にKubernetes OperatorをテーマにしたLTがあり、興味がわいたため、学んだことをアウトプットしたいと思います。
※Kubernetes Operatorについてはゼロから学び初めたため、正しくないことなどあればご容赦ください。

## Kuberntes Operatorとは？？
Kubernetes Operatorは、[Kubernetes公式ドキュメント](https://kubernetes.io/ja/docs/concepts/extend-kubernetes/operator/)では「Operatorパターン」と定義されています。
Operatorパターンは、[カスタムリソース（Kubernetes APIの拡張）](https://kubernetes.io/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources/)を使用しKubernetesへのソフトウェア拡張をすることができる仕組みです。

KubernetesのOperatorパターンは、Kubernetesのソースコードを修正すること無く、クラスターの振る舞いを拡張することを可能にします。
この「Operatorパターン」を実現するために、ユーザの独自リソースを「定義」したものを「Custom Resource Definision/Custom Resource」、ユーザが定義した独自リソースを「扱う」コンポーネントを「Operator(Custom Controller)」と呼びます。

## Kubernetes Operatorがなぜ必要か？

Kubernetes Operatorは、複雑なアプリケーションの自動化と効率化を実現し、Kubernetes上でアプリケーションをスケーラブルに運用するための不可欠なツールです。アプリケーションのライフサイクル管理や運用タスクを自動化し、一貫性を確保します。これにより、運用の簡素化と人的エラーの削減が実現され、Kubernetesクラスタの運用が向上します。


## operatorの仕組み

### Custom Resource Definition (CRD)
Operatorは、アプリケーションやサービスのカスタムリソースタイプを定義するためにCRDを使用します。これにより、Kubernetes APIに新しいリソースタイプを追加し、Kubernetesが特定のアプリケーションの操作を可能にします。


### operator（Custom Controller）
Operatorは、CRDと連携して特定のカスタムリソースを監視し、状態変化やアクションのトリガーを検出します。operatorはコードで記述され、カスタムリソースの状態に従ってアプリケーションの実際の操作（デプロイ、スケーリング、バックアップなど）を実行します。

### カスタムリソース（CR）
ユーザーはOperatorに対してアプリケーションやサービスのカスタムリソースを作成します。これにより、Kubernetesオーケストレーションがカスタムアプリケーションに対応できるようになります。CRはアプリケーションの要件と構成を指定します。

### Operatorのデプロイ
Operator自体はKubernetesクラスタ内にデプロイされ、Kubernetes APIと連携します。Operatorはカスタムリソースを監視し、CRDに定義されたアプリケーション固有の操作を実行します。

Operatorはアプリケーションやサービスのオーケストレーションを自動化し、運用を簡素化するための強力なツールです。CRDとControllerの組み合わせにより、Kubernetes上で複雑なアプリケーションを効率的に管理できます。

## Kubernetes Operator の実装方法
以下のようなサードパーティ製のものを使うと、比較的簡単に実装が行えるみたいです。（下記以外の実装方法もあります）

- [Operator SDK](https://sdk.operatorframework.io/)
- [Kubebuilder](https://book.kubebuilder.io/)

Go で [kubernetes/client-go](https://github.com/kubernetes/client-go) を使って、k8s API を触りながらフルスクラッチな実装も可能なようです。

## 感想
Kubernetes Operatorについて、LT会で学んだこと＋αで調べたことを簡単にまとめてみました。
次回は実際に手元で動かしてみた内容をアウトプットできればと思います。