OmniAICreator/Qiita-1.07M huggingface dataset:
M5NanoC6を1LEDスレーブI2Cして遊ぶ。




目的
I2Cのテスト


結果

![o_coq518.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/487cf216-ff6b-4da6-1405-c451a0f11e46.jpeg)


プログラム


受信 I2Cスレーブ M5NanoC6


```c++



//I2C_1GPIO_V1_M5NanoC6_1


//インクルド
#include <Arduino.h>
#include <Wire.h>
#include <M5NanoC6.h>


//初期化
void setup() {

  //i2cの初期化
  Wire.begin( (0x80)>>1 );      //I2Cスレーブアドレスの設定
  Wire.onReceive(receiveEvent); //データが来ると呼ばれる関数

  //GPIOの初期化
  pinMode(M5NANO_C6_BLUE_LED_PIN, OUTPUT);

} //setup


//メインループ
void loop() {
  delay(1); //ダミー
} //loop


//レシーブイベント
void receiveEvent(int howMany) {

  int x = Wire.read(); //I2C受信データの読み込み

  //LEDの点滅
  if( (x & 0x01) == 0 ) {

    digitalWrite(M5NANO_C6_BLUE_LED_PIN, LOW);//点灯
    
  } else {

    digitalWrite(M5NANO_C6_BLUE_LED_PIN, HIGH);//消灯

  } //endif

} //receiveEvent


```

送信 I2Cマスター M5Stamp S3



```c++


//I2C_PUT_0_1_M5S3_1


//インクルド
#include <Arduino.h>
#include <Wire.h>


//初期化
void setup() {

  Wire.begin();    //I2Cの初期化

} //setup


//メインループ
void loop() {

  //'0'転送
  Wire.beginTransmission( (0x80)>>1 );
  Wire.write('0');
  Wire.endTransmission();
  delay(1000); //1秒待つ

  //'1'転送
  Wire.beginTransmission( (0x80)>>1 );
  Wire.write('1');
  Wire.endTransmission();
  delay(1000); //1秒待つ

} //loop


```
GASエラーの対応方法（同時呼び出しが多すぎます: Too many simultaneous invocations）

# 背景
2024年10月10日頃から、Google Apps Scriptで「Exception: Too many simultaneous invocations: Spreadsheets」（同時呼び出しが多すぎます: スプレッドシート）のエラーの発生頻度が急に増えました。
スプレッドシートを扱うスクリプトをトリガーで実行しているユーザーの一部で起こっている現象のようです。
該当ユーザでも必ず起こるわけではなく、何度かに1回程度の頻度のようです。

エラー内容はスプレッドシートへの同時アクセスが多すぎる事ですが、実際は、同時アクセスが全くない場合にもエラーが発生しています。Google側に何らかの問題が発生していると考えています。しばらくすればGoogle側で解決すると思いますが、それまでの期間のエラー回避方法が必要です。


一時的な対処方法としてスプレッドシートを扱う際にロック（排他処理）を掛けることで、プログラム実行中は操作するスプレッドシートへのアクセスを制限してみました。この方法で私の環境ではエラーの発生がほぼなくなりましたので、その方法について簡単に記載しておきます。


# 排他処理の実行例
 SpreadSheetTask()が目的の処理で、それに対して排他処理を行っています。

```
function mainTask() {
  // スクリプトレベルのロックを取得
  const lock = LockService.getScriptLock();
  try {
    // 最大30秒間ロックを取得するまで待機
    lock.waitLock(30000);
    
    //目的の処理の実行
    SpreadSheetTask()
    
  } catch (e) {
    Logger.log('ロックの取得中にエラーが発生しました: ' + e);
  } finally {
    // ロックを必ず解放
    lock.releaseLock();
  }
}

```

## 現状(2024/10/17)
海外での掲示板などでも、Too many simultaneous invocations: Spreadsheetsのエラーが発生しているユーザを多数見つけました。
ただし、検索した時点では解決方法についてはどこにも書かれていなかったので今回記事を作成しました。

# 追記(2024/10/18)　
[A wave of "Too many simultaneous invocations: Spreadsheets" errors \[373461929\] \- Issue Tracker](https://issuetracker.google.com/issues/373461929#comment33)
単純に、GASのエラー発生したらエラーをキャッチしてリトライする対策を見かけました。途中までプログラムが実行されてエラー発生時点でリトライされますので、この方法を利用する前に任意のタイミングでプログラムが再実行されても大丈夫かの確認をしてから利用してください。
Laravel Inertia React をデプロイする時にいらないファイルを弾く(GitHubActions)


# はじめに

こんにちは、エンジニアのkeitaMaxです。

https://qiita.com/keitaMax/items/9761e955609a4f98f415

こちらの続きです。

デプロイをしたくないファイルを弾きたかったので、その方法を備忘録として残します。

# ymlの修正

前回さクセしたymlファイルに、exclude追加します。

```yml
name: deploy xserver

on: 
    push:
      tags:
        - 'prd.v.*'
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: dokcer-compose up
        run: |
          docker compose up -d
      - name: npm run install
        run: |
          docker compose exec app npm install
      - name: npm build
        run: |
          docker compose exec app npm run build
      - name: FTP-Deploy-Action
        uses: SamKirkland/FTP-Deploy-Action@v4.3.5
        with:
          server: ${{ secrets.PRD_FTP_SERVER }}
          username: ${{ secrets.PRD_FTP_USERNAME }}
          password: ${{ secrets.PRD_FTP_PASSWORD }}
          local-dir: ./src/
          server-dir: ./
          exclude: |
            **/node_modules/**
            **/resources/js/**
            **/vendor/**
            .env
            tests/**
            storage/**
```

node_modulesなどを上げたくなかったので、excludeに入れています。


# おわりに

`FTP-Deploy-Action`のバージョンによって`/**`を追加しないといけなかったところで少し時間を取られてしまいました。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://github.com/SamKirkland/FTP-Deploy-Action
【Github Copilot】Markdown編集中、アカウント認証は通っているのにCopilotの機能が有効にならないのを解消する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/3f6e23a2-d9fb-bfb0-6912-9ee62ac886d0.png)
Githubアカウントの認証が通っているのに機能が有効にならない場合、VSCodeの設定で編集中のファイルがCopilot無効化済になっていないか確認してみましょう。

TypeScriptでは使えるのにMarkdownでは使えない！といった状況であれば、大体これです。適宜、変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/ea49a014-00e9-083b-0775-fc3d0dea93a0.png)

ただし、Markdownを編集時に、拡張機能Markdown All in oneを有効にしていると、[Copilotの提案を受け入れるTabキーの挙動とAll in Oneが干渉する](https://github.com/orgs/community/discussions/7146)らしい、、？（手元で試した分には大丈夫でした）

問題が出たら、Copilot/All in Oneのいずれかを無効化する、もしくはキーボードショートカットを変更するなど、工夫しましょう。
【DBeaver】boolean値の結果表示をチェックボックスではなく`true`と`false`の文字列表現に変更する

## 概要
DBeaverでは、デフォルトでは結果セットのbooleanがチェックボックスで表現されます。これが見づらい場合、データ型はbooleanのまま、`true` or `false` の文字列表現に変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/a7b99078-46b1-8385-72fb-40f3b34be7dc.png)

## 設定箇所
画面上部 ウィンドウ > 設定 から以下の設定画面を開き、赤枠部分を変更します。適用して閉じたら、次回の結果取得から反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/e8f15af5-9924-96ff-d030-e12b151d0501.png)

## 動作確認用SQL
適当なDBに以下クエリを直接投げれば、booleanの表現を試せます。
```sql
-- PostgreSQLで動作確認済
select true as is_success_true, false as is_success_false;
```
ラズパイ(Linuxカーネル)備忘録#01

OS周りの知識を蓄えたくてラズパイにOSをインストールする所からLinuxについて学ぶところをいったんの目標に進めていく
※LinuxはOS名ではなくカーネル名、Linuxカーネルを基にして、さまざまな機能やソフトウェアを組み合わせたオペレーティングシステムを「ディストリビューション」といい、ubuntuやRaspberry Pi OSがそれにあたる。

〇始めるために準備したもの
・ラズパイスターターキット
    ・Raspberry Pi 4 Computer ModelB 2GB RAM
    ・microSDカード(ラズパイOSがインストール済み)
    ・ACアダプター
・別途microSDHCカード（自分でLinuxOSをインストールしたいと思って購入）
・USBマウス
・USBキーボード
・ディスプレイ
・HDMIケーブル
・LANケーブル


1. microSDHCカードのフォーマット
スタートメニュー＞ディスクの管理
microSDHCカードのディスク（画像のE:）を見つけ、すべてのパーティション（右クリックして「ボリュームの削除」）
未割り当ての領域が約32GBとして表示されるはず
この未割り当て領域を右クリックし、新しいシンプルボリュームを作成し、FAT32形式でフォーマットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912030/56e2a998-36c8-e1be-0dcc-5dc05dde5b52.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912030/16a7844b-9ea9-8532-03d0-1ff44807400b.png)


2. Linux OSのダウンロード
次に、ラズベリーパイ4にインストールするLinux OSのイメージファイル（.img）をダウンロード
Raspberry Pi OSもLinuxのディストリビューションであるが、もともとついてきたmicroSDHCに入っているので今回はubuntuを選択。またその中でもLinuxカーネルやシステム管理についての学習を主軸においてるためCLIであるubuntuServerを選択した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912030/22a354c6-5081-d212-b92a-9916eb2acff5.png)

書き込みが完了したら、作業用PCからmicroSDカードを取りだす

その後したこと
パッケージのアップデート
sudo apt update
sudo apt upgrade

 SSHサービスを無効化（当分はローカルで動かすため）
次に、SSHサービスを起動時に自動的に開始しないように設定
sudo systemctl stop ssh
sudo systemctl disable ssh
sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket
最後に、SSHサービスとソケットの状態を確認
sudo systemctl status ssh
sudo systemctl status ssh.socket

新しいユーザーを作成した
sudo adduser username

ファイアウォールを設定
sudo ufw enable
確認
sudo ufw status
DeepLocを用いた細胞内局在性の予測

# はじめに
## DTU health techとは
DTU Health Techは、デンマーク工科大学・健康技術学科のことで、医療技術の発展を目指す研究・教育機関である。
診断技術、バイオテクノロジー、デジタルヘルス、ロボティクス、バイオインフォマティクスなどの分野で革新的な技術を開発し、医療の質向上に貢献することを目指す。病院や産業界との連携を重視し、研究成果を実際の医療ソリューションとして展開している。

その中で、バイオインフォマティクス解析に活用できるWebインターフェースも開発しており、今回紹介するDeepLocもその1つ。

### DeepLocとは
DeepLocは、タンパク質の細胞内局在を予測するためのディープラーニングツール。
アミノ酸配列を入力すると、タンパク質が細胞内のどの部位（核、ミトコンドリア、細胞膜など）に存在するかを高精度で予測できる。
また、論文（Thumuluri *et al*., 2022）を読むと、Swissprotに登録された、真核生物の幅広い生物種の細胞内局在データを使って訓練されているので、真核生物であればどのタンパク質においても適用可能であると考えられる。

Thumuluri, V., Almagro Armenteros, J. J., Johansen, A. R., Nielsen, H., & Winther, O. (2022). DeepLoc 2.0: multi-label subcellular localization prediction using protein language models. Nucleic acids research, 50(W1), W228–W234.

[<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744572/e40887a6-8693-78fe-4525-d53830fc90be.jpeg">](https://doi.org/10.1093/nar/gkac278)

利用シーンとしては、生物学的研究で、特定のタンパク質がどこで機能しているかを知りたい場合がある。また、新規のタンパク質がどの細胞内コンパートメントで機能するか予測することで、実験デザインや解析のサポートになる。

加えて、Deeploc v2.1では、膜タンパク質のタイプを膜貫通型、細胞膜近傍型、脂質結合型、及び可溶性の4種類に分類する。詳しくは[こちらの論文](https://doi.org/10.1093/nar/gkae237)。

Ødum, M. T., Teufel, F., Thumuluri, V., Almagro Armenteros, J. J., Johansen, A. R., Winther, O., & Nielsen, H. (2024). DeepLoc 2.1: multi-label membrane protein type prediction using protein language models. Nucleic acids research, 52(W1), W215–W220. 

## DeepLocの使用方法
### ①DeepLoc(v2.1)にアクセス

https://services.healthtech.dtu.dk/services/DeepLoc-2.1/

![Deeploc_1枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744572/fc305691-e007-61e3-1e94-a8139e4b6f33.png)

### ②アミノ酸配列のアップロード
調べたいアミノ酸配列をコピー＆ペーストもしくはfastaとしてアップロードする。
今回は、コピー＆ペーストで進める。

![Deeploc_2枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744572/a4ce8d41-3ab8-7744-c8a0-63a57f83558a.png)

### ③モデル
早くしたい場合は、質は劣るが高速なHigh-throughput (Fast)
正確にしたい場合は、少し遅いが正確なHigh-quality (Slow)

### ④出力
基本的には**Long output**をクリックする
### ➄実行
すべて終わったら"Submit"をクリックし、解析を実行する

![Deeploc_3枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744572/fd52405a-adbe-6eb9-70da-e9f2f9fc6b70.png)

### ⑥解析中
次に出てくるページのメールアドレスの記入欄に自分のメールアドレスを入れると、プログラム終了後にメールが届く。少なくとも、gmailには届く。

![Deeploc_4枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744572/f830235f-2291-b872-5d5e-083463d8634d.png)

### ⑦終了後、届いたメールに添付してあるアドレスにアクセスすると、html形式で結果がみられる。
それを使い、細胞内のどこに局在し、タンパク質はどのパターンを示すのかを予測する。
この場合は、Endoplasmic riticulam（小胞体）に局在する可溶性タンパク質であることがわかる。

![Deeploc_5枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744572/7c065c46-e0d1-afe3-e2c4-e8c755f3e509.png)

# 今後について
DTU health techはDeeploc以外にも多くのバイオインフォマティクス解析ツールを公開しているので、それらの使い方を簡易的ですが、qiitaでまとめていこうと思います。
31歳のプログラマーがJISOUに参加した理由

# はじめに
はじめまして、りつと申します。

今日からJISOUというプログラミングスクールに参加させていただくことになりました。
その経緯や目標について、記事にまとめたいと思います！

# 私について
現在31歳で、都内のSES企業でお世話になっているプログラマーです。
都内の企業様にて半リモートで勤務中です（基本はリモートで、対面での会話が必要な場合などは出社しています）

2019年7月に事務職からSES企業へ転職したため、歴としてはかれこれ5年程になります。

# JISOUに参加した理由

## 1. 家族の支えになりたい

私事で恐縮ですが、今年5月に入籍しました。

今までは自分一人だけでなんとかやっていければよかったのですが、家族が増えたことで自分の収入面に不安を感じることが多くなりました。

夫は全くの異業種で勤務形態が特殊なのですが、ここ1年程は睡眠も十分に取れないほど仕事が多忙です。

自分の経験上、睡眠の質が健康に大きく影響することがわかっていたので、このままの状態が続けばいつか夫が倒れるのではないかという不安がありました。

- 仮に夫が倒れてしまったり、病気になってしまった場合、今の自分の収入で二人の生活を支えていけるのか？
- 老後の生活費まで用意することができるのか...？

お恥ずかしながら貯金もほとんどしてこなかったため、金銭面に対する不安が日に日に大きくなっていきました。

夫が仕事で苦しいとき、
「私が家族を養うから任せておくれ！」
と言えるくらい、収入を増やしたいと感じていました。

## 2. リモート勤務を続けたい

私は子供のころからアトピー性皮膚炎で、一時期落ち着いた後、成人後に再発してからはずっと皮膚科に通い続けています。

春（花粉で悪化）、夏（汗で悪化）、季節の変わり目などに悪化してしまうことが多いのですが、その際は人と会うこと（見られること）が少しつらく感じることもあります。

現状は基本リモートでお仕事させていただいており、精神衛生的にもとてもありがたいと感じているのですが、今後もリモートで働き続けるためにはスキルを上げることが大切だと感じています。

リモートを辞める企業さんも増えていると聞きますが、技術力が高ければ選択肢が増え、それだけ柔軟な働き方を実現できる可能性が高まると思うからです。

ただ、技術力を上げたいと思いつつ、あまり自己学習をしてこなかったこともあり、何から手を付ければいいのかわかっていない状態でした。

## 3. JISOUの記事に出会った

そんな、金銭的・技術的に悩みを抱えていた状況の中で、QiitaでJISOUの記事を見つけました。

アウトプットメインの学習という言葉に『自分にできるかな？』という不安もありつつ、勇気を出して飛び込んでみました。

# 現状のスキルセット
- Laravel
    - Webシステム、Web APIの開発
    - 詳細設計や画面設計も少し経験
- MySQL
    - 基本的なSQLは実行可能
    - 直近では、データ作成用およびデータ移行用のプロシージャの作成を経験
- Git
    - 基本的なコマンドは使用可能
- Docker
    - 環境構築用に用意されているコンテナの利用

ぱっと思いつく限りですが、上記の通りです。
最初の案件がJavaだったのですが、その後はPHPかLaravelの案件がほとんどです。

# 目標
- 短期
    - プログラミングを楽しみたい
- 中期
    - 自分の実装・技術力に自信を持ちたい
- 長期
    - 収入の柱を複数持ちたい（リスクヘッジ）
    - 収入を上げたい

# 終わりに
今までの自分の性格上、自力でやっても3日坊主で終わってしまう可能性が高いため、アウトプットという目に見える形で作業を実践するJISOUの環境を通じて、自分の技術力を高めていきたいと思います。

拙い文章で申し訳ありません。
ここまで読んでいただきありがとうございました。
linuxのショートカットキーを覚えるためにまとめてみた

# はじめに

Linux操作で下記操作だけしか知らない自分向けに、「これは覚えなきゃ」と思ったものをまとめました

| キー | 処理内容 |
|:-:|:-:|
|Tabキー|予測変換   |
|上下矢印キー |入力履歴のあるコマンドの呼び出し |
|ctrl + C |入力しているコマンドの取り消し |
|ALT + C |コピー|
|ALT + V |貼り付け|
|ALT + N |新しいセッションの開始|

______
## Ctrl+R：コマンド履歴の検索
ctrl + Rを押下後、下記表記がでてくる。
```
(reverse-i-search)`':
```
そのまま検索をかけたいワードをそのまま入力し、Enterで実行。
# カーソルの移動
#### Ctrl+A：行の先頭に移動
左矢印を長押しするのではなく **ctrl + A** ！
#### Ctrl+E：行の最後にカーソルを移動
覚え方：AとEのキーボード配置で、左にあるAが左端行頭に移動。Eが右端行末に移動。
#### Ctrl+U：カーソルの位置から行頭まで削除
例：フルパスで入力したときに、ファイル名だけ残しておきたいときに便利。
#### Ctrl+K：カーソルの位置から行末まで削除
例：フルパスで入力したときに、ディレクトリだけ残しておきたいときに便利。
#### Ctrl+W：カーソル位置の単語を削除（カーソルの前部分）
テキストメモのような他ツールでのctrl + shift ような操作が可能になる

# vi の基本的なコマンド
#### ワード単位の移動
ワード単位でカーソルを移動する場合、
右→ **w** (**w**ord)
左→ **b** (**b**ack)
#### 先頭行への移動
画面の先頭行にカーソルを移動する場合、
**H** (**h**igh) 
#### 中央行への移動
画面の中央行にカーソルを移動する場合、
**M** (**m**iddle)
#### 最終行への移動
画面の先頭行にカーソルを移動する場合、
**L** (**l**ow)
#### 置換
置換対象にカーソルを当てて、Sを押下後、置換する新しいテキストを入力する。
#### 変更の取り消し
vi操作後、誤った入力を取り消したい場合に活用できる。
vi で **u** (**u**ndo)
※もう一度 u を押すと、u コマンド自身が取り消されます。
#### 行番号を表示する 
**:set nu enter**
#### 検索
下記コマンドを入力後、検索したい文字を入力してenter
/string
検索方向の前方にある文字列を検索
**n**
検索方向の後方にある文字列を検索 
**N**

# 参考
https://eng-entrance.com/linux_shortcut

https://docs.oracle.com/cd/E19253-01/816-3946/editorvi-tbl-83/index.html

https://docs.oracle.com/cd/E19253-01/816-3946/6ma6m5bnn/index.html
Teamsのチャネル例

teamsのチャネルの例をいくつか記載してみます。

---
◆情報システム部XX課
>　一般
　01.連絡事項
 　02.勤怠連絡
 　03.教育
 　04.雑談

---
◆XX案件
>　一般
 　00.全体連絡・確認事項
　01.会議・打ち合わせ
 　10.サーバ
 　20.NW
 　30.セキュリティ
 　40.アプリケーション
 　50.データベース

---

◆YY案件
>　一般
 　00.連絡
 　01.会議
 　10.AA社
 　11.BB社
 　12.CC社

---

 ◆ZZ案件
> 　一般
 　01.連絡事項
 　02.勤怠
 　10.要件定義
 　20.基本設計
 　30.詳細設計
 　40.構築
 　50.試験
 　60.運用
 　70.日次報告

---

 その他チャネル候補
　・承認
　・発注管理
　・技術情報　（技術的なニュース等を投稿し情報共有する）
　・物流
　・貸出

---
ローレンツ曲線とジニ係数

# ローレンツ曲線

* 経済的な量の集中度・格差を表現するためのグラフ
* アメリカの官庁統計家 M.O.ローレンツが考案
* ローレンツ曲線は分配の不平等さを表す
* たとえば、横軸に人口の累積相対度数、縦軸に給与の累積相対度数を表してグラフ化する

# ジニ係数

* ローレンツ曲線が不平等さを表すグラフに対し、ジニ係数は不平等さを数値で表すもの
* ジニ係数が大きいほど、不平等である
* ジニ係数は、完全平等線と、ローレンツ曲線の間の面積を2倍にしたもの
    * 完全平等線は、ローレンツ曲線を描くグラフ上、原点(0,0)と(1,1)を直線で結んだ線


# 例 ある3つの会社、A,B,Cの従業員の給与の不平等さをローレンツ曲線で表す

* 3つの会社に所属する5人の社員の給与を以下とする
  * 給与の低い順に並べている
  * ローレンツ曲線では、会社1と会社3との合計給与差は関係ない

| 会社 | | 社員 A | 社員 B | 社員 C | 社員 D | 社員 E | 計 |
|:-:|:-|:-:|:-:|:-:|:-:|:-:|:-:|
| 会社 1 | 給与金額(万円) | 200 | 200 | 200 | 200 | 200 | 1000 |
| 会社 2 | 給与金額(万円) | 100 | 100 | 200 | 300 | 300 | 1000 |
| 会社 3 | 給与金額(万円) |   0 |   0 | 100 | 100 | 300 |  500 |

* 上の表に給与の相対度数・相対累積度数を加える

| 会社 | | 社員 A | 社員 B | 社員 C | 社員 D | 社員 E | 計 |
|:-:|:-|:-:|:-:|:-:|:-:|:-:|:-:|
| 会社 1 | 給与金額(万円) | 200 | 200 | 200 | 200 | 200 | 1000 |
|   |          相対度数  | 0.2  | 0.2  | 0.2  | 0.2  | 0.2  | 1.0  |
|   |      累積相対度数   | 0.2  | 0.4  | 0.6  | 0.8  | 1.0  |   |
| 会社 2 | 給与金額(万円) | 100 | 100 | 200 | 300 | 300 | 1000 |
|   |          相対度数  | 0.1  | 0.1  | 0.2  | 0.3  | 0.3  | 1.0  |
|   |       累積相対度数  | 0.1  | 0.2  | 0.4  | 0.7  | 1.0 |   |
| 会社 3 | 給与金額(万円) |   0 |   0 | 100 | 100 | 300 |  500 |
|   |          相対度数  |  0.0 | 0.0  | 0.2  | 0.2  | 0.6  | 1.0  |
|   |       累積相対度数  | 0.0  | 0.0  | 0.2  | 0.4  | 1.0  |   |


* 相対度数の表をもとにグラフを書こうと思ったけど、面倒なので最初の表から、chatgptに書いてもらう。
    * markdownの表も正しく理解してくれるので、簡単に以下のグラフを出力してくれた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35185/4b8a8a8a-d7c3-8d4a-2486-ea2eeb662c09.png)

* ジニ係数も出してもらう

| 会社   | ジニ係数 |
|:-----:|:-------:|
| 会社1 |   0.00  |
| 会社2 |   0.24  |
| 会社3 |   0.56  |

したがって、ジニ係数が一番大きい会社３が一番不平等。ジニ係数が0の会社1は完全平等ということになる
コミット、プル、プッシュって何？

# はじめに
GitやSVNを使っていて、コミット時に何処が更新されるのか挙動が違うので図にしてみました。
マージなどの挙動は追々更新する予定です。

## Git
プッシュしないとサーバーに反映されない。
コミットしてもブランチを作ってもローカルリポジトリ内の話なので、サーバーに反映させるにはプッシュする必要がある。

```mermaid
sequenceDiagram
  box rgb(255, 255, 239) ローカル
    participant 一時退避
    participant ワークツリー
    participant ローカルリポジトリ
  end
  box rgb(239, 255, 239) サーバー
    participant リモートリポジトリ
  end
  リモートリポジトリ ->> ワークツリー: プル
  リモートリポジトリ ->> ローカルリポジトリ: フェッチ
  ローカルリポジトリ ->> ワークツリー: マージ
  ワークツリー ->> ローカルリポジトリ: コミット
  ローカルリポジトリ ->> リモートリポジトリ: プッシュ
  ワークツリー ->> 一時退避: スタッシュ
  一時退避 ->> ワークツリー: 
```

## SVN
コミットするとサーバーに反映される。
```mermaid
sequenceDiagram
  box rgb(255, 255, 239) ローカル
    participant ワークツリー
  end
  box rgb(239, 255, 239) サーバー
    participant リモートリポジトリ
  end
  リモートリポジトリ ->> ワークツリー: アップデート
  ワークツリー ->> リモートリポジトリ: コミット
```
WSL(Powershell)プロンプトにGit情報を常に表示させる方法

こんにちは、プログラミング初心者のマドレーヌです。
かめ@米国データサイエンティストさんのGIT講座をWINDOWSで受講しています。

上記講座はMAC向けの講座であり、WINDOWSで進める場合躓く箇所が多々あります。
自分の解決方法を備忘録的に書き連ね共有していこうと思います。

今回は「ターミナルのプロンプトにGit情報を常に表示させる【超便利】」
https://datawokagaku.com/terminal_prompt_git/
をWSLに適用させる方法を説明します。

ステップ１：シェルファイルを配置
シェルファイル(https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh) をダウンロードします。
シェルファイルの配置位置ですがWSLの場合、ホームディレクトリに置く必要があります。
以下のコマンドをWSLに入力します。


 `cp /mnt/c/Users/ユーザー名/Downloads/git-prompt.sh ~/.git-prompt.sh`


ステップ２，３は必要ないので飛ばします。


ステップ３．５：Git補完機能用ファイルのダウンロード
次に進む前にGit補完機能用ファイルのダウンロードをします。
Git補完機能とはGitコマンドやオプションを入力するときに、タブキーを押すことで自動的に補完（予測入力）してくれる機能です。
例）git sta<TAB> -> git status

以下コマンドでファイルをダウンロードしましょう。
`curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash`


ステップ４：いよいよ~/.bash_profileを変更する。
さてWSLの場合は~/.bash_profileではなく~/.bashrcを変更します。

`code ~/.bashrc`

VSCodeの人は「code」その他の人は自分のエディタにしてください。
続いて.bashrcの最後尾に以下のコードを入力します。

# Gitユーザー名を表示するための関数
```
function join_by { local IFS="$1"; shift; echo "$*"; }
function _ps1_git_username {
    local git_users_array=$(git config --global --get-all user.name)
    git_users=$(join_by , $git_users_array)
    test "$git_users" == 'GITのユーザー名' && echo "絵文字" && return
    test "$git_users" && echo "$git_users" && return
    echo "No Git User"
}

# Gitプロンプトスクリプトのパス
git_prompt_script=~/.git-prompt.sh
if [ -f $git_prompt_script ]; then
    # git-promptスクリプトを読み込む
    source $git_prompt_script
    export GIT_PS1_SHOWDIRTYSTATE=1
    export GIT_PS1_SHOWSTASHSTATE=1
    export GIT_PS1_SHOWUNTRACKEDFILES=1
    export GIT_PS1_SHOWUPSTREAM="auto"
    
    # プロンプト設定
    export PS1='\[\e[0;32m\]\u@\h\[\e[m\]:\[\e[0;34m\]\w$(_ps1_git_username)$(__git_ps1 " (%s)")\[\e[m\] \$ '
else
    # Gitプロンプトがない場合のプロンプト設定
    export PS1="\[\e[0;31m\]\W\[\e[m\] :$ "
fi

# カラースキームの設定（lsコマンドの表示など）
export LSCOLORS=ExGxFxdxCxDxDxaccxaeex

# Git補完スクリプトのパス
git_completion_script=~/.git-completion.bash
if [ -f $git_completion_script ]; then
    source $git_completion_script
fi
```

５：使い方
名前を反映させるため以下のコマンドを入力します。

`$ git config --global user.name {USERNAME}`
`$ git config --global user.email {EMAIL}`

{USERNAME}と{EMAIL}の部分はGithubのアカウントのusernameとemailを入れます．


WSLでの対応は以上になります。
少しでも参考になれば幸いです。
Excelで数値のはずのセルに文字列が含まれてないかをチェックする

このニュースを見たことがありますか？
[朝日新聞デジタル：「エクセル任せで点検不十分」　マイナス収支で「△三角」と誤入力](https://www.asahi.com/articles/ASQBN7L3ZQBMOBJB00G.html?msockid=1d2ae41e9a6d69971ba8f0d79b876836L)

つまりは、マイナス金額の部分を表示形式で△で表記（#,##0;"△ "#,##0）していたのではなく、文字列として△と数値を入力していたので、SUM関数等の合計から漏れてしまったいた、ということです。

どうしても単位や負の記号をつけたいときは、Excelでは表示形式で表示上のみで単位や記号をつけないと、合計等の関数で集計をすることができません。

![スクリーンショット 2024-10-17 001656.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479442/3765d71a-46ac-3b1c-fb96-7b0535428eaf.png)

私も他の人が入力したExcelで、この単位直接打たれる罠に引っかかったことがあります。
何度かそういった経験があるので、基本的には他人を信じず、単位（千円、百万円）等もセットで表示されているセルは、マクロで文字列になっていないかチェックします。

<details open><summary>コード</summary>

```vb:ExcelVBA
Sub sb選択範囲中の文字列を蛍光緑色に色付け()
'用途：数式や数値が入っていると思われる範囲を選択し、文字列部分になっている箇所を探す。
'※表示形式で単位（例：千万円）をつけているのに、手入力で単位を入力してしまい文字列となり合計欄の集計から漏れる、
'といった事象が発生した際に効率よく文字列セルを発見するためで利用する。
    Dim myCell As Range
    Dim selectedRange As Range
 
    ' 選択範囲を Set する
    Set selectedRange = Selection
 
    ' 選択された各セルを確認する
    For Each myCell In selectedRange
        ' セル内容が文字列の場合
        If Application.WorksheetFunction.IsText(myCell.Value) Then
            ' セルの背景色を蛍光緑色に設定
            myCell.Interior.Color = RGB(0, 255, 0)
        End If
    Next myCell
 
End Sub
```

</details>

使い方は、単位等が入力されている複数のセルを範囲選択して、マクロを実行します。
文字列となっているセルは、セルの色を蛍光緑色にします。

単位等を表示形式で表示するようにしている場合で、複数人で入力するExcelは、入力者が表示形式の設定に気づかず、単位も含めて手入力されてしまうことがあります。

そのため、自分がそのExcelの作成者であるなら、単位は表示形式で各セルに表記するのではなく、シートの右上等に『（単位：千円）』等と表記し、表示形式では単位表示をしない方がベターでしょう。

この記事も根本的には、同じ思想（人間を信じていない）でコードを作成しました。
[【Qiita】Excelで小数点を含むセルをチェックするマクロ](https://qiita.com/nanaco0424/items/fa50b99b915ace364023)
Flask + SQLAlchemyで音楽共有SNSを作る - 基本的なルーティング編

## はじめに

前回の記事では、ユーティリティ機能について解説しました。今回は、アプリケーションの基本的なルーティング、具体的にはトップページ、ログインページ、新規登録ページの実装について詳しく説明します。

## トップページのルート

まず、アプリケーションのトップページを表示するルートを定義します：

```python
@app.route('/')
def index():
    return render_template('index.html')
```

### 解説
- `@app.route('/')`: このデコレータは、ルートURL（'/'）へのアクセスをこの関数にルーティングします。
- `render_template('index.html')`: `index.html`テンプレートをレンダリングして返します。

## ログインページのルート

次に、ログイン機能を実装します：

```python
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        user = User.query.filter_by(username=username).first()
        if user and check_password_hash(user.password, password):
            login_user(user)
            return redirect(url_for('mypage'))
        flash('Invalid username or password')
    return render_template('login.html')
```

### 解説
- `methods=['GET', 'POST']`: このルートがGETとPOSTリクエストの両方を処理することを指定します。
- `request.method == 'POST'`: POSTリクエスト（フォーム送信）の場合の処理を定義します。
- `User.query.filter_by(username=username).first()`: 入力されたユーザー名でデータベースを検索します。
- `check_password_hash(user.password, password)`: 入力されたパスワードとハッシュ化されたパスワードを比較します。
- `login_user(user)`: ユーザーをログイン状態にします。
- `flash('Invalid username or password')`: エラーメッセージを設定します。

## 新規登録ページのルート

最後に、新規ユーザー登録機能を実装します：

```python
@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        if User.query.filter_by(username=username).first():
            flash('Username already exists')
        else:
            new_user = User(username=username,
                            password=generate_password_hash(password))
            db.session.add(new_user)
            db.session.commit()
            flash('Registration successful')
            return redirect(url_for('login'))
    return render_template('register.html')
```

### 解説
- `User.query.filter_by(username=username).first()`: ユーザー名の重複をチェックします。
- `generate_password_hash(password)`: パスワードをハッシュ化します。
- `db.session.add(new_user)`: 新しいユーザーをデータベースセッションに追加します。
- `db.session.commit()`: データベースの変更を確定します。

## セキュリティに関する注意点

1. パスワードのハッシュ化: `generate_password_hash()` と `check_password_hash()` を使用して、平文のパスワードを保存しないようにしています。

2. CSRF対策: Flask-WTFを使用している場合、フォームにCSRFトークンを含めることを忘れないでください。

3. 入力のバリデーション: 実際のアプリケーションでは、ユーザー入力のバリデーションをより厳密に行う必要があります。

4. セッション管理: `login_user()` を使用してセッションを管理していますが、セッションの設定（例：有効期限）を適切に行うことが重要です。

## まとめ

この記事では、以下の3つの基本的なルートについて解説しました：

1. トップページ: シンプルなテンプレートレンダリング
2. ログインページ: ユーザー認証とログイン処理
3. 新規登録ページ: 新規ユーザーの作成とデータベースへの保存

これらの機能は、ほとんどのウェブアプリケーションの基本となる部分です。適切にセキュリティ対策を施すことで、安全で使いやすいアプリケーションの基盤を作ることができます。

## 参考リンク
- [Flask ルーティング](https://flask.palletsprojects.com/en/2.0.x/quickstart/#routing)
- [Flask-Login ドキュメント](https://flask-login.readthedocs.io/en/latest/)
- [Werkzeug セキュリティヘルパー](https://werkzeug.palletsprojects.com/en/2.0.x/utils/#module-werkzeug.security)
Flask + SQLAlchemyで音楽共有SNSを作る - 日々の楽曲投稿モデル編

## はじめに

前回の記事では、ユーザーモデルの定義について解説しました。今回は、アプリケーションのもう一つの中心となる、日々の楽曲投稿を表すDailySongモデルの定義について詳しく説明します。

## DailySongモデルの定義

DailySongモデルは、ユーザーが毎日投稿する楽曲の情報を表現し、データベースに保存するための設計図です。以下にDailySongモデルの完全な定義を示します：

```python
class DailySong(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    title = db.Column(db.String(100), nullable=False)
    artist = db.Column(db.String(100), nullable=False)
    genre = db.Column(db.String(50), nullable=False)
    music_url = db.Column(db.String(500), nullable=False)
    date_posted = db.Column(db.Date, nullable=False, default=date.today)
    is_current = db.Column(db.Boolean, default=True)

    user = db.relationship('User', backref=db.backref('daily_songs', lazy=True))
```

## DailySongモデルの詳細解説

### 基本属性

1. **id**: 投稿の一意の識別子。主キーとして使用されます。
   ```python
   id = db.Column(db.Integer, primary_key=True)
   ```

2. **user_id**: 投稿したユーザーのID。外部キーとしてUserモデルのidを参照します。
   ```python
   user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
   ```

3. **title**: 楽曲のタイトル。必須項目です。
   ```python
   title = db.Column(db.String(100), nullable=False)
   ```

4. **artist**: アーティスト名。必須項目です。
   ```python
   artist = db.Column(db.String(100), nullable=False)
   ```

5. **genre**: 音楽のジャンル。必須項目です。
   ```python
   genre = db.Column(db.String(50), nullable=False)
   ```

6. **music_url**: 音楽の共有URL。必須項目です。
   ```python
   music_url = db.Column(db.String(500), nullable=False)
   ```

7. **date_posted**: 投稿日。デフォルトで現在の日付が設定されます。
   ```python
   date_posted = db.Column(db.Date, nullable=False, default=date.today)
   ```

8. **is_current**: 現在の投稿かどうかを示すフラグ。デフォルトはTrueです。
   ```python
   is_current = db.Column(db.Boolean, default=True)
   ```

### リレーションシップの定義

```python
user = db.relationship('User', backref=db.backref('daily_songs', lazy=True))
```

- この関係定義により、DailySongモデルとUserモデルが関連付けられます。
- `backref='daily_songs'`: Userモデルから逆引きできるように、`daily_songs`という属性を追加します。
- `lazy=True`: デフォルトの遅延ロードを使用します。必要なときにクエリが実行されます。

## DailySongモデルの特徴と利点

1. **ユーザーとの関連付け**: `user_id`と`user`リレーションシップにより、各投稿を特定のユーザーと簡単に関連付けることができます。

2. **日付管理**: `date_posted`属性により、投稿の日付を自動的に記録し、後で日付ベースの検索や並び替えが容易になります。

3. **現在の投稿フラグ**: `is_current`フラグにより、最新の投稿を簡単に識別できます。これは、ユーザーの現在の「今日の1曲」を表示する際に便利です。

4. **柔軟な楽曲情報**: タイトル、アーティスト、ジャンルなどの基本的な楽曲情報を保存でき、多様な音楽の共有に対応できます。

5. **外部リンク対応**: `music_url`属性により、Spotify、YouTube、SoundCloudなどの外部音楽サービスへのリンクを保存できます。

## まとめ

このDailySongモデルの定義により、以下のことが可能になります：

1. ユーザーの日々の楽曲投稿の保存と取得
2. 投稿とユーザーの関連付け
3. 日付ベースの投稿管理
4. 多様な音楽情報の保存と共有

## 参考リンク
- [SQLAlchemy ORM](https://docs.sqlalchemy.org/en/14/orm/)
- [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/)
- [Working with Related Objects - Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/#querying-with-joins)
Node-RED UDP 2

昨日の続き
UDP送信だけやったので受信もやった。

https://qiita.com/1994koki/items/3c91cf1add504165dc31

# 環境
Node-RED v4.0.3
Node.js v20.17.0
Linux 6.6.31+rpt-rpi-v8 arm LE（ラズパイ）
Windows_NT 10.0.22631 x64 LE（Windows）

# 送信側用データ
受信したデータを利用して
10000-受信データを送信する
固定値作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/39ac5d6e-85c8-3489-1c4e-57918706df2d.png)

受信したデータと結合する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/b49d0806-2e40-9375-3c0a-2578cdb71e9f.png)

node-red-contrib-calcというのを使用すると計算できるらしいので
パレット追加して減算を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/9926e58b-333b-893d-434a-c22a1c60e57d.png)

# 送信側 UDP OUT追加
計算結果をゲージに表示とUDP OUTするようにした
今回はPC側が送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/f8147c8a-30c5-f291-93de-8fdc6953f0a5.png)

# 受信側 UDP IN追加
UDPメッセージを選んでポートを設定すると完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/f48e69c9-a648-8578-ceef-e7cb6b4a3d2b.png)



# 完成
PC側はポート9898が受信で9897は送信している。
どちらのゲージも同じくらいの値になった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/05e39b8c-f122-e965-95c3-48618632235f.png)



# 参考URL
https://blog.enebular.com/node-red/node-red-contrib-calc/
Flask + SQLAlchemyで音楽共有SNSを作る - データベース初期化とモデル定義編

## はじめに

前回の記事では、Flaskアプリケーションの初期化と基本的な設定について解説しました。今回は、データベースの初期化、マイグレーションの設定、ログイン管理の初期化、そしてフォロワーの関連テーブルの定義について説明します。

## データベースの初期化とマイグレーションの設定

まず、SQLAlchemyを使用してデータベースを初期化し、Flask-Migrateを使ってマイグレーションを設定します。

```python
db = SQLAlchemy(app)
migrate = Migrate(app, db)
```

### 解説

- `db = SQLAlchemy(app)`: SQLAlchemyのインスタンスを作成し、Flaskアプリケーションと連携させます。これにより、ORMを使用してデータベース操作が可能になります。

- `migrate = Migrate(app, db)`: Flask-Migrateを初期化します。これにより、データベースのスキーマ変更を管理できるようになります。

## ログイン管理の初期化

次に、Flask-Loginを使用してログイン管理を初期化します。

```python
login_manager = LoginManager(app)
login_manager.login_view = 'login'
```

### 解説

- `login_manager = LoginManager(app)`: LoginManagerのインスタンスを作成し、Flaskアプリケーションと連携させます。

- `login_manager.login_view = 'login'`: ログインが必要なページにアクセスした際に、リダイレクトするビュー関数の名前を指定します。この場合、`login`という名前のビュー関数にリダイレクトされます。

## フォロワーの関連テーブルの定義

最後に、ユーザー間のフォロー関係を表す中間テーブルを定義します。

```python
followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)
```

### 解説

- `followers`: フォロー関係を表す中間テーブルの名前です。

- `follower_id`: フォローしているユーザーのIDを保存するカラムです。`user`テーブルの`id`を参照します。

- `followed_id`: フォローされているユーザーのIDを保存するカラムです。同じく`user`テーブルの`id`を参照します。

この中間テーブルにより、多対多の関係（ユーザーは複数のユーザーをフォローでき、同時に複数のユーザーにフォローされることができる）を実現しています。

## まとめ

これらの設定により、以下のことが可能になります：

1. SQLAlchemyを使用したデータベース操作
2. Flask-Migrateを使用したデータベーススキーマの管理
3. Flask-Loginを使用したユーザー認証の管理
4. ユーザー間のフォロー関係の管理

## 参考リンク
- [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/)
- [Flask-Migrate](https://flask-migrate.readthedocs.io/)
- [Flask-Login](https://flask-login.readthedocs.io/)
- [SQLAlchemy - Relationship Configuration](https://docs.sqlalchemy.org/en/14/orm/relationships.html)
初心者LLMコーダーはslackのログを保存したい

## slackは無料だとログが３ヶ月で消えてしまう
通常業務でslackを使っているが、プロジェクトベースで使っている無料版slackのあのログもあのデータも３ヶ月で消えてしまう。
どうにかならないか？というのが出発点。

### プログラム経験はほぼ０
はるか昔大学時代にJAVAでHelloworldした後は、特にプログラムに触れることなく生きてきた（興味はあったが手を出せなかった）。最近周りにプログラマーが増えて、憧れが高まっているけど、勉強方法がいまいちわからない。

### きっかけ
女性プログラマーを増やす活動をしている方に、slackAPIとGASを連携してプログラミングする方法をインプットいただく！わからない時はchatGPTに聞くといいというアドバイスも。

### chatGPTに聞いてみたらいいんじゃない？
素人でもLLMでコード生成ができると聞いて、チャレンジしたのが以下の内容。
それぞれの出力結果に対して質問を繰り返していった。日本語で普通に会話してる・・・

```
・あなたはslackの無料会員です。slackの鍵付きチャンネルのチャット履歴を履歴として保存する方法を教えてください
・具体的にAPIを使った方法を教えてください。
・定期的にslackの履歴をスプレッドシートに記録する方法を教えてください
・複数の鍵付きチャンネルを記録するようにするにはどうしたらいいでしょうか？
・スプレッドシートのタブごとに違うチャンネルの履歴を記録したいです
・チャンネルIDも自動取得するように修正してください
```
そして結果としてできたのが、以下の流れ

### 出力結果
コード↓
https://gist.github.com/shiina7/a1f7b2cb7e1efae1659e5507b567d519

設定手順
＊複数の出力結果をまとめたものを以下に記す

1　SlackのAPIを使用する
必要な権限がある場合、SlackのAPIを使用してメッセージをプログラムで取得することができます。これには、APIトークンが必要です。
以下は簡単な手順です：
Slack APIのウェブサイトにアクセスし、アプリを作成します。
https://api.slack.com/apps
![スクリーンショット 2024-10-16 23.28.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911990/9cb4d7ee-b31f-38cb-8f1e-8aca967aa0f9.png)

Creat New Appsから、From scrachを選択
![スクリーンショット 2024-10-16 23.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911990/bd07325f-6496-70fa-2066-653c0a6d5434.png)

必要なスコープ（User Token Scopes）を設定します。

groups:history（プライベートチャンネルのメッセージ履歴を取得）
channels:history（パブリックチャンネルのメッセージ履歴を取得）
channels:read（パブリックチャンネルの情報を取得）
groups:read（プライベートチャンネルの情報を取得）
files:read（Slack内のファイルの情報を取得し、ダウンロードする）
users:read（ユーザーの情報を取得）

![スクリーンショット 2024-10-16 23.34.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911990/276c0aa7-9a8e-6e6c-ba4a-b837fe4fc5f1.png)
![スクリーンショット 2024-10-16 23.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911990/f73ff8d4-f99f-9a2f-50bc-bae448701ce4.png)

APIトークンを取得します。（インストール後に出てくる　xoxo- の文字列）

2　slackに投稿されたファイル保存用のフォルダをGoogledrive内に作成
作成したフォルダのフォルダID /folders/の後　を控える

3　Google Apps Scriptにアクセス:
-Google ドライブで新しいスプレッドシートを作成し、メニューから 拡張機能 > Apps Script を選択します。

-　https://gist.github.com/shiina7/a1f7b2cb7e1efae1659e5507b567d519
　のコードをエディタにコピー＆ペーストします。
-Slack APIトークンとGoogle DriveフォルダIDを設定:
YOUR_OAUTH_ACCESS_TOKEN と YOUR_GOOGLE_DRIVE_FOLDER_ID を上記で取得した適切な値に置き換えます。
-スクリプトを保存:
-ファイルを保存します。
-権限を設定:
スクリプトを実行する際に必要な権限を与えるよう求められるので、指示に従ってください。

### 実行結果
・スプレッドシートに、タブごとにチャンネル別にログを記録
・指定したフォルダにファイルを保存

### 作成した感想
・うまくいったところ：
 ータイムライン、ユーザー名、fileデータも含めてslackログが保管できた
 ー取り急ぎ、３ヶ月に一度スプレッドシートを新しくして実行すればOKな状態
 
・うまくいっていないところ：　
 ートリガー設定して自動上書きしたいが、うまくいっていない

・嬉しかったところ：
 ー自分が加入しているslackでlog取得を進めて共有したら、こういうのが欲しかった！GithubとQiitaに投稿したら？と進めてもらった。
 　ということで、初めてアカウントを作成して投稿したので、使い方があっているかも不明です・・・
【Git】Qiita CLIを使う

# はじめに
こんにちは、10/6から毎日投稿(時差があるため若干ずれているものもあります）してます。
アウトプットする内容がなくならないように、インプットも頑張ります。
最近`Qitta`でブログを投稿するようになり、投稿のボタンを押すたびに「`Github`で記事を管理する」が目に入っていたので`Git`の基礎を学んだら使ってみようと思いました。
そこで今回はすでに`Qiita CLI`を使っている方やこれから使う方に向けて、いろいろ書いていこうと思います。

環境:
OS:`windows 11`
Terminal:`Gitbash`
`Node.js -v 20.18.0`
    

# Qiita CLIとは
`Qiita CLI`を使うと以下のことができます。
* CLI操作で`Qiita`の投稿を自分の指定したディレクトリに保存することができる
* CLI上で記事の投稿ができる（削除はできない）
という感じです。
つまり、`Qiita`を一種のリモートデポジトリのように扱える機能っていえばいいんですかね、？
詳しい`Qiita CLI`のセット方法は[こちら](https://qiita.com/Qiita/items/32c79014509987541130)から

# Qiita CLIを使用するメリット
私の思うメリットは以下の通りです
* 記事の作成をオフライン上でできる
* CLIのほうが操作が楽
* カレントディレクトリに保存できるようになるため、`GitHub`のデポジトリに記事を保存できる
* `Git`の練習になる(未経験の方向け)
* `GitHub`の草をはやすことできる
* CLI操作で投稿できるのなんかかっこよくないですか...?
`GitHub`の`contributeをすると緑色がつくので草をはやすというらしいです。
こんなにメリットがあるので試すほかありませんよね？

# Qiita CLIを使用する上で知っておいた方がいいこと
これについては知らなかったというか、操作しながら学んだので共有したいと思います。
結論から書いておくと、ファイル名を変える場合は`.remote`ファイルの中をまったくいじらないでおきましょう。
`npx qiita publish ファイル名`を実行した際に、`.remote`ファイルの更新をするのですが、もとのファイル名でないと、変更したファイル＋煩わしい名前のファイルが保存されるよくわからない状態になります。
`.remote`は放置と覚えておきましょうｗ

そんなこと知ってるよ！って方はスルーで大丈夫ですが、煩わしくよくわからないファイル名を変えるシェルスクリプトも載せているのでよかったら見てください。

`npx qiita new ファイル名`で投稿する記事のファイルを作成することができます
例えば
```
npx qiita new article1
# カレントディレクトリ内にarticle1.mdが作成される
```
という感じです。
上記の`Qiita CLI`の`README`を作成しながら進めると、投稿したファイルをカレントディレクトリに以下のように作成します。
すでに投稿しているファイルが2つの場合こんな感じで作成されます。
```
public--
       |_.remote
       |_rejkjflkajlkdfja.md
       |_djfalkjflkajdflk.md
```
ここで`.remote`について、いくつか注意点がありますが隠しファイルなので触らないと覚えておきましょう。
ここで、私はファイル名が長すぎて嫌だったので投稿順に`article1.md`のように名前を付けようと考えました。

ここで正直に言うと`chatgpt`の力を借りて、以下のシェルスクリプトを作成し名前を変更しました。(ここ以降の話は`Linux`知らないときついかも...)
同じ共有の方もいると思うので参考にしてもらえれば幸いです。
```:rename_md_files.sh
#!/bin/bash

# 1. 日付をファイルから取得して、ファイル名と共に保存
declare -A file_dates

for file in *.md; do
    # 正確な 'updated_at' 行を取得
    date=$(grep "^updated_at: " "$file" | sed -E "s/updated_at: '(.*)T.*'/\1/")
    
    if [ -n "$date" ]; then
        file_dates["$file"]="$date"
        echo "Found date $date in file $file"
    else
        echo "No date found in file $file"
    fi
done

# 2. 日付順にソートしてリネーム
count=1
for file in $(for key in "${!file_dates[@]}"; do echo "${file_dates[$key]} $key"; done | sort | awk '{print $2}'); do
    echo "Renaming $file to article$count.md"
    mv "$file" "article$count.md"
    count=$((count + 1))
done

echo "ファイルが順番にリネームされました。"
```
`rename_md_files.sh`をカレントディレクトリに保存して、以下のコマンドを実行します
```
$ ./rename_md_files.sh
# 実行権がありません的なのが出てくる
$ chmod a+x ./rename_md_files.sh
$ ls -l
# rwxr-xr-x ....と記載がある。xは実行権を付与したという意味
$ ./rename_md_files.sh
```
これで名前が変わっているはずなので試してみてください。
`Bash`を使えばいきなり実行できますが、誤って操作をしてしまうリスクがあると習ったので勉強のため`chmod`を用いて実行します。
という感じでファイル名も変えて、`.remote`を放置すればあとは`git`を使って自分の`GitHub`に`push`するだけです。
ちなみに、GitHubに載せる際に`rename_md_files.sh`を載せたくない方は`gitignore`に記載を忘れずに。

私のようなプログラミングスクールに行かず独学の人にとって、`git`を触るいい機会だと思います。
私の場合は、`branch`を作成して`pull request`やもう一つアカウントを作って`コメント`や`merge`など勉強していますw
【Cコード解析】ブロックを抜き取る

C言語のソースコードを解析するうえで、ブロック単位でソースコードを抜き取れると何かと便利。
正規表現を利用してブロック単位で抜き取る方法を解説する。

## ブロック単位で抜き取るための正規表現の基本
ブロックの開始から終了までマッチさせるための正規表現はこちら。
例えば、`{AAAA}`やブロックがネストされた`{BBB{CCC}}`のようなものにマッチする。
``` regex:
(\{(?:[^{}]|(?1))*\})
```
この正規表現について説明する。
- `(`：キャプチャー開始して、正規表現を再帰させる範囲を決める
- `\{`：ブロックの開始
- `(?:`：非キャプチャーグループの開始
- `[^{}]`：`{`と`}`以外の文字にマッチ
- `|`：ORの意味で、`[^{}]`か`(?1)`にマッチする
- `(?1)`：正規表現を再帰させ、1つ目のキャプチャーグループを再帰させる
- `*`：この正規表現であれば`(?:[^{}]|(?1))`が0回以上連続することを示す
- `\}`：ブロックの終了
- `)`：キャプチャーの終了

ネストのブロックが出てきたときに`(?1)`で再帰させることにより、
またブロック開始の`\{`からマッチを開始することができる。これにより、どれだけ深いネストのブロックもマッチさせることが出来る。

## ifブロックを抜き出してみる
ifブロックを抜き出す前に、if文をマッチさせる正規表現を考える。
この正規表現でif文と条件式までマッチさせる。
``` regex
(?<=\n)\s*\bif\b\([^()]*\)\s*
```
この正規表現について説明する。
- `(?<=\n)`：肯定後読みで改行直後にマッチする、行頭にマッチさせるため必要
    - ※行頭のマッチといえば`^`だが、ソースコード全体の先頭にしかマッチしないため今回は使用できない
- `\s*`：if文前のインデントにマッチする
- `\b`：ifの前に他の英数字がないことを保証する
- `if`：ifにマッチする
- `\b`：ifの後に他の英数字がないことを保証する
- `\(`：条件式の開始である括弧にマッチする
- `[^()]*`：条件式にマッチする
- `\)`：条件式の終了である括弧にマッチする
- `\s*`：条件式の後のスペースや改行にマッチする

if文とブロックをマッチする正規表現を組み合わせたものがこちら。
``` regex
(?<=\n)\s*\bif\b\s*\([^()]*\)\s*(\{(?:[^{}]|(?1))*\})
```
下記のソースコードを例に試してみる。
``` test.c
#include <stdio.h>

void main(void)
{
    int a = 0;
    if(a < 10)
    {
        printf("a is small value");
    }
}
```
この場合、マッチするのはこの部分。
```c
    if(a < 10)
    {
        printf("a is small value");
    }
```

pythonで抜き出す場合は、下記のコードでOK。
```python
import regex
with open("test.c", "r", encoding="utf-8", errors="ignore") as file_obj:
    codetext = file_obj.read()
    ret = regex.search(r"(?<=\n)\s*\bif\b\([^()]*\)\s*(\{(?:[^{}]|(?1))*\})", codetext, regex.DOTALL).group()
print(ret)
```

## まとめ
Cコードに対してブロック単位でコードを抜き出す方法を説明した。
これを応用すればifブロックだけではなく、switch, for, whileなどのブロックも抜き出し可能だし、関数自体の抜き出しも可能である。
また、`regex.search`だけではなく、`regex.findall`や`regex.sub`を使うことで対象のブロックをすべて抜き出したり、置換したりすることが可能。

もう少し工夫すれば、ifブロックに対してelseブロックを追加する処理も可能。
静的解析ツールでelseブロックがないという指摘があったりするため、一括で追加したりできそう。
OCI Foundations Associateは5時間あれば受かる

## OCI Foundations Associateになろう！

勉強時間：４ 時間
試験時間：60 分
合計： ５ 時間

５時間あれば Foundations Associate 試験に合格できます。

最初にお伝えしますと、この試験は無料です！
しかも 15 回チャンスがあります。嘘じゃないです。

### 勉強の方法

なにはともあれ、Oracle アカウントを作成しましょう。
アカウントを作成したら、下記のサイトにアクセスしましょう。

https://mylearn.oracle.com/ou/learning-path/become-an-oci-foundations-associate-2024/139374

いくつかの勉強コースが表示されますが、１番上の 4 時間の講義だけ受けましょう。
インド人と思しき先生が、なまりの強い英語で教えてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/3d599bb9-a4a9-6640-d3d8-66baea964908.png)

#### 英語の勉強にもなる

`to recap`: 要約すると  ／　`so forth`　～などなど
私はこれらの英語を身に着けました。

### 辛くても、すべての動画を見るんだ！

仕事終わりの 30 分でもいいので、動画を見ましょう。
「英語で何言ってんのかわかんねーよ！」という人はキャプションをつけましょう。

１週間もあれば、すべての動画を見終わります。

### すぐに試験を受けるんだ！

なんとこの試験、15 回受けることができます。しかも無料で。（大事なことなので２回言いました）
とはいえ、ダラダラやってたら脳みそから情報が抜けていくので、はやく試験を受けましょう。

平日夜に動画を見て、土曜日朝起きて試験を受けましょう。

## 試験

自宅で受けられます。ブラウザで受けられます。
事前申し込みもいらないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/f69b5410-5897-5c18-53ee-97b50c706217.png)

ブラジルポルトガル語やスペイン語が得意な人は、それらの言語で受験できるみたいです。
ブラジルポルトガル語というのは、初めて知りました。

https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%82%B8%E3%83%AB%E3%83%9D%E3%83%AB%E3%83%88%E3%82%AC%E3%83%AB%E8%AA%9E


## 私は２回目で受かりました。

（１回目の試験では、試験途中で晩御飯の時間になったので、途中で試験を放棄しました）
なんてったって、１５回も受けられるんだ！

６０％以上の正答率で合格です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/4201cd36-43dd-ac7c-5b11-ed52930ea948.png)

## 糸冬了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/d28113a7-8a29-5b4a-1249-1df37dd9c214.png)
コマンドのPATHが通っていない時に確認すること

## やりたいこと

コマンドを打っても実行されない時に、そもそも実行コマンドが置かれているファイルのPATHがわからない時の確認方法。

## 確認方法
terraformをインストールしたけどPATHが通っていなくて、コマンドが実行できない場合、

```
$ which terraform
/home/linuxbrew/.linuxbrew/bin/terraform
```
`which`コマンドの引数に指定した実行ファイルが、どのディレクトリに保存されているのか確認できます。

上記だと、`/home/linuxbrew/.linuxbrew/bin/`直下に`terraform`の実行ファイルが置いてあります。

以下のコマンドで、現在どのディレクトリのPATHが通っているか確認できます。

```
$ echo $PATH
/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
```
上記では、`/home/linuxbrew/.linuxbrew/bin`のPATHが通っているので、`terraform`のコマンドをホームディレクトリでも使えます。
ここで、terraformの実行ファイルが置かれたディレクトリのPATHが表示されなかった場合は、別途PATHを通す必要雨があります。

## 終わりに

この前terraformコマンドが使えずになんでだろうと色々調べていたのですが、ちゃんとインストールできていなかっただけでした。。その際にPATHが通っているか確認する際にぱっと方法が思いつかなかったので書いてみました。
誰かの参考になれば幸いです。
エラー発生→解決済【備忘録】

今日困ってやっと解決した件

'''class PrototypesController < ApplicationController
  before_action :authenticate_user!, except: [:index, :show]　#トップページと詳細以外はログインしている人だけ  
  before_action :move_to_index, only: [:edit]
  
def index
  @prototypes = Prototype.includes(:user).order("created_at DESC")
end

省略

def prototype_params
  params.require(:prototype).permit(:title, :catch_copy, :image, :concept).merge(user_id: current_user.id)♯prototypeはid要らない。userだけmergeする。
end

def move_to_index
  @prototype = Prototype.find(params[:id])
  unless @prototype.user == current_user　♯４行目でログインしてないユーザーは入れない（トップページと詳細ページ除く）はここに来て、prototypeとログインユーザー同じじゃなかったらトップページに飛ぶ。
    redirect_to action: :index
  end
end
end'''
個人ブログのバックエンドを EC2 から Lambda に移行した

# はじめに

　EC2 & ALB はコストが高すぎた。1 円にもならない個人ブログのために 1 か月 $40 という大金が消えていた。そのうち移行しよう、なんて甘い考えだったが、マネジメントコンソールのコストを見ていたら居ても立っても居られなくなった。

　なぜだかわからないがとても不安になった。

　そこで急遽移行を始めた。

# Lambda 関数の作成

　幸いバックエンドは複雑なコードではなく、index.js という 1 つのファイルだけだった。ChatGPT にどのようにデプロイしたらよいか聞いた。

> AWS Lambdaは、ファイルシステムへの長期的なアクセスや常駐プロセスの保持を前提としていないため、標準的なExpressサーバーのコードをそのままLambdaにデプロイすることはできません。ただし、AWS LambdaでExpressアプリケーションを実行するために、aws-serverless-expressなどのライブラリを使用してHTTPリクエストを処理する形に変換することが一般的です。

`aws-serverless-express` を使うらしい。コードも書いてもらった。

```js
import awsServerlessExpress from 'aws-serverless-express'; // 新規追加

// 他は現行コードのまま

// サーバーをAWS Lambdaに対応させる
const server = awsServerlessExpress.createServer(app);

export const handler = (event, context) => {
  return awsServerlessExpress.proxy(server, event, context);
};
```

最後の部分は以下のリッスンする処理を削除して書き換える。

```js
const port = 8080;
app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});
```

よくわからないが、書き換えたものを Lambda 関数コードに貼り付けデプロイした。

## レイヤー作成手順

次にレイヤーを作成する。

```bash
mkdir lambda-layer # 適当な作業ディレクトリ
mkdir next-blog-app # このアプリの作業ディレクトリ
mkdir nodejs # レイヤー作成に必須のディレクトリ
vi package.json # GitHub で管理している package.json をコピペする
npm install
cd ..
zip -r next-blog-app.zip nodejs
```

この後、マネジメントコンソール画面で、Lambda > レイヤー > レイヤーの作成 の順に進み、 zip 化したファイルをアップロードする。

## require を import に書き換える

レイヤーを作ってコードをデプロイしたらテストする。

```
require is not defined in ES module scope, you can use import instead
```

テストしたら上記エラーが出たのでパッケージの使用は require ではなく import に書き換える。

## レイヤー更新

　次のエラーは以下：

```
Cannot find package 'aws-serverless-express' imported from /var/task/index.mjs
```

EC2 で動かしていたころのパッケージには `aws-serverless-express` は含まれていなかったので、レイヤーに追加する必要があった。レイヤーを作り直す。

```bash
npm install aws-serverless-express
cd ..
zip -r next-blog-app.zip nodejs
```

## API Gateway で REST API を作成する

　ルートパス直下に `{proxy+}` リソースを作り、ANY メソッドで Lambda 関数を指定する。

![image](https://next-blog-app-bucket-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/posts/images/34/api-gateway.png)

CORS 設定を有効化し、API をデプロイする。

# まとめ

　`aws-serverless-express` を初めて使った。めんどくさい設定が必要かと思ったら意外と簡単だった。今まで 1 つの API に 1 つの Lambda 関数を関連付けていたが、ANY メソッドと `{proxy+}` リソースと謎のコードによって 1 つにまとめることができることを知った。

```js
const server = awsServerlessExpress.createServer(app);

export const handler = (event, context) => {
  return awsServerlessExpress.proxy(server, event, context);
};
```

移行後早速 EC2 インスタンスを停止し、ALB を削除した。今月既に $20 だ。もっと早く移行すればよかった。悔やんでも仕方ない。

1か月 $40 も食いつぶしていた個人ブログ：

https://oizumi-yuta.com/
SupabaseのURLまたはAnonキーが設定されていません

```.env
SUPABASE_URL=https.....
SUPABASE_ANON_KEY=fdgYj.....

```

このように書かれているファイルを次のように変更するとエラーが解消しました

```.env
NEXT_PUBLIC_SUPABASE_URL=https.....
NEXT_PUBLIC_SUPABASE_ANON_KEY=fdgYj.....

```
理由としてはクライアントサイドで環境変数を使用する場合はNEXT_PUBLICを先頭に書く必要があるみたいです。(サーバーサイドのみで使用する場合は書かなくてもよい)
Qiita始めました

## 自己紹介
この度Qiitaをはじめさせていただきました。ハルと申します。現在大学院の修士2年で設計工学系の研究室に所属しています。無事卒業できれば来年社会人になる予定です。研究内容はざっくりいうとトポロジー最適化とAIを融合させたアプローチの開発をしています。
## Qiitaを始めた目的
主にアウトプットによる知識の定着と整理を目的としてQiitaを始めました。研究を進めていく中でまだまだ専門領域の知識が狭く、浅いという事実を痛感することが度々あります。様々な文献を調査するということは行うものの、それをアウトプットする機会がほとんどないためすぐに忘れてしまったり、説明しようとすると上手く言葉が出てきません。アウトプットなら論文書いたら？という耳の痛くなるような言葉が聞こえてきそうですが、私はそんな優秀な人間でないのでこの場で少しずつ進歩していけたらと思っています。

また、私自身QiitaでAI領域の記事を参考にさせていただくことがあるのですが設計工学領域に関してはインターネットで検索をしても情報を発信している人が少ないために気軽に閲覧できるようなwebサイトがほとんど見つかりません。このような問題意識のもと、多少信頼性に欠けていたとしても初学者への情報提供に貢献したいという思いもあります。
## 最後に
サボらずに更新頑張ります。よろしくお願いします。
【Rails】非推奨警告（deprecation warning）の扱いを変えたい場合はconfig.active_support.deprecationを変更する

## はじめに

Railsのデフォルト設定では、非推奨機能を使うとログに警告が出力されます。
<br>

ただしログを見落としてしまうと、警告を見逃していつまでも非推奨機能を使い続けてしまう恐れがあります。
<br>

これを避けるため非推奨機能を使った際にエラーを発生させたいです。
<br>

この記事ではこういった、非推奨機能を利用時の挙動を設定変更する方法をまとめます。

## 非推奨（deprecation warning）の扱いを変えたい場合は`config.active_support.deprecation`を変更する

結論として、`config.active_support.deprecation`で非推奨機能を使用時の挙動が指定できます。
<br>

各環境の設定ファイルに`config.active_support.deprecation`が記述されているため、要件に合わせて変更すればOKです。
<br>

たとえば、開発環境で非推奨機能の使用時に例外を発生させたい場合、次のように修正します。
<br>

```ruby:config/environments/development.rb
require "active_support/core_ext/integer/time"

Rails.application.configure do
  # ...

  # デフォルトでは :log が設定されているが :raise に変更
  config.active_support.deprecation = :raise

  # ...
end
```
<br>

すると`ActiveSupport::DeprecationException`が発生します。
<br>


設定項目には以下のバリエーションがあるようです。
<br>

- `:raise`：エラー発生
- `:stderr`：標準エラー（STDERR）に出力
- `:log`：ログに出力
- `:notify`：ActiveSupport::Notificationsで通知
- `:report`：ActiveSupport::ErrorReporterで出力
- `:silence`：何もしない
<br>

詳細は以下のドキュメントに記載されています。

https://api.rubyonrails.org/v7.2/classes/ActiveSupport/Deprecation/Behavior.html#method-i-behavior-3D

## おわりに

Railsのバージョンアップに携わる中でこの設定について学べました。
<br>

引き続きバージョンアップ作業を通じて学んだことをアウトプットしていきます。
<br>

この記事に誤りがありましたら、コメントにてご指摘いただけると幸いです。

### 参考資料

https://railsguides.jp/configuring.html#config-active-support-deprecation
【ざっくり機能紹介】意外と便利かもしれない！？ Amazon EC2 Global View 

:::note info
この記事はEC2の利用状況を表示する「Amazon EC2 Global View 」に関する機能紹介の記事となります。
:::

# まえおき
いつものようにAWSで遊んでいる中で起きる悲劇として、「機能構築したEC2がメニュー画面から消えている」があるかと思います。（原因として、選択しているリージョンが勝手に切り替わっていることですが.......）

よくある事象：`リージョンがいつの間にか「バージニア北部」になっている`
![スクリーンショット 2024-10-16 221516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/0616f53b-af8d-d6d9-55c8-6dcc6f63d87d.png)

正しいリージョンに切り替えれば済む話なのですが、私のようなうっかり屋さんやトラブル発生時のバタバタしている状況だと気づきにくいポイントなので、何か良い方法はないかを考えていました。

**EC2 Global View**というメニューを見つけたので試したところ、「意外と良いのでは」と思い調べ始めました。

## 役立ててもらいたい方
- AWSに関して学習を行っている方
- 良いEC2管理方法について探している方
- 私のようなうっかり屋さん

## そもそも「Amazon EC2 Global View」とは？
公式ドキュメントの記載を引用すると以下のとおりです。


>Amazon EC2 Global View では、Amazon EC2 および Amazon VPC リソースの一部を、単一のAWSリージョン、または単一のコンソールで複数のリージョンにまたがって表示できます。またAmazon EC2 Global View では、グローバル検索機能を使用して、特定のリソースまたは特定のリソースタイプを複数のリージョンにまたがって同時に検索できます。

ざっくり言えば「全リージョンのEC2、VPC関連のリソースすべてを一つのメニューで確認できる！」となります。
一応、「Amazon EC2 Global Viewを利用ための許可設定」が必要なようですが、ログインユーザに**AdministratorAccess**ポリシーを設定しているのであれば、追加設定は不要でした。

**Amazon EC2 Global View画面**
![スクリーンショット 2024-10-16 223618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/df945a95-0ca4-cc3d-f5f1-665817194e6a.png)

個人的は「必要十分な情報がまとめられているのでわかりやすい！」といった印象を持ちました！

## Goodポイント
触ってみて感じたGoodポイントとしては以下がありました。

1. 全リージョンのリソース情報が一つのメニューで確認できるため、都度リージョン設定を変える必要はない。__（超重要）__
1. CSVファイル形式でリソース情報を取得できる（=運用部門からリソース情報をリストで共有してといわれてもすぐに対応できる）
1. 画面がシンプルなため、直感的な操作が実現できる

## Kaizenポイント
ここは改善ポイントだなと思ったところは以下がありました。

1.　メニュー画面が表示されるまで時間がかかる（個人アカウントでも2,30秒ほどかかっていたため、企業アカウントだと1分以上かかると予想される......）
2.　一部リージョン（ジャカルタ、ミラノなど）は利用不可となっている
3.　各リソースごとに「CSVのダウンロード」ボタンがあるため、リソースごとに出力されるのかと思ったが、実際は、どのリソースでも「すべてのリソース情報が出力される」仕様だった....（直感と反する動きだなぁと思いました......）
4.　得られる情報は各リソーストップ画面と比べて限定されている。（リソースID、リージョン情報、タグ名くらいしか取得できない）

## まとめ
Amazon EC2 Global Viewの登場次期を調べてみたら「2023/10/18」とのことだったので、まだまだ新しい機能なのかなぁという印象でした。個人的には、「各リージョン情報を取得⇒メニュー画面への反映」をどのようなアルゴリズムで実装しているのか気になりました。

個人的には、「運用管理や設計時のリソース情報取得なので使えるのかなぁ」と思いました。（先の未来の話かもしれませんが......）

最後まで本記事を読んでいただきありがとうございます。参考になったと思った方はハートマークを押していただけると筆者が喜びます。また、質問、ご意見や「ここ間違っているよ」などの指摘も大歓迎です！

PS：
AWSは実機を触りながらアウトプットとして記事を書くのが性に合うなぁと思い始めました！（LTへも積極的に登壇していきたい）

## 参考サイト
[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/global-view.html)
[アップデート 全リージョンを一望できる EC2 Global View が登場](https://dev.classmethod.jp/articles/ec2-global-view/)
分析で利用するpandasのDataFrame(データの集計と統計編)

前記事からの続きです。
前の記事はこちら

https://qiita.com/y_haruki/items/03506f91d592bb36c16f




利用するデータは説明のため以下のデータを利用します。
今回AMZNの値はすべて数字を入れています。
``` py:
import pandas as pd

df = pd.DataFrame({'GOOG':[158.56,157.21,167.31,168.42,167.19,165.29,168.83],
                   'AMZN':[186.61,181.96,184.76,185.13,186.33,187.97,188.07]
                   })
```

行と列の値の関係が見やすいように、df.head(7)の実行結果を表示させます。
``` :実行結果
     GOOG    AMZN
0  158.56  186.61
1  157.21  181.96
2  167.31  184.76
3  168.42  185.13
4  167.19  186.33
5  165.29  187.97
6  168.83  188.07

```


データの集計と統計
### 1\. df.mean()
各数値列の平均値を計算します。

``` py:
print(df.mean())
```

``` :実行結果
GOOG    164.687143
AMZN    185.832857
dtype: float64

```


### 2\. df.std()
各数値列の標準偏差を計算します。

``` py:
print(df.std())
```

``` :実行結果
GOOG    4.796772
AMZN    2.123964
dtype: float64
```

### 3\. df.sum()
各数値列の合計を計算します。

``` py:
print(df.sum())
```

``` :実行結果
GOOG    1152.81
AMZN    1300.83
dtype: float64

```
### 4\. df.count()
各列の非欠損値の数を数えます。

``` py:
print(df.count())
```

``` :実行結果
GOOG    7
AMZN    7
dtype: int64

```
Nginxの導入方法

# Nginxの導入方法
1\. 事前準備
2\. 投稿主の実装環境
3\. Nginxとは
4\. 環境構築
5\. nginx便利コマンド

## 1\. 事前準備
特になし

## 2\. 投稿主の実装環境
・AlmaLinux(9.2)
・nginx(1.20.1)

## 3\. nginxとは
高性能なWEBサーバアプリケーションであり、高トラフィックのサイトや静的ファイルの配信に特化したミドルウェアのこと。

※高トラフィックとは、ウェブサイトに対して多くのリクエストが集中する状態。
※静的ファイルとは、内容が変更されず、リクエストに対して常に同じデータを返すファイル


## 4\. 環境構築

### Nginxのインストール

最新版のnginxをインストール：
```
$ sudo dnf install nginx -y
```
特定のバージョンをインストールする場合：
```
$ sudo dnf install nginx-1.21.6
```
インストール完了後、以下のコマンドによりバージョンが表示されればOK
```
$ nginx -v
nginx version: nginx/1.20.1
```

## 5\. nginx便利コマンド

Nginxのバージョン確認：
```
nginx -v
```

Nginxのサービス(状態確認・起動・停止・再起動)：
```
#サービス状態確認
$ sudo systemctl status nginx

#サービス起動
$ sudo systemctl start nginx

#サービス状態確認
$ sudo systemctl stop nginx

#サービス再起動
$ sudo systemctl restart nginx
```

アクセスログの監視：
```
$ tail -f /var/log/nginx/access.log
```

アクセスログの監視：
```
$ tail -f /var/log/nginx/error.log
```