OmniAICreator/Qiita-1.07M huggingface dataset:
Flutterの見た目を統一すには、まずこれ。

# FlutterのThemeを利用して見た目を統一する
## primarySwatchの設定
- primarySwatchはMaterialColorで設定する
- MaterialColorはMap<int, Color>のカラーパレットとプライマリーカラーで設定する

```
  /// カラーパレット
  static const _colorPalettes = <int, Color>{
    50: Color(0xFFFFF3E0),
    100: Color(0xFFFFE0B2),
    200: Color(0xFFFFCC80),
    300: Color(0xFFFFB74D),
    400: Color(0xFFFFA726),
    500: Color(0xFFFF9800),
    600: Color(0xFFFB8C00),
    700: Color(0xFFF57C00),
    800: Color(0xFFEF6C00),
    900: Color(0xFFE65100),
  };

  /// 第一引数がプライマリーカラー
  /// カラーパレットからプライマリーカラーにしたい色を選択する
  static const _primarySwatch = MaterialColor(0xFFFF9800, _colorPalettes);
```

参考URL
- [マテリアルカラーについて](https://m2.material.io/design/color/the-color-system.html#tools-for-picking-colors)
- [primarySwatchについて](https://zenn.dev/sugitlab/articles/bef3a05963680a)

## フォントの設定
フォントを設定する為の準備
1. フォントファミリーをダウンロードする
1. プロジェクト直下にfontsディレクトリを作成する
1. fontsディレクトリにダウンロードしたフォントファミリーを格納する
1. pubspec.yamlでフォントを指定する
```
  fonts:
    - family: RampartOne
      fonts:
        - asset: fonts/RampartOne-Regular.ttf
    - family: NotoSansJP
      fonts:
        - asset: fonts/NotoSansJP-Regular.otf
        - asset: fonts/NotoSansJP-Bold.otf
          weight: 700
```

ThemeDataでフォントファミリーを指定する
```
theme: ThemeData(
  primarySwatch: _primarySwatch,
  fontFamily: 'NotoSansJP',
),
```

参考URL
- [フォントファミリーのダウンロード](https://fonts.google.com/?subset=japanese&noto.script=Jpan)


## ThemeDataのその他の設定
文字のサイズなどはマジックナンバーで指定せずにThemeDataから取得するようにする
```
Text(
  '$_counter',
  style: Theme.of(context).textTheme.displaySmall,
),
```

デフォルトのThemeDataの設定では思い通りに表示出来ない場合にThemeDataを調整する
```
theme: ThemeData(
  textTheme: const TextTheme(
    headlineSmall: TextStyle(fontSize: 14.0),
  ),
),
```

ThemeDataでは数多くの設定があるので必要に応じて部分的修正するのが良さそうです

参考URL
- [公式](https://docs.flutter.dev/cookbook/design/themes)
- [設定できるプロパティ一覧](https://itome.team/blog/2019/12/flutter-advent-calendar-day12/)
ダンプファイルを実行して「Error Code: 1068. Multiple primary key defined」と出た時



phpMyAdminでは「エクスポート」タブからダンプファイルを作成することができます。

![詳細オプション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652834/2c873aa0-1ecc-405b-a560-0dc61f82f263.png)

本番環境で作成したダンプファイルを開発環境のDBで実行したら、以下のようなエラーがたくさん出てしまいました。
```sh
Error Code: 1068. Multiple primary key defined
```
該当部分のクエリをコメントアウトしても、また次のエラーが出てくる…（エンドレス）
```sh
Error Code: 1061. Duplicate key name 'hoge'
```

エラーの内容から、ファイル内の「主キーを設定する」部分など、テーブルを定義するコマンド部分が重複していることが分かりました。

## 原因

DBとダンプファイルの「構造」が重複していたこと。

DBではマイグレーションを行っていたため、テーブルの「構造」はすでに設定されていました。
一方、ダンプする時には内容として「構造とデータ」を選択していました。


## 解決策

ダンプファイル作成時、「データ」のみをダンプする。

具体的には、
phpMyAdminの「エクスポート」
→詳細-可能なオプションを全て表示
→「フォーマット特有のオプション」で「データ」を選択
（エラーが出た時は、ここで「構造とデータ」を選択していた）
![フォーマット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652834/2ae8744e-2040-871e-0459-6c77d916893a.png)

普段ダンプファイルはSSH接続しコマンドで作成しているので、ファイルの中身まで考えたことありませんでした…
勉強になりました。


https://musubite-job.com/recruitments/XPriPw?utm_source=qiita
ShellScriptの$

変数にアクセスする時は変数名の前に$を付けます。または$付けて変数を{}で囲みます。

```
var="変数1"
var_2="変数2"
echo "var_2=$var_2"

var_2="var_2が変更されました。"
echo ${var_2}
```

# 参考サイト
https://tech-blog.rakus.co.jp/entry/20200521/shellscript
GitHubリポジトリのラベルを別のリポジトリにコピーしたい！

GitHubの画面上から操作できないことでも、CLIツールからなら操作できる場合があって便利だったので記事にしました。

# 概要

## やりたいこと

新しくGitHubのリポジトリを作成するにあたって、ラベルを1つずつ作っていくのは手間なので既存のリポジトリからコピーしたい。

## 調べて分かったこと

- ブラウザからの操作では、そのような機能は無さそう
- [GitHub CLI](https://cli.github.com/) という公式のコマンドラインツールが用意されている
  - CLIならやりたいことができそう

## ざっくり手順

1. GitHub CLIをインストールする
1. ターミナル上でログインする
   `gh auth login`
1. ラベルをコピーする
   `gh label clone <コピー元リポジトリ>`

# 詳しい手順

## 1. GitHub CLIをインストールする

[cli/cli: GitHub’s official command line tool](https://github.com/cli/cli)

1. [公式リポジトリ](https://github.com/cli/cli)の `README > Installation` に従って `gh` をインストールする
   - Linux(apt)の場合は[こちらのページ](https://github.com/cli/cli/blob/trunk/docs/install_linux.md)
1. バージョン確認
   ```shell
   ❯ gh --version
   gh version 2.23.0 (2023-02-08)
   https://github.com/cli/cli/releases/tag/v2.23.0
   ```

## 2. ターミナル上でログインする

[Manual | GitHub CLI](https://cli.github.com/manual/) 

認証方法は以下の2種類ありますが、私の場合はWSLかつGUIなしの環境のため、この記事ではauthentication tokenを使う方法で進めています。
- Login with a web browser
- Paste an authentication token

1. Personal access tokensを発行しておく
   - scopeは 'repo', 'read:org', 'workflow' を選択する  
     > The minimum required scopes are 'repo', 'read:org', 'workflow'.
1. `gh auth login` を実行し、ダイアログに従って選択/入力する
   ```
   ❯ gh auth login
   ? What account do you want to log into? GitHub.com
   ? What is your preferred protocol for Git operations? HTTPS
   ? Authenticate Git with your GitHub credentials? Yes
   ? How would you like to authenticate GitHub CLI? Paste an authentication token
   Tip: you can generate a Personal Access Token here https://github.com/settings/tokens
   The minimum required scopes are 'repo', 'read:org', 'workflow'.
   ? Paste your authentication token: ****************************************
   - gh config set -h github.com git_protocol https
   ✓ Configured git protocol
   ✓ Logged in as yocajii
   ```

## 3. ラベルをコピーする

[GitHub CLI > gh label clone](https://cli.github.com/manual/gh_label_clone)

1. コピー先のローカルリポジトリがあるディレクトリに移動する
1. `gh label clone <アカウント名/リポジトリ名>`
   ```
   ~/work/sawara
   ❯ gh label clone yocajii/hamattimer
   ✓ Cloned 15 labels from yocajii/hamattimer to yocajii/sawara
   ```

えっ？これで本当にコピーできたの？と半信半疑でGitHubのリポジトリを確認したところ、ばっちりラベルが増えていました。

**←コピー元：コピー先→**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160235/1e7b7e48-14e3-93a4-dacc-ef298e4943b8.png)
OpenAIのAPIを呼んでドキュメントなどを自動でコードに書き込むコマンドラインツールをCrystalで書いた

OpenAIの `text-davinci-edit-001`, `code-davinci-edit-001` を呼び出すためのコマンドラインツールを書いたので、忘れないうちに記録に残すことにします。（この記事はポエム要素が強いのでご了承ください）

## はじめに

AIの技術の進歩が早すぎて、ついていくのが大変な時代になりました。たとえば、ChatGPTのAPIが公開されたのがつい先週の話というのが、信じられないほどです。AIを使えば、これまでできなかったことができるようになりました。例えば、自然言語でAIに命令することで、コードを書いてくれるようになり、AIはコードを読んでその意味を自然言語で書くこともできるようになりました。

こうしたことを考えると、AIを使ってコードを加工する技術が、今後ますます進化していくことが予想されます。これまでは、人間の職人が、コードを少しずつ削っては、Gitで保存して、また少しずつ削ってはGitで保存してということを繰り返していましたが、今後は、AIでテンプレートを生成し、AIでコードを加工し、AIにテストケースを作らせ、AIにリファクタリングを依頼し、AIにドキュメントを書かせるというような工程が当たり前になっていくことでしょう。

この中でも、期待が持てそうなのは、コードのドキュメントを自動生成する技術です。

## コマンドラインツールを作ってみる

AIを使った何かを作りたいと思いましたが、GUIのツールは作るのが大変なので、コマンドラインツールを作ることにしました。便利なRuby言語を使うか、Crystal言語を使うかで迷いましたが、今回は単にAPIを呼び出すだけであるため、ライブラリに依存する部分もないだろうと思い、Crystal言語を使ってツールを書くことにしました。

https://github.com/kojix2/openai-code-editor

最初に、httpsやPOSTなどの概念を十分に理解していなかったので、curlでOpenAIのAPIを呼び出しているコマンドを、ChatGPTに翻訳してCrystalのコードにしてもらいました。このツール自体も、AIにテンプレートを作成してもらって作ろうという意図があります。ChatGPTは驚くべきことに、だいたい正しいCrystalのコードを出力してくれました。そのコードを使って、次のようなことをしたいと考えました。

```sh
cat foo.rb | code-editor ドキュメントを書いてください。 > foo2.rb
```

これはこれで素晴らしいのですが、私たちは多くのコードを既にGitで管理しています。新たに作られたfoo2.rbとの差分を `diff foo.rb foo2.rb` で確認し、よかった変更だけを `foo.rb` に取り込む手順は面倒です。ほとんどの現代人はGitとVSCodeなどのテキストエディタを用いて差分を検証して `add`, `commit` していると思います。そこで、直接ファイルを上書きするようにツールの動作を変更しました。

```sh
code-editor -i "ドキュメントを書いてください" foo.rb
```

この場合は、instructionはコマンドライン引数にしないと、与えられた引数がinstructionなのかファイル名なのかわからなくなってしまうので、コマンドライン引数にしました。最初の見た目の方がUnixツールらしいと思いますが、現代の標準的なコーディング環境にふさわしいのは後者だと考えました。また、標準出力できる機能も残したかったので、出力ファイルが指定できる `-o` オプションを追加し、`-o -` と指定した場合は編集後のコードを標準出力に出力できるようにしておきました。

その他の部分はRubyと大きく変わったところはなく、簡単にコードを書くことができました。

```crystal
headers = HTTP::Headers{
  "Authorization" => "Bearer #{api_key}",
  "Content-Type"  => "application/json",
}
```

このコードはかなりCrystalらしいと思います。Crystalでは、Hashっぽいクラスがあり、そうしたクラスに関しては、Rubyで見ると定数にブロックを追加するような形で記載することができます。また、ライブラリからスピナーを利用することもできました。CrystalではMakefileを提供するのが標準的なので、Makefileを書きましたが、ChatGPTを使いました。

## 実際に使ってみる

それでは実際に使ってみて、どの程度自動的にドキュメントを生成することができるか見てみましょう。
まず、Rubyのコードを用意します。

```ruby:a.rb
def meow(n)
  n.times{ puts meow }
end
```

ドキュメントを付加するように指示を与えます。

```
code-editor -i "Add YARD documentation" a.rb
```

その結果、このようなドキュメントが追加されました。

```ruby
# Prints "meow" n times
#
# @param n [Integer] number of times to print "meow"
# @return [nil]
def meow(n)
  n.times{ puts meow }
end
```

実際に、`yard` コマンドを用いて、HTMLファイルが生成できることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/d24d51b4-ea2a-4678-0d0e-6d107e5cacda.png)

今回の例は非常に簡単で、このようなツールが実際の局面でどの程度使えるのかは別の話だと思います。
試していきたいと思います。体感としては、利用体験はかなりよいのですが、ChatGPTの方が正確な結果が出る傾向があると思いました。

しかし、ChatGPTをコマンドラインツールとしてコードの作成に利用するのはなかなか難しそうです。

## ポエム

ポエムですが、将来のコードは状態を持つのではないかというようなことを考えました。今回のcode-editorのようなツールは、コードを引数に取り、コードを返す関数のようなものと考えることができます。そうやって、コードを何回も変換していくことを考えると、コードを変数としてとって、メソッドとしてcode-editを行うようなオブジェクトのようなものがぼんやり見えてくるではありませんか。その場合、コードは単にコードであるだけではなく、状態を持つことになります。これまではGitを使ってコードグラフを人間が制御してきましたが、人間以外の存在がコードの変換を行うようになると、そうした奇妙な世界が見えてくるかもしれません。

この記事は非常に適当に書かれていますので、真に受けないでください。

この記事自体も日本語をChatGPTに直してもらいました。

以上です。
Automating Sitemap Updates 🔎

こんにちは。Enabling team の山本です。

今回は Search Console について書きます。

弊社では、Owned Media を運用しています。

メディアにとって、SEO は以前として重要な要素です。ChatGPT が盛り上がりを見せていますが。

新規出店に合わせて、チラシや店舗の情報を発信しているため、Sitemap の更新も欠かせません。

Sitemap の更新をタイムリーに行うため、Search Console の Sitemap 更新を自動化しましたので、その話を書きます。

## TL;DR
- サービス アカウントに権限を借用させると自動化できる。

## 構成
- Cloud Functions
   - `go1.20.1 linux/arm64`

Webhook Trigger で起動する。
invoker は、CMS です。

## 準備
- Google Cloud の Project で Google Search Console API を有効にする、
```bash
gcloud services enable searchconsole.googleapis.com --project=hoge-project-id
```
- Google Service Account（GSA）を作成する。
- GSA を Search Console に登録する。
- GSA の Credentials Key を作成する。
- Credentials Key を環境変数に設定する。

## Sample Code
```go
package main

import (
	"context"
	"fmt"
	"os"

	"google.golang.org/api/option"
	"google.golang.org/api/webmasters/v3"
)

func main() {
	ctx := context.Background()
	keyJson := os.Getenv("KEY_JSON")
	webmastersService, err := webmasters.NewService(ctx, option.WithCredentialsJSON([]byte(keyJson)))
	if err != nil {
		fmt.Println("Failed to create Client.")
	}
	siteUrl := os.Getenv("SITE_URL")
	fmt.Printf("siteUrl: %v\n", siteUrl)
	feedpath := os.Getenv("FEEDPATH")
	fmt.Printf("feedpath: %v\n", feedpath)
	err = webmastersService.Sitemaps.Submit(siteUrl, feedpath).Do()
	if err != nil {
		fmt.Println("Failed to submit.")
		fmt.Println(err)
	}
}
```

```ba
vscode ➜ /workspaces/hoge (main) $ go run main.go
siteUrl: sc-domain:example.co.jp
feedpath: https://www.example.co.jp/sitemap/sitemap.xml
vscode ➜ /workspaces/hoge (main) $
```

## まとめ
Sitemap 更新の自動化について書きました。
最初は、OAuth で実装しましたが、Web 画面での認証が必要なため、サービス アカウントを使用した実装に変更しました。
こういう誰も拾わないような Toil を拾いながら、Programming をやっていこうと思います。
立場上、丸一日 Programming する時間もないため、今の僕にはちょうど良いレベルの課題です。
ロボット開発のために色々やったこと一覧

ロボットを制御して思い通りに動かせるようになるまでに書き留めたことの一覧です．（書き溜めたものを少しずつアップしていく予定） 詳細は各リンクに飛んで見て行ってください．
※ 気になる記事がまだアップされていない場合は，コメントを貰えれば優先的にアップします．

センサの使い方～rosによる制御まで，徒然なるままにいろいろ試しています．
# Ubuntu導入
ロボット開発にはUbuntuはやっぱり不可欠だよね．

https://qiita.com/Karin-Sugi/items/beea024af04c85abdb73
# Github
やっぱりロボット開発に欠かせないのはGithub！いろいろやる前にまずはGithubのアカウント作成がおすすめです．

https://qiita.com/Karin-Sugi/items/063e2ba001c2d88975f7

# センサなど
* [FTセンサ](https://github.com/Karin-Sugi/leptrino_ros_pkg)：
    leptrino Force Torque センサ（PFS080YS102U6S）を使いました．
    購入時についてくるサンプルコードをもとに，rosで出力データを扱えるよう書き直しました．
:::note warn
同じleptrinoのFTセンサでも製品によってコードが異なるので注意！
異なる製品の場合は，leptrinoから公式に渡される制御コードをもとに各自変更する必要があります．
:::
* [actuator](https://qiita.com/Karin-Sugi/items/094c2a3b0ee2641ce094)：
    HEBI smart actuator X-series を使いました．
* ステレオカメラ：
    Intel realsense D435i を使いました．
    * [realsenseを使うまで](https://qiita.com/Karin-Sugi/items/28d1041f57b50e924902)
    * [realsense imuのキャリブレーション](https://qiita.com/Karin-Sugi/items/50cc997998e25f5efaa1)
* [Raspberry Pi](https://qiita.com/Karin-Sugi/items/ef6fd0ec1ccab8059f64)：
    ラズパイにUbuntu18.04を入れました．（ほかのOSの入れ方も多少載ってます）
    wifi環境など，基本的な環境のセットアップとトラブルシューティングを記載しています．


# 仮想環境
* [各種仮想環境の違い まとめ](https://qiita.com/Karin-Sugi/items/cbe5e33da41125f1232a)
* docker
* WSL
* Virtual Box

# プログラミング
* [プログラミング言語の選び方](https://qiita.com/Karin-Sugi/items/e1b486005aeaf699ec13)
* C++
* [Python](https://qiita.com/Karin-Sugi/items/6f0c79721f2165e76741)

# ROS
* チュートリアル的なのをやってみた
    * [ROSのインストールと基本的な使い方](https://qiita.com/Karin-Sugi/items/a29af8f1923fca0375d3)
    * gazeboのインストール：公式が推奨しているros-desktop-full をインストールしていれば，gazeboはrosと一緒にインストールされる

* ロボットを作ってみた
    * [複数トピックのpub&sub](https://qiita.com/Karin-Sugi/items/24a7bab1fe97326bb1d1)
    * [自作モデルを rviz & gazeboで表示し，駆動する](https://qiita.com/Karin-Sugi/items/72bcdf34c3e2d8ce430b)
    * [3次元画像処理](https://qiita.com/Karin-Sugi/items/1ebd8205fc47c7319405)
    * [経路計画](https://qiita.com/Karin-Sugi/items/8e829a02fd54b50af171)
    * [AprilTagを用いた自己位置＆姿勢推定](https://qiita.com/Karin-Sugi/items/7678b3a0cc7b80e45940)
IAMによるAPI Gatewayアクセス制御方法 メモ

* API Gateway はAWS IAMを用いたAPI認証を設定することができる
![agw_iam_auth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/8659d989-2901-87f0-b55d-b0a79a5967b2.png)

## 設定方法

### API Gateway

1. API GatewayにREST/HTTP APIを作成する
2. 1で作成した対象APIの認可設定として`AWS IAM`を選択する

### IAM 

1. API実行用のIAMユーザーが所属するグループに下記のようなAPI実行権限を持つポリシーを設定する

   ```json
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "execute-api:Invoke"           
         ],
         "Resource": [
           "arn:aws:execute-api:{REGION}:{ACCOUNT_ID}:{API_ID}/*/{HTTP_METHOD}/{RESOURCE_PATH}"
         ]
       }
     ]
   } 
   ```

   

## APIリクエスト方法(Postman)

* Postman Authorization タブに以下を設定し、リクエストする

  * Type：AWS Signature

  * AccessKey：IAM ユーザーのIAM アクセスキー ID

  * SecretKey：IAM ユーザーの シークレットアクセスキー

  * AWS Region：API Gatewayのリージョン

 ![agw_iam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/b2215e1f-35ad-f48b-5e64-4856bf0c2857.png)


※Pythonの場合は`aws-requests-auth`というライブラリを利用する

## 参考情報

* https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-authentication-api-gateway/
[Vue3] V-Calendarの表示崩れを治す方法（導入時）

## 起きたこと
 - `v-calendar` の表示が崩れてしまう 

## 原因
 - CSSを正しく読み込めていなかった

## 解決策
 - 以下のように、`main.js`もしくは`main.ts`にて、CSSのインポートを行うこと
 - 公式ページ(https://vcalendar.io/vue-3.html) にも書いてある
```
import { createApp } from 'vue'
import App from './App.vue'
import router from './app/router'
import { key, store } from './app/store'
import 'v-calendar/dist/style.css';createApp(App)
  .use(router)
  .use(store, key)
  .mount('#app')
```
[ Vite+Vue ] Vue3-Popperで発生するMIMEタイプのエラーを解消する方法

## 概要
`vite`+`docker`+`vue3`+`typescript`の環境に、`vue3-popper`を導入しようとしたら、以下のようなエラーが発生し、画面が真っ白な状態になってしまった。。。

## エラーの内容
以下のようなMIMEタイプのエラーが発生することがある
```
MIME タイプ (“”) が許可されていないため、“http://{ホスト名}/node_modules/.vite/deps/vue3-popper.js” からのモジュールの読み込みがブロックされました。
```

## 解決策
`vite`を再起動すれば治る
`vite` を起動した状態のまま `npm install`で `vue3-popper`を導入していたため、何らかの不整合が発生していた可能性が高い（はず）
Reactを開発するために知っておくべきES2015(ES6)超入門

# 前提
ES2015の全機能ではありません。
Reactを学ぶために知っておくべきWeb開発の知識とES2015の一部機能をできるだけわかりやすくまとめました。
(個人的見解も多くあるのでご留意ください)

# Web開発知識
利用するWeb開発ツールのまとめ


## パッケージマネージャー
- パッケージをインストールする際に開発者がそれぞれのPCに自由にインストールしてしまうとバージョンがバラバラになるのを防ぐ
> Aさん、Bさんが自由に開発環境を構築すると、Aさんは使えるつもりでも本番環境やBさんは使えない機能がでてくるのを防ぐ
- package.jsonなどを利用することで同じ環境を容易に再現することができる


## モジューラバンドラー
- 開発はファイルを分けて効率的に作業し、本番用にビルドするときに1つのファイルにまとめてくれる
- ファイルが減ることによって、読み込み回数が減ってパフォーマンスアップしてくれる
- 現在はwebpackが主流([ただし開発が終了するそうなので他のバンドルツールの利用も検討が必要](https://www.publickey1.jp/blog/23/javascriptwebpackturbopack.html))


## トランスパイラ
- JavaScriptの記法をブラウザで実行できる形に変換してくれるもの
- 最新機能が追加されてもChromeでは動くが、Firefoxでは動かないみたいなやつをいい感じに補完してくれる
- Babelが主流

## SPA(Single Page Application)
- 従来のMPAとは異なり、サーバーから取得するhtmlファイルは一つでそこに対してDOMを書き換えて画面遷移を実現する
- 毎回の画面更新がなくなりパフォーマンスの向上が見込める
- React, Vue, AngularJSが主流

# ES2015(ES6)
Reactで頻出するES2015の機能まとめ

## 変数宣言
``` JavaScript
// [let]再宣言不可、値の上書き可能
let hoge = "hoge";

// OK
hoge = "hoge2";

// NG
let hoge = "hoge2";

// [const]再宣言不可、値の上書き不可
// ただしオブジェクト型は書き換えることが可能なので注意
const fuga = "fuga";

// NG
fuga = "fuga2";

```

個人的にはletはあまり使う必要がないと考えている
特別な理由がない限りはconst使う

## テンプレート文字列
``` JavaScript
const test1 = "hoge";
const test2 = "fuga";
const test3 = `ホゲ：${test1}、フガ：${test2}`
```

文字列操作をわかりやすく実施
関数や計算式を入れることも可能

## アロー関数
``` JavaScript
const func = value => {
  return value;
};
```
functionを使わずに関数の宣言ができる
React + TypeScriptだと好む人が多い書き方なのでスムーズに理解できたほうがいい
ソースがスッキリするから好き

## 分割代入
``` JavaScript
const hogeObject = {
  item1: "hogehoge",
  item2: "fugafuga"
};

const { item1, item2 } = hogeObject;
```

配列でも同じように [] を使用することが可能
スキルが低い人だと理解すらしてもらえない可能性があるが、ソースがスッキリするので積極的に使いたい

## デフォルト値
``` JavaScript
const test = (hoge = "ホゲ") => console.log(`テスト${hoge}`);
```
他の言語やってればよくある書き方なので、割と理解しやすいと思う
利用価値はかなり高いので覚えておきたい

## スプレッド構文
``` JavaScript
const arr1 = [1, 2, 3];
console.log(...arr1);
// 1 2 3
```
配列内部の値を順番に展開してくれる
業務アプリ作ってると配列多様は致し方なしなので、結構重宝する
配列で「=」を利用すると参照渡しになるため、値渡しを利用するため重宝する

## オブジェクトの省略記法
``` JavaScript
const my = "私";
const you = "あなた";

const member = {
  my,
  you,
};
```
こんな感じでオブジェクトも作れるんだぐらいの認識でよいと思う

# まとめ
私の意見込みなので、それを参考にするか否かは個人の判断にお任せします。
「これさえ知っておけば明日からReactマスター！」というわけではありませんが、
知っていると知らないじゃソースの理解度が大きく変わってきます。
本記事にまとめた内容だけでも覚えるようにすればかなりスムーズにReactに参画できるのではないでしょうか。
アロー関数の使い方をまとめていく

不慣れなSEだとはてながいっぱいになるので使い方をまとめていこうと思いました。
## 基本形
```javascript: javascript アロー関数使う前
testMethod() {
  const returnV = function(a, b) {
    return a * b
  }
  const result = returnV(3, 2)
  console.log(result)
}
```
言うまでもなくコンソールには`6`が返ってきます。
```javascript: javascript アロー関数変換後
testMethod() {
  const returnV = (a, b) => {
    return a * b
  }
  const result = returnV(3, 2)
  console.log(result)
}
```
```javascript: javascript 戻り処理のみなら更に省略
testMethod() {
  const returnV = (a, b) =>  a * b
  const result = returnV(3, 2)
  console.log(result)
}
```
この辺りまでは普通にたどり着けるんですよ。むしろこんな処理はあまり書かない。
これにawait,async,map等組み合わさると何書いてるんだってなるわけで。
基礎がない人にとっては混乱の種です。

## Map関数
```javascript: 変換前
testMethod() {
  const arrays = [10, 20, 30]
  const returnV = arrays.map(function(arrayValue) {
    return arrayValue * 2
  }) 
  console.log(returnV)
},
```
戻り値は`[20, 40, 60]`。
```javascript: 変換後
testMethod() {
  const arrays = [10, 20, 30]
  const returnV = arrays.map((arrayValue) => arrayValue * 2) 
  console.log(returnV)
},
```
ここらへんも理解はしやすかった、というかfunctionって書いてれば省略できるんだなって分かりますね。
逆変換のが分かりづらい気がしました。

## forEach関数
forEachは戻り値がないので別配列へ代入
```javascript: 変換前
testMethod() {
  const arrays = [10, 20, 30]
  const returnV = []
  arrays.forEach(function(arrayValue) {
    returnV.push(arrayValue * 2)
  })
  console.log(returnV)
},
```
VSCodeが気を利かせてアロー関数に勝手に変換してしまうわけですが無理やりfunction使ってます。
```javascript: 変換後
testMethod() {
  const arrays = [10, 20, 30]
  const returnV = []
  arrays.forEach(arrayValue => {
    returnV.push(arrayValue * 2)
  })
  console.log(returnV)
},
```
## filter関数
```javascript: 変換前
testMethod() {
  const arrays = [10, 20, 30]
  const returnV = arrays.filter(function(value) {
    return value >= 20
  }) 
  console.log(returnV)
},
```
戻り値は`[20, 30]`。
```javascript: 変換後
testMethod() {
  const arrays = [10, 20, 30]
  const returnV = arrays.filter(value => value >= 20)
  console.log(returnV)
},
```
20以上っていう値を返す関数にしてしまった手前一瞬何書いているのか分からなくなりました。

長くなったので一旦ここまで。
await、asyncはまた別の記事で。
如何修改ChatGPT密码：通过邮箱找回密码

ChatGPT是一个非常有用的工具，它是一种人工智能语言模型，可以用于各种任务，如自然语言处理、机器翻译和对话系统。如果你是ChatGPT的用户，那么你可能会遇到忘记密码的情况。不要担心，我们将在这篇文章中告诉你如何通过邮箱找回ChatGPT的密码。-> [**ChatGPT账号**](https://koacheats.com/chatgpt/ "ChatGPT账号专题")

## 步骤1：打开登录页面
首先，打开[ChatGPT](https://chat.openai.com/ "ChatGPT")的登录页面，并单击“忘记密码”链接。这将带你到密码重置页面。
![Snipaste_2023-03-08_16-51-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249696/58340740-a5ca-0b57-4146-79abd2d7ec6c.png)

## 步骤2：输入注册邮箱地址
在密码重置页面上，输入你在ChatGPT上注册时使用的电子邮件地址。确保输入正确，并单击“提交”。
![Snipaste_2023-03-08_16-37-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249696/3f0020ec-63c6-3438-7b21-b9a2936bb85b.png)
![Snipaste_2023-03-08_16-38-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249696/570080ea-dd64-08d0-2dec-82d362ee9901.png)


## 步骤3：检查邮箱
现在，检查你的邮箱，并查找来自ChatGPT的电子邮件。如果在几分钟内没有收到邮件，请检查垃圾邮件文件夹或重新发送邮件。
![Snipaste_2023-03-08_16-41-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249696/1d56eaed-7024-5758-5224-092692b7c273.png)


## 步骤4：重置密码
在邮件中，你将看到一个包含密码重置链接的消息。单击该链接，并按照提示操作以创建新密码。确保选择一个安全且强壮的密码。
![Snipaste_2023-03-08_16-43-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249696/c8041510-d9d8-7e17-e1d9-da2c671459a2.png)
![Snipaste_2023-03-08_16-45-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249696/50b46c53-7094-992a-c983-63d41c6bdfac.png)

## 步骤5：登录
完成密码重置后，返回ChatGPT登录页面，并使用新密码登录。恭喜你，你已经成功找回了ChatGPT的密码！
![Snipaste_2023-03-08_16-50-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249696/41fa1172-43ce-9976-cc96-997cbad4e550.png)


## 结论
更改ChatGPT密码只需几个简单的步骤。这样做可以帮助您保护自己的个人信息和数据，因此请确保您定期更改您的密码。希望本指南对您有所帮助！
eccube-4.2.1 を Docker Compose でインストール (PostgreSQL)

こちらを参考にしました。
[Docker Composeを使用してインストールする](https://doc4.ec-cube.net/quickstart/docker_compose_install)

Arch Linux を使いました。
データベースは、PostgreSQL です。

## インストール

ソースコードのダウンロードと解凍はこちらと同じです。
[eccube-4.2.1 を Docker Compose でインストール (sqlite3)](https://qiita.com/ekzemplaro/items/79726ec0d14d8dbcce6d)

インストール

```bash
cd ec-cube/
docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml up -d
```

コンテナーの様子

```text
$ docker-compose ps
NAME                    IMAGE                                    COMMAND                  SERVICE             CREATED             STATUS                    PORTS
ec-cube-ec-cube-1       ghcr.io/ec-cube/ec-cube-php:8.1-apache   "docker-php-entrypoi…"   ec-cube             12 minutes ago      Up 12 minutes (healthy)   0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:4430->443/tcp, :::4430->443/tcp
ec-cube-mailcatcher-1   schickling/mailcatcher                   "sh -c 'mailcatcher …"   mailcatcher         12 minutes ago      Up 12 minutes             0.0.0.0:1025->1025/tcp, :::1025->1025/tcp, 0.0.0.0:1080->1080/tcp, :::1080->1080/tcp
ec-cube-postgres-1      postgres:14                              "docker-entrypoint.s…"   postgres            12 minutes ago      Up 12 minutes (healthy)   0.0.0.0:15432->5432/tcp, :::15432->5432/tcp
```

## フロント画面
http://localhost:8080/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/394e0cf1-a064-9d1c-a914-6aee5f859bb3.png)

## 管理画面
http://localhost:8080/admin/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/afba68f2-61d2-0c54-3b2d-47eefbd6dd76.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a550e04e-6e57-27cb-6241-06fef622b1e9.png)

>DBサーバー
PostgreSQL 14.7 (Debian 14.7-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit

## データベースにアクセス

```text
$ docker exec -it  ec-cube-postgres-1 bash
root@bfbd379d4888:/# psql -U dbuser eccubedb
psql (14.7 (Debian 14.7-1.pgdg110+1))
Type "help" for help.

eccubedb=# \db
      List of tablespaces
    Name    | Owner  | Location 
------------+--------+----------
 pg_default | dbuser | 
 pg_global  | dbuser | 
(2 rows)

eccubedb=#
```
AWSにおけるアプリケーションのログ記録のベストプラクティス

## はじめに

アプリケーションログは、アプリケーションの動作状況をログファイルに記録するプロセスです。アプリケーションよって、この動作状況は1つ以上のファイルに記録することが多いです。このログファイルは、セキュリティとパフォーマンスの分析の実行、アプリの問題のトラブルシューティングなどに役立ちます。この記事では、ログ、ログの種類およびAWSのCloudwatLogsサービスについて説明したいと思います。




各個人によって好きなAWSサービスがそれぞれだと思います。これが正解という訳ではありませんが、参考にしてただければと思います。

## 対象者

- AWSでログの記録に興味がある方。
- AWSでワークロードを運用している担当者。

## ログレベル

ログレベルについて皆さんご存じだと思いますが、主に３種類のログがあります。

| レベル 　　| 説明 　|
|:----------|:------------|
| info      | システムのステートやプログラムの状況を表示する情報。    |
| debug     | 開発時にローカル環境で問題のデバッグ中によく使う情報。 |
| error     |システムやプログラムの処理が中断したり、停止した場合のエラー情報。       |

- 開発環境では、infoやdebugのログは開発者に役立ちますのでお勧めですが、容量について注意してください。
- 本番環境では、errorだけのログを有効にすることをお勧めします。

| HTTP ステータス 　　| 説明 　|
|:----------:|:------------|
| 200      | 成功    |
| 300     | リダイレクト |
| 400     |クライアント側のエラー  |
| 500     |サーバー側のエラー |

- 本番環境では、400と500ステータスコードのみのログを有効・記録することをお勧めします。

## ログに記録するデータの注意点

- ログに記録するデータ・項目を上司またはシニアに確認してもらいましょう。組織のルールと法律を守るよう、注意してください。
- サードパーティーのログ監視ソリューションを利用するときは、ログに記録したデータの中で機密データがないかを確認してください。
- ログ保持のポリシーを考慮しましょう。
- 以下の属性はログに直接記録しないようにしましょう。必須の場合は、暗号化する事をお勧めします。
   - アクセストークン
   - 認証パスワード
   - DB接続文字列　など。

## ログデータの認証・認可の管理

- できるだけ、Logの専用アカウントにログを集中します。
- IAM ユーザーに対してログサービス（CloudwatchLog, S3 Bucket for Log）など一時停止、設定変更不可などのIAMポリシーを設定します。
- IAMユーザーに対してログサービスでログの読み取りのみの権限を付与します。

## AWSサービス

- AWS CloudwatchLog　というサービスをログ記録のために利用する事をお勧めします。
- EC2で実行中のアプリケーション及びコンテナーで実行中のアプリケーションにAWS Cloudwatchでログ送付の設定ができます。
- AWS Cloudwatchを利用すると、すべてのアプリケーションのログを一元化できます。
- ログ保持のポリシーを調整することができます。１日から１０年の保持期間をサポートしています。

Keep Learning, and Keep Practicing.

## 参考

- [Amazon CloudWatch Logs を使用して機密データを保護する
](https://aws.amazon.com/jp/blogs/news/protect-sensitive-data-with-amazon-cloudwatch-logs/)
- [Monitoring & Logging](https://docs.aws.amazon.com/whitepapers/latest/introduction-aws-security/monitoring-and-logging.html)
- [Logging and monitoring guide for application owners](https://docs.aws.amazon.com/prescriptive-guidance/latest/logging-monitoring-for-application-owners/introduction.html)
- [AWS Cloudwatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)
- [Help protect sensitive log data with masking
](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/mask-sensitive-log-data.html)
VScode 既定のフォーマッターの設定

# 概要

- VScode似て既定のフォーマッターを設定する方法をまとめる。

# 前提

- 筆者は拡張機能として「PHP Intelephense」と「php cs fixer」を入れて使っている。

# 方法

1. 任意のファイルを開き、右クリックをする。
1. 「ドキュメントのフォーマット…」をクリックする。

    ![スクリーンショット_2023-03-08_17_46_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/94a0e8ff-63ca-c2a2-d816-75a64e6d8356.png)

1. 「既定のフォーマッタを構成…」をクリックする。

    ![Controller_php_—_dokupro-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6ea3d883-2bae-97fd-fc71-9266ef7714a8.png)

1. 既定のフォーマッタに設定したいものを選択する。（筆者は「php cs fixer」を選択した。）

    ![Controller_php_—_dokupro-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cc06c0a8-28c8-fcad-266b-72b739d8f2c7.png)
Instana Agentの使用リソース制限を試してみた

# はじめに
Instana Host Agentをインストールするときに気になるのが、そのサーバーで動いているアプリケーションやサービスへ影響を与えないかということです。Instana Agentの使用するリソースを制限する設定について[ドキュメント][1]に記載がありますので、実際に設定して試してみました。  

本手順は以下の環境で実施しています。
- クライアントPC: macOS
- Instana Backend: Self-Hosted Build 241-3
- Instana Agent: RHEL 7.9

[1]:https://www.ibm.com/docs/en/instana-observability/current?topic=agent-host-configuration#limiting-host-agent-cpu-and-memory

# 設定する前のリソース使用状況

デフォルトでは、使用リソース制限は設定されていません。
Instana AgentのUIから確認したところ、ある時間帯において、CPUは53%、メモリは約420MB使用していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/ec98bed2-99e2-075a-65ec-82f117d2e1d5.png)


# 設定した内容

対象のサーバーにログインして、以下のファイルを作成します。

```shell
cat <<EOF > /etc/systemd/system/instana-agent.service.d/20-resource_limits.conf
[Service]
CPUAccounting=true
CPUQuota=25%
MemoryAccounting=true
MemoryLimit=512M
EOF
```
そして、以下のコマンドで設定を読み込みます。
```shell
systemctl daemon-reload
```
Statusコマンドでも、ファイルが読み込まれていること、メモリのlimitが設定されていることが読み取れます。ここではCPUの設定は確認できませんでした。

```shell
[root@instana-server]# systemctl status instana-agent
● instana-agent.service - "Instana(tm) agent."
   Loaded: loaded (/usr/lib/systemd/system/instana-agent.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/instana-agent.service.d
           └─20-resource_limits.conf, custom-environment.conf
   Active: active (running) since 金 2022-11-11 14:34:54 JST; 3 months 25 days ago
 Main PID: 1563 (java)
    Tasks: 202
   Memory: 511.9M (limit: 512.0M)
   CGroup: /system.slice/instana-agent.service
           ├─ 1563 /opt/instana/agent/jvm/bin/java -XX:+UnlockDiagnosticVMOptions -Xmx636641K -XX:MaxDirectMemorySize=70737K -XX:+UseSerialGC -Xmn32m -Xss512k -XX:InitialCodeCache...
           └─10906 /opt/instana/agent/data/repo/com/instana/ebpf-sensor/0.1.7/ebpf-sensor-0.1.7.bin
```
:::note warn
ドキュメントに記載のある`MemoryMax`はRHEL7のsystemdでは使用できないようで、`MemoryLimit`を使用しています。使えないオプションを使用すると、`systemctl status instana-agent`の結果に以下のメッセージが出力されます。

`systemd[1]: [/etc/systemd/system/instana-agent.service.d/20-resource_limits.conf:5] Unknown lvalue 'MemoryMax' in section 'Service'`

どのオプションが使用可能かは`man systemd.resource-control`コマンドで確認することができます。
:::

:::note warn
上記の値は検証のために設定した値であり、推奨値ではありません。
特にメモリの制限は想定外の事態を引き起こしかねないので慎重になった方が良さそうです。（[参考][2]）
:::

[2]:https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html


# 設定した後のリソース使用状況

設定後のリソース使用状況を確認すると、CPUが25%以下に制限されていることが確認できました。
メモリは元々の使用量よりも大きい上限を指定したので特に変化はありませんでした。

CPUの負荷が張り付きになっているようなグラフになっていますが、これはCPUの割り当てに対しての比率をベースにしているようで、割り当てられた25%は使い切っているのでこのようなグラフになると解釈しました。念のため確認しましたが、サーバー全体の負荷が上がっているわけではありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/1410d44a-c470-0e23-e1cc-0242d23a494c.png)



# まとめ

Instana Agentの使用リソース制限について、設定通りに動作することを確認できました。
AgentのCPU使用率はAgent起動時に高くなる傾向があるので、少な過ぎない程度に上限を設定しておくのは効果的ではないかと思いました。その分、起動により時間がかかると思うのでトレードオフになると思います。

今回はOSに直接インストールする場合について検証しましたが、Kubernetes/OpenShiftの環境では、Instana Agentを定義するDaemonSetのresource limitがデフォルトで設定されていますので、その値を基準に見直す形になると思います。特に監視対象が多い場合など、使用リソースを制限するだけでなく、使用リソース制限の上限を上げる可能性があることも考慮に入れる必要がありそうです。

# おわりに

Instana Agentの使用リソース制限について試してみた内容をまとめました。
少しでも参考になれば幸いです。
paizaラーニング レベルアップ問題集 巡回セールスマン問題メニュー JavaScript 順列全列挙

順列全列挙 (paizaランク B 相当)

https://paiza.jp/works/mondai/tsp_problems/tsp_problems__enumerate_permutations

# 解答例(C++の場合参考)
JavaScriptには順列全列挙のライブラリが用意されていないので、
自分で再帰関数を実装します。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

//関数print定義:配列pを半角スペースで出力
function print(n, p) {
  let cout = "";
  for (let i = 0; i < n; i++) {
    cout += p[i];
    if (i != n - 1) {
      cout += " ";
    }
  }
  console.log(cout);
}

//再帰関数permutation定義：空配列pに1からnまでの全順列を作る。
function permutations(n, p) {
  //pの長さがnになったら１行の順列が完成、出力する。
  if (p.length == n) {
    print(n, p);
    return;//スタックの一番上に残った関数へ戻る
  }
  //順列つくる
  for (let i = 1; i <= n; i++) {
    //配列pに要素iが存在するなら次のiへ
    if (p.indexOf(i) != -1) {
      continue;
    }
    //配列pに要素iがまだないなら
    p.push(i);//iを追加
    permutations(n, p);//さらに関数実行、スタック積む
    p.pop();//１つの関数実行完了して戻ってきて末尾削除
  }
}

//メイン
const n = Number(lines[0]);
const p = [];
permutations(n, p);
```

# 解答例
関数printを`console.log(p.join(" "));`にした。
includesを使った。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//順列つくる関数
function permutations(n, p) {
  //長さnなら出力
  if (p.length == n) {
    console.log(p.join(" "));
    return;//関数完了、スタックの一番上に残った関数へ戻る
  }
  //長さがn未満なら、順列つくる
  for (let i = 1; i <= n; i++) {
    //pにiがあればスキップ
    if (p.includes(i)) {
      continue;
    }
    //pにiがなければ
    p.push(i);
    permutations(n, p);//さらに関数実行、スタック積む
    p.pop();//１つの関数実行完了して、スタックの一番上の関数に戻ってきて末尾削除
  }
  //関数完了
}
//メイン
const n = Number(lines[0]);
const p = [];
permutations(n, p);
```


# 再帰関数について
再帰関数の理解のためには、pがどうなっているか、forのiはいくつか、スタックの積み上げ、のイメージを保ちながら、再帰関数の中を辿っていくと、よいかもしれません。

例:n=3のとき、以下のように動きます。スタック[x]はスタックのしたから何番目かを表す。
スタック[0]
p=[]でforのi=1はまだpに1がないのでpush(1)、p=[1]
p=[1]でスタック[0]に積んで、次の関数実行
スタック[1]
p=[1]でforのi=1はすでにpに1があるのでcontinue
p=[1]でforのi=2はまだpに2がないのでpush(2)、p=[1,2]
p=[1,2]でスタック[1]に積んで、次の関数実行
スタック[2]
p=[1,2]でforのi=1はすでにpに1があるのでcontinue
p=[1,2]でforのi=2はすでにpに2があるのでcontinue
p=[1,2]でforのi=3はまだpに3がないのでpush(3)、p=[1,2,3]
p=[1,2,3]でスタック[2]に積んで、次の関数実行
スタック[3]
p=[1,2,3]で長さが3なので出力。関数完了。一番上のスタック[2]に戻る。
スタック[2]
p=[1,2,3]でpop()してp=[1,2]、i=3なのでforループ終了。関数完了。一番上のスタック[1]に戻る。
スタック[1]
p=[1,2]でpop()してp=[1]、i=2なので、次のiへ
p=[1]でforのi=3はまだpにないのでpush(3)でp=[1,3]
p=[1,3]でスタック[1]に積んで、次の関数実行
スタック[2]
p=[1,3]でfor i=1はpにあるのでcontinue
p=[1,3]でfor i=2はpにないのでpush(2)でp=[1,3,2]
p=[1,3,2]でスタック[2]に積んで、次の関数実行
スタック[3]
p=[1,3,2]は長さ3なので出力、関数完了、一番上のスタック[2]に戻る
スタック[2]
p=[1,3,2]でpop()してp=[1,3]、for i=2なので次のループへ。
p=[1,3]、for i=3,pに3あり、continue、ループ終了。関数完了。一番上のスタック[1]に戻る。
スタック[1]
p=[1,3]、pop()でp=[1]、for i=3なのでループ終了。関数完了。一番上のスタック[0]に戻る。
スタック[0]
p=[1],pop()でp=[]。for i=1なので、次のi=２へ
p=[],for i=2,pに2ないので、push(2)でp=[2]
p=[2]でスタック[0]に積んで、次の関数実行。
。。。
これを同様にして、最後まで実行します。
Athena のリージョンを間違えて17万円を無駄にしてしまった話

# 発端
##### お客様のサイトダウン通知を確認
お客様のサイトダウンの通知を確認しました。
1分ほどで復旧しているため緊急性は低いものの念の為調査を行うことにしました。

##### ダウン調査開始
各種リソースの CPU 使用率とアクセスの微増が見られました。
nginx のログ、php のログ、RDS のメンテナンス時刻などを調べました。
特に問題が見つけられないため、CloudFront のアクセスログを調べることにしました。

##### Athena による調査
CloudFront のアクセスログを調査するために Athena のテーブルを作成。
複数のクエリを実行し特定の uri へのアクセス集中がないことなどから、リソース不足が原因と考え様子見ということになりました。

# 発覚
翌日、上長が該当のアカウントの「AWS Data Transfer APN1-USE1-AWS-Out-Bytes」のコストが跳ね上がっていることに気がつき調査を開始。
確認したところ、ap-northeast-1 にある CloudFront のログが保存されている S3 バケットに対して、us-east-1 の Athena でテーブルを作成しクエリを実行したため、ap-northeast-1 → us-east-1 間で大量のデータ転送( 14,333.018 GB )が発生していることを発見。
原因は CloudFront のログ検索であるとわかりました。

# 原因
原因は Athena でクエリを実行するリージョンを間違えたことでした。
CloudFront のログは ap-northeast-1 の S3 バケットにありましたが、私は Athena テーブルを us-east-1 で作成していました。
そのため、700GB ほどあるログのリージョン間での転送が発生してしまい、コストが跳ね上がってしまいました。

# 教訓
CloudFront のログ検索を Athena で行う際は、「ログが保存してあるリージョン」と「Athena でクエリを実行するリージョン」が同じであることを絶対に確認するようにしましょう。
CloudFront のログはとても容量が大きいので、間違えると今回のような大量の転送料を取られることになります。
ChatGPTを「Hey Siri」だけで呼べるようにしたら人生観変わった話

## 概要
久しぶりの投稿です。
これまではAIってカッコええなースギョイなーと思いながらも、なかなかAI関連のニュース追えてなかったり、ChatGPTが出た時も「すご、いつか触ろう」としか思えていませんでした。
ただ最近"Github Copilot"を業務で使うことを許されてからと言うもの、
「絵、絵、絵、絵、絵、え、エエアイすご！！！？！？」
とAI関連のニュースをトイレ待ちの間に探すくらいには気になってしまいました。

最近はChrome拡張機能の"Talk to chat GPT"と言うものを私用PCに入れ(業務用は危ないかな)音声だけで検索までできるようにしていました。

## 問題点
もちろんChat GPTそれ自体やTalk To Chat GPTも便利なんですが、
「もっとこう歩いている間とかふとした時にパッと調べ物したい時にも使えるようにしたいなー」
と更なる欲が出て、欲望男となってしまったのです。
これは困りましたね

そこでYoutube見ていると、[これ](https://www.youtube.com/watch?app=desktop&v=gePhjvKdUro&ab_channel=zollotech)を見つけたので、Chat GPTをSiriで検索できるようにしました。

実際に人生観が180度変わりました(嘘です)「インド行ってみ??人生観180°変わるよ」っていう人の真似です

## Make Siri Elite with OpenAI and ChatGPT
### OpenAIのAPI keyをゲット
https://beta.openai.com/account/api-keys
こちらからログインもしくは新規登録後に、API Keyを取得し、コピーします。

### ショートカットアプリを入れる
自動化大好きエンジニアの皆さんならお手のものかもしれませんが、ショートカットアプリをインストールもしくは再インストールします。
自分は使わなすぎて、再インストールしました。恥ずかしながら

### Inteligente sin APIを追加
[こちら](https://www.icloud.com/shortcuts/08b02bf88171454387dd4e44539d575b)から既存のショートカットテンプレ??を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/23c90c69-9379-469a-b6f6-1c1ce397bd4c.png)


### 編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/d3547f0d-db0a-50c8-e732-8292d1e922bb.png)


画像内該当アイコンの三点リーダーをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/17b70472-ad8a-7952-7329-8e3f6e2684df.png)


#### 名前を変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/c0018ea4-fa1e-7856-4ced-d92c628abbb8.png)

一番トップにある「Inteligente sin API」をクリックし、名前を変更する

この名前が「Hey Siri」→「ココ」にあたるので呼びやすい名前にしましょう。
動画内では「Siri Elite」になっています。

#### 挨拶を変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/abe94a8b-6c8c-1eea-a5ba-a10583128518.png)

「Text」内のCopoar api aquiを変更しましょう。
Chat GPTの呼び出しに成功した時に何を言われるかをここで決めましょう。
動画内では「What can I help with」になっています。

#### API key登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/df0c231d-e24a-4a58-8e91-f2b014eed458.png)

先ほどコピーしたAPI Keyをここに貼り付けます

#### テスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/42f97540-3def-0774-4de1-f0ceb80db3e4.png)


画面を戻って、作成したショートカットをクリックすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/da0f7c4c-11a2-d476-b594-92ff466a0313.png)

このように登録したようにChat GPTが呼ばれます

#### Hey Siriしてみる
1. 「Hey Siri」
2. 「Siri Elite」
3. 「What do you think is the best framework for frontend?」


と確認したのですが、いい感じの答えをしてくれましたね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/1f8d0449-4f59-52db-3ee5-a9fb0381ce3b.png)


#### まとめ
このようにSiriを使って、Chat GPTを呼び出せるようにすることでさらにAIを近くに感じることができます。
睡眠中にふと気になったことも目を開けずに調べることができます。

Siri + Chat GPT = 最高

## 参考

https://www.youtube.com/watch?app=desktop&v=gePhjvKdUro&ab_channel=zollotech
AWS Organizationsの全ての機能の有効化について

# 初めに
とある案件でOrganizationsを使用したセキュリティ関連の統制を行おうとしています。
今回はOrganizationsを使用するうえで障害となった「全ての機能の有効化」について記載したいと思います。

# AWS Organizationsとは
AWSアカウントを一元管理することのできるサービス。
AWSアカウントの払い出し、グルーピング、サービスコントロールポリシーの適用による操作権限の適用などをすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/feeaa5cd-543a-e10f-9d47-ad19aa89d532.png)


# Organizationsの機能セット
Organizationsの機能セットには以下の2つがあります。
今回使用していたOrganizationsでは「一括請求のみ」の使用となっていたため、一括請求以外の機能を使用するためには「全ての機能の有効化」をする必要がありました。


| 機能セット  | 説明 |
| ------------- | ------------- |
| 一括請求のみ  | Organizationsの機能のうち、アカウントの払い出しと、払い出したアカウントの請求を1つにまとめる機能のみを使用する機能セット。 |
| 全ての機能の使用 | Organizationsの全ての機能を使用できる機能セット。<br>これにより払い出したアカウント全体に対してサービスの利用制限を実施できる「サービスコントロールポリシー」の機能の利用が可能になる。|

# 全ての機能の有効化のために必要なこと
全ての機能の有効化のためには、外部から招待したアカウントで承認を行う必要があります。
Organizations配下のAWSアカウントのOrganizationsのコンソール画面で以下のような招待が届いています。
この承認を全ての外部から招待したAWSアカウントで実施しなければなりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/56f8cf57-90a9-4030-0a4e-b7d3f04fc7ba.png)

この承認が完了した後に、管理アカウントで全ての機能の有効化のプロセスを完了させることができるようになります。プロセスの完了を持って全ての機能の有効化が完了します。

# 承認における注意事項 
全ての機能の有効化の承認の際には基本的にAWSコンソールから承認を行うことになると思いますが、その際にIAMの権限には以下が必要になります。
```
organizations:AcceptHandshake
organizations:DescribeOrganization
organizations:ListHandshakesForAccount
iam:CreateServiceLinkedRole
```
Organizationsに関する権限は承認とAWSコンソールでOrganizationsの画面を見るために必要な権限となります。
IAMの権限は、この承認がされると「AWSServiceRoleForOrganizations」というIAMのサービスリンクロールが作成されるため、必要な権限となります。


# 終わりに
AWS Organizationsの「一括請求のみ」から「全ての機能の有効化」の機能セットに変更するのは思うよりもに手間のかかる作業になると思います。
Organizations配下のアカウント数が少なければ大した手間ではないですが、外部招待アカウントが多数存在する場合は大きな手間になる恐れがあると思います。
後から使いたくなった時に各アカウント管理者への周知など結構な手間が発生することになると思うので、Organizationsを使用する際には最初から全ての機能の有効化しておくことをお勧めします。
laravelのphpspreadsheetのDrawを使って画像添付したときに表示されないことがある

# 前提
エクセルをPDF化するときに画像も合わせて出力しているのですが、
あるパターンでのみ、画像の取り込みができないことが有りましたので、共有しておきます。

# 環境とパッケージ

    ”php v8.0.25”
    "Laravel Framework 8.83.26"
    "phpoffice/phpspreadsheet": "^1.18",

# 出力部分

```
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

~~~~~~~~~~~~~~~~~~~~~

$drawing = new Drawing();
$drawing->setPath($file_name);
$drawing->setName("署名");
$drawing->setWidth(180);
$drawing->setCoordinates("N190");
$drawing->setWorksheet($first_sheet->getDelegate());
```
通常のエクセルなら下記の記述で画像が添付できるのに、特定のエクセルファイルだと画像の添付が反映されない・・・！！
調査に１日使ってしまいました。

# 原因

![スクリーンショット 2023-03-08 17.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178201/6842f085-30a8-45d3-1c74-49f7122886eb.png)

こいつです。
図形のテキストボックスを利用していると悪さするようです。

# 解決方法
図形のテキストボックスを使うのはやめましょう！！！！！！

誰かの糧になれば幸いです。
「AWSベストプラクティスDDoS回復力」を読んだ感想

# 目的
AWSでDDoSどうしたらいいのか検討したくて、[AWS Best Practices for DDoS Resiliency](https://docs.aws.amazon.com/whitepapers/latest/aws-best-practices-ddos-resiliency/welcome.html)を読んで見ました。その感想を書きます
2022/4/13の版をみています。

# 感想など
## 序章
AWSで適切にサービスを選べばDDoS攻撃を緩和できるとあります。まさに自分が読みたい内容です。

### あなたはWell-Arcitectedですか？
Well-Arcitectedを知っておくといいですよという紹介。今は時間が無いので後回しにします。

## サービス拒否攻撃入門
DoSの概要説明です。OSI7層に分けて色々な攻撃があるとあります。

### インフラ層攻撃
#### UDPリフレクション攻撃
UDPの送信元IPを攻撃したいサーバーのものに設定して無関係なサーバーを反射鏡のように利用して大きなパケットを返す攻撃だそうです。これは自分のサーバーで頑張って防御するのが難しそうです。

#### SYNフロッド攻撃
TCPの初回接続、いわゆる3ウェイハンドシェイクでSYNを送けどACKを送らないことでサーバーのACK待ちの状態にしてメモリなどを食いつぶす攻撃です。これも守るのが難しい。

### アプリケーション層攻撃
アプリケーション層の攻撃は様々のようです。
HTTPフラッド攻撃、キャッシュ無効化攻撃、WordpressXMLRPCフラッド攻撃

## 緩和テクニック
全てのAWSのサービスにはAWS Shield Standardがついているので一般的で頻繁なインフラ層攻撃は防いでもらえるようです。無料で！
CloudFrontとGlobalAcceleratorとRoute53は既知のインフラ層攻撃は守ってくれるようです。
アプリケーション層攻撃に対してはAWS WAFを使えばよいとのこと
インバウンドのネットワークは無料だしDDoSの攻撃トラフィックは無料

そして、ベストプラクティスの構成の表

AWS Shield Advanstを使うとお金取るけどもっと色々やってくれるとのこと

### ベストプラクティスDDoS緩和
#### インフラ層防御
AWSは基本的には防ぐけど、EC2ではネットワークは広いし拡張できるので安心です。

#### EC2オートスケーリング
ロードバランサー協調して防ぐし、オートスケールがあればサービスが止まらないとのこと。まあお金がかかりそうですね。

#### ELB
ELBを使えば負荷が分散できる
ELBはスケールするから負荷をさばける

#### セキュリティグループ
セキュリティグループを使えば受けつけないIPアドレスを設定できる

### スケールのためにエッジローケーションを使う
CloudFrontとGlobalAcceleratorとRoute53はエッジごとにわかれて、DDoS緩和するので良い

#### エッジでWebアプリケーションを配信
CloudFrontはDDoSからオリジンを保護してくれる。S3を使っている人はCloudFrontを使おう

#### Global Acceleratorを使ってオリジンからネットワークトラフィックを更に保護する
CloudFrontが使えない場合、こちらを使いましょう

#### エッジでドメイン名解決
Route53を使えば問題無し

### アプリケーション層防御
#### 悪意のあるWebアクセスを発見して防ぐ
CloudFrontとAWS WAFを使いましょう。
CloudFrontでエッジごとにアクセスしてくれるのと不要なアクセスは防いでくれる。遅いアクセスは遮断してくれる
WAFを使うとおかしな動きをするIPアドレスを止められるし、マーケットプレイスでIPアドレスをさらに防ぐルールが売ってます
WAFはキャッシュ無効化攻撃も防いでくれる

#### 自動的にアプリケーション層のDDoSイベントを防ぐ
AWS Shield AdvanctやAWS Firewall Managerを使えばもっと防げる

## 攻撃面の減少
外部にさらす部分を減らしていく

### AWSリソースの難読化
EC2はインターネットに公開しなくてもロードバランサーとセキュリティグループを使えばアクセスできます。
セキュリティグループはただ。

### セキュリティグループとネットワークACL
セキュリティグループは後からでも付けられます。つければ暗黙的に全てのアクセスを拒否します。
ELBのセキュリティグループを作成して、EC2複数のセキュリティグループを作成して接続すれば、EC2を隠せます。
ネットワークACLを使えばIPアドレス制限ができます
AWS Shiled アドバンストに入ればEIPを登録できて早めにDDoSを検知できます。

### オリジンの保護
VPC内のオリジンはCloudFrontを使うとx-shared-secrtというヘッダーでCloudFront経由かどうかわかる。
Lambdaを使うことで、CloudFrontのみのアクセスを許可するセキュリティグループを設定できます。CloudFrontとWAFをバイパスすることできなくなります。

### APIエンドポイントの保護
APIもDDoSの対象になるので緩和するためにはAPI Gatewayを使う。
EC2やLambdaの入り口にAPI Gatewayを使えば難読化できてDDoSが緩和できます。
API　Gatewayは2種類あって1つはCloudFrontディストリビューションを介してアクセスされるエッジ最適化エンドポイント。
2つ目はREST APIと同じリージョンにするリージョンAPIエンドポイント。こちらはCloudFrontとWAFを使えます。
x-api-keyを使うとAPI Gatewayの直接アクセスを防ぎます
バーストレートを指定することで、負荷を防ぎます

## オプションのテクニック
異常な動作の可視化、アラートの自動化、大規模な保護などオプションの話をします。

可視性
CloudWatchで見ることができる。AWS Shieldアドバンストならもっと見れる

### 複数のアカウントにわたる可視性と保護の管理
複数のアカウントにわたるような場合、AWS ShieldアドバンストとAWS Firewall ManagerとAWS Security Hubを使って管理する。

### サポート
サポートに相談すれば支援する。AWS Shieldアドバンストならもっと早く対応できるよう。

## まとめ
この資料を読めばDDoSの回復に役にたつ。
AWS Shieldアドバンストなら(以下略)

# この資料のまとめ
DDoS対策のおおまかな情報を得られました。
基本的にはAWS WAFとCloudFrontを全面に置いて、保護していけばよさそうです。
AWS Shieldアドバンストの圧が強かったですが、コスト見合いなら入れてもいいかもです。
HEMS

# HEMS(Home Energy Management System: ヘムス)
電気やガスのメータ、太陽光発電装置、家電製品などを家庭内ネットワークに繋ぎ、HEMSコントローラに接続することで制御し、```エネルギー使用量を可視化して節約```に結びつけたり、```快適な生活環境を作る```ためのシステム。
日本政府は```エネルギー消費量の削減と温暖化抑止を目的```として、全家庭にHEMSを設置することを目指している。
# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
ロングテール

# ロングテール
仮想店舗（ネットショップ）では少人数で賄えるため。販売数量の少ない商品を扱うことも可能。

ネットショップの取り扱い商品の販売傾向は、```販売量の少ない商品が尻尾のように続くグラフ```から、ロングテールと呼ばれる。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

```販売数の少ない商品であっても多品種を揃える```ことで、それらの売り上げ```合計の割合が大きくなり、利益を得る```られること。

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4

# 感想
ロングテールのおかげで助かっている
JIT

# JIT(Just In Time:「必要な時に必要なだけ」）
製造途中の仕掛品を減らし、原材料や完成品の```過剰な在庫を抱えないよう```に、必要な量をタイムリーに調達・生産する管理方式。
### カンバン方式
中間在庫の削減によって```保管費用や管理の手間を軽減```できる。```後工程が前工程に対して、後工程の作業に必要な仕掛品や部品の数量と期日をオーダー```する```カンバン方式```は、JIT生産方式を実現する方法の一つ。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

```後工程が自工程の生産に合わせて、必要な部品を前工程から調達```します。

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4

# 感想
在庫を残さないようにするための工夫か。
【Django】submitボタンを複数用意してpost処理を条件によって使い分ける

## 問題
よく何かの登録画面の「送信」や「登録」などで使うsubmitボタンだが、「承認」と「非承認」のように複数のsubmitボタンを用意して処理をかき分ける時はどうすればいいのか。

## 結論
nameタグで区別するだけ。

## 実装
typeタグに加えてnameタグを一意に設定
~~~html:テンプレートファイル
<form method="post">
    {% csrf_token %}
    <button type="submit" name="reject">非承認</button>
    <button type="submit" name="approve">承認</button>
</form>
~~~

nameタグ別に処理を記入
~~~python:views.py
def post(self, request, id):
    if "approve" in request.POST:
        # 承認時の処理
    elif "reject" in request.POST:
        # 非承認時の処理
~~~
自己流 AWS ロールに割り当てる権限を最適なものにする方法

# 概要

- 自己流のIAMロールに割り当てる権限を最適なものにする方法を簡単にまとめる。

# ご注意

- 本方法は自己流のやり方を記したものです。ベストプラクティスは他にあります。

# AWSの権限に関する考え方

- AWSに限らずかも知れないが、権限は必要最小限のみ与えるのが一般的である。
- 「アクセスできるからこれでいいや」などの考えで安易にFullAccessなどの権限を与えるべきではないという事っぽい。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#grant-least-privilege

# どうするのか？

## 最小特権ポリシーを生成して使う

- この記事を書くために情報を調査するまでこんな物があると知らなかった。
- どうやらCloudTrailに溜まっているログに基づいて必要最小限のポリシーを作ってくれるらしい。

## 一旦大きい権限で動くものを作って徐々に権限を絞る

- ちょっと大雑把なやり方になるが、一旦大きめのFullAccess権限を与えてそこから、アクセスするリソースを絞るなどをしてゆく方法が比較的楽だった。

### 例：lambda関数から任意のS3バケットにアクセスする。

1. S3FullAccess権限をlambda関数に与える。
1. lambda関数に任意のS3バケット内リソースを閲覧する処理を記載する。
1. 一旦lambda関数を実行して問題なく動作することを確認する。
1. lambda関数のロールにつけたS3FullAccess権限を一旦剥奪する。
1. 自身でS3FullAccess時にバケットを指定するポリシーを作成する。
1. lambda関数のロールに自身で作成したポリシーを追加する。
1. lambda関数を実行して正常にバケットを指定しないS3FullAccessの時と動作が変わらないか確認する。
共通フレーム

# 共通フレーム
システム開発の作業全般にわたり、```開発作業の受注側と発注側の双方が共通認識を保つための枠組み```で、八つのプロセスで構成される。システム開発の各工程はこの中の```テクニカルプロセス```に含まれ、さらに、６つのプロセスに分かれる。

## 企画プロセス
経営課題や現行の業務・システムの```問題点を分析して、システム化の対象となる業務の明確化```

## 要件定義プロセス
新システムの利害関係者を識別し、```利害関係者の要求や制約条件から業務要件を定義```

## システム開発プロセス
システム要件を定義。```必要なハード、ソフトの構成。システム構成要素を順に結合```し、システムを作り上げて、テスト、システム導入、システム受け入れ支援などを行う。

## ソフトウェア実装プロセス
システム開発プロセスで定義された```必要な機能、能力などをソフトウェア要件として定義```、ソフトウェア構築を行う。

## ハードウェア実装プロセス
システムに必要な動作、インターフェースや実装上の制約条件を満たす```ハードウェアやサービスを構築または選定```し、設置及び設定などを行う。

## 保守プロセス
導入されたシステムやソフトウェア製品が定められた機能を果たし、```性能を維持できるようにメンテナンス```を行う。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
Javaを基本からまとめてみた【this・super】

①this と super によるメンバ変数・メソッドの呼び出し
```
this.~ ＝　自分のオブジェクトの~
super.~ = スーパークラスの~
```
##### メリット
- 同じコードを書かなくて良い
- 引数名を考えなくてもよい　⇨ プログラムを自動的に作成できるようになる

```Sample.java
class Person {
String name ;
void setName(String name){
//thisキーワードを使うことによって引数の名前をメンバ変数の名前と合わせる
書き方ができる
this.name = name;
}
void display(){
System.out.println(this.name);
}
class Student extends Person {
ind stuNo;

//オーバーライド
void display(){
//super.display()でスーパークラスのdisplay()を読み出している
//⇨ 上書きする前の処理を呼び出してあげるという記述
super display();
System.out.println(stuNo);
}
}
```
②this と super によるコンストラクタの呼び出し

```
this (引数)は、同じクラスの中でコンストラクタを呼び出しあうことができる
super(引数)は、スーパークラスのコンストラクタを呼び出すことができる

※ this (引数)~,super(引数)はコンストラクタ内の先頭に記述する。
なければ自動的にsuper();が挿入される
```
```this.java
class Person {
   String name;
   Person(){
    this.("未設定");
}
   Person(String name){
    this.name = name;
  }
}
```
```super.java
class Student extends Person {
   int stuNO;
   
   Student(String name, intstuNo){
   super(name){
    this.stuNo = stuNo;
  }
}
```
```Peson3.java
public class Person{
  private String name;

public Person3(String name) {
 this.name = neme;
}

public void display(){
  System.out.println("名前："　+ name);
 }
}
```
```Student3.java
public class Student3 extends Person3{
 private int stuNo;

public Student3(String name){
 this (name, 999);
}
public Student3(String name, int stuNo){
 super (name);
 hits.stuNo = stuNo;
}
public void display(){
  super.display();
  System.out.println("学籍番号："　+ name);
 }
}
```
```execution(実行用).java
public class StuSample3 {
	public static void main(String[] args) {
		Student3 stu = new Student("Kenny");
        stu.display();
	}
}
```



## 参考サイト
[thisとsuperの使い方を初心者向けに解説【Java入門講座】4-3 thisとsuper](https://www.youtube.com/watch?v=_K3icVzjz-s)
AWS ポリシー S3 指定バケットだけFullAccess許可するユーザーポリシー

# 概要

- 特定のS3バケットだけFullAccess許可をするユーザーポリシーをまとめる。

# 結論

- 特定のS3バケットだけFullAccess許可をするユーザー定義ポリシーを先に記載する。

    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:*",
                  "s3-object-lambda:*"
              ],
              "Resource": "S3バケットのリソースネーム（arn）"
          }
      ]
    }
    ```

# 例

- 例えば筆者のmiriwo-testバケットのみFullAccessを許可したい場合は下記の様になる。（S3バケットのリソースネームはバケットの「プロパティ」の「バケットの概要」に記載されている。）

    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:*",
                  "s3-object-lambda:*"
              ],
              "Resource": "arn:aws:s3:::miriwo-test"
          }
      ]
    }
    ```