OmniAICreator/Qiita-1.07M huggingface dataset:
HTML5ゲームエンジンの徹底評価[日本語訳] (2) Three.jsとPixi.js

こちらの記事「[HTML5ゲームエンジンの徹底評価 日本語訳 (1) 2D・3D対応とプログラミング言語の比較](https://qiita.com/motoyasu-yamada/items/f4e03f98442b3ec164be)」の続き

# 設計思想と機能
設計思想と、どのような機能提供がされるべきかが、重要です。オープンソースエンジンの設計は、主に開発者のワークフローへの考え方と製品コンセプトより決まります。個々の機能を議論するよりも、設計思想と機能をセットで議論するほうがより有意義です。どのようなエンジンも必要なすべての機能を提供することはありません。エンジンのコンセプトに応じて提供される機能は決まります。特にいくつかのエンジンではこの傾向が顕著です。各エンジンをひとつづつ分析してきます。

# Three.jsのコンセプト
Three.jsプロジェクトはは2010年4月24日にはじまりました。だいぶ歴史のあるオープンソースプロジェクトです。厳密にはThree.jsはゲームエンジンではありません。 開発者はGitHubでは"JavaScript 3D ライブラリー"とThree.jsのコンセプトを明確に定義しています。JavaScript言語で書かれた3Dライブラリです。ゲームやクールな3D映像などを作るために使うことができます。

## 設計思想
設計という点では、開発者は簡単にHTML5ベースの3Dコンテンツを作成するのに役立つ非常に軽量な3Dライブラリを目指しています。つまり、シンプルなAPIにより、3Dコンテンツの開発の複雑さが最小限に抑えられています。Three.jsはWebGLとCCS3Dのレンダリングモードの両方をサポートしています。データを分析すると、開発者はWebGLレンダリングを使うことが多いようです。

## 機能
この記事で花、2Dゲームエンジンについて徹底分析をしたいと考えております。Three.jsと他の一般的な3Dエンジンを機能面では比較しません。

# Pixi.js コンセプト
Pixi.jsの公式サイトをみたら、Pixi.jsのことはゲームエンジンだと勘違いします。しかし開発者はホームページ上では、Pixi.jsを "Canvasフォールバック型のWebGLレンダラー"と定義しています。Canvasに依存したWebGLレンダラーということです。 驚くことにPixi.jsは単なるレンダラーにもかかわらず、たくさんの機能を提供しています。

## デザインコンセプト

Pixi.jsがもっとも大事にしていることは、レンダリングパフォーマンスです。2Dレンダリングアーキテクチャは非常に成熟しているAdobe Flashを参考に、APIはActionScriptを参考にしており、Pixi.jsは使うのは簡単です。

たとえば、Pixi.jsでは、PIXI.Spriteとしてカプセル化されたDisplyObjectを作成します。画像を表示する場合は、テクスチャ(PIXI.Texture)を使用して描画します。最後にDisplayObjectの座標を設定します。コードは次のようになります。

```javascript
var stage = new PIXI.Container();
var texture = PIXI.Texture.fromImage('bunny.jpg');
var bunny = new PIXI.Sprite(texture);
bunny.position.x = 80;
bunny.position.y = 60;
stage.addChild(bunny);
```

Pixi.jsの表示アーキテクチャは、Flashデザインを完全に参照しています。すべての表示オブジェクトはツリーデータ構造に結合されていますが、WebGLレンダリング用に内部構造が最適化されています。

## 機能
ゲームエンジンの機能を細かく分類することはできますが、すべての分類について詳しくは説明しません。 簡単に比較できるように、二階層で機能を分類しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/6e723e89-94cb-acc9-379f-cad824d28cbd.png)
Vagrant was unable to mount VirtualBox shared folders.でvagrantでフォルダがマウント出来ない

vagrant起動時に、こんな感じのエラーが出た場合の対処方法。

稀に自分の環境ではこれが発生するが、稀なので対応方法を忘れて調べるのに時間がかかるのでメモ。

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

## 対処方法

vagrant上で```sudo yum install -y kernel kernel-devel gcc```を実行
vagrantから抜けて```vagrant reload```を実行

### その他の方法

以下の方法でも解決出来ると聞いたが、こちらは未確認。
次回再発したら試してみたい。

```vagrant provision```
行列積のTraceを高速に計算する

# 問題点
機械学習アルゴリズムを実装する際に、2つの行列$A, B \in \mathbb{R}^{n \times m}$の積のTrace$\mathrm{Tr}(A \cdot B^T)$を計算するシーンがよくあるが、定義通り[numpyのtrace](https://docs.scipy.org/doc/numpy/reference/generated/numpy.trace.html)を使うと非常に遅くて困る。

# 結論
SparseMatrixを使わないなら

```python
np.einsum('ij,ij->', A, B)
```

がぶっちぎりで速く、SparseMatrixにも対応したいなら

```python
np.sum(A * B)
```

がわりかし速い！

# 手法紹介
主に4パターンの計算方法がある(他にもあったらコメントください)。

## A. 定義通り

```python
np.trace(A @ B.T)
```

## B. 要素積の総和

```python
np.sum(A * B)
```

## C. 秘められし関数`inner1d`で計算

```python
from numpy.core.umath_tests import inner1d

np.sum(inner1d(A, B))
```

ただし、この`inner1d`はnumpyの内部で使われている関数なので推奨されていないようです(参照3)。

## D. B.をアインシュタインの縮約記法で書ける[`einsum`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.einsum.html)で書く

```python
np.einsum('ij,ij->', A, B)
```

アインシュタインの縮約記法を知らない方は参考の1.を参照してください。とても詳しくまとめてあります。ただし、この書き方はnumpy arrayのみでscipyのSparseMatrixには実装されていないです。ただ、実装する動きはあるようです(参照4)。

# 実験
## 環境
- Python 3.6.6 :: Anaconda custom (64-bit)
- numpy: 1.15.3

## 結果
ちゃんと同じ結果になるかを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/234668/77134ce5-e173-bd0a-5d2d-f4a73b38188d.png)

速度を[`%timeit`](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-timeit)で計測し比較。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/234668/29dc5e40-c699-c836-bcc9-3a990073ec27.png)

Dが圧勝！定義通り計算するより10倍くらい速い！！ただ、上述したとおり`einsum`はSparseMatrixでは使えないので、疎行列を扱う際にはBを使うのが良いという結論になりました。Bも定義通り計算するよりも6倍くらい速く、申し分ない結果になりました。

# 余談
行列の転置マーク$T$を右肩に書く派と左肩に書く派で流派が分かれていて論文読んでて混乱する。するよね？

# 参考
1. [【einsum】アインシュタインの縮約記法のように使えるnumpyの関数。性能と使い方を解説。](http://www.procrasist.com/entry/einsum)
2. [What is the best way to compute the trace of a matrix product in numpy?](
https://stackoverflow.com/questions/18854425/what-is-the-best-way-to-compute-the-trace-of-a-matrix-product-in-numpy)
3. [Replacement for numpy.core.umath_tests.inner1d? #10815](https://github.com/numpy/numpy/issues/10815)
4. [einsum implementation](https://github.com/pydata/sparse/issues/31)
mac mini 2012 に ubuntu を入れて wifi ドライバをあてる

mac mini 2012 に ubuntu を入れて wifi ドライバをあてる

sudo apt-get install firmware-b43-installer ;
sudo dpkg -i b43-fwcutter* ;
sudo dpkg -i firmware-b43-installer* ;
cd ;
tar xfvj broadcom-wl-* ;
sudo b43-fwcutter -w /lib/firmware broadcom-wl-5.100.138/linux/wl_apsta.o ;
sudo reboot now ;
Ruby on Rails :レンダリングさせた部分テンプレートに変数や配列を渡す方法。

#パーシャル化した部分テンプレートに変数を渡す方法

/views/hoges/_hoge.html.erbを部分テンプレートとしてレンダリング先に変数を渡す場合。

```rb

<%= render partial: "hoges/hoge", locals:{hoge:hoge} %>
```

この時注意するのは、localsで変数を渡す際は、ハッシュで指定してあげる事。
また、<%= render "hoges/hoge", locals:{hoge:hoge} %> のようにpartialシンボルを書かずに、
レンダリングするテンプレートを指定して、localsシンボルを書いて、渡す変数を指定すると、エラーが吐かれるので、必ず上記のように、localsを指定する際には、partialsでレンダリングする部分テンプレートも指定してあげる。
逆に、partialsシンボルを記述しない場合は、localsシンボルも指定しない。

```rb

<%= render "hoges/hoge", {hoge:hoge} %>
```

レンダリングした部分テンプレートに渡した変数は、渡してあげたハッシュのキーで参照することができる。


#パーシャル化した部分テンプレートに配列を渡す方法

```rb
<%= render partial: "hoges/hoge",collection:(配列が格納されている変数),as:"(適当な変数名)"%>
```

配列を渡す際は、collectionで配列を指定してあげる。例えば、何かのリソースを一覧表示させる際に、その一覧表示部分を部分テンプレート化して、レンダリングさせたい時などに使える。
レンダリングさせた部分テンプレート先で、この配列を参照する際には、asで指定した変数で参照することができる。(どんな変数を指定してもOK)
ベンチマーク fioでストレージの性能評価をためしてみた① ～インストール編～

LinuxのディスクIO計測ベンチマークとして有名なfioを利用してストレージの性能を評価するべく、インストールをしていきます。

**:heart:関連記事:heart:**
[ベンチマーク fioでストレージの性能評価をためしてみた② ～評価編～](https://qiita.com/mihomiporin1110/items/ad354244d3f3a974d49a)

## 参考
参考文献はこちらです。
[fioを使ってストレージの性能を計測してみた](https://qiita.com/toshihirock/items/fa4d310115e6921ab0ac)
[[Linux] ディスク性能テストにfioを使ってみる](https://ameblo.jp/itboy/entry-12347291623.html)


## 環境


**今回の検証環境**
[OS]
CentOS7.5

**fioのバージョン**
fio: fio-3.1

```
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       30929148 2958060  27971088  10% /
devtmpfs         4066508       0   4066508   0% /dev
tmpfs            4078652       0   4078652   0% /dev/shm
tmpfs            4078652   25680   4052972   1% /run
tmpfs            4078652       0   4078652   0% /sys/fs/cgroup
/dev/sda1         508580   82188    426392  17% /boot
/dev/sdb1       16381756   45084  15481484   1% /mnt/resource
tmpfs             815732       0    815732   0% /run/user/1000
/dev/sdc1         30929148 2958060  27971088  10% /var/data

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7966         306        5515          25        2144        7224
Swap:             0           0           0


```


## インストール

```sudo yum install fio```を実行してインストールしていきます。

```
$ sudo yum install fio
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package fio.x86_64 0:3.1-2.el7 will be installed
:中略
Installed:
  fio.x86_64 0:3.1-2.el7

Dependency Installed:
  libibverbs.x86_64 0:15-7.el7_5           libpmem.x86_64 0:1.3-3.el7             libpmemblk.x86_64 0:1.3-3.el7
  librados2.x86_64 1:0.94.5-2.el7          librbd1.x86_64 1:0.94.5-2.el7          librdmacm.x86_64 0:15-7.el7_5
  rdma-core.x86_64 0:15-7.el7_5

Complete!
```

インストール後バージョン確認

```
$ fio --version
fio-3.1
```

無事インストールができました。

## 次回は...
いよいよ性能を評価を試してみます。


:heart:関連記事:heart:
[ベンチマーク fioでストレージの性能評価をためしてみた② ～評価編～](https://qiita.com/mihomiporin1110/items/ad354244d3f3a974d49a)
CakePHP3にて既にあるテーブルからマイグレーションファイルを作成する方法

# はじめに
既にデータベースにテーブルがある状態で、テーブルの情報を吸い出して、マイグレーションファイルを作成する方法を紹介します

# 環境
CakePHP 3.7

# 前提
- app.phpでデータベースに接続できるように設定されていること
- データベース内にテーブルが作成されていること

# 作成方法
- 以下のコマンドをコマンドを実行する

```bash
sh bin/cake bake migration_diff InitialCreateTables
```

# 実行結果
- config/Migrationsに「【作成日時】_InitialCreateTables.php」が作成されます。

# 補足
- テーブルが複数ある場合は一つのマイグレーションファイルにまとめられます。

# 参考
[２つのデータベース間の状態の差分を生成する](https://book.cakephp.org/3.0/ja/migrations.html#id15)
Macbook Pro の Touchbar でスクリーンショットを撮る


Touchbar をカスタマイズすると、スクリーンショット（カメラボタン）を割り当てることができます。

使い方
Touchbar のスクリーンショットボタンを押す
ショット対象がフォーカスされるのでTouchpadをクリックする
→保存される

Tips
Touchbarのスクリーンショットボタンを押した時点で、スクリーンショット対象や保存先などが表示されるので、ここで切り替えることができる。



補足

「Macbook Pro の Touchbar でスクリーンショットを撮る」の「Touchbar **で**」がポイントなのに、案外情報にたどり着けないのが驚きです。「Touchbar **の**」は一般的には不要ですよねえ。
Arduino サーボ制御 LXD-227

#LXD-227制御例


```
#define SERVO_PIN 9
#define CYCLE 22000
#define MIN_PULSE 1
#define ANGLE_0 600
#define ANGLE_180 2000
#define ANGLE_90 1300

int pulse = 600;//500-2100 (500-2500)
int _pulse = 2000;



void ServoWrite(int min_pulse) {
	if (_pulse - pulse > min_pulse) {
		_pulse -= min_pulse;
	}
	else if (_pulse - pulse < -min_pulse) {
		_pulse += min_pulse;
	}
	else {
		_pulse = pulse;
	}
	digitalWrite(SERVO_PIN, HIGH);
	delayMicroseconds(_pulse);
	digitalWrite(SERVO_PIN, LOW);
	delayMicroseconds(CYCLE - _pulse);
}

void ServoTest(int speed) {
	for (int i = 0; i < 500; i++) {
		ServoWrite(speed);
	}

}

void ServoSetup() {
	pinMode(SERVO_PIN, OUTPUT);
	int speed = 30;
	pinMode(SERVO_PIN, OUTPUT);
	ServoTest(speed);
	pulse = ANGLE_180;
	ServoTest(speed);
	pulse = ANGLE_0;
	ServoTest(speed);
	pulse = ANGLE_180;
	ServoTest(speed);

	pulse = ANGLE_90;
	
}

void setup() {
	Serial.begin(115200);
	ServoSetup();
	Serial.println("START");
}


void loop() {
	if (Serial.available()) {
		pulse = Serial.parseInt();
		if (pulse < 500)pulse = 500;
		if (pulse > 2100)pulse = 2100;
	}

	ServoWrite(MIN_PULSE);


}
```
dockerで開発する時に重宝しているalias

空いてる日にちがあったので、飛び入りですが参加します。


ローカルでDocker使ってイメージビルドしていると、ふと気がつけば相当な容量を食ってしまっていることがあります。


開発が終わったもの、ビルドに失敗したコンテナやイメージなど不要なものは削除して整理しておきたいですが、逐一docker rm(i)コマンドを打つのは手間であると。


わかります。その気持ち。


いらない、何も、捨ててしまおう。


というわけで、最近この2行をaliasとして使っています。



```
# container全削除
alias rm-containers='docker ps -aq | xargs docker rm'
# image全削除
alias rm-images='docker images -aq | xargs docker rmi'
```


ぜひお役立てください。
【超残念】fukuoka.ex Elixir／Phoenix Advent Calendar 2018参加を断念

fukuoka.exが主催の「[fukuoka.ex Elixir／Phoenix Advent Calendar 2018](https://qiita.com/advent-calendar/2018/fukuokaex)」に参加しようと思って「Elixir + Soracom + AWSな何かを書きます〜」と手を挙げてました。

![AdventCalendar2018.jpg](https://qiita-image-store.s3.amazonaws.com/0/51020/02e4bf77-a8fc-67a8-e91d-abfc7d0278b2.jpeg)

ですが、眼の病気にかかってしまって会社に行けなくなり作業できる環境が手元になくなってしまったため、とっても残念ながら今回の[fukuoka.ex Elixir／Phoenix Advent Calendar 2018](https://qiita.com/advent-calendar/2018/fukuokaex)への参加は断念せざるを得なくなりました。

fukuoka.ex主催の@piacere_exさん、直前ですみませんが[fukuoka.ex Elixir／Phoenix Advent Calendar 2018](https://qiita.com/advent-calendar/2018/fukuokaex)への参加を取りやめさせてください。

同じような記事は投稿するつもりですので:hugging:
NLOGのアーカイブ機能を日付ファイル名で

いつも忘れがちなのでメモ。
NLOGのアーカイブ機能と、ファイル名の{shotdate}は併用できない。
ファイル名は固定、アーカイブのファイル名を日付は可能。archiveNumbering="Date"、archiveFileNameの日付部分は{#}を使う。

> The problem is the {shortdate} in fileName=
> {shortdate} means it rolls automatically, so the archive/compression-logic gets confused.

https://github.com/NLog/NLog/issues/2564

ex.

```nlog.config
  <targets>
    <target
      xsi:type="File"
      name="TraceLog"
      fileName="${basedir}/logs/trace.log"
      encoding="UTF-8"
      lineEnding="CRLF"
      archiveFileName="${basedir}/logs/trace_{#}.log.zip"
      archiveEvery="Day"
      archiveNumbering="Date"
      enableArchiveFileCompression="true"
      layout="${longdate} [${threadid:padding=8}] [${uppercase:${level:padding=-5}}] ${message} ${exception:format=Message, Type, ToString:separator=\r\n}" />
  </targets>
```

ex.
以下のサイトでは、NLOGのアーカイブ機能と、ファイル名の{shotdate}は併用してるが、これだと正常にアーカイブできなかった」。
https://www.niceonecode.com/Blog/49/Archive-nlog-files-and-enable-Archive-File-Compression-Compress-the-archive-files-into-the-zip-files-

ex.
細かい仕様は以下参照
https://github.com/nlog/NLog/wiki/File-target
VirtualBox バージョンアップ後、ウィンドウの自動リサイズができなくなった件

#なにが起きたか

VirtualBox をバージョンアップしたらウィンドウの自動リサイズがきかなくなった。
「ゲストOSの画面を自動リサイズ」を選択しようとしても、クリックできないようになっていて選択できない。

こんな感じでウィンドウを広げても上下左右にグレーの枠が入るだけで大きくならない。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/238891/a2fa6cd0-7730-f5ef-270e-4448fa0a2517.png)

###追記（2018/12/18）

本記事の方法でひとまずリサイズは可能になりましたが、今度はクリックが効かなくなるなど謎の現象に悩まされました。。

GNOME の再インストールなど行いましたが解決せず。

~~最終的に、GNOME をやめて Xfce をインストールしたところ直りました。~~
**→ これはCentOS（カーネル）側の問題のようでした。コメントありがとうございます。**

ただし、GNOME を再インストールしたタイミングで mysql、VSCode、phpMyAdmin などがアンインストールされてしまったようで、少しめんどくさいことになりました（mysql のデータベース自体は生き残っていました）。

もし原因がわかる方がいたらぜひご教示ください。

（それでも開発環境を０から作り直すよりはよっぽどましですが。。）

#Guest Additions をインストール

Guest Additions をインストールしようとしたところエラーが発生。

```
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.  This may take a while.

VirtualBox Guest Additions: Look at /var/log/vboxadd-setup.log to find out what went wrong
VirtualBox Guest Additions: Running kernel modules will not be replaced until the system is restarted
VirtualBox Guest Additions: Starting.
Press Return to close this window...
```

`/var/log/vboxadd-setup.log` を見ろと言われますので確認します。

```
Building the main Guest Additions module.
Building the shared folder support module.
Building the graphics driver module.
Error building the module.  Build output follows.
make V=1 CONFIG_MODULE_SIG= -C /lib/modules/3.10.0-957.1.3.el7.x86_64/build SUBD
IRS=/tmp/vbox.0 SRCROOT=/tmp/vbox.0 -j2 modules
make[1]: warning: -jN forced in submake: disabling jobserver mode.
test -e include/generated/autoconf.h -a -e include/config/auto.conf || (        
        \
echo >&2;                                                       \
echo >&2 "  ERROR: Kernel configuration is invalid.";           \
echo >&2 "         include/generated/autoconf.h or include/config/auto.conf are 
missing.";\
echo >&2 "         Run 'make oldconfig && make prepare' on kernel src to fix it.
";      \
echo >&2 ;                                                      \
/bin/false)
mkdir -p /tmp/vbox.0/.tmp_versions ; rm -f /tmp/vbox.0/.tmp_versions/*
make -f scripts/Makefile.build obj=/tmp/vbox.0

以下略
```

なるほどわからん。

#結論

調べてみると `yum update` すれば直るとか必要なプラグインを入れれば直るとか書かれていますが、ダメでした。
最終的に、私の場合は Guest Additions のバージョンがよくなかったようです。

VirtualBox バージョンアップ後のそれぞれのバージョンは下記のとおりでした。

> VirtualBox: 5.2.22
> Guest Additions: 5.2.22

これを Guest Additions のバージョンだけ変更して

> VirtualBox: 5.2.22
> Guest Additions: 5.2.23

このようにすると動きました。

Guest Additions のイメージファイルは[ここ](https://www.virtualbox.org/wiki/Testbuilds)からダウンロードしました。
ページ下部にある Guest Additions をクリックすればイメージファイルが落とせます。

落としてきたイメージファイルを CentOS の仮想ドライブへ挿入して実行すれば完了です。

#参考

https://forums.virtualbox.org/viewtopic.php?f=3&t=86799

https://oki2a24.com/2016/05/05/trial-and-error-to-virtualbox-guest-additions-in-centos7-minimal/
スキル作成時のアイコンや音楽の素材サイトおよびツール類

ごきげんよう

この記事は
**「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」**
の12日目の記事です。

今日はAmazon Echo Showが届くはずなので、その記事を書くつもりでしたが、よくよく考えてみたら何時にくるかわからない。

ですので、別の日に予定していた記事として、僕がVUIのスキル・アプリを作成する時に利用検討する素材サイトを紹介します。

先日、某所のVUIイベントで
**「Alexaのスキルは様々なツールで作れるようになってきてるけど、アイコンや効果音はみなさんどうしてますか？」**
という話がありまして。

そういえばVUI業界の方々がどういう素材を用いているのか共有されていることを僕は認識していないので、僕が今までスキル作成をしていた時にたどり着いた素材サイトについて貼っておきます。

Qiitaでもリンクを貼りまくる記事はいろいろあるので問題ないと判断してます。

#ライセンスが緩い素材サイト

以下に記載するサイトは著作権などのライセンスが比較的ゆるいサイトです。
ただ、もちろん利用規約はそれぞれのサイトに記載されておりますので、各自判断・自己責任でご利用ください。

##1.アイコン

スキル作成時に地味に悩むのがアイコンです。

僕の中では以下の3点が利用しやすいと考えています。

■Alexaのicon-builder
https://developer.amazon.com/ja/docs/tools/icon-builder.html

■ICOOON MONO
http://icooon-mono.com/how-to-use/

ICOOON MONOさんはめっちゃおススメです。

■いらすとや
https://www.irasutoya.com/

たまに「使い放題」と認識している方がおりますが
20点以上の利用など、制限が実はありますのでご注意を。





##2.ジングル・効果音

VUIなので効果音が欲しい方はいらっしゃると思います。

ちなみに僕のスキル「ヒロインの告白」で起動時に
「しゃらららーーんスマートマキアート」
と、流れますが、あのような効果音を**「ジングル」**と呼びます。

ですので「効果音」「フリー素材」等でぐぐったりする方も多いと思われますが、「ジングル」を加えると、よりよいかもしれません。

以下が、僕がたどり着いた主なサイトです。

■ポケットサウンド
https://pocket-se.info/rules/


■TURBO X
http://turbo-x.com/sound_effect/


■DOVA-SYNDROME
https://dova-s.jp/_contents/license/


■Music is VFR
http://musicisvfr.com/free/license.html


■魔王魂
https://maoudamashii.jokersounds.com/music_rule.html


##3.アイコン画像のサイズ変更

アイコン画像を拾ってきたとして、そのサイズ変更はどうしてるの？

との話もあったので僕が使っているツールを記載しておきます。

最近僕がwindowsで使っているのは**リサイズ超簡単!Pro**です。

以下のように、サイズ変更したい画像を変換ファイルリストにいれて、
あとは縦横指定の箇所にAlexaの512×512と108×108を指定しておけば、覚えてくれるのでラジオボタンをポチって、「PNG」で「変換開始」でおしまいです。

本当に超簡単。

![リサイズ超簡単Pro.png](https://qiita-image-store.s3.amazonaws.com/0/67398/f70a38ec-942c-dce6-0e8c-eef43ca14a04.png)

##4.音楽編集ソフト

音声ファイルの編集は**Audacity**を使うことが多いです。直感的にわかりやすいです。

![Audacity.png](https://qiita-image-store.s3.amazonaws.com/0/67398/eb504499-119d-e803-2db1-16a2bd2b87cb.png)


##5.マイク

自分の声をVUIのスキル・アプリで流す！となるとマイクが必要になるわけですが、僕は以下です。

SONY エレクトレットコンデンサーマイクロホン
https://www.amazon.co.jp/gp/product/B005M2HDA6/

3000円くらいでいい感じに使えます。
本気声優でもない素人が使う分には十分かと思います。

##6.オーディオファイルの変換

Alexaなどプラットフォームに対応したオーディオファイルに変換するならffmpegを使っています。

以下に僕が書いた記事があるので適宜ご参照ください。

■Windows環境でffmpegを使ってmp3ファイルをAlexa対応形式に複数ファイル一括変換するメモ
https://qiita.com/surumegohan/items/63a1b4e9fe404545ed06



#まとめ

僕は上記に記載していた素材やツール等を使っていますが、VUIのスキル・アプリ作成をなさっている方で
「自分はここを使うよ！」
という素材やツールがあればコメントもらえると嬉しいです。

以上です。
laravel new コマンドでプロジェクト作成時にエラー発生でPHP.iniファイルを変更

# PHPのLaravelでプロジェクト作成コマンド「laravel new」実行したら、エラー発生し、PHP.iniファイルを修正して対応した時のメモ 

###laravel new laravelapp　をコマンドプロンプトで実行

###下記のエラーが発生した！
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for league/flysystem 1.0.49 -> satisfiable by league/flysystem[1.0.49].
    - league/flysystem 1.0.49 requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.
  Problem 2
    - league/flysystem 1.0.49 requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.
    - laravel/framework v5.7.16 requires league/flysystem ^1.0.8 -> satisfiable by league/flysystem[1.0.49].
    - Installation request for laravel/framework v5.7.16 -> satisfiable by laravel/framework[v5.7.16].

  To enable extensions, verify that they are enabled in your .ini files:
    - C:\MAMP\bin\php\php7.2.1\php.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

###Problem 1　の原因は、「要求されたPHP拡張モジュールのfileinfoがシステムに存在しません。」というエラーの様子

「C:\MAMP\bin\php\php7.2.1\ext\php.ini」ファイルを変更
「php.ini」ファイルの「;extension=fileinfo」の先頭のセミコロンを削除「extension=fileinfo」

![PHP_INI.JPG](https://qiita-image-store.s3.amazonaws.com/0/311464/dbe553b6-71ed-a36b-93ce-dee4f1728e62.jpeg)


###実際の実行ファイルは「C:\MAMP\bin\php\php7.2.1\ext」フォルダの中のphp_fileinfo.dllである。
phpはインストールした段階で拡張機能もインストールされており、php.iniファイルのコメントを解除することで拡張機能が使用可能となることが分かった。

###中途半端になっている「laravelapp」フォルダを削除し、laravel new laravelapp コマンドを実行
→数分ほど時間がかかり、無事に成功した。
[HTTPS復号編] Splunk Streamを使って http通信のWire Dataを可視化

前置き
---
[「Splunk Streamを使ってhttps通信のWire Dataを可視化」](https://qiita.com/odorusatoshi/items/1a9efe222ba6e8c4c454)から続いて、今度はhttps通信をサーバーの秘密鍵を用いて復号したいと思います。



ポイント
---
- Splunk Streamを使って、SSL復号が正常にできた場合、以下のstream:httpデータのように見えてきます。

<img width="833" alt="スクリーンショット 2018-12-11 18.45.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/185759/b99a96b2-6dc1-6ef9-253c-1ba992afc4ca.png">


手順
---
*参考元公式情報はこれだけ！[Use SSL keys for decryption](https://docs.splunk.com/Documentation/StreamApp/7.1.2/DeployStreamApp/EnableSSLforStreamForwarder)*

- まず、公開サーバの秘密鍵(privatekey)を手元に用意します。
- 公開サーバの秘密鍵をSplunkサーバ上の任意のフォルダにアップロードします。
- 秘密鍵をSplunk　Stream　Appに読み込ませて独自の鍵DBを作成します。
    - こちらの[Splunk Stream紹介記事](https://qiita.com/odorusatoshi/items/1a9efe222ba6e8c4c454)では Splunkサーバ（Deployment Server兼用）を使用しているため、鍵DBの作成はSplunkサーバにて実施します。
    - ```$SPLUNK_HOME/etc/apps/Splunk_TA_stream/linux_x86_64/bin```配下に移動
        - 例： ```cd /opt/splunk/etc/deployment-apps/Splunk_TA_stream/linux_x86_64/bin```
    - ``` ./streamfwd --addsslkey <key_name> <pem_file> <password>```コマンドを実行
        - *key_nameは任意。pem_fileは公開サーバの秘密鍵。passwordはパスワードなければ無しでも良し。
        - 例：```./streamfwd --addsslkey serverA_key private.key```
    - 成功すると以下のメッセージが表示される
        - 例：```key 'serverA_key' added to /opt/splunk/etc/deployment-apps/Splunk_TA_stream/local/keystore.db```
       
- ~deployment-apps/Splunk_TA_streamを再度、Deployment Server経由でWebサーバに配布します。
        - ```# /opt/splunk/bin/splunk reload deploy-server```
- SSL復号テスト確認
    - [QualysのSSL Server Test](https://www.ssllabs.com/ssltest/analyze.html?)を利用すると、以下のようなデータが届きかつ、復号できていることがわかる。
    - <img width="564" alt="スクリーンショット 2018-12-11 19.04.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/185759/23a25eda-c62d-cc6b-aaf0-3968e6b1e9b0.png">



学びと課題点
---
- Splunk Stream Appが復号をサポートしている鍵交換形式（kx）がRSAのみである点。
    - 今回一番苦労したのは、Webサーバ側のssl.confのSSLCipherSuiteを変更して、なるべくRSAベースの鍵交換を使っているSSLCipherSuiteをネゴシエート元のクライアントに利用させるためのWebサーバ側の設定確認に時間を使いました。
    - OSとブラウザの組み合わせによっては、 RSAベースの鍵交換を利用してくれないため、その場合、Streamでは復号できない制限があることもわかりました。
    - Splunk internalログを見ると、「cipher suiteが復号できない形式です」的なメッセージが出ています。
    - <img width="1411" alt="スクリーンショット 2018-12-12 10.24.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/185759/d126718f-d8aa-cd8c-fd47-6220a6373274.png">
    -  以上のことから、Webサーバ側でサポートしているCipher Suiteが広範囲（Diffie-Hellmanなども対応）の場合、全ての HTTPS通信を Splunk Streamで復号することは現実的にはできないことも分かりました。
    -   Webリクエストの内、何割かは復号できないものもあることを理解した上でSSL復号機能とは付きあう必要がありそうです。


その他参考記事
----
- [理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話](http://tkengo.github.io/blog/2015/12/01/https-details/)
    - 良記事です。cipher suiteの理解ができます。
なんか作る

# なんか作ってみる

## Pythonと何かで
cursesを使って見た目動いてるものがいいかと思い、Macのターミナル上で”X”が左右へ移動するのを作りました。

なんとかライダー2kのクルマのライトっぽい感じに見えるかしら。

<img width="581" alt="k2k.png" src="https://qiita-image-store.s3.amazonaws.com/0/324221/821be78e-c332-54c3-1378-02b396be7d3c.png">

Ctl-C入れると終わります。

```python:k2k.py
import curses
import time
import signal
import sys

N_CNT = 12
M_CNT = 24

MIN_NUM = 1
MAX_NUM = 26 

def handler(signal, frame):
        print('Done');
        sys.exit(0)
signal.signal(signal.SIGINT, handler)
 
stdscr = curses.initscr()

def main(stdscr):

    n = N_CNT
    m = M_CNT

    while(True):

        for i in range(MIN_NUM, MAX_NUM):

            m =  m + 1

            stdscr.clear()
            stdscr.addstr(n, m, 'X')
            stdscr.refresh()

            time.sleep(0.1)

        #stdscr.getkey()
 
        for i in range(MIN_NUM, MAX_NUM):

            m =  m - 1

            stdscr.clear()
            stdscr.addstr(n, m, 'X')
            stdscr.refresh()

            time.sleep(0.1)

    pass

if __name__ == '__main__':
    curses.wrapper(main)
```

[ここ](https://github.com/araki-m/k2k)
特定のファイルをrmコマンドなどで削除できないようにする方法(chattr、lsattrコマンド)

# 背景
例外処理のテストパターン消化のために必要になりました。
後輩にどうやれば実現できるのか、間違った説明をしてしまったので、戒めとして書きます。

# 動作環境

- Amazon EC2
- Cent OS 7

# ファイル権限000でも削除できてしまう

ファイルの権限を ```chmod 000``` としていたとしても、特定の条件を満たしていれば削除できます。
それは、**ファイルを配置しているディレクトリに対する書き込み権限**があることです。
ディレクトリに対する書き込み権限があれば、ディレクトリ直下にあるファイルは削除できます。
たとえ、読み込み／書き込み／実行権限がなくてもです。

# じゃあどうするか

## 1. ディレクトリの書き込み権限をなくす

chmodコマンドでディレクトリの書き込み権限をなくせばいいです。
chmodコマンドについては、調べればたくさん参考文献が出てくるので、省略します。

でも、ディレクトリの書き込み権限をなくしたら困る！という場合もあると思います。
そんなときは```chattr``` コマンドを使用しましょう。

## 2. chattrコマンドを使用する

下記のようなコマンドを実行すると、削除することができなくなります。

```
$ chattr +i 対象ファイル
```

実際にやってみると、下のようになります。

```
$ cd /tmp
$ ls -al
合計 XX
drwxrwxr-x. 2 riekure riekure  4096 12月 12 09:45 .
drwxrwxr-x. 3 riekure riekure    19 11月 19 16:32 ..
-rw-rw-r--. 1 riekure riekure     0 12月 12 09:45 temp.txt
$ chattr +i temp.txt
$ rm -f temp.txt
rm: `temp.txt' を削除できません: 許可されていない操作です
```

また削除できるようにするためには、 ```-i``` オプションを指定してください。

```
$ chattr -i 対象ファイル
```

削除できなくなっているかは、```lsattr``` コマンドで確認することができます。

```
$ lsattr
----i----------- ./temp.txt
```

全てがハイフンならば、ファイルの属性は変更されていません。

以下、[参考文献](https://kazmax.zpp.jp/cmd/c/chattr.1.html)より、変更できるファイル属性の一覧です。

| 属性 | 効果 |
| :--- | :--- |
| a | 追加のみ許可 (append only) |
| c | 圧縮 (compressed) |
| i | 変更不可 (immutable) |
| j | データのジャーナリング (data journalling) |
| s | 安全な削除 (secure deletion) |
| t | 末尾マージをしない (no tail-merging) |
| u | 復活可能 (undeletable) |
| A | atime を更新しない |
| D | ディレクトリの同期更新 (synchronous directory updates) |
| S | 同期更新 (synchronous updates) |
| T | ディレクトリ階層のトップ |

# 参考文献
[chattr - コマンド (プログラム) の説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/c/chattr.1.html)
[あんまり知られてないコマンドオブザイヤー「lsattr」と「chatter」のお話 - 美徳という名の背徳](https://blog.hyec.jp/2013/09/06/lsattrchatter/)
WindowsSubsystem for Linuxが開けない時

# TL; DR
WSL入れたけど `Installing,this may take a few minutes…` 出て使えなかった人のための解決法のひとつ

# 環境
Windows 10 Home
バージョン 1803

# 契機
WindowsでどうしてもShell環境を使いたくて様々探していたところ、WSLなんてものがあって、
LinuxのシェルをWindowsで使えるようになるとか。仮想マシンとかじゃなくWindows上で動いている様子。

# やったこと
早速Micosoft StoreからUbuntu 18.04 LTSを入手。
以下のサイトを参考にした。

[windowsストアから配布されたubuntuをインストールして実行するまで | No pain, no gain.](https://ufirst.jp/memo/2017/07/18/windows%E3%82%B9%E3%83%88%E3%82%A2%E3%81%8B%E3%82%89%E9%85%8D%E5%B8%83%E3%81%95%E3%82%8C%E3%81%9Fubuntu%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C/)

したのだが、すべてやっても
`Installing,this may take a few minutes…`
のまま。
調べて見るも、大体上記のサイトに載っているものばかり。

ヤケになって[設定]->[更新とセキュリティ]->[開発者向け]の中を探すと、下の方にPowerShellの項目が。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/30688/54c2e155-1f9f-06eb-afed-41e25f9b75a6.jpeg)
↑このキャプチャは押されて灰色になってますが、青々と適用してくれと主張していました。
ので適用すると、使えました。
やったぜ。

同様にハマった方のためにメモとして。

# 宣伝
今回の流れ、やったことなど以下にまとめました。
https://oratake.hateblo.jp/entry/2018/12/12/110003
VS2017での、フォームやコントロール用のプロジェクトと、起動やビジネスロジックのプロジェクトの分離方法

#序
**自分用のメモ**(良い記事ﾀｲﾄﾙすら思い浮かばなかった)。
人様に情報共有できるようには書いていないけど、
同じように悩む方へのヒントにはなるかもしれない。

#本
1:ソリューションを作る
2:ウィンフォームアプリのプロジェクトHOGEを作る
3:ウィンフォームアプリのプロジェクトHOGE.Viewを作る。
4:HOGEのForm1.csを削除する
5:HOGE.Viewの方のProgram.csを削除する
6:HOGEにHOGE.Viewの参照を追加する
7:HOGEのProgram.cs内のApplication.Run(new Form1());をApplication.Run(new HOGE.View.Form1());に書き換える
8:HOGE.Viewのプロジェクト名で右クリックしてプロパティを開いて、<出力の種類>を’Windowsｱﾌﾟﾘｹｰｼｮﾝ’から’ｸﾗｽﾗｲﾌﾞﾗﾘ’に変更する。

#結
https://github.com/MarkNijhof/Fohjin
を参考にして色々やってる間にこの方法を知りました。
知る前よりも保守性の高いソフトウェアが作れそうです。
何も知らない人がWebGLでキャラクター描画させるまで

グレンジでサーバーサイドエンジニアやっているyoshida029です。
[グレンジ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/grenge) 15日目になります。

# __概要__

普段サーバー開発でコードしか書いてないのでジャンル外のwebGLの勉強をしました。
素人がWebGL使ってみた感想です。

# やること

FBX => glTF形式変換 => glTFをThree.jsで描画

## glTF (GL Transmission Format)とは

「画像ならJPEG、音声ならmp3、そして 3DならglTF 」とまで言える状況を目指しているようです。

[クロノス・グループ、「glTF」の有能な進展を発表](https://jp.khronos.org/news/press/gltf-momentum-2016-jp)

# three.jsダウンロード

https://threejs.org/

# blender インストール

https://www.blender.org/download/

アドオン追加

https://github.com/KhronosGroup/glTF-Blender-Exporter

scripts/addons/にある

「io_scene_gltf2」フォルダを

blenderの下記のフォルダにコピーします。
C:\Program Files\Blender Foundation\Blender\2.79\scripts\addons

blender起動
fileのuserPreferenceを選択し、「Import-Export:glTF 2.0 format」にチェックをいれます。

![6f62b8c1-9d69-7a22-b8a6-035cef4f9856.png](https://qiita-image-store.s3.amazonaws.com/0/218170/9aa2dfbb-0e23-aff0-002a-353814136b06.png)


# FBXファイルの用意

FBXファイルをインポートします。
（進行中のプロジェクトにあったのを拝借しました）

![b1a59262-55a6-a88c-dac5-c5569aac4897.png](https://qiita-image-store.s3.amazonaws.com/0/218170/481e92de-115b-d19a-82ef-fe8abf229aca.png)

file > export > glTF 2.0 を選択。とりあえずデフォルトで出力。

![5ba4f602-bdb3-086e-3ad8-3a1ea6bf7a92.png](https://qiita-image-store.s3.amazonaws.com/0/218170/112a393e-de69-c62a-89fd-43d57e4f1d99.png)

hoge.bin、hoge.gltfが出力されました。

# 実装

## ダウンロードしたThree.jsからこちらを読み込みます。

three.js-master/build/three.min.js
three.js-master/examples/js/controls/OrbitControls.js
three.js-master/examples/js/loaders/GLTFLoader.js

実装するディレクトリ構成

```
- index.html
└js/
　├three.min.js
　├OrbitControls.js
　└GLTFLoader.js
└model/
　├hoge.bin
　└hoge.gltf
```

```html:インクルードするもの
<!-- Three.js本体 -->
<script src="js/three.min.js"></script>
<!-- カメラをコントロールするためのライブラリ -->
<script src="js/OrbitControls.js"></script>
<!-- glTFを取り扱うためにライブラリ -->
<script src="js/GLTFLoader.js"></script>
```

```html:本体部
<div class="stage" id="stage"></div>
<script>
    const width  = 600;
    const height = 600;

    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height);
    renderer.setClearColor(0xf3f3f3, 1.0);

    document.body.appendChild(renderer.domElement);

    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera(50, width / height, 0.1, 10000);
    var light = new THREE.DirectionalLight(0xefefef, 2);
    light.position.set(1, 5, 5).normalize();
    scene.add(light);

    const controls = new THREE.OrbitControls(camera, renderer.domElement);
    camera.position.set(3, 1, 1);

    const mixers = [];
    const loader = new THREE.GLTFLoader();
    loader.load('hoge.glb', (data) => {
        const gltf = data;
        const object = gltf.scene;
        scene.add(object);
    });

    const animation = () => {
        renderer.render(scene, camera);
        controls.update();
        requestAnimationFrame(animation);
    };
    animation();
</script>
```

ぐりぐりいじっているとなんかでた！

![15eb8994-c87d-9fd2-1047-4e5394dc6a1f.png](https://qiita-image-store.s3.amazonaws.com/0/218170/7050f863-72e6-8c75-1326-a6b182a2e0a5.png)

# __これからのこと__

- カメラや光の当て方やパラメータについて理解してない
- 次は動かしたい

# __感想__

普段サーバーいじってばっかりなので
見えるモノ作りって楽しいですね。
async pipeとは

# 前提として
* observableを学ばなければいけません。僕の過去記事を参照してください

# async pipe
* PromiseやObservableな非同期オブジェクトをそのままtemplateで表示できるもの
* `|`をpipe関数という。

```typescript

@Component({
  selector: 'async-pipe',
 //asyncでsubscribeの効力がある
  template: '<div>Time: {{ numberOne | async }}</div>'
})
export class AsyncPipeComponent {
 //1をメッセージとして、observableをcomponent内で作る
 // subssribeしないと、メッセージは普通取り出すことはできない。
  const numberOne$ = of(1); 
}
```

```typescript
1
```

## async pipeを使わなかった場合
* ngOnDestroyのところで、subscribeされた後のobservableを停止(unsubscribe)しなければいけません。

```typescript
import { Subscription } from 'rxjs';

...

export class App implements OnInit, OnDestroy {
  eventStream$: Observable<EventStream>
  subscription: Subscription;

  ngOnInit() {
      //subscribeしたものを変数にする。
    this.subscription = this.eventStream$.subscribe(...);
  }

  ngOnDestroy() {
    // コンポーネントを破棄する時にunsubscribeする
    if (this.subscription) {
      this.subscription.unsubscribe();
    }
  }
}
```


#async pipe使用のメリット
* template側に役割を任せられるのでコードがスッキリする
* コンポーネントが破棄される時に自動でunsubscribeする
* ライフサイクルの`on Push `の変更検知でのバグがない(subscribeだと検知されない)


# 引用
https://blog.angularindepth.com/angular-question-rxjs-subscribe-vs-async-pipe-in-component-templates-c956c8c0c794
Unityでスマホに書き出した時、起動するまでの真っ暗な画面が長い件

Unityでスマホに書き出した時に起動時の真っ暗な画面が長いのは何度か経験があって対処はしたつもりだったけど、結局長くなった。
自分で調べたときはAudioファイルがどーたらこーたらって書いてあったのでそればかり意識してた。

# 考えられる原因
1. Audioファイルが多い。
2. Resourcesにデータが多い。
3. 画像の圧縮形式が重い。
4. 重いプレハブがHierarchyに存在する。

etc...

## 原因1
Audioファイルは起動時にロードされるから真っ暗な画面が長くなるらしい。
Load In Backgroundにチェックを入れれば解決。

## 原因2
Resourcesも起動時にロードされるらしい。
Resourcesには極力入れないようにしよう。

## 原因3
画像の圧縮形式によっては真っ暗な画面が長くなるっぽい。
AndroidでASTCの画像が多いと長くなるのを確認したことがある。
AndroidはETC2しておこう。

##原因4
一番最初のSceneのHierarchyに大量のオブジェクトがあったり、重いプレハブがあったりすると、起動時の真っ暗が長い。

自分はこれが原因だった。

つまり、一番最初のSceneに重いプレハブが無ければいいのだから、最初に呼ばれる用のScene(Hierarchyには軽いものしか置かない)を用意して、そこから重いプレハブのSceneを呼ぶようにすればいい。
重いプレハブのSceneを非同期でロードするようにして、最初に呼ばれる用のSceneにはローディング中の表記があれば大丈夫だろう。

ご意見などがあればコメントください。
【MVC】について、誰でも分かるように駆け出しエンジニアが調べてみた。

#MVCとは


一言でまとめると、<b>プログラムの役割分担の一つ</b>です。

##M (Model)

<b>ユーザーが入力した情報などを管理・操作するファイル。</b>

え？って感じですよね（笑）

→amazonやzozotownで買い物をする時に、ショッピングカートに日用品や洋服を入れていきますよね！「シャンプーをカート入れたで」「人気商品カートにいれたわ」とかの情報をMさんが把握してくれてるんですね！この事により、商品の在庫状況等が把握できるんです。Mさんは、ユーザーが入力した情報を管理したり操作したりする役目があります。


##V (View)

<b>ユーザーが見る画面の事</b>（今この記事みてくれてますね？w <b>この画面の事です！</b>）

##C (Controller)

<b>MとVが喧嘩しないように、間に入って対応してくれる優しいやつ！</b>


MさんがVさんにある情報を送った場合、不適切な情報だとVさんが怒っちやいますね（反対も同じく）。その時に、Cさんが間に入って対応してくれる事で、良好の関係が出来上がってるんです！
How to remove Elasticsearch node(s)

## How to remove Elasticsearch node(s)

- 3 nodes -> 1 node

### from Elasticsearch Master node

```
$ curl -X PUT localhost:9200/_cluster/settings -H 'Content-Type: application/json' -d '{
  "transient" :{
      "cluster.routing.allocation.exclude._ip" : "xxx.xxx.xxx.xxx"
   }
}'
```

```
{"acknowledged":true,"persistent":{},"transient":{"cluster":{"routing":{"allocation":{"exclude":{"_ip":"xxx.xxx.xxx.xxx"}}}}}}
```

### shutdown elasticsearch node to be removed

```
systemctl stop elasticsearch
```

### edit /etc/elasticsearch/elasticsearch.yml
 -  discovery.zen.ping.unicast.hosts
 -  discovery.zen.minimum_master_nodes: 3 -> (none)

```/etc/elasticsearch/elasticsearch.yml
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#
#discovery.zen.minimum_master_nodes: 
```

### set replica = 0 !


```
curl -XPUT 'localhost:9200/_settings' -H 'Content-Type: application/json' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}'
```

```
{"acknowledged":true}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114634/7931a972-1294-e2e2-d702-045ec1a4d1c0.png)


### then repeat

```
$ curl -X PUT localhost:9200/_cluster/settings -H 'Content-Type: application/json' -d '{
  "transient" :{
      "cluster.routing.allocation.exclude._ip" : "yyy.yyy.yyy.yyy"
   }
}'
```

```
{"acknowledged":true,"persistent":{},"transient":{"cluster":{"routing":{"allocation":{"exclude":{"_ip":"xxx.xxx.xxx.xxx"}}}}}}
```

### shutdown elasticsearch node to be removed

```
systemctl stop elasticsearch
```




:smile: 




## Reference
https://stackoverflow.com/questions/17268495/how-to-remove-node-from-elasticsearch-cluster-on-runtime-without-down-time
MacでVirtualboxがインストールができない

#初めに
Mac OS High SierraでVirtualboxが中々インストール出来なかったのでまとめさせて頂きます。

#VirtualBoxのインストール
[Virtualbox](https://www.virtualbox.org/wiki/Downloads)はここからダウンロードしてください。

まずはVirtualBox.pkgからインストールします。
![mac-virtualbox-install-a03.png](https://qiita-image-store.s3.amazonaws.com/0/319723/b803ff44-3044-2e8d-be54-5e6913e5b5b3.png)

インストールを進めて行きますと以下のような画面が出ますので続けるをクリック
![mac-virtualbox-install-a04.png](https://qiita-image-store.s3.amazonaws.com/0/319723/f2641c49-135c-098c-8873-f939e2c8ed10.png)

そのままインストールを続けて行くと以下のようなポップアップが出ます。
![mac-virtualbox-install-a09.png](https://qiita-image-store.s3.amazonaws.com/0/319723/84aa3227-6081-7851-2499-c4c4df02a644.png)


「システム環境設定」→「セキュリティとプライバシー」から

開発元 "Oracle America, Inc." のシステム・ソフトウェアの読み込みがブロックされました。

というところの「許可」をクリックしましょう。
<img width="780" alt="スクリーンショット-2017-11-21-23.26.48-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/319723/d005958c-e5c1-7795-cad2-3d8c4151039e.png">
これでインストールが完了すればいいのですが、私の場合はこの後インストールが出来ない状態が続きました...

#System Integrity Protection(SIP)を無効にする
AppleはOS X El Capitan以降のmacOSに「System Integrity Protection(SIP)」と呼ばれる新たなセキュリティ機能を追加しました。

SIPはMac上の保護されたファイルやフォルダを改ざんしようとする悪質なソフトウェアからデータを守る重要な機能で、デフォルトで有効になっていますが、システムに深くかかわるサードパーティ製ソフトウェアの動作にも影響し、SIPが有効な環境では動作しないツールも存在するみたいです。


```
$csrutil statu　//ステータスを確認して
System Integrity Protection status: enabled.　//このように表示されたら有効になっています
```

SIPを無効にするために一度再起動して、Commandキー（⌘）とRキーを同時に押し続けてリカバリーモードを起動します。
すると以下のような画面が出てきます。
![sipjp01.png](https://qiita-image-store.s3.amazonaws.com/0/319723/d8f0e0d4-c8d1-d486-3f32-f9a044801058.png)

[ユーティリティ] → [ターミナル]を選択して

```
$csrutil disable //これで無効になります

*有効にしたい場合
$csrutil enable
```

もう一度再起動しましょう。

私はこれでVirtualBoxが起動しました。
gitbook使い方メモ

## 1. mdファイルの作成・修正
mdファイルを作成したり、修正したり、行いたい作業をします。
## 2. ビルド
```
$ gitbook build ./ docs/
```
このコマンドを打って、ビルドする。
第一引数：mdファイルの場所
第二引数：書き出し先

## 3. 確認
```
$ gitbook serve
```
このコマンドを打つとLive reload serverが立ち上がり確認が出来る。
問題なく立ち上がるとlocalhostが立ち上がる。
※自分の場合は4000番でした。

## 4. GitHubにpush
確認して問題なければGitHubにpushしましょう。
php-master-changes 2018-12-11

今日はファイルに付いてた BOM の除去、i386 Mac でのビルド問題の修正、array_merge() や array_replace() の内部実装のリファクタリングがあった！

# 2018-12-11
## weltling: Remove BOM
- https://github.com/php/php-src/commit/7dc1c7f6306747806208a8a1cb8deaf6b8ae117d
- [7.3~]
- ext/opcache で、先頭にBOM の含まれていたファイルがあったので除去

## laruence: Merge branch 'i386-PIC' of https://github.com/ryandesign/php-src into PHP-7.3
- https://github.com/php/php-src/commit/c3eb291e41800df2c516244fb3fce6a9fcc31428
- [7.3~]
- i386 Mac でのビルド問題の修正
- i386 PIC で \_\_cpuid_count がない環境での \_\_zend_cpuid() を修正
- [PR:3704](https://github.com/php/php-src/pull/3704) のやつ、[#76654](https://bugs.php.net/bug.php?id=76654) を解決
- i386 PIC では ebx レジスタを使うコードを吐くので退避するようにしている

## laruence: Update NEWS
- https://github.com/php/php-src/commit/54739c7e662d3c617ce08680f8447ae4e98c6a04
- [7.3~]
- ↑の NEWS への追記

## dstogov: Split php_array_merge_or_replace_wrapper() into php_array_merge_wrapper() and php_array_replace_wrapper().
- https://github.com/php/php-src/commit/05f3706588c64789f0cb185690684f8745757c13
- php_array_merge_or_replace_wrapper() を php_array_merge_wrapper() と php_array_replace_wrapper() へ分割
- array_merge() や array_replace() の内部実装
自分用Gitまとめ


裏で実装してソース管理したかったのでgitをローカルで使ってみました．
masterに本番のソースを持ってきて，機能ごとにbranch切って実装する感じです．

## Gitリポジトリを立てる

なにはともあれまずはGitリポジトリを立てないと始まりません．
今回は「D:\Sample」にGitリポジトリを立てることにします．

```powershell
md D:\Sample
cd D:\Sample
git init
```

これで「D:\Sample」にGitリポジトリが作られました．

## .gitignoreファイルを作る

gitに管理させないファイルを指定するために.gitignoreファイルを用意します．
リポジトリの直下に用意します．

```powershell
cd D:\Sample
New-Item .gitignore -ItemType File
```

## ソースコードを追加する

「D:\Sample」にソースコードを追加しましょう．
今回は「WebApp」フォルダにソースコードが入っているとします。

```text
Sample
┣WebApp
┗.gitignore
```

追加したらGitに変更を通知しましょう．

```powershell
git add .
```

いよいよコミットです．

```powershell
git commit -m 'masterブランチを作成します．'
```

## ブランチを切る

まずは現在のブランチを確認します．

```powershell
git branch -a
```

masterのみが表示されると思います．
*は現在どのブランチを使用しているかを表しています．

```powershell
* master
```

では，masterから新しくブランチを切ります．

```powershell
git branch NewBranch
```

現在のブランチを確認します．

```powershell
git branch -a
```

NewBranchが追加されました．
*は現在どのブランチを使用しているかを表しています．

```powershell
NewBranch
* master
```

では新しく作ったブランチに切り替えます．

```powershell
git checkout NewBranch
```

現在のブランチを確認します．

```powershell
git branch -a
```

NewBranchに切り替わりました．

```powershell
* NewBranch
master
```

では新しく作ったブランチに変更を加えましょう．
変更を加えたら後は変更を通知してコミットします．

```powershell
git add .
git commit -m 'ブランチに変更を加えます．'
```

## masterの変更を切ったブランチに反映する

masterに変更があったとします．
それを切ったブランチに反映してみます．

```powershell
cd D:\Sample
git checkout master
New-Item b.txt -ItemType File
git add .
git commit -m 'masterにb.txtを追加しました．'
```

```powershell
git checkout newbranch
git merge master
```
Gpartied　-> lvextend -> resize2fs

# VMでのLinuxのLVのディスク拡張手順<<備忘録>>

# 流れ
VMware上でディスク容量を増やしてから
-> Gpartied　-> lvextend  -> resize2fs 

# 手順
１．Gpartied
　GpartiedのLiveCDを公式からダウンロード後、CDブートしてパーティション拡張を行う


２．lvdisplay　で増やしたいlvのパスを確認

```
lvdisplay
```

３．lvextend 
※対象lvパスが「/dev/VolGroup/lv_root」の場合

```
lvextend -l +100%FREE /dev/VolGroup/lv_root
```

４．resize2fs 
※対象lvパスが「/dev/VolGroup/lv_root」の場合

```
resize2fs /dev/VolGroup/lv_root
```
iScroll（jQuery drawer）でTouchスクロールが動かなくなっていた

# なにがしたい？

スマホサイトで drawer.js を使っていたけど、いつの間にかスクロールができなくなっていた。
ドロアメニューが動かず、その下の、通常画面がスクロールする。

ググったけど解決策がパッと出てこなかったので穴埋め係します！

**drawer**
http://git.blivesta.com/drawer/

**iScroll**
https://github.com/cubiq/iscroll

# 何が悪い？

なんかしでかしたかなーと思っていたら、**公式サイトのデモでも同じ症状**だった。drawerというよりも、それが使っている iScroll が悪いみたい。もっというと、たぶんブラウザの仕様変更なのかも。

# どうする？

解決策はこちらに
https://stackoverflow.com/questions/39607777/iscroll-not-working-if-touch-events-are-enabled

水平スクロールで問題があった、とのことですが、縦スクロールにも同じように適用できます。

あとこれ
https://stackoverflow.com/questions/22269702/cant-click-on-links-with-iscroll-5


drawerに適用する場合は、こう。

```javascript
    $(document).ready(function() {
      $('.drawer').drawer({
        iscroll: {
            scrollX: false,
            scrollY: true,
            click:true, // これと
            mouseWheel: true,
            disablePointer: true, // これがポイント（っぽい）
            disableTouch: false,
            disableMouse: false
        },
      });
    });
```

もうぼちぼち、jQueryなんて使ってんじゃねぇよ、と言われそう……。

次はVueとか使うんで、もうしばらく延命させてください！！
PyCharm操作メモ

複数行をまとめてコメントアウトする
コメントアウトしたい行を選択した状態で `cmd+/`


構造ツールウィンドウ（アウトライン）の表示　`cmd+7`

構造をポップアップで表示するクイックアウトライン
エディタがアクティブな状態で `cmd+F12`
Reactより20倍速い(?)、 Imba (Memoized DOM) の紹介

先月に「Imbaって言語がすごいよ、Memoized DOMが来るよ」って記事を読んで、それ以降あまり盛り上がってるのを見ていないのですが、個人的にまだ気になってるのと日本語情報がまったくないのでまとめてみます。

# Imbaとは
Ruby風なシンタックスのAltJSです。
[公式サイト](http://imba.io)でもRubyやPythonに影響を受けたとあります。
他のAltJSと同様に、JavaScriptにコンパイルされてWebのフロントエンドで動かすことを想定して作られた言語です。
[この記事](https://medium.freecodecamp.org/the-virtual-dom-is-slow-meet-the-memoized-dom-bb19f546cc52)によると、ReactやVue.jsより20倍以上高速に動作するとか。。

# 特徴
- 記述量の少ない簡潔な記法
- **Memoized DOM**による高速描画

## 簡潔な記法
以下が[公式サイト](http://imba.io)にあるサンプルコードですが、かなり簡潔に書けてます。
構文としては、React, JSXに近いですね。

```rb:sample.imba
import {Todo} from './store'

tag App
	prop todos

	def addTodo
		@todos.push Todo.new(@newTodoTitle)

	def render
		<self>
			<form.header :submit.prevent.addTodo>
				<input[@newTodoTitle] placeholder="Add...">
				<button type='submit'> 'Add item'
			<ul> for todo in @todos
				<li> todo.title

Imba.mount <App.vbox todos=[]>
```

閉じタグがなくインデントで区別しているところや、クラス名を `class="header"` ではなく `.header` と書けるなど、HTMLと比べて少ない記述で書けます。

DOMが第一級オブジェクトであることも特徴のようです。
上のコードの最後の一文を見ると、タグをそのまま関数の引数として渡しています。
ReactのJSXが言語として備わっているような感じでしょうか。

気になる点としては、変数がMutableなことですかね。
Reactではstateへ直接代入はできず、setState()を用いて値を更新していましたが、Imbaでは値を直接書き換えています。
変数代入からDOMが更新される仕組みは後述する `Memoized DOM` によって得られているそうですが、、実装が気になります。

また、Imbaでは特別な型を用いておらず、Vanilla JSにコンパイルされるため、既存のJSライブラリを使用できるようです([公式ドキュメント](http://imba.io/guides/essentials/introduction)より)。

## Memoized DOM
Imbaを語るに欠かせないのがMemoized DOMです。
近年のWebフロントエンドのフレームワークではVirtual DOMを用いているものが多いですが、ImbaではMemoized DOMと呼ばれる仕組みを使っています。

Memoized DOMが何かを説明するより、実際にパフォーマンスの違いを目で見てもらった方が早いと思います。
Imba、React、Vue.jsのパフォーマンス比較を簡単なTODOアプリでできるサイトをImba作者が用意しているようです。
https://somebee.github.io/dom-reconciler-bench/index.html

<img width="1242" alt="Screen Shot 2018-12-09 at 12.51.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/90236/174eef93-ec30-ef5c-9000-dbb647e1c1e0.png">

画像を見てわかる通り、Imbaとそれ以外では処理速度に20倍以上の差があることがわかります。

紹介記事を読む限り、Memorized DOMでは直接DOMを更新するみたいです。
(詳しい仕組みはソースコードを読んでからまたまとめたいです)


# Imba導入事例
## Scrimba
https://scrimba.com/
Imbaの作者が作ったアプリで、プログラミングの動画学習サイトです。
動画といってもYouTubeのような動画埋め込みではなく、テキストエディタ上の文章が音声に合わせて変化する、という凝ったものになっています。
複雑な実装にも関わらず、ページはサクサク動きます。
Imbaでも複雑なアプリが作れる良い事例と言わざるを得ないです。

# おわりに
最近ではReact.memoなどの登場や、Reactのパフォーマンスチューニングの事例( https://qiita.com/teradonburi/items/5b8f79d26e1b319ac44f など)も増えてきてフロントエンドの速度にも気を配ることが増えてるようにに思います。
その中で、素で速いImbaも選択肢として取り入れてみてはいかがでしょうか。


# 情報源
本記事は以下のページを参考、引用してます。元記事の方が熱狂感を感じられるので、時間がある方は読むのをおすすめします。
- [The Virtual DOM is slow. Meet the Memoized DOM.](https://medium.freecodecamp.org/the-virtual-dom-is-slow-meet-the-memoized-dom-bb19f546cc52)
- [An Intro to Imba: the JavaScript-compatible language for lightning fast DOM updates](https://medium.freecodecamp.org/introduction-to-imba-the-alternative-to-javascript-e2aa1e3d1769)
- [imba.io (Imbaの公式ドキュメント)](http://imba.io/guides/essentials/introduction)
- [Github](https://github.com/imba/imba)
vimdiffでテキストを折り返す

1度に設定する方法を教えていただいたので修正しておきます

```
vimdiff -c 'windo set wrap' file1 file2
```

参考リンク
https://stackoverflow.com/questions/16840433/forcing-vimdiff-to-wrap-lines
https://vim-jp.org/vimdoc-ja/windows.html#:windo
iTunesで再生できる音楽ファイルがiPhoneで途中でスキップする現象の解決について

プログラミング関係ないんですが、Tipsとして置いておきます。

#起きる現象
タイトル通りなのですが、詳細。

- iTunesでは普通に再生出来る音源である
- iPhoneに同期、またはコピーしてiPhone内にデータがある状態
- 再生すると、残り秒数があり、表示されている情報もその曲の物になっているが次の曲が始まって流れる
- 曲をスキップ、または曲の途中でスキップするような設定はしていない（確認済）

#解決に至るまで辿ったプロセス
この現象が起きた音楽ファイルが幾つかあったので、共通点は何かあるか、身内でも同じ現象が起きた人がいたので、そちらからも少し聞きました。

- 古い（結構昔に取り込んだ）音源である
- CD等の普通に取り込める音源が現存しない（レコードでしか発売されたことがない等）ため、PCで取り込んでiPhoneで聞けるようにした音源である
- Youtubeや、Webラジオとかから取り込みした音源である

ただ単に古い音源、というものについては一応iTunesで取り込んだものなので、取り敢えず置いておいて、二番目の方について、何かしら情報が足りないのか、と考えました。実際、曲の情報を見るとあちこち空欄があります。

- 曲の情報を分かる範囲で埋めてみた

スキップするまでの時間が数秒（具体的に言えば3秒）伸びたが、それ以上はどうにもならず。が、その時に情報のタブをいろいろと見ていて、音源のファイルのフォーマットがまちまちである事に気がついた。MPEG-1とかMPEG-3辺りならまぁ、わかるのだけれど、聞いたことのないフォーマットのものもあった。
　で、昔、初音ミクで打ち込みなんかをしていた時期があったこともあって、iTunesでファイルの変換が出来たはずだ、と思いだした。当時はいろんな形式に変換出来たのだが、確か途中から機能が減らされてAAC等にしか変換できなくなって、その機能は使わなくなった記憶がある。

#解決方法

- 該当の曲を選択し、メニューのiTunes→変換→AACバージョンを作成
- 同じ名前の変換された曲が出来るので、元の方を消す（ファイルを残すかどうかはその人の判断で）
- 同期する（同期するオプションをしてない人はiPhone側で消して、iTuneから入れ直し）
- プレイリストからは消えてしまうので、登録してるなら入れ直す
- 完成

#考察
といってもたいしたものでもないんですけど、要するに。

- iTunesとiPhoneで再生できる音源フォーマットが微妙に違う（iPhone側のほうが対応可能なものが少なかったり、正常に読めない物がある）

ただこれだけなんでしょうね。

　ただ、WindowsのiTunesからは普通にiPhoneに同期出来て再生も出来ていた曲が、MacのiTunesからは再生できないからiPhoneにコピーしませんと言われる現象もあったりするのでどうなってるのだと思うところもありますが。このファイルについては8,000曲近いライブラリから探し出すのが面倒で探して変換はしてないので、もしかするとこれも解決出来るのかもしれませんがわかりません。

　私の所ではこれで数年前に取り込んだもので途中でスキップ（これは表示はちゃんと次の曲に変わる）するものについても解決しました。これについては一応形式はiTunesの古い型で表記されてたものですが、変換して新版になったことで解決しました。
　同じ現象が起きている身内はiCloudミュージックライブラリで聞くようにして、ローカルにファイルを置かないことで対処したそうな。iCloudミュージックライブラリがどういう仕組みになっているかはわかりませんが、考察した内容とかとはちょっと合わない気もするんですが、さてさて…。

これでMr.ChildrenのReplayがやっと普通に聞けるなぁ。



#最後に
これは当たり前ですけど、**あくまで自己責任で行ってください**。この記事の内容を行ったことでうまく行かなかったり不利益が出たとしてもこちらとしては一切感知しません。うまくいきました！というご報告は喜んで受け取りますけども。
Defaultのプロファイル依存のコマンドがあっても確実にAWSプロファイルを切り替える

最近シェルを書くのが楽しいjustInCaseの[@hiroga](https://twitter.com/hiroga_cc)です。
AWSのプロファイル切り替えで事故ることが多かったので、確実に切り替えるためのスクリプトを書きました！ ウチではこうしている、などご意見大歓迎です。

# TL;DR
`~/.aws/config` と `~/.aws/credentials` をリンク化します。


# コード
```asu
#!/bin/bash

# asu (AWS Switch User)
set -e
user=$1

ln -f ~/.aws/${user}.config ~/.aws/config
ln -f ~/.aws/${user}.credentials ~/.aws/credentials

export -n AWS_ACCESS_KEY_ID
export -n AWS_SECRET_ACCESS_KEY
export -n AWS_SESSION_TOKEN
export -n AWS_DEFAULT_PROFILE
export -n AWS_DEFAULT_REGION
export -n AWS_DEFAULT_OUTPUT
export -n AWS_SHARED_CREDENTIALS_FILE
export -n AWS_CONFIG_FILE

aws configure list
```

こんな感じで使います。
`asu develop-user`

# 解説
複数のAWSプロファイルを切り替えて使うなら、コマンドの末尾に `--profile USERNAME` とするのが最も確実だと思います。
でも、チームメンバーが共用で利用しているスクリプトが `AWS_DEFAULT_PROFILE` 依存だったら困りますよね？ ※1
他にも、プロファイルを環境変数から設定するパターンもあります。（CircleCIでのデプロイをローカル実行するケースなど...）

そんなケースに対応するべく作りました。

※1 本来は`~/.aws/config`内に記述するプロファイル名をチームで揃える、などの運用が正しいかもしれませんね。ご意見募集です！

# 細かいこだわりポイント
* `${user}.config` か` config.${user}` で迷いましたが、拡張子が違うとアイコンが変わって紛らわしいので前者にしました。
* ハードリンクかシンボリックリンクかで迷いましたが、対象のプロファイルがないときにはリンクでコケて欲しかった + config/credentialsだけDockerでvolumeするケースを想定してハードリンクにしました。
* そのほかの環境変数は事故の元なので全部消しました。