OmniAICreator/Qiita-1.07M huggingface dataset:
【解決方法】couldn't find file 'trix/dist/trix' with type 'text/css" とは？

Ruby on rails を学習中の方の参考にしてもらえたら嬉しいです。
今回はアプリケーションを作成している時に出てくるエラーとその解決方法について掲載します。少しでも参考にしていただけると幸いです。
まず最初に`couldn't find file 'trix/dist/trix' with type 'text/css"`というエラーの解決方法をお話しします。

## ▼エラーの紹介
今回のエラーはaction text を使ってテキスト入力をリッチにデコレーションするためのrich textを導入していく過程でCSSを読み込まなくなってしまったエラーです。
![スクリーンショット 2023-05-24 5.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/4784ad72-6428-c702-57c2-0fd59071400d.png)
上のエラー画面のように`couldn't find file 'trix/dist/trix' with type 'text/css"
Checked in these paths:`というエラーが出ていますので、これを解決していきます。


## ▼結論から
このエラーの解決策はcssファイルが入っている stylesheets の actiontext.cssの中にある`//=-require trix/dist/trix`という行を消すとcssがうまく読み込まられるようになりました。では、この消すまでの過程を見ていきます。
![スクリーンショット 2023-05-24 5.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/cdf75d17-373c-7828-9253-3015ddd74ac8.png)

## ▼エラーの原因を探ります
下の画像を見てください。エラーの原因が書いてあります。**“trix/dist/trix”という名前のCSSファイルを見つけられないときに発生します**と書いてあります。

:::note info
注意
※ここで注意したいのはChatGPTは解決方法の1つを提示してくれているだけで、この解決方法が正しくないことがあります。今回はこの解決方法で解決できましたが、開発の順序やスペックによっては、今回の方法で解決しない場合があります。
:::
![スクリーンショット 2023-05-25 5.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/45ff1171-708d-a720-be19-5a4d20c190cf.png)


## ▼まずはactiontextをインストールします
画像にある通り、Rails6にはデフォルトで入っているらしいでの、Gemfileを確認してactiontextが入っているか確認してください。無ければインストールです。
![スクリーンショット 2023-05-23 5.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/b07963da-bec2-cdc8-a94e-bbcd5f193c6e.png)


## ▼次にactiontextをインストールして、マイグレーションしていきます
画像の半分から下に書いてあるようにmodeleにhas_rich_text:contentを入れます。
![スクリーンショット 2023-05-23 5.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/e6f295fb-60af-62e8-7381-2e24f0efbde9.png)

▼modeleへの書き方はこんな感じ
![スクリーンショット 2023-05-23 5.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/b73608d2-7507-747a-c664-e1b5d89398c2.png)



## ▼インストールしてマイグレーションすると...
ターミナルではこんな作業が実行されます。
![スクリーンショット 2023-05-23 5.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/aa4aa0c9-0b1c-5826-b3b4-91c065c3009a.png)



## ▼マイグレーションが成功するとdbにフォルダが追加されます
![スクリーンショット 2023-05-23 5.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/c5837b16-69b3-bb58-8227-7ceebb52c853.png)




## ▼最後にactiontextのcssファイルを変更
![スクリーンショット 2023-05-24 5.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/8f27da9e-8e2a-f733-340c-578401409bc2.png)
画像のように`//=-require trix/dist/trix`の行を削除するとcssが読み込まれてブラウザが正しく表示されました。

![スクリーンショット 2023-05-24 6.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/5cca1ada-c114-28d8-b39c-1e75b73b271d.png)


## ▼最後に
今回のエラーはcssを読み込まなくなってしまったことを解決するための記事なので、rich_textを導入するためにはこれだけの作業では足りません。テキストの保存場所を変えたり、他の作業（コード）が必要です。
導入のための作業は別途確認してください。


いかがでしたでしょうか？
他にも記事を発信していきますので、私の QiitaやTwitterをフォローしていただけると嬉しいです。
個別の質問もぜひ歓迎します。
私自身、初学者ではありますが、1歩先を行くものとして回答できたらと思います。
それでは。
MacでLaravelの環境構築をする方法をまとめてみた　*確認問題つき

## はじめに
会社から念願のMacを支給してもらったことで、開発環境を整える喜びを感じています。この記事では、Mac上でLaravelを始めるための環境構築方法をまとめています。Laravelは素晴らしいフレームワークであり、Mac上での開発環境が整っていれば、より生産性の高い開発が可能になります。

:::note info
さいごに簡単な確認問題を用意しています。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/248/5u7fzYm1Mra7ClMu65BreuQmBpwIO9qTIq3WwUII


## 環境構築手順
#### 1. Homebrewのインストール
HomebrewはMacのパッケージマネージャーであり、簡単なコマンド一つで必要なツールやライブラリをインストールできます。

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

#### 2. PHPのインストール
Laravelの実行にはPHPが必要です。Homebrewを使用してPHPをインストールします。
```shell
brew install php
```

#### 3.Composerのインストール
ComposerはPHPのパッケージ管理ツールであり、Laravelの依存パッケージを簡単に管理できます。
```
brew install composer
```

#### 4. Laravelのインストール
Composerを使用してLaravelをインストールします。
```
composer global require laravel/installer
```

#### 5. Laravelプロジェクトの作成
任意のディレクトリでLaravelプロジェクトを作成します。
```
laravel new myproject
```

#### 6. 開発用サーバーの起動
Laravelプロジェクトのディレクトリに移動し、開発用サーバーを起動します。
```
cd myproject
php artisan serve
```

## まとめ
以上がMac上でLaravelの環境構築を行うための手順です。Homebrewを使用してPHPとComposerをインストールし、Laravelプロジェクトを作成しました。開発用サーバーを起動することで、すぐに開発を始める準備が整います。

私自身も会社から支給されたMacでLaravel開発を始めることができ、非常にやりがいを感じています。この記事がお役に立てましたら、幸いです。

### さいごに
:::note info
簡単な確認問題を用意しました。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/248/5u7fzYm1Mra7ClMu65BreuQmBpwIO9qTIq3WwUII
PWAの基本情報についてまとめてみた　*確認問題つき

## はじめに
最近、ChromeでQiitaサイトのブックマークをAndroidのホームに保存したら、モバイルアプリのように表示されることに驚きました。これはPWA（Progressive Web App）という技術によるものでした。今回は、PWAについての基本情報をまとめてみたいと思います。

:::note info
さいごに簡単な確認問題を用意しています。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/247/jKvvxxh2enVWojxUwKztFWazpq8UuWk6fgytJ3bw


# PWAとは何か
PWAは、Web技術を使用してモバイルアプリのような体験を提供するアプリケーションのことです。従来のWebサイトとは異なり、オフラインで動作したり、ホーム画面にアイコンを追加したり、プッシュ通知を送信したりすることができます。これにより、ユーザーはブラウザを開くことなく、手軽にアプリとして利用することができます。

## PWAの特徴
PWAの特徴には以下のようなものがあります。

#### レスポンシブ
異なるデバイスや画面サイズに適応するレスポンシブなデザインを採用しています。
#### オフライン対応
オフライン状態でも動作するため、ユーザーはインターネットに接続されていなくてもアプリを使用することができます。
#### プッシュ通知
アプリから重要な情報をユーザーに通知することができます。
#### ホーム画面に追加
ホーム画面にアイコンを追加することができ、ユーザーはブラウザを起動することなくアプリを起動できます。
#### デバイス機能の利用
カメラや位置情報など、デバイスの機能を利用することができます。


## PWAの開発方法
PWAの開発には、以下の技術やツールを使用します。

#### Service Worker
オフライン対応やプッシュ通知などの機能を実現するためのJavaScriptのランタイムです。

#### Web App Manifest
ホーム画面に表示されるアプリのアイコンやタイトルなどの設定を行うJSONファイルです。

#### HTTPS
PWAはセキュリティの観点から、HTTPSで提供される必要があります。


PWAの開発には、以下の手順で行います。

#### 1. レスポンシブデザインの実装
異なるデバイスや画面サイズに適応するため、CSSメディアクエリを使用してレスポンシブなデザインを実装します。

#### 2. Service Workerの登録
Service Workerを使用して、オフライン対応やプッシュ通知などの機能を実現します。Service WorkerはJavaScriptファイルであり、イベント駆動型のプログラミングモデルを提供します。

#### 3. Web App Manifestの作成
Web App ManifestはJSONファイルであり、アプリのアイコンやタイトル、テーマカラーなどの情報を定義します。これにより、ホーム画面にアイコンが表示されます。

#### 4. HTTPSの設定
PWAはセキュリティの観点からHTTPSで提供される必要があります。SSL証明書を取得し、HTTPSでアクセスできるように設定します。



## さいごに
以上が、PWAの基本的な情報です。PWAはWeb開発の未来を担う技術であり、モバイルアプリとWebの融合を可能にします。PWAの可能性に、これからも注目していきたいですね。

:::note info
簡単な確認問題を用意しました。
この記事がもしよければ、内容の確認として是非お試しください！
:::

https://mondai-diy.com/play_question/247/jKvvxxh2enVWojxUwKztFWazpq8UuWk6fgytJ3bw
Dockerの開発環境に入れておくと便利なツール

Docker で開発環境を立てる時に、入れていて便利だったツールを書いていく

開発の時は既存 CLI で確認する人もいるが自身はGUIを使いたい人なのでメモしておく

## aaronshaf/dynamodb-admin

DynamoDBで使えるGUI

[aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin) 

DockerHubは[こちら](https://hub.docker.com/r/aaronshaf/dynamodb-admin)

データを確認したり、削除したりするくらいだけであれば公式の [NoSQL Workbench](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/workbench.html) より使いやすくシンプル

## phpMyAdmin

https://www.phpmyadmin.net/

定番の MySQL の GUI、JetBrainsが出している [DataGrip](https://www.jetbrains.com/ja-jp/datagrip/) も使いやすいがプライベートの開発だと JetBrain の All Products Pack を契約していることも少ないので入れておくと使いやすい

## LocalStack

AWS のサービスへの互換があり、ローカル環境内に AWS の環境を作成できる

[LocalStack](https://localstack.cloud/)

サポートしているサービスの状況は https://docs.localstack.cloud/user-guide/aws/feature-coverage/ から確認できる

エミュレートのためか実行速度はサービスによってはおそめ、例えば SQS は [softwaremill/elasticmq](https://github.com/softwaremill/elasticmq)のようなオープンソースもあるがそれと比べると多少遅く感じる

有料プランと無料プランで使える機能が変わってくる

https://localstack.cloud/pricing/


## amir20/dozzle

アプリケーションででるログが多いと、開発中にログが見にくくなるが GUI ベースで見やすくなるツール

ブラウザのGUIでみることができるので対象の文字も検索しやすい

https://dozzle.dev/

## golang-migrate/migrate

DB のマイグレーションツール、サポートしているDBはGithubのページから確認できる

https://github.com/golang-migrate/migrate

DB のマイグレーションツールは、多くのものは特定の言語に依存しているのでランタイムを入れる必要があるが Go製 であるためランタイムに依存せず使用できる

Goを使用しない場合は、インストールしたSqlとファイルだけでマイグレーションできるが、Goでスクリプトを書くこともできる
【Python】多次元配列での昇順・降順が混ざった際のソートのやり方について

初めまして、大学院生をしているhinoと申します。

今回はAtCoderの過去問を解いていて、多次元配列の昇順と降順が混ざったソートの方法が知りたくなり、まとめました。

## 解いていた問題
https://atcoder.jp/contests/abc128/tasks/abc128_b

### 問題概要
> 市名とレストランの点数が与えられ、次のような順でレストランを紹介します。
> - 市名は辞書順で早い方から紹介
> - 同じ市に複数のレストランがある際には点数の高い方から紹介

この問題は市名を昇順ソートし、点数を降順ソートすることで目的の並び方にすることができるのですが、多次元配列の昇順と降順が混在するソートになってしまうためその実装について考えてみました。

例として問題のテストケース1を考えてみます。
~~~Python
data = [['khabarovsk', 20], ['moscow', 10], ['kazan', 50], ['kazan', 35], ['moscow', 60], ['khabarovsk', 40]]
~~~

同時に昇順・降順ソートは指定できないので、別々に行ってみます。
~~~Python
#市名について昇順ソート
data = sorted(data, key=lambda x: x[0])

#点数について降順ソート
data = sorted(data, key=lambda x: x[1], reverse=True)
print(data)

> [['moscow', 60], ['kazan', 50], ['khabarovsk', 40], ['kazan', 35], ['khabarovsk', 20], ['moscow', 10]]
~~~

このように順序が乱れるためうまくいきません。
そこで調べてみたところ、Pythonのリファレンスに次のような記述がありました。
>
> ソートの安定性と複合的なソート
> ソートは、 安定 (stable) であることが保証されています。これはレコードの中に同じキーがある場合、元々の順序が維持されるということを意味します.......
> この素晴しい性質によって複数のソートを段階的に組み合わせることができます。例えば、学生データを grade の降順にソートし、さらに age の昇順にソートしたい場合 には、まず age でソートし、次に grade でもう一度ソートします:

https://docs.python.org/ja/3/howto/sorting.html

どうも、降順を優先すると良さそうとのことですので試してみましょう。
~~~Python
data = sorted(data, key=lambda x: x[1], reverse=True)
data = sorted(data, key=lambda x: x[0])
print(data)

> [['kazan', 50], ['kazan', 35], ['khabarovsk', 40], ['khabarovsk', 20], ['moscow', 60], ['moscow', 10]]
~~~ 
目的通りのソートができました！！




...ただ、１行で書きたいなと思うんですよね...。
そこで思いついたのが **正数を降順ソートにしたいなら負数を昇順ソートすればよい**ということです。
~~~Python
data = sorted(data, key=lambda x: (x[0], -x[1]))
print(data) 

> [['kazan', 50], ['kazan', 35], ['khabarovsk', 40], ['khabarovsk', 20], ['moscow', 60], ['moscow', 10]]
~~~
この方法でも無事に目的のソートができました。多分ですが、こちらの方がマイナスを取るだけという簡単な方法かつ１行で書けるので、バグらせにくいのかなと思います。
「QWERTYキーボードで一つズレて打った単語」

たとえば`SMS`と入力するつもりで左に１キーずれてたら`ANA`になる。 
たとえば`dry`と入力するつもりで左に１キーずれてたら`set`になる。 
こんな感じの、キーのズレを再現する関数を作ってみる。 
```javascript 
////////
// wordに入力された文字列から、左に１文字ずつズレた文字列を返す関数。さしあたり小文字限定 
// wordにq,a,z,が含まれる場合は例外を投げる。
///////
function wordShift(word){
    var lineQ = "qwertyuiop";
    var lineA = "asdfghjkl";
    var lineZ = "zxcvbnm";
    var lines = [lineQ, lineA, lineZ];
    
    // 左端のキーは、これ以上左にズレる余地が無いのでエラーにする。
	if( /[qaz]/.test(word) ){
		throw "QAZ Exception";
	}
    
	var str = "";
	for( var i=0; i<word.length; i++){ //１文字ずつ。
		lines: //Q行、A行、Z行の順に処理するけど、Q行で見つかったらA,Z行は飛ばす。
		for( j in lines ){
			var re = new RegExp( word.charAt(i) );
			var position = lines[j].search(re);
			if(position > -1){ // 走査中の行に、i文字目があったら
				str = str + lines[j].charAt(position-1); //となりの文字を格納
				break lines; //ラベル付きブロックからの脱出。
			}
		}
	}
	return str;
}
```
たとえば、[MIT's 10000-word list](https://www.mit.edu/~ecprice/wordlist.10000)の中の4文字以上の単語で左にズレても単語になるものをリストアップするならこんな感じ。 
```javascript:wordShift(word)略
var WORDLIST = ["a","aa","aaa","aaron","ab","abandoned"...(中略)..."zu","zum","zus"];
for( var i in WORDLIST ){
	// 4文字以上の単語に限定
    if( WORDLIST[i].length < 4 ) continue;
    /// wordShift(word)はq,a,zを含む単語で例外を投げてくるので。
	try {
		var shifted = wordShift( WORDLIST[i] );
		if (WORDLIST.includes(shifted)){ // ズレた文字列が単語帳にあったら
			console.log( [WORDLIST[i], shifted] ); // 両単語をコンソールに出力
		}
	} catch (err) { //例外は無視して次の単語にGo!Go!
		continue;
	}
}
```
これを試すと、`["bored", "views"]`と`["ford", "dies"]`の２組が返ってくる。意外と少ないのね。 
何のためにこんなものを作ったのかというと、謎解きを作っていてですね。
暗号の、例を作るためなのです。
Plug DataでOSC受信

# Plug Data とは　
音のプログラミングができるオープンソースのビジュアルプログラミングツールとして、みんな大好きPure Data。
最近これをベースにより使いやすいインターフェースを備えたPlug DataというツールがTimothy Schoen氏の主導で開発され、公開されました！
https://plugdata.org/index.html
MaxのUIみたいにとっても視認性がよく、これは制作のモチベ爆上がりまちがいない！！ありがとうPlug Data!!

ということで、導入にあたりつまづいた箇所はちょくちょくQiitaにあげていくことにします。


# OSC receive　が動かない

TouchDesignerからOSC Out Chopを使って値をPure Dataに送信したい。
ローカルアドレス:127.0.0.1
ポート:8000

![スクリーンショット 2023-05-25 1.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709305/aca0e81d-4517-6e54-85a0-1b2a8db83007.png)

osc.receiveを使ったが、consoleに何も表示されず。受信できない。　

# 原因　
commandキーを押しながらosc.receiveをクリックすると、中身がみれる。　
![スクリーンショット 2023-05-25 1.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709305/74e96aba-1298-193c-c94b-cefe5468fbb8.png)
"Part of ELSE: ~"
とあり、どうやら中身でelseというライブラリを使う必要があることに気づく。

![スクリーンショット 2023-05-25 1.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709305/ac030bc4-402b-1bd3-2e22-3ef16e921996.png)

メニュー > Settings > Externals で拡張機能のインストール画面を開き、"else"で検索。　
![スクリーンショット 2023-05-25 1.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709305/c3d9c2c1-a050-dda2-fb68-0c5370fb967f.png)

右端のダウンロードアイコンをクリックでダウンロードがはじまる。

![スクリーンショット 2023-05-25 1.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709305/89b272e9-426b-7a70-f362-f6ec03f630b7.png)
ダウンロードが完了すると、正常に動き始めました！
自分用メモ：基本的なコマンド

## ターミナルでデータベースの中身を確認する方法
#### データベースの中身を確認したい時に、vs codeのターミナルでうつコマンド
```
rails db
```
→　これでdbの中に入れる(dbに接続できる)。ちゃんと接続出来ていると、行頭の部分が sqlite> みたいになる。<br><br>
```
.tables
```
→ テーブル一覧を取得できる。<br><br>

```
select * from posts;
```
→ Postテーブルの中身を確認したい時はこのコマンドになる。`from`の後が**小文字** かつ **複数形** なことに注意。<br><br>
```
.quite
```
→ データベースから抜けたい時にうつ。これで元のターミナルに戻る。
<br><br>

## ターミナルでデータベースを操作する方法
#### 現在のテーブルの中身を削除して、新しく作り直す時
```
rails db:migrate:reset
```


#### seeds.rbファイルで作ったseedデータをdbに流し込む時
```
rails db:seed
```

## 新しいrailsプロジェクトを作成する時の流れ
#### プロジェクトの新規作成
ターミナルでプロジェクトを作成したいディレクトリ内に移動する。
ディレクトリ内に移動できたら、`rails new 〇〇(プロジェクト名)`というコマンドうつ。
例えば、myblogというプロジェクト名にしたいなら、↓のようなコマンドになる。
```
rails new myblog
```
<br>

#### modelの作成
最初にmodelを作成する。
model作成のコマンドは、`rails g model 〇〇(model名) 〇〇(カラム名):〇〇(データ型)` となる。
例えば、`Post`というmodelを作成して、その中に
- `title`というカラム名でデータ型は`string型`
- `body`というカラム名でデータ型は`text型`

というテーブルを作りたかったとすると、コマンドは下記の通りとなる。
```
rails g model Post title:string body:text
```
<br>

#### 作成したmodelをdbに反映させる
`rails db:migrate`する。
<br>


#### dbにデータを流し込む
- railsコンソールから手動で流し込む場合

まず、コンソールに入る。
```
rails c
```
`create`する。
```
Post.create(title: 'title 1', body: 'body 1')
```
<br>

- seedファイルで初期データを流し込む場合

`db/seeds.rb`ファイルに記載する。
<br>


#### controllerの作成
```
rails g controller Posts
```
#### ルーティング
どのURLにアクセスされた時に、controllerのどのメソッドを実行するかを設定すること。
`config/routes.rb`に記載する。
一般的な処理を一気に設定したいときは、`resources :コントローラー名`とする。
```
Rails.application.routes.draw do
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"

  resources :posts  ←これ
end
```

#### 設定したルーティングを確認する方法
VSCodeのターミナルで、↓のコマンドを打つ。
```
rails routes
```
↓のような表示がでる。
![スクリーンショット 2023-05-31 0.54.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456339/50246d57-00bf-cbc2-6963-6b04eb0bb09c.png)
これの2行目を見ると、`posts`コントローラーに`index`アクションを作ると、`/posts`でアクセスできるんだ！ということがわかる。

#### contorollerに記載していく
とりあえず「全件取得して、作成順に並び替える」というコードを書いてみる。
- 記述前
```
class PostsController < ApplicationController
end
```
- 記述後
```
class PostsController < ApplicationController
  def index
    @posts = Post.all.order(created_at: 'desc')
  end
end
```

#### viewの作成
PostsControllerのindexアクションに対応するviewを作成する。
先程打った`rails g controller Posts`のコマンドにより、`app/views/posts`というディレクトリが作成されているので、その中にファイルを作成していく。
`index.html.erb`を作成する。
gitでブランチを生やす理由を料理に置き換える

## はじめに
みなさん`git`は使用してらっしゃいますでしょうか。
そうですversion管理ツール `git`です。
チーム開発の経験がある方なら一度は経験したことがあると思います。
ブランチを生やすという行為を。

ではなぜブランチを生やす必要があるのでしょうか。
今回はそれについて話していきたいと思います。


## ブランチを生やす理由
基本的にブランチを生やす理由としては
- `main` (`develoip`)ブランチを綺麗にした状態にできる。
- リリースによるバージョンを管理できる

ということが挙げられます。
とこのように端的に言われてもわかりづらいとは思うので次に例えを使った説明となります

###  1.`main` (`develoip`)ブランチを綺麗にした状態にできる。
`main`ブランチをきれいにした状態にできるとはなんなのか
料理を例に取ってみましょう
筑前煮 という料理をご存知でしょうか
そうです あの筑前煮ですね
筑前煮という料理はそれぞれの具材をそれぞれ調理して最後に一つに合わせることで完成します。
ではその中でにんじんだけ丸焦げにしてしまった場合これを最後合わせるでしょうか。
合わせませんね。だって筑前煮が美味しく出来上がりませんから。
面倒ですがもう一度にんじんだけ調理しなおしますよね。
そして人参がちゃんと美味しく調理できたら筑前煮に合わせます。

この`筑前煮`がgitにおける`main`(`develop`)ブランチであり、`人参`が`branch`であるわけです。
`branch`において、綺麗なコードができるまでは`main`ブランチにマージできません。
だって`main`ブランチが汚くなってしまいますから。
チーム開発においては`人参を調理する人`、`椎茸を調理する人`、`蓮根を調理する人`、と分かれるかもしれませんが、最後には`美味しい筑前煮(コード)`が出来上がることが目標となっています。
チームメンバーの中に一人でも`main`ブランチで作業をする人がいたらどうなるでしょうか。
その人がもし調理法を間違えると最終的に出来上がる筑前煮が美味しくなくなってしまうのです。

このようにブランチを生やすという行為は`main`ブランチが綺麗に出来上がるための礎となっているのです。


###  2.リリースによるバージョンを管理できる
では次に`リリースによるバージョンを管理できる`について

ここでも料理を例に取ってみましょう。
みなさん`カレー`はご存知ですね。
そうです あのカレーですね。
皆様の中には`辛いカレー`が好きな方や`辛さ控えめのカレー`が好きな方もいらっしゃるでしょう。
ではみんなでカレーを作るときに`辛いカレーが好きな方`と`辛さ控えめのカレーが好きな方`の両方の要望を叶えるにはどうすればいいでしょうか。
別々に調理する？
できないこともないですが効率はよろしくないですね。
ここで取れる手段が具材を煮込むとこまではどっちも一緒にやってしまうことです。
煮込み終わったら鍋を分けてそれぞれの辛さに合うようなルーを入れればいいですね。
ここで`鍋を分ける`という行為が`リリースによるバージョンを管理できる`ということになります。
煮込み終わった時点のカレーが`バージョン0.5`
辛さ控えめなカレーが`バージョン１`、
さらに辛くなったのが`バージョン２`となります。

これを`git`に置き換えると、
`コードのベースが出来上がった`時点で`バージョン0.5`
そこからさらに`機能を追加したもの`が`バージョン1`,
さらに`機能向上などを行なったもの`が`バージョン2`

このように過去の状態(からくない状態)として切り離すことで、さまざまな味を楽しむことができます。
これが`リリースによるバージョンを管理できる`ということになります。


## 結論
ブランチはきろう

著者はプログラミングを始めてまだ日が浅いため、厳密には違うことを言っているかもしれません。
もし間違っていることや、他にもっと重要な機能があるということがございましたら、後学のためにも教えていただけましたら幸いです。
Web開発におけるetc/hostsファイルの理解


# Web開発におけるetc/hostsファイルの理解

ウェブ開発者として、あなたは `etc/host` ファイルについて聞いたことがあるかもしれませんが、それが何であるか、どのように機能するかはまだ知らないでしょう。 このファイルは、コンピュータがドメイン名やIPアドレスとどのようにやり取りするかに重要な役割を果たしており、ウェブ開発プロセスを最適化するためには、このファイルを理解することが不可欠です。 この記事では、`etc/host`ファイルの概念、動作方法、使用シナリオ、誤解、FAQなど、`etc/host`ファイルについて知る必要があるすべてのことを説明します。

## etc/hosts って何？

etc/hosts`ファイルはドメイン名とそれに対応するIPアドレスをマッピングするプレーンテキストファイルです。要するに、ホスト名とIPアドレスのディレクトリで、WebブラウザにURLを入力するときに、コンピュータがドメイン名をローカルに解決するために使用します。 をクリックして、ドメイン名と一致するかどうかを確認します。

## etc/hosts の動作について

etc/hosts`ファイルを開くと、ドメイン名とIPアドレスがスペースで区切られたリストがあり、それぞれの行は次のような形式になっています。

```
IPアドレス ホスト名
```

例えば、ドメイン名 `www.example.com` を IP アドレス `192.168.0.1` にマッピングしたい場合、`etc/host` ファイルに以下の行を追加することができます。

```
192.168.0.1 www.example.com
```

この行を追加することで、あなたのコンピュータは、あなたがアクセスしようとしたときに ``www.example.com`` を ``192.168.0.1`` に解決するようになります。

また、He3ツールボックス(https://he3.app)のedit host file [https://he3.app]を使用することもできます。

![traceroute](https://he3.app/blogs/hosts/hosts.png)

## 利用シーン

etc/hosts`ファイルは、ウェブ開発におけるさまざまなシナリオで使用されます。 ここでは3つの例を紹介します。

- ローカルでデバッグするウェブ開発者は、`etc/hosts`ファイルを使用してドメインをローカルのIPアドレスにリダイレクトすることで、サーバーにデプロイする必要のないサイトの機能をテストすることができます。
- 広告配信ドメインを `127.0.0.1` にリダイレクトすることで、広告をブロックすることができます。
- ウェブプロジェクトに取り組むための開発環境を設定する場合、etcホストファイルを使用して複数のステージング環境を設定することが多く、それぞれの環境には開発者が固有のドメイン名を使用してアクセスすることができる

## etc/hosts の主な機能

ここでは、`etc/hosts`ファイルについて知っておくべき主な特徴をいくつか紹介します。
以下に、知っておくべき `etc/hosts` ファイルの主要な機能をいくつか示します。

| 特徴｜説明｜ --------------------------------------------------------------------------------
| -------- | --------------------------------------------------------------------------------- |
| ローカルマッピング｜etc/hostsファイルは、DNSルックアップをバイパスしてローカルで使用するためにドメイン名とIPアドレスをマッピングします。
| 優先順位｜etc/hosts`ファイルはDNSリゾルバよりも優先されるため、DNSクエリを上書きしたりリダイレクトするのに便利です。
| セキュリティ｜etc/hostsファイルは管理者権限で誰でも編集できるため、悪意のあるエンドポイントにトラフィックをリダイレクトするために使われる可能性がある。

## 誤解とよくある質問

### 誤解1：etc/hostsファイルはウェブ開発にしか使われない

etc/hosts`ファイルはウェブ開発者によく使われますが、これは多くのオペレーティングシステムでホスト名をIPアドレスにマッピングするために使われる汎用システムファイルであり、ウェブ開発に特化したものではありません。

### 誤解2：etc/hostsファイルに加えられた変更は、すぐに反映される。

ほとんどのオペレーティングシステムは、`etc/hosts`ファイルへの変更を即座に読み込みますが、一部のオペレーティングシステムはこの情報をキャッシュし、キャッシュをクリアするかコンピュータを再起動することで変更がすぐに反映されるようにします。

### FAQ 1: etc/hostsファイルを使ってウェブサイトをブロックできますか？

もちろん、etc/hostsファイルを使用して、不要なドメインを`127.0.0.1`やその他のIPアドレスにマッピングしてドメインをブロックし、そのドメインに到達するトラフィックをブロックすることができます！

### FAQ 2: etc/hosts ファイルにコメントを追加することはできますか？

はい、`etc/hosts`ホストファイルにコメントを追加することができます。行頭にコメントを追加すると、`#`で始まる行は、システムによって無視されます

## まとめ

まとめると、`etc/hosts`ファイルはウェブ開発者にとって、ドメイン名とローカル用のIPアドレスを対応させるための便利なツールであり、その概念、動作原理、誤解、FAQシナリオを理解することで、このファイルを使用してウェブ開発プロセスを最適化できる。
etc/hosts`ファイルの詳細については、 [Wikipedia page](<https://en.wikipedia.org/wiki/Hosts_(file)>)や[Linux man page](https://linux.die.net/man/ 5/hosts)を参照してください。
【VMC】VTGWを経由したESXiへの通信が制御できない

## 構成
オンプレミスとVMware Cloud on AWS(VMC)間をVMware Transit Connect(VTGW)経由で接続している環境。

## 起こったこと
Management Gateway(MGW)で、オンプレミスからVMC上のESXiを宛先とした通信をドロップさせる設定をいれたが、
オンプレミスのリソースからESXiへpingを打つと応答がある。
## 原因
VTGWを経由したVMC上のESXiに対する通信は、MGWを経由せず、直接ルーティングされる。
そのため、MGWで拒否のルールを設定しても通信が拒否されない。
## 対応
オンプレミス側のファイアウォール等で通信を制御する必要があります。

### -補足
この件は、サポートで問い合わせて知ったのですが、公式ドキュメントではこの内容を見つけられませんでした。。
ちなみに、vCenter等のESXi以外の管理系リソースを宛先とした通信については、
MGWで拒否の設定を可能です。
個人的にPythonについて思うこと。主にコレクション処理の観点から

https://blog.miz-ar.info/2023/05/thoughts-on-python/

こちらの記事を読みまして、記事で言及されていなくて個人的に私が思っているPythonに足りていないなと思う機能を書きなぐってみました。
Pythonのスペシャリストではないので「これできるよ」ということがあったら是非コメントなどで教えていただきたいです。
なお筆者はKotlin信者ですのでだいぶ思想が偏っているのであしからず

## コレクション系の型のメソッドが貧弱
近年の言語はList, Set, dict等のコレクション用の型のメソッドは非常にリッチになってきています。高階関数を使用したコレクション操作というのは必ずと言っていいほど実装されています。
しかし、Pythonでは高階関数系メソッドは実装されておらずリストの挿入や削除など必要最低限のメソッドしか実装されていません。
その代わりにPythonでは組み込み関数として高階関数を使用するメソッド(mapやfilter)などが用意されています。しかし後ほど説明しますがメソッドチェーンができずに可読性が失われたものとなっています。

以下のページを参照すると`Python`の`list` には11個のメソッドしかなさそうです。
https://docs.python.org/ja/3/tutorial/datastructures.html
ちなみに、`Kotlin` の `MutableList` には190個以上の関数が実装されていました
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-list/

## メソッドチェーンができない
map()関数などは存在すると説明しましたが、他の言語と異なるのは引数の中に元のリストを入れる必要があることです。
例えば `the_list = [1,2,3,4]` というlistのそれぞれの値を `+2` したい場合、
```
map(lambda x: x + 2, the_list)
```
このようになります。この何が問題かというと、多段のリスト処理を行うときに可読性が崩壊してしまうことです。
例えば、`Kotlin`で `map()` の結果を `filter()` しようとした場合
```
theList.map(x -> x + 2).filter(x -> x % 2 == 0)
```
のように書けます。Kotlinを知らない人でも読めそうですね。 `.xxxx().yyyy()` のように処理を渡していくことをメソッドチェーンと呼びます。
しかしPythonではメソッドチェーンはできずに以下のように書く必要があります。
```
filter(lambda x: x % 2 == 0, map(lambda x: x + 2, the_list)))
```
このように可読性が崩壊してしまいます。処理を理解するためには右から左にコードを読む必要があるため、私はPythonはアラビア語に近い言語だと日々唱えています。
`map()`と`filter()`だけで済むのであれば内包表記で一応どうにかなりますが、それ以外の処理をしようとなると結局この問題にぶち当たってしまいます。

## 無名関数(lambda)が複数行にできない
`map()` `filter()` `sorted()` など高階関数を使用する際によく使われる無名関数(lambda)ですが、Pythonの無名関数は複数行にできません。
for文を撤廃して`map()`関数等で処理を書くことは一般的になってきていますが、そうなるとやはり複数行の処理を書く必要が出てくることが多いです。
Pythonではやむを得ず別途関数を定義して高階関数で複数行の処理を実現せざるを得なくなっています。
```
def multiple_lines_function(x):
    xxxxxxxx
    yyyyyyyy
    return zzzzzz

map(multiple_lines_function, the_list)
# map(本来はここに複数行の処理を書きたい, the_list)
```
↑に理想形を書いてみましたがこれだと可読性が崩壊しそうですね。複数行の無名関数はメソッドチェーンあって初めて恩恵があるのかもしれませんね。

## Null Safety
Pythonは動的型付き言語ですのでNull Safetyとは切り離して考えるべきですが、Null Safetyな言語が備えているハンドリングの仕組みはあってほしいところです。
Pythonでは `None` が `null` 相当ですが、この `None` をうまく処理する仕組みがいまいちです。
`Optional` や `Union` が登場し `None` を扱いやすくなってはいますが、他の言語に比べると Wrapping 方法が仰々しかったりします。

## おわり
以上、パッと思いつくものを書きなぐってみました。
ただ、これらは近年の言語と比較したときの問題であってPythonらしい書き方をすればさほど気にならない問題でもあります。
Pythonは機械学習系ではまだまだ使われ続けると思いますので知っていて損はない言語です。ただ、Pythonしか使えない方はそれ以外の言語もぜひ学習してみると世界が広がるかもしれません。ぜひ **Kotlin** をよろしくお願いいたします。
docker-composeでKeycloakを立ててみた

# はじめに
とりあえず勉強用に立てるところだけまとめました。
あとは参考書やYoutube、ネット記事を参考に理解を深めます。

# 構築環境
以下のスペックでVMを構築
| 設定項目 | 設定 |
|:-:|:-:|
| CPU | 1Core |
| MEM | 2GB |
| DISK | 50GB |
| OS | AlmaLinux8.7 |

# Docker導入
こちらの記事のとおり導入

https://qiita.com/Nats72/items/660798a9146baf68e376


# 構築する

公式ドキュメントを見ると、Dockerでの構築方法が書いてあった。

https://www.keycloak.org/getting-started/getting-started-docker

公式ページに記載されているコマンドは以下。
こちらをベースに、docker-compose.ymlを検討する。
```
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:21.1.1 start-dev
```

## 設定ファイルを作成
```console
# mkdir /usr/local/src/keycloak
# touch /usr/local/src/keycloak/docker-compose.yml
# touch /usr/local/src/keycloak/dockerfile
# cd /usr/local/src/keycloak/
```
```console
# vi docker-compose.yml
```
```yml:docker-compose.yml
version: "3"

services:
  keycloak:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: keycloak
    tty: true
    stdin_open: true
    restart: always
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
    ports:
      - 8080:8080
    command:
      - "start-dev"
    networks:
      - keycloak
    networks:
      keycloak_network:
        ipv4_address: 172.16.0.2

networks:
  default:
    name: bridge
  keycloak_network:
    name: keycloak_network
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.0.0/24

```

```console
# vi dockerfile
```
```dockerfile:dockerfile
FROM quay.io/keycloak/keycloak:21.1.1
USER root
```

## コンテナビルド
```console
# docker-compose up -d
```

# keycloakにアクセス
`http://{IPアドレス}:8080/`にアクセスすると管理ページが表示される。
`Administration Console`クリックでログインページに飛ぶ。
docker-compose.ymlに記載したユーザ名とパスワードでログインできる。

# 参考書はこちら
認証って何？認可って何？ってレベルの人でも分かりやすいとのこと

https://www.ric.co.jp/book/new-publication/detail/2081
【Pandas基礎】mapメソッドを使ってdataframe内の値を置換する

## はじめに

#### 自己紹介
Python勉強中の大学院生です。自分が詰まったところを記録していきます。
#### 記事を書くに至った経緯
pandasのデータフレーム内の値をmapメソッドを使って置換するやり方を整理できていなかったので、メモとしてここに残します。

## 本記事の概要
#### どんな人に読んでほしいか
- Pythonのpandasを学び始めた人
- pandasのmap関数について知りたい人
- dataframe内の値を置換する方法がわからない人

#### この記事に書くこと、わかること
map関数を使ったdataframe内の値の置換方法がわかります。今回整理する具体的なメソッドは以下です。

- `.map()`

## 具体的な方法
例として以下のデータを使用します。（データサイエンス100本ノックの問題を参考にしています）

```py:dataframeの作成
import pandas as pd

data = [['S12014', '千草台店', '千葉県', '千葉県千葉市稲毛区千草台一丁目'],
        ['C13002', '国分寺店', '東京都', '東京都国分寺市本多二丁目'],
        ['C14010', '菊名店', '神奈川県', '神奈川県横浜市港北区菊名一丁目'],
        ['S14033', '阿久和店', '神奈川県', '神奈川県横浜市瀬谷区阿久和西一丁目'],
        ['S13051', '板橋大原店', '東京都', '東京都板橋区大原町'],
        ['S14036', '相模原中央店', '神奈川県', '神奈川県相模原市中央二丁目'],
        ['H13015', '南砂店', '東京都', '東京都江東区南砂二丁目']]

columns = ['store_cd', 'store_name', 'prefecture', 'address']

df = pd.DataFrame(data=data, columns=columns)
df
```
実行結果
|   | store_cd|  store_name|  prefecture|  address|
|---|:---:|:---:|:---:|---:|
|0  |   S12014|   千草台店|  千葉県|  千葉県千葉市稲毛区千草台一丁目|
|1  |   C13002|   国分寺店|  東京都|  東京都国分寺市本多二丁目|
|2  |   C14010|   菊名店|  神奈川県|  神奈川県横浜市港北区菊名一丁目|
|3  |   S14033|   阿久和店|  神奈川県|  神奈川県横浜市瀬谷区阿久和西一丁目|
|4  |   S13051|   板橋大原店|  東京都|  東京都板橋区大原町|
|5  |   S14036|   相模原中央店|  神奈川県|  神奈川県相模原市中央二丁目|
|6  |   H13015|   南砂店|  東京都|  東京都江東区南砂二丁目|

ある飲食店の店舗データということにします。

例として、prefectureの値をコード値に変換するという課題があったとします。値は千葉県を12、東京都を13、神奈川県を14と設定します。

方法としては以下のフローになります。

1. 置換する文字列を指定　→ `.str[0:3]`
2. 辞書形式で対応するコード値を設定する　→ `map()`


### 1. 置換する文字列を指定
県名に対応させてコード値を置換するために文字列を指定して県名を抽出する必要があります。文字列を指定して抽出する際には`.str`を用います。そして、千葉県、東京都、神奈川県は全て最初の3文字を指定すれば県名の判別ができることがわかります。

指定のやり方として、`.str[0:3]`とすればOK。

### 2. 辞書形式で対応するコード値を設定する
どれをどれに置換するのかはmapメソッド内に辞書形式で指定することで簡単に置換できます。

`.map({'.strで抽出した文字列': '置換したい文字列'})`

### 実行例

```py
df['prefecture'] = df['prefecture'].str[0:3].map({'千葉県': '12', '東京都': '13', '神奈川': '14'})
df
```
実行結果

|   | store_cd|  store_name|  prefecture|  address|
|---|:---:|:---:|:---:|---:|
|0  |   S12014|   千草台店|  12|  千葉県千葉市稲毛区千草台一丁目|
|1  |   C13002|   国分寺店|  13|  東京都国分寺市本多二丁目|
|2  |   C14010|   菊名店|  14|  神奈川県横浜市港北区菊名一丁目|
|3  |   S14033|   阿久和店|  14|  神奈川県横浜市瀬谷区阿久和西一丁目|
|4  |   S13051|   板橋大原店|  13|  東京都板橋区大原町|
|5  |   S14036|   相模原中央店|  14|  神奈川県相模原市中央二丁目|
|6  |   H13015|   南砂店|  13|  東京都江東区南砂二丁目|

このように県名を置換することができました。（ここの数字は数値ではなく文字列であることに注意）

## まとめ

今回は、Pandasのdataframe内の値を置換する方法をmapメソッドを用いて整理しました。再度まとめます。

- `df['指定した列名'].map({'.strで抽出した文字列': '置換したい文字列'})`

dataframe内の置換には`map`メソッドの他に`replace`メソッドが使用できます。

`map`メソッドは特定の列に対して要素ごとの変換を行うのに対し、`replace`メソッドはdataframe全体または特定の列に対して特定の値を別の値で置換するために使用されます。

それぞれ少し違いがあるので、ここはまた別の記事で整理しようと思います。とりあえず今回はmapメソッドについて整理しました。

## 参考サイト
- [データサイエンス100本ノック](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)
jacksonのjson以外のmapperを使用しようとしたらNoSuchMethodErrorが発生した

該当エラー
```
java.lang.NoSuchMethodError: 'com.fasterxml.jackson.core.StreamReadConstraints com.fasterxml.jackson.core.io.IOContext.streamReadConstraints()'
```

原因： 使用しているjacksonのバージョンが統一されていなかった！

以下のように、異なるdataformatも使用する場合はもともとのjacksonのバージョンと同じにしないと動かないみたいです。(以下の例だと`2.15.1`が揃っていないとうまく動かない)

```build.gradle
dependenies{
  implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.15.1"
  
  implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.1')
  implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.15.1')
}
```
【Flutter学習 #5】GitHub ActionsでCIを作成してみた

# はじめに
この記事はFlutter初心者の筆者が学習のために書いている記事です。
間違っていたら温かくご指摘いただけるとありがたいです。

# やりたいこと
今回はGitHub Actionsを使って、FlutterのCIを作成していたいと思っています。
とりあえずテストコードの実行と静的解析ができれば良いかなと思っています。

# workflowsを作る
GitHub ActionsでCIを作るにはworkflowsを作る必要があります。（というかworkflowsを作るだけで良いです。）

Flutterプロジェクト直下に以下のディレクトリ構成でyamlファイルを作成します。

```
# yamlファイルの名前は好きな名前にしてください。
.github/workflows/flutter-ci.yaml
```

GitHub Actionsは、この「.github/workflows/」の下にあるyamlファイルを実行してくれます。

<br/>
<br/>

次に、yamlファイルの中身を書いていくのですが、設定するのは大きく分けて以下の3つです。
* ワークフローの名前
* トリガー（どのタイミングで実行されるのか）
* 実際に実行されるジョブ

<br/>
<br/>

実際に作成してみたyamlファイルは以下になります。

``` .github/workflows/flutter-ci.yaml
# ワークフロー名を定義
name: flutter-ci

# トリガーを定義
on:
  # プルリクエスト作成がトリガーとなる（GitHib Actionsが実行される）
  pull_request:
    # プルリクエスト作成時とプルリクエストを対象にコミットが行われた時
    types: [opened, synchronize]
    # 対象ブランチを指定（masterブランチに対するプルリクエストが対象）
    branches:
      - master
  
  # GitHubページ上から手動で実行できる
  workflow_dispatch:

#実行するジョブを定義
jobs:
  # ジョブ名を設定
  flutter-ci:

    # ジョブを実行する仮想ホストマシンタイプ
    runs-on: ubuntu-latest

    # タイムアウト時間を設定
    timeout-minutes: 5

    # steps配下に実行したいアクションを定義する。
    steps:
      # 当該リポジトリをチェックアウト
      - name: checkout
        uses: actions/checkout@v2

      # Flutterをインストール（キャッシュする）
      - name: flutter cache
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.10.0"
          channel: "stable"
          cache: true
          cache-key: flutter
          cache-path: ${{ runner.tool_cache }}/flutter

      - name: install Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.10.0"
          channel: "stable"

      # Flutter pub get 実行
      - name: flutter pub get
        run: flutter pub get
      
      # 性的解析実行
      - name: flutter analyze
        run: flutter analyze

      # テスト実行
      - name: flutter test
        run: flutter test
```

ざっくりと説明すると、以下のような感じです。

[CIが動くタイミング]
・ masterブランチに対するプルリクエストが作成されたタイミング
・ masterブランチに対するプルリクエストにコミットが行われたタイミング
・ 手動実行もできるようにしておいた

[実際に行われること]
・ コードの静的解析
・ テストコードの実行

このyamlファイルをmasterブランチにpushしたら準備は完了です。

# 実際に動かしてみる
適当なブランチを作成して、masterブランチに対してのプルリクエストを作成します。
すると、こんな感じにCIが実行されます！（このプルリクエストにコミットしても同じようにCIが動きます。）
![スクリーンショット 2023-05-24 23.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344066/edcbd377-aec0-5c8a-745b-74567db71d0f.png)

# 注意事項
GitHub Actionsは料金が発生してしまうケースがあるようです。
Privateリポジトリの場合に発生する可能性があるようなので、試すときはPublicリポジトリで試すのが良さそうですね。

# 最後に
初めてGitHub Actionsを触ってみたのですが（というか初めてCI/CDを触った）、思っていたよりも簡単でしたね。
とりあえず初歩的なCIの実装であれば、初心者でも小一時間あればできてしまう印象でした。
JenkinsとかCircleCIとかはとっつきにくくてCI/CDを少し嫌厭してたのですが、GitHub Actionsはそんな事なくてとても良かったです。
【Zsh】【Bash】実行したコマンドを履歴に残さない方法

## はじめに

BashやZshにおいて実行したコマンドを履歴に残さない方法について記載します。  

## Bash

Bashの場合には`~/.bashrc`に以下を追記します。  

```:~/.bashrc
export HISTCONTROL=ignorespace
```

すると先頭にスペースを入力して実行したコマンドの履歴は`.bash_history`に保存されなくなります。  

## Zsh

Zshの場合には以下を`~/.zshrc`に追記します。  

```:~/.zshrc
setopt HIST_IGNORE_SPACE
```

すると先頭にスペースを入力して実行したコマンドの履歴は`.zsh_history`に保存されなくなります。
【初心者向け】CMakeLists.txtを使ってビルドする。

# はじめに
仕事でCMakeLists.txtと出会い、画期的で驚きました。
ということで、共有です。

Linux, WSLで簡単にビルドできます。

ただ、CMakeLists.txtの内容を書くのも難しいと思います。
まずはCMakeLists.txtとは・・・、なんてのも面倒臭い。


CMakeLists.txtを理解するには、簡潔に2言で
　・CMakeLists.txtは、CMakeの設定ファイル
　・CMakeはコンパイラに依存せずビルドを自動化するためのツール
ぐらいでいいです。

気になる方は私が学習に使った参考サイトへ飛んでください。

# 参考サイト
[かみのメモ](https://kamino.hatenablog.com/entry/cmake_tutorial1)
　※このサイトを一番読みました。
[CMakeの使い方](https://qiita.com/shohirose/items/45fb49c6b429e8b204ac)
[実践C++ 応用講座CMake編](https://theolizer.com/cpp-school3/cpp-school3-1/)

# 目次
使いこなすために簡単な流れを目次として書き出します。

* [まずはビルド](まずはビルド)
* [記述内容について説明](記述内容について説明)
* [ConfigureとGenerate](ConfigureとGenerate)

## まずはビルド
### ファイルの準備
まずは以下のファイルを作ります。
```
.
├── CMakeLists.txt
└── sampleApp.cpp
```
sampleApp.cppには以下の内容を書きます。
```C++:sampleApp.cpp
#include <iostream>

int main(void)
{
    std::cout << "Hello,World" << std::endl;
}
```
いよいよ、CMakeLists.txtの内容を書きます。
```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(sampleApp CXX)
add_executable(sampleApp sampleApp.cpp)
```
これで準備完了です。

### ビルド
実際にビルドしてみます。
```shell-session
mkdir build
cd build
cmake ..
cmake --build .
```
これにて、buildフォルダに実行ファイル(sampleApp)が作られます。

### ファイル実行
```shell-session
$ ./sampleApp 
Hello,World
```
coutで記載したメッセージがコンソールに出力されます。

## 記述内容について説明
CMakeLists.txtに記述した内容について説明していきます。
```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(sampleApp CXX)
add_executable(sampleApp sampleApp.cpp)
```
1. cmake_minimum_required
    * CMakeのバージョンを指定。
    * 今回は`VERSION 3.1`を指定しています。
1. project
    * プロジェクト名とプロジェクトで使用するプログラム言語を指定。
    * プロジェクト名`sampleApp`とし、C++を指定しています。
1. add_executable
    * ビルドする実行ファイル名とそれを構成するソースファイルを指定。
    * 実行ファイル名`sampleApp`としてます。
    * 構成するソースファイルは`sampleApp.cpp`一つになります。
    * 複数のソースファイルからビルドする場合は、`add_executable`の内容を以下にします。
        ```cmake:CMakeLists.txt
        add_executable(sampleApp sampleApp1.cpp sampleApp2.cpp)
        ```

## ConfigureとGenerate
この項目ではビルドする際に打ったコマンドについて説明したいと思います。
```shell-session
mkdir build
cd build
cmake ..
cmake --build .
```

CMakeのビルドでは、**Configure**と**Generate**という2つの作業をします。
コマンドで説明すると3行目の`cmake ..`になります。

**Configure**は、CMakeLists.txtをCMakeに実行させて**ビルドに必要な情報を収集する作業**をします。
**Generate**は、Configureで集めた情報を基に**自分の開発環境に合わせたプロジェクトファイルの生成**をします。

3行目の`cmake ..`では、CMakeLists.txtを置いたディレクトリを`..`で指定し、**Configure**を実施します。
CMakeLists.txtの記載に問題があれば、ここでエラーが出ます。
Configure実施後、収集した情報から**Generate**し、プロジェクトファイルを生成します。

このConfigureとGenerateで、いくつかの中間ファイルとプロジェクトファイルが生成されるので、ディレクトリ内が汚れてしまいます。
そのために1, 2行目で作業ディレクトリを作っています。

4行目の`cmake --build .`について、`.`は作業ディレクトリを指定します。
作業ディレクトリは、ConfigureとGenerateで生成した中間ファイルとプロジェクトファイルのあるディレクトリになります。
ここでは`build`ディレクトリになります。

また、裏で`make`コマンドを起動しているので、`make`でもビルドできます。

# 最後に
以上で終了です。
ご参考になれば幸いです。

# 関連記事
* 【初心者向け】CMakeLists.txtを使ってビルドする。
* [【初心者向け】CMakeLists.txtを使ってincludeのpathを省略する。](https://qiita.com/hi_to_san/items/00a5e9a75a8876b39492)
* [【初心者向け】CMakeLists.txtを使ってlibraryをリンクする。](https://qiita.com/hi_to_san/items/2b44dd44d3e152594c53)
見積もりは多く見積もってた方がいい

## 自分の経験から...

色んな仕事をしてきましたが、必ず見積もりというのはどの仕事でも使います。
また最近Webエンジニアとして転職して更に見積もりの重要性を感じさせられているので、丁度アウトプットの練習もしてみたいと思っていた所でそれも踏まえて発信してみます。
今回対象となる方は新人エンジニアです。
~~ちなみにまだ自分もちゃんとできていない~~

## 見積もりについて
「これどれくらいで出来そう？」「○○までにやっといて」等、現場に出たら上司等から仕事が振られると思います。

**これに対して、「すぐ出来ます！」とか二つ返事をしないこと。**


自分もそうなのですが、どこかで仕事が出来るやつだと思われたい気持ちや、やる気の勢いが凄くて、出来ないことも出来るって言いがちになります。
自分の見通しは甘すぎる、くらいに思ってた方がいいです。

## 実践方法
じゃあどうすればいいのか？ってことで、タイトル通り
**見積もりは多く見積もる**
これだけです。
開発においてトラブルが無く進むことなんて皆無です、必ず例外が発生します。
その例外に対応するためや、またはスキル不足による作業の遅延等...
様々なことが考えられるために **見積もりを多く見積もろう**　ということです。


**会社内のタスク等だと見積もり通りに行かなくても問題になることは少ないかもしれませんが、これがお客様相手だと信頼関係に繋がるので多く見積もるのはとても大事です。**


## 早く終わって悪いことはない、むしろ得？
早く終わらせて悪いことはありません。
別の作業に取り掛かることができる、見積もり時間通りならセーフ。
見積もりより早く終わらせられると信頼を得やすいですし、見積もり通りならそれでいいことです。
ですが徐々に精度を上げていって見積もり力を上げて行きたい所...

## 見積もり力は経験　
見積もりの精度は過去の経験の量による予測です。
例えば自宅から最寄りの駅まで歩いて何分で行けるか等、精度が高く見積もり取れると思います、経験値があるからですよね。
開発でも同じで、経験値を高めることで精度は高くなります。


## 練習方法
そんな見積もりの精度を高める練習方法です。
何に書いてもいいのですが、タスクとそのタスクにおける自分の見積もり時間、
タスク完了時間、自分の見積もり時間と作業完了時間の差、何故差が生まれたのかの原因をメモしていく。
これにより過去に経験したことを記録できますし、再度同じようなタスクをこなした場合の見積もりの精度が上がっているのか確認もできます。
ひたすら繰り返して見積もり力を養って行きましょう。


## まとめ
最初の方にも記載した通り、新人エンジニア向けとなります。
仕事の始めたての頃は、先走りがちで見積もりの罠に陥ります、そこを我慢して多く見積もってみたら仕事がしやすくなるかもしれません。
EC2のインスタンスをデフォルトのOSイメージで立ち上げたらAmazon Linux2023になった

PHPをインストールしようと思い下記コマンドでエラーが出て、

```
sudo amazon-linux-extras install php7.4
```

あれ、と思いamazon-linux-extrasが入ってなかったことに気づいて
インストールしようと思ったら、またエラーが、、、

```
$ which amazon-linux-extras
↓
/usr/bin/which: no amazon-linux-extras (入ってない)

$ sudo yum install -y amazon-linux-extras
↓
No match for argument: amazon-linux-extras (入らない)

```

amazon-linux-extrasがインストールできないなんてあるのかなと思って
OSイメージを調べたらAmazonLinux2ではなく、AmazonLinux2０23が入っていた

```
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2023"
・
・
・
省略
```

AL2023 には extras は、ないようです。
インスタンス立ち上げる時は気をつけます。
EKS on Fargateでサービスアカウントにロールをアタッチする

# 経緯
fargateノードで動作するPodでロールが紐づけられたサービスアカウントを実行したいが、「これ！」という解決策の記事が見つかりにくかったのでメモ程度に書いています。

#### 補足
eksctlは使用しません。
各用語・単語の説明はしません。

# 必要なリソース・手順
- OIDCが利用可能なeks on fargate(構築済みという前提)
- ロールの作成
- サービスアカウントの作成
- 環境変数の設定
- deployment等へのマウント追記(optional)

# 設定例
最小限の設定項目を記載しています。詳細は[こちら](https://github.com/aws/amazon-eks-pod-identity-webhook/).
## ロールの作成
- k8s上のnamespaceは`my-ns`
- サービスアカウント名は`my-sa`
- ロール名は`my-role`

`aud, sub`についてはこちらを! 
[IAM および AWS STS の条件コンテキストキー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html).
```json
{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Effect": "Allow",
   "Principal": {
    "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.REGION.eks.amazonaws.com/CLUSTER_ID"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.REGION.eks.amazonaws.com/CLUSTER_ID:sub": 
"system:serviceaccount:my-ns:my-sa",
     "oidc.REGION.eks.amazonaws.com/CLUSTER_ID:aud": "sts.amazonaws.com"
    }
   }
  }
 ]
}
```

## サービスアカウントの作成
ここまででサービスアカウントとIAMロールの関係が認識されますが、このままではPodがロールを引き受けられません。
```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-sa
  namespace: my-ns
  annotations:
    eks.amazonaws.com/role-arn: "arn:aws:iam::111122223333:role/my-role"
```

## 環境変数の設定
configMapなどで環境変数を用意します。
- 名前は`my-cm`
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-cm
data:
  AWS_REGION: ap-northeast-1
  AWS_ROLE_ARN: "arn:aws:iam::111122223333:role/my-role"
```

## deployment等へのマウント追記 (optinal)
deploymentを前提に書いています。
マウントポイントに注意してください。
```yaml
# spec.template.spec.containers
volumeMounts:
  - mountPath: "/var/run/secrets/eks.amazonaws.com/serviceaccount/"
    name: aws-token
# spec.template.spec
volumes:
- name: aws-token
  projected:
    sources:
    - serviceAccountToken:
        audience: "sts.amazonaws.com"
        expirationSeconds: 86400
        path: token
```

# 確認方法
CloudTrailのログで`AssumeRoleWithWebIdentity`のアクションの結果が成功になっていたら適切にサービスアカウントがロールを引き受けていることがわかります。

# 参考
こちらは図があってわかりやすいです。
[AWS EKSのIAM Roles for Service Accountsの仕組みを完全に理解する記事。](https://www.kaitoy.xyz/2022/09/17/aws-irsa/)
[Amazon EKS Pod Identity Webhook
](https://github.com/aws/amazon-eks-pod-identity-webhook/)
[IAM ロールを引き受けるための Kubernetes サービスアカウントの設定](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/associate-service-account-role.html)
[IAM および AWS STS の条件コンテキストキー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html)
MailHogのDockerコンテナを立ち上げる

# 概要

- DockerにてMailHogのDockerコンテナを起動する方法を簡単にまとめる。

# 方法

1. 任意のディレクトリに`docker-compose.yml`と`.docker/mail`ディレクトリを作成し、`Dockerfile`を作成する。階層をわかりやすく表すと下記のようになる。

    ```
    任意のディレクトリ
        └docker-compose.yml
        └.docker
            └mail
                └Dockerfile
    ```

1. docker-compose.ymlを開き下記の内容を記載する。

    ```docker-compose.yml
    version: "3.8"

    services:

      mail:
        build:
          context: ./.docker/mail
          dockerfile: Dockerfile
        ports:
          - "8025:8025"
          - "1025:1025"
    ```

1. Docker hubを確認してMailHogのイメージ情報を確認する。
    - [https://hub.docker.com/r/mailhog/mailhog/tags](https://hub.docker.com/r/mailhog/mailhog/tags)
1. どうやら現在の最新バージョン（タグ）はv1.0.1のようだ。

    ![mailhog_mailhog_Tags___Docker_Hub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/77503bbc-206a-78df-bcd6-0758079935ff.png)

1. 「latest」タグを使ってもいいが、コンテナ起動時期によってバージョンが変わると困るのでv1.0.1を指定することにする。
1. Dockerfileを開き、下記のように記載する。

    ```.docker/mail/Dockerfile
    FROM mailhog/mailhog:v1.0.1
    ```

1. `docker-compose.yml`と`.docker`があるディレクトリで下記コマンドを実行してコンテナを起動する。

    ```shell
    docker-compose up -d
    ```

1. 上記コマンドが無事実行されたら下記コマンドを実行し、起動中コンテナの中にMailHogのコンテナがあるか確認する。

    ```shell
    docker ps
    ```

1. [http://localhost:8025/](http://localhost:8025/)にアクセスし下記スクショと近い画面が開くことを確認する。無事開けたら作業完了である。

    ![MailHog_と___main_-_DokuPro_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/31859ca2-e62b-23de-8f8e-3f36cbcfae2b.png)
Javaのアノテーションの指定

static final public Stringであれば、アノテーションに使用できる。
```java
public class Const {
	static final public String EMPLOYEE_TABLE ="Employees";
	static final public String DATASOURCE = "java:/TEST";
}
```

```java
@Data
@Entity
@Table(name = Const.EMPLOYEE_TABLE)
public class Employee {
```
[AWS Q&A 365][SNS]AWSのよくある問題の毎日5選 #65

# 1. Amazon SNSの価格設定は何ですか？
答え：Amazon SNSの価格設定は、サービスの使用量に基づいて変動します。初期費用や最小料金はなく、ユーザーは使用した分だけを支払います。価格は、リクエストの数、配信された通知の数、データ転送料金に基づいています。

# 2. Amazon SNSを使用するための追加料金はありますか？
答え：SMSメッセージングやモバイルプッシュ通知など、Amazon SNSの特定の機能を使用するための追加料金が発生する場合があります。これらの料金は、地域や使用するメッセージングの種類に基づいて変動します。

# 3. Amazon SNSの使用コストをどのように見積もることができますか？
答え：Amazonは、そのウェブサイト上に価格計算ツールを提供しており、ユーザーがAmazon SNSの使用コストを特定の使用ニーズに基づいて見積もることができます。ユーザーは、リクエスト、通知、データ転送の予想使用量を入力して、月額請求額の見積もりを取得することができます。

# 4. Amazon SNSには無料枠はありますか？
答え：はい、Amazon SNSは無料枠を提供しており、ユーザーは月に最大100万メッセージを無料で送信することができます。ただし、ユーザーは自分の使用に関連するデータ転送料金を負担する必要があります。

# 5. Amazon SNSの価格設定は他の通知サービスと比較してどうですか？
答え：Amazon SNSの価格設定は、市場上の他の通知サービスと競争力があります。しかし、具体的なコストはユーザーの特定の機能と使用ニーズに基づいて異なる場合があります。個々のニーズに最適なサービスを決定するために、異なるサービス間で価格を比較することをお勧めします。
[AWS Q&A 365][SNS]Daily Five Common Questions #65

# 1. What is the pricing for Amazon SNS? 
Answer: The pricing for Amazon SNS varies based on the usage of the service. There is no upfront cost or minimum fee, and users only pay for what they use. The pricing is based on the number of requests made, the number of notifications delivered, and the data transfer fees. 

# 2. Are there any additional fees for using Amazon SNS? 
Answer: There may be additional fees for using certain features of Amazon SNS, such as SMS messaging and mobile push notifications. These fees vary based on the region and the type of messaging used. 

# 3. How can I estimate the cost of using Amazon SNS? 
Answer: Amazon provides a pricing calculator on their website that allows users to estimate the cost of using Amazon SNS based on their specific usage needs. Users can input the number of requests, notifications, and data transfer they expect to use to get an estimate of their monthly bill. 

# 4. Is there a free tier for Amazon SNS? 
Answer: Yes, Amazon SNS offers a free tier that allows users to send up to 1 million messages per month for free. However, users are responsible for any data transfer fees associated with their usage. 

# 5. How does Amazon SNS pricing compare to other notification services? 
Answer: The pricing for Amazon SNS is competitive with other notification services on the market. However, the exact cost may vary based on the specific features and usage needs of the user. It is recommended to compare pricing across different services to determine the best fit for individual needs.
ECS Execで直接コンテナに入ってデバッグする方法

こちらの記事の続きです
https://qiita.com/okdyy75/items/a20e81f122c90070c355


## 下準備
### ①SSM実行権限用のポリシーを作成
「ECSTaskExecutionSSMmessages」という名前でポリシー作成

```bash
aws iam create-policy --policy-name ECSTaskExecutionSSMmessages \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "ssmmessages:CreateControlChannel",
          "ssmmessages:CreateDataChannel",
          "ssmmessages:OpenControlChannel",
          "ssmmessages:OpenDataChannel"
        ],
        "Resource": "*"
      }
    ]
  }'
```

### ②ECS用のロールに先ほど作成したポリシーを付与
ECS用のロール「y-oka-ecs-dev-task-execution」に作成したポリシーをアタッチ

```bash
ECS_ROLE="y-oka-ecs-dev-task-execution"
POLICY_ARN="arn:aws:iam::<awsのアカウントID>:policy/ECSTaskExecutionSSMmessages"

aws iam attach-role-policy \
  --role-name $ECS_ROLE \
  --policy-arn $POLICY_ARN
```

### ③ECSでExecができるようにサービス更新

```bash
ECS_CLUSTER="y-oka-ecs-dev"
ECS_SERVICE="y-oka-ecs-dev"

# サービス更新
aws ecs update-service \
  --no-cli-pager \
  --cluster $ECS_CLUSTER \
  --service $ECS_SERVICE \
  --enable-execute-command
```

### ④Exec実行用のタスク作成

```bash
ECS_CLUSTER="y-oka-ecs-dev"
ECS_SERVICE="y-oka-ecs-dev"
ECS_EXEC_CONTAINER="php-fpm"
ECS_TASK_FAMILY="y-oka-ecs-dev"

NETWORK_CONFIG=$(
  aws ecs describe-services \
    --cluster $ECS_CLUSTER \
    --services $ECS_SERVICE | jq '.services[0].networkConfiguration'
)

# タスク起動
task_arn=$(
  aws ecs run-task \
    --no-cli-pager \
    --launch-type FARGATE \
    --enable-execute-command \
    --cluster $ECS_CLUSTER \
    --task-definition $ECS_TASK_FAMILY \
    --network-configuration "${NETWORK_CONFIG}" | jq '.tasks[0].taskArn'
)

echo $task_arn

```

## 実行
### ⑤ECS Execを実行

```bash
ECS_CLUSTER="y-oka-ecs-dev"
ECS_TASK="8e8211471de642aea9723405f8255fa3"
ECS_EXEC_CONTAINER="php-fpm"

# execコマンド実行
aws ecs execute-command \
  --cluster $ECS_CLUSTER \
  --task $ECS_TASK \
  --container $ECS_EXEC_CONTAINER \
  --interactive \
  --command "/bin/sh"
```

## 後片付け
### ⑥作成したタスクを終了

```bash
ECS_CLUSTER="y-oka-ecs-dev"
ECS_TASK="8e8211471de642aea9723405f8255fa3"

aws ecs stop-task \
  --no-cli-pager \
  --cluster $ECS_CLUSTER \
  --task $ECS_TASK
```

### ⑦更新したサービスを元に戻す

```bash
ECS_CLUSTER="y-oka-ecs-dev"
ECS_SERVICE="y-oka-ecs-dev"

aws ecs update-service \
  --no-cli-pager \
  --cluster $ECS_CLUSTER \
  --service $ECS_SERVICE \
  --disable-execute-command
```

### ⑧作成したポリシーをデタッチ＆削除

```bash
POLICY_ARN="arn:aws:iam::xxxxxxxxxxxx:policy/ECSTaskExecutionSSMmessages"

aws iam detach-role-policy \
  --role-name y-oka-ecs-dev-task-execution \
  --policy-arn $POLICY_ARN

aws iam delete-policy --policy-arn $POLICY_ARN
```
リーダブルコードを読んで

## はじめに
リーダブルコードを読んで、勉強になったこと、感じたことをまとめていきます。

## 目次
#### 理解しやすいコードとは
#### ・表面上の改善

## コードを書く上での大前提

・コードは理解しなければならない
・コードは他の人が、最短時間で理解できるように書かないといけない
1つずつ説明していきます。

#### ・コードは理解しなければならない
これがコードを書くうえで、一番大事になる原則としている。
#### ・コードは他の人が、最短時間で理解できるように書かないといけない
コードを読む際に、処理内容が分かりにくいコードよりも、わかりやすいこコードの方が良いに決まっています。
わかりにくいコードを書いていると、周りの開発者はもちろん、何ヶ月後かに、自分で見返した時にも、コードを読むのに労力を使ってしまいます。

## 表面上の改善
##### *鍵となる考え*
・明確な単語を選ぶ
・汎用的な名前は避ける
・抽象的な名前よりも具体的な名前を使う。
・接尾辞や接尾頭を使って、情報を追加する
・名前の長さを決める


#### 明確な単語を選ぶ
例えば「getPage」という名前は、ページをどこから取ってくるのかわからない。インターネットから取得するのであれば、「FetchPage」、「DownloadPage」などが良い。

#### 汎用的な名前は避ける
例えば、「tmp」「retval」「foo」のような名前は付けないようにしたほうがいい。
単語自体に情報が無いので、使うのであれば、それ相応の理由を用意する。

#### 抽象的な名前よりも具体的な名前を使う。
名前は短いコメントのようなものなので、絶対に知らせなきゃいけない情報があれば、適切な単語を選び、変数名に追加する

#### 名前の長さを決める
この本では、変数の長さは、長いのが問題ではないが、できるだけ短くすることをおすすめしている。
理由としては、長い変数は覚えにくいし、画面を占領してしまうからです。
頭文字と省略形はプロジェクト固有の省略は良くない。理由は、新しく入ってきたメンバーはその変数の意味を理解できないからである。
不要な単語も投げ捨てた方がいい。例えば、CovertToString()をToString()にしてもあまり変わらない。
変数名はシンプルにしよう。


## 誤解されない名前
##### *鍵となる考え*
・最善の名前とは、誤解されない名前

自分の書いているコードが、自分の意図を正確に伝えるようにする。
プログラミングの英単語は、filterやlength、limitなど曖昧な意味の単語が多い。
例えば、上下の限界値を決めるときは、maxやminなどを使う。包含的範囲であればfirstやlastなどを使うなど、工夫をしていくことが必要である。

## 美しさ
#### なぜコードの美しさが必要なのか
プログラミングの時間のほとんどはコードを読む時間です。読みやすいコードは、コーディングのミスを減らし、誰でも使いやすいコードになるのです。
##### *鍵となる考え*
・複数のコードブロックで同じようなことをしていたら、シルエットも同じようなものにする。

・コードの列を整列すれば、概要が把握しやすくなる
・空行を使って大きなブロックを論理的な段落に分ける。


## 最後に
全ての内容を書ききれていないので、また追記していきます。
购买ChatGPT账号：方法与平台推荐

# 购买ChatGPT账号：方法与平台推荐👍 

ChatGPT是一款基于人工智能技术的聊天机器人，可以用于多种场景，如客服、教育、娱乐等。现在越来越多的企业和个人开始使用ChatGPT来提高工作效率和用户体验。本文将介绍如何购买ChatGPT账号，以及ChatGPT账号的功能和使用注意事项。

## 为什么要购买ChatGPT账号？

目前个人注册ChatGPT官方账号比较麻烦，需要海外手机号码验证才能注册成功，如果没有海外手机号码的用户只能购买一个现成的ChatGPT成品账号了。

## ChatGPT账号购买平台推荐

**御华发卡**（yuhfk.com）是一个专业国内实体公司提供海外账号交易平台，它们的商品包含游戏账号、热门app初始账号，海外游戏代充值，社交APP代充值，以及直播平台充值等。ChatGPT账号购买链接：🚀️ [https://go.koa.lol/product/account-gpt-life](https://go.koa.lol/product/account-gpt-life)

### 账号类型与介绍

1. 账号类型：ChatGPT独享可改密账户、ChatGPT手工账户可改密；
2. 每个账号均为个人独享的精品账号，均可以正常登录ChatGPT，已过手机验证；
3. 账号自带5美金，可以使用OpenAI全部产品（chatgpt、gpt3.5 、codex、api、 dalle）；
4. 账户均为Google企业账户，登陆请通过Google快捷登陆
5. 24小时自动发货，完成付款就会在网站上显示账户密码及登陆/修改密码教程

## ChatGPT功能与应用场景

* 自然语言处理：ChatGPT可以识别和处理自然语言，能够理解人类的语言并作出适当的回应。
* 问答系统：ChatGPT可以回答各种问题，从简单的常识问题到复杂的技术问题。
* 对话系统：ChatGPT可以与用户进行对话，提供各种信息和服务，例如天气、新闻、时间等。
* 文本生成：ChatGPT可以生成各种类型的文本，例如文章、新闻、小说等，可以用于自然语言生成和机器写作等领域。
* 语言翻译：ChatGPT可以将文本从一种语言翻译成另一种语言，例如从英语翻译成中文等。
* 情感分析：ChatGPT可以识别文本中的情感，并作出相应的回应，例如安慰、鼓励等。
* 信息检索：ChatGPT可以从海量的信息中检索出用户所需的信息，例如从互联网中查找相关的文章或资料。

## ChatGPT使用常见问题与解答

1. 国内IP无法使用，请自备科学上网环境。
2. 5美金余额用完了还能继续使用ChatGPT吗？目前在官方网页版使用ChatGPT是免费的，只有调用API才收费。
3. 购买过后能退款吗？不支持的，全新账号不支持找回，请想好了再买，如果不是账号问题，是不退的！
4. 进入ChatGPT报错如何处理？由于全世界的人都在用ChatGPT，提示这个错误是人太多，我们等使用的人少些了再去使用即可！
5. 提示Sorry you have been blocked如何处理？提示这个错误表示你当前使用的IP和代理被openai/ChatGPT官方拉黑了，更换节点或VPN即可。

希望以上内容能帮助你了解如何购买ChatGPT账号以及相关使用信息。