OmniAICreator/Qiita-1.07M huggingface dataset:
ジンバルロックのシミュレーションを回す際の問題

#ジンバルロックとは
ジンバルロックがよく問題になると本に記述されますが、どのような問題があるのでしょうか
特異姿勢になると何が問題なのでしょうか

その答えは
**特異姿勢では任意の角速度ベクトルをオイラー角の時間微分で表現できない**
という事です。

#例
![Gyroscope_precession.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/dd3368e3-8a78-5345-40ee-9e893c5a21de.gif)
https://ja.wikipedia.org/wiki/%E6%AD%B3%E5%B7%AE!　より

このような、コマにたいしオイラー角を設定します。x-y平面は水平面、ｚ方向は上とします
z-y-zオイラー角は

1. z軸周りに$\theta1$回転　：　回転軸をx-y平面に投影したとき、**x軸方向と投影した回転軸との角度**
2. y軸周りに$\theta2$回転　：　**回転軸の傾き**,z軸との傾きです
3. z軸周りに$\theta3$回転　：  コマの回転軸周りの回転量です。

上のコマの例では
$\theta2$　は一定で回転して、$\theta1,\theta3$は時間に比例的に増加していきます(一定速度ということ)。![jinbal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/e93e1051-62b7-f5c6-5b57-286a721c7571.jpeg)



角速度ベクトルはその回転の軸方向になります。
$\dot{\theta1}$による角速度ベクトルはz軸方向になります。
$\dot{\theta2}$による角速度ベクトルはy'軸方向になります。
$\dot{\theta3}$による角速度ベクトルはz'軸方向になります。

角速度ベクトルから、$\dot{\theta1...3}$を求めようとするときにジンバルロックは問題になります。
変換する場合は、角速度ベクトルをz-y'-z'方向に分解すれば、それぞれの成分が$\dot{\theta1...3}$に相当します
![jinbal3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1d7c021a-9041-8109-dda3-78a7f6e26356.jpeg)


ほとんどの状態では、角速度ベクトルと$\dot{\theta1...3}$は相互変換可能です。
この時、ジンバルロックは$\theta2 = 0$の時、起こります。
$\theta2 = 0$は回転軸がz軸に対して傾いていない、回転軸とz軸は一致するという事です。
結果的に、この時$\theta1と\theta3$の回転は同じ方向になります。
![jinbal2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/449103f3-c2ab-e21e-c730-e64e429c2098.jpeg)
角速度ベクトルをz-y'-z'方向に分解する際、zとz'の方向が一致するため、次元の数が2つしかなくなってしまいます．2次元平面y'-z(=z')平面で角速度ベクトルを表現することは、角速度ベクトルの方向によっては$\dot{\theta1...3}$では、表現できないという事になります。
![jinbal4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/79a5fcb5-02f9-9bad-93ba-2830dd3fdfb9.jpeg)


シミュレーションを回す際は、角加速度が運動方程式から求まり、積分することで角速度が求まり、角速度をオイラー角の時間微分$\dot{\theta1...3}$に直し、オイラー角の時間微分を積分し、オイラー角を計算し、対称物体の姿勢と回転速度を計算します。
角速度は角加速度を積分しますが、姿勢によって決まった方向を取ることはなく、任意方向のベクトルを持つことになります。
よって、角速度をオイラー角の時間微分$\dot{\theta1...3}$に直す際，ジンバルロックの状態だと一部要素を捨てる事になる、または変換できていないという事になります。
上のコマの例だと、コマがx'方向に回転する角速度を持っていたとき、オイラー角の時間微分$\dot{\theta1...3}$では表現できません。

オイラー角を用いてシミュレーションを行うと、$\theta2 \fallingdotseq 0$という、完全に0ではない時、角速度ベクトルをオイラー角の時間微分に変換すると$\dot{\theta1}$または$\dot{\theta3}$が大きい値に飛びます。これも，シミュレーションを行う上で精度低下をもたらします．

以上がオイラー角を用いたシミュレーションの問題です。
クォータニオンや回転行列を用いた場合は、このような「角速度を姿勢変数の時間微分では表現できない」という問題は発生しません。
クォータニオンの変換方法は[ここ](https://qiita.com/hiRina/items/dcd1236402b0c5f88790)に投稿してます

<!--
#数学的メモ
-->
CUIとGUIの違い

##CUIとは
Character User Interface(キャラクターユーザーインターフェース)の略。

文字だけで操作するアプリケーション。
コマンドプロンプト等で見られる。対話式の処理。
最近はあまり使われない。

###ex

コマントプロンプトで ver で　Enter おすと、新しい行にうつる。



##GUIとは
Graphical User Interface（グラフィカルユーザーインターフェース）の略。

ボタンや入力欄が表示されて、マウスやタッチで操作する入力方式。
普段見ているパソコンの表示もGUI。
javaが動く手順について

##javaが動く仕組み

１.プログラムを記述
2.javaコンパイラがプログラムを変換
3.Java用ファイルが作られる
4.java仮想マシンがファイルを読み取る
5.プログラムとして動作する


2〜5を自動でしてくれる。
ベイズ推定とは何か？

# これは？

ベイズ推定の考え方を、問題を通して見ていきます。

# 問題

```text:問題
　「赤」と「青」の２種類のボールがあり、そのボールが合計10個ずつ入った袋が２つある。
　それぞれの袋に入っているボールの種類は以下の通り。

　　袋A ： 赤、赤、赤、赤、赤、赤、赤、赤、赤、青　（赤： 9個、 青： 1個）
　　袋B ： 赤、赤、赤、赤、赤、青、青、青、青、青　（赤： 5個、 青： 5個）

　あなたは、上記の2つの袋から１つを選ぶ。
　その後、以下の動作を10回繰り返した。
　　・ 選んだ袋からボールを取り出して、色を記録した後、ボールを袋に戻す。
　
　その結果、取り出されたボールの色は以下の通りであった。
　　・ 赤、青、青、赤、青、赤、赤、青、赤、赤

　あなたが選んだ袋は、「袋A」と「袋B」のどちらであるか？
```

この問題の答えとして、「袋Bを選んだ」可能性が高いと思われます。
もし「袋A」を選んでいたのであれば、青いボールが取り出される確率はわずか10%であるため、10回中4回も青いボールが取り出されることは考えにくいためです。

**⬆️ これがベイズ推定の考え方です**

# ベイズ推定とは
ある事象の結果から、その原因がどうであったかを推定する。
とある事象の結果を「D」、その原因を「θ」とした場合、原因「θ」の条件付き確率は以下の式で表すことができます。

```math
P(θ|D) = \frac{P(D|θ)・P(θ)}{P(D)}
```

従来の統計学の場合、とある「原因」が与えられた場合に、それによる「結果」の確率分布を求めるものです。
ベイズ推定は、とある「結果」から、その原因である「θ」の確率分布を求めます。そのため、P(θ|D)は「逆確率」または「原因の確率」とも呼ばれます。

# ベイズ推定で「問題」を解いてみる
先ほどのと同じ問題です。

```text:問題
　「赤」と「青」の２種類のボールがあり、そのボールが合計10個ずつ入った袋が２つある。
　それぞれの袋に入っているボールの種類は以下の通り。

　　袋A ： 赤、赤、赤、赤、赤、赤、赤、赤、赤、青　（赤： 9個、 青： 1個）
　　袋B ： 赤、赤、赤、赤、赤、青、青、青、青、青　（赤： 5個、 青： 5個）

　あなたは、上記の2つの袋から１つを選ぶ。
　その後、以下の動作を10回繰り返した。
　　・ 選んだ袋からボールを取り出して、色を記録した後、ボールを袋に戻す。
　
　その結果、取り出されたボールの色は以下の通りであった。
　　・ 赤、青、青、赤、青、赤、赤、青、赤、赤

　あなたが選んだ袋は、「袋A」と「袋B」のどちらであるか？
```

取り出されたボールの色を「結果」、選んだ袋を「原因」として、以下を求めたいと思います。

```math
袋Aを選んだ確率 = P(袋A|赤、青、青、赤、青、赤、赤、青、赤、赤)
```
```math
袋Bを選んだ確率 = P(袋B|赤、青、青、赤、青、赤、赤、青、赤、赤)
```
<Br>
ベイス推定の式で以下のように表せます。
※「赤、青、青、赤、青、赤、赤、青、赤、赤」が長いので、以降は「結果」と置きます。

```math
P(袋A|結果) = \frac{P(結果|袋A)・P(袋A)}{P(結果)}
```
```math
P(袋B|結果) = \frac{P(結果|袋B)・P(袋B)}{P(結果)}
```

<Br>
今回一番わかりやすいのは、「P(袋A)」と「P(袋B)」でしょうか。
これらは、「袋A」を選ぶ確率と「袋B」を選ぶ確率であり、特に問題では何も触れていないので、それぞれ半分ずつ（1/2）と見なすことにします。

```math
「袋A」を選ぶ確率 = P(袋A) = 0.5
```
```math
「袋B」を選ぶ確率 = P(袋B) = 0.5
```

<Br>
次に「P(結果|袋A)」と「P(結果|袋B)」ですが、これらは「袋A」を選んだとした上で結果が「赤、青、青、赤、青、赤、赤、青、赤、赤」となる確率と、その「袋B」バージョンです。
袋の中のボールの種類は分かっていますし、取り出したボールを袋に戻した後に再度取り出しを行うので、以下のようになります。

```math
「袋A」を選んだ上で「結果」となる確率 = P(結果|袋A) \\
= \biggl(\frac{9}{10}\Bigr)^{6} * \biggl(\frac{1}{10}\Bigr)^{4} ≒ 0.0000531
```
```math
「袋B」を選んだ上で「結果」となる確率 = P(結果|袋B) \\
= \biggl(\frac{5}{10}\Bigr)^{6} * \biggl(\frac{5}{10}\Bigr)^{4} ≒ 0.0009766
```

<Br>
最後に「P(結果)」ですが、これは結果が「赤、青、青、赤、青、赤、赤、青、赤、赤」となる確率です。
袋Aと袋Bの２つの袋がありますので、それぞれの袋を選び、その結果が「赤、青、青、赤、青、赤、赤、青、赤、赤」となる確率の合計となります。

```math
「結果」となる確率 = P(結果|袋A) * P(袋A) + P(結果|袋B) * P(袋B) \\
= 0.0000531 * 0.5 + 0.0009766 * 0.5 = 0.00051485
```

<Br>
これで全てのピースが揃いました。結果を求めていきましょう！

```math
P(袋A|結果) = \frac{P(結果|袋A)・P(袋A)}{P(結果)} \\
= \frac{0.0000531 * 0.5}{0.00051485} ≒ 0.0516
```
<Br>

```math
P(袋B|結果) = \frac{P(結果|袋B)・P(袋B)}{P(結果)} \\
= \frac{0.0009766 * 0.5}{0.00051485} ≒ 0.9484
```

<Br>
たいたい、95%の確率で「袋B」を選んだとの結果になりました！

# おわりに
今回は原因が全て分かっていましたので、楽に原因の確率分布を求めることができました。

しかし、現実では「結果」は分かっているけど、「原因」がよく分からない状態であったり、原因と考えられるものが多数存在し複雑に絡み合っていたりします。
そういう場合は、まず原因について仮説を立てて統計モデル作成するらしく、なかなか難しいようです。
WSL+Ubuntu18.04上でmatplotlibのグラフを表示させる(メモ)

# はじめに

WSL+Ubuntu18.04でpython3のmatplotlibのグラフが表示されなかったので、表示できるようにするまでにしたことをまとめます。

## 環境

- Windows 10 Home
- WSL+Ubuntu18.04
    - Python 3.6.9 + matplotlib (3.1.3)
- VcXsrv

# VcXsrvの導入

デフォルトではUbuntuにはGUI機能がないのでその機能を提供する X Server を導入します。 今回はフリーの X Server である VcXsrv を使用します。

## インストール

こちらからインストーラーをダウンロードします。
https://sourceforge.net/projects/vcxsrv/

インストーラーを起動したら設定はすべてデフォルトのまま「次へ」を選択しインストールを完了します。

## 起動

デスクトップ上のショートカットまたはスタートメニューから XLaunch を起動します。すべて設定はデフォルトのまま項目を進め起動を完了します。

起動できていると画面下のタスクトレイに表示されます。

# WSL側の準備

Ubuntuを立ち上げ以下のコマンドを実行しvimでファイルを開きます。

```bash
sudo vim ~/.bashrc
```

ファイルを開いたら末尾に次の設定を追加して保存します。

```bash
export DISPLAY=localhost:0.0
```

vimの操作が分からない場合は以下のコマンドでも同様の設定が可能です。

```bash
echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
```

設定が完了したらUbuntuを再起動するか以下のコマンドを実行し設定を読み込み直します。

```bash
source ~/.bashrc
```

設定できているかの確認は以下のようにできます。

```bash
echo $DISPLAY
# => localhost:0.0
```

# 動作確認

ここまでで導入は完了したので実際にコードを実行してみます。

```python
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.random.randn(100)
plt.plot(x, y)
plt.title('Random-Walk')
plt.show()
```

を実行するとウィンドウが表示されるはずです。

お疲れさまでした。

# 参考

- [WSLのUbuntu18.04でmatplotlibを使えるようにするまで](http://ai-gaminglife.hatenablog.com/entry/2019/04/29/204841)
- [WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)
- [WSL+ubuntu18.04+VcXsrv+OpenAI Gym 動くまでのメモ（修正）](https://qiita.com/antimon2/items/b1611dca09edcf93db03)
JavaScriptでArrayに対する破壊的メソッドを安全に使う方法

### これは何


@Shokorep さんにより、[JSの破壊・非破壊メソッドがまとまっている記事](https://qiita.com/Shokorep/items/929e2e66908eaa915286)が書かれていましたが、私のこの記事では「破壊的な関数をどうやって安全に使うか」という話を書こうと思います。

### 破壊的とは

対象となるArrayの中身を変えてしまうこと。
例えば reverse() ですと以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/522986b8-84ba-9ff3-5f5b-89707bf23545.png)

元のArrayであるarr1の中身が変わってしまっています。 

### 破壊的なものを安全に使う

一回配列展開をしてあげると元のArrayとは無関係になるので、安全に使用することができます。

##### スプレッド構文（`[...arr]`）を使う方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/3bef39b9-3250-d615-7107-de59849927c9.png)


##### `concat()` を使う方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/c85e4f01-7677-35f9-7029-4f0277371f2b.png)
[Angular] リアクティブフォームのvalueに型を定義する

リアクティブフォームのvalueがanyなのをどうにかしたい。
けどそんなに手間をかけたくない。。
そんな時に手軽に型を定義できる方法を発見したので共有します。

## 目的
https://angular.jp/api/forms/AbstractControl#value
これのanyをどうにかしたい。

## 簡単な型の定義方法

まずは、FormGroupを拡張した型定義用のclassを用意する。

```js
export class FormGroupTyped<T> extends FormGroup {
  get value(): T {
    return this.value;
  }
}
```

それを利用して、リアクティブフォームから値を取得する。

```js
// fromの型を定義しておく。
interface Form {
  hoge: string;
}

ngOnInit() {
  const form: FormGroupTyped<Form> = this.formBuilder.group({
    hoge: [''],
  });

  // Formで定義した型となる。  
  form.value.hoge; // => (property) Form.hoge: string
}

```

これでだけで型を与えることができました！
手軽に導入できるので個人的には気に入っています。
取得した値にTypeGuardをしたりする手間も省けますしね！

## 参考
https://github.com/angular/angular/issues/13721#issuecomment-441493880
1.6 Simulinkによる画像処理

# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)


# 概要


Simulinkはブロック線図モデリング・シミュレーション環境です。時間方向のシミュレーションに特化しており、動画像処理にも活用できます。下記の特徴があります。



   -  ブロック線図を置くことですぐに試して結果を見ることのできる 
   -  時間軸のシミュレーション (一時停止、ステップ実行) 
   -  各種アルゴリズムの容易な比較検討 
   -  シミュレーション中のパラメータ変更  が容易に可能 



対応ファイル：[I1_06_SL_video_intro_done.slx](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I1_06_SL_video_intro_done.slx)


# Simulinkモデルを開く


元となるSimulinkモデルを開きます。


```matlab:code
open_system('I1_06_SL_video_intro_done.slx');
```


![image_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/07ec69f3-3ae5-b8ba-f981-74dedace510f.png)



# 実行する


Simulinkのモデルを実行します。


![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/f8e2a4ea-0e62-6beb-3975-a0ab0c49f8b4.png)




# 実行結果


実行結果は下記のとおりです。動画に対してフィルタ処理やエッジ検出が実行されている様子が確認できます。



![I1_06_SL_video.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/d48810f7-f9cc-42b2-e691-644e39cf48d6.gif)




# まとめ


Simulinkによる動画像処理について紹介しました。




ブロック線図環境による可読性の高いモデリング、シミュレーション、実行結果の可視化が可能です。


# 参考

   -  [Simulink 入門](https://jp.mathworks.com/products/simulink/getting-started.html) 
   -  [Simulinkによる動画像処理の例](https://www.mathworks.com/help/vision/examples.html?exampleproduct=simulink) 

# 謝辞


本記事は @eigs さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。


# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)
Cloud9にPython+OpenCVの環境を構築する

AWS Cloud9にPython+OpenCVの開発環境を作りたい場合の環境構築手順です。
特に、各種インストールの部分が面倒だったのでまとめておきます。（ベストな方法かはわかりません、すみません。）

## EC2の作成
私は`EC2 instance type:t3.small`で作成しましたが、任意のインスタンスタイプを選んで作成してください。

## Cloud9インスタンスのボリュームを拡張する
t3.smallのデフォルトのボリュームは10GiBです。
これだと色々とインストールしている段階で容量が足りなくなるので、容量を拡張します。（容量が足りなくなるとインストール時に`No space left on device`）と表示されます。
拡張手順は以下の記事を参照してください。
https://qiita.com/ktrkmk/items/8cf1e100da2e717f3be2
私は一旦30GiBまで拡張しました。

## homebrewのインストール
以下のコマンドでインストールします。

```
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```
パスが無いと言われるので、以下のコマンドを順番に実行して対処します。

```
$ test -d ~/.linuxbrew && PATH="$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH"
$ test -d /home/linuxbrew/.linuxbrew && PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
$ test -r ~/.bash_profile && echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.bash_profile
$ echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.profile
```
実行できるか確認します。バージョンが表示されればOKです。

```
$ brew -v
Homebrew 2.2.11
Homebrew/linuxbrew-core (git revision 9d9624; last commit 2020-04-05)
```

## pyenvのインストール
以下のコマンドでインストールします。

```
$ brew install pyenv
```
実行できるか確認します。バージョンが表示されればOKです。

```
$ pyenv -v
pyenv 1.2.18
```
## Pythonのインストール
インストールしたいバージョンを指定して実行します。（今回は3.8.1です。）

```
$ pyenv install 3.8.1
```

インストールされているか確認します。

```
$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.8.1
```
`3.8.1`が表示されていますが、`*`が`system`の方についているので、これを変更します。

```
$ pyenv global 3.8.1
```
もう一度確認します。

```
$ pyenv versions
  system (set by /home/ec2-user/.pyenv/version)
* 3.8.1
```
`3.8.1`に`*`が移動していればOKです。

## bash_profileを編集する
ここで改めてPythonのバージョンを確認します。

```
$ python --version
Python 3.6.10
```
恐らく、元のPythonバージョンが表示されるので、`bash_profile`を編集して、pyenvのPythonバージョンを実行できるようにします。

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ exec $SHELL -l
```
Pythonのバージョンを確認し、反映されていればOKです。

```
$ python --version
Python 3.8.1
```

## Open CVをインストール

最初は

```
$ brew install opencv
```
これでインストールしようと思ったのですが、うまく行かず…
なので、`pip`を使いました。

```
$ pip install opencv-python
```

インストールできているか確かめるには

```
$ python
>>> import cv2
```
で何もメッセージが出なければOKです。
以上で、環境構築は完了です。

## 参考
https://qiita.com/nasuvitz/items/5eec6ab9444cff8e9467
https://prog-8.com/docs/python-env
https://www.lifewithpython.com/2018/01/python-checking-version.html
https://news.mynavi.jp/article/zeropython-34/
https://qiita.com/makki_maki04/items/f62c5e4e68709d9b3b89
https://dev.classmethod.jp/articles/aws-cloud9-pyenv/
Vuetifyのv-btnのアルファベットが大文字になるのを抑制する

# 課題

vuetifyで用意されているボタン、`v-btn`でボタン名がアルファベットの場合は、必ず大文字となります。

このように`v-btn`で`Send Email`というボタン名にすると、以下の図のように大文字となります。
これをそのまま表示するようにしたい。

```vue
      <v-card class="mb-5 mt-5">
        <v-card-actions>
          <v-btn>Send Email</v-btn>
        </v-card-actions>
      </v-card>
```

![2020-04-06_09h52_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/a9a1e2f3-9e4c-526b-a8a9-9fe287d2ca18.png)

# 解決法

個別CSSのスタイルを適用する

```css
style="text-transform: none"
```

```vue
      <v-card class="mb-5 mt-5">
        <v-card-actions>
          <v-btn style="text-transform: none">Send Email</v-btn>
        </v-card-actions>
      </v-card>
```

![2020-04-06_09h54_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/55b59a38-0efa-368b-67bc-50251b415a38.png)


# 参考URL

* [[Feature Request] Buttons without Capslock](https://github.com/vuetifyjs/vuetify/issues/3948)
【zsh対応】Laravel6 環境構築（MacOS Catalina）

#はじめに

元々Railsを触っていましたが、色々あってLaravelに移行することにしたので、環境構築について自分なりにまとめておきます。


#PC情報
- macOS Catalina 10.15.3
- Macbook Pro (16-inch 2019)
- PHP version (7.2.29)

#構築手順

##（１） Composer

###composerのダウンロード
PHPのパッケージ管理システムである[Composer] (https://getcomposer.org/)をインストールします。
上記リンクから

```
Download >> Manual Download(下の方)
```

にアクセスし最新バージョンをダウンロードします。
（2020年4月時点では、**1.10.1**が最新のためこれをダウンロード）

ダウンロードフォルダに**composer.phar**がダウンロードされたかと思います。


###composerをいつても呼び出せるようにする
ターミナルを起動し、以下のコマンド入力

```
$ cd ~/Downloads
```

```
$ sudo mv composer.phar /usr/local/bin/composer
```
パスワードを聞かれるので、**自分のOSログイン時のパスワード**を入力します。
これでcomposerがbinファイルに移行され、いつでもcomposerが呼び出せるようになりました。

###実行権限の設定
このままだと、composerへのアクセス権が制限されている場合があるので、アクセス権限を変更します。

```
$ chmod a+x /usr/local/bin/composer
```

###Composerが実行可能か確認する

```
$ composer -v
```

インストールしたバージョン（1.10.1)が表示されていれば完了です。

##(2) Laravel Installerのインストール

###Composerを用いたLaravel Installerのインストール
ターミナル上で以下のコマンドを実行します。

```
$ composer global require laravel/installer
```
少し待つとインストールが完了します。

###環境変数の追加
このままだと、LaravelのInstallerを実行するたびにファイルパスを指定する必要があります。
そのため、PATHを通しておきます。

```
$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
$ source ~/.bash_profile
```

なお、**zsh**を使用している場合は、以下のコマンドを使用します。

```
$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.zshenv
$ source ~/.zshenv
```


##(3) Laravelがインストールできてるか確認

###testappの作成
１つプロジェクトを作ってみます。
ディレクトリをデスクトップに移動した上で、以下を実行します。

```
$ laravel new testapp
```

これでデスクトップ上に**testapp**というLaravelアプリケーションが作成されたと思います。

###アプリケーションを実行してみる。
testappに移動して

```
$ cd testapp
```

サーバーを起動

```
$ php artisan serve
```

これで、[localhost:8000] (http://localhost:8000/)にアクセスすると、LaravelアプリケーションのTOPページが表示されたと思います。
あとはアプリケーションを作っていくのみです！

#参考にしたサイトなど
[Laravel日本語サイト] (http://laravel.jp/)
[PHPフレームワーク Laravel入門(書籍)] (https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798052582)
Windowsエポック値をpythonで日付変換する

メモ（後で整理）

Windowsエポック値は、1年1月1日からの1テック単位の積み上げ。
Pythonでは、1970年1月1日を起点として1秒単位の積み上げ。

from datetime import datetime as dt

a = ((Windowsエポック値/10000000*10000000)-621355968000000000)/10000000
date = dt.fromtimestamp(a)
raspbian で samba サーバー

2020-02 のイメージで実施

## インストール

```go
apt install -y samba

systemctl enable smbd
systemctl start smbd
```


## 設定 (パスワードなし)

```go
mkdir /home/share
chmod 777 /home/share
```

* 以下追記

```go:/etc/samba/smb.conf
[share]
   path = /home/share
   comment = share
   browseable = yes
   writable = yes
   public = yes
   create mask = 0644
   directory mask = 0755
   hide files = _recycle
   vfs object = recycle
   recycle:repository = _recycle/%U
   recycle:keeptree = Yes
   recycle:touch = Yes
   recycle:versions = Yes
   recycle:maxsize = 0
   recycle:exclude = Thumbs.db *.tmp *.temp *.o *.obj ~$* *.~?? .DS_Store
```


## アカウント追加 (piユーザー)

```sh:
# smbpasswd -a pi
New SMB password:
Retype new SMB password:
Added user pi.
```


```go:/etc/samba/smb.conf
[share]
   path = /home/share
   comment = share
   browseable = yes
   writable = yes
   public = yes
   create mask = 0644
   directory mask = 0755
   hide files = _recycle
   vfs object = recycle

   valid users = pi

   recycle:repository = _recycle/%U
   recycle:keeptree = Yes
   recycle:touch = Yes
   recycle:versions = Yes
   recycle:maxsize = 0
   recycle:exclude = Thumbs.db *.tmp *.temp *.o *.obj ~$* *.~?? .DS_Store
```


```sh
systemctl restart smbd
```

* piユーザーでのみアクセスが出来ることを確認。
AWS Lambda で git コマンドを使う

# AWS Lambdaでgitコマンドを使う

AWS Lambdaでgitコマンドを使いたい場合があります。
githubのAPIを呼んだり、dulwichを使ってもいいのですが、新しく勉強するよりは、できれば、いつもの使い慣れたgitコマンドを使いたいものです。
AWS Lambda で実行できるコマンドを作成する環境を作ってみた
### 使う物

AWS Lambda用にコマンドとライブラリをいい感じにまとめてくれるDockerコンテナ
→ https://hub.docker.com/r/qualitiaco/lambda-build-pack

*このDockerコンテナの作り方については、前回の記事をご参考ください。
[**AWS Lambda で実行できるコマンドを作成する環境を作ってみた**](https://qiita.com/qualitia_cdev/items/4aebb1e22be9afab0a16)
https://qiita.com/qualitia_cdev/items/4aebb1e22be9afab0a16

## gitコマンドとライブラリを抽出

### gitコマンドを取り出すスクリプト

```sh:src/build.sh
#!/bin/sh
yum install -y git
cp -a /usr/bin/git ${OUTPUT_PATH}
cp -a /usr/libexec/git-core/git-remote-https ${OUTPUT_PATH}
cp -a /usr/libexec/git-core/git-remote-http ${OUTPUT_PATH}
```

yum でgitをインストールし(もしかしたら既に入っているかもしれませんが)、gitコマンド実行に必要な/usr/bin/gitとhttps通信に必要な、/usr/lib/exec/git-code/git-remote-http(s) を${OUTPUT_PATH}ディレクトリにコピーします。

この後のdockerコマンドが、${OUTPUT_PATH}にあるコマンドに必要なライブラリを自動的に抽出してくれます。

今回はyumで入れましたが、最新がよければ、gitコマンドをbuild.shスクリプト内でコンパイルしても構いません。

### AWS Lambda環境用のgitコマンドとライブラリの取り出し

```console
docker run -it --rm -v $(pwd)/src:/src -v $(pwd)/output:/output qualitiaco/lambda-build-pack
```

## AWS Lambdaにアップロードする

### Lambda Functionの作成

今回はPythonで作成してみます。
さっきできたoutputディレクトリの中に作成します。

```python:output/lambda_function.py
import subprocess
import os
def lambda_handler(event, context):
    cwd = os.getcwd()
    os.chdir("/tmp")
    subprocess.call([
        os.path.join(cwd, "git"),
        f"--exec-path={cwd}",
        "clone",
        "https://github.com/qualitiaco/action-lambda-build-pack-sample.git"])
    print(open("/tmp/action-lambda-build-pack-sample/src/build.sh", "r").read())
```

githubのhttps://github.com/qualitiaco/action-lambda-build-pack-sample.git からgit cloneして、その中にあるsrc/build.shを出力するだけのプログラムです。

### zipする

outputディレクトリの中から圧縮します。
シンボリックリンクを含みますので、「-y」オプションを忘れないよう付けてください。

```console
cd output
zip -9yr ../lambda_function.zip *
```

## 確認

AWS Lambda Functionをあらかじめ作成してzipファイルをアップロードします。
少しサイズが大きいので、関数のソースコードをWebで確認することはできません。

実行すると、

![lambda1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326401/37071d79-92c2-ee31-296b-bacbb3248505.png)

githubからgit cloneして取得したソースコードが表示されました。

## 終わりに

Dockerコンテナqualitiaco/lambda-build-packを使用してAWS Lambdaに必要なgitコマンドとライブラリを取得し、AWS Lambdaでgitコマンドを実行してみました。

本記事で使用したソースコードは、
https://github.com/qualitiaco/action-lambda-build-pack
にも置いてありますので、併せてご覧ください。

*本記事は @qualitia_cdevの中の一人、@hirachanさんに書いていただきました。
とある学生がゲーム開発してみた#2(Unity Hubの話)

![IMG20200406085835.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614245/acc2b85b-1239-16d4-f4f5-426aef6c2ede.jpeg)
ばばーん！Unity2019.3.7f1を入手しました！(今更。)
なぜこのごろになってUnity2019.3.7f1を入手したかと言うと、Unity2018.2.8f1を入手した際、標準アセットをダウンロードし忘れて、使い勝手が悪くなってたので、標準アセットゲットのついでに更新しました。
で、その時ちょっと戸惑った事があったので紹介します。
Unity Hubをダウンロードし終えて、さぁ使うぞ！とUnity Hubをタスクバーにピン留めしたところ···「ffmpeg.dllが見つかりません」と表示されて、Unity Hubが使えませんでした。で、いろいろやってみたところ、![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614245/2e9cd370-b67a-7c8e-378e-e6c546cb7226.png)
このffmpeg.dllと言うのとUnityHubを同じファイルに同居させないとダメっぽいです。
2019年度最後のアンケートをsdapsで集計する

# はじめに

今年度もシーズンが到来したので、253名ほどの方々を対象としたアンケートを準備しました。
(本当におめでとうございます。新型ウィルスの影響で残念ながら出席できなかった方達もいたと思われる点が残念です。)

昨年度は、sdapsのバージョンが1.9.5でしたが、Ubuntu 18.04 (LTS)のパッケージは更新されていて、現時点では1.9.8に変更になっています。特に大きな影響はないですが、これに合わせて過去の投稿は更新しています。

この記事では、元記事に反映させるのが難しかった雑多な事についてメモを残していきます。

# これまでに投稿した記事

* [Ubuntu 18.04でSDAPSを動かしてみた (sdaps-1.9.8対応済み)](https://qiita.com/YasuhiroABE/items/75639f4b95731171b894)
* [Ubuntu 16.04でのsdapsによる日本語アンケートとレポート](https://qiita.com/YasuhiroABE/items/fda244796ee54d242dc5)

技術的なポイントは、[Ubuntu 18.04でSDAPSを動かしてみた (sdaps-1.9.8対応済み)](https://qiita.com/YasuhiroABE/items/75639f4b95731171b894) に反映しています。

# 今回の新しいこと

reportコマンドにはバグがあり、singlechoiceを指定した設問の結果が出力されない問題があります。今回はreport_texについて日本語出力のための修正を行なって、reportの問題にreport_texで対応しています。この他に手書き部分を差し替えるため、出力されるPDFを直接編集していましたが、report_texを利用して中間生成されるreport.texを修正する方が自由度が高いので良いかなと思っているところです。

また再現性のある環境を準備するために、変更済みのsdapsコマンドをdocker環境で実行できるように準備しています。

# 遭遇した課題と感想

利用している機器は昨年度と同様に、[OKI B841dn](https://www.oki.com/jp/printing/products/mono/b841dn/index.html)と[マルチページtiffが出力できるブラザーのADS-3600W](https://www.brother.co.jp/product/scanner/ads3600w/index.aspx)です。

OKI B841dnの1ページの印刷コストが公称2.9円ですから、250枚ほどの用紙を準備するのに1450円 + 紙代ほどかかっている事になります。人件費を考慮しても、マークシートよりは格段に安いですが、精度やソフトウェアの品質については満足しているものの、不安な点があります。

今回あらためて気になったのは次のような点です。

* 以前は"csv export"コマンドは、"csv project export"の順番でないと認識しない問題があったが、今回は"csv export project"の順番でないと認識しない (挙動自体は正しく、バグが修正された印象)
* "reset"コマンドの挙動は毎回不安定で、今回はエラーとなるので、プロジェクトディレクトリ全体をgitの管理下に置いた。(実際は念のためprojectディレクトリのバックアップを取得している)
* latexファイル中のcheckbox(choicequestion)の指定にsinglechoiceを指定すると、reportにデータが表示されない。(report_texでは表示されるが、別途テンプレートの変更が必要。手書きイメージを削除したり、操作するのにはreport_texの"--create-tex"オプションが便利)
* latex(xelatex)を利用しているため、日本語を表示するために必要な変更が必要で、他の言語とうまく共存することが難しい。
* Pythonのコード中にtexのテンプレートが追記されていたりするので、後方互換性を保ったまま変更することは、ほぼ無理。
* 別件で2ページ以上の質問票を準備する機会があったが、sdapsの制約上、質問票は1,2,4,6ページで準備する必要があり、エラーとなる3,5ページの時に追加するべき質問やtextboxの分量があらかじめ分からないこと。

こういった問題のいくつかはissueといてgithubに登録されていますが、度々再現したり、修正されずに放置されていたりするものもあります。


# さいごに

数年前とは違い、読み取り品質は改善されていて、作者には感謝しています。バグを含みやすいアプリケーションの構造については時間があれば手を入れて貢献したいとは思っていますが、他のアプリからも依頼がきているのに作成できていないpull requestがあるので、難しいかなと思っています。
【AWS】Elastic IP解放→割り当て後に必要な事

## この記事は？
AWSのElastic IP(以降EIP)再割り当て時の対応に関する記事です。

## 想定する読み手
- AWSでのデプロイ経験が乏しい方
- AWSでデプロイしたアプリを使わないからインスタンス停止、IP解放した方
- EIPを再割り当てしたけどアプリが起動できない方

**著者開発環境**
mac
Ruby 2.5.1
Rails 5.2.3
AWS
nginx
mySQL
unicorn

## そもそもElastic IPとは
AWSで取得できる、アプリへアクセスするためのIPアドレスです。
特定のIPアドレスを指定することはできませんが、ランダムで取得したEIPは、解放※しない限り占有する事ができます。
(※解放：インスタンスに紐付けしているEIPの占有を解除する事)

**使用料金**
起動中のEC2インスタンスに割り当てたEIPは無料（1インスタンスにつき1つ。2つ目以降は有料）で使用できます。
停止中インスタンスに割り当てられているEIPは有料。（0.005ドル/1時間）
インスタンスを停止していると１ヶ月で、0.005ドル×24(時間)×30(日) = 3.6ドルかかります。
日本円で400円くらいでしょうか。


著者は使用しないアプリがあったのでインスタンスを停止していたのですが、AWSから請求があった事を知り、EIPを解放しました。

が、訳あって久しぶりにアプリの挙動を本番環境で確認するべく、停止していたインスタンスを起動し再度EIPを割り当てました。
すると、アプリが起動しなかった訳なんです。

## EIP再割り当て時に必要なことって？
結論、必要な対応は以下の2点でした。

- 本番環境nginx設定内部でelasticIPの書き換え
- ローカル環境config/deploy/production.rb内のelasticIP書き換え

考えてみれば当然の事なんですが、デプロイ時にEIPを記載していた箇所がありました。
そこのEIPを新しく割り当てたEIPに書き換える必要がある、という事ですね。

## 実際にやった事

### 本番環境nginx設定内部でelasticIPの書き換え

本番環境にて、nginxの設定画面を開きます。
デイレクトリは自身のアプリのディレクトリです。

```ruby:ターミナル
[ec2-user@ip-xxx-xx-xx-xx アプリ名]$ sudo vim /etc/nginx/conf.d/rails.conf
```

以下のような画面が開くはずです。

```ruby:ターミナル
server {
  listen 80;
  server_name 52.68.124.79;　　　#ここを書き換え
  root /var/www/アプリ名/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root  /var/www/アプリ名/current/public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;

  location = /favicon.ico {
    log_not_found off;
  }
}
```
この中のserver_nameという箇所がEIPを記載する箇所なので、ここを新しいEIPに書き換えます。


### ローカル環境config/deploy/production.rb内のelasticIP書き換え

これは読んで字の如くなので割愛しますが、
config/deploy/production.rb内にもEIPを記載している箇所がありますので、そちらも新しいEIPに書き換えます。


以上の対応で著者のアプリは久々に起動できました。

## おわりに
今回の記事は、読む方をかなり限定するかもしれませんが、それでも誰かのお役に立てれば嬉しいです。
Bootstrapのドロップダウンメニューがはみ出る

Bootstrapでドロップダウンリストを作成したのですが、メニューを表示しようとしたらヘッダーの枠がおかしくなりました。

表示前
![スクリーンショット 2020-04-06 8.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495507/e9daab3c-d089-8296-e6bc-47d82805ff94.png)
表示後
![スクリーンショット 2020-04-06 8.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495507/ff382e80-21e9-a108-5bbd-bdf646f9c0c8.png)

これを上手く表示されるようにclassにdropdown-menu-rightを加えました。
すると上手く表示されるようになりました。

訂正後
![スクリーンショット 2020-04-06 9.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495507/4b142a42-a4d7-a80e-7e20-d26f818b0b8c.png)

![スクリーンショット 2020-04-06 9.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495507/91663904-9417-775f-82fa-d63e35c216f9.png)
max msp サウンドデバイスを選択するパッチ


Options -> Audio Status を開くことなく、サウンドデバイスをプルダウンで自動選択したかった

## adstatus パッチ
　
オプションのAudio Statusは `adstatus` パッチを使うことで変更できる

`adstatus option 0` で Input Dvice の指定
`adstatus option 1` で Output Dvice の指定



<img width="500" alt="deviceSelect.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45348/7852a15a-d082-7b70-fd8d-779a5a6a34b6.png">



## sample

<pre><code>
----------begin_max5_patcher----------
943.3oc2X87aaBCE9bxeEHNsIwP9Y.CraaWp1ksC6zT0zjC3rQEXGAlttU0+
2mswjRaHojTV5z3.A7uduuumee9Qtc4B2UhaXMtNu04RmEKtc4hEllzMrv99
B2J5MYkzFyvbyDUULtz0qqOI6Foo8O0J2zJcxYWWjwbZXRYA+68ih2VUvKYR
yR.1F2PkY+PMnuUyxjctPPXrOxyABRM+Dgz+fU2c958qjnU1uTnAdwUsMxh0
EYTYgfOzNE4FGTr5p2j3pa5tkK027dlH9C7mOfAL7WEvwmBfUlbEq9XgRXPn
ACID+PDJLAi5t.vywhK7dwE11ZWSxesg0snttdNtqnJhc6DGfNvcq6TSqXRV
82Xb5pRyjQm.xqXMMzuy1ITCiRF3CrQlzg3.S3Em5GcP3C6E9iAa7IETY+TM
2cPVofla32iMSsCfiGsSehn8dg6dizAmBjaUossmHvBPw9.JNNIwBLbhN+j3
SHwQgPp8J9f3LnGHRVkUj08iBNSuo1Se6yhVd95RwOY0NuBm8iWOdOjPcWaM
xNzVgVcpKWYT1KbtyS1ylIZdijJaabDazZRNmbZCI1Ww6ojvdxGqHevlRMft
WK3x0zL1PowwEVziro32lQBpk3P5MZ5bLZLxcvhwUDoom2UWPKOexrXD4bKy
R9mUlEBv+8jYAf7OfPqEhmKgV.RNaRsVn8ekTKfidgDaQmZxynhsnjWXwV.G
OM4VyjcKK3O96XLPV29C41FQacVuGzmm64bONyYp5p4aqp9xA9idTiFAmrsz
aOltsrippHeiPQTV.BgfVnKP8QC6l2.QOUeX0gr6Fv6VyQ56Yi33Ig3nYfcw
SvRygcBlfcvyfcBmNdFemR.Icu6FBBCdp9FcmhcMm+cJSIyHbNxAmXzCt+Tf
5bUgZ6U9dtMLZWCCOKCOI8sGoBd1M87S2pRYNBbuyQJzMatlU2XGtwLpCluR
XbsDOyqE7tWMU43Vyttne7lBRbo0pSckpibaq6N95FR2Gi4VITfj2VXoXE.U
lrQ9qxGeL11S95pC38ksr9+3CEjVSaKkOjHnYYLtLST14ZW5f7CfXRnp.JjO
IJLEg0OkpaRUDI3uE7dV9sVMeiqXrq0VUJCUzGUFFOdjCdQMiwOZODocon.8
k9IfjPvwyuy8EVopPuC6cCqdQ+Oz4ihRQnjs6iFw6SvQfgdiSfDP+fZNQgQy
J.Let3Ehx7ilb0QZDwvvoXHx3o.BRImd3uKEwTjp1Ca1XKLzTK6x6V9G1jiG
kB
-----------end_max5_patcher-----------
</code></pre>
【早朝爆速メモ】一方向のボタン押下のまま、指定角度で逆方向へ自動的に切り替わるには(scratch)

車のワイパーのように、
あるボタンを押下した状態で、指定の角度になったら逆方向へ自動的に切り替わるには、
(例として　右ボタン押下時、右回転しつつ、90度になったら左回転にしたい場合、)


```
右ボタン押下処理の中に、
指定角度になったらフラグをセットして、
回転処理の中にフラグ判定を行い、
逆回転時に-90になった場合にフラグを再セット
```

※scratchの場合、
　右半分の角度は1度〜180度
　左半分の角度は-1度〜-180度　になります。

実装したものが下図となります。

<img width="1009" alt="スクリーンショット 2020-04-06 8.23.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/459256b2-1890-10fb-09e9-0f1678d83d11.png">

scratchで共有もしているので、参考までに。
https://scratch.mit.edu/projects/382991161/editor/
ショートカットの学校（Windows編）

## はじめに

vim使いになるために、参考にさせていただいたこちらの記事を拝見し、普段使用している覚えるべき（覚えたい）ショートカットを学校レベルで整理しておこうと思いました。

Vim幼稚園からVim小学校へ

https://qiita.com/hachi8833/items/7beeee825c11f7437f54

※下記のレベルは私見です。また、他にもあるとは思いますが、覚えたいものを列挙しています。

## 幼稚園から高校まで
### 幼稚園

基礎の基礎。もう数千回たたいているのだろうと思います。

| キー        | 説明                     |
|-----------|------------------------|
| Win & E   | エクスプローラを開く             |
| Win & D   | ディスクトップ表示（もう一度押すと元に戻る） |
| Win & R   | ファイル名を指定して実行           |
| Win & L   | コンピュータをロックする           |
| Ctrl & A  | すべて選択                  |
| Ctrl & C  | コピー                    |
| Ctrl & V  | 貼り付け                   |
| Ctrl & X  | コピー＆切り取り               |
| Ctrl & Z  | 操作を元に戻す                |
| Ctrl & S  | 上書き保存                  |
| Ctrl & F  | 検索                     |
| Alt & Tab | アプリやウィンドウを切り替える        |
| Alt & F4  | ウィンドウを閉じる              |

### 小学校
ここまで知れば、快適なPCライフを過ごせると思っています。

| キー          | 説明                 |
|-------------|--------------------|
| Win & 1～0   | タスクバーからアプリを起動する    |
| Win & PrtSc | 画面全体をキャプチャーして自動保存 |
| Win & Alt & PrtSc | アクティブウィンドウをキャプチャーして自動保存 |
| Win & ↑↓    | ウィンドウを最大化・最小化する    |
| Win & ←→    | ウィンドウを左半分・右半分に合わせる |
| Ctrl & W    | ウィンドウを閉じる          |
| Ctrl & Y    | 元に戻した操作をやり直す       |
| Ctrl & T    | タブを増やす       |
| Alt & ←     | 1つ前のフォルダに戻る        |
| Alt & →     | 1つ先のフォルダに進む        |

### 中学校
使いこなしていると、"なかなかやるな"と思ったります。

| キー                 | 説明                                           |
|--------------------|----------------------------------------------|
| Win & V            | クリップボードの履歴を表示する                              |
| Win & M            | すべてのウィンドウを最小化する                              |
| Win & Shift & S    | 指定した範囲のスクリーンショットを撮影する                        |
| Win & Shift & ←→   | マルチディスプレイでウィンドウを二画面間移動させる                |
| Ctrl & Shift & N   | 新しいフォルダーを作成する                                |
| Ctrl & Shift & Esc | タスクマネージャーを表示する                               |
| Alt & ↑            | 親フォルダーに移動する                                  |
| Alt & Space + 〇    | ウィンドウのメニュー：S(サイズ変更)、M(移動)、N(最小化)、X(最大化) |

### 高校
個人的には、Nice to haveだと思います。

| キー              | 説明                     |
|-----------------|------------------------|
| Win & X         | クイックリンクメニューを表示する       |
| Win & S         | コルタナの起動                |
| Win & Tab       | タスクビューを表示する            |
| Win & Ctrl & D  | 仮想デスクトップを増やす           |
| Win & Ctrl & F4 | 仮想デスクトップを閉じる           |
| Win & Ctrl & ←→ | 仮想デスクトップ移動             |
| Ctrl & F6       | アプリケーション内での切り替え        |
| Alt & Enter     | プロパティを表示する             |
| Alt & Esc       | アプリケーション切り替え：選択画面をださない |


## おまけ① Excel to Markdown
Markdownで表形式を作成するのは面倒だなと思っていたのですが、EXCEL表から簡単に変換できることを最近知りました。今回、活用させていただきました。

Excel to Markdown 

https://github.com/jonmagic/copy-excel-paste-markdown


## おまけ② Use The Keyboard
アプリケーション別のショートカットであれば、下記のサイトはとても便利です。

Use The Keyboard

https://usethekeyboard.com/

## 参考URL

https://dekiru.net/article/18619/
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンライン授業で失敗しないためのTips #1

# はじめに

本記事では、Microsoft Teams を活用して授業を実施するための方法を解説いたします。
今回は **「オンライン授業で失敗しないためのTips」**について説明します。

以下の記事も参照してください。

- [10分でできる Office 365 Education A1 の利用開始手続き](https://qiita.com/hisaho/items/74b6ba9ba9b4f501f74c)
- [10分でできる Office 365 Education のユーザー登録](https://qiita.com/hisaho/items/58e4e4024ee73280ece7)
- [Microsoft Teams | 10分でできる 授業で利用するチームの準備する](https://qiita.com/hisaho/items/2667f3d8979aa92f79c2)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 教材の共有](https://qiita.com/hisaho/items/5e365ffb63ca9ab83f6c)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程を登録する](https://qiita.com/hisaho/items/fa57301d79b64ced3568)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンラインで出席を取る] (https://qiita.com/drafts/544b006af2cd4fa58e3e)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンライン授業の準備(機材編)](https://qiita.com/drafts/ae479728f007fd7d4130)

# Teams は2台のデバイスで同時にサインインすべし

Teams ではディスクトップ画面の共有や各アプリケーションのウィンドウの共有ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/1d2cda9c-121d-a120-bae3-e5c1df3a1fad.png)

オンライン授業中に共有する画面を切り替えたりしている際に実施にどの画面を共有しているのかがわからなくなったり、画面共有するのを忘れたりすることはよくあります。そのようなトラブルを防ぐために私は2台のデバイスを利用しています。

- 1台はオンライン授業配信用
- 2台目は配信チェック用

です。Teams では複数のデバイスに同じアカウントで同時刻にログインすることができます。このように2台のデバイスを利用すれば、リアルタイムで配信している画像をチェックできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/3a337070-032c-904b-e27e-a8271a03dfba.png)

# 250名以上のオンライン授業の実施

Microsoft Teams のライブイベントでは最大1万人までの同時接続が可能ですが、Office 365 A1 では利用できません(Office 365 A3, A5で利用可能)。また1テナントあたり同時開催は5つまでです。

では、Office 365 A1 を利用しているユーザーや同時に6つ以上のオンライン授業を開催したい場合にはどうすればよいのでしょか？

**[裏技]** があります。

1. PC を2台用意します。
2. オンライン授業用の会議もPC#1用とPC#2用の2つを作成します。
3. PC#1 は普通にオンライン授業配信を行います(Teams を起動して、配信したい画面を設定します)。
4. PC#2 では①Teams を起動して、PC#1とは異なる会議に入り、画面全体の共有を行います。② Edgeブラウザを起動して、全画面表示にし、EdgeブラウザからTeamsにログインし、オンライン授業に参加します。
5. この時の注意事項としては、PC#2 で画面共有するときに、**[システムオーディオ]**にチェックを入れるのを忘れないでください。これを忘れるとPC#2の会議に出席している学生に音声が届きません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/1a1cb4d8-d36f-6b77-3f24-71803a53f51e.png)
gRPC: そもそもRPC って何？

# gRPC: そもそもRPC って何？

今回gRPC を学ぶ上で`RPC`の説明をできるようにするためにRPCとはについてご説明します。

## 概要

リモートプロシージャコール（RPC）は、分散コンピューティングのサブルーチンです。 

RPCのリモート実装はローカル呼び出しに似ていますが、通常は同じではありません。 

RPCでは通常、オブジェクト名、関数名、またはパラメーターがリモートサーバーに渡され、 サーバーは処理された結果をクライアント側に返します（要求/応答）。 

RPCは、TCP、UDP、またはHTTPプロトコルを介して通信できます。

## Go での実装

今回はGoで server / client を実装して体験します。
Goでは、[公式ドキュメント](https://golang.org/pkg/net/rpc/)にあるように
明示的なCodecの指定をしない限り、`gob`を使用してマーシャリングされます。

### サーバーの実装
```
package main

import (
	"fmt"
	"log"
	"net"
	"net/rpc"
)

type Listener int
type Reply struct {
	Data string
}

func (l *Listener) GetLine(line []byte, reply *Reply) error {
	rv := string(line)
	fmt.Printf("Receive: %v\n", rv)
	*reply = Reply{rv}
	return nil
}

func main() {
	addy, err := net.ResolveTCPAddr("tcp", "0.0.0.0:12345")
	if err != nil {
		log.Fatal(err)
	}
	inbound, err := net.ListenTCP("tcp", addy)
	if err != nil {
		log.Fatal(err)
	}
	listener := new(Listener)
	rpc.Register(listener)
	rpc.Accept(inbound)
}
```


### クライアントの実装
```
package main

import (
	"bufio"
	"log"
	"net/rpc"
	"os"
)

type Reply struct {
	Data string
}

func main() {
	client, err := rpc.Dial("tcp", "localhost:12345")
	if err != nil {
		log.Fatal(err)
	}
	in := bufio.NewReader(os.Stdin)
	for {
		line, _, err := in.ReadLine()
		if err != nil {
			log.Fatal(err)
		}
		var reply Reply
		err = client.Call("Listener.GetLine", line, &reply)
		if err != nil {
			log.Fatal(err)
		}
		log.Printf("Reply: %v, Data: %v", reply, reply.Data)
	}
}
```

`in.ReadLine` の無限ループで受け取っているので、
client起動したら、文字を入力してEnter をしてください。

### 実行結果

clientからCallすると、サーバーで定義した`GetLine` 関数がcall されることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607057/d038eb4c-bcdc-5484-f2f8-334d3647304d.png)


### REPO
今回の実装サンプルは以下に残しておきます。
https://github.com/locona/what-is-rpc-go
Scrachで使おうとしている素材URL

# Scrachで利用できそうな素材のURL

子供の教育のために、Scrachを教えていますが、素材を変えて教えたいので、ちょっと調査したところ、下記のサイトがあったので、（自分的なメモ目的で）残しておきます。サイト名称などは時間ができたときに書きます。

- http://rpgdot3319.g1.xrea.com/muz/002.html
- https://maoudamashii.jokersounds.com/
- https://dova-s.jp/
- https://ephtracy.github.io/#ss-carousel_ss
- http://osabisi.sakura.ne.jp/m2/
VirtualBoxのストレージにNVMeのSSDを使う

VirtualBoxで、いつもSATA接続のHDDしか使っていなかったので、たまにはNVMe接続のSSDを使ってみようかと思います。

## 環境

* Windows 10
* VirtualBox ver 6.0.14

## 手順

1. デフォルトだとNVMe Controllerが使えないため、[Extension Pack](https://www.virtualbox.org/wiki/Download_Old_Builds_6_0)をVirtualBoxにインストールする。
2. 左ペインから「ストレージ」を選択、下側に並んでいる一番左端のアイコンをクリックし、メニューから「NVMeコントローラーを追加」を押下
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326185/0e6bf89c-cdb9-f2c4-d7ab-305961292df5.png)
3. SATAのコントローラーは不要なので削除する。
4. 「コントローラ:NVMe」の右にあるアイコンをクリックし、画面に従ってSSDの仮想ディスクを新規作成する。
![名称未設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326185/b7bdb377-9361-26f4-f814-24dd74373018.png)

簡単でした。

**！注意！**

* 使ってるVirtualBoxのバージョンとExtension Packのバージョンは同じにしないとエラーになります。  
https://qiita.com/gisuyama7/items/4e6799af501fabbfa802

## NVMe(PCI express)を起動ドライブにしたい

起動ディスクとして認識させるにはもうひと手間必要となります。
NVMeのブートをサポートしていないOSでは無理ですので諦めましょう。対応している場合は下記へ。

* VirtualBoxのアップグレード(v6.1.4)
* EFIの有効化
* チップセットを「ICH9」に変更

以前、物理マシンでも同様のことを行い[Qiitaの記事](https://qiita.com/murashi/items/34f410163148f192dd4d)にまとめましたが、今回はそれを論理マシンで行おう、ということになります。

### VirtualBoxのアップグレード(v6.1.4)

v6.1.4のExtension Packの[リリースノート](https://www.virtualbox.org/wiki/Downloads)にNVMeからのブートについて記載があります。バージョン低い場合はアップグレードしましょう。

### EFIの有効化

BIOSにNVMeブートのドライバが含まれていないようなので、後継のUEFIを使用します。
BIOSやUEFIはこちらの記事参照。
何となく知りたい方は[こちら](https://vboxmania.net/%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E8%A8%AD%E5%AE%9A/)、詳しく知りたい方は[こちら](https://qiita.com/hot_study_man/items/0dc8034fdc0d631e5c94)へ。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326185/81a3a3c5-ecf0-b744-f424-2a0cf6dab3a0.png)

### チップセットを「ICH9」に変更

デフォルトで設定されている「PIIX3」から変更します。「ICH9」は「PCI express」をサポートしています。ただ、不具合などがまだ多いようです。

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326185/9621ee82-6727-d5ce-915c-9a3b96b3c9a6.png)

### OSのインストール

上記の手順後にゲストOSインストールを行ってください。

### 参考

* https://vboxmania.net/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E5%AE%9A/
* https://vboxmania.net/%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E8%A8%AD%E5%AE%9A/
* https://vboxmania.net/%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E8%A8%AD%E5%AE%9A/
* https://qiita.com/hot_study_man/items/0dc8034fdc0d631e5c94
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 日本マイクロソフトの公式コンテンツ

#日本マイクロソフトの公式コンテンツ

日本マイクロソフトが公開している Microsoft Teams 関連のコンテンツを調べてみました。

- [Teams クイックガイド（PDF: 12.6 MB）](https://aka.ms/TeamsQG_Japanese)
- [Teams 使い方マニュアル PC編 （PDF: 21.9 MB）](https://aka.ms/TeamsManual_PC_Japanese)
- [Teams 使い方マニュアル モバイル編（PDF: 7.87 MB）] (https://aka.ms/TeamsManual_Mobile_Japanese)
- [Teams 使い方ビデオ （クイックガイドと対応する64本シリーズ）](https://aka.ms/TeamsVideo_Japanese)
- [Teams でオンラインイベントを開催しよう（PDF 5.07 MB）](http://aka.ms/TeamsOnlineEvent_Japanese)
- [Teams ライブイベントの使い方（設定編、準備編、本番編、事後編の4本シリーズ）](https://aka.ms/TeamsLive_Japanese)
Sass::SyntaxError - File to import not found or unreadable: modules/ファイル名. 　の解決策

ポートフォリオを１から作っていると抜けて落ちている知識に
気がつくので、備忘録として投稿させて頂きます。


# application.scssの設定をチェック

Scssを導入したがパーシャル（分割したSassファイル）の設定が上手く行かず

```
Sass::SyntaxError - File to import not found or unreadable: modules/tasks.
```

とターミナルで表示される。


app/assets/stylesheets/application.scss

```
@import "modules/tasks";
```

この記述が悪さをしている。

原因を調査していると

stylesheetsフォルダの中に作成したたmodulesフォルダの名称が
modules.scssという名称になっていた為、
SyntaxError（構文エラー）が出ていたようです。

フォルダ名をmodules.scss→modules　変更。

無事、解決しました。
【Day44】積み上げ日記

##予定
■JavaScript復習
■SQL

##完了
■JavaScript復習
■SQL

##学習時間
４h

##学習ポイント
■let　変数
一度定義しているものは、あとで書き換えOK

■const 定数
一度定義しているものは、あとで書き換えNG

■var let const
Varは自由すぎる
Let const はある程度制限をかける。←主流

■アロー関数
functionの定義をより短く記述する方法

■SQL
■クエリ
データベースに送る命令
これを送るとデータがもらえる。

■横の列：レコード
■縦の行：カラム
①SELECT
どのカラムのデータを取得するか選択
②FROM
どのテーブルのデータを取得するか選択
③WHERE
どこのレコードデータを取得するか選択
※全てのカラムを指定する時は、＊で指定。

■LIKE演算子
LIKE：一部だけヒットさせるためのもの

■一部ワードに該当するものだけヒットさせる
WHERE name LIKE “%文字列%”

■ワードに該当するものをヒットさせる
WHERE name = “文字列”

■前方だけ該当しているものをヒットさせる
WHERE name LIKE “%文字列”

■後方だけ該当しているものをヒットさせる
WHERE name LIKE “文字列%”

■空欄のデータに該当するものをヒットさせる
WHERE name is not null;

■複数条件が該当するものをヒットさせる
And か　or

■データを並べ替えたい時
Order by
・昇順：ASC
・降順：DESC

■データを必要な数だけ取得する
LIMIT

■LIKE使う時以外は、＝をつける！！

#疑問点
■Math.randomとは？
■Math.floorとは？
→マスランダムで、ランダムにする。ランダムにした数字の小数点を省く時にマスフロア。

■アロー関数とfunction
アロー関数はfunctionを用いた文の簡略版として使える

##計画通り進んだか？
進んだ。今日からJavaScriptからSQLの学習に取り組んでいるが、いまいちどの場面で使う技術なのかがイメージできていない。目的がわからないと習得も遅いので、どこで使われているのかを意識しながら取り組む。
はじめでDocker-machineでAzureのインスタンスを建てた時の話

細かいことを自分で確認して作りたい場合は、
`docker-machine create --driver azure --help`
で自分で確認してみてください。

AzuruCLIをまだ入れていない人は以下の通りにして入れてください。

```
$ curl -L https://aka.ms/InstallAzureCli | bash
$ export PATH=$PATH:/Users/ユーザー名/lib/azure-cli
$ source ~/.bash_profile
$ exec -l $SHELL
```

これにした(Mac)

```
$ brew update && brew install azure-cli
```

次にログインを行います。

```
$ az login
```

ログインができたらインスタンスを作っていきます。
まずサブスクリプションIDが必要となるので、それを取得します。

```
$ az account list --output table
```

次にDocker-machineコマンドでインスタンスを作っていきます。
ただ初めての場合、端末への認証が済んでいないため、出てきたURLへ飛び、出てきたコードを打ち込み、認証を済ましてください。

```
$ docker-machine create \
  --driver azure \
  --azure-subscription-id $sub \
  --azure-availability-set "docker-machine" \
  --azure-location "westus2" \
  --azure-open-port 80 \
  --azure-resource-group "docker-machine" \
  --azure-size "Standard_DS1_v2" \ 
  --azure-ssh-user "ubuntu" \
  --azure-static-public-ip \
  --azure-subnet "default" \
  --azure-vnet "docker-machine-vnet" \
  ml-env
```

インスタンスが立てられたら、SSH接続できるように設定していきましょう。

```
$ docker-machine inspect ホスト名
# ここで鍵までのパスをコピペ
$ docker-machine ls
# これでインスタンスのIPアドレスを確認

$ vim ~/.ssh/config
# --- インスタンス名 -----------------
Host インスタンス名
  HostName インスタンスのIPアドレス
  User 作成時に設定したUser名
  IdentityFile さっき確認したパス
  TCPKeepAlive yes
  IdentitiesOnly yes
# ---------------------------
```

これでうまくいっていれば設定できるようになっているはずです。
初心者によるプログラミング学習ログ 282日目

#100日チャレンジの282日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
282日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>282日目　6h<br>・xdデザインカンプからのwebサイト模写<br>・画像をpngではなくsvgに変更<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1246887588423557123?ref_src=twsrc%5Etfw">April 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
LodashのthrottleでonScroll処理

##lodashを読み込む
```html
<script src="lodash.js"></script>
```
npmで読み込む場合

```
$ npm i --save lodash
```
##スクロール時、1秒毎にhoge実行
```javascript
$(function() {
  $(window).on('scroll', _.throttle( hoge, 1000 ));
});
```
##hoge ＝ ヘッダーを表示する。など
```javascript
function hoge(){
  var scroll = $(window).scrollTop();
  if(scroll > 10){
    $("header").removeClass("hide");
  }else{
    $("header").addClass("hide");
  }
}
```
##なんでlodash.jsが必要？
「スクロールしている」という状態が１秒に何十回もあるので、
`$("header").removeClass("hide");`
を何十回も実行しちゃって重たくなってしまう。
`lodash`はそこを間引いてくれる。

##利用シーン
jQueryなどを書く時に
`$(window).on("scroll"`...あっ`lodash`入れなきゃ、という感じで
使う事が多いです、という話です。

##参考にした記事
https://lodash.com/
https://lodash.com/docs/4.17.15#throttle
(初学者) [Rails6] form_with に classを追記する

bootstrapを導入してからレコードの編集も新規追加もできなくなってしまった。
 → 原因は、フォームのところで`<form>`タグと`<%= form_with %>`が重複していたから。

```edit.html.erb
<form class="form-horizontal" >　　　　　　　　　←　ここと
  <%= form_with model: @article do |form| %>
    <%= form.text_field :title %>
    <%= form.submit 'Update' %>
  <% end %>
</form>　　　　　　　　　　　　　　　　　　　　　　←　ここを消すと治った。

```

### では `class`はどこに書けばよいのか。

`form_with` の `<%= %>`内に`class`を書きたい。
→`do`の手前に書く。

```edit.html.erb
<%= form_with model: @article, class: "form-horizontal" do |form| %>
```



参考：[2.2 Binding a Form to an Object](https://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object)
iOS app の習得日記 (2)

(https://qiita.com/gomi_ningen/items/4e0e5bd98f08c4bcf93d)

続き

4.1 todoリスト作成までいった

｀｀｀
import UIKit
import Foundation

class TODOMainViewController: UIViewController {

    @IBOutlet weak var dismissButton: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        dismissButton.target = self
        dismissButton.action = #selector(TODOMainViewController.dismissButtonTapped(_:))
    }

    func dismissButtonTapped(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }

}
｀｀｀

新しくstoryboard と　viewcontrollerを作り、
dismissButtonを接続しようとするも、

```
"Could not insert new outlet connection".

```
と出る。

(https://dev.classmethod.jp/articles/remove-xcode-derived-data/)
こんなのがでてきた
キャッシュを消せと
これでいいのか？

明日やってみよう
vue-slickでスライドの増減に対応する

先ずは[vue-slick](https://github.com/staskjs/vue-slick)のREADMEを元に作成します。
スライドの数を監視し変化のあった際reInitメソッドを呼び出しています。

```vuejs
<template>
  <div>
    <div>
      <button @click="plus">
        plus
      </button>
    </div>
    <div>
      <button
        v-if="slideCount>0"
        @click="minus"
      >
        minus
      </button>
    </div>
    <slick
      ref="slick"
      :options="slickOptions"
      @reInit="handleReInit"
    >
      <div
        v-for="(item,index) in slideCount"
        :key="index"
      >
        <img :src="'https://placehold.jp/3d4070/ffffff/150x150.png?text='+index">
      </div>
    </slick>
  </div>
</template>

<script>

import Slick from 'vue-slick'

export default {
  components: {
    Slick
  },
  data: function () {
    return {
      slideCount: 0,
      slickOptions: {
        slidesToShow: 5
      }
    }
  },
  created () {
    this.slideCount = 5
  },
  watch: {
    slideCount () {
      this.reInit()
    }
  },
  beforeCreate () {
  },
  methods: {
    plus () {
      this.slideCount++
    },
    minus () {
      this.slideCount--
    },
    next () {
      this.$refs.slick.next()
    },

    prev () {
      this.$refs.slick.prev()
    },
    reInit () {
      this.$nextTick(() => {
        this.$refs.slick.reSlick()
      })
    }
  }
}
</script>
```

上記コードだとスライドの減少には対応できました。しかしスライドの増加が上手くいきません。

そこで**showSlide**というステータスを追加します。
さらに**reInitの中身を変更**し**slickコンポーネントにv-if**を追加します。
これでスライドの数が変わる度にスライダーを再描写することで増減に対応できました。

```vuejs
<template>
  <div>
    <div>
      <button @click="plus">
        plus
      </button>
    </div>
    <div>
      <button
        v-if="slideCount>0"
        @click="minus"
      >
        minus
      </button>
    </div>
    <slick
      v-if="showSlide"
      ref="slick"
      :options="slickOptions"
      @reInit="handleReInit"
    >
      <div
        v-for="(item,index) in slideCount"
        :key="index"
      >
        <img :src="'https://placehold.jp/3d4070/ffffff/150x150.png?text='+index">
      </div>
    </slick>
  </div>
</template>

<script>

import Slick from 'vue-slick'

export default {
  components: {
    Slick
  },
  data: function () {
    return {
      showSlide: true,
      slideCount: 0,
      slickOptions: {
        slidesToShow: 5
      }
    }
  },
  created () {
    this.slideCount = 5
  },
  watch: {
    slideCount () {
      this.reInit()
    }
  },
  beforeCreate () {
  },
  methods: {
    plus () {
      this.slideCount++
    },
    minus () {
      this.slideCount--
    },
    next () {
      this.$refs.slick.next()
    },

    prev () {
      this.$refs.slick.prev()
    },
    reInit () {
      this.showSlide = false
      this.$nextTick(() => (this.showSlide = true))
    }
  }
}
</script>
```
phpで標準入力する方法

今回は備忘録をかねて、様々な例を使ってphpで行う標準入力について、まとめてみました。

***基本編***

```app.php
/* 1行のデータを取得する場合
* 例：「hogehoge」
*/
$data = rtrim(fgets(STDIN));

/* ' '(空白行)で分けられた1行のデータを配列で取得する場合
* 例：「hogehoge gehogeho」
*/
$data = explode(' ', rtrim(fgets(STDIN)));
```
**応用編**

```app.php
/* 先頭の行に数字Nが書かれてて、後続のN行分のデータを配列で取得する場合
* 例：「2
*    hogehoge
*    gehogeho」
*/
$data = rtrim(fgets(STDIN));
  $data_arr=array();
for($i=0;$i<$data;$i++){
  $data_arr[]=rtrim(fgets(STDIN));
}
/* 出力値
*    Array(
*    [0] => gehogeho
*    [1] => hogehoge
*    )
*/
```