OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】クラス④ 〜プロトタイプオブジェクト〜

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# この記事で理解できること
* プロトタイプメソッド、インスタンスメソッドの違い
* プロトタイプイオブジェクト、プロトタイプチェーンの仕組み

# プロトタイプメソッドとインスタンスメソッドの違い
当関連記事「クラス②、③」で記載したプロトタイプメソッドとインスタンスメソッドには以下のような特徴がある。

## プロトタイプメソッド
* `クラス`に定義したメソッド。
* メソッドを`プロトタイプオブジェクト`という特殊なオブジェクトに定義する。

## インスタンスメソッド
* `クラスフィールド`に定義したメソッド。
* クラスの`インスタンス`に対してメソッドを定義する。

```js
class Person {
  name;

  constructor(name) {
    this.name = name;
  }

  // クラスフィールドに定義したメソッド = インスタンスメソッド
  greeting = () => {
    console.log(`${this.name}さん、こんにちは`)
  }
  
  // クラスに定義したメソッド = プロトタイプメソッド
  callName() {
   console.log(this.name); 
  }
}

const personA = new Person("Taro");

personA.greeting();                 // => Taroさん、こんにちは
console.log(personA.callName());    // => Taro
```

## プロトタイプメソッドとインスタンスメソッドの優先順位
プロトタイプメソッドとインスタンスメソッドが理解できたところで、
同名の`プロトタイプメソッド`と`インスタンスメソッド`が存在する場合、どのような挙動となるのか確認する。

* 結論を書くと`インスタンスメソッド`が優先的呼び出される。
* また、インスタンスメソッドがプロトタイプメソッドを上書きするわけでなく、どちらも定義されている。

```js
class Person {
  name;

  constructor(name) {
    this.name = name;
  }

  // インスタンスメソッド
  greeting = () => {
    console.log(`(インスタンスメソッド)${this.name}さん、こんにちは`);
  }
  
  // プロトタイプメソッド
  greeting() {
    console.log(`(プロトタイプメソッド)${this.name}さん、こんにちは`);
  }
}

const personA = new Person("Taro");

// インスタンスメソッドが優先的に呼び出されている
personA.greeting(); // => (インスタンスメソッド)Taroさん、こんにちは
```
これらの挙動についは`プロトタイプオブジェクト`と`プロトタイプチェーン`という仕組みが関係している。

# プロトタイプオブジェクト
* `prototypeプロパティ`に自動的に作成される特殊なオブジェクト(それが『`プロトタイプオブジェクト`』ややこしい..)
* class構文を用いたクラスに定義したメソッドは、`プロトタイプオブジェクトのプロパティ`として定義される。

```js
class Person {
  // このメソッドは、プロトタイプオブジェクトのプロパティとして定義される
  greeting() { }
}
```

# プロトタイプチェーン
* インスタンスから`プロトタイプメソッド`を呼び出せる仕組み。
* 以下の2つの処理から成り立つ
    * インスタンス作成時
        * インスタンスが持つ内部プロパティ[[Prototype]]へプロトタイプオブジェクトの参照を保存する処理
    * インスタンスのプロパティ参照時
        * インスタンスが持つ内部プロパティ[[Prototype]]まで探索する処理

```js
class sampleClass {
  // プロトタイプメソッド
  greeting() {
    console.log("こんにちは");
  }
}

const instance = new sampleClass();

// インスタンスからプロトタイプメソッドを呼び出せる
// 裏側にはプロトタイプチェーンという仕組みがある
instance.greeting(); // => こんにちは
```

# インスタンス作成とプロトタイプチェーン
* クラスからnew演算子でインスタンスを作成する際、インスタンスにはクラスの`プロトタイプオブジェクトへの参照`が保存される。
* 保存先としては、インスタンスオブジェクトの`[[Prototype]]`という内部プロパティに保存される。
* `[[Prototype]]`は通常のプロパティのようにアクセスできないため、`Object.getPrototypeOf`メソッドで取得できる。

```js
// インスタンスはどのクラスから作られたかやそのクラスのプロトタイプオブジェクトを知っている 

```

# プロパティの参照とプロトタイプチェーン
* オブジェクトがプロパティを探索するときは次のような順番で、それぞれのオブジェクトを調べる。
    * 1.オブジェクト自身
    * 2.オブジェクトの[[Prototype]]の参照先（プロトタイプオブジェクト）
    * 3.それでも無かった場合、`undefined`が返される。
* この内部へと順番に探す仕組みを`プロトタイプチェーン`と呼ぶ。

```js
class sampleClass {
  // プロトタイプメソッド
  greeting() {
    console.log("こんにちは");
  }
}

const instance = new sampleClass();

instance.greeting(); // => こんにちは
/**
 * greetingメソッドが呼び出されるまでの流れ
 * 
 *  ①インスタンス(instance)内を探す ->  存在しない
 *  ②インスタンスの[[Prototype]]内部プロパティを参照する(プロトタイプオブジェクト)  -> プロトタイプメソッドに存在する
 *  ③プロトタイプメソッドgreetingが呼び出されている
 */
```
Excel VBA 第12回 Excelアドインの削除方法とはまった時の対処

# はじめに
Excelアドインの削除方法を整理します。
なんでもないことなのですが、ちょっとくせがあって、削除方法を誤ると面倒なことになるようなので、メモします。
といっても、環境によってなのか？、Excelのバージョンなのか？よくわからないのですが、面倒なことにならない場合もあるようです。
私も2台のPCで試してみると、一方のPCでは問題が発生し、もう一方のPCでは問題ありませんでした。
ということなので、もしはまったらこういう対処もひとつあるかもしれないという程度で目オンします。

# 今回実施する内容
Excelアドインを正しく削除する方法と、誤って削除したときの対処方法をまとめます。

# ソースコード(Git Hub)
なし

# 環境
OS:Windows 10 JP
Excel: Excel 2021 (64bit)（こちらは問題未発生）
Excel: Office 365のExcel（64bit） （こちらで問題発生）

# 参考
なし
# 用語
なし

# 正しいExcelアドインの削除方法
要は順番だけなんです。
1. [開発]タブ->[Excelアドイン]リボンで表示されるアドインメニューで該当のアドインのチェックを外してOKする。
2. 該当のファイルを削除する。
デフォルトでは以下にアドインファイルはあります。
C:\Users\[ユーザ名]\AppData\Roaming\Microsoft\AddIns

この順で実施すれば問題ありません。

# Excelアドインの誤った削除方法とその時に発生する事象
1. Excelアドインが有効な状態で、上記のフォルダにあるファイルを削除します（Excel起動していると削除できませんので、Excelは終了させておきます）。
**いきなり削除が誤りです。**
削除した後にExcelを起動すると、こんなメッセージが表示されます。
![削除時のエラーメッセージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/36b7e2f9-4bbd-9294-86ff-56eb3a32f9cc.jpeg)
これで削除されればそれで満足なのですがそういうことはありませんから、Excelアドインを解除します。

2. [開発]タブ->[Excelアドイン]リボンで表示されるアドインメニューで該当のアドインのチェックを外すと、メッセージが表示されます。
これでリストから削除されてOKのような気がします。
![アドインの削除.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/9a48d90b-e57a-e8f6-eda9-c83091987a5f.jpeg)
ですが、うまくいかないPCでは、Excelを終了して再起動するとまた同じメッセージが出ます。これの繰り返しで永遠とアドインを削除できなくなります。
なぜかな？原因が今のところわかりません。

# 本事象ではまった場合の対処
上記のような事象に陥った場合は、面倒なんですが、簡単です。
正規の手順で削除すればいいだけなんです。
それが少し面倒というかやり直しが面倒なのですが。
繰り返しになりますが、正しい手順は、
1. Excelアドインを削除しているわけですから、そのExcelアドインのファイルを元の場所に戻してあげる。
2. [開発]タブ->[Excelアドイン]リボンで表示されるアドインメニューで該当のアドインのチェックを外す。
3. 該当のファイルを削除する。

1手順が面倒だったりするんですよね。削除して次にExcel起動したときに気づいたりするので、すでにゴミ箱にも該当ファイルがなかったりして。
そんなときはファイル名だけ合わせれば大丈夫なので、強引にファイル名を合わせるのもありかなと。

# おわりに
今回はExelアドインの削除とはまった時の対処について記載しました。
こういう状態に陥るのは私の環境だけなのかもしれません。
まあこういうこともある人もほかにもいるのではないかと備忘もかねてメモリました。
python実行で「bot error」

# はじめに
A-people見ていて少し気になったネタです。

https://apeople.automationanywhere.com/s/feed/0D52t00001WB5BJCA1?language=en_US

pythonスクリプト単体は問題なく動くけど、A360から実行したら「bot error」になる話。

以下、簡略化したBotと結果の再現。
```
import base64

def ConvertText(data):
    datatoReturn = base64.b64encode(bytes(data,'utf-8'))
    return datatoReturn
```

![python_bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/04e53524-0487-197a-7479-ef4bd8f88437.png)

![bot_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/2bb6cdcd-d552-8740-4e74-6ce5960180a3.png)

# ログを見てみる
「bot error」では原因がわからないので、ログを見てみます。
C:\ProgramData\AutomationAnywhere\BotRunner\Logs\Bot_Launcher.log

時刻を頼りに該当行を探してみると以下のエラーが出ているようです。
（適当に折り返しています）
```
encoder.py", line 179, in default     
raise TypeError(f'Object of type {o.__class__.__name__} ' 
TypeError: Object of type bytes is not JSON serializable 
```

base64.b64encodeはbytesオブジェクトを返すので、戻りを受け取る事ができないのだな、って事で、pythonスクリプトを以下修正。
```
datatoReturn = str(base64.b64encode(bytes(data,'utf-8')))
```
bytesオブジェクトを文字列に変換しておきます。
これで「bot error」を回避できました。
（他にいろいろやり方あると思います）

# 簡単なまとめ
「bot error」だけで原因がよくわからないときは、
C:\ProgramData\AutomationAnywhere\BotRunner\Logs\Bot_Launcher.log
を見てみましょう。
VS CodeのWebアプリ開発で、Snyk拡張機能がリアルタイムに脆弱性チェックしてくれた件

## はじめに

VS CodeでWebアプリ開発中に、脆弱性チェックを行ってみました。

## 脆弱性診断ツールは、Snyk(スニーク)を使用


- 安全で迅速な開発を支援する、デベロッパーファーストのセキュリティプラットフォーム
- コードの依存OSSやコンテナ/IaCにおける脆弱性を見つけ、優先順位をつけ自動修正
- Gitや統合開発環境(IDE)、CI/CDパイプラインに直接組み込め、簡単に使用可能

※ 引用元: https://go.snyk.io/jp.html

## 検証対象のWebアプリに、[vulpy](https://github.com/fportantier/vulpy) を使用

- 良い/悪いコードを比較するためのWebアプリで、Web Application Security Lab謹製
- Python/Flask/SQLiteで開発された、2つの側面を持つWebアプリ
    - GOODコード: 安全なコーディングのベストプラクティスに準拠
        - [OWASP Application Security Verification Standard](https://owasp.org/www-project-application-security-verification-standard/)
    - BADコード: セキュリティが考慮されていないコード

## 検証環境

- Windows 10
- VS Code
    - Snyk 拡張機能

## 検証開始

### GitHubからvulpyプロジェクトをclone

```powershell
> git clone https://github.com/fportantier/vulpy
```

## VS Codeでvulpyを開く

- VS Codeで、vulpyをクローンしたフォルダを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/b52b1b15-f13c-5f4a-7eda-5f8bacc40d26.png)

- VS Codeターミナルからvulpyをインストール

```powershell
> pip3 install --user -r requirements.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/7e31eb86-dc6c-14f5-67dc-62d6731b83a3.png)

## VS CodeでSnykの拡張機能をインストールし、スキャンを実施

- Snyk拡張機能のインストール手順は、以下をご参照
    - [Snyk CodeのVSCode拡張機能を使ってローカルで手軽に脆弱性チェックする](https://qiita.com/ynishimura0922/items/c63fa2026aee524e7c53)

- スキャン開始

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/b9fd9bc0-22fe-4c2d-d2b4-f1033425e395.png)

## 脆弱性チェックの結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/0c1a5195-a531-399f-6511-329134f10126.png)

### セキュリティとクォリティーの二つの側面から診断、レベル分け(H、M)し指摘

- CODE SECURITY
    - サニタイズ漏れによる、`SQL Injection`発生リスク
    - サニタイズ漏れによる、`Cross-Site Scripting attack (XSS)`発生リスク
- CODE QUALITY
    - クローズ漏れ: `Missing close`

※ 当該脆弱性を、他のプロジェクトではどのように修正したかまで示してくれる、ありがたい。

### サニタイズ漏れの詳細

- サニタイズ漏れによる、SQL Injection発生リスク

```
Unsanitized input from a web form [:16]
flows [:16, :16, :20, :5, :5, :12, :12, :12] into execute [:12], 
where it is used in an SQL query. 
This may result in an SQL Injection vulnerability.
```

注目すべきは、画面右下の脆弱性の修正方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/d54aa128-bebf-85b7-298d-e71673235ed6.png)

- サニタイズ漏れによる、Cross-Site Scripting attack (XSS)発生リスク

```
Unsanitized input from a web form [:16]
flows [:16, :16, :20, :20, :20, :22, :26, :32, :32, :32, :33] into the return value of do_login [:33],
where it is used to render an HTML page returned to the user.
This may result in a Cross-Site Scripting attack (XSS).
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/541ab49b-4578-9e9e-22d4-972b29eb0233.png)

### クローズ漏れの詳細

ファイルディスクリプタのクローズ漏れなど指摘

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/be593225-df21-bf50-0e65-25a752eccfa8.png)

## おわりに

VS Codeでコーディング中に、脆弱性チェックをリアルタイムで実施できました。
脆弱性の不安を解消したい方は、Snyk 拡張機能が1つの選択肢かもしれません。
SagemathのCycle Indexを用いて立方体の色分け問題を解く

[バーンサイドの補題（Wikipedia）](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%B3%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AE%E8%A3%9C%E9%A1%8C)でも紹介されているように例題としてよく取り上げられる立方体の塗り分け問題をSagemathのCycle Indexを用いて解いてみます。

### 【例題 １】立方体の面を3色で塗り分ける数を求める（回転して同じになるものは１つと数える）

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/86cdc018-b898-cc63-bf9d-a76751551f32.png width="120">

#### 1.（正六面体）の面の置換群を求める

まず立方体（正六面体）の面の置換群を求める必要があります。上記のWikiでも24通りの置換を手計算で求めていますが、Sagemathを使って求める方法が[Sage Tutorials: Group Theory and Sage](https://doc.sagemath.org/html/en/thematic_tutorials/group_theory.html#symmetries-of-a-cube)で説明されています。

分かりやすいように正六面体に下のサイコロのように番号が振られているとします。基本的なサイコロの面の移動方法は以下の3つで、それぞれの場合に各面が置換を巡回置換表現で表します。この3つの置換が（正六面体）の面の置換群の生成元と考えられます。

| 移動方法 | 巡回置換表現 | 
| :--- | :---: | 
|縦に90度ころがす | $(1265)$|
|横に90度ころがす] | $(1364)$|
|水平に90度回す | $(2354)$ |

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/a216b06d-4ed2-3714-2e1b-67f9231d845f.png width="200">

#### 2. Sagemathで置換群を求める

この生成元を使ってSagemathで置換群を求めます。24個の置換が求まっているのが分かります。

```python 
cubeface = PermutationGroup(["(1,3,6,4)", "(1,2,6,5)", "(2,3,5,4)"])
cubeface.list()
# [(), (2,5)(3,4), (1,4,5)(2,6,3), (1,4,2)(3,5,6), (1,5,4)(2,3,6), (1,5,3)(2,4,6), (1,6)(3,4), (1,6)(2,5), (1,3,5)(2,6,4), (1,3,2)(4,5,6), (1,2,3)(4,6,5), (1,2,4)(3,6,5), (1,3,6,4), (1,4)(2,5)(3,6), (1,2,6,5), (1,5,6,2), (1,6)(2,3)(4,5), (2,4,5,3), (1,4,6,3), (1,3)(2,5)(4,6), (1,5)(2,6)(3,4), (1,2)(3,4)(5,6), (2,3,5,4), (1,6)(2,4)(3,5)]
```
この正六面体群が対照群$S4$と同型であることも分かります。

```python 
cubeface.is_isomorphic(SymmetricGroup(4))
# True
```

#### 3. Cycle Indexを求めて例題を解く

正六面体群が求まったらCycle Indexを求めて3を代入すれば答えの$57$が求まります。
この詳細は[SagemathのCycle Indexを用いてピザの色分け問題を解く（その１）](https://qiita.com/masa0599/items/12ec8b65b7eeb3e28c19)を参考にしてください。

```python 
P = cubeface.cycle_index();P
sum([i[1]*prod([3 for j in i[0]]) for i in P])
#1/24*p[1, 1, 1, 1, 1, 1] + 1/8*p[2, 2, 1, 1] + 1/4*p[2, 2, 2] + 1/3*p[3, 3] + 1/4*p[4, 1, 1]
#57
```

（開発環境：CoCalc, Sage Worksheet）
Mobile Publisher（モバイルパブリッシャー）

### Mobile Publisher の使用開始
https://trailhead.salesforce.com/ja/content/learn/modules/salesforce1_branded_apps/salesforce1_branded_apps_intro

### Salesforce Mobile Publisherのご紹介 | Salesforce
https://www.youtube.com/watch?v=C7fv2mqd9iI

### Experience Cloud アプリケーション用の Mobile Publisher プロジェクトの作成
https://help.salesforce.com/s/articleView?id=sf.branded_apps_create_project_commun.htm&type=5

### Build Rich Mobile Apps With Salesforce Mobile Publisher And Salesforce CMS
https://www.salesforce.com/video/7837341/

### 以下メモ

#### Moblie Publiser for Community
◆ ノンプログラミングでモバイルアプリ構築可能。
　⇒Communityなどはコミュニティビルダーでサイトを作り、ポイント＆クリックでカスタムモバイルアプリ化が可能。
　　【手順】SFに問いあわせ⇒ビルダーで構築⇒ストアにプロジェクト登録（配信用のアイコン画像や説明等）⇒管理パッケージをインストール（プッシュ通知など実行する仕組みなど包含）⇒ベータ版でテスト⇒OKならSubmit⇒審査OKなら掲載
◆ 毎回のログインが不要で、Push通知、位置情報、FaceId／TouchIdなどモバイルデバイスのメリット活用が可能。
◆ 要ライセンス?　⇒　調べたがHitしない。追加コスト必要なはずだが。

◆ SF社にてStoreへの配信手続きを実施してくれる。
◆ Payground環境で試行可能。（ただPaygroundだとアイコンなどのブランディングなどは試せない。）
◆ コミュニティビルダーでの追加／変更／削除は、モバイル側に適応可能。
※MobliePubliser for Communityは実態はハイブリッドモバイル
◆ LWC対応。1組織5個。有料アプリ／アプリ内課金は不可。Push通知に上限あり。
　 Push通知はChatter関連やカスタムの通知、縦表示のみサポート

#### その他メモ

ビルダーで構築
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/9aef6357-fbf2-b866-8f50-15cc747c0bf1.png)

ブランド名や色、ロゴなど設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/dfeb2475-679f-e27c-662b-dc11a166ba6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/59825fbd-ab85-96b6-ebc3-b9138aafbd9d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/ffb00f16-274f-ed11-5bd1-cce2fdb17b73.png)

手順
ビルダーで作る、
ベータ版でテストして問題なければStoreにアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/cb30a6ca-d2db-fa4d-b34c-115b915157fc.png)

ビルダー上、LWCの配置が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/e4f77d2c-c9ec-c135-a43a-e52e8fc6569c.png)

レスポンシブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/2d118ce9-7f65-cd0b-8dd2-98a0bb5d5a71.png)


MarketingCloudと連携し、ロケーションインテリジェンスを使って適切なプッシュ通知を送ることも可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/5721af8b-b88c-a1cf-b46c-8363050e4c55.png)

社内向けUI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/1c3571dd-eba2-71d4-16bd-7953e5a32636.png)


#### Known Issues and Limitations
https://help.salesforce.com/s/articleView?id=sf.branded_apps_best_practices_known_issues.htm&type=5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/4f399004-ddfa-d5c4-7f96-05ad9b6d3175.png)

#### ブログ
https://www.salesforcereader.com/2021/03/get-started-with-salesforce-mobile.html
Docker Desktop の代わりに docker コマンドを使用して Azure Container Instances を操作してみた

## 背景と目的

Docker Desktop の企業利用が有料になったのを機に、私は会社 PC からアンインストールしてしまいました。それでもたまに docker コマンドを使って検証したい時が発生します。WSL のインストールも禁止されている PC なので、Azure 上の検証用 AVD につないで docker コマンドを使った検証をしていたります。今回は Docker Desktop の代わりに docker コマンドを使用して Azure Container Instances を操作してみました。

## 前提条件

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.5
BuildVersion:   21G72

$ az version
{
  "azure-cli": "2.39.0",
  "azure-cli-core": "2.39.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}

$ docker --version
Docker version 20.10.17, build 100c701

# Docker Desktop は停止した状態で動作を確認しました
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

## 検証内容

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrdaci

# リソースグループを作成します
az group create --name ${prefix}-rg --location $region

# Azure にログインします（ブラウザが開きます）
docker login azure

# ACI に関連付けられた Docker コンテキストを作成します
docker context create aci ${prefix} --resource-group ${prefix}-rg

# Docker コンテキスト一覧を表示します
docker context ls

# 作成したコンテキストで Nginx コンテナを実行します
docker --context ${prefix} run --name ${prefix} -d -p 80:80 nginx

# リソースグループ内に ACI リソースが作成されたのを確認します
az resource list --resource-group ${prefix}-rg --output table

# ACI のパブリック IP アドレスを取得します
pip=$(az container show --name ${prefix} --resource-group ${prefix}-rg --query ipAddress.ip --output tsv)

# ACI にアクセス出来るか試します
curl $pip

# アクセスログを確認します
docker --context ${prefix} logs ${prefix}

# コンテナを停止します
docker --context ${prefix} stop ${prefix}

# コンテナを削除します
docker --context ${prefix} rm ${prefix}

# リソースグループ内に ACI リソースが無くなったのを確認します
az resource list --resource-group ${prefix}-rg --output table

# Docker コンテキストを削除します
docker context rm ${prefix}

# Docker コンテキスト一覧を表示します
ddocker context ls

# リソースグループを削除します
az group delete --name ${prefix}-rg --yes
```

## 参考

https://docs.docker.com/cloud/aci-integration/
BVE用ESP32メーターボード製作方法

__BVE 鉄道シミュレーターで自宅運転台を動かそう～ATC対応速度計を動かす～シフトレジスタ編__ で使用した基板の製作方法です。

https://qiita.com/usashirou/items/0d158b839f7465465eb3

# 部品リスト
部品は以下になります。
ICの数が01/02系用と7000・8000系用で異なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/25737281-623f-4cc4-8aef-a03f5a947822.png)

# 回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/82509f50-376c-d055-f664-eee0feb092b5.png)
# 製作方針を決める
本基板では液晶やATCメータ、入力デバイスなどに対応可能です。
今回は、01・02系及び8000（7000）系用ATCメータ及び液晶を使う前提で説明します。
# 全景
__表面__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9413a571-9524-1a84-a72c-989980381f65.png)
__実装参考例__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c0156436-712e-a56b-cedf-ed2f47896cdb.png)
__裏面__
![DSC_0529 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8f0074e6-3cda-b55a-bbbb-5b5824c61291.jpeg)
# 共通） 01・02系の速度計を動かす場合
加工は、上から順番に行う事をお勧めします。
1. ICのハンダ付け
01・02系はATCメータのインジケーターの数は24個以下の為、左下の黄色の枠内のIC及びコネクタを使用します。
2. コンデンサ
次に、ICの横にあるC6~11にコンデンサ0.1uFをはんだ付けします。
C1には1uFのコンデンサをはんだ付けします。
3. 可変抵抗
メータに合わせて可変抵抗を選定します。
    - 可変抵抗例）
        - ATCメータ：2kΩ
        - 電流計：1kΩまたは5kΩ
        - ブレーキ指令：1kΩ
4. コネクタ
使用するデバイスの数に合わせてコネクタをはんだ付けします。
5. ピンヘッダー
液晶を使用する場合は、左上のコネクタをはんだ付けします。
液晶のリセットピンを使う場合は、C1の上のRSTのピンにもピンヘッダーを追加します。
6. スイッチ・ジャック
スイッチは向きを注意してハンダ付けします。
7. ESP32のコネクタをはんだ付けする
ESP32にピンヘッダーを軽くつけた状態で仮付けし、ESP32を取り外してすべてのピンをはんだ付けします。
8. ジャンパ
裏面のパッドをショートさせます。(3.3V)
# 7000・8000系の速度計を動かす場合
右下の黄色の枠内のTD62783と74HC595、コネクタを1列追加します。
ただし、緑枠内にあるジャンパをショートしておきます。
# 完成
以上で完成です。
半田付けの確認を含めてプログラムを入れて1個1個の動作を確認してください。
# コネクタによる違い
CN1~8までは24Vのインプット（GND)が制御可能です。
CN9~12は24Vのアウトプットが制御可能です。
この為、出力制御する部品と入力制御するものを分けて制御することが出来ます。
Salesforceで数式項目を作成しよう～取引先責任者の期日を元に優先順位を作成する数式項目

こんにちは。本橋孝昭です。

今回はSalesforceのHELPに記載されてある
「取引先責任者の期日を元にランキングを作成する数式項目」を英訳し解説しましました。


※元の英文HELPはこちら
Formula field to create a ranking based on the number of days from due date
https://help.salesforce.com/s/articleView?id=000366433&type=1

## 説明

Salesforce利用ユーザからこのような要望がございました

・取引先責任者にあるカスタム項目「メンバーシップ期日」項目に基づいて1～5の優先順位が見たい

なお、ランキングの設定は以下のようになります
・もしもメンバーシップ期日が今日から30日以上の場合、「1」を表示
・もしもメンバーシップ期日が今日から15日より多く、29日より少ない場合「3」を表示
・もしもメンバーシップ期日が今日から15日未満の場合「5」を表示

さて、システム管理者はどのような数式項目を作成すればいいでしょうか？

## 解決方法

さあ、数式項目を作成しましょう。

### 前提条件
その前に、前提として取引先責任者オブジェクトには日付型項目で「メンバーシップ日付」（API名　Membership_Due_Date__c）項目が存在するとします

![メンバー01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/09a324ba-15c4-a76b-a7a0-d36746239c15.png)


### 数式項目作成方法
取引先責任者の「Membership_Due_Date__c」項目を元にからの超過日数に基優先順位を付ける数式項目の作成手順は以下になります

1.まず、取引先責任者のオブジェyクトマネージャーにある [項目とリレーション] セクションを開きます。そして「新規」をクリックします

2.データ型として「数式」を選択し、「数式の戻り値のデータ型」として 「数値」を選択して、「次へ」をクリックします

3. 数式編集 ページで、[高度な数式] を選択し、数式を次のように入力します。

IF((Membership_Due_Date__c - TODAY()) >= 30, 1, 
IF(AND((Membership_Due_Date__c - TODAY()) < 30,
(Membership_Due_Date__c - TODAY()) > 15), 3, 
IF(((Membership_Due_Date__c - TODAY()) ) <= 15、5、NULL)))
 

4. エディタの左下にある [構文を確認] ボタンをクリックして、数式を確認します。
5. [数式オプション] セクションで、[小数点の位置] を 0 に設定します。
![数式01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d8ff2c95-becb-6ccf-dfcc-d6faa13e0109.png)


6. [空白項目の処理] セクションで、[空白項目を空白として処理] をオプションとして選択し、[次へ] をクリックします。
7. プロファイルの目的の項目レベル セキュリティを選択し、ユーザーの要件に従って数式項目を配置するためのページ レイアウトを選択します。
8.項目を保存するには、[保存] をクリックします。


以上で数式項目作成完了です。
この数式項目を作成すれば今日（現在2022年8月13日）を元に「メンバーシップ期日」の日付から優先順位の確認が可能になります
（「メンバーシップ期日」の日付が空欄の場合、空欄として処理されます）

![責任者01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2f36efa4-5e68-a8ce-50ea-f05d2b793920.png)

## 謝辞
今回この記事を執筆した　Salesforce Answers LeaderのAjaypret Singh Saini様、本当にありがとうございます。
そしてこの記事を公開してくださったSalesforce様、本当にありがとうございます。

Thank you　Ajaypret Singh Saini　！

Ajaypret Singh Saini様についてはこちら

 Ajaypret Singh Saini  | Salesforce Answers Leader
Ajaypreet Singh Saini is working as a Salesforce Implementation Specialist at Grantbook. Prior to Grantbook, Ajaypreet served as a Salesforce Administrator for 2 years working on Sales Could where he was responsible for configuring and administrating complex processes and maintaining security of Salesforce Instance.
new SqlConnection() で Visual Studio のデバッグ実行がフリーズする

## 現象

Visual Studio でアプリケーションをデバッグ実行中、 SqlConnection のインスタンス化 ( new SqlConnection() ) でフリーズしてしまう現象が発生した。

## 対処

[c# - calling new SqlConnection() hangs program - Stack Overflow](https://stackoverflow.com/questions/8408236/calling-new-sqlconnection-hangs-program)
[System.Data.SqlClient.SqlConnection のnewでハングする - Qiita](https://qiita.com/mak_in/items/a3f5f76e464d0c294aff)

まず上記の記事を参考に、パフォーマンスカウンターのアンロードを試した。

```msshell
unlodctr ".NET Data Provider for SqlServer"
```

しかし `.NET Data Provider for SqlServer のカウンターはまだインストールされていません` というメッセージが表示され、フリーズ現象は解消しなかった。

参考記事のようにカウンターが壊れたのではなく、カウンターが消えている（アンインストール状態になっている）のではないかと想定し、再インストールするために以下のコマンドを実行してみた。

```msshell
lodctr "C:\Windows\INF\.NET Data Provider for SqlServer\_dataperfcounters_shared12_neutral.ini"
```

これにより、フリーズ現象が解消した。
ゼロレーティング とは

## 勉強前イメージ

レーティング とは

## 調査

### ゼロレーティング とは

通信業界では特定のアプリケーションに関する通信を従量課金の対象から除外する施策のことです。
目的としては人気のあるアプリなどの通信料金を除外することによってユーザを集めます。
他の言葉でいうとカウントフリーなどとも言われています。

### ゼロレーティングの仕組み

ゼロレーティングをするには、どのアプリでの通信が課金の除外対象でどれが通信対象になるかを決めないといけないです。
そこで上記を行うのは [DPI](https://qiita.com/miyuki_samitani/items/6ecb8d13dd7291543e2d) という技術がありそれが使われています。

DPIはDeep Packet Inspection の略でパケットの検査の手法の一つになります。
プロトコルのデータを確認して検査を行います。
データの内容に踏み込んで解析することでヘッダ情報だけじゃわからない挙動を検知することができます。

### ゼロレーティングに関する検討

ネットワークの中立性という言葉があり、インターネット上のすべてのデータをアプリやトラフィックなどを
差別や課金の区別をすることなく平等に扱うという考え方です。

ゼロレーティングはDPIという技術を使ってデータの中身を解析することでどのアプリからの通信かどうかを見極めています。
その為、ネットワークの中立性に関して問題があるとして国によっては規制がされたりしています。

## 勉強後イメージ

カウントフリーとかyoutubeは無制限だよーとか聞いたことあるけど
どうやって見てるのかな・・・って思ってたけどデータの中身を見てるのね。

## 参考

- [ゼロレーティングとは](https://www.nic.ad.jp/ja/basics/terms/zerorating.html)
- [ゼロレーティングとは？メリット・仕組み・現状・動向 - ネットワークの中立性](https://boxil.jp/mag/a3347/)
AWSに用意された便利なツール

# AWSはサービスを総合的に管理できる
AWSは複数のサービスを使うケースが多いため、サービスを総合的に管理できる便利な機能が提供されている。
|ツール名|内容|
|-|-|
|マネジメントコンソール|サービスの設定などを行う画面。Webブラウザで使用できる|
|CLI|コマンドで操作できるコマンドラインツール。マネジメントコンソールでできないことも可能|
|IAM|サービスを使用するためのユーザーアカウント。グループやポリシーで一括管理できる|
|コストマネジメント|コストやグラフなどで確認できる。予算に基づく管理なども可能|
|CloudWatch|監視ツール。閾値を超えた場合にアクションを起こすこともできる|
# AWSアカウント
AWSを利用するためのアカウントを**AWSアカウント**という。
※買い物のAmazonアカウントとは別
AWSのサービスではサーバーやストレージをレンタルすることができ、個人でも使用できるが、団体の方がメリットが大きいため企業ユーザーも多い。しかし、複数のプロジェクトで同じAWSアカウントを使用すると費用などが曖昧になり、管理が煩雑になるため、プロジェクトごとに分けて管理をする傾向がある
# rootユーザー
AWSアカウントは登録したメールアドレスとパスワードでログインする。
AWSアカウントは全ての操作ができる管理者権限を持つため **rootユーザー**ともいう。
rootユーザーは全ての権限を持つので便利ではありますが、ミスをすると致命的となり、乗っ取られてしまうととても厄介である。そのため、AWSには**IAM**という**サービスを使用するだけのユーザーが別に用意されている**。通常の運用ではIAMを利用するのが普通。
# サービスを自分に合わせてカスタマイズ
AWSはすぐに始められて、いつでもやめられます。なので、必要な時だけインストールして、必要なサービスを使うのが一般的です。また一つのサービスの中に複数の選択肢が用意されているので、自分に適切なサービスを選択し、状況が変わったらサービスも変更するようにする。
SAP Side by Side開発の基本的なことのまとめ

# はじめに

2022年4月末に投稿した、「[SAP Business Technology Platform (BTP)の基本的なことのまとめ](https://qiita.com/Yanagawa_Yoshihisa/items/bea677d3b851f6604d0d)」が好評で、数多くの方々にご覧頂いたため、今回はその第2段の記事を書きました。

テーマは「**Side by Side開発**」です。理由や背景、仕組みの理解が無いままに、BTP上の｢**Side by Side開発**｣の議論がなされていることが多いため、理解の促進を目的とし、簡単な記事をまとめさせて頂きました。

また、本記事も概要把握や個人とトライアル利用の参考として、まとめたものなので、プロジェクトでの利用の際は、SAP社への問合せの実施や正式情報であるHelp Portalを活用して下さい。

また、本記事はS/4HANAをPrivate Cloudとして扱う場合（オンプレミスでの導入や「S/4HANA Cloud private edition」）を想定して記載しています。SaaSに近い製品（S/4HANA Cloud）の場合は考え方が少し異なりますので、その点はご注意下さい。

# 一言で言うと

一般的にSAP社のパッケージ製品（S/4HANAなど）を使用して業務アプリケーションを構築する際、標準機能では対応できない要件に対して「追加開発（アドオン）」が必要となります。
この追加開発は従来、SAPのパッケージ製品と同じ実行基盤上で実施していましたが、これを別基盤（主にSAP Business Technology Platform：BTP）に移し、APIによる疎結合連携としたアーキテクチャが「Side by Side開発」です。これに対し、従来の開発方法は「In App開発」と呼ばれます。
この開発方式により、システムアーキテクチャが根本的に変わり、標準機能と追加開発機能が「疎結合」となります。また、SAPのパッケージ製品の実行基盤上での制約（言語や機能）が取り除かれるため、より自由な開発が可能になります。例えば、S/4HANA上では基本的にABAP開発に限られていたものが、BTP上ではJavaやJavaScriptによる開発が可能になります。

# 目次

- [なぜ「Side by Side開発」を実施するのか？](https://qiita.com/Yanagawa_Yoshihisa/items/233992b6f3d759e43c1b)
- [S/4HANAにおける追加要件の実装手段の整理](https://qiita.com/Yanagawa_Yoshihisa/items/b324316ef3c3ac9ff0d9)
- [アーキテクチャ的な特徴と「In App開発」との違い](https://qiita.com/Yanagawa_Yoshihisa/items/fd6b4efca5925e148c61)
- [｢Side by Side開発｣をBTPにて実施するメリット](https://qiita.com/Yanagawa_Yoshihisa/items/0a60f527117f8f0d4837)
- [｢Side by Side開発｣と｢Composability｣](https://qiita.com/Yanagawa_Yoshihisa/items/67872cf58a57db99fbb4)
KV STUDIO ショートカットキー一覧のチートシート

勉強のために作ったキーエンスKV STUDIO ショートカットキー一覧のチートシートです。
初期形式と三菱GPPQの両方あります。

![KV STUDIO ショートカットキー 20220813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/87c33f81-af64-7303-7ebc-34324a801ee0.png)

![KV STUDIO ショートカットキー 20220813_GPPQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/dbd4ce8b-3a68-a9fd-685a-88864d3c9517.png)

元データ(LibreOffice Draw),PNG,PDFを入れています。

https://github.com/fa-yoshinobu/fa-yoshinobu.github.io/tree/main/Qiita%20Document/20220813
ネットワーク基本設計（目次）

ネットワークの基本設計に着手する際、どのような項目の検討が必要か
過去の基本設計書の見直し、整理に時間がかかってしまうので、目次サンプルをまとめてみました。
ご参考までにどうぞ。


# 基本設計書（目次）
1. はじめに
    1.1 本書の目的
       	1.2 本書の対象範囲
    	1.3 本プロジェクトの背景・目的
    	1.4 設計方針
    	1.5 サービス設計
    	1.6 用語の定義

2. ファシリティ設計
	2.1 導入機器一覧
    　　2.1.1 選定用件
	　　2.1.2 機器諸元
	2.2 命名規則
	2.3 ファシリティ設計
	　　2.3.1 機器搭載
	　　2.3.2 電源設計
	2.4 ケーブル設計
	2.5 ラベル設計

3. ネットワーク設計
	3.1 全体構成
	3.2 回線設計
	3.3 物理設計
        　　3.3.1 物理ネットワーク図
		　　3.3.2 インターフェース設計
		　　3.3.3 ポート収容設計
	3.4 論理設計
		　　3.4.1 論理ネットワーク図
		　　3.4.2 VLAN設計
		　　3.4.2 IPアドレス管理
		　　3.4.3 ルーティング設計
	3.5 機能設計
		　　3.5.1 NAT
		　　3.5.2 QoS
		　　3.5.3 DHCP
		　　3.5.4 VPN

4. 冗長設計
	4.1 機器冗長
	4.2 リンク冗長
	4.3 経路冗長
	4.4 DR設計

5. トラフィックフロー
    5.1 正常時トラフィックフロー
    5.2 障害時トラフィックフロー

6. セキュリティ設計
	6.1 概要
	6.2 アクセスリスト設計
	6.3 ファイアウォール設計
	6.4 認証設計

7. 管理設計
	7.1 概要
	7.2 管理アクセス
	7.3 NTP設計
	7.4 監視設計
    　　7.4.1 監視体制
	　　7.4.2 監視対象・項目
	　　7.4.3 通知
	7.5 ログ管理
Webサイトを取り巻く技術

# HTMLとWebブラウザの仕組み
WebサイトのコンテンツはHTMLという形式で記述されている
HTMLで記述されているのは、文字と構造だけで、画像は別ファイルとして存在し、HTMLには画像の場所が記述されている。こうしたバラバラのファイルとして存在する文章を画像を、Webブラウザが組み合わせて１つのページとして表示する。
# Webサーバーの仕組み
HTMLや画像ファイル(動画ファイルやPHPプログラム)を置いているのが**Webサーバー**
Webサイトを閲覧するとき、WebサイトのURLにアクセスすると、Webサーバーから該当ファイルがWebブラウザに送られる。
# Webサイトを取り巻く技術
Webブラウザから要求を受けて、ファイルを送る役割を持つのが、Webサーバー用ソフトウェア。
これはさまざまなソフトウェアやプロトコルによって成り立つ。
|項目|内容|
|-|-|
|Webサーバー用のソフトウェア|Webブラウザからの要求を受けて、ファイルを送る機能を備えるソフトウェア。代表例はApacheやNginxがある|
|FTP|サーバーにファイルを転送するときに使用するプロトコル|
|SSH|サーバーをリモート操作するときに使う接続方法|
|SSL証明書|証明書を作成し、サーバーにインストールすると、通信を暗号化するサイトが置き換えられていないことを証明できる。httpsから始まるURLのサーバーには、この証明書がインストールされている|
|リダイレクト|要求されたURLに対し、別のページを転送する仕組み|
|CGI|サーバー側で処理をするプログラムのこと。多くはPerlという言語で書かれている|
|PHP|プログラム言語の１つ。Webアプリケーション開発でよく使われる|
|JavaScript|プログラム言語の１つ。Webブラウザで処理される|
|ストリーミング|データの完了を待たず、先頭のデータが届いた時点ですぐに再生する仕組み|
|拡張子|ファイルがどの形式で保存されているかを示す|
|index.html|慣例的にWebサイトのトップページとするHTMLファイルにつけられる名前|
|ロードバランサー|配下に複数のサーバーを置き、トラフィック分散させることで１台あたりのサーバーの負担を減らす装置|
|FW|ファイアーウォール。送受信するデータについて通過の可否を決める装置。|
|CDN|コンテンツをキャッシュする仕組み。期限切れとなるまではキャッシュをユーザーに返すことで、サーバーの負担を減らすことが可能|
# Webサイトへの攻撃手法
|項目|内容|
|-|-|
|マルウェア|不正かつ有害な動作を行う意図で作成された悪意あるソフトウェアや悪質なコード。ex)ウイルスやトロイの木馬、ワーム、ボット、スパイウェア、キーロガー、バックドア|
|XSS|クロスサイトスクリプティング。閲覧者のWebブラウザに悪意あるスクリプトを埋め込む攻撃|
|CSRF|クロスサイトリクエストフォージェリ。別名イメタグ攻撃、シーサーフ。攻撃者が作成したフォームのデータをサーバーが処理をしてしまう脆弱性をついた攻撃|
|SQLインジェクション|SQL文を送信し、データベースを不正に操作する攻撃|
|セッションハイジャック|セッションを呼ばれる接続情報を乗っ取る攻撃。他人になり済ますことができる|
|DoS攻撃|標的のサービスに負荷をかけて、サービスを停止させたり、サービスの邪魔をする攻撃|
|パスワードクラッキング|サーバー上のパスワードファイルにアクセスしたり、伝送されるパスワードを盗聴して、パスワードを割り出すこと|
フレームワーク、ライブラリ、パッケージ、の違い

## はじめに
新しい言語を学習する過程で、フレームワーク、ライブラリ、パッケージの違いを調べたので、まとめます。

## フレームワーク
　アプリケーションの構造、骨組み。アプリケーションの開発の設計方針を示す。フレームワークに当てはめて開発を行うことで、設計工程を簡略化し、DB連携などの機能を短期間で実装することができる。

Golangだと代表的なのはGin、ルーティング機能とかリクエストレスポンス処理を簡単に書ける。
ルーティングとはリクエストURLと、呼び出すメソッドを結びつけること

## ライブラリ
　機能を持ったコードの集まり。フレームワークが骨組みであるなら、ライブラリは部品の集まり。

## パッケージ
 ライブラリの中で、似ている機能をまとめたもの。


### 〇参考記事
・[【3分ITキーワード】 フレームワークとライブラリの違いは?](https://www.pentasecurity.co.jp/pentapro/entry/framework_library#:~:text=%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92,%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E8%A6%81%E7%B4%A0%E3%81%A7%E3%81%99%E3%80%82)
・[Part1　ソフトウエアのフレームワークとはなにか](https://xtech.nikkei.com/it/article/lecture/20070205/260697/)
・[ライブラリとパッケージとは？](https://snownotes.org/what-is-library-and-package-ja/#i-5)
Djangoの環境構築手順

# 仮想環境作成
Webアプリ開発ではパッケージの依存関係で悩まされることがあるので、プロジェクト毎に仮想環境を構築する。 色々な仮想環境があるが、Pythonで用意されている仮想環境構築ツールを使ってみる。

また、Pythonを使ったプロジェクトでは、プロジェクトごとに必要なパッケージが異なる。
あらゆるパッケージをローカルにインストールすると、ごちゃつくので、プロジェクトごとに仮想環境を作って、そのプロジェクトに合致したパッケージのみをインストールして使う。
これによりプロジェクトごとに仮想環境が作成され、パッケージもその仮想環境ごとに管理できる。

# Djangoの管理者ユーザー作成
👇管理者ユーザーを作成する。
`python manage.py createsuperuser`

# 仮想環境作成と有効化、停止
👇このコマンドで今いるディレクトリ配下にmyenvディレクトリが作成される。
`python -m venv myenv`
👇このコマンドで作った仮想環境を有効化できる
`source myenv/bin/activate`
👇うまくいくとユーザー名の左に仮想環境名が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/96d88aaf-2fb8-bde3-688d-2cbc60247940.png)
仮想環境を停止する時は`deactivate`で停止できる。
👇停止すると(myenv)がなくなっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/b40310e1-70db-1c79-68de-c9d4dba9366f.png)

# requirements.txtを作成
requirements.txtとは、対象のプロジェクトにpip installする必要があるパッケージリストを記載しているファイルらしい。正直今はピンときてないけど、このファイル作っとくと環境構築とか管理が楽になるみたい。
👇を仮想環境を作ったディレクトリに移動して実行
`pip freeze > requirements.txt`
👇でrequirements.txt内に何がインストールされているされているのか確認できる。
`pip freeze`
👇作った段階でrequirements.txtには色々記載されてた。Djangoも入ってたから、別でDjangoはインストールしなくていっか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/d228d390-2dcf-20cf-361a-765795ff3e28.png)



# Djangoでプロジェクト立ち上げ
`django-admin startproject (作成するアプリ名)`
今回はMovieReportというアプリを作りたいのでMovieReportという名前で作成。
👇仮想環境のmyenv, さっき作ったrequirements.txt, 今立ち上げたDjangoのプロジェクトMovieReportがある状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/b29085f1-f2cb-1329-3d38-6a223593f358.png)

# ローカルでサーバー立ち上げ
さっき立ち上げたMovieReportの中に`manage.py`というファイルがある。
サーバーの立ち上げやデータベースのmigrateなどはmanage.pyで行うので、manage.pyの1つ上の階層に移動し、まずmigrateを行う。
👇migrate
`python manage.py migrate`
👇うまくいったぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/2f45474c-13f3-ba33-ec7f-70841e5d078c.png)
👇ローカルサーバー立ち上げ
`python manage.py runserver`
👇http://127.0.0.1:8000/
　を開いて、以下のdjangoの画面が出ればok
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/adfad0bd-5b7c-ed2c-5492-0550c3e6da41.png)
AlmaLinuxにGitをインストールして設定するところまでのメモ

# はじめに
Gitをインストールして、GitHubと連携できるところまで記載します。

Gitをインストールする方法は、一般的に2つあるようです。
1つ目が、`dnf`を使ってインストールする方法。
2つ目が、パッケージファイルを`wget`でダウンロードしてきてインストールする方法。

今回は、dnfを使った方法でインストールします。

# Gitをインストールする
```
# dnf -y install git
```

# バージョン確認
```
# git --version
git version 2.31.1
```
※2022年8月時点でdnfでインストールした場合のバージョンです。

# GitHubアカウント作成
まだGitHubに登録済ませてないよ、という方はこちらで登録を済ませましょう。
サインアップからアカウントを作成できます。
https://github.co.jp/

※アカウント名とメールアドレス、パスワードをちゃんと控えておきましょう。

## アクセストークンを取得
以下を参考にアクセストークンを取得します。
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

1. 右上のアイコンをクリック
2. `Settings`を選択
3. サイドバーにある`Developer settings`を選択
4. `Personal access tokens`を選択
5. `Generate new token`をクリック
6. `Note`にトークンの名前を適当につける
7. `Expiration`は`90days`を選択
※トークンの有効期限です
8. `Select scopes`は、`repo`、`admin:repo_hook`、`delete_repo`にチェック。
※repoのチェックだけでも良さそうな感じですが、今回は公式に記載のとおりにします。
9. `Generate token`をクリック。
10. アクセストークンが表示されます。控えておきましょう。
※画面を閉じると、今後一切確認できなくなります。
　万が一、閉じてしまったり忘れてしまった場合は、同じ手順で再発行してください。

アクセストークンはパスワードと一緒で公開しないこと！！

# ユーザー情報を登録
GitHubやGitLabのアカウントをサーバーに登録します。
```
# git config --global user.name "Your Name"
# git config --global user.email "address@domain.com"
```

設定は、以下のコマンドで確認ができます。
```
# git config --list
user.name=Your Name
user.email=address@domain.com
```
この設定は、`/root/.gitconfig`に保存されていますので、このファイルをcatやlessコマンドを使って確認もできます。
```
# cat /root/.gitconfig 
[user]
        name = Your Name
        email = address@domain.com
```
ルートディレクトリの参照は、`cat ~/.gitconfig`とも書けます。

# アクセストークンを使うところ
cloneするときに使ったりします
```
# git clone https://github.com/{CreatorName or TeamName}/{RepositoryName}.git
Cloning into 'RepositoryName'...
Username for 'https://github.com': YourName
Password for 'https://YourName@github.com': ここにアクセストークンを入力
```

# (参考)どうしても最新版をインストールしたい場合
ソースコードでインストールする方法は、こちらの記事で分かりやすくまとめられてましたので、参考にリンクおいておきます。
https://zenn.dev/ymasaoka/articles/install-git-centos-8

Gitの最新バージョンはこちらで確認できます。
https://git-scm.com/
ネットワーク上で場所を特定する仕組み

# IPアドレスとは
インターネット上で、サーバーやネットワーク、パソコンなどのホスト（端末）を識別する住所のようなものをIPアドレスという。
Webサイトを見るときや、データの送受信をするときに使う。
IPv4の場合、４つに区切られた10進数(最大値：255)で表される。ex)10.210.32.40
IPアドレスはネットワークに接続している限りホスト（スマートフォン・パソコン）１台につき最低１つのIPアドレスが必要。
個人で使うようなものは、IPアドレスが流動的に割り当てられるのに対し、
サーバーは固定しておかないと、ユーザーがアクセスできなくなってしまうので固定する

**AWSでは「Elastic IP」というIPアドレスが用意されており、変動の大きいクラウド上のサーバーであっても、固定のIPアドレスでアクセスできるようになっている**
## IPv4からIPv6への移行
IPv4はIPアドレスが約43億個しかなく足りなくなってきたため、
現在はIPv6への移行が推奨されている。IPv6は８区切りの16進数で表されるため約340潤個使用できる。(潤は10の36乗)
# プライベートIPアドレスとグローバルIPアドレス
## グルーバルIPアドレス
IPアドレスはプライベートIPアドレスとグローバルIPアドレスがある
インターネット上で使われているのは、グローバルIPアドレスで、世界中のどれとも重複することはないため、どのホスト（端末）であるか確実に特定できる。
## プライベートIPアドレス
社内LANや家庭内LANの中で使われるIPアドレス
インターネット上でグローバルIPアドレスが必要ですが、グローバルIPアドレスは数に限りがあり、全世界のパソコン１台１台に割り当てるわけにはいかない。そこで、家庭や会社などの大きな単位にグローバルIPアドレスを割り当て、さらにそのしたのパソコンに家庭や会社の中だけで通用するIPアドレスを割り当てる。
これがプライベートIPアドレスという。
# DNSとドメイン
本来、Webサイトにアクセスしたいときは、Webブラウザに該当のWebサーバーのIPアドレスを入力して、Webページを取得するわけですが、実際にそのようにしている人はいない。
Webブラウザに入力しているのは**IPアドレスでなくURL**である。これには**DNS**という仕組みが大きく関わっている。
DNAとは・・・URLに含まれる名前に対応するIPアドレスのサーバーを教える仕組みのこと。
閲覧者はURLでアクセスしてるつもりでも、実際はDNSが裏でドメインと呼ばれる名前に対応しているIPアドレスを調べてサーバーにアクセスしている。これによってURLだけでサーバーにたどり着ける。AWSでは**Route 53**がこれに当たる。
## DHCPとは
家庭や社内のプライベートIPアドレスはDHCPという仕組みによって、各ホストに割り振られる。
DHCPによって割り振られるIPアドレスには有効期限があり、期限が過ぎると振り直される。
## ホスト名、ドメイン名、FQDN、URL
ホスト（端末）にはIPアドレスが振られているが、
IPアドレスは**どのネットワークに所属しているかを指すネットワーク部**と**どのホスト（端末）であるかを指すホスト部**で構成されている。
URLでも同様である。
〇〇.jp / △△.com　のようなドメイン名と、www / ftp　ホスト名で構成されている
ホスト名とドメイン名を繋げた名称を**FQDN**という
例えば、okayama.jpという組織で運用されているwwwという名前のサーバーは「www.okayama.jp」である
URLはFQDNにさらにファイル名をつけて記述した書式です。
「www.okayama.jp」にある「index.html」ファイルであれば、「www.okayama.jp/index.html」と表記する
先頭の「http://」はプロトコルといい、通信における約束事のことを指す。
flask run が上手くできない場合の対処法

Python Flaskにてflask runでプレビュー画面を表示しようとした際、一部ターミナルでは機能しない場合があります。
ちなみに自分の場合はpowershellにて問題が起こりました。

（例）Dcument

    flask run

    (結果)
    + CategoryInfo          : ObjectNotFound: (flask:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

(原因)
恐らくPathが通っていないことが原因でコマンドとして認識されていないと思われます。

(解決)
1,Pathを通す。
システム環境変数の設定にて設定しなおしてください。

2,pythonコマンドを使う。
pythonのversionを指定して、そこからflask runを割り当てます。

(書き方)
python3 -m flask run
水圏水文学演習　山海堂　水村和正先生

```r
#p.196 ボルテラ級数
rt=c(62.7,75.7,92.2,98.3,106.2,109.5,114.8)
Qt=rt*1.5+rnorm(length(rt))*rt

t=c(1:length(rt))

M=3

f=function(x){
h1=x[1:M]
h2=matrix(x[-c(1:M)],nrow=M)
Qhat=c()
for(j in 1:(length(rt)-M+1)){
  rtsub=rt[j:(M+j-1)]
  Qhat=c(Qhat,sum(h1*rtsub)+as.numeric(c(rtsub)%*%h2%*%c(rtsub)))
  }
return(Qhat[-length(Qhat)])
}


Y=Qt[(M+1):length(t)]
h=0.001
lam=1
ite=10^4
sita=rep(0.01,M+M^2)
eta=10^(-2)

for(l in 1:ite){
sita_pre=sita
Z=array(0,dim=c(length(Y),length(sita)))
vec=sita
for(j in 1:ncol(Z)){
vec_sub=vec;vec_sub[j]=vec_sub[j]+h
Z_sub=(f(vec_sub)-f(vec))/h
Z[,j]=Z_sub
}
beta=solve(t(Z)%*%Z+diag(lam,ncol(Z)))%*%t(Z)%*%(Y-f(sita))
sita=c(sita+eta*beta)
print(sum((Y-f(sita))^2))
}


```
【JavaScript】クラス② 〜プロトタイプメソッド・アクセッサプロパティ〜

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# この記事で理解できること
* クラスのプロトタイプメソッド、アクセッサプロパティについて
* クラスのプロトタイプメソッド、アクセッサプロパティの定義方法、使用方法

# クラスのプロトタイプメソッドの定義
* クラスの動作は`メソッド`で定義する。
* クラスに対して定義したメソッドは、`プロトタイプメソッド`と呼ばれ、`各インスタンスで使用できる`メソッドとなる。
* メソッドの中からクラスのインスタンスを参照するには、`this`を使用する。

```js
// 人間の構造を定義する例として、クラスHumanを定義
class Human {
  // 初期化処理で使用するため仮引数(name,age)を定義しておく
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  // あいさつをするgreetingメソッドを定義(これがプロトタイプメソッド)
  greeting() {
    // this.nameにおける"this"は各インスタンスを指す(後述の変数Taro、Hanakoに代入されるインスタンス)
    // this.nameをTaro.name、Hanako.nameと置き換えて見てみるとイメージが付きやすい
    console.log(`おはようございます!私の名前は${this.name}です!`);
  }
}

// Humanクラスのコンストラクタで使用する値を引数として渡し、インスタンス化したオブジェクトを各変数に代入
const Taro = new Human("タロウ", 21);
const Hanako = new Human("ハナコ", 24);

// 各インスタンスでプロトタイプメソッド(greeting)が使用できることが分かる
Taro.greeting();    // => おはようございます!私の名前はタロウです!
Hanako.greeting();  // => おはようございます!私の名前はハナコです!
```

# クラスのアクセッサプロパティの定義
* クラスではプロパティの`参照(getter)`、`代入(setter)`時に呼び出される特殊なメソッドを定義できる。
* そのようなメソッドは`アクセッサプロパティ`と呼ぶ。

## getter(プロパティの参照用)
* 参照用は`get メソッド名()`とメソッド名の前に`get`を付け定義する。
* getter(get)には仮引数はないが、`返り値`が必須。
* `インスタンス名.(getter)プロパティ名`で参照することができる。
```js
class Human {
  constructor(userName) {
    this.userName = userName;
  }
  
  get name() {
    return this.userName;
  }
}

const Taro = new Human("TARO");
console.log(Taro.name); // => TARO
```

### setter(プロパティの代入用)
* 代入用は`set メソッド名()`とメソッド名の前に付け定義する。
* setter(set)には`仮引数(プロパティへ代入する値)`が必要だが、`返り値`は必須ではない。
* `インスタンス名.(setter)プロパティ名 = 値`で代入ができる。
```js
class Human {
  constructor(userName) {
    this.userName = userName;
  }
  
  get name() {
    return this.userName;
  }
  
  set name(userName) {
    this.userName = userName;
  }
}

const Taro = new Human("TARO");

// getter
console.log(Taro.name); // => TARO

// setterで別の値を代入してみる
Taro.userName = "taro";

// 改めてgetter
console.log(Taro.name); // => taro
```
OSS Insightで見るOSSデータベースの動向

## はじめに

OSSデータベースのトレンドがどうなっているか知りたくなりました。
そこで、インサイトツール [OSS Insight](https://ossinsight.io/) を使ってみることに。

## OSS Insightとは

- OSS動向や比較など分析結果を提供してくれるインサイトツール
    - PingCAP社により、TiDB、Docusaurus、Apache ECharts、GH Archive、GHTorrentで構築された
- OSSプロジェクトを分析/比較し、様々な視点から洞察を見つけてくれる
    - GitHubのリポジトリやイベントデータから、OSSの健全性や新しい出来事を示してくれる
- GitHubリポジトリのカスタム分析ツールとしても使える

※ PingCAP社の記事を参照: [OSS Insightとは？](https://qiita.com/PingCAP/items/2d6a72acf455f72c216b)

## OSSデータベースのトレンド

### 早速`ossinsight.io`サイトで検索してみると
https://ossinsight.io/blog/deep-insight-into-open-source-databases/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/5b9e0d4e-d9ea-bbc9-aa20-548ce023346d.png)

### 人気度ランキング(2021年)

- elasticsearch
- redis
- prometheus
- etcd
- spark
- tidb
- cockroach
- influxdb
- rocksdb
- clickhouse

Elasticsearchの人気ぶり健在ですね。
聞いたことのない名前もちらほら。。。

### 新しいお気に入りランキング(2021年)

- clickhouse
- redis
- prometheus

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/1a649493-123f-5ffd-fcef-eca1f8451013.png)

clickhouse, prometheusの勢いすごい。
使ってみたくなりました。

- ClickHouse
    - オンライン分析処理用の列指向DBMS、SQLクエリを使用しリアルタイムで分析レポートを生成できる
- prometheus
    - イベント監視とアラート通知に利用、時系列データベースをHTTPプル方式でリアルタイムに構築し、柔軟なクエリーとアラート機能を提供

### OSSデータベースのコントリビューションをリードしている会社(2021年)

- elastic
- pingcap
- alibaba
- microsoft
- red hat
- facebook
- google
- cloudera
- databricks
- vmware
- linkedin

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/b06fddff-d44d-afc7-f46e-1d66f6fc4ef9.png)

## おわりに

OSS Insightサービスを使って、最新OSSデータベース動向を探ってみました。
様々な切口から分析/比較できるので、面白かったです。
【JavaScript】クラス① 〜クラスの定義・インスタンス化〜

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# この記事で理解できること
* クラスとは何か
* クラスの定義方法
* クラスのインスタンス化

# クラスとは
* 動作や状態を定義した構造のこと。
* クラスを基に作成したオブジェクトを`インスタンス`と呼ぶ。

よく「`クラス = 設計図`」という言葉を見かけるので、その例をとって少し自分なりの解釈を加えてみる。

## 「クラス = 設計図」の解釈：建築士と設計図
ドラマや映画などで、建築士が大きな用紙にある建設予定の建物(家やマンション、ビル)の設計図を描いている描写(筒状の入れ物に設計図を入れて背負っていたり)を見かけたことがあると思う。

ここでいう`設計図`がまさにクラスで、
プログラミングの世界では「あるモノ」を作りたい(表現したい)場合に作成する`設計図`を`クラス`と呼ぶ。
そして、その設計図(クラス)をもとに実態(`家やマンション、ビル = インスタンス`)を作成する。

「`クラス = 設計図`」の解釈や`クラス`のイメージが少しできたと思う。
以下は、先ほどの文章内で出てきた登場人物の解釈一覧。

|概要|建築の世界|プログラミングの世界|
|--|--|--|
|作成したい「あるモノ」を設計、実際に設計図を作成する人|建築士|エンジニア|
|設計図を描く時に使用する道具|大きな用紙|コードエディタ|
|作成したい「あるモノ」の情報、構造を描く・表現したもの|設計図|クラス|
|作成したい「あるモノ」|建設予定の建物|作成予定のオブジェクト(インスタンス)|

# クラスの定義
* クラスを定義するには`class構文`を使用する(`ES2015`から導入)
* 関数の関数宣言と関数式に似た性質として、`クラス宣言文`と`クラス式`がある。
* JavaSctriptでは慣習として、`クラス名は大文字で開始する。`

※class構文で定義したクラスは`関数オブジェクトの一種`であることも片隅に覚えておいた方が良い。

## クラス宣言文
* `classキーワード`を使用し、`class クラス名{ }`でクラスを定義できる。
* クラスには`初期化を行う`コンストラクタ(メソッド)が必ず存在し、`constructor`という名前のメソッドとして定義する。

>**メソッドとは**
>オブジェクトのプロパティとして定義した関数のことをメソッドと呼ぶ。

```js
// class クラス名{ }でクラスを定義
class MyClass {
    // constructor() { 初期化処理 } でコンストラクタを定義
    constructor() {
        // 初期化処理
    };
}
```

## クラス式
* クラスを`変数へ代入`し`値`として定義する方法。
* クラス式ではクラス名を省略できる。(関数における`匿名関数の`ように)

```js
// クラス名を省略し、変数MyClassへ代入
const MyClass = class {
    constructor() { };
};
```

# 【Tips】 コンストラクタ(メソッド)について
* インスタンスに関する`状態`の初期化を行うメソッド。
* 初期化処理が特にない場合は、コンストラクタ(メソッド)を省略できる。
* コンストラクタ(メソッド)省略した場合、内部的には`自動的に空のコンストラクタ`が定義される。
* そのため、`クラスにはコンストラクタ(メソッド)は必ず存在する`ことになる。

```js
// コンストラクタの処理が不要な場合は省略できる
class MyClass {
}
```
省略しても(特に初期化処理がなくても)内部的には、以下のようにコンストラクタは存在する。
```js
class MyClass {
  // 内部的には空のコンストラクタが定義される
  constructor() {
  }
}
```

# クラスのインスタンス化
* 定義したクラスからインスタンス(`クラスをもとに作成したオブジェクト`)を作成することを`インスタンス化`と呼ぶ。
* `new クラス名();`と`new演算子`を使用し、インスタンス化を行う。

```js
// Humanというクラスを定義する(コンストラクタなしの場合)
class Human { };

// インスタンス化(しただけ)
new Human();

// Humanクラスからインスタンス化したオブジェクトを変数Taroに代入
const Taro = new Human();

// Humanクラスからインスタンス化したオブジェクトを変数Hanakoに代入
const Hanako = new Human();

// instanceof演算子で、右辺に指定したクラスから作成されたインスタンスかどうか判別できる
console.log(Taro instanceof Human);    // => true(Humanクラスから作成されたインスタンスであることが分かる)
console.log(Hanako instanceof Human);  // => true(Humanクラスから作成されたインスタンスであることが分かる)
```
Python小技集 - #1 リスト/タプルから重複要素を削除する方法

こんにちは！beatbox4108です。
今日は**Pythonでリスト/タプルから重複要素を削除する方法**について説明していきます。
方法は2種類あります。
* setを使う方法
* dictを使う方法
    * dict+zip (応用)

# setを使う場合
Pythonには重複しない値の集合である`set`があります。
ふつうはこれを使うのが良いでしょう。
```python3
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル

# setを使う場合
a=list(set(l))
print("setを使う場合:",a)
```

```
setを使う場合: [0, 1, 2, 3, 5, 6, 9]
```

アンパックを使えばもっと簡潔に書けます。

```python3
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル

# setを使う場合(別解)
b=[*{*l}]
print("setを使う場合 (別解):",b)
```
```
setを使う場合 (別解): [0, 1, 2, 3, 5, 6, 9]
```

:::note warn
この手法は**リストの順番を考慮しません**。自然にソートされます。
順番を考慮したい場合は次項の`dict.fromkeys`を使ってください。
:::

# dict.fromkeysを使う場合
辞書のキーが重複しないことを利用した手法です。
順序を維持します。
```python3
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル

# dict.fromkeys を使う場合
c=list(dict.fromkeys(l))
print("dict.fromkeysを使う場合:",c)
```
```
dict.fromkeysを使う場合: [1, 2, 3, 5, 6, 9, 0]
```
こちらもアンパックを使えますが、あまり簡潔になった感じがしません...
```python3
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル

# dict.fromkeysを使う場合(別解)
d=[*dict.fromkeys(l)]
print("dict.fromkeysを使う場合(別解):",d)
```
```
dict.fromkeysを使う場合(別解): [1, 2, 3, 5, 6, 9, 0]
```

:::note warn
この手法でもバージョンによっては順番が維持されません。
OrderedDictを代わりに使用できます。
```python3
from collections import OrderedDict
```
:::
## dict+zip
さっきの応用で、dict関数にzip関数をかませて、上記と同様のことを行います。
```python3
l=[1,1,2,3,3,3,5,6,6,9,0] # サンプル

# dict+zipを使う場合
e=[*dict(zip(l,l))]
print("dict+zipを使う場合:",e)
```
```
dict+zipを使う場合: [1, 2, 3, 5, 6, 9, 0]
```
書く量は少ししか減らせなかったのに、可読性が落ちたような...

:::note info
これ以上アンパックは使えません。無念。
:::

* * *

いかがだったでしょうか?
これからも気が向いたらこんな小技を紹介していきたいと思っているのでよろしくお願いします！
デフォルトの価格表のテストクラス


元の質問 : [Trigger coverage](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J66gI)

Pricebook2オブジェクトの  IsStandard　フィールドは直接updateできないようです。
困った。
そのためテストクラスには標準の価格表のIdを得るメソッドが用意されているみたい。

```
Test.getStandardPricebookId();
```

しかし、テストクラスでは標準の価格表のIdが欲しい。
しかたないので、トリガーの方を変更します。

PDF作成の時の回避方法と似た感じですね。

```
     if (Test.isRunningTest() ){
             stPrId = Test.getStandardPricebookId(); 
        } else {
             Pricebook2 pb = [select Id from Pricebook2 where IsStandard = TRUE][0]; 
            stPrId = pb.Id;
         }
```

```
   /**
      * apex:pageを利用してPDFをつくる
    　*/
    @AuraEnabled
    public static String createPdf(){
        
        PageReference pageRef = new PageReference('/apex/pdfFkd_test');
        pageRef.getParameters().put('mode', 'save');
        pageRef.getParameters().put('Title', 'Simple');

        //pageRef.getParameters().put('id', paramIds);
        //pageRef.getParameters().put('rmk', remarks);
        //String body = Test.isRunningTest() ? 'ダミー' : String.valueof(pageRef.getContent());        
        String body = Test.isRunningTest() ? 'ダミー' : EncodingUtil.Base64Encode(pageRef.getContent());
        
        return body;
    }
```

トリガーの全容

```
public class Product2TriggerHandler {
    
    public static void AtualizaValorProduto(List<Product2> produtosLista){
        list<Id> Idlist = new list<Id>();
        list<Product2> ProdsToUpdate = new list<Product2>();
        for(Product2 pr:produtosLista){
            Idlist.add(pr.Id);
        }
        Id stPrId;
        if (Test.isRunningTest() ){
            stPrId = Test.getStandardPricebookId();
        } else {
            Pricebook2 pb = [select Id from Pricebook2 where IsStandard = TRUE][0];
            stPrId = pb.Id;
        }
        
        for(Product2 p:produtosLista){
            for(Pricebookentry pbe:[select Product2Id,UnitPrice from Pricebookentry where Pricebook2Id = :stPrId and Product2Id IN :Idlist]){
                If((pbe.Product2Id == p.Id)&&(p.Preco_catalogo_padrao__c!=pbe.UnitPrice)){
                    p.Preco_catalogo_padrao__c = pbe.UnitPrice;
                    system.debug('this is it '+pbe.UnitPrice);
                    system.debug('this is that '+p.Preco_catalogo_padrao__c);
                    ProdsToUpdate.add(p);
                }
            }
        }
        If(ProdsToUpdate.size()>0&&trigger.isAfter){
            update ProdsToUpdate;
        }
    } 
    
}
```
React1.7.0.2 ひな形

# 備忘録
codesandboxでは最新版のひな形がデフォルトで使用されるため、ver1.7.0.2用を用意する

## index.js
```React:index.js
import React from "react";
import ReactDOM from "react-dom";

import { App } from "./App";

ReactDOM.render(<App />, document.getElementById("root"));
```

## App.js
```React:App.js
import React, { useState } from "react";

export const App = () => {
  //Hooks
  const [todoText, setTodoText] = useState("");
  return (
    <>
      // ソースコード記載
    </>
  );
};
```

## index.html
```html:index.html
<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	<meta name="theme-color" content="#000000">
	<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
	<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
	<title>React App</title>
</head>

<body>
	<noscript>
		You need to enable JavaScript to run this app.
	</noscript>
	<div id="root"></div>
</body>

</html>
```