OmniAICreator/Qiita-1.07M huggingface dataset:
TradingViewのエディターズ・ピックに掲載される仕組みとおすすめインジケーター


## 概要  
本記事では、TradingViewの「エディターズ・ピック」にインジケーターが掲載される仕組みを解説しつつ、特に注目に値する優秀なインジケーターをいくつか紹介する。TradingViewの「エディターズ・ピック」は、多くのトレーダーや開発者にとって作品の注目度を高める重要な機能であり、掲載されることは[PineScript](https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qth-tradingview)開発者としての実績を大きく向上させる要素となる。  

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qth-tradingview

---

## エディターズ・ピックに掲載される仕組み  

### 1. エディターズ・ピックとは  
TradingViewの「エディターズ・ピック」は、公式チームが選定した高品質なスクリプトやインジケーターを特集するセクションである。このセクションは、TradingViewのトップページや「スクリプト」タブに表示されるため、掲載されれば広範囲にわたるユーザーの目に触れる機会が増える。  

### 2. 選定基準  
エディターズ・ピックに掲載されるための具体的なアルゴリズムは公開されていない。しかし、以下の要素が重要視されると推測される。  

#### **革新性**  
スクリプトが提供する機能がユニークであること。単なる既存のインジケーターの焼き直しではなく、独自の視点や新しいアプローチを盛り込むことが求められる。  

#### **実用性**  
トレーダーにとって実際に有益であること。過剰に複雑なロジックよりも、現実的なトレードに役立つシンプルかつ明確なツールが評価される。  

#### **コードの品質**  
PineScriptのベストプラクティスに従って書かれていること。リーダビリティの高いコード、適切なコメント付け、無駄のない効率的なロジックが重要である。  

#### **プレゼンテーション**  
チャート上でのビジュアルが整っていること。見やすく、情報を的確に伝えられるデザインが好まれる。また、スクリプトの説明文やリリースノートも、エディターの関心を引くためには重要な要素となる。  

---

## おすすめのインジケーター  

以下に、エディターズ・ピックに選定されたことのある、または高い評価を受けているインジケーターを3つ紹介する。これらは学習や参考に値する優れた作品である。  

### 1. **Volume Bull/Bear Activity [ZC]**  
**作者**: ZC  
**概要**:  
このインジケーターは、取引量を基に強気・弱気のアクティビティを視覚化するツールである。バーの色分けによって売り手と買い手の勢力を簡潔に示し、短期的な市場の勢いを把握するのに役立つ。  

**特徴**:  
- 取引量を基にしたリアルタイムの強弱分析  
- シンプルで直感的な表示  
- 短期トレーダーに最適  

---

### 2. **Market Stats Panel [Daveatt]**  
**作者**: Daveatt  
**概要**:  
市場全体の主要な統計情報をパネル形式で提供するインジケーターである。価格の変動率や取引量、オープン・クローズの値などをコンパクトにまとめ、トレーダーが迅速に状況を判断できるよう支援する。  

**特徴**:  
- マーケット全体の概要を1つのパネルに集約  
- カスタマイズ可能な表示オプション  
- デイトレーダーおよびスキャルピングトレーダーに適した情報提供  

---

### 3. **Fibonacci Time-Price Zones**  
**概要**:  
Fibonacci数列を用いた時間と価格のゾーンを視覚化するインジケーターである。これにより、相場の転換点を予測する手助けとなる。ファンダメンタルズやテクニカル分析に基づいた中長期的なトレード戦略において、特に有用である。  

**特徴**:  
- 時間軸と価格軸を統合的に分析  
- 相場のサイクルを視覚化  
- Swingトレーダーに適したツール  

---

## 注意点  
TradingViewにおけるスクリプトの公開やエディターズ・ピック掲載を目指す際には、以下の点に注意する必要がある。  

### 1. 著作権とオリジナリティ  
他者のコードやアイデアを無断で利用しないことは当然である。オリジナル性が高いスクリプトであることが、エディターズ・ピックへの選出において重要な条件となる。  

### 2. ユーザーフィードバックへの対応  
スクリプトを公開した後に寄せられるユーザーフィードバックに適切に対応することで、評価を高めることができる。改善を続ける姿勢が重要である。  

### 3. 継続的なアップデート  
TradingViewの機能やPineScriptの仕様は進化し続けている。これに伴い、スクリプトを継続的にアップデートすることが求められる。  

---

## 結論  
TradingViewのエディターズ・ピックに掲載されることは、PineScript開発者としてのスキルを示す絶好の機会である。本記事で紹介したインジケーターや注意点を参考に、独自性と実用性を兼ね備えたスクリプトの開発に挑戦していただきたい。  

読者諸氏のスクリプトがエディターズ・ピックに選ばれることを心より願っている。  

---

APIドキュメント：

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qth-tradingview

---

## 免責事項  

本記事に記載されている内容は、筆者がTradingViewおよびPineScriptを用いて学び得た知識と経験を基に執筆したものである。内容の正確性および完全性については可能な限り配慮しているが、必ずしもその保証をするものではない。  

自動売買Botの構築や運用、またそれに関連する投資活動は読者自身の判断と責任に基づいて行われるべきであり、筆者および本記事を掲載するプラットフォーム（Qiita）は、それによって生じたいかなる損失や損害に対しても一切の責任を負わないものとする。  

特に、トレードに関する意思決定は市場リスクを伴うため、実運用前に十分な検証とリスク評価を行い、必要に応じて専門家への相談を推奨する。  

読者各位の責任において本記事をご活用いただければ幸いである。
TradingView「コミュニティスクリプト」の使い方 #PineScript


## 概要  
[TradingView](https://www.tradingview.com/?aff_id=112991&source=qti-tradingview)には、トレーダーが作成した「コミュニティスクリプト」が多数公開されている。本記事では、コミュニティスクリプトの基本的な使い方から、選択時の注意点、さらには[PineScript](https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qti-tradingview)において独自のスクリプトをコミュニティに共有する方法について解説する。  

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qti-tradingview

TradingViewの「コミュニティスクリプト」は、トレードの補助ツールとして非常に有用であるが、その効果を最大化するには、適切なスクリプトを選択し、そのロジックを十分理解した上で活用する必要がある。本記事が、読者のトレードにおける新たな気づきの一助となれば幸いである。  

---

## コミュニティスクリプトとは  
TradingViewの「コミュニティスクリプト」とは、PineScriptを用いてトレーダーが作成したインジケーターやストラテジーを指す。これらはTradingViewのプラットフォーム上で自由に閲覧および利用が可能であり、初心者から上級者まで多くのユーザーが日々活用している。  

コミュニティスクリプトには、次の2種類が存在する。  
1. **インジケーター**: トレードの意思決定を補助する可視的なツール。例: 移動平均線、RSI、ボリンジャーバンド。  
2. **ストラテジー**: トレードのエントリーおよびエグジットをシミュレーションするためのスクリプト。  

---

## コミュニティスクリプトの利用方法  

### 1. コミュニティスクリプトの検索  
1. **TradingViewにログイン**する。  
2. 上部メニューから「インジケーター」アイコンをクリックする。  
3. 表示されたウィンドウの検索ボックスにキーワードを入力する。例えば、「RSI」「VWAP」など。  
4. 「コミュニティスクリプト」のセクションに移動し、該当するスクリプトを探す。  

### 2. コミュニティスクリプトの適用  
1. 使用したいスクリプトを選択し、クリックする。  
2. スクリプトがチャート上に追加される。  
3. 必要に応じて、設定画面でパラメータを調整する。  

### 3. コミュニティスクリプトのコード閲覧  
公開されているスクリプトのコードを閲覧することも可能である。コードを確認することで、スクリプトのロジックを理解し、自身のトレード戦略に応用することができる。  
1. スクリプト名を右クリックし、「ソースコードを表示」を選択する。  
2. PineScriptのコードが表示されるため、内容を確認する。  

---

## コミュニティスクリプトを利用する際の注意点  

### 1. ロジックの理解が必要  
コミュニティスクリプトは必ずしも全てのトレード環境に適合するわけではない。利用前にコードを確認し、スクリプトがどのように動作するかを理解することが望ましい。  

### 2. 過信は禁物  
スクリプトのバックテスト結果が良好であったとしても、実運用においては異なる結果が得られる可能性がある。過去のデータに基づく成績は未来を保証するものではないことを念頭に置くべきである。  

### 3. スクリプトの信頼性  
一部のスクリプトは十分に検証されていない場合がある。不必要に複雑なロジックや不正確な計算が含まれている可能性があるため、信頼性のある制作者のスクリプトを選択することが重要である。  

---

## 自身のスクリプトを共有する方法  

### 1. スクリプトの公開  
自作スクリプトをコミュニティに共有する場合は、以下の手順を実行する。  
1. Pine Script Editorでスクリプトを作成する。  
2. 「公開する」オプションを選択し、スクリプトの詳細情報（タイトル、説明など）を記入する。  
3. 公開範囲を「パブリック」に設定することで、他のユーザーが閲覧・利用可能となる。  

### 2. スクリプトの説明文の工夫  
スクリプトを共有する際には、説明文を分かりやすく記述することが重要である。スクリプトの目的、使用方法、適用可能なマーケット環境について明確に記載することで、利用者の理解を助けることができる。  

---

## 結論  
TradingViewの「コミュニティスクリプト」は、トレーダーにとって極めて有用なリソースである。その活用方法を習得し、適切に選択・運用することで、トレード戦略の向上が期待される。また、自身の知見をコミュニティに還元することは、新たな学びや気づきを得る機会ともなり得る。  

本記事が、読者のPineScript学習およびトレード活動において一助となることを願っている。

---

APIドキュメント：

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qti-tradingview

---

## 免責事項  

本記事に記載されている内容は、筆者がTradingViewおよびPineScriptを用いて学び得た知識と経験を基に執筆したものである。内容の正確性および完全性については可能な限り配慮しているが、必ずしもその保証をするものではない。  

自動売買Botの構築や運用、またそれに関連する投資活動は読者自身の判断と責任に基づいて行われるべきであり、筆者および本記事を掲載するプラットフォーム（Qiita）は、それによって生じたいかなる損失や損害に対しても一切の責任を負わないものとする。  

特に、トレードに関する意思決定は市場リスクを伴うため、実運用前に十分な検証とリスク評価を行い、必要に応じて専門家への相談を推奨する。  

読者各位の責任において本記事をご活用いただければ幸いである。
PowerShellを利用して大容量GIFファイルを一括圧縮する方法


GIFアニメーションは便利ですが、ファイルサイズが大きくなりがちです。特にDiscordなどでファイルサイズ制限に引っかかることも多いですよね。今回は、PowerShellを使って同じディレクトリにある大容量のGIFファイルを一括で圧縮する方法を紹介します。

## 必要な準備

この方法を使うには、ImageMagickが必要です。インストールは以下のコマンドで簡単にできます：

```powershell
choco install imagemagick.app -y
```

※Chocolateyがインストールされていない場合は、[ImageMagickの公式サイト](https://imagemagick.org)からダウンロードしてインストールすることもできます。

## 一括圧縮コマンド

以下のコマンドをPowerShellで実行すると、現在のディレクトリにある2MB以上のGIFファイルを自動的に圧縮します：

```powershell
Get-ChildItem -File *.gif | Where-Object { $_.Length -gt 2MB } | ForEach-Object -Begin { $total = @($input).Count; $current = 0 } -Process { $current++; Write-Host "処理中: $($_.Name) ($current/$total) - 元サイズ: $([math]::Round($_.Length/1MB, 2))MB"; magick convert $_.FullName -coalesce -colors 4 -quality 30 -layers optimize -scale 20% $_.FullName; Write-Host "完了: $($_.Name) - 圧縮後サイズ: $([math]::Round((Get-Item $_.FullName).Length/1MB, 2))MB `n" -ForegroundColor Green }
```

### コマンドの説明

このコマンドは以下のことを行います：

1. 現在のディレクトリ内の2MB以上のGIFファイルを検索（`*.gif`）
2. 各ファイルに対して以下の圧縮処理を実行：
   - 色数を4色に削減
   - 品質を30%に設定
   - フレーム間の最適化
   - サイズを20%に縮小
3. 進捗状況を表示：
   - 処理中のファイル名
   - 処理の進捗（例：2/5）
   - 圧縮前後のファイルサイズ

### カスタマイズ方法

圧縮設定を調整したい場合は、以下のパラメータを変更できます：

- `-colors 4` : 色数（数字を大きくすると品質が良くなる）
- `-quality 30` : 品質（0-100、大きいほど高品質）
- `-scale 20%` : 出力サイズ（パーセンテージ）
- `*.gif` : 対象ファイルの拡張子フィルター

例えば、もう少し品質を重視する場合：
```powershell
# 色数を増やし、品質を上げ、サイズ縮小を控えめにした例
-colors 16 -quality 60 -scale 50%
```

また、あまりないかもしれないですが、拡張子がついてない場合は`*.gif`フィルターを除去して対応できます。

## 注意点

- 元ファイルは上書きされるので、必要に応じて事前にバックアップを取ることをお勧めします
- 極端な圧縮設定は画質の大幅な劣化につながる可能性があります
- GIF以外のファイルに対して使用する場合は、ファイル形式によって圧縮効果が異なる可能性があります

## おわりに

このスクリプトを使えば、大量のGIFファイルを簡単に一括圧縮できます。特にDiscordやSlackなどのファイルサイズ制限に引っかかる場合に便利です。圧縮設定は用途に応じて適宜調整してください。
SharePointのフォルダ/ファイルをエクスプローラから表示する方法

# はじめに
SharePointは、企業内でのファイル共有やコラボレーションを支援する強力なツールです。SharePoint内のフォルダやファイルをエクスプローラから直接操作できると、日々の業務がより効率的になります。

本記事では、Windows環境でSharePointのフォルダやファイルをエクスプローラに表示する方法について解説します。

# 必要な前提条件
- **OneDrive for Business**をインストールしていること

# 手順
(1) ブラウザを開き、SharePointにアクセスします。必要に応じて、SharePoint Onlineのアカウント情報を入力し、ログインします。

(2) SharePointサイト内で、エクスプローラから表示したいフォルダを見つけます。

(3) フォルダを開いた状態で、ページ上部にある**OneDriveへのショートカットの追加**オプションを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/9bb17301-694c-b1cd-16ca-0b6beddf9a18.png)

(4) ショートカットの追加が完了すると、完了メッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/6f0d1c02-ae43-d1fc-7397-f6e30a70bbbb.png)

(5) エクスプローラを開くと、SharePointのフォルダが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/1604a8c0-b8db-2f63-fb5a-fc3710728257.png)


# まとめ
SharePointのフォルダやファイルをエクスプローラで操作することで、ファイルの管理が格段に効率化されるため、日常業務がスムーズに進みます。この記事の手順を実践することで、エクスプローラを使った直感的な操作が可能となり、ファイルのアップロード、ダウンロード、削除などの基本操作が簡単に行えるようになります。
.htaccessで日本語パラメーター付きURLのリダイレクト

# 要件
サーバー側で、日本語のパラメーターが付いた以下のようなパス
`/example/index.html?param1=元のパラメーター&param2=example.....`
を、param1のみ別のパラメーターに変換しそれ以外は引き継いだ状態でリダイレクトする。

# 設定内容
```.htaccess
RewriteEngine on

RewriteCond %{QUERY_STRING} (^|&)param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC(&|$)
RewriteCond %{QUERY_STRING} (.*?)&?param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC&?(.*)
RewriteRule ^example/index\.html /example/index.html?param1=リダイレクト先のパラメーター&%1&%2 [NE,R=301,L,QSD]
```

# 解説
`RewriteCond %{QUERY_STRING} (^|&)param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC(&|$)`
リダイレクト対象となるパラメーターの条件を記載します。
他にパラメーターが存在する場合は、前後にある別のパラメーターを存在しても問題無いように記述します。
上記は前後どちらにも存在する例です。

`RewriteCond %{QUERY_STRING} (.*?)&?param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC&?(.*)`
前後に存在しているパラメーターをそのまま取得します。
同じく前後どちらにも存在する例です。

`RewriteRule ^example/index\.html /example/index.html?param1=リダイレクト先のパラメーター&%1&%2 [NE,R=301,L]`
リダイレクトの詳細を記載します。
リダイレクト後のパスにはリダイレクト先パラメーターと、先程取得したその他のパラメーターを`&%1&%2`のように結合します。

## 上手く動作しない場合
* .htaccessファイルの文字コードやサーバーの文字コード設定（AddDefaultCharsetなど）がUTF-8に統一されているかを念のため確認して下さい
（特に日本語を扱う場合はUTF-8が必須となります。）
* URLエンコードが正しいか確認してください
* リダイレクト先にURLエンコード済の文字列を記述する場合、%を全てエスケープして記載してください
例：`%E5%85%88` ⇒　`\%E5\%85\%88`
* NEオプションが付与されているか確認して下さい

## 補足
遷移先のパラメーターはURLエンコード済の状態では勿論ですが、日本語でも一応記述可能です。
RewriteCondの方は文字コードや設定が合っていれば問題ないと思うのですが、調べている過程でこちらも%にエスケープ処理を施さないと動作しない旨の記事が幾つもあり、もしかすると環境によるのかもしれません…。
（どなたか分かる方がいましたら教えて下さい。）
Top Comprehensive List of Data Science Cheat Sheets

![6f945ce8-08ce-4961-b2a2-94825fad0ee9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3986617/5025e2a5-e75b-4a60-1c6a-d1d0c0150193.jpeg)

# Python Cheat Sheet (NumPy, pandas, scikit-learn)
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

Read More :- https://silentbulk.weebly.com/blog/how-to-make-peanut-butter-easy-step-by-step-recipe-homemade-peanut-butter-recipe


# NumPy Quick Reference
arr = np.array([1, 2, 3, 4])
mean = np.mean(arr)  # Mean of array

# pandas Quick Reference
data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
df = pd.DataFrame(data)
df.head()  # View first few rows

# scikit-learn Quick Reference
X = df[['Age']]
y = df['Name']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# R Programming Cheat Sheet
# R provides similar functionality for data manipulation and visualization
# Example:
# df <- data.frame(Name=c("Alice", "Bob"), Age=c(25, 30))
# summary(df)

# SQL Cheat Sheet (Basic Query Examples)
# Basic SQL query structure
SELECT Name, Age FROM users WHERE Age > 25;

# Machine Learning Cheat Sheet (Model Training Example)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)

# Deep Learning Cheat Sheet (Using TensorFlow/Keras)
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    Dense(64, activation='relu', input_dim=8),
    Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# Statistics Cheat Sheet (Common Formulas)
import scipy.stats as stats

mean = np.mean(arr)  # Mean calculation
std_dev = np.std(arr)  # Standard deviation
p_value = stats.ttest_1samp(arr, 0)  # One-sample t-test

# Data Visualization Cheat Sheet (Matplotlib & Seaborn)
import matplotlib.pyplot as plt
import seaborn as sns

# Simple plot using Matplotlib
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()

# Simple plot using Seaborn
sns.boxplot(x=df['Age'])
plt.show()
CloudWatch ログのインサイトで部分一致検索を行う方法

CloudWatchのログのインサイトで部分一致検索をする方法についてのメモ

## 部分一致検索の方法

* filterコマンドを使用し、検索対象のフィールドを指定します（通常は `@message`）
* like演算子を使用し検索したいワードを指定
* 検索ワードをスラッシュ（/）またはクオテーション（""）で囲む

## 実行例

例えば、"error"という単語を含むログを検索する場合は以下のようになります。

```text
fields @timestamp, @message
| filter @message like /error/
| sort @timestamp desc
| limit 1000
```
:::note warn
このクエリは大文字小文字を区別しないため"ERROR"や"Error"なども検索結果に含まれます
:::

### 複数ワードでの部分一致検索
複数のワードを組み合わせて検索する場合はANDやOR演算子を使用する。

```text
fields @timestamp, @message
| filter @message like /error_1/ AND @message like /error_2/
| sort @timestamp desc
| limit 1000
```
CloudFrontでメンテナンス(503)のレスポンスを返すAPIを設定する(CORS対応版)

CloudFrontの関数でメンテナンス(503)を返却するプログラムです。
あとはこれをビューワーリクエストに設定すればOKです。

以下手順です。
# 手順1:CloudFront関数を作成する。
1. CloudFrontコンソールを開き、左ペインから「関数」をクリックし、「関数を作成」をクリック。
　関数名：maintenance
　Runtime：cloudfront-js-2.0
として、「関数を作成」をクリック。

2. 「関数コード」に以下をコピペして、「変更を保存」をクリック
3. 「発行」タブをクリック後、「関数を発行」をクリック　※忘れがちなので注意
```shell:maintenance
function handler(event) {
    // メンテナンスモード時はここを手動で動かす
    const isMaintenance = false <===== メンテナンス時は true に設定する
    const maintenanceStart = "2025年1月1日 00:00"
    const maintenanceEnd = "2025年1月3日 23:59"
    // 手動で動かすのここまで

    const request = event.request

    if (!isMaintenance) {
        // メンテナンスモード中以外はそのままリクエストをオリジンに通す
        return request
    }

    const response = {
        statusCode: 503,
        statusDescription: 'Service Unavailable',
        headers: {
            'content-type': { value: 'application/json' },
            'access-control-allow-credentials': { value: 'true' },
        },
        body: JSON.stringify({
            "maintenanceStart": maintenanceStart,
            "maintenanceEnd": maintenanceEnd,
            "message": "システムメンテナンス中です。"
        })
    }

    // メンテナンスモード中もオリジンへのアクセスを許可するIP群
    const allowedIPs = [
       '1.2.3.4',
    ]

    // 許可オリジン フロントエンドのオリジン
    const allowedOrigins = [
        'https://hogehoge-frontend.com' <===== フロント側のURLを指定する（CORS対策）
    ]

    const clientIP = event.viewer.ip
    const origin = request.headers.origin ? request.headers.origin.value : ''

    if (allowedIPs.includes(clientIP) || request.method === 'OPTIONS') {
        // OPTIONS か 許可IP の場合は通す
        return request
    } else if (allowedOrigins.includes(origin)) {
        // レスポンスヘッダーに許可されたオリジンを設定することでCORS違反を避ける
        response.headers['access-control-allow-origin'] = { value: origin }
    }

    return response
}
```

# Step2:ビューアーリクエストの設定
1. 左ペイン「ディストリビューション」をクリックし、該当のディストリビューションのリンクをクリック
2. 「ビヘイビア」タブをクリックし、該当のビヘイビアをチェックして「編集」クリック
3. ページ下部にある「ビューアーリクエスト」から
　関数タイプ：CloudFront Functions
　関数 ARN/名前：maintenance
 を選択して「変更を保存」クリック

これで、HTTP503が返却され、メンテナンスになる。
あとは、フロントエンド側で HTTP503が返却されたら、それなりの画面を作ればOK。

以上
コントローラの仕様書

>## Controller specs

コントローラ仕様書は`type: :controller`を印付けるまたは`spec/controllers`内のspecを置くことで`config.infer_spec_type_from_file_location!`を設定した場合に印づける
>Controller specs are marked by type: :controller or if you have set config.infer_spec_type_from_file_location! by placing them in spec/controllers.

コントローラ仕様書はrailsの機能テスト(ActionController::TestCase::Behavior)に対してRSpecのラッパーです。各例でシングルhttpリクエストの模擬を行い、その時の期待された次のような出力を明示する。
>A controller spec is an RSpec wrapper for a Rails functional test (ActionController::TestCase::Behavior). It allows you to simulate a single http request in each example, and then specify expected outcomes such as:

レンダリングされたテンプレート
>- rendered templates

リダイレクト
>- redirects

ビューと共有されたコントローラ内で割り当てられたインスタンス変数
>- instance variables assigned in the controller to be shared with the view

レスポンスと一緒に送り返されたcookie
>- cookies sent back with the response

出力を指定するには、（下のやつ）使うことができる
>To specify outcomes, you can use:

標準的RSpecマッチャー
>- standard rspec matchers (expect(response.status).to eq(200))

標準`test/unit`のアサーション(主張）
>- standard test/unit assertions (assert_equal 200, response.status)

railsのアサーション
>- rails assertions (assert_response 200)

<strong>railsの具体的マッチャー<strong>
>- rails-specific matchers:

>render_template
```rb
expect(response).to render_template(:new)   # wraps assert_template
```
>redirect_to
```rb
expect(response).to redirect_to(location)   # wraps assert_redirected_to
```
>have_http_status
```rb
expect(response).to have_http_status(:created)
```
>be_a_new
```rb
expect(assigns(:widget)).to be_a_new(Widget)
```

### Examples
```rb
RSpec.describe TeamsController do
  describe "GET index" do # indexアクションをする
    it "assigns @teams" do　# @teamsに割り当てられたか
      team = Team.create　# モデルを保存させる
      get :index　# indexアクションでページを取得させる
      expect(assigns(:teams)).to eq([team]) # (assigns(:teams)と[team]が等しい値か？
    end

    it "renders the index template" do　# インデックステンプレートをレンダリングする
      get :index　                      # indexアクションに対してgetリクエストをする
      expect(response).to render_template("index") # 変数responseとrender_template("index")になったか?
    end
  end
end
```
### Views
初期値によって、ビューはレンダリングされない。詳細のためにスタブ化されたビュー（リンク）とrender_views（リンク）を見て下さい
>by default, views are not rendered. See views are stubbed by default and render_views for details.
### Headers
コールでヘッダーを設定したい場合、リクエストスペックを使うことを薦めます。今まで通りカスタムhttpヘッダー付きのコントローラスペックを使いたいならば、`request.headers`を使える
>We encourage you to use request specs if you want to set headers in your call. If you still want to use controller specs with custom http headers you can use request.headers:
```rb

require "rails_helper"

RSpec.describe TeamsController, type: :controller do
  describe "GET index" do #
    it "returns a 200" do # 200番が返ってきて欲しい
      request.headers["Authorization"] = "foo"
      get :show
      expect(response).to have_http_status(:ok) # have_http_status(:ok)で200番と等しいと考える
    end
  end
end
```
https://rspec.info/features/6-0/rspec-rails/controller-specs/
Raspberry Piで作るsipカメラ

asteriskで出来ることを考えてたら、sipカメラの存在を知りました。
raspiで出来ないかと考え、できるかもと思い、作りました。
WebRTCで観るのではなく、SIPソフトフォンで観るのにしました。
スマホのソフトフォンから、内線番号をダイヤルすると、カメラの映像がみえます。

### ハードとソフト 
#### Rasberry Pi
* Raspberry Pi 3B
* CSIのとこにつける、ov5674なカメラ
* raspi os (bookworm 32bit)
* libcamera-tools
* baresip
#### Rasberry Pi以外 
* asteriskが乗った、openwrt機
* ddnsサービス
* スマホのソフトフォン、Zoiperかacrobits(どちらも有料)

### raspiのカメラの動作チェック
```
$ rpicam-vid -n -o movie.h264 --save-pts movie.pts -t 10000
$ mkvmerge -o movie.mkv --timecodes 0:movie.pts movie.h264
``` 
で、できたmovie.mkvをscpでデスクトップ機に持ってきて確認しました。
#### v4l2
baresipを起動すると、v4l2関係のエラーが出ます。
csiのカメラのv4l2は、素だとおかしいのだそうで、v4l2を使うコマンドは、先頭にlibcamerifyと書いてそのコマンドを通して起動する必要があります(v4l2-ctlとか、表示が変わります)。
```
$ sudo apt install libcamera-v4l2 libcamera-tools
```
で、インストールします。

### openwrt, asterisk
openwrtは、新たにrtpポートをあけました。
ローカルdnsで、ddnsのFQDNは内部アドレスで返します。

openwrt上のasteriskは、
endpoint/allow = h264,ulaw
としました。
aor/remove_existing = yes
も追加しました。

### baresip
baresipを一度起動すると、.baresipフォルダーに設定ファイル一式のひな型ができます。
.baresip\/accountsは最終的にこうなりました。
```
<sip:「内線番号」@「asteriskのIP」:「asteriskのport」>;transport=udp;auth_pass=「内線番号のパスワード」;answermode=auto;regint=60
```
.baresip\/configは、certと音声関係をコメントアウトし、動画関係は、
```
#video_source           v4l2,/dev/video0
#video_display          x11,nil
#video_size             352x288
video_size              320x240
#video_bitrate           500000
video_bitrate           2000000
#video_fps               25.00
video_fps                 5.00
video_fullscreen        no
#videnc_format           yuv420p
``` 
の様にしました。必要なmoduleは、avcodec.so、v4l2.so, v4l2_code.soなどと思います(無駄があってもよい)。
avcodecはdefaultではlibx264ですが、h264_v4l2m2mも使えます。
~~ソフトフォンによって、挙動がちがうのでどちらがいいか決めかねています。~~ ~~Zoiper以外h264_v4l2m2mだと、フレームがたまにしか更新されないので、libx264のほうがいいです。~~ (ビットレートとフレーム数を調節したら、どちらもうまくいくようになりました)
```
$ libcamerify baresip
``` 
で、起動します。

### ソフトフォンで掛けてみる
video対応のソフトフォンでbaresipの内線に掛けて映るか試します。すぐ映るときと数十秒かかるときがあり、映らないと判断するのが大変です。
lan内かどうかとか、video通話の始め方とかソフトフォンによって変わるので、試行錯誤して下さい。

### ~~結局、実用的でない~~ 使えなくもない
~~しばらく使わないでいると、baresipが見つからないというエラーで、baresipの再起動が必要になってしまいます。~~ .baresip/accountsに;regint=60を追加して~~様子を見ています~~調子がいいです。どうも、タイマーが止まるか遅れているような気がします。
~~それと~~、lan内とスマホ回線で、どちらもうまくいくソフトフォンが見つかりません。

#### いろいろ試したソフトフォン
android端末、docomo simでいろいろ試した結果です。
* linphoneは、lan内ではうまくいきますが、スマホ回線では、stunを指定してもうまくいきません。 
* Zoiperは、lan内(stunなし)とスマホ回線(stunあり)と設定を切り替えれば、videoは映ります。ですが、スマホ回線のとき内線の他の電話にかけると音声が片側だけになります。ドアホンに拡張したときに、問題になります。 
* acrobitsは、~~stunのありなしの切り替えが必要になりますが、どちらの回線でもうまくいきます。~~ 「環境設定」「ネットワーク」でRTPのネットワーク優先度をモバイルデータにすれば切り替えの必要がありません。しかし、videoは縦いっぱいにひきのばされ、左右が切り取られたものになります。 

なので、通話が必要なければ、lan内ではlinphoneをスマホ回線ではZoipherと使い分ければいいと思います。
通話が必要な時は、acrobitsになります。ちなみにv4l2でカメラの回転はできなくなったようです。
DNATの先はDNATにできない？ ~iptablesの制約とKubernetesの裏側~

Kubernetesやネットワーク構成を扱う際、DNAT（Destination NAT）の仕組みをよく目にします。「ServiceのVirtual IPをPod IPに書き換える」「外部アクセスを特定のノードやPodへ転送する」――いずれもDNATが裏で動いているケースです。

ところが、ここで1つ不思議な疑問が生まれます。「DNATされた先を、さらに別のDNATで書き換えることはできるのか？」様々な事例やトラブルシューティングで、この疑問に突き当たる方がいます。しかし結論から言うと、一般的には「できない」「やりづらい」という答えになります。本記事では、この仕組みと理由を解説していきます。

## 1. DNATとは？

まず改めてDNATをおさらいしましょう。DNAT (Destination NAT)とは、受信パケットの宛先情報（IPアドレスやポート）を書き換える技術のことです。Linuxのnetfilter/iptablesでは、主にnatテーブルのPREROUTINGチェーンなどで設定します。

* 例: 「外部からNodeの80番ポートに来た通信を、Podの8080番ポートに転送する」
    * PREROUTINGで-d <NodeIP> --dport 80のパケットを-j DNAT --to-destination <PodIP>:8080のように指定する

Kubernetesでは、このDNATが各ノードで自動的に設定され、Service(ClusterIP)の宛先をPodIPに振り分ける仕組みが実装されています。

## 2. 「DNATの先をさらにDNAT」できないのはなぜ？

結論から言うと、iptablesでは基本的に二重DNATができません。この大きな理由は以下のとおりです。

1. iptablesのNATは1回の変換を前提としている
    * iptablesのNATは接続トラッキング（conntrack）と連携して、パケットフロー単位でNATを行います。最初のパケットに対して一度DNATを適用すると、以後の同じコネクション上のパケットは「すでに変換済み」として扱われ、原則再度DNATは行いません。

2. DNAT後にルーティングが走るので、パケットがPREROUTINGに戻らない
    * DNATは多くの場合PREROUTINGで適用されます。ここで宛先IPが書き換えられた後は、Linuxカーネルのルーティングテーブルを参照してパケットの行き先が決定します。同じ方向のパケットが再びPREROUTINGに流れ込むことはなく、結果として「DNATの先でさらにDNAT」という動きは発生しません。

3. 特殊な構成を組めば二重DNATができる場合もあるが、一般的でない
    * 理屈の上では、別ホストに配送された後に、そこでまたDNATを行うことは可能です。しかし「同じホスト内でPREROUTING → DNAT → 再びDNAT」といった多段構成は、標準のiptablesでは想定されていません。

## 3. KubernetesのServiceで見られるDNAT

Kubernetesでは、Service(ClusterIP)あてのパケットをPodIPにDNATすることでトラフィックを転送します。具体的には、Node上に作られるKUBE-SERVICESやKUBE-POSTROUTINGチェーンなどで、以下の手順が実行されます。

1. PREROUTINGでDNAT
    * ServiceのClusterIPにあてられたパケットを、選択したPodIP:Portに書き換えます。

2. ルーティングテーブルによりPod宛てと判断
    * 書き換えられたあとは、Podが動いているNode内部、もしくは別のNodeへのルーティングが行われます。

当然ながら1回のDNATで宛先が確定すると、その後さらにDNATをかけるケースは想定されていません。これが「DNATの先を再度DNAT」は難しいという背景に直結しています。

## 4. よくある疑問・トラブルシューティング

### 4.1 「外部ロードバランサ → NodePort → Pod でさらにDNATは？」

Kubernetesでは外部ロードバランサがNodePortにトラフィックを流し、NodePortを経由してPodに行くときもDNATが行われます。しかしこれも本質は「外部LB → NodePort → DNAT → Pod」のひとつの流れであって、一つの連続した接続をトラッキングしているため、二重にDNATするわけではありません。

### 4.2 「ServiceからほかのServiceへ転送するとDNATは再度行われる？」

同じNode上でService A → Service Bにリクエストする場合、パケット自体は別のコネクションとして扱われるため、再びDNATが行われる可能性はあります。ただしこれも「まったく別の接続として」DNATされているにすぎません。

## 5. それでも二重DNATをしたい場合のヒント

もし何らかの要件で「DNATの先でさらにDNAT」を実現したいケースがあるなら、以下のような方法を検討できます。

1. 別のホストや機器を挟む
    * DNATが適用された後、別ホストに配送された段階で新たなDNATをかけることは可能です。

2. OUTPUTやPOSTROUTINGチェーンなどで別途NAT
    * 一方向でDNATし、戻りの方向でSNATするといった複雑な構成を組む場合はあります。ただし管理が難しく推奨はされません。

基本的にはネットワークが複雑になるデメリットの方が大きいので、設計の段階で可能な限り「多段DNAT」は避けるのがおすすめです。

## まとめ

* DNATの先をさらにDNATできない理由
    1. iptablesのNATはコネクション追跡（conntrack）との連携で「一度変換したコネクションを再び変換しない」
    2. DNAT後はルーティングが走るため、同じパケットはPREROUTINGに戻らない

* KubernetesのServiceやNodePortも同様の仕組み
    * いずれも1回のDNATで宛先をPodIPに書き換えたら終了

* どうしても二重DNATが必要な場合は
    * 別ホスト経由など、特殊な設定が必要で一般的でない

iptablesが持つ「NATは1コネクションにつき1回」という設計を知っておくと、Kubernetesやネットワークのトラブルシュートにも役立ちます。二重DNATによる複雑化を避けられるよう、システム設計時にはフローをシンプルにするのがおすすめです。
個人的な備忘録：シェルスクリプト実行時に記述する『#!/bin/bash』について自分なりに深掘りしてみた

## はじめに
`#!/bin/bash` は シバン（Shebang） と呼ばれる記述で、スクリプトの冒頭に記述します。

:::note warn
**この記述には、スクリプトを実行する際に使用するインタプリタを指定するという重要な役割があります。**
:::

普段、ちょっとした作業を効率的に自動化するためにシェルスクリプトを活用しています。

***この記事は個人レベルの備忘録としてまとめたものですが、どなたかの技術の支えになれば幸いです。***

## 書こうと思ったきっかけ
いつもスクリプトの冒頭に書いている `#!/bin/bash` について、「**なぜこれを記述しているのか**」を自分で言語化できていないと感じたため、記事として整理することにしました。

:::note info
**実はこの記述について、特に誰かに教わったわけではなく、「***なんとなくのおまじない***」として使っていることが多かったのです。**
:::

***そこで、改めてその意味を調べ、まとめておこうと思いました。***

記事の中では、簡単なシェルスクリプトを実行する例を交えながら、#!/bin/bash の役割について解説していきます。

## `#!/bin/bash`とは？

`#!/bin/bash` は、スクリプトを実行する際に Bash（Bourne Again Shell） を使用することを指定する記述です。

スクリプト内のコマンドや構文が、指定されたインタプリタ（ここでは Bash）によって解釈され、実行されます。

**例:**

```bash
#!/bin/bash
echo "Hello, World!"
```

このスクリプトを実行すると、`bash` が指定されているため、Bashシェルが使用されてコマンドが解釈されます。

### シバンがない場合の動作
シバンがないスクリプトを実行すると、デフォルトのシェル（環境によって異なる場合があります）が使用されます。

:::note alert
**これにより、構文の違いによってスクリプトが正常に動作しない可能性があります。**
:::

### 他のインタプリタの例
シバンで指定するプログラムを変更することで、Bash以外のインタプリタを使用することもできます。

**POSIX準拠のシェル**

標準的なシェルスクリプトで使用されるインタプリタです。

```bash
#!/bin/sh
```

**Python**

Pythonスクリプトを実行する際に指定します。

```bash
#!/usr/bin/env python3
```

**Perl**

Perlスクリプトを実行する場合に使用します。

```bash
#!/usr/bin/perl
```

**Node.js**

Node.jsスクリプトを実行するための指定です。

```bash
#!/usr/bin/env node
```

## 実行方法
スクリプトを実行する際、以下の手順でシバンで指定されたインタプリタを使用します。

```bash
chmod +x script.sh  # 実行権限を付与
./script.sh         # スクリプトを実行
```

シバンがない場合、インタプリタを明示的に指定して実行します。

```bash
bash script.sh
```

## 実際にやってみた
ここでは、冒頭で紹介したシェルスクリプトを作成し、実行してみます。

### 1. スクリプトを作成する
まず、`vi` コマンドでスクリプトファイルを作成します。ここでは `hello.sh` という名前にします。

```bash
vi hello.sh
```

`vi` の編集モードに入るために、`i` キーを押して挿入モードに切り替え、以下の内容を入力します。

```bash
#!/bin/bash
echo "Hello, World!"
```

#### 編集を終了して保存する方法

1. **Esc キーを押す**  
   - 挿入モードを終了します。

2. **`:wq` と入力する**  
   - これは「書き込み (保存)」と「終了」を意味します。

3. **Enter キーを押す**  
   - コマンドを実行し、編集内容を保存して終了します。

### 2. 実行権限を付与する
スクリプトに実行権限を付与します。

```bash
chmod +x hello.sh
```

### 3. スクリプトを実行する
以下のコマンドでスクリプトを実行します。

```bash
./hello.sh
```

結果は以下のように表示されます。

```bash
Hello, World!
```

## まとめ
ここまでお読みいただき、ありがとうございました。

:::note warn
***今回の内容は基本的なものですが、こうした基礎を丁寧に学ぶことがシェルスクリプトを上達させる近道だと思っています。***
:::

今後も基礎的な内容を積極的にアウトプットし、**自分の知識を整理しながら振り返っていきます。**
【クエリビルダ：拡張表現】ValueStoreSet と ValueStoreGet

# はじめに #
この投稿では、**ValueStoreSet**と**ValueStoreGet**の関数がどのように機能するかを見ていきます。
これらの関数を使うことで、値をメモリに保存し、クエリセッションでその値をメモリから取得して使用することができます。
これは、一般的なプログラミング言語で変数を準備し、その変数に値を代入して、後でその値を取り出して使用するという概念に似ています。

# リソースの準備 #
この記事を書く際、良い実用的な例が思い浮かびませんでした。
そのため、実用的ではありませんが、これらの関数を使って以下の結果を表示する例を準備しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f34f772b-907a-b441-2f08-ebbe1b05cb62.png)

UNIONクエリを使用します。
UNIONの最初のクエリ（親クエリ）では、このデータセットから黄色、青、赤のアイテムの合計額を計算し、その値をValueStoreSet関数を使ってメモリに保存します。
その後、2番目以降のクエリでValueStoreGet関数を使って結果を表示します。

データセットは次の通りです；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4488ad4e-f158-3176-f29e-329010ad2322.png)

これらの行はUNIONクエリによるものです；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/263ee9fd-5ebc-6746-6ec6-3f3a3387e6c0.png)

## クエリの定義 ##
### 親クエリ ###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e009b1f8-9cb1-c777-8e3f-f0d98318ada0.png)
```
"コード::String","色::String","金額::Number"
"A100","赤",200
"A200","青",159
"A300","青",356
"A400","赤",211
"A500","黄",255
"A600","赤",1200
"A700","青",2100
"A800","赤",1940
"A800","青",100
"A900","赤",320
"A100","赤",89
"A110","青",20
"A120","黄",12569
"A130","赤",568
"A140","赤",400
"A150","黄",550
"A160","赤",600
"A170","青",570
"A180","黄",420
```

1. 上記に示されたカンマ区切りのリストがデータソースとして使用されます
1. これらの3つの拡張表現は実際に各色の合計額を計算します
    黄色を例にすると、最初の行では「黄」と記載された行がその金額を表示し、それ以外の色の場合は0を表示します
    2行目以降では、現在の行が「黄」を示している場合、その金額を前の行のこの列の結果に加算します。それ以外の場合は、前の行のこの列の値をそのまま返します
    最後の行になると、この列には黄色の合計額が表示されます
    ```
        IIF(StartOfReport
            ,IIF({%色}="黄"
            	, {%金額}
            	,0
        	)
            ,IIF({%色}="黄"
            	,{%Previous:黄色の合計}+{%金額}
            	,{%Previous:黄色の合計}
        	)
        )
    ```
3. 各色の合計額は、ValueStoreSet関数を使ってメモリに保存されます
例えば黄色用の拡張表現では、上記2の拡張表現で計算された黄色の現在の合計値を保存します
最後の行までくると、黄色の総合計額がメモリに保存されるという仕組みです。指定されたコード YELLOWTOTAL で保存されている値を取得できます。 

    ```
    ValueStoreSet("YELLOWTOTAL", {%黄色の合計})
    ```

### ユニオンクエリ ###
3つのUNIONが定義されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f345ead1-b7ce-85a1-1914-c7a1259e1782.png)
各ユニオンクエリは、メモリに保存された各色の合計額を表示します。  
これらのクエリは、合計額を表示するだけでよいため、1行だけを返すように設計されています。  
こちらは「黄色」の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a87de82f-1990-a003-1f42-7957b4fb1670.png)
拡張表現（コード）と（色）は、これらのタイトルを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cc4932cc-fc75-1d87-e1d4-b39c19e24f52.png)

# 実行結果 #
その結果、合計額は親クエリによって正しく計算され、メモリに保存され、UNIONクエリによってメモリから正しく取得されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d7ddf6ec-ba79-791b-4cb7-5c7d916ef4ff.png)

# あとがき #
ここでの例は特に意味があるものではありませんが、これらの関数の使用方法が皆様に伝われば幸いに思います。
Matplotlibを用いてプレゼンスライドに直接貼れる図を作るwith統計的検定の有意差の星を表示

# 図を作るの大変
Matplotlibなどで，図を作るのが大変だと思ったことはないですか？私はあります！  
線の太さを太くしたり，外れ値のマークを入れ替えたり，x軸やy軸のメモリを書き換えたり，**統計的検定の星を打ったり** etc  ...
プロット対象のData Frameを渡すことにより，自動的に有意差の星までプロットするプログラムがあれば，そのまま図をスライドに貼れるなとずっと思ってました．今回は，上記のスタイル調整と統計的検定・描画を行えるプログラムを作成したので，共有したいと思います．  
つたないプログラムですが，同じような悩みがある人の役に立てれば幸いです．  

# どんな感じの図を表示できるの？
プログラムをまとめたGithubは以下のページです．
[Github](https://github.com/yoriku/plot_graph_for_thesis)

こんな感じのプログラムで
```python:sample.py
plot = PLOT(save_mode=["png"], figsize=(12,8), font_size=30)
df = plot.convert(df, hue="target", x="features", y="number")
color = plot.get_color("pastel")
plot.box(df, "pic/adjust", x="features", y="number", hue="target", yticks=[-5,0,5], color=color)
```
こんな感じの図を表示できます．
![adjust.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3985926/c783783a-0318-0149-0f7d-41ce7e000c8d.png)

基本的に，X軸とY軸の線をそこそこの太さにし，上側と右側の線を消すスタイルで描画します．そして，図の上部に統計的検定の結果有意差が見られた指標には星を打つものとなっています．

## 表示可能な図の一覧
少ないですが，私が常用する図だけとなってます．
- 箱ひげ図（`sns.boxplot`）
- 線グラフ（`sns.lineplot`）
- 棒グラフ（`sns.barplot`）
- 混同行列（`plt.imshow`）
- スペクトログラム（`ax.pcolormesh`）

## 主な機能
線の太さ・色，図のスタイルのほかに，以下に示す機能があります．（すべてではありません）
1. X軸とY軸のラベルの調整，X軸とY軸の範囲の設定
各関数において，引数`xticks``yticks`に設定したいメモリのリストを設定すると，その始まりの値が`ylim`の下限値，最後の値が`ylim`の最大値に設定され，各リストは`set_yticks`に渡され，メモリの値に設定されます．
  
2. メモリ文字列の回転
各関数において，引数`rotation`にメモリの回転角度を設定すると，値が`set_rotation`に渡され，X軸のメモリの文字が回転します．
  
3. 統計的検定
各関数において，引数`stats`に検定名等を渡すと，自動的に検定が行われます．これは，すでに[vistats](https://qiita.com/tokudo/items/7c2dd1688e31abe6789d)として実装されているものにインスパイアを受けて実装したものになります．
vistatsとの大きな違いは，**`hue`の引数で示された指標に基づき分割されたクラス**に対して**検定を自動で実施**し，描画する点です．以下のパラメータで検定の方法などを調整します．`stats=None`を指定するとこの項の処理は行われません．
- `stat_name`：検定の方法を指定することができます．`brunnermunzel`を指定するとBrunner-Munzel検定を`welch`を指定するとwelchのt検定を行います
- `adjust_name`：多重比較の補正方法を指定することができます．本検定は，表示されるすべての群間で実施されるので，基本的に補正をする必要があります．`bonferroni`（bonferroni補正），`holm`（holm補正），`fdr_bh`（Benjamini-Hochberg補正）などを使用できます
- `stat_mark`：有意差の星の形状を指定できます．基本的には`*`を使用すると思います．`None`を指定するとp値をそのまま表示します

## 使い方
１. PLOTクラスをインスタンス化
PLOTクラスをインスタンス化します．この時，図・フォントのサイズや保存する拡張子などを指定します．
```python:sample.py
plot = PLOT(figsize=(10, 8), font_size=20, is_times_new_roman=False, save_mode=["png", "pdf"])
```
pdfはAffinityなどのソフトで使用するため，透過した状態で保存されます．
また，figsizeは各グラフ描画時にも指定することができます．

２. データフレームの変換
必要に応じてデータフレームを縦持ちに変換します．データフレームの縦持ちと横持ちについては，[こちら](https://www.yutaka-note.com/entry/pandas_wide_long)をご覧ください．
```python:sample.py
df = plot.convert(df, hue="target")
```
ここで，`hue`はクラスを分ける目的変数の列名を表します．例えば，irisデータセットであれば"variety"，タイタニックデータセットでは"Survived"などです．
また，ここで，`x`や`y`の列名を指定することで，描画するX軸とY軸のラベルを設定することができます．例えば，最初に例示した図では，`x="features", y="number"`を指定しており，図に反映されています．

３. プロット
以下のように，図を描画します．
```python:sample.py
plot.bar(df, "test")
```
デフォルトのまま体裁を気にしないのであれば，データフレームと保存ファイル名を指定するだけで，図を描画することができます．`hue`で目的変数を指定すると検定等を実施します．2の工程で`x`や`y`の列名を指定した場合は，その値を`x="features", y="number"`のように引数を指定してください．

引数などの詳細は，Githubのほうをご確認ください．
`test.py`にirisデータなどを用いたプログラムの例を置いています．

# 最後に
初めてQiitaに記事を書いたので，問題点などがあれば教えていただけますと幸いです．
また，つたないプログラムなのですべてが未保障です．何が起こっても自己責任として笑って見過ごして下さい．
IT未経験？むしろ最高！現役エンジニア講師と人生をアプデせよ！

![mikeikenkenshu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/79d614ec-3a5a-8d7f-cca4-a7fcb3387749.jpeg)

エスプリフォートは、技術の積み重ねにより先進性とクオリティの向上・維持を行い、お客様に価値ある提供を行うべく活動しています。そのためには技術力の向上は必要不可欠であり、そのための技術教育に真摯に取り組んでいます。

そこで、我々の技術教育陣がどのような技術教育を行っているか、その想いと内容の一部をご紹介したいと思います｡

その前に、まずは筆者（技術教育陣の一人）について、少しだけ自己紹介をさせて頂きます｡

# 筆者（技術教育陣の一人）はこんな人
筆者（技術教育陣の一人）は、IT業界でシステム開発に携わって20年以上経験している現役エンジニアです。様々な経験をしてきており、WEB、オープン、アプリ、組込、汎用などといったシステムだけでなく、インフラ構築まで深く幅広くIT技術に触れてきました。

システム開発で使われるプログラム言語もCOBOLやRPGといったものから、JavaやC#、PHP、PYTHON、TypeScript、C++など、幅広く使ってきました。他には、React、Vue.js、Angular、Next.js、Nuxt.js等にも触れてきています｡

もちろん最初から多くのプログラム言語を使えるようになったのではなく、「どうしたらいいのだろう？」と時には問答しながら今まで歩んできましたし、今でも学びを続けています｡

# 技術教育陣の想い
プログラムを学んでIT業界で手に職をつけていきたい、でもプログラムって難しい、教えて欲しい、サポートして欲しい、という方はおられませんか？

ITスクールや動画で学んでみたものの、やっぱりうまくできなかった、という方はおられませんか？

我々技術教育陣は、**ITエンジニアとしての『面白さ』や『やりがい』、『充実感』を少しでも多く、そして少しでもはやく体験して欲しい**と思っています｡

もちろんIT業界にかかわず、新しいことを学ぶことは大変なことです｡なかなかうまく進まない時もあるでしょう｡

筆者（技術教育陣の一人）も多くの方と同じく、時に迷い、悩みながら学んできたひとりです。だからこそ、今プログラムを学ぶ方、これから学んでいきたいと思う方を全力でサポートし、**今後ITエンジニアとして活躍する人財になって頂き、『面白さ』『やりがい』『充実感』を味わってほしい**、と心から想っています｡

# こんなふうにやってます
ここから、筆者ら技術教育陣が具体的にどのようなサポートを行っているか、をご紹介していきます。

## 講師は全員『現役のITエンジニア』
技術教育陣は、**全員が現役のITエンジニア**として活躍しています。そして、年間何十冊もの書籍や多数のサイトから技術やビジネススキルなどを学び、実践して自分を磨き続けている経験豊富なベテランエンジニア講師もいます｡

そのため、講習では実際に開発現場で使われている技術や見識などを「こんな風に使われているよ」と、**実務のことも踏まえて教えています**。

多数の未経験の方々を教育してきた豊富なノウハウを元に、

**「プログラム初心者の何が壁となっているか」
「その壁を自ら乗り越えていくためのやり方にはどのようなものがあるか」
「身につく学習方法のノウハウとは何か」**

などを研修の中で教えたり、別途サポートして教えることも行っています。[^1]
逆に、未経験の方がよくしている学習方法で

**「この学習方法をすると必ず身につかない」**

などということも、学習アンチパターンとして教えていたりもします。

## テキストはほとんど技術教育陣による「自作」
教育のためのテキストを用意していますが、これらテキストのほとんどは、我々講師陣がイチから独自に作成したものです。

また、市販の書籍や広く公開されているテキストを使用することもありますが、これらも単にそのままなぞるだけのことはせず、**「ここは伝えるべき」「ここは今でなくても良い」と取捨選択**をしています。

また、**書籍には載っていない実務でしか知りえない必須の知識もある**ため、実務で困らないようにこだわって作っています。

## 教え方は内容に合わせて
講習は「学ぶ内容を理解し、覚えるために、テキストと最適な練習問題を交えて、**講習内容に合わせて座学や実習という形式**」で受講します。

知識や理論として蓄えるものであれば、学校のように講師から説明があってその後練習問題を解いて理解を深めるような座学による講義形式、プログラムのように自分で作っていく経験が重要となるものは実習形式というように、講義内容に最適な形式で行っています。

弊社では講習で、**<font color="red">テキストを渡して「これやっといて」と放っておくことは決して行いません</font>**。
またテキストを単になぞるだけの講習も行わず、**必ず講師自身の経験も踏まえて講師の言葉で伝える**ようにしています。

また、受講そのものもは**一人ひとりに目と手が手厚く届くように、あえて少人数制**にしています。

加えて、課題による自主学習や理解度チェックを適宜、行っています｡
これにより、「自分が何を理解できていて、何が理解できていないか」の現状を知りながら、学ぶことができます｡

全て「まずは土台をしっかり作ることが大事」との想いがあり、このやり方を採用しています｡

# ITエンジニアとして成長していくために
技術講習修了後ももちろん、今後ITエンジニアとして自走していけるためのサポートを継続して行っています。

わからないことや困った時はいつでも相談して下さい、講師を引っ張り回してください、と受講者全員に必ず伝えていますし、相談された際には必ず回答するし、内容によっては悩みの対象を個別に解決する時間をしっかりとります。

# 仲間を募集しています
我々、技術教育陣の想いが少しでも伝わっていたら、嬉しく思います。

技術教育陣も現状に満足することなく、日々改善を重ねていっています。

エスプリフォートでは、「エンジニアになりたい！」あなたを全力で応援しています！

https://www.esprit-fort.co.jp/

https://www.esprit-fort.co.jp/recruit/index.html

[^1]:そして弊社には技術教育陣以外にも、優しくサポートしてくれる仲間が多くおります。
Javaで「ラベルに画像を表示する」の動作を確認してみた。

# 概要

Javaで「ラベルに画像を表示する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jlabel/index6.html

# 実装

以下のファイルを作成しました。

```Sample.java
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import java.awt.BorderLayout;

class Sample extends JFrame{
  public static void main(String args[]){
    Sample frame = new Sample("MyTitle");
    frame.setVisible(true);
  }

  Sample(String title){
    setTitle(title);
    setBounds(100, 100, 728, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    ImageIcon icon1 = new ImageIcon("./check.png");
    ImageIcon icon2 = new ImageIcon("./batsu.png");

    JLabel label1 = new JLabel(icon1);

    JLabel label2 = new JLabel();
    label2.setIcon(icon2);

    JPanel p = new JPanel();
    p.add(label1);
    p.add(label2);

    add(p, BorderLayout.CENTER);
  }
}
```

以下のコマンドを実行しました。

```
$ javac Sample.java 
$ java Sample 
```

実行結果は以下の通りでした。

![Screenshot from 2025-01-15 16-30-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/dae64413-e0ce-26c3-1264-27ff41e1cefa.png)

# まとめ

何かの役に立てばと。
GitHubリリース機能

# 1.GitHubリリース機能
特定のコミットやタグを起点に「リリース」を作成

基本的にリリースは、リポジトリ内の「タグ（tag）」に紐づきます。
たとえば「v1.0」「v2.1.0」など、バージョンを表すタグを作成し、そこにリリースノートやアセットを紐づける形で公開します。
リリースノートで変更点やアップデート内容を整理して伝えられる

リリースに「何が変わったのか」「既知の不具合はあるのか」などを記載することで、利用者やチームメンバーにアップデート内容を分かりやすく共有できます。
ビルド済みバイナリやパッケージを添付し、配布をスムーズに

たとえば、Go言語などでビルドした実行ファイルをアップロードしたり、ライブラリのパッケージをアーカイブして添付したりすることが可能です。
利用者はリリースページから直接必要なファイルをダウンロードできるので、配布が容易になります。
バージョン管理ツールと組み合わせて利用しやすい

Gitタグを使っているため、CI/CD（継続的インテグレーション / デリバリー）やパッケージ管理システムとも連動しやすいのが特徴です。

# 2. リリースを作成する手順
一般的な流れは以下のとおりです。

リポジトリのトップページから “Releases” タブを選択

GitHubのリポジトリ画面には Code や Issues などのタブが並んでおり、その中の “Releases” (または “Tags”) をクリックします。
“Draft a new release” ボタンをクリック

まだリリースを1度も作成していない場合は、Create a new release というボタンが表示されることもあります。
すでにリリースが作成されている場合は、“Draft a new release” のボタンを探してクリックします。
タグを指定または新規作成

すでに存在するタグを選んだり、新たなタグ名を入力して “Create new tag on publish” を選択します。
リリースを紐づけたいブランチやコミットを選択します。通常はメインブランチやリリースブランチが対象になります。
タイトルと説明文（リリースノート）を入力

この部分がユーザーやチームが最初に目にする変更内容のまとめとなるため、重要なアップデートポイントやバグ修正、特記事項などを記載します。
必要に応じてバイナリなどのアセットをアップロード

“Attach binaries by dropping them here or selecting them” と表示される領域にドラッグ＆ドロップ、またはファイル選択を行ってアップロードします。
ビルド済みの実行ファイル（例：.exe, .zip, .tar.gz, .debなど）を添付して配布するケースが多いです。
公開 (Publish release)

“Publish release” ボタンを押すと、指定したタグがGitHub上に作成され、リリースが公開されます。
必要があれば “Save draft” ボタンで下書きとして保存し、後で編集や公開が可能です。

# 3. リリースノートの書き方のポイント
変更点をセクションごとにまとめる
例: “Added”, “Changed”, “Fixed”, “Removed” などの見出しをつけ、どのような変更があったか分かりやすく整理。
関連IssueやPull Requestのリンクを貼る
#123 のようにIssue番号やPull Request番号を記載すると、自動的にリンクが付きます。
特別な注意点やアップデート手順があれば明記
データベースのマイグレーションが必要な場合や、互換性が失われる変更（Breaking Changes）がある場合は、明確に書いて利用者に注意を促します。

# 4. GitHub Actions (CI/CD) と組み合わせる例
GitHub ActionsなどのCI/CDツールと組み合わせると、特定のブランチに対してタグを作成したり、Pull Requestのマージ時に自動でリリースを作成することもできます。
たとえば、以下のようなワークフローを設定すると、タグが打たれた段階でビルドを実行し、その結果のアーティファクトを自動でリリースに添付できます。

```yaml
name: Release
on:
  push:
    tags:
      - 'v*.*.*'
jobs:
  build-and-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Build
        run: |
          # アプリのビルドを行うコマンド
          echo "Build your app here"

      - name: Create Release
        uses: ncipollo/release-action@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          tag: ${{ github.ref }}
          releaseName: "MyApp Release"
          draft: false
          prerelease: false
          artifacts: "build-output.zip"
```

このような設定を行えば、特定のタグをPushするだけで、自動でリリースが作成されてビルド済みファイルが添付された状態で公開されます。

# 5. リリースのメリット
利用者・開発者ともに最新版のソフトウェアを簡単に取得できる

コマンドラインでソースをクローンしなくても、リリースページからバイナリをダウンロードできるため、導入のハードルが下がります。
過去バージョンの追跡・管理が容易

いつどのような変更があったのか、バージョンごとにきちんと記録されるため、バージョンロールバック時やサポート時の確認が簡単になります。
チーム開発における情報共有がスムーズに

リリースノートで最新の変更点を整理しておくと、メンバー間の認識ずれが減少し、共同開発がスムーズに進行します。
ドキュメントとしても利用可能

リリースリスト自体がプロジェクトの更新履歴となるので、後からリリースサイクルやアップデート内容を振り返る際にも役立ちます。

# まとめ
GitHubリリースは、タグに紐づけてソフトウェアのバージョンを公開する便利な機能です。
リリースノートやバイナリを添付することで、利用者が最新バージョンや過去バージョンを簡単に取得可能になります。
CI/CDと連携すれば、自動ビルド・自動リリースを行い、生産性を高めることも可能です。
開発規模やチームの運用フローにあわせてGitHubリリース機能を取り入れることで、リポジトリの可視化や利用者への案内、チーム内外への共有がスムーズになります。ぜひ活用してみてください。
(積分)例題2:等分布荷重を受ける片持ち梁  ＜【② 構造力学の「構造」例題】様を参考にsympyで実行した。

:::note info
前　 [(積分)例題1:集中荷重を受ける片持ち梁 へ
](https://qiita.com/mrrclb48z/items/3247352386176f692a1d)次　 [(積分)例題3:等分布荷重を受ける単純梁 へ
](https://qiita.com/mrrclb48z/items/49ad3cca9e645a1428ad)　　 [私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7
)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**例題2:等分布荷重を受ける片持ち梁** (6:30〜9:00)
https://youtu.be/NMP0Q78Wl9Q?t=390
＜目次(18:50)
https://youtu.be/NMP0Q78Wl9Q?t=1130
＜フル【② 構造力学の「構造」例題】(0:00〜19:21)
https://youtu.be/NMP0Q78Wl9Q

# sympyで
・ver0.2 差し替え未
・ver0.1
```python
# ver0.1
# 例題2:等分布荷重を受ける片持ち梁 ＜【② 構造力学の「構造」例題】を参考にsympyで実行した。
from sympy import *
var('x,C1,C2,C3,C4,w,L,EI')
def myMujigennka(v,com):
    return ( str(com)+"*("
            +str((v/com).expand())                \
                 .replace("x**2/L**2","(x/L)**2") \
                 .replace("x**3/L**3","(x/L)**3") \
                 .replace("x**4/L**4","(x/L)**4") 
            +")").replace(" ","")
def myKakeruPw(v,Pw):
    return Pw+"*"+str(v).replace("*"+Pw,"")
EIv4=w                                     #;print(EIv4)
EIv3=integrate(EIv4,x)+w*L   *C1           #;print(EIv3)
EIv2=integrate(EIv3,x)+w*L**2*C2           #;print(EIv2)
EIv1=integrate(EIv2,x)+w*L**3*C3           #;print(EIv1)
EIv =integrate(EIv1,x)+w*L**4*C4           #;print(EIv )
sol =solve([Eq(1/EI*EIv .subs({x:0}),0),   # 幾何的境界条件
            Eq(1/EI*EIv1.subs({x:0}),0),
            Eq(    -EIv3.subs({x:L}),0),   # 力学的境界条件
            Eq(    -EIv2.subs({x:L}),0)           
           ],[C1,C2,C3,C4])                # ;print(sol)
v   =(1/EI*(EIv.subs({C1:sol[C1],C2:sol[C2],C3:sol[C3],C4:sol[C4]}))).factor()
print("#",myKakeruPw(myMujigennka(v,w*L**4/(24*EI)),"w"))                   
print("#",myKakeruPw(     v   .subs({x:L})         ,"w"))
print("#",myKakeruPw(diff(v,x).subs({x:L})         ,"w"))
# w*L**4/(24*EI)*(6*(x/L)**2-4*(x/L)**3+(x/L)**4)
# w*L**4/(8*EI)
# w*L**3/(6*EI)
#
rep={w:1,L:1,EI:1}
plot (diff(v,x,3).subs(rep),(x,0,1))  # (-)
plot (diff(v,x,2).subs(rep),(x,0,1))  # (-)上に凸
```
#### plotで作図
・値は、適当に1.0です。yscaleは、ylim=(,)で対応です。

SFD (+) 例題2:等分布荷重を受ける片持ち梁
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/be7dbb6e-e382-8729-e35a-00221348dad2.png)

BMD (-)上に凸 例題2:等分布荷重を受ける片持ち梁
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/f320cf19-c9cc-f5cf-d89e-1ee282196afa.png)

# sympyで(Beamで）
勉強中
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam_problems.html
https://qiita.com/tags/beam

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

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

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
＞片持ちばり 2)
＞構造力学公式集 表5.1 片持ちばりの公式　p128
ディレクトリ・エイリアスの設定(ConoHa VPS・AlmaLinux 9.4)

ConoHaのVPSでWebサイト用のディレクトリを作成し、サブドメインを設定する。

以下の環境でセットアップしていく。
**〜VPS 1Gプラン〜**
メモリ：1G
CPU：仮想2Core
ストレージ：HDD 100GB
OS：AlmaLinux 9.4

# おことわり
筆者はCentOS 7からAlmaLinux 9へ移行したため、CentOS 7のコマンドで利用できる部分はそれらを用いる。

# 1．ディレクトリの作成
ドキュメントルートはユーザディレクトリに置くこととし、ディレクトリ名は「www」とする。
次のコマンドを実行し、ディレクトリを作成する。

```
[root@abc ~]# mkdir www
```

次のコマンドを実行し、ディレクトリの所有者を変更する。

```
[root@abc ~]# chown [ユーザ名]:[ユーザ名] www
```

次のコマンドを実行し、ディレクトリのパーミッションを変更する。

```
[root@abc ~]# chmod 755 www
```

# 2．ユーザディレクトリの有効化設定
次のコマンドを実行し、設定ファイルを編集する。

```
[root@abc ~]# vim /etc/httpd/conf.d/userdir.conf
```

17行目をコメントアウトする。

```apache:/etc/httpd/conf.d/userdir.conf
UserDir disabled
```

↓

```apache:/etc/httpd/conf.d/userdir.conf
#UserDir disabled
```

31行目の"public_html"を"www"にする。

```apache:/etc/httpd/conf.d/userdir.conf
<Directory "/home/*/public_html">
```

↓

```apache:/etc/httpd/conf.d/userdir.conf
<Directory "/home/*/www">
```

32行目の"FileInfo"と"Indexes"を削除する。

```apache:/etc/httpd/conf.d/userdir.conf
AllowOverride FileInfo AuthConfig Limit Indexes
```

↓

```apache:/etc/httpd/conf.d/userdir.conf
AllowOverride AuthConfig Limit
```

次のコマンドを実行し、Apacheを再起動する。

```
[root@abc ~]# systemctl restart httpd
```

# 3．エイリアスの設定
次のコマンドを実行し、設定ファイルを編集する。

```
[root@abc ~]# vim /etc/httpd/conf/httpd.conf
```

最終行から一段空け、次のように入力し、保存する。

```apache:/etc/httpd/conf/httpd.conf
NameVirtualHost [サーバーのIPアドレス]:80
<VirtualHost "サーバーのIPアドレス":80>
 ServerAdmin 管理者のメールアドレス
 DocumentRoot /home/[ユーザ名]/www/
 ServerName [エイリアス].[ドメイン]
</VirtualHost>
```

次のコマンドを実行し、Apacheを再起動する。

```
[root@abc ~]# systemctl restart httpd
```

# 4．動作確認
ブラウザでhttps://[エイリアス].[ドメイン]/にアクセスし、"AlmaLinux Test Page"の画面が表示されることを確認する。
SSL証明書がないためエラーメッセージが表示されるが、許可の操作をして確認する。
もしもログインできなかったり、403エラーなどが表示されたら最初からやり直す。
[翻訳] DSPyを学ぶ

[Learning DSPy \- DSPy](https://dspy.ai/learn/)[2025/1/15時点]の翻訳です。


:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

DSPyは、クイックに学習できる非常に小規模なAPIを公開しています。しかし、新たなAIシステムの構築は、あなたの目的に最適化するために、DSPyのツールとデザインパターンを構成する、繰り返し開発の終わりのないジャーニーとなります。DSPyにおけるAIシステムの構築における3つのステップは:

1. [**DSPyプログラミング**](https://qiita.com/taka_yayoi/items/20c73eb634df4c86cdf9)。これはあなたのタスク、その制約の定義といくつかのサンプルの探索、あなたの初期パイプラインのデザインに指示するためのサンプルの活用に関することです。
1. [**DSPyの評価**](https://qiita.com/taka_yayoi/items/95e0ae78ee76da1657bf)。システムが動作し始めたら、初期の開発セットを収集し、あなたのDSPyメトリックを定義し、よりシステマティックにあなたのシステムでイテレーションするために、それらを活用するステージがこちらとなります。
1. [**DSPyの最適化**](https://qiita.com/taka_yayoi/items/2429e5276f5dabf320a6)。あなたのシステムを評価する手段を手に入れたら、あなたのプログラムのプロンプトや重みをチューニングするためにDSPyオプティマイザを使用します。

この順番でDSPyを学び、適用することをお勧めします。例えば、貧弱に設計されたプログラムや悪いメトリックでオプティマイザのランを起動することは非生産的です。
Laravel 10, Ajax通信で419エラー, X-CSRF-TOKENは入れてある

# 環境
PHP 8.3.15
Laravel Framework 10.28.0


# どこ見ても X-CSRF-TOKEN 入れろって書いてある

もうやってあるんよ・・
どうやってもこれしかヒットしなくて困った。

```javascript:
$.ajax({
    // どこ見ても ↓ これ ↓入れろって書いてあるけどすでに入れてある
    headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
	url: 'example',
	type: "post",
	dataType: "json",
		data: {
			key1: val
			key2: val
		},
	}).then(
```

# 解決した方法

data の方に `_token` というキーを追加してやったらうまくいったのでした。

```javascript:
$.ajax({
	// headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
	url: 'example',
	type: "post",
	dataType: "json",
		data: {
			key1: val,
			key2: val,
            // ↓ これを追加
            _token: $('meta[name="csrf-token"]').attr('content'),
		},
	}).then(
```
AWS、作成時に暗号化していないリソースを暗号化する方法のまとめ

# S3
作成後にS3バケットやオブジェクトを暗号化する場合、既存オブジェクトを対象に暗号化を適用する必要があります。
### 手順
#### ①デフォルト暗号化の有効化（新規アップロード分に適用）:
S3バケットのプロパティから「デフォルトの暗号化」を設定。
AWS KMSキーまたはS3管理キー（SSE-S3）を選択。
#### ②既存オブジェクトの暗号化変更:
AWS S3 コンソール、AWS CLI、またはAWS SDKを使用して既存オブジェクトをコピーし直す。
### 注意点：
・データをコピーし直すため、時間とコストがかかる可能性あり。
・デフォルト暗号化を設定して、も既存オブジェクトには影響しない

# EBS
EBSボリュームの暗号化は作成時のみ可能で、既存ボリュームの暗号化は直接変更できません。
既存の非暗号化ボリュームを暗号化するには、スナップショットを使用します。

### 手順
#### ①スナップショット作成:
管理コンソールやCLIで非暗号化のボリュームからスナップショットを作成。
#### ②暗号化スナップショットの作成:
非暗号化スナップショットをコピーして暗号化。
#### ③暗号化ボリュームの作成:
暗号化されたスナップショットから新しいEBSボリュームを作成。
#### ④インスタンスへのアタッチ:
新しい暗号化ボリュームをインスタンスにマウント。

### 注意点：
・オペレーション中にダウンタイムが発生する可能性あり。
・データ転送によるコストが発生する可能性あり。

# EFS
ファイルシステム自体の暗号化は作成時のみ設定可能です。
ただし、非暗号化EFSから暗号化EFSにデータを移行することは可能です。

### 手順
#### ①新しい暗号化ファイルシステムの作成:
管理コンソールやCLIで暗号化を有効にして新規ファイルシステムを作成。
#### ②データの移行:
AWS DataSync、rsync、またはNFSプロトコルを使用してデータを非暗号化ファイルシステムから新しい暗号化ファイルシステムにコピー。

### 注意点：
・データ転送速度や容量により、時間がかかる可能性あり。
・コピー作業中に一時的なアクセス制限や負荷が発生する可能性あり。

# RDS
暗号化はDBインスタンス作成時のみ設定可能です。
ただし、既存の非暗号化DBを暗号化するには、スナップショットを利用して新しい暗号化DBを作成する必要があります。

### 手順
#### ①スナップショット作成:
現在のDBインスタンスのスナップショットを作成。
#### ②暗号化されたスナップショットのコピー:
作成したスナップショットをコピーし、暗号化を有効にする。
#### ③暗号化されたスナップショットから新しいDBインスタンスを作成:
暗号化済みスナップショットからDBインスタンスを作成。
#### ④切り替え:
新しいDBインスタンスにアプリケーションを接続。

### 注意点：
・作業中にダウンタイムが発生する可能性あり。
・データベースのサイズに応じて、スナップショットの作成と復元に時間がかかります。

# DynamoDB
データの暗号化はサーバーサイドで管理されており、デフォルトで有効です。
ただし、特定のKMSキーを後から使用したい場合、テーブルの再作成とデータ移行が必要です。

### 手順
#### ①新しいテーブルの作成:
特定のKMSキーを指定して新しいテーブルを作成。
#### ②データの移行:
AWS Data Pipeline、AWS Glue、または手動スクリプトを使用してデータをコピー。
#### ③切り替え:
アプリケーションを新しいテーブルに接続。

### 注意点：
・データ移行中に読み書き負荷が増加する可能性あり。
・DynamoDBはデフォルトで暗号化されているため、一般的な暗号化移行のケースは少ないです。

# Redshift
クラスターの暗号化は作成時にのみ有効にできます。
非暗号化クラスターを暗号化するには、新しいクラスターを作成し、データを移行する必要があります。

### 手順
#### ①新しい暗号化クラスターの作成:
AWS Management ConsoleまたはCLIでKMSキーを指定して新しいクラスターを作成。
#### ②データの移行:
非暗号化クラスターから暗号化クラスターにデータを移行。
RedshiftのUNLOADおよびCOPYコマンドを使用。
#### ③切り替え:
アプリケーションを新しいクラスターに接続。

### 注意点：
・データ移行にはS3を経由するため、ネットワーク帯域や時間が必要です。
・作業中にダウンタイムが発生する可能性あり。
MySQLの予約語に注意: テーブル設計時のトラブル回避

MySQLでデータベースを設計する際、予約語の使用には十分な注意が必要です。
特に、カラム名やテーブル名に予約語を使用すると、予期せぬエラーやバグの原因となる可能性があります。
この記事では、MySQLの予約語について解説し、特に注意が必要な例を紹介します。

# 予約語とは

予約語とは、SQLで特別な意味を持つキーワードのことです。
これらの単語は、テーブル名やカラム名などの識別子として使用する際に特別な処理が必要となります。

# 特に注意が必要な予約語
「type」カラムとかよく使いますよね。
「type」という名前のカラムは特に注意が必要です。
これは予約語であり、使用するとエラーの原因となる可能性が高いです。
その他の注意すべき予約語
以下は、頻繁に使用される可能性がある予約語の一部です

```
SELECT
FROM
WHERE
ORDER
GROUP
BY
HAVING
INSERT
UPDATE
DELETE
CREATE
ALTER
DROP
TABLE
INDEX
```

# 予約語を使用する場合の対処法
予約語を識別子として使用する必要がある場合は、以下の方法で対処できます

## バッククォートで囲む
予約語を識別子として使用する場合は、バッククォート (`) で囲みます。
```
例: CREATE TABLE `order` (id INT, `date` DATE);
```
## 別の名前を使用
可能な限り、予約語を避けて別の名前を使用することをお勧めします。
```
例: order の代わりに customer_order を使用する
```
## 予約語のリスト確認
MySQLの予約語の完全なリストは、公式ドキュメントで確認できます。
また、INFORMATION_SCHEMA.KEYWORDSテーブルを使用して、現在使用しているMySQLバージョンの予約語リストを取得することもできます。
# まとめ
MySQLでデータベースを設計する際は、予約語の使用に十分注意を払うことが重要です。
特に「type」などの一般的な単語が予約語である場合があるため、テーブルやカラムの命名には慎重を期しましょう。
予約語を使用する必要がある場合は、バッククォートで囲むか、別の名前を選択するなどの対策を講じてください。
これらの注意点を守ることで、予期せぬエラーを回避し、より安定したデータベース設計を実現できます。