OmniAICreator/Qiita-1.07M huggingface dataset:
AWS IoT MQTT接続のprefix設定

# はじめに
同一AWS アカウントでIoT MQTTコネクションの管理を分けたいことがあるのですが、あまり情報が無かったので記事にします。
IoT Ruleでサービス毎にコネクションのサブスクライブすることをゴールとします。

# MQTTコネクション
AWSからAndroid SDKが出ているのでそちらを使用しています。
Androidで接続する場合、MQTT接続する際に[AWSIotMqttManager](https://aws-amplify.github.io/aws-sdk-android/docs/reference/com/amazonaws/mobileconnectors/iot/AWSIotMqttManager.html)を定義します。

```kotlin
public AWSIotMqttManager(String mqttClientId, Region region, String accountEndpointPrefix)
```

regionとaccountEndpointPrefixは固定なので、こちらで好きな値を入れることはできません。

mqttClientIdに一意なIDを入れ、AWS IoTのMQTTテストクライアントでテストします。
$aws/events/presence/connected/+でサブスクライブし、AndroidからMQTT接続を行うと接続情報が取得できます。
![mqtt_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50919/46900c64-2452-7466-4ca8-e208bb164cc0.png)


# prefix付MQTTコネクション 
mqttClientIdにprefixを付けます。
```kotlin
var mqttClientId = "test/${id}"
```
$aws/events/presence/connected/test/+でサブスクライブし、MQTT接続します。
ちゃんと取得できてます。
![mqtt_connect_prifix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50919/7370aa92-6d3f-6252-b802-a34641486eaf.png)


$aws/events/presence/connected/+の方には出てきませんでした。
mqttClientIdにprefixを付けることでサービス毎にコネクションの管理ができそうですね！

# 補足
mqttClientIdはIoT CoreのDevice IDを入れると後々どのデバイスの接続情報かわかるのでおすすめです。
2分で分かるAnsible

# Ansible入門
* 手動で実施は大変です。
![Ansible - 01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/e861a3b5-5fc5-4d3c-a1ab-10316ed17909.jpeg)

* Ansibleなら一括変更出来ます。
![Ansible - 02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/acccee42-3a27-b1db-996e-db9a3bee6db2.jpeg)

* 構成管理自動化ツールの1つで下記のような特徴があります。
![Ansible - 04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/351aa837-5a27-d0c0-4692-c3b544077e4d.jpeg)

* 冪等性は重要です。
![Ansible - 05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/eee86424-b7fc-3d23-e073-dbc84e510dfe.jpeg)

* 無償版およびサポートがついた有償版があります。
![Ansible - 06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/fec69daa-007e-daa4-370a-290e1e91aa2c.jpeg)

* Bootstrap領域も出来ますがTeraformやAWS CDKの方が扱いやすいと思います。
![Ansible - 07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/429030a6-7d39-ce66-d5c0-b9854f9d2229.jpeg)

* 実行対象（インベントリ）と実行内容（Playbook）を書きます。
![Ansible - 08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/18ac9550-61e6-6503-1743-879d0390673c.jpeg)

* 両方のノードにPythonが必要です。
![Ansible - 09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/58115463-312f-7cf8-7ba1-5bf9902d116b.jpeg)

* JOB管理に便利です。（定期実行、結果の確認・通知など）
![Ansible - 10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/cb6b874c-1ee8-0f61-0625-115a16db2250.jpeg)
Fastifyを簡単に使ってみる

## Fastifyって何？

Node.jsのWebフレームワーク。expressと書き方がとても近いが、より高速なレスポンスを行う。Node.jsフレームワークの中でも特にパフォーマンスが高いとされている。



https://www.fastify.io/docs/latest/Guides/Getting-Started/

## 導入

```
npm i fastify
```

## 動かしてみよう

以下は公式のサンプルコードにPOSTを付け足したもの。

```ts:index.ts
import Fastify from 'fastify'
const fastify = Fastify({
  logger: true
})

fastify.get('/gets', function (request, reply) {
  reply.send({ hello: 'world' })
})

fastify.post('/posts', function (request:any, reply) {
    console.log(request.body);
    reply.send({ id: request.body.id})
  })

fastify.listen({ port: 3000 }, function (err, address) {
  if (err) {
    fastify.log.error(err)
    process.exit(1)
  }
})
```

```
ts-node src/index.ts
```

で動かす。
## curlで確かめてみよう

curlを用いてこれらGET, POSTが動いているか確かめてみる。

### GETを試す

```
curl -X GET localhost:3000/gets
```
これで以下の値が帰ってくればOK。
```
{"hello":"world"}
```
### POSTを試す

```'{"id":"3", "name":"testname"}'```というオブジェクトを送ってみる。

```
curl -X POST -H "Content-Type: application/json" -d '{"id":"3", "name":"testname"}' localhost:3000/po
sts
```
以下のような値が帰ってくる。
```
{"id":"3"}
```
また、```index.ts```を起動しているサーバーを見てみると、以下のような出力が出ている。

```
{ id: '3', name: 'testname' }
```

値がちゃんと受け取れていることが確認できた。
ポート解放の仕方。（Cloud9 でdjango使用。)

現在の状況。。。
![スクリーンショット 2022-06-29 9.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1314502/70e2cffd-0f5f-4207-0758-bb42f8226388.png)
djangoをインストールして、アプリサーバーを起動し、動作確認をしようとしていたところ。

こうしても、まだ動作を確認できないらしい。

#### ポートを解放しよう！

セキュリテイグループを設定してポートを解放！
> １．とりあえず、実行中のインスタンスの一覧までいく。

名前がcloud9から始まるインスタンスを選択して、開始していない場合は開始する。

> ２．（例）「http://」文字列「：8000」

詳細を見ると、「パブリック IPv4 DNS」に表示されている、文字列。
この文字列の前後に「http://」「：8000」をつけてください。
（例）「http://」文字列「：8000」


> ３セキュリテイグループの設定

詳細に書かれているセキュリテイのタブを選択して「セキュリティーグループ」をクリック。
すると、セキュリティグループの設定画面が開かれる。

> ４インバウンドを編集

インバウンドルールを選択して、「ルールを編集」ボタンを押し、編集画面にいく。

> 5 インバウンドルールを追加

![スクリーンショット 2022-06-29 9.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1314502/adb002c6-6cbd-1466-b851-5763136f9831.png)

ルール追加を選択して、以下のように選択して保存ボタン
タイプ：カスタムTCP
プロトコル：TCP
ポート範囲：8000


これで一度
「http://」文字列「：8000」
にアクセス！

すると無事にアクセスできました！
テキストファイルの文字コードを変換する

### 環境
Ubuntu 20.4 + Vagrant(Windows10)
Node.js v16.14.0

### はじめに
テキストファイル（CSVファイルなど）の文字コードを判断して、S-JISであれば、UTF-8に変換する関数の紹介です。プラットフォームがWindows10であるため、Vagrant環境で動作しているUbuntuとファイルのやり取りがよく発生します。つまり、Windows環境で作成した、S-JISのファイルを、Ubuntu環境で扱うために、UTF-8にいちいち変換しなくてはいけないことになります。それを、Node.jsでサクッと行えるようにしたので、そのご紹介です。

### 解説
２つの外部ライブラリを使っています。**jschardet**と**iconv-lite**です。この２つのライブラリは、**npm**で別途インストールする必要があります。**jschardet**はファイルの文字コードを判断するライブラリで、**iconv-lite**はファイルの文字コードを変換するライブラリです。

**jschardet**でファイルの文字コードを判断して、S-JISであれば、**iconv-lite**を使ってUTF-8に変換しています。

**fs**はテキストファイルを読み込んだり、書き込んだりするときに使われるライブラリです。Node.jsに標準で組み込まれているため、別途インストールする必要はありません。

引数には、変換対象のテキストファイルの保管場所をパス付で渡します。文字コードの変換は、S-JISからUTF-8への変換のみです。元々、UTF-8であった場合は、何も行わずスルーさせます。文字コードが、S-JIS、UTF-8以外であった場合は、エラーメッセージをコンソールに表示します。

文字コードの変換が行われた場合、ファイル名の末尾（拡張子の前）に「_utf」を付けた新しいファイルをUTF-8で作成します。

ファイルの文字コードがUTF-8の場合、jschardetは「UTF-8」で返す場合と「ascii」で返す場合とがあります。どちらにも対応できるようにしています。


### コード

```Node.js
function check_utf_file(file) {

    var fs = require('fs'), fd;
    var jschardet = require('jschardet');
    var iconv = require('iconv-lite');
    var msg, data;
    var filn = file.replace('.', '_utf.');
    var text = fs.readFileSync(file); 
   
    switch (jschardet.detect(text).encoding) {

        case "ascii": 
            return 0;
        case "UTF-8":
            return 0;
        case "SHIFT_JIS":
            fs.writeFileSync(filn, "");
            fd = fs.openSync(filn, "a");

            data = iconv.decode(text, 'ms932');
            fs.writeSync(fd, data, 0)
            fs.closeSync(fd);

            msg = "ファイルはS-JISです。UTF-8に変換したファイルを作成しました"
            console.log(msg);
            return 1;
        default:
            msg = "文字コードは" + jschardet.detect(text).encoding + "です。S-JISでもUTF-8でもない文字コードです"
            console.log(msg);
            return -1;
    }
}
```
C#ファイルIOチートシート


```c#
using System.IO;

var str = "Hello \n World";
var path = "./a/a.txt";

// 作成
File.Create(path); // 存在すれば上書き(内容消える) フォルダ無いとエラー
Directory.CreateDirectory("./a/b/c/");   //なければ再帰的に作成

// 読込
var t = File.ReadAllText(path);  // 文字列として
var lines = File.ReadAllLines(path);  // 文字列リストとして
foreach(var s in lines){
  //...
}
// streamで (usingで自動クローズ)
using(var f = new StreamReader(path)){
  while(f.ReadLine() is {} s){
      Console.WriteLine(s);
  }
}

// 書き込み(ファイルがなければ作成される)
File.WriteAllText(path, str); // 文字列を
File.WriteAllLines(path, strList);　// 文字列リスト・配列を
// streamで (usingで自動クローズ)
using(var f = new StreamWriter(path, false)){// trueで追記(Append)可能
  file.WriteLine(str); //など
}
// ※(いずれも引数でエンコード Encoding.UTF8 等指定可)

// 存在チェック
if(File.Exists(path)) //...
if(Directory.Exists(dir)) //...
```

以上
「完全に理解した」状態の僕が「チョットワカル…」になるまでのとある企業の新人研修 part.3

▼part1こちらから▼
https://qiita.com/kobayashimakoto/items/4fe942815c7fc941821f

▼part2こちらから▼
https://qiita.com/kobayashimakoto/items/ca131b8fbe8007a18f00

こんにちは
part2でご紹介した、~~社内でのボッチ生活を解決する~~ サービス　**TeaTime**　についてのお話です。

リリースして困ったことや、実際に運用してみてどうだったのかをご紹介します。

# そもそもTeaTimeって？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/654ccc04-4980-aa6b-d197-c387034e71fd.png)
ざっくり言うと、アプリに登録さえしといたら、
登録者の間でいい感じにお茶会をセッティングしてくれて
そのお茶会に参加することで、**仲良くなれる機会を得る**というサービスです。

▼作った時の話はpart2をご覧ください。▼
https://qiita.com/kobayashimakoto/items/ca131b8fbe8007a18f00




# リリース時に大トラブル発生！！
### リリース当初は思った以上にバグる

手動テストもそれなりに行ったつもりだったのですが、**リリースした直後にバグりました**（笑）。
理由はユーザーの名前の長さが制限を超えたため。（DBの設定が甘々）

先輩曰く、**開発者は「バグらせない達人」になってしまいがち**なので
第三者に触って感想をもらうのが一番とのこと。

いきなりオフィス全域で展開するのではなくて、まずは一つの部署で試運転をしてみる
という動きが取れれば良かったと反省しています。

### ログを見ないとダメだ

アプリ本番リリース

テンションは最高潮に達した・・・

そしてその夜
<img width="500" alt="teatime.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/814a2767-df8e-09d4-b4e6-36987e38a021.png">

**やっべ・・・　5分ごとにユーザーにメッセージいっとるやん・・・**

もう大慌て
何が原因なのか、バッチを回しているコードを穴が開くほど確認してもその原因がわからない。
焦り散らかしている時に先輩からの啓示

**「ロ・グ・み・た・？」**

本番サーバーのログを確認すると、**バグっていない！**

もしやと思いステージングサーバーのログを見ると、
ワラワラと原因らしきログが見つかりました。

TeaTimeでは
・お茶会の自動生成
・お茶会のご案内
・お茶会のリマインド
などの処理ごとに、ユーザーへメッセージが送信されます。

ステージング環境では、その時間差処理をいちいち待っていられないので
**各処理間のインターバルを5分で設定しました。**
そしてステージングでは開発者にしか通知が届きません。
**ステージングのメッセージを本番のものだと勘違いしてしまった**のがことの本末です。

「事件は本番で起きてるんじゃない、ステージングで起きてるんだ！」というやつでした。

ここから学んだことは、**現状を把握する**ことだと思っています。

実際に起きていることと、システム上で起きていることは必ずしも一致するとは限りません。
「リアルで起きている事象は、サーバーでも起きているのかどうか」を確認することが
問題解決の第一歩なのだと反省することができました。

# 運用してみてどうだった？
~ **割と楽しかった** ~
絡んだことのない部門の方と面識が持てるだけで、職場の雰囲気って良くなると感じました。
誰とも面識がない状態で働くよりも、ある程度知っている同士で働く方が個人的にはいいなと感じます。
結論：社内交流はやっぱりあった方がいい！

~ **コミュ障にはハードルが高い** ~
このサービス、お茶会を開いてくれるだけで、会話のサポートはしてくれないんですぅ（涙）。
「初対面で何話したらいいねん」状態に陥らないように、[トピッカー](https://apps.apple.com/jp/app/topickr-%E4%BC%9A%E8%A9%B1%E3%83%8D%E3%82%BF%E3%82%A2%E3%83%97%E3%83%AA/id1465907079)のように話題提供機能が
あってもいいかもと思いました。
~~自分がコミュ障なんだから開発初期で気づけ!~~



~ **お茶会が想定よりも開催できていない** ~
システム上、お茶会に招待されても、その招待を断ることができます。
また、「参加する」と意思表明しないとそのお茶会では欠席になってしまいます。

この **意思表明をしていない人は参加者の50％** になりました。

意思決定権をユーザーに渡してしまうと、高確率で忘れてしまうか、
参加しないという結論になってしまうのではないかと思っています。

お茶会に参加してくださったユーザーは「社内の輪を広げたい」と強い意思を持っていました。
そうでない人達にとっては使いにくいアプリだったかもしれません。
「なんとなく使ってみたい」というユーザーのことを考えていなかったのです。

もっとユーザーの特徴を深掘りし
**誰の、どんな問題を解決したいのか** をもっと落とし込むべきだったと思いました。

# まとめ　研修を通じてよかったこと
part1~3 に及ぶとある企業の新人研修はこれにて終了にしたいと思います。
個人的には、実りの多く、そして楽しい研修だったと思います。

### 楽しい研修であること
「楽しい」って超超重要ですよね。
一人で本に書いてあることをそのままコピペしてた時は
そんなに「プログラム」が楽しいって思えなかったです。
実際に運用されるためのアプリを、自分達で意思決定して作るのは楽しかったです。
ひかれたレールを走るだけではなく、時にはレールを修正できるのでは、気持ちの
持ちようが全然違いました。

### マーケ視点も取り入れることができたこと
実際に運用までを想定して作ったからこそ、視座が変わったのを感じます。
機能を実装する際にも、「それは価値があることなのか？」を否応なく考えさせられました。
技術力が高いことももちろんですが、「どうすれば現実の問題を解決できるのか」を
考えることも重要だと認識できました。

### アプリを作り切った自信に繋がること
実際にアプリ開発はしたことがなくても、「グーグル先生に聞けばある程度書ける」
という成功体験を積むことができました。

--

ここまで読んでいただいてありがとうございました。
「面白そうだな」と思っていただけると嬉しいです。

ぜひ、新人研修として導入してみてください。
オブジェクトが無くてもFPSが20まで落ちるURPの設定についての備忘録

タイトルの通りですが、複数人で開発していると自分が知らないところでUniversal Render Pipeline(URP)の設定が変更されていて、
久しぶりにMeta Quest実機でビルドしたらFPSが20台まで低下していたので、その原因についての備忘録です。

プロファイラーを見ると描画系が重い事が分かったので、背景をすべて削除して実機で確認してもFPSが低下したままで、非常に悩みました。

今回発覚した原因は以下の個所から確認できます。
各所のファイル名は任意に付けられるものですが、
Assets→Create→Rendering→Universal Render Pipeline→Pipeline Asset(Forward Renderer)
でデフォルトでつけられている名称で表記しています。

![Assets_Create_Rendering_URP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126821/99e13582-4c09-b2f1-eba5-b427f7ccb528.png)



ProjectSettings→Quality→Renderingに先ほどの手順で作成できる「UniversalRenderPipelineAsset」がアタッチされています。
![ProjectSettings_Quality.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126821/16198200-fcef-a405-cb83-f4ad16190520.png)

「UniversalRenderPipelineAsset」のGeneral→RendererListに「UniversalRenderPipelineAsset_Renderer」がアタッチされています。

![Universal Render Pipeline Asset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126821/616ab900-d33e-016f-7fe9-eed160b0fdda.png)

この「UniversalRenderPipelineAsset_Renderer」の下にある「Add Renderer Feature」を押して、「Screen Spacce Ambient Occlusion」を追加すると、

![AddRendererFeature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126821/a1aff635-d1fc-caaf-e58f-852edd996bb8.png)

以下のようにデフォルトで「New Screen Space Ambient Occlusion」という名前でRenderer Featuresが追加されます。

![UniversalRendererPipelineRenderer_NewScreenSpaceAmbientOcclusion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126821/7ef4d3fd-49c3-881e-0a45-c11afeddc098.png)

このScreen Space Ambient Occlusionがとにかく重く、FPSが低下する原因になっていました。
設定の変更で軽くする事はできるかもしれないですが、ひとまずこれを無効化する事で対応しました。

設定を見直す対応をするのであれば、Unity公式の以下のページが参考になるはずです。
[Ambient Occlusion](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@10.0/manual/post-processing-ssao.html#:~:text=The%20Ambient%20Occlusion%20effect%20darkens,effect%20as%20a%20Renderer%20Feature.)


「Unity URP 重い」などで検索をしても既に知っているような情報しか見つけられず、
描画で重いのはわかっていながらもなかなかここにたどり着けませんでした。
最終的には他人のコミットを１つづつ確認していって約1か月さかのぼった所で発見、といった感じでした。

追記：
検証してないので推察ですが、VRだとScreen Space Ambient Occlusionが右目と左目の両方に対して処理が必要なので、2倍のコストがかかって重いのかなと思いました。
顧客の最終利用日と経過日数を求める(SPSS Modeler データ加工逆引き4-5)

# 顧客の最終利用日と経過日数（リーセンシー）

![スクリーンショット 2022-06-28 18.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/353064d5-2260-88e6-5487-78dee1adbaa0.png)

## 1.想定される利用目的

・RFM分析により優良顧客の特定
・顧客の休眠や解約を予測するための特徴量として利用
・設備ログデータから故障予測のための特徴量作成

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/recency.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-06-28 18.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4f2f926b-610a-1f43-498c-6718df40a57b.png)

a.入力するデータは以下の通りです。顧客の行動履歴が時系列に記録されているトランザクションデータです。
![スクリーンショット 2022-06-29 9.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aa71fcd3-256d-4196-2b21-fdaccb0f0fe8.png)

b.[レコード集計]ノードを編集します。記録された利用日の最大値が最終利用日になります。せっかくなので利用金額の合計とレコード数（利用回数）を集計します。
![スクリーンショット 2022-06-29 9.03.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2aee4a58-0ec5-97f4-ac6b-bfeefbf4b102.png)

[プレビュー]します。顧客毎に最終利用日のフィールドが作られました。
![スクリーンショット 2022-06-29 9.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e1ba9dbf-5103-200a-0306-7dc3e8175ad6.png)

c.[フィールド作成]ノードを編集します。データ処理日を[2022-07-01]と仮定して経過日を計算します。関数には[date_days_difference(日付1,日付2)]を利用します。
![スクリーンショット 2022-06-29 9.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/be8ff685-2021-d188-a467-6eb192a7557c.png)

式ビルダーのライブラリから[日付および時間]を探すと簡単に入力できます。
![スクリーンショット 2022-06-29 9.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f1a2c0c9-5042-cfb0-faaa-e5eff1d4450e.png)

[プレビュー]します。完成しました。
![スクリーンショット 2022-06-29 9.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e1fc7c58-3223-1e5a-afeb-edd830065b84.png)

#### [RFM集計]ノードを利用する

d.[時系列]ノードを編集します。該当するフィールドを選択します。
![スクリーンショット 2022-06-29 9.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9032552f-2ab6-d6fb-93da-81d73642b4f4.png)

[テーブル]を実行します。経過日数（リーセンシー）ができています。他にも利用回数（フリークエンシー）と利用金額（マネタリー）も出来上がっています。
![スクリーンショット 2022-06-29 9.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/956e7908-a742-b04e-5cd0-a4f04101d5c4.png)

#### 注意点

利用金額項目がないとRFM集計は利用できないので経過日数だけを得たい場合にはダミーフィールドを作成するかb→cのストリームを検討してください。

## 4.参考情報

#### 2つの日付の列から差の列を作成する

https://qiita.com/416nishimaki/private/a1f93ef531f166e42a29

#### RFM集計とRFM分析ノード

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-9/

https://qiita.com/416nishimaki/items/8c7cd38fb966b4ced05a

https://qiita.com/416nishimaki/items/aef0dd5bfeacd486d29e

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
過去の値を列に展開する(SPSS Modeler データ加工逆引き4-4)

# 過去の値を列に展開（オフセットと時系列加工ノード）

![スクリーンショット 2022-06-28 17.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0f2dc396-680e-4886-fb6d-b830e7c79e02.png)

## 1.想定される利用目的

・需要予測モデルのための特徴量作成
・不正検知や倒産/解約/ランクアップ予測のための顧客行動の特徴量作成
・異常検知や故障予測のための特徴量作成

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/offset.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-06-29 8.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/22801fe3-7235-9f37-fb78-6a4eb11f69cc.png)

a.入力するデータは以下の通りです。[PV]の昨日から3日前までの値を新しいフィールドとして作成します。
![スクリーンショット 2022-06-29 8.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/733335e6-adae-01a0-4022-2521c3ead0f2.png)

b.[フィールド作成]ノードを編集します。列方向に参照するオフセット関数を利用します。[@&#xFFF0;OFFSET(フィールド,1)]でフィールドの値の1行上を参照します。1を−1にすると1行下を参照。
![スクリーンショット 2022-06-29 8.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8dd17e1c-fb35-fbd3-6a6e-587eb712176d.png)

式ビルダーのライブラリから@&#xFFF0;関数を探すと簡単に入力できます。
![スクリーンショット 2022-06-29 8.11.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/82c366fa-b78d-e679-2970-4f2acc40e975.png)

[プレビュー]します。
![スクリーンショット 2022-06-29 8.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0817bb0e-ba30-e0f1-442f-6de1694e39de.png)

c.同じ要領で2日前を作ります。
![スクリーンショット 2022-06-29 8.11.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/16c4ddf4-1fd0-9a43-db9f-d5f127c56851.png)

d.3日前も同様に記述します。
![スクリーンショット 2022-06-29 8.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7c95942e-2b55-7af4-d7de-c8c080de747d.png)

[プレビュー]します。完成しました。
![スクリーンショット 2022-06-29 8.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9990ff4d-d413-ee83-b8c7-59260b301077.png)

#### [時系列]ノードを利用して同時にN日分のオフセットフィールドを作る

e.[時系列]ノードを編集します。スパンを7にして7日分一度に作成します。
![スクリーンショット 2022-06-29 8.13.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3df4e9b5-dbbf-6d4d-1639-361a02ef425b.png)

[テーブル]を実行します。7日分が完成しました。
![スクリーンショット 2022-06-29 8.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/383f739a-2928-a678-ed70-5ef6c7d91fd3.png)

#### 注意点

ニューラルなどを使った特殊なトレンド予測をする場合に[時系列]ノードで将来の値を列に展開する場合があります。この時は降順ソートして作成して時系列加工後に昇順に戻します。

## 4.参考情報

#### オフセット関数を解説した記事

https://qiita.com/kawada2017/items/41e8847b280f35fa9aa4

https://qiita.com/kawada2017/items/1385a5d4a83154792c12


#### 時系列ノード（加工）と機械学習のトレンド予測モデル作成手続き

https://qiita.com/416nishimaki/items/b47d6584ac08f06ab4fa

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
プロパティでHTMLの要素を変更、HTMLの全体構造

# 特定のセレクタだけプロパティをつける
```html
<ul>
  <li class="selected">HTML</li>
  <li>...</li>
  <li>...</li>
</ul>
```
```css
.selected {
  color: #ff0000;
}
```
htmlに```class```をつけることによってそれだけをスタイルをつける対象にできる。
cssはクラス名を書きスタイルをつける。その場合は```.selected```のように先に```.```をつけなければならない。

## プロパティ
要素の見た目や役割を変えることができます。
出典 https://web-camp.io/magazine/archives/84609

# HTMLの全体構造
## ```<html>```要素
HTML 文書においてルート (基点) となる要素 (トップレベル要素)
ルート要素とも呼ばれます。他のすべての要素は、この要素の子孫として配置しなければなりません。

## ```<head>```要素
・文書に関する機械可読な情報 (metadata)、たとえば題名、スクリプト、スタイルシートなどを含みます。
・文章全体の情報を定義するためのタグです。例えば、ページのタイトルや言語、ページを書いた人の情報などを定義します。

出典 https://it-biz.online/web-design/head/#toc1
・　ブラウザに表示されない

### ```<meta>```要素
文字コードの指定を指定する
### ```<title>```要素
ページのタイトルを指定する
### ```<link>```要素
cssの読み込みに使われる
#### ```rel```
ファイルとの関係性を指定
出典 https://saruwakakun.com/html-css/basic/link-rel
#### ```href```
そのファイルがある場所（URL）を指定
出典 https://saruwakakun.com/html-css/basic/link-rel

## ```<body>```要素
・HTML 文書のコンテンツを示す要素です。 <body> 要素は文書中に一つだけ配置できます。
・HTML文書のコンテンツ・内容を示す要素

出典 https://style.potepan.com/articles/20496.html#:~:text=body%E3%82%BF%E3%82%B0%E3%81%A8%E3%81%AF%E3%80%81HTML,%E3%81%AB%E8%A8%98%E8%BF%B0%E3%83%BB%E9%85%8D%E7%BD%AE%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

### ```<!DOCTYPE html>```
正確に言えばHTMLのタグではありません。
文書の解釈に使うDTDを宣言
「DTD」とは「Document Type Definition」のことで、「文書型の定義」を意味

出典 https://html-coding.co.jp/annex/dictionary/html/doctype/
WWDC2022で発表されたSwiftUIで使えるハーフモーダルを少し調べた


## まえがき

2021年のWWDCでUIKitでハーフモーダルが発表され、
SwiftUIでも欲しい、、、！

自作したり、
PartialSheet　https://github.com/AndreaMiotto/PartialSheet
を使っていたりしましたが、
公式にiOS16から出たので、どんなものか軽く調査していきます。


``` swift
struct ContentView: View {
    @State var showModalSheet = false

    var body: some View {
        Button("シートを開く") {
            showModalSheet = true
        }
        .sheet(isPresented: $showModalSheet) {
            ZStack {
                Color.gray.opacity(0.3)
                Text("test")
            }
            .presentationDetents([.height(100), .fraction(1)])
        }
    }
}

```

.sheetの中のViewに

``` swift
func presentationDetents(_ detents: Set<PresentationDetent>) -> some View
```

をつけるだけのようです。
引数のデテントdetentは戻り止めという意味で、留め具的な意味のようです。

``` swift
static let large: PresentationDetent
```

高さが画面一杯のデテント。

``` swift
static let medium: PresentationDetent
```

画面の半分の高さのシートのシステムディテントです。
カスタム デテントを作成する

``` swift
static func custom<D>(D.Type) -> PresentationDetent
```

高さを計算したカスタム デテントを作成します

``` swift
static func fraction(CGFloat) -> PresentationDetent.
```

指定された分数の高さを持つ、カスタム デテン です。
0.5と指定すれば、画面の半分
0.1と指定すれば、画面の1/10　表示されます

``` swift
static func height(CGFloat) -> PresentationDetent.
```

指定された高さのカスタム デテントです。

## あとがき

一回使ってみようかとおもいます、
デザイン周りの設定がないんでしょうか。
ちょっと探しましたが見つかりませんでした

PartialSheet　https://github.com/AndreaMiotto/PartialSheet
のように細かい設定ができれば良いんですが。

## Reference

presentationdetents(_:)
https://developer.apple.com/documentation/swiftui/asyncimage/presentationdetents(_:)

PresentationDetent
https://developer.apple.com/documentation/swiftui/presentationdetent
低画質を良くする！　機械学習モデルでノイズ除去、超解像、コントラスト補正、低照度補強

# 低クオリティの画質を上げたい！
撮影状況によって、画像に問題がある場合があります。

ノイズ↓
<img src="https://user-images.githubusercontent.com/23278992/176293658-6715e545-fe9b-4b21-b374-1394740efdde.png", width=400>
低解像度↓
<img src="https://user-images.githubusercontent.com/23278992/176276244-93535414-bc0e-423d-9c0a-18ba432391a4.jpg", width=400>
低コントラスト↓
<img src="https://user-images.githubusercontent.com/23278992/176286891-563c92cd-1817-406a-babb-7dd9b0cccc01.jpg", width=400>
低照度↓
<img src="https://user-images.githubusercontent.com/23278992/176283269-145a5ce4-709a-4eea-91a7-b924b598a03d.jpg", width=400>


# 機械学習でいろんな問題を解決！

MIRNetv2は、
ノイズ除去、超解像、コントラスト補正、低照度補強
ができます。

https://github.com/swz30/MIRNetv2

ノイズ↓
<img src="https://user-images.githubusercontent.com/23278992/176293658-6715e545-fe9b-4b21-b374-1394740efdde.png", width=400> <img src="https://user-images.githubusercontent.com/23278992/176293741-dc77831a-86d0-4bdc-a667-96d318d064c4.png", width=400>


低解像度↓
<img src="https://user-images.githubusercontent.com/23278992/176276244-93535414-bc0e-423d-9c0a-18ba432391a4.jpg", width=400><img src="",width=400> <img src="https://user-images.githubusercontent.com/23278992/176276266-75228905-2266-4c2c-b42a-026803a0da3b.jpg", width=400>
低コントラスト↓
<img src="https://user-images.githubusercontent.com/23278992/176286891-563c92cd-1817-406a-babb-7dd9b0cccc01.jpg", width=400><img src="",width=400> <img src="https://user-images.githubusercontent.com/23278992/176296935-bce82abf-6420-43ae-924e-5b98ee956431.jpg", width=400>
低照度↓
<img src="https://user-images.githubusercontent.com/23278992/176283269-145a5ce4-709a-4eea-91a7-b924b598a03d.jpg", width=400><img src="",width=400> <img src="https://user-images.githubusercontent.com/23278992/176283354-c45a6247-b1c2-43f8-8b43-8fcf0ddac64f.jpg", width=400>

# MIRNetv2の使い方

公式Colabデモ

https://colab.research.google.com/drive/1HN9Sd8UEqB1k_O8RpdRLL8ZUKcxh5LP8?usp=sharing

セルを実行するだけで使えます。

# MacやiOSで簡単に試す

CoreMLモデルを以下からダウンロードし、画像をドラッグ&ドロップすると使えます。

https://github.com/john-rocky/CoreML-Models#mirnetv2

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
【Rails】Rubocopのアップデートとrubocop-rails_configの導入

## はじめに
未経験からエンジニアに転職して、3ヶ月ほど経つエンジニアです。
業務にあたりながらも、小規模なアプリを作って楽しんでいます。

今回はRubocopのアップデートで学んだことを残しておこうと思い、記事を書きます。

## rubocop-rails_config の導入
https://github.com/toshimaru/rubocop-rails_config

こちらがrubocop-rails_configというgemです。

> 「何かしらRuboCop設定のレールが欲しいよね〜」というところで閃き、「だったらrailsチームの用意した公式rubocop.ymlを使えばいいじゃない」ということで冒頭のRailsとほぼ同じ設定を持ったrubocop-rails gemを作りました。（https://blog.toshimaru.net/rubocop-rails/）

このgemを使用することで↓の設定とほぼ同じrubocop.ymlファイルが作れるというものです！

https://github.com/rails/rails/blob/main/.rubocop.yml


## なにが嬉しいのか
- rubocopをレールに乗せて使用できる（可能性が上がる）
- チームごとの設定を決める時間を短縮できる
- Railsのアップデートを比較的安全にできる

私の場合は3つ目がこのgemを採用する主な理由となりました。
railsのアップデート作業の前にrubocopの設定を整えました。
**大元のrailsと同じrubocopの設定を使用すれば、予期せぬバグを減らすことができるだろう**という見込みです。

## rubocop のアップデート
私がrubocopをアップデートするときの手順を紹介します。
誰かの参考になれば嬉しいです。

### バージョンアップの手順
1. gem: rubocop-rails_configをインストール
2. gem: rubocop を最新にアップデート
3.  $ rubocop を実行（auto-correct しないよう注意）
4.  結果を参照する
5.  correctable が付いているcopを検索して、設定の内容を把握する
6. railsのリポジトリを見て、railsではどう設定されているのか確認する
7. 自分のレポジトリに反映させて、auto-correct するか検討する
8.  RuboCopの警告をコメントで無効化する方法などを検討して、必要ないコップは除外する(参考：https://qiita.com/tbpgr/items/a9000c5c6fa92a46c206)
9. 上記を繰り返して必要な部分だけauto-correct して反映させる
10.  最後に、スペックを実行する
11.  テストのカバレッジを確認する

このような手順で1つずつ慎重にアップデートしました。
大元のrailsの設定と自分のプロジェクトの設定で齟齬がある場合は、下記のように個別に設定を上書きしていくことになります。(4~8あたりの部分でやります)

~~~
Layout/EmptyLinesAroundAccessModifier:
  Enabled: true
  EnforcedStyle: around
~~~

### 留意点(rubocop コマンド実行時)
RuboCop 0.87からの変更点です。
**結論↓を実行するのが安全です。**
~~~
$ rubocop -a 
~~~

~~~
$ rubocop -a 
$ rubocop --auto-correct
~~~

↑を使った場合に、自動修正を備えたすべての Cop が適用されていました。
つまり、安全に修正できない可能性があるコードまで自動修正されていました。

RuboCop 0.87以降では、安全に修正できる（Safeのみ）コードのみが自動修正されるようになりました。
つまり RuboCop 0.59 で導入された rubocop --safe-auto-correct が自動修正のデフォルトになったということです。

unsafe なコードも自動修正したい場合は↓をすればOKです。
~~~
$ rubocop -A
$ rubocop --auto-correct-all
~~~

参考：（https://koic.hatenablog.com/entry/rubocop-safe-autocorrect-by-default）


**さらに、RuboCop 1.30 で非推奨になった自動修正オプションがあります。**
>RuboCop 1.30 で、自動修正する際のオプションである --auto-correct と --auto-correct-all は非推奨になり、それぞれ --autocorrect と --autocorrect-all になりました。
>安全な自動修正
rubocop -a
rubocop --autocorrect
安全でない自動修正
rubocop -A
rubocop --autocorrect-all

参考：（https://koic.hatenablog.com/entry/change-rubocop-auto-correct-to-rubocop-autocorrect）

**結論↓を実行するのが安全です。**
~~~
$ rubocop -a 
~~~


### 留意点(rubocop ルール追加時)
ルールをバージョンアップと同時に有効化してもよい場合、以下のように設定します。

~~~rubocop.yml
AllCops:
  NewCops: enable
~~~
rubocopの新ルールの適用タイミングについては以下の記事が参考になりました。

>新ルールがデフォルトで有効となるタイミング
ドキュメントによると「メジャーバージョンアップによって保留状態のルールが一括で有効化される」とのことなので、RuboCop1.0リリースのタイミングで有効になると思われます。
なお、1.1以降に追加されるルールは0.82～0.93と同様にペンディングとして追加され、2.0で一斉に有効となるようです。
ですので、この記事は今後も有効な内容となると思われます。

https://qiita.com/ljourm/items/e6691267af176c98cd6b

## 最後に
これで安全にrubocopをアップデートできるのではないでしょうか。
そして、railsのアップデートも比較的安全にできるかと思います。

また、rubocopを最新の状態にすると、
**Rubyのアップデートに伴う新しい記法を提案してくれたりします。**
>概要
Ruby >= 2.6 で `map.to_h` や `collect.to_h` を使って、 `to_h` だけで書けるようなものを探します。
NOTE: `Style/HashTransformKeys` と `Style/HashTransformValues` は、ハッシュキーやハッシュ値のみを変換する場合にもこのパターンを変更します。

今回の記事が誰かのためになれば嬉しいです！
最後まで読んでいただきありがとうございました！
画面のレイアウトの問題

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


縦横のスクロールが発生して使いにくい場合は、ブラウザの表示倍率を変えてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/58a8fd36-d14b-d011-f880-600277439e28.png)


+ [Customise Event Page](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDxsh)

:::note
You can adjust screen size in browser using  ctrl + (minus button)   or  ctrl + mouse scroll then you can see the full form properly.

ctrl +（マイナスボタン）またはctrl +マウススクロールを使用してブラウザで画面サイズを調整すると、フォーム全体が正しく表示されます。
:::
リモートGitリポジトリにあるノートブックを用いてDatabricksジョブを実行する

[Run jobs using notebooks in a remote Git repository \| Databricks on AWS](https://docs.databricks.com/repos/jobs-remote-notebook.html) [2022/5/10時点]の翻訳です。

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

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

リモートGitリポジトリに格納されているノートブックを用いて、Databricksでどのように[ジョブ](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)を実行するのかを学びます。

# なぜリモートリポジトリのソースからジョブを実行するのか？

この機能を用いることで、プロダクションジョブの作成、管理をシンプルにし、継続的デプロイメントを自動化します。

- Databricksで別のリポジトリを作成し、アクセス権を管理し、更新し続ける必要がなくなります。
- プロダクションのリポジトリ上でのローカルの編集や、ブランチに切り替えることによる変更など、プロダクションジョブにおける意図しない変更を避けることができます。
- ジョブ定義プロセスは、リモートリポジトリ上で信頼できる唯一の情報源(single source of truth)を持つことになります。

# 要件

Gitの認証情報をDatabricksに追加する必要があります。[Databricksでは多くのGitリポジトリプロバイダーをサポートしています](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140#%E8%A6%81%E4%BB%B6)。

# Gitの設定

DatabricksがリモートのGitリポジトリに読み書きできるように設定します。

Gitの設定を行うには:

1. サイドバーで**Settings > User Settings**をクリックします。
1. **User Settings**ページで、**Git integration**をクリックします。
1. **Change settings**をクリックします。以降の画面上の手順においては、お使いのGitプロバイダーを選択し、自身のリポジトリにサインインするための認証情報を入力します。

# ジョブの作成

1. サイドバーで**Jobs > Create Job**をクリックします。
1. **Source**では、**Git**を選択し**Edit**をクリックします。

    **Source > Git**では**Type > Notebook**のみがサポートされています。
![](https://docs.databricks.com/_images/create-job-dialog1.png)

1. **Git Information**ダイアログで、リポジトリの詳細を入力します。
![](https://docs.databricks.com/_images/git-information-dialog.png)

1. **Path**には、`etl/notebooks/`のようにノートブックのパスを入力します。

   相対パスを入力する場合には先頭に`/`や`./`を含めず、`.py`のようなファイルの拡張子を含めないでください。

# マルチタスクジョブで次のタスクを追加する

マルチタスクジョブの中にあるノートブックタスクは、以下のいずれかの方法でリモートリポジトリにある同じコミットを参照します。

- `git_branch`が設定されている場合、`$branch/head`の`sha`
- `git_tag`が設定されている場合、`$tag`の`sha`
- `git_commit`の値

マルチタスクジョブにおいては、ローカルのノートブックを使用するタスクとリモートリポジトリを使用するタスクを一緒に含めることはできません。この制限は、非ノートブックのタスクには適用されません。
![](https://docs.databricks.com/_images/run-order-etl-job.png)

# ランの詳細を参照する

それぞれのランごとにコミットは記録され、ランの詳細に表示されます。
![](https://docs.databricks.com/_images/job-run-details-screen.png)

# ジョブを編集する

ジョブの設定を編集するには：

1. サイドバーで**Jobs**をクリックします。
1. ジョブ一覧で、編集したいジョブの名前をクリックします。

   以下のサンプルでは、ジョブ名は`Order_ETL`となります。
![](https://docs.databricks.com/_images/jobs-list.png)

1. **Job details**パネルでジョブの設定を変更することができます。

    - Gitの設定
    - スケジュール
    - 使用するクラスターと設定
    - メールのアラート
    - アクセス権
    - 最大同時実行数

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
STUDIOでGoogleMapを埋め込む

# やりたいこと
ホームページ上に複数のピンを立てたGoogleMapを表示したいと思います。

# 複数ピンの立て方
GoogleMapを開き、マイプレイスからマイマップを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/1b05c0a1-5730-ab2c-b793-6b28b46e9eee.png)

マイマップを開くと検索バーが出てくるので、追加した地点の名前や住所を入力します。
※今回は仙台駅とい五橋駅を追加して、青いピンが立ちました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/4acbc7dc-fad3-1369-6075-a4516ff08cb2.png)

ハンバーガメニューから自分のサイトに埋め込むを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/4a9d59cc-2144-919d-10fd-83dd5f300a49.png)

HTMLタグが表示されるので、コピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/ad4b6391-7d23-1f62-6238-66069a470188.png)

# STUDIOへの組み込み方
まずはiframeからmapsを選択して、画面上に組み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/b67857a2-6c60-9fcd-c1fd-4ab0469f7b47.png)

地図をクリックすると埋め込みコードを入れる欄が出るので先ほど取得したHTMLコードをコピー＆ペーストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/71ab2005-9b01-2d91-b132-02e839d33625.png)

ピンが2個ついている地図がSTUDIOで埋め込めました。
現状見た目がきれいじゃないので、改良する方法がないか探ってみます。
XcodeをXibファイルで起動する!!(Xcode13.4.1)

# はじめに

Xcodeでは通常だとStoryboardを使ってアプリを制作しますが、

・Gitでコンフリクトが発生しやすい
・画面遷移が複雑になりやすい

など、デメリットがあります。

そこで、前途したデメリットを補う方法として、起動時xibファイルを使って起動する方法を紹介したいと思います。
他の記事がXcodeのversionが古いものだったりして、色々と試行錯誤した事もあり、備忘録的に記事に残します。

### 1.Appファイルの作成したら

初期画面は下記の画面になっています。
まずはViewControllerとMainを削除しましょう。
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/25427e54-3b34-f28c-adda-bc54fa58bd04.png)

次にinfoを選択し、**Main storyboard file base name**を削除します。
![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/9c1ac38e-6905-5190-c3c7-29efd278964f.png)

その次はこちらのinfoから**Storyboard Name**を削除します。
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/65e7e30f-d536-9e01-d367-d7dc2b800457.png)

### 2.xibファイルの作成

**⌘ + N**ショートカットキーで新規ファイルを作成します。
**Cocoa Touch Class**で作成して下さい。

![スクリーンショット 2022-06-29 5.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/de87d868-0497-ced8-baf5-e3739a019491.png)
Subclass of: には**UIViewController**を選択しましょう。
また、**Also create XIB file**にはチェックを入れて下さい!!
![スクリーンショット 2022-06-29 5.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/b8e5295a-73dc-dc01-197f-b954b02caadb.png)

### 3.SceneDelegateの設定変更
初期画面を先程作成したViewControllerに設定する為、SceneDelegateにコードを記述していきます。

```swift:SceneDelegate
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let scene = (scene as? UIWindowScene) else { return }
        self.window = UIWindow(windowScene: scene)
        // NavigationController無しバージョン
//        let viewController = ViewController()
//        self.window?.rootViewController = viewController
//        self.window?.makeKeyAndVisible()
        
        // NavigationController有りバージョン
        let navigationController = UINavigationController(rootViewController: ViewController())
        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
    }
```

以上でビルド出来ます!!
Xcodeのversionでやり方が結構変わるので、他のやり方で出来ない場合、一度この方法で試して貰えたらと思います。
30代未経験がPythonで機械学習6ヶ月奮闘した記録

※自分用奮闘記メモです。

## 【きっかけ】
年末に「仕事こんな感じでええんやろか」と思い、
「何か新しいおもろいことはじめたいな」となり、
「そうやデータサイエンスよさそうやん」となる。

##  【現状のレベル】
今でもテーブルデータの扱いしか分からない。。
テーブルデータコンペ出たらそこそこいいとこいける

##  【どやって勉強した】
**①とにかく「毎月1個資格を取る」と目標を定め勉強（半年前）**
「ほーん、なるほどデータサイエンスの領域ってこんな感じなんやな」
と雰囲気をつかみ、基礎力を付けられた。５つくらい資格は取得。

**②途中からPython1本で勉強することを決め、「動画見る・書籍読む・手を動かす」（3か月前）**
SQLとの両立は挫折。結果的によかったかも。
重要なことは、
◆動くコードを書いてアウトプットたくさんすること
◆エラーになったら、根性見せてググって解決すること
◆コードの管理を疎かにしない

**③コンペ出場前練習（2か月前）**
Tytanicで練習（分類）
House Priceで練習（回帰）
回帰と分類の両方を経験。
重要なことは、
◆コピペでいいんだけど、
◆1個でいいから自分なりの工夫ポイントを作る

**④コンペ本出場（1か月半前）**
自分が楽しそうと思うコンペを選ぶ
重要なことは、
◆サブミットできない、と諦めない
◆精度がよくならない、と諦めない
◆先人のコードをめちゃくちゃ頑張って読む

## 【お世話になった書籍・動画】
Udemyに上がっている動画はほぼすべて視聴
書籍もほぼ目に留まったものはほぼ読んだけど、実際に繰り返し読むのは「読みやすい」書籍だけ
※有名な専門的な書籍も買ったけど理解できない。我慢できない。

## 【コンペってこういうことか】
①ベースモデルをまずはとにかく作り
②特徴量エンジニアリング頑張り
③パラメータいじいじ
…たぶんこういうことじゃない。

楽しくもあり、地味でもあり、まあ結論めちゃくちゃはまった。

##  【２度と会いたくない骨の折れたトラブル】

**突然Jupyter Notebookが激重になる。**
ググると結構陥っている人もいることを発見。
理由は、たくさんあるみたいで、その分解決するのも結構骨が折れるみたい。。
私の場合はおそらく、pip installがうまくいかなかったことによる不具合だったようです。

もう2度となってほしくない。

## 【所感】 ##
数ヶ月でも成長感あって勉強楽しい。
Kubernetes完全ガイドのcentos周りのコマンドのメモ

[Kubernetes完全ガイド（初版）](https://www.amazon.co.jp/dp/B07HFS7TDT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)において、centosとdig周りのコマンドがうまくいかなかったのでメモです。（第二版では解決されているかもしれませんが、一応。）

```
kubectl run --image=centos:6 --restart=Never --rm -i testpod -- dig sample-externalip.default.svc.cluster.local CNAME
```

ただ（少なくとも自分の環境では） `centos:6` がpullできないので、`centos:7`をpullしてくる必要があります。ただ、`centos:7`をpullすると今度はdigコマンドが入っていない問題にぶちあたります。

以下のコマンドで解決できます。

```
k run --image=centos:7 --restart=Never --rm -i testpod \
-- bash -c "yum -y install bind-utils && dig sample-externalip.default.svc.cluster.local"
```

結果は以下のようになります。

```
...（略）...

Complete!

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> sample-externalip.default.svc.cluster.local CNAME
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3795
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sample-externalip.default.svc.cluster.local. IN	CNAME

;; AUTHORITY SECTION:
cluster.local.		30	IN	SOA	ns.dns.cluster.local. hostmaster.cluster.local. 1656433610 7200 1800 86400 30

;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Tue Jun 28 16:37:18 UTC 2022
;; MSG SIZE  rcvd: 165
```
FlutterアプリをiPhoneの実機で起動する(VSCode)

## 概要
VSCodeでカキカキしてるFlutter Projectを実機で動かすのに手こずったのでメモ
私の場合は下記の3つをどうにか直したら動きました

* Xcodeでサインインする
* iPhoneでアプリを開いたときに"信頼されていないデベロッパ"と出るのを解決する
* リリースモードで実行する(PCに繋いでなくても使えるようにしたい人だけ)


## Xcodeでサインイン
下のようなサインアップしろ的なエラーが出る
```
Exception: No development certificates available to code sign app for device deployment
```
開発中のフォルダを開いた状態でVSCodeからターミナルを開き、下記を実行する
```
open ios/Runner.xcworkspace
```

![スクリーンショット 2022-06-29 1.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/e5ccdb04-7461-a7c9-a67a-1b6de82e1168.png)

しばらく待つと、XCodeがどこかで開いている
左タブのRunnerを選択
右画面で、上方タブのSigning&Capabilitiesを選択
「Team」を追加し、サインインを求められるのサインインする
「Bundle Identifier」をわかりやすい一意な名前にしておいて終わり
![スクリーンショット 2022-06-29 1.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/5ce70379-a430-2e62-04cd-5d0b0b270af1.png)

## iphoneで信頼されていないデベロッパと出るのを解決する
Xcodeから実行したときに、実機でアプリを開くと、「信頼されていないデベロッパ」とでる
![IMG_7315.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/656048e7-dc18-90d7-7039-09e117e7f320.png)
下記の記事を見て解決した
https://qiita.com/nonkapibara/items/d14c796ca69c8a4e58d2



## リリースモードで実行する(PCに繋いでなくても使えるようにしたい人だけ)

実行すると下記のエラーがアプリを開くと表示されちゃった
![IMG_7319.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/f8d6a6a2-1053-f401-a7f1-74fdee6539e7.jpeg)


どうやらリリースモードで実行しないとできないよ〜〜ってことらしいのでリリースモードで実行しちゃう。

デバッグメニューの右上の歯車アイコンを押す

![スクリーンショット 2022-06-29 1.47.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/e2da3a7c-8071-f6c5-3800-bf0eb5fabf92.png)

すると自動でlaunch.jsonが出来上がってくれる
その中にリリースモードと名のついているものがあるので、それを選択して実行
![スクリーンショット 2022-06-29 1.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/11bd5e18-b5da-a028-9595-195b9240aef7.png)

実機にインストール終わるまでは、iPhoneをロック解除しっぱなしにしないと、私は失敗するので、開けっぱにしておいた方がいいかもです
VSCodeのターミナルでショートカットキーが突然効かなくなった

何気に詰まったので、個人的な備忘録です。

# 環境
- PC: MacBook Pro (Intel Core 2016)
- OS: macOS Montery12.4
- Visual Studio Code: 1.68.1

# 現象
VSCodeのターミナルを開いて、行を削除するショートカットキーの `ctrl + K` を押しても、機能しない

# 解決した方法
- Code > Preferences > Keyboard Shortcuts をクリック
![Screen Shot 2022-06-29 at 1.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/55eaa1b7-bb9f-dcad-e62c-80c1d46140b6.png)

- 「workbench.action.terminal.clear」で検索して、`Terminal: Clear` をダブルクリック
![Screen Shot 2022-06-29 at 1.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/9caf28f6-05eb-8ed0-802f-68cada97bc2e.png)

- ctrl を押しながら K を押して Enter
![Screen Shot 2022-06-29 at 1.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/5b2db23a-438e-b8cf-b444-8508aac6f3e9.png)

- 設定ができたら、再度VSCodeのターミナルを開いて、 `ctrl + K` を押してみる

筆者の環境では、上記で解決できました。

# 参考
https://stackoverflow.com/questions/66301506/pressing-ctrl-k-doesnt-delete-characters-in-vscode-terminal
VSCodeとgitを連携させてみるときに躓いた話。

Gitの初心者の方がVScodeを用いてgitHubとの連携に躓いていたので
一緒に解決した時の健忘録になります。

# VSCodeとgitの連携（ソフト側の設定）

環境はWindows。

https://gitforwindows.org/

まずはGitをDL。
VScodeもDLします。

VScodeのターミナルでgitのコマンドいれてもなんもならないよー！とのことで

```
git : 用語 'git' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正し場合はその
発生場所 行:1 文字:1
+ git congfig
+ ~~~
    + CategoryInfo          : ObjectNotFound: (git:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```
このようなエラーが出たので、Vscodeにgitのpathをとおしてやります。
（VSCodeがgitの場所を認識していなかったということ）

VSCodeの左下の歯車から設定を選択。上の設定の検索に
```
git path
```
を入力し
setting.jsonを編集をクリックします。

出てきたファイルの
```
"git.path": ""
```
""のとこに、gitをインストールしたパスを記載します。

ex: C:\\Program Files\\Git\\cmd\\git.exe

※私のVSCode君は入れ直ししたために制限モードとやらが発動してて、拡張機能にgitがいなくて困りました。。
ワークスペースの信頼をしてあげてください。
https://reject.tokyo/remove_vscode_trust_mode/

これでgitコマンドが通るようになるはずです。

# VsCodeでgitHubにファイルをアップする

※まずローカルのフォルダと、githubのフォルダを紐づけなくてはいけません
ここではデスクトップに作成したtestというフォルダを上げるようにします。

まず、gitに登録したユーザーネームとメールアドレスを設定します。
```
 git config --global user.email "登録したメアド"
 git config --global user.name "ユーザーネーム"
```

また、github上のリポジトリ（リモートリポジトリ）を設定します。
Gitgubで新しくリポジトリをつくり、表示されたURLをコピーします

例）https://github.com/ユーザーネーム/test.git

```
git remote add origin https://github.com/ユーザーネーム/test.git

origin  https://github.com/ユーザーネーム/gitsample.git (fetch)
origin  https://github.com/ユーザーネーム/gitsample.git (push)
```
こんな感じででたらOK。




次に紐づけるフォルダに移動します。

```
cd desktop/test
```
※cd はディレクトリ（フォルダ）を移動することです

```
C:\Users\ユーザー名\desktop\test>
```
こんな表示になってれば移動OK

次に、testをgitに記録できるようにリポジトリにします
※リポジトリとはファイルの状態を記録できる保存場所みたいなもの。

```
git init

Initialized empty Git repository in C:/Users/ユーザー名/.git/
```

Initialized empty Git repository とかえってきたらOK

testのなかに何かファイルを入れてみましょう。（ここではtest.txt）

入れた後に

```
git status
On branch master

No commits yet

Untracked files:
        test.txt

nothing added to commit but untracked files present (use "git add" to track)
```
このように表示されたらOK
トラッキング（記録）してないファイルがあるよ、と答えてくれてます。

※git statusとは、そのリポジトリの中の状態を確認するものです。とりあえず困ったらやってみるとよし。何も怖くないコマンド。

そしたら、これをリポジトリに記録（add)してもらいましょう。

```
git add test.txt
```
何も表示されないので、確認の為にstatusをしましょう

```
git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   test.txt
````
こんな感じにな手ったらOK

次にコミットをします。コミットはさっきaddしたものをどういうものか説明し、タグ付けするような作業です。

```
git commit -m "テストテキストです"
[master 1a79162] テストテキストです
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt
```
最後に、githabにむけてpushします。

```
git push origin master
```
※このコマンドは、origin(最初に指定したURL)のmasterブランチに送ってね、と言ってる。


To https://github.com/ユーザーネーム/gitsample.git
   c244dce..1a79162  master -> master

こんな感じで表示されればpush完了！githubにファイルがおくれてるはずです。
GASを使ってgoogle chat と unity cloud buildをインテグレートする方法

ワタクシが従事しているプロジェクトが様々な理由でgoogle workspaceにチャットまで含めて移行することになり、slackではなくgoogle chatを使うことになった。

さて。
google chatはなんていうのか、slackと比べると実に至らないチャットで、まあgoogleが作るものはたいてい **「帯に短し、たすきに長し」** な代物が多いと、ワタクシなどは思っているのだが、それはさておきである。
ワタクシのプロジェクト、安いというのもありCIにunity cloud buildを使っているのだけど、こいつはslackやdiscordにはインテグレーション出来るが、google chatは出来ない。

これでgoogle workspaceの評価も出ているような気もするが…チャットにポストされないのはウザくてしょうがないので、仕方ないからGASを使ってウェブアプリを作り、これを経由することでgoogle chatとインテグレーションしたので、以下にそのやり方を書いておきたい。

## 1) google chat でWebhookを用意する ##

まずgoogle chatでwebhookを作る。これがないとchatと接続することは出来ない。
作り方はとても簡単だ。

1. メニューより Webhookを管理を選ぶ。
1. 着信Webhookの名前を決める（まあアイコンも決めてもいい）。
1. URLが出来るので、これをコピーする（今やらなくてもよい）

## 2) GAS でBOTプログラムを作る ##

GASでプログラムを書く。このプログラムがunity cloud buildとgoogle chatを繋ぐためのchat botのコアになる。

``` javascript:dopost.gs
function doPost(e) {
  let str = e.postData.getDataAsString();
  let params = JSON.parse(str);
  let webhookUrl = "ここにWebhookのURLを入れる";

  //Googleチャットの投稿メッセージを定義
  let date = new Date();
  let jstdate = Utilities.formatDate(date, "JST", "yyyy/MM/dd (E) HH:mm");
  let message = {
    'text' : '== Build Information '+jstdate+' ==\n'
              +'Target: '+params.buildTargetName+' (#'+params.buildNumber+')\n'
              +'Status: '+params.buildStatus+"\n"
              +'Started by '+params.startedBy+"\n"
              +'====================='
  };

  //HTTPS POSTのオプションパラメータの設定。API認証のためheaders情報必須
  let options = {
    'payload' : JSON.stringify(message),
    'myamethod' : 'POST',
    'contentType' : 'application/json'
  };

  //WebhookのURLに対しHTTP POSTを実行する
  let response = UrlFetchApp.fetch(webhookUrl,options);
}
```

webhookのURLをちゃんと入れたら、あとはデプロイするだけである。

少し書いておくと、getDataAsStringをやっているのは、postされたモンをjsonでそのまま取る方法がないっぽかったのと、unity cloud buildがどーいうjsonを出しているのかslack APIのマニュアルを見て **「こんなもんだろう」** と想像はついたのだけど、実際わからなかったのでメッセージ本体にデバッグも兼ねてstrをぶっこんで、丸ごと表示テストしたからだ。
出す情報をカスタマイズしたい方は、let messageのゴチャゴチャやっているところを str に一度置き換えて、出てくるものを見て、各自でメッセージをカスタマイズして欲しい。

## 3) デプロイする ##

ウェブアプリとしてデプロイする。説明は面倒くさいので、マニュアルなりGAS入門なりを読んで欲しい。
ただ注意としてソースを修正してもデプロイしないと、実際のAPIが更新されないからね。これ、ワリとワナ。

で、デプロイされたURLをコピーしておく。

## 4) Unity Cloud Buildにwebhookを追加する ##

1. Project Setting > Integrationを選択する。
1. New Integrationを選択する。
1. webhookを選択
1. cloud buildのイベントを全部選択
1. webhook URLにデプロイされたURLを入れる。

と、このようにして、google chatとunity cloud buildはイングレート可能である。
ちなみにgoogle chatのcard formatを使うと、もっとイロイロ出来るが、そんな必要はないだろう。
AWS認定 ANS（ネットワーク試験）がkoiwaclubすぎた

今回はちょっとテイストをかえてかいてみます。

というのもの今回は**AWS Certified Advanced Networking - Specialty（ANS-C00）**
を受験してきたのですが、体感５割以上koiwaclubとほぼ同様の問題が出題されたので、
これはいかがなものかと思い、このタイトルにした次第です。

つまり何がいいたいのかというと、
**理解を必要としない、単純な暗記でとれてしまう**可能性が大いにあるのだということです。
目的が合格だけ！というのならそれでいいのですが、このハイパーkoiwaclub状態だと、
自分が本当に内容を理解できているのかを試験を通して測ることができません。

個人的に過去のAWS試験上、一番理解が怪しかったので、
受かるか微妙なラインだと思ってました。しかし、思いのほか簡単にとれてしまい、
こうなると試験後の達成感もあまりなく、ちょっと虚しい試験になりました。

一応フォローしておくと、AWSに限らず資格試験がこうなるのは仕方ないのかなとも思います。
というのも試験開始から時間がたてばたくさんのナレッジ（悪い方向のものも含む）がたまるので、
試験が更新されなければ合格率があがっていくのは必然的なことです。
業者としても試験に近い問題を出せば受講者の合格率もあがる（＝利用者が増える）し、
商売って考えたらこれもまた必然なことなのかもしれません。

でもやっぱりこの悪い方向のナレッジ化が起こってしまうと、
もともと存在意義が決して強いわけではない資格たちの意味は薄い方に倒れていくし、
何より我々エンジニアたちの能力底上げにもなりません。

こう考えると頻繁に試験を更新してくれる試験たちには、
感謝しなければいけないのではないかと思いました。
受験料がそれなりなのも、こう考えれば理解できる部分があります。

ちなみに今回やばいと思った、**ANSも7月から新しいバージョン**になるみたいです。
ちゃんと対策してくてますね！！初期の頃に取得した先人たちには頭があがりません:bow:

前段が長くなってしまいましたが、以下いつものかいていきます。

## 事前の知識
・インフラエンジニア歴７年くらい
・AWS経験は１年〜くらい
・CLP、SAA、SOA、DVA、SCS取得済

## 勉強内容
**・総勉強時間：30hくらい（1ヶ月弱） ※SCSのときと同じ内容です**
過去試験と同じく平日は2hくらい、土曜は５hくらい。直前はさらにがっつりやりました。
試験は勉強開始時点で合格者の情報拾って1ヶ月後で予約しました。
合格者の情報は問題集と同じくkoiwaclubで拾ってます。

**・勉強内容①：問題集**
<img width="200" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/b76041af-bfc8-4b1e-b159-47cf7dc113aa.jpeg">
SCSのときと同じ要点整理シリーズです。
AWSは資格試験テキスト、黒本、要点整理の３つがメインですが、
この要点整理が一番読みやすいです。

**・勉強内容②：koiwaclub**
冒頭に書いた通り、神にもなるし悪魔にもなります:angel::imp:

今回も３週実施。
１週目の平均点：48
２週目の平均点：65
３週目の平均点：75

SCSのときよりも若干下がってます。過去に比べると問題文も長いものが多いので疲れます。
**本試験よりも長文の問題の比率が高いので、若干レベルが高く設定されてる**と感じました。

## 試験
今回も渋谷道玄坂で受験。

いつもどおり点数に考慮されないと思われる、最初の10問くらいは難しかったです。
フェイクなのでここでメンタルブレイクされないように。以降は前述の通りほぼkoiwaclubでした。

傾向としてはやはり**DX接続、VPC、VPNあたりをメインにELBやRoute53**がちらほらな感じでした。
**ネットワーク基礎&DXまわり（CIDR、BGP、AS、VIF、VGW等）** は確実に抑えておく必要があります。

時間は半分くらい余りましたが、もうこれ絶対取れたわと思い、
特に見直しせず即ポチしました。今回は848点で合格でした。

## 最後に
こいわくらぶさんつぎもおねがいします！！！！！
Cloud Domainsで取得したドメインの証明書を有効にし、httpsでアクセスできるようにする手順

## 前提

* ロードバランサーを経由する。
* example.com を Cloud Domains で取得している。
* www.example.com の証明書を取得して、https通信できるようにする。

## 手順

### ロードバランサの設定

**※ロードバランサのHTTPSの設定・証明書取得の手順**

ネットワークサービス > ロードバランシング から ロードバランサの作成 >
HTTP(S)ロードバランシング > インターネットから... ＆ グローバルHTTP(S)ロードバランサ（not 従来型）

で、「フロントエンドの構成」入力時に、

* プロトコル：HTTPS（ を選択すると証明書欄が出てくるので、 ）
* IPアドレス：IPv4
* IPアドレス：エフェメラル
* ポート：443
* 証明書：証明書の設定がある場合はそれを指定、無い場合は「新しく証明書を作成する」
  * ※作成する場合、証明書の作成画面に遷移するので、
   「Googleマネージドの証明書を作成する」 > ドメイン欄に証明書が必要なドメインを入力する。
* それ以外は良い感じ（名前は自分で決めて、他はデフォルト）に設定する。

※バックエンドの指定なども良い感じに指定する。

### Cloud DNSの設定

**※ドメインのAレコードにロードバランサーIPアドレスを設定する必要があり、その手順**

ロードバランサ作成後、作成したロードバランサの詳細を見ると、
フロントエンド欄の プロトコル：HTTPS に IPアドレスが表示される。

該当のIPアドレスを、 CLoud DNS の証明書のドメインの Aレコードとして指定する。

※「www.example.com」 の証明書を取得した場合、 Cloud DNS の 「www.example.com」 の Aレコードとして、ロードバランサのIPアドレスを指定する。

ロードバランシング > ロードバランサ の下の方に「ロードバランシング コンポーネントのビュー」というリンクがあるので、そこに飛ぶ。

証明書タブを開くと、作成した証明書があるので、それのステータスが 「ACTIVE」 になるのを信じて待つ。
※若干時間がかかる。成功時はドメインステータスに緑のチェックが入り、失敗時は！マークになりエラー原因がでる。

「ACTIVE」 になったら、Aレコードの設定が伝播するのを待つ。※ここも時間かかるので信じて待つ。

https://www.example.com に定期的にアクセスし、開通するのを祈る。

## 自記事へのリンク

* [Google Cloud 関係まとめ](https://qiita.com/k_hoso/private/804a15e546cf5761ce8f)