OmniAICreator/Qiita-1.07M huggingface dataset:
毎日自動でStackSatsしよう：Bybit編

# 趣旨
とりあえず動く最も簡単な部類のbotを作ってみようという企画です。

まったく同じことをコードを書かなくても取引所の標準機能で可能なので、はっきり言って無駄なんですが、cronの備忘録にもなりますし、初心者はこういうところから始めた方が頭に入ってきやすいと思うので公開します。

:::note alert
以下のコードを実行する場合は全て自己責任でお願い致します。
本記事は教育目的での共有であり、投資を勧誘するものではありません。
:::

# Pybit


まずはディレクトリを作成します。
```
mkdir stacksats
cd stacksats
```

次に仮想環境を用意します。
用意しなくてもコードは実行できますが、念のためにやっておいた方が良いです。

```
python3 -m venv myenv
source myenv/bin/activate
```

次にpybitというライブラリをインストールします。
```
pip install pybit
```
pybitを使って成行注文するコードを準備します。
```python: market_order.py
from pybit.unified_trading import HTTP
import config

session = HTTP(
    testnet=False,
    api_key=config.bybit_spot_api_key,
    api_secret=config.bybit_spot_secret_key,
)
response = session.place_order(
    category="spot",
    symbol="BTCUSDC",
    side="Buy",
    orderType="Market",
    qty="", #イコールの右側のダブルクオーテーションの中にDCAしたいBTC量に書きます
    )
print(response)
```

config.pyに直接API情報を書くのは推奨しませんが、ここでは例なのでそのまま書きます。
実際にコードを動かすときは暗号化した方が良いです。

```python: config.py
bybit_api_key = ''
bybit_secret_key = ''
```

# Cron設定
定時に特定のプログラムを自動で起動させる場合に使える機能です。
以下、使い方を記述します。

crontabを開きます。
```
crontab -e
```
起動させる条件を記載します。
ログも残すようにセットします。
以下の設定だと毎日0時に起動されます。
```
* 0 * * * /home/user/stacksats/market_order.py >> /home/user/stacksats/cronjob_bot.log 2>&1
```

:::note info
アスタリスクはそれぞれ以下の時間を表します。
[minute] [hour] [day of the month] [month] [day of the week]
:::

以下のコマンドでファイルの編集権限を変更します。
```
* chmod +x /home/user/market_order.py
```
:::note info
chmodはchange modeを表し、ファイルやディレクトリのアクセス権限を変更するコマンドです。
+xで execute権限を付与します。
:::

cronを起動させます。
```
sudo systemctl status cron
sudo systemctl start cron
```
初学者からのC言語学習

# 前置き
こんにちは。初めてQiitaで記事を書いてみます。
僕は大学３年生の文系学生で３年生の初め頃からマイペースに、プログラミングサークルに入りながらプログラミングを学習してきました。
今回は42Tokyoのpiscineが来月に控えているのでそれに向けてC言語を学ぶこととなりました。

# piscineに受かるために
piscineに合格するためにはかなりハードワークする必要があるというのをtwitterやインターネットでよく閲覧しました。そのため、来月のpisineまでの学習スケジュルをここでは記録します。ちなみに、2月25日から始まる予定です。

# 学習スケジュール
## 1月21日〜28日

C言語について基本知識を身につけたいと思います。

教材１：ドットインストール

https://dotinstall.com/lessons/basic_c

## 1月29日〜2月4日

教材1と2に関しては2月1日までに終わらせて、なるべく早く苦しんで覚えるC言語に入りたいです。

教材１：paizaラーニング

https://paiza.jp/works/c/primer

教材２：１週間で身につくC言語の基本

https://c-lang.sevendays-study.com/

教材３：苦しんで覚えるC言語

https://9cguide.appspot.com/

## 2月5日〜2月12日

ここからは少しどう勉強していこうか深めきれていないところがあります。（誰かアドバイスいただけるとすごく嬉しいです。。。）
少なくとも以下の教材を進めたり、あとはアルゴリズムについても触れていければいいかな... と考えている次第です。

教材１：新・ときながら学ぶC言語

https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E8%A7%A3%E3%81%8D%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6C%E8%A8%80%E8%AA%9E-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/4797384093

教材２：アルゴリズム的思考力が身につく！ プログラミングコンテストAtCoder入門

https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E7%9A%84%E6%80%9D%E8%80%83%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%EF%BC%81-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88AtCoder%E5%85%A5%E9%96%80-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87-ebook/dp/B0B6MLQ43C/ref=sr_1_8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3QPW4WVOUW07U&keywords=%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1706432211&s=books&sprefix=%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%2Cstripbooks%2C287&sr=1-8

## 2月13日以降...

まだ何も見当がついていないです...なるべく復習しながら常にC言語に触れていきたいです！！


# 追記・後書き

この期間はAtcoderや競プロにも触れたいと思います。特にC言語で競プロに取り組んだことがないのでABCには必ず参加して、コンスタントに取り組みたいです。


私が個人的に参考にしていきたいサイトをここで載せたいと思います。

https://growth-hack-library.com/posts/42tokyo-piscine/

https://flash.hatenablog.com/entry/2023/01/26/014729

教材や学習の進め方について、アドバイスありましたらぜひお願いしたいです... ！！
以下は私のtwitterアカウントになりますのでもしよろしければフォローお願いします！

https://twitter.com/tarooodesy
Spring Boot 依存関係の追加（プロジェクト作成後）

# はじめに
Spring Bootプロジェクト作成後にdependencies（依存関係）を追加する方法を紹介します。

# 前提条件
- ビルドツールにMavenまたはGradleを利用していること
- Spring Bootプロジェクトが作成済みであること
もしプロジェクト未作成であれば以下の記事を参考にしてください。※以下の記事はIDEにIntelliJを使用しています
https://qiita.com/high_high/items/263cfcbd712ada6cddd3

# 対象者
- 開発を進める途中で依存関係を新しく追加したい方

# 依存関係追加手順
※本記事では例としてPostgreSQLを使用するための依存関係を追加する手順となっております。
　また、ビルドツールがMaven or Gradleの場合で手順が多少異なります

1. [Spring Initializr](https://start.spring.io/)にアクセス

2. 「Maven」を選択(Gradleの場合は「Gradle - Groovy」を選択)
![スクリーンショット 2024-01-28 17.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624418/8232cb6c-a717-71eb-e762-d0ada916cde0.png)

3. 「ADD DEPENDENCIES...」をクリック
![スクリーンショット 2024-01-28 17.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624418/c96be0ac-c49c-c15a-293a-1e638e9dedc3.png)

4. 依存関係を検索して追加（例：PostgreSQL Driver）
![スクリーンショット 2024-01-28 16.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624418/1677c3af-51cc-047d-51ba-d9ef4ca78f13.png)

5. 「EXPLORE」をクリック
![スクリーンショット 2024-01-28 17.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624418/b0406ce3-b9a3-d79c-c545-a42174f6c2f9.png)

6. `dependencies`の中に追加された対象の依存関係をコピー
![スクリーンショット 2024-01-28 17.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624418/e6b92c12-2b69-07ce-ad87-2c9b16e054b1.png)
※`spring-boot-starter`と`spring-boot-starter-test`はデフォルトで追加されているものなので気にしない

7. 依存関係を追加したいプロジェクトを開き、`pom.xml`（Gradleの場合は`build.gradle`）に 6 でコピーしたものをペースト

    ```pom.xml
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            --- 追加 ここから ---
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
            --- 追加 ここまで ---
        </dependencies>
    ```

    ```build.gradle
    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter'
    	testImplementation 'org.springframework.boot:spring-boot-starter-test'
    	runtimeOnly 'org.postgresql:postgresql' //　←追加
    }
    ```

# おわりに
手順は以上で終了です。
ここまで読んでいただきありがとうございます。
gitlabにsshで接続できない！


### サーバー建てたのでgit cloneしよっと

```
ssh: Could not resolve hostname <gitlabのアドレス>: Temporary failure in name resolution
fatal: Could not read from remote repository.
```
### おや？
どうやら名前解決できてないっぽいぞ…？
IPを指定してもう一回

```
$ git clone <ipアドレスに変換したgitlabのssh>
Cloning into <gitlabのアドレス>...
<gitlabのアドレス>: Permission denied(publickey).
fatal: Could not read from remote repository

Please make sure you have the correct access rights
and the repository exists.
```

### なんでや！
- やってること
	- keyを作成
	- gitlabに鍵を登録 
- なんでpremission蹴られるのかわからない…


### どうやら鍵がクライアント側に登録されてないようだ

ふむふむ。鍵が登録されているか確認して、登録する、と。

```
$ ssh-add -l
Could not open a connection to your authentication agent.
```

？
なるほど、ssh-agentが動いてないのね。

```
$ eval 'ssh-agent' // これはダメだった
$ eval "$(ssh-agent)"
Agent pid <ランダムのid>
```

もっかい確認。
```
$ ssh-add -l 
The agent has no identities.
```

お。表記が変わった。登録されてないね。
```
$ ssh-add ~/.ssh/<鍵のファイル名>
Identity added:<鍵の場所>
```

登録された！

では、満を持して…
```
$ git clone <gitlabのssh>
ssh: Could not resolve hostname <gitlabのアドレス>: Temporary failure in name resolution
fatal: Could not read from remote repository.
```

あ、名前解決はされないのね。

```
$ git clone <ipアドレスに変換したgitlabのssh>
remote: Enumerating objects: 12527, done.
remote: Counting objects: 100% (50/50), done.
remote: Compressing objects: 100% (50/50), done.
remote: Total 12527 (delta 20), reused 0 (delta 0), pack-reused 12477
Receiving objects: 100% (12527/12527), 10.60 MiB | 31.28 MiB/s, done.
Resolving deltas: 100% (9415/9415), done.
```

### YATTA!!
へへ、いったぜ…
今回初めてまっさらな状態でgit cloneしてみたので、sshのことがわかってないのもあり、sshについて理解を深めていきたいと思いました… 
すごく初歩的なことで苦戦してたので、これからも研鑽していきます。


#### 参考
参考にさせていただきました。ありがとうございます。

https://webree.jp/article/ssh-add-error/

https://wing-degital.hatenablog.com/entry/2020/01/03/175752
Minecraft Kotlinプラグイン開発 入門編 Part.0 目次と今後の展望

## はじめに
はじめまして。
色んなマイクラサーバーで開発を手伝っているtowaです。

私はマイクラで数年前から、
コマンド、データパックを利用して色々なシステムを身内向けで作ってきました。

また、ここ2、3年ではマイクラサーバーの開発を主に手伝うようになりました。
しかし、コマンドやデータパックで出来ることには限りがあったり負荷の面を考えて
Skriptというプラグインを利用して、マイクラのシステム開発をするようになりました。

その後、色々勉強した後にSkriptでも自由度に限界を感じて、  
ついにプラグインを作成する決心をしました。  

:::note info
**Skript:** マイクラサーバーのプラグインを簡単に作成できるプラグイン
:::

このブログではマイクラのプラグイン開発を新しくする人のために、  
まだ浅い私のプラグイン開発のログを残しておこうと思います。  
もしマイクラサーバーで開発をしたいという方が居たら、  
試しに勉強してみてください！  

**次** → [入門編 Part.1 IntelliJ IDEAのインストール](https://qiita.com/tooooowa/items/15ced22071759d7d79a3)  

## 環境について

<details><summary> <b>気になる方のみ</b> </summary>
私の環境はIntelliJIDEAを使用し、<br>
言語はKotlinでGradleを利用してプラグインを作っています。<br>
プラグインを作ったりしたことが無い方は全くわからないと思いますが、<br> 
分からない方は気にしないで大丈夫です。<br>
0から始める方はこれを真似して作ってもらって良いのですが<br>
こだわりがある方は別の方の記事を参考にしてください。
</details>

## 記事一覧
| **ページURL** | **内容** |
|:-:|:--|
| [入門編0](https://qiita.com/tooooowa/items/15ced22071759d7d79a3) | 目次と今後の展望 |
| [入門編1](https://qiita.com/tooooowa/items/15ced22071759d7d79a3) | IntelliJ IDEAのインストール |
| [入門編2](https://qiita.com/tooooowa/items/149fb92def74f70a731a) | Kotlinを使うマイクラプラグインの環境構築 |
| [入門編3](https://qiita.com/tooooowa/items/4aed0ea7e2cf2b55f134) | イベントの作成 |
| [入門編4](https://qiita.com/tooooowa/items/b02d0f06bdacb637c060) | 簡易的なコマンドの作成 |
| [番外編1](https://qiita.com/tooooowa/items/e32143047f2913a13330) | plugin.ymlの高度な編集 |
| [中級編1](https://qiita.com/tooooowa/items/e823499575c6500f2ab5) | コマンドの引数の設定 |
| [中級編2](https://qiita.com/tooooowa/items/0e03ed15504d9b253898) | チェストGUIの作成 |
| [中級編3](https://qiita.com/tooooowa/items/9df53fea8ced007765b4) | GUIのクリック検知 |
| [中級編4](https://qiita.com/tooooowa/items/7eeee6c2c1b8f5d29b8c) | コマンドの実行 |
| [番外編2](https://qiita.com/tooooowa/items/9df54031db9382109356) | プラグインフォルダへ直接ビルドする方法 |

## 注意点
私自身が勉強した内容をなるべくそのまま書く形になるので  
コードが汚かったりすると思います。ご注意ください。  

## 最後に  
短いですが、今回の記事はここまでです。  
次回は IntelliJ IDEA をインストールし、日本語化までします。  
お疲れ様でした。  

**次** → [入門編 Part.1 IntelliJ IDEAのインストール](https://qiita.com/tooooowa/items/15ced22071759d7d79a3)  

## 追記
公開から1ヶ月ほどで色んな方に読んでもらえてモチベに繋がってます。
少しでも最初のところで躓いてしまう人を減らすために
私も初心者ですが、助け合える部分は助け合いたいため
質問できるコミュニティを作成しました。

もし記事を読む中で躓く箇所があったら
お気軽にこのコミュニティで質問してみてください！

参加URL→ https://discord.gg/3NEN5s5gnG
“Amazon Inspectorの新機能: EC2インスタンスのCISベンチマーク評価が可能に！

# ■概要

Inspectorでアップデートがあったようですね。
少し見ていきます。

Amazon Inspector now supports CIS Benchmark assessments for operating systems in EC2 instances
（和訳:Amazon Inspector が EC2 インスタンスのオペレーティング システムの CIS ベンチマーク評価をサポートするようになりました）

https://aws.amazon.com/about-aws/whats-new/2024/01/amazon-inspector-cis-benchmark-assessments-operating-systems-ec2-instances/

# ■Amazon Inspectorとは

簡単に言うと、AWSリソースの健康診断のようなものです。
問題が見つかった場合にはその詳細と治療法を教えてくれる（治療まではしてくれない）という感じです。

そもそもAmazon Inspectorは、AWSが提供するセキュリティ対策ソリューションで、アプリケーションのセキュリティとコンプライアンスの向上を目的に開発されたもので、
EC2インスタンス、Lambda関数、ECRなどを対象にAWSソフトウェアの脆弱性を自動的に管理します。

# ■Inspectorの項目

項目としては大きく２つあります
これらの項目を定期的、もしくは単発でスキャンしてダッシュボードで可視化する事ができます。↓

### ・ネットワーク接続性
EC2インスタンスに対して、外部から到達可能であるSSHやHTTPなど、よく使われるポートを検出し、評価します。
### ・パッケージの脆弱性
CVEに基づき、OSやソフトウェアなどのパッケージについて、環境評価が可能です。


# ■CIS ベンチマークとは

Center for Internet Security (CIS)が提供する、情報システムを安全に構築・維持管理するためのベストプラクティスをまとめたガイドラインのことを指します。
  
これらのガイドラインは、PCやサーバ、ネットワーク機器、モバイル機器、データベース、アプリケーション、クラウドサービスなど、様々な製品やサービスに対してバージョンごとに詳細なパラメータまでを定めています。

CIS Benchmarks とは何ですか?
https://aws.amazon.com/jp/what-is/cis-benchmarks/

# ■コンソールから見てみる

恐らく以下画像の「CIS SCAN」の所が今回アップデートのお知らせになった部分なのかなと思います。

![インスペクター1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/45e8c244-4b26-234a-2aa5-68b7550c8ad6.png)

右上の「Create new scan」からCIS ベンチマークの評価をスタートする事ができます。

必要な項目として特に難しいものはなく、
・スキャン対象となるリソースにつけているタグを指定する事
・ターゲットとなるアカウント
・単発か定期実行するか
という所です。

![createnew.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/03310404-99a3-088f-7681-65ad1c62be20.png)

# ■ベンチマークレベル

後は、ベンチマークレベルというものがありました。
「Level 1」に比べ、「Level 2」の方がより高度な評価となるみたいですね…

レベル1、2について以下に記載します。

### ■レベル 1 プロファイル
レベル 1 プロファイルの設定に関する推奨事項は、IT システムを設定するための基本的なセキュリティに関する推奨事項です。
それらを実行するのは簡単で、ビジネス機能や稼働状況に影響を与えません。
これらの推奨事項により、IT システムへのエントリポイントの数が減り、サイバーセキュリティのリスクが軽減されます。

### ■レベル 2 プロファイル
レベル 2 のプロファイル設定の推奨事項は、セキュリティが優先される機密性の高いデータに最適です。
これらの推奨事項を実施するには、中断を最小限に抑えて包括的なセキュリティを実現するための専門知識と入念な計画が必要です。
レベル 2 プロファイルの推奨事項の実施は、規制コンプライアンスの達成にも役立ちます。 

# ■最後に

見ると分かりますが、インスペクターめちゃくちゃ見やすいです
AWSアカウント内のセキュリティに関する情報を分かりやすくまとめてくれるので、上手に運用に乗せて使いこなして行きたいものですね…
DeepLinkの動作確認を簡単にする方法

# はじめに
今回はDeepLink実装の動作確認を簡単にする方法を紹介します
この記事を読む前に下記の記事を読んでおくとわかりやすいです
https://qiita.com/ryuji_sato/items/9e0906141f7ec36ff0ce
### 本文
上記の記事にあるリンクを開いた状態で端末を接続して適当なサイトを開くと下記のようにコードを見ることができます
ここで適当なボタンに対して書かれてるhrefに対して右クリックをすると`edit attributes`という項目があるのでそれを選択して試したいリンクを貼り付けることで簡単に動作確認をすることができます
![スクリーンショット 2024-01-28 17.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/0a56d350-1f46-b3a8-4aab-305420853e4e.png)

### 最後に
テキストリンク化でもいいのですが、実際にWeb上で動かさないといけない時などに役立つかと思います
The signature '(data: string): string' of 'btoa' is deprecated.ts(6387) が出たときの解決方法

# はじめに
以下のように Base64 でエンコード・デコード処理を実装しようとした際、TypeScript の非推奨エラーがでたので、その解決方法のメモです。

```index.ts
const encoded = btoa("1234");
console.log(encoded);
const decoded = atob(encoded);
console.log(decoded);
```

エラーメッセージ
- ```The signature '(data: string): string' of 'btoa' is deprecated.ts(6387)```
- ```The signature '(data: string): string' of 'atob' is deprecated.ts(6387)```

2024年1月時点で、MDN のサンプル通りの書き方をしていたので、一瞬何でだろうと思いました（サンプルは、JS ですが）。

https://developer.mozilla.org/ja/docs/Glossary/Base64

```js
const encodedData = btoa("Hello, world"); // 文字列をエンコード
const decodedData = atob(encodedData); // 文字列をデコード
```

# 解決方法
各 API の前に ```window``` を追加すれば、解決できました。

```index.ts
const encoded = window.btoa("1234");
console.log(encoded);
const decoded = window.atob(encoded);
console.log(decoded);
```

# 参考
- [Base64](https://developer.mozilla.org/ja/docs/Glossary/Base64)
- [Convert a string to base64 in JavaScript. btoa and atob are deprecated](https://stackoverflow.com/questions/68849233/convert-a-string-to-base64-in-javascript-btoa-and-atob-are-deprecated)
.NET8 OAuth Googleログイン



## Google API Consoleでの設定
1. Google API Consoleにアクセスして新しいプロジェクトを作成
2.「認証情報」ページで「認証情報を作成」を選択し、「OAuth クライアント ID」を作成
3. アプリケーションタイプを「ウェブアプリケーション」とし、承認済みのリダイレクトURIに、あなたのアプリケーションのリダイレクトURI（例: https://localhost:5001/signin-google）を追加
4. クライアントIDとクライアントシークレットを生成

## NuGetパッケージのインストール
```
dotnet add package Microsoft.AspNetCore.Authentication.Google
```

## シークレットマネージャーの使用
プロジェクト ディレクトリで次のコマンドを実行
```
dotnet user-secrets init
```

クライアントIDとシークレットをセット
```
dotnet user-secrets set "Authentication:Google:ClientId" "CLIENT_ID"
dotnet user-secrets set "Authentication:Google:ClientSecret" "CLIENT_SECRET"
```

※プロジェクトを右クリック→ ユーザーシークレットの管理 から`secrets.json`に正しく設定されているかを確認

## Program.csの設定
```cs
var builder = WebApplication.CreateBuilder(args);

// 他のサービス設定...

builder.Services.AddIdentity<ApplicationUser, IdentityRole>(options =>
    options.SignIn.RequireConfirmedAccount = false) // 外部ログインではアカウント確認を求めない
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

// 認証サービスを追加
builder.Services.AddAuthentication(options =>
{
    // 既存の認証設定...
})
.AddGoogle(googleOptions =>
{
    // Google API Consoleで取得したクライアントIDとシークレットを使用
    googleOptions.ClientId = builder.Configuration["Authentication:Google:ClientId"];
    googleOptions.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];
});


var app = builder.Build();

// 他のミドルウェア設定...

app.UseAuthentication();
app.UseAuthorization();

// 他のミドルウェア設定...

app.Run();
```
### コントローラーの設定
```cs
public IActionResult GoogleLogin()
{
    var redirectUrl = Url.Action("GoogleResponse", "Account");
    var properties = _signInManager.ConfigureExternalAuthenticationProperties("Google", redirectUrl);
    return new ChallengeResult("Google", properties);
}

public async Task<IActionResult> GoogleResponse()
{
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (info == null)
    {
        return RedirectToAction(nameof(Login));
    }

    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
    if (result.Succeeded)
    {            
        return RedirectToAction("Index", "Home");
    }
    else
    {         
        return RedirectToAction(nameof(Register));
    }
}
```



## Reference
- [Google API Console](https://console.cloud.google.com/)
- [ASP.NET Core での Google 外部ログインのセットアップ](https://learn.microsoft.com/ja-jp/aspnet/core/security/authentication/social/google-logins?view=aspnetcore-8.0)
- [ASP.NET Core での開発におけるアプリ シークレットの安全な保存](https://learn.microsoft.com/ja-jp/aspnet/core/security/app-secrets?view=aspnetcore-8.0&tabs=windows)
- [ASP.NET Core の Identity の概要](https://learn.microsoft.com/ja-jp/aspnet/core/security/authentication/identity?view=aspnetcore-8.0&source=recommendations&tabs=visual-studio)
Reactでvideoのアップロードフォームを作る

# はじめに
今回は、Reactでvideo(動画ファイル)をアップロードし、そのファイルのプレビューを行うことのできるフォームを紹介します。

# コード全文

```react
  const inputRef = useRef();
  const [source, setSource] = useState();
  const [file,setFile] = useState();

  const handleFileChange = (event) => {
    const file = event.target.files[0];
    const url = URL.createObjectURL(file);
    setFile(file);
    setSource(url);
  };

  const handleChoose = (event) => {
    inputRef.current.click();
  };

  return (
    <div className="VideoInput">
      <input
        ref={inputRef}
        className="VideoInput_input"
        type="file"
        onChange={handleFileChange}
        accept=".mov,.mp4"
      />
      {!source && <button onClick={handleChoose}>動画を選択</button>}
      {source && (
        <video
          className="VideoInput_video"
          width="100%"
          height="400px"
          controls
          src={source}
        />
      )}
      <div className="VideoInput_footer">
        {source || "ファイルが選択されていません"}
      </div>
    </div>
  );
```
<details><summary>cssはこちら</summary>

```css

.VideoInput {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  border: 1px solid #ddd;
}

.VideoInput_input {
  display: none;
}

.VideoInput_video {
  display: block;
  margin: 0;
}

.VideoInput_footer {
  background: #eee;
  width: 100%;
  min-height: 40px;
  line-height: 40px;
  text-align: center;
}

```
</details>

# 要点解説
プレビューを可能にしているのは、主に`souce`のおかげです。
```javascript
const url = URL.createObjectURL(file);
setSource(url);
```

`URL.createObjectURL`というメソッドは、Fileなどを引数に取って、`video`や`img`タグで表示できるurlを生成してくれます。

生成されたurlを`setSource(url);`のようにするとコンポーネントの再描画が走り、

```react
{source && (
        <video
          className="VideoInput_video"
          width="100%"
          height="400px"
          controls
          src={source}
        />
      )}
```
`source && ~~`、つまり`source`が`null`では無くなった(trueである)時に左辺が評価され、生成されたurlがsrcに入ったvideoが表示されるというわけです。

また、これはおまけですが、
inputタグにある`accept=".mov,.mp4"`で、inputできるファイルの拡張子を設定することができます。

ファイル自体は`file`に保存されているので、postする時などはこちらをつかいます。

画像の場合も同じような感じで書けますので、ぜひやってみてください！
RailsとNext.js：ウェブ開発の二つの異なるアプローチ

ウェブ開発の世界は広く、さまざまなツールやフレームワークが存在します。

この記事は、2つの人気のある技術、Ruby on Rails（通称「Rails」）とNext.jsについて、それぞれの特徴や利点をまとめています。

## Ruby on Rails（Rails）とは？
Railsは、Rubyというプログラミング言語で書かれたサーバーサイドのウェブアプリケーションフレームワークです。2005年に登場して以来、多くのウェブサイトやアプリケーションで使用されています。

**Railsの特徴と利点**

- 規約重視のフレームワーク: Railsは「Convention over Configuration（設定より規約）」の原則を採用しており、開発者が一般的な決定やパターンを迅速に進めることができます。
- 全スタック開発: Railsはデータベース、ウェブサービス、ウェブページなどの全てを扱うことができ、一貫した開発体験を提供します。
- 豊富なジェム: Rubyのライブラリ（ジェム）は非常に豊富で、多くの機能を簡単に組み込むことができます。
大規模なコミュニティ: 長年の歴史と広範な使用により、豊富なリソースとサポートが得られます。


## Next.jsとは？

Next.jsは、JavaScriptのライブラリであるReactを基にしたフロントエンドのウェブ開発フレームワークです。特に、サーバーサイドレンダリングや静的サイト生成に力を入れています。

**Next.jsの特徴と利点**

- サーバーサイドレンダリング: Next.jsはサーバーサイドでページをレンダリングし、ページの読み込み速度を向上させることができます。
- 静的サイト生成: ビルド時に静的ファイルを生成することで、高速なサイト配信が可能です。
- 柔軟なデータフェッチ: ページごとにデータフェッチの方法を選択できるため、多様なウェブアプリケーションの開発が可能です。
- Reactベース: 既にReactを使用している開発者にとっては、学習コストが低いです。

## まとめ
RailsとNext.jsは、ウェブ開発の異なる側面に焦点を当てています。Railsはサーバーサイドの全スタック開発に適しており、一方でNext.jsはフロントエンドのパフォーマンスと最適化に優れています。プロジェクトのニーズに応じて、これらを選択することが重要です。
単体テスト 



## 単体テストが分からない人へ

エンジニアになってから1年間運用保守に携わっていて、設計やSTに携わっていたので、実装、単体テストの経験がありませんでした。

研修などで知識としては頭にあったものの、実際に作業を始めると分からないことだらけで、知識と実際の作業が全く紐づかない状況で、とても大変な思いをしたので、備忘録として残します。

同じような境遇の方の力になればと思います。


## 単体テストが分からない理由

単体テストが分からない理由は

私の場合、
テストの全体像が把握できていないことでした。

単体テストと聞いて、頭の中にある「ホワイトボックステスト」や「制御フローテスト」などイメージはありましたが、その単語と実際の目の前にあるコードをどう紐づけて、そしてどうテストケースを洗い出せばよいのかがわかりませんでした。

そうしたミクロの視点から初めてしまうと、軸が定まっていないため「テストケースが漏れている」や「観点が違う」との指摘をもらってばかりでした。

そこで一度立ち止まり、マクロの視点から考えなおすことにしました。

## 単体テストの立ち位置は？

そもそも単体テストとは
ウォーターフォールの工程でいえば、コーディング後の工程で結合テストの前の工程です。

![v_shaped_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878631/db6ca73f-ff57-5d6f-8842-17c419d09ab9.png)
(https://webrage.jp/techblog/v_shaped_mode/　より引用)

V字モデルでは、一番大きな要求分析から始め、要件定義、基本設計と、作業がより具体的かつ小さな単位になっていきます。
そしてコーディングが最小単位で、その後、単体テスト、結合テストを経て、一番大きな受け入れテストに進んでいきます。

この時イメージしてほしいのは、各工程における成果物の量です。

要求分析は、せいぜい、顧客とのやり取りに使う数ファイルが成果物となると思います。
そして進んで基本設計はその機能分の成果物になり、詳細設計ではより細かい単位で十数ファイルほどに分割されていくと思います。
その後テスト工程になると、その逆で、成果物が多い工程から徐々に少なくなっていくものです。

Ｖ字モデルについて
コーディングと単体テストは全くの別物なので違いはあきらかですが、私は単体テストと結合テストの違いをあまり理解できていなかったので、まとめます。

単体テストと結合テストはそれぞれの役割が異なります。

・単体テスト：最小単位の機能ごとに正しく動作することを確認する

・結合テスト：複数の機能が相互的に作用し、正しく動作していることを確認する

具体的な例を挙げると

例えば、入力欄にユーザーの名前を入力し、生年月日を得るシステムがあったとして
内部構造はA→B→Cとような処理構造になっています。

そのシステムのテストを考えると

単体テストは
　Aが正しく動作すること
　Bが正しく動作すること
　Cが正しく動作すること

結合テストは
　A→B→Cの全体が正しく動作すること

 がそれぞれ目的です。（あくまでイメージ）

ここで先ほどの成果物の量を思い出してほしいのですが、単体テストの方が成果物の量が多くなりそうですよね。
なぜならより細かい単位で確認を行うからです。

そして、結合テストは単体テストでそれぞれの機能（ABC）が正しく動いていることを前提にテストをします。

これで、単体テストと結合テストの違いが分かったかと思います。

## 最後に

テストの目的は2つあると考えています。

1つ目は「V字モデルの構成で対になる設計書に記載されている仕様通りの実装となっていることを確認する」

2つ目は
「受動的な作業ではなく、バグを見つける能動的な仕事」

この2つを忘れないように、今後もテストを実施していきたいです。

随時更新予定です。
誤りなどありましたらコメントによろしくお願いいたします。
【応用情報対策】個人的わかりづらいところ

# まえがき
応用情報技術者試験を過去問道場で解いていたら何回解いても間違えてしまう箇所があったためここに書くことにしました。
アウトプット大事。

https://www.ap-siken.com/apkakomon.php

# システム開発の流れと共通フレーム

「共通フレーム2013」では、テクニカルプロセスとして企画、要件定義、システム開発、ソフトウェア実装、ハードウェア実装、保守の各プロセスが規定されている。
ここでは特に間違えがちな「企画」と「要件定義」について記述する。
### 企画
企画プロセスは、以下の2つのアクティビティに分けられる。
1.システム化構想の立案
2.システム化計画の立案
それぞれ詳しく見ていく。

#### 1.システム化構想の立案
経営上のニーズ、課題を実現・解決するために、置かれた経営環境を踏まえ新たな業務の**全体像**とそれを実現するためのシステム化構想および推進体制を得ることが目的
以下7つのタスクからなる。

①経営上のニーズ・課題の確認
②事業環境、業務環境の調査分析
③現行業務、システムの課題分析
④情報技術動向の調査分析
⑤対象となる業務の明確化
⑥業務の新全体像の作成
⑦対象の選定と投資目標の策定

#### 2. システム化計画の立案
システム化構想を具現化するために、**システム化計画及びプロジェクト計画を具体化**し利害関係者の合意を得る。
主に以下のタスクからなる。

①業務モデルの作成
②全体開発スケジュールの作成
③プロジェクトの目標設定
④関連する情報技術の調査
⑤費用とシステム投資効果の予測




### 要件定義
利用者および他の**利害関係者**が求めるシステムに対する要件を定義することを目的とするプロセス。
※「利害関係者のニーズ」とか出てきたら要件定義


# PMBOK
PMBOKとはプロジェクト管理の手法の1つ。
「Project Management Body Of Knowledge」の略で、プロジェクト管理の参考・基準になる知識体系である。
「ピンボック」と読むらしい。~~読めるか~~
PMBOKは以下の枠組みで構成されている。



### 5つのプロセス
・立ち上げ
 &nbsp; &nbsp;プロジェクトの認可を得る。**利害関係者の特定**など。
・計画
&nbsp;&nbsp;**プロジェクトのスコープ**を洗い出し、実行すべきタスクや要員を明確にする。
・実行
&nbsp;&nbsp;タスクを進める。
・監視
&nbsp;&nbsp;計画内容と実施内容に乖離がないか確認、あれば調整。
・終結
&nbsp;&nbsp;プロジェクトのデータを次回活用できる形で保管する。

### 10の知識エリア
・統合管理
・コスト管理
・調達管理
・リスク管理
・スコープ管理
・資源管理
・コミュニケーション管理
・スケジュール管理
・品質管理
・ステークホルダー（利害関係者）管理

### 3のパート
PMBOKでは、各プロセスの各知識エリアに3つのパートがあると考えている。

・入力
&nbsp;&nbsp;作成前の設計書など
・ツールと技法
&nbsp;&nbsp;作成中の設計書
・出力
&nbsp;&nbsp;完成した設計書

![PMBOK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686445/e4a48501-1bf2-637f-bed5-aa0ccf39a320.jpeg)




# まとめ
頭の中がぐちゃぐちゃになりがちな「共通フレーム」と「PMBOK」について、アウトプットすることである程度理解することができた。（とはいえ完全に理解できたわけではないが）
今後もこのページを繰り返し参照することで知識を定着させていきたい。
GCP Cloud Dataprep機能/実装

# GCPのCloud Dataprepの概要と機能

## 目次
- [概要](#概要)
  - [Cloud Dataprepとは](#Cloud-Dataprepとは)
  - [主な特徴](#主な特徴)
- [機能/詳細](#機能/詳細)
  - [データ準備と変換](#データ準備と変換)
  - [視覚的なデータ探索とプロファイリング](#視覚的なデータ探索とプロファイリング)
  - [データ品質の監視と洞察](#データ品質の監視と洞察)
  - [簡単なデータのシェアとコラボレーション](#簡単なデータのシェアとコラボレーション)
- [まとめ](#まとめ)
- [サンプルコード](#サンプルコード)

## 概要

### Cloud Dataprepとは
Cloud Dataprepは、Google Cloud Platform（GCP）のデータプレパレーション（データ準備）サービスです。データのクリーニング、変換、統合などを視覚的に行うことができます。クラウド上で簡単にデータの事前処理や前処理を行い、データ分析や機械学習モデルのトレーニングに使用することができます。

### 主な特徴
- インタラクティブなデータ準備: 視覚的なインターフェースと覚えやすいトランスフォーメーション（変換）を使用して、データ準備を行うことができます。
- 自動化と柔軟性: 手作業を最小限に抑えながら、データ品質の向上やデータ変換の自動化を実現します。
- チームでの共同作業: 複数のユーザーが同じプロジェクトで作業し、データを共有して編集できます。
- オープンで柔軟な統合: BigQuery、Cloud Storage、Googleシートなど、さまざまなデータソースと統合できます。

## 機能/詳細

### データ準備と変換
Cloud Dataprepでは、データのインポートや統合、変換を視覚的なインターフェースで行うことができます。以下は主な機能です。
- 視覚的なトランスフォーメーション: ドラッグアンドドロップ、クリック操作などを使用してデータの変換やクリーニングを行います。
- スキーマの自動検出: データのインポート時に自動的にスキーマを検出し、処理を容易にします。
- スケーラブルなデータプレパレーション: クラウド上で処理を実行するため、大規模なデータセットでも高速に処理できます。

### 視覚的なデータ探索とプロファイリング
データの可視化とプロファイリングは、データ準備の重要なステップです。以下はCloud Dataprepの主な機能です。
- データのプレビューと可視化: データの分布や傾向を可視化し、データの理解を深めることができます。
- データ品質の評価: 不足している値、重複する行、異常値など、データの品質を評価することができます。

### データ品質の監視と洞察
データ品質の監視は、データプリパレーションの一貫した品質を維持するために重要です。以下はCloud Dataprepの機能です。
- ルールベースのデータ品質チェック: ルールを作成して、データ品質の問題を自動的に検出します。
- 監視ダッシュボード: データ品質の指標やトレンドを確認し、問題の早期発見や傾向の把握ができます。

### 簡単なデータのシェアとコラボレーション
Cloud Dataprepでは、作成したデータフローを簡単に共有し、共同作業することができます。
- データフローシェアリング: 他のユーザーとデータフローを共有し、再利用することができます。
- 複数人での作業: 同じプロジェクトで複数のユーザーが同時に作業することができます。

## まとめ
Cloud Dataprepは、GCPのデータプレパレーションサービスであり、データの準備、変換、クリーニングなどを視覚的に行うことができます。主な特徴としては、インタラクティブなデータ準備、自動化と柔軟性、チームでの共同作業、オープンで柔軟な統合があります。
マイナスの数値の文字列を数値に変換する（備忘録）

正の数の文字列を数値に変換する際に使う、Number,+,parseIntをそのまま使うだけです。

```javascript
Number('-1')
//-1
parseInt('-1')
//-1
+'-1'
//-1
```

今までマイナスの文字列を数値に変換したことがなかったです。
備忘録とします。
Teratermマクロで自動ログインした後にコマンドを実行する

# teratermマクロで自動ログインした後にコマンドを実行する
teratermマクロで自動ログインした後、続けてコマンドを実行したいこと、あると思います。私はありました。
例えば、取得しているログに残すためにdateコマンド叩いたり、作業用のディレクトリに移動したりなど。
ログイン時に自動でコマンドを実行させたい…毎回ログイン時に同じコマンド実行するのはめんどくさい…（し、ちょいちょい忘れる）
ということで以下のようなteratermマクロを作りました。

~~~autoLogin.ttl
;仮想環境自動ログインマクロ

;各処理呼び出し
call login
call execCommand_beforeLogin

end


;ログイン処理実行
:login
【自動ログイン処理】

return

;コマンド実行
:execCommand_beforeLogin
sendln 'id;date;uname -n'
sendln 'cd ~/WORK'

return
~~~


# が、うまく動かない
上記のマクロを実行するとこうなります。
自動ログインはできるのに後続のコマンドが実行されない…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/20996f03-7b61-28e9-f4f4-9513fb850b64.png)

# こうしたら動いた！
~~~autoLogin.ttl
;仮想環境自動ログインマクロ

;各処理呼び出し
call login
call execCommand_beforeLogin

end


;ログイン処理実行
:login
【自動ログイン処理】

return

;コマンド実行
:execCommand_beforeLogin
;★☆↓この行を追加★☆
wait USERNAME
;★☆↑この行を追加★☆
sendln 'id;date;uname -n'
sendln 'cd ~/WORK'

return
~~~

# どういうこと？
**waitでコンソールに自分のホスト名が表示されるまで待機**して、それからsendlnでコマンドを実行しているということです。
ログイン直後にコンソール画面に返ってくる文字列を指定すればいいので、ユーザ名でなく、ホスト名とか、なんならプロンプトの「#」を指定しても自動ログイン可能です。

職場では大量のサーバにログインする必要があるうえ、運用ルールでログイン時にいくつかのコマンドを実行する必要があるので相当煩わしかったのですが、このマクロによって相当作業の効率化が図れそうです。
[Unity]追尾してくる弾を作る方法[角度変更なし][2D]

# 初めに
今回はUnityで自機弾を作る方法を紹介します。Translateを使って角度を変えずに作るので注意してください
# 自機弾を作る
それでは早速作っていきましょう。
三平方の定理を使います。三平方の定理とはa²+b² = c²というもので、直角三角形の二辺がわかるともう一つの辺もわかるというものです。これを使って弾と追尾する物の距離を求めて、xとyをどれだけ移動させればいいか求めます
<img width="400" alt="段落テキスト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682516/569de4b2-ede5-8bc7-5177-adcc3a854b42.png">

:::note info
aの辺は隣辺,bの辺は対辺,cの辺は斜辺といいます
:::

弾のコードはこんな感じです

```C#:弾のコード
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Build;
using UnityEngine;

public class BarrageLittleBlueController : MonoBehaviour
{
    GameObject player; //追尾される側のオブジェクトを定義
    float abjacentLength; //隣辺の長さ
    float oppositeLength; //対辺の長さ
    float obliqueLength; //斜辺の長さ

    void Start()
    {
        this.player = GameObject.Find("追尾するオブジェクトの名前");
    }
    void Update()
    {
        abjacentLength = player.transform.position.x - transform.position.x; //追尾する物のX座標から弾のX座標を引いて隣辺の長さに代入します。
        
        oppositeLength = player.transform.position.y - transform.position.y; //追尾する物のY座標から弾のY座標を引いて対辺の長さに代入します。

        obliqueLength = Mathf.Sqrt(abjacentLength * abjacentLength + oppositeLength * oppositeLength);
        //隣辺の長さと対辺の長さの合計の平方根を求めて斜辺の長さに代入します。Mathf.Sqrt()は平方根を求める関数です。
        transform.Translate(abjacentLength * 1.0f / obliqueLength, oppositeLength * 1.0f / obliqueLength, 0);
        //斜辺の長さ分の進みたい距離を隣辺と対辺にそれぞれかけて、xとyをどれだけ移動させればいいか求めます。
    }
}
```
:::note info
1.0fのところには弾のスピードを入れてください。
:::


これで追尾する弾を作ることができます
# 終わりに
追尾してくる弾はシューティングゲームでよく使われがちです。
これを使ってあなたのゲームをもっと楽しくしてみてください。
AWSクラウドプラクティショナー　AWS CloudTrail と Amazon CloudWatch

AWS CloudTrail と Amazon CloudWatchの違いについてよく間違えてしまうので備忘録

大前提
AWS CloudTrailはAWS およびハイブリッドおよびマルチクラウド環境でのユーザーアクティビティと API の使用状況を追跡

https://aws.amazon.com/jp/cloudtrail/

より抜粋

Amazon CloudWatchはアプリケーションを監視し、パフォーマンスの変化に対応し、リソースの使用を最適化し、運用状況に関する洞察を提供するサービス

https://aws.amazon.com/jp/cloudwatch/

より抜粋

間違えやすい点
・追跡と監視を間違えやすい

見分け方
trailの意味は手がかり、トレース、（何かが）通った跡，痕跡；小道，獣道
の意味であることに注意しておく。
問題の発生を調査するのか監視をするのかで見分ける。



> EC2インスタンスなどのリソースを起動・終了させるなどのアクションをユーザー毎に確認する必要があります。
こういう問題が厄介で引っかかりやすい
答えはtrail。
AWS およびハイブリッドおよびマルチクラウド環境でのユーザーアクティビティに該当する。
反面Amazon CloudWatchにユーザーアクティビティを確認するもの機能はない。
Web Componentsの可能性〜CSS設計の教科書を読んで〜

# 1. はじめに
Web開発の世界では、技術の進化と共に新しい課題が常に出現します。
特に、HTMLとCSSにおけるコードの管理と再利用性は、多くの開発者が直面する大きな課題の一つです。
この記事では、従来のHTML/CSSの限界点と、それを解決するための一つのアプローチであるWeb Componentsについて深く掘り下げます。Web Componentsがどのようにして再利用性の問題を解決し、保守性を向上させるのか、また、それによってどのようなメリットが得られるのかを詳しく解説していきます。

# 2. この記事を読んで欲しい人
- HTMLとCSSを使ったウェブ開発に携わっているが、コードの再利用性や保守性に課題を感じている方
- より効率的でメンテナンスしやすいウェブ開発の方法を探している方

# 3. 前提条件
HTMLとCSSの基本的な知識があることを想定しています。
JavaScriptに関する基礎的な理解もあると、より内容を深く理解できるかと思います。

# 4. 現状のHTML/CSSにおける限界
## 4.1. 問題点
### 4.1.1 再利用性の欠如
従来のHTML/CSSでは、特定のデザインやレイアウトを複数のページやコンポーネントで使用したい場合、そのスタイルやマークアップを各場所にコピー＆ペーストする必要があります。
例えば、あるウェブサイトで同じデザインのボタンを複数のページに配置したい場合、そのボタンのHTMLとCSSをそれぞれのページにコピーする必要があります。
この方法では、同じコードの重複を引き起こし、変更があった場合にはそれぞれの場所を個別に更新する必要があり、非効率です。

### 4.1.2 保守性の問題
大規模なプロジェクトでは、多数のCSSルールが存在し、これらが様々なHTML要素に適用されます。
プロジェクトが成長するにつれ、新しいスタイルが追加されると、どのスタイルがどの要素に影響を与えるのかを理解し追跡するのが難しくなります。
また、一つのスタイルを変更すると、意図しない影響が他の要素に及ぶ可能性もあり、CSSの管理が複雑になります。

### 4.1.2 スコープの問題
CSSは基本的に全体に適用されるグローバルスコープを持っています。
これは、一つのスタイルルールがウェブページ全体に影響を与えることを意味します。
例えば、あるクラス名でスタイルを定義した場合、そのクラス名が使用されるすべての要素にそのスタイルが適用されます。
そのため、意図せず他の要素にスタイルが適用される問題が発生することがあります。
また、異なる開発者が同じクラス名を使用すると、スタイルの競合が発生し、意図したデザインが壊れることもあります。

## 4.2. 解決方法
Web Componentsのような技術を使用することで解決することができます。
Web Componentsでは、スタイルとマークアップをカプセル化することにより、再利用性を高め、保守性を向上させると同時に、スコープの問題を解消します。

# 5. Web Componentsとは
Web Componentsは、再利用可能なカスタム要素を作成し、ウェブのUIをより柔軟に、効率的に管理するための技術です。
HTML、CSS、JavaScriptを組み合わせた一つのカスタム要素をウェブページ上で再利用することが可能になります。
主に以下の3つの技術で構成されています。

## 5.1. 技術
### 5.1.1 Custom Elements（カスタム要素）
**概要**
  ユーザーが自定義したHTML要素を作成できます。
**具体例** 
`<MyButton>` というカスタムボタンを作成することができ、これに独自のスタイルや振る舞いを定義できます。
このカスタムボタンは、どのHTMLファイルにも `<MyButton></MyButton>` として追加するだけで、同じ見た目と機能を持つボタンを表示できます。

```react:create.jsx
const MyButton = () => {
  return <button>Click me!</button>;
}
```

 ```react:use.jsx
const App = () => {
  return (
    <div>
      <MyButton />
    </div>
  );
}
```

### 5.1.2 Shadow DOM（シャドウ DOM）
**概要**
DOMの一部を隠し、スタイルやマークアップをカプセル化します。
**具体例** 
<my-button> の内部にShadow DOMを作成すると、そのスタイルは <my-button> 内部に閉じ込められ、外部のCSSの影響を受けません。
そうすると、他の要素とスタイルが競合することなく、コンポーネントを安全に使用できます。

```html:example.html
<script>
  class MyButton extends HTMLElement {
    constructor() {
      super();
      const shadow = this.attachShadow({mode: 'open'});
      shadow.innerHTML = "<button>Click me!</button>";
    }
  }
  customElements.define('my-button', MyButton);
</script>
```

### 5.1.3  HTML Templates（HTMLテンプレート）
**概要**
`<template>` と `<slot>`タグを使って、HTMLの断片を定義し再利用します。
**具体例** 
テンプレートタグ `<template> `を使用して、再利用可能なHTMLの断片を作成できます。例えば、繰り返し使用されるユーザーのプロフィールカードをテンプレートとして定義し、必要なところで簡単に呼び出せます。

```html:example.html
<template id="user-profile-template">
  <div class="profile">
    <img src="" alt="User photo" />
    <h2></h2>
    <p></p>
  </div>
</template>
```


## 5.2. Web Componentsの仕様
Web Componentsの仕様は以下の点に特徴があります。
- 独立性
コンポーネントは他のコードから独立しており、グローバルなスタイルやスクリプトの影響を受けにくくなっています。
- 再利用性と保守性
  コンポーネントの再利用が容易であり、コードの保守もしやすくなっています。

# 6. まとめ
本記事では、従来のHTML/CSSの限界と、それを克服するためのWeb Componentsの利点について学び、アウトプットしました。
再利用性の高いコンポーネントを作成することで、コードの重複を減らし、開発の効率を高めることができ、カプセル化されたスタイルとマークアップにより、保守性が向上し、大規模なプロジェクトでも管理が容易になることを学びました。
⑧3次元弾性体の応力とひずみとは？「youtube 【初めて学ぶ人のための材料力学の教室】演習問題2/2」をsympyでやってみたい。

・演習問題2/2

# youtubeです。
**途中07:15から (0:00〜10:57)**

https://www.youtube.com/watch?v=CBpGVbwCqcY&t=435

＜再生リスト
https://www.youtube.com/@zairiki/playlists

# sympyで
・ver0.1
```python
# ver0.1
from sympy import *
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
var('E,ν'           ,real=True)
var('σx,σy,σz'    ,real=True)
var('εx,εy,εz,εv',real=True)
var('τxy,τyz,τyz' ,real=True)
var('α ,ΔT'        ,real=True)
rep={E  :200*10**( 3),ν :0.3, \
     α : 10*10**(-6),ΔT:100,  \
     # σx:1  ,σy:1  ,σz :0 
     σy:0  ,σz :0 
     #τxy:0  ,τyz:1,τzx:0,    \
     # τxy:0  ,τyz:1  ,       \
     }
εx    =σx/E-ν*σy/E-ν*σz/E+α*ΔT         ;print("# εx=",εx)
εx_rep=εx.subs(rep)                    ;print("# 0="  ,εx_rep)
σx_ans=solve(εx_rep)[0]                ;print("# σx=",σx_ans);print()
# 
εy    =-ν*σx/E+σy/E-ν*σz/E+α*ΔT        ;print("# εy=",εy)
εy_rep=εy.subs(rep).subs({σx:σx_ans})  ;print("# εy=",εy_rep)
# εx= ΔT*α - ν*σy/E - ν*σz/E + σx/E
# 0= σx/200000 + 0.001
# σx= -200.000000000000

# εy= ΔT*α - ν*σx/E - ν*σz/E + σy/E
# εy= 0.00130000000000000
```
# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

#### 参考文献

~~＞等分布荷重を受ける単純支持はり~~
~~＞JSME p85~~
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~
GitHubActionsを使用してスキーマからドキュメントを自動生成してみた

# はじめに
GraphQL開発初心者のバックエンドエンジニアです。
Restで開発していた時は、SwaggerでAPIドキュメントを作成していました。
GraphQLを使用開始してからスキーマファイルを見る時、ファイルを直接見ており、やりづらさを感じていました。
そこでスキーマファイルをドキュメント化できないかと色々調べてみましたので、アウトプットしていきたいと思います。

本投稿が初のため、読みづらさあると思いますが、よろしくお願いします。

# 概要
- GraphQLのスキーマファイルからドキュメントを作成して、スキーマを見やすくしたい。
- ドキュメント化して可読性を上げることで開発生産性を向上させたい。

# 前提
- GraphQLを使用した開発経験は1年未満。
- 現在の開発現場ではGitHubを使用している。
- 手動でのドキュメント修正はしたくない。（メンテしなくなるため）

# 調べてわかったこと
- GitHubActionsを使用して、スキーマファイルに修正があったらドキュメント自動生成するのが良さそう。
    - こうすればドキュメントは意識せずに、開発時はスキーマファイルだけ修正すればいい。
- ドキュメント化にはHTML形式 or MarkDown形式で出力できる2パターンがある。
    - △：HTML形式→GitHubPagesで公開して生成したHTMLを見るイメージ
    - ○：MarkDown形式→普通にGitHub上で見れる（基本はGitHub上で見るためこちらがBetter）

# ドキュメントツールの比較
※.調べたら色々ありましたがシェア高そうなのを載せてあります

ツール | HTML or MarkDown | メリット | デメリット | example
-- | -- | -- | -- | --
SpectaQL | HTML | シェア高そうで、参照できる記事が一番多い。   (少し前GraphQlのセミナーに参加した時、発表者もこれ使ってるって言ってた) | 導入するとしたらGitHubPagesで公開してみることになりそうだが、別ページに行くのも面倒で見なくなりそう | https://hibohiboo.github.io/kartagraph/publish/graphql-schema/#group-Operations-Queries
Code-Hex/gqldoc | MarkDown | MarkDownなのでGitHub上でソースを見ればドキュメントが見れる。   GitHubActionsのワークフローが準備されている。 | - | https://github.com/Code-Hex/gqldoc/blob/main/example/starwars/README.md
graphql-markdown | MarkDown | ・MarkDownなのでGitHub上でソースを見ればドキュメントが見れる | (これというデメリットではないが、、)     GitHubActionsのワークフローは準備されていない | https://github.com/wheatandcat/PeperomiaBackend/blob/master/schema.md



HTML形式で出力するツールはSpectaQL以外にも結構あったが、
基本的にどれも同じかと思ったため割愛。
([2fd/graphdoc](https://2fd.github.io/graphdoc/star-wars/string.doc.html)などあったが、`SpectaQL` と大体同じ)

# 検討結果
`Code-Hex/gqldoc`を採用
- ドキュメント化するとQuery,Mutations,Objects,Enums,Unions,Input objects,Scalarsごとにファイル作成されるが、現状問題なし。
- GitHubActionsのワークフローを利用して、スキーマ修正のPushがあったらドキュメントが自動生成されるようにGitHubActionsを設定。

# おまけ
調べてたらこんなドキュメントツールもありました。スキーマがネストとして複雑になってきたら便利だと思いました。
https://graphql-kit.com/graphql-voyager/

# 最後に
自動化は実施すればチーム全体の生産性が向上させることができるため、とても有用だと思いました。
これからもドキュメント化に限らず、ほかの手動作業についても自動化されることができるようにしていきたいです。
読んでいただいた方、ありがとうございました。
展開したファイルが正しくコピーされているか確認する

SEをやっていてsshみたいなのは全然使えず手でSVNからダウンロード、手作業でリリースみたいなことは普通にあったりします。
それ自体は仕方ないなと思うのですが、あちこちにファイルを置く場合、本当にリリースできたか心配なことが多いです。
そういうことを少しでも減らす方法がないか調べてみました。

## md5sumの--checkオプションでファイルチェックを行う
例えばvimのダウンロードページに行くとダウンロードディレクトリ配下にMD5SUMというファイルが用意されています。
https://ftp.nluug.nl/pub/vim/unix/MD5SUMS

このファイルをダウンロードしてLinuxなどにインストールされている `md5sum` に `--check` というオプションを使うとこんな感じで出力されます。
※下記の例では vim-8.1.tar.bz2は空ファイル、 vim-8.2.tar.bz2` は正しくダウンロードしたファイルです

```
% md5sum -c MD5SUMS
(略)
md5sum: vim-8.0.tar.bz2: No such file or directory
vim-8.0.tar.bz2: FAILED open or read
vim-8.1.tar.bz2: FAILED
vim-8.2.tar.bz2: OK
md5sum: WARNING: 62 listed files could not be read
```

* 存在しないvim-8.0.tar.bz2 → 開けなかったメッセージ(FAILED open or read)
* ダミー用に作った空ファイルのvim-8.1.tar.bz2 → FAIL
* ちゃんとダウンロードした vim-8.2.tar.bz2 → OK

となっています。

## md5sumの--checkオプションで使えるフォーマット

MD5SUMSというファイルの中身は単純で各行が下記のようにハッシュ値、ファイル名が並べられています。ちなみに試しに絶対パスでやっても上手く動きました。

```
6bf455c878d536f3957f0bc89cca539e  README
(略)
2f3e6ab74d20eea2dc00cedc3f0ee4e8  vim-8.2.tar.bz2
```

このフォーマットは `md5sum` コマンドの出力であり、マニュアルによると下記のフォーマットになっています。

> 各入力 FILE に対する出力フォーマットは、 MD5 sum 値・スペース・ファイルタイプを示す文字 (バイナリなら \`*'、テキストなら \` ')・ファイル名、からなる。 --check は入力がこのフォーマットであるものとみなす。
[md5sum - コマンド (プログラム) の説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/m/md5sum.1.html)

テキストの場合、空白1文字です。

ちなみに、このフォーマットいくつか流儀があるらしくGNUの `cksum` コマンドによるとMD5SUMは Untagged output formatらしく、他に
* Legacy output format
  CRC、バイト数、ファイル名の順
  (例: `4012370823 3345 MD5SUMS`)
* Tagged output format
  `ハッシュ方法 (ファイル名) = ハッシュ値`
  例: ( `MD5 (MD5SUMS) = 3cf87c0a65d4fc00bc091627c9850617` )
[cksum output modes](https://www.gnu.org/software/coreutils/manual/html_node/cksum-output-modes.html)

の方法があるようです。さらにsigファイルのように署名を検証するツールがありますが、ここでは扱いません。
https://www.gnupg.org/gph/en/manual/x135.html
https://ac-as.net/verification-of-gpg-signature/

## SEの手ファイル展開に使用する
上記のmd5sumを使う方法はLinuxなどmd5sumコマンドが使える環境でのみ有効です。ダウンロードしてきて使っても良いのですが、客先で使わせてーっていうのが面倒な方は下記にこんな感じってPowerShellを残しておきます。
Windows11のPowershell5で確認しましたが、10でも大丈夫だと思います。

```powershell
# ハッシュ値とファイル名一覧が書かれたファイルを指定
$hashfile = Get-ItemChild "(MD5ファイル)"
# 一覧が書かれたファイルのフォルダへ移動
pushd $hashfile.Directory

# ファイルを開く
get-content $hashfile `
| %{ $hash, $filename = $_ -split "  ", 2  # スペース2つで分割、ただし作成後の配列は2つだけにする
    if (Test-Path $filename) {  # ファイルが存在したら
        if ((Get-FileHash -Algorithm MD5 $filename).Hash -eq $hash) {  # MD5でハッシュ値をとり一覧の中にあったハッシュ値と比較
            echo ("OK:   " + $filename)
        } else {
            echo ("NG:   " + $filename)
        }
    } else {
        echo ("Lost: " + $filename)  # 存在しなかったらLostと表示
    }
}
# 移動まえに戻る
popd
```

## チェック用のファイルを作成する
`md5sum --check` に使うファイルは、リリース前に展開するフォルダに対して `find . -type f -exec md5sum {} \;` とすれば作成できます。
一応、Powershellは下記みたいな感じになるかと。

```powershell
# 事前に一覧をとるフォルダに移動してください
# ファイル一覧を取得
# ファイルハッシュを取得、その後にスペース2文字をくっつけ
# ファイルパスを出力。このとき、相対パスにし、先頭の.\は削除、パスの区切りの\も/に変更する
dir -File -Recurse
| %{ ( `
    (Get-FileHash -Algorithm MD5 $_.FullName).Hash `
    + "  " `
    + ((Resolve-Path -Relative $_.FullName) -replace "^\.\\", "").Replace("\", "/") `
)}
```
------

参考:
[md5sumコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-md5sum)
公式ドキュメントを見ながらflutterのPATHを通す

Flutterのインストールは、基本的に公式ドキュメント（https://docs.flutter.dev/get-started/install/） を見ながら進めれば問題ないのですが、久しぶりにPATHを通したらいろいろ忘れていて時間がかかってしまったので備忘メモを残しておきます。

▼インストールの最後の方に、FlutterのPATHを通してねという指示がある
>3.Copy the following line and paste it at the end of your ~/.zshenv file.
```export PATH=$HOME/development/flutter/bin:$PATH```

▼念のため、zshかbashか確認する
```%echo $SHELL```
※macOS Catalina以降は、デフォルトがzshになっている模様

▼やっぱりzshだったので、上記のコードはそのまま使えそう
```%zsh: command not found: flutter```
・・・と思いきや、うまく反応してくれない

▼そういえばFlutterのフォルダは```$HOME/dev/flutter/```に入れたことを思い出す。
必死に叩いてた公式のコードは```$HOME/development/flutter/```なので、ファイルのディレクトリが違いました！凡ミス！

▼改めて正しい場所を設定。念の為```% source ~/.zshrc```で反映させてから
```% flutter --version```

できた！
![スクリーンショット 2024-01-28 15.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1349871/16ead1c9-2791-cfe9-0841-b1c8f07f584d.png)

ちなみにFlutter公式は、インストール先のフォルダをdevelopmentにしてねと指示してくれた上でのコードなので、単純に私のミスです。

教訓：公式ドキュメント通りにやろう、アレンジしたらメモしておこう
実務未経験でLPIC-1に合格した秘訣

# 実務未経験でもLPIC-1に合格できる！

私は、情報系の短期大学校を卒業したものです！
この度、LPIC-1に合格したので、今回はLPIC-1とはなんなのか、どのような学習を通して合格したのか、そして学習を通して身についたことや自分の気づきを紹介していきたいと思います。

私の現在のレベルは、基本情報技術者に合格し、ruby on rails,Tailwind CSS,JavaScriptをつかって自作の予約システムを一つ作った経験がある程度です。
今回の学習期間は約2か月程度となっています。

## LPIC-1とは？
Linux技術者の認定試験です。
LinuxとはOSの一部です。身近な部分でいえばwindows OSやMac OSがあげられます。
Web開発ではLinuxを使うことが多いようです。
LPIC-1はLinux技術者認定試験の中でも初級者レベルにあたる資格でLinux経験年数の目安が半年～1年程度とされています。内容としては基本的なコマンド操作やネットワークの基礎、プロセスの管理といったことを問われます。

※LPIC-1の合格には、101と102の二つの試験に合格する必要があります！

## どのような学習をしたのか？
自分の場合は参考書と問題集をひたすら繰り返す方法で合格しました。

参考書(https://m.media-amazon.com/images/I/71tzepvdZdL._SY466_.jpg)
問題集(https://m.media-amazon.com/images/I/51mzBac6Q0L._SY445_SX342_.jpg)
サイト：今日の一題(http://www.lpi.jp/today/)
　　　：touch-q(https://touch-q.info/)

・まず最初に参考書を問題も含めてざっと一周します
・次に内容を理解することを意識して一周する
・問題集を解いて、現在の自分がわかっていない部分を知る
・わからなかった部分に重点をおいて参考書をもう一度読む
・同じ問題集の問題を解いてみる
・それでも解けなかった部分は実際にVMware(サーバーの仮想化)を利用して理解する
・7割以上の点数がとれるまで実際に問題集を解きまくる

実際の試験でも問題集に似たような問題がでているのでとにかく問題集は解ける状態にもっていけると安心できると思います。

## 学習を通して身についたこと、気づき
AWSやDockerをもちいた環境構築の場面や開発中のコンソールでのコマンド操作においてすごく役に立っていると実感しています。特にcdやls、mv、touch、cp、mkdir -pなどは重宝しています。また、開発中に開くことができないファイルなどはパーミッション(ファイルやディレクトリのアクセス権限の設定)を理解していないとどのようなコマンドを使用して、どのように変更すればいいのかなどがわからなかったりします。なので、コマンドの操作を苦手としている方や未経験からの学習でつまづかないようにするためにもとっておいて損はない資格だと思います。


これから、学んだことをアウトプットしていき自分の理解をより深められるように頑張って投稿していきたいと思います！よろしくお願いします！！！
Laravel10 Password再設定 現在のパスワードと再設定用のパスワードと確認用パスワードの3入力の効率よくバリデーションの記述方法

password再設定 現在のパスワードと再設定用のパスワードと確認用パスワードの3入力の効率よくバリデーションの記述方法

$request->validate([
    'old_password' => ['required', 'current_password'],
    'new_password' => ['required', 'confirmed', '...略...'],
]);

これで、old_passwordが現在認証済みユーザーのパスワードと等しいかどうかを検証できます。もし一致しなければ、エラーメッセージを表示できます。

passwordというフィールドと、password_confirmationというフィールドが同じ値である必要があります。password_confirmationというフィールドは、フォームに用意する必要があります。

現在のパスワードのnameにcurrent_password
新しいのパスワードのnameにpassword
確認用のパスワードのnameにpassword_confirmation
に設定し　上記の　validationを記述する
Windowsでdocker desktopが起動しないとき

docker desktopを起動すると立ち上がらない・・・

色々試しましたが下記の方法で無事起動することができました。

コントロールパネル内のプログラムからプログラム機能⇒
Windowsの機能を有効化または無効化をクリック

Linux用Windowsサブシステム、仮想マシンプラットフォーム
この2つの:white_check_mark:を外す
（仮想マシンプラットフォームは下にスクロールするとあります。）
![スクリーンショット 2024-01-28 152816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686008/331af542-0cac-1760-1e2e-567509e01ea8.png)

:ok:を押して再起動

再起動したあとはWSL（Windows Subsystem for Linux）を一度アンインストールして
再度インストールすると無事にdocker desktopを立ち上げることができました。


この方法が正しいかわかりませんが起動したのでよしとします。
パルワールド(Palworld)の専用サーバ運用Tips

色々横着したい。

## サーバスペック


メーカー|TRIGKEY
---|---
品番|‎TRIGKEY PC
CPU|Ryzen 5 5560U
メモリ|テクミヨ ノートPC用メモリ DDR4-3200(PC4-25600) 32GB
ストレージ|謎メーカーのNVME500GB
OS|WindowsServer2022 Standard

## やってみたかったこと

1. Windowsのメモリ使用率を監視
1. 80%を超えたらdiscord Webhook を使ってDiscordに通知
1. 90%を超えたら再度通知して、RCONを起動しPalServerをshutdown
1. PalServer-Win64-Test-Cmd.exeのプロセスが消えたらWindows再起動

## やること

1. Pythonをインストール
1. ARRCONをインストール https://github.com/radj307/ARRCON
1. Pythonコードを書く
1. バッチファイル用意する
1. Discordでウェブフックを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686412/9ae06778-a68c-55c7-961e-b223f1d43910.png)


## 動いたコード

ファイル名：MemoryOver_Discord_push_and_WindowsReboot.py
```python
import psutil
import requests
import subprocess
import time
import os

# Discord Webhook URL
DISCORD_WEBHOOK_URL = 'https://discord.com/api/webhooks/ほげほげ'

# メモリ使用率の閾値
MEMORY_NOTIFY_THRESHOLD_80 = 80
MEMORY_NOTIFY_THRESHOLD_90 = 90

# RCON.batのパス
RCON_BATCH_PATH = r'C:\Script\RCON.bat'

# Discordに通知したかどうかのフラグ
discord_notification_sent_80 = False
discord_notification_sent_90 = False

# RCON.batを実行したかどうかのフラグ
rcon_executed = False

# Discordに通知する関数
def send_discord_notification(content):
    payload = {'content': content}
    headers = {'Content-Type': 'application/json'}
    requests.post(DISCORD_WEBHOOK_URL, json=payload, headers=headers)

# RCON.batを実行する関数
def execute_rcon_batch():
    global rcon_executed
    if not rcon_executed:
        subprocess.run([RCON_BATCH_PATH], shell=True)
        rcon_executed = True

# Windowsを再起動する関数
def restart_windows():
    os.system('shutdown /r /t 0')

while True:
    # 現在のメモリ使用率を取得
    memory_usage = psutil.virtual_memory().percent

    # メモリ使用率が80%を超えた場合に通知
    if memory_usage >= MEMORY_NOTIFY_THRESHOLD_80 and not discord_notification_sent_80:
        notification_message = f'メモリ使用量が{MEMORY_NOTIFY_THRESHOLD_80}%を超えたよ。現在は{memory_usage}%です。'
        send_discord_notification(notification_message)
        discord_notification_sent_80 = True  # 通知済みフラグをセット

    # メモリ使用率が90%を超えた場合に通知とRCON.bat実行
    if memory_usage >= MEMORY_NOTIFY_THRESHOLD_90:
        if not discord_notification_sent_90:
            notification_message = f'メモリ使用量が{MEMORY_NOTIFY_THRESHOLD_90}%を超えたよ。5分以内にログアウトしてね。'
            send_discord_notification(notification_message)
            discord_notification_sent_90 = True  # 通知済みフラグをセット

        # RCON.batを実行
        execute_rcon_batch()

        # PalServer-Win64-Test-Cmd.exeのプロセスが終了するまで待機
        while 'PalServer-Win64-Test-Cmd.exe' in (p.name() for p in psutil.process_iter()):
            time.sleep(30)

        # PalServer-Win64-Test-Cmd.exeのプロセスが終了したらWindowsを再起動
        restart_windows()
        break  # プログラムを終了
```
## RCON.batの中身

```
@echo off
cd /d C:\app\ARRCON-3.3.7-Windows
echo Shutdown 300 | ARRCON -H xxx.xxx.xxx.xxx -P 25575 -p {AdminPassword}
```

## タスクスケジューラーに設定

### 全般タブ
+ ユーザーがログインしているかどうかにかかわらず実行する
+ 最上位の特権で実行する

### トリガータブ
+システム起動時

### 操作タブ

操作|プログラムの開始
---|---
プログラム/スクリプト|python.exeの絶対パス
---|---
引数の追加|MemoryOver_Discord_push_and_WindowsReboot.py
---|---
開始(オプション)|MemoryOver_Discord_push_and_WindowsReboot.pyのパス

以上
AWS IdCユーザーでSSOログイン時に請求情報が権限エラーになる

私はAWS Organizations周りのマルチアカウント系サービスに疎いため、個人のAWSアカウントでおひとりさまOrganizationを作成して検証しているのですが、初歩的なところでつまづいたので小ネタ共有です。


# 発生した問題

IAM Identity Center （旧AWS SSO）でユーザーを作成し、Organizations管理下のAWSアカウントにログインすると請求関連のサービスへのアクセス権限がない！

※当該SSOユーザーのIAMロールにはAdministratorAccess相当のフル権限を渡しているはずなのですが…

![スクリーン ショット 2024-01-28 に 15.12.02 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/728f530e-73f7-48f6-9c02-de34e6bc2a9f.png)

個人のAWSアカウントで一番大事なコストの確認ができないのは不便すぎる！ということで調べました。


# 原因

請求情報へのアクセスは、事前にルートユーザー（AWSアカウント作成時のメールアドレスに紐づく代表ユーザー）で「IAMによる請求情報へのアクセス」を有効にしておく必要がありました！

![スクリーン ショット 2024-01-28 に 15.17.42 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/98105101-9521-2256-fa99-0e9a943463e6.png)

※「アカウント」設定から飛べます。「請求とコスト管理」から飛べないので分かりづらいですね。


# 補足情報（1/29追記）

星野ぽぽぽさん、ありがとうございます！

https://x.com/hoshino_popopo_/status/1751601956962136208?s=20



# おわりに

AWS Organizatons利用時は、なるべく個々のアカウント内にIAMユーザーを個別作成せず、IAM IdC内でSSOユーザーを一括管理するのがベストプラクティスです。

各アカウントのルートユーザーにはMFAを設定したうえでアクセスキーの払い出し等は避け、なるべくIdCユーザーで普段の作業を実施するようにしましょう！

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/root-user-best-practices.html
【PHP】HPサーバーにあるCSVへ書き込む。

# 目的
あるデータをHPにて使用するため、CSVへ書き込む。今回の内容はURLを見られても問題ないデータ。
セキュリティ等はあまり得意ではないため、不備があればご教示頂ければ幸いです。
クライアントPC→HPサーバー→HPに表示

# 環境等
* クライアントPCでもサーバーPCでもPHPを使用
* サーバーの権限がある

# 方法
## クライアントPCの設定
変数$outoput.dataにサーバーへ送信したい情報が含まれている（一行の文字列）。

```php:get_data.php
//送信先の文字コードへ変換
$output_euc = mb_convert_encoding($output_data, "EUC-JP", "UTF-8");

//HPサーバーへデータ送信
$url = "https://www.test.com/get_data.php?data=" . "$output_euc";
$conn = curl_init(); // cURLセッションの初期化
curl_setopt($conn, CURLOPT_URL, $url); // 取得するURLを指定
curl_setopt($conn, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返す。
$res =  curl_exec($conn);
curl_close($conn); //セッションの終了
```

## サーバーの設定
- get_data.php・・・data.csv書き込むプログラム
- data.csv・・・データを保存するCSV

CSVへ書き込めない場合、サーバーで下記を実行することで権限をnobodyにする。

```
> su
> chown nobody data.csv
> chgrp nobody data.csv
```
権限がない場合はsuで実行する。

https://qiita.com/xishan/items/dd8336bae5c6ef955468

サーバーにてGETメソッドで送られてきたデータをCSVへ書き込む

```php:get_data.php

<?php

$data = trim($_GET["data"]);
file_put_contents("data.csv", "\n" . $data, FILE_APPEND);

```

# 参考

https://qiita.com/passol78/items/2ad123e39efeb1a5286b

https://qiita.com/wanwanland/items/a5f9574fadd214d7b5c8