OmniAICreator/Qiita-1.07M huggingface dataset:
[Vue]v-ifに特定のメソッドを連動させたい場合、v-onがとても手軽な件

# いきなりサンプル
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="riotam4" data-slug-hash="YoobLL" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="[Vue]v-ifのメソッドを連動させる">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/YoobLL/">
  [Vue]v-ifのメソッドを連動させる</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
## サンプルの使い方
入力欄に「b」「y」「r」のいずれかを入力したら、下の文字が非同期的に変わります。
「r」を入力した場合だけ、メソッドが発火してalertがでます。
# ポイント
当初は、dataのstateをwatchフックで監視して、変更のたびにif分岐させる必要があるかと考えていました。
しかし、サンプルの通り、v-ifのあるタグ内にそのまま`v-on="メソッド名"`とすれば、v-ifがtrueのときに勝手に発火してくれます。
# 最後に
v-ifとv-onの使い方として、あまりいい方法ではないのかもしれませんが、とりあえず方法との１つとして共有させて頂きます。
何かご意見等ありましたら、ご連絡いただけると嬉しいです。

最後まで、ありがとうございました。
findコマンド

`find`は様々な方法でファイル検索ができる。

`xargs`との併用に関しては別スレッド


```
$ find [directory] [検索方法] [検索正規表現]
```

ディレクトリは適当なものを。（現階層ならば`.`や`./*`など...）

検索正規表現に関しては、`*`使用時のみエラー発生することがあるので`""`で囲む。

```
#簡単なファイル名検索であればこれらでOK
$ find . -name "hoge*"
$ find ./* -name "*.rtf"
$ find /test -name "num"
```

大小文字区別のオプションに関しては`grep`と同じく`i`で対処だが`iname`と記述する点に注意

```
$ find /test -iname "HoGe*"
```

`find`コマンドで得た結果の一通りの情報を得る場合は`-ls`を末尾に追加

```
$ find /test -iname "HO*" -ls
```
これでアクセス権限等を含めた結果が得られる

```
64363231536 4 -rw-r--r-- 1 sf213471118 admin 32 7 16 17:06 ./hoge.rtf
```



ファイル名検索以外で使いそうなものは以下

```
#ファイルサイズで検索( 50>=size , 50<size)
$ find ./* -size +50
$ find ./* -size -50

#最新の変更日時で検索( 60<=min , 7>days)
$ find ./* -mmin +60
$ find ./* -mtime -7
```
pytest でパラメータを替えて生成したインスタンスのメソッドをテストしたい

# Overview

インスタンス生成時の引数と、期待する結果だけ指定すれば、テーブルドリブンテストが走るようにしたかった。

`@pytest.mark.parametrize` の `indirect` 引数に関数名を指定すると fixture のパラメータ化ができるらしいので、
テストのパラメータ化と合わせて、こんな感じ。

```py:test_sample.py
import pytest

class Sample:
    """これをテストしたい"""

    def __init__(self, val):
        self._val = val

    def m1(self):
        return self._val[:2]

    def m2(self):
        return self._val[2:7]

    def m3(self):
        return self._val[7:10]

    def f(self):
        return len(self._val) == 10


# テストするメソッドを unbound method で準備
methods = [
    Sample.m1,
    Sample.m2,
    Sample.m3,
    Sample.f,
]

@pytest.fixture
def actual(request):
    """ fixture のパラメータ化 """
    s = request.param
    that = Sample(s)
    # self を付与して unbound method を呼び出す
    return [ m(that) for m in methods ]


# テストのパラメータ化
@pytest.mark.parametrize('actual, expected', [
    # expected の並び順は methods を呼び出す順に合わせる必要がある
    ("1234567890",  ["12", "34567", "890", True]),
    ("0987654321",  ["09", "87654", "321", True]),
    ("11122233345", ["11", "12223", "334", False]),
], indirect=["actual"])
def test_sample(actual, expected):
    assert actual == expected
```

## 参考

https://pytest.readthedocs.io/en/2.8.7/parametrize.html
https://gist.github.com/yyyk-bp/30e1d5b9be4b2d00e4f072faa5a1ece8
3分でGitHubのSecurity Alertsの自動PR作成を有効化する

# 課題
GitHubのSecurity Alertsは大変ありがたい機能だが、頻繁に発生するので工数がかかる。自動化したい。
<img width="1106" alt="スクリーンショット 2019-07-14 12.55.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/935802ff-9ddb-ca51-2aa0-24e85606d84a.png">


# 対応
公式に自動PR作成までサポートしているのでそれを有効化するだけです(すごい)。
![tmp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/533a5e86-08ab-90c7-bc4b-c1704a38d4ac.gif)


## 自動PR作成
個々のSecurity Alertsの項目で、`Create automated security fix`を押してしばらく待っていると、自動PRが作成されます。
![create_pr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/c7430d4a-b8b5-258c-622d-1e2ef4ab48bd.gif)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/3cca21f8-7b79-c4ce-ee6d-c14de6a399a3.png)

# プライベートリポジトリ
プライベートリポジトリは、上記手順の先にプロジェクトの`Settings -> Data services`でGitHubにread権限を与える必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/fdd5548f-df2b-3205-d18d-502670dd6a28.png)



# メモ
- コスパよくセキュリティを高められるので何も考えずに有効化しておきましょう
- β版でどんどん改善されているようなのですぐに仕様が変わるかもしれません
- TODO:
    - Security Alertsを全部まとめた修正PRを作成することはできない?
    - ボタンを押さずとも勝手にPRを作ってもらえるようにできない?
コードレビューで見ているもの

# コードレビューで見ているもの
個人的にコードレビューする時に見ているポイントのまとめ

## 可読性
ここに関してはまず見ます。
ただ、ここに関しては誰でも大事だと思う点ですし、
語り始めるとそれだけで記事が終わってしまうので割愛します。

## 拡張性のある設計か
一応確認しますが、実はそんなに重要視していません。
直近で追加が予定されている機能すらカバーできないのは流石に指摘しますが、
基本はYAGNIなスタンスで見ています。

## テストで気づきにくいもののクリティカルな観点の指摘
個人的には、一番ここが大事ではないかと思っています。
開発者の手元とか、テスト環境では気づきにくいものの、
特殊な条件下や本番環境ではシステムを落としたりセキュリティ事故を起こすようなバグに関しては、
この段階で止めておくべきです。
具体的には、以下のような点は必ず確認します。

### マルチスレッド時限定の不具合
無限ループを引き起こしてシステムを落とす、別ユーザーの情報が見えてしまう、不整合データを作ってしまうと言ったクリティカルな不具合を引き起こすものの、ローカル開発時やユーザーの少ない評価環境では見落とされる可能性があります。
万が一見落とすと本当にまずいので、必ずここは確認するようにしています。

* スレッドセーフではないクラスをマルチスレッドでアクセスされる場所で利用していないか？
* 複数スレッドで共有されるオブジェクトを間違えてスレッドローカルかのように利用していないか？
* 排他制御は行っているか？
* デッドロックは起こらないか？

### 異常系の対応
正常系に比べ、軽視されがちですがここをしっかりしておかないとトラブル発生時にひどい目に遭います。

#### 調査用のログはきちんと出るか？
例外を投げたり、エラーログを出力する際に、調査に必要な情報は出しているかを見ます。
「データに不整合があります」、とか「エラーが発生しました」とかその程度しか出さないと、調査を行う際に手詰まりになってしまいます。
(追加でログを出す対応が必要になったり、レアな不具合だと再現待ちになってしまいます)
エラーを起こしたメソッドの引数だったりとか、不整合チェックに引っかかったならその値だったりとか、後から調査に必要な情報をログにきちんと出すべきです。
そして、ここをチェックするタイミングはコードレビューくらいしかありません。

#### 変な落ち方した場合に整合性取れる？
RDBだったらトランザクション管理できているか、他のDBの場合もきちんと対策考えられているか。
テストケースに観点として入れておくべきですが、テスト時に再現するのも難しい部分もある上に見落とすと非常に面倒なことになりがちなのできちんとチェックはしておくべきです。

### 大量データ時限定の問題は起こらないか？
大量のデータを抱えるのにもお金がかかるので、本番環境に比べて開発環境や評価環境はデータ量が少ないことが多いです。
よって、大量のデータに耐えうるコードになっていなくてもテストはすり抜けていまい、本番環境で爆発する可能性があります。
ここも個々の開発者がきちんと認識しておくべき点ではありますが、最後の砦として見落とさないように重点的に見ます。

#### クエリは帰ってくるか？
主にRDBの場合ですが、クエリの計算量のパターンと対象となるテーブルの想定レコード数は確認します。
多くても百レコード程度の小さめのマスタテーブルなどでは計算量O(n ^2)のクエリを投げてもいいですが、
毎日増えるトランザクションテーブルに対しては計算量O(logn)以外は問題外です。ある日突然爆発します。

#### メモリを圧迫しないか？
メモリ上に展開するデータ量も運用期間に従って増えないかチェックする必要があります。
運用期間に比例してデータが増える場合、取得するデータ量に適切な制限を設けたり、一定量毎に区切って処理したりする工夫が必要です。
こちらも止めておかないとしばらくたって爆発する時限爆弾になり性質が悪いです。

#### 再帰ロジックは深くなりすぎないか
前の二つに比べれば稀ですが、再帰ロジックの深さがデータ量に依存するようなコードを世に出してしまうと非常にまずいです。
再帰は基本的に怖いのでチェックはすると思いますが、念のため必ず見ておくべきです。

## まとめ
* コードレビューでは可読性だけではなく、テストでは見落とされやすいやばい奴らを止めることも大事。
Progate HTML/CSS 初級編①

<h1>はじめに</h1>
未来電子テクノロジー（https://www.miraidenshi-tech.jp/intern-content/program/）
で、インターンをしているたくみです。
今回は先日取り組んだ　Progate HTML/CSSの初級編の一部をまとめてみました。

<h1> HTML要素</h1>

####＊ 見出しの作り方
見出しを作りたいときには以下のように記述する。

```php
<h1>________</h1>
```
見出しの大きさを変更したいときは"h"の後の数字を変える。

```php
<h1>________</h1>
<h2>________</h2>
<h3>________</h3>
```

####＊ リンク設定
リンク設定をしたいときには以下のように記述する。

```php
<a>________</a>

```

リンクを指定したいときは"a"の後に以下の記述を加える。

```php
<a href="リンク名">________</a>

```

####＊ 段落設定　

段落設定は以下のように記述する。

```php
<p>________</p>

```

####＊ 画像の挿入

画像の挿入は以下のように記述する。

```php
<img src="画像のリンク">


```

####＊ リストの作成
リストの作成をしたいときには以下のように記述する。

```php
<ul>
  <li>_______</li>
  <li>_______</li>
</ul>

```
<h1>おわりに</h1>
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
レポート（深層学習ー２）

＜後編１＞
Section1：再帰型ニューラルネットワークの概念
・再帰型ニューラルネットワークとは、自然言語処理等のように、時間的に順序を追って流れているデータを、一定間隔に区切って統計的処理を行う、時系列データに対応可能なニューラルネットワークである。
・RNN(Recursive Neural Network)と呼ばれる再帰型ネットワークでは、ある出力層を別のネットワークの入力値として利用する場合がある。また、隠れ層が隠れ層自身に接続して、セルの中を繰り返し次の入力値となる。つまり、ある時点での入力が、その後のネットワークの出力に影響を及ぼすことを繰り返し行うということである。
・BPTTとは、RNNにおける誤差を、時間軸を使ってさかのぼって伝播させていくことを誤差逆伝播法(BackPropagation Through Time)という。これまでのニューラルネットワークでの誤差関数は、二乗誤差等の方法であったが、RNNでは、時間軸に沿っているため、時刻tでの誤差は時刻t-1での誤差を考える必要があり、時刻t-1での誤差は、さらに時刻t-2での誤差を考える必要がある。このように誤差が時間遡って伝播していく。これが誤差逆伝播法(BPTT)である。

Section2：LSTM
・RNNでは、誤算関数を最小化するために時系列に遡っていくが、それに伴い勾配消失問題が発生する課題があった。また、時系列データを常に保持していくため、膨大なメモリーが必要であった。そこで、中間層にLSTM(Long Short Term Memory)のブロックを設置し、入力層の情報を、入力・忘却・出力の３つのゲートで制御するようにしたものである。
・CEC：勾配消失問題を解決する方法で、過去のデータを保存するためのユニット
・入力ゲート、出力ゲート：１つ前の時間のユニット、１つ後のユニット
・忘却ゲート：過去の情報が必要になくなった時点で、CECから削除する
・覗き穴結合：CECに存在する情報の重み情報をつけて伝播させる構造

Section3：GRU
・LSTMを実装した場合、パラメータが多く存在し、過去のデータを保管することなど、計算負荷が増大する問題があった。GRUは、これらの問題を解決し、パラメータを削減し、計算精度を大幅に解消させる構造である。

Section4：双方向RNN
・過去の情報だけでなく、未来の情報も加味してニューラルネットワークの重み付けを最適化していく構造である。文章の推敲や機械翻訳等に利用される。

Section5：Seq2Seq
・Encoder RNN：ユーザーが入力したテキストデータを単語等のトークンで区切る。そのトークンを表す分散表現ベクトルに変換し、順番にＲＮＮに入力する。
・Decoder RNN：EncoderRNNの各トークンの生成確率を出力し、中間層への次の入力とする。これを繰り返して、トークンを文字列にする。
・HRED：Seq2Seqでは、一問一答の対応しかできないが、過去のn-1までの回答から、n番目の回答を推測するようにした構造。
・VHRED：HREDの問題点である、会話の流れのような多様性な対応ができない点、文章が短い対応しかできない点を解消させたものがVHREDである。
・VAE
　・オートエンコーダー：教師なし学習の１つであるため、訓練データはあるが、教師データはない。
　　　　　　　　　　　　　　　入力データから潜在変数Zに変換するニューラルネットワークを
　　　　　　　　　　　　　　　Encoder、逆に潜在変数Zを入力として元画像を復元するニューラルネッ
　　　　　　　　　　　　　　　トワークをDecoder。つまり、入力画像と同じ画像を出力させるニューラル
　　　　　　　　　　　　　　　ネットワークである。そこで、潜在変数Zが入力層より小さい場合、次元削
　　　　　　　　　　　　　　　減が行われるというメリットがある。
　・VAE：潜在変数Zに、確率分布N(0,1)を仮定したものである。
HREDにVAEの潜在変数の概念追加させたものをVHREDとみなすことができる。

Section6：Word2vec
・RNNでは、単語のような可変長の文字列データをニューラルネットワークで扱えないため、固定長形式に変換する必要がある。
・学習データから、文章の中にあるボキャブラリを作成する。各ボキャブラリを次元として、one-hotベクトルの入力データを作成する。
・ボキャブラリ数と単語ベクトルの次元数の重み行列を計算することによって、現実的な計算速度とメモリ量で達成することが可能となる。

Section7：Attention Mechanism
・Seq2seqでは、長い文章への対応が難しい課題がある。なぜなら、処理すべき単語が多くても、すべて固定次元ベクトルの中に入力しなければならず、文章が長くなると、次元の数も多くなる。
・これを解消するために、入力と出力のどの単語が関連性があるかを学習する仕組みをAttention Mechanismという。


＜後編２＞

Section2：強化学習
・強化学習とは、エージェント（行動主体）が環境の状況に基づき、ある行動を選択し、その行動に基づき環境が変化する。環境の変化に伴って、何等かの報酬がエージェントに与えられ、より多くの報酬が得られるよう、エージェントが行動を選択、学習していくことをいう。
・環境について事前に完璧に把握していれば、最適な行動を予測し、実施することが可能である。しかし強化学習の場合、不完全な情報、知識を元に行動し、その行動と行動した後の結果をデータ収集して学習し、最適な行動を見つけていく。
・エージェントが環境に対して行った行動を「方策関数」といい、行動後の環境から得られた報酬を「行動価値関数」という。
・方策関数は、ある環境状態の中で、どのような行動をとるかの確率を与える関数である。
・行動価値関数は、状態価値関数と行動価値関数の２種類あり、前者はある状態にあることの価値を示し、後者はある状態にいて行動をとる価値を示す。
・方策反復法では、方策をモデル化して最適化する手法である。その方策の良し悪しを定義する方法として、平均報酬と割引報酬和がある。
VMware Workstation > SSDの空き容量が減る > 対処: VMwareDnDにあるファイルを消す

```txt:動作環境
VMware(R) Workstation 15 Pro
ゲストOS: Windows 8.1 Pro
```

### Cドライブの空き容量が少ない

ゲストOSにてCドライブの空きが5GBとなっていた。
Cドライブにはそもそもデータは置いていないのだが。

[FileSum](https://www.vector.co.jp/soft/winnt/util/se513257.html)を使って使用サイズを確認したところ、VMNwareDnDというフォルダの容量が8GBを占めていた。

### VMwareDnD

エクスプローラだと以下のパスで開くフォルダ。

```
%TEMP%\vmware-%USERNAME%\VMwareDnD
```

- [VMware Player で仮想環境へファイルコピーした際の一時領域の場所](https://www.projectgroup.info/tips/VMware/comm_0001.html) by ProjectGroup さん
- [【VMware Player 2.5.1】　不意にCドライブの容量不足の警告が出た（原因と対策）](https://blog.goo.ne.jp/_fishbone/e/69ca1d68b1b41a8ee8eaadeebfc3b51f) by しろねこ＠有希（Yuki）さん

情報感謝です。

VMwareがコピペ時に作るフォルダのようです。

消せるものは全部消して空き容量は16GBになりました。

8GBでなく11GB増えた。
:thinking: 

FileSumで見えないファイルも消せたのかもしれない。
(まあいい）
Raspberry Pi (Raspbian Buster) にDockerをインストールする 

### 0. 参考文献
##### 正式手順書
 https://docs.docker.com/install/linux/docker-ce/debian/ の「Install from a package」

##### その他参考: Proxy環境でのいろいろ

[proxyを設定する](https://qiita.com/sachioksg/items/289e40d69382b1d09811#linux%E3%81%A7proxy%E8%AA%8D%E8%A8%BC%E3%82%92%E7%AA%81%E7%A0%B4%E3%81%99%E3%82%8B)
[sudo でも効かせる](http://neos21.hatenablog.com/entry/2018/09/07/080000)
[DockerfileのFROMに効かせる設定](https://docs.docker.com/config/daemon/systemd/#httphttps-proxy)
[Dockerfile内のコマンドに効かせる](https://qiita.com/charon/items/d8365d610343d64d598e)

### 1. 環境
HW: Raspberry Pi 4
OS: Raspbian Buster Lite (2019-07-10)

### ２. debファイル群のダウンロード

https://download.docker.com/linux/debian/dists/ を開き、
[buster -> pool -> stable -> armhf] (https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/
) とたどる


最新版（リリース日: 2019-06-27 19:28:10）だとうまく動かない現象があったので、
リリース日: 2019-03-28 05:03:09で揃えてダウンロードしてみる


以下をダウンロード
[containerd.io_1.2.5-1_armhf.deb](https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/containerd.io_1.2.5-1_armhf.deb) (2019-03-28 05:03:09)
[docker-ce-cli_18.09.4~3-0~debian-buster_armhf.deb](https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce-cli_18.09.4~3-0~debian-buster_armhf.deb) (2019-03-28 05:03:09)
[docker-ce_18.09.4~3-0~debian-buster_armhf.deb](https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce_18.09.4~3-0~debian-buster_armhf.deb) (2019-03-28 05:03:09)

### ３. インストール
以下の順番でインストール(最初と2番目は順番関係なし。最後は必ず最後)
```$ sudo dpkg -i containerd.io_1.2.5-1_armhf.deb ```
↓
```$ sudo dpkg -i docker-ce-cli_18.09.4~3-0~debian-buster_armhf.deb ```
↓
```$ sudo dpkg -i docker-ce_18.09.4~3-0~debian-buster_armhf.deb ```


### 4. 確認

「"docker --version"は動いた」、「"docker ps"は動かない」なんてことがあるので、両方試す。

```
$ sudo docker --version  
Docker version 18.09.4, build d14af54
$ sudo docker ps  
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

以上
grepコマンド

#grep
`grep` は特定の文字列を含むファイルの検索ができる。

`xargs`との併用に関しては別スレッド。

```
$ grep [検索正規表現] [option] [directory] 
```
[検索正規表現] [option]については順不同。

ディレクトリは、例えば現階層のファイル全てから検索であれば`./*`で検索。

オプションは主に使うものだけ以下にメモ

```
#大文字と小文字を区別せず検索
$ grep [検索正規表現] -i [directory] 

#一致しないものを検索
$ grep [検索正規表現] -v [directory] 

#行番号と併せて表示
$ grep [検索正規表現] -n [directory] 

#ファイル名のみ表示
$ grep [検索正規表現] -l [directory] 

#ディレクトリ内も検索に含める
$ grep [検索正規表現] -r [directory] 
```
httpsのリダイレクト（S3+CloudFront+Route53）

#概要と注意#
wwEBサイトの引越しの時などに、Route53+S3でS3の静的Webサイトホスティング機能を使うと便利。
しかし、httpsをリダイレクトしたい場合、S3単体ではSSL証明書を扱うことができないため、CloudFront経由で行う。

S3 Static Website hostingで全てのリクエストをリダイレクトするように設定する。
↓
AWS Certificate Managerで証明書を作る。
↓
CloudFrontのDistributionを作りOriginにS3 Static Website hostingのエンドポイントと証明書を設定する。
↓
Route53にS3が向くようにAレコードをを追加する。

※バージニア北部で作成してください！！！CloudFront に SSL Certificate が東京リージョンを指定できないため。


#1.ドメインを登録し、Route53のNSレコードを登録する#
[AWS Certificate Manager - ELB(+ACM発行証明書)→EC2](https://qiita.com/leomaro7/items/bdfbfd163b31df872252)の1-3を参考に設定する。


#2.ACM から SSL/TLS 証明書を取得する#
[AWS Certificate Manager - ELB(+ACM発行証明書)→EC2](https://qiita.com/leomaro7/items/bdfbfd163b31df872252)の4を参考に証明書を取得する。


#3.S3 バケットを作成し、リクエストを別のドメイン名にリダイレクトするようにバケットを設定する#
「エンドポイント」は後で使います。
「リクエストをダイレクトする」にし、**リクエストをリダイレクトする先のドメイン (oldexample.com) ** の名前を入力します。
プロトコルは「https」のみにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7f96c91a-90cc-1933-2873-cc02ff083bf5.png)


#4.CloudFront ディストリビューションを作成または更新する#
 Origin Domain Name：「3.S3 バケットを作成し、リクエストを別のドメイン名にリダイレクトするようにバケットを設定する」のStatic Website hostingのエンドポイントを入力
 Viewer Protocol Policy：HTTP and HTTPS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b2278f97-47d5-a13d-7273-61e04fe81cc3.png)

 Alternate Domain Names(CNAMEs)：ユーザーがコンテンツにアクセスするために使用するリダイレクト元(newexample.com)を入力する。
 SSL Certificate:Custom SSL Certificate にし、「#2.ACM から SSL/TLS 証明書を取得する」で取得したACMを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5e9e1fa7-fd18-3c0d-05bd-2ab1ea4f05bf.png)


#5.CloudFront ディストリビューションにトラフィックをルーティングする Route 53 レコードを作成する#
 タイプ: A - IPv4 address
 エイリアス:はい
 エイリアス先: CloudFront ディストリビューション
 ルーティングポリシー:シンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d5c2729b-d0ec-b6c7-7a78-18a30dcde841.png)
CloudFrontのStatusがDeployedになるまで30分ほどかかるため、エイリアス先に表示されるのに時間がかかります。
ほかに表示がされない場合は、[Route 53 エイリアスリソースレコードセットを作成する際に目的のエイリアス先が選択できないのはなぜですか?
](https://aws.amazon.com/jp/premiumsupport/knowledge-center/route-53-no-targets/)を参照しましょう。


#6.テストする#
どちらの場合も、DNS クエリをリダイレクトする先のドメインのコンテンツが表示されるか確認しましょう。
CodeceptionのE2EテストでseeInSourceはなるべく使わない方が良い件

# 背景

Codeceptionで要素を見るために`seeInSource`を使っていたら、ローカルでは通ってもサーバー上では全て落ちていた。

## 原因

ローカル上のE2Eテストとサーバー上でのE2Eテストで出力されるHTMLが異なる場合があった。
具体的にはサーバー上ではタグに勝手に閉じタグ`< />`が付くなど。

```php
$I->seeInSource('<meta property="og:title" content="hogehoge">');
```

とテストコードを書いても

```html
<meta property="og:title" content="hogehoge" />
```

サーバー上では的な具合でHTMLが出力されてしまう。

## 対処法

`seeInSource`をなるべく使わないこと。
上記の例では`seeElementInDOM`を使う。

例

```php
$I->seeElementInDOM('meta[property="og:title"][content="hogehoge"]');
```

## 参考

[How to test with Codeception if the page has meta-tag?](https://stackoverflow.com/questions/48711657/how-to-test-with-codeception-if-the-page-has-meta-tag)
unityでshaderに動的に数値を設定しても動かなかった話

#先に結論
materialがinstanceされてて
数値指定は非instanceのマテリアルに当たってた。

#症状
・unityからuniformでshaderにsetfloatで数値を渡していた
・挙動が切り替わる変数と切り替わらない変数があった
・getfloatで数値が切り替わってることは確認していた

#原因（ポカ）
・数値を切り替えるスクリプトが複数あり、
　起動後にマテリアルを取得するものと、手動でアタッチしているものがあった。
　前者はうまく動き、後者がうまく行っていなかった
・glslだったため、実機でテストしていてinstance化に気付いていなかった

#対応
・スタートでマテリアルを取得するようにした
SQLのクロス結合

前回、クロス結合について記載するのを忘れてしまっていたので補足しておきます。
そんなに頻繁に使うような結合ではないのですが、ちょっとややこしいので一応。

まず、下記のように科目テーブルと成績テーブルを用意します。

|name| 
|:-----|
|国語   |
|算数   |
|英語   |

|result| 
|:-----|
|合格   |
|不合格 |

これをCROSS JOINを使ってクロス結合すると、下記のようになります。
例：SELECT * FROM 科目テーブル CROSS JOIN 成績テーブル;

|name| result| 
|:-----|:-----|
|国語   |合格   |
|国語   |不合格 |
|算数   |合格   |
|算数   |不合格 |
|英語   |合格   |
|英語   |不合格 |

このように、科目テーブルと成績テーブルのすべての組み合わせが出力されます。
また、クロス結合を応用すると、順列と組み合わせを取得することが出来ます。
例：SELECT * FROM 科目テーブル T1 CROSS JOIN 科目テーブル T2 WHERE T1.name <> T2.name;

|name|name|
|:-----|:-----|
|国語   |算数   |
|国語   |英語   |
|算数   |国語   |
|算数   |英語   |
|英語   |国語   |
|英語   |算数   |

例：SELECT * FROM 科目テーブル T1 CROSS JOIN 科目テーブル T2 WHERE T1.name < T2.name;

|name|name|
|:-----|:-----|
|国語   |算数   |
|国語   |英語   |
|算数   |英語   |
PowershellからChromで任意のサイトを表示する

## したいこと
1. PowershellからChromを起動
2. Yahoo!Japanのトップページに飛ぶ
 
但し、実行ポリシーを一時的に変更して実行したい

## 使用するコマンド
|コマンドレット|実行内容|
|:--|--:|
|Start|アプリケーションを起動|
|ExecutionPolicy|実行ポリシーを設定|

## プロセス
1. 実行プログラムをpowershellで作成する
2. 1.のプログラムを指定して一時的に実行できるようにするためバッチを作ってPowershellを実行する

**psサンプル**

```powershell

#Chromのパス
$path = "C:\Program Files\Google\Chrome\Application\chrome.exe"
#リンク先
$url = "https://yahoo.co.jp"

start $path $url
```

**batサンプル**

```
powershell -ExecutionPolicy Unrestricted C:\Users\xxx\Desktop\GoYahoo.ps1
```
temp_dataset_beam_job_*なデータセットを一気に消すワンライナー

https://github.com/GoogleCloudPlatform/DataflowJavaSDK/issues/609

GCPでDataflowを使っているとできてしまうゴミデータセット。以下のコマンドで一気に消せる。

```sh
bq ls | grep "temp_dataset_beam_job_*" | xargs -p -n 1 -t bq rm --force --dataset
```
Firebaseを用いてAndroidAppに通知を実装する際の悩み

#実装する際に具体的な動作が分からなかったコードを読み解いてみる

        FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener((task) -> {
            if(!task.isSuccessful()){
                Log.w("FIREBASE", "getInstanceId failed.", task.getException());
                return;
            }

            String token = (task.getResult() == null) ? "empty" : task.getResult().getToken();
            Log.i("FIREBASE", "[CALLBACK] Token = " + token);
        });

#FirebaseInstanceIdクラスについて
public class FirebaseInstanceId extends Object
オブジェクト型を継承しているクラス
公式の解説によれば
各アプリケーションインスタンスの一意の識別子と、アクションを認証および承認するためのメカニズム（例：FCMメッセージの送信）を提供してくれるらしい

インスタンスIDは以下の場合に失われる可能性があるため注意するべし

1.アプリがインスタンスIDを削除する
2.アプリが新しいデバイスに復元されました　　←　可能性としてはこれが高そう
3.ユーザーがアプリをアンインストール/再インストールする　 ←　可能性としてはこれが高そう
4ユーザーがアプリデータを消去する

インスタンスIDの所有権を証明し、サーバーがアプリに関連付けられているデータまたはサービスにアクセスできるようにするには、getToken（String、String）を呼び出します。ということなので通知を行う際は使うんだろうな．．．
後で詳しく見ていきましょう

#getInstance()メソッド
Firebaseアプリのインスタンスを返すメソッド

返り値　FirebaseInstanceId instance.


#getInstanceId()メソッド
このFirebaseプロジェクトのIDと自動的に生成されたトークンを返すメソッド
インスタンスIDが存在しない場合は、インスタンスIDが生成され、
定期的にFirebaseバックエンドに情報が送信されます。


返り値　Taskクラス　IDとトークンを保持するInstanceIdResultを介して結果を見るために使用できるタスク。
引数　なし

#addOnCompleteLister(OnCompleteListener<TResult> listener) インターフェース
タスクの完了時に呼び出されるリスナーを追加します。

返り値　this Task

#OnCompleteListenerインターフェース
タスクの完了時に呼び出されるリスナーを追加します。
またタスク完了時にOncompleteメソッドを呼び出します
abstract void　onComplete(Task<TResult> task)

#λ式
単一の抽象メソッドを持つインターフェースのインスタンスを生成して受け渡す
今回は上記のOnCompleteListerのインスタンスを生成して渡しているようです
つまりaddOncompleteListener((task) -> .....)を書き換えると

以下のようにOnComleteListerインターフェースを実装したクラスを作成します

        public class XXXXX implements OnCompleteListener<InstanceIdResult>{
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task){
            if(!task.isSuccessful()){
                Log.w("FIREBASE", "getInstanceId failed.", task.getException());
                return;
            }

            String token = (task.getResult() == null) ? "empty" : task.getResult().getToken();
            Log.i("FIREBASE", "[CALLBACK] Token = " + token);
            }
        }
addOncompleteListener(new XXXXX());
とすればOKです＾＾

#結果
上手く通知送れました(笑)

#注意
この記事は個人的に分からなかったことを整理するために書いているため、同じところで詰まった方の参考になれば幸いです。
まぁ、知らないままでも丸写しすればいいんですけどね(笑)
ちなみに、Java8を使用している人はλ式使えるのでこのまとめ本当に意味ない...
.NET Core上で実数演算すると結果がズレる

# TL;DR

.NET Core(2.2)上で倍精度浮動小数点を使った演算を行うと、同じ順序で計算させても環境によって計算結果がズレるから、比較するときとか注意すべきではないかと考える[^3]。



## 実際やったこと

実行したテストの内容は以下の通り

1. `[-90°,+90°]`の区間を1°につき128分割してその弧度を計算した。
2. 予め計算されている上記に対応した弧度を元にして、`sin`,`cos`,`tan`及び、`sin/cos`を標準の`System.Math`を使い計算した。



## 弧度の計算方法

弧度の計算は、以下の二種類を利用した。以下、対応するDegreesをdとする。

1. 単純に`d*(Math.Pi/180)`を計算させた。
2. [jglm](https://github.com/jroyalty/jglm/blob/master/src/main/java/com/hackoeur/jglm/support/FastMath.java#L2983)を参考に倍精度浮動小数点の上位32bitを分割した上で、仮数域を拡張して、高精度計算を行った[^2]。



## 実行環境一覧

今回も多数のご協力を得る事が出来た。
また、この検証を進めるに当たり、多くの方から資料の提示や、アドバイスを頂くことが出来た。
この場を借りてお礼申し上げます。


テストした実行環境は以下の通りとなる。



![test_env](https://i.imgur.com/OEe8KWb.png)



# 計算させた結果に関する考察

さて、実際計算させた結果、割と面白い結果になった。

この先示す図表で、`○`は差異が出なかったことを示し、`×`は差異が存在したことを示している。



### Windowsの場合

Windowsは唯一.NET Coreの32bit環境が存在する。そこで、32bit環境と、64bit環境を各々で比較してみたところ、以下のようになった。

### 32bit Process windows

実行結果は以下の通り。

![32Win](https://i.imgur.com/Kb4LOV2.png)



上記結果のように32bit版Windowsでは環境によって今回差異が出なかった。

これは恐らく、浮動小数点演算をx87 FPUで行っており、三角関数は各々、`fsin`、`fcos`を使って演算していたので、差異が出なかった者と考えられる。

但し、主にAMDとIntelで歴史的な経緯により実装に差異があるとのことだったので[^1]、他の計算を行った場合、差異が出てくる可能性があるかも知れない。



### 64bit Process Windowsの場合

実行結果は以下の通り

![64Win](https://i.imgur.com/q3qbHNy.png)



64bit ProcessのWindowsの場合、

`FMA3`命令を持っているか否かで計算結果に差異が出てくる結果となる。

`FMA3`の有無で差異が出るのは、[[FMA (Fused Multiply-Add) について色んな観点でまとめてみた](http://math-koshimizu.hatenablog.jp/entry/2017/08/06/151212)]によれば、丸めの回数が減るので、結果計算結果に差異が出たのではないかと予想される。


## macOSの場合

macOSの場合は以下のようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9662/0ff04d84-a680-b843-9198-ad23f133d676.png)



上記結果のように、CPUの差異で計算結果に差異が出るようなことはなかった。

但し、CPUが全てFMA3を持っているモデルなので、FMA3を持っていない場合でも、当該環境内における再現性が担保されるか否かは不明である。


## Linuxの場合

Linuxの場合以下のような結果になった。

![Linux](https://i.imgur.com/4qT5b8b.png)

上記の、`i7-3770k`と、`Ryzen 7 1700x`は、WSLのLinux(Ubuntu 18.4)であり、`Graviton`はAWS上のUbuntu on ARMインスタンスとなっている。

このように、Linuxで有ればアーキテクチャ、CPUの世代、実行環境によって計算結果に差異が出なかった。



又、Linux上のclang及びgccを使用して同一の計算を行った場合の結果を以下に示す。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9662/6e78b320-7841-d946-8cea-1b53fce11827.png)

このように、`clang`と、`gcc`を使った場合でも計算結果に差異が出なかったので、恐らく全てのパターンで標準のlibcを使っているのではないかと予想される。



## 各プラットフォーム間の検証

各プラットフォーム間の検証結果は以下の通りとなった。

![grp](https://i.imgur.com/CCI46P6.png)



このように、各環境間では全ての環境間で差異が出た。



# まとめ

[以前の検証](https://qiita.com/Tokeiya/items/ec591ffd29c9c7cfa76f)でILがASMに変換された結果を調査していたとき、X86とX64で実数計算をx86はFPU、x64はSIMDで行っていたので、差異が出たらちょっと面白そうだな程度で調べてみたのだが,中々どうして興味深い結果となった。

計算順序が同一であったとしても今回の検証により、実行環境の差異によって計算結果に差異を生じることがあり得ることがわかったので、異なる環境間で計算を行いその比較を行う際は、注意が必要では無いかと思う。





[^1]: [[Cross Platform Floating Point Consistency](https://stackoverflow.com/questions/20963419/cross-platform-floating-point-consistency)](https://stackoverflow.com/questions/20963419/cross-platform-floating-point-consistency)に、**Again, in case of the x87 instruction set, Intel and AMD have historically implemented things a little differently.**とあった。

[^2]: 今回のケースでのみ使うことを想定していたので、NaNとInfのチェックはしてたけど、非正規化数か否かのチェックは省いている。(実用性を考えるなら当然行うべきだと思う)

[^3]: とは言え、実用上問題となるほどズレるわけではなく、下何桁かに差異が出てくる形となる。
【ExcelVBA】セルに対するFor Eachの順番

# For Eachでセルを処理する
VBAのFor文は2種類あります。

1. 開始と終了のインデックスを指定する`For カウンタ変数 = 開始 To 終了`
2. 配列やリストの先頭～末尾までを処理する`For Each 要素の変数 In 配列やリスト`

インデックスを指定する必要がなければ、記述が簡潔になるので上記2.を推奨したいところです。
その`For Each`ループですが、ワークシート上のセルを処理する場合、知らないと「なんで？？」となる挙動があるのでまとめておきます。特に他言語やジャグ配列に馴染みがある人。
…行単位や列単位でループすることのほうが多いと思うので、あんまり必要のない知識かもしれませんが。

# サンプルデータ
`Range("A1:C2")`に対してデータを設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/5ce1b016-7abb-9c1b-343b-ad035df8d72d.png)


# サンプルプログラム
サンプルデータの範囲のセルの値を`For Each`で順番に「/」区切りで結合していき、`Debug.print`で結果をイミディエイトウィンドウに出力します。

```vb
' 処理対象の指定方法によってFor Eachの順番が違う
Sub TestOrder()
    Dim area As Range: Set area = Range("A1:C2")

    ' Rangeで読み込み
    Dim str As String: str = ""
    Dim cell As Variant: For Each cell In area
        str = str & IIf(Len(str) > 0, "/", "") & cell.Value
    Next
    Debug.Print "                     Range: " & str
    
    ' 二次元配列で読み込み
    str = ""
    For Each cell In area.Value
        str = str & IIf(Len(str) > 0, "/", "") & cell
    Next
    Debug.Print "          Multidimentional: " & str
    
    ' 配列をtranspose関数で行列を入れ替えるとRangeと同じ順番に
    str = ""
    For Each cell In WorksheetFunction.Transpose(area.Value)
        str = str & IIf(Len(str) > 0, "/", "") & cell
    Next
    Debug.Print "Transpose multidimentional: " & str
End Sub
```


# 実行結果
`For Each`でそのまま`Range`で指定した場合とサンプルデータの範囲を配列に格納してから指定した場合で、処理するセルの順番が変わります。
Rangeだと行単位、配列に格納した場合だと列単位になります。最初はびっくりする。

```
                     Range: 陸/海/空/梅/竹/松
          Multidimentional: 陸/梅/海/竹/空/松
Transpose multidimentional: 陸/海/空/梅/竹/松
```
配列に格納した場合は、`(1, 1)`、`(1, 2)`、`(1, 3)`…ではなく、`(1, 1)`、`(2, 1)`、`(1, 2)`…の順番で処理してるなんて、まさか夢にも思わなかったよ。
2次元配列は`For Each`で処理すると、1次元目×2次元目ではなく2次元目×1次元目なんですな…
多分3次元以上の配列も次元の大きい順で処理すると思う。確認してないけど。


# 配列の中身
セルをVariant型の配列に格納した場合、以下のように格納されます。
1次元目が行、2次元目が列の多次元配列です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/883989f3-0c73-2535-5983-9288146d5078.png)

上記の配列に対して縦横を変換するワークシート関数の`Transpose`を使うと以下のように変換されます。
2次元目×1次元目で処理するので、Rangeをそのまま指定したときと同じ順番になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/e0eb2271-2120-9293-4244-8b886fc43dcc.png)

---

感覚的には行×列の方がしっくりきます…
Cellsプロパティの引数も`Cells(行, 列)`だし、第1引数の行×第2引数の列の二重ループのが思い浮かびやすくないですか？

(他言語で)ジャグ配列を使い慣れていると、外側の小さい次元→内側の大きい次元のイメージになる気がするので、覚えとくといいかもです。
JavaでPOI使ってExcel弄るときなんか、getRowはあってもgetColumn的なのがないので、基本が行ベースの処理になりますし。(最新版は知らないけど)
VBAの多次元配列は`For Each`使わずに`For`で2重ループするほうがわかりやすいかも。
3.3V コントロール信号のモータドライバ


以下の掃除機を分解して、改造してみようと思います。

![IMG_20190624_115558.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ae7a2d01-e776-66d6-d19a-df776f7bca1c.jpeg)

内部には、DCモータが5つほどあります。これを、独自基板を使って動かそうと思います。

![IMG_20190716_111336.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8cc740d1-c040-97e8-700a-1ad888a221f3.jpeg)

これらの電源は、14.8Vとありますね。4セルということで、充電終わった直後は17Vぐらいまで上がっていることを想定します。

![IMG_20190716_111502 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0ea88925-59d6-f955-d5ba-bef0b91bee8b.jpeg)

これらに、ArduinoやRaspberryPiなどを接続するように考えると、モータードライバを搭載しなければいけません。

TA7281Pというモータドライバがあります。Arduino系のレクチャーでよく使われる東芝製のドライバです。
しかしながら、VCC（ロジック電源）= 4.5～20 V ということで、RaspberryPiなどの3.3Vコントロール信号には対応できません。


RaspberryPiに限らず、STM32やESP32などでは3.3Vで動かしたいですね。なので5V/3.3V両用のロジック信号で動作する、モータドライバを選定します。

要件として、

- ロジック電源 3.3V/5V 両用
- モータ電源 20V以上
- フルブリッジ（車輪は正転／逆転を行うため）
- 出力 1.5A 以上
- 安いもの（教材として使うため／本来はフルブリッジ使う必要無い掃き込みモーターと車輪モータのドライバを共通化したいため）

この要件に合うモータドライバはあるでしょうか？
入手性を考えて、まずは秋月電子にあるDCモータドライバから検討してみました。それらを抜粋、それぞれの問題点を挙げてみると

- TA7291P 150円 問題点:ロジック電源4.5V以上
- TB6643KQ 280円 問題点:フルブリッジではない
- TB6612FNG 130円 問題点:入力15Vまで
- BD6211F-E2 100円 問題点:入力７Vまで 出力１Aまで
- BD6231F-E2 180円 問題点:出力１Aまで

ということで、良さそうなのがありません。

ということで、秋月電子にこだわらずに探したところ、以下のものが見つかりました。


Texus IntsurlentsのDRV8871です。

http://www.ti.com/lit/ds/symlink/drv8871.pdf

- VIL Input logic low voltage 0.5 V
- VIH Input logic high voltage 1.5 V
- Wide 6.5-V to 45-V Operating Voltage
- 565-mΩ Typical RDS(on) (HS + LS)
- 3.6-A Peak Current Drive

ということで、基本的な性能は十分ぽいです。

金額も、

|数量|単価|金額|
|---|---|---|
|1	|273.00000	|¥273|
|10	|245.50000	|¥2,455|
|100	|197.33000	|¥19,733|
|500	|162.12600	|¥81,063|
|1,000	|134.33200	|¥134,332|

ということで、秋月電子にラインアップされているモータードライバとそう変わらない金額にできそうです。
CircleCIのdb:migrateで、mysqldump: Couldn't execute 'SHOW PACKAGE STATUS WHERE Db

2019/07/15ぐらいに、CircleCIのdockerイメージが、debian9 -> debian10に上がって都合で、`mysql-client`がインストール出来なかった人がいると思います。

https://yourmystar-engineer.hatenablog.jp/entry/2019/07/15/140644

私の場合、上記以外にもハマったので、備忘録として残しておきます。

### 事象
`db:migrate`で、以下のエラーが発生しました。

```
mysqldump: Couldn't execute 'SHOW PACKAGE STATUS WHERE Db = 'testdb'': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PACKAGE STATUS WHERE Db = 'testdb'' at line 1 (1064)
rake aborted!
failed to execute: `mysqldump`
Please check the output above for any errors and make sure that `mysqldump` is installed in your PATH and has proper permissions.

/home/circleci/fuga/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.0/lib/active_record/tasks/mysql_database_tasks.rb:105:in `run_cmd'
/home/circleci/fuga/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.0/lib/active_record/tasks/mysql_database_tasks.rb:57:in `structure_dump'
/home/circleci/fuga/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.0/lib/active_record/tasks/database_tasks.rb:228:in `structure_dump'
/home/circleci/fuga/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.0/lib/active_record/railties/databases.rake:287:in `block (3 levels) in <top (required)>'
/home/circleci/fuga/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.0/lib/active_record/railties/databases.rake:69:in `block (2 levels) in <top (required)>'
/home/circleci/fuga/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.0/lib/active_record/railties/databases.rake:61:in `block (2 levels) in <top (required)>'
/home/circleci/fuga/vendor/bundle/ruby/2.6.0/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => db:structure:dump
(See full trace by running task with --trace)
Exited with code 1
```

### 原因
dockerイメージでmysqlを使っていたのが原因でした。

```
docker:
  - image: circleci/ruby:2.6.3-node-browsers
  - image: circleci/mysql:5.7
  - image: redis:4.0.9-alpine
```

`default-mysql-client`を入れていたのですが、これは、mariadbのクライアントなので、DB側がmysqlだと、前述のエラーが出るようです。

何とか、debパッケージ入れて、mysqlクライアント入れたかったのですが、ダメでした。


とりあえず、このdockerイメージをmariadbを入れて回避

```
- image: circleci/mariadb:latest
```

debian10でMySQLを入れてくれるツワモノが現れるのを待ちます。
MacのPHP(Homebrew)でxdebug環境を用意する

## Macローカルでデバッグがしたい
Dockerで立てる程ではないものの確認を行いたい場合にいいと思ったので。
PHPのバージョンが同じであれば、Dockerコンテナでも同じ設定で行けそうです。
[Windowsはこちら](https://xdebug.org/download.php)

## 前提条件
```sh:console
% php -v
PHP 7.3.6 (cli) (built: Jun 17 2019 08:40:34) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.6, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.6, Copyright (c) 1999-2018, by Zend Technologies
```


## インストール
peclからインストールします。

```sh:console
% pecl install xdebug
# --- 中略 ---

# エラーが出る場合
% pecl search xdebug                                                                                                          [master]
Retrieving data...0%
Matched packages, channel pecl.php.net:
=======================================
Package Stable/(Latest)    Local
xdebug  2.8.0alpha1 (beta) 2.8.0alpha1 Provides functions for function traces and profiling

% pecl install -f xdebug-2.8.0alpha1

# 確認
% php -v
PHP 7.3.6 (cli) (built: Jun 17 2019 08:40:34) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.6, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.8.0alpha1, Copyright (c) 2002-2019, by Derick Rethans
    with Zend OPcache v7.3.6, Copyright (c) 1999-2018, by Zend Technologies
```

## おまけ: php.iniの場所
```sh:console
% php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php/7.3
Loaded Configuration File => /usr/local/etc/php/7.3/php.ini
```

あとは、PhpStormなどで設定するだけ。
オープンソース LWC のアプリを Heroku にデプロイしてみた

この記事ではオープンソース Lightning Web Components(LWC) で作成したアプリを Heroku にデプロイした際の手順を紹介しています。

##オープンソース Lightning Web Components
[オープンソース Lightning Web Components(LWC)](https://lwc.dev/) は、[Web Components](https://developer.mozilla.org/ja/docs/Web/Web_Components) の技術をコアとした UI フレームワークで、軽量且つ高速で動作するブラウザネイティブなアプリ開発を実現します。
LWC はこの他に、Salesforce の Lightning Platform 上で動作するアプリや Lightning コンポーネントを作成する [Lightning プラットフォーム LWC](https://developer.salesforce.com/docs/component-library/documentation/lwc) があります。

##環境
- オープンソース LWC を使った開発では、 Node.js と version 5.2 以上の npm が必要となるので、現在の環境を確認した上で必要に応じて更新します。

```bash
$ node -v
> v12.1.0

$ npm -v
> 6.9.0  // 5.2+ required
```

## プロジェクトの作成
プロジェクトを作成するフォルダを作って移動します。

```bash
$ mkdir ~/workspace
$ mkdir ~/workspace/lwc-oss
$ cd ~/workspace/lwc-oss
```

オープンソース LWC のプロジェクトを作成する方法はいくつかありますが、今回は `lwc-create-app` を利用します。
[lwc-create-app](https://github.com/muenzpraeger/lwc-create-app) は実行可能な npm パッケージとして提供されているオープンソースのツールです。
オープンソース LWC の開発に必要なツール群をインストールし、土台となるプロジェクトフォルダを作成してくれます。


```bash
$ npx lwc-create-app my-first-app

? Package name for npm my-first-app
? Description 
? Author hrk623
? Version 0.0.0
? License MIT
? Who is the GitHub owner of the repository (https://github.com/OWNER/repo) 
? What is the GitHub name of the repository (https://github.com/owner/REPO) my-first-app
? Select a package manager npm
? Register web component No
? Use custom Express server configuration No
```

オープンソース LWC で作成したアプリやコンポーネントは、 npm パッケージとして公開できます。
`lwc-create-app` を実行すると、npm パッケージ化する時に必要となる情報を聞いてきます。
今回は、パッケージ化をしないのでデフォルト値でプロジェクトを作成します。

出来上がったプロジェクトフォルダの構造を見てみると、SFDX プロジェクトとはかなり違うのが分かります。
初期状態では、名前空間 `my` の下に `app` と `greeting` というコンポーネントが作成されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/f298b90c-b7a1-70f9-e85a-ae21a4eafbe0.png" width="460"/>

##ローカルサーバーで実行
ローカル環境で実行するには、プロジェクトフォルダで以下のコマンドを実行します。
localhost とポート番号が出力されるので、ブラウザで開きます。

```bash
$ cd my-first-app
$ npm run watch
> Local server listening: http://0.0.0.0:3001
```

- こんな感じで表示されれば成功です！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/20fa705c-80f1-6328-5781-deedf425f2e2.png" width="460"/>

##Heroku にホストする
- Procfile を作成
 - Heroku 上で起動するために、Procfile を作成し `web: npm run serve` と書いておきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/5cd84ed5-df82-25af-9fa0-78b868ceb5c1.png" width="460"/>

- heroku アプリを作成し、プッシュすれば Heroku アプリでも OSS 版 LWC によるアプリが動作しているのが確認出来ます。

```bash
$ git add .
$ git commit -m "my first commit"
$ heroku login
$ heroku create
$ git push heroku master
$ heroku open
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/205d21c9-baf3-c955-85cd-e8acb2fbbe21.png" width="460"/>


##参考
- [Lightning Web Components](https://lwc.dev/)
- [trailheadapps/lwc-recipes-oss](https://github.com/trailheadapps/lwc-recipes-oss)
Scenic を使って、Railsで RDB の VIEWを使う

こちらの記事を参考にRDBのVIEWを導入しました。
https://techracho.bpsinc.jp/morimorihoge/2019_06_21/76521

# VIEWを使う意図

複数の似ているテーブルをまとめて検索・参照したい

という意図で調査・検討を始めました。

そもそものDB設計として、 "似て非なるものは分ける” という思想で設計を始めるとまとめて表示・検索したい時にどうするか？というところに行き当たります。
Rails ですと、STIかとなるのですが、あまりしっくりきませんでした。サブクラスを参照すると必ず typeで絞り込むことや、アプリケーションよりDBのデータの方が長く使われるということを考えると、やはりサブクラスはテーブルを分けておきたいと考えました。
そこで RDBのUNIONを使って参照だけする方式を検討していました。同じ時期に冒頭の Techracho さんの記事を目にして、うまく当てはまりそうだったので、 Scenic でUNION を使った VIEWを作り、 ActiveRecordのモデルで参照する方法で実装をはじめました。

この記事では、上記実装に向けてまず簡単に Scenicで VIEWを作るところのみの説明をします。

# Scenicの導入

[gem の README](https://github.com/scenic-views/scenic) を参考に作業して、すんなりできました。
以下要点だけまとめておきます。

1. Gemfileにgem追加
2. `rails g scenic:model 参照用モデル`
3. `db/views/参照用モデル_v01.sql` に SELECT文を記述
4. `rake db:migrate`

`db/views/参照用モデル_v01.sql`の例：

```SQL
SELECT
  users.id,
  users.email
FROM users
```

ここまでで、参照用モデルを使ってDBレコードを参照することができるようになりました。VIEWのバージョン管理もできています。
一応実行例を載せておきます。あまり意味が無い気もしますが、参考までに。

`rails console`：

```
参照用モデル.first
```

# 終わり

とても簡単な導入記事になってしまいましたが、Qiitaで Scenicを扱う記事がなかったので少しで参考になれば幸いです。
次回は、具体的にアプリケーションのモデルを作成して複数のテーブルを参照できるようにします。

追記：
[Twitter @samemuramura](https://twitter.com/samemuramura) にて、Ruby on RailsやWEB開発・グロースハックについての参考情報を配信しています！よろしければぜひフォローください！
Google Driveの公開フォルダを一括取得する方法


*3分APIクッキング　Google Driveの公開フォルダを一括取得する方法*

Google Drive で共有設定されたフォルダ、ファイルを一括で取得したいことがありますよね。
GUIで一つ一つ確認するのは大変ですが、APIを使えば一括で取得することが可能です

1. https://developers.google.com/drive/api/v3/reference/files/list へアクセス。
こちらはFiles:listのAPIリファレンスとなります。 

2. 「Try it now」を押す
GoogleのAPIを利用するには通常APIダッシュボードで有効化する必要がありますが、こちらの「Try it now」から一時的にAPIをコールすることができます。

3. q のフィールドに  `"自分のメアド" in owners and visibility != "limited"`  を入力してEXECUTE
”自分メアド” in owners 　→　所有者(owners)が自分であるとなります。
 visibility != "limited" 　→　公開設定(visibility) が「非公開(limited) ではない(!=)と指定します。
PHP7にバージョンアップ時のpreg_replace()エラー

前にPHPを7にバージョンアップしたときにSmartyでエラーになった。

エラー内容
>Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead 
　in /var/www/php/library/pear/Smarty/Smarty_Compiler.class.php on line 270

preg_replace()はPHP7から廃止になったので、代わりにpreg_replace_callback()を使うように修正する。

元ソース

    $source_content = preg_replace($search.'e', "'"
                 . $this->_quote_replace($this->left_delimiter) . 'php'
                 . "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
                 . $this->_quote_replace($this->right_delimiter)
                 . "'"
                 , $source_content);

↓修正後

     $source_content = preg_replace_callback($search
                       , create_function ('$matches', "return '"
                           . $this->_quote_replace($this->left_delimiter) . 'php'
                           . "' . str_repeat(\"\n\", substr_count(\$matches[0], \"\n\")) .'"
                           . $this->_quote_replace($this->right_delimiter)
                           . "';")
                       , $source_content);
ReactNativeの開発環境を構築する話(Windows編)

# はじめに
以前に書いた[ReactNativeの開発環境を構築する話(Mac編)](https://qiita.com/nekoniki/items/b7610e9798819f1c2464)のWindows版です。

# 前提

・AndroidStudio
[React NativeでAndroidアプリ @ Windows 備忘録](https://qiita.com/nocd5/items/a259f35a67f2c31a858c)
・Node.js
[[Node.js] Node.js の導入(Windows編)](https://qiita.com/ksh-fthr/items/fc8b015a066a36a40dc2)
・VSCode
[Visual Studio Code (Windows版) のインストール](https://qiita.com/psychoroid/items/7d85ae6bade4a67aedb1)

# 各種設定・インストール

## 1. yarnとreact-native-cliインストール

```
npm install -g yarn
yarn -g add react-native-cli
```

## 2. 必須モジュールインストール
ここは各プロジェクトによって内容が異なってくるかと思います。
お好きなようにアレンジしてください。

```
react-native init【プロジェクト名】 —version 0.59.9
cd【プロジェクト名】
yarn add —dev typescript
yarn add —dev react-native-typescript-transformer
yarn add —dev @types/react @types/react-native
yarn tsc —init —pretty —jsx react
mkdir src
move App.js src/App.tsx
copy nul  rn-cli.config.js
yarn add —dev prettier
yarn add —dev tslint tslint-react
yarn add prettier —dev tslint-config-prettier tslint-plugin-prettier
copy nul tslint.json
copy nul  images.d.ts
```

## 3. tsconfig.jsonを修正
下記の値を追加・修正します。

```tsconfig.json
{
  "compilerOptions": {
    "lib": ["es2015"],
    "allowSyntheticDefaultImports": true,
  },
  "exclude": [
    "node_modules"
  ]
}
```

## 4. index.jsのApp参照先を修正
App.jsをsrcに動かしたのでindex.jsを修正します。

```index.js
/**
 * @format
 */

import {AppRegistry} from 'react-native';
// import App from './App';  // del
import App from './src/App'; // add
import {name as appName} from './app.json';

AppRegistry.registerComponent(appName, () => App);
```

## 5. rn-cli.config.jsとpackage.jsonを修正
※0.57以降ではrn-cli.config.jsは不要と聞いたこともあります。

```rn-cli.config.js
module.exports = {
    getTransformModulePath() {
        return require.resolve("react-native-typescript-transformer");
    },
    getSourceExts(){
        return["ts","tsx"];
    }
}
```

package.jsonは以下を追加

```package.json
  "scripts": {
    "run-ios": "react-native run-ios",
    "run-android": "react-native run-android"
  },
```

## 6. tslint.jsonとimages.d.tsを修正
tslin設定も正直お好みです。

```tslint.json
{
    "extends": ["tslint:recommended", "tslint-react", "tslint-config-prettier"],
    "rules": {
        "jsx-no-lambda": false,
        "member-access": false,
        "interface-name": false,
        "prefer-for-of": false,
        "ordered-imports": false,
        "object-literal-sort-keys": false,
        "no-console": false
    },
    "linterOptions": {
        "exclude": [
            "config/**/*.js",
            "node_modules/**/*.js",
            "coverage/lcov-report/*.js"
        ]
    }
    
}
```

```images.d.ts
declare module '*.svg';
declare module '*.png';
declare module '*.jpg';
declare module '*.jpeg';
declare module '*.gif';
declare module '*.bmp';
declare module '*.tiff';
```

## 7.実行
Androidエミュレータを起動した状態で下記コマンドを実行

```
yarn run-android
```

# 感想
Macの場合と特に差異がないため問題なく動くかと思いますが、
何か記載漏れ等ありましたらご連絡ください。

また、ここで記載した内容が少しでも参考になれば幸いです。
STM32CubeIDEで学ぶFreeRTOS (2) - メッセージキュー

[こちらの前回記事](https://qiita.com/imagou/items/82ca955ab291b3878d01)では、シグナルイベントを紹介しました。

今回は上記記事の発展版として、同じくタスク間通信機能である、**メッセージキューを体験**したいと思います。

# 本編

## 1. 準備

[前回記事](https://qiita.com/imagou/items/82ca955ab291b3878d01)に従い、仕込みを実施しておきます。

## 2. やってみよう！

### 2-1. 仕様

基本は[前回](https://qiita.com/imagou/items/82ca955ab291b3878d01#2-%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)に倣いますが、変更箇所は~~取り消し線~~＋**太字**としています。

1. UART受信を割り込みで受ける
1. 割り込みで受信した~~旨~~**データ**をタスクに~~イベント~~**メッセージ**通知
1. ~~イベント~~**メッセージとデータ**を受けたタスクは、単にエコーバック

### 2-2. 実装

#### 2-2-1. メッセージキューの追加

おなじみ、「FREERTOS」-「Tasks and Queues」タブにて、キューを追加します。

![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-19_9-4-8_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/a2ad2f3e-fed9-5f39-9ff8-e5d3a85ba931.png)

型だけuint8_tとし、それ以外はデフォルト値でOKです。
意味合いは、**「uint8_t型を16個キューイングできるよ」**となります。

#### 2-2-2. その他（雑）

今回より別ファイルとして、[user.c](https://github.com/imagou/QiitaSource/blob/master/2/user.c)を用意しました！

使用上の注意は以下です。

- myTask02のCode Generationは、As Weakとする必要あり
- main.cの**手動での**修正はしない（修正済みの場合は元に戻す）
- （当然ですが）user.cをコピペなりダウンロードなりで取り込む

### 2-3. 動かしてみる

前回同様に、Tera Termでのエコーバックが確認できるかと思います（やっぱり雑）。

## 3. かんたんな解説

### 3-1. メッセージキューとは

ずばり、イベントとデータを同時に通知する仕組みです。
本例では
**「イベント＝受信したよ」**
**「データ＝受信データそのもの」**
です。

データのサイズは、（何も工夫しなければ[^1]）最大で32bit（uint32_t型）です。

[^1]: 動的にメモリ確保することで拡張可能。ただし、ここでは面倒なので割愛。

CMSIS仕様は以下。

**Message Queue**
http://www.keil.com/pack/doc/CMSIS/RTOS/html/group__CMSIS__RTOS__Message.html


### 3-2. 定義と生成

賢いIDEが自動生成してくれます（main.cに含まれる）。
よって、ここではハンドルだけ使いまわします。

```c
extern osMessageQId myQueue01Handle;
```

### 3-3. 送信と受信

それぞれ以下の通り。

```c
  /* Put Message */
  osMessagePut(myQueue01Handle, (uint32_t)rxData, 0);
```

```c
    /* Get Message */
    osEvent evt = osMessageGet(myQueue01Handle, osWaitForever);
```

# おわりに

シグナルイベント同様、とても簡単に実装できますね！

シグナルイベントとこのメッセージキューがあれば、概ねタスク間通信は網羅できるかと思います（経験則）。

次回記事は何にしようか検討中。

# 参考

## CMSIS-RTOS

**Function Overview**
http://www.keil.com/pack/doc/CMSIS/RTOS/html/functionOverview.html

## 環境

- IDE: [STM32CubeIDE](https://www.st.com/ja/development-tools/stm32cubeide.html)
- 評価用ボード: [STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html) - 型番はB-L475E-IOT01A
shallow cloneしたレポジトリでブランチが取得できない

#### before

```[.git/config]
[remote "origin"]
	url = git@github.com:[ORGANIZATION_NAME]/[REPOSITORY_NAME].git
	fetch = +refs/heads/master:refs/remotes/origin/master
```

#### after

```[.git/config]
[remote "origin"]
	url = git@github.com:[ORGANIZATION_NAME]/[REPOSITORY_NAME].git
	fetch = +refs/heads/*:refs/remotes/origin/*
```
Excel365/2019での新関数

久々にExcelに触れたら、関数が増えていた

[Windows 版 Excel 2019 の新機能](https://support.office.com/ja-jp/article/windows-%E7%89%88-excel-2019-%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD-5a201203-1155-4055-82a5-82bf0994631f).
Office365またはOffice2019以降で使えるようだ
今まで関数を入れ子にしていたり、VBAでスクリプトを書いていた部分のある程度を軽減できるかもしれない

## CONCAT
CONCATENATE(セル)が短くなって置き換え。範囲指定できるようになったので、

|A|B|C|
|:---:|:---:|:---:|
|今日の|天気は|晴れ|
みたいな各文字列の結合について、

```excel:CONCATENATE
=CONCATENATE(A1,B1,C1)
```

```excel:CONCAT
=CONCAT(A1:C1)
```

のように書ける。`CONCATENATE`と同じように,区切り記法ももちろん使える。参照するセルが増えるほどに便利になりそう

## IFS
`IF`関数の入れ子構造は現場ではよく見かける構造で、特に古くから利用されているファイルなどによくある。
末尾にSがついていることから想像できるように、この関数は複数の条件設定を可能にする

基本構文は

```excel:IFS 
=IFS([Something is True1, Value if True1,Something is True2,Value if True2,... ,"False")
```
左の式から順番に評価して、`TRUE`だったら`TRUE`のValueを返し、`FALSE`ならば次の評価式を評価し...と最大127の評価が可能

## SWITCH
今まで`IF`で処理していた条件設定が簡単になりそうな関数

```excel:SWITCH
=SWITCH(式,value1,results1,value2,results2...,no-results)
```
式の結果を`value1`から順番に評価し、一致したら該当する`results`を返す。
一致するものがなかった場合は最後の`no-results`を返します(未設定の場合は`#N/A!`)
Error: restricted_clientでgoogleアカウントが承認されない時に。

<img width="1000" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3131343339362f32643736373761632d643930382d663263322d303361352d3761313266306462393032662e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429297/556b8612-7856-df38-7f08-69fa04deb31f.png">
firebaseのAuthenticationを使ってgoogleアカウントからのログイン機能を作った時に、上の画像のエラーが出ました。

OAuthの設定が完了出来ていない的な事を言われています。

##解決法
Error画面のLearn moreのリンクでOAuth設定画面に行くので、そちらで必須の設定項目を入力します。
プロジェクトのサポートメールも必須入力ですが、Authenticationでgoogleログインを有効にした時に入力しているはずなので、記述変更するのは以下の画像のアプリケーション名のところです。
<img width="1095" alt="スクリーンショット 2019-07-16 15.15.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429297/256f466a-963c-bb0d-0f71-b725a6f9a6b9.png">
初期の段階ではfirebaseで作ったプロジェクトのidナンバーの様なものが入っていると思います。
それを作ったプロジェクト名に変え、ページの一番下にある保存ボタンを押します。
（初期で必要な項目は入力されているので、OAuthの設定できてるじゃんって思ってしまい数時間取られました。。）

これでできると思いますが、まだ承認されない方はもしかしたらchromeが最新バージョンじゃないから承認されない可能性もあるので、以下の記事を参考に最新バージョンに更新してみてください。

[Google認証でログインした際 403 エラーが発生するお客様へ](https://comic.k-manga.jp/announce/20170517-2)
やり方は[こちら](https://dekiru.net/article/16967/)を参考にしてください。

---
【後日】
のちにOAuth設定アプリケーション名を存在しないプロジェクト名に変えて試したところ、ちゃんと承認されました。
ですのでアプリケーション名はなんでも良いのかもしれませんが、自分のケースでは初期値では動かずアプリケーション名を変えたら動いたのは事実ですので、ここに残しておきます。
もし詳しい方がいらっしゃいましたらご教授していただけたら嬉しいです。
CircleCIでエラー: Host key verification failed.

# 原因
- `known_hosts`に必要な情報が登録されていない
    - `sudo`を使っている場合などに発生する

# 対応
- `sudo`を使わない
    - たいていの場合不要なはず
- `known_hosts`に必要な情報を登録
    - https://discuss.circleci.com/t/known-hosts-in-circle-2-0/18544

# 詳細なエラー

```bash
error Command failed.
Exit code: 128
Command: git
Arguments: ls-remote --tags --heads https://github.com/alexeckermann/ckeditor5-emptyness
Directory: /home/circleci/repo
Output:
Host key verification failed.

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```
Aquaguard water purifier

Water is the fundamental necessities of life. Use of sullied water is an unsafe situation. Clean drinking water is principal for saving life. Finding a best <a href="http://aquaguarduae.com/">water purifier</a> for your home is a troublesome situation. Since reliably new purifier things are added to the market.Aquagurd is the best purifier advancement open in market for making the drinking water safe. A couple of produces give false assertion about the working of water purifiers.Aquagurad <a href="https://aquaguarduae.com/eureka-forbes">Eureka Forbes</a> UAE is the primary trusted in brand with front line flow advancement facilities. The incredible water conditioner development ousts hardness of water by overriding it with basic minerals. Water channel oust, organisms, diseases and other sullied destructive microorganisms from water.