OmniAICreator/Qiita-1.07M huggingface dataset:
Qiita アップデートのお知らせ - 2024年 3月

![Qiitaアップデートのお知らせ 2024年3月](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/7c94bcaf-8464-81a0-c529-2034c88496dd.png)


## はじめに

Qiitaでは、エンジニアのみなさんからの声をもとに、日々開発を続けています。
この記事では、2024年3月にリリースした内容を紹介します。

Qiitaでアップデートやバグ修正をリリースしたら、[リリースノート](https://qiita.com/release-notes)、[Qiita 公式 X(Twitter)](https://twitter.com/Qiita)、[Qiita Blog](https://blog.qiita.com/)でお知らせしています。

また、Qiitaへの質問や機能の要望などありましたら、[Qiita Discussions](https://github.com/increments/qiita-discussions) へご投稿ください。

## Mermaidのバージョンを10.2.4から10.9.0に変更しました

![Mermaidの新たな記法の使用例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/ad4a63a1-b0b3-efd7-0b8a-2e6c05dfb270.png)
*2024年3月12日リリース*

Mermaidのバージョンを10.2.4から10.9.0に変更しました。
これにより、フローチャート内にKaTeXで数式が書けるようになります。
その他にも、新たな記法が使えるようになりました。

詳しくは[Mermaidのリリースノート](https://github.com/mermaid-js/mermaid/releases)をご覧ください。

## マイページでピックアップ記事を編集するモーダルの「保存する」ボタンを常に見えるよう修正しました

![「保存する」ボタンが常に見えるようになったピックアップ記事編集モーダルの変更前・変更後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/9116ad09-8d2c-1e18-ab87-7aa239f9a6fd.png)
*2024年3月12日リリース*

これまで画面の高さが低い時はスクロールしないと「保存する」ボタンが見えなくなっていました。
このアップデートにより、スクロールぜず常に「保存する」ボタンが表示されるようになりました。

## フォローボタンのコントラスト比を改善しました

*2024年3月25日リリース*

アクセシビリティを考慮し、フォローボタンのコントラスト比が4.5:1以上になるよう改善しました。

## リリースノートページをダークテーマに対応しました

![ダークテーマに対応したリリースノートページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/a26b219f-c91a-f77a-99c2-80da3da28481.png)
*2024年3月29日リリース*

リリースノートページをダークテーマに対応しました。

ダークテーマはQiitaにログインした上でOSの設定を「ダークテーマ」に設定いただくことで利用できます。
992. Subarrays with K Different Integers の解き方メモ

https://leetcode.com/problems/subarrays-with-k-different-integers/description/?envType=daily-question&envId=2024-03-30

解くのに若干てこずったので、考え方のメモを残しておきます。

「整数列numsが与えられる。要素の種類がちょうどK種類の部分列の数を求める」という問題。これは次のように考えるとよいです。

**(ちょうどK種類の部分列の数) = (K種類以下の部分列の数) - (K-1種類以下の部分列の数)**

「K種類以下の部分列の数」「K-1種類以下の部分列の数」についてはしゃくとり法(Sliding Window)により簡単に求めることができます。

```rust
use std::collections::HashMap;

impl Solution {
    pub fn subarrays_with_k_distinct(nums: Vec<i32>, k: i32) -> i32 {
        let k = k as usize;
        Self::count(&nums, k) - Self::count(&nums, k - 1)
    }

    fn count(nums: &[i32], k: usize) -> i32 {
        let n = nums.len();
        let mut right = 0;
        let mut map = HashMap::new();

        let mut ret = 0;
        for left in 0..n {
            while right < n && (map.len() < k || (map.len() == k && map.contains_key(&nums[right])))
            {
                *map.entry(&nums[right]).or_insert(0) += 1;
                right += 1;
            }

            ret += right - left;
            if left == right {
                right += 1;
            } else {
                if map[&nums[left]] == 1 {
                    map.remove(&nums[left]);
                } else {
                    map.insert(&nums[left], map[&nums[left]] - 1);
                }
            }
        }
        ret as i32
    }
}
```
【Python】切り上げ除算の求め方

「AtCoder Beginner Contest 345」のB問題を解いて、Pythonでの「切り上げ除算」の求め方を学んだので忘れないようにメモしておきます。

## 「AtCoder Beginner Contest 345」のB問題
https://atcoder.jp/contests/abc345/tasks/abc345_b

問題内容は以下の通りで、簡単に言うと **『`X/10`の「切り上げ除算」を行ってください』** というものです。
>$−10^{18}$以上$10^{18}$以下の整数X が与えられるので、$\lceil \frac{X}{10} \rceil$を出力してください。
ここで、$\lceil a \rceil$はa以上の整数のうち最小のものを意味します。

この問題をPythonで以下のように解いたのですが、
```python:main.py
N = int(input())

if N%10 == 0:
    ans = N//10
else:
    ans = N//10 + 1

print(ans)
```
解説では$\lceil \frac{a}{b} \rceil = \lfloor \frac{a+b-1}{b} \rfloor$という計算式で簡潔に解けるよ、ということを教えてもらい勉強になったので、なぜこの計算式で解けるのかをメモがてら整理しておきます。

## Pythonにおける除算演算子は「切り捨て除算」
Pythonの除算演算子`//`は「切り捨て除算」の結果を返します。
例えば、`a=7`、`b=3`のとき、`a/b=2`となる。
（`a/b=2.333...`の小数部が切り捨てられる）

また、「切り捨て」を行うロジックは下記2パターンあるようで、どちらのロジックで算出するかはプログラミング言語によって異なるとのこと（知らなかった・・・）。

   1. x以下の整数のうち最大のもの（$\lfloor x \rfloor$）
   1. 小数点以下の部分を捨てる

Pythonでは「切り捨て」は前者のロジック（x以下の整数のうち、最大のもの）を使っているとのことです。
- [参考：Python 言語リファレンス 6.7 二項算術演算](https://docs.python.org/ja/3/reference/expressions.html#binary-arithmetic-operations)

そのため、Pythonで除算演算子を使った計算では下記のような結果となります。
```python:main.py
print(7 // 3)
# 2 （「2.777...」以下の整数のうち最大のもの）
print(7 // -3)
# -3 （「-2.777...」以下の整数のうち最大のもの）
```

## Pythonにおける「切り上げ除算」の求め方
今回の問題において、Pythonで単純に`X/10`を計算すると$\lfloor \frac{X}{10} \rfloor$が結果として得られることになり、問題で求められている$\lceil \frac{X}{10} \rceil$をどのように求めるかが鍵になります。

これを解くにあたり、考えやすくするため、まずは`x/3`を例として考えてみます。
- $\lfloor \frac{x}{3} \rfloor$・・・`x/3`以下の整数のうち最大のもの（Pythonにおける除算結果）
- $\lceil \frac{x}{3} \rceil$・・・`x/3` 以上の整数のうち最小のもの（今回求めたいもの）

すると、下記のような結果となります。
| x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| $\lfloor \frac{x}{3} \rfloor$  | 0  | 0  | 0  |  1 |  1 | 1  | 2  | 2  | 2  | 3  | 3  |
| $\lceil \frac{x}{3} \rceil$  |  0 | 1  |  1 |  1 | 2  | 2  |  2 |  3 |  3 | 3  | 4  |

上記の結果を眺めると、今回求めたい$\lceil \frac{X}{3} \rceil$は$\lfloor \frac{X}{3} \rfloor$のXを右に2個（`3-1`）シフトした計算結果と同じになることがわかるかと思います。

つまり、下記の計算式で$\lceil \frac{a}{3} \rceil$を求めることができることがわかります。

$\lceil \frac{x}{3} \rceil = \lfloor \frac{a+3-1}{3} \rfloor$

| a | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| $\lfloor \frac{a}{3} \rfloor$  | 0  | 0  | 0  |  1 |  1 | 1  | 2  | 2  | 2  | 3  | 3  |
| $\lceil \frac{a}{3} \rceil$  |  0 | 1  |  1 |  1 | 2  | 2  |  2 |  3 |  3 | 3  | 4  |
| $\lfloor \frac{a+2}{3} \rfloor$ |  0 | 1  |  1 |  1 | 2  | 2  |  2 |  3 |  3 | 3  | 4  |

よって、Pythonにおける「切り上げ除算」の求め方は、以下の計算式によって導けるため、

$\lceil \frac{a}{b} \rceil = \lfloor \frac{a+b-1}{b} \rfloor$

:::note warn
2024/04/27 追記
上記は`b`が正の場合のみ成り立ちます。

@fujitanozomu さん
ご指摘ありがとうございます。
:::

今回の問題は、下記のように実装することで解くことができます。

```python:main.py
N = int(input())

ans = (N+9)//10

print(ans)
```

以上です。
inertiajsによるリンク、form submit、APIリクエストの実装

### 画面遷移のリンクの場合
Linkを使う。
※aタグを直接使うとSPAによる部分リロードのメリットがなくなる。

https://inertiajs.com/links

通常はaタグにレンダリングされる。

```javascript:
import { Link } from '@inertiajs/vue3';

<Link href="/About">About</Link>
```

### formのsubmitによる画面遷移
inertiajsのrouterかそのヘルパーであるformヘルパー(useForm)を使う
useFormの場合はデータのエラー時や、初期値のバインドも簡単にできる。

https://inertiajs.com/forms


```javascript
<script setup>
import { useForm } from '@inertiajs/vue3';

const props = defineProps({
  user: Oject,
});

const form = useForm({
  id: props.user.id,
  name: props.user.name,
  age: props.user.age,
});

const submit = (event) => {
  form.post('/register'); 
  // ziggyを導入している場合、以下のようにもできる
  form.post(route('register'));
}

</script>
<template>
  <form @submit.prevent="submit">
    <input type="text" v-model="form.name"/>
    <div v-if="form.errors.name">{{ form.errors.name }}</div>
    ...
  </form>
</template>
```

```php:Controller
  public function register(Request $request)
  {
      $request->validate([
        'name' => ['required', 'max:10'],
        'age' => ['required', 'integer'],
      ]);
      $user = new User([
        'name' => $request->name,
        'age' => $request->age,
      ]);
      return Inertia::render('Login');
  }
```
laravel側のバリデーションエラー時、form.errorsにエラー内容が格納される。

useFormはformタグありきっぽい実装なため
formタグを置きにくいタグ構成やsubmitボタンがネストしてしまうなどの場合あuseFormのマニュアル版であるrouterを使う。

https://inertiajs.com/manual-visits

こちらもinertiajsの機能なので画面遷移する想定の応答にする必要がある。

### 画面遷移のないAPIリクエストの場合
router/useFormでAPIを実行するとinertia固有のjson形式でないためエラーとなる。
APIを実行する場合はaxios、XHR、fetchなどのHTTPリクエストを使う。
cv2.cvtColorにIMREAD.GRAYSCALEを入れると4chで出力される

ハマったので記録

# 事象
cv2.imreadでIMREAD_GRAYSCALEを入れていた影響で
cv2.cvtColorにIMREAD.GRAYSCALEを入れた時
この時出力結果が4chになる

#### 期待値
画像のグレースケールを1chで返してくれるのが期待
 [146 146 146 ... 147 148 149]
 
#### 結果
 [146 152 135 255]
  [146 152 135 255]
  [147 152 136 255]
  ...
  [149 150 142 255]
  [150 151 143 255]
  なぜ？

# 解決策
cv2.cvtcolorにはcv2.COLOR_BGR2GRAYを入れる


```python
import cv2 as cv
import os
import csv

cd = os.path.dirname(__file__)
ratio = 2

#read img
file_path = os.path.join(cd, "sample1.png")
img = cv.imread(file_path) #3ch

if img is None:
    print("Read error")

#get img size [height:width:color_bitdepth]
# print(img.shape)
height = img.shape[0]
width = img.shape[1]
#Enlargement
resize_img = cv.resize(img, (int(width*ratio), int(height*ratio)))

#cvtColor (image, code[, dst[, dstCn]])
#convert BGR to GREY

#By convertin grayscale, get only brightness value
gray_img = cv.cvtColor(resize_img, cv.COLOR_BGR2GRAY)
#ここの出力結果です
 print(gray_img)

# cv.imshow('window', gray_img)
# cv.waitKey(10)
  
def csv_out():
    with open('IMREAD_GRAYSCALE_2.csv', 'w', newline = '' ) as csvfile:
            writer = csv.writer(csvfile)
            writer.writerows(gray_img)
    # print(rgb_img)
csv_out()

```
クリギング③：通常クリギング

## はじめに
クリギング①では、理論バリオグラムと共分散関数の設定までを行いました。

https://qiita.com/watlab/items/3032fddb812045894b87

そして、クリギング②では求めた共分散関数を用いて、単純クリギングでの推定を行いました。

https://qiita.com/watlab/items/f6078807842aae95ab06

単純クリギングでは、全体の期待値がわかる時しか使えませんでした。今回は、期待値は未知でわからないけど、全体の期待値が一定とわかる場合に使うことができる通常クリギングについて書いていきたいと思います。

## 使用するデータ
使用するデータは前回同様、ChatGPTに作成させた標高データを用います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/6fe01fcd-5b1e-7af0-2a95-bef9b9c7a485.png)

そしてこのデータから500点をサンプリングしたものを入力データとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/34b49f6a-7690-be85-2aaa-264d48e4b23c.png)

クリギング①では、このサンプリングデータから理論バリオグラムと共分散関数を求めました。

~~~math
\gamma(h)=11.6+325.2\left[1-\exp\left\{-\left(\frac{h}{12.6}\right)^2\right\}\right]
~~~

~~~math
C(h)=325.2\bigg[\exp\bigg\{-\bigg(\frac{h}{12.6}\bigg)^2\bigg\}\bigg]
~~~

今回は理論バリオグラムを用いて通常クリギングをしていきたいと思います。

## 通常クリギング
通常クリギングは、全体の期待値が未知かつ、全体の期待値が空間座標によらず一定の時に用いることができる手法です。推定箇所の目的変数を求める式は以下の線形和になります。

~~~math
z_0=\sum^{n}_{i=1}\omega_kz_k
~~~

ここで、$z_0$は求めたい箇所の目的関数、$z_1,z_2,\dots,z_n$はサンプルデータの目的変数、$\omega$はパラメータです。この時のパラメータは以下の式で決定します。

~~~math
\left[\begin{array}{ccccc}\omega_1\\
\omega_2\\
\vdots\\
\omega_n\\
\mu
\end{array}
\right]=\left[\begin{array}{ccccc}
\gamma(0)&\gamma(h_{1,2})&\ldots&\gamma(h_{1,n})&1\\
\gamma(h_{2,1})&\gamma(0)&\ldots&\gamma(h_{2,n})&1\\
\vdots&\vdots&\ddots&\vdots&\vdots\\
\gamma(h_{n,1})&\gamma(h_{n,2})&\ldots&\gamma(0)&1\\
1&1&\dots&1&0
\end{array}
\right]^{-1}
\left[\begin{array}{ccccc}\gamma(h_{0,1})\\
\gamma(h_{0,2})\\
\vdots\\
\gamma(h_{0,n})\\
1
\end{array}
\right]
~~~

$h_{i,j}$は、目的変数$z_i$、$z_j$のユークリッド距離です。また、パラメータベクトルの要素に、推定値を求める際に関係のない$\mu$が出てきますが、こちらは推定誤差分散を求める際に使用するパラメータです。そして、推定誤差分散は以下の式で求めることができます。

~~~math
{\sigma_0}^2=\sum_{k=1}^n\omega_k\gamma(h_{0,k})+\mu
~~~

今回、入力行列の欠損箇所を逐次$z_0$として通常クリギングを行いました。
まず、標高の推定結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/1c459936-eba6-3797-e80b-031c212dfa8e.png)

そして、95%信頼区間で起こりうる誤差分布です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/42af996d-7221-8d65-ec50-977a8e206926.png)

この結果から、単純クリギング同様、角に高い分散が集中していることがわかります。そして、単純クリギングと違い、期待値を事前に入力していないので、データが密集する区間でもそれなりの誤差が起こりうる、ということがわかります。
次に、正解値と普通クリギング結果の残差分布を確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/e3258e0e-4eb9-806c-90c4-ab4edb7dc791.png)

分散傾向はあっていそうですが、やっぱり小さい分散を出力しています。

## さいごに
今回は通常クリギングのやり方と推定結果の考察まで書きました。次回は普遍クリギングについて書いていきたいと思います。

### 参考文献
コロナ社：飯田義隆「クリギング入門」
API送信時にUser-Agentを付与するのを忘れて403エラーが出た

# はじめに
タイトルの通り、開発中のプログラムからAPI送信時、リクエストのヘッダのUser-Agentを付与しなかったため403エラーで返ってきました。
少しハマったため備忘録として残しておきます。

# 経緯
取引先が作成したAPIに、開発中のプログラムからリクエストを投げたら403エラーで返ってきました。
403エラー自体はよくある事例ですが、１点不可解な点がありました。
それは事前にAPIの接続確認のためPostmanで正常にレスポンスが返ってくるのを確認済みということです。
なぜかプログラムからのAPIからのみ403エラーが発生します。
もちろんリクエスト内容は同じです。

# 結論
リクエストヘッダにUser-Agentを付与していなかったことが原因でした。
User-Agentを付与し再度送信してみると無事正常なレスポンスが返ってきました。

今回の件でハマった原因としては、親切なことにPostmanではデフォルトでUser-Agentを付与してくれるということでした。

![f08574bd-9c58-da0d-9dce-f35a16f30dc3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726673/dd966cf4-68a5-049b-5ac4-76140cdf89a8.png)

リクエストのボディ部分だけではなくヘッダ部分もしっかり確認しなくてはいけないですね。。


# そもそもUser-Agentとは
User-Agentとは、Webブラウザや他のHTTPクライアントがサーバーに対して自身の識別情報を伝えるために使用するものです。
この情報には、クライアントの種類/オペレーティングシステム/ブラウザのバージョンなどが含まれます。
最近のWebサイトやAPIはスクレイピングやボット対策でUser-Agentが無いリクエストを拒否しているものも多いようですね。

# まとめ
特に害はないので素直にUser-Agentは付与して送信しましょう
また、PostmanではデフォルトでUser-Agentを付与してくれていることも覚えておきましょう。

# 参考
https://zenn.dev/kamimi01/scraps/2be3eee6bc2f65
区間和


前回のを参考に、
今回は区間和ってことだから
おそらく区間ごとに和を取ってそれを配列に入れて
それらを差し引きすればいけるんじゃないかなと思って
そうしてみました。

```py
N,K = map(int,input().split())
A = [int(input()) for _ in range(N)]
ans = A[:]
for i in range(1,N-1):
    ans[i] += ans[i+1]
    
print(ans)    

for _ in range(K):
    A,B = map(int,input().split())
    print(ans[A-1] + ans[B-1])
```
ただ、ケース１の２つ目で-10足りないことが判明し。
計算をしてみたところ考え方としてはちょっと違うようです。
時間もなかったのでちょっと答えを見てみました。

うーん。。。別に累積和はそのままでよかったみたいです。
ただ計算式が間違っていたようで。
区間を計算するには累積和の一番大きいやつ（４）から、一番小さいやつ（２（−１））を引く感じでよかったみたいです。
これで考えると、たしかに1番目と2番めはなぜか2番目だけ出力すればいいという謎が解けます。

ちょっとケース１の例で。
16
88
10
-65
2 4
1 2

[0, 16, 104, 114, 49]
33
104

0番目＝０
1番目＝16
2番目＝104
3番目＝114
4番目＝49
累積和はこの通り。

2番目〜4番目の区間の和は88＋10＋（−65）＝３３
これは、４番目の４９から２番目（−１、つまり1番目）の16をひいた数と同じ
次に
1番目〜2番目の区間の和は16＋88＝104　で、これは2番目104から1番目（−１）をひいた数と同じ
というわけでロジックがわかってきました。

```py

N, K = map(int, input().split())
A = [int(input()) for _ in range(N)]
#累積和を作る
ans = [0] + A[:]
for i in range(1, N + 1):
    ans[i] += ans[i - 1]


for _ in range(K):
    left, right = map(int, input().split())
    print(ans[right] - ans[left - 1])

```
【kintone】テーブルの一番上の行に最新データを追加する方法

# はじめに
・テーブルの一番上の行に最新データを追加したい！
・テーブルに追加した行の順番を間違えて登録した！

これを標準機能で解決しようとすると、[kintoneのヘルプ](https://jp.cybozu.help/k/ja/trouble_shooting/app_qa/add_row_table_top.html)にも書いてあるように、一行目を入力しない運用方法にしたり、自力で行をずらして登録し直す方法しかないのです。

余力がある環境なら運用でカバーもいいのですが、本来の業務に集中したいものです。
そういうときには、カスタマイズやプラグインを使用するのも手です。
今回は直感的なインターフェースでオススメの[Hoku Systemの、**テーブル行順並び替え プラグイン**](https://hoku-system.stores.jp/items/65e7d74781cb2903ceb9a2b4)を使用しました。

# 「テーブル行順並び替え」プラグインを使ってみた
**◆レコード登録後でも、テーブル行の表示順を変更可能*
<font color="#67cb1b">
編集画面でテーブルの一番下に新しい行を追加しておいたものを、プラグインの詳細画面で開き、テーブル行順並び替えプラグインの機能を使用すると一番上に最新データを追加する事ができます。
</font>


①詳細画面で切替ボタンを押す
![Hoku System テーブル行順並び替え切替　プラグイン 使用方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744766/0e167901-74a2-90d3-c1c2-de25b5aa48e7.png)

②テーブル行順の並べ替え画面になる
![Hoku System テーブル行順並び替え切替　プラグイン 並び替え画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744766/044197fb-6a90-e20e-fc70-026e767415ea.png)



③ドラッグ＆ドロップするだけ。
　※上矢印ボタンで、一行ずつ移動する事もできます。

![Hoku System テーブル行順並び替え切替　プラグイン ドラッグ＆ドロップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744766/0a8715fa-31f9-ff2e-7adf-c17d0fd8c535.png)

**移動完了！**
一番下の空白行を一番上に移動させました。

これでよければ「レコード更新ボタン」を押せば最新データでもテーブルの一番上に表示する事ができます！

# おわりに
標準機能でできない事・煩わしい事はプラグインの導入や、カスタマイズでどうにかなる事が多々あります。

https://hoku-system.stores.jp/

皆様の毎日作業がよりスムーズに行われるよう願っています。
HAM(Hardware Asset Management)のざっくり概要

## HAMの概要
Hardware Asset Management…つまりハードウェア資産をServiceNowで理想的に管理することを目的として、その「理想的な管理」というものをServiceNowはどのようにとらえ、どのように実現するかを体系だったベストプラクティスとして提供

#### ■用語（ざっくり定義）
- ハードウェア：PC、サーバなど会社が事業に供するための具体的な設備
- ソフトウェア：PC、サーバ上で動くOSやアプリケーションなど仮想的なもの
- IT資産：PC、サーバ、ソフトウェア権利など企業活動に必要な資産。ハードウェア・ソフトウェアを企業活動における財務的な価値を計測するために構成する。資産税やソフトウェア契約や調達費など、ライフサイクル全体での金額面が主な管理項目である。
- 構成アイテム（CI）：ハードウェア・ソフトウェアを企業活動における運用的な側面を計上するために構成する。DBやSQLサーバー、スイッチ、ルーターなど。お金として計算する価値が高いものは資産、そうでないものは構成アイテム(ざっくり区分)。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/8feaa1a5-982f-668f-02c8-d3ae2c9f849e.png)

- 構成管理データベース（CMDB）：CIを集積してデータベース化したもの。企業が保有する資産・設備を含めてすべてモレなく一元管理したい、みたいなニーズは高い。
- ライフサイクル：以下のプロセス（①要求－⑥廃棄まで）を資産のライフサイクルと定義
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/48b68436-1bab-9988-cfe6-dcc8f783257d.png)

## ■HAMの目的とメリット
#### HAM導入の目的： 
企業の活動における設備を一元管理するデータベースを作成するとともに、それらの調達から利用、廃棄まで含めたライフサイクルに着目して、財務的にサポートして、効率的な管理体制を実現していくこと。データベースを作成するだけでなくて、金額面での最適や自動化まで含めたベスプラですよ、みたいなウリ

#### HAM導入のメリット：

1. 単一データベースによって情報がどこにあるか迷わない
2. 自動化された登録・更新・削除プロセスによる工数削減した管理
⇒資産を可視化することによって不要なものを削除して無駄のない管理を実現
⇒ServiceNowによるベストプラクティス的な構成による最適の実現
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/9146b37a-c835-f09a-7978-d3bb1b542b10.png)
CodeCommit デフォルトプロファイルではないプロファイルでのHTTPS(GRC)でのリポジトリクローン

# プロファイル情報の一覧
```
aws configure list-profiles
```

# CodeCommitリポジトリ一覧
```
 aws codecommit --region {リージョン名} list-repositories --profile {プロファイル名}
```

# CodeCommit HTTPS(GRC)でのリポジトリクローン
```
git clone codecommit://{プロファイル名}@{リポジトリ名} {クローン先ディレクトリパス}
eg)  git clone codecommit://hogehoge@fugafuga (クローン先ディレクトリパスは省略可能、カレントディレクトリにクローン)
```
Slack API の url_verification に Lambda + Python で応える

URL Verification Challenge の値を返せばOK

```python
import json

def lambda_handler(event, context):
    # Slack API からのリクエストボディを取得
    body = json.loads(event['body'])

    # URL Verification Challenge か？
    if "challenge" in body:
        # challenge の値を取得
        challenge = body['challenge']
        
        # レスポンスを作成
        response = {
            "statusCode": 200,
            "body": json.dumps({"challenge": challenge})
        }
        
        # レスポンスを返す
        return response

    # レスポンスを作成
    response = {
        "statusCode": 200,
        "body": json.dumps({"message": "Hello from Lambda!"})
    }
    
    # レスポンスを返す
    return response
```
Jetson-inference　の使い方

[Jetson AGX Orinを使いこなすうえで参照するリポジトリ](https://qiita.com/nonbiri15/items/a474d9c4501f1efc0635)
で示したうちの一つへの解説です。

## jetson-inferenece のリポジトリとは
NVidia のJetson　Developer　dusty-nv　氏による
Jetson用の機械学習の推論のリポジトリです
### 利点
- Nvidia Jetson 用であること。
- tensorRTに最適化されていること。

このような利点があるため、Jetson でまずは何が使えるのかを知るのが楽になります。



https://github.com/dusty-nv/jetson-inference/tree/master

## まず、自分の利用するJetsonのJetPackを確認する。
## Jetpack5.1
 Ubuntu 20.04 LTS
{"JetPack5.1",
  L4T 35.2.1
  CuDNN 8.6.0,
  CUDA 11.4.19,
  TensorRT 8.5.2,
}

## 対応するDocker Containerを見つける。
https://github.com/dusty-nv/jetson-inference/blob/master/docs/aux-docker.md

例:
dustynv/jetson-inference:r35.2.1	L4T R35.2.1	JetPack 5.1

## Launching the Container
- git cloneとdocker run
```
$ git clone --recursive --depth=1 https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ docker/run.sh
```

> docker/run.sh will automatically pull the correct container tag from DockerHub based on your currently-installed version of JetPack-L4T, and mount the appropriate data directories and devices so that you can use cameras/display/ect from within the container.
とあるので、適切なコンテナを自動で取得してくれる。

## host環境側で
xhost +
を実行しておく。

##  cmake

```
mkdir build; 
cd build
cmake ..
make
```


modprobe: FATAL: Module nvidia not found in directory /lib/modules/5.10.104-tegra

https://forums.developer.nvidia.com/t/module-nvidia-not-found-in-directory-lib-modules-5-10-104-tegra/257058


docker/run.sh
に以下の行を追加。
```
+               -v /etc/nvidia-container-runtime:/etc/nvidia-container-runtime \
```

export PATH=$PATH:/etc/nvidia-container-runtime/host-files-for-container.d/l4t.csv


参考情報：
 NVIDIAのForums   [No cameras available(gstnvarguscamerasrc.cpp, execute:751)への公式のコメント](https://forums.developer.nvidia.com/t/no-cameras-available-gstnvarguscamerasrc-cpp-execute-751/256866)



## NVIDIA Jetsonに着目している理由
- 組み込み可能なアルゴリズムを、なるべく多く試したい。
- 購入した時点でそのままWifiも、X-windowも、USBも使える。
- PCでの開発と同じエディタ・コンパイラ・開発環境が使える
- 従来の組み込み向けのボードでの制約がほとんど無い
- Ubuntuベースのライブラリが使えるので、多くのソフトウェア開発者にとってのハードルが少ない。
- Jetson AGX Orinを候補に考えておけば、リソースを減らして十分なことが判明すれば、Nanoなどのデバイスに移行すればいい。
python array object cache

```python
def get_cache_parquet(file_path, da):
    if os.path.isfile(file_path):
        df = pd.read_parquet(file_path)
        if df.iloc[0]['max_da'] == da: return df
    return []
    
class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)
    
def fund_ind(market, order, limit):
    sql_str = "SELECT MAX(da) FROM fund_indicators"
    items = dbfetchallDict(market, sql_str, "db_fund")
    da = items[0]['max']
    file_path = 'fund_summary.parquet'
    df = get_cache_parquet(file_path, da)
    if len(df) > 0:
        nav_list = []
        is_desc = False if order == 'desc' else True
        df = df.sort_values(['score'],ascending=is_desc)
        for col in df.columns:
            if df[col].dtype == object:
                if col == 'nav':
                    nav_list = df['nav'].tolist()
                    df['nav'] = df['code']
        res = df.to_dict(orient='records')
        for i in range(len(res)):
            res[i]['nav'] = json.loads(json.dumps(nav_list[i], cls=NumpyEncoder))
        return res
    sql_str = f"""
    SELECT M.code, REPLACE(M.code, ' Equity', '') AS ticker, M.name, E.score, MaxDates.max_da, P.ar, P.sr, P.mdd, 
    ROUND(CAST(P.sr/2 AS numeric), 2) as sr,
    (
    SELECT JSON_AGG(JSON_BUILD_OBJECT('da', da::text, 'beta_equity', beta_equity))
    FROM stock_ind
    WHERE code = e.code
    AND da BETWEEN NOW() - INTERVAL '180 days' AND NOW()
    ) AS nav
    
    INNER JOIN (
	SELECT code, MAX(da) AS max_da
	FROM stock_ind_e
	WHERE code like '00%%' group by code) AS MaxDates     
	ON E.code = MaxDates.code AND E.da = MaxDates.max_da
    AND M.name IS NOT NULL
    AND E.da = (SELECT MAX(da) FROM indicators_e)
    ORDER BY E.score {order}
    LIMIT {limit};
    """
    market = "jp"
    items = dbfetchallDict(market, sql_str, "fund_ind")
    df = pd.DataFrame(items)
    df.to_parquet(file_path)
    return items
```
openSUSE  Tumbleweed Xorg coredump問題

環境はOS openSUSE Tumbleweed 20240329、x11、plasma6、kwin-x11、nvidia_driver470.239.06である。
症状は時間を経って時々にKDEアプリとXorg0がクラッシュしたことです。
解決方法は以下の参考より：https://forums.opensuse.org/t/first-login-crashes-and-returns-to-login-screen/170961
plasma6はwaylandの設定が含み込んでいながら、x11がデフォルトの環境のままです。
nvidia-drm.modeset=1はwaylandに対応する設定です。純粋なX11なら時々にクラッシュする。
**nvidia-drm.modeset=0**にすれば、Xorg0によるコアダンプが減ります。
openSUSEの推奨repoを利用する場合、nvidia-drm modesetの設定ファイルは/lib/modprobe.d/50-nvidia-default.confとなります。
**/lib/modprobe.d/50-nvidia-default.conf**を以下のように編集すれば症状が軽減できます。
```
#options nvidia-drm modeset=1
options nvidia-drm modeset=0
```
Grub起動命令でもできそうみたいが、試したことはありませんので割愛します。

2024.04.21
追加
最近のnvidia_drmの情報を調べると550からmodeset=1のバッグが解決されそうみたいです。
逆にG04(3xx.xx)やG05(4xx.xx)のドライバーがcoredumpの問題が出てきます。
G06(550.xx)のドライバーにアップデートから10日ぐらいエラーが出ませんでした。(modeset=1 fbdev=1)
条件を満たす注文番号を取得しよう (paizaランク C 相当)

https://paiza.jp/works/mondai/sql-new-primer-03_drill/sql-new-primer-03_drill__1099

今日はSQLです。
```sql
select ordered_id from ordered_menu
where (ordered_id = 42 or ordered_id = 76) 
and ((menu_id = 12 and num >= 1) or (menu_id = 11 and num >= 2))
order by ordered_id
```
ちょっと条件文を読み違えたらしいですね。。。
order_idがそもそも42と76しかなかったからこれだけ抜き出せば良いんじゃと考えたのが
間違いでした。
そもそもLIMIT１があるので１件しか取得しないのでどうなるかなんてわからないですね。。。
なので、ここは以前、以後と修正します。
ポテトLは１個以上ですがこの場合、別にnum >=1というのがなくても、１個でも注文があればいいわけなので、menu_idが１件でもあればそれで条件が成り立つわけです。なのでここも修正対象ですね。
あと、andはorより先に考慮するので、（）がなくてもOK。
（SQLの論理演算子の優先順位は、NOT ⇒ AND ⇒ OR）
※心配なので（）をわざとつけてました。。。

```sql
select ordered_id from ordered_menu
where (ordered_id <= 42 or ordered_id >= 76) 
and (menu_id = 12 or menu_id = 11 and num >= 2)
order by ordered_id
```
小さい画面でclientWidthも100%も100vwもなぜか980pxを取得する時

自分用の備忘録です。タイトルの通りです。

## 結論から
- metaタグでviewportを指定していないとデフォルト値の980pxを取得する
- viewportを指定すれば正常にCSSの値を取得できる

### 例
```
<meta name="viewport" content="width=device-width">
```

## 実際に発生した状況
- 幅をcssで100vw、高さを100vhとして画面サイズに合わせたdiv要素を用意
- その要素の中でcanvasをセンタリングしたい
- 画面サイズの縦横比とcanvasの縦横比に合わせ、一番大きくなるようにリサイズする
- Chromeのデベロッパーツールでサイズをレスポンシブにして画面を小さくする
- 正常な表示にならず、やたら拡大される
- viewportを設定したら極小画面でもそれに合わせて最大化された
EAを使用して、SQLを生成する

皆さんこんにちは
今回は、EAを用いてSQLを生成する方法について説明してきます。

#EAについて
EAとは、Enterprise Architectの略で、業務システム・webアプリケーション・組み込みなど様々な設計開発に対して、様々な対象の人が設計開発全体を通して利用できる設計ツールです。

##SQLの生成方法について
①コードタブ > 「DDLの生成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765220/c1088921-87fd-2564-f11f-e4247c252913.png)
②「生成タブ」で、出力するテーブルを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765220/ac097b8f-8c64-ab8b-29f2-719dc3022374.png)
③出力順序を変更する
FKが設定されている場合は、FKに設定したテーブルが先の順序になるようにする。

④オプションタブで「別名の利用」をTureにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765220/99dd4a2d-97b7-34fe-e8d4-172895d4506f.png)
⑤生成タブで「単一のファイル」を選択し、出力先を設定して、「生成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765220/39dbf32a-4b1d-5381-eaf1-7f91c2f72ef7.png)



以上がSQLの生成方法になります。
良かったら参考にしてみてください。
find結果で得られたフォルダからfindを実行する（再帰的なfind？）

「xargs」っていうのがフィルターでは使えるようだが、使い方のコツが分らんかった…。
findの結果をawkに渡してfindを生成して、shで実行する。

```
cd /hogehoge/fugafuga
find 10.* -maxdepth 3 -a -name "abc" | awk '{print "find "$1" -maxdepth 2  -name '"'"xyz"'"' -print";}' | sh

10.10.10.20/project/abc/0000/xyz👈コレが対象のディレクトリ
10.10.10.20/project/public_html/abc/xyz
```

こんな感じだけど、急ぎで進めたかったので上記で進めた。xargsがどのように実行されるのかパイプ越しに受け取ったモノをコマンドの中に入れたい時などはまた次回やるときに調べる事にする。

{}👈コレを使う事で入れ込む場所を設定できるみたいだけど、うまく動かない
-IXXXとXXXを組み合わせたら動いた。
👇助けになったページ
https://qiita.com/P-man_Brown/items/c3f2634b7b5e08306c8f

```
find app/mod logs/httpd/ -name '*20240407*' -print  | xargs -p -IXXX ls -ld XXX .
```
👇
```
ls -ld abc1 abc2 abc3 .
```
ではなく
```
ls -ld abc1 .
ls -ld abc2 .
ls -ld abc3 .
```
こんな感じに受け取ったのをセットして一回実行ではなく、一行に付き一回ずつ実行していく感じ
HTTP ステータスコード 402について(雑談)

## はじめに
今回の内容は完全に雑談です。多分あまり役に立ちません。

## 春だな~

引越しの季節ですね。私も社内で席が移動になり、4Fの席へ移動になりました。ふと会議の部屋番号を見ていたら、401、402、403と並んでいてhttpのステータスコードみたいだなと思っていたら、402って聞かないなと思ったので、調べてみることにしました。

## 結論
MDN web docsによると
```
402 Payment Required
```
とあります。つまりクライアントからの支払いに関するリクエストが不正である場合に返すエラーです。
ただ、
```
Experimental: これは実験的な機能です。
```
ともあり、あまり標準的には使われていないようです。

## 深堀
実験的な機能であまり使われていないだけだと結論として面白くないので、もう少し深堀していきます。
### 400系エラーで欠番になっているもの
公式的には418~420は欠番です。(理由は調べましたが、わかりませんでした)
ただ、
* 418は「 I'm a teapot 」というエイプリルフールのジョーク
* 419は「Invalid CSRF tokens 」というLaravelの独自の応答
* 420は「 Requester Impaired 」という 送信者の障害によりサーバは処理を拒否したことを示す新しいコードとして使うことを検討中

ということになっています。
420はツイッターで大量のリクエストを送ると「 Enhance Your Calm(落ち着いていこうぜ) 」と返ってくるジョークコードとしても使われているようです。
そこから先は429まで割り当て済みで430は割り当てなしで431、451が割当て済みなようです。

* 431は「 Request Header Fields Too Large 」ヘッダーの大きすぎる場合
* 451は「Unavailable For Legal Reasons」法的な理由でアクセス不可の場合
が返ってくるようです。

## チャットGPTによる、まとめ
HTTPステータスコードは普通にインターネットを使っている分には、あまり気にすることのないものです。しかし、エラーコードの背後にある意味を理解することにより、Webの理解が進むと同時に、それぞれのコードが具体的に何を示すのか、またどのように使用されるのかを把握することも可能となります。今回は特にあまり知られていない一部のコードにスポットを当て、その存在と意味を掘り下げることで、通常のWebブラウジングでは見過ごされがちな部分に光を当ててみました。皆さんも日々の生活で何か新しい発見があれば、それが何か意味を持つ可能性について考えてみてください。それは、思いもよらない新たな知識への扉を開くかもしれません。
Blazorでテスト自動化をやってみよう!!(1)

# Blazorでテスト自動化をやってみよう!!(1)
Blazorで初のテスト自動化に挑戦してみることにした<br>
利用技術：
＜開発環境＞
- dotnet 8.0(Blazor Web App)
- Microsoft Extensions Configration
- Tailwind CSS
- Visual Studio 2022
＜テスト自動化関連＞
- xUnit(単体テスト自動化)
- Selenium(ブラウザテスト自動化)
- FluentAssertions(テストコード簡潔化)

本記事のターゲット層：
テスト自動化に関心はあるが、よくわからなくて踏み出せていない層


## (1) 記事の内容について
やはり、この記事を見た人には、私と同じように「テスト自動化に挑戦したいけどよくわからない」「どういう風に学習すればいいの！！」という感じで悩みを抱える人が、独学でテスト自動化を学習してもらえるようにしたいと思います。

そのため、最初は学習ステップを苦悩を含めてありのままお伝えします。そして最後に、効率よく学習するにはどのように進めればよかったと思ったか。という反省点をまとめた内容を書きたいと思います。

## (2) きっかけ
以前からテスト自動化には関心がありましたが、幾度も挑戦して幾度も心折れてきました。そのためしばらく触れてきませんでした。

理由は、単なるコーディングやインフラの構築とは概念が異なっているように感じられて、どのように初めて、どのように・どこで学習を進めればよいか、よく理解できなかったからです。

しかし、先月(2024年3月)に空き時間を使って、あまり力を入れてこれなかった技術の学習に力を入れようと思い立ちました。これは、私が2年ほど前からGithubを触り始めたこともあり、オープンソースを使った技術学習に慣れ始めたことも理由の一つに上がると思います。

そして、その力を入れてこなかったので頑張ろうと思った技術の一つがテスト自動化というわけです。

## (3) そもそもテスト自動化とはなんぞや
テスト自動化については[ここ](https://qiita.com/yutachaos/items/857472c7d3c65d3cf316)で詳しく調べて記載しておりましたので参考にいたしました。

結局、感情面でいえば、テストのめんどうなところというのは、コーディング好きにとってはツマラナイフェーズだからだと考えています。それを効率よく消化して、楽しいコーディングに注力したいよね。というのが開発者目線の感性ではないでしょうか。

しかし、仕事として捉えると、つまり理性的に捉えると、テストから属人的な要素を(極力)排除して、テストにかける工数を削減して一定の品質を担保することで、生産性を向上させることにつなげる。ということになります。

この場合の生産性というのは、一定の人件費の中から多くの高品質なソースコードを生成して、利益につながりやすいシステム、あるいは、営業機会を多く生み出せる魅力的なシステムを生み出すということになるでしょう。プログラマー目線では高品質なソースコードを多く生み出すほど、生産性が高くなるということになります。

テスト自動化の性質上、属人性を排除したことのみ実行されるため、テストの工程全体としては、テスト自動化で実施したテストだけでは不十分になることは間違いありません。

必ず、テスト項目として漏れがないか、きちんと検証できたかは検討しなければなりません。テストに銀の弾丸はないのです。


次回は、実際にテスト自動化に挑戦したいと思います。
Ubuntuでディスク容量を圧迫した時にすること

# 大雑把に確認

1. コマンドを実行 ```sudo ncdu```
1. エクスプローラで確認しながらdキーで削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/5c15ecb1-dd06-0b4e-0fc4-efe812b20916.png)

# 容量を圧迫しているファイルを検索

下記の方法で現在ディレクトリ以下のファイルで一覧し、不要なファイルを個別に削除します

**コマンド**:
```shell
find . -type f -exec du -h {} + | sort -rh | head
```

**出力**:
```
8.3G	./フォルダ名1/ファイル名1.mp4
7.9G	./フォルダ名1/ファイル名2.mp4
7.4G	./フォルダ名1/ファイル名3.mp4
6.3G	./フォルダ名4/ファイル名.mp4
6.1G	./フォルダ名5/ファイル名.mp4
5.8G	./フォルダ名6/ファイル名.mp4
4.8G	./フォルダ名7/ファイル名.mp4
4.7G	./フォルダ名8/ファイル名.mp4
4.4G	./フォルダ名9/ファイル名.mp4
```
# キャッシュなどの削除

```shell
# dockerキャッシュの削除
docker system prune -a -f
docker volume prune -f

# aptの使っていないパッケージの削除
sudo apt-get autoremove
sudo apt-get clean
sudo apt-get autoclean

# 一時ファイルの削除
sudo rm -rf /tmp/*
sudo rm -rf /var/cache/*
sudo rm -rf /var/lib/snapd/cache/*

#Journalログの削除
sudo journalctl --vacuum-time=2weeks
sudo journalctl --vacuum-size=100M

```
モノシリックRailsアプリエンジニアがモダンな会社に転職して学ぶこと

# Railsで動くモノシリックなサービスからマイクロサービスの会社へ
Rails + AWS EC2
Rails + GCP CloudRun

このようなシンプルな構成なサービスを運営していた会社から
マイクロサービスな会社に転職して学ぶことは非常に多い
基本的なことがまずわかっていない点が多いので
そこのキャッチアップから行う必要がある。


## 今まで利用していた技術
* AWS EC2
* GCP CloudRun
* Rails

## 今利用する技術
* AWS k8s 
* Rails API
* Next React Typescript

## 慣れが必要な点

### 【マルチリポジトリ】
今までシングルリポジトリで開発するのがメインだったため
そもそも複数のリポジトリを見ながら開発するのは頭の使い方が異なる。
このリポジトリの責務は何かを意識しつつコードを追う必要がある。

全文検索で該当コードを探そうと思っても探せる範囲にないことが多い。

### 【APIベース】
Railsを元々触っていたとはいえ、APIベースになると全く異なる設計になる
RESTな設計は元からしていたが、Railsが標準で CRUDへのリクエスト方法などを用意しているのであまり意識していなかったことを実感する

### 【テストコード】
今までは最低限のGETリクエストでもあればいい方
今は考えられるテストケースの網羅を必須としている
テストの書き方からケースの洗い出しまでキャッチアップが必要

# キャッチアップ記事と書籍
キャッチアップを進める上で読んだ本や資料を以下にまとめる。

## Next
公式チュートリアルが非常に優秀
page router で書かれているチュートリアルを完了後、 app router へ書き換えを実施すると理解が深まる
さらに Typescript で書き直すことを推奨したい。

https://nextjs.org/learn-pages-router/basics/create-nextjs-app

## React

### 【公式チュートリアル】
非常に優秀で基礎が理解できる

https://ja.react.dev/learn/describing-the-ui


### 【りあくと！】
Reactのチュートリアルとして非常にわかりやすくまとめられている
歴史的背景も含めて解説があるため　非常に参考になる。

https://oukayuka.booth.pm/


## Redux
Reduxの基礎としてこちらを一通り行いカスタマイズ。


https://qiita.com/FarStep131/items/ad834facc57a443a9dc3

## API
実際に設計しつつ、複数記事を読みつつ
新規に情報が必要になった際、どのエンドポイントが返すべき情報なのか
APIエンドポイントとしてどうあるべきなのか。


### 参考
https://qiita.com/mserizawa/items/b833e407d89abd21ee72

https://qiita.com/ryo88c/items/0a3c7861015861026e00

古いけれども、URI~ROAについての理解に良い

https://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c

## Typescript
Nextチュートリアル、Reactチュートリアル、Reduxチュートリアルの完了後、それぞれ Typescript で書き直した

コード自体の理解はできているため理解度高く Typescript の要素だけを学ぶことができるのでおすすめ
[Google Calendar API(V3)] Javaでカレンダーにテキスト形式(Quick Add)でイベントを追加する

Gmail API v1（Java）を使用して、
Googleカレンダーにテキスト形式(Quick Add)でイベントを追加する方法
についてご紹介します。

### Quick Addとは
イベントの内容、日時、期間、場所などを簡単な文字列で指定することにより
カレンダーのイベントを生成できる機能です。
日本語版のカレンダーUIでは対応していないようですが、APIは動作するようです。

指定する文字列は日本語でも問題ないようです。
例えば、「新宿御苑で午後2時から午後5時にお花見」という文字列を指定すると。。
<img width="380" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/02c7b6cf-64cd-b381-35ec-dc1b3e6bd360.png">
というイベントが追加されます。
リクエスト受付先で日本語を英語に翻訳しているんでしょうか。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[イベントを追加](#1-イベントを追加)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. イベントを追加
指定したカレンダーにイベントを追加します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
CalendarScopes.CALENDAR
CalendarScopes.CALENDAR_EVENTS
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行
本日の午後9時から午後11時に「飲みに行く」を追加しています。

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Events events = calendar.events();
    
    Calendar.Events.QuickAdd quickAdd = events.quickAdd("カレンダーID","午後9時から午後11時に飲みに行く");
    
    Event res = quickAdd.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/events/quickAdd
が実行されます。

#### 1.2.2. クエリパラメータ
Calendar.Events.QuickAddのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setSendUpdates|String|新しいイベントの作成に関する通知<br>"all"(すべてのゲストに送信)、"externalOnly"(Googleカレンダー以外のゲストにのみ送信)、"none"(送信しない)|

#### 1.2.3. リクエストボディ
リクエストボディはありません。

### 1.3. レスポンスの内容

#### Event

[[Google Calendar API(V3)] Javaでカレンダーのイベントを取得する(1.3. レスポンスの内容)](https://qiita.com/doran/items/714407979db97afea29c#event)
と同じです。

<br>
<br>
おしまい。。
【Outlook】メールの件名には"[ ]"を使わない方が良いという話

## はじめに

**Teams？** ああ、**テレビ会議**だよね。
**Slack？** 何それ？

……な組織ではメールが使われていて、業務のエビデンスとして
ローカルや共有サーバーに名前を付けてメールを保存されるのが常です。

メールの内容を分かりやすくするために`[ ]`を使って見出しのようなものを使っています。

そういう時にちょっと困ったので書きます。

結論はタイトルの通り`[]`は使わない方が良いって話です。

### この記事でわかること


- Outlookメールの件名に使わない方が良い文字が分かる
- 【】を使うのがおすすめ


### この記事の対象者
<!--
誰に向けた記事なのかを明確にすることで読者に選んでもらいましょう。
-->

- メールベースでコミュニケーションを取っている組織・人
- メールをきっかけに自動化をする人


### 動作環境・使用するツールや言語

- Windows10
- デスクトップ版 Microsoft365 Outlook 2302



## 何が起こったのか
<!--
章全体の要約や、何について書くのかをここに書きます。
記事が長い時や資料として作るときは番号を振ることをおすすめします。
章を増やすときは章から項までをコピーしてください。
-->



### 保存したいメールの件名

- [御見積書]○○案件

これをローカル等に名前を付けて保存してみましょう。

### 保存されたメールの件名

- 御見積書○○案件.msg
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755504/a5e23658-319d-9cb3-000c-83c72e1bf675.png)

御見積書を挟んでいた`[]`が消されてしまいました。

## 何が嬉しくないのか

受信したメールと保存されたメールのファイル名が違うことで思いつくことが大きく2つあります。

### 自動化面

- 受信したメールの件名でファイル操作をしようとした場合、失敗する


### ビジネス面
- 区別のために分けた`[]`がなくなることで件名が**混じって**しまう

## 代わりに"【】"を使う
色々考えた結果、日本語環境では**隅付き括弧**`【 】`を使った方が良さそうです。

[隅付き括弧の意味](https://www.weblio.jp/content/%E9%9A%85%E4%BB%98%E3%81%8D%E6%8B%AC%E5%BC%A7)
[隅付き括弧とは](https://e-words.jp/w/%E9%9A%85%E4%BB%98%E3%81%8D%E6%8B%AC%E5%BC%A7.html)


## 他に使わない方が良い記号

件名に色々突っ込んで保存してみました
```diff_markdown
受信したメールの件名
  +-=:!@#%^&;_/?()[]{}\

名前を付けて保存したファイル名 
  +-!@#%^;_(){}
- =:&/?[]\

```


### Windowsで許されていない記号

以下の記号はWindowsでファイル名として許されていないので保存するときも自動で消えます。

- =
- :
- &
- /
- ?
- \

[リンク先](https://learn.microsoft.com/ja-jp/windows/win32/fileio/naming-a-file)の記号は使わない方が良いでしょう。


### Outlook特有

本記事で対象にした`[]`はファイル名として許されていますがOutlookで保存しようとすると消えます。

- [
- ]


## どうしてこうなるのか

調べてみましたが正直あんまりよく分かりませんでした。
Outlookの検索フィルター内で使用されている記号であるため保存時に消される……？


https://learn.microsoft.com/en-us/answers/questions/1164525/searching-o365-mailbox-for-all-messages-which-dont

https://learn.microsoft.com/en-us/purview/ediscovery-keyword-queries-and-search-conditions?view=o365-worldwide#special-characters

https://answers.microsoft.com/en-us/outlook_com/forum/all/the-square-brackets-are-not-allowed-in-the-email/fd242733-7d36-4a72-b12e-9f973ad7a98f


## WEB版ではどうなるのか

`Outlook on the WEB`でもメールのローカルへの保存が可能です。

予想ではどっちもOutlookなんだから同じように`[]`は消えるはず

…

……


<img width= 350 alt="メール" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755504/5ebdc325-f252-da47-1db4-cd5c631f5fdc.png">


**付いてるじゃん！！！**

ちなみに、`\`などは`_`に置換されます。

## おわりに
取引先がどんな環境か分からないのでメールの件名は`【 】`で囲みましょう。
原因をご存知でしたらコメント欄で教えてもらえると嬉しいです。
新社会人が読むべき、初心者からRailsを始めて三ヶ月が経った人間の日記①

## 注意
仕事をやめ実家に帰ることとなった際、
兄に誘われた事をきっかけにRailsをやり始めた。
プログライミング？何それ？からの三ヶ月です。
つらつらと自分が分かった事、知ったことを羅列しておきます。
新社会人に教えていて、こいつどこでどうつまずいるのかよくわかんないなって思っている人は、何かの参考になるかも知れません。
※誤った情報もあるかも知れません。
# 学んでいった過程
### エンジニアにはインフラ、システム、フロントエンドなどがある。
・インフラエンジニアはシステムやインターネットを使用するために必要なサーバーやネットワークを開発、運用できるようにする仕事
・システムエンジニアはインターネット内のシステム全体の開発、設計をする仕事
・フロントエンドエンジニアはwebサイトやアプリの見た目を開発、設計をする仕事
webページで言うと、ログインしたり、お気に入りをしたり、投稿された動画が並ぶような開発をするのがシステムエンジニア、
それの見た目をしっかり作るのがフロントエンドエンジニア、
インフラエンジニアがいるからそのインターネットが使えてる。
そう言う認識です。
### 言語だのフレームワークだの
お前はRailsをやるんだと言われhtml、SCCの学習動画を渡された。
俺はhtmlじゃなくてRailsをやるのではなかったのか？
後々その意味は少しずつ分かっていった。

・html含めマークアップ言語
文書や意味をコンピュータで表現するための言語のイメージ
おっきめの字で表示するとかここを押すとここに行く的な感じ
・Ruby含めプログラミング言語
コンピュータに指示をして実行させる言語のイメージ
これを保存して次の一覧に追加する的な感じ
・フレームワークとは枠組みのこと
プログラミング言語とマークアップ言語だけで無理やり組み上げることも出来るけど、
本人でも見返してどこに何があるかも分からなくなる。
効率的でやりやすい枠組みを作ってそれに準じて開発をする。そのためのもの。

つまりRailsとはRuby on Rails、Ruby言語を用いたフレームワーク。
普通にhtmlなどもその中で使用できる。
そしてhtmlを知らなければまずシステムエンジニアですらない。

### html、CSSの解説動画を見ながら実際にやりながら思ったこと
こう入力するとこう表示される実際にやってみて、出来る。
出来ない<-しっかり見直すと誤字脱字を見つけられる。の繰り返し
全く同じものを同じように記述して作っているだけなの講義の内容で引っかかるところもない。
CSSのここを変えるとここが動くっていう理解が大変だった。
説明の少なかったタグやら属性関係が気になって調べた。
#### id、class、nameの使い分け
idはそれ一つに与える属性
classは複数のものに与えてCSSなどでいっぺんに反映させたりする。
nameは明確な決まりがない。idとclassが後からできてそれまでは全部nameでやっていた。
#### p、div、spanの使い分け
pは改行プラス一行空白
divは改行
spanは改行せず表示する
#### th、td、trとは
テーブル内でのタグ、
thはテーブルのヘッダー <-字が太くなる[商品名] [商品番号]みたいな
tdはテーブルのデータ <-　　　　　　　[レモン] [52番] みたいな
trはテーブルの列　<- thやtdの改行のために使う
```html
<table>
    <tr>
        <th>商品番号</th>
        <th>商品名</th>
    </tr>
    <tr>
        <td>52番</td>
        <td>レモン</td>
    </tr>
</table>
```
### Rubyの解説動画を見て思ったこと
一番初めに動画を見てて思ったことは、
htmlで出来ることをなんでわざわざRubyの書き方でやらなきゃいけないんだろう。
です。Rails上でhtmlを使っている箇所があるのは見たときに知っていたので、
urlをlink toで飛ばしているけど、hrefで飛ばしても一緒じゃないかとか、
思いながら動画を見ていた。この時は実際にやってみる環境がなく、動画を見てなんとなく理解をしていった。
実際に何も作っていないので、出来るようになっていってるのか実感が湧かない。
なんとなく情報だけ食べていた。
### Railsの環境設定の解説動画を見て
シンプルに環境設定のやり方が分からない。
動画を見て全く同じように作業しても、機能しない。
兄に聞こうにも何がどうなってどこで動いてないか分からない。
何も分からない。そして今もこれに関しては分かっていない。
古い動画だから今同じ環境で出来ないのか理由も未だ謎に包まれている。
Railsの環境設定が出来ないため、兄からprogateでの勉強を勧められる。
### progateでの勉強
勉強ができる。答えがある。環境がある。幸せを噛み締める。
が、これは決まったものを実際に作っているだけ。
つまるところのRuby on Rails on progateって感じ。
すべての課題を終わらせるころ、兄に教わりdocker、sequel ace、をダウンロードした。
 Git hub、Qiitaのアカウントも作った。
 言うにこの環境だけ揃えればPC下で環境設定をせずともRailsが出来るようになるとの事。
 実際に出来るようになった。ありがたい。
### 　<-to be continued 次回Railsやり始めます。
AWS Control Tower の概要

### なぜこの記事を書くのか？
- AWS Control Tower がAWS-SAA の試験問題に含まれていて、全く内容を理解できなかったから、復習のために書きました

#### なにが分からないか？

Q:AWS Control Tower の機能は、AWS Organizations やAWS Config などのサービスで代替できるのに、なぜそうしないのですか？
A:AWS Control Tower は、組織全体のガバナンス、セキュリティ、コスト管理を自動化するのに役立つ強力なツールです。柔軟性には欠けますが、マルチアカウントでの管理コストを明確に削減できます。

AWS Control Tower は、AWS Organizations に似ています。何が違いますか？
A：AWS Control Tower はマルチアカウント環境のセットアップを自動化するマネージドサービスです。AWS Organizations は複数の AWS アカウントを 階層構造 で管理するためのサービスです。

AWS Control Tower で実現できること
- ログ集約
- コントロール適用
- 通知
- ID 一元管理
- AWS アカウント作成とプロビジョニング
【ChatGPT＋DALL-E3】X-Twitterでの企画その２終了しました。


　どうも、カーブミラーです。

　今回は、X-Twitterで募集していました企画（その２）を終了したご報告です。ちょっと愚痴っぽくなってるかもしれません🙇

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　ニュースは
　　ないので、本題に。

　金土日と
　　X-Twitter上で
　　　募集していました企画ですが、
　　　　無事に終了しました。
　　　　　ありがとうございました🙇

　24名様という人数の方々に
　　ご参加いただき、33枚の応募が
　　　ありました。

　うち、
　　失格が二枚あり、
　　　一枚はネタ枠狙い
　　　一枚は裸同然
　　　　という理由でした。
***
　ここから
　　愚痴？モードです😅

　しかし、
　　全体的に
　　　平々凡々な
　　　　個性のない服装が
　　　　　目立ちました。

　配色もダークなものが多く
　　（それを否定するわけではなく）
　　　服の組み合わせで
　　　　失格回避しているところが
　　　　　ありました。

　普段着であればOKでも
　　ファッション雑誌に載せるには
　　　心許無いと言わざるを得ません。

　また、
　　服装の説明も
　　　書き添えて欲しかったのですが
　　　　書いてくださったのは
　　　　　一部の方だけでした。

　これは画像生成AIに
　　特別な指示は
　　　していなかった証拠でしょう。

　画像生成AIは
　　無造作な指示でも
　　　それなりに描画してくれます。

　その弊害かも
　　しれませんね。

　詳細説明をしないと
　　ガチャ要素が入り込む原因に
　　　なるのですが……

　もちろん、
　　それを頼りにする場合も
　　　多々ありますし、
　　　　一概に悪いわけでも
　　　　　ありません。

　ですが、
　　ガチャに頼って
　　　作品作りするのは
　　　　間違っている気がします。

　それが
　　あなたの作品なのか、と。

　意見は
　　分かれると思います。

　あくまでも
　　私の意見ですしね。

　あなたは
　　どういう意見を
　　　お持ちになりますか？

　一度、考えてみても
　　いいかもしれません。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
![1712541654484.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/ed3daf1a-afe5-c4ee-a420-37730c5a3027.jpeg)
理解できない問題に直面した際

シンプルですが基本情報の勉強をしていて思ったことがあるのでメモ。

例えば「SOA（サービス指向アーキテクチャ）」を理解しようとする時、
 
まず、SOA（サービス指向アーキテクチャ）とは...
 
ビジネスプロセスを効率化するためのアプローチの一つで、ソフトウェアの構造を独立したサービスの集合として設計することを指します。このアーキテクチャスタイルでは、各サービスは特定のビジネス機能を提供し、他のサービスとの間で疎結合を保ちながら相互に通信できます。


とのこと。はぁ！？　ビジネスプロセス？サービスの集合？アーキテクチャスタイル？意味わからん。。。

ってなる時は大体、対象の事柄（今回ならSOA）を理解する上での前提知識が足りていないことがほとんどです。

そのため、その物事を理解するためには、「必要な前提知識は何か」をまず把握し、それを理解し、その後に対象の物事を理解するようにすればOKです。時間がかかるように見えますが知識の定着という意味では近道でしょう。

さて、SOAを例にとった場合、必要な前提知識は下記です。
※何を事前知識として知るべきかはAIに聞けばOKです。

ソフトウェアアーキテクチャの基本
ソフトウェアアーキテクチャは、ソフトウェアシステムの設計計画です。これには、システムを構成する要素、それらの要素の配置、要素間の関係が含まれます。SOAもこれに該当するアーキテクチャの一種です。

モジュール性
ソフトウェアを小さく独立したモジュール（部品）に分割する考え方です。各モジュールは特定の機能を持ち、独立して他と組み合わせることが可能です。SOAでは、これらのモジュールを「サービス」と呼びます。

インターフェースとAPI（Application Programming Interface）
インターフェースは、ソフトウェアモジュールが外部と通信するための「入り口」です。APIは、他のプログラムがその機能を使うための方法を定義します。SOAにおいて、サービスはAPIを通じて互いに通信します。

ネットワークとプロトコル
SOAではサービスがネットワークを介して互いに通信します。ここでの「プロトコル」とは、通信のルールや形式を指します。例えば、HTTP（Webで使われる通信規約）やSOAP（Webサービスで用いられるプロトコル）、REST（よりシンプルなWebサービスの設計スタイル）があります。

データの交換形式
サービス間でデータをやり取りする際の形式も重要です。一般的な形式にはXML（拡張可能マークアップ言語）やJSON（JavaScript Object Notation）があります。


これを理解した後にSOAについて学び直せば理解はスムーズです!!では！！！
「絶対にミスをしない人の仕事のスゴ技BEST100」を読んでみた。（後編）

今回はこちらの記事の後半です。

https://qiita.com/nakaizumi_slj/items/6ad359ca3969d2c95299

# 本の目次
プロローグも含めると大きく分けて８章から成っています。

Prologue　「ミスしない人」 になるために
Chapter 1　仕事を爆速化する 段取り
Chapter 2　ヌケ・モレ・遅れをなくす スケジュール管理
Chapter 3　仕事をなめらかに進める コミュニケーション
Chapter 4　手戻りをなくす 書類・メールの書き方
Chapter 5　気持ちよく仕事をする しくみ作り
Chapter 6　パフォーマンスを高める 生活習慣
Chapter 7　信頼を引き寄せる ミスのリカバリー

# Chapter 4　手戻りをなくす 書類・メールの書き方
<ul>
    <li>ファイル名に数字を入れる</li>
    <li>書類を作る日とチェックする日は別にする</li>
    <li>「置換」で修正モレをなくす</li>
    <li>ビジネス文書は自動で校正</li>
    <li>「音声読み上げ」機能を使う</li>
    <li>印刷してチェックする</li>
    <li>アプリケーションを疑う</li>
    <li>1メールで1用件にする</li>
    <li>メールの誤字脱字をなくす</li>
    <li>テンプレートに秘密のメッセージを入れる</li>
    <li>宛名は単語登録する</li>
    <li>添付はメール作成の“はじめ”に行う</li>
    <li>添付するファイルを正しく選ぶ</li>
    <li>宛名を自動表示させて誤送信をなくす</li>
    <li>受信トレイをスッキリさせる</li>
</ul>

ファイル名には日付を入れる、置換で修正モレをなくすことは日頃から使用しています。
特に置換を使うとコード上の修正モレを防げるような気がしているのでおすすめです。
メールを使うことはほとんどないのですが、ファイル添付はさまざまな場面で使うので添付した後で内容が合っているのかを確認するようにしています。

# Chapter 5　気持ちよく仕事をする しくみ作り
<ul>
    <li>３つのH に注意する</li>
    <li>ヒヤリ・ハットを活かす</li>
    <li>手書きした情報は１ヶ所にまとめる</li>
    <li>ファイリング上手になる</li>
    <li>ウィンドウを並べて作業する</li>
    <li>ファイルの子分を作る</li>
    <li>USBメモリーにコピーする</li>
    <li>1 時間単位で仕事をリセットする</li>
    <li>ちょこっと片づける</li>
    <li>データはゴミ箱に捨てない</li>
    <li>スマホに頼りすぎない</li>
    <li>予定と一緒に持ち物も書いておく</li>
    <li>新幹線でも仕事をする</li>
    <li>第２・第３のデスクを決める</li>
    <li>部屋をプチリノベする</li>
    <li>誘いを断った理由を書いておく</li>
</ul>

3つのHである「はじめて」「久しぶり」「変更」には常日頃から対応できるようにしています。
新卒で入社してから、仕事に関しては「はじめて」が多かったので注意しながら仕事を進めるようにしています。
第2・第3のデスクについては仕事柄、自宅と本社以外の場所で作業は好ましくないので休日の勉強の場としてのんびり探していきたいと思います。

# Chapter 6　パフォーマンスを高める 生活習慣
<ul>
    <li>しっかり睡眠をとる</li>
    <li>目覚まし時計は２つセットする</li>
    <li>電車やバスで立つ</li>
    <li>雨の日は折り畳み傘</li>
    <li>クローゼットをスッキリさせる</li>
    <li>仕事の服は３原則を基準に選ぶ</li>
    <li>アイロンはかけない</li>
    <li>前日に荷物をまとめる</li>
    <li>なるべく平常心を保つ</li>
    <li>上手に休む</li>
</ul>

この章でできていないこととしては目覚まし時計を2つセットすることとクローゼットをすっきりさせることでしょうか。
睡眠に関しては以前記事に書いたとおりこだわっています。目覚まし時計より前に起きるので2つもセットすると解除が面倒なので使っていません。ですが、大事な時は手に届くところと手に届かないところに目覚まし時計を準備したいと思います。

# Chapter 7　信頼を引き寄せる ミスのリカバリー
<ul>
    <li>うまくいっているときほど注意する</li>
    <li>ミスした後にNG 行動をとらない</li>
    <li>クレームの初期対応を間違えない</li>
    <li>クレームには６つの手順で対応</li>
    <li>「DCAP反省文」で信頼を取り戻す</li>
    <li>ミスからアイデアを生み出す</li>
    <li>「なぜなぜ分析」で自分の弱みをつかむ</li>
    <li>自分の弱みを克服する</li>
    <li>気持ちを切り替える</li>
    <li>誇りと自信を持って仕事をする</li>
    <li>利他の心を持つ</li>
    <li>人生の優先順位を考える</li>
</ul>

自分の弱みを知るというところはまだまだ足りないと考えています。
人生の優先順位としては健康が一番です。何をするにしても健康は欠かせません。

利他の心を持つというところで大事だと思った言葉がありました。

:::note info

忙しいと目の前にある仕事で手一杯になり、周囲の人への目配り・気配り・心配りが疎かになりがちです。また、他人のために時間を割くのはもったいないと思うかもしれません。しかし、仕事には効率化していいことと、効率化してはならないことがあります。

:::

たいして助けられるほどの技術はありませんが、仕事をしながらも余裕をもって目配りをできるようにしたり、他人が困ったときに話しかけやすい雰囲気でいたりしたいです。

# 最後に
仕事の工夫は少しずつ負担にならない程度取り入れていきたいです。
この記事を読んだ方にとってミスが減る手助けになると幸いです。

### 参考・引用

https://www.asuka-g.co.jp/book/business/012295.html
New Relic API ライセンスキー の発行

# はじめに
New Relic API のライセンキーはいろんな場面で利用するため自身の復讐の意味も込めて記事にしてみました。

## ライセンスキーとは
*APM* や *Infrastructure* から収集されたデータの取り込みや*インジェスト API* の連携などに利用されるキーです。
New Relic API キー の **Type** で `INGEST - LICENSE` と表示されているものになります。
![apikey01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e1766038-b47c-fd1a-ba65-e521d10dbc73.png)

### 特徴
- 40 文字の 16 進数文字列
- 特定のアカウントに関連づけられる
- 複数作成可能


## ライセンスキーの発行

- [New Relic](https://one.newrelic.com/) へログインします。
- 画面左下から **[ ユーザー名 > API Keys ]** をクリックします。
![apikey02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/1b728adb-1f37-f300-3143-220f48442547.png)

- API Keys の画面が表示されるので右側にある **[Create a key]** をクリックします。
![apikey03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/f8c8f1cc-b6e7-230a-f7c4-30f0cca08da3.png)

- 複数の New Relic アカウントに属している場合は **Account** のプルダウンに複数リストされるため作成したい New Relic アカウントを選択します。
- **Key type** は `Ingest - License` を選択します。
- **Name** と **Notes** は任意の値を入力します。
- 入力が完了したら **[Create a key]** をクリックします。
![apikey04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/aa672a7e-f242-539a-eb03-b18502cdc9e4.png)

以上で作成完了です。

## API キーの取得
- 取得したい API キーの右端にある **[…]** をクリックし、開いたリストの **[Copy key]** をクリックします。
![apikey05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/17f68165-d247-a4d0-3e39-afbbce7b8e4c.png)


## API キー情報の変更
- 取得したい API キーの右端にある **[…]** をクリックし、開いたリストの **[Edit]** をクリックします。
![apikey06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/72784e59-b295-4bbf-7666-8b98c149a163.png)

- 情報を変更したら **[Update key]** をクリックします。
また変更できる内容は *Name* と *Notes* になります。
![apikey07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/bec0cd55-5981-4159-0e09-5da6e66d5e47.png)

## API キーの削除
- 取得したい API キーの右端にある **[…]** をクリックし、開いたリストの **[Delete]** をクリックします。
![apikey08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/52f66297-a062-fd83-bbe9-2056ac43d208.png)

- **[Delete key]** をクリックします。
![apikey09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/13047bcf-180c-3126-6641-1cb8c09e449a.png)


# おわりに
正直、単なる API キーの操作についての記事なので大した内容ではないです。
ただ、こうして記事にすることで作業ひとつひとつの確認になったかなと思います。

### 参考
https://docs.newrelic.com/jp/docs/apis/intro-apis/new-relic-api-keys/

https://newrelic.com/jp/blog/how-to-relic/api-key-generation-steps
python GUI tcl/tk　1クラスの複数ファイル分割

# 実行サンプル
tcl/tk で1つのクラスを複数ファイルに分割するサンプル。
1つのクラスが長文になった場合に可読性を良くしたいため。


# 実行環境
windows10
python3.9.5

pythonモジュール　tcl/tk

# 実行手順
python プログラムファイル.py

# ソースコード
main.py, fileB.py の2つのファイル
fileBの関数を呼び出すときは必ず　self を引数で渡すようにする

main.py
```
import tkinter as tk
import fileB

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.entry1 = tk.Entry(self)
        self.entry1.pack()
        self.entry2 = tk.Entry(self)
        self.entry2.pack()
        self.button1 = tk.Button(self, text="Button 1", command=self.func_on_pushbutton1_click)
        self.button1.pack()
        self.button2 = tk.Button(self, text="Button 2", command=self.func_on_pushbutton2_click)
        self.button2.pack()

    def func_on_pushbutton1_click(self):
        self.entry1.insert(0, "test1")

    def func_on_pushbutton2_click(self):
        fileB.zfunc_on_pushbutton2_click(self)

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()
```

fileB.py
```
def zfunc_on_pushbutton2_click(self):
    self.entry2.insert(0, "test2")

```