OmniAICreator/Qiita-1.07M huggingface dataset:
スプレッド演算子 ～{...object, key: value} ググラビリティの低いあいつ～

# return [...array1, ...array2]; 何やこいつ…
JavaScriptを学習していたら、唐突にドットが3つ出てきました。

```javascript
const array1 = [1,2,3];
const array2 = [4,5,6];

const arrayCombined = [...array1, ...array2, 7];
console.log(arrayCombined); //[1,2,3,4,5,6,7]
```

とか

```javascript
const object1 = {"key1": 1, "key2": 2};
const object2 = {"key1": 2, "key3": 3};

const objectCombined = {...object1, ...object2, "key4": 4};
console.log(objectCombined); //{"key1": 2, "key2": 2, "key3": 3, "key4": 4}
```

めっちゃ調べにくかった…めっちゃ調べにくかったゾ…

# スプレッド構文というらしい
3つのドットの正体は、スプレッド構文で利用するスプレッド演算子というやつでした。

[MDN web docs スプレッド構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)
> スプレッド構文を使うと、関数呼び出しでは 0 個以上の引数として、Array リテラルでは 0 個以上の要素として、Object リテラルでは 0 個以上の key-value のペアとして、Array や String などの iterable オブジェクトをその場で展開します。

スプレッド演算子を使うと、配列またはオブジェクトの要素を展開できます。
主な使いどころは、関数の引数、配列の定義、オブジェクトの定義の3つです。オブジェクトで使えるのはECMAScript2018からだそうです。
詳しい例はMDN様にお任せして、便利すぎてヤバい場面に遭遇したので書いておきます。

# stateの更新をスプレッド構文でやる
ECMAScript2018からは、オブジェクトの展開にも利用できます。
[あるいてっく ECMAScript 2018（ES2018）の新機能まとめ](https://arui.tech/es2018-new-features/)

オブジェクトを結合するとき、同じプロパティがある場合は、後ろにあるプロパティが採用されます。
これを使うと、ReduxのReducerで新しいstateを返す部分がおしゃれに書けますね。

```javascript
const controlBob = (state={}, action) => {
    switch (action.type){
        "CREATE":
            return {"name": "Bob",
                    "tall":156,
                    "weight":54
                    "condition": "good"};
        "CHANGE_CONDITION":
            return {...state, "condition": action.newCondition};
}
```

# レスト構文
JavaとかCの可変長引数みたいな使い方もできるらしいです。
[MDN web docs Rest Parameters]
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters)
[初学者向け]Ajax 対応のハイパーリンク を 生成 

# 環境
- ruby 2.3.1
- rails 5.0.6

# 手順リスト(jQueryを使用した方法)

1. turbolinksを外す
2. formまたはlink_toにremote属性をセット（remote: true）
3. 対応するアクションにjsファイルに飛ぶよう設定
4. 対応するJSファイルを作成

## [図解]Ajax通信の流れ
![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/118229/6f2f45ce-0be7-ea0d-7f17-16b4f148bd04.jpeg)

①非同期通信の発生

  - 上記の場合linkにAjaxを導入したときは、ボタンを押した時に「 非同期通信を行いなさい 」という指令がControllerに飛びます。

②JSの応答

  - 非同期通信を行うよう指令を受けたControllerは指定のアクションを実行し、その後テンプレートファイルを読み込みにかかります。
  - 通常ここではフォーマットを指定しない限りHTMLファイルが読み込まれますが、「非同期通信を行いなさい」と指定されたControllerはHTMLファイルを読み込まず アクション名と対応したJSファイル を読み込みにかかります。
  - edit アクションを実行したのであれば対応するJSファイルは edit.js.erb です。

③スクリプトの実行

  - JSファイルが読み込まれると中に記述してあるスクリプトを実行し、一連の処理を終了します。
  - このスクリプトに「 ビューの中のこの部分をこのように変更しなさい 」という指示を織り込むことで、ページリロードせずともページ内の一部表示が再描画されるのです。

## 1. turbolinksを外す

なぜ、turbolinksを外すかと言うとJavaScriptとの共存に関する問題でうまくAjax通信が行われないから
詳しい知りたい方は以下のリンクを見てください

[Turbolinksさんと上手く付き合う10の方法](https://qiita.com/seri_k/items/164accd9ef8ddb4a942e)
[Turbolinksをオフしないためにやった事](https://qiita.com/saboyutaka/items/bcc0966313c6f7399a6e)
[Rails4でturbolinksを謳歌するためのまとめ](http://o.inchiki.jp/obbr/97)
[Turbolinks](http://www.techscore.com/tech/Ruby/rails-4.0/turbolinks/)


```erb:app/views/layouts/application.html.erb
# 修正前
<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

# 修正後'data-turbolinks-track': 'reload'を削除
<%= stylesheet_link_tag    'application', media: 'all' %>
<%= javascript_include_tag 'application' %>

```

```ruby:app/assets/javascripts/application.js
//= require turbolinks
# 削除
```

```ruby:Gemfile
gem 'turbolinks', '5.0.1'
# 削除かコメントアウトして bundle install
```

## 2. link_toにremote属性をセット（remote: true）

```erb:app/views/shared/_comment_area.html.erb
〜〜〜
　　　　　　<div id="user_comment_<%= comment.id %>">
　　　　　　　　<%= comment.content %>
　　　　　　</div>
　　　　</div>
　　</td>
<% if current_user.my_comment?(comment) %>
<!-- コメント編集ボタン -->
<li class="list-inline-item edit_comment_btn<%= comment.id %>">
  <%= link_to content_tag(:i, "", class: "fa fa-clipboard"),
              edit_board_comment_path(board, comment),
              class: "edit",
           →  remote: true  %>
</li>
〜〜〜
```
## 3. 対応するアクションにjsファイルに飛ぶよう設定

```erb:app/controllers/comments_controller.rb
〜〜〜
  def edit
    respond_to do |format|
      format.js
    end
  end
〜〜〜
```

## 4. 対応するJSファイルを作成

```erb:app/views/comments/edit.js.erb
〜〜〜
<!-- コメント編集ボタン -->
$("#user_comment_<%= @comment.id %>").replaceWith(
  "<%= j(render 'shared/comment_form', { comment: @comment, board: @board } ) %>");
$('#comment<%= @comment.id %>_submit').remove();
$(".edit_comment_btn<%= @comment.id %>").click(function() {
  $("#edit_comment_<%= @comment.id %>").submit()
});

〜〜〜
```

## 参考URL
https://qiita.com/Yama-to/items/377f8a92cf30a3ebf454
PythonでNPBのチームデータが取りたい。(選手情報取りたいけど・・・)

選手の情報を引っこ抜きたいけど失敗した例。

```get_player.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import bs4
import requests

rq = requests.get('https://ja.wikipedia.org/wiki/%E5%8D%83%E8%91%89%E3%83%AD%E3%83%83%E3%83%86%E3%83%9E%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%BA%E3%81%AE%E9%81%B8%E6%89%8B%E4%B8%80%E8%A6%A7')
if (rq.status_code == 200):#htmlのステータスを確認して正常なら実行
    # print(rq.text)
    soup = bs4.BeautifulSoup(rq.text,'html.parser')
    for news in soup.findAll('li'):
        print(news.string)
else:#errorだったときにURLが取れてなかったエラーがでる。
    print("URL error!")
```
C/C++用のEV3RT環境構築にmruby環境を追加する方法

先日とある方に教えてあげたら、そんな簡単にできるんですか！ってびっくりされたのでこちらにも書いておきます。

この記事はC/C++用のEV3RT環境ができていて、使い方を知っている人向けのものです。**EV3RT用環境構築がまだの方は[Windows, Linux, ](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnv#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB)[Mac](https://qiita.com/yamanekko/items/3cee3991ea9472a1f6b6)を参考に作ってください。**

# 必要なもの
 * Ruby(mrubyじゃないいわゆるCRuby。mrubyのビルドに必要)
 * [mruby](https://github.com/mruby/mruby)
   リリース版は(2018/07/12現在)1.4.1推奨（1.4.0は NG）
 * [mruby-ev3rt (EV3RT用の拡張ライブラリ)](https://github.com/yamanekko/mruby-ev3rt)

# mrubyのビルド

## mrubyの取得

Githubのmrubyリポジトリからmrubyを取得します。

```
$ git clone https://github.com/mruby/mruby.git
```

## EV3RT用のmrbgemsの取得

mrubyと同じ階層に置く前提です。
ex. `/Users/xxx/mruby` なら `/Users/xxx/mruby-ev3rt` 
参考）将来EV3RTをバージョンアップすることを考えると、EV3RTの下にmrubyを入れない方が良いです。


```
$ git clone https://github.com/yamanekko/mruby-ev3rt.git
```

## mrubyのMakefileをEV3RT用に変更

`/mruby/makefile` の `RAKE=`をEV3RT用のbuild config 用に変更します。

```
RAKE=MRUBY_CONFIG=../mruby-ev3rt/build_config_ev3rt.rb ruby ./minirake
```

※ 私はEV3RT以外でもmrubyを使っているのでこのようにしていますが、mruby/build_config.rb にbuild_config_ev3rt.rbの中身を記載するのでも構いません。 
※ minirake を使えばRakeがインストールされてなくてもOKです


## build_config_ev3rt.rb の設定内容を環境に合わせる

* EV3RT_PATH = ev3rt/hrp2のパス
* GNU_TOOL_PREFX = arm-none-eabi-gcc のパス

GCC ARMにパスが通っている場合は
```GNU_TOOL_PREFX = arm-none-eabi-```
でよい。パスが通っているかは、以下のコマンドで確認できます。
```arm-none-eabi-gcc -v```

## mrubyをmakeする

```
cd ~/git/mruby 
make
```

こんな表示がされて、```mruby/build/EV3RT/lib/libmruby.a```が生成されていたら、mrubyのビルドは成功です。

```
================================================
      Config Name: host
 Output Directory: build/host
         Binaries: mrbc
    Included Gems:
             mruby-compiler - mruby compiler library
             mruby-bin-mrbc - mruby compiler executable
================================================

================================================
      Config Name: EV3RT
 Output Directory: build/EV3RT
    Included Gems:
             mruby-compiler - mruby compiler library
             mruby-ev3rt - TOPPERS HRP2 for EV3 class
================================================
```

## mruby用プロジェクトを作成する
C/C++と同様にsdk/workspaceの下にプロジェクトを作成します。
一言で言ってしまうと、C/C++でタスクから実行されていた関数にC/C++のコードを書く代わりに、mrubyを呼び出す記述を書きます。
詳しくはサンプルコード[EV3RT上のmrubyで超音波センサーを使用するサンプルを試す](https://qiita.com/yamanekko/items/ac3c6c3ffae1df850d46), [EV3RT用mrubyサンプルコードの使い方](https://qiita.com/yamanekko/items/c2adb87031bf38bb8a13)などを参考にしてください
Nuxt.jsでNormalize.cssを使う

# 前置き
僕はWebページを作るときはまず[Normalize.css](https://necolas.github.io/normalize.css/)を使って、開発しやすい状態にしてから初めています。
単にスタイルをまっさらにするのではなく、いい感じにブラウザ間の差異をなんとかしてくれたりするニクいやつなのですが、毎回ダウンロードしてはスタイルシートの置き場に配置して〜という手順や、最新バージョンが発表された時に置き換えたりするのは地味に面倒だったりします。

そんなNormalize.cssの[公式npm](https://www.npmjs.com/package/normalize.css)があるということを知り、またNuxt.jsにおいて導入してみたら思ったよりササーッとできたので共有しておこうと思います。
# 手順
## ダウンロード
まずはnpmなりyarnなりでインストールします。

```bash:npmの場合
npm install --save normalize.css
```

```bash:yarnの場合
yarn add normalize.css
```
## 設定
次にnuxt.config.jsに以下の設定を追加します。

```javascript:nuxt.config.js
module.exports = {
  //　省略
  css: [
    'normalize.css'
  ]
  //　省略
}
```

以上でNormalize.cssが適用された状態でページが表示されるようになります。

# まとめ
これまでNormalize.cssを愚直に使っていたのに比べると、かなり楽に設定することができました。バージョン追うのも楽になります。
手順の通りにやったのに出来ない場合や、不適切な記載があった場合はご指摘いただけますと助かります。
git worktree add -> Refusing to point HEAD outside of refs/

### 環境
- Ubuntu 16.04.4 LTS
- git version 2.7.4

# 症状
### git worktree add が失敗する
```
$ git worktree add -B master public origin/master
Branch master set up to track remote branch master from origin.
Preparing public (identifier public)
fatal: Refusing to point HEAD outside of refs/
```

# 解決
どうやらver2.7.4のgitで発生するバグらしく、以下の手順でgitをアップグレードすると無事解決。

```
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get install git
```

# 参考
https://discourse.gohugo.io/t/github-deployment-using-worktrees-failing/5918/5
Jupyter notebook localhost:8888

今日TensorFlow使っているときにJupyterNotebook開きたかったので普通に打ち込んだら,,,

```
jupyter notebook
```

**アクセスできない.**TABキーで補完できたからインストールしたはずなんだけどな。

原因はどうやらプロキシぽい。いろいろイジったけどうまくいかなかった。強そうな人に聞いた。
2つ対処法があるぽい、
##①ではできなくて②でできた。

①これをターミナルコマンドに　
```jupyter notebook --no-browser --port=8889
```

②これをlocalのターミナルコマンドに
```ssh -N -f -L localhost:8888:localhost:8889 username@your_remote_host_name
```
んでブラウザに
##localhost:8888と入力してENTERキー。

正直理解できてないからもう一回明日もやってうまくいくか確認しよう。
Unity 3Dモデルを動かしてみたりした(超初心者)

Unityちゃんを使ってゲームをクソゲー以上普通ゲーム未満くらいのものを作るまで随時更新する予定。
（作る上で悩んだりした事を振り返る用の記事)

http://0310unity.hateblo.jp/entry/unity_chan_basic
これをみながら3D動かそうとしたけどつまづいた。
3Dを動かせるけど床を貫通して落ちていく。
https://ameblo.jp/mavoroshioni/entry-11821940701.html
ぐぐってこれをつけたらいけた。
キャラクター用の当たり判定っぽい。
というか書くならここらへんも書いてほしいです。（最初の記事)

追記
キャラクターコントロールで動かすとあとがなかなか大変になるらしいので
作り直した。

SAColliderBuilderでユニティちゃんの全身のコリダーをわずか数分で作成したが
RigidbodyがSAColliderBuilderにあるのにあたり判定の
OnCollisionEnterよばれねーと思ってぐぐってもしばらくうまくいかなかったが

SAColliderBuilderでつけたRigidbodyをオフにして普通のコンポネからRigidbodyを追加したら
OnCollisionEnterが呼ばれるようになった
（＝SAColliderBuilderのRigidbodyでは当たり判定はあるがOnCollisionEnterが呼ばれないようになっている)
SAColliderBuilder便利だけど過信はいけない。

あと操作する側にRgidbodyを絶対につけること。
（ネットでぐぐってたらつけ忘れとか多いみたいなので自分にも警告）

Destoryで消えないとか悩んでいたけどcollision.gameObjectとかくところを
gameobject　と書いていた。そりゃあ消えないね（アホ）
FDPSで使われるC++

#更新履歴？
 - 18/06/20 初あっぷ。誤植とかあるかも。

#前置き(駄文かも)
この記事はFDPS講習会で開催されるチュートリアルセクションのひとつ、
「FDPSを使うのに必要な知識はCと**ほんの少しの**C++って言うけど**ほんの少し**ってどれくらい？」
のWeb版です。
探せばYouTubeにこのチュートリアルの動画が上がっていると思うんですが、
**自分の不細工な顔をYouTubeで見られるのが嫌**なのでこれを作りました。
~~(バーチャルユーチュバーシステムでやりたいんだけどだめですかねぇ？)~~

本稿では、以下の2つに関しては知っているものと仮定し、解説はいたしませぬのでご留意ください。

 - FDPSとはなにか
 - Cの文法

#FDPSを使う際に必要とされるC++
FDPSを使う際、必要とされるC++の知識は以下の3つである。

 - クラス
 - メンバ関数
 - テンプレート

以下では、この3つそれぞれに対して、

 - それはなにか？
 - それを使う事によるメリットはなにか？
 - それはFDPS内でどのように使われているか？

に関して説明する。

##クラス
###クラスとはなにか？
C++においてクラスとは、**複数のデータを一つにまとめたもの**を示す。
この**もの**は、C++において、**型**として振る舞うことが可能である。
C言語における**構造体/struct**という概念を理解している場合、それとほぼ変わらないものであると思って構わない。

####例
二次元平面上で定義される点$(x, y)$を、複数作る場合を考える。
例えば倍精度(`double`)で64個の点を作る場合、クラス無しでは、こうである。

```cpp
int main(void){
    double x[64], y[64];
    /**********\
    | なにか処理 |
    \**********/
    return 0;
}
```

クラスを使うと、この様になる。

```cpp
class vec{
    public:
    double x, y;
};

int main(void){
    vec point[64];
    /**********\
    | なにか処理 |
    \**********/
    return 0;
}
```
見慣れない`public:`というなにかに関しては、今は一旦無視しておいてよい。

クラスの構成要素へのアクセスは、`.`を用いる。
例えば、配列`point`の0番目の要素のx座標を書き込みたいないしは読み込みたい場合、

```cpp
class vec{
    public:
    double x, y;
};

int main(void){
    vec point[64];
    point[0].x = 1.0;
    return 0;
}
```
とすればよい。

また、**クラスはクラスを内包できる**ため、例えば**何かの粒子**というクラスがあったとして、
粒子クラスが座標と速度という２つの`vec`クラスを持つ場合、

```cpp
class vec{
    public:
    double x, y;
};

class particle{
    public:
    vec position, velocity;
};

```
と書くことが許される。
もちろん、質量や加速度をもたせることも可能である。

###クラスのメリット
####サブルーチンに値を送る際に楽
クラスを用いると、サブルーチンに値を送る際に楽である。
例えば、座標を引数にとって何かしらを計算するサブルーチンが存在する場合、
クラス無しで書くと

```cpp
void calcSomething(double x[], double y[]){
    //calculate something
}

```
であるが、クラスを用いると

```cpp
void calcSomething(vec position[]){
    //calculate something
}

```

と書くことができる。
当然、クラスを内包するクラスも引数に持たせることが可能なため、粒子構造体を送って、

```cpp
void calcSomething(particle ptcl[]){
    //calculate something
}

```
と書くことが可能である。

####あとからデータの付け足しが楽
クラスを用いると、サブルーチンに送る値をあとから付け足す際に便利である。
例えば、

```cpp
void calcSomething(double x[], double y[]){
    //calculate something
}

```
を3次元に拡張したくなった際には、

```cpp
void calcSomething(double x[], double y[], double z[]){
    //calculate something
}

```
とすればよい。
しかしながら、このようなサブルーチンが多数存在している場合、すべてのサブルーチンを書き換えなくてはならない。

一方で、クラスを使う場合は、元のクラスにデータを書き足せば良い。

```cpp
class vec{
    public:
    double x, y, z;
};

```
こうすれば、サブルーチン`calcSomething`の引数は一切変える必要がない。

###クラスはFDPS内でどのように使われているか？
FDPSには、ベクトルクラスが用意されている。
これは、`PS::F64vec`などといった名前で定義されている。
故に、質量、位置ベクトル、速度ベクトル、加速度ベクトルを持つような粒子クラスを定義する場合、

```cpp
class particle{
    public:
    PS::F64 mass;
    PS::F64vec pos, vel, acc;
};

```
などと書くことが可能である。

##メンバ関数
これから書く

##テンプレート
これから書く

#Q&A
##「これから書く」がやたら多いんですけどいつまで「これから書く」のままなんですか？
俗に言う**日本銀行券**を渡すと執筆速度が$\log(金額)$倍の速度向上を示すという観測結果が報告されています。
試されてみては？
第14話 ノントーシェント数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第14話です。

```math
\arg⁡{\min_{n:even}⁡[\forall x,\varphi (x)\neq n]}=14
```

最小の偶数のノントーシェント数は14、という式です。
まず、φ(n)というのは、オイラーのトーシェント関数というものです。
自然数nに対して、n以下でnと互いに素になる数が幾つか、を表す関数です。

```math
\begin{align}
\varphi(2)&=1\\
\varphi(3)&=2\\
\varphi(5)&=4\\
\varphi(11)&=10\\
\varphi(4)&=2 \quad [1,3]\\
\varphi(6)&=2 \quad  [1,5]\\
\varphi(12)&=4 \quad  [1,5,7,11]\\
\end{align}
```

素数のときは1~n-1が全て該当するのでn-1になります。
合成数だと約数とその倍数が除外されるので小さい数になります。

このように、トーシェント関数の解になる数をトーシェント数といい、
そうならない数をノントーシェント数といいます。

1以外の奇数はすべてノントーシェント数です。
なぜなら、mとnが互いに素なら、n-mも互いに素になるので、
φ(n)の値はφ(2)以外は必ず偶数になるからです。

ある数が、トーシェント数であるなら、(素数-1)の積で表されます。
逆にそうできないなら、ノントーシェント数になります。

```math
\begin{align}
2&=3-1&=φ(3)\\
4&=5-1&=φ(5)\\
6&=7-1&=φ(7)\\
8&=(3-1)(5-1)=φ(3×5)&=φ(15)\\
10&=11-1&=φ(11)\\
12&=(3-1)(7-1)=φ(3×7)&=φ(21)\\
14&=15-1=(3-1)(8-1)\\
\end{align}
```

このように、14はどうしても(素数-1)の積にならないので、ノントーシェント数となります。
gstreamerのsrtプラグインを1.12.x にバックポートする

gstreamer 1.14.0 でsrtのプラグインが追加されました。
これを使用するために、gstreamer全体を1.14.x にアップデートするのがひとつの方法ですが、けっこう大変です。
[gstreamer をソースからビルドする](https://qiita.com/tetsu_koba/items/30971369ef6f91fced4c)

そこで、もうひとつの方法として、srtプラグインだけをバックポートするというのがあります。
実際に1.12.4 にバックポートすることができたので、その手順を紹介します。

# バックポートの概要

srtプラグインはgst-plugins-badの中のext/srtにあります。
このディレクトリはそのまま持ってきます。
configure.ac の中のsrtに関する部分だけを持ってきます。
その後は、autogen.sh でconfigure を作成し、configureを実行してMakefileを作成します。
ext/srt の下だけ makeして、でき上がった共有ライブラリのファイルをgstreamerのプラグインのディレクトリにコピーします。

# ソースコードの入手

```
git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-bad
cd gst-plugins-bad/
```

# ext/src の取り出し

まずは 1.14.1 をチェックアウトして、ext/srt のディレクトリの名前を変更。
また、configure.ac を別名でコピーしておく。

```
git checkout -b work2 1.14.1
cp configure.ac configure.ac.1.14.1
cp -a ext/srt ext/srt.1.14.1
```

ソースツリーを1.12.4 に変更して、先ほど変更したディレクトリを元に戻す。

```
git checkout -b work3 1.12.4
mv ext/srt.1.14.1 ext/srt
```

これで ext/srt のディレクトリを持って来れた。

# configure.acの変更

次に、configure.ac の変更を確認。

```
diff -u configure.ac configure.ac.1.14.1 > configure.ac.diff
```

その中でsrtに関するところだけconfigure.acに追加する。
そうしてできたパッチはこちら。

```
$ git diff configure.ac
diff --git a/configure.ac b/configure.ac
index fc15bfd8a..7dbdbbae9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2466,6 +2466,13 @@ AG_GST_CHECK_FEATURE(LIBMMS, [mms protocol library], libmms, [
 ])
 AC_SUBST(LIBMMS_LIBS)
 
+dnl *** libsrt ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_SRT, true)
+AG_GST_CHECK_FEATURE(SRT, [srt library], srt, [
+  PKG_CHECK_MODULES(SRT, srt, HAVE_SRT="yes", HAVE_SRT=no)
+  AC_SUBST(SRT_LIBS)
+  AC_SUBST(SRT_CFLAGS)
+])
 
 dnl *** libsrtp ***
 translit(dnm, m, l) AM_CONDITIONAL(USE_SRTP, true)
@@ -3400,6 +3407,7 @@ AM_CONDITIONAL(USE_SOUNDTOUCH, false)
 AM_CONDITIONAL(USE_SPANDSP, false)
 AM_CONDITIONAL(USE_SPC, false)
 AM_CONDITIONAL(USE_SRTP, false)
+AM_CONDITIONAL(USE_SRT, false)
 AM_CONDITIONAL(USE_GME, false)
 AM_CONDITIONAL(USE_DVB, false)
 AM_CONDITIONAL(USE_ACM, false)
@@ -3703,6 +3711,7 @@ ext/smoothstreaming/Makefile
 ext/sndfile/Makefile
 ext/soundtouch/Makefile
 ext/spandsp/Makefile
+ext/srt/Makefile
 ext/srtp/Makefile
 ext/teletextdec/Makefile
 ext/gme/Makefile
```

# configureしてmake

```
NOCONFIGURE=1 ./autogen.sh 
./configure
make
```

クロスビルドのときは ./configure のときに環境変数や引数をいろいろ指定します。

# インストール

```
cd .libs/
cp libgstsrt.so /usr/lib/gstreamer-1.0/
cp libgstsrt.la /usr/lib/gstreamer-1.0/
```
srtのプラグインが認識されるか確認。

```
$ gst-inspect-1.0 |grep srt
subparse: subparse_typefind: srt, sub, mpsub, mdvd, smi, txt, dks, vtt
srt:  srtclientsrc: SRT client source
srt:  srtserversrc: SRT Server source
srt:  srtclientsink: SRT client sink
srt:  srtserversink: SRT server sink
srtp:  srtpenc: SRTP encoder
srtp:  srtpdec: SRTP decoder
```

これでOK。
さくらインターネットのCRON結果通知

最近はメインはXSERVERになってきてますが、相変わらずさくらインターネットのスタンダードを使うことが多い。

さくらでCRONでTwitterBOTを走らせる物があったんですが結果が不安定だった（テキストだけだとつぶやけたり、画像があると一発で成功してみたり、何度も繰り返してやっと成功したり）のでteratailに質問したんです。

で、その質問自体は結局解決しなかったんですが（おぃ　色々相談にのって下さった方（仮にAさん）が「CRONの動作でメールが飛んでくると思うけど」って事を言われてまして、ちょっと分からなかったのでさくらインターネットに問い合わせした結果を共有しておこうという話です。



Aさんが言われてたのは「エラーが出たならメールが飛んでくるはず」って事でした。
アカウントのpostmasterに設定してあるようなので調べて見たんですが特に「成功」「不成功（エラー）」ともメールは来てない。
これはマニュアルには特に記載は無さそうなので問い合わせをかけました。
途中でアカウントの失念等あり、1週間ほどやりとりにかかってしまいましたが、

サポートからの返事をまとめると・・・・
・ECHOするようなタイプ（画面に文字等を出力するタイプ）のメッセージが発生している場合はメールにその内容が記載されてメールが飛ぶ
・プログラムの方でファイルにログを残すような形の場合（要するに画面出力は一切無い場合）はCRONとしては一切メールを飛ばしたりはしない。

ので私もソースの方ではログを残すようにはなってたので何時何分にCRONが走ったかはログを見ればわかるが、何に引っかかってるかは結局分からない・・・

というお話でした。
Node.js　外部ファイルに処理を記述する方法

# 環境
Node.js：10.0.0
Express：4.16.0

# やりたいこと
処理の一部を外部ファイルに記述することで、１つのファイル内のコード数を減らしたい
※Expressの勉強中、受け付けるURLパターンが増えてきたときに、
　アプリごとに処理を記述出来たらよいなと思ったのがきっかけ

# 外部ファイルを呼び出す側
```main.js
var express = require('express'),
	app = express();

var sub = require('./sub');  // ①

app.get('/', sub.index);  // ②

app.listen(3000);

console.log('server starting -> localhost:3000');
```
### ポイント
①外部ファイルを読込む
「require('外部ファイル')」の形式で読み込むことができる。
同じ階層のファイルに対しては必ず「./」を付ける。
そうしないと、パッケージを探しに行ってしまう模様。

②外部ファイルで定義した関数を呼び出す。
「①で定義した変数名.関数名」の形式で呼び出せる。
Node.jsでは関数も一つのオブジェクトとして扱えるため、()は不要

※expressについてはここでは触れません。

# 外部ファイル
```sub.js
exports.index = function(req, res){
	res.send('This is INDEX.');
};
```
### ポイント
外部から利用できるようにしたい関数は（定数に対しても同様）、
「exports.関数名 = function(引数){処理}」と記述する。
Pythonで暗号化したパスワードを作成したい


仕事で、ユーザーの作成をAnsibleでするときに

「他人にレビュー依頼するコードに平文のパスワード載せちゃだめだよ、これ暗号化して置いて」

という、オーダーがあったのでこのスクリプトを置いておけば勝手にいい感じに暗号化して使えるじゃんと思って作成しました。

## とりあえず作ったもの

動作検証環境
python 2.7
CentOS7
Linuxであればとりあえずこれで動くはず。

3系まもっといいライブラリあると思うのでぐぐってください
Macだと何故かsaltがうまくいきませんでした（誰か教えてほしい）

```pwgen.py
 #!/usr/bin/env python 

 import getpass 
 import crypt 
 import hashlib 
 import random 
 pw = getpass.getpass() 
 salt = hashlib.sha1(str(random.random())).hexdigest() 
 print crypt.crypt( pw , "$1$" + salt + "$")
```

##　適当な使い方

使い方は、Bashが使える空間で

```
$ ./pwgen.py
```

を唱えるだけ。そうすると以下のように聞かれるので好きなパスワードを入力してください。
パスワードなので念の為コンソール上には文字は出現しない設定

```
Password:
$1$81480a47$weZFMjRwhLGpFV30gwdGP0
```

あとはこんな感じに吐き出されていればUNIXで使えるパスワードハッシュの出来上がり

ansibleのパスワードとかUnixの/etc/shadowあたりにコピペしてぶち込んでおけばユーザーのパスワードを追加することができます。

なんかこれバックに入れておけばWebの画面で勝手にパスワード生成とかできそう（今度やろうかな）

### 参考リンク　　

もちろん、参考ありき（参考にした偉大な方々のリンクは下記）

どなたかMacでうまくUnixでユーザ追加するときのsaltの生成のやり方を知っている人がいれば教えてほしいです。

[sha512 でハッシュ化されたパスワードを生成するワンライナー](http://cameong.hatenablog.com/entry/2016/09/24/210131)
[Pyrhon2.7 36.5. crypt --- Unix パスワードをチェックするための関数](https://docs.python.org/ja/2.7/library/crypt.html#module-crypt)
[SHA512でハッシュされたSALTつきパスワードを生成するには](http://april.fool.jp/blogs/2013/09/sha512%E3%81%A7%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%81%95%E3%82%8C%E3%81%9Fsalt%E3%81%A4%E3%81%8D%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB/)
windowsのDocker上で開発環境を構築する：Dockerインストール編

日々新たに登場するモダンな技術を自分で試してみたかったため、自分の持っている端末に開発環境を準備したいと考えました。
しかしあまり自端末を汚したくなかったのと、Dockerへの勉強を兼ねてタイトルに挙げたテーマを実施します。
なお、環境はwindows10 Homeで行います。
また、できるだけ起こった現象をそのまま記載したいため、冗長な記述が多く見受けられるかと思いますがご了承ください。
アドバイスやマサカリ等々たくさんいただければと思います。

# 前提
- Dockerを載せる環境  
    - Windows10 Home 64bit
- Dockerに構築する開発環境  
    - Python3.6
    - Django
    - Postgres9.5

# Docker ToolBoxのダウンロード
1. https://docs.docker.com/toolbox/overview/#whats-in-the-box
からDockerToolBoxをダウンロードする。  
(※本当はDocker for windowsを導入したかったのですが、あれってwindows10 64bit "かつ" Pro版でないとダメなんですね…。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/9691707d-8a45-f3e2-b62b-62c02eb2091d.png)

# Docker ToolBoxのインストール
1. インストールする  
チェックボックス「help docker improve toolbox」は外しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/f1d2cfaf-f0f2-b9ec-f62e-ff044c33161f.png)  
1. なにもせず「Next」を選択する。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/5621eff9-a373-d5f1-d6bb-d1a08ef27eca.png)   
1. なにもせず全てチェックをつけた状態で「Next」を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/d6489465-52cb-7a96-675f-904948330b60.png)
※ちなみに上から3つ目の「Docker Compose」は定義したツールのインストール、その起動や終了などのコマンドの実行を含め一つのファイルで命令できる代物だそうです。
例えば一つのシステムが複数のコンテナで実現されている場合などでとても役に立ちますね。

1. なにもせず「Next」を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/86394446-5cf3-5071-d209-2c2e29675aaa.png)
※一番下のオプションにある「NDIS5」、「NDIS6」Driverとやらが気になりましたが、どうやらネットワークドライバの一種であることくらいしかわかりませんでした。有識者の方どうかご教授ください。

1. なにもせず「Install」を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/af20cd88-3f74-42be-bdfc-80e1e8151c48.png)  

1. 「インストール」を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/4439f4fb-0d7b-1fa2-d024-1601c9575266.png)

1. 「Finish」を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/feaeabfa-a93a-fec4-fb0d-bb3cc0f163a4.png)  

すると以下のようにショートカットが格納されたディレクトリが開くはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265544/4444bc59-3ab3-d2ea-2a29-8407a75598bf.png)


今回はここまでとし、次回はDocker環境の設定を行っていきたいと思います。
Discordのbotでリプライを送る方法

ユーザーを"@user_name"、役職を"@team_name"とする。

botでそのまま@user_nameと出力しても、userにメンションはされない。

userにbotからメンションを送るには、"<@!user_id>"とする必要がある。("<@!000000000000000000>"のような感じ。)

同じように、役職宛にメンションを許可していても、botから@team_nameとメンションを送ろうとしてもメンションにならない。

こちらは"<@&team_id>"とする必要がある。("<@&000000000000000000>"みたいな。)

このIDをいちいち調べるのが面倒な人は、Discordのアプリで、"\@user_name"や"\@team_name"と打ってやると、エスケープされた状態で出力されるので、簡単。
自動テストツール「SikuliX」でお手軽RPA

# はじめに
RPAが最近流行っているので、個人で手軽にできないのかな～と調べていたら、どうやら「SikuliX」というOSSがあるみたいなので試してみます[^1]。

[^1]: 正式にはRPAを名乗っているわけではないみたいです。

SikuliXはOpenCVでの画像認識をベースに操作します。ブラウザの操作ツールはSeleniumやPuppeteerなどが有名ですが、GUIであればブラウザに限らず動かせるのは貴重なのではないでしょうか。

今回はGoogle検索をしてみます（Seleniumでいいじゃん！）。

# インストール手順
OS : Windows10
SikuliXのバージョン : 1.1.2

http://sikulix.com/
の画面右側にある`Get version x.x.x`からjarを落として以下のコマンドを打ちます。

※事前にJava8以上をインストールしておく必要があります。

```none:SikuliXのインストール
$ java -jar .\sikulixsetup-1.1.2.jar
```

するとウィンドウが出てくるので進めていきます。
この画面では、とりあえず1をチェックしました。
<img width="444" alt="window.png" src="https://qiita-image-store.s3.amazonaws.com/0/227999/78a23e4c-9889-1fd8-3bf2-86066902e2c2.png">

完了すると`runsikulix.cmd`が生成されるので、実行するとSikulixIDEが起動します。

```none:SikulixIDEの実行
$ .\runsikulix.cmd
```

# 設定
こんな感じで設定しました。
タスクバーにあるGoogle Chromeのアイコンをクリックし、検索します。

<img width="678" alt="rw.png" src="https://qiita-image-store.s3.amazonaws.com/0/227999/4da30ed1-dd3f-389d-4881-cf48731907d6.png">


Python2系が動いているので、日本語文字列の扱いには注意が必要です。

# 実行

![r2.png](https://qiita-image-store.s3.amazonaws.com/0/227999/ab4e8c89-387a-ccce-fa49-c68452440705.png)

できました。

# おわりに
SikuliXはプログラミング度が低いので、簡単に設定できるところがいいですね。
一方、不思議な挙動をする部分もあり色々触ってみたほうがよさそうです。
Laravel MixでFontAwesome5を組み込む

Laravel Mixを使って、FontAwesome5をアプリケーションに組み込みます。


必要なファイルをインストールします。

```
$ npm install @fortawesome/fontawesome --save-dev
$ npm install @fortawesome/fontawesome-free-regular --save-dev
$ npm install @fortawesome/fontawesome-free-solid --save-dev
$ npm install @fortawesome/fontawesome-free-brands --save-dev
```

次に、 resources/assets/js/app.js 内に下記を追加します。

```app.js
import fontawesome from '@fortawesome/fontawesome';
import regular from '@fortawesome/fontawesome-free-solid';
import solid from '@fortawesome/fontawesome-free-regular';
import brands from '@fortawesome/fontawesome-free-brands';

fontawesome.library.add(regular);
fontawesome.library.add(solid);
fontawesome.library.add(brands);
```

コンパイルを実行

```
$ npm run dev
```

作成された public/js/app.js をviewファイル内で読み込ませて、

```
<script src="/js/app.js"></script>
```

あとは、表示させたいところにFontAwesomeのタグを貼り付ければ表示されます。

```
<i class="fas fa-camera-retro"></i>
```

## 参考にしたところ
https://fontawesome.com/how-to-use/use-with-node-js
https://stackoverflow.com/questions/49304017/install-font-awesome-5-with-npm-for-scss-usage
Vue.js の Transition で、データの変更時にアニメーションを実行する方法

通常、下記のコードだと Vue router によって router-view 配下の Component が変更された時に実行される。

```
  <transition name="slide-fade">
    <router-view />
  </transition>
```

Component を使いまわしてデータのみ変更する場合にもアニメーションを実行したい時があったので調べてみました。

## その方法

key を設定することで、Vue が異なる要素と認識してアニメーションが実行される。

```
  <transition name="slide-fade">
    <router-view :key="data.id" />
  </transition>
```
配列の最後を求めるRFC

PHPは[配列関数](http://php.net/manual/ja/book.array.php)がめったらやたら充実しているのですが、何故か[配列の最初や最後の要素を取得する](https://qiita.com/t_cyrill/items/da1e6c73b1a25eaeee16)関数がありません。

```php
	$array = ['a'=>1, 'b'=>2, 'c'=>3];
	
	// 配列の最初のキーと値
	reset($array); // 1
	key($array); // 'a'
	
	// 配列の最後のキーと値
	end($array); // 3
	key($array); // 'c'
```

何故かわざわざ配列の内部ポインタを操作しなければなりません。
もしくは[array_sliceで切り出す](https://qiita.com/mpyw/items/2f75091579546e416069)などの面倒な手順が必要です。

ということでどうにかしようというRFCが2018/06/11に提出されました。
以下は[PHP RFC: array_key_first(), array_key_last() and array_value_first(), array_value_last()](https://wiki.php.net/rfc/array_key_first_last)の日本語訳です。

# PHP RFC: array_key_first(), array_key_last() and array_value_first(), array_value_last()

## Introduction

配列はパワフルなデータ構造ですが、ときに副作用なしに配列の最初や最後のキー、値を取り出せると便利なことがよくあります。
このタスクを解決するために、このRFCでは4つの関数をコアに追加します。

```php
	$key = array_key_first($array);
	$key = array_key_last($array);
	$value = array_value_first($array);
	$value = array_value_last($array);
```

## Proposal

現在のPHPでは、配列の最初や最後のキー・値を取り出したいときには、関数`reset()`や`end()`、および`key()`を使って配列の内部ポインタを変更する必要があります。
他の実装としては`array_keys($array)[0]`やループで回す方法などがありますが、前者は`$array`が空の場合にエラーが発生することがあったり、後者は複雑性が上がってわかりにくくなります。

配列からデータを取得するためだけに内部ポインタを変更しないで済むように、また平易な書き方ができるように、このRFCでは配列キーを扱うための2関数と、配列値を扱うための2関数を追加します。

配列の最初の要素のキーを取得するために`array_key_first`が、配列の最後の要素のキーを取得するために`array_key_last`が追加されます。

```php
	// 連想配列
	$array = ['a' => 1, 'b' => 2, 'c' => 3];
	
	$firstKey = array_key_first($array); // 'a'
	$lastKey = array_key_last($array);   // 'c'

	// 普通の配列
	$array = [1 => 'a', 2 => 'b', 3 => 'c'];

	$firstKey = array_key_first($array); // 1
	$lastKey = array_key_last($array);   // 3

	// 空の配列
	$array = [];

	$firstKey = array_key_first($array); // null
	$lastKey = array_key_last($array);   // null
```

配列の最初の要素の値を取得するために`array_value_first`が、配列の最後の要素の値を取得するために`array_value_last`が追加されます。

```php
	// 連想配列
	$array = ['a' => 1, 'b' => 2, 'c' => 3];
	
	$firstKey = array_value_first($array); // 1
	$lastKey = array_value_last($array);   // 3

	// 普通の配列
	$array = [1 => 'a', 2 => 'b', 3 => 'c'];

	$firstKey = array_value_first($array); // 'a'
	$lastKey = array_value_last($array);   // 'c'

	// 空の配列
	$array = [];

	$firstKey = array_value_first($array); // null
	$lastKey = array_value_last($array);   // null
```

4関数は全て、要求されたキーか値を返します。
空の配列に対してはnullを返します。
配列以外の引数にはE_WARNINGを発してnullを返します。

## Backward Incompatible Changes

後方互換性の破壊はなし。

## Proposed PHP Version(s)

PHP7.xの次のどこかで。

## RFC Impact

このRFCは4つの新しい関数を追加するため、ユーザランドで同じ名前のヘルパ関数を作っていた場合に影響を与える可能性があります。
実装された関数は意味のある名前なので、カスタム関数は交換可能な同じ機能を実装する必要があります。

SAPIsやopcacheには何の影響もありません。

## Proposed Voting Choices

このRFCはPHPの構文を変更しないので、50%+1の賛成で可決されます。

## Patches and Tests

機能とテストを提供するプルリクエストは[GitHub](https://github.com/php/php-src/pull/3256)にあります。


# 感想

他のRFCを見てたら、2年前に提出された[PHP RFC: array_key_(first|last|index)](https://wiki.php.net/rfc/array_key_first_last_index)というのとほぼ同じでした。
というより、このRFCが[止まってる](https://github.com/php/php-src/pull/347)から[勝手に実装しちゃったぜ](https://github.com/php/php-src/pull/3256)みたいなノリでした。

ループの最後だけ、みたいな処理はありがちなので、この関数が実装されるとありがたいですね。

ところで、どうしてarray_first()/array_last()がないのか。
SequelProからDBへのCSVインポートを5倍くらいには速くした方法

![sequel](https://sequelpro.com/images/logo.png)

## 背景
SequelProで接続しているリモートのDBに少し重めのCSVデータをインポートしようとしてたけど、ゲボカスに遅かった。

## やったこと
1. ローカルにDBを立てて、同じスキーマのテーブルを作成する
2. そのテーブルに対して、CSVをインポートしてあげる（リモートにあげるより何倍も速い）
3. そのテーブルから.sqlファイルをエクスポートする
4. .sqlファイルをリモートのDBにインポートする

すこし遠回りですが、トータルで見るとこっちの方が断然速くインポートが終わります。
単純にCSVインポートは時間がかかるから.sqlでインポートしようという話でした。
iOS12 beta1 で LIFF を使おうとすると sendMessages に失敗する

※本記事は、iOS12 beta版について書かれています。

タイトルの通りです。
LIFFの動作検証時にはbeta版ではなく、iOS11以下を使いましょう。

## 少し詳しく
iOS12 beta1 には、WKWebView内でCross-origin通信をしようとすると失敗する不具合がありました。
http://www.openradar.me/40807782

LIFF内で sendMessages を行うとこの不具合により

```
Error: Network Error
```

というエラーが出ます。

なお、該当のバグは iOS12 beta2 では修正されているようです。
beta版を入れた端末で開発をしている方はお気をつけください。
Macでリンクをクリックするだけでサーバーに接続する

[ssh://user@servername1](ssh://user@servername1)
というリンクをMacで開くと、
`ssh user@servername1`相当のコマンドがTerminalで実行されます。
(Qiitaではこのリンクは動作しないようなので、アドレスバーやSlackにリンクを貼り付けてみてください)

理由は簡単でURL SchemeでTerminalアプリケーションが実行されるためです。

`ssh`だけではなく`scp`でも同様のことができます。
【WP】メディアライブラリの画像表示制限（各ユーザーがアップロードした画像のみを表示）プラグイン無

結構探したけど日本語での情報がなかなか見つからず、見つけてもwpのバージョンが上がったことによって使えないコードだったりしたので投稿。（結局英語で調べるのが手っ取り早い）
＊プラグインによる解決方法はたくさんあるみたいだけど、function.phpから直接操作したい方向け

複数人での使用が想定されるメディアやサービスサイトに置いて、誰もがアップした画像がみられてしまうのは、よくないのでなんとかしたい、かつ余計なプラグインは増やしたくない方むけです。

手っ取り早く下のコードをコピペしてください。

```
// 各自ユーザーごとのメディア表示
function get_only_self_media( $query ) {
    $user_id = get_current_user_id();
    if ( $user_id && !current_user_can('activate_plugins') && !current_user_can('edit_others_posts
') ) {
        $query['author'] = $user_id;
    }
    return $query;
} 
add_filter( 'ajax_query_attachments_args', 'get_only_self_media' );
```

ついでに、こちらのコードは下記URLのサイトを参考にしました。(ほぼコピペ)
http://www.wpbeginner.com/plugins/how-to-restrict-media-library-access-to-users-own-uploads-in-wordpress/
sympyで不静定はりを解く(単純梁編)

オリジナル
sympyで不静定はりを解く

~~https://qiita.com/tehen_/items/78de14be5de482d84a26~~

# 参考資料

Statically indeterminate beams＜

https://en.wikipedia.org/wiki/Euler%E2%80%93Bernoulli_beam_theory#Statically#Statically_indeterminate_beams

# WolframAlpha
勉強中
#### 単純梁（中心荷重）
#### 単純梁（等分布荷重）
# 自乗の表示が間違っています。sympy
#### 単純梁（中心荷重）

```PartialScript.py
def _main():
    from sympy.core import symbols
    from sympy.plotting import plot

    l = symbols('l', positive=True, real=True)
    RA, RB = symbols('R_A, R_B')
    P = symbols('P')
    E, I = symbols('E, I')
    x = symbols('x')
    loads = [
        (-RA, 0, -1),
        (-RB, l, -1),
        (P, 0.5*l, -1),
        (0, 0, -2),
        (0, l, -2)
    ]

    b = Beam(l, E, I)
    for load in loads:
        b.apply_load(*load)
    b.bc_deflection = [
        (0, 0),
        (l, 0)
    ]

    b.solve_for_reaction_loads(RA, RB )
    print(b.reaction_loads)
    print("v(x)=",b.deflection())
    print("v(l/2)=",b.deflection().subs({x: 0.5*l}))
    print("  1/48=",1/48)

    # こことんでもなく雑な数字
    constants = {l: 1, P: 1, E: 1, I: 1}
    plot(
        # b.shear_force().subs(constants),
        b.bending_moment().subs(constants),
        # b.slope().subs(constants),
        # b.deflection().subs(constants),
        (b.variable, 0, b.length.subs(constants))
    )

if __name__ == '__main__':
    _main()
# {R_A: 0.5*P, R_B: 0.5*P}
# v(x)= (0.0625*P*l**2*x - 0.0833333333333333*P*SingularityFunction(x, 0, 3) + P*SingularityFunction(x, 0.5*l, 3)/6 - 0.0833333333333333*P*SingularityFunction(x, l, 3))/(E*I)
# v(l/2)= 0.0208333333333333*P*l**3/(E*I)
#   1/48= 0.020833333333333332
```

#### 単純梁（等分布荷重）

```PartialScript.py
def _main():
    from sympy.core import symbols
    from sympy.plotting import plot

    l = symbols('l', positive=True, real=True)
    RA, RB = symbols('R_A, R_B')
    E, I = symbols('E, I')
    x = symbols('x')
    w = symbols('w')

    loads = [
        (-RA, 0, -1),
        (-w, 0, 0, l),
        (-RB, l, -1),
        (0, 0, -2),
        (0, l, -2)
    ]

    b = Beam(l, E, I)
    for load in loads:
        b.apply_load(*load)
    b.bc_deflection = [
        (0, 0),
        (l, 0)
    ]

    b.solve_for_reaction_loads(RA, RB )
    print(b.reaction_loads)
    print("v(x)=",b.deflection())
    print("v(l/2)=",b.deflection().subs({x: 0.5*l}))
    print("-5/384=",-5/384)

    # こことんでもなく雑な数字
    constants = {l: 1, w: 1, E: 1, I: 1}
    plot(
        # b.shear_force().subs(constants),
        b.bending_moment().subs(constants),
        # b.slope().subs(constants),
        # b.deflection().subs(constants),
        (b.variable, 0, b.length.subs(constants))
    )

if __name__ == '__main__':
    _main()
# {R_A: -l*w/2, R_B: -l*w/2}
# v(x)= (-l**3*w*x/24 + l*w*SingularityFunction(x, 0, 3)/12 + l*w*SingularityFunction(x, l, 3)/12 - w*SingularityFunction(x, 0, 4)/24 + w*SingularityFunction(x, l, 4)/24)/(E*I)
# v(l/2)= -0.0130208333333333*l**4*w/(E*I)
# -5/384= -0.013020833333333334
```
sympyで不静定はりを解く(追加例題(6.16(連続はり))編)

オリジナル
sympyで不静定はりを解く

~~https://qiita.com/tehen_/items/78de14be5de482d84a26~~

# 参考
追加例題(6.16(連続はり))

http://www2.aero.osakafu-u.ac.jp/as/ishida/examples0616.pdf

```FullScript.py
from sympy import *
l = symbols('l', positive=True, real=True)
RA, RB, RC, RE, RF = symbols('R_A, R_B, R_C, R_E, R_F')
MA, MF = symbols('M_A, M_F')
P = symbols('P')
E, I = symbols('E, I')
fA=RA+RB+RC+RE+RF-P
fB=MA+10*RA*l+9*RB*l+7*RC*l+3*RE*l-MF-5*P*l
print('---------------------------------------------------------------')
fH=3*MA*l**2+RA*l**3-0
fI=27*MA+27*RA*l+8*RB*l-0
fJ=147*MA+343*RA*l+216*RB*l+64*RC*l-8*P*l
fK=20*MA+100*RA*l+81*RB*l+49*RC*l+9*RE*l-25*P*l
fL=300*MA+1000*RA*l+729*RB*l+343*RC*l+27*RE*l-125*P*l
print('fH=',fH)
print('fI=',fI)
print('fJ=',fJ)
print('fK=',fK)
print('fL=',fL)
w = solve( [ fA,fB,fH,fI,fJ,fK,fL ] , [ MA, RA, RB, RC, RE, RF,  MF ] )
print(w)
print('---------------------------------------------------------------')
fH=3*MA*(l**2)+RA*(l**3)-0
fI=1/2*MA*(3*l)**2+1/6*RA*(3*l)**3+1/6*RB*(2*l)**3-0
fJ=1/2*MA*(7*l)**2+1/6*RA*(7*l)**3+1/6*RB*(6*l)**3+1/6*RC*(4*l)**3-1/6*P*(2*l)**3
fK=MA*(10*l)+1/2*RA*(10*l)**2+1/2*RB*(9*l)**2+1/2*RC*(7*l)**2-1/2*P*(5*l)**2+1/2*RE*(3*l)**2
fL=1/2*MA*(10*l)**2+1/6*RA*(10*l)**3+1/6*RB*(9*l)**3+1/6*RC*(7*l)**3-1/6*P*(5*l)**3+1/6*RE*(3*l)**3
fH=simplify(fH/(l**2))
fI=simplify(fI*6/(l**2))
fJ=simplify(fJ*6/(l**2))
fK=simplify(fK*2/(l**1))
fL=simplify(fL*6/(l**2))
print('fH=',fH)
print('fI=',fI)
print('fJ=',fJ)
print('fK=',fK)
print('fL=',fL)
w = solve( [ fA,fB,fH,fI,fJ,fK,fL ] , [ MA, RA, RB, RC, RE, RF,  MF ] )
print(w)
# ---------------------------------------------------------------
# fH= 3*M_A*l**2 + R_A*l**3
# fI= 27*M_A + 27*R_A*l + 8*R_B*l
# fJ= 147*M_A - 8*P*l + 343*R_A*l + 216*R_B*l + 64*R_C*l
# fK= 20*M_A - 25*P*l + 100*R_A*l + 81*R_B*l + 49*R_C*l + 9*R_E*l
# fL= 300*M_A - 125*P*l + 1000*R_A*l + 729*R_B*l + 343*R_C*l + 27*R_E*l
# {M_A: -17*P*l/229, R_A: 51*P/229, R_B: -459*P/916, R_C: 1453*P/1832, R_E: 1209*P/1832, R_F: -40*P/229, M_F: 40*P*l/229}
# ---------------------------------------------------------------
# fH= 3*M_A + R_A*l
# fI= 27.0*M_A + 27.0*R_A*l + 8.0*R_B*l
# fJ= 147.0*M_A - 8.0*P*l + 343.0*R_A*l + 216.0*R_B*l + 64.0*R_C*l
# fK= 20*M_A - 25.0*P*l + 100.0*R_A*l + 81.0*R_B*l + 49.0*R_C*l + 9.0*R_E*l
# fL= 300.0*M_A - 125.0*P*l + 1000.0*R_A*l + 729.0*R_B*l + 343.0*R_C*l + 27.0*R_E*l
# {M_A: -0.074235807860262*P*l, R_A: 0.222707423580786*P, R_B: -0.501091703056769*P, R_C: 0.793122270742358*P, R_E: 0.659934497816594*P, R_F: -0.174672489082969*P, M_F: 0.174672489082969*P*l}
```
embulk gem install で flock unsupported or native support failed to load でエラーになる

# 現象
Raspbian の環境で、digdag + embulk を利用していて、プラグインをインストールしようとしたら
flock unsupported or native support failed to load でエラーになってしまう

## 環境
Raspberry Pi 3（Raspbian 9.3）
Digdag v0.9.26
embulk v0.9.7
java 1.8.0_171

## 解決方法
ARM Linux用 JFFI をビルドしてコピーする
ant のインストール必要。

```bash
$ sudo apt-get install ant

$ sudo apt-get install build-essential
$ git clone https://github.com/jnr/jffi.git
$ cd jffi
$ ant jar

$ cd build/jni
$ sudo cp libjffi-1.2.so /usr/lib
```

## 解決に至るまで
flock unsupported or native support failed to load でググった結果
まったく同じ症状にたどり着く
https://github.com/jruby/jruby/issues/3699

直接的な解決方法がよくわからなかったが、まずは
-Xnative.verbose=true オプションをつけてデバッグすることにした
bash_profile に以下を追記して、source ~/.bash_profile

```bash:bash_profile
export _JAVA_OPTIONS="-Djruby.native.verbose=true"
```

再度 embulk gem install xxxx を試みると、以下のエラーが吐き出された

```bash
Failed to load native POSIX impl; falling back on Java impl. Stacktrace follows.
java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider

...

Caused by: java.lang.IllegalStateException: Can't overwrite cause with java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: /tmp/jffi7667517909278970909.so: /tmp/jffi7667517909278970909.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
```

最終的にここに誘導されるが、具体的な解決策が理解できなかった。
https://github.com/jruby/jruby/wiki/Native-Libraries

Raspbian が 32bit なので LD_LIBRARY_PATH をなにかする必要があるのか？とか
tmp の場所を変えてみたりとか -Djava.io.tmpdir=/home/pi/tmp 
いろいろ回り道して最終的に、解決にたどり着いたのがここ。

https://github.com/spotify/docker-client/issues/477
jnr.ffi.provider.jffi.Provider raspbian でググった。

途中諦めかけたけど、なんとか解決できてよかった。半日かかってしまった。
PL/SQL　内部ブロックで処理したothers例外を外側のブロックで再度処理させる

PL/SQL内部にて予期せぬ例外が発生したとき、
意図的に例外発生ブロックを記載後、それまですべての処理をrollbackさせたかったので。

具体的には内部ソースにてraiseを記載すればさらに外に伝えてくれる。

`サンプル.sql`


```

DECLARE
ans NUMBER;
BEGIN
  BEGIN
  --内部にて適当な処理
  INSERT INTO emp VALUES(5,'hoge','job','1',sysdate,10,10,2);
  --内部にて予期しない例外発生
  ans := 1/0;
  EXCEPTION
    WHEN others THEN
    --発生したブロックをログ出力なりする。
    DBMS_OUTPUT.PUT_LINE('内部でエラーが発生しました');
    --外部ブロックに意図的に伝播させる
    RAISE;
  END;
EXCEPTION 
  WHEN others THEN
    DBMS_OUTPUT.PUT_LINE('外部でまとめてロールバックします。');
    ROLLBACK;
END;
/

```



実行結果

```

内部でエラーが発生しました
外部でまとめてロールバックします。
PL/SQLプロシージャが正常に完了しました。

```
PHP, Memcached インストール (Install Memcached PHP HomeBrew)

```bash
$ brew install pkg-config
```
```bash
$ pecl install memcached

(中略)

Example:

Installing '/usr/local/Cellar/php@7.1/7.1.18/pecl/20160303/memcached.so'
```
```bash
$ php -i | grep php.ini

Example:

Configuration File (php.ini) Path => /usr/local/etc/php/7.1
Loaded Configuration File => /usr/local/etc/php/7.1/php.ini
```
```bash
$ vim vim /usr/local/etc/php/7.1/php.ini

Add write:

extension='/usr/local/Cellar/php@7.1/7.1.18/pecl/2016033/memcached.so'
```

```bash
$ php -m | grep memcached

memcached
```
async-awaitでもforEachしたい！

JavaScript界で非同期処理の切り札的存在となっている`async`-`await`、そして軽やかにループ処理を行っていく`forEach`。ただ、この2つを合わせて使おうとしたら、うまくいきませんでした。

# 素直に書いてみる

## 準備
まずは、非同期実行するもののモデルとして、こんなコードを書いてみます。

```javascript
const sleep = time => new Promise(resolve => setTimeout(resolve, time));

const sleptLog = async val => {
  await sleep(1000);
  console.log('sleptLog', val);
};
```

`sleep`は単に`setTimeout`を`Promise`化しているだけで、そして`sleptLog`は`sleep`を使って`async`-`await`で`console.log`を遅らせる、というような処理です。

## 文法的な問題に

次に、これを`forEach`で使ってみましょう。

```javascript
const arr = [1, 2, 3];
const testFunc = async () => {
  arr.forEach(item => await sleptLog(item));
  console.log('done!')
};
```

こんなふうに書きたくなるかもしれませんが、これは**文法エラー**です。`await`は、`async`な関数の中に直接書くことしかできないのです。

## 書き換えても意図通りにはならず

ということで、`forEach`のコールバックも`async`にしてみます。

```js
const testFunc = async () => {
  arr.forEach(async item => await sleptLog(item));
  console.log('done!')
};
```

とりあえず文法エラーは解決したのですが、これを実行すると`done!`のほうが先に出力されてしまいます。`forEach`の前に`await`を付けても同じです。

# 原因と対策
## 原因

`forEach`は何が来ようが、コールバックの返り値を**無視します**。結果、`async`関数が生成した`Promise`も無視されて、`await`されることもなく進んでしまいます。

## シンプルなやり方には罠がある

関数を切らない、単なる`for`や`for-in`、`for-of`などであれば`await`はされます。

```js
const testFunc = async () => {
  for(let item of arr) await sleptLog(item);
  console.log('done!')
};
```

ただ、実際に実行してみると気づくかと思いますが、1つ目の実行が終わってから2つ目のタイマーが始まる、というように直列的な動きとなります。あえて使う分には便利な場面もあるかとは思いますが、通信など並列で実行したいという場合には、この方法は向きません。

## ライブラリに、あったじゃない！

「複数の`Promise`を並列に走らせる」関数といえば、`Promise.all`が標準で用意されています。今度は、これを使ってみましょう。

```js
const testFunc = async () => {
  await Promise.all(arr.map(async item => await sleptLog(item)))
  console.log('done!')
};
```

配列を`map`して要素を`Promise`に変換して、それを`Promise.all`に投げ込むことで、「配列の中身すべてについてresolveまで待たせる」ことが実現できました。

# まとめ
`async`-`await`も中身は`Promise`です。状況によっては、`Promise`レベルでハンドリングしたほうが便利なこともあります。
clockworkの小さなサンプル手順メモ

# 前提
- Bundlerでインストール、管理
- Railsアプリの中に入れた

# メモ

## インストール

### Gemfileに追加

```ruby:Gemfile
gem 'clockwork'
```

### インストール

プロジェクト直下

```zsh
$ bundle install ★インストール
$ bundle list ★確認
```
## サンプル実装
- 1分間に1回、日付時間のファイル名の空ファイルを作成する

```ruby:lib/test-clockwork.rb
require "bundler"
Bundler.require

include Clockwork

every(1.minutes, 'test') do
  `touch \`date +%Y%m%d%H%M\``
end
```

### 実行

Ctrl+Cで中断しない限り、実行し続ける

```zsh:コンソール
% bundle exec clockwork lib/test-clockwork.rb
```

## Herokuでの実行

Procfileを準備。herokuにデプロイ
※上記サンプルだと `touch` だと実行した結果がわからないので、なにか別のものを用意する

### Procfile

```zsh:Procfile
worker: bundle exec clockwork lib/test-clockwork.rb
```

デプロイは省略

### Worker起動

```zsh:コンソール
% heroku ps ★ Workerが無かった場合は以下の通り
% heroku ps:scale worker=1
% heroku ps ★ 確認
% heroku ps:scale worker=0 ★ 止める
```
pandasでWindow関数的な集計

調べばあるもんですね。
pandas DataFrame内の同一データ系列で、「直近3つのデータの平均値」とか、「直近3つのデータで、ある閾値を超えている件数」を算出したい場合のtips。


## Libary import

```python
import pandas as pd
import numpy as np
from numpy.random import *
from pandas import rolling_mean, rolling_apply
```

## data generation

```python
### Randomに0-1のデータを10個生成(numpy array形式)
tmp = rand(10) #
```

具体的にはこんな感じ

```python
tmp
#array([0.05049257, 0.19130526, 0.38653303, 0.01820196, 0.28877423,
#       0.57416531, 0.85929624, 0.92731291, 0.27886026, 0.51936736])
```

ついでにDataFrameにしときます。

```python
df = pd.DataFrame(tmp)
df.columns = ['values']
```

するとこんな感じ：

```python
df
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80539/89e3ef2e-244b-da3c-51e2-60e561ea2fe8.png)


## Moving average
さて、移動平均(moving average)を計算しましょう。`rolling_mean`メソッドを使います。

```python
## `ma`列に、直近3の幅の移動平均を計算した値を入れます
df['ma'] = pd.rolling_mean(df['values'], 3)
```

するとこんな感じ：

```python
df
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80539/1e51e581-0c5e-18da-548f-f7e9ffe4f84b.png)

- `ma`列の最初の2つは計算されませんね。「直近の3つのデータ」が存在しないんで。
- 3つ目(`index`が2のとこ)は、`0.209..`ですが、これは`0.050..`, `0.191...`, `0.396..`の平均ですね。他も同様。

## Customized column

もうちょっと凝ったこと、ということで、冒頭にも記載した「直近3つのデータで、ある閾値を超えている件数」を計算します。

- まず、配列(`numpy array`)を受け取って`0.3`より大きい件数を返す関数を作っときます：

```python
def count_threshold(x):
    return np.sum(x>0.3)
```

- で、冒頭の計算させると、こんな感じに：

```python
df['count_threshold'] = pd.rolling_apply(df['values'], 3, count_threshold)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80539/b703a849-5658-4e8b-293d-2f3dd948dbda.png)


## References
- [Rolling_mean](http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.rolling_mean.html)
- [Rolling_apply](http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.rolling_apply.html)
Nvidiaドライバ　再インストール(Ubuntu 16.0.4LTS)

#NVIDIAドライバ　再インストール
webから取ってくる(http://www.nvidia.com/Download/index.aspx?lang=en-us)


```
ctrl + alt + F1 でCUIログイン
sudo service lightdm stop 
sudo chmod 755 NVIDIA-*.run
sudo ./NVIDIA-*.run 
sudo service lightdm start
```

nvidia関連でログインループから抜け出せなくなった時はとりあえずドライバを消して，上記の方法で再インストールする。

```
sudo apt-get purge nvidia-*
sudo apt-get purge cuda-*
```


自分の環境では(apt-get install nvidia-*)でできなかったのでメモ
消費税の累進課税についてエンジニアの立場で検討してみる

今回は、消費税について。
消費税は、メリットとデメリットがあります。

 

メリット

・税収が景気動向に左右されず、財源として安定している

・シンプルで分かりやすい制度

・節税できない

 

デメリット

・収入が低いほど負担が重い。逆進性。

 
消費税にはあまりいい印象を持たない人もいますが、逆進性という問題さえ解決できれば、非常に合理的な仕組みです。
 

消費税自体の仕組みは、グーグル先生に聞くとして、今回は以下のような仕組みを検討します。


 

(1)全ての取引に対してインボイスを導入する。

(2)消費者は、取引時にマイナンバーカードを提示する。

(3)税率は以下の通り
世帯の一人当たり消費額が月額5万円を超えない額に対して、8%
5万円以上、8万円未満に対して12％
8万円以上、12万円未満に対して16％
12万円以上、16万円未満に対して20％
16万円以上に対して24%

(4)住居、自動車等の高額の購入については、消費額を耐用月数で割った額を耐用年数までの月の初めに消費したとして計算し、購入時に一括で支払う。

(5)所得税は廃止する。

(6)法人の消費に関しては、一律24％とし、代わりに法人税を廃止する。

(7)事業者の会計上の税率は24％とし、差額分を消費者に還付する。

(8)還付は取引成立後、即時に行い、事業者に代行させる。

 
いくつか、わかりにくいところを補足します。
(4)ですが、例えば100万円の車を購入する場合、1か月で100万円を消費したとすると、その月だけ消費税額が跳ね上がってしまい、車を買わなくなってしまいます。

そこで、5年の耐用年数として、100万円/60か月=1.67万円を毎月消費したとみなして計算するという形です。
すなわち、購入時に8万円の消費税を支払い、以降5年間は毎月の世帯消費額が1.67万円からスタートとなります。



 

(7)(8)についても少し解説が必要でしょう。

事業者が消費税を納付する場合、支払額は付加価値に消費税率を乗じて計算します。
例えば、今の制度で消費税率8％、800円で仕入れて1000円で販売する場合、以下のように支払額を決めます。


仕入れ先業者から購入するとき、消費税として支払う額
>800円×0.08=64円

また、消費者に売るとき、消費税として
>1000円×0.08=80円

を受け取ります。

事業者が消費税として納税する額は、
>80円-64円=16円

となります。

 

検討する制度ではどうでしょうか。

消費額から計算するAさんの消費税率は8%とします。

法人の消費税率は24%なので、仕入れ先業者から購入するとき、
>800円×0.24=192円

を仕入れ先業者に支払います。

対して、Aさんに売るとき、消費税として受け取る額は
>1000円×0.08％円=80円

です。事業者としては、192円-80円＝112円の損失が発生します。

この分は、期末に国から還付を受けるという形になりますが、還付を受けるまでの間、そのお金を立て替える必要があります。

これでは事業者の負担感が大きい。


そこで、事業者が消費者から受け取る消費税率を24％にします。

すなわち、消費者から
>1000×0.24=240円

をAさん受け取ります。このとき、適切な消費税額は80円なので、Aさんは160円余分に支払います。

消費者は160円の還付を受けます。この還付は、例えば1年分まとめて年末に還付するような方式もありますが、やはり立て替えるのは負担感が大きい。

そこで、ITを駆使して取引成立後、即時還付します。

>1.取引成立後、インボイスに登録する
2.サーバー側で、本人のマイナンバーからその月の消費額を計算し、取引時の消費税額(80円）と還付額(160円)を算出
3.還付額(160円)を事業者に即時振り込む
4.事業者は消費者（Aさん）から、還付額を差し引いた額（1080円）を受け取る。


まず国から事業者に160円支払い、事業者は消費者から代金として受け取る1240円を、1080円に減額することで消費者に還付するという仕組みです。

事業者は、240円-192円=48円を消費税として納税します。

今回はここまで。次回はこの仕組みについて詳細に検討してみます。
バーチャルキャストでサーバないけどスライド作る方法

# バーチャルキャストでサーバないけどスライド作る方法
バーチャルキャストで画像ファイルをVR空間に持っていってプレゼンなど出来る機能があります
画像ファイルをサーバにアップしてHTTPでアクセスできる状態にする必要があるのでサーバが必要となります
普通の人は（私も）サーバは持っていないので、Google Driveを使ってスライドを作ってバーチャルキャストでプレゼンする方法を紹介します。

## 1.スライドを作成（Google プレゼン)
スライドの元になるデータをGoogleプレゼンで作成します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79067/3ecd277a-bc23-b5e7-e8c3-839d6f52aa72.png)

## 2.ファイル形式をPNGで保存します
【ファイル】→【形式を指定してダウンロード】→【PNG画像(.png、現在のスライド)】でスライドをPNGで保存します
※複数枚ある場合は1個づつ保存します・・・ぇえ、めんどくさいです・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79067/b52497ab-76a8-71fc-4105-1fc06cd099b7.png)

## 3.保存したファイルをGoogle Drive内にコピーします
保存したファイルをドラッグ＆ドロップで適当なGoogle Drive内にコピーします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79067/2784a7fb-88e8-ca30-0134-eda103bccf4d.png)

## 4.コピーしたファイルの共有リンクを取得します
コピーしたファイルを左クリックで
【共有可能なリンクを取得】を選択します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79067/94e1f2f6-d981-7de2-cbf1-d7eee6f6adc8.png)

共有可能なリンクが表示されますのでコピーします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79067/02b98743-181d-8364-c6b8-cb27479c1629.png)

## 5.バーチャルキャスト用のconfig.jsonを作成
コピーしたリンクはそのままでは画像を開くことができません
画像直接リンクにURLを変更する必要があります

詳しくは
[Google Drive に保存した画像を直接呼び出せるURLの取得](https://qiita.com/arribux/items/0394968fa318d9309d33)
こちらの記事を参照してください

今回取得した共有リンクが
```
https://drive.google.com/open?id=1zHu3MW9o7plPnbsZht83n7z59pK1FWMq
```
こちらでしたので、先ほどの記事の通り
```
http://drive.google.com/uc?export=view&id=1zHu3MW9o7plPnbsZht83n7z59pK1FWMq
```
このように（手で）書き換えます・・・がんばっ

書き換えたURLをconfig.jsonの中に入れます
[バーチャルキャスト用のconfig.jsonの作成方法](https://qiita.com/miyumiyu/items/5cf729a67eb372de2630)
こちらの記事を参考に、config.jsonを作成してください

実際に作成したconfig.jsonはこちらになります

```json:config.json
{
  "whiteboard": {
    "urls": [
       "http://drive.google.com/uc?export=view&id=1zHu3MW9o7plPnbsZht83n7z59pK1FWMq"
    ]
  }
}
```

## 6.バーチャルキャストを起動して確認
VirtualcCast.exeと同じフォルダーにconfig.jsonがあることを確認してバーチャルキャストを起動します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79067/af82a8cb-be86-fa35-bd37-31c8a8a0936d.png)

起動してホワイトボードを出すとこんな感じになります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79067/162cdcd8-0045-949c-2b4d-13482c1a63e5.png)

## 7.最後に

config.jsonの設定に関しては以下のURLを確認してください

モデルデータの設定方法
https://www.infiniteloop.co.jp/blog/2018/04/virtualcast-matsui/

パノラマ画像の設定方法
https://www.infiniteloop.co.jp/blog/2018/05/virtualcast-panorama/

ホワイトボード・カンペ・ダイレクトビューの設定方法
https://www.infiniteloop.co.jp/blog/2018/06/virtualcast-122-release/

[らーめん](https://twitter.com/priramen)さんのconfig.jsonの中身を作成ツール
http://ramensoy.webcrow.jp/vc_json_creator/