OmniAICreator/Qiita-1.07M huggingface dataset:
美しいエンドポイントの書き方（後編）

# なにこれ？
APIにおけるエンドポイントとは、APIにアクセスするためのURIのことを指しますが、このURIが非常に見づらかったという経験はありませんか？

開発者にとっては**美しく開発すること**も1つのスキルと考えられます。**美しいエンドポイント**の書き方を知り、ワンランク上のエンジニアになりましょう！

前回の記事では、エンドポイントの**基本的な設計**に関して記述しましたが、今回は、**サーバー上に存在するリソースにアクセスするためのエンドポイントの設計**に関して記述します。


# リソースにアクセスするためのエンドポイントとは？
サーバー上に存在する**リソースにアクセスするためのエンドポイント**とは、例えば、ユーザー情報、ユーザーの友達関係情報、近況情報のことです。

こうしたリソースにアクセスするAPIは**WebAPIを作成する中で最も多く、繰り返し設計する必要**が出てきます。



# 美しいエンドポイントとは？
この記事を読んでいる人から、「**美しいエンドポイント**って言われてもわからない」そんな声が聞こえてきます。

今回お伝えする**美しいエンドポイント**とは、
”**覚えやすく、どんな機能を持つURIなのかがひと目でわかる**エンドポイント”
です。

美しいエンドポイントを作ることで、
+ 間違った利用方法を防ぐ
+ 開発者の生産性向上
+ APIを書いたあなたの評価を上げる

ことができます。


# 設計の注意点
美しいエンドポイントの基本的な設計を押さえた上で、リソースにアクセスするためのエンドポイントは以下のことに注意します。
+ 複数形の名詞を利用する
+ 利用する単語に気をつける
+ スペースやエンコードを必要とする文字を使わない
+ 単語をつなげる必要がある場合はハイフンを利用する

これらについて1つずつ説明していきます。


## 複数形の名詞を利用する
**HTTPメソッドが動詞を表す**ものなので、**HTTPのURIで名詞を用いる**ことで**最もシンプルにやりたいことを表現できる**のです。
また、データベースのテーブル名が複数形を用いるのが適切であるように、エンドポイントのパスに入るusersやfriendsは「**集合**」を表しているものであるので、複数形の方が適切であるとされています。

▼悪い例
```http://api.example.com/medias```
例えば、mediaの複数形はmediumです。
複数形は、日本人が間違いやすいので辞書を引くなどして確認しましょう。





## 利用する単語に気をつける
世界共通言語の一つである英語を使う以上、意味が伝わる英単語を選択する必要があります。

例えば、「探す」という意味を持つ、searchとfindは次のような違いがあります。
| 英単語 | 目的語 |
|:-:|:-:|
| search  |  探す場所 |
| find  | 探すもの  |

searchとfindの場合は、基本APIで利用されるのはsearchの方なのでsearchを使えば良いでしょう。しかし、英語がネイティブではない場合、適切な単語を選ぶのはなかなか難しいです。
なので、複数のAPIを参考にして単語を選ぶのが良いでしょう。




## スペースやエンコードを必要とする文字を使わない
URIには利用できない文字があり、そのような文字は**パーセントエンコーディング**されてしまいます。そのため、**そのエンドポイントが何を表しているのかがわからなくなってしまいます。**

パーセントエンコーディングとは、文字コードを％を使ってエンコーディングすることです。例えば、日本語のようなエンコーディングによってコードが変わる（UTF-8やShift JISなど）ものはパーセントエンコーディングされやすいです。

▼悪い例
```http://api.example.com/v1/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC/123```
このようなエンドポイントは全く意味が伝わりません。

ASCIIの範囲にも％や＆、＋などパーセントエンコーディングが行われる文字もあるので気をつけましょう。
また、スペースはURI中では＋に変換されてしまうので避けた方がベターです。





## 単語をつなげる必要がある場合はハイフンを利用する
単語をつなげる方法は主に3つあります。
- **スパイナルケース（チェインケース）**
- スネークケース
- キャメルケース

実際に公開されているAPIを見ると、単語のつなぎ合わせに**決定的なルールはありません。**

しかし、この中で、ハイフンで単語をつなぐ**スパイナルケースを利用することをおすすめ**します。
これは次のような理由からです。
- URIのホスト名でアンダースコアは使えない
- URIのホスト名でドットは特別な意味を持つ
- ハイフンは大文字小文字の区別がない
- ホスト名と同じルールでURI全体を統一できる

ただし、最も良いのは**単語をつなぎ合わせることを極力避ける**ことです。
パスを区切ったり、一部をクエリパラメータにすることで、なるべく短い表現を目指しましょう。






# 最後に
美しいエンドポイントには共通点があり、広く使われているようなサイトのエンドポイントは美しく設計されていることが多いです。
今回の記事を参考に、美しいエンドポイントを設計できるようになり、美しいエンジニア(?)になりましょう。


# 参考文献
今回の記事は、"Web API: The Good Parts"を参考にさせていただきました。
プリンタへのハッキング（小ネタ）

# 小ネタ
ネットワーク接続されたプリンタ（エプソンのEP-802A)にポートスキャン　
`nmap -A プリンタのローカルIPアドレス`
を実行すると、印刷が実行された。

**印刷された内容**
![IMG_20220713_211411260.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/36a97117-1200-cca5-f703-7ab4f59fd8ee.jpeg)
BigQueryで日次、週次、月次の集計をする

BigQueryで集計

# データソース

`created_at` にTIMESTAMP型で何かしらのデータの作成日が入っている想定です。

| created_at(TIMESTAMP)                     | user_id(INT) | 
| ------------------------------ | ------- | 
| 2022-01-02 14:13:30.801506 UTC | 1       | 
| 2022-01-03 12:13:30.801506 UTC | 2       | 
| 2022-01-04 11:13:30.801506 UTC | 1       | 

# 日次で集計

UU数で出すように `DISTINCT` を付けていますが適宜外してください。

```sql
SELECT
  CAST(created_at AS DATE) day,
  COUNT(DISTINCT user_id)
FROM
  posts
GROUP BY
  day
ORDER BY
  day
```

# 週次で集計

週次の集計は `DATE_TRUNC` 関数で `WEEK` を指定し日付の丸め込みを行います。

https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions#date_trunc


## 日曜始まりで週次集計する場合

```sql
SELECT
  DATE_TRUNC(CAST(created_at AS DATE), WEEK) AS week,
  COUNT(DISTINCT company_id)
FROM
  posts
GROUP BY
  week
ORDER BY
  week
```


## 月曜始まりで週次集計する場合

```sql
SELECT
  DATE_TRUNC(CAST(created_at AS DATE), WEEK(MONDAY)) AS week,
  COUNT(DISTINCT company_id)
FROM
  posts
GROUP BY
  week
ORDER BY
  week
```

# 月次で集計する場合

```sql
SELECT
  DATE_TRUNC(CAST(created_at AS DATE), MONTH) AS month,
  COUNT(DISTINCT company_id)
FROM
  posts
GROUP BY
  month
ORDER BY
  month
```

---

※こちらの記事は自ブログからの転載です

https://akinov.hatenablog.com/entry/2022/07/13/210531
Abstract class に定義したフィールドをモック化する方法

以下のような実装で、`hogehoge`フィールドをモック化する方法になります。
```kotlin
abstract class AbstractHoge {
    protected val hogehoge = (1..10).random()
}

class Hoge : AbstractHoge() {
    fun hogeTwice(): Int {
        return hogehoge * 2
    }
}
```

```kotlin
class HogeTest : FreeSpec({
    "hogehoge が 5 を返した場合、10 を返すこと" {
        val hoge = Hoge()
        val hogehoge = 5
        val field = AbstractHoge::class.java.getDeclaredField("hogehoge")
        field.isAccessible = true
        field.set(hoge, hogehoge)

        val actual = hoge.hogeTwice()
        actual shouldBe 10
    }
})
```
SQLで現在時刻をINSERTする時の指定方法

単純なことだったけど、どこにも記事がなかったので残します✏️

## 結論
これだけでOK！
```
now()
```

## 用法

```sql:SQL
insert into テーブル名(現在時刻を入れるカラム) values (now())

```
【備忘録】【Python】処理の高速化のための知識

* **ベクトルプログラミングによる高速化**
配列の各要素に対して同じ処理を行う場合，
```python
for x in range(100): x ** 2
```
のようにfor文を回すより，
```python
import numpy as np
np.arange(100) **2
```
のようにベクトル的に処理したほうが速いらしい．
参照元↓

https://stackoverflow.com/questions/10698858/built-in-range-or-numpy-arange-which-is-more-efficient
サイバーセキュリティお嬢様「き...脆弱性ってなんですの？」

# ある日
サイバーセキュリティお嬢様（以下CSお嬢様）「おーほっほ！」
CSお嬢様「CIAも追加の４要素も完璧、」
CSお嬢様「これで**怖いもの無し**ですわぁー！」

じいや「**お嬢様！甘いですぞ！**」

CSお嬢様「じいや一体何事ですの」

じいや「お嬢様にはこれから**怖い話**をして差し上げましょうぞ」


# 情報資産とは
じいや「怖い話の前に」
じいや「まず守るべきもの、の話をしましょうか」

CSお嬢様「**じいやが守るべきものはわたくしに決まってましてよ？**」

じいや「おっしゃる通りですお嬢様」
じいや「そして」
じいや「**情報セキュリティ上の脅威から守るべき資産**のことを情報資産と呼びますぞい」

CSお嬢様「つまり」
CSお嬢様「わたくし＝情報資産ってことですわね！」

じいや「あえてツッコミはしませんぞ、お嬢様」

# リスクとは
じいや「リスク（risk）とは」
じいや「**目的に対する不確かさの影響**、ですじゃ」

CSお嬢様「**今回もじいやが何を言っているのかさっぱりですわ**」

じいや「じいやは**JIS Q27000**で規定されている文章をそのまま読み上げたまでですぞ」
じいや「今回もお嬢様にも分かる様に説明いたしますと」
じいや「先ほど述べた、情報資産を脅かす要因...つまりは**脅威によって情報資産が損なわれる可能性**のこと」

じいや「例えば」
じいや「お嬢様に対してなんらかの被害が及ぶ可能性がある状況...」
じいや「それには、【脅威】と【脆弱性】について理解を深める必要がありますぞい」


# 脅威とは

CSお嬢様「脅威、ってなんですの」

じいや「脅威（threat）とは」
じいや「先ほどさらっと触れましたが」
じいや「システム又は組織に損害を与える可能性がある、望ましくないインシデントの潜在的な要因のことですぞ」

CSお嬢様「**まーたインシデントとかいう新しい言葉が出てきやがりましたわ**」

じいや「お嬢様、お言葉を謹んでいただきたいものですな」

じいや「リスクが【**可能性**】を指すのに対し」
じいや「インシデントは【**リスクが顕在化した事態**】のことを指すのですぞ」
じいや「リスク→インシデント　というイメージですな」

CSお嬢様「なんとなくつかめてきましたわ」

じいや「話を戻すと」
じいや「脅威は」
じいや「お嬢様が何者かに攫われたり」
じいや「我々使用人がなんらかのミスでお嬢様にお怪我をさせてしまったり」
じいや「そういったことを指しますな」

CSお嬢様「想像しただけでゾッとしますわね」


# 脆弱性とは

CSお嬢様「それで、きじゃくせい...ってなんですの？」

じいや「お嬢様、 **【ぜいじゃくせい】** と読むのですぞ」
じいや「脆弱性（vulnerability）は」
じいや「１つ以上の脅威によって付け込まれる可能性のある、資産又は管理策の弱点、のことですじゃ」

CSお嬢様「じいや、分かってますわよね？」

じいや「もちろんですぞ」
じいや「お嬢様にも分かる様に説明いたしますと」
じいや「お嬢様をお守りする警備体制の甘さや」
じいや「使用人がうっかり機密事項を外部に話してしまうようなリテラシーの低さ」
じいや「システムだと、バグや不具合なども該当しますな」

CSお嬢様「つまり、弱点（ウイークポイント）ってことですわね！」

じいや「先ほどじいやが説明したところですが、まあその通りですぞ」


# おわりに
じいや「どうでしたかな」

CSお嬢様「今回も難しかったけれど、なんとかついていけたわ、ありがとうじいや」

じいや「これからも少しずつセキュリティの知識を身につけて」
じいや「**真のサイバーセキュリティお嬢様**を目指すのですぞ」

CSお嬢様「わたくし頑張りましてよー！」

# 参考文献
サイバーセキュリティ入門 第２版
情報セキュリティ読本 五訂版

### 前回までのあらすじ
[サイバーセキュリティお嬢様「CIAってなんですの？」](https://qiita.com/choco_py3/items/51c04bdc8bfe25fe84f3)
[サイバーセキュリティお嬢様「しんせいせい...ってなんですの？」](https://qiita.com/choco_py3/items/0d05409534f267e40001)

### 次回以降
[サイバーセキュリティお嬢様「マルウェア...？スキーウェアのお仲間ですの？」](https://qiita.com/choco_py3/items/00af04f6906de4135b48)
[サイバーセキュリティお嬢様「クラッカー？何それ食べられますの？」](https://qiita.com/choco_py3/items/40fe5a27af3722daa654)
[サイバーセキュリティお嬢様「ハクティビストってなんですの？」](https://qiita.com/choco_py3/items/262df8fc893cf7fd303f)
[サイバーセキュリティお嬢様「F5攻撃（アタック）ってなんですの？」](https://qiita.com/choco_py3/items/f0164dedc7e4b761b25d)
[サイバーセキュリティお嬢様「SQLいんじぇくしょん...ってなんですの？」](https://qiita.com/choco_py3/items/4a597f25f0c3dbbea437)
[サイバーセキュリティお嬢様「クロスサイトスクリプティング？...美味しそうですわぁ！」](https://qiita.com/choco_py3/items/f3bb70ecf819bb55ad80)

# 宣伝
[技術書典13](https://techbookfest.org/event/tbf13)にサークル参加予定ですわ！
良かったら[Twitter](https://twitter.com/choco_py3)フォローしてくださいですわー！
Flutterの開発で状態管理にRiverpodとProviderを使ってみた感想

# はじめに
<!-- 発端や概要を記載 -->
Flutterの状態管理はいろいろとありますが、
今回はRiverpodとProviderについての記事になります。
新しく開発をするときにどちらを使うか迷ったので、
両方使ってみて、どちらが良いか個人的な意見を述べたいと思います。

# 対象読者
Flutterの状態管理でRiverpodかProviderどちらを使おうか迷っている人

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Provider](#Chapter1)
1. [Riverpod](#Chapter2)
1. [個人的にどちらを使いたいか](#Chapter3)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Provider
`InheritedWidget`をラップして、複数のwidgetで状態を共有できるパッケージです。
Providerを使うことでUIのコードと、UIの状態と操作するコードを分離できるため、
メンテナンス性の高いコードが書けます。


<a id="#Chapter2"></a>
# Riverpod
RiverpodはProviderの作者が作成したProviderの改良版です。
特徴としては、Flutterに依存せず、グローバルに状態にアクセスできるようになってます。
より詳細で技術的な説明は、今の私ではできませんが、主観的にはProviderより柔軟性が高く、書いていてストレスが少ない印象でした。

<a id="#Chapter3"></a>
# 個人的にどちらを使いたいか
色々と記事を漁り、有識者にも質問しましたが、結論、どちらを使っても開発のネックになることはないという印象を受けました。
つまり、どちらを使っても問題ないので、個人の主観やプロジェクトメンバーの間での好みで決めればいいのかなと思います。
個人的にはRiverpodを使いたいと思いました。
理由は以下です。
・Riverpodの方が新しく、Providerの改良版ということで盛り上がっている印象があるため。
・単純にRiverpodの方が書きやすかった
・AsyncValueを使うことで、非同期の状態管理がしやすかった
・他のProvider(状態)を参照しやすい
webpackでnpm run buildできなかった時

## webpackでnpm run buildできなかった時

webpackでコンパイルを実行したい矢先、
ずっとエラーに悩まされていたところスッと解決できたのでメモ。

最初(エラーに苦しんでいた時)の`package.json`の状態。

```package.json
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
 },
```
この状態で`npm run build`すると、
```
> *****@1.0.0 build
> webpack

sh: webpack: command not found
```
このエラーに苦しめられていましたが、[こちらのページ](https://stackoverflow.com/questions/38788166/webpack-command-not-working)を参考にしながら`"build"`プロパティに適切なパスを設定してやらなければいけない事がわかり、再度`package.json`を設定し、
```package.json
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "/Users/****/****/.../node_modules/.bin/webpack"
},
```
同じwebpackディレクトリでも今度は`npm bin`を実行して得られたパスを`"build"`プロパティに渡して実行したところ、無事うまくいきました。
[備忘録]`SwiftPM.SPMRepositoryError error 3.`の解決手順

## 環境
swift version 5.6.1
Xcode 13.3.1

## 発生した問題
以下エラーが出てビルドが失敗
```
The operation couldn’t be completed. (SwiftPM.SPMRepositoryError error 3.)
```

## 解決した手順
- Xcodeを終了
- ターミナルで以下コマンドを実行
```
rm -rf ~/Libray/Developer/Xcode/DerivedData
rm -rf ~/Library/Caches/org.swift.swiftpm
```
- Xcodeを起動
- Xcode左上のメニューから [File] -> [Packages] -> [Reset Package Caches]

## 原因
SPMパッケージのキャッシュが破損したことが原因。

## 参考
- [How to resolve SwiftPM.SPMRepositoryError error 3 in XCode 13.3 - stack overflow](https://stackoverflow.com/questions/71603178/how-to-resolve-swiftpm-spmrepositoryerror-error-3-in-xcode-13-3)
- [【XCode】SwiftPM.SPMRepositoryError error 3 エラー - zenn](https://zenn.dev/shinkano/articles/69fc3c1e4b6de5)
【GCP】DataStoreのKindをDataFlowで削除するアレコレ

# 概要

`DataStore`の`kind`を一括で削除するための`DataFlow`を作成した際のアレコレをまとめる

設定についてはこちらを参考にさせていただきました

https://techblog.ap-com.co.jp/entry/2019/01/17/000000

# 設定項目

- ジョブ名
    - 任意のジョブ名
- リージョン エンドポイント
    - 任意のリージョン
- Dataflowテンプレート
    - Bulk Delete Entities in Datastore [Deprecated]
- GQL Query
    - SELECT * FROM `kind名`
- Read data from Datastore Project Id
    - 削除するDataStoreのプロジェクトID
- Delete all matching entities from the GQL Query present in this Datastore Project Id of
    - 削除するDataStoreのプロジェクトID
- 一時ファイルな場所
    - 一時ファイルを書き込むためのGCSのバケットを指定する
- サービスアカウントのメール
    - `Dataflow ワーカー`権限を付与したサービスアカウントを指定
    - `Dataflow デベロッパー`権限も付与して当方は設定したが恐らく不要
- ネットワーク
    - ご自身のVPCのネットワーク名
- サブネット
    - - ご自身のVPCのサブネット名

# `DataFlow`経由で`GQL`を実行してくれる

![スクリーンショット 2022-07-13 20.20.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/546ec41f-7185-fe2d-35b0-a1f5e0f26ba5.png)


# 遭遇したエラー内容

対処方法：`Dataflow API`とサービスアカウントに付与した権限が不足していないかをチェックする

```bash
“Workflow failed. Causes: There was a problem refreshing your credentials. Please check:
1. Dataflow API is enabled for your project.
2. Make sure both the Dataflow service account and the controller service account have sufficient permissions. If you are not specifying a controller service account, ensure the default Compute Engine service account [PROJECT_NUMBER]-compute@developer.gserviceaccount.com exists and has sufficient permissions. If you have deleted the default Compute Engine service account, you must specify a controller service account. For more information, see: https://cloud.google.com/dataflow/docs/concepts/security-and-permissions#security_and_permissions_for_pipelines_on_google_cloud_platform. , There is no cloudservices robot account for your project.  Please ensure that the Dataflow API is enabled for your project.”
```

対処方法：ネットワーク・サブネットのどちらも設定されていない場合に発生するので設定を確認する

```bash
Workflow failed. Causes: Network default is not accessible to Dataflow Service account or does not exist
```

対処方法：IAMでサービスアカウントに対して付与した権限が不足してるので確認する

```bash
Permissions verification for controller service account failed. All permissions in IAM role roles/dataflow.worker should be granted to controller service account hogehoge@fugafuga.iam.gserviceaccount.com.
```
ソフトウェア開発とかのときの W-8BEN-E 記入のメモ

## 背景

日本拠点の会社が, US からソフトウェア開発とかサポートとかで報酬もらうとき, W-8BEN-E(個人の場合は W-8BEN)を各社ごとに提出する必要があります. 
(IRS とかに提出ではない)

そうしないと米国側で源泉徴収されてしまいます.
(日米租税条約により免税するのが W-8BEN-E)


Github sponsor では予め記入する部分が決まっているのでわかりやすいですが, 一般の場合は初見めんどいです.

2021 Oct 改正版? を想定します.

## 情報

https://caseron.co.uk/how-to-complete-a-w-8ben-e-form/

https://www.iscle.com/web-it/g-drive/adsense/youtube-w-8ben-e.html

https://www.adminweb.jp/blog/2021053002/#section1


https://www.irs.gov/businesses/international-businesses/japan-tax-treaty-documents

https://jicpa.or.jp/specialized_field/publication/files/00233-000470.pdf

Youtube も予め記入する部分が決まっていてやりやすいですね...

### 主なところ

* Part I 4
  * 通常の株式会社や合同会社だと Corpolate
  * (個人事業主だと simple trust っぽ?)
* Part I 5
  * Active NFFE(非金融業で, 事業収入がメイン(利子とかの passive な収入がメインではない)企業)
  * Part XXV(39)にもチェック
* Part III 14a
  * チェック 
* Part III 14b
  * 中小企業とかだと大体は `Company that meets the ownership and base erosion test`
  * test は企業の種類判定みたいな意味合いのようです. ownership = 50% 以上の株を持っているかなど
  * `erosion` というぶっそうな名称で, 日本語では「侵食」と訳されへんてこな名称が付いていますが, 税界ではよく使われる用語っぽい https://www.mofa.go.jp/mofaj/files/000343383.pdf
  * `base erosion test` => 租税条約の特典を受けることができる会社という意味っぽ?
  * `company with an item of income that meets active trade or business test` は, 米国でも事業をしている企業が該当するっぽい
* Part III 15
  * 該当する Article and paragraph
  * 税率(通常 0%(免税))
  * type of income(これは取引次第)

#### Part III 15 の Article paragraph

https://home.treasury.gov/system/files/131/Treaty-Japan-11-6-2003.pdf

に情報があります. ただ見にくいです.

https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/507431/usa-consolidated_-_in_force.pdf

Article 構成は OECD 準拠?っぽくて UK のとたぶん同じなのでこちらを参考にするといいかも.
だいたいは 

* Article 7 : ビジネス収益
* Article 12 : ロイヤリティ

となるでしょうか
よほどのことがなければ paragraph は 1 でしょうか(Youtube の例を見る限り)

## 日米租税条約の減免

投資交流を図る目的で, 源泉徴収が減免(免税)されています.

https://www.nta.go.jp/publication/pamph/pdf/2643.pdf
https://www.mof.go.jp/tax_policy/summary/international/tax_convention/press_release/sy151107_index.htm

* 使用料(ソフトウェア開発や, Github sponsors などのロイヤリティ)は 50% 以上の議決権を持つ事業体であれば一般的には 0%

2020 年からはさらに利子についても免税になりました.

https://www.jetro.go.jp/biznews/2019/09/03e52b2495b18a11.html

消費税についても基本かからない(ただ, 簡易課税業者の場合は海外売上が多い場合は無駄に消費税を負担する場合がある)

したがって OSS 開発して報酬もらう場合, Github sponsor など米国会社ですと源泉徴収も消費税も取られずに得する可能性があります.
(OSS 開発だと, 理想は寄付あつかいで非課税でしょうが...)

## おまけ: W-8BEN

個人の場合は, マイナンバー記入が必須になります.
マイナンバーの個人情報の扱いについては, 先方の会社を信頼するしかないですね...
[Ruby]オプションの使い方・取得の仕方(OptionParser)

最近学んだOptionParserの使い方についてアウトプットします。

まず以下のような課題があるとします。
### Rubyでカレンダーを作る

`$ cal`で表示されるカレンダーを作ってみよう。

イメージ
```
➜ ruby calendar.rb
      2月 2022
 日 月 火  水 木 金 土
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
```

### 必須要件
- macに入っているcalコマンドと同じ見た目になっていること
- Gemは使わないこと
- `-m`オプションで月を指定できるようにすること。今年が2022年なら `cal -m 6`で2022年6月のカレンダーになる。
- 引数を指定しない場合は、今月・今年のカレンダーが表示される


### 本題
この課題に対して、どのようにOptionPaserを駆使するか。。
まず、使い方の流れは以下の通りです。
1. OptionPaser オブジェクト opt を生成する。
2. オプションを取り扱うブロックをoptに登録する。
3. opt.parse(ARGV)でコマンドラインを実際にparseする。

### 各項目を詳しく
##### 1. OptionPaser オブジェクト opt を生成する。
```
require 'optparse'
opt = OptionParser.new
```
##### 2. オプションを取り扱うブロックをoptに登録する。
```
option = {}

opt.on('-m [v]') {|v| option[:m] = v}････# オプションmを作り、0-12までの数字を入れられる仕組み
```
ここでの[v]は引数を受けつけられることを意味しています。さらに[]をつけてる意味は引数が必須ではないことを示しています。
##### 3. opt.parse(ARGV)でコマンドラインを実際にparseする。
```
opt.parse!(ARGV)
```
以上この３段階を経て完成です。簡単に見えますが、調べながら考えてコードを書くのに時間がかかりました。実際にこのコードの返り値を駆使して月の指定をすることができました。
Boltを使ってインタラクティブなSlackアプリを作る

# boltを使ってSlackアプリを作ろう
## 経緯
私は普段GASを使ってSlackアプリを作成するのですが、GASだとスラッシュコマンドを作るくらいが限界で、ショートカットを作ったり、ユーザーのアクティビティにすぐに反応するbotを作ったりすることができませんでした。そこで代替のものを探しているとBoltに行き着きました。

## 今回作るもの
試しに、Slackのショートカットコマンドを作ってみたいと思います。  
ショートカットで出てきたダイアログにテキストを打ってもらうと、そのテキストが特定のチャンネルに投稿されるようにします。
本来はherokuを使って公開したいところですが、お試しなので気軽に試せるglitchを使用したいと思います。

<details><summary>glitchだといまいちな理由</summary><div>
glitchはオンラインで編集ができるなど便利な点が多いのですが、無料版だと15分しか起動できないという欠点があります。これによりSlackでglitchアプリを呼び出す際に（ほぼ）毎回glitchを起動させるのに時間がかかってしまいます。<br>
Slackのアプリは3秒以内にレスポンスがないとエラーを吐いてしまうので、かなりの頻度でエラーが起きてしまうんですよね。その点からいうとglitchでSlackアプリを作るなら有料版のほうがいいかもしれませんね。
</div></details>

## 用意するもの

- SlackのWS
- glitchアカウント

## 作り方
### 1. Slackアプリを作成し、WSに導入する
[Slack api用のサイト](https://api.slack.com/apps)から自分のアプリを作成しましょう。できたらincoming webhookを追加してSlack WSへのインストールを行います。  
今回使うのはSigning Secretとbot tokenです。それぞれコピーしてください。

### 2. glitchを開き、Boltでコードを書く
glitchでログインしたら、私の[プロジェクトのページ](https://glitch.com/edit/#!/abstracted-ethereal-cereal)に行き、「Remix」ボタンを押して自分のプロジェクトとしてコピーしてください。  
コピーができたら、.envのところを開きます。

![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/bbd957da-5c49-589c-6862-a42e61c41cc5.png)

SLACK_BOT_TOKENにbot token、SLACK_SIGNING_SECRETにSigning Secretを、それぞれペーストしておきます。残りのCHIDには投稿したいチャンネルのIDを貼っておきます。
出来たら自分のプロジェクトのプロジェクト名を控えておきましょう。

### 3. glitchで作ったアプリとSlackアプリを連携させる
さきほどのSlackアプリの画面に行ったら、「Interactivity & Shortcuts」のページに行ってみて下さい。

![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/af82ac99-e461-4a21-0b23-2fc67ffa9a39.png)

「Interactivity」をOnにしたら、Request URLのところに画像のように「https://your-project-name.glitch.me/slack/events 」という形で記入してください。次にshort cutを作成しましょう。名前や説明は何でもいいですがCallback IDは「test」としておいてください。「save changes」を押した後、再度アプリをSlackにインストールしてください。  

設定は終わりです！Slackでテストをしてみましょう。

### 4. testしてみよう
試す前に、追加したアプリを投稿させたいチャンネルに参加させておいてください。
Slackでショートカットのところを見ると、オウム返しbotが追加されていますね！
試しに押してみましょう。

![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/b3a35a65-ff40-576c-e052-cb9516a1d942.png)

このような感じでダイアログが出てきたでしょうか？画像のような感じでテキストボックスに適当な文字を入れて送信してみてください。

![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/525a39a4-4d88-7af9-5691-321c2e5835a0.png)

メッセージが送信されていますね。

<details><summary><b>うまくいかなかったら</b></summary><div>
Slackアプリの画面で「OAuth & Permissions」を開き、scopesの部分で「chat:write」を追加してみてください。もう一度実行すると、できるようになるかと思います。
</div></details>

## 終わりに
GASにこだわらなければ割と簡単にインタラクティブなアプリを作ることができました。  
投稿に自動でスタンプを押す機能も開発したので、続編として記事を書いてみたいと思います。

### 参考
https://slack.dev/bolt-js/ja-jp/tutorial/getting-started

https://qiita.com/tomomi_slack/items/93538f9a69eb4015f951
【Swift】FontAwesomeを使う

# はじめに
今回はFontAwesome v4.7.0に自分の使いたいアイコンがあったのでv4.7.0の使い方を紹介します。
おそらくv4.7.0以降でも同じ使い方が可能だと思います。

# 実装
## フォントファイルをダウンロード
最初に[こちら](https://fontawesome.com/v4/get-started/)からフォントファイルをダウンロードします。
![スクリーンショット 2022-07-13 19.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2398d5d6-6469-49a3-7bdb-e113efc4f6ac.png)
このようなファイルがダウンロードされたと思います。
![スクリーンショット 2022-07-13 19.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ade40a7e-4a0a-3074-5c53-146e517f9032.png)

## フォントの読み込み
ダウンロードされたファイルの中から「FontAwesome.otf」をXcodeに読み込ませます。
![スクリーンショット 2022-07-13 19.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/59f8ab9d-d377-44d0-d35d-95bc2bc5ecb3.png)

フォントの読み込み方法は下記のリンクを見てください。

https://qiita.com/SNQ-2001/items/6531526ab3aa51855247

## 拡張を作成
コピペで大丈夫です
```swift
extension String {
    static func FontAwesome(unicode: String) -> String {
        guard let unicode = Int(unicode, radix: 16) else { return String(format: "%C", 0x0000) }
        return String(format: "%C", unicode)
    }
}
```

# 使い方
[こちら](https://fontawesome.com/v4/icons/)から使いたいアイコンを探します。
今回はPayPalのアイコンを表示することにしました。
![スクリーンショット 2022-07-13 19.38.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6784705e-b857-4d0f-a39e-9a440effd99f.png)
アイコンを選択すると詳細ページに行きます。
赤枠で囲まれているUnicodeをコピーします。
![スクリーンショット 2022-07-13 19.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a90ea59f-a454-ee29-08bd-d87910114785.png)

## SwiftUI
```ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        Text(String.FontAwesome(unicode: "f1f4"))
            .font(.custom("FontAwesome", size: 80))
    }
}
```
ここでアイコンの指定をします。
```swift
String.FontAwesome(unicode: "f1f4")
```

ここでフォントの設定をします。
```swift
.font(.custom("FontAwesome", size: 80))
```

![Simulator Screen Shot - iPhone 12 - 2022-07-13 at 19.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/343eb941-8700-7d3d-4534-e32de1329d64.png)

## UIKit
```ViewController.swift
import UIKit

class ViewController: UIViewController {

    var Label: UILabel = {
        var label = UILabel()
        label.font = UIFont(name: "FontAwesome", size: 80)
        label.text = String.FontAwesome(unicode: "f1f4")
        label.translatesAutoresizingMaskIntoConstraints = false

        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(Label)

        NSLayoutConstraint.activate([
            Label.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0),
            Label.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0)
        ])
    }
}
```
ここでアイコンの指定をします。
```swift
label.text = String.FontAwesome(unicode: "f1f4")
```

ここでフォントの設定をします。
```swift
label.font = UIFont(name: "FontAwesome", size: 80)
```
![Simulator Screen Shot - iPhone 12 - 2022-07-13 at 19.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/343eb941-8700-7d3d-4534-e32de1329d64.png)

# おわり
サンプルプロジェクトです。
アイコンとユニコードの一覧作りました。

https://github.com/SNQ-2001/FontAwesome-Swift
M1Macでもansible-playbookでcowsayしたい

## チームでAnsible勉強中、僕の牛だけずっと鳴いてくれなかったので、なんとしても解決したかった

### 原因
- M1Macが私だけだったこと

### 原因の詳細

- M1の場合brewでインストールされるパスが/usr/local/ではなく/opt/homebrew/配下になるので、Ansibleから見た時にcowsayはインストールされていないと扱われてしまう

```
/opt/homebrew/
```

### 解決策

- ansibleがcowsayの存在を確認するpathを確認

```py
# ansible/lib/ansible/utils/display.py 
b_COW_PATHS = (
    b"/usr/bin/cowsay",
    b"/usr/games/cowsay",
    b"/usr/local/bin/cowsay",  # BSD path for cowsay
    b"/opt/local/bin/cowsay",  # MacPorts path for cowsay
)
```

> 該当コード：

https://github.com/ansible/ansible/blob/4565a3893da010a345c631618056fb9e0f119bfe/lib/ansible/utils/display.py#L74

- シンボリックリンクを作成 

```
cd /usr/local/bin/
sudo ln -s /opt/homebrew/bin/cowsay cowsay
```

#### 鳴いた（喜）

```
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

参考記事：
https://qiita.com/zaki-lknr/items/5de3f11389090f38bf6e
【VBScript】FizzBuzz問題を解いてみる

### 1.やりたいこと

VBScriptでFizzBuzz問題を解きたいです。
>Fizz Buzzは英語圏で長距離ドライブ中や飲み会の時に行われる言葉遊びである
(引用元：WikiPedia)

プログラミングの問題だと思っていたら、言葉遊びなんですね:flushed:

- 3の倍数のとき：「Fizz」を出力する
- 5の倍数のとき：「Buzz」を出力する
- 15の倍数のとき：「Fizz Buzz」を出力する
- それ以外のとき：数字を出力する

今回は1から100までの数字で解いていきます。
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/8019cd14-1202-916e-c376-285a7885913c.gif)


### 2.環境

- windows10 バージョン21H2
- Microsoft-IIS 10.0
- VBScript 5.8（16384）


### 3. 作成したコード

以下がコードの一例です。
※`<p>`は改行のために入れています。

```vb:sample.asp
<%@ Language = VBScript codepage = 65001 %>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<html>
<body>
<% For nCnt = 1 to 100 %>
<p><%
    If nCnt Mod 3 = 0 And nCnt Mod 5 = 0 Then  
        Response.Write "Fizz Buzz"   
    ElseIf nCnt Mod 3 = 0 Then   
        Response.Write "Fizz"   
    ElseIf nCnt Mod 5 = 0 Then   
        Response.Write "Buzz"
    Else   
        Response.Write nCnt  
    End If
 %>
<% Next %>
</body>
</html>
```


### 4. 解説

- 使用する言語の宣言と文字化け対策のコードを頭に書きます。

```vb
<%@ Language = VBScript codepage = 65001 %>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
```

- 1から100まで繰り返したいのでForNextステートメントを使用します。

```vb
For ループカウンタ = 初期値 To 終了値 [Step 増分値]
  ' 処理
Next
'↓
For nCnt = 1 to 100
Next
```

- 3の倍数は **「3で割り切れる数」** とも言い換えることができるので、剰余演算子のModを使って0になることを条件にします。

- 今回は4つのパターンに分かれるので条件分岐を使用する。

    - 3の倍数
    - 5の倍数
    - 3の倍数かつ5の倍数
    - どれにも該当しない

- 条件が合致する場合、配下の処理が実行され、if文の処理は終了するので、頭に15の倍数(Fizz Buzz)を持ってきます。
- Response.Writeで出力します。

```vb
If 条件 Then
 　' 処理
ElseIf 条件 Then 
 　' 処理
Else 
　 ' 処理
End If
'↓
If nCnt Mod 3 = 0 And nCnt Mod 5 = 0 Then  
    Response.Write "Fizz Buzz"   
ElseIf nCnt Mod 3 = 0 Then   
    Response.Write "Fizz"   
ElseIf nCnt Mod 5 = 0 Then   
    Response.Write "Buzz"
Else   
    Response.Write nCnt  
End If
```


### 5. 参考

1.[Fizz Buzz](https://ja.wikipedia.org/wiki/Fizz_Buzz)
2.[VBScript: For Next文の書き方](https://step-learn.com/article/vbscript/093-for-next.html)
3.[VBScript – Mod 関数／剰余演算子 のバグの再現方法と解決方法](https://blog.soln-sns.net/how-to-solve-the-vbscript-mod-bug-problem/)
4.[VBS if文のサンプル(VBScript)](https://itsakura.com/vbs-if)
5.[サンプルコードで学ぶASP - Write](https://asp.verygoodtown.com/category/reference/asp-object/response-object)


### 6.最後に

記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。
[AtCoder]Python3でAtCoder水色になるまでに知っておいた方が良いこと

追記(2022/7/17)
セグメントツリーを訂正しました。

# 目的
AtCoderをPythonを用いて解答する場合、知っておいて方がいいルールや事前に用意しておいた方がいい関数などをまとめました。AtCoderやPython初心者~緑色の方を対象に記述しています。
知らない知識がないか流し読みできるよう簡単に書いています。
もし気になる部分があれば詳細は検索してください。

# 前提知識
Python3は実行速度が遅いためPyPy3で提出しましょう。
また提出時にPyPy3になっていることを確認しましょう。

# 用意しておくと便利な関数まとめ
## アルファベットのリスト
アルファベットの文字列を扱う問題が頻出します。
asciiコードを用いるのが妥当かと思われますが、最初のうちは以下のリストをコピペで使用するのが簡単です。
~~~Python3
#文字列リスト
SAL = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
LAL = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
~~~

## 配列の出力
配列の前にアスタリスクを入れると半角空白を入れてリストの中身を出力できます。
~~~python3
#リストを空白を入れて出力
A = [1,2,3]
print(*A)
#1 2 3
~~~
## 再帰回数を増やす
Pythonは再帰可能な回数が設定されており、一定回数を越すとエラーを吐きます。
~~~python3
#10**5回の再帰を行うプログラム
def A(n):
  if n == 0:
    return 
  else:
    A(n-1)
print(A(10**5))

#RecursionError: maximum recursion depth exceeded
~~~
そこで再帰回数の上限を設定することで、上記のエラーを回避できるようになります。
~~~python3
import sys
sys.setrecursionlimit(10 ** 5)
~~~
## 配列のコピー
配列をコピーしたい際にはcopy()を使用すればコピーできますが、二次元配列などのコピーには以下のcopy.deepcopy()を用います。
~~~python3
import copy
copy.deepcopy()
~~~
## 二部探索
リストの中身をO(logN)で探索するには二分探索が最適です。
リストがソート済みであることが前提となります。
使用頻度はかなり高いので細かい仕様まで学習することを推奨します。
~~~python3
import bisect
bisect.bisect(list,int)
~~~
## セグメントツリー
区間の和や積の計算、最小値や最大値の探索などをO(log n)で行えます。
(例えば数列の3番目から6番目の値の和を求めるなど。)
少し難しいですが非常に便利で使いどころは多いです。

内部的な仕様は以下のサイトが参考になると思います。

「セグメント木を徹底解説！0から遅延評価やモノイドまで」
https://algo-logic.info/segment-tree/

Pythonでの実装は以下のサイトが参考になると思います。

「Pythonでアルゴリズム（セグメント木）（実践）」
https://qiita.com/takayg1/items/c811bd07c21923d7ec69

## Binary Indexed Tree

C++のstd::setは要素の挿入、削除、指定した範囲内の最大値や最小値の検索などをO(logN)で行えます。
これを前提とした問題が出題されることがあり、Pythonでは標準で実装されていないので、Binary Indexed Treeなどを使う必要があります。
(これを使わないと基本的に上記の操作の計算量はO(n)になります。)
私は以下のサイトを参考に実装しました。

「std::setを使わない代替テクニック」
https://ikatakos.com/pot/programming_algorithm/data_structure/balancing_binary_search_tree/tree_free

# Pythonに限らないのAtCoderに関する情報
ここからはPythonに限らないAtCoderを取り組む際に有益な情報を記載します。
Pythonに関する情報のみを知りたい方はブラウザバックしてくださっても大丈夫です。

AtCoderで解説を読んでも、不正解や実行時エラーの理由が分からない場合があります。
その時はテストケースを実際に入力してみることをおすすめします。
以下のサイトで、過去のABCやARCなどのテストケースが配布されています。

「atcoder_testcases」
https://www.dropbox.com/sh/nx3tnilzqz7df8a/AAAYlTq2tiEHl5hsESw6-yfLa?dl=0

同じABCのC問題でも回によって大きく難易度が変わります。
そこで以下のサイトで難易度を確認してから自分に合った難易度の問題を解くと効率よく学習できます。

「AtCoder Problems」
https://kenkoooo.com/atcoder/#/table/

## 水色までに出現頻度の高いアルゴリズム
累積和、動的計画法、グラフ問題はかなり頻出します。
グラフ問題ではダイクストラ法、強連結成分分析などは学習しておいて損はないと思います。
【Win10】Microsoft Teamsの「申し訳ございません。問題が発生しました」対処法

# ごあいさつ

![teams.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736425/18f32176-e195-6733-adb2-a3a97f409800.png)

僕はTeams会議をホストしたり中継したりと言った業務が多いのですが、
いざTeams会議用PCでWin10のTeamsを開くと

「申し訳ございません。問題が発生しました」

の一点張り。

サインインどころか会議の参加も出来ず、
結局ブラウザ上で入って会議を実施してしまう…

なんて経験がある方も居るのではないでしょうか？

その度にググっても曖昧な回答の記事が検索上位を占めており
どうにも納得が行かないので備忘録を兼ねて記事にします。

# 発生した条件

* Teamsサインインの際、複数のMicrosoftアカウントを使い分けている
（2～3アカウントを会議別で使用）
* サインイン時にはOffice 365のメールアドレス（xxx.onmicrosoft.com）を使用

* サインインするMicrosoft アカウントのライセンスは
「Microsoft 365 Business Standard」と「Office 365 E3」

* Teamsは既にインストールしており、xxx.onmicrosoft.comでサインインが出来ていた

:::note warn
xxx.onmicrosoft.com以外メールアドレスでサインインする場合、当記事の事象は起こらない？
:::
# 対処法

1. 事前準備としてエクスプローラ表示タブの「隠しファイル」にチェックを入れる
2. C: > ユーザー > （ユーザー名） > AppData > Roaming > Microsoft > Teamsフォルダを削除
3. [Microsoft Teamsダウンロードページ](https://www.microsoft.com/ja-jp/microsoft-teams/download-app#desktopAppDownloadregion)より**職場/学校向けの Teams**をDLしインストール

:::note warn
PCを再起動すると、本事象が再発する事があります。
:::
# 補足
* 再発に備えて「職場/学校向けの Teams」の.exeファイル自体を常に持っていた方が良いかも

* Office 365のメールアドレス（xxx.onmicrosoft.com）の場合、
家庭/小規模ビジネス向けのTeamsをインストールしてしまうと
「有効なアカウントを入力してください」と言われサインインが出来ない恐れがある。


* [Microsoft Teamsダウンロードページ](https://www.microsoft.com/ja-jp/microsoft-teams/download-app#desktopAppDownloadregion)にて
「家庭/小規模ビジネス向けのTeams」と「職場/学校向けのTeams」は.exeファイル名が異なる。
※少し前までは両方とも同じファイル名でした。

```
TeamsSetup_c_w_.exe → 「家庭/小規模ビジネス向けのTeams」
MSTeamsSetup_c_l_.exe → 「職場/学校向けのTeams」
```

* 本事象はMicrosoftアカウントをWindowsに紐づけていないことが原因？

* Win11では "Microsoft teams（Work or School）"と表示されたり、
"Microsoft アカウント を使用してサインインするには、Teams アプリを切り替えます" 
と自動的に遷移したり使いやすくなっている・・・






# 参考文献

https://itojisan.xyz/trouble/26621/


# 最後に
本記事はあくまでも「事象を治す」事に重視するより
「事象が再発しても対処が出来る」様にする事を重視した対処法です。

確実に起きない様事象を解決するのであれば
まずはこの記事を閉じて、前提条件から見直した方が良いかもしれません・・・

以上！
mysqlで、partitionごとの行数とディスク使用量（推定）の確認方法

```sql:
select 
TABLE_SCHEMA, 
TABLE_NAME, 
PARTITION_NAME, 
TABLE_ROWS, (DATA_LENGTH + INDEX_LENGTH)/1024/1024/1024 as gb  
from information_schema.partitions 
where TABLE_SCHEMA = database() and TABLE_ROWS > 0 
order by DATA_LENGTH + INDEX_LENGTH desc;
```
7.5 (易) 尤度比検定5，ワルド検定3，スコア検定3

## 答案

![7.-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/6a3d4518-2d7e-2aff-f1a4-4306580e1bf2.jpeg)
![7.-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/97dcf09b-e491-bbd0-19eb-36c9699817df.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
MySQL で日付の加算・減算をする関数

データベースに投入するデータを作成する場合など。
データベース関数を利用すると良い。

例えば、期間（日付）のデータ（data.sql）を用意する必要がある場合に、関数を使っていれば修正が不要となるため。

昨日: `DATE_ADD(NOW(), INTERVAL - 1 DAY)`
今日: `NOW()`
明日: `DATE_ADD(NOW(), INTERVAL 1 DAY)`

色々ある。

MySQL 日付および時間関数

https://dev.mysql.com/doc/refman/8.0/ja/date-and-time-functions.html
Datadogのmonitor情報をterraform importコマンドで取得する

## What's This
既にデプロイされているモニターのTFコードの情報が欲しいことがあるかと思いますが、
その時のまとめです。

terraformerコマンドで取得される方がメジャーなのかなとも思いつつ、今回はterraform importコマンドで取得してみました。

あくまでメモなので、参考にされる場合は、公式ドキュメント等の副読的な感じで読まれると幸いです。

## 事前準備

init.tfに、キーの情報とか書いていました。

```init.tf
provider "datadog" {
  api_key = ""
  app_key = ""
}
```

## 我早速実行

リファレンスとか参考にすると、このコマンドと引数でいけんじゃね、ということで実行。
https://registry.terraform.io/providers/DataDog/datadog/latest/docs/resources/monitor#import

```
$ terraform import datadog_monitor."Datadog Monitor Name" "Datadog Monitor ID"
```

エラーになった。

```
$ terraform import datadog_monitor."ec2-error-test" "Datadog Monitor ID"
Error: resource address "datadog_monitor.ec2-error-test" does not exist in the configuration.

Before importing this resource, please create its configuration in the root module. For example:

resource "datadog_monitor" "ec2-error-test" {
  # (resource arguments)
}
```

こんな感じで適当にまずは書いてくれと言われている気がしたので、適当にtfファイル作成して、以下記載。

```
resource "datadog_monitor" "ec2-error-test" {
# (resource arguments)
}
```

再度実行すると、通りました。

```
$ terraform import datadog_monitor."ec2-error-test" "Datadog Monitor ID"
datadog_monitor.ec2-error-test: Importing from ID "Datadog Monitor ID"...
datadog_monitor.ec2-error-test: Import complete!
  Imported datadog_monitor
datadog_monitor.ec2-error-test: Refreshing state... [id=Datadog Monitor ID]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
```

自分の場合は、こんな感じでtfstate.tfに出力されていました。

```
~中略~
            "name": "ec2-error-test",
            "new_host_delay": 0,
            "no_data_timeframe": 0,
            "notify_audit": false,
            "notify_no_data": false,
            "priority": 0,
            "query": ”hogehoge”,
            "renotify_interval": 0,
            "require_full_window": false,
            "restricted_roles": [],
            "silenced": {
              "*": 0
            },
            "tags": [],
            "threshold_windows": null,
            "thresholds": null,
            "timeout_h": 0,
            "type": "log alert",
            "validate": null
```

## Reference
・https://htnosm.hatenablog.com/entry/2017/05/08/090000
・https://www.terraform.io/cli/import
・https://www.terraform.io/cli/commands/import
・https://www.terraform.io/cli/import/usage
・https://www.terraform.io/plugin/sdkv2/resources/import
・https://registry.terraform.io/providers/DataDog/datadog/latest/docs/resources/monitor#import

参考にさせていただきました。ありがとうございます。
expressでstripeのwebhookを受け取る

下記に受け取りたいエンドポイントを書けば良い。
node/expressならば、APIのパスを書いてあげれば良い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44938/786742ee-8276-3435-9892-6f59c3894298.png)
Cloud Functions(PHP)を使用して、Cloud SQLのデータをCloud Storageへ転送する

# はじめに

Google CloudのCloud SQLに保存されているデータをCloud Functions(PHP)を使用して、CSV形式でCloud Storageへ格納する方法をまとめました。ソースは要点のみ記載しているため、そのままだと動かないので適宜修正が必要です。

## 使用サービス
- Cloud SQL
- Cloud Functions
- Cloud Storage

## やろうとしていること
- Cloud SQL → サーバレスエクスポートでCSV出力 → Cloud Storage格納

## 権限
- cloudsql.instances.export
- storage.objects.create
- storage.objects.get

## ソース

```PHP:Function
use Google\Cloud\Sql\V1beta4\ExportContext;
use Google\Cloud\Sql\V1beta4\ExportContext\SqlCsvExportOptions;
use Google\Cloud\Sql\V1beta4\ExportContext\SqlExportOptions;
use Google\Cloud\Sql\V1beta4\InstancesExportRequest;
use Google\Cloud\Sql\V1beta4\SqlFileType;
use Google\Cloud\Sql\V1beta4\SqlInstancesServiceClient;
use Google\Cloud\Storage\StorageClient;
use Google\CloudFunctions\CloudEvent;

function function(CloudEvent $cloudevent)
{
    // サーバレス転送のクライアントクラス
    $sqlInstancesServiceClient = new SqlInstancesServiceClient();

    // csv出力のオプション設定
    $csvExportOptions = new SqlCsvExportOptions();

    // クエリの設定
    $selectQuery = 'SELECT `column1` FROM tbl_test WHERE value = 1';
    $csvExportOptions->setSelectQuery($selectQuery);

    // デフォルト値を設定
    $csvExportOptions->setEscapeCharacter("5C");
    $csvExportOptions->setQuoteCharacter("22");
    $csvExportOptions->setFieldsTerminatedBy("2C");
    $csvExportOptions->setLinesTerminatedBy("0A");

    // 出力先のCloudStorageの設定
    $data = [
        'uri' => "gs://test_bucket/test.csv", //出力ファイル
        'databases' => [
            'test-db',                   //Cloud SQLのDB名
        ],
        'kind' => "sql#exportContext",
        'csv_export_options' => $csvExportOptions,
        'file_type' => SqlFileType::CSV,
        'offload' => true                // サーバーレスエクスポート
    ];
    $exportContext = new ExportContext($data);

    // リクエスト生成
    $instancesExportRequest = new InstancesExportRequest();
    $instancesExportRequest->setExportContext($exportContext);
    $optionalArgs = [
        'project' => 'test_project',       // project名
        'instance' => 'test_instance',     // CloudSQLのinstance名
        'body' => $instancesExportRequest,
    ];

    // エクスポート処理
    // try/catcheやエラー処理も実装する
    $response = $sqlInstancesServiceClient->export($optionalArgs);

}

```

今回Cloud Functionsの実行は、Cloud Schedulerで起動しています。Cloud SchadulerのイベントBodyに変数入れておくと色々な転送が作れますので、クエリ内容や出力先のバケット名なども設定できるようにしておけば、ソースは変更せずに汎用的に使用できます。

サーバレスエクスポートは、例えば本番用に稼働しているDBインスタンスとは別に、一時的にインスタンスを生成してエクスポートを行ってくれるため、本番用のDBへの影響を回避することができます。
データが多くなるテーブルや負荷のかかるクエリでの抽出などを行うときは便利な機能です。出力には少し時間がかかるので、実行頻度は抑えたほうが良いです。

また、カラムがNULLの場合、csvExportOptionsでデフォルト値が何も設定していない状態だと「”N」で出力されます。この状態だとCSVファイルが壊れてしまうため、デフォルト値を設定することで「\N」が出力されるようにしています。
[こちらの記事](https://qiita.com/n-watanabe-iret/private/57b3b3a8a0a8aad70e90)に記載しましたがBigQueryへの転送時にNULL設定を行う際に必要となります。

そしてCloud Storageの出力先のバケットへのアクセス権限も忘れずに確認が必要です。（permissionエラーで出力ができなくなります。）

## その他

続いての処理として、Cloud Storage内に配置したCSVファイルのデータをBigQueryへ転送したので、方法については別記事に記載しました。
・[Cloud Functions(PHP)を使用して、CSVファイルのデータをBigQueryへ転送する](https://qiita.com/n-watanabe-iret/private/57b3b3a8a0a8aad70e90)
【React】MUIのimportで躓いた話(MUI v5)

# はじめに
ReactにMUIを入れる際、import文でエラーが出たのでその解決を残しておきます。

# 1. エラーの内容と解決方法
MUIのimportを以下のように書いていました。
```javascript
import Button from '@material-ui/core/Button';
```
解決法
```javascript
import Button from '@mui/material/Button';
```
# 2. 理由
アップデートによって名前が変わったから。

どうやらv5でプロジェクトの名前が変わったらしいです。v4の記事をそのままコピペしたりすると、エラーになります。コピペするときは、プロジェクトルート直下の`package.json`や[公式のGet started](https://mui.com/material-ui/getting-started/overview/)のページを見ながら書き換えましょう。
# おわりに
間違い等あればコメントお願いします。

### 参考
- [こんにちはMUI！ 新しくなったMaterial UI v5](https://zenn.dev/h_yoshikawa0724/articles/2021-09-26-material-ui-v5)
- [MUI-Get started](https://mui.com/material-ui/getting-started/overview/)
オーバーレイネットワーク とは

## 勉強前イメージ

追加でなにかネットワークつくるの？

## 調査

### オーバーレイネットワーク とは

あるネットワーク上に構築された、基盤の構造とは別に論理的に構築されたネットワークを意味します。
下位のネットワークの構造が見えず、意識せずとも利用できるようになっています。
VPNとかもインターネットの上に仮想的な専用線を作るというオーバーレイネットワークの一つになります。
他にもコンテンツの配信のCDNや、機器同士が通信し合うP2Pもオーバーレイネットワークに当てはまります。

オーバーもあればアンダーもあるということで
アンダーレイネットワークも存在します。

### アンダーレイネットワーク とは

オーバーレイネットワークの基盤になっているネットワークで、物理的に構築されたネットワークをアンダーレイネットワークと呼びます。
実際のサーバやネットワーク機器で構築されています。

## 勉強後イメージ

あまり聞いたこともなかった言葉だし、CDNとかの構築もしたことないからあんまりイメージ湧いてないけど
基盤のネットワークを気にしなくても構築できるネットワークがオーバーレイネットワークってかんじかな？

## 参考

- [オーバーレイネットワーク／アンダーレイネットワークとは](https://www.ntt.com/bizon/glossary/j-a/overlay-underlay.html)
Databricksでのipywidgetsの活用

[ipywidgets \| Databricks on AWS](https://docs.databricks.com/notebooks/ipywidgets.html) [2022/8/1時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

[ipywidgets](https://ipywidgets.readthedocs.io/en/7.7.0/)はノートブックのセルでパラメータの値を指定できるビジュアル要素です。Databricks Pythonノートブックをインタラクティブなものにするためにipywidgetsを活用することができます。

ipywidgetsパッケージには、スライダー、テキストボックス、チェックボックスなどのコントロールやタブ、アコーディオン、グリッドのようなレイアウトコントロールなど[30以上の異なるコントロール](https://ipywidgets.readthedocs.io/en/7.7.0/examples/Widget%20List.html)が含まれています。これらのエレメントを用いることで、ノートブックコードとのインタフェースとなるGUIを構築することができます。

:::note info
**注意**
Databricksウィジェットに関しては、[Databricksのwidget\(ウィジェット\)](https://qiita.com/taka_yayoi/items/4df1fd723bdab9a99b08)をご覧ください。Databricksウィジェットやipywidgetsをいつ使用すべきかに関しては、[ipywidgetsとDatabricksウィジェットを使用する際のベストプラクティス](#ipywidgetsとdatabricksウィジェットを使用する際のベストプラクティス)をご覧ください。
:::

# 要件

Databricksランタイム11.0以降でipywidgetsを利用できます。

# 使用法

以下のコードでは、3から10の値を指定できるスライダーを持つヒストグラムを作成します。ウィジェットの値は、ヒストグラムのビンの数を指定します。スライダーを動かすと、即座にヒストグラムが更新されます。試すには[サンプルノートブック](#サンプルノートブック)を参照ください。

```py:Python
import ipywidgets as widgets
from ipywidgets import interact

# Load a dataset
sparkDF = spark.read.csv("/databricks-datasets/bikeSharing/data-001/day.csv", header="true", inferSchema="true")

# In this code, `(bins=(3, 10)` defines an integer slider widget that allows values between 3 and 10.
@interact(bins=(3, 10))
def plot_histogram(bins):
  pdf = sparkDF.toPandas()
  pdf.hist(column='temp', bins=bins)
```

以下のコードは0から10の値を取る整数値のスライダーを作成します。デフォルト値は5です。コードでスライダーの値にアクセスするには`int_slider.value`を使います。

```py:Python
import ipywidgets as widgets

int_slider = widgets.IntSlider(max=10, value=5)
int_slider
```

# サンプルノートブック

## ipywidgetsサンプルノートブック

https://github.com/taka-yayoi/public_repo/tree/main/ipywidgets

## 高度なサンプル: ipywidgetsによる地図

https://github.com/taka-yayoi/public_repo/tree/main/ipywidgets_advance

# ipywidgetsとDatabricksウィジェットを使用する際のベストプラクティス

Pythonノートブックにインタラクティブなコントロールを追加するためには、ipywidgetsを使用することをお勧めします。他の言語のノートブックでは、[Databricksのwidget](https://qiita.com/taka_yayoi/items/4df1fd723bdab9a99b08)を使ってください。

ジョブにパラメーターを引き渡す目的や、[ノートブック間でパラメーターをやり取り](https://qiita.com/taka_yayoi/items/4df1fd723bdab9a99b08#run%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%81%AE%E4%BD%BF%E7%94%A8)する目的ではDatabricksウィジェットを使用することができます。ipywidgetsではこれらのシナリオをサポートしていません。

# 制限

- ipywidgetsを使用しているノートブックは稼働中のクラスターにアタッチされている必要があります。
- ノートブックのセッションを越えてウィジェットの状態は保存されません。ノートブックをクラスターにアタッチした際、ウィジェットのセルをレンダリングするためにはウィジェットのセルを再度実行する必要があります。
- 右のipywidgetsはサポートされていません: Password, File Upload, Controller
- HTMLMathとLaTeXを用いたLabelウィジェットは適切にレンダリングされません。(例えば、`widgets.Label(value=r'$$\frac{x+1}{x-1}$$')`は適切にレンダリングされません。)
- ノートブックがダークモードの際、特に色付きのウィジェットはノートブックで適切にレンダリングされない場合があります。
- ウィジェットの出力をノートブックのダッシュボードビューで使用することはできません。
- ipywidgetのメッセージペイロードサイズは最大1MBです。画像や大量のテキストデータを使用するウィジェットは適切にレンダリングされない場合があります。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
git configでユーザー名切り替えてpushする

できれば、gitは単一ユーザーであった方が良いのですが、複数人でマシンやむなく使うとか、会社から貸与されているマシンでprivateなgitHubに勉強がてらソースコードを・・
とかって、分けたい時がありますよね。(本来は良くないと思うけど）

そんな時のためのメモ。

# git configの使い方

```
git config --list
```
とすると、user名、submodule設定などそのcloneしたフォルダの設定が色々みれます。
ユーザー名を切り替えるということは、フォルダごとに設定を変えれば良い。
configの設定には、

- global
- local
- system

があります。今回やるのはlocal

```
git config --local user.name bluelemmon
git config --local user.email none
```
のような感じ。これで、cloneしてきたフォルダごとに設定を変えられます。
もう一度、git config --listをして確認
```
user.name=bluelemmon
user.email=none
```
という感じになっていればOK。
emailは、他とも開発してたらいるのかもしれんけど、とりあえずなくてもいいような・・。（いるケースがあまりわかってない）
Jetpack Compose ボタンの2度押しを避ける


LaunchedEffect でシンプルに書けるが。

```kotlin
var enabled by remember { mutableStateOf(true) }

Button(
  onClick = {
    enabled = false
  },
  enabled = enabled
) {
  Text("Button")
}

LaunchedEffect(key1 = enabled) {
  if (!enabled) {
    delay(3000)
    enabled = true
  }
}
```

処理の流れはまあまあだるい。

```
起動

 ↓

ボタンを表示

 ↓

LaunchedEffect が実行される

   ↓

  enable2 が true なので何もしない

 ↓

ボタンをクリック

 ↓

enabled2 が false に更新される

 ↓

ボタンが更新され無効化される

 ↓

LaunchedEffect が key1 の変更により実行される

   ↓

  enabled2 が false なので3秒開始

   ↓

  3秒経ったら enabled2 が true に更新される

   ↓

ボタンが更新され有効化される

 ↓

LaunchedEffect が key1 の変更により実行される

   ↓

  enable2 が true なので何もしない
```

re/compose のタイミングを正しく把握すること、

って多重入れ子の複雑なUIになると結構大変だよね。


[👉 【Jetpack Compose】 StateHolder として ViewModel を使ったほうが分かりやすくね?](https://android.benigumo.com/20220713/launchedeffect-vs-remembercoroutinescope/)
[👉 【Jetpack Compose】 「Layout Inspector Recomposition counts」で re-compose 回数を確認する](https://android.benigumo.com/20220707/layout-inspector-recomposition-counts/)
【Rails】フラッシュメッセージの空白を消したい時


フラッシュメッセージの余白を消したい！

めちゃくちゃ邪魔↓
![スクリーンショット 2022-07-13 17.38.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602337/5db6b191-da85-6f9e-b4a3-3a7c3b156ae4.png)
```erb:application.html
<% if notice %>
 <p class="notice"><%= notice %></p>
<% end %>
<% if alert %>
 <p class="alert"><%= alert %></p>
<% end %>
```

if文でサクッと消しちゃいます。
Microsoft Azure Virtual Training Day - AI の基礎

# はじめに
参加メモを取ります。

・時間：半日
・形式：ウェビナー/無料

# モジュール01 : AI の概要
- 人口知能とは、人間の能力を模倣する S/W
    - データと過去の経験に基づく意思決定
    - 異常なイベントな認識
    - 視覚的な入力の解釈
    - 書き言葉と話し言葉を理解する
    - ダイアログや会話に参加する

- 一般的な人口知能ワークロード
    - 機械学習：データと統計に基づく予測モデル - AI の基盤
    - 異常検出：異常なパターンやイベントを検出し、先制行動を可能にするシステム
    - Computer Vision：人間の表情まで検出可能
    - 自然言語処理(NLP)：text to speech , speech to test
    - 対話型AI：いわゆるチャットボット

- Microsoft Azure の人口知能
    - Azure Machine Lerning：機械学習モデルのトレーニング、デプロイ、および管理のためのぷらっフォーム
    - Cognitive Services：学習済みモデルを REST API で提供
    - Azure Bot Service：Write once, deploy anywhere

- AI の課題とリスク
    - バイアスは結果に影響を与える可能性があります：トレーニングデータに偏った結果になる
    - エラーが害を引き起こす可能性があります：エラーが命にかかわることもある
    - データが公開される可能性があります：データの取扱いを留意
    - ソリューションはすべての人に役立つとは限りません：サジェスチョンは視覚障がい者の方に有効でない場合もある
    - ユーザは複雑なシステムを信頼する必要があります：
    - AI主導の意思決定に対して責任を負う人は誰ですか？：AIで有罪判決受けたら誰が責任を持つのか

- 責任ある AI の原則
    - 公平性
    - 信頼性と安全性
    - セキュリティとプライバシー
    - 包括性
    - 透明性
    - アカウンタビリティー

# モジュール02 : Machine Learning
- 機械学習とは：データ内のリレーションシップを検索して予測モデルを作成する
- 回帰：値を予測
    - トレーニング用のデータと検証用のデータに分ける(一般的には7:3 の割合)
- 分類：カテゴリを予測
- クラスター化：教師なしモデル


- Azure Machine Lerning とは
    - データ入れて、アルゴリズムトレーニング、モデル評価

# モジュール03 : Computer Vision
- Computer Vision の概念とは
    - 視覚認識
    - 画像分類：画像に一つタグをつける
    - 物体検出：自動運転の画面でよく見るやつ
    - セマンティックセグメンテーション：意味的区別？物体の輪郭まで検出
    - 画像分析
    - 顔検出と認識
    - 光学文字認識：OCR

- Cognintive Services
    - Computer Vision サービスを使用した画像分析
        - 事前に訓練された Computer Vision モデル
    - Custom Vision サービスを利用したトレーニングモデル
    - フェイスサービスを使用した顔の分析
        - 顔の感情まで識別可能
    - Computer Vision サービスを使用したメモの読み取り
        - OCR のこと、印刷および手書きも認識可能

# モジュール04 : 自然言語処理
- 自然言語処理とは
    - テキスト分析とエンティティ認識
    - センチメント分析
    - 音声認識と合成
    - 機械翻訳
    - などなど

- 



# 感想
- Microsoft のハンズオンサイトである程度デモは確認できる
- サービス利用方法はハンズオンを一通りなめればざっくり理解できそう
- Microsoft learn(https://docs.microsoft.com/ja-jp/learn/)
【型ガード】いつも忘れる .filter で undefined を除去する方法 【TypeScript】


## ユーザー定義のType Guard の話

`['test1', undefined].filter(Boolean)` だと `(string | undefined)[]` という型のままでしんどいときの話。



```typescript
const test1 = ['test1', undefined].filter(Boolean)
// const test1: (string | undefined)[]
console.log(test1);
// [LOG]: ["test1"] 

const test2 = ['test2', undefined].filter((v): v is string => v != null)
// const test2: string[]
console.log(test2);
// [LOG]: ["test2"] 
```

以下でTypeScriptをWeb上で試せます。
https://www.typescriptlang.org/play?#code/Q


## 参考

- [ユーザー定義のType Guard](https://typescript-jp.gitbook.io/deep-dive/type-system/typeguard#yznotype-guard)
- [【TypeScript】型ガードを改めて整理する](https://zenn.dev/oreo2990/articles/5f75eaa285f2f9#4-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E5%9E%8B%E3%82%AC%E3%83%BC%E3%83%89)
ecs のタスクが頻繁に落ちるようになった

ecs のタスクが頻繁に落ちるようになった際の解決法
めちゃくちゃ時間がかかったので覚え書きのメモ

# 起こったこと
ecsで立てたサイトに接続すると
503 service temporarily unavailable 
と表示されるようになった。

AWSを見てみるとタスクが異常終了して再起動を繰り返していた。

# 改善方法
stopしたタスクの詳細を見てみると
停止理由 Task failed ELB health checks in (target-group arn:＊＊＊＊＊＊＊＊＊＊＊＊＊)
と表示されていた。
health checksが失敗しているらしい

調べてみると似たような症状の人を見つけた
参考：https://soypocket.com/it/ecs-cluster-taskfailed-elb-healthcheck/

とりあえずタスクの更新で
ヘルスチェックの猶予期間　を３６００まで伸ばしてみる

落ちなくなりました。
が、結局根本的な原因はわかりませんでした…
FileMaker Data API

https://qiita.com/YKInoMT/items/f64893568b90158ad030

---

FileMaker Data API の使い方など。

ドキュメントは一応ある。

https://help.claris.com/ja/data-api-guide/content/index.html

が、API 仕様書的なものは FileMaker Server にアクセスしないと見れない。

## 処理の流れ

認証なしに使えるエンドポイント以外はログイン用の API を叩いて取得したアクセストークンを使ってリクエスト。

1. Login API　を叩いてアクセストークンを取得
2. 取得したアクセストークンを使って API リクエストを投げる

### アクセストークンの取得

Login API を叩く

```
https://<fms.host>/fmi/data/{version}/databases/{database}/sessions
```

POST リクエストで `Authorization`, `Content-Type` ヘッダーが必須。
さらに、ボディも指定しないとエラーになる。

なので curl で叩くとすると下記のような感じ。

```zsh
% curl -k -XPOST -H 'Authorization: Basic <Base64 エンコード文字列>' -H 'Content-Type:application/json' -d '{ }' https://<fms.host>/fmi/data/vLatest/databases/dataapi/sessions
```

`<Base64 エンコード文字列>` にはデータベースの `ユーザー名:パスワード` を base64 でエンコードしたものを入れる。

例えば、ユーザー名が dbuser で パスワードが dbuserpassword の場合、mac なら下記のような感じで取得した値 `ZGJ1c2VyOmRidXNlcnBhc3N3b3Jk` を使う。

```zsh
% echo -n 'dbuser:dbuserpassword' | base64
ZGJ1c2VyOmRidXNlcnBhc3N3b3Jk
```


### アクセストークンを使ったリクエスト

ログインAPIで取得したトークンを使って下記のような感じでリクエスト

```zsh
% curl -k -H 'Authorization: Bearer <アクセストークン>' https://<fms.host>/fmi/data/vLatest/databases/dataapi/layouts
```


## フィールドの値

### null値

渡せない

```json
{
    "fieldData": {
        "フィールド1": null,
        "フィールド2": "フィールド2の値"
    }
}
```

などをレコード作成時の渡すと下記のようなエラーになる。

```
{"messages":[{"code":"1708","message":"Parameter value is invalid"}],"response":{}}
```


### 日付

米国式に `月` `日` `年` の順で指定する必要があるので、`2022/7/13` のように指定するとエラーになる。

__例__

```
7/13
7/13/2022
7/13/22
```

ちなみに、区切り文字は `-` も使えるので、`7-13` などでも OK。

この辺りの書式について明記されたものはなさそうだが、Product info API の結果を見ると下記の感じ。

```json: https://fms.host/fmi/data/vLatest/productInfo
{
    "response": {
        "productInfo": {
            "name": "FileMaker Data API Engine",
            "buildDate": "06/30/2022",
            "version": "19.5.2.201",
            "dateFormat": "MM/dd/yyyy",
            "timeFormat": "HH:mm:ss",
            "timeStampFormat": "MM/dd/yyyy HH:mm:ss"
        }
    },
    "messages": [
        {
            "code": "0",
            "message": "OK"
        }
    ]
}
```

`"dateFormat": "MM/dd/yyyy"` となっているので、これが書式ということなのかも。。。