OmniAICreator/Qiita-1.07M huggingface dataset:
input または button type="search"のクリアボタン （バツボタン）を全端末で削除する

## こうすればいいらしい

```
input[type="search"]::-webkit-search-cancel-button {
  -webkit-appearance: none;
}
```

## 参考記事
https://terkel.jp/archives/2010/08/reset-input-type-search-style/
https://www.it-swarm-ja.com/ja/html/ltinput-type-searchgt-ios%E3%81%A7%E3%82%AD%E3%83%A3%E3%83%B3%E3%82%BB%E3%83%AB%E3%83%9C%E3%82%BF%E3%83%B3%EF%BC%88x%EF%BC%89%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F/823833631/
IPv4

172.12.1.0/25
172.12.1.0 -172.12.1.127

172.12.1.128/25
172.12.1.128 - 172.12.1.255

/24 : 0 - 255
/25 : 0 - 127
/26 : 0 - 63
/27 : 0 - 31
/28 : 0 - 15
/29 : 0 - 7
/30 : 0 - 3
/31 : 0 - 1
/32 : 0 - 0
ラズパイでOMVによるNASの構築



ラズパイ４でNASを作ろうと思ったときに苦戦したので備忘録としてまとめておきます。
ラズパイのWIFIでの設定を試してないのでわからないですが、イーサネット(LANケーブル)を用いた方がいいかもしれません。


#全体の流れ

①ラズパイにOSのインストール
②ラズパイのSSHの有効化
③PCからSSH接続
④OMVのインストール
⑤OMVの設定
⑥NASに接続




##①ラズパイにOSのインストール
ラズパイにOSのインストールをします。初めての方ならDesktopバージョンのほう設定が楽です。今回もDesktopバージョンで説明していきます。microSDにOSイメージを書き込みラズパイに装着し、起動させます。そうすると初期設定の画面が出てきます。最後にアップデートが入るので数分待ちます。

##②ラズパイのSSHの有効化
アップデートが終わった後、パソコンからSSH接続するために、ラズパイのSSH接続を有効化します。ラズパイデスクトップ画面の左上にあるラズパイマーク(?)をクリックし、次にPreferencesをクリック。Raspberry Pi Configurationが選択肢に出てくるのでそれをクリックします。そうすると設定画面が表示されるので、interfacesタブを選択し、SSHの欄をEnable(有効化)にし、OKして終了です。英語の部分は環境によって日本語になっているかもしれませんので適宜読み替えてください。

##③PCからSSH接続
今回はteratermを使ってSSH接続します。先にラズパイ側でターミナルを開き

```
$ ifconfig
```
でラズパイのIPアドレスを確認しておきます。eth0のinetに表示される『192.168.2.2』(値は適当)みたいな数字列がそうです。

tera termを開き、ホスト(T)となっている欄に先ほど確認したIPアドレスを入力しOK。
セキュリティ警告が表示されるかもしれませんが続行で大丈夫です。その後ユーザ名とパスワードが求められますので、ユーザ名『pi』でパスワードは変更していなければ『raspberry』です.入力したらOKを押し、接続完了です。

##④OMVのインストール
次にOMVのインストールを行います。

```
$ cd /opt/
$ wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash
```
20分程度かかるので気長に待ちます。完了すると自動で再起動がかかります

ついでにラズパイでexfat、NTFSの形式でフォーマットされたHDD、SSDが読み込めるようにしておきます。再度SSH接続し、下記の処理を実行します。

```
$ sudo apt-get install exfat-fuse exfat-utils
$ sudo apt-get install ntfs-3g
```


##⑤OMVの設定
　http://raspberrypi.local/
にアクセスしOMVの設定を行います。

ユーザ名：admin
パスワード：openmediavault

OMVでは設定を変更すると上部にオレンジ色の設定を適用するかどうかの確認が表示されるので、今後は表示されたらいちいち適用を押すようにしましょう(間違いが少なく済みます)

１．ネットワークの設定
　システム→ネットワーク→インターフェイスでeth0を選択し、編集を押します。IPv4のメソッドをスタティック、アドレスをラズパイのIPアドレス、ネットマスクを255.255.255.0、ゲートウェイをルーターのIPアドレスを入力します。ゲートウェイのアドレスの調べ方は割愛。

２．記憶媒体の認識
まず、まだラズパイにHDD等を接続していない方は接続します。
　ストレージ→ファイルシステムに行き、接続した記憶媒体をマウントします。
既にマウントされていた方は一度アンマウントをし、再度マウントしておきます。

２．共有フォルダの作成
　アクセス権の管理→共有フォルダに行き、追加を押します。名前は適当でかまいません。デバイスは欄の右の▽を押し、先ほどマウントしたデバイスを選択します。そしたら保存を押します。もしかしたらエラーが出るかもしれませんが、追加されたデバイス名の右側の参照先が『はい』になってれば問題ないです。(自分は今のところ問題なく使えています、、、)

３．ユーザの追加
 アクセス権の管理→ユーザに行き、ユーザの追加をします。名前もパスワードも適当で大丈夫ですが、NASにアクセスするときに必要になるため、覚えやすいものにしておくといいでしょう。保存を押し追加出来たら、その画面で追加したユーザを選択し、特権を押します。先ほど追加した共有フォルダがあるので、『読み/書き』にチェックマークをつけておきます。

４．SMBの有効化
　サービス→SMB/CIFSに行き、一般設定を有効化し、保存を押します。次に共有タブに行き、追加を押し、先ほど設定した共有フォルダを追加します。

以上でOMVの設定は終了です

##⑥NASに接続
　windowsでの接続について説明します。フォルダーを開き、ネットワーク欄に行きます。そこで『\\\XXX.XXX.XXX.XXX』と入力します。XにはラズパイのIPアドレスが入ります。ユーザとパスワードが求められるので先ほど設定したユーザ名とパスワード入力します。共有フォルダで作ったフォルダが存在すれば成功です。

お疲れさまでした。





***
参考サイト

https://buytech.today/?p=6580#toc7
https://denor.jp/rock64%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%81%AAnas%E3%82%92%E6%A7%8B%E7%AF%89-openmediavault
シェルで別ファイルに引数リストを書いておいて、1行ごとに処理をさせたい時のやつ

別ファイルに引数リストを書いておいて、1行ごとに処理をさせたい時のやつ

```
$ cat list
001 aaaaa AAAAA
002 bbbbb BBBBB
003 ccccc CCCCC

$ cat list | xargs -n3 bash -c 'echo $1 $2 $0'
aaaaa AAAAA 001
bbbbb BBBBB 002
ccccc CCCCC 003
```

- xargs に渡して bash で実行
  - `-n3`: 3つずつ読み出す 
- 渡す引数は `$N (0から)` で書けるので分かりやすい．順番も変えられる．
Thymeleafでth:ifとth:insertを組み合わせて使う際の注意

# th:if → th:insertの順で動作させたい
何度も同じ失敗をしてしまうので、戒めを兼ねて記事に残しておくこととする。

### 失敗事例
例えば、価格が存在する場合のみ、特定のhtmlをinsertしたいというケースの場合、


ついつい以下のような記述をしてしまう。

```productList.html
<!-- 価格が空でない場合、insertする --> 
<th:block th:if="${!#strings.isEmpty(price)}" th:insert="insert.html::product">
</th:block>
```

```insert.html
<div th:fragment="product">
 <dt>価格</dt>
 <dd th:text="${price}"></dd>
</div>
```

しかし、この場合は`th:insert` → `th:if`の順で評価されてしまう為、意図した動作にならない。

priceに対してisEmptyで空かチェックしているが、空かどうか関係なしに`th:insert`が実行されてしまう。

属性の読み込み順については公式に記載のとおり、フラグメントのインクルードが1番最初に実行される。
![スクリーンショット 2021-04-02 17.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/97029a3a-3111-30f8-f35a-0856b83df176.png)

### 対処方法
無理に`th:if`と`th:insert`を1行で書かず、分けて記述すれば良い。

```productList.html
<!-- 価格が空でない場合、insertする --> 
<th:block th:if="${!#strings.isEmpty(price)}">
  <th:block  th:insert="insert.html::product"></th:block>
</th:block>
```

今回は`th:insert`を例にあげているが、`th:replace`や`th:each`の場合も、

`th:if`より優先的に評価されるため、1行で組み合わせて利用する場合に注意が必要となる。

その他にも、意図した動作にならない場合は、属性の評価順についてThymeleafの公式ページから確認可能なため、

評価の順番に認識違いがないか確認すると良い。

https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html#%E5%B1%9E%E6%80%A7%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D
コマンドラインを学ぶ1

#ファイルの作成
　ファイルを作成するには、　touchコマンドを使います。
　空のファイルを作成することができます。

```
touch ファイル名

touch sample.txt
```
#ファイルの中身を表示する
コマンドでファイルの中身を表示することができます。
cat コマンドを使いcat コマンドは cat ファイル名　と入力することで使うことができます。

```
cat ファイル名

cat sample.txt
```

#ディレクトリを作成する

コマンドを用いて、新たにフォルダを作成することもできます。
ディレクトリを作成するには、mkdirコマンドを使います。
mkgir ディレクトリ名 と入力することで使うことができます。

```
mkdir ファイル名

mkdir sample
```

#ディレクトリごと移動させる

mvコマンドでは、ファイル１つずつだけでなくディレクトリごと移動させることでもでき
mv ディレクトリ名　移動先のディレクトリ名とすることで、そのディレクトリも一緒に移動します。

```
mv 移動させたいファイル名　移動先のディレクトリ名

mv 移動させたいディレクトリ名　移動先のディレクトリ名
```

#ファイル名を変更する

ファイルやディレクトリの移動に使ったmvコマンドは、ファイル名を変更することにも使えます。
mv ファイル名　新しいファイル名とすることでファイル名を変更できます。

```
mv ファイル名　新しいファイル名
```
Pythonの仮想環境

## Pythonの仮想環境



Node.jsからPythonを触ることが多くなった最近ですが、みなさんPythonのパッケージ管理ってどうしてますか？
何でもかんでもグローバルにインストールして収集つかなくなったり、複数で作業するとき開発環境をコピーしたりって、
ぶっちゃけ面倒くさくないですか？（思いますよね？）


Node.jsのエコシステムに慣れてしまったせいか、```git clone```して```npm install```を叩けば依存パッケージを解決してくれて、、
みたいなお手軽感から抜け出せずにおります。


そこで今回は、Node.js並みにPythonのパッケージ管理を簡単にやる方法を考えよう！です。
外せない要件は以下とします。

- パッケージのメタデータは（ほぼ）自動で管理してくれる
- パッケージはコピー先で一括インストールできる



### 前提

OS: Mac OS Big Sur

Python: 3.9.5 (pyenv使ってるので何でも)



### 仮想環境の選定

まあメジャーどころを。。

- [venv](https://docs.python.org/ja/3/library/venv.html)
  - Python 3.3から標準装備
  - **すぐ使える**

- [conda](https://www.anaconda.com/)
  - Anacondaをインストールする必要がある
  - オマケ感が否めない
- [virtualenv](https://virtualenv.pypa.io/en/latest/)
  - サードパーティ製なので要インストール
  - Python3.3でvenvとして標準機能に取り込まれた



というわけで、「**venv**」一択です。



### やってみよう

- 仮想環境の作成

  - プロジェクトディレクトリ直下にenviron_nameディレクトリができます

  ```bash
  $ mkdir project_name
  $ cd project_name
  $ python -m venv environ_name
  ```

- アクティベート

  ```bash
  source envrion_name/bin/activaate
  ```

- 作成した仮想環境にパッケージをインストール

  - 今回は試しに```superjson```をインストール（```datetime```なんかをシリアライズ化くれるやつ）

  - なお、アクティベートするとプロンプトの先頭に環境名が表示されます

  ```bash
  (environ_name) project_name $ pip install superjson
  ```

- 仮想環境にインストールされてるパッケージの確認

  ```bash
  (environ_name) project_name $ pip freeze
  superjson==0.0.13
  ```

- パッケージ一覧を書き出す

  ```bash
  (environ_name) project_name $ pip freeze > requirements.txt
  ```

- 仮想環境を停止する

  ```bash
  (environ_name) project_name $ deactivate
  ```



### 作成した仮想環境を再現する

今回はGitHubからクローン来ることを想定

- 別プロジェクトを作成

  ```bash
  $ mkdir new_project
  $ cd new_project
  $ git clone ...  # 割愛
  ```

- 新たに仮想環境を作ってパッケージをインストール

  ```bash
  (new_environ) new_project $ pip install -r requirements.txt
  ```

- インストールされたか確認

  ```bash
  (new_environ) new_project $ pip freeze
  superjson==0.0.13
  ```



お、なんかいい感じでじゃないでしょうか。。ご参考までに。



### 参考文献

- [venv --- 仮想環境の作成](https://docs.python.org/ja/3/library/venv.html#module-venv)

- [【Python】venvで作成した仮想環境をコピーする方法](https://dev83.com/python-env-copy/)

- [venv: Python 仮想環境管理](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)
統計学実践ワークブック　P.55　例3

$ M_{n} = max\\{ X_{1}, X_{2}, X_{3},\cdots, M_{n} \\} $ の分布を $G(x)$ と置く。

問題文より

$$G(x) = {(1-e^{-x})}^{n}$$

ここで、$ x = y + \log n $ とする。

$$G(x) = {(1-e^{-(y+\log n)})}^{n}$$

$y$を固定したまま、$n \to \infty$ としていくと

$$G(x)= \lim_{n \to \infty}{(1-e^{-(y+\log n)})}^{n}$$

$$= \lim_{n \to \infty}{(1-e^{-y} \cdot e^{-\log n})}^{n}$$

$$= \lim_{n \to \infty}{(1-\frac{e^{-y}}{e^{\log n}})}^{n}$$

ネイピア数と自然対数の公式より

$$e^{\log n} = n$$

よって

$$= \lim_{n \to \infty}{(1-\frac{e^{-y}}{n})}^{n}$$

$$= \lim_{n \to \infty}\\{{(1-\frac{e^{-y}}{n})}^{- \frac{n}{e^{-y}}}\\}^{-e^{-y}}$$

ここで、極限の公式より

$$\lim_{n \to \infty}{(1+\frac{1}{n})}^{n} = e$$

一般化した式は

$$\lim_{n \to \infty}{(1\pm\frac{a}{n})}^{\pm\frac{n}{a}} = e$$

$a$ に $e^{-y}$ を代入すると

$$\lim_{n \to \infty}\\{{(1-\frac{e^{-y}}{n})}^{- \frac{n}{e^{-y}}}\\}^{-e^{-y}}$$

$$= e^{-e^{-y}}$$

よって

$$G(x) = e^{-e^{-y}}$$

$x = y + \log n$ より

$$y = x - \log n$$

$x$ の最大値 $M_{n}$ を代入して

$$y = M_{n} -\log n$$

これは、ガンベル分布に収束する。
統計学実践ワークブック　P.21　例1

1変数の確率密度の変換に関する問題である。

標準正規分布に従う確率密度関数は

$$f_{X}(x) = \frac{1}{\sqrt{2 \pi}}e^{-\frac{x^{2}}{2}}$$

変換後の$\chi^{2}$ 分布に従う確率密度関数を、$f_{Y}(y)$ とする。

自由度1のカイ二乗分布は、標準正規分布に従う $X$ に対する $X^{2}$ の分布であるので<br>
$Y = X^{2}$ と置く。$X$ について解くと

$$y = x^{2}$$
$$x = \pm \sqrt{y}$$

今回は $X>0$ の場合のみを考えるので

$$x: 0 \rightarrow \infty$$
$$y: 0 \rightarrow \infty$$

よって

$$g^{-1}(y)= \sqrt{y}$$

これを $y$ で微分すると

$$\frac{dx}{dy} = \frac{1}{2}y^{-\frac{1}{2}}$$

ここで、確率密度の変換の公式を導出する。<br>
全確率は1となるので

$$\int_{- \infty}^{\infty} f_{Y}(y)dy = \int_{- \infty}^{\infty} f_{X}(x)dx$$

右辺を変形すると

$$\int_{- \infty}^{\infty} f_{X}(x)dx　= \int_{- \infty}^{\infty} f_{X}(g^{-1}(y)) \cdot \frac{dx}{dy}dy$$

よって

$$\int_{- \infty}^{\infty} f_{Y}(y)dy = \int_{- \infty}^{\infty} f_{X}(g^{-1}(y)) \cdot \frac{dx}{dy}dy$$

この公式に$f_{X}(x)$ と $g^{-1}(y)$ 、$x$ と $y$ の範囲を代入し<br>
$X>0$ の場合のみを考えるため、確率密度を2倍にすると

$$\int_{0}^{\infty} f_{Y}(y)dy = 2 \int_{0}^{\infty} f_{X}(\sqrt{y}) \cdot \frac{1}{2}y^{-\frac{1}{2}}dy$$

計算すると

$$f_{Y}(y) = 2 \cdot f_{X}(\sqrt{y}) \cdot \frac{1}{2}y^{-\frac{1}{2}}$$
$$= f_{X}(\sqrt{y}) \cdot y^{-\frac{1}{2}}$$
$$= \frac{1}{\sqrt{2 \pi}}e^{-\frac{y}{2}} \cdot \frac{1}{\sqrt{y}}$$
$$= \frac{1}{\sqrt{2 \pi y}}e^{-\frac{y}{2}}$$

よって、$\chi^{2}$ 分布に従う確率密度関数は

$$f_{Y}(y) = \frac{1}{\sqrt{2 \pi y}}e^{-\frac{y}{2}}$$

と求まる。
Dialogflowで独自に販売のチャットボットを作成する -（第五部）Webサイトに統合する

<!-- wp:paragraph -->
<p><strong>Webサイトに統合する</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://qiita.com/ints/items/7ec4769162708a6d1706">第四部はこちら</a>　　<a　href="https://qiita.com/ints/items/75bf042771ac1a19dc15">第六部はこちら</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>前の部分では、独自のチャットボットを作成する方法をガイドして、子供の粉ミルクについてアドバイスというチャットボットを一緒に作成しましたね。そして、この部分ではWebサイトにチャットボットを簡単に統合する方法を紹介します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>まず、右側のメニューで「Intergrations」項目を選択し、「Text based」というセクションでDialogflow Messengerをアクティブにします。次に、チャットボットを表示したいWebサイトに以下のように生成されたコードを埋め込みます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&lt;script src="https://www.gstatic.com/dialogflow-console/fast/messenger/bootstrap.js?v=1"&gt;&lt;/script&gt;<br>&lt;df-messenger<br>&nbsp; chat-icon="https://cdn.onlinewebfonts.com/svg/img_382824.png"<br>&nbsp; chat-title="BabyShop"<br>&nbsp; agent-id="54da5741-13a0-402e-b25a-c2408e79afa3"<br>&nbsp; language-code="en"<br>&gt;&lt;/df-messenger&gt;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>デフォルトでは、チャットボット名はDialogflowで作成されたエージェントの名前ですが、「chat-title」というアトリビュート通りチャットボット名を変更できます。「chat-icon」というアトリビュート通りデフォルトのDialogflowアイコンも変更できます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>その他、事前定義されたCSS変数でチャットフレーム、メッセージなどの色を変更できます。以下のリンクはチャットボットの変更オプションの参考になります。<a href="https://cloud.google.com/dialogflow/es/docs/integrations/dialogflow-messenger">https://cloud.google.com/dialogflow/es/docs/integrations/dialogflow-messenger</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>これで、Webサイトに統合するための完全に無料のチャットボットがあります。 無料ですが、非常に有益です。さらに、需要に応えるチャットボットを作成するのはそれほど複雑ではありませんね。😉</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>カスタマーケアのアドバイス用チャットボットのみなら、これで十分です。然し、プログラミングスキルがあり、以下のイメージの通り製品を売れるようにするチャットボットをアップグレードしたい場合、ユーザーの情報（名前、電話番号、住所など）を収集して注文を自動的に対応するプログラムの方法をを次の部分に引き続き研究しましょう！</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1146,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="https://ints.vn/wp-content/uploads/2021/07/image-2.png" alt="" class="wp-image-1146"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p><a href="https://qiita.com/ints/items/7ec4769162708a6d1706">第四部はこちら</a>　　　　<a　href="https://qiita.com/ints/items/75bf042771ac1a19dc15">第六部はこちら</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>(<a href="https://ints.vn">株式会社INTS</a> 開発部　リン・ジャン)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->
MS Learn の勉強3･･･「計算列を使用する」その1

[<前の備忘録](https://qiita.com/max_kamitoda/items/cc6875fc56fc513715b6)

どのように勉強したかの備忘録です。

https://docs.microsoft.com/ja-jp/learn/modules/create-measures-dax-power-bi/1-introduction

**DAX を使用すると、さまざまなデータソースから取り込んだデータを、もともとデータ ソースに存在しなかった計算列を作成することで拡張できます。**

**＞さまざまなデータソースから取り込んだデータを、**
ふむふむ。

**＞もともとデータソースに存在しなかった計算列を作成することで**
なるほど、次の2つですかね。
　(1)「計算列」は元データには無い
　(2)「計算列」は DAX 上で何かを**計算**して**作成**するモノ

元のデータソースにあったデータ列を「実存列」と仮に名付けると、
　**「実存列」⇒（PowerBIで計算処理を実行！）⇒ 「実存列 & 計算列」on メモリ**
というイメージでしょうか。

**＞拡張できます。**
どうやら、「実存列 & 計算列」というのが拡張された状態と言っているようですが、まだ確信を持てません。

**＞この機能は慎重に使用する必要があります。**
どういうことでしょうか。
用法要領に注意して･･･といったセリフが思い浮かびましたが、それに近い話なのでしょうか。
もしそうなら、使いすぎると何かに負担がかかる未来が想像できます。
まだよくわからないので、ここはそんな感じということで次へ行きましょう。

**＞これについては、このモジュールで後ほど説明します。**
後ほどの説明に期待しましょう。

原文も確認してみました。

*DAX allows you to augment the data that you bring in from different data sources by creating a calculated column that didn't originally exist in the data source. 
This feature should be used sparingly, which will be explained later in this module.*

Dな翻訳にかけてみたところ･･･、

『DAXでは、データソースに元々存在しない計算列を作成することで、異なるデータソースから取り込んだデータを補強することができます。この機能はあまり使用しないようにしてください。これについてはこのモジュールで後ほど説明します。』

あまり使用しないようにって･･･、少し理解が進んだような気がします。

今回はここまで。
Elastic Load Balancing (ELB) のまとめ

# 概要
![ELB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431877/02c2760c-2fb7-eb2f-e13c-c198a887ef81.png)

Elastic Load Balancing (ELB) はトラフィックの負荷分散のサービス。例えば、Webサーバーとして機能するEC2インスタンスが複数台あり、それらへアクセスを分散させて安定稼働を図りたい場合等に用いられる。アクセスが割り当てられる先をターゲットという。リスナーにはListenするプロトコルとポート番号、ターゲットへの接続用のプロトコルとポート番号等を設定する。

また、ELBは自動的にスケールするため、ロードバランサ自体の冗長構成はユーザーは気にしなくて良い。マルチAZ構成に関してはELBの設定画面から、希望するAZとサブネットを選択する（画像）。ALB, CLBに関してはスケール時にIPアドレスが変化するので、基本的にDNS名を用いたアクセスを行うことが推奨されている。

![ELB_multiaz_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431877/6839daef-3686-8fba-bfa8-bc8857bbd743.png)


VPC環境では、NLBかALBの使用が推奨されている。

# 機能

### Health Check
設定値（プロトコル、ポート、パス、タイムアウト時間、正常の閾値、非正常の閾値、間隔、成功コード）に基づいて`ターゲットに対してヘルスチェックを行う`。`正常なターゲットに対してトラフィックをルーティングする`。
※ 正常/非正常の閾値・・・正常/非正常を判定するまでに必要なヘルスチェックの連続成功/失敗回数

### Sticky Sessions
`同じユーザーから来たリクエストを同じインスタンスに送信する`。アプリケーション内でセッション管理する場合等に用いる。デフォルトでは無効になっている。HTTP, HTTPSでのみ利用可能。

### Connection Draining
バックエンドのインスタンスをELBから登録解除、またはヘルスチェックが失敗した際に機能する。そのような事象が起きた際には、`新規のリクエストの割り振りは中止し、処理中のリクエストはリクエストが終了するまで一定時間待機する`。デフォルトで300秒、最大3600秒の設定ができる。

### SSL/TLS Termination
`ELB側でSSL/TLS認証を行う`機能。クライアント、ELB、バックエンドインスタンス間で通信を分割することができる。例えば、ELBにはHTTPSでアクセスし、ELB-バックエンドインスタンス間はHTTPでアクセスする等。

### モニタリング
CloudWatchによりELBメトリクス（HealthyHostCount, RequestCount, Latency, HTTPCode_ELB_XXX, HTTPCode_Backend_XXX, BackendConnectionErrors, SurgeQueueLength, SpilloverCount...）を60秒間隔で監視できる。

### ポートへの負荷分散
`単一インスタンス内の複数ポートに対して負荷分散する`機能。コンテナへの負荷分散等に適する。

### クロスゾーン負荷分散
`AZ毎にインスタンス数が不均一であったとしても、それぞれのインスタンスの負荷が均一化されるように分散される`機能。

### コンテンツベースルーティング
ALBで利用可能な機能。`HTTPヘッダ内の情報、クエリ文字列等に基づいてトラフィックを割り振ることができる`。

# 3種のロードバランサーの比較
|    | NLB | ALB | CLB |
|:---|:---:|:---:|:---:|
| どのレイヤで機能するか | 4 | 7  | 4/7 |
| IPアドレス| 静的（EIPの使用も可）| 動的| 動的　|
| セキュリティグループ | なし (※1) | あり | あり |
| コネクションタイムアウト値 | 360秒 |1-4000秒（デフォルト60秒） | 1-4000秒（デフォルト60秒） |
| リスナーのプロトコル | TCP, TLS, UDP, TCP_UDP | HTTP, HTTPS | HTTP, HTTPS, TCP, SSL |
| ルーティングアルゴリズム | フローハッシュアルゴリズム | ラウンドロビン | ラウンドロビン（TCP）, The least outstanding requests routing algorithm (HTTP/HTTPS) |
| クロスゾーン負荷分散のデフォルト設定 | 無効 | 有効 | 有効 |
| 暖気運転 (※2) | 不必要 | 必要 | 必要 |
| ポートに対する負荷分散 | ○ | ○ | × |
| バックエンドインスタンスのIPアドレス指定 | ○ | ○ | × |
| スティッキーセッション | ○ | ○ | ○ |
| コンテンツベースルーティング | × | ○ | × |
| セキュリティグループの使用 | × (※3) | ○ | ○ |

(※1) NLB自体にはセキュリティグループの設定がない。そのためNLBのセキュリティグループIDをターゲット側のセキュリティグループで設定することができない。したがって、ターゲットインスタンスのセキュリティグループでクライアントからのインバウンドを許可する必要がある。

(※2) 暖気申請はBussiness/Enterpriseのサポートが必要。

(※3) NLBではターゲットのセキュリティグループを適切に設定する必要がある。

# その他留意事項
ALB, CLBにおいてHTTP/HTTPSリスナーを用いた場合は、設定しない限りクライアントIPを取得しない。アプリケーション内でクライアントIPが必要となる場合には、`X-Forwarded-For`ヘッダを使用して、ヘッダ内でクライアントIP情報をバックエンドインスタンスへ渡す。なお、`X-Forwarded-Proto`ヘッダを利用することで、クライアント-ロードバランサ間でプロトコル情報を持たせることができる。

# 参考

https://www.youtube.com/watch?v=4laAoK-zXko&t=2206s

https://dev.classmethod.jp/articles/describe-elb-types/
React Routerでlocationを取得するサンプル

# 概要

- とりあえず、window.location.pathname,searchを取得したい
    - とりあえず `window.location.pathname` を記述しても取得は可能
    - だが、きっとスマートな方法があるに違いないと思っている
- 2021年時点でのReact初学者
- 調べると、どうやらReactは歴史があり、時期によって推奨される記述方法やモジュールが変遷しているように感じている

（いつか古くなると思いつつ）一応取得できたので、メモしておこうと思います。

# 手順

## 実行環境

- Windows10 + WSL2 + Ubuntu 20.04 + Node.js 16

```
$ cat /etc/issue
Ubuntu 20.04.2 LTS \n \l
$ node --version
v16.5.0
```

## 準備

Reactアプリケーション `router-sample` を作成し、React Routerモジュールをインストールします

```
$ npm install -g create-react-app
$ npx create-react-app router-sample
$ cd router-sample
$ npm install react-router-dom
```

モジュール類のバージョン確認

```
$ npm list
router-sample@0.1.0 (snip)../router-sample
├── @testing-library/jest-dom@5.14.1
├── @testing-library/react@11.2.7
├── @testing-library/user-event@12.8.3
├── bindings@1.5.0 extraneous
├── file-uri-to-path@1.0.0 extraneous
├── nan@2.14.2 extraneous
├── react-dom@17.0.2
├── react-router-dom@5.2.0
├── react-scripts@4.0.3
├── react@17.0.2
└── web-vitals@1.1.2
```

## サンプルソース

```jsx:src/App.js
import React from "react";
import {
  BrowserRouter as Router,
  Route,
  useLocation
} from "react-router-dom";

export default function App() {
  return (
    <Router>
      <Route>
        <Sample />
      </Route>
    </Router>
  );
}

function Sample() {
  const {
    pathname,
    search
  } = useLocation();
  return (
    <>
      <p><a href="/test/link?a=1&b=2">test link1</a></p>
      <p><a href="/go/?a=xyz">test link2</a></p>
      <p>location.pathname:{pathname}</p>
      <p>location.search:{search}</p>
      <p>window.location.pathname:{window.location.pathname}</p>
      <p>window.location.search:{window.location.search}</p>
    </>
  )
}
```

## 実行

```
$ npm start
```

Webブラウザで確認します

- `test link1` 、 `test link2` それぞれをクリックして、pathname、searchの値が変化することを確認します


<img width=100%" alt="kakunin" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/21b17fd4-c3b0-ef83-85f4-20109a4fc44a.gif">



# メモ

## 使える場所

`<Router>` `<Route>` で囲まれた部分で `useLocation()` を使用できるようです。そうでない場合は下記のようなエラーが発生します。
`useParams()` や `useHistory()` も同様です。

```
TypeError: Cannot read property 'location' of undefined
```

## 本来の使い方？

`<Route path="/funcname">` のように記述して、パスによって要素を切り替えて利用するのが本来かもしれません。
【GA4】非エンジニアがDebugViewでリアルタイムにイベントを確認する方法

Firebase Analyticsで計測したイベントを、DebugViewで確認する方法をまとめます。
エンジニア以外に配布したapkファイル、ipaファイルでインストールしたアプリのデバッグ有効化方法についてもまとめます。

# DebugViewとは？
Firebase Analytics、またはGA4にはDebugViewという機能があり、デバッグモードが有効になっているアプリのイベント、イベントパラメータをほぼリアルタイムで確認することが出来ます。
このボタンをタップした際に、想定通りにイベントが計測されているか、イベントパラメータに設定されている値は正しいか、ということが、BigQueryなどを使わずにGUIで確認可能です。
リアルタイムにイベントを確認するには、リアルタイムビューでも可能ですが、リアルタイムビューだと、他のユーザーのデータも含まれます。DebugViewだとデバイス選択を行うことができ、他のユーザーのデータの干渉を受けずに自分のデバイスで発生したイベントだけを追うことが出来るメリットがあります。

# アプリのデバッグモード有効化
## Android
下記のadbコマンドで有効化できます。

```
adb shell setprop debug.firebase.analytics.app <パッケージ名>
```

## iOS
Xcodeで下記のコマンドライン引数を指定して実行します。

```
-FIRDebugEnabled
```

# エンジニア以外がデバッグモードを使うには？
ここまで紹介した内容は、エンジニア向けのデバッグモード有効化の方法で、ヘルプに載っている情報もこれだけです。
でも、デバッグモードを有効にしてDebugViewで確認したい人って、エンジニアだけじゃないですよね？
テスターだったり、マーケターだったり、エンジニアじゃない人がDebugViewを使う方法はないの！？ってことで、GTMを使ったデバッグモード有効化の方法もご紹介します。
※debug_modeのパラメータが含まれるイベントはレポート集計に影響を及ぼす可能性があるため、**本番環境で使用しているGTMコンテナでは使用しないでください。**

## 対象アプリ
GTM SDKが導入されているアプリが対象です。

## GTMのタグ設定(OS共通)
AndroidもiOSもタグの設定内容は同じです。

1. 「Google アナリティクス（Firebase）」タグを選択
1. アクションに「イベントを修正」を設定
1. 追加または編集するパラメータにキー「debug_mode」、値「true」を追加
1. トリガーに「All Event」を設定
1. 保存してタグを公開 (※タグ公開前にインストールしていた場合、GTMの設定をすぐアプリに反映させるためには再インストールが必要です)

▼タグ設定
![20210726_GTMデバッグ設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624293/8bcc81c6-a675-6081-5635-1ec4802090f6.png)

# 注意点
今回の方法は開発環境での動作を想定しています。
**debug_modeのパラメータが含まれるイベントはレポート集計に影響を及ぼす可能性があるため、本番環境で使用しているGTMコンテナでは使用しないでください。**
大事なことなので2回書きました。

# まとめ
この方法を使うことで、社内にipaファイルやapkファイルで配布したアプリでも、デバッグモードを有効にすることが可能になります。
GTMの設定だけで有効にできるので、エンジニアはipaファイルやapkファイルの作成だけして、その後はエンジニア以外の人でも操作可能なので、デバッグモードでの動作確認がエンジニアしかできない！という事態も回避可能です。


# 参考
* [[GA4] デバッグモードでイベントをモニタリングする](https://support.google.com/analytics/answer/7201382?hl=ja)
* [デバッグモードの有効化](https://firebase.google.com/docs/analytics/debugview?hl=ja)
Volta使ってみた

NodeとNPMのバージョン管理ツールが出たみたいなので試してみた
試した環境はDocker内 `Debian 10 (buster)`

nコマンドとか他にもバージョン管理できるツールあるけど、このVoltaはpackage.jsonにバージョンが記載されて、Git管理できるのがいいみたい。

公式サイト：https://volta.sh/


## Download / Install volta
```
curl https://get.volta.sh | bash
```

The above command will add the following to `.bashrc`.

```
export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"
```


## Install / Pin Node and NPM
```
source ~/.bashrc
volta install node@14.17.3
volta install npm@6.14
volta pin node@14.17.3
volta pin npm@6.14
```

The above command will add the following to `package.json`

```
    "volta": {
        "node": "14.17.3",
        "npm": "6.14.14"
    }
```

## For other engineers

Other engineers just pull the package.json and run `npm install`, it is going to install the pinned version of NodeJs and NPM.
PowerAppsでレコードの値を一列に入れる：Split関数（エクセルの行と列の入れ替えみたいに）

#やりたい事

アンケートで集めたデータをギャラリーコントロールで簡単に表示をしようと思ったら意外とてこずりました。

例えばデータソースに下図の様なデータがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/29f9177d-5900-7814-ef83-bbf17dc953c2.png)
Googleフォームやマイクロソフトフォームで集めたデータはこの様になりがちです。

この様な横方向のデータはギャラリーでは簡単に表示できません。

ちなみに下記のコードをボタンのOnSelect属性に入れてコレクションを作って、実習をできる様にしました。

```ruby:OnSelect属性＝
ClearCollect(アンケート,{質問１:"あいう",質問２:"かきく",質問３:"さしす",質問４:"たちつ",質問５:"なにぬ"})
```
#Split関数の説明

エクセルでしたら行と列の入れ替えで簡単に縦方向に変換できますが、PowerAppsにはその機能がありません。

しかし工夫をすればSplit関数で行から列へは変換ができます。（列から行への変換はできません。）

Split関数は「,（カンマ）」などの区切り記号が入った文字列をその区切り記号で分離してテーブルに入れてくれます。
試しに下記のコードをボタンのOnSelect属性に入れて「テスト」コレクションを作ります。

```ruby:OnSelect属性＝
ClearCollect(テスト,Split("ABC,DEF,GHI",","))
```

すると下図のようなコレクションができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/6a0016b9-6aa1-8434-8bd9-2515638a61c9.png)
#With関数とSplit関数を使って行を列に変換する

このSplit関数の特性を使うと先ほどのアンケートのデータを縦方向に変換してギャラリーコントロールに表示できます。
ギャラリーを追加してそのItems属性に次のコードをコピペします。

```ruby:Items属性＝
With({レコード:First(アンケート)},Split(レコード.質問１ & "," & レコード.質問２ & "," &レコード.質問３ & "," &レコード.質問４ & "," &レコード.質問５, ","))
```

First関数で「アンケート」コレクションに入っているデータをレコード毎取得して、それをWith関数で一時的変数：「レコード」にレコード毎入れています。

With関数の第二引数で実際に行いたい数式を書きます。ここでSplit関数を使っています。
最初の「レコード.質問１」は「質問１」列の値になります。全ての列の値を「,（カンマ）」を入れて繋げて長い文字列を作っています。
そしてSplit関数の第二引数に「","」にして、区切り記号としてカンマを指定しています。

これのギャラリーの結果が下図の様になり上手くいきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/bc14781e-621f-d750-78ff-ddaa70d037aa.png)
画像分野のDeep Learningに関してGitHubのリポジトリおすすめ

#初めに
画像分野のDeep Learningに関して、GitHubでいくつかの素晴らしいリポジトリ見つかったため、皆さんに紹介したいと思います。

| お名前| クリエイター  | サイト |
|:-----------:|:------------:|:------------:|
| Awesome-Image Classification| Weiaicunzai |[Awesome-Image Classification](https://github.com/weiaicunzai/awesome-image-classification   )     |
| object-detection    |      amusi  |    [object-detection](https://github.com/amusi/awesome-object-detection/blob/master/README.md)    |
| Awesome Semantic Segmentation       |        mrgloom  |     [Awesome Semantic Segmentation](https://github.com/mrgloom/awesome-semantic-segmentation)     |
| Awesome Human Pose Estimation         |         cbsudux  |     [Awesome Human Pose Estimation ](https://github.com/cbsudux/awesome-human-pose-estimation)      |
|Awesome-Most Cited Deep Learning Papers  |     terryum  | [Awesome-Most Cited Deep Learning Papers  ]  (https://github.com/terryum/awesome-deep-learning-papers)    |
|awesome-lane-detection  |      amusi  | [awesome-lane-detection ]  (https://github.com/amusi/awesome-lane-detection)    |

#1.[Awesome-Image classification](https://github.com/weiaicunzai/awesome-image-classification)
このリポジトリの内容：
・背景
・各ネットワークの[ImageNet](https://image-net.org/)でのパフォーマンスまとめ
・各ネットワークの論文及びコードまとめ
近年の画像分類についての主な論文を全部まとめたと思います。クリエイターが当時Deep Learningを始める時、どこから始まったほうがいいかなぁと迷っていたと記載されています。なので、初心者はVgg-Googlenet-Resnetという順番で勉強すべきだとお勧めしています。
#2.[object-detection](https://github.com/amusi/awesome-object-detection/blob/master/README.md)
このリポジトリの内容：
・物体検出のネットワークリスト
・Survey
・各ネットワークの論文及びコードまとめ
・ツールボックス
#3.[Awesome Semantic Segmentation](https://github.com/mrgloom/awesome-semantic-segmentation#graphical-models-crf-mrf)
このリポジトリの内容：
・Segmentationに関して各ネットワークの論文及びコード
・Segmentationに関してデータセットまとめ
・ベンチマークまとめ
・評価関数と損失関数などのまとめ
・医学的な画像のSegmentation
・衛星画像のSegmentation
・ビデオSegmentation
#4.[Awesome Human Pose Estimation](https://github.com/cbsudux/awesome-human-pose-estimation#readme)
このリポジトリの内容：
・Basics
・論文及びコードまとめ
・データセットまとめ
・ワークショップまとめ
・各フレームワークによる実装のまとめ
#5.[Awesome-Most Cited Deep Learning Papers](https://github.com/terryum/awesome-deep-learning-papers)
このリポジトリの内容：
・各分野の新しい及び古い論文のまとめ
#6.[awesome-lane-detection](https://github.com/amusi/awesome-lane-detection#readme)
このリポジトリの内容：
・区画線認識に関して近年の論文まとめ
・コードまとめ
・Blog/Tutorialお勧め
・データセットまとめ
#引用文
Awesome-Image classification
https://github.com/weiaicunzai/awesome-image-classification
object-detection
https://github.com/amusi/awesome-object-detection/blob/master/README.md
Awesome Semantic Segmentation
https://github.com/mrgloom/awesome-semantic-segmentation#graphical-models-crf-mrf
Awesome Human Pose Estimation
https://github.com/cbsudux/awesome-human-pose-estimation#readme
Awesome-Most Cited Deep Learning Papers
https://github.com/terryum/awesome-deep-learning-papers
awesome-lane-detection
https://github.com/amusi/awesome-lane-detection#readme
情シスと愉快なネットワークたち

#これはなに
ネットワーク周りで今まで出会った愉快な事象を、供養代わりに(書ける範囲で)まとめたもの。


#ネットワークループ
人は片方が接続されていないLANケーブルと空きポートがあるととりあえず接続したくなる生き物らしい。

- 事象
    - 会議室でノートPC を接続する用途で出しておいた LANケーブルが、HUB の空きポートに刺される
    - 机に立ち上げておいた LANケーブルが、島HUB の空きポートに刺される
- 対策
    - 空きポートにフタをする
    - 可能であれば、HUB を床下などに収納し、物理的に手が届かないようにする
    - ~~注意書きをする~~ ←「絶対に目につくところ」に、「万人に通じる注意書き」を留めるのは難しい
    


#電源断
そうかと思いきや、人は刺さっているものがあるととりあえず抜きたくなる生き物らしい。

- 事象
    - 座席引っ越しの時に、PC の電源と一緒に島HUB などの電源も抜く
    - ノートPC のコンセントと間違って抜く
- 対策
    - 触ってほしくない電源の根元に「抜いたら死ぬ」というマーキングタイを付けたら効果があった

#リンクアップしなくなるケーブル
上っ面の知識で機能に頼るとこうなる。

- 事象
    - スイッチと対向のスイッチのインタフェースを Autoネゴから 100M/full に変更したらリンクアップしなくなった
- 原因
    - スイッチ間をストレートケーブルで接続していた (※ Auto MDI/MDI-X は Autoネゴの時しか働かない)
- 対策
    - Auto MDI/MDI-X があっても、ストレート/クロスはきちんと使い分ける
    - ストレート/クロスの変換コネクタを念のため持っておく (あまり望ましくないが)

#野良DHCPサーバ
存在してはいけないものが突然現れる。おばけ？ゾンビ？

- 事象
    - 突然、PC に意図しない IPアドレスが割り当てられるようになった
- 原因
    - HUB が足りなくなったといって、リプレイスした旧ルータを HUB 代わりに使い、意図しない DHCPサーバが誕生した
- 対策
    - 触ってほしくない機器は目につかないところに置く
【SQL】GROUP BYの落とし穴


#### GROUP BYではよく泣かされるという話

下記の様なよくあるクエリ。
このクエリでは、COUNT句でレコード数を取得しています。
一見問題なさそうですが（勿論、問題無い場合もあるのですが）、これはGROUP BY句を使用しているため、データ数が増えると検索に（かなり）時間を取られる場合があります。

```sample_1.sql
SELECT 
  param_1,
  param_2,
  COUNT(*) AS numRecord 
FROM 
  table
GROUP BY 
  param_1,
  param_2
HAVING 
      param_1 = '****'
  AND param_2 = ''****' 
```


代替手法として、荒業ではありますが、下記の様にレコードを丸ごと取得して、そのレコード数を調べるという方法があります。
こちらの方がGROUP BY句を使用していない分、検索はかなり速いです。
勿論、取得する必要のないレコードを取得したりして、余計なメモリを食ったりと問題はあるのですが、方法の1つとしてはありかなと思います。
ただ、取得レコード数が100万を超えたりすると、ちょっと厳しいかな。。。
レコード数次第だと思います。

```sample_2.sql
SELECT 
  param_1,
  param_2,
FROM 
  table
WHERE
      param_1 = '****'
  AND param_2 = ''****' 
```


#### 訂正

コメントでご指摘の様に、下記クエリが適切な書き方でした。
訂正させて頂きます。

``` sample.sql
SELECT
    COUNT(*) AS numRecord
FROM
    table
WHERE
      param_1 = '****'
  AND param_2 = ''****'
```
npm 依存パッケージをアップデート

ncu (https://www.npmjs.com/package/npm-check-updates) を使う方法もありますが、
npm だけで依存関係をアップデートしたかったので、その作業メモを残しておきます。


## 新しいバージョンがあるか確認

```
$ npm outdated
Package             Current  Wanted  Latest  Location
@mapbox/spritezero  MISSING   6.3.0   7.0.1  your-project
@mapbox/maki          4.0.0   4.0.0   7.0.0  your-project

```

## アップデート

```
$ npm update @mapbox/spritezero @mapbox/maki
```
表示関連

##全体
この記事は下の記事の一部です。

https://qiita.com/punchlemon/items/5fc962e5c4b80bcfe776

##とりあえずボタンを押したら変更できるようにしてみる
`gap`というDouble型の変数を宣言してあげることで実現しています。
最初宣言する時に`var gap = 0`で宣言したら、なんか色々エラーが出てきて、
Doubleg型がいいというのでここで宣言する必要もなかったのですが、面倒だったのでここで宣言しています。`changeDay`関数のところでDouble型にキャストした方が良かったですかね？
`var gap: Double = 0`にしてみたのですが、まだエラーが出てきて、
`Left side of mutating operator isn't mutable: 'self' is immutable`
と出てきたのですが、どうもこれはswiftが値参照であることに由来しているみたいで、勝手に変更できなくなっているみたいです。色々なところのコードで見かけるような形で素直に`@State var gap: Double = 0`
と宣言したところエラーが出なくなりました。
これも要勉強です。
`@State`が何者かよく分かっていないのです。

↓
本来、構造体の中でプロパティの更新はできないが、`@State`をつけることで可能になるらしいです。
下の記事を参照しました。

https://capibara1969.com/1608/



`Button`関数については参考書
*SwiftUI対応-たった2日でマスターできるiPhoneアプリ開発集中講座-Xcode-iOS-14対応*
を参考にしていてそこで`Button`関数の引数の書き方が崩れていることを説明していたのでわかりずらいかと思いますが、もう少し時間ができたらそれを参考にして書きたいと思います。


##アプリのオブジェクを一つの画面に表示
方法が

1. `Vstack {}`で括る
2. `Hstack {}`で括る
3. `Zstack {}`で括る

の3つです。それぞれ単語の意味が

###`Vstack {}`で括る
Vertical:垂直
stack:積み重ねる
Vstack → 縦に積み重ねる

###`Hstack {}`で括る
Horizontal:水平
stack:積み重ねる
Hstack → 横に積み重ねる

###`Zstack {}`で括る
Z-axis:Z軸
stack:積み重ねる
Zstack → 手前に積み重ねる

となっています。ZのところだけAppleリファレンスでZを使って説明されてなかったのですが（Back-to-Frontと書いてありました）ZということはZ軸の話をしていると推測しています。

##参考文献
SwiftUI対応-たった2日でマスターできるiPhoneアプリ開発集中講座-Xcode-iOS-14対応
日付関連

##全体
この記事は下の記事の一部です

https://qiita.com/punchlemon/items/5fc962e5c4b80bcfe776

##日時の取得
まず今日が何日かを取得する方法です。
`var now :Date = Date()`
これでDateというstructのnow（この名前はなんでもいい）という変数を宣言して、そこに初期値としてDate()という今の日時を取得できる関数で今のDateの値を代入しています。

##日時の表示
Date型をString型に変える処理をprintDayという関数を作って表示しています。
format（yyyyMMみたいな）を指定してString型に変更しているだけなので、printDayという名前はおかしいかなと思いましたが、他にいいものが思いつかなかったのでとりあえずこれでいきたいと思います。

この関数の引数はDate型とString型でそれぞれ
Date: Stringに直したいdate
String: format（yy.M.ddみたいな）
を指定しています。

DateFormatter型で`formatter`という定数を`DateFormatter()`で宣言して
この`formatter`の
`.calendar`というプロパティを`Calendar`関数で`gregorian`（グレゴリオ暦のこと）にして
`.dateFormat`というプロパティに引数の`f = "M/dd"`を代入して設定しています。
DateFormatter型の`.String`メソッドを使ってDate型をString型に変更していると思われるんだけど詳しくわからなかったので要勉強。`from:`のところがいまいちよくわからないです。

```swift:printDay
func printDay(d: Date, f: String) -> String {
    let formatter :DateFormatter = DateFormatter()
    formatter.calendar = Calendar(identifier: .gregorian)
    formatter.dateFormat = f
    return formatter.string(from: d as Date)
}
```

##表示する日付の変更
Date型の`addingTimeInterval`メソッドを使いたいんですけど、`TimeInterval`ではDoubleを使って欲しいみたいなので、Doubleをあげています。秒数で管理しているので、n日変更したいときは`n*24*60*60`のようにしてあげます。

```swift:changeDay
func changeDay(d :Date, i: Double) -> Date {
    let returnDate = d.addingTimeInterval(i*24*60*60)
    return returnDate
}
```

##参考文献
https://developer.apple.com/documentation/foundation/timeinterval
https://www.ajinohiraki.info/entry/2018/09/17/012022
https://capibara1969.com/2100/
https://qiita.com/k-yamada-github/items/8b6411959579fd6cd995
↑`printDay`関数はこの人のやつが最終形態に近いです。
slack_sdkのバージョン3.8.0等でicon_emojiを利用する場合

slack_sdkのバージョンアップによりWebhookClientのsendメソッドでicon_emoji等が設定できなくなっていましたので、以下の方法に変更

```
    webhook = WebhookClient("https://hooks.slack.com/services/......")
    response = webhook.send_dict(
        body={
            'username':'UserName',
            'icon_emoji':':fire:',
            'text':'テストメッセージ'
        }
    )
```
ライブラリのバージョンアップでまた変更されるかもですが、sendではなく、send_dictに変更することで解決しました。

2021/07/28時点の情報です
Rstudio で setwd(今いるファイルの場所) したいとき

https://codehero.jp/r/13672720/r-command-for-setting-working-directory-to-source-file-location-in-rstudio

によると `rstudioapi` を利用すればよい。
rstudioapiをインストール

```
install.packages("rstudioapi")
```

使い方。

```R
library(rstudioapi)
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
```

以上。
kintoneの添付ファイル画像をスペースフィールドに表示する

今回は、kintone REST API Clientをつかって、
kintoneの添付ファイル画像をスペースフィールドに展開して表示してみます。
kintoneカスタマイズチュートリアルを一通り終わらせている方向けに書いております。


出来上がりイメージ（絵は私が書きました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/90c54edc-bf61-989b-f33b-39e2cbe8cc49.png)

# アプリの準備

| フィールド種類 | フィールドコード |
|:-:|:-:|:-:|
| 添付ファイル  | 添付ファイル  |   
| スペース  | sp  |   

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/1195dc0d-ac47-8a33-5c71-2ef8e7f33975.png)

# JavaScript

kintone REST API Client を使用します。

`https://unpkg.com/@kintone/rest-api-client@2.0.14/umd/KintoneRestAPIClient.min.js`


イベントは「レコード詳細画面の表示後イベント」や「レコード印刷画面表示イベント」がおすすめです。

```js
const client = new KintoneRestAPIClient();
const sp = kintone.app.record.getSpaceElement("sp");

for (let f of event.record.添付ファイル.value) {
  const data = await client.file.downloadFile({
    fileKey: f.fileKey,
  });

  // ファイル名
  const title = document.createElement("p");
  title.textContent = "▼" + f.name;
  sp?.appendChild(title);

  // 画像
  const b = new Blob([data]);
  const img = document.createElement("img");
  img.src = URL.createObjectURL(b);
  img.style.width = "600px";
  sp?.appendChild(img);
}


```

添付ファイルフィールドいらない。画像だけ見えればいいという場合は

```js
kintone.app.record.setFieldShown("添付ファイル", false);
```

も入れておくと良いかも？
いつも忘れてしまう「配列の末尾に追加するメソッド」を言語ごとにまとめてみた

いくつかの言語を同時並行で触っていると、「配列の末尾に追加するメソッド」が分からん！自分はなんて初心者なんだ、と嘆くことが多々ある。

pushなの？
appendなの？
putなの？
はたまたそれ以外？
そんなことに悩む時間を少しでも減らせるように、こんな記事を書いてみた。

## Java
```Java
List<Integer> list = new ArrayList<Integer>();
list.add(item);
```

## JavaScript
```JavaScript
list.push(item)
```
## Python
```Python
list.append(item)
```

## PHP
``` PHP
array_push(list, item1, item2...)
```
## Ruby
``` Ruby
list.push(item)
```

## Go
※Goでは可変長の配列はSliceという型

```Go
append(slice, item)
```
SSHキーの生成方法(Mac)

## はじめに

GitでSSH接続するためにSSHキーが必要なので、生成します。

## 環境

- OS： macOS Big Sur 11.4

## 注意

- GitHubの公式ドキュメントでは、RSAでなくEd25519の暗号化アルゴリズムが使われているため、それに合わせている

## SSHキーの生成方法

### SSHキーの存在確認

`~/.ssh` フォルダに以下のファイルが存在すれば、すでにSSHキーが生成されています。

- `id_ed25519` （秘密鍵, private key）
- `id_ed25519.pub` （公開鍵, public key）

再利用する場合はSSHキーの生成が不要です。

### SSHキーの生成

`ssh-keygen` コマンドを実行してSSHキーを生成します。

```bash
# SSHキーを生成する
# コメントにはメールアドレスを入力するのが一般的のよう
$ ssh-keygen -t ed25519 -C "{コメント}"

# キーを保存するファイルを入力する
# デフォルトで問題なければそのままEnterキーを押下する
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/{ユーザー名}/.ssh/id_ed25519): 

# パスフレーズを入力する（確認のため2回入力する）
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

# 秘密鍵と公開鍵が生成される
Your identification has been saved in /Users/{ユーザー名}/.ssh/id_ed25519.
Your public key has been saved in /Users/{ユーザー名}/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX {コメント}
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
```

### SSHキーの確認

Vimなどのテキストエディタで `~/.ssh/id_ed25519` と `~/.ssh/id_ed25519.pub` を開き、内容に問題ないことを確認します。

```:~/.ssh/id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END OPENSSH PRIVATE KEY-----
```

```:~/.ssh/id_ed25519.pub
ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX {コメント}
```

## おわりに

これでSSHキーの生成が完了です。

GitHubやAzure Reposへ公開鍵をアップロードすることで、SSH接続できます :relaxed: 

## 参考リンク

- [Connect to your Git repos with SSH - Azure Repos | Microsoft Docs](https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=azure-devops)
- [GitHub に SSH で接続する - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh)
カスタムフォントはメインターゲットに入れないと反映されない

# 結論
EmbeddedFrameworkによってターゲットを分けているプロジェクトで
カスタムフォントを使用する場合には
メインターゲットにフォントファイルを入れなければいけません。

メイン以外のターゲット配下にファイルを入れて、
そのターゲットの`info.plist`にファイルを紐付けても、
使用することはできません。

言いたいことは以上なのですが、FontBookを使ったカスタムフォントの導入方法も備忘のために記述します。

# カスタムフォントの導入方法

今回は`HiraKakuStdN-W8`を追加します。

## FontBookから必要なフォントファイルを取得する
Xcodeでカスタムフォントを使用するには`.ttf`、`.otf`形式のファイルをXcodeに組み込む必要があります。
デフォルトでMacに入っている`FontBook`を開き、お目当てのHiraKakuStdN-W8はヒラギノ角ゴのW8にあたるので、
それを検索して右クリックするとFinderからフォントファイルの在り処を調べることができます。


![スクリーンショット 2021-07-27 23.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287671/7c86861e-af08-1949-6dac-84aef864e1d6.png)


FontBook経由でなくてもデフォルトでMacで使えるフォント（例えばBigSurの場合は[こちら](https://support.apple.com/ja-jp/HT211240)）は
`/System/Library/Fonts/`配下にあるはずなのでこちらにアクセスしてフォントファイルを取得してきてもOKです。

## `.ttc`を`.otf`に変換する

[transfonter](https://transfonter.org/ttc-unpack)を使いました。
アップロードして変換後のファイルをダウンロードするだけです。

## 新フォントをXcodeに組み込む

 1. `.otf`形式に変換したフォントファイルを**メインターゲット配下**の任意のフォルダに格納します
 1. XcodeのProject > メインターゲットを選択 > Build Phases > Copy Bundle Resources に追加した`.otf`ファイルが追加されていることを確認します（なければ追加してください）
 1. info.plistの`Fonts provided by application`を追加して、新たに加えた`hoge.otf`ファイルのファイル名を記述します

##  StroyBoard、xibから使用する

上記まで問題なくできていれば普通に使用するだけです。

|  before  |  after  |
| ---- | ---- |
|  ![スクリーンショット 2021-07-27 23.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287671/154f5d37-e9f8-b215-74e7-78e8ce3a35cc.png)  |  ![スクリーンショット 2021-07-27 23.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287671/7287b79b-ed37-f21b-d6b1-be5346f88d58.png)  |

ちなみにメインターゲットに入れていないと、
xib上ではフォントは変更されているのに、実機かシミュレータでは反映されません。
ご注意を。

## コードから使用する

Xcodeから使用できるフォントは`UIFont.familyNames`が持っているので、以下のコードからprintできます。

```Swift
for family: String in UIFont.familyNames {
    print(family)
    for names: String in UIFont.fontNames(forFamilyName: family) {
        print("== \(names)")
    }
}

// 出力（抜粋）
// Hiragino Sans
// == HiraginoSans-W3
// == HiraginoSans-W6
// == HiraginoSans-W7
// == HiraKakuStdN-W8
```

もともと入っていた`HiraginoSans-W3`、`HiraginoSans-W6`、`HiraginoSans-W7`に加えて
`HiraKakuStdN-W8`が追加されています
また、メインターゲットにフォントファイルが入っていない場合こちらも出力されません。

このfamilyNameを使って以下のようにコードからも設定できます

```Swift
let hirakakuStdW8Font = UIFont(name: "HiraKakuStdN-W8", size: 24)!
```

# 結論（再掲）

EmbeddedFrameworkによってターゲットを分けているプロジェクトで
カスタムフォントを使用する場合には
メインターゲットにフォントファイルを入れなければいけません。
mayaでDeadlineを使ってみる2

---

普段案件毎に読ませるプラグインを変えているので、deadlineのワーカーにも同一のプラグインを読ませないと動かない。
プラグインについてはver違いなどもあるので、ワーカーにとりあえず全部インストールスタイルは通用しない。

案件のmaya起動に使用しているusersetup.pyをmayaBatchに読ませたら良いのでは？

mayaBatch.exeに読ませられるか実験

    SET MAYA_UI_LANGUAGE=en
    SET PYTHONPATH="Z:/python"
    START "" "C:\Program Files\Autodesk\Maya2019\bin\MayaBatch.exe" -file "Z:\testFile.ma"

結果：どうやら読ませられる。

mayaBatch で GUIをいじるとクラッシュするとの報告も見かけたので、念のため　usetsetup.py 内で

    if cmds.about(batch = True) ==False:

によってmayaBatch時はGUI編集を飛ばすように対応。


----

usersetup.pyを読ませるために デッドラインの mayaBatch プラグインをちょっと編集
直接編集は怖いので、複製して別名プラグインとして編集。

def StartJob 内に

    self.SetEnvironmentAndLogInfo("PYTHONPATH", "Z:/python")

を追記。
※SetEnvironmentAndLogInfo　は環境変数を指定するためのdeadlineのコマンド


usersetup.pyの場所も実行時のオプションとして渡したいのであれば、
サブミット時に生成される　XXXXXXXX.job ファイルにオプションを追加。

    PYTHONPATH=Z:/python

それをプラグイン側で読み込ませて、環境変数に渡す。

    pythonPath = self.GetPluginInfoEntryWithDefault("PYTHONPATH", '')    
    if pythonPath != "":
        self.LogInfo("Adding " + pythonPath + " to PYTHONPATH")
        self.SetEnvironmentAndLogInfo("PYTHONPATH", pythonPath)

オプションの追加はサブミッターも合わせて改修する必要があるので、現在は案件毎にハードコーディング。


----
参考

https://qiita.com/rdj_masato/items/57325bd2e7ae8f3a4533

http://melpystudio.blog82.fc2.com/blog-entry-57.html
mackerel でお手軽サーバ監視

# はじめに
負荷テストとかやっているときにサーバの状態を取得したいんだけど、お手軽にやりたいということで Mackerel を利用してみる。


# Makerel でサーバ状態監視
Mackerel にアカウントを作ってログインしておく。
無料枠だと 5 サーバまで登録できる。

以下の URL から利用している環境のページを表示。(今回は ローカルの Windows) 
https://mackerel.io/ja/docs/entry/howto/install-agent

ここの手順に従う
https://mackerel.io/orgs/CIMSurveillance/instruction-agent


## Windows 環境でのサーバ状態監視

## エージェントのダウンロードとインストール

「mackerel-agent-x64-latest.msi」という MSI ファイルをインストールする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/6c1e6d10-daeb-f62b-3191-4448fcf95649.png)

次の画面で API キーが聞かれるので、Mackerel のページに記載している値を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/feb75d86-14bb-48ba-7cd5-292c5b613c9d.png)

インストールが終わると以下のコマンドを実行する。 API キーは前に書いたページに記載しているので変更する。

```batch
msiexec /qn /i path/to/mackerel-agent-x64-latest.msi APIKEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/9ec1894c-97f8-c717-e1b4-a5f1f0c25d51.png)


## Mackerel エージェントのサービス起動

Mackerel エージェントのサービスを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/4e648174-9523-d30e-8969-c2311e6b8f36.png)

# サーバ状況確認

Mackerel の画面で、左メニューの Host を選択すると、エージェントをインストールしたクライアントから送信したホスト名の一覧が出てくるので、選択するとサーバ状況が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/362679c2-fdb5-b5c6-114f-b7012f3af3b6.png)


# おわりに
簡単にサーバ状況が確認ができる。
テスト自体にリソースを使いたいし、あまり複雑なことや詳細などは不要で工数をかけずに負荷テストなど負荷状況だけを確認したいときには非常に便利。
Kotlinとは？

iOSアプリを開発するとき私たちはObjectCとかSwiftを利用する。
そして、androidアプリを開発するときはJavaとKotlinと言う言語を利用する。
今日はこのkotlinというものを調べるつもりだ。

###Kotlin?

コトリンはジャワ州の新しいプログラミング言語である.

コトリンの主な目的は，ジャワが使用されているあらゆる用途に適し，簡潔で，生産的で安全な代替言語を提供することである. 

###いい点
1.　簡潔で実用
2.　ジャワコードとの相互運用
3.　ほとんどのジャワプロジェクトでコトリンを活用できる（アンドロイド、サーバー開発など）、インテルのマルチOSエンジンを使用してiOSでも実行可能、デスクトップアプリケーション（コトリン、トルネードFX）、ジャワFXでも使用可能、ジャワスクリプトでもコトリンコードを利用してブラウザやノードで実行できる。
4. 　性能はジャワに似ている。
5. 　安定性(nullチェック、タイプ検査とキャスト)

###主になる特徴

コトリンの目標は，1問の領域のみを解決することや今日におけるソフトウェア開発の問題の一部だけを扱うための言葉ではない. その代わり、コトリンは開発過程で遂行しなければならないすべての課業において幅広い生産性を向上させる。 コトリンは、具体的な領域の問題を解決したり、特定プログラミングパラダイムを支援する様々なライブラリとうまく融合する。

静的タイプ指定言語

ジャワと同じくコトリンは静的タイプの指定言語である. 全てのプログラムの構成要素のタイプがコンパイル時点でわかり、プログラムの中でオブジェクトのフィールドやメソッドを使用するたびにコンパイラがタイプを検証してくれるという意味である。 それによって、さらにコードが短くなり、柔軟だ。

```kotlin
var x = 1
```

ここでは変数を定義しながら定数値に初期化するが、コトリンは変数のタイプをintで自動的に割り出す。 コンパイラが文脈を考慮して変数タイプを決定するこのような機能をタイプ推論という。

コトリンは関数型プログラミングを豊富にサポートする。 だからといって、コトリンが関数型プログラミングを強制したりはしない。 命令型方式の方が適している場合は、関数型プログラミングで煩わしくコーディングする必要はない。 

###コトリン·コード·コンパイル

コトリンソースコードを保存するときは、通常.ktという拡張子をファイルに貼り付ける。 コトリンコンパイラはソースを.classファイルで作り出す。コンパイルしたコードはコトリン·ランタイム·ライブラリに依存する ランタイムライブラリーには、コトリン独自の標準ライブラリークラスとコトリンでジャワAPIの機能を拡張した内容が含まれている。 コトリンでコンパイルしたアプリケーションを配布する時は、ランタイムライブラリも一緒に配布しなければならない。
TypeScriptとは？

##定義
TypeScriptはMicrosoftが開発およびメンテナンスし、オープンソースプログラミング言語である。 
JavaScript の全ての構文と意味をサポートすると同時に、静的タイプ指定及びECMAScript の上位集合であるより豊かな構文のようないくつかの追加機能を提供する。
次のダイアグラムはTypeScriptとES5、ES2015、ES2016の間の関係を示してくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465875/d4583c28-0e35-cb36-87fe-f85ccff6edc3.png)

Angular 2 では、JavaScript と共にAngular 1.x と同様の方式で作成できる。 
しかし、JavaScriptでランタイムエラーが発生した場合、オブジェクトまたはメソッド名のスペルエラーといったミスについてのみ知ることができる。 

コードをプロダクションに配布する前に、それを防ぐために多くの単位テストを作成しますが、 
ウェブで多くのエラーが発生しても、ウェブではそのエラーを内部で処理してうまく駆動させ、ユーザーに知らせずに処理する場合が多い。
スクリプトで作成するとエラーが多くわかりませんが、

TypeScriptはコンパイラによるコード誤字を処理する静的タイプ指定の利点を通じてコンパイルタイムに全タイプエラーを知らせる。

また、TypeScriptの基本機能の一つである注釈を使用すればテキストエディタとIDEがコードに対してより良い静的分析を遂行することができる。 
これは、より良いリファクタリングツール及び自動完了機能を使用し、コードを作成する間にミスを減らすことで生産性を高めることができることを意味する。

そのため、Angular 2 では、JavaScript よりTypeScript を主力としており、TypeScript を使うと多くの利点がある。

#####スクリプトではインタプリタ方式を使うが、人間が作成したコードをコンピュータが翻訳（コンパイル）なしにすぐに処理するのがインタプリタ方式である。

###文法
タイプスクリプトは変数宣言の際、letを使った高変数関数すべてが入るデータタイプをGenericのように指定しなければならない。
その中でJavaScriptでは見られなかった追加されたデータタイプがある。

tuple - 複数の資料型が可能である。 ORの意味と同じで、パイプを使ってString|Numberなど入れられるデータタイプを指定することができる。
enum - 列挙型またはデータタイプに使用 - データタイプのためのデータである。
any - すべてのデータタイプが可能。
void - リターンタイプがない関数である。
never - 特定の値が絶対に発生できないときに使用する。
javascriptとは？

##javaScriptとは？
JavaScriptを一言で要約すると、Webを豊かにしてくれる小さくて軽い言葉です。 アメリカのネットスケープコミュニケーションズ社(Netscape Communications)が開発したスクリプト言語で、 Web ブラウザで実行するスクリプト言語を記述します。 小さくて速いため、ウェブ文書を動的に飾るときに最も広く使われます。 言語規格はジャワの部分集合（subset）になっています。 ハイパーテキスト生成言語（HTML）文書を作成するレベルのユーザが使用することを主眼とし、ジャワの言語規格から変数の型（整数型や文字列型など）を省略したり、新しいクラス定義をできないようにしました。

スクリプトは、HTML 文書の中に直接記述し、<　script　> という荷札を使用します。 プログラミング入門者たちはジャワスクリプトとジャワが似た技術だと思ったりします。 2つの言語ともジャバラは言語を基盤としているからです。 しかしジャバスクリプトはジャバとは違う点が非常に多いです。 機能と使い方まで全く違います。

###特徴

1.JavaScriptはオブジェクト基盤の言語です。 しかし、相続とクラスという概念はありません。
2.JavaScriptはインタプリタ言語として、クライアントのWebブラウザによって解析され実行されます。
3. JavaScriptはHTML文書内に記述され、HTML文書と一緒に実行されます。
4.JavaScriptはHTMLに演算制御などプログラミング的な要素を追加し、クライアント資源を活用できます。

###可能なこと

1. HTMLページの変更及びHTMLエレメントとコンテンツの追加及び除去
2. CSS及びHTMLエレメントのスタイル変更
3. ユーザーとの相互作用、フォームの有効性の検証　
3. マウスとキーボードイベントに対するスクリプト実行
5. ウェブブラウザ制御、クッキーなどの設定と照会
6. AJAX技術を利用したウェブサーバーとの通信
6. 動的な効果 イメージ ロールオーバー 状態表示 行に文字列表示など
8. ウェブサイトの機能的な麺クッキー処理、新しいWindowを開くなど
コピペでpaddingとborderを幅(width)と高さ(height)に含める(CSS)

# コード
```css:paddingとborderを幅(width)と高さ(height)に含める.css
/* 「*　（アスタリスク）」はすべての要素にかかるセレクター */
*{
  /*paddingとborderを幅と高さに含める*/
  box-sizing: border-box;
}
```
これで完成！！！
【Salesforce】日付型項目へのURLハックによる初期値設定時に「Invalid Date format YYYY/MM/DD」が表示される 

#カスタムボタンを利用した新規登録画面への初期値設定
　Salesforceでは、関連リストから親レコードに紐づく形で子レコードを作成することができますが、
　カスタムボタン（URL）を利用することで、親レコードの情報を引き継いだり、動的な初期値を設定した状態で新規登録画面に遷移することができます。

　初期値設定時には、テキストや数値、参照項目など様々な項目の初期値設定を行うことができますが
　今回はその中でも「日付」項目についての注意点を記載します。

#日付型項目への初期値設定時の注意点
　下記にサンプルを用意しました。
　

```
/lightning/o/[作成する子レコードのAPI参照名]/new?recordTypeId=[作成する子レコードのレコードタイプID]
&defaultFieldValues=childDate__c={!Account.StartDate__c}　
```
　１行目はLEX環境にて初期値設定された新規登録画面を呼び出す際の一般的な記述です。
　２行目は子オブジェクトで管理している日付項目に対して、親オブジェクトの取引先を引き継ぐための記述です。

　※本来であれば子オブジェクトから親オブジェクトを参照する項目への値設定なども行いますが、
　　今回の説明には関係ないため割愛します。

　一見、問題がないように見えますがこのままだと、初期値設定後に保存を押下してもエラーになってしまいます。
　エラーの内容としては「「Invalid Date format YYYY/MM/DD」」
　
　なぜ発生するかというと・・・
　受け取る側ほしいフォーマット：YYYY-MM-DD
　渡している側のフォーマット　：YYYY/MM/DD

　これによって想定しているフォーマットではないとエラーが起きている状態です。

　解決するには「TEXT()」で囲うか「SUBSTITUTE(TEXT([対象の日付],'/','-'))」のような形で
　求められているフォーマットに変換する必要があります。

　上記を踏まえて修正したURLがこちらです。

```
/lightning/o/[作成する子レコードのAPI参照名]/new?recordTypeId=[作成する子レコードのレコードタイプID]
&defaultFieldValues=childDate__c={!TEXT(Account.StartDate__c)}　
```

　こちらのエラーですが、
　想定している項目への初期値の設定までは正常に行われており、保存するタイミングで形式に関するエラーが発生します。
　そのため新規登録画面に値がプリセットされていることのみ確認してしまうと保存時にエラーが発生することに気が付けません。
　初期値設定を行うボタンやアクションを作成する際は必ず保存まで確認することを推奨します。


#最後に

　Classicの時にはこれらの問題は起きていなかったと認識していますが、
　LEX環境になるにあたりURLハックの方法も変わっているため、項目の型も厳密に指定する必要が出来ていたのかもしれません。

　今回紹介は省きましたが「通貨型」同士の項目についても「ABS（）」関数を利用する必要があるなど
　初期値設定に関してはまだまだ継続して調査が必要そうです。

　何かの参考になれば幸いです。
【deep-learning系 アーキテクチャ作図に役立つリポジトリ3選】

# 【deep-learning系 アーキテクチャ作図に役立つリポジトリ3選】
パワポや論文でリッチなアーキテクチャ図を載せたい方必見のGitHubリポジトリを3つご紹介します。
良い面だけではなく使う際のデメリットも書いているので参考にしてみてください。


## 1. dl-visuals
ConvolutionからAttention機構まで様々な無料のフリー素材が並ぶ有名なリポジトリ
（※しかし作成者の著書の画像を公開しているだけなので編集できないのが欠点）
https://github.com/dvgodoy/dl-visuals

**Convolution**
![3channel_filters1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191313/6e6fa61a-db2a-daa5-1717-fea7c54da7f3.png)

**Transformer**
![full_transformer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191313/55516df4-16a0-f23a-72b3-19a7079451fc.png)


## 2. NN-SVG
ブラウザで使用可能でネットワークのパラメータをいじることで簡単にベクター形式のSVGファイルを出力可能
（※AlexNetと同じ図綺麗な図を出力してくれるがCNNまでしか対応していないので注意）
http://alexlenail.me/NN-SVG/LeNet.html

**ブラウザ上でオンラインで利用可能**
![スクリーンショット 2021-07-28 8.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191313/2304f116-df22-5689-fa8a-a3a47358a1d0.png)


## 3. PlotNeuralNet
フォーマットに従いPythonコードを書くと自動で作図されてtexとpdfのベクター形式で出力可能
（※この中で最も柔軟に編集可能だが簡単なコードを書く必要がある）
https://github.com/HarisIqbal88/PlotNeuralNet

**出力されるアーキテクチャ図のサンプル**
![50308846-c2231880-049c-11e9-8763-3daa1024de78.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191313/d8bb74c3-9074-fc39-8939-cb8dd3c4ca10.png)

**次の3ステップで作成可能**
![スクリーンショット 2021-07-28 8.38.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191313/ace5d2b7-eecb-ebe4-263a-3f0eb794d64f.png)




#### 参考：
海外の方もこちらで熱く議論されていました。
https://datascience.stackexchange.com/questions/14899/how-to-draw-deep-learning-network-architecture-diagrams