OmniAICreator/Qiita-1.07M huggingface dataset:
集合の濃度について

# 集合の濃度

$A$から$\\{ 1, 2, \ldots, n\\}$ ($=[n]$ とおく) $(n \in \mathbb{N}, n \geq 0)$への全単射が存在する時, $\\#A = n$と定める. $\\# A \in \mathbb{N}$のとき, $A$は**有限**であると云う。

$A$から$\mathbb{N}$への全単射が存在するとき, $A$は**可算無限**であるといい、 $\\#A = \aleph_0$と記す。

$A$が有限または可算無限なら$A$は**高々可算**であるといい、$\\#A \leq \aleph_0$と記す。


## 気になること

1. 有限な集合と対応づける $[n]$ は**絶対**に1から開始?
2. 加算無限な集合$A$に出てくる$\aleph_0$は要は、無限個ってこと？$A$はすべてに写像先があるということで。

## 解答

### 1.
数学的に定義をひとつ決める上で$n$元集合の代表として$\\{1,\ldots,n\\}$をとってるだけなので、本質的には存在が保証されている$n$元集合なら$\\{a,b,c,\ldots\\}$でもなんでもよいです。


### 2.
無限の中で最も小さいのが可算無限です。これより大きい無限もあって、それらはひっくるめて非可算無限と言われます。
可算と呼ばれる由来は漢字の通り自然数で番号付けて数えられる無限ということです。実数は自然数で番号付けられない(Cantorの対角線論法)ので非可算ですね。

集合論の公理として冪集合の公理(集合$X$の部分集合全体$\mathfrak{P}(X)=2^X$は集合である)というのがありますが、このとき濃度に関して$\sharp X < \sharp 2^X$が成り立つことが示せます($X$がどんな無限集合でも)。したがって無限集合にも大小が色々あることが分かります。

$$例)\hspace{30pt}\sharp\mathbb{N} = \sharp\mathbb{Q} < \sharp 2^\mathbb{N} = \sharp\mathbb{R} < \sharp 2^\mathbb{R}$$


とくに、無限集合の濃度はその大小に関して整列集合(任意の部分集合に最小値が存在する順序集合)になっており、順序数$$
0,1,2,...,\omega_0,\omega_0+1,\omega_0+2,...,2\omega_0,.,3\omega_0,...,\omega_0^2,...,\omega_0^{\omega_0},...,\omega_1,...
$$で番号付けられるようです。(証明したこと無いけど。wiki参照)

集合の濃度を小さい順に並べた$0,1,2,\ldots,\aleph_0,\aleph_1,\ldots,\aleph_{\omega_0},...$のことを基数(cardinal number)といいます。特に有限ではない基数を無限基数というのですが、$\aleph_0$はそれら無限基数のうち最小のものです。

ちなみに、$\aleph_1 = \sharp 2^\mathbb{N} (= \sharp\mathbb{R})$かどうか(実数の濃度が自然数の濃度の次に小さい濃度かどうか)は決定不可能な問題として知られています。
つまりこれが成り立つとしても成り立たないとしても矛盾が起こらず、それぞれ異なる数学が展開できます。
こうしたことに関連して、どういう公理を採用すると何が成り立つのかや、異なる公理の関係などを研究する数学基礎論やモデル理論などの分野もあります。
JavaScript typeofチートシート

|式|返り値|コメント|
|---|---|---|
|`typeof 'hello'`|`"string"`||
|`typeof 123`|`"number"`||
|`typeof true`|`"boolean"`||
|`typeof Symbol()`|`"symbol"`||
|`typeof undefined`|`"undefined"`||
|`typeof null`|`"object"`|**注意！**|
|`typeof { a: 'apple' }`|`"object"`||
|`typeof new Date()`|`"object"`||
|`typeof [1, 2, 3]`|`"object"`|配列はオブジェクトである|
|`typeof /[0-9]/`|`"object"`|正規表現はオブジェクトである|
|`typeof function() {}`|`"function"`||
|`typeof Array`|`"function"`|コンストラクタは関数である|
|`typeof class {}`|`"function"`|クラスは関数である|

## 参考文献

* [typeof - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof)
placeholderの色を変える方法


* placeholderの色を変えるには、[`::placeholder`疑似要素](https://developer.mozilla.org/en-US/docs/Web/CSS/::placeholder)を使う。
* IEをサポートするなら、`:-ms-input-placeholder`疑似クラスも使う。
* Edgeをサポートするなら、`::-ms-input-placeholder`疑似要素も使う。

```css
input::placeholder {
  color: red;
}

/* IE */
input:-ms-input-placeholder {
  color: red;
}

/* Edge */
input::-ms-input-placeholder {
  color: red;
}
```

次のようにSCSSでmixin化してもよいだろう。

```scss
@mixin placeholder($color) {
  &::placeholder {
    color: $color;
  }

  // IE
  &:-ms-input-placeholder {
    color: $color;
  }

  // Edge
  &::-ms-input-placeholder {
    color: $color;
  }
}

input {
  @include placeholder(red);
}
```

☞ [デモ](https://codepen.io/bita-shimada/pen/ZaBJoV?editors=1100)

## 参考文献

* [::placeholder CSS pseudo-element - Can I use...](https://caniuse.com/#feat=css-placeholder)
夢の疑似クラス:has()

[`:has()`という疑似クラスがSelectors Level 4のEditor’s Draftにある。](https://drafts.csswg.org/selectors-4/#relational)`E:has(selector)`で、selectorにマッチする要素を持つE要素を表す。これが広くサポートされれば、次のようなことが可能になる。

`.foo`を子孫に持つ`.container`の中の`.bar`にスタイルを当てる：

```css
.container:has(.foo) .bar {
  color: red;
}
```

DOMツリー上に`.foo`があるときに、`.bar`にスタイルを当てる：

```css
:root:has(.foo) .bar {
  color: red;
}
```

DOMツリー上の`.foo`がチェックされているときに、`.bar`にスタイルを当てる：

```css
:root:has(.foo:checked) .bar {
  color: red;
}
```
論文読み"Recommending New Movies: Even a Few Ratings Are More Valuable Than Metadata"

# 概要
* 論文:[1] Recommending New Movies: Even a Few Ratings Are More Valuable Than Metadata
* https://dl.acm.org/citation.cfm?id=1639731
* Model based collaborative filtering でよく使われるmatrix factorization(MF)だとcold start問題に対応できない。
* MFはユーザ$u$の$p_u$特徴ベクトルとアイテム$i$の特徴ベクトル$q_i$を求め、評価 $r_{ui}$ を $p_u \cdot q_i$ と近似する。
* 新しいアイテムに対して特徴量ベクトルを計算することができない。
* この論文では、$q_i$をアイテムのメタデータを使って導出する。

# Notation
* $u, v \in \{1, ..., N\}$: ユーザのインデックス.
* $i, j \in \{1, ..., M\}$: アイテムのインデックス.

# Contents based filtering
## Notation
* $x_i \in R^C$: アイテム$i$のメタデータ。
* $w_l \in R^K$ $(l \in \{1, ..., C\})$: アイテムの特徴ベクトル。
* $W:=\{w_1, ..., w_C\}^T \in R^{C \times K}$

## モデル
アイテム$i$の特徴ベクトルを $q_i = W^T x_i$ と定義し、評価の近似値は次のようになる。

$$r^a_{ui} = b_u + c_i + p_u \cdot q_i$$

ここで未知のパラメータは$b_u$, $c_i$, $p_u$, $W$ で解くべき最小化問題は

$$\min \sum_{r_{ui} \text{ is known}} (r_{ui} - r^a_{ui})^2
 + \lambda \sum_{u}||b_u||^2
 + \lambda \sum_{i}||c_u||^2
 + \lambda \sum_{u}||p_u||^2
 + \lambda \sum_{l}||w_l||^2$$

## Algorithm 1
この最小化をSDGで解く。各パラメータの更新式は、$e_{ui} = r_{ui} - r^a_{ui}$ とおくと、

* $a \leftarrow q_i$
* $b \leftarrow p_u$
* $p_u \leftarrow p_u + \eta (e_{ui} q_i - \lambda p_u)$
* $q_i \leftarrow q_i + \eta (e_{ui} b - \lambda q_i)$
* $b_u \leftarrow b_u + \eta (e_{ui} - \lambda b_u)$
* $c_i \leftarrow c_i + \eta (e_{ui} - \lambda c_i)$

これらは最小化する式を各パラメータで微分し、微分の逆方向(-1を掛けたもの)に学習率 $\eta$ だけ更新することで求められる。

ひとまず $q_i$ をパラメータとして更新したあとで、$\{w_l\}$ を $\{q_i\}$ に一致するように更新する。

* $d \leftarrow 1 / (x_i^Tx_i)$
* $w_l \leftarrow w_l + d x_{il} (q_i - a)$

実際、更新前の $w_l$ を $c_l$ とすると、更新式は
$$\sum_{l} x_{il} c_l + (q_i - a) = \sum_{l} x_{il} w_l$$
となるが、これは一意に解くことができないので、前述のようにしている。

アルゴリズムの全体像は次のようになる([1]から転載)。

<img width="444" alt="algorithm1.png" src="https://qiita-image-store.s3.amazonaws.com/0/199247/1ac56c1c-24c9-05a1-d9a1-14fcbd46ac30.png">

## Algorithm2
前述のAlgorithm1の場合、1のアイテムごとに$q_i$を更新し、$w_l$を$q_i$に一致するように更新している。

次に提案する手法は、全評価の情報を使って$Q$を更新し、その後に$W$を$Q$に一致するようにまとめて更新する。

* $e \leftarrow q_i - W^T x_i$
* $d \leftarrow 1 / (x_i^T x_i)$
* $W \leftarrow W + \eta_2 (d x_i \cdot e^T - \lambda_2 W)$

アルゴリズムの全体像は次のようになる([1]から転載)。

<img width="448" alt="algorithm2.png" src="https://qiita-image-store.s3.amazonaws.com/0/199247/8632d30c-3198-23c3-c94a-3595768bb0fe.png">

この方法の場合、$P$ と $Q$ を求めるときに他の手法(ALSなど)を使用することができる。

## その他
他の方法も提案されているが、いったんここまで。
【New Year Calendar】CakePHPでEnumを使用する3分クッキング

![cakephp_useEnum.png](https://qiita-image-store.s3.amazonaws.com/0/71113/f11845bb-fced-ecb4-2d2e-2815f092532e.png)


**New Year Calendar 5日目**
New Year Calendarって何ぞという方はまず[こちら](https://qiita.com/endam/items/ee648fed2a31c0efd249)をご覧ください。

今日はCakePHPでEnumを使用する為の3分クッキングを行います。よろしくお願いします。
それでは早速始めましょう。
(基本、キュー◯ー3分クッキングのノリで進めます)

#準備
##必要な調理器具
- CakePHP2系

先生「今日はEnumを作るのでCakePHP2系を使います。ただしCakePHP2系はガスコンロのみでIHには対応していないのでご注意下さい。IHに対応してるのは3系からですからね。」
アシスタント「動作は保証されないってことですね。分かります。」

##材料
- Composerライブラリ「[myclabs/php-enum](https://github.com/myclabs/php-enum)」：1つ
- ソースコメント：目分量
- やりきるパッション：小さじ1杯


#調理手順
##1. EnumのComposerライブラリをインストールする
PHPで列挙型を利用する為に独自実装も出来ますが、ここは[php-enum](https://github.com/myclabs/php-enum/releases)というComposerライブラリを使ってみましょう。

composer.jsonに以下を追加した後、`composer install`コマンドを実行してライブラリをインストールします。

```composer.json
{
  "require": {
    ...,
    "myclabs/php-enum": "^1.5"
  }
}
```

##2. Enumクラスを作る
今回は例としてCakePHPのModelディレクトリの下にEnumディレクトリを作り、ユーザー情報に関するEnumクラス`User.php`を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/a743bfa0-526f-d366-dc8e-0befe42ecb54.png)

インストールしたphp-enumのライブラリを継承し、Enumクラスを作ります。

```User.php
<?php
namespace Sample1\Model\Enum\User;

use MyCLabs\Enum\Enum;

/**
 * @method Status ACTIVE()
 * @method Status INACTIVE()
 */
class Status extends Enum
{
    const ACTIVE = 1;
    const INACTIVE = 2;
}
```

↑のクラスコメントはライブラリのREADMEに書いてある通りPhpStormでサポートする為の記法です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/e25c63a8-495b-d116-b6f8-3ec724975ddf.png)

##3. Enumクラスをautoloadする
bootstrap.phpでspl_autoload_registerを使ってEnumクラスをautoloadする設定を追加します。

```php
// Autoload model constants
spl_autoload_register(function ($class) {
    // Get file path by namespace
    // e.g. 「Sample1\Model\Enum\User\Status」→「~/app/Model/Enum/User.php」
    if (!preg_match("/Model\\\\Enum\\\\[A-Za-z]+/", $class, $match)) {
        return;
    }
    $filePath = APP . DS . str_replace('\\', DS, $match[0]) . '.php';
    if (file_exists($filePath)) {
        include $filePath;
    }
});

```

これにて調理完了！

#実際に使ってみる
上記で作ったEnumをContollerで実際に参照してみます。

```php
<?php
use Sample1\Model\Enum as Enum;

/**
 * Users Controller
 */
class UsersController extends Controller
{
    public function index() 
    {
        $userStatus = Enum\User\Status::ACTIVE;
        echo $userStatus; // 「1」が出力される
    }
```

これだけでCakePHPでEnumが使用できるようになりました。

明日は大晦日なのでGolangを使って年越しそばの作り方を紹介します(嘘です)
ラズパイ用小型ディスプレイで遊ぶ

千石で買った3500円ぐらいの小さいディスプレイなんですが、簡単につながるだろうと油断してたらちょっと難しかったので忘備録兼ねて投稿
なんか今更ラズパイかよって感じしますけど

なお、ラズパイはW Zeroを使用してます。
ディスプレイは名前忘れたのであとで調べときます。
せんごくネットでは見つかんなかった。最近買ったのに

##接続方法

![20171230_GPIOpin.png](https://qiita-image-store.s3.amazonaws.com/0/214012/a495aec2-78eb-25dd-c9f1-229d11a489ba.png)

これは、ラズパイを上（SDカード側）から見た接続方法
このディスプレイは1番ピンから26番ピンを使うのでその通りに接続
なお、拡張ボードなどを使うため直接GPIOピンに接続しないときはピンの配列に注意
最初1の行と2の行を逆に接続したが故にうまくいきませんでした。

この状態だとまだディスプレイは真っ白のままです

##ドライバインストール
http://www.waveshare.net/wiki/3.5inch_RPi_LCD_(A)
このサイトに方法一，安装驱动って項目があります。
その下に170703～のリンクが張ってあるのでそれをダウンロードします。

得られたLCD-show-170703.tar.gzをラズパイにコピーします。
LT-Terminalで、上記ファイルがあるフォルダに移動したうえで次のコマンドを打ちます。

```Terminal:terminal
    tar xzvf /boot/LCD-show-171703.tar.gz 
    cd LCD-show/
    chmod +x LCD35-show
    ./LCD35-show
```

Qiita見てる人ならわかるだろうけど一応念のため解説すると
解凍して、フォルダ移動して、フォルダ内のLCD35-showに実行権限与えて実行する。

しばらくすると終了してCUI画面になります。
放置してたらHDMIディスプレイ側は入力待ちのような状態で、LCDに画面が移ります。
![DSC_0096 (2017-12-30T20_47_00.000).JPG](https://qiita-image-store.s3.amazonaws.com/0/214012/d64a0db7-1758-88dd-90ad-b67b8621f7fd.jpeg)


##HDMI画面に戻す
さっきのLCD-showフォルダの中身を使います。

```Terminal:terminal
    cd LCD-show/
    ./LCD-hdmi
```
これでhdmi側に戻ります。
LCD-hdmi と　LCD35-show　の２つのファイルを切り替えることでHDMIとLCDの切り替えを行うことができます

##おまけ
こーんなめんどくさい作業をいちいちコマンド打ってたらめんどくさいのでシェルスクリプトでやっちゃいましょう
条件式つければ１つのファイルで済むのですが、条件式考えるの面倒なので別々に作ります

```bash:LCD.sh
    cd /home/pi/Desktop/LCD-show
    ./LCD35-show
```

```bash:hdmi.sh
    cd /home/pi/Desktop/LCD-show
    ./LCD-hdmi
```

LCD.shがLCDに切り替えるスクリプト、hdmi.shがHDMIに切り替えるスクリプト
この２つをデスクトップに作ります。

ちなみに、直接LCD35-show実行すりゃいいじゃんと思う人がいると思いますが、このファイルの中身が相対パスで書かれているので、必要なファイルが見つからないエラーでちゃんと実行されないのです。

```Terminal:terminal
chmod +x LCD.sh
chmod +x hdmi.sh
```

LCD.shとhdmi.shに実行権限をつけてあげます。
これで終了。
これからはこのファイルをダブルクリックして実行してあげるだけで切り替えができます。
Docker入門 -事前準備-

*********
注意:
この投稿はDocker入門ハンズオンセミナーで用いる資料の準備編になります。
Dockerの基本的な内容の投稿は別途行いますのでそちらをご覧ください。
*********

 Dockerで作成したイメージをGitと連携して管理・配布するにあたり、事前に準備しておくべき内容をまとめておきました。こちらを参考に事前準備をしていただくようよろしくお願いいたします。


* コマンドラインでGitを使えるようにする
* Dockerをインストールする

# Windows

## Gitのインストール

###1. GitのHPから最新版のexeファイルをダウンロード
https://git-scm.com/
![Git.png](https://qiita-image-store.s3.amazonaws.com/0/161922/62d3d2b7-7624-e90b-4cee-0cbd6072af1c.png)


###2. 環境変数の設定
[Use Git from the Windows Command Prompt]を選択
![gitInstall.png](https://qiita-image-store.s3.amazonaws.com/0/161922/0e3caefc-8747-0b2f-a18f-856396f3f779.png)


###3. 改行コードの設定
[Checkout as-is, commit Unix-style line endings]を選択
![git改行コード.png](https://qiita-image-store.s3.amazonaws.com/0/161922/282fd268-5c04-b07a-8073-e4dae2572528.png)

###4. コンソールの設定
[use windows' default console window]を選択
![gitconsole.png](https://qiita-image-store.s3.amazonaws.com/0/161922/fc7ae132-649c-6c25-8979-b293e0a998aa.png)

###5. インストールの実行

###6. コマンドプロンプトを起動
`git --version`と入力してバージョンが表示されていれば完了。

##Dockerのインストール

* Windows 10 Proの場合

###1. 「Windowsの機能」画面からHyper-Vを有効化する
![windows10ProHyper-v.png](https://qiita-image-store.s3.amazonaws.com/0/161922/552ddde7-b925-10f1-e29e-077ceaa8dbb4.png)

###2. Docker for Windowsをインストール
https://docs.docker.com/docker-for-windows/install/
<img width="859" alt="Screen Shot 2017-12-30 at 21.14.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/161922/76148877-f8c6-5b12-bd93-fd1a906a192b.png">

今回は最新安定版(stable)を利用

###3. インストールの実行

###4. 「Hyper-Vマネージャー」に「MobyLinuxVM」、仮想スイッチ「DockerNAT」の追加を確認 
![wi-dockerforwindows04.png](https://qiita-image-store.s3.amazonaws.com/0/161922/be8e56f6-66ad-b37f-a5aa-ecf87e06cd01.png)

###5. コマンドプロンプトを起動
`docker --version`と入力してバージョンが表示されていれば完了。

_________

* Windows 10 Pro以外の場合

###1. Docker toolbox for windowsをインストール
https://docs.docker.com/toolbox/overview/#whats-in-the-box
<img width="856" alt="Screen Shot 2017-12-30 at 21.05.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/161922/1e53b031-6a7b-d11c-cb27-5a371ae1d37d.png">


###2. インストールの実行

###3. 起動確認
DockerのGUIである「Kitematic」の動作を確認
アプリケーションディレクトリ内の「Kitematic」を起動

###4. DoclkerVMを起動
![dockerVm.png](https://qiita-image-store.s3.amazonaws.com/0/161922/0504fefc-62ff-00e9-2cd5-67b4bafc604b.png)

###5. DockerHubへのログインをスキップ

###6. DockerCLIの実行
画面左下の[DOCKER CLI]をクリック
コンソール上で`docker --version`と入力してバージョンが表示されていれば完了。

# Mac

##Gitのインストール

`brew install git`を実行するだけです。
もしくはhttps://git-scm.com/downloads
からダウンロードしてください。

##Dockerのインストール
https://docs.docker.com/docker-for-mac/

今回は最新安定版(stable)を利用

コンソール上で`docker --version`と入力してバージョンが表示されていれば完了。

_____________


以上です。
事前の準備のほど、よろしくお願いします。
IBM Cloud上のNode.jsでライブラリを使わずにWatson APIを呼び出す方法

通常、IBM Cloud(旧Bluemix)上のNode.jsのアプリからWatson APIを呼び出す場合、Watson APIのライブラリを使うのですが、わけあって、直接REST API Callをしたいことがあり、その時の話のメモとしての雛形コードを記載します。Language Tanslator APIが対象となっていますが、同じ考え方で他のAPI Callもできるはずです。

## 前提
* Node.jsはローカルでもテストできるよう、ローカルとIBM Cloudどちらでも動くものとします。
* ローカル環境では、通常のサンプルアプリのお作法通り、.envファイルにusername、passwordの記載を行うものとします。
* IBM Cloud環境では、APIサービスはアプリケーションにバインドされており、VCAP_SERVICES環境変数経由で、username、passwordを取得できるものとします。

## サンプルコード
*  上記の条件を実装するための部分のみ抽出した雛形コードです。通常のお作法によるNode.jsコードはこの外側に必要です。
*  エラー処理は省略しています。

```
// .envファイルの読み込み
require('dotenv').load({silent: true});

// アプリ(ブラウザ側)から /api/translateで呼ばれた場合の処理
app.post('/api/translate',  function(req, res, next) {
    // パスワードエンコードに必要
    const bufferFrom = require('buffer-from');

    // リクエストを直接出すのに必要
    const request = require('request');

    // username一時保存用
    var username;

    // password一時保存用
    var password;

    // ローカル環境で.envファイルからusername、password取得
    if (process.env['LANGUAGE_TRANSLATOR_USERNAME']) {
        username = process.env['LANGUAGE_TRANSLATOR_USERNAME']
    }
    if (process.env['LANGUAGE_TRANSLATOR_PASSWORD']){
        password = process.env['LANGUAGE_TRANSLATOR_PASSWORD'];
    }
    
    // IBM Cloud環境上でusername、password取得 (サービスがバインドされている前提)
    if (process.env.VCAP_SERVICES)
    {
        var env = JSON.parse(process.env.VCAP_SERVICES);
        var vcap = env.language_translator;
        username = vcap[0].credentials.username;
        password = vcap[0].credentials.password;
     }

    // リクエストヘッダの生成
    // username, passwordはBase64でエンコードする
    var headers = {
        Authorization: 'Basic ' + bufferFrom(username + ':' + password).toString('base64'),
        'Content-Type':'application/json'
    }

    // リクエスト時のオプションデータ作成
    var options = {
        url: 'https://gateway.watsonplatform.net/language-translator/api/v2/translate',
        method: 'POST',
        headers: headers,
        json: true,
        body: {
            text: req.body.text,
            model_id: req.body.model_id
        }
    }

    // リクエスト実行
    request(options, function (error, response, body) {
        if ( error ) {
            console.log(error);
            return next(error);
        } else {
            // 正常終了時
            res.json(body);
        }
    })
})

```

参考リンク [Bluemix上のWatsonアプリをローカル環境で開発・デバッグする際のTips](https://qiita.com/makaishi2/items/06dd45ae50891d66aef5)
goのスクレイピングフレームワークColly

[Scraping Framework for Golang](http://go-colly.org/)

<img width="714" alt="スクリーンショット 2017-12-30 16.11.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/192321/621978d8-98db-2564-05ba-637b15d8a3a9.png">

> Fast and Elegant Scraping Framework for Gophers

[Documentation | Colly](http://go-colly.org/docs/)

## インストール
```bash
$ brew install go
$ go get -u github.com/gocolly/colly/...
```

## 実装サンプル
### 許可ドメイン内でクロールする

```basic.go
package main

import (
    "fmt"
    "github.com/gocolly/colly"
)

func main() {
    c := colly.NewCollector()

    // リクエスト許可するドメインの設定
    c.AllowedDomains = []string{"jp.leagueoflegends.com", "support.riotgames.com"}

    // HTMLもらった時に実行するコールバック
    c.OnHTML("a[href]", func(element *colly.HTMLElement) {
    	link := element.Attr("href")
    	fmt.Printf("見つけたリンク: %q -> %s\n", element.Text, link)

    	// 見つけたリンクにリクエスト
    	c.Visit(element.Request.AbsoluteURL(link))
    })

    c.OnRequest(func(request *colly.Request) {
    	fmt.Println("ここにリクエストするよ", request.URL.String())
	})

    c.Visit("https://jp.leagueoflegends.com/ja/")
}
```

![62aa97258c8452828848a8080e09fa32.gif](https://qiita-image-store.s3.amazonaws.com/0/192321/da5c626b-e777-7b81-75fb-3a33c8e42f89.gif)

### 一覧ページから個別ページ入ってデータ収集

```lol_champions.go
package main

import (
	"log"
	"github.com/gocolly/colly"
)

type Champion struct {
	URL		string
	Name 	string
	AD 		string
	AR 		string
	AP 		string
	Difficulty string
}

func main()  {
	c := colly.NewCollector()
	detailCollector := c.Clone()

	champions := make([]Champion, 0)

	// 一覧ページから個別ページURLを取得して個別ページ用のコレクタでリクエストする
	link_selector := "#sortabletable1 tr td:nth-child(1) > a"
	c.OnHTML(link_selector, func(e *colly.HTMLElement) {
		href := e.Attr("href")
		url := e.Request.AbsoluteURL(href)
		log.Println("URL: ", url)
		detailCollector.Visit(url)
	})

	c.OnRequest(func(r *colly.Request) {
		log.Println("一覧ページリクエスト: ", r.URL.String())
	})

	detailCollector.OnHTML("div.champion_stats", func(element *colly.HTMLElement) {
		champion := Champion{
			URL: 	element.Request.URL.String(),
			Name: 	element.DOM.Find("#content_5_0").Text(),
			AD: 	element.DOM.Find(".list1 dd:nth-child(2)").Text(),
			AR: 	element.DOM.Find(".list1 dd:nth-child(4)").Text(),
			AP: 	element.DOM.Find(".list1 dd:nth-child(6)").Text(),
			Difficulty: element.DOM.Find(".list1 dd:nth-child(8)").Text(),
		}
		log.Println(champion.Name)
		champions = append(champions, champion)
	})

	c.Visit("https://loljp-wiki.tk/wiki/?Champion%20Stats%20Table")
	log.Println("finish")
}
```

![6ad8412a9f2bec7b1742018e4c48f524.gif](https://qiita-image-store.s3.amazonaws.com/0/192321/6749202e-cedd-9ef2-fcc3-32a40730b575.gif)
iOSアプリ開発で気を付けること

# 事始め
[アプリ開発で気を付けること](https://qiita.com/yuukiw00w/items/9fbf641e65e1440e7313)の記事では、Android/iOSに関係なくアプリ開発における基本的な考え方について整理しましたが、こちらではiOSアプリ開発特有の観点について整理したいと思います。[アプリ開発で気を付けること](https://qiita.com/yuukiw00w/items/9fbf641e65e1440e7313)と同様に、簡潔・単純明快を心がけ、詳細については別記事に譲ることとします。

# Storyboard、Xib関連
## 気を付けること
* Storyboardは可能であれば1画面1Storyboardが良いと思います（参考：[1画面1Storyboardのススメ](https://www.slideshare.net/TomoIta/11storyboard)）
* 使い回したいViewはStoryboardからXibに分割すると便利です
* 複雑な画面などもXibに分けておくと分かりやすくなります
* 不要なView要素がないか確認し、あれば削除しましょう
* コードとの紐付け（IBAction、IBOutlet）でコード上での操作が不要なものは削除した方が良いでしょう
* コミットを入れる前に、他のDevice上での表示や縦横表示を確認しておきましょう（直近であれば特にiPhoneX）
* 初期化処理はStoryboard/コードのどちらかに統一して記載するのが望ましいです（どちらで初期化されているのかは見てみないとわからなくなってしまうので）

## 個人的な見解
[まだ Storyboard で消耗してるの？——Re:ゼロから始める視覚表現（ビジュアルリプリゼンテーション）](https://qiita.com/lovee/items/acfc9d0f1ffa7207b38b)や[Storyboardなんか使わない方がいい](http://appstars.jp/archive/657)などにも記載されてますが、個人的にもStoryboardはあまり使いたくない派です。デメリットについては調べればいくらでも出てくると思います。ただ、簡単で静的なViewについてはStoryboard/Xibで実装するのもありだと思っています。そうした際には以上の点について気を付けながら実装を行っています。

# コード関連
* nilだった場合の処理が適切なのかどうか確認しましょう
* 配列の要素外アクセスが起きないことを確認しましょう
* (Swift)強制アンラップは基本的に使用しないようにしましょう
* 要らないコメントは削除しましょう
* TODOコメントにはチケット(Issue)番号を記載しておくのがオススメです
* TODOやFIXMEなどは単純なコメントではなくアウトライン表示しましょう（参考：[Swiftでクラスのアウトライン表示(区切り線やTODO)](https://qiita.com/ohkawa/items/74abb92f4f5cf39b1dbd)）
* delegateやblocks(closure)内のselfは弱参照にしましょう（参考：[Swiftの循環参照問題におけるunownedとweakの使い分けについて](https://qiita.com/susieyy/items/f57f9362b8e0a89023cb)）
* delegateとblocks(closure)は適切に使い分けしましょう（参考がないので最下部に少し記載）
* SwiftからObjective-Cの変数にアクセスする際に強制アンラップのままになっていないか確認しましょう（デフォルトだと全て強制アンラップされます）
* Lintツール（SwiftLint、OCLint）やコードフォーマッター（Swimat、Clang-format）を有効活用しましょう
* 何でもかんでもViewDidLoadに詰め込んでいないか確認しましょう
* 意外とタイポは見逃されがちなので気を付けましょう（コンパイラも教えてはくれません）

# その他
* 不要なContents.jsonは削除しましょう（よく無駄なContents.jsonが作成されていることがあります）
* OSSを使用する際は正しく利用しましょう。よくライセンス表記に漏れが生じるので、[LicensePlist というiOSアプリ利用ライブラリのライセンス一覧を生成するツールを作りました
](https://medium.com/swift-column/license-plist-c0363a008c67)などを参考に自動化するのも一つの手です

# delegateとblocks(closure)の使い分けについて
参考になる記事が「Blocks or Delegation?」みたいなタイトルでブログがあったと思うのですが、消えてたので軽く翻訳して抜粋しておきます。

* 複数の異なるイベントが発生する場合はdelegateを使用する（blocksだと大体1つか2つになる。delegateは色々なイベントを一気に委譲できるという違いがある）
* シングルトンになっているobjectがイベントを発生させる場合はblocksを使用する（インスタンスが一つなので、delegateの付け外しが大変なことになる）
* 追加情報を求める為のコールバックにはdelegateを使用する（UITableViewDataSourceなど）
* プロセスに沿って情報を取得するような場合はdelegate、結果を取得するような場合はblocksを使用する（これはどうでしょうね、個人的には途中経過の処理もblocksで良いと思います）
Google Homeからルンバを操作する方法

#はじめに

前回クソアプリ Advent Calendar 2017で[「Google HomeとジャルジャルのM-1のネタ再現してみた」](https://qiita.com/tokeikun/items/6dff44237ccd119799af)という記事を公開した所、お陰様で1000View近く読んでいただくことができました。

引き続き家の中で行う作業をGoogle Home経由で行えるようにするべく、今回はルンバを操作出来るようにすることにしました

#前提
・Google Homeをもっていること
・Wi-Fi接続対応のルンバ(2017/12/30現在980・960・890・690が対応しています)
・iRobotアプリをDL済みなこと

#設定方法
まずはiRobotアプリからWi-fi設定を行いましょう。これはチュートリアルを進めていけば問題ないかとおもますので割愛します。

問題はGoogle Home(Assistant)とiRobotアプリの連携です。iRobotアプリからスマートホーム>Google Homeと進むと、Google Homeアプリ内でiRobotとを設定する様に促されます。しかしｍ実際にGoogle Homeアプリに行ってみるとiRobotやルンバは見つかりません。僕はここで小1時間ハマってしまいました。

そこで、改めて公式Webをググってみると実際にGoogle Homeに話しかける必要があるようです。

[Wi-Fi対応ルンバをGoogleアシスタントで設定する
](http://irobot-homesupport-ja-jp.custhelp.com/app/answers/detail/a_id/16368/~/wi-fi%E5%AF%BE%E5%BF%9C%E3%83%AB%E3%83%B3%E3%83%90%E3%82%92google%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)
>Google Homeアプリを起動し、Googleアクションがルンバを起動するよう「Ok Google, talk to Roomba。」とコマンドを出してください。

※上記の翻訳も微妙で実際には「Ok Google, ルンバと話す」で繋がります。実際、英語で何回かトライしていましたがGoogle Play Musicからルンバが流れてきました（笑)

実際Google Homeに話しかけてみると通知が来てGoogle Homeの設定を進める事ができます。無事認証が終われば「Ok Google,ルンバを使って掃除して」と言って掃除を開始することができます！

実際に操作している様子（画像クリックでデモ動画に飛びます)

[![Google Homeからルンバを動かしてみた](https://qiita-image-store.s3.amazonaws.com/0/42911/66449f4f-7fd3-abaf-b886-8162972593c1.jpeg)](https://youtu.be/RUK8GdMgVwA)
Raspberry Pi 3B + BluetoothスピーカでAmazon Alexaを安く構築（２　マイクで音を拾う）

[前章](https://qiita.com/onelittlenightmusic/items/05b262c60c4889c07ca9)の続きで、ラズパイをAmazon Echo化したいと思います。

# 本章：こんどはできるだけ安いマイクで音を拾いたい

### 購入品

- USBマイク 650円
 （下記の記事より高かったのは悔しいですが、同じことができそうです）

https://qiita.com/UedaTakeyuki/items/e2bda3a0b1d6e367e637

# まずは指す

上の記事にあるとおり、まずは指すだけで新しいデバイスが認識されます。

```
i@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 8086:0808 Intel Corp.
```

録音コマンドでカード番号、デバイス番号を調べます。

```
pi@raspberrypi:~ $ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

カード番号1, デバイス番号0です。

# 録音

amixerで録音音量を上げます。

```音量を上げる
$ amixer sset Mic 16 -c 1
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 16 [100%] [23.81dB] [on]
```

arecordで録音します。ビットレートは-fで指定します。Ctrl+cで録音中止します。

```
$ arecord -f S16_LE -D plughw:1,0 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 8000 Hz, Mono
^CAborted by signal Interrupt...
arecord: pcm_read:2031: read error: Interrupted system call
```

再生するとたしかに音が録音されています。

```
aplay test.wav
```

# マイクに関しての結論（購入時に注意）

今回購入したのはこちらのUSBマイクでした。
[USBマイク@Amazon](https://www.amazon.co.jp/BU-Bauty-%E3%81%84%E3%81%A4%E3%81%A7%E3%82%82%E3%81%A9%E3%81%93%E3%81%B8%E3%82%82%E6%90%BA%E5%B8%AF%E5%8F%AF%E8%83%BD%EF%BC%81%E4%B8%96%E7%95%8C%E6%9C%80%E5%B0%8FUSB%E3%83%9E%E3%82%A4%E3%82%AF-PC-Mac%E7%94%A8USB%E3%83%9E%E3%82%A4%E3%82%AF-%E8%B6%85%E5%B0%8F%E5%9E%8B-%E8%B6%85%E3%83%9F%E3%83%8B-22mmx18mmx5mm/dp/B01KZPF1U8/ref=zg_bs_2152017051_11?_encoding=UTF8&psc=1&refRID=XA2P81TRJD8KX041M1HC)

でも結果から言うと、最大音量に設定し結構大きな声でしゃべっても、1m離れると拾ってくれません。Amazon Echo本家を購入して使用した実績では4,5m離れても普通の声を拾ってくれることと比べるととてもおそまつです。
したがって、Amazon Echoを再現するという目的にはあまり適していなかったことが分かりました。

今回は30cm程離れたところから比較的声を張って、以降の検証を実施したいと思います。

# 次は

いよいよAmazon Voice Service (AVS)を入れて、「Alexa」と呼び掛けたいと思います。
NW.jsでRequest Headerを追加する

# まとめ
`chrome.webRequest.onBeforeSendHeaders` を使う。

# 本文
ブラウザからのアクセスと異なり、NW.jsを用いた場合、`Origin`などの一部のヘッダが付きません。
また、一部のヘッダはfetchやxhrでは変更不可能です。
そういったヘッダを操作したい場合、`chrome.webRequest.onBeforeSendHeaders`を使って、リクエストが送られる前に、ヘッダを追加できます。
下のコードでは、requestb.in向けのリクエストにhttps://test.example.com/ をOriginヘッダとして設定しています。

```js
function addOriginHeader(e) {
    e.requestHeaders.push({
        name: 'Origin',
        value: 'https://test.example.com/',
    });

    return {requestHeaders: e.requestHeaders};
}

chrome.webRequest.onBeforeSendHeaders.addListener(
    addOriginHeader,
    {urls: ['https://requestb.in/*']},
    ["blocking", "requestHeaders"]
);
```
このコードを加えてfetchなどを飛ばしてみると、下の画像のようにOriginヘッダが追加されているのが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152858/d6302a43-fc97-f30b-9743-66382dbaca8a.png)
しかし、https://developer.chrome.com/extensions/webRequest にあるように、一部のヘッダは使えないようです。
UbuntuでNode.jsをポート80で動かす

### 前提条件
- Ubuntu16.04
- Node.jsとnpmは既に入っている

### 本文

スーパーユーザーで起動させれば動きます。
が、気持ち悪いのでNginxでプロキシしませう。:v:

↓こちらのすばらしい記事を参考に最新版のNginxをインストールしてくださまし。
[Ubuntuに最新のnginxをインストールする](https://qiita.com/hiroq/items/420424bc500d89fd1cc8)

そしたらば、Nginxのconfファイルをつくるーー
`/etc/nginx/conf.d`にあるconfファイルは`/etc/nginxnginx.conf`の中で`include /etc/nginx/conf.d/*.conf;`みたいな感じでインクルードされるのです。詳しくはぐぐってください〜〜（https対応するときはちょっと弄らないとけないですーーー:innocent:）

```shell
$ cd /etc/nginx/conf.d
$ sudo vi node-app.conf # 内容は下にあるよ！
$ sudo mv default.conf default.conf.origin
```

Node.jsのアプリへプロキシするための設定`node-app.conf`ファイルここんな感じでつくっって、最初からある`default.conf`は`default.conf.origin`名前を変えて一応置いておきます。（念のためね！:yum:）


```text:node-app.conf
upstream node-app {
    server localhost:8080;
}

server {
    listen       80;
    server_name  example.com;
    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    location / {
        proxy_pass http://node-app/;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   /usr/share/nginx/html;
    }
}
```

そしたらNginxを再起動しますーーーー

```shell
$ sudo nginx -s reload
```
はい、これでNode.jsで作ったアプリをポート8080で動かせば80で動きますーーーー！！！
完璧です！！:laughing:
ufwでポート制限している人は忘れず80だけ開けておきましょう！8080は開けなくても大丈夫です！:sparkles:

```shell
$ sudo ufw allow 80
```

## おまけ
はい！でもNode.jsのアプリはプロセスなので死ぬかもしれないので一応デーモン化しておきましょーー。[forever](https://github.com/foreverjs/forever)を使います！インストールは以下！

```shell
$ sudo npm install -g forever
```

そうですNode.jsでNode.jsをデーモン化するツールです！なんか気持ち悪いですね！
でもそんなの関係ない！便利なので使っちゃえーーーっ！！:lollipop:

```shell
$ forever start app.js
```

こんな感じで起動させましょー！環境変数も問題なく起動時につっこめます！

```shell
$ HOGE=hage forever start app.js
```

以上ですおわりです！！！！！！！かんたんーーー:smile::beer::beer:
（備忘録です）

## 参考
[NginxからNode.jsへリバースプロキシする](http://keruuweb.com/nginx%E3%81%8B%E3%82%89node-js%E3%81%B8%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%99%E3%82%8B/)
astropyで初日の出の時間を計算する🌅

日の出の時間は大気中の光の屈折や、太陽の視半径にも影響を受けるが、これらのパラメータは適当な定数とした。

```python3
import astropy.coordinates
import astropy.units as u
from astropy.coordinates import EarthLocation, AltAz
from astropy.time import Time
from datetime import datetime
from scipy import optimize

tt = EarthLocation(lat=35.6585 * u.deg, lon=139.7455 * u.deg, height=250 * u.m)

def alt(timestamp):
    t = Time(timestamp, format='unix')
    sun = astropy.coordinates.get_sun(t)
    return sun.transform_to(AltAz(obstime=t, location=tt, pressure=1013 * u.hPa)).alt / u.deg + 16 / 60

hinode = optimize.bisect(alt, datetime(2018, 1, 1).timestamp(), datetime(2018, 1, 1, 9).timestamp())
print(datetime.fromtimestamp(hinode))
```
結果。

```
2018-01-01 06:52:44.560696
```
これで安心して寝ていられる。🎍

* [Astropy](http://www.astropy.org/)
numpy.put and numpy.random.choice

```python
print(np.random.choice(5, 3))
print(np.random.choice(5, 3, replace=False))
n = 10
p = 3
Z = np.zeros((n,n))
r = range(n*n)
t = np.random.choice(r, p, replace=False)
print(r, t)
np.put(Z, t, 1)
print(Z)
```
```
[2 4 3]
[1 3 0]
range(0, 100) [64 37  3]
[[ 0.  0.  0.  1.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
```
# Refs.
* [numpy.random.choice](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.random.choice.html)
* [numpy.put](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.put.html)
Rのprop.testを読んで、jsで書いてみる

A/Bテストの評価で用いる二群の比率の差の検定のprop.testが実際にどのようなアルゴリズムで動いているか調べてみました。

### 結論

高校生で勉強する母比率の信頼区間推定にイェイツの修正を加えて実装されています。

### p-Valueの計算

prop.testでは、A/Bテストで用いる2つの母集団の比較に加えて、1も2より大きいものもサポートされています。
ただ今回は簡略化のために、2母集団比較のみ考慮して計算しています。

そのままprop.testを実行すると以下のようになります。

``` R
> x=c(20, 44)
> n=c(40, 80)
> prop.test(x, n)

	2-sample test for equality of proportions with continuity correction

data:  x out of n
X-squared = 0.10463, df = 1, p-value = 0.7463
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.2582061  0.1582061
sample estimates:
prop 1 prop 2 
  0.50   0.55 
```

では、実際にはどのような処理をしているかと言うと、以下のような処理をしています。

``` R
p <- sum(x)/sum(n)

x <- cbind(x, n - x)
E <- cbind(n * p, n * (1 - p))

ESTIMATE <- x/n

DELTA <- ESTIMATE[1L] - ESTIMATE[2L]
YATES = 0.5
YATES <- min(YATES, abs(DELTA)/sum(1/n))

STATISTIC <- sum((abs(x - E) - YATES)^2 / E)
PVAL <- pchisq(STATISTIC, 1, lower.tail = FALSE)
```

ざっくり言うと、実際のデータは、理論的に計算するよりも信頼区間をある程度大きめにとった方が正しく補正できると言うことで処理しています。

### 実際にどのくらい補正されているのか

YATES-correctionの補正はcorrectと言う引数を使い分けることで違いを確認できます。
以下の例では、p-valueは0.24と0.20と0.04ほど変化がありました。
仮に母集団の数で比較するとだいたい8%ほど補正することで多くのnが必要になるくらいの補正でした。

``` R
x = c(80, 50)
n = c(2000, 1000)

prop.test(x, n)
=> p-value = 0.2408

> YATES => 0.5
> prop.test(x, n, correct=FALSE)
=> p-value = 0.2048

xx=2.4;prop.test(x*xx, n*xx, correct=FALSE)
=> p-value = 0.04946
xx=2.6;prop.test(x*xx, n*xx)
=> p-value = 0.04705
```

### BigQuery上で実行する方法

今回の実装をそのままjsで書き換え、BigQuery上で実行するには、以下のようになります。

```
CREATE TEMPORARY FUNCTION prop_test(x_1 FLOAT64, x_2 FLOAT64, n_1 FLOAT64, n_2 FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """

  p = (x_1 + x_2)/(n_1 + n_2)
  yates = 0.5
  diff = Math.pow((Math.abs(x_1 - n_1 * p) - yates), 2)
  statistic = diff/(n_1*p) + diff/(n_1*(1-p)) + diff/(n_2*p) + diff/(n_2*(1-p))

  return 1 - jStat.chisquare.cdf(statistic, 1);
"""
OPTIONS (
  library="gs://#{project_name}/jstat.js"
);

SELECT
  prop_test(20, 44, 40, 80)

=> 0.24078852577936793
```

### 参考URL
高等学校数学C/統計処理
https://ja.wikibooks.org/wiki/%E9%AB%98%E7%AD%89%E5%AD%A6%E6%A0%A1%E6%95%B0%E5%AD%A6C/%E7%B5%B1%E8%A8%88%E5%87%A6%E7%90%86
イェイツのカイ二乗検定
https://bellcurve.jp/statistics/course/9122.html
ElmでDoctest

ElmでDoctestするには以下のどちらかのライブラリを利用します。

- [elm-verify-examples](https://github.com/stoeffel/elm-verify-examples)
- [elm-doctest](https://github.com/tshm/elm-doctest)

今回は[elm-doctest](https://github.com/tshm/elm-doctest)を利用してElmでDoctestしてみます。

## インストール

下記のコマンドでプロジェクトにインストールします。

```
npm install elm-doctest
```

あるいは、

```
yarn add elm-doctest
```

## テストコマンドを作る

~~さて、elm-doctestはプロジェクトローカルにインストールした場合、`node_modules/.bin/elm-doctest`で動作させることができません。~~[^1]
[プロジェクトローカルで動かせるようにするプルリク](https://github.com/tshm/elm-doctest/pull/16)出したらマージされてました。

何れにせよ、`node_modules/.bin/elm-doctest`などというコマンドは自分で打つには長すぎますので、npmのscript機能を利用してdoctestを実行出来るようにします。[^2]

```diff:package.json
　　{
+ 　　"scripts": { "test": "node ./node_modules/elm-doctest/src/main.js ./src/**/*.elm" }
　　}
```

## Doctestを書く

elm-doctestではテストコードをdoccomment内に`>>> [code]`と記述し、次の行にその結果を書くことで動作させることが出来ます。

テストコードになる部分はドキュメンテーション時にコードブロックになるようにインデントを下げて書いておいたほうが良いです。

```elm
module Sample exposing (..)

{-| テストサンプル

利用例:

    >>> test "OK"
    "OK"
-}
test : String -> String
test text =
    text
```

## 実行する

ここまで出来たら下記のコマンドで実行出来ます。

```
npm test
```

[^1]: 少なくとも`ver0.3.6`では動作しません。
[^2]: このサンプルコードはElmのソースコードが`./src`以下に置かれていることを前提としています。
オープンソースのPYTHONプロジェクト 5選 [12/24~12/30]

GitHubで公開されているオープンソースの人気PYTHONプロジェクトを紹介していきます🌟
![uw96n9qkc1gau6fxmwdp.png](https://qiita-image-store.s3.amazonaws.com/0/200848/61460d86-c3e8-16b6-1fc0-07a36e9c588e.png)


# No.1
#### [wangshub / wechat_jump_game](https://github.com/wangshub/wechat_jump_game)  
![th_091749.jpg](https://qiita-image-store.s3.amazonaws.com/0/200848/37f2d664-88c2-ee4a-39d3-5c849f5b455e.jpeg)
https://wangshub.github.io/
Star:809🌟 

# No.2
#### [gaojiuli / toapi](https://github.com/gaojiuli/toapi)  
![15275188.png](https://qiita-image-store.s3.amazonaws.com/0/200848/6d086553-4558-6b78-fe79-3bb3f9b8bdd9.png)
すべてのウェブサイトはAPIを提供しています。
Star:1,321🌟

# No.3  
#### [zhoubear / open-paperless](https://github.com/zhoubear/open-paperless) 
![34585812.png](https://qiita-image-store.s3.amazonaws.com/0/200848/e99f2042-8b83-c920-b3d7-8a0a279ec712.png)
すべての紙文書をスキャンし、索引付けし、アーカイブする。
Star: 1,563🌟


# No.4  
#### [rockyzhengwu / FoolNLTK](https://github.com/rockyzhengwu/FoolNLTK)
![10402091.jpeg](https://qiita-image-store.s3.amazonaws.com/0/200848/e583afe4-f06b-20ab-8b93-e19d57b149ec.jpeg) 
中国語自然言語ツールキット
Star:543🌟

# No.5  
#### [sb2nov / mac-setup](https://github.com/sb2nov/mac-setup) 
![intro.gif](https://qiita-image-store.s3.amazonaws.com/0/200848/1919f65b-3c1c-24ef-40a2-f8d82a3b3ae3.gif)
 
Mac OS Xでの開発環境のインストール    
Star: 3,523🌟

---

Curated by [Boostnote](https://boostnote.io/ja)  
[GitHub](https://github.com/BoostIO/Boostnote/)
[Twitter](https://twitter.com/Boostnoteapp)
[Facebook](https://www.facebook.com/groups/boostnote/?multi_permalinks=1618637234825542&notif_t=group_activity&notif_id=1505699920621882)
俺のターミナルはかわいい

[お前らのターミナルはダサい](https://qiita.com/kinchiki/items/57e9391128d07819c321)という一年前の記事が人気記事にいたのでかわいいターミナルをお見せします。

![Screenshot from 2017-12-30 18-39-42.png](https://qiita-image-store.s3.amazonaws.com/0/140543/bd8723dc-fc21-8714-c169-f913419319a6.png)

はい。こんな感じです。どやっ！

しょぼんくんとしゃきんくんがコマンドの成功、失敗を教えてくれます。一番右の大カッコはgitの状態を表します。

## 解説

```
OS: Ubuntu16.04(Unity)
Terminal: GNOME Terminal emulator
```

## 色一覧

```
Text:       #FFBAD2
BackGround: #5C604D
Red:        #F20056
Green:      #9AFF7A
Blue:       #80BDCC
```

## ソースコード(zsh)

```zsh
SHOBON=$'\(´･ω･\`%)'
SHAKIN=$'\(\`･ω･´%)'

#prompt
PROMPT='%(?.%F{blue}$SHAKIN.%F{red}$SHOBON) %f %B%F{green}%n@%M%f%b: (%F{blue}%D %*%f) [${vcs_info_msg_0_}]
%B%F{green}%~%f%b $ '
PROMPT2='%B%F{green}%_%f%b> '
```

しょぼんとしゃきんのエスケープシークエンスについては、[この記事](https://qiita.com/aimof/items/b523fdd4181075609aa0)にまとめました。このころのプロンプトは色が揃ってなくてダサいです。

### gitの表示

```zsh

autoload -Uz vcs_info
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{blue}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{gleen}+"
zstyle ':vcs_info:*' formats "%F{white}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd () { vcs_info }
```

gitのカッコが二重になっているのははじめはミスでしたが気に入ったのでそのままにしています。

## Font

```
Source Han Code JP
```

## まとめ

ターミナルが可愛くなるとやる気が上がりますね。個人的には赤の色がいまいち気に入っていないのでもう少し調整します、そのうち。

（ちなみに普段はnvimを使うため[iceberg](https://github.com/cocopon/iceberg.vim)を眺めている時間のほうが長い）

![Screenshot from 2017-12-30 18-55-27.png](https://qiita-image-store.s3.amazonaws.com/0/140543/b8f8bcd3-4705-1ecf-b26b-4eb54338bdcb.png)

しゃきんが並ぶと気分が良くなりますがどちらかといえばしょぼんの方が好きです。

### 追記

一つ言い忘れてました。__見づらいです__。
Djangoで"Hello World"を表示するまで②

<https://qiita.com/TsubasaTakagi/items/59b4eef258acb64cc113#_reference-cfaaaf44b64252b5e014>の続き

ここからは、実際にwebページに"Hello World!"と表示させるコードを記述していく

# viewの記述

まず、django.httpというパッケージからHttpResponseクラスをimportします。

```views.py
from django.http import HttpResponse
```

「django.httpという便利箱から、HttpResponseという便利グッズを使いますと宣言している」と理解しておけば大丈夫でしょう。

HttpResponseの役割としてとは、ページに文字列を引き渡したり、文字列を表示させたりします。

そして、

```views.py
def index(request):
    return HttpResponse("Hello World! このページは投稿のインデックスです。")
```

と追記することで、先ほどimportしたHttpResponseを使い、文字列を返すように定義する。

# ルーティングファイルの設定

文字列を表示する部分は作成したので、次はユーザーがページにアクセスしたときに、どのviewを返すかを記述してあげる。
そのためには、プロジェクトにurlを渡された時と、アプリケーション内でurlを渡された時との2通り書かなければなりません。

まず、アプリケーション内にurlを渡されたとき。

postsディレクトリにurls.pyというファイルを新しく作ってください。
そのpostsの中に作ったurls.pyに

```urls.py
from django.conf.urls import url
```

と記述してあげる。これは先ほどと同様、「django.conf.urlsというパッケージという名の便利箱からurlというグッズをしようします」という意味です。**(postsというアプリケーション内のurl.pyであることに注意）**

次に、以下のように書いてあげる。

```urls.py
from . import views
```

これは、同じディレクトリ階層（"."は同じ階層を表す）の中のviews.pyというファイルを読み込みますという宣言である。

これらを記述したら、

```urls.py
urlpatterns = [url(r'^$',views.index, name = 'index')]
```

と同ファイルと書くことで、ユーザーが渡してきたurlがアプリ内でどのファイルを読み込むべきかを記します。

コードの意味としては、**r''**の部分に記述したurlが渡された時に、**views**ファイルの中の、**index**というクラスを実行してください、というふうに書かれている。
**^$**は、正規表現と言うのだが、ややこしくなるのでここでは、「特にurlの指定がなければ」という意味だと理解してください。つまり、urlになにも書かれていないときの書き方が、**^$**なのである。

これでアプリケーションのurl指定は終わり。次はプロジェクトのurl指定のとき、
今度はプロジェクトのurlなので、**myblogappというプロジェクト内のurls.py**に書き込む。

```urls.py
from django.conf.urls import url
```

という行を

```urls.py
from django.conf.urls import include, url
```

とincludeを追加してあげる。これは他のファイルを使う時に必要な表記である。

そして、

```urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
]
```
という部分に先ほどと同様に、urlパターンを書いていく。

```urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^posts/', include('posts.urls')),
]
```

これでプロジェクトのurlの定義も終わったので、サーバーを立ち上げて
<http://127.0.0.1:8000/posts/>にアクセスすると、

<img width="1440" alt="スクリーンショット 2017-12-30 18.28.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/cf4ad4e9-9598-94eb-4d13-28819d9d03ba.png">

期待通り、Hello World!が表示されるようになる。

###### 以下、読まないこと

//要確認（わからなかった部分）

```views.py
def index(request):
    return HttpResponse("Hello World! このページは投稿のインデックスです。")
```
?????引数のrequestのとは？？？？？

```urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^posts/', include('posts.urls')),
]
```
?????includeってなに?????
tkinterにDataFrameのグラフを表示する

卒研が大変なito.ur.rightです。
睡眠に関するものは実験が大変です。

筋電とか心電に睡眠状態のラベルづけを行いたいので、それ用にプログラムを書くことに。
Tkinterとpandasを用いて、DataFrameのグラフを見ながらGUIを用いてラベル付けできるwindowを表示したい。
しかし、Tkinterで調べるとmatplotlibとの組み合わせしか出でこず、DataFrameはどうしたらいいのかわからない。
色々見ていると、Tkinterのcanvasに渡すFigureのsubplotをplot関数に引数として渡すとできる気がする。

```python3:test.py

import matplotlib
matplotlib.use('TkAgg')

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import tkinter
import pandas as pd

def readyCsv(name):
    df = pd.read_csv('data/'+name+'.csv',encoding="Shift-JIS",low_memory=False)
    df = df.fillna(0)
    df = df[2:].astype(float)
    return df

def makeFigure(df,root):
    #Tkinterに表示させるFigureを生成
    fig = Figure(figsize=(20, 6), dpi=100)

    #Figureにsubplotを追加
    ax1 = fig.add_subplot(3,1,1)
    ax2 = fig.add_subplot(3,1,2)
    ax3 = fig.add_subplot(3,1,3)
    
    #気にしないゾーン
    start = (count*10000)
    end = ((count+1)*10000)
    df = df[start:end]

　　　　　　　　#plot関数の引数に"ax=ax1"を入れる
    #すると、figのax1にdfが表示される
    df.plot(ax=ax1,  **cargs)


    #tkinterに追加するcanvasにfigを追加する
    canvas = FigureCanvasTkAgg(fig, master=root)
    canvas.get_tk_widget().pack(side=tkinter.BOTTOM, expand=0)
    canvas._tkcanvas.pack(side=tkinter.BOTTOM, expand=0)
    canvas.show()

if __name__ == '__main__':
    #CSVを読み込んでます
    df = readyCsv(name)
    #plotの設定
    cargs = {'linewidth':'0.5','kind':'line', 'use_index':True}
    
    for count in range(0, int(df.shape[0]/10000)-1):
        root = tkinter.Tk()#tkinter生成
        root.title(str(int(count*20/60))+"分"+str(count*20%60)+"秒")
        makeFigure(df,root)


        root.mainloop()

```
やったらできました。
#参考ページ
[Tkinterでグラフを描画して、ボタンをクリックする度にグラフを更新する](https://teratail.com/questions/101723)
勉強会の振り返り

2016/1/9に開催された、第76回 Cocoa勉強会 関東 以降の勉強会について、調べてみました。
来月の勉強会で、31回開催となりますので、Cocoa勉強会としては、第107回ということになるようです。
二月にBUKURO.swiftを考えているのですが、それは百八つ、ですね。

* 2016/03/17(木) Cocoa Study at Shibuya #1
* 2016/04/14(木) Cocoa Study at Shibuya #2
* 2016/06/27(月) Cocoa Study at Ikebukuro #1
* 2016/07/25(月) Cocoa Study at Ikebukuro #2
* 2016/08/29(月) Cocoa Study at Ikebukuro #3
* 2016/09/26(月) Cocoa Study at Ikebukuro #4
* 2016/10/02(日) Cocoa Study at Matudo #1
* 2016/11/14(月) Cocoa Study at Ikebukuro #5
* 2016/11/19(土) Cocoa Study at Matudo #2
* 2016/12/05(月) Cocoa Study at Ikebukuro #6
* 2017/01/16(月) Cocoa Study at Ikebukuro #7
* 2017/01/28(土) Cocoa Study at Matudo #3
* 2017/02/06(月) Cocoa Study at Ikebukuro #8
* 2017/02/18(土) Cocoa Study at Matudo #4
* 2017/03/06(月) Cocoa Study at Ikebukuro #9
* 2017/03/25(土) Cocoa Study at Matudo #5
* 2017/04/03(月) Cocoa Study at Ikebukuro #10
* 2017/05/08(月) Cocoa Study at Ikebukuro #11
* 2017/05/27(土) Cocoa Study at Matudo #6
* 2017/06/05(月) Cocoa勉強会 BUKURO.swift #12
* 2017/06/24(土) 関東swift勉強会2017-6
* 2017/07/03(月) Cocoa勉強会 BUKURO.swift #13
* 2017/07/22(土) 関東swift勉強会2017-7
* 2017/09/04(月) Cocoa勉強会 BUKURO.swift #14
* 2017/09/23(土) 関東swift勉強会2017-9
* 2017/10/02(月) Cocoa勉強会 BUKURO.swift #15
* 2017/10/20(金) 関東swift勉強会2017-10
* 2017/11/01(水) BUKURO.swift 2017-11
* 2017/11/22(水) 関東swift勉強会2017-11
* 2017/12/06(水) BUKURO.swift 2017-12
* 2018/01/19(金) 関東swift勉強会2018-01

### 関連情報
* <a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
* <a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
* <a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

####【Cocoa練習帳】
* <a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
* <a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
* <a href="https://t.co/6P3h2jtbRk>note</a><br />
* <a href="https://qiita.com/m_yukio>Qiita</a><br />
最新タイプ m5 / c5 インスタンスと旧タイプの性能比較

re:Invent 2017 で EC2 に新しいインスタンスタイプがリリースされたので、よく使いそうな m5 と c5 の UnixBench を測ってみました。

いずれのインスタンスタイプもまだ東京（ap-northeast-1）では使えないので、オレゴン（us-west-2）での測定です。

また純粋にミニマム環境での違いを知りたかったので、インスタンス設定はすべて Web Console から起動させる際のデフォルト値のままにしています。

# AMI: ami-bf4193c7
現時点で最新の Amazon Linux イメージです。

- Amazon Linux
- 米国西部オレゴン
- HVM（SSD）EBS-Backed 64 ビット

# 測定したインスタンスタイプ
自分が一番良く使いそうな、large 系で揃えてみました。

冒頭にも書きましたが、インスタンス設定はすべて Web Console から起動させる際のデフォルト値のままにしていますので、例えば IOPS 性能の高いストレージを割り当てたりすると、より顕著な差が出る可能性があります。

- t2.large (T2 Unlimited)
- m4.large
- m5.large
- c4.large
- c5.large

# 結果
![ec2-us-west-2-unixbench.png](https://qiita-image-store.s3.amazonaws.com/0/108961/de026a3c-800d-65ed-f1a7-8332ee1eee72.png)

m5 / c5 系のパフォーマンスの良さが際立っています。m5.large が m4.large だけでなく c4.large も完全に上回っていて、CPU とメモリのバランスを考えると今後のメインプレイヤーとして使っていけそうです。

T2 Unlimited を有効化した t2.large の性能もなかなか無視できないようですが、t2 系は EBS Optimized でないので、実際に大量のアクセスを受けながらの処理だと足回りが大きなボトルネックになりそうです。（この点は追って測定してみたい）

# まとめ
東京リージョンに新しいインスタンスタイプはやく！
TITAN V で ZCash をマイニングする(2017/12/30 時点 680 Sol/s @ 123 W)

<img width="960" alt="Screen Shot 2017-12-30 at 17.15.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/b8d79f7c-49f8-2b0f-2b1d-88cfffcc96b9.png">

漢なら, TITAN V でレイトレーシングや機械学習しつつ, 空いた時間に仮想通貨のマイニングしたいですね!

やりましょう!

## 環境

* 64bit Ubuntu 16.0.3 LTS
* Intel 内臓 GPU などで画面表示をするものとする(TITAN V からは画面出力は行わない) 

すでに既存 NVIDIA GPU(1080 など) で Ubuntu + CUDA 9.1 環境を整えているものとします. 

## ドライバをインストールする

2017/12/30 日時点では, CUDA のページからインストールできる CUDA 9.1 apt パッケージでは TITAN V に対応していないので, Ubuntu 16.04 の ppa を使ってインストールします(2017/12/30 時点 387.34 が最新)

https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa

```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
```

ppa 以外(local run installer など)で CUDA/NV driver 環境を整えている場合は, CUDA runtime と driver のバージョン不一致が起こるかもしれませんので, 
 一旦アンインストールし, apt/dpkg + ppa ベースで再度インストールするとよいかもしれません.
 
```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.34                 Driver Version: 387.34                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Graphics Device     On   | 00000000:01:00.0 Off |                  N/A |
| 49%   69C    P2   123W / 125W |   1029MiB / 12058MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+
```

ドライバができたてほやほやなのか, GPU の名前が `Graphics Device` となってしまいましたが, とりあえず認識されました.

## Zcash をマイニングする.

EWBF 0.3.4b を使います.


https://bitcointalk.org/index.php?topic=1707546.0

<img width="489" alt="Screen Shot 2017-12-30 at 17.17.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/552fc69e-9145-6297-7897-82bd89064316.png">



Cool!

TITAN V の消費電力は 250W ですが, マイニングプログラムを回しても 120 ~ 130 W くらいしか消費しませんでした. GPU 温度は 69 度でした.

Pascal 系では 4 Sol/W が限界だった(1080 Ti が 150W に powerlimit で 600 Sol/s, 1070 が 100W に powerlimit で 380 ~ 400 Sol/W)ので, 電力効率は着実に向上していますね.

## TODO

* Ethash, Lyra2REv2 などの他のアルゴリズムを試す.
* TensorRT を利用しマイニングを最適化してくれる優秀な若人を探す旅に出たい.
* 漢の 120 回無金利ローンで TITAN V を手に入れる財務スキームを確立したい.
[Tensorflow] Tensorflow API 1.5.0

# Release 1.5.0

## Breaking Changes
* Prebuilt binaries are now built against CUDA 9 and cuDNN 7.
* Our Linux binaries are built using ubuntu 16 containers, potentially
  introducing glibc incompatibility issues with ubuntu 14.
* Starting from 1.6 release, our prebuilt binaries will use AVX instructions.
  This may break TF on older CPUs.

## Major Features And Improvements
* [Eager execution](https://github.com/tensorflow/tensorflow/tree/r1.5/tensorflow/contrib/eager)
  preview version is now available.
* [TensorFlow Lite](https://github.com/tensorflow/tensorflow/tree/r1.5/tensorflow/contrib/lite)
  dev preview is now available.
* CUDA 9 and cuDNN 7 support.

## Bug Fixes and Other Changes
* `auto_correlation` added to `tf.contrib.distributions`.
* Add `DenseFlipout` probabilistic layer.
* Restandardize `DenseVariational` as simpler template for other probabilistic layers.
* Make `tf.contrib.distributions` QuadratureCompound classes support batch.
* `Stream::BlockHostUntilDone` now returns Status rather than bool.
* Customize request timeouts for the GCS filesystem.
RISC-Vソースコード読書会(4)

###BTB###
最後に残ったのがBTB(Branch Target Buffer)である。分岐先バッファとは、そのネーミングから分岐先命令キャッシュとの印象を持っていたが、一般には分岐元アドレスをタグにし、分岐先アドレスを引くキャッシュのようである。であれば、ネーミングとしてはBAC(Branch Address Cache)等にしたほうが誤解が少ないように思う。実際にBTAC(Branch Target Address Cache)という用語もあるようだ。図のほうが理解しやすいので回路図から見てみよう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223298/7b0d6630-6580-bb14-109c-86900e825307.png)

基本的にBIA(分岐命令アドレス)とBTA(分岐先アドレス)を格納する1R1WのRAMがインスタンスされている。

```verilog
`include "constants.vh"
`default_nettype none
module btb(
	   input wire 		       clk,
	   input wire 		       reset,
	   input wire [`ADDR_LEN-1:0]  pc,
	   output wire 		       hit,
	   output wire [`ADDR_LEN-1:0] jmpaddr,
	   input wire 		       we,
	   input wire [`ADDR_LEN-1:0]  jmpsrc,
	   input wire [`ADDR_LEN-1:0]  jmpdst,
	   input wire 		       invalid2
	   );

   wire [`ADDR_LEN-1:0] 	  tag_data;
   reg [`BTB_IDX_NUM-1:0] 	  valid;
```
512bitのバリッドビットが実装されている。

```verilog
   wire [`BTB_IDX_SEL-1:0] 	  waddr = jmpsrc[3+:`BTB_IDX_SEL];
   wire [`ADDR_LEN-1:0] 	  pc2 = pc+4;
   
   wire 			  hit1 = ((tag_data == pc) && valid[pc[3+:`BTB_IDX_SEL]]) ? 
				  1'b1 : 1'b0;
   wire 			  hit2 = ((tag_data == pc2) && ~invalid2 
					  && valid[pc[3+:`BTB_IDX_SEL]]) ? 1'b1 : 1'b0;
   assign hit = hit1 | hit2;
```
PCがタグデータ(分岐元アドレス)と一致し、かつPCでバリッドビットを引き、バリッドであればhit1をtrueとする。PC+4のアドレスがタグデータ(分岐元アドレス)と一致し、かつPCでバリッドビットを引き、バリッドであればhit2をtrueとする。hit信号はhit1またはhit2がtrueのときにtrueとする。

ところで、妙な記法があることにお気づきだろうか。PCの3ビットオフセットのビット切り出しを行っているが、これはプラスコロンという配列表記法のようで、以下で説明を見つけた。
https://stackoverflow.com/questions/18067571/indexing-vectors-and-arrays-with/18068296#18068296
PC[3+:9]という表記は、コロンの左が開始ビット(+)あるいは終了ビット(-)であり、コロンの右側は常にビット幅とのこと。この場合は3ビット目から9ビットを切り出す、つまりPC[3+9-1:3]=PC[11:3]ということになる。

```verilog
   always @ (negedge clk) begin
      if (reset) begin
	 valid <= 0;
      end else begin
	 if (we) begin
	    valid[waddr] <= 1'b1;
	 end
      end
   end
```
これはバリッドビットの制御ロジックである。バリッドビットはリセットでクリアされ、外部からのweのアサート時に、waddrの示すvalidをtrueとする。weはどこから来るかといえば、ROB(リオーダバッファ)の分岐コミット信号のようである。

```verilog
   ram_sync_1r1w #(`BTB_IDX_SEL, `ADDR_LEN, `BTB_IDX_NUM) bia
     (
      .clk(~clk),
      .raddr1(pc[3+:`BTB_IDX_SEL]),
      .rdata1(tag_data),
      .waddr(waddr),
//    .wdata(jmpsrc[31:3+`BTB_IDX_SEL]),
      .wdata(jmpsrc),
      .we(we)
      );

   ram_sync_1r1w #(`BTB_IDX_SEL, `ADDR_LEN, `BTB_IDX_NUM) bta
     (
      .clk(~clk),
      .raddr1(pc[3+:`BTB_IDX_SEL]),
      .rdata1(jmpaddr),
      .waddr(waddr),
      .wdata(jmpdst),
      .we(we)
      );
        
endmodule // btb
```
前述のとおりBIA(分岐命令アドレス)とBTA(分岐先アドレス)を格納する1R1WのRAMのインスタンス。

読書会(5)はこちら
https://qiita.com/mocapapa/private/eb736d6b936b6c9c8e22