OmniAICreator/Qiita-1.07M huggingface dataset:
【Excelアドイン】HYPERLINKをクエリで生成してみる

[Sharperlight](https://sharperlight.jp/)Excelアドインは、HYPERLINKを作成してExcelに組み込む機能を提供します。クエリビルダで拡張表現を使用することにより作成できます。

Excelを起動して、SHARPERLIGHT XLリボンに移動します。
セルC4を選択し、数式/テーブルアイコンをクリックします。クエリビルダが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d8dba91d-25cd-d31c-baa1-eb8da8ecdf2d.png)
今回は、カスタム定義のデータセットを利用して、簡単なデータでHYPERLINKの作成を検証してみます。
**製品**には`システム`、**テーブル**には`カスタム定義のデータセット`を指定します。
準備するデータセットはこのような感じでいいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/66b408ad-70be-012d-7d25-a6c7c7a825c0.png)
```
"番号::Number","名称::String"
1,"新宿区役所"
2,"世田谷区役所"
3,"千代田区役所"
4,"港区役所"
5,"墨田区役所"
```
出力領域に、番号フィールドと名称フィールドを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/390e5b7d-2a37-b3ad-1451-7b90eaddab0d.png)
プレビュー機能でクエリを検証します。うまく作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/72643fba-0b9e-0afa-d48f-bc9bdb624f12.png)
では、このクエリにHYPERLINKを作成する拡張表現を追加します。
<INS>ここでひとつ注意事項、Excelで出力を数式 (=HYPERLINKなど) として処理するには、拡張表現のデータ型を HTML に設定する必要があります。</INS>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/301d1e5f-2f19-8e73-4e97-a362a94aa544.png)
データ型をHTMLにして、下記のコードを構文領域に記述します。今回は名称列の値、つまり区名を参照してHYPERLINK式を作成します。
このHYPERLINKをクリックすると、区名を利用してGoogle Mapの検索を行うといった具合です。
```
"=HYPERLINK(" + ChQuote() + "https://www.google.com/maps/search/" +  ChQuote() + "&[@[名称]]"
+ ","
+ ChQuote() + "検索" + ChQuote()
+ ")"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/06622c1c-1e75-8ec7-a0fd-a6ec1bb1181c.png)
記述中の`"&[@[名称]]"`は、クエリにより作成されるExcelテーブルの名称列の参照を表します。
この拡張表現によりこのようなExcelのHYPERLINK関数が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0371ff93-68ce-e72d-26a3-d14a79f708ff.png)
`OK`ボタンで保存、クエリビルダも`OK`ボタンで保存実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f99c9fb9-4127-6cd6-b09d-3c86d9a1d7cd.png)
クエリが実行されて、このようなテーブルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4a3b3edd-8ef0-be07-9ce5-eaa6e9669acf.png)
HYPERLINK 検索をクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dde1e019-1f53-1423-37ac-d174b0d5af32.png)
このような感じでGoogle Mapが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bf3e1c2d-6589-c57a-130e-c923892ff9e2.png)

では、失礼します。
Elixirのコードを気軽に触ってみよう！キラキラさせたり草を生やすよ


本記事は下記イベント進行用の記事です。

https://piyopiyoex.connpass.com/event/260784/

## Elixir Schoolで基本の記法をやってみよう

https://elixirschool.com/ja

## Replitでサインアップ（ユーザー登録）しよう

Elixir SchoolではElixirのインストールとiex（対話モード）を使っていますが
今回はElixirのインストールはせず、ブラウザ型IDEのRaplitを使用します。

https://replit.com/

ユーザー登録がまだの方はサインアップを、ユーザー登録済の方はサインインしましょう。
メールアドレスでの登録のほか、GoogleやGitHubアカウントでの登録もできます。

### 基本のキ：入門、基本データ型、そして基本的な演算

まずは基本の構文を進めていきましょう。10〜15分くらいもあれば大丈夫です。

https://elixirschool.com/ja/lessons/basics/basics

途中で出てくる言葉
* 真理値
  - 真偽値とも呼ばれる
* アトム、is_atom、is_boolean、div、rem
  - [Kernel](https://hexdocs.pm/elixir/1.14.0/Kernel.html#module-the-standard-library) に含まれている。自動的にインポートされる。
* Erlangのビルトインのものも含めたライブラリのモジュール

### キラキラさせてみる

さて、基本のキを押さえたので、これからは例題を触ってみて、解説をしていきます。

サンプルコードは @t-yamanashi さんからいただきました！ありがとうございます:v:


```elixir
1..255
|> Enum.map(& "#{IO.ANSI.color(&1)}*")
|> IO.puts
```

Replitで実行してみました！

![スクリーンショット 2022-10-01 21.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109744/4c5756b6-2b8f-38e7-55a2-34b95e9a5ac1.png)


#### 分解してみる

#### |>（パイプ演算子）とIO.puts

```elixir
IO.puts("hello")
IO.puts(1 + 2)
```

```elixir
"hello" |> IO.puts
1 + 2 |> IO.puts
```

#### Enum.map

```elixir
Enum.map([1,2,3], fn x -> x + 1 end)
```

```elixir
Enum.map(1..3, fn x -> x + 1 end)
```

```elixir
1..3 |> Enum.map(fn x -> x + 1 end)
```

#### IO.ANSI.color

IO.ANSI.colorは出力する文字列の前に置くことで色指定ができます。
Elixir School基本の中で出てきた式展開が使われています。

```elixir
IO.puts("#{IO.ANSI.color(1)}Hello?")
```

### キラキラの応用：文字を生やす

```elixir
1..1000
|> Enum.map(fn _ -> "#{IO.ANSI.color(0, Enum.random(1..5), 0)}■" end)
|> IO.puts()
```

![スクリーンショット 2022-10-01 21.50.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109744/e6540c3c-5749-3c73-280e-c87ca6cb21d6.png)


#### アンダースコアは何？

Elixirでは変数が使われない場合、警告が表示されます。
変数を使わない場合、変数のはじめに「_」をつけると警告の対象外になります。

#### Enum.random

引数として指定されたリストのうちランダムな要素を返します。

```elixir
Enum.random([1,3,5])
Enum.random(1..10)
```

#### Enum.join

指定されたリストを文字列として結合します。
第2引数にセパレーターが渡すこともできます。

```elixir
Enum.join(1..10)
Enum.join(1..10, ",")
```

### ライフゲームを動かしてみよう

最後にたまぬぎさん作成のライフゲームを動かしてみましょう。

https://zenn.dev/tamanugi/articles/e3a43f179409e2

## さいごに

ここまでお疲れさまでした！
コードを動かすのをじっくりやってみると発見があって、それが不思議だったり面白かったりしますね。
Auroraのフェイルオーバー優先順位

# 本文
以下の順序でフェイルオーバー先を決定します。
1. フェイルオーバー優先度が高い方（高 tier-0 > tierｰ15 低）
    * 「指定なし」を選ぶと「tier-1」にされる・・・ように見える
1. インスタンスのサイズが大きい方
    * `db.r3.large`と`db.r5.large`のようなファミリー違いの場合はAWSが定めるルールによって決まる、とのことで非公開情報だそうです
1. フェイルオーバーが発生したものと同じサブネットにある方
1. フェイルオーバーが発生したものと同じAvailabilityZoneにある方
1. それでも一意に決まらなかったら最終候補の中からランダム

# 駄文
Aurora Serverlessじゃなく、Aurora Serverless V2でもなく、無印Auroraのお話です。

Auroraのインスタンスにはフェイルオーバー優先順位というものを設定できます。
![フェイルオーバー優先順位](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/60cbc9e7-ea7d-d8d0-ff32-6fd0678afa04.png)

しかし、「優先度が高いものからフェイルオーバー先に選ばれるんだろうな」とは思うものの、`tier-0`が高いのか`tier-15`が高いのかがすっごくわかりにくいと思いませんか。
しかも`指定なし`ってなんですかね？
更に言うと、同じ優先度が複数ある場合にはどうなるのかも良くわかりません。
これをズバッとまとめて覚書にしておこう、という趣旨の記事でした。
HTPOW A5 M50 Pro をMacで動かす

## MACで動かすにはLightBurnのアプリケーションをインストールします。（他にもあるかも）

レーザ加工をさせる機材は以下のものになります。
商品名：HTPOW A5 M50 Pro

https://www.amazon.co.jp/dp/B09WKB9D64/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/18321c17-ce41-63dc-576a-0eadc7a9ca4f.png)

以前も書きましたが以下のスペックです。

https://qiita.com/kyazoooo/items/147a2829f6a145d12859

# スペックまとめ
本装置の記載されているスペックは以下のとおりです。（加工の際に気になった部分だけまとめています。）
- 印刷範囲：　410x400mm
- 彫刻精度：　0.01mm
- レーザ出力：　5W
- レーザ寿命：　10000h
- 彫刻素材（木、竹、段ボール、プラスチック、革、MDF、スレート、漆塗り金属、鏡面ステンレス）
- 切断素材（段ボール、不織布、ベニヤ板、アクリル、いくつかの薄いプラスチック板、スポンジ、MDF、革）

# Light Burnのインストール
以下のページから「Mac OS Version」をダウンロードしインストールしてください。

https://lightburnsoftware.com/pages/trial-version-try-before-you-buy

![スクリーンショット 2022-09-30 13.46.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/5dfc28ce-1d7b-9cfe-911f-024b550894fa.png)
下から２番目の「Mac　OS　version」をダウンロードしてインストール

# デバイス（HTPOW A5 M50 pro）の登録
起動するとこの画面が出るので、「無料トライアルを開始する」を押下。（英語の場合は一度アプリを落として再度立ち上げると日本語になりました。）
![スクリーンショット 2022-09-30 13.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/0bb75dee-f1bf-939d-7b3d-fc8bc59bc562.png)

デバイスを選ぶ画面が表示されます。ここでは「手動で作成」をクリックしてください。
![スクリーンショット 2022-09-30 13.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/1ab34e85-43ec-c829-b0f2-32578c09a0fe.png)

「GRBL」を選択
![スクリーンショット 2022-09-30 14.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/eac4ced8-959a-274e-a9cc-11236d61c018.png)

「Serial/USB」を選択
![スクリーンショット 2022-09-30 14.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/313361fd-4b33-b3f0-3d35-c70e988616da.png)

X軸を410m[m]、Y軸を400[mm]を入力
![スクリーンショット 2022-09-30 14.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/4f871f87-2334-d441-e895-4bd24058f504.png)

原点位置[正面左]を選択
「起動時にレーザーをホームにしますか？」はどちらでも大丈夫です。（画像はOFF状態）
![スクリーンショット 2022-09-30 14.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/677910de-0817-09ea-64ec-970226ec0aa9.png)

最後にOKを押してデバイス登録は完了です。
![スクリーンショット 2022-09-30 14.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/3170660f-3267-c57a-ffdc-32d2477d052c.png)

# 動かしてみる
上記手順が完了するとこの画面が出ます。MACとデバイスをUSBで接続してください。
![スクリーンショット 2022-09-30 14.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/0e9d0b4f-05ca-340e-c0d8-6c4385d4e483.png)

接続しUSBが正しく認識できている状態だと以下のselectに「usbserial」が表示されると思います。
こちらが選択できればMACとデバイスの接続は完了です。
「ホーム」ボタンを押すとレーザがホーム位置に動くので試してみてください。
使い方についてはそのうちアップします。
![スクリーンショット 2022-09-30 14.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682778/f7652780-8b41-14b8-fb48-ebe79692ef10.png)
Unity Google Sign-In iOSクラッシュ

# 環境
Unity2021.3.5
macOS 12.5 Montery
Xcode14

# 前提
Firebase Unity導入 [[firebase](https://firebase.google.com/download/unity?hl=ja)]、
googlesamples/google-signin-unity [[github](https://github.com/googlesamples/google-signin-unity/releases)]導入、
cocoapods導入、
pod対応 [[github](https://github.com/googlesamples/google-signin-unity/pull/126)] (ビルド出来ないとか v4だとUIWebView使ってるのでv5に変更とか)
Firebaseコンソールでの Authentication設定 [[console](https://console.firebase.google.com/)]
全て済んでいて ビルドして 一応Google認証が出来ている前提です。

# 問題
XcodeやiOSのバージョンによっては クラッシュするようです。
自分の環境では Xcode14 ＆ iOS14.2 で起きました。

```
** Assertion failure in +[UIAlertAction _actionWithTitle:descriptiveText:image:style:handler:shouldDismissHandler:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore/UIKit‑3901.4.5/UIAlertAction.m:42
```
iOSのアラート表示に対応できてないぽい？

# 解決
色々対処法をググりましたが見つからず。
ふと google-signin-unityの pull requetsを見てみると 対処法を発見 [[github pr #205](https://github.com/googlesamples/google-signin-unity/pull/205)]

バージョン指定 [[dependencies](https://github.com/googlesamples/google-signin-unity/pull/205/commits/aac32d99dae0b22daa0598ba89578e799c03f9df)]と
コード変更[[iOS対応](https://github.com/googlesamples/google-signin-unity/pull/205/commits/970beb2cd679b511e95d8544dce6400f600b757a)]を行いましたら 無事動きました。
Flutter(Dart) printでオブジェクトの中身を確認したい時に

下記のような、友達検索などで利用されているオブジェクトのデータを`print`でログに出そうすると、
```dart
class FindFriendsRes
 {
  List<User> friends;
  Map<String, Timestamp> likedAts;

  FindFriendsRes(this.friends, this.likedAts);
}
```
中身がこちらのように表示されます。
![スクリーンショット 2022-09-30 13.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/091a4cf7-14d2-a7dd-e9bb-53da9cc47eba.png)
そんな時に重宝されるのが、
# [inspectメソッド(検査機能)です。](https://api.dart.dev/stable/2.18.2/dart-developer/inspect.html)
```dart
import 'dart:developer';

inspect();
```
通常、printで囲う部分をinspectに変えるだけでとても簡単です。
```dart
print(friend) // Instance of 'FindFriendsRes'

inspect(friend) // <inspected variable> ↓ friends: List (3 items)　↓ likedAts: Map (0 items)
```
## データが入って入れば、こちらのように表示され。
![スクリーンショット 2022-09-30 13.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/03913732-a012-eb94-83cc-71b156785986.png)
## データが入ってなければ、このように出ます。
![スクリーンショット 2022-09-30 13.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/55b8eae7-2390-4919-cec0-fe9cbc26eed6.png)
あくまでもデバッグ作業で使用しますので、使用した後の`パッケージのimport`を削除するのを忘れないようにしましょう。
ニフクラ mobile backendを拡張するNCMBプロキシを開発中です（署名なしのスクリプト実行）

[ニフクラ mobile backend](https://mbaas.nifcloud.com/)では認証やデータストア（クラウドデータベース）、ファイルストア（ファイルストレージ）、プッシュ通知など様々な機能があります。そして、サーバーレスで拡張できるスクリプト機能もあります。

しかし、実際のアプリ要件は多彩で、場合によっては他にも様々な機能が望まれます。すべての需要を満たすのは困難な場合もあります。そこで、NCMBのフロントとして動作するプロキシソフトウェアを開発中です。

このプロキシを使うことによって、小さなニーズはプロキシ側で実装できるようになります。今回は個人的に欲しかった「署名なしでのスクリプト実行」について解説します。

## 追加する機能（予定）

現状は透過的なプロキシでしかありませんが、以下のような機能を実装する予定です。

- 認証をJSON Web Tokenに
- GitHub認証
- ソーシャル認証（標準ではサーバー認証が必要ですが、プロキシだけで認証できるように）
- WebSocket（リアルタイム通信）
- Webhooks
- 署名なしでデータストア操作
- 全リクエストログ記録

他にもデータストアの集計機能、GraphQL機能なども追加できると便利そうです。なお、Webhooksなどの機能はプロキシ経由でしか実現できませんので注意してください（管理画面で操作しても実行されません）。

## インストール

[NCMBMania/ncmb-proxy](https://github.com/NCMBMania/ncmb-proxy)のリポジトリをクローンします。

```
git clone git@github.com:NCMBMania/ncmb-proxy.git
```

ライブラリをインストールします。

```
npm i
```

## 設定の編集

`setting.example.yml` をコピーして `setting.yml` を作成します。そして、ファイル内にあるアプリケーションキー、クライアントキーをそれぞれお持ちのものに書き換えてください。

```yaml
applicationKey: YOUR_APPLICATION_KEY
clientKey: YOUR_CLIENT_KEY
```

## サーバーを起動

サーバーを起動する際には、以下のコマンドを実行します（まだ開発中なので、開発用サーバーが立ち上がります）。

```
npm run dev
```

例えばローカルの場合、 `http://localhost:3000` にてサーバーが立ち上がります。

## スクリプトの指定

`setting.yml` の中に、 `no_signature` キーがあります。ここに配列として、スクリプトのファイル名を記述していくと、そのファイル名へのアクセスは署名処理なしで実行されます。HTTPメソッドは関係ありません。

ここで指定されていないスクリプトは署名処理必須なのでご注意ください。

```yaml
  script:
    domain: script.mbaas.api.nifcloud.com
    version: 2015-09-01
    no_signature:
      - YOUR_SCRIPT.js
```

## スクリプト実行

スクリプトの実行は `http://localhost:3000/script/YOUR_SCRIPT.js` のように実行します。このファイルはサーバーサイドで実行した結果を表示するものになります。つまり、HTMLの中で `<script>` タグで書いたとしても、利用できます。

## 用途について

例えばLINEボットなどのチャットボットでの利用が考えられます。他にも、Webhookを外部システムから受け取る場合にも利用できるでしょう。

## 注意点

現時点ではレスポンスがテキストに限定されるはずです。バイナリファイルを返すレスポンスの場合、エラーや狙い通りの動作をしない可能性があります。

## まとめ

NCMBの署名処理は安全にサービスを使う上で必要なものですが、外部サービス連携を行う場合には署名処理がない方がスムーズな場合もあるでしょう。そうした時にはこのプロキシサーバーが役立つはずです。

[NCMBMania/ncmb-proxy](https://github.com/NCMBMania/ncmb-proxy)
NCMB Flutter SDKのAPIドキュメントを公開しました

[ニフクラ mobile backend](https://mbaas.nifcloud.com/)にはSwift/Objective-C/Java/Kotlin/JavaScript/Unity向けに公式SDKを提供しています。そして、コミュニティSDKとして様々な言語向けにもSDKを提供しています。コミュニティSDKは以下の言語向けがあります。

- PHP
- Ruby
- Google App Script
- C#
- Java（サーバーサイド）
- Flutter
- React Native
- Deno
- Python

こうしたコミュニティSDKは機能面はある程度充実しているものの、ドキュメントについては公式SDKに劣るところがあります。しかし、より使いこなしてもらうためにはドキュメントは大事です。そこでFlutter SDK用にAPIドキュメントを作成、公開しました。

## ドキュメントのURL

ドキュメントは[ncmb - Dart API docs](https://ncmbmania.github.io/ncmb-dart/)にて公開しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9eed58cf-f2d2-82f4-1868-3821c4d32050.png)


## ドキュメントの使用

ドキュメントはDartDoc形式で書かれています。ソースコード中のコメントから `dart doc` コマンドで生成しています。

## 実際の使い方について

今回のAPIドキュメントはあくまでもAPIレベルのものなので、実践的に使っていく中で必要になるものでしょう。初学者向けのドキュメントは別途作成中です。

ドキュメントはなるべく公式ドキュメントの形に合わせていこうと思いますので、ご期待ください。

## 裏話

このドキュメントを作る上で必要なのはコメント文ですが、GitHub Copilotに大いに助けられました。非常に品質の高いコメントを返してくれるので、効率的にドキュメントが作成できました。

## まとめ

Dartは静的な型付け言語なので、IDEなどで入力補完が表示されます。それでもやはり見やすいドキュメントがある方が開発しやすいでしょう。ぜひドキュメントをご覧の上、Flutter SDKをご利用ください。

[ncmb - Dart API docs](https://ncmbmania.github.io/ncmb-dart/)
特定のEC2のみセッションマネージャの利用を可能にする

# やりたいこと

以下にポリシーを限定したい。

- EC2インスタンスのタグの検索
- 特定のEC2インスタンスの起動、開始、再起動
- 特定のEC2インスタンスのみセッションマネージャを利用可能にする

やりたいことは基本的なことであるが、ドキュメントはデフォルトのIAMポリシーと追加のIAMポリシーとわかりずらかったため、一つに纏めてみた。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-restrict-access-quickstart.html

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-restrict-access-examples.html

# 作成したポリシー

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ec2-1",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:ap-northeast-1:<XXXXXXXXXXXX>:instance/*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/<value>": "<key>"
                }
            }
        },
        {
            "Sid": "ec2-2",
            "Effect": "Allow",
            "Action": [
                "ssm:GetConnectionStatus",
                "ec2:DescribeInstances",
                "ssm:DescribeInstanceInformation",
                "ssm:DescribeSessions",
                "ec2:DescribeTags",
                "ssm:DescribeInstanceProperties"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ssm-1",
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/*",
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/<value>": "<key>"
                }
            }
        },
        {
            "Sid": "ssm-2",
            "Effect": "Allow",
            "Action": [
                "ssm:ResumeSession",
                "ssm:TerminateSession"
            ],
            "Resource": "arn:aws:ssm:*:*:session/${aws:username}-*"
        }
    ]
}
```
Team Foundation Server(TFS) で他人が編集中のファイルを元に戻す

## 前書き
Team Foundation Server(TFS)上に休職中の社員がチェックアウトしたままのファイルが残っていたため、
チェックアウトを外す方法を調べて実行した。その覚書き。

## 本題
* チェックアウト中のファイルを確認
```:コマンド
> tf status /collection:[検索対象コレクションへのURL] /user:[ユーザ名]

(例)
全ユーザについて確認する場合
> tf status /collection:https://hoge-server.net/tfs/hoge-collection /user:*

特定ユーザについて確認する場合
> tf status /collection:https://hoge-server.net/tfs/hoge-collection /user:hoge_user
```
* チェックアウトされたファイルのワークスペース名を確認
```:コマンド
> tf workspaces /collection:[検索対象コレクションへのURL] /owner:[ユーザ名]

(例)
> tf workspaces /collection:https://hoge-server.net/tfs/hoge-collection /owner:hoge_user
```
* チェックアウトされたファイルを元に戻す
```:コマンド
> tf undo /collection:[検索対象コレクションへのURL] /workspace:[ワークスペース名] [対象ファイルフルパス]

(例)
> tf undo /collection:https://hoge-server.net/tfs/hoge-collection /workspace:hoge_workspace $/hoge_folder/hoge_file.txt
```

#### よく分かるかもしれない解説
最終的に `tf undo` コマンドを実行したいので、それに必要な情報を `tf status` `tf workspaces` で確認しています。
HP MicroServer Gen10 を触ってみた(2022.09)


とある案件でスペースの問題からということと、スペックがそう必要ないという理由から提案した機器が届きました。

タイトルにもあるように昔からよく聞くマイクロサーバー。

マイクロサーバーと行っても数年前にこの名前で流行った時よりもかなり小さくなってます。

それでは、文章よりも写真貼っていきます。

<H3>機器画像</H3>

正面から
![2022-09-30 12_58_19-Clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851777/006525bf-7a17-9bd4-a9da-96dbfd0add92.png)

背面から
![2022-09-30 12_59_09-Clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851777/6dd95a54-32ba-09be-7245-7be0bdaa7f5c.png)

カバー外した（正面）
![2022-09-30 13_03_27-Clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851777/5c07ceab-407e-17e3-d8dd-a792b9c8bd31.png)

<H3>スペック</H3>

スペックは以下

○プロセッサー
　最大1基：インテル® Xeon® E2224 /　Pentium® Gold G5420 プロセッサー

○メモリ
　2DIMMスロット DDR4 UDIMM

○ドライブ
　4(3.5型ノンホットプラグSATA/SSD)
	
○拡張スロット
　1(ロープロファイル/ハーフレングスPCI Express Gen3 x16×1)

○電源冗長化　
　なし
	
音響ノイズ
　21dBA

価格は、110,000～　昔の金額を知ってると、高くなりましたね笑

<H3>メモ</H3>

今回は、たまに過去のDBサーバのデータを見たいがための予備サーバだったので、１TBのHDDを搭載させるだけの構成でした。

HDDは前面に取り付けてある、マウンタ用のネジをHDDに取付、前面からレールを滑らせて取り付けます。
【Ruby on Rails】マイグレーション時に、任意のrakeタスクを実行する

今回は、マイグレーション時にrakeタスクを実行する実装をしたので、備忘録です。

# 実装
```ruby
Rake::Task['db:migrate'].enhance do
  Rake::Task['任意のタスク'].invoke
end
```
やっていることとしては、enhanceでdb:migrateを事前タスクとして指定して、actionの中で任意のtaskをinvokeしているといった感じです。
独自のログを出力したり、最新のDBを自動でダンプしたりと使いどころは多いかと思います。

https://docs.ruby-lang.org/ja/latest/method/Rake=3a=3aTask/i/enhance.html
【FileMaker】動画がアイコンマークだと！？

結論は「工夫して実装しよう」ってことなんですけど、「いや、フツー（どこの？）おんなじ動作を想定するよね？」と悶々とするFileMakerのあの機能についてです。

そうです。

ポータルでのインタラクティブコンテンツ表示

です。
インタラクティブコンテンツとは、PDFや動画とか音楽ファイルのことです。

# FileMakerバージョン
この記事で取り扱っているFileMaker Proのバージョンは、19.5.4です。

# 現象の確認
ポータル表示したインタラクティブコンテンツと、ポータル外に表示したいわゆるthe recordのインタラクティブコンテンツを赤枠で示しました。
![スクリーンショット 2022-09-29 15.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/105f94d5-5e57-e33c-de1a-d8e06386d8ea.png)

こちらは、リスト表示のオブジェクトフィールドです。
![スクリーンショット 2022-09-30 12.02.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/31752a78-f7fc-0419-a825-7be9deac1b4a.png)


# ヘルプではこう言っている

FileMaker Proヘルプの「[オブジェクトフィールドに対する書式の設定](https://help.claris.com/ja/pro-help/content/formats-container-fields.html)」にもあるとおり、ポータルだと、インタラクティブコンテンツはアイコン表示になります。

# 基本はインタラクティブコンテンツ表示で
画像も動画もインタラクティブコンテンツで実装するのが何も考えず手間なく実装できます。
なぜかというと、インタラクティブコンテンツ設定だと、イメージも対象だからです。
イメージ設定の場合に挿入できるコンテンツはこちら。
![スクリーンショット 2022-09-30 12.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/042ecdf8-46ce-327e-663f-2c3b2090e4ac.png)
インタラクティブコンテンツの場合は、こちら。
![スクリーンショット 2022-09-30 12.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/48cc08ba-5ac8-b863-6d9c-b452ce8e1a8a.png)

# ポータル表示ではどうする？
では、ポータル表示ではどうしましょう？
ヘルプにあるポップオーバー表示と、新規ウインドウ表示を紹介します。

## ポップオーバーを活用する
ここでのポイントは、オブジェクトフィールドに透明なポップオーバーボタンを重ねて、元のオブジェクトも見えるようにしておくことです。
あと、オブジェクトフィールドをインタラクティブコンテンツに設定しておくのを忘れずに！
![スクリーンショット 2022-09-30 12.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/13682307-0af8-a943-6edd-f0e5ce708bd2.png)

この実装で、イメージ、動画など、FileMakerが扱えるオブジェクトの対応がポータルでも可能になります。
![スクリーンショット 2022-09-30 12.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/2610098b-3659-f996-b665-3fae6858ed51.png)

## 新規ウインドウで実装する
次に、新規ウインドウにあらためて表示をする実装です。

(1)オブジェクトフィールドを表示するレイアウトを作成します。
この時、オブジェクトフィールドをインタラクティブコンテンツに設定しておくのを忘れずに！
あと、ついやってしまいがちなのが、レイアウトテーブルを指定する際のTOの指定間違いです。
ポータルで使っているTOと同じにしておいてください。
![スクリーンショット 2022-09-30 12.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/ac5a3b2c-1fde-6b87-db70-dc8da88ebe9f.png)

(2)画像フィールドをボタン設定にします。
![スクリーンショット 2022-09-30 12.59.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/ee710a87-6a7b-867e-2fe2-517fb38cb2f8.png)

(3)関連データへ移動で実装します。
![スクリーンショット 2022-09-30 13.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/731eb437-2f92-2207-b155-25c04351d449.png)

これで、イメージも動画も表示ができますね！
![スクリーンショット 2022-09-30 13.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6b8c344c-1cf2-3e49-50a6-247a11ee8aba.png)

# FileMaker Goで表示すると。。。
FileMaker Goで同じレイアウトを表示すると、残念なことに通常のレイアウトでインタラクティブオブジェクトに設定してもアイコン表示です。
![IMG_9563.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9da2e191-16f2-8cde-55bd-11fa437c7851.png)
FileMaker Goの場合は、オブジェクトフィールドをタップすると再生機能が表示されますので、クライアントに指摘されたら、「仕様です」と答えましょう。。。
![IMG_9564.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/ea015fa2-a8b0-73ce-c979-fcac57667818.png)


# 思うこと
本当は、ポータルでもアイコン表示なしで全て表示できたら一番いいのですが、仕様は仕方ない。。。

他にもやり方はあると思うので、これ以外にもポータルでインタラクティブコンテンツの表示hackがありましたら、ぜひ記事化して皆さんで共有しましょう！
Raspberry pi Pico (W)でmain.pyから自動起動されない問題の原因（の一つ？）

Raspberry pi Pico Wを用いて、とある機器の状態を監視し、エラーが出た際に通知を送ってくれるようなIoTマシンの作成に挑戦しました。（ちなみにアメリカ在住のため、日本でまだ技適をクリアしていないPico Wを使えています）

Rapsberry pi自体を用いるのは初めてだったため、Thonnyをインストールして、firmwareをインストールして、なんとかThonnyからPythonでLチカまで成功しました:star:
ひとまず作成したプログラムを「main.py」と名前をつけてPicoに保存し、USBケーブルを一度抜いて差し直し、独立したIoT機器としてLチカするか。。。。。と思いきや、うんともすんとも言いません。

その状態でThonnyのStopボタンを押して、Picoを接続し直して、Runボタンを押すと問題なくチカチカ:star:

プログラムには問題はなさそうだし、main.pyファイルも手順通りに保存したし。。。。

ここでドツボにハマり、firmwareのインストールし直しや、プログラムの書き直しなど色々と試しましたが、一向に解決せず。

とここで、改めて「main.py」ファイルを保存する時に気づきました。。。。

ファイル名の頭にスペースが入ってる〜〜〜〜〜
そりゃ自動起動されないはずですね:joy:

![スクリーンショット 2022-09-29 21.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948735/89cdbc78-cf15-db77-7a30-65b96bab031e.png)
↑ 半角スペース有りのmain.pyと無しのmain.py

なぜかMacって「英数」ボタンを押したときに半角スペースが勝手に入っちゃうことあるんですが、どうやらファイル名を入れるところでそれが起きていたようです:see_no_evil:

これでつまづいている人いそうなので、情報共有まで〜〜〜
【Ruby On Rails】 既存カラムにコメントを追加したい。

Railsで、既存のカラムにコメントをしたかった。
忘れそうなので、やり方をメモします。
まず、マイグレーションファイルを作成し、以下のように実装します

``` ruby
class AddColumnComments < ActiveRecord::Migration[6.0]
  def change
    change_column_comment(:table, :column, 'コメント')
  end
```
基本的にはこれで大丈夫です！
こんな感じで、カッコなしでも指定できます。

``` ruby
change_column_comment :table, :column, 'コメント'
```

ちなみに、上記の実装だと、マイグレーションをdownやロールバックした際こんなエラーが発生します。
``` 
ActiveRecord::IrreversibleMigration: 

change_column_comment is only reversible if given a :from and :to option.
``` 

なので、こんな感じで
``` ruby
 change_column_comment(:table, :column, from: "旧コメント", to: "新コメント")
``` 
from, toオプションをつけておくと安心かもしれませんね！
Azureの基礎 Virtual Trainingに参加した話

8月に入社したエンジニアで、研修生です。
バックエンドを触った経験はあるのですが、研修期間を頂いているのでインフラのことも学びたく、講義があるなら参加したほうが早いじゃん！
と思い「Microsoft Azure Virtual Training Day: Azureの基礎」に参加しました。

講義を受けたいけど、何をやるの？何がわかるの？という方の参考になればと思い、
自分の学んだことや試験AZ-900について記事にします。

## こんな人向けの講義
- Azureって何？と気になる人
- クラウドって聞いたことがあるけど、実際にどう使っているのか気になる人
- インフラ構築をクラウドでどうやるのか気になる人
- Microsoft Azure の基礎：AZ-900試験を受ける予定の人

## 講義の流れ
9:30 - 13:00 の3.5時間で2日間に分けて開催されています。(2022/9/30現在)
毎月2回

登録先は以下

https://www.microsoft.com/ja-jp/events/top/training-days/azure?activetab=a1:primaryr4

## 講義の内容
大よその内容です。
- 1日目（9:30 - 13:00）
    - 講義の概要と、AZ-900の試験について
    試験範囲の説明など
    - クラウドの概念 (約30分)
        - クラウドコンピューティングの定義
        - クラウドモデルの種類、内容
        - クラウドのメリット など
    - Azureのコアサービス (約40分)
        - リージョン、可用性オプション・ゾーン、リソース・リソースグループの説明
          Azureリソース：ストレージ、仮想マシンなどの環境を提供するサービス
        - 仮想マシン(VM)の作成デモ
        - DB作成デモ など
    - Azureソリューションと管理ツール (約40分)
        - IOT（「モノのインターネット」と表現）、ビッグデータ分析、AIや機械学習のサービスの説明
        - Azure管理ツールの説明とデモ
        portal画面だけでなく、CLIを使った管理の紹介
        - AdviserやMonitorの説明
        使用しているAzureリソースやログから（セキュリティ面での警告など）してくれるサービスのようです
    ※ 試験に出やすい所も少し教えてくれました。
    
    - 講義終了・QA回答
    - 全体終了

- 2日目（9:30 - 13:00）
    - Azureのセキュリティとネットワークセキュリティ（約50分）
    セキュリティツールと機能の紹介とデモ
    - ID、ガバナンス、プライバシー、コンプライアンス（約1時間）
        - 認証と認可の違いから始まり、ActiveDirectory機能を使ったIDサービス（IdentityService）の説明とデモ
        - RBACやタグ、ポリシー機能を使ったガバナンスの説明とデモ
        - コンプライアンスの条件・要件を満たしているかチェックするサービスの説明とデモ
    - Azureの価格とライフスタイル（約1時間）
        - コスト管理ツールの紹介
        Azureを利用して発生するコストや、オンプレミスからクラウドに移行した際に変化するコストの計算など
        - SLA（Service Level Agreement）の管理方法や保証の紹介とデモ
    - 講義終了・QA回答
    - 全体終了

大まかに書きましたので、細かい所はご参加と共に確かめてください。
ちなみに、講師の方は1日ずつ別れており、両日ともに海外生まれの現日本在住の方でした。

## 講義を受ける前に(反省点)
やってたらもっと効果があったな、と感じた私の反省点です。
- 講義の内容でご紹介した単語になじみがない方は、なるべく調べてから受講する
- Azureを操作できる環境または、HPの製品一覧を片手に受講する

https://azure.microsoft.com/ja-jp/

## 受講後の特典
- 試験AZ-900: Microsoft Azure Fundamentalsが無料で受けられる
講義終了から約5営業日後に無料特典のメールが届くそうです。（9/29に受講完了したのでまだ届いていない）
無料受験期間は**トレーニング受講後90日間**。
おそらく、受講する方の目的の一つではないでしょうか。

- 講義を受けた証明ができるようになる

## 感想
- Azureでできること、クラウドのメリットが良く分かった。
- あやふやだった用語が明確になった。（講義は思わぬところでの収穫があるので良いですね）
- インフラの視点を少し理解できるようになった。
- 良い機会なので、AZ-900試験を合格して自己成長をしようと画策。

## AZ-900試験対策
AZ-900を受けるに際し、以下を参考に学んでいこうと考えており、ご紹介を。

- [試験 AZ-900: Microsoft Azure の基礎](https://learn.microsoft.com/ja-jp/certifications/exams/az-900)
マイクロソフトのトレーニング（無料）
- [Microsoft Azure Fundamentals新試験にMSとお役所の公開教材で合格する方法](https://qiita.com/t_ymgt/items/141d2c13bd418b36def4)
合格までの方法の参考記事

- [Azure Fundamentals(AZ-900)：クラウドの概念について説明する「クラウドの定義」](https://qiita.com/fsd-jume/items/d033d7fe532f705c7b30)
試験内容の学習記事


以上、読んで頂きありがとうございました！
今後も自身の備忘録もかねて投稿をしていきますので、よろしくお願いします。
ユニークキーはNULL許容します（圧）

仕事でちょっと話題になったので、備忘録として残しておきます。

話題になったのはNOT NULLかNULLなのかという話題でした。

## キー制約について
データベースでは基本的に、以下のような3つのキー制約があります。

- PK(プライマリーキー、主キー制約）
- **UK（ユニークキー)**
- FK（外部キー)

今回はこのUKについてです。

## UK自体にはNULL制約はないよ
ユニークキー制約は、NULLを許容しNULL以外の値での一意制約をかける制約です。

https://www.javadrive.jp/mysql/table/index9.html

https://t-horikawa.hatenablog.com/entry/20090514/1242298642

従って、単純にUK制約だけ入れた場合はNULLを入れることができ、複数のレコードでNULL値を設定できます。

仮に、UKでNULLを許容したくない場合は、NOT NULL制約を入れる必要があります。

## NULLも含めて一意制約と扱うDBMS
実はNULLを重複させることができるか？についても、DBMSによって異なる。
これも注意する必要がある。

|  DBMS  |  NULLの重複  |
| ---- | ---- |
|  Oracle  |  ○  |
|  Mysql  |  ○  |
|  SQL Server  |  ×  |

## MYSQLでNULLを強要したくない場合の注意点。
NOT NULLは後で付与する必要があります。

https://qiita.com/msj/items/bca41a9769999ceda833

## 結論

- UK自体はNOT NULLではありません
- NULLを重複できるかは、DBMSによる。
- NULLを許容したくない場合は、NOT NULL制約をカラムに定義する必要がある
曖昧にしないためのDockerコンテナ内のディレクトリ構造(抜粋)について(Golang／PostgreSQL編)

　Dockerを更に使いこなすため、Dockerコンテナ内のディレクトリ構造を分析してみた。（Treeコマンドが使えないようで、使えるように設定するのも手間なので、すべてマニュアルでディレクトリをのぞきながら階層を記録した。）
　Dockerを使いこなすためには、どのディレクトリをバインドマウントさせるか？どのディレクトリをボリュームマウントさせるか？またどのディレクトリがパスが通っていてシェルスクリプト(.sh)を置くのに最適か、など、ローカル側のOSだけではなく、コンテナ側のディレクトリ構造の絵姿についてもある程度の理解が重要になってくる。
　なお、分析に当たってはLinuxのFHS(Filesystem Hierarchy Standard)の理解がとても重要になってくるが、このFHSについては他に良記事が沢山あるためそちらを参照願いたい。

:::note warn
下記ディレクトリは見やすくするためにアルファベット順にはしておりません。また、GolangとPosrgreSQLは通常別々のコンテナにインストールされることが多いかと思いますが、紙面の都合上、マージして記載しています。
:::

```
root@89ff808980e1:
 ├─bin
 ├─dev
 ├─go # --------------------------> Golangをインストールした場合に生成されるディレクトリ
 |  ├─bin
 |  |  └─sqlc (:file)
 |  ├─pkg
 |  |  ├─mod
 |  |  └─sumdb
 |  |    └─sum.golang.org
 |  |       └─latest
 |  └─src # ----------------------> バインドマウント
 ├─lib
 ├─media
 ├─opt
 ├─root
 ├─sbin
 ├─sys
 ├─usr
 |  ├─bin
 |  ├─games
 |  ├─include
 |  ├─lib
 |  ├─libexec
 |  ├─local
 |  |  ├─bin # ------------------> シェルを置くのに最適なディレクトリ（パスが通っている）
 |  |  ├─etc
 |  |  ├─games
 |  |  ├─go
 |  |  ├─include
 |  |  ├─lib
 |  |  ├─man
 |  |  ├─sbin
 |  |  ├─share
 |  |  └─src
 |  ├─games
 |  ├─include
 |  ├─lib
 |  ├─libexec
 |  ├─local
 |  ├─sbin
 |  ├─share
 |  └─src
 ├─boot
 ├─home
 ├─lib64
 ├─mnt
 ├─proc
 ├─run
 ├─srv
 ├─tmp
 ├─docker-entrypoint-initdb.d ---> 公式postgresqlをイメージに使用した場合に生成されるディレクトリ(バインドマウント)
 ├─etc
 |  └─postgresql ----------------> 公式postgresqlをイメージに使用した場合に生成されるディレクトリ(バインドマウント)
 |     └─postgresql.conf
 └─var
    └─lib
       └─postgresql　-----------> 公式postgresqlをイメージに使用した場合に生成されるディレクトリ
          └─data ---------------> ボリュームマウント(ここにDBのバイナリが格納されている)

```
これまではREADME.mdにメモがてら書き溜めていた情報を整理抽出し初投稿しました。
投稿するにあたって普段、様々な技術者さんからアドバイスをいただいており、支えてくださってる方々には感謝の念にたえません。
また、もし間違いなどがありましたらご指摘いただけますと幸いです。
S3上のファイルアクセス時にNo 'Access-Control-Allow-Origin' headerエラーが出た

# S3バケットへのCORS設定を行う
S3上に置いたファイルにhttpアクセスした際にCORSエラーが出てしまいました。

S3のアクセス権限設定を確認したところ確かにCORSの設定をしていなかったので、下記を参考に設定を行いました。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-configure-cors/

その後ブラウザで再読み込み。。。
あれ？まだエラーが出てる。

# サーバキャッシュ(CloudFront)もCORSが必要
で、調査してみたところ、CloudFrontを使っていたのでキャッシュが効いてしまっていました。
（CloudFormationで自動的にワークロードをインストールしていたのでCloudFrontを使っていることすら知らなかった）

ということで今度はこちらの記事を参考にCloudFrontのCORSの設定を確認。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/no-access-control-allow-origin-error/

・・・ん、問題ないぞ？

# サーバキャッシュなのでもちろんキャッシュファイルが存在する
そりゃそうだ。キャッシュファイル消さないと。。。
ってことで、CloudFront上の対象ファイルのキャッシュを削除したところ、うまく動くようになりました。

他者の作成したCloudFormationを使うときは、どんなワークロードなのかをよくよく確認しておかないとなぁ。。。
AWS Certified Cloud Practitionerを10日で取得した話

AWS Certified Cloud Practitionerに合格したので、勉強方法等まとめていきたいと思います。
ちなみに本番でのスコアは825/1000でした。

以下、参考までに私のプロフィールです。
・実務3年目のエンジニアです。主にWebアプリケーションを開発
・担当するプロダクトのインフラとしてはAWSを使用しているが、がっつり触ったことはない

# 勉強期間
大体10日ほどです。
一日2時間ほど、休日は4時間くらい勉強時間を確保して行いました。

# 使用した教材
#### ・図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書
まず、こちらの書籍に一周目を通し、AWSに関する概要的な知識を身につけました。
AWSに限らない汎用的な知識も丁寧に解説されているため、エンジニア以外の方にも最初の１冊としてかなりお勧めします！
ただ、これ一冊での合格は正直難しいですね、、
あくまで概要といった感じです。

#### ・【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集
https://www.udemy.com/course/aws-4260/
こちらは定番の問題集です。Udemyで購入できます。
・基礎レベル
・応用レベル
の2種類の難易度の問題が用意されています。
解説もとても丁寧なので

問題を解く
↓
解説を読む
↓
分からない単語を調べて知識をつける

のサイクルで勉強すればかなり合格に近づくと思います。(ちなみに、応用はかなり難しめなので得点低くても落ち込まずに！)
Udemyは頻繁にセールをやっているので、安いタイミングで購入しましょう！
私はほとんどの時間をこちらの問題集をやりこむことに使いました。
全問題3-4周位して、最終的な応用含む平均得点率は85%くらいでした。

#### ・AWS公式の問題集
こちらは問題が本番に近いので解いておくと良いです。

#### ・【AWS資格】無料WEB問題集＆徹底解説
https://aws-exam.net/clf/
こちらも知識の確認に使用させていただきました。
問題ひとつひとつにコメント欄があるので、有志の方が解説してくれていたりします。

# 本番試験のレベル、雰囲気
難易度的には、上記で紹介したUdemyの問題集の基礎と応用の中間くらいです。
紹介した教材をしっかりやりこんで落ち着いて解けば問題なく合格できるかと思います！
出題傾向ですが、AWS Well-Architectedフレームワーク周りの設問が多かった印象です。
直前に目を通しておくと良いかと思います。
また、問題文が翻訳っぽい日本語で読みづらいとよく言われていますが、私はそこまで感じなかったです。(改善されたのかも、、?)

時間には余裕があるはずですので、一通り解いたら見直しを入念に行いましょう！
問題同士がヒントになるパターンもあるので、拾える問題が増えるはずです！

テストセンターで受験したのですが、当日の案内もスムーズで環境も良くストレスは全くなかったです。
その場で合否が分かるので、すっきりした気持ちで帰ることができました。(詳細なスコアは後から送られてきます。)
systemd によるスクリプトの定期実行

最近 systemd を crontab 代わりに使うことが多かったが、 よく理解できていなかったので整理した
世間的に2種類のやり方が紹介されていたので、ごっちゃになっていた
## 方法1
目標は以下のようなミニマムな service を10秒ごとに実行することとする
```~/services/test.service
[Unit]
Description=test
[Service]
ExecStart=bash -c 'date >> /tmp/test.log'
Type=oneshot
[Install]
WantedBy=multi-user.target
```
これを10秒ごとに実行するために timer ファイルを作成
```~/services/test.timer
[Unit]
Description=test timer
[Timer]
OnUnitActiveSec=10s
[Install]
WantedBy=timers.target
```
これらを systemd に登録し有効化する
```
sudo systemctl enable ~/services/test.service
sudo systemctl enable ~/services/test.timer
```
この時点で再起動したら定期実行される
再起動しないで開始したい場合は
```
sudo systemctl start test.service
sudo systemctl start test.timer
```
と、どちらもstartしないといけない
1回目はservice自身が起動して、2回目以降はtimerの`OnUnitActiveSec=10s`にしたがって、前回の実行の10秒後に行われるという理解でいいだろう
前回の10秒後なので、`test.timer`だけ`start`しても実行は開始されない
### 方法２
方法１では`OnUnitActiveSec`の性質上１回目の実行がされなかったが`test.timer`の`[Timer]`のところに`OnStartupSec=1s`などと追加しておくと`test.timer`を`start`するだけでも定期実行が始まる
```~/services/test.timer
[Unit]
Description=test timer
[Timer]
OnStartupSec=1s
OnUnitActiveSec=10s
[Install]
WantedBy=timers.target
```
この場合は一回目を`test.service`自ら起動する必要がないので、 `test.service` の `[Install]` の項は削除しても構わない
```~/services/test.service
[Unit]
Description=test
[Service]
ExecStart=bash -c 'date >> /tmp/test.log'
Type=oneshot
```
`[Install]` が無い状態で `enable` すると以下のようなワーニングが出てくる
```
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,Alias= settings in the [Install] section, and DefaultInstance= for template units). This means they are not meant to be enabled using systemctl.
  
Possible reasons for having this kind of units are:
• A unit may be statically enabled by being symlinked from another unit's .wants/ or .requires/ directory.  
• A unit's purpose may be to act as a helper for some other unit which has a requirement dependency on it.
• A unit may be started when needed via activation (socket, path, timer, D-Bus, udev, scripted systemctl call, ...).
• In case of template units, the unit is meant to be enabled with some instance name specified.
```
`[Install]`がないから自動起動設定（enable）できないわけだ
なので、この場合は
```
sudo systemctl link ~/services/test.service
```
とするのが多分正しい……けど`enable`でもリンクは行われるので問題ないはず
`/etc/systemd/system/`以下に直接書いてる場合は何もしなくていい
ファイルを書き換えたら以下のようにして変更を反映させる
```
sudo systemctl daemon-reload
```
こちらの方法の場合timerをstartさせるだけで良い
```
sudo systemctl start test.timer
```
AWSのvpnで2トンネル設定する際の注意点


#### 前提
AWSのSite-to-Site VPNはデフォルトで2トンネルが用意される
Fortigateが2トンネル目を接続した瞬間にAWSからローカルへの疎通が取れなくなる
そこで常時2トンネルにならないように設定をする必要がある

#### VPNの設定
AWSのVPNの設定は[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/SetUpVPNConnections.html)をご覧ください。
もし、GUIからカスタムでいきなり設定して設定どおりにやってうまくいかない場合は、
一度サイト間で作ってからカスタムでコンバートするとうまくいくことがありますので、試してみてください。
GUIからでも十分設定可能です。
なお、付け加えるとすると、vdomグローバルのインターフェースの設定が公式ドキュメントの設定ファイルのダウンロードだと分かりずらいのですが、
要はグローバルvdomからVPNインターフェースにIPを設定し、pingで接続できるようにするだけです。
![aws-vpn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220924/46adf1f1-aa8c-49bc-708f-dd11524eb26e.png)

#### ここからおまけ
普通に2トンネルをアップするとAWSから疎通ができなくなるので、1トンネル目が生きてるときは2トンネル目をダウンさせておきます。
CLIかSSHでログインします。vdom運用の場合は該当のvdomで作業します。
````
config vpn ipsec phase1-interface
  edit "AWS-TEST2"
    set monitor "AWS-TEST1"
  next
end 
````
今回はわかりやすく1トンネル目をAWS-TEST1、2トンネル目をAWS-TEST2とし、AWS-TEST2のphase1-interfaceにmonitorでAWS-TEST1をチェックしろと設定をしております。
これで、1トンネル目が落ちると2トンネル目がアップします。

出典は[こちら](https://www.geekandi.com/2016/04/15/aws-vpc-vpn-dual-tunnel-w-fortigate-firewall/)
Gmail の URL でアカウントを指定する

# やりたいこと
* マルチアカウントでGmail（あるいは他のGoogleのサービス）を利用している場合に、URL でユーザアカウントを指定したい。
    * 例えば、ブックマークなどに使いたい

# GmailのURLは…
* Gmailにアクセスした際、ブラウザに返ってくる URL は、`https://mail.google.com/mail/u/0/#inbox` のような形式。
* この URL の数字の `0` の部分が特定のアカウントを指しており、ここを書きかえると別のアカウントに切り替わる。
* ただし、この数字は、特定のGoogleアカウントと恒久的に紐づけられているわけではない**らしい**（筆者は、数字とアカウントの割当が数ヶ月〜数年という時間経過の中で変化する経験をしていますが、実際のところ仕様がどうなっているのかは知りません。何かを誤認・誤解しているかもしれません）
* この数字以外の方法、例えばGoogleアカウントの文字列で指定して、固定 URL として使いたい。

# アカウント名の文字列で指定できます

* 以下のような URL で、`authuser` パラメータにアカウント名の文字列を指定することで、特定のアカウントで明示的にアクセスすることができます。
    * `https://mail.google.com/?authuser=foo@gmail.com`
    * `https://mail.google.com/#inbox?authuser=foo@gmail.com`

# おしまい
【Salesforce標準機能】ケースフィードのパブリッシャーにメールアクションが表示されない

# きっかけ

Trailheadの
「Service Cloud エージェントの生産性の[マクロとクイックテキストを作成してクリックを減らす](https://trailhead.salesforce.com/ja/content/learn/modules/service-cloud-agent-productivity/create-a-macro-and-quick-text?trailmix_creator_id=ashanmugam8&trailmix_slug=service-cloud)」
を解いていた際に、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/d5c5c673-502a-0f94-7800-d6ed1a1117a8.png)

と表示されているのに実際のプレイグランドでは、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/1ef8cee8-422c-031a-7f69-fd28c0f13fbf.png)

メールってアクションない！と困ってました




# 解決方法

結論、**ページレイアウトを編集** で解決できます。

パブリッシャーアクション　＝　パブリッシャーのクイックアクション（の認識で正しいはず、、、、）なので、クイックアクションにメールアクションを追加すればＯＫ！

[設定] > [オブジェクトマネージャ] > [ケース] > [ケースページレイアウト]


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/a46cd2df-eb1a-d1bb-845a-8dc5af0c19ad.png)

※　メール２つあるので注意

保存ボタンをおして、マクロビルダーのページに戻ると表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/83bc0407-32b4-769b-5e8a-c5ee7109a809.png)


## その他の解決方法

もしそれでも解決できない場合は以下の内容を確認するといいかもです！

* [設定] > [送信] > [アクセス権] で [すべてのメール] になっているか
* [設定] > [メールtoケース] > [編集] > [メール-to-ケースの有効化] にチェックがあるか
  注: メール-to-ケースを有効にすると、それを無効にすることはできません
* [設定] > [サポート設定] > [ケースフィードアクションおよびフィード項目を有効化] にチェックがあるか

# 参考
https://help.salesforce.com/s/articleView?id=000314897&type=1
Laravelでログイン機能を実装する






## 認証機能に必要なデータベースを準備する

- phpMyAdminから任意の名前でデータベース（スキーマ）を作成します。

![スクリーンショット 2022-09-30 11.28.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/196e30ce-1114-7c9d-0d5c-fa737f45c56a.png)

## プロジェクト内のファイルへデータベース情報を登録する

- プロジェクト直下.envファイル内部を作成したデータベースの情報に変更します

![スクリーンショット 2022-09-30 11.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/37fb6e14-af27-3cdf-3faf-8e6e21ec8dc8.png)


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=[指定されているポート番号]
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
DB_DATABASE=先ほど作ったデータベース名
DB_USERNAME=root
DB_PASSWORD=root

## .envファイルが見つからない場合

- 隠しファイルのため表示されていない場合には表示する必要があります
- macの場合 : `command + shift + .`

 windowsの場合
1. 「スタート」→「Windowsシステムツール」→「エクスプローラー」を選択
1. 「エクスプローラー」ウィンドウ左上の「表示」をクリックする
1. 「隠しファイル」のチェックを外す
![スクリーンショット 2022-09-30 11.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/8c941370-3554-e17e-39a0-9506ded40c65.png)



## 認証機能を実装するコマンド

コマンドを実行していくことでブラウザに表示するためのHTMLや
データベースのテーブルが作成されます

### (1) composerでパッケージをインストールします

- composerはPHPのライブラリのインストールや削除を簡単に行えるツールです
- `composer require`はライブラリを追加するコマンドです。
- Laravel UIは認証周りの機能の雛型を生成してくれるLaravel公式のライブラリです 
-  "1.x" で最新版がインストールされます
```php5
composer require laravel/ui "^1.x" --dev
```

### (2) Artisanコマンドでログイン機能を実装します
- JavaScriptの「vue.js」でログイン機能を作ります
- authとは「authentication」の略で認証という意味です
```
php artisan ui vue --auth
```

### (3) npmをインストールします

- npm とはNode.jsのパッケージを管理するシステムです
- npmからパッケージインストールで依存関係のパッケージを一括インストールします
- Node.jsとはJavaScriptコードを動かすためのプラットフォーム（実行環境）
- JavaScript単体ではOSの機能（ファイル読書きなど）ができないためNode.jsが必要

```
npm install
```
### (4) npmをインストールします

- `npm run <スクリプト名>` でそのスクリプトを実行するLaravel独自のコマンドです。
- run は run-script の省略形 で`npm run-script <スクリプト名>`でも同様の結果になります
- Laravelプロジェクトの中のpackage.jsonに記載されている"dev"を呼び出します
- ブラウザに表示される認証画面にスタイルが適用されます。

```
npm run dev
```

### (5) データベースへログイン情報を管理するテーブルを作成します

- 必要なテーブル名を記述したマイグレーションファイルは上記手順で作成済みです
- マイグレーション操作を実行すると連動するデータベース画面へテーブルが作成されます

```
php artisan migrate
```
### (6) 実際にブラウザ画面を確認

- 以下のアドレスにてログイン画面が表示されているか確認します
- ログイン: http://localhost:8888/[プロジェクト名]/public/login
- 登録: http://localhost:8888/[プロジェクト名]/public/register
kaggle 日記① titanic 演習

はやたすさんの動画を見ながら kaggle コンペの titanic を始めました。

リンク : https://www.youtube.com/watch?v=F3D75T_wW4w&list=PL4Y-mUWLK2t0Vy2sUIXK3ItMX0s7CvoB_&index=1
SAP Gui install時のログ

SAP Guiをインストールした際のログは以下に出力される。
>%PROGRAMFILES%\SAP\SAPSetup\Setup\LOGs
>ex.  C:\Program Files (x86)\SAP\SapSetup\LOGs

エラーが出た場合は以下にエラーが出る
>%PROGRAMFILES%\SAP\SAPSetup\Setup\Errors
>ex.  C:\Program Files (x86)\SAP\SapSetup\Errors


Guiのインストールエラーの際はこのログを見ると対応できそう。
Next.js with-cypressでテキストエディタのインポート文自動挿入が動かなかったから対処した

```shell
npx create-next-app@latest --example with-cypress hoge
```
して開発始めたらcypress/e2e/app.cy.tsの中でテキストエディタのインポート文自動で書いてくれるやつが動かなくて焦った

### 解決方法
```shell
rm cypress/tsconfig.json
```
したら解決した
けどほんとうにこの方法で問題ないのかはわからない・・・。
DevOps Centerの質問のまとめ

[DevOps Center まとめに戻る](https://qiita.com/Keiji_otsubo/items/3969e9a6c09cf727a4d9)


+ [翻訳が DevOps プロセスに含まれるかどうか知っていますか?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000K0F2OSAV)
メタデータ カバレッジ レポートを見て、「翻訳」でフィルター処理すると、ソース追跡がサポートされているメタデータ タイプが表示されます。つまり、DevOps Center で自動的に追跡する必要があります。

https://developer.salesforce.com/docs/metadata-coverage/56

+ [「コンポーネントを手動で追加」で RecordType を追加できないのは正しいですか?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDqBnSAL)

これは間違いなく、このようにエラーになると予想される動作ではありません。オープン ベータ バージョン 4.3 を使用しているか、クローズド ベータ バージョンを使用しているかをお知らせください。 

+ [メタデータと環境設定のベスト プラクティス](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Jda8l)

プロダクション メタデータを GitHub にバックアップしておくことは間違いなくベスト プラクティスです (または、実際には任意の git ベースのリポジトリ システムですが、GitHub が現在サポートされています!)。

+ [カスタム メタデータのインポート時に変更を検出する方法は?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Jdr11)

あなたの組織はパッケージのバージョン 3.3 を実行しているように見えるため、サポートされていないことに気付きました。オープン ベータ版のリリース以降、これに関するいくつかのバグを修正しました。オープン ベータ版をインストールして 4.3 にアップグレードし、そこから再試行することをお勧めします。WI とプロジェクトはそのまま残るため、データが失われることはありません。 

+ [マージとプロモーションが機能せず、エラーが発生します。](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J8RhSSAV)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/955e9453-bfda-d83b-f1e1-2a7fa9d73b22.png)

+ [バンドルから作業項目を削除する](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdqW6SAJ)

すべてのパイプライン環境（およびGitHubブランチ）が本番環境と一致しない（選択リスト値が利用可能である）ように、バンドル段階までのみそれらを展開し、その後、それらを削除する追加の新しい作業項目がそのバンドル段階に昇格します。バンドル段階に達すると、そこにある正味の変化は 0 になり、私たちが気に入っている副作用は、すべての開発環境も同期されることです。 

+ Could not retrieve the username after successful auth code exchange. Due to: Bad_OAuth_Token

 [Unable to commit changes](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000K0SrX)
 Check if 'API Enabled' on profile level.  https://help.salesforce.com/s/articleView?id=000327326&type=1  

+ Workitems having same metadata are stuck in Staging

[Workitems having same metadata are stuck in Staging](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEYtNSAX)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e742c782-8bd4-b97c-3655-a11d04387be1.png)

ソースブランチの重複するxmlエントリを削除し、その変更を直接コミットしてから、もう一度昇格を試みることです. これにより、重複の問題が解決され、作業項目をパイプラインからクリアできるようになります。

+ Environment Out of Sync
 
[Erroneous Error: Environment Out of Sync - Changes were merged to this stage’s branch outside of DevOps Center.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdwuOSAR)
いくつかの異なる顧客でこのエラーが時折見られますが、実際にはそうではないのに、ユーザーがブランチをマージしていることを DevOps Center が検出する理由については不明です。当面の修正は、昇格の準備ができたらブランチを手動でマージし、必要に応じて WI を昇格させることです。 

+ [GitHub 組織アクセスの設定に関する質問](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Je0kY)


# 調査中

+ [ファイルをコミットできません](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdhWz)

# まだ機能は提供されていない

+ [作業項目を複製できるようにするロードマップ項目はありますか?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdwZf)
Azure Databricks の IP アクセス リスト機能の設定方法

## IP アクセス リストとは
Databricks の [IP アクセス リスト](https://learn.microsoft.com/ja-jp/azure/databricks/security/network/ip-access-list)は**ワークスペースへのアクセスを IP で制限する機能**です。
Azure Databricks ではワークスペースのパブリック アクセスを禁止し、プライベート エンドポイントからのアクセスのみを許可することが可能ですが、パブリック アクセスを必要とし尚且つ IP 制限をしたい場合に IP アクセス リストが役立ちます。

<img width="550" alt="スクリーンショット 2022-09-23 14.00.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/b44259f9-351b-2019-8e19-a9858323dac3.png">

## 設定方法

IP アクセス リストの設定方法について説明していきます。

### 1. アクセス トークンの発行
Databricks ワークスペースのユーザー設定画面にて [Generate new token] をクリックします。

![スクリーンショット 2022-09-29 22.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/9bc9647b-2341-1331-37a9-f56b94a2c732.png)

[Comment] に任意の値を入力し [Generate] をクリックします。

<img width="550" alt="スクリーンショット 2022-09-23 14.00.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/b044d06a-5241-2d55-3fe4-3f213ba16e77.png">

発行されたトークンをコピーしておきます。

<img width="550" alt="スクリーンショット 2022-09-23 14.00.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/5d72862a-c9a4-9bd4-82d1-2604ec4a6763.png">

### 2. 機能の有効化
以下のコマンドで IP アクセス リストを有効化します。

```console
$ export TOKEN="<手順1で発行したトークン>"
$ curl -X PATCH -H "Authorization: Bearer $TOKEN" \
  https://adb-XXXXX.XX.azuredatabricks.net/api/2.0/workspace-conf \
  -d '{
    "enableIpAccessLists": "true"
  }'
```

以下のコマンドで有効化を確認できます。

```console
$ curl -H "Authorization: Bearer $TOKEN" \
  https://adb-XXXXX.XX.azuredatabricks.net/api/2.0/workspace-conf?keys=enableIpAccessLists
```

レスポンスは以下となります。

```
{"enableIpAccessLists":"true"}
```

### 3. IP 制限の実施
以下のコマンドで IP 制限を設定します。

```console
$ curl -X POST -H "Authorization: Bearer $TOKEN" \
  https://adb-XXXXX.XX.azuredatabricks.net/api/2.0/ip-access-lists \
  -d '{
    "label": "home",
    "list_type": "BLOCK",
    "ip_addresses": [
      "1.1.1.1/32"
    ]
  }'
```

成功すると以下のレスポンスが返ってきます。

```
{
    "ip_access_list": {
        "list_id": "dff68424-e34e-40ba-8e64-27cf2ad03755",
        "label": "home",
        "ip_addresses": [
            "1.1.1.1/32"
        ],
        "address_count": 1,
        "list_type": "BLOCK",
        "created_at": 1664458864990,
        "created_by": 379975931503837,
        "updated_at": 1664458864990,
        "updated_by": 379975931503837,
        "enabled": true
    }
}
```

なお、制限対象に自分の IP アドレスが含まれると失敗し、以下のレスポンスが返ってきます。逆に、許可対象に自分の IP アドレスが含まれていない場合でも失敗します。

```
{
    "error_code": "INVALID_STATE",
    "message": "Your current IP 1.1.1.1 will not be allowed to access the workspace under current configuration"
}
```

### 4. 動作確認

制限された IP で Databricks ワークスペースにログインを試みると、以下のエラー画面となり失敗します。

<img width="550" alt="スクリーンショット 2022-09-23 14.00.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/cc263dbe-a362-192b-d44c-356453b30b6e.png">


## 参考
https://learn.microsoft.com/ja-jp/azure/databricks/security/network/ip-access-list
【夏休み企画】#IT用語一問一答【毎朝投稿27日目】URI

# この記事を読むと、、
- 「関連用語」を使って「URI」を説明できるようになる
- 「URI」がもっと好きになる(多分)

# 関連用語
URL / URN / ABNF

[**復習用**] 記事の内容を見る前に上記の言葉で「URI」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/c560d9722764ad7cfa3b

# URIとは
URI = Uniform Resource Identifier = 仮想的なもしくは物理的な物を識別するための文字列

- URIを場合によってURLやURNと呼ぶこともあったが技術標準ではそれらの用語は使われなくなった
    - cf. **URL** = Uniform Resource Locator = リソースの場所を示すURI
    - cf. **URN** = Uniform Resource Name = 場所に依存しない名前を示すURI

- URIの構文をABNFで表すと以下の通り
    - cf. **ABNF** = Augmented Backus–Naur form = 拡張バッカス・ナウア記法
```
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part = "//" hier-part path-abempty
                  / path-absolute
                  / path-rootless
                  / path-empty

authority   = [ userinfo "@" ] host [ ":" port ]
```
- path-*は例えば`/path/to`みたいなの (ちゃんとした定義は[ここ](https://www.rfc-editor.org/rfc/rfc3986#appendix-A)をみてね)
- userinfoはschemeごとで様々
    - ex. https://**user:password**@www.rfc-editor.org/rfc/rfc3986
- fragmentは指定したセクションまで自動でスクロールしてくれたりするあれ
    - ex. htt<span>ps://www.rfc-editor.org/rfc/rfc3986#**appendix-A**

# 参考資料
- https://en.wikipedia.org/wiki/Uniform_Resource_Identifier
- https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form
- https://www.rfc-editor.org/rfc/rfc3986
【Salesforce】本番リリース対応内容(変更セットのコンポーネント100件以上)

レアケースなので記録。

# 条件
・定時後リリース
・コンポーネント数100以上
・プロファイルも一緒にリリース

# 事前準備

・同じ環境を触ってる担当者にどんな項目を作ったか、影響は無いか確認する
・お客様にリリース時間を連携する
・お客様にリリース予定のデータ（CSVファイル等）があれば確認してもらう
・開発環境にてテストクラスをすべて走らせておく
・本番環境の対応一覧、本番環境への変更セット一覧を作成する

# 変更セット作成

・コンポーネントの権限周りを確認する
　→コンポーネントが多数の場合、プロファイルも一緒にリリースすることも考える
・既存レコードに影響がないか確認する
　→トリガ系が多い
・デグレを確認する
　→本番環境と開発環境のコードをWinMergeなどで確認する
・変更セットを作成する
　→リリース日より前に作成しておく

# テスト環境リリース

・本番環境へのリリースの前にSandboxを作成して、テストリリースする
　→アップロードしてみないとテストクラスが通るかわからない
・テストクラスの調整やリリース前に本番環境での対応内容などメモしておく
　→開発環境では不要になった入力規則だったが、本番環境で存在していたため、エラーになったりした

# 本番環境リリース前準備（1時間くらい）

・関係者各所にこれからリリースすることを伝える
・バックアップ用のSandboxを作成しておく（1カ月～半年など期間を決めておく）
・バックアップを取得する
　→VSCODEでApexやVFを一括取得、スクショ、メタデータ等活用
　→このタイミングじゃなくてもいいかもしれない。お客様からの修正依頼を期間決めれば、もう少し前の段階で対応可能
・本番環境の事前準備を対応する
　→入力規則を止めたり等

# 本番環境リリース（1時間くらい）

・開発環境から本番環境へ変更セットをリリースする
・テストクラスなどでエラーが発生した場合、修正する
　→この場合、アップロードした変更セットを再度アップロードするのではなく、コピーする
　→エラーが発生しなければ30分くらいで終わる

# 本番環境の対応（1時間くらい）

・変更セットでのリリースがややこしいものを手動対応
　→アクセス権エラーが出たレポートなど
・レコード新規作成・更新対応
　→お客様に確認してもらったデータをデータローダ、インポートウィザードなどで作成する
　→当リリースに影響があるレコードも対応する
　→上記で対応したCSVファイルやsuccess、errorデータは後々確認することがあるので取っておく

# できる限りの本番テスト（1時間くらい）

・プロファイルの権限周りを確認する
　→項目レベルセキュリティ
　→Apex
　→Visualforce ページ
　→カスタム設定
　→タブ
　→レコードタイプ
　→ページレイアウトの割り当て
　→オブジェクト権限
・代理ログインなどでレコードや項目が見えるかどうか確認する

# 本番リリース完了

・お客様が確認できるようなコンポーネントがあれば一覧にする
　→レポートなど
・関係者各所にリリースが終わったことを伝える

# リリース後対応

・不要になったコンポーネントの削除日をスケジュールする
　→残せるものは残して、大丈夫そうなら削除する
・資料を更新する

# 悪かったところ

・営業中にリリースするとお客様に支障が出るので定時後にリリースしたが、頭がうまく回らなかった
　→遅番にする、リリース前にちょっと寝るなどして体力を温存しておく
・本番環境へリリースしたらテストクラスでエラーが発生した
　→テストクラスをチェック後に緊急で対応したものが影響していたので、リリース前に再度
・当初3時間くらいでリリース時間を見積もっていたが、4時間30分ほどかかってしまった
　→次回に大型リリースがあった場合、当投稿を見直す
・バックアップ用のSandboxを作成しておく
　→txtでバックアップとっても復元まで時間がかかるため、Sandboxに余裕があるのであれば活用する。

# 良かったところ

・事前に作成した本番環境の対応一覧、本番環境への変更セット一覧が役に立った
　→人間は忘れる生き物なので、メモ大事。当日は作成した資料を元に対応する
・テスト環境へリリースしたことで当日の不安を軽減できた
　→コンポーネントが多ければ多いほどエラーが出た時の影響が大きい
・このようにメモしておくことによって未来の自分が助かる
　→ありがとう