OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SDK for JavaScript v3 - クレデンシャル取得

# 目的

AWS SDK for JavaScript v3 で、
共有認証情報ファイル（~/.aws/credentials）と共有設定ファイル（~/.aws/config）から認証情報を取得する
[@aws-sdk/credential-providersのfromIni](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/functions/_aws_sdk_credential_providers.fromIni.html)を使用して、
MFA 設定あり profile のクレデンシャル取得
取得したクレデンシャルを使用してサービスクライアント実行

# 実装

```javascript
import * as readline from "readline";

import { GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
import { fromIni } from "@aws-sdk/credential-providers";
import { program } from "commander";

program.option("-p --profile 
", "set switch role profile");

const prompt = (query) => {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });

  return new Promise((resolve) =>
    rl.question(query, (ans) => {
      rl.close();
      resolve(ans);
    })
  );
};

const getAccountId = async (credentials) => {
  const client = new STSClient({ credentials });
  const command = new GetCallerIdentityCommand({});
  const response = await client.send(command);
  return response.Account;
};

const getCredentials = async (profile) => {
  const params = {
    mfaCodeProvider: async (serial) =>
      await prompt(`Type the mfa token for the following account: ${serial}: `),
  };
  if (profile !== undefined) {
    params.profile = profile;
  }
  const provider = fromIni(params);
  return await provider();
};

const main = async () => {
  program.parse(process.argv);
  const options = program.parse(process.argv).opts();
  const credentials = await getCredentials(options.profile);
  const accountId = await getAccountId(credentials);
  console.log(accountId);
};

await main();
```

スクリプト実行時のコマンドライン引数（`--profile <profile名>`）でprofileを指定できるようにしている
profile指定がない場合は、defaultのprofileで実行する

クレデンシャル取得関数（`getCredentials`）について、
`const client = new STSClient({ credentials: provider });`のように
`fromIni`の戻り値（`provider`）をクライアントにクレデンシャルとして指定できるが、
クライアントを生成するたびにMFA codeを聞かれるため、
`await provider()`としている

# 参考

[How to use MFA in Javascript aws-sdk?](https://stackoverflow.com/questions/64671926/how-to-use-mfa-in-javascript-aws-sdk)
NeurIPS2022の量子化論文 (5)

# 概要

この記事では、[NeurIPS2022](https://nips.cc/)の量子化論文を紹介します。[^1]
([その1](https://qiita.com/kyad/items/5138306b021299ae4ad2) [その2](https://qiita.com/kyad/items/e6207213ae9d3513d8fd) [その3](https://qiita.com/kyad/items/2259ebffa8dbe9b1a2d4) [その4](https://qiita.com/kyad/items/55a71ad4b857bbb73e52))

[^1]: 画像や数式は論文から引用しています。

# Entropy-Driven Mixed-Precision Quantization for Deep Network Design

https://openreview.net/forum?id=E28hy5isRzC

- 概要：混合量子化とネットワーク設計を同時にやる方法
- 研究機関：Alibaba, Amazon
- 新規性：DNNの能力は最大エントロピーと思うと、最終出力の$\sigma^2$と考えられる((4)式)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/6d5ad61c-1f8a-e730-7251-0d82f2dc46a3.png)
- キモ：
  (1)QE-Score. DNNを情報システムと思ってエントロピーで量子化精度劣化を測る((9)式)
  (2)QBR (Quantization Bits Refinement) でガウス分布の初期値を決める。
- 評価：従来のNASやMobileNetV2と比較した。


# GPT3.int8(): 8-bit Matrix Multiplication for Transformers at Scale 

https://openreview.net/forum?id=dXiGWqBoxaD

- 概要：巨大行列積をint8で高速化する
- 研究機関：FAIR, HuggingFace
- 新規性：巨大Transformerモデルに現れる行列積でも精度劣化しない
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/d0767bce-7436-2823-ca96-ae7ce034be3c.png)
- キモ：行列毎に量子化パラメータを変える(vector quantization)。
  Outlierは精度劣化を引き起こすのでFP16にする(99.9%はint8)
- 評価：175Bパラメータの行列積で精度劣化無し


# Redistribution of Weights and Activations for AdderNet Quantization 

https://openreview.net/forum?id=ZuSiW0EixjX

- 概要：AdderNet(積を和におきかえたネットワーク、(2)式)の量子化
- 研究機関：Huawei
- 新規性：従来と同電力で精度が高い。
- キモ：AdderNetは畳み込みの$W_x$の量子化が使えない((7)式)ので、複数のbiasで補正して重み$W$のスケールに合わせる。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/808142b9-def8-0cd4-b25b-d45e6f3555a4.png)
- 評価：ResNet, CIFAR等で調査した
BlenderでSVGを読み込み、メッシュ化する方法

詰まって、4時間ぐらい吹き飛ばされたため、個人用メモ。

# したいこと
BlenderでSVGを読み込み、メッシュ化する。すると、煮るなり焼くなり押し出しするなり、出来るようになるので例えば、SVGファイルをドラッグアンドドロップするだけで、マグネットのSTLファイルを吐き出すプログラムなどを作れる。

# ちょっとググって見る
ぴったりなページ、あるじゃないの！と思い、やってみました。

https://devpixiv.hatenablog.com/entry/2016/12/07/100000

しかし、そう簡単には行かないのが世の常。エラーが出てしまいました。つまり、出来ないよ、と言っているわけです。類似サイトにあるサンプルコードも見て回りましたが、どれを行ったとしても。やはり同じエラーが出てしまう......。大変困りました。

```
RuntimeError: Operator bpy.ops.object.convert.poll() failed, context is incorrect
```

# 解決策
このページを見つけるのに、3時間以上の時間を費やしていました。

https://blenderartists.org/t/convert-operator-fails-poll-but-works-fine-in-console/525096/4

簡単に言うと、単にselectするだけでなく、アクティブオブジェクトにしてやらないといけない、ということですね。ということで、以下のコードで想定通り動きました。

``` toMesh.py
bpy.ops.import_curve.svg(filepath=r"D:\test.svg")
bpy.ops.object.select_all(action='SELECT') //selectする
name=bpy.context.selected_objects[0].name
bpy.context.view_layer.objects.active = bpy.data.objects[name] //アクティブにする
bpy.ops.object.convert(target='MESH')
```


もっといい方法があれば教えてください。
以上。
基本的な動作を確認（ASP.NET）

# 一通りの動作を確認する。
## デバックを開始する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/628bf5b7-7806-94aa-c667-22200c8274b3.png)

## ULRの末尾に、/itemを追加し、item一覧ページを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/87b1286d-51fe-6b4f-f335-3d8d1e423e46.png)

## itemに情報を入力し、登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/3e32bb6b-6589-0cfa-3672-4bf4b44d3db5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/ec7e1642-c807-49e8-3b32-f6eba45afcdd.png)

## item一覧ページを確認すると、登録されていることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/a306ddaa-601a-52ca-fda1-37cb35d03ea8.png)

## デバッグを中止し、テーブルデータを確認しても、情報が登録されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/9170fadf-168e-af6e-8df5-2fe293ede931.png)

## 情報はいくつでも登録できることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/cd9be23a-fdff-088c-f250-31e12337a9d6.png)

## Editを選択することで、item編集ページに遷移し、情報を編集することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/c840cfe1-cc6a-6c98-9224-213f7def0b50.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/5dba1400-8ebe-53e4-8667-54da3a1a000b.png)

## Detailsを選択することで、item詳細ページに遷移し、情報の詳細を確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/ed4b3e84-50ad-7e0c-6fe8-8305fd3613b5.png)

## Deleteを選択することで、item削除ページに遷移し、登録した情報を削除することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/f21fb128-9798-9d97-3912-9353d62abb5a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/fd399771-536f-0f9e-b797-420767a7de0a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/c9f390b9-add0-e995-4832-b2011b0b1741.png)

# ヘッダー（ビュー）にitemページへの設定を行う。
## ヘッダーの詳細部分を、itemページに変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/9dbc2d4f-8d82-49e3-7601-1cabe3c65c05.png)

## Sharedにあるビューファイルから編集する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/5a5f5f8f-d252-12a0-f7f8-14a65f050435.png)

## ヘッダーが設定されている箇所を確認し、以下のように修正する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/d3f21021-4cf4-9eb9-1e20-5ba39f4f0a31.png)
並び順としては以下の通り。
"表記する名称","アクション名","コントローラー名"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/cb64a1f0-2d7b-ee5f-502c-f871a7a0acf3.png)

## デバッグし、ヘッダー部分を確認し、アクセスできることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/06da7c22-e69e-8e15-3d8b-1eb0a3102bc9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/e9fa5e3e-1e6d-9847-530f-9d375991700a.png)
Alexaの声でYouTubeのCMをスキップする

# この記事の対象
- FireStickTVでYouTubeをみている
- Echo端末でTVを操作できる
- SwitchBotを持っていない

# 本題
結論から言うと、「Alexa、FireTVで広告をスキップして」と言えばいけます。

長いので、定型アクション機能で省略するのがオススメです。

![Screenshot_20230416-154134_Amazon Alexa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179992/10f6e8eb-cb37-ea6d-d1a9-d9ad21079c51.jpeg)

# 以下、ここに至るまでの経緯
ずっと不思議だったのですが、「Alexa、広告をスキップして」と言ってスキップしてくれる時と、「すいません、よくわかりませんでした」と返される時がありまして、この差はどういう条件で発生しているんだ？？と頭を抱えていました。

検索しても、SwitchBotを使ったやり方がヒットして、CMスキップするためだけに買うのもな〜ともんもん。

ある時、もしかしたら、最後にFireTVを操作したタイミングからの経過時間が関係しているのかもしれないと思い至りました。
FireTVで操作した直後のAlexaは、命令の対象がFireTVである前提で動くのに対し、一定時間が経つとその前提がクリアされ、命令の広告が何を指すのかが「よくわかりません」になるのではという推測です。

この過程の検証として「すみません、よくわかりません」と返された時に「Alexa、*FireTVで*広告をスキップして」と明示的にFireTVを指定したところ、無事広告がスキップされましたとさ、めでたしめでたし:clap:

検索すると色んな解決策が出てくるところからして、この問題には色々な要因があるかと思いますが、N=1の解決策として置いておきます。
ChatGPTの出力フォーマットを安定させる方法について

先日ChatGPTを使ってYoutubeの台本を自動で生成して、動画を自動生成するアプリケーションを作成しました。
https://qiita.com/yunoko_gpt/items/d6fc200126627a673547

そのときに、ChatGPTによる出力のフォーマットが安定せず、様々な出力パターンに対応するための自然言語処理の実装を行う必要がありました。

しかし、少しプロンプトに工夫をすると、以前と比べてほとんどブレのない出力をしてくれるようになりました。

今回はその手法についてTips的にまとめました。

まずは今まで使用していたYoutubeの台本の構成をJson形式で出力してくれるプロンプトを紹介します。

```
I want a Youtube script to explain for the keywords. What kind of chapter titles should I use?
The output should be a markdown code snippet formatted in the following schema in Japanese:

\`\`\`json
[
  {
   chapter: string, // chapter number
   title: string // title of chapter
  },
  {
   chapter: string, // chapter number
   title: string // title of chapter
  }
]
\`\`\`

NOTES:
* Must not contain anything other than JSON.
* Response must be Japanese

スマホバッテリーの仕組みについて

```
このプロンプトのポイントは以下です。
- 命令は英語で記述する。
- Json以外の出力は出さない様に指定する。
- 出力してほしいJsonのフォーマットをきちんと指定する。

このプロンプトを使用すると、結構な頻度で指定したルールを破ってきます。
例をあげると

- Jsonのデータ以外の出力を出してくる
    - 「以下はJson出力です。」などの文章が先頭についてきたり、文末にJson形式出力の内容について説明する文章を追加してきたりする。
- Jsonの最初の書き出し方がばらばらになる。
    - 以下のように様々な形式で出力してきます。
    ```
    ```json
    
    \`\`\`json
    
    \\`\\`\\`json
    ```
- ときにはJson形式を無視してくる
    - 箇条書きで出力してくるときもありました。


これらのバラバラな出力を安定させるプロンプトは以下です。


```
I want a Youtube script to explain for the keywords. What kind of chapter titles should I use?
The output should be a markdown code snippet formatted in the following schema in Japanese:

\`\`\`json
[
  {
   chapter: string, // chapter number
   title: string // title of chapter
  },
  {
   chapter: string, // chapter number
   title: string // title of chapter
  }
]
\`\`\`

NOTES:
* Must not contain anything other than JSON.
* Response must be Japanese

スマホバッテリーの仕組みについて

\`\`\`json
[
  {
   chapter: 
```

追加したのは最後の一箇所だけです。

```
\`\`\`json
[
  {
   chapter: 
```

この部分は指定したフォーマットの書き出しの部分です。
この書き出しの一部を最後に示してあげることで、以下のような出力が安定して返ってくるようになりました。

```
1,
title: "スマホバッテリーの仕組みとは"
},
{
chapter: 2,
title: "リチウムイオン電池の仕組みとは"
},
{
chapter: 3,
title: "スマホバッテリーの寿命を延ばす方法"
},
{
chapter: 4,
title: "スマホバッテリーの充電に関する注意点"
}
]
```

出力された文字列と、書き出しの一部の文字列を結合させれば、きちんとしたJsonフォーマットでデータを安定して扱うことができます。

この様に出力の書き出しを少し書いてあげることで、その書き出しに沿った出力が予め設定されたフォーマットどおりに出力されるようになります。

この方法は他にも出力を安定させたいときに応用できると思い、記事にしました。

ChatGPTの出力をプログラムに組み込むときに助けになればと思います。
Virtual Box 上仮想マシンに構築したZabbixに接続する


## システム要件

- OS : Ubuntu Server 22.04 LTS
- Oracle VM Virtual Box 6.1

## 1. Virtual Box 設定

アダプタアドレス確認
```
#ip addr
``` 

コマンド結果
```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:7a:7e:75 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 84330sec preferred_lft 84330sec
    inet6 fe80::a00:27ff:fe7a:7e75/64 scope link
       valid_lft forever preferred_lft forever

```

**◆設定①　アダプタの追加**

設定 > ネットワーク　>　アダプタ2　を選択

割り当て : ホストオンリーアダプタ

以下が追加される

```
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:26:1b:36 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 metric 100 brd 192.168.56.255 scope global dynamic enp0s8
       valid_lft 332sec preferred_lft 332sec
    inet6 fe80::a00:27ff:fe26:1b36/64 scope link
       valid_lft forever preferred_lft forever
```

**◆設定②　ポートフォワード設定**
設定 > ネットワーク > アダプタ１　を選択

割り当て : NAT

ポートフォワーディング : ホストポート:任意　ゲストポート : 5432


## 2.コンフィグファイル

DHCPでIPアドレスを取得する
```
# vi /etc/netplan/00-installer-config.yaml
```
```
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
    --追記--------------
    enp0s8:
      dhcp4: true
    -------------------
  version: 2
```

ネットワーク有効化
```
 ip link set enp0s3 up
```

## 3.Zabbix画面にアクセス

```
http://192.168.56.101/zabbix ※IPアドレスは設定⓵で確認したアドレス
```

ホスト：localhost

ポート：ポートフォワーディングで設定したホストポート
AWSのタグ機能について

### タグとは
AWSリソースに付与できる管理情報
* AWSが自動で付与するタグ（aws:~）
* ユーザが作成するタグ（Nameタグなど）50個までの制限
* 大文字・小文字は区別される

### タグをつけるメリット
* 検索
* 管理
* フィルタリング
* タグごとにコスト計算やリソースやポリシー管理などが可能。

# 根本的な考え方
* 機密情報をタグ付けしないこと
* タグを持続的に管理するための戦略を立てること（タグ付けルールを徹底する）
* タグはシンプルなほど良い。継続的に見直すこと。

# どのような命名ルールとすべきか
* すべて小文字がおススメ（大文字小文字で迷わせない）
* 区切り文字をルール化する。（ドット・ハイフン区切りにするなど）

# Billingでの利用
* タグをコスト集計対象にするには？
⇒Billing→コスト配分タグにて、集計対象としたいタグを「有効化」する。
* タグごとに課金額を集計
CostExplorerを起動し、グループ化の条件でタグを選択する。

# タグの一括管理
Resource Group&TagEditor→タグ付け→TagEditor
にて、タグ付け対象のリソース検索し、タグ付けや編集ができる。
Word for Macで行番号を表示

原稿をWordで書くことが増えている。そういうときは行番号を表示させたくなるが、ちょっと見つけにくかったので、備忘録。

ウインドウ上部のレイアウトタブ > 行番号ボタン

ただし、ウインドウの幅が狭いと行番号ボタンが表示されないので、要注意。（これでちょっと悩んだ。）
チップマウンタソフトopenPnPのTRY2

3.設計
まずはfusion360で手配したカッティングプロッタのモデルを作る。grabcadで似たようなモデルを探す。
これとかどうか？
![1Laser Engraver.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243548/1223052e-ee55-74fc-e1fa-2551ad991488.jpeg)
https://grabcad.com/library/cnc-laser-engraver-6

こいつを参考にモデリング。制御ボードとか配線を格納するため床下を増設。レーザ彫刻機、まさかのlimit switchがなかったため取り付けパーツを3D printerで自作。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243548/2604453f-beb2-2e7b-4141-10b9130ed292.png)

設計途中でボードが到着。smoothie boardの手配を頑張ったがamazonで二度ドタキャンされたため結局アリエクでパチもん？を手配。
https://ja.aliexpress.com/item/1005004002719012.html?spm=a2g0o.order_detail.order_detail_item.3.54281691IKUDcN&gatewayAdapt=glo2jpn
ボード名は"Microsmtpnpboard"。単語の切れ目が区別されてないのに東洋感が出てる気がする。ググるとこのlinkしか出てこねえ。link切れで全ての情報を失ってしまうことがわかったのでスクショも記録しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243548/f2f2a99d-3340-d1b3-f686-55c4c19e7dcd.png)
上記スクショのファームウェアのダウンロードページ。
https://makr.zone/smoothieware-new-firmware-for-pnp/500/?spm=a2g0o.detail.1000023.1.1aa25ca9RmfSLy
結線図の画像も保存↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243548/9812eb89-a024-46c2-fd2e-e9bf6b73500a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243548/5b598022-1584-38f7-b8f9-25e0094197f7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243548/f735a7d0-3e40-5ac5-d840-5155d75a1272.png)
規模がデカいとファームウェアもSDで読み書きするんだなあ。
この結線図によると上のCAD画面に不足しているハードは
リミットスイッチX,Z
ソレノイド２つ
真空ポンプ
24V電源
N1、N2軸（N1,2はツールのA軸、回転方向だと推定）
リミットスイッチにXYZしかないのは謎。A軸も原点必要じゃないんですかね。作っていけばわかるやろ。ガバガバである。
リミットスイッチはXY共通とした。別々で作るのめんどいもんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243548/b5b14ebf-ef81-229a-b5af-65942470aa79.png)
CNCの基本設計はできた。次はカメラをつけますか
配列を使って値を検索する速度の比較

ある2つの値のペア`$x,$y`が、最初に与えられた複数のペアのデータの中に含まれるかどうかを検索したい時
最初のデータを`$arr`に格納しておくとする。

### 方法１
```php
function check_element_exists($arr, $x, $y) {
    for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i][0] == $x && $arr[$i][1] == $y) {
            return true;
        }
    }
    return false;
}
```

この方法は配列の要素数が多い場合、処理に時間がかかる。

### 方法2

```php
function check_element_exists($arr, $x, $y) {
    return isset($arr[$x][$y]);
}
```

isset関数を使って要素を探索する場合には、要素の有無を高速に判定することができる。

### 検証方法

microtime関数で実行時間を比較してみる。
コードは、chatGPT先生にご協力いただいた。

```php
<?php

function check_element_exists1($arr, $x, $y) {
    for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i][0] == $x && $arr[$i][1] == $y) {
            return true;
        }
    }
    return false;
}

function check_element_exists2($arr, $x, $y) {
    return isset($arr[$x][$y]);
}

// 検証用の多次元配列を生成する
$arr = [];
for ($i = 0; $i < 1000; $i++) {
    for ($j = 0; $j < 1000; $j++) {
        $arr[$i][$j] = rand(0, 100000);
    }
}
$arr[123][0] = 500; // 存在する要素を設定する
$arr[123][1] = 500; // 存在する要素を設定する
$arr[500][500] = 12345; // 存在する要素を設定する

// 方法1を実行する
$start_time1 = microtime(true);
$result1 = check_element_exists1($arr, 500, 500);
$end_time1 = microtime(true);
$elapsed_time1 = $end_time1 - $start_time1;
var_dump($result1);
echo "<br>";
echo "方法1: " . $elapsed_time1 . "秒<br>";

// 方法2を実行する
$start_time2 = microtime(true);
$result2 = check_element_exists2($arr, 500, 500);
$end_time2 = microtime(true);
$elapsed_time2 = $end_time2 - $start_time2;
var_dump($result2);
echo "<br>";
echo "方法2: " . $elapsed_time2 . "秒<br>";

?>
```

#### 結果

```
bool(true)
方法1: 3.6001205444336E-5秒
bool(true)
方法2: 2.8610229492188E-6秒
```
テスト駆動開発について図解したら、概要は理解できた（TDD：Test DrivenDevelopment）

# **テスト駆動開発とは**
テスト駆動開発（TDD）は、ソフトウェア開発のアプローチの一つで、プログラムの要件を満たす品質の高いコードを記述することを目指します。開発者は、最初にテストケースを作成し、そのテストが失敗することを確認します。次に、テストが成功するようにコードを実装し、リファクタリングを行うことでコードの品質を維持・向上させます。このアプローチにより、****開発者は実装要件を明確に理解し、コード設計を効率化****できます。

※[ソフトウェア開発プロセスについて （Software Development Process）](https://qiita.com/sakaki_developer/items/5652292c0d503ecd4b61)を読んでから、読んでいただくと概要が理解できます。

# **テスト駆動開発のプロセス**

テスト駆動開発（TDD）は、以下のプロセスで進められます。
1. ****テストを書く****：新しい機能に対してテストケースを作成します。
2. ****テストを実行する****：テストが失敗することを確認します。これにより、新しい機能がまだ実装されていないことを確認できます。
3. ****コードを書く****：テストが成功するための最小限の実装を行います。この段階では、テストを通すことが目的です。
4. ****テストを再実行する****：テストが成功することを確認します。これにより、実装した機能が要件を満たしていることを確認できます。

5. ****リファクタリング****：コードの改善と綺麗にするための作業を行います。リファクタリングにより、コードの可読性や保守性が向上します。

6. ****上記のステップを繰り返す****：新しい機能や変更が必要になった場合、同じプロセスを繰り返して実装します。

このプロセスにより、開発者はコードの品質を維持しながら効率的に新機能を実装できます。また、TDDは既存のテストケースを活用することで、迅速なフィードバックを提供し、回帰テストを効率化します。

# **テスト駆動開発のプロセスの流れ**

TDDのプロセスの6ステップ

1. テストを書く
2. テストを実行（失敗を確認）
3. コードを書く（最小限の実装）
4. テストを再実行（成功を確認）
5. リファクタリング
5. 上記のステップを繰り返す

```mermaid
graph TD
A(テストを書く) --> B(テストを実行)
B -->|失敗を確認| C(コードを書く)
C -->|最小限の実装| D(テストを再実行)
D -->|成功を確認| E(リファクタリング)
	E --> F(次の実装へ)

```

# **まとめ**

テスト駆動開発（TDD）は、品質の高いコードを記述することを目指したソフトウェア開発のアプローチです。

TDDを適用することで、開発者は品質の高いコードを記述し、プロジェクト全体のコード品質を向上させることができます。

下記Udemyの講義はわかりやすくオススメです！
https://www.udemy.com/course/cs-tdd01/
>[ソフトウェア開発プロセスについて （Software Development Process）](https://qiita.com/sakaki_developer/items/5652292c0d503ecd4b61)
prisma を windows で使うためには Microsoft Visual C++ 2015 Redistributable が必要である


Windows で [Prisma](https://www.prisma.io) を使おうとしたら、`db push` も `db pull` もできなくて困った。
[Microsoft Visual C++ Redistributable 2015](https://www.microsoft.com/ja-jp/download/details.aspx?id=52685) をインストールしたら解決した。

### エラーメッセージ
以下のような簡素なエラーメッセージなので、すぐに原因を特定できなかった。

```
npx prisma db push
Error: Error in migration engine.
Reason: 
```

```
npx prisma db pull
Error: Migration engine exited. Error: Command failed with exit code 3221225781
```

### System Requirements

Prisma の System requirements に書いてある。
https://www.prisma.io/docs/reference/system-requirements#windows-runtime-dependencies
ソフトウェア開発プロセスについて （Software Development Process）

# ソフトウェア開発プロセスとは(Software Development Process)

ソフトウェア開発プロセスとは、ソフトウェア開発を進めるための一連のプロセスや方法のこと。
開発プロセスは、アイディアから最終的な製品までのフローを整理し、品質の高いソフトウェアを効率的に開発することが可能になる。
※間違っていることなどコメントにてあれば教えて頂けると助かります。

# ソフトウェア開発プロセス一覧

各ソフトウェア開発プロセスと人気度を以下の表にしました。
結構知らないパターンが多く存在ありました。

| 開発手法 | 説明 | 人気度 |
| --- | --- | --- |
| ウォーターフォールモデル | 開発プロセスをフェーズに分けて、各フェーズが完了してから次のフェーズに移る形式で進めるモデル。一度進めたフェーズに戻ることができないため、変更には強くない。 | 低 |
| アジャイル開発 | 顧客とのコミュニケーションや柔軟な変更対応などを重視する開発手法。ウォーターフォールモデルよりも短い期間でリリースすることができるため、需要が高まっている。 | 高 |
| スクラム | アジャイル開発手法の一つで、開発チームが自己組織化し、定期的なスプリントと呼ばれる開発期間を設定して、短い期間でリリース可能な製品を開発する手法。 | 高 |
| リーン開発 | 顧客価値を最大化し、ムダを排除することを目的とした開発手法。開発プロセス全体を見直し、現場での改善を繰り返すことで、効率的かつ品質の高い製品を開発する。 | 中 |
| エクストリーム・プログラミング | アジャイル開発手法の一つで、チームのコミュニケーションや、短い期間でリリース可能な製品を開発することに重点を置く。テスト駆動開発、リファクタリングなどが特徴的。 | 中 |
| テスト駆動開発 (TDD) | テストコードを先に作成し、そのテストコードを成功させるための最小限のコードを書いていく開発手法。コード品質を向上させ、保守性や拡張性を高めることができる。 | 中 |
| デボプス | 開発（Development）と運用（Operations）を一体化し、開発から運用までのプロセスを効率化するための取り組み。コードの変更から本番環境への反映までの流 | 高 |

※ChatGPT4.0にて、一般的な傾向や感覚に基づいています。私の知識は2021年9月までの情報に基づいているため、最新の人気度を正確に把握することはできはありません。
おそらく、検索数やポジティブな記事に基づいて分析しているのでは 

# 最後に

近年、日本でもアジャイル開発が注目されていますが、一部の企業やプロジェクトではまだウォーターフォールモデルが利用されています。ウォーターフォールモデルは、予測可能で変更が少ないプロジェクトには適していますが、現代のソフトウェア開発では変更や不確実性が多く、ウォーターフォールモデルが適切でない場合も多い。。

ウォーターフォールモデルは、保守性や拡張性の点で問題があるとされています。これは、各フェーズが一度完了すると戻ることが難しいため、後から変更を加えるのが困難であることが原因です。このような状況では、アジャイル開発や他の柔軟性のある開発手法が有益。

日本のソフトウェア業界は、アジャイル開発や他の最新の開発手法を取り入れることで、開発速度や品質を向上させることができるでしょう。ただし、開発手法を変更する際には、チームのスキルや経験、プロジェクトの要件などを考慮し、適切な手法を選択することが重要そうですね。

>[Software Development Process](https://en.wikipedia.org/wiki/Software_development_process)

>[ChatGPT4.0](https://openai.com/)
某パブリッククラウド利用時に苦労した点について

# はじめに
（だいぶ前の話になりますが）とあるグローバル案件に参画していた際の出来事です。当時某国にもシステムを展開する必要があったため、現地の某パブリッククラウドサービスで環境を構築しました。当時の某クラウドはAWSなどの主流クラウドほど信頼性や可用性が高くなく、機能も充実していなかったため、苦労する点が多々ありました。今回は一番印象的な出来事を紹介しようと思います。

# 前提
- 某クラウド上で構築したインフラは基本的に全部Terraformで管理している

# ユーザー管理のリソースが勝手に再作成される
## 契機
- インフラリソースのアップデートを行うため、Terraformコードを追加し、terraform planを実施した

## 事象
- plan時にsdk errorが発生。エラー内容としては、一部のリソースが実機に存在しないと表示された
- 該当リソースはアップデートを行うリソースとは関係のないリソースで、今まで問題なくTerraformで管理できていた

## 原因
- 調査を行った結果、tfstate上の該当リソースのuuid（リソースを一意に識別するid）が実機値と一致しなくなったことが判明した
- ユーザー側が該当リソースに対してアップデートを行なっていないため、某クラウドのサポートに問い合わせをすることに

## 問い合わせの結果
- 某クラウドプロバイダー側が該当サービスに対して実施したアップグレードによって、ユーザー管理のリソースが再作成されたことが判明した
- 再作成によってリソースのuuidがtfstate上の記載と乖離が乗じ、planが通らなくなった

## 対応
- 再作成されたリソース一覧を整理し、古いリソースのstate rm＆新しいリソースのstate importを実施（ちょっとしたスクリプトを書いたがリソースが大量にあったので結構時間がかかった）
- 某クラウドプロバイダー側が上記作業を実施してくれないのでユーザー側で実施した

## （私が考えた）根本原因
- アップグレードに関する事前周知漏れ
    - そもそも某クラウドプロバイダー側による事前周知がなかった
- アップグレードによる影響の調査不足
    - 某クラウドプロバイダー側が影響の調査を十分に行わずにアップグレードを行なった
- サービス自体の設計がよくない
    - なぜアップグレードによってリソースが再作成されなければならないかが不明

# おわりに
普段AWSなどの主流パブリッククラウドサービスしか使っていない方には、「こんなこともあるよ」ということをぜひお伝えしたくて本記事を執筆しました。いかがでしたでしょうか！
ChatGPTについて考える (6) どう向き合うか

これまで、「[ChatGPTについて考える](https://qiita.com/ryokan/items/0e65dfa1cffa2cbd3ddb)」の一連の投稿で、ChatGPTが言語学で対象としてきた範囲のどれだけをカバーされているのかを考察してきました。単語[(3)](https://qiita.com/ryokan/items/167150759eaca504ad57)とオントロジー (辞書知識体系)[(1)](https://qiita.com/ryokan/items/17113cbb01545e181799)、 論理[(4)](https://qiita.com/ryokan/items/8e22edae0ab1a7803cd0)、語用論その他[(5)](https://qiita.com/ryokan/items/6ed345c7a27a18c4765b)、主要なところはすべてカバーされているようにみえます (統語論、意味論については洞察するまでもないと思い項目をあげていません)。しかも、処理対象と処理内容を適切に分離でき[(4)](https://qiita.com/ryokan/items/7f28cd6673b9ed1d721d)、処理内容を適切に意味解釈し、語用論で示したように直接的ではない指示をくみ取って処理を行えるように見えることから、これってもうAGI (汎用人工知能) じゃね? と考えるのも理解できます。

それではこれからChatGPTとどう向き合っていけばよいのでしょうか。

ここには、ChatGPTの能力を認めて使う、使い倒すという立場と、メカニズムを調べるという立場が考えられます。

それぞれ考えていきたいと思います。

## 使う立場

### もっと知識を蓄える

今でも十分使えているように見えますが、規模を大きくする = もっと知識を蓄えることでさらに有用なものにすることができると思います。与える知識を精査する必要があるので、ここはOpenAIに任せるのではなく、コンソーシアムや標準化団体が主導する必要があるかもしれません。Wikipediaのようなオープンなクラウドソーシングではガバナンスが十分でない恐れがあります。

知識の中には、オントロジー (辞書的知識) も必要と思います。[(1) 記号処理と単語ベクトル](https://qiita.com/ryokan/items/17113cbb01545e181799)のところで、「これまで構築した語彙体系が使えないことになりました。ChatGPT (GPT) で上位下位関係を教えていけばよいのかもしれません」と書きましたが、、「シャーロット王女は子どもである」という辞書的知識を使っている [[(4) 論理](https://qiita.com/ryokan/items/8e22edae0ab1a7803cd0)] のですから、「〜は〜 (の下位概念) である」と言うような知識をため込んでいくといくということです。オントロジーのようにきっちりした体系でなくても、このような関係の集合体があれば使えるものと思います。

### 答え方を教える

一方、知らないことに関しては嘘を言うということがChatGPTの欠点として認識されていて、それに関してはGPT-3の時と変わっていないようです。

私自身はよく知っているけれども、ChatGPTは知らないであろうことを聞いてみました。→　うえぶろぐ.info BizTech 「[ChatGPTで遊ぶ (1) エゴサーチ](https://ueda.ueblog.info/2023/04/chatgpt-1.html)」

「知らないことは知らないと言ってよいです」と補足しても量が減るだけで根幹は変わっていませんし、エビデンスを示せと言ったら次から次にうそのURLを提示してきました。

やり方はわかりませんが、学習方法を改めないといけないと考えます。

## メカニズムを調べる

GPTの内部動作、メカニズムを分析することが、我々の認知過程の理解につながらないかと思います。

画像処理で深層学習が主流になる前は、特徴量をどう定義するかということが性能競争の中心だったと思います。一方、深層学習では特徴量も深層学習で勝手に学習されることになり、規模のレースに写っていったと思います。その中で、中間層のパターンを解釈して、このニューロンは入力のこのパターンになんとなく反応しているみたいな解釈が試みられています。

言語においても、Transformerを使ったBERTが各タスクのリーダーボードを席巻しました。BERTを使う競争の中で、その中身を分析する研究もありました。[[Jawahar+ 2019](https://aclanthology.org/P19-1356/) では、レイヤーの浅いところに浅い知識、深いレイヤーに構文など深い知識を保持しているようだという分析をしていました。

BERTやChatGPTの基本メカニズムであるAttentionが確率付きAssoc Listみたいなものだとすると、単語を読み進める上において、Attentionの重みがどう変わっていくかを分析することが考えられると思います。Attentionの重みを分析しているものはありましたが、それを我々の認知過程とつなげて、既存の理論体系との結び付けて説明ができれば、我々の認知過程の解明にもつながると思いますし、既存の理論体系にとっても理論の強化につながると思うのです。

また、新しい知識を加わった時にそのAttentionの変わり方がどう影響を受けるのかも興味があります。

昔LRパーサーを知ったときに、次にくる単語を予測し、そしてその単語によって次の単語を予測しながら文を読む、我々の認知過程とつながるところがあるなとぼんやり思っていたことを思い出しました。

さらにその昔、構文解析のあいまいさ (ambiguity) 、慣用句など例外的な構文、単語選択のあいまいさ (vagueness) をスコアつきの木構造みたいなものでまとめて扱える枠組みがないかな、と夢想したことがあります。そのときはルールと辞書をベースにする枠組みから離れられませんでしたが、多くの例を学習すればよいというGPTのやり方をみて、こういう形で実現されるんだという感慨をもっています。
NTP ST1の起動

普通の誤家庭には4台のNTP ST1があると思いますが、起動方法をチューンしてみました。

日本では停電はめったにないのですが、4台もあると手動で立ち上げるのが面倒なので、[GPS,JJYのセンテンスをmrubyでパース](https://qiita.com/yamori813/items/7328d19399cee562f047)してdateコマンドで時間を設定後にntpdを起動するようにしました。

watchdogでリブートした場合も同じです。

ところがこの方法だと300msとか大きなオフセットがついてntpdが起動することがあり、そうすると通常運転に戻るのにかなりな時間がかかってしまいます。

停電の場合は仕方ないとしてもwatchdogの場合は、他のST1は動いているので、それを使ってあわせたほうがオフセットが小さくなります。

スクリプトはこうしてみました。

```sh
#!/bin/sh

RS=`sysctl -n dev.mtk_wdog.0.rststat`

if [ ${RS} == 0 ]; then

DATE=`/root/gettime.rb`

date ${DATE}

else

ntpdate -b 10.0.1.18

fi

ntpd -p /var/run/ntpd.pid
```

万が一ntpdateで指定したST1が落ちてるといけないので安定しているST2で合わせています。

rebootで起動した場合はこのスクリプト自体を実行せずntpdを上げないようにしています。これはntpdが上がってしまうとメモリのフラグメントが大きくなってリモートでのflashの更新(reupgrade)ができなくなるためです。

reupgrade後はrebootで上がってくるので、上がったところでwatchdogコマンドを実行して抜けると、wetchdogでresetしてntpdが起動します。

8:19にwatchdogでrebootしたグラフです。想定どうりの動きです。

![filename(11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/26877b1a-dbf7-8ae6-18c0-b52a5dc0e5d8.png)

なかなか合わないケースもありました。

![filename(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/47bb6285-5199-3e14-452c-c13bee73bc39.png)

ntpd -xで起動するようにしてみました。

![filename.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/382c3349-4685-0f2d-f720-e8f83796678c.png)

この日は16:50:01から18:10:43まで雷害回避による停波していたのですが、なぜかその後に調整が急になっています。
【Rails】hamlの導入方法

## はじめに
hamlに慣れるとerbなんかで書いていられない！
毎回hamlを導入する際に、どうやるんだっけ？となるので記事にして残しておこうと思います。

## RubyとRailsのバージョン
- Ruby 2.7.7
- Rails 6.0.6.1

## ２つのGem導入
Gemfileに下記記述
``` bash
# hamlを使えるようにするgem
gem 'hamlit'
# erbからhamlに変換する為のgem
gem 'erb2haml'
```

## bundle installする
``` bash
bundle install
```

## erb→hamlへ書き換えてもらう
下記コマンド実行
``` bash
bundle exec rake haml:replace_erbs
```
これでhamlを書く準備は整いました！

## 便利なサイト置いておきます
### erb→hamlに変換したい時
https://awsm-tools.com/html-to-haml
### haml→erbに変換したい時
https://haml2erb.org/
wsl2+DockerでhtmlフォルダをマウントしてWindowsから編集できるようにする

いつも使用する環境ではWindowsからVScodeでdocker上のlinuxファイルを開いていたのに、別環境でやろうとしたらどうしてもうまくマウントできずハマりました。自分で設定したはずなのにずっとやっていなかったらすっかり忘れていたようなので備忘録。

とりあえずwindowsのwslフォルダにマウントするには以下のような感じでOK。

```
docker run -d --name apache2-test -p 8080:80 -v \\wsl.localhost\Ubuntu-20.04\home\{user}/apache2-test:/var/www/html ubuntu/apache2
```

今回なぜか上のコマンドでマウントできなかったが、原因はWSL上でコマンドを実行していたから。つまり、Windows terminal→Ubuntuで起動したターミナルで実行していたということ。
正解はPowerShellからコマンドを実行。これでWidnowsからDockerのUbuntuのhtml内のファイルにアクセスできる。
できてしまえば簡単。こんなのでハマる人は他にいないのかも。
Googleデータアナリティクス：SQLを使ったデータの並べ替え

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/21a12cb1-a49a-802f-d903-6f68758eca0c.png" width="800">

# SQLを使ったデータの並べ替え

表計算ソフトでできることの ほとんどは、SQLでもできます。 並べ替えもその一つです。 表計算ソフトでデータ量が多すぎると エラーメッセージが表示されたり プログラムがクラッシュしたり することがあります。 それは絶対に避けたいことです。 SQL は、表計算ソフトでは 非常に時間がかかる、あるいは 不可能な処理を 短縮して実行してくれます。 

### <font color="MediumBlue">ORDER BY 句</font>

ORDER BY 句を使うと、クエリで 返された結果を並べ替えられます。 映画に関するスプレッドシートに戻って この機能を理解しましょう。 お好きな SQL ツールを 使っていただいて結構です。 おさらいすると、 これは映画のデータベースで 公開日や監督などのデータが リストアップされています。 ORDER BY 関数を使用すると このテーブルをさまざまな方法で 並べ替えることができます。 

今回の例では、公開日で 並べ替えてみましょう。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9380b121-ef13-b417-0ced-d201ceed6a98.png" width="700">

デフォルトでは、ORDER BY 句は データを昇順に並べ替えるように なっています。 このままクエリを実行すると 映画はリリース日が古いものから 新しいものへと並べ替えられます。

公開日を逆順に並べ替えて 新しいものから古いものへと 並べることもできます。 そのためには、DESC と追加した ORDER BY コマンドで 降順の指定をするだけです。 DESC です。 このクエリを実行してみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5cd7d590-c62c-da46-1e0a-8a5e317c6f98.png" width="700">

表計算ソフトでは、並べ替えと フィルタを組み合わせて 情報の表示方法を変えられます。 SQL でも同じようなことができます。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1ab52323-485f-e286-14d3-ef800f2ca31d.png" width="700">

さて、このクエリをもう一段階、 進めてみましょう。 AND フィルターを使い 一度に 2 つの条件で フィルターをかけてみましょう。 先ほどのクエリを使って WHERE 句に 2 つ目の条件を加えます。 並べ替えはそのままにします。 例えば、コメディ映画と 興行収入 3 億円以上の映画で フィルタをかけるとします。 この場合、AND 関数の後に Revenue と入力し、 収益条件を追加します。 そこから、3 億ドル以上の 収益をあげた映画のみを返すように 指定します。 これを行うには、大なり記号を入力し 次にコンマなしで 3 億の完全な数を 入力します。 さて、クエリを実行してみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4e248638-f61e-19cf-7225-dbae940b2479.png" width="700">

ここでは、データは 3 億ドル以上の 収益をあげたコメディ映画のみを表示し リリース日によって 降順で並べ替えられます。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/fee5582c-d44e-9dfa-e32a-d67de3c5ad14.png" width="700">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/94e85b8a-520e-55ac-b4eb-7a92d8410869.png" width="700">
主成分分析を用いた3次元点群の方向の解析

## 概要
3次元点群を扱う際、主成分分析を使うと色々便利なんだ、と最近知りました。今回は主成分分析を使った3次元点群の方向の解析についてまとめていきます。ちなみに、主成分分析して得た情報は、点群データの特徴量としても利用されます。詳しくは[こちら](http://precipedia.jspe.or.jp/wiki/index.php?title=点群特徴抽出)。

## 主成分分析について
主成分分析によって、N次元のデータについて、それぞれの次元の散らばりの大きさや、その方向性を得ることができます。機械学習などでは、そのデータの特徴をより表している次元だけを残す[次元圧縮](https://gochikika.ntt.com/Preprocessing/compression-PCA.html)などに使われています。

## 手順
それでは、3次元データを主成分分析する手順を示します。
### 1. 点群の平均を求めて、元の点群から平均を引いた行列を求める
```math
c=\frac{1}{n}\sum_{i=1}^{n}p_i
```
```math
M=[p1 − c, . . . , pn − c]
```

### 2. Mの共分散行列を求める
```math
C=M^\intercal M
```

### 3. 共分散行列Cを固有値分解する
```math
C=P\Lambda P^{-1} (\Lambda=diag(\lambda_1,\lambda_2,\lambda_3))
```
固有値が大きいほど、その固有値に対する固有ベクトルの方向への散らばりも大きくなります。一番小さい固有値に対する固有ベクトルは、点群データの法線ベクトルになります。以下の画像での赤線が青色の点群の法線ベクトルです。

![pca_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/0d24c1d1-dff5-fc73-f1b3-fe05ed1f5282.png)

## おまけ
上で求めた固有値の大きさを比較することで、点群データがどのような形状をしているのか(次元特徴)を把握することができます。σを以下のように置いて、

```math
\sigma_1=\lambda_1-\lambda_2,\sigma_2=\lambda_2-\lambda_3,\sigma_3=\lambda_3
```

その中の最大値を求めます。

```math
d=argmax(\sigma_k)(k=1,2,3)
```

dの値によって、その点群が線状か面状か、3次元まんべんなく広がっているのかが判定できます。
以下の画像は、点群の点iの近傍点集合N(i)に対する主成分分析を行った後、次元特徴を求めています。線を形成している点は赤色で、面を形成している点は緑色で、3次元まんべんなく広がっている点は青色になっています。
![pcl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/cefd1ea6-2f03-088d-09e2-4f236ceda3fd.png)
([参照元](http://precipedia.jspe.or.jp/wiki/index.php?title=点群特徴抽出))

## まとめ
共分散行列、何かと出てくる。

## 参考資料
- [主成分分析](http://www.sanko-shoko.net/note.php?id=cv7g)
- [点群特徴抽出](http://precipedia.jspe.or.jp/wiki/index.php?title=点群特徴抽出)
- [次元圧縮](https://gochikika.ntt.com/Preprocessing/compression-PCA.html)
ABC298回答メモ

0.はじめに
　調子が悪いせいか、問題が難しいせいか最終的にA・Bだけしか解けませんでした。
　C・Dは解説を読みながらTLEを解消するテクニックを学びなんとか解けました。

　レートガタ落ちかなーと思ったらDDos攻撃があったようで
　レーティング対象外になったようです・・・。
　この記事書いてる時も503エラーとか出ていたので
　攻撃とかつづいてるのかなー。。。


1.A - Job Interview
　いろんな解き方あるだろうなと思いつつ、以下の実装。
　　最初はフラグに0をセット。
　　一文字目から見ていって
　　　"o"かつ、フラグが0だったらフラグに１をセット
　　　　(2だった場合はより上位の不合格を上書きしないようにフラグをチェック)
　　　"x"ならフラグに２をセット
　　最後まで見終わった後
　　　フラグが１なら"Yes"を出力
　　　それ以外なら"No"を出力して終了

　https://atcoder.jp/contests/abc298/submissions/40638151

2.B - Coloring Matrix
　B問題にしてはややこしいな・・・と思いつつ考察
　　・1：最初の位置、2：90度回転した位置、3：180度～、4：270度～の4つのフラグを用意し1をセット
　　・Aの表を順番に読んでいき、1が入っていた場合、
　　　・1：A表の位置に対応するB表の値が0だったら、フラグ1に0をセット
　　　・2：A表の90度回転した位置に対応するB表の値が0だったら、フラグ2に0をセット
　　　・3：A表の180度回転した位置に対応するB表の値が0だったら、フラグ3に0をセット
　　　・4：A表の270度回転した位置に対応するB表の値が0だったら、フラグ4に0をセット
　　・最後に4つのフラグのうちどれかが1だった場合Yes、そうでない場合Noを出力して終了

　初めに答えた時、１～３までしかチェックしていなかったため
　正解せず、悩んでしまいました。　

　https://atcoder.jp/contests/abc298/submissions/40664516

3.C - Cards Query Problem
　最初、以下の考えで取り掛かりました。
　当該箱に入っているカードを管理する集合群Bと
　当該カード番号が入っている箱を管理する辞書C(キーをカード番号、値を箱番号の集合)を用意

　クエリーが1の時は
　　箱B［i］にjのカード番号をセットと
　　カードC［i］にiの箱番号をセット
　クエリーが2の時は
　　箱B［i］の内容をソートして表示
　クエリーが3の時は
　　カードC［i］の値をsetに格納して
　　ソート＆重複削除して表示

　と、単純に実装。
　はじめ、重複削除にsetを使って行いましたが
　TLEが出てしまい、工夫してもどうしても縮まらず
　コンテスト時間が終了しました。

　解説をみてもあまり自分の解答と違いがなく
　他の方の解答を見たところ集合群C自体をset型にしていて
　そのような実装にしたところ、TLEを回避できました。
　先週覚えたsetの新たな使い方を学べました。

　https://atcoder.jp/contests/abc298/submissions/40689070

4.D - Writing a Numeral
　初めは、以下の考えで実装
　　初期処理
　　　Qを入力
　　　Sを文字列で定義し、"1"をセット
　　　文字列の開始位置stに0をセット
　　メイン処理(Q回繰り返し)
　　　クエリー内容を読み込み
　　　クエリー番号が1の時
　　　　文字列Sの末尾に、xを付加
　　　クエリー番号が2の時
　　　　stに1を加算
　　　クエリー番号が3の時
　　　　文字列Sのst文字目以降をint型に変換し
　　　　998244353のmodを取り出力
　どやっと実装しましたが、4/20TLEが出てしまいました。
　以降、Sを数値にし、
　　クエリー番号1の時　SにS*10+xをセット
　　クエリー番号2の時　Sを10のlen(S)乗で割った余りをSにセット。
　　クエリー番号3の時　S％998244353を出力
　としてみたらTLE増加。

　コンテスト終了後解説を見てもやっぱりピント来ず
　他の方の解答を見て以下の工夫を加えてACとなりました。
　　・クエリー番号１・２毎にmodo値を計算
　　・クエリー番号2で先頭を削る操作用にdequeを利用

　【実装】
　　初期処理
　　　Qを入力
　　　出力用変数ansに1をセット
　　　デキューdqを用意
　　　dqに1を追加
　　　変数MODに998244353をセット
　　メイン処理(Q回繰り返し)　　　クエリー内容を読み込み
　　　クエリー番号が1の時
　　　　ansにans*10+xをセット
　　　　ansにans%MODをセット
　　　　dqにxを追加
　　　クエリー番号が2の時
　　　　xにdq.popleft()をセット
　　　　ansから、x*pow(10,len(dq),MOD)をマイナス
　　　　ansにans%MODをセット
　　　クエリー番号が3の時
　　　　ansを出力

　　クエリー2の操作とansを常にmodを取ることで
　　小さ目の数値で推移するようにすることで
　　速さを実現しているのかなと思いました。　　

　https://atcoder.jp/contests/abc298/submissions/40689991

以上
G検定向けキーワードまとめ 画像生成AIサービス

画像生成AIの各サービスのキーワードまとめ
G検定対策に役立ててください。
※日進月歩で進化してますので、情報更新予定です。

・Midjourney
2022年7月に発表された画像生成AI。
テキストの説明文から画像を作成する独自の人工知能プログラム
また当プログラムを開発している独立した研究所の名前でもある。


・Stable Diffusion
Stabirtyが2022年8月に発表した画像生成AI。


・DALL・E2
ChatGPTで世間を賑わせているOpenAIが、2021年1月にDALL・E、2022年4月には高解像度＆低レイテンシ版の「DALL・E2」が公開された。


・Adobe Firefly
Adobeが2023年3月に発表した画像生成AI。
PhotoshopやIllustratorなどの既製のAdobe製品に実装される予定。
Adobe Stockライブラリのコンテンツを利用することで、著作権問題に対応している。
ChatGPTで電子帳簿保存法改正への対応を楽にするサンプル

# 電子帳簿保存法の面倒な話

電子帳簿保存法の改正に向けてCMなんかもよく見るようになりました。

その中でなんでもファイル名を`20230416_アイデアマンズ株式会社_1000円_請求書.pdf`みたいに統一しろ、みたいな話があってガッカリというか、電子保存は実にいいと思うけど、**こんな一円の利益にもならない作業を増やして、生産性低いってそういうことだぞ**って話です。

:::note warn
法律自体はまったく詳しくないので間違ってたり他に方法あるのかもです。
:::

ほんと気が重いなと思ってましたが、ChatGPTがすごく賢いので、PDFのテキストだけでも食わせたらいい感じにやってくれないかな？と考えました。

# 検証

雑にこんなプログラムをTypeScriptで作りました。

- pdfsフォルダのPDFファイルを走査
- https://www.npmjs.com/package/pdf.js-extract でPDFからテキストだけ抽出
- プロンプトを組んでChatGPTに属性を構造データにしてもらう
- そのデータを元に別名保存と帳簿一覧を作成

さくっと作って結果を見ると…

![20230401_アイデアマンズ株式会社_400000円_見積書_pdf_—_pdf-classify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/355a6d61-2054-8f9a-b38f-b1df10f70dd0.png)


**う、動いたー！** しかも海外の帳票も解読してくれる！ 最高じゃあないっすか。

ファイルの内容を見てファイル名を打ち込むという生産性ゼロの20世紀的作業を今さら人間様がしなくて済みそうです。

# ソースコード

というわけで、雑ですがソースコードを共有します。

https://github.com/miyanaga/pdf-documents-classification-and-rename-sample

想像よりうまく行ったとは思いますが、精度があまり高くありません。発行元会社名をたまに間違えたり、実行回によって結果に揺らぎがあります。

そのあたりもいいアイデアがあればフォークして共有してもらえると嬉しいです！

# グルーとしてのChatGPT

以前、子供の勉強時間トラッカーの音声入力部分にChatGPTを使うサンプルを公開しました。

https://qiita.com/miyanaga/items/5538aabc5ac23782a97f

AIの活用は、必ずしもAI主役で考える必要はないと思っています。今のシステムもいいところがあって、人間的な認識能力が必要な部分にだけ、グルー(のり)のようにAIを取り入れていくのを考えるのが個人的には楽しいです。
PythonでOpenAI APIを実行する方法


## この記事の目的

- Python環境を作成して、OpenAI APIを実行できるようになる


## 所要時間
大体10分くらい


## 前提
 - pythonの実行環境が構築されていること

[Pythonの開発環境を用意しよう！（Mac）](https://prog-8.com/docs/python-env)

この記事を書いた際の動作環境
```
Python 3.10.4
pip 22.3.1 
```


## OpenAIのAPIKeyを発行する

[このページ](https://platform.openai.com/account/api-keys)で発行できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/79eecdd5-d672-ffec-8bb6-e38ef94b825e.png)


## ライブラリをインストール

```
pip install openai
```

## コード書いて実行
```chatgpt-api.py

import openai

openai.api_key = '[発行したAPIKEY]'

response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[
                {'role': 'user', 'content': 'ハローワールド！！'}],
                temperature=0.0,
)

print(response['choices'][0]['message']['content'])
```

実行結果

```実行結果
こんにちは、私はAIアシスタントです。どうかお気軽にお話ししてください。
```

ChatGPTくんこれから君を使い倒します！よろしくお願いします！！
という感じで、API実行できました。
次の記事でAPIの中身を見ていこうと思います！

## 参考
- [Pythonの開発環境を用意しよう！（Mac）](https://prog-8.com/docs/python-env)
- [ChatGPT API の使い方(Python) と料金を紹介。](https://chatgpt-lab.com/n/nda0de0be1774)
- [本家APIドキュメント](https://platform.openai.com/docs/api-reference/authentication)
powershellで前回のファイルから一部内容を変更し新規でファイルを作成する

# 前回作成したファイルを一部文字だけ変更したい

日付が記載された以下のファイルがあります。

```20220401niiki.txt
2022年4月1日　
今日は晴れの日だった。
```

5月1日版も同様に作成したいです。変更したい内容は以下の通り。

変更点
・「4月1日」→「5月1日」

しかし、いちいちコピーして文字を変更するのは面倒なので、powershellで一発で変更しようと考えました。


# replaceを使用する

今回使用するのは以下のコマンドです。

```
$(Get-Content "20220401niiki.txt") -replace "2022年4月1日","2022年5月1日　" > 20220501niiki.txt
```

既にある「20220401niiki.txt」を変更し、新規で「20220501niiki.txt」というファイルを出力します。
実行すると新規で作成されるファイル内容は以下の通りです。

```20220501niiki.txt
2022年5月1日　
今日は晴れの日だった。
```

変更点を変更できました。便利ですね。
複数変更する場合も調べていこうと思います。
フロントエンドAPIライブラリKy

# 概要


`Ky`は、HTTPリクエストを行うためのTypeScriptを使用したHTTPクライアントライブラリです。
`Axios`や`FetchAPI`といった他の一般的なライブラリと比べて、軽量で柔軟性の高いライブラリです。

最近そのライブラリのことを知って、エラー文言、ベースURLの設定、継承、通信リトライなど、色々便利なインターフェースが用意してあるようなので使ってみるきっかけになりました。

`Ky`の特徴：

* JSONの自動解析とシリアル化
* ヘッダーやクエリパラメータのカスタマイズ
* 組み込みエラー処理


https://www.npmjs.com/package/ky

# 使用例

よく使用されているパターンをご紹介します。

```js
// 基本リクエスト
async function getAllTodos() {
    const todos = await ky
        .get("https://jsonplaceholder.typicode.com/todos")
        .json();
    console.log(todos);
}
```


```js
// 例外処理
async function getAllTodos() {
   try {
     const todos = await ky
        .get("https://jsonplaceholder.typicode.com/todos")
        .json();
     console.log(todos);
   } catch (error) {
     console.log(error.message);
   }
 }
```

ベースURLなどを指定するための`prefixUrl`オプションが提供されています。

```js
// prefixUrlを使用
async function getAllTodos() {
   try {
     const todos = await ky
        .get("todos", { prefixUrl: "https://jsonplaceholder.typicode.com" })
        .json();
     console.log(todos);
   } catch (error) {
     console.log(error.message);
   }
 }
```

`create`メソッドを使って、`prefixUrl`オプションやその他のカスタムオプションを持つ`Ky`クライアントのインスタンスを作成だきます。

```js
// createを使用して前処理を入れる
const api = ky.create({
  prefixUrl: "https://jsonplaceholder.typicode.com"
});

async function getAllTodos() {
  try {
    const todos = await api.get("todos").json();
    console.log(todos);
  } catch (error) {
    console.log(error.message);
  }
}
```

`extend`メソッドを使用すると、元のインスタンスを継承しカスタムヘッダーなどの新しいオプションを追加したインスタンスを作れます。

```js
// 拡張（継承）を使用
const secureApi = api.extend({
  headers: {
    Authorization: "token"
  }
});
```

# 結論

Kyは、JavaScriptとTypeScriptでHTTPリクエストを行うための強力で柔軟なライブラリです。シンプルで直感的なインターフェースを提供し、自動JSON解析など、多くの便利な機能を提供しています。フロントエンドのアプリを作る際、`Ky`を使えばHTTPリクエストを小工数で簡単に作成できます。
データベース内のすべてのテーブルのカラムの値から、指定したカラム名で検索

データベース内の膨大にあるテーブルの中から、指定したカラム名がどのテーブルに含まれているかを検索する方法。

```sql
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%検索したいカラム名%'
```

指定したカラム名を含むすべてのテーブルとカラム名が表示されます。
SignateのChatGPTチャレンジ用の記事(成功例および失敗例)

## この記事は何？
Qiita初投稿の自分が、世の中的にはすでに何番煎じかわからんレベルでのビジネスにおける活用の成功例、失敗例について記載する内容となります。
（期限ぎりぎりで突貫で書いてますので、乱筆乱文失礼いたします。スミマセン。。。）

記事を書く目的となった参考サイト：
https://signate.jp/competitions/1037

## 使い方のコツ
- プロンプト(言語モデルへの事前入力情報)の構成要素を意識する。
  - 指示(Instruction):実行して欲しい特定タスク/命令
  - 背景(Context):より良い応答に導く外部情報/追加文脈
  - 入力データ(Input Data):応答を求める入力や質問内容
  - 出力形式(Output Indicator):出力タイプやフォーマット
- シンプルに始める
　- 複雑なものはタスク分割(人間と同じく、分割すれば精度が上がる)
- 指示(Instruction)を明確にする
- プロンプトの構成要素について、具体性を持たせる（例など)
## 良好事例（成功例)
- 初見の概念をざっくり可視化してもらう
　世の中って専門外の項目があったり、とりあえず勉強し始めたけど何か全くわからないものについてまずざっくり理解したい需要ってありますよね。
　そういう時に使えると思います。（ちなみに自分はAWSまるで分からないマンでしたが、とりあえず下記のようにやって、ざっくり理解しました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118161/07702fa9-6301-cd84-1f1e-517691afa41a.png)

ここで吐かれた呪文のようなものを、[ここ](https://www.plantuml.com/plantuml/uml/RP9DJi9G58NdNKN7NGLR8S610uXHDj1x4uGOX4GbmH-Y2CeFr051Gy1qCST2s8NldRRw34wQtE-TU-wvxxLmLYsULil7bLAvUE85_dRucNH72AEaNji_zRmWyFVDvUvka1vuWG7GQqWVUfbMCe5E8JFe8WDpw0Pwps-3pEfbGN0EUROzLFl9viLrbWWI6vcjt2vPGMksKHNoTY0RGMUMQnqw-L-ZtTJ7uSHjo81nc2Xb8UGLEcV500iwZwbU4U-YbaTjnt03tIMePTCjL4tvY-V4l1bdcWu9sXcuWKu9RAE_RLpzCM_G_16opit96UtdD8KaJKZ_WCTqY1tomMHjCpgRq-ELM4P0DHN4N3vyG1XzhJjPHukXpR0BIEOYo_mrLdOl6RkRSwRTGvPyX7VxAeMZIYd_7Ry1)にぶち込みます。

こうすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118161/da7ab395-0829-1b93-535e-fadba000245f.png)

こうなります！ #技術の組み合わせ感しゅごい…

## 失敗例
・リアルタイム系の情報を聞いてしまう。
回答が返ってこない、もしくは、いわゆる「ChatGPT嘘つく問題」といわれる、「ハルシネーション」（hallucination、幻覚）を起こしやすい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118161/bf3fa91e-7114-6a35-1a23-6019b60cf083.png)

上の画像での問題点は二つあり、今日付けの情報はそもそも情報がほとんどでそろっておらず、LLMの得意な、「すでに出回っている情報を重みづけして、もっともらしい解答を導く」ことでは難しいように思う。
(ChatGPT Pluginなどが出てきても、しばらくは、真偽が難しい、解釈が人によって分かれる新しい内容は、適切な答えを出すのは難しいのではないかなーと思います。）

ちなみに余談ですが、２番目でスマレジの開示をリンクでおくっても、その前後にあったと思われるTDKの開示について言及してたりするので、こういうのは向いてないんだろうなーという気はしてます。どこかで改善されるのかもですが。

もうすでに色んな情報で回っててかなり陳腐化してる気もしますが、
どなたかのお役に立てれば幸いでございます。

ということで〆
オンプレミスとAWS間の冗長化

以下の自分用メモ
- [AWS Direct Connect](https://www.youtube.com/watch?v=mEtluVrgXlk&ab_channel=AmazonWebServicesJapan%E5%85%AC%E5%BC%8F)
- [オンプレミスとAWS間の冗長化接続](https://www.youtube.com/watch?v=IEQ1ZM93DMo&ab_channel=AmazonWebServicesJapan%E5%85%AC%E5%BC%8F)
- [AWS Site-to-Site VPN](https://www.youtube.com/watch?v=RxiARNnP3nM&ab_channel=AmazonWebServicesJapan%E5%85%AC%E5%BC%8F)

---

# 冗長化の必要性
- すべてのものはいつでも壊れる
    - 物理的な破壊
- メンテナンスで使えないときはある

### 冗長化が不要な場合
- ネットワークの停止が許容される
    - 検証環境や復旧時に再送されればOK
- 代替手段が既にある



# オンプレミスとAWSのつなぎ方
- 専用線
    - DX
- VPN
    - ClientVPN
    - Site-to-Site VPN

## 専用線
- インターネットを経由しないことで通信を盗み見されない

### DX（Direct Connect）
- Direct Connectロケーション⇔AWSをつなぐサービス
- 直接オンプレと接続する専用線サービスではない
- オンプレ⇔Direct Connectロケーションは自前で専用線やIP-Sec（VPN）を用意する

#### LAG（Link Aggregation Group）
- 論理インターフェース

#### VGW（仮想プライベートゲートウェイ）
- 仮想ルーターでVPCにアタッチされる
- Direct Connectロケーションの接続先
- ルートテーブルの参照はできない

#### DXGW（Direct Connect ゲートウェイ）
- 複数のDirect Connectロケーションと接続
- 複数のVGWへ接続可能
- TGWへ接続する際に必要
- DXGW自体は無料

## VPN
- インターネット経由だが、暗号化することで盗み見されても内容が分からない

### ClientVPN
- アプリとして暗号化した上でインターネット通信
- AWS Client VPNを利用

### Site-to-Site VPN
- IPsecで暗号化した状態でインターネット通信
- 早く安くスタートしたい
- IPsec対応ルーターと固定パブリックIPがあれば構築用意
- プライベート証明書があれば非固定パブリックIPも利用可能

#### CGW（カスタマーゲートウェイ）
- オンプレ側で用意するゲートウェイ

#### ターゲットゲートウェイ
- ASWS側で用意するゲートウェイ
- VGW or TGWのことを指す



# 冗長化
- DXを複数接続
- VPNを複数接続
- DXとVPN接続の併用

##  DXを複数接続
- 高コストかつ品質劣化なし
- オンプレ⇔DC⇔DXGW⇔VGW or TGW
- Direct Connectロケーションとの接続を１ロケーションにつき２つにする
- DXGWを利用してDirect Connectロケーションを2つに分散
- 片方を待機系とすることが多い

## VPNを複数接続
### 単一障害点をなくす
- ２つのIPsecトンネルを利用するVPＮ接続を２つ用意する
- オンプレ⇔AWS VPN⇔VGW

### 複数のVPN接続に分散
- ２つ以上のVPN接続のターゲットゲートウェイにTGWを用意する
- オンプレ⇔AWS VPN⇔TGW
- ECMPを有効化
    - 複数のIPsecトンネルを等価に利用する
    - 帯域を増やすことが可能
    - レイテンシーの一貫性はない
- Acceleratedサイト間VPNオプションを有効化
    - 海外拠点のオンプレからの接続における不安定要素を軽減

## DXとVPN接続の併用
- 低コストかつ品質劣化あり
- ターゲットゲートウェイがVGW
    - DX ：オンプレ⇔DC⇔VGW
    - VPN：オンプレ⇔AWS VPN⇔VGW
- VPGはDirect ConnectのVPGと同じものを利用
    - 必ずDirect Connectが優先される仕様
- ターゲットゲートウェイがTGWでも可能
    - DX ：オンプレ⇔DC⇔**DXGW**⇔TGW
    - VPN：オンプレ⇔AWS VPN⇔TGW

# 感想
- オンプレとの接続という目的の中でのDXとVPNの使い分けが分かった
- ClientVPNについても調べたい
オブジェクト指向とは？

本日はオブジェクト指向について学んだので投稿していきます。
オブジェクト指向は理解出来そうで出来ない感覚があるのでざっくり簡単にまとめていきます。

○オブジェクト指向とは
---
簡単にいうといかに効率良く開発を行うかを突き詰めていく考えの事。

○オブジェクト指向の考え方は大きく分けて４つ
---

①設計
物を作る際にその物の振る舞いや定義が明確になっているか
利用する人がわかりやすいような形になっているかというか
利用者が増えた時に対応出来るか
違うものとの関係性が崩れないかなどを決める大切なルール決めみたいな物

②カプセル化
今作っているプログラムが他のプログラムに邪魔されないようにする考え方の事

③継承
同じようなプログラムは共有して使っていきましょうね！とういう考え方
例　車とバスを作ろうとした時、どっちもタイヤを使うよね？だったらそこは共有したプログラムでまとめよ！

④ポリモーフィズム
汎用的な形に出来るようにしましょうという考え方
例　車というベースを作ったらそこからバスやベンツを作れるようにしとこう！

以上がオブジェクト指向の考え方です。
僕自身もまだ実感がない考え方ですが今後学びながらこの考え方を理解していきたいと思います！
Go言語のインポートでパッケージに名前を割り当てる方法

### はじめに
Go言語では、インポートステートメントを使用して外部パッケージをプログラムに取り込むことができます。この記事では、Go言語でインポートされるパッケージに名前を割り当てる方法と、それによる違いについて説明します。

### インポートステートメントの基本
Go言語では、インポートステートメントを使ってパッケージをインポートします。例えば、以下のコードはfmtとnet/httpパッケージをインポートしています。

```go
import (
	"fmt"
	"net/http"
)
```

### パッケージ名の割り当て
インポートされたパッケージには、デフォルトの名前が割り当てられますが、必要に応じて別の名前を割り当てることができます。例として、`github.com/mattn/go-nulltype`というパッケージをインポートし、それに`nulltype`という名前を割り当てる方法を見てみましょう。

```go
import (
	"fmt"
	"net/http"
	nulltype "github.com/mattn/go-nulltype"
)
```

この場合、コードの他の部分でこのパッケージを参照する際には、`nulltype`という名前を使用します。
パッケージに名前を割り当てずにインポートする場合、デフォルトの名前が使用されます。

```go
import (
	"fmt"
	"net/http"
    "github.com/mattn/go-nulltype"
)
```
ここでは、デフォルトのパッケージ名はURLの最後のセグメント（ここでは`nulltype`）が使用されます。

### まとめ
Go言語でインポートされるパッケージに名前を割り当てる方法は、インポートステートメントで明示的に名前を指定することです。名前を割り当てずにインポートした場合は、デフォルトの名前が使用されます。どちらの方法でも問題ありませんが、好みやコードの可読性に応じて選択できます。

https://go.dev/blog/package-names

https://www.digitalocean.com/community/tutorials/how-to-write-packages-in-gos

https://www.ymotongpoo.com/works/goblog-ja/post/package-names/
MacBookProの音がうるさく、入力動作が遅くなった

Macのアクティビティモニタでアプリケーションまたはプロセスを終了する

https://support.apple.com/ja-jp/guide/activity-monitor/actmntr1002/10.14/mac/13.0

# 再起動
再起動しても、MacBookProの音がうるさい。

# アクティビティモニタ

アクティビティモニタの起動方法がわからなかった。　

検索したら出て着た。　

いっぱいならんでいて、なにを停止させればいいかまよった。


# Adobe

少なくとも、Adobe関連は、使うときに起動すればいい。　

Adobe ではじまるものをすべて止めた。　

# アプリ
　
名前を知っているアプリはつぎつぎ止めた　

# backup
なんかbackupという名前のついたのがうごいてた。　

止めた。　

# 再起動　

再起動した。　

静かになった。
【NestJS】spec ファイルとは何か？なぜ必要なのか？（他言語フレームワークでも共通の概念）

## 概要
「spec」とは何かについての備忘録。
本記事は NestJS を初めて触る人向けの記事だが、今回の内容は、他の言語やフレームワークでも同じ意味で登場するため、他の言語ユーザも参考にどうぞ。

NestJSの基本的な仕組みを知るために、**モジュール/コントローラ/サービス** の基本３概念と、**spec** ファイルとは何か、について紹介。

|#|内容|
|---|---|
|1|[基本概念・環境構築](https://qiita.com/to3izo/items/9be3c419c9b66e131565)|
|2|[基本３概念、モジュール/コントローラ/サービス とは](https://qiita.com/to3izo/items/ecbec71817ab589f87d7)|
|3|**spec とは何か？**（今回）|

## 基本ファイル構成
[前回の記事](https://qiita.com/to3izo/items/ecbec71817ab589f87d7) で NestJS は基本的に **「モジュール（module）」「コントローラ（controller）」「サービス（service）」** の３つのクラスで構成されていると説明した。
![nestjs_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/a4a844c0-1dc9-1f71-fa31-b2c26a9cc5b4.png)

ここで、コマンドを使ってコントローラやサービスを自動生成すると、一緒に `.spec.ts` ファイルも作られる。これが何かを説明する。

## spec ファイルとは
spec ファイルは、一言で表すと「テストコード」が書かれているファイル。つまり、プログラムの自動テストをするためのソースコードである。
NestJS の場合、**「単体テスト（ユニットテスト）」** と、**「E2E テスト」** を書くことができる（具体的な書き方は、また別の機会に）。

### 単体テスト
**単体テストの spec** は、「コントローラ」や「サービス」の **個別テスト** ができる。入出力や繋ぎこみの部分は、スタブやモックを作成して、単体でも処理が動くようにする。
![nestjs_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/5a29db46-9adc-7910-4c98-75cd684ef1d0.png)

### E2E テスト
「E2E」とは「End to End（エンド・トゥー・エンド）」の略で、**"端から端まで"** という意味。

**E2E テストの spec** は、**API 全体の処理テスト** ができる。DB 部分や外部の別システムと連携する API 処理などは、スタブやモックを作成して、テスト処理が正常に動くようにする。
![nestjs_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2023b02d-68a5-4b1d-1fd4-73b2fe83e78f.png)

## spec の意味
そもそも「spec」とは **「Specification（スピシフィケーション）」** の略で、意味は **"仕様"**。
つまり、実際やっていることはテストなのだが、目的は「動作確認をするためのファイル」ではなく「アプリの仕様を明示するためファイル」ということ。

『A という入力をされたら、B を返却してくれるよね？』『C という入力をしたら、エラーになるよね？』という、**入力と期待結果を書いたプログラム** であり、テストモードで動かすことで、**期待した仕様通りになっていることを確認** するためにある。

### spec ファイルは作成・更新すべき
上記に説明した意味合いから、spec ファイルには、想定される処理パターンを全て網羅して、テストコードが書かれているべきである。
また、これらは機能の新規作成や改修の度にメンテナンスし、コードレビューに一緒に載せるべきである。

spec ファイルは、存在しなくてもアプリケーションとしては問題なく動くので、テストコードが面倒で書かない（or ファイルを消す）人も多い。

しかし、ソースコードの修正や機能追加などで、ソースコードがどんどん膨らんでいった時に、『あれ、これ正しい動きなんだっけ？』『この処理の正しい仕様わかる人いる？』や『この場合は何が返ってくるのが正解だっけ？』など、処理の抜け漏れ、デグレ発生、新たなバグの発生などの要因を作らないために、できれば spec の書き方にも慣れおくべきだ。
10をたしても10をかけても平方数になるような整数はいくつ？

問題は次のような感じ。10をたしても、10をかけても平方数になるような数字はいくつでしょうか？つまり、$x$, $a$, $b$を整数として、$\sqrt{10+x} =a$, $\sqrt{10x} =b$となるってことですね。`python`でコーディングした例があり、それを参考にさせていただきました。どうもありがとうございます。ここからは `c#`でコーディングしてみます。まずは変数宣言部分。

```c#
int a=1;
int f1=0;
int f2=0;
double f3=0;
double f4=0;
```

`f3, f4`はルートをとったあとのものなので、整数になるとは限らない。ということで、doubleにしました。

```c#
while (a < 1000){
    f1=a+10;
    f2=a*10;
    f3=Math.Sqrt((double)f1);
    f4=Math.Sqrt((double)f2);
if((f3==(int)f3) && (f4==(int)f4))
{
    break;
}
a+=1;
}
Console.Write(a.ToString());
```

`f3, f4`が整数であるかどうかをしらべるには、整数型にキャストしてイコールになるかどうかすればいいですね。もし条件を満足したら`break`でぬけます。最後のステートメントは、こたえを出力するものです。こたえは $x=90$ですね。$a=10$, $b=30$.