OmniAICreator/Qiita-1.07M huggingface dataset:
SourceTree（ソースツリー）| checkout（チェックアウト）| ブランチを切り替える

## checkout（チェックアウト）とは
Git：ブランチを切り替える
英語：宿泊施設の退館手続き、物品の貸出手続きなど
## SourceTree のやり方
### ローカルブランチ
ブランチをダブルクリック
### リモートブランチ
リモート>origin>「対象のブランチ名」
▼
右クリック
▼
「"origin/対象のブランチ名" をチェックアウト」クリック
▼
デフォルトのまま「OK」クリック

## コマンドのやり方
```
git checkout ブランチ名
git checkout -b ブランチ名 //ブランチの作成とチェックアウトを同時に行う
git checkout -f ブランチ名 //ブランチを強制的に切り替える
```
## 参考
- [【Git入門】チェックアウト(checkout)とは？使い方を基礎から解説！](https://www.sejuku.net/blog/71457)
- [【SorceTree】リモートブランチのチェックアウト【ブランチの切り替え】](https://yu-report.com/entry/sourcetreecheckcout/)
iOS + Swift + クオータニオンで角度の差の計算

角度の差を速く正しく計算するためには、クオータニオンを使うと良い。


角度の差　を計算してオイラー角に変換する
```
import Foundation
import SpriteKit
import SceneKit

struct QuaternionToEullerAngleDifferential{
    static func handle(base : simd_quatf, target: simd_quatf) -> SCNVector3{

        return convertToEuller(simdq: 
simd_normalize( target * base.inverse)　// 角度の差
)
    }
    
    static func convertToEuller(simdq: simd_quatf) -> SCNVector3{
        let n = SCNNode()
        n.simdOrientation = simdq
        return n.eulerAngles // オイラー角にする
    }
    
}

```

コードの解説
もとの行列に逆行列をかけると、角度の差がでる
ScineKit にオイラー角への変換ライブラリがあるのでそれでオイラー角にする。
Ping監視サーバを作る

## はじめに

サーバを複数台運用をしているが、先日サーバが落ちていたのを数日間気づかないことが起きました。そこで自作のping監視をシェルスクリプトで作成、cronに登録し、定期的に実行、異常があればSlackに通知するようにします。

## シェルスクリプト作成

今回はホームディレクトリに `ping_monitoring` ディレクトリを作成し、その下に3のファイルを作成します。

- server_list：宛先IPアドレス記入用
- log：ログ出力用
- ping.sh：pingを送信用

server_listには以下のように行ごとに宛先IPアドレスを記入します。

```
192.168.1.1
192.168.1.2
```

ping.shに以下のスクリプトを書きます。

```bash
#!/bin/bash

server_list=~/ping_monitoring/server_list
log=~/ping_monitoring/log

for server in $(cat $server_list)
do
ping $server -c 1 > /dev/null
case $(echo $?) in
0)
echo $(date +%F" "%T && echo $server && echo "OK") >> $log
;;
*)
echo $(date +%F" "%T && echo $server && echo "NG") >> $log
$(curl -d "text=$server NG" -d "channel={チャンネルID}" -H "Authorization: Bearer {Slackトークン}" -X POST https://slack.com/api/chat.postMessage)
;;
esac
done
```

最初にファイルを変数に代入しています。

server_listに書かれている宛先IPアドレスをfor文で回して、pingを飛ばします。出力先が `/dev/null` なのでここでは特に何も起きません。

case文の `$?` でpingの実行結果を取得します。ここで成功（サーバが正常）の場合は `0` の処理が、失敗（サーバが異常）の場合は `*` の処理が実行されます。

pingの成功、失敗にかかわらず実行結果をlogファイルに追記します。失敗時のみSlackに通知がいくようにしています。

スクリプトを書き終えたファイルに実行権限を付与して、実行します。

```
chmod +x ping.sh
./ping.sh
```

正常に動作したら定期実行できるようにcronに登録します。

## cronに登録

`crontab -e` のコマンドを打ち以下のように書きます。

```bash
*/1 * * * * ~/ping_monitoring/ping.sh
```

`crontab -l` で登録したcronを確認できます。登録したものが確認できれば1分ごとに実行されます。

[crontabのガイドライン](https://qiita.com/onomame/items/71646c5517a39bcd01cc)

## おわりに

比較的、簡単に実装することができましたが、[Zabbix](https://www.zabbix.com/jp)を使用することになったのでこちらの使いみちはなくなりました。

## 参考文献

https://techlive.tokyo/archives/2494

https://prograshi.com/general/command/crontab-trouble-shooting/

https://api.slack.com/tutorials/tracks/posting-messages-with-curl
PHP evalでハマった

レガシーコードの**eval**でハマり散らかしたので共有。

例えばこういう関数を定義して・・・
```php
function foo($code, $val) {
    $res = eval($code);
    echo $res . PHP_EOL;
}
```

普通に呼び出す。
```php
//出力したい文字列
$val = "Hello World";

//evalで実行するPHPコード(※再現するためにエスケープして埋め込んでます)
$phpCode = "echo \$val;";

foo($phpCode, $val);
```
```shell
Hello World
```

普通に動く。

## ここからが本題

静的解析で未使用のパラメータがありますって言われるので、消すと・・・
```diff_php
- function foo($code, $val) {
+ function foo($code) {
      $res = eval($code);
      echo $res . PHP_EOL;
  }
```
```shell
PHP Notice:  Undefined variable: val in /file/path/index.php(7) : eval()'d code on line 1

```

何も出力されないという罠。
evalは文字列をPHPコードとして実行するので、文字列として埋め込まれた変数までは当然解析で追えない。

## まとめ
デバッグが難解なレガシーコードはマジで怖いです。
PHPマニュアルにも危険って書いてあるし、使わなくても開発できる場面しか思い浮かばないので今後使うことは無さそう・・・。

https://www.php.net/manual/ja/function.eval.php
プログラマーを目指す前に、そもそもの脳の使い方を把握しておいた方が良さそう

プログラミングとは...

- 抽象化し
- 要素を分解し
- 論理に置き換える

という3つのステップが必要になる（と個人的には思っている）。実は、こういう能力は、日常の中で無意識に使っている人と使っていない人で差が出てくる、というのを妻との会話で気がついた。何気ない日常の行動の中で、プログラミング的な思考をしている自分と、そうでない妻との話を簡単にまとめてみます。

## 非プログラミング的な記憶と行動

### なかなか道を覚えない妻

3月に引越したのだが、ある日妻が車の運転をする際に「未だに道が良くわからない」「どっち行ったら良いの？」と言われ驚愕した。何度も私の運転する車の助手席に乗って、見ているのにも関わらずである。

### 妻はどうやって道を覚えるのか？

色々とヒアリングした結果、以下のように道を覚えるらしい

- 1度カーナビや他人にナビしてもらいながら運転をする
- 曲がるポイントや、道の風景画像を記憶する
- 過去の運転した画像記憶や、運動記憶を参照する
- 上記を繰り返す事で、画像と画像の位置関係をマッピングする

ということらしい。なので、妻に「道順を教えて」というと、覚えた画像を説明されるのである。

###  妻の頭の中
昔住んでいた金沢文庫→海の公園のルートの記憶方法はこんな具合らしい

※現地地図詳細
![Screenshot from 2022-07-12 13-14-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/c7d946e7-a72e-fdaf-773b-6d42620c0872.png)

曲がる場所の風景
![Screenshot from 2022-07-12 13-11-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/e2d3499b-4c55-7a9f-03b3-85c8ca14893a.png)

まっすぐ行くとローソンが見えてくる
![Screenshot from 2022-07-12 13-15-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/fd9848db-afc3-9344-5af9-d3ca9919ffd2.png)



他にも、学生時代のテストの問題の解き方を聴くと「教科書が頭の中にあって、それを読んで対応した」と言っている。圧倒的に画像記憶である。

## どちらかと言うとプログラミング的な記憶と行動

### 自分の道の覚え方

- ざっくり、大きな道路と、スタート地点、ゴール地点の位置関係を抽象化する
- 以下の3つに分類する
    - スタート地点→大きな道への移動
    - 大きな道→ゴール付近の大きな道の移動
    - ゴール付近の移動
- 重要なポイントでの論理を覚える
    - 例：踏切を超えた次の交差点を右折
    - 例：○○の看板が見えたら左折
    - 例：まっすぐ突き当りを左折
   
昔住んでいた金沢文庫→海の公園のルートの記憶方法はこんな具合に脳内に記憶される

※現地地図詳細
![Screenshot from 2022-07-12 13-14-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/c7d946e7-a72e-fdaf-773b-6d42620c0872.png)

自分の頭の中
![Screenshot from 2022-07-12 13-28-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/96fcf65e-54de-1478-f57b-1c15fd471b6f.png)

※曲がるポイント注意の所に具体的なロジックを入れていく。(緑の道が見えたら曲がる、まっすぐ行ってローソンが有る道なら正解、等)


## 脳の使い方は人それぞれで得手不得手がある

前述した、記憶の方法、実はどちらも利点欠点有り、また人それぞれだと思う。が、少なくともプログラミングをする上で画像記憶術に頼っているとプログラミングという点では余り強さを発揮しないと思われる。実際問題妻はプログラミング等はそこまで得意ではなく、エクセルの関数の作り方等でたまに助けを求めてくる。

一方で、自分は画像記憶などは弱く、絵を書いたりするのが苦手。絵のバランスが崩れていても違和感を感じないのだ。

## 自分の脳の使いやすい筋肉は本当にプログラマー向きか？

いずれにせよ、脳の使い方は誰かに教わったわけでもなく、意識してやっているわけでもなく、なんとなく「自分流」なのだ。その結果、不向きな仕事の選択をした場合、普段使わない"脳の筋肉"を使うことになり、苦痛を感じてしまうことは容易に想像が付く。

例えば子供にプログラミングを教える場合、プログラマーを目指すというキャリア選択をする前に、普段どんな脳の使い方をしているのか、例えば道を覚えるといった日常の作業を言語化し、自分の脳の筋力がプログラマー向きか把握しておいても良いかもしれない。
初心者による初心者のためのJavaScript基礎１【変数】

# 目次
[1. 変数](#1-変数)
&emsp;[1-1. const](#const)
&emsp;[1-2. let](#let)
&emsp;[1-3. var](#var)
&emsp;[1-4. 変数定義の使い分け](#変数定義の使い分け)
[2. console.log](#2-consolelog)
[3. テンプレートリテラル](#3-テンプレートリテラル)
[4. JavaScript基礎シリーズ](#4-javascript基礎シリーズ)
[5. 参考記事](#5-参考記事)


# 1. 変数
変数定義のキーワードとして、`const`、`let`、`var`の3種類があります。
それぞれ次のような特徴があります。

## const
constには再代入不可、再定義不可という特徴があります。
```js
const name = "Qii太郎";

name = "Zenn次郎"; //エラー　再代入×

const name = "はてなブ郎"; //エラー　再定義×
```
:::note info
constの特徴
再代入　×
再定義　×
:::

## let
letには再代入可、再定義不可という特徴があります。
```js
let age = 25;

age = 35; //OK 再代入○

let age = 18; //エラー　再定義×
```
:::note info
letの特徴
再代入　○
再定義　×
:::

## var
varには再代入可、再定義可という特徴があります。
```js
var language = "PHP";

language = "Ruby"; //OK 再代入○

var language = "Java"; //OK 再定義○
```
:::note info
varの特徴
再代入　○
再定義　○
:::

## 変数定義の使い分け
3種類もあるけどどれを使えばいいの？
よくわからないから全部`var`でいいんじゃないの？

となりますが、現在は`var`を使うことは推奨されていません。
変数が簡単に書き換えられると意図しないバグの温床となるためです。
じゃあなぜ`var`が存在するのかというと、元々`const`や`let`がなく`var`しか存在しなかったからです。
`var`は過去との互換性のために残っているようです。
基本的には`const`で定義して、やむを得ない場面では`let`を使用し、`var`は使用しないという方針が良さそうです。
以下の記事が参考になりました。（コメント欄も参考になります）

https://qiita.com/taiju_suzuki/items/49ed558bd837452353b8

# 2. console.log
`console.log`はブラウザのコンソール上にメッセージを表示することができる関数です。
コンソールはデベロッパーツール（検証モード）を使用することで確認できます。
Chromeのデベロッパーツールは【command + option + i 】（Windowsでは【Cntl + alt + i 】）のショートカットで起動できます。（右クリック→「検証」でも同様）
![スクリーンショット 2022-07-11 4.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/5c8a5fd1-f703-d94d-a26a-1bd828d20e55.png)
引数に値を渡すとその値が表示されます。
文字列は`'`（シングルクォーテーション）か`"`（ダブルクォーテーション）で囲む必要があります。
```js
console.log("Hello world");
//出力結果 : Hello world

console.log(35);
//出力結果 : 35
```
変数を渡すこともできます。
```js
const name = "Qii太郎";

console.log(name);
//出力結果 : Qii太郎
```
`console.log({変数名})`と記述することで変数名と値を表示することもできます。
```js
const name = "Qii太郎";
const age = 35;

console.log({name}); //出力結果 : name: "Qii太郎"
console.log({age});  //出力結果 : age: 35
```

# 3. テンプレートリテラル
値や変数は`+`で結合することができます。
```js
const name = "Qii太郎";
const age = 35;

console.log("私の名前は" + name + "です。年齢は" + age + "歳です。");
//出力結果 : 私の名前はQii太郎です。年齢は35歳です。
```
テンプレートリテラルという方法を使うことで、文字列の中に変数や式を埋め込むことができます。
テンプレートリテラルは`` ` ``（バッククォート）で囲んで使用します。
変数や式は`${変数}`、`${式}`このように記述します。
```js
console.log(`私の名前は${name}です。年齢は${age}歳です`);
//出力結果 : 私の名前はQii太郎です。年齢は35歳です。

console.log(`私の名前は${name}です。年齢は${20 + 15}歳です`);
//出力結果 : 私の名前はQii太郎です。年齢は35歳です。
```

# 4. JavaScript基礎シリーズ

1.変数　←今ここ
[2. 配列・条件分岐・繰り返し　](https://qiita.com/katao_eng/items/6b43d049307a1bc09750)
[3. 関数](https://qiita.com/katao_eng/items/eedfa502eacf770c39fd)

# 5. 参考記事
[JavaScriptでvarが非推奨な理由を整理してみた](https://qiita.com/taiju_suzuki/items/49ed558bd837452353b8)
[console.log(); しか使えなかった自分へ。。。](https://qiita.com/ashketcham/items/06e50b3f7f6238d9b51b)
[console.log(コンソールログ) とは？console.log()を使いこなそう！超初心者のJavascriptの勉強](https://programmer-life.work/javascript/console-log)
[JavaScript | テンプレートリテラルを使って文字列を表す](https://www.javadrive.jp/javascript/string/index5.html)
Microsoft365エクセルでセル内編集中の自動入力（オートコンプリート）をしないように設定

# 概要

下記のようにちょっと入力するだけで、別セルの値が入るのがわずらわしい時。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c63f16a3-b925-a6cc-e951-910b2421d4c6.png)
本当は『おせんべい』って入力したいのに、『お』と入力すると別セルの『おいーっす』が入って誤入力しそうになる…。


# やり方

ソフトウェア単位で設定可。
（ファイル単位ではない）

左上。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/177163f8-fd2b-4c6a-08b1-c7489390754e.png)

左下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9af53835-77b0-d683-aee8-bd99000adee9.png)

詳細設置⇒オートコンプリートを使用するのチェックを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4e1ced63-659e-3d4f-883a-091b5230c36a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/dd52cf11-b61b-dc85-77bd-3090ad014cbe.png)


# 参考サイトさん

https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=4111-2100&rid=282

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Excel for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット
[PowerApps]アプリの名称を一覧画面で変更しても反映されない件について調査してみた

# あらすじ
- 後輩「一覧画面からアプリ名を変更しても、アプリ実行時に変更が反映されないんです・・・」
- 私　「ちょっと調べてみるから待たれい」
# いざ検証
本検証に用いたPowerAppsのバージョンは 3.22064.10 となります。
もしかしたら今後仕様が変わるかもしれませんのでご注意ください。

まずは検証用アプリ「アプリ名変更テスト1」を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/eaeb1a72-a993-88d5-acb6-173f0aa9dd24.png)
実行してみてアプリ名が「アプリ名変更テスト1」となっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/80d6eed7-fd61-80d8-5229-9dc974f81298.png)
### 一覧からアプリ名を変更してみる
設定を開いて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/d23832e5-44e0-be3f-69b8-f513f87129f6.png)
アプリ名を変更して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/488616d0-6588-9f58-1cb4-5b6a6308ba85.png)
反映された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/f1ebfa07-22fc-e80e-b8e7-8b2bf809e6b6.png)
さて、これで実行してみよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/76c67836-b7f2-e4e1-3318-3b6d6c1b0c0d.png)
アプリ名が反映されていない・・・。

では、編集モードで開いてみて、アプリ名を見てみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/653c53b9-04db-b69c-dea1-da83deb12049.png)
ちゃんと反映されてるね。

### 編集モードでアプリ名を変更してみる（公開はしない）
編集モードで「アプリ名変更テスト3」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/6b026bce-c88c-b71e-08b8-9673dbc60140.png)
そしてアプリを保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/ee710636-2d67-1b06-41cc-fcc59f9f666b.png)
この時点で一覧のアプリ名は変更されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/eb6a5896-fc9d-361a-27c2-6146fcef2abe.png)
この状態でアプリを実行してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/5724ec6d-a774-a56f-6d17-cc44623914ff.png)
やっぱり初回の「アプリ名変更テスト1」のまま

### アプリを公開してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/ba114f8a-2471-e06b-bfe1-50d5d55a1827.png)
一覧から実行すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/57475dc2-44dd-8a64-dd53-3f18ef0a6923.png)
<font color="Red">反映されてた！！！</font>
# 結論
アプリ名を反映させるためには「公開」が必要
- Point
  - アプリ一覧に表示されるアプリ名は、公開・未公開に関わらず最新のアプリ名が使用される
  - 実行時に表示されるアプリ名は、公開した時のアプリ名となる
プログラマーの第四の美徳

Larry Wallが提唱したプログラマーの三大美徳（the three great virtues of a programmer）は以下の３点です。
1.怠慢(Laziness)
2.短気(Impatience)
3.傲慢(Hubris)
（詳しい日本語記事 https://moneyforward.com/engineers_blog/2016/02/08/engineers-virtue/ ）
 
これに排他的の追加を提案したい。

4.排他性（Exclusiveness）
定義され配分された仕事の枠の内外を意識し、その枠を超えての規定外の相互干渉を極力排しようとする。これを行うには仕様定義の徹底した事前合意が必要である。またバグが見つかった時には、発見者が修正するのではなく、コードの製作者への通知に留める。これは、責任の明確化とコードのバージョン管理の一元化に結び付く。さらに自分が知るべきでない情報は積極的に自分の近くから排する。他者によるパスワード入力の場面で入力者とキーボードに背を向ける、せめて目を背ける、というのはこの美徳に基づく基本的な対応の一例である。よって、プログラマーの第四の美徳である。
Moodle(on Docker)のDB，moodle，moodle_dataを永続化する。


[bitnami/moodle](https://hub.docker.com/r/bitnami/moodle)の記載だけだと少しだけ躓いたのでメモ。

docker-compose.ymlを取得する。
```console
curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/moodle/docker-compose.yml > docker-compose.yml
```

## docker-compose.yml

自動起動するように設定しておく。[^1]

```docker-compose.yml
version: '2'
services:
  mariadb:
    image: docker.io/bitnami/mariadb:11.1
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=bn_moodle
      - MARIADB_DATABASE=bitnami_moodle
      - MARIADB_CHARACTER_SET=utf8mb4
      - MARIADB_COLLATE=utf8mb4_unicode_ci
    volumes:
      - 'mariadb_data:/bitnami/mariadb'
    restart: always
  moodle:
    image: docker.io/bitnami/moodle:4
    ports:
      - '80:8080'
      - '443:8443'
    environment:
      - MOODLE_DATABASE_HOST=mariadb
      - MOODLE_DATABASE_PORT_NUMBER=3306
      - MOODLE_DATABASE_USER=bn_moodle
      - MOODLE_DATABASE_NAME=bitnami_moodle
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=yes
      - MOODLE_REVERSEPROXY=no
      - PHP_MAX_EXECUTION_TIME=600
      - PHP_POST_MAX_SIZE=24M
      - PHP_UPLOAD_MAX_FILESIZE=24M
    volumes:
      - 'moodle_data:/bitnami/moodle'
      - 'moodledata_data:/bitnami/moodledata'
    depends_on:
      - mariadb
    restart: always
build:
  context: .
  dockerfile: Dockerfile
  args:
    - EXTRA_LOCALES=ja_JP.UTF-8 UTF-8
volumes:
  mariadb_data:
    driver: local
  moodle_data:
    driver: local
  moodledata_data:
    driver: local
```

(参考)[https://github.com/bitnami/containers/blob/main/bitnami/moodle/docker-compose.yml]
結局volumeを素直に使うのがよいようだ。
volumeからファイルを抽出するときはdocker cpを使用する。

[^1]: [docker-composeでOS起動時にコンテナを自動起動する方法](https://qiita.com/eijenson/items/25b35916afa38cdf9cea)
Salesforceで商談をマージする方法

※2024年追記
2023年最新機能により商談の重複を防ぐことが可能です

https://qiita.com/Takaa/items/e709da3e63aecaa96e21



Salesforceでは重複ルールがあります。

重複ルールを作成すればレコードのマージが可能です。

しかしながら、重複ルールは特定のオブジェクトのみ対応されているので、すべてのオブジェクトでは対応されていません。
![重複ルール１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0468f7ab-430d-91b2-13c7-9a61e5a35711.png)

取引先・取引先責任者・リード・個人取引先・カスタムオブジェクトのみが対象のオブジェクトです

よくある困ったこととして
・商談オブジェクトをマージしたい
という内容がございます。

残念ながら現状商談オブジェクトは重複ルールでマージすることはできないです
Idea　Exchangeで議論されおりますのでよければ投票してみてください。

・Idea Exchange
Merge Opportunity Records
https://ideas.salesforce.com/s/idea/a0B8W00000GdoHOUAZ/merge-opportunity-records
※2010年から議論されているようです

商談の重複をする場合、
標準の重複ルールでは対応できないので開発をするかいくつかのAppExchangeに商談マージがあるので対応することになります

・AppExchange例　DuplicateCheck
https://appexchange.salesforce.com/appxListingDetail?listingId=a0N300000058vzKEAQ
AWS KMSの用語要点まとめ（自分用メモ

・AWS Key Management Service（KMS）
暗号化に使用する鍵（キー）を作成・管理するサービス。通常は、暗号化を行う対象のサービス（Amazon S3やEBS、Amazon Redshiftなど）と連携して利用。
KMSはAWS CloudTrailと連携しており、鍵の使用ログ（いつどのサービスで鍵が使用されたか）が記録されるため、鍵の利用状況を監査することができます。

■暗号化の仕組み
KMSでは「CMK（Customer Master Key：カスタマーマスターキー）」「CDK（Customer Data Key：カスタマーデータキー）」と呼ばれる2種類の鍵を使用してデータの暗号化および復号を行います。このように二段階で鍵を保護する方式を「エンベロープ暗号化（Envelope Encryption）」といいます。

「CMK」はCDKを暗号化する際に使用し、「CDK」はデータを暗号化する際に使用。
CDKは通常、暗号化を行う対象のサービスごとに作成します。これにより、1つのCDKが漏洩したとしても他のCDKで暗号化されたサービスへは影響しません。また、CDKをCMKで暗号化することによって、運用時に頻繁に使用されるCDKを保護します。

・CMKの種類
CMKには「AWSマネージド型」「カスタマーマネージド型」の2種類があります。
通常、AWSによって作成・管理されるものは「AWSマネージド型」であり、ユーザーは削除できません。AWSマネージド型の鍵は、連携したEBSやRedshiftなどのサービスで暗号化を利用したタイミングでAWSが作成。
一方、カスタマーマネージド型のCMKはユーザーが作成・削除、および管理を行います。ただし作成した鍵を長期間利用するのはセキュリティ上危険なため、KMSでは鍵の自動ローテーション（定期的な更新）をサポートしています。

・AWS Secrets Managerとの連携
Secrets Managerは、データベースなどにアクセスする際のシークレット（ログイン時の認証情報など）を管理するサービス。アプリケーションなどからAWSリソースへアクセスする際にSecrets Managerからシークレットを取得することにより、ログイン情報をアプリケーションにハードコーディングしたり平文で入力しておく必要がありません。また、シークレットは定期的に更新（ローテーション）されたりバージョン管理も行われます。
KMSと連携すると、シークレットを保護するためにCDKが使用されます。ローテーションが行われるたびCDKも新しいものが自動的に生成されるため、高いセキュリティの認証を実現できます。

■キーポリシー
キーポリシーは、カスタマーマネージド型のCMKへ適用するリソースベースのポリシーです。鍵に対して、IAMユーザーまたはIAMロール、他のAWSアカウントへの操作可能な権限を設定します。

・鍵の使用と鍵の共有
鍵の作成者とは異なるIAMユーザーやIAMロールが、鍵を使って暗号化や復号をしたい場合、キーユーザーとして使用者を追加できます。
また、別のAWSアカウントで鍵を使用したい場合は、対象のアカウントと鍵を共有します（クロスアカウント）
暗号化されたAMIやデータベースのスナップショットなどを他のアカウントと共有する際に利用します。

なお、使用者の追加や共有ができる鍵はカスタマーマネージド型のCMKのみです。AWSマネージド型の鍵はキーポリシーを編集できないため他アカウントと共有できません。

・インラインポリシー
IAMポリシーと同様に、キーポリシーはインラインポリシーでも定義できます。

キーポリシーでは、例えば、ユーザーAが暗号化したリソースをユーザーBが復号したい場合には"kms:Decrypt"を設定するなど、細かな権限設定を行えます。IAMポリシーと同様に、最小の権限で運用することが望ましいです。
なお、ユーザーやリソースに対して鍵の利用を許可する際は、キーポリシーだけでなく、IAMポリシーでも同じように権限を設定できます。

■サーバー側の暗号化とクライアント側の暗号化
データの暗号化・復号はサーバーまたはクライアントのいずれかで行われます。
サーバー側の暗号化（Server-Side Encryption:SSE）は、AWS（サービス提供側＝サーバー側）にデータが保存されるタイミングで暗号化が行われ、ユーザーがデータを取り出す際もサーバー側が復号して渡します。

一方、クライアント側の暗号化は、サーバーへデータを送信する前にクライアント側で暗号化を行い、サーバー側では受け取ったデータをそのまま保存します。また、データの復号もクライアント側で行います


AWS側で暗号化が行われる場合はほとんどがサーバー側の暗号化です。クライアント側の暗号化は、通信回線のセキュリティに不安があるなどユーザーが自主的に暗号化したいケースで使用されます。また、クライアント側の暗号化は、暗号化および復号をユーザー側で行うため、鍵の利用状況のチェックや監査などもユーザー自身が行う必要があります。なお、クライアント側の暗号化を行うにはAWS SDK（ソフトウェア開発キット）を使用します。


・AWS CloudHSM
AWS CloudHSMでは、専用のハードウェアデバイスを用いて暗号化鍵を生成・管理します。貸し出されるハードウェアは世界的な暗号化ハードウェアの規格（FIPS 140-2 のレベル 3）で認証済みのため、信頼性の高さが強みです。
なお、「CloudHSM」のHSM（Hardware Security Module）とは、データセキュリティを高めるための暗号鍵を保護しつつ運用するデバイスのことです。

KMSでは鍵の管理はAWS側で行われるのに対して（フルマネージド）、CloudHSMでは鍵の生成や保管・削除などのライフサイクル管理はユーザー自身が行います。運用面においても、CloudHSMは他のAWSユーザーと分離するためにAmazon VPC内にプロビジョニングする必要があるなど、KMSよりもセキュアな運用が求められます。
なお、CloudHSMでは専用のハードウェアを使用する分、KMSと比べると利用料金が高価に設定されています。
法令や規制等の要件で、認定を受けたハードウェアで暗号化鍵を管理する必要があるようなケースでは、CloudHSMを使用します。
SRDebuggerの文字が小さい

UnityでSRDebuggerを使っていると、「他の人より文字が小さい」「Editorとスマホでサイズが違う」というクレームが付くことがあって、なんでかなーと思ったら、いくつかある原因の合わせ技でした。

- SRDebuggerのCanvas Scalerが"Constant Pixel Size"になっている。
  - 単純に解像度が高いほうが文字が小さくなる作り。
- EditorのGameViewを"Fixed Resolution"で設定するか"Aspect Ratio"で設定するかで、同じように見えても解像度が違う。
  - "Aspect Ratio"だとGameViewで実際に表示しているサイズが解像度になる。
- SRDebuggerはdpiによってCanvasの拡大率を変えるようになっているが、WindowsやmacOSは画面サイズに関わらずdpi固定なので意味がない。
  - 高解像度スマホで必要以上に小さくならないのは画面サイズに合ったdpiが設定されているため。

では、どう対応しようかというところで、"Window->SRDebugger->Setting Window"で"UI Scale"を変更するとすべての環境で大きくなってしまうし、SRDebuggerに解像度に関するAPIはないし、あまりやりたくはないのだけどスクリプトをいじるしかないのかなと。

```diff_c_sharp:Assets/StompyRobot/SRF/Scripts/UI/SRRetinaScaler.cs
- float scale = dpi / _designDpi;

+ #if UNITY_EDITOR
+ dpi *= 2.0f * (Screen.width / 1920.0f);
+ #endif
+ float scale = dpi / _designDpi;
```

問題なのは概ねEditorでの文字の小ささなので、1920x1080を基準としてdpiを2倍にしてみました(横の解像度が大きいほどdpiが大きくなる＝文字が大きくなる)。2倍という数字に特に意味はないのでお好みで。個人的にはこのくらいが27インチWQHDでちょうどよかったです。

なお、UnityのAPI的には

- Screen.currentResolution -> ディスプレイの解像度
- Screen.width Screen.height -> ゲーム画面の解像度(※スマホでは上記と同じ)
- Screen.dpi -> ドット密度(dpi)

となります。
`vagrant up`するだけでDockerの実験環境ができるVagrantfile

とりあえずDockerを試すためにはこれで良い。

注意
* forwarded_portは，動かしたいdocker imageに合わせて適切に設定しよう。
* docker-composeがv2.6.0固定になっているので，お好みで変更する。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"

  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.synced_folder "./data", "/vagrant_data"

  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 4
    vb.memory = "8096"
  end

  config.vm.provision "shell", inline: <<-SHELL
    sudo apt update
    sudo apt install apt-transport-https ca-certificates curl software-properties-common
	curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
	sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
	sudo apt update
	apt-cache policy docker-ce
	sudo apt install -y docker-ce
	sudo curl -L https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
	sudo chmod +x /usr/local/bin/docker-compose
  SHELL
end
```
Laravel8 日本語化

## 確認済み環境

- compsoer 2.3.9
- Laravel 8.6.12
- Laravel Breeze 1.1.4
- arcanedev/laravel-lang 9.1.0
- arcanedev/support 8.1.0
- laravel-lang/lang 9.1.2

## 概要

- Laravel標準のエラーメッセージは英語になっているので、それらを日本語に変えていく
- composerでインストールする
    - 他の記事ではgithubからzipファイルをインストールする方法や、vendorフォルダからコピーする方法が多く見受けられたので、この記事ではそれらを行わずに日本語化する

## 前提

- Laravel Breezeによるユーザー登録・ログイン機能が正常に働いている

## 手順 1~3

### 1. インストール

```terminal
$ composer require arcanedev/laravel-lang:"*" -W

~~ 略
// 最後に Publishing complete. と表示されればOK

$ php artisan vendor:publish --provider="Arcanedev\LaravelLang\LaravelLangServiceProvider"

// config配下にlaravel-lang.phpが作成される
```

### 2. 設定ファイルの書き換え

作成された**config/laravel-lang.php**を以下の内容に書き換える
コピペでOK

```php
<?php

return [

    /* -----------------------------------------------------------------
     |  The vendor path
     | -----------------------------------------------------------------
     */

    /** @link      https://github.com/Laravel-Lang/lang */
    'vendor'    => [
        base_path('vendor/laravel-lang/lang/locales'),
    ],

    /* -----------------------------------------------------------------
     |  Supported locales
     | -----------------------------------------------------------------
     | If you want to limit your translations, set your supported locales list.
     */

    'locales'   => [
        'ja', // ここで日本語ファイルであるjaを指定
    ],

    /* -----------------------------------------------------------------
     |  Check Settings
     | -----------------------------------------------------------------
     */

    'check'     => [
        'ignore'  => [
            'validation.custom',
            'validation.attributes',
        ],
    ],

];
```

### 3. 日本語ファイルの追加

```terminal
$ php artisan trans:publish ja

// resouces/lang/jaが追加される
```

追加されたjaフォルダの**ja.jsonをlang直下に移動**させる



## 参照
- [Laravel Lang Github](https://github.com/Laravel-Lang/lang)
- [Laravel Lang ドキュメント Translation Managers](https://laravel-lang.com/installation/managers.html)
AWS Trusted Advisorの用語要点まとめ（自分用メモ

・AWS Trusted Advisor
利用者の利用状況をAWSに蓄積されたベストプラクティスと照会することにより、推奨されるアクションのアドバイスを行うサービス。

チェックの観点は「コスト最適化」「パフォーマンス」「セキュリティ」「フォールトトレランス」「サービスの制限」に分類されており、各観点の代表的なチェック項目には以下のようなものがあります。
[コストの最適化]
・EC2リザーブドインスタンスの最適化 ... リザーブドインスタンス（予約購入したインスタンス）の利用状況をもとに最適な購入数を算出し、コストの節約が可能か
[パフォーマンス]
・EC2インスタンスの使用率 ... 直近14日で1日のCPU使用率が90%以上の日が頻出していないか
[セキュリティ]
・開かれたポート ... アクセス元の制限がない（0.0.0.0/0）セキュリティグループが定義されていないか（ポート番号に応じて警告を表示）
[フォールトトレランス（（fault tolerance）システムに障害が発生した場合にも、系統を切り替えるなどして正常に稼働させ続けること）]
・ロードバランサ（ELB）の最適化 ... ELB配下のインスタンスが複数AZで稼働しているか
[サービスの制限]
・各サービスに設定された制限値と利用状況を照会し、使用率がひっ迫したり上限に達していないか

問題ない（無視してもよい）と判断した項目はマネジメントコンソール上で非表示にすることもできます。
また、いくつかの観点（コスト最適化、パフォーマンスなど）でのアドバイスを得るには、AWSとのサポートプラン契約が必要です。
LINEで写真を送るとGoogleドライブに保存できるものを作ってみた

皆さんこんにちは。
私は食品スーパーマーケットに努めている[Yuuuuichi](https://twitter.com/home)です。最近、プロトタイピングデビューをしました。色々なことに挑戦し発信していきます～。

``` 
目次
１，はじめに
２，やり方
３，完成品
４，次へ向けて
 ```
# １，はじめに
PCでPPT資料を作る際にスマホで撮った写真を取り込むときに、わざわざPCとコードで繋ぐのがめんどくさいと思った事ないですか？
スマホのGoogleドライブアプリに直接入れる事もできますが、自部署のメンバーの写真を使用したい時に「ドライブに入れて！」で、通用すること少なくないですか？

**そんな時に！！**

LINEのトークに写真を送ればそのままGoogleドライブに日付付きで保存されていくものがあると便利だと思い、作りました。
**メンバー内で友達登録→資料で使いたい写真を送ってと依頼→LINEに送る→Googleドライブに保存される**
というように、お手軽にPCに取り込む事ができました。

# ２，やり方

https://www.yukibnb.com/entry/linemessagingapi_save_image#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BCID%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%82%88%E3%81%86

を参考に作成してます。参照ください

# ３，完成品
**LINE動作**

https://twitter.com/yuuuuuichi69/status/1546686881894912000?s=20&t=YIwLrnWKcXIxNwXIjnQ9Zw

**googleドライブ**
![マイドライブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2717626/4cfc5d3b-9d4b-b198-6959-40abfbf07a27.png)

ファイル名も日付で保存される。

# ４，次へ向けて
やり方の部分をリンクのみで端折っておりますが、次回以降はしっかりお伝えできるようにしていきます！
読んでいただきありがとうございます。
コンデンサの機能特性について話す

電子市場におけるコンデンサの割合が増加しているのはなぜですか？それは、それ自体の強力なパフォーマンス構造、つまり製品の有効性のおかげに他なりません。まだコンデンサの多機能特性をよく知らない方も多いと思いますので、本日はその謎を簡単に説明し、コンデンサの強力なコアコンピタンスを明らかにします。

スマートコンデンサは、無効電力をアクティブに補償し、負荷の無効電力のサイズに応じて自動的に切り替わり、無効電力を動的に補償し、電力品質を向上させます。スマートコンデンサは、単一のユニットで使用することも、複数のユニットをオンラインで使用することもできます。アンチスイッチング振動技術であるスマートコンデンサは、独自の設計原理を使用して、コントローラのクラッシュによって引き起こされる補償されていないサイトや過剰に補償されたサイトを回避し、コンデンサのスイッチング振動を回避します。
![8a7c8ea9ea7e244e70121e74116705e9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648141/7ca50d04-79ff-9631-f644-c6e3edb57530.jpeg)


高度な制御スキル、物理量の制御は無効電力であり、無効電力フロー予測と遅延マルチポイントサンプリングスキルを使用して、切り替え時に振動が発生しないようにします。過負荷になると、無効電力は完全に補償されます。

完璧な保守計画である[スマートコンデンサ](https://www.chimicron.com/blog/details/talking-about-the-functional-characteristics-of-capacitors.html)は、停電保守、短絡保守、電圧欠相保守、コンデンサ過熱保守などの機能を備えており、コンデンサの安全性を効果的に確保し、機器の寿命を延ばします。

組み込みスイッチングスイッチモジュール、インテリジェントコンデンサ内蔵スイッチングスイッチモジュール。スイッチングスイッチモジュールは、サイリスタ、磁気ラッチングリレー、ゼロ交差トリガー導通回路、およびコンデンサの「ゼロスイッチング」を実現し、突入電流の影響がないことを保証するサイリスタ保守回路で構成されています。スイッチングプロセス中の動作過電圧。スイッチモジュールは応答速度が速く、頻繁に操作できます。
AWS ECSの用語要点まとめ（自分用メモ

・Amazon ECS（Elastic Container Service）
コンテナを実行、管理するサービス。コンテナとはアプリケーションと実行環境をパッケージ化する仮想化技術の一種。
コンテナによる仮想化を用いてアプリケーションを開発・実行するためのソフトウェアに「Docker」があります。Amazon ECSでは、Docker環境で動作するDockerコンテナをサポートしています。
なお、ECSのようなコンテナを管理する仕組みを「コンテナオーケストレーション」といいます。

・コンテナイメージ
アプリケーションとその実行環境を、コンテナのひな形としてパッケージ化したものを「コンテナイメージ」といいます。コンテナを動作させるソフトウェアである「コンテナエンジン」が、コンテナイメージから「コンテナ」を起動します。コンテナイメージは異なる環境にそのまま持ち込むことができるので、例えばテスト環境から作成したコンテナイメージを本番環境にコピーしてコンテナを起動すれば、同一の環境を構築できます。

・ECSの主要要素
○クラスター
1つ以上のタスクまたはサービスで構成される論理グループです。クラスターでは、コンテナが動作するVPCやサブネットなどを設定します。

○タスク
ECSで管理するコンテナの実行単位です。タスク内のコンテナは、実行するコンテナイメージ、CPUやメモリのスペック、タスクロールなどを定義した「タスク定義」に基づいて起動されます。なお、タスクロールとはコンテナが他のAWSサービスを利用する際に設定するアクセス権限（IAMロール）のことです。

○サービス
クラスター内で必要なタスク数を維持する機能です。あるタスクが異常終了して必要なタスク数を下回った場合、サービスが新しいタスクを起動して自動復旧します。サービスでは、起動するタスクのタスク定義、必要なタスク数、ELBとの連携などを設定します。

・ECSの起動タイプ
ECSで実行・管理するコンテナは、コンテナを実行する環境によって主に「AWS Fargate」と「EC2起動タイプ」。

○AWS Fargate（Fargate起動タイプ）
AWS Fargateはコンテナ向けのサーバーレスコンピューティングエンジン。コンテナ実行環境のCPUやメモリのスペック、アクセス権限（IAM）などを設定するだけで、サーバーの環境構築や管理をすることなくコンテナを実行できます。
Fargateの利用料金は、タスクで指定したCPU/メモリに応じて課金。実行したタスクのリソース使用量に対して料金が発生するので、不定期にタスクが実行されるシステムや、常にタスクが実行可能な状態でなければならないシステムなどに向いています。

○EC2起動タイプ
EC2起動タイプはユーザーが管理するEC2インスタンス上でコンテナを実行。コンテナを実行するEC2インスタンス、ネットワーク、IAMなどを設定すると、ECSがAWS CloudFormationのスタックを作成および実行して、構築したコンテナ実行環境をECSに登録します。EC2起動タイプでは通常のインスタンスと同様に、OSやミドルウェアのアップデート、スケーリングなどのサーバー管理をユーザーで実施する必要があります。
EC2起動タイプの利用料金は、指定したEC2インスタンスタイプに応じて課金。インスタンスの起動時間に対して料金が発生するので、インスタンス起動中に多数のタスクが実行されるシステムなどに向いています。

・Amazon ECR（Elastic Container Registry）
コンテナイメージを登録・管理するサービス。ECRに登録されたコンテナイメージをECSが参照し、コンテナ（タスク）を起動できます。ECRのようにコンテナイメージを登録・管理する仕組みを「コンテナレジストリ」といいます。

・マイクロサービス
最小限の機能を持つ独立したサービスのこと。例えば、オンラインショッピングサービスの機能を「商品管理機能」「ユーザー管理機能」「ショッピングカート機能」「決済機能」に分け、それぞれが自律して動作するのがマイクロサービスです。
主なメリットは、ある機能に障害が発生したりアップデートした場合に他の機能への影響を最小限にでき、機能を別のサービスに流用することが容易になるので開発コストの削減に繋がることなどが挙げられます。
コンテナはマイクロサービスの実現に適しています。ひとつのサービスをひとつのコンテナで実行することで効率的にマイクロサービスを構築できます。
なおマイクロサービスとは反対に、大きな機能を一つに総括したシステムをモノリシックなシステムといいます。
誤差

```実際の数値```と、```コンピュータ内部で表現できる数値```との間に生じたずれを```誤差```と呼ぶ。
無限小数を表すと永遠に終わらないので８ビットなどでは```表現できない```。
それを表現するために```極力それに近い値```で済ませる。

## けたあふれ誤差(絶対値が大きくなった場合)
コンピュータの扱える最大値や最小値を超えることによって生じる誤差を```けたあふれ誤差```という。
### ```アンダーフロー```
* 最小値を超えること
* 限りなく０に近い実数によって浮動少数の指数部がパンクして精度が場合に起きるもの。

### ```オーバーフロー```
* 最大値を超えること
* ８ビットの固定小数点で最小〜最大の範囲（-128~127)を超える場合どちらも```オーバーフロ-```という。
(```正のオーバーフロー```、```負のオーバーフロー```という。)

### 気づき
９桁の２進数の数値を８ビットの値を表現できないから２進数同士の引き算が成立するのか。
けたあふれ誤差によって引き算ができるのか。

## 情報落ち(加算の一方の数値が小さすぎて反映されない場合）
* 絶対値の大きな値と絶対値の小さな値の値の加減算を行った時に、絶対値の小さな値が計算結果に反映されないことによって生じる誤差のこと

### 気づき
* この加減算が絶対値の小さいな値な場合
計算結果が０に極力近い値になると指数がパンクするアンダーフローの結果に情報落ちになるのか?
* 小さいな値が反映されないのか。
* 仮数部の桁数を超える時に発生するのか。

## 打ち切り誤差(計算が長くなる時)
* 計算処理を、完了まで待たずに途中で打ち切ることによって生じる誤差が```打ち切り誤差```です。
* あらかじめ何桁で計算を打ち切る
### 気づき
* とても小さな値が切られると情報落ちにも似ている。
* 桁が多くなることも考えればオーバーフローにも似ている。

## けた落ち(信用できない桁が発生する時)
絶対値がほぼ等しい数値同士の差を求めた時に、有効な桁数が大きく減ることによって生じる誤差のこと
### 気づき
* 有効な桁が３桁の場合引かれた差が極力０に近くなる。そうすると0.004...になる場合がある。こうなると正規化が行われ```00```が指数部にその分追加され、桁が繰り上がるがその時仮数部に```00``が表示されてしまう。しかし
繰り上げられる仮数部が```00```であるとは限らない　なのでこの誤差が生じ、その結果0.004^7となるのかな。

* 信用できない桁が増える。数値同士の有効桁３桁以降の数が必ずしも０とは限らないからかな。

## 丸め誤差(仮数部を四捨五入、切り上げ、切り捨てにする時)
表現できる桁数を超えてしまったがために、最初受けたより小さい部分について、四捨五入や、切り上げ、切り捨てなどを行うことによって生じる誤差

### 気づき
四捨五入、切り捨て、切り上げによって生じる誤差か。
いろいろな誤差と似ているな。


出典　

https://gihyo.jp/book/2020/978-4-297-11781-8
ソフトウェア開発における Verification(検証)とValidation(妥当性確認)の違い

# 目次
[1.はじめに](#はじめに)
[2.目的](#目的)
[3.そもそもの単語の意味](#そもそもの単語の意味)
[4.ソフトウェア業界における定義](#ソフトウェア業界における定義)
[5.正しい開発・正しい成果物を抽象的に考える](#正しい開発・正しい成果物を抽象的に考える)
[6.ソフトウェア開発では？](#ソフトウェア開発では？)
[7.まとめ](#まとめ)
[8.参考サイト](#参考サイト)

# はじめに
トレーサビリティに関する論文を読んでいてVarificationとValidation2つの単語が出てきたので違いを調べてみました。

# 目的
ソフトウェア開発において2つの単語の違いをなんとなくでも理解すること。

# そもそもの単語の意味
- Verification：確認、立証、検証
- Validation：【作業結果などが既定の条件や仕様に適合しているかどうかの】検証、証明、妥当性確認
単語だけ調べると似たような言葉が出てくる。

# ソフトウェア業界における定義
## IEEE 1012:2016
IEEE 1012:2016[1]より
- Verification(検証)
ライフサイクルの各プロセスにおけるすべての活動において、要求事項（正確性、完全性、一貫性、正確性など）に適合していること。
各ライフサイクル活動が完了し、次のライフサイクル活動を開始するための基準をすべて満たしている（製品が正しく作られている）。

- Validation(妥当性確認)
各ライフサイクル活動の終了時に製品に割り当てられた要件を満たしている。
意図された用途とユーザーニーズを満たす（正しい製品が構築される）。

## バリー・ベーム（Barry W. Boehm）
ソフトウェア界隈では超有名人、バリー・ベーム（Barry W. Boehm）さんはVモデルを示した論文[2]において
- Verification：Am I building the product right?
- Validation：Am I building the product right product?
正しく開発を行っているか　正しい成果物を作っているかと説明しています。
間違っていたら申し訳ございません。

# 正しい開発・正しい成果物を抽象的に考える
設計や開発などを通して出力されたものが正しいかどうかを確認する作業において2種類の正しいがあると解釈しました。
- Varification：入力されたものと比較する→正しくプロセスを踏めたかを確認
- Validation：要求をもとに正しさを確認する→正しく成果物を作れているかを確認
![抽象的に考えて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/04bdeb10-9b4e-36bd-d681-f8a1aad66b38.png)


# ソフトウェア開発では？
ウォーターフォールモデル開発がメインとして当てはまりそうな下のような流れ。
1. 要求を入力として設計成果物を作る
1. 設計成果物を入力としソースコードができる

Varification(検証)：左から右に工程が流れるときに正しく詳細化できたのかを確認する
Validation(妥当性確認)：作った成果物が作りたいものなのかを確認する
という自分の中の解釈に落ち着きました
![開発工程で.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/e0fc5feb-dad4-85b0-a20b-ae75afb48157.png)



# まとめ
作られた成果物を何と検証するか、ターゲットの違いがあるんだという解釈。

この記事を書くまではWebアプリケーションなどでValidation(入力内容の検証など)を聞いたことがあったが開発工程全体を通しても意味があるんだと勉強になった。

優劣をつけるものではないと思いますが、個人的な意見として要求と比較している分Validationの方が重要なのかなとも思いました。

# 参考
以下の論文・記事を参考にさせていただきましたありがとうございます。
[1] 2017. IEEE Standard for System, Software, and Hardware Verification and Validation. IEEE Std 1012-2016(Revision of IEEE Std 1012-2012/ Incorporates IEEE Std 1012-2016/Cor1-2017) (2017), 1–260. 
[2] B. W. Boehm. 1979. Guidelines for Verifying and Validating Software Requirements and Design Specifications. In Euro IFIP 79, P. A. Samet (Ed.). North Holland,711–719.
- [V&V（Verification & Validation：検証と妥当性確認）とは](https://ideson-worx.com/vv/) (Access.2022-07-11)
KubernetesのサービスにLensを使って横着アクセスする

Kubernetesに設定用のUIがserviceとして用意されている場合があります。
アクセス手法は色々あって、ingressを設定する方法やkubectlのport forwardなどがありますが、Lens Desktopを使って横着にアクセスする方法もあります。Lens Desktopのダウンロードは以下のページへ。

https://k8slens.dev/

使用したバージョンはLatest Version: v5.5.4-latest.20220609.2 (2022/6/10)です。

# 方法
## kubeconfigファイルをしっかり書いておく
Lensは　PC上のkubectlコマンドを使用します。パスさえ通っていれば問題なく動くはずです。
## Lensからserviceにアクセスしていく
最初の画面の左上のアイコンをクリックすると、
![スクリーンショット 2022-07-12 112440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/cd19bc21-7f6e-e334-b850-1596c2a457c9.png)
以下の画面になるので、defaultをクリックします。defaultがいつも使っているkubeconfigファイルのことです。
![スクリーンショット 2022-07-12 112909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/0aa1817c-a931-4972-bfdf-72085762de9a.png)
kubernetesに接続されました。
![スクリーンショット 2022-07-12 113122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/f635af02-24a6-5a7a-0537-c9f1956834cc.png)
左側のメニューをNetwork-Servicesの順に開けていきましょう。各種Serviceの一覧が出てきます。
![スクリーンショット 2022-07-12 113405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/506bc27e-a12b-daf8-bd2d-6298eac2a263.png)
今回はLonghornのUIを見てみたいと思います。`longhorn-frontend`をクリックすると右に各種情報が出てきます。そのConnectionの項にリンクがあります。これをクリックすると、、、
![スクリーンショット 2022-07-12 113740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/11bbdbe7-0c3f-b0f5-6f0b-1da2872c77f0.png)
Longhorn UIがブラウザでオープンされます。結構便利ですね。
![スクリーンショット 2022-07-12 114155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/7e1d46f7-cd2a-6643-42f4-7b628788b194.png)
実は、これは自動的なポートフォワーディングの設定です。serviceの80番ポートがローカルの50180番ポートにport fowardされている事が分かるかと思います。Lensでもport forwardを表示するところがあって、ここで確認できます。
![スクリーンショット 2022-07-12 114903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/8ea83ea4-430b-702d-2872-dfaed3dbcc68.png)
Golang初心者がGo導入(macOS)と詰まったところ ~ VSCode設定まで ~

専門はフロントエンドマンの導入メモ。

GoでSQLを叩きたいと思って触っています。
Golangのチュートリアルであるgo tourをインストするまでと、VSCodeの設定まで紹介。
インテルチップのmacに導入しています。

## インストール

```
$ brew install go
```

もしくは pkg を GUI操作で DL するパターンもあります。
公式：https://go.dev/doc/install

### バージョン確認

```
$ go version
go version go1.18.3 darwin/amd64
```

バージョンチェックできればOKです。

```
$ go env
```
GOPATHの違いにより怒られた場合は go env で確認して見ましょう。

```
export GOPATH=$HOME/go
```
などで実際のパスに合わせて変更。それからターミナル自身をリロードするか source ~/.zshrc で使用しているシェルのパスを更新。


## Go Tourを入れる

```
go install golang.org/x/website/tour@latest
```

ちなみにGo Tour公式の日本語チュートリアルだとgo tool もしくは go get コマンドで叩いていてインストできませんでした。更新されてないパターンですね。
上記は英語版のやつ。
```
※どちらもインストできなかった
go tool tour
もしくは
go get github.com/atotto/go-tour-jp/gotour
```

バージョンの問題なようです。

${HOME}/go/bin/tour と tour のディレクトリが確認できていればOKです。

### Tour を立ち上げる

```
cd $GOPATH/bin
./tour
```

http://127.0.0.1:3999/welcome に立ち上がりました。

![スクリーンショット 2022-07-12 11.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/e6e68ef3-0101-70e9-4ee0-d833eb0b9167.png)

## VSCodeの設定

### 拡張機能"Go"をインスト
![スクリーンショット 2022-07-12 11.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/a10d8d53-83a3-2caa-fda8-2c3c87c8f77b.png)

まずは拡張機能から。しかしこれだけでは githubなどの外部のライブラリを import すると No such file でファイル実行できるものの VSCode上 では怒られてしまいました。

### Update toolsをインスト
そこで command + shift + p で Go を検索して Go:install/Update tools を開き任意のものをインストします。が自分は全てにチェックを入れてインストしました。

![スクリーンショット 2022-07-12 11.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/b62d52af-75a3-a6c7-a2e1-da1de5c9d3aa.png)


### settingsを変更
ここではsettingsから変更する手順を載せました。面倒な人はsettings.jsonから変更すると良いと思います。

#### Go:Format Toolを設定
command + shift + p で settings を開き Goの設定画面で任意のフォーマットを選びます。
自分はデフォルトから gofmt を選択。

![スクリーンショット 2022-07-12 11.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/11fa948b-6b17-be94-b3a4-502e6a1b29bf.png)

formatの内容についてGoLandの https://pleiades.io/help/go/integration-with-go-tools.html で確認できました。

#### Go: Language Server Experimental Featuresをfalse
次にLanguage Server Experimental Featuresの設定を false にします。
デフォルトでtrueだったかは定かではないのですが色々いじっていたらこの設定が true になっていました。

```
Temporary flag to enable/disable diagnostics from the language server. 
This setting will be deprecated soon. Please see and response to Issue 50.
```

とあるように公式がもうすぐ非推奨にする機能なので外して問題ないかと。
ここの設定を false にすることで 存在するライブラリの import に対して生じていたエラーが消えました。

今はDockerでGoの環境構築していますがやはり環境構築はいろいろと沼に落ちやすいので面倒です。
【Flutter】cloud_firestoreパッケージを追加して、ビルドすると「Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications.....」とエラーが出る

# はじめに
あるアプリを作成中にfirestoreを追加しようとしたら、謎のエラー「Requested but did not find extension point with identifier　Xcode.IDEKit.ExtensionSentinelHostApplications　for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore」が表示され、数日この対応で何もできなかったのですが、ようやく直し方が判明しました。

# 更新履歴
2022.7.12 初回投稿

# 環境
[✓] Flutter (Channel stable, 3.0.4, on macOS 12.4 21F79 darwin-x64, locale
    ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.2)
[✓] VS Code (version 1.69.0)

# 参考にしたサイト
https://zenn.dev/sho5/scraps/bdb32f47ed8cc9
https://qiita.com/rydein/items/119de80191ff3b3da632
https://stackoverflow.com/questions/65312965/flutter-fatal-error-flutter-flutter-h-file-not-found
https://zenn.dev/takumura/articles/595b8c588d0b21

# やったこと
上記サイトを参考にいろいろ試す。
基本的には、だいたい、flutter cleanして、pod repo-updateして、再インストールしろな感じだったけど、どれやってもダメでした。

# 解決
結局自己解決しました。
1. FlutterプロジェクトのiOSフォルダをXcodeで開く。
1. 上部ペイン右のアラートマークをクリックする
 ![スクリーンショット 2022-07-12 10.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9961/2bf8ed6b-6678-c1fb-47b2-a15fa1982929.png)
1. 左ペインの「Runner project」の下の「Update to recommended settings」アラートマークをクリックする
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9961/d590a609-af8d-b6be-1af2-c4bcd35694f0.png)
1. ダイアログが表示されるので、「Perform Changes」をクリック
 ![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9961/dc431cfd-737d-eb66-dcbc-e10b41cffc65.png)
1. 左ペインのRunner projectのアラートが消え、Pods projectのアラートのみとなるので、同様に、アラートマークをクリックして、表示されたダイアログの「Perform Changes」をクリック
 ![スクリーンショット 2022-07-12 10.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9961/4d767369-8e23-b4be-9090-eee38e5e44a5.png)

再度ビルドすると通るようになります。


以上
k3sクラスター上にLonghornをインストールする

先日来、[お試しで動かしているk3sクラスター](https://qiita.com/yasuyuki_terashi/items/9f634fe6154ec13fdf96)上にLonghornをインストールします。

https://longhorn.io/

工場のエッジ側でk3sが使えないかという事で、色々勉強してます。k3sクラスタ自体をetcdでHA構成にしたわけですが、コンテナ用永続ストレージも簡単に失われないようにしたいと考え、Longhornに挑戦してみました。
# １．事前準備
## 用意したインスタンス
**サーバー用×3**
名前：k3s-a,k3s-b,k3s-c
インスタンスタイプ：t3.large
ストレージ：20G
AMI：Debian 11を指定

**エージェント用×1**
名前：k3s-d
インスタンスタイプ：t2.micro
ストレージ：20G

* 各インスタンスは、同じサブネットに所属するように設定しておきました。
* セキュリティグループも各インスタンス同じものを設定しておきます。このセキュリティグループは、同じセキュリティグループに所属するインスタンスからは無制限にアクセスできるようにしておく必要があります。
## ソフトウェア構成
**k3s側**
Debian GNU/Linux 11
k3s version v1.23.8+k3s1 (53f2d4e7)
go version go1.17.5
Longhorn v1.3.0
**Windows端末側**
Rancher Desktop 1.2.1
※kubectlはRancher Desktop付属のもの。
※Windows端末からkubectlできるようにしましたが、Linuxでもなんでも同様にできるはずです。
# ２．インストール
## open-iscsiのインストール
Longhornインストールに先立ち、Open-iSCSIをインストールします。各インスタンスはDebianで動いてますので、それぞれのインスタンスで以下を実行します。
```powershell:powershell
$ apt -y install open-iscsi
```
## Longhornインストール
公式サイトに則ってインストールしていきます。インストールに使うyamlファイルを確認したかったので、`https://raw.githubusercontent.com/longhorn/longhorn/v1.3.0/deploy/longhorn.yaml`をローカルにダウンロードしてから以下を実行しました。同じyamlファイルでインストールするわけですから、当然同じ結果になります。
```powershell:powershell
$ kubectl apply -f longhorn.yaml
```
次に以下コマンドを確認し、podが全てrunnningとなっていればOKです。
```powershell
$ kubectl -n longhorn-system get pod

(例)
NAME                                           READY   STATUS    RESTARTS   AGE
longhorn-ui-b7c844b49-w25g5                    1/1     Running   0          2m41s
longhorn-conversion-webhook-xxxxxxxxxx-xxxxx   1/1     Running   0          2m41s
longhorn-conversion-webhook-xxxxxxxxxx-xxxxx   1/1     Running   0          2m41s
longhorn-admission-webhook-xxxxxxxxxx-xxxxx    1/1     Running   0          2m41s
longhorn-admission-webhook-xxxxxxxxxx-xxxxx    1/1     Running   0          2m41s
(以下略)
```

# ３．ハマった部分
## open-iscsiを忘れてはいけない
先述した通りopen-iscsiを先に入れておかなくてはなりません。忘れたままLonghornをインストールすると以下のようになります。まず、longhorn--driver-deployerのステイタスがInit:0/1と表示されます。そして、longhorn-managerのステイタスはCrashLoopBackoffとなり動いていません。ちなみにCrashLoopBackoffとはコンテナ内のプロセスの終了を検知してコンテナの再起動を繰り返している状態だそうです[(参考)](https://qiita.com/minodisk/items/547741b73763f2bab6b8)。
```powershell
$ kubectl -n longhorn-system get pod

(例)
NAME                                        READY   STATUS             RESTARTS   AGE
longhorn-driver-deployer-xxxxxxxxxx-xxxxx   0/1     Init:0/1           0          118s
longhorn-manager-xxxxx                      0/1     CrashLoopBackOff   4          118s
longhorn-ui-xxxxxxxxxx-xxxxx                1/1     Running            0          118s
```
公式のどこかにはopen-iscsiが必要な事が書いてあったのかもしれませんね。一つ目のハマり処でした。

# ４．おわりに
今回はk3sクラスタにLonghornのインストールを行いました。
今後は、実際に永続ボリュームを作ってみます。また、LonghornUIにもアクセスしてみます。

# ５．参考文献
[Install with Kubectl](https://longhorn.io/docs/1.3.0/deploy/install/install-with-kubectl/)・・・公式
[[Question] longhorn-driver-deployer can not start #1549](https://github.com/longhorn/longhorn/issues/1549)・・・この記事でopen-iscsiが必要であることに気付いた
[Kubernetesのポッドが起動しない原因と対策](https://qiita.com/minodisk/items/547741b73763f2bab6b8)・・・CrashLoopBackOff等statusの意味をここで知りました
【Javascript】webページでドラッグできるダイアログを作ってみた

# 完成物
『Dialog』をドラッグして、動かしてみてください。
右上のCODEPENのアイコンを押すと、コードが見やすくなりいます。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="KKoKKMv" data-user="matsuura77" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/matsuura77/pen/KKoKKMv">
  qiita_draggableDialog</a> by matsuura77 (<a href="https://codepen.io/matsuura77">@matsuura77</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 作ろうと思ったきっかけ
chrome拡張で簡易なタイマーを作成したかったからです。
その際に、自由に配置できて、ウィンドウの外に出ないようなダイアログが欲しかったからです。

# ダイアログについて
大元の実装は[こちら](https://ja.javascript.info/mouse-drag-and-drop)。
上記の記事で大まかなドラッグの実装ができます。
今回はそれに加え、ウィンドウの外にダイアログが出ないように実装しました。
localhost以外の名前でもlocalhost(127.0.0.1)にアクセスできるようにする

localhost以外の名前でも127.0.0.1にアクセスできるようにする方法
macOSでの設定方法です。

```
sudo vi /etc/hosts
```
管理者権限で/etc/hostsのファイルを開いて情報を追加します。

開くとこんな中身↓
```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
```
`127.0.0.1       localhost`とあるので同じように
**`127.0.0.1 api.localhost.local`といった感じで使いたいアドレスを追加すればOKです。**


```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
127.0.0.1 api.localhost.local　//追加
255.255.255.255 broadcasthost
::1             localhost
```

M1Macに買い替えて久々に環境設定したので忘れていました。。
macosでgrepのPオプションが使えない (invalid option)

macosでダウンロードしてきたスクリプトを実行した時に-Pオプションでエラーになりました。

```
grep: invalid option -- P
```

どうやらmacosのgrepは-Pオプションが無いようです.

```
$ grep --version   
grep (BSD grep, GNU compatible) 2.6.0-FreeBSD

$ grep --help
usage: grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]]
	[-e pattern] [-f file] [--binary-files=value] [--color=when]
	[--context[=num]] [--directories=action] [--label] [--line-buffered]
	[--null] [pattern] [file ...]

```

## 解決方法

- brewにてgnu grepをインストールします。

```
$ brew install grep
...
$ ggrep --version
ggrep (GNU grep) 3.7
Packaged by Homebrew
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
```

- スクリプト中の```grep```を```ggrep```に置き換えます。

以上。
SES企業に勤めながらWEBエンジニアに転職するブログ ~3day

<h1>3day</h1>

おはようございます。

3日目の昨日ですが、朝5時に起きて
出社までの1時間半でウェブ制作チュートリアル（2day参照）
をすすめていました。

昨日は仕事が深夜2時まであり、帰宅後はなにもできていません。
働きながら勉強時間を確保するのはとても大変であると、
改めて気づかされました。でも諦めません。

<h2>学習進捗</h2>
<b>１．2022年7月：基礎学習
　　HTML,CSS,ruby,コンピューターサイエンス基礎...等々<b/>


２．2022年8月～10月：ポートフォリオ作成①
　　ウェブサイト作成

３．2022年11月～1月：ポートフォリオ作成②
　　IOSアプリ開発

４．2022年2月～6月：ポートフォリオ作成③
　　webアプリケーション開発

５．2023年7月～8月：webエンジニアへの転職活動

↑現在、上記の「１」のフェーズ中です。

ウェブ制作チュートリアルは、全30章あるうちの13章まで終わらせています。
http://www.htmq.com/tutorial/
（´-`）.｡oO（今週中には終わらせたい）
7.4 (難) 尤度比検定4 帰無仮説が単純仮説でない場合

## 方針

帰無仮説が単純仮説でないため，尤度比検定統計量 (CRTS) の漸近分布が求められない．そこで，CRTS>c→reject H_0が有意水準alphaとなるようにcを求めることで尤度比検定とする．

また，帰無仮説が単純仮説でない場合，「帰無仮説における分布」が一意に定まらない．そこで，lambda=lamda_0とした検定をまず作ってから，それが帰無仮説においてサイズalphaであることを示す．


## 答案

![7.-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/f04cbb1d-020c-ce06-91c6-a9f073def64f.jpeg)
![7.-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/48857773-819c-f26c-584d-d44d4b48bccb.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Selenium入門と安定稼働させためのオプション by golang

# 概要
Go言語でSeleniumを使おうという記事です。
基本的な使い方と、安定稼働させるためのWeb Driverのオプションを紹介しています。
オプションについてはどのプログラム言語でも同じですので、PythonやJavaをお使いの方でも同じオプションが使えます。

# 事前準備
Seleniumを使うのに必要な準備はどのプラットフォームでも同じでしょう。
今回はGoogle Chromeを使いますので、Google Chrome本体のインストールと、Google ChromeのWeb DriverをダウンロードしてPath配下に配置しておきます。
[google chrome webdriverダウンロード](https://chromedriver.chromium.org/downloads)


# 基本的な使い方
GoでSeleniumを扱うのには、agouti というライブラリが定番です。
以下は一番簡単なサンプルとして、googleを表示して、タイトルを表示するだけのものです。
```go
package main

import (
	"fmt"

	"github.com/sclevine/agouti"
)

func main() {
	// chromeを起動
	driver := agouti.ChromeDriver()
	driver.Start()
	defer driver.Stop() // chromeを終了

	page, _ := driver.NewPage()
	page.Navigate("https://www.google.com/")
	fmt.Println(page.Title()) // 表示： Google <nil>
}

```


## Google検索してみる
画面のコントロール方法の説明です。
簡単なサンプルとして、Googleのホームページを表示して`golang`と検索してみます。

要素はquerySelectorの形式で指定できます。

```go
	page.Navigate("https://www.google.com/")

	// 検索フォームに文字を入力し、検索。要素はセレクタで指定する
	page.First("input[type='text']").Fill("golang") // golangと入力
	page.FindByID("gbqfbb").Click() // 検索ボタンをクリック
```

FirstやFindByIDは１要素だけを取得するメソッドですが、複数取得する FindやAll等もあります。
詳しくは agouti のソースをご覧ください。

## Alertのポップアップを消す
js:alert() を消す方法。
消さないと別ページへ遷移してもポップアップが消えず、想定した操作が出来なくなります。

```go
page.ConfirmPopup() // ok を押す
page.CancelPopup() // キャンセルを押す
```


以上で簡単な使い方についてはマスターできたと思います。
次に安定稼働させるためのオプションを見ていきます。

# 安定稼働させるためのオプション
マシンのスペックが低い場合、安定稼働せず落ちたり止まったりすることがありますが、
driver 取得時にオプションを指定することで、リソースを節約するような設定でブラウザを起動できます。
例えば画像を読み込まない設定ができたり、画面自体を表示せずに起動できます。


### ヘッドレスモード
画面を表示しない。
画面を目視で確認する必要がない場合に指定しましょう。
```go:ヘッドレスモード
driver := agouti.ChromeDriver(
		agouti.ChromeOptions(
			"args", []string{
				"--headless",    // headlessモードの指定
				"--disable-gpu", // headlessモードの指定
			}),
	)
```

### その他のオプション
他にもよく使うものとして以下のようなオプションがあります。

```go:その他のオプション
	driver := agouti.ChromeDriver(
		agouti.ChromeOptions(
			"args", []string{
				"--no-sandbox",
				"--disable-dev-shm-usage",              // /dev/shmパーティションの使用を禁止し、パーティションが小さすぎることによる、クラッシュを回避する。 dockerなどのVM環境下では、設定したほうがクラッシュする確率が減る。
				"window-size=500,400",                  // 画面を小さく
				"--blink-settings=imagesEnabled=false", // 画像を読み込まない
				"lang=ja",
				"--disable-desktop-notifications",
				"--ignore-certificate-errors", // sslまわりのエラーを許容する
				"--disable-extensions",        // Extensionを利用しない
				"--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1')", // UAの設定。ここではiPhoneに偽装している
			}),
	)
```

こちらも参考に。[chromeDriver全オプション](http://chrome.half-moon.org/43.html)
Create Master-Detail Relationship for Challenge in Create Object Relationships course

[Trailhead関係　個別の課題別に戻る](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)

--------------------
+ [Admin Beginner > Data Modeling > Create Object Relationships](https://qiita.com/Keiji_otsubo/items/b785fdf343cc63ea0bcf)
+ [Admin Beginner > Data Modeling > Create Object Relationships](https://qiita.com/Keiji_otsubo/items/c3b8d27b01033242bd60)

この質問も多い。ヘルプの内容を教えてもまず理解してくれない。何でだろうねぇ。

```
 Cannot Create Master-Detail Relationship
```

[nable to Create Master-Detail Relationship for Challenge in Create Object Relationships course](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IQ4ef)

:::note
You can also just delete all the child records in your org and then try creating the master-detail relationship.


組織内のすべての子レコードを削除してから、主従関係を作成してみることもできます。
:::

+ [Create Object Relationships](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000ISwhG)

-------------

+ [You cannot create a new Master-Detail relationship on an existing custom object if records already exist. You must first create a Lookup relationship, populate the lookup field with data in all records, and then change the relationship type to Master-Detail](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erIEg)

:::note
+ First create a lookup relationship 
+ Populate the relationship field value for all the records
+ Convert lookup to mater detail.
Or 

 

Simply delete all the records if you don't need them and directly create the Master Detail Relationship field.
:::