OmniAICreator/Qiita-1.07M huggingface dataset:
Vue2でextendsオプションを使ってaxiosの共通処理を作成した話

## 概要

どのVueでも使うような共通処理を１つのコンポーネントとして定義して、実際のVueでそれを継承したような形で実装したかったのだが、いろんな書き方が出てきて頭痛くなったのでここに完結にまとめる。

## 調べて出てきたもの

「vue extends」と検索すると大量の情報がヒットする
- Vue.extend()の話
これが一番出てくる....ただ、これはVueの定義をする部分の書き方に関するものっぽくて継承とかの話とは微妙に違うんですよね..(関係無いわけでは無いんですけど)
- typescriptの話
次によく出てくる話。別に今回は書き換えたいわけじゃないんだよなぁ...  
- クラスコンポーネントの話
`export default class A extends B {}`
みたいなやつ
継承ではあるんだけど、typescript考慮の話に近いみたいで、やりたいこととは違う
- Vueのextendsオプション
**これが知りたかったこと**

## やりたいこと

共通で使える親Vueを定義して、それぞれのcomponentでそちらをextendsして、メソッド等を継承しただけで使えるようにする。
axiosを用いた処理の共通化など

## 実装

共通処理を記載したVueファイル

```BaseApp.vue
<script>
import Vue from 'vue'
import axios from 'axios'
export default {
  data() {
    return {
      hugahuga: 'フガフガ',
    };
  },  
  methods: {
    async getRequest(url){
      const promise = await axios
        .get(url)
      return promise
    },
    hogehoge(){
      console.log(this.hugahuga)
    }
  }
}
</script>
```

継承したVueを使うファイル

```HelloWorld.vue
<script>
import Vue from 'vue'
import BaseApp from './BaseApp.vue'

export default {
  extends: BaseApp,
  props: {
    msg: {
        type: String,
        default: ""
      }
  },
  created() {
    this.hogehoge()
    this.get()
  },
  methods: {
    async get(){
      const response = await this.getRequest('https://api.coindesk.com/v1/bpi/currentprice.json')
      console.log(response)
    }
  }
}

</script>

```

これで済む話だったのにだいぶ遠回りをしました...
npm-scriptsで.envファイルから環境用変数を取得して共通処理を行う

ローカルで向き先を変えてコマンドを実行したいという時、  
1枚の`.env`ファイルの中にデータを集約して、  
接頭辞をもとに以降のプロセスで同名でアクセス出来る。  
Gitで追跡しないデータを取り扱う時や情報をまとめておきたい時とかに使う。

```
export $(cat .env | grep -v ^# | sed -e s/^DEV_//g | xargs)
```

上記コマンドの実行により`.env`内の変数`DEV_DIR_SRC`と`DEV_DIR_DIST`を、  
それぞれ`DIR_SRC`と`DIR_DIST`として呼び出せるようにする。

# .envファイルの作成

```shell:.env
# src
DEV_DIR_SRC="develop/src"
STG_DIR_SRC="staging/src"
PRD_DIR_SRC="production/src"

# dist
DEV_DIR_DIST="develop/dist"
STG_DIR_DIST="staging/dist"
PRD_DIR_DIST="production/dist"
```

# package.jsonの作成

```json:package.json
{
  ~
  "scripts": {
    "echoTest": "echo $DIR_SRC; echo $DIR_DIST",
    "devTest": "export $(cat .env | grep -v ^# | sed -e s/^DEV_//g | xargs); yarn echoTest",
    "stgTest": "export $(cat .env | grep -v ^# | sed -e s/^STG_//g | xargs); yarn echoTest",
    "prdTest": "export $(cat .env | grep -v ^# | sed -e s/^PRD_//g | xargs); yarn echoTest"
  },
  ~
}
```

# 実行

```shell
$ yarn devTest
```

# 結果

```console
develop/src
develop/dist
```
プロジェクトの空気の読み方

## プロジェクトの空気の読み方

**空気は吸ったり吐いたりするもので読むものではないです。**

そんな目に見えないモノを読もうとしても読めるわけがないのですが、空気を読んで上手く立ち回っているっぽく感じる人がいるのも事実です。

では一体彼らは何を読んでいるのでしょう…？

そうです。
彼らは俯瞰してプロジェクトの大いなる流れを読んでいるのです。

プロジェクト全体の大いなる流れ、すなわち全体のタスクと各タスクの日程感を把握して、どのタイミングでどの様に振る舞うべきかを考えて行動しているのです。
目に見えない空気ではなく『目に見えるタスクと、それらのタスクの日程感を見て行動を考える』ことこそが『プロジェクトの空気の読み方』です。

基本は、与えられたタスクについて締切から逆算して何をすべきか考える。
誰か他の人が関係する時はその人のタスクについても同様に考える。
ついでにプロジェクト全体のタスクや締切も把握しておく。
これが空気の読み方ですがピンと来ないと思うのでいくつか例をあげてみましょう。


## 先輩が忙しそうだからと質問するのを躊躇、締切を守れなかった

分からないことがあるけれども、忙しそうな先輩に申し訳なくて声をかけることができない。
散々様子を伺ってようやく声をかけれた時には「なんで今聞くの？もっと早く聞きなよ？」と言われてしまう。
新人あるあるかと思います。

ここで「もっと早く聞きなよ？」と言われる理由を考察してみましょう。
おそらく先輩はあなたのタスクの締め切りも担保しなければいけない立場ではないでしょうか？
もしそうであれば、あなたの仕事が終わらないことも先輩の仕事が終わらないことも同義です。
あなたが早く質問していれば、適切にアドバイスをすることであなたの仕事を無事に終わらせることができたという状況であれば「もっと早く聞きなよ？」と言いたくなるかもしれません。

忙しそうにしているところに声をかけることと、締切に仕事が終わらないこととどちらが申し訳ないでしょうか？


## できないことをできないと言えないまま締め切りを迎えた

できないことをできないということは勇気がいることです。

しかしながら、与えられたタスクができていないまま、できないとも言えずに締め切りを迎えると何が起きるのかを考察してみましょう。

学校の宿題ができなかったのであれば、あなたが先生に怒られて終わりです。ひょっとしたら成績が下るかもしれないし、下がらないかもしれない。その場さえ乗り切れば終わりだったかもしれません。

会社の仕事は基本的にはお客様との契約の上成り立っているチームでの仕事です。チーム全体がお客様との契約を履行できないという状況に陥ります。お客様に至ってはあなた達のチームに依頼した製品をリリースできず大きな損害を被ることになります。

できないと分かった時点でチームの誰かに相談しましょう。誰もあなたのことを責めないと思います。[^1]

誰かがフォローするとしても、問題に対処する時間が少ないとフォローできないです。
時間が少なければ少ない程フォローができる人間は少なくなってしまいます。


## 作業見積もりを答えられない

やったことのない作業の見積もりを正確にできる人間はいません。
無理して根拠のない見積もりを申告するより、まずはx時間くださいと言って見積もり根拠を収集して精度の高い見積もりを出してみてはいかがでしょうか。


## まとめ

プロジェクトの『空気』は、いつまでに何を納品するか、納品した開発物をお客様がどの様に利用するか、までを考えると読むことができると思います。

これはこれで大変なことではあるのですが、よく分からないことで思い悩むよりもアウトプットに集中するという考え方をした方が仕事がしやすくなるのではないでしょうか。


[^1]: 責めないでください
Certbot common commands

```shell
certbot --version

certbot -h
```


```shell
sudo certbot show_account

Account details for server https://acme-v02.api.letsencrypt.org/directory:
  Account URL: https://acme-v02.api.letsencrypt.org/acme/acct/12345
  Email contact: xxxx@zone.com
```

```shell
sudo certbot certificates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: abc.com
    Serial Number: 7b563303de1824c93
    Key Type: RSA
    Domains: abc.com def.com
    Expiry Date: 2022-06-07 (VALID: 90 days)
    Certificate Path: /etc/letsencrypt/live/abc.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/abc.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
```
【2022/04/05 時点】Debian 9 で apt-get update を実行すると、「Could not connect to deb.debian.org:80 (151.101.110.132)」が発生する問題と対策


## 概要

過去に docker build に成功した **Dockerfile** (**Debian 9**) において、
apt-get update を追加し実行すると、次のエラーが発生した

このときの原因と対策の記録である.

:::note warn
当然、人によって原因は異なるので注意が必要である.
:::

**エラーログ**

```
Err:1 http://deb.debian.org/debian stretch/main amd64 python3-minimal amd64 3.5.3-1
  Could not connect to debian.map.fastlydns.net:80 (151.101.74.132) 略
```




## 原因

下記 /etc/apt/sources.list に定義された URL から、
stretch (Debian 9) のパッケージリストが存在しなくなったため

```
# cat /etc/apt/sources.list
deb http://deb.debian.org/debian stretch main
deb http://security.debian.org/debian-security stretch/updates main
deb http://deb.debian.org/debian stretch-updates main
```


## 対策

ミラーサイト「`http://ftp.jp.debian.org`」を参照するように変更した

```
$ cat /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian/ stretch main contrib non-free
deb http://ftp.jp.debian.org/debian/ stretch-proposed-updates main contrib  non-free
deb http://ftp.jp.debian.org/debian/ stretch-updates main contrib
deb http://ftp.jp.debian.org/debian/ stretch-backports main contrib  non-free
```


## その他

事前に、Proxy サーバを使用する設定が正しいことは確認した.




## 関連記事

https://qiita.com/drafts/2b9912e3d8b5e8f70158/edit
1変数ガウス分布に関する規格化条件を証明してみる。

# はじめに
会社の有志メンバーで[パターン認識と機械学習(通称PRML)](https://www.maruzen-publishing.co.jp/item/?book_no=294524)を勉強しており、演習問題1.7を解くことになったのでメモ。

1変数ガウス分布に関する規格化条件は下記。

```math
\int_{-\infty}^{\infty}\mathcal{N}(x | \mu,\sigma^2)dx=1
```

これを証明してみる。

# 解答

PRML1.7の問題文に倣って、下記を考える

```math
I = \int_{-\infty}^{\infty}\exp(-\frac{1}{2\sigma^2}x^2)dx
```

上記を２乗すると、次になる。

```math
I^2 = \int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\exp(-\frac{1}{2\sigma^2}x^2-\frac{1}{2\sigma^2}y^2)dxdy
```

これを、直交座標から極座標に変換する。つまり$x=r\cos\theta,y=r\sin\theta, dxdy=rdrd\theta$で置き換えると、

```math
\begin{align*}
&= \int_{0}^{\infty}\int_{0}^{\infty}\exp(-\frac{1}{2\sigma^2}r^2\cos^2\theta-\frac{1}{2\sigma^2}r^2\sin^2\theta)rdrd\theta \\
&= \int_{0}^{\infty}\int_{0}^{\infty}\exp\{-\frac{r^2}{2\sigma^2}(\cos^2\theta+\sin^2\theta)\}rdrd\theta &\\
&= \int_{0}^{\infty}\int_{0}^{\infty}\exp(-\frac{r^2}{2\sigma^2})rdrd\theta \\
&= 2\pi\int_{0}^{\infty}\exp(-\frac{r^2}{2\sigma^2})rdr
\end{align*}
```

ここで、$u=r^2$で上を置き換える。

$\frac{1}{2}du = rdr$になることを注意して置換すると、

```math
\begin{align*}
&= 2\pi\int_{0}^{\infty}\exp(-\frac{r^2}{2\sigma^2})rdr \\
&=  \pi\int_{0}^{\infty}\exp(-\frac{u}{2\sigma^2})du  \\
&= \pi\left[-2\sigma^2\exp(-\frac{u}{2\sigma^2})\right]^{\infty}_0 \\
&= -2\pi\sigma^2(e^{-\infty} - e^0) \\
&= 2\pi\sigma^2 \\
\end{align*}
```

長かったですが、$I = \int_{-\infty}^{\infty}\exp(-\frac{1}{2\sigma^2}x^2)dx =(2\pi\sigma^2)^{\frac{1}{2}}$を示すことができました。少し後でこれを使います。

ここで、1変数ガウス分布の定義は次です。

```math
\int_{-\infty}^{\infty}\mathcal{N}(x|\mu,\sigma^2)dx = \frac{1}{(2\pi\sigma^2)^{\frac{1}{2}}}\int_{-\infty}^{\infty} \exp\{-\frac{1}{2\sigma^2}(x-\mu)^2\}dx
```

ここで、$x-\mu=z$とおくと上の式は、

```math
= \frac{1}{(2\pi\sigma^2)^{\frac{1}{2}}}\int_{-\infty}^{\infty} \exp\{-\frac{1}{2\sigma^2}(z)^2\}dz = \frac{1}{(2\pi\sigma^2)^{\frac{1}{2}}} I = \frac{1}{(2\pi\sigma^2)^{\frac{1}{2}}} (2\pi\sigma^2)^{\frac{1}{2}} = 1
```

なので、1変数ガウス分布に関する規格化条件を証明できたはず。
おしまい。

# 参考文献
- [パターン認識と機械学習 上](https://www.maruzen-publishing.co.jp/item/?book_no=294524)
AWS S3コマンドでメタ情報を付与する方法

### 本記事について
AWS S3 へ cp コマンドを使用してローカルの csv ファイルをアップロードする際の出来事。
メタ情報を付与するための S3 コマンドについて調べてもいい感じの記事が見つからない！！
なので対応したときのメモ書きを残します。

### そもそも AWS CLI とは？
ターミナル等のコマンドラインツールから AWS を操作するためのインターフェースです。
 AWS CLI を利用して、S3 上の対象バケットにあるオブジェクトを移動・削除したり、ローカル にあるファイルをアップロード、逆に S3 から ローカル へ ダウンロード することができます。

# 【本題】AWS S3 コマンドでコピー時にメタ情報を付与する方法
※ S3 コマンド実行はWindowsOSを想定

```dosbatch:コマンドプロンプト
rem 送信日をセット
>SET DATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

rem メタ情報設定　DドライブのTEST.csvをS3バケット「send-s3」にセットする場合
rem S3 Metadata KEY ⇒ meta_info
rem メタ情報は①テストコード②送信日の２つ
>SET meta=meta_info='{\"TestCd\":[\"123456\"],\"SendDate\":\"%DATE%\"}'
>SET LOCAL_DIR=D:\TEST.csv
>SET AWS_DIR=s3://send-s3/TEST/

rem AWS送信　「--sse AES256」暗号化方法の指定　「--metadata」メタ情報付与
>aws s3 cp --sse AES256 %LOCAL_DIR% %AWS_DIR% --metadata %meta%

```
【2022/04/05 時点】Debian 10 で apt-get update を実行すると、「404  Not Found [IP: 151.101.110.132 80]」が発生する問題と対策


## 概要

過去に docker build に成功した **Dockerfile** (**Debian GNU/Linux 10 \n \l**) において、
apt-get update を追加し実行すると、次のエラーが発生した

このときの原因と対策の記録である.

:::note warn
当然、人によって原因は異なるので注意が必要である.
:::

**エラーログ**

```
Err:1 http://deb.debian.org/debian buster/main amd64 libc-l10n all 2.28-10
  404  Not Found [IP: 151.101.110.132 80]
```




## 原因

下記 /etc/apt/sources.list に定義された URL から、
buster (Debian 10) のパッケージリストが存在しなくなったため

```
# cat /etc/apt/sources.list
deb http://deb.debian.org/debian buster main
deb http://security.debian.org/debian-security buster/updates main
deb http://deb.debian.org/debian buster-updates main
deb http://dl.google.com/linux/chrome/deb/ stable main 
```


## 対策

ミラーサイト「`http://ftp.jp.debian.org`」を参照するように変更した

```diff
$ diff -u /etc/apt/sources.list.ORIG /etc/apt/sources.list
--- /etc/apt/sources.list.ORIG	2022-04-05 23:26:26.849715123 +0900
+++ /etc/apt/sources.list	2022-04-05 22:45:08.850093089 +0900
@@ -1,4 +1,4 @@
-deb http://deb.debian.org/debian buster main
-deb http://security.debian.org/debian-security buster/updates main
-deb http://deb.debian.org/debian buster-updates main
-deb http://dl.google.com/linux/chrome/deb/ stable main 
+deb http://ftp.jp.debian.org/debian/ buster main contrib non-free
+deb http://ftp.jp.debian.org/debian/ buster-updates main contrib
+deb http://ftp.jp.debian.org/debian/ streach-backports main contrib  non-free
```


## その他

事前に、Proxy サーバを使用する設定が正しいことは確認した.


## 参考にしたサイト

https://kimamani89.com/2020/01/12/%E3%80%90linux-debian%E3%80%91apt-get-update-%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E7%AD%96/
基本情報技術者試験対策　24日目

基本情報技術者試験勉強　24日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

今日の目標
-
午前問題を最低でも30問は解いて、間違いを5問以内に抑える

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

間違った箇所
-
1、CORBA(Common Object Request Broker Architecture)
オブジェクト指摘技術標準化団体がまとめたオブジェクト指向による分散処理環境を実現するための国際標準仕様

2、JavaBeans
Javaを用いた開発において，部品化されたプログラムを作成するための技術仕様

3、スキャンデスク
各種のアプリケーションの処理中に異常終了が何回か発生したときは，デフラグメンテーションを実行する。

4、C＆Cサーバ
新ニュして乗っ取ったコンピュータに対して、他のコンピュータへの攻撃などの不正な操作をするよう、外部から命令を出したり応答を受け取る。

振り返り
-
目標である5問以内に抑えられたことはよかった。次回も引き続き、午前問題を最低でも30問解くことと午後問題のアルゴリズムの動画を見て、実際に手を動かす。


>引用
基本情報技術者試験ドットコム
https://www.fe-siken.com
Azure Certification 勉強用リンク

# Azure Certification 勉強用リンク

MicrosoftのMCP試験、
ファンダメンタルをコンプリートしました。

受験の時にお世話になったMicrosoft Learnのリンクを備忘録として、
また復習で使うために記載。

1. AZ系
https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900
https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-104

1. AI系
https://docs.microsoft.com/ja-jp/learn/certifications/exams/ai-900

1. DP系
https://docs.microsoft.com/ja-jp/learn/certifications/exams/dp-900

1. PL（パワープラットホーム）系
https://docs.microsoft.com/ja-jp/learn/certifications/exams/pl-900

1. MB（dynamic365）系
https://docs.microsoft.com/ja-jp/learn/certifications/exams/mb-910
https://docs.microsoft.com/ja-jp/learn/certifications/exams/mb-920

1. SC（セキュリティ＆コンプライアンス）系
https://docs.microsoft.com/ja-jp/learn/certifications/exams/sc-900

1. MS（Microsoft365）系
https://docs.microsoft.com/ja-jp/learn/certifications/exams/ms-900
LinuxターミナルでBashやC++でマウス入力取得

## 概要

[Windows Terminal がマウス入力に対応した](https://devblogs.microsoft.com/commandline/windows-terminal-preview-v0-10-release/)
を見て、Linuxターミナルでマウス入力はどのように扱われるのか気になり調べた。

## 情報

XTermのページ、
[XTerm Control Sequences](https://invisible-island.net/xterm/ctlseqs/ctlseqs.html)
に書かれている情報が分かりやすい。

モードは複数あるが、Any-event tracking にすれば、ボタンを押してなくても座標が分かるようだ。
今回はこれを使ってみよう。

`033[?1003h` を送信すればこのモードになり、それ以降、

`033[M`、`Cb`、`Cx`、`Cy` という6バイト形式で標準入力からデータを拾えるようだ。

`Cb` はボタン情報、`Cx` はX座標に32足した文字コード値、`Cy` はY座標に32足した文字コード値になるようだ。

終了するときは、`033[?1003l` を送信して、モードを無効化するのがよさそうだ。

## Bashで試す

```bash
#!/bin/bash
stty -icanon -echo -isig
printf '\033[?1003h'
printf '\033[2J'
while :; do
  s=$s$(od -An -tx1 -N1 | tr -d ' ')
  if printf $s | grep -qE '^(..)*03'; then break; fi
  if printf $s | grep -qE '^(..)*1b5b4d.{6}'; then
    b=$(printf $s | sed -E 's/^(..)*1b5b4d(..).....*$/\2/')
    x=$((0x$(printf $s | sed -E 's/^(..)*1b5b4d..(..)...*$/\2/') - 32))
    y=$((0x$(printf $s | sed -E 's/^(..)*1b5b4d....(..).*$/\2/') - 32))
    printf '\033[%d;%dH[%s]' $y $x $b
    s=''
  fi
done
tput reset
printf '\033[?1003l'
```

まず準備として、`stty` コマンドを利用し、
`-icanon` で改行なしでもデータ取得可能にし、`-echo` で標準入力の画面出力を行わなくする。
`-isig` でCtrl-Cを無効化し、自前で `03` と比較することで終了処理を行えるようにする。

終了時には、`tput reset` も呼ぶことで `stty` で変更した設定のリセットもしている。

`\033[2J` は画面クリア。
このあたりのエスケープシーケンスは、

<https://en.wikipedia.org/wiki/ANSI_escape_code>

に書いてある。

`od` コマンドで `-N 1` を指定することで、1バイトのみ16進数2文字形式で拾う。
最初にスペースがついているので、`tr` で消す。

これを、`$s` に追加していく。

ここでマウスイベントの例の6バイトにマッチした場合には、`$b`、`$x`、`$y` に相当する部分を、
`sed` で拾って、必要に応じて変換する。

これを、`\033[%d;%dH` でカーソル位置をマウスイベントの位置まで移動して、ボタン文字列を `[%s]` で囲って表示している。

これで、マウスカーソル位置にボタン情報表示が試せるようになった。

## C++で試す

bashでの実装は、1バイト読みごとにコマンドが呼ばれるからかちょっともたつく。
C++で実装してみよう。

```makefile
CXXFLAGS = -std=c++17
test: test.cpp
```

```c++
#include <algorithm>
#include <array>
#include <cstdio>
#include <string>

#include <termios.h>
#include <unistd.h>

int main() {
  termios originalTermios{};
  {
    tcgetattr(STDIN_FILENO, &originalTermios);
    termios t{originalTermios};
    t.c_lflag &= ~(ICANON | ECHO | ISIG);
    t.c_cc[VMIN] = 1;
    t.c_cc[VTIME] = 0;
    tcsetattr(STDOUT_FILENO, TCSAFLUSH, &t);
  }
  std::printf("\033[?1003h");
  std::printf("\033[2J");
  std::fflush(stdout);
  std::string str;
  while (true) {
    const char c = std::getchar();
    if (c == 3)
      break;
    str.push_back(c);
    if (auto pos = str.find("\x1b\x5b\x4d");
        pos != std::string::npos && str.size() - pos >= 6) {
      const int b = str.at(pos + 3);
      const int x = str.at(pos + 4) - 32;
      const int y = str.at(pos + 5) - 32;
      std::printf("\033[%d;%dH[%02x]", y, x, b);
      std::fflush(stdout);
      str.clear();
    }
  }
  tcsetattr(STDOUT_FILENO, TCSANOW, &originalTermios);
  std::printf("\033[?1003l");
}
```

ほぼ、やっている内容は同じ。
もたつきがなくなった。

## まとめ

Linuxターミナルでマウス入力が取得できた。
pythonで品質管理図を描く

# はじめに
テスト工程において品質の状況を逐一知りたいというときに「品質管理図」があれば把握できます。
品質が悪い場合、早めの対策が取れたりするのでpythonのmatplotlibを用いて描く方法を共有します。

# 準備（管理表）
* シート名：list
* カラム名は下記
*date:日付*
*not_implemented_s：テスト消化予想線*
*not_implemented_a:テスト消化線*
*bug_s：不良摘出予想線*
*bug_a：テスト消化線*

**sはschedule、aはactualの略としています。**

バグ予想の列は「ゴンペルツ曲線」を用いて算出します。（これは別途）
下記はテストデータとなります。
![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/2cf9e3d0-bd95-baca-3499-5e5e6213ac90.png)

# グラフ作成
## ライブラリインポート

```py
import openpyxl
import pandas as pd
import matplotlib.pyplot as plt
import datetime
```

## 管理表（エクセル）読み込み
```py
wb = openpyxl.load_workbook('D:\\work\\test\\test_result_table.xlsx', data_only=True)
sheet_count = wb['list']
```
## pandas.DataFrame作成
```py
def getDataframe(sheet):
    data = sheet.values
    # 最初の行をヘッダーとして取得する
    columns = next(data)[0:]
    # 以降のデータからDataFrameを作成する
    df = pd.DataFrame(data, columns=columns)
   
    return df

df_count = getDataframe(sheet_count)
```

## 描画
タイトルが文字化け（豆腐）になるときは下記をダウンロードする。
https://moji.or.jp/ipafont/ipaex00401/

下記は「IPAexゴシック」をダウンロードした例です。

```py
fig = plt.figure(figsize=(20, 20))
# フォント指定
plt.rcParams['font.family'] = 'IPAexGothic'
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ax1.plot(df_count["date"], df_count["not_implemented_s"], color="k", label="テスト消化予想線")
ax1.plot(df_count["date"], df_count["not_implemented_a"], color="r", label="テスト消化線")

ax2.plot(
    df_count["date"], df_count["bug_s"], color="k", label="不良摘出予想線", linestyle="dashed"
)
ax2.plot(
    df_count["date"], df_count["bug_a"], color="r", label="不良摘出実績線", linestyle="dashed"
)

plt.tick_params(labelsize=10)  # 目盛線ラベルのフォントサイズ

# グラフタイトルを付ける
plt.title("消化したテスト項目数と摘出したバグ数", fontsize=15)
ax1.grid(False)
ax2.grid(False)
# 凡例の表示のため、handler1と2にはグラフオブジェクトのリスト情報が入る
# label1と2には、凡例用に各labelのリスト情報が入る
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()

# 凡例をまとめて出力する
ax1.legend(
    handler1 + handler2,
    label1 + label2,
    bbox_to_anchor=(1.25, 1),
    loc="upper left",
    borderaxespad=0.0,
)
fig.autofmt_xdate(rotation=45)
ax1.set_ylim([0, 500])
ax2.set_ylim([0, 70])
ax1.set_ylabel("残存テスト項目数")
ax2.set_ylabel("不良摘出件数")
```

図示すると下記のような図になります。
予想線をちゃんとつければ評価できる図になります。
![品質管理図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/82872962-187a-6fce-0637-6c3529fd4b68.png)

# おわりに
管理表（エクセル）からpythonのmatplotlibを用いて品質管理図を図示するコードを共有しました。
図示することで意思決定がしやすくなると思います。
例えば下記のどのパターンになっているかなど。
https://monoist.itmedia.co.jp/mn/articles/1002/18/news101.html

# 参考
https://qiita.com/pbjpkas/items/e45dfed05c39518f3ad3
https://qiita.com/katuemon/items/5c4db01997ad9dc343e0
SharePoint 基本設定 チームサイト作成編

# 超基本

SharePointのチームサイトを5分で作成しよう

## SharePointのメイン画面からスタート

「+サイトの作成」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/7150d858-2737-c7ae-5d59-6901ec580a7a.png)

左側のチームサイトを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/334c1fa3-cd84-6b0d-feb8-e043e7d83d22.png)


## SharePointの基本情報を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/4108db1c-40f0-de50-261b-651cdcd4b4d8.png)


1. 「+サイトの作成」＞「新しいサイトの作成」
1. 「チームサイト」を選択
1.  サイト名等の情報を入れる
    1.  サイト名。英語小文字がおすすめです。
    1.  プライバシーの設定。デフォルトの「プライベート」がいいです。
    1.  言語の選択。「日本語」
4. 「次へ」
5. 「完了」を押して、終了。

5のところで、メンバーの追加を聞かれますがスルーして問題ないです。

## 完了

5分もかかりませんね。
ドキュメントからファイルの管理が行なえます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/890072df-d6fe-6bfe-f14d-c9f501b82d43.png)

次回は権限の追加をまとめます。
VSCode で DB を GUI 操作する MySQL Shell for VS Code が WSL2 で利用出来ない件

WSL2 上にインストールして使おうとすると、エラー発生
どうやら証明書のインストールでコケている模様

```
[31mERROR: [0mcore.installShellWebCertificate: User-defined function threw an exception: Traceback (most recent call last): File "/home/xxxxxxxx/.vscode-server/extensions/oracle.mysql-shell-for-vs-code-1.1.3-linux-x64/shell/lib/mysqlsh/plugins/gui_plugin/core/Certificates.py", line 159, in install_shell_web_certificate raise SystemError("UNABLE to find terminal!") SystemError: UNABLE to find terminal!
```

![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/bc4b62b1-b956-f41c-b2ca-a7527ccfaba0.png)



これが噂のおま OS か…と途方に暮れていましたが、github 見てみたら issue 出てました。

https://github.com/mysql/mysql-shell-plugins/issues/1

issue の内容を見ながら作業していったら無事解決したので、メモとして残します。

## 証明書を手動インストールする

下記の sh ファイルを実行する

```sh
~/.mysqlsh-gui/plugin_data/gui_plugin/web_certs/install.sh
```

これで終わりではなく、どうやら windows にも証明書をインストールする必要がある模様…

## windows 側に証明書をインストールする

### 下記ファイルを windows のエクスプローラーで表示

```
~/.mysqlsh-gui/plugin_data/gui_plugin/web_certs/rootCA.crt
```

対象ファイル rootCA.crt を右クリックして「証明書のインストール」

![mysql6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/c51c554f-bf4e-ddf4-554e-912820b47cda.png)



### 証明書のインポートウィザード1

「現在のユーザー」を選択して次へ

![mysql1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/422ab322-8727-28f6-43d5-2de78b401d08.png)


### 証明書のインポートウィザード2

「証明書を全て次のストアに配置する」を選択
証明書ストアに「信頼されたルート証明機関」を選択

![mysql2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/adfdd3b0-748a-6b2f-2c98-80d11973f309.png)


### 証明書のインポートウィザードの完了

完了をクリックして、証明書をインストール

![mysql3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/5413ecc0-63a6-8277-010e-0129e5b8a857.png)

終わったら、vs code を再起動

## MySQL Shell for VS Code

DATABASE の + をクリック

![mysql4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/53d78321-c654-cb88-2013-941cca9ac1fa.png)

Database Connection Configuration ウィンドウが表示されればOK

![mysql5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/aa0d1ca6-df3d-cf5a-a058-41cd70cebedb.png)


※僕はこれで解決しましたが、対象 issue では未だ解決出来ていないようです。
wget -i <file> を Powershell で実現する

Windows環境で大量のファイルをダウンロードしたかったが、`wget` が使えなかったので即席で対処したメモ。

# 結論
ファイル `file` にダウンロードしたいURLのリストを書いておき、下記コマンドを実行すると、カレントディレクトリにファイル名のまま保存される。
なお、1行のみのファイルではうまく動かないはず。

~~~ powershell
Get-Content file | %{ Invoke-WebRequest $_ -OutFile ( Split-Path ( New-Object System.Uri($_) ).AbsolutePath -Leaf ) }
~~~

# 解説(というか備忘録)

## Get-Content file
`file` から読み込んで、1行ずつのリスト(?)にして返す。
今回はパイプに渡しているので、次の `%{ }` に渡される。
なお、ファイルが1行のみの場合、行単位のリスト(長さ1のリスト)にはならず、
各文字で分断されてリスト化されるらしい？

## %{ }
`%{ }` は `Foreach-Object { }` のエイリアス。
リストの入力を受け付け、リストの各要素に対して、 `{ }` 内の処理を行う。
`{ }` 内では、各要素は `$_` で参照できる。(Perlみたい。)

https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-5.1

## Invoke-WebRequest
`wget` っぽいコマンドレット。というかエイリアスとして `wget` が登録されている。
`-OutFile` オプションが無いと、ファイルが保存されないっぽい。

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.2

## Split-Path ( New-Object System.Uri($_) ).AbsolutePath -Leaf
URIからファイル名の部分を抽出している。
`New-Object` で.NETオブジェクト: System.Uri を作成して、
その `AbsolutePath` 属性を `Split-Path` に渡して、最後の要素を取得するとファイル名になっている・・・というカラクリのハズ。


# 参考にしました
https://bgt-48.blogspot.com/2019/04/powershell_13.html

# 感想
パイプでオブジェクトを渡せたり、関数？プロシージャ？が第一級オブジェクトのように見えたりと、
Powershellかなりアツイんじゃないかと思った。
ちゃんと勉強したい。
API なにそれ美味しいの?　

# APIとは
APIは「<font color="red">A</font>pplication <font color="red">P</font>rogramming <font color="red">I</font>nterface」の略で、OSやソフトウェアが管理する一部の機能を外部のプログラムやアプリケーションから利用できるようにした仕組みのこと。

ユーザがWebサービスを利用する際にAPIの存在を意識する事はあまりないが、実際には幅広く使用されている。
また、APIの中でもHTTP・HTTPS通信によってやりとりされる<font color="blue">Web API</font>が主流として使われている

## 身近なWeb APIの使用例
- Google Maps API
個人経営店のホームページ上に店舗の地図情報(GoogleMap)を記載出来る。
- Youtube API
自身で作成したブログで特定の動画をそのまま再生が出来る。
- Yahoo! API
検索エンジンとして使われているYahho!のサイト内で、検索、天気、地図、オークション、ショッピング全てにAPIが使用されている。

## APIを利用するメリット
・既存のAPIを利用する事により、開発時間とコストが削減できる。
・1から作るよりセキュリティ性の向上が期待できる。
・利用者に高度な専門技術がなくても開発に取り掛かり易い。

## APIを使うデメリット
・API提供側への依存度が高い為、提供が終了した際は不具合が生じる可能性がある。
・基本的なHTML,CSSなどを理解している必要がある。

## 使用上の注意
・<font color="red">APIキー（アクセスキー）</font>は、ログインIDみたいなもので、<font color="blue">APIシークレット</font>はパスワードのようなものなので、この２つは部外者に絶対教えてはいけない。

## 参照
https://data.wingarc.com/what-is-api-16084
https://www.sbbit.jp/article/cont1/62752#head1
https://www.acrovision.jp/career/?p=2922
https://www.videor.co.jp/digestplus/market/2019/01/12832.html
https://techtarget.itmedia.co.jp/tt/news/1806/13/news01.html
https://www.jbat.co.jp/dx_blog_5/
https://itpropartners.com/blog/8550/
https://www.rakurakumeisai.jp/column/efficiency/191011.php
【React】レンダリングの仕組み・ライフサイクル関数（Render Phase → Commit Phase）

# まえがき
Reactのレンダリングは２つのフェーズがあることを最近知ったので、そのまとめ記事。
下記の記事が分かりやすかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/65ced243-a77f-c6a1-9f14-02fe9d94d3b7.png)

https://dev.to/spukas/react-work-phases-4eaj

# レンダリングの流れ
・state, propsが変更される。
　↓
　↓（変更されたので画面を作り直す）
　↓
・propsに変更があった画面のrender()を実行＝変更**後**の仮想DOMを生成する。
　↓
・変更**前**の仮想DOMと変更**後**の仮想DOMを比較し、実DOMに反映すべき箇所を特定
　↓
・実DOMに反映する

# ↑のレンダリングは2段階に分かれる
・state, propsが変更される。
　↓
　↓（変更されたので画面を作り直す）
　↓
・propsに変更があった画面のrender()を実行＝変更**後**の仮想DOMを生成する。【**render phase**】
　↓
・変更**前**の仮想DOMと変更**後**の仮想DOMを比較し、実DOMに反映すべき箇所を特定
　↓
・実DOMに反映する【**commit phase**】

# render phase
・変更**後**のDOMを生成するために各画面のrender()を実行するフェーズ。
・下記のライフサイクル関数が実行される。
・レンダリングするために**複数回実行されうるもの。**
　→ 故に↓のライフサイクル関数内には、**複数回実行されても大丈夫な処理**（**副作用でない処理**）を定義する。
```
componentWillMount
componentWillReceiveProps
componentWillUpdate
getDerivedStateFromProps
shouldComponentUpdate
```

# commit phase
・実DOMを変更するフェーズ。
・下記のライフ関数が実行される。
・実DOMへの変更は1回で行うので、下記のライフサイクル関数は**1回だけ実行される**。
　→ **副作用の処理**（**DOMの書き換え、変数代入、API通信などUI構築以外の処理**）はここに書け👍
・**副作用＝状態を変更する処理**
```
componentDidMount
componentDidUpdate
componentWillUnmount
componentDidCatch
```

# 関数コンポーネントで使うuseEffect関数はどのライフサイクル関数に紐づく？
・commit phaseの以下３つに紐づく。
```
componentDidMount（useEffect）
componentDidUpdate（useEffect）
componentWillUnmount（useEffect）
componentDidCatch
```

https://qiita.com/seira/items/e62890f11e91f6b9653f

# まとめ
・レンダリング(Rendering Phase)中に、副作用とされる処理（状態を変えるもの）は呼び出してはいけない。
　→ <font color="red">レンダリングは何回呼びだされても同じものを返す処理であるべきだから。</font>
　　<font color="blue">副作用の代表例であるAPIなんかは、渡すパラメータによっては結果が変わるようなもの。</font>

・結局Effectとは？
　→ レンダリング時に呼び出される副作用の処理を定義できるもの。

> Effects let you specify side effects that are caused by rendering itself, rather than by a particular event. [引用元](https://beta.reactjs.org/learn/synchronizing-with-effects#what-are-effects-and-how-are-they-different-from-events)



# その他

## React.memo
npm run build でビルドする際にwarnings when minifying css: ▲ [WARNING] "@charset" must be the first rule in the fileのエラーが出てしまう時の解決法

# ビルド（npm run build）とは？
npm run buildとは、作成したVueアプリケーションをコンパイルし、サーバーアップロード（本番環境）向けにファイルサイズを小さくしたものを生成するコマンドです。
npm run buildコマンドを実行すると、同じ階層に **dist** というフォルダが生成されるので、このフォルダをそのままサーバーにアップロードするだけでアプリケーションを実行することができます。
このように、本番環境用のフォルダを生成することを **ビルド** といいます。
今回はビルドツールに**Vite**を使用しています。
・[Vite日本語ガイド](https://ja.vitejs.dev/guide/)
・[Viteとは何なのか](https://qiita.com/inagacky/items/ad424821653067c99253)

# npm run build 実行時のエラー
npm run buildを実行したところ、下記のようなエラーが出ました。
```
warnings when minifying css:
▲ [WARNING] "@charset" must be the first rule in the file

    <stdin>:60:1:
      60 │ }@charset "UTF-8";
         ╵  ~~~~~~~~

  This rule cannot come before a "@charset" rule
```

意訳すると、下記のようになります。
**①when minifying css
＝　cssをminify（縮小）するとき、**
**②"@charset" must be the first rule in the file
＝　charset（文字コード）の指定は初めに行わなくてはなりません。**
**③@charset "UTF-8"; This rule cannot come before a "@charset" rule
＝　@charset "UTF-8";の表記は、charsetルール指定前に記載してはいけません。**

CSSをコンパイルしている際にエラーが発生していることが分かるので、実行しているメソッドを確認します。
```json:package.json
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview",
  },
```
npm run buildにより、"vue-tsc --noEmit" と "vite build"の２点が実行されていることが分かります。
このうち、**vite build**が怪しいため、**node_modules**を見に行きます。
findコマンドを用いて、**「minifyCSSメソッド」** の書かれている場所を見に行きます。
```console:console
$ pwd
中略/node_modules
$ find ./* -type f | xargs grep "minifyCSS"
./vite/dist/node/chunks/dep-9c153816.js:                        ? `export default ${JSON.stringify(inlined ? await minifyCSS(css, config) : css)}`
./vite/dist/node/chunks/dep-9c153816.js:                    css = await minifyCSS(css, config);
./vite/dist/node/chunks/dep-9c153816.js:                    extractedCss = await minifyCSS(extractedCss, config);
./vite/dist/node/chunks/dep-9c153816.js:async function minifyCSS(css, config) {
```
**./vite/dist/node/chunks/dep-9c153816.js**を見に行き、コードを加筆します。

```js:dep-9c153816.js
async function minifyCSS(css, config) {
    css = css.replace(/@charset "UTF-8";/ig,'') // 加筆部分
    const { code, warnings } = await esbuild.transform(css, {
        loader: 'css',
        minify: true,
        target: config.build.cssTarget || undefined
    });
    if (warnings.length) {
        const msgs = await esbuild.formatMessages(warnings, { kind: 'warning' });
        config.logger.warn(colors$1.yellow(`warnings when minifying css:\n${msgs.join('\n')}`));
    }
    return code;
}
```

再び npm run buildを実行します。
```console:console
$ npm run build
> vue-app@0.0.0 build
> vue-tsc --noEmit && vite build

vite v2.8.6 building for production...
✓ 33 modules transformed.
dist/index.html                  0.50 KiB
dist/assets/index.41eeb2fe.js    6.67 KiB / gzip: 3.05 KiB
dist/assets/index.80eef061.css   1.59 KiB / gzip: 0.57 KiB
dist/assets/vendor.b426b39f.js   75.08 KiB / gzip: 29.78 KiB
```
無事にビルドされました。
Rubyとは？今流行のプログラミング言語の一種Rubyって何？これであなたもプログラミングへの第1歩！

こんにちは！初めまして！現在都内大学3年生になります、重村　倫音と申します。
今回は私が大学2年生の秋学期のうち３ヶ月間で習得したruby言語について簡単に初心者さんにもrubyが何なのかという説明記事を書いてみましたのでぜひ読んでみてください！

まず最初に、Rubyという言語はまつもとゆきひろ氏が関数型プログラミングと命令型プログラミングを絶妙にまじ合わせて作成したものであります。その為、様々な面でバランスが取れていて、次に説明するRubyのいいところに繋がるのです。

Rubyというのは、数多くあるうちのプログラミング言語の一種です。主に多くの人に知られているウェブサイト、twitterやcookpadと言ったウェブサービスはrubyを通して作られています。数多く存在するプログラミング言語の中でも、rubyは利用者数がかなり多いです。その人気というのも、

-シンプル
-起動の速さ

という二つの観点が主に挙げられます。

最初にシンプルという観点でプログラミング初心者さんでも簡単に自分のウェブページが作れてしまうところなんです！私自身、プログラミングのプの字も知らずにrubyの言語習得に挑んでみたのですが、ruby on railsというコマンドを打つだけで大枠を自動生成できる機能があるフレームワークにより、本来とても複雑になっている作業が自分でコードの中に数回コマンドを入力するだけで自身の作りたいウェブサイトの大枠が作り上げられてしまいます。

次に、起動の速さというのも、先ほど挙げたruby on rails のフレームワークにより作業効率が速くなるのはもちろん、ヴァージョンアップのサイクルが早いことから、常に動きが速いというのが特徴的です。作業が早くなることで、自身の作りたいウェブサイトもあっという間に作り上げられちゃいます！

さらに詳しく説明すると、ruby on rails を使用して、ユーザーが求めているウェブサイトを表示していくというのが主な役割であり、そのフレームの中でもMVCという、
Model-　データベースとのやり取りの仲介役
View-　パソコンの画面に映すすページそのもの
Controller-　どのモデルを使うか、どのビューを使うか決める。
この３つの枠組みを活用しています。

さらに細かくそれぞれの役割を説明していくと、

１；まず最初にユーザーからユーザーの求めるウェブのURLが届く
２；次に送られたURLを元にルーティング作業という先ほどあげたMVCそれぞれにどの役割をしてもらうのか役割分担のようなものをします。
３；ルーティング作業の後、それぞれのURLにcontrollerにどのようなactionが行われるかが示されています。
４；controller が残りのModelとViewにどのような作業をするのかというのを命令します。
５；Controller に命令されたModelはData Baseという情報の倉庫のようなところから情報を持ってきます。
６；持ってこられた情報を元にViewがウェブページに映し出すことで、ユーザーは求めたURLのページを獲得することができるのです。

これらがざっくりとしたruby on rails の役割とどのような働きをするかというものであります。

このような理由から、私のようなプログラミングなどの初心者さんでも簡単にrubyというプログラミング言語を習得できて、使いこなすことができちゃうのでぜひ使ってみてください！
【備忘】4月に入ったので考えたことメモ(2022/04)


# 初めに

転職して半年以上が経ち、4月に入りキリも良いので、ちょっと気軽にテーマを特に決めずに色々考えたことメモ。

白紙にメモり散らかした結果、大きく「自分がやりたいこと」と「今解決策はよくわかってないけどこうなったらいいな、ということ」に分けられました。

## 自分がやりたいこと

### 社内Backlogに自己紹介Wikiの追加

現職には昨年の7月に入社しました。後から入って来られた方が僕に「お前誰やねん」と感じることも多くなると思うので、自分のパーソナリティを示せるものを置いときたいですね。

↓自分のWantedlyページ

https://www.wantedly.com/id/yamane__masahiro

### BacklogWikiの最新化

「この情報誰がみてるんや？」とか「そもそも間違ってない？」みたいな情報を常に最新化しておきたい。
Wikiが図書館だとしたら、司書さんみたいな立ち位置に立ちたい。

### DDD設計~実装を自分でやってみたい

ある機能を想定して(小さいものでも良い)こういうのがしたい。

https://poppingcarp.com/backend-engineer-summary/

実務でもDDD取り入れ始めてますが、「モデリングする」「モデリングから実装に落とす」「テストを書く」を一人で回してみたい。

### 他の畑のエンジニアの仕事を見たい

(機会があれば、みたいなノリ）
社内でモブプロをする機会があり、その際にビジネスサイドの方を呼んだら「エンジニアがコーディングする際の思考とか手順とかがわかって興味深かった」みたいなコメントをもらいました。

エンジニア内部でも知見の共有ってできたらええなぁと思っております。

### 勉強会復活

一時期やってたのですが、ネタの枯渇とスケジュールの都合で無くなってしまいました。
半年もいるしそれなりに喋れることが増えた気もするので、何か考えても良いかもな...

自分が話せるネタ候補
* AzurePipeline(ymlの中身)
* Jmeter使った負荷試験実演

### AWS DevOps Professionalのお勉強

DevOpsとかCICDとかめっちゃ楽しいことに気づいたので、AWSのCICD周りに詳しい人になろうと思いました。

### 保守運用の効率化

リリースが頻繁になった際に、なるべく属人化させない形で回していきたい

## 周りにやってほしいこと（組織的な話も含めて）

### 定期的な仕事のフィードバックが欲しい

ベンチャーだから仕方ないのかもですが、現場も上司もめちゃ忙しそうで、「気軽に1on1してくれや」と言おうにもどこにそんな予定あんねんといった状況です。

これどうしたらいいんだろうな...(解決策は特になし)

また、定期的な1on1とは別に、半期ごとに定めているOKRの進捗報告・方針修正みたいなのも細かくやりたい。

# 終わりに

めっちゃやることあるやん。
頑張ります。
OCI ADBのDatabase Actionsを利用して、テーブルの作成とデータロードをしよう

# 事前準備
データロードするExcel or CSVファイル
# 手順
１．Autonomous Databaseとは
２．Autonomous DatabaseのDatabase Actionsとは
３．SQL文を書かずに、テーブルの作成とデータロードをしよう
## １．Autonomous Databaseとは

https://www.oracle.com/jp/autonomous-database/

https://speakerdeck.com/oracle4engineer/adb-s-technical-detail-jp
## ２．Autonomous DatabaseのDatabase Actionsとは

https://speakerdeck.com/oracle4engineer/autonomous-database-database-actions-ji-neng-gai-yao
## ３．SQL文を書かずに、テーブルの作成とデータロードをしよう
①  ADBのDatabase Actionsへログイン。
ログイン方法は、以下のブログを参照

:::note info
「３．SQL文を書かずに、DBユーザを作成しよう」の①~⑤、⑬～⑮を参照
:::

https://qiita.com/heanzza/items/42e5f38f4358b21b7a34

② 「データ・ツール」の「データ・ロード」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/3815d604-54c4-09a8-d4e4-62bc7057e2c2.png)

③ 「データのロード」✓、「ローカル・ファイル」✓し、「次」へをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/2e85831c-7552-a9a0-476a-4b977b033a46.png)
④ Excel or CSVファイルを画面にドラッグ・アンド・ドロップする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/6d313573-da14-adb0-07fa-a010db2a4b8f.png)
④ Excelの場合、複数シートがある場合は、シートごとにソースとして表示される（今回は3つのWorksheetがあるExcelをドラッグ・アンド・ドロップした）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/658ad7a8-51b3-25be-fb75-8d5961fe96e6.png)
⑤ ソースの右側の鉛筆マークをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/780ecc2b-b313-7ad2-6d46-b762c389a244.png)
⑥ 「設定」タブ

:::note info
表のオプション：表の作成
名前(テーブル名)：Orders
マッピング枠のソース列、ターゲット列、データ型等確認
:::

「閉じる」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/21d84a7d-52a6-d60c-87fc-3f03c52f509f.png)
⑦ ターゲットが設定した名前に変更されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/c56814ad-c72b-bb04-e351-7ad0dbb4bf35.png)

⑧ 他のソースも同様に設定
⑨ 緑の「開始」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/3e5c2922-27e7-4b67-0ee1-c6f22f724601.png)
⑩ 「実行」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/77b2f3d7-48e3-d966-9315-887f4b758479.png)
⑪ テーブルの作成とデータロードが完了した。「完了」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/4fc9ac7f-81b6-30c2-5598-fde4af790f87.png)
⑫ テーブルとデータがロードされてることを確認。Database Actionsのホーム画面から「SQL」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/f6349643-888b-db1f-2c1a-627bfebf0e80.png)
⑬ 作成したテーブルが表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/8c2975ed-229a-403b-3c26-e3ca39ed601f.png)
⑭ SQL文を実行してデータが入っていることを確認
`select *from orders;`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/fd5f099c-eadb-60fb-9dd8-2d0aa1cc2f7a.png)
Reactの学習記録②

## コンポーネント作成時の留意事項（親・子）
- 子コンポーネントではexportを記述する
- propsは親から子にデータを渡す

```React
// 親
title = {'あいう'}
content = {'えお'}

// 子
{props.title} //あいう
{props.content} //えお
```
上記のように呼び出せる。

## propsで受け渡せるデータ
- propsのデータは{}に記述
- 文字列、数値、真偽値、オブジェクト、日付などなんでもOK
- 変数を渡すことも可能
- 文字列は{}なしでもOK
Vim/NeoVimでPrettierを利用する

Vim/NeoVim で保存時に Prettier を適用する手順です。[CoC](https://github.com/neoclide/coc.nvim)を使っているものとします。

## 事前準備

Prettier をプロジェクトにインストールしていない場合、インストールしておきます。

```sh
npm install --save-dev --save-exact prettier
```

また、必要に応じて`.prettierrc.json`や`.prettierignore`の作成や設定をします。（割愛）

## CoC 用 Prettier プラグインのインストール

```
:CocInstall coc-prettier
```

## 保存時に Prettier 適用 (Format on Save)

```
:CocConfig
```

設定を追加位します。配列内に Prettier を適用したい言語を記述します。

```json
{
    略
  "coc.preferences.formatOnSaveFiletypes": [
    "css",
    "html",
    "markdown",
    "typescriptreact",
    "typescript",
    "javascriptreact",
    "javascript",
    "json",
    "graphql"
  ]
}
```

あとは対象のファイルを開いて保存するだけです。

コマンドでPrettierを適用する方法もありますが、保存時に適用ができればまず使わないので気にしなくて問題ないです。

以上
【Twitter】画像付きツイートのリンク作成

## 環境
ブラウザ：Google Chrome
Twitter：PC, Android


## 1. 載せる画像を公開アカウントでツイート
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/af8af254-2906-fc37-7d11-214d28400474.png" width="450">

## 2. ページソースから画像URLを取得
ツイートページで右クリック→「検証」をクリック→「Ctrl+F」で検索窓を開き `<ti` まで打つと以下のようなコードがヒットする。`https://t.co/xxxx` が画像URLである。（`t.co/xxxx`だけでも良い）
```html
<title>[アカウント名]さんはTwitterを使っています: 「[ツイート内容] https://t.co/xxxx」 / Twitter</title>
```

## 3. ツイート文作成
```:例
ツイートです。 https://xxx.html ← URLを入れてもok
#テスト #ツイート
https://t.co/xxxx
```

## 4. ツイート内容をURLエンコード
このようなサイトでツイート文をURLエンコードする。

https://so-zou.jp/web-app/text/encode-decode/

## 5. ツイートリンク完成
`https://twitter.com/intent/tweet?text=[エンコードしたツイート文]` がツイートリンクとなる。リンクを開くと、このようにツイート画面が表示される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/129d94c4-684c-7a28-c8af-fd0b0b732ebc.png" width="450">
<p>ツイートすると、画像が正しく表示された。</p>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/76a5005c-c9c4-fba5-648a-15484d9b9dde.png" width="450"><br>

## 注意
~~ちなみに、ツイート文にURLを含んでいてもサムネイル（OGP画像）ではなく指定した画像が表示されることが確認できた。~~ 
PC版ではツイート文にURLを含んでいてもサムネイル（OGP画像）ではなく指定した画像が表示されたが、Android版ではサムネイルを消してからツイートしないとサムネイルが優先されて表示されてしまった。
また、画像URLの後にテキストを入れると、画像URLがツイートに残ることが確認できた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/69233918-fcc9-1c58-ad51-625f91265932.png" width="450">

## 参考
https://tanakama.jp/blog/images-tweet.html
【Rails】To avoid mistakes, drop_table is only reversible if given options or a block (can be empty).エラーの対処法

# やりたいこと
```#　rails db:migrate:down VERSION=20220404233925```
で指定したマイグレーションファイルをdownさせたい
→最終的にはマイグレーションファイルを削除したい


# エラー内容
```
# rails db:migrate:down VERSION=20220404233925
== 20220404233925 Masters: reverting ==========================================
rails aborted!
StandardError: An error has occurred, all later migrations canceled:



To avoid mistakes, drop_table is only reversible if given options or a block (can be empty).

（省略）
```


# 調査
https://prograshi.com/framework/rails/rollback_drop-table_error/#toc1
↑の記事がめちゃくちゃ役に立ちました


# 原因
drop_tableでテーブルを削除するにあたって、ブロック形式を使わないとエラーになるそうです。
ブロック形式を使うという指定は、エラー文の中に記述してあります。↓
```To avoid mistakes, drop_table is only reversible if given options or a block (can be empty).```


# 解決策
マイグレーションファイルをブロック形式で書く必要があります。テーブルを使う予定がないので、カラムと型は指定しません。
```20220404233925_masters.rb
class Masters < ActiveRecord::Migration[6.0]
  def change
    drop_table :masters
  end
end
```
↓少し変えただけです。

```20220404233925_masters.rb
class Masters < ActiveRecord::Migration[6.0]
  def change
    drop_table :masters do
    end
  end
end
```
**結果**
```
# rails db:migrate:status 
database: movie_review_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220404025856  Devise create admin users
   up     20220404025949  Create active admin comments
   up     20220404054303  Create movies
   up     20220404125722  Create users
   up     20220404130523  Create genres
  down    20220404233925  Masters
```
無事にdownさせることができました。

<br>

※その後の ```# rm db/migrate/20220404233925_masters.rb``` でマイグレーションファイルを削除できました！



# 参考




開発環境
mac OS バージョン11.6
エディタ
VScode
秀スクリプトを楽にビルドして実行する方法

# 3行で説明
- [秀スクリプト](https://blog.tokumaru.org/2017/08/hidescript.html)、面白そうですよね。
- 秀丸で秀スクリプトを開いて（書いて）F5を押したら、自動でビルドして実行までしてくれると楽なこともあるかもしれません。
- というわけで秀丸マクロを書きました。

```ts:hidescript_build_and_run.mac
/*
秀スクリプト ビルド & 実行
機能
  秀スクリプトを秀丸マクロにトランスパイルのち、
  秀スクリプトのあるディレクトリに移動し、
  秀丸マクロを実行します
前提
  hs.macと、当ファイルは、macro/ 直下に配置すること
*/

disabledraw; // 高速化用
$firstMacroDir=currentmacrodirectory;
$hsDir=directory;

// ファイル名から主ファイル名（拡張子を含まない）を得る
$hsBase=basename;
#pIndex=strstr($hsBase, ".");
$hsNode=leftstr($hsBase, #pIndex);

// 現在位置を保存する
#x = x; // hs.macによるカーソル強制移動から復帰する用
#y = y;

// 秀スクリプトファイルをトランスパイルし、トランスパイル結果（秀丸マクロファイル）を得る
execmacro "hs.mac";

// トランスパイル結果を移動する：
//    当マクロのあるディレクトリ（macro/直下を想定）から、マクロ実行時に開いていたファイルのディレクトリへ
runsync2 "cmd /c move " + $firstMacroDir + "\\" + $hsNode + ".mac" + " " + $hsDir + "\\" + $hsNode + ".mac";

// トランスパイル結果を閉じる
$macDir=directory;
setactivehidemaru findhidemaru($hsDir + "\\" + $hsNode + ".hs");
closehidemaru findhidemaru($macDir + "\\" + $hsNode + ".mac");

// トランスパイル結果を実行する
escape; // hs.macによる範囲選択を解除する用
moveto #x, #y; // hs.macによるカーソル強制移動から復帰する用
execmacro directory + "\\" + $hsNode + ".mac";
```

上記マクロを秀丸マクロのディレクトリ直下に配置して、
以下のようなマクロをF5キーに割り当てればOKです。

```ts:F5.mac
if (filetype == ".hs") {
  execmacro currentmacrodirectory + "\\hidescript_build_and_run.mac";
  endmacro;
}
```

# 特徴
- `macro/hidescript/` のようなディレクトリに秀スクリプトファイルを配置しても動きます。

# 使用上の注意
- 例えば `selectall(); insert(""); save();` のような、編集中テキストを書き換えて保存する可能性があるスクリプトを書く場合は、このマクロのかわりに別のものを使うことを推奨します。
    - なぜなら、`selectall(); insert(""); save();` を実行した場合、`書いたスクリプト自身を全消去して保存する`ことになるためです。短いマクロであればアンドゥでなんとかなるかもしれません。
Raspberry pi でVNCの解像度を上げる方法

# ”Cannot currently show the desktop”への対応の仕方

RaspberryPiをHDMIケーブルでモニター出力している場合は、VNCで接続したPCでも同じ解像度で画面を見る事が出来るのですが、それではVNCの意味がないという事で、HDMI接続無しにすると、`Cannot currently show the desktop`と小さく表示されて、何も映らない。

これは、`/boot/config.txt`を次のように修正することで、解決できました。

    # uncomment if hdmi display is not detected and composite is being output
    # hdmi_force_hotplug=1

この部分を、

    # uncomment if hdmi display is not detected and composite is being output
    hdmi_force_hotplug=1

このように、コメントアウトするだけで解決しました。

しかし、解像度が1024×768で、狭い。

# 1024×768との闘い
VNC解像度は、config.txtをどういじっても大きくする事はできませんでした。諦めてそのまま使っていたのですが、libcameraを使ってみようと、一時Legacy Cameraサポートをオフにして、再起動したところ、何とVNC解像度が1920×1080と、ヘッドレス解像度で設定していた値になりました。

つまり、Legacy Cameraのサポートで、VNC解像度が犠牲になっていたものと思われます。同様の悩みを抱えた方への情報提供ということで、記事を書いてみました。
Webサイトにツイートボタンを配置する方法

「Webサイトに共有ボタンを配置する」はシリーズになっています。

- ツイートボタン　__←イマココ__
- [はてなブックマークボタン](https://qiita.com/uhooi/items/814150e751f995f24e1a)

## はじめに

Webサイトにツイートボタンを配置する方法を紹介します。

## ツイートボタンのHTML

ツイートボタンのHTMLを配置するのみです。

例

```html
<a href="https://twitter.com/intent/tweet? \
  text=001%202022-04-04%20%7C%20iOS%20Osushi%F0%9F%8D%A3& \
  url=https://ios-osushi.github.io/posts/001-20220404& \
  hashtags=ios_osushi& \
  via=ios_osushi"
  class="twitter-share-button">
  ツイート
</a>
<script async src="https://platform.twitter.com/widgets.js">
```

このHTMLをWebサイトに表示すると、以下のボタンが表示されます。
ボタンを押下すると、Twitterのツイート画面が開き、以下のように文言が表示されます。

|ツイートボタン|ツイート|
|:--:|:--:|
|![スクリーンショット 2022-04-06 11.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/f6a89415-1527-ccf3-2296-3c89590fe48f.png)|![スクリーンショット 2022-04-05 21.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/ec0121c1-307f-4e9d-2381-245bc080fbc7.png)|

`class="twitter-share-button"` を付けることで `widgets.js` がツイートボタンと認識し、ボタンが表示されます。
`<a>...</a>` タグで括った文字列は基本的に表示されませんが、ボタンの表示が遅い場合に一瞬だけ表示されることがあります。

## クエリストリング一覧

`https://twitter.com/intent/tweet` のクエリストリングを紹介します。

クエリストリングはすべて任意であり、付ける場合はURLエンコードすべきです。

|パラメーター|説明|例|
|:--|:--|:--|
| `text` |ツイートのテキスト| `001%202022-04-04%20%7C%20iOS%20Osushi%F0%9F%8D%A3` |
| `url` |ツイートに含めるURL| `https://ios-osushi.github.io/posts/001-20220404` |
| `hashtags` |ハッシュタグ。複数ある場合はカンマで区切る| `ios_osushi` |
| `via` |ツイートのソースとなるTwitterのユーザー名| `ios_osushi` |
| `related` |共有URIの内容に関連するアカウント。複数ある場合はカンマで区切る| `twitterapi,twitter` |

`related` のみ、どこに反映されるのかわかりません。
わかる方がいたら教えていただけると嬉しいです。

## JSの読み込み

`widgets.js` を非同期で読み込むのみです。

## おわりに

これでWebサイトにツイートボタンを配置できました！

## 参考リンク

- [Guides | Docs | Twitter Developer Platform](https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/overview)
- [Parameter reference | Docs | Twitter Developer Platform](https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/guides/parameter-reference1)
- [Set up Twitter for Websites | Docs | Twitter Developer Platform](https://developer.twitter.com/en/docs/twitter-for-websites/javascript-api/guides/set-up-twitter-for-websites)
- [Twitter Publish](https://publish.twitter.com/#)
- [ツイートボタンを設置する by uhooi · Pull Request #24 · ios-osushi/website](https://github.com/ios-osushi/website/pull/24)
python 配列を作る

## はじめに
pythonの配列について学ぶ
### 教科書
https://docs.python.org/ja/3.9/tutorial/introduction.html
## ゴール
pythonで配列を作る。作った配列から文字を抜き出す
## 実施内容
```python:配列を作る
>>> squeres = [1,3,5,7,9]
>>> squares
```
`[1,3,5,7,9]`と出力される

```python:配列の一番左の値を抜き取る
>>> squares[0]
```
0が一番左の数値を抜き取る
```python:配列に配列を足す
>>> squares + ['a','b','c','d']
```
`[1,3,5,7,9,'a','b','c','d']`と出力される

### メモ
文字を配列に入れるときは''で囲む。忘れない
量子コンピュータでビジネスはどう変わる？

# 量子コンピュータとは
`量子コンピュータとは量子力学特有の「量子重ね合わせ」や「量子もつれ」といった物質状態を積極的に用いて、高速計算を実現するコンピュータのことです。`
※量子力学とは原子・電子など非常に小さなものの動きを説明するために発展した理論のことです。

もう少し詳しく説明すると、従来のコンピュータは0と1を表現するための素子としてトランジスタを使用していました。しかし、量子コンピュータではトランジスタの代わりに超伝導量子ビットを使用します。
トランジスタでは各素子が0か1のどちらかの状態になりますが、超伝導量子ビットでは同時に0と1の状態を持ちます。



# 量子コンピュータでビジネスがどう変わる？
量子コンピュータを使用すれば高速な計算が可能になりますが、どんな計算に対しても強いわけではありません。
量子コンピュータは特に __組み合わせ数が膨大__ な問題の解決に向いています。

### ■量子コンピュータ×機械学習
機械学習を使用することで来月の売り上げや、来月の貨物量といった予測ができます。しかし、予測だけでは意味がありません。この予測から「どの店舗にどれだけ在庫を蓄えておくか」「価格はいくらにするか」「販売員は何人必要か」ということをシミュレーションする必要があります。
しかし実際にシミュレーションするには多種多様な要因を考慮する必要があります。すなわち計算で扱う変数が膨大になり、古典コンピュータ(量子コンピュータではない従来のコンピュータ)では解くことが難しくなってしまいます。そこで、量子コンピュータを使用すれば膨大な変数を扱う問題も解けるようになります。

### ■量子コンピュータ×創薬
創薬(薬をつくること)には、分子シュミレーションといって分子内の粒子の相互作用をモデル化することで、特定の疾患を撃退する構造を作り出す必要があります。
簡単に言うと、無限大にある分子の組み合わせパターンから最適な組み合わせを見つける必要があります。
もしも、古典コンピュータで計算する場合には、分子が70個しかない場合でも最大 __約130億年__ かかると言われています。
しかし、量子コンピュータを使用すれば、これを __数分で解決できる__ 可能性があると言われています。


# 終わりに
機械学習と創薬をテーマに量子コンピュータがどう活用されるのかとう言うことを紹介しました。文章から感じられたかもしれませんが、量子コンピュータはまだまだ未知の領域であり、ビジネスとして実用化されているのはごくわずかです。
それにもかかわらず、世界的に量子コンピュータに対する期待は高まっています。例えば日本では、2019年度の関連予算が約160億円だったのに対し、量子技術イノベーション戦略の策定後には、同年度の補正予算と2020年度予算を合わせて約330億円を確保。さらに1年後は、2020年度の補正予算と2021年度の予算で合計約352億円を計上しました。
これからの技術の進化には量子コンピュータが必要不可欠となってくるでしょう。

最後までお付き合い下さりありがとうございました。
Redshift Data APIを使ってS3のJSONデータを取り込む

Redshiftへ取り込みたいデータがWeb APIでしか提供されていない場合にLambdaでAPIを叩いて取得したデータをRedshiftに取り込むということになると思います。今回はそのような実装したので紹介します。細い説明は省きます。

#### 1. Redshiftのデータベースとテーブルを作成する
#### 2. LambdaでRedshift Data APIを使ってS3にあるJSONデータをRedshiftに取り込む

今回のアーキテクチャは以下の通りです

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/0246bc2f-22c9-3c6d-f090-4a6eb4758551.png" width="70%">

# IAM周りのセットアップ

#### 1. LambdaのIAMロールに「AmazonRedshiftFullAccess」ポリシーをアタッチする

#### 2. Redshift用のIAMロールを作成 &  「AmazonS3ReadOnlyAccess」をポリシーをアタッチする

![スクリーンショット 2022-04-05 22.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/a2415d4f-9893-4a6a-a489-3971c5d81f2c.png)


![スクリーンショット 2022-04-05 22.07.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/90f59d41-b2b6-5c84-623f-2f6a3bae8b99.png)

![スクリーンショット 2022-04-05 22.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/0445ce40-dfb3-5ce7-6358-0be8280e9eae.png)

#### 3. 作成したIAMロールを割り当てる

![スクリーンショット 2022-04-05 22.16.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/34b5f44f-3e32-e70f-c805-589d1f9c1ef9.png)

# コードの実装

Redshift Data APIを使ってRedshiftのデータに簡単にアクセスできます。COPYコマンドを実行し、S3のJSONファイルに記述されているデータをRedshiftに取り込みます。転送元のファイルの書き方をコツがあって以下の記事を参考にしました　↓↓↓

https://dev.classmethod.jp/articles/amazon-redshift-copy-json-format-data/

```python
import json
import boto3
import time

CLUSTER_NAME='redshift-cluster-1'
DATABASE_NAME='json_database'
DB_USER='awsuser'

sql="COPY public.users FROM 's3://s3-backet-redshift/test_2022-04-04-16-24-56.json' " + \
        "iam_role 'arn:aws:iam::009554248005:role/RedshiftAccessS3' " + \
        "FORMAT AS JSON 'auto' " + \
        "REGION AS 'ap-northeast-1';"

client = boto3.client('redshift-data')

def lambda_handler(event, context):
    result = client.execute_statement(
        ClusterIdentifier=CLUSTER_NAME,
        Database=DATABASE_NAME,
        DbUser=DB_USER,
        Sql=sql,
    )
    # 実行IDを取得
    id = result['Id']
    # クエリが終わるのを待つ & フラグ管理
    statement = ''
    status = ''
    # ステータスが変わるまで無限ループ
    while status != 'FINISHED' and status != 'FAILED' and status != 'ABORTED':
        statement = client.describe_statement(Id=id)
        status = statement['Status']
        print("Status:", status)
        time.sleep(1)
    # 成功したら Status: FINISHED　と出力される
    print("Status:", status)
```

## 参考文献

https://github.com/aws-samples/getting-started-with-amazon-redshift-data-api/blob/main/quick-start/python/RedShiftDataAPI.py

https://aws.amazon.com/jp/blogs/big-data/using-the-amazon-redshift-data-api-to-interact-with-amazon-redshift-clusters/

https://dev.classmethod.jp/articles/amazon-redshift-copy-json-format-data/

https://dev.classmethod.jp/articles/redshift-data-api-response-pattern/

https://dev.classmethod.jp/articles/redshift-data-integration-services/
【備忘録】Django __str__ returned non-string (type int)エラーについて

# 経緯
Django admin画面よりDBデータを削除しようとした際にタイトルのエラーが発生。
少しハマったため備忘録として残しておく。

# 対応した内容
models.pyを確認する。
~~~python:models.py
class Test(models.Model):
    history_id = models.ForeignKey(Billing, verbose_name="請求書番号")
    number = models.IntegerField(verbose_name="数値")
    def __str__(self):
        return self.number
~~~
注目するのはreturn～部分。returnで返した値をDjango admin画面で使用する。
ここでinteger型を使用していたためにタイトルのエラーが発生していたよう。
なので、下記に変更したことで解消された。
~~~python:models.py
    def __str__(self):
        return str(self.number )
~~~
サーバレスとは

# サーバレスとは
サーバレスとは、言葉だけ聞くとサーバが無くなると思いがちだが、そうではない。
サーバレスとは、サーバの管理をユーザが意識することなく開発を行えるサービスのことである。
3つの特徴があり、1つは、開発者がOSやネットワークの設定などのインフラ周りを気にすることなくプログラムをデプロイするだけでサービスを動作させることができることだ。
2つ目は、自動でスケールアップ、ダウンをしてくれること、3つ目は、使用量に応じて課金制度があることだ。
現在のサービスの多くは、通常通りサーバの管理を行っているのがほとんどだが、今後は、サーバレスが普及するであろうと考えられる。
管理のしやすさや、コスト面、開発しやすさが大きなメリットである。一方デメリットは、サービスの制約があったり、構成に精通した技術者が必要なところがある。
今後数年以内に、サーバレスが標準化されるであろうとされているので、このあたりも勉強しておくと良いだろう。