OmniAICreator/Qiita-1.07M huggingface dataset:
Azure KinectをROS melodicとDockerを使って動かしてみた

# はじめに
はじめまして。

関東の大学の制御系研究室に所属している学部4年のしゅんもです。研究室の先輩方の影響を受けて、Qiitaを始めてみました。

# Dockerとは
Dockerとは、仮想環境を構築するためのプラットフォームです。

Kinect V2やRealSenseなどのハードウェアや、Mask R-CNNやOpenPoseといったソフトウェアを動かすためには、必要なSDKやドライバ等をインストールする、環境構築と呼ばれる作業が必要です。

環境構築は、ソフトウェアのバージョンによってうまく動かなかったり、もともと入っている別のソフトウェアと干渉して不具合が生じてしまったりと、意外と難しいものです。また、PCが故障したり、性能不足等の理由で別のPCを使いたい場合、再度この面倒な環境構築の作業を行う必要があります。

そこでDockerが活躍します。Dockerを使用すると、Dockerfileと呼ばれる、シェルスクリプトのようなファイルを使って自動的に環境構築を行えます。

しかも、これにより作成される環境は、ホストPCと完全に分離された仮想環境のため、ホスト環境を汚しません。そのため、上で述べた問題が生じにくく、環境の移行も容易です。

このような利点から、所属研究室でもDockerを導入する動きが盛んになってきており、私も今年の夏頃から始めました。

# Azure Kinect DKとは
前置きが長くなりましたが、本題に入ります。

Azure Kinect DKとは、今年の7月頃からアメリカや中国なので販売開始されたRGB-Dカメラです。Kinect V2の後継機と呼ばれており、開発者用に多数のSDKが公開されています。

ただ、発売から間もないことから、情報が少なく、Azure KinectをDockerで動かしている人は見当たらなかったため、自分で作成してみました。Microsoftが公開しているDockerもあったのですが、SDKのインストールがされておらず、使えなかったです。

# Dockerfileの作成
SDKのインストールだけ苦労したので、それだけ書きます。公式サイトに従ってインストールをしようとしたのですが、途中でEULAライセンスの承諾をする必要があり、Dockerのビルド中に止まってしまうという問題が発生しました。

これは、`expect`というコマンドでターミナル上の対話を自動化することで回避しました。

[2020/1/17追記]
`timeout`の時間が短すぎると、対話になる前にインストールが打ち切られてしまい、buildがうまく行かない場合があるかもしれません。その場合は、`timeout`を100とかにしてみてください。

```
#!/bin/sh
expect -c "
set timeout 10
spawn apt install -y libk4a1.3 libk4a1.3-dev k4a-tools
expect \"Do you accept the EULA license terms?\"
send \"yes\n\"
expect \"\\\$\"
exit 0
```

# ダウンロード
下記リンクで公開しています。
https://github.com/Shunmo17/azure_kinect_docker

# 参考サイト
https://docs.microsoft.com/ja-jp/azure/Kinect-dk/sensor-sdk-download
https://qiita.com/ine1127/items/cd6bc91174635016db9b
【Rails】Font Awesomeインストール後　Sass::SyntaxError

#あなたのブラウザにはこのようなエラーが出ますか？
<img width="870" alt="3b2620fc1e118d49b0123c2a801f5f87.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/c8295454-07d3-4dfd-fea6-65fb350a8f4f.png">

**Sass::SyntaxError in ~~~#index**
おかしいな。お手本見て入れたし、現状のソースをお手本と比べても問題はなさそうだゾ。

#原因？
海外サイト勢「サーバー再起動してみそ」

再度 ```rails s```

「えっ」

問題なく起動。

![syokuji_computer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/5cd944c3-a4d3-78f6-7d86-433a2c6dcdf6.png)

#参考記事
```@import 'font-awesome'``` doesn't work in Rails
https://stackoverflow.com/questions/38807875/import-font-awesome-doesnt-work-in-rails
AKS Deployment でアプリケーションをデプロイする

今回は Deployment を実行する方法を見ていきたいと思います。Kubernetes の Deployment では以下3点のことを実行するみたいです。
- Pod のロールアウト/ロールバック
- ロールアウト方式の指定
- ロールアウトの条件や速度の制御

つまり、Kubernetes における Deployment とは、コンテナーイメージのバージョンアップがあった際に、新しい ReplicaSet を作成し、準備新しいPod に置き換えてロールアウトする仕組み、とも解釈することができます。
ReplicaSet とよく似ているように思いますが、下記の図のような概念になるため、Deployment は ReplicaSet を包括した少し大きな枠組みと理解することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/9ee5014f-9b86-86af-3a92-47d313c93978.png)



#マニフェストファイルの作成
Deployment を定義するマニフェストファイルは以下のような形になります。`kind` の部分で Deployment を指定する様です。

```deploysample.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment

spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod

  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80
```

#Deployment の実行
前回記事で取り上げた、ReplicaSet を構築する方法と良く似ています。このマニフェストファイルを `kubeclt apply -f Deployment/nginx-deployment.yaml` で実行してみましょう。

```
$ kubectl apply -f deploysample.yaml
deployment.apps/nginx-deployment created
```

クラスター内の Deployment の一覧を確認するには、以下のコマンドを実行します。

```
$ kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           2m51s
```

また、`get replicaset,pod` を実行すると、作成された ReplicaSet / Pod を確認することができます。Deployment のマニフェストファイルを実行するだけでどちらもデプロイできるのでとても便利ですね。

```
$ kubectl get replicaset,pod
NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.extensions/nginx-deployment-5c987f56f6   3         3         3       9m22s

NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5c987f56f6-4kzbk   1/1     Running   0          9m22s
pod/nginx-deployment-5c987f56f6-94pkp   1/1     Running   0          9m22s
pod/nginx-deployment-5c987f56f6-h46nc   1/1     Running   0          9m22s
```

Deployment の実行方法について見てきました。次回は、Deployment を変更する方法について詳しく見ていきたいと思います。

#参考
Deployments
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
dnf コマンドの使い方メモ

前回記述した「[yum コマンドの使い方メモ](https://qiita.com/yasushi-jp/items/4b2bb6fce1e3e217207a "yum コマンドの使い方メモ")」を`dnf`コマンドでどうなるか紹介します。

### 1. 更新の確認
インストール済みのパッケージで更新可能なアップデートを確認する。

```
dnf check-update
```

### 2. パッケージの更新
パッケージを更新する。更新するパッケージの依存関係またはパッケージに利用可能な更新がある場合は、それらも更新される。

```
dnf upgrade <パッケージ名>
```

### 3. セキュリティー関連パッケージの更新
セキュリティー更新が利用可能なパッケージのみを最新のバージョンに更新する。

```
dnf upgrade --security
```

最新のセキュリティー更新を含むバージョンにのみパッケージを更新する。

```
dnf upgrade-minimal --security
```

### 4. パッケージグループを更新
パッケージグループを更新する。

```
dnf group upgrade <グループ名>
```

### 5. パッケージのインストール
特定のパッケージと、そのパッケージでインストールされていない依存関係をすべてインストールする。

```
dnf install <パッケージ名>
```

特定のパッケージと、そのパッケージでインストールされていない依存関係をすべてyesでインストールする。

```
dnf install -y <パッケージ名>
```

リポジトリを指定してインストールする。

```
dnf --enablerepo=<有効にするリポジトリ名> --disablerepo=<無効にするリポジトリ名> install <パッケージ名>
```

### 6. パッケージの削除
特定のパッケージと、 それに依存するすべてのパッケージをアンインストールする。

```
dnf erase <パッケージ名>
```


### 7. パッケージの検索
パッケージ名と概要から検索する。

```
dnf search <検索文字列>
```

パッケージ情報の全てから検索する。

```
dnf search all <検索文字列>
```

### 8. パッケージの一覧表示
すべてのインストール済み および 利用可能なパッケージに関する情報を一覧表示する。

```
dnf list --all
```

glob表現に一致するインストール済み および 利用可能なパッケージを一覧表示する。

```
dnf list <glob表現>
```

インストール済みのパッケージを一覧表示する。

```
dnf list --installed
```

glob表現に一致するインストール済みのパッケージを一覧表示する。

```
dnf list --installed <glob表現>
```

有効なすべてのリポジトリーでインストール可能なパッケージを一覧表示する。

```
dnf list --available
```

glob表現に一致する有効なすべてのリポジトリーでインストール可能なパッケージを一覧表示する。

```
dnf list --available <glob表現>
```

### 9. リポジトリーの一覧表示
リポジトリーの ID、名前、使用中のシステム上で 有効な 各リポジトリーでのパッケージ数を一覧表示する。

```
dnf repolist
```

リポジトリーの詳細情報を一覧表示する。

```
dnf repolist -v
```


有効および無効なリポジトリーの両方を一覧表示する。

```
dnf repolist all
```

### 10. パッケージ情報の表示
パッケージに関する情報を表示する。

```
dnf info <パッケージ名>
```

### 11. ローカルリポジトリの作成

事前に`createrepo`をインストールする。

```
dnf install -y createrepo
```

### 11.1. パッケージをダウンロードしてローカルリポジトリを作成

```console
# cd /root
# mkdir -p dnf/my_repo/Packages
# cd /root/dnf/my_repo/Packages
# dnf download --resolve <パッケージ名>
# cd ../..
# createrepo my_repo
```

`/etc/yum.repos.d/my_repo.repo`ファイルを作成

```repo:/etc/yum.repos.d/my_repo.repo
[my_repo]
name=MyRepo
baseurl=file:///root/dnf/my_repo
enabled=1
gpgcheck=0
```

### 11.2. メディア（isoファイル）内のPackagesをコピーしてローカルリポジトリを作成 

```console
# mkdir <mount_dir>
# mount -o loop <iso_name> <mount_dir>
# cd /root
# mkdir -p dnf/all_repo/Packages
# cd /root/dnf/all_repo/Packages
# cp <mount_dir>/Packages/* ./
# cd ../..
# createrepo all_repo
# umount <mount_dir>
```

`/etc/yum.repos.d/all_repo.repo`ファイルを作成

```repo:/etc/yum.repos.d/all_repo.repo
[all_repo]
name=all_repo
baseurl=file:///root/dnf/all_repo
enabled=1
gpgcheck=0
```

### 参考ページ
> [第9章 Yum Red Hat Enterprise Linux 7](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-yum "第9章 Yum Red Hat Enterprise Linux 7")
> [DNF, the next-generation replacement for YUM](https://dnf.readthedocs.io/en/latest/ "DNF, the next-generation replacement for YUM")


以上
nvidia-docker2で機械学習の環境構築

## はじめに
Dockerの運用が必要になったので環境構築してみました

## 環境

## Docker のインストール
aptのパッケージリストを更新する

```
sudo apt update -y
```

必要なソフトウェアのインストールする

```
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
```

docker公式のGPG公開鍵をインストールする

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

リポジトリを追加する

```
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```

再度パッケージリストを最新の状態に更新する

```
sudo apt update -y
```

Docker CEをインストールする

```
sudo apt-get install -y docker-ce
```

ユーザーをグループに所属させる（sudoなしで実行できるようにする）

```
sudo gpasswd -a user docker
```

## nvidia-docker2.0 のインストール
旧バージョンのnvidia-docker 1.0がある場合は削除する

```
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge nvidia-docker
```

nvidia-dockerの公開鍵を取得してインストールする

```
curl -sL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
```

変数を設定する

```
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
```

リポジトリを追加する

```
curl -sL https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
```

再度パッケージリストを最新の状態に更新する

```
sudo apt update -y
```

nvidia-docker2.0 をインストール

```
sudo apt install nvidia-docker2 -y
```

デーモン起動を起動する

```
sudo pkill -SIGHUP dockerd
```

## Dockerfile を作る

Dockerfileを作ります

```
FROM nvidia/cuda:10.1-devel-ubuntu18.04
ENV CUDNN_VERSION 7.6.4.38
RUN apt-get update && apt-get install -y --no-install-recommends \
    libcudnn7=$CUDNN_VERSION-1+cuda10.1 \
libcudnn7-dev=$CUDNN_VERSION-1+cuda10.1 \
&& \
    apt-mark hold libcudnn7 && \
    rm -rf /var/lib/apt/lists/*

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata
RUN apt-get update && apt-get install -y  \
    wget \
    curl \
    make \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    llvm \
    libncurses5-dev \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libffi-dev \
    liblzma-dev \
    vim

WORKDIR /root/
RUN wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz \
    && tar xvf Python-3.7.0.tar.xz \
    && cd Python-3.7.0 \
    && ./configure --enable-optimizations \
    && make altinstall
RUN rm Python-3.7.0.tar.xz

WORKDIR /root/Python-3.7.0
RUN ln -fs /root/Python-3.7.0/python /usr/bin/python
RUN curl -kL https://bootstrap.pypa.io/get-pip.py | python 

WORKDIR /root/
ADD requirements.txt /root/
RUN pip install -r requirements.txt && rm requirements.txt

ENV PYTHONPATH "${PYTHONPATH}:/usr/local/lib/python3.7/site-packages"
CMD ["/bin/bash"]
```

## イメージを作る
Dockerfileをもとにイメージを作る

```
docker image build -t cuda-10.1-cudnn7.6 .
```

## コンテナを作る

ホストのディレクトリをコンテナにマウントする

```
docker container run -it --runtime=nvidia -h hoge --mount type=bind,src=/hoge/base,dst=/root/dst cuda-10.1-cudnn7.6
```


## 結果
とりあえず学習ができているはず

![スクリーンショット 2019-11-22 22.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352437/5d9844ac-7e92-69de-5ae2-ab1616093440.png)
mapのループ内でawaitしたいのに怒られてはまった件

# mapのループ内でawaitしたいのに怒られてはまった件
## ループ内でawaitしたかったけど怒られた
- ループ内で非同期関数が返す結果をawaitで受け取ってまとめて返したかった

```js
let ids = [0,1,2]
const getDataByIds = async (ids) => {
  let ret = [];
  ids.map((id) => 
  {
    // getDataByIdはasync関数
    let data = await getDataById(id)
    ret.push(data)
  })
  return ret
}
```

- しかし怒られる

```
Parsing error: Can not use keyword 'await' outside an async function
```

- 訳：awaitはasync関数以外で使ってんじゃねーぞコラ
- わたし：は？いやいやいやgetDataByIdsはasyncにしてるやん？？？？頭おかしくなったか？？？？アァン
- エラーメッセージでぐぐってもasync関数で囲えやみたいな記事しかない。。。いや囲ってるんですけど…

## 原因①：map内も関数だった
- async awaitとかPromiseとかをもう一回おさらいしたりぐぐったりしていろいろ考えた結果…
- forのかわりに使ってたので忘れてたけど**map内もよく考えたら関数だ**:scream::scream::scream:ということに気づく
    - よくわからずに新しい機能を使おうとするからこうなる。よくないね。

## map内のアロー関数にasyncつけたらエラーが消えた！！！けど…？

```js
let ids = [0,1,2]
const getDataByIds = async (ids) => {
  let ret = [];
  // map内のアロー関数にasyncつけたらエラー消えた
  ids.map(async (id) => 
  {
    // getDataByIdはasync関数
    let data = await getDataById(id)
    ret.push(data)
  })
  return ret
}
```

- エラーは消えた！！ばんざい
- ただし結果は期待する挙動にはならなかった。。。。
    - 変な配列が返却されちゃう
    - 空の配列のようで中身が入っている、でもmap使えない…みたいな謎配列
- console.logでretを出力するとこんな感じ

![変な配列.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120823/5c9fcd95-9282-0bbe-28b9-f458c6742ac8.png)

- 正しい配列はこんなふうになる

![正しい配列.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120823/bf4d8c57-2738-dd3f-4c15-63b064554ecd.png)

### 配列ではなくPromiseオブジェクトだった
- 「変な配列」の正体はPromiseオブジェクトでした！！
    - map内のasyncアロー関数が返しているPromiseのオブジェクトでした
    - コメントを貰って気づきました。ありがとうございます:pray:
- Promiseオブジェクトを配列として扱おうとして、うまくいっていなかったようです

## 解決策①：Promise.allを使う
- Promise.allを使えばmapでまわしたPromiseの結果をかき集めることができます！
    - コメントをもらってこのやり方を知りました。ありがとうございます:pray:

```js
const getDataByIds = async (ids) => {
  // 未解決の Promise を集めてしまう。
  let promises = ids.map(id => {
    return getDataById(id);
  });
  // Promise.all でまとめて待つ
  let ret = await Promise.all(promises);
  return ret
}
```

[Promise.all() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)

## 解決策②：mapじゃなくてforつかう
- ちょっとダサいですが、forを使ってもできます！

```js
let ids = [0,1,2]
const getDataByIds = async (ids) => {
  let ret = [];
  // おとなしくfor使う
  for (let i = 0; i < odaiIds.length; i++)
  {
    // getDataByIdはasync関数
    let data = await getDataById(ids[i])
    ret.push(data)
  })
  return ret
}
```

- 期待通りの動きになった！！！バンザイ

## 参考
- asyncとかawaitとかについては以下の記事がめちゃくちゃ参考になりました！！！
    - [async/await 入門（JavaScript）](https://qiita.com/soarflat/items/1a9613e023200bbebcb3)
Yao入門 1　(GHZ状態の作成)

# 目的
Juliaの量子計算シミュレーションのパッケージで"Yao.jl"というものを見つけたので少し遊んでみよう。
今回はGHZ状態を作成しながら基本的な操作補法を学ぶ。

## 道具をそろえる

```julia
   using Yao
   using BitBasis
   using Plots
   gr()
```

## 量子回路の作成

```julia
   circuit = chain( # {ではない}
    4,                            #4-qubit
    # 以降の操作の順番は量子回路の入力から出力への順番に対応している。
    put(1=>X),                    #1番目のqubitにPauli-X 
    repeat(H,2:4),                #2~4番目のqubitにHadamard
    control(2, 1=>X),　　　　　　　#2から1に向けてcontrol-X　　　　
    control(4, 3=>X),
    control(3, 1=>X),             
    control(4, 3=>X),
    repeat(H, 1:4),
)
```
## 初期状態の作成

量子状態を表すものとしてArrayRegが用意されている。状態 $\left| 0000\right>$を作成するには主に2つ方法があり

```julia
   zero_state(4)
   ArrayReg(bit"0000")
```

## 初期状態に回路を作用させる

```julia
   apply!(zero_state(4), circuit)
```

## 観測する
観測するには今までの
- 初期状態の作成
- 回路を作用
- 観測
を続けて行わないといけないがこれにはパイプ`|>`を使うことができる
観測を1000回行うと

```julia
   results = zero_state(4) |> circuit |> r->measure(r, nshots=1000)
```

これを最後にヒストグラムで見たいのだが、resultsはBitStr型になっていてこれを整数に戻す必要がある。これにはBitBasisの関数としてbintが用意されているのでこれを作用させればよく。

```julia
    num_result=bint.(results) #整数値に変換
    histogram(num_result)
```
とすると

![GHZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345894/05738a87-bcbc-e681-b4cb-ece62ecbd1f7.png)

となる。予想していたように
$$\left| GHZ\right>=\frac{1}{\sqrt{2}}\left| 0000\right>+\frac{1}{\sqrt{2}}\left| 1111\right>$$
となる。

## 次回
次回では初学者には想像しにくいOrder findingの出力状態を見てみる。

# 参考文献
[Yao.jl公式ドキュメント](https://quantumbfs.github.io/Yao.jl/latest/index.html)
勉強記録　1日目 - Effective C++ 第3版 - 

#　はじめに
はじめまして、私は大学でロボットを研究する研究室に所属しています。
私は、主にソフトウェアについて勉強しています。
使用している言語は、C++, python, javascriptです。
ROSも使っています。
C++, python, ROSについて勉強した記録を残そうと思います。
しばらくは、Effective C++ 第3版を読んでそれについてまとめていきます。
できるだけ、毎日投稿するつもりです。

# Effective C++ 第3版 - イントロダクション -
## デフォルトコンストラクタ

コンストラクタとは？
C++で、クラスの初期化を行うときに最初に呼ばれる特別な関数。

デフォルトコンストラクタとは？
初期化時に引数を取らないコンストラクタのこと。
もしくは、引数があってもデフォルト値が与えられているコンストラクタのこと。

下にデフォルトコンストラクタとデフォルトコンストラクタ以外のコンストラクタを使ったクラスのサンプルコードを書きます。

```cpp:intro_default_constructor.cpp
#include <iostream>

// 初期化
/// デフォルトコンストラクタ：引数をとらないコンストラクタ
// もしくは、デフォルト値が与えられているコンストラクタ

class ClassA {
 public:
  ClassA(){};  // デフォルトコンストラクタ
  ~ClassA(){};
};

class ClassB {
 public:
  explicit ClassB(int a){};  // デフォルトコンストラクタではない
  ~ClassB(){};
};

class ClassC {
 public:
  explicit ClassC(int x = 0, bool b = true){};  // デフォルトコンストラクタ
  ~ClassC(){};
};

int main(int argc, char *argv[]) {
  std::cout << "intoro_default_constructor.cpp" << std::endl;
  ClassB test(5);
}
```
## 参考文献
・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0
Android上で、RTMPつかって動画ストリーミング再生（Unityでアプリつくるよ）

# 概要

Androidアプリ上でRTMP動画ストリーミング再生したい。


# 環境
・Android8
・Unity2018.2.21f1


# データの流れ
OBS→（RTMP）→VirtualBox上のCentOS→(RTMP) → Android


# 作成手順

1. OBS設定
2. RTMPサーバ作成
3. Androidアプリ作成
4. OBSから配信スタート

## 1.OBS設定
配信先をサーバのアドレスにするだけ
Youtubeとかを設定できる画面で、
ここでは、 http://192.168.1.63:1935/live
とする

## 2. RTMPサーバ作成
###参考文献
- ★ https://qiita.com/sparkgene/items/c3ac042f30cc5d0fe324

###作業内容
参考文献の★の”配信サーバの準備”を行ってください。
ただ、自分はCentOSでやったため、Makeがうまくうごきませんでした。
CentOS８でやる場合は、nginx-1.16.1をつかうとMake通りました。
MakeFileを作るときに使ったコマンドは、

```
./configure --add-module=../nginx-rtmp-module-master --with-http_ssl_module --with-cc-opt="-Wno-error"
```

となります。

## 3. Androidアプリ作成
アセットのUMP
https://assetstore.unity.com/detail/tools/video/ump-pro-android-ios-83283
を使うだけです。
UniversalMediaPlayerのPrefabをシーンにおくのと
投影先となるPlaneをシーンにおいて連携させます。
UniversalMediaPlayerの

- ”OpenGL Decoding”をEnable
- ”RTP over RTSP(TCP)”をOn

にすることをわすれずに。

設定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/e05c4aba-7900-9877-5d8e-698ae43c3e0a.png)

## 4. OBSから配信スタート
OBSの配信ボタンを押して、配信開始。



# 感想
AVPROとかEasyMovieTexutreではRTMP無理だったので、UMPで動いてよかった
fzf + kubectlでデバッグ時に便利なalias

kubectlを使ったデバッグ時に便利なaliasをいくつか紹介します。
最近は[k9s](https://github.com/derailed/k9s)を使うことも多くなってきましたが、使えない環境ではこちらのaliasも便利です。

ちなみに以前、[GKEの快適なオペレーション](https://qiita.com/kajitack/items/5af6a838bff34724a639) という記事も書いたので参考にしてみてください。

## fkl (fzf + kubectl logs): 選択したpodのlogを表示

履歴に残すために直接実行せずに`print -z`でコマンドを表示してます。

```zsh

function _fzf_kubectl_logs() {
  local selection=`kubectl get pods --all-namespaces -o wide | fzf --header-lines=1 --query="$*" --select-1 -e `
  if [ $selection == "" ]; then
    return 0
  fi
  local namespace=`echo $selection | awk '{ print $1 }'`
  local pod=`echo $selection | awk '{ print $2 }'`
  local containers=`kubectl -n $namespace get pods $pod -o jsonpath='{range .spec.containers[*]}{@.name}{"\n"}{end}'`
  local container_count=$((`echo "$containers" | wc -l`))

  local container
  if [ ${container_count} -gt "1" ]; then
    container=`echo "$containers" | fzf --header "Select a container..."`
  else
    container=$containers
  fi

  if [ $container == "" ]; then
    return 0
  fi

  print -z "kubectl logs -n ${namespace} ${pod} -c ${container}"
}
alias fkl=_fzf_kubectl_logs

```

## fkeit (fzf + kubectl exec -it): 選択したpodに任意のコマンドを実行

こちらも、履歴に残すために直接実行せずに`print -z`でコマンドを表示してます。

```zsh
function _fzf_kubectl_exec_it() {
  local selection=`kubectl get pods --all-namespaces | fzf --header-lines=1 --query="$*" --select-1 -e `
  if [ $selection == "" ]; then
    return 0
  fi

  local namespace=`echo $selection | awk '{ print $1 }'`
  local pod=`echo $selection | awk '{ print $2 }'`
  local containers=`kubectl -n $namespace get pods $pod -o jsonpath='{range .spec.containers[*]}{@.name}{"\n"}{end}'`
  if [ $containers == "" ]; then
    return 0
  fi
  
  local container_count=$((`echo "$containers" | wc -l`))
  if [ ${container_count} -gt "1" ]; then
    container=`echo "$containers" | fzf --header "Select a container..."`
  else
    container=$containers
  fi

  if [ $containers == "" ]; then
    return 0
  fi

  print -z "kubectl exec -n ${namespace} -it ${pod} -c ${container} "
}
alias fkeit=_fzf_kubectl_exec_it
```

## fkeitsh (fzf + kubectl exec -it sh): 選択したpodのshellを実行

shellの判別は出来ないので、ちょっと無理矢理です。
参考: https://gist.github.com/jondlm/35cbf0363eb925e2eff6ff86c0a30992

```zsh

function _fzf_kubectl_exec_it_sh() {
  local selection=`kubectl get pods --all-namespaces | fzf --header-lines=1 --query="$*" --select-1 -e `
  if [ $selection == "" ]; then
    return 0
  fi
  local namespace=`echo $selection | awk '{ print $1 }'`
  local pod=`echo $selection | awk '{ print $2 }'`
  local containers=`kubectl -n $namespace get pods $pod -o jsonpath='{range .spec.containers[*]}{@.name}{"\n"}{end}'`
  if [ $containers == "" ]; then
    return 0
  fi
  local container_count=$((`echo "$containers" | wc -l`))
  
  if [ ${container_count} -gt "1" ]; then
    container=`echo "$containers" | fzf --header "Select a container..."`
  else
    container=$containers
  fi
  
  kubectl exec -n $namespace -it $pod -c $container ash ||\
  kubectl exec -n $namespace -it $pod -c $container bash ||\
  kubectl exec -n $namespace -it $pod -c $container sh
}

alias fkeitsh=_fzf_kubectl_exec_it_sh
```
node-fetch をプロキシ環境で使う

node-fetch をプロキシ環境で使えるようにする薄いラッパーを書きました。

[node-fetch-with-proxy](https://www.npmjs.com/package/node-fetch-with-proxy)

使い方はnode-fetchと同じです。

```javascript
const fetch = require('node-fetch-with-proxy');

fetch('http://httpbin.org/get').then(res => { ... });
```

node-fetchとは異なる点として**環境変数でプロキシを設定**することができます。

```sh
# こんな感じで環境変数を指定しておけばプロキシ経由でリクエストするようになる
export HTTP_PROXY=http://your.proxy:8080
```

なお環境変数が有効になるのはNode.jsのみです。
ブラウザではブラウザ自身のプロキシ設定が使われますのでご注意ください。


## 動機

node-fetch はデフォルトではプロキシをサポートしません。

拡張オプションの `agent` を使えば以下のように比較的簡単に解決できますが、Node.js専用でブラウザでは使えません。[^1]

[^1]: ProxyAgentが Node.js固有の `net` とか `tls` に依存してるためビルドでコケる

```javascript
const ProxyAgent = require('proxy-agent');
const agent = new ProxyAgent();
fetch('https://www.google.com', { agent }).then(res => { ... });
```

個人的にnode-fetchを使いたい一番の理由がユニバーサルJSなのでブラウザでも破綻しない方法を探したのですが見つけられず、止む無くそれ用のモジュールを自作するに至りました。

もっと上手いやり方あったら教えてください...
ReVIEW-Template + GitHub ActionsでPDF生成

技術書典8の執筆を開始した。当選確定してないけど。
pushでPDFが自動生成できると便利だなーと思って作業したメモ。
CircleCI派が多いと思うけど、せっかくなのでGAになったGitHub Actionsを使う。

テンプレートはTechBoosterさんから拝借。
https://github.com/TechBooster/ReVIEW-Template

GitHub Actions用の定義は以下のようになる。
上記テンプレートではDockerを利用してPDFを生成するスクリプト build-in-docker.sh が用意されているのでこれを使う。

```/.github/workflows/action.yml
name: build
on:
  push:
    branches: 
      - master
jobs:
  build-pdf:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Build
      run: sh build-in-docker.sh
    - name: Upload
      uses: actions/upload-artifact@v1.0.0
      with:
        name: book.pdf
        path: articles/ReVIEW-Template.pdf
```

Artifactは各ジョブの詳細画面からアクセスできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66417/40c8ad4d-eaba-350e-dc10-70e72bac102c.png)

Artifactとしてアップロードしているが、Dropbox等にポストするほうが便利かもしれない。
そしてGitHub Actions初めて使ったけど便利ですね。

以上
Visual Studio CodeでPythonインタプリタっぽいことする

# 経緯
今まで使ってたPyScripterのインタプリタが便利だったから、Visual Studio Codeでも同じことしたかった。

# デフォルトの言語をPythonにする
Pythonしか開発で使わない人には便利。Settingsから"new file"で検索し、Default Languageをpythonにする

![スクリーンショット 2019-11-22 21.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209720/0881e882-a9ff-a07e-cc77-872c657f0b8d.png)

# AREPLをインストールする
Pythonコードを作ると、リアルタイムに実行結果を表示してくれるVSCodeのextension。多分他にもこういった拡張機能を持ったextensionはあると思うけど

![スクリーンショット 2019-11-22 22.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209720/570fd418-2f51-497a-921c-35bd0f3fd499.png)

これで新規ファイルを作成すれば.py形式で保存しなくてもPythonファイルと認識されるようになるし、AREPLを起動すれば、リアルタイムに実行結果が表示されるようになる

![スクリーンショット 2019-11-22 22.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209720/f102c872-c837-e52a-5654-03f92d3151e3.png)
Oculus QuestでUnityのライトマップが読み込まれない

OculusQuestでシーンのライトマップが読み込まれず見た目がおかしくなることがある。

エディタ上やPCビルドでは問題なし。

原因は不明。誰か教えてください。

# とりあえずの対処方法
ライトをベイクするときに`Directional Mode`を`Non-Directional`にすると直る。

`Directional`でも読み込めることがあるので本当に謎。
java学習1日目

<h1>progateにてjava学習</h1>
<p>java<strong>Ⅰ</strong>コース「コードの書き方,データの型,変数」.<br>
<strong>Ⅱ</strong>コース、演算子やプログラミングの論理の組み方.<br>
<strong>Ⅲ</strong>コース、メソッドとクラス、別のクラスからメソッドを呼び出す方法.<br>
そして、それらの総復習として<strong>Ⅳ</strong>（道場コース）まで学習した。</p>

<bold>初投稿でいまいちqiitaの使い方がわからないのでとりあえずここまで:frowning2:</bold>
AWS EC2 Amazon Linux 2 に Laravel 環境構築 + デプロイ [とりあえず最速でデプロイしたい人向け]


既にインスタンスを作成してssh接続が完了している前提です。
デプロイする場合は、githubにリモートリポジトリが作られている必要があります。
AmazonLinux2にLaravel環境を構築して各種設定を行い、実際に動かすまでの手順を共有します。

Apache 2.4
MySQL 8.0.18
PHP 7.3

## yumアップデート
```
$ sudo yum update -y
```

## Apacheのインストール
```
// インストール
$ sudo yum install httpd
// 起動
$ sudo systemctl start httpd
// 自動起動設定
$ sudo systemctl enable httpd
// 動作確認
$ systemctl status httpd.service
```

## MySQLのインストール
```
// mysql8.0リポジトリの追加
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y
// インストール
$ sudo yum install mysql-community-server -y

// 起動
$ sudo systemctl start mysqld.service
// 自動起動設定
$ sudo systemctl enable mysqld.service
// 動作確認
$ systemctl status mysqld.service

// デフォルトパスワード確認
$ sudo cat /var/log/mysqld.log | grep password
// 初期設定
$ mysql_secure_installation
```
初期設定でrootのパスワードを設定してください。
rootログイン後は各自MySQLの設定を行ってください。

## PHPのインストール
```
$ sudo amazon-linux-extras install php7.3
$ sudo yum install php-cli php-xml php-json php-mbstring php-process php-common php-fpm php-zip php-mysqlnd -y
```

## Gitのインストール
```
$ sudo yum install git
```

## githubとssh接続
```
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096
$ cat ~/.ssh/id_rsa.pub
コピーしてgithubに公開鍵を登録する
$ ssh -T git@github.com
```

## composerのインストール
```
$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
```

## 
## Laravelのインストール
```
// メモリ不足を回避するためにswapfileを作成する
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

// htmlに７７７の権限
$ sudo chmod -R 777 /var/www/html
$ cd /var/www/html
$ composer create-project --prefer-dist laravel/laravel app_name
または、
$ sudo git clone clone_url

// .envファイルの設定
$ cd app_name
$ cp .env.example .env
必要項目を設定する
```

## Laravelの設定
```
$ cd
$ sudo chown -R ec2-user:apache /var/www/html
$ sudo chmod 2775 /var/www/html && find /var/www/html -type d -exec sudo chmod 2775 {} \;
$ cd /var/www/html/app_name
$ composer install
$ composer update
$ php artisan key:generate
```

## パーミッションの設定
```
$ sudo chmod -R 777 storage
$ sudo chmod -R 775 bootstrap/cache
```

## Apacheの設定
```
$ sudo vi /etc/httpd/conf/httpd.conf

// 変更
DocumentRoot /var/www/app_name/public

// 追加
<Directory "/var/www/html/app_name/public">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

```

## Apacheの再起動
```
sudo systemctl restart httpd
```

これでアクセスすれば表示されるます。
もし違っている部分があれば指摘していただけると幸いです。

参考記事
https://medium.com/@hbayraktar/how-to-install-laravel-5-on-amazon-linux-2-303ef2d38fa4
Longan nano で Hello World!

Sipeed Longan nanoで付属のLCDに定番のHello World!を表示してみます。
ただ、私の技術力が足りずあまりにもひどい実現方法であることをお許し下さい。

LCDの解像度は160x80、フルカラーです。
1000円以下のボードなのに、良心的ですね。

#Longan_GD32VF_examplesをダウンロードする
私に知識がないので、ありものを改造する方向にします。
[Longan_GD32VF_examples](https://github.com/sipeed/Longan_GD32VF_examples)

上記から、Longan_GD32VF_examplesをダウンロードします。
これ、Badapple!!の本体です。
これにはLCDへの出力部分、microSDカードとのインターフェース部分が備わっており、これをみるだけでも勉強になりそうです。

#gd32v_lcdをVScodeのplatformIOで開く
ダウンロードしたファイルを解凍するとgd32v_lcdというフォルダがありますので、フォルダをVScodeのplatformIOで開きます。

#main.cを書き換える
開いたら、srcディレクトリにmain.cがあることがわかりますので、中を見ます。
「ははーん、こういう風になってるんだな。Longan nano完全に理解した」

…いやいや、無理無理ｗ
というわけで、中身をざっくり全部消去して、下記のコードに書き換えます。


```c:
#include "lcd/lcd.h"
#include <string.h>

int main(void)
{

    Lcd_Init();			// init OLED
    LCD_Clear(BLACK);
    BACK_COLOR=BLACK;


        LCD_ShowString(0,  0, (u8 *)("Hello World!"), WHITE);
        LCD_ShowString(0, 16, (u8 *)("Hello World!"), BLUE);
        LCD_ShowString(0, 32, (u8 *)("Hello World!"), BRED);
        LCD_ShowString(0, 48, (u8 *)("Hello World!"), GBLUE);
        LCD_ShowString(0, 64, (u8 *)("Hello World!"), RED);
        Draw_Circle(120,40,25,RED);
        LCD_DrawLine(120,0,130,80,BLUE);
        LCD_DrawRectangle(120,40,159,79,GREEN);
        LCD_Fill(130,20,150,30,MAGENTA);

}
```

書き換えたら、ビルドしてLongan nanoをDFUモードにして書き込みましょう。

#LCDにHello world!表示
LCDの左側に文字、右の方に丸、四角、直線、塗りつぶし四角が表示されます。

![IMG_0547.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129938/549ecb63-3420-3eed-eecf-ca534b7d4e63.jpeg)

日本語のフォントは入っていないので、日本語を表示させたい場合はフォントを作るしかありません。

あれ？ハロワになってる…wwww

platformIOのnewProjectしたときに、今回のLCD.hとか必要なライブラリ（というんでしょうか？）が入ってるようにするためにはどうしたらいいんですかね？
あと、どのファイルが必要でどのファイルが必要じゃないかが、よくわかってないです。
この辺の知識付けていかないとダメですね。
vue.js v2(Nuxt)で下にフリックして閉じられるモーダルコンポーネントを作ってみた

下にフリックして閉じられるモーダルは、最近のアプリでは定番になりつつあるがwebではまだあまり見たことがなく、あったらいいのになぁ、と漠然と思ってた。
そんな折 「[【新版】UI GRAPHICS 成功事例と思想から学ぶ、これからのインターフェイスデザインとUX](http://www.bnn.co.jp/books/9522/) 」という本を読み、こういったUIが今後のトレンドに対する新たなアプローチですよ、というご意見に完全に触発され作ってみたくなった。

ので、作ってみた。

# SwipeableDrawer

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390283/86b070ab-83cd-a303-356b-8217280ac716.gif" width="250">

■ デモ
https://dsflon.github.io/SwipeableDrawer/
（スマホで見てください:iphone:）

■ ソース
https://github.com/dsflon/SwipeableDrawer

参考にした本では`ハーフモーダル`と表現されていますが、[Material-UI](https://material-ui.com/api/swipeable-drawer/)を参考に `SwipeableDrawer` というコンポーネント名にしました。


# 使う

■ 本体はここ
https://github.com/dsflon/SwipeableDrawer/tree/master/components/SwipeableDrawer

nuxtで `typescript` `vue-property-decorator` を入れている場合、下記のような感じで利用します。

```index.vue
<template>
  <div>
    <button @click="opened = true">
      開く
    </button>

    <SwipeableDrawer
      :open="opened"
      @close="opened = false"
    >
      <!-- ここに内容を入れます -->
    </SwipeableDrawer>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';

import { SwipeableDrawer } from '~/components/SwipeableDrawer';

@Component({
  components: {
    SwipeableDrawer,
  },
})
export default class Index extends Vue {
  opened = false;
}
</script>
```

# 詳細を...そのうち書きます...
- easingJSを自前でこしらえた件
- スワイプとフリックの両方で閉じられるようにした件
- 横方向スクロールと干渉しあわないようにスワイプの角度を考慮した件
jQueryをCDNで読み込むときにURLが若干違うのが良くわからなかった

他の人のプログラムとかネットで調べたりするとjQueryのCDNを読み込むときのURLがいろいろ違くて何が最適解なのかわからなかった

- jQueryのバージョン
- CDNファイルファイルの種類
- CDN提供しているプロバイダ
- プラグインの種類

調べると上の条件とかで違っていたよう
じゃあ何を使えばいいの :point_down_tone2::rolling_eyes:

#まずjQueryとは
JavaScriptのライブラリのひとつ
jsコードを簡単に書くことが出来る
利用するにはファイルを**ダウンロード**する方法と**CDN**を読み込む方法がある

#まずCDNとは
ｺﾝﾃﾝﾂﾃﾞﾘﾊﾞﾘﾈｯﾄﾜｰｸ
インターネット経由でファイルを提供してくれるもの

- ファイルをダウンロードしてサーバにアップロードする手間が省ける
- バージョン変わっても対応が楽
- ブラウザのキャッシュに残っていれば表示速度も速くなる

自分のページじゃなくても他のサイトからCDNでjQueryを読み込んでいれば、ブラウザにキャッシュが残るから、それを再利用することで読み込みを省略できる:o:



#jQueryのバージョン
URLの数字の部分が違うのは**バージョン**が違っていたから
###jQuery1.x系統
IE8以前のブラウザに対応
古くて重い
現在の最新バージョンは`1.12.4`
###jQuery2.x系統
IE8以前を切り捨てた
軽い
現在の最新バージョンは`2.2.4`
###:star: jQuery3.x系統 :star:
2.x系統の一部処理を削いだりして性能向上
使えないプラグインがあるかもだけど、リリースから10年たってるから気にしなくてもよさそう
現在の最新バージョンは`3.4.1`

#CDNのファイル種類
指定しているファイル名が違うのは**種類**が違っていたから
###hoge.js
普通に記述されてるファイル
###:star: hoge.min.js :star:
改行、スペースとかを削いで容量を減らしてるファイル
###hoge.min.map
圧縮ファイルのプログラムをデバッグするときに使うらしい
###hoge.slim.(min).js
使える機能を抜粋し、minよりさらに容量が少なくて済むファイル
AnimationやAjax等の機能を省いたらしい

#jQueryCDNの提供元
ドメイン名が違うのは提供している**プロバイダ**が違っていたから
[jQueryの公式ホームページ](https://jquery.com/download/)にはStackPatahのCDNが大々的に書かれてて、"その他のCDN"の覧に他4プロバイダのCDNダウンロードページが紹介されてる

- [StackPath CDN](https://code.jquery.com)<br>
`src="https://code.jquery.com/jquery-3.4.1.slim.js"`
- :star: [Google CDN](https://developers.google.com/speed/libraries/#jquery) :star:<br>
`src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"`
- [Mcrosoft CDN](https://docs.microsoft.com/en-us/aspnet/ajax/cdn/overview#jQuery_Releases_on_the_CDN_0)<br>
`src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.4.1.min.js"`
- [CDNJS CDN](https://cdnjs.com/libraries/jquery/)<br>
`src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"`
- [jsDelivr CDN](https://www.jsdelivr.com/package/npm/jquery)<br>
`src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"`

個人の見解だけど、jQueryの使い方とか調べると**GoogleのCDNを使ってる人が多い気がする**こと、そして公式推奨のStackPathよりも**GoogleのCDNの方が応答速度が速いらしい**ことから私はGoogleの提供してるjQueryを使いたい

#プラグインの種類
jQueryをさらにパッケージ化したもの
###jQuery Migrate
バージョン差異によって発生する問題を解決する為のjQueryプラグイン
###jQuery UI
UIに特化したプラグイン
最初にjQueryの￥も読み込む
ドロップ＆ドラッグやデザインの統一
###jQuery Mobile
モバイルに特化したプラグイン

###jQuery Color
背景色をスムーズに変化させる
jQueryを先に読み込む
###QUnit
jQueryのテスト用
###PEP
モバイルにも対応していてドロップ＆ドラッグができる

#ついでに
万が一CDNが読み込めなかったときにローカルファイルを読み込ませる記述

```html:
<script src="読み込むCDN"></script>
<script type="text/javascript">
    (window.jQuery || document.write('<script src="代替ローカルファイル"><\/script>'));
</script>
```
初心者によるプログラミング学習ログ 166日目

# 100日チャレンジの166日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

166日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>166日目<br><br>やってることは同じ。<br>webサイトコーディング課題。<br><br>実質1時間ぐらいしかやらなかったな・・・<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1197610548914864128?ref_src=twsrc%5Etfw">November 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Xamarin.Formsで'App'が見つからない

#エラー
新規プロジェクトを作成し実行すると、
CS0246 型または名前空間の名前 'App' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。
というエラーが出ました。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309688/22f50eac-6e25-6052-f239-cdf3ee5dc9bc.png)
色々試してみたところ、このエラーは一度削除したプロジェクトと同名のプロジェクトを新規作成した時に発生するようです。
私は参照設定を追加することで解決できました。

#参照設定を追加する
今回プラットフォームにAndroidとiOSを選択していたので、「01_HelloWorld.Android」と「01_HelloWorld.iOS」それぞれに対して「01_HelloWorld」を参照先に割り当てます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309688/5e838aae-c502-ee1e-4717-df260242b98b.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309688/775a5bb9-8563-7dfe-5ccd-f9f077e66362.png)

これで実行することが出来ました。

参考
https://social.msdn.microsoft.com/Forums/ja-JP/ea019bef-a8fe-4f6a-b1fc-fa77e02430f5/xamarinforms12290app12364352111238812363124251239412356124561252112?forum=vsgeneralja
https://dotnet.programmer-reference.com/vs-references-add/
pythonの勉強　update()による辞書の更新

#update()だよ。２つの辞書を用意して1つの辞書にすることができるよ

```Python
members = {'a':1,'b':2,'c':3,'d':4}
others = {'e':5,'f':6}

members.update(others)　# 変数membersの後ろに変数othersを更新するよ
print(members)
```
```
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
```

```Python
others.update(members) # 変数othersの後ろに変数membersを更新するよ
print(others)
```

```
{'e': 5, 'f': 6, 'a': 1, 'b': 2, 'c': 3, 'd': 4}
```

##もし、２つの辞書に共通のキーを持っていたら・・・

```Python
members = {'a':1,'b':2,'c':3,'d':4}　　　d=4
others = {'e':5,'d':6}　　　　　         d=6

members.update(others)
print(members)
```

```
{'a': 1, 'b': 2, 'c': 3, 'd': 6, 'e': 5}  d=6に変化
```

```Python
others.update(members)   
print(others)
```

```
{'e': 5, 'd': 6, 'a': 1, 'b': 2, 'c': 3}　d=6に変化
```

dの値は上書きされ、キーの数も6つから5つになっている

#辞書の中にキーが存在するか確認するよ。

```Python
signal = {
    'banana':1,
    'apple':2
}
```


### 'banana' in keys()　を使って辞書にbananaがあるか確かめるよ。

```Python
print('banana' in signal)

```

```
結果：True
```

```Python
print(signal.keys()) 変数signalのキーを表示
print(signal.values())　変数signalの値を表示
list(signal.items())　変数signalのキー、値を表示

dict_keys(['banana', 'apple'])
dict_values([1, 2])
```

```
[('banana', 1), ('apple', 2)]
```
[Blender]非表示になってるオブジェクトの、アウトライナ上での選択状態を知る

画像のように、非表示になってる状態だと以下のコマンドで選択状態が把握できないらしい。

```
bpy.context.selected_objects
```

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492401/64bfe630-2ebd-b060-7796-a81c55ba1114.jpeg)

代わりに、一旦表示状態に切り替えてから非表示に戻すしかないっぽい

```
import bpy
obj1 = bpy.data.objects['Cube.003']
obj1.hide_viewport = False
s = bpy.context.selected_objects
print(s)
obj1.hide_viewport = True
```

うーん、・・・

Blender2.8 自分用メモ
サーバのネットワーク状態確認（CentOS6）

## 本資料の目的
* 私が業務で携わるサーバは月間数億リクエストの処理を行っています。
* そのサーバでパケットロスが発生していないか？の確認を行うケースがありますので、そのナレッジをここに整理します。

## 概要
* サーバのパケット状態の確認を行う方法を以下の通り。

## 詳細
* 対象のサーバへログインし、以下のコマンドを実行する。
	* `ifconfig`
            * `dropped:`の数値を確認する

```
出力例
em2       Link encap:Ethernet  HWaddr 90:B1:1C:30:BF:2B
          inet addr:xxx.xxx.xxx.xxx  Bcast:192.168.199.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:35917473041 errors:0 dropped:0 overruns:0 frame:0
          TX packets:39368376555 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:19193188634415 (17.4 TiB)  TX bytes:8546421438841 (7.7 TiB)
          Interrupt:38

→「dropped:0」なので、ドロップしていないことが分かる
```

* NICの詳細な状態を確認するには以下のコマンドを実行する。
    * `ethtool NIC名称`
        * 例えば、`Speed:`が想定通りの値となっているか？を確認する

```
出力例
Settings for em2:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	Supported pause frame use: No
	Supports auto-negotiation: Yes
	Advertised link modes:  10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	Advertised pause frame use: No
	Advertised auto-negotiation: Yes
	Speed: 1000Mb/s
	Duplex: Full
	Port: Twisted Pair
	PHYAD: 1
	Transceiver: internal
	Auto-negotiation: on
	MDI-X: off
	Supports Wake-on: g
	Wake-on: d
	Link detected: yes
```
Sourcetrail(Linux)で大きなPythonプロジェクト(Django)を開いてみたら世界が変わった

Sourcetrailなるツールが公開されたようで、面白そうなので触ってみました。
[すでに触ってらっしゃる記事](https://qiita.com/cloudsnow/items/7d7f3b859186667379ef)がありましたが、そこはご愛嬌で。
Ubuntuです。

使ったことがあって、ぱっと思いつく大きなリポジトリがDjangoだったので、Python, Djangoの組み合わせで試してみます。

## SourceTtrailをインストール

[Sourcetrail(GitHub)のリリースページ](https://github.com/CoatiSoftware/Sourcetrail/releases)からダウンロードできます。
64bit版Linuxのtarファイルをダウンロード

その後`tar -xzf Sourcetrail_2019_4_61_Linux_64bit.tar.gz -C path/`で任意の場所に解凍。
バージョン名は適宜。

回答したSourcetrailディレクトリに入り、root権限で`install.sh`を実行すればインストール完了です。

## とりあえず開く

こんな感じの画面が出てきます。

![Screenshot from 2019-11-22 19-28-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/cfed177d-d4be-e464-e098-836729a952f5.png)

## Djangoをプロジェクトとして開く

New Projectすると、以下の画面になるので普通に選択します。

![Screenshot from 2019-11-22 19-32-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/6739e3f7-3823-3005-46fc-fe0681858c4c.png)

### Source Group Typesを選ぶ

![Screenshot from 2019-11-22 19-36-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/e1e92e7e-5627-7732-86d3-43f7b5d58bd9.png)

Pythonは一つしかないからこれを選びましょう。
Pythonサポートはbeta phaseらしいので注意。

### 環境設定

![Screenshot from 2019-11-22 19-37-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/da7fb2c1-4eb6-f48b-7127-1e6d79dd5626.png)

DefaultのPythonは人によって色々違うので、適宜指定。

`Files & Directories to index`(indexするファイルとディレクトリ)で、`django/django/`、あるいは中身を確認したいディレクトリを指定しましょう。

次の画面を確認したらCreateしてみましょう。

## indexing

![Screenshot from 2019-11-22 20-00-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/12495c77-4474-2f7c-1226-d9c1ffa7c5d2.png)

こんな感じの画面が出てきたら次のステップです。
うまいことインデックスしてくれているようです。

830Filesもあるので時間がかかります。(私の環境だと40分くらいかかりました）
大規模開発でコードリーティングの手間を軽減するのが目的の一つらしいので、Djangoくらい大きいリポジトリでちゃんと使えるか見ておきたいところです。

![Screenshot from 2019-11-22 20-39-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/5fa1378b-b6c0-00e4-6bc3-09b9e066ed4e.png)

この画面が出たら完了！
65件のエラー詳細は見てません……

## 使ってみる！

![Screenshot from 2019-11-22 20-41-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/942ffe91-47bd-bf2b-a719-68f8d40749c6.png)

このように一覧で出てきます。

適当なClass(HttpResponse)を開くと関係が一覧で表示されます。
右側には該当するコード。

![Screenshot from 2019-11-22 21-00-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/10e78011-391f-5b19-e369-72dda44ffd5e.png)

この状態で、適当なFunction(HttpResponse内に表示されているserialize)を開くと、

![Screenshot from 2019-11-22 21-07-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140543/90882de6-b612-2ce7-ee1d-657325cbde22.png)

このような感じで開きます。
右側には、定義箇所と呼び出し箇所が表示されているようです。（ちゃんとdefが一番上）

## 触ってみて

これはコードリーディングがはかどりますね。
現在の対応言語は、C, C++, Java, Pythonだけですが、この言語を使用している方なら一度使ってみると良いと思います。
Vue-headで再度反映させる

備忘録ですが、
「vue-head」を使っていて、たとえば「再検索」などをした場合、
同じページの中で再描画して、動的にタイトルやメタタグを変えたい、という事があるかとおもいます。
（正確にはmetaタグも含めてVue-headをもう一度実行したいな〜という時）
そういう場合は、

```
 this.$emit('updateHead');
```
っていうのを追加してやります。
例えばこんな感じのソースがあるとして、

```
data () {
    return {
      title: 'sample',
    }
  },
head:{
  title: function () {
    return {
      inner: this.title;
    }
  },
},
```

axiosでdataを書き換えます。
そうするとデータは置き換わるけどheadの中身は変わってない状態ができます。

```
axios
  .get(
    apiserver
  )
  .then(response => {
    this.title = response.data.resource.data.title;
  })
  .catch(error => {
    window.alert(error);
  });
```
watchで監視して先程の一文を実行します。

```
watch: {
  'title':function(){
    this.$emit('updateHead');
  },
},
```
反映されます。


##子コンポーネントから書き換える場合
コンポーネントが細かく分かれている場合があると思います。

`Page.vue` の中の `Layout.vue` の中の `Navi.vue` の中のボタンで `axios` を実行したりする場合、
`Page.vue` のタイトルを書き換えたいんだけど、値は子の子の中にあったりします。
そういう場合は・・・

```
this.$parent.$parent.title = this.hogehoge;
this.$parent.$parent.$emit('updateHead');
```

これで動くと思います。「なんだこのアホみたいな書き方は・・・」
って思うんですけどまあ…動くし、許して下さい。

##このやり方って、使い所が微妙・・・

親コンポーネントに値を送った時点で、
親コンポーネント内で `title` を `watch` で監視しておいたほうがスマートだと
ここまで書いて、思いました。

`Vuex` の `$store` を `watch` するために、
`computed` で `$store.state.title` を `getters` で呼び出して、それを監視するという
のはちょっと面倒くさい。

そういう時は`@click` にまとめて書いておけばいいかなと。

```
<template>
  <button
    @click="refresh()"
  >
  ボタン
  </button>
</template>
```

```
methods:{
  refresh: function(){
    this.$store.dispatch('getMetaTitle');
    this.$parent.$parent.$emit('updateHead');
  },
},
```
そういう「全部書き換えは面倒くさいな」って時とか、しか使えません。以上です。
[linux]tarとか.tar.gzってなんぞや(ファイルの圧縮・解凍)

#はじめに
linux生活を送る中で、hoge.tarとかhoge.tar.gzとか知らないものが出てきたので一度調べて簡単にメモします。
ざっくり知りたい方用だと思ってください。

参考↓
[[Linux]ファイルの圧縮、解凍方法](]())
[圧縮展開系のコマンドのまとめ](https://qiita.com/wnoguchi/items/cb0fa7c11b119e96f1e5)
[tarファイルとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](tarファイル)
[tar コマンド](https://hydrocul.github.io/wiki/commands/tar.html)
#.tarとか.tar.gzってなんぞや
.tarはアーカイブファイル、 .tar.gzは圧縮ファイル。
要するにある程度サイズが大きいファイルを送受信する場合、掛かる時間や使用するメモリ量をカットためにファイルを圧縮したい時ってあると思うんですけど、そういう状況で出てくる奴らです。
linuxにおいてファイル圧縮によく使われる方法が 
1.tarコマンドでアーカイブ化(送信したいファイルを1つのファイルにまとめる) | a.txt b.png c/など複数のファイル(ディレクトリもOK)をまとめた hoge.tar を作成
2.gzipで.tarファイルを圧縮 | hoge.tarをhoge.tar.gzに変換
(らしい)ので多く目にすると思います。
圧縮法は他にも沢山あって、用途に応じて使い分けることになります。
他の圧縮法の参考↓
[tar/zipコマンドで解凍・圧縮一覧まとめ（gz、zip、tar.xzなど）](https://uguisu.skr.jp/Windows/tar.html)
[圧縮展開系のコマンドのまとめ](https://qiita.com/wnoguchi/items/cb0fa7c11b119e96f1e5)
#コマンド(今回はtarとgzipだけ)
##tar
-アーカイブ化 | tar -option アーカイブファイル名　アーカイブしたい色んなファイルやディレクトリ
tar -cvf hoge.tar a.txt b.png directory etc..
 ->hoge.tarが生成
-アーカイブファイルをバラす | tar -option アーカイブfile名
tar -xvf hoge.tar
 ->a.txt b.png directory etc..が展開される
###オプション解説
-c : 新しくアーカイブファイルを作成する(create)
-v : アーカイブ処理中のファイル名を表示(verbose)
-f : アーカイブファイル名を指定(filename)
-x : アーカイブファイルを展開(extractのx)
後ででてくる↓
-z : gzipでの圧縮と展開を同時に行う
##gzip
-圧縮 | gzip 圧縮したいファイル
gzip hoge
 -> hoge が hoge.gz に圧縮 (hoge.tarを圧縮するとhoge.tar.gz)
-解凍　| gzip 解凍したい圧縮ファイル
gunzip hoge.gz
 -> hoge.gz が hoge に解凍
***
流れとしては、
アーカイブ化 => 圧縮 => 送受信 => 解凍 => アーカイブファイルをバラす
です。
これをそれぞれ以下のコマンドで行うことになります。
tar => gzip => ・・・ => gunzip => tar
が、実はtarコマンドで一気にアーカイブ化と圧縮(gzip形式)をできるらしいです。(昔は出来なかった)
どういうふうにするかというと
アーカイブ化するときのコマンドにオプションzを加えるだけ。

-アーカイブ化+圧縮
tar -zcvf hoge.tar.gz a.txt b.png directory etc ..
-解凍+アーカイブファイルをバラす
tar -zxvf hoge.tar.gz
#まとめ
断片的な内容になってる気がするので情報収集推奨です。
初めての投稿なんですが、Markdown記法書きやすいですね
Homebrewインストール時のPermissionエラーの解決策

## 事例
- homebrewインストール時に以下のエラーが発生
- 特定のディレクトリの権限がないため、インストールを実行できない状況
- 原因はMacのセキュリティ設定SIP（System Integrity Protection）
- 解決策はリカバリーモードからの設定変更
    - 参考資料：[初心者向け　MacでOperation not permittedの解決方法](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)

~~~
Error: Permission denied @ rb_sysopen - /private/tmp/github_api_headers20191122-3671-ig1yym
Error: Failure while executing; `/usr/local/bin/brew tap homebrew/core` exited with 1.
Failed during: /usr/local/bin/brew update --force
~~~

## 出典
[初心者向け　MacでOperation not permittedの解決方法](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)
bytes.Buffer.ReadFromとかでpanicが出る場合があるよ

# まとめ

[bytes.Buffer.ReadFrom()](https://golang.org/pkg/bytes/#Buffer.ReadFrom)にダメなio.Readerを渡すとerrorを握りつぶした上で `slice bounds out of range` のpanic が発生する場合がある。

[こちらが端的な例](https://goplay.space/#QkiAe-0wilZ)。

# 起きたこと

aws-sdk-goを使用して暗号化されたS3オブジェクトを読み込むときに `slice bounds out of range` のpanicが稀に発生する状況があった（継続中→[直りました](https://github.com/aws/aws-sdk-go/commit/53f33deee932edbe996e113b24f640b8b6918fd8)。中の人ありがとう）

# 考察

[aws-sdkの暗号化されたS3オブジェクトを読むための io.Reader](https://github.com/aws/aws-sdk-go/commit/4f03d8192e4604f036f0b102d2515ea7be940ae9#diff-299c13474919dc0943174ca68edfdc7fR94) は復号に失敗した場合に暗号文のほうのlengthを返すようなコードになっていた。
本来は引数の`data []byte`に書き込んだ長さを返すべきだし、書き込んでいないなら0を返すべきだった。
これは修正済み。

上記とは別の問題として、Goの[bytes.Bufferの実装](https://golang.org/src/bytes/buffer.go?s=9451:9501#L286)として、関数を呼び出した後エラーチェックしていないことと、返り値の長さチェックをしていないというのがある。

ただし、[io.Readerの定義](https://golang.org/pkg/io/#Reader)では、返り値は `0 <= n <= len(p)` でないといけない（pは引数の`[]byte`)ので、正しいといえば正しい。

しかしerrorが返ってくるパターンでも、正しくない値が返されてしまうと、errorを無視してしまうコードになっている。
golang的にはerrorをまず確認すべきじゃないかと思う。
（思ったのでPR出したけど、後方互換性に影響がありそうなので取り下げた）

なお `ioutils.ReadAll()` や `io.Copy()` でも同じ状態になる。
queueのjobをcancel、deleteしてもworkerで動いている処理は止まらない（２）

## 背景
前回記事より良い方法見つけた

- https://qiita.com/nakamumu/items/33fbca0b407aeec4112d

### ジョブを消す時にRedisClientにset
```python
from django_rq import get_queue
import os
import signal

q = get_queue()

job_id = ***
job = q.fetch_job(job_id)

job.connection.set(job.key + b':canceled', True, ex=30)
```

### 処理側で確認
```python
from rq import get_current_job

def 処理():
  job = get_current_job()
  for item in items:
    if job.connection.get(job.key + b':canceled'):
      break
```

## 参考
- https://stackoverflow.com/questions/55244729/python-rq-how-to-pass-information-from-the-caller-to-the-worker
日本語プログラミング言語「プロデル」でマルチスレッドをやる

## はじめに

プロデルにはマルチスレッドの機能があります。試します。

## 手法

足し算を1000万回×3回やらせます。シングルスレッドの場合と，マルチスレッドの場合で，実行時間の差を見ます。実行時間は，プログラムの最初と最後に起動時間を取得して計算します。それぞれ10回ずつ試し，平均を求めます。

## 実験

まずは，シングルスレッドで実行しました。

```プロデル
スタートは，起動時間。
えは，1。
かは，え。
10000000回繰り返す
	かは，か＋1。
繰り返し終わり
きは，え。
10000000回繰り返す
	きは，き＋1。
繰り返し終わり
くは，え。
10000000回繰り返す
	くは，く＋1。
繰り返し終わり
起動時間－スタートを報告。
```

次に，マルチスレッドで実行しました。

```プロデル
スタートは，起動時間。
あというスレッドを作る。
いというスレッドを作る。
うというスレッドを作る。
えは，1。
あで『かは，え。
10000000回繰り返す
	かは，か＋1。
繰り返し終わり
』を実行する。
いで『きは，え。
10000000回繰り返す
	きは，き＋1。
繰り返し終わり
』を実行する。
うで『くは，え。
10000000回繰り返す
	くは，く＋1。
繰り返し終わり
』を実行する。
あを待機する。
いを待機する。
うを待機する。
起動時間－スタートを報告。
```

なお，コンパイル済みコンソールアプリでは，匿名関数が使えないので，プロデルデザイナ上で試しています。CPUは，Xeon E3-1505M v5 @ 2.80GHzです。

## 結果

値はミリ秒です。

|回|シングルスレッド|マルチスレッド|
|---|---|---|
|1|11875|5234|
|2|11469|5266|
|3|11734|5906|
|4|13313|5219|
|5|11609|6000|
|6|11593|5188|
|7|11547|5985|
|8|13266|5234|
|9|12907|5828|
|10|11844|5297|

p値=$1.766 \times 10^{-12}$（Welchのt検定）


## 感想

行列の計算に時間がかかってしかたがないのですが，CUDAの使い方が分からないので，せめてマルチスレッドで計算したいなと思いました。
[Unity] VRIK(FinalIK)のInspectorの値をスクリプトから変更する

###やり方
スクリプトを作成し、using RootMotion.FinalIK;　を宣言します。
###例
例えば、自身にAddComponentしたVRIKを参照してIK全体のweightを変更する場合、以下のように記述します。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RootMotion.FinalIK;

public class IKChange : MonoBehaviour
{
    VRIK VRIKscript;//スクリプト

    void Start()
    {
        VRIKscript = gameObject.GetComponent<VRIK>();
        //weightの値変更
        VRIKscript.solver.IKPositionWeight = 0.5f;
    }
}
```

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378758/160e94a6-61ba-6444-9755-3d6b312b2d57.png)
できた！

###詳しく
Inspectorから操作できるVRIK(Script)のあれこれはnamespaceとして用意してあるため、宣言するだけで簡単に扱えます。扱える変数等は[公式のリファレンス](http://www.root-motion.com/finalikdox/html/page16.html)から。
IKのweightを徐々に小さくしていくことで、モーションデータからアニメーションのモーフィングができるはずです（試していません）。また、[VRMをランタイムで読み込んでVRIKをアタッチさせる](http://www.noshimemo.com/entry/2018/08/03/181149)なんてことも可能だそう。