OmniAICreator/Qiita-1.07M huggingface dataset:
電子工作 > 555 Timer > 押下後しばらくON状態 | 注意点 | 回路例 | ブレッドボード実装

[カギ閉め忘れ問題 > 対処案 v0.1](https://qiita.com/7of9/items/a2bb833caa91ab798188)
にて検討しているシステム。

ESP8266を使う場合、CR2032駆動は厳しいかもしれない。
[CR2032 コイン電池で動く ESP8266 ロガーを作ってみた（Running ESP8266 by one coin cell）](http://flogics.com/wp/ja/2016/09/cr2032-%E3%82%B3%E3%82%A4%E3%83%B3%E9%9B%BB%E6%B1%A0%E3%81%A7%E5%8B%95%E3%81%8F-esp8266-%E3%83%AD%E3%82%AC%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)
にて電気二重層コンデンサを使った例はあるが、回路が大きくなる。

Trinketなどの小型マイコンをCR2032駆動する、という方法は考えられる。
ATTiny85のICは購入済ではあるが、実装環境の構築とそのメンテやデバッグしずらさを考えると使うのは躊躇している。

別途、555 Timerについて気になりだした。

### 押下後しばらくON状態

[How to use a 555 Timer @ YouTube](https://www.youtube.com/watch?v=CvpP1PaQKo0&list=PL_MJualihC5Cle7jzMWPZEouhJNvHtSJr&index=13) by Arrow Electronics

0:28あたり

> When you trigger the input High, no matter how briefly, it outputs a pulse of a set duration ...

### タイミングチャート

http://www.electronics-tutorials.ws/waveforms/555_timer.html
のMonostable 555 Timerに入力信号と出力信号の図がある。

### 注意点

555 Timerを使う場合の注意点は以下を見つけた。

[NE555（555）をワンショットで使うときの注意、、　今更。備忘録。](http://nevergiveup-yosuke.blogspot.jp/2013/05/ne555555.html) by compassandcameraさん

> ５５５　ワンショット回路で使うときのトリガ信号は、出力信号より短い必要があります。

### 回路例

SBS-203 小型ブレッドボードパーツセット
8 タイマー回路
に回路例がある。
http://www.sunhayato.co.jp/dcms_media/other/MNL-SBS203-08.pdf

### ブレッドボード実装

ブレッドボードで点灯することは確認した。
回路は上記の「8 タイマー回路」を参考に、電解コンデンサは22uFを使用。

- 電解コンデンサは22uFを使用
- 可変抵抗とVRの部分は100kオームにした
- スイッチは使用せず、GNDにピンで接続
- 5秒程度の点灯になる

![s_DSC_0277.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/7cca2457-5976-acc1-3bbc-8c9a20e67085.jpeg)



### 言葉

> You push the button, we do the rest.

George Eastman
https://www.brainyquote.com/quotes/george_eastman_274155
cesiumでgooglemap

#概要
cesiumでgooglemap連動してみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d2eadab2-e327-cc26-0b70-91e9966af561.png)


#サンプルコード

```
var viewer = new Cesium.Viewer('cmap');
var map;
viewer.canvas.addEventListener('click', function(e) {
    var mousePosition = new Cesium.Cartesian2(e.clientX, e.clientY); 
    var ellipsoid = viewer.scene.globe.ellipsoid;
    var cartesian = viewer.camera.pickEllipsoid(mousePosition, ellipsoid);
    if (cartesian) 
    {
        var cartographic = ellipsoid.cartesianToCartographic(cartesian);
        var lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
        var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6); 
        pano(lat, lon);
    }
    else
    {
        alert('Globe was not picked');
    }	
}, false);
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(139.60, 35.60, 100000.0),
});
function pano(lat, lon) {
    var koko = new google.maps.LatLng(lat, lon);
	map = new google.maps.Map(document.getElementById('gmap'), {
        center: koko,
        zoom: 8
    });
}

```

#成果物
http://jsdo.it/ohisama1/QUou

以上。
GCP Cloud Shell に Bluemix の CLIを入れる


全くニーズがなさそうな記事ですが

```
curl -O https://public.dhe.ibm.com/cloud/bluemix/cli/bluemix-cli/0.6.3/IBM_Cloud_CLI_0.6.3_amd64.tar.gz
```

インストールスクリプトを覗いていみると

```
cp -f "${DIR}/bin/NOTICE" /usr/local/Bluemix/bin/
cp -f "${DIR}/bin/LICENSE" /usr/local/Bluemix/bin/
cp -f "${DIR}/bin/bluemix" /usr/local/Bluemix/bin/
cp -f "${DIR}/bin/bluemix-analytics" /usr/local/Bluemix/bin/
cp -f "${DIR}/bin/cfcli/cf" /usr/local/Bluemix/bin/cfcli/
cp -f "${DIR}/bx/bash_autocomplete" /usr/local/Bluemix/bx/
cp -f "${DIR}/bx/zsh_autocomplete" /usr/local/Bluemix/bx/
ln -sf /usr/local/Bluemix/bin/bluemix /usr/local/Bluemix/bin/bx
ln -sf /usr/local/Bluemix/bin/bluemix /usr/local/bin/bluemix
ln -sf /usr/local/Bluemix/bin/bluemix /usr/local/bin/bx
ln -sf /usr/local/Bluemix/bin/bluemix-analytics /usr/local/bin/bluemix-analytics
```

な感じになっています。よくある `/usr/local` に入れるタイプですね。

> いまおもうと最初の状態で `/usr/local` すべて $HOME に移動しておけば良かった気がする。初期状態でなにかファイルがあったのか今となっては分からない。

$HOME以下に導入用のディレクトリを作って /usr/local にリンクしておきましょう

```
mkdir $HOME/local/Bluemix
sudo ln -s /home/bmxlesson/local/Bluemix /usr/local
sudo $HOME/Bluemix_CLI//install_bluemix_cli
```

後念のため `.bash_profile`に以下を足しておきます。Cloud Shellってどのタイミングでインスタンスが削除されているのかわからないのですが削除されても利用できるようにしておきます。

```$HOME/.bash_profile
if [ ! -d /usr/local/Bluemix/bin ] ;then
        sudo ln -s /home/bmxlesson/local/Bluemix /usr/local
        export PATH="/usr/local/Bluemix/bin:/usr/local/Bluemix:$PATH"
else
        export PATH="/usr/local/Bluemix/bin:/usr/local/Bluemix:$PATH"
fi
```

後はよしなに

```
$ bx login
Select an API endpoint:
1. eu-de - https://api.eu-de.bluemix.net
2. au-syd - https://api.au-syd.bluemix.net
3. us-east - https://api.us-east.bluemix.net
4. us-south - https://api.ng.bluemix.net
5. eu-gb - https://api.eu-gb.bluemix.net
6. Enter a different API endpoint
Enter a number> 4

```

いつの間にか、us-east リージョンが増えてるな（Bluemix）
ところでで `_` が入力出来ないのはどうしたらいいのだろう？
ぶっちゃけ幾ら？ざっくり幾ら？に立ち向かう見積コントロールとkintoneファスト見積ツール

ソフトウェア見積シリーズその２、かつ[kintone Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kintone)の12/19分記事でございます！

# 「ざっくり幾らです？稟議通すんで。」

打合せの現場でのよくあるやり取りですよね。
既に値付けされているパッケージ化されたソフトであればともあれ、これからエンジニアが寄ってたかって開発する規模の案件でお客さんからそんな投げかけをされたらどうでしょうか？

適当な事を言ってしまうと各方位から責められ、社内で居場所が無くなる可能性もありますね。
また見積担当者のメンタル的な状況で強気~弱気とブレていく場合もあります。感覚のみで見積ると変数多すぎで泣くことになります。見積怖い。

# 「ぶっちゃけ◯人月もあれば…」
ああ、遂にダークサイドに落ちちゃいましたね。

ファジーに打ち返してしまうと後々までファジーな価格調整を強いられることになります。
お客さんとしては、「ああ、ソフトウェアの価格なんてあってないようなものなんだな」と刷り込みが発生し、「今回はこの枠で」「予算ないけどなる安なる早で」「予算がないならこの機能は端折るしか無いですね」「テスト工数減らすか…」などどんどんダメ案件スパイラルに陥っていきます。いい案件になるもならないも見積次第です。

**お客さんとエンジニア双方がハッピーになるには、いい見積が必要です。**
**さらには見積には確固たる「根拠」が必要です。**

# 抑えておくべき見積の手法
最低でも２点見積、可能であれば３点見積の手法です。

### ２点見積

各見積工程を最小値と最大値から算出します。

- 何事もなくスムーズに終わった場合の工数（最小工数）
- ハマってしまった、手間取った場合の工数（最大工数）
- バッファ（最大工数-最小工数/2）

**２点見積り値＝（最大工数+最小工数/2）+バッファ**
バッファの出し方には様々議論あると思いますが、概算見積ならこの精度で十分かと個人的に思います。

### ３点見積
PERT計算とも呼ばれる方法ですね。通常値を出すためには複数人で見積ポーカーをしたほうが精度が上がると思われます。

- 何事もなくスムーズに終わった場合の工数（楽観値）
- ハマってしまった、手間取った場合の工数（悲観値）
- 何度か見積もった中での平均工数（通常値）

**３点見積り値＝（４×「通常値」＋「悲観値」＋「楽観値」）÷６**

# そこで登場ファスト見積ツール(kintone)

エクセルの見積シートでちゃちゃっとでも大丈夫ですが、見積データの統計をゆくゆく取っていく場合はkintoneおすすめです。先程のよくわかんない数式もkintoneの「計算」で実現できますね。

##２点見積アプリを作ってみた
![001.png](https://qiita-image-store.s3.amazonaws.com/0/76660/599c54f8-c760-60a7-6649-6c88a23e0490.png)

ちょっと極端な例ですが、最小（楽観）と最大（悲観）それぞれの値を入れることで、ざっくり見積りができております。

##３点見積アプリも作ってみた
![002.png](https://qiita-image-store.s3.amazonaws.com/0/76660/5686ec68-101d-a38c-8491-6476f2e131af.png)
クリティカルパスを指定して粗粗の工期の把握をしたり、あれこれ工夫をしております。
※これはJavascriptのカスタマイズであれこれガリガリ作っております。

#　で、結局「ざっくり幾ら？」にはどう答えるの？
ケースバイケースですが、

- 「◯日時間をください！概算でお見積を提出します」
- 「システムの要件によりますが、◯ヶ月~◯ヶ月の工期でしょうか。金額にすると◯万円~◯万円のレンジかと。」

必ずしも打ち返さなくてもいいのでは無いでしょうか？正しく見積もるのが優先ということで。

#　さくっと見積り終わらせて、良いクリスマスを！
というわけで、エモい１点見積絶対ダメ、２点以上見積で説明のつく見積をつくりましょう！

一応簡易版の見積アプリテンプレート置いておきますね！hohoho...
http://antbear-creates.sakura.ne.jp/_share/20171219_kintone_estimate_template.zip
Python3.2以降でのマルチタスク処理はThreadではなくconcurrent.futuresを使え

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の19日目です。

# はじめに

Pythonでスレッドベースの並列処理をするには以前は[Thread]を使うしかありませんでしたが、3.2からは[concurrent.futures]モジュールが追加され、マルチタスク処理がやりやすくなりました。

[Thread]:http://docs.python.jp/3/library/threading.html#thread-objects
[concurrent.futures]:http://docs.python.jp/3/library/concurrent.futures.html#module-concurrent.futures
[concurrent.futures.ThreadPoolExecutor]:http://docs.python.jp/3/library/concurrent.futures.html#threadpoolexecutor
[map()]:http://docs.python.jp/3/library/concurrent.futures.html#concurrent.futures.Executor.map

# 例題

引数で受け取った値を返すだけの関数を複数実行するケースを考えてみます。

```py3
import random
import time

def task(value):
    print('{} start'.format(value))
    time.sleep(random.uniform(0.5, 1.0))
    print('{} end'.format(value))
    return value
```

# Threadを使う場合

3.1まではこういう書き方をするしかありませんでした。

```py3

from threading import Thread

results = []
f = lambda v: results.append(task(v))
threads = [Thread(target=f, args=(i,)) for i in range(10)]
for thread in threads:
    thread.start()
for thread in threads:
    thread.join()

print(results)
```

- Threadで呼び出す関数から直接戻り値は取得できないので、lambda式で戻り値を`results`に格納します。
- Threadを作成しただけでは実行されないので、`start()`を呼びます。
- Threadの完了を待つために`join()`を呼びます。

メンドくさいですね。

# concurrent.futures.ThreadPoolExecutorを使う場合

```py3
from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=10) as executor:
    results = list(executor.map(task, range(10)))

print(results)
```

[concurrent.futures.ThreadPoolExecutor]を使うと、スレッドベースのマルチタスク処理を実行できます。

[map()]は第1引数の関数に対して第２引数の要素を順番に渡した呼び出しを行ってくれます。
戻り値は関数の実行結果のイテレータになります。


# 参考

- Python3ドキュメント
    - ライブラリーリファレンス
        - [17.4. concurrent.futures – 並列タスク実行](http://docs.python.jp/3/library/concurrent.futures.html)
- [Pythonでconcurrent.futuresを使った並列タスク実行 - Qiita](https://qiita.com/tag1216/items/db5adcf1ddcb67cfefc8)
PHPで独自アセンブリ言語を作り、VS Code の言語拡張でデバッガを作ってみた話

この記事は [Visual Studio Code Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vscode) の14日目の記事です．

## はじめに

VS Code を使って Prolog を書いていたりしている珍しい人なのですが、PrologのデバッガもちゃんとあったりしてVS Code 凄いなと思うわけですが、残念ながらまだ満足な動きはしてくれていません。ということで、不満なら作ってしまえばいいじゃないかと色々とデバッガのことについて調べてみています。自作言語とサーバプログラムのやり取りをするのにはプロトコルを決める必要がありますが作ったことがないのでどういうふうに作ったら良いのかもわかりません。ところで、VS Code のデバッガはサーバプロセスを TypeScript から呼び出して作るようになっています。TypeScriptの型があるおかげでデバッガは作りやすいのですが、 VS Code のデバッガのプロトコルをそのまま使ってしまえば、間にTypeScriptを置かなくても直接 VS Code と対話してデバッガを動かせるはずです。そう思って、 PHP でデバッガを作成してみました。

## vscode-debugger-simple-asm [^1]

これは簡単なアセンブラ言語を作ってそのデバッガを作るサンプルプロジェクトです。
通常は、TypeScriptでDebug Extensions を書くのですが、簡単な標準入出力で VS Code Debug Protocol を使ってデバッグ用のサーバが書けそうなので、Debug Extensions を PHP で書いてみたというものです。

![img](https://raw.githubusercontent.com/hsk/vscode-docs/ja/docs/extensions/images/example-debuggers/debug-arch.png)


デバッガを試す場合に、リロード作業が必要ないのでデバッガのデバッグをPrintfデバッグしながら開発したい場合に便利かもしれません。
また、初めてのデバッガ開発だけどどうしたら良いのかよくわからないという場合に、直接VSCodeのプロトコルを使うことを検討したい場合にも役立つかも知れません。

![img](https://raw.githubusercontent.com/hsk/vscode-debugger-asm-php/master/images/fig1.png)

以下のようなアセンブラをデバッグしてみることが出来ます:

asm.txt

```
main:   call addp 1 2 a
        print a
        ret 0

addp:   enter a b
        add a b c
        ret c
```

## デバッガの構成

- asm.txt : デバッガでデバッグできるアセンブラのソースコードです。
- package.json : VSCode の拡張の設定が書いてあります。
- src/extensions.ts : VSCodeに読み込まれる拡張です。 out/src.js に展開されます。デバッグサーバのプロセスを起動し標準入出力を使ってデバッガを動かします。ほとんど何もしません。
- dist/server.sh : デバッガのサーバは外部プロセスです。dist/server.php を呼び出し、標準エラーをファイルに吐き出したりします。
- dist/server.php : デバッガの本体です。言語機能そのものも内包しています。VSCodeのデバッグ時にプロセス起動されます。
- src/server.ts : こちらはTypeScriptによるデバッガの本体です。これは無くてもデバッガは動作します。
- client.php : デバッグサーバに接続してメッセージを送り受け取ることが出来ます。デバッガのメッセージ内容を把握するのに役立ちます。

## 実行方法

    npm install
    make ts
    make

とすると、このプロジェクト自体が ~/.vscode/extensions/asm-php-0.0.1 にコピーされます。

最初は一度再読込が必要です。 F1 を押した後、ウィンドウを再読込してください。


２回目以降は、外部プロセスのみの書き換えになるのでも再読込なしで実行できます。
また、server.shを書き換えることで、読み込みプログラムをphpからjsに書き換えることも可能です。

デバッグコンソールに3と表示されれば成功です。

![img](https://raw.githubusercontent.com/hsk/vscode-debugger-asm-php/master/images/fig4.png)

make または、make tailを実行しておくとデバッグサーバの標準エラー出力が出力結果がターミナルに表示されてログとして利用できるので便利です。ただし、Unix環境でないと動かないかもしれません。
makeによるログ表示はtailコマンドで/tmp/server.logを表示するだけなので表示しなくても動作します。

![img](https://raw.githubusercontent.com/hsk/vscode-debugger-asm-php/master/images/fig3.png)

次は asm.txt を開き、ブレークポイントを設定しデバッグしてみましょう。
プログラムを停止したあと変数の中身を書き換えることも出来ます。

![img](https://raw.githubusercontent.com/hsk/vscode-debugger-asm-php/master/images/fig2.png)

## アンインストール

    make uninstall

とすると、拡張は削除されます。

## 参考

[^1]: https://github.com/hsk/vscode-debugger-simple-asm
特異メソッドが定義されているクラスはどこ？



## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの20日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は特異メソッドと特異クラスの関係について説明します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第7章まで読み終わっていること。

## 特異メソッドが定義されているクラスはどこ？


Rubyのメソッドは必ず何らかのクラスに定義されています。特異メソッドもその例外ではありません。特異メソッドはインスタンスそのものにメソッドが定義されているようには見えますが、実はそうではなく、特異クラスと呼ばれる特殊なクラスに定義されています。さらに、この特異クラスのスーパークラスは、特異メソッドを定義したインスタンスが属するクラスになっています。

特異メソッドが定義されている特異クラスと、その特異クラスのスーパークラスを確認するコード例を以下に示します。

```ruby
alice = 'I am Alice.'

# shuffleという特異メソッドを定義する
def alice.shuffle
  chars.shuffle.join
end

# 以下のコードの戻り値が、shuffleメソッドが定義されている特異クラス
alice.singleton_method(:shuffle).owner #=> #<Class:#<String:0x007fcd10826948>>

# 上の特異クラスのスーパークラスはStringクラス
alice.singleton_method(:shuffle).owner.superclass #=> String

# このインスタンスが属する特異クラスを確認すると、2つ上に出てきた特異クラスと全く同じ
alice.singleton_class #=> #<Class:#<String:0x007fcd10826948>>
```

上の結果からわかる内容をクラス図で表すと、次のようになります。

![Screen Shot 2017-12-19 at 5.28.41.png](https://qiita-image-store.s3.amazonaws.com/0/7465/fd89c78b-0dcf-1251-4d80-584f917725ef.png "Screen Shot 2017-12-19 at 5.28.41.png")


特異クラスはふだん表に出てこないため、その存在に気づくことはほとんどありません。ですが、このように特異メソッドはそのインスタンスのためだけに存在する特異クラスに定義されているのです。

## 次回予告

次回は第9章の例題で使用した「正規表現チェッカープログラム」のテストを自動化する方法を紹介します。
systemd-nspawnのユニットファイルの書き方

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 25日目の記事です。

ユニットファイルの書き方は[こちら](https://github.com/systemd/systemd/blob/master/units/systemd-nspawn%40.service.in)が参考になるかと思います
個人的には以下のように書いています。


```
[Unit]
Description=Container %i
Documentation=man:systemd-nspawn(1)
PartOf=machines.target
Before=machines.target
After=multi-user.target

[Service]
ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-bridge=br0 --machine=%i
KillMode=mixed
Type=notify
RestartForceExitStatus=133
SuccessExitStatus=133
Slice=machine.slice
Delegate=yes
TasksMax=8192

# Enforce a strict device policy, similar to the one nspawn configures
# when it allocates its own scope unit. Make sure to keep these
# policies in sync if you change them!
DevicePolicy=strict
DeviceAllow=/dev/null rwm
DeviceAllow=/dev/zero rwm
DeviceAllow=/dev/full rwm
DeviceAllow=/dev/random rwm
DeviceAllow=/dev/urandom rwm
DeviceAllow=/dev/tty rwm
DeviceAllow=/dev/tty0 rwm
DeviceAllow=/dev/tty1 rwm
DeviceAllow=/dev/tty2 rwm
DeviceAllow=/dev/tty3 rwm
DeviceAllow=/dev/tty4 rwm
DeviceAllow=/dev/tty5 rwm
DeviceAllow=/dev/tty6 rwm
DeviceAllow=/dev/tty7 rwm
DeviceAllow=/dev/tty8 rwm
DeviceAllow=/dev/tty9 rwm
DeviceAllow=/dev/net/tun rwm
DeviceAllow=/dev/pts/ptmx rw
DeviceAllow=char-pts rw

# nspawn itself needs access to /dev/loop-control and /dev/loop, to
# implement the --image= option. Add these here, too.
DeviceAllow=/dev/loop-control rw
DeviceAllow=block-loop rw
DeviceAllow=block-blkext rw

[Install]
WantedBy=machines.target

```
e-typingを自動化してハイスコアを叩き出す

# はじめに
タイピングを練習してもなかなか速くならないのでSeleniumで自動化してハイスコア叩き出します。

# 実行環境
- マシン：MacBook Pro (Retina, 13-inch, Mid 2014)  
- CPU：2.8 GHz Intel Core i5
- メモリ：16 GB 1600 MHz DDR3
- プログラミング言語：Python 3.6

# プログラム
chromedriverを以下から最新版をダウンロード、解凍してプログラムと同じディレクトリに配置して下さい。
https://sites.google.com/a/chromium.org/chromedriver/downloads

```python3:main.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

url='https://www.e-typing.ne.jp/roma/check/'
driver = webdriver.Chrome(executable_path='chromedriver')
driver.get(url)

# 今すぐチェック！をクリック
driver.find_element_by_class_name('edro').click()

time.sleep(1)

# モーダルにスイッチ
driver.switch_to_frame('typing_content')

# スタートをクリック
driver.find_element_by_xpath('//div[@id="start_btn"]').click()

time.sleep(1)

# スペースキーでスタート
driver.find_element_by_tag_name("body").send_keys(Keys.SPACE)

time.sleep(4)

while True:
    try:
        sentences = driver.find_element_by_xpath('//div[@id="sentenceText"]').find_elements_by_tag_name('span')[1].text
        for sentence in sentences:
            driver.find_element_by_tag_name("body").send_keys(sentence)
        time.sleep(1)
    except:
        break
```
あまり速すぎるとスコアが-1になってしまうのでループの途中でtime.sleep()を入れています。 

# 実行結果
![ezgif-4-d20a92e5fc.gif](https://qiita-image-store.s3.amazonaws.com/0/211748/ea528d1e-9323-3f86-6316-bdfaaf0a3d53.gif)


実行環境が低スペックのうえ、録画しながらスクリプトを実行したためあまり速度が出ていませんが、録画なしの場合スコア1000以上を叩き出すことができました。

<img width="747" alt="スクリーンショット 2017-12-19 9.12.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/211748/602060d0-50c3-2d6c-f2fa-7cafbfa61f1b.png">
systemd-nspawnの中でDockerを動かす

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 24日目の記事です。

dockerhubからコンテナイメージを取ってくるのにDockerを入れたい場合があります。
コンテナ内でDockerを走らせる場合の話です

そのまま起動するとこんな感じのエラーとなるので

```
12月 17 22:04:59 test-ubuntu dockerd[111]: time="2017-12-17T22:04:59.587312884+09:00" level=info msg="libcontainerd: new containerd process, pid: 137"
12月 17 22:05:00 test-ubuntu dockerd[111]: time="2017-12-17T22:05:00.649577431+09:00" level=error msg="'overlay2' is not supported over btrfs"
12月 17 22:05:00 test-ubuntu dockerd[111]: time="2017-12-17T22:05:00.649621350+09:00" level=error msg="[graphdriver] prior storage driver overlay2 failed: backing file system is unsupported
12月 17 22:05:00 test-ubuntu dockerd[111]: Error starting daemon: error initializing graphdriver: backing file system is unsupported for this graph driver

```

/etc/systemd/system/docker.serviceのオプションを変更してストレージドライバにbtrfsを使うようにします

```
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS --storage-driver=btrfs
```

これで起動できますが、runは出来ないのでこんな感じで、イメージを抜き出しています

```
docker export $(docker create debian:latest) > debian.tar
```
Structクラスで単純なクラスを手軽に定義する


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの19日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回はStructクラスで単純なクラスを定義する方法を説明します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第7章まで読み終わっていること。

## Structクラスで単純なクラスを手軽に定義する

RubyにはStructという構造体（のようなクラス）を作るクラスが用意されています。このクラスは次のように使います。

```ruby
# Structを使ってUserクラス（Userの構造体）を作成する
User = Struct.new(:first_name, :last_name)

# Structクラスから作成されたUserクラスを使う
user = User.new('Alice', 'Ruby')

# 属性を参照する
user.first_name
#=> "Alice"
user.last_name
#=> "Ruby"

# 属性を変更する
user.last_name = 'Python'
user.last_name
#=> "Python"
```

少し不思議なコードですが、`Struct.new`を呼ぶとClassオブジェクトが返されます。

```ruby
Struct.new(:first_name, :last_name).class #=> Class
```

これを定数（上のコードでいうと`User`）に代入すると、新しいクラスをその場で定義したのと同じことになるのです。`Struct.new`の引数に渡したシンボルは、作成したクラスの属性になり、値を読み書きするメソッドが自動的に作成されます。また、作成したクラスの`new`メソッドに渡した引数は、それぞれ`Struct.new`で渡したシンボルに対応して作成したクラスの属性にセットされます。

また、`Struct.new`で指定しなかった属性は読み書きできません。

```ruby
User = Struct.new(:first_name, :last_name)
user = User.new('Alice', 'Ruby')

# ageという属性は存在しないので読み書きできない
user.age = 20
#=> NoMethodError: undefined method `age=' for #<struct User first_name="Alice", last_name="Ruby">
user.age
#=> NoMethodError: undefined method `age' for #<struct User first_name="Alice", last_name="Ruby">
```

さらに、`Struct.new`にブロックを渡すと作成したクラスにインスタンスメソッドを定義することもできます。

```ruby
User = Struct.new(:first_name, :last_name) do
  # インスタンスメソッドの定義
  def full_name
    "#{first_name} #{last_name}"
  end
end
user = User.new('Alice', 'Ruby')
# インスタンスメソッドの呼び出し
user.full_name
#=> "Alice Ruby"
```

上のコードは次のようにclass構文を使って書いてもほとんど同じ結果になります。

```ruby
# Struct.newで返却されたクラスを継承してUserクラスを定義する
class User < Struct.new(:first_name, :last_name)
  def full_name
    "#{first_name} #{last_name}"
  end
end
user = User.new('Alice', 'Ruby')
user.full_name
#=> "Alice Ruby"
```

このようにStructを使うと、データを保持するための単純なクラスを手軽に作ることができます。とはいえ、普通のクラスとStructで作ったクラスをどのように使い分けるのかは判断が難しいところです。一般的には「わざわざ明示的にクラスを定義するほどでもないケースに向いている」などと言われたりしますが、「じゃあ、それってどんなケース？」となってしまいます。筆者の意見としては初心者のうちはStructを無理に使おうとせず、普通のクラス定義を使う方が変な癖が付かなくて良いと思います。

## 次回予告

次回は特異クラスについて説明します。
Centos7でsystemd-nspawn

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 23日目の記事です。

Centos7でsystemd-nspawnやってみます
と言ってもほぼubuntuとかと同じでした
なので差分だけ

# ネットワーク周り

systemd-networkdに切り替えました

```bash
systemctl disable network
systemctl disable NetworkManager
yum install bridge-utils systemd-networkd
systemctl enable systemd-networkd
```

# コンテナの用意

```bash
wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1503.raw.xz
xz -d CentOS-7-x86_64-GenericCloud-1503.raw.xz
# パーティションの開始位置を確認
fdisk CentOS-7-x86_64-GenericCloud-1503.raw
# mountしてコピー
losetup -o 1048576 /dev/loop0 ./CentOS-7-x86_64-GenericCloud-1503.raw
mount /dev/loop0 /mnt/
rsync -a --numeric-ids /mnt/ /var/lib/machines/centos7/
```

あとはいつも通りに起動しました
Best Shoulder exercises

नमस्ते दोस्तों मै कुणाल सैनी Hindiinformations में आपका स्वागत करता हूँ , ये Post(<a href="https://hindiinformations.com/best-shoulder-workout/">Best shoulder exercises</a>) हमारे उन दोस्तों के लिए है जो Gym तो जाते है पर वहा पर Exercise करने में कुछ गलतिया करते है यानी हमारा ये Post Shoulder Size को बढ़ाने के लिए तैयार किया गया है|
![Men.jpg](https://qiita-image-store.s3.amazonaws.com/0/224705/11e1163c-b6f9-f46d-5269-20c4827b5336.jpeg)
Wio LTE用Ambientライブラリ

データのグラフ化が簡単にできるWebサービス[Ambient](https://ambidata.io/)のWio LTE向けのライブラリを作りました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/5a4d154c-1c4d-f7fa-1fa3-499347d118e9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/365c1634-630b-a3fc-b6f8-83b66cafc305.png)


Wio LTEについては[Wio LTEをJavaScriptで開発](https://qiita.com/jksoft/items/16dabaadbbbb8acc29e3)を参照ください。
今回作ったのArduino環境向けのライブラリです。

#Ambientの概要
[Ambient](https://ambidata.io/)は無料のユーザー登録とWeb側のちょっとした設定であっというまにリアルタイムにデータのグラフ化ができるサービスです。

グラフ設定画面はこんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/798b0c6c-d407-1657-98d0-fcd58c2f1249.png)


#ライブラリの使い方
他のライブラリと同じように以下のページからZIP形式でダウンロードして、Arduino IDEでインポートすればライブラリとして取り込まれます。

https://github.com/junichikatsu/Ambient_Wio_LTE_lib

スケッチ例は10秒ごとにカウントアップしていく値を[Ambient](https://ambidata.io/)にアップロードするスケッチとGroveの温湿度センサーの値をアップロードするスケッチを同封してます。

以下のスケッチは10秒ごとにカウントアップしていく値を[Ambient](https://ambidata.io/)にアップロードするスケッチ例です。

```arduino:
/*
 * 10秒ごとにカウントアップする値をAmbientに送る
 */
#include <WioLTEforArduino.h>
#include <WioLTEClient.h>
#include "Ambient.h"

#define APN               "soracom.io"
#define USERNAME          "sora"
#define PASSWORD          "sora"

#define PERIOD 10000 // milliceconds

WioLTE Wio;
WioLTEClient WioClient(&Wio);

unsigned int channelId = 100;
const char* writeKey = "...writeKey...";
const char* userKey = "...userKey...";
Ambient ambient;

int counter = 0;

void setupLTE() {
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(5000);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("### Connecting to \""APN"\".");
  delay(5000);
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
}

void setup() {
  setupLTE();
  ambient.begin(channelId, writeKey, &WioClient);
}

void loop() {
  unsigned long stime = millis();

  SerialUSB.print("counter=");
  SerialUSB.println(counter);
  ambient.set(1, counter);
  ambient.send();
  
  counter++;
  
  unsigned long elapse = millis() - stime;
  if (elapse < PERIOD) {
      delay(PERIOD - elapse);
  }
}

```

自分のアカウントのグラフに表示するのは[Ambient](https://ambidata.io/)のグラフ情報でwriteKeyとuserKeyを調べて、プログラムに書き込むだけです。
このプログラムを動作させると次のようなグラフになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/38138c43-04f0-b5df-60f6-44f579b23e1c.png)

#Ambient設定方法
[Ambient](https://ambidata.io/)のユーザー登録や設定方法についてはオフィシャルの[チュートリアル](https://ambidata.io/docs/)を参考にしてください。
扱い方はESP8266版とほぼ同じです。
ノードを複製する。

appendChildすると、元いた場所からノードが消えてしまう・・複製をしたい・・。

## 使用するメソッド
cloneNode

## 使い方
```javascript
var hoge = document.querySelector('#hoge');
var clone = hoge.cloneNode(true); //引数に「ture」を指定

var wrap = document.querySelector('#wrap');
wrap.appendChild(clone);
```
Select要素の三角部分を擬似要素で表現した際、クリックできない


##事象：

セレクト要素の「▼」部分を擬似要素で表した場合、
矢印部分をクリック（タッチ）してもselectにフォーカスするだけでメニューが開かない。

##解決策：
疑似要素対しに「pointer-events: none;」としておく。
マウスイベントのターゲットから除外し、下に存在するselectが反応することが可能。

```css
.select-box02 label {
	position: relative;
}
 
.select-box02 label:after {
	display: block;
	content: " ";
	position: absolute;
	top: 50%;
	right: 20px;
	width: 20px;
	height: 20px;
	margin-top: -8px;
	background: url(arrow02.png) 0 0 no-repeat;
	background-size: 20px;
	pointer-events: none;/*　←★これ*/
}
```
Wikipedia記事の最初の段落を取得する

こんにちは、18日目の投稿になります

# はじめに

今日は、リアクティブな分散システムを構築するためのライブラリ群である[Cro](http://cro.services)を紹介したいと思います。

例題として、`Cro::HTTP::Client`を使ってWikipedia記事の最初の段落を取得していきます。

この最初の段落は、簡潔にそのページのサブジェクトについての概要が記述されています。
そのため、自然言語処理において言語資源としてとてもよく使われています。
例えば、有名なシステムだとIBMのWatsonでの使用例があります [0]

私の知る限り代表的な取得方法は2種類あります:

+ 1) ダンプ(pages-articles.xml.bz2 [1])もしくはAPI [2] でのデータ取得後、Wiki記法で書かれたページを自分でパースして抽出する
+ 2) CirrusSearch [3] のダンプ [4] もしくはAPI [5] でのデータ取得後、JSONから該当要素を取り出す

ここで、CirrusSearchの方のデータの特徴はWiki記法が展開された状態になっていて、自分でパースする必要がない点です。

今回の例では、CirrusSearchのAPIを使って、最初の段落を取得していきます。

## インストール

+ [zef](https://github.com/ugexe/zef)で入れます

```
$ zef install --/test cro
$ zef install URI::Encode
```

## ソースコード

```
use v6;
use URI::Encode;
use Cro::HTTP::Client;
my $url = uri_encode('https://ja.wikipedia.org/wiki/イチロー?action=cirrusdump'); # (#1)
my $client = Cro::HTTP::Client.new:
body-parsers => [ 
    Cro::HTTP::BodyParser::JSON  # (#2)
]; 

my $resp = await $client.get($url); # (#3)
CATCH {  # (#4)    
    when X::Cro::HTTP::Error {
        if .response.status == 404 {
            say "Product not found!";
        }
        else {
            say "Unexpected error: $_";
        } 
    } 
}

my $body = await $resp.body; # (#5)
$body.shift<_source><opening_text>.say; # (#6) 
``` 

+ Croにはパーセントエンコードのためのメソッドが用意されていないようなので、`URI::Encode`を使って、日本語文字列の含まれるURLをまずエンコードします。また、パラメータに`?action=cirrusdump`を指定して、CirrusSearchのJSONダンプを取得できるようにします。(#1)
+ JSON処理のためのパーザーを指定して、クライアントを初期化します。(#2)
+ getを実行します。 (#3)
+ エラー処理方法を記述します。 (#4)
+ `$resp.body`でパーザーの処理後のオブジェクトを取得します (#5)
+ `<_source><opening_text>`が最初の段落のテキストが格納されている要素の位置です (#6)

## 実行結果

きれいに取れました！

```
イチロー（本名：鈴木 一朗〈すずき いちろう〉、1973年10月22日 - ）は、愛知県西春日井郡豊山町出身のプロ野球選手（外野手）。右投左打。現在はフリーエージェン
ト。血液型はB型。MLBシーズン最多安打記録保持者（262安打）であり、プロ野球における通算安打世界記録保持者（NPB/MLB通算4257安打でギネス世界記録に認定）、最多試合出場記録保持者（NPB/MLB通算3563試合出場）である。2017年現在、オリックス・ブルーウェーブに所属していた唯一の現役選手である。
```

以上、18日目の投稿でした。

# 出典

+ [0] Murdock, J. William, et al. "Typing candidate answers using type coercion." IBM Journal of Research and Development 56.3.4 (2012): 7-1. 
+ [1] https://ja.wikipedia.org/wiki/Wikipedia:データベースダウンロード
+ [2] https://www.mediawiki.org/wiki/Extension:TextExtracts/ja
+ [3] https://wikimania2014.wikimedia.org/wiki/Submissions/CirrusSearch:_How_we%27ve_replaced_a_great_search_engine_with_an_awesome_search_engine
+ [4] https://dumps.wikimedia.org/other/cirrussearch/
+ [5] https://www.mediawiki.org/wiki/API:Search_and_discovery#CirrusSearch

# ライセンス

All of the materials from Wikipedia are licensed under the [Creative Commons Attribution-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/).
Kotlin/Nativeをさわりだけさわってみた

# まえがき
この記事は [モバイルファクトリー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/mobilefactory) 19日目の記事です。

この記事は2017年12月執筆の記事です。Beta版に対しての言及であるため、参照時にはご留意願います。

# [Kotlin/Native](https://kotlinlang.org/docs/reference/native-overview.html)
元々はJetBrains社が開発したJVM言語で、Androidの統合開発環境がInteliJベースで有ることから、目下利用用途はAndroid開発に使用されることが多い言語でした。今年のGoogleI/OでAndroidの正式開発言語として採用され、急速に注目度が高まっています。
また、JVM言語であることからJavaの資産の大部分を流用できるため、サーバサイド言語としても注目が集まっています。

そんなJVM言語のKotlinでしたがKotlin/NativeはKotlinのモダンな書き味そのままにiOS、JS(wasm)、Windows、Mac、Linuxに対応できるそうです。

## Android/iOS両対応
目下皆さんがKotlin/Nativeに興味を持つのは、Android, iOSの両対応でしょう。

### Android対応状況
- arm32 and arm64

atomは現段階では未対応な模様

### iOS対応状況
- arm64

iPhone5c、iPhone5以下が現段階で未対応なもよう

とはいえ、iPhone5についてAppleのサポートが終わっていますので、今から作り始めるならそこまで気にならないかもしれません。

# 仕組み
@amay077 さんの https://qiita.com/amay077/items/45b1ad4b9c5d3a03cf9c の記事が参考になりました。

## 要約
- Kotlinコードのレベルで共通化ができる
- 周辺ライブラリは実行環境によるのでjavaの資産が流用できないわけではないが、java.*系を使うにはメソッド単位で大量のbridgeを書く必要がある。
  - なのでkotlin系のライブラリでも、中身でjava.*に依存してるとそのライブラリ自体をbridgeする必要がある。

# とりあえずiOSアプリをビルドしてみる

## Kotlinコンパイラをビルド
[JetBrains/kotlin-native](https://github.com/JetBrains/kotlin-native)リポジトリのREADMEを実施すればできます。

### 事前準備して

- JDK
- Xcode 9.2(Macなら)
  - iOS向けじゃなければCLangあたりがあれば大丈夫かと。多分。

### dependenciesを更新して

```sh
./gradlew dependencies:update
```

### コンパイラとコンパイルライブラリをbuild

```sh
./gradlew bundle
```

1時間かかるって書いてるけど、手元のMacBookPro13inだと2時半。。。

```logs
BUILD SUCCESSFUL in 2h 25m 13s
```

build後はプロジェクト全体で1.4G
必要最低限のdist以下で800M程度です。

### dist/binにPATHを通す

```sh
export PATH=$PATH:$HOME/local/kotlin-native/dist/bin
```

## iOSプロジェクトを作る
[JetBrains/kotlinconf-spinner](https://github.com/jetbrains/kotlinconf-spinner)のサンプルプロジェクトを参考に作ると良いでしょう。
OpenGL系で少しモリモリ感ありますが。

が、今回はちょっとkotlincのbuildに時間とられてしまったので、sampleプロジェクトをそのまま使ってみる。すいません。。

### ディレクトリ構成
```
kotlin-native
├── external
└── samples
    └── fullstack
        ├── KotlinCMakeModule
        ├── clients
        │   ├── android
        │   ├── cli
        │   ├── ios
        │   │   └── konf-demo.xcodeproj
        │   ├── shared
        │   └── webassembly
        ├── common
        │   └── src
        ├── content
        ├── getopt
        ├── gradle
        ├── httpserver
        ├── json
        ├── kurl
        ├── sql
        └── utils
            ├── android
            ├── ios
            └── src
```
xcodeprojありました。これをXcodeで開いてみます。

### TARGETS > konf-demo > Build Phasesを見てみる

この辺にキモになりそうな設定がありそうです。

#### Remove Original Binary

```sh
rm -f "$TARGET_BUILD_DIR/$EXECUTABLE_PATH"
```

#### Compile Kotlin Sources

```sh
$SRCROOT/../../gradlew -p $SRCROOT compileKonanApp -Pdisable.android=true
```

#### Replace Original Binary

```sh
cp "$SRCROOT/build/konan/bin/iphone/app.kexe" "$TARGET_BUILD_DIR/$EXECUTABLE_PATH"
```

### あとは普通にbuild
あああ。AppleDeveloperCenterの登録が。。。

というわけで、ここで断念。片手落ちな結果ですが、続きは後々追記致します。。

# まとめ(途中経過)
- 運用を想定するなら、まだ時期尚早そう。
- Rx系とかbindingsが整うの待ち
  - でも整えば、View以外を共通化してMVVMとかもできそう

次は @lycoris102 さんの「[Unity] 今年個人的に買ったアセット紹介2017」です。がっかりランキングも知りたい。
WordPress : Nginx 413 Request Entity Too Largeというエラー

## php.ini の修正

```linux-config
sudo vi /etc/php/7.0/fpm/php.ini

# post_max_size を変更する
post_max_size = 20M 　←★変えたい数値に変更

# upload_max_filesize を変更
upload_max_filesize = 20M 　←★変えたい数値に変更

#　再起動
sudo service php7.0-fpm restart
```

## Nginx の設定

```linux-config
sudo vi  /usr/local/nginx/conf/nginx.conf


http {
〜〜〜略〜〜〜
    client_max_body_size 20M; 　←★変えたい数値に変更
〜〜〜略〜〜〜
}

# 再起動
sudo service nginx restart
```
JUCEのMIDI入力受付処理への理解を深める。

本記事はJUCE Advent Calendar 2017 の12月19日向けに投稿した記事です。

## はじめに

初めまして、MachiaWorksと申します。
本業そこそこに趣味で作曲したりゲームやシンセサイザーのプログラム書いたりしてます。

で、ちょこちょこJUCEいじってました。
今回は「MIDI入力処理の大まかな流れ」についてサンプル見ながら書いていこうかと。
半ばメモ書きになってる部分もありますがご了承下さい。
1月初旬あたりに修正予定＋Blocks持ってるのでそれをいじる形としたいかな、と。

## 参考資料

https://juce.com/doc/tutorial_handling_midi_events

上記リンク見てしまうと終わりなんですがそれはそれで。

サブ資料として以下のページも。

https://juce.com/doc/tutorial_midi_message
https://juce.com/doc/classCallbackMessage
https://juce.com/doc/classMidiInputCallback

## MIDI入力の処理方法（ざっくりと）

MIDI入力について、大まかな流れとして以下の処理になるかと。
すげえ簡単に書いてるのでツッコミどころはありそうですが。

- AudioDeviceManagerクラスに入力MIDI機器を登録する
- MidiInputCallbackクラスのメソッドであるhandleIncomingMidiMessage関数にて、入力されたメッセージを受け取る
- CallbackMessage クラスのメソッドであるmessageCallback 関数にて届いたMIDIメッセージを処理する。（サンプルではこの中でメッセージのパースを行ってますね）

サンプルを動かして遊んでる様子。
最初からコーディングする量は少ないです。

![入力サンプル.PNG](https://qiita-image-store.s3.amazonaws.com/0/142645/972d495f-8687-392b-54fd-223719f43ac3.png)

あと面白いのが、MIDI鍵盤の入力について「マウスクリックについても最初から対応しているところ」です。
つまりマウスクリックするとMIDIメッセージとして処理されているということです。

これはMidiKeyboardComponentクラスにて実装されてます。
ただ、その入力元については情報がないようで、サンプルでは「外部からMIDIメッセージを受信した時」のみフラグを立てて外部デバイスとしてコールバック処理、そうじゃないときはオンスクリーンの入力として処理してるみたいです。

また、上記のクリックはMidikeyboardStateオブジェクトで受信してメッセージを処理しており（外部の入力についてメッセージ処理するメソッドを持っている）加えてNoteOn/Offする扱いとしてデータも入力できるみたいで、MidiKeyboardStateオブジェクトに入力データ渡す際に処理を加えることで、コード生成やアルペジエータみたいなこともできそうです。
ここらはサンプルのhandleIncomingMidiMessage関数の実装を見ると理解が深まるかと。

該当クラス資料：
https://juce.com/doc/classMidiKeyboardComponent
https://juce.com/doc/classMidiKeyboardState

## コーディングする時に気づいたこと

自分がこういう系統のライブラリ使うのほぼ初めての状態で気づいたことを記載。（どちらかというとライブラリ使うの初めての人向け）

エラーが出る場合、以下の原因であることを考えると、早いとこ解決できるかと思います。

- 初期に定義するメソッドのオーバーライド関数が不足すると、インスタンスが作られずビルドが失敗する
- よって、エラーが何かを知る場合、まず自作コンポーネントが継承するクラスと必要なメソッドを中心に調べてみること。

要は仮想関数をオーバーライドする定義が抜けてるってことでした。
JUCEは全般的に必要なメソッドが網羅されているため、こういう形でエラーが出てたのを解決するのに時間かかりました。

使う人には当たり前の部分なんだけど、慣れてない人はエラーどこで取ったらいいんだと悩む（実際自分が悩んだ）ので、まずはエラーのとっかかりだけは知っておいたほうがいいのかなと思います。

逆にエラーの原因が大体理解できると、前述の通り網羅的に整備されているライブラリのため、アプリケーションの実装がかなり早いとこ出来てしまう印象です。

## さいごに

ということで、せっかくBlocksも買ってしまったことですし、ちょこちょこJUCEをいじっていこうかと思ってます。
（元々MIDIキーボードの機能不足を補完する目的でBlocks買いましたしね）
micropythonでAWS IoTにデータ転送

[MicroPython Advent Calendar](https://qiita.com/advent-calendar/2017/micropython "MicroPython Advent Calendar") 19日目です。

今日は昨日に引き続きWipyのファームを書き込んだESP32-DevkitでAWS IoTにデータを飛ばしてみたいと思います。
公式で公開されているESP32のファームウェアではAWS IoTに接続することが
できませんでした。
SSL部分の実装具合に差があるのだと思います。

###事前準備
あらかじめAWS IoT側で設定をしておきます。
手順の詳細ここでは省かせていただきます。公式ページや他の方の記事を参考にしてください。

モノ、証明書の作成とダウンロード、証明書とモノの紐づけ、ポリシーの作成と証明書の紐づけが済んでいればおｋです。。

![2017-12-19_00h30_21.png](https://qiita-image-store.s3.amazonaws.com/0/146663/954955e4-d311-244e-acfe-74c17cc8d3fe.png)

###実行
AWS側の設定ができたらダウンロードした証明書をampyツールでESP32に転送しておきます。
証明書を転送したら以下のコードをESP32に転送して実行してみます。
LM35で読み取った温度をAWS IoTに送るコードです。


```py3

import socket
import ssl
import json
from machine import ADC

def lm35():
    adc = ADC()
    apin = adc.channel(pin='P18', attn=ADC.ATTN_0DB)
    return (apin() * 0.000235+0.075) / 0.01

def send():
    s = socket.socket()

    ai = socket.getaddrinfo("xxxxxxxxxx.amazonaws.com", 8443)
    print("Address infos:", ai)
    addr = ai[0][-1]

    s = ssl.wrap_socket(s, certfile='xxxxxxxxxx-certificate.pem.crt',
            keyfile='xxxxxxxxxx-private.pem.key',
            ca_certs='xxxxxxxxxx.pem', 
            cert_reqs=ssl.CERT_REQUIRED)

    s.connect(addr)
    print('Connected to Server')
    temp = lm35()
    json_data = {'state':{'reported':{'Temperature': temp}}}
    send_data=json.dumps(json_data)

    s.write(b"POST /things/ESP32/shadow HTTP/1.1\r\n")
    s.write(b"Host: xxxxxxxxxx.amazonaws.com\r\n")
    s.write(b"Content-Length: %d\r\n" % len(send_data))
    s.write(b"Connection: close\r\n")
    s.write(b"\r\n")
    s.write(send_data)
    print('Send Data to Server')

    recv_data = s.recv(4096)
    print(str(recv_data, 'utf8'))
    s.close()
```


![2017-12-19_01h53_29.png](https://qiita-image-store.s3.amazonaws.com/0/146663/535e3730-1ee9-f971-9bc5-41cdfffae884.png)


![2017-12-19_01h54_14.png](https://qiita-image-store.s3.amazonaws.com/0/146663/74407c1a-57e7-3af1-4c1e-124c033ab1a5.png)

シャドウステータスの値が更新されました。
今回はHTTPS接続で行いましたがMQTTでも同じようにAWS IoTに接続可能でしょう(要検証)

AWS IoTへの接続はTLS1.2が必要となるため、ESP32を用いました。
必要でないIoTプラットフォームへはESP8266でもよいでしょう。

TCP/IPのスタックを搭載したESP8266/ESP32とmicropythonの組み合わせは
IoTで活躍できるポテンシャルを十分感じますね。
CloudGarageでプロキシサーバーを作ってみた

この記事は[CloudGarageAdventCalendar2017](https://adventar.org/calendars/2264)の１９日目の記事です。

#なんで作ってみたのか？
Webサイトリニューアルの制作案件で、お客様にスマートフォン実機で直接確認をいただくことがあります。
この場合、公開前に、対象となるFQDN(URL)を指定して、お客様に確認いただくことはできません。
(リニューアル前の既存サイトを対象FQDN(URL)で公開しているので当然ですよね)
こんなとき、IPアドレスでアクセスしてもらったり、別FQDNを割り当てて確認いただいたりするのですが、SSL/TLS証明書まわりやその他いろいろとお客様からご指摘が入る場合があります。例えば、「URLが違うのにこれって大丈夫なんですかー？」とか「IPアドレスで公開するんですかー？」とか「証明書の警告やエラーがでてるんですけど、ちゃんとしてください」とか。
かといって、「hostsで新しいサーバーのIPを指定してください」ということも難しいわけです。スマートフォンの場合は特に。

そんなとき、自前のプロキシサーバーを利用しそこにhostsで設定しておけば、お客様にはスマートフォン実機にプロキシの設定をしてもらうだけで、対象となるFQDN(URL)にアクセス、公開前のリニューアル後のサイトを確認・閲覧できるようになります。

今回は、一時的に使いたいだけなので、契約済みのCloudGarageで余っているインスタンス枠を利用しました。

#作ってみます
##CloudGarageでインスタンスを作成
いつものようにメニューから「インスタンス追加」をクリック
今回はCentOS6系を利用
<img width="1079" alt="スクリーンショット 2017-12-17 23.50.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/110436/7d4a926c-adbf-3ac2-cbfe-b264c11ae30e.png">
今回は、プロキシポート「3128」は選択肢にないので、接続可能ポートは全開放とします。
<img width="1076" alt="スクリーンショット 2017-12-17 23.50.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/110436/9c397608-71f4-140c-e55a-49f18007a067.png">
※別途、必ずサーバのiptablesなどで設定をしてください。
※開放しているポートに対してiptablesなどで接続元IP制限は個別にかけておきましょう。

##プロキシサーバーをインストール
CloudGarageで作ったインスタンスを選択し、コンソールを開く。
rootでログインし、以下を実行

```
yum -y install squid
```

以下のような感じになればOK
<img width="725" alt="スクリーンショット 2017-12-18 0.04.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/110436/923bf3d8-b085-882c-3335-578406dbaf7e.png">
##プロキシサーバーの設定を行う
以下の内容くらいを設定しておけばよいかと。

```
vi /etc/squid/squid.conf

#コメントアウト
#http_access deny all
 
#ポートは適当に決めます。※スマートフォンの設定時に利用します。
http_port 60080
 
#ホストネームは任意のものを指定します。
visible_hostname [任意のホスト名]
 
#接続元IPをxxx.xxx.xxx.xxxに入れる
acl myacl src xxx.xxx.xxx.xxx/255.255.255.255
http_access allow myacl
http_access deny all

#ローカルIPアドレスを隠蔽化
forwarded_for off
 
#プロキシアクセスを隠蔽化
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
```

##アクセスさせたいFQDNとIPアドレスの紐付け
プロキシサーバーのhostsファイルを編集する。

```
vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# XXX.XXX.XXX.XXXにリニューアル後のサーバーIPを設定
# www.******.jpには対象となるFQDN(URL)を設定
XXX.XXX.XXX.XXX www.******.jp
```

##プロキシサーバーを起動
```
service squid start
```
これでプロキシサーバーは完成です。

#実際に設定してみる。
例えばiPhoneの場合、以下のようにプロキシ設定をします。
[設定]→[Wi-Fi]の設定を開きます。
以下の図のように、接続済みのWi−Fiのインフォメーションを選択
![IMG_8234.PNG](https://qiita-image-store.s3.amazonaws.com/0/110436/179bdaac-645d-c0dc-fe3d-bd1b0c14365b.png)

画面を少しスクロールすると「HTTPプロキシ」の設定がでてくるので、
![IMG_8235.PNG](https://qiita-image-store.s3.amazonaws.com/0/110436/006e2dd3-9bb0-d013-9891-3f194770287c.png)
手動
サーバー：CloudGarageのインスタンスIPアドレス
ポート：プロキシサーバー設定で決めたポート番号
を選択します。

#動作確認
接続元IPアドレスをチェックできるサイトが幾つかあるので、そちらにアクセスし、その接続元IPアドレスが、プロキシサーバーとなっていることを確認します。


#まとめ
CloudGarageは、1契約、複数インスタンス(最低3インスタンス〜)・定額となっています。一番安いプランでも、1,480円/月でインスタンス3つあります。こちら、常時サービスとして稼働させているインスタンス以外に、テスト用・検証用として、1インスタンスくらい確保することもできると思います。ちょっとしたことで、サーバー調達したいなと思ったとき、煩わしい申し込み・契約、利用料などなく、気軽にサーバーを作ったり潰したりできるので、ありがたいですね。

***
明日は[taman777](https://adventar.org/users/15174)さんです！よろしくお願いします。
2017年に学んだシビックテックなキーワード


はじめに
====
Civic Tech Advent Calendar 2017 のための記事です。
普段は、Code for Nanto で主に活動を行なっています。
この記事では、2017年に Code for Nanto で開催したイベントで学んだいくつかキーワードについて紹介を行います。

Code for Nanto について
====
Code for Nantoは2014年に設立した富山県南砺市を拠点に活動しているCode for 団体です。
過去にはセミナーやハンズオン、ハッカソンなどのイベントを開催してきました。

Code for Nanto
http://www.code4nanto.org/

今回取り上げるキーワード
====
* クライシスマッピング
* GTFS


クライシスマッピング
====

## クライシスマッピングについて
クライシスマッピングとは、災害が発生時した際に被災地域の状況をいち早く把握するため、災害発生地域の地図をリアルタイムで作成していくこと
地図をリアルタイムに作成することによって、被災地域の危険箇所を見つけ二次災害を防いだり、ことができる

## どうやって現状を可視化するのか？
ドローンによる空撮を行い、地図上にマッピングをしていく

東京都・調布市合同総合防災訓練 の例
https://github.com/dronebird/oam_tokyo20170902chofu01

ドローンで撮影された画像を加工し、地図(Open street map) にマッピングを行う

地図上にマッピングされた航空写真の上にOpenStreet map の機能で情報を記述していく

## 国内で活動を行なっている団体
NPO法人クライシスマッパーズ・ジャパン
http://crisismappers.jp/

## 世界各地へのマッピングの協力方法

情報を記述する人手が不足している地域では、オンラインサービスを利用して世界中の人に助けを求めている場合もある

TASKING MANAGER
https://tasks.hotosm.org/

TASKING MANAGER では、今情報を求めている地域も多くあるので、他地域のマッピングに協力することも可能である

GTFS
====

## GTFS について

GTFS（General Transit Feed Specification）とは、公共交通機関(主にバス)の時刻表や経路について示された標準フォーマットのこと

## GTFS データの構造
指定の情報を CSV 形式で記述したテキストファイル(.txt)群をまとめたもの
(交通機関事業者情報、路線、停車位置、料金、乗り換え、運行計画など)
詳細は国土交通省のWebページに解説書が掲載されている

公共交通政策：経路検索の充実に向けた取組 - 国土交通省
http://www.mlit.go.jp/sogoseisaku/transport/sosei_transport_tk_000067.html

## GTFS のメリット
GTFSデータを乗り換え情報検索アプリケーション作成企業が利用することによって、目的地までの交通手段を検索する際に移動手段の候補として情報を提供することができる
これよって、今までバス会社のWebサイトなどで時刻表を探していた手間が不要になり、移動の利便性が向上する
多言語化対応も可能なため、外国人利用者への移動手段の手助けにもなる

## GTFS データの作成方法
* テキストファイルを人力で作成する
* 有志の方が作成したツールを利用

標準的なバス情報フォーマット出力ツール
http://www.csis.u-tokyo.ac.jp/~nishizawa/gtfs/

## データの検証方法
Google が提供する 検証ツール上でデータのチェックを行う

GTFS フィードのテスト
https://developers.google.com/transit/tools?hl=ja#GtfsValidation

## データの提供方法
オープンデータとして公開をすることができます
ただし、乗り換えアプリケーション開発企業へ情報提供をする場合、データの信憑性や時刻表の更新などを考慮し、特定の条件を満たした法人や、行政からの提供のみ受け付けている場合がある
bitFlyerのEcho APIを使ってBitcoinのリアルタイムレートを可視化（１）


# はじめに
今更仮想通貨に興味が出てきたのでbitFlyerに登録しました。 
どうせ登録したのでAPIを触ってみようと思い、Echo APIが簡単に使えそうだったのでBitcoinのリアルタイムレートをMatplotlibを使って可視化してみました。

# 実行環境
- マシン：MacBook Pro (Retina, 13-inch, Mid 2014)
- CPU：2.8 GHz Intel Core i5
- メモリ：16 GB 1600 MHz DDR3
- プログラミング言語：Python 3.6

# プログラム
```python3:main.py
import requests
import json
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.font_manager import FontProperties
from datetime import datetime

# エンドポイント
end_point = 'https://bitflyer.jp/api/echo/price'

# APIからデータ取得
response = requests.get(end_point)
rate = json.loads(response.text)

# 日本語を表示するためにフォントを設定
fp = FontProperties(fname='ipaexg.ttf', size=15)

# ウィンドウを描画
fig = plt.figure(figsize=(12,8))

# データ用の配列を初期化
time_axis = [datetime.now() for _ in range(120)]
mid = [rate['mid'] for _ in range(120)]
bid = [rate['bid'] for _ in range(120)]
ask = [rate['ask'] for _ in range(120)]

# コールバック関数
def plot(loop_count):

    # グラフをリフレッシュ
    plt.cla()

    # APIからデータ取得
    response = requests.get(end_point)
    rate = json.loads(response.text)

    # 配列の先頭を削除
    time_axis.pop(0)
    mid.pop(0)
    bid.pop(0)
    ask.pop(0)

    # 配列の最後にデータを追加
    time_axis.append(datetime.now())
    mid.append(rate['mid'])
    bid.append(rate['bid'])
    ask.append(rate['ask'])

    # プロット
    plt.plot(time_axis, mid, label='仲値')
    plt.plot(time_axis, bid, label='買取価格')
    plt.plot(time_axis, ask, label='販売価格')

    # ラベル配置
    plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1), borderaxespad=0, prop=fp) 
    plt.subplots_adjust(right=0.8)

# 1000ms(1s)でアニメーションを更新
ani = FuncAnimation(fig, plot, interval=1000)

# 描画
plt.show()
```
ipaexg.ttfは以下からダウンロードしてください。
https://ipafont.ipa.go.jp/old/ipaexfont/download.html

# 実行結果
![btc_rate.gif](https://qiita-image-store.s3.amazonaws.com/0/211748/375e1744-7d09-2e76-64da-e979b6c8b067.gif)
ETロボコンで役立つデバッグ支援ツールについて

ETロボコン活動の中で検討・調整を助けてくれるデバッグツールについて紹介します。

写真はチャンピオンシップ大会でのデモ走行終了後の様子です。
東海地区実行委員会Dummy Systemなどと銘打っていますが、現役時代にチームで使用していたツールを改造しながら使い続けています。
![IMG_20171115_165812.jpg](https://qiita-image-store.s3.amazonaws.com/0/123504/64a736ae-63de-29c8-ec10-d15c8c71c0ad.jpeg)

このツールはBluetoothで走行体と通信を行い、ログ取りだけでなく様々なコマンド制御を行うことができます。
コマンドボタンは多数ありますが、NXT時代の残骸のようなモノもあるので、現在でも役立ちそうな所を紹介します。

##コマンド（一部）

競技を破綻させる可能性のあるコマンドは、 **デバッグモードをONにしてからでないと使えない** ようになっています。
通常は、デバッグON/OFFと競技開始(リモートスタート)しかできないようになっています。
操作ミスや誤作動で競技が止まってしまったなどという事故が起きないようにしましょう。

| コマンド       |パラメーター |
|:-----------------|:------------------|
| **デバッグモード**             |ON/OFF           |
| **競技開始** (リモートスタート)  |-            |
| 競技終了            |- |
| ラジコン            |forward,turn,tail |
| 倒立         |- |
| 完全停止(尻尾で立つ) |- |
| ライントレース開始 |左エッジ/右エッジ |
| ライントレース終了 |- |
| 各種パラメーター変更 |パラメーター |

###ラジコン系コマンド

ラジコンができるようになると、作業効率がグンとアップします。いきなり難所攻略できちゃいます。(※操縦者のウデによります) 走行ログも取れます。
イベントに出したときに、初めて操作したお子様でも階段(当時14mm高さ×2段)を攻略できていました。

(動画) [ETロボコン 2010年仕様 立体難所にBluetoothリモコンで挑む](https://youtu.be/Qb7mTNiAn0M)

走行体を自在に動かすには、forwardとturnをアナログコントロールできるコントローラーが必要になります。
オススメは[ネジコン](http://bandainamcoent.co.jp/cs/list/negcon/)です。まだ中古品が入手できるようですが、もしかしたら皆さんのお宅にもあるかもしれません。ご家族に聞いてみましょう。
<img width="207" alt="negcon.png" src="https://qiita-image-store.s3.amazonaws.com/0/123504/1f52494f-b244-b9b0-3f5e-d433ab26af59.png">
コントローラーをねじってturnをアナログ操作、赤いボタンの押し込みでforwardをアナログ操作できます。
運良く入手できた場合は、別途USB変換機も購入してください。


ライントレースコマンドは、コマンド設定後にラインに到達するとライントレースを開始します。forwardだけコントローラーで操作してturnはライントレースを自動で行うようになります。コースがあれば、自律走行を製作していなくても走行ログが取れてしまいます。

###各種パラメーター変更コマンド

リモートでパラメーターを変更する機能はMindstorms NXT走行体を使用するようになった初年度2009年から既に作成したチームがあったので、マネして導入しました。サンプルコースをぐるぐる回りながらライントレースのパラメーター調整ができちゃいます。
ビルド～走行体への書き込み作業を何度もする必要はありません。

2018年走行体の開発では倒立振子APIのパラメーター調整で大活躍しました。

##ログビューワー

ログの確認は.csvファイルをドロップするだけでグラフを描画してくれるツールを作成しています。
ログビューワーとロギングツールを共通で作成しているチームが多いですが、別件のツールを流用した都合でビューワー単体で作成しています。

2017チャンピオンシップ大会での[2018走行体デモ走行](https://youtu.be/nnraKF_Adnw)のログ
<img width="678" alt="graph.png" src="https://qiita-image-store.s3.amazonaws.com/0/123504/a5d726b6-ed01-bd56-f354-76a41bbbdb52.png">

時間ごとの各データとX-Y Viewで走行軌跡を確認することができます。
使用している情報は区切りごとの相対距離・相対角度だけですので、コースが全体的に傾いているとか歪んでいるとかは気にしません。

活用法は例えば、デモ走行ではルックアップゲート通過後にゲートを倒してしまいましたが、表示項目を<font color="Red">Y1:forward</font>、<font color="Teal">Y2:tail</font>、<font color="Violet">Y3:距離</font>にしてルックアップゲートの辺りを拡大すると、

<img width="673" alt="graph2.png" src="https://qiita-image-store.s3.amazonaws.com/0/123504/ee05edbe-06ad-66a9-a263-69dae66ac9f7.png">

尻尾を傾けてゲートを通過した後、起き上がり支援のために少し後退処理を入れていますが、なかなか起き上がれずに後ろに進みすぎていることが分かります。

このビューワーは今回、実行ファイルだけでも公開しようかと思っていたのですが、二画面とか表示倍率を変更している環境だと問題があることが分かりましたので、また機会があれば修正して公開したいと思います。

#まとめ
今回はデバッグ支援ツールについて紹介しました。
[ブロック並べ攻略の話。Team ASaGiの場合。後編。](https://qiita.com/TeamASaGi/items/a7a18cbc27b4d85d0305)でも書かれていますが、シーズン中は開発作業、自分の場合は実行委員活動などで忙しくなるため、ツール類はオフシーズンに作っていました。
ETロボコン2018の走行体はタイヤ大径化で様々な特性が変わります。今から準備を進めておくことが、2018年大会での大きなアドバンテージに繋がるでしょう。
3D入門してみて(拡大、縮小、移動、回転)

# はじめに

どうも、harusann2です。HAL大阪のゲーム制作学科1年です。
卒業するまでに3Dゲームエンジンを作ることが目標です。

この記事は[HAL Advent Calendar 2017](https://qiita.com/advent-calendar/2017/hal)の19日目の投稿です。
最近入門したばかりなので間違っているところがあるかもしれませんが、その場合コメントで指摘していただけると有り難いです。

## 3Dをやりたい！

当然ゲーム学科の人間なのでゲームを作りたいのですが今時のゲームは当然のように3Dです。
DirectXやOpenGL,WebGL,Vulkanなどを使用することで3D表示は簡単にできますが、実際内部でどういった処理を行い3D表示を実現しているのでしょうか?
というわけで実際にまだ途中ですが3DAPIを使わずにTypeScriptで3D表示に挑戦してみたので数パートに分けてその解説をしてみます。<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">1ピクセル打つ関数だけで3D表示してみた<a href="https://t.co/uIn876okmD">https://t.co/uIn876okmD</a></p>&mdash; 中島（無所属） (@harusann2) <a href="https://twitter.com/harusann2/status/942795107702472704?ref_src=twsrc%5Etfw">2017年12月18日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今回解説するのは回転,移動,拡大です。
## 拡大、縮小、回転、移動

3Dはやはり数学が出てきます。
僕は高校に行っていないので非常に苦労しましたがやっぱり数学を避けることはできませんね。

ただ、行列などの解説をするのはしんどいので知らない方は他のサイトや本などで勉強してください。

### 拡大、縮小
```math
\begin{pmatrix}
sx&0&0&0 \\
0&sy&0&0 \\
0&0&sz&0 \\
0&0&0&1 \\
\end{pmatrix}
```

### 移動

```math
\begin{pmatrix}
1&0&0&tx \\
0&1&0&ty \\
0&0&1&tz \\
0&0&0&1 \\
\end{pmatrix}
```
### X軸回転

```math
\begin{pmatrix}
1&0&0&0 \\
0&\cos\theta&-\sin\theta&0 \\
0&\sin\theta&\cos\theta&0 \\
0&0&0&1 \\
\end{pmatrix}
```
### Y軸回転

```math
\begin{pmatrix}
\cos\theta&0&\sin\theta&0 \\
0&1&0&0 \\
-\sin\theta&0&\cos\theta&0 \\
0&0&0&1 \\
\end{pmatrix}
```
### Z軸回転

```math
\begin{pmatrix}
\cos\theta&-\sin\theta&0&0 \\
\sin\theta&\cos\theta&0&0 \\
0&0&1&0 \\
0&0&0&1 \\
\end{pmatrix}
```
です。
これと変換したい座標との内積を取るだけです。
拡大、縮小と移動はそのままですが回転が少し複雑です。

なお、Quaternionとか言うより良い回転方法があるらしいのですが現在理解していないので解説はしません。
今回説明する回転方法のデメリットとして向きたい方向に向くということが難しいのですがそれをQuaternionは解決しているそうです。

それはともかく、結論として僕が理解している簡単な回転行列はこのようになっています。
sinとかcosとかありますがこれは加法定理を利用しています。

![3d2.png](https://qiita-image-store.s3.amazonaws.com/0/79902/f77e9fe3-1c30-8a15-7e53-42ca22a87889.png)

$\triangle ocb$と$\triangle abd$は合同
なぜなら$\angle cdb$は$180^\circ$
三角形の角度の合計も$180^\circ$なので
$\angle cob = 180 - 90 - \angle cbo$ 
$\angle cob = 180 - 90 - \angle dba$ 
そして２つの角が決まればもう一つの角も決まるので全ての角が同じになり$\triangle ocb$と$\triangle abd$は合同になる
$\|ob\|$は$\cos\theta$
$\|ab\|$は$\sin\theta$
なお$\|\|P\|\|$は$P$の長さ
で$\triangle oPP'$と$\triangle ocb'$は相似なので

```math
\frac{\|oc\|}{\cos\theta}=\frac{Px}{\|P\|}\qquad
\frac{\|cb\|}{\cos\theta}=\frac{Py}{\|P\|}\\
\frac{\|bd\|}{\sin\theta}=\frac{Px}{\|P\|}\qquad
\frac{\|ad\|}{\sin\theta}=\frac{Py}{\|P\|}
```
になり
変形すると

```math
\|oc\|=\frac{Px\cos\theta}{\|P\|}\qquad
\|cb\|=\frac{Py\cos\theta}{\|P\|}\\
\|bd\|=\frac{Px\sin\theta}{\|P\|}\qquad
\|ad\|=\frac{Py\sin\theta}{\|P\|}
```
そしてQの座標は

```math
\|P\|(\|oc\|-\|ad\|)=Qx\\
\|P\|(\|cb\|+\|bd\|)=Qy
```
これを当てはめると

```math
\|P\|\left(\frac{Px\cos\theta}{\|P\|}-\frac{Py\sin\theta}{\|P\|}\right)=Qx\\
\|P\|\left(\frac{Px\sin\theta}{\|P\|}+\frac{Py\cos\theta}{\|P\|}\right)=Qy
```
簡単にして

```math
Px\cos\theta-Py\sin\theta=Qx\\
Px\sin\theta+Py\cos\theta=Qy
```
この式を行列に入れたのが回転の行列です。

## まとめ
数学って大変です。