OmniAICreator/Qiita-1.07M huggingface dataset:
kepler.glのすすめ

### kepler.glとは？
![](https://i.imgur.com/r6HQe4P.png)

- [kepler.gl](https://kepler.gl/demo)はUber社が開発しているオープンソースの地理情報可視化ツール
- 緯度、経度をcolumnに含むCSVやJsonデータをアップロードすることでノーコードで可視化を行うことが可能
- 時刻情報もあればアニメーションができたりもする

## 代表的なツール
- 今回は2021年3月にスエズ運河で座礁した事でも有名なEVER GIVENのAISデータを用いて船舶の航跡を可視化する
- まずは気軽にアップロード 
![](https://i.imgur.com/v9oJAPa.png)

### レイヤー操作
#### 色
- 最初アップロードしたときはランダムで属性が選ばれ、それをもとに色分けされる
- もちろん自分で属性別に色分けすることもできる
- `Layers`にある各レイヤーの下矢印を押すと設定画面が広がる
![](https://i.imgur.com/c0y2DHc.png)
![](https://i.imgur.com/5S3VqgH.png)


- `Fill Color`の右端の3点をクリックするとまたメニュー画面が展開される
- `Color Based On`から何をもとに色分けするか選べる
    - 実際に`Destination`を選ぶと、Hamburgに到着してから色が変わることが確認できる
![](https://i.imgur.com/zJbJTXU.png)
![](https://i.imgur.com/5gRXAYm.png)

- カラーバーから色も変えられる
![](https://i.imgur.com/W1wEyBF.png)



### フィルター
![](https://i.imgur.com/zCJFlA5.png)


- 各属性でデータのフィルタリングが可能
- 時刻のデータがあればアニメーションもできる
    - 時刻は`2022/4/27 0:00`という形式にした方がい？
- `Date/Time`を選択するとこのような画面になる
![](https://i.imgur.com/SCfzrDL.png)
- データの表示幅を変えたり、ロケットマークのアイコンから速度を変えられたりもする
![](https://i.imgur.com/e9Kk0DY.png)

### 表示形式
- `Base map` > `Map Style`から地図の表示形式も変えられる 
![](https://i.imgur.com/ZSspyfY.png)
ディスクの空き容量を調べるコマンド

◆ディスクの空き領域のサイズを集計して表示するコマンド

```
df
```


`df`は`disk free`の略。



◆読みやすい単位で表示する場合

```
df -h
```

オプションの`h`は`human readable`の略。
AWS S3 の料金が徐々に高くなっていた

AWS の料金がここ数か月だんだん増えていました。円安のせいかなと思って過去の明細も調べてみたところ、ドル建てでも増えていました。結論として AWS S3 の非現行バージョンが溜まっていって課金が増えていたのですが、もしかしたら同様の方もいらっしゃるかもしれないので顛末をまとめておきます。

## 料金の様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/1bba6c15-b94f-d6e5-b99e-21ef4c01363e.png)

2021年11月までは 1 USD 前後だった S3 の料金が12月以降は増加し、2022年4月時点では 3 USD を超えてしまいました。なお、S3 の料金よりも EC2 の方が高いですが、こちらは用途を把握しているものなので問題ありません。

## S3 の用途

S3 はいくつかの用途で使っているのですが、一番容量を食っているのは自宅サーバのバックアップです。週次でホームディレクトリ以下を `backup_YYYYMMDD.tar.gz` などとして AWS S3 に転送していました。そして AWS S3 のライフサイクルルールで30日後に削除されるように設定しています。ホームディレクトリの使用量が増えない限り、S3 の使用量も変わらない見込みです。でも実際にはこの半年でどんどん使用量が増えていっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/76ed512a-1c87-54e4-5666-4f67bc6fc4b3.png)

2021年11月末から S3 の使用量がどんどん増えていってますね。

## なぜこうなった

ライフサイクルルールで有効期限切れになったオブジェクトが、非現行バージョンとなって残り続けてしまっていました。

時期的にみて、[Amazon S3 ライフサイクルが新しいアクションとフィルターでストレージコスト削減をさらに最適化](https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-s3-lifecycle-storage-cost-savings/) の影響かと思うのですが、このリリースからではちょっとわからないですよね。

元々自分がどういう設定をしていたのかは画面キャプチャを撮っていたわけでも無いので分かりません。なので、あまり正確なことが言えなくて申し訳ないのですが、バケットのバージョニングは有効にしつつ、非現行バージョンは1日で削除するように設定していたのだと思います。それが今回の変更で非現行バージョンが全て削除されずに残るようになってしまったのだと思われます。

## 対処法

バケットのバージョニングを無効にしました。そもそも今の使い方ではバージョニングは自前でやってますので、S3 側の機能は不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/60a0e067-617b-e034-e22c-72aa22d199d3.png)

また、出来てしまった非現行バージョンのオブジェクトは「バージョンの表示」スイッチで表示して、手動で削除しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/13f3061c-96d6-a627-4ea3-5718a82c6420.png)
Docker上のRailsでbin/rails tailwindcss:watchが効かない場合の対処方法

Docker上のRails6アプリにGemの`tailwindcss-rails`でTailwind CSSを導入し、`bin/dev`で動かしたところ、コンテナ起動時にしか`app/assets/builds/tailwind.css`が更新されませんでした。
コードを変更したときは`bin/rails tailwindcss:build`を実行しなければなりませんでした。

## 実行環境

- Windows 10 Home
- WSL 2
- Ubuntu 20.04 LTS
- Docker 20.10.11
- docker-compose 1.29.2
- Rails 6.1.4.1
- Ruby 2.7.4

RubyのDockerイメージには`ruby:2.7.4-alpine`を使用
ソースコードはWindowsの`C`ドライブ下
Gemの`tailwindcss-rails`でTailwind CSSを導入

https://github.com/rails/tailwindcss-rails

`bin/rails tailwindcss:install`で`bin/dev`や`Procfile.dev`、`app/assets/stylesheets/application.tailwind.css`などを作成
Railsのコンテナは`bin/dev`を実行

```yml:docker-compose.yml
services:
  app:
    command: bash -c "rm -f tmp/pids/server.pid && ./bin/dev"
    .
    .
    .
```

```Procfile.dev
web: bin/rails server -p 3000 -b 0.0.0.0
css: bin/rails tailwindcss:watch
```

```sh:bin/dev
#!/usr/bin/env bash

if ! command -v foreman &> /dev/null
then
  echo "Installing foreman..."
  gem install foreman
fi

foreman start -f Procfile.dev
```

## 原因

WSL2の問題かも

https://github.com/rails/tailwindcss-rails/pull/168

## 対処方法

Railsコンテナのコマンドには`bin/dev`ではなく`bin/rails s`を使用し、別のコンテナでGuardが`bin/rails tailwindcss:build`を実行するようにする。

https://github.com/guard/guard

https://github.com/guard/guard-process

```yml:docker-compose.yml
services:
  app:
    command: bash -c "rm -f tmp/pids/server.pid && ./bin/rails s -p 3000 -b '0.0.0.0'"
    .
    .
    .

  tailwindcss:
    command: bundle exec guard --force-polling
    tty: true
    .
    .
    .
```

Guardを動かすコンテナのオプションには`tty: true`、コマンドには`--force-polling`が必要

https://qiita.com/wakaba260/items/0a00c6c3aa7183a1cb99#guard%E3%81%8C%E3%81%AA%E3%82%93%E3%81%8B%E5%8B%95%E3%81%8F%E3%81%91%E3%81%A9%E5%A4%89%E6%9B%B4%E3%82%92%E6%A4%9C%E7%9F%A5%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%81%AA%E3%81%84%E3%82%93%E3%81%A0%E3%81%91%E3%81%A9

```ruby:Gemfile
.
.
.
group :development do
  .
  .
  .
  gem 'guard'
  gem 'guard-process'
end
.
.
.
```

```ruby:Guardfile
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

## Uncomment and set this to only include directories you want to watch
directories(%w[app config].select { |d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist") })

## Note: if you are using the `directories` clause above and you are not
## watching the project directory ('.'), then you will want to move
## the Guardfile to a watched dir and symlink it back, e.g.
#
#  $ mkdir config
#  $ mv Guardfile config/
#  $ ln -s config/Guardfile .
#
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"

guard 'process', name: 'BuildingTailwindCSS', command: 'bin/rails tailwindcss:build', stop_signal: 'KILL' do
  watch(%r{app/helpers/.+\.rb})
  watch(%r{app/javascript/.+\.js})
  watch(%r{app/views/.+\.(erb|haml|html|slim)})
  watch('app/assets/stylesheets/application.tailwind.css')
  watch('config/tailwind.config.js')
end
```

`watch`の引数はGuardで監視したいファイルのパス
`stop_signal:`はGuardがコマンドを実行している最中にコードを変更すると例外が発生しログが大変なことになるので必要

```sh:ターミナル
.
.
.
tailwindcss_1  | rails aborted!
tailwindcss_1  | SignalException: SIGTERM
.
.
.
```
相手に意見をうかがう時のチャットコミュニケーション術

## はじめに

エンジニアとして仕事をしてると「チャットコミュニケーションは大事です」と言う人がいますが、私がクライアントと1年ほどやりとりする中でみがいた、やりとり方法を以下に整理してみます。

結論、以下の5つを意識しています。

1. 結論ファースト
1. 選択肢を提示する
1. それぞれのメリデメを伝える
1. 自分の意見を入れる
1. クローズ依頼する

## 1. 結論ファースト
当たり前ですが、結論ファーストは大事です。
まずこれができるだけで言いたいことが伝わりますし、相手も次の文章を読みたくなります。

## 2. 選択肢を提示する
選択肢を数字で提示しましょう。
具体的には以下です。

```
〇〇に関して、対応方法は3つあります。

## 1
対応1の内容

## 2
対応2の内容

## 3
対応3の内容
````

## 3. それぞれのメリデメを伝える
それぞれのメリット・デメリットを記載しましょう。
具体的には以下です。

```
〇〇に関して、対応方法は3つあります。

## 1
対応1の内容
対応1のメリットは〇〇です。
対応1のデメリットは〇〇です。

## 2
対応2の内容
対応2のメリットは〇〇です。
対応2のデメリットは〇〇です。

## 3
対応3の内容
対応3のメリットは〇〇です。
対応3のデメリットは〇〇です。
````

長文になってしまう場合は以下のように表にまとめても良いです。


```
対応案とそれぞれのメリット・デメリットを以下にまとめます。

| 対応  | メリット        | デメリット        | 
| ----- | --------------- | ----------------- | 
| 対応1 | 対応1のメリット | 対応1のデメリット | 
| 対応2 | 対応2のメリット | 対応2のデメリット | 
| 対応3 | 対応3のメリット | 対応3のデメリット | 

```


## 4. 自分の意見を入れる
これが大事ですが、自分はどの選択肢が良いかを伝えましょう。
理由は、自分の意見があるとやりとりが少し減るからです。
具体的には以下です。

```
自分：「A案、B案、C案があり、メリットデメリットは〇〇です。私はA案が良いと考えますがいかがでしょうか」
相手：「承知いたしました。私もA案で問題ございません」
自分：「承知いたしました。それではタスクをクローズさせていただきます」
```

## 5. クローズ依頼する
これも大事なのですが、自分の意見で問題なければチケットなりタスクをクローズするよう依頼しましょう。

具体的には以下です。

```
自分：「A案、B案、C案があり、メリットデメリットは〇〇です。私はA案が良いと考えますがいかがでしょうか。また、問題なければタスク・チケットをクローズしていただけると幸いです。」
相手：「A案で問題ございません。それではクローズいたします。」
```

## 終わりに

エンジニアとして仕事をしてるとチャットコミュニケーションが多いと思います。
相手の負担を最小限にするとか、分かりやすい文章を書くとかも大事ですが、本質的には**短時間でやりとりを終えるためにはどうすれば良いか**を考えるのが良いです。

これを中心に考えると、必然的に文章をわかりやすくしたり相手から回答を1発でもらうためにどうすれば良いかを考えられるようになるはずです。
Python でコードの見た目整理とかデバッグのためにインデントしたいメモ

コードの見た目を整理したくてブロックをインデントしたい...
デバッグとかでブロックを全部無効にしたり有効にしたりしたい...

C/C++ だとカッコとか `#if 0` とかでできるが...

```cpp

int a = 0;

{
  proc(a);
}

#if 0
  proc(a);
#endif
```

## Python でやる

あんまりいい方法は無いようです. `if True` くらいでしょうか.


```py
if True:
  ...
```

`if False` にすればコード実行されなくなります.

適当にジェネレータークラス作って with 構文ででもできるかもしれません...
GoでLambda Function URLs ハンズオン

# はじめに
この記事はGoでLambda Function URLsをハンズオンしてみる内容となっています。
筆者がLambdaでGoを扱うこと自体が初めてだったため備忘録として簡単に環境構築からデプロイまでの手順も載せています。

# 環境
MacBook Air M1

# ハンズオン

ランタイム Go1.xを選択後、
Lambdaの関数の作成画面で詳細設定を開き "関数URLを有効化"をチェックします。
（認証はパブリックな利用を想定してNONEを設定しました。）
![function_urls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391445/8b50af02-81e4-6645-cfa6-748df1ee3db9.png)

ランタイム設定のハンドラが`hello`となっているので適当な名前に変更します。
![runtime_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391445/f969c917-edbe-a64f-f386-28f031c9cc83.png)

### 環境構築

必要なパッケージのインストール
```
go get github.com/aws/aws-lambda-go
```

### ソースコード
URLがAmazonのURLか判定して真偽値を返すだけのAPIです。

```main.go
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"regexp"
	"strings"

	"github.com/aws/aws-lambda-go/lambda"
)

type Payload struct {
	Body string `json:"body"`
}

type Request struct {
	URL string `json:"url"`
}

func HandleRequest(ctx context.Context, payload Payload) (bool, error) {
	var req Request
	err := json.NewDecoder(strings.NewReader(payload.Body)).Decode(&req)
	if err != nil {
		return false, fmt.Errorf("cannot decode payload: %v: %v", err, payload.Body)
	}

	isAmazonURL, err := regexp.MatchString(`^https://(www.)?amazon.(co.)?jp[\w!\?/\+\-_~=;\.,\*&@#\$%\(\)'\[\]]*`, req.URL)
	if err != nil {
		return false, err
	}

	return isAmazonURL, nil
}

func main() {
	lambda.Start(HandleRequest)
}
```
*POSTのパラメータの取得方法がわからずハマりました。
参考: https://zenn.dev/mattn/articles/25aee329a54b38
*URLの正規表現
参考: https://qiita.com/str32/items/a692073af32757618042

### デプロイ手順

ソースコードの用意ができたらビルドします。

```
GOARCH=amd64 GOOS=linux go build main.go
```
:::note warn
警告
M1 Macを使っている場合、`GOARCH=amd64`の指定が必要な点に注意してください。
参考:https://zenn.dev/mogamin/articles/lambda-go-with-apple-silicon
:::

実行ファイルの圧縮をzipに圧縮します。
```
zip function.zip main.go
```
AWS Lambdaの画面に戻ってzipファイルのアップロードを行います。

### 実行

2つのパターンで動作確認
```
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"url": "https://www.amazon.co.jp"}' \
'https://{id}.lambda-url.{region}.on.aws'
```
結果: true
```
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"url": "https://example.com"}' \
'https://{id}.lambda-url.{region}.on.aws'
```
結果: false

# 最後に

次回はDynamoDBと連携させたい。
FileMakerの開発支援ツールMBS FileMaker Plugin (6) 値一覧情報コピー

MBS FileMaker PluginはFileMakerに機能を追加するプラグインです。非常に多数の機能を備えていますが、アプリの機能追加以外に、開発環境を強力に支援する機能も備わっています。

## 値一覧情報をコピーする

MBS FileMaker Pluginをインストールすると、コンテキストメニューに多彩な機能が追加されます。その中でもコピーの機能はとても役に立つことが多いでしょう。

これは値一覧のウィンドウです
標準であれば、値一覧名、値　を１つずつ選択すればコピーができますが、MBS FileMaker Pluginがあればより簡単スピーディにコピーができるでしょう
コピーしたい値情報を選択し、コンテキストメニューからCopy Valueを選びます
![スクリーンショット 2022-05-12 14.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/454b0876-83a8-9040-34f9-7476b49b1e74.png)

コピーした情報をテキストエディタにペーストしました。
値情報が取得できました
![スクリーンショット 2022-05-12 14.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/ecf8d67a-813f-9afd-1361-086822e52d1c.png)

次にCopy Selectionを選んでみます
![スクリーンショット 2022-05-12 14.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/de70ba55-409a-d87f-8fe8-675bef2176cb.png)

Copy Selectionでは、値一覧名、ソース、値　そしてID情報が取得できます
![スクリーンショット 2022-05-12 14.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/4bff616a-8941-5a52-93bd-31608875ff3b.png)

Copy Contentを選んでみましょう
![スクリーンショット 2022-05-12 14.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/99a5101f-5fde-57dd-fe4f-7e5ce241c75a.png)

登録されている値一覧情報をすべて取得することができました
![スクリーンショット 2022-05-12 14.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/63b4532a-667c-c306-45a6-d83fa439053f.png)

値位一覧の情報を文字列で取得するには、通常であればデータベースデザインレポートを出力してそこから取り出す必要がありますが、MBS FileMaker Pluginがあればとても簡単にその場で情報を取得することができるでしょう。

EOF
FileMakerの開発支援ツールMBS FileMaker Plugin (5) テーブル情報コピー

FileMakerでの開発作業で、MBS FileMaker Pluginを用いると作業の効率アップが期待できます。
MBS FileMaker Pluginは、アプリとして機能追加に加えて、開発を行う際の便利ツールも提供してくれています。

## テーブル定義の情報をコピーする

MBS FileMaker Pluginをインストールすると、コンテキストメニューにいくつかのメニューが追加されます。
テーブル定義情報ではどのように利用できるでしょうか
![スクリーンショット 2022-05-12 14.05.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/bc3a0d28-0db1-eb93-ae4d-54476f292066.png)

１つのテーブル情報を選んで、Copy Selectionのメニューを選んでみました
![スクリーンショット 2022-05-12 14.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/dc559718-667e-b921-fe80-b4d70fe5dc98.png)

コピーした情報をテキストエディタにペーストしてみます
テーブル名、ソース、詳細、グラフ内のテーブル名　情報をコピーすることができました。
![スクリーンショット 2022-05-12 14.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/49932fe4-b16d-799b-bdaa-59cdf3cfdb7d.png)

次に、Copy Content を選んでみます
![スクリーンショット 2022-05-12 14.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/47073dd3-715e-df2e-c3c5-cabb1dd9b117.png)

すると、登録されている全てのテーブル情報をコピーすることができました。
![スクリーンショット 2022-05-12 14.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/83f2c003-0fa1-ad54-e26c-0f4ed80dcf42.png)

Copy Valueを試してみます
![スクリーンショット 2022-05-12 14.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/2f1a2360-a0cb-6b0e-f1ed-a13728d509b4.png)

テーブル名がコピーできました。テーブル名は標準機能でもコピーができるわけですが、こちらの方が選択手順が少なく済みそうです
![スクリーンショット 2022-05-12 14.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/c6dc84a8-e4a2-fe19-7de4-0ba9ac9939f3.png)

ソース情報近くにカーソルを置いてコピーを実行します
![スクリーンショット 2022-05-12 14.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/e1c4dacd-b64d-c9c8-66e2-9827208ac24a.png)

適切にコピーできました
![スクリーンショット 2022-05-12 14.07.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/c9cd5d86-e4e4-540b-d6e5-d8ab5e4e9f40.png)

次は詳細情報を試します
![スクリーンショット 2022-05-12 14.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/923c3c8d-6708-3664-5d7c-d04aaffcca23.png)

フィールド数、レコード数の情報が取得できました。
![スクリーンショット 2022-05-12 14.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/b83ffc08-043f-9507-d5a0-6ab109fba0e8.png)

標準機能ではコピーできない情報をテキスト情報で取得できますので、設計資料などを作成するときに重宝するでしょう。

EOF
vue.jsでシンプルなアコーディオンメニュー


vue.jsでできるだけシンプルなアコーディオンメニューを作りたいと思いました。

```html
<template>
  <div>
    <div>
      <h3 @click="open('リスト1')">
        リスト1
      </h3>
      <transition name="fade">
        <ul v-if="block.open === 'リスト1'">
          <li v-for="list in lists" :key="list.index">
            {{ list }}
          </li>
        </ul>
      </transition>
      <h3 @click="open('リスト2')">
        リスト2
      </h3>
      <transition name="fade">
        <ul v-if="block.open === 'リスト2'">
          <li v-for="list in lists2" :key="list.index">
            {{ list }}
          </li>
        </ul>
      </transition>
    </div>
  </div>
</template>

<script>
export default {
  name: 'AccrodionIndex',
  data () {
    return {
      block: {},
      lists: ['aaa', 'bbb', 'ccc'],
      lists2: ['111', '222', '333']
    }
  },
  methods: {
    open (value) {
      if (this.block.open === value) {
        this.$set(this.block, 'open', '')
      } else {
        this.$set(this.block, 'open', value)
      }
    }
  }
}
</script>
```
FileMakerの開発支援ツールMBS FileMaker Plugin (4) フィールド定義コピー

FileMakerで用いるプラグインの1つである　MBS FileMaker Plugin　は作成するアプリへの機能追加に加えて、開発を行う環境を便利にする機能も備わっています。

通常であれば情報をコピーできないFileMaker特有の箇所も、MBS FileMaker Pluginがあればコピーすることができます。

## フィールド定義情報のコピー

フィールド定義の情報をコピーしたい時があるでしょう。通常であればデータベースデザインレポートを出力するなどで対応しますが、MBS FileMaker Pluginではより簡単に実現できます
![スクリーンショット 2022-05-12 14.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/89df9c12-236c-010d-9b00-d26d092e230e.png)

これは選択したフィールド名をコピーしてテキストエディタにペーストした様子です
![スクリーンショット 2022-05-12 14.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/fc650e6c-14ba-223f-d97c-6fd533275c6f.png)

MBS FileMaker Pluginをインストールするとコンテキストメニューに機能が拡張されます
ここでは　Copy Valueを選んでみました
![スクリーンショット 2022-05-12 14.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/9c525e64-9cd3-95b9-5acc-c2eb48f92ea0.png)

タイプの情報がコピーできました。　コピーしたい情報の近くでコンテキストメニューを選ぶのがポイントです
![スクリーンショット 2022-05-12 14.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/bb421d5d-db1b-0d9b-9b1a-04d06ba6c4e7.png)

次はフィールド内の計算情報をコピーしてみます
![スクリーンショット 2022-05-12 14.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/f1e0093f-cb54-04b8-2a71-8b91dd848160.png)

このような形で、計算式がコピーできました
![スクリーンショット 2022-05-12 14.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/db6f625f-dd36-53ed-a83f-a9b9ea95b582.png)

次に別のメニューを使ってみます
Copy Selection です
![スクリーンショット 2022-05-12 14.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/6cb61475-dcff-dea6-5364-1f305ccf2d31.png)

選択した行の　フィールド名　タイプ　計算式などのオプション情報がまとめてコピーできました
![スクリーンショット 2022-05-12 14.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/9fe8304a-7f08-6c5a-9df7-61c8b2c18445.png)

次は
Copy Content　です
![スクリーンショット 2022-05-12 14.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/1dd89d09-abe0-f9fe-df94-5cefe81e95d7.png)

登録されているフィールド定義情報がすべてコピーできました
![スクリーンショット 2022-05-12 14.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/cc7fcac6-3b34-18a3-17a7-a18d8533af7e.png)

スクリプトを書くときにフィールド名を正確にコピーできたり、設計書などを作成する際にフィールド定義情報を引用したいときに、とても便利に使える機能でしょう。

EOF
【初心者】特徴量エンジニアリング（トークナイゼーション）について調べてみた。

# 背景・目的
私は、現在データエンジニアリングを生業としています。普段は、データ基盤の構築や、パフォーマンスチューニングなどビックデータに関する業務に従事しています。
ビックデータの収集や、蓄積、分析などの環境構築の経験はそこそこありますが、機械学習による予測や分類などのスキルは持ち合わせていませんでした。
今まで機械学習を避け続けてきましたが、一念発起し学ぼうと思います。

学び方としては、AWS Certified Machine Learning – Specialty（以降、ML試験という。）の勉強を通して、理解を深めていきます。ML試験のガイドの第２分野に、探索的データ解析が登場しましたのでそこから学びたいと思います。

今回は、以下のうち**トークナイゼーション**について学びたいと思います。

> 特徴エンジニアリングの概念を分析/評価する (データのビニング、トークナイゼーション、外れ値、合成的特徴、One-Hot エンコーディング、次元低減)

なお、過去の機械学習の調べてみたシリースは下記にまとめています。
- 2.探索的データ分析
- 2.1.モデリング用のデータをサニタイズおよび準備する
    - [【初心者】探索的データ解析とは何かを調べてみた](https://qiita.com/zumax/items/52c97307bf18f407bb6e)
    - [【初心者】データのスケーリングを調べてみた](https://qiita.com/zumax/items/ca7184dcf4e7fd242128)
    - [【初心者】データの拡張を調べてみた](https://qiita.com/zumax/items/0727e329f3322897d3e7)
    - [【初心者】データアノテーションを調べてみた](https://qiita.com/zumax/items/d0da86b68b05b99cb23e)
- 2.2.特徴エンジニアリングを実行する
    - [【初心者】特徴量エンジニアリングについて調べてみた](https://qiita.com/zumax/items/3b6e771ef1fcaf3edd91)
    - [【初心者】特徴量エンジニアリング（データのビニング）について調べてみた](https://qiita.com/zumax/items/dc0c86736dd5362cf118)

- 機械学習プロセス
    - [【初心者】AWS Machine Learning Lensを整理する](https://qiita.com/zumax/items/93f9635b3be51fe483e1)

# まとめ
トークナイゼーションとは、元ある文字を乱数に置き換えること。変換前後で1:1の関係となるため文字数の増減はない。
復号を前提にしておらず、機密情報の長期保存に適している。

# 概要
## トークナイゼーション
トークナイゼーションを検索したものの、機械学習に特化した記事は見つかりませんでした。
トークナイゼーションは、機械学習に限った話ではなく一般的な物を指すのでしょうか。ちょっとわからないので、ITトレンドさんの記事に[トークナイゼーションとは？概要や仕組みについて詳しく解説！](https://it-trend.jp/encryption/article/64-0062)が載っていましたので、気にせず読み進めたいと思います。

> トークナイゼーションとは、カード番号などの機密情報を乱数に置き換えることで、第三者による取得を防止する技術です。置き換えられた乱数をトークンと呼びます。

- 機密情報などを乱数に置換すること、置き換えられた乱数をトークンという。
- 暗号化とは異なる。暗号化は復号を前提にしているがトークナイゼーションは違う。マイナンバーやクレカの情報などを長期保存する仕組みと指定利用されている。

### トークナイゼーションの仕組み
- 暗号化とは異なり、数学的な法則は存在しない。変換後データから変換前データに戻すことは不可能。
- 変換後データと変換前データは1:1で対応しているため、変換後データが有れば変換前データを特定することは可能。
    - これにより、普段検索や、照合する際にはトークンを使い、必要に応じて元データにアクセスする。
- メリット
    - 桁数が変わることはないため、今あるシステムの改修が不要。
    - 様々な機密データに対応できる。マイナンバー、クレカ、健保番号、年金番号などの保護も可能。
    - トークナイゼーションは、PCI DSS（PCI DSSは以下を参照。）のデータ保護の要件に記載されている4つのデータ保護方法の1つとなっている。
        - 機密データをトークン化により変換した場合、無意味な文字列のみを持つクラウドサービス側はPCI DSSの審査対象から除外（非保持化）することができるため、PCI DSS審査範囲（スコープ）の縮小できる。
    - トークナイゼーションは、改正個人情報保護法にて新たに定められた「匿名加工情報」における加工方法の１つであり、同法対応の手段として活用することも可能.

## PCI DSSとは？
[Wikipedia](https://ja.wikipedia.org/wiki/PCI_DSS)によると、以下のように記載がありました。

> PCI DSS（Payment Card Industry Data Security Standard）は、 クレジットカード情報および取り引き情報を保護するために2004年12月、JCB・American Express・Discover・マスターカード・VISAの国際ペイメントブランド5社が共同で策定した、クレジット業界におけるグローバルセキュリティ基準である。 2016年4月28日に改訂版であるV3.2が発表された。このバージョンは2016年11月1日発効となる。 これに伴いV3.1は2016年10月31日に失効し、PCI SSCは、2016年4月28日付でPCI DSS v3.2の公開を行った。[1]


- Payment Card Industry Data Security Standard
- クレカ、取引情報を保護するために策定されたクレジット業界におけるグローバルセキュリティ基準
- PCI DSSバージョン3.2には、以下の12の要件がある。

1. ネットワークとシステムの安全な構成
1. システムのデフォルトパスワードの変更
1. 保有するカードデータの保護
1. 送信するカードデータの暗号化
1. システムとウイルス対策のアップデート
1. 安全なシステムの開発と保守
1. カードデータの利用目的の制限
1. システムへのアクセス制限
1. カードデータへのアクセス制限
1. システムやカードデータへのアクセスログ監視
1. システムと手順の定期的な確認


# 考察
トークナイゼーションの理屈は分かりましたが、これを機械学習とどう結びつけていくかが未だ想像出来ていません。
今後、明らかになり次第、本ページを更新していこうと思います。

# 参考
https://it-trend.jp/encryption/article/64-0062

https://ja.wikipedia.org/wiki/PCI_DSS
【初心者向け】Tera Termのおすすめ小技

**はじめに**
---
前回のおすすめ設定やショートカットに続き、
Tera Termを初めて触る方向けに、おすすめの小技を紹介したいと思います。


***おすすめ小技***
---
・ブロードキャストコマンド
・ウィンドウのカラー変更
・自動的にウィンドウを閉じないようにする

***ブロードキャストコマンド***
---
ブロードキャストコマンドについて説明します。

ブロードキャストコマンドを使用することで接続しているウィンドウを選択し、同時にコマンドを送信することができるようになります。
ブロードキャストコマンドは上部タブの「コントロール」から「ブロードキャストコマンド」を選択することで使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/26ad9e70-5b12-f78b-db5c-2763d12e9163.png)


下記画面が表示され、現在接続しているウィンドウが下に表示されます。
ブロードキャストコマンドを送信したいウィンドウを選択し、上のコマンド入力箇所に文字を入力することでコマンドが送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/73508e94-2375-27fd-e4a3-f136f535c046.png)
「リアルタイム」を有効にすることでコマンドが即時反映されますが、無効にすると「送信ボタン」をクリックするまで反映・送信されません。
そのため、適宜状況に合わせて「リアルタイム」の有効無効を使い分けてください。

ブロードキャストコマンドはログ取得などで複数の機器に接続し、同じコマンドを入力する必要がある際に利用することで作業の効率化が見込めます。
詳細はTeraTermヘルプの「Controlメニュー」→「Broadcast command」にてご確認ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/d332a99a-167a-cf72-4c9a-c81ff8b3c501.png)


ブロードキャストコマンドの説明は以上となります。

***ウィンドウのカラー変更***
---
ウィンドウのカラー変更について説明します。

カラー変更をすることで作業時に複数のウィンドを開いている際、作業ミスを減らすことが見込めます。

ウィンドウのカラー変更は上部タブの「設定」から「ウィンドウ」を選択することでメニューが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/61a6786d-0eb4-dc2c-2b7a-8931c1c0e0f9.png)

ウィンドウの設定画面にて、画面下のカラーで設定変更を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/013cad21-d626-cb76-4be8-4f9f01f14cfe.png)

例として、背景を選択し赤を増やすことで下記のように背景が赤くなります。
※設定は画面右上の「OK」をクリック後に反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/835da65c-af83-8dca-caaf-775bebcc3791.png)

ウィンドウの設定は１つずつ設定できるため状況に合わせて色を変えることで、操作する機器を間違えるリスクを減らすことが出来るかと思います。
画面下の「常に標準の背景色を使う」を有効にしている場合、接続が途切れると設定も消失してしまうため、次の「自動的にウィンドウを閉じないようにする」を一緒に使うことで作業の効率化を図ることが出来るかと思います。

ウィンドウのカラー変更の説明は以上となります。

***自動的にウィンドウを閉じないようにする***
---
自動的にウィンドウを閉じないようにする方法について説明します。

機器によって自動ログアウト(セッションタイムアウト)が設定されていることがあるかと思います。
ログアウトしたときにTeraTermも同時に終了するようにデフォルト設定がされているかと思いますので、その設定を無効にする方法を説明いたします。

上部タブの「設定」から「TCP/IP...」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/c1289019-60f9-c926-429f-51950b3691f4.png)

「TCP/IP設定」の画面が表示されますので、中央にある「自動的にウィンドウを閉じる」を無効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/61fbf5b6-e693-abd5-83b7-f3ddda3af02e.png)

最後に「設定の保存」をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/c60b1144-8a2a-731c-66aa-9d2dd7106537.png)

これにより、機器との接続が途切れてもTeraTermが終了することがなくなるため、ログが途中で途切れたり、ウィンドウのカラーを再度変更したりといったことがなくなります。

自動的にウィンドウを閉じないようにする方法についての説明は以上となります。

***最後に***
---
今回は作業時に役立つ設定や小技を紹介しました。
これら以外にもSSH転送やマクロなど作業時に役立つ設定や小技はたくさんありますので、是非調べてみてください。

今後、TeraTermにたくさん触れる方の参考になれば幸いです。
【PHPUnitエラー】Maximum retries of 10000 reached without finding a unique value

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 状況

factoryをいくつか作成すると下記のエラーが出た。
このエラー文でググっても原因が分からず、解決に時間がかかったので備忘録とする。
```
Maximum retries of 10000 reached without finding a unique value
```

```php
class CampanyFactory extends Factory
{
  public function definition(): array
  {
    return [
      'name' => $this->faker->company(),
      'domain' => $this->faker->unique()->safeEmailDomain(),
    ];
  }
}
```

## 原因
```safeEmailDomain()```は```example.com, example.net, example.org```をランダムで出してくれるfakerだが、
今回domainカラムにユニーク制約をしていたため、domainが重複していたことで一見関係ないエラーが出てしまった。

https://github.com/fzaninotto/Faker


## 解決法
今回はfakerを使用せず、下記のようにすることでドメインを再現した。
もっといい方法があったらぜひ教えていただきたいです。

```php
class CampanyFactory extends Factory
{
  public function definition(): array
  {
    return [
      'name' => $this->faker->company(),
      'domain' => Str::random(10).'.com',
    ];
  }
}
```

## 参考

https://qiita.com/jnchito/items/198a2561a36c2c2ef5e3
【基本情報技術者】システムの信頼性評価

基本情報技術者試験の分野「システムの信頼性評価」についてご紹介いたします。

## システムの評価特性
システムの評価特性には、**R**eliability（信頼性）、**A**vailability（可用性）、**S**erviceability（保守性）、**I**ntegrity（保全性）、**S**ecurity（機密性）があり、頭文字をとって**RASIS**という。
| 名前 | 説明 |
|:-------:|:--------|
|**信頼性**|故障や障害の発生しにくさ、安定性を表します。|
|**可用性**|稼働している割合の多さ、稼働率を表します。|
|**保守性**|障害時のメンテナンスのしやすさ、復旧の速さを表します。。|
|**保全性**|情報の一貫性を確保する。障害時や過負荷時におけるデータの書き換えや不整合、消失の起こりにくさを表します。|
|**機密性**|情報漏えいや不正侵入などの起こりにくさを表します。|

RASISときたら、**信頼性・可用性・保守性・保全性・安全性**

## システムの評価指標
### MTBF
**平均故障間隔**（MTBF：Mean Time **Between Failure**）※Between(間）、Failure（失敗）
**システムが故障してから次に故障するまでの平均時間の間隔のこと。**
平均故障間隔の値が大きいほど、信頼性が高いシステムといえる。
### MTTR
**平均修理時間**（MTTR：Mean Time To **Repair**）※Repair(修理）
**システムが故障してから修理に要する平均時間。**
平均修理時間の値が小さいほど保守性が高いシステムといえる。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/8ccafe52-eb77-3058-52e4-80b4cfebc362.png)


### 稼働率
**システムが正常に動作してる時間の割合。**
全稼働時間を「MTBF＋MTTR」とし、全稼働時間のうち正常に稼働した時間（MTBF）の割合を稼働率として求めます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/a7b87bc1-4c1c-c971-e0cb-a70372f45b3f.png)

## 複数システムの稼働率
### 直列システムの稼働率
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/73c35c26-7408-7c5f-c068-3fea80d6882b.png)
・直列システム：**全ての装置が稼働している場合**のみ、システムが稼働
**直列システムの稼働率＝稼働率A×稼働率B**
### 並列システムの稼働率
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/3323c5ed-0612-6209-2f0f-ee337ec73913.png)
・並列システム：**ひとつの装置が稼働**していれば、システムが稼働
**並列システムの稼働率＝1-(1-稼働率A)×(1-稼働率B)**
### 例題
「基本情報技術者令和元年秋期 午前問16」
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/93afeaec-8ca4-c951-0db9-7ae2e72b604c.png)

※**一方が正常に動作すればよいとき（並列システム）
　2台とも正常に動作しなければならない（直列システム）**
　シンプルに、並列システムと直列システムの稼働率差を求めなさいという意味の問題。
並列の稼働率　1-(1-0.9)×(1-0.9)=1-0.1²=0.99
直列の稼働率　0.9×0.9=0.81
差は、0.99-0.81=**0.18**

## システム稼働率を求める例題
「基本情報技術者平成29年秋期 午前問15」のシステム稼働率を求める問題を解いてみる。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/f4dd1eb2-0951-6247-c76f-8279c0af4c6c.png)

稼動率は、公式からMTBF÷(MTBF+MTTR)で求めることができる。
この装置1台の稼働率は、**45÷(45+5)=0.9**
このシステムは**直列**に接続されたシステム。
直列システム稼働率=稼働率A×稼働率Bの公式から**0.9×0.9=0.81**　
よって稼働率は**0.81**となる。
sshでお手軽SOCKS Proxy[ダイナミックポートフォワーディング]

# はじめに

proxyを使う場合はたくさんあると思います。

- IPバレしたくない
- 特定ネットワーク内からのアクセスとして振る舞いたい
- 地域やアクセス回数による制限の回避


上記の場合、候補に上がるのはHTTP ProxyかSOCKS Proxyです。

## HTTP Proxy
その名の通りHTTP通信に用いることができるProxyです。
OSI参照モデルの第七層アプリケーション層で動作しています。

## SOCKS Proxy
SOCKS ProxyはHTTP通信だけではなく、FTPやSSHにも対応しています。
HTTP Proxyよりも汎用的だといえます。
OSI参照モデルでは第五層セッション層で動作しています。

## 構築手段
HTTP Proxyを時前で用意する場合、`Squid`などを使っての構築が必要ですが、
Socks ProxyではSSHの設定が済んでいれば、追加での作業は不要です。
Danteを使ったSOCKS Proxyの構築方法もあります。


# ダイナミックポートフォワーディング
クライアントの指定したportから出る通信がSOCKSサーバーから出たものとしてアクセス先に到達します。
SOCKSサーバーのどのポートから出るのかは動的に決まるため、ダイナミックポートフォワーディングと呼称します。

## 使用方法
いつものsshコマンドに `-f -N -D ローカルのポート番号`を追加して実行します。


```bash
$ ssh -f -N -D 55557 ユーザー名@サーバーのIPアドレス[ドメイン]
```

- -f: バックグラウンドで実行します
- -N: サーバーでコマンドを実行しません
- -D: クライアント[ローカルPC]のポート番号を指定します

ポートフォワーディングできているか確かめます

```bash
$ curl ifconfig.me -x "socks5h://localhost:55557"
```

サーバーのIPが出力されれば成功です。

# おまけ
下記の記事でターミナルからGoogle Chromeを起動する方法を紹介しています。

https://qiita.com/shuyaeer/items/dd73f02275e4aa038f30

起動オプションに`--proxy-server="socks5://localhost:55557"`と指定することで
Google Chromeの通信をすべてポートフォワーディングできます。

```bash
$ google-chrome --proxy-server="socks5://localhost:55557"
```
データベースの応用

## NoSQL
<b>SQLを使わないで操作するデータベース全般のこと。ビッグデータの保存や解析を目的としている。
<font color = blue>キーバリュー型</font>
<font color = blue>カラム指向型</font>
<font color = blue>ドキュメント指向型</font>
<font color = blue>グラフ指向型</font>
## データベースの応用
<b><font color = blue>データウェアハウス</font> - 大量のデータを整理・統合して蓄積したデータベース
<font color = blue>データレイク</font>
<font color = blue>データマート</font>
<font color = blue>データマイニング</font> - 統計・数学的に分析し、法則や因果関係を見つけ出すこと。
<font color = blue>BIツール</font>
## ビッグデータ
<b>多種多様で高頻度に更新されるデータのこと。
<font color = blue>オープンデータ</font>とは、機械判読に適した形式で、原則無償で自由に二次利用できるというルールのもとで、国・自治体・企業が公開するデータ。
## データ資源の管理
<font color = blue>リポジトリ</font> - 
<font color = blue>データディクショナリ</font>
pytest conftest.pyにおけるHookの実行順序の備忘録

## 経緯

conftest.py内に記述するHookの実行順序がよく分からなかったので、各functionの定義とprint文を記述し、テストが1個のファイルに対してpytestを実行して、実行順序を確認してみました。

## 関連ドキュメント

- [conftest.py: local per-directory plugins](https://docs.pytest.org/en/latest/how-to/writing_plugins.html#conftest-py-local-per-directory-plugins)
- [Hooks](https://docs.pytest.org/en/latest/reference/reference.html?highlight=pytest_generate_tests#id50)

## pytestのバージョン

- 7.1.2

## 出力結果の確認

### テスト セッション開始前

- pytest_addhooks
- pytest_addoption
- pytest_plugin_registered (複数回)
- pytest_warning_recorded
- pytest_cmdline_preparse  
  ← 警告が出力された。非推奨で将来削除されるので、代わりに`pytest_load_initial_conftests`を使えとのこと。  
     ただ、pytest_load_initial_conftestsは別途記述しているにも関わらず、出力されていない。
- pytest_cmdline_main
- pytest_plugin_registered (複数回)
- pytest_configure
- pytest_plugin_registered (複数回)
- pytest_sessionstart
- pytest_plugin_registered

### テスト セッション開始後

`～==== test session starts ===～`の出力で区切られる。

- pytest_report_header
- pytest_collection

- 以下のセットが3回
  - pytest_ignore_collect
  - pytest_collect_file
  - pytest_pycollect_makemodule

- 以下のセットが2回
  - pytest_collectstart
  - pytest_make_collect_report
  - pytest_pycollect_makeitem (1回目は複数回)

- pytest_itemcollected
- pytest_collectreport (2回)
- pytest_collection_modifyitems

`collected 1 item`が出力された。

- pytest_report_collectionfinish
- pytest_collection_finish
- pytest_runtestloop
- pytest_runtest_protocol

`テスト対象ファイル.py`が出力された。

- pytest_runtest_logstart
- pytest_runtest_setup
- pytest_runtest_makereport
- pytest_report_teststatus
- pytest_runtest_logreport
- pytest_runtest_call
- pytest_pyfunc_call
- pytest_runtest_makereport
- pytest_report_teststatus

`.`が出力された。

- pytest_runtest_logreport
- pytest_runtest_teardown
- pytest_runtest_makereport
- pytest_report_teststatus
- pytest_runtest_logreport
- pytest_runtest_logfinish
- pytest_sessionfinish

`～=== warnings summary ===～`の出力で区切られる。

警告内容の出力

- pytest_terminal_summary

`～=== 1 passed, 1 warning in 0.03s ===～`の出力で区切られる。

- pytest_unconfigure

（終了）
Seaborn箱ひげ図の横軸を10のN乗表示にする

箱ひげ図の横軸が数値で、1000000, 2000000, ... などとなっている場合に、1, 2, ... × 10^6 と表示したい。どうやら[ScalarFormatter](https://qiita.com/Fortinbras/items/50500423888ef21429be)ではできないっぽい。

[ここ](https://stackoverflow.com/questions/42813744/seaborn-boxplot-get-the-xtick-labels)を参考に、seabornで自動設定されるx軸ラベルを取得して数値に変換し、1000000で割った。

```python:python
import matplotlib.pyplot as plt
import seaborn as sns
import textwrap

fig, ax = plt.subplots(figsize=(8, 6))

sns.boxplot(x="Density", y="Ratio", data=df, color='lightgray')
texts = [textwrap.fill(t.get_text(), 10)  for t in ax.get_xticklabels()]
xlabels = [int(t)/10**6 for t in texts]
ax.set_xticklabels(xlabels) 
ax.set_xlabel("Density [$10^6$ cells/mL]")
```
こんな感じ（データはお見せできないのでx軸のみ）。
![スクリーンショット 2022-05-12 17.29.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/3982fc6b-23c4-a938-7673-e247079af73b.png)
【PHPUnit】Factoryのstateを使ってテストデータを作成する

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 前置き
テストデータの一部を変更して使いたいとき、下記のように書くこともできるが
RSpecで使われるFactoryBotのtraitのように便利に書けるものがないか調べたらあった。

```php
Task::factory()->create([
  'status' => 'done',
]);
```
## Factoryのstate
ファクトリの状態を一部変更してテストデータを作成できる。
Laravel8から使える。

```php
class TaskFactory extends Factory
{
  ...
  public function done(): TaskFactory
  {
    return $this->state(function (array $attributes) {
      return [
        'status' => 'done',
      ];
    });
  }
}
```
テスト内で下記のように定義して使える。

```php
Task::factory()->done()->create();
```


## 参考
https://www.ritolab.com/entry/215

https://readouble.com/laravel/9.x/ja/database-testing.html?header=%25E3%2582%25B3%25E3%2583%25B3%25E3%2582%25BB%25E3%2583%2597%25E3%2583%2588%25E3%2581%25AE%25E6%25A6%2582%25E8%25A6%2581
SQL(副問合せ)

## 副問合せ
<b>「SELECT文のWHERE」にさらに、SELECT文を組み込み、抽出した結果を条件として再度抽出すること。
### NOT IN
(　)に含まれない行を抽出する。
### EXISTS
<b><font color = blue>相関副問合せ</font>とは、主問合せから副問合せに一行ずつ渡し、存在の有無を判断して「真」か「偽」の結果を、副問合せから主問合せに繰り返しながら抽出すること。
 <font color = blue>EXISTS</font>は、存在の時「真」無い時「偽」を返す。
### NOT EXISTS
<b>存在の時「偽」無い時「真」を返す
## 組込みSQL
<b>C言語などのプログラム内でSQLを記述し、関係データベースの操作をプログラムから行うこと。
SQL(並べ替え・グループ化)

## 並べ替え
<b>SELECT文で「ORDER BY 列名」を指定して昇順(ASC)、降順(DESC)に並べ替えることができる。 
## 集合関数
<b>指定した列の値を集計する<font color=blue>集合関数</font>ものがある。
<font color = blue>SUM</font> - 合計
<font color = blue>AVG</font> - 平均
<font color = blue>MAX</font> - 最大値
<font color = blue>MIN</font> - 最低値
<font color = blue>COUNT</font> - 行数
## グループ化
<b>SELECT文で「GROUP BY 列名」を指定して、列の内容が一致する行をグループ化する。

### AS
<b>別名をつける
### HAVING
<b>「GROUP BY 列名」で指定したグループについて、グループに対する条件をつけることができる。
CloudRunのRevisionタグの制限

CloudRunのリビジョンタグにはいろんな制限がある。

36文字の制限だけじゃなく以下の制限もあることに注意。GitのショートコミットIDとかを付与していて偶然全部数字になるとタグの付与でコケたりするのでつらい。

![スクリーンショット_2022-05-12_17_16_20-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18973/1f017b88-8ea3-488a-ba7a-28e73e074cf9.png)
STM32G031の20mSタイマー割り込みでサーボー信号を作って遊ぶ


x まだ試していない 確認ずみ2022/5/12 20:03


目的
ほとんどLOWで簡単そうだから作ってみる

薄暗く光ったので[作戦大成功]とする




https://qiita.com/caa45040/items/2233c69e77f48eee1471



目的
GPIOのテスト
WS2812Bを光らせる。

digitalWriteの速さは、446khz
ODRの速さは、1.681Mhz


446khz は、 約2mS



いろいろ

サーボーは、どっかになくしたために持っていません。
「水着、持ってない」(聖子)　おやじぎゃぐ
あきてきたから適当でいいや
とりま、なんか光ればいいや
光った事により、完成と見なす(我が帝国では、)(どこの帝国じゃ!!)
「同情するなら金をくれ」(あだち ゆみ)



こんなかんじ

たぶん、割り込み内のウエートでこける?
空ループでいくか?
digitalWrite遅すぎるか?


たぶん正解


```c++


//timer_PWM_test_031_1


#include <Arduino.h>

#define LOOP_INTERVAL 20000
#define BOARD_LED_PIN PA11

HardwareTimer *timer2 = new HardwareTimer (TIM2);

void setup() {
  pinMode(BOARD_LED_PIN, OUTPUT);
  digitalWrite( BOARD_LED_PIN, 0);

  timer2->setOverflow(LOOP_INTERVAL, MICROSEC_FORMAT);       // 125ms
  timer2->attachInterrupt(intTimer);
  timer2->resume();



}

void loop() {

  //handler_led();

  delay(500);

}


int ii, jj, nn = 127;

void intTimer(void) {


  digitalWrite( BOARD_LED_PIN, 1);

  //delayMicroseconds(400);
  //delayMicroseconds(1500);
  //delayMicroseconds(2400);
  delayMicroseconds( (400 - 12) +   (4 * nn)        );

  //for(ii=0;ii<1000;ii++){}
  //for(ii=0;ii<(1000*nn);ii++){}

  digitalWrite( BOARD_LED_PIN, 0);
}





```
データ操作とSQL

## 関係演算
<b>関係データベースの表から目的のデータを取り出す演算
<font color = blue>射影</font> - 表から特定の列を取り出す
<font color = blue>選択</font> - 表か条件に合致した行を抽出する
<font color = blue>結合</font> - 二つ以上の表を結合して、一つの表を生成する
## 集合演算
<b>二つの表から新しい表を取り出す演算
<font color = blue>和</font> - 二つの表から全ての行を取り出す。同じ行は一つにまとめる
<font color = blue>積</font> - 二つの表に共通している行を取り出す
<font color = blue>差</font> - 一方の表から他方の表を取り除く
## SQL
<b>関係データベースの表を定義したり、データを操作したりするときに使用する言語。
データベースや表などを定義する<font color = blue>データ定義言語(DDL)</font>とデータの抽出や挿入、更新、削除などを行う<font color = blue>データ操作言語(DML)</font>がある。
## データ定義言語
### 表の定義
<b>「CREATE TABLE文」を使用。磁気ディスクに存在する<font color = blue>実表(基底表)</font>。
### ビューの定義
<b>実際に存在する実表から必要な部分を取り出して、一時的に作成した表のこと。「CREATE VIEW文」を使用。磁気ディスクに存在しない<font color = blue>仮想表(導出表)</font>。
## データ操作言語
<b>関係データベースの表から必要なデータを抽出するには、「SELECT文」を使う。
データの抽出は<font color = blue>間合せ(クエリ)</font>という。

### INとBETWEEN
<b>INはORの変わりに。BETWEENはANDの変わり

### 優先順位
<b>論理演算子の優先順位はNOT->AND->OR。()で変更できる
### DISTINCT
<b>重複行を一つにまとめる
### LIKE
<b>文字列の一部分が一致する行を抽出することができる
[Kotlin]sealed class(interface)の意義

## sealedマークを付けると
継承を制限することが出来ます。
sealed interface(class)のネストか同じファイル内でないと、継承させることはできません。

```kotlin: SportsStatus.kt
sealed interface Sports {
   object Soccer : Sports
   object Baseball : Sports
   object Tennis : Sports
}
```
上記の場合だと、Sportsの親クラスに対する子クラスは三つしかないことが確約されます。

```kotlin
fun playGame(status: Sports) = when(status) {
   is Soccer -> {}
   is Baseball -> {}
//   is Tennis -> {}    :考慮漏れがあるとコンパイルエラー
}
```

when式にかけた時に、考慮漏れがあるとコンパイルエラーにする機能があります。

## Enumとの違い
自分は、だから何？という心持ちでした。
そもそも、状態の定義ならenumでいいじゃないかと。

```kotlin
enum class Sports(val player: String) {
   Soccer("messi")
   Baseball("ichiro")
   Tennis("osaka")
}
```

enumの特徴は、シングルトンであり、valuesによって全体検索を掛けられること。
サーバーからのレスポンスに対してパースするのに便利。

しかし、上記でTennisオブジェクトだけは値を持たない場合に不便です。
playerをnullableで定義して、nullをセットするのは違和感。

```kotlin
enum class Sports(player: String?) {
    Soccer("messi"),
    Baseball("ichiro"),
    Tennis(null)
}
```

そこで、sealed classで定義すれば、各子クラスに持たせたいデータを自由に定義することが出来る。
将来的に、データを持つ状態が増える可能性を考えるとsealed interface(class)で定義した方が無難な気がする。

```kotlin
sealed class Sports {
    data class Soccer(val player: String) : Sports()
    data class Baseball(val player: String) : Sports()
    object Tennis : Sports()
}
```

## Sealed interfaceとSealed Classの使い分け
使い分けは、ケースバイケースなのかなぁという意見。
基本的に、sealed interfaceで書けるか試してみる。
要件的に、厳しかったらsealed classを検討してみます。

例えば、共通のフィールドやコンストラクタを持たせたい場合があるかなと思います。
Web技術とネットワーク　その２

# IPアドレスとポート番号
### IPアドレス（識別番号）
インターネットに接続されたコンピュータを特定できる。
データの行き先を管理するためにある。
世界にたった一つだけ同じIPアドレスが存在しない。
３２ビットの数字で表現されているIPv4が主に使われている。
IPアドレスは１０進数表記、２進数表記がある。

## IPアドレスの種類
### グローバルIPアドレス
インターネットにおいて唯一（一意）なので自由に利用できない
### プライベートIPアドレス
自宅や会社のLAN内のIPアドレスなのでグローバルIPアドレスより小規模。
同じLAN内だと同じIPアドレスを使うことはできない。
違うLAN内ならば使うことができる。

## 思ったこと
インターネットプロバイダーに大小あるようにIPアドレスにもあるだな。

## ポート番号（0~6553５）
コンピュータ内部で動作するサービスを表した番号
コンピュータが提供するサービスを指定するための番号
IPアドレスが住所だとするとポート番号はマンションの部屋番号にあたる。
なので
IPアドレスとポート番号を組み合わせることで特定のコンピュータのサービスを受け取ることができる。
Webサーバーはサーバー８０番

# ドメイン
インターネット上に存在するサーバーを特定する文字列。
IPアドレスも特定できるが人間にとって覚えにくいためこれを使う。
## ドメイン名、ホスト名、FQDNの違い
```ドメイン名```ネットワークを特定するために文字列
```ホスト名```ネットワーク上のコンピューターに付ける識別用の文字列
```FQDN```ドメイン名とホスト名をつなげたもの

# DNS
ドメインをIPアドレスに```変換する仕組み```。
ドメインがあると言ってもコンピュータへ接続する際はドメインをIPアドレスに変えなければならない。
ドメインとIPアドレスは紐付けされている。
ドメインからIPアドレスを取得するための情報を```Aレコード```
また逆を取得する情報を```PTRレコード```

# IPアドレスはたくさんあるので対処法
DNSサーバーがIPアドレスをさばいているわけだが、一台がそれを担っているわけではない。
複数のサーバーがツリー構造になって対応している。

# HTTP　Webサイトの閲覧の５つのステップ
1.ブラウザに```URLを入力```
2.ブラウザがその```データを要求```
3.サーバーが```要求内容を解析```
4.サーバーが```ブラウザへ応答```
5.ブラウザの```表示```

# IPv4とIPv6
名前が似ているどちらもIPアドレスを取り扱う。
これらの違いはIPアドレスのヒット数だ。
IPv4は４３億個
IPv６は３４０澗個（何桁かわからないが大きい数）
今までプライベートIPアドレスを使うことで節約をしていたため枯渇のスピードが落ちたが
これからIPv４からIPv６に移行する。
それはスマホの普及とIotためだ。
ARM版UbuntuにONLYOFFICE Docsをインストールする方法

[ONLYOFFICE Docs](https://www.onlyoffice.com/ja/office-suite.aspx?utm_source=howtoforge&utm_medium=cpc&utm_campaign=docs_71_htf)は、GNU AGPL v3.0のもとで配布されているオープンソースのオフィススイートです。テキスト文書、スプレッドシート、プレゼンテーション、OOXML形式と互換性が高いフォームのためのWebベースのビューアとコラボレーションエディターで構成されています。

ONLYOFFICE Docsは、Nextcloud、Redmine、Seafile、Jira、Moodleなどの様々なクラウドサービスと連携できるほか、独自のソリューションに組み込むこともできます。また、エディターは、完全な生産性ソリューションであるONLYOFFICE Workspaceの一部として使用可能です。

最新のアップデートで、ONLYOFFICEはARMベースのデバイスのサポートを追加しました。 

このチュートリアルでは、64ビットARMアーキテクチャのUbuntuにONLYOFFICE Docs 7.1をインストールする方法をご紹介します。

**ONLYOFFICE Docs 7.1の新機能**

・PDF、XPS、DjVuファイルの新しいビューア
・PDFからDOCXへの変換
・印刷プレビュー、数式のツールチップ、スプレッドシートのテキスト修飾子
・スライドのアニメーション
・ドキュメントとプレゼンテーションの「表示」タブ
・新しいグラフ種類（ピラミッド、垂直・水平シリンダー、その他）のサポート
・図形の編集を強化
・SmartArtのサポート
![Рисунок1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/c63354a3-2eab-11f5-d380-6aafe0dd901f.png)
**システム要件**
・64ビットARMプロセッサー
・2GB以上のRAM
・HDD：40GB以上の空き領域
・スワップ4GB以上
・Ubuntu 18.04または20.04（arm64用)

**追加要件**
・PostgreSQL v.12.9またはそれ以降
・NGINX v.1.3.13またはそれ以降
・libstdc++6: v.4.8.4 またはそれ以降
・RabbitMQ

**ステップ1: 依存関係のインストール**
Ubuntuに含まれるPostgreSQLのバージョンをインストールしましょう
```
sudo apt-get install postgresql
```
PostgreSQLのデータベースとユーザーを作成してください（任意のパスワードを指定して、お忘れなく）
```
sudo -i -u postgres psql -c "CREATE DATABASE onlyoffice;"
sudo -i -u postgres psql -c "CREATE USER onlyoffice WITH password 'onlyoffice';"
sudo -i -u postgres psql -c "GRANT ALL privileges ON DATABASE onlyoffice TO onlyoffice;"
```
rabbitmqをインストール
```
sudo apt-get install rabbitmq-server
```
**ステップ2：デフォルトのポートを変更する**
デフォルトでは、ONLYOFFICE Docsはポート80をリッスンします必要であれば、変更してください
```
echo onlyoffice-documentserver onlyoffice/ds-port select <PORT_NUMBER> | sudo debconf-set-selections
```
ONLYOFFICE DocsのプロトコルをHTTPSに変更したい場合は、ポートを443に変更せず、以下の指示に従ってください

**ステップ3：ONLYOFFICE Docsをインストール**
GPGキーを追加しましょう
```
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5
```
ONLYOFFICE Docsレポジトリを追加してください
```
echo "deb https://download.onlyoffice.com/repo/debian squeeze main" | sudo tee /etc/apt/sources.list.d/onlyoffice.list
```
パッケージマネージャーのキャッシュを更新してください
```
sudo apt-get update
```
mscorefontsをインストール
```
sudo apt-get install ttf-mscorefonts-installer
```
ONLYOFFICE Docsをインストール
```
sudo apt-get install onlyoffice-documentserver
```
前のステップができたら、ブラウザのアドレスバーに``http://localhost``と入力して、ウェルカムページを立ち上げてください。

**ステップ 4: HTTPSに切り替える**
ONLYOFFICE DocsをHTTPSプロトコルに切り替える最も簡単な方法は、certbotを使用してLet's Encrypt SSL証明書を自動的に取得することです。

certbotをインストール
```
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
```
メールとドメインを指定してスクリプトを実行してください
```
sudo bash /usr/bin/documentserver-letsencrypt.sh email@example.com yourdomain.com
```
できたら、ONLYOFFICE Docs が ``https://yourdomain.com`` で利用できるようになります。

以上です。
これでONLYOFFICE Docsをすでにお使いのプラットフォームと統合し、ドキュメントの編集やコラボレーションが開始できます。
Swift Package ManagerでSwiftLintを導入してみた

## 投稿の経緯
これまでSwiftLintの導入はCocoaPodsを使用していましたが、Swift Package Managerでの導入を試みたので記事にします。


## 環境
Mac Monterey 12.3.1
Swift 5.6
Xcode 13.3.1


## BuildToolsとPackage.swiftの作成
```
$ mkdir BuildTools       
```
Xcodeプロジェクトが存在するディレクトリに`BuildTools`フォルダを作成し、その中に`Package.swift`を追加する。

`Package.swift`の中身は以下の通り。

```Package.swift
// swift-tools-version: 5.6
import PackageDescription

let package = Package(
    name: "BuildTools",
    platforms: [.macOS(.v10_11)],
    dependencies: [
        .package(url: "https://github.com/realm/SwiftLint", .exact("0.43.1")),
    ],
    targets: [.target(name: "BuildTools", path: "")]
)
```

```
$ touch Package.swift   
```
また、Swift Package Managerの動作のために、`BuildTools/Empty.swift`という空ファイルも作成しておきます。


## ルールの追加
```
touch .swiftlint.yml
```
Xcodeプロジェクトが存在するディレクトリに`.swiftlint.yml`ファイルを作成します。

```.swiftlint.yml
# SwiftLintの対象外とする
excluded:
BuildToolsのパス

# 無効とするルール
disabled_rules:
- file_length
- function_body_length
- type_body_length


# デフォで無効とされたルールを有効とする
opt_in_rules:
- conditional_returns_on_newline
- closure_end_indentation
- closure_spacing


# ルールをカスタム
line_length: 450

type_name:
  min_length: 2
  max_length: 50

vertical_whitespace:
 max_empty_lines: 2

```
ルールの一例として書いています。excludedにBuildToolsファイルのパスを指定して対象外にしておくことをオススメします。（大量にルールに引っかかるので...）


## Run Scriptの追加
Xcodeの`Run Script`に以下のようにスクリプトを追加してください。
```.swift
if which swiftlint >/dev/null; then
  swiftlint autocorrect --format
  swiftlint
else
  echo "warning: Mint not installed, download from https://github.com/yonaskolb/Mint"
fi
```

これでビルド時にSwiftLintが動作します。


## 参考にした記事
https://qiita.com/uhooi/items/c1f829b115165665d2a5

https://scrapbox.io/tasuwo-ios/SPM%E7%B5%8C%E7%94%B1%E3%81%A7SwiftLint%E3%82%84SwiftFormat%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B


## おわりに
最後までご覧いただきありがとうございました。
こうしたほうがいいや、ここはちょっと違うなど気になる箇所があった場合、ご教示いただけると幸いです。
データベースの障害回復

## ログファイル
<b>障害に備え、データベースの全データをバックアップした<font color = blue>フルバックアップファイル</font>。それに加え、データベースの更新前後の値を書き出して、データベースの更新記録を取ったものが<font color = blue>ログファイル</font>。<font color = blue>ジャーナルファイル</font>とも言われている。
## データベースの障害回復
### ロールフォワード
<b>データベースのハードウェア障害に対して、フルバクアップ時点の状態に復元した後、<font color = blue>ログファイルの更新後情報を使用</font>して復旧する方法。
### ロールバック
<b>トランザクション処理プログラムが、データベースの更新途中に異常終了した場合に、<font color = blue>ログファイルの更新前情報を使用</font>して復旧させる方法。
CLIでCloud RunのデプロイをするときにRevisionタグを複数指定するには

Cloud Runにはリビジョンタグという機能がある。

これをgcloudのCLIでデプロイする際に `--tag` オプションで付与できるが、これはひとつしか渡せない。

`--tag` オプションを複数指定すると、最後に指定したものが優先される。カンマで区切ろうとすると `Resource name must use only lowercase letters, numbers and '-'. Must begin with a letter and cannot end with a '-'. Maximum length is 63 characters.` というエラーがでる。

じゃあどうするかというと、デプロイの際にはひとつだけ指定して、そのあとにデプロイされたリビジョンに対して `update-traffic` のコマンドにある `--update-tags` というオプションを用いて複数指定すればいい。こっちはカンマで区切って指定できる。

ちなみに間違えて `--set-tags` を使うとサービスにあるすべてのリビジョンのタグが更新されてしまうので注意。
進化についていくのは大変

プログラム言語ってたくさんあって
私がやってきたのはjava、C#、swift、javascriptあたりがメインなんですが
ずーーっと思っているのが『進化しすぎてません？』

『
　Struts便利だなー
　⇒DIっていうのが次来るらしい
　⇒seaser便利
　⇒えっseaser古いの？世界的にはspringなの？
　⇒spring便利
　⇒えっspringbootが簡単？
　⇒springboot便利
』
こんな感じで、
とにかくいろんな技術が次から次へと出てきては進化が続いてて
java⇒kotlin
javascript⇒typescript
みたいに派生していった言語もあるし。


各言語のフレームワークも山盛りあって、
例えば画面周りはいつの間にか
「え？jspでゴリゴリ動的に作る時代終わったの？」
「SPA？？react？vue？Angular？javascriptでゴリゴリ書くのが主流なの？」
「え！javascriptじゃない！？typescriptで書くの！？」
「tsをコンパイルしてjsにしてnodeで実行！？」

5年前までバリバリコーディングしてたけど昇進して
今は管理がメインです、みたいな人はもうついていけません。
最近の技術言われてもチンプンカンプンな顔になります。
（でも『知ってる風』を装う、プライドで。）


常にトレンドを追いかけて自分のものにし続けるている人はほんとにすごいと思う！


10年前と比べていろんな技術が溢れているから
アーリーアダプターな人が作ったソースは
「その人しかメンテが出来ない」ってことがよく起きるようになった。

技術の進化が止まらな過ぎてそろそろ「今後はこれ！！これだけ使ってたらいいから！」っていう最終のやつ出てきてくれーー！
KiCad6の3DデータがFusion360で完全に再現されないときの対処法

# はじめに
回路設計CADのKiCad6は設計した基板を3Dで表示したり3Dファイル形式で出力することが出来ます。
出力したものを3DCADで取り込むと筐体設計がとても楽になるのですが、

先日KiCad6上では完璧に3Dモデルが表示されているのに、
出力したファイルをFusion360に持っていったら一部だけ反映されないことがあり少しハマりました。

原因がわかったので備忘録として残しておきます。

# 使用バージョン
- OS Windows10 Pro
- KiCad (64-bit) 6.0.4
- Fusion360 有償版 2.0.12888

# 結論
KiCad6ではパーツにデフォルトで割り当てられている3Dデータが.wrlデータであり、
.STEPで出力するとパーツが反映されないため
パーツの3Dデータを.STEPに変更する。

# 実演
まずKiCad6で回路を書き、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/e367b1b7-8af9-5f82-56a2-3738ffb0e6bd.png" width="480px">

基板に起こします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/9595f662-cd34-d2fc-e1cb-53fd392e10de.png" width="480px">


これを3Dビューアで開くと
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/ab48643a-160c-084c-003c-54f3e5a56be0.png" width="480px">

このように表示されます。楽しいですね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/5334808d-085a-99a6-8510-64f4b626a856.png" width="480px">

この基板をFusion360に持っていくために.stepでエクスポートします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/56607188-ddb6-d00f-b9d1-4716bb30b371.png" width="480px">

出力したファイルをFusion360で開くとまっさらになっています。寂しい！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/23abbd8f-7dab-520b-134d-f57efac03e2a.png" width="480px">

KiCadに戻りフットプリントのプロパティを確認するとパーツの3Dデータがデフォルトだと.wrl形式になっていることがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/c50b951b-7362-1b3b-75ce-3fb875430ab4.png"width="480px">


すべてのパーツに.step形式のデータを使用するように変更します。 基本的には双方用意されているので拡張子を変えるだけでOKな場合が多いです。
(ちょっと色合いとかが違うっぽいです。)
再度エクスポートすると......無事反映されています！万歳！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605138/a61d85e3-fdc9-5239-ce1f-0f756ba8a121.png" width="480px">

以上です！皆様良きハードウェアライフを～
Cloudflare Pagesで間違えて追加したAccess ポリシーを削除する方法

# 概要
先日、たまたまCloudflare Pagesでサイトのデプロイ設定をスマホで見ていたところやらかしてしまった。

**Access ポリシーを間違えて有効化**してしまったのだ。
そして設定画面のどこを探しても解除とかポリシーの削除的なボタンは見つからない。そしてdependabotで更新したパッケージが正しく動くか確認するためのビルドテストの確認にもいちいちワンタイムトークン認証をやらされる。

とりあえず必死になって探し回ったところ以下の方法で解決した。

# 解決法
https://eggpan.net/post/disable-cloudflare-access/

このWebサイトの記事がものすごく参考になった。見つけた時は歓喜と安堵で叫びそうになった。

注意点としてアカウントIDはWorkersのページの下の方で見れるのでそこだけは注意してほしい。

また、削除に必要なAPIリクエストもiPhoneのショートカットAppを使えばiPhone一台で完結したのでもし私の他にもやらかしてしまった人がいれば参考にしてほしい。
TypeScriptを基本からまとめてみた【4】【オブジェクト指向 / class】

## オブジェクト指向プログラミング(OOP)とは

- 現実世界の物をプログラミングコードで表現する
- どのようにアプリケーションを作るかという方法の１つ
- 人間にとってわかりやすくロジックを分割する方法の１つ

## オブジェクト
私たちがコードで扱う具体的なもの
データを保持したりメソッドを持たせたりメソッドを実行したりする

```sample.js
{
  name: {
    firstName: "Peter",
    lastName: "Quill"
  },
  age: 38,
  gender: "male"
}
```

##### 作る方法
- オブジェクトリテラル
リテラルは文字列や数字などの値のこと。オブジェクトリテラルは、平たく言うとオブジェクトの値。
- Class

## クラス(Class)
- Classはオブジェクトの設計図になるもの
- Classから作られたオブジェクトは『インスタンス』と呼ばれる
- 似たようなオブジェクトを複数作成する時に便利

```sample1.ts
//クラスを定義する
class Person {
//プロパティを書く　値を入れる　
  name: string = 'Quill';
}
```
```sample2.ts
class Person {
  name: string;
//予約語　初期化や最初の処理を行う時に便利な関数
  constructor(initName: string){
//thisとは（name: string;）が格納されているもの
  this.name = initName;
　}
}
//オブジェクトを作成する
const quill = new Person("Quill");
console.log(quill);
```

```sample3.ts
class Person {
  name: string;
//予約語　初期化や最初の処理を行う時に便利な関数
  constructor(initName: string){
//thisとは（name: string;）が格納されているもの
  this.name = initName;
　}
//メソッドを作成する
greeting(this:{name:string}) {
  console.log(`Hello! My name is ${this.name}`) 
}
//オブジェクトを作成する
const quill = new Person("Quill");
quill.greeting();
```

##### プロパティ
クラスが持つデータ。フィールド、メンバ変数とも呼ばれる。

##### メソッド
クラスで宣言する関数のこと

##### コンストラクタ
クラスからインスタンスを作る時に行う初期化

##### インスタンス
クラスから作られたオブジェクト
クラス機能を持つクローンみたいな


## 参考サイト 
[【日本一わかりやすいTypeScript入門】TypeScriptで学ぶオブジェクト指向開発](https://www.youtube.com/watch?v=7u8o1r0LkHU&t=1783s)

[超TypeScript入門 完全パック](https://www.udemy.com/course/typescript-complete/learn/lecture/17877674#overview)