OmniAICreator/Qiita-1.07M huggingface dataset:
AWS ANS合格(更新)記(2024/4/12投稿)

# はじめに
この度AWS認定のANSを受験してきましたので、勉強した内容と受験した感想を書いておきます。
今回は更新目的の受験になります。

# 前提
* AWSのデータ分析基盤は実務経験あります
* AWS認定は全て取っています(詳細は[こちら](https://qiita.com/handy-dd18/items/d21d914bf1c475d777f2))　※PASは[こちら](https://qiita.com/handy-dd18/items/18e8a856906f97bbb964)、DEAは[こちら](https://qiita.com/handy-dd18/items/cd9410fc2c02a28b4c1d)
* AZ-900/AZ-104/AZ-700/AZ-305/AZ-204/DP-900/AZ-500/DP-203は取得済み
* Google Cloud認定は9つ取ってます

# 学習内容
今回は以下の順番で勉強を進めました。

* [①試験対策本（AWS認定 高度なネットワーキングー専門知識(ANS-C01)完全対応テキスト](https://amzn.asia/d/bjTbydF)
* [②Udemy模擬問題](https://www.udemy.com/share/10arMi3@4RaLiH7kwIM8KMi02sCmFDJA46OFNyAJk3Tz6B0ZEgasgd4ioViVoFPJ7IUZPIGn/)

## ①試験対策本
今回は過去にANS受験した時に使った対策本ではなく、2024年4月2日発売の以下の対策本を使って勉強しました。

* [AWS認定 高度なネットワーキングー専門知識(ANS-C01)完全対応テキスト](https://amzn.asia/d/bjTbydF)

理由としては、ANS試験は新しくなってから以前のANS試験や出題範囲がかなり変わっていると聞いており、古い対策本では十分に網羅されていない可能性があったので、より最新の対策本にしました。

結果としては大正解だったと思います。
以前もANS取っていたり一部ネットワーク系サービスは実務で使っているので、ある程度の知識はあったのですが、それ以上のかなり細かなところまで解説されていて、非常に勉強になりました。

また、Site-to-Site VPN、DX、TGW等の構成パターン図も複数載せられていて、イメージもしやすかったです。

個人的には2章～5章あたりは特に細かく読んで覚えておいたほうが良いと思いました。
前の方に書いてある構成パターンを理解できているかどうかで得点率が大幅に変わりそうです。

## ②Udemy
次にUdemyの模擬試験講座を購入して、最初の1回分だけ解きました。

- [②【ANS-C01対応】AWS認定 高度なネットワーキング – 専門知識 模擬問題集＋詳解 【2024年版最新】](https://www.udemy.com/share/10arMi3@4RaLiH7kwIM8KMi02sCmFDJA46OFNyAJk3Tz6B0ZEgasgd4ioViVoFPJ7IUZPIGn/)

この模擬問題は日本語なので問題はすらすらと解けると思ってたのですが、本番さながらの文章量で1回を解ききるのに2時間以上かかりました。
ただ、実試験と近いような形式の問題を解けるので、時間に余裕があるならやったほうが良いと思います。

# 受験した感想
結果からいうと、かなり難しかったです。
SAProと同等かそれ以上と言われる理由がよくわかりました。
未だになんで合格できたのかわかりません。笑

これから受験する人は、対SAProと同等レベルの意気込みで臨まないとかなり面食らうと思いますので、覚悟しておいたほうが良いと思います。

# 受験結果
前回よりは得点が下がってますが、何とか合格しました。
対策本を読んでなければ合格は難しいと思う試験でした。
![1000012341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/bcb04891-e9a5-bea5-a691-af8322d41d81.png)

# おわりに
ANS認定の期限は2025年1月だったのですが、AWS認定の再受験キャンペーン中に受験しておきたいと思ったので、前倒し受験しました。
結果として合格したから使いませんでしたが、申し込んでたことで安心して受験できたので、キャンペーンがあって良かったです。

次は一度落ちてるDP-500かGoogleCloudのMLあたりを再チャレンジしようかと考えています。

この記事がどなたかの参考になれば幸いです。
InfraAcademyでLinuxを学んでみた

初投稿です♪
私はインフラエンジニアを目指している駆け出しエンジニアです。
インフラの勉強をしようと思ったら、このような記事を見つけました。

[【初心者向け】Linuxコマンドの練習ってどうやったらいいの？効果的な練習方法とは？](https://qiita.com/ryu235464345/items/0710a7f77382f67add28)

その中で、InfraAcademyという学習サービスがあることを知りました。
[InfraAcademy](https://engineer-ninaritai.com/infraacademy/)

備忘録として学習の記録を残します。

## Linuxのディレクトリ
### ルートディレクトリ
Linuxの頂上の起点となっているディレクトリをルートディレクトリ

### 絶対パスと相対パス
絶対パスは、ファイルの場所を最初から最後まで書く
こんな感じ
```
/etc/test
```
相対パスは、カレントディレクトリからの位置
```
./test
```
### 記号を使ったパスの表し方
カレントディレクトリは.(ドット)1文字で表す
カレントディレクトリから1つ上のディレクトリを..のようにドット2文字で表す
前のカレントディレクトリは”-“で表す

```
cd ./test
```

### ディレクトリの作成コマンド
mkdirコマンドは、make directoryの略でディレクトリを作成するコマンド
```
mkdir dir
```

### ディレクトリを削除するコマンド
ディレクトリを削除する場合は、rmdirコマンドを利用
```
rmdir dir
```
ただ、ディレクトリ内にファイルなどあると削除できない。

## 感想
Linuxの勉強をしてきましたが、InfraAcademyはとてもわかりやすかったです。シュミレーターも用意されているので、簡単に練習できました。
Linux学習者にはおすすめです。
Zoom面談もしていただき、学習のアドバイスもいただきました。これからも学習を継続していきたいと思います。
（忘備録）デスクトップPCに Windows Server 2022 をインストールしたら、ネットワークドライバのインストールに苦戦した

同様の事象が発生した方の助けになればと思い、以下記載します。

# 発生した事象
クライアントOS向けPC（マザーボード）に搭載されている、Intel社のNIC「I218-V」が、
マザーボードに付属のDVDや、別途 Windows Server 2022用のドライバーを用いても
以下のようにうまく認識されなかった。
 
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/0201d5a9-433f-bce2-94c5-9e5da499c0dd.png)

どうにも調べたところによると、クライアントOS用（Windows 10など）の、マザーボードに搭載されているNICには、Windows Server用のドライバを提供されていないことがあるらしい。

# 環境
Windows 10 がインストール済だった自作PCに、Windows Server 2022 を新たにインストールした。マザーボードは以下を使用。

https://www.asrock.com/mb/intel/Z97M%20Pro4/index.jp.asp


# 対処法
### 1. メーカーと製品名の特定

デバイスマネージャーで、？になっているデバイスの中から
NICっぽいもの（今回はイーサネット コントローラー）を選び、
右クリック > プロパティ > 詳細タブ > ハードウェアID から、以下の文字列を確認する。
```
「VEN_【ベンダーID：英数4文字】&DEV_【デバイスID：英数4文字】〜
```
ベンダーIDとデバイスIDをメモしたら、以下のサイトに入力して
メーカーと製品名を調べる。 #寄付のポップアップは画面更新で消えた。

https://www.pcilookup.com/?ven=8086&dev=15A1&action=submit

すると、今回不明なデバイスとなっている「イーサネット コントローラー」は
以下のように、Intel社の I218-V というNICであることがわかる。

![スクリーンショット 2024-04-12 17.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/3abd00f2-6e09-1535-7d78-bd8d7ff33d31.png)


### 2. ドライバのインストール

デバイスマネージャーで、「イーサネット コントローラー]を右クリックし、ドライバーの更新 を選択。
表示される以下のウインドウで、「コンピューターを参照して、ドライバーを検索」をクリック。

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/b2bda29b-f871-d6b2-9915-fda4223489d5.png)

「コンピューター上の利用可能なドライバーの一覧から選択します」をクリック。

![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/2f45f678-6759-025c-c5e1-b5e5d138f80d.png)

「ネットワークアダプター」を選び、「次へ」をクリック。
「製造元」を「Intel」にして、「ネットワークアダプター」から
「Intel Ehternet Connection(2) I218-LM-XXXXXX」を選び、「次へ」をクリック。
（※前述の通り同一のドライバはないため、適宜品番が似ているものを選択ください。）

![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/e01adce3-cb4c-155e-b623-72345341d80a.png)

警告が表示されるが、はい、を選択する

![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/e82ddb29-1240-ca04-c113-94c84bdfe2cd.png)

以上で有線LANを認識し、インターネット接続ができるようになりました。（再起動不要）
同様の事象が発生した方は参考にしてみてください。

# 参考
以下参考にさせていただきました。

https://dot1.tv/windows-driver/

https://axion.co.jp/blog/post-3031.html
EC2からFSxにrobocopyでファイル移行する手順

# 概要
EC2からFSxにrobocopyでファイルを移行する手順をまとめる。

## 前提
移行元EC2と移行先EC2、FSxが構築済みであること。

# 目次
- 移行元EC2フォルダ共有設定
- 移行先EC2 FSxマウント設定
- 移行先EC2 robocopy実行

# 移行元EC2フォルダ共有設定
1.移行元EC2にリモートデスクトップで接続し、コントロールパネルを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/61cd4abd-ccf0-1d03-88c1-30c373cae657.png)

2.[ネットワークと共有センター]-[共有の詳細設定]を開き、以下の通り設定する。
◎ネットワーク探索を有効にする
　☑ネットワークに接続されているデバイスの自動セットアップを有効にする。
◎ファイルとプリンターの共有を有効にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/aeda7260-27f9-397e-79b9-0717279d8b40.png)

3.同じ画面にて[すべてのネットワーク]を選択して、以下の通り設定する。
◎共有を有効にして、ネットワークアクセスがある場合はパブリックフォルダー内のファイルを読み書きできるようにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/f796e0d2-57a5-5187-e1c7-ca7e900501b2.png)

4.エクスプローラを開き、共有したいフォルダを右クリックして[アクセスを許可する]-[特定のユーザ...]を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/23efc1e9-c008-6304-ad75-c07634952983.png)

5.Everyoneを[読み取り/書き込み]で追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/74d8c5de-2d8f-519c-ad33-2967586b7052.png)

6.念のため本画面のキャプチャなどを取得し、[終了]をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/d8217105-ff26-b344-f1d4-80dc2f4b1330.png)

7.移行先EC2でエクスプローラを開き、\\<移行元EC2のIPアドレス>で共有設定したフォルダにアクセスができることを確認する。

# 移行先EC2 FSxマウント設定
1.移行先EC2にリモートデスクトップ接続で、ローカルのAdministratorでログインする。

2.ローカルのAWSマネジメントコンソールで[FSx]を開き、作成したFSxのファイルシステムを選択して[アタッチ]をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/2199d226-2ce7-44d4-6f91-c4660a706ce6.png)

3.[▼アタッチ手順-デフォルトのDNS名を使用]に表示されているコマンドをコピーする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/c3d025d5-b90f-af18-1961-3ab2b5cde2da.png)


4.移行先EC2インスタンスでコマンドプロンプトを開き、手順3でコピーしたコマンドを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/e1ea7295-c57d-df6d-dc5e-d7f5fe8563ef.png)

5.以下の通りに入力して[Enter]をクリックする。
[〇〇のユーザ名を入力してください]：Admin@ドメイン名
[〇〇のパスワードを入力してください]：Directory Service作成時に設定したパスワード


6.[コマンドは正常に終了しました]と表示されたことを確認して、Exitコマンドでコマンドプロンプトを閉じる。

7.エクスプローラーを開き、共有フォルダが作成されていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/40be1e6c-6d06-d94b-6f98-6fb25edfa88d.png)


# 移行先EC2 robocopy実行
1.移行先EC2インスタンスでPowershellを管理者権限で実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/67eae618-5ac0-6c2b-21a4-32c3160c5aca.png)

2.以下コマンドを実行して、robocopy移行のテストをする。

```
robocopy \\<移行元サーバIP>\<移行元共有フォルダ>\ Z:\test\ /MIR /DCOPY:DAT /R:1 /W:5 /L
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/cf7e3956-6df4-89f5-8791-5dc707fe9d3f.png)



3.以下コマンドを実行して、robocopy移行を実行する。

```
robocopy \\<移行元サーバIP>\<移行元共有フォルダ>\ Z:\test\ /MIR /DCOPY:DAT /R:1 /W:5
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682297/be7b75b9-0bd1-cde9-3ca0-c742c434727a.png)


4.エクスプローラを開き、FSxの指定のフォルダに移行元EC2の共有フォルダからファイルが移行されていることを確認する。
ECS(Fargete)とECS(EC2)とEKSの比較

コンテナの違いをまとめました。
違いが良くわからず、もやもやしている方々が、「なんだ、そんな事か」と感じてくれて、活用が進むと幸いです。

ECS(Fargete)とECS(EC2)とEKSの比較
--
Fargateの特徴
--
インフラ管理が手軽になる
クラスタであるインスタンスのOSやミドルウェアの構築が不要。
インスタンスタイプなどの設定や管理も不要。

Fargateの欠点
--
sshやdocker execが利用できない。
パブリックIPの固定割り当てができない


EC2とFargateの比較表
--
| 特徴             | EC2                                     | Fargate                                     |
|----------------|----------------------------------------|--------------------------------------------|
| マネージド度         | 自己管理型                                   | 完全にマネージド                              |
| インフラ管理         | ユーザーがインスタンスを管理                | インフラストラクチャーはAWSが管理             |
| 課金             | インスタンスの実行時間に応じて課金            | コンテナのメモリとvCPUの使用量に基づいて課金       |
| スケーラビリティ       | 手動または自動スケーリングでスケーリング可能        | 自動スケーリングが可能                        |
| サーバレス         | いいえ                                     | はい                                         |
| 開始速度          | インスタンスの起動に時間がかかる               | コンテナは数秒で起動                          |
| リソース利用率       | ユーザーがインスタンスを最適化                | AWSが最適化                                 |
| セキュリティ         | ユーザーがセキュリティグループやキーペアを管理      | AWSがセキュリティを管理                        |
| タイプの選択         | さまざまなインスタンスタイプが利用可能           | インスタンスタイプの選択はありません                |

ECS on EC2を利用するメリット、デメリット
--
コンテナが起動しているサーバにアクセスできる。 
sshやdocker execが利用できる。パブリックIPの固定割り当てができる。
一方、デメリットはEC2のプロビジョニングと管理を行う必要がありインフラストラクチャ部分の管理工数がかかる。

ECSとEKSの比較表
--

| 特徴             | EKS                                                      | ECS                                                      |
|-----------------|----------------------------------------------------------|----------------------------------------------------------|
| インフラストラクチャの管理や設定       | 必要                                            | 不要                                           |
| 対応コンテナ      | Docker、OCIコンテナ                                         | Dockerコンテナのみ                                         |
| 制御面           | Kubernetes                                               | Amazon ECSエージェント                                    |
| オートスケーリング | クラスタオートスケーラーを使用                             | サービスレベルのオートスケーリング                         |
| ノード管理         | マネージドノードグループやAmazon EC2インスタンス           | クラスタ内のインスタンス管理                             |
| ネットワーキング   | Amazon VPC CNIネットワーキング、ALB Ingress Controllerなど | Classic Load Balancer、Application Load Balancerなど     |
| サービスディスカバリ | Kubernetes Service Discovery                              | ECS Service Discovery                                     |
| ロールアウト       | KubernetesのDeployment、StatefulSetなどを使用               | ECSのService、TaskDefinitionなどを使用                     |
| 課金             | Kubernetesクラスターの管理料金、EC2インスタンスの課金    | ECSのコンテナの実行時間、使用したリソースの課金           |
オンサイトとオフショア開発：ニアショアオフショアの重要性

最近、ソフトウェア開発業界では、オンサイトとオフショア開発に関する議論が活発化しています。これらの用語は、ソフトウェア開発プロジェクトの実施方法を指す重要な概念です。特に、ニアショアオフショア開発は、効率的な開発プロセスを確立するために重要です。本記事では、これらの概念について詳しく説明し、ソフトウェア開発における役割を探求します。
1. オンサイトとは
[オンサイト](https://newwave-solutions.co.jp/what-is-onsite/) 開発とは、開発プロセスが顧客の現地で行われることを指します。つまり、開発チームが顧客のオフィスに配置され、直接的なコミュニケーションと共同作業が可能です。オンサイト開発は、プロジェクトの要件や変更に対するリアルタイムのフィードバックを提供し、顧客との関係を強化します。
2. オフショア開発とは
[オフショア開発とは](https://newwave-solutions.co.jp/what-is-offshore/) 、開発プロセスが顧客の国外で行われることを指します。主に低コストの労働力を利用することが目的であり、通常は開発チームが別の国に配置されます。オフショア開発は、大規模なプロジェクトや時間の制約があるプロジェクトに適していますが、コミュニケーションの障壁やタイムゾーンの違いが課題となる場合があります。
3. ニアショアオフショア
ニアショアオフショア開発は、オフショア開発とオンサイト開発の中間地点に位置します。つまり、開発チームが顧客に近い国に配置されることを意味します。これにより、コミュニケーションの円滑化やタイムゾーンの違いの軽減が可能となります。ニアショアオフショア開発は、効率的なプロジェクト管理とコスト削減を実現するための優れた選択肢です。
オンサイト、オフショア、[ニアショア](https://newwave-solutions.co.jp/offshore-and-nearshore/) オフショアの比較を行うと、それぞれに異なる利点と課題があります。オンサイト開発は、リアルタイムのコミュニケーションやフィードバックを可能にし、顧客との関係を強化しますが、コストがかかる場合があります。一方、オフショア開発は、コスト削減が可能ですが、コミュニケーションの課題や品質管理のリスクがあります。
ニアショアオフショア開発は、これらの問題をバランスよく解決することができる選択肢です。顧客に近い場所に開発チームを配置することで、コミュニケーションの円滑化や品質管理の向上が期待できます。また、オフショア開発よりもコストが低く抑えられる場合もあります。
結論として、ソフトウェア開発においては、オンサイト、オフショア、ニアショアオフショアの選択肢を適切に活用することが重要です。プロジェクトの要件や目標に応じて、最適な開発方法を選択し、効率的な開発プロセスを確立していくことが求められます。
cscの作法 その488

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
datatableで、CSVを読み込め。


# サンプルコード

```

using System;
using System.Text;
using System.IO;
using System.Data;

namespace App
{
	class Program {
		static void Main(string[] args) {
			DataTable dt = new DataTable();
			dt.Columns.Add("No", typeof(int));
			dt.Columns.Add("Name", typeof(string));
			dt.Columns.Add("Age", typeof(int));
			Encoding enc = Encoding.GetEncoding("Shift_JIS");
			using (StreamReader sr = new StreamReader("dt.csv", enc))
			{
				while (sr.EndOfStream == false)
				{
					string line = sr.ReadLine();
					string[] fields = line.Split(',');
					dt.Rows.Add(fields[0], fields[1], fields[2]);
				}
			}
			for (int i = 0; i < dt.Rows.Count; i++)
			{
				DataRow row = dt.Rows[i];
				Console.WriteLine("No: {0}, Name: {1}, Age: {2}", row["No"], row["Name"], row["Age"]);
			}
		}
	}
}


```

# 実行結果

```
>dt4
No: 1, Name: 太郎, Age: 20
No: 2, Name: 次郎, Age: 15
No: 3, Name: 三郎, Age: 10

```

以上。
【AtCoder】ABCの価値観の差が大きすぎてカルチャーショックを受けてしまった

## はじめに

茶色Coderのwhile-true-ifです。

AtCoderは最近精進しています。

## ストーリー

この記事を書く前、AtCoderをやっている友達との会話で歴然とした差を見せつけられました。以下が友達との話です。
(自分:W,友達(緑Coder):A,友達(始めたばかりの灰色):S)

A:今回のABCはABCD4完だった...残り3分のところでD問題を解けたけどそんなにうれしくないな...

W:(自分はABC爆速3完して、緑パフォとったのでかなりよかったつもりだった...)えっ！

S:おい、A。あおってんの？自分はAB問題やっとの思いで解けたんだよ。

こんな会話をして、A君との歴然とした差をかなり感じてしまいました。

今からそれぞれの人の「よかった」と思う基準を書いていきたいと思います。

余談ですが、青コーダーの先輩はいつも通りのABCDEF6完と言っていました。

## 「よかった」と思う基準

:::note warn
**今から書く情報は信頼性が保証されていません。あくまでも、自分の身の回りの話です。**
:::

### 始めたばっかりの灰色Coderの人S君の話

W:ABCで「よかった」と思う基準は何ですか？

S:AB問題を30分以内で解くことですね。でも、B問題を解けただけでうれしいですよ。

W:C問題についてはどう思いますか？

S:解けたら喜びますよ。っていうか夢だと思いますね。

W:次回の目標パフォーマンスは？

S:500くらいです。

こんな会話をしました。自分も最初の方はB問題を解けただけで喜んで、C問題は手の届かない存在だと思っていました。今、S君は全探索を中心に精進しているらしいです。そのうち、累積和も学ぼうと意欲的な姿勢を見せていました。

### 茶色Coder(自分(W)との自問自答)

W:ABCで「よかった」と思う基準は？

W:ABCを爆速で3完するか、ABCDの4完をすることです。

W:E問題については？

W:解けたらいいなと思います。今までのコンテストでE問題を解けたことはほとんどありません。

W:目標パフォーマンスは？

W:1000くらいです。

自分は、今、累積和の応用や、二分探索の応用、DFS、BFSを学習中です。そのうち、緑コーダーになりたいです。

### エリート緑CoderのA君の話

W:ABCで「よかった」と思う基準は何ですか？

A:ABCDEを爆速で5完するか、ABCDEFの6完をすることです。

W:F問題についてはどう思いますか？

A:解けたらいいなと思います。今までのコンテストでF問題を解けたことはまだ一回もありません。

W:次回の目標パフォーマンスは？

A:1200くらいです。

この人は緑Coderだけど水色Coderになるのは時間の問題という感じの人です。そのため、緑Coderにしてはかなりレベルの高い発言をしていると思います(自分の世界が狭いだけかもしれない)。この人はセグ木とかBFS、DFSとかを使いこなせます。高レベルですね(自分にとって)。

## 歴然とした差2

とあるコンテスト[ABC348](https://atcoder.jp/contests/abc348)についての点数配分の話題が友達との会話であがりました。

ちなみに、点数配分は100-200-250-425-475-550-650でした。

S君の反応:B問題は150点じゃなくて200点か。難しそう。

W(自分):C問題は300点じゃなくて、250点か。爆速でABC3完すれば緑パフォとれそう。よし！

A君の反応:E問題とF問題の点差は大きいから、E問題までは簡単だろうな。はやく5完しないとまずいな。

着目するところが違いますね。

## おわりに

やはり、精進して4年後までに水色コーダーくらいまではいきたいです。

みなさんもAtCoderで「よかった」と思う基準をコメント欄でぜひ教えてください。

---

「いいね」と「フォロー」をお願いします。フォローしてくれたら、フォロー返しします。
Home tabでNew Pageがない


+ [Build Your Personal Portfolio on Salesforce >Add Pages to Your Site](https://trailhead.salesforce.com/content/learn/projects/build-your-personal-portfolio-on-salesforce/add-pages-to-your-site)


+ [HI cannot create my pages](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aislh)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4990ce65-77f5-5c3e-cdb1-a99638697d38.png)


一瞬なんの画面なのか分からなかったけど、もしかしてExperience Cloud サイト？

:::note
SETUP --> All Sites --> your site : Builder

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/92ef893a-02bc-cf6b-88e3-1a8467f66e0e.png)
:::
【エクセルVBA】複数シート一括で特定の値をもつ行を抽出し行削除するマクロ

なかなかドンピシャなコードがweb上で見つからなかったので記録用に掲載。

```
Sub MultiSheetFilter_Delete_FillterFalse()
    Dim ws As Worksheet
    
    For Each ws In ThisWorkbook.Worksheets
    
    Dim targetRange As Range
    
        ws.Range("A1", "XFD1048576").AutoFilter Field:=2, Criteria1:="特定の値"
    
    With ws.Range("A1").CurrentRegion

        Set targetRange = .Offset(1, 0).Resize(Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        
        targetRange.Delete shift:=xlUp
        
        ws.AutoFilterMode = False
    
    End With

    Next ws
End Sub
```

おそらくもっとシンプルに書けるのでしょうけど。。

ちなみに、

```
Set targetRange = .Offset(1, 0).Resize(Rows.Count - 1).SpecialCells(xlCellTypeVisible)
```

の部分の
```
Resize(Rows.Count - 1)
```
は、
```
Resize(.Rows.Count - 1)
```
とするweb記事が多かったのですが、下記環境ではエラーになったので補足します。

macOS, office365
AWS for SAP とは何か？

### なぜこの記事を書いたのか？
AWS のYouTube 動画を見て最新技術をチェックしようとして、「AWS for SAP」という未知のサービスが紹介されていてくじけました。そのため、「AWS for SAP」について調べて、内容を理解できるようにしたいから書きました。

<dl>
    <dt>AWS for SAP とは何か？</dt>
    <dd>Amazon Web Services（AWS）上でSAPシステムを稼働させることです。AWSは2008年からSAP社と共同で取り組みを続けており、SAPの新製品の開始と同時に認定を取得する強固なパートナーシップがあります。
AWS-SAP (AWS Certified Solutions Architect - Professional) とは違います</dd>
    <dt>SAP HANA Cloud とは何か？</dt>
    <dd>SAP HANA Cloud は、未来のアーキテクトが次世代のインテリジェントデータアプリケーションを大規模に構築し、導入できるようにするマルチモデルデータベース管理システムです。</dd>
    <dt>SAP HANA とは何か？</dt>
    <dd>ERP の一つで、オンプレミス環境で動くサービスです。データベースをインメモリに展開するため、非常に高速に処理されます。</dd>
    <dt>ERP とは何か？</dt>
    <dd>ERP（Enterprise Resource Planning）とは、企業の経営資源である「ヒト・モノ・カネ・情報」を適切に分配し有効活用する計画や考え方です。﻿</dd>
</dl>

#### AWS for SAP とSAP HANA Cloud の比較
|項目|AWS for SAP|SAP HANA Cloud|
|:-:|:-:|:-:|
|提供者|Amazon Web Services|SAP|
|デプロイメントモデル|パブリッククラウド、プライベートクラウド、ハイブリッドクラウド|パブリッククラウド、プライベートクラウド|
|サービス内容|IaaS、PaaS、SaaS|SaaS|
|対応SAP製品|SAP S/4HANA、SAP Business Suite、SAP BusinessObjects、その他多数|SAP HANA|
|規模|小規模から大規模まで|中規模から大規模|
|価格|使用量ベース|サブスクリプションベース|
|メリット|高いスケーラビリティと柔軟性、幅広いサービスとツール、実績のあるクラウドプラットフォーム|高いパフォーマンスとセキュリティ、SAP による完全管理、SAP HANA に最適化された環境|
|デメリット|複雑な設定と管理、高額な可能性がある|限られたカスタマイズ性、※ベンダーロックイン|

※ベンダーロックインとは、企業に導入したシステムが特定のベンダーの製品、サービス、システムに大きく依存してしまい、他のベンダーに切り替えることが困難になってしまう状態を指します。
麻雀の運と実力の割合を調べる方法を考える

# 言い訳

私は数学が超絶得意な人間ではないし、数学大好きマンでもない。
用語の使い方などが変だったらゴメン。
でも言いたいことは伝わると思うのでよろしく。

# 仮定

以下を仮定する。

**同格と**試合をおこない、勝率の平均を求めた場合、
実力ゲーであるほど、平均勝率50％との標準偏差（ブレ）が小さい。
運ゲーであるほど、平均勝率50％との標準偏差（ブレ）が大きい。

# 方法

1. 平均1000試合で雀魂の魂天になれるAIを用意する。（試合数はテキトーに決めた。実力があるAIを使いたいということ。）

1. AI同士で戦わせ、勝率の標準偏差を求める。

1. 実力ゲー代表として将棋もAIを利用し、平均勝率（50％）との標準偏差を求める。
運ゲー代表としてじゃんけんもAIを利用し、平均勝率（50％）との標準偏差を求める。

1. 実力ゲーの将棋の標準偏差を実力度の100％、運ゲーのじゃんけんの標準偏差を実力度の0％とした場合、
それに挟まれる麻雀の標準偏差の位置が、麻雀の実力ゲーと運ゲーの割合と考えられる。

# 補足

麻雀は4人でおこなうため、勝率は50％にならない。
そのため、同格の特定のプレイヤーより順位が上ならば「勝ち」と判定する。
（これだとラス回避意識が強くなるが、しゃーない。連対率でもいいかもしれない。）
apt-get updateで更新されたインデックスファイルを確認する

## 環境
Ubuntu20.4

## はじめに

aptでパッケージのインストールを行う前に、**apt-get update**を行って、インデックスファイルを最新にしますが、実際にはどのファイルがどう最新化されているのだろうか。その裏側を確認してみました。

## やったこと

aptのインデックスファイルは、**/var/lib/apt/lists**に存在します。自分の環境では、大きく次の２種類のファイルが存在していました。
>us.archive.ubuntu.com_ubuntu_dists_focal-xxxxx
apt.postgresql.org_pub_repos_apt_dists_focal-xxxxx

```
$ls -lhr /var/lib/apt/lists | nl
```

updateを行う前に、現状のインデックスファイルを保存します。

```
$ls -lhr /var/lib/apt/lists | nl > ./moto.txt
```

updateコマンドを実行してインデックスファイルの更新をおこないます。root権限で実行しないと、権限がありませんといったエラーが出てきて更新ができないので注意です。

```
$sudo apt-get update

Get:1 http://apt.postgresql.org/pub/repos/apt focal-pgdg InRelease [123 kB]
Hit:2 http://us.archive.ubuntu.com/ubuntu focal InRelease
Get:3 http://us.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Hit:4 http://us.archive.ubuntu.com/ubuntu focal-backports InRelease
Get:5 http://apt.postgresql.org/pub/repos/apt focal-pgdg/main amd64 Packages [297 kB]
Get:6 http://us.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:7 http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [3,233 kB]
Get:8 http://us.archive.ubuntu.com/ubuntu focal-updates/main Translation-en [514 kB]
Get:9 http://us.archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [2,852 kB]
Get:10 http://us.archive.ubuntu.com/ubuntu focal-updates/restricted Translation-en [398 kB]
Get:11 http://us.archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1,179 kB]
Get:12 http://us.archive.ubuntu.com/ubuntu focal-updates/universe Translation-en [283 kB]
Get:13 http://us.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [26.2 kB]
Get:14 http://us.archive.ubuntu.com/ubuntu focal-updates/multiverse Translation-en [7,880 B]
Get:15 http://us.archive.ubuntu.com/ubuntu focal-security/main amd64 Packages [2,854 kB]
Get:16 http://us.archive.ubuntu.com/ubuntu focal-security/main Translation-en [431 kB]
Get:17 http://us.archive.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [2,735 kB]
Get:18 http://us.archive.ubuntu.com/ubuntu focal-security/restricted Translation-en [381 kB]
Get:19 http://us.archive.ubuntu.com/ubuntu focal-security/universe amd64 Packages [952 kB]
Get:20 http://us.archive.ubuntu.com/ubuntu focal-security/universe Translation-en [200 kB]
Get:21 http://us.archive.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [24.0 kB]
Get:22 http://us.archive.ubuntu.com/ubuntu focal-security/multiverse Translation-en [5,904 B]
Fetched 16.7 MB in 7s (2,368 kB/s)
Reading package lists... Done
```

自分の環境ではこれだけのインデックスファイルが更新されました。わりと長い間、updateを行っていたなかった模様です。実際に更新されたファイルには先頭行に**Get**がつきます。**Hit**がついている行は更新されていません。Getの行数を数えると20行あるので、20行のインデックスファイルが更新されたことになります。

updateを行って後、現状のインデックスファイルを保存します。

```
$ls -lhr /var/lib/apt/lists | nl > ./saki.txt
```

updateを行う前と行った後とを**diff**で比較します。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/4947c8fd-8f24-bd4d-8f23-21c39085f549.png)

確かに変更されているファイルが20個あることが確認できました。

タイムスタンプが最新になったが、ファイルの容量は変わっていないものもあれば、タイムスタンプが最新になり、ファイルの容量も若干増えたファイルものもます。増えたとしてもせいぜい1M程度です。ちなみに、新しいインデックスファイルファイルが追加になったということはありませんでした。
An error occurred (InvalidPermission.Duplicate) when calling the AuthorizeSecurityGroupIngress operation


Github action を利用して、EC2サーバにログインすると、Security Group 重複のため、下記のエラーが出てしまう。

```sh
            aws ec2 authorize-security-group-ingress \
            --group-id='sg-xxxxxxx' \
            --protocol=tcp \
            --port=22 \
            --cidr=xxx.xxx.xxx.xxx/32
  ```

```
An error occurred (InvalidPermission.Duplicate) when calling the AuthorizeSecurityGroupIngress operation: the specified rule "peer: xxx.xxx.xxx.xxx/32, TCP, from port: ***, to port: ***, ALLOW" already exists
Error: Process completed with exit code 254.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/8b12ece9-b224-e0b8-bcbd-b23362645b03.png)


### Security Group 重複回避方法


```sh
          set +e # Disable immediate exit on error
          aws ec2 authorize-security-group-ingress \
          --group-id='sg-xxxxxxx' \
          --protocol=tcp \
          --port=22 \
          --cidr=xxx.xxx.xxx.xxx/32
          # avoid the InvalidPermission.Duplicate error
          if [ $? -eq 254 ]; then
            echo "Rule already exists."
          fi
          set -e # Re-enable immediate exit on error
```
AWS構築 - 初学者説明メモ

## 0. はじめに
この記事はAWS上にLambdaをアップロードする方法についてのメモです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/bf69f3c1-1c8b-02a3-8af4-9c43089ede49.png)




## 1.CLIの環境構築
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started.html

1. AWS CLIの環境構築する
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/prerequisites.html

2. AWS SAM CLIの環境構築する
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html

3. SAMを使ってLambdaのコードを書く
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html

## 2. Pythonの環境構築
```
python3 --version
```

仮想環境の作成
```
python3 -m venv venv
```

仮想環境のアクティベート
```
source venv/bin/activate
```

## 3.SAMでデプロイする

template.yamlを作成する

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  MyFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      CodeUri: src/
      Handler: app.lambda_handler
      Runtime: python3.12
```

pythonでLambdaのコードを書く
```
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
```


pythonコードをビルドする

```
sam build
```

ビルドしたファイルをSAMコマンドでデプロイする

```
## 初回
sam deploy --guided

## 次回
sam deploy
```


## おわりに

IaC達の選択肢

- AWS cloudformation
- AWS CDK
- AWS SAM (Lambda)
- terraform (3rd Party)
- serverless framework (3rd Party)

### どれがいい？

AWS公式？ 3rd Party?
- 最新機能追加されたら公式の方が対応早い
- 3rd Partyの場合(terraform)、マルチクラウドに対応していて書き方一緒
   → 辞められたら負債になりそう
nginx＋next.jsでホットリロード

# はじめに
こんにちは。ponponnsanです。
一生懸命AIアプリのインフラ作りに勤しんでいたらもう4月になっていました。
時は早いと社会人3年目、実感しております。

今回は、nginx+next.jsでホットリロードできる仕組みについて調べました。

# やりたいこと

ローカルでnext.jsのサーバーで開発しているのと同じ感じで、nginx上でもホットリロードさせたい

# 解決策
結論から言うと、nginx.confで以下のような設定をするとホットリロードできるようになります。

```nginx.conf
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
```

なぜ、これでホットリロードできるようになるのでしょうか？

## 役割
Next.jsはホットリロードを実現するため、ブラウザとアプリケーション間でWebSocket通信をしています。

一行ずつ見ていきます。

```nginx.conf
proxy_set_header Upgrade $http_upgrade;
```
これは、WebSocketなどのアップグレードされたプロトコルをサポートするために必要な設定です。
$http_upgrade変数には、クライアントからのリクエストヘッダ"Upgrade"の値が格納されます。
これにより、プロキシ(nginx)はWebSocketなどのアップグレードされたプロトコルリクエストを適切に処理できるようになります。

```nginx.conf
proxy_set_header Connection "upgrade";
```

これは、アップグレードされたプロトコルのコネクション状態を保持するための設定です。
"upgrade"に設定することで、プロキシ(nginx)はアップグレードされたプロトコルのコネクションを維持できるようになります。
これにより、WebSocketなどのプロトコルが正常に機能するようになります。


これらの設定を追加することで、Next.jsアプリケーションのWebSocketや他のアップグレードされたプロトコルが、nginxを通じてクライアントと正しく通信できるようになります。

### AIに聞いてみる
...ちょっと私には難しかったです。
一回、webSocketなどをアップグレードして、それとConnectionをしているということですかね？？

AIに聞いてみました。
> はい、その理解で正しいです。
> 
> `proxy_set_header Upgrade $http_upgrade;`と`proxy_set_header Connection "upgrade";`の組み合わせは、WebSocketなどのアップグレードされたプロトコルの接続を維持するために使用されます。
> 
> 具体的な流れは以下のようになります:
> 
> 1. クライアントが初期のHTTPリクエストを送信する際に、"Upgrade"ヘッダに新しいプロトコル(WebSocketなど)への変更を要求する。
> 2. `$http_upgrade`変数にこの"Upgrade"ヘッダの値が格納される。
> 3. `proxy_set_header Upgrade $http_upgrade;`により、この"Upgrade"ヘッダの値がプロキシ(nginx)に渡される。
> 4. `proxy_set_header Connection "upgrade";`により、プロキシ(nginx)はこのコネクションをアップグレードモードに維持する。
> 5. これにより、WebSocketなどのアップグレードされたプロトコルの接続が適切に維持される。
> 
> つまり、これらの設定は、クライアントとアプリケーションサーバの間でアップグレードされたプロトコルを使う際に必要な連携を実現するためのものです。

わかりやすい！！

満足したので、今日はここで終わりにします。

# 参考文献
https://tech.excite.co.jp/entry/2023/05/01/145314
Webhookで302となり/loginにリダイレクトする【Laravel】

# はじめに
実務で、あるサービスとWebhookを用いて連携をする際に、302エラーとなりログイン画面にリダイレクトしてしまう問題が発生しました。
初歩的なミスではありますが、今後同じミスをしないようここに残します。

# 結論として

app/Http/Middleware/VerifyCsrfTokenに設定したWebhookを受け取るURLを追記する必要がありました。

```php: app/Http/Middleware/VerifyCsrfToken

    protected $except = [
        // ここに追加する。
        '/webhook/〇〇〇'
    ];
```

# なぜ追加する必要があるのか
まず、VerifyCsrfTokenミドルウェアでは、CSRF攻撃から保護するために、POSTリクエストに対してCSRFトークンを持っているかチェックを行います。

ただし、Webhookリクエストは外部のシステムから直接送信されるため、CSRFトークンを持たずVerifyCsrfTokenミドルウェアによってリクエストが拒否されてしまうのです。

この問題を解決するために、$exceptプロパティを使用して、特定のURLをCSRF保護のチェックから除外するようにします。（そのURLに対するリクエストはCSRFトークンのチェックを行わないようにする）

$exceptプロパティに、URLを追加することで、外部サービスからのWebhookリクエストを正常に受け取ることができるようになります！

# 最後に
今回は初歩的なミスによるエラーでしたが、改めて原理について理解するいい機会でした。
今後もエラーに遭遇した際は、解決方法を記事に残していこうと思います。
Reactで作成したアプリのルーティング

## 初めに
前回はJavaScriptで作成した、APIに関して記載しました。(備忘録)
今回は、ルーティングに関して書いていこうと思います。

## 概要
![スクリーンショット 2024-04-12 16.14.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/15e4756b-8182-8087-5485-62e9a8b0b0f2.png)

上記のように
・タイトル(ヘッダー)
・ブログ投稿記事(メイン)
→下記の様に投稿用のボタンをクリックすると、白背景のみレンダリングされる仕様
![スクリーンショット 2024-04-12 16.17.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/73c2a80b-b6a5-8247-fb13-9128ead8ff60.png)

## 実装
```javascript:Route.js
    <Router>
        <Title /> {/* Titleコンポーネントを固定する */}
        <Routes> {/* ルーティングを定義 */}
          <Route exact path="/" element={<BlogList />} /> {/* /パスにアクセスした場合はBlogListコンポーネントを表示 */}
          <Route path="/post" element={<Post />} />{/* /postパスにアクセスした場合はPostコンポーネントを表示 */}
          <Route path="/revise/:postId" element={<Revise />} />{/* /reviseパスにアクセスした場合はReviseコンポーネントを表示 */}
          <Route path="/delete" element={<Delete />} />{/* /deleteパスにアクセスした場合はDeleteコンポーネントを表示 */}
          <Route path="/user" element={<User />} />{/* /userパスにアクセスした場合はUserコンポーネントを表示 */}
        </Routes>
    </Router>
```

・pathを指定して、URLが更新される様に実装。
・各パスに対してレンダリングされる、コンポーネントを指定

## やってみて
実装してみて、最初上手くレンダリングがされませんでした。path指定の際にAPIのエンドポイントど一緒にしていなかったのが原因でした。Rubyでのルーティングは経験ありましたが、JSでのルーティングは初めてでした。構造はシンプルなので記述はしやすいなとおもいました。

## 最後に
今後も新しい事に挑戦して、実装していきたいと思います！
こんな記事みたいなどあれば教えて頂きいです。よろしくお願いします。
Vercel AI SDKのstreamTextでOpenAIのモデルを扱う

AI SDKの`streamText`を使うと色んなモデルを統合的に扱えるよ、という記事を書きました。この記事ではOpenAIの場合を書きます。

https://qiita.com/twk/items/ae7e031db9eabf473592#%E7%94%BB%E5%83%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%87%A6%E7%90%86

## 現行インターフェース

```TypeScript
import OpenAI from 'openai';

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const openaiChatStream:ChatStreamFunction = async({model, messages}) => {
    const params = {
         model: model,
         stream: true,
         messages,
    }
    const response = await openai.chat.completions.create(params as any)

    return OpenAIStream(response as any)
}

```

メッセージに画像が含まれる時は、下記のようにします。

```TypeScript
content = [
  { type: 'text', text: message },
  { type: 'image_url', image_url: { url: data!.imageUrl } }
];
```

# 新インターフェース

前回の記事のGoogleやAnthropicの場合と同様の記述となります。

```TypeScript
import { OpenAI } from 'ai/openai';

const open = new OpenAI({ apiKey: process.env.OPENAI_API_KEY || ''});

const openaiChatStream:ChatStreamFunction = async({model, messages}) => {
    const result = await experimental_streamText({
        model: openai.chat(model),
        messages: messages as ExperimentalMessage[],
    });
    
    return result.toAIStream();    
}
```

メッセージに画像が含まれる時は、下記のようにします。

```TypeScript
content = [
  { type: 'text', text: message },
  { type: 'image', image: new URL(data!.imageUrl) }
];
```

----

# 追記

更に新しいインターフェースができたようなので別記事にしました。

https://qiita.com/twk/items/3ef3aa6ca0c61d2c4fac
2024年4月 基本情報技術者試験に合格しました

エンジニアとして働き始めて2年近くが経過しました。
1年目の新人が研修で取得することも多い基本情報技術者試験ですが、この度合格しました。
恥ずかしながら、基本情報技術者試験は実務では役に立たないという意見もあり、受けずじまいでいました。

役に立つかどうか悩んでいるくらいなら受けてしまえという気持ちで受験しました。
結果、受けてよかった（勉強してよかった）という感想なので、どの点がよかったかなどをまとめます。

試験結果は、以下の通りです。
午前1は、730点/1000点
午前2は、835点/1000点
![画像１０.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/7c269940-5570-dac5-5c68-107cb8548cec.png)

試験問題については言及することはできないのですが、午前1はもう少し高得点を狙いたかったです。

## 勉強方法
受験1か月前から、「キタミ式」で必要な知識を詰め込み、過去問ナビで問題演習を行いました。午後よりも午前問題の対策に力を入れました。
毎日2時間ほど勉強しました。勉強法については、下記の書籍を参考にしました。
[科学的根拠に基づく最高の勉強法](https://www.amazon.co.jp/%E7%A7%91%E5%AD%A6%E7%9A%84%E6%A0%B9%E6%8B%A0%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E6%9C%80%E9%AB%98%E3%81%AE%E5%8B%89%E5%BC%B7%E6%B3%95-%E5%AE%89%E5%B7%9D-%E5%BA%B7%E4%BB%8B/dp/4046067233/ref=sr_1_1?adgrpid=53634471496&dib=eyJ2IjoiMSJ9.d4hR3Mt38xfOKUmuJ6Nwpluf645_h9KUPqGVbp-jyda1Mof2IpQqQ97C8x4H50VrA3eiX3S84enuX2j-Wipys4E6_DTKOoxQDUsaBv9FllLK0nPCexhVPx0kZLJtEkbfFquOunbpRxeO60eK2lDcTky4E8t7Lo9MNJ64FiRF5ElJs5iSqSivJ0szaFqd-axMPo80teDu-gttqvxdIQuH3dZMpjpIUJlOgRUNoY94h13iUG_po7BpdXd3GyfNskAGfbKRGtoGg-47Jrl9AdTxhmdZuIlVKTW7ITjhE5WSbd0.f5gVhr7nrnrpUNjUmNA0vTiPqMsWk99RBIBXTvmdXjw&dib_tag=se&gclid=Cj0KCQjwlN6wBhCcARIsAKZvD5jIWQucm_4Dr3-BupDg0n03BoYlzOlJo_G3a0g6Jqlg5QyI6xpF4xgaAkmrEALw_wcB&hvadid=679054386887&hvdev=c&hvlocphy=1009280&hvnetw=g&hvqmt=b&hvrand=3282379494590399731&hvtargid=kwd-333761757011&hydadcr=16036_13711623&jp-ad-ap=0&keywords=%E6%9C%80%E9%AB%98%E3%81%AE%E5%8B%89%E5%BC%B7%E6%B3%95&qid=1712902172&sr=8-1)
教科書に線を引いたり、音読したりする勉強法はあまり効果がなく、想起学習の有用性について解説しています。要するに、教科書とかをみずに、勉強したことを思い出すことが大事という話です。
この本を参考に、通勤時間などのスキマ時間に、「OSI基本参照モデル」や「SRAMとDRAM」の違いなどを思い出していました。


## 受験当日の雰囲気
最寄りのテストセンターに行き、PCを使って（CBT方式）受験しました。すべての会場でそうなのかは分かりませんが、試験開始20分前に受付を済ませると、すぐに受験することが出来ました（開始時刻まで待つ必要がなかった）
各々が個人のタイミングで受験できるようです（便利）
メモ用紙とボールペンを頂き、計算などはそれを使いました（私としては、シャープペンシルと消しゴムが欲しいところでした）あと、あまり時間は余りませんでした。試験終了まで、見直しに時間を使いました。


## 勉強してよかったこと
最近、業務がマンネリ化していたこもあり、今回試験を受けたのは良いモチベーションになりました。これまでなんとなく理解していた、公開鍵・秘密鍵認証の仕組みやメモリのことなど、これからの業務に役立つこともたくさんありました。

応用情報も機会があれば、今年の秋に受験しようと思います。
Shortread RNA-Seqのためのリファレンスゲノムの取得方法

## 本記事では、Shortread RNA-Seq解析に使用するリファレンスゲノムの取得方法について説明します。

:::note info
利用OS：Linux
:::

Linux OS で lftp コマンドを使ってリファレンスゲノムをダウンロードする方法を説明します。lftp は Linux 環境で動作する非常に強力なファイル転送プログラムです。これを使って FTP サーバーからデータを直接ダウンロードすることができます。

まず、lftp がシステムにインストールされていない場合は、以下のコマンドでインストールできます

```
sudo apt-get install lftp  # Debian/Ubuntu 系
sudo yum install lftp      # RedHat/CentOS 系
```

### リファレンスゲノムのダウンロード
lftp を使って、例えば Ensembl の FTP サイトからヒトのリファレンスゲノム (GRCh38) をダウンロードする方法は以下の通りです。

##### FTP サーバーに接続します
```
lftp ftp.ensembl.org/pub/
```

##### 適切なディレクトリに移動します
```
cd release-111/fasta/homo_sapiens/dna
```
:::note warn
このパスは、NCBI のデータベース構造や目的のゲノムによって異なる場合があるため、事前に FTP サイトをブラウザで確認することが重要です。
:::

##### ファイルリストを表示し、ダウンロードしたいファイルを選択します
```
ls
```
##### ファイルをダウンロードします
```
get Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz
```
:::note warn
ここでは例として、ヒトのリファレンス配列である.fastaを取得します
:::

##### FTP セッションを終了します:
```
quit
```

#### このプロセスを通じて、必要なリファレンスゲノムデータを効率的にダウンロードできます。lftp はマルチスレッドダウンロードや再開機能もサポートしているため、大きなファイルのダウンロードに非常に便利です。
WordPressプラグインの翻訳を自分で編集・追加する

# Wordpressプラグインの翻訳を自分で編集・追加する
会員制サイトを作成する際、使用したプラグインの一部に翻訳未対応の箇所や、翻訳を調整したい箇所があったため調査しました。

管理側がガバガバ翻訳なのはGoogle翻訳とかで対応しちゃうけど、ユーザー側の見た目は操作が不安にならないよう確実に設定しておきたいな～と思ってます。
## 1.該当プラグインの翻訳ファイルを取得する
hoge/wp-content/languages/plugins/
内にある、該当プラグインの.poファイルと.moファイルをダウンロードし、バックアップを作成してください。
### po／mo／potファイルとは？
- #### poファイル
　英語などで書かれたpotファイルをもとに各言語を翻訳したファイル。
 　今回は日本語なので、「hogehoge-ja.po」という名前だった。ものによってルールが違うらしいので要確認。
- #### moファイル
　poファイルをコンパイルしたファイル。後述するエディタで作成する。
- #### potファイル
　翻訳可能な文字列をリスト化したファイル。今回は使いませんでした。

 ## 2.翻訳エディタ「Poedit」をダウンロードする
[poedit](https://poedit.net/download)をダウンロードします。
WindowsとMax、Linuxがあるのでお好きなものを選択してください。
今回はWindow版をご説明していきます。exeファイルとしてダウンロードされるので、手順に沿ってセットアップしてください。
セットアップが完了すると、下画像のような初期画面が表示されます。

![poedit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510830/9cd3618a-6ad8-b684-1c91-797ff01ddb33.png)

（WordPressのテーマ・プラグインを翻訳っていうよさげなメニューがあるんですが、有料なんですよね…）
メニュー内「ファイルを閲覧」をクリックし、１の手順でダウンロードした.poファイルを選択してください。

 ## 3.翻訳エディタ「Poedit」で翻訳を編集する
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510830/4d27f85d-4afc-1963-8a58-8b5cba75008b.png)
画面左にソーステキスト、画面右に翻訳が表示されます。
画像のように単語と単語が対になっているものや、文章をまとめて翻訳しているもの、変数？が入っているものなどがあります。

検索（Windows：Ctrl + F／Mac：⌘(command) + F）で翻訳を調整したい箇所を見つけ出したら、画面下の「対訳」で編集が可能です。
調整が済んだら画面上「保存」をクリックすると、編集した.poファイルが保存され、コンパイルした.moファイルが自動で作成されます。

後は保存した.poファイルと.moファイルをhoge/wp-content/languages/plugins/に上書けば、翻訳の調整が完了します。

## 4.翻訳エディタ「Poedit」に翻訳を追加する
翻訳未対応の箇所を翻訳したい場合、「Poedit」だと翻訳を追加することができません。そのため、メモ帳やコードエディタなどで行を追加し、翻訳を編集する必要があります。
今回は、Visual Studio Codeを使用します。
まず、コードエディタで.poファイルを開いてください。

    msgid “Profile”
    msgstr “プロフィール”

上記のようなコードが表示されます。
msgridが翻訳する文字列、msgstrが翻訳後の文字列（対訳）です。頭に＃を付けると、コメントアウトされます。
こちらを追加していくことで、翻訳未対応の箇所の翻訳が可能です。
### 翻訳未対応の箇所に、数字や変化する文字列が入っている場合
例えば「〇〇は最低〇文字以上にする必要があります。」や「入力された〇〇は既に使用されています」など、〇〇の中に入る文字が状況により変化する場合、上記の方法で.poファイルを編集しても、翻訳が反映されることはありません。翻訳を反映させるためには、プラグインテーマ内のコード（ソーステキスト）とmsgridを同じにする必要があります。
もしあなたが、「"Your number must contain at least 4 characters"」を翻訳したい場合（かなり使う場面が限られてきましたが…）このソーステキストの、おそらく変数でない「must contain at least」あたりを該当のプラグインファイル内で検索をかけて、もとのソーステキストを発見しましょう。
発見したら、変数ごとmsgridにソーステキストを張り付け、同じようにmsgstrを編集します。

    #: ここにどのファイルのどこに記載してあるのかパスを書くのが一般的みたいです
    msgid "Your %1$s must contain at least %2$s characters"
    msgstr "%1$sは最低%2$s文字が含まれている必要があります"

上記のように、変数はmsgstrにもそのまま記載してください。

行の追加調整が完了したら、３の手順と同様に「Poedit」で.poファイルを開きます。調整が済んだら、画面上「保存」をクリックすると、編集した.poファイルが保存され、コンパイルした.moファイルが自動で作成されます。

保存した.poファイルと.moファイルをhoge/wp-content/languages/plugins/に上書けば、翻訳の追加が完了します。

## 5.まとめと、気になること
ワードプレスでのサイト制作にあたり、プラグインの使用は不可欠だと考えています。
せっかくいいプラグインなのに英語が気になる…なんてもったいないことのないように調整していきたいですね～。

プラグインアップデートの際に、作成した.po.moファイルがどうなるのか気になります。
子テーマがないから翻訳のアップデート入ったら消えちゃうんじゃないかな…？
ちゃんと作業のバックアップは取っておきましょう！
pandas2.2: dtypeが`string`の`Series`に対して`map()`を実行すると、dtypeが`object`に変わる

# 環境
* Python 3.12.1
* panda 2.2.2

# はじめに
[pandas.Sereis.map](https://pandas.pydata.org/docs/reference/api/pandas.Series.map.html)を使ったら、`pandas.NA`が`numpy.nan`に変換されるときがありました。
実際に試して、どう変換されるかを確認しました。



# 結果
## `pd.NA`を含む場合

### dtypeが`Int64`

```
In [51]: s2 = pd.Series([1, pd.NA],dtype="Int64")

In [52]: s2
Out[52]:
0       1
1    <NA>
dtype: Int64

In [53]: s2.map(lambda e: e)
Out[53]:
0    1.0
1    NaN
dtype: float64
```

`pd.NA`が`np.nan`に変わりました。またdtypeが`Int64`から`float64`に変わりました。`int64`でなく`float64`に変わったのは、`np.nan`の型がfloatだからでしょう。


### dtypeが`string`

```
In [54]: s3 = pd.Series(["a",pd.NA],dtype="string")

In [55]: s3
Out[55]:
0       a
1    <NA>
dtype: string

In [56]: s3.map(lambda e: e)
Out[56]:
0       a
1    <NA>
dtype: object
```

`pd.NA`はそのままの値でした。しかし、`dtype`が`string`から`object`に変わりました。


## `pd.NA`を含まない場合

### dtypeが`Int64`

```
In [60]: s4 = pd.Series([1,2],dtype="Int64")

In [62]: s4
Out[62]:
0    1
1    2
dtype: Int64

In [61]: s4.map(lambda e: e)
Out[61]:
0    1
1    2
dtype: int64
```

dtypeが`Int64`から`int64`に変わりました。

### dtypeが`string`

```
In [64]: s5 = pd.Series(["a","b"],dtype="string")

In [65]: s5
Out[65]:
0    a
1    b
dtype: string

In [66]: s5.map(lambda e: e)
Out[66]:
0    a
1    b
dtype: object
```

dtypeが`string`から`object`に変わりました。


# 分かったこと
`Series.map`に挙動について分かったことです。
* pandas独自のdtypeがnumpy用のdtypeに変換されます。たとえば`Int64`が`int64`に、`string`が`object`に変換されます。
* dtypeが`float64`や`int64`の列は`pd.NA`を含められないので、`pd.NA`は`np.nan`に変換されます。ただし`np.nan`はfloat型なので、`pd.NA`を含むdtypeが`Int64`の列は`float64`に変換されます。
* dtypeが`object`の列は`pd.NA`を含むことができるので、dtypeが`string`の列に含まれる`pd.NA`は`np.nan`に変換されません。


# 補足
pandas 2.1とpandas2.2で挙動が異なるようです。今後のpandasバージョンアップで、挙動が変わるかもしれません。

https://github.com/pandas-dev/pandas/issues/57390

https://github.com/pandas-dev/pandas/issues/56606#issuecomment-1871319732
平方分割のバケット

https://paiza.jp/works/mondai/query_primer/query_primer__square_division_bucket

ちょっとよくわからなかったので、色々調べながら。

（下記は引用）
max 関数は引数に list オブジェクトを渡すと、list オブジェクトに含まれる要素の最大値を返します。この際、計算量は O(N) です。

```py
import math
A = [int(input()) for _ in range(10000)]
rootA =  int(math.sqrt(10000))
ans = [-1] * rootA

for i in range(rootA):
    start, end = 100 * i, 100 * (i + 1)
    ans[i] = max(A[start:end])

for val in ans:
    print(val)
```
たとえば、
１００＊１００の平方根ごとに分け、調べるグループを１００個ずつにして
そのなかでやりたい処理（たとえばこの問題なら１００個の中から最大値を選ぶ）
をやってそれを配列にいれる、というのを繰り返す。
こうすると、たとえば＊１００なので、
ループの1回目は0番目〜99番目、
ループの２回目は100番目〜199番目
ループの３回目だと200番目〜299番目
。。。と増えていく
だからそれぞれのグループの中で最大値がわかる。というわけ

なんで最初配列を入れるときに０ではなく−1かというと、フラグとして使われているから。
0だと予期しない挙動を返してしまうこともあり、−1としている。
↑ここらへんがよくわからなかったけど、−1じゃないといけないらしい。
Visual Studio Codeを使ってFirebaseのログイン（React）

あああああああああああああやっとできた。
firebaseを使ったログイン機能を作るためにVSCODEを使っていたのですが、何日かかっただろう。。



## 参考にしたもの
https://qiita.com/hndfavodaismi/items/6b9e17f9c0759c696081
https://qiita.com/sakamotodd/items/fa3f4a6a02659dca7540
https://qiita.com/gdate/items/9796bd4932bed1eba7a1
https://qiita.com/ebichan_88/items/e3e30461ad4ddd9368f5
https://zenn.dev/nori_maki/articles/f503a204c83e89
https://zenn.dev/kugyu10/articles/d297123ba0eae3
https://mebee.info/2020/02/21/post-5185/
ChatGPT

# 使ったもの
Mac OS
Visual Studio Code
firebase
React

# やりたかったこと
-`npm install firebase`を成功させること
-`firebase login`を成功させること

# 手こずったところ
-`npm install firebase` 

# たどり着いた方法
1\. 何も入っていないフォルダを準備
2\. VScodeで開く
3\.Terminalを開いて（以下Terminalのコマンドです）、`npx create-react-app react-firebase-auth`でReactの環境を作る
    時間がかかるためお茶でも飲んで一息つきましょう。
4\. （指示通り）`cd react-firebase-auth`
5\. （指示通り）`npm start`
6\. ブラウザ上でReactが動きます！！
7\. `npm install firebase`
8\. `brew install firebase-cli`
9\. `firebase login`



## 1\. `npm install firebase`の成功
前述の通り`npm install firebase` ↓
```terminal
`xxx（数字） packages are looking for funding
  run `npm fund` for details

xxx（数字）  vulnerabilities (xx（数字）  moderate, xxx（数字）  high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
```

の無限ループのため永遠に辿り着けないかと思われたfirebaseのインストール...


脆弱性があることを指摘されて指示通り`npm audit fix`や`npm audit fix --force`にトライするも同じように脆弱性を指摘される...


<解消法>
脆弱性の指摘に対して何度か`npm audit fix --force`を叩く。繰り返していると終わりが見えないので一旦無視させていただきました。改良できる方法があれば追記します。

-----
## 2\. `firebase login`の成功
```terminal
firebase login
zsh: command not found: firebase
```
firebaseコマンドがないことを指摘される
 <解消法>
 ChatGPT曰く
>firebaseコマンドが見つからないというエラーが出たのは、おそらくFirebase CLIが正しくインストールされていないためです。Firebase CLIをインストールしていない場合、firebaseコマンドは使用できません。

>Firebase CLIをインストールするには、npmでグローバルにインストールする必要があります。以下のコマンドを実行して、Firebase CLIをインストールしてみてください：

```
npm install -g firebase-tools
```

とのことなので`npm install -g firebase-tools`をTerminalにうつ

なんだかうまくいかない、、
のでFirebase CLIをHomebrewを使ってインストール

`brew install firebase-cli`
↓
`firebase login`

<結果>
ブラウザ上に
![004CD041-54F3-485C-AFF9-154E85ED417A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676847/ae63a293-3a0e-2403-2583-15ae7c5f12ec.png)
が出ました！


##　結論
Firebase CLIを入れることで`firebase`コマンドが使えるように！

<!--
### 学んだこと
１、　`cd 〇〇`を使いまくる
プロジェクトの一番大きなフォルダ（すべてのファイルたちを入れている）にいたままコマンドを打っていたので全く進んでいなかった、、
firebaseに関するコマンドの際は

２、　エラーをきちんと読む＆chatGPTにかける
エラーが出た〜〜となるのではなく
-->
正規表現備忘録  選択'|'

#  選択　'|' の書き方
'|'を使った選択の書き方や混乱しやすい文字の範囲[.....]との違いを整理します。

## 範囲の指定[....]
文字の範囲表現の例を示します
```javascript
/[a-jvx#$%]/; //aからjまでとv,x,#,$,%のいずれか１文字
/[0-9a-zA-Z\s]/; //大文字、小文字、数字とスペースのいずれか１文字 
/[\s\S]/; //改行文字を含むいずれかの１文字とマッチする
/[^!-~ ];//ASCIIコードと半角スペース以外のいずれか１文字(日本語もマッチする)
```
細かい範囲の指定は[ASCIIコード表](https://www.k-cube.co.jp/wakaba/server/ascii_code.html)を参考にする。

## サブパターンを使う
red,green,blueいずれかの後に任意の数値が続く箇所をマッチさせたい。

```javascript
>s = "ssddred3333sss"　//ここではred3333をマッチさせたい
```
### サブパターンは[...]に使えない
これは不可
```javascript
>s.match([(?:red)(?:greeen)(?:blue)]\d+);　
// 文字()?:redgnbluのいずれか１文字にマッチするだけ 
```
### 正確なサブパターンの使用
```javascript
>s.match(/red|green|blue\d+/) //不可　red,green,blue数字としかマッチしない。 
>s.match(/red|green|(?:blue)\d+/) //不可　
//前の結果と同じ（括弧で括っても選択の終了にはならない）
// 正しくマッチさせるには 
>s.match(/(?:red|green|blue)\d+/ //可 red333にマッチする
```

## 選択の優先順位
文s内の全てのrubyタグで囲まれた全体と、htmlタグ、タグ終端にマッチさせる。
```javascript
>s = 'dedede<ruby>frfrfr<rt>gtgtgt</rt></ruby>swswswdedede<h1　class ="xx">frfrfr</h1>gtgtgt<img src="dededef">rfrfrhyhyhy';
>reg = /(?:<ruby>.*?<rt>.*?<\/rt><\/ruby>|<.+?>)/g;
>s.match(reg);
//ruby>frfrfr<rt>gtgtgt</rt></ruby>,<h1　class ="xx">,</h1>,<img src=dededef>にマッチする
//マッチは<ruby>,<rt>,</rt>,</ruby>,<h1　class ="xx">,</h1>,<img src=dededef>にはならない
```
**'|'の左側ほど優先順位が高い。**　この場合’`<ruby>...</ruby>`の部分は選択の１番目と２番目のどちらにもマッチするが選択左側の`<ruby>..</ruby>`にマッチする。
'|'右側のタグ(<.+?>)にマッチすることを避けるために、次のように先読み言明を利用する必要は無い。
```
reg = /(?:<ruby>.*?<rt>.*?<\/rt><\/ruby>|<(?!\/?ruby|\/?rt).+?>)/g;//要らない
```
Ubuntuの特定バージョンでgitlab.comにssh接続できない時にすること

# 現象

私の PC (Ubuntu) で何故か GitLab だけ SSH (`ssh -T git@gitlab.com`) が、

```
Connection to gitlab.com closed by remote host.
```

で接続に失敗する現象が起きていました。

実のところ、以前からこの問題が発生し続けていて気になっていたのですが、主に GitHub を使っていて GitLab を使うことはほぼ無いため暫く問題を放置していました。しかし、仕事で GitLab を使わざるを得なくなったので、重い腰を上げて調査してみました。

まずは、GitLab の SSH キー登録が expired していないかといった初歩的な確認をしたのですが特に問題なく、念の為 SSH キーを作り直して再登録してみたのですが、それでも GitHub への接続は成功しますが、GitLab だけが何故か失敗する状態でした。

:::note info
GitLab は SSH キー登録時にデフォルトで有効期限が設定しているので、何も考えずにキー登録すると expire してしまいがちです。
:::

どうやらキーの問題ではなさそうなので、クライアント側の通信設定の問題だろうと考えて色々と調べてみました。

なお、Ubuntu のバージョン（`uname -v`）は次の通りです。

```
#25~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Feb 20 16:09:15 UTC 2
```

# 対策方法

ググって調べた ssh git がタイムアウトする問題の対策方法を片っ端から試してみた結果、`~/.ssh/config` で gitlab.com の SSH 接続設定に `IPQoS 0` を追加することで正常に接続できるようになりました。

```~/.ssh/config
Host github
    HostName github.com
    IdentityFile ~/.ssh/id_rsa
    User git
    IdentitiesOnly yes
Host gitlab.com
    HostName gitlab.com
    IdentityFile ~/.ssh/id_rsa
    User git
    IdentitiesOnly yes
    IPQoS 0
```

# 原因

以下の記事を参考にしました。

https://7ka.org/cant-connect-ssh-macos/

https://serverfault.com/questions/692026/cant-complete-ssh-connection-after-successfully-exchanging-keys-to-ubuntu-from#
[Next.js]ディレクトリ構成のベストプラクティスを考える

# はじめに
この記事は、個人的にこうしたらよいのではないかという意見をまとめたものです。
ご指摘などあればコメントで教えていただけると嬉しいです。:pray:

# 前提
こちらの記事は**App Routerを使用しているプロジェクトのディレクトリ構成**について書いています。

# コンポーネントをどのように管理するか
結論、**様々なページで使用するコンポーネントはappディレクトリ配下に置いて、あるページのみでしか使用しないコンポーネントはappディレクトリの外に置く**ということが大切であると考えます。

## appディレクトリ管理するコンポーネントの例
・buttonコンポーネント
・inputコンポーネント
・layoutを指定しているコンポーネント　など
※components配下に「elements」フォルダや、「layout」フォルダを作成し、コンポーネントをまとめていくと管理しやすくなります。

## appディレクトリの外で管理するコンポーネントの例
appディレクトリ配下で管理しないコンポーネントは、**「features」という名前のディレクトリで機能ごとにコンポーネントを管理します。**

例えば、ブログの一覧ページで使用するコンポーネントを作成するとして、そのコンポーネントは、他の機能では使用しない、ブログページ固有のコンポーネントであるので、featuresディレクトリ配下に「Blog」ディレクトリを作成し、その中にまとめるなどすれば、管理しやすくなるのでは無いかと思います。
つまり、featuresディレクトリは、機能ごとに使用するコンポーネントを管理するディレクトリと言えるでしょう。

https://zenn.dev/hokuto_tech/articles/fdabaff60f5af2#app-router%E3%81%A7features%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F


# テストファイルの置き場所
テストファイルは、同じ階層に置くとよいかと思います。
テストファイルはテストフォルダに全てまとめるというのも良いかと思いますが、コンポーネントが増えてくると、ファイルを見つけにくくなってしまうので、同階層にまとめたほうが良いと思っています。Storybookを使用するのであれば、そのファイルも一緒に置いておくと良いかと思います。
以下の記事が参考になります。


# まとめ
今回は、Next.jsのディレクトリ構造のベストプラクティスについて考えました。
最初にも書きましたが、自分個人としての意見なので、ご意見やご指摘など書いていただけると幸いです。


# 最後に
他にも色々な記事を書いているので、よければ読んでいってください、、、

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
Sassの使い方

## 問題
Sassのネストと&の使い方がいまいちわからない

## 方法
https://wynn-blog.com/how-to-sass-ampersand-nest#index_id0


https://kredo.jp/media/css-symbol-meaning/#:~:text=%E3%80%8C%26%E3%80%8D%E3%82%82CSS%E3%81%A7%E3%81%AF%E7%89%B9%E6%AE%8A,%E3%81%99%E3%82%8B%E6%84%8F%E5%91%B3%E3%82%92%E6%8C%81%E3%81%A1%E3%81%BE%E3%81%99%E3%80%82
C#をコンソールで実行するため最短コマンド


# 最短コマンド
```powershell
dotnet new console -o MyApp
# cd MyApp
# dotnet add package Newtonsoft.Json
# nvim MyApp/Program.cs
dotnet run
```
# 説明
1. コマンドプロンプト,Powershellまたはターミナルを開き、次のコマンドを実行します：
```bash
dotnet new console -o MyApp
cd MyApp
```
2. 次に、ライブラリを追加します。(任意)

```bash
dotnet add package Newtonsoft.Json
```

3. `Program.cs` ファイルを編集します：(任意)
```bash
nvim MyApp/Program.cs
```

```csharp
using System;
using System.IO;
using Newtonsoft.Json;

namespace MyApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string filePath = "test.txt";

            // ファイルを開く
            using (StreamReader file = File.OpenText(filePath))
            {
                string content = file.ReadToEnd(); // ファイルの内容を読み取る
                Console.WriteLine(content); // ファイルの内容をコンソールに出力する
            } // ファイルを閉じる
        }
    }
}
```

4. 最後に、アプリケーションをビルドして実行します：

```bash
dotnet run
```
久しぶりにShopifyのテーマカスタマイズ環境を作った件

久しぶりにShopifyのテーマをカスタマイズできる環境をWindows11で作りました。

こちらの手順で、進めました。
https://shopify.dev/docs/themes/tools/theme-kit/getting-started#windows

npmのバージョンアップが必要でした。
```Powershell
npm install -g npm@10.5.2
```
次に、テーマキットをインストールしようとしたら、Chocolateyが無いとエラーが出ました。

```Powershell
choco install themekit
choco: The term 'choco' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
```

またRubyがインストールされていないという内容のerrorも出ましたので、こちらからインストールしました。
https://rubyinstaller.org/downloads/



管理者権限で、Powershellを起動して、下記の順番でインストールしました。


## 実行ポリシーを変更する
Chocolateyをインストールする前に、実行ポリシーを一時的にBypassに設定する必要があります。以下のコマンドをPowerShellに入力して実行します。
```Powershell
Set-ExecutionPolicy Bypass -Scope Process -Force

```
## Chocolateyをインストールする
```Powershell
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

```
## インストールの確認
インストールが成功したかどうかを確認するために、以下のコマンドを実行してChocolateyのバージョンを確認します。
```Powershell
choco --version
```



## Shopifyにログインしてテーマをダウンロード
```Powershell
shopify theme pull --store {store-name}
```

## こちらのコードで、変更をプレビューできます。
```Powershell
shopify theme dev
```

私は、前回Shopify CLIを使っていたこ後から思い出しました。
そのためChocolateyをインストールしていなかったのかもしれません。

https://shopify.dev/docs/themes/getting-started/customize

```Powershell
npm install -g @shopify/cli @shopify/theme
```