OmniAICreator/Qiita-1.07M huggingface dataset:
【VR学まとめ】2.3 聴覚

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の7日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の2章「ヒトと感覚」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 2 ヒトと感覚

## 2.3 聴覚

### 2.3.1 聴覚系の構造

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35353336352f66396363333636312d633332332d346239372d656437662d3131326361343465343539302e6a706567.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/ecfeb698-408b-d014-a53a-c0ec3117a931.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- 外耳
    - 耳介
    - 外耳道
        - 媒質は主に空気
    - 音源の空間的位置を特定するのに役立つ
- 中耳
    - 鼓膜
        - 外耳道の振動を耳小骨に伝える
    - 耳小骨
        - 振動を蝸牛に伝える
    - 中耳は外耳と内耳のインピーダンスマッチングを行っている
        - 抵抗の違いの差異をなくすこと？
        - 外耳はインピーダンスの低い空気、内耳はインピーダンスの高い液体、中耳は両方というイメージ
- 内耳
    - 蝸牛(かぎゅう)
        - 基底膜が蝸牛管を上下に分けている
        - 入り口から頂に向かって有毛細胞が生えていて、振動を神経信号に変換する
        - 入り口側は高い周波数を、頂ほど低い周波数を担当している
        - 人工内耳は20数個の電極列で音を聴神経に伝達する
        - 有毛細胞は位相固定も行う
        - つまり周波数と位相で二重に符号化している
    - 前庭
    - 半規管

### 2.3.2 聴覚の問題と音脈分凝(音源分離)

聴覚では複数の音源が重畳された振動を知覚する
音源の推定は、推定する次元に対して利用可能な次元が少ないため、原理的には不可能

伝達路を伝わる物理的条件や、経験を通じた制約条件などから音源の推定を行っている。
(異なる音は同時刻になり始めない、周波数帯が完全に重なることはない、など)

- 音脈
    - 時間条件、周波数条件、空間的条件などによって一つの音脈として知覚されること
- 音脈分凝(おんみゃくぶんぎょう)
    - 音脈を知覚するパラダイム

### 2.3.3 聴覚による高さ、大きさ、音色、時間の知覚

このサイトおすすめです
http://www.kecl.ntt.co.jp/IllusionForum/index.html

**音の高さの知覚**

- ハイト(height)
    - 正弦波において周波数が大きいほど高く感じられること
    - 蝸牛の場所の符号化による
- クロマ(chroma)
    - 2倍(オクターブ)の関係にある周波数同士が等価に感じされること
    - 蝸牛の位相固定の符号化による
- 複合音
    - 基本音と倍音(harmonics)から構成される
    - 複数の帯域に周波数成分が存在するが基本音周波数に対する知覚を得られる
    - 基本音が欠けていても近くできる(missing fundamental)

**音の大きさの知覚**

![800px-Lindos1.svg.png](https://qiita-image-store.s3.amazonaws.com/0/55365/327ce092-553b-2e49-d33b-c6ed84da9407.png)
引用元: https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Lindos1.svg/800px-Lindos1.svg.png?1545239631667

- 正弦波において振幅が大きくなるほど音も大きく感じる
- 可聴域は20Hz-2kHz
- 4000Hzをピークに、高周波側低周波側で感度が下がる(上図)
    - 感度差は最大で80dB
- エンヴェロープ
    - 振幅の時間的変動
    - 急激に立ち上がって立ち下がる衝撃音は、定常的な音より大きく知覚される
- 音色
    - 同じ大きさと高さを持った2音が異なって聞こえた場合、それは音色による違い、という定義
    - 同じ音程を演奏した楽器は音色が違う、など
    - エンヴェロープに依る部分もある

**聴覚の時間解像度**

- 時間解像度は2-3ms
    - 視覚は30hzなのに対して非常に高い
- 時間積分が出来るのは200ms程度
- 両耳間時間差は6μs(microsecond)(めちゃめちゃ短い)

### 2.3.4 聴覚による空間知覚

- 両耳間差
    - 両耳間レベル差
        - 音源と反対側の音が小さくなる
    - 両耳間時間差
        - 音源と反対側の音が遅れる
        - 水平方向なら1°の精度で弁別可能
            - ただ現実はそんなに綺麗な状況だけじゃないので不十分
- 頭部伝達関数
    - HRTF(Head Related Transfer Function)
    - 頭部や耳介音を遮ることによって変化するスペクトルパタンのこと
    - 前方への定位は難しい
    - 前後の間違いも起こりやすい
    - 単なるステレオ録音をヘッドフォンで聴くと、音は頭蓋内に定位する

# まとめ

音が知覚される流れや仕組み、聴覚が何をどの程度判別出来るかを知ることが出来ました。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の8日目は[【VR学まとめ】2.4 体性感覚・内臓感覚](https://qiita.com/nkjzm/items/b8ca0a4223e2bcc69ba6)です。
LaravelでDBから取ってきたデータの中に指定したキーと値の組み合わせがあるか調べる

LaravelでDBから取ってきたデータの中に指定したキーと値の組み合わせがあるか調べるメソッドで便利そうなものがあったので簡単に紹介。

```php

// DBからデータをとってくる
$users = DB::table('user')->get();

// とってきたデータの中にキーがnameで値がtaroのものがあるかどうかを返す。
$users->contains('name', 'taro');

bool $collection->contains(key, value);
```

参考
ReadDouble
Laravel 5.5 コレクション
https://readouble.com/laravel/5.5/ja/collections.html#method-contains
Qt SensorsでIoTしたつもりになる

#はじめに

[お米とか野菜とか売っている会社](http://smartagrifoods.shop-pro.jp/)で、[IoTデバイス](https://biz.biglobe.ne.jp/bl/)の開発をやっております@mogurisoです。数年前は[メガネ型デバイス](https://www.telepathywalker.com/)開発を手伝ったり、[変なドローン飛ばす](https://www.youtube.com/watch?v=iIxMejJDaRM)のを手伝ったりしておりました。

今回は頑張って開発している[IoTデバイス](https://biz.biglobe.ne.jp/bl/)が**量産されまくって困るくらいのデモアプリをQtで作れたら良いなぁ**という壮大な夢に挑戦してみました。結論としては全くそこまで達していないのですが、出来たところまでPOSTします。

#Qtでセンサーデータ取得
前提としては、[Qt Sensors](http://doc.qt.io/qt-5/qtsensors-index.html)で対応センサーからデータ取得することは出来そうです。

+ Accelerometer（**加速度**）
+ Altimeter（**高度**）
+ AmbientTemperatureSensor（**温度**）
+ Compass（**コンパス**）
+ Gyroscope（**ジャイロ**）
+ PressureSensor（**気圧**）

個人的には１０軸センサーのデータをサンプリング出来ると嬉しいので、期待のデータ取得は出来そうに見えました。[^1]

#センサーデータ取得のサンプルを動かす
取っ掛かりがないと難しいのでQt付属のExamplesからセンサーデータ取得のサンプルを引っ張り出してみます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/58573/89e5392a-2db4-5e21-5df6-ee3b1c6d3e6c.png)
一番シンプルっぽい[Qt Sensors - QML example](http://doc.qt.io/qt-5/qtsensors-qmlqtsensors-example.html)をビルドしてデプロイして動かしてみました。[^2]
![2018-12-20 01.42.26.jpg](https://qiita-image-store.s3.amazonaws.com/0/58573/6da44624-3653-c0d2-be02-de5b3a6568fa.jpeg)

#気圧センサーに対応してみる
サンプルでは**”傾きセンサー（x, y）”**、**”周囲光センサー”**、**”近接センサー”**のデータサンプリングに対応しています。手元のデバイスだと周囲光／近接はデータが取れなかったので、とりあえずサンプルを弄って確実に搭載されている気圧センサーに対応させてみました。

```qmlqtsensors.qml
        PressureSensor {
            id: pressure
            active: false
        }

        Divider { label: "PressureSensor" }

        Row {
            spacing: 20
            width: parent.width
            anchors.margins: 5

            Button{
                id: pressureStart
                height: 30
                width: 80
                text: pressure.active ? "Stop" : "Start"
                onClicked: {
                    pressure.active = (pressureStart.text === "Start" ? true : false);
                }
            }

            Text {
                id: pressureText
                height: 30
                verticalAlignment: Text.AlignVCenter
                text: "Pressure: " + (pressure.reading ? pressure.reading.pressure : " Unknown")
            }
        }
```

**pressure.reading.pressure**に気圧センサーのデータが入っているのは、[公式のドキュメント](http://doc.qt.io/qt-5/qml-qtsensors-pressurereading.html#pressure-prop)に載ってはいるのですが・・・分かる人なら簡単に分かるもんなんでしょうか。。。
![2018-12-20 01.42.26.jpg](https://qiita-image-store.s3.amazonaws.com/0/58573/6da44624-3653-c0d2-be02-de5b3a6568fa.jpeg)
ちなみに、数値の値を見ると明らかにおかしいかつ補正前の生データをドライバから直接拾ってもこの値にはならないのでまだなにかおかしいです。（単純計算で1/100くらいにすればいい感じっぽいですが何でこんな値になるのかよく分からない、、、）

#まとめ

Windows上でやってたせいも多分あるのですが、AndroidデバイスにQtアプリをデプロイする環境を作るだけで３回くらいQt環境を作り直す羽目になったり、公式のサンプルでは**QtSensors 5.0**をimportするままだったり（Pressureの対応は5.1からだった、、、）、Qt Creatorが起動しなくなったり色々と落とし穴だらけでした。どうもググっても使っている記事もほとんどないのも、触りだけでコレだけハマりどころがあると納得ではあります。。。
ともあれ、デプロイ環境まで作ればQMLだけでセンサーデータを取れるのは間違いなく便利なのでモチベーションが続けばもうちょっと触ってみたいかと思います。。


明日は（というか今日は）@task_jpさんの”なんか書きます”です。毎回仕込まれているウィットに飛んだIRONYに乞うご期待。


[^1]: この時点では
[^2]: 辛うじて動いてますがここまでに１０時間以上掛かってます。。。orz
Vue.js表示・非表示などの条件をjs側に書くのがめんどいとき

Vue.jsでデータを表示させるときに、条件をjs側に書くのが時間的に難しいときはこんな感じで書くと簡単で良い。
あまりいい書き方でないかもしれない（マサカリ怖い）

```html

// v-showの条件でjs側にwatchとかメソッドとかで書くのが面倒なとき、簡易的に。
<label v-show="picked.hoge == '1'">サンプル</label>
    <input type="text">

// 名前があったときその名前、ないときデフォルトの名前
{{hoges.hoge_name ? hoge.hoge_name : 'tarou'}}

// セレクトの中でデータが存在する？もしくは特定の値のときだけbindしたいとき
<select v-model="data">
<option v-for="data in data" v-bind:value="data ? 1 : 2">
```
出来らあっ！PureRubyで正規表現を使わずに文字列へ３桁毎にカンマ食わせられるっていったんだよ！！

### え？？PureRubyで正規表現を使わずに文字列へ３桁毎にカンマを？？

```
RUBY_VERSION
=> "2.5.3"
```

```
p 1234567.to_s.reverse.chars.each_slice(3).map(&:join).join(',').reverse
# => "1,234,567"
```

```
p 1234567.to_s.chars.reverse_each.each_slice(3).map(&:join).join(',').reverse
# => "1,234,567"
```

```
class String
  def recursive
    return self if self.size <= 3
    self[0..-4].recursive + ',' + self[-3, 3]
  end
end
1234567.to_s.recursive
# => "1,234,567"
```
なんの変哲もなくてすまん
PythonフレームワークのQulacsで量子コンピュータに触れてみる

最近はベンチャーも出てきていて、ブームがきているっぽい！
もともと物理学を専攻していたので、せっかくなのでいま流行りの物理に触れてみました。

## 量子コンピュータとは?
概要は[ここ(Qmediaという専門家が書いているサイト)](https://www.qmedia.jp/nisq-era-john-preskill/)などを参考に

通常のコンピュータは 0 or 1 の ビットで情報を表現して、反転させたりする操作で計算します。  
　それに対して、量子コンピュータは0と1の重ね合わせ状態を作ることができて、そのような量子力学的なbitのことを量子ビット(qubit)といいます。
例えば、10個の量子ビット(10qubit)を準備すれば、2^10の1024通りの重ね合わせ状態を確定させることなく保持している状態を作ることができます。  
　もうひとつ重要なポイントとして、量子ビットの状態は干渉ができるということです。量子ビットに対して適当な操作をして(干渉させて)、欲しい結果の状態が得られるようにすることができる（ここが一番すごいところ）。例えば、有名なものにショアのアルゴリズムという古典コンピュータより早く素因数分解を解くアルゴリズムがあります。  
量子アルゴリズムについて詳しくはまだわからないので、これから勉強します。

プログラマとして今回は、量子計算をプログラミングを通して少し試してみたいと思います。いくつか量子コンピュータシミュレータはあるのですが、せっかくなので日本製のQulacs（京都大学の藤井研究室発 [Qunasys](https://qunasys.com/ )がメンテナンス)を使ってみたいと思います。普段Pythonは使わないので、今回は手軽にPythonの環境を提供してくれている`Google Colaboratory` を使っていきます。

## Google Colaboratory を触ってみよう

https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja


`!ls` のように ! をつけると、シェルコマンドが打てるようになります。これを使って、pipを動かしてQulacsを動かしていきます。

### Qulacs をインストールしよう
```
!pip install qulacs
```
これをColaboratoryのノートブックで実行するとインストールできます。

Qulacsは量子回路シミュレーターで、現在のノイズのあるような量子コンピュータを再現するような機能も付いてるみたいです。
NISQなどの研究にも使えるらしい。

>NISQ : Noisy Intermediate-Scale Quantum Computer  
>ノイズがあって、中くらいの大きさの量子コンピューター
大きさっていうのは、計算に使える量子ビットの数


## Qulacsを使ってみよう
量子アルゴリズムに詳しくないので、今回はQulacsでテキトーな量子計算をしてみたいと思います。  
量子計算は以下のような手順で行います。

1. 量子回路に入力する量子状態を用意します
2. 量子回路を作って計算します
3. 計算後の量子状態を測定します

```python
from qulacs import Observable, QuantumCircuit, QuantumState
from qulacs.gate import Y,CNOT,merge

# -----1. 量子回路に入力する量子状態を用意しましょう ----
# 3量子ビット用意します
state = QuantumState(3)
# 今回はランダムな初期状態を用意します
state.set_Haar_random_state()

# -----2. 量子回路を作って計算しましょう -----------
# 3量子ビットに対しての量子回路を作っていきます
circuit = QuantumCircuit(3)
# 0番目の量子ビットにXゲートをかけます
circuit.add_X_gate(0)
# CNOTゲートとYゲートとの組み合わせを作ります
merged_gate = merge(CNOT(0,1),Y(1))
# 組み合わせたゲートを回路に追加します
circuit.add_gate(merged_gate)
# 1番目の量子ビットにRXゲート（X軸回転ゲート）をかけます
circuit.add_RX_gate(1,0.5)
# 最後に作った量子回路で量子計算を実行します
circuit.update_quantum_state(state)

# -----3. 計算後の量子状態を測定しましょう -----------
# 今回は observableを使って物理量を測定してみます
# 3量子ビットを観測する用意をします
observable = Observable(3)
# 3番目の量子ビットのZ軸方向を測ります（上(+1)を向いているか下(-1)を向いているか）
observable.add_operator(1.0, "Z 2")
# 量子ビットが上向きか下向きかの期待値を計算します
value = observable.get_expectation_value(state)
print(value)
```


## まとめ
量子コンピュータの概略の説明とツールとしてQulacsを使用して量子計算を試しました。新たにQulacsというツールを使ってPythonを書くことができ、いい学びになりました。  
量子アルゴリズムについて勉強しなかったので、量子計算について詳しくわからなかったので、今後アルゴリズムについて勉強して、量子計算について書きたいです。通常のコンピュータよりも量子コンピュータが速いということも量子アルゴリズムの勉強の中で理解したいです。
勉強がてらWeb Appを作成する(2)

前回、VirtualBox を利用して仮想Ubuntu Desktop をWindows 上に作成した。
VirtualBox を使い続けるのでも良かったのだが、どーも挙動が重いしWindows を起動するのも面倒くさく感じてしまい、だったらサーバを実際に作ればいいじゃん、という気持ちになった。

そこで、ラズパイに何かサーバを突っ込んでみることにした（唐突）。
クラウドにインスタンスを作るのは、開発が軌道に乗ってからかな…。

# 用意したモノ
* Raspberry Pi 3B+ ：6000円くらい（秋月電子）
* ラズパイケース　  ：1000円くらい（同上）
* Wi-Fiドングル　　：1000円くらい（同上）
* ラズパイ用電源　 ：2000円くらい（ヨドバシ）
* Micro SD カード　：600円くらい（サンディスク ウルトラ 32GB, あきばお〜で買った）
* カードリーダー　　：600円くらい（Buffalo, あきばお〜で買った）
* Ubuntu Server 　　：ダウンロード（16.04）

# インストール作業
* [こちら][1]を参考にさせていただきインストール。
* 文鎮と化していたMacBook Pro を超久しぶりにフル稼働して作業を実施。
* Mac にパッケージが全然入っていなくて困った。（そもそも`brew`すら入っていなかった）
* Mac 単体で実施できない作業（ファームウェアの上書き）については、先日作成したUbuntu Desktop 上で作業を行うことでクリアした。
* コマンドの意味などを調べながら作業したので、めちゃくちゃ時間がかかった。

## インストール作業で困ったこと
* `apt install XXX...` でインストールパッケージのURLを名前解決できず、パッケージのインストールに失敗して困った。
* 原因はUbuntu が自宅のWi-Fi に乗っていなかったため。
* いったんLanケーブルにつないで必要そうなパッケージをインストール。
* Wi-Fi につながらなかった原因は、適切なセキュリティ設定を行っていなかったためっぽい。(`WPA2-PSK`方式なのに`WPA-PSK`の設定を行っていた)

# インストール後
[こちら][2]を参考に取り急ぎの設定を行った。
ついでに、LANの外からもSSH できるようにしようかと思ったが、まだいいやと思い未実施。

# 今後の方針
ようやくサーバができたので、いよいよ開発作業に入っていこうかな！
とりあえず Python の Web フレームワークを調べて何か作ってみよー。
その前にラズパイの熱対策しないと。。。
あれ、iPad で開発ｈ
[1]:https://qiita.com/adeliae1316/items/e34170584b3abdb7253c
[2]:https://qiita.com/kotarella1110/items/f638822d64a43824dfa4
ElmのページをGitHub Pagesに公開するだけのテンプレート

以前からあったら自分が使うかなと思っていた[CI経由でGitHub PagesにElmのページを自動デプロイしてくれるテンプレート](https://github.com/kory33/elm-gh-pages-template)を作ってみました。

[Elm Advent Calendar 2018](https://qiita.com/advent-calendar/2018/elm) 18日目の記事です。遅刻してしまって申し訳ない😢

## 使い方

### 前提
[yarnがローカルにインストール](https://yarnpkg.com/lang/ja/docs/install/#windows-stable)されていることを前提としたテンプレートです。

### リポジトリの初期化
GitHub上で[リポジトリ](https://github.com/kory33/elm-gh-pages-template)をフォークするか、

```shell
git clone https://github.com/kory33/elm-gh-pages-template <プロジェクト名>
cd <プロジェクト名>
git remote set-url origin <新規リポジトリURL>
git push -u
```

でローカルにクローンしたリポジトリを新規リポジトリにpushしてください。フォークした場合、必要に応じてリポジトリの`Settings`からリポジトリ名を変更してください。

### CircleCIでの設定
CircleCIがビルド成果物をコミットしてプッシュするためにリポジトリへの権限が必要になります。
[秘密鍵をCircleCIに登録してこれを行っても良い](http://blog.shotarok.com/post/hugo-with-bitbucket-and-circleci/#3-circleci-%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%AD%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2)のですが、より手軽なアクセストークンを使った方法を紹介します。

[GitHub](https://github.com)の右上のユーザーアイコン > `Settings` > `Personal settings`カラムの下にある`Developer settings` > `Personal access tokens`の順でリンクをたどると、GitHub APIを使うためのアクセストークンを管理するページにたどり着きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244874/9b9edbb2-0878-32cf-5b17-2699aae5e241.png)

`Generate new token`をクリックするとトークンのスコープを指定する画面が開くので、`repo`をチェックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244874/b4a60221-4c45-0b45-b5b8-0cd1cc3ed636.png)

生成されたトークンをコピーして[CircleCI](https://circleci.com/)へ戻ります。
左下の`Settings` > `Projects`と辿り、初期化したプロジェクトの右端にある設定編集ボタンを押します。
`Environment Variables`で`Add Variable`をクリックし、`Name`に`GITHUB_PERSONAL_TOKEN`、`Value`に先ほどコピーしたトークンを張り付け、トークンを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244874/59ee6bad-459f-83f9-80dc-3ddbdfaeb235.png)

`ADD PROJECTS`で、クローンしたプロジェクトを選択します。`Start Building`を押せばプロジェクト自体の設定は終わりです。あとは`yarn start`で建つ開発用サーバーでデバッグを行いながらElm等を書いていきます。

### `master`にpush
公開ができる状態になったら、`master`にpushをすることで`gh-pages`ブランチにコミットが追加されます。`master`へのプッシュでのみCircleCIが反応するようになっていますが、この挙動は変更できます。(参照: `./circleci/config.yml`)

## TODO
~~一度`gh-pages`ブランチでビルドが走ると`./circleci/config.yml`が存在しないにもかかわらずビルドが走り続け失敗してしまいます。結果私のGmailは失敗通知で埋まりました。修正が必要そうです。~~

EDIT: `gh-pages`ブランチでのビルドを必ず成功させるように[修正](https://github.com/kory33/elm-gh-pages-template/commit/812bb1621ffe33834e65a0a1f6100de3eea016d9)しました。
advent calendar内のランキングを出してみた

#概要

advent calendar楽しいですね:relaxed:

記事のいいねランキングやカレンダーのいいねランキングはQiita運営の方で用意されていると思いますが、
カレンダーテーマ内のいいねランキングも知りたいなあと思ったのでやってみました。

(※ 弊社はchatworkを利用しているので、そちらにだすようなものをつくりました)

#つくったもの

![スクリーンショット 2018-12-20 1.09.41.png](https://qiita-image-store.s3.amazonaws.com/0/30891/9acc256f-9347-5c45-3c62-f96bf77a4f07.png)

https://github.com/yaginuuu/ranking_of_the_qiita_advent_calendar

#感想

弊社では現在[@yamakona](https://qiita.com/yamakona)がトップのようです。
すばらしいですね:sunflower:

明日は[@pokochi](https://qiita.com/pokochi)さんです！
メモ：「３０日でできる！OS自作入門 」4日目

C言語からメモリ書き込み
アセンブリに write_mem8という関数を書いて Cから呼び出す形式

16bit モードではメモリインデックスは [CX], [SP]はできなかったが、32bit モードでは [ECX], [ESP] なども使えるとのこと。

EAX, ECX, EDXは自由に使える。

8086, 80186, 286 は 16bit CPU, 386, Pentium .. は 32bit CPU

A - 0xa0000 から 0xaffffに 15番目の色(白）を書くので真っ白が画面ができました。

B - 色を i & 0xff することによってシマシマの模様が出力できました。


![スクリーンショット 2018-12-19 22.41.28.png](https://qiita-image-store.s3.amazonaws.com/0/109145/9f5e2606-f86e-9247-ffcd-34f5341aa1f0.png)


C は char *p; と宣言して直接書くやつ

D も p = (char*) 0xa0000; と宣言して *(p + i) = i & 0x0f; と書き換えてるだけ

E は p[i] = i & 0x0f; インデックスの使い方; p[i] は配列ではない、だたの表現の違い; a[2] も 2[a]も一緒

F は 16色のpalette の定義

CLI: Clear Interrupt Flag; STI: Set Interrupt Flag
EFLAGS: (15) _ NT IOPL(2) OF DF IF TF SF ZF _ AF _ PF _ CF (0)

C言語では Flags 周りのさわれない

IN/OUTはDeviceと電気信号を受けたり、送ったりするもの

io_in8 は IN AL, DX, in16 は IN AX, DX, in32は IN EAX, DX
io_out8 は OUT DX, AL, out16 は OUT DX, AX, out32 は OUT DX, EAX

PUSHFD: PUSH EFLAGS, POPFD: POP EFLAGS; EAX に FLAGS が入る
（Push Flags DWord, Flags を Stack に押し込む
PUSHFD: MOV EAX, EFLAGS 的な
POPFD: MOV EFLAGS, EAX 的な

G はボックスを作る
320の幅指定して、XとYなめて書き出してるだけ。

![スクリーンショット 2018-12-20 1.36.46.png](https://qiita-image-store.s3.amazonaws.com/0/109145/35d8e731-9161-6e03-f2c9-ff47e137cb66.png)

H はWindowsっぽく四角いものいっぱい作ってるイメージだった

![スクリーンショット 2018-12-20 1.40.42.png](https://qiita-image-store.s3.amazonaws.com/0/109145/ac816248-61a4-10e9-8a3b-749bf588cf32.png)



達成感はめちゃある！
内積の公式から、加法定理を思い出す

三角関数の定義の外側の概念である内積の公式を使う時点で、外道ではあるけども、加法定理を思い出しやすいので、時々使う。

次の公式を使う。

```math
\langle\vec{a},\vec{b}\rangle=|\vec{a}||\vec{b}|\cos\theta
```

$\mathbb{R}^2$で $|\vec{a}|=|\vec{b}|=1$ を満たすとすると、言うまでもなく、こんな風になる。掛けて足すだけ。分かりやすいね。

```math
\begin{align}
\left\langle\vec{a}=\left(\begin{array}{r}x_1 \\ y_1\end{array}\right),\vec{b}=\left(\begin{array}{r}x_2 \\ y_2\end{array}\right) \right\rangle &= |\vec{a}||\vec{b}|\cos\theta \\
x_1 x_2 + y_1 y_2 &= 1 \cdot 1 \cdot \cos \theta 
\end{align}
```

![mathematics_0_25p.png](https://qiita-image-store.s3.amazonaws.com/0/326797/84313466-fbfe-96a2-b92e-6b896b92a3f5.png)

![triangle_func_03.png](https://qiita-image-store.s3.amazonaws.com/0/326797/227d36bc-b78c-f5cc-73a9-70bb385eafee.png)

![mathematics_2_25p.png](https://qiita-image-store.s3.amazonaws.com/0/326797/f3647a4f-262f-d603-8392-2c52cb1ed816.png)
![mathematics_3_25p.png](https://qiita-image-store.s3.amazonaws.com/0/326797/1aee738b-a0cc-4f14-bfca-b4f274af256e.png)
![mathematics_4_25p.png](https://qiita-image-store.s3.amazonaws.com/0/326797/70074eb8-6258-82d3-f1fd-11d8ac3e3ed9.png)

とはいえ、 [加法定理の覚え方。図形でわかる公式の考え方 | アタリマエ！](https://atarimae.biz/archives/18266) のサイトにあるようなやり方の方が、前提知識不要な意味で、より良いのであろう。
リファクタリングのしやすいエディタを使うこと

最近、利用している言語の統合開発環境を乗り換えた。

その最大の理由は、リファクタリングのしやすさだ。

[refactor][rename]
[refactor][extract method]などの操作が利用できる。

そのことを十分に理解していなかったままに、従来の統合環境を使い続けていたことが悔やまれる。


- データメンバーの名前を変えるときに、エディタで一つひとつ変えていくのは手間が多すぎる。
- リファクタリングのしやすいエディタでは、データメンバーやメソッドの名前を変更するときに、きちんと文脈を理解して、その該当するデータメンバー・メソッドだけを変更してくれる。save()などというメソッドがあったときに、きちんと該当するものを区別してくれる。
- 単体テストを実行する枠組みでも、統合開発環境によっては、選んだ単体テストだけを実行できる。

だから、リファクタリングのしやすいエディタを選んで使うことだ。



Pythonの場合
PyCharm
https://www.jetbrains.com/pycharm/download/#section=linux
AWSソリューションアーキテクトアソシエイトに合格しました

# はじめに
先日（2018/12/17）にソリューションアーキテクトアソシエイト（SAA）の試験を受けに行って、何とか合格できましたので、準備のためにやったことや試験の手応え、その他所感などを備忘として記載します。

# 勉強開始
資格を取ろうと思ったのはたぶん2018年7月頃だと思います。
2017年頃に業務でAWS上にデプロイする標準化テンプレートを作成する過程で色々検討する機会があり、その時点でEC2やS3、AutoScaling等の基本的な機能（の基本的な部分）は一通り知っていました。
その後、Linuc Lv2を受けたりPythonを勉強したりと色々浮気したので時間はかかりましたが、実質の勉強期間は2ヶ月か3ヶ月ぐらいだと思います。

# 獲得スコア
10月頃に一度受けて滑ってるので、延べ2回受験しました。

|受験日|スコア/合格点/満点|結果|
|:----:|:-----------------:|:--:|
|2018-10-14|660/720/1000|不合格|
|2018-12-17|800/720/1000|合格|

どちらも「分野 3: セキュアなアプリケーションおよびアーキテクチャを規定する」と「分野 4: コスト最適化アーキテクチャを設計する」はスコアレポートで再学習の必要ありと言われました。
やはり業務や自習であまり触ってない部分の点数が悪かったようです。

# 学習で使った教材
## 書籍
基本的なところで、まずは資格本。

[合格対策 AWS認定ソリューションアーキテクト －アソシエイト](https://www.amazon.co.jp/dp/B01LZ2CBKB/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

自習のため追加で買った本。
②の方は基礎知識（Lambdaとか）が無さすぎてあまり理解できず、ほとんど読みませんでした。

[①Amazon Web Services パターン別構築・運用ガイド](https://www.amazon.co.jp/gp/product/B07BMQL59H/ref=oh_aui_d_detailpage_o04_?ie=UTF8&psc=1)

[②AWSによるサーバーレスアーキテクチャ](https://www.amazon.co.jp/gp/product/B079VL58FG/ref=oh_aui_d_detailpage_o02_?ie=UTF8&psc=1)

## 問題集
たぶん一番か二番目にお世話になったWeb問題集。

https://aws.koiwaclub.com

9月末にゴールドプラン（60日間）で申し込んだ後、11月末で期限切れになったのでプラチナプラン（90日）をおかわりしました。

あとはAWS認定ページにあるサンプル問題と模擬試験。
模擬試験は1回目は（受け忘れて）やらず、2回目は（慌てて）試験の2日前ぐらいに受けました。

https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

これもよく言われることですが、模擬試験は終了後スコアしか表示されず、問題と解答は確認できないため、終了前に画面キャプチャーなどで保存することをおすすめします。

## Web
一番見たのはBlackbeltの資料とWebセミナー動画。

https://aws.amazon.com/jp/aws-jp-introduction/

あとはオンラインのトレーニングもいくつか受けましたが、こちらは参考程度。
それ以外にはAWSSummit2018のセッションを観たり、Loftでの無料セミナーに参加したりしました。
セミナーはサーバーレス（主にKinesis）とSageMakerだったので、今回どこまで役に立ったかは謎ですが。

# 試験を受けての感想
・130分という試験時間は長いようで短い、なんてことはなくてやっぱり長い
　（集中力の問題。具体的には2回受けて2回とも途中で寝そうになった）
・試験内容は、資格本に書いてあるようなことは「当然知ってる」という前提で、細かいサービス（RedshiftやEFS、Kinesisなど）についての問題が結構出る
・単純な知識を問う問題（RDSのスナップショットの保存期間はデフォルト何日とか、エンタープライズサポートのレスポンス時間はいくつとか）は出ない
・AutoScaling、ELBが絡まない問題はあまりない、というぐらいにはよく出た
・リージョンとAZ単位でどのサービスが使えるか、というのはすごく大事。更に言うとエッジロケーションも
・全部のサービスについて覚える必要はないが、名前を聞いてどんなサービスかは理解しておくと試験中焦らなくて済む
・類似のサービスの違いについても知っておくと便利かも
（具体的にはストレージ系（EBS、S3、EFS）や、構成管理系（Cloudformation、Elastic Beanstalk）等々）

# 今後の予定
次はたぶんLinuc Lv3(304）か、情報処理試験の何か（DBかセキュリティ系）だと思いますが、ノリで簿記とか受けるかもしれません。
クリスマスツリーをライフゲームでイルミってみた

#1.はじめに

わたくし事ですが最近引越しまして、
クリスマス直前だっていうのに殺風景な部屋に独りぼっちなわけです。

**「よし、クリスマスツリーでも作って飾ろう」**

しかし、ただ市販のツリーを買ってきて、装飾して…なんてやっていたら余計に淋しさで押しつぶされそうなので、

「**セル・オートマトン**でクリスマスツリーのイルミネーション作ったら面白いんじゃないか！？」

と、思い立ったわけです。
そんなわけで、折角なのでライフゲームのルールでクリスマスツリー（のような何か）を光らせてみました。

**結果は下の方にあるので、内容に興味がなければ[すっ飛ばしてください。](https://qiita.com/tf-tky/private/2dd21956e4238d957887#4%E3%81%93%E3%81%86%E3%81%AA%E3%81%A3%E3%81%9F)**

#2.セル・オートマトンとは
離散的計算モデルのひとつです。

格子状のマス目（セル）に、それぞれ「生きている」「死んでいる」のいずれかの状態を持たせます。
現在のセルの状態を元に、次のセルの状態を計算し、それを繰り返して格子状に並んだセル全体の様子を観察します。
![cell.png](https://qiita-image-store.s3.amazonaws.com/0/196350/eb839ae3-b41e-e8d8-69f5-9da258667240.png)
##シミュレーションの例

様々なシミュレーションに応用されていますのでいくつか紹介します。

- [貝殻の模様を再現](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3#%E7%94%9F%E7%89%A9%E5%AD%A6%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BE%8B)
- [人間の避難行動シミュレーション](https://www.jstage.jst.go.jp/article/jisss/2/0/2_95/_article/-char/ja/)
- [道路交通シミュレーション](http://jairo.nii.ac.jp/0025/00036821/en)
- [雪の結晶パターン生成（Qiitaに記事がありましたので紹介させていただきます。）](https://qiita.com/whiteeel/items/49a54d79f507653f71e7)
- [小売店舗内購買シミュレーション](https://www.jstage.jst.go.jp/article/jsces/1999/0/1999_0_19990019/_article/-char/ja/)


数理シミュレーションは複雑な微分方程式や積分方程式などを構築するイメージがありますが、
セル・オートマトンは非常に単純なルールで、複雑且つ面白い振る舞いを観測できるので、割ととっつきやすいと思います。

##セル・オートマトンとカオス
セル・オートマトンでは、カオティックな振る舞いも観測できます。
上述したように、シミュレーションの構成自体は非常にシンプルであるにもかかわらず、カオス的な振る舞いを再現できることも、セル・オートマトンが注目された要因のひとつです。

ちなみに、カオスの応用例として、クリスマスイルミネーションの光らせ方とか、蝋燭の灯のリアルな揺らぎとかが既に研究されています。

株価予測に応用して大儲けした人たちも居たとかいないとか。

#3.ライフゲームとは

>イギリスの数学者Conwayが考案した，生命の誕生と死のシミュレーションです。

[(引用元)](http://www.daiichi-g.co.jp/osusume/forfun/07_lifegame/07.html)

##ルール

セル・オートマトンは「現在のセルの状態を元に、次のセルの状態を計算」と書きましたが、
ライフゲームにおける、その「計算」のルールは非常にシンプルです。

- **[誕生]**：死んでいるセルに隣接する生きたセルがちょうど3つあれば、次の世代が誕生する。
- **[生存]**：生きているセルに隣接する生きたセルが2つか3つならば、次の世代でも生存する。
- **[過疎]**：生きているセルに隣接する生きたセルが1つ以下ならば、過疎により死滅する。
- **[過密]**：生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。

[(wikipediaより引用)](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)

たったこれだけです。
生物の淘汰や、進化などのプロセスをとても単純なルールでモデル化したものなのですが、
なかなかどうして、面白い振舞いをするのです。

ライフゲームについてはこちらの記事を参考にさせていただきました。
[「Javaでライフゲームを作る」](https://qiita.com/natmark/items/5a0d05625d2c0e73777d)

#4.こうなった
![lifegame.gif](https://qiita-image-store.s3.amazonaws.com/0/196350/a4b7a31b-9a82-9e6f-9acc-5f98b5488362.gif)
シミュレーション範囲：木の葉っぱの部分
生存：黄色
死亡：緑色
初期状態：各セルに一様乱数を振り、30%の確率で生存
繰返回数：5000回（収束したので画像は途中で切っています）
試行回数：面白い動きが出るまで

プログラムはJavaで書きました。描画処理はSwingを使っています。
↓ソースはこちら（美しくないので悪しからず…。）
https://github.com/tf-tky/XmasLifeGame


##思ったこと
- てっぺんは初期状態以外光らないよなあ（光りません）
- 木の上の方に行くにしたがってセルの数が減るので、すぐに消えてしまうのでは（そうでもなかった）
- イルミネーションぽく見せるためにランダム性を持つルールを追加したほうが良いかなあ（やってみたけどイマイチだった）

#5.結論
###『最後の収束は、せつない。』
LPIC Level1 のVersion4.0を申し込む方法

なぜかLPIC101は Version5で受験してしまいました。
間違えて101をVersion 5で受けても、LPIC102でVersion 4を受験することができて、ちゃんと認定してもらえる っていう体験記がping-tにありました。

#Fucking ピアソンのページ
このページでLPICと検索すると、Version5しか表示されません。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/3176de79-1947-96fa-1fa1-1a42bb2ffcb2.png)



**LPI Level 1 Exam 101**
**LPI Level 1 Exam 102**
の２つがVersion4です。
inview.jsを用いた要素が順番に表示されるアニメーション

備忘録としてメモ。

要素が順に表示されるアニメーションを「inview.js」を用いて実装しました。
※jQuery使用。

以下がソース。

```js:order.html　
         <ul class="box js-inview" id="box01">
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
        </ul>
        <ul class="box js-inview" id="box02">
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
        </ul>
        <ul class="box js-inview" id="box03">
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
        </ul>
```

```js:order.scss　
.box {
  width: 100%;
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  li {
    width: 23%;
    height: 200px;
    list-style: none;
    margin-bottom: 20px;
    // 最初は見えないようにしておく
    opacity: 0;
  }

  &+ .box {
    margin-top: 300px;
  }
}

.js-inview {
  .js-showed {
    animation: fadeIn01 .9s ease-out forwards;
  }
}

@keyframes fadeIn01 {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

#box01 {
  li {
    background: rgb(107, 230, 55);
  }
}

#box02 {
  li {
    background: rgb(230, 228, 55);
  }
}

#box03 {
  li {
    background: rgb(230, 160, 55);
  }
}

```

```js:order.js　
$(function() {
  $('.js-inview').on('inview', function(event, isInView) {
    if (isInView) {
      $(this).find('li').each(function(i) {
        $(this).delay(100 * i).queue(function() {
          $(this).addClass('js-showed ').dequeue();
        });
      });
    }
  });
});

```

簡単に説明すると、

１、要素「.js-inview」が画面内へ入ったら
２、その入り込んだ要素「.js-inview」の中から「li」を探し、
３、その「li」に対し繰り返し「js-showed」クラスを与える。

最初は「opacity:0」で隠しておき、keyframeでアニメーションを付与しています。
メモ：docker-composeで起動しているnginxのログをrotateする

- docker-composeでnginx:alpineを起動しているが、logrotateでログをローテートさせたい。
- dockerコンテナ自体のログなら、dockerのログなら標準オプションでローテートさせることが可能だし、docker-composeのdriverにもローテートさせるオプションがある。
    - [Configure logging drivers | Docker Documentation](https://docs.docker.com/config/containers/logging/configure/)
- が、今回のログは、docker-composeで起動したnginx:alpineのログで、それをvolumeでマウントしたホスト側のディスクに書き出しているので、docker自体をlogrotateでrestartしている。
- 基本的には通常のlogrotateと同じように`/etc/logrotate.d`配下にrotateの定義を書いたファイルを置いている。置いているのは、ホスト側のサーバだ。
- docker-composeのkillオプションでsiginalをdockerに送れるので、それでUSR1を送っている。

```:/etc/logrotate.d/docker_nginx
/var/log/nginx/*.log
{
	rotate 4
	weekly
	missingok
	notifempty
	compress
	delaycompress
	sharedscripts
	postrotate
		/usr/local/bin/docker-compose -f /usr/local/docker/docker-compose.production.yml kill -s USR1 nginx
	endscript
}
```
- docker-composeコマンドのパスや、docker-composeの定義ファイルは環境によって変わると思う。
JSDOMからピンクを探せ！！

本記事は[OPENLOGI AdventCalendar](https://qiita.com/advent-calendar/2018/openlogi) 15日目の記事です。

## 問題提起

JSDOMの中で **ピンク** という色はどういう扱いを受けているか知っていますか？

<details>
colorのピンクはjsdomの中だとレンダーされなく、存在が消されています！
と思っていたのですが実装が変わったみたいです。
ピンクはちゃんとレンダーされます。
<summary>答えだけ知りたいって方はこちらをクリックで :pray:</summary>

Vue.jsのコード例ですが触ったことないひともなんとなくわかるかと思う簡単な例にしてます。。
それでは実際にコードを追ってみましょう。！！！

## 実コードみせる


### ブラウザ編

こちらのコードを実際にWeb上でレンダーするとどうなるか見ていきたいと思います。

Greeting.vue

```html
<template>
  <div>
    color: <span :style="{ color: color }">{{ color }}</span>
  </div>
</template>

<script>
export default {
  name: "Greeting",
  props: {
    color: {
      type: String,
      default: "blue"
    }
  }
};
</script>

```

吐き出されるHTML

```HTML
<div>color: <span style="color: blue;">blue</span></div>
```

画面で見るとこんな感じ

<img width="451" alt="スクリーンショット 2018-12-18 23.36.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/112929/459f80bb-9b83-4d0c-91f2-2e189c855356.png">

CodeSandboxで実際に触ってみる場合はこちら。 
[![Edit Vue Template](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/7w1kz03o8x)

### node.js編

（（今年の八月くらいまでは））例えばVue-test-utilsとかブラウザに依存しない環境で

```HTML
<Greeting :color="pink">
をレンダーすると
<div>color: <span style>pink</span></div>
ってなりました。
```

要するにピンクがスタイルとして認識されてなかったです。

## 仮想DOMのなかでどういう実装になっているか

JSDOMのなかでのカラーレンダリングとかはchad3814/CSSStyleDeclarationというライブラリに依存していました。

そのなかの [ここらへん](https://github.com/chad3814/CSSStyleDeclaration/blob/5c51d1657f8b693d46744e05239c24ae03be57e5/lib/parsers.js#L100-L116)

```js
    case 'maroon':
    case 'red':
    case 'orange':
    case 'yellow':
    case 'olive':
    case 'purple':
    case 'fuchsia':
    case 'white':
    case 'lime':
    case 'green':
    case 'navy':
    case 'blue':
    case 'aqua':
    case 'teal':
    case 'black':
    case 'silver':
    case 'gray':
```

この色しか使えなかったのです。ピンクはありませんね。もしピンクをどうしてもVue-test-utilsのテストで使いたいならこのライブラリをフォークして `cace pink` を追加すると大丈夫な仕様になっていました。

[このあたり](https://github.com/jsdom/jsdom/issues/1965)にとても詳しくかかれていますが、「JSDOMはpinkプロパティをセットできねーぜ」ってイシューが建てられていました。

- JSDOM doesn't retrieve the "*style.backgroundColor = 'pink'" property set on a table row #1965

## 書き換えてみる

node_modules/からCSSStyleDeclarationの部分を書き換えるとレンダリングされました。

## jsdomのイシュー読んでみた

[このあたり](https://github.com/jsdom/jsdom/issues/1965)のイシューを読んでみた

> We don't support getting the style property as JS properties on style for now. You would have to use tr.style.getPropertyValue(). I believe @Zirro is working on a rewrite of the entire CSSOM support in jsdom, though, which should bring support for this feature.

ZirroさんのJSDOMのCSS部分の書き換えが終わり無事にピンクが使えるようになりました。

## 終わりに

今回「JSDOMだとピンクが使えないよ！」って話を書こうとしたらまさかのすでに対応済みでかなり焦りました。内容の薄い感じになりましたが、ライブラリの実装とかイシューとか少しおってみたので楽しかったです。
cocoaPodsを利用してUITestを導入したときにMissing required module 'ライブラリ名'のエラー

#はじめに
UITestを導入しようとして、参考文献をもとに`iOS Unit Testing Bundle`を選び、作成された`BiblioTests.swift`にプロジェクト名を入れようとすると下記のようなエラーが出た

```Swift
Missing required module 'Firebase'
```
<img width="987" alt="スクリーンショット 2018-12-20 0.13.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/176479/35d84e38-55d8-aa18-4f20-a3da512e6b6f.png">

[Xcode Unit Testing with Cocoapods](https://stackoverflow.com/questions/38216090/xcode-unit-testing-with-cocoapods)
によると
`testTarget`用に項目を作る必要がありました

```swift:podfile(自分のターゲットの例)
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '11.0'

use_frameworks!

target 'Biblio' do
   ////(導入しているライブラリ)
   pod 'Firebase/Core'
   pod 'Firebase/AdMob'
   pod 'SnapKit', '~> 4.0.0'
   pod 'fluid-slider'
   ////
   target  'BiblioTests' do
        inherit! :search_paths
        pod 'Firebase'
    end
end
```

もう一度下記をコマンドラインで実行

```
$ pod install
```

エラーが出なくなりました


#参考文献
[Xcode Unit Testing with Cocoapods](https://stackoverflow.com/questions/38216090/xcode-unit-testing-with-cocoapods)
[UITableViewのUnitTestを書く](https://qiita.com/himara2/items/97613f0b2ff50a356cfc)

[[iOS] ユニットテストの始め方 〜 テスト環境の作り方とXCTestの使い方 〜](https://dev.classmethod.jp/smartphone/iphone/how-to-start-ios-unit-test/)
Anaconda1.9.6-windowsをインストールしたがPandasが使えなった問題【解決】

Anacondaを当分新たにインストールすることはないだろうけど、またインストールするときに備えた、備忘録です

# 発生事象
```
import pandas as pd
＞ImportError: C extension: hashtable not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace' to build the C extensions first.

```

というメッセージがでて、pandasをimportできない

# 解決方法
以下サイトを参考
http://paper.hatenadiary.jp/entry/2016/09/11/203524

結局やることは、アンインストールしてもう一回インストールするだけ
Anaconda Navigaterでやってもうまくいきます
メソッドの種類・変数の種類

#メソッドの種類
###インスタンスメソッド

```ruby:Hoge.rb
class Hoge
  def hoge
    puts "インスタンスメソッド"
  end
end

# newされているのでインスタンスオブジェクトからメソッドを呼び出している
Hoge.new.hoge # => 「インスタンスメソッド」と表示される。成功。

# クラスオブジェクトからは呼び出せない
Hoge.hoge # => エラーが出てしまう
```

インスタンスメソッドはインスタンスオブジェクトから実行できるメソッド

###クラスメソッド

```ruby:Hoge.rb
class Hoge
  def self.fuga
    puts "クラスメソッド"
  end
end

Hoge.fuga # =>「クラスメソッド」と表示される。成功。

Hoge.new.fuga # => エラーが出てしまう
```

クラスメソッドはクラスオブジェクトから実行できるメソッド
また、この場合selfはHogeクラスを指す

なので・・・下記のように書いても一緒

```ruby:Hoge.rb
class Hoge
  def Hoge.fuga
    puts "クラスメソッド"
  end
end
```

#変数
###ローカル変数
・変数名の先頭が**アルファベットの小文字か「 _ 」**で始まる。
・変数の有効な範囲（＝変数のスコープ）は、(宣言した位置から)その変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまで。→あるところで使われている変数の名前を、別のあるところで使っても、それが無関係なところ(スコープ外)であれば、違う変数として扱われる。

```ruby:
class Hoge
  def hoge
    name = 'nyaa'
    puts "私の名前は#{name}です"
  end
end

nyaa = Hoge.new
nyaa.hoge # => 結果：私の名前はnyaaです
```

メソッド外に変数を使うと

```ruby:
class Hoge
  name = 'nyaa'
  def hoge
    puts "私の名前は#{name}です"
  end
end

nyaa = Hoge.new
nyaa.hoge # => エラーになる
```

###インスタンス変数
・変数名の先頭が**「@」**で始まる
・同じインスタンス内であればメソッド定義を越えて、その値を参照したり、変更したりできる
・なお、初期化されていないインスタンス変数を参照するとnilが得られる
・インスタンスごとに違う値をもつことができる

```ruby:
class Hoge

  def initialize(name) #initializeメソッド
   @name = name  #インスタンス変数の初期化
  end

  def hoge  #インスタンスメソッド
    puts  "私の名前は#{@name}です"
  end
end

nyaa = Hoge.new('nyaa')
nyaa.hoge # => 結果：私の名前はnyaaです

boo = Hoge.new('boo')
boo.hoge # => 結果：私の名前はbooです
```
**initializeメソッド**:newメソッドによってオブジェクトを生成すると、このメソッドが呼ばれる。その時、newに渡した引数がそのまま渡される。オブジェクトにとって必要な初期化の処理はここに記述する。

###クラス変数
・変数名の先頭が**「@@」**で始まる
・クラス変数はメソッド内ではなく、定数と同じくクラス内のメソッド内では無い場所で定義する。
・そのクラスおよびそこから生成されるオブジェクト（インスタンス）の中ならどこからでも参照可能。

```ruby:
class Hoge
  @@name = 'nyaa'
  def hoge
    puts "私の名前は#{@@name}です"
  end
end

nyaa = Hoge.new
nyaa.hoge # => 結果：私の名前はnyaaです
```
###グローバル変数
・変数名の先頭が「$」で始まる
・プログラム中のどこで使われても、同じ名前であれば、必ず同じ変数として扱われる
・上記の性質から、プログラム全体のどこからでも変更できるため、一般的にあまり好まれない
PyPy使ったらいい感じに速くなった話

#pypyとは
皆さんpython使っていますか?pythonで書いてたら皆に言われること「pythonって遅くね??」これ言われたらどうしようもないですよね...動的型付け言語だししょうがないじゃんって割り切る方も多いと思います。しかしそんな方に朗報です.pypyを使えばあなたのコードが数十倍速く動きます。早速使ってみましょう.

(追記)もし詳しくpypyについてもっと知りたい方がいましたらこちらの記事に詳しく記載されています。
https://qiita.com/ta_ta_ta_miya/items/33253e9bcbb7034f088d
#環境構築
今回はubuntuで環境構築します。
Ubuntuだとapt-getでインストールされるはずなので

```
$ sudo apt-get install pypy
```
異常がなければ確認してみましょう

```
$ pypy -V
Python 2.7.13 (5.10.0+dfsg-3build2, Feb 06 2018, 18:37:50)
[PyPy 5.10.0 with GCC 7.3.0]
$ pypy3 -V
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:29:55)
[PyPy 2.4.0 with GCC 4.6.3]
```
しっかり入っていますね。pypy3がpython3に対応しているようです。
#速度確認
今回はこの処理の速度を測ってみます。

```python

import time
start = time.time()

for i in range(1000000):
        i ** 2

elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time))
```
では比較しましょう。

```
$ python3 test.py
elapsed_time:0.48540759086608887
$ pypy3 test.py
elapsed_time:0.025701045989990234
```
結果pypyのほうが40倍速くなりました。
#終わりに
僕もpypyをあまり知りませんでした。なのでネットで調べたのですが情報が少なくまとめられていません。これからもpypyについて調べ導入以降のお話もできればと思います
ReactNative に TypeScript を導入してみました

#React Native（0.57.8） に TypeScript を導入してみた
基本的にはMicrosoftの[説明](https://github.com/Microsoft/TypeScript-React-Native-Starter)を見ればできますが、コンパイルにエラーが発生するので備忘録的に書こうと思います。

## プロジェクトの初期化
ここは公式サイトそのままです。  

```
react-native init MyAwesomeProject
cd MyAwesomeProject
```

## TypeScriptの追加
- モジュールの追加  
ここも公式サイトそのままです。  

```
yarn add --dev typescript
yarn add --dev react-native-typescript-transformer
yarn tsc --init --pretty --jsx react
touch rn-cli.config.js
yarn add --dev @types/react @types/react-native
```

- tsconfig.json　の修正（公式サイトの修正）  
コメントアウトされているところを下記のように外します。

```json:tsconfig.json　
{
  ...
   "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
  ...
}
```

- tsconfig.jsonの修正（コンパイルエラーをなくすためにしたこと）  
allowSyntheticDefaultImportsの修正だけでも動くことには動くが、コンパイルエラーとなるため
下記のような設定を追加しました。

```json:tsconfig.json　
{
  ...
  "target": "es2015",
  "module": "es2015",
  "lib": ["es2015"], 
  "moduleResolution": "node",
  ...
}
```
- rn-cli.config.jsの修正（公式サイト通りに）  
公式サイトの通りに下記を追加します。

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

## TypeScriptへの移行（公式サイトそのまま）
- App.js を App.tsxに変更します。
- import React, { Component } from 'react'を以下のように書き換えます。  

```
import React from 'react'
import { Component } from 'react';
```

## Jestの切り替え
- 下記のコマンドを叩き、Jestを導入します。  

```
yarn add --dev ts-jest
```

- package.jsonのJest部分を書き換えます。

``` json:package.json
"jest": {
  "preset": "react-native",
  "moduleFileExtensions": [
    "ts",
    "tsx",
    "js"
  ],
  "transform": {
    "^.+\\.(js)$": "<rootDir>/node_modules/babel-jest",
    "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
  },
  "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
  "testPathIgnorePatterns": [
    "\\.snap$",
    "<rootDir>/node_modules/"
  ],
  "cacheDirectory": ".jest/cache"
}
```

## typesモジュールの追加

```
yarn add --dev @types/jest @types/react @types/react-native @types/react-test-renderer
```


## yarn tsc

コンパイルをするとエラーが出てこなくなるはずです。

## option
今のままだと、tsxがプロジェクト直下に存在し、jsファイルがその場に出来上がってしまうので、任意で以下の修正を加える。

- srcフォルダを作成して、App.tsxを移動させる。
- tsconfig.jsonに以下の3行を加える。

```json:tsconfig.json
{
  "compilerOptions": {
    ...
    "outDir": "./artifact/",　　/* jsファイルの生成場所を指定 */
    "rootDir": "./src/", /* コンパイル箇所の指定 */
    ...
  },
  "include": ["./src/*.tsx","./src/**/*.tsx"]
}
```

これでフォルダの階層が汚れないです。（完全なる好みですが、、）
これで気分良くアプリをスタート！
WireMock の RequestBodyMatching で可変項目も検証する方法

対向先をモック化したテストを行いたいときにはよく WireMock を使用しています。
リクエストマッチングも行うことができ非常に便利です。

``` java
stubFor(post(urlEqualTo("/mockurl"))
    .withRequestBody(equalToJson(REQUEST_JSON_STRING))
    .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json")
    .withBody(RESPONSE_JSON_STRING)));
```

上記のように書けば、`REQUEST_JSON_STRING` に一致する JSON メッセージを受け付けた場合のみ、`RESPONSE_JSON_STRING` を返却してくれます。

ところが、

- アプリでランダム文字列を発行している場合
- アプリで現在時刻を利用している場合

など、マッチングが難しい項目もよくあります。

``` json
{
    "token": "uPx2bB9"
    "accept_date": "2018-01-01T00:00:00.000Z",
}
```

また、`REQUEST_JSON_STRING` をファイルから読み込みたい場合、可変項目の数だけファイルを用意するというのもやりたくありません。

こんなときは、`equalToJson` に引数を追加します。

> StringValuePattern com.github.tomakehurst.wiremock.client.WireMock.equalToJson(String value, boolean ignoreArrayOrder, boolean ignoreExtraElements)

`ignoreExtraElements = true` とすることで、`value` に存在しない要素は無視されます。

``` java
stubFor(post(urlEqualTo("/mockurl"))
    .withRequestBody(equalToJson(REQUEST_JSON_STRING, true, true))
    .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json")
    .withBody(RESPONSE_JSON_STRING)));
```

上記のように設定しておけば、

`REQUEST_JSON_STRING`：

``` json
{
    "name": "hoge",
    "data": {
        "value": 1000
    }
}
```

実際にきたリクエスト：

``` json
{
    "name": "hoge",
    "data": {
        "token": "uPx2bB9",
        "id": "abcde",
        "value": 1000
    }
}
```

でもマッチングに成功します（`token` や `id` の項目は無視される）。
さらに `matchingJsonPath` を使えば、無視された項目の検証も可能です。

> StringValuePattern com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath(String value)

要素が存在することを検証したい場合
（アプリで現在時刻やランダム文字列が発行され、比較が難しい場合など）

``` java
stubFor(post(urlEqualTo("/mockurl"))
    .withRequestBody(equalToJson(REQUEST_JSON_STRING, true, true))
    .withRequestBody(matchingJsonPath("$.data.token")) // "token" の項目があることを検証
    .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json")
    .withBody(RESPONSE_JSON_STRING)));
```

要素の値も検証したい場合
（テストデータに応じて可変な要素を検証したい場合など）

``` java
stubFor(post(urlEqualTo("/mockurl"))
    .withRequestBody(equalToJson(REQUEST_JSON_STRING, true, true))
    .withRequestBody(matchingJsonPath("$.data[?(@.id == 'abcde')]")) // "id" の値を検証
    .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json")
    .withBody(RESPONSE_JSON_STRING)));
```
妄想を育むカルチャー

これまでにないクリエイティブなアイディアが無いか？そんなお話が最近多いように思います。
時代はクリエイティビティを求めている、と耳にします。

どんな考え方をすると、そんな新しいものが生み出されるのでしょうか？
- デザインシンキング、システムシンキング、クエスチョンストーミング、アートシンキング
などなど、これ以外にも色々なアプローチがありそうです。

どれもカッコいい響きですし、実際使いこなせる人の生み出す世界はカッコいいです。一方で、ふと立ち止まって考えてみると、どうもそうした手法をあまり意識せずに、クリエイティブなものを生み出せる人がいることに改めて気づきました。

そんな時に、「妄想」というキーワードが出てきました。

妄想を別の言葉でいうと、正解を求めていくのではなくて、ドーンと自分で新しい世界を再構築していく、力のような気がします。色々と制度疲弊している物事を刷新する際に、そうした妄想力が必要です。時代がクリエイティビティを求めているとは、このようなことでしょうか。

一方で、妄想は危ないものとも言われます。wikipedia曰く、
- 《名・ス自》ない事に対して病的原因からいだく、誤った判断・確信
- 正しくない想念。転じて、根拠のない想像
だそうです。平たくいうと「独りよがりな迷惑な考え」みたいな感じでしょうか。

ならば、その妄想が「独りよがり」を超えた新しい世界になっていれば良さそうです。
自分と周りがワクワクする、そうした状態が発生します。

しかし、そうなると、ついつい「妄想」頑張るぞ！！！と気合いをいれた感じとなり、逆に一歩も動けなくなってしまう時もあるようです。どうも言葉や生み出すものが抽象的になったり、借りたものになってしまうのです。自分自身も気をつけないとよくなる気がします。

そんな時に、壮大な妄想もメチャクチャ大事だけれど、構えずに「ちょっとした妄想（ちょっとしたクリエイティブ）」から入っていくことって、とても大事だなと思いました。そこから、大きな妄想が育まれることもあるでしょう。

最近のお気に入りは、この自分の忙しさを五本指で表現する、TAGで生まれたslackのbot機能です。
こんなのあったらいいなと想った方がいて、作って生まれました。これでみんなの忙しさや状況が見える化されます。
<img width="961" alt="スクリーンショット 2018-12-18 13.00.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/321001/f0492e88-f5d0-6f8b-3c88-30cc4e24a8fe.png">


そんないい妄想が生み出されやすいカルチャーってどんな感じでしょうか？
私は、その人らしさの「らしさ」がいい感じで担保される感じかなーと勝手に定義してみました。

その人にとって、自分らしい部分がちょっと（迷惑にならなければガンガンと）表出でき、ちょっとした妄想を試せることができる環境です。

そんな妄想が生まれそうな施設が、静岡に生まれました！！
キタガワビジネスサービスさんが運営される、北川さんという方の妄想から始まった、みんなの働き方のレシピを生み出す「いちぼし堂」さんです。
https://ichiboshido.com/
<img width="1435" alt="スクリーンショット 2018-12-19 23.23.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/321001/5f01ef92-7f0f-a6b9-b24b-26a35a1e5ab6.png">
運営：キタガワビジネスサービス


Webサイトづくりには、TAGメンバーがメインで関わっています！！
いい感じのサイトが出来上がりました、皆さんのお陰です。
https://ichiboshido.com/

そして、私ふくめてTAGメンバーや、いろいろな人がこの「妄想」に関わっています。色んな人が働ける世界って、いいですねぇ。しかし、作ってからが本番、ここからが大事そうです。いろいろな人から寄せられた協力や応援を追い風に、この場で多様な人がそのひと「らしさ」をいい感じで表出し、いろいろな妄想が生まれて重なり「コト」になった時、ここに豊かなカルチャーが育まれてくれるように思います。

そんなよい妄想溢れるプロジェクトを一緒に作ってほしい、一緒に作りたいという方々を広くお待ちしております！

>「株式会社」じゃなくていい、「組合」でもない。
>私たちはチームでありたい人のための「共同体」です。
>The Agile Guildの想いに共感してくれるメンバーを募集しています。
>https://theagileguild.org/
AWS Lambda + AWS API Gateway + websocketでお手軽双方向通信チャットアプリをサーバレスで簡単構築してみた

この記事は[全部俺 Advent Calendar 2018](https://adventar.org/calendars/3702)の19日目の記事です。

# この記事について
[Amazon API GatewayでWebsocketが利用可能](https://aws.amazon.com/jp/blogs/news/announcing-websocket-apis-in-amazon-api-gateway/)になりました。
これによって、Websocketを使用した**双方向通信がサーバレスで実現できます！**
Websocketでつながっているユーザであれば、バックエンド側からのpush通知も可能になります！
早速試してみたので記事にしてみます。

ちなみに動作しているところはこんな感じです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">websocket chat app on AWS Lambda(serverless) <a href="https://t.co/AGZ1a2ZIP5">pic.twitter.com/AGZ1a2ZIP5</a></p>&mdash; tez (@te22eret) <a href="https://twitter.com/te22eret/status/1075395433948540930?ref_src=twsrc%5Etfw">2018年12月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

バックエンド側から特定のユーザのみにメッセージを送っているところはこんな感じです。
コンソール1ではメッセージを受け取っていますが、コンソール2では受け取っていないことがわかります。
![only_push.gif](https://qiita-image-store.s3.amazonaws.com/0/190807/1d8e60cb-5fdb-c0d0-b0a4-7125842f7027.gif)

## 環境構築
基本的に[このページ](https://aws.amazon.com/jp/blogs/news/announcing-websocket-apis-in-amazon-api-gateway/)に従って環境構築をしていきます。

- [simple-websockets-chat-app](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:729047367331:applications~simple-websockets-chat-app)の`AWS Serverless Application Repository`から、`Deploy`を選択
- `Amazon API Gateway`から、`Choose the protocol`で、`WebSocket`を選択してAPIを作成
- `Amazon API Gateway`の`Routes`から、`$connect`, `$disconnect`, `sendmessage`, `$default`にて呼び出すLambdaをそれぞれ設定してステージング
- `wscat`を使ってテスト

参考までに、`sendmessage`の`Amazon API Gateway`の`Routes`設定は以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190807/298ccec2-05dc-2a6d-8b96-eb1226f44da0.png)

これだけでWebsocketを用いた簡単なチャットアプリがサーバレスで使用できます！

このサンプルだとバックエンド側から特定のユーザのみへのメッセージを送るLambdaが含まれていませんが、`sendmessage`のfunctionを参考に実装すると上で貼ったGIFのような動作をさせることができます。
`postParams.ConnectionId`に`DynamoDB`の`simplechat_connections`テーブルが作成されており、そこに`connectionID`が入力されているので、それを使用すれば特定のユーザのみへチャットを送ることが可能です！

## まとめ
今回使用したサンプルではランダムに`connectionID`が作成されていますが、ユーザごとに固有の値を入力したり、ユーザと`connectionID`を紐づけておけば、もっと簡単にユーザごとへのDMを送ることができそうですね。
`Lambda`と`API Gateway`をいつものように書いて、ちょっと設定を変えるだけで簡単にWebsocketを用いた双方向通信をサーバレスで実現することができるのはすごく良いですね！
OpenCVで画像を回転させてみた

## なにをしたか？
#### →OpenCVで画像を回転

### 実装手順
1. ライブラリのインポート
2. 画像の読み込み
3. 回転の中心を指定
4. 回転処理
5. 画像の保存

※筆者はJupyterNotebookを使用しています


## 実際にやってみた

###1. ライブラリのインポート
~~~Python
import cv2
~~~

OpenCVライブラリをインポート
※OpenCVはインストール済みの状態とします

###2. 画像の読み込み
~~~Python
img = cv2.imread('./data/pict/image1.jpg')
~~~
imread関数で画像の読み込みを行います

###3. 画像の中心を指定
~~~Python
#高さを定義
height = img.shape[0]                         
#幅を定義
width = img.shape[1]  
#回転の中心を指定                          
center = (int(width/2), int(height/2))
~~~
高さ、幅を定義して、回転の中心を指定

###4. 回転処理を実行
~~~Python
#回転角を指定
angle = 45.0
#スケールを指定
scale = 1.0
#getRotationMatrix2D関数を使用
trans = cv2.getRotationMatrix2D(center, angle , scale)
#アフィン変換
image2 = cv2.warpAffine(img, trans, (width,height))
~~~
getRotationMatrix2D関数、warpAffine関数を使って画像を回転

###5. 画像の保存
~~~Python
cv2.imwrite('./data/pict/image2.jpg',image2)
~~~
imread関数で画像を保存


以上の結果から
#####image1(変換前)
![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/932b0f11-9fc9-bd6f-7853-ae50d5d6dfbf.jpeg)

#####image2(変換後)
![image8.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/42c08315-1f17-3886-4bba-794edca2d35d.jpeg)
となり、反時計周りに45度回転できていることが確認できました。
毎月日記をつけられるアプリを作ってみた。

「**毎月日記**」とは、毎月の同日に同じ質問に答えて、自分の回答が**どのように変化していくかを楽しんだり**、単純に日記をつけることにより、**日々の生活の振り返り**をすることを目的としています。

筆者は手書きで、年単位で同じ質問に答える日記を書いています。過去の自分がどんな考えを持っていたのかを知ることで、自分の成長が見れますし、一日を振り返る日記は、次の日の充実度にもつながってくると思います。

[このアドベントカレンダー](https://qiita.com/advent-calendar/2018/renttle)で何度か登場しているLINE Botの機能を実装したアプリになっています。
毎月日記をつけることを強くおすすめするので、とりあえず、使ってみてください。
<a href="https://line.me/R/ti/p/%40vfz7725m"><img height="36" border="0" alt="友だち追加" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>

## 目次
- 機能説明
- おまけ

## 機能説明
LINE Botを友だち追加してもらうと、画面下にメインメニューが出てきます。その左上の「毎月日記」を選択してください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/185039/8ab88d2e-76f5-748c-b609-e56b9e07461c.png" width=30%>

選択すると、**今日の質問**が表示されます。
※ もちろん、質問への回答以外も書いてOKです！

<img width="30%" alt="Image_from_iOS_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/185039/6944631b-4b92-d358-60fd-d4e6d990236b.png">

今日の質問の下に「回答ページへ」があります。こちらから、[Renttle](https://renttle.jp)という、筆者が以前からこつこつ作っているwebサービスへ遷移して、回答ができます。(ログイン不要)

<img width="30%" alt="Image_from_iOS_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/185039/d747bdab-73c1-a717-4032-b8fb43765027.png">

## おまけ
紙媒体で日記をつけることは面倒だと思いますし、書くネタに困ることが多いと思いですよね。僕も何回
か挫折しました。このアプリで、少しでも日記をつける人が増えると嬉しいです。

ぜひ、使ってみてください！
<a href="https://line.me/R/ti/p/%40vfz7725m"><img height="36" border="0" alt="友だち追加" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>
ダーツプレイヤー向けスキルを作ってみた

どうも、ダーツが好きなエンジニアです

少し前ですが、ゼロワンアシスタントなるスキルを作ってみました。
なんとなく気に入らない点などを書いて未来の自分に改修をたくそうと思いました

#現状
[スキルのページ](https://www.amazon.co.jp/gp/product/B07FZYDR1T)


ダーツのルールであるゼロワンゲーム、その中でも701ルールをAiアシスタント上で実現したものです。
簡単に解説すると701という数字を最初にぴったり0にした人の価値です。

なのでロジック自体は簡単に実装できました。
ユーザーはアレクサにラウンドごとの点数を言うだけです。

#とはいえ使いにくい
実装自体は簡単だったのですが、現状とても使いにくいです。
理由はアレクサの仕様である、応答待機時間が関係しています。
アレクサはユーザーからの応答を待ち、一定時間立つとセッションを閉じ、スキルを終了します。
８秒前後だったはずです。
プレイヤーがダーツを投げる、特典を計算する、アレクサに言う
この過程で余裕でオーバーします。
私の場合、計算が少し遅れると過ぎて終了してしまいます。

#対策
延長するインテントを入れようと思ったのですが、場合によっては投げている途中に８秒を超えてしまう場合があります。
投げている途中に視線を変えなくていいとはいえ、リズムを崩すのはできれば避けたいです。

リプロンプトテキストを無駄に長くするのも、開発者の自分以外には意図が伝わらないので避けたいと思いました。
投げている間ずっとアレクサがずっと喋っていると集中できなさそうなので...

#じゃあどうすんの？
なんとなく考えたのがSSMLによる音声再生で少し延長する手段です。
ダーツバーなどにありがちな雑音を再生するようにすれば
雰囲気を醸し出しつつも、言葉を垂れ流し続けるよりも自然に延長できる気がしました。
今だと
現ラウンドの残り点数を読み上げ→リプロンプト→８秒ルールでセッションが閉じる
音声を加えることで
現ラウンドの残り点数を読み上げ→音声再生(3-5秒）→リプロンプト→８秒ルールでセッションが閉じる

のようになれば対策できそうな気がします！

#まとめ
他の人が８秒ルールの壁にぶち当たったとき、どのように対策しているのか気になりますね。
もし、良い方法をご存知の方がいたら教えていただきたいです。
軽い課題。。。

phpの基礎問題的なヤツやってみました。

⑴9から開始して10回ループさせて、数値がカウントダウンするプログラムを作成しましょう。
[![Screenshot from Gyazo](https://gyazo.com/dd2b173332a3cb1891dd1d05c77ec8f3/raw)](https://gyazo.com/dd2b173332a3cb1891dd1d05c77ec8f3)

⑵0から開始して、1000回ループさせる中で、100番目ごとに表示するプログラムを作成しましょう。
[![Screenshot from Gyazo](https://gyazo.com/870cbea76fc3842a5813a86103569aae/raw)](https://gyazo.com/870cbea76fc3842a5813a86103569aae)

⑶0から開始して、1000回ループさせる中で、301、601、901番目を表示するプログラムを作成しましょう。
[![Screenshot from Gyazo](https://gyazo.com/ba268a5c4fa564af9b4cced00a0bfff3/raw)](https://gyazo.com/ba268a5c4fa564af9b4cced00a0bfff3)


早くPHPでモノつくりたい。。。
[Confluence]会社組織としてAtlassian人になるActiveDirectory連携Filter tips(LDAP Search編)

俺です。

[モデン情シスアドベントカレンダー2018](https://adventar.org/calendars/3175)です。
１日は３２時間あるからまだ12/19だぞと思っていたら世間一般的に日付が変わるギリギリのエントリでした。反省。

さて、孤軍奮闘しているAtlassianな管理者を、会社組織の一員として迎えるTipsです。
Confluence Server Editionを例としています。

会社でAtlassian製品運営してるけど、User Provisioningはポチポチするとか、
登録情報を内部データベースに持つとかAtlassian人が一気に増えたらどーすんの腱鞘炎になるよ。
ということでAtlassian JIRAやConfluenceにはLDAP(Active Directory)連携機能があります。

# ナニができるのか

全てADのユーザーとグループで制御できるようになります。
Confluenceユーザー管理職人を社内に登用する必要がなくなります。
最高。

- ユーザー登録と削除
- ログイン
- グループ登録
- グループへのConfluence権限関連付け


# ConfluenceでのADグループ連携実装例

ConfluenceのAD連携機能の標準フィルターでは、ベースDNのcn=Person全て登録するフィルタになっており、
購入したライセンス数を超えるAtlassian人を創造してしまうことが考えられます。

そこでAD上のユーザーとグループを以下条件でフィルタ登録する例を記載します。
記載するフィルタ構文は以下ベースDNとしています。
ベースDN: ou=oreno,dc=corp,dc=co,dc=jp


## AD連携のフィルタ条件

- ConfluenceUsersグループに登録されたユーザーをConfluence一般利用者権限でアクセスさせたい
- ConfluenceAdminsグループに登録されたユーザーをConfluence管理者権限でアクセスさせたい

## フィルター例

- ユーザーフィルター

memberOfがConfluenceUsersまたはConfluenceAdminsに所属するPersonのsAMAccountNameを抽出します。

```
(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=cn=ConfluenceUser,ou=oreno,dc=corp,dc=co,dc=jp)(memberOf=cn=ConfluenceAdmins,ou=oreno,dc=corp,dc=co,dc=jp)))
```

- グループフィルター

ADのグループ名がConfluenceから始まるものをConflunenceのグループとして抽出します。

```
(&(objectCategory=Group)(name=Confluence*))
```

- Confluenceに連携したグループへmemberof登録

`ユーザーメンバーシップの属性を使用` は `グループのメンバーを探す場合` にチェックを付けます。

これでADに登録するだけでConfluenceの利用者を制御することができます。
最高。