OmniAICreator/Qiita-1.07M huggingface dataset:
pytorch-lightning (0.5.3.2) でEarly Stoppingを使用したときに'val_loss'が見つからないと言われるバグ

## 前提

(※**2020年1月9日**の記事です。近い将来問題なくなると思います。)

Pytorch LightningはPyTorchのKerasライクなラッパです。
モデル・学習・データ周りをコンパクトに書けることが魅力です。

詳しくは@fam_taroさんの下記記事をご覧ください。

[PyTorch 三国志（Ignite・Catalyst・Lightning） - Qiita](https://qiita.com/fam_taro/items/c32e0a21cec5704d9a92)

とても便利な感じがするのですが、インストール早々バグにぶち当たってしまったので、その内容と解決方法の報告です。

## 環境

OS: macOS 10.14.6
Python: 3.7.3
pytorch-lightning: 0.5.3.2
Pytorch Lightningのインストール方法: `pip install pytorch-lightning`

## バグ

Pytorch LightningにはEarly Stoppingが実装されていて、
以下のようなコードで記述できます（スッキリ）。

```python:モデル定義部分(抜粋)
import pytorch_lightning as pl
class MyModel(pl.LightningModule):
    ...
    def validation_step(self, batch, batch_nb):
        x, y = batch
        y_hat = self.forward(x)
        return {'val_batch_loss': F.cross_entropy(y_hat, y)}

    def validation_end(self, outputs):
        val_loss = torch.stack([x['val_batch_loss'] for x in outputs]).mean()
        log = {'val_loss': val_loss}
        return {'log': log}
    ...
```

```python:Early_Stopping周り
early_stop_callback = EarlyStopping(
    min_delta=0.00,
    patience=1,
    verbose=False,
    monitor='val_loss',
    mode='min',
)
model = MyModel()
trainer = pl.Trainer(early_stop_callback=early_stop_callback)
trainer.fit(model) 
```

しかし、いざ実行すると、以下のようなエラーが出てきてうまく動きませんでした。
(常に発生するのかは把握できていませんが、とりあえず私の実行環境では常に再現されました。)

```
Early stopping conditioned on metric `val_loss` which is not available. Available metrics are: loss,train_loss
```

このバグは公式のIssueでも報告されています。

[https://github.com/williamFalcon/pytorch-lightning/issues/490](https://github.com/williamFalcon/pytorch-lightning/issues/490)

## 解決方法

最新のmasterブランチでは修正されているので、下記コマンドでインストールするとバグが直ります。

```bash
pip install git+https://github.com/williamFalcon/pytorch-lightning.git@master --upgrade
```

### 注意点

最新ブランチをインストールすると、[**2020年1月9日**現在のドキュメント](https://williamfalcon.github.io/pytorch-lightning/)とAPIの齟齬が生じる場合がありそうです。

例: チェックポイント保存用クラス`pytorch_lightning.callbacks.ModelCheckpoint`の初期化メソッドの引数変更([該当ページ](https://williamfalcon.github.io/pytorch-lightning/Trainer/Checkpointing/))

  - `pip install pytorch-lightning`でインストールした場合(公式ドキュメントと同じ)
    - **`save_best_only`**: 最良モデルのみを保存するか否かをBool値で指定
  - 「解決方法」のコマンドで最新ブランチをインストールした場合(公式ドキュメントと異なる)
    - **`save_top_k`**: 上位何個を保存するか整数で指定
    - (`save_best_only`は取って代わられる形で削除)

恐らく、0.5.3.2を超えるバージョンが公開されたら、通常の`pip install pytorch-lightning`で大丈夫になると思います。

## 参考

- [PyTorch 三国志（Ignite・Catalyst・Lightning） - Qiita](https://qiita.com/fam_taro/items/c32e0a21cec5704d9a92)
- [Pytorch Lightningのリポジトリ](https://github.com/williamFalcon/pytorch-lightning)
- [Pytorch Lightningのドキュメント](https://williamfalcon.github.io/pytorch-lightning/)
- [バグ報告&修正Issue](https://github.com/williamFalcon/pytorch-lightning/issues/490)
- [修正版インストール方法](https://github.com/williamFalcon/pytorch-lightning/issues/670)
yarn workspaceで同一workspace内のパッケージを追加するときの注意点

yarnのworkspaceでモノレポしてる時に、workspace内のパッケージから同一workspace内のパッケージを追加しようとしたら、少し意図せぬ動きをしたのでメモ書き。

具体的には、add時にバージョン指定するとローカルのものが使われて、バージョン指定しないとnpmのサーバに取りに行く(ローカルはみない)動きになるみたい。

どうやら下の現象みたい。
https://github.com/yarnpkg/yarn/issues/4878

# 環境
yarnのバージョンはこれ

```shell
$ yarn -v
1.21.1
```

# ファイル構成
こんな感じ

```shell
$ ls -R
package.json  packages/

./packages:
common/   test-app/

./packages/common:
package.json

./packages/test-app:
package.json
```

```json:package.json
{
  "private": true,
  "version": "0.0.0",
  "workspaces": [
    "packages/*"
  ],
  "license": "MIT"
}
```

```json:packages/test-app/package.json
{
  "name": "test-app",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {}
}
```

```json:packages/common/package.json
{
  "name": "common",
  "version": "1.0.0",
  "license": "MIT"
}
```

# 事象
前述の環境で、以下のコマンドでtest-appにcommonを追加してみる。

```shell
$ yarn workspace test-app add common
yarn workspace v1.21.1
yarn add v1.21.1
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
info All dependencies
└─ common@0.2.5
✨  Done in 0.38s.
✨  Done in 0.67s.
```
commonはnpmに上がっている方のcommonが利用されている…(https://www.npmjs.com/package/common)

今度は、バージョン指定ありでcommonをインストールしてみる。

```shell
$ yarn workspace test-app add common@*
yarn workspace v1.21.1
yarn add v1.21.1
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
info All dependencies
└─ common@1.0.0
✨  Done in 0.12s.
✨  Done in 0.41s.
```

今度はローカルにある方のパッケージが追加されている。
一度消して、再度インストールしてみても同じ。

```shell
$ rm -rf node_modules 
$ yarn install
yarn install v1.21.1
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
✨  Done in 0.11s.
$ yarn list
yarn list v1.21.1
├─ common@1.0.0
└─ test-app@1.0.0
   └─ common@*
✨  Done in 0.07s.
```

ちなみに、ローカルのパッケージをインストールした時は、yarn.lockファイルは更新されないみたい。

```:yarn.lock
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


```

# 結論

yarnでworkspace使ってる時に依存関係でローカルのパッケージを追加したいときは、バージョン指定する！
そもそも公開する予定の無いパッケージでも事故を防ぐためにnpmに登録されているものとは別の名前を使っといた方が良さそう。

あ、あと、yarn workspaceコマンドで指定するworkspace名はパッケージの名前なので注意。
初心者エンジニアが今日使ったコマンドまとめてみた

私の投稿ではその日学んだことをアウトプットすることをメインとしております。
表現が適切でない場合や、間違いがあればコメントにてご指摘いただけると嬉しいです。
よろしくお願いいたします。
<h1>今日使ったコマンド
<p>db2 "CONNECT TO [DB名]"
→データベースへ接続するときに使うコマンド

db2 "CREATE SCHEMA [スキーマ名]"
→スキーマの作成

chmod
→パーミッションの設定

mkdir [ディレクトリ名]
→ディレクトリの作成
nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /usr/local/etc/nginx/nginx.conf:101

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#nginxを起動した際に起きたエラー

```apache

nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /usr/local/etc/nginx/nginx.conf:101
```

どうやらsslは推奨されていないみたいで、sslではなくlistenを使用する必要がある様です。
以下の様にlistenでsslを指定してみたらエラーを回避できました！

```apache
server {
	#listen 443; 
	listen 443 ssl;
	server_name xxx.xxxx.com;

	#ssl on;  
	index index.html;
	ssl_certificate   /usr/local/nginx/cert/api/xxx.pem;
	ssl_certificate_key  /usr/local/nginx/cert/api/xxx.key;
	ssl_session_timeout 5m;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on;

	location / {
	proxy_set_header  X-Forwarded-Host $host;
	proxy_set_header  X-Forwarded-Proto $scheme;
	proxy_set_header  X-Real-IP  $remote_addr;
	proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header Host $http_host;
	proxy_redirect off;
	expires off;
	sendfile off;
	proxy_pass http://xxx.xxx.com;
      }
}
```

#参考記事
・[Nginx設定のまとめ](https://qiita.com/syou007/items/3e2d410bbe65a364b603/)
・[Nginxの設定ファイルいじったらプロセスが閉じなくなった](https://program-juku.com/2019/02/13/post-95//)
・[他のプロセスがポートを占有してnginxを再起動できない](https://qiita.com/Yu-s/items/64c54def20e5fa64edd1/)
・[nginx コマンド超シンプル早見表](https://qiita.com/katzueno/items/44e02db2f1bfa0de5860//)
・[nginxで502 Bad Gatewayになる原因](https://www.bit-hive.com/articles/20190319/)
・[ginxの初期の設定ファイルを読み解いてみよう](https://www.y-techmemo.work/entry/2018/05/16/182700/)
・[macでもnginxを動かしてみた](https://jp.axtstar.com/?p=363/)
・[nginx配置ssl报错](https://blog.csdn.net/LinHenk/article/details/86742102/)
・[nginxでSSL通信設定をした際のエラーの対処](https://higherhope.net/?p=2710/)
転職日記4日目

今日はAWSの本2冊とGitの本、そしてDockerの本を買いました。
正直Udemyとかprogate、ドットインストールで十分じゃないかと思っていましたがAWSが理解できなかったのと、来月20日で仕事を退職することにしたのでもう四の五の言ってる場合ではないという自分の覚悟も決めました。

いままでwindowsで学習していたのですが、Macを買おうとも思っています。

おそらく現在web系エンジニアを目指している方がた、年齢は様々ですが、自分の生活を変えたいから、将来が不安だから、家族を養っていきたいからなど、様々な事情を抱えていると思います。

自分もそのうちの一人ではあるのですが、この転職をしっかり成功させて、誰かの道しるべになれればいいと思っています。（かっこつけすぎですね）

そして今日から、その日の最後に自分をほめることも始めたいと思います。

それはどういうことかというと、年を取ってくるとだんだん人から褒められるということが無くなってきます。それに、できないことばかりに目が行きがちでモチベーションも下がるし、必要以上に自分を下に見てしまいます。そうなると何もできなくなってしまうので、ちょっとのことでいい、例えば、HTMLを書いてみたとか、本を読んで学習したとか、朝早く起きれたとかそんなことでいいので、とにかく落ち込むという無駄な時間をなくすためにも悪いところよりも、今日やれたこと、覚えたことに目を向けて頑張っていきたいと思います。
基本情報技術者　テクノロジ系　第4章 コンピュータシステムの構成

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより

続いて第4章です。

# システム形態

## パッチ処理
データを蓄積して、指定時点で一括処理

## オンライントランザクション処理
データ発生のたびに行う、データは通信回線で送る


## リアルタイム処理
センサの信号に順次に反応して指示を出す。

## 3層クライアンどサーバシステム
3層アーキテクチャともいいます。

第一層　プレゼンテーション層: プラウザ
第二層　ファンクション層: プログラム
第三層　データ層: データベース

## クラウドシステム
インターネットを利用して
どんな時でもデータを使うことができること

### スケーラビリティ
必須に応じて性能を変えられる

## 仮想化技術

パソコンないで別のパソコンを動かすようなもの
パソコンゲームの中でパソコンを使うような感じ

### ゲストOS
仮装マシンにインストールするOS

### ホストOS
普通のパソコンに通常使用と合わせて
ゲストOSを稼働してる状態

### ハイパパイザ型
複数のゲストOSのみで稼働してる状態

### VDI(Virtual Desktop Infrastructure)
仮装マシンにクライアントのデスクトップ環境構築し
ネットワーク経由で利用する

VDIは仮装マシンサーバへの接続に必要なソフトウェアしか入ってません

# システム性能

## MIPS
一秒間に実行できる命令数を百万単位で表す指標

## 命令ミックス

各命令を以下のように計算し総計します。

1命令あたりの平均実行時間= 

(命令種類1 x 出現頻度　x 1命令あたりの実行時間(ナノ秒))
+
同文
+
同文...

よってMIPSは

MIPS = 1/1命令あたりの平均実行時間
と出てきます。

これが命令ミックスです。

## FLOPS
1秒間に実行できる浮動小数点演算の回数

## スループット
単位時間にコンピュータが処理できる仕事の量

## スプーリング
高速補助記憶装置を介して、低速出力装置へ出力する仕組み
稼働をまっていては遅いだけなので
HDに一旦情報を入れておくこと

## レスポンスタイム
処理から表示まで

オンライントランザクション処理システム

## ターンアラウンドタイム
入力から結果まで

パッチ処理

## スケールアップ
性能向上

## スケールアウト
サーバなどの台数を増やす

## ベンチマークテスト
テスト用プログラム

# システム信頼性

## RASIS
RASISとは、コンピュータシステムに関する評価指標の一つ

「R」Reliability（信頼性）。故障しにくいこと。 MTBF
「A」Availability（可用性）。高い稼働率を維持できること。
「S」Serviceability（保守性）。障害が発生した場合に迅速に復旧できること。MTTR
「I」Integrity（保全性）。データが矛盾を起こさずに一貫性を保っていること。
「S」Security（安全性）。機密性が高く、不正アクセスがなされにくいこと。

### MTBF
大きいほどよし

稼働開始から障害までの
の平均値を求める

### MTTR
小さいほどよし

障害から復旧までの
平均値を求める

### 稼働率

稼働率= MTBF/(MTBF+MTTR)

### 故障率

故障率=1/MTBF

### バスタブ曲線
故障率の時間経過グラフ

# 複数装置から構成されるシステム稼働率

## 直列
各装置をかけた値
AxB

## 並列

1-(1-A)x(1-B)

## 直列、並列出ない場合
格場合の確率を合計して計算します。

## 直列、並列両方の時
各部分を計算して単純化します。

# 高信頼化技術

## フォールトトレランス
障害が発生しても継続して動作できること
非常用電源など

### 冗長機構
同じ役割を担う装置を複数構成すること

### デュプレックスシステム
片方稼働

#### ホットスタンバイ
早く待機系に変わる

##### コールドスタンバイ
切替に時間がいる

## フォールトアボイダンス
障害の発生そのものを防ぐ
高級品にして滅多に起こらないようにすること

## フェールセーフ
故障時にできるだけシステムを安全な方向へ導くこと

## フェールソフト
故障した部分を切り離してでも
動作を継続させる

### 縮退運転(フォールバック運転)
機能低下でも動作すること

## フールループ
人為ミスが発生しないように設計

## フォールトマスキング
外部から故障が出てることをわからないようにする。

## デュアルシステム
同時稼働
webpack-dev-server使用時にSPAが操作するhistoryのpathに対して同じhtmlを返す

## TL;DR

SPAがhistoryに送ったことで形成される、物理的に存在しないpathでもwebpack-dev-serverでSPA利用を続けたい。
configでかいけつできた。


## 本論

### 問題点

webpack-dev-serverでSPAをloadするhtmlをserveしている場合、当然outputに指定した物理pathではdocumentが返却される。
一方でSPAでhistory.pushしたpathでdocumentごとリロードしてしまうと、当然そのpathに対応するhtmlはないので404になってしまう。

間違ってリロードすると元のpathにアクセスしてSPA操作しなおさないと同じ状態にもどれなくて非常にストレスなのでどうにかしたい。

### 解決策

`wepback.devServer.historyApiFallback`を使う。

https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback

### 記述例

- index.htmlをSPAのマウントに使用
- rootは`/` (= `/index.html`)
- `/`以降のpathに対する全リクエストに対して、index.htmlを返す

```js
historyApiFallback: {
  rewrites: [{ from: /^\/*/, to: '/index.html' }],
},
```

## 感想

便利。もっと早くやっとけばよかった。
記事タイトルの日本語がむずかしい。

## ちなみに

webpackでbuildで生成したものたちはnetlifyにデプロイしている。
netlify側ではリダイレクトの設定をしている。
[リダイレクト設定の記事](https://qiita.com/sayuprc/items/edf82361e3d6d9d169dd)
Azure Automation と SharePoint PnP を利用したナビゲーションメニューの追加方法について

# 初めに
[前回記事](https://qiita.com/daichan3/items/f963a7d7c3dd9501fce8)の続きということで、今回は SharePoint PnP に関する投稿となります。
SharePoint Online のサイトを自動で作るまでは良かったのですが、作った後にいろいろとサイトをカスタマイズしたかったわけです。
ナビゲーションメニューの設定は、「Microsoft.Online.SharePoint.PowerShell」のコマンドでは設定できないため、SharePoint PnP を利用することになりました。

そこで、だい³がドはまりした内容を踏まえて記事起こしておきたいと思います。

# 参考にしたサイト

[Add-PnPNavigationNode -SharePoint PnP Reference-](https://docs.microsoft.com/ja-jp/powershell/module/sharepoint-pnp/add-pnpnavigationnode?view=sharepoint-ps)
[Add-PnPListItem - failing in RunBook on Azure Automation](https://github.com/SharePoint/PnP-PowerShell/issues/1541)

# 環境
- Office 365 開発者プログラム (SharePoint Online)
- Azure Automation 無料サブスクリプション
- Microsoft.Online.SharePoint.PowerShell 16.0.19515.12000 → 今回は使ってない。
- SharePointPnPPowerShellOnline 3.16.1912.0 → モジュールインストールは前回記事を参照してください

# SharePoint PnP でのナビゲーションメニュー設定方法
基本的には以下のコマンドでナビゲーションメニューは設定できます。
ですが、だい³の環境では以下の事象が発生。
- ローカル実行の PowerShell では正常にナビゲーションメニューを設定できる
- Power Automation 環境では、３回実行に失敗し異常終了となる ※なぜかナビゲーションメニューはできてる。でも異常終了。

```PowerShell
# Credentials 情報を設定
$myCred = Get-AutomationPSCredential -Name 'o365connection'

# ナビゲーションメニューを設定したいリストを指定して Connect
$mySite = "https://<tenant>.sharepoint.com/sites/hoge/"
Connect-PnPOnline -Url $mySite -Credentials $myCred

Add-PnPNavigationNode -Title "yahoo" -Url "https://yahoo.co.jp" -Location "QuickLaunch"
```

# コマンド修正
Add-PnPNavigationNode -Title "yahoo" -Url "https://yahoo.co.jp" -Location "QuickLaunch"
↓↓
$addPnPNavigationNode = (Add-PnPNavigationNode -Title "yahoo" -Url "https://yahoo.co.jp" -Location "QuickLaunch")

```PowerShell
# Credentials 情報を設定
$myCred = Get-AutomationPSCredential -Name 'o365connection'

# ナビゲーションメニューを設定したいリストを指定して Connect
$mySite = "https://<tenant>.sharepoint.com/sites/hoge/"
Connect-PnPOnline -Url $mySite -Credentials $myCred

$addPnPNavigationNode = (Add-PnPNavigationNode -Title "yahoo" -Url "https://yahoo.co.jp" -Location "QuickLaunch")
```

# 原因
よくわからんですが、冒頭に紹介したサイト(https://github.com/SharePoint/PnP-PowerShell/issues/1541) に書いてあったのは、Azure Automation 上で PnP コマンドを実行する際、リターン オブジェクトをキャッチせずに PnP コマンドを実行するだけだと、Azure Automation がご立腹になるということ。
戻りオブジェクトが必要ない場合でも、PnP アクションの結果を変数に格納することで回避することがわかっています。

(2020/8/2 追記)
Azure Automation の Runbook 実行時のトラブルシューティングに関する Docs が公開されてました。
[Runbook の問題のトラブルシューティング](https://docs.microsoft.com/ja-jp/azure/automation/troubleshoot/runbooks#scenario-cmdlet-fails-in-pnp-powershell-runbook-on-azure-automation)
PnP の結果は標準出力に出しちゃうとダメみたい。理由はよくわからない・・・

# 対処
実行結果は変数に入れてあげてください・・・。
【追記】Azure Automation の Runbook で PnP 使う時のおまじない！


```PowerShell
$addPnPNavigationNode = (Add-PnPNavigationNode -Title "yahoo" -Url "https://yahoo.co.jp" -Location "QuickLaunch")
```
# 大事なこと
どうやら、Add-PnPNavigationNode コマンドに限った話では無いみたいで、ほかのコマンドでも同様の事象が発生することがあるとのこと。
同じようなエラーに遭遇された方は PnP アクションの結果を変数に入れて見られてはいかがでしょうか。
三角関数の微分はなぜ逆になるのか

## sinとcosの微分

$sin \theta$と$cos \theta$の微分がどうして逆になるのか謎だったのですが、
図でみるとめっちゃくちゃわかりやすかったので、まとめてみます。

まず、結果をおさらいしておきます。sinとcosの微分はそれぞれ、

$$
\frac{\partial sin \theta}{\partial \theta} = cos \theta,\  
\frac{\partial cos \theta}{\partial \theta} = - sin \theta
$$

高校数学の数IIIの範囲らしいのですが、私は文系なのでやった覚えはありません！（いいわけ）
大学院の授業で前提知識として出てきたのですが、なぜ微分するとsinとcosが逆になるのか謎でした。
調べてもいまいちよくわからなかったのですが、図で考えるととてもわかりやすくなりました。

## 図でみてみる

三角関数でよくみる、半径1の単位円を考えてみましょう。（図書くの難しい...）


![図：単位円書くの難しい](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255247/60c3d456-7d37-f816-2733-c8ad39b7203a.jpeg)



ここからが面白かったところです！
実は、赤く囲まれた扇形のような部分は、$\Delta \theta$ を限りなく小さくすると、三角形になります！

できた三角形斜辺の部分は、もともと半径1の円の弧の長さなので、$\Delta \theta$になります。また、高さは $sin(\theta + \Delta \theta) - sin \theta$、底辺は$cos \theta - cos(\theta + \Delta \theta)$になります。


ここで、微分の定義から、

$$
\frac{\partial sin \theta}{\partial \theta} = 
\lim_{\Delta \theta \to 0} \frac{sin(\theta + \Delta \theta) - sin \theta}{\Delta \theta}
$$

なので、右辺は赤い三角形の辺の長さの比で表されることがわかります。



次に、この三角形と相似関係にある別の三角形を探して、この比を簡単に表せないか考えます。
実は、青の三角形が赤の三角形と相似になっています。直角の部分と、$\alpha$とかかれた部分の
角度がそれぞれ等しいことから、これらが相似であることがわかります。（中学校の数学が懐かしい！）

さて、赤と青の三角形をとりだしてみると、求めたかった比が簡単に表されることがわかります。

$$
\frac{sin(\theta + \Delta \theta) - sin \theta}{\Delta \theta} = cos \theta 
$$

よって、$sin \theta$ の微分は $cos \theta$になることがわかりました！
同じように、$cos \theta$の微分も、

$$
\frac{cos(\theta + \Delta \theta) - cos \theta}{\Delta \theta} = -sin \theta 
$$

と表現できることがわかります！
このように、図で見ると、sinとcosの微分がなぜ逆になるのかがよくわかりました！

## tanの微分は？
傾きの変化量を考えると同じように考えられる気がしてるのですが、商の微分の公式ですぐ求められるので、まあいいかなと思っています笑。良いアイディアがあれば教えて下さい:) 


## 参考資料

元ネタは[こちらの動画](https://www.youtube.com/watch?v=R4o7sraVMZg)です。動画にするとよりわかりやすいですね！

## 謝辞

解説してくださった某数学博士の先輩、ありがとうございました！
c++のデストラクタでこれがわかってないとヤヴァイ

## 概要
そこのc++超初心者の方、以下のデストラクタの挙動がわかってないとメモリリーク起こして詰みます。（~~自分に対するブーメラン~~）
これは、https://stackoverflow.com/questions/2403020/why-doesnt-the-c-default-destructor-destroy-my-objects/2403026
を読んだときの備忘録です。（口調がちょっと刺々しいけどしっかり答えてくれるstockoverflowの住人に感謝です。）

## 登場人物
- クラス**M1**
- クラス**M2**
- クラス**N**


## これわからないとヤヴァイ
クラスM1とクラスM2を次のように作ります。


このコードを見てみてください。

1. クラスM１とクラスNがあります。
2. クラスM１はメンバとしてクラスNの**実体**を持っています。

```test_destructor.cpp
#include <stdio.h>

class N{
    public:
        int n_member1;
        N(){
            n_member1 = 1;
        };
        ~N(){printf("I am a destructor of N\n");};
};

class M
{
public:

    N n;
    ~M (){printf("I am a destructor of M\n");}

    M() 
    {
        n = N();
    }
};
```


次にこのコードを見てみてください。
1. クラスM2とクラスNがあります。
2. クラスM2はメンバとしてクラスNの**ポインタ**を持っています。

ちな、**new 演算子**をわからない人はいないと思いますが、（~~私は最近知りました~~）
new 演算子は**ヒープ領域**にオブジェクトを作り、そのオブジェクトへの**ポインタ**を返します。
この場合、M2のメンバ変数nはヒープ領域にnew演算子を通して作られます。

```test_destructor2.cpp
class M2
{
    
public:

    N* n;
    ~M2 (){printf("I am a destructor of M2\n");}

    M2() 
    {
        n = new N();
    }
};

```

## クラスMの消失

```main.cpp
int main(){
    M m;
}
```

として、クラスMのオブジェクトmを作ります。
これらはnew演算子で作られたものではないので、main関数のスコープを抜けると、デフォルトでデストラクタが呼ばれ、メモリから消えます。
実際に走らせると、

```bash
I am a destructor of N
I am a destructor of M
I am a destructor of N
```

となります。これをよく観察すると、
一行目の```I am a destructor of N```
は、クラスMのコンストラクタ内で、```n = N();```とした後に、スコープから抜けてこの```n```がデストラクトされたときのものです。

二行目の```I am a destructor of M```
はmain関数のスコープから抜けて、クラスMのオブジェクトmがデストラクトされたものです。
mはクラスNのオブジェクトnの実体をメンバとして持っていたので、mが消えたときにnの実体も消えます。

したがって、三行目の```I am a destructor of N```
は、mが消えたときにnも消えるので呼ばれたのです。


## クラスM２の消失
では、クラスM2はどうでしょうか。

```main.cpp
int main(){
    M2 m2;
}
```
とします。すると、

```bash
I am a destructor of M2
```

と出ます。もちろん、```I am a destructor of M2```
は、main関数のスコープが終わるときに、m2がデストラクトされるから表示されています。

しかし、```I am a destructor of N```
とはなっていませんよね。

これは、m2がクラスｎの実体ではなく、ポインタを所持しているので、m2がデストラクトされるときに同じくデストラクトされるのは、nそのものではなくて、nへのポインタだからです。

すなわち、new演算子で作られた**クラスNのオブジェクトnは消えておらず、nへのポインタだけが消えた**ということです。
これを繰り返すと、クラスMのオブジェクトをコンストラクトするたびにクラスNのオブジェクトがヒープ領域に作られ、クラスMのオブジェクトがスコープを越えて消滅した際にも、クラスNのオブジェクトは宙ぶらりんになってヒープ領域に残ることになります。


考えてみれば当たり前ですが、これを理解しとかないといろいろ不都合なことになりますね。


##まとめ
おそらく、このようなことが置きないように、ポインタをメンバとしてもたせるクラスを作るときは、
**そのメンバがポイントする先が増殖しない。**　ような際に限るべき。

言い換えると、
**クラスのオブジェクト(クラスM)と、ポイントする先(クラスN)が多：少数の関係になっているべき。**　でしょう。

そうでなければ、クラスオブジェクト(クラスM)は、ポインタでなく実体をメンバとして持っておいたほうが安全なような気がします。

クラスオブジェクトが消える際に、参照しているメンバも消えるようにしておくように、スマートポインタというものがあるようですが、これについてはこれから勉強してみます。


おわり。
Motion5での顕著な画質劣化について (小数ピクセル問題)

プログラム開発ではないけど、自社サービスの紹介や解説動画を作ることがあるだろうため共有。

サービスの画面遷移などを動画で取ってApple Motionで説明を付ける編集を行った際、妙に画質が劣化し、特に文字がかなりぼやけてしまう現象が発生した。

結論から言うと、メディア(動画)の位置を指定する際、ピクセルが小数単位で指定できてしまう(3.5px等)が、小数がある場合に画質が大きく劣化する。(Motion 5.4.5で確認)

おそらく、素直に小数ピクセル分動かそうとして、隣接ピクセルを合成してしまっているのではないかと思う。そのため、文字のように白黒の境界が明確な箇所で特に画質劣化が起きてしまう。

Appleサポートに連絡したところ、親切に色々調べていただき、再現性あることは確認できたものの、現時点では手で小数を消すしかないとのことだった。


それにしても、手でオブジェクトの位置かすと普通に小数px指定になるのに、ネットで色々検索しても情報が全然ないのが謎…


***条件詳細***
Motion 5.4.5
HDMIサイズで、1:1で出力
入力 mp4
出力 H-264, ProRes, 他なんでも
SpringBootで定期実行で非同期処理

## 概要
Spring Bootで定期実行と非同期処理をやってみたので備忘録です。

## 環境
OpenJDK 11
Spring Boot 2.2.1

## 定期実行
こちらを参考にしました。[Spring Bootでtaskを定期実行する方法](https://qiita.com/rubytomato@github/items/4f0c64eb9a24eaceaa6e) 

```java
@EnableScheduling
@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

```
```java
@Scheduled(fixedRate = 10000)
public void scheduledTask() {
    this.doTask();
}
```

Scheduledアノテーションを使います。

## 非同期処理
Ayncアノテーションを使えば非同期処理にできます。

```java
@EnableAsync
@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}
```
```java
@Async
public void doTask() {
    NormalTask normalTask = new NormalTask();
    normalTask.do();
}
```

doTaskメソッドが呼ばれると処理は別スレッドにて実行されます。

## 同時にやる
この組み合わせで定期実行→非同期処理が可能だと思っていたのですが、ScheduledとAsyncの組み合わせでは非同期処理にはなりません。

```java
@Async
public void doTask() {
    NormalTask normalTask = new NormalTask();
    normalTask.do();
}

@Scheduled(fixedRate = 10000)
public void scheduled() {
    this.doTask();
}
```
上の例はAsyncが効かず、normalTask.do()はブロックされます。

ScheduledアノテーションのついたメソッドはRunnableを作り別スレッドで処理を行いますが、この時にAsyncは効かなくなります。
定期実行を管理するScheduledThreadPoolExecutorはRunnableのrun()が終了するまでブロックするようです（終了から次の定期実行時間を算出するため）。

ということで、ScheduledとAsyncアノテーションの併用は不可。

## 解決策
Scheduledで作るRunnableの中で別スレッドを作り、その中で処理を実行すると解決できました。
Scheduledが作るRunnableは非同期処理の別スレッドを作るとすぐに終了するため問題ないのではないかと思っています。

```java:AsyncTask.java
public class AsyncTask implements Runnable {

    @Override
    public void run() {
        // Do some task
    }
}
```

```java

public void doTask() {
    AsyncTask asyncTask = new AsyncTask();
    Thread newThread = new Thread(asyncTask);
    newThread.start();
}

@Scheduled(fixedRate = 10000)
public void scheduled() {
    this.doTask();
}
```

以上、ご指摘等あればぜひご連絡ください。

## 参考
[Spring Bootでtaskを定期実行する方法](https://qiita.com/rubytomato@github/items/4f0c64eb9a24eaceaa6e) 
[using @Scheduled and @Async together?](https://stackoverflow.com/questions/42482865/using-scheduled-and-async-together)
macOS 10.15 Catalina に古い Java(8系) を入れる方法

# はじめに

Java のバージョンが 12 だと動かないツールがあり、古い Java を入れようとして Google検索しても役立つ情報がトップの方に表示されなくて面倒だったので、ここにメモ書きします。(2020年1月9日投稿)

# 自分の環境

macOS 10.15 catalina
Java は 12.0.2

```
% /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/openjdk-12.0.2.jdk/Contents/Home
```

# やりたい事

Java 8 系を入れたい。

# 古い Java のインストール。

こちらが参考になりました。

- macOS に Oracle Java 8 (JDK) をインストールする手順
   - https://weblabo.oscasierra.net/java-install-oracle-jdk8-macosx/

Oracle のサイトから JDK を D/L します。
「Java SE Development Kit 8u202」 - 「Mac OS X x64」 を選択しました。

|https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html |
|---|
|![JDK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/530208ed-8e5f-5cac-36cd-37cd9a2dd581.png)|

JavaVirtualMachines に 8 系がインストールされているのを確認します。

```
% /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/openjdk-12.0.2.jdk/Contents/Home
% /usr/libexec/java_home -v 1.8
/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
```

1.8 とありますが新規に増えたのでこれだけなので、きっと 8 系でしょう。(適当

# 古い Java への切り替え

なお、インストールするだけでは駄目で、JAVA_HOME の切り替えが必要です。

こちらを参考にしました。

- OSXでJavaのバージョンを切り替える
   - https://qiita.com/ringo/items/db58b34dc02a941b297f

.profile または .bashrc など、シェルの設定に以下の2行を入れます。

```
export JAVA_HOME=$(/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v "1.8")
PATH=${JAVA_HOME}/bin:${PATH}
```

# バージョン確認

```
% source ~/.profile
% java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
```

# 最後に

Google で 「macOS 古いJavaをインストール」 を中心に色んな単語を混ぜて検索しても、古いJavaを**アンインストール**する方法ばかり出てくるので辛いです。たまに見つかる Java をインストールする方法も、今では駄目な方法ばかりですし。

これで結構な時間を溶かしました。誰か同じようにハマってる人達が助かりますように。。
[Unity]シングルトンの実装

#１．シングルトンとは
・ デザインパターンの一種、インスタンスが一つしか作れない。
・ そのゲームオブジェクトがシーンに1つしか存在しないことを保証するための仕組み。
#２．実装

``` C#
using UnityEngine;
using System;

    /// <summary>
    /// シングルトン
    /// </summary>
    /// <typeparam name="T"></typeparam>
    [DisallowMultipleComponent]
    public abstract class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
    {
        /// <summary>
        /// インスタンス
        /// </summary>
        private static T _instance;

        public static T Instance {
            get
            {
                if (_instance == null)
                {
                    Type t = typeof(T);

                    _instance = (T)FindObjectOfType(t);
                    if (_instance == null)
                    {
                        Debug.LogError(t + " をアタッチしているGameObjectはありません");
                    }
                }
                return _instance;
            }
        }

        virtual protected void Awake()
        {
            // 他のゲームオブジェクトにアタッチされているか調べる
            // アタッチされている場合は破棄する。
            CheckInstance();
        }

        /// <summary>
        /// インスタンスが生成されているか調べる
        /// </summary>
        protected bool CheckInstance()
        {
            // 生成されていなければインスタンス生成する
            if (_instance == null)
            {
                _instance = this as T;
                Debug.Log(_instance + "が生成されました。");
                return true;
            }
            else if (_instance == this)
            {
                return true;
            }

            // 生成されていたらインスタンス削除する
            Destroy(this.gameObject);
            return false;
        }
    }
```

# ※ 注意点
1．シングルトンの継承先でvoid Awake()を使用する際はオーバーライドする

``` c#
protected override void Awake()
{
    // SingltonのAwake処理をする
    base.Awake();
}
```
Lua で名前付き関数パラメータ

Luaでは「**関数のパラメータがテーブルコンストラクター１個の時、関数コールの丸括弧を省略できる**」という書式があります。

これはつまり

```Lua
function f(a)
    for key,val in pairs(a) do
        print(key.."="..val)
    end
end

f( { param1="12345" , param2="abcdef" } )
```

の関数コール部分を

```Lua
f{ param="12345" , param2="abcdef" }
```

と書けることを意味します。これは、ほとんど他の高級言語の名前付きパラメータと同じですね。

これについて、[ドキュメント](http://www.lua.org/manual/5.3/manual.html#3.4.10)を見ると、関数のパラメータの記載には以下の三種類が許されているようです。

```
	args ::= ‘(’ [explist] ‘)’
	args ::= tableconstructor
	args ::= LiteralString
```

どうやら、**引数が文字列１個の場合も関数コールの丸括弧を省略できる**ようです。これはすなわち

```lua
require "モジュール名"
```

で使われている文法です。

この機能、他にも応用が聞きそうです。例えばC++ではワイド文字列を `L"..."` と表現しますが、Lua でも、ANSI文字列をUnicode文字列へ変換する関数 `L` を定義してやれば同等のことができそうです。

このように、Lua では文法や機能をいたずらに増やすのではなく、ちょっとしたシンタックスシュガーの追加で少数の機能で多くの表現ができるような工夫が随所に見られます。

こういった工夫が Lua のコンパクトさを実現し、多くの環境で動作する強みにつながっているのではないかと考えられます。

みんなも使おうぜ、Lua
【Swift】【Xcode】TableView編集モード、削除について　[備忘録]

この記事は編集モードの削除について**自分用**に書いた記事です。
TableViewの詳しい記事も書いてるのでよければ読んでみてください。
[【Swift】【Xcode】詳しいTableViewの使い方。Part.1 準備編](https://qiita.com/akidon0000/items/850e6823363689912783)

<img width="337" alt="スクリーンショット 2020-01-09 22.44.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/45527887-3d2e-a7bc-697a-58fc19b0b180.png">


```Swift:ViewController.swift
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    let editButton = UIButton()
    //セルの削除許可を設定
    func tableView(_ tableView: UITableView,canEditRowAt indexPath: IndexPath) -> Bool{
        return true
    }

    //セルの削除ボタンが押された時の処理
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        //削除するだけなのでindexPath_row = indexPath.rowをする必要はない。
        if editingStyle == UITableViewCell.EditingStyle.delete {
            cellList[indexPath.section].remove(at: indexPath.row)
            TableView.reloadData()
        }
    }

    
    func addEditButton(){  //
        // 編集ボタン
        editButton.frame = CGRect(x: 0, y: 0, width: 150, height: 50)
        editButton.center = CGPoint(x: self.view.bounds.size.width/4*3, y: self.view.bounds.size.height/4*3)
        editButton.titleLabel!.font = UIFont(name: "HiraKakuProN-W6", size: 30)
        editButton.setTitle("編集", for: UIControl.State.normal)
        editButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
        editButton.addTarget(self, action: #selector(ViewController.onClickEditButton(sender:)), for: .touchUpInside)

        // 見た目を調節
        editButton.layer.masksToBounds = true
        editButton.layer.cornerRadius = 20.0
        editButton.backgroundColor = UIColor.red
        
        self.view.addSubview(editButton)
    }
    // 編集ボタンがタップされた時のアクション
    @objc func onClickEditButton(sender: UIButton){
        let string = sender.titleLabel!.text!
        if string == "編集"{
            TableView.setEditing(true, animated: true)
            sender.setTitle("完了", for: UIControl.State.normal)
        } else {
            TableView.setEditing(false, animated: true)
            sender.setTitle("編集", for: UIControl.State.normal)
        }
    }

    //ナビゲーションバーに編集ボタンをつける場合
    var aaa = true
    @IBAction func Editer(_ sender: Any) {
        if aaa == true{
            TableView.setEditing(true, animated: true)
            aaa = false
        } else {
            TableView.setEditing(false, animated: true)
            aaa = true
        }
    }



    
    override func viewDidLoad() {
        super.viewDidLoad()
        addEditButton()
    }
}

```
git diffで日本語のファイル名が文字化けした時の対応方法

- 環境
    - macOS Catalina バージョン10.15.2
    - git version 2.21.0


# 事象 : `git diff`したら日本語のファイル名が文字化けした
```bash
$ git diff --name-only --diff-filter=ACMRT 9744fd5 686a212
"GitDiff\343\201\247\346\226\207\345\255\227\345\214\226\343\201\221.md"
```

# 原因 : `core.quotepath`を設定していないから
> git config に、quotepath = false　ってのも書いておくと、ファイル名に、日本語が文字化けする（正確にはエスケープされる）のを、あっさりと解決してくれるようです。
> [git log、git diff、git showでの日本語の文字化けをまとめて対策 | WWWクリエイターズ](http://www-creators.com/archives/78#i)

```bash
# core.quotepathの設定がない
$ git config --list | grep core
core.excludesfile=/Users/ponsuke/.gitignore_global
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
```

## 対応 : 自分用の設定に`core.quotepath`を設定する
私は日本人です。なので特定のリポジトリではなくて自分の設定全体(global)に`core.quotepath`を設定します。

> git の config 情報の設定は、3段階に分かれている。システム全体 system と、ユーザ全体 global と、対象リポジトリのみ local ですな。
> [gitconfig の基本を理解する - Qiita](https://qiita.com/shionit/items/fb4a1a30538f8d335b35)

```bash
# 設定して
$ git config --global core.quotepath false
# 確認してみる
$ git config --global --list | grep core
core.excludesfile=/Users/ponsuke/.gitignore_global
core.quotepath=false
# もう一回やってみる
$ git diff --name-only --diff-filter=ACMRT 9744fd5 686a212
GitDiffで文字化け.md
```
CakePHPで追加の翻訳辞書ファイルを設定する

app.phpの後に追加の設定ファイルを読んで、翻訳辞書の設定を変える場合のやり方。

app.php等の構成ファイルで翻訳辞書の場所を指定するが、地味に配列での指定になっている。
複数指定した場合、配列の先頭から走査して、辞書ファイルがある場所を採用するようになっている。(cakephp/src/I18n/MessagesFileLoader.php)

そのため、app.phpの後に別の設定ファイルを読み込みlocales設定を追加した場合、マージにより追加部分が配列の後ろに来てしまうので、優先して使ってくれない。
後で読みこんだ方を優先する場合は、読み込み後にApp.paths.localesを逆順にすればよい。

~~~php
//bootstrapで
Configure::write( 'App.paths.locales', array_reverse(Configure::read('App.paths.locales')) )
~~~


＊[cakephp/src/I18n/MessagesFileLoader.php](https://github.com/cakephp/cakephp/blob/cafb1a25c07f4273f9e73d6aee46efbeeb6556bd/src/I18n/MessagesFileLoader.php)の該当部分

~~~php
    public function __invoke()
    {
        $folders = $this->translationsFolders();
        //中略
        foreach ($folders as $folder) {
            $path = $folder . $fileName . ".$ext";
            if (is_file($path)) {
                $file = $path;
                break;
            }
        }
~~~

この辺cookbookに細かいこと書いてなかったのでメモ。
画面幅に合わせて可変する正方形を作りたい

#はじめに
レスポンシブ対応のウェブページを作っているときに、画面幅に合わせて可変する正方形が必要になったので、調べて実装しました。
今後、使い回しが効きそうだったので備忘録として残しておきます。

#固定サイズの正方形を作る
```html
<div class="square"></div>

<style>
.square{
    width: 100px;
    height: 100px;
    background-color: red;
}
</style>
```
こうですね。
わかりやすく赤色の正方形です。

#横方向を画面幅に合わせて可変させる
```html
<div class="square"></div>

<style>
.square{
    width: 50％;　<=変更しました
    height: 100px;
    background-color: red;
}
</style>
```
この状態で、画面幅をいじると、四角形の横幅が変化します。

#正方形にする
```html
<div class="square">
  <div class="inner"></div>
</div>

<style>
.square{
    width: 50%;
    height: 100px;
    background-color: red;
}
.inner{
    width: 0px;
    height: 0px;
}
```
四角形の中に、高さ・幅とも０のdivを入れました。
この中に入れたdivにpadding-bottomを設定します。

```css
.inner{
    width: 0px;
    height: 0px;
    padding-bottom: 100%; <=追加
}
```
marginやpaddingを%で指定する場合、**親要素の幅**から計算されます。
topやbottomでも親要素の幅が基準になります。
なので赤い四角形の幅が５００pxだった場合、padding-bottom　１００％も５００pxになるわけです。

最後に赤い四角形の高さ指定を外してあげれば、完成です。
#完成形

```html
<div class="square">
  <div class="inner"></div>
</div>

<style>
.square{
    width: 50%;
    background-color: red;
}
.inner{
    width: 0px;
    height: 0px;
    padding-bottom: 100%;
}
```

画面幅に合わせて可変する正方形の完成です。
[Amazon] MWS (Marketplace Web Service), API取得方法

Amazonアプリの開発にはAmazon MWS(API)へのアクセスが必要です。今日はその取得方法と手順をメモ書きしておきます。

# 1. セラーアカウント、トップページへアクセス
https://sellercentral-japan.amazon.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/502b3c6b-72ed-a1f7-d14a-38543ac077d2.png)


# 2. 「アプリとサービス」→「アプリの開発」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/23453e86-0135-db5d-2d65-33578e9bc371.png)

# 3. アクセス申請
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/41b8fb12-b175-87fc-afb8-8c75e21b8f72.png)

# 4. 登録と評価に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/b871e1d4-8f4f-853e-7695-a6af6ad9487b.png)


# 5. そして、待つ・・
下記のURLから審査の進捗を確認することができます。

https://sellercentral-japan.amazon.com/cu/case-lobby

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/bb039ab9-d362-8955-109f-e1f602b20339.png)
UnityのシェーダーグラフでMMDのモデルで崩壊３のやり型を参考にして、作ってみた感想文

#初めに

Unityのグラフで入門したことがある、シェーダーとMMD少しと触ったことがあるので、正直に言って、私主に崩壊３のゲームが好きなので、彼たち作ってくれたダンスモーションビデオいつも参考することもある、そして、今度少し彼達以前のPower Pointで、参考して、そして、自分もUnityちゃんのシェーダーを参考して、作ってみた。

因みに感想文なので、正式とは全く違うものです。そして、自分もいろいろ試してるので、いいとはおまわないけど。

モデルはYYB式初音ミクです。


髪前だけです。

参考にしたシェーダー達
>https://learning.unity3d.jp/570/
>https://github.com/unity3d-jp/UnityChanToonShaderVer2_Project


ダンスビデオの興味がある方はこっちでお願いします

https://www.bilibili.com/video/av7244731?from=search&seid=2774474799134065497

先ずは結果としての感じ　とプレゼントの画を見せにいたします。



![ShaderGraphTekkun.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/2cc4108f-961c-5be7-d3f8-8f2659235675.png)

![ShaderGrapTekkun2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/fa577b06-9d53-d5c3-a9c4-cf8ae3f814dd.png)

私が作ったビデオです。

https://twitter.com/ZfSilverFox/status/1215262506576277511



![Unity Shader Houkai3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/c426fa08-4885-b70a-2e31-8f678ee14c40.jpeg)


正直、この公式見た時、プロならいいけど、学生なら、
私は学生ですから、言いたいことは....
miHoYoさん、
学生を精神殺す気か?QAQ



#Tangentとは

参考元は英語なので、
http://davidorejuela.blogspot.com/2013/12/normal-tangent-bitangent-binormal.html

![Tange.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/45a56bcd-55c3-5d0c-47d7-2daa6fba2e28.jpeg)


面に向かってるの方はノーマル、そして、tangentとは、ノーマルと垂直してる線です。


#Hを作ってみた

Hとは

以下図面の通りです。
![half.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/cda4d0e6-bea7-532c-9995-503b502b42ec.jpeg)




先ずは

![Unity Shader Houkai3 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/476ceb32-2e3f-89d2-786f-aa386fa66c2f.jpeg)

私のやり型では

![H.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/83d1a983-50f8-f2c4-c8df-1808ce3cdf2e.png)


簡単に言えるとは視線は視線から、そして、Ambientと加えて、後でNormalizeカード化とすることです、これはHalf Directionというものです。

#DotTHを作ってみた

次には点乗積を作ることですね、

先ずは公式を参考すると、
![Unity Shader Houkai3 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/1cb13911-e638-4b2d-006b-a5cf6e6eef29.jpeg)


そして、私のやり型ですが、

![DotTH.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/6c7b257c-b8f5-dc04-9654-d18e52e39d3e.png)

#sinTHも作ろうぜ

![Unity Shader Houkai3 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/1311332d-30be-b933-814e-6db185fcb746.jpeg)

私のやり型は以下通りです。

![SQRT.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/8a7946c3-43f0-1491-7e27-17d2b9812814.png)

#DirAtten作ってみた
![Unity Shader Houkai3 (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/72249445-374c-b00b-2a18-9d7226bc183c.jpeg)

私のやり型です、

![SMOOTHSTEP.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/2658807f-9cbc-1433-c1a5-64a547a0fe14.png)

#最後に


![saigo.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/087c64f3-978f-5f5e-fc98-0a127f075226.png)

![saigo2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443559/270b8888-c0e5-f1bc-ba56-60ca4bd52a7d.png)




正直、これ以降のことを言うなら、超キツイしか言えないです。
macOSをCatalinaにしてgitコマンドしたら【xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: 】の対処法

##MacのOSをMojaveからCatalinaにアップデートしたら下記の様にエラーした。
$git status
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

ん？

なんか以前も同じ様な経験をしているなと思いつつ、エラーメッセージを見つめてみる。
"invalid active developer path"→デベロッパーのパスが無効？
もうちょっと読んでみます。するとCommandLineTools？

次のラインを読んでみます。
missing xcrun....
xcodeがないのね。

##【結論】MacOSをアップデートしたら、$xcode-select --installをしよう。
$xcode-select --installをすると、下記の様に表示されますので、
**インストール**をクリック。
![スクリーンショット 2020-01-09 20.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142296/edd666eb-5f14-1d8b-3a15-f50a2455d4a5.png)


インストール後、
**$ git status
On branch master
Changes not staged for commit:**

こんな感じで動く。

##RubyMineで開発すると便利
RubyMineで開発していると、何かエラーすると教えてくれます。
![スクリーンショット 2020-01-09 20.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142296/c8f18a37-3b4b-c827-7f13-f273ccf50952.png)
今回はターミナルで$xcode-select --installをしましたが、
Fix Pathを押すと解決案を出してくれます。

問題が解決されますと、下記の様に表示されます。
![スクリーンショット 2020-01-09 21.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142296/4d37027d-3565-2b9d-1553-8e178a99e2a1.png)

###開発を手伝ってくれるツールも大切

以下より参考にしました。
[Mac OS Sierraにしたらgitコマンド、ターミナル上にエラーが出てしまった。](https://qiita.com/ARTS_papa/items/60ba305b23dc967bba87)

###Mac OSをcatalinaにアップデートしたら、RubyとRailsが消えた件
OSをアップデートすると何かと困ったりする。
下記も備忘録として残しておきます。
https://qiita.com/ARTS_papa/items/15f1a8b08dc386e14a62
spark-shell カンマ区切り(csv)のファイルをヘッダー付きで読む

#### 読み取るデータにヘッダーを付ける

以下のようなファイルを用意します。
わざと D,EF と書いて、この行だけカンマ(,)の数が合わないようにしています。

```bash:names
id,name,score
1,ABC,90
2,D,EF,80
3,GHI,95
```

このファイルが /data/test/input/ に置いてあるとします。
このファイルを spark-shell で読み込んでいきます。

#### ファイルを読み取る

ファイルの読み込みは以下のような書き方ができます。
データ型は "org.apache.spark.sql.DataFrame" です。
"header","true" オプションを指定することで、1行目をヘッダーとして読み取ります。

```bash:spark-shell
scala> val names = spark.read.option("header","true").csv("/data/test/input")
```

その読み取ったヘッダーは、スキーマのフィールド名に自動的に割り当てられます。
それぞれのフィールドのデータ型はデフォルトですべて String になるようです。

```bash:spark-shell
scala> names.printSchema
root
 |-- id: string (nullable = true)
 |-- name: string (nullable = true)
 |-- score: string (nullable = true)
```

では、実際のデータの中身を見てみると...

```bash:spark-shell
scala> names.show
+---+----+-----+
| id|name|score|
+---+----+-----+
|  1| ABC|   90|
|  2|   D|   EF|
|  3| GHI|   95|
+---+----+-----+
```

やはり、2行名(id=2) のデータが、ズレています。
元データがこのような（2,D,EF,80）書き方をしていたため、当然の結果です。
読み取り時にエラーは出なかったため、単純に残った部分は読み取りされずに無視されているように思います。

#### 区切り文字の検討

カンマ(,)は何かの文字列（名前）の中でよく使われるので、区切り文字以外では使われないという保証がない限り、区切り文字として使うのは適切ではないと思われます。
例えば、タブ区切りのファイルで読み書きしたい場合は、以下のオプションを付けることで容易に可能です。

```bash
option("delimiter", "\t")

Ex) 読み込むとき
scala> val names = spark.read.option("header","true").option("delimiter", "\t").csv("/data/test/input")
```
【Vuex】同じmutationsが多数繰り返されるエラーが発生していたら確認した方がいいこと

## はじめに
先日、こちらの記事を書きました。
[【Vuex】mapState, mapGetters, mapMutations, mapActionsの最低限の使い方まとめ - Qiita](https://qiita.com/terufumi1122/items/6f9470c8d416a4af7502)

上記に関連して、記事を書こうと思ったきっかけになったエラーについても記録として残しておこうと思います。

以下のように**同じmutationsが繰り返されていたら**怪しんでみて下さい:sweat_smile:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/e0732fe7-3cbf-2048-6f19-119cfd3b5072.png)


## 環境
```yaml
OS: macOS Catalina 10.15.1
Vue: 2.6.10
vuex: 3.1.2
```
## エラー原因
`computed`プロパティ内に`...mapMutations`を書いてしまっている。

`methods`プロパティ内に書くのが正しいです。

### :x: ダメな例
```javascript:Anything.vue
//...
    computed: {
      ...mapMutations([
        'anyMutation',
      ]),
    },
    methods: {
      anyMethod() {
        this.anyMutation()
      }
    }
//..
```

### :o: 良い例

```javascript:Anything.vue
//..
    methods: {
      ...mapMutations([
        'anyMutation',
      ]),
      anyMethod() {
        this.anyMutation()
      }
    }
//..
```

これで無事読み込まれます。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:
Microsoft Learn 40日目

2019年12月に Advent Calendar を使って [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) で学んでいく...と試みてなんとか完遂した([記事はこちら](https://qiita.com/advent-calendar/2019/d01tsumath_learn))。
しかし、スローペースだったのもあり25日間毎日受講しているとは言え、コースの半分しか終わってない。
そこで、「Azure の基礎」コースが終わるまで続けていこうと思う。毎日はキツい、でもがんばる。

と、いうことで。以下、受講記録のはじまりはじまり～。

1/9は
Azure Policy でインフラストラクチャの標準を適用して監視する
 - サービス正常性を監視する
を受講した。

# Azure Policy でインフラストラクチャの標準を適用して監視する
## サービス正常性を監視する
### Azure Monitor
クラウドおよびオンプレミス環境の利用統計情報を収集、分析し、それに対応する包括的なソリューションを提供することにより、アプリケーションの可用性とパフォーマンスを最大化する。
利用しているアプリケーションがどのように実行されているかを把握するのに役立つ。

### Azure Service Health
Azure サービスに関する問題による影響を受けた場合にパーソナライズされたガイダンスとサポートを提供するエクスペリエンスのスイート。
問題を通知してくれるだけでなく、その影響の把握にも役立つほか、問題が解決した場合にはその旨の情報が随時配信される。
Railsで検索窓で入力された文字列を使ってDBを検索する

# whereメソッドとLIKEの説明
whereメソッドとは、DBに対して任意の条件で検索して、データを取得するためのメソッド。
LIKEは、曖昧検索を行う仕組み。
ここでいう曖昧検索とは、「文字列が"a"ではじまる単語」とか「"06"で始まる電話番号」などの曖昧な表現を検索する仕組みです。

まず前提として、usersテーブルから特定の文字列で始まるユーザー名を検索しています。
このコードはコントローラに記述されていて、リクエストで入力された値がparams[:keyword]で送られてきています。

以下のコードを見ながら説明します

```ruby:qiita.rb
@users = User.where("name LIKE ?", "%#{params[:keyword]}%")
```
三段階にわけて説明します。
①User.where
モデル名.whereとすることで、そのモデルのテーブルを検索するよう指示を出します。
②whereの第一引数 "name LIKE ?"
まずLIKEの前で、検索するカラムを指定します。ここではnameカラムを検索するようにしています。
LIKE ? で「曖昧検索しますよ」と宣言します。
ちなみに ? はプレースホルダと言うもので、第2引数の値を「?」へ置き換えるための目印です。
③whereの第二引数 "%#{params[:keyword]}%"
{params[:keyword]}で入力された文字列を受け取っています。%は正規表現で0文字以上の任意の文字列という意味です。前後に%を記入することで、もし文字列"a"が入力されていれば、「"a"を含む全ての文字列」という意味になります。

このように、whereやLIKEを使って特定の条件を指定することで、ほしい値のみを取り出して使用することができます。
【python】pythonの関数の名前の語源

こんにちは！python初学者のSHIMIZUです！
今回は、pythonの関数を覚えるため、関数名の語源をまとめてみました！（随時更新）

###bin()
()に十進数を入れると、二進数にして出力してくれる関数。
語源は、二進数を意味する英単語「binary」から来ています。
なるほど、binってつく、プログラミングの用語っていくつかありますが、このbinは二進数を表しているのですね！

###int()
()に値を入れると整数型にして出力してくれたり、
引数を２つとって、（数値、何進数か？）という情報を入力すると、十進数にして出力してくれる関数。
語源は、整数を意味する英単語「integer」から来てます。
ちなみに数学の世界では整数はZと表現しますが、こちらはドイツ語のZahlenから来てます。（読めない笑）
SQLAlchemy の Session に型ヒントをつけたい。


### ◯ 結論

`sqlalchemy.orm.session.Session` を使います。


```python
# sessionmaker は 「クラスオブジェクト」です。
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.session import Session as BaseSession

...




# Session は 「関数」です。
#   「インスタンスオブジェクト」であり
#   「クラスオブジェクト」ではありません。
Session = sessionmaker(bind=engine)

# session は
# BaseSession クラスを継承したクラスの「インスタンスオブジェクト」です。
session: BaseSession = Session()

...

session.commit()
session.close()
```


### ◯ 根拠

上記の `Session` は `sqlalchemy.orm.session.Session` の子クラスのインスタンスオブジェクトを返すからです。

```python
class sessionmaker(_SessionClassMethods):

    ...

    def __init__(
        self,
        bind=None,
        # vvv class_ (Session) は sqlalchemy.orm.session.Session
        class_=Session,
        autoflush=True,
        autocommit=False,
        expire_on_commit=True,
        info=None,
        **kw
    ):

        ...

        # class_  (Session) を継承したクラスオブジェクトを代入する。
        self.class_ = type(class_.__name__, (class_,), {})

    def __call__(self, **local_kw):
 
        ...
        
        # class_  (Session) を継承したクラスオブジェクトを
        # インスタンス化する。
        return self.class_(**local_kw)
```

* [/sqlalchemy/orm/session.py#L3187-L3279 - GitHub](https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L3187-L3279)
* [Type hints for SQLAlchemy engine and session objects - Stackoverflow](https://stackoverflow.com/questions/56118095/type-hints-for-sqlalchemy-engine-and-session-objects)

### ◯ 疑問

#### 1. リスコフの置換則

`Session` と `BaseSession` が、もしリスコフの置換則を満たしていなかったら、上記のように型付できず、間違っていることになります。

ぱっコードを見たところ問題はなさそうなのと、実際に使っていて問題はないので、大丈夫なのかなと **思っています** 。


#### 2. 命名規則

`sessionmaker` は、命名規則的にはインスタンスオブジェクトです。しかし、実際にはクラスオブジェクトが代入されています。

#### 3. 振る舞い

`sessionmaker` がインスタンス化したインスタンスオブジェクト `Session` は、クラスオブジェクトではないのに、あたかもクラスオブジェクトのように動作していること。

`Session` を、あるクラスのインスタンスを返す関数と考えればいいだけの話なのですが。`Session` と先頭を大文字にしてクラスとして扱った方が全体のコードが綺麗になるような気がするので。
TypeScriptで型の種類によって処理を分けたいときの型判定


# はじめに

普段からTypeScriptを使っています。

そこで、
`Union Typesで複数の型を一つの型にまとめて、型の種類によって処理を分けたい`、
といった場面がありました。

使えそうな方法が2つほどありましたので、紹介していきます。

# そもそも何がしたかったか具体的に
こういうことがしたかったです。

```javascript
interface Hoge {
  // property
}

interface Fuga {
  // property
}

type Union = Hoge | Fuga;

const hoge: Hoge = {
  // Hogeのプロパティ
};

const fuga: Fuga = {
  // Fugaのプロパティ
};

const unionList: Union[] = [hoge, fuga];

const func = (arg: Union): Union => {
  if (Hogeかどうかの判定) {
    // Hoge用の処理;
  } else if (Fugaかどうかの判定) {
    // Fuga用の処理;
  } else {
    //
  }
};

const listFunc = (args: Union[]): Union[] => {
  const funcedArgs = args.map(arg => func(arg));
  return funcedArgs;
};
```
後の方の関数は適当ですが、要するに、まとめた型で配列を作って、型を判定しながらそれぞれの処理を行いたい、という感じです。

では、具体的にどういう方法で型を判定したかを紹介します。

# Type Guard



```javascript
interface Hoge {
  type: string
  text: string
}

interface Fuga {
  type: string
  number: number
}

type Union = Hoge | Fuga

const func = (arg: Union) => {
  if(isHoge(arg)){
    // Hoge用の処理
    // isHogeでbooleanを返すとHoge型だと認識されずtextプロパティない可能性あるよと怒られる
  }else if(isFuga(arg)){
    // Fuga用の処理
  }else{
    //
  }
}

const isHoge = (arg:Union): arg is Hoge => {
  return arg.type === 'Hoge'
}

const isFuga = (arg:Union): arg is Fuga => {
  return arg.type === 'Fuga'
}
```

型の判定後に判定した値の型を確定させることができます。

ポイントは型を判定する関数の返り値の型です。

`arg is Hoge`のようにしてやることで、関数の判定がtrueになったブロックでは、Hoge型として扱われます。

ここがただのBooleanだと、Hoge型として認識してくれません。


# Discriminated Unions



```javascript
interface Hoge {
  type: 'Hoge'
  text: string
}

interface Fuga {
  type: 'Fuga'
  number: number
}

type Union = Hoge | Fuga

const func = (arg: Union) => {
  switch (arg.type){
    case 'Hoge':
      // Hoge用の処理
    case 'Fuga':
      // Fuga用の処理
    default:
      //
  }
}
```
１つ目に紹介した方に比べて、型判定のための関数定義を省くことができます。

ポイントは型定義時に、type（TypeScript公式ではkind）のような、型を識別するプロパティを持たせることです。

後はswitch文で判定できます。

TypeScript3.6から追加された機能のようです。

# 最後に
同じようなことをしたいと思った方の参考になれば嬉しいです！

駆け足でまとめた感じがあるので、誤りあれば教えてください。

ありがとうございました！！！
Mac版ExcelでVBAのDictionaryを使えるようにするまで

Mac版のExcelを使ってVBAを開発していると使えない機能があって嫌になることが投げ出したくなることが、VBAの勉強を初めて1週間で、すでに２回もありました。（いやもっとあったけど、Macに限る話じゃないからカウントしません。）

１つ目は、**ユーザーフォームを開発できない**。
これ致命的じゃないでしょうか？マイクロソフトさん。2011年のMac版Excelでは使えていたみたいですけど、2016年版くらいから使えなくなったという、後のバージョンで使えなくなるというマイクロソフトさんお得意の、機能を減らして新バージョンを購入させる戦法ですね。。

２つ目は、Mac版ではDictionaryが使えないということ。これも致命的というか、もうVBAはMacで開発できない、動かないと言っているようなもの。ユーザーフォームが使えないのは妥協しても流石に根幹的な機能であるDictionaryが使えないのは、許せなかったので（というかそれくらいで勉強をやめてしまっては勿体無いので）少し調べてみたら、案外簡単にできました。簡単だったと言っても少し手こずったのでやったことまとめてみました。

１、StackoverflowでDictionary.clsとKeyValuePair.clsをダウンロードする
２、以上の２つのファイルをプロジェクトのimportする
３、使う。ただし、For EachでValueを取り出すときは一手間必要

まず１はStackoverflowのこのページへ飛んで[VBA (Excel) Dictionary on Mac?](https://stackoverflow.com/a/50064052/5590919)
sysmodさんの回答からZipファイルをもらってください。（または直接貼っておきます[ダウンロード](http://www.sysmod.com/Dictionary.zip)）

そして２はプロジェクトを選択して、2つの.clsをimport
(この際、.clsファイルの中のattribute等は一切変更しなくて大丈夫です。)

最後に３ですが、あとはクラスからインスタンス作って、ドット以降自動で候補を上げてくれるようになるんですが、For Each でValueを取り出す時にコンパイルエラー `Compile error: ByRef argument type mismatch` が出てしまうので一作業が必要。

まず直接変数をItem()の引数にすると上記のエラーが出るので、一度別の変数に格納してから、その変数をItem()の引数として渡せばうまく動くようになります。

`For Each vKey In vKeys
 Dim k As String: k = vKey
 Debug.Print k & " = " & dict.Item(k)
Next`

以上、Mac版ExcelでVBAのDictionaryを使えるようにするまででした。
将来的にはユーザーフォームなども開発してみたいので、いずれにしてもWindow環境を検討していますが、しばらくの間はMacで開発できるところまで頑張ってみたいと思っています。
【Go】string型からint64型・uint64型へ変換する方法


# string型からint64型へ変換する方法

```go
// int64
var strInt64 string = "9223372036854775807"

// strconv.ParseInt(文字列, 基数（10進数）,ビット長)
convertedStrInt64, _ := strconv.ParseInt(strInt64, 10, 64)
```

`9223372036854775807`は`int64`の最大数です

https://golang.org/pkg/builtin/#int64

> int64 is the set of all signed 64-bit integers. Range: -9223372036854775808 through 9223372036854775807.

# string型からuint64型へ変換する方法

```go
// uint64	
var strUint64 string = "18446744073709551615"

// strconv.ParseUint(文字列, 基数（10進数）,ビット長)
convertedStrUint64, _ := strconv.ParseUint(strUint64, 10, 64)
```

`18446744073709551615`はuint64の最大数です

https://golang.org/pkg/builtin/#uint64

> uint64 is the set of all unsigned 64-bit integers. Range: 0 through 18446744073709551615.

# Go Playground

https://play.golang.org/p/wEUAoU0T3ym

```go
package main

import (
	"strconv"
	"fmt"
	"reflect"
)

func main() {
	// int64
	var strInt64 string = "9223372036854775807"
	convertedStrInt64, _ := strconv.ParseInt(strInt64, 10, 64)
	
	fmt.Printf("%v with type %s \n", convertedStrInt64, reflect.TypeOf(convertedStrInt64))
	
	
	// uint64	
	var strUint64 string = "18446744073709551615"
	convertedStrUint64, _ := strconv.ParseUint(strUint64, 10, 64)

	fmt.Printf("%v with type %s \n", convertedStrUint64, reflect.TypeOf(convertedStrUint64))
}
```

実行結果

```
9223372036854775807 with type int64 
18446744073709551615 with type uint64 
```

# 参考URL

- [go - Golang converting string to int64 - Stack Overflow](https://stackoverflow.com/questions/21532113/golang-converting-string-to-int64)
- [Golangでの文字列・数値変換 - 小野マトペの納豆ペペロンチーノ日記](http://matope.hatenablog.com/entry/2014/04/22/101127)