OmniAICreator/Qiita-1.07M huggingface dataset:
空間図形「京大文系2009前期1」をFreeCADでやってみた。

直線A(-3,-1,1),B(-1,0,0)にC(2,3,3)から垂線の足
オリジナル

http://server-test.net/math/php.php?name=kyoto&v1=0&v2=2009a&v3=1&v4=1&y=2009a&n=0_1

上と同じです。大学入試数学問題集成＞文系【1】

https://mathexamtest.web.fc2.com/2009/200910541/2009105410100mj.html


# sympyだけで
(省略)

# FreeCADのマクロで(計算にsympy不使用,マクロのみ)
(勉強中)
# FreeCADのマクロで(計算にsympy使用)
垂線計算にsympy使っています。
Hは、AとBの間にありませんでした。
図は、そのままではありません。手を加えています。
　
図1.アイソメトリック方向、Origin非表示
![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/de71b99e-7092-68d1-58ad-b2b1bb420967.png)
図2.FRONT方向、Origin表示
![png2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/effd49e7-38e6-90da-9184-1475bf8f3f54.png)

```python
import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
from sympy import *
var('t tt')
def myPtoM(myPoint3D):
    return Matrix([myPoint3D.x,myPoint3D.y,myPoint3D.z])
def myMtoP(myMatrix):
    return Point3D(myMatrix[0],myMatrix[1],myMatrix[2])
def myCrosstoP(P1,P2):
    return myMtoP(myPtoM(P1).cross(myPtoM(P2)))
A=Point(-3,-1,1)
B=Point(-1, 0,0)
C=Point( 2, 3,3)
H=Line(A,B).projection(C)
print("#",H)
# #########################################################################################################
# 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxtXYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.5 mm'
def myTxtXYZ_S(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt(xy_tx[2*i-2]) )
def myLine(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),float(A.z)
    Bx,By,Bz=float(B.x),float(B.y),float(B.z)
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
myTxtXYZ_S(A,"A",B,"B",C,"C",H,"H")
myLine(A,B)
myLine(C,H)
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
```
Windowsにおいて、Microsoftがオプション機能として用意しているOpenSSHをインストールする際の備忘録

Windows 10 Pro（など）で OpenSSH サーバを起動するための必要な手順に関する情報はQiitaにもすでに記事がありますが、Windowsで最も標準的と思われる、Microsoftがオプション機能として提供しているOpenSSHをセットアップする手順に関して、一次情報などの情報が分かりづらかったので主に自分向けのメモとして作成したものです。

## 動作確認した環境

* Windows 10 Pro バージョン	10.0.19043 ビルド 19043

## Micrsoftの関連記事一覧

* [WindowsでのOpenSSH](https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration?source=recommendations)
    * [OpenSSHをインストールする](https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse?source=recommendations)
    * [Windows 10 1809 および Server 2019 用 OpenSSH Server 構成](https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration?source=recommendations)

## 手順の要約

1. 「OpenSSHをインストールする」に記載の通り、Windowsの設定アプリ内の「アプリと機能」の設定を開き「オプション機能」を選択する。もしくは Windows メニューを開き、「オプション機能の管理」を検索すると同じ設定画面を開くことができる。
1. 「オプション機能」の設定で、「OpenSSHサーバー」を追加する。
1. OpenSSHサーバ、`ssdh` の設定ファイルは、参考文「サーバー構成」に記載の通り、 `%PROGRAMDATA%\ssh\` 以下にある `sshd_config` になるので、これを編集する（管理者権限のExplorerや、PowerShellを使うと良い）※場所がわかりにくい。
    Authorized_Keysを用いたパスワードレスでのログインをしたい場合、し、以下の設定変更をすると良い。
    1. 以下の設定を有効にする
        ```
        AuthorizedKeysFile	.ssh/authorized_keys
        ```
    1. `administorators` グループに居るユーザでSSHログインをする場合は、デフォルトの `sshd_config` に含まれている以下の設定を無効にする（しないと、前項の設定が効かない）。殆どの場合、下記の設定は不要なので安心して消しましょう。
        ```
        #Match Group administrators
        #       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
        ```
    1. 必要に応じて、 `%USERPROFILE%\.ssh\authorized_keys` を用意する。
pipenv lock -r が消えているのと新しい対処方法

# はじめに

デプロイスクリプトの証跡残しのために、`pipenv lock -r` でその時のインストール情報を残していたのだが、少し間を開けてそのデプロイスクリプトを実行したところ、`pipenv lock -r` がエラーとなった。

# 原因と対処

新規に `pipenv requirements` コマンドが実装されたため、併せて `piepnv lock -r` は利用できなくなった模様。
対応はこのあたり。

https://github.com/pypa/pipenv/issues/4959

https://github.com/pypa/pipenv/pull/5013

機能の更新自体は 2022/4末 ぐらいだったが、[公式ドキュメントへの反映が8月だったり](https://github.com/pypa/pipenv/issues/5253)、そもそも変更が新しいためネット上の記事の多くでは `lock -r` を利用している記事が散見される。
そのため、エラーに出会った人向けの対応策として紹介する。

https://pipenv.pypa.io/en/latest/basics/#pipfile-lock-security-features
DartでExpressを使う(型定義なし)

# 概要

[DartでNode.js用のJavaScriptトランスパイルができた](https://qiita.com/riafeed/items/e8f36bb68e7f8ed68eaf)ので、Expressを使ったサーバーを**あえて**型定義なしで作成してみる。

なぜならDart用の型定義なんて全く用意されていないし、わざわざ作るのは面倒なので、型定義しないで作ってみてどうしても複雑で必要になってから型定義を作るか考える方針でやるのがいいんじゃないかと。

# コード

とりあえず型定義なしで最低限サーバーとして動くレベルは作れた。

```main.dart
import 'dart:js';
import 'package:js/js.dart';
import 'package:js/js_util.dart';
import 'package:node_interop/node.dart';

void main() {
  var express = require('express');
  var app = express();
  const port = 8080;

  callMethod(app, 'listen', [
    port,
    allowInterop(() {
      print("サーバーが起動しました。(ポート番号:${port})");
    })
  ]);

  callMethod(app, 'get', [
    '/',
    allowInterop((req, res, next) {
      res.send('Hello World!');
      print("リクエストがありました。");
    })
  ]);
}
```

# 詰まったところ

### app.getのような関数呼び出しはうまくいかない

規則性がよくわからないのですが、上記のコードの関数をapp.getのような形で呼び出そうと下記のようにすると、

```
app.listen(...);
app.get(...);
```

トランスパイルされる関数の呼び出しコードがlistenとgetで異なり、getの呼び出しに失敗します。

```javascript
J.listen$2$x(app, 8080, A.allowInterop(new A.main_closure()));
app.$get$2("/", A.allowInterop(new A.main_closure0()));
```

なんでこうなるのか、どういう基準で違いが出ているのかさっぱりわかりません・・・。

package:js/js_utilの`callMethod`を使うとうまくいくようです。

```dart
callMethod(app, 'listen', [port, allowInterop(...)]);
callMethod(app, 'get', ['/', allowInterop(...)]);
```

```javascript
app.listen(8080, A.allowInterop(new A.main_closure()));
app.get("/", A.allowInterop(new A.main_closure0()));
```


### 引数として渡す(コールバック)関数の引数の数が異なるとエラーになる

get関数のコールバックとして渡す関数やラムダ式(ミドルウェア関数って言うらしい)の引数が(req, res)や(request, response)となっているサンプルをよく見かけますが、
JavaScriptの場合はこれでも大丈夫なんですが、Dartの場合はこれではうまくいきません。

どうやらdart2jsが出力するコードの中に引数の数が一致しているかどうかを確認するコードが含まれていて、異なっているとエラーにするようです。

```javascript
if (t1) {
  if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
    return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
  if (argumentCount === requiredParameterCount)
    return jsFunction.apply($function, $arguments);
  return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
}
```

コールバックとして渡す関数の引数は実際のところは(req, res, next)なので、Dartの場合はそれに合わせる必要があります。

### コールバック関数を引数に渡すにはallowInteropで囲む必要がある

なんでこんな仕様になっているんでしょうかね？


# 参考

https://ntaoo.hatenablog.com/entry/2019/06/04/170455


# 今後の予定

~~テンプレートエンジンを呼び出すことができればそれなりのwebサーバーは作れそうな気がする。ロジックレスじゃないと意味がない(Dartで書けない)のでロジックレスでそれなりに機能があるHandlebars辺りがいいのかな？と考え中。~~

流石に都度callMethodを呼ぶのは面倒なので.d.tsを変換するような本格的なものではなく簡易な型定義ファイルを生成する方法を模索中。
４Dアナリティクス

[Teradata Vantage™ Analytics Capabilities](https://docs.teradata.com/r/Fast-Facts/Teradata-VantageTM-Analytics-Capabilities) [リリース日：2022/5/9時点]の翻訳です。

> 4Dアナリティクス シリーズのコンテンツです。

# ４Dアナリティクス 
4Dアナリティクスは、地理空間分析での３次元空間(3D)に加えて、タイムシリーズ＋テンポラルによる時間軸(1D)の分析を組み合わせて行うことで、4次元(4D)の方向における分析をできるようにしたものです。
<img width="900" alt="4Dアナリティクス.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/ba848731-8a05-ca12-c81b-921769c9c85d.png">

### 4Dアナリティクスの主な機能
| 分析機能 |説明|
|:-|:-|
|[地理空間分析](https://qiita.com/hchd/items/1ba5a8c35b354b2a2d46)|地理空間分析はSQL/MM Spatial に準拠し、地理空間情報を管理するためのデータ型、それらを操作するメソッド及び関数、他のアプリケーションとのインターフェスを提供することで、地理空間に関する分析ができます。|
|[タイムシリーズ](https://qiita.com/hchd/items/71c820001127fa47788d)|時系列テーブルは、センサーデータなどの時系列データに特化したテーブル構造により、柔軟な操作により時系列データの記述統計的な分析を簡単に行う事ができます。|
|テンポラル|テンポラルは、期間や時間に関係するデータを格納します。このデータベースはテンポラル データ型を提供し、過去、現在および将来に関連する情報を格納します。テンポラルは時間に関連するデータを保守して、時間をベースにした判断を実行できる点で従来型データベースとは異なります。|

## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
問い合わせを受けて調査を依頼をするために、情報を整理しよう

問い合わせを受けて依頼される調査業務(以下、問い合わせ調査と呼びます)をしていて、「こういう情報があると調査が捗るな~」と思うことがあったので、記事として残しておきます。

問い合わせ元(ユーザー)→問い合わせ対応窓口→調査依頼元(開発・運用チームの窓口)→調査依頼先(開発・運用者、チーム)の流れを想定しています。

## 発生している事象・現状
発生している事象(主にバグ)です。

調査する人は問い合わせ元、問い合わせ対応窓口などとやりとりをしないため、それまでの経緯等を知らないことが多いです。
そのため、概要でいいのでどのような事象が発生して調査が必要になったのかを記載しましょう。

例:
```
発生事象:システム上でユーザーが見つからない
```

## 調査依頼内容
調査依頼内容(具体的に何を調べて欲しいのか)です。

調査依頼元の人の立場によっては、どこまで調査できるのかわからない場合もあるかと思います。
その場合も、調べてほしい情報を詳細に書いておけば、調査依頼先の人が調査可否を判断してくれるでしょう。

依頼内容が詳細でない場合、調査依頼元の人に対して認識に間違いがないか確認することになりますが、お互いの作業時間が奪われるので最初から詳細に書いておくのがいいと思います。

例: 
```
調査依頼内容:
- 該当データ(詳細は判明している情報に記載)について、以下の点を調査してほしい
  - 削除されているかどうか
  - 削除日時(削除されている場合のみ)
  - 削除したユーザー(削除されている場合のみ)
```


## 判明している情報

問い合わせ調査依頼時点で判明している、調査に有益な情報です。

調査における有益な情報とは、要するに「調査をする際に予め知っておきたい情報」のことです。
例えば、調査対象を特定できる、調査範囲を絞るための情報などが記載されていると、調査時の無駄な手間が省けます。

※情報の書き方によっては誤解を生んで余計に時間を消費するため、記載する情報は調査者に誤解を与えないように書くことを意識しましょう。


よくない例
```
判明している情報:
- 所属組織:~会社(システム上での登録名とは異なっている)
- 名前:~ (調査対象者ではなく、問い合わせ元ユーザーの名前を書いている)
- 作業日: 10月20日(時刻がわからないので、調査範囲が絞れない)
```

改善例:
```
判明している情報:
- 所属組織(~システム上の組織名): ~会社
- 問い合わせ元ユーザー名: ~
- 調査対象ユーザー名: ~
- 作業日時: 10月20日13時50分頃
```


## 関連する情報
問い合わせ調査に関連する情報です。
プロジェクト管理用のシステムを利用している場合、チケットのURLを記載しておくとこれまでの問い合わせの流れ(問い合わせ元→問い合わせ対応窓口→調査依頼の間)を確認できるので便利です。

例:
```
関連チケット: 
- https://example.com/issues/1234
```

## まとめ
以上の内容をまとめると、以下のようになります。
プロジェクトによって必要な情報・運用方法などは異なるので、自分のプロジェクトにあうように使い方を変えてください。

```
発生事象:
- システム上でユーザーが見つからない

調査依頼内容:
- 該当データ(詳細は判明している情報に記載)について、以下の点を調査してほしい
  - 削除されているかどうか
  - 削除日時(削除されている場合のみ)
  - 削除したユーザー(削除されている場合のみ)

判明している情報:
- 所属組織(~システム上の組織名): ~会社
- 問い合わせ元ユーザー名: ~
- 調査対象ユーザー名: ~
- 作業日時: 10月20日13時50分頃

関連チケット: 
- https://example.com/issues/1234
```
Microsoft365の修復

# やり方

コントロールパネル ⇒ プログラム ⇒ プログラムと機能 。
Microsoft365で右クリック ⇒ 変更 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/35a81bd7-6afb-47e2-5b55-ca39fa2dca07.png)

『クイック修復』『オンライン修復』のどちらかを選択して修復。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b2ce7dc8-45ce-6038-8f21-0c200dbd221c.png)

# 蛇足

:::note warn
『修復を行えば必ず0xc0000142が解消する』という事ではないです。
:::

下記のような障害について、過去2回Microsoft365のクイック修復で解消したことがありました。
0xc0000142エラーの場合は原因をあれこれ探るより、クイック修復をやってしまった方が解決が早いかも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f9ae0974-d4ff-854c-7578-1cefd2a3d6f7.png)


> アプリケーションを正しく起動できませんでした（0xc0000142）。
> OKをクリックしてアプリケーションを閉じてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/71c68612-1c43-e577-866a-cee01f5ff243.png)

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.2130
Microsoft Excel for Microsoft 365 MSO (バージョン 2209 ビルド 16.0.15629.20196) 32 ビット
【初心者向け】なぜSQLには結合という概念があるのか


私がデータベースを1年半くらい前からさわることになって、
理解するのに時間かかった内容の1つ。。。

「<strong>SQLの結合</strong>」について今日はかきます！！

SQLを勉強していて結合って話を聞いたけど、
なんだそれ？となってつかみにくいところもあると思う。

###### そこで「結合」をどうやってSQLでかくのかはもちろん、
###### ・なぜ「結合」という機能が必要なのか
###### ・結合することのメリット
###### について説明していきます。

今回の記事は「そもそもなぜ結合という概念があるのか？」について。

理由はいろいろあるが、ひとつはメンテのしやすさ。
といってもわからないというので例題。

たとえばちいさいこどもの味方、駄菓子屋が最近できました～。
初日の売り上げはこんなだったとしよう。

| 名前       | 年齢 | 購入日     | おかし名       | 単価 | 製造元  | 個数 | 値段 |
|:-----------|-----:|:----------:|:---------------|-----:|:--------|-----:|-----:|
| たろうくん |   10 | 2020/8/1   | えまい棒       |   10 | A会社   |    1 |   10 |
| はなちゃん |    6 | 2020/8/1   | キャビツ太郎   |   40 | A会社   |    2 |   80 |
| いっちゃん |   12 | 2020/8/1   | かっちゃんいか |   15 | B会社   |    2 |   30 |


そして、4日経過。
売上はこんな感じでのびました。


| 名前       | 年齢 | 購入日     | おかし名       | 単価 | 製造元  | 個数 | 値段 |
|:-----------|-----:|:----------:|:---------------|-----:|:--------|-----:|-----:|
| たろうくん |   10 | 2020/8/1   | えまい棒       |   10 | A会社   |    1 |   10 |
| はなちゃん |    6 | 2020/8/1   | キャビツ太郎   |   40 | A会社   |    2 |   80 |
| いっちゃん |   12 | 2020/8/1   | かっちゃんいか |   15 | B会社   |    2 |   30 |
| いっちゃん |   12 | 2020/8/2   | えまい棒       |   10 | A会社   |    3 |   30 |
| はなちゃん |    6 | 2020/8/2   | えまい棒       |   10 | A会社   |    1 |   10 |
| いっちゃん |   12 | 2020/8/3   | かっちゃんいか |   15 | B会社   |    3 |   45 |
| はなちゃん |    6 | 2020/8/3   | 茎わこめ      |   60 | A会社   |    2 |   120 |
| たろうくん |   10 | 2020/8/3   | えまい棒      |   10 | A会社   |    1 |   10 |
| たろうくん |   10 | 2020/8/1   | えまい棒      |   10 | A会社   |    1 |   10 |


ここで、大人気商品の「えまい棒」がさらに売り上げをのばしたいということで
「めっちゃえまい棒」に名前をかえることになったとしよう。

すると上の売り上げから、1か所だけでなく4か所修正が必要だ。

今回はまだ4日だからよかったもの、これが1年後とかだったらどうだろう。。
売り上げが何万、何十万行あって名前がかわったら、、、
修正したくなくなるだろう。。

そこでよくデータベースでは、上のような売り上げ情報は
以下のようなテーブルの構成にしたりする。。

■人情報
|id    | name           | age  |
|-----:|----------------|-----:|
|    1 | たろうくん  　  |   10 |
|    2 | はなちゃん  　  |    6 |
|    3 | いっちゃん  　  |   12 |

■おかし情報
| id   |   sweat_name   | price | product_company |
|-----:|----------------|-----:|:--------|
| 1    | えまい棒       |   10 | A会社   |
| 2    | かっちゃんいか |   15 | B会社   |
| 3    | キャビツ太郎   |   40 | A会社   |
| 4    | 茎わこめ       |   60 | A会社   |
| 5    | ケッピーラムネ |  100 | B会社   |

■売上情報
| id   | purchase_date | child_id | sweat_id | sweat_num   |
|-----:|:----------:|-----:|---------:|:-------|
| 1    | 2020/8/1   | 2    |  1       |      1 |
| 2    | 2020/8/1   | 1    |  3       |      2 |
| 3    | 2020/8/2   | 3    |  1       |      3 |
| 4    | 2020/8/2   | 1    |  1       |      1 |
| 5    | 2020/8/3   | 3    |  2       |      3 |
| 6    | 2020/8/3   | 1    |  4       |      2 |
| 7    | 2020/8/4   | 2    |  1       |      1 |


これは何をしているかというと、
売り上げ情報にchild_id、sweat_idという項目があるから、
人情報、おかし情報の詳細を確認したい場合は、それぞれchild_id、child_idから紐づけるとよいという寸法。

うりあげを毎回計上するときに、わざわざ
毎回、おかしの製造元や人の年齢かくのもうざい。。。
ということで、外出ししたというわけだ。

あと外だしするメリットは、前述の「めっちゃえまい棒」などに名前がかわったとき、
おかし情報の「えまい棒」を「めっちゃえまい棒」にかえたらよいだけなのだ。。

これから1年後、2年後、売上情報が何十万行あってもこわいものなし。

なんとなくイメージわいただろうか。。
わかりにくいところあれば改善していくので気軽にコメントお待ちしてます。

続いて後日続編で内部結合と外部結合の違いを説明しようと思う。
乞うご期待。
J. Orlin Grabbe著「An Introduction to Quantum Game Theory」の和訳

2022年のノーベル物理学賞の受賞者に選ばれたのは、量子力学の中でも「量子もつれ」について、理論や実験を通じて、量子情報科学という新しい分野の開拓につながる大きな貢献をしたフランスのパリ・サクレー大学のアラン・アスペ教授、アメリカのクラウザー研究所のジョン・クラウザー博士、そしてオーストリアのウィーン大学のアントン・ツァイリンガー教授の三人が選ばれました。

「量子もつれ」と関連性の高い分野として、量子ゲーム理論があると思っています。

昨年2020年のQiitaのアドベントカレンダーで、 「量子とゲーム理論」の初歩　 https://qiita.com/morimorijap/items/360520b04035a7a1cc5e という記事を投稿しまして、昨年のアドベントカレンダーでは、　https://qiita.com/advent-calendar/2021/quantum
で、

J. Orlin Grabbe著「An Introduction to Quantum Game Theory」arXiv:quant-ph/0506219v1 ,27/Jun/2005　 https://arxiv.org/abs/quant-ph/0506219 

を昨年和訳しました。　同じものをQiitaにあげるのを忘れていたので、こちらでも公開します。
PDFのダウンロードはこちら。
https://morimorijap.github.io/Introduction_Quantum_GameTheory/main.pdf 

間違え等あればこちらまで。
https://github.com/morimorijap/Introduction_Quantum_GameTheory
【パブリッシャー】Googleマップにデータを表示してみる（応用：京都編おまけ）

以前投稿した[Googleマップにデータを表示してみる（応用：京都編）](https://qiita.com/Miki_Yokohata/items/e08fd427ed959b37acb6)のおまけです。
フィルタープロンプトを表示して、クエリに住所検索をかけることができるように少し更新します。
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**パブリッシャー**を起動して、目的のレポート定義を開きます。
このレポートの`既定の出力形式`は**Chart**になっているので、`グラフ`タブへ移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f202eba7-313a-4537-45a5-0fd66f7bf5f9.png)
`グラフ`タブでは、先ず**プロンプトを表示**にチェックを入れます。これでプロンプトが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a1cc9497-4081-e41f-bcca-aba64acf302b.png)
`クエリを編集`ボタンでクエリビルダを開きフィルターの設定を確認します。
そのままでは全ての既定必須フィルターが、プロンプトとしてレポートの上部に表示されてしまうので、全てを非表示にします。
今回の例として**住所**をフィルターとして使用したいので、選択領域から**住所**をフィルター領域にドラッグ＆ドロップします。
そして初期値として`From(始め）欄`には`<like>`、`To（終わり）欄`には`%`を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bebc85b7-d746-7913-32c7-657b80da8c63.png)
`OK`ボタンでクエリを保存、`適用`あるいは`OK`ボタンでレポートも保存します。
早速ブラウザでレポートを拝見、このようなプロンプトが表示されました。
`送信`ボタンでクエリを実行してみます。そのままでは以前のように全ての情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3d956963-2f30-7e8d-fad2-175ca8c19e42.png)
住所プロンプトの`%`を`%下京区%`と変更して実行してみます。下京区の位置する情報だけが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a453b5eb-3531-6520-1e60-ec3c276d7999.png)

では、失礼します。
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-04

こんにちは

Salesforce認定Platformアプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-pt1


今回はTrailhead

認定 Platform アプリケーションビルダー資格の受験準備: Fundamentals and User Interface (基本事項とユーザインターフェース)
Salesforce の基本事項の学習

にある練習問題4問目をご紹介します

なお今回の内容は動画でも公開しております

https://www.youtube.com/watch?v=TrmQ1IgUPJ4


今回の内容はこちらです

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f9643dc9-c2d7-5719-b98b-60e1f7bb8acd.png)


正解はCです

今回の内容は特定のグループで特定の条件の取引先を表示させたい

という条件なので共有ルール作成で可能です

https://help.salesforce.com/s/articleView?id=sf.security_sharing_rule_types.htm&type=5
Power Virtual Server (PowerVS)のshared processor pool placement group (SPP PG) について

Power Virtual Server (PowerVS)のShared Processor Pool（SPP）機能について下記に書きました。
https://qiita.com/y_tama/items/12d7c975010476d4f17b

その中で、shared processor pool placement group (SPP PG)という概念が、初めてだと少し分かりにくいと感じたので解説します。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-manage-SPP#configure-SPP-PG

SPP PGは、複数のSPPを、どの物理マシン上に配置するか？ について指定するオプションです。

SPP PGの作成時にポリシーとして、Same serverかDifferent serverかを選択します。SPP PGのポリシーを後から変更することはできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/1484ec95-576f-8dbe-3fd6-c5a38238199e.png)

その後、SPPを作成する際に、SPP PGをオプションとして指定します。下記の例ではpg01_same、pg02_diffという2つのSPP PGが事前に作られています。SPP PGに所属させるSPPが1つ目の場合、SPP PGのポリシーがsameでもdifferentでも動作に違いはありません（リソースに空きのある物理マシン上に1つ目のSPPが作成されます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/0e8c89d9-9000-b474-2f85-fa1d9aac85ad.png)

SPP PGに対し、2つ目以降のSPPを作成する際、SPP PGのポリシーにより、動作が異なります。

ポリシーが"Same server"のSPP PGに作った2つ目のSPPは、1つ目のSPPと同じ物理マシン上に作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/e8630971-fc36-b952-3acf-2c0a901f59ed.png)

ポリシーが"Different server"のSPP PGに作った2つ目のSPPは、1つ目のSPPとは異なる物理マシン上に作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/7df1d231-3cbb-e872-bda8-b8792e2b15b6.png)

以上
【試験合格記】AWS 認定 データベース – 専門知識(DBS-C01)

お疲れさまです。
表題の試験を更新したため記録として残したいと思います。

# 受けた試験

- DBS-C01( AWS Certified Database - Specialty )
    - 受験日: 2022-10-19
    - 受験者スコア: 824/1000

# 前回の受験記録

- [【試験合格記】AWS 認定 データベース – 専門知識(DBS-C01)](https://qiita.com/yastani/items/280336f07acabc54efcb)
    - 受験者スコア: 816

# 試験の所感

- 前回から問題の傾向が大きく変更された気配は無かった
- メジャーバージョンが更新されるとAurora2/Aurora3にフォーカスされた設問が増えるかもしれない
- 公式が用意してくれている試験対策ドキュメントはしっかり目を通して理解しよう
    - [AWS Certified Database - Specialty](https://aws.amazon.com/jp/certification/certified-database-specialty/?c=sec&sec=resources)
    - [AWS Certified Database - Specialty 試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-database-specialty/AWS-Certified-Database-Specialty_Exam-Guide.pdf)
    - [AWS Certified Database - Specialty サンプル問題](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-database-specialty/AWS-Certified-Database-Specialty_Sample-Questions.pdf)
    - [AWS Certified Database - Specialty 公式練習問題集](https://explore.skillbuilder.aws/learn/course/external/view/elearning/12511/aws-certified-database-specialty-practice-question-set-dbs-c01-japanese?dtbs=sec&sec=prep)
    - [Exam Readiness: AWS Certified Database - Specialty](https://explore.skillbuilder.aws/learn/course/external/view/elearning/116/exam-readiness-aws-certified-database-specialty?dtbs=sec&sec=prep)

# 受験者に向けたアドバイス

- DynamoDBは正義、シチュエーションに応じてオンデマンドかプロビジョンドのスケーリングか変わってくる
- Aurora Serverless, Aurora Global Databaseの特徴はきっちり抑えておくこと
- RDS(MySQL, PostgreSQL, SQL Server, Oracle)の特徴と制約を理解しておくこと
- パラメータグループの変更や適用条件を理解しておくこと
- テラバイト級のオンプレミスデータベースをどのようにAWSへ移行するかという手法を学ぶこと
- RDSのパフォーマンス監視、パフォーマンス向上などのシナリオに適したアクションを覚えること
Go言語入門 学習メモ 10 io.Readerインタフェース

# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。

# 対象読者
- これからGo言語を学習する方
- 既に他の言語で基本構文を学習されている方

# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
- Windows 11 Home / 22H2
- VSCode / 1.72.2
- go version go1.19.2 windows/amd64
- git version 2.38.0.windows.1

https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e

# 前回までの学習
前回は Stringerインタフェース、Errorインタフェース を学習しました。

https://qiita.com/fsd-osw/items/8d21babcd2f3b644b976

# io.Readerインタフェース
io.Readerインタフェースはデータ読み込みの振る舞いを定義しています。Goの標準ライブラリはファイル、ネットワーク、圧縮、暗号化など多くの操作でこのインタフェースを実装しているようです。

インタフェースの実装は `Read(p []byte) (n int, err error)` が宣言されています。io.Readerインタフェースの概要など詳細を下記記事にまとめてくださっています。

https://qiita.com/ktnyt/items/8ede94469ba8b1399b12

```go:io.go
type Reader interface {
	Read(p []byte) (n int, err error)
}
```
次のサンプルでは標準ライブラリのstringsパッケージを使って文字列を定義、readでその文字列を読み込みます。

Readの振る舞いとしては渡すバッファの要素分を読み込み、読み込んだデータ数とエラー情報を返すようです。全て読み込みが完了するとerrにio.EOFを返します。また読み込んだ文字列は渡したバッファがスライスなのでその中に入ります。

```go:サンプルコード
package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	r   := strings.NewReader("HEEEEELO, World")
	buf := make([]byte, 8)

	for {
		// バッファに読み込み
		num, err := r.Read(buf)

		fmt.Printf("num = %d, err = %v buf = %v\n", num, err, buf)
		fmt.Printf("buf[:num] = %q\n\n", buf[:num])

		// 読み込み後にEOFに達していれば
		if err == io.EOF {
			break
		}
	}
}
```

```go:実行結果
num = 8, err = <nil> buf = [72 69 69 69 69 69 76 79]
buf[:num] = "HEEEEELO"

num = 7, err = <nil> buf = [44 32 87 111 114 108 100 79]
buf[:num] = ", World"

num = 0, err = EOF buf = [44 32 87 111 114 108 100 79]
buf[:num] = ""
```

# おわりに
今回はここまでです。
XCode 12 Warning Error｜Will never be executed

## はじめに

警告が気になる、、、

って時にどうぞ

### 環境
Swift
XCode 12.5.1 

## 本題
will never be executedという警告エラーが稀に発生してしまいます。

~~~Swift
if (false) {
  print("hello"); // warning : will never be executed
}

~~~
if文の条件式が常に偽（false）になるようなコードを書いてしまうと、このような警告が発生する原因となる。

こういう場合において、到達不能コード／デッドコードと呼ばれており、多くのコンパイラはこのようなコードを親切に警告してくれます。

この警告は、正確にはエラー（error）文ではなく警告（warning）文であるため、コンパイル自体は通ってしまいます。

### 意図的な処理ではない場合の対処方法
will never be executedが発生したコードのブロックは実行されなくなるため、この警告が発生した場合には何かしら対処が必要になる。自分で書いた条件式をしっかりと見直す必要があります。

符号なし型と符号付き型同士の比較処理等が行われていないかや、演算子の優先順位がきちんと明示されているかどうかなどについても注意が必要になります。

### 意図的な処理の場合の警告回避方法
条件式内のリテラルを括弧で二重に囲うことで、コンパイラ側の警告を抑止することができる。

/* DISABLES CODE

if (false) {
  print("hello"); // will never be executed
}

*/
また意図的なコードであることを明示するために DISABLES CODE を書いてコメントを用いることも有効ですね。

余談ですが

~~~Swift
if ((/* DISABLES CODE */ (0)) != 0) {
  // will never be executed
}

if ((0) != 0) {
  // will never be executed
  if (/* DISABLES CODE*/false) {
     // 処理の意味
     // will never be executed
  }
}
let i = 0
if (i == 0) {

}
if (/* DISABLES CODE*/false) {
   // 記法は、ブロック文のコメントアウトを実現するテクニックとして利用されることがある。
   // will never be executed
}
if (/* DISABLES CODE*/false) {
   // 本ブロック内の処理は実行されない
   // will never be executed
}
if (true) {
   // 本ブロック内の処理は実行される
}
~~~
上記の記載ですと、// will never be executed がついている部分は
警告エラー はついた状態でした。

バージョンによってはここを読まないように設定できるみたいですが
わかる方がいたら教えてください。

#最後に

なるべく黄色いエラーを消したい衝動に駆られてしまいますがまたさまざまなエラーに対しても記事として残していくのでどうぞよろしくお願いいたします。

http://sunstripe.main.jp
クラウド時代の身近な用語「ワークロード」とはいったい何なのか？

今日は小ネタ的なお話です。
この記事を読んでもAWSやGCPのスキルが身につくわけではありませんので、ご注意ください。

# ■はじめに

AWSやGCPなどクラウド基盤について学んだり調べたりしているとしばしば目にすることになる用語に「ワークロード」（workload）があります。この言葉の意味を皆さんは同僚や後輩に説明できますか？

私はできなかったので調べてみたところ、AWS公式のリファレンスでは次のように説明されていました：

> リソースと、ビジネス価値をもたらすコード(顧客向けアプリケーションやバックエンドプロセスなど) の集まり

OK。これで意味がわかりました。でも問題はここからです。

# ■それって同じ意味？

SAA資格をお勉強されている方であれば、参考書の冒頭付近に「ワークロード≒システム」という趣旨のことが述べられているのを思い出した方もいらっしゃるかもしれません。たしかにAWS公式の定義からすれば「それって、つまりシステムだよね～」となるのは頷けます。

ところがこの用語を一般的な辞書で調べると __「ある個人や組織が完了させなくてはならない作業の総量」__ みたいに説明されています。仕事（work）の負荷（load）。これはこれでわかりやすい。
そしてIT系の用語辞典で調べると __「コンピューターやシステムにかかる負荷の大きさ、CPUやメモリの使用率」__ みたいに説明されている。一般用語としてのワークロードと地続きだとわかります。

さて、これを参考書の記述と合わせると __「ワークロード＝システムにかかる負荷＝システム」？？__ ということになる。循環的でややこじつけ気味な説明に陥っています。。。「ワークロード≒システム」と言いながら、なぜあえて別の用語を使用するのでしょうか？

# ■文脈が変わった

この問題について社内でインフラチームの方たちと会話していて気がついたのは文脈の変化です。変化の原動力は「仮想化」と「クラウド化」です。

## ●第1段階：「仮想化」以前の時代

仮想化以前、システムはサーバールームやデータセンターに配備された物理マシンの上で直接稼働していました。キャパシティ／制約となるのは物理マシンであり、そこに負荷を与えるのは当該マシン上で稼働するアプリ（コード）です。

__ワークロード　＝　物理マシンに直接かかる負荷　＝　物理マシン上で動くコード__

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/0950d4c7-03f4-0c67-795a-93b68fbdda6a.png)
▲アプリ（コード）は作業量に応じてスケール。物理マシンはスケールしないのでキャパシティ／制約を規定。

## ●第2段階：「クラウド化」以前の時代

仮想化以後、システムは物理マシンで動くハイパーバイザー（仮想化基盤）の上に配備された仮想マシンの上で稼働するようになりました。
キャパシティ／制約となるのはハイパーバイザーの稼働する物理マシンであり、そこに負荷を与えるのは当該サーバー上で稼働する仮想マシンや仮想マシン上で動くアプリ（コード）です。

__ワークロード　＝　物理マシンにかかる負荷　＝　
仮想マシンとそれにかかる負荷　＝　仮想マシン上で動くコード__

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/ac12e4df-72a3-05f5-22a4-632f9fd14e9c.png)
▲ハイパーバイザー（物理）がキャパシティ／制約を規定。その内側のアプリが稼働するマシン（仮想）はある程度柔軟にスケール。仮想マシン＋アプリがワークロードに。

## ●第3段階：「クラウド化」以後の時代

クラウド化後、システムはクラウドベンダーが提供する膨大な数のハイパーバイザーとそれを基盤とするSaaSの上で稼働するようになりました。
理屈上、キャパシティ／制約となるのはクラウドベンダーが運用する物理マシン群ですが、膨大過ぎてもはや論点になりません。
負荷を与える側も夥しい数の仮想マシンやコンテナやSaaSを土台として稼働する多数のサービスからなるシステムになりました。

__ワークロード　＝　膨大な数の物理マシンにかかる負荷　＝　
仮想マシンやSaaSとそれにかかる負荷　＝　
「リソースと、ビジネス価値をもたらすコード…の集まり」__

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/64f762aa-502e-8aae-352f-235be783c6ef.png)

▲クラウド基盤を成り立たせる物理インフラがキャパシティ／制約を規定するものの・・・もはやユーザー開発者の目に見えない状態。仮想マシンやコンテナやコードやSaaSからなる「システム」がワークロードに。

キャパシティ／制約を規定し負荷を測る対象となる物理的な基盤がエンジニアから疎遠で不可視なものになる一方、必要に応じてスケールするアプリ（コード）は質・量ともに肥大化した。
すると、先程の等式で「ワークロード」と「ソースと…コード…の集まり」の間にあった __「＝　膨大な数の物理マシンにかかる負荷　＝　仮想マシンやSaaSとそれにかかる負荷」__ が抜け落ち（存在感が低下し、遠方に霞んで）、 __「ワークロード」__ と __「ソースと…コード…の集まり」__ が直に結ばれるわけです。

__ワークロード　＝　　
「リソースと、ビジネス価値をもたらすコード…の集まり」__

# ■わかること、わからないこと

ここまでお話してきたことはあくまでも私の考えです。
そういう考え方もできるのでは？ということです。

所詮はその程度のものなのですが、でも「わかったようなわからないような」用語について自分なりに考えが整理できると、それを土台に人に説明をしたりより高度な話題について考えることができるようになります。

わかること・わからないことを整理しながら一歩ずつ学んでいく。なんでもかんでも気になったワードに齧り付いていくわけにはいきませんが、時折こうした概念的な作業をしてみるのはオススメです。
Atlas APIにおけるMigrationモード

どういう違いがあるのか、ドキュメントに書かれていないように見えたがコードを見ると書いてあった。

https://github.com/ent/ent/blob/5330f877593201a1538884944f1783b104c6fbc4/dialect/sql/schema/atlas.go#L555-L563
```go
// Mode to compute the current state.
type Mode uint

const (
	// ModeReplay computes the current state by replaying the migration directory on the connected database.
	ModeReplay = iota
	// ModeInspect computes the current state by inspecting the connected database.
	ModeInspect
)
```

`ModeReplay` は生成されたマイグレーションのDDLから差分を計算してして新しいマイグレーションを生成するが、一方で `ModeInspect` はマイグレーション対象のデータベースのスキーマを参照してその差分からマイグレーションを計算し生成するみたい。

`WithMigrationMode` メソッドに書かれている[コードコメント](https://github.com/ent/ent/blob/5330f877593201a1538884944f1783b104c6fbc4/dialect/sql/schema/atlas.go#L545-L554)によると現時点では `ModeInspect` がデフォルトだが、長期的にはこちらがDeprecatedされ `ModeReplay` がデフォルトの挙動になるとのこと。

```go
// WithMigrationMode instructs atlas how to compute the current state of the schema. This can be done by either
// replaying (ModeReplay) the migration directory on the connected database, or by inspecting (ModeInspect) the
// connection. Currently, ModeReplay is opt-in, and ModeInspect is the default. In future versions, ModeReplay will
// become the default behavior. This option has no effect when using online migrations.
func WithMigrationMode(mode Mode) MigrateOption {
	return func(a *Atlas) {
		a.mode = mode
	}
}
```

[Versioned Migrationのドキュメント](https://entgo.io/ja/docs/versioned-migrations#generating-versioned-migration-files)によると `ModeInspect` だと差分を生成するのに本番DBに繋ぎに行くことになるから微妙で、それならコードから一意に判定できる `ModeReplay` のほうがいいよね、ということらしい。
LightsailでのSSL証明書更新でつまずいた

Lightsailサーバ上にWordPressサイトを構築しているのですがLet's Encryptで作成したSSL証明書の有効期限が近づいてきました。

元々AWSのページを参考にSSL証明書を作成していたので同じくAWSのサイトをもとに更新しようとしたところ、やはりページに記載がある通りに行なっただけではうまくいかずエラーが・・・😢

https://aws.amazon.com/jp/premiumsupport/knowledge-center/lightsail-bitnami-renew-ssl-certificate/

# 具体的な作業
certbotを利用してSSL証明書を発行していたので、以下のコマンドでauthenticatorパラメータ値を確認してみました。

```
sudo cat /etc/letsencrypt/renewal/[DOMAIN].conf
```

authenticatorの値はstandaloneだったので以下のコマンドを実行

```
sudo /opt/bitnami/ctlscript.sh stop
sudo certbot renew
sudo /opt/bitnami/ctlscript.sh start
```

standaloneで設定しているとWebサーバを一度停止させないといけません。停止させずにrenewさせると"Problem binding to port 80"のエラーが発生します。

# Webサーバを停止せずに更新する方法はないの？

わざわざサーバ停止させないといけないのか・・・と思っていたところ、以下の記事を発見。

https://note.affi-sapo-sv.com/letsencrypt-uodate.php

ということで、standalone→webrootに設定を変更しました。

```
certbot certonly --webroot -w [DOMAINルートフォルダ] -d [ドメイン名]
```

これで解決👍

# 自動的に更新したい
今回はauthenticatorパラメータを変更したので手作業で行いましたが次回SSL更新は自動的にやって欲しいので、今後cron設定でcertbot renewをバッチ処理させようと思います。
おすすめの拡張機能（Django編）

## Django
Baptiste Darthenay
HTMLを編集する際にDjango特有のコードの補完をしてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893241/fdf7e8d4-9815-20bb-3e44-0622d2637029.png)

https://marketplace.visualstudio.com/items?itemName=batisteo.vscode-django

## Prettier 
コードを自動的に整形してくれる拡張機能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893241/254fddca-5e48-bcb1-9c5d-5dee320fed50.png)

https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

## Highlight Matching Tag
カーソルを当てているHTMLタグにハイライトを自動的に当ててくれる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893241/0dc263e7-8957-9c4e-7ff4-022168a6ce6e.png)

https://marketplace.visualstudio.com/items?itemName=vincaslt.highlight-matching-tag

## indent-rainbow
インデントが視覚的にわかりやすくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893241/af4e1a55-3c64-00d1-b0e3-981572e0dd77.png)

https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow
Simple Bitwise Operators in Rust

![Screen Shot 2022-10-24 at 10.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646237/2c35f3c6-b632-3e01-b6b7-3bcfe78dc1b4.png)

Simple and easy, using a binary representation of the figures in play, where do the bits 
&: overlap
^: not overlap
<<: shift

Naturally seems like a good idea to write things out.
VueをCLIでインストールしたらエラーが出た

今までVueをvue-routerを使ってLaravelと連携させて使っていたのですが、徐々に疎結合なシステム開発に移行していこうと思い、Laravelベースのバックエンド開発とVueベースのフロントエンド開発を分離することにしました。

# 発生した現象

ってことで単独でVueのプロジェクトを新規に作ろうと思い、以下のようなサイトを参考にVue-CLIをインストールしてvue createをしようとしたのですが早速エラーが。。。😢

https://shimablogs.com/vuecli-built-environment

```
 ERROR  Error: command failed: npm install --loglevel error --legacy-peer-deps
Error: command failed: npm install --loglevel error --legacy-peer-deps
    at ChildProcess.<anonymous> (/usr/lib/node_modules/@vue/cli/lib/util/executeCommand.js:138:16)
```

# 対応内容
vue3ベースのプロジェクト作成をしようとしたためのバグ？とも思われたのですが、以下の方法を試したのですが解決せず時間を取られました。

* npmおよびvue-cliの再インストール
* npm cache clean --forceの実行

最終的に以下のコマンドを実行することで解決

```
vue config -s packageManager npm
```

いつもいつもstackoverflowには感謝🙏

# もっと根本的な解決策を考えないと・・
npmやcomposerのエラーにはよく悩まされます。
アップデートやリリース処理のたびに時間を取られており、まさに「付加価値を生まない重労働」だと感じています。
CI/CDのためにはこの辺がいつもボトルネックになるので解決策を考えないといけないですね。

コンテナ化することで各環境でアップデートをかけなくても良くなるので一つの解決策になるかも。
ファイルディスクリプタ



ファイルやソケットなどを抽象化した仕組み。Linuxはシステム内のあらゆるものをファイルという抽象概念に昇華させたシステム。

ファイルの用の扱えるもののレイ

 - ファイル
 - 標準入出力
 - ソケット
 - ブロックデバイス
 - ディスプレイ


プログラムからファイルを操作する際、操作対象のファイルを識別・同定するために割り当てられる番号により操作をする。


参考になったページ

https://qiita.com/tajima_taso/items/7e696944cb521958e63d

いつもありがとうございます。
railsテスト入門（Rspec

# このドキュメントの目的

railsのテストを勉強し始めるに当たってのメモ。主にRspec

# テストの流れ

- spec配下にテストをかく
- `bundle exec rspec spec`でテスト
- 成功したかどうか返ってくる

## minitestかRspecか

RSpecとminitestのおおまかな違い
https://qiita.com/kenkenkengo-y/items/5fb3f3602dcf3826ce19

## Rspec導入

Rails+RSpecで気軽に始めるテスト
https://weseek.co.jp/tech/1409/

## factorybot導入

factorybotはテストデータを簡単に用意できるgem

https://post-output.com/400-2/

# なにをテストすべきか？

https://www.techpit.jp/courses/25/curriculums/26/sections/220/parts/775

テストの内容は大きく分けると下記３つ。定義は上記記事。

- 単体テスト
- 結合テスト
- システムテスト

システムテストは実際にはQAやE2Eでテストされることが多く、テストを書くのは単体、結合が主。

# Rspecで覚えておきたい用語

- モック:実際のコードではなく、testを代わりに実行するプログラム。外部のAPIを試したい時とかに使う


# Rspecの基本的な書き方

https://qiita.com/jnchito/items/42193d066bd61c740612#describe--it--expect-%E3%81%AE%E5%BD%B9%E5%89%B2%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B

上記の「describe / it / expect の役割を理解する」がよくまとまっている

```
RSpec.describe '四則演算' do
  it '1 + 1 は 2 になること' do
    expect(1 + 1).to eq 2
  end
end
```

- ファイル生成
  - https://qiita.com/tatsurou313/items/c923338d2e3c07dfd9ee#%E3%83%86%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87
- describeでテストをグループ化する
- itでexampleという単位にまとめる。このexampleがテストの最小単位
- expect(X).to eq Yをエクスペクテーションといい、これが全て通るとexampleが通る
- toなどはマッチャと言われる


## 使用頻度の高いマッチャ

https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5

# モックとスタブの違い

- そもそもモックとスタブは仮の部分を書いてテストすること。例えばAPI部分などテストで実際に送れないところをモックで代用することでテストしやすくする。例えば下記で使用
  - APIの応答
  - tweetなど外部に公開する部分
- モックはプログラム全体に対してテストを行い、反応を見るものでスタブは対象のメソッドのみテストするもの

## モック

- データベースのアクセスなしで動く
- doubleを用いて影武者を生成

## スタブ

- テスト用のダミーメソッド
- データベースやネットワークを使うメソッドをデータベースへのアクセスなしで呼び出す。
- allow(モデル名).to メソッドを用いてダミーメソッドを作成

https://qiita.com/fuku_tech/items/261e958b35ab809213da

# テスト実行

全てのrspecのテストを行いたい場合は下記（docker内

```
docker-compose run web bundle exec rspec
```
Route53のエイリアスとCNAMEの違いが分かりにくいので、整理してみた(1/2)

Route53のエイリアスとCNAMEの違いが分かりにくいので、整理してみた。

【考えるきっかけ】
ALBを作成する際に、ホストゾーンが、example.comの時、www.example.comのドメインをポイントするエイリアスレコードを作成する。
当たり前のようにしている事だとは、思いますが、これは、どのような効果があるのだろうか考えようと思った。

Amazonのサイトによると、

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html

「CNAME レコードとは異なり、DNS 名前空間の最上位ノード (Zone Apex とも呼ばれる) にエイリアスレコードを作成できます。例えば、example.com という DNS 名を登録する場合、Zone Apex は example.com になります。example.com に対して CNAME レコードは作成できませんが、(www.example.com に　CNAME レコードがない限り) www.example.com に対してトラフィックをルーティングするエイリアスレコードを作成できます。」

はい。専門用語がいっぱいですね。

【まず、専門用語を読み解く】

・Zone Apexとは、最初にサブドメインを伴わない、ドメイン名自体の事で、ネイキッドドメインやアペックスドメイン等と呼ばれる。

・エイリアスとは、ファイル等の実体を別の名前で参照するシンボル及び機能の事、人の名前を呼ぶ時のあだ名みたいな別の呼び方を指す。

・CNAME？
下記サイトによると、

https://jprs.jp/glossary/index.php?ID=0212

「サーバーの正式なドメイン名はservice.example.jpであるが、将来のことを考えて情報提供ではinfo.example.jpを、ショッピングではshop.example.jpというドメイン名で運用したいといったケースが該当します。」

という事で、用途に応じた名前の柔軟な使い方をする時に利用するようです。

【深堀する】
Amazonのサイトによると、

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html

「エイリアスレコードを使用して AWS リソースにトラフィックをルーティングしている場合、Route 53 はリソースでの変更を自動的に認識します。例えば、エイリアスレコード example.com が lb1-1234.us-east-2.elb.amazonaws.com の ELB ロードバランサーを指し示しているとします。ロードバランサーの IP アドレスが変更された場合、Route 53 が自動的に開始され、新しい IP アドレスを使用して DNS クエリに応答します。」

という事は、ロードバランサのIPが変わった時に、Route53が自動的に解釈してくれるらしい。

【何が違うんだろう】
・CNAMEレコードを利用するよりもクエリ回数が少なくて済むので、レスポンスが早いという事らしい。
・DNSの仕様上、最上位ノード (Zone Apex とも呼ばれる) にエイリアスレコードを作成できないという制約を回避して、レスポンスを向上させる事が出来るという事らしい。

Classmethodのサイトによると、

https://dev.classmethod.jp/articles/amazon-route-53-alias-records/

「CNAMEレコードを利用した場合、まずexample1.をDNSに問い合わせるとawseb--1110552124.ap-southeast-2.elb.amazonaws.comが返り、これをさらにDNSに問い合わせた結果として..**.183を得ます。つまり、DNSクエリが2回発生します。
一方、ALIASレコードを利用した場合は、example1.*から直接...183を得ますので、DNSクエリが1回で済みます。50%削減です。ALIASレコードではなく、..**.183のAレコードを直接定義すればいいと考えるかもしれません。しかし、ELBのDNS名に対するIPアドレスは動的に変化する可能性があるため、そうすることはできません。」

以上
paiza.ioでelixir その6

# 概要
paiza.ioでelixirやってみた。
fizzbuzzをパイプラインでやってみた。

# 参考にしたページ

https://qiita.com/SekiT/items/f5ae64dc8cad66ee03d3

# サンプルコード

```
Stream.unfold({1, 1, 1}, fn
  {n, 3, 5} -> 
    {"FizzBuzz", {n + 1, 1, 1}}
  {n, 3, b} -> 
    {"Fizz", {n + 1, 1, b + 1}}
  {n, f, 5} -> 
    {"Buzz", {n + 1, f + 1, 1}}
  {n, f, b} -> 
    {n, {n + 1, f + 1, b + 1}}
end) 
|> Stream.take(100) 
|> Enum.each(&IO.puts/1)
```

# 実行結果

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

# 成果物


https://paiza.io/projects/HiMi5fOxk7lVF5dUFspHFQ?language=elixir



以上。
オーバーラップ分析 (column overlap)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
オーバーラップ分析では、2つのテーブルのキーフィールドを比較し重複しているかを数えます。どのキーフィールドが重複したデータを保持しているかを知ることで、複数のテーブルの情報を結合して分析用データセットを作成すること可能になります。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::

# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。

# 実行方法
## SQLからの実行する場合の例
```SQL
CALL td_analyze (
  'overlap',                                     /* 分析手法　*/
  '
  database        = QID,QID;                     /* データベース名 */
  tablename       = Customer,Superstore;         /* テーブル名 */
  columns         = {Customer_ID},{Customer_ID}; /* カラムリスト */
  '
);
```
:::note information
出力結果をテーブルに書き込む場合は以下オプションを指定可能です。
outputdatabase = 出力データベース名;
outputtablename = 出力テーブル名; 
overwrite = {true | false}; --- 未指定の場合はtrueで上書きします
:::
### 出力結果
|xidx|xdb|xtbl|xcol|xcnt|xunique|Customer|Superstore|
|:-|:-|:-|:-|:-|:-|:-|:-|
|1|QID|Customer|Customer_ID|4910|793||793|
|2|QID|Superstore|Customer_ID|9994|793|||

### 出力結果の説明
| カラム名 | データタイプ | 説明 |
|:-|:-|:-|
|xidx|BYTEINT|連番|
|xdb|VARCHAR (128)|データベース名|
|xtbl|VARCHAR (128)|テーブル名|
|xcol|VARCHAR (128)|カラム名|
|xcnt|FLOAT|レコード数|
|xunique|FLOAT|ユニークレコード数|
|テーブル1|varchar(128)|キーが一致した数|
|テーブル2|varchar(128)|キーが一致した数|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
paiza.ioでelixir その5

# 概要
paiza.ioでelixirやってみた。
Fibonacci Serverやってみた。

# 参考にしたページ

https://qiita.com/sand/items/47d2d5de44df2ae07f83


# サンプルコード

```

defmodule FibSolver do
	def fib(scheduler) do
		send scheduler, {:ready, self()}
		receive do
			{:fib, n, client} -> 
				send client, {:answer, n, fib_calc(n), self()}
				fib(scheduler)
			{:shutdown} -> 
				exit(0)
		end
	end
	defp fib_calc(0), do: 1
	defp fib_calc(1), do: 1
	defp fib_calc(n), do: fib_calc(n - 1) + fib_calc(n - 2)
end

defmodule Scheduler do
	def run(num_processes, module, func, to_calculate) do
		(1..num_processes)
		|> Enum.map(fn(_) -> 
		      spawn(module, func, [self()]) 
		   end)
		|> schedule_processes(to_calculate, [])
	end
	defp schedule_processes(processes, queue, results) do
		receive do
			{:ready, pid} when length(queue) > 0 -> 
				[next | tail] = queue
				send pid, {:fib, next, self()}
				schedule_processes(processes, tail, results)
			{:ready, pid} -> 
				send pid, {:shutdown}
				if length(processes) > 1 do
					schedule_processes(List.delete(processes, pid), queue, results)
				else
					Enum.sort(results, fn {n1, _}, {n2, _} -> 
					    n1 <= n2 
					end)
				end
			{:answer, number, result, _pid} -> 
				schedule_processes(processes, queue, [{number, result} | results])
		end
	end
end

to_process = [9, 10, 11]
Enum.each 1..4, fn num_processes -> 
    {time, result} = :timer.tc(Scheduler, :run, [num_processes, FibSolver, :fib, to_process])
	if num_processes == 1 do
		IO.puts inspect result
		IO.puts "\n # time (ms)"
	end
	:io.format "~2B ~.2f~n", [num_processes, time / 1000.0]
end

```

# 実行結果




```
[{9, 55}, {10, 89}, {11, 144}]

 # time (ms)
 1 1.89
 2 0.04
 3 0.05
 4 0.07


```

# 成果物


https://paiza.io/projects/kzkxKQafBwpWXTsTketF8A?language=elixir


以上。
CakePHPでPaginatorComponentが非推奨だと言われたので

CakePHP4.4からPaginatorコンポーネントは非推奨だぞといわれたので  
Paginateヘルパーを今までと同じように使用するために再現したメモです。

```php
$request = $this->getRequest();
$query = $this->Users->find()->toList();

$paginator = new NumericPaginator();
$records = $paginator->paginate($query, $request->getQueryParams(), $this->paginate);
$params = $paginator->getPagingParams();
$this->setRequest($request->withAttribute('paging', $params));
```

直接呼べって書いてありましたが、ヘルパーで使用するセットされているべき情報があるので  
そのままでは使えないので注意が必要でした。
Stripeを利用したシステム開発・運用を、より安全に行うために利用したい４つの機能

Stripeには、顧客の氏名やメールアドレス・請求先住所などの個人情報と、ビジネスに関する指標データなどが保存されています。

そのため、関わる人数の多いプロジェクトや企業では、情報が漏えいしないように厳重な管理が求められます。

ここでは、Stripeダッシュボードで簡単に設定・操作ができる、アクセス管理や監査データの取得方法を紹介します。

## Stripeを利用したシステム開発・運用を、より安全に行うために利用したい４つの機能
### 1: ユーザーごとの役割設定で、個人情報などの重要なデータへのアクセスを制限しよう

Stripeダッシュボードでは、「返金などの顧客サポート」や「APIキー・Webhookの操作などの開発業務」など、ユーザーごとに役割を設定できます。

![スクリーンショット 2022-10-07 19.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ba6a45f1-7099-db42-01a1-ebaee5667ee6.png)

ユーザーごとに役割を明確に設定することで、顧客情報やビジネスの重要な指標などへのアクセスを制御できます。

https://qiita.com/hideokamoto/items/c52961fd536968183a20

また、2段階認証を必須にすることもできますので、こちらもご活用ください。

![スクリーンショット 2022-10-07 19.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d69f98ae-fdab-7084-4338-eff38ad0bb99.png)


### ２: 開発者ごとに、機能を制限したAPIキーを作る「制限付きのキー」

ダッシュボードへのログインだけでなく、API操作についてもアクセス制御が可能です。

ダッシュボードの[開発者 > APIキー]で、[制限付きのキーを作成]ボタンをクリックすると、作成できます。

![スクリーンショット 2022-10-07 19.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1aac1f08-e753-5c49-1081-339ff42425cb.png)

ここでは、リソースごとにAPIへのアクセス権限を[なし][読み取り][書き込み]の３つから選択できます。

![スクリーンショット 2022-10-07 19.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/5824784b-1202-d4a1-1e51-3155a9f2f011.png)

また、Connectで作られた子アカウントに対する権限についても設定が可能です。

ローカルの開発用途や、AWS Lambda / CloudFunctionsまたはコンテナサービスなどのマイクロサービスで、意図せぬAPI呼び出しを防ぐために活用しましょう。

https://stripe.com/docs/keys#limit-access

https://stripe.com/docs/development/dashboard/manage-api-keys#%E5%88%B6%E9%99%90%E4%BB%98%E3%81%8D%E3%81%AE-api-%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

### 3: 「セキュリティ履歴」で、ユーザーの操作ログを取得しよう

[[設定 > セキュリティ履歴]](https://dashboard.stripe.com/settings/security_history)から、「ユーザーやCLI、APIキーでどんな操作が行われたか」をまとめて確認できます。

![スクリーンショット 2022-10-07 19.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/cf853903-6986-8f76-42ef-ecab359f3af1.png)

#### CSVファイルのエクスポートも可能

セキュリティ履歴のデータは、CSVでDLできます。

![スクリーンショット 2022-10-07 19.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/226ae1bb-66b5-cb4d-4475-24a4d4990f5b.png)

監査やワークフローの自動化でCSVファイルが必要な場合などに使えます。

![スクリーンショット 2022-10-07 19.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/28fbfb5c-7bd8-483e-581e-947c766b6b96.png)

### 4: API呼び出しログで、意図せぬAPI呼び出しがないかチェックする

StripeのAPIを呼び出すと、ダッシュボードの[[開発者 > ログ]](https://dashboard.stripe.com/test/logs?)にそのログが表示されます。

![スクリーンショット 2022-10-07 19.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/60127e87-032c-8c9b-becc-f99ab0b7aa85.png)

APIキー漏洩による不正なAPI呼び出しがないかや、システムのバグによるAPIエラーが出ていないかなどは、このログページでチェックできます。


## ダッシュボード機能を活用して、より安全な決済OPSを

Stripeにはこのようにさまざまなアカウントの安全性を高める機能が用意されています。

もし今まで見ること・使うことのなかった機能がありましたら、ぜひこの機会にお試しください。

## [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
Forbidden Error and How to Fix it

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


# 400番台

+ [403 エラー](https://qiita.com/Keiji_otsubo/items/662ea2866fb6dc43d31c)
Google Cloudを利用してサーバレス構成でWebサイトを公開する

# 最初に
Google Cloudのプロダクトを用いてベーシックなサーバーレス構成で開発を実施しました。
開発にあたって特殊なプロダクトは使用しておらず、シンプルなサイトを作成するのであれば複雑な手順は必要ありません。

# 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2927886/77e3ab9a-ce3b-1d7e-6e99-70abaae12dd3.png)

### プロダクト
**Cloud Storage**
容量無制限・低価格・堅牢なオブジェクトストレージサービスです。
公開するファイルを配置しています。

**Cloud Logging**
Google Cloud上のシステムが生成したログを収集・管理するサービスです。

**Cloud Load Balancing**
自動スケーリングにより、トラフィックの増減に合わせた対処が可能なGoogle Cloudの提供するロードバランシングサービスです。

**Cloud CDN**
Cloud Load Balancingと連携してユーザーにコンテンツを高速で配信するサービスです。
信頼性が高く、また高性能なGoogle Cloudのインフラを使ってファイルの配信を行うことが可能です。

**Cloud Armor**
Cloud Load Balancingの背後にあるWebアプリケーションを保護できます。
今回はIPアドレスの制限に用いています。

**Cloud Functions**
Cloud Functions とは Google Cloudが提供するサーバーレスのコンピューティングサービスです。

サーバーレスのメリットとして、サーバーの構築や保守、スケールアップ・ダウンなどの管理メンテナンスを必要としません。
またミドルウェアのインストール等、構築の手間がないためスピードが早く、ロジックが複雑でなないWebサービスの場合はランニングコストが圧縮され、コスト効率を高める場合があります。

**Firestore**
FirestoreのNoSQLデータベースは大容量データでも処理速度が速く、さらに水平分散によるスケールアップが可能なことから拡張性にも優れています。

Cloud Functions、Firestoreの両サービスともにリクエストに応じた課金体系でもあるため、公開から時間が経過しアクセス数が減少したタイミングでもアクセス数に応じた利用料金のみを支払えば良いというメリットもあります。

# サーバーレスでWebサイトを作成する流れ
以下の手順で作成します。
### 1.Cloud Storageを作成
Cloud Storageを作成し、公開するファイルを配置します。
+ 設定
~~~
データの保存場所：Region
ストレージクラス：Standard
公開アクセスの防止：アクセス禁止を適用しない
アクセス制御：均一
オブジェクトデータの保護：なし
~~~
特に理由がなければ、上記の設定で良いと思います。

また、アクセス権の編集からプリンシパルの追加でallUsersに対してStorageの読み取り用のロールを追加し、インターネット上に公開する必要があります。
レガシー権限であれば一覧表示権限は含まれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2927886/afbba3bb-58d2-eded-03af-26616f6f8660.png)

### 2.ロードバランシングの設定
HTTP(S)ロードバランシングを構成します。
+ フロントエンドの構成
HTTPS接続する場合は証明書を作成して登録する必要があります。
+ バックエンドの構成
先ほど作成したCloud Storageを登録します。
また、ロードバランサを作成中に静的コンテンツをキャッシュさせるためにCloud CDNを設定できます。
![image (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2927886/77a2a496-69e0-96ac-1d15-51c8c21f0ec8.png)
ドメインを取得している場合は、Cloud DNSから登録します。

### 3.Firestoreを作成
Cloud Functionsから利用するFirestoreを設定します。
使用を想定しているコレクションを作成し、データを登録・取得できるようにします。

### 4.Cloud Functionsを作成
scriptファイルからAPIを呼び出せるように、未認証の呼び出しを許可します。
Firestoreを利用できるように、新しくランタイムサービスアカウントを作成し、Firestoreを利用できるようにロールを付与します。
Cloud Storageからファイルを取得したりする場合は追加で別のロールも付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2927886/503105e3-9a76-0411-ae72-a56a8e401dff.png)

![image (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2927886/f5208c99-9ad5-999d-4626-dfb448d628bf.png)
URLから呼び出すことができます。

### その他.Cloud Armor
開発中で外部に公開したくない場合は、Cloud ArmorでIPアドレス制限をかけることができます。



# 最後に
この仕組みは弊社事例だとこのようなサービスに活用しております。

関連事例：https://cloudpack.jp/casestudy/gcp-008.html

# 参考
+ [python×Cloud Functions×FirestoreでAPIを簡単に作ってみる Pt1](https://qiita.com/ny7760/items/9cdc3407dfda99c21ae1)