OmniAICreator/Qiita-1.07M huggingface dataset:
素人が微分ってなに？を解決するために積分を交えて解説する

微分積分学を理解するために重要な要素3つ

- 微分と積分の種類
- 微分積分学の基本定理
- 位置⇄速度⇄加速度


#微分と積分の種類

 - 微分の種類
     - 導関数
     - 微分係数

 - 積分の種類
     - 不定積分
     - 定積分

他にもたくさんあるが、今回はこの4つについて説明する。知りたければ、Wikipediaでも見てほしい。

イメージとしては、微分係数⇔定積分。ただし、微分係数は平均変化率(傾き)を求めるのに対して、定積分は面積を求める。[傾きと面積の関係についての動画](https://youtu.be/b1d-BAxvoWA)

#微分積分学の基本定理
$$\frac{d}{dx}\int f(x)dx = f(x)$$
おおよそこのような式である。この式が言いたいことは、関数f(x)を不定積分して、その導関数を求めたら元の関数に戻るよってこと。つまり、導関数⇔不定積分。他にも、「微分積分学の基本定理」には、定積分を定義するための式
$$\int_{a}^{b} f(x)dx = F(b)-F(a)$$
などもある。


#位置と速度と加速度の関係
位置⇄速度⇄加速度
「→」が微分、「←」が積分を表す。
この関係は、工学及び、物理学において重要だ。力学では、rを位置、tを時間として、ニュートンの運動方程式
$$m\frac{d^2r}{dt^2}=F$$
が定義されている。これは、「位置を時間で2回微分すると、加速度になる」ということを表していて、高校物理で習った
$$F=ma$$
のことだ。([参照](https://www.youtube.com/watch?v=iAANt7xIGhg))

#微分積分の発見
高校数学では、不定積分から定義し、その後に定積分を定義しがちだが、歴史的には、定積分が先であることは、
[この動画](https://www.youtube.com/watch?v=V9i_zlbssbs&t=1599s)で説明している。

[探究シネマ — 微分](https://www.youtube.com/playlist?list=PLw2o_GLCMgkxX1yGrs5y0AVU2jMB5UW8M)
[探究シネマ — 積分](https://www.youtube.com/playlist?list=PLw2o_GLCMgkzUTo1jiIgTmoxnvOrcdX0X)
説明がとてもわかりやすいので、この2つの再生リストは、ぜひ一度見てほしい。

#ε-δ理論
微分積分学は、これで終わりでない。ここでは、微分積分をより詳しく定義するための「ε-δ理論」を紹介する。

##ε-δ理論 極限をより詳しく定義して、微分積分という概念をより明確にする

高校で習う「限りなく」小さい変化値、
$$\lim_{x\to a}f(x)=A$$
におけるこの「a」だ。この定義は、このままだと、非常に曖昧である。だから、[極限とは何かを解説した動画](https://www.youtube.com/watch?v=OWLn_rYFIhQ)も観てほしい。

##ε-δ理論 微分可能とは

微分可能についても、ε-δ理論を用いて表すことができる。これは、天下の[ヨビノリたくみさんの動画](https://www.youtube.com/watch?v=t3JPms8Y1l4)がわかりやすいだろう。

#まとめ
「説明する」と言っておいて、説明というほどの説明をしていない。むしろ全くしていない。
Docker logs をgrepする

コンテナのログは、`標準エラー出力 (stderr)`に記録されます。

一方、「|」で記述するパイプラインは、`標準出力(stdout)`で機能します。

コンテナのログをパイプラインで受け取れるように、
`標準エラー出力`を`標準出力`へと出力先を`2>&1`で変更します。

これで、パイプ後の`grep`コマンドが動くようになります。

```shell
docker logs app 2>&1 | grep "test"
```

ちなみに、`2>&1`を省略した形として、次のように記載することもできます。

```shell
docker logs app |& grep "test"
```
製薬企業研究者がPythonの内包表記についてまとめてみた

# はじめに

ここでは、Pythonの内包表記について、覚えておくと役に立つことをまとめてみます。


# リスト内包表記

```python
nums = [1, 2, 3, 4, 5]

nums_double = [x * 2 for x in nums] # リストnumsの要素をそれぞれ2倍する
print(nums_double) # [2, 4, 6, 8, 10]

nums_even = [x for x in nums if x % 2 == 0]
print(nums_even) # [2, 4]
```


```python
nums_2 = [[1, 2], [3, 4]]

nums_2_odd = [odd for nums in nums_2 for odd in nums]
print(nums_2_odd) # [1, 2, 3, 4]
```

```python
nums_set = {1, 2, 3, 4, 5}

nums_set_square = {x**2 for x in nums_set}
print(nums_set_square) # {1, 4, 9, 16, 25}
```

```python
nums_dict = {'one': 1, 'two': 2, 'three': 3}

nums_dict_rev = {value:key for key, value in nums_dict.items()}
print(nums_dict_rev) # {1: 'one', 2: 'two', 3: 'three'}
```

```python
nums = [1, 2, 3, 4, 5]

nums_gen = (x for x in nums)
print(nums_gen) # generator object

for num in nums_gen:
    print(num)
```

```python
print("\n".join("Fizz"*(n%3== 0) + "Buzz"*(n%5== 0) or str(n) for n in range(1,101)))
```

# まとめ

ここでは、Pythonの内包表記についてまとめました。
使えそうなときはコードを短くするためにも使ってみるようにすると良いと思います。
ディレクトリ下の画像ファイルを動的に読み込む

# やりたいこと
特定のディレクトリ下に画像ファイルを追加したらコード自体には一切手を加えずその画像が表示されるようにしたい。


# 結論
```typescript
import React from 'react';

function App() {
  const importAll = (r: __WebpackModuleApi.RequireContext) => {
    return r.keys().map(v => r(v) as string);
  }

  const images = importAll(require.context('./assets/images', false, /\.(png|jpe?g|svg)$/));

  return (
    <>
      {images.map(image => <img src={image} key={image} alt={image} />)}
    </>
  );
}
```
`require.context()`で読み込むファイルを探すディレクトリと正規表現を指定して対象ファイルのパスを取得できる。

RequireContextの戻り値がanyなので、 公式ドキュメントのように`return r.keys().map(r)` すると `unknown[]` となる。
今回は画像を読み込んでいるためsrcに突っ込むためにstringにキャストしている。

# ドキュメント
https://webpack.js.org/guides/dependency-management/#context-module-api


# 参考記事

https://qiita.com/proudust/items/d716957e243f9e019fda
https://qiita.com/jkr_2255/items/d23e66323857d3189a00
[Python] DFS　AGC044A

#[AGC044A](https://atcoder.jp/contests/agc044/tasks/agc044_a)
最小コスト探索問題

同じ操作を繰り返す
⇒　再帰

内容は下記の引用であり、十分な説明もある。この投稿は私的メモである。
[AGC044 の A 問題「Pay to Win」を Python で解いてみる](https://wakabame.hatenablog.com/entry/2020/05/24/031143)

```python:サンプルコード
T = int(input())
 
for t in range(T):
    N, A, B, C, D = map(int, input().split())
    memo = {}
 
    def dist(n):
        if n == 0:
            return 0
        if n == 1:
            return D
        if n in memo:
            return memo[n]
        
        ret = min(
            D * n,
            D * abs(n - n//5*5) + C + dist(n//5),
            D * abs(n - (n+4)//5*5) + C + dist((n+4)//5),
            D * abs(n - n//3*3) + B + dist(n//3),
            D * abs(n - (n+2)//3*3) + B + dist((n+2)//3),
            D * abs(n - n//2*2) + A + dist(n//2),
            D * abs(n - (n+1)//2*2) + A + dist((n+1)//2)
        )
 
        memo[n] = ret
        return ret

    print(dist(N))
```
簡単なローカルサーバーの立て方

Javascriptを使ったホームページ制作などをしている際に、ちょっと動作を確認しようとブラウザでファイルを直接開いた場合(URLがfile:// ~ の場合など)、JSが動作しない時があります。
これは同一性ポリシーと呼ばれる制約を受けるからなのですが、私を含め多くのプログラミング初心者はこの時初めて同一性ポリシーについて知ると思うので、この場面に直面した時の「じゃあ結局どうすれば動作確認できるようになるの？」について紹介します。

あくまで、初心者に対する動作確認をするための紹介であり、同一性ポリシー及びCORSについての説明はほとんどしません。(知りたい人は各自調べてください。)

### 対象でない人
Apacheとかnginxを自分でセットアップできる人

## 解決策の手順
解決方法は２つあります。
1. VSCodeの「Live Server」拡張機能を使用する
2. python3を用いてターミナルで`python -m http.server`を使用する
ここで、python3としているのは現在のpythonの標準がpython3だからで特に理由はありません。python2を使っている人は想定していません。


## 解決策１について
これが最も簡単だと思います。私も普段はVSCodeでプログラムを書くことが多いのでチャチャっと確認したいときはこれを使用する時があります。

### 手順1(インストール)
VSCodeがインストールされている状態だと仮定します。
(インストールしていない人は[こちら(VSCodeの公式サイト)](https://code.visualstudio.com/download)より自身のOSにあったタイプをインストールしてください。)

インストールができたら、VSCodeの拡張機能にある「Live Server」を検索してインストール

### 起動方法
インストール後、VSCodeを再起動して右下の「Go Live」をクリックすると自動でデフォルトブラウザが起動して表示されます。

![スクリーンショット 2020-05-24 21.04.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643321/23032566-8975-0865-fb93-c2e694a9fbfe.png)


また、一度閉じてしまっても、`http://127.0.0.1:5500/`(`http://localhost:5500/`でも良い)にアクセスすることでも同様に開くことができます。(デフォルトのポートは5500番)

ちなみに、この時最初に表示されるのは、VSCodeで開いているディレクトリです。
`index.html`があれば`index.html`が、なければディレクトリの中身が表示されます。


## 解決策2について
Mac, LinuxなどのUnix系OSを使っている人であればpython3は標準でインストールされていると思うのでターミナルで

```bash
$ python3 -m http.server
```

と入力しするとターミナルのカレントディレクトリに対応した場所が開かれローカルサーバーが立ちます。
簡単に説明するとフラグ`-m`はモジュールの使用を意味するので、httpパッケージのserverモジュールを使用するという意味になります。(間違ってたらごめんなさい。)


もし、Python2系、WindowsOSを使用している場合は、
Homebrewもしくは[公式サイト(こちら)](https://www.python.org/)よりインストールしてきて上記のコマンドを実行することでローカルサーバーが立ちます。

## 終わりに
良いローカルサーバーライフを！(笑)
WordPressで別サーバーへの移行作業中にwp-cronが動作しなかった件

どうも、はにおかさいです。

# トラブル内容
先日、WordPress 3.4.1のサイトを別のサーバーに移す作業をしていました。
サイトの移行だけしてドメインのAレコードは新サーバーに向けずにhosts書き換えで動作確認をしていたとき、新サーバーのBackWPupが動作しないことに気づきました。ヘルスチェックを見ると、

> 予約したイベント backwpup_cron の実行に失敗しました。

とか
> 「バックグランド更新が想定通りに動作していません」

と言われました。
自動バックアップが機能しないのはまずいと思ったので、原因を考えました。
旧サーバーでは動いていたので、なにか新サーバーでまずいことが起きてるなぁと...

# 原因
WordPressのサイトが読み込まれたとき、curlでhttpリクエストによってwp-cron.phpを実行していました。
つまり、WordPressは自分にアクセスできないとwp-cron.phpを呼んでWP Cronを動作させられないのです。
作業中はhostsでドメインにIPアドレスを宛がっていて、DNS上では古いサーバーを指していました。

https://github.com/WordPress/WordPress/blob/717f0d0a3ed80709a5c9dc40319d38ef98110a42/wp-includes/cron.php#L717

```php
	$cron_request = apply_filters(
		'cron_request',
		array(
			'url'  => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ),
			'key'  => $doing_wp_cron,
			'args' => array(
				'timeout'   => 0.01,
				'blocking'  => false,
				/** This filter is documented in wp-includes/class-wp-http-streams.php */
				'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
			),
		),
		$doing_wp_cron
	);

	$result = wp_remote_post( $cron_request['url'], $cron_request['args'] );
	return ! is_wp_error( $result );
```
たしかにwp cronを動かすためにcronでhttpリクエストしていることが読み取れますね。

# 解決法
ドメインからサーバーのIPアドレスが正引きできればよいので、ドメインのAレコードを問題の起きた新サーバーに向けれてWordPressが自分のWebサーバーにアクセスできれば良いのです。

# 参考
https://www.pressmantech.com/tech/wordpress-tech/5192
単純にフォルダ開く

単純にフォルダを開く

```C#
using System;

namespace m2alpha_XXX
{
    public class OpenFolder
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Process.Start(@"C:test");
        }
    }
}
```

日付の組み合わせてフォルダを開く

```C#
using System;

namespace m2alpha_xxx
{
    public class TEST
    {
        static void Main(string[] args)
        {

            string OpenPath = System.IO.Path.Combine (@"C:\test",DateTime.Now.ToString("yyyy"),DateTime.Now.ToString("MM"),DateTime.Now.ToString("dd"));

            System.Diagnostics.Process.Start(OpenPath);

        }
    }
}
```
python-pptxでTableにadd_row/add_columnしたり、methodの補完を効くようにしたりする

はじめに
=======

Pythonから pptxファイルをいじるには `python-pptx` がかなり便利です。
しかし、 現在リリースされている `v0.6.18` では「PyCharmなどのIDEでmethodの補完が効かない」「Tableに行や列を追加できない」です。

methodの補完が効かないというのは、大したことないような気もしますが、なんか使ってて楽しくないので辛いです。Tableへの行や列の追加はやっぱりやりたいときがあります。どうも [python-pptx の本家](https://github.com/scanny/python-pptx) では１年以上更新が止まっているので、当分改善されそうにありません。今回その辺をちょっと改良?したので、共有しておきます。

Version
--------

- Python 3.5以上 (Type Hintを使っているので)
- PyCharm (2020.1.1)

本題
======

methodの補完が効かない原因は、 methodやpropertyの戻り値の型がはっきりしないことが原因なので、なんとかIDEにそれが伝わるようにします。行や列の追加は、すでに本家にpull requestがあったのでそれを取り込めば良さそうです。

ということで、[色々手当したもの](https://github.com/mokemokechicken/python-pptx/tree/7c97934c008d87f03f65ecb86ef35741fcefcb3c) を用意したので、

```
pipenv install "git+https://github.com/mokemokechicken/python-pptx.git@7c97934#egg=pptx"
```

などとすれば、

```python3
table.rows.add_row()
table.columns.add_column()
```

などが、使えるようになります。
(あと IDEでの補完もそこそこ効くようになります)。

さいごに
=======

他にも本家には有用そうなPullRequestがたくさん溜まっているので、こういう機能がないかなーという時は見てみると良いかもしれません。
メソッドに引数を渡し演算の結果を返り値として受け取る

# 引数がよく分からない

「Mr.Yuki」と出力したいのですが…

~~~
1 def rename(name)
2  name = "Mr.#{name}"
3 end
4
5 name = "Yuki"
6 rename(name)
7 puts name
~~~
~~~
Yuki
~~~
この構文では、出力にMr.はつかない「Yuki」になります。


>~~~
1 def rname(name)         # renameメソッドで受け取る変数name
2   name ="Mr.#{name}"    # renameメソッドで受け取る変数name
3 end
~~~
メソッドの変数には引数で渡した値のコピーが代入されている。

>~~~
5 name = "Yuki"    #このnameは全て引数のname
6 rename(name)
7 puts name
>~~~

要するに、引数のnameと変数nameは同じ名前だが別物である

順番を追って解説。

- ５行目：引数`name`に文字列 "Yuki"が代入される
- ６行目：この`name`を引数として、メソッドrenameを呼び出す
　この時に`name`のなかに入っている値がコピーされる
- １行目：コピーされた"Yuki"はメソッドrenameの変数`name`に代入される。
　よって引数`name`とメソッドで使われる変数`name`が同じ値となり、メソッドに値を渡すことができる
- ２行目：ただし、変数`name`の値を変えても、引数の`name`は別物なので、引数`name`には影響がない

##ではどうすれば期待通りの結果が得られるのか？
詳しく解説。

>~~~
1 def rename(name)
2   name = "Mr.#{name}"
3 end
>~~~
- ２行目：メソッド`rename`では引数から受け取った`name`にMr.をつけた文字列を返り値としてメソッドの呼び出し元に返す。

>~~~
６ name = rename(name)
>~~~
- 修正前は`rename(name)`と、単にメソッド`rename`を呼び出しただけだったが、今回は`name = rename(name)`とメソッドからの返り値を`name`に代入している


~~~
1 def rename(name)
2  name = "Mr.#{name}"  # ③５行目の結果を受けて、"Mr.Yuki"が左辺の`name`に代入される
3 end
4
5 name = "Yuki"  　　　  # ①「=」が１つの式は右辺から読む。”Yuki"を変数nameに代入
6 name = rename(name)   # ②renameは１行目のメソッド。このメソッドの答えと、引数(name)（※５行目で定義）の値を左辺の変数nameに代入
7 puts name    　　　　　 # ④putsで返り値を出力される
~~~
~~~
Mr.Yuki
~~~
これで`name`の値が、メソッド`rename`によってMr.をつけた文字列になる。

## さいごに
ここは本当にわかりづらい。
nameがたくさん出てくる。それが別物だと頭で理解できなかった。
処理に番号ふって、順番で示したらいくらか入ってきた。
ここは復習が必要そうです。
Mac OS CatalinaとBlender 2.8でMMDモデリングの準備


# このページでは

参考にしたい物によってはBlenderのバージョンが古く画面などが異なるので、Blender 2.8でMMDモデリングを始める手順を整理しました


# 環境

- MacOS Catalina
- MacBook Pro 2019年モデル

# セットアップ手順
## Zip解凍ソフトのインストール
Catalina標準だとバグでzipが解凍できません
Zip解凍ソフトをインストールします

App Storeから `The Unarchiver` をインストールして以降使います 

## Blenderのインストール
https://www.blender.org/download/ からダウンロードしてインストールします

## 日本語の設定
任意ですが、参考にする講座などで表示が日本語の場合設定した方が便利です

- `[Edit]->[Prederence]->[Interface]` から `Translation` にチェック
- 言語で日本語を選択
- ツールチップ、新規データ、インタフェースにチェック

<img width="657" alt="スクリーンショット 2020-05-24 19.53.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45710/20032888-8a5a-704e-8199-0ac7b11ac29a.png">

## blender_mmd_toolsのセットアップ

Blender 2.7.5以降対応のblender_mmd_toolsはこちら：

https://github.com/powroupi/blender_mmd_tools

Blenderの `[編集] -> [プリファレンス] -> [アドオン]` からのzipインストールでは<b>認識されません</b>。素直にREADMEのUsageを読み進めます

1. zipをダウンロードして適当な箇所に配置
https://github.com/powroupi/blender_mmd_tools/archive/dev_test.zip

2. zipを解凍して `mmd_tools` をBlenderのアドオンフォルダにコピーします

```
  ykmaclocal in ~/Downloads/blender_mmd_tools-dev_test
○ → cp -r ./mmd_tools ~/Library/ApplicationSupport/Blender/2.82/scripts/addons

  ykmaclocal in ~/Downloads/blender_mmd_tools-dev_test
○ → cd ~/Library/ApplicationSupport/Blender/2.82/scripts/addons
```

このような状態になればOKです

```
  ykmaclocal in ~/Library/ApplicationSupport/Blender/2.82/scripts/addons
○ → ll
total 0
drwxr-xr-x   3 yuko  staff   96  5 24 20:33 .
drwxr-xr-x   3 yuko  staff   96  5 24 20:13 ..
drwxr-xr-x@ 12 yuko  staff  384  5 24 20:33 mmd_tools
```

3. `[編集]->[プリファレンス]->[アドオン]` から `mmd` で検索をかけ、`Object: mmd_tools` にチェックを入れます

テクスチャフォルダは必要になったら設定します

<img width="673" alt="スクリーンショット 2020-05-24 20.35.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45710/dec3e623-051a-4315-8a46-c723db9428bf.png">

4. `[ファイル]->[エクスポート]` でMMDエクスポートが表示されています

<img width="600" alt="スクリーンショット 2020-05-24 20.41.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45710/5b2f1a57-a248-147f-9d28-87b4b8ce4d78.png">

これで準備終了です。
Linuxのインストールや設定でマイナートラブルの対応記録など

# VirtualBox上にLinuxをインストールしたときのマイナートラブルの対応記録

## 共通
1. Guest OS上のHDDインストール時に起動時に使用したISOファイルを指定する必要があるが、Guest Additionsがまだインストールできない状況である。

1.1 ISOファイルをどこかに置いて、scpやwgetでGuest OS内にダウンロードする。
1.2 /dev/cdromにそのISOファイルがマウントされているので、

```
~# dd if=/dev/cdrom of=hoge.iso
```
などとして、ISOファイルをGuest OS上につくる。ただし、ISOファイルのサイズが大きいので、GPartedで別のPartitionを作成およびマウントし、そこに保存したほうがよい。
2. Guest OS上でモニタを認識できないときは、ディスプレイ設定で”VMSVGA”以外を試す。

## Guest Additionsインストール時の"Kernel headers not found for target kernel"エラー
apt install gcc make perl linux-headers-`` `uname -r `` `
を実行する。[参考](https://www.dev2qa.com/how-to-resolve-virtualbox-guest-additions-kernel-headers-not-found-for-target-kernel-error/)。

## Guest Additionsインストール時のBuildエラー
/var/log/vboxadd-setup.logを見るとコンパイルエラーが発生していた。インターネットで調べてもよくわからずだったので、試しに、[ここ](https://download.virtualbox.org/virtualbox/)にある旧バージョンのGuest Additionをいくつか試したところ、Buildに成功するバージョンがあった。

## TinyCore
- [HDDインストール](https://qiita.com/hachisukansw/items/714e7bf14ea07b28eec9)
- [日本語キーボード設定](https://qiita.com/hachisukansw/items/211e35010db8b1b227df) & [ただしブートオプション設定ファイルはextlinux.confであった](http://forum.tinycorelinux.net/index.php?topic=13762.0)
- 設定保存（[参照](https://l-w-i.net/t/tclinux/0install_001.txt)）
 1. /opt/boolocal.sh　に起動時に実行したいプログラムなどを記述。
 2. /opt/.filetool.lst　に保存したいPathやプログラムなどを記述。
 3. filetool.sh -b を実行。


## ibus-mozcインストール後にキーボードが英語になってしまう
[この方法](http://note.kurodigi.com/ibus-mozc-kbdlayout/)で日本語キーボードに戻す。

## Lightweight Linux Distributionインストールトライ記録
[ここ](https://itsfoss.com/lightweight-linux-beginners/)などにあるLinuxをいくつかトライ。好みのDistributionの感想を残す。
1. Busterdog　（パッケージも入れやすく、今のところこれがベスト）
2. Tinycore （CLIだけ使うならベター）
3. Slax　（日本語キーボードの設定を試す必要あり。VirtualboxでのホストOSとのCopy&Pasteがまだうまくできず）
4. antiX　（VirtualboxでのホストOSとのCopy&Pasteがまだうまくできず）

他にも、Bodhi Linux、SparkyLinux、Peppermint、Lubuntu、Puppy Linux、Slitaz、Damn Small Linux、Porteusなどなど多数試しました。

## 終わりに
先人のみなさま、ありがとうございます。

（このページに追記していくかも。）
v1.02 2020Jul05
v1.01 2020May31　
v1.00  2020May24
自分事になっていないことは、理解してもらえない

次にくる技術が見えている人があなたのそばにいても、人はその価値に気づかない。

## 理由１：　次に来る技術が解決しようとしている課題が、その人にとって自分化できていない。
自分の解決したい問題となっていないのだから、解決策が目の前に示されてもそれに興味を示さない。
「次に来る技術はこうだ」と言い切れる人は、それを裏付ける経験と知見とを持っている（あるいはそう思っている）。
そうでない人の場合だと、それほどの経験と知見はもっていないことも多く、「それがそんなにうれしいことなのか」程度で終わってしまう。

事例：
　Macintosh　が Xeroxのパロアルト研究所のAltoを見学したスティーブ・ジョブズらによって開発されたことは知られている。Xeroxのパロアルト研究所のAltoを見学したのはスティーブ・ジョブズだけじゃない。しかし、その価値に気づいて行動した人はそう多くない。同じものを見ても気づく、気づかないは聞く側の課題意識に大きく依存する。


## 理由２：　次に出てくる技術や方向性は、だれでもが納得いく状況では登場しない。
少数者が気づいて、気づいた人たちがその方向性を拡大していく。拡大された方向性が結果を出して普及してから、わかるものになる。そして誰でもがわかるときには、もはやその分野は他者によって抑えこまれてしまっている。先見性とは、他者が気づく前に自分達のビジネスをものにするための貴重なチャンスである。それをみすみすドブに捨ててしまったことになる。

だからといって、次にやってくる技術がみえて方向性を示していた人にその後で評価されることもない。せいぜい「あいつの説明はわかりにくくて、わかんなくたって仕方ねえよ」だろう。

事例：
　外付けのHDDのストレージに、音楽再生機能をつけることの価値。iPodに電話機能をつけることの価値。それをその結果が当たり前になる前に適切に判断できる人はそう多くはない。iPodに電話機能をつけたものは、「所詮ゲテモノ」と発売当初多くの人がみなしてしまっていた。

## 理由3：　判断は常に不完全な情報の中で判断しなければならない。
　技術開発をしていくときにどのような手をうっていくのか判断しなければならないときに、ほしい情報がすべてそろっていることはない。情報が足りないし、ぼんやりとしかわかっていない部分に対して、細かいところで気になる部分は山ほどある。自分が思い描くもくろみが、そのとおりうまくいくかはわからない。そのような判断するには不完全な状況なのだ。行動するということは不完全な情報、一部は間違った情報も含まれる状況の中で、どうまともな判断を積み重ねるかということなのだ。
　一部の慎重すぎる人の場合、情報が不完全だといって、その時点での判断をすることを拒否してしまう。そういうスタンスで取り組んでいる人の場合、何か結果を出すことはできない。
　
## 理由4：　わかろうとしない人に対して、わずかな時間でわからせることができるほど、物事は単純じゃない。

だからといって、何度も繰り返し言っても、「あいつの話はうるさい」としかならないだろう。


人は、自分の望む結論を言ってくれる人を望んでいる。自分が期待しない結論ならば、たとえそれが真実であったとしても受け入れようとしないものだ。だから、**次にくる技術が見えている人があなたのそばにいても、人はその価値に気づかない**のだ。

-----
追記：

すべての人にわかってもらう必要はない。
同じ問題に取り組み、自分事としている人にわかってもらえればいい。


追記：
永遠に理解してもらえないこともある。
統計力学を作り上げたボルツマンと、実証主義に立場で原子の存在を否定するマッハとの議論は、物事の考え方についての原理・原則の部分で違っているために、どれほどボルツマンが統計力学として熱力学を再構成して作り上げても、マッハの側は受け入れていない。

物事を考えるための指導原理の部分で違っている場合、伝わらないことが多い。

追記：
[ゼロックスの「Alto」は、なぜ成功できなかったのか──パソコンの歴史を決定づけたプレゼンの舞台裏](https://wired.jp/2018/02/20/history-of-xerox-alto/)
Azure で Juniper vMX - [2]  REST APIを使う

# はじめに

[前回](https://qiita.com/narutaro/items/35b16016a6621fc626a3) の続き。REST API を使えるようにしないとな

# REST API の設定

以下で、REST APIが有効になる。公式などでは `https` を含めた方法が書かれているが、とりあえず `http` 使うだけなら以下の3行でできる 

```
# set system services rest control allowed-sources [<your-client-ip-here>]
# set system services rest http port 3000
# set system services rest enable-explorer 
```

確認してみる

```
user@vmx-1> show configuration system services rest 
http {
    port 3000;
}
control {
    allowed-sources <your-client-ip-here>;
}
enable-explorer;
```

`curl` でアクセス

```
 curl -u "user:pass" http://ip-address:port/rpc/get-software-information -H "Content-Type: application/xml" -H "Accept: application/json"

{
    "software-information" : [
    {
        "host-name" : [
        {
            "data" : "vmx-1"
        }
        ], 
        "product-model" : [
        {
            "data" : "vmx"
        }
        ], 
        "product-name" : [
        {
            "data" : "vmx"
        }
        ], 
        "junos-version" : [
        {
            "data" : "18.3X3.2"
        }

　　　　　:
　　　　　: 長いので省略
　　　　　:

        {
            "name" : [
            {
                "data" : "jail-runtime"
            }
            ], 
            "comment" : [
            {
                "data" : "JUNOS jail runtime [20190907.2386fa2_builder_stable_11]"
            }
            ]
        }
        ]
    }
    ]
}
```

# API Explorer

ブラウザで `http:/juniper-vmx-ip-address:port/` にアクセスするだけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/d9ae3b5e-e8a8-1842-f254-008296469fcc.png)

一通り試せる。いろいろできる

# シリーズ
- [Azure で Juniper vMX - [1] とりあえず動かす](https://qiita.com/narutaro/items/35b16016a6621fc626a3)
- [Azure で Juniper vMX - [2] REST APIを使う](https://qiita.com/narutaro/items/8cc490fe99439fca7e35)
Powershell_Get-Wineventについて


Get-WineventのHashtable指定

| キー名            | データ型 |        ワイルドカード可不可        |
|:-----------------|------------------:|:------------------:|
| LogName      |       \<String[]> |   可   |
| Path             | \<String[]> | 可 |
| Keywords           | \<Long[]> | 不可 |
| id             | \<Int32[]> | 不可 |
| Level               | \<Int32[]> | 不可 |
| StartTime             | \<DateTime> | 不可 |
| EndTime        | \<DateTime> |      不可       |
| UserID        | \<SID> |      不可       |
| Data        | \<String[]> |  不可 |
| \<named-data>       | \<String> | 不可 |
HTML/CSSの自分流基礎

<h1>HTMLの基礎</h1>
<p>HTMLには、ブロック要素とインライン要素がある。<br>ブロック要素の中にインライン要素を書くことはできるけど、その逆はできない</p>
<p>ブロック要素同士を連続で書くと縦に並ぶことになります。
一方、インライン要素のタグを連続で書くと横に並びます。</p>

<h2>属性について</h2>
<p>id属性：様々なHTMLタグで使われる。要素に好きな「固有名」を付ける<br>
class属性：様々なHTMLタグで使われる。要素に好きな「分類名」を付ける<br>
src属性：imgタグ（画像を表示するタグ）で使われる。画像ファイルの置き場所を示す<br>
href属性：aタグ（ハイパーリンク）で使われる。リンク先を示す</p>

<h2>要素について</h2>
<p>コンテンツエリア…内容が表示される部分<br>
padding…要素の中に割り当てられている余白<br>
border…要素の境界<br>
margin…隣接する要素との余白</p>

<h2>box-sizing</h2>
<p>border-boxは指定したwidth,heightはborder,padding,コンテンツエリアの合計になる。
</p>

<h2>line-height</h2>
<p>高さというよりは、行間を開けるイメージ</p>

<h2>vertical-align</h2>
<p>text-alignが水平方向で、vertical-alignは垂直方向</p>

<h2>letter-spacing</h2>
<p>文字の間隔の調整</p>

<h2>float</h2>
<p>floatを使うと横並びにできる、clear:bothとすればfloatをクリアできる。</p>

<h2>flex</h2>
<p>flexはfloatより自由に要素の位置を指定できる。<br>まず、要素の親にdisplay:flexと指定。</p>
MacVim-KaoriYa から MacVim + vim-kaoriya に移行する

MacVim-KaoriYa から MacVim + vim-kaoriya に移行してみました。

-   [splhack/macvim-kaoriya: MacVim-KaoriYa](https://github.com/splhack/macvim-kaoriya)
-   [MacVim by macvim-dev](https://macvim-dev.github.io/macvim/)
-   [koron/vim-kaoriya: Vim+kaoriya build system](https://github.com/koron/vim-kaoriya)

# 方針

-   MacVim と vim-kaoriya の中身を変更しない。
-   MacVim-KaoriYa 固有の `vimrc` 設定を極力反映する。
-   UTF-8 と CP932 でエンコーディングされたファイルを変換不要にする。
-   macOS 以外でも極力影響のない `vimrc` にする。

# 手順

## MacVim と vim-kaoriya のインストール

```bash
brew install macvim
test -d ~/.vim || mkdir ~/.vim
git clone https://github.com/koron/vim-kaoriya.git ~/.vim/vim-kaoriya
```

必要に応じてご利用のプラグインマネージャーに合わせ、別途  [vim-jp/vimdoc-ja: A project which translate Vim documents into Japanese.](https://github.com/vim-jp/vimdoc-ja) を導入して下さい。

## `vimrc` と `gvimrc` の作成

`~/.vim` に以下のように `vimrc_kaoriya.vim` と `gvimrc_kaoriya.vim` を作成します。

```vim:.vim/vimrc_kaoriya.vim
scriptencoding utf-8 " vim:set ts=8 sts=2 sw=2 tw=0 ff=unix fenc=utf-8:

" Mainly for MacVim without KaoriYa
" !git clone https://github.com/koron/vim-kaoriya.git ~/.vim/vim-kaoriya

if has('kaoriya')
  finish
endif

let s:vimfiles = isdirectory(expand('~/vimfiles'))
      \ ? expand('~/vimfiles') : expand('~/.vim')
let s:kaoriyavimdirectory = s:vimfiles . '/vim-kaoriya/kaoriya/vim'

if !filereadable(s:kaoriyavimdirectory . '/vimrc')
  echomsg 'vim-kaoriya not found.'
  finish
endif

let s:vim = $VIM
let $VIM = s:kaoriyavimdirectory
execute 'silent! source ' . $VIM . '/vimrc'
let $VIM = s:vim
unlet s:vim

" Enforces the character encoding used by Vim internally to UTF-8.
" Because vim-kaoriya/kaoriya/vim/switches/catalog/utf-8.vim
" is not working well.
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,iso-2022-jp-3,euc-jisx0213,euc-jp,cp932

set ambiwidth=double
if has('osxdarwin')
  set printmbfont=r:HiraMinProN-W3,b:HiraMinProN-W6
endif

" Reset &term
if has('unix') && !has('gui_running')
  set term=$TERM
endif

```

```vim:.vim/gvimrc_kaoriya.vim
scriptencoding utf-8 " vim:set ts=8 sts=2 sw=2 tw=0 ff=unix fenc=utf-8:

" Mainly for MacVim without KaoriYa
" !git clone https://github.com/koron/vim-kaoriya.git ~/.vim/vim-kaoriya

if has('kaoriya')
  finish
endif

let s:vimfiles = isdirectory(expand('~/vimfiles'))
      \ ? expand('~/vimfiles') : expand('~/.vim')
let s:kaoriyavimdirectory = s:vimfiles . '/vim-kaoriya/kaoriya/vim'

if !filereadable(s:kaoriyavimdirectory . '/vimrc')
  " echomsg 'vim-kaoriya not found.'
  finish
endif

let s:vim = $VIM
let $VIM = s:kaoriyavimdirectory
execute 'source ' . $VIM . '/gvimrc'
let $VIM = s:vim
unlet s:vim

if has('gui_macvim')
  set guifont=Osaka-Mono:h14
  set noimdisable
endif
```

作った Vim スクリプトを有効にするため、 `~/.vim/vimrc` と `~/.vim/gvimrc` に以下を追加します (先頭近くが良いと思います)。

```vim:vimrc
source <sfile>/vimrc_kaoriya.vim
```

```vim:gvimrc
source <sfile>/gvimrc_kaoriya.vim
```


# 課題

-   ISO-2022-JP でエンコーディングされたファイルは `:e ++enc=iso-2022-jp` のようにエンコーディングの指定が必要。
-    macOS のターミナルで CUI 版を実行したとき一瞬 `E558` のエラーが出る。  
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127827/a4be21c0-ad09-06c7-158b-55eabdbf803c.png)

ほかにもあるかも。
【正規表現】特定の文字列に挟まれる文字列の検知

以前仕事で使ったやつ。
だが、前職で作って手元に記録せずに離職してしまったので、今改めて書いてみた。
もっと壮大な表現を半日くらいかけて作った記憶があるが、今作ったら5分ほどでできてしまった。。あれは何だったんだろうか。

私が作った目的は、URLパラメータのKeyに特定の文字列が完全一致、または部分一致で入っていないかチェックするものでした。
URLパラメータとは「`http://hogehoge.com?test=true&device=sp`」というURLがあった時の「test=true」の部分になります。クエリストリングとも呼ばれます。
そして、URLパラメータのKeyとは=の前部分、上のURLで言えば「test」と「device」がKeyになります。=の後ろはValueです。

つまり、検知したかったのは「"?または&"と"="の間に特定の文字列が含まれていないか」ということです。

# 特定の文字列に挟まれる文字列の完全一致
「hogehoge」のKeyが無いかをチェックする正規表現は以下の通り。

```
(\?|&)hogehoge=
```

いたってシンプルですね。
「?」はメタ文字なので"\"でエスケープしています。

# 特定の文字列に挟まれる文字列の部分一致

```
 (\?|&)(.*?)hogehoge(.*?)=
```

こちらは完全一致の表現に対して検知したい文字の前後に「(.*?)」を入れています。
複数のパラメータが&で連結されることがあるので、hogehogeの前後は任意の文字が0個以上最短一致で入るようにしています。
これが最短一致ではなく最長一致つまり

```
 (\?|&)(.*)hogehoge(.*)=
```

となっていると、
「`http://hogehoge.com?dummy=hogehoge&device=sp`」も一致対象となってしまい、Valueのデータまでチェック対象となってしまいます。
文章中の誤字を発見するwebアプリを作った

文章中の誤字を見つけ出して修正するためのwebアプリを作った。
![スクリーンショット 2020-10-21 21-03-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417037/435e90cf-c7e7-5f4c-9da8-9223afd58b2b.png)



#使ったもの
- Node.js(Express) + React
- [A3RT Proofreading API](http://a3rt.recruit-tech.co.jp/product/proofreadingAPI/)

#気になるところ
- 正しい箇所が修正候補として指摘されてしまう場合がある(特に間違っている箇所の隣の文字)
- ejsの使用について

```node.js:server.js
//これがあれば
app.set("view engine", "ejs");
//こっちはいらない?
var ejs = require("ejs");
```
gh-open not working with wsl2

# 環境
wsl2 Ubuntu 20.04 LTS
wsl2 Ubuntu 18.04 LTS
上記確認済みです

# :o: 解決策
```bash

# pip を使えるようにする
sudo apt-get install python3-pip
pip3 install --user --upgrade pip
echo "export PATH=\"${HOME}/.local/bin:$PATH\"" >>"${HOME}"/.zshrc

# pipでxdg-open-wslをinstall
pip install --user git+https://github.com/cpbotha/xdg-open-wsl.git
```

# 動作確認

```bash

# xdg-openの生存確認 & 動作確認
which xdg-open
xdg-open http://www.google.com
```


# gh-openとは
https://github.com/typester/gh-open
cliからGitHub remote urlを開ける

# 経緯
https://kajirikajiri.hatenablog.com/entry/2020/05/16/124623
【開発ログ⑯】テーブル変更後のHeroku再デプロイ

# 前提について
はじめまして、 プログラミングスクールに通ういりふねと申します。この記事は、スクールの課題である個人アプリの開発の記録を書くことで、自身のアウトプットに利用しています。もし、読んでいただけた方がいましたら、フィードバックをしていただけたら嬉しいです。

開発するのは「有給休暇管理ツール」です。仕様は[過去記事](https://qiita.com/iczo32/items/97ad7d4baa985b3b99ca)をどうぞ。

アプリはデプロイまで行いますが、サービスとして提供するものではありません。あくまでも自学習の一環ですので、ご理解下さい。では本題へどうぞ。

# 今回の実施内容
前回までで有給休暇管理ツールのindex画面にあるリンクボタンには全てリンク先が設定できました。その後記事にはしていませんが、デプロイまで完了し、無事にスクールの発表会が終了しました。今回はデプロイ後にテーブルのカラムを追加し、再デプロイまでの流れを書きます。

- ローカルの編集
- 本番環境でのマイグレーション
- ビューの確認

# 開発環境
前提として開発環境を書くことを最近覚えました。

- Rails 5.2.4.2
- Ruby 2.5.1
- データベース postgreSQL
- デプロイ Heroku

# ローカルでの編集
今回はHolidayテーブルに登録日を表す「registration_date」カラムを追加します。これまで有休の付与や消化のデータを取り出すためにデフォルトの「created_at」を使用していましたが、これを止めます。
理由は、先々の消化予定も入力できるようにしたいためです。このサイトで有給管理をする担当者を想定したときに従業員が有給を取る当日に合わせてデータ入力するのはやっぱり手間なので。

まずは、マイグレーションファイルをロールバックします。

```
$ rails db:rollback
```

マイグレーションファイルを編集します。

```ruby:models/*****_create_holidays.rb
class CreateHolidays < ActiveRecord::Migration[5.2]
  def change
    create_table :holidays do |t|
      t.date :registration_date, null: false
〜中略〜
  end
end
```

再度マイグレーションを行います。

```
$ rails db:migrate
```

この他、モデルファイルに記述していた「created_at」を使用した日付の検索メソッドや有休登録画面に登録日のフォームを設置するなど必要な変更を加えていきます。複数ファイルの修正になるので、今回は割愛します。盲点だったのがコントローラーのストロングパラメーターへの追記忘れでした。created_atからの置き換えばかり意識していたので、すっかり忘れていました。何度か有休データが保存できずに焦りましたが、binding.pryを使用して原因を特定しました。

# Herokuへのマイグレーション
変更したテーブルやビューを本番環境に反映させるためにHerokuから再デプロイをします。初めはHerokuからマニュアルデプロイでいいかなと思って実行しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/0513b1dc-09b4-eb54-5ced-5f3e5d9edf1d.png)

しかしながら、エラーが!!（余談ですがこのエラー画面めっちゃ怖い。）
![picture_pc_f8886f63bd354c264487153ad2c5c567.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/2fe7af0f-a0c3-b11a-1c42-3af868fa7566.png)

恐らく、テーブルに登録日カラムが反映されていないので、先程修正したビューファイルや日付検索メソッドたちがエラーとなっているのでしょう。
そこで、次はローカル環境と同じようにロールバックとマイグレーションを実行してみました。

```
$ heroku run rails db:rollback
```

結果の画面は以下のとおりです。少し見えにくいですが、「DROP TABLE "Holidays"」の記述があるので、どうやらロールバックは成功したようです。
<img width="1422" alt="スクリーンショット 2020-05-24 9.40.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/aadf8f80-3708-d6be-f979-db0db2de5cb4.png">

続けて、同じ要領でマイグレーションも実行してみます。

```
$ heroku run rails db:migrate
```

こちらも結果は写真のとおりです。同じく見えにくいですが、「create_table(:holidays)」という記述と登録日カラムの「registration_date」が追加されていることが確認できました。
<img width="1003" alt="スクリーンショット 2020-05-24 9.41.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/7774a60e-fb93-9c45-6ddb-91d1169ce733.png">

# ビューの確認
本番環境でビューを確認します。新しいフォームの「登録日」が追加されていることが確認できます。フォームを追加したせいでビューが乱れています(泣)。今後ビューも手直しを入れる予定なので、その際に再度整えていきたいと思います。
<img width="626" alt="スクリーンショット 2020-05-24 20.01.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/fed9ab24-f162-67cb-2a6c-2a226259f2c0.png">

次に登録後の消化履歴の画面です。こちらも問題なく表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/710f5d93-a1e3-0acc-f87a-3c277520afbd.png)

# 今日の積み上げ
難航するかと思っていたテーブルのカラム追加ですが、思いの外、スムーズに終わりました。ただ、ロールバックを行うと本番環境であれ、レコードをは全てなくなったので、これが実際に提供されているサービスだと思うとゾッとします。
やはり、機能の洗い出しやデータベース設計は、めちゃくちゃ大切だということがわかりました。
Laravel newしたら「dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.61.dylib」エラーが出るときの解決法

```bash

laravel new アプリ名
```

とすると、

```bash

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.61.dylib
  Referenced from: /usr/local/bin/php
  Reason: image not found
Abort trap: 6
```

とエラーが表示されました。

homebrewのバージョンが原因のようです。

```bash
brew update && brew upgrade
```

するとエラーになりました。権限なないことが原因のようです。

```bash
Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
```

下記のコマンドで権限を付与します。

```bash
sudo chown -R  /usr/local
```

```bash
usage: chown [-fhnv] [-R [-H | -L | -P]] owner[:group] file ...
       chown [-fhnv] [-R [-H | -L | -P]] :group file ...
```

再度homebrewのバージョンアップします。

```bash
brew update && brew upgrade
```

今度は成功しました。

そして、

homebrewをバージョンアップしたので、Laravelアプリを作成します。

```bash
laravel new アプリ名
```

```bash
Package manifest generated successfully.
Application ready! Build something amazing.
```

今度は成功しました😊
Command Line 基礎編 

#プログラミング勉強日記
　2020年5月24日

#####コマンドラインとは
　普段クリックなどでコンピュータ操作をするのに対して、文字だけでコンピュータ操作するためのもの。ターミナルにコマンド（命令）を入力することでコンピュータに指示できる。実行はEnterキーで行う。

| |   コマンド  |実行例|その他(注意事項)
|:------------:|:------------:|:------------:|:------------:|
|ファイルの作成| touch|touch␣ファイル名||
|ファイルの中身を表示|cat|cat␣ファイル名|存在しないファイル名を指定するとエラーになり、コマンドは無効になる|
|ディレクトリの作成|mkdir|mkdir␣ディレクトリ名||
|ディレクトリの移動|cd|cd␣ディレクトリ名|指定できるのはディレクトリのみ（ファイル名は指定できない）|
|カレントディレクトリの確認|pwd|||
|ディレクトリの中身を表示する|ls||表示されるのは1つの階層のみ|
|1つ親のディレクトリの移動|cd ..||「cd 1つ親のディレクトリ名」では移動できない|
|ホームディレクトリの移動|cdのみ||ユーザーが作業するときに起点にするディレクトリをホームディレクトリという|
|ファイルの移動|mv|mv␣移動させたいファイル名␣移動先のディレクトリ名||
|ディレクトリごとの移動|mv|mv␣移動させたいディレクトリの名前␣移動先のディレクトリ名||
|ファイル名の変更|mv|mv␣現在のファイル名␣新しいファイル名||
|ファイルのコピー|cp|cp␣コピーするファイル名␣新しいファイル名||
|ディレクトリのコピー|cp -r|cp␣-r␣コピーするディレクトリ名␣新しいディレクトリ名|-rをつけないとエラーが出て実行できない|
|ファイルの削除|rm|rm␣ファイル名||
|ディレクトリの削除|rm -r|rm␣-r␣ディレクトリ||
【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味？

## 【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味？

ライブラリのコードを読んでいると`_ struct{}`というフィールドが定義してある構造体をみかけることがありますが、これはどういう意味なのか？というお話です。

結論としては、これは構造体を初期化する際に、フィールド名の指定を強制する意図で宣言されています。



### blank identifierを用いた構造体の定義とComposite literalsによる構造体の初期化

```go
type SomeType struct {
    Field1 string
    Field2 bool
    _      struct{}
}
```


`_`はblank identifierと呼ばれるものです。
これは、`dev/null`に似ていて、blank identifierに割当てられた値や宣言は、無害な方法で、~~虚無のブラックホールへと~~捨て去られます。（`_`がブラックホールの穴に見えてくる…）

ここでは詳しく説明しませんが、[Effective Go](https://golang.org/doc/effective_go.html#blank)に詳しい使用用途などが紹介されています。



また、[Composite literals](https://golang.org/ref/spec#Composite_literals)で構造体を初期化した場合以下の２つの方法があります。

* フィールド名を指定して初期化する
* フィールド名を省略して初期化する


```go
// フィールド名を指定して初期化:
_ = SomeType{Field1: "hello", Field2: true}

// フィールド名を省略して初期化:
_ = SomeType{"hello", true} // too few values in SomeType literal

```


#### フィールド名を指定した場合
フィールド名を指定した場合、指定をしなかったフィールドは、ゼロ値になります。
また、フィールドの順序が入れ替わったり、フィールドが追加されても正しく動作します。

#### フィールド名を省略した場合
フィールド名を省略した場合、構造体の宣言と同じ順序ですべてのフィールドを宣言して初期化する必要があります。

この場合、フィールド名を省略すると、`_ struct{}`に対する初期化を行っていないので、すべてのフィールドを初期化できず、コンパイルエラーになります。

なので結果として、構造体の初期化の際にフィールド名の指定を強制することができるのですね。



## パッケージ外からの初期化
また、以下のように同じパッケージ内で`struct{}{}`で初期化した場合は、コンパイルエラーは発生せず、初期化できてしまいます。（`struct{}{}`で初期化するのは少々、無理矢理感がありますが…）

```go
SomeType{"hello", true, struct{}{}}
```


しかしながら、外部のパッケージから構造体を初期化しようとした場合、エラーになります。これは、非公開のフィールドは外部パッケージから初期化できないためです。

```go
// implicit assignment of unexported field '_' in hoge.SomeType literal
_ = hoge.SomeType{"hello", true, struct{}{}}
```

## 所感
`_ struct{}` という宣言を初めて見たときは、一見なんのこっちゃ感があるので、この手法はメリットとデメリットの両方がありそうだなと個人的には感じました。
意図しない動作を防ぐことができるため、ライブラリを作成したりする場合は特に使う場面があるのかもしれないですね。

このようなテクニックを使用しない場合でも、明示的でわかりやすく、予期しない動作をしないよう、構造体の初期化時にはフィールド名は指定していきたいおきもちです。
Mutagen触ってみた

# ことの発端

Docker On Mac遅い。
DockerSyncは不安定らしく（未チェック）使う気があまり起きない。
悩んだ末以下の記事に到達。

[DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる](
https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484)

この記事ではHostとVirtualBox間のファイル同期にmutagenというツールを使っている。
めちゃくちゃマイナーなツールで情報が少ないので触ってみた。

# 公式を読む

> Mutagen is a development utility that lets you use your existing local tools (such as your text editor/IDE, browser, and terminal) to work in remote environments like cloud servers and containers. It does this by providing high-performance file synchronization and flexible network forwarding, allowing you to develop applications in a way that looks local but runs on remote hardware. Mutagen is completely free and open-source and works directly between your local system and the remote infrastructure that you need to access.

> Unlike most other remote development solutions, Mutagen isn’t a plug-in or a wrapper, so it works with essentially any tool. It also doesn’t require users to manually install it on remote endpoints or expose ports. Instead, Mutagen uses copy mechanisms like scp and docker cp to inject small “agent” binaries into remote environments and then communicates with those binaries over a transport like ssh or docker exec. For maximum flexibility, it also offers a peer-to-peer transport that will work with almost any remote infrastructure, including Kubernetes® clusters.

要するに2点間のファイル同期をしてローカルでリモート環境を編集しようという試みっぽい。
中身はscpやdocker cpらしい。

# 使ってみる

今回はvagrantで仮想環境を立てて、仮想環境とファイル同期をしてみる。

まずは仮想環境を建てる。Vagrantfileなどは割愛。

```
$ vagrant up
```

mutagenのsessionを作成する

```
$ mutagen sync create ./ <remote-host>:/home/vagrant/app
```

sessionができてるか確認。

このように表示されます。

```
$ mutagen list
--------------------------------------------------------------------------------
Identifier: sync_<省略>
Labels: None
Alpha:
        URL: <local-hostのディレクトリ>
        Connection state: Connected
Beta:
        URL: <remote-host>:/home/vagrant/app/
        Connection state: Connected
Status: Scanning files
--------------------------------------------------------------------------------
```

ローカル環境でファイルを作成してみる

```
(local)$ touch hoge
```

virtualbox内でファイルを確認してみる

```
(remote)$ ls
hoge
```

できた！

# その後
vagrant-mutagenプラグインを入れるとセッションの管理をvagrant up、vagrant halt時に合わせて自動的に生成削除してくれる。
https://github.com/dasginganinja/vagrant-mutagen
C#  勉強(1) class


商品クラスの利用

クラス；

```c#
    public class Product {
        //プロパティ（set は非公開）
        public int Code {get;private set;}
        public string Name{get;private set;}
        public int Price{get;private set;}

        //コンストラクタ(特殊メソッド)
        public Product(int code,string name,int price){
            this.Code=code;
            this.Name=name;
            this.Price=price;
        }
        //税金メソッド
        public int GetTax(){
            return (int)(Price * 0.08);
        }
        public int GetPriceIncludingTax(){
            return Price + GetTax();
        }
    }
```

プログラム；

```c#

    class Program
    {
        static void Main(string[] args)
        {
            Product choco = new Product(123,"チョコチップ",110);
            Product boltgum = new Product(234,"ボトルガム",500);

            int chocoTax = choco.GetTax();
            int boltgumTax = boltgum.GetTax();

            Console.WriteLine("{0},{1},{2}",choco.Name,choco.Price,chocoTax);
            Console.WriteLine("{0},{1},{2}",boltgum.Name,boltgum.Price,boltgumTax);

        }
    }
```
今日のことりん: try-with-resources

Javaのtry-with-resourcesをご存知でしょうか。

```Java
try(InputStream inputStream = new FileInputStream("test")){
    // 処理
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
```

こんな感じでAutoClosableやClosableを実装しているクラスをtryの()で宣言すると自動的にclose()を呼び出してくれるような書き方のことです。


## Kotlinではどうするか
実はKotlinではこの構文は使えません。書こうとするとコンパイルエラーになってしまいます。
そこでKotlinにはClosableには拡張関数 useが用意されていて、以下のように書くことができます。

```kotlin
try {
    FileInputStream("test").use {
        // 処理
    }
} catch (e: FileNotFoundException){
    e.printStackTrace()
} catch (e: IOException){
    e.printStackTrace()
}
```


## なぜできるか？
useの中身をみてみるときちんとcloseされていることがわかります。
`AutoClosable.kt`や`Closable.kt`で実装されています。

https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jdk7/src/kotlin/AutoCloseable.kt
MQL5-テンプレEAの作り方 1

# はじめに
この記事は以下リンクのYoutubeビデオを翻訳した内容になります。
https://www.youtube.com/watch?v=9GVduCy1CgQ&list=PLV8YK-9p3TcOmgAFIjntw-GxOJoHp9xwc&index=2
よかったらそちらも見てください。

## メタエディターの起動の仕方
MQL5を動かすにはメタエディターを起動する必要がある。
起動するには
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/e87517f8-2472-7273-e065-054dbe9e0d24.png)
このアイコンをクリックしよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/bc5a5f4e-50cf-141f-881b-70a2befabe0d.png)
左上のこの辺にあるはず。
もしくはMT5が動いている時点で[F4]を押しても起動する。

##まずはファイルを新規作成
インディケータを作るにしろ、エキスパートアドバイザーを作るにしろ、まずはMQL5コードを書くためのファイルを作る必要がある、

右上のツールバーから[ファイル]>[新規作成]をおしてM!Lウィザードを立ち上げてから、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/887c69d4-f23e-44a6-6362-5a360eb90007.png)
エキスパートアドバイザ（テンプレート）
を押す。そしたらこのコードについての内容を記入する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/b9888188-8869-dbae-6da4-456176017634.png)
とりあえずここでは”SimpleEA”という名前にしておく。名前を変更する際に、"Expert¥"は消さないようにしよう。著作者はこのコードの製作者、リンクはあなたがWebサイトを持っていたらここに載せよう、パラメータ欄はとりあえず空白で。

あとは[次へ][次へ][完了]と押す。途中現れるチェックボックスはすべて無視する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/8bc7d71f-c444-cd06-3fa3-f6e860e73041.png)
これでテンプレートに乗っかった超単純なエキスパートアドバイザの完成である。こいつのままでもコンパイルはできるし、何もしないけどEAとして起動させることもできる。

###  次回
基本関数とHello world！
https://qiita.com/James_KW/items/2ae64601a1ec88e4eec6
入力革命  ～ 通信革命に続く変革。米国の音声SNSはその予兆？

# 米国で話題の音声SNS ～ 入力革命の予兆

　アメリカでは、音声版Twitter「Clubhouse」の評価額が話題になっている。

　▶　[米国スタートアップ界で話題の次世代SNS「Clubhouse」になぜ100億円以上も時価総額がつくのか？](https://jp.techcrunch.com/2020/05/17/clubhouse/)

　このSNSがどうなるかはさておき、音声や画像認識がこれから一般化されてくるのではないかと多くの人が感じているように思う。Alexa、Google Homeを触った人ならなおさら、そう感じているかもしれない。

# 端末、ソフトウェアの進化、人材の増加

 インターネットの普及により通信革命がなされ、新しいビジネス、生活スタイルが生まれた。
　そして、今、端末の処理性能の高速化、通信をベースとした処理性能の補完がなされている。量子コンピューターも処理性能の高速化に寄与していっていくだろう。
　
　また、処理性能の高速化と相まって、様々な機械学習などのソフトウェア、そして、エンジニアも増えている。こうしたソフトウェア、人材の増加がこれまでと違ったソフトウェアの入力を生み出している。

# 既存の入力方法を変える、画像認識・音声認識

　既存の、マウスやキーボード、タッチパネルだけでなく、画像認識・音声認識がその筆頭だろう。
　少し前はまだまだ精度が低いとされていたが、今は、前述の技術的な基盤の変革により、かなり高精度な物となっている。
　それに加え、GCPなどを利用してSaaSとして、比較的低額で手軽に、こうした機能を利用できるようになっている。
　また、OSSにおいても画像認識ならOpenCV、音声認識ならJuliusと誰もが手軽にこれらの新しい入力を実現する機能を触れるようになった。

　AndroidやiPhone、スマートスピーカーを使ったことがあれば、音声認識の精度の高さを実感する。また、顔認証や画像検索、OCRなどを利用すると、以前の認識を覆すほどになっている。

# 従来のアプリケーション、Webシステムの入力革命

　前述の背景をもとに、これから既存のアプリ、また、Webサイトにおいて、キーボードやマウス、タッチとは違う入力方法が採用されてくる。
　
　いわば、「入力革命」が起こってくるのだろうと思う。

　まだ、ソフトウェアもWebサイトもこうした入力革命を表しているものは少ないが、官公庁や大企業サイトやアプリを初め採用されてくるのではないだろうか。

　特に、官公庁のサイトは、情報が有りすぎて、高齢者をはじめ使い勝手が悪いと思っている人は多いはずである。
　役所にいって受付で行き先を尋ねるように、Webサイト上で、キャラクターが音声で案内にしてくれ、音声ガイダンスに従って言葉で目的の情報まで表示してくれるサイトができるかもしれない。

　選択肢が少ないサイトやアプリは入力革命とは無縁かもしれないが、上記のような選択肢が多いアプリやサイトでは、入力革命をベースとした操作方法の変革が採用されていくように感じる。

# 通信革命から入力革命へ

　2000年初頭から2020年までは、インターネット、そして、それを携帯して使えるスマホまで通信革命が世の中を変革してきた。
　そして、これからは画像認識、音声認識、そしてそれを支える機械学習やビッグデータ解析、SaaSによって、入力革命がなされていくのだろう。

　コロナショックによって、ZoomやTeamsなどPCをつかった、カメラやマイクの利用が徐々に一般化している。これは音声や画像を利用した入力の後押しになるのではないだろうか。

　既存アプリやWebシステムの入力革命がこれからおこっていくだろうと思う。
　また、それに伴って、音声マーケットなども増加していくかもしれない。
XGBoostの論文を読んだ記録

## はじめに
[XGBoost: A Scalable Tree Boosting System](chrome-extension://ohfgljdgelakfkefopgklcohadegdpjf/https://www.kdd.org/kdd2016/papers/files/rfp0697-chenAemb.pdf)
を読んだので、分かったことをメモしておきます。機械学習の勉強を始めてまだ2ヶ月くらいなので理解不足な点が多々あると思います。間違いや見当違いな点がありましたらぜひぜひご指摘いただきたいです。

## XGBoostとは何か
Gradient Boosting Decision Tree(勾配ブースティング決定木、GBDT)を利用した分類/回帰手法の一つです。単一のアルゴリズムというより、XGBoostというオープンソースのモジュールが利用している手法群の総称とイメージした方が分かりやすいと思います。  

論文は以下の構成になっています
- Abstract
- 1.Introduction
- 2.Tree Boosting in a nutshell 決定木のブースティング全般について
- 3.Split Finding Algorithms 木が学習する際にどこで分割(split)するかの探し方　XGBoostの推しポイントの1つです
- 4. System Design XGBoostがGBDTの各段階でどう動くのかが書いてあります
- 5.Related Works
- 6.End to end evaluations

ここでは2〜4について書きます

## 2.1 正則化つきの目的関数
アンサンブル学習
$$\hat{y_i}=\phi(x_i)=\sum_{k=1}^kf_k(x_i) f_k\in F$$
目的関数
$$L(\phi)=\sum_il(\hat{y_i},y_i)+\sum_k\Omega(f_k)$$
$$where \Omega(f)=\sqrt{T}+\frac{1}{2}\lambda||w||^2$$

アンサンブル学習の式は「たくさんの予測を足し合わせると全体の予測になる」という意味です。
目的関数の式はlっていう予測の間違いを表す項と、Ωっていうモデルの複雑さへの罰を表す項を足し合わせたものを表しています。これが一番小さくなるようにl（具体的には葉につける重みw）を選んでいきます。

また正則化項のΩはこれじゃなきゃダメってわけじゃないですが(実際にXGBoostの実装時にl1正則化を指定したりもできる)これだと割とうまくいくらしいです。

## 2.2 勾配ブースティング決定木

決定木のアルゴリズムの中心にあるのは木の構造を決め方です。「どの特徴量について」「どの境界値で分割するか」が鍵になります。
それを決めるために、決定木では「もしこの特徴量、この値で分割したとしたら目的関数はいくつになるのか」を計算し、目的関数を一番小さくできるような場所で分割を行います。

その計算は以下のように行われます
1. 目的関数を最小化する際に、lがMSEみたいな簡単な関数なら計算できるけど、より複雑な場合は直接計算しにくい。
2. だからLはテイラー展開して2次の項まで残す。そうすると1次と2次の導関数だけ分かればlが複雑な関数でも計算できる。
3. するとそれぞれの葉の最適な重みwは1次と２次の導関数、それと正則化のためのハイパーパラメータのλだけの簡単な計算で求まる
4. 葉の重みが分かれば、その木全体の目的関数も計算できる。そして木同士の値を比較することで分割場所を決められる。

分割を決めるために、毎度毎度「勾配を出して、目的関数の値を出して、比べて」というのをたくさんの点で行うのは大変そうです。

## 3 分割値を決めるアルゴリズム

この分割の大変さを軽減するために、XGBoostではヒストグラムを使って特徴量の値をグループ分けし、分割を試す回数を少なくしています。これは論文ではapproximate algorithmと呼ばれています。どこでグループ分けをするかは特徴量の中でのパーセンタイルで決めるのが一般的だそうです。

それに対しsklearnやRのgbmではexact greedy algorithm(全部の場所で分割を試みる)を使っているため、より正確にはなるもののだいぶ処理が遅くなってしまうらしいです。

またそれに加えXGBoostはグループ分けする際に工夫することで、sparseな(ほとんど0な)データにもうまく対応できると書かれていました。

## 4 System　Design
XGBoostが使っている工夫がいろいろ述べられています。箇条書きで述べます。
-　ブロックわけを行うことで訓練で一番時間がかかる特徴量のソートを効率的に行えます。exact algorithmでは1つの、approximate algorithmでは複数のブロックを使うそうです。またこれにより並列処理ができるようになるらしいです。
-　勾配を持ってくる際に、exact algorithmの場合にはcache(コンピュータがデータを保存できる場所)を意識したアルゴリズムを使います。approximate algorithmの場合には適切なブロックサイズを決めておきます。これによって計算が速く行えます。
-　Block Compression(圧縮)やBlock Sharding(分割)を行い、付加的な作業も効率的にできます。
このようにXGBoostには計算を効率的に行うための工夫がたくさんされています。

## まとめ
こういった工夫により、XGBoostのフレームワークを使えばsklearnで普通にGBDTを行うよりより良い結果を出すことができます。今のKaggleではLightGBMが流行っていますが少し前はXGBoostが一強だったようです。
Rails6 開発環境構築 [Mac]

#はじめに
Macを使用しRails6の開発環境構築時に行った手順の備考録です。

#手順
###1.Homebrewのインストール
**ソフトウェアのインストールやアンインストールを管理してくれるシステム**
https://brew.sh/index_ja
<img width="895" alt="スクリーンショット 2020-05-24 15.52.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643155/89c70cef-5045-2ca4-6053-907f91c791b4.png">
Install Homebrew下部のコマンドをコピーしターミナルで実行

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

passwordを求められるので、Mac起動時のpasswordを入力

続いて、Homebrewのパスを通す為、下記コマンド入力し実行

```
$ echo ‘export PATH=/usr/local/bin:$PATH’ >> .bash_profile source .bash_profile

```
最後に、確認の為下記コマンド実行

```
$ brew ­-v
```
`Homebrew ○.○.○`
のようにバージョン表示がされれば完了

###2.rbenvのインストール
**Rubyのバージョン管理を切り替えるツール**
Homebrewを使用しインストール

```

#初期設定
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

#初期設定を反映
$ source ~/.bash_profile

#rbenvのインストール
$ brew install rbenv ruby-build

#Rubyのバージョン一覧表示
$ rbenv install -l
2.5.8
2.6.6
2.7.1
...

#指定したRubyのバージョンをインストール
$ rbenv install ２.７.１


#新しいRubyやgemをインストールしたときに実行、使用可能な状態にする
$ rbenv rehash
```

使用するRubyのバージョン設定

```
$ rbenv global 2.7.1
```

###3.Bundlerのインストール

**gemの依存関係とバージョンを管理するためのツール**

```
$ gem install bundler
```
###4.Railsのインストールする

```
$ gem install rails
```
###５．yarnのインストール
webpackerのインストールの為に必要

```
brew install yarn
```

###６.webpackerのインストール
Rails6からwebpackerが標準仕様になった為、yarnのインストールが必要

```
$ rails webpacker:install
```

###７.動作確認

```
# Railsプロジェクトを作成
$ rails new sample

# Railsプロジェクトに移動
$ cd sample

# Railsプロジェクトを起動
$ rails server
```

http://localhost:3000/
Railsのページが表示できていたら完了
FlutterのImageウィジェットで表示できる画像の種類

FlutterのImageウィジェットがサポートしている画像種類について調べました。

画像の表示の参考は以下。
[Flutterで画像を表示する方法【まとめ】](https://qiita.com/yu124choco/items/a2710ec004d3425a2a0b)

# 結論

`dart:ui`の関数`instantiateImageCodec`がサポートしているものになりそう。
[instantiateImageCodec function](https://api.flutter.dev/flutter/dart-ui/instantiateImageCodec.html)
現時点(2020/05/24)でサポートしていると記載されているのは以下。

- JPEG
- PNG
- GIF
- アニメーションGIF
- WebP
- アニメーションWebP
- BMP
- WBMP

また、Imageウィジェットでは縦または横のサイズだけを指定するとアスペクト比を保って拡大・縮小されますが、その仕様も`instantiateImageCodec`の説明に記載がありました。

# 試してみた

利用しているFlutterのバージョンは現時点最新のv1.17.1。
Windows10+Android9の実機デバッグで試します。

Windows標準のペイントで簡単につくれるJPEG系、PNG、GIF、BMPを表示してみました。
(今回はassetsに配置した画像ファイルを表示します)
また、ついでに表示に失敗したケースとして存在しないファイルを指定します。

まず、Imageウィジェット表示用クラスのソース。

```dart
class TestImage extends StatelessWidget {
  final String name;

  TestImage(this.name);

  @override
  Widget build(BuildContext context) {
    return Image.asset(
      name,
      errorBuilder: (BuildContext context, Object error, StackTrace stackTrace) {
        return Text(error.toString());
      },
    );
  }
}
```

`MaterialApp`の`home`プロパティに指定するWidgetのソース。

```dart
class ImageTest extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Column(
        children: <Widget>[
          TestImage('assets/imgs/jpg.jpg'),
          TestImage('assets/imgs/jpeg.jpeg'),
          TestImage('assets/imgs/jpe.jpe'),
          TestImage('assets/imgs/png.png'),
          TestImage('assets/imgs/gif.gif'),
          TestImage('assets/imgs/bmp.bmp'),
          TestImage('assets/imgs/nothing.png'),
        ],
      ),
    );
  }
}
```

結果

![Screenshot_20200524-185056.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642815/83dce01d-5906-f2c1-e7b9-35ef562f9108.jpeg)

# はまったこと

1. assets/imgsに置いたので、`pubspec.yaml`に`assets/imgs/`で指定する必要があった。
2. デバッグモードで例外がブレークポイントとなって`errorBuilder`実行前に止まった(デバッガが例外で実行を止めないようにした)

# まとめ

問題なく画像が出ました。

# その他

WebブラウザのimgタグではSVGもいけますが、Flutterではプラグインが必要そう。
【UE4】アニメーションBPの共有(1)

<h2>同じスケルトンを持つキャラクター</h2>
UE4で無料で使えるキャラクターで有名なのはマーケットプレイスで提供されている<b>Paragon</b>と、<b>Mixamo</b>
https://www.mixamo.com/#/
の2つだと思います。今回はMixamoのキャラクターを使います。
Mixamoにはたくさんのキャラクターが用意されていますが、
中にはMaria JJ Ong とMaria W/Prop JJのように、同じキャラクターが
武器を装備しただけというものもあります。
剣を装備したMaria W/Prop JJには剣のアニメーションが独自に用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/4fa4620b-e1df-4c0d-86c7-ff331ca97f77.png)

これをUE4にインポートして、リターゲットして使う場合、別のスケルトンとなります。
当然アニメーションも別々に作られ、アニメーションBPもそれぞれ用意することになります。もちろん、それでもいいのですが、元が同じキャラクターであれば、同じ動きも多いかと思います。ですが、別のスケルトンであるために、アニメーションBPも別々に作るはいささか無駄な気もします。しかし、ほとんど同じ動きと言っても、剣を使う動きは剣がないとおかしなことになります。なので、アニメーションBPは別々にするのは仕方ない・・・というのを、実は共有でできるというのが、今回のお話です。
<h3>違いはソケットの有無だけ</h3>
まず、Maria JJ Ong とMaria W/Prop JJをインポートしてMixamo Animation Retargetingで
リターゲットしてしまいます。その後、スケルトンを確認してみると・・・
![skeleton.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/c16974e7-aff9-65d9-1568-13ae6cc4a695.png)
Maria W/Prop JJにsword_jointというソケットがある以外、残りはすべて同じです。こういうものは
スケルトン、アニメーションも共有できます。まず手順を書きます。
<h4>2つのキャラクターをインポートする</h4>
Maria JJ Ong とMaria W/Prop JJをMixamoからダウンロードしてインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/954f2d3d-246f-e679-575b-fe04c9fdd434.png)
特に何も変更せず、全てインポートでインポートします。
<h4>アニメーションのインポート</h4>
次に使うアニメーションをインポートします。
なお、インポートするときのスケルトンはすべてMaria W/Prop JJにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/998d3842-1529-59e3-2b03-af8d0e52225b.png)
今回はIdle,Great sword Idle,Great sword slash1,Punching,Running,Walkingをインポートしました。Idleと攻撃のときは違う動きをさせ、歩く、走るは同じにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/d4e488ce-e4e5-5731-d130-bfa8b102e60d.png)
<h4>割り当てるスケルトンを変更する</h4>
Maria JJ Ongのスケルタルメッシュを選択して、スケルトンを変更します。
スケルタルメッシュを右クリックして、「スケルトン」「スケルトンを割り当てる」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/ebc1aa2f-af99-2ca8-5be3-d14015a1535c.png)
Maria W/Prop JJをMixamoのスケルトンを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/8d0ea708-52d4-ebba-acf7-4a79937f14cd.png)
Maria JJ Ongのスケルトンを削除します。リファレンスもないので強制削除にはなりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/a02969d2-cd52-8fef-4c0d-1defe81a2a40.png)
このようになれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/be7a13c4-6fbf-5475-7645-e9471d37573b.png)
<h4>ブループリントとアニメーションBPを作る</h4>
キャラクターのブループリントとアニメーションBPを作ります。ブループリントはサードパーソンBPを複製しても構いません。ブループリントはMaria JJ Ong とMaria W/Prop JJの2つ、アニメーションBPはMaria W/Prop JJのスケルトンで1つ作ります。
ブループリントのアニメーションは、今作ったアニメーションBPを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/815f2353-537e-2a62-9223-5f59eaa00feb.png)
レベルにいるグレイマンを削除して、プロジェクト設定でdefault pawn をMaria JJ Ongのブループリントにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/46ffa70d-e7b0-8934-df79-5688cc3994f1.png)
ゲームをプレイすると、動かないMaria JJ Ongが現れれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/d8a80949-444f-fc1b-bd3e-ee4d43a5c720.png)

長くなったので複数回に分けます。