OmniAICreator/Qiita-1.07M huggingface dataset:
Qiita API v2 ＋ JavaScript（Node.js で axios を利用）で取得した記事情報のタグの扱いに関するメモ

ちょっと試したいことがあり、Qiita API v2 による記事情報の取得に手をつけてみました。

その時に以下の @n0bisuke さんの記事を参考にしつつ実装を試していたら、タグの扱いが（自分が想定していた内容に対して）少しだけ特殊だったので、その対応などに関するメモです。

●Node.js(axios)からQiita APIを利用して指定したユーザーの記事を取得するメモ - Qiita
　https://qiita.com/n0bisuke/items/40d0c7831d22c4f1868b

## Qiita API v2 で取得できるタグ情報の扱い
### タグ情報の仕様
Node.js を用いて Qiita API v2 で取得した記事情報について、タグに関する部分をそのままログ出力すると、以下になりました。

```bash
tags: [ [Object], [Object], [Object], [Object], [Object] ],
```

この部分の仕様は [Qiita API v2ドキュメントの「タギング」](https://qiita.com/api/v2/docs#%E3%82%BF%E3%82%AE%E3%83%B3%E3%82%B0)の項目に書かれていました。
![タグについて](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/74b337f7-4e8e-3091-1fea-cce3c6e5f015.png)

タグで使われている名前だけが得られるのではなく、その名前を格納した部分（name）と合わせて versions という情報もセットになっているようです。

これについて、最近書いていた、[ChatGPT API に関する記事](https://qiita.com/youtoy/items/b3e2e462029bf40f8a1a) に関する情報取得で、 [JSON.stringify()]() を使って出力し、中身を確かめてみました。実際に出力してみると、仕様のとおの以下が得られました。
![JSON.stringify()で出力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/96c8105d-b99e-4f84-90f0-790a2cf8cfbc.png)

これに関して、自分的には、タグに関して得たい出力は以下の形でした。
![最終的にやりたいこと](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bda51cdf-334d-6568-81c1-5367f4d8a8c1.png)

### タグの name の部分のみを配列で取り出す
自分が想定した出力が得られるよう、このタグの name の部分のみを配列で取り出す必要があるため、map() を使って処理してみます。

変更前と変更後は以下のとおりで、 `post.tags` を `post.tags.map((tag) => tag.name)` にしただけです。

```javascript:変更前
  const posts = items.map((post) => {
    return {
      ...
      title: post.title,
      tags: post.tags,
      ...
    };
  });
```

```javascript:変更後
  const posts = items.map((post) => {
    return {
      ...
      title: post.title,
      tags: post.tags.map((tag) => tag.name),
      ...
    };
  });
```

これで、無事に自分が取得したかった形式で、タグを取り出すことができました。

#### プログラム全体
プログラムについて、他の部分も含むものを掲載します。

最適限、「Qiita のアクセストークン」と「QiitaのユーザーID」は書きかえが必要なので、ご注意ください。

```javascript
const axios = require("axios");
const BASE_URL = `https://qiita.com/api/v2`;

const main = async (USREID) => {
  const ENDPOINT = `${BASE_URL}/users/${USREID}/items?page=1&per_page=3`; // テスト用に 3記事のみ取得

  const res = await axios.get(ENDPOINT, {
    headers: {
      Authorization: `Bearer <Qiitaのアクセストークン>`, // 要書き換え1
      "Content-Type": "application/json",
    },
  });
  const items = res.data;

  // 取得するのは「タイトル、作成日、タグ」 
  const posts = items.map((post) => {
    return {
      title: post.title,
      created_at: post.created_at,
      tags: post.tags.map((tag) => tag.name),
    };
  });

  console.log(posts, posts.length);
};

main(`<QiitaのユーザーID>`); // 要書き換え2
```
本番環境のcronでcan't connect to local mysql serverになる

## 状況
cronを使ってサイトマップを定期的に更新したいと思いcronコンテナを追加。
開発環境は無事動いたが、なぜか本番環境でうまく動かない。

- dockerで新たにcronコンテナを作成
- DBのコンテナは存在せず、外部のDBサーバーを利用

## 事象
本番環境でcronを利用して、`rake 'sitemap:refresh'`実行した際にcan't connect to local mysql serverというエラーが出る。

## 原因
docker-compose.ymlのcronにDB情報を記載していなかった。

## 解決策
cronに以下のようなenvironmentを追加
```
cron:
    build: .
    volumes:
      - .:/app
    depends_on:
      - app
    restart: always
    command: cron -f
    environment:
      - 'APP_DATABASE_NAME=${DB_NAME}'
      - 'APP_DATABASE_USER=${DB_USER}'
      - 'APP_DATABASE_PASSWORD=${DB_PASSWORD}'
      - 'APP_DATABASE_HOST=${DB_HOST}'
```
ランダムなデータは圧縮できない、を試してみた。

# 概要

データの圧縮は、ランダムなデータに対しては効果がない。
よく聞く話ですが、実際に圧縮ができないのか調査したデータが見つからなかったので、試してみました。

ランダムなデータを用意して、複数の圧縮形式で圧縮して、どの程度圧縮されるのか試してみました。

# TL;DR

ランダムデータの圧縮はどのアーカイブ形式でも不可能。
でも、圧縮率はどのアーカイブ形式も優秀でした。

# 詳細

## データの準備

今回、圧縮する元データは 2種類用意しました。
検証可能なランダムなデータとして、最初に思い浮かぶのは円周率なので、円周率をもとにランダムデータを用意しました。

データの準備は [y-cruncher](http://www.numberworld.org/y-cruncher/) を用いて生成しました。
hex 形式で出力したファイルを以下の通り処理したものを圧縮ソフトで圧縮しました。

#### テキストファフィル

テキストファイルは Hex 出力したものから、 `sed 's/^[0-9]*\.//'` で小数点前の整数部を削除したものを利用します。
これは、以下の バイナリファイルとデータの複雑さに関する条件を揃えるための処理です。

空間利用率は、 1byte あたり、 `[0-9A-F]` の 16 通りのため $\frac{log_2 16}{log_2 256} = \frac{1}{2} = 50 \\% $ から、
論理的には、$\frac{1}{2}$ までデータ圧縮が可能なデータとなります。


#### バイナリファイル

テキストファイルを、バイナリ変換したものを利用します。

空間利用率は、 1byte あたり、 `[0x00-0xFF]` の 256通りのデータで利用しており、$\frac{log_2 256}{log_2 256} = 1 = 100 \\% $ から、
円周率が完全にランダムであるなら、圧縮が不可能なデータになります。


## 圧縮処理

圧縮は、7-Zip 22.01 (x64) を用います。

| アーカイブ形式 | 圧縮レベル | 圧縮方式 | 辞書サイズ | ワードサイズ | ソリッドブロックサイズ | 
| --- | --- | --- | --- | --- | --- |
| 7z | 9 - 超圧縮 | LZMA2 | 64MB | 64 | 16GB |
| bzip2 | 9 - 超圧縮 | BZip2 | 900KB | - | - |
| gzip | 9 - 超圧縮 | Deflate | 32 KB | 128 | - |

ゴリゴリの超圧縮処理で対抗します。

# 結果

#### テキストファイル

どの圧縮形式もおおよそ理論値まで圧縮がかかっていました。
特に、 bzip2 の 50.80 % はデータとの相性も考えられますが、驚異的な圧縮率だと思います。

| アーカイブ形式 | サイズ | 圧縮率 |
| --- | --- | --- |
| 無圧縮 | 830,482,024 byte | - |
| 7z | 436,574,275 byte | 52.57 % |
| bzip2 | 421,852,599 byte | 50.80 % |
| gzip | 463,621,497 byte | 55.83 % |

#### バイナリファイル

本題です。
どの圧縮形式でも、100 % 以下の圧縮率になるものはありませんでした。
しかし、 7z や gzip 形式は 100.01 % という驚異的なオーバーヘッドの少なさでした。

| アーカイブ形式 | サイズ | 圧縮率 |
| --- | --- | --- |
| 無圧縮 | 415,241,012 byte | - |
| 7z | 415,266,836 byte | 100.01 % |
| bzip2 | 416,405,338 byte | 100.28 % |
| gzip | 415,284,140 byte | 100.01 % |

#### テキストファイルとバイナリファイルの差

最後に、テキストファイルとバイナリファイルのサイズ差をアーカイブ形式ごとに見てみます。
bzip2 が特に突出した増加率の少なさでした。

| アーカイブ形式 | テキストファイルサイズ | バイナリファイルサイズ | 増加率 |
| --- | --- | --- | --- |
| 無圧縮 | 830,482,024 byte | 415,241,012 byte | 200 % |
| 7z | 436,574,275 byte | 415,266,836 byte | 105.13 % |
| bzip2 | 421,852,599 byte | 416,405,338 byte | 101.31 % |
| gzip | 463,621,497 byte | 415,284,140 byte | 111.64 % |

# 結論

ランダムなファイルの圧縮は不可能であることを再確認できました。
また、どのアーカイブ形式も優秀な成績でした。

そのため、データの圧縮は自分で頑張るよりも、既存のアーカイブを通したほうが楽ということがわかりました。

以上
Next.jsで動的なAPIエンドポイントを作成する(ルーティング)

## この記事の目的
- Next.jsでブログを作成したときの備忘録
- Next.jsで指定したID情報をAPI取得する

## 概要
Next.jsでブログの側だけ作成したので、ダミーデータをプロジェクト内に用意し、`/api/posts/1`や`/api/posts/2`のようにURLで指定されたIDのデータ取得をまとめました
- ①動的なAPIエンドポイント
- ②動的なAPIエンドポイントルーティング
- ③実際にIDに紐づくデータを取得する

[Next.jsでダミーデータを単純にAPI取得する記事についてはこちらから](https://qiita.com/pikimaru/items/afaaff06f7c2781f9f5f)


## ①動的なAPIエンドポイント
上記で少し記載していますが`/api/posts/1`や`/api/posts/2`のようにURLでIDが送られIDに紐づく情報を取得したい時があると思います。
このように`/api/posts/ID`のIDの部分によって指定のデータを取得する場合のことを言います。
この場合、APIルートを動的に構築していく必要があります。

簡単にはURLで指定したIDの情報を取得すること

## ②動的なAPIエンドポイントルーティング

### 基本的なルーティング
まず基本的なルーティングの例を下記に記載します
```
例1) pages/api/hello.tsx → http://localhost:3000/sample/hello
例2) pages/api/index.tsx → http://localhost:3000/sample
```

### 動的なルーティング
動的なルーティングにするためにはAPIファイル名に`[]`を含める必要があります
`[]`を使用すると、APIルートを動的に構築することができます。
```
例1) pages/api/[postId].tsx → http://localhost:3000/posts/1
例2) pages/api/[postId].tsx  → http://localhost:3000/posts/2
```

## ③実際にIDに紐づくデータを取得する
APIファイル名に`[]`を含めて作成し、実際に指定したIDのデータを取得していきたいと思います
取得するデータと単純なAPI取得については[Next.jsでダミーデータを単純にAPI取得する記事](https://qiita.com/pikimaru/items/afaaff06f7c2781f9f5f)に記載しているので今回使用するデータを記載したファイルの内容については、こちらの記事にて確認してください。

### ファイル作成
まずは`api/posts/`配下に指定したIDでAPI取得する関数を記載するファイルを`[]`を含めて作成していきます。
```
pages/api/posts/[postId].tsx
```
### API取得ロジック記載
次に作成した`pages/api/posts/[postId].tsx`ファイルに取得ロジックを記載していきます
```pages/api/posts/[postId].tsx
import { NextApiRequest, NextApiResponse } from 'next';
import data from '../data';

// APIのリクエストを受け取り、レスポンスを返す
export default function handler (req: NextApiRequest, res: NextApiResponse) {
    // パラメーター"postId"が存在する場合、数値に変換する
    const postId = req.query.postId && Number(req.query.postId);

    // データを取得する
    const { Posts } = data;

    // "postId"が存在する場合、投稿データを取得して返す
    if(postId) {
        // "Posts"配列から、"id"が"postId"と等しい投稿を検索する
        const post = Posts.find( value => value.id === postId)
        // 投稿データをレスポンスとして返す
        return res.status(200).json(post)
    }

    // "postId"が存在しない場合、エラーを返す
    return res.status(404).json({ error : "Post Not Found"})
}
```
### 指定したIDのデータを取得する
`http://localhost:3000/posts/1`の場合
![スクリーンショット 2023-03-18 0.16.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/5de3bab8-aa04-6068-c1ef-eeebab574a7e.png)

`http://localhost:3000/posts/2`の場合
![スクリーンショット 2023-03-18 0.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/97356260-c21b-a903-8fee-f4ba914e630b.png)
IDに紐づくデータのみが取得できることが確認できました！！


## 　参考
[Next.jsドキュメント（動的 API ルート）](https://nextjs.org/docs/api-routes/dynamic-api-routes)
AWSセキュリティ/アイデンティティ/コンプライアンス


IAM
--
認証と認可を管理します。

![job_kagiya.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e5358a90-db37-ca29-21a1-93a58e43e8fe.png)


STS
--
セキュリティトークンサービス。

![jigenbakudan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/c55e10eb-e06d-b050-fda0-4598cea281df.png)

KMS
--
キーマネージドサービス。
データやAWSリソースの暗号化の為のカスタマーキー（CMK）を管理。
キーポリシーでアクセス権限も設定できる。
キーのローテーション管理も自動化できる。

![computer_document_angou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e3fa78d1-b399-8df9-c880-3a41b80eb334.png)

CloudHSM
--

![computer_lock_document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/0c0d6a75-9e04-231d-3401-ef914266f2a3.png)

WAF
--

ウェブアプリケーションファイアーウォール。

![internet_firewall3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e7e6044f-ca88-5789-5710-419d05137dfd.png)

Shield
--

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/ddos-overview.html

DDos攻撃から保護。

![game_tate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/5ee1e889-372a-f940-89c9-e758a62d132c.png)

Cognito
--

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html

ウェブアプリケーションやモバイルアプリケーションに安全な認証を実装できる。

![website_sns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/55414bb5-be19-28cd-84c2-af8fe47b7fda.png)


SecretsManager
--

https://aws.amazon.com/jp/secrets-manager/


データベースのパスワードやAPIの認証キーなどのシークレット情報を管理。

![maruhi_mark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/665feecd-fe4b-8764-b0c4-78ce606f957d.png)


GuardDuty
--
CloudTrail、VPCフローログ、DNSクエリーログを
自動的に検査して検出結果をレポートしてくれる。

![thumbnail_pato_lamp_off.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/8196f7f9-f848-4f2a-d6a2-a9b2554462d0.jpeg)

Inspector
--

InspectorエージェントによるEC2インスタンスの脆弱性検査を定期的に自動化できる

![kenkoushindan_mri_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/ce19a080-538e-3f49-3fe3-32d16a07b9dd.png)

Macie
--

S3の設定に脆弱性がないか、保存されたデータに機密情報がないか自動検知できる

![cleaning_seiri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/19516de6-3e16-4d96-b052-57dde06f013a.png)

DirectoryService
--


![window_nijumado.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e834fc9e-1f18-6159-8b73-60b3c3c8ab2e.png)

AWS Organizations
--
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_getting-started_concepts.html

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/consolidated-billing.html


![business_jinzai_hikinuki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/d6cf2619-4e25-d15c-f57d-79b8a565d40f.png)

AWS SSO
--
![computer_password.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/15f0806c-5994-5b47-6c76-6a4a7143269e.png)
AWSネットワーキング

参考にした本
--
https://www.ric.co.jp/book/qualification3/detail/272


VPC
--
仮想ネットワーク。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/troubleshoot-vpc-route-table/

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html

![map_open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/b6ab7a02-09f9-f2c1-0599-84de6ebbc0ef.png)

NATGateway
--

VPCの一機能。

![passport_checkin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e0181ad4-cf87-e03d-1d0d-94f81004730a.png)

VPCEndpoint
--

ゲートウェイエンドポイントとインターフェイスエンドポイントがある。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/endpoint-services-overview.html

https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpce-gateway.html


![kippu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/aa770fb7-583f-91dd-8580-f88efe0e4200.png)

PrivateLink
--

https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/peering-scenarios.html#peering-scenarios-partial

インターフェイスエンドポイントをPrivateLinkと呼びます。
VPC内に専用のENIが作成されプライベートIPアドレスが割り当てられます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/endpoint-services-overview.html

![norimono_character4_kikyuu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/81810094-df9a-9a79-60b5-50ce41584f41.png)



VPCPeering
--
VPCを複数作成し通信をしたい場合に作成

![norimono_character8_cessna.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/849dba54-b5f5-7c0d-6fb0-885f21b025dd.png)








Route53
--

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html#dns-failover-determining-health-of-endpoints-monitor-endpoint

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-failover-complex-configs.html


![space_kanseishitsu (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/26552dc4-66fc-3ef0-9a7e-e973f1e256b9.png)


DirectConnect
--

https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/remote_regions.html

![zipline_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/4cad0279-469f-6a76-35af-a46fb74dee45.png)

AWS ManagedVPN
--


![ropeway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/cd219b72-aae5-b50c-7045-431b6e43b541.png)
AWSストレージおよび配信


参考にした本
--
https://www.ric.co.jp/book/qualification3/detail/272

S3
--
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/transfer-acceleration.html

インターネットからアクセスできるストレージサービス。

![S3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/8830bad3-8299-639c-6d49-2b7b7bda61f1.jpeg)

EBS
--

EC2にアタッチして使用するボリュームサービス。

![karou_hoikushi_woman_girl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/c0be45f3-9679-0111-9747-f3bc0b466054.png)


EFS
--

複数のLinuxサーバからマウントして使用できるファイルシステムサービス。

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

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/encryption.html

![job_youchien_hoikushi_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/85a18de9-ebc1-dcd9-0e35-5415da62b72a.png)



Glacier
--

長期保存に向いている。

![thumbnail_gomi_poribaketsu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/1e92badc-0423-d343-cf55-1cb4d1e994df.jpeg)


StrageGateway
--

オンプレミスから透過的にS3やボリュームにデータを保存することができる。

・ファイルゲートウェイ
・ボリュームゲートウェイ（キャッシュタイプ・保管タイプ）
・テープゲートウェイ

![syoubousya_housui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e4e87c2d-2483-5731-e5a7-c0b2d9b06eec.png)


CloudFront
--

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/using-https-cloudfront-to-custom-origin.html

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-cookies.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-edge.html

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html

全世界のエッジロケーションを使用してキャッシュを配信できる。

![youchien_schoolbus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/0fddd130-3e05-d19a-c5b8-ec8681c1b28a.png)
AWSコンピュート

参考にした本
--
https://www.ric.co.jp/book/qualification3/detail/272



EC2
--

アンマネージドサービス（お世話が必要）の仮想サーバ


![dance_youchien.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/6d4d43f8-9664-1628-0c96-44dae8bb59fd.png)

ELB
--
負荷分散サービス。
ロードバランサーのマネージドサービス。

![koutsu_seiri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/8f833180-216b-fd9e-e753-f5f5f68fc6ac.png)


Elastic Beanstalk
--

アプリケーション環境を簡単セットアップ。
インフラとしてEC2インスタンスを利用します。

![gakugeikai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/1219f33f-e66a-de49-491d-1298825943cc.png)


Lambda
--

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-custom-resources-lambda.html

短時間実行。
サーバレスコンピューティングサービス。

![smartphone_screen_sns_video.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/4c7bba9d-42ca-ddae-a0c1-f7db78bea1c4.png)


AWS Batch
--

https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/what-is-batch.html

バッチ処理を簡単セットアップ。
並列実行。

![toy_drop_motion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/f5fff64f-e698-e929-fd9d-a046c67b6be8.png)


ECS
--

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/service-load-balancing.html

マネージド型コンテナオーケストレーションサービス。
まとめて設定実行が可能。


![getabako_school.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/02f48112-d028-4844-943c-e82f676508a9.png)


EKS
--
コンテナの実行管理にオープンソースのKubernetesをマネージドで提供。

![senchou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/bbbe9117-2d97-812f-261f-98ce9da86dc4.png)


Fargate
--

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


ECS・EKSから使用することのできるサーバレスなコンテナ実行環境。

![mahoutsukai_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/fbcf8469-d67c-1052-61c4-46596738117d.png)

Lightsail
--
シンプル定額VPSサービス

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


![food_reitou_syokuhin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/ab83c853-64de-a235-b1e6-244323752a48.png)

Outposts
--

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


物理施設で利用できる

![christmas_okashi_house.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/b710c607-549d-241c-da52-35e5f6805462.png)
AWS AIサービス


Rekognition
--
https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/celebrities.html

https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/celebrities-procedure-image.html

![ai_image_gazou_ninshiki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/edaa5d68-f328-c562-72a8-98e3d2c14110.png)

Polly
--

![ai_smart_speaker_character.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e22ec497-e747-ef54-0209-c8d5860c72e8.png)


Transcribe
--

![onsei_ninshiki_computer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/cf080c73-38c5-c32f-9599-6454f1c860f0.png)

Translate
--

![ai_write.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/f6055de7-07f1-c81f-8b95-5e8c89dee941.png)


Comprehend
--

![ai_nakayoshi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/f978884e-ba44-1e97-b978-edaff04754c8.png)

Lex
--

![ai_mail_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/abdd7645-7ed1-445d-bf2d-ebda1aa8acd9.png)


Forcast
--


![ai_study_kikaigakusyu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/584b3d60-a5ac-0bb0-52af-db3e0fe8dea7.png)

Personalize
--

![net_shopping_pc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/cbea4ee0-ddcf-c661-c596-67562bcd407e.png)
AWS データベース


参考にした本
--
https://www.ric.co.jp/book/qualification3/detail/272

RDS
--

マネージドなリレーショナルデータベースサービス。
MYSQL PostgreSQL MariaDB Oracle MucrosoftSQLServer を提供。

![hotel_bellboy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/f6d0aaa2-3686-27d2-6f95-d1d239e465af.png)


Aurora
--

MYSQLまたはPostgreSQLと互換性のある高機能なリレーショナルデータベースサービス。
リードレプリカ・グローバルデータベースなど様々な機能がある。 
サーバレスタイプもあります。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html#aurora-serverless.limitations


![thumbnail_family_shopping_bag_paper.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/36a63257-303d-cca4-3b6b-47b13f254c1d.jpeg)

DynamoDB
--
https://aws.amazon.com/jp/dynamodb/dax/

フルマネージドなNoSQLデータベースサービス。
全てAWS APIリクエストで操作します。

![kouji_genba_building.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/9c6dda3a-d7da-df57-d5de-f4937a66fa4f.png)

Elasticache
--

インメモリデータストアサービスです。
キャッシュを素早く返します。

![rucksack_backpack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/17ca3f9a-ebbb-da1a-aa39-9092dfd7c205.png)


Neptune
--

高速で信頼性の高いフルマネージド型のグラフデータベースサービス。
ソーシャルネットワークサービスなど管理するのに最適。

![network_dennou_sekai_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/48b2251d-ed8f-3efc-46d0-5ed848b83a11.png)



Redshift
--

高速なデータウェアハウスサービス。

![document_data_bunseki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/f95397d3-cb70-77f3-38ea-5f4af44d3d73.png)
AWS アナリティクス

参考にした本
--
https://www.ric.co.jp/book/qualification3/detail/272


EMR
--

マネージドサービス。ビッグデータの分析。大規模データ分散処理基盤。
分散処理フレームワークに必要なマスターノード・コアノード・タスクノードの管理が容易になる。

![building_jidoufukushi4_takujisyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/bfc8ac79-7624-3e38-143b-cb9de2409a5a.png)

Athena
--

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/what-is.html

S3に保存しているデータに、SQLで検索・抽出・集計ができる。

![mahoutsukai_water.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/e91d5b78-5290-4552-e60f-e1294b4ad0fc.png)


CloudSerch
--

マネージド型の検索機能サービス。

![thumbnail_searchbox.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/85d31f5e-3176-d42f-0f3f-2568105aafaa.jpeg)


Elasticsearch Service
--
![internet_filter_bubble.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/7bc4c055-7d97-b161-f886-3e9f10559811.png)


Kinesis
--

ストリーミング処理などのサービス

Kinesis Data Streams
--
https://aws.amazon.com/jp/kinesis/data-streams/

Kinesis Data Firehose
--
https://aws.amazon.com/jp/kinesis/data-firehose/?kinesis-blogs.sort-by=item.additionalFields.createdDate&kinesis-blogs.sort-order=desc


Kinesis Data Analytics
--


Kinesis Video Streams
--


QuickSight
--

ビジネスインテリジェンスサービス（BI）です。

![computer_document_spreadsheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/eea91e46-7aab-8ddb-bbaa-b6cd69ead1a0.png)

Glue
--
ELT（抽出・変換・格納）サービス。
S3などのストレージやデータベースに保管できる。


![koujou_machine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/835d7559-443f-ce18-0b32-8fe72a95cda3.png)
AWS 開発者用ツール


CodeCommit
--

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/repositories.html

ソースコードリポジトリ。

![kaizoku_takara.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/16925fa7-39f0-d945-15a7-49e55a5172ba.png)

CodeBuild
--
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html

ビルドサービス。
![block_asobi_boy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/15913ddb-71aa-043b-854d-2752e795d913.png)

CodeDeloy
--
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/deployment-configurations.html#deployment-configuration-lambda

デプロイを自動化
![keijiban_tenji_kaiga.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/028bd133-c7ce-90cf-f141-455ea4d816c0.png)

CodePipeline
--
上述のサービスを束ねCI/CDパイプラインを定義

![job_shitsuji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/1d3eea0f-a9d0-d6e6-3b3d-48c7e85d6248.png)



CodeStar
--

独自のCI/CDパイプラインを定義
テンプレートが用意されている
![computer_hacker_white1_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/55e9507a-a5ef-4e02-bb75-5f70e9ffd11e.png)


X-Ray
--

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/aws-xray.html


アプリケーションの分析とデバッグ
![kenkyu_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/c36488f2-b3a3-2946-af7e-1432d6f02abf.png)
Mac 向けDocker をHomebrewでインストールしようとしたらつまづいた話

Mac 向け Docker を Homebrewでインストールしようとしたらつまづいて、解決したので共有します。

以下のコマンドを実行してから、
```
$ brew install docker
```
次のコマンドを実行したところ、
```:NG
$ brew cask install docker
```

以下のエラーになりました。
```
Error: `brew cask` is no longer a `brew` command. Use `brew <command> --cask` instead.
```
以下のサイトで調べたところ、

https://www.mathkuro.com/mac/brew-cask-command-error/

①caskコマンドの使い方が変更になった
ようです。

旧) $ brew cask install xxx
↓
新) $ brew install xxx --cask

なので、
```:OK
$ brew install docker --cask
```
としたら、上記のエラーは出なくなりました。

また上記のコマンドを実行中、別の以下のエラーが出ました。
```
Error: It seems there is already a Binary at ‘/usr/local/share/zsh/site-functions/_docker’.
```
以下のサイトで調べたところ、

https://qiita.com/show2214/items/9a83cda9229e1b40ba09

原因は、先にbrew install dockerをしていたからです。

解決方法は、
```
$ brew remove docker
```
をしてから
```
$ brew install --cask docker
```
を行うことで、無事dockerをインストールできました。
Macとかでテキストファイルの行の順序を逆にしたい

# はじめに
恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

# やりたいこと

    おはよう
    こんにちは
    さようなら

なファイルがあったら

    さようなら
    こんにちは
    おはよう

というファイルを作りたい、ってことです。

# 答

    tail -r

## 実例

~~~
$ cat file.txt 
おはよう
こんにちは
さようなら
$ tail -r file.txt 
さようなら
こんにちは
おはよう
~~~
はい、できました[^manu]。

# おまけ
「テキストファイルの行の順序を逆にしたい」みたいな感じで検索すると"tac"というコマンドがあることが分かります[^revcat]。が、tacはGNUのcoreutilsの中の一つなので、MacとかBSD系のOSではデフォルトでは入っていません[^inst][^newmac1]。こんなことは、たまたま思いついた時にさくっとやりたいわけで、いちいちインストール、というのはちょっと違うかなと思います。でも、この程度の機能であれば、絶対MacとかBSD系のOSにもあるはずで、それがtailの-rオプションです。
ちなみに、（行単位ではなく）単に「逆にしたい」で検索してしまうと"rev"というコマンドがあることがわかります。こちらはMacとかBSD系のOSにもデフォルトで入ってます。「なんだ、名前が違うけどあるよね」なんて思ってこちらを使うと、残念ながら期待とは違って行ごとに文字単位で逆にしてくれます。はい、証拠。
~~~
$ rev file.txt 
うよはお
はちにんこ
らなうよさ
~~~
これはこれで正しく動作しているとは思いますが、こういう需要ってどれだけあるのでしょう。（さらに言うと、Macではバイト単位で逆にしてくれたようで文字化けしてしまいました[^oldmac][^newmac2]。）

[^manu]: まあ、この程度だったらエディター使って手でやれよ、というのはその通りで、これはあくまで例です。
[^revcat]: catの逆ってことみたいですね。
[^inst]: インストールできないわけではないので、事前にインストールしておけばいいんですけどね。
[^newmac1]: macOS Sonomaでも入っていませんでした。
[^oldmac]: Macのバージョンが古かったためかもしれません。新しいので試せば違うかも。
[^newmac2]: macOS Sonomaでは文字化けは起こらず、期待通りの動作でした。
【AWS】Budgetsを使った特定予算を超えた場合のアラート設定

# 一定の利用金額超えた場合に、メールで通知が来るように設定する
AWSは従量課金制のサービスとなっており、リソースを使用した分の金額が発生します。
気付かないうちに使用料が爆上がりして、嘆いている人は多々見かけます。

上記の対策として、閾値以上の金額が発生した際にアラートを通知するようにします。
`Budgets`で設定を行います。

# 設定していく
まずは、コンソールマネージャーを開きます。
①`billing`と検索 または ②アカウント名から`請求ダッシュボード` をクリックすると、AWS Billing Dashboardが開きます。
そして、左メニューの`Budgets`をクリックします。
※GUIを画面構成がちょくちょく変わるので、参考程度にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/d24afa5f-d484-bc6d-ed87-4c67cd93afc7.png)

上記画面まで推移出来たら、「予算を作成」をクリックします。
ここからは、予算の設定となります。
設定内容については、任意に設定していただく必要があります。
自分は、下記のように設定しました。

【設定内容】
予算タイプ："コスト予算"
予算名：Cost_Check
期間：月
開始月：当月
予算設定方法：固定
予算額：$5

詳細オプションについては、デフォルトで設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/83622f55-8461-cb76-98e0-461c00e2f0df.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/6a32069e-5d47-878c-e732-e43e9256e8fb.png)

アラートの通知基準については、予算額の50%・100％を超えた場合に通知するように設定しました。
通知方法は、メールにしました。
得にアクションなども設定せず、これで予算を作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/7a7b92e0-2cb4-7408-20a3-0e7a3358487f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/9c58534b-c47e-888c-cdd3-bfe068c41491.png)

作成完了後に`Budegets`を確認すると、予算が増えている事を確認出来ました。
これで、アラートが通知されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/fc32db51-949e-83a3-650a-9253fe7770ab.png)
Laravelのフォロー機能のEloquentリレーションをサクッと解説

LaravelのEloquentモデルクラスに定義すべき多対多の関連性、とくにフォローしている人、されている人の関連性についてまとめました。
イメージとしてはUserクラスにメソッドとして、followings(自分がフォローしているユーザー)、followers(自分をフォローしているユーザー)メソッドの使い方についてです。
## ER図
![スクリーンショット 2023-03-18 11.47.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954882/4854c54e-88a6-220a-fc25-041e05d6ab91.png)

### フォローユーザー(followings)の表現
Userテーブルにおいて、フォローしているユーザーを多数持ちます。
followsテーブルがフォロー関連性をまとめているので、フォローしている自分のID が`follower_id`のレコード　全て取得します。

そのレコードのそれぞれの`followee_id`が自分がそれぞれフォローしているユーザーにあたります。
Eloquentモデルにおいてはこのフォローしている関連性(followings)を、
followsテーブルを用いると、`どのクラス(第一引数)`の`どのテーブル(第二引数)`で`どのカラム(第三引数)`が`どのカラム(第四引数)`を`どうする(メソッド名)`にあたるイメージです。

ここでは`Userクラス`で`followsテーブル`を参照して、`フォローしている`関連性を表現したいので、
第三引数のフォローしているカラムを表す`follower_id`に続いて、フォローされているカラムの`followee_id`
が入るイメージです。

もっと簡潔にいえば、メソッド名で`何をしたい(followings)`ので、第三引数、第四引数が`follower_id`、が`followee_id`を`フォローしている(followings)`といった具合です。

```php
class User
{
    public function followings(): BelongsToMany
    {
    return $this->belongsToMany('App\User', 'follows', 'follower_id', 'followee_id')->withTimestamps();
    }
}
```
### フォローワー(followers)の表現
同様にフォロワー(自分をフォローしているユーザー)も簡潔に表現すると、メソッド名で`何をしたい(followers)`で、第三引数、第四引数が`followee_id`、が`follower_id`に`フォローされている(followers)`といったイメージでさっきの`followings`と逆のながれでEloquentでメソッドが定義できます。
```php
class User
{
    public function followers(): BelongsToMany
    {
    return $this->belongsToMany('App\User', 'follows', 'followee_id', 'follower_id')->withTimestamps();
    }
}
```
## 完成系
```php
class User
{
    public function followings(): BelongsToMany
    {
    return $this->belongsToMany('App\User', 'follows', 'follower_id', 'followee_id')->withTimestamps();
    }

    public function followers(): BelongsToMany
    {
    return $this->belongsToMany('App\User', 'follows', 'followee_id', 'follower_id')->withTimestamps();
    }
}
```
Tableau Certified Data Analystに合格したので勉強方法を残しておく

# はじめに
無事にTableau Certified Data Analystに合格できたので、勉強に使ったものとかをお伝えできたらと思います。
先に結論を言ってしまうと、基本的にはUdemyだけをやって、プラスαで先人たちの受験体験記を拝見し知識を整理していきました。
それらや試験に向けての注意点などをご紹介します。

# （前提）私のTableau歴
- Tableau歴：1年（業務でTableau Desktopやprepを使っています）
- DATA Saber（2023年2月認定）
- Tableau Desktop Specialistの資格は持っていません
- Tableau Serverはあまり触っていませんでした

# Tableau Certified Data Analyst 試験について
詳細は公式をご確認ください。
[Tableau Certified Data Analyst - 認定資格試験](https://www.tableau.com/ja-jp/learn/certification/certified-data-analyst)

大事なところだけ↓↓
- 日本語で受験可
- 受験料は結構高い（$250）※2023/03/17現在
- 資格の有効期間は２年
- 試験ガイドはちゃんと見た方がよい（出題範囲が明記されています）
- ビデオチュートリアルは視聴しておいた方がよい（当日に心の余裕ができます）

# 勉強に使用したもの
- Udemy
    - [Tableau Desktop Specialist Certification Practice Tests 2023](https://www.udemy.com/course/tableaudesktop/)
    - [Tableau Certified Data Analyst: Top Exam Prep Course](https://www.udemy.com/course/tableau-accelerate-your-career-and-get-certified/)

        上が4,200円、下が4800円のようです。（2023/03/18現在）
どちらも演習問題が豊富ですが、上は演習のみ、下は講義＋知識演習＋ハンズオン演習となっています。
どちらか一方だけと言えば、下だけで良いかと思います。
上のはスペシャリスト向けのようですが、知識としては知っておいた方がよい内容が多いため、余裕があればやっておくとよいかもしれません。

        あと、どちらの講座も英語ですが「Google翻訳」や「Deepl」を駆使すれば、問題なく学習できると思います。
        ※日本語で受験される方は、Tableau内の日本語表記と英語表記の違いは意識した方がよいです。

- 参考になったブログ
    - [【合格体験記】Tableau Certified Data Analyst資格試験](https://note.com/tableau_kun/n/n29c69d44f861)
    - [Tableau Certified Data Analyst試験合格あれこれ](https://note.com/dia_gg/n/n5b73cfcfc0bf)
上が知識、下が実技の参考になります。

# 試験時の注意点
自分は近くのテストセンターで受験しましたが、実技のハンズオンラボが本当に操作し辛かったです。
Tableau Desktopがインストールされている仮想環境を使用するのですが、モニタ（テストセンターに依ると思いますが）が小さいのでTableau Desktopのメインメニューやツールバーのアイコンが表示しきれていないのがとても煩わしかったです。
とはいえ、それを使って解答しないといけないため、小さいモニタでTableauを少しでも触っておくと操作感のずれが減るかもしれません。

特に困ったのが、その影響なのか「Show Me」（表示形式の選択）が表示されてなく、しかも省略されているメニューの一覧を確認しても見当たらないことです。
受験される多くの方は、「Show Me」を使わなくても大体のグラフ作成ができるようになっていると思いますが、特定のグラフだけ「Show Me」を使っていることもあるかと思います。
「Show Me」にあるグラフは一通りマニュアルで作成できるようになっていると安心かと思います。

＜参考＞
「Show Me」（表示形式の選択）ってこれです↓↓
<img width="200" alt="Show Me" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/57f158ba-018d-7c60-3315-2ff999477501.png">

また知らなかったのですが、「Show Me」のショートカットは下記のようです。
- Windows：Ctrl + 1、Ctrl + Shift + 1
- Mac：Command+1
※[(Tableau公式)キーボード ショートカット](https://help.tableau.com/current/pro/desktop/ja-jp/shortcut.htm)

# 終わりに
自分は日本語で受験しましたが、日本語的に分かり辛いところはありませんでした。
試験時間はハンズオンラボの「Show Me」ないない事件があったのですが、それでもしっかり見直して30分以上余っていたので、かなり余裕はあると思います。

これから受験をされる方、検討されている方の参考になれば幸いです。
VueRouterを介してparamsで子コンポーネントに親の状態を渡そうとしたら沼った件

Vue3（＋QuasarFW）で、VueRouterを使ったPropsの受け渡しが思った通りにできなかった話。

## ディレクトリ構成
src
├── layouts
│   └── MainLayout.vue（ヘッダー/router-view/フッター）
├── pages
│   ├── TimerPage.vue
│   └── HomePage.vue
├── router
│   └── routes.ts
└── App.vue

## やりたかったこと（当初のイメージ）
最初は下記の方法をイメージしていましたが、うまくいきませんでした。

- MainLayout.vueにスタート/ストップボタンを記述
- スタートボタンを押すと、HomeからTimerへ画面遷移する
- TimerPage.vue内でタイマー開始
- ストップボタンを押すとタイマーが終了
- MainLayout.vueからTimerPage.vueへ、paramsで値を渡してTimerPage.vue内のメソッドを使いたい

## 最終的に解決した方法
ストップボタンのみTimerPage.vue内に配置しました。
そもそもストップボタンはTimerPage.vue内でしか使わないので、記述が煩雑になることは無かったです。
（似通った機能のボタン（＝スタート/ストップ）をまとめてフッターに置いておきたかったなーくらい？）

## 学んだこと
### VueRouterの仕様変更
Vue2の時点ではparamsで渡す値は何でも良かったので、その変更を理解するところから困惑しました。
### VueRouterを介したPropsの受け渡し
今回はrouter-viewの外側から値を渡そうとして、うまくいきませんでした（MainLayout.vueからTimerPage.vue）。
以前はrouter-viewの内部で行っていたので、そのあたりも影響したのかもしれません（例えばHomePage.vueからTimerPage.vue）。

## 終わりに
調べた感じだと、router-viewの外側の記述（＝MainLayout.vue）には、各ページへのリンクだけがおいてあるような事例が多かった様に思います。
フッターやヘッダーに、router-linkを配置するだけとか。
そもそもMainLayout.vueのようなコンポーネントに、ルーティング以外の処理をさせること自体が間違いなのかもしれません。

今回は特に理解が曖昧な部分も多く、正確な情報ではないかもしれません汗
ぜひ遠慮なくご指摘ください。
また今回のようなケースで解決策を持っている方がいらっしゃいましたら、ぜひ教えてくださいm(_ _)m
S-Docs 

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [S-Docs: Salesforce 向けの100% ネイティブ ドキュメント生成と電子署名](https://www.sdocs.com/)
+ [S-Docs query permission](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000VOpP)

# エラー

+ [Encountered premature end of XML: input contained no data Error is in expression ‘{!writeDocumentData}’ in page sdoc:sdcreate3: (SDOC)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgXxr)

:::note
 I re-created the template and it's now working again. I couldn't find the specific syntax issue, but that must have been it. 
:::

When I try to open a document that was generated from the S-Docs button, I receive the following error: Encountered premature end of XML: input contained no data

1. Navigate to the template editor for the template(s) that trigger this error and click the Save & Preview button (if no Save & Preview button is present, navigate to the Advanced Options tab and paste a record ID into the Preview ID field). If the document does not generate properly, the template likely contains syntax issues that are causing the error. Consider checking the Last Modified Date to see if the template was edited recently. If the document generates properly, move on to step 2
2. nsure that there is a Lookup Relationship field to the template's base object on the S-Doc Relationship object


 https://www.sdocs.com/resources/troubleshooting/
Databricks(Spark)のmetricsをPrometheusで取得する

# Databricks(Spark)のMetricsをPrometheusで取得
だいぶ前の話になりますが、spark3.0系から、Prometheus経由でのMetrics取得が可能になっています。

https://dzlab.github.io/bigdata/2020/07/03/spark3-monitoring-1/

Databricksの場合に、どう取得するかがいまいちわからなかったので、チラ裏的な形で情報を残しておきます。

動作検証は下記で実施しています。

- DBR11.3 Standard
- All purpose Cluster

:::note warn
Job Clusterの場合、取得するMetricsのURLが変動するため、取得するには少し考慮が必要かと思います(検証未実施
:::

## 設定項目
- spark config
- init script
- Prometheusからmetricsを取得するためのconfig

### Spark Config

Spark Configについては、DatabrikcsのCluster作成画面からいつも通り設定してください。
namespaceは任意のname spaceです。

```bash
spark.ui.prometheus.enabled true
spark.metrics.namespace suda-spark
```

### init script
こちらもDBFSにinit scriptを配置してください。こちらをnotebookにコピペして実行すれば
一旦DBFS上に出力しますので、Clusterの画面からinit scriptを設置してもらえればいけます。

```bash
%scala
dbutils.fs.put("dbfs:/Users/hogehoge/prom_init_scripts",
"""
|#!/bin/bash
|cat <<EOF > /databricks/spark/conf/metrics.properties
|*.sink.prometheusServlet.class=org.apache.spark.metrics.sink.PrometheusServlet
|*.sink.prometheusServlet.path=/metrics/prometheus
|master.sink.prometheusServlet.path=/metrics/master/prometheus
|applications.sink.prometheusServlet.path=/metrics/applications/prometheus
|EOF
""".stripMargin, true)
```

### Clusterの再起動と設置後の確認
init scriptを再度読み込むために、clusterを再起動したらnotebook上で
下記コマンドでMetricksが取得できるかを確認します。

```bash
%sh
curl -L -H "Authorization: Bearer パーソナルtoken" -X GET https://WORKSPACEのURL/driver-proxy-api/o/0/ClusterのID/40001/metrics/prometheus

```

```bash
%sh
curl -L -H "Authorization: Bearer パーソナルtoken" -X GET https://${WORKSPACE}/driver-proxy-api/o/0/ClusterのID/40001/metrics/executors/prometheus
```

設定がうまく読み込めていればこんな形でmetricsが取得できていることが書くのにできるかと思います。

![Screenshot_2023-03-18_at_11_37_46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/d8c1e07e-e763-ed60-8c92-b2bfe73966a2.jpeg)
![Screenshot_2023-03-18_at_11_37_54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/a4205df2-e531-8d5e-75b2-68e52a14c67c.jpeg)

### Prometheus側の設定
prometheus.yamlのscrapeの箇所に下記の設定を追加します。
prometheus側からは、パーソナルtokenを使ってhttp経由での取得になるので、bearer_tokenで指定します。


```yaml
- job_name: "databricks"
    metrics_path: "/driver-proxy-api/o/0/0313-015028-llm0hx61/40001/metrics/prometheus"
    scheme: "http"
    bearer_token: "パーソナルToken"
    static_configs:
      - targets: ["WORKSPACEのFQDN"]

  - job_name: "databricks-exec"
    metrics_path: "/driver-proxy-api/o/0/0313-015028-llm0hx61/40001/metrics/executors/prometheus"
    scheme: "http"
    bearer_token: "パーソナルToken"
    static_configs:
      - targets: ["WORKSPACEのFQDN"]
```

あとはPrometheusのUIから見てみると、各種Metricsが取得できていることが確認できるので
grafanaなどで可視化するといい感じにできると思います。

![Screenshot 2023-03-16 at 21.15.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/ec5c4038-53a1-9a21-b65f-ecb29ee13eb5.jpeg)

以上で簡単ではありますがDatabricksでのPrometheusを使ったmetrics取得方法でした。
いい感じのDashboardがまだ見つからないので、どなたかいい感じのあれば是非教えていただきたいです。
Cloud Function をローカルで動かす


## function-frameworkの使い方

cloud functionの動作確認をしたいときに、デプロイして確認すると時間がかかってしまうことないでしょうか。
デプロイしたはいいが、つまらないミスで動作しておらず、デプロイを繰り返してしまう。
そのため確認作業にかなり時間がかかって困っておりました。
動作確認時間の短縮方法がないか調べていたところ、ローカルで動作確認できる方法(functions-framework)があったので、こちらを使ってみました。

https://github.com/GoogleCloudPlatform/functions-framework-python

### 利用環境
+ gcloud CLIがインストールされていること
+ python3.x以上がで実行 python3.7.0


### 関数を準備する
functionsで動かす関数を用意します。
以下の関数を、main.pyとして作成します。

```python:
def cloud_function_test(request):
  print("ログ出力")
  return "hello world"
```

### インストールする

ターミナルからpipでパッケージをインストールします。

```sh:インストール
pip install functions-framework
```

### ローカルサーバーを起動する
main.pyのあるフォルダでコマンドを実行してください。

```sh:サーバーを起動する
functions-framework --target cloud_function_test --debug
```

以下のようなにCLIに表示されれば、サーバーが起動されました。
```sh:起動ログ
 * Serving Flask app 'main'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8080
 * Running on http://192.168.10.8:8080
Press CTRL+C to quit
 * Restarting with watchdog (fsevents)
 * Debugger is active!
 * Debugger PIN: 143-809-603
```

アクセスして確認してみます。
サーバーを起動しているターミナルは残したままにしておき、別の新しいターミナルを開きます。

```sh:アクセスコマンド
curl http://127.0.0.1:8080
```
```sh:ログ
hello world%
```
## コマンドオプション

|フラグ|変数|説明|
|---|---|---|
|`--target`|`FUNCTION_TARGET`|リクエストを受け取る関数名|
|`--signature-type`|`FUNCTION_SIGNATURE_TYPE`|トリガーの種類を記載 <br> Default: `http`; accepted values: `http`, `event` or `cloudevent`|
|`--debug`|`DEBUG` |デバッグモード。ソース編集のたびにリロードされる状態となる|

## pub/subを使ったローカルテスト方法について
　別記事作成予定

## まとめ
　パッケージを導入して、サーバーを起動するだけなのでお手軽にcloudfunction環境をローカルに構築できました。
　これで動作確認がスムーズにできる。

## おまけ
普段は、今回のfunctions-frameworkをつかって引数の受け取り方などを確認しています。
※　cloudfunction(python)では裏側でflaskが動いているようなので、そちらで確かめても同じはず。

#### クエリパラメータの受け取り方

受け側（function）のソースを変更
```python:main.py
def cloud_function_test(request):
  received = request.args.to_dict()
  value1 = received.get("key1")
  value2 = received.get("key2")
  print(f"key1:{value1}  key2:{value2}")
  return "hello world"
```

パラメータをつけてアクセス
```sh:
curl "localhost:8080?key1=abc&key2=def"
```
```sh:ローカルサーバー側ログ
key1:abc  key2:def
```
*.bc.googleusercontent.comはhttps化できません【pki.goog】

https://190.212.72.34.bc.googleusercontent.com にアクセスしようと
証明書を作ろうとしましたが、CAAで作れませんでした

```bash
$ sudo certbot certonly --standalone --register-unsafely-without-email --agree-tos --non-interactive -d 190.212.72.34.bc.googleusercontent.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Requesting a certificate for 190.212.72.34.bc.googleusercontent.com
Performing the following challenges:
http-01 challenge for 190.212.72.34.bc.googleusercontent.com
Waiting for verification...
Challenge failed for domain 190.212.72.34.bc.googleusercontent.com
http-01 challenge for 190.212.72.34.bc.googleusercontent.com
Cleaning up challenges
Some challenges have failed.

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: 190.212.72.34.bc.googleusercontent.com
   Type:   caa
   Detail: CAA record for 190.212.72.34.bc.googleusercontent.com
   prevents issuance
```

# 原因

CAAレコードをみると**pki.goog**しかなく、**letsencrypt.org**は認証局として証明書の作成を許可されていませんでした。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/95b5987f-dbcf-37ef-109b-1a22a8fbe476.png)

https://caatest.co.uk/190.212.72.34.bc.googleusercontent.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/62d0cff5-673d-7146-0ea6-bc53779fd741.png)

# まとめ

***.bc.googleusercontent.com**は使えないので、別でドメインを取得するしかないようです

# 参考

https://cpoint-lab.co.jp/article/202103/19376/
Learn About Configuration in the Sales Process での問題[言語設定がNull]


+ [Learn About Configuration in the Sales Process](https://trailhead.salesforce.com/ja/content/learn/modules/cpq-product-configuration/configuration-in-the-sales-process)

+ [チャレンジの次のステップに進むことができません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000O6dlh)

ステップ 7 でこのモジュール演習を完了しようとしています (Quotes 関連リストからQ-00000 をクリックします。[Edit Lines]をクリックします)。 [edit lines] をクリックすると、空白の画面がロードされ、「Argument 2」というポップアップ メッセージが表示されます。 null にすることはできません」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ab5d3573-f598-cdfa-5b04-ca6f7b0e7939.png)


:::note
I cannot go pass the step "Edit lines", as it does not show it's loading any page and it only shows a pop up error message stating "Argument 2 cannot be null"

同僚と実際にもう一度試してみました。「会社情報」の言語と通貨を変更しましたが、うまくいきました。言語は「スペイン語 - Null」に設定されていましたが、「米国 - USD」に変更されました。
:::

+ [Argument 2 cannot be null (Configurable Bundles in Salesforce CPQ>Learn About Configuration in the Sales Process](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A97pLSAR)
+ [UNABLE EDIT QUOTE LINE IN Developer Edition Org with Salesforce CPQ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pf3k0)

# Quote Q-00001 argument 2 cannot be null

+ [Unable to open edit lines page in CPQ Quote](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007BGg0c)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e88992f5-5ee0-09b2-1eb6-40467e164415.png)

:::note
Try changing the language and currency on "Company information" and that worked. In my dev org the language was set to "Spanish - Null", changed it to "United States - USD". 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A97pLSAR

設定変更ができない

I think you need to Activate Multiple Currencies before you can see "Manage Currencies".

Try this:

In Setup, enter Company Information in the Quick Find box select Company Information and click Edit. Ensure that your selected currency locale is the default currency that you want to use for current and future records. Enable Activate Multiple Currencies, and then save your changes. Then you should see the option you're looking for.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8LvDSAV
:::

# Quote Line Editor: List has more than 1 row for assignment to SObject (System Code)

+ [Use features to organize a security system bundle: adding the Security Console bundle gives error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007W6tLn)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0a3bacb7-f20a-7c98-f7fc-c197249f3da1.png)

:::note
This helped me

https://morecpq.com/index.php/2022/06/14/quote-line-editor-list-has-more-than-1-row-for-assignment-to-sobject-system-code/
:::
whenever による記事数一覧のメール送信

## 参考

https://osamudaira.com/421/

## 参考(Action Mailer)

https://qiita.com/annaaida/items/81d8a3f1b7ae3b52dc2b

## 参考（whenever,cron,rake)
https://zenn.dev/yusuke_docha/articles/2d2cfd1030f6ac
GitHubにpushする際にPermission Errorが生じる

GitHubにpushする際にPermission Errorが生じる

久々にpush使用と思ったら、突然のエラー！！

sourcetreeを現在使用しています。
・sourecetreeとGitHubの紐付け
・リモートリポジトリを再度設定
など試したが、ダメでした😭


最終的に対処できたのでその方法を記載


ターミナルにて

    $ ls ~/.ssh/ 
    〇〇-GitHub 〇〇-GitHub.pub
実行すると 〇〇-GitHub と 〇〇-GitHub.pub と表示されるはず（その他にも表示されていても問題ないです）。
※〇〇はパソコンによって表示が変わります。


これらは鍵で、登録しないとGitHubにpushができません。

そして、以下を実行します。
※〇〇のところは上の値を参考にしてください。

    $ ssh-add -K ~/.ssh/〇〇-GitHub
最後に以下を実行してください。

    $ ssh -T git@github.com

そうしたところ、今回の問題は解決されました。
あなたもできる！話題の画像生成AI StableDiffusionで白雪姫の４コマ漫画を作る【実行するだけでできるColabノートブック付】

# やらなきゃ損？　あなたも今から使えるAI
![00000-1962772017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/66664562-a820-71ef-b638-6858fdc1d992.png)
話題の画像生成AIですが、**使ってる人は楽しそうでずるい！
自分も使いたい！**
いざ自分が使うとなるとどう使えばいいのかわからない。
**実はめっちゃかんたんです。**

今回は有名な童話白雪姫の４コマを作ってみて、どれぐらいかんたんかやってみます。

# 方法

以下のノートブックを開く。

https://colab.research.google.com/github/camenduru/stable-diffusion-webui-colab/blob/main/stable/stable_diffusion_webui_colab.ipynb

実行▶︎ボタンを押す。
リンクを開く。(Running on public URL)
![スクリーンショット 2023-03-18 10.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/4421a996-eefa-c98c-972e-7f19d47a6192.png)
この画面が出る。
![スクリーンショット 2023-03-18 10.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/99ec235b-45fb-89d5-fdd9-4e536d34423b.png)
テキストを入れる。Generate。


これだけ。

**１コマ目**

Snow White,the Seven Dwarfs,  smiling, looking happy
白雪姫、７人の小人、笑ってる、幸せそう

![00009-110832786.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/77aaf80a-1158-b105-6a14-812ae6bcffea.png)

**２コマ目**
The Evil Queen, disguised as an old woman, is offering Snow White a poisoned apple. Snow White is hesitant but the Evil Queen convinces her to take a bite.

老婆に変装した悪の女王が白雪姫に毒リンゴを差し出している。 白雪姫はためらいますが、邪悪な女王は彼女に一口食べるよう説得します。

![00010-968821098.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e21c1ba3-d89e-2ae6-4a9c-7711753802ab.png)

**３コマ目**
Snow White is lying on a bed, apparently lifeless, while the Seven Dwarfs are gathered around her, looking sad and mourning her death.

白雪姫がベッドに横たわり、死んだように見えますが、7人の小人が彼女の周りに集まり、悲しそうに見え、彼女の死を悼んでいます.
![00011-1579427006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e3e7a2f2-4d56-5efd-78a3-2cba4a1d9b48.png)

**４コマ目**
The Prince, kisses, Snow White, awakens, the Seven Dwarfs embrace, look on in joy.
王子様、キス、白雪姫、目覚め、七人の小人が抱き合い、喜びに満ちて見つめます。
![00017-714800941.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/afb45d23-98f3-0b1e-245e-94d82b045525.png)

はい、できました。

ちなみに、アニメ版も作りました。

ストーリーを４コマにするのはChatGPTに要約してもらったものを参考にしました。
![スクリーンショット 2023-03-18 10.12.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3afe4520-2521-e478-4e88-abb6f4879787.png)

🐣
****
フリーランスエンジニアです。
もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
wordpressで「画像の切り取りに失敗しました」の表示が出る場合

#php-gdという依存パッケージが入ってないのが原因


```.bash
# sudo apt-get install php7.4-gd
```

apacheを再起動

```.bash
# sudo systemctl restart apache2
```

これでOK

※ネットで参考にしたのがphp7.4だったのでこれで