OmniAICreator/Qiita-1.07M huggingface dataset:
numpy二次配列に対するindexingの計算速度

numpyの二次配列があって、次のように行と列をindexingすることを考えます。
(下図では6x6の二次配列から[[9, 12], [21, 24]]を取り出そうとしています)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118119/f21086e6-d4a0-7120-09e8-920fcdbdd612.png)

このとき、計算方法によっては速度にかなりの差がでました!

```python
# 巨大な二次配列からランダムな行、列の要素を抽出する
import numpy as np

N = 10000
X = np.arange(N ** 2).reshape(N, N)

M = 100
a = np.random.choice(N, M)
b = np.random.choice(N, M)

%timeit Y1 = X[a][:, b] 
# 実行例) 1.09 ms ± 243 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit Y2 = X[a[:, np.newaxis], b]
# 実行例) 66.8 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
```

`X[a][:, b]`よりも`X[a[:, np.newaxis], b]`の計算のほうが圧倒的に高速です。

以下は蛇足ですが、そもそも上の図のように二次配列に対してindexingするのに手こずったので、ここに至るまでの紆余曲折を残しておきます。

# Sliceの場合
この場合は簡単で

```python
import numpy as np
N = 10000
X = np.arange(N ** 2).reshape(N, N)

a = np.s_[0:100]      # 行に関するslice
b = np.s_[100:300]    # 列に関するslice
# スライスした結果
Y = X[a, b]           # Y.shape = (100,200)
```
と表現出来ます。ただ、もっと柔軟に行・列を取り出そうとするとスライスだと限界があります。

# Indexingの場合 (失敗例)
上と同じようにやろうとすると実はうまくいきません。

```python
import numpy as np
N = 10000
X = np.arange(N ** 2).reshape(N, N)

a = np.arange(0,100)       # 行に関するindexing
b = np.arange(100, 300)    # 列に関するindexing
# indexingの結果
Y = X[a, b]           # エラーが起きる
```

二次元配列に対して上記のようにindexingする場合、aとbは同じ長さの配列でなければなりません。
また、同じ長さでも次のような配列が返ってきます。

```python
import numpy as np
N = 10000
X = np.arange(N ** 2).reshape(N, N)

a = np.arange(3)      # 行に関するindexing
b = np.arange(3)      # 列に関するindexing
# indexingの結果
Y = X[a, b]           # 結果: [0, 10001, 20002]
```

ちょうど`Y[i] = X[a[i], b[i]]`といった挙動です。

# Indexing (成功例)
上の方法が駄目ということで以下の通り書き換えると想定通りにindexingできました。

```python
import numpy as np
N = 10000
X = np.arange(N ** 2).reshape(N, N)

a = np.arange(0,100)       # 行に関するindexing
b = np.arange(100, 300)    # 列に関するindexing
# indexingの結果
Y = X[a][:, b]           
```

ただ、[numpyのドキュメント](https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html)を読んでみるとこんな記述が。
> So note that x[0,2] = x[0][2] though the second case is more inefficient as a new temporary array is created after the first index that is subsequently indexed by 2.

つまり`X[a]`とすることで、一時的な配列が生成されて効率が悪いようです。
実際、冒頭のコードでも見せたように二次配列が大きくなると計算時間に如実に影響を与えました。

再掲ですが最終的なindexing方法は以下のとおりです。

```python
import numpy as np
N = 10000
X = np.arange(N ** 2).reshape(N, N)

a = np.arange(0,100)       # 行に関するindexing
b = np.arange(100, 300)    # 列に関するindexing
# indexingの結果
Y = X[a[:, np.newaxis], b]           
```

以上、蛇足でした。
試行錯誤での結果なので、もっと効率的な方法があれば是非教えていただきたいです。
🌐Web Bundlesを試す📦

## Web Bundlesって？
##### アプリケーション(ウェブサイト)を1個のファイルに纏めたファイル形式```.wbn```
- ネットワーク接続なしでアプリケーションを```.wbn```形式によりBluetoothやWi-Fiでシェアできる

などなど
https://web.dev/web-bundles/

※現在はGoogle Chrome version 80 later or Google Chrome Canaryの拡張フラグをオンにした状態のみで閲覧可能な模様。

## 導入してみる

おなじみNode.jsのnpmでもビルド可能です。
※npm版は現時点でorigin-signeビルドに対応していない模様

- プロジェクトディレクトリ&成果物ディレクトリを用意して中に必要なファイルを入れる

```
── dist
    ├── assets
    │   ├── css
    │   │   └── style.css
    │   ├── images
    │   │   └── foo.jpg
    │   └── js
    │       └── app.js
    ├── index.html
    └── pages
        └── ex01
            └── index.html
```

### Golang版

- おのおのパッケージマネージャーなどかませつつインストール
  - 他言語から来た人がGoを使い始めてすぐハマったこととその答え
  - https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4
  
- ```go bundle```も必要なので入れる

```
$ go get -u github.com/WICG/webpackage/go/bundle/cmd/...
```
- PATHを通す

```
$ echo 'export GOPATH="$HOME/.go"'  >> ~/.bash_profile
$ echo 'export GOPATH="$GOPATH/bin:$PATH"'  >> ~/.bash_profile
```

- ビルドする

```
$ gen-bundle -dir dist -baseURL https://example.org/ -primaryURL https://example.org/ -o app.wbn
```

&nbsp;&nbsp;バンドル形式にも数種類オプションがある模様
&nbsp;&nbsp;https://github.com/WICG/webpackage/tree/master/go/bundle

### npm版

- プロジェクトのルートディレクトリにて[wbnパッケージ](https://www.npmjs.com/package/wbn)をインストール

```
$ npm i -D wbn
```
- ビルドする

```
npx wbn --dir dist --baseURL https://example.org/ --output out.wbn
```

### 出来た```.wbn```ファイルをGoogle Chrome Canaryで開く

```
chrome://flags/#web-bundles
```

URLバーに入力後、```Web Bundles```を```Enabled```にし、出来た```.wbn```をドラッグアンドドロップ。。。

![hello.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508602/6c9317e0-b527-7c5b-e522-d6917273edff.jpeg)

CSS、JavaScriptや画像も文字通り1個のファイルにBundleされているようです。📦


## ファイルサイズは...
```dist```ディレクトリ&nbsp;312 KB
```app.wbn```&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;296 KB&nbsp;&nbsp;(Go)
```out.wbn```&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;282 KB&nbsp;&nbsp;(npm)

という感じでした。

[デジタル署名](https://github.com/WICG/webpackage/tree/master/go/bundle#sign-bundle)を付与したBundleなども出来るようです。



## ```.wbn```の中身はCBORファイル
https://cbor.io/
[[CWT入門その1] CBORによるオブジェクトのバイナリ表現](https://qiita.com/ritou/items/f3eafedab038d17e3066)
倍ナリ


## 文献
[Get started with Web Bundles](https://web.dev/web-bundles/)
https://github.com/WICG/webpackage/tree/master/go/bundle
[https://www.npmjs.com/package/wbn](https://www.npmjs.com/package/wbn)
[Google､Chromeウェブアプリをネイティブ並みに高速化「Web Bundles」公開](https://japanese.engadget.com/2019/11/11/google-chrome-web-bundles/)
[WebBundle によるコンテンツの結合と WebPackaging](https://blog.jxck.io/entries/2019-11-12/webbundle.html)
[2020年のWeb標準](https://gihyo.jp/design/column/newyear/2020/web-standards-prospect?page=2)

[サンプル](https://github.com/Hajime-san/web-bundles)
processing クラスファイルでMinimを使う

# はじめに
MDG（名古屋大学 安田・遠藤・浦田研究室） Advent Calendar 2019 4日目の投稿です！
タイトルからしてニッチな記事ですが，何卒お付き合いいただけますと．

# Minimについて
Minimはprocessingで利用できるサウンドライブラリです．
音声ファイルの再生， サイン波の生成などができるようです．

# 使い方
マイクからの入力の音声波形を表示するプログラムを例とします．
## 単一ファイルの場合
まず, 単一ファイル内にMinim関連の処理を全て書く場合のコードを以下に示します．

```processing:main.pde
import ddf.minim.*;

Minim minim;  //Minim型変数であるminimの宣言
AudioInput in;  //マイク入力用の変数
int waveH = 150;  //波形の高さ

void setup() {
  fullScreen();
  minim = new Minim(this);
  in = minim.getLineIn(Minim.MONO, 512);
  stroke(0, 0, 0);
  strokeWeight(4);
}

void draw() {
  background(255);
    for (int i = 0; i < in.bufferSize() ; i++) {
      point(width * 0.15 + i * 2.5, height * 0.8 + in.left.get(i) * waveH);
　　}
}
```
このとき，

```
minim = new Minim(this);
```
上記部分でthisが示しているのは**PApplet**クラスのオブジェクトです．

よって， Minim関連の処理を別のクラスファイルに書く場合， PAppletクラスのオブジェクトを返す関数をメインファイルに用意する必要があります．

## Minim関連のコードを別クラス・別ファイルに書く場合
```processing:minim_separated.pde
class Minim_separated {
  Minim minim;  //Minim型変数であるminimの宣言
  AudioInput in;  //マイク入力用の変数
  int waveH = 150;  //波形の高さ

  Minim_separated() {
    minim = new Minim(getPApplet());
    in = minim.getLineIn(Minim.MONO, 512);
    stroke(0, 0, 0);
    strokeWeight(4);
  }

  void draw_soundwave() {
    background(255);
    for (int i = 0; i < in.bufferSize() ; i++) {
      point(width * 0.15 + i * 2.5, height * 0.8 + in.left.get(i) * waveH);
　  }
  }
}
```

```processing:main_separated.pde
import ddf.minim.*;

Minim_separated minim_separated;

void getPApplet() {
  return this;
}

void setup() {
  fullScreen();
}

void draw() {
  minim_separated.draw_soundwave(); 
}
```
# おわりに
Minimに限らず， PAppletクラスのオブジェクトを引数として取るオブジェクトを生成して使うライブラリを使用する場合， 今回紹介した方法が利用できるかと思います．
ssh鍵交換

備忘録

[クライアント]
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/schoolphoto/.ssh/id_rsa):【←そのままEnter】
Created directory '/home/ユーザー/.ssh'.
Enter passphrase (empty for no passphrase):【←そのままEnter】
Enter same passphrase again:【←そのままEnter】
Your identification has been saved in /home/ユーザー/.ssh/id_rsa.
Your public key has been saved in /home/ユーザー/.ssh/id_rsa.pub.
The key fingerprint is:
aa:zz:zz:dd:zz:ff:xx:xx:xx:xx・・・ ユーザー@xx.xx.xx
/home/ユーザー/.ssh/ に以下の2つのファイルが出来ていることを確認

[to リモート]
ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.xx.xx

(exsiの場合 パスが違うので以下のようにcatで追記)
cat ~/.ssh/id_rsa.pub | ssh root@192.168.x.x "cat >> /etc/ssh/keys-root/authorized_keys"

(qnapの場合)
cat ~/.ssh/id_rsa.pub | ssh admin@192.168.x.x "cat >> /etc/config/ssh/authorized_keys"

(windows powershellからlinux)
cat ~/.ssh/id_rsa.pub | ssh USER@192.168.xx.xx "cat >> /home/USER/.ssh/authorized_keys"
Tilemapのアップデート 2019

昨年のUnityアドベントカレンダーにて

「[さぁ、UnityのTilemapを始めよう！](https://qiita.com/RyotaMurohoshi/items/5c3cdd24b7e09bfd8ed3)」

というシリーズを書きました。Tilemapを使ってみたい！という人は、そちらを読んでみてください！

Unity 2017.2でリリースされたTilemapはその後、

* Unity 2018.2でHexagonal Tile
* Unity 2018.3でIsometric Tile

が追加されました。

それ以外にもUnity 2019.2から内部的な重要な変更が行われ、いくつかの細かい改善が行われました。

本投稿ではUnity 2019.2時点でのTilemapの内部的な変更と細かい改善を紹介します。

# Tilemap EditorはUnity Package形式に分離

Unity 2019.2からTilemap Editorの機能は、「`2D Tilemap Editor`」というUnity Packageに切り出されました。そのため、Unity 2019.2以降でTilemapを使うためには`Unity Package Manager`で「`2D Tilemap Editor`」パッケージへの依存が設定されている必要があります。

* Unity 2019.2.14以降で2Dプロジェクトとして初期化したプロジェクトは、プロジェクト作成段階で`2D Tilemap Editor`への依存が設定されています。
* Unity 2019.2.0から2019.2.13までで初期化したプロジェクトは、プロジェクト作成段階で`2D Tilemap Editor`への依存が設定されていないので、自分で設定する必要があります。
* Unity 2019.2.0以降で3Dプロジェクトととして初期化したプロジェクトは、プロジェクト作成段階で`2D Tilemap Editor`への依存が設定されていないので、自分で設定する必要があります。


自分で「`2D Tilemap Editor`」への依存を設定する場合は、`Window` > `Package Manager` から`Package Manager Window`を開き、「`2D Tilemap Editor`」をインストールしてください。

![tilemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/f0447a42-8727-2acb-4dd3-ffc5f5b052ac.png)

また同じように、Tilemapで1枚の画像を複数のSpriteに分割するために使う`Sprite Editor Window`を使うために、「`2D Sprite`」というパッケージが必要になりました。

もし、Tilemapに関するUIが出てこないのであれば、「`2D Tilemap Editor`」への依存が設定されているのかを確認してください。

Unity 2019.2.14(本投稿執筆時の最新)で仕様が変わりました。Unity 2019.2.0などでプロジェクトを初期化した人は注意してください。

# その他の細かい変更

その他、Tilemapにまつわる細かい変更を紹介します。

## 2d-extrasもPackage Manager経由で入れらえるように

`2d-extras`は、TilemapのUnity公式拡張ライブラリです。`Terrain Tile`や`Prefab Brush`など便利なカスタムタイル・カスタムブラシを提供しています。

今まではプロジェクトにソースコードをコピーするしか導入方法がありませんでしたが、Unity 2019.2以降であれば、`Package Manager`経由でのインストールも可能となりました。


`プロジェクトルート/Packages/package.json`の`dependencies`に、次の一行を加えてください。

```json
"com.unity.2d.tilemap.extras": "https://github.com/Unity-Technologies/2d-extras.git#v1.3.1"
```

`v1.3.1`の代わりにインストールしたい`2d extras`のバージョンを指定してください。執筆時の最新バージョンは、`v1.3.1`です。

将来的には、GitHub経由でなく、公式`Unity Package Manager`から導入できるかもしれません。

関連 : https://github.com/Unity-Technologies/2d-extras/issues/152#issuecomment-552774057

## -と=というz座標を変える新たなショートカットが追加

「Isometric Z as Y」でTilemapのステージを構築する際、頻繁にz座標を編集します。

この操作のために、Unity 2018.3からTilemapを編集する際に新たなショートカットが加わりました。

Windows : `;`(減少)と`-`(増加)
macOS : `=`(減少)と`-`(増加)


関連記事　: [Tilemap Editorショートカットキーのメモ](https://qiita.com/RyotaMurohoshi/items/6fe23e65b18b818467e0)

[2018.3.0のリリースノート](https://unity3d.com/jp/unity/whats-new/unity-2018.3.0)より

## z座標を変えられるかのトグルが追加

Unity 2019.2からz座標を変えられるかのトグルが追加されました。

![tilemap_z_enable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/a64867f6-1877-5eba-4499-aa250391efcb.png)

[2019.2.0のリリースノート](https://unity3d.com/jp/unity/whats-new/unity-2019.2.0)より

## Grid + TilemapのプレハブをTilePaletteに変換できるように

Unity 2019.2.0から、Grid + TilemapのプレハブをTilePaletteウィンドウで変換できるようになりました。


* Grid + Tilemapのプレハブを作成する
* TilePaletteウィンドウにドラッグアンドドロップする
* Tile Paletteになる

[2019.2.0のリリースノート](https://unity3d.com/jp/unity/whats-new/unity-2019.2.0)より
SwiftUI と UIKit 混合環境で開発を行うときの tips 集

# はじめに
[AkkeyTV](https://apps.apple.com/jp/app/akkeytv/id1453406882) という動画視聴アプリはこの記事執筆段階で UIKit と SwiftUI を用いて開発されています。
iOS13 未満は UIKit で構築された UI をロードし、 iOS13 以降では SwiftUI で構築された UI をロードするため、分岐処理が必要になります。また、1画面のために2パターンの UI 設計をする必要があるため、開発効率的にはよくありません。

ただ、 SwiftUI で設計する能力は今後必要になるため、勉強も兼ねて UIKit と SwiftUI の混合環境を選んでいます。
この混合環境を実現する上で学んだことをここにまとめたいと思います。

# SwiftUI.framework の weak link
Carthage などでライブラリを追加した場合、 Xcode でパスの設定も行うと思います。Apple が提供する framework に関してはこれを行わなくても import して呼び出すことができます。これが Auto Link です。
これが iOS13 未満の端末でアプリを起動した際にも動いてしまうため、 SwiftUI が実装されているアプリはクラッシュしてしまいます。

解決方法ですが、明示的に `SwiftUI.framework` を `weak link` として設定してあげることで対応可能です。
Build Phases > Link Binary With Libraries > SwiftUI.framework [Optional]

# UIHostingController
SwiftUI で設計されたものを UIKit 側から触るときは `UIHostingController` を使用します。
SwiftUI で設計された SwiftUIView() というものを定義している場合、以下のように画面遷移を記述することができます。

```swift
guard #available(iOS 13.0.0, *) else { return }
let vc = UIHostingController(rootView: SwiftUIView())
self.present(vc, animated: true)
```

また、「すでに表示されてたら画面遷移処理を行わない」といった処理を行うときも `UIHostingController` を用いて対応可能です。

```swift
guard #available(iOS 13.0.0, *) else { return }
let vc = UIHostingController(rootView: SwiftUIView())
let frontVC = ...

if !(frontVC is UIHostingController<SwiftUIView>) {
    self.present(vc, animated: true)
}
```

# *Representable
UIKit で設計されたものを SwiftUI 側から触るときは *Representable に準拠させてあげます。具体的には、 `UIViewController` は `UIViewControllerRepresentable` に、 `UIView` は `UIViewRepresentable` に準拠させてあげます。
UIKit で設計された AkkeyView() というものを定義している場合、以下のようにプレビューさせることができます。

```swift
import UIKit
#if canImport(SwiftUI) && DEBUG
import SwiftUI

@available(iOS 13, *)
struct AkkeyViewPreviews: PreviewProvider {
    static var previews: some View {
        Group {
            AkkeyView()
                .previewLayout(.fixed(width: 414, height: 100))
                .previewDevice(PreviewDevice(rawValue: "iPhone XS Max"))
        }
    }

    static var platform: PreviewPlatform? = .iOS
}

@available(iOS 13, *)
extension AkkeyView: UIViewRepresentable {
    typealias UIViewType = AkkeyView

    func makeUIView(context: Context) -> AkkeyView {
        return .init()
    }

    func updateUIView(_ uiView: AkkeyView, context: Context) {
        // Make parameter change for preview
    }
}
#endif
```

# さいごに
SwiftUI 導入を手助けする方法をいくつか考えていますので、よかったら参考にしてみてください。

[AkkeyLab/AutoPreviewable](https://github.com/AkkeyLab/AutoPreviewable)
**UIKit で設計された画面をプレビューするクラスを自動生成させる**

[AkkeyLab/XcodePreviewsTemplate](https://github.com/AkkeyLab/XcodePreviewsTemplate)
**UIKit のクラスファイルを作成するときにプレビューするクラスを自動生成させる**

[AkkeyLab/StoryboardPreviewsBySwiftUI](https://github.com/AkkeyLab/StoryboardPreviewsBySwiftUI)
**実際のプロダクトに XcodePreviews を導入してみた**
GitLab PagesでサクッとSwagger UI APIドキュメントサイトを表示する

# はじめに

GitLabのプライベートプロジェクトでSwaggerファイルを管理していて、
確認の度に毎回Viewerを立ち上げるのが手間だったのでViewerを立ち上げなくていい方法として考えました。

最終的にコードをプッシュすると自動的にSwagger UI APIドキュメントをGitLab Pagesにデプロイし、[こんな感じ](https://winteryukky.gitlab.io/swagger-ui-sample/)にSwagger UI APIドキュメントサイトが見えるようになります。
<img width="945" alt="swagger-ui-sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/ef188eb1-d6e1-aa52-d47e-bd34ca655708.png">

それではサクッと。

##プロジェクトの作成

今回は1からですのでプロジェクトを作成します。
ここでプライベートプロジェクトを選択した場合、最終的にデプロイされるページのアクセス権限がデフォルトだとプロジェクトメンバーのみのアクセスになります。
<img width="941" alt="create-project.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/ff7e5b39-83f3-b418-7363-37fc02070dad.png">

##Swaggerファイルの作成

今回はSwaggerファイルの内容は何でもいいので適当なものを作成しました。
`api-doc`以下にファイルを用意します。

```yml:api-doc/swagger.yml
swagger: "2.0"
info:
  title: swagger-ui公開用サンプル
  version: 1.0.0
  description: GitLabでSwagger UI APIドキュメントを公開する用サンプル
schemes:
- "https"
- "http"
paths:
  /sample/data:
    get:
      description: "sample"
      operationId: "sample"
      responses:
        200:
          description: "successful operation"
          schema:
            type: string
```

##.gitlab-ci.ymlの作成

[こちら](https://gitlab.com/mdhtr/gitlab-pages-swagger-ui/tree/master)を参考にしました。
`variables.SPEC_TO_DISPLAY`の値に、先ほど作成したSwaggerファイル名を設定します。

```yml:.gitlab-ci.yml
image: node:10-alpine

variables:
  DOCS_FOLDER: "api-docs"
  SPEC_TO_DISPLAY: "swagger.yml"

cache:
  paths:
    - ./node_modules

pages:
  stage: deploy
  before_script:
    - npm install swagger-ui-dist@3.22.1
  script:
    - mkdir public
    - cp -rp node_modules/swagger-ui-dist/* public
    - cp -rp $DOCS_FOLDER/* public
    - sed -i "s#https://petstore\.swagger\.io/v2/swagger\.json#$SPEC_TO_DISPLAY#g" public/index.html
  artifacts:
    paths:
      - public
  only:
    - master
```

##プッシュ
作成したファイルをプッシュするとJobが動き始めます。
完了するとGitLab Pagesにデプロイされます。初回の場合だけGitLab Pagesでの公開に少し時間がかかります。
<img width="947" alt="swagger-ui-jobs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/135158ea-c722-4fba-5b09-f967c0335417.png">

##ページにアクセス

Settings > Pages に移動します。

<img width="945" alt="swagger-ui-pages.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/1c7e7288-8b12-76f3-70a6-8aa0fc821c3a.png">

**Your pages are served under:**の下にリンクが表示されているので開きます。
<img width="947" alt="swagger-ui-pages2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/f106c971-571f-7b8b-d772-e98031402dd8.png">

Swagger UI APIドキュメントサイトが表示できました。
<img width="945" alt="swagger-ui-sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/ef188eb1-d6e1-aa52-d47e-bd34ca655708.png">

##さいごに
毎回Viewerを立ち上げなくていいのは便利です。
また、Swaggerの表示方法を知らない人にドキュメントを見せる時も楽ですし、常にリモートの最新版が表示されるのもいいです。

それと、今回使ったサンプルは[ここ](https://gitlab.com/WinterYukky/swagger-ui-sample)にあります。
固有値・固有ベクトルの使いみち（０．序文）

　**固有値・固有ベクトル**って、わからなくないですか。

```math
A\boldsymbol{u}=\lambda \boldsymbol{u}
```

　この式のことです。「正方行列$A$に対して、この式（固有方程式と呼ばれる）を満たすスカラー$\lambda$とベクトル$\boldsymbol{u}$の組み合わせを、$A$の固有値・固有ベクトルと呼ぶ」……という定義とかは数学の授業で習ったかと思いますので、細かい解説はしません。

　いや、問題を出されたら、パズル的に解くことはできるんですよ。でも、**「結局それって何の役に立つの？」**ってことがわかんなくって、学生の頃にモヤモヤしてました。

　それから月日は過ぎ、色んな分野で固有値・固有ベクトルが使われていることがなんとなく自分にもわかってきました。そこで、昔の**「固有値・固有ベクトルわかんねえ～」**っていう苦手意識を克服するため、今一度自分に向かって**「結局それって何の役に立つの？」**ということを真面目に問いかけ、自分の知る限りの範囲で固有値・固有ベクトルの応用例をまとめてみました。
　
　これから５回に分けて、固有値・固有ベクトルが使われている分野について、それが必要とされる背景を含めて紹介していきたいと思います。具体的な分野としては以下の５つになります：

**[１. 主成分分析](/items/c7d99d6d1dee2f3f936f)
[２. マルコフ連鎖](/items/3deb3f9fba3676a5f25d)
[３. 力学系](/items/7293ac5236af2e0621eb)
[４. 連続体力学](/items/94518c027a66ce168bec)
[５. 量子力学](/items/d7b3d5b808a1085a6eb0)**

　あくまで応用例を並べるだけに留めた、低俗で即物的な私のような人間のために書かれた文章です。数学的な厳密さよりは、「各分野で道具として固有値・固有ベクトルがなぜ使われているのか・どう使われているか」の雰囲気が伝わることを重視しています。線形代数を理論的にちゃんと学んでみたいという人向けでは**ありません**。推理小説でたとえるなら、本を後ろから読んで、先にトリックや犯人の動機を知っておくようなものです。しかし、ネタバレされて初めて興味を持つということもありますし、この文章を読んで逆に線形代数を学ぶモチベーションが湧くということもあるかも（あったらいいね）。

　対象とする読者の数学レベルは高校生～大学１・２年生くらいを想定しています。数学ガチ勢の人からすると胡乱なことを言ってるところもあると思いますが、そのときは容赦なくコメント欄でツッコんでください。何食わぬ顔で文章を修正します。
ruby on rails 基本１

#はじめに

この記事は、2019/11/1からプログラミング学習を始めた学生がプロのプログラマーになるまでのアウトプットする為の書き込みの場である。

#Rails構造
railsは、ルーティング→コントローラー→モデル→ビューの順番に処理が行われます
MVC = モデル(model)とビュー(view)とコントローラー(controller)

#Rails　構造
- **ルーティング**
 - クライアントからリクエストがあった際に、リクエストに対応した行き先を定義します
- **モデル**
 - Railsの中でデータベースへのアクセスをはじめとする情報のやりとりに関する処理を担当しています。
- **コントローラー**
 - ユーザーからのリクエストを受け取り、モデルやビューなどと連携し結果をユーザーに返す役割をする部分です
- **モデル**
 - Railsの中でデータベースへのアクセスをはじめとする情報のやりとりに関する処理を担当しています
- **テーブル**
 - テーブルとは、データベース内に作成される、表形式の収納場所です。
- **ビュー**
 - レスポンスとして返す見た目を設定するものです。Railsの全体像を確認してみましょう


#今日の感想
今日は、今までやってきたがブログに投稿していなかったruby,ruby on railsについて復習しました
raiksの内容が多く、今日のブログに書ききる事ができなかったので、明日から引き続きrailsについてアウトプットしていこうと思います

##終わりに
もっとこうした方が良いよなどご指摘頂けると幸いです
crontab database ～君がしでかしてくれたもの～

この記事は[本番環境でやらかしちゃった人のアドベントカレンダー](https://qiita.com/advent-calendar/2019/yarakashi-production)２日目の記事です。
内容的にそろそろ時効だと思うので供養のために書きました。

追記。そういえば時期をちゃんと書いてなかったけど事件が起きたのは去年2018年、つまり仕込み（ヲイ）は2017年の話です

ぶっちゃけネタ記事ですｗ
（たまたま見つけて参加してみただけなのに[昨日の記事](https://qiita.com/2gt/items/d6906a185109e66df74f)の伸びっぷりを見て戦々恐々としてる

# TL;DR

DB移行作業において、テスト期間中は常に最新のデータで処理できるように書いておいたプログラムをcrontabで実行していた。最終的に本番に合わせて日時を調整していたが、そのことを失念し１年後に再実行されてしまい、本番データが１年前に巻き戻る事故発生。

crontab は分、時、日、月、曜日を指定できるが、１年後に帰ってくるから気をつけてね。という話。

# 惨劇はなぜおこってしまったのか

結論から言えばcrontabの設定を**消し忘れた**のが原因。

- DB移行作業（某プライベートクラウドからGCP。MySQL to MySQL）
- NWを繋いでいなかったので、レプリケーションではなくdumpしてimportさせる計画
- 正確には次の３つのシェルを書いておいてcrontabで実行させていた（計画実行なのでコマンドを叩かなくてもフルオートで実施できる検証も済んでいた）

  - 移行元サーバでdump（デイリーバックアップを流用）
  - ローカルにダウンロードして移行先サーバにアップロード（自分のPCはどちらのNWにも繋がる）
  - 移行先でimport

- 本番移行自体は問題なかった
- 移行元は解約したので問題なかった
- ローカルは移行ファイルがなければ何もしないので問題なかった
- 移行先サーバに移行データとシェルとcrontabを置きっぱなしにして後始末を失念した（万が一に備えてデータファイルをそのまま置いておいた）
- 結果としてこの移行作業からちょうど１年後、importする処理がcrontabで実行されてしまい、当時のDBを上書き、全損させた
- 当日早朝のデイリーバックアップから復元したので被害自体は大きくはなかった（ロストしたユーザデータがあるのでなかった、あるいは少なかったとは言わない。当時のチームメンバーには多大な迷惑をかけた。反省している）


# 二度と惨劇を起こさないためにどうしたのか

- 該当DBサーバのcrontabから当該シェルを削除した
- 計画メンテの作業予定に後始末という項目を追加して使用したリソースの片づけを徹底することを **心に刻んだ**ｗ
- ポストモーテムとしては下の下
- が、一回きりの移行作業自体は問題なく出来ていて、後片付けを計画に含めていなかったという話であり、やるなら作業計画書等に後始末の記載を徹底する、等があるんだと思うが、当時の職場にはそういう雰囲気も、次の機会もない（DB移行なんて何度もやらない）というのがあってなぁなぁに終わった

# 最後に

* 手順書を書くよりコードで予定通りフルオートにしたのは今でも間違ったとは思ってない
* 当時書いたシェルファンクションは今も役に立ってるのでインフラ屋もコード管理大事
* crontab は年をまたいで再実行されるので、月日日時を指定していても安心するな
* 使い終わったリソースを片づけるのを手順書やチェックリストに記載するべし。手順書等のひな形に後始末の欄を作っておくのは有用

それでは聞いてください。crontab database ～君がしでかしてくれたもの～

```
君とジョブの終わり　将来の夢
大きなサイズ忘れない
1年後の8月14日午前7時00分（実際の日時）
また出会えるのを信じて
最高の思い出を

出会いはふっとした瞬間
帰り道の交差点でひらめいてくれたね
「シェルで書いてcronで処理すれば当日コマンド打たなくてよくね？」
僕は照れくさそうに
crontab -e を打ちながら
本当はとてもとても
手抜きをしてた

あぁvimでシェルを綺麗に書いて
ちょっとドヤ顔
あぁログが時間とともに流れる

嬉しくって楽しくって
冒険もいろいろしたよね

二人の秘密のリポジトリ

君とジョブの終わり　将来の夢
日付でファイル作成し
1日後の朝7時
また出会えるのを信じて
痛恨の権限エラー

＜中略＞

君が最後まで
心から「消すの忘れないで」
叫んでたこと知ってたよ
涙を堪えて笑顔でrm -f
せつないよね
でかすぎるそのサイズ

突然の実行でどうしようもなく
始末書書くよログも残すよ
忘れないでね crontab -r
いつまでも
```

カーン。ありがとうございましたー。
Flaskで「relation  "<table>" already exists」エラーの対応

Flaskでアプリを作っている時、DBにはpostgresqlを使いSQLAlchemyでラップしてflask db upgradeを実行したところ以下のようなエラーが発生しました。

```relation  "<テーブル名>" already exists```
すこし対応に苦労したので自分用にメモします。（クソ簡単）

対応手順としては以下。
1. ターミナル上で以下のコマンドを実行し、現在のテーブルのバージョンを表示する
    ```flask db history
  ```
![flask db history](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391281/81bad836-9e94-d987-1b7c-8ff3ff10813e.png)
2. <作業ディレクトリ>/migrations/versions　をエクスプローラーで開く
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391281/eb24f08b-54fe-3e6b-6679-c1c1ef1aa5c4.png)
4. 表示されたバージョンと同じ名前のファイルを削除（ここではea0590....pyを削除）
5. flask db migrateを実行
6. flask db upgradeを実行
7. たぶんいける
Linux コマンド rsync リモートマシンとのやり取り

# 目的

- 業務内でコマンド`rsync`を使用したので忘れないようにまとめる


# コマンドの例

- 下記にrsyncを用いてローカルマシンからリモートマシンにファイルをrsyncするコマンドを記載する。

    ```terminal
    # カレントディレクトのフォルダAの中身をリモートのフォルダBにrsyncしたいとき
    $ rsync -av -e ssh ./フォルダA/ リモートユーザ名@IPアドレス:フォルダパス/フォルダB

    # カレントディレクトリのフォルダAをリモートのフォルダB直下にrsyncしたいとき
    $ rsync -av -e ssh ./フォルダA リモート先ユーザ名@IPアドレス:フォルダパス/フォルダ名B
    ```

# より具体的な例(ローカルの指定フォルダの中身を同期)

- リモートマシンはIP: XXX.XXX.XXX.XXX ユーザ名: miriwo_remoteとする。
- 下記にローカルマシンのフォルダ`~/test`の中身をリモートマシンのフォルダパス`~/`直下のフォルダ`test_rsync`にrsyncするときのコマンドを記載する。

    ```terminal
    $ rsync -av -e ssh ~/test/ miriwo_remote@XXX.XXX.XXX.XXX:~/test_rsync
    ```

# より具体的な例(ローカルの指定フォルダを同期)

- リモートマシンはIP: XXX.XXX.XXX.XXX ユーザ名: miriwo_remoteとする。
- 下記にローカルマシンのフォルダ`~/test`をリモートマシンのフォルダパス`~/`直下のフォルダ`test_master`にrsyncするときのコマンドを記載する。

    ```terminal
    $ rsync -av -e ssh ~/test miriwo_remote@XXX.XXX.XXX.XXX:~/test_master
    ```
Firebaseとスタートアップが考える料金のバランスと使い方の話

# 概要

スタートアップにはお金がありません。
出来るだけ、利用するお金を節約しながらも、使っていく必要があります。
そんな中でFirebaseをどうやって使っているのかについて共有したいと思います。

# どういう人向けの記事か

1. 使ったことはないが、スタートアップでのFirebaseの導入を検討している
2. 料金体系的に、本当に使っても問題ないのか判断しかねている

といった個人開発、スタートアップの皆さま向けの記事になります。

# 入った当時の自分の技術スタック

1. PHP5系を書いていた
2. Dockerなどの開発環境構築の知見がある
3. フロントはHTML、CSSを書いたことがある程度

これによりFirebaseなどの認証周りを外だししたようなBaasのようなものは使ったことがないといった状況でした。
その状況で、Firebaseを採用したサービスへのJoinが決まりました。

# Firebaseの何を最初に利用していたか

入った当時にFirebaseを何に使っていたのかを端的に書くと以下の通りです。

1. Authentication(メールのみ)
2. Hosting

サービス自体は、SPAで構成していました。（現状は異なります）
動的ページの部分も無理やり静的ページとしてビルドした上で、Hostingを行う形式です。
Nuxt.jsのconfigでgenerateにページの動的ページのIDを埋め込むなどすれば、Hostingとして無理やり構成できます。（オススメはしませんが）

実際に使ってみた結果どうだったかというと、どちらも便利なんですが、長期運用をする上では、一手足りないというところです。

1. Authenticationについては、認証のデータをバックエンドに持っていないが故に、認証の情報をどこまで持たせるのかを先に決めておかないと実装ミスが発生しやすい
2. Hostingについては、静的サイトなので、/:idといった動的URLを構成するようなページを作成する際には、かなり面倒な処理が入り、SEO対策などをやるにも面倒になる

上記より、長期運用ができそうとわかった段階で、リプレイスが発生することは承知の上で使う必要があります。

# なぜFirebaseを使用していたのか

Firebaseを最初に使っていたのは、今後のことを考えると以下のメリットが発生するかなという仮説があったためです。

1. 認証の外への切り出しが楽になる可能性
2. 当時は、マイクロフレームワーク（Flask）を利用している関係で、認証処理を書きたくない

上記のような状況であったため、認証とフロントエンドのホスティングを楽にしてくれるFirebaseはうってつけな状況でした。

これは余談になってしまいますが、最初にサービスが本当にニーズがあるのかといった段階でお試しをするのであれば、
様々試してみて、すでにやってみた方の意見を聞いてみたときに、以下のような形式でサービスのニーズがあるのか試せるのが良いのではと感じています。

1. Firebaseを中心に、フロントエンドのみを実装して、ユーザーテストをする
2. フルスタックフレームワークをすぐ使える技術スタックがある人がいるなら最低限の機能実装で試してみる

# 何のプランを使用していたのか

Blazeプランを使用でした。
最初は、Sparkプランを使用していましたが、作成していたサービスの性質上、
あまり当時のサービスで行う動作自体が、オンラインの予約だけであったため、アクティブユーザーが常にいるような形態ではなかったのもあり、Blazeにすることで、Sparkプランよりも、利用できる容量範囲が広くなる（無料の容量がという意味で）と判断しました。

もしtoCのiOS, Androidアプリで、バズりそうなものである場合は、あまりオススメしません。（利用状況の想定が難しいという意味で）
WEBサービスで、アクティブユーザーがあまり伸びないが利用はされるような形態のものに関しては、
Blazeのなかの無料料金内で、なんとかなるので、こちらがおすすめです。

# まとめ

1. 最低限のユーザーテストをする際に活用するとめちゃめちゃ便利（もうわかってるよという方ごめんなさい）
2. Blazeプランは、WEBサービスのActiveユーザーがあまり伸びないが利用はされる形式のサービスにはめちゃくちゃお得。


明日は、@sgr-ksmt さんが何か書いてくださるそうです！
楽しみです！
Jupyter で、powershell

# advent calendar 初日
- 準備不足で初日は、簡単なtips を書くだけです。すみません。
- 埋まっていない日がすごくいっぱいあるので、書いていきますが、レベルはこの記事レベルのになります。すみません。

## 想定読者
こんな人がこの投稿の想定読者です。jupyter を、Windows で楽したいという人のための記事です。

- ITスキルはそこそこの人
- Windows 10 (64bit) ユーザ
- minconda3 
- powershell(5.x or 6)
- powershell は、jupyterで操作したい
- PC複数使用しているが同じnotebook を使いまわししたい

## 省略する準備
 - jupyter のインストール

## PowerShell で起動

PowerShell で、jupyter notebook で起動すると、Windows あけっぱなしにする必要あります。あまり使い勝手よくないので、閉じているといいですよね。知っている人は知っていると思いますが、起動するとすぐに閉じるコマンド紹介です。

```
powershell -WindowStyle Hidden jupyter notebook
```
 
## notebook のパスを取得　複数PCでの使うときに便利

複数のPCで作業する場合は、絶対パスがPCによって違うことがあります。
そういった場合に、notebook の中で、notebook のいるパスが取得できれば、
スクリプトは、絶対パスを意識しないですみます。下記のコマンドで取得できます。
なお、%pwd でも取得できます。タイプ数が少ないのと、import os をしない場合でも
使えるので、適宜選択してください。

```
os.getcwd()
```

## script を powershell に変更
jupyter のデフォルトの設定では、DOSプロンプトが開きます。
下記で、powershell に変更しましょう。

```
import os
os.environ['comspec']='powershell.exe'
!Get-Process
```

とてもささやかな記事ですが、役立つ人もすこしはいるかなと思っての投稿でした。
運用中のスマホゲームに起きがちな不具合とその対策案

本記事は、[サムザップ Advent Calendar 2019 #2](https://qiita.com/advent-calendar/2019/sumzap2) の12/5の記事です。

スマホゲームの企画・運営事業を行っている[サムザップ](https://www.sumzap.co.jp/)で、エンジニアマネージャーをしています北島です。
私は今まで、ゲームの不具合を減らすことに取り組んでくることが多かったです。
今回は、その経験から運用中のゲームタイトルで起きがちな不具合とその対策案について、個人的な意見をまとめます。

#起きがちな不具合

私の担当しているゲームタイトルの直近半年間の不具合を分析したところ、
以下のような原因の不具合が多いということが分かりました。

- マスターデータの不備
- バッチ系の不具合
- 画像内の文言や要素の間違い

あくまで、これはひとつのゲームタイトルの不具合を分析した結果であり、
システムやインフラの構成、ゲームのジャンルや運用の仕方などで、起きる不具合は変わってきます。
とはいえ、マスターデータの不備による不具合はどのタイトルでも多い印象がありますし、
ある程度、似たようなところはあるのではないでしょうか。

#マスターデータの不備

私の感覚では、マスターデータ系の不具合がどのゲームタイトルも一番多いのではないかと思っています。
業界の永遠の課題でもあります。
マスターデータはレベルデザインの担当者や企画職などの非エンジニアが作成することも多いと思いますが、
エンジニア側も企画職が作成したデータを何のチェックもせずに受け入れるわけにはいきません。
私としては、以下が良いのではないかと思っています。

- マスターデータ作成ツールのような、企画職がなるべくミスしにくいものを用意する
    - 用意した作成ツールのようなもので、企画分掌でのデータのバリデートをする
- 企画職が作成したマスターデータの型チェックや数値のMin,Maxの範囲チェックなど、エンジニア側はエンジニア分掌でバリデートをする

弊社ではマスターデータにCSVを用いていることが多いのですが、
長年ゲームの運用を続けた結果、とあるイベントを実施するためには、CSVが50個も必要という状態になったことがあります。
細かな設定ができるようにするのは良いことですが、細かくすればするほどデータは複雑になり、当たり前ですが不具合が起きる可能性は高まります。
よって、できるだけ単純なデータに抑えるのも重要と言えます。
この時、50個のCSVを単純化して減らすことができたら良かったのですが、
単純化する際のシステム側の影響範囲が大きく、不具合リスクが高いと弊社では判断しました。
結局、必要最低限のデータを入力することで、自動で50個のCSVを作成するツールを作るという、
マスターデータを自動で作成するマスターデータを作るという方法でこの時は回避しました。

#バッチ系の不具合

ランキングを作成するバッチ、イベントの報酬アイテムを配布するバッチなど、
大量のデータを取得・更新するバッチですが、不具合の起きやすい部分でもあります。
不具合が起きやすい理由は、以下が考えられます。

- プレイヤーの状態によって更新する条件が変わる等、パターンが多くチェックが難しい場合が多い
- 本来は大量のデータを更新するバッチだが、dev環境では大量のデータが用意しづらい
- 故に、ダミーデータを用いたチェックなど、手を抜きがち

prd環境のデータを簡単にdumpしてバッチを検証する環境にimportできるようなツールを作成する、バッチの実行結果をファイルに出力し、そのファイルを読み込むと綺麗に表示してくれるツールを作成するなど、なるべく面倒な部分を排除し、エンジニアやQAが手を抜かないようにするのが効くと思っています。

#画像内の文言や要素の間違い

ガチャやショップなどの販売画面に表示している画像において、
実際に販売している内容とは異なるキャラクターやアイテムなどの画像や文言を表示してしまうような不具合です。
販売画面での不具合は、クリティカルな不具合になる可能性が高く、なるべく避けたい不具合ではあります。
これの対策としては、以下が考えられます。

- 画像ファイル名にルールを決めコード側で自動で出し分ける
    - 例えば、ガチャで特定のキャラクターをピックアップするような内容の画像であれば、画像名に「_character10」というようなキャラクターのIDを付けます。
    - そして、全キャラクター分の画像を用意し、マスターデータを元にプログラム側で表示する画像を自動で出し分けするようにします
    - 全パターンの画像を用意しておく必要があるので、パターンが少ない場合のみ有効な手段になります
- 画像そのものをチェックすることを行う
    - 画像を組み込んで実装が完了した画面でのチェックをすることが普通だと思います
    - そのチェックも必要ですが、画像そのものだけをチェックすることで不具合を発見できる確率が上がります
- なるべく画像内に文言などを入れないようにする
    - ガチャやショップなどの販売画面は、訴求したい内容を文言で入れたい場合がどうしてもあります
    - なので難しい場合も多いですが、不具合を減らすという観点ではなるべく単純な画像にすべきです

#最後に

今回は、運用中のスマホゲームに起きがちな不具合とその対策案について、個人的な意見をまとめました。
不具合は、ゲームを遊んで下さるお客様にも、ゲームを運用する運営にとっても悪でしかありません。
少しでも不具合のない世界にしていきたいですね。

明日は、@hiroyuuki さんの記事です。
simpleでfastでsafeなプログラミング言語 V の導入

## はじめに
この記事は，SLP KBIT Advent Calendar 2019 の1日目の記事です．
タイトルの通り，プログラミング言語Vのインストールを行っていきます．

## Vとは
https://vlang.io/
https://github.com/vlang/v
2019年6月22日にリリースされたプログラミング言語です，
シンプルで早くて安全というこということを謳っています．

```golang
fn main() {
    println(add(77, 33))
    println(sub(100, 50))
}

fn add(x int, y int) int {
    return x + y
}

fn sub(x int, y int) int {
    return x - y
}
```
出典: https://github.com/vlang/v/blob/master/doc/docs.md
公式のコードを見た感じ，かなりGoライクです．

## 環境
macOS X バージョン 10.14.6 (Mojave)

## インストール
まず，githubからVをクローンしてきます．

```
$ git clone https://github.com/vlang/v
$ cd v
$ make
```
次のコマンドでVをアップデートすることができるようです．
一応やっておきます．

```
$ v up
```
この段階では，```[vをダウンロードしたディレクトリ]/v```で，vを実行できるみたいです．
 
どこのディレクトリからでもvで実行するためには，シンボリックリンクを張る必要があるみたいです．
次のコマンドで```/usr/local/bin/v```にシンボリックリンクを張ることができるみたいです．

```
$ sudo ./v symlink
```
```$ v```と入力したとき以下のような画面になったらインストール成功です．

```
$ v
v 0.1.23 1a0b78a
Use Ctrl-C or `exit` to exit
>>> 
```

グラフィックモジュールを使用するときはglfw, freetypeが必要です．
また，httpパッケージを使用するときは，opensslが必要です．
以下のコマンドでインストールできます．

```
$ brew install glfw freetype openssl
```
## ちょっと触ってみる
FizzBuzz問題

```golang
fn main() {
	n := 50
	for i := 0; i < n; i++ {
		if i % 3 == 0 {
			println("Fizz")
		} else if i % 5 == 0 {
			println("Buzz")
		} else if i % 15 == 0 {
			println("FizzBuzz")
		} else {
			println(i)
		}
	}
}
```
goとほとんど同じです．
違うのはpackageがなくても動くことくらいですかね．

## おわりに
すでにVSCodeでVの拡張機能があったことに驚きです．vimのプラグインもあるみたいです．
これからどのようになっていくのか楽しみです．
Amazon Linux用Zabbixリポジトリのダウンロード傾向

Zabbix AdcentCalendar 2019 
1日目の記事です。

#この記事の目的
[Amazon Linux用Zabbixリポジトリ](https://qiita.com/qryuu/items/b63fa774e8efcda4a681)を作成しています。

このリポジトリは、Amazon S3で公開されており、
CloudTrailでアクセス情報を収集してQuickSightでアクセス状況を分析しています。

今回はこの分析からZabbixとAmazonLinuxの利用状況を考察してみます。

#アクセス数
リポジトリへのアクセス数は順調に伸びています。
<img width="889" alt="2019-11-30_14h48_43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/ccef88a5-d54b-42f0-1b9c-7308eb0a9dd1.png">
2019年11月は6000件のアクセスがありました。

Amazon Linux 2 でのZabbix 3.0,Zabbix 4.0 の利用が多いですが
2019年10月からはAmazon Linux での Zabbix 4.0 の利用が増えています。

#Zabbix 利用割合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/f632fb44-2b3d-d20e-2dad-9398c25c1000.png)
累計のアクセス数では50％がAmazon Linux2 用のZabbix 4.0 となっています。

ZabbixConferenceでのアンケートなどでは最新版の利用も多いようですが
Amazon LinuxではLTSの利用が多いようです。

#エラーリクエスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/58a9ebab-0545-bb52-0721-6ac1a2d368f0.png)
総数は多くないですが、存在しないファイルへのリクエストがある程度存在します。
4.3 などの存在しないバージョンリクエストもたまにありますが、
多いのはリクエスト形式が異なる、変数展開に失敗しているリクエストなどです。
<img width="879" alt="2019-11-30_14h52_33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/62b9c1ed-cb46-93ae-9645-cc7663a27121.png">

<img width="880" alt="2019-11-30_14h51_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/2f303e94-fb69-3f12-e550-157d068fb9bb.png">

2019年11月には、credential情報や、ビットコインのウォレット情報などを求めたリクエストがありました。
S3バケットを公開している人は誤って公開しないようにご注意ください。
<img width="880" alt="2019-11-30_14h50_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/553079fd-bc84-7c62-900c-521d49527ff9.png">

#アクセス元
<img width="583" alt="2019-11-30_14h54_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/4e7bdb1c-5934-27c0-ab0e-e45a256d7b9e.png">

アクセス元はインターネットからのアクセスが多いですが、2019年8月頃からはVPCエンドポイント経由のアクセスも増えています。
VPC内での閉域利用も増えているという事でしょう。

##UserAgent
Amazon Linux,Amazon Linux 2 用のリポジトリなので、ほとんどはyumになっていますが、curl やPythonn等があるのは、自動化などでのアクセスがあるのかもしれません。
SlackbotでのアクセスはChatOpsでの利用でしょうか。
<img width="373" alt="2019-11-30_14h57_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/3ac137f6-38a4-7abf-df35-918aef87ec7c.png">

#おわり
Amazon Linuxの環境ではZabbixの[自動構築](https://qiita.com/qryuu/items/c3fb49b33068d6cbabf1)も可能です。

[Zabbix AdcentCalendar 2019](https://qiita.com/advent-calendar/2019/zabbix)
ぜひエントリーをお願いします。
[Oracle Cloud] OCI から OCI-Classic ダッシュボードへ移動

# はじめに

OCI から OCI-Classic のダッシュボードへ移動する方法を書きます。たまに使う機能ですがいつも忘れるので備忘録です。



# 手順

OCI Console の右上にある User Icon を選択して、「Service User Console」を選択します
※ 環境によっては、Home Region でのみ「Service User Console」が表示されるものもありました。表示されない場合は、Region を確認してみましょう

![1575125239169.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/4bc76803-aa43-7a33-b662-c97369e68e64.png)



Infrastructure Classic Dashboard を選択します

![1575125338909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3ce06e23-2d10-bbf2-0cfb-da04df1585e8.png)



Classic のダッシュボードへ辿りつきました

![1575125389128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/4ba4c425-b0a6-9ed4-a5cd-938f189220f9.png)
機械学習の学び方６選＋感想

# はじめに

本記事では、“機械学習をどう学んだか”というテーマについて述べます。これまで@daikikatsuragawa はさまざまな方法で機械学習に触れ、学びました。それぞれの方法で得られたものや学んだポイントは異なりました。今回は、それぞれで何を得られたのかなどを紹介していきます。

今回の対象は以下です。

- 講義
- 研究
- インターンシップ
- Kaggle
- 勉強会
- SNS

※本記事は、あくまで2019年12月時点での個人の主観です。それゆえ、ご参考までにご覧ください。

# 機械学習をどう学んだか

## 講義👨‍🎓

### 概要

大学で情報科学を専攻していました。“データ〇〇”、“機械学習〇〇”、“人工知能〇〇”などという題の講義を受講し、機械学習について学びました。

### 感想

事前知識がほとんどない状態でしたが、データ分析とは、機械学習とはなんたるかということについて学ぶことができました。当時、人工知能（AI）、ディープラーニングと聞くと難しく感じていましたが、機械学習に関して、シンプルなアルゴリズムや概念について概要を学ぶことができました。ただし、プログラムを書いたわけではないので、この時点では概念はなんとなくわかるものの実装に対するハードルはかなり高く感じているという状況でした。

## 研究👨‍⚕️

### 概要

データを活用して、社会や福祉における問題に対していかに貢献するかといったことに取り組む目的の研究室に所属していました。研究を通して、必要に応じて書籍やウェブ、学術論文を読み、他のメンバーの知識を共有してもらうことで機械学習について学びました。

### 感想

機械学習によって社会をこんなに豊かにできるのかという“活用”について特に考えることができたと思っています。既存、関連研究や、他メンバーの研究に数多く触れることで多くの活用事例を把握することができました。これにより、機械学習の目的、タスクや適したアルゴリズムなどを整理するノウハウを得ることができたと思います。しかし、場合によってはデータ取得自体にかなりのコストがかかってしまい、モデルの構築に多くの時間を割く事ができないという点もありました。

## インターンシップ🏢

### 概要

クライアントの要望に対して、データ分析、機械学習を用いて応えるという任務を受けていました。

### 感想

大まかには研究と似ている点も多いと思います。異なる点としてビジネスに関する考えを学ぶことができたと思ってます。具体的には、インターンシップとはいえ、マネタイズやコストなど費用の面についても意識する必要がありました。また、期限について、納期が明確に決まっており研究などよりはシビアに守る必要がありました。また持ち帰って作業をすることができず勤務中の過ごし方についてもかなり考える必要がありました。つまり、一貫して限られた条件（費用、利益、時間）でいかに最善を尽くすかということを考え、そのノウハウを学ぶことができたと思ってます。

## 勉強会📖

### 概要

しばしば勉強会に参加していました。内容はAIや機械学習に関して参加者が気になったトピックを共有して、それらに関してゆるく話し合うという内容です。

### 感想

早耳参加者から共有してもらう最新情報について学ぶことができました。技術、活用に関して日々研究がなされ参加しています。このような機会に積極的に参加することで常に最新の情報が得られるのかと思います。また、一つのニュースに対しても人によって捉え方が異なるのでそのあたりの刺激を受け、さまざまな捉え方を学ぶこともできました。

## Kaggle📈

### 概要

データサイエンスのコンペティションプラットフォームであるKaggle[^Kaggle]。実はインターンシップ参加時に社員さんから紹介を受けて知りました。まずはコンペに参加し、結果をだすことを目標に実装したり、周辺知識について勉強していました。

[^Kaggle]: https://www.kaggle.com/

### 感想

アウトプットをする機会が多く、まずは機械学習を用いた予測をし結果を出すという流れについて何度も繰り返すことでノウハウを学ぶことができました。またコードのレベルで他者のやっていることを見ることができるため、実装のノウハウについても学ぶことができます。研究における学術論文ではアルゴリズムまでしか紹介されていないことも多く、他者のコードを多く見られるという点で魅力的でした。また、コンペ、データ自体も豊富であり、活用事例について学ぶこともできたかと思います。目的やタスクが定まっており、データも用意されているため、その状況でモデルの構築に集中して取り組むことができます。それゆえ、実装に関するハードルはかなり下がったと思います。

## SNS📱

### 概要

Qiita[^Qiita]やTwitter[^Twitter]で気になる人をフォローして、情報を得ていました。最近はKaggleも活発ということもあり魅力的な人が多く、その人たちをフォローさせていただいております。また、すきあらば、非力ながら何かしらを発信しようとアウトプットしようとしています。

[^Qiita]: https://qiita.com/
[^Twitter]: https://twitter.com/

### 感想

勉強会と同様に最新情報を得ること、さまざまな人の意見を知ることができました。勉強会と異なるのは、オンラインということもあり、より多くの、素晴らしい方々の発信を受けることができるという点だと思っています。
またアウトプットという目標もできるためその内容に関して今一度学ぶ機会になっています。

## 番外編💡

### 複数の学び方を試すこと

これまで、６つの機械学習の学び方を紹介しましたが、わたしが特にオススメしたいことは、これら複数を組み合わせて試すことです。自分は、講義で“機械学習はなんたるか”を、研究やインターンシップで“どのように活用するか”を、Kaggleで“モデルの構築のノウハウ”を、勉強会やSNSで“最新情報”や“他者の考え”を学ぶことができたと思ってます。上記の方法は全て目的や状況が異なるため向き不向きや得られるものが異なります。それゆえ、複数を組め合わせることをオススメします。

### 他の学び方
わたしは試していないため特に言えることはありませんが、他にも機械学習の学び方があります。今後、試してみたいと考えております。皆さんもぜひ試してみてはいかがでしょうか。

- オンライン講義（Coursera[^Coursera]など）
- 発表（勉強会など）
- 書籍

[^Coursera]: https://ja.coursera.org/

# まとめ

“機械学習をどう学んだか”というテーマについて述べました。いかがでしたか？ぜひ参考にしていただけると幸いです。

それではみなさん。良い機械学習ライフを！（？）
C++の日時・時間表記について【tm構造体とstrtime関数】

C++で日付関連の処理についていろいろつまづいたので、忘れないようにまとめておきたいと思います。

#tm構造体について
tm構造体はカレンダー日時を保持する構造体です。年月日時分秒などの情報を持ちます。時間を指定をすることで、特定の日時のtm構造体を取得することができます。

##tm構造体の2つの注意点


<dl>
<dt>１：年の情報が1900年から数えた年である</dt>
<dd>tm構造体のtm_yearには年の情報が格納されていますが、これは1900年から数えた年数になっています。
つまり、「2019年」を入れたい場合は「119」を入力する必要があります。</dd>
<br>
<dt>２：月の情報が1月から数えた年である</dt>
<dd>tm_monには月の情報が格納されていますが、これは1月から数えた月の数になっています。
つまり、11月を指定したい場合には10を入力する必要があります。</dd>
</dl>
```c++

//年月の注意点の具体例
int main(void){
   //年月の情報をそのまま入力した場合
   struct tm badstruct={0,0,0,11,11,2019};
   time_t badtime=std::mktime(&badstruct);
   
   //年月の情報を適切に入力した場合
   struct tm correctstruct={0,0,0,11,10,2019-1900};
   time_t correcttime=std::mktime(&correctstruct);
   
   
   std::cout << "間違い：" << std::asctime(std::localtime(&badtime)) << std::endl;
   std::cout << "正しい：" << std::asctime(std::localtime(&correcttime)) << std::endl;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/67a0474a-08c5-5fd3-b8cb-34845425341a.png)


#strtime関数について
strtime関数はtm構造体から必要な情報を選択し、文字列に変換する関数です。この関数を利用することで、構造体の情報を文字列として出力するだけでなく、情報を適切な形に成型して出力することもできます。詳しい変換指定子、出力内容についてはリファレンスを参照してください。



```c++

YYYY/MM/DDの出力例
int main(void){
   struct tm timestruct={0,0,0,11,10,2019-1900};
   time_t currenttime=std::mktime(&timestruct);
   
   char str[100];
   std::strftime(str, sizeof(str), "%Y/%m/%d", std::localtime(&currenttime));
   
   std::cout << str << std::endl;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/22938a2a-d777-ced3-9be8-fdff90009ee8.png)

類似の機能をもった関数としてはasctime関数があり、こちらはtm構造体から特定のテキスト表現（Www Mmm dd hh\:mm :ss yyyy\n）に変換します。
#参考サイト
・[【c++】明日、昨日、指定した日付を取得する](https://qiita.com/ashdik/items/b123c852dac8a110f5e6)
・https://ja.cppreference.com/w/cpp/chrono/c/tm
・https://ja.cppreference.com/w/cpp/chrono/c/time
・https://ja.cppreference.com/w/cpp/chrono/c/asctime
回帰分析について詳しく解説します


Udemyの[【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -](https://www.udemy.com/course/kikagaku_blackbox_1/)という講座にて，単回帰分析について学んだので忘れない内に忘備録を残しておきます

ちなみにQiitaにはいつもお世話になっていても，自分で記事を書くということは恐れ多くて一度もしていなかったのですが今回初投稿します．

# 単回帰分析とは
単回帰分析という大層な名前がついていますが，要は中学校のときに習った $y = ax + b$というやつです　で，この1次関数に**未知のデータ**を入れると，予測してくれるって感じです

なんだそんだけかよって感じですがそんだけです　ちなみに変数が1つの場合の回帰分析だから**「単回帰」**なんです　じゃあ変数が2つ以上になったらどうなるかというと，「重回帰」分析になります　単純ですね

ちなみに回帰という言葉，なぜ1次関数の式に回帰って言葉がついているかって思いませんか

僕はずっと謎だったのですが，以前統計学の本を読んでいると回帰について書いてありました　内容は，身長の低い人親から生まれてくる子供はもっと低くなるわけではなく，少し高い子が生まれてくる「平均への回帰」という意味が語源だそうです

確かに言われてみれば身長低い親からさらに低いor 同じ子供がずっと生まれたら無限に小さくなりますもんね　いやーよく出来てますね　あ，ふーんって感じですよね　次に行きます

# データの中心化について
単回帰分析では**データの中心化（センタリング）**ということをします

というのは中心化というくらいなんで，バラバラのデータを中心に持って来る必要があります　じゃあどうするのかというと，平均を使うわけです

つまりデータ全部に対して，平均を引きます　そうすることによって，データが中心（グラフでいう原点）に寄っていきます

例えば日本人男性の身長のデータがあった時に，大体170センチ前後なので全部のデータから170を引けばまあ大体プラス・マイナス5くらいには収まるだろうって感じしますよね？

で，中心化は何がいいのかって話なんですが，**定数項を消せる**ということです

どういうことかというと， $ \hat{y} = ax + b$ が $ \hat{y} = ax $ になるってことなんですよ（ちなみにこのyの上についている記号は**ハット**という記号で，統計学では予測値に対して使う記号です）

いや，そんだけかよって思いますが，一つ文字を減らせたのはでかいです　で，なぜそうなるかというと，中心に寄ったので**原点を通るとみなせるからです**　

一応書くと，原点を通るグラフは切片$b$が0なので$ y = ax　$になりますよね

# 評価関数について
評価関数とは**損失関数**とも言うらしいですが，要は**実測値と予測値の差**のことです

当たり前ですが，評価関数は小さければ小さいほどいいです　というのはこの誤差が小さいということは回帰式のモデルはより正確ということを意味するからです 

で，どうすんのかっていうと誤差を小さくするようパラメータを調整するってことです　当たり前すぎますね

具体的には $ (y - \hat{y})^2 $というyの実測値とyの予測値の二乗誤差を計算して，その後に微分をします　ちなみになんで二乗なのかというと，二次関数になる＝微分可能　だからです

ちなみに絶対値を取ると，カクカクなグラフができ，微分不可能です


# 二乗誤差の導出
評価関数　$ L = \sum_{n=0}^N (y_n - \hat{y_n}) ^2 $

評価関数は出来たんで，あとはどうするかっていうと先程と言った通り微分するだけです　その後，最小化するので微分して0にします

つまり$\frac {\partial}{\partial a } (L) = 0 $ということをしてあげればいいのです

要は評価関数$L$を$a$で偏微分して，$0$にするってことですね

また$\hat{y} = ax$だったので$\hat{y_n} = ax_n $になります

これを代入すると$ L = \sum_{n=0}^N (y_n - ax_n) ^2 $ になり

展開すると$ \sum_{n=0}^N (y_n^2 -2y_nax_n + a^2x_n^2)$ になります

そしてこれをaで偏微分するので
$ \displaystyle \frac{\partial}{\partial a}\sum_{n=0}^N (y_n^2 -2y_nax_n + a^2x_n^2)$
$= \displaystyle 2\sum_{n=0}^N(y_nx_n) - 2\sum_{n=0}^N(x_n^2)a$

これが0になるので変形するとにこうなります

$$\displaystyle\sum_{n=0}^N(y_nx_n) = a\sum_{n=0}^N(x_n^2)$$

そして$a$を求めるように変形すると
$$ a = \displaystyle\frac{\sum_{n=0}^Ny_nx_n}{\sum_{n=0}^Nx_n^2} $$

ということでaの式が求まりました　わーい

ここで気をつけてほしいのは，ここでいう$x_n$と$y_n$は**中心化をしたもの**ということです なので実際に求めるにはもととなるデータに中心化，つまり平均を引くという作業をする必要があります　そして上の式を使ってパラメータ$a$を求めるという流れになります

例えば$x = \\{1, 2, 3\\}$のとき$y=\\{2, 4, 6\\}$という数値を学習させ，$x =1.5$のデータのときの$y$は何であるか予測するという簡単な問題があったとします　

この問題を解くにはまず$x,y$の平均を求め中心化を行います
まずxの平均$\bar{x} = 2$，yの平均$\bar{y} = 4$となります
そしてxを中心化した$x_c = \\{-1,0,1\\}$，yを中心化した$y_c = \\{-2,0,2\\}$です あとは上の式に代入すると$a = 2$となります

そして$\hat{y}=2x$とわかったので，$x=1.5$を代入すると$\hat{y}=3$が求まりました

という流れです　これはぶっちゃけただの比例の式なんでメリット全く無いですが，実際には大量のバラバラなデータを使うんで中心化が大事になってきます

# さいごに
Qiitaに初投稿ということやLaTexを使い慣れていないということもあって，お見苦しい点があったかもしれませんが，誰かの参考になったなら幸いです

また上に書いたUdemyの講座は，数学のわからない僕のような人間でも理解することが出来るほどわかりやすいのでめちゃくちゃオススメです

# 参考にしたサイト
両方めちゃくちゃわかりやすくて助かりました
[Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)
[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
composer dump-autoload

半日ほど悩まされました。

まずは経緯。

`$ php artisan db:seed`

こちらを実行しようとすると、

`ReflectionException  : Class EntriesTableSeeder does not exist`

こちらのエラーが。
ただ、少し調べると、

`$ php composer.phar dump-autoload`

を実行すれば解決できるとのこと。
しかし結果は...

`Could not open input file: composer.phar`

何故このエラーが出たかというと...
**プロジェクトディレクトリの中**で実行していなかったんですね。
...そりゃそうだ。

という訳で、composer.pharを**プロジェクトディレクトリの中**に移動してあげてから、
`$ php composer.phar dump-autoload`
を実行してあげたら解決出来ました。
【Rails】belongs_toで関連付けしたけどデータが保存出来ない　→単数形にしてる？

## はじめに
Railsアプリ作成中、`belongs_to`で関連付けたモデルのデータ保存がうまくいかず、はじかれてしまったので解決した方法です。

しょうもないミスでした:sweat_smile:

## この記事が役に立つ方
- `belongs_to`で関連付けはしたが、うまく保存が出来ない方

## この記事のメリット
- 無事にデータが保存出来るようになる。

## 環境
- macOS Catalina 10.15.1
- zsh: 5.7.1
- Ruby: 2.6.5
- Rails: 5.2.3

## エラー内容
1対多の関係にある、UserモデルとRecordモデルがあるとします。

Recordテーブルのデータを新規作成し、`save!`でデータ保存しようとしたところ、以下のようなエラーが発生。

```zsh
ActiveRecord::RecordInvalid: Validation failed: Users must exist
```

保存するデータには外部キー`user_id`があり、そこにはちゃんと値が入っていて、「あれ？なんで？」と困る。

このときのモデルは以下のように定義していました。

```ruby:app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users
end
```

ここから応急処置（間違った解決法）とちゃんとした解決法を記載します。

## １．応急処置（間違った解決法）
以下のように変更。

【Before】

```ruby:app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users
end
```
↓
【After】

```ruby:app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users, optional: true
end
```

`optional: true`で関連モデルなしでOK！と放し飼い状態にし、一旦。バリデーションを回避。

しかし、全く意味のない**矛盾した設定**になるのであくまでも応急処置。

割とググるとこの解決法が多かったですが、あまり良くないと思います。

## 2.解決（ただの設定ミス）

【Before】

```ruby:app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users, optional: true
end
```
↓
【After】

```ruby:app/models/record.rb
class Record < ApplicationRecord
  belongs_to :user
end
```

:x:　複数形
:o:　**単数形**

> belongs_to関連付けで指定するモデル名は必ず「単数形」にしなければなりません。

[Rails ガイド](https://railsguides.jp/association_basics.html)にもちゃんと書いてました！

英語で考えたら当たり前、お恥ずかしいです:tired_face:
`optional: true`も不要なので削除。

これで問題なし！

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

しょうもない設定ミスで時間をロスしてしまったので、同じようなエラーで困っている方がいれば参考にして頂ければと思います:sweat_smile:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Active Record の関連付け - Rails ガイド](https://railsguides.jp/association_basics.html)
アイデンティティを理解するヒント？：copy と duplicate の違い

#結論

copy した Entity は Entity ではなく複写（スナップショット）。オリジナルと同じIDを持ち、Entity として永続化するのは危険。
duplicate した Entity は複製であり別の Entity。集約内全てに新規にIDを払い出し、永続化する。

#アイデンティティはやっかいな概念

DDD では Entity を中心にしてモデルを考えますが、Entity は明確にアイデンティティを持つとされながらアイデンティティそのものについてはあまり注意を払われることが無いというか ID を持つとしか言及されないことが多いと思われます。
ですが、これが思わぬ問題を引き起こすというか、言及漏れを招くことがあります。
例えば、Entity に copy メソッドを作成してコピーを作るとします。

```kotlin

class EntityX(val id:Int, var name:String) {
    fun copy():EntityX = EntityX(id,name)
}

val xa = EntityX(0)
val xb = xa.copy()
xb.name = "new name" //xa.nameは…？

```

さて問題です。このコピーされた xb は xa と同一の Entity でしょうか？ xb の name を変更したとき、 xa の name も変更されるべきでしょうか？
恐らく、そんな挙動を望むケースは多くは無いと思われます。例えば一度買った商品を再度買う場合、おそらく「注文」をコピーして新しい「注文」を作ることになるでしょう。ですが、新しい注文で数量を変更したときに元の「注文」が変わってしまっては困るからです。
そんな時は、対象を duplicate します。

```kotlin

class EntityX(val id:Int, var name:String) {
    fun duplicate():EntityX = EntityX(EntityXRepository.newId(),name)
}

val xa = EntityX(0)
val xb = xa.duplicate()
xb.name = "new name" //xa とは明確に別 Entity

```

この二つの違いは何でしょうか？なぜ duplicate は ID を払い出すと言えるのでしょうか？

#copy と duplicate の違いを英英辞典で調べてみる。

[ロングマン英英辞典で調べてみましょう。](https://www.ldoceonline.com/jp/dictionary/duplicate)

duplicate :  to copy something exactly

exactly!「まさに!それそのもの!」としてコピーする、ということですね。逆に言えば、 copy は「まさに!」ではないのでしょうか？実のところ滅多に気にする人はいませんが、 copy したものは同格のアイデンティティにならないことがあります。偽物というのではなく、 copy 先のアイデンティティと同格になります。

## copy to はあるが duplicate to はない

copy は、正確には「ある対象に copy する。ある対象が存在しなかった場合、適宜新しいアイデンティティを作成する」という意味になります。
例えばある文章をある記事に copy した場合、その文章はその記事の一部になります。
例えばある文章を印刷(copy)した場合、「新しい紙や本」に複写することになり、「印刷物」としてのアイデンティティを新たに持ちます。
一方、 duplicate は対象を取りません。必ず複製として「作成」され、新しいアイデンティティを得ます。
なお、 copy of と duplicate of は両方とも有ります。

## copies は「複写が複数」という意味だが duplicates は重複を意味し、「複製は一つであり得る」

例えば、同じ文章が2回繰り返された場合、同じ文章が2回繰り返された場合、これは重複 = duplicates です。重複した文章はそれぞれ存在する同じ文章、同じ値だけど別のアイデンティティを持つという事ですね。これは複製が同格という事です。一方、copies は単に印刷物が複数あることを示し、copy 元の原稿と印刷物は同格ではありません。

##プログラム上のオブジェクトの copy はどうするべきか？

以上のことを踏まえると、あるオブジェクトを copy したらそれは永続化せずに使い捨てろ、という話になります。
ある Entity を copy して操作しても、それをそのまま捨ててしまえば何の問題もありません。
逆に一時的に copy を作って、仮に操作した結果を見たい、それで良いと思ったら commit したい、というケースがあります。その時は copy を Entity に「反映」しましょう。

例えば、JPAなどの明示的な更新を行わない永続化システムを使うときには、仮の操作をする対象は copy を取ったり永続化から切り離す(detached)必要があります。
明示的な更新が必要な永続化システム、例えば DB フレームワークは実際に永続化されてる Entity はDB内にあり、 select した結果は「DB 内で永続化されてる Entity の値」、Entity を表すものであって Entity 自体ではありません。なにもしなければそのまま捨てられてしまうので、DB 内に永続化されている Entity に反映、つまり update します。

##集約内の Entity の copy / duplicate はどうするべきか？

まず、値・バリューオブジェクトはアイデンティティを持たないので単に同じ値をとるようにします。
集合内に子 Entity を含む場合、それは copy の際はそのままシャロー／ディープコピーすればいいでしょう。どちらがいいかは深いところまで操作したいか？という別の話です。
duplicate する場合は、必ず子 Entity にも新しく ID を振り出す必要があります。そうしなければ集約が壊れてしまいます！
もし Entity が別の Entity を参照することでオブジェクトツリーに入っている場合、それは参照であり実体ではないので永続化する際には ID を通しての参照に置き換えるのが良いでしょう。
LaTeX tips for student(me)

## はじめに

引き続き, B2のJabelicです. [明治大学/明治大学大学院 AdventCalendar 2019](https://qiita.com/advent-calendar/2019/meiji_univ) 2日目の記事です. 
ちょっと特殊というか, たまーに使うものを列挙. 完全に自分用のメモになってしまいますが.

## 数式を縦に並べたいとき

```tex

\begin{equation*}
\hat{w}\ x + \hat{b} = 
     \left\{
     \begin{aligned}
          \geq 0 \hspace{5mm}\Longrightarrow\hspace{5mm}G_1\\
          < 0 \hspace{5mm}\Longrightarrow\hspace{5mm}G_2\\
     \end{aligned}
     \right.
 \end{equation*}
```

```math
\begin{equation*}
\hat{w}\ x + \hat{b} = 
     \left\{
     \begin{aligned}
          \geq 0 \hspace{5mm}\Longrightarrow\hspace{5mm}G_1\\
          < 0 \hspace{5mm}\Longrightarrow\hspace{5mm}G_2\\
     \end{aligned}
     \right.
 \end{equation*}
```



## 左右に配置したいとき

```tex

\begin{equation}\
     \begin{aligned}\
\verb|\begin{equation}|\\
\verb|\begin{matrix}|\\
\verb|a_{11}&a_{12}\\|\\
\verb|a_{21} & a_{22}\\|\\
\verb|\end{matrix}|\\
\verb|\end{equation}|\\
     \end{aligned}\
     \quad \text{$\hspace{10mm}\Longrightarrow\hspace{10mm}$}\
     \begin{aligned}\
\begin{matrix}\
a_{11}&a_{12}\\
a_{21} & a_{22}\\
\end{matrix}\
     \end{aligned}\
\end{equation}\
```

```math
\begin{equation}\
     \begin{aligned}\
\verb|\begin{equation}|\\
\verb|\begin{matrix}|\\
\verb|a_{11}&a_{12}\\|\\
\verb|a_{21} & a_{22}\\|\\
\verb|\end{matrix}|\\
\verb|\end{equation}|\\
     \end{aligned}\
     \quad \text{$\hspace{10mm}\Longrightarrow\hspace{10mm}$}\
     \begin{aligned}\
\begin{matrix}\
a_{11}&a_{12}\\
a_{21} & a_{22}\\
\end{matrix}\
     \end{aligned}\
\end{equation}\
```


## 化学組版

[TeXによる化学組版]( https://doratex.hatenablog.jp/entry/20131203/1386068127 )
これがすごい. ヤバイ

### 化学式
プリアンブルに
`\usepackage[version=3]{mhchem}`

```tex

\[\ce{HA + H_2O <=>[K^+][K^-] A^- + H3O^+ }\cdots(5.1)\]
```
![chemi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243022/87927101-8bde-a20c-6bde-bb3d793fe5d9.png)





### ベンゼン環


[TeXによる化学組版]( https://doratex.hatenablog.jp/entry/20131203/1386068127 )の”picture環境によるベンゼン環の描画”から定義を引用してdocs.texをファイル内に置く.


```tex

\[\ce{ COOH{\para} NO2 <=> H+ + COO- {\para} NO2}\]
```
![para.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243022/fa6f0420-5c82-95e6-8b7c-0ba24a3af856.png)


## フォントサイズを強制的に変更する

プリアンブルに以下を入れる.

```tex

\usepackage[truedimen,mag=1000]{geometry}%フォントサイズを指定. 1000が10pt
```

これより前に`\usepackage{geometry}`を置いてしまっているとコンパイルが通らないので気をつけてね


## 問題番号
[大学のレポート問題演習用のLaTeXプリアンブル]( http://auewe.hatenablog.com/entry/2013/06/16/125014 )
 是非使おう