OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxtを使ったサイトの修正をしてみた。

#はじめに
知り合いがnuxtを使ったファイルで問題があったらしく、相談を受けたが全くわからんので、
とりあえず調べながらやってみたことを記載してみる。

## nuxt.js　とは
ほとんど理解できてない（してない）自分が書いてもしゃーないので
次の[サイト](https://udemy.benesse.co.jp/development/web/nuxt-js.html)をご覧ください。。

# 環境について
node.js [参考](https://qiita.com/Alex_mht_code/items/422f5ce10d9c9d5729b7)
yarn or npm　のパッケージ　[参考](https://qiita.com/turmericN/items/a066286a9035d80b18aa)
→どっちかは使うはず。調べてる限り、yarnのが早くて楽。今回はもらったファイルがyarnだったから、yarnで。

楽チン。

# nuxtについて
## 編集すべきところ
components →実際のページの構成が書かれている模様
pages　→ページのルーティングの模様
static　→素材とか入れる模様

## 仕組み
どうやら、pagesにルーティングが書かれてて、そこに書いた情報をnuxtはみていて、
そこから指定されたcomponentsを読んでる模様。ふむふむ。

# コマンドでの操作
基本的には、次の５つの操作でできる模様。
ちなみに仮想として　/var/develop/nuxttest にnuxtのファイル群がいるとする。
1. 移動する　`cd /var/develop/nuxttest`
2. nodeのパッケージ(package.json dependancies)をインストール　`yarn install`
3. nuxt build　でビルドをする　`yarn run build`
4. nuxt start でローカルチェックをする　`yarn run start`
5. nuxt generate でローカルで作る　`yarn run generate`
6. ファイルをサーバへ上げる。

注意1）3-5に関しては
package.jsonのscriptに次のように書かれていることを前提にしてます。

```json:package.json
"scripts": {
    "dev": "nuxt",
    "build": "nuxt build",   
    "start": "nuxt start",
    "generate": "nuxt generate"}
```
注意2)コードを変更するときは、最初1-4をやって、
見れることを確認してからコードを変更、
確認するときに3-4をやるといいかと思います。
最後の最後で5、６をすればいいと思います。


#終わりに
とりあえず、単なる文字の変更だけなので、特に理解なくいったんやりました。
まぁ本当はしっかり勉強してからやるべきなのですが。。。

もし今すぐ！なんとか！という方へ役立てるといいなぁと、メモ書き程度に書き残しておきます。
AtCoderで早速標準入力の方法でつまずいた。


##はじめに
今までエンジニアとして働いてきたのですが、主に上流工程ばかりで、実装が殆どできずやばいと思って、競技プリグラミングやり始めました。なんとか一問解きましたが、そこでつまずいたことを備忘録として載せます。

今回はデータ入力の`Scanner`について書きます。

##挑戦した問題
Atcodeの過去の得点１００の問題…つまり簡単な問題です。

https://atcoder.jp/contests/abc042/tasks/abc042_a

##提出１回目

色々なサイトを見ながら四苦八苦しつつもなんとかコーディングし、vscodeのターミナルから実行して想定通りの結果を得ることができました。以下がコード内容（おそらく有識者からみたら、汚いコードですがご容赦を。。）

```
public class Main {
    public static void main(String args[]) {
        String answer = "YES";
        String[] haiku = args;
        int sum = 0;
        for(int i = 0; i < 3; i++){
          if(haiku[i].equals("7") || haiku[i].equals("5")){
              sum = sum + Integer.valueOf(haiku[i]);
              System.out.println(sum);
          }
          else{
              answer = "NO";
          }
          System.out.println(haiku[i]);
        } 
        if(sum != 17){
            answer = "NO";
        }
        System.out.println(answer);
    }
}
```

##結果
####実行時エラー…中身を確認すらしてもらえず…＼(^o^)／

<img width="1108" alt="スクリーンショット 2020-01-25 19.45.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429081/b806ec2f-ad61-a459-d4a5-345a415af3f3.png">

##何がだめだったのか
入力方法が単純にだめだったみたいですね。

ターミナルで`Java Main X X X`と入力するとスペース区切りで配列`argｓ`に格納されるので、大丈夫と思っていましたが完全に見誤っていました。

##どうすればよかったのか
入力内容を取得するときに`Scanner`を使うとよいとのこと。`next();`の部分で入力を取得、もう一度使用すると次の入力値が取得できます。

```
Scanner sc = new Scanner(System.in);
int i = Integer.parseInt(sc.next());
```

##提出５回目
コードを何度もリファクタリング（用語使いたがりのにわかですみません。。）してなんとかクリアしました笑

```
import java.util.Scanner;
public class Main {
    public static void main(String args[]) {
        String answer = "YES";
        Scanner s = new Scanner(System.in);
        int sum = 0;
        for(int i = 0; i < 3; i++){
            int haiku = Integer.parseInt(s.next());
          if(haiku == 7 || haiku == 5 ){
              sum = sum + haiku;
          }
          else{
              answer = "NO";
          }
        } 
        if(sum != 17){
            answer = "NO";
        }
        System.out.println(answer);
    }
}
```
##参考サイト

https://qiita.com/p_shiki37/items/a0f6aac33bf60f5f65e4
https://uxmilk.jp/48686

####何かご指摘等ありましたら、ご遠慮無くおっしゃってくださいーm(_ _)m
ラムダ式プロパティは結果をキャッシュしない

``` C#
using System;

namespace SampleLambdaProperty
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var v = new Sample();
            var u = v.Property;
            // 二度目は何も変わっていないが，メソッドは再び呼ばれている．
            var u2 = v.Property;
        }
    }

    class Sample
    {
        public int Property => GetValue();
            
        private int GetValue()
        {
            Console.WriteLine("Method Called!");
            return 2;
        }
    }
}
```
CSRFとXSSの違い

#CSRF
##呼称
シーサーフともリクエスト強要とも呼ばれる。
リクエスト強要と言うとわかりやすい。

##内容
攻撃者が管理するWEBサイトにエンドユーザーがアクセスすると、スクリプトが作動。
エンドユーザーは攻撃対象のサイトへのリクエストを強要される。
攻撃対象のサイトからしてみれば、通常利用者からのリクエストであるため、攻撃と判別しづらい。

##対策（省略）
###攻撃対象のサイト管理者
リクエスト元のURLで通常利用かどうかを判別とかとか

#XSS
##呼称（というか正式名称）
クロスサイトスクリプティング
##内容
攻撃者が攻撃対象のサイトにスクリプトを仕込む。
エンドユーザーが訪問してスクリプトを実行してしまうと、偽のサイトに誘導される。
そこで認証情報等を入力することにより情報を盗まれる。
もしくは、cookie情報を盗まれる。（ドメイン間でのcookie情報の許可している？）

##対策（省略）
攻撃対象のサイトが不正なスクリプトを混入されないように気を付ける

#まとめ
CSRFはエンドユーザーに不正リクエストを強要させる。
XSSは不正スクリプトにより、エンドユーザーのcookie情報を盗んだり、認証情報を入力させて盗む。

#おまけ
JSのAjaxでドメインが異なるURLへリクエストを送信しようとしたらCORSポリシー違反とやらで引っかかった。
きっとこれらの対策でブラウザが設定してるんだろうな
IonicをFirebaseでホスティングする

Angularをfirebaseでホスティングした記事はありましたが、Ionicの例はなく、試すまでできるかどうかわからなかったので投稿します。特に目新しい内容はありませんが、AungularでやるようにすればIonicでもできたということを伝えるための記事です。（firebas.jsonの書き換えは必要ではまりました）

→[Angularの場合][1]
[1]:https://qiita.com/daikiojm/items/89f46bd83c9a2285bbc6


まずプロジェクト作成

```python
ionic start
```
その後、作成したフォルダに移動

```python
ionic cordova build browser --prod --release
```

初期化

```python
firebase init
```
hostingを選んで、プロジェクト選んで、SPAとして登録

プロジェクトのルートに設定ファイルがあるので編集

```python
vi firebase.json
```

```python
{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

というのを下記のように変更する

```python
{
  "hosting": {
    "public": "www",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

```

```python
firebase deploy
```

でできました。
エンジニアであっても、ライティングスキルが重要だ

「自分、ソースコード読み書きできるし」
こう思って分かりやすい文章とか不要じゃない・・・？と思っていた時期も自分にはありました。

確かに、ソースコードを読み書きできるのは素晴らしいことですが、それ以外のことをできなくてもいい理由にはなりません。
タイトルにもあるように、**「エンジニアであっても、ライティングスキルが重要だ」**ということについて書きたいと思います。

#### ROI(Return On Investment)が高まる

我々エンジニアは、人間とコミュニケーションをして、システムを作ります。
ライティング能力が高ければ、他人と同じものをイメージしやすいため、認識のズレが発生しにくくなります。

それゆえに、認識が違うことから発生する無駄な作業が減り、ROIが高まります。

### 生産性が上がる

ライティング能力が高ければ、

 - 時間が節約できる
 - 読み手にストレスを溜めない

ため、生産性が上がります。

　文章を読んでいる時に、書いた人のライティング能力が高ければ、「何を言おうとしているんだろう？」「結局何？」という疑問が発生しにくくなります。
　それゆえ、「文章の意図を理解する時間」と「書いた人に文章の意図を聞く時間」が節約できます。もちろん時間が節約できると、生産性は向上します。

　分かりにくく、認知負荷の高い文章を読むと、ストレスが溜まります。分かりにくい文章は人間が物事を理解する過程にそぐわない形で書かれており、無駄に何回も読み返さないと理解できないからです。
　ストレスが溜まった状態と溜まっていない状態では当然ストレスが無い状態の方が生産性を発揮できます。

以上より、
**「エンジニアであっても、ライティングスキルが重要だ」**と考えています。

----

以上で本文は終わりです。
最後に、この記事を書いた経緯について書きたいと思います。


私が新卒で社会人になって、よく言われていたこのフレーズ
**「何言っているか分からない」**

正直いい気はしないので、~~(自分も同じようなこと思ったときは頑張って解釈してるんだよって思いつつも)~~
何を言っているか分かるように話せるようになろうと決心しました。いきなり話すとなるとハードルが高いので、ゆっくりと時間をかけられる分かりやすく書くことからはじめました。

バーバラ・ミントさんの[『考える技術・書く技術』](https://www.amazon.co.jp/%E8%80%83%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93%E3%83%BB%E6%9B%B8%E3%81%8F%E6%8A%80%E8%A1%93%E2%80%95%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E5%8A%9B%E3%82%92%E4%BC%B8%E3%81%B0%E3%81%99%E3%83%94%E3%83%A9%E3%83%9F%E3%83%83%E3%83%89%E5%8E%9F%E5%89%87-%E3%83%90%E3%83%BC%E3%83%90%E3%83%A9-%E3%83%9F%E3%83%B3%E3%83%88/dp/4478490279/)を読んでみてそのアウトプットをこの記事でしてみました。

主張の裏付けが弱すぎて読んでて「ふ～ん」くらいの印象しか与えられなかったかもしれませんが、
主張に同意できるかどうかはおいておいて、何を言っているかは分かったのかなと思います。

また、書いている過程での学びもありました。

- 自分は考えがまとまる前にキーボードを触ろうとする
- 油断すると論理が飛躍する
- 演繹的ではなく、帰納的に書くのが結構難しい

これからもアウトプットを続けてライティングの達人目指していければと思います。

最後まで目を通していただいてありがとうございました！
ルーターとモデムについて無知だったので少し調べた

# ルーターとモデムってなに?

前回の[NAT](https://qiita.com/Takatoshi_Hiki/items/4f9655c7abbbef62363d)に続いて、ルーターとモデムに関して「???」だったので少し調べた。

## モデム
モデムはmodulator-demodulatorの略称。デジタル信号をアナログ信号に変換することを**modulation**、アナログ信号をデジタル信号に変換することを**demodulation**と言う。

ここまでで、なんとなくわかった通りモデムでは、**アナログ信号とデジタル信号を相互変換**を行う。

コンピュータがデジタル信号を使っているのは知っているけれど、
「アナログ信号って普段使っているの???」
と思った。
実際には、インターネットを利用する際に電話回線はアナログ信号が利用されている。この電話回線を利用したインターネットをADSLと呼ぶ。

### ADSL
ADSLとは、Asymmetric Digital Subscriber Lineの略で電話回線を利用したインターネットである。ADSLは元々NTTの電話回線を利用したインターネット通信サービスであり、従来は固定電話の利用が必須だった。今は自宅に固定電話を持っていない人でもADSLを契約することは出来る。
ADSLを利用する際には、ADSLモデムというモデムが必要になる。

ADSLについての追記として、電話回線を利用したデータ通信には限りがあるため、たくさんのデータ量を一度に通信しようとすると速度が著しく低下する。そのため、現在主流となっているのが光回線。光回線を契約すると、光信号とデジタル信号を変換するために**ONU（Optical Network Unit**という機器が必要になる。光信号とデジタル信号を変換するモデムのような位置付けである。

## ルーター
ルーターとは複数の機器を繋ぐ装置であり、データを2つ以上の異なるネットワーク間に中継する通信機器である。ネットワーク内でパケットの道案内を行うような役割。

### ルーティング機能
ルーターが持つ重要な機能にルーティング機能がある。ルーティング機能とは、パケットの宛先IPアドレスから適切な転送経路を選択し、次に転送すべき相手を決定してパケットを送信する機能のこと。
ルータ間でこのような転送をバケツリレー式に繰り返し、送信元から宛先へ複数のネットワークを通過してパケットは運ばれる。

#### ルーティングテーブル
パケットの宛先ごとにどの機器に中継を依頼すべきかが列挙されているデータ集合をルーティングテーブルと言う。この情報を元にルーターはルーティングを行う。

##### スタティックルーティング
ルータのルーティングテーブルを管理者などが設定し、ルーティングを行う。

##### ダイナミックルーティング
異なる管理主体のネットワーク間の接続や、大規模なネットワーク、頻繁に構成が変更されるネットワークなどでは、ルータ間で経路情報を交換してルーティングテーブルの作成・更新が行われる。この際の、ルータ間の経路情報の交換には専用のプロトコルが用いられ、これを「ルーティングプロトコル」と言う。

## まとめ
ネットワークに関して無知だったのでチマチマと調べていきます。
JetsonNano で姿勢推定(TensorRT版)を動かす

# 前提
TensorRT版の姿勢推定をgithubで見つけたので自環境で試してみましたのメモです。

# 環境
- Jetson Nano
- ロジクールカメラ C270n
- 有線キーボード
- 7インチ ラズパイ用タッチディスプレイ
- 5V4A ACアダプター

# TL;DR
[ここ](https://github.com/NVIDIA-AI-IOT/trt_pose)のREADMEを参考にして進めていけば良いだけなのですが、デモプログラムを動かすためには以下も必要みたいです。

- torch2trt 
- JetCam
- PyTorch
- torchvision

さらにJupyterのUI Library ipywidgetsを有効にすることも忘れずに。

```
jupyter nbextension enable --py widgetsnbextension
```

# 実行手順

1. trt_poseのSetupの記載通りにtrt_poseをインストールする。
2. [torch2trt](https://github.com/NVIDIA-AI-IOT/torch2trt)のSetupに記載された「Option 2 - With plugins (experimental)」の手順でインストールする。
3. [JetCam](https://github.com/NVIDIA-AI-IOT/jetcam)のSetupの手順でインストールする。
4. PyTorchのインストールは[NVIDIAのサイト](https://devtalk.nvidia.com/default/topic/1049071/pytorch-for-jetson-nano-version-1-3-0-now-available/)を参考にしてPython 3.6*の手順を実施。
5. [NVIDIAのサイト](https://devtalk.nvidia.com/default/topic/1049071/pytorch-for-jetson-nano-version-1-3-0-now-available/)で「torchvision」で検索すると下側に手順が書いてあるので、それをそのまま実施。
6. trt_poseのLive demoに記載された通り、学習済モデルをダウンロードしておき、live_demo.ipynbを起動してぽちぽちRunする。
7. live_demo.ipynbの中に、以下のコードが記載されたセルがあって、そこの結果枠にボーンが描画された映像が表示されます。

```

import ipywidgets
from IPython.display import display
image_w = ipywidgets.Image(format='jpeg')
display(image_w)
```

TensorRT対応していない版を動かした時はカクカクしてたんですが、こっちはすごくスムーズに表示されてます。すごいですね。
GitHubに移したリポジトリの草が生えない時の対処法

## はじめに
この記事で行なっている作業はコミット履歴を全て更新するため、自分しかコミットしていないリポジトリ向けです。

## 問題発生
BitBucketからGitHubへのリポジトリ移行作業を行なっていたところ、移したリポジトリのコミットがコントリビューションに反映されないという問題が起きました。
## 原因
せっかくリポジトリを移したなら草も生やしたいものです。
原因を調べてみると、昔のリポジトリにコミットした時のauthorと今のGitHubアカウントに設定しているauthorのメールアドレスが異なるため、コントリビューションに反映されないのだということが判明。

## 解決方法
コミット内容に問題があると分かったため、修正します。
まず現在設定しているauthorの情報を見るためにローカルで`git config --list`を実行。

```
gon@hon-no-MBP ~ % git config --list --global 
user.name=gon
user.email=new-gon@example.co.jp
core.excludesfile=/Users/gon/.gitignore_global
difftool.sourcetree.cmd=opendiff "$LOCAL" "$REMOTE"
difftool.sourcetree.path=
mergetool.sourcetree.cmd=/Applications/SourceTree.app/Contents/Resources/opendiff-w.sh "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$MERGED"
mergetool.sourcetree.trustexitcode=true
```

user.emailがGitHubに設定しているメールアドレスと同じなら大丈夫です。

次に問題のリポジトリをローカルにクローン。クローンしたリポジトリに移動し、`git filter-branch`コマンドを実行。authorとcommitterのメールアドレスと名前を現在使用しているものに変更しましょう。
`git filter-branch`は一度に大量のコミットを書き換えられる便利なコマンドです。
詳しくは[こちら](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88#_%E6%9C%80%E5%BC%B7%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3_filter_branch)。

```
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='gon'; GIT_AUTHOR_EMAIL='new-gon@example@example.co.jp'; GIT_COMMITTER_NAME='gon'; GIT_COMMITTER_EMAIL='a-new@example@example.co.jp'
;" HEAD
```

その後、もう一度`git log`でコミット履歴を確認すると、コミットのauthorのメールアドレスが先ほど設定したものに変わっています。

最後にGitHubに`git force push`します。
`git force push`は使いたくない場合は、GitHubに新しくリポジトリを作ってそちらにpushしてもいいかと思います。

ここまで終えたら、コントリビューションを確認します。
無事草が生えていたら喜びましょう！
『退屈なことはPythonにやらせよう』　6章 6.7 演習プロジェクト回答例

# 6章 6.7 演習プロジェクト回答例

書いてみました。


```
def print_table(table_data):
    col_widths = [0] * len(table_data)
    for i in range(len(table_data)):
        col_widths[i] = len(max(table_data[i], key=len))

    for i in range(len(table_data[0])):
        for j in range(len(table_data)):
            print(table_data[j][i].rjust(col_widths[j] + 1), end='')
        print()
    
table_data = [['apples', 'oranges', 'cherries', 'banana'],
              ['Alice', 'Bob', 'Carol', 'David'],
              ['dogs', 'cats', 'moose', 'goose']]

print_table(table_data)
```
Heroku 接続に関するコマンド

# herokuの接続先を変更する
## git remote -v で現在の接続先確認
```
 % git remote -v 
heroku  ssh://git@heroku.com/＊＊＊＊＊＊.git (fetch)
heroku  ssh://git@heroku.com/＊＊＊＊＊＊.git (push)
origin  git@github.com:＠＠＠＠/template_2.git (fetch)
origin  git@github.com:＠＠＠＠/template_2.git (push)
```
## herokuの接続先をセットし直す
```
 % git remote set-url heroku https://git.heroku.com/？？？？.git
```

===========

#既に作ってあるherokuアプリと今の自分の環境が結びついていない場合

## 存在するアプリ一覧表示
```
heroku apps
```
## リモートアプリを連携させる
```
heroku git:remote -a アプリ名
```


===========
##herokuのマイグレーションファイルのリセット

```
heroku run rake db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```

##もしHerokuにpush後のコミットを巻き戻してしまってpushできない時は
```
git push -f heroku master
```
===========
##HerokuのSendGridアドオンを、Rails+Action Mailerで使う

http://sprink.hatenablog.com/entry/2018/02/28/211223


## DB dropからcreate
```
 heroku run RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:drop
```

```
 heroku run rails db:migrate
```
ListとArrayListの違い

#List
こんな感じで作成

```java
List<Integer> list = Arrays.asList(array);
```
**※：addメソッド等を使うと、実行時エラーとなる**
arrayを参照しているだけなので、arrayを変更すると、反映される。

#ArrayList
こんな感じで作成

```java
List<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(array));
```
※ArrayListからListに修正しました。
addメソッドが使える
arrayの値を元に新しいインスタンスを作成しているため。独立したオブジェクトとなる。

#追記（2020/1/28）
ご指摘いただき、内容が面白かったため、記載
`Arrays.asList(array)`の返り値である`ArrayList`の`add`メソッドを使用すると例外を吐く理由は以下。
1. `ArrayList`クラスが、`add`メソッドを継承しておらず、親クラスの`add`メソッドを使用している。
2. `ArrayList`クラスが継承している`AbstractList`は`add`を、例外を吐くように実装している（オーバーライド前提としているため）
※この`ArrayList`は`Arrays`の内部クラスであり、本文中の`ArrayList`とは異なる。
よく使うtmuxコマンド


# 新規セッションの作成
```
tmux
tmux new -s (セッション名)
```
tmuxのみだとセッション名が自動で割り当てられる．
セッション名を指定する時は下．

# セッションへのアタッチ
```
tmux a
tmux a -t (セッション名)
```
-t でセッション名を指定しない場合は，直前にアタッチしていたセッションに繋がる．

# セッションから退出

ctrl  b + d


# セッション一覧表示
```
tmux ls
```

# セッションの削除
```
tmux kill-session
tmux kill-session -t (セッション名)
```
-t でセッションを指定しない場合は，直前にアタッチしていたセッションを削除する．

# tmux全体を終了
```
tmux kill-server
```

# スクロール

ctrl  b + [

矢印キーでスクロールができる．
**スクロールモードから出る時は，q を押す**
iosのgoodreaderでsftpのprivate-keyが読み込めない問題

これはmacのssh-keygenで作成されるコマンドの出力が変更されているので、昔作ったキーでは読み込めますが、新しく作ったキーは読み込めません。よって、キーを作り直すか、キー自体を編集しましょう。

```shell
# 公開鍵、秘密鍵の作成
$  ssh-keygen -t rsa -b 4096 -m PEM -f ~/.ssh/goodreader

# serverにpublic-keyを登録
$ ssh-copy-id -i ~/.ssh/goodreader.pub user@192.168.1.11 -p 22

# ~/.ssh/goodreader
# (private-key)をiosのgoodreaderに持っていく
````

### 続編

openssh 8.2に上げたら、またしてもgoodreaderからsftpに繋がらなくなりました。これはキーの問題ではなく、パスワードでもアクセス不可になっていることから、openssh 8.2に上げたことが原因と考えられますが、しかし、ダウングレードしてもつながらないので(systemctl restart sshdもしている)、libなどが原因かもしれません。

ただ、goodreader以外はちゃんとsftpできるので、goodreader側が対処する問題だと思われます。goodreaderのupdateを待つしかないのか。


### 解決法

一時的な解決策です。これでgoodreadeからsftpアクセスできるようになります。

```sh
$ yay -S downgrade
$ downgrade openssh
openssh    8.1p1  4  x86_64  (remote)
$ sudo systemctl restart sshd
```
Flutter&Dartでenumを使った定数を定義[SharedPreferenceのKeyなどに使用]

こんにちは、FlutterとDartでアプリ開発中の [村松龍之介](https://twitter.com/riscait) です！

Shared Preferenceの引数で使用するキーを定数で一か所に定義しようと思いました。
`static const`で定義しても良かったのですが、今回は`enum`を使用しました。

しかし、DartのEnumはString型が使えないのでExtensionで対応しました。
今回はその備忘録です。

ちなみに、DartのExtension機能は Dart 2.7 で追加されたそうです。
[Extension methods | Dart](https://dart.dev/guides/language/extension-methods)

まずはExtensionの前に…
## Enumで使用するKeyを定義
```dart
/// ここではSharedPreference使用するKeyを想定
enum PreferenceKey {
  one,
  two,
  three,
}
```

## Enumに対するextensionを定義
### Extensionの書式
`extension`キーワードで始めて、`on`の後に拡張する方を書くようです。

```dart
extension <拡張名> on <拡張する型> {
  // メンバーを定義する
}
```

<拡張名>は必須。他ライブラリと競合した時に識別したりするのに使うようです。
自己プロジェクト用のExtensionであれば、恐らくそこまで意識する必要はないでしょう。

DartにおけるExtensionのメンバーには、
* メソッド
* Getter
* Setter
* 演算子
* Static field
* Static helper method
を定義できるようです。

## Extensionの実装
```dart
extension KeyToString on PreferenceKey {
  /// 文字列にして `PreferenceKey.one` から `one` を抽出する
  String get key => toString().split('.').last;
}
```
ここでは`enum PreferenceKey`のStringを取得したい時用のGetterを定義しました。

## 使い方
```dart
// enum, extension を定義したファイル（ライブラリ）をインポート
import 'preference_key.dart';

PreferenceKey.timeOfDay.key; // String型の'timeOfDay'が返る

// extensionの拡張名を指定して使用する場合の記法
KeyToString(PreferenceKey.timeOfDay).key;
```

### （蛇足）import記法
```dart
// preference_key.dartの内、extension KeyToString のみ使用する
import 'preference_key.dart' show KeyToString;
// preference_key.dartの内、extension KeyToString のみ使用しない
import 'preference_key.dart' hide KeyToString;
```

以上、今回はFlutter＆Dartでのenumを使った定数定義の一例を書いてみました。

Dartはまだ勉強中なので、間違いやもっと良い記法がありましたらコメントや編集お願いいたします🙇‍♂️

## 参考
[dart - Enum from String - Stack Overflow](https://stackoverflow.com/questions/27673781/enum-from-string)
標準偏差と標準誤差

#標準誤差
推定量の標準偏差のことを「標準誤差」という。
これは、標本の精度（ばらつき）を表す。

```math
標準誤差＝\frac{\sigma}{\sqrt{N}}
```

#標準偏差
データのばらつきを表す。
Leetcode 938: Range Sum of BST

```ruby
#Given the root node of a binary search tree, return the sum of values of all nodes with value between L and R (inclusive).
#The binary search tree is guaranteed to have unique values.
#The number of nodes in the tree is at most 10000.
#The final answer is guaranteed to be less than 2^31.

require 'test/unit'

# https://leetcode.com/problems/range-sum-of-bst/

class RangeSumOfBst < Test::Unit::TestCase

  def test_range_sum_bst
    #  TODO: Add test
  end


  def range_sum_bst(root, l, r)
    result = 0
    unless root.nil?
      puts result

      result += root.val if root.val >= l && root.val <= r
      result += range_sum_bst(root.right, l, r) unless root.right.nil?
      result += range_sum_bst(root.left, l, r) unless root.left.nil?
    end
    result
  end

end

class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
Leetcode 617: Merge Two Binary Trees

```ruby
require 'test/unit'
require 'pry'
class MergeTwoBinaryTrees < Test::Unit::TestCase

  # https://leetcode.com/problems/merge-two-binary-trees/


  # Definition for a binary tree node.
  # class TreeNode
  #     attr_accessor :val, :left, :right
  #     def initialize(val)
  #         @val = val
  #         @left, @right = nil, nil
  #     end
  # end

  # @param {TreeNode} t1
  # @param {TreeNode} t2
  # @return {TreeNode}
  #
  def test_calc
    #TODO: Add test case
  end

  def merge_trees(t1, t2)
    if t1.nil?
      return t2
    end
    if t2.nil?
      return t1
    end

    t1.val = t1.val.to_i + t2.val.to_i
    t1.left = merge_trees(t1.left, t2.left)
    t1.right = merge_trees(t1.right, t2.right)
    return t1

  end
end

class TreeNode

  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
Leetcode 1108: Defanging an IP Address

```ruby
require 'test/unit'
require 'pry'
class DefanginAnIpAddress < Test::Unit::TestCase

  # https://leetcode.com/problems/defanging-an-ip-address/
  # Qiita:

  def test_defang_i_paddr
    input = "1.1.1.1"
    output = "1[.]1[.]1[.]1"
    assert_equal(output, defang_i_paddr(input))

    input = "255.100.50.0"
    output = "255[.]100[.]50[.]0"
    assert_equal(output, defang_i_paddr(input))
  end

  def defang_i_paddr(address)
    address.gsub('.', '[.]')
  end

end
Leetcode: Most Common Word

```{ruby}

require 'test/unit'
require 'pry'
class MostCommonWord < Test::Unit::TestCase

  #https://leetcode.com/problems/most-common-word/submissions/

  def test_calc
    paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
    banned = ["hit"]
    output = "ball"
    assert_equal(output, solution(paragraph, banned))

    paragraph = "a, a, a, a, b,b,b,c, c"
    banned = ["a"]
    output = "b"
    assert_equal(output, solution(paragraph, banned))
  end

  def solution(paragraph, banned)
    # change the sentence to lowercase
    # remove , and .
    # iterate over each words, and count the number of same words
    # remove the banned output from the list
    # sort by the highest number
    # return the 1st element

    paragraph = paragraph.downcase
    paragraph = paragraph.gsub(',', ' ').gsub(',', ' ')
    words = paragraph.split(/\W+/)
    list = {}
    words.each do |word|
      #binding.pry
      if list[word]
        list[word] += 1
      else
        list[word] ||= 0
      end
    end
    list

    banned.each do |word|
      list.delete(word)
    end
    list = list.sort { |a, b| b[1] <=> a[1] }
    list.first[0]
  end

end
Leetcode: Construct String from Binary Tree

```{ruby}
require 'test/unit'
require 'pry'
class ConstructStringFromBinaryTree < Test::Unit::TestCase

  #https://leetcode.com/problems/construct-string-from-binary-tree/

  def test_calc
    # You need to construct a string consists of parenthesis and integers from a binary tree with the preorder traversing way.
    # The null node needs to be represented by empty parenthesis pair "()".
    # And you need to omit all the empty parenthesis pairs that
    # don't affect the one-to-one mapping relationship between the string and the original binary tree.
    #
    # Input: Binary tree: [1,2,3,4]
    # Output: "1(2(4))(3)"
    # Explanation: Originallay it needs to be "1(2(4)())(3()())",
    # but you need to omit all the unnecessary empty parenthesis pairs.
    # And it will be "1(2(4))(3)".
    #
    #

    input = [1, 2, 3, 4]
    tree = TreeNode.new(1)
    tree.left = TreeNode.new(2)
    tree.right = TreeNode.new(3)
    tree.left.left = TreeNode.new(4)
    tree
    output = "1(2(4))(3)"

    assert_equal(output, tree2str(tree))

    input = [1, 2, 3, nil, 4]
    output = "1(2()(4))(3)"
    tree = TreeNode.new(1)
    tree.left = TreeNode.new(2)
    tree.right = TreeNode.new(3)
    tree.left.left = TreeNode.new(nil)
    tree.left.right = TreeNode.new(4)

    assert_equal(output, tree2str(tree))


    tree= TreeNode.new(1)
    output = "1"
    assert_equal(output, tree2str(tree))

    tree= TreeNode.new(nil)
    output = ""
    assert_equal(output, tree2str(tree))
  end

  def tree2str(t)
    @str = ''
    solution(t)
  end

  def solution(t)
    if t == nil
      return ""
    end

    @str += t.val.to_s

    # If leef node, then return
    if t.left == nil && t.right == nil
      return @str
    end

    # for left subtree
    @str += '('
    solution(t.left)
    @str += ')'

    # Only if right child is present to avoid extra parenthesis
    if t.right != nil
      @str += '('
      solution(t.right)
      @str += ')'
    end
    @str
  end

end

class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end

```
Leetcode: Decompress Run Length Encoded List

```{ruby}
require 'test/unit'
require 'pry'
class DecompressRunLengthEncodedList < Test::Unit::TestCase

  # Qiita: posted

  #https://leetcode.com/problems/decompress-run-length-encoded-list/

  def test_calc
    #We are given a list nums of integers representing a list compressed with run-length encoding.
    #Consider each adjacent pair of elements [a, b] = [nums[2 * i], nums[2 * i + 1]] (with i >= 0).For each such pair, there are a elements with value b in the decompressed list.
    #Return the decompressed list.

    # Input: nums = [1,2,3,4]
    # Output: [2,4,4,4]
    # Explanation: The first pair [1,2] means we have freq = 1 and val = 2 so we generate the array [2].
    # The second pair [3,4] means we have freq = 3 and val = 4 so we generate [4,4,4].
    # At the end the concatenation [2] + [4,4,4,4] is [2,4,4,4].

    input = [1, 2, 3, 4]
    output = [2, 4, 4, 4]
    assert_equal(output, decompress_rl_elist(input))
  end

  def decompress_rl_elist(nums)
    items = []
    nums.each_slice(2) do |pair|
      count = pair[0]
      item = pair[1]
      count.times do
        items << item
      end
    end
    items.flatten
  end

end
```
EC2Launchの「setMonitorAlwaysOn : true」ってなに

# 事象

Windowsサーバ構築のために
EC2LaunchのConfigのデフォルト値を調べようと、AMI[^1]から新規インスタンスを作成したら
[ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2launch.html#ec2launch-config
)にない項目があって、AWSサポートに問い合わせてみた。

`C:\ProgramData\Amazon\EC2-Windows\Launch\Config\LaunchConfig.json`

```json
{
    "setComputerName": false,
    "setMonitorAlwaysOn": true, #これ
    "setWallpaper": true,
    "addDnsSuffixList": true,
    "extendBootVolumeSize": true,
    "handleUserData": true,
    "adminPasswordType": "Random",
    "adminPassword":  "" 
}
```

# どうすればいい

結論から言うとそのままでOK

# 詳細

[Nitroベースのインスタンス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances)でWindowsサーバを使用する場合、[電源設定をしないとOSのシャットダウンで不具合](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/migrating-latest-types.html#power-management)がある模様。
※新しいAMIではデフォルトで設定されているので大丈夫

そして[Sysprep](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2launch.html#ec2launch-sysprep)を実行した際に、件の項目がtrueになっていると、この設定が自動的に行われる。[^2]

[EC2Launch バージョン履歴](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2launch-version-details.html)

> 1.3.2001040
>
> ・ACPI の問題を解決するためにモニターをオフにしないように設定するためのプラグインを追加しました。

これがEC2Launchのドキュメントには反映されてないので[^3]何？ってなったという話。

# そもそもEC2Launchとは

知らない人向け。
インスタンス初回起動時[^4]に処理を行うためのスクリプト。 [ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2launch.html)
[cloud-init](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html#amazon-linux-cloud-init)のWindows版みたいなもの。

なお、Windows Server 2016 以降はEC2Launchだが、
Windows Server 2012 R2 以前だと[EC2Config](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2config-service.html)となる。

[^1]: ID: ami-094418f0b70398775  /Name: Windows_Server-2019-Japanese-Full-Base-2020.01.15
[^2]: あえてfalseにしたら無効化されるのか、それともSysprepで変わらずにそのままなのか少し気になるが未検証
[^3]: 2020/01/25時点。英語のドキュメントにも記載がなく、まれによくある日本語ドキュメントの問題ではない
[^4]: 次回起動時に実行するコマンドがあったり、毎回実行するように設定変えれたりもする。 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2launch.html#ec2launch-config
Javaの<>ってなんだ？

#導入
こんにちは。けちょんです。
**皆さん、ジェネリクス使ってますか？**
私は今日初めて学びました。
というか今まで見て見ぬ振りしてましたが、ついに学ぶ場に出会いました。

##ジェネリクスと出会う場面
一番出会うのは、リストだと思います。
以下のような宣言したことあるかと思います。

```java
List<String> list = new ArrayList<>();
```

可変長な配列ということしか私は知りませんでした。
この<>を使うクラスをジェネリッククラスと言います。

##どういう役割なの？

```java
List<String> list
```
まずこの部分。
Listはそもそもどのようなものかというと、**複数の要素を配列のように保持して扱う**インターフェースです。
Stringに限らず、様々な型のオブジェクトを格納できます。（一種類だけだけど。）
で、今回Stringを格納すると定めているのが上の宣言です。

```java

new ArrayList<>();
```
次にこの部分。<>の中が空になってますが、これは省略してるだけです。（左辺のStringから型推測できる）


#一般的なジェネリクス
ではリストに限らず、より広い観点でジェネリクスに触れてみます。
簡単な定義は以下ですね。

```java

public class Gene<T> {
	private T t;

	public void setT(T t) {
		this.t = t;
	}

	public T getT() {
		return t;
	}
}
```

使い方は以下

```java
Gene<String> g1 = new Gene<>(); // String型で固定
Gene<Integer> g2 = new Gene<>(); // Integer型で固定
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24
```

##何が嬉しいのか
今回の例だと、同一のクラスに対して、複数のクラスを使用できることができました。

##いやいや、これでも良くない？

```java
public class GeneObj {
	Object t;

	public void setT(Object t) {
		this.t = t;
	}

	public Object getT() {
		return t;
	}
}
```
型Tで限定していた部分に対して、Objectクラスを使ってみました。
では使ってみましょう。

```java
GeneObj g1 = new GeneObj(); 
GeneObj g2 = new GeneObj(); 
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24
```
同じようなコードで書けましたね。

#まとめ
ジェネリクスは使わなくても良い？？？

#いやいや
今回の例ではどちらも動きますが、Objectを使用すると問題があります。
簡単に言うと、このクラスは使いにくいです。

##実行時エラーとなる使用例

```java

GeneObj g1 = new GeneObj(); // String型で固定
g1.setT("1");
Integer res = (Integer) g1.getT() + 1; //ClassCastExceptionの発生
System.out.print(res);
```
上では、誤ってInteger型ではなくStringを詰め込んでしまっています。
そのためIntegerクラスにキャストする際ClassCastExceptionが発生してしまいました。
使い手からすれば、自分がsetTした型を把握しておかなければならず、バグの温床になってしまいます。
**ジェネリクスを使えば、そもそもキャストを使用する必要がなく、コンパイルエラーにて気づくことができます。**

#まとめ
型の柔軟性とコードの保守性を両立させるためにジェネリクスは必要
Docker-composeでbundle installしてるのにgemの内容反映されないんですけど

#注意事項
完全に個人用メモです。公式情報でもなんでもありません。ググってこの記事に来てしまった方はお気をつけください。違っていたら即直しますのでガンガンご指摘ください。（個人用メモなので追加もしていきます）

## そもそもbundle installしたらサーバー再起動する必要あり

なので、gemfile編集してbundle installしたら以下のコマンド打てば良い(環境による)

`docker-compose restart`・・・コンテナ再起動

そしたらGemの内容が反映されます。



## イメージをビルドしなおしたりコンテナ削除したりしなくて良い

dockerを理解してないと以下のようなコマンドを打ってしまうので注意

`docker-compose build`・・・イメージビルド

`docker-compose up -d`・・・コンテナ作成＆起動
【JavaScript】ES6の便利な配列のメソッドfilter,map

![cat_javascript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573011/2aa16c21-8331-5ae8-f645-d0ee6fd0e8e7.png)


#はじめに
ES6(ES2015)で追加された便利な配列のメソッドfilter,mapについて説明します。

##filterとは
コールバック関数内の条件を満たした配列を抽出するメソッド

```javascript
const gosanke = [
  {'name': 'ヒトカゲ'   , 'type': 'ほのお'},
  {'name': 'ゼニガメ'   , 'type': 'みず'},
  {'name': 'フシギダネ' , 'type': 'くさ'},
];

const party = gosanke.filter(pokemon => {
  return pokemon.type === 'くさ';
});

// {'name': 'フシギダネ' , 'type': 'くさ'}
```

pokemonに配列の各要素は代入され、``type``が``くさ``のポケモンのみ抽出します。
returnを忘れないようにしましょう。

##map()とは
配列から各要素を受け取って、新しい配列を作成するメソッド

```javascript
const gosanke = [
  {'name': 'リザードン' , 'type': 'ほのお'},
  {'name': 'カメックス' , 'type': 'みず'},
  {'name': 'フシギバナ' , 'type': 'くさ'},
];

const party = gosanke.map(pokemon => {
  return `メガ${pokemon.name}`;
})

/* {'name': 'メガリザードン'},
   {'name': 'メガカメックス'},
   {'name': 'メガフシギバナ'} */
```
map()は配列に一部処理を加えて、新たな配列を作成するイメージです。すべての配列に似たような処理をしたい時に使います。
こちらもreturnを忘れないようにしましょう。

#さいごに

初めての投稿です。これからも定期的に投稿していきます。


##参考
[初めてのJavaScript 第3版](https://www.amazon.co.jp/dp/4873117836/ref=cm_sw_r_tw_dp_ckL9FbBD3FJNH)
エイリアスで作業効率アップ

#はじめに
はじめまして。2019年10月からプログラミングの勉強を始めて、まさか自分がQiitaに記事を投稿するようになるとは夢にも思いませんでした。

今回は、私が某プログラミングスクールのチーム開発（アジャイル開発）でデプロイ作業を担当したときに設定して便利だったエイリアスについてアウトプットしていこうと思います。

なにぶん初めての投稿なので、多々至らぬ点があると思いますが、生暖かい目で見守っていただけますと幸いです。

#エイリアスって何？
エイリアスとは、ターミナルでよく使うコマンドをショートカットキーとして登録できる設定のことです。

なんのこっちゃわかんないですね。。要は、Macのターミナルに、これから[rr]って打ったら[rails s]の事ね！って覚えさせる事です。

これのメリットは、
・長いコマンドを自分でわざわざ打たなくて済む
・コマンドの打ち間違いが起きなくなる
・作業効率が上がる

最初に設定しておけばMacを再起動してもずっと使えるので、ターミナルの使い心地が格段にアップします。
早速設定していきましょう

#どうやって設定するの？
下記のように設定します。
ターミナルで、

```
$ vim ~/.zshrc
```

と打ち込み、~/.zshrcに入ります。iを押下して編集モードに入って、

```~/.zshrc
alias ショートカットコマンド='実行したいコマンド'
```

のように設定したいエイリアスを記述したら、escキーでvimの編集モードを抜けて、:wqで保存してvimを抜けましょう。
ターミナルで、

```
$ source ~/.zshrc
```
と打つと設定が反映されます！これでエイリアスを使う事ができます！！

以下に、僕が設定したエイリアス設定を書きます。ご参考までに。

#設定して便利だったエイリアス

```~/.zshrc
alias ll='ls -la'
alias rm='rm -i'
alias ..='cd ..'
alias gs='git status'
alias gc='git commit'

alias ss='cd .ssh'
alias ad='bundle exec cap production deploy'


alias mig='rails db:migrate'
alias ms='rails db:migrate:status'
alias migres='rails db:migrate:reset'
alias rr='rails routes'
alias rs='rails s'
alias bi='bundle install'

```

このほか、サーバーに繋げる設定もエイリアス設定しておくと、効率が上がると思われます。
自分なりのエイリアス設定で作業効率をアップさせましょう。

注意：サーバー上ではエイリアス設定が反映されません。あくまでローカルPC（自分のPC）上でエイリアスは動作します。

#終わりに
　以上、簡単ではございますがエイリアスについて書かせていただきました。参考になると幸いでございます。
　拙い文章失礼しました。間違いなどございましたら、遠慮なくご指摘いただけますとありがたいです。
Vue.jsのイベント修飾子について理解する

# 概要
本記事では、Vue.jsで用意されているイベント修飾子について`.stop`と`.prevent`を例にしていまとめていきます。

## .stop
処理内容はJavaScriptにおけるDOMのEventオブジェクトの`event.stopPropagation()`と同じ。
下記の例では、`mousemove`によりpタグの上にマウスを乗せるとイベントが発火するようになっています。
そのpタグの中にspanタグを入れていますが、このspanタグの上にマウスを乗せた時だけはイベントを発火させたくないという時に`.stop`を使用します。
イベント発火をさせたくないspanタグに`v-on:mousemove.stop`を書いてあげることで、"ここでは反応させたくない"の文字の上ではイベントが発火しないようになります。

```html:index.html
<div id="app">
  <p id="sampleText" v-on:mousemove="mousePosition">ここにマウスを載せると下のX、Yの値が変わるよ
    <span v-on:mousemove.stop>ここでは反応させたくない</span>
  </p>
  <p id="result">X:{{x}}, Y:{{y}}</p>
</div>
```

```js:index.js
new Vue({
  el: '#app',
  data: {
    x: 0,
    y: 0
  },
  methods: {
    mousePosition: function(event) {
      this.x = event.clientX;
      this.y = event.clientY;
    }
  }
})
```
## .prevent
処理内容はJavaScriptにおけるDOMのEventオブジェクトの`event.preventDefault()`と同じ。
下記の例では、aタグのリンク先としてGoogleを設定しています。
本来であればクリックした時にGoogleのサイトに遷移しますが、`v-on:click.prevent`と記述するとaタグとしてのデフォルトの挙動を妨げることができます。

```html:index.html
<div id="app">
  <a v-on:click.prevent href="https://google.com">リンク</a>
</div>
```

```js:index.js
new Vue({
  el: '#app'
})
```

## 最後に
Vue.jsで用意されているイベント修飾子をうまく利用する事で、シンプルなコードを書く事ができるようになります。
他にも利用可能なイベント修飾子はたくさんあるので調べてみてください！
【Kotlin】companion objectに定義された関数への参照を取得する

# やること
`companion object`に定義された関数への参照（`method reference`）を取得します。
これは単純に`Hoge::fuga`と書いても取得できません。

# やり方
クラス名を`()`で囲むやり方と`companion object`の名前から取得するやり方を紹介します。
基本的には`()`で囲むやり方でよいと思います。

## クラス名を()で囲む
```kotlin
// 取得対象クラス
class SampleClass {
    companion object {
        fun temp(piyo: SampleEnum): String = piyo.name
    }
}

// 取得方法
val func: KFunction<String> = (SampleClass)::temp
```

## 名前から取得する
コンパニオンオブジェクトにはデフォルトで`Companion`という名前が付いているので、そこから取得することができます。

```kotlin
// 取得対象クラス
class SampleClass {
    companion object {
        fun temp(piyo: SampleEnum): String = piyo.name
    }
}

// 取得方法
val func: KFunction<String> = SampleClass.Companion::temp
```

コンパニオンオブジェクトに名前を付けた場合は、`Companion`を付けた名前に置き換えれば同様に取得できます。

```kotlin
// 取得対象クラス
class SampleClass {
    companion object Hoge {
        fun temp(piyo: SampleEnum): String = piyo.name
    }
}

// 取得方法
val func: KFunction<String> = SampleClass.Hoge::temp
```

### 補足
名前を付けた場合も`()`で囲むやり方は機能します。

# 参考にさせて頂いた記事
- [kotlin \- Unable to reference companion object methods \- Stack Overflow](https://stackoverflow.com/questions/35363831/unable-to-reference-companion-object-methods)
ReamBrowserでAndroid実機のDBを参照する方法(Android：実機端末,PC：Mac)

## AndroidをUSBデバッグ接続する
ここは省きます。
ググればすぐでできます！
https://developer.android.com/studio/command-line/adb?hl=ja

## Android SDKのディレクトリを開く

**Android SDK Location** に記述してあるパスをターミナルで開く
Andorid Studio → Preferences → Android SDK → **Android SDK Location**

~~~Bash
cd /Users/ユーザー名/Library/Android/sdk
~~~


adbが存在するパスへ移動

~~~Bash
cd ./platform-tools
~~~

##Android実機の実行環境を開く

adbを実行し、android実機の実行環境を開く

~~~Bash
./adb shell
~~~

## realmファイルを抽出

ローカルストレージを見る

~~~Bash
run-as パッケージ名

//上のパッケージわからない場合は以下で調べる
pm list packages | grep パッケージ名
~~~

realmが保存されているディレクトリへ移動

~~~Bash
cd ./files
~~~


外部ストレージへコピー
***※ここハマりました。　***
SDカードないからできねえええええええええって思ってたんですけど
sdcardのシンボリックリンクが内部ストレージ(/storage/self/primary)になってました。
なのでSDカードマウントできないどうしようと発狂しなくてよいです。

~~~Bash
//sdcardを調査して出た結果
ls -ltra
lrwxrwxrwx  1 root   root     21 1970-09-02 19:46 sdcard -> /storage/self/primary
~~~

外部ストレージ（SDカードではなく内部ストレージ）へコピー

```Bash
cat default.realm > /sdcard/Download/export_db.realm
exit
```

Android実機からPCへコピー

~~~Bash
./adb pull /sdcard/Download/export_db.realm /Users/ユーザー名/Documents
~~~

外部ストレージにコピーしたごみを削除

~~~Bash
./adb shell rm /sdcard/Download/export_db.realm
~~~

## RealmBrowserで開く

RealmBrowserを開く → ```Open Realm File```


```/Users/ユーザー名/Documents/export_db.realm``` を開く


無事見れましたね！！！
DockerのMySQLコンテナにSequelProで接続する

# docker-compose.yaml

```yaml:docker-compose.yaml
version: "3"
services:
    mysql:
        container_name: [MySQLのコンテナ名]
        image: mysql:5.7
        environment:
            MYSQL_DATABASE: [データベース名]
            MYSQL_USER: [ユーザー名]
            MYSQL_PASSWORD: [パスワード]
            MYSQL_ROOT_PASSWORD: [パスワード]
        ports:
            - "4306:3306"
        volumes:
            - mysql-data:/var/lib/mysql
```

## ポート → `"4306:3306"`
おそらくほとんどの人が、ローカルでMySQLを起動していると思います。特別に設定していなければ、`ローカルの3306番`のポートがMySQLに使われていると思います。

なので、今回は、ローカルの4306番をMySQLコンテナの3306番と繋ぐように設定しています。

# ターミナルからMySQLコンテナに入って確認する場合

MySQLコンテナに入ります。

```:ターミナル
$ docker exec -it [MySQLのコンテナ名] bash
```

コンテナに入れたら、MySQLに接続します。

```:ターミナル
$ mysql -u root -p

パスワードが要求されるので、入力して完了。
```

# ターミナルから直接MySQLコンテナに接続したい場合

```:ターミナル
$ mysql -u root -p -h 127.0.0.1 -P 4306
```

注意点は２つあり、
・ホストはlocalhostを使用せず、IPアドレスを直接入力する
・ポート番号を指定する際は、大文字のPを使用する

# SequelProで接続
<img width="810" alt="docker-sequelpro.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352619/ada85d1f-0350-81b3-9562-9fa4ad3684f3.png">
ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate column name '_id': ALTER TABLE `` ADD `_id` bigint

#カラムの追加の後にrails db:migrate　
をした際にタイトルのエラーがMysqlにて出て苦戦したので、同じような方がいるかもなのでメモとして残します。


##まず最初に結論からです。エラーの原因は、migrateした際
rails db:migrate:status
   up     20200123145035  Create users
   up     20200123150804  Create 
   up     20200124043414  Create 
   down     20200125060439  Create 
   down     20200125064510  Create 

＊downと書かれているファイルならupされてないので問題ないと作り直す為に、削除して作り直した事が原因で
起こりました。downのままですが、追加しようとしたカラムが一部だけ追加されていた事による重複です。

初心者さんで同じような事になる方もいると思いますので、その際しっかりとロールバックまたは、データベースを削除したかのご確認をしてみてください。

##直し方

そして直した方法ですが・・・
rails db:drop
をしてデータベースを再作成する事でup済みのものに追加してしまいマイグレーションファイルが削除されなくなってしまったものをなかった事にしました。

rails db:create

raild db:migrate

これで、 rails g AddxxxRefToテーブル名　カラム名: で追加し直し。
正常に戻りました。今回は、作りたてだったので問題なかったですが、デプロイ済みの場合などはユーザーデータが消えたりして大変な事になりますので、お気をつけください。
勉強議事録:１日目

こんにちは　UNIZONです。
ピチピチの社会人２年目です。

これからプログラミングを勉強していこうと思うので、
その議事録として記事を書いていこうと思います。

と言っても完璧なプログラミング初心者ではありません。
大学では情報工学を専攻していたので、ちょっとした考え方とかは分かりますが。。。
如何せん、優秀な同期に恵まれていたので、分かんねえな、と思えばコードを貰ってました(クズ)
てことで、準プログラミング初心者(?)です。

まずは、もう一回勉強しないといけねえな、と思った経緯から自分語りしていこうと思います。

私は今、移動体通信事業者で働いております。
総合職の技術の部署です。
ですが！日常やっている事といえばパートナー会社さんとの打ち合わせやエクセルで集計、
稟議書の作成等、思っていた技術とは程遠い業務です。

全然技術力ない癖に、「なんて古臭い事ばっかやってんじゃこの会社は！！」と
不満をグダグダ言っていたら上司に伝わってしまい、
「そこまで言うなら自動化してみろ！！」と技術部署と自動化部署の2つを兼務する事となりました。

自動化部署の先輩に倣い、エクセルのVBAで自動化を進めていましたが
生意気な２年目、「VBAやだ〜〜Pythonとか使いたい〜〜」と酒の場で言ってしまいました。。。

そうしたら、上司から「じゃあPython使ってもいいよ、うちの会社使える人いないけど。導入するからには一人でも成果出せよ」とのプレッシャー。
言ってしまった手前、やっぱ無理ですとは言えない生意気な２年目。。。

て事で、Pythonを勉強します。
はい、完全に自業自得。
文字に起こすとさらに自分の馬鹿さ加減が浮き彫りになる。恥ずかしい。

業務で何に対してPython使えばいいかも分かんないもん。
稟議ばっか書いてるもん。
だがしかし、啖呵切った手前、何か成果物は出したい(←懲りてない)

て事で、業務終了後に何か作れるよう、勉強していきたいです。
張り切って6年前に購入したMacBook Pro RetinaからMacBook Airに乗り換えました。
(形から入るタイプ)

そしたら全然設定が分かんない。
前は大学の先輩に設定してもらったから、zshとか全然知らない。

て事で、プログラミングを勉強する為に、Macの環境の整え方から勉強していきます。。。


今後は
・Mac開発環境を整える
・Python勉強
　・paiza
　・Kaggle
で進めていこうと思います。
絶対一人じゃ出来ない。。。。
いつも先輩・同期に頼ってたもん。。。。

三日坊主にならないよう頑張ります。
第一回目はこれで以上！頑張っていきます。
UE4 ルートモーションについてのメモ

# 概要
UnrealEngine のアニメ―ションのルートモーションについてのメモです。

## 更新履歴
| 日付 | 内容 |
|:----|:-----|
|2020/10/23| URO時の問題について追記 |

## 環境
Windows10
Visual Studio 2017
UnrealEngine 4.22

## 参考
以下を参考にさせて頂きました、ありがとうございます。

[UnrealEngine:ルートモーション](https://docs.unrealengine.com/ja/Engine/Animation/RootMotion/index.html)


# ルートモーションについて
アニメ―ションのルートの移動値であり、移動するようなアニメ―ションの移動した値をアクターへ適用するための仕組みです。
UEではスケルトンツリーのトップにあるボーンから取得するようです。(Rootという名前ではなくても良いらしい)

## 関連ソース
"Engine\Source\Runtime\Engine\Classes\GameFramework\RootMotionSource.h"
"Engine\Source\Runtime\Engine\Private\GameFramework\RootMotionSource.cpp"

# ルートモーション処理
キャラクターへの適用方法です。

## 適用方法
アニメ―ションシーケンスの[アセット詳細] -> [RootMotion] の [EnableRootMotion] にチェックを入れます。

![AS_EnableRootMotion.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/0cca58d2-0a4d-d969-b15b-50643d672d11.jpeg)


アニメ―ションBPの[詳細] -> [RootMotion] にて、[Root Motion from Everthing] か [Root Motion from Montage Only]を選択します。
![AnimBP_RootMotion.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/2eaf62e2-eb6e-9cd4-6b12-afc9d474677f.jpeg)

＃[Root Motion from Montage Only]はアニメーションモンタージュで再生した時のみとなります。


## 適用されない場合のトラブルシューティング
### アニメ―ションデータが対応していない場合
ルートのボーンが動かないと適用されません。
トップのボーンを指定してプレビューした場合、オレンジの線がでます。
![RootBone.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/ccc190c3-c98b-40d1-d3af-f3385210a949.jpeg)

この状態で、[EnableRootMotion]にチェックを入れてプレビューすると、移動が書き出されるため、プレビュー上では移動しなくなります。（オレンジの線がでなくなります）
![EnableRootMotion.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/553819d3-bc67-a67a-fd40-613ef2bcf764.jpeg)

### MovementComponentが対応していない場合
デフォルトでは移動コンポーネントにCharacterMovementComponentを使用していないと適用されません。
その場合はアニメーションインスタンスから移動値を取得して自前でアクターに適用しないとなりません。

以下コード例：

```cpp:AMyActor.cpp
void AMyActor::Tick(float DeltaTime){

	// アクターのアニメ―ションインスタンスクラスから移動値を取得
	FRootMotionMovementParams _Params = GetAnimInstance()->ConsumeExtractedRootMotion(1.0f);
	if( _Params.bHasRootMotion){
		// アクターのローカルトランスフォームへ適用
		AddActorLocalTransform(_Params.GetRootMotionTransform());
	}

}
```

sweep処理が必要な場合は、`AddActorLocalTransform` の第2引数を `true` にすればOKです。

## その他
URO(Update Rate Optimizations)などを使ってアニメ―ションフレームを飛ばす処理をした場合、当然ながらトランスフォーム値が意図したものとずれてきます。（飛ばされたフレームのデータが取得できません）
この場合、ルートモーションを使うのは避けるしかないと思われます。


# まとめ
ルートモーションが上手く動かなかったため、原因をメモ書きとして残しました。
ベイズ推論とは結局何なのか

# はじめに
　混合ガウスモデルを、須山さんの本[「ベイズ推論による機械学習入門」](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E9%A0%88%E5%B1%B1-%E6%95%A6%E5%BF%97/dp/4061538322/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92&qid=1579937332&sr=8-1)や確率モデル同士を結合し大規模なモデルを可能にするフレームワークである[Serket](http://serket.naka-lab.org/)の[コード](https://github.com/naka-lab/Serket)を見ながら実行してみて、ようやくベイズ推論の意図するものが分かったので持論を展開したいと思います。

#一般的なベイズ推定、ベイズ推論の理解
ベイズ推定は、Wikipediaに以下のように説明されています。

>ベイズ推定（ベイズすいてい、英: Bayesian inference）とは、ベイズ確率の考え方に基づき、観測事象（観測された事実）から、推定したい事柄（それの起因である原因事象）を、確率的な意味で推論することを指す。

ベイズ推定それ自体については、[この記事](https://qiita.com/HiromuMasuda0228/items/2dc62cf4f9dbdf373627)が分かりやすいです（上の文章はここから拝借しました）。また、ベイズ推論については、前述の本のほか、自由エネルギー原理についての[非常に分かりやすい記事](https://qiita.com/NayuSato/items/2f54c75e7459c25c9528)が参考になります。

#ベイズ推論とは何か
私は下記のように解釈しています。

>ベイズ推論とは、観測事象に対し、**信念に基づく確率モデル**を当てはめて、数学的に厳密にまたは近似的に、当該確率モデルの尤もらしいパラメータを求めること

例えば、下記のような2次元データがあったとします（画像は[ここ](https://qiita.com/physics303/items/9ecff25001fa22a0cffb)から拝借しました）。

![https___qiita-image-store.s3.amazonaws.com_0_139546_e2105e42-bd12-0ef0-7961-a7d9f523e21c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573039/371f3fa9-98c5-3267-6901-e9190782db02.png)

いかにも2次元正規分布によって近似できそうです。実際、混合ガウスモデルによりクラスタをきれいに分けることができます。しかし、混合ガウスモデルでは、当然、事前分布としてガウス分布を想定しますが、これはただの**信念**でしかないのです。混合ガウスモデルではなくベイズ推論として広く考えれば、別にポアソン分布でもいいし、他の分布でも良いのです。

数式やコードや見栄えの良い図やグラフに惑わされがちですが、**本質的には自らが考えた確率モデルに対して、無理やり観測データを当てはめて、最も都合の良いパラメータを計算させている**のが、ベイズ推論の行っていることだと考えられます。
だからこそ、近似推論である変分推論を行ったり、いろんな近似を行ったり、解析的に解くことができない分布からサンプリングして値を求めて良いのです。

とはいえ、**ベイズ推論は有用である**ことには変わりありません。なにせ、自分の考えたモデルに都合の良いパラメータを求めることにより、**観測データの予測や分類が可能となる**からです。近年では、脳内における計算においてもベイズ推論が行われていると言われており、[計算論的神経科学](https://www.amazon.co.jp/%E8%A8%88%E7%AE%97%E8%AB%96%E7%9A%84%E7%A5%9E%E7%B5%8C%E7%A7%91%E5%AD%A6-%E8%84%B3%E3%81%AE%E9%81%8B%E5%8B%95%E5%88%B6%E5%BE%A1%E3%83%BB%E6%84%9F%E8%A6%9A%E5%87%A6%E7%90%86%E6%A9%9F%E6%A7%8B%E3%81%AE%E7%90%86%E8%AB%96%E7%9A%84%E7%90%86%E8%A7%A3%E3%81%B8-%E7%94%B0%E4%B8%AD-%E5%AE%8F%E5%92%8C/dp/4627851618)や[計算論的精神医学](https://www.amazon.co.jp/%E8%A8%88%E7%AE%97%E8%AB%96%E7%9A%84%E7%B2%BE%E7%A5%9E%E5%8C%BB%E5%AD%A6-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E9%81%8E%E7%A8%8B%E3%81%8B%E3%82%89%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F%E7%B2%BE%E7%A5%9E%E9%9A%9C%E5%AE%B3-%E5%9B%BD%E9%87%8C-%E6%84%9B%E5%BD%A6/dp/432625131X/ref=pd_sbs_14_t_0/357-5884226-7771704?_encoding=UTF8&pd_rd_i=432625131X&pd_rd_r=5e44f7f9-e063-4f89-8bd1-3c32fd07e7de&pd_rd_w=fINUM&pd_rd_wg=HBJJ3&pf_rd_p=ca22fd73-0f1e-4b39-9917-c84a20b3f3a8&pf_rd_r=2DQ7JNJBWYBRGWVS9GQZ&psc=1&refRID=2DQ7JNJBWYBRGWVS9GQZ)などといった分野も盛り上がりを見せています。

人間の思考の本質もベイズ推論なのかもしれません。

#まとめ

>ベイズ推論とは、観測事象に対し、**信念に基づく確率モデル**を当てはめて、数学的に厳密にまたは近似的に、当該確率モデルの尤もらしいパラメータを求めること

以上です。
graphvizをanaconda/windows10にインストール/確認する方法

約1年ぶりの投稿です。
今回はgraphvizをjupyter/windows10にインストールする方法です。

###目次
1.ポイント
2.インストール
3.graphvizの場所を探す
4.パスを通す
5.確認する

###1.ポイント：環境変数でパスを通す
Windowsでの機械学習/AIの環境構築は本当に大変です！本当にトラップが多く、おっさんはもう泣きそうです。GPU設定（[過去記事](https://qiita.com/pyg50/items/b9290520479c8167363d) です。バージョン合わせに気を付けて参考にしてください）、新語に強い辞書Neologd（「subsytem for Linux」でクリア。[コチラ](https://www.pytry3g.com/entry/MeCab-NEologd-Windows)がオススメです）、そして今回のgraphvizなどなど。ホントたくさんのサイトを参考にしましたが、結局インストールするだけではダメでした。ポイントは**「しっかりパスを通す」**ことなんです！
あとでわかりましたが、[公式サイト](https://pypi.org/project/graphviz/)にもちゃんと書いてありました。

>公式サイトより引用
>>Make sure that the directory containing the dot executable is on your systems’ path.


### 2.インストール
私はanacondaの下に入れたかったので
```conda install graphviz```

を使いましたが、お馴染みの
```pip install graphviz```
でも大丈夫だと思います。あと、dotをpipしている方もおられましたが、私の環境ではgraphvizだけでOKでした。

###3.graphvizの場所を探す
エクスプローラーからgraphvizを入れたドライブ（多くはcドライブ）で検索するとどこにあるかわかります。恐らく
**「\anaconda3\Lib\site-packages」**か
**「\anaconda3\Library\bin」**
あたりではないかと思います。ファイルの場所（パス）をコピーしておいてください。
※cドライブ直下に入れた/フォルダ指定した方はそれぞれ適切なパスを選択してください。


###4.パスを通す
重要なので、私のような初心者の方でもわかりやすいように少し丁寧に説明しますね。

**STEP1.「コントロールパネル」を表示します。**
![01_pic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241427/ca0ff6bd-680a-7be1-c7e8-8c5010b2472b.jpeg)

**STEP2.「システム画面」を表示します。**
![02_pic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241427/7725e8f0-0462-3565-ea28-6047c1e71824.jpeg)

**STEP3.「環境変数画面」を表示します。**
![03_pic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241427/81961144-1304-f2bf-477d-e81ebb8c3dd4.jpeg)

**STEP4.「Pathの編集→新規→graphvizのパス設定」**
![04_pic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241427/94472d2d-8be9-5e76-f066-5fdf259ddc91.jpeg)

これで完了です。ちゃんと挙動するか確認してみましょう。

###5.確認する
[コチラ](http://swdrsker.hatenablog.com/entry/2017/05/19/205409)を参考にさせていただきました。
（出展）http://swdrsker.hatenablog.com/entry/2017/05/19/205409

```
from graphviz import Digraph

G = Digraph(format="png")
G.attr("node", shape="square", style="filled")
G.edge("start","state1",label="0.8")
G.edge("start","state2",label="0.2")
G.edge("state1","state1",label="0.5")
G.edge("state2","state2", label="0.8")
G.edge("state1","state2",label="0.5")
G.edge("state2","end",label="0.2")
G.edge("end","count",label="1.0")
G.edge("count","start",label="1.0")
G.node("start", shape="circle", color="pink")
G.render("graphs") #png/直下

#図示化
from IPython.display import Image
Image('graphs.png')
```
ちゃんとキレイに描かれていますね。よかったです。
![graphs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241427/e4fa5d17-3fd7-51ad-296c-de0ad2cfd8c9.png)

※）環境依存が大きいので私のやり方ではダメな場合もあると思います。私のできる範囲でお役に立てるなら気軽にご質問ください。
GANs（pix2pix）の工学応用を検討した

#【概要】
画像を入力にして画像を出力できるpix2pixで、数値流体力学（CFD)シミュレーションの結果（具体的には、同一の物理条件に対して高解像度格子で計算した場合と低解像度格子で計算した場合の密度）の分布図を学習して、低解像度格子の計算結果から高解像度格子の計算結果を生成できるか否かを検討しました。そして、密度の不均質度をある程度の精度で再現した分布図を生成できることを示すことが出来ました。

#【動機】
昨年、日本ディープラーニング協会（JDLA)のE資格を取得したのですが、認定講座の講義でGANsを知って、これは面白い！と思ったのがまず一つ目の動機です。E資格の試験勉強で知識を体系的に得ることは出来たのですが、自分で手を動かす経験をしないとその先には進めないと思ったのが二つ目の動機です。そして大学生の時から長い期間CFDシミュレーションに関わって来ており、それなりに思い入れがあるのでGANsとシミュレーションとで何か面白いことが出来ないかと考えたのが三つ目の動機です。

#【内容】
使用した[ソースコード][1]と内容についてまとめた[レポート][2]をGitHubに上げましたので、興味を持って頂けた方は参照ください。以降では、レポートには書かなかったが有用と思われる事項について記載します。
[1]:https://github.com/bright1998/GANsxSimulation/tree/master/pix2pix
[2]:https://github.com/bright1998/GANsxSimulation/blob/master/pix2pix/GANxSimulation.pdf

#【アーキテクチャの選択】
"GANZOO"と言われるように、GANには非常にたくさんのアーキテクチャが存在します。自分でオリジナルのアーキテクチャを設計する場合を除き、既存のアーキテクチャを活用することになります。どのアーキテクチャを活用すればよいかを判断するのは非常に難しかったですが、[こちらのサイト][3]である程度当たりをつけることが出来ました。いくつかの質問に答えていくと、該当するアーキテクチャの候補をあげてくれます。
[3]:http://www.thothchildren.com/thothnator/service/main/0/5ce14a32e1a5c628ba458a50?lang=ja

#【実装】
1から実装するのは勉強になりますが、非常に大変なので公開されているソースコードを利用させていただきました（自分のやりたい事を実現するために、一部の改変は必要になりましたが）。[こちらのサイト][4]には、多くのアーキテクチャのPytorch実装が公開されており、非常に有用でした。また、無料かつオンラインで行われた[勉強会][5]では、ソースコードつきで実行方法まで解説していただき、今回の検討を実現する上でのターニングポイントであったと言っても過言ではありません。

勉強会で配布されたソースコードに対して加えた大きな変更点は、4チャンネル目に情報を付加できるようにしたことです（今回は速度ベクトルの矢印プロット、もしくは速度の発散のコンタープロットの付加を検討しました）。ソースコードのmodel.pyへの変更は、in_channelsとout_channelsというパラメータで両チャンネル数を変更できるようにした程度ですが、画像の読み込みを行うdatasets.pyでは2枚の画像を組み合わせて4チャンネルのデータを作成するような変更を加えています（torch.catで結合）。in_channelsとout_channelsに同じ値を指定すれば、元々のソースコードと同じ動作となります。
[4]:https://github.com/eriklindernoren/PyTorch-GAN
[5]:https://aifashion.connpass.com/event/149576/

#【今後】
入力データ（密度の分布図）を作成するために実行した数値シミュレーションは、非定常計算です。つまり時間変化を解いているので、時系列の概念があります。そこでpix2pixとLSTM（Long short-term memory）を結合させたネットワークを作成し、時系列画像（動画）から時系列画像（動画）への変換に取り組みます。
~~現在執筆中の論文が書き終わって一段落したら、記事にしたいと思っています。~~
**[記事][6]を書きました。**
[6]:https://qiita.com/bright1998/items/71819ce6f0f53f7972ae