OmniAICreator/Qiita-1.07M huggingface dataset:
Create a Custom  Component  in Salesforce that allows users to input data for an Account and its related Contact records.



initial screen

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ce2e66b2-3686-ad1e-2571-a08a1e4e53f4.png)

add button

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b85a96c8-43a8-6d92-67de-2e73811c4f8c.png)


add button

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a4c4d70f-7c80-e255-40b2-2b1ef8267fce.png)
cscの作法 その502

# 概要
cscの作法、調べてみた。
wpf見つけたので、msbuildでコンパイルしてみた。

# 参考にしたページ

https://qiita.com/Stosstruppe/items/2a23ec0efc32606fdfb6

# 環境
windows11

# 手順
- ビルドを書く。
Wpf3d2.csproj
```

<Project DefaultTargets='Build' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
	<PropertyGroup>
		<Configuration>Debug</Configuration>
		<Platform>AnyCPU</Platform>
		<RootNamespace>Test</RootNamespace>
		<AssemblyName>Wpf3d2</AssemblyName>
		<OutputPath>.\bin\Debug\</OutputPath>
	</PropertyGroup>
	<ItemGroup>
		<Reference Include='System' />
		<Reference Include='WindowsBase' />
		<Reference Include='PresentationCore' />
		<Reference Include='PresentationFramework' />
		<Reference Include="System.Xaml">
			<RequiredTargetFramework>4.0</RequiredTargetFramework>
		</Reference>
	</ItemGroup>
	<ItemGroup>
		<Compile Include='Wpf3d2.cs' />
	</ItemGroup>
	<Import Project='$(MSBuildBinPath)\Microsoft.CSharp.targets' />
	<Import Project='$(MSBuildBinPath)\Microsoft.WinFX.targets' />
</Project>


```
- ソースを書く。
Wpf3d2.cs
```
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Media3D;

class MainWnd: Window {
	public MainWnd() {
		var stacks = 12;
		var slices = 16;
		var pos = new Point3DCollection();
		var idx = new Int32Collection();
		for (var st = 0; st <= stacks; st++) 
		{
			var a = Math.PI * st / stacks;
			var y = Math.Cos(a);
			var r = Math.Sin(a);
			for (var sl = 0; sl <= slices; sl++) 
			{
				var b = 2 * Math.PI * sl / slices + Math.PI;
				var z = Math.Cos(b);
				var x = Math.Sin(b);
				pos.Add(new Point3D(x * r, y, z * r));
			}
		}
		for (var st = 0; st < stacks; st++) 
		{
			var h0 = (slices + 1) * st;
			var h1 = (slices + 1) * (st + 1);
			for (var sl = 0; sl < slices; sl++) 
			{
				var i0 = h0 + sl;
				var i1 = h1 + sl;
				var i2 = h0 + sl + 1;
				var i3 = h1 + sl + 1;
				idx.Add(i0);
				idx.Add(i1);
				idx.Add(i2);
				idx.Add(i3);
				idx.Add(i2);
				idx.Add(i1);
			}
		}
		var model = new GeometryModel3D();
		model.Geometry = new MeshGeometry3D() {
			Positions = pos,
			TriangleIndices = idx,
		};
		model.Material = new DiffuseMaterial(Brushes.LightGreen);
		var light = new DirectionalLight();
		light.Direction = new Vector3D(-1, -2, -3);
		var cam = new OrthographicCamera();
		cam.Position = new Point3D(0, 0, 5);
		var vp3d = new Viewport3D();
		vp3d.Camera = cam;
		vp3d.Children.Add(new ModelVisual3D() { 
			Content = model 
		});
		vp3d.Children.Add(new ModelVisual3D() { 
			Content = light 
		});
		Width = 300;
		Height = 300;
		Content = vp3d;
	}
}
class Program {
	[STAThread]
	static void Main() {
		var wnd = new MainWnd();
		wnd.ShowDialog();
	}
}





```
- コンパイルする。

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>MSBuild Wpf3d2.csproj

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7ac6486b-0390-dac2-bcf2-aa3cdf2c8fa3.png)


以上。
【git-flow】Amazon Linux 2023 の環境で git-flow をインストールする方法【git://を使わない方法】

# はじめに

AmazonLinux2023で `git-flow` を使うぞ。。。あれ、`yum install`でいれられない。。。
なら、ダウンロードして。。。

```
Submodule 'shFlags' (git://github.com/nvie/shFlags.git) registered for path 'shFlags'
Cloning into '/usr/local/src/gitflow/shFlags'...
```

なんか、いつまでもおわらないぞ。。。
なら `.gitmodule` を変更して。。。

```
Cloning into '/usr/local/src/gitflow/shFlags'...
fatal: unable to connect to github.com:
github.com[0: 20.27.177.113]: errno=Connection timed out
```

なんかエラーになるぞ。。。

```
fatal: clone of 'git://github.com/nvie/shFlags.git' into submodule path '/usr/local/src/gitflow/shFlags' failed
Failed to clone 'shFlags'. Retry scheduled
Cloning into '/usr/local/src/gitflow/shFlags'...
```

なんかエラーになるぞ。。。

という方向け。

:::note info
GitプロトコルがSecurityGroupなどで通っていないことが原因のことが多いです。
この手順を実行する前に、どのポートが利用できるのか、環境を確認することをおすすめします。
:::

# やり方

`git://` で始まるURLをすべて `https://` で始まるURLに置き換えます。

```
sudo yum update
sudo yum install make git

sudo su -

cd /usr/local/src
git clone https://github.com/nvie/gitflow.git
cd gitflow
git config --global url."https://".insteadOf git://
git submodule init
git submodule update
make install
```

# 原因

`git://` プロトコルとおらないから。

# 解決方法

`git://` プロトコルでインターネットにアクセスできるようにする。

 or
 
`git://` で始まるURLをすべて `https://` で始まるURLに置き換える。

# 最後に

かんたんでしたね
シェルスクリプト忘備録-CSVファイルのデータを処理する-

シェルスクリプトでCSVファイルを読み込み、データを整形する機会があったため忘備録として記録に残そうと思います。

# 想定データ
カンマ区切りのデータを想定します。
```
1234,test1
5678,test2
9101,test3
```

# スクリプトファイル
CSVファイルを一行ずつ読み込み、カンマ区切りでデータを分けて配列にしたのが以下のスクリプトです。
一致したデータを出力用のCSVファイルに追記する（>>）仕様になっています。
```
#!/bin/bash

# 読み込むファイル
FILE=test.csv

while read line || [ -n "${line}" ];
do

    # tests[@]:全てのリスト表示
    # tests[0]:1列目のデータ
    # tests[1]:2列目のデータ
    tests=(${line//,/ })

    if [ "${tests[0]}" = "1234" ]; then
        echo -e ${line} >> result1.csv
    elif [ "${tests[0]}" = "5678" ]; then
        echo -e ${line} >> result2.csv
    elif [ "${tests[0]}" = "9101" ]; then
        echo -e ${line} >> result3.csv
    else
        echo "一致しないエラー"
    fi

done < ${FILE}
```

# シェルスクリプトでSplitできる？
結論から言うと、他言語でいう区切り文字指定での分割処理はなさそうでした。
実現手段としてはいくつかあるようですが、今回は区切り文字を半角スペースに置換し、配列のデータとして取り込むことで分割を実現しています。
```
${line（対象文字列）//,（置換前文字列、カンマ）/ （置換後文字列、半角スペース）}
```

カンマ区切りを半角スペース区切りに変換
```
1234,test1 -> 1234 test1
```
その後、`()`で囲み、配列に格納する。
```
1234 test1 -> (1234, test1)
```
上記をまとめると以下の形になります。
`tests=(${line//,/ })`

これでカンマ区切りの文字列を配列として操作できるようになります。

# 参考資料

https://qiita.com/smicle/items/e0c12be804380f284835

# 告知

最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
シェルスクリプト忘備録-ファイルからデータを読み込む-

シェルスクリプトでCSVファイルを読み込み、データを整形する機会があったため忘備録として記録に残そうと思います。

# 想定データ
カンマ区切りのデータを想定します。
```
1234,test1
5678,test2
9101,test3
```

# スクリプトファイル
CSVファイルのデータを一行ずつ読み込み、必要な処理を書いていきます。
```
#!/bin/bash

# 読み込むファイル
FILE=test.csv

while read line || [ -n "${line}" ];
do

    # lineに対して必要な処理を書く
    
done < ${FILE}
```

# 注意点１
最初は以下のように書いていましたが、ある時CSVファイルの最終行が読み込まれていないことに気づきました。
これは最終行に改行文字が付いていないと読み込まれないことが原因のようで、次の行が空行じゃない場合は読み込むように条件を追加しました。

```
# 条件なし
while read line;
do

done
```
```
# 条件あり
while read line || [ -n "${line}" ];
do

done
```

# 注意点２
データを読み込んで処理をしている中で、どうしてかうまくいかない時がありました。
そういう時は一度 `vim -b <file name>` でデータを開いてみましょう。
想定外のデータ(今回の場合はBOMを想定)が入っている可能性があります。
下記の場合は`<feff>`を削除して保存します。

```
<feff>1234,test1^M
5678,test2^M
9101,test3^M
```

# 注意点３
注意点２と似た内容ですが、`^M`の削除の仕方を書きます。
`vim -b <file name>`で開きます。
そして、vimで`:%s/^M//g`というコマンドを実行します。
この時、 `^M`は[Ctrl+V],[Ctrl+M]を順番に押下することで入力できます。
上記コマンドを実行することで、全置換で一度に`^M`を削除することができます。
```
1234,test1^M
5678,test2^M
9101,test3^M
```

# 参考資料
https://qiita.com/Ets/items/a7fa24b138b8ee883dac

https://qiita.com/ltg_lambda/items/07f39395025d8ee87c17

https://qiita.com/pugiemonn/items/4f67379f70290c5c86a1

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
cscの作法 その501

# 概要
cscの作法、調べてみた。
wpf見つけたので、msbuildでコンパイルしてみた。

# 参考にしたページ

https://qiita.com/Stosstruppe/items/52d8e9cf4db8457d8025

# 環境
windows11

# 手順

- ビルドを書く。
WpfApp.csproj
```

<Project DefaultTargets='Build' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
	<PropertyGroup>
		<Configuration>Debug</Configuration>
		<Platform>AnyCPU</Platform>
		<RootNamespace>Test</RootNamespace>
		<AssemblyName>WpfApp</AssemblyName>
		<OutputPath>.\bin\Debug\</OutputPath>
	</PropertyGroup>
	<ItemGroup>
		<Reference Include='System' />
		<Reference Include='WindowsBase' />
		<Reference Include='PresentationCore' />
		<Reference Include='PresentationFramework' />
		<Reference Include="System.Xaml">
			<RequiredTargetFramework>4.0</RequiredTargetFramework>
		</Reference>
	</ItemGroup>
	<ItemGroup>
		<Compile Include='WpfApp.cs' />
	</ItemGroup>
	<Import Project='$(MSBuildBinPath)\Microsoft.CSharp.targets' />
	<Import Project='$(MSBuildBinPath)\Microsoft.WinFX.targets' />
</Project>


```
- ソースを書く。
WpfApp.cs
```


using System;
using System.IO;
using System.Windows;

namespace Test {
	public class MyWindow: Window {
		public MyWindow() {
		}
		void btn_Click(object sender, RoutedEventArgs e) {
			MessageBox.Show("hello, world");
		}
	}
	class App: Application {
		[STAThread]
		static void Main() {
			try 
			{
				var app = new App();
				var path = Path.GetFullPath("MyWindow.xaml");
				app.StartupUri = new Uri(path);
				app.Run();
			} 
			catch(Exception e) 
			{
				Console.WriteLine(e);
			}
		}
	}
}


```
- 実行ファイルを書く。
MyWindow.xaml
```

<ex:MyWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:ex="clr-namespace:Test;assembly=WpfApp" Title="WpfApp" Width="640" Height="400">
	<Button Content="hoge" Click="btn_Click" />
</ex:MyWindow>


```
- コンパイルする。
```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>MSBuild WpfApp.csproj
```

# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9a856d96-4e93-e987-6c78-e7ffb380b4a5.png)


以上。
Kotlinのファイル比較関数

# 問題点
ファイル比較方法が多く、適切な関数の調査に時間がかかる
~~（また、古いバージョンの関数を使用した記事が上位にヒットすることも問題である）~~

# 解決策

本記事では、以下の場合に使用するファイル比較関数を紹介する
また、逐次更新し、最新の比較関数を紹介し続けたい（願望）
1. ファイルのバイナリ情報が一致するか
2. 画像イメージが一致するか

## 1. ファイルのバイナリ情報が同様であるか

■ FileUtiles.contentEquals
(org.apache.commons.io ライブラリ)

```
// Fileクラスを比較する
val checkFlag = FilesUtiles.contentEquals(file1, file2)
```

■ contentEquals
(Kotlin専用 標準ライブラリ)

```
// 各ファイルのバイト配列を作成
val byteArray1 = Files.readAllBytes(path1)
val byteArray2 = Files.readAllBytes(path2)

// バイト配列を比較する
val checkFlag = byteArray1.contentEquals(byteArray2)
```


## 2. 画像イメージが一致するか

■ image.getRGB
(javax.imageio.ImageIO ライブラリ)
```
val checkFlag: boolean = false

// 画像ファイルを取得する
val image_1 = ImageIO.read(Files.newInputStream(path1))
val image_2 = ImageIO.read(Files.newInputStream(path2))

// RGBを取得する
val pixel_1 = image.getRGB(x軸, y軸)
val red_1 = pixel_1 shr 16 and 0xff
val green_1 = pixel_1 shr 8 and 0xff
val blue_1 = pixel_1 and 0xff

val pixel_2 = image.getRGB(x軸、y軸)
val red_2 = pixel_2 shr 16 and 0xff
val green_2 = pixel_2 shr 8 and 0xff
val blue_2 = pixel_2 and 0xff

// 比較処理
if (red_1 == red_2
    && green_1 == green_2
    && blue_1 == blue_2) {

    // 一致する
    checkFlag = true
}

```
Redis cluster は consistent hashing を使い、データをシャーディングしている

最近勉強したconsitent hashingが使われていて、「おっ」と思った、というだけの話。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/5c394c42-b686-8378-69eb-e47b629c766a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/b07a1588-3da1-32c3-5366-e3f7e8447061.png)


## Ref.

https://redis.io/docs/latest/operate/oss_and_stack/reference/cluster-spec/#key-distribution-model
個性を剥がす、すくなくともコードの世界からは

## 個性との付き合い

技術職は個性的な人が多いと言われています。
確かに営業職に比べ、自分の好きなことを突き詰めて、それがファッションや髪型に表れている人は技術職の人のほうが多いでしょうし、事業系のエンジニアであればそれが問題になることも稀でしょう。

服装や働き方の自由度が比較的高いことが、技術職の良いところですね。

一方で私の場合は、仕事においてなるべく性格も見た目も無個性であることを目指しています。
主な理由は2つあります。

### 減点リスクをなくす

少数派の選択をとった場合、それに対して難色や不快感を示されることがあります。

私が20代の頃は少し明るめの髪の色にしている時期がありました。
年配の重役の方とお話するときに、髪の色について直接的ではないにしても難色を示されることがありました。
当時はまだ若く生意気だったこともあり、仕事を通して信頼を獲得すれば良いと考えていました。
結果的にはそのお客様とは非常に良好な関係になれたのですが、今考えるとわざわざマイナスからのスタートを選ぶ必要はなかったなと考えています。

もちろん、個性が加点になることもありますし戦略次第でしょう。
強い個性と強烈な成果が出せるとキャラクターとしてブランディングになりそうな気もします。（私にはそこまでの覚悟がなかった。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/d4f55a66-1eb2-00f0-b8d0-25ba17dc6981.png)


### かぶる帽子、つける仮面が変化するから

仕事では、立たされた役割に応じて、役を全うする必要があります。

* やさしく、質問しやすく、やわらかい人
* 冷淡で課題への解決を最優先する人
* ちょっと抜けているけど、皆が聞きづらいそもそもの質問を投げかけられる人
* 遠慮なく、ズケズケとものを言う人
* 強いプレッシャーをかけてくる人
* プレッシャーから守ってくれる人

仕事の状況や役割によって、どのような仮面であるべきかは変わるでしょう。

強い個性は状況に応じた仮面のつけ外しの邪魔になるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/a603e802-7a5f-325b-8757-7d90fc4c6d6b.png)


## コードの世界に個性はいらない

ここまでの人としての個性は、単なる私の生存戦略であり、それが正しいとも限りませんし人によっては全く合わないことも考えられます。

終始一貫して人情味があって、熱血なキャラクターであることも素晴らしいことでしょう。

一方で、コードの世界となると話は別です。

それぞれの開発言語やフレームワーク、設計技法には定石や暗黙のルール、明確なルールが存在します。
それを蔑ろにして我が道を進むのは悪手です。

コードは無個性で、プロジェクトメンバーの誰が書いた部分かもわからないようなものが理想形です。

ここではコードから個性を剥がすテクニックをいくつかご紹介します。

### .editorconfigの導入

複数人で作業を行っていると、「あの人が編集するといつも改行コードが変わってGitの差分がわかりにくくなる！」や「インデントルールが変わって何度直してももとに戻される」などの軋轢をみかけることがあります。そのような編集合戦や本来は興味の対象となるべきじゃないものを意識しないために .editorconfig を導入しましょう。

### Prettierの導入

人はみな、普段使っているIDEやエディタに愛着があり、その設定でのコードフォーマットに慣れ親しんでいます。編集する対象のファイルが見慣れているルールと異なる場合、まるっとコードフォーマットをかけて可読性を上げたいと思うでしょう。
しかし、一方で他の作業者はそのコードフォーマットに対して、「折り返しのタイミングがおかしい！」などの指摘が入るかもしれませんし、指摘しないまでも黙って、その人がお気に入りのルールでコードフォーマットをかけて上書き戦争の発端になるかもしれません。

皆が同じ方向に進める経典となるPrettier設定を導入しましょう。

PHP CodeSnifferのようなものを導入してコーディングルールを強制するのも良いでしょう。

### 各種Lintの導入

例えば、「CSS（Sass）などで同一のグループに同じプロパティ書かないで」「いや、最後の記述が適用されるだけだし、エラーが出るわけでもないんだからそんなことに時間かけるのは不毛でしょう」という話をみかけることがあります。両意見とも妥当で、本質的でないことに労力をかけるのは勿体ないので各種Lintを導入し、チェックや修正は機械に任せましょう。
そしてプロジェクトごとにルールブックを機械が認識できる形式で定義し明確にしましょう。

### 定石を学ぶ

プログラミング、コーディングの世界においては、定石を守り、ライブラリやフレームワーク、言語のお作法に従うことでクセのあるコードから脱却し、無個性でよくみかけるような誰もが同じようなコードとなる世界に近づきます。それはリーダブルコードとなります。
一般的なデザインパターンやアーキテクチャを学ぶのも良いでしょう。

#### 参考

* [リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)
* [実戦で役立つ C#プログラミングのイディオム/定石&パターン](https://gihyo.jp/book/2017/978-4-7741-8758-7)


## add moreでは個性的な人も、そうでない人も募集しています。

株式会社add moreでは「コードには個性は不要だよね」という意見さえ一致すれば、個性的なエンジニアも、そうないエンジニアも歓迎しています。（但しTPOに合わせられる人）
ご興味のある方は[コーポレートサイト](https://www.add-more.co.jp/recruit/engineer/)または[Wantedly](https://www.wantedly.com/companies/add-more)からご応募ください。
【AWS】AmazonS3で403が発生した時の対処法

# 初めに
AWS初心者向けハンズオン中に遭遇。
Amazon S3の特定のオブジェクトにおいて、オブジェクトURLをクリックしたところ画像のようなエラーが発生した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/3af3d4e6-2c2b-298b-c150-4c92e5a04bd6.png)


検証ツールで確認すると403エラー(閲覧禁止)が発生していることが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/edaa40a2-2ff9-cb65-c743-ebab04c3f6d8.png)

# 解消法
原因はS3のアクセス権限。以下2点を実施することで解消できた。

１.ブロックパブリックアクセス(バケット設定)を編集

ブロックパブリックアクセス (バケット設定)の編集押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/0b8be7a3-a0ba-468a-fa43-55ffeba1ac1b.png)


チェックを外して変更の保存押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/75bfac74-edd8-c205-7dac-931148a84839.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/310dba58-72c9-86a0-75c1-20b87ad2c212.png)

２.バケットポリシーを編集

バケットポリシーの編集を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/90225f48-cd8c-e450-063e-426504e5c146.png)


JSONを記載して変更の保存押下。バケット内のすべてのオブジェクトがパブリックに読み取り可能になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/0a46c683-a6da-166e-934c-fd308dc82abc.png)



```ruby:JSON

    {
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "PublicReadGetObject",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::*yourbacket*/*"
		}
	]
}
```

オブジェクトURLを押下すると、今度はエラーなく画面が表示されることを確認できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/3c972400-d25a-4f29-ca4e-078ff70e2dff.png)

今回は練習なので全てのオブジェクトがパブリックに読み取りできるようにしたが、セキュリティ面を考えるとあまり良くないかもしれない。


# 最後に
ハンズオンと同じ手順で進めても途中で詰まったりエラーが出ることがある。
そのような時は過去のドキュメントやChatGPTを使用して早く問題解決できるよう取り組みたい。
(2*3*5*7*11*13)**10の10進数での桁数「2014 一橋大学 後期 【3】」をChatGPTとsympyとWolframAlphaでやってみたい。


https://qiita.com/mrrclb48z/items/daa6f757138ee32a1f0e

# オリジナル
・大学入試数学問題集成 様＞【3】テキスト
＞犬プリの世界さんの解答(PDF)へ

https://mathexamtest.web.fc2.com/2014/201410272/2014102720200mj.html#top-0203

・youtube (0:00〜1:43:17)  
2014 一橋大学 後期【3】(39:30〜1:08;34)
＞...二項定理は評価にも使える。
＞...不等式にも使える。

https://youtu.be/4jaTFsD6Wgg?t=2370

# オリジナル様の方法で
・勉強中？ 私はあきらめました。

# ChatGPT-3.5先生へ

大学入試数学問題集成 様＞ 【3】テキスト

・ページのソースを表示です。MathMLです。
　省略しようと思いましたが、大学入試数学問題集成 様 の全文から必要部分の抜粋です。
```
<p><a name="top-0203" 
id="top-0203">
2014-10272-0203</a></p>
<p class="inupuri"><a class="home" 
href="https://inupri.web.fc2.com/index.html" target="_blank">犬プリの世界</a>さんの<a class="ans" 
href="https://inupri.web.fc2.com/ichihashi/ichihashi2014kkai.pdf#page=1" 
target="_blank">解答(PDF)</a>へ</p>
</div>
<div class="refinfo">
<p>2014　一橋大学　後期</p></div>
<div class="refinfo2">
<p>経済学部</p>
</div>
<div class="diff"><p>易□　並□　難□</p></div></div>
<div class="qbody">
<p class="slevel"><a name="q-0203" 
id="q-0203"></a><span 
class="qnum">【３】</span>　<math>
<msup><mrow><mo stretchy="false">(</mo><mn>2</mn>
<mo>&times;</mo><mn>3</mn><mo>&times;</mo>
<mn>5</mn><mo>&times;</mo><mn>7</mn><mo>&times;</mo>
<mn>11</mn><mo>&times;</mo><mn>13</mn>
<mo stretchy="false">)</mo></mrow><mn>10</mn>
</msup><mspace width=".2em"></mspace>
</math>の<math>
<mspace width=".2em"></mspace><mn>10</mn>
<mspace width=".2em"></mspace>
</math>進法での桁数を求めよ．
</p>
```

```
日本語で。
```

```
回答を3通りでお願いします。
```
(回答省略)

# WolframAlphaで

```
(2*3*5*7*11*13)**10
```

https://www.wolframalpha.com/input?i=%282*3*5*7*11*13%29**10+&lang=ja

科学的表記の中のプレーンテキスト
5.9642154303295182755378537795549049 × 10^44

```
(2*3*5*7*11*13)**10の10進数での桁数を求めよ。
```
???

https://www.wolframalpha.com/input?i=%282*3*5*7*11*13%29**10%E3%81%AE10%E9%80%B2%E6%95%B0%E3%81%A7%E3%81%AE%E6%A1%81%E6%95%B0%E3%82%92%E6%B1%82%E3%82%81%E3%82%88%E3%80%82&lang=ja

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
・アレです。

https://qiita.com/mrrclb48z/items/a31648c799fa0dc6050f


# (2024-06-09追加)ChatGPT-3.5先生へ
 
```
上記の問題を、共通テストみたいな太郎さんと花子さんの会話形式に変換して下さい。「」表示にして下さい。
```
(回答抜粋)　...求める桁数：45
「どういたしまして、太郎さん！」


(2024-06-10追加)
会話を、問題部分と、解答部分に、分けないとだめでした。
Webhookとは

## **Webhookとは？**

Webhookとは、あるシステムで特定のイベントが発生した際に、その結果を他のシステムに通知する方法です。この用語は、2007年にJeff Lindsayのコンピュータープログラミング用語の「フック（hook）」から派生して作られました。

例えば、Stripeで決済が完了したり、ブログにコメントが投稿されたりするイベントが発生すると、そのシステムは登録されたWebhook URL（他のシステムのURL）にイベントの結果を通知します。

## **従来の方式との比較**

ポーリングとWebhookを理解するために、ECサイトの例を見てみましょう。Aシステムで顧客が商品を決済すると、決済リクエストが決済サービス（例：Stripe）に送られます。

- **短いポーリング（Short Polling)**：短いポーリングは、AシステムからStripeシステムに決済リクエストを送り、決済が完了するまで状態を継続的に確認する方法です。これはサーバーリソースを多く消費します。
- **長いポーリング（Long Polling)**：長いポーリングは、AシステムがStripeシステムにHTTPリクエストを送り、Stripeシステムが結果を返すまで接続を維持する方法です。短いポーリングよりも効率的ですが、それでもサーバーリソースを多く消費します。
- **Webフック（Webhook）**：Webhookは、AシステムがStripeシステムに決済リクエストを送り、Stripeが決済を処理した後、Aシステムが事前に登録したWebhook URLに決済結果を送信する方法です。これにより、不要なリソースの浪費を防ぎ、即時の更新が可能となります。

## **Webhookのためのベストプラクティス**

Webhookの利点を最大限に活用するためには、以下のベストプラクティスを守ることが重要です。

**1. フォールバックポーリングメカニズム**

システムがダウンしたり、ネットワークに問題が発生することがあるため、リクエスト結果を確認するためのフォールバックメカニズムを用意しましょう。

**2. Webhookのセキュリティ**

Webhookを使用する際は、セキュリティが非常に重要です。Webhookのリクエストが信頼できる出所からのものであることを確認するために、認証手続きを導入して有効性を検証しましょう。

**3. Webhookの冪等性**

冪等性とは、同じWebhookが複数回送信されても問題が発生しないようにすることを意味します。必ず一意の識別子を使用し、各イベントを一度だけ処理するように実装しましょう。

**4. Webhookの過負荷処理**

ウェブサイトやアプリケーションの人気が急上昇すると、Webhookのトラフィックも急増する可能性があります。キューを使用してWebhookイベントの受信と処理を分離することで、高いトラフィックでもスムーズに動作するシステムを提供できます。

**5. リアルタイム要件の評価**

Webhookはほとんどの場合非常に有用ですが、マイクロ秒単位の遅延が重要な場合には適していないことがあります。時間に非常に敏感な作業の場合、低いオーバーヘッドと迅速な更新を提供するためにソケットの使用を検討しましょう。

## **結論**

Webhookは効率的で即時の更新を可能にします。しかし、これを適切に活用するためには、セキュリティの強化、冪等性の維持、過負荷処理、フォールバックメカニズムの準備、リアルタイム要件の評価など、いくつかの事項を考慮する必要があります。これらのベストプラクティスを守り、安定して信頼できるシステムを構築することで、Webhookの利点を最大限に活用することができます。

## 参考
- [Webhook - Wikipedia](https://en.wikipedia.org/wiki/Webhook)
- [Top 3 Things You Should Know About Webhooks! - ByteByteGo](https://www.youtube.com/watch?v=x_jjhcDrISk)
MySQLの基本操作を整理

## はじめに
このガイドでは、Homebrewを使用してMySQLをインストールし、起動して基本的な操作を行う手順を説明します。MySQLは人気の高いリレーショナルデータベース管理システム（RDBMS）であり、データの保存、取得、管理にSQL（Structured Query Language）を使用します。

## 1. Homebrewのインストール
まず、Homebrewがインストールされているか確認します。インストールされていない場合は、以下のコマンドをターミナルに入力してHomebrewをインストールします。

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

## 2. MySQLのインストール
ターミナルを開き、以下のコマンドを実行してMySQLをインストールします。

```sh
brew install mysql
```

## 3. MySQLサーバーの起動
MySQLサーバーを起動するには、以下のコマンドを実行します。

```sh
brew services start mysql
```

## 4. MySQLへのログイン
サーバーが起動したら、以下のコマンドを実行してMySQLにログインします。

```sh
mysql -u root -p
```

初回ログイン時には、パスワードが空である場合があるので、その場合はそのままEnterを押してください。



## 5. 基本的な操作
MySQLにログインした後、以下の基本的な操作を行います。

### データベースの確認
```sql
SHOW DATABASES;
```

### データベースの選択
```sql
USE データベース名;
```
例:
```sql
USE my_database;
```

### テーブルの確認
```sql
SHOW TABLES;
```

### テーブルの構造を確認
```sql
DESCRIBE テーブル名;
```
例:
```sql
DESCRIBE users;
```

### データの取得
```sql
SELECT * FROM テーブル名;
```
例:
```sql
SELECT * FROM users;
```

### MySQLからのログアウト
```sql
EXIT;
```
または
```sql
QUIT;
```
HTML文書のタイトルの左横書き・右横書き


HTML文書のタイトルが左横書きで表示されるか右横書きで表示されるかはUnicodeのBIDIアルゴリズムによって決定される（`title`要素の`direction`プロパティの値などには依存しない）。そのため、ついうっかりタイトルの１文字目をアラビア文字にするとタイトルは右横書きで表示されてしまう。たとえば`title`要素を

```html
<title>كَتَبَ | Fooctionary</title>
```

と書くと次のように表示される（Microsoft Edgeの場合）。

![html-document-title-example-bad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558748/c103f0be-6329-ec65-c892-50d3c3969f4f.png)

タイトルの文字の進行方向を正しく表示するためにはUnicodeの方向制御コードを使う。たいていの場合はタイトルの頭にleft-to-right markを付け加えるだけでよい。

```html
<title>&lrm;كَتَبَ | Fooctionary</title>
```

![html-document-title-example-good.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558748/1e464ef1-f48d-dd49-96ce-4a15e056b02e.png)
[雑メモ] Redis の hashes と sorted sets について

# HASHES ([ref](https://redis.io/glossary/redis-hashes/))

> Hashes are a type of data structure that stores a mapping of keys to values, similar to a miniature version of Redis itself. Unlike lists and sets, hashes can store values that can be incremented or decremented if they can be interpreted as numbers.


Commands are:
- HSET: Sets the value of one or more fields on a hash.
- HGET: Returns the value at a given field.
- HMGET: Returns the values at one or more given fields.
- HINCRBY: Increments the value of a particular hash field.


📝 namespaceを分けることはできない？([ref](https://stackoverflow.com/questions/8614858/namespaces-in-redis))



# SORTED SETS ([ref](https://redis.io/glossary/redis-sorted-sets/))

> Sorted sets in Redis are a powerful data structure that combines the features of sets and sorted lists. They allow you to store a collection of unique elements while assigning a score or rank to each element. This score is used to determine the order of elements in the set, making sorted sets an excellent choice for applications that require ordered data.


Commands are a lot. (e.g. `ZADD`, `ZREM`)

📝 各keyごとに、sortされたitemのコレクションを持つ。
Go言語におけるCORS設定の実装方法

Go言語でHTTPサーバを実装する際にCORS（Cross-Origin Resource Sharing）の設定を行う方法。

※CORS：ウェブアプリケーションが異なるオリジンのリソースを安全にリクエストできるようにする仕組み

### CORSミドルウェアの実装
CORSポリシーを実施するミドルウェア関数を定義。（今回は全てのHTTPレスポンスに適切なCORSヘッダーを追加し、プリフライトリクエストに適切に応答するものとして定義している）
```go:presentation/cors_middleware.go
package presentation

import "net/http"

func CORSMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "*")
        w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
        w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")

        if r.Method == "OPTIONS" {
            w.WriteHeader(http.StatusOK)
            return
        }

        next.ServeHTTP(w, r)
    })
}

```
### CORSミドルウェアの適用
HTTPハンドラーに定義したCORSミドルウェアを適応。
```go
...
corsHandler := CORSMiddleware(proxyHandler)
    http.Handle(config.Path, corsHandler)
...
```
---
今回ドメイン駆動設計をアーキテクチャに実装してるものとして、`presentation`層に実装した。
（どのドメインからのアクセスを許可するかというHTTPレベルのセキュリティポリシーの管理、`presentation`層の責務！）
ChatGPT-3.5先生へ「10進法の整数の桁数の求め方を教えて下さい。」

# ChatGPT-3.5先生へ

User
10進法の整数の桁数の求め方を教えて下さい。
ChatGPT
＞方法1,2,3
(回答省略)

# 参考
configuration?.imageが効かない時の解決方法


## はじめに
以下Pixivさんのチュートリアルを行っているときにconfiguration?.imageが効かない時のケースに遭遇したのでメモ

https://pixiv.github.io/ios-tutorial/tutorials/tutorial/practice8/

## 解決方法

### UIButtonのtypeをcustomからsystemに変更
systemにすることで、ボタンがシステム標準の処理を受けるようになり、UIButton.Configurationを使用して画像を設定した際に正しく反映されるようになりました。

UIButtonのtypeをcustomに設定していたことが原因でした。

## customのまま画像が切り替わるようにする解決方法

### setImage(_:for:)を使用する

```swift
heartButton.setImage(UIImage(systemName: illust.isFavorited ? "heart.fill" : "heart"), for: .normal)
```

この方法でもボタンの画像を切り替えることができます。

### UIButtonのstate

UIButtonは異なる状態（state）に応じて異なる画像やタイトルを表示できます。
主な状態は以下です。

	•	.normal: ボタンが通常の状態のとき
	•	.highlighted: ボタンがタッチされているとき
	•	.disabled: ボタンが無効のとき
	•	.selected: ボタンが選択されているとき




## おわりに
おかげでUIButtonのtypeやstateの理解が深まりました。
gitとgithubの構築手順

新しいPCを購入したので、環境構築周りを備忘録として残そうと思います。
今回はgitとgithub編です。

# 今回やること
- gitのインストールと設定
- githubの登録と設定
- githubにリポジトリを作成してクローンする

# 対象とする読者
- git、github初心者
- これからgit周りの環境構築をする人

# 筆者の環境
- windows11

# gitとは
https://git-scm.com/

# githubとは
https://github.com/

# 手順
下記サイトを参考に実施してください。
[【Windows】Gitの環境構築をしよう！](https://prog-8.com/docs/git-env-win)

上記サイトでは、gitの初期設定 ～ githubのアカウント作成や初期設定を紹介してます。
画像やコマンド例が丁寧に記載され、とても分かりやすかったです。

# 参考文献
- https://git-scm.com/
- https://github.com/
- [【Windows】Gitの環境構築をしよう！](https://prog-8.com/docs/git-env-win)

# 初心者向けのサポートをやってます！
MENTA にて HTML/CSS、JavaScript のサポートを行っております。
このソースが上手く動かない、この記事の内容が良く分からないなど何でも良いのでお気軽にご相談ください！
詳細は下記ページよりご参照ください。

https://menta.work/plan/16027?ref=mentor_profile
Thẫm Mỹ Sonaly

Thẩm Mỹ Sonaly

Là một doanh nghiệp kinh doanh ngành thẩm mỹ với 14 năm kinh nghiệm được dẫn dắt bởi CEO-Hương Ly, một người có xuất phát điểm là chuyên gia làm đẹp dày dặn kinh nghiệm, yêu nghề, yêu mến trân trọng khách hàng. SONALY kinh doanh bằng uy tín, chất lượng và những sản phẩm từ tâm. 

SONALY sở hữu chuỗi các cơ sở từ Hà Nội, TP Hồ Chí Minh, Lạng Sơn thuận tiện cho việc đi lại, làm đẹp của khách hàng.

Sonaly mang đến cho khách hàng vẻ đẹp đầy tự tin với các dịch vụ thẩm mỹ như:
- Phun môi
- Xăm chân mày
- Điêu khắc chân mày
- Phun mí
- Xóa xăm chân mày

Bên cạnh đó, Sonaly còn có khóa đào tạo chuyên sâu cho các học viên mong muốn nâng cao tay nghề trong lĩnh vực thẩm mỹ

Đội ngũ chuyên gia của SONALY được tuyển chọn đầu vào rất gắt gao, họ đều là những người có kiến thức, có kinh nghiệm và đặc biệt là phải yêu nghề, yêu công việc mình theo đuổi. Sau đó toàn bộ chuyên gia đều phải rèn rũa theo 1 tiêu chuẩn rất cao mà công ty đã đề ra. Tất cả các dịch vụ phun xăm mày môi điêu khắc đều phải tuân thủ 100% quy trình và giám sát chất lượng. Chuyên gia chỉ có thể đạt % dịch vụ hay mọi người hiểu đơn giản là lương 1 dịch vụ khi khách hàng hài lòng và SONALY đo lường điều này rất kỹ thông qua việc gọi chăm sóc khách hàng. Bởi vậy khách hàng sẽ rất yên tâm khi ngoài tình yêu nghề, sản phẩm sẽ còn phải đi kèm với một tiêu chuẩn rất cao và chuyên gia sẽ luôn chịu trách nhiệm với đứa con của mình.

Address: 398 Trường Chinh, quận Đống Đa, Hà Nội 
Phone: 0917007111
Website: https://sonaly.com.vn/
#sonaly
#thẩm_mỹ_viện_sonaly
#phun_môi_sonaly
#phun_mày_sonaly
#thẩm_mỹ_sonaly
#phun_mí_mắt_ở_đâu_đẹp
#phun_mí_ở_đâu_đẹp
#phun_môi_ở_đâu_đẹp_nhất
#phun_môi_ở_đâu_an_toàn
https://www.youtube.com/@lysonaly2777

https://www.facebook.com/sonalyspa.spa

https://www.tiktok.com/@sonalybeauty

https://www.pinterest.com/sonalyspa/

https://www.pearltrees.com/thammysonaly

https://x.com/sonalyspa

https://sites.google.com/view/sonalyspa/home

https://www.linkedin.com/in/th%E1%BA%ABm-m%E1%BB%B9-sonaly-56a188311/

https://fr.quora.com/profile/Th%E1%BA%ABm-M%E1%BB%B9-Sonaly

https://www.twitch.tv/thammysonaly

https://www.tumblr.com/sonalyspa

https://www.behance.net/thmmsonaly

https://vimeo.com/sonalyspa
【paizaラーニング】レベルアップ問題集 ソートメニュー応用編 「タプルソート」 PHP

### 問題

https://paiza.jp/works/mondai/sort_advanced/sort_advanced__problems_speedup_step5?language_uid=vb

### 解答例
`usort()`を使って配列のソートをしました。`usort()関数`は、ユーザーが指定した比較関数に基づいて配列をソートします。今回のソートは、以下のルールが適用されます。

・負の整数を返すと、最初の要素が2番目の要素よりも小さいとみなされます。
・正の整数を返すと、最初の要素が2番目の要素よりも大きいとみなされます。
・0 を返すと、最初の要素と2番目の要素は同じとみなされます。

#### いつものやつ
入力を受け取り、変数と配列に入れてます。
```php
<?php
    list($n, $m, $k) =explode(" ",trim(fgets(STDIN)));
    for($i = 0; $i < $n; $i++) {
        $array[] = explode(" ", trim(fgets(STDIN)));
    }
```
#### ユーザー定義のソートを作成
```php
    function customSort($a, $b) {
        global $k;
        $k_index = $k-1;
        
        if($a[$k_index] != $b[$k_index]) {
            // 配列の値が同じじゃない場合
            return $a[$k_index] - $b[$k_index];
        }
        
        // k列目が等しい場合
        for($i = 0; $i < count($a); $i++) {
            if($a[$i] != $b[$i]) {
                return $a[$i] - $b[$i];
            }
        }
        return 0;
        // 値が同じ場合
    }
```  
#### 出力
```php
    usort($array, 'customSort');
    foreach ($array as $pair) {
        echo implode(' ', $pair) . "\n";
    }  
?>
```
chatgpt君に助けてもらいました。
【アイディア】「検索してはいけない言葉」をびっくりせずに見る拡張機能


## 前書き

これはただのアイディアです。
コードはありません。

## 要求

サイト内のグロ画像を見たくない。
でも気になる。どうしたものか。

## 拡張機能の概要

* サイト内のすべての画像/動画のサムネにモザイクをいれる
  * 背景も画像なら例外なくモザイクが適用される
* モザイクはダブルクリックで解除/再適用される
  * 部分的にモザイクが外せると尚よい
  * 段階的にモザイクが外せると尚よい
* 初期表示以外のタイミングで出てくる画像などもきちんとモザイクが適用される
* とにかくグロ画像を急に見させない

## 動機1

怖いもの見たさで「検索してはいけない言葉」のサイトを見たいが、グロ画像は見たくないから。

## 動機2

5chに貼られている画像リンクを確認すると、釣りでグロ画像を見せられるケースがあるから。

## 最後に

自分で作ればいいだろ、と思われるかもしれないが、
Chromeの拡張機能は初回に5ドル取られるのが怠いのでね。。。
いまいちやる気が湧かない。

ちなみに今は画像を見るときは目をかなり細めてから大丈夫そうか判断しています。

## 関連

https://qiita.com/mogamoga1337/items/e3294f971f68cb6545d7
GitLab ~ソースクローンからマージリクエスト~

GitLabでのプロジェクト管理の基本的な流れを備忘録的に書きました。
プロジェクト名が「my-project」の場合の例を挙げています。

### 1. ソースコードのクローニング
GitLabにホストされているソースコードをローカルマシンにクローンします。

- **GitLabでのプロジェクトへの移動**
  ブラウザを使用して、GitLab上の「my-project」プロジェクトページに移動します。

- **クローンするブランチの選択**
  `feature/develop` ブランチを選択します。

- **URLのコピー**
  プロジェクトのクローン用URLをコピーします。今回はHTTPを使用します。

- **クローンの実行**
  VSCodeのターミナルで以下のコマンドを実行します。実行前にクローンしたいディレクトリに移動してください。
  ```
  git clone https://gitlab.example.com/your-username/my-project.git -b feature/develop
  ```

- **クローンの確認**
  エクスプローラーでクローンが正しく行われたか確認します。

### 2. ローカルブランチの作成
新しい機能の開発やバグ修正を行うためにローカルブランチを作成します。
```
git checkout -b feature/my-project
```

### 3. 最新情報の取得
リモートブランチから最新の変更を取得します。
```
git pull origin feature/develop
```

### 4. 変更のアップロード
- **ファイルの追加**
  - 特定のファイルを追加する場合
    ```
    git add practice.py
    ```
  - 現在のディレクトリにある全ファイルを追加する場合
    ```
    git add .
    ```
    
- **変更のコミット**
  - 変更をコミットする場合
    ```
    git commit -m "適切なコメントをここに入力"
    ```

- **プッシュ**
  - 新しく作成したローカルブランチをリモートにアップロードする場合
    ```
    git push -u origin feature/my-project
    ```
  - 既存のリモートブランチにアップロードする場合
    ```
    git push origin feature/develop
    ```

### 5. マージリクエスト
- **リモートブランチに切り替える**
  ブラウザからGitLabページにアクセスし、作成したプロジェクトを選択する。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/8b6905fd-1e51-38da-bc76-d35ac1a68521.png)

- **マージリクエストの作成**  
  プロジェクトのGitLabページで「マージリクエスト」を選択し、新規作成を行います。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/5b65f629-102d-81a4-1bff-d7e6824d5966.png)

- **ターゲットブランチの指定**  
  通常は指定されたブランチをターゲットとして選択します。間違ったブランチを選ぶと、変更点が意図しないものになる可能性があるため注意が必要です。

  ・ソースブランチには「my-project」
  ・ターゲットブランチには変更したいブランチを選択する
  　　例）feature/develop 等


これでGitLabでの基本的なソースコード管理が完了します。
Slackの通知が機能しない？Macユーザーが確認すべき設定項目

## MacでSlackの通知が行われない・・・

ある日からSlack(アプリ版)の通知が行われなくなりました・・・。
アプリを再インストールしても通知が行われないので、設定を確認してみました。

## 確認ポイント

### システム設定 > 通知 > Slack で通知を許可しているか
通知を許可していないと通知されません。
通知を許可したうえで、バナーの表示や通知の表示の仕方を設定しましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741957/884579c8-6ad3-8c69-b236-9016cae3db5a.png)


### Slackの設定 > 通知 で通知を許可しているか
通知のタイミングが*なし*になっていると通知されません。
適切に設定されているか確認しましょう。

![スクリーンショット 2024-06-03 12.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741957/2af0f252-ae05-e3a6-f9bb-62eee0d277a2.png)

### システム設定 > 集中モード
私の場合これが原因でした。
集中モードが有効になっていると通知が行われません。
有効にしたつもりはないのですが、有効になっていました・・・。誤ってクリックしたのかな。
集中モードを無効にするか、通知を許可するアプリにSlackを追加しましょう。
私の場合、Slackの他にChromeの通知も重要なので、SlackとChromeを追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741957/957d90a1-d58d-00ee-a975-2957c5c2e772.png)
ollamaのサービスがnvidia driverのアップデートを妨げる

Cuda Toolkitをアップデートとしようとすると，しばしばnvidiaのdriverのインストールで失敗します．様々な原因がありますが，ollamaをインストールしている場合，ollamaのサービスがdriverのインストールを妨げるようです．次のコマンドでサービスを停止してdriverをインストールしましょう．

```
sudo systemctl stop ollama.service
```

次に，Cuda Toolkitからdriverをインストールしましょう．
```
sudo sh cuda_12.5.0_555.42.02_linux.run --silent --driver
```
AWS SCS合格(更新)記(2024/6/3投稿)

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

前回は3年前の11月に受験していました。

https://qiita.com/handy-dd18/items/803eadbcdabf0b9f8671

# 前提
* 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認定はMLとWorkspaceを除いた9つ取ってます

# 学習内容
今回は受験前に試験の下調べをほとんどしなかったので、バージョンが変わっていることを忘れていて、以下の模擬問題だけを受講して試験に臨みました。
前に「SCSもC01からC02に変わるのかー」と思った記憶はあるのですが、完全に忘れてました。。

* [①Udemy模擬問題](https://www.udemy.com/share/10axAO3@k3MhzLuZWeVHV3KzIwU1BrnRE3quJhs_rde5dBnuXuGnOtxFEOlDoxIsNiSSl7_u/)

## ①Udemy
購入したUdemyの模擬試験講座は以下になります。
演習テストが4つあり、時間の都合から1セット目と4セットの半分まで解きました。

- [【SCS-C02対応】AWS認定 セキュリティ 専門知識 模擬問題集＋詳解](https://www.udemy.com/share/10axAO3@k3MhzLuZWeVHV3KzIwU1BrnRE3quJhs_rde5dBnuXuGnOtxFEOlDoxIsNiSSl7_u/)

この模擬問題では、解説が詳細に書いてあるので何故それが不正解or正解なのか、どのように判断したら良いのかの参考になるところが非常に良かったです。
実試験内容とはそこまで一致しませんでしたが、問題ベースでAWS知識を学習する人にはお勧めの講座でした。


# 受験した感想
冒頭で貼った3年前に受験したときの記事では以下のように書いてましたが、もう完全に別物になっているので、C01で合格していてC02を初めて受験する方はちゃんと下調べをした方が良いです。

> フラグを付けたのは全部で16問ですが、まったくわからないという問題は３問程度でした。
> あとはAWSサービスの使い方をちゃんと知っていると解ける問題と、多少知らなくても日本語をちゃんと読んでいくと解ける問題がほとんどでした。

C01とC02の違いをまとめてくださってる方の記事とかも探せば出てくるので、このあたりは必須で見ておいた方が良いと思います。(まぁ自分のように事前調べなしで受験する人はほぼいないかもしれませんが)

https://www.detblog.com/aws-certified-security-specialty-%E8%A9%A6%E9%A8%93-scs-c02-%E3%81%AE%E6%94%B9%E8%A8%82%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81/

受験後の今なら↑の記事内のこの記載に対して納得しかないです。

> トラブルシューティングやインシデント対応についての設問が増えるのでしょうか。また、マルチアカウントを前提とした設問も増える予感がします。

# 受験結果
正直終わった時点でフラグ付きが20問近くあったので落ちたものと思ってたのですが、何故か合格してました。
もしかしたら過去の実務の経験が勘という形で仕事をしてくれたのかもしれません。
![20240602_191511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/511e6006-d646-289a-ad92-40e37b16ad41.png)

# おわりに
SCSは今年の11月が期限でしたが、今年の年末から来年頭にかけて更新ラッシュが来るので早めに受験しました。
AWS認定試験に更新があることをネガティブに捉える人もいますが、自分は更新のタイミングで知識をアップデートできるので、良い機会としてポジティブに捉えて臨むことが多いです。
(実務や自己学習でAWS認定資格関連のすべての知識に追いつくのは流石に難しいので...)

次は最近手に入ったバウチャーでMicrosoftのAI-900を受験する予定なので、"合格できたら"また記事を書こうと思います。

この記事がどなたかの参考になれば幸いです。
Ansible Tips:  shellモジュールで冪等性に対応し、正しいchanged結果を持たせ、かつdry runに対応させる例

備忘

# Shellモジュールにて、changedおよびdry runに対応させるロジック例

https://qiita.com/hiroyuki_onodera/items/e2cf26d02f5bda85cd4d

上のstderrを用いる方法例の更新およびdry run対応。
shellモジュール内で実行される処理をまとめることで、可読性を向上。


```
---
- hosts: all
  gather_facts: false
  vars:
    shell_execution_guard: |-
      [ $? -eq 0 ] && exit 0  # If check succeeds, exit without changes
      echo "__changed__" >&2  # Indicate that changes are needed
      {{ "exit 0" if ansible_check_mode }}  # In check mode, exit without making changes

  tasks:

    - name: システム変更を伴うかどうか内部で確認するコマンド例
      check_mode: false
      ansible.builtin.shell: |-
        # 確認コマンド
        test -f ./test.txt

        {{ shell_execution_guard }}

        # 変更コマンド
        touch ./test.txt
      register: r
      changed_when: '"__changed__" in r.stderr_lines'

```

- 確認コマンドはシステムへの変更を行わないコマンドとする。
    - その戻り値($?)が0の場合、変更コマンドは実行せずchanged: falseとする。
    - その戻り値($?)が0以外の場合、変更コマンドを実行しchanged: trueとする。
- dry run(ansible-playbook --check)の場合、
    - 確認コマンドは、check_mode: falseにより実行し、変更処理が行われる筈かどうか判断
    - 変更コマンドは、shell_execution_guardの最後に付与した{{ ' exit 0;' if ansible_check_mode }}により実行させない。
- shell_execution_guard
    - ここでは複数のshellモジュールでの利用を考慮してplay varsとしているが、shell:内に直書きでも、task varsでも、set_factによる固定でもご自由に。

- changedかどうかのshellモジュールへの連携は、ここではstderrに決め打ちした特定の文字列__changed__を書き出すことで実装。
Ubuntu 24.04でOpenVPN Server

外で公衆WiFiを使うときなど信頼できないネットワークのトラヒックをすべて（IPv4もIPv6も）OpenVPNで暗号化する設定を行う。
multihomeを使うところとUFWの設定で詰まった。

udp.conf
```
multihome
port 11194
proto udp6
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/pki/dh.pem
topology subnet
server 10.8.0.0 255.255.255.0
server-ipv6 2001:db8:0:123::/64
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "route 192.168.x.0 255.255.255.0" # 自宅のNW
push "redirect-gateway def1 bypass-dhcp ipv6"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 1.1.1.1"
keepalive 10 120
tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0 # This file is secret
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
script-security 2
client-connect "/usr/local/vpn/client-connect.sh"
tun-mtu 1450 # 回線に合わせる
mssfix 1410 # 回線に合わせる
```

/etc/ufw/before.rules
```
.
.
.

# allow forwarding for trusted network
-A ufw-before-forward -s 10.8.0.0/16 -j ACCEPT
-A ufw-before-forward -d 10.8.0.0/16 -j ACCEPT
.
.
.

COMMIT

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/16 -o enp1s0 -j MASQUERADE

# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT
```

/etc/ufw/before6.rules
```
.
.
.
# OpenVPN
-A ufw6-before-forward -s 2001:db8:0:123::/64 -j ACCEPT
-A ufw6-before-forward -d 2001:db8:0:123::/64 -j ACCEPT
.
.
.

COMMIT

# OpenVPN NAT
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 2001:db8:0:123::/64 -o enp1s0 -j MASQUERADE
COMMIT
```
【スクラム】スクラム開発はどういう開発に適しているのか

スクラムって結構PJを選ぶフレームワークだと思うんですよね。
どういう開発に向いてそうかな〜、というのを考えてみます。
※スクラムの実務経験がない個人の私見です

# スクラムってこういうところ微妙だよね
### 生産性・効率
スクラムって開発チームでもスプリントの20%はイベントに費やされて、そもそも開発作業に取れる時間が少なくなりますよね。
自分が携わらないかもしれない機能（PBI）についてもリファインメントや見積もりをしないといけないし、開発や要件定義をするわけでもないスクラムマスターという人にも工数・コストがかかっちゃう。

かけた工数・時間に対してどれだけの機能を作れたか、みたいな生産性・効率という観点において決して優れた手法ではないように思います。

### 納期が決まっていてずらせないものは対応しづらい
スクラムでも一応見積もりはするし全く無計画でプロジェクトが進むわけではありませんが、見積もりは不正確なもの・ズレるものという前提ですし、なんだったら見積もりなんてしないほうがいい、という論調もあるぐらいです。
スクラムにおいて確実なのは実績だけであり、未来のことは不確実で揺蕩っているものなので（なんだか量子力学のような表現になりましたが）、常に変化に柔軟に適応して行って、より良い未来を目指そうね、ってスタンスだと思っています。
なので、納期やそれまでに実現させるべきことが明確に決まっていて調整の余地がないような案件には適さないように思います。

### スクラムチーム結局維持できない
スクラムはPJごとにチームを解散するのではなく、同じスクラムチームで次々PJをこなしていくのが望ましいとされます。
スクラムはチームとしてスプリント回すごとに成熟していこうぜ、というフレームワークなので、短期PJには向いておらず、中長期PJ向きです。
せっかくチームとして良くなってきたところでPJ終わって解散、だとあまりに勿体ありません。
が、現実はPJ半ばで要員の増減もあるし、PJ終わればメンバーは散り散りになることも往々にしてあるでしょう。

### プロダクトオーナー、ステークホルダー軽視されがち
スクラムってまだまだ日本だと主流ではないと思うので、会社や顧客からの理解を得られず、プロダクトオーナーやステークホルダーについて軽視されがちな気がします。
プロダクトオーナーとしてしっかり工数を確保してもらえなかったり、ステークホルダーが全然レビューに参加してくれなかったり。

### ていうかクライアントワークに向いてなくない？
顧客側の担当者といえども、もともとやってる業務もあり、システム開発の担当になったからとしてそれに専念できる人はなかなかいないと思います。
スクラムだと顧客側でプロダクトオーナーを立ててほしいし、その人にはPBI作成や市場の調査、優先度の検討などをしてほしいので、しっかり時間を取ってもらいたいんですが、なかなかそうはいかず。


# スクラム、こういうとこいいよね
### スキルアップ
チケット渡されてやっといて、じゃなくみんなでコミュニケーションとりながら１つずつPBIを終わらせていくので、自分が知見のない部分が補われていって、広くスキルアップできるように思います。
また、レビューで顧客折衝やレトロで課題管理・改善意識向上みたいな、マネジメントスキル・ビジネススキルも培われそうです。

### 成果・効果にコミット
スクラムは生産性ではなく、成果・効果を追い求めていきます。
「検索機能を使いやすくする」ことが目的なのではなく、「１ユーザー当たりの検索機能利用数増加」を目指します。
極論、１スプリントで１機能しか実装できなかったとしても、それによりユーザーやサービスにめちゃくちゃいい影響（登録者数が爆増するとか解約数が激減するとか売上がめっちゃ伸びるとか）を与えられればそのスプリントは大成功なわけです。
それはチームがみんなでサービス・顧客への効果を意識して意見し合うから出せるのです。

### 働きやすさ、楽しさ
スクラムではチームの一体感が大事です。
スクラムマスターがチームビルディングも意識して色々アドバイスしてくれます。
馴れ合い・ぬるい環境、という意味ではなく、心理的安全性が高く意見しやすい、仲間感のあるチームを目指します。
ネガティブなことを我慢し続けることも良しとしませんし、そういうチームでやる仕事って楽しそうですよね。

### 開発だけでなく様々な業務に応用できる
組織運営や採用・営業なんかでもスクラムでやれるかもしれません。
こういう、終わりがなく常に改善していくことが大切な取り組みには非常に効果を発揮するものと思います。

# 結局スクラムってどういう開発に適してんのよ
### 自社サービス開発
そんなわけで結局、ずらせない納期がなかったり、実装内容も都度柔軟に変更できたり、サービス・顧客への効果を追い求めたり、PO・SMの用意のしやすさとか考えると、やはり自社サービス開発向けなのかなと思います。
お客さんが協力的であれば、準委任で体制組ませてくれるクライアントワークでも全然いいと思いますが、開発チームからすると自社のサービスではないので、そこまで熱意を持ってコミットできるか疑問ですし、クライアントからするとかけた金額の割に機能的に大きな変化がないと不安が大きくなると思うので難しそうだなぁと感じます。
2024年6月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2024年6月1日の検索結果 (リスティング広告)

![スクリーンショット 2024-06-03 114355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/407cab96-b3ed-60ab-7eb4-a9b9a43580a7.png)

* Splunk
* Dynatrace
* ServiceNow
* IBM

Splunk がトップで Dynatrace と ServiceNow が続いています。

先月の結果はこちら --> [2024年5月 AIOps 定点観測](https://qiita.com/mkodera/items/a080ce24d3864cb381e9)

# 2024年6月1日の検索結果 (広告以外)

![スクリーンショット 2024-06-03 114426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/4491e09f-0d0d-96e4-a71b-94eb277e02af.png)

* HPE
* AWS
* Splunk
* IBM
* ServiceNow

HPE が不動のトップで AWS と Splunk が続いています。

先月の結果はこちら --> [2024年5月 AIOps 定点観測](https://qiita.com/mkodera/items/a080ce24d3864cb381e9)
【ChatGPT＋DALL-E3】切り絵を描こう。


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

　今回は、昨日の騙し絵に続き、切り絵を描こう、という話です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　ニュースはないので、
　　さっそく本題に入ります。

　昨日（2024/06/02）は
　　騙し絵をやりました。

　今日は、
　　切り絵です。
***
***user***
“切り絵”とは？

***ChatGPT（GPT-3.5）***
切り絵とは、紙を使って模様や図柄を切り抜いて作る、伝統的な日本の工芸品です。この技術は、和紙や他の種類の紙を用いて、様々な美しいデザインを作り出すことができます。伝統的な切り絵の作品は、風景や動物、花などのモチーフを使って、繊細で優雅な表現をしています。最近では、現代アートとしても注目を集めています。

***user***
英語ではなんと呼びますか？

***ChatGPT（GPT-3.5）***
英語では、「切り絵」を "kirigami" と呼びます。
***

　なるほど。
　　"kirigami"ですか。
　　　"origami"と同じですね😅

　では、
　　やり取りをどうぞ。
　　　ここからは、
　　　　GPT-4に切り替えます。
　　　　　オムニの必要は
　　　　　　あまりないので。
***
***user***
切り絵を正方形で描画してください。テーマは、黒猫

***ChatGPT***
![Black_Cat_Paper_Cut_Art_Japanese_Style.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/7246c270-1c8e-b7d7-f448-ec900539d601.jpeg)

***user***
シンプルな切り絵でお願いします

***ChatGPT***
![A_simple_paper_cut-out_art_of_a_black_cat_converted.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/b54909a3-07ae-fe46-a54e-a0909c446b44.jpeg)

***user***
これは切り抜いた紙が、白いのか黒いのか教えて

***ChatGPT***
この切り絵アートでは、黒い紙が切り抜かれて使用されており、背景は白です。これにより、黒猫のシルエットが際立ちます。

***user***
英語プロンプト出力。略さずに和訳。

***ChatGPT***
生成した画像の英語プロンプトは以下の通りです：

"A simple paper cut-out art of a black cat. The silhouette of the cat is straightforward and elegant, with minimal detail to emphasize the cut-out style. The cat is sitting, with its tail wrapped around its body, and looking up. The background is plain to keep the focus on the cat. The overall design should be stark, using only black paper on a white background to highlight the simplicity and beauty of the cut-out technique."

和訳：
「シンプルな黒猫の切り絵アートです。猫のシルエットはシンプルでエレガントで、切り絵スタイルを強調するために最小限のディテールが施されています。猫は座っており、その体に尾を巻き付け、上を向いています。背景はシンプルで猫に焦点を当てています。全体のデザインは際立っており、シンプルさと切り絵テクニックの美しさを強調するために黒い紙と白い背景のみを使用しています。」

***user***
このPromptをもっとシンプルにして、“黒猫”の部分を変更できるように[]でくくってPromptを作成してください

***ChatGPT***
こちらが、要求に基づいたよりシンプルなプロンプトです。特定の動物やオブジェクトに簡単に変更可能な形式で記述しています：

"A simple paper cut-out art of a [black cat]. The silhouette is straightforward and elegant, focusing on minimal detail to emphasize the cut-out style. The background is plain to keep the focus on the silhouette. The design uses only black paper on a white background to highlight the simplicity and beauty of the technique."

このプロンプトでは、「[black cat]」の部分を任意の動物やオブジェクト名に置き換えて使用できます。

***user***
和訳して

***ChatGPT***
こちらが、要求に応じたよりシンプルなプロンプトの和訳です。特定の動物やオブジェクトに簡単に変更可能な形式で記述しています：

「[黒猫]のシンプルな切り絵アートです。シルエットはシンプルでエレガントで、最小限のディテールに焦点を当てて切り絵スタイルを強調しています。背景はシルエットに焦点を当てるためにシンプルです。デザインはシンプルさとテクニックの美しさを際立たせるために、黒い紙を白い背景に使用しています。」

このプロンプトでは、「[黒猫]」の部分を任意の動物やオブジェクト名に置き換えて使用できます。
***
　ごらんのとおり、
　　PromptShareできるものに
　　　しました。

　別のセッションにて
　　確認してあります。

　ここから
　　改変していけば、
　　　ご自分の好みで
　　　　切り絵を楽しめるか
　　　　　と思います。

　あるいは
　　最初の指示のようにして
　　　改変していく手もあります。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Python:二次元リストを作る際の注意点

# 二次元リストを作る際の注意点

皆さん、二次元リストを書く際、どのように記述していますか？
恐らく多くの人が以下のようにfor文を用いて記述していると思います。

```py
fields=[[0 for _ in range(4)] for _ in range(4)]
print(fields)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
```

ただ、二次元リストを作るだけなら以下のようにも記述できますよね。


```py
fields=[[0]*4]*4
print(fields)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
```

リストの中身にもよりますが、状況によっては下のコードの方が、短く済みそうですよね。
しかし、実は下のコードは二次元リストとしての役割を果たしていません。
試しにリストの中身を更新してみます。
まずは、for文で書いた二次元リストから更新します。

```py
fields=[[0 for _ in range(4)] for _ in range(4)]
print(fields)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

fields[0][1]=1
print(fields)
# [[0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
```

次に、「*」を使ったリストを更新してみます。
```py
fields=[[0]*4]*4
print(fields)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

fields[0][1]=1
print(fields)
# [[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]
```

指定したのは[0][1]のみなのに、実際には[0:][1]が更新されています。
理由は、オブジェクトのidにあります。
```py
fields=[[0 for _ in range(4)] for _ in range(4)]
print(fields)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

print(id(fields[0]))
print(id(fields[1]))
# 2754287228736
# 2754287228864
```
本来は、このように同じ二次元リストに存在していても行ごとにidが違うはずです。
では、「*」の二次元リストはどうでしょうか。
```py
fields=[[0]*4]*4
print(fields)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

print(id(fields[0]))
print(id(fields[1]))
# 2754288924672
# 2754288924672
```
同じidが出力されています。
普段、私たちが変数を使う場合、コンピュータ側はidで指定しています。
なので、今回のような現象が起きてしまうわけです。
<br>
id関連の落とし穴はよくあるので、頭の片隅にでも置いていただければと思います。
firebaseのデプロイが失敗した場合の対処法

## 事象
firebaseのdeployコマンドを実行すると、
```sh
yarn firebase deploy
```

以下のようなエラーが発生することがある。
```sh
Error: Failed to get Firebase project XX-XX-XX. Please make sure the project exists and your account has permission to access it.
```

## 対応方法
以下、コマンドで再認証をする。
```
yarn firebase login --reauth
```
Windowsのコマンドプロンプトでストレージの詳細情報を取得

# 概要

余計なソフトを実行したくないし、端末のケースを直接開いたりもしたくない。
Windows標準機能でストレージの詳細情報を取得したい。

# やり方

```bat:
wmic diskdrive
```

# バージョン

Microsoft Windows [Version 10.0.22631.3672]
matplotlibライブラリ pyplotモジュール：誰でも簡単にできるグラフ作成ガイド

### はじめに

Pythonはデータ分析や可視化において非常に強力なツールを提供しています。その中でも、`matplotlib`ライブラリの`pyplot`モジュールは、グラフ作成において基本的でありながら多機能なツールです。本記事では、初めて`pyplot`を使用する方のために、導入方法と簡単な使用方法について解説します。

### 1. `matplotlib`のインストール

まずは`matplotlib`をインストールします。Pythonのパッケージ管理ツールである`pip`を使用します。

```bash
pip install matplotlib
```

### 2. 基本的な使用方法

インストールが完了したら、実際に`pyplot`を使って簡単なグラフを作成してみましょう。以下は、折れ線グラフを作成するための基本的なコードです。

```python
import matplotlib.pyplot as plt  # pyplotをインポート

# データを準備
x = [1, 2, 3, 4, 5]  # x軸の値
y = [1, 4, 9, 16, 25]  # y軸の値

# グラフを作成
plt.plot(x, y)  # 折れ線グラフをプロット

# タイトルとラベルを設定
plt.title("Sample Line Plot")  # グラフのタイトル
plt.xlabel("X Axis")  # x軸のラベル
plt.ylabel("Y Axis")  # y軸のラベル

# グラフを表示
plt.show()  # グラフを画面に表示
```

### 3. グラフの種類

`pyplot`では、折れ線グラフ以外にも様々なグラフを作成できます。以下に、いくつかの代表的なグラフの例を示します。

#### 3.1 棒グラフ

```python
import matplotlib.pyplot as plt  # pyplotをインポート

# データを準備
x = ['A', 'B', 'C', 'D', 'E']  # x軸のカテゴリ
y = [5, 7, 3, 8, 4]  # y軸の値

# 棒グラフを作成
plt.bar(x, y)  # 棒グラフをプロット

# タイトルとラベルを設定
plt.title("Sample Bar Chart")  # グラフのタイトル
plt.xlabel("Categories")  # x軸のラベル
plt.ylabel("Values")  # y軸のラベル

# グラフを表示
plt.show()  # グラフを画面に表示
```

#### 3.2 散布図

```python
import numpy as np  # NumPyライブラリをインポート
import matplotlib.pyplot as plt  # pyplotをインポート

# データを準備
x = np.random.rand(50)  # x軸のランダムな値
y = np.random.rand(50)  # y軸のランダムな値

# 散布図を作成
plt.scatter(x, y)  # 散布図をプロット

# タイトルとラベルを設定
plt.title("Sample Scatter Plot")  # グラフのタイトル
plt.xlabel("X Axis")  # x軸のラベル
plt.ylabel("Y Axis")  # y軸のラベル

# グラフを表示
plt.show()  # グラフを画面に表示
```

### 4. グラフのカスタマイズ

`pyplot`では、グラフの見た目を自由にカスタマイズできます。例えば、線の色やスタイル、マーカーの種類などを指定することができます。

```python
import matplotlib.pyplot as plt  # pyplotをインポート

# データを準備
x = [1, 2, 3, 4, 5]  # x軸の値
y = [1, 4, 9, 16, 25]  # y軸の値

# カスタマイズした折れ線グラフを作成
plt.plot(x, y, color='green', linestyle='--', marker='o')  # 緑色の破線でマーカー付きの折れ線グラフをプロット

# タイトルとラベルを設定
plt.title("Customized Line Plot")  # グラフのタイトル
plt.xlabel("X Axis")  # x軸のラベル
plt.ylabel("Y Axis")  # y軸のラベル

# グラフを表示
plt.show()  # グラフを画面に表示
```

### 5. まとめ

本記事では、`pyplot`の基本的な使用方法といくつかの代表的なグラフの作成方法について解説しました。`pyplot`は非常に強力で柔軟なツールですので、さまざまなデータの可視化に活用できます。ぜひ、実際にコードを試して、自分のプロジェクトに役立ててください。

この記事が、皆さんのデータ可視化の第一歩となれば幸いです。