OmniAICreator/Qiita-1.07M huggingface dataset:
Rails6でJavaScriptを使う方法

# はじめに
Rails6のアップデートで、JavaScriptを設置する場所や設定方法がRails5以前とは変わったので、Rails6でJavaScriptを使う方法について書きます。

## この記事に書いてあること
- Rails6でJavaScriptを使うには、具体的にどのようなコードを書けば良いのか

## この記事に書いていないこと
- Webpackerとは
- アセットパイプラインとは
- Ajaxとは

# Rails6でJavaScriptを使う方法

## Viewの設定
例として、`app/views/home/index.html.erb`を作成して以下のように記述します。

```index.html.erb
<h1 id="hello">Hello World</h1>

<%= javascript_pack_tag 'home/index' %>
```
`javascript_pack_tag 'home/index'`の意味は、「`app/javascript/packs/home/index.js`を読み込んでね〜」という意味です。

## JSファイルの設定
JSファイル（`app/javascript/packs/home/index.js`）を作成します。

```index.js
document.addEventListener('DOMContentLoaded', () => {
  console.log(document.getElementById('hello'));
});
```
言うまでもありませんが、例のJSの処理は、たんにid="hello"の要素をconsoleに表示するというものです。

※ルーティングとコントローラはここに書いていませんがもちろん必要なので、各自で設定してください

## 結果
デベロッパーツールでConsoleを見てみると、id="hello"の要素を取得できていることが分かります。（つまり、JSが動いています）
<img width="316" alt="Screen Shot 2020-01-05 at 12.17.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459522/c54a1966-39e0-e77d-911c-ece6d36bacc1.png">

ちなみにHTMLを見てみると、以下のとおりです。
<img width="518" alt="Screen Shot 2020-01-05 at 12.16.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459522/8ffe83ca-e65d-07a4-f71e-acd6c74f8297.png">

`javascript_pack_tag`は`script`タグとして出力されるということが分かりました。

# 参考文献
https://dev.to/morinoko/adding-custom-javascript-in-rails-6-1ke6
PostgreSQL テーブルのプライマリキー取得

環境：　PostgresQL9.5
やりたいこと：PostgreSQLで、テーブルのPrimaryKeyを取得。

SQLは以下の通り 

SELECT ccu.column_name as COLUMN_NAME
  FROM information_schema.table_constraints tc
  INNER JOIN information_schema.constraint_column_usage ccu 
  ON (tc.table_catalog=ccu.table_catalog
    and tc.table_schema=ccu.table_schema
    and tc.table_name=ccu.table_name
    and tc.constraint_name=ccu.constraint_name
  )
  WHERE tc.table_catalog='データベース名'
  and tc.table_schema='スキーマ名'
  and tc.table_name='テーブル名'
  and tc.constraint_type='PRIMARY KEY'


追記
　スキーマが複数個ある場合、スキーマ名（publicなど）の条件も必要。
　constraint_typeは、CHECK、FOREIGN KEY、PRIMARY KEY、UNIQUEのいずれかです。

リンク
 [PostgreSQLにてテーブルやカラムの各種情報を取得するSQL](https://devlights.hatenablog.com/entry/20080226/p1 )
dockerを使わず簡単にローカルでLaravel5.8系が動く環境をセットアップする

# はじめに

とある初心者の方向けにlaravel環境のセットアップ手順を起こそうとしたが、
dockerで詰まることが多いのでローカルのmacで直接実行できる環境を用意することにした。

# 必要な動作環境

- ローカル環境はmacを使用
- php7.1以上
- sqlite3を使用

※上記がない場合はhomebrewを使ってインストールしておく

# 手順書

Laravel5.8系でプロジェクトを作成する

```
$ composer create-project --prefer-dist laravel/laravel [プロジェクト名] "5.8.*"
```

とりあえず動いているか動作確認する（ http://127.0.0.1:8000/ でLaravelが表示されてればOK ）

```
$ cd [プロジェクト名]
$ php artisan serve
```

ここからはやり直しができるようにGitの初期設定を行っておくと良いだろう

```
$ git init
$ git add -A
$ git commit -m "Initial Commit"
```

Laravelでは以下の場所にsqlite用のファイルを作成するとデータベースの設定が完了する

```
$ touch database/database.sqlite
```

Laravelのデータベースをデフォルトのmysqlからsqliteへ変更

```
-DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
-DB_PORT=3306
-DB_DATABASE=laravel
-DB_USERNAME=root
-DB_PASSWORD=
+DB_CONNECTION=sqlite
```

マイグレートで初回のテーブルを作成する

```
$ php artisan migrate
```

sqliteコマンドでテーブルが作成されたか確認をする

```
$ sqlite3 database/database.sqlite 

sqlite> .tables
migrations       password_resets  users 
```

※sqliteは .quit で終了できる（ その他コマンドも詳しく知りたい場合は .help を参照 ）


ついでにログイン機能を作成してみる

```
$ php artisan make:auth
```

http://127.0.0.1:8000/ にアクセスするとトップ右上にログイン機能ができていることが分かる

# 参考にしたサイト
https://reffect.co.jp/laravel/laravel_sqlite
基本情報1月の勉強計画

# 目標と結果
### 目標
- 大学の諸々(特に卒論)を終わらせる。
- 基本情報技術者試験ドットコムを活用する。
- 午後問題のアセスメントを受験する。
- 午後問題11分野の中から出来そうな分野を5〜7分野ほど見つける。

### 結果
- 卒論は終わりました！
- 2月3月の予定を立てました。
- 午後対策講座を3つ申し込みました。
    - 1回(2/16)
        - アルゴリズム
    - 2回(2/23)
        - 表計算とCASLⅡ
    - 3回(3/1)
        - Pythonとセキュリティ

# 振り返り
### keep
- 道場を継続。

### Problem
- アルゴリズムとプログラミング。

### Try
- 午後問題に慣れる。

# 週次計画
###[12週目(01/06)](https://qiita.com/Yuya_nakano/private/18db3641baa5af5bed3f)
###[13週目(01/13)](https://qiita.com/Yuya_nakano/private/e2657208cc9ad15ffd5a)
###[14週目(01/20)](https://qiita.com/Yuya_nakano/items/05b72038a1ef6277f9d0)
###[15週目(01/27)](https://qiita.com/Yuya_nakano/private/f0626f98c5b717b441e5)
Next JS x Jest x Typescript x Airbnb x Prettier x ESLintで環境構築

Next JSベースの環境構築、特にJest、Typescript、Airbnb、Prettier、ESLintを取り入れたものを作成。
[レポジトリはこちら](https://github.com/festa78/next-jest-typescript-airbnb-prettier-eslint)

Next JS公式GitHubの[with-jest-typescript](https://github.com/zeit/next.js/tree/canary/examples/with-jest-typescript)と[公式tutorial](https://nextjs.org/learn/basics/getting-started)を元に作成。
基本情報12週目(01/06週)

明けましておめでとうございます！
# 目標と結果
### 目標
- 参考書をみる。
- [基本情報技術者試験ドットコム](https://www.fe-siken.com/)を使う。
- 午後で通用する様に内容を理解する。
    - アルゴリズムとプログラミングの勉強をする。
    - 午後問題で重視する分野を見つける。
- 大学の諸々を片付ける。

### 結果
- 卒論は順調です。
    - 22日には全て片付く予定です。
- 記事の全てを全公開にした。(進行中の記事以外)
    - Qiitaでは旧URLはリダイレクトされるのでリンクの書き換えはしなくても大丈夫だと知った。

# 振り返り
### Keep
- 道場で午前でやったことを忘れないようにする

### Problem
- 無し

### Try
- 卒論優先
kernelコンパイルの備忘録

kernelのコンパイルをした時の備忘録です。(2020/01/05時の情報)
以下の順に入力してdebian10.2.0(x64)上でコンパイルしました。
再起動に失敗をしたので現環境の.configを再利用しています。

```bash:kernel_compile_memo
sudo apt update
sudo apt install libncurses-dev bison flex libssl-dev
uname -r
cd /usr/src
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.92.tar.xz"
sudo tar -xavf linux-4.19.92.tar.xz
cd linux-4.19.92/
sudo cp -p /boot/config-4.19.0-6-amd64 .config
sudo sed -i .config -e 's/\(CONFIG_SYSTEM_TRUSTED_KEYS\).*$/\1=""/'
sudo make oldconfig
sudo make -j`nproc` bindeb-pkg
cd ..
ls -l *.deb
sudo dpkg -i linux-headers-4.19.92_4.19.92-1_amd64.deb
sudo dpkg -i linux-libc-dev_4.19.92-1_amd64.deb
sudo dpkg -i linux-image-4.19.92_4.19.92-1_amd64.deb
sudo reboot
```

```bash:kernel_download_memo
sudo curl -L -# -O -R -S "https://git.kernel.org/torvalds/t/linux-5.5-rc4.tar.gz"
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.7.tar.xz"
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.3.18.tar.xz"
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.92.tar.xz"
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.161.tar.xz"
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.207.tar.xz"
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.207.tar.xz"
sudo curl -L -# -O -R -S "https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.16.80.tar.xz"
```
Windowsのシンボリックリンクを使ってMT4とMT5のデータフォルダを共通化する

# はじめに
[1][『メタトレーダー４＆５共通ライブラリによるＥＡ開発入門』](https://amzn.to/33JHotW)

では、MT5で作成したEA（例：sample.mq5）をMT4のデータフォルダにコピーして、拡張子をsample.mq4のように変換すれば、MT4用のEAがコンパイルできるとあります。

今回、コピーしてリネームするのも面倒なので、MT4とMT5のデータフォルダを共通化して、MT5のEAとMT4のEAが同時にできるようにしてみます。

# Windowsのシンボリックリンクを使う
LinuxなどUNIX系のOSでは当たり前なのですが、ファイルの本体は一つだけど、別の名前で参照できるシンボリックリンクという機能があります。WindowsでもVISTA以降で対応しているので、今では普通に使える機能となっています。

以下に手順を示します。

## PowerShellを管理者として開く
エクスプローラで、シンボリックリンクを作成したいフォルダを開いて、[ファイル]メニューから「Windows Power Shellを管理者として開く」を選択します。すると、コマンドを入力できる画面が現れます。

## コマンドプロンプトを開く
シンボリックリンクを作成するコマンド「mklink」は、PowerShellからは実行できず、従来のコマンドプロンプトから実行します。そこで、「cmd」を実行してコマンドプロンプトを開きます。

````
PS C:\Users>cmd
Microsoft Windows [Version 10.0.18362.535]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users>
````

## mklinkの使い方
ここで、単にmklinkと入力すると、以下のようにmklinkの使い方が表示されます。

````
C:\Users>mklink
シンボリック リンクを作成します。

MKLINK [[/D] | [/H] | [/J]] リンク ターゲット

        /D          ディレクトリのシンボリック リンクを作成します。既定では、
                    ファイルのシンボリック リンクが作成されます。
        /H          シンボリック リンクではなく、ハード リンクを作成します。
        /J          ディレクトリ ジャンクションを作成します。
        リンク      新しいシンボリック リンク名を指定します。
        ターゲット  新しいリンクが参照するパス (相対または絶対)
                    を指定します。
````

今回の記事では、ファイルのシンボリックリンクと、フォルダのシンボリックリンクを使います。例えば、sample.mq5をsample.mq4として参照できるようなシンボリックリンクを作成する場合、

````
C:\Users>mklink sample.mq4 sample.mq5
````
とします。フォルダの場合、C:\Users\Experts というフォルダをExpertsとして参照できるようなシンボリックフォルダを作成する場合、

````
C:\Users>mklink /D Experts C:\Users\Experts
````
とします。

# MT4とMT5のデータフォルダを共通化する
では、mklinkを使ってMT4とMT5のデータフォルダを共通化してみます。

MT4、MT5では、[ファイル]-[データフォルダを開く]を選択すると、それぞれのデータフォルダがエクスプローラで開きます。

ここで、MT4だと「MQL4」、MT5だと「MQL5」の下にユーザーが作成するプログラムが格納されています。このフォルダごと共通化するのが簡単なのですが、「Include」のフォルダなどで、同じファイル名で異なる内容のものが含まれるので、ここでは、「Experts」のサブフォルダだけを共通化してみます。

##共通のExpertsフォルダを作成する

MT4、MT5の両方から参照するExpertsフォルダを適当な場所に作成します。（ここでは、例として「C:\Users\Experts」とします。）
そして、「MQL4\Experts」と、「MQL5\Experts」のファイル、フォルダをこのフォルダにコピーします。

MQL4のファイルの拡張子は、mq4、ex4、MQL5のファイルの拡張子は、mq5、ex5なので、被ることはないと思いますが、mqhファイルなど同じファイル名のものがあった場合は、内容が同じがどうか確認してからコピーしてください。

##共通のExpertsフォルダにシンボリックリンクを張る
MT4の場合、データフォルダから「MQL4」を開いたところ、MT5の場合、データフォルダから「MQL5」を開いたところで、前述のコマンドプロンプトを開いてください。

それぞれのフォルダにExpertsというフォルダがあると思いますが、シンボリックリンクを作成する前に以下のようにフォルダ名を変えてバックアップしておきます。

````
C:\Users>ren Experts Experts.org
````

そして、先ほど説明したように、「C:\Users\Experts」へのシンボリックリンクを作成します。

````
C:\Users>mklink /D Experts C:\Users\Experts
````

これでMT4とMT5のExpertsフォルダが共通化できました。フォルダ中にはmq4、mq5のファイルが混在していますが、MT4ではmq4ファイルしか、MT5ではmq5ファイルしか見えないので、使い勝手はたいして変わらないと思います。（ただし、メタエディタでは両方のファイルが見えます。）

#mq5ファイルとmq4ファイルを共通化する
以下は、参考資料[1]の共通ライブラリを使ってmq5をmq4にリネームするだけでMT4のEAが作成できる場合の話です。

ファイルのリネームは、もとのmq5ファイルを更新すると毎回行わなくてはいけませんが、シンボリックリンクを使うと、その必要すらなくなります。

方法は簡単で、前述のmklinkの使い方の通り、シンボリックリンクを作成したいフォルダでコマンドプロンプトを開き、

````
C:\Users>mklink sample.mq4 sample.mq5
````
と実行するだけです。これで、MT4、MT5どちらからも同じファイルを開いてEAを作成することができます。

ただし、メタエディタの仕様か、リンクの方から開いて編集したファイルは自動的に保存されないようです。ファイルの編集は本体の方から行った方が確実でしょう。

最後に上記シンボリックリンクをまとめて行うバッチファイルをつけておきます。

````mq4link.bat
@echo off
for %%i in (*.mq5) do (mklink %%~ni.mq4 %%i)
````
Zephyr > microSD + FatFs > SPI > STM32L476とSTM32F769の違い > SPIの周波数 > STM32F769: 210kHz | STM32L476: 312kHz 

```txt:動作環境
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
ボード: STM32F769 Discovery Kit (以下、STM32F769)
Zephyr 2.1.0-rc1
microSDモジュール: CK-40 (サンハヤト)
ロジック確認: Analog Discovery 2 (以下、AD2)
```

### 関連　

- [Zephyr + STM32L476 > microSD(SPIモード接続) + FAT](https://qiita.com/7of9/items/19a0a90ae30265879bf3)
- [Zephyr > microSD(SPIモード接続) + FAT > STM32L476で成功、STM32F769で失敗 > ロジックのモニタ](https://qiita.com/7of9/items/bdc3cb24867fc0d0b78c)
- [Zephyr > microSD (SPIモード接続) + FAT > STM32L476 > CMD0のパラメータが異なる (0x94と0x95)](https://qiita.com/7of9/items/5ae95f2cd1ef559bfb04)
- [Zephyr > west build時 > STM32F769:SPI2で成功, STM32L476:SPI2で失敗 > device treeファイルの定義に違いがある](https://qiita.com/7of9/items/80b8b56a84ffc76c9ee0)
- [Zephyr > microSD + FatFs > SPI > Analog Discovery 2によるSPIロジックのキャプチャ結果](https://qiita.com/7of9/items/77862643d5addbc572d2)

### 状況

- `samples/subsys/fs/fat_fs`にあるサンプルを試している
- A. STM32L476 + SPI1: 成功
- B. STM32L476 + SPI2: 成功
- C. STM32F769 + SPI2: 失敗

## SPIのクロック周波数

STM32L476とSTM32F769のSPIロジックをキャプチャして見ているうちに、クロック周波数の違いに気づいた。
STM32L476の方が高い周波数になっている。

### クロック周波数の決定

クロック周波数の定義はspi_ll_stm32.cの255行spi_stm32_configure()にて実装されている。
clockという変数とclkを比較して、config->frequency(=400kHz)に合う周波数になる。

- ボードごとのクロック周波数
    - STM32L476
        - 40MHz始まり
        - 312kHzになる
    - STM32F769
        - 52MHz始まり 
        - 210kHzになる

Analog Discovery 2でキャプチャしたロジックに整合する。
[NNabla]構築済みネットワークの中間層間に新たなレイヤーを追加する方法

# はじめに
　qiitaへの3回目の投稿です。(article3)
　[前回](https://qiita.com/__NJ__000/items/f0df609900412d6c55bd)に引き続き、私がnnablaを使っていた中で「こういう情報がqiitaとかにあったらよかったのに」と思いながらなんとか気合いで[nnablaのreference](https://nnabla.readthedocs.io/en/latest/)と`dir()`(pythonの標準関数。引数のメンバ変数・関数を返してくれる)で見つけてきたことについてまとめます。
#1. 要件
・OS: macOS Catalina (バージョン 10.15.1)
・python: 3.5.4
・nnabla: 1.3.0
#2. ネットワークの構築
　サンプルのネットワークを下記で定義します。(ここまでは[前回](https://qiita.com/__NJ__000/items/f0df609900412d6c55bd)同様)

```article3_add_layer.py
import nnabla as nn
import nnabla.functions as F

# [define network]
x = nn.Variable()
y = F.add_scalar(x, 0.5)  # <-- (1)とおく
y = F.mul_scalar(y, -2)
```
単純に $y=(x+0.5)\times2$ という形になってます。

#3. 既存の中間層間に新たなレイヤーを追加
[前回](https://qiita.com/__NJ__000/items/f0df609900412d6c55bd)説明した内容を用いて上記の $y=(x+0.5)\times2$ を$y=(x+0.5)^2\times2$に変える方法を紹介します。コードは下記になります。

```article3_add_layer.py
# [get middle variable]
h1 = y.parent.inputs[0]
additional_layer = F.pow_scalar(h1, 2.0)
redefine_layer = F.mul_scalar(additional_layer, **y.parent.info.args)

# [rewire_on]
y.rewire_on(redefine_layer)
```
動作確認は上記のrewire_onの直前で、printを挟む形で下記で行いました。

```article3_add_layer.py
def print_func(f):
    print('{} output = {}'.format(f.name, f.outputs[0].d))

# [print & forward]
x.d.fill(0)
y.forward()
print('--- before ---')
y.visit(print_func)
print('y.d = {}'.format(y.d))
print('')

# [rewire_on]
y.rewire_on(redefine_layer)

# [print & forward]
y.forward()
print('--- after ---')
y.visit(print_func)
print('y.d = {}'.format(y.d))
print('')
```
出力

```
--- before ---
AddScalar output = 0.5
MulScalar output = -1.0
y.d = -1.0

--- after ---
AddScalar output = 0.5
PowScalar output = 0.25
MulScalar output = -0.5
y.d = -0.5
```

###解説
* `h1 = y.parent.inputs[0]`で(1)の部分を取得しています。
* `additional_layer = F.pow_scalar(h1, 2.0)`で、(1)の後に新たに追加しようとしていたレイヤーを定義しています。
* この時点で`additional_layer`をmul_scalarの出力にrewire_onするとmul_scalar自体も上書きされて消えてしまうので、`redefine_layer = F.mul_scalar(additional_layer, **y.parent.info.args)`で既存のものと全く同じmul_scalarレイヤーを再定義し、既存のmul_scalarを上書きすることで所望の動作をします。
* `y.parent.info.args`は、`y.parent`の部分でmul_scalarレイヤーを表し、`.info.args`でそのレイヤーに与えられた引数を取得しています。つまり、これを使用して既存のmul_scalarレイヤーと全く同じmul_scalarレイヤーを定義できます。
* `y.rewire_on(redefine_layer)`で、計算グラフ上に再定義されたレイヤーの出力ノード`redefine_layer`を`y`で上書きして所望の動作が完了します。
* 最後の動作確認では、`rewire_on`の前後でレイヤーとして何が接続されているのか？、それぞれの出力は何か？ということを出力しました。レイヤーとして、pow_scalarが増え、数値も数式の通りかと思います。

# 4. まとめ
　新たなレイヤーを挟み込む方法を紹介しました。これを使用すると、既存の学習済みモデルの各activationの出力に量子化レイヤーを挟み込んだり、Convolution + BatchNormalizationを畳み込んで1つのConvolutionにしたりもできます。次回はこの辺に触れてみようかと思います。
Angularで簡単アニメーション：左からフェードイン編

犬クジラです。
初投稿の今回はAngularで簡単なアニメーションを動かす内容について投稿します。
多くのWEBアニメーションはCSSを使って動かしていますがAngularでも簡単に作ることができます。
手順公開のため[Stackblitz](https://stackblitz.com/)上にて作業を行っています。

# 今回の完成デモ
![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561833/fe60d602-31ef-b838-d7a6-a95e28009797.gif)

# app.module.tsにAnimationsモジュール追加

Angularでアニメーションを利用するにはBrowserAnimationsModuleが必要なので追加します。
モジュールの追加インストールが必要な場合は追加してください。

```typescript:app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; // 追加

import { AppComponent } from './app.component';

@NgModule({
  imports:      [ 
    BrowserModule,
    BrowserAnimationsModule // 追加
  ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
```

# アニメーションで動かす対象を設定する

アニメーションがいつ開始するか検知するために、Angularはトリガーを必要とします。
trigger()関数は、変更を監視するためにプロパティ名を記述します。変更が発生すると、トリガーはその定義に含まれるアクションを開始します。ここではトリガー名を「fadein-left」をしておきます。

```HTML:app.component.html
<div @fadein-left>
  <div>テキスト</div>
</div>
```
# コンポーネントファイル内にアニメーション関数をインポートする

今回は以下の関数を利用します。

```typescript:app.component.ts
import {
  trigger,
  style,
  animate,
  transition,
  query,
  sequence,
} from '@angular/animations';

// …省略
```

# アニメーションメタデータプロパティを追加する

コンポーネントファイル内の@Component()デコレーター内にanimations:というメタデータプロパティを追加してください。アニメーションを定義したトリガーをanimationsメタデータプロパティ内に配置します。その中に今回のトリガーとなる「fadein-left」を設定します。

```typescript:app.component.ts
// …省略

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ],
  animations: [
    trigger('fadein-left', [

     // -----------------------------
     // ここにアニメーション内容を書く
     // -----------------------------

    ]),
  ]
})

// …省略
```

# 動かす内容を書く

いよいよアニメーションさせたい内容を記述します。
今回のストーリーでは画面左からフワッとフェードインする流れになるので以下のように設定

```typescript:app.component.ts
// …省略

  animations: [
    trigger('fadein-left', [

      transition('void => *', [
        sequence([

          // アニメーション１：初期表示位置は不可視化しておく
          query('div', style({
            opacity: 0, // 不可視化
            "margin-left": '-20px'
          })),

          // アニメーション２：スタート開始時間調整(ここでは1秒後に開始)
          query('div', animate('1000ms', style({}))),

          // アニメーション３：2秒かけて左から可視化される
          query('div', animate('2000ms ease-out', style({
            opacity: 1,
            "margin-left": '0px',
          }))),

        ]),
      ]),

    ]),
  ]

// …省略
```
アニメーション内容の補足として、「transition('void => *'」はHTML要素というかDOM内に指定のトリガーが現れた際に未定義("void")からは定義済み\*(アスタリスク)に処理されたという解釈となり後続の処理が自動実行される仕組みとなります。queryはトリガー定義されているHTML要素内のdivに対して処理が行われます。

あとは簡単に

1. 初期表示として移動元となる距離から不可視化の状態にします。
2. アニメーションの開始ミリ秒を指定します。
3. 実際にアニメーションが開始され2秒かけて左に移動しつつopacityによって可視化が行われます。

となるだけです。
非常に簡単ですね。

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561833/fe60d602-31ef-b838-d7a6-a95e28009797.gif)

[今回の完成デモ](https://stackblitz.com/edit/angular-qdwqcp)
Automakeは、ディレクトリの深いところにソースがあっても動作する。 

Automakeは、ディレクトリの深いところにソースがあっても動作する。 
例えば 
Project ディレクトリの下に、 

```Console
Project/src/main/c/hello.c 
Project/src/main/c/Makefile.am 
```

があるとき、 

```Console
Project/Makefile.am 
```

に 

```Automake:Project/Makefile.am
SUBDIRS = src/main/c 
```

とさえ記述しておけばよい。 
あとはAutotoolsのお作法通りの操作でmake installまでできる。 

```Console
src/Makefile.am 
src/main/Makefile.am 
```

は冗長なので作る必要がない。 
これでMavenデフォルトライクなディレクトリ構成でAutomakeが使える。やったね! 

参考: https://www.gnu.org/software/automake/manual/automake.html
【HTML】WebGLでとりあえず直線を引く【WebGL/2D】

WebGLで2Dのとりあえず線を引くサンプルです。
丸写しで動きます。
ライブラリ不要です。
IE11,Edge,Chromeで動作確認済みです。
ネットにあるサンプルを変更したのはプログラムのエントリポイントぐらいです。
document.addEventListener('DOMContentLoaded',function() {//実質ここからプログラムが動く});

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=yes">
<title>webgl2d sample</title>
<script>
document.addEventListener('DOMContentLoaded', function() {
	var canvas = document.getElementById("canvas");
	canvas.width = 500;
	canvas.height = 500;
	var gl = canvas.getContext("webgl") || canvas.getContext('experimental-webgl');
	gl.clearColor(1.0, 0.0, 1.0, 1.0); //Red,Green,Blue,Alpha
	gl.clear(gl.COLOR_BUFFER_BIT);

	var buffer = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, buffer);

	var vSource = [
	"precision mediump float;",
	"attribute vec2 vertex;",
	"void main(void) {",
	"gl_Position = vec4(vertex, 0.0, 1.0);",
	"}"
	].join("\n");
	var vShader = gl.createShader(gl.VERTEX_SHADER);
	gl.shaderSource(vShader, vSource);
	gl.compileShader(vShader);
	gl.getShaderParameter(vShader, gl.COMPILE_STATUS);

	var rgba = [0.0, 0.0, 0.0, 1.0] // Red, Green, Blue, Alpha
	var fSource = [
	    "precision mediump float;",
	    "void main(void) {",
	    "gl_FragColor = vec4("+ rgba.join(",") +");",
	    "}"
	].join("\n");
	var fShader = gl.createShader(gl.FRAGMENT_SHADER);
	gl.shaderSource(fShader, fSource);
	gl.compileShader(fShader);
	gl.getShaderParameter(fShader, gl.COMPILE_STATUS);

	var program = gl.createProgram();
	gl.attachShader(program, vShader);
	gl.attachShader(program, fShader);
	gl.linkProgram(program);
	gl.getProgramParameter(program, gl.LINK_STATUS);
	gl.useProgram(program);

	var vertex = gl.getAttribLocation(program, "vertex");
	gl.enableVertexAttribArray(vertex);
	gl.vertexAttribPointer(vertex, 2, gl.FLOAT, false, 0, 0);

	var vertices = [
	    -1 , 0, //x,y
	    1 , 0 //x,y
	];
	var verticesNum = vertices.length / 2;

	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);
	gl.drawArrays(gl.LINE_LOOP, 0, verticesNum);
});

</script>
</head>
<body style="text-align: center; width: 100%; height: 100%;">
<canvas id="canvas"></canvas>
</body>
</html>

```

こんな感じで表示されるはずです。
![webgl2dsample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/ae1b6907-f16d-99db-01f4-8d46c0fe1437.png)
global gitignore

[Ignoring files: Create a global .gitignore - GitHub Help](https://help.github.com/en/github/using-git/ignoring-files#create-a-global-gitignore)より。

コンピューター内のすべてのレポジトリに適応するようグローバルに .gitignore を設定したい場合、たとえば `%USERPROFILE%` などのディレクトリに `gitignore` ファイル (特定しやすいよう `.gitignore_global` 等のファイル名にすると良い）を作成し、以下コマンドを実行する。

```bash
$ git config --global core.excludesfile ~/.gitignore_global
```

ただ共同制作する場合、ちゃんとレポジトリ独自の `.gitignore` に登録して共有できるようにした方がよさそうな気がするけどどうなのだろう。emacsやVSCode等のIDEが生成する環境設定ファイルはグローバルの方が楽になりそうな気も。
Unity シーンの変更を保存

```
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEditor;
using UnityEditor.SceneManagement;

public class Sample
{
    [MenuItem("MyTools/Sample")]
    public static void Main()
    {
        // 変更処理
        var root = new GameObject("Root");

        var gameObjects = (GameObject[])Object.FindObjectsOfType(typeof(GameObject));

        foreach(var obj in gameObjects)
        {
            obj.transform.SetParent(root.transform);
        }
        // 終了

        // シーンの取得
        var currentScene = SceneManager.GetActiveScene();
        // 変更したことを知らせる。
        EditorSceneManager.MarkSceneDirty(currentScene);
        // 変更を保存する。
        EditorSceneManager.SaveScene(currentScene);
    }
}
```

![SaveCurrentScene.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328087/81125661-d00c-ed4c-71c5-a0cc00a25338.gif)

######Dirtyの簡単な説明
Unityではデータが変更されているが、ディスクには保存されておらず保存する必要がある場合にダーティフラグを使用します。
参考
https://docs.unity3d.com/jp/460/ScriptReference/EditorUtility.SetDirty.html
【AWS】オンプレ（物理マシン）からAWSに移行するには

# はじめに

- 本記事は、オンプレからAWSに移行する方法について検討した内容です。

# オンプレ（物理マシン）の制約について

- 以下AWSドキュメントにあるように、AWSに移行するには仮想OSイメージからという制約があると思っていました。
- 物理マシンサーバーのOSイメージを、一度、仮想化したあと、仮想OSにインポート。その後、AWSに移行しなければならない。

> P2V 変換の結果として作成された VM はサポートされません。P2V 変換は、物理マシンで Linux または Windows インストールプロセスを実行し、その Linux または Windows インストールのコピーを VM にインポートすることでディスクイメージを作成するときに行われます。
[AWS ドキュメント  Amazon EC2  ユーザーガイド  VM Import/Export の要件](https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmie_prereqs.html)

# では、どうするか？
- それで、まあ『サードパーティーの「CloudEndure」を使用しないといけないな』と思っていました。
- が、AWSに買収されて、2019年1月から[CloudEndure Migration が無料で利用可能に](https://aws.amazon.com/jp/about-aws/whats-new/2019/06/cloudendure-migration-available-at-no-charge/)なっていたんですね。

# CloudEndure
- 90日間有効の無料ライセンスとなっています。
- 移行時にエージェントに「CloudEndure」を無料ライセンスでインストールしますが、有効期間は90日間ですが、[移行が遅延した場合も、CloudEndureアカウントを再発行すれば延長して使用できます](https://migration-register.cloudendure.com/)ので、実質無料のようです。
- 2019年現在、AWS、Azure、GCPといった主要クラウドに対応しているようですが、AWSに買収されたので、今後Azure、GCPなどのサポートがどうなるかは不明です。

# 余談(GCP、Azureの移行ツール)
- GCPの移行ツールとしては、CloudEndureの他に、Googleが買収したVelostrataが有るようです。
- Azureの移行ツールとしては、 Azure Migrateが有るようです。

#補足
本記事は、[Qrunchの自分のブログ](https://ijx9721up5ixft9z.qrunch.io/entries/7gljDj8RgERkYCQ0)から記事を引っ越したものです。
さくらのVPSにてFTP・SSH等が接続できない

#さくらのVPSにてFTP・SSH等が接続できない

#概要
ポート変更したvsftpdが接続できなくて
２時間くらい悩んでしまったので無駄にしないため、記事にしました。

#原因
さくらのVPSコンパネでパケットフィルタが有効になっていた！
firewalldで空けたポートがnmapコマンドで見えていなくて気が付いた。。
コンパネからOSインストール時にチェックしてしまっていたのでしょうね。
コンパネからパケットフィルタを無効に設定しなおせば、大丈夫！！
（こんな機能いらないよな・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488456/530c68bb-147f-58fb-87d8-7fec7a5bce20.png)
[ASP.NET] appsettings.jsonの使い方

メモレベルの投稿ですが、`appsettings.json`の使い方

# 環境

- Visual Studio
- C# ASP.NET CORE 

# `appsettings.json`とは

文字のごとく、アプリの設定ファイルになります。開発環境、テスト環境、本番環境などで参照するサーバーやサービスを変更したいときに使います。

`appsettings.json`をローカル環境に利用
`appsettings.Development.json`を開発環境に利用

とわけることができます。

`Azure Web App`を使っている場合は、サーバー側でも設定することができます。


# 利用方法

## appsettings.jsonを編集

下記のようにな`appsettings.json`を保存します。これで各環境にあったアカウントに接続します。

```json

{
  "ConnectionStrings": {
    "DefaultConnection": "ここにコネクション文字列"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "AzureAppServices": {
    "Storage": {
      "AccountName": "ここにアカウント名",
      "ConnectionString": "ここに接続文字列"
    }
  }
}
```


## クラスを定義

先ほど編集したappsetting.jsonを受けるクラスを定義します

AzureKeysの部分をマッピングする想定です。

```csharp
public class AzureSettingsModel
{
　　AzureStorageSettingsModel Storage { get; set; }
}

public class AzureStorageSettingsModel
{
  public string AccountName { get; set; }
  public string ConnectionString { get; set; }
}
```

## Startup.csにて設定

まずはStartup.csにて値をマッピングします。

```csharp

public void ConfigureServices(IServiceCollection services)
{
  // Add our Config object so it can be injected
  services.Configure<AzureSettingsModel>(Configuration.GetSection("AzureAppServices"));
}
```

## DIで設定

次は使いたいときに、
下記のようにDIを使って環境ごとに設定された値を取得することができます。

```csharp

public class IndexModel : PageModel
{
    private readonly IConfiguration _config;

    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    // The _config local variable is used to obtain configuration 
    // throughout the class.
}
```


# 参照

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1
Unity 現在のシーンを取得する。

```
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEditor;

public class Sample
{
    [MenuItem("MyTools/Sample")]
    public static void Main()
    {
        var currentScene = SceneManager.GetActiveScene();
        
        // Sceneの名前を表示。
        Debug.Log(currentScene.name);
    }
}
```
![GetCurrentSceneSample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328087/d9f07fcd-1166-b6c4-726c-6e50674df042.gif)
ネットワークエンジニア視点のAWS  AWS Provided DNS & Route 53

  ネットワークエンジニア的にはDNSはDNSサーバーまで到達できればOKな感じなのですが、
AWSの場合はDNSでのルーティングがキーの一つかなと思いましたので、
色々と触ってみました。というか、DNSが２つあるし。

それぞれの概要はこんな感じ？
＊Amazon Provided DNS
　　VPC毎に自動で起動。VPCのネットワークアドレスに2を追加したアドレスを持つ

＊Route 53
　AWS提供のDNS。
　　　Public: 通常のInternet上のDNSと同じ
　　　Private: VPC用？

とりあえずVPCを2つ作成。VPC-tame(10.0.0.0/16)とVPC-tame1(10.1.0.0/16)
それぞれEC2を起動して名前解決がどのように行われるかを調査。
VPCの”DNS resolution”, “DNS hostname”は共にenable
(なおWindowsで実施。。。)

まずは、VPC-tame1(10.1.0.0/16)上のインスタンス(10.1.1.1)から
VPC-tame(10.0.0.0/16)のインスタンス(10.1.1.89 )
に対するアドレス解決(& 同一VPCの10.0.1.52に対しても)
<img width="450" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/eacf30b4-481e-bd36-864e-a8f7314f93d7.png">
問題なく行われているので、AWSアカウントが同じ場合はAWS Provided DNSでVPC間の名前解決も可能？
なんかしっくりこないのですが、まあこうゆうものと考えましょう。

次にRoute 53。VPC向けはhosted zoneのようなので、VPC-tame1(10.1.0.0/16)に関連付けした
Route 53 Hosted Zoneを作成。
DNS名は適当。使われて無いのを選びました(ちなみに、すでに削除済みなので黒塗りとかは無し)。
<img width="549" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/fa65eb9d-22ad-c2f8-84a7-bca9f0ce6145.png">
関連付けしたVPC-tame1からはtest.z1s2d3c4.com参照可能。
(使用したインスタンスのDNSはAWS Provided DNSの10.1.0.2)
つまり、AWS Provided DNSにはRoute 53 hosted zoneへのフォワーダー設定が自動で入っている？？？
<img width="361" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/dc5ea973-5e99-18c2-3ddd-343e035bb208.png">
ちなみにVPC-tame(10.0.0.0/16)内のインスタンスからは参照出来ない。
Route 53 hosted zoneは関連付けしたVPCのみ有効って事で、これは納得。
<img width="669" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/64969c3b-f846-3482-404b-187b71427072.png">
念のためVPC-tameも関連付ける事で参照可能になりました。
<img width="803" alt="Screen Shot 2020-01-05 at 10.50.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/c8402e5e-c09e-8298-e5c6-ffe9c157f272.png">
<img width="439" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/f927eaa6-248b-daed-88fc-93b83640ab1a.png">

当然の動作確認として、VPCの"DNS resolution"がenableで無い場合は
DNSの解決が同じVPC内であってもNG
<img width="515" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/c42637c1-8f89-0f62-cd3d-c87e320379e8.png">

ついでにInterface型endpointをVPC-tame1内に作成、アドレス解決出来るか確認。
<img width="558" alt="Screen Shot 2020-01-05 at 10.53.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/fb277235-6607-6d68-3928-53ca55040bf7.png">
VPC-tame, VPC-tame1内から共に確認可能。
<img width="566" alt="Screen Shot 2020-01-05 at 10.57.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200070/ef8bc450-9d1d-6b94-5e0f-16f460c39112.png">

ここで疑問が
・VPC内でDNSをenableにしなかった場合で(AWS Provided DNSは使わない)、Route 53のみを使う場合
　の参照先DNSサーバーのアドレスは？？？そもそもこうゆう使い方は想定外？

ちなみにインスタンスに付与するZDHCPサーバーの変更はVPC Dashboard内のDHCP Option setの指定で
変更出来る事は確認。
久々にcloud9でWordPressの開発をしようとしたらエラーが出た

日頃派遣の仕事をしているので、ITの開発の仕事が思うようにできず、せっかくAWSでcloud９の環境を作っていても、放置状態でした。
お正月休み最終日にWordPressのテンプレート制作に着手したいと思い、cloud9にアクセスしました。

早速IDEを起動したら、データーベースが動いていない系のエラーが出てしまいました。
仕方がないので、一旦cloud9自体を削除して、新しく作り直しました。

下記の記事を参考にしました。
https://digitalcontent.tokyo/aws-cloud9-wordpress/

私は、すでにセキュリティの関係があり、IAMでユーザーを作ってcloud9とEC2のみの権限を与えていました。

今回参考にした記事では、AmazonのLightsailを使うと簡単に環境を作る事ができると説明がありました。
早速、公式ページで確認しました。
https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/lightsail-instances.html

ただIAMにLightsailの権限がないと、403エラーになります。
403エラーページにある権限の説明のページのリンクを確認して、適宜設定してください。

Lightsailは、初月の30日は無料のようですが、あとは、料金が発生します。
そのため、私は、従来通りEC2でcloud9で環境作ることにしました。

コンソールには、cloud9があるので、新しく作るのボタンから進みEC2などの設定もやり直しました。

##WordPressインストールして、いざ、MySQLを起動
MySQL起動したら、パスワードを聞いてきました。
私は、最初戸惑ってしまいましたが、こちらの記事を読んで、エンターキーで進みました。

https://qiita.com/acecrc/items/a72992a17968d3d9bc00

```
mv wp-config-sample.php wp-config.php
```
なぜか、エラーになりました。
それで、wp-config-sample.phpの内容を書き換えて、wp-config.phpに名前を変えました。

##cloud9のRunボタンをクリックしてもスタートしない
Runボタンをクリックしても、スタートしないので悩みました。
WordPressのファイルがある階層を一番上に移動して、index.phpをクリックして、Runを指定して、起動しました。

そして、無事にインストールする事ができました。

##MySQWLが生きているか確認する方法
色々ネットで調べている中で、この記事を見つけました。
MySQLが生きているか確認したい時に、役立つと思います。

[対象方法:ワードプレスで「データベース接続確立エラー」Error Establishing a Database Connectionと表示されたときは？](https://wp-doctor.jp/blog/2019/08/26/%E5%AF%BE%E8%B1%A1%E6%96%B9%E6%B3%95%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9%E3%81%A7%E3%80%8C%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%8E%A5%E7%B6%9A%E7%A2%BA%E7%AB%8B/)
超備忘録

#### Google Driveでショートカットを作成

```
フォルダを選択して「Shift+Z」
```


#### 拡張子を削除

```shell
${filename%.*}
```


#### 数字にマッチするワイルドカード

```shell
*-+([0-9]).pdf
```

#### PDF をページ分割

```shell
pdfseparate original.pdf out-%02d.pdf
```


#### ログファイルを日時で名前付け

```shell
`date +%Y%m%d_%H%M%S`.log
`date +%y%m%d_%H%M%S`.log
```

#### 好きなログフォーマット

```python
basicConfig(
    level=20,
    format="[%(levelname).1s|%(asctime).19s] %(message)s"
)
```

```python
basicConfig(
    level=20,
    format="[%(levelname).1s|%(asctime).19s] %(message)s",
    handlers=[StreamHandler(), FileHandler("logfile-path.log")]
)
```

#### パスワード付きZIPを作る

```shell
zip -rev zipfilename.zip file1 file2, ...
```

#### PyPI へアップロード

```shell
rm -r build dist *.egg-info   # second time or later
python setup.py sdist bdist_wheel
twine upload --repository pypi dist/*
```

#### Jupyter notebook のモジュールリロード設定

```python
%load_ext autoreload
%autoreload 2
```

#### Jupyter でsys.pathの不足分を追加 (venv環境を認識しないときなど)

```python
import sys
ps = !python -c "import sys; print('\n'.join(sys.path))"
for p in ps:
    if p not in sys.path:
        sys.path.append(p)
        print("Added '{}' to sys.path".format(p))
```

#### Jupyter notebook 補完機能回復

```python
%config Completer.use_jedi = False
```

#### Python パッケージをPYPIへアップロード

```shell
python setup.py sdist bdist_wheel
twine upload dist/*
```


#### Gitで特定のSSH鍵を指定する

```shell
# clone
git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

# set to an existing local repo
git config core.sshCommand 'ssh -i private_key_file'
```

#### 画像をリサイズ

```shell
convert <original file> -resize 96x96! <output file>
```


#### PDF -> PNG

```shell
pdftoppm -png -r 300 original.pdf output-prefix
```



#### Ubuntu, R package が依存するソフトウェア

```shell
sudo apt install libcurl4-openssl-dev libxml2-dev libssl-dev libfontconfig1-dev \\
  libcairo2-dev　libgtk2.0-dev libcairo2-dev xvfb xauth xfonts-base \\
  libxt-dev libfftw3-dev libtiff5-dev libmagick++-dev
```

For

```R
install.packages(c(
  "devtools", "magrittr", "dplyr", "ggplot2", "readr", "Rcpp", "openxlsx",
  "DBI", "RSQLite", "sqldf", "readxl", "combiter", "stringr", "striprtf",
  "reshape2", "tidyr", "ggiraphExtra", "GGally", "ggfortify", "gridExtra",
  "IRkernel", "testthat", "imager", "gitlabr", "RSelenium",
  "tidyverse", "robotstxt", "magick"
))
```
cweill/gotestsでtestifyを利用する

## 動機

プロダクトコードから[TableDrivenTests](https://github.com/golang/go/wiki/TableDrivenTests)に基づいたテストコードを生成してくれる [cweill/gotests](https://github.com/cweill/gotests)では値の比較はreflect.DeepEqualを用いている． testifyを利用することができるようになったようなので試す．（[PR#109](https://github.com/cweill/gotests/pull/109)）

## 手順

### CLI

```bash
# reflect.DeepEqual
$ gotests -w -only Hello hello.go -exported hello_test.go

# stretchr/testify/assert
$ gotests -w -template testify -only Hello hello.go -exported hello_test.go
```

### エディタ

VSCodeの場合settings.jsonに下記項目を追加する．

```json
{
    "go.generateTestsFlags": [
        "-template",
        "testify"
    ]
}
```

## 参考

* [cweill/gotests](https://github.com/cweill/gotests)
Unity シーン内のオブジェクトを取得する。

```
using UnityEngine;
using UnityEditor;

public class Sample
{
    [MenuItem("MyTools/Sample")]
    public static void Main()
    {
        // Scene内からtypeを元に探してくる。
        // GameObjectを取得したいMonoBehaviorなどに変更すればそれが取れる。
        var gameObjects = (GameObject[])Object.FindObjectsOfType(typeof(GameObject));

        foreach (var obj in gameObjects)
        {
            Debug.Log(obj.name);
        }
    }
}
```
![GetObjectFromSceneSample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328087/b50c4914-9c57-8af6-99a0-1e97ca9ffe7c.gif)


参考
https://answers.unity.com/questions/329395/how-to-get-all-gameobjects-in-scene.html
Open a URL in a new tab

I'm trying to open a URL in a new tab, as opposed to a popup window.

I've seen related questions where the responses would look something like:
```js

window.open(url,'_blank');
window.open(url);
```


Nothing an author can do can choose to open in a new tab instead of a new window; it is a user preference.

CSS3 proposed target-new, but the specification was abandoned.

The reverse is not true; by specifying dimensions for the window in the third argument of window.open(), you can trigger a new window when the preference is for tabs.

Ref：https://www.coder.work/article/4624
【The server quit without updating PID file 】を解決する(参照多め)

昨日まで使えていたMysqlが、唐突に起動しなくなったため備忘録として、今後も使えるよう参照を多めにして残します。
初心者向けです。


## 環境

`mysql  Ver 8.0.17`
`Rails 5.2.4`

## はじめに

昨晩までRailsで開発しており、起床して作業しようとするとRails s が出来ない。PCが何故か再起動されていた(普段はスリープ)
こんなことはよくある話で、PCを再起動したりするとmysqlを再起動させる必要があります。

```
mysql.server restart
```
で大抵直るのが大半。以後、`msr`と書きます。


```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/[ユーザー名].local.pid).
```

とのエラーが発生😨

## 考えられる原因

参照 : [The server quit without updating PID file　mysqlエラー解決方法](https://qiita.com/kazu_wsx/items/bb787e9e4e919da03705)

>こちらのエラーの出現理由ですが、mysqlのバージョン切り替え時に出現すると思われます。
私はmysqlを使っていたので、brewのupdateを行った際にmysqlがアップデートされてしまいました。
mysqlのバージョンを切り替え　→　前のmysqlバージョンで使用したデータを使って起動した時に出るようです。

参照 : [mysql 起動時のThe server quit without updating PID file エラーの回避法](https://qiita.com/jonakp/items/477a18d4a94c01a31583)

>そもそもpidファイルが存在していない。
pidファイルに適切な権限が設定されていない

私の場合、特にupdateしたわけでもないので原因は未だ謎ですが、もしupdateした場合は下記の内容以外にも試す必要がありそうです。

## 解決しなかった方法

### 【1】PC再起動
とりあえず、PCを再起動してみる。結構これで直ること(mysqlに関わらず)もあるのでとりあえず試してみます。

`msr`してみても
下記全部試すもエラー文変わらず。

`mysql.server restart`
`mysql.server start`
`sudo mysql.server restart` → sudoは 「superuser root doの訳」

### 【2】PID fileを作成
参照 : [MySQL起動できなくなった　The server quit without updating PID file](https://qiita.com/yuki0208/items/1d5554d98e9ec76084bd)

エラー文から、どうやら「mysql配下のpidがないよ」と言われているので、

`cd` で `/usr/local/var/mysql`まで潜り`ls`で確認。

その後、findコマンドで検索。(ご自身のユーザー名「`uname -n`で確認可能できる」で検索してください)

```
[PC名] mysql % find [PC名].local.pid
find: [PC名].local.pid: No such file or directory
```

ファイルがないと言われているので、一旦作成してみる。(PC名は、[PC名].local.errがあるはずなのでそのPC名のところです)

```
[PC名] mysql $ touch /[PC名].local.pid
```
また`msr` してみる
エラー文変わらず。
`vim [PC名].local.pid` で確認しても空のファイルなので、何か記載がいるんだろうと推測するも解決には至らず。
ちなみに、`err`の方にはぎっしり色々書いてある。

### 【3】権限変更

参照 : [mysql起動で「The server quit without updating PID file」](https://qiita.com/mogetarou/items/e34ca51d3756d55d7800)

下記記事を参考に、権限がなくて落ちているらしいので一旦、権限を自分からmysqlに変更してみる

```
[PC名] mysql $sudo chown -R _mysql:_mysql /usr/local/var/mysql
```


権限が変更する際にパスワードが要求されるので、入力する。
`msr`で試す。

ちなみに、権限が変更されてるか確認したい場合は、`mysql`から一つ戻り`var`の階層で

```
[PC名] var $ ls -l
```
をして `mysql`のところの権限が`mysql`になっていればOK。

また、権限を戻したければ下記のコマンドでもとに戻ります。

```
[PC名] mysql $ sudo chown -R [PC名]:_mysql /usr/local/var/mysql
```

### 【4】プロセス確認

参照 : http://tech-outlines.hateblo.jp/entry/2015/03/24/180940

Railsでもプロセスをkillすることがあるので、それで治ったらいいと期待を込め、

```
ps -alx | grep mysql
```

で試してみる。。このコマンドを打った時に走るプロセスしかない → 起動していないと解釈

```
 501  3679   598     4006   0  31  0  4278536    716 -      S+                  0 ttys009    0:00.00 grep mysql
```

## 結果

どうしても解決に至らず、mysqlを再インストールすることで解決しました。

https://qiita.com/akiko-pusu/items/aef52b723da2cb5dc596#homebrew%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%86%8D%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B
CodePen: HTML+JavaScriptで波形生成して聴覚テストっぽいものをつくってみた

200Hzだけ聞き取りづらかったので音量上げてます。

※JavaScriptについては、わたしはほぼ素人です。テキトウにコード書いているのであまりマネしないようにおねがいします。

<b>音量注意！</b>

<p class="codepen" data-height="350" data-theme-id="default" data-default-tab="js,result" data-user="kob58im" data-slug-hash="VwYroXb" style="height: 350px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="SoundMakeTest">
  <span>See the Pen <a href="https://codepen.io/kob58im/pen/VwYroXb">
  SoundMakeTest</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

Microsoft Edgeだと再生直後に必ず音が一瞬途切れる。Chromeだと問題なかった。

# 参考サイト

+ [JavaScriptで生成した波形をHTML5のaudioで再生](https://wentwayup.tamaliver.jp/e412166.html)<br> (右記のQ&Aサイトから辿り着けました：[JavaScriptにおけるリニアPCMの再生(DOCOMO音声合成API)](https://teratail.com/questions/128788))
+ [Blob URL Scheme について - JavaScriptプログラミング講座](https://hakuhin.jp/js/blob_url_scheme.html)
+ [ブラウザピアノ](https://mike3.net/piano/android.html)
総ファイルサイズ

```
du -hs ディレクトリ
```

or

```
find 対象ディレクトリ -type f -printf '%s\n' | awk 'BEGIN{sum=0}{sum+=$1}END{print sum}'
```

引用:
https://yohgami.hateblo.jp/entry/20140721/1405926640
Unity メニューからプログラムの実行

```
using UnityEditor;

public class Sample
{
    [MenuItem("MyTools/Sample")]
    private static void Main()
    {
        UnityEngine.Debug.LogError("This is Sample");
    }
}

```
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328087/eca78f45-1934-7647-a8c4-434ee5275941.gif)
「文言」でレンダリング-邪道ですが漢文に挑戦　後編

## 前書き

「漢文」を観賞したい方一定数いらっしゃるのではないでしょうか。理系の多いであろう技術サイトでも皆無では無いと信じこの記事を公開させていただきます
内容の薄い物を引っ張った形にしてすいません
でも、この記事では割愛しますが前編の後、レンダリングのソースを読んだり、デバッグ環境整えたり、結果出力(plotResult)を利用したり、連続で出力できるようにテスト書いたり試行錯誤しました。
技術的には内容が薄いですが、漢文レンダリングツールとして、手段としてのノウハウとして、この記事が少しでも参考になればと思います

## はじめに

[前回「漢文」のレンダリングに挑戦](https://qiita.com/libru1/items/9d7f17cea17ef2a68628)しました。美しいレンダリングに満足はしたものの、改行出来ず空白も詰まってしまい物足りなさを感じました。
空白っぽく見える文字で埋めたらいいのでは無いかと思い、代替文字を探してみました

## 実行
なんと全角のスペースは詰まらず美しくレンダリング出来ました。灯台下暗しです

```sh
$ cat examples/春暁.txt
␣春暁␣␣␣␣␣␣␣␣␣␣孟浩然␣␣␣␣␣␣␣␣␣␣
春眠不覚暁␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
処処聞啼鳥␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
夜来風雨声␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
花落知多少␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
$ wenyan examples/春暁.txt -r --title "春暁 孟浩然"
/xxxxxxxx/examples/春暁.svg
```
<img width="406" alt="Screen Shot 2020-01-04 at 16.26.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334227/b7ccc025-c00d-052d-a691-40fd37a54aff.png">

おおっ!見た目改行した形でレンダリング出来ました
一行は26文字に合わせて全角スペースで調整すればバッチリです

## おわりに

今回はテキストファイルで出力しました。簡単に好きな漢詩を好きなだけレンダリング出来ます。幸せ:relaxed::heart:
訳などコメントの形で入れると上部に赤い文字で表示されたり、前回の句点はルビのように右側に表示されたのでそれを利用して..。いろいろ妄想は広がりますが、手軽さと美しさのバランスで、お手軽に観賞するには最適かと思います。お試しあれ!
Panasonic DMR-BRX2000の動画再生機能で複数音声のmp4ファイルは最終トラックが優先される

#発生した問題
1. 複数音声(主音声+副音声)が存在するDVDをHandbrakeで「--all-audio」オプションでmp4エンコードする。(mp4マルチオーディオ)
2. DMR-BRX2000の「User_area」上でmp4ファイルを再生すると、最終音声トラックが再生される(DMR-BRX2000上では音声トラックを変更できなかった)。

#解決策
「--all-audio」を使用せず、「--audio」オプションで手動で設定し、再生したい音声トラックを一番最後に持ってくる。

#コマンド例

##誤
```shell
HandBrakeCLI -i "YourDVD.ISO" -e x264 -r 29.97 -q 22 --vfr --all-audio -E aac -R 44.1 -X 720 --all-subtitles -O -t 2 -o output.mp4
```

##正
```shell
HandBrakeCLI -i "YourDVD.ISO" -e x264 -r 29.97 -q 22 --vfr -a 2,1 -E aac -R 44.1 -X 720 --all-subtitles -O -t 2 -o output.mp4
```
ngx_mrubyで環境変数からPORTとTCPの接続先を決定したい

## 何がしたい
- TCPの接続先を環境変数から決定したい
- TCPで受けるサーバのポートを環境変数から決定したい

## どうする?
ngx_mrubyを使って解決する

### TCPの接続先を環境変数から決定したい
まず環境変数を

```bash
$ export BACKENDS="172.17.0.3:9999,172.17.0.2:9999"
```
と設定しておくこの環境変数を読んでTCPの接続先を決定してほしい.
### nginx.confを編集する
nginxでは環境変数を受け取る仕組み?があります.
それが`env 環境変数;`です.これをやっておかないと,ngixで環境変数を使えないので注意.
そうするとnginxのmruby内でBACKENDSを使えるようになる.

```
worker_processes  1;

env BACKENDS;
env LISTENER;

events {
    worker_connections  1024;
}
error_log   logs/error.log  debug;

stream {
    # proxy_protocol off;

    upstream tcpback {
        server 172.17.0.4:8888;
    }

    server {
        mruby_stream_server_context_code '
            Nginx::Stream.add_listener({address: ENV["LISTENER"]})
        ';

        mruby_stream_code '
            backendList = ENV["BACKENDS"].split(",")
            t = Nginx::Stream::Connection.new "tcpback"
            t.upstream_server = backendList[rand(backendList.length)]
        ';
        proxy_pass tcpback;
    }
}
```

`backendList = ENV["BACKENDS"].split(",")`の部分が環境変数を取得してリストにしているところです.
それをランダムにTCPサーバに接続させる処理をしています.
詳しく知りたい方は -> https://hb.matsumoto-r.jp/entry/2015/11/03/173605
これで環境変数から後ろにあるTCPサービスに接続させてくれます.

### TCPで受けるサーバのポートを環境変数から決定したい
環境変数を取得するためにあらかじめ`$ export LISTENER="0.0.0.0:2565"`と設定しておく.
そうするとngx_mrubyで受け取れるようになるので

```
mruby_stream_server_context_code '
    Nginx::Stream.add_listener({address: ENV["LISTENER"]})
';
```
Nginx::Stream.add_listenerに環境変数LISTENERの値を渡してあげると待ち受けるポートを環境変数から決定することができます.

## まとめ
環境変数でngixの接続先と待ち受けるポートの二つを決定することができるようになりました.
割と簡単にできて自分でもびっくりしてます.
まだまだよく分からずに使っている部分もあるので今後さらに理解できればいいなぁと思ってます.

全体のコード

```
worker_processes  1;


env BACKENDS;
env LISTENER;

events {
    worker_connections  1024;
}

error_log   logs/error.log  debug;
http {
    server {
        listen       8837;
        server_name  localhost;
        location /mruby {
            mruby_content_handler_code '
            
            backendList = ENV["BACKENDS"].split(",")
            for i in backendList do
                Nginx.echo i
            end
            ';
        }
    }
}

stream {
    # proxy_protocol off;

    upstream tcpback {
        # server 172.17.0.3:8888;
        server 172.17.0.4:8888;
    }
    # backendList = ["172.17.0.3:8888","172.17.0.4:8888"]　

    server {
        mruby_stream_server_context_code '
            Nginx::Stream.add_listener({address: ENV["LISTENER"]})
        ';

        mruby_stream_code '
            backendList = ENV["BACKENDS"].split(",")
            c = Nginx::Stream::Connection.new "tcpback"
            c.upstream_server = backendList[rand(backendList.length)]
        ';
        proxy_pass tcpback;
    }
}
```


## 参考
- https://hb.matsumoto-r.jp/entry/2015/11/03/173605
- https://github.com/matsumotory/ngx_mruby
UiPathの導入検討

###UiPathの導入検討

RPAの導入検討で、組織的にRPAを活用してもらうための下地作り。

###背景
UiPathアカデミーのビデオを学習したり、先人の方々ブログを拝見して得た知見をまとめて
開発メンバー向けの約束事の下書きを残したい。（適時アップデートする）

###１．シナリオを作成する

###２．ユニットで共通化を図る
- ログ記録シーケンス
- エラー発生時のメール送信シーケンス

###３．ロボット作成時の基本ルールを作成する
- アクティビティの名前はシナリオ動作に合わせる
- シーケンス内のアクティビティの数はすぐにデバックが容易な範囲に抑える
- 速度よりエラーの少ない安定した手法を選ぶ
- Main部の作り

 ・try-catchアクティビティを配置
 ・try句にフローチャート（xaml）を呼び出し
 ・catch句にログメール送信アクティビティを配置
【サンプルロボ】表の列と行が交わるセルを動的に特定して値を取得するロボット

【アルゴリズム】
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f015024a-90d6-9978-a630-f4e93fcc9e66.png)

【ポイント】
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d2cb6c7d-62e5-c6c3-90a3-0188ff1e1d4d.png)
詳細とすると列と行の一致するセルを抽出できる

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/8597ca03-fc35-5d17-cb11-1902fdcfc7f8.png)
こんな感じ

でも、エクセルでやれるかは試さないといけない
cscの作法 その37 シリアル

#概要

cscの作法、調べてみた。
練習問題やってみた。

#練習問題

シリアルポートを読め。

#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO.Ports;

class form1: Form {
	form1() {
		Text = "serial";
		ClientSize = new Size(300, 200);
		SerialPort port1 = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
		port1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
		port1.Open();
	}
	private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
		SerialPort sp = (SerialPort) sender;
		string indata = sp.ReadExisting();
		Console.Write(indata);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}



```

以上。
【ファインダー】「タグパターン」について

https://knowledge.bizrobo.com/hc/ja/articles/360030986951-DS%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95
↑ここのページに記載あり

以下抜粋
「・「タグ パターン」項目

タグが一致しなければならない特定のテキストかHTMLを設定します。
「シンボル」は特殊文字を簡単に入力するための機能です。
「編集」ボタンをクリックすると編集エディタが開かれ、パターンが正しく稼働するかを確認することができます。

 
＜例＞複数のページを毎回「次へ」をクリックして遷移するとします。

この場合、1ページ目と2ページ目以降では作りが違うため、1ページ目のタグパスで「次へ」ボタンを指定しても2ページ目以降は正しく「次へ」ボタンがクリックされません。」

【考察】
・try catchを使って一致しなければ、別のステップでクリックするようにすればいいと思う。

【サンプル】
「表の列と行が交わるセルを動的に特定して値を取得するロボット」
のサンプルロボより
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/779a58dd-4e65-52e5-dbea-a6032744da54.png)
コンバータを使って一致する部分を抽出することも可能
cscの作法 その36 生http

#概要

cscの作法、調べてみた。
練習問題やってみた。

#練習問題

webserver立てて、生httpを取得せよ。

#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;


class form1: Form {
	form1() {
		Text = "server";
		ClientSize = new Size(200, 200);
		Button btn1 = new Button();
		btn1.Location = new Point(50, 50);
		btn1.Text = "test";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		TcpListener server = null;
		try
		{
			Int32 port = 80;
			IPAddress localAddr = IPAddress.Parse("127.0.0.1");
			server = new TcpListener(localAddr, port);
			server.Start();
			Byte[] bytes = new Byte[4096];
			String html = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 64\r\n<!DOCTYPE html><html><body><h1>it's work!</h1></body></html>\r\n";
			String data = null;
			Console.Write(">Waiting for a connection... ");
			TcpClient client = server.AcceptTcpClient();
			Console.WriteLine(">Connected!");
			NetworkStream stream = client.GetStream();
			int i;
			i = stream.Read(bytes, 0, bytes.Length);
			data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
			Console.WriteLine(">Received: {0}", data);
			byte[] msg = System.Text.Encoding.ASCII.GetBytes(html);
			stream.Write(msg, 0, msg.Length);
			Console.WriteLine(">Sent: {0}", html);
			client.Close();
		}
		catch(SocketException d)
		{
			Console.WriteLine("SocketException: {0}", d);
		}
		finally
		{
			 server.Stop();
		}
		Console.WriteLine(">ok");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
CentOS8 - Install - imwheel

## imwheelインストール
- CentOSにて、マウスホイールの回転量を調整したい時に便利

### imwheelダウンロード
- 以下よりrpmをダウンロード
    - [このへん](http://rpm.pbone.net/index.php3/stat/4/idpl/15160595/dir/redhat_el_6/com/imwheel-1.0.0-4_pre12.el6.x86_64.rpm.html)

### imwheelインストール
~~~
$ sudo yum install (ダウンロードしたrpmのパス)
~~~

### 設定ファイル作成
- 以下の内容で設定ファイル作成
    - ディレクトリ：ホームディレクトリ直下（/home/ユーザ名/ の直下）
    - ファイル名：.imwheelrc
    - 内容：下記参照

~~~
$ vim ~/.imwheelrc
~~~
~~~:.imwheelrc
".*"
None,      Up,   Button4, 4
None,      Down, Button5, 4
~~~
- 2、3行目の末尾の数値を任意の値に変更して調整（数値が大きいほど回転量が大きい）

### imwheel起動
~~~
$ imwheel
~~~

## imwheel自動起動
- このままでは、OSを再起動すると設定が元に戻ってしまう
- imwheelのサービスを作成し、systemdから自動起動を行う

### サービス作成
- 以下の内容でサービスファイル作成
    - ディレクトリ：/etc/systemd/system/
    - ファイル名：imwheel.service
    - 内容：下記参照
    
~~~
$ sudo vim /etc/systemd/system/imwheel.service
~~~

~~~:imwheel.service
[Unit]
Description=imwheel
Wants=display-manager.service
After=display-manager.service

[Service]
Type=simple
Environment=DISPLAY=:0.0
ExecStart=/usr/bin/imwheel
ExecStop=/usr/bin/pkill imwheel
RemainAfterExit=yes

[Install]
WantedBy=graphical.target
~~~

### 自動起動設定
~~~
// 自動起動の設定
$ sudo systemctl enable imwheel.service

// 自動起動の確認
$ systemctl list-unit-files -t service
~~~
- リスト内の以下の項目が enabled になっていれば自動起動状態
    - imwheel.service

## 参考
- [Ubuntuでマウスのホイールの回転量を調整する](https://qiita.com/yumetodo/items/de3ae4155ff83544879b)
- [CentOS7に手動でService登録を行う](https://qiita.com/walk8243/items/bd73e9b1dddeac0ab3d3)