OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio 2022をUE4で利用してみる

2021/11 に Visual Studio 2022 がリリースされました。
UE4開発に安定して使えるか調べたものとなります。

https://qiita.com/uikou/items/d7addd98ede47ff41d6f

こちらにあるようにうまく使えればいろいろ 待ち時間が減ってくれます♪

- Visual Studio エディタ起動が速い
- 関数やクラスをクリックしてジャンプがサクッと表示される

※ コンパイルやリンカーの速度は変わらない気がします。

# 対応したこと
## Visual Studio 2022 のインストール
最終的には次のものをインストールしました (不要なものもあるかもしれません)

- ワークロード
    - C++によるゲーム開発
- 個別のコンポーネント に追加
    - .NET Framework 4.6.2 Targeting Pack
    - .NET Framework 4.8 SDK
    - .NET Framework 4.8 Targeting Pack

## エンジンのビルド
githubより取得したエンジン(2021/11時点最新の4.27.1)を利用して一部修正しています。
次のテキストファイルを修正しました (もっとよい方法あると思いますがここで手を打ちました)

- Engine/Source/Programs/IOS/iPhonePackager/iPhonePackager.csproj
- Engine/Source/Programs/IOS/MobileDeviceInterface/MobileDeviceInterface.csproj
- Engine/Source/Programs/IOS/DeploymentServer/DeploymentServer.csproj
    - TargetFrameworkVersion 4.6.2 の部分を 4.8に
- Engine/Build/BatchFiles/GetMSBuildPath.bat
    - 最初の方でvswhere の返り値が何も返ってこなかったためその前にMSBUILD_EXEを手動で指定させました

```
set MSBUILD_EXE="<インストールしたフォルダ>\Microsoft Visual Studio\2022\Msbuild\Current\Bin\MSBuld.exe"
goto Succeeded
```

- %appdata%/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml
    - デフォルトのVisual Studioを2022になるように追記

```
<VCProjectFileGenerator>
    <Version>VisualStudio2022</Version>
</VCProjectFileGenerator>
```

最後に エンジン及び関連プログラムをビルドしてエディタを起動します

```
> GenerateProjectFiles.bat -2022  
UE4.slnを開いて F5(ビルドして実行)
```

## プロジェクトでの利用

slnファイルをVisual Studio 2022で開いたとき各プロジェクト名のとなりに Visual Studio 2019などと表示されていなければ成功です。エディタビルド、パッケージビルドいずれも安定して動作できました。
【psql】ダンプ方法

<strong>テーブル定義を取得する</strong>
pg_dump -U postgres -d <テーブル名> -s > dev04.schema.dump

<strong>本番サーバーのデータのバックアップを取る</strong>
pg_dump -U postgres -d <テーブル名> -a > dev04.data.dump

<strong>バックアップしたい環境でコマンド入力</strong>
psql -U postgres -d <テーブル名(復元先)> -f C:\Users\kkura\<ディレクトリー>\dev04.data.dump

:::note info
テーブルとデータ両方同じ書き方でOK
:::

<strong>圧縮</strong>
tar -zcvf dev04.tar.gz <ファイルのディレクトリー>
<strong>解凍</strong>
tar -zxvf dev04.tar.gz

<strong>圧縮するフォルダーを除外する方法</strong>
tar -zcvf html.tag.gz <ファイルのディレクトリー> --exclude <除外するフォルダー>
tar -zcvf html.tag.gz /var/www/html --exclude webroot 

[外部サーバーからファイルのダウンロード方法](https://qiita.com/knt_krmt/private/08ee383f0262672d6626)
[ダンプのコマンド一覧](http://www.ajisaba.net/db/postgresql/dump.html)
PCG という乱数

# これは何？

[公式サイト(?)](https://www.pcg-random.org/) にある乱数について軽く調べた記事。

# 色々ある

[C++ 版の文書](https://www.pcg-random.org/using-pcg-cpp.html)を見ると、色々ありすぎてよくわからなくなる。

色々について真面目に読んだ。

## stream

乱数の系列のことだと思う。
メルセンヌ・ツイスタのような乱数は、1系列のとても長い数列があって、その数列の開始点を種で指定する感じ。

PCG の場合、系列がたくさんあって、開始点も自由に指定できる。この系列のことを stream と呼んでいるんだと思う。

## K-dimensionally equidistribute

乱数としてのばらつきの良さを表す指標のひとつ。K が大きいほど良いんだと思う。

たとえば出力する値が 32bit の場合。
32bit の値を K 個ずつまとめると 32×K ビットなので、出てくるパターンは $2^{32K}$ 通りある。K-dimensionally equidistribute は「乱数を一周させたらこの $2^{32K}$ 通りのパターンが同じ回数ずつ出るよ」という意味。
必然的に、乱数の周期は $2^{32K}$ の倍数になる。

例えばメルセンヌ・ツイスタの場合、623-dimensionally equidistribute。32K=19936 なので、二回ずつ出るということだと思う。

PCG の場合、K=2, 32, 64 の三種類と特に言及のないものが用意されている。
例えば `pcg32_k64` は、K=64。周期が $2^{2112}$。2112 は、32×64+64 なので、 $2^{64}$ 回ずつ出るということ。

もちろんこれは指標の一つに過ぎない。この一点をもって PCG より MT19937 が優れているということにはならない。

## oneseq

名前に `oneseq` が入っているものがある。ストリームが一個しかないという意味。

### fast

名前に `fast` が入っているものがある。名前のとおりちょっと速いらしい。
トレードオフとして、周期がちょっと短く、ストリームが一個しかなく、（全部じゃないかもしれないけど）ばらつきぐらあいがほんの少し悪いらしい。

### その他にも

その他にも `once` とか `insecure` とか `c` があるけど、ここでは省略。

# 私が使いそうなやつのリストアップ

下表の 2-DE とかは、 2-dimensionally equidistribute とかのこと。 

|名前|出力する値|特徴|周期|ストリーム数|
|:--|:--|:--|:--|:--|
|pcg32|32-bit||$2^{64}$|$2^{63}$|
|pcg32_oneseq|32-bit||$2^{64}$|$1$|
|pcg32_fast|32-bit||$2^{62}$|$1$|
|pcg64|64-bit||$2^{128}$|$2^{127}$|
|pcg64_oneseq|64-bit||$2^{128}$|$1$|
|pcg64_fast|64-bit||$2^{126}$|$1$|
|pcg32_k2|32-bit|2-DE|$2^{128}$|$2^{63}$|
|pcg32_k2_fast|32-bit|2-DE|$2^{128}$|$1$|
|pcg32_k64|32-bit|64-DE|$2^{2112}$|$2^{63}$|

前述の公式サイトには倍以上あるけど、私が使いそうなのは上記かな。

# 計算内容

前述の公式サイトにある「\*Really\* minimal PCG32 code」を見ると、乱数を一個発生させるためには 整数の乗算、ビット演算（AND、OR、XOR、シフト、ローテート）が必要。

乗算が 64bit のようなので、32bit 環境（マイコンとか）では遅いかも。

# ベンチマーク

軽い気持ちでいい加減なマイクロベンチマークしてみた。

0.1秒ぐらいまわして、1件作るのに要する時間にしてみたのが下図。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/bf490cf9-b79a-420e-837b-5d047d248bb7.png)

続いて 64bit 生成する人の時間を半分にしたのが下図。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/325873b4-19f1-d8bb-63d4-481e85460d19.png)

ばらつきの評価をしていないけど。
件数当たりなら `pcg32_fast` が速い。 
ビット数あたりなら `pcg64_fast` が速い。

`_fast` がつかないやつに限定すると。
件数当たりなら `xoshiro128++` が速い。 
ビット数あたりなら `pcg64_oneseq` が速い。

という事になった。

## 結局何を使うか

雑にチャート作った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/ef974545-c91a-9c7f-afd1-590a3d2a38f8.png)

まだ 32bit 環境で PCG を走らせていないので本当に 64bit 乗算の速さが効くのかどうか自信がないんだけど、暫定的にはこんな風に考えている。

もちろん、もっと長い周期が必要とかいろいろ個別の事情がある。そういう場合にはこういう雑なチャートを当てにせず、自分で考えるしかない。

# それと。

あと。
上記のリストに入ってないけど [64ビット最適均等分布F2-線形発生法](https://ja.wikipedia.org/wiki/64%E3%83%93%E3%83%83%E3%83%88%E6%9C%80%E9%81%A9%E5%9D%87%E7%AD%89%E5%88%86%E5%B8%83F2-%E7%B7%9A%E5%BD%A2%E7%99%BA%E7%94%9F%E6%B3%95) という RNG も気になる気になる。

以前書いた関連記事:

https://qiita.com/Nabetani/items/78f14d29e49dbc07945f
軽量ディストリ『Runtu』のススメ

# 理由
### ・軽量
とにかく、これに尽きる。
軽量ubuntuのディストリとして、Xubuntu,lubuntu等あるが、**それらを凌駕して軽い。**

#### 参考) lubuntuとの比較
状況は、共にインストール直前時、仮想マシン(KVM)にてvCPU4個、メモリ4G
計測は、xfce4-taskmanagerをインストールにて
##### runtu
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/f5a48361-7df7-a8ff-a95e-6a50a024a504.png)

##### lubuntu
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/180851d2-8aea-e638-2d82-95cc00fc9efd.png)
メモリ使用量が3%少ない。
### ・必要なアプリが一式揃っている。
それも、**最近のubuntuで惜しまれて消されたアプリまで**

# Runtuって何者？
**デスクトップ環境がOpenbox。**
ロシア製。
もう十年以上前から存在しているらしい。


# じゃあ欠点は？
・WakeOnLanができなかった（我が家のPCにおいて(aspier es1-132)。
↑コレ、同一設定でubuntu本家はできた。でも、使う？
・runtu独自の設定ツール(プリンタードライバ・LibreOfficeインストールツール)がロシア語表記
↑ただし、ディストリで親切に設定してくれている箇所であり、また、Enterを押すだけの箇所ではあるので、欠点というほどのことはない）

# と、いうワケで、runtuのインストールの仕方
基本的に[こちら](https://lovely910.com/2020/10/06/2020-10-%E8%BB%BD%E9%87%8F%E3%81%AAruntu-lite-20-04%E3%82%92%E3%80%81core2duo%E6%90%AD%E8%BC%89%E3%81%AEpanasonic-lets-note-cf-r6%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)を元にしていけばOKだが、以下二点の補足。
・インストール時の文字化け対策
・日本語入力設定
##### ・インストール時の文字化け対策
日本語フォントの/usr/share/fonts直下へのコピーは必須
筆者はそのため、マウス操作で
→ホームディレクトリ直下に.fontsフォルダを作成
→デフォルトだと隠しフォルダが表示されないのでctrl+hでそのフォルダを表示
→フォントをコピー
(以下、参考図)
![範囲を選択_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/054e142c-cc31-5a45-f62c-31e2d495dfbe.png)

次に、/usr/share/fontsへコピーするのだが、ルート権限なしにはできないので、左下のターミナルを開き、下記コマンドでファイルマネージャーをルートで開く

```
sudo pcmmanfm
```

あとは、以前作成した.fontsフォルダの中身を/usr/share/fontsの中身へマウス操作でコピーしてOK(uuid以外)
(以下、参考図)
![範囲を選択_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/7d98ebce-79df-024c-ae52-7de350a8519c.png)

##### ・日本語入力設定
下記さえ、済めば、**日本人向けにオープンなLinuxが。**
まず、キーボードを日本語設定にする
→画面右下の国旗マークを右クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/1f96a1a2-c5a3-aac9-aea4-c3cb32ec7c63.png)
出てくるボックスの中より"Keyboard Layout Hnadler"" Settingsを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/30a83fc3-baa7-6721-9e73-164ded3ffdaa.png)
追加ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/02c04b85-58ff-c352-002d-065bf17fa611.png)
日本語を選択してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/ebac8239-36ce-00bf-9530-8cf3b7b8df92.png)
元のboxに戻ったら、usやruを選択して削除（使わないので）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/d19de4ac-976e-6e82-4fde-06f0fc34a12c.png)
これで、キーボードが日本語設定になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284147/6d194e82-e0c2-98b8-3a5a-17bfcd1d5629.png)

次にfcitxで日本語入力できるようにする
まず、下記コマンドでfcitx関連の必要なモジュールをインストール
途中なにか聞かれた際には、Enterで
※アップデートやアップグレードでそれなりに待つ

```
sudo apt update -y && sudo apt upgrade -y
sudo apt install -y  fcitx fcitx-mozc fcitx-config-gtk im-config
```
これで、ログアウトか、再起動すれば日本語入力OKに。

# 総括
**軽量でありながら、必要なアプリは一式取り揃えている驚異のOS**であった。
我が家では低スペックPCや母艦相当に導入しており、問題なく稼働している。

関係ないが、この軽さと機能性に触発されて、筆者は**Open Linuxこと、[Ubuntu超軽量化プログラムを作ってしまった](https://docs.google.com/document/d/1poKaJAAzqccWVkKZRAcX3TS14oHL5UqyVYRpYEIFvfs/edit)**
Dr.Sum Connect(DataSpider Servista)実行時、動きが遅く→エラー(Metaspace)発生

Dr.Sum Connect(DataSpider Servista)のStudio、最近なんだか動作が重たくて、特別メモリを食ってそうな処理があるスクリプトを実行するとMetaspaceというエラーを出すようになりました。

ググりましたらオフィシャルに情報ありました。
設定値（MaxMetaspaceSize）の変更で改善します。
初期値128Mなので、まずは256Mにして様子見･･･がいいと思うよ。
:point_up:ふさわしい設定値はそれぞれの環境で考える必要があります！

-----
Java のメモリ領域のうち、DataSpider のスクリプトの情報、クラスなど、各種処理の実行に必要なモジュールが格納されている領域が不足した場合に発生します。

https://faq2.hulft.com/faq/show/21334?site_domain=default

参考
https://moznion.hatenadiary.com/entry/2016/03/11/121343
VSCodeでVue.jsの環境構築をしてみました 

## はじめに
1ヶ月間ほどVue.jsを使い、
ポートフォリオとなるものを制作していました。
今まではVSCodeでVue.jsのCDNを使っていました。
この度,Vue.jsの開発環境を整えてみようと思い、
恐る恐るやってみました。


こちらを参考にしました。
> [Vue.js開発環境構築手順](https://note.com/taihong/n/n9e49b587a6f8)





## 手順１
まず
`Node.jsがインストールされているか`
確認をしました。
npm --versionでインストールされているか？の確認をします。
VSCodeのターミナルを開き、

```
npm -version
7.24.0
```
インストールの確認が取れました。

## 手順２
`Vue CLIをインストール`します。
npmコマンドでCLIをインストールします。

```
npm install -g @vue/cli
```


## 手順３
`Vue cli-service-globalをインストール`します。
Vueを動かすためのサーバです。

```
npm install -g @vue/cli-service-global
```

手順２、３は処理に少し時間がかかりましたが、待っていれば終わりました。
WARN deprecatedという文がどちらも何行か出てきました。

## 手順４
`Visual Studio Codeの設定`をします。

`vue`,`ESLint`をインストールしました。


## 手順5
ターミナルで

```
vue ui
```

ブラウザが自動で立ち上がります。
結構嬉しかったです。
【Rails】lib配下にクラスを自作し読み込む方法

##環境
Ruby 3.0.2
Rails 6.1.4.1

rakeタスク内のメソッドをクラスに切り出してリファクタリングしたいときに使える。



```lib/tasks/XXXXXX.rake
namespace :XXXXXX do
  task hogehoge: :environment do
    hogehoge = Hogehoge.new
  end
end
```

```lib/hogehoge.rb
class Hogehoge
  def hugahuga
    ...
  end
end
```
##設定方法

```config/application.rb
module Futurama
  class Application < Rails::Application
    ...
    config.paths.add 'lib', eager_load: true
  end
end
```

##参考

https://qiita.com/mk_0409/items/e930945a0c505ccbac9b
[AWS]サーバーで障害が起きた時に自動的にソーリー画面へ切り替える

サーバーで障害が起きた時に、自動的にソーリー画面へ切り替えてくれる機能の紹介です。
AWSのDNSサービスであるRoute53で、フェイルオーバーの機能を利用します。

![route53-alb-s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/6b4a55ad-0959-23bf-24ae-d67d1d7b6b22.png)
画像引用元：https://xp-cloud.jp/blog/2017/08/25/1834/

簡単に設定方法を説明すると、

1. S3にドメイン名と同じ名前のバケットを作成し、静的Webサイトホスティング設定を行う
2. S3へメンテナンスページ(index.html)を配置する
3. Route53で既存のAレコードの種別をフェイルオーバーのプライマリに変更する
4. Route53で同名のAレコードを作成して、種別をフェイルオーバーのセカンダリ、行き先をS3のエンドポイントにする

詳細な設定方法は以下。

https://xp-cloud.jp/blog/2017/08/25/1834/

## 確認

検証方法は、ELBのターゲットグループに何もインスタンスを登録しないと503エラーが返ってくるのでそれを利用します。

何も設定してないと障害時にこんな感じの味気ない画面が表示されますが、
![スクリーンショット 2021-11-15 16.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/9ba8d068-dc2d-f3e8-312f-eaa4c1228de9.png)

上記を設定すると、S3へ格納したメンテナンスページをユーザに表示してくれるようになります。
![スクリーンショット 2021-11-15 16.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/24abc306-780a-e9cb-cf3f-363f5507767e.png)

ちょっと嬉しい。
おしまい。
プログラミング基礎用語　〜まとめ〜

・MVC...
＊　M = Model,V = View,C = Controllerを示している。

MVCモデルによる処理の流れとしては、Webブラウザから送信されたリクエストがまずControllerに行き、ControllerはリクエストからParamaterを取り出して必要であればSessionからの情報の取り出しも行います。そして、入力情報を処理するモデルを呼び出して、その際にParamaterをModelに渡します。Modelは受け取ったParamaterを頼りに処理を行い、その結果(処理が成功できたかどうかを知らせる)をControllerに返します。Controllerは受け取った情報をViewに渡し、ViewはModelの情報を参照しながらHTMLでHTTPレスポンスとして画面にリクエスト結果を表示します。

・MVCフレームワークのメリット、デメリット...

(メリット)
・コードの管理がしやすい - 
MVCとして各々の業務が分かれていることで、viewにエラーが出た場合にviewファイルを修正し、controllerやmodelはほとんど修正しなくてもエラーが解決したりする。

・理解しやすい　- 
機能別にファイルがわかれているため、シンプルな構造でわかりやすい。

（デメリット）
・オブジェクトを分けるためコードの記述に時間がかかる - 
そしてコードを分類するときにどこに書いたらいいのか微妙なラインのコードが発生する。そしてコードをごとの役割を考える必要もあるため開発工数が増えたりもする。

・Framework (フレームワーク)　例: rails,Lalavel,Django等...

ソフトウェアの共通している部分を作り出してくれるもの。例えば車で言えば四つのタイヤで走るというのは共通していることなので、一から車輪の部分を作らなくても、共通した車輪にその車種ごとに必要なパーツを組み合わせていけば、作れるのと同じ様にソフトウェアでも同じ考え方で作られていく。

・CRUD...
＊　C = Create,R = Read,U = Update,D = Deleteを示している。
コンピューターソフトウェアが持つ基本的な機能の総称。


・HTTP・Webページが表示されるまでの流れ...

ブラウザにURLが打ち込まれると、そのURLがDNSサーバでどのIPアドレスを要求しているのかを調べます（名前解決）。そしてIPアドレスが特定されるとWebサーバとクライアントが通信し、WebサーバがHTMLとしてリクエストを画面に出力します。

・AWSとは...
Amazon Web Serviceの略でAmazonが提供するクラウド型Webサービスの総称。
その中のサービスの一つのEC２はクラウド上にサーバを用意でき、オンプレミス（自社にサーバを置かない）じゃなくてもWebサービスを運営できるようになります

・アジャイル開発の利点とは - 
機能ごとに作っていくことでリリースが早くできる。そして顧客のニーズを受けて柔軟に機能を追加したり、サービスを修正したりできる。
デメリットとしては設計にかかる時間を想定しづらいこと。

・DBの正規化とは　- 
DBの重複がないようにシンプルにすること
正規化することでデータの変更が楽になったり、エラーの発生を防ぐことができる

・SQLとは
SQLはデータベース言語といい、DBを操作するための言語。ちなみにSQLは国際標準化されているためMYSQLやPostgreSQLなどでも使える。

・SQLの基本構文とは
select(データの選択)
insert(データの挿入)
update(データの更新)
delete(データの削除)

・ログイン、ログアウトの仕組みとは
ログインはユーザー情報（emailやパスワード）が送信されたときに、送信されたデータがない場合はログイン失敗メッセージを出し、データがDBの中にあった場合はユーザーの情報をセッションに保存し、画面が切り替わるごとにセッションに情報が保存されているか確認します。ログアウトは保存されたセッション情報を削除してログイン画面に遷移させます。

・CookieとSessionの違いとは
Sessionは操作をせずに放っておくと自動的にセッション情報が破棄されてしまうため仕組み的にログインをずっとしたままにすることはできません。ただ、Cookieというユーザーのブラウザの中に小さな情報を保存しておける機能で、その問題を解決することができます。
ログイン画面の下によくある次回から自動でログインするというところにチェックを付け、ログインするとトークンというランダムな文字列を発行し、それをユーザーのブラウザのCookieに保存してくれます。そしてDBのユーザー情報にも同じトークンを保存してくれます。（ただしトークンにはセキュリティを考慮して有効期限がある）
次にユーザーがログインしてきたときにブラウザのCookieにトークンがあるか確認し、トークンがあった場合DBと照らし合わせ、一致していればログインの行程を省くことができます。ただログアウトした場合、Cookieのトークンも消えます。


・Rubyのincludeとは - 
moduleをクラス内で呼ぶことができるもの

・DBのトランザクションとは
DBのトランザクションとはDBに対して行われる処理のこと。
DBを操作するときにデータの整合性を保つためにはトランザクション管理が重要。トランザクション管理とSQL文を１セットとして扱い、正常にテーブルが更新できた場合は変更の確定（commit）し、以上が出た場合はやり直す（rollback）こと。


・Cookie...
ブラウザにユーザーのトークンを一定期間の間、保存できる仕組み

・Session...
ユーザーがWebサイトにいる間に行う挙動のセット。通信の開始から終わりまでを表す言葉。

・オブジェクト指向...
変数とメソッドをまとめて開発すること…？（ちょっと理解が怪しい）
APEXのRedwoodのAcent一覧

<h1>はじめに</h1>
Apexで少しいつもと違ったAccentにしようと思ったときに一覧が見当たらなくて不便だなぁとおもっていたので一覧を作成しました。手間が少し省けるかと思ったのでこちらに。

Version：21.1.6
Theme  ：Redwood Light

<h1>Accent一覧</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681023/537a331e-01c4-06fd-aa86-5d8b4bb67646.png)
torchvision.datasetsのtransform引数でのデータ拡張に疑問を抱いた話

#疑問点
torchvisionライブラリにはデータセットを読み込む関数が用意されていて，transformという引数を指定することで簡単にデータ拡張が行える．以下はcifar-10のデータセットを読み込む関数．

```make_datasets.py
import torchvision
torchvision.datasets.CIFAR10(root, train, transform, target_transform, download)
```

しかし，データ拡張と言ってもデータローダーに渡されるデータ数は増えない．勘違いも相まって地味にここで30分くらい悩んだ．

#今のところの理解
（ライブラリのコードを読んで解釈しているだけなので間違えているかもしれません．よろしくお願いします．）

torchvision.datasets.CIFAR10()の中身を読んでみると，&#095;&#095;getitem__()の内部でtransform関数を呼び出していた．

どうやら，初期化時点でデータ拡張をしてデータ数を水増ししている訳ではなく，データローダーからデータを取り出す時にデータがtransformされて与えられるということらしい．

つまり，データ拡張といっても，
__1epochで学習する画像枚数は変わらず，各epochでデータローダーが渡してくるデータがtransformされているだけ__
のようである．
（~~データ拡張とかいう名称がややこしくしている気がする~~）

データ数を水増しして，そのデータで単に学習を回すと思っていましたが，各epochでは同じ画像からtransformされた画像は使わないみたいですね．
Shield AdvancedのSNS通知設定で気づいたこと

# これはなに
最近、業務でShield Advancedを入れているのでその中でSNS通知設定に関して気づいたことを書こうと思います。

ShieldAdvancedの構築方法についてはこちらの記事を参考にしました。
https://oji-cloud.net/2021/06/29/post-6379/

## SNS設定
・Shield Advancedを設定するにあたり、保護リソースの設定で**DDoS検出時**と**Rate limit超過時**にSNSTopicで
　通知を飛ばすことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/500eb4c0-69e7-b7b6-78b6-c8d3c3ee699f.png)


ここで1つ考慮できてなかったことがありました。
terraformで作成したはずのSNSが選択肢に出てきませんでした。

この時何となく察しがついたのですが、**SNSは各リソースと同じリージョンに作成する必要があります。**
<br/>
・次にSNS設定後に思ったのですが、下記画像の通りどのSNSが設定されているか分からない。。。
　[**Alarm(s) already configured**]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/8ea60be9-7b69-8272-4f15-fd7257058cef.png)

<br/>
<br/>
・一応、CloudWatchAlarmの画面で確認できる事は分かった。（他にいい方法があったら教えてください。）
　あくまでProtect resourceに紐づいているのはAlarmだからShieldの画面には出てこないのかな。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/27a48c17-bcf9-8039-637a-ec86a48c4fb6.png)




・間違ってSNSを設定してしまったことを考えて、設定変更できるかShieldのコンソール確認するも見つからず。
　CloudWatchAlarm側で通知先を変更すれば一応変更可能だと思う。


## 最後に
・中々、検証が難しかったり調べても古いコンソール画面とか情報量が少ないので少しでも役に立てばと思います。
toC webサービス事業の顧客信頼性エンジニアリング(CRE)について考える



## 前書き
* 顧客信頼性エンジニア≠顧客信頼性エンジニアリング
* 「ロール」ではなく「エンジニアリング=工学」を考えたい
* webサービス事業の文脈なのでエンジニアリング=ソフトウェアエンジニアが中心に関わる方法論です

## 「工学」に自分が期待すること
特定の課題領域に対して、

* 体系立てられた知識
* 事象の計測・評価方法
* 適切な抽象化によって一定の再現性がある改善や課題解決へのアプローチ手段

を提供してくれること。
（あくまで「期待」であって、言葉の定義としての正しさではない）

## CREの課題領域は何なのか？(why)
サブスクリプション型ビジネスにおけるLTV最適化の文脈で、

* 顧客がサービスに対して持ちうる「サービスの継続利用を阻害する不安」をどのように評価し、どうそれを小さくするか

もしくは、

* サービスをより長く継続利用してもらうために「サービスへの不安を感じない=信頼性が高い」状態をどう実現し、どう継続するか

またメタな課題として、

* 上記課題にソフトウェアエンジニアがどう寄与していくか

と考えた。

## toC であって toB でない理由

* [Google Cloud Platform Japan 公式ブログ_ Google の新しい専門職 _ CRE が必要な理由](https://cloudplatform-jp.googleblog.com/2016/10/google-cre.html)
* [〇〇社用みたいなコードは生み出さないように　はてなCREがユーザーからの要望ではなく背景を大事にする理由 - ログミーTech](https://logmi.jp/tech/articles/325287)

toB の事例ではエンジニアがカスタマーサクセスの振る舞いを行う合理性が十分に説明されていると感じている。
toC の良い事例が見つけられていないので、思考整理を兼ねて書いています。

## CREが取組むべき事柄(what)

自分が現在所属しているチームで顧客不安観点で意識していること、および取り組みたいことを列挙してみた。

* カスタマーサポート領域
    * テクニカルサポート
    * サポート周りの運用改善
    * プロダクト不備の特定とサービス改善
* アプリケーションセキュリティ
    * 脆弱性の検知と除去
    * 最新追従を実現する開発手法
* アプリケーションパフォーマンス
    * Latency遅延エンドポイントの特定と改善
    * Latency不安定なエンドポイントの特定と安定化
* UI・UX毀損の予防、局所化、検知、改善
    * E2E自動テスト
    * 段階的リリースと安全なロールバックの実現
    * エラー検知と改善
    * フロントエンドパフォーマンスの計測、評価、改善

## どのように取組むか(how)

具体的なツールや技術要素、求められる振る舞いなどを列挙してみた。

* テクニカルサポート
    * BigQuery・Redashを活用したデータベースレコードやアクセスログの確認、分析
    * プロダクトの仕様とアプリケーション挙動を理解した上での非エンジニアとのコミュニケーション
* サポート周りの運用改善
    * ZendeskやSlackなど外部ツールも含めた運用設計
    * 問い合わせ業務の分析と内製調査ツールの開発運用
* プロダクト不備の特定とサービス改善
    * 問い合わせ内容の咀嚼と顧客要望の抽出
    * プロダクトバックログ起票とプロダクトチームとのコミュニケーション
    * アプリケーション改修
* 脆弱性の検知と除去
    * 脆弱性診断の実施
    * Dependabot Security Updates の定期的なチェック
    * アプリケーション改修
* 最新追従を実現する開発手法
    * Renovate、Dependabotの依存関係更新ツールの活用
    * Unitテスト:PHPUnit, RSpec、E2Eテスト:Cypress, Autify の自動テスト整備
* Latency遅延・不安定エンドポイントの特定と改善
    * Datadog モニタリングツールの活用
    * アプリケーション改修
* E2E自動テスト
    * 網羅的なユースケース整備
    * Cypress, Autify によるユースケーステストの実施
* 段階的リリースと安全なロールバックの実現
    * ECS + CodeDeploy による Blue/Green デプロイメント
    * カナリアリリース
* エラー検知と改善
    * Sentry によるモニタリングとIssueトリアージ
    * アプリケーション改修
* フロントエンドパフォーマンスの計測、評価、改善
    * Sentry Performance
    * アプリケーション改修
    * 仕様からの抜本改善の提案

## 通常のWebサービス開発運用で普通にやっていくべきことでは？

それは本当にそう。

改めて現時点の見解でCREを表現するならば、

「ソフトウェアエンジニアリングの観点かつ顧客指向で課題発見・課題定義を行い、Webサービス開発運用の全てのライフサイクルで継続的改善に取り組みビジネスへ寄与するための方法論」

と個人的には考えています。そして「全てのライフサイクルで」と書きましたが、これはもうフルサイクル開発者の話を意識しました。

* [Netflixにおけるフルサイクル開発者―開発したものが運用する - VOYAGE GROUP techlog](https://techlog.voyagegroup.com/entry/2019/02/04/171325)

Support = CRE？と短絡的に考えてしまいがちだけど、顧客指向で課題定義すれば Operate, Deploy, Test のライフサイクルでも CRE としてのアクションアイテムがありそうという考えを持ちました。アンドパッド社ではCREチームにQAを内包しているのは興味深い事例だと捉えています。

* [アンドパッドのCREチームを紹介します！ - ANDPAD Tech Blog](https://tech.andpad.co.jp/entry/2020/11/30/120000)

## 他組織の事例を知りたい

今ここで書いてある内容は私という1エンジニアの1事業における経験則であって、事業の形や規模・フェーズで様々なCREが定義できそう。他事業ではどうCREが定義されるかがものすごく興味があります。そこらへんのお話できる方がいらっしゃればぜひお話したいなと思います。
FileMakerでのログ管理、無限undo、redoシステム

# はじめに
FileMakerでログ管理と無限undo、redoを実現するためのFileMakerカスタムAppを作成し、[FM-1グランプリ](https://www.fm-1gp.com/post/no-33-fmdb-blue)に投稿しました。予選は通過しましたが、投稿後の改修について公開するために、この記事を作成しました。もし、要望があれば、Appの使い方、App内容の説明なども記事にしたいと思います。

# カスタムAppの概要
FMDBｰblueは、既存のデータベースに組み込んで、オブジェクトフィールドを含むフィールドの編集、レコードの作成、削除についてログ管理を行い、無限undo、redo機能を実現するものです。サンプルファイルを同包しておりますので、サンプルファイルから開いていただき、実際の動作を確認いただければと思います。FMDBｰblueファイルから開いても、すぐにサンプルファイルを開けるようになっています。FMPネイティブでプラグイン、アドオン等は使用していません（というか使いこなせる技術がありません）。FMDB-blue１つで、多くのデータベースのログを同時管理できます。既存データベースへの組み込みは、３つのステップで導入できます（サンプルファイルへの組み込みを解除する必要はありません）。詳細は、FMDB-blueの「使い方」に記載されていますので、ご参照ください。

# FM-1グランプリ投稿版からの改修
- 使い方の「次回起動時に表示しない」チェックが、ファイル単位で記録されていたものを、ファイルを起動した端末単位で記録されるようにしました。  
- 使い方のページめくりをアニメーション化。
- [@qbxxdpさんのツイート](https://twitter.com/qbxxdp/status/1400387739627888649)を読んで色やアイコンが切り替わるボタンの実装をボタンバーに変更しました（動作上の変更はありません）。
  - [@p388cellさんの五輪マークをアニメーションさせている](https://twitter.com/p388cell/status/1418711329775312899)のは仕組みが分かりません。
- [FM-1グランプリの審査で指摘されている使い方の記載ミス](https://www.fm-1gp.com/post/no-33-fmdb-blue)を修正。ちなみに該当のキーフィールドは、グローバルフィールドに変更。グローバルフィールドになっていないと、FileMaker Serverで共有して、同時使用した場合に不具合がでる可能性に気づきました。
  - もともとグローバルフィールドにするとパフォーマンスが落ちると思っていましたが、再度検証してみて、グローバルフィールにしてもパフォーマンスが変わらないことを確認したので、この変更を行いました。
  - パフォーマンス向上のため、「サーバー上のスクリプト実行」を活用しようと試行錯誤していたのも、グローバルフィールドにしていなかった理由なのですが、「サーバー上のスクリプト実行」を活用するには、その利点を上回るオーバーヘッドが必要になると想定されたため、断念しています。

# ダウンロード
GitHubからダウンロードできます。
<a href="https://github.com/siebenunddreissig/FMDB-blue"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/siebenunddreissig/FMDB-blue.png" width="460px"></a>

# 更新履歴
- version 1.2 (2021/11/08)  
  - 共有して使用した場合の動作に最適化しました。
- version 1.1 (2021/10/27)  
  - ネットワークアクセスのための拡張アクセス権を修正しました。
- version 1.0 (2021/10/01)  
  - FM-1グランプリ投稿初版。
管理者権限がない環境（Windows）でPythonを導入する方法

# 経緯
(2021/11/15時点)
必要最低限の事務PCしかない状況で、pythonで業務の効率化などを進めたいと思い、試したものを以下にまとめる。模索して出来たことを記載していきます。
前提として、使用できるHDD容量が多くあると良い。例えば、事務PC以外にファイルサーバが与えられていること。

# 目次
1. WinPythonをインストール
1. pythonが使えるか確認
1. pipのアップデート
1. 例として、openpyxlのインストール

# 詳細
## 1.WinPythonをインストール

1. [WinPythonのページ](https://winpython.github.io/)にアクセスする。
1.  今回は3.9.5.0をダウンロードするため、3.9.5.0近くに記載されている以下のSourceForgeをクリックする。  
 「WinPython 3.9 Downloads (**) via SourceForge and Github」
1. 場合に応じて、以下のどちらかをダウンロードする。  
    - 「Winpython64-3.9.5.0.exe」：フルパッケージ(PyQt5やSpyder、パッケージなどを含めて)を入れたい場合はこちらをダウンロードする。容量が大きいため、ダウンロードや解凍に時間がかかるため、注意。
    - 「Winpython64-3.9.5.0dot.exe」：最低限(ポータブル版)で入れたい場合はこちらをダウンロードする。容量が小さい。

## 2.pythonが使えるか確認
Powershellを使用して、以下のコマンドを実行し、Pythonが動くかどうか確認する。

```PowerShell:コマンド
.\WPy64-3950\python-3.9.5.amd64\python.exe --version
```

```PowerShell:出力結果
Python 3.9.5
```

## 3.pipのアップデート
必要に応じて、コマンドの<プロキシ>をプロキシURLに置き換えてコマンド実行をしてください。
また、タイムアウトになる場合は`--default-timeout=1000`の時間を増やしてください。
`--trusted-host`は参考1を参照してください。

````PowerShell:コマンド
.\WPy64-3950\python-3.9.5.amd64\python.exe -m pip install --upgrade pip --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org --proxy=<プロキシURL>
```

## 4.例として、openpyxlのインストール
今回、例として、openpyxlをインストールしたが、openpyxlを必要なパッケージに変えてインストールする。

````PowerShell:コマンド
.\WPy64-3950\python-3.9.5.amd64\python.exe -m pip install openpyxl --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org --proxy=<プロキシURL>
```

あとは、pythonでコードを書いて好きに実行していろいろ試してみましょう。

# 参考
1. [WindowsでPIP Install するとSSLエラーになるのを解消する。](https://qiita.com/kekosh/items/e96e822bf9cb6ca1aff8)
FileMakerのスクリプトパフォーマンスチェッカー

# はじめに
FileMakerのスクリプトのパフォーマンスを計測するためのFileMakerカスタムAppを作成し、[FM-1グランプリ](https://www.fm-1gp.com/post/no-34-fm-sc-script-chronograph)に投稿しました。予選は通過しましたが、投稿後の改修について公開するために、この記事を作成しました。もし、要望があれば、Appの使い方、App内容の説明なども記事にしたいと思います。

# カスタムAppの概要
FileMaker - Script Chronograph（FM-SC）は、ファイルメーカーのカスタムApp開発時に、スクリプトのパフォーマンスをチェックするためのスクリプト実行時間計測システムです。計測したデータはデータベースとして保存できるので、同じスクリプトで違う環境下の比較をすることも可能です。統計値として、平均値、不偏標準偏差を表示していますが、rawデータも保持しているので、データをエクスポートしてExcelなどで解析させることも可能です。

# FM-1グランプリ投稿版からの改修
- 使い方の「次回起動時に表示しない」チェックが、ファイル単位で記録されていたものを、ファイルを起動した端末単位で記録されるようにしました。  
- 使い方のページめくりをアニメーション化。
- 計測されるスクリプトの引数として、1からcycle数までをカウントする自然数を設定しました。
  - 引数がない場合と比べて、わずかにベースの負荷があがりました。1000cycleで1msecほど。
  - やっぱり使っていると、これあった方がよいな、と思うことが多々ありますね。
- スクリプトの選択で、スクリプトワークスペースで表示されている順で表示されるようにしました。
  - fm-aid.comの[動的値一覧のソート](https://fm-aid.com/bbs2/viewtopic.php?id=1145)を参考にしました。
  - ゼロ幅スペース文字の文字数でソートさせる上記の方法だと、100個を超える値一覧では想定通りに並ばないため、fm-aid.comの[値一覧の表示がおかしくなる](https://fm-aid.com/bbs2/viewtopic.php?id=4642)を参考に、次のようなカスタム関数を作成しました。ゼロ幅文字を使った10進数表記ができるので、実質的な限界なし。右から左に記載する言語では使用できません。
  - スクリプトを100個ぐらい作る可能性があるなぁ、と思って作成したのですが、作った後に、実際に100個もスクリプトを作るヒトもいないかな？とも思いました。

```
ConvertToZeroWidthFrom( %sortingNumber )

// Purpose
//   値一覧のソート用に番号を見えなくする。
// Parameter
//   %sortingNumber = ソート順を示す数値。
// Notes
//   数値は、最大桁数で左桁数をゼロ埋めしておく必要がある。

Substitute ( %sortingNumber;
  [ 0; Char ( 8203 ) ]; // ZERO WIDTH SPACE
  [ 1; Char ( 8204 ) ]; // ZERO WIDTH NON-JOINER
  [ 2; Char ( 8205 ) ]; // ZERO WIDTH JOINER
  [ 3; Char ( 8206 ) ]; // LEFT-TO-RIGHT MARK
  [ 4; Char ( 8234 ) ]; // LEFT-TO-RIGHT EMBEDDING
  [ 5; Char ( 8237 ) ]; // LEFT-TO-RIGHT OVERRIDE
  [ 6; Char ( 8289 ) ]; // FUNCTION APPLICATION
  [ 7; Char ( 8290 ) ]; // INVISIBLE TIMES
  [ 8; Char ( 8291 ) ]; // INVISIBLE SEPARATOR
  [ 9; Char ( 8292 ) ]  // INVISIBLE PLUS
)
```

# ダウンロード
GitHubからダウンロードできます。
<a href="https://github.com/siebenunddreissig/FM-SC"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/siebenunddreissig/FM-SC.png" width="460px"></a>

# 更新履歴
- version 1.4 (2021/11/08)
  - 共有して使用した場合の動作に最適化しました。
- version 1.3 (2021/10/27)
  - 計測中にプログレスバーを表示させるようにしました。
- version 1.2 (2021/10/06)
  - サーバー上とクライアントでスクリプトを実行させて比較できるようにしました。
  - グラフでの比較ができるようにしました。
  - 母集団としての標準偏差から不偏標準偏差（不偏分散の平方根）に変更しました。
  - 「3条項BSDライセンス」の表示をしました。　　
- version 1.1 (2021/09/24)
  - 多言語サポートを導入しました。
  - カスタムメニューを見直しました。
- version 1.0 (2021/08/23)
  - FM-1グランプリ初投稿版。
IBMCloud ポータルログインMFA小ネタ

###MFAを有効にするには？
MFAを有効にするには、アカウント管理サービスのアカウント所有者または管理者である必要がある。
https://cloud.ibm.com/docs/account?topic=account-enablemfa#enabling

###1人のユーザーのMFA認証トークン搭載デバイスとして、複数のデバイス（TOTPとU2F）を指定できるか？
潜在的なセキュリティリスクになるため、サポートされていない

###TOTP/U2Fデバイスを紛失した場合はどうすればいい？
ライブチャットやケースを作成することでロックを解除することができる。

###ユーザ毎にTOTPやU2Fといったどの認証を利用するか選択できるか？
管理者が認証方法として「TOTP MFA」を選択した場合、より高度なセキュリティ要求である「U2F MFA」であれば、ユーザーごとに選択して使用することができる。

<セキュリティレベルの低いものから高いもの順>
-メールベースMFA
-TOTP MFA
-U2F MFA
Web業界2年目のWebリテラシー試験合格記

##この記事について
ちょっとした備忘録。
Webリテラシー試験を受ける人に少しでもハードルを下げるために書きます。

##私のスペック
専門卒。社会人2年目。専門学校ではwebデザインを学ぶ。
Web系だと他にWebライティング能力検定2級、Webクリエイター能力認定試験スタンダード持ち。IT系に広げると基本情報技術者試験、セキュリティマネジメント試験も合格。

##勉強内容・時間
- 公式テキスト読破　のみ！！！

1年前ぐらいに公式テキスト読破＆公式問題集も解いていたのと、実際に身を置いている業界なので公式テキストを1巡するのみでした。

##実際受験してみて
試験時間1時間半を30分くらいで解いて合格しました。
内訳としては、以下の通りです。

- 総合スコア**80.0%**（合格総合スコアは70.0%）
- セクション別正答率
    - Webの基礎知識 **83.3%**
    - インターネットビジネス **53.3%**
    - プロジェクトマネジメント **80.0%**
    - Webサイトの企画・設計 **86.6%**
    - 制作（デザイン・実装）**88.8%**
    - 集客施策 **81.8%**

著しくインターネットビジネスが悪かったので、総合スコアが思ったより悪かった印象です。それ以外は見直しもなしで割と取れたほうではないかなと思っています。
現在Web業界にいる人は、自分が普段の業務でやっていること（私だったら制作）は勉強していなくてもある程度は取れると思います。しかし逆に、やっていないところはガクッと点が下がる可能性が高いのでそこを重点的に勉強すべきだと感じました。
問題数は85問と多いですが、基礎的なことを問われるので時間が足りないことはないと思います。

##終わりに
Web系の検定取ってない！何か一つは持ちたい！！っていう人におすすめの検定です。
受験料が税込み11,000円と高額なので、コスパ的には微妙ですが取っ掛かりにはなります。この記事を読んで少しでも力になれれば幸いです。

##リンク
- Webリテラシーについて（https://webken.jp/literacy/）
- 公式テキスト（https://wgn-obs.shop-pro.jp/?pid=139456180）
format()を使った文字の表示位置と幅指定

Pythonのformat()を使って文字の表示位置と幅指定を行ったのでまとめておく。

# format()の使い方
format()を使用することで文字列内に変数を埋め込むことができる。例として以下のように書ける。

```python:
name = 'リョウタ'
age = 20
print('名前は{0}、年齢は{1}です。'.format(name,age)) 
# 出力結果：「名前はリョウタ、年齢は20です。」
```
文字列に含まれる```{}```の部分にformat()の引数が埋め込まれる。このとき、指定されている変数の型に関係なく埋め込みが行われる。
```{}```の中の数字はformat()の引数の番号に対応しており、引数の順番通りに埋め込む場合は省略できる。

###■ 文字の表示位置と幅指定
埋め込む文字列に含まれる```{}```中にフォーマットを指定することができる。文字の位置は、```<``` は左揃え、```^```は中央揃え、```>```は右揃えで指定することができる。
また、この後ろに埋め込む際の幅を指定することができ、幅の余った部分は空白で埋められる。これを使うことで表示を揃えることができる。

```python:
name = 'リョウタ'
age = 20
print('名前は{:^8}、年齢は{:<5}です。'.format(name, age))  
# 出力結果：「名前は  リョウタ   、年齢は20   です。」
```
Azure Databricks を VNET Injection でデプロイする (テンプレ利用)

### はじめに
Azure Databricks の VNET Injection でのデプロイは設定項目が多く、若干手間がかかります。
CIDR 範囲を指定できるテンプレがあったので実装手順をメモしておきます。

### 手順
以下 URL にアクセス

https://azure.microsoft.com/ja-jp/resources/templates/databricks-all-in-one-template-for-vnet-injection-with-nat-gateway/

Azure へのデプロイをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/50e6f883-f5ac-cb75-ae0b-735aa04e9927.png)

必要項目を埋めます。今回は新しいリソースグループを作成、リージョンは東日本を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/4933912e-ed47-2a14-950a-cc88b2d0a6fc.png)

できるだけセキュアにしたいので NPIP を有効化、VNET は /22、Subnet は /25 と小さめに設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/7c562e33-9f54-2478-d85b-51b1d505a6ef.png)

内容を確認したら作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/ceccae01-d2d9-e6f8-5f89-22efb42529d5.png)

この状態になればデプロイ完了です。
テンプレート便利ですね。ありがたく使わせてもらいましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/91dd7ede-2ca9-3d0a-cd9a-8d41387b0fce.png)
JAXX ZEC wallet から資産を移すメモ

## 背景

以前(2017~2018)に GPU マイニングした ZEC を Jaxx に保管していた.
Jaxx から ZEC 送金したくなったができない...
(ボタンおしても反応しない)


## 対策

https://www.reddit.com/r/zec/comments/699022/jaxx_zec_sending_not_working/

* ニーモニックは共通なので, ニーモニックを Coinomi など他のウォレットに入れて復元する.
* private key を dump して, local wallet で `zcash-cli` で import

zcashd で ZCash マイニングの税計算を行う
https://qiita.com/syoyo/items/32e6ed62e49a92df56f7

でローカルウォレット使っていますので, ローカルウォレットに移してみます.

https://zcash-rpc.github.io/importprivkey.html

zcashd でチェーンが同期したあと

```
$ zcash-cli importprivkey XXXXXXX -rpcclienttimeout=0
```

そこそこ時間かかります. 気長に待ちましょう.

timeout を設定しないと, default 900 secs なので途中で失敗してしまいます.
(私の環境では, 15 分程度かかりました)


## 注意点

幸い Jaxx は private key 出してくれましたが,
よくわからない wallet は使わないようにしましょう.
(wallet 開発元が無くなったら資金ひきだせなくなる)

どうしても使いたいときは, 復元用シードフレーズや, private key を記録しておくようにしましょう.
windowsでiverilog その122

#概要　

windowsでiverilogやってみた。
rtavr試してみた。

#gpioをテスト
いわゆる、Lチカ。
アドレス
DDRB 0x04
PORTB  0x06
PINB  0x05

```
asm.ldi(16, 255)
asm.out(4, 16)
asm.ldi(16, 255)
asm.out(6, 16)
asm.ldi(16, 0)
asm.out(6, 16)
asm.rjmp(-4)


```

```
		rom[0] = 16'hEF0F;
		rom[1] = 16'hB904;
		rom[2] = 16'hEF0F;
		rom[3] = 16'hB906;
		rom[4] = 16'hE000;
		rom[5] = 16'hB906;
		rom[6] = 16'hCFFB;
		rom[7] = 16'h0000;
		rom[8] = 16'h0000;
		rom[9] = 16'h0000;
		rom[10] = 16'h0000;
		rom[11] = 16'h0000;
		rom[12] = 16'h0000;
		rom[13] = 16'h0000;
		rom[14] = 16'h0000;
		rom[15] = 16'h0000;


```

#実行結果

```
PW_PC, DDR, PORT, PIN
   x xxxxzz xxxxzz xxxxxx
   0 0000zz 0000zz xxxxxx
   1 0000zz 0000zz xxxxxx
   2 0000zz 0000zz xxxxxx
   3 0000zz 0000zz xxxxxx
   3 00ffzz 0000zz xxxxxx
   4 00ffzz 0000zz xxxxxx
   5 00ffzz 0000zz xxxxxx
   5 00ffzz 00ffzz xxxxxx
   6 00ffzz 00ffzz xxxxxx
   7 00ffzz 00ffzz xxxxxx
   7 00ffzz 0000zz xxxxxx
   2 00ffzz 0000zz xxxxxx
   3 00ffzz 0000zz xxxxxx
   4 00ffzz 0000zz xxxxxx
   5 00ffzz 0000zz xxxxxx
   5 00ffzz 00ffzz xxxxxx
   6 00ffzz 00ffzz xxxxxx
   7 00ffzz 00ffzz xxxxxx
   7 00ffzz 0000zz xxxxxx
   2 00ffzz 0000zz xxxxxx
   3 00ffzz 0000zz xxxxxx
   4 00ffzz 0000zz xxxxxx
   5 00ffzz 0000zz xxxxxx
   5 00ffzz 00ffzz xxxxxx
   6 00ffzz 00ffzz xxxxxx
   7 00ffzz 00ffzz xxxxxx


```

以上。
KubernetesのkindでDocker Registryのローカルミラーを作って転送量を少なくする

# はじめに

なんどもkindで停止と起動を繰り返すような開発を行なっているときに、都度コンテナイメージを転送すると時間もかかるし、転送量も増えるのでローカルにキャッシュを作ります。

# パススルーミラーをするコンテナを起動する

```bash
if ! docker inspect proxy_docker > /dev/null; then
  docker run -d --name proxy_docker --restart=always --net=kind \
    -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io registry:2
fi
if ! docker inspect proxy_gcr > /dev/null; then
  docker run -d --name proxy_gcr --restart=always --net=kind \
    -e REGISTRY_HTTP_ADDR=0.0.0.0:5001 \
    -e REGISTRY_PROXY_REMOTEURL=https://gcr.io registry:2
fi
if ! docker inspect proxy_quay > /dev/null; then
  docker run -d --name proxy_quay --restart=always --net=kind \
    -e REGISTRY_HTTP_ADDR=0.0.0.0:5002 \
    -e REGISTRY_PROXY_REMOTEURL=https://quay.io registry:2
fi
if ! docker inspect proxy_zalando > /dev/null; then
  docker run -d --name proxy_zalando --restart=always --net=kind \
    -e REGISTRY_HTTP_ADDR=0.0.0.0:5003 \
    -e REGISTRY_PROXY_REMOTEURL=https://registry.opensource.zalan.do registry:2
fi
```

# kindの設定にミラーを参照する設定を入れる

```yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
  - |-
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
      endpoint = ["http://proxy:5000"]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
      endpoint = ["http://proxy:5001"]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
      endpoint = ["http://proxy:5002"]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."zalan.do"]
      endpoint = ["http://proxy:5003"]
```

# そのほかの方法

[rpardini/docker-registry-proxy: An HTTPS Proxy for Docker providing centralized configuration and caching of any registry (quay.io, DockerHub, k8s.gcr.io)](https://github.com/rpardini/docker-registry-proxy)を使ってプロキシを作る方法。この方法ではMITMで中間に入って全てプロキシするというもの。だがレジストリによっては動作しないので、色々とカスタマイズが必要そう。

proxyを起動する。

```bash
docker run --rm --name docker_registry_proxy -it \
       --net kind --hostname docker-registry-proxy \
       -p 0.0.0.0:3128:3128 -e ENABLE_MANIFEST_CACHE=true \
       -v $(pwd)/docker_mirror_cache:/docker_mirror_cache \
       -v $(pwd)/docker_mirror_certs:/ca \
       rpardini/docker-registry-proxy:0.6.2
```

次にkindを起動したら、次のようなスクリプトでkindコンテナの設定を書き換える。

```bash
#!/bin/sh

KIND_NAME=${1-focas}
SETUP_URL=http://docker-registry-proxy:3128/setup/systemd
pids=""
for NODE in $(kind get nodes --name "$KIND_NAME"); do
  echo "ENABLE PROXY FOR $NODE"
  docker exec "$NODE" sh -c "\
      curl $SETUP_URL \
      | sed s/docker\.service/containerd\.service/g \
      | sed '/Environment/ s/$/ \"NO_PROXY=127.0.0.0\/8,10.0.0.0\/8,172.16.0.0\/12,192.168.0.0\/16\"/' \
      | bash" & pids="$pids $!" # Configure every node in background
done
wait $pids # Wait for all configurations to end
```

# 参照

- [rpardini/docker-registry-proxy: An HTTPS Proxy for Docker providing centralized configuration and caching of any registry (quay.io, DockerHub, k8s.gcr.io)](https://github.com/rpardini/docker-registry-proxy)
- [Pull-through Docker registry on Kind clusters | maelvls dev blog](https://maelvls.dev/docker-proxy-registry-kind/)
windowsでiverilog その121

#概要　

windowsでiverilogやってみた。
rtavr試してみた。

#参考にしたページ。

http://suz-avr.sblo.jp/article/45659209.html

#avrアセンブラをコンパイルするツール作った。

https://embed.plnkr.co/plunk/u0K00JTPXxdkwvSm

#テストコードをromデータにする。

rjmpのテスト

```
asm.nop()
asm.nop()
asm.rjmp(-1)

```

```
		rom[0] = 16'h0000;
		rom[1] = 16'h0000;
		rom[2] = 16'hcfff;
		rom[3] = 16'h0000;
		rom[4] = 16'h0000;
		rom[5] = 16'h0000;
		rom[6] = 16'h0000;
		rom[7] = 16'h0000;
		rom[8] = 16'h0000;
		rom[9] = 16'h0000;
		rom[10] = 16'h0000;
		rom[11] = 16'h0000;
		rom[12] = 16'h0000;
		rom[13] = 16'h0000;
		rom[14] = 16'h0000;
		rom[15] = 16'h0000;


```

#テストベンチを書く。

```
module test;
	reg RESET;
	reg CLK2X;
	reg [23:0] PIN;
	wire [23:0] DDR;
	wire [23:0] PORT;
	wire PW_SLEEP;
	wire PW_WDR;
	wire PW_STORE;
	wire PW_LOAD;
	wire [11:0] PW_PC;
	wire [7:0] PW_SREG;
	wire [11:0] PW_SP;
	wire [7:0] PW_LOAD_REG;
	wire [3:0] PW_LOAD_ID;
	wire [7:0] PW_STORE_MEM;
	wire [11:0] PW_STORE_ADDR;
	rtavr u(.RESET(RESET), .CLK2X(CLK2X), .PIN(PIN), .DDR(DDR), .PORT(PORT),
		.PW_SLEEP(PW_SLEEP), .PW_WDR(PW_WDR), .PW_STORE(PW_STORE), .PW_LOAD(PW_LOAD), .PW_PC(PW_PC),
		.PW_SREG(PW_SREG), .PW_SP(PW_SP), .PW_LOAD_REG(PW_LOAD_REG), .PW_LOAD_ID(PW_LOAD_ID),
		.PW_STORE_MEM(PW_STORE_MEM), .PW_STORE_ADDR(PW_STORE_ADDR));
	initial
	begin
		RESET = 0;
		CLK2X = 1;
		$display("PW_PC, DDR, PORT, PIN");
		$monitor("%d %h %h %h", PW_PC, DDR, PORT, PIN);
		#2
			RESET = 1;
		#2
			RESET = 0;
		#80
			$finish;
	end
	always
		#1
			CLK2X = ~CLK2X;
endmodule





```

#実行結果

```
PW_PC, DDR, PORT, PIN
   x xxxxzz xxxxzz xxxxxx
   0 0000zz 0000zz xxxxxx
   1 0000zz 0000zz xxxxxx
   2 0000zz 0000zz xxxxxx
   3 0000zz 0000zz xxxxxx
   2 0000zz 0000zz xxxxxx
   3 0000zz 0000zz xxxxxx
   2 0000zz 0000zz xxxxxx
   3 0000zz 0000zz xxxxxx
   2 0000zz 0000zz xxxxxx
   3 0000zz 0000zz xxxxxx


```

以上。
kintoneで詳細画面を開いたら関連レコードの項目を集計して保存する

勝手に公式サイトの下記Tipsを改造してみたいと思います。

[関連レコードの項目を条件付きで集計](https://developer.cybozu.io/hc/ja/articles/203030394-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E9%A0%85%E7%9B%AE%E3%82%92%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A7%E9%9B%86%E8%A8%88)

スペースフィールドに表示するだけだった集計値ですが、
詳細画面を開いたら「集計値フィールド」に上書き保存するようにしてみたいと思います。

# アプリの準備

というわけで、まずは、↓コチラを完成させてください👀
[関連レコードの項目を条件付きで集計](https://developer.cybozu.io/hc/ja/articles/203030394-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E9%A0%85%E7%9B%AE%E3%82%92%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A7%E9%9B%86%E8%A8%88)


こんな感じに集計値が表示されたら次のステップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/999ed9a0-bfa7-e313-6f44-91a7563059ca.png)

## フィールドの追加

数値フィールドを1つ追加しましょう。
スペースフィールドとラベルフィールドは削除します。

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| 数値  | Aプラン小計  |  桁区切りを表示するにチェック！ |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/6f084537-c716-8586-f18d-621a33520d14.png)



# JavaScript書き換える

## 改造の方針

集計値と、Aプラン小計（数値フィールド）の値が異なっていたら更新するようにします。
※スペースフィールド、ラベルフィールドは使いません。

## コード

なるべく原作リスペクトで書きましたが
var は const, let に変更したり functionはアロー関数に変更したりしました。
あと、forループで集計していた部分は[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)使いました。

```js
(() => {
  "use strict";
  kintone.events.on(["app.record.detail.show"], (event) => {
    const clientRecordId = event.recordId;

    // 関連レコード集計用リクエストパラメータ準備
    const relatedAppId = kintone.app.getRelatedRecordsTargetAppId("案件一覧");
    const query =
      '顧客管理レコード番号_関連レコード紐付け用="' +
      clientRecordId +
      '" and 提案プラン in ("Aプラン")';
    const outputFields = ["合計費用"];
    const appUrl = kintone.api.url("/k/v1/records");
    const params = {
      app: relatedAppId,
      query: query,
      fields: outputFields,
    };

    kintone.api(appUrl, "GET", params, (resp) => {
      // 合計金額集計
      const amount = resp.records.reduce(
        (preV, p) => preV + parseFloat(p.合計費用.value),
        0
      );

      // Aプラン小計計算結果と、数値フィールドAプラン小計の値が同じだったら更新しない
      if (Number(event.record.Aプラン小計.value) === Number(amount)) {
        return event;
      }

      // 更新用リクエストパラメータ
      const body = {
        app: kintone.app.getId(),
        id: kintone.app.record.getId(),
        record: {
          Aプラン小計: {
            value: amount,
          },
        },
      };

      // レコード更新(数値フィールドの更新)
      kintone.api(
        kintone.api.url("/k/v1/record", true),
        "PUT",
        body,
        (resp) => {
          // 画面リロード
          location.reload();
        }
      );
    });
  });
})();
```

# まとめ
詳細画面に集計値を表示するだけではなくて、保存したい！という声をちらほら聞いた気がしたので、
詳細画面開くだけで更新するような改造をしてみました。
実際の動作↓

<iframe width="400" height="315" src="https://www.youtube.com/embed/NtMh7RNXZD0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
【JavaScript】反復処理⑧　イテレーターとスプレッド演算子


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/75a9c66885215be1ac9a

#目的

* 反復処理についての理解を深める

#本題
###1. スプレッド演算子

* スプレッド演算子とは反復可能や列挙可能オブジェクトの展開を行う演算子のこと。
* 主に配列で使用。[...]のように記述する
* 関数の引数で使用された場合,**残余引数**と呼ばれ、実引数に渡された変数を配列にまとめる。 
    * レストパラメーター　ex. function(...args)
* スプレッド演算子は　イテレーターの操作に従う

####例1 

スプレッド演算子の基本的な使い方

````js
// 配列を準備
const array1 = [1,2,3,4,5];
// スプレッド演算子によって展開されたものが再度array2に格納される(新しい配列を作っている)
const array2 = [...array1];
// (5) [1, 2, 3, 4, 5]と出力
console.log(array2);
// array1とarray2は別の配列となっている
console.log(array1 === array2);
// falseと出力される
//　先頭に0を足したり、後方に6番目を追加したりして直感的に配列を動かせる
const array3 = [0,...array1, 6]
// (7) [0, 1, 2, 3, 4, 5, 6] と出力
console.log(array3);
`````

####例2

レストパラメーターの用途

```js
// 関数を一つ定義し、引数にレストパラメーターを持たせる
// 渡ってきた引数を...argsの配列にまとめる
function sum(...args){
  // 初期値を設定
  let ret = 0;
  // for...ofで渡ってきた配列の値を一つひとつ抽出
  for(let v of args){
    // 1~4がvに格納されていることわかる
    // console.log(v);
    // ret + vが繰り返される
    ret += v;
  }
  // sumに値を返却する
  return ret;
}
// 引数に渡す値
const result = sum(1,2,3,4);
// 10と出力される
console.log(result);
````

####例3

イテレーターの関係性

`````js
//　ジェネレーターを利用して反復可能オブジェクト化
Object.prototype[Symbol.iterator] = function* (){
  for(let key in this){
    yield[key, this[key]];
  }
}
`````

####例4

````js
// オブジェクトを用意
const obj1 = {
  prop1: "value1",
  prop2: "value2",
  prop3: "value3"
}
// Uncaught TypeError: obj1 is not iterableと出力される
// このオブジェクトは反復可能オブジェクトではないという意味
const array4 = [...obj1];
````

上記エラーを無くすのにイテレーター（ジェネレーター）を使用

````js
// オブジェクトを用意
const obj1 = {
  prop1: "value1",
  prop2: "value2",
  prop3: "value3"
}

//　ジェネレーターを利用して反復可能オブジェクト化
Object.prototype[Symbol.iterator] = function* (){
  for(let key in this){
    yield[key, this[key]];
  }
}

const array4 = [...obj1];
// 配列で出力される
console.log(array4)
``````

オブジェクトのリテラルで囲うと挙動が変わる

````js
const obj1 = {
  prop1: "value1",
  prop2: "value2",
  prop3: "value3"
}

Object.prototype[Symbol.iterator] = function* (){
  for(let key in this){
    yield[key, this[key]];
  }
}

  // {}で囲う
const array4 = {...obj1};
// {prop1: 'value1', prop2: 'value2', prop3: 'value3'}と出力される
// これはジェネレーターを通さずに、obj1がそのまま出力されている
console.log(array4)
````

今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
* [Let'sプログラミング JavaScript入門](https://www.javadrive.jp/javascript/)
OpsRamp ワークフローによる自動化 (Process Definitions)

# 概要

OpsRampでは、アラートやインシデントが作成されたタイミングでワークフローを実行させることができます。
ワークフローでは事前に作成していたScriptを実行させたり、処理結果をメールで通知する事もできます。

今回はWindowsサーバの"Print Spooler"サービスの停止を検知した場合に、自動でサービスを起動してメール通知するワークフローを作成してみます。事前にWindowsのサービス監視で"Print Spooler"を登録しておきましょう。




# 自動化ワークフローの作成

"Automation" > "Process Automation" > "Process Definitions"をクリックします

| ![2021-1115-150122.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/1c38ff31-acb2-17c3-4abe-49ce62461675.jpeg) |
| :-- |


新規に作成するため"NEW"をクリックします

| ![2021-1115-150135.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/4705d7a9-aa4c-8312-1d39-4875caa228e4.jpeg) |
| :-- |


ワークフローの名前を入力して、左側のフロー図をドラッグ＆ドロップでワークフローを作成します。

| ![2021-1115-145808.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/1b0c2738-39eb-d1ad-bdd7-b8a9aac383c8.jpeg) |
| :-- |


ワークフローのトリガを設定します。

| ![2021-1115-145836.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/0ea16fe3-0559-36f2-6e47-52d2a7654118.jpeg) |
| :-- |


Windowsサービスのアラートを検知するので、Configurationは"Alert"を選択します。
※他にもIncidentとRerourceが選択できます
Filter Criteriaでアラートの条件を設定します。今回は"WINDOWS_SERVICES"を指定していますが、監視テンプレートなどからメトリクス名を事前に確認する必要があります。

| ![2021-1115-145847.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/7314908d-7822-6d32-42a5-5732582ac734.jpeg) |
| :-- |


次にタスクを設定します

| ![2021-1115-145905.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/cbb8c797-fcf6-c51d-8233-ab3fe574991b.jpeg) |
| :-- |


Windowsにインストールした監視エージェントを利用するので"Agent"を選択します。
※AgentlessでAnsible連携させる事もできます。
実行するScriptのカテゴリを指定して、事前に作成しておいたScriptを選択します。
Resource IDには下図とは別に、監視対象のプロパティページからも確認ができます。

| ![2021-1115-145915.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/c2579893-bbbd-be34-17e8-ebe7f4405299.jpeg) |
| :-- |


メール送信のタスクを設定します

| ![2021-1115-145930.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/bedc3063-3a95-155f-712d-4253768f3140.jpeg) |
| :-- |


Inputには直前のタスクを指定します。この場合、Scriptを実行した際の標準出力がアウトプットとしてメール通知されます。

| ![2021-1115-145941.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/7850e9e3-2f69-34f9-0c04-2940d8950883.jpeg) |
| :-- |


終了の設定

| ![2021-1115-145951.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/41732ebd-4acb-af55-0d17-5953021126e2.jpeg) |
| :-- |


名前だけ入力

| ![2021-1115-145958.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/f65e9469-8f82-7472-411c-d47f6b8263d0.jpeg) |
| :-- |


これでSAVEして有効化すれば終了です。
実際にサービスを停止させると、監視のタイミングで自動的にサービスが起動され、メールが送信されてくることが確認できました。

今後、Ansible連携など試してみたいと思います。


おわり。
動画で学ぶJHipster (8) （UIの強化）

# 参考動画
https://www.youtube.com/watch?v=6lf64CctDAQ
## 参考テキスト
https://github.com/mraible/jhipster7-demo#make-ui-enhancements

# Hot Module Replacementの有効化
（以下テキスト（の日本語訳））
JHipsterで生成されたアプリケーションでUI開発を行う場合、ファイルを保存するとすぐに変更を確認できると便利です。JHipsterは、Browsersyncとwebpackを使用してこの機能を強化します。この機能を有効にするには、blogディレクトリで次のコマンドを実行します。

```
npm start
```

＜＜
`npm start`で、`ng serve --hmr`を起動していました。`ng serve` はAngularのコマンドで、https://angular.io/cli/serve によると、`--hmr`オプションは、Hot Module Replacement (HMR) を有効化するオプションらしいです。

:::note warn
加えて(別コンソールで)バッグエンドで、mvnwで起動しておく必要がありました。
:::

# 1. HTMLを許可する（エスケープしないようにする）

現状だと、ブログ投稿のContentに書いたHTMLがエスケープされてしまいます。(h1タグで囲まれたlife is groovyの部分)
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/f31fd148-d4fe-37d2-6694-ca8ba202c9a9.png)

これを修正するために、以下の変更を行います。

src / main / webapp / app / entity / post / list / post.component.html
の

```
<td>{{ post.content }}</td>
```
を、

```
<td [innerHTML]="post.content"></td>
```
に変更する。

保存すると、HMRのお陰で即座に変更が反映されます。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/ed20a613-23d6-0943-261b-2405264d3658.png)

画面上の文字が大きくなりました。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/b08e8b9d-9b45-3122-22f5-455354b11a44.png)

# 2. レイアウトを改善する
レイアウトをテーブル形式からblogのような感じに変更します。

`<div class="table-responsive">` の子要素も含めてすべて以下のコードに置き換えます。

:::note warn
どうもテキストのコードは間違っていて、動画内のコードが正しいようです。（テキストのコードはコンパイルエラーになりました。。）
:::

```
<div class="table-responsive" *ngIf="posts && posts.length > 0">
	<div infinite-scroll (scrolled)="loadPage(page + 1)" [infiniteScrollDisabled]="page >= links['last']" [infiniteScrollDistance]="0">
	  <div *ngFor="let post of posts; trackBy: trackId">
		<a [routerLink]="['/post', post.id, 'view' ]">
		  <h2>{{post.title}}</h2>
		</a>
		<small>Posted on {{ post.date | formatMediumDatetime }} by {{ post.blog?.user?.login }}</small>
		<div [innerHTML]="post.content"></div>
		<div class="btn-group mb-2 mt-1">
		  <button type="submit"
				  [routerLink]="['/post', post.id, 'edit']"
				  class="btn btn-primary btn-sm">
			<fa-icon [icon]="'pencil-alt'"></fa-icon>
			<span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span>
		  </button>
		  <button type="submit"
				  (click)="delete(post)"
				  class="btn btn-danger btn-sm"
				  date-cy="entityDeleteButton">
			<fa-icon [icon]="'times'"></fa-icon>
			<span class="d-none d-md-inline" jhiTranslate="entity.action.delete">Delete</span>
		  </button>
		</div>
	  </div>
	</div>
</div>
```

すると、画面は以下のようになりました。

変更前：テーブル状
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/7754566b-3c06-937b-abf3-80b76548dda6.png)
変更後：ブログっぽい感じに。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/ae6a5a17-6b86-e28c-507f-6cccdb9ec6b9.png)

# コード
https://github.com/sayuu-tf/learning_jhipster_3/commit/9784cf5393d29a863f90fa42e2712962f011ba24
Vuetifyでラジオボタンのv-modelを設定しても選択済みにならない問題

Vuetifyでラジオボタンのv-modelを設定しても選択済みにならない件。

たとえば下記のようなコード

```vuejs
            <v-radio-group row v-model="item.table_type" class="mx-auto">
              <v-radio label="景品１" value="1"></v-radio>
              <v-radio label="景品2" value="2"></v-radio>
            </v-radio-group>
```

探してみたところ、<a href="https://stackoverflow.com/questions/54563307/vuetify-radio-button-not-appearing-as-checked">valueの前に:を入れるだけで解決できる</a>らしい

```vuejs
            <v-radio-group row v-model="item.table_type" class="mx-auto">
              <v-radio label="景品１" :value="1"></v-radio>
              <v-radio label="景品2" :value="2"></v-radio>
            </v-radio-group>
```

15分は悩んだ。
可変長の配列の行列を入れ替える方法

# 概要

授業で課題で出ていて調べても対処法がなかったので残しておきます。
以下に数字がインデックスになっており、0からインデックスが始まる一般的な配列の行列変換のコードを残しておきます。

# コード
```php
function matrix_replacement($arr)
{
    $result = [];
    for ($i = 0; $i < count($arr); $i++) {
        $result[] = array_column($arr, $i);
    }
    
    return $result;
}
```