OmniAICreator/Qiita-1.07M huggingface dataset:
Actions on Google で作ったテストアプリを他のユーザからもGoogle Home使用する方法

# 背景
我が家では家族でGoogle Homeを利用している。
IFTTT連携でもいろいろできるけど、もっと柔軟に使うためにActions on Google使いたいよねってことで試しに自分のアカウントでテストアプリを作成した。
さっそくGoogle Homeで試してみたところ、自分の声では操作できるけど妻の声では操作できない・・・
調べてみたところ、どうやらテストバージョンだと以下の条件でないと使えないらしい
https://qiita.com/doki_k/items/5caff84c03946150aef7

- セットアップしたアカウントと開発するアカウントが同じ
- テストアプリを試す人がアカウントリンクをしていない

この条件だと妻のアカウントのアカウントリンクを削除する必要があり、そうするとアカウントに紐付いた情報(カレンダーとか)が取得できない。
なんとかアカウントリンクした状態でもできないか試した結果、方法がみつかった

# 手順
Action on Googleの細かい設定については他記事を参照
(https://qiita.com/marchin_1989/items/6567c5a62b7a470cfe21)

Google Home⇔Action on Google⇔Dialogflow
を使ってアプリを実装している。

Action on Googleの画面の右上の
「3つの点」→「Manage User Access」を押下
GCPのIAMの画面に遷移するのでそこで必要なユーザ(今回は妻のアカウント)を追加
追加したユーザでログインした状態のまま、Action on Googleのテストを実行する。
問題なくテストが動作すれば成功。これでGoogle Homeからも利用できるようになった

# 注意点
今回、Google Home⇔Action on Google⇔Dialogflowの連携で試したので他アプリでも問題なく動作するかは不明
GCPのIAM権限についてはGCPのリソースをいじれてしまうので気をつけてください
flutter build apkすると`Execution failed for task ':app:processReleaseResources'.`と出る

#### 原因
`flutter build apk -t -t lib/main_staging.dart --release`でapkファイルを作成しようとしていた

#### 解消法
`flutter build appbundle -t lib/main_production.dart --release`でaabファイルを作成する

#### 手元で`flutter build apk`した際に出たエラー
```sh
You are building a fat APK that includes binaries for android-arm,
android-arm64, android-x64.
If you are deploying the app to the Play Store, it's recommended to use app
bundles or split the APK to reduce the APK size.
    To generate an app bundle, run:
        flutter build appbundle --target-platform
        android-arm,android-arm64,android-x64
        Learn more on: https://developer.android.com/guide/app-bundle
    To split the APKs per ABI, run:
        flutter build apk --target-platform
        android-arm,android-arm64,android-x64 --split-per-abi
        Learn more on:
        https://developer.android.com/studio/build/configure-apk-splits#configur
        e-abi-split

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processReleaseResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > Android resource linking failed
     /Users/dainaikai/.gradle/caches/transforms-2/files-2.1/9d02fd66e7e6d4a1bc03a8f87e50aa5b/appcompat-1.1.0/res/values-v28/values-v28.xml:5:5-8:13: AAPT: error: resource android:attr/dialogCornerRadius not found.

     /Users/dainaikai/.gradle/caches/transforms-2/files-2.1/9d02fd66e7e6d4a1bc03a8f87e50aa5b/appcompat-1.1.0/res/values-v28/values-v28.xml:9:5-12:13: AAPT: error: resource android:attr/dialogCornerRadius not found.

     /Users/dainaikai/.gradle/caches/transforms-2/files-2.1/013bbe37b97b7c0e54550a4ba7498a94/core-1.0.1/res/values/values.xml:57:5-88:25: AAPT: error: resource android:attr/fontVariationSettings not found.

     /Users/dainaikai/.gradle/caches/transforms-2/files-2.1/013bbe37b97b7c0e54550a4ba7498a94/core-1.0.1/res/values/values.xml:57:5-88:25: AAPT: error: resource android:attr/ttcIndex not found.

     /Users/dainaikai/.gradle/caches/transforms-2/files-2.1/9d02fd66e7e6d4a1bc03a8f87e50aa5b/appcompat-1.1.0/res/values/values.xml:2772:5-2795:25: AAPT: error: resource android:attr/textFontWeight not found.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1m 20s
```
Pythonで米国取引所上場銘柄のTicker Symbolを取得する

# はじめに

 ニューヨーク証券取引所（NYSE）とNASDAQの株価のデータを取得しようと思ったら、銘柄のTicker Symbolを知る必要があったため、その方法を記します。上場している銘柄すべてがリストアップされているかを確認していませんので、参考まで。

# 環境
Windows 10 home

Anaconda(Python 3.7.6)

Pandas 0.24.2

# Ticker Symbolを取得する

NASDAQのftpからリストを取得して、成型します。

```python
import pandas as pd

others_list = 'ftp://ftp.nasdaqtrader.com/symboldirectory/otherlisted.txt'
nasdaq_list = 'ftp://ftp.nasdaqtrader.com/symboldirectory/nasdaqlisted.txt'

def symbols_nyse():
    other = pd.read_csv(others_list, sep='|')
    #NYSEのものを取得する
    company_nyse = other[other['Exchange']=='N'][['ACT Symbol', 'Security Name']]
    #ETFはMYSE MKT、NYSE ARCA、MATSがある。
    etf_other = other[other['ETF'] == 'Y'][['ACT Symbol', 'Security Name', 'Exchange']]   
    #indexはリセットする
    company_nyse = company_nyse.reset_index(drop=True)
    etf_other = etf_other.reset_index(drop=True)
    #ACT Symbol -> Symbol
    company_nyse = company_nyse.rename(columns={'ACT Symbol':'Symbol'})
    etf_other = eft_other.rename(columns={'ACT Symbol':'Symbol'})
    
    return company_nyse, etf_other

def symbols_nasdaq():
    nasdaq = pd.read_csv(nasdaq_list, sep='|')
    #StatusがNormalのものだけを取得する
    nasdaq_normal = nasdaq[nasdaq['Financial Status']=='N']
    #Test issueでないものを選択する
    nasdaq_normal = nasdaq_normal[nasdaq_normal['Test Issue']=='N']
    #ETFかどうかで判別
    company_nasdaq = nasdaq_normal[nasdaq_normal['ETF']=='N'][['Symbol', 'Security Name']]
    etf_nasdaq = nasdaq_normal[nasdaq_normal['ETF']=='Y'][['Symbol', 'Security Name']]
    #indexはリセットする
    company_nasdaq = company_nasdaq.reset_index(drop=True)
    etf_nasdaq = etf_nasdaq.reset_index(drop=True)

    return company_nasdaq, etf_nasdaq

def symbols_all():
    company_nyse, etf_other = symbols_nyse()
    company_nasdaq, etf_nasdaq = symbols_nasdaq()
    #NYSEとNASDAQは区別する
    company_nyse['Market'] = 'NYSE'
    company_nasdaq['Market'] = 'NASDAQ'    
    #NASDAQのETFも区別しておく
    etf_nasdaq['Exchange'] = 'NASDAQ'#etf_otherのcolum名に合わせる

    return (pd.concat([company_nyse, company_nasdaq], ignore_index=True, sort=False),
            pd.concat([etf_other, etf_nasdaq], ignore_index=True, sort=False))

```



# Ticker Symbolを表示

'Symbol'列を見れば、上場している企業のTicker Symbolがわかります。

```python
company, etf = symbols_all()
company
```
<img width="289" alt="symbols.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/0313905e-630c-2e22-c1c5-ca84863f3dfc.png">

#　参考

- http://www.nasdaqtrader.com/trader.aspx?id=symboldirdefs#other
- http://www.nasdaqtrader.com/trader.aspx?id=symboldirdefs#nasdaq
ブラウザーフィンガープリント



まとめと整理の意味を込めて、
詳しく説明されているサイトを載せておく。


[Distil Networks社　WEBスクレイピング/ボット対策に！](https://www.cornet-solutions.co.jp/products/DistilNetworks/)

[Web Browser Fingerprint解説ページ](https://www.saitolab.org/fp_site/)


[ブラウザフィンガープリント、その凄さ〜Torブラウザアクセスの識別可能性まで〜]
(https://medium.com/@saitolab_org/%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%95%E3%82%A3%E3%83%B3%E3%82%AC%E3%83%BC%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88-%E3%81%9D%E3%81%AE%E5%87%84%E3%81%95-tor%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AE%E8%AD%98%E5%88%A5%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%BE%E3%81%A7-31a5d29a5796)


[そのSelenium、ばればれですよ。](https://note.com/flashboys/n/n7d5bd0d2f307)

[【Python】個々のDesiredCapabilities情報を設定する](https://www.seleniumqref.com/api/python/browser/Python_DesiredCapabilities_set.html)
VSCode上で正規表現を使ってJSONデータを編集する

VSCodeで正規表現を使った置き換えできたので知見をシェア
それを知らずにコードを書いてJSONデータを編集していたけど無駄だった。

## Cmd + F で検索窓を開きピンクの枠のところをクリックする
![7.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/b0cc233d-4744-b798-6afe-cfe72ab99d67.jpeg)

画像の通りで、もうここまでくれば説明不要かもしれませんが続けます

## あとは正規表現の条件を入力して「全て置き換える」を選択すればOK
![7.2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/41a0b0f6-15a4-9118-dfa6-a095745416e6.jpeg)

## 正規表現のおすすめ手法（初心者向け）
とりあえず 「 .+ 」 を使っておけば色々な条件に当てはめられます。
正規表現は記号と役割をいちいち説明するのは別の記事で探せば色々見つかるので割愛します
<a href="https://userweb.mnet.ne.jp/nakama/">参考：サルにもわかる正規表現入門</a>

「.」は任意の自由な１文字
「+」は同じ文字の繰り返し
つまり「 .+ 」は任意の自由な１文字の繰り返し

例えば 【.+】 の場合は【】がついている文字列を全て検索することができます。
任意の文字に .+ の正規表現をかませば色々と当てはめることができます。

## つまづいたポイント
簡易的な正規表現でしか使えません。
例えば行頭を現す ^ を ' と一緒に使いたかったのですがマッチしませんでした。
また行末にある空白を取得もうまく行きませんでした。その場合は一気に変換できる正規表現を考えるよりアナログな方法を何回か繰り返した方が結果早く仕事ができると思います。
（JSONデータでやっていたけどもともとあるタブなどもヒットしてしまいやりにくかった）

例えば空白がきて、その後に行末の ' がやってくるパターンの場合$や?:などを駆使せず「空白 + '」をそのまま検索して「'」に置き換える、などのアナログな正規表現を使って変換しました。

## おまけ
蛇足ですがRubularというリアルタイムで正規表現のマッチングが確認できるサイトはとても便利です。
もしVSCodeでやりたいことができなかったらRubularを参考にしながらコーディングできます。
<a href="https://rubular.com/">参考：Rubular</a>
WildflyのログをElastic Stackへ取り込む

# はじめに

WildflyのログをElastic Stackへ取り込んで、Kibanaでログの表示する環境を構築してみます。

データの流れは
　wildflyログ→Filebeat→Logstash→Elasticsearch
となります。
Filebeatから直接Elasticsearchという構成できます。


# 環境

使用した環境は以下のとおり。

- CentOS 7.5
- Elasticsearch 7.8
- Kibana 7.8
- Filebeat 7.8
- Logstash 7.8

「[ElasticStack 7.8 環境構築](https://qiita.com/mkyz08/items/d4eb9f20efbd9dc77547)」で構築した環境を利用しています。


# Logstashの設定

/etc/logstash/conf.d以下にwildfly.confファイルを作成します。

```
# vi /etc/logstash/conf.d/wildfly.conf

input {
  beats {
    port => "5044"
  }
}
filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel}\s+\[%{GREEDYDATA:class}\]\s+\(%{GREEDYDATA:thread}\)\s+%{GREEDYDATA:msgbody}" }
  }
  date {
    match => ["logdate", "YYYY-MM-dd HH:mm:ss,SSS"]
  }
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "wildfly-%{+YYYY.MM.dd}" 
  }
}
```

Elasticsearchへ送る前にLogstashで確認したい場合は以下のように標準出力へ出力するように設定して確認できます。

```
output {
  stdout { codec => rubydebug }
}
```


- /opt/wildfly-20.0.1.Final/standalone/configuration/logging.properties

上のWildflyのログ設定ファイルを見ると次のレイアウトになっていました。

```
formatter.PATTERN.pattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n
```

そのため、grokは以下のように設定しています。

```
%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel}\s+\[%{GREEDYDATA:class}\]\s+\(%{GREEDYDATA:thread}\)\s+%{GREEDYDATA:msgbody}
```


最後に作成したwildfly.confファイルを読み込んでLogstashを起動します。

```
# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/wildfly.conf 
```

# Filebeatの設定

filebeat.ymlを変更し、Wildflyのログファイルを読み込み、Logstashへ送信するように設定します（変更点のみ抜粋）。

```
# vi /etc/filebeat/filebeat.yml

- type: log
  enabled: true
  paths:
    - /opt/wildfly-20.0.1.Final/standalone/log/server.log
#output.elasticsearch:
  #hosts: ["localhost:9200"] 
output.logstash:
  hosts: ["localhost:5044"]
```

Filebeatを自動起動するように設定し、起動させます。

```
# systemctl enable filebeat
# systemctl start filebeat
```

# Kibanaで可視化

Index Patternsにwildfly-*で登録し、[Discover]からログを確認してみると以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/9112049a-0f5f-a6da-7d44-a0ce521e727c.png)
google-images-download フォルダーはできるけどダウンロードされない

#不具合

 googleimagesdownload を使って、学習用画像をダウンロードしようとしたけどエラーになった

```Unfortunately all 10 could not be downloaded because some images were not downloadable. 0 is all we got for this search filter!
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/d1b7b75d-3c2a-2faf-3a75-146297ab60eb.png)

#対処方法

パッチを含んだgoogle-images-downloadをダウンロードしてinstall
$ git clone https://github.com/Joeclinton1/google-images-download.git gid-joeclinton
$ pip install -e gid-joeclinton
ngrx(Effecter)テストコードについて書いてみる。

#経緯
初めてQiita等のサイトに記事を投稿するのですが
主に自分が学んできたものをまとめて世にアウトプットすることで
より理解が深まるかと思い記事を投稿しようと決意しました。

今回は、今現場で実際に書いている
ngrxのテストコードについて記載していこうと思います。

記載している内容のものが
間違っていたりした場合は修正したいと思いますので
ご教授お願いいたします。

##サンプルコード(テストの下準備)
    import { TestBed } from '@angular/core/testing';

    describe('HogeEffecter', () => {
      let effects: HogeEffects;
      let service: HogeService;
      let actions$: Observable<Action>;

    class MockHogehogeFacade {
        hoge() {}
        entities$: Observable<Dictionary<HogeStore>> = EMPTY;
    }

    class MockHogeSerivce {
        fuga() {}
    }

    function resetFacadeProvider(
     entities$: Dictionary<HogeStore> 
    ) {
       const mock = new MockHogehogeFacade();
       mock.entities$ = entity ? of(entity) : of(null);

     TestBed.resetTestingModule();
     TestBed.configureTestingModule({
      providers: [
        {provide: hogehogeFacade , useValue: MockHogehogeFacade},
        {provide: HogeService , useValue: MockHogeSerivce},
        provideMockActions(() => actions$),
      ],
    });

     // インスタンスを作成
     effects = TestBed.get(HogeEffects);
     TestBed.get(HogeFacade);
     service = TestBed.get(HogeService);
    }

     beforeEach(() => {
     // デフォルト設定
     resetFacadeProvider();
    });



かなり端折ってますが、ざっと上記に書いてみました。
ポイントとしては
 - Facadeにある値はmock化する
 - beforeEachで常にmock化したものを作成する
と思っております。

こうすることで実際のテストコードを書く部分で値を常に入れてあげることができるため
スムーズにテストコードが書けるかと思います。

##サンプルコード(テスト部分)
     it('hoge$', () => {
      spyOn(service, 'fuga').and.returnValue(of('test'));
      actions$ = hot('a', {
       a: HogeActions.hoge({
         hoge: 'test',
         }),
      });

     const expected = cold('a', {
       a: HogeActions.fuga({
         Hoge: 'test',
         }),
     });

    expect(effects.hogehoge$).toBeObservable(expected);
    });


基本的にはこのような形になるかと思います。
コード最中にDelayやsetTimeOutなどがある場合は、アクションの発生時間を変えて
期待値を書かなければならないということを覚えておけば問題ないと思います。






以上、ざっくりとですが備忘録の意味も込めて記載してみました。
時間があればほかのものに関してや、この記事をもっと深めて書ければいいなと思っています。
JavaScript var,let,const 使い分け


#はじめに
実装でjsを書いている際に、変数宣言(var,let,const)の使い分けが整理できていなかったのでこの機会にまとめておこうと思う。

#var

再宣言・再代入が可能で、初期化なしの宣言が可能。


```javascript

var x = 1;
console.log(x); //1

x = 2;
console.log(x); //2 再代入

var x = 3; //再宣言
console.log(x); //3

var s; // 初期化なしの宣言
```

スコープは関数スコープ
変数xは関数のスコープ内でのみ参照できる。

```javascript

function (){
    var x = 0;
    console.log(x); //0
}

console.log(x); //error x is not defined
```

#let
再代入は可能だが再宣言は不可となっている。初期化なしの宣言が可能。

```javascript

let x = 1;
console.log(x); //1

x = 2;
console.log(x); //2 再代入

let x = 3; //SyntaxError 再宣言はできない

let s; // 初期化なしの宣言
```
スコープはブロックスコープ
ブロック内で宣言された変数は、スコープ内でのみ参照でき、スコープの外側からは参照できない。

```javascript

{
    let x = 1;
    console.log(x); // => 1
}

console.log(x); // => ReferenceError: x is not defined
```



```javascript

function fn(){
   let x = 1;
   console.log(x); 
{
   let x = 2;
   console.log(x); 
}
   console.log(x); 
}

fn()

```

結果はこんな感じ

```
// => 1
      2
      1
```

#const
再宣言、再代入が不可で、更に初期化なしの宣言が不可。

```javascript

const x = 1;
console.log(x); //1

const = 2;
console.log(x); //2 TypeError

const x = 3; //SyntaxError 再宣言はできない

const s; //SyntaxError
```
スコープは`let`と同じくブロックスコープ。

# キーワードなしの宣言
var, let, constをつけなくても変数宣言は成立する。ただしグローバルに参照できる変数となるためバグの元となり非推奨。

#変数の巻き上げ
JavaScript の変数に独特な点として、例外を発生させることなく後に宣言した変数を参照できる点がある。これを巻き上げという。
関数内で宣言したローカル変数をすべてundefinedで初期化するということ、その関数の先頭で宣言されたものと見なされるというもの。
例として

```javascript

var x = 0;
function (){
    console.log(x);
    var x = 1;
    console.log(x);
}

// => undefined
      1
```

#使い分け
varは使わず、let/constを使う。理由として

varは書き換えが可能なこと、巻き上げ時のバグを生み出しやすいことがあげられる。
letやconstを使っていれば、書き換えてしまってもエラーを出してくれるので、バグ発見に繋がりやすい。
現在インストールされているすべてのdebパッケージをダウンロードする

```shell
$ dpkg -l | grep "^ii"| awk ' {print $2} ' | xargs sudo apt-get -y install --reinstall --download-only
```

これを実行すると `/var/cache/apt/archive` 配下にdebパッケージがダウンロードされる。

ポイントになるのは `--reinstall` オプション（既存でインストールされているパッケージも対象にする）と `--download-only` オプション（debパッケージのダウンロードのみを行う）がついているところ。
[Rust] Vec<[T; N]>をVec<T>に変換する

`Vec<[T; N]>` を `Vec<T>` に効率的に変換するコードが必要だったのですが, うまくできず焦ってひねり出しました. いささか自信がないのですが, これでいいんでしょうか. safe にできる気がするのですが[^1].

[^1]: この手の記事は噂のQiitaの「質問」機能を使うべきなんでしょうか？

※unsafe コードです. ご利用は自己責任で.

PlayGround: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ac728a798c07d9f7b4f69bd19e5db89c

```rust
const N: usize = 4;

fn into_raw_vec<T>(v: Vec<[T; N]>) -> Vec<T> {
    let mut v = std::mem::ManuallyDrop::new(v);

    let p = v.as_mut_ptr() as *mut T;
    let len = v.len() * N;
    let cap = v.capacity() * N;

    unsafe {
        Vec::from_raw_parts(p, len, cap)
    }
}


fn main() {
    let original: Vec<[i32; N]> = (0..8).map(|i| [i; N]).collect();
    println!("{:?}", &original);
    
    let raw_vec: Vec<i32> = into_raw_vec(original);
    println!("{:?}", raw_vec);
}
```

# 参考文献

* https://doc.rust-lang.org/std/vec/struct.Vec.html#method.from_raw_parts

# 追記 2020-08-06

@YoshiTheChinchilla さんと @kobae964 さんに有用なコメントを頂いたのでコメント欄もご覧ください. オーバーフローチェックも行うとこんな感じでしょうか.

```rust
fn into_raw_vec<T>(v: Vec<[T; N]>) -> Vec<T> {
    let mut v = std::mem::ManuallyDrop::new(v);

    let p = v.as_mut_ptr() as *mut T;
    let len = v.len().checked_mul(N).unwrap();
    let cap = v.capacity().checked_mul(N).unwrap();

    unsafe {
        Vec::from_raw_parts(p, len, cap)
    }
}
```
Visual Studio Code で Salesforce の開発環境構築

#随時更新
[・Visual Studio CodeでSalesforceの開発環境を構築する](https://qiita.com/shunkosa/items/e6248520bff90f397158)
[・Visual Studio CodeでSalesforceのApexテストを実行・デバッグする](https://qiita.com/shunkosa/items/98f107dd532166e8d4a6)
golang の datastore の unittest でハマった話

# 概要

datastore.NewClient は実在の projectId を要求する

- context は aetest.NewContext を使う
- datastore client はテストでも使い方は同じ
- projectId が非実在のものだとエラーになる
- 実際の datastore には書き込まれていないのは確認済み

--> **テストでも実在の ProjectId を指定する必要がある**

少し調べた範囲ではこれに関する情報が見つけられなかったため、あくまで推論。情報があれば教えて下さい。

# コード

```go
func NewClient(ctx context.Context, projectId string) (*datastore.Client, error){
    return datastore.NewClient(ctx, ProjectId)
}
```

```go
func TestDatastore(t *testing.T) {
  ctx, done, err := aetest.NewContext()
  if err != nil {
    t.Fatal(err)
  }
  defer done()
  
  // NG
  if c, err = NewClient(ctx, "dummy-project"); err != nil {
    t.Fatal(err)
  }

  // OK
  if c, err = NewClient(ctx, "real-project-12345"); err != nil {
    t.Fatal(err)
  }

  // ...
}
```

# 追記

[luci/gae](https://github.com/luci/gae) というのを使うと高速にできるようです
PHP 数値を整数にする

# 目的

- 小数点の値を整数へ変換する方法をまとめる。

# 例

- 下記に少数の値を整数へ変換するキャストを用いた方法の例を記載する。少数が切り捨てられた整数の値が出力される。

    ```php
    echo (int)小数点の数値;
    ```
- 下記に少数の値を整数へ変換する関数を用いた方法の例を記載する。少数が切り捨てられた整数の値が出力される。

    ```php
    echo intval(小数点の数値);
    ```

# 具体例

- 変数`$a`に格納された数値を整数に変換するキャストを用いた方法を下記に記載する。下記を実行すると「2」が出力される。

    ```php
    $a = 2.2;
    echo (int)$a;
    ```
- 変数`$a`に格納された数値を整数に変換する関数を用いた方法を下記に記載する。下記を実行すると「2」が出力される。

    ```php
    $a = 2.2;
    echo intval($a);
    ```

# 参考文献

- [整数](https://www.php.net/manual/ja/language.types.integer.php)
MacOS上のDocker版JenkinsでDooD環境構築

# はじめに
DooDはJeknisのジョブ実行時にホストにコンテナを作成しビルドします。
コンテナを利用することにより、ビルドサーバーの構築の必要性がなくなります。
ただし、本手順はセキュリティのリスクがあるので乱用しないようにお願いします。

# 前提
## MacOS
以下がインストールずみであること。

* docker
* docker-compose

## Jenkins
以下のプラグインが導入済みであること。

* docker plugin
* Docker Pipeline

# 手順

## Dockerfileの作成
```
FROM jenkins/jenkins:lts

ENV DEBIAN_FRONTEND noninteractive

USER root

RUN apt-get update -y \
&& curl -fL -o docker.tgz "https://download.docker.com/linux/static/test/x86_64/docker-19.03.9.tgz" \
&& tar --strip-components=1 -xvzf docker.tgz -C /usr/bin \
&& gpasswd -a jenkins root 

USER jenkins
```
jenkinsユーザーをrootグループに所属さしています。所属させることで、Dockerを操作できるようになります。
ただし、rootグループに属させるのはセキュリティ上良くないので、乱用しないでください。
ちなみにLinux上だとdockerグループに所属させる。

## Dockerfile ビルド
以下コマンドを実施
`docker build -t <任意のイメージ名> .`
`.`はDockerfileのあるディレクトリを指定しています。

## docker-compose.ymlの作成
```
version: "3"
services:
  jenkins:
    container_name: jenkins
    image: <任意のイメージ名>
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
```
/var/run/docker.sock マウントすることでホストのDockerを操作できるようにします。

## docker-compose バックグラウンド実行
以下コマンドでバックグラウンドで実行します。
`docker-compose up -d`
docker-compose.ymlのあるディレクトリで実行すること。

## Jenkinsにプラグインを導入
あとはDocker pluginを導入し、ジョブを作成すると出来上がりです。

# まとめ
Jenkinsサーバーを使っているとスレイブのビルドサーバーが汚れがちなので、DockerでCIを回そうと思った。しかし、GithubActionsかCircleCIを使えば良いような気がした。
Jenkinsを使用するメリットでなんだろうか。
あと、rootユーザーに所属させるよりもっと良い方法があれば教えてください。

# 参考文献
https://fintan.jp/?p=4655
ソースコードでUINavigationController 2020summer

Xcode 11.6
iOS 13.6

アプリの土台にUINavigationController（のサブクラス）を置くときのやりかた、のとりあえずのメモ。storyboardはさわらない。

1. プロジェクト作成
2. storyboardいじらず
3. 最初に表示したいUIViewController（つまりUINavigationControllerの第1子）を作成。ここではMenuViewControllerという名前とする。
4. 次のソースを書く。これは最初からあるViewControllerを上書きする。

```swift
class ViewController: UINavigationController {
	//ストーリーボードからこれが呼ばれる
	required init?(coder aDecoder: NSCoder) {
		super.init(rootViewController: MenuViewController())
	}
}
```

5.表示したいUIViewControllerのviewDidLoad()に

```swift
view.backgroundColor = UIColor.systemBackground//上部が黒くなるのを回避
```

を追加。

#AppDelegateに書くやり方が主流
検索するとほとんどが以下のやり方である。

```swift
class AppDelegate: UIResponder, UIApplicationDelegate {

	//⭐️追加する
	var window: UIWindow?

	func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
		// Override point for customization after application launch.
		
		//⭐️追加する
		self.window = UIWindow(frame: UIScreen.main.bounds)
		self.window?.rootViewController = UINavigationController(rootViewController: MenuViewController())
		
		return true
	}
```

しかし、この記事のはじめに書いたやり方で何か不都合があるのだろうか？わからない。

#backgroundColorの指定について
UINavigationControllerのviewに指定するのではなく傘下のUIViewControllerのviewで指定している理由
土台のclass ViewController: UINavigationControllerのviewにbackgroundColor = .systemBackgroundを指定すると、画面推移時にUINavigationController部分（戻るボタンなどが表示されるエリア）の描画がなぜか遅れて、色が不必要で微妙な変化をするから(iOS13)。
[C#]JSONデシリアライズ化に便利なサイトの紹介と注意事項

# 主題
JSONファイルからデシリアライズ後のデータクラス定義を自動生成してくれるサイトの紹介と、
実際に使ってみた際に気づいた点を説明。
# json2csharp.com
https://json2csharp.com/
# 利用手順
1.JSONファイルの内容をコピペする。
2.Convertをクリックすると、C＃のクラス宣言コードが生成される。

なお、JSONファイル内でキー名が定義されていない要素は、"Root"や”MyArray”などの適当な名称が割り振られるため、
適切な名称にリネームする必要がある。
![スクリーンショット 2020-08-02 11.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428951/844cf88f-8350-63d4-9fea-6dda735bf48c.png)

# 注意事項

Convert後の先頭行には[JSON.NET](https://www.newtonsoft.com/json)ライブラリによるデシリアライズするサンプルコードも一緒に出力されるが、
これは正常に動作しない場合がある。

##上手く行かない例
```json
[
    {
        "frames": [
            {
                "Delay": 0,
                "Index": 0
            }
        ],
        "Name": ""
    },
    {
        "frames": [
            {
                "Delay": 0,
                "Index": 3
            }
        ],
        "Name": ""
    }
]
```

上記のように、JSONの最上位要素がコレクションや配列になっている場合、当該サイトでコンバートすると、以下の結果となる。

```c#

    Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); //デシリアライズコード
    public class Frame    {
        public int Delay { get; set; } 
        public int Index { get; set; } 
    }

    public class MyArray    {
        public List<Frame> frames { get; set; } 
        public string Name { get; set; } 
    }

    public class Root    {
        public List<MyArray> MyArray { get; set; } 
    }
```
一見すると、デシリアライズが上手く行そうだが、実際に実行すると以下例外発生する。

```console
JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Root' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
```
エラー内容を見ると、配列オブジェクトを単一オブジェクトでデシリアライズしようとしたので怒られている様子。
JSONファイルの構造を変えない場合は、以下のコードでデシリアライズ可能。

```c#
List<MyArray> root = JsonConvert.DeserializeObject<List<MyArray>>(json);
```

##上手く行く例

```json
{
    "MyArray": [
        {
            "frames": [
                {
                    "Delay": 0,
                    "Index": 0
                }
            ],
            "Name": ""
        },
        {
            "frames": [
                {
                    "Delay": 0,
                    "Index": 3
                }
            ],
            "Name": ""
        }
    ]
}
```
先ほどと違い、JSONの最上位要素が{}で括られている、つまり単一オブジェクトの場合は先ほどの例と同じコンバート結果になり、
デシリアライズもサンプルコードのままで上手くいく。

```c#

    Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); //デシリアライズコード
    Console.WriteLine("Count="+ myDeserializedClass.MyArray.Count.ToString());

    public class Frame    {
        public int Delay { get; set; } 
        public int Index { get; set; } 
    }

    public class MyArray    {
        public List<Frame> frames { get; set; } 
        public string Name { get; set; } 
    }

    public class Root    {
        public List<MyArray> MyArray { get; set; } 
    }
```

```console
Count=2
```
BibLaTeXで節や章ごとの参考文献

ややマニアックだが、LaTeXで、参考文献を節や章ごとに出力する方法のうちの一つ(他にもいろいろありますが)。

先に要点を。

プリアンブルで以下のように書く。本記事では節ごとにしているが、`refsegment=chapter`とすれば章ごとになる。
本文中での参照順にするには、`sorting=none`とすればよい。他のsortingオプションについては[BibLaTeXのリファレンス]
(https://www.overleaf.com/learn/latex/Bibliography_management_with_biblatex#Reference_guide)を参照。

```tex
\usepackage[
    sorting=none,
    refsegment=section
]{biblatex}
```

本文では以下のように参照する(関連部分のみ。全体は記事末尾に)。

```tex
\section{First of all}
We have our first citation\cite{firstRef}.
         :
\printbibliography[segment=\therefsegment,heading=subbibliography]

\section{Conclusion}
         :
the second entry\cite{secondRef} in .bib 
         :
\printbibliography[segment=\therefsegment,heading=subbibliography]

\printbibliography
```

Overleaf環境でのサンプルは以下です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377992/02b939f0-0b4b-fbfe-dcc3-2811abb3d1b4.png" height="500">

以下、関連ファイル。

```tex:main.tex
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[
    bibencoding=utf8,
    style=numeric, 
    url = false,
    sorting=none,
    refsegment=section
]{biblatex}
\addbibresource{references.bib}

\title{Reference list per section}
\author{boonrew}
\date{August 2020}

\begin{document}
\maketitle

\section{First of all}
We have our first citation\cite{firstRef}.
Next, we get the second\cite{thirdRef} in this section, taking different order in our reference.bib file.

\printbibliography[segment=\therefsegment,heading=subbibliography]

\section{Conclusion}
This is the second and final section. In this section, the second entry\cite{secondRef} in .bib and the first one\cite{firstRef} are cited to show the effect of 'sorting=' parameter.

And we have our total refrence list at the last.

\printbibliography[segment=\therefsegment,heading=subbibliography]

\printbibliography
\end{document}
```

```tex:reference.bib
@book{firstRef,
  title={The Hitchhiker's Guide to the Galaxy},
  author={Adams, D.},
  isbn={9781417642595},
  url={http://books.google.com/books?id=W-xMPgAACAAJ},
  year={1995},
  publisher={San Val}
}

@book{secondRef,
  title={How to keep to be non-sense},
  author={Foo, B.},
  isbn={478981856X},
  year={2995},
  publisher={Sanity Value}
}

@article{thirdRef,
  title={For the senseless, by the senseless, of the senseless},
  author={Bar, F.},
  url={http://books.google.com/books?id=W-xMPgAACAAJ},
  year={1095},
  pages = {20345,21495},
  publisher={Non non}
}
```

```tex:latexmkrc
$latex = 'platex';
$bibtex = 'pbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';
$pdf_mode = 3; 
```

おしまい。
XcodeでOpenCVを導入〜ヘッダファイルがうまくincludeできなかったお話〜


#開発環境

- mac: Catalina 10.15.4 
- Xcode: 11.6 (11E708)
- OpenCV: 4.4.0
- Homebrew: 2.4.9 

#参考記事
https://qiita.com/seaka829/items/2533fb71cabd8ae7fd58
http://shirashinomiya.hatenablog.com/entry/2018/07/26/212524
https://qiita.com/KakeruMasuda/items/49d369ab49fac5ea3eab

#やったことと起きた問題
　上の記事を参考に、homebrewからOpenCVをインストールし、ヘッダファイルのパスを確認し（下記）、Xcodeの[Build Settings]の[Header Search Paths]でそのパスを設定して、ソースコードをビルドし用とした。
　パスを設定したはずなのに「opencv2/opencv.hpp がねーぞ」と怒られ、ビルドができなかった。


```
/usr/local/Cellar/opencv/4.4.0/include
```

#解決策
　[System Header Search Paths]に同様の設定を施したら動くようになった。
Nielsen Chuang Thm 12.16について

ほぼ数式です。勉強会の補遺です。
教科書の不等式がそのままでは成り立たなさそうなので、少し変形してあります。
注意：$\log$の底は2とする。

内容としては、暗号におけるprivacy amplification(秘匿性増幅)に関連する定理です。

###  定義 (universal hash functions)
集合$\mathcal{A}$から集合$\mathcal{B}$への関数の族$\mathcal{G}$を考える。
もし、$g \in \mathcal{G}$が一様に選ばれた時、任意の$a_1, a_2 \neq a_1 \in \mathcal{A}$に対して衝突する確率、つまり
${\rm Pr}\\{G(a_1) = G(a_2)\\} = \sum_{g \in \mathcal{G}}\Pr\\{G=g\\}Pr\\{g(a_1)=g(a_2)\\}$ が高々 $1 / |\mathcal{B}|$ であるとき、$\mathcal{G}$をuniversalであるという。

###  定義 (collision entropy)
確率変数$X$に対して、その確率質量関数を$p(x)$とすると、collision entropy$H_c(X)$は

$$
\begin{align}
H_c(X) &:= - \log \left[\sum_x p(x)^2\right] = -\log \left[ E[p(X)] \right ]
\end{align}
$$
と定義される。

### Lemma

$H_c(X) \leq H(X)$

#### proof

$-\log$ が下に凸であることと、Jensenの不等式から明らか。

###  定義 (conditional collision entropy)
確率変数$X, Y$に対して、その確率質量関数を$p(x, y)$とする。ここで、conditional collision entropy$H_c(Y|X)$を

$$
H_c(Y|X) := \sum_x p(x) H_c(Y | X = x)
$$

ここで、

$$
H_c(Y | X = x) := - \log \left[\sum_y p(y|x)^2\right] 
$$

と定義する。

### Thorem 12.16(の修正版)

$X$をアルファベット$\mathcal{X}$上の確率変数、$G$を$\mathcal{X}$から$\\{0, 1\\}^m$へのあるuniversal hash functions上の一様分布に従う確率変数とする。このとき

$$
H(G(X)|G) \geq H_c(G(X) | G) \geq m - \frac{2^{m - H_c(X)}}{ln 2}
$$

が成り立つ。

#### proof

左の不等式は、Lemmaから直ちに成り立つ。
右の不等式について証明する。

$$
H_c(G(X) | G) = \sum_g\Pr\\{G=g\\} H_c(g(X) | G = g)\\\\
H_c(g(X) | G = g) = - \log\left[\sum_{y \in \\{0, 1\\}^m} \Pr\\{g(X) = y\\}^2\right] 
$$
である。$- \log$が下に凸であることとJensenの不等式から、
$$
\begin{align}
H_c(G(X) | G) & = - \sum_g\Pr\\{G=g\\}\log\left[\sum_{y \in \\{0, 1\\}^m} \Pr\\{g(X) = y\\}^2\right] \\\\
&\geq - \log\left[\sum_g\Pr\\{G=g\\}\sum_{y \in \\{0, 1\\}^m} \Pr\\{g(X) = y\\}^2\right]
\end{align} 
$$
が成り立つ。ここで、$X_1$と$X_2$を$X$に従う独立な確率変数とすると

$$
\begin{align}
\sum_{y \in \\{0, 1\\}^m}\Pr\\{g(X) = y\\}^2 & = \Pr\\{g(X_1) = g(X_2)\\}\\\\
& = \Pr\\{X_1 = X_2\\} + \Pr\\{X_1 \neq X_2\\}\Pr\\{g(X_1) = g(X_2) |X_1 \neq X_2 \\}
\end{align}
$$

ここで、衝突確率$P_c(X)$を

$$
P_c(X) := \sum_xp(x)^2 = \Pr\\{X_1 = X_2\\}
$$

と定義し、universal hash functionsの定義から、

$$
\sum_g\Pr\\{G=g\\}\Pr\\{g(X_1) = g(X_2) |X_1 \neq X_2 \\} \leq 1 / |\\{0, 1\\}^m| = 2^{-m}
$$

に注意すると、
$$
\begin{align}
\sum_g\Pr\\{G=g\\}\sum_{y \in \\{0, 1\\}^m}\Pr\\{g(X) = y\\}^2 & \leq P_c(X) + (1 - P_c(X))2^{-m} \\\\
& = (1 - 2^{-m}) P_c(X) + 2^{-m} \\\\
& \leq P_c(X) + 2^{-m} \\\\
& = 2^{-H_c(X)} + 2^{-m} \\\\
& = 2^{-m}(1 + 2^{m-H_c(X)})
\end{align}
$$
これと、$-log$が単調減少関数であることから
$$
H_c(g(X) | G ) \geq m - \log(1 + 2^{m-H_c(X)})
$$
また、$ln(1 + x) \leq x$であることから、

$$
H_c(g(X) | G ) \geq m - \frac{2^{m-H_c(X)}}{ln 2}
$$

が成り立つ。


###　参考文献
C. H. Bennett, G. Brassard, C. Crépeau, and U. M. Maurer. Generalized privacyamplification. IEEE Trans. Inf. Theory, 41:1915–1923, 1995.
おすすめのVRM対応アプリまとめ

必要な機材に合わせておすすめのアプリをまとめました。

# 【必要機材別おすすめアプリ】
## [A] 認証対応のiPhone/iPad
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684858/397612d4-8f7c-e3b7-b866-bf151a826f2c.png)
[**❶waidayo**](https://apps.apple.com/jp/app/waidayo/id1513166077) (無料)

[**❷vear**](https://apps.apple.com/jp/app/vear/id1490697369)（パーフェクトシンク機能を使う場合¥1,500）





## [B] PC(+Webカメラ・マイク)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684858/5ca41d66-0103-e704-d409-f5399b456cc7.png)
[**❶VMagicMirror**](https://booth.pm/ja/items/1272298)（無料）

[**❷VSeeFace**](https://www.vseeface.icu/)（無料）

[**❸LuppetX**](https://luppet.appspot.com/)（¥6,600）

[**❹3tene**](https://3tene.com/)（パーフェクトシンク機能を使う場合¥3,300[Pro版]）
**※Mac版あり**


## [C]  PC+顔認証対応のiPhone/iPad
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684858/388d2a9b-e194-e44d-50e9-d83e323e72d6.png)
▼対応機種はこちらの【搭載ハードウェア】を参照
https://ja.wikipedia.org/wiki/Face_ID

[**❶VSeeFace**](https://www.vseeface.icu/) + [**iFacialMocap**](https://www.ifacialmocap.com/home/japanese/)（¥980）

[**❷VMagicMirror**](https://booth.pm/ja/items/1272298) +  [**iFacialMocap**](https://www.ifacialmocap.com/home/japanese/)（¥980）

[**❸Luppet**](https://luppet.appspot.com/) + [**iFacialMocap**](https://www.ifacialmocap.com/home/japanese/)（¥6,600+¥980）






## [D] PC+VR機材
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684858/e9a95456-185d-6a34-2a8e-a360b4c5e81d.png)
[**❶バーチャルモーションキャプチャー**](https://sh-akira.github.io/VirtualMotionCapture/)（無料）

[**❷バーチャルキャスト**](https://virtualcast.jp/about/)（無料）

## [E] PC+VR機材+顔認証対応のiPhone/iPad
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684858/0bcb2602-11d9-d362-1f69-af03b1058787.png)
[**❶バーチャルモーションキャプチャー+waidayo**](https://qiita.com/take2_mbh/private/6b99fbcfa7e2b987953b)（無料）

# 【VRMモデルをカスタマイズしたい場合】


### テクスチャをカスタマイズ
https://booth.pm/ja/items/2177538

### 表情をカスタマイズ
https://booth.pm/ja/items/2152326
深層学習Day4_学習レポート

<h1>1.TensorFlow</h1>
■演習
・constant
<img width="895" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/377f19c7-f543-c28d-4dc0-c95fb41d449d.png">

・placeholder
<img width="895" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/5590af28-a49d-cf68-c93b-77def3310e46.png">

・variables
<img width="895" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/66ec31ae-ed1b-da4e-17fb-6aef58350d52.png">!

・線形回帰
<img width="895" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/5b662b2c-c5a8-3060-3a4e-05f59cb262ea.png">

・非線形回帰
<img width="895" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/d14fddc7-c0e4-3cff-f59d-a97aafbc887d.png">

・分類1層 (mnist)
<img width="895" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/37f965b0-aee1-eac0-f3de-90eb9751e6f8.png">

・分類3層 (mnist)
<img width="895" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/94f457c8-67fc-f1ef-660e-65144fec346b.png">

・分類CNN (mnist)
<img width="895" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/50440fe9-7e11-d714-d3b2-9f05507de692.png">


<h1>2.強化学習</h1>
・強化学習
　　長期的に報酬を最大化できるように環境のなかで行動を
　　選択できるエージェントを作ることを目標とする機械学習の一分野
　　→行動の結果として与えられる利益(報酬)をもとに、
　　　行動を決定する原理を改善していく仕組み。

・探索と利用のトレードオフ
　探索が足りない状態
　　過去のデータで、ベストとされる行動のみを常に取り続ければ
　　他にもっとベストな行動を見つけることはできない。
　
　↕︎トレードオフの関係性

　利用が足りない状態
　　未知の行動のみを常に取り続ければ、過去の経験が活かせない。

・強化学習と教師なしあり学習の違い
　　目標が異なる

　教師なしあり学習
　　データに含まれるパターンを見つけ出すおよびそのデータから予測することが目標

　強化学習
　　優れた方策を見つけることが目標

・強化学習の歴史
　　計算速度の進展により大規模な状態をもつ場合の強化学習を可能としつつある。
　　関数近似法とQ学習を組み合わせる手法の登場

　Q学習
　　行動価値関数を行動する毎に更新することにより学習を進める方法

　関数近似法
　　価値関数や方策関数を関数近似する手法のこと

・行動価値関数
　　価値を表す関数としては、状態価値関数と行動価値関数の2種類がある
　
　状態価値関数
　　ある状態の価値に注目する

　行動価値関数
　　状態と価値を組み合わせた価値に注目する

・方策関数
　　方策ベースの強化学習手法において、
　　ある状態でどのような行動を採るのかの確率を与える関数のこと

・方策反復法
　　方策をモデル化して最適化する手法

　定義方法
　　平均報酬
　　割引報酬和

<h1>3.Keras</h1>
・線形回帰
<img width="895" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/597eb3a4-1737-c31c-c987-35415f4d213c.png">

・単純パーセプトロン
<img width="895" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/39eb8ffa-b385-1937-d1a6-ed19d298d941.png">

・分類 (iris)
<img width="895" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/b3374124-508a-e461-1a39-727b86f34876.png">

・cifr10
<img width="895" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/9a9e58ee-00a5-cd91-44d0-19faa297bc6b.png">

・RNN
<img width="895" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/9555645c-2078-2c5f-1033-80babc584e33.png">
UE4 ゲーム開発記 2020/8/2

#概要
こんにちは。パンダマスターと申します。
最近、UE4でゲームを作り始めました。

#注記
この記事の内容はEpic Gamesとは何の関係もありません。

#免責事項
当記事に記載されている内容、サンプルコードを使用することによって被った、いかなる損害に対しても筆者は一切責任を負いません。当記事のサンプルコードの使用に際しては自己責任にてお願いします。
上記に同意していただける方のみ、続きをお読みください。
続きを読むことによって、上記の免責事項に同意したことになります。

#今回の目標
モデリングとアニメーションの作成及び適用。

#バージョン情報
Unreal Engine 4.25.3

#実装
早速、実装を見ていきましょう！
まだ整理された状態ではないため、コード全体ではなく苦労した点についてかいつまんで書いていきます。
投稿中のコードはプロジェクトからの抜粋ですので、それだけでは動きません。

##Blenderでもモデリングとアニメーション作成
シェイプを加工してパンダを作ります。
最初に出来上がったのがこれ。
![panda1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169787/44151dc3-7814-5270-15d8-817153915fd5.png)
大変雑な作りになってますが、サブディビジョンかけて手足をくっつけて、UVをちゃんと設定したらこうなりました。
![panda2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169787/b5e85d4a-b73d-6413-c49a-4f2819150982.png)
多少、マシになりました。
UE4にインポートしてみます。
![panda3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169787/3de64f72-8693-a42c-09ce-5c461935729b.png)
シェーダー万歳。UE4様様ですね。

上の画像でも適用されていますが、さらにBlenderでアニメーションを作成していきます。
ボーンとリグの設定はAuto-Rig Proを使ってサクッと生成しました。
Auto-Rig Proは$40でボーンとリグの自動生成をした後、UE4向けにエクスポートもしてくれるので、大変便利です。
これがないとモデリング初心者の私にはつらいですね。
アニメーションの作成はプログラミング要素ゼロなので割愛します。ググればいくらでも資料出てきますし。

##アニメーションの適用
さて、エクスポートしたFBXをインポートして、動かしてみましょう。
アニメーションの適用順序は以下の通りです。

・3ループだけIdle
・そのあと目標地点に移動しながらRun
・目標地点に到達したらIdle

###3ループだけIdle
これはアニメーションコンポジットと通知を使用します。
始めはモンタージュ使っていたのですが、現段階ではうまく扱えなかったため、同じくUE4でゲーム制作している知人から助言を得てコンポジットにしました。
![compsite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169787/fd304c4f-bb9c-2671-2c31-776b9924cead.png)
モーションの繰り返しは単純にAsset Browserからアニメーションアセットをドラッグ＆ドロップするだけです。
画面右端のEndIdleという黄色いタグのようなものが通知で、これの通知を受け取ることによってBP側ではアニメーションの切り替えを行い、C++側では移動を開始します。
ちなみにモデルの名前がDORKASになっているのは、当初はバーチャロンの二次創作をしようかと思っていたので、その名残です。

以下のコードは前回の記事の追加コードになります。
新たにHandleNotifyメソッドをオーバーライドして、通知を受け取るようにします。

```C++:UAnimInstanceを継承したクラス.h
UCLASS(minimalapi)
{
class UAnimInstanceEx : public UAnimInstance
	virtual bool HandleNotify(const FAnimNotifyEvent& AnimNotifyEvent) override;

	UPROPERTY()
	bool StartRun = false;

	UFUNCTION(BlueprintPure, meta = (BlueprintThreadSafe))
		bool RunRule();
};
```

```C++:UAnimInstanceを継承したクラス.cpp
bool UAnimInstanceEx ::HandleNotify(const FAnimNotifyEvent& AnimNotifyEvent)
{
	StartRun |= AnimNotifyEvent.NotifyName.IsEqual(FName(TEXT("EndIdle")));
	if (StartRun) {
		ACharacterEx* _Pawn = Cast<ACharacterEx>(TryGetPawnOwner());
		if (_Pawn)
		{
			AAIControllerEx* _Controller = Cast<AAIControllerEx>(_Pawn->GetController());
			_Controller->EnableRun();
		}
	}
	return StartRun;
}

bool UAnimInstanceEx ::RunRule()
{
	return StartRun;
}
```
通知を受け取ったら単純にフラグを立てるだけです。
また、ブループリントのIdle→Runのトランジションのために、RunRuleで通知で立ったフラグを返しています。
このようにコンポジットに作られた通知を基に、C++で処理を書くことができます。
もちろん、BPだけでもできる処理だとは思うのですが、BP苦手なのでC++で処理しています。

##出来上がり
[Youtube動画](https://youtu.be/pcA22q8eztw)
![UE420200802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169787/321ee615-94de-79cb-c643-ae9231e0bcd7.png)

##感想
UE4はやり方が分かるまでは躓きますが、分かってしまうと一気に全てが動き出す優れたツールです。
すっかりはまってしまいました。

また進捗あれば投稿します。
【Blender】マテリアルアニメーションのキーフレームをcsvから読み込んで登録

#やること
Blenderの、マテリアルアニメーションのキーフレーム設定を、画面で直接行うのではなく、時間と色を指定したcsvファイルをスクリプトで読み込んで実行します。
以下では、初期画面に出てくる立方体のうちの２面に、新たにマテリアルup,sideを貼った状態で、その２つのマテリアルの各々へ、色とメタリックの変更を行います。
読み込むファイルは、Ｃドライブ直下にcsvフォルダを作り、その下にlist.csvを置く設定にしています。

Blenderのマテリアルアニメーションのキーフレーム機能については、Benjamin『Blender2.8 3DCG スーパーテクニック』（ソーテック社）のp376を参照してください


#環境
Blender2.83

csvファイルの各項目
マテリアル名,キーフレーム,RBG値のR,RBG値のB,RBG値のG,アルファ値,メタリックの値

#csvファイル
```csv:list.csv
up,1,0.800000, 0.000000, 0.000000, 1.000000, 0.0
up,50,0.000000, 0.800000, 0.000000, 1.000000, 0.0
up,100,0.000000, 0.000000, 0.800000, 1.000000, 1.0
side,1,0.000000, 0.800000, 0.000000, 1.000000, 0.0
side,50,0.000000, 0.000000, 0.800000, 1.000000, 0.0
side,100,0.800000, 0.000000, 0.000000, 1.000000, 1.0
```

#スクリプト
```python
import bpy
import csv
import os

with open("C:/csv/list.csv","r") as f:#Windowsの場合のパスの書き方
    reader = csv.reader(f)
    for row in reader:
        #色の指定。inputs[0]へ
        bpy.data.materials[row[0]].node_tree.nodes['Principled BSDF'].inputs[0].default_value[0] = float(row[2])
        bpy.data.materials[row[0]].node_tree.nodes['Principled BSDF'].inputs[0].default_value[1] = float(row[3])
        bpy.data.materials[row[0]].node_tree.nodes['Principled BSDF'].inputs[0].default_value[2] = float(row[4])
        bpy.data.materials[row[0]].node_tree.nodes['Principled BSDF'].inputs[0].default_value[3] = float(row[5])
        bpy.data.materials[row[0]].node_tree.nodes['Principled BSDF'].inputs[0].keyframe_insert(data_path="default_value",frame=int(row[1]))#色を指定した後で、そこへキーフレームを設定。csvの項目の並び順とは異なる
        #メタリックの指定。inputs[4]へ
        bpy.data.materials[row[0]].node_tree.nodes["Principled BSDF"].inputs[4].default_value =  float(row[6])
        bpy.data.materials[row[0]].node_tree.nodes['Principled BSDF'].inputs[4].keyframe_insert(data_path="default_value",frame=int(row[1]))#メタリックについて、改めてキーフレーム設定
```
UDP port 137宛のパケットがインターネットに飛ぶのをDHCP optionで元から断つ

# NBTはまだ生きている
ルータのログを見ていると、どういうわけかインターネット上のホストに向かってUDPポート137番宛のパケットが出ているのが観測されます。LAN内の通信だけなら気にすることもないのだけども。
Windows 10 1709以降でSMB 1.0が無効化されましたが、NBT(NetBIOS over TCP/IP)は有効のままです。LAN内PCのブラウジングのために残されているようです。
アプリの作りにも拠るのでしょうが、そもそもNBTを無効にすればこんなパケットは出なくなるはず。

なお、NBTを無効化するとLAN内の名前解決ができなくなる等の副作用があるかもしれません。LAN内DNSサーバーやmDNS,WS-Discovery等で対処できると思います。

# クライアント側でNBTを無効化する場合

NBTを無効化する方法としてよく出てくるのはこれ。

- ネットワークアダプタのプロパティ > TCP/IPv4 > 詳細設定 > WINSタブ > 「NetBIOS over TCP/IPを無効にする」

ネットワークアダプタ毎の設定なので、有線・無線それぞれに設定しないといけないし、台数が多いと面倒です。

# DHCP optionでNBTを無効化

上記のNetBIOS設定が「既定値」のままであれば、DHCP optionでクライアントを一括設定できます。
NBTを無効化するには、DHCPのVendor specific option (43番)にバイナリで `01 04 00 00 00 02` をセットします。

設定値の説明はこちら
[Vendor-Specific Option Code 0x01 - Microsoft Disable NetBIOS Option](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dhcpe/ef7676b1-5568-4afc-836a-7eca63a10a3a?redirectedfrom=MSDN)

当たり前ですが、MS DHCP serverであればGUIから設定できるようです。

## YAMAHAルータでの設定例

```
dhcp scope option 1 43=01,04,00,00,00,02
```

## 動作確認

- `ipconfig /all` で `NetBIOS over TCP/IP` が `無効` と表示される
- `netstat -a` でUDP 137,138/TCP 139がLISTENされていない

## 変更履歴

2021/5/24 タイトルと「NBTはまだ生きている」の節をリライト
Mac から GCPのUbuntu Desktop に Microsoft Remote Desktop でログインする

LANの中のデスクトップ環境を再現したいのだが、自宅や会社のネットワークの設定は自由度がない（というかぶっ壊したら大変だ）ので、壊しても困らないIaaSで。Mac から GCPのUbuntu Desktop に Microsoft Remote Desktop でログインするまでの道のりをまとめておく。

# 免責事項

実際に運用するなら、IAM や Access Context Managerで制御したり、リモート側のOSの設定もちゃんと考える必要あり。あくまで個人検証用ということで。

# 利用環境

 * ローカル： Mac OS + Microsoft Remote Desktop アプリ
 * 通信： Identity-aware Proxy で RDP トラフィックをトンネリング
 * リモート： Ubuntu 20.04（GCP） に xrdp をインストール


# 構築方法

## 1. GCP

外部IPで3389を晒すのは危ういので、GCEインスタンスで外部IPを設定せずに、Identity-aware Proxyの[TCP 転送での IAP の使用](https://cloud.google.com/iap/docs/using-tcp-forwarding?hl=ja)を採用した。

VPC、Firewall、Router、Cloud-Natの設定などは出尽くしているので、割愛。
GCEインスタンスは startup-script を用意しておき、 gcloud コマンドで作成する。

真面目にやるなら、事前にイメージを作成しておくべし。

```bash
#! /bin/bash
sudo apt update
sudo apt -y upgrade

sudo apt -y install ubuntu-desktop xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp

sudo useradd ${DESKTOP_USER} --create-home --shell /bin/bash
echo "${DESKTOP_USER}:${DESKTOP_PASSWORD}" | sudo chpasswd
sudo gpasswd -a ${DESKTOP_USER} sudo

cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla  
[Netowrkmanager]  
Identity=unix-user:*  
Action=org.freedesktop.color-manager.create-device  
ResultAny=no  
ResultInactive=no  
ResultActive=yes  
EOF
```


```bash
export DESKTOP_USER=your_user
export DESKTOP_PASSWORD=your_password

gcloud compute instances create ubuntu-desktop \
    --machine-type n1-standard-1 \
    --image-project ubuntu-os-cloud \
    --image-family ubuntu-2004-lts \
    --network=desktop-vpc \
    --subnet=desktop-subnet-1 \
    --zone=us-west1-a \
    --no-address \
    --tags=ssh,rdp \
    --metadata startup-script="$(cat startup-script.sh | envsubst)"
```

envsubst で startup-script の変数を置き換えてる。


## 2. IAP Tunnel

GCEを起動後に apt が走るので、それなりの時間が経過したら IAP Tunnel を開く。

```bash
gcloud compute start-iap-tunnel ubuntu-desktop 3389 \
    --local-host-port=localhost:3389 \
    --zone=us-west1-a
```

これでローカルマシンからIAPを経由して、外部IPアドレスが設定されてないインスタンスにアクセスできるようになる。
Firewallで IAPのIP Rangesからのアクセスを許可しておくのは言わずもがな。

## 3. Microsoft Remote Desktop

RDPプロトコルに対応してればたぶんなんでもいいんだが、 [Microsoft Remote Desktop](https://apps.apple.com/jp/app/microsoft-remote-desktop/id1295203466?mt=12)を使うことにした。


使い方は "Add PC" して、"PC name" に localhost を設定すればよい。
"User account" は インスタンス作成時に指定したユーザーとパスワードを設定する。

![スクリーンショット 2020-08-02 10.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20304/d1191a0d-cc35-d592-de81-b23bd7bf8935.png)


# 動作確認

Ubuntu Desktopにログインできたので、Firefoxで What is my IP Addreess? で確認してみた。

![IMG20200802104016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20304/d960064c-43bf-24b1-4532-fe4185c052da.jpeg)

us-west1 を選択したので、想定通り。


## 参考

 * https://qiita.com/hanzawak/items/4a053e0d0d1c7d9f655f
 * https://medium.com/anti-pattern-engineering/gcp%E3%81%A7ubuntu-desktop%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%82%8A-%E5%BE%93%E9%87%8F%E8%AA%B2%E9%87%91%E5%88%B6%E3%81%AEgui-pc%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86-fda25fefd845
道路交通信号機の状態遷移設計ー午後

応用情報技術者令和元年秋期 午後問8

ファイル：2019r01a_ap_pm_qs.pdf　午後問8

メモだけです。

１、
①
処理S4でC3からC4に遷移場合、１秒後で、R3により、３秒後、歩行者信号が青になる
→
状態C5の時に、主道路信号が右折可能で、歩行者信号が青になる
or
状態C-4でR3の遷移が可能となり主道路信号が右折可能で、歩行者信号が青になる

基本は、主道路信号が右折可と歩行者信号が青になる　共存できないということですね。

②すごい疑問だけどね。
参考答えは、「C-1でボタン押下されても、主道路信号の青が短くならない」　ですが

表２では、P1がなくなりましたら、もちろんB－１もなくなりますね。
そうすると、
P2　タイマ１終了　C-1からB-2に遷移した場合、信号が青にし、タイマ６（１０秒）をセット
になりますね。

それで、C-1状態場合、ボタン押下すると、主道路信号がすぐ青になりますね。
タイマ６（１０秒）が０になると、つまり10秒後、黄色にし、３秒後、主道路信号が赤になって、横断道路が青になりますね。

Q1,Q2によると、C-2状態場合も、ボタン押下すると、タイマ６（１０秒）をセット
つまり、多くでも、１０秒＋３秒後、主道路信号が赤になって、横断道路が青になりますね。

よく知らないだけど、なぜイですかね？？？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/af9eb686-96ee-5a35-90ef-44e7e4e99140.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/73cd4d0c-5fb2-43bc-64da-79b1d41cdb34.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a66ad837-b41b-906e-5f4c-3f5d86f13f48.png)


２、信頼性設計につきまして、

（１）主道路信号と従道路信号の連動機能が故障した場合、主道路信号が黄点滅、従道路信号が赤点滅
とは、フェールセーフですね。安全が一番優先だから。

（２）歩行者用押下ボタンが故障した場合、その機能を切り離した縮退運転とし、歩行者信号と主道路信号に同期させるとは、他のサーバーでサービスを引き続き提供されているので、フェールソフトですね。

**フェールセーフ**
フェールセーフは、システムに不具合や故障が発生したときでも、障害の影響範囲を最小限にとどめ、常に安全を最優先にして制御を行う考え方です。

**フェールソフト**
クラスタ構成のシステムにおいて、あるサーバが動作しなくなった場合でも、他のサーバでアプリケーションを引き継いで機能を提供する。

**フォールトアボイダンス**
故障が発生したときに対処するのではなく、品質管理などを通じてシステム構成要素の信頼性を高めるシステム。

**フォールトマスキング**
故障が発生したときに、その影響が誤りとなって外部に出ないように訂正するシステム。

**フールプルーフ**
フールプルーフを直訳すると「簡単」となりますが、むしろ「フール」と「プルーフ」に分けた方が本来の意味に近いように思います。 つまり、「何も知らない人が使っても大丈夫なように証明されているもの」「使用方法を知らない、もしくは間違った使い方をしても大事に至らないような設計」のことです。

**フォールトトレランス**とは、システムに障害が発生した場合にも正常に機能し続けることである。耐障害性などと和訳されることが多い。

通常のコンピュータは、システムの一部に支障を来たすと機能が停止してしまう。大規模なシステムやミッションクリティカルな業務のシステムには障害の発生は許されない。そのため、システムにある程度の冗長性を持たせることによって異常を回避する仕組みがとられる場合がある。例えば電源を多重化したり、ハードディスクを多重化したり（RAID）、無停電電源装置（UPS）を用いたりすることで、フォールトトレランスなシステムを実現することができる。


参考：
フールプルーフ
https://www.i-learning.jp/topics/column/useful/foolproof.html

フォールトトレランス
https://www.weblio.jp/content/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%88%E3%83%88%E3%83%AC%E3%83%A9%E3%83%B3%E3%82%B9#:~:text=%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%88%E3%83%88%E3%83%AC%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%A8%E3%81%AF%E3%80%81%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0,%E3%81%AE%E7%99%BA%E7%94%9F%E3%81%AF%E8%A8%B1%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%80%82
Rubyでシステムコマンドの実行

Rubyを書いてる時にスクリプト内で、システムコマンドを実行したくなったので調べてみました。

### Kernel#system

最も、シンプルな書き方です。

```
system("ls")
# => true
```

標準出力にコマンドの実行結果が返却されます。
メソッドの戻り値は以下の通り

- `true` コマンド成功時
- `false` コマンド失敗時
- `nil` コマンドがない時


### Kernel#`

コマンドの実行結果を戻り値で欲しい時に使います。

```
`ls`
# => "Applications\nLibrary\nSystem\nUsers\nVolumes\nbin\ncores\ndev\netc\nhome\nopt\nprivate\nsbin\ntmp\nusr\nvar\n"
``` 

戻り値は文字列型で返ってくるみたいですね。

`%x||` というエイリアスもあるみたいです。 

### 参考

- [How to Run System Commands From Ruby](https://www.rubyguides.com/2018/12/ruby-system/)
Cloud9をレンタルサーバー（conoha）へ落とす時のコマンド実行記録

Cloud9をconohaサーバーに置いた時のターミナルでの実行記録。

自分のサーバーにCloud9を置いたことで、直接サーバーのコードを書き換えることができるようになりました！（せっかく構築したローカルのLAMP環境不要になる。。。。。）


備忘のため、使ったコマンドをキロク。
意味がわからず、コマンド打ったところもあるので、意味がわかったものから順に情報をアップデートしていく。


まずは、ターミナルからsshでconohaに接続しておく

よくわからない、細かい設定

```
70  sudo yum -y install git
71  sudo yum -y install glibc-static
72  sudo yum -y install epel-release
73  sudo yum -y install nodejs npm --enablerepo=epel
74  sudo yum -y groupinstall -y development
```

ここで、一旦lsで確認した

```
75　ls
```

Clound9をインストール

```
76  chmod 777 プロジェクト名
77  git clone git://github.com/c9/core.git c9sdk
78  cd c9sdk
79  sudo scripts/install-sdk.sh 
```

ポート開放（8888）

```
80  sudo firewall-cmd --zone=public --add-port=8888/tcp --permanent
81  sudo firewall-cmd --reload
```

user名及びパスワードを指定せずに進めた

```
82  node ./server.js -p 8888 -a user:password -w /home/名前/プロジェクト名/ --listen IPアドレス
```


`PTY is not supported.`というエラーがターミナルに大量に出た。

解消するため、tmuxのインストール
tmuxは、なんのことか全くわからないけど、必要。ないと、動かない。


```
83  sudo yum install tmux
```

tmuxをインストール後、再びCloud9に接続を実行
ついでに、ユーザー名とパスワードを登録した

```
84  node ./server.js -p 8888 -a ユーザー名:パスワード -w /home/名前/プロジェクト名/ --listen IPアドレス
```

Cloud9開けた！
が、毎回、初回接続の時に、プロジェクトを読み込む必要がありそう。。。

それは、手間なので、永遠にインストールしておくコマンドを実行

```
85  sudo npm install -g forever
86  forever start server.js -p 8888 -a ユーザー名:パスワード -w /home/名前/プロジェクト名/
```

インストール完了！！！！！！！！！