OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Solution Architect Professional 合格記（2021年6月）

# はじめに
IT業界に身をおいて、もう少しで20年というところになるわけですが、毎年1つぐらいは資格なり、TOEICなりで、仕事とは別に頭を使う機会を作ろうと思っており、直近ではAWS資格を取ろうかな、どうせ取るならSAPだよなと思い、チャレンジを続けてきました。やっと合格することが出来たので、その記録です。

# 苦悩の歴史
## 一回目のチャレンジ
2018年11月に同じチームにいた新入社員に先輩社員としての背中を見せるべく、SAAを受験し、サクッと合格できたことに気を良くして、「まあ、地続きでいけるっしょ」と軽い気持ちで2019年12月に受験。合格スコア750に対して獲得スコア540台であえなく不合格。
敗因は分析をするまでもなく、準備不足。

## 二回目のチャレンジ
Udemyでコースをセールのタイミングで購入し周回すること、Blackbeltを読むこと、[こちらの対策本](https://www.amazon.co.jp/dp/B08F9CQ6LT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を購入し2度ほど通読し、さあ準備万端と思い、2020年7月に受験。合格スコア750に対して獲得スコア650台でまたもや不合格。
ここまでで、既に7－8万と結構な時間を費やしており、もう諦めた方が良いのかもと辛い気持ちに。
敗因はサービスの概要を理解しているものの、細かいところの理解不足。

## 三回目のチャレンジ
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)なるサイトがあることを知り、わらにもすがる思いで課金。
1週目は、何も見ずに自力で解いていく。2週目は、100％になるまで繰り返す。3週目、改めて何も見ずに自力で解いていく。ということを繰り返すと、なんとなく80％ぐらい取れる雰囲気になってきたので、2021年6月に再受験。獲得スコア840台となって、やっと合格。

# やってよかったこと
特別目新しいことはないのですが・・・。

## 学習の記録を付ける
ベタなんだけど、WEB問題集の結果をGoogle Spreadsheetをつかって、記録し、スコアが良くなかったところで躓いた技術要素はBlackbeltなどので補足するという方法を地道に積み重ねたのは良かった。なんとなく出来るような気がする、というのではなく、記録としてそろそろ合格できそうというのが数字でみえたことは良かった。

## フィードバックのサイクルを早くする
Udemyの場合、75問全て解かないと結果が見えなかったので、はじめのほうに答えた問題とか記憶の彼方にすっ飛んでしまっていることがおおかったのだけど、[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)は7問一区切りとなっていて、チャレンジ⇒フィードバックのループが短い間隔で回せたのが、個人的には合ってたなという印象。
[対策本](https://www.amazon.co.jp/dp/B08F9CQ6LT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)も同じことが言えて、数問解いて、答えを見て、とやるとわかんないところの補正がすぐできる。

## アカウント作って触る
当たり前すぎますけど、画面にこういう設定項目があったなー、とイメージとして頭の片隅にあるだけで、連想出来たりする。

## 既存の知識をもとに想像を膨らませる
一応経験もながいし、IPAの試験はDB、NW、エンベ以外は合格しているので、ベースの知識はある方なので、なんとなくその知識をもとに、さすがにそこまでは出来ないだろ、とかそこ出来たりしたらうれしいよね、というところを膨らませると、わかんない問題もなんとなく答えが見えてくる。年の功とも言える。

## 英語
いろんな人が書いている通り、試験問題の日本語訳にはかなり改善の余地があるので、原文をみたほうがわかりやすい問題がいくつかある。なので、英語が読めるとそれだけで1，2問程度拾える印象。

# やらないほうがいいこと

## Blackbeltの資料だけを読む
SAの人が説明する動画があるので、それと合わせて見た方がよい。資料だけ斜め読みすると読み飛ばしがある。
動画なら、1.5倍とか2倍でも説明は聞けるので、動画も合わせてみたほうがよい。

## 諦めること
テストは長丁場なので、わからない問題が続くと諦めそうになる。諦めると問題を見返すこともしなくなるので、諦めたくなる気持ちが芽生えたら、目をつむって少し落ち着くとよい。私の場合、ひととおり回答終わってから、頭から見直して5問ぐらいは回答を変えた。集中力は続かないので、「これまちがってるじゃん」という回答がいくつかある。

# 最後に
合格したとて、何かが変わったわけではないのだが、次はセキュリティのスペシャリティかDevOps Proかにチャレンジしようかと思っている。
[Rails]rails db:resetで不要なmigrationファイルを削除

不要なmigrationファイルがあり、`rails db:migrate`が適応されなかったのでアウトプット致します。
また、調べていると`rails db:reset`と`rails db:migrate:reset`にも違いがあったためその違いも記載していきます。
#エラー内容
不要なマイグレーションファイルが存在するため`rails db migrate`が実行できなかった。
`rails db:migrate:status`で確認すると`no file`というマイグレーションファイルがあったため、間違いに気づきました。
#rails db:migrate:resetとは何か？
DB を drop した後、通常通りのマイグレート（db:migrate）が行われます。
例えば、マイグレーションファイルに修正を加えこのコマンドを作成すると、そのマイグレーションファイル自体を削除し、新たに再構築しマイグレートしてくれると言うコマンド。

つまり、db/migrate/**.rbが使われる。
#rails db:resetとの違い
db/schema.rbは、デーブル、カラム、エントリーが追加or削除された最新のデータベース構造を表しています。
rails db:reset は DB を drop して、現在の scheme をロードして DB を作り直します。
つまり、違いはschemeかdb/migrate/**.rb の違い。
データベースをdropした後、schemeかdb/migrate/**.rb のどちらを用いて再構築するかの違いになります。
#まとめ
DBを一度削除する際には、gitなどで必ず履歴を取って置くことをおすすめ致します。
何かご指摘あれば頂きたいです。
/etc/hostsを使用せずに curlコマンドで証明書の有効期限を確認する方法

### 概要
大量にhostsで証明書の有効期限を確認しないといけない作業があったので備忘録です。
証明書の有効期限を確認したエビデンスも残さなきゃいけなかったので
スプレッドシートでコマンド作成して、出力結果をそのまま記載して残せるように出力させました。
(今回かなり稀なケースでしたが、hosts使わないで確認できるの楽だなと思った次第です)
### コマンド

```
DOMAIN=example.com
HOSTS_IP=192.168.0.2
echo ${DOMAIN}
echo ${HOSTS_IP}

curl -I -v https://${DOMAIN}/ --resolve {DOMAIN}:443:{HOSTS_IP} 2>&1 |grep -1 -n 'expire date:'
----
35-*  start date: Oct 22 00:00:00 2020 GMT
36:*  expire date: Oct 22 23:59:59 2021 GMT
37-*  subjectAltName: host "example.com" matched cert's "example.com"
----
```

### 解説
curl オプション
-v: リクエストヘッダとレスポンスヘッダを標準エラー出力に表示する。
-I : ヘッダー情報のみ表示
--resolve : HOST:PORT:IP address (hosts的な役割)
※`man curl` で確認すると説明にもありました
> wise  normally resolved address to be used. Consider it a sort of /etc/hosts

`curl -I -v https://${DOMAIN}/ --resolve {DOMAIN}:443:{HOSTS_IP} 2>&1 |grep -1 -n 'expire date:'`
標準エラー出力を標準出力にリダイレクトすることで grep コマンドが使用できるようになり、有効期限のみを絞り込むことができるようになります。

### 参考サイト
ファイルディスクリプタ: https://qiita.com/laikuaut/items/e1cc312ffc7ec2c872fc
curlオプション: https://hydrocul.github.io/wiki/commands/curl.html
R（インストール基礎）

#R インストール

通常一般的に使われているOS（Windows、Mac）でのRのインストールは基本的に脳死で終わるのだが、他人への説明書代わりにまとめておく（聞かれることないけどｗ）。

##Windows
CRAN(https://cran.r-project.org/) からインストーラーをインストール。そしてインストーラーを管理者権限で起動したら、ただ指示に従ってインストールするだけ。
（注：日本語フォルダー名がつく部分にインストールしないこと！）




![キャプチャ-install-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398478/d7260d52-5646-ce9a-12d9-77ea124e0d20.png)

（注意64bit版と32bit版）

##Mac/Linux(Unix系OS）

dmgファイルのインストールの場合はWindows版と大差がないので省略する。

###brewを使ったインストール法の場合

まずターミナルを立ち上げ、brewをインストールする。

```{bash}
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

##Linux版（Ubuntuを例に）

正直Ubuntuを使おうとする物好きはこんなの見なくてもいける気がするが、一応備忘録として。

```{bash}

# update indices
apt update -qq
# install two helper packages we need
apt install --no-install-recommends software-properties-common dirmngr
# import the signing key (by Michael Rutter) for these repo
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
# add the R 4.0 repo from CRAN -- adjust 'focal' to 'groovy' or 'bionic' as needed
add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"

```


###sourceコードから変換（Ubuntuの場合）

取り敢えず足りなさそうなものを片っ端からインストール．

```{bash}
sudo apt install build-essential
sudo apt install gfortran

sudo apt install git build-essential libssl-dev libreadline-dev zlib1g-dev x11-apps x11-utils x11-xserver-utils libsqlite3-dev nodejs fonts-ipafont libxml2-dev libxslt1-dev

sudo apt install texlive-lang-japanese texlive-xetex texlive-luatex texlive-latex-recommended

```

後は普通に解凍してインストールすれば宜しい

```{bash}
wget #Rのソースファイル
sudo tar-zxvf R-version #インストールしたいのR-version
cd　R-file #ディレクトリ移動
./configure --prefix=/入っているパスの部分/R-file　# コンパイル、インストール
```

#R アンインストール

##Windows

Windowsマークの部分をクリック、若しくはキーボード下のWindowsマークを押し、Rを探す。
そしてR実行リンクを見つけたら、右クリックしてプログラムと機能を開きアンインストールする。
![R-uninstall-windows-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398478/0141bd48-0295-d3a5-a1d2-c89481b841ab.png)



##Mac

```{bash}
sudo rm -rf /Library/Frameworks/R.framework /Applications/R.app ＼
/usr/local/bin/R /usr/local/bin/Rscript 
```


##Ubuntu

正味Ubuntu動かしている人で正直分からない人がいると思えないので省略


##参考文献

正直ここら辺を参考にすれば大方の分野のものは入る気がする

CRANの公式サイト

https://cran.r-project.org/

矢内勇生先生のHP
https://yukiyanai.github.io/jp/resources/

Rで塩基配列解析

http://www.iu.a.u-tokyo.ac.jp/~kadota/r_seq.html
zsh: no matches found:というエラー対応

#はじめに
環境構築時のエラーについてまとめます。

#起きていること

以下のコマンドを実行時にエラーが発生。
***としていある部分は、会社名が含まれたファイル名のため隠しています。

```:terminal
docker-compose exec web /home/apps/.rbenv/shims/bundle exec rails ************[**************]
zsh: no matches found: ************[**************]
```

#原因
どうやらコマンドにglobでされるメタ文字(*,[],?…)が含まれていると、
**zsh**であるとファイル名と思って解析し「そんなファイルありません」とエラーを返してくれてみたいです。bashだと、大丈夫みたいです。

[参考になった記事はこちら！！](https://qiita.com/ponsuke0531/items/8dd9ba566a13edc03fe2)

#対応方法


```
% vim ~/.zshrc 
#setopt nonomatchを記述
% source ~/.zshrc
```

nomatchによるエラーを抑制してくれるみたいです。

#おわりに

まだ理解度は７割ですので、引き続き調査していきます！
Gitのリモートブランチ削除(作成したPRを削除したい時など)

###Gitで誤ったPRを上げた時、シンプルにリモートブランチを削除したい時などに使用。


##前提
Gitインストール済み
GitHubサインアップ済み

##❗注意
コマンドをコピペして実行する際、コマンドの最後に余分なスペースが入らないよう注意しましょう。
コマンドが強制実行される場合があります。実行の際は慎重に。

##目次
>実行コード
>>Git リモートブランチ削除

>★以下続編あり
参考記事


##実行コード
###Git リモートブランチ削除
ターミナルにて実行

````
git push --delete origin 対象ブランチ名
````

##★以下続編あり
[Gitのリモートブランチ削除実行前に実験したこと(Git・Linuxコマンド、GitHubの超基本操作)](https://qiita.com/yuuichimizuta/items/bdd069db274ff6049a08 "Gitのリモートブランチ削除実行前に実験したこと(Git・Linuxコマンド、GitHubの超基本操作)")

https://qiita.com/yuuichimizuta/items/bdd069db274ff6049a08

##参考記事

https://qiita.com/yuu_ta/items/519ea47ac2c1ded032d9

https://qiita.com/mather314/items/a1536c52a2eb0426b2b5

https://yu8mada.com/2018/08/13/how-to-delete-both-local-and-remote-branches-in-git/
Azure上でなんとかいち早くWindows 11を使ってみる

## はじめに

Windows 11を早く触ってみたかったんですが、自分のPCは古くて要件満たさなかったので、なんとかAzure上で実行できないか試行錯誤してみました。

## おことわり

書いてから、普通にWindows 10 仮想マシンをアップグレード出来ることを知りました...

https://qiita.com/KentoNaka/items/709d7c35ac6c7594782b

せっかく書いたので残します。

* 普通には動いてません。Nested Hyper-Vを使ってます。
* 6/29時点の情報です。今後も同じ方法ができる保証はありません
* Insider Previewのアカウントは以前から持っていたので要件緩かった可能性があります
* Azure Virtual Machine じゃなくてLab Service使ってます
 * Azure Virtual Machineでも行ける可能性はあると思いますが

## やり方

* Nested Hyper-Vが有効になったラボを作成
* ラボ上でHyper-Vを構成
* Hyper-Vゲストがインターネット接続出来るようにNATを構成
* 以下の様にゲストを作成
 * 第２世代で作成
 * セキュアブート有効
 * TPM有効
 * メモリ4GB以上
 * CPU2コア以上
 * ディスク64GB以上
* Windows 10 Pro Insider PreviewのISOをダウンロード
 * [ISO の使用 \- Windows Insider Program \| Microsoft Docs](https://docs.microsoft.com/ja-jp/windows-insider/isos)
* セットアップ後、Insider Previewを有効化
* Devチャネルに設定
* Windows Update実行して適用

これで動きました。
ただ、半透明のグラス効果は有効にできませんでした。

## おぼえがき

Aure Virtual Machineでやろうとしたらうまく行かなかった。原因確定してないが、トラステッド起動の仮想マシンで行って以下の結果だった。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/trusted-launch-portal

* Windows 10
 * 仮想マシンを作ったけどInsider Preview有効にできず
 * Enterprise N で作成
 * Enterpriseだったせいか開発・テスト用のNだった成果は未切り分け
* Windows 2019 仮想マシンでNested Hyper-V
    * 有効にしようとしたらBIOSで仮想化有効になってないで失敗
    * D3v3使ったけどダメ
    * Gen2がNested Hyper-V対応してなさそう?
    * Lab Service上の仮想マシンでできたのであれば、Windows 2019をGen1で作ってD3v3にして、Nested Hyper-Vでやれば同じ様に出来る気が（未検証）

## 参考
https://docs.microsoft.com/ja-jp/azure/lab-services/how-to-enable-nested-virtualization-template-vm
学習記録２日目(Git/LPIC101/ネットワーク)

６月２９日（火）
☆本日の目標☆
・GitHubをもう少し理解する
・LPICに向けての学習を進める

☆達成できたか☆
未達

☆未達成の場合、原因☆
LPICについて、問題集で学習を進めようと試みましたが、レベルが追いつかず、ほぼ全く進みませんでした。

☆感想☆
・GitHubについては、昨日とは違う動画コンテンツで学習を進めました。
昨日は無理矢理理解している状態だったのが、ある程度自分の中で腑におちて理解ができました。
動画も、もしかしたら本なども、同じテーマで違う方が解説しているものを視聴するのが、
点が線としてつながる第一歩かと感じました。
・LPICについては、まずもう少し基礎の基礎を固めてから問題集に取り掛かろうと思います。
明日から、動画及び書籍で始めます。
・残りの時間で、ネットワークについて動画視聴で学びました。

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

☆本日のアウトプット☆
GitHubについて、昨日より腑に落ちた考え方について、微妙なニュアンスですが記録しておきます。

ワーキングディレクトリ・・・今作業している場所。この時点で変更履歴は残っていない（残っているのは最新のバージョン）。
↓ git add
ステージングエリア・・・ここにaddすることで初めて、Gitが変更履歴を追跡する。取り扱ってくださいと指示する(add)。
↓ git commit
ローカルリポジトリ・・・ここにcommitコマンドであげることで初めて変更履歴が保存される。
(ここまでが自分のパソコン内での動き！)
↓ git push
これをリモートリポジトリにpush（コマンド）すると、ネットワーク上での管理となる。

GitHubとは変更履歴付きのデータをインターネット上で管理するサービスとのことなので、
このリモートリポジトリの一種ということでしょうか。
（そもそもリポジトリ・・・ファイルのバージョン管理のデータベース、つまりファイルの変更履歴を保存・蓄積しておく場所？）

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


明日は、LPICに向けての勉強の算段を立て、始めていきます。
できたらRubyも進めたいなと思っています。
Rails new まとめ

# 1. 概要

- railsプロジェクトを立ち上げるときに必ず最初に使う`rails new`
- 実際の開発では使用頻度は高くない(開発初期に使用する)
- ポートフォリオでAPIモード、DBにMySQLを使用するときに色々オプションがあったので簡易的にまとめる

# 2. How To rails new

Railsアプリケーションの雛形を作成することができる
使用するには以下のようにする

```
$ rails new <新規作成するプロジェクトのファイル名 | .(現在のディレクトリ に作成する場合)
```

#　3. オプション

## 3.1. `rails`のバージョンを指定する

`rails`コマンドの後にプレフィックスとサフィックスにそれぞれ「_」をつけてバージョンを指定する

```
$ rails _6.0.3_ new .
```

## 3.2. DBサーバーを指定する

`-d`オプションの後に使用するデータベースを指定する

```
$ rails new -d mysql
```

## 3.3. testフレームワークを変えるとき

`-skip-test`オプションを指定することでデフォルトの`Minitest`gemをインストールしない設定にできる
‘RSpec’などでテストすることを考えているときはこのオプションを使用する

## 3.4. 雛形作成と同時に`bundle install`の実行を行わない

`-B`オプションで`bundle install`をスキップできる
`rails new`で雛形を作成した後に`.Gemfile`を編集して`bundle install`するときはこれを指定する
【物体検出】YOLOv5で電車抽出モデルを自作する


# はじめに
物体検出のモデルを作成する手順について備忘録としてまとめました。
YOLOv5を使用して、物体検出モデルをローカル環境で作成します。

（参考記事）Google ColabでのYOLOv5モデル作成


https://qiita.com/hkwsdgea_ttt2/items/b6512277c0d028bf9f11


# 成果物
以下のように動画または画像から電車を抽出するモデルを作成します。
(YOLOv5で列車の抽出は可能ですが、車両正面を正確に囲ってくれる電車に特化したモデルを作るため自作していきます)

![4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/d211ffd9-84ee-5c2d-2a1e-9fb3d6b6ce02.jpeg)


# 物体検出とは
物体検出（object detection）とは、画像内の「どこに」「何が」写っているかを検出する技術のことです。
物体検出としては、SSDやYOLOといったものがよく使用されます。

# YOLOv5とは
YOLOv5とは、物体検出をするアルゴリズムですがYOLOv3の後継にあたり、2020年に公開された最新のモデルです。YOLOv4という高精度化したYOLOv3の後継モデルもありますが、YOLOv5は推論処理時間がより速くなっているのが特徴です。

https://qiita.com/hkwsdgea_ttt2/items/902b014aafbadfbc51d6

# 環境構築


①まずはPyTorchを導入します。

```
pip3 install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio===0.8.1 -f YOLOv5
```
②次に以下のURLからYOLOV5をダウンロードしてきます。

`https://github.com/ultralytics/yolov5`からクローンします。


③ダウンロードした場所に移動して必要なものをインストール

```
!pip install -qr requirements.txt
```
以上で準備完了です。

# モデル作成に必要なもの

画像収集とアノテーションファイルを作成したうえで、それぞれ指定の場所に格納していきます。

①画像(.jpg)
②アノテーションファイル(.jpg)
③yamlファイル(.yaml)

```
yolov5
  ┠ data
  ┃  ┠ train
  ┃  ┃   ┠ images
  ┃  ┃   ┃   ┗ *.jpg
  ┃  ┃   ┗ labels
  ┃  ┃       ┗ *.txt
  ┃  ┠ valid
  ┃      ┗ images
  ┃          ┗ *.jpg
  ┗ traincar.yaml

```

`coco.yaml`をコピーして`traincar.yaml`と名前を付けて、ファイル内を以下のように書き換えます。

```ruby:traincar.yaml
train: .data/train/images # 学習の画像のパス
val: .data/valid/images # 検証用画像のパス

# number of classes
nc: 1

# class names
names: [ 'traincar']
```



` number of classes `：物体検出対象のクラス数です。今回は1種類なので1とします。
`class names `：物体検出対象の名前です。任意の名前にすることが可能です。


# 学習
以下のコマンドを入力


```
python train.py ---batch 8 --epochs 500 --data traincar.yaml --weights yolov5x.pt --name traincar
```
上記の引数は以下の通りです。

`batch`:バッチサイズを指定します。
`epochs `:学習回数を指定します。
`data.yaml `:先程作成したyamlファイルを指定します。
`weights `:ここではyolov5x.ptを指定します。


#結果
学習が終わると`/runs/train/traincar/weights/`に`best.pt`と保存されます。
#まとめ

電車抽出モデルを作ることができました。
![out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/5f695f43-16cf-46d9-214f-8d93d6a1c351.gif)

訂正要望がありましたら、ご連絡頂けますと幸いです。

おまけ
結果を動画にもしてみました。
よかったらご覧ください。

https://youtu.be/G0dTb6sqD5I

https://youtu.be/UqBF30AqavU



続き

https://qiita.com/hkwsdgea_ttt2/items/cca13b92ac995c2034bd

https://tt-tsukumochi.com/archives/tag/yolov5
ドメイン駆動設計入門を読んでみた

会社の推薦図書で「ドメイン駆動設計入門」を読んでみたので簡単にまとめたいと思います。

https://www.amazon.co.jp/gp/product/B082WXZVPC/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=jun69916230-22&creative=1211&linkCode=as2&creativeASIN=B082WXZVPC&linkId=92266d888040a7264a9d97e70d170185

※Amzon.co.jpのアフィリエイトリンクになっています

## ドメイン駆動設計とは
ドメインとは「領域」の意味持った言葉である。ソフトウェア開発におけるドメインとは「プログラムを適用する対象となる領域」を指す。例えば、会計システムがあったときに、金銭や帳票とった概念がドメインになる。ここで重要なのはドメインが何であるかではなく、ドメインに何が含まれているかである。ソフトウェア利用者が何を解決しようとしているのか、彼らを取り巻く環境を真に理解し、技術的なアプローチで解決しようとするのではなく、ドメインと向き合い、それらを知識に焦点を当てることによって問題解決のための最善手をを考える。ドメイン駆動設計はそういった洞察を繰り返しながら設計を行い、ソフトウェア利用者を取り巻く世界と実装を結びつけることを目的としている。


## ドメインモデルとは
モデルとは現実の事象あるいは概念を抽象した概念である。現実をすべて忠実に再現するわけではなく、必要に応じて取捨選択を行う。何を取捨選択するかはそのドメインによる。事象や概念を抽象化する作業をモデリングといい、その結果として得られるものがモデルである。ドメイン駆動設計においてはドメインの概念をモデリングして得られたモデルをドメインモデルという。ドメイン知識のある人（ビジネスサイド）は開発についての知識はないことが多い、開発者はソフトウェアに関する知識はあってもドメインに関する知識はないことが多い、そのためドメインモデルを作成するには両者が協力する必要がある。

## ドメインオブジェクト(値オブジェクト、エンティティ)
ドメインモデルはそれ単体では抽象化した知識にとどまる。問題解決のためには、ドメインモデルを何かしらの媒体で表現する必要がある。ドメインモデルをソフトウェアで動作するモジュールとして表現したものがドメインオブジェクトである。ドメインオブジェクトによって、コードのドキュメント性が高まったり、ドメインによる変更をコードに伝えやすくなるなどの恩恵が受けられる。

## 値オブジェクト
システム固有の値を表現するために定義されたオブジェクトを値オブジェクトで、属性によって識別される。値オブジェクトは「それ単体で扱いたいかどうか」が判断基準が重要視される。

### 値オブジェクトの性質

- 不変である
    - 値の中身が途中で変更されないこと
- 交換が可能である
    - 変数の代入処理
- 等価性によって比較される
    - 値オブジェクトは値オブジェクト同士で比較される


## エンティティ
エンティティは値オブジェクトと同様にドメインオブジェクトであるが、値オブジェクトとの違いは同一性によって識別されるか否かである。エンティティとは属性によって区別されない値オブジェクトとも言える。例えば、ユーザーという概念はその典型であり、ユーザー情報というものは大抵は任意で変更可能である。ユーザー情報を変更してもユーザー自体が変更されるわけではない。ユーザーは属性ではなく、同一性によって識別されているからである。

### エンティティの性質

- 可変である
    - 属性を変更させたい場合は交換によってではなく、ふるまいを通じて変更する。
- 同じ属性であっても区別される
- 同一性により区別される
    - 同一性を判断するために識別子を利用する


## ドメインサービス

値オブジェクトやエンティティなどのドメインオブジェクトに記述されたふるまいが不自然である時に定義する。ドメインサービスはドメインオブジェクトでは不自然なふるまいになる挙動を記述することで、ドメインオブジェクトの不自然性、一貫性を保つことができる一方で、ドメインサービスにすべのふるまいを記述してしまうと、開発者が本来のドメインオブジェクトにどのようなふるまい、ルールを持っているのかが分からなくなるので、可能な限りドメインサービスの濫用は避ける。


## リポジトリ

ドメインオブジェクトの永続化や再構築を行う。データストアに対する詳細な操作をリポジトリに専念させることで、ソフトウェア開発に柔軟性を与える。オブジェクトのインスタンスを保存したい時は直接的にデータストアに書き込み処理を実行するのではなく、リポジトリにインスタンスの永続化を、再構築を依頼することで、ドメインオブジェクトはドメインの知識を表現することに集中することができる。


## アプリケーションサービス
アプリケーションサービスは、ユースケースを実現するオブジェクトであるユーザーの利用用途に応じた調査役を実現する値オブジェクトやエンティティは自身のふるまいをもっているが、サービスは自身のためのふるまいはもっていない。アプリケーションサービスは「もの」や「こと」ではなく、活動や行動であることが多い。
ユーザーの登録や退会といったことはアプリケーションを成り立たせるための操作であり、このふるまいはドメインに存在する概念ではなく、アプリケーション固有のふるまいであり、これらが定義されるのがアプリケーションサービスである。ドメインサービスとアプリケーションサービスは対象となる領域が異なるだけで、向いている方向がドメインであるか、アプリケーションであるかの違いである。




この本はエンジニア歴の浅い自分からすると少し難しかった印象があります。

開発にはドメインの知識が不可欠。自分も今携わっている事業のドメイン知識を深く知っていきたいと思いました。
Power BI 会計年度始まりの月からグラフを表示させる

# 概要
列の並び変えはMS Doc にも記載されてるけれど、ちょっと悩んだので今後の為にメモ
[Power BI Desktop での列による並べ替え](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-sort-by-column)

# やり方
### 並び替えをしたい表の軸を元に、新しいテーブルを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b76f3ca8-e140-5e0c-2be4-b308a34a41c3.png)

```ghc-cmm:newTable
CalendarTable = 
VAR BaseCalendar =
    CALENDAR ( MIN('Mail'[DateTimeReceived]), MAX('Mail'[DateTimeReceived]))
RETURN
    GENERATE (
        BaseCalendar,
        VAR BaseDate = [Date]
        VAR MonthNumber = MONTH ( BaseDate )
        VAR MonthName = FORMAT ( BaseDate, "mmmm" )
        VAR YearMonthName = FORMAT ( BaseDate, "mmm yy" )
        VAR FiscalDate = EDATE(BaseDate, -3)
        VAR FiscalYear = CONCATENATE(FORMAT(YEAR ( FiscalDate ), "yy"), "年度")
        VAR FiscalMonth = CONCATENATE(FORMAT(Month ( FiscalDate ), "mm"), "月")
        VAR MonthOrder =  if (MonthNumber<=3, MonthNumber +9, MonthNumber -3)
        RETURN ROW (
            "Month", MonthNumber,
            "月順", MonthOrder
            "FiscalDate", FiscalDate,
            "年度", FiscalYear
        )
    )
```

### 月の並びを替え用の列を追加する
    VAR MonthOrder =  if (MonthNumber<=3, MonthNumber +9, MonthNumber -3)
会計年度用に、変数追加

    "月順", MonthOrder
追加した列を公開

### リレーションで、元の軸と、新しいテーブルの軸を設定しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f7395673-9bda-b429-22a8-5c4af1e568a6.png)

### 「列で並び替え」で、並び替えを指定
[Power BI Desktop での列による並べ替え](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-sort-by-column)　の通りに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/88e42961-cc24-41a3-625c-f303f3c30687.png)
ここで、軸を数値にすると、並び替え出来ないことがあったので注意

### グラフの軸を、追加した軸に交換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/4ea5f290-86b0-9e63-3606-0929c7742f3f.png)

# あとがき
Distinctで一意のテーブルを用意して、その並びを指定しておいたりとかも出来るけど、
上級者の方はどうやってらっしゃるのか見てみたいなぁ
[Delphi] FireMonkey のコントロールの構造

# FireMonkey のコントロール

元々 FireMonkey は Style を使って見た目を表現していました。
しかし、Style を使ったコントロールは所詮は絵、もしも Native Control があった場合、設計時の Z Order が上でも下に隠れてしまいました。
また FireMonkey 自身でコントロールの動作を作り込まねばなりませんでした。

そこで、XE7 から Native Control がサポートされるようになりました（Android Z-Order 対応などと言われたもの）

しかし、この時点から内部構造が複雑で解りづらいという声がありました。
この記事ではそれを解説します。

## ControlType プロパティ

XE7 で Native Control がサポートされたことで [ControlType プロパティ](http://docwiki.embarcadero.com/Libraries/Sydney/ja/FMX.Controls.Presentation.TPresentedControl.ControlType)が新設されました。
このプロパティで ```Styled``` または ```Platform``` を選べ、Styled の場合は今まで通り FireMonkey のコントロールを、Platfrom の場合は Native Control が生成されるようになりました。

プロパティで生成するコントロールを切り替えられる仕組みを実現するために [TPresentedControl](http://docwiki.embarcadero.com/Libraries/Sydney/ja/FMX.Controls.Presentation.TPresentedControl) が新たに導入されました。

## TPresentedControl

Native Control をサポートしているコントロールは全て TPresentedControl から派生しています。
TPresentedControl はコントロールの見た目を ControlType によって切り替えていますが、Windows, iOS, Android で生成されるコントロールはまちまちです。

しかし、各コントロールは統一的に操作できないといけません。
例えば

```pascal
Edit1.Text := 'Foo';
Edit1.SelStart := 0;
Edit1.SelLength := 3;
```

とやったとき、Styled でも、Windows, iOS, Android のどれでも同じ動きを実現しなくてはなりません。
FireMonkey なので View を Platform に応じて切り替えるのはお手の物です。
しかし、コントロールが保持しているデータや状態は同一のものなので、それぞれのコントロールがデータや状態を持ったり変更する仕組みを持つのは無駄です。

そこで、コントロールが保持するデータや状態を別の仕組みで持つことにしました。
それが TDataModel です。

## TDataModel

[TDataModel](http://docwiki.embarcadero.com/Libraries/Sydney/ja/FMX.Controls.Model.TDataModel) は各コントロールのデータや状態を保持するための基底クラスです。
たとえば TEdit では

```pascal
type
  TCusutomEditModel = class(TDataModel)
    // 略
  end;
```

として宣言されています。
TCustomEditModel は編集対象のテキストや選択領域などのデータを持っています。

これで見た目とデータが分離されました。
では、選択領域がユーザーによって変った場合、もしくは、プログラムによって Model 内のデータが変った場合、Model と Presentation 間でデータ・状態をどうやってやり取りしているのでしょうか？

## TPresentationProxy

Model ⇔ Presentation 間のデータ・状態をやり取りする仕組み、それが [TPresentationProxy](http://docwiki.embarcadero.com/Libraries/Sydney/ja/FMX.Controls.Presentation.TPresentationProxy) です。

この TPresentationProxy が介在し Presentation と Model の抽象化が保たれています。
そして、TPresentationProxy は、[Presentation.Messages](http://docwiki.embarcadero.com/Libraries/Sydney/ja/FMX.Presentation.Messages) の仕組みを使って Presentation, Model と通信します。
ここで出てきた Presentation.Messages は [System.Messaging](http://docwiki.embarcadero.com/Libraries/Sydney/ja/System.Messaging.TMessageManager) の仕組みとは全く別のものです。

# Control の構成図

TEdit を例に構造をまとめると、こうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/8aab5ee5-25e6-7dbe-6852-b2d6ee2ed3b3.png)

実際のやりとりは全て PresentationProxy 配下で行われていることがわかります。

これが解りづらさの原因です。
我々が実体だと思っている TEdit などは、単なる PresentationProxy と Model を保持するだけの、いわばプレースホルダのような状態になっています。

# まとめ

この仕組みはいわゆる MVC (Model-View-Controller) とか MVP (Model-View-Presenter), PM (Presentation-Model) といったアーキテクチャの一種です。
（厳密にどれに当てはまるのか、はちょっとわかりませんでした）

Native Control がサポートされたことで、上記のように VCL のコントロールとは仕組みが全く異なっています。
またしても**「FireMonkey を使う時は VCL の知識を忘れた方がいい」**と良く言っていることが現実になったパターンです。

ということで、FireMonkey のコントロールの動きを探りたい時は Presentation や Model の動作を追うと良くわかります。
【FireStore】複合インデックスについて

#詰まった点
```swift
Firestore.firestore().collection("document").whereField("field", isEqualTo: UserDefaults.standard.object(forKey: "field")!).order(by: "field2", descending: true).getDocuments { (querySnapshot, err) in
// 処理
}
```
以上ようなFireStoreから特定のフィールドをソートして取得する処理で下記のようなエラーが出た。

```
The query requires an index. You can create it here: https://console.firebase.google.com/xxxxx....
```

#原因
###複数のFieldeを指定
先ほどの処理で**where**と**orderBy**で異なるFieldを指定していたため、エラーが起こったみたいです。

#解決策
###複合インデックスの生成
どうやらこの問題を解決するためには、複合インデックスなるものを作る必要があるみたいです。
先ほどのエラー文にあるURLにアクセスすると下記のようなFireStoreでのindexの設定ページに飛びます。
ここでwhereとorderByで指定している２つのfieldを複合インデックスとして登録する事で、無事データを取得できます。
![スクリーンショット 2021-06-29 21.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/0044d706-f551-bdf6-9304-7a0408d204e6.png)
jqueryが使用されているルートディレクトリ以下、全てのファイルを表示するコマンド


#はじめに
運用中のWEBサイトにおいて、JQueryのバージョンをアップデートするため、影響範囲を調べるタスクがあり、jQueryのコードが書かれているファイルを全て把握しなければならなかったため、ここにメモ書きしておきます。

<img width="300" alt="スクリーンショット 2021-02-27 11.08.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/4c59bde7-bb43-876b-5526-6ad361162209.png">

#linuxコマンド

```
ルートディレクトリに移動し以下のコマンド実施

$ grep  -rlF --include='*.html' --include='*.php' --include='*.htm' --include='*.js' "jQuery(" ./* | sort
$ grep  -rlF --include='*.html' --include='*.php' --include='*.htm' --include='*.js' "\$(" ./* | sort

```
jQueryのコードは、`$(`と`jQuery(`、2パターンありますので、2つ検索することでjQueryが使用されたファイルが全てわかります。

`-r`は、ディレクトリ内も検索対象するオプションです。
`-l`は、ファイル名のみ表示するオプションです。
`-F`は、正規表現文字をエスケープせずに検索できる。しかし＄は例外なので、**\＄**としています。

`--include='*.html'`は、検索する拡張子を限定しています。
jQueryが使われる可能性のある拡張子は、`html,htm,php,js`になります。

'sort'で並び替えています。

#疑問
この2つのコマンドを一つにできれば、ファイルの重複が避けられてのですが、分かりませんでした。

#2021年10月10日追記
以下のコマンドによって、正規表現で2つのパターンを検索し、ファイルの重複を避けることができました。

```
grep  -rlG --include='*.html' --include='*.php' --include='*.htm' --include='*.js' "\(jQuery\|\\$\)(" ./* | sort
```
`-G`は、検索に基本正規表現を使うオプションです。

#参考文献
[grepでこういう時はどうする](https://qiita.com/hirohiro77/items/771ffb64dddceabf69a3)
[【 grep 】コマンド――特定の文字を含む行を抽出する](https://atmarkit.itmedia.co.jp/ait/articles/1604/07/news018.html)
リファクタリング覚え書き①

## 記事の概要

・[リファクタリング 既存のコードを安全に改善する](https://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B%EF%BC%88%E7%AC%AC2%E7%89%88%EF%BC%89-%EF%BC%AD%EF%BD%81%EF%BD%92%EF%BD%94%EF%BD%89%EF%BD%8E%EF%BC%A6%EF%BD%8F%EF%BD%97%EF%BD%8C%EF%BD%85%EF%BD%92-ebook/dp/B0827R4BDW/ref=pd_vtp_1/358-4178966-2713523?pd_rd_w=Yb7Gf&pf_rd_p=ae64b7f5-458b-4e9a-9b07-1feecb909091&pf_rd_r=E0Q6Z4VH5D6WKP71F96X&pd_rd_r=8bb5a77d-564b-472c-bd09-788faaea7d83&pd_rd_wg=JO70r&pd_rd_i=B0827R4BDW&psc=1) の内容まとめ。
・ サンプルコードは全て本書のものをそのまま記載しています。

## リファクタリングとは

リファクタリング = ソフトウェアの外部の振る舞いを変えずに内部品質(可読性・拡張性・再利用性等)を改善すること。仕様や機能は一切変更しないことが前提とされます。(リファクタリング前に存在していたバグはリファクタリング後にも残っているべきと言われます。)

外部的な振る舞いが変わっていないことを担保するため、リファクタリングにおいてはユニットテストが重視されています。ユニットテストが書かれていない場合リファクタリングの前にユニットテストを作成する必要があります。
(※ リファクタリングするためにはテストが必要だけれども、テストを書くためにはプログラムがテストしやすい(=ある程度リファクタリングされている)必要があるという卵が先か鶏が先かみたいな話だなあ...と思いました。 )

## リファクタリングの目的

1. ソースコードの可読性を向上させる

ソースコードは書かれる時間よりも読まれる時間の方が長いものなので、読みやすいに越したことはありません。
上手くリファクタリングすれば他のメンバーや未来の自分が楽になります。

2. バグを見つけやすくする

コードが読みやすくなる→バグの所在が分かりやすくなる。
また、ユニットテストがあればバグを早く正確に検知することができます。

3. プログラムの開発速度を上げる

リファクタリングは機能追加の速度を犠牲にしてコードの品質を上げる作業と思われがちですが、高品質なプログラムは理解しやすく、変更しやすいため機能開発もしやすくなります。(ただ、リファクタリングがどのくらいの期間で「モトが取れる」のか定量的なデータが本書にはありませんでした。)

## 感想

・安全にリファクタリングを行うにはユニットテストが重要であるのは納得できました。ただ、ユニットテストが無い場合はどうすればよいか分かりませんでした。
・リファクタリング=機能追加速度を落とすというイメージがありましたが、逆に機能追加を簡単にするという効果があるという認識を持ちました。一方で、開発納期に余裕が無い状況ではある程度コード品質が落ちるのも致し方ないような気もします。
React + Rails API 環境構築 ③Rails側の設定　Rails new,.gitignoreファイルの作成まで

# 概要

- 1からSPAアプリケーションの環境を作っていくので、その手順を残す

### 参考資料：[【Rails】Rails6でAPIモードの環境構築をしっかりやる](https://zenn.dev/akino/articles/bf245128f390d7)

# 環境情報

- ruby : 2.6.6
- rails : 6.1.4

# バックエンド環境構築

## 1. Rails初期設定

- プロジェクトのルートディレクトリにバックエンド用のディレクトリを作成

```
$ mkdir backend
```

- rails new[^1]で雛形を作成
- バージョンは[参考書](https://gihyo.jp/book/2020/978-4-297-11462-6)のバージョンと合わせています現在の最新バージョン(マイナーバージョンまで)

```
$ rails _6.1.4_ new . -d mysql --api
```

- `gibo`で.gitignoreの雛形を作成

`.gitignore`ファイルを自動で生成してくれるライブラリが`gibo`(とはいえ中身は理解して書き換える必要があるが)
参考：[【Rails】.gitignoreの設定について](https://qiita.com/nozonozo/items/011308bf8f903977ac1a)
参考２：[ちょっと待った! Railsでgitリポジトリから除外すべきでないファイル:Gemfile.lockとdb/schema.rb](https://techracho.bpsinc.jp/hachi8833/2014_02_07/15390)

```
$ brew install gibo
$ gibo dump Rails > .gitignore
```
めっちゃ内容ないけどこれでサーバーサイドの最初の最初の設定は終わり。。。
ここまでで一旦commit(実際はcros用のgemもインストールする必要はあるがとりあえずcommit)

# まとめ

- `.Gemfile`と`.Gemfile.lock`は`.gitignore`ファイルに含めない
- `rails new`に`-api`を指定することでAPIモード[^2]に必要なファイルのみを作成する


# 注釈

[^1]: railsプロジェクトを新規で作成するときに使用するコマンド。様々なオプションがある　参考：[Rails newまとめ](https://qiita.com/Islanders-Treasure0969/items/91dafa20ca65bf58000c)

[^2]: フロント側から呼び出すためのリソースを定義するAPIを作成するためのモード。railsではオプションをつけるだけでAPIに必要なgemとディレクトリのみを作成することができる
Pytorch 訓練時にベストモデルを更新する方法

検証時の推定精度が最大値になるたびに`best_model`を更新する例を考えてみます。以下の例では`best_model`が`model`自体を参照しているため、`model`が更新されるたびに`best_model`のパラメータも更新されてしまいます。これではダメです。

```python
model = model.eval()
best_accuracy = 0
...
for epoch in range(100):
    for idx, data in enumerate(data_loader):
                    ...
    if cur_accuracy > best_accuracy:
        best_model = model
        best_accuracy = cur_accuracy
torch.save(best_model.state_dict(), 'model.pt')
```

したがって以下のように`deepcopy`を使いましょう。

```python
import copy
...
model = model.eval()
best_accuracy = 0
...
for epoch in range(100):
    for idx, data in enumerate(data_loader):
                    ...
    if cur_accuracy > best_accuracy:
        best_model = copy.deepcopy(model)
        best_accuracy = cur_accuracy
torch.save(best_model.state_dict(), 'model.pt')
```

もしくは、最高精度が更新されるたびにモデルを保存してしまうのもありです。

```python
model = model.eval()
best_accuracy = 0
...
for epoch in range(100):
    for idx, data in enumerate(data_loader):
                    ...
    if cur_accuracy > best_accuracy:
        torch.save(model.state_dict(), 'model.pt')
        best_accuracy = cur_accuracy
```

# 参考
- https://discuss.pytorch.org/t/save-the-best-model/30430/2
1週間RealmSwiftを勉強してわかった事 Part2

#今回の内容
注：今回は、<font color="Red">**1対1の関係、1対多の関係、逆方向の関連、プライマリキー**</font>に関しては学習途中の為、書きません

* Modelを作成➡️Classとプロパティの宣言
* CRUDのC(Create)➡️データをRealmに追加する

# Realmを使う(Modelを作成)
1.New File...を選択し、Swift Fileを作成します。(ファイル名は、何が書かれてるか連想出来そうな名前にします)
2.作成したSwift Fileに、`import RealmSwift`を記述します。(エラーが<font color="Red">Could not build Objective-C module 'RealmSwift'</font>と表示されたらXcodeの左上の▶️(Ranボタン)でBuildして下さい)
3.`class クラス名:Object{}`でclassを宣言します。
4.`class クラス名:Object{}`の`{}`の中で`@objc dynamic var プロパティ名 = 型()`でプロパティを宣言します。

```swift:Modelファイル
import Foundation
import RealmSwift 

class クラス名:Object {
    
    @objc dynamic var プロパティ名 = 型()
    
}
```
#データをRealmに追加する
1.`do{}catch{}`を用意する。(これで`try`の後の関数で<font color="Red">Error</font>が出ても、アプリが落ちないので`catch{}`内の処理が呼ばれます)
2.`do{}`の`{}`内で、`Realm()`をインスタンス化します。
3.`do{}`の`{}`内で、作成しておいたModel内のクラスをインスタンス化します。
4.Model内のクラスをインスタンス化したので、`@objc dynamic var プロパティ名 = 型()`で宣言したプロパティに値を代入することが出来ます
5.Realmにデータを追加する為に、`try realm.write {}`で<font color="Red">writeトランザクション</font>を作成します。
6.作成した<font color="Red">writeトランザクション</font>の`{}`内にRealmにデータを追加する関数`インスタンス名.add(インスタンス名2)`を書くことでRealmにデータを追加出来ます。

```swift:ModelファイルまたはControllerファイル
import RealmSwift 

do {
        let インスタンス名 = try Realm() //インスタンス化
        let インスタンス名2 = クラス名() //インスタンス化
        インスタンス名2.プロパティ名 = 値

        try インスタンス名.write { //writeトランザクション ここから

            インスタンス名.add(インスタンス名2)

        }//writeトランザクション ここまで

    } catch {

        print("error")

    }
```

# 今回はここまで
* 次回
 * CRUDのR(Read) について書きます　 
 * CRUDのU(Update) について書きます　

今回から、プログラミングらしいことを書いてみましたが、読んでみて間違っている部分などがありましたら
是非、コメントで指摘して頂けると嬉しいです。(間違えないのが1番ですけどね)
Raspberry Pi 4B にWindows11 Insider Preview ARM64を入れて SSDからブート その後４

今回は Windows11 Insider Previewをインストールしてみました

ISOファイルは uup dump から Dev Channel を選択し
  Windows 11 Insider Preview 10.0.22000.51 (co_release) arm64
をダウンロードして作成しました

WOR で Logitec LMD-SPA240U3 に書き込んでラズパイに接続してセットアップします
WOR のバージョンが 2.1.2 になっています
おまじないなしで、画面の解像度を変更しなくても大丈夫でした

１０よりも１１の方が、遅いなりにも待てるかなって思いました
 Office 21 64bit版もインストールできました

ちなみに、この投稿は Windows 11 で行いました
SASテクニック 存在しない水準も含めた要約統計量のデータ作成 classdata/SQL

# SASによる存在しない水準も含めた要約統計量のデータ作成


SASHELP.CLASSで、年齢/性別ごとに集計する
16歳は、男性のみのデータとなっている

![class.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/5d9f9b0c-ace7-ba7e-88ca-8438602cf36f.png)

# 年齢/性別のデータ作成(meansプロシジャで利用)
```sas
proc Sql;
  create table work.CD as
    select A.AGE , B.SEX
    from ( select distinct AGE from sashelp.CLASS ) as A
    cross join ( select distinct SEX from sashelp.CLASS ) as B
    order by A.AGE , B.SEX;
quit;
```
![cd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/c5cdc2ae-bd3d-7a34-f6b8-42306ae74b8e.png)


# classdataの指定せず、シンプルに集計
```sas
%* classdataなし *;
proc Means data = sashelp.CLASS nway noprint;
  class AGE SEX;
  var HEIGHT;
  output out = work.STAT0 n = N mean = MEAN;
run;
```
![stat0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/91a89ea4-b7d7-5fbe-f06c-eee7750e5e07.png)

16歳女性のレコードは作成されない

# classdataを指定して16歳女性のレコードを作る場合
```sas
%* classdataあり *;
proc Means data = sashelp.CLASS classdata = work.CD nway noprint;
  class AGE SEX;
  var HEIGHT;
  output out = work.STAT1 n = N mean = MEAN;
run;
```

# 集計結果とダミーデータをmergeすることで16歳女性のレコードを作る場合
```sas
%* sqlで *;
proc Sql;
  create table work.STAT2 as
    select A.* , coalesce( B.N , 0 ) as N , B.MEAN
    from
      ( select *
        from ( select distinct AGE from sashelp.CLASS )
        cross join ( select distinct SEX from sashelp.CLASS )
      ) as A
    left join
      ( select AGE , SEX , count(*) as N , mean( HEIGHT ) as MEAN
        from sashelp.CLASS
        group by AGE , SEX
      ) as B
    on A.AGE = B.AGE and A.SEX = B.SEX
    order by A.AGE , A.SEX
 ;
quit;
```
![stat1_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/94a69a80-28ac-f14a-9056-448ef06444e1.png)


16歳女性のレコードも含まれる(N=0,MEAN=欠損)

https://documentation.sas.com/doc/ja/pgmsascdc/9.4_3.5/proc/n1tbs0k1djpsbtn1xi0arrt30aby.htm
apacheで、DirectoryIndexに設定したファイルが正常に読み込まれない時の対処

#はじめに

開発環境

MAMP 


#DirectoryIndexに設定したファイルが読み込まれない

httpd.confファイルの一番下の行に、次のようにコードを追加します。

```
Alias /apache "/Applications/MAMP/htdocs/fullstack-webdev/070_Apacheの基礎/"

<Directory "/Applications/MAMP/htdocs/fullstack-webdev/070_Apacheの基礎/">
    DirectoryIndex file1.html
</Directory>
```

Aliasによって、 /apacheに 

```
　"/Applications/MAMP/htdocs/fullstack-webdev/070_Apacheの基礎/"
```
のパスを対応させます。

すると、MAMPのサーバーをリセットしてwebページを立ち上げ、URLに

```
http://localhost:(ポート番号)/apache
```
と入力すると、「070_Apacheの基礎」ディレクトリ内のindex.htmlあるいはindex.phpがページに読み込まれます。

ですが、ここで

```
<Directory "/Applications/MAMP/htdocs/fullstack-webdev/070_Apacheの基礎/dir-test">
    DirectoryIndex file1.html
</Directory>
```
によって、　さっきと同様

```
http://localhost:(ポート番号)/apache
```
をURLに入力すると、 

・もし「070_Apacheの基礎」ディレクトリ直下にindex１.htmlがあればそれが開く
・もし「070_Apacheの基礎」ディレクトリ直下にindex1.htmlがなければ「070_Apacheの基礎」ディレクトリ直下のディレクトリやファイルの一覧が表示される

というどちらかの処理に変わります。
これは、デフォルトではDirectoryIndexがindex.htmlやindex.phpを読み込む設定になっているものを、

```
DirectoryIndex file1.html
```

によってindex1.htmlを読み込むという命令に変更しているからです。

ここで、たまにこのDirectoryIndexにあたらめて設定したファイル(今回はindex1.html)がちゃんと読み込まれず、デフォルトのindex.htmlやindex.phpを読み込んでしまうことがありました。

#対処法
大した方法ではないですが、自分の場合

一度index1.htmlを開いて中のソースを変更して元に戻してしてあげたら

その後サーバーをリセットしたときに正常に読み込むようになりました。

すみません、それだけです。一応備忘録として記事にしました。
laravel ディレクティブ @injectを使ってサービスクラスなどのメソッドをビューで読み込む

# 目的

- 数多くあるディレクティブの一つである`@inject`を使ってサービスクラスなどのメソッドをビューファイルで使う方法をまとめる

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 8.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |
| Node.jsバージョン | v12.14.1 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5) |

# 情報

- 「環境」に記載したものと同様の環境をMacに直接構築して本記事用に動作確認を行った。

# 方法

- bladeファイルで下記のように`@inject`ディレクティブを使用してメソッドを呼び出す。

    ```foo.blade.php
    @inject('クラスを注入する変数名', 'namespaceを含むクラス名')

    {{ $クラスを注入する変数名->呼び出すメソッド名() }}
    ```

# 例

- 下記のようなサービスクラスが定義されていたとする。

    ```アプリ名ディレクトリ/app/Services/TestService.php
    <?php
    
    namespace App\Services;
    
    class TestService
    {
        /**
         * 定義された文字列を返す
         *
         * @return string
         */
        public function returnStr()
        {
            return 'これはTestServiceクラスのreturnStr()メソッドで定義された文字列です';
        }
    }
    ```

- 上記のTestServiceクラスのreturnStr()メソッドをbladeファイルで呼び出したい時、下記のように記載する。

    ```foo.blade.php
    @inject('testService', 'App\Services\TestService')
    {{ $testService->returnStr() }}
    ```

- ローカルサーバーを起動し、当該のbladeファイルがビューとしてリンクしているURLへアクセスすると下記のように表示される。

    ![Document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/177b5312-ab3e-1640-a376-ac02ea206e92.png)


# 参考文献

- [https://readouble.com/laravel/6.x/ja/blade.html](https://readouble.com/laravel/6.x/ja/blade.html)
WebAppsにコードを発行する

## ゴール
配置したWebAppsにコードを発行し、最初のWebページを公開する。

#### 実装
Macでの実装だったので、Visual Studio fo Macをインストール。
以下ページからダウンロード

https://docs.microsoft.com/ja-jp/visualstudio/mac/installation?view=vsmac-2019

新規でソリューションを作成、webアプリケーション（MVC）を選択。
![スクリーンショット 2021-06-29 20.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/90ec4e9b-2399-84b8-7ee6-3ca0de097ea7.png)

作成したソリューションのIndex.cshtmlを以下のように編集

```csharp
@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">This is PraWebApp Page !</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
```

プロジェクトを右クリックで「発行」→「Azureに公開」を選択
![スクリーンショット 2021-06-29 21.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/0a4a76a2-0bba-4fb1-5544-ad877bec0cdd.png)
以降、アカウントにサインイン、公開するリソースを選択し、発行。ページが公開された！
![スクリーンショット 2021-06-29 21.08.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/c510b934-8804-d283-1051-88680521de61.png)

#### やりたいこと
今回のリソースも含めて、ARMで管理したい。
rubyでよく使われる用語のメモ

rubyの良く使われる用語などをアウトプット代わりに個人的にまとめてみたいと思います。


#def(defien)~end

メソッドを定義する際によく使われる用語です、define~end（～を定義する）という意味を持っています。


#permitメソッド、requireオプション

ストロングパラメータといい主にセキュリティーに関する用語です、フォームなどから送られてくるパラメータ（データ）に悪意のあるリクエストなどが送信されてきた場合にデータベースに反映されずデータの漏洩などを阻止してくれてより安全になります。

requireオプションで変更するキーを設定でき、requireメソッドでそのキーに対する値を設定できます。


usersテーブルのname,emailから取り出したい場合は下記のように記述します

``` ruby.rb
def user_params
params.require(:user),permit(:name,:email)
end
```

#include
rubyでモジュールを指定する時に用いることができる用語です、オブジェクト指向プログラミング言語であるrubyではclassやメソッドで処理を定義するのが一般的ですが
それ以外のモジュールを指定する時に使えます。

#include?
特定の文字を検索したいときに使える用語です、検索したい文字がチェックしてfalseかtrueを返します。

#モジュール
ほかの言語で作成された記述をひとまとめにしたものことを言います、このような外部ファイルを読み込む際にincludeが使われます

#
GeneXus Access Manager(GAM) #2　ユーザアプリ認証設定（Web）

[GeneXus Access Manager(GAM) #1　概要・セットアップ](https://qiita.com/sgtrducky/items/87beb336b0e8936692bf) に続きまして、GAMのLocal Authentication Typeで、ユーザWebアプリ側に認証設定を入れる方法を確認します。

# アプリ側認証関連設定
- [GAM use Example: Private web application (wiki.genexus.com)](https://wiki.genexus.com/commwiki/servlet/wiki?15923,GAM+use+Example%3A+Private+web+application)

## アプリログイン画面
上記Wiki文書記載の通り、最も簡単なのは、初期セットアップ時にインポートされたオブジェクト一式に含まれる「GAMExampleLogin」オブジェクトを別名保存して必要な改変を加える方法です。以下の例ではナレッジベース名をGAMSample・ログイン画面をGAMSampleLoginとしたのでややこしいですが、GAMExampleLoginがGAMセットアップ時にインポートされた雛形です。ここではただの別名保存で特に何もしていません。
![GAMBasic01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/b53cd642-8ec2-8c15-b132-9f88764b7109.jpeg)

# ナレッジベースにログイン画面を設定
ナレッジベースのバージョンレベルのプロパティ「Enable Integrated Security」配下の「Login Object for Web」に当該ログインオブジェクト名を指定します。
![GAMBasic02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/8867f1a9-f93f-0574-ffbb-8b63206c0051.jpeg)

# 画面側設定
画面側は（今のところAuthorizationは考慮していないので）、Authenticationの要否を設定するのみです。各画面オブジェクトの「Integrated Security Level」に「Authentication」、「None」を設定します（もう一つの選択肢「Authorization」については別途確認します）。上述のGAMSampleLoginは当然「None」になっています。
![GAMBasic03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/891304ff-9c93-a0f7-e25f-b658662a3746.jpeg)

これにより未ログイン状態で「Integrated Security Level」＝「Authentication」設定の画面へのリクエストをすると、GAMSampleLoginによりログインを求められるようになります。

2021年06月29日　初版
STM32L010とMCP9701で温度をシリアルに出力 (RawSerial)(STM32)


x MCP9701-E/TO 販売コード 103199

x Mbed2のリビジョンは、143
x あまり正確では、ない

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を出力する。

構成
MCP9701-E/TO I-03199

説明
MCP9701は、
0℃の時、400mV
1℃あたり19.5mV
精度は、±4℃
電線が引き出しやすい位置のPA4をアナログ入力にする
計算には、容量削減の為に浮動小数点となるべく割り算は、使わない
MCP9700は、ファミリー、オフセット500mV、10mV/1℃ 今回は、使わない

19.5は、1℃あたりの電圧
3300は、ADCの電圧
400は、0℃

3300/19.5=169.2
400/19.5=20.5

(4096*1692)/4096=1692


式を簡素化


```c++


        //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
        s=((s*1692)>>12)-205;


```

プログラム


```c++

//温度

#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//アナログ入力の設定
AnalogIn adc_vbat(A3); //PA_4
//AnalogIn adc_vbat(A0); //767 303

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767 303
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010
RawSerial pc(PA_2, PA_3); //010

//メイン関数
int main() {

    int s;  //ADCの値
    int n0; //温度　小数点以上
    char data_read[8]; //バッファー

    //無限ループ
    while(1) {

        //adcの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);

        //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
        s=((s*1692)>>12)-205;

        //小数点以上と小数点以下を分ける
        n0=DVI10(s);    // 小数点以上
        s =(s-(n0*10)); // 小数点以下

        //温度の表示
        data_read[0] = '0' + DVI10(n0);
        data_read[1] = '0' + (  n0-(DVI10(n0)*10)  );
        data_read[2] = '.';
        data_read[3] = '0' + s;
        data_read[4] = '\r';
        data_read[5] = '\n';
        data_read[6] = 0;
        pc.printf(data_read); //010
        //pc.printf("%d.%d\r\n",n0,s); //767 303

        //1秒の待ち
        wait_ms(1000);

    } //while

} //main

//容量削減
void error(const char* format, ...){}



```

![adc_9701_010j_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7a63b18b-f199-c591-443e-3bc0af1d2e2b.jpeg)
ITIL Foundation(v3)合格体験記

#はじめに
2021年5月にITIL Foundation(v3)を取得しました。
学習方法などをまとめてみたので参考になれば嬉しいです。
（本記事の内容は2021年6月時点の内容ですのでその点ご了承ください）

#自己紹介
初Qiita記事投稿ということで、簡単に自己紹介します。
人事システムを開発・販売・サポートする会社でSREやってます。
ITILでいうところのイベント管理、インシデント管理、問題管理あたりに従事しています。
開発業務ではGAS/python/Jenkins/PostgreSQL
AWSはEC2,S3,DynamoDB,Cognito,Lambda,CloudWatchあたりをちょこちょこ触ってます。

#ITIL Foundationとは
ITILとは「Information Technology Infrastructure Library」を略したもので、ITサービスの構築や運用に関するベストプラクティス集です。
ITIL資格は4段階（Foundation＜Intermediate＜Expert＜Master）あり、Foundationは入門レベルの位置づけです。
ITIL FoundationはアメリカのGlobal Knowledge社調査[「15 Top-Paying Certifications for 2020（稼げる認定資格 Top15 2020年版）」](https://www.globalknowledge.com/us-en/resources/resource-library/articles/top-paying-certifications/)でトップ10入りする資格だったりします。

試験形式としては、
コンピュータを使った選択式40問出題で試験時間は1時間です。26問以上の正解で合格です。
試験料金が43,890 円とお高いですが、[会社の資格取得支援](https://www.career.works-hi.co.jp/benefits)を利用して受けました（ありがとうございます）
記事執筆時点ではITIL Foundation試験として2011年版のv3と2019年版のv4が選択することができます。
私はまず基本を押さえたかったのでV3を選び受験しました。
（参考書などV3の方が充実しているという印象も。）

#勉強方法
SRE配属になった2年前くらいに[最上千佳子著「ITIL はじめの一歩」](https://www.shoeisha.co.jp/book/detail/9784798158884)を読んでいた、という背景はありますが、
試験対策としては地道に、愚直に、以下内容をループしながらこなしました。

テキストを読む
練習問題を解く(ping-t)
キーワードをノートにまとめる
試験対策をやった期間は3週間(うちGW含む)ほどです。
平日の時間の使い方があまりうまくなく、1日30分取れたらいいほうな感じでした。（仕事終わったらすぐ寝たい）

####テキストを読む
いわゆる”黄色本”と呼ばれる[ITIL ファンデーション シラバス](https://www.shoeisha.co.jp/book/detail/9784798125701)をまず1周読み要点をキャッチアップしました。
章末の確認問題は解いてましたが、試験形式と異なるので試験対策としてはあまり効果はない印象（あくまで当該章の内容確認、という位置づけ）
巻末の模試も実際とは異なるのでスキップして良さそうです。

####練習問題を解く（Ping-t）
[Ping-t](https://ping-t.com/)という問題集サイト（ITIL問題は無料）
こっちの模試でコンスタントに80%以上の正解を取れるようになるまで解きました。
携帯でもできるので夜寝る前とかちょこちょこあいた時間を使ってやりました。
間違えた問題、迷って選んだ問題についてはフラグを付けておいて後から解説読むようにもしました。
![iOS の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1297607/54328a2a-1af3-fe6b-26f7-34222eaf8f26.png)


1回で受かりたい気持ちから念には念を入れて結構解きましたが、実試験を受けた感触としてはここまでやらなくても大丈夫だと思います。

####ノートにまとめる
サービス・ライフサイクルの５つのフェーズのそれぞれでどの管理が属しているか、をざっとまとめつつ、
Ping-tで間違えた内容や、
「サービス〇〇」、「〇〇モデル」など似たワードが多いので要点・キーワードをまとめながら進めました。
（グーグルドキュメントとかにまとめながらできると効率的なんだろうと思いつつ、、
　私はこういうとき手書きでノートにまとめないと頭に入らない…そして乱筆すぎるので写真掲載は控えます。。）

他の合格体験記を見てると[CramMediaの問題集](https://www.crammedia.com/EX0-001-ITIL-Foundation-syllabus-2011/p/247/204)(30日6000円)を購入して解いた、という方もお見掛けしましたが、私は利用せず。（その分ping-tで入念に対策）


#実際の試験について
[ピアソン](https://www.pearsonvue.co.jp/Clients/PeopleCert.aspx)と[プロメトリック](http://it.prometric-jp.com/testlist/peoplecert/)で受けることができますが、私はピアソンで受けました。
ピアソンは24時間前まで予定変更受け付けてくれるのありがたい…（プロメトリックは3営業日前（土日受験の場合は4営業日前）の23時59分までとのこと）

テストセンターに出向いて受けました。
試験室には、身分証・私物預けたロッカーのカギ・A4サイズのメモ用紙1枚、ペン1本だけが持ち込み可能でした。（身分証以外はテストセンターで用意されたもの）

一通り問題解く＆見直すの2周したところで25分程度経過、
残り時間は
黄色本や問題集サイトに載ってなかったよ！な5問で時間を使って粘ってました。
（5問なら落としても受かるんじゃないかとは思ったけれどせっかく時間残ってるし、と。）

CBTということで、各問題ごとにメモ取る機能や後から見直すフラグが用意されていて、最終問題解いた後の画面からフラグ立てた問題にジャンプできるようになってました。


#結果
38点で合格でした！
試験結果は試験直後に確認ができ、デジタル合格証は3日後にメールで受け取りました。


#参考文献

https://www.shoeisha.co.jp/book/detail/9784798158884

https://www.shoeisha.co.jp/book/detail/9784798125701

そして記事を書くにあたっては、以下記事をお手本にさせていただきました！
ありがとうございます。（わたしもAWS資格がんばりたい）

https://qiita.com/kabik/items/ff8d3d1f71f044525385
Unity個人開発者、鉄の掟

# こんばんわー
この記事では自分が個人Unityゲーム開発者をしていて心にとめておいた方が良いと感じたことについて書いておきます。
Unity版リーダブルコードというか、途中知ってたら楽になる、みたいな記事が書けたら良いな。
Unityじゃなくても個人開発者に通ずる、たびたび耳にする教訓みたいなものも書いておくので、ゲーム開発者なら共感する部分もあると思います。

# 第1章　愛と涙の心得編
この章ではゲーム開発者としてスタート地点に立つための心得を置いておきます。
### 言葉よりも先に手を動かせ！
残念ながらTwitterなどで「今日からやります！」とか「Unityを勉強します！本買いました！」っていう人ほど消息を絶ちやすい。おそらくこれは「やる気があることを示した」という事実でもう満足してしまっている人だと思う。強い個人開発者はスクショで語る。
### とりあえず動けば良い！
ある機能について「理解を完璧にしてから」は無理だし挫折しやすい。「自分の作りたいゲーム」が「動く」ことまで最短距離でダッシュしろ、かかる時間は少なければ少ないほど良い。最悪(常識の範囲内で)コピペでも良い。Googleをフル活用しろ。
### リファクタはするな！
これは特に初心者に言いたい。ゲーム開発初心者はコードを書く機会が増えたためプログラミング技術の実感を感じやすく、すぐリファクタしたがる。たしかにそれは上達する良い機会だが、残念ながら初心者のリファクタは間違いが多い。特に変にクラスを作ってしまうとかえって保守性が悪くなる。初心者のうちはUpdate内に直書きしていけ。
### アセットを買え！
特に3Dの場合はもはやアセットを買うだけでゲームができてしまう。自分がなぜゲームを作るのか、どんなゲームが作りたいのかと相談してフルスクラッチは最後の手段にしよう。
### 最初は簡単な動作から作れ！
最初からAPEXやFortniteのようなゲームは作れない。最初は「四角形をプレイヤーが動かせて、四角形が弾を発射するようになって、四角形がキャラクターに置き換わる」のように加算式で開発をしよう。そうじゃないと「動いた」という達成感が得られないため挫折しやすく、どの機能も中途半端なまま終わりやすい。
### アイデアをちゃんとまとめろ！
アイデアは出しても良いが、実装の順番をつけよう。必須項目と「あったらいいな」という項目に分けよう。じゃないとどこから手を付けたらいいか分からず、作業開始のモチベーションが低くなる。
### デバッグはできるだけするな！
機能ごとのデバッグはその時に必要だが、ゲーム全体のデバッグは後回しにしよう。じゃないとデバッグに時間がかかりすぎてなかなか全体像が見えてこない。一通り実装を終えたあとデバッグすることで後どの程度で完成するのかが実感できる。

# 第2章　友情のエディター編
この章では「言われないと分かんないよぉ」となったポイントについて解説していきます。

### UIはUIを使え！
UIは専用のUGUIが存在する。create→UIからImageやButtonなどを生成できる。UIはCanvasというオブジェクトの子として生成されて分かりにくいが、UI系はすべてこの中に入れるものなんだと理解すれば良い。間違ってもWorld座標のSpriteRendererなどで作らないように(ただし位置が関係するような特別なUIを除く)。特にButtonやScrollViewなどはどのゲームにも必須とも言える。

### 神のアセットを使え！
TextMeshProやDotweenは誰もが使うような神アセット。あるとないとでは選択肢の幅や難易度に大きな違いが生じる。こういう便利なアセットがあるということを覚えておき、いつでも利用できるようにしておこう。

### Vector3は右クリックでコピーしろ！
Vector3やColorなどはエディター上でも右クリックでコピーできる。


# 裏切りのスクリプト編
ここにはスクリプトを書く際に普段使っているテクニックを残しておきます。
### GameObject/コンポーネントのインスタンスはSerializeFieldでアタッチしろ！
GameObjectやコンポーネントをScriptで制御するときFind()してますか？それ[Serialize Field]を変数名の前に付けるだけでstring直書きしなくてもよくなりますよ。

### シーン間で値を共有したいときはstaticを使え！
staticはあまり使用が好まれていない(理由は謎)ですがScene間で変数を共有したい時、例えばステージセレクトシーンとゲームシーンがあり、ステージセレクトで選んだボタンによってステージの構造を変えたい場合はStaticを使おう！staticではシーン遷移で値が変更されずかつインスタンスを用いない参照ができるのでクラス名.変数名で簡単にアクセスできる。

### UpdateではTime.deltaTimeを掛けろ！
ちなみにFixedUpdateでいいじゃん、っていう人はもう宗派が違うのでそれ使ってください。Updateでは1フレームにかかった時間が違うのでいいスペックのパソコンは速く移動し、悪いスペックのパソコンは移動が遅くなる、ということがありえる。必ずオブジェクトの移動や回転には値 * Time.DeltaTimeをすること。

### 配列を使うな！リストを使え！
配列とリストの基本的な使い分けは「数が固定なら配列」だが、基本的にすべてリストを使おう。じゃないと自分がリストを再開発することになる。

### 回転にはLocalEulerAngleを使え！
Quaternionとかあるがこれで回転を設定するのは素人には無理。より簡単なEulerAngleがどっかにあるからそれを使おう！

### ネストは浅くしろ！
例えば以下のコードはネストを浅くすることができる。

```C#
if(mustBeTrue == True){
  aaaa = 0;
}
//は
if(!mustBeTrue) return;
aaa = 0;
```

三項演算子を使うことも視野に入れよう

```C#
whenAbeC = D;
if(value == A) whenAbeC = C;
//は
whenAbeC = value == A ? C : D;
```

となる。ネストを浅くすることは見やすくなるだけでなく関数化が簡単になったり、より簡潔な表現が見つかる。もし「下にも別の処理が続いてreturnは使えないよ」という方は関心を分離することをお勧めする。

# おしまい！
いかがでしたか。ちょっときつい口調で書いてしまったのですが、それによってより当事者意識を持ってくれればなと思っています。まぁこんなの覚える必要はなく、忘れてもらって構いません。記憶の奥の奥に置いておいて、いつかふと思い出す「たしかあんなこと言ってたな」
ぐらいでだいぶ変わると勝手に思っています。

最後に僕の好きなフレーズというか、20年の短い人生で学んだことを一つ置いてお別れのあいさつにしたいと思います。



「人間同じような能力、
同じような思考の奴らが数百万といる。
彼らと自分の違いは

やった　か　やってない　か。」
TypeScript(JavaScript)で複数の非同期関数を直列に実行したい


複数の非同期関数を**並列に**実行する方法は簡単です。Promise.allを使うだけです。

```typescript
/*
 * 1秒待機してからテキストをコンソール出力する非同期関数
 */
function asyncFunc(text: string) {
  return new Promise<void>((resolve) => {
    setTimeout(() => {
      console.log(text);
      resolve();
    }, 1000);
  });
}

(async function main() {
  console.log("start");
  const promises = ["1", "2", "3", "4", "5"].map((str) => asyncFunc(str));
  await Promise.all(promises); // 並列実行して全ての完了を待ち合わせる
  console.log("end");
})();

/* 実行結果 (1~5はほぼ同時に出力される）
start
1
2
3
4
5
end
*/
```

## やりたいこと
では、全ての非同期関数を**直列に**実行するにはどうすればいいでしょうか。

結論から書いてしまうと以下です。

```typescript
/*
 * 1秒待機してからテキストをコンソール出力する非同期関数
 */
function asyncFunc(text: string) {
  return new Promise<void>((resolve) => {
    setTimeout(() => {
      console.log(text);
      resolve();
    }, 1000);
  });
}

(async function main() {
  console.log("start");
  await ["1", "2", "3", "4", "5"].reduce(async (acc, cur) => {
    await acc;
    return asyncFunc(cur);
  }, Promise.resolve());
  console.log("end");
})();

/* 実行結果 (1~5は１秒毎に出力される）
start
1
2
3
4
5
end
*/
```
複数の非同期関数を直列に実行するAPIは用意されていないので、自分でreduceなどを使って書く必要があります。
大したコード量ではないですが、初心者としては[Array.reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)はとっつきにくいですし、並列実行のコードよりは見通しが悪いかもしれません。
そう思った場合、同期実行部分を以下のようにutility関数にしてしまうと多少見通しが良くなります。

```typescript
/*
 * 1秒待機してからテキストをコンソール出力する非同期関数
 */
function asyncFunc(text: string) {
  return new Promise<void>((resolve) => {
    setTimeout(() => {
      console.log(text);
      resolve();
    }, 1000);
  });
}

/*
* 非同期関数の配列を渡すと直列実行するutility関数
*/
async function syncronize(asyncFuncs: Array<() => Promise<any>>){
  return asyncFuncs.reduce<Promise<any>>(async (acc, cur) => {
    await acc;
    return cur()
  }, Promise.resolve())   
}

(async function main() {
  console.log("start");
  const asuncFuncs = await ["1", "2", "3", "4", "5"].map((str) => () => asyncFunc(str));
  await syncronize(asuncFuncs); // 非同期関数の配列を直列に実行
  console.log("end");
})();

/* 実行結果 (1~5は１秒毎に出力される）
  start
  1
  2
  3
  4
  5
  end
  */
```
utilityに切り出したコード量は少ないですが、ややこしい部分を多少外に出すことができました。

tips程度の内容ですがググったら意外とHitしなかったので、誰かの助けになればという思いで記事にしておきます。