OmniAICreator/Qiita-1.07M huggingface dataset:
Counterparty - Monaparty  間でトークンスワップ (実例)

# 本題に入る前のあらすじ

Monaparty は、ICO と Proof of Burn (PoB) のハイブリッドモデルで基軸トークン XMP を生成しました。
(Counterparty は PoB だけで基軸トークン XCP を生成)

ICO トークンは Counterparty 上の MONAPARTY トークンです。

その後 Monaparty の開発が完了した時点で MONAPARTY トークン保有者との交換用に、交換レートが非常に大きな 1 MONA の Burn (Big Burn と呼ぶことにします)を Proof of Burn イベントに先立って行いました。

ここで、Monaparty 開発者は、以下の作業を行う必要があります。

* Counterparty 上の COUNTERPARTY トークンを受け取る。
* 受け取った MONAPARTY トークンの量に応じた XMP トークンを Monaparty 上のアドレスに送る。

これらを確実にかつ透明性のある形で行う必要があります。

そしてこれは、ICO に関係なく、Counterparty から Monaparty へプラットフォーム移行したい方々にとって、汎用的な話題でもあります。

# どのように実現したか

汎化して表現すると、__クロスチェーン・スワップ__ になります。
アトミック・スワップのような手が取れれば技術的に萌えますが、残念ながら技術として確立しておらず、Monaparty の開発で疲労困憊の身でこれ以上難しいことをする体力もありませんでした。

そこで、以下の手順を取ることで切り抜けました。

0. MONAPARTY トークン保持者に、XMP トークンを受け取りたい Monaparty アドレスをメモに添えて `1MonapartyMMMMMMMMMMMMMMMMMQ3QJNm` に送ってもらう。
0. Monapary 開発者は、Counterparty 上の 1MonapartyMMMMMMMMMMMMMMMMMQ3QJNm への送金を定期的に監視し、送金確認されたらそのメモにある Monaparty アドレスへ必要な XMP トークンを送る

ソースコードにすると、下記のようになります。

https://github.com/monaparty/tokenswap-example/blob/qiita-advent-calendar-2017/burn.js

本来ならば、署名済みトランザクションをウォレット・バックエンドやブロックチェーン・エクスプローラの API に投げ込めば全自動化も可能です。
しかし、自動化は、バグによる過払いのリスクがあります。そこで、上記リンク先のソースコードでは署名済みトランザクションの生成までで止めています。
表示された署名済みトランザクションを [Insight にコピペして送信する](https://mona.insight.monaco-ex.org/insight/tx/send)ことで配布は完了となります。

# メモを忘れた場合の対応

今のところ発生していないようなのですが、メモに Monaparty アドレスを入れ忘れて Burn アドレスへ送ってしまうというミスは考えられます。その場合は、ブロードキャストメッセージを使って Monaparty アドレスを送ってもらうと良いでしょう。Conterpatry 側のトークン保持者が望む Monaparty 側のアドレスがトラストレスに証明できますね。

# 資金決済法(仮想通貨交換業)との兼ね合い

MONAPARTY - XMP のトークンスワップの場合、MONAPARTY トークンは有限量でかつ Burn アドレス送りなので、業の要件となる継続反復性がありません。
しかし、このスクリプトを応用して双方のやり取りを可能にすると、資金決済法に抵触する可能性が出てきます。

紹介したスクリプトは MIT ライセンスにしましたのでご自由に応用していただいて構いませんが、その際には事前に金融庁へのお問合わせ等を推奨します。
ADC日本語ドキュメント

# ADC日本語ドキュメント
新しくmacOS/iOS/tvOS/watchOSアプリケーション開発に参入された方のために、Apple開発者サイトのリンクから辿れなくなった、日本語ドキュメントのURLをお伝えします。

https://developer.apple.com/jp/documentation/
ElmとReactを同一画面（Html）に埋め込んでみる

　Elmの勉強中です。今回はElmとReactを同一Htmlに埋め込んで表示させます。相互通信はありません。ElmもReactも以前のプログラムを再利用して、同じindex.htmlに埋め込むだけです。

　Reactは以前に書いた「React+D3.jsアプリ作成の基本」の記事のアプリを使います。これはReactで作成したDOMをD3.jsの関数に渡してグラフを書くというものでした。
[React+D3.jsアプリ作成の基本 - Qiita](https://qiita.com/sand/items/4090fc9e93ff81180fdf)

　プロジェクトをcreate-react-appで作り、npm run buildでアプリを生成します。build/static下に最終的なJavaScriptファイルが作成されます。

```sh:
create-react-app react-d3
npm run build
```


　Elmについては「Elm開発環境について」の記事で書いたアプリを使います。カウンターをincrement/decrementするボタンが二つ付いたものです。これはelm.jsというJavaScriptファイルを生成します。
[Elm開発環境について - Qiita](https://qiita.com/sand/items/9afaef65c6f1ebf453da)

```sh:
elm-make MyButtons.elm --output elm.js
```

　このElmの環境に、Reactのbuildディレクトリをそのままコピーします。その上で、2つのjsファイルを、以下のようにindex.htmlに埋め込みます。

```html:index.html
<!DOCTYPE html>
<html lang="jp">
  <head>
    <meta charset="utf-8">
    <style>
        .line{
            fill: none;
            stroke: steelblue;
            stroke-width: 2;
        }
    </style>
    <title>Elm React D3.js App</title>
  </head>
  <body>
        <div id="elm-area"></div>
        <div id="root"></div>
        <script src="elm.js"></script>
        <script>
            Elm.MyButtons.embed(document.getElementById("elm-area"));
        </script>
        <script type="text/javascript" src="/static/js/main.71bfb7b1.js"></script>
  </body>
</html>
```

　D3.jsのグラフ表示のためにstyleを指定していますので、ちょっと汚いですが、よく見るとシンプルです。

　以下がElmの埋め込みです

```html
        <div id="elm-area"></div>
        <script src="elm.js"></script>
        <script>
            Elm.MyButtons.embed(document.getElementById("elm-area"));
        </script>
```

　以下がReactの埋め込みです。

```html
        <div id="root"></div>
        <script type="text/javascript" src="/static/js/main.71bfb7b1.js">
```

　以下のコマンドでhttpサーバが立ち上がります。

```sh
elm-reactor -a=www.mypress.jp -p=3030
```

　ブラウザで確認します。

```
http://www.mypress.jp:3030/index.html
```

　ちゃんとElmとReactが表示されているのが確認できました。（現在はサーバを停止しているのでアクセスできません）。でもこれだけでは無意味ですね。データのやり取りとかができなくてはね。次回のテーマです。
mackerel-plugin-mysqlをUnix Domain Socketで使う

遊び用VPSはローカルからしか繋がないしなぁと `skip-networking` したら Mackerel で監視できなくなった。デフォルトは TCP/IP だ。そうりゃそうだ。0.18.0 で「unix socketをサポート」って書いてあるけど `-host` に設定してもダメっぽいなーと思ってソースコード見たら `-socket` があった。先に `-h` 見れば良いだけだった。

```
mackerel-plugin-mysql -socket=/var/lib/mysql/mysql.sock
```
ポートをつかんでいるアプリケーションを探す on Windows

xamppを起動しようとしたら起動しない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/0d4d5f75-1ca5-9de1-c24f-811cb1bc600e.png)

80番ポートが他のアプリケーションで使われているみたいです。

こういうときは「なお」さんに聞いてみよう。（ `netstat -nao` というコマンドを実行。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/edfe3ab2-8f0e-0b9c-247a-202a174718f8.png)

80番ポートを使っているのは、PID 4のアプリケーションだっ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/ce521ab1-fca3-5db0-48d1-c3cbc1cf55c1.png)

## (　ﾟдﾟ) NTカーネル？システム？

なんだろう。カーネルから呼び出しくらってるようです。意味分からん……

0.5秒悩みましたが、これはIISじゃなかろうかと。検索で探します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/3eceba79-83ab-aacb-a7d0-9561d2949e8d.png)

いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/6051ef65-a637-3a79-3cfe-126372023ed6.png)

「停止」します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/6962e62e-27c9-ca59-3ee9-8b480d80735d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/73aa84f3-360a-ed41-1b3e-273ed83c2dbe.png)

無事に起動しました。

### おまけ１

netstatのミソは「o」オプションです。ヘルプを見てみます。
（蛇足ながら、Linuxだとこの部分は「p」です）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/2ced9ac6-5578-52a3-8f59-11fc5117abc5.png)


### おまけ２

ちなみに、XAMPPの最初の画面のところに、「Port 80 in use by "Unable to open process" with **PID 4!**」というメッセージが出ているので、PID 4が原因というのは分かるんですけどね……（後で気づいた）

### 感想

フォルダが削除できない、ファイルが移動できない、っていうときにもつかんでいるアプリが分かる仕組みがあるのに良いのにね。
きみのプレゼンを、効果的に爆上げさせる魔法のアイテムを紹介する

これは[プレゼン研究会Advent Calendar 2017](https://qiita.com/advent-calendar/2017/infrapre)かしゆかの誕生日編です。かしゆかとは関係ありません。

しばらく文章を書かないでいたら、ものの書き方をすっかり忘れてしまって、とりあえずリハビリの心、しょっさんです。しばらくとは言っても、2週間程度なので、継続しないとあっという間にスキルレベルはだだ下がりなんだな、ということを感じています。

# プレゼンの重要な心構えはただ一つ「大きな声を出す」

プレゼンで重要なことは、スライドに頼らない強い心です。そのために必要なことは「大きな声を出す」ことです。なにも、叫べとか、ただただでかい声を出せということではありません。オペラ歌手や舞台俳優の気持ちになって、「声を張る」ということです。だみ声で大声出されたら、耳をふさぎますからね。

この「大きな声を出す」ソリューションですが、利益しか生み出しません。多くのプレゼンで必要なスキルを、大きな声を出すことによって、解消してしまうことのできる魔法のアイテムです。主に改善できるスキルは、次の３つです。すぐに活用してください。

1. ゆっくり話ができる
2. ジェスチャーが大きくなる
3. 心にゆとりができる

## 1. ゆっくり話ができる

大きな声を出すと、必然的に話がゆっくりになります。試してみていただければわかりますが、大きな声を出しつつ早口言葉を行うと、通常の声量の際と比較して、遅くなります。路上などで突然やらないでくださいね、警察とか呼ばれてしまいます。カラオケが安心ですが、安普請ではないおうちであれば、安心して実践できます。

この時の注意事項としては、上述のとおり「オペラ歌手」「舞台俳優」の気分になることです。彼らは、とても大きな声量で歌い、話しますが、それらは叫び声ではありません。よく通る、いわゆる「腹から声を出した」状態でしょう。この状況が必要不可欠です。

すると、あらまぁ不思議。オーディエンスに聞きやすい、ゆったりとした話口調になります。それでいて、大きな声量ですから、あまり広くない部屋であれば、マイクも不要です。エコです。「マイクあれば、声を張る必要もないんでは...？」は愚問です。小さい声をマイクで拾っても、何を話してるのかよくわかりません。ぼそぼそとした声が、マイクを通して大きくなっているだけで、結局、何を話しているのかさっぱりなわけです。まずは、声を張りましょう。

## 2. ジェスチャーが大きくなる

「舞台俳優の気持ちで」声を張ることによって、ゆっくりとした口調で話ができることは先述のとおりです。そして、ゆっくりと話すことによって、必然的に小さいろくろ回しが、大きなろくろ回しに変わります。

ジェスチャーなんて、どうでもいいじゃねぇかと思う人。たわけ。プレゼンはスライドを見てもらう発表会ではありません。「あなたをみてもらう」場です。観客の心をひきつけて、視線を集める先は、プレゼンではなく、「あなた」です。そのために、安易にコスプレや奇抜なファッションで惹きつけるのは愚でしかありません。あなたの「熱意」を聞いてもらう人たち全てに伝わることが、重要なのです。

そのためには、時として必要なジェスチャーを、大きな身振り手振りで注目を引きましょう。気分は「藤原竜也」です。あれくらいやっても、観客からは大げさに見えることはありません。どうせ素人が、俳優の気持ちで大きなジェスチャーを行ったところで、ようやく普通のジェスチャーです。

これを、大きな声を出すことによって、一緒に生み出すことができてしまうところが、この方式の素晴らしい点です。大きな声をゆっくりと出したことによって、身振り手振りも大きく、そしてゆっくりになります。効果的なジェスチャーと組み合わせれば、オーディエンスはあなたに釘付けです。ほんとに重要な事です。

ゆっくりとした話口調で、大きなジェスチャー。これで、あなたのプレゼンスはめまぐるしく向上しますし、その熱意もオーディエンスへ、まちがいなく伝わります。あなたが伝えたいことを、感情を持って相手に伝えるには、「大きな声を出す」ことが第一条件なのです。

## 3. 心にゆとりができる

オーディエンス向けだけではなく、本人の心にとっても良い効果があります。

ゆとりができます。

大きな声を出すことによって、ある程度のプレゼンの課題が解消されますから、「ゆっくり話さなきゃ」「どこで間を取ろう」「どこをポイントだと強調すればよいだろう」「みんなそもそも話を聞いてるだろうか」などの心配事がなくなります。なぜなら「大きな声を出すことに注力している」ので、余計なことを気にしなくて済みます。舞台俳優になることを徹するレベルで入り込んでいれば、予め想定していたとおりの演技をするまでです。もし、事前に想定できていないのだとしたら、それは準備不足です。声を出す以前の問題です。事前準備はなっとくの行くまでやりましょう。アドリブで、その場でいきなりできる力量は、まだ君たちにはありません。とにかく準備です。

準備ができているから、心にゆとりができるのでは、と思うかもしれません。ですが、直前もそうですし、話している最中も、オーディエンスがどのような状況で聞いてくれているかは、とても気になります。これを気にしだすと、もう何も手がつかなくなって、準備万端でも頭が真っ白になる状況が発生します。

そこで、「声を出そう」「声を出してやるぞ」と意気込んでいれば、自分の声をどう発しているかに注意を傾けられます。そうすると、心にゆとりが生まれてきます。プレゼンでもっとも危険なことは、登壇して焦ってしまい、真っ白になった状態です。多少忘れてしまっても、真っ白にならず、心にゆとりがあればなんとかなります。

# 自信のないボソボソ声は百害あって一利なし

エンジニアのプレゼンにありがちなのは、内容がせっかく良いのに、声が小さくて何を言っているかわからない、自信を感じない、熱意を感じない、挙げ句の果て「どうでもいい内容かな」と思われてしまうことです。

「マイクがあるから聞こえている」という錯覚が一番の問題で、マイクを通して聞こえているのは「あなたの自信のない小さい声」です。大きな声で、ハウリングを起こすくらいが最良です。そのときは、もちろんマイクの音量を下げてくださいね。あなたが発表して伝えたいことを、自信を持って、熱意を伝えてください。必要なことは「大きな声を出す」ことです。これから始めれば、まちがいありません。

この魔法のアイテムによって、エンジニアのプレゼンスが上がることを期待しています。
自宅で動いているubuntu-server経由で任意の文字列をGoogle Homeに喋らせてみた

# 背景
グーグルホームを半額セールで購入しましたが
1日1回お天気を教えてくれるだけの存在になってしまいました。
いまのところ活用法がいまいち思い付きません。
そこで、グーグルホームに話しかけるではなく、例えば下記の使い方ができないかなと思い色々試すことにしました
1. スマホを持っていない子供に対して帰るコールを音声で送る
2. IFTTTと組み合わせて音声でnotificationを送ってもらう

# やりたいこと
HTTP経由で任意の文字列を与えたら、自宅にある指定したグーグルホーム端末がその文字を読み上げる

# 構成
自宅の環境をざっくり説明するとこんな感じで考えています。
![Google Homeに喋らせてみた.png](https://qiita-image-store.s3.amazonaws.com/0/1817/ba4fc8cb-8955-54d1-0ae6-7c7b090e034d.png)

後述しますが、
1.まずはコマンドラインでGoogle Homeを喋らせるコマンドを作り。
2.できたら、HTTP経由でアクセスできるように、nginxでリクエストを受取り
アクセスログを監視するデーモンを作り、GET /command/arg1/arg2 HTTP...のようなログを

```bash
command arg1 arg2 
```
というような形式に変換して実行するような環境を考えました


# 最初にやったこと
[GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます](https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac) こちらを参考に
https://github.com/noelportugal/google-home-notifier を試しましたが、
どうも自分の環境だとmdnsがインストールできませんでした

# google-home-speaker
なので、参考にしつつ自作して対処しました
[google-home-speaker](https://github.com/freddiefujiwara/google-home-speaker)
npm 経由でインストール可能で

## インストール方法

```bash
npm i -g google-home-speaker
```

## 使い方
下記のようにすると　グーグルホームが"Hello world"と喋ります。
cldというライブラリで言語の自動判別ができるようにしましたので
Google HomeのIPアドレスと喋らせたい文字列を与えるだけでOKです

```bash
google-home-speaker 192.168.1.3 "Hello World" # en
google-home-speaker 192.168.1.3 "こんにちは世界" # ja
google-home-speaker 192.168.1.3 "مرحبا العالم" # ar
google-home-speaker 192.168.1.3 "안녕하세요 세계" # kr
```
# altd
次に、nginxのアクセスログを監視して、リクエストパスをコマンド実行するようなデーモンを作りました
[altd](https://github.com/freddiefujiwara/altd) 
## インストール方法

```bash
npm i -g altd
```
## 使い方
下記のようにすると　/var/log/nginx/access_logを
google-home-speakerとlsコマンドだけ許可した状況で監視しはじめます

```bash
altd /var/log/nginx/access_log -w google-home-speaker,ls
```
例えば
http://example.com/ls/-lh/%2Ftmp
にアクセスすると

```bash
ls -lh /tmp
```
に変換され

```bash                                                                              
total 680K                                                                                                                                                                     
-rw-rw-r-- 1 user group 595K Dec 16 11:35 node-build.20171216113508.3603.log                                                                                            
drwxrwxr-x 2 user group 4.0K Dec 16 11:43 npm-10087-2d389e9e                                                                                                            
drwxrwxr-x 2 user group 4.0K Dec 16 11:48 npm-10607-a29bdecf                
```
のようなアウトプットがコンソールに表示されます

# 注意事項
今の構成だと、セキュリティ的な防御はまったくなく、誰でも自宅のグーグルホームにアクセス出来てしまいます。
また、altdもホワイトリスト方式でコマンドを制限してますが、なんか怖いですよね^^;
今後nginxに何か入れて誰でもアクセス出来てしまわないようにしようと思います。
あと、試してないですが みなさんが試されているようにRaspberry Piでも同じ構成で実現できるんじゃないかと思います。
また、下記どちらも何か有りましたらpull requestでFBいただけると幸いです
- [google-home-speaker](https://github.com/freddiefujiwara/google-home-speaker)
- [altd](https://github.com/freddiefujiwara/altd) 

最後まで読んで頂きありがとうございました。
論文読み "Collaborative Filtering for Implicit Feed Dataset"

# 概要
* 今回読む論文
  * Collaborative Filtering for Implicit Feed Dataset ([pdf](http://yifanhu.net/PUB/cf.pdf))
    * 余談: googleで確認すると "cited by 1201" ですごい。
  * 内容
    * Latent factor modelの拡張を行っている。
    * 一般的にユーザーからの負のフィードバックは少ない(or 集めるのが困難)。
    * そこで、フィードバックに対して信頼度という概念を導入している。
      * 例えば、ある商品の購入歴がない場合、"商品の存在に気づいていないだけ" or "興味がない"のどちらなのかが不明。

# 準備
まず、この記事で使う記号の整理を行う。

ユーザーを表すときは$u$、$v$を使い、アイテムを表すときは$i$、$j$を使う。
ユーザー $u$ のアイテム $i$ に関する観測データを $r_{ui}$ と書く。

# Latent factor model
下記の最小化問題を解く。
$$
\min_{x, y} \sum_{r_{ui} \text{ is known}} (r_{ui} - \,^tx_u y_i)^2 + \lambda (\sum_{u} ||x_u||^2 + \sum_{i} ||y_i||^2)
$$


# 提案しているModel
もしユーザーuがアイテムiを消費していたら( $r_{ui}>0$ )、好み$p_{ui}$ が1。 逆に消費していなかったら、好み$p_{ui}$ が0。これを数式で表すと、

$$p_{ui} = 1_{r_{ui} > 0}$$

しかし、好みが1である場合、データをして信頼度が高いが、0の場合は信頼度が低い。というのも0というのは、興味が無いわけではなくアイテムを知らなかった場合や何らかの事情で消費できなかった場合も0になるから。

また、消費している場合も、一概に信頼度が高いとは言い切れない。ユーザが自分のためではなくプレゼントとして購入しただけかもしれない。

そこで、データに対する信頼度 $c_{ui}$ をモデル化する。

$$c_{ui} = 1 + \alpha r_{ui}$$

(この論文の実験では $\alpha = 40$ としている。)

モデリングのゴールは
* 各ユーザー $u$ に対して、 $x_u \in R^f$
* 各アイテム $i$ に対して、 $y_i \in R^f$

を求めることである。
ここで、好みは次のように書けることを仮定する。

$$p_{ui} = \,^tx_u y_i $$

このような設定は既存のFactorizationテクニックと一致する。
異なる点は次の2つ。

* 信頼度 $c_{ui}$ を使用する。
* 最適化を観測した $r_{ui}$ だけではなく、全ての $u$、$i$ の組み合わせに対して行う。

つまり解くべき問題は下記のようになる。

$$
\min_{x, y} \sum_{u, i} c_{ui} (p_{ui} - \,^tx_u y_i)^2 + \lambda (\sum_{u} ||x_u||^2 + \sum_{i} ||y_i||^2)
$$

正則化を調整するパラメータ $\lambda$ は、クロスバリデーションで決定する。

この最適化でデータの組み合わせ数は $m \times n$ (ユーザ数 ✕ アイテム数) になる。実際のデータでは10億以上になることも稀ではない。

この状況では、一般的に使われているSGD等は使えない。 そこで次のような方法を採用する。

ユーザー要素 $x_u$ とアイテム要素 $y_i$ を交互に最適化する。つまり、片方を固定してもう片方を最適化を行い、これを交互に繰り返す。この方法はスケーラブルである。

$y_i$ を固定したとき、目的関数を最小化する $x_u$ は

$$x_u = (\,^tY C^u Y + \lambda I)^{-1} \,^t Y C^u p(u)$$

となる。同様に $x_u$ を固定したとき、$y_i$ は

$$y_i = (\,^tX C^i X + \lambda I)^{-1} \,^t X C^i p(i)$$

となる。

これを収束するまで繰り返すことにより、$x_u$、$y_i$ を求める。
Python > import先を変更して実行する > PYTHONPATH=. python3 test_use_PAZ_pySpherepts_171217.py

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

### code

**注記：自作のパッケージ(getIcosNodes_171126.pyとpolarAzimuthCalc_171209.py)を実行時に使っています。**

```test_use_PAZ_pySpherepts_171217.py
import numpy as np
import polarAzimuthCalc_171209 as pac
import getIcosNodes_171126 as gIN
import sys

'''
Dec. 17, 2017
This script requires the setup of [pySpherepts_171126] package shown at
    https://github.com/yasokada/pySpherepts_171126
for [getIcosNodes_171126]
'''

'''
v0.1 Dec. 17, 2017
   - add test_pySpherepts_IcosNodes()
'''


def test_pySpherepts_IcosNodes():
    xs, tris = gIN.getIcosNodes(4,0)
    pvecs = xs
    for elem in pvecs:
        beta_rad = pac.calc_beta_rad(elem)
        gamma_rad = pac.calc_gamma_rad(elem)
        beta_deg = np.rad2deg(beta_rad)
        gamma_deg = np.rad2deg(gamma_rad)

        fmt = "{0} \tbeta:{1:6.1f} gamma:{2:6.1f}"
        msg = fmt.format(elem, beta_deg, gamma_deg)
        print(msg)


if __name__ == '__main__':
    test_pySpherepts_IcosNodes()
```

### 実行とエラー

- 上記のscriptのsymbolic linkを別のディレクトリ(test/)に配置
- そのディレクトリにpolarAzimuthCalc_171209のsymbolic linkを配置
- そのディレクトリにgetIcosNodes_171126のsymbolic linkを配置

```bash
$ python3 test_use_PAZ_pySpherepts_171217.py 
Traceback (most recent call last):
  File "test_use_PAZ_pySpherepts_171217.py", line 3, in <module>
    import getIcosNodes_171126 as gIN
ImportError: No module named 'getIcosNodes_171126'
```

getIcosNodes_171126が見つからない問題の対処としてPYTHONDATAを使う。

```bash
$ PYTHONPATH=. python3 test_use_PAZ_pySpherepts_171217.py | head
[ 0.          0.85065081  0.52573111]   beta:  58.3 gamma:  90.0
[ 0.         -0.85065081  0.52573111]   beta:  58.3 gamma: 270.0
[ 0.          0.85065081 -0.52573111]   beta: 121.7 gamma:  90.0
[ 0.         -0.85065081 -0.52573111]   beta: 121.7 gamma: 270.0
[ 0.52573111  0.          0.85065081]   beta:  31.7 gamma:   0.0
[-0.52573111  0.          0.85065081]   beta:  31.7 gamma: 180.0
...
```

参考: [Pythonのimportについてまとめる](https://qiita.com/suzuki-hoge/items/f951d56290617df4279e) by @suzuki-hoge さん
> 読み込み時に検索する範囲


情報感謝です。
Docker for Windowsでデスクトップをマウントしたbashを起動したい

* Docker for Windowsで手早くLinux環境を実行したい。
* デスクトップを/desktopにマウントしてUbuntu Xenialを起動したい。
* Windows側ではdocker for Windowsとcmd.exeのみ使う。

まずはコマンドプロンプトを開いて、デスクトップに移動します。

	> cd %HOMEPATH%\Desktop

現在のパスをDocker for Windows用に変換します。手書きで書き換えるのは面倒なのでAlpine Linuxのsedを使います。

	> cd | docker run -i --rm alpine:latest sed -e s#\\#/#g -e s#\(.\):#/\1#g
	/C/Users/username/Desktop

ユーザ名が英語でスペースがないならば、/C/Users/%USERNAME%/Desktop でもいけそうです。
	
Docker run を実行します

	> docker run --rm -it -v /C/Users/%USERNAME%/Desktop:/desktop -w /desktop ubuntu:xenial bash
	# ls -al
	# exit
		
日本語ファイル名が文字化けするので、ロケールなどを設定したDockerfileをつくって起動します。
ローカルタイムをJSTに、ミラーを理化学研究所に、ロケールをen_US.UTF-8にしています。
コマンドプロンプトでは **type con > filename** で標準入力の内容をfilenameに保存できます。CTRL+Cで終了。
イメージ名は myenv としました。

コマンドプロンプト

	> mkdir myenv
	> cd myenv
	> type con > Dockerfile
	以下のDockerfileの内容をペーストしてCTRL+C

Dockerfile

	FROM ubuntu:xenial
	RUN set -xe && \
		rm /etc/localtime && \
		ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
		echo 'Asia/Tokyo' > /etc/timezone && \
		sed -i.bak 's#http://archive.ubuntu.com/ubuntu#http://ftp.riken.go.jp/Linux/ubuntu#g' /etc/apt/sources.list && \
		apt-get update && \
		DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
		locales && \
		sed -i '/^# en_US.UTF-8 UTF-8/s/^# //' /etc/locale.gen && \
		locale-gen && \
		update-locale LANG=en_US.UTF-8
	ENV LC_ALL en_US.UTF-8

コマンドプロンプト

	> docker build -t myenv .
	> docker run --rm -it -v /C/Users/%USERNAME%/Desktop:/desktop -w /desktop myenv bash
	# ls -al
	# exit

日本語ファイル名が文字化けせず表示されました。
bash中心の作業環境構築ならば、WSLなどをつかったほうがよいかもしれません。
SORACOMでサポートしているLPWAをちょっと比べてみた

この記事は[ハンズラボ Advent Calendar 2017] (https://qiita.com/advent-calendar/2017/handslab)17日目の記事です。

こん○○わ
年末の慌ただしい時に急性胃腸炎にかかった、@t-hirai777です。
プロジェクトメンバーの方、ごめんなさい！
皆さん、健康には気をつけましょうー

## お題
今年度の復習に[SORACOM] (https://soracom.jp/)がサポートしている、LPWA(Low Power Wide Area Network) と呼ばれる無線通信規格を使っている、LoRaWANとSigfoxをちょっと比べてみました。

## LoRaWAN

###概要
日本では免許不要のサブギガ帯域である920MHzの特性を活かし、伝搬距離が長く、最大 10km 程度の長距離通信が可能です。(*1)
低消費電力のためバッテリー等の電源設備の負担を低減できます。
標準化団体のLoRa Allianceにより公開されているグローバルでオープンな技術仕様です。

(*1) 実際の通信可能距離は電波状況等によって変動します

### エリア
使用したいエリアに基地局(ゲートウェイ)を設置し、携帯通信網を補完することができます。

### 上り送信可能データサイズ
1回の送信可能なデータサイズ(Payload)は、最大 11byte(Default SF10の場合)

### 下り送信可能データサイズ
上りと同様

## Sigfox

### 概要
低消費電力で、デバイスや使用方法によっては、乾電池で数年間稼働させることも可能です。
デバイスを低いコストで購入可能です。
日本では免許不要のサブギガ帯域である920MHzの特性を活かし、伝搬距離が長く、最大 10km 程度の長距離通信が可能です。(実際の通信可能距離は電波状況等によって変動します)

### エリア
2017年3月　東京23区、横浜市、川崎市、大阪市
2018年3月　政令指定都市を含む主要36都市
2020年3月　全国

### 上り送信可能データサイズ
12byte(*2) 

(*2)SORACOM社からのホームページでは見つけられませんでしたが、 日本で、Sigfoxのネットワークを運営している、KCCS社の情報に記載がありました。

### 下り送信可能データサイズ
上りと同様と思わます。(*3)

(*3)下りに関しては、明確なドキュメントはありませんでしたが、上りの1メッセージのサイズからの想定になります。

## まとめ
LoRaWANとSigfoxは、似たようなサービスですが、
前者がゲートウェイを自分で設置して利用するか、もしくは、既に設置されている企業等のもので公開されているものがあれば利用することができます。

後者は、KCCS社が基地局を既に設置しているので、対応エリアの範囲なら、対応端末を購入すれば、すぐに無線通信で、センサーデータをクラウドまであげれ可視化する所まで、試すことができます（約１５〜６０分くらいで）！！！

## おまけ
Sigfoxの検証端末(Sens'it)の大きさ比較
![Image uploaded from iOS_low.jpg](https://qiita-image-store.s3.amazonaws.com/0/48563/0e3df6b0-612d-a0aa-daee-49d005dad51d.jpeg)

Sens'itがデータを送信している瞬間
![Image uploaded from iOS (1)_low.jpg](https://qiita-image-store.s3.amazonaws.com/0/48563/f44c39d4-af3a-916c-a8d6-8ae4efe906c8.jpeg)


## 参考リンク
https://soracom.jp/services/air/lora/
https://soracom.jp/services/air/sigfox/
https://dev.soracom.io/jp/start/sigfox_hw_sensit/
http://www.soumu.go.jp/main_content/000452035.pdf

明日は@ykarakitaさんです。
アロー関数の基本

ES6から登場したアロー関数はWebでさらっと調べて用を足すという癖が強いハイスキルあるいはレイジーなエンジニアにとって、実は分かりにくかったりします。
そういう方（自分）向けに改めて整理しました。

# 関数の書き方
JavaScriptで関数は以下の２つがあります。
(Functionでの作成は問題を複雑にするので書いてません）

```JavaScript
//関数宣言
function addNumber(x) {return x + x;}
//関数リテラル
var addNumber = funcion(x) { return x + x;}
```

アロー関数は上記のうちの**関数リテラル**に対する省略記法です。これ大事なとこなので覚えてください。
そういえば、関数って２種類書き方あったんだと、改めて感じた人は何かを書籍を購入してください。

# アロー関数はコピってはいけない
以下にプログラムで順に書いていますが、引数が１つ、１つ以上、ない場合でカッコが省略されることがあります。また、returnだけだと、returnすら省略されます。
つまり、「アロー関数の書き方」でググって、既存の関数リテラルをさらっと書き直そうとすると、その著者の書き方のコピペでしかいつまでも書けません。そして、見つけるサイトはいつも変わる可能性があるので、結局いつまでもいろんなパターンのアロー関数をコピペでしか書けないという結果になります。

```JavaScript
//教科書通りのアロー関数
var addNumber = (x) => {return x + x}

//引数が１つの場合はカッコを省略可能
var addNumber = x => {return x + x}

//return文だけの場合は波括弧とreturnが省略可能
var addNumber = x => x + x;

//引数がない場合
var addNumber = () => x + x;
```

# 関数リテラルとアロー関数は同義ではない

省略記法とは言いつつ、このことは認識が必要です。
1. コンストラクタとして使えない
2. yieldが使えない
3. thisの値が関数定義時に決定される

特に３つ目はググってすますような人にはかなり理解が難しいです。**callやapplyを使って関数を呼び出している場合は特に注意が必要**と覚えておいてください。
[さくらのレンタルサーバー]SSL/TLSとwwwサブドメインのための.htaccess

[さくらのレンタルサーバー](https://www.sakura.ne.jp/)でよくある`.htaccess`を実践する。独自ドメインが前提。

# httpからhttpsにリダイレクト

```
#RewriteEngine on

#RewriteCond %{HTTPS} off
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URL} [R=301,L]
```

普通ならこのようにすればよいが、さくらのレンタルサーバーのSSL/TLSはリバースプロキシを利用している関係で、Apacheのmod_sslによるSSL/TLSを対象にしている`RewriteCond %{HTTPS} off`ではうまくいかない。HTTPSアクセスの場合はどこかしらで環境変数`HTTPS = on`がセットされているのでこれを利用する。

```
RewriteEngine on

RewriteCond %{ENV:HTTPS} !on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URL} [R=301,L]
```

または、HTTPSアクセスの場合のみ`%{HTTP_X_SAKURA_FORWARDED_FOR}`が出現するので、これを使っても良い(が、この方法ではヘッダに`X-SAKURA-FORWARDED-FOR`が入っているHTTPリクエストを誤判定するので、`HTTPS`環境変数の方が無難)。

# wwwサブドメイン

さくらのレンタルサーバーで独自ドメインを運用する場合、ドメイン名`example.com`に対してサブドメイン`www.example.com`でのアクセスを可能にするかどうかを選ぶことができる。www付きドメインでのアクセスを不可能にする設定にした場合、www付きドメインへのアクセスはさくらインターネットのエラー画面が表示されるようになる。そこで、www付きドメインでのアクセスを可能にした上で`.htaccess`でwwwなしのドメインへ転送したくなる。

```
RewriteEngine On

RewriteCond %{SERVER_NAME} !^example\.com [NC]
RewriteRule ^ http://example.com/%{REQUEST_URI} [R=301,L]
```

# 組み合わせ

この2つを組み合わせようとするとうまくいかない。www付きドメインへのアクセスであっても、HTTPSアクセスがリバースプロキシされる過程で`Host` HTTPヘッダがwwwなしのものになるため、Apacheに辿り着く時には情報が失われていて、環境変数などサーバーから観測できる範囲の情報ではどちらからのアクセスかは判別することができず、どうしようもない。

`.htaccess`の範囲ではないが、wwwなしのドメインを「www付与せず」の設定にした上でwww付きのドメインを追加で登録することで目的を達成することができるようである。(なお、今度は`www.www.example.com`が問題になるが、これはもうどうしようもないので諦める)

# その他

Apacheのバージョンは2.4系。2017年9月27日までは2.2系だった。

# 参考文献

- [SSL利用時の注意点 – さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206207221)
- [さくらのレンタルサーバ・さくらのマネージドサーバ システムメンテナンスのお知らせ – さくらのサポート情報](http://support.sakura.ad.jp/mainte/mainteentry.php?id=22624)
- [mod_rewrite - Apache HTTP Server Version 2.4](http://httpd.apache.org/docs/current/mod/mod_rewrite.html)
- [さくらサーバーのhtaccessでhttpsを検知するには - スタック・オーバーフロー](https://ja.stackoverflow.com/q/26736)
コンテキスト境界、ディレクトリ構成について考える

この記事ではBEAR固有の話題はあまり出てきませんが、私がBEARアプリケーションを作るときに考えていることについて書きます。

## はじめに

BEAR.Resource はアプリケーションの情報や機能をリソースにしてREST制約で結びます[※1]。
実務の実装では、下図のようにリソースがフレームワークファミリのコンポーネント（例：フォーム）やドメイン固有のビジネスコンポーネントに依存する形になることがほとんどでしょう。

```
[リソース] -- depends --> [フレームワークファミリのコンポーネント] or [ビジネスコンポーネント]
```

ユーザの皆さん、ディレクトリ構成はどうされていますでしょうか。例として、

- `「商品を注文するショッピングサイトを作る」`

というお題で考えてみます。

## 方法１：コンテキスト境界をディレクトリとする

この例で、前回の記事で私はこのように作ってみました（しかし、ほとんどの人はまずこうはしないですよね。いかがでしょうかね？！）

![resource_context.png](https://qiita-image-store.s3.amazonaws.com/0/15295/36a72b78-b3a3-e4fa-47ff-5b9896fa6bb3.png)

リソースと同階層のトップレベルにビジネスコンポーネントのルートを置きました（ビジネス名が"Example"なのが分かりづらいですが、ここに固有のパッケージ名が入るイメージです。）。下図のように、コンテキストごとにフレームワークファミリの構成要素（Formの具象クラスなど）や自作のビジネスコンポーネントがぶら下がります。

![business_bounded_context.png](https://qiita-image-store.s3.amazonaws.com/0/15295/dbaeff67-a4a3-6801-4765-2446594fa220.png)

- 特徴：業務を垂直的に管理していくことで、複雑さに耐えやすい

## 方法２：フレームワークの提供する型（構成要素）をそのままディレクトリにする

フレームワークの学習教材としてはこちらの方法の方が直感的で分かりやすいでしょう。

![スクリーンショット_2017-12-17_7_38_04.png](https://qiita-image-store.s3.amazonaws.com/0/15295/5174fb6c-032a-984e-6b58-c5ed7b86c46b.png)


こちらは基盤の型ベースで水平的な見方かと思います。

（※余談ですが、DDD本を学習した人がトップレベルに[Domain]というディレクトリを置いて型ごとにディレクトリを分けている例をよく見ますが、それも分類としてはこちらになると思います。）

## おわりに

ともあれ、ディレクトリ構成というのは一度アプリケーションを作ってしまうと後からは変えづらい箇所ですから、設計対象として最初に考える必要があり、議論の余地があるところかと思います。

## 引用記事

- [※1] [BEARマニュアル -リソース](http://bearsunday.github.io/manuals/1.0/ja/resource.html)

-----

[2022年5月追記 ここから]

- 関連リンク

https://twitter.com/minodriven/status/1148960876201836546
[Elm] elm-touch-events使ってみた

最近、[elm-touch-events](http://package.elm-lang.org/packages/mpizenberg/elm-touch-events/3.0.1/)を使って遊んでみてるので、その簡単な解説をば。

# elm-touch-eventsとは
Elmには、デフォルトでタッチイベントを制御する機能は入っていません(Elm 0.18では)。
これでは、スマホ向けに凝ったUIを作るときに、困ったりすることがありそうですね。

そこで便利なpackageが、elm-touch-eventsです。

## 何ができるの？
DOMをタッチしたときに、「指が触れたとき」、「指を動かしたとき」、「指を離したとき」の3つについて、
それぞれに発火するイベントを作成することができます。
マルチタッチにも対応しています。

# デモ
スライド動作によるオブジェクトの移動と、
ピンチアウトによるズーム機能を実装しました。
https://ebiryu.github.io/elm-touch-demo/
(※スマホなどのタッチデバイスじゃないと動作しないです)

# 使い方
大体のことはpackageのページを見れば書いてありますが、
今回は日本語のドキュメントを増やす意味で書いておきます。

## インストール
elm-packageでインストールします。

```
elm-package install mpizenberg/elm-touch-events
```

## SingleTouch
マルチタッチにも対応していると言いましたが、
シングルタッチはもっと簡単に実装できます。

デモのソースコードを見てみましょう。
https://github.com/ebiryu/elm-touch-demo/blob/master/src/Main.elm

まずはviewから。

```elm
objects : Model -> List (Svg Msg)
objects model =
    [
    ...
    , polygon
        [ SingleTouch.onStart SingleStart
        , SingleTouch.onMove SingleMove
        ...
        ]
        []
    ]

```
この`objects`はviewで読み込んでるsvgの要素ですが、
その中の一つの三角形に、attributeとして`onStart`と`onMove`を追加しています。

この`onStart`と`onMove`は、HtmlのEventsの`onInput`のようなものです。
`onInput`では、StringをMsgと一緒に返していますが、
`onStart`、`onMove`では、DOM全体から見たときのタッチした座標をMsgに乗せて返します。

Msgは次のようになります。

```elm
type Msg
    = SingleStart Touch.Coordinates
    | SingleMove Touch.Coordinates
    | ...
```

`Touch.Coordinate`は、`{clientX : Float, clientY : Float}`という形になっているため、あとはこれらの値をupdate内で使ってあげればいい感じになります。

## MultiTouch
MultiTouchでも、同様に`onStart`、`onMove`などがあるのですが、SingleTouchとは違い、`Touch.Coordinates`ではなく、`Touch.Event`を返します。

```elm
view : Model -> Html Msg
view model =
    div
        [ ...
        , MultiTouch.onStart MultiStart
        , MultiTouch.onMove MultiMove
        ]
        [ ...
        ]
```

```elm
type Msg
    = ...
    | MultiStart Touch.Event
    | MultiMove Touch.Event
```

この`Touch.Event`は、そのままでは扱いづらいので、これを処理する関数もpackageに同梱されています。
それは、`Touch.touches`、`Touch.changedTouches`、`Touch.targetTouches`の3つです。

これらについて詳細は、次のページに書いてあります。
https://www.html5rocks.com/ja/mobile/touch/
*touches: 現在画面上にあるすべての指のリスト。
targetTouches: 現在の DOM 要素上にある指のリスト。
changedTouches: 現在のイベントに関与している指のリスト。たとえば、touchend イベントでは、離れた指のリストになります。*

これら3つの関数は、指のリストをDict型で返します。
デモでは、次のように、Dict.valuesでList型に変換して使っています。

```elm
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        ...

        MultiStart event ->
            let
                ...

                eventPositions =
                    Dict.values <| Touch.touches event

                ...
            in
                ...

        MultiMove event ->
            let
                ...

                eventPositions =
                    Dict.values <| Touch.changedTouches event

                ...
            in
                ...
```
こんな感じですね。
基本的には、指が触れたときに`touches`でその全部の指の位置を取り値を初期化し、
動いたときにも`touches`、離したときその座標を取りたいときは`changedTouches`を使う感じになりそうです。

svgの移動やズームに使っているtransformについては、以下のページがとても参考になりました。
http://defghi1977.html.xdomain.jp/tech/svgMemo/svgMemo_04.htm

# まとめ
[elm-touch-events](http://package.elm-lang.org/packages/mpizenberg/elm-touch-events/3.0.1/)を使えば、スマホ向けのリッチなwebアプリもElmで作れそうですね。
気象警報・注意報の発表区域のベクトルタイル


# はじめに
気象庁が発表している気象警報・注意報は、市町村を基本としていますが、一部、気象特性に合わせて市町村を分割して発表されています。この発表区域の地理情報を作成、バイナリベクトルタイル化します。

気象警報・注意報の発表区域について詳しくは、[気象庁XML電文を「正しく」画像化するために必要な地図の話]
(http://eleclog.quitsq.com/2017/04/rendering-accurate-map.html)をお読みください。このブログを読んだのがきっかけで今回のベクトルタイルを作成しました。

# 使用するデータ
### 気象庁
気象庁からの地理情報データの公開はないため、下記のページにある定義や地図を基にします。

- [気象庁 | 気象警報・注意報や天気予報の発表区域](http://www.jma.go.jp/jma/kishou/know/saibun/index.html)
- [気象庁 | 市町村を分割して設定している二次細分区域](http://www.jma.go.jp/jma/kishou/know/yougo_hp/shichoson_ichiran.html#beppyou)

### 国土数値情報
[国土数値情報　行政区域データ](http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_3.html)から、市町村の境界データを取得してGeoJSONを作成します。



### e-Stat
[e-Stat 国勢調査](http://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do)から町丁・字レベルの境界データを取得して、市町村が分割されている区域の境界に使用します。

# GeoJSON作成

### 1. 市町村GeoJSON作成
参考: [国土交通省のシェイプ形式データから全都道府県市町村郡区のGeoJsonとTopoJsonを作成。](https://qiita.com/niiyz/items/4e98766172340a7ee929)

### 2. 市町村を分割して設定している二次細分区域
27市町村58区域あります。
分割された境界は、飛び地、合併など様々なパターンがあります。QGISで国土数値情報の市町村界とe-Statの町丁・字の境界を組み合わせて作成しました。

![スクリーンショット 2017-06-05 2.34.44（2）.png](https://qiita-image-store.s3.amazonaws.com/0/103755/9e379850-26f5-fcc2-7651-b4f64dd63155.png)
QGISの空間演算ツールやジオメトリツールを使って[編集](https://github.com/weatherbox/warning-area/issues/2)、釧路市は飛び地と合併の組み合わせ



### 3. GeoJSONを統合
市町村等をまとめた地域以上は[shapely](https://shapely.readthedocs.io/en/latest/manual.html#cascading-unions)で統合して作成します。



---
ここまでは、手作業が多く大変です。
作成したGeoJSON、作成に使ったPythonスクリプトはGithubに公開しています。
https://github.com/weatherbox/warning-area

![スクリーンショット 2017-12-17 7.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/103755/7586da02-f8f1-b7ed-9a48-8d4bdc6ca202.png)


# バイナリベクトルタイル作成
作成したGeoJSONを[tippecanoe](https://github.com/mapbox/tippecanoe)でバイナリベクトルタイルに加工します。

```
tippecanoe -e city -z 10 city-all.geojson
```


gh-pagesでバイナリベクトルタイルを提供しています。
https://github.com/weatherbox/warning-area-vt

参考

- [バイナリベクトルタイルの作り方](https://shimz.me/blog/leaflet-js/5354)
- [gh-pagesで OSM 日本ベクトルタイル提供](https://qiita.com/hfu/items/e7c0318bba67827d4327)

# Web地図に
![スクリーンショット 2017-12-17 5.55.34.png](https://qiita-image-store.s3.amazonaws.com/0/103755/f0171a06-779b-a991-e493-38306fbcab40.png)
https://weatherbox.github.io/warning-area/

作成したバイナリベクトルタイルを[Mapbox GL JS](https://www.mapbox.com/mapbox-gl-js/api/)で表示しています。この数のポリゴンをサクサク描画できるのはすごいです。
地物の属性でフィルタリングできることを活かして、階層を辿って各区域を探索できるWeb地図にしました。

# リアルタイムWeb地図に(実験中)
![スクリーンショット 2017-12-17 5.54.45.png](https://qiita-image-store.s3.amazonaws.com/0/103755/64c4b464-5e96-1018-5669-621ce4fb1dd8.png)
https://weatherbox.github.io/warning/

[気象庁防災情報XML(PULL型)](http://www.data.jma.go.jp/developer/xmlpull.html)からデータを取得してリアルタイムWeb地図を実験中です。
サーバーで動的に描画(例えば[NHKデータマップ](https://www3.nhk.or.jp/weather/rain/radar.html))せずに、静的なファイルのみでここまでできます。


# まとめ
気象警報・注意報の発表区域のベクトルタイルの生産、消費の例を紹介しました。
今後は、[土砂災害警戒情報で使用する地域](http://www.jma.go.jp/jma/kishou/know/bosai/doshakeikai.html)[、津波予報区](http://www.data.jma.go.jp/svd/eqev/data/joho/t-yohokuinfo.html)など防災に役立つベクトルタイルを作成することを考えていますが、データの作成が大変そうです。

ベクトルタイルの優れた技術とWeb地図を活用して、正確な防災情報を伝えられる手段を考えていきたい思っています。
Pythonでは範囲条件を「a <= value < b」と書ける

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

# はじめに

他の言語で範囲条件と書くときは`a <= value and value < b`という書き方をしなければならないことが多いです。

しかしPythonでは`a <= value < b`という簡潔な書き方ができます。

# 普通の書き方

```py3
a <= value and value < b
```

# 簡潔な書き方

```py3
a <= value < b
```

`value`の記述が一回だけになり簡潔になりました。
また、`value`の評価が一回だけになるので、パフォーマンス的にも良くなります。

# 比較演算子は幾つでも連結できる

Pythonでは比較演算子はいくつでも連結できます。

```py3
a < b < c < d
```

ただしやり過ぎると難解になるので、上に書いたように左から右へ小<大となる条件以外はやめたほうがいいです。

```py3:value1とvalue2が等価で両方ともa以上
a <= value1 == value2
```
```py3:valueがa以上かつb以上、aとbの大小関係は問わない
a <= value >= b
```

# 参考

- Pythonドキュメンt
    - 言語リファレンス
        - [6.10. 比較](https://docs.python.jp/3/reference/expressions.html#comparisons)
バイナリベクトルタイルの拡張子が mvt であったり pbf であったりするのはなんでだろう

バイナリベクトルタイルの拡張子が多様であることと、それが生み出す選択圧の話です。

# 実情
バイナリベクトルタイルの拡張子については、次の通り割れています。

## Mapbox は vector.pbf
Mapbox さんの場合には、https://{s}.tiles.mapbox.com/v4/{layers}/{z}/{x}/{y}.vector.pbf というタイプのテンプレートURLを使っており、拡張子は、対外的に約束されたものではありませんが、vector.pbf を使っています。

## Mapzen (Tilezen) は mvt
Mapzen さんの場合には、[http://tile.mapzen.com/mapzen/vector/v1/{layers}/{z}/{x}/{y}.{format}](https://mapzen.com/projects/vector-tiles/) というタイプのテンプレートURLを使っており、バイナリベクトルタイルの場合には {format} に mvt を当てることにしていますので、拡張子は mvt です。

## OpenMaptiles は pbf.pict
OpenMapTiles さんの場合には、https://free.tilehosting.com/data/v3/{z}/{x}/{y}.pbf.pict というタイプのテンプレートURLを使っており、拡張子は、対外的に約束されたものではありませんが、pbf.pict を使っています。

## esri は pbf
esri さんの場合には、 https://basemaps.arcgis.com/arcgis/rest/services/{id}/VectorTileServer/tile/{z}/{y}/{x}.pbf というタイプのテンプレートURLを使っており、拡張子は、対外的に約束されたものではありませんが、pbf を使っています。

## hfu は mvt
私の場合、拡張子は mvt を使っています。tippecanoe や OpenMaptiles で作成した mbtiles をファイルシステムに展開する際に使う [fan_out.rb](https://github.com/hfu/jig-fan-out/) や [fan-out.js](https://github.com/hfu/fan-out-js/) をそのように実装しているためです。

# 仕様の記述
バイナリベクトルタイルの仕様書である [vector-tile-spec 2.1](https://github.com/mapbox/vector-tile-spec/tree/master/2.1) は、拡張子について次の通り記載しています。

```
2.1. File Extension

The filename extension for Vector Tile files SHOULD be mvt. For example, a file might be named vector.mvt.
```

ここを素直に読めば、拡張子は mvt とすべきですが、SHOULD の「拘束力」を確認する必要があります。vector-tile-spec は RFC 2119 に準拠するところ、RFC 2119 が定義する SHOULD の意味は、次の通りです。

```
3. SHOULD   This word, or the adjective "RECOMMENDED", mean that there
   may exist valid reasons in particular circumstances to ignore a
   particular item, but the full implications must be understood and
   carefully weighed before choosing a different course.
```

つまり、特定の環境のもとで、この規定を無視する理由があってもよいということですから、Mapbox, OpenMapTiles, esri の場合にはそのような理由があって mvt という拡張子を使っていないというふうに解釈することができます。

なお、ブランチを切って作業が進められている（が2016年10月以降更新がない）[vector-tile-spec 3.0](https://github.com/mapbox/vector-tile-spec/tree/v3.0-development/3.0)でも、この2.1節はそのまま残っています。

# 考察
## 拡張子の多様性の存在
特定の環境の都合で、バイナリベクトルタイルの拡張子には多様性があります。拡張子は飾りですが、バイナリベクトルタイルの拡張子にこのような多様性があることは知っておいても悪くはありません。とりわけ、新たにバイナリベクトルタイルを生産する方は、知っておいて損はありません。

## 拡張子の多様性が作る選択圧
また、拡張子の多様性を隠蔽するために、style.json（や scene.yaml）のレベルでバイナリベクトルタイルのメタ情報を交換したいという「選択圧」がここで発生しているということになる、と私は感じています。

## tilejson と style.json はカニバるか
なお、この選択圧に応じる仕様として、[tilejson](https://github.com/mapbox/tilejson-spec/tree/master/2.2.0) も考えられますが、style.json と食い合ってしまうのか、（設計通りに）tilejson と style.json の二段構えが主流になるのか、私はよく見通せていません。いまのところ、私は tilejson をパスして style.json を使うようなことをしています。
Node-REDをKuberenetesクラスタ環境で動かすための考察

このエントリは [Node-RED Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nodered) 15日目の記事です。

# はじめに
Node-REDでポチポチ動作させていると、インフラ屋の悪い癖で、
「これってどうしたら冗長化できるかな」
「スケールアウトってどうなんだろう」
などと考えてしまう事があります。

たとえば僕的なフィールドですと、pacemakerとかでHAしてしまうっていうのが一番手っ取り早いけど、これではAct/Standbyしか出来なさそう。

dockerでnode-redコンテナってあるけど、kubernetesの仕組みにうまく乗れば、無敵な環境つくれるんじゃない？
って思いつきで半年以上放置していました。

k8s環境ですと、OpenShiftでの実証実験が多いので、
先日、[OpenShift Origin 3.7でnoderedを導入してみた](https://qiita.com/ssakaigawa/items/174660656e7fcc02232d)を寄稿し単独のNode-Redを動かしてみたのですが、上記のところが出来ておらずモヤモヤが解消できなかったので、考えをまとめてみました。

# OpenShiftでの実証結果
Podの数を1から11Podに急増させたり、OpenShiftのオートスケール機能で、負荷に応じたPodの増減をしたのですが、とくに大きな懸念事項なく動いてしまいました。
なによりも、コンテナあたりの負荷が多くなったり、コンテナが死んでしまったらオートスケールして新しい環境を自動デプロイしてくれるので、運用がすごい楽になります。

/data部分(Node-Redの起動設定のuserDir部分)を複数コンテナで共有マウントすることで、動作が可能です。
ただし、flowの管理がファイルであることからフローエディタを同時に実行してデプロイすると、書き込みタイミングなどでデグレートする危険があると考えています。
<img width="1025" alt="スクリーンショット 2017-12-17 6.01.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/a3470e1d-c484-f4a0-bff1-14dfe21a72c7.png">

数字をPod数をポチポチしていくだけで、11個のNode-Redコンテナが増殖。
<img width="1018" alt="スクリーンショット 2017-12-17 6.03.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/1969e9a6-6bfe-5525-9a42-d5aad0c3bdc2.png">

# デザイン
Node-RED環境クラスタ化のアイデアを考えると、どうしても１つの環境で大きく２つの側面があると考えました。

|名前|概要|
|:--|:--|
|フローエディタ|Node-REDのフローを書くエディタ。開発環境 複数人で書くユースケースの方が少ない。|
|実行環境|Node-REDフローを実行する環境。|

[Node-REDの設定オプション](http://nodered.jp/docs/configuration)にフローエディタの無効化があるので、実行環境だけをデプロイすることが可能と考える。

# データの保管の問題
コンテナ自体を複数起動することを考えると、Node-REDが管理するデータはどうなるの？っていう部分が問題となる。

|考慮点|仕様|考慮内容|
|:--|:--|:--|
|データの保管|node-redコンテナはPersistent Volumeで共有ストレージ"/data"にファイルを保管する。|排他制御がなく上書きしてしまう可能性|
※[node-red-bluemix-starter:bluemix-settings.jsの一部](https://github.com/ibmets/node-red-bluemix-starter/blob/master/bluemix-settings.js#L82-L98)を見ると、IBM CloudのNode-REDはcloudantに保管している様子。

# 現時点での構成
Kubernetesの`ReadWriteOnce`という仕組みでPersistent Volumeを立てて共有している場合、
Singleコンテナからしか書き込み出来ないという制約がある。
この`ReadWriteOnce`の権限の挙動が`同時に書き込めない`ことを想定しているのであれば、
`同時書き込み`によるフローが壊れたりということは無いと考えるが、
ブラウザに表示中のフローエディタの内容が、あずかり知らぬところで変わってフローデプロイのタイミングでデグレートしてしまうなんていうことがあるのは本末転倒だと考える。

ここで今回提唱する考えとしては、
Podのグループを「フローエディタ」用（1Podのみ）と「実行環境」用（複数Pod,オートスケール対応）のように２種類のデプロイを行なってフローエディタの排他を行うポイントです。
同じNFSマウントパスを2種類のPV/PVCを作って、1つはReadWiteOnceでR/W可能、1つはReadOnlyManyとしてR/Oのみという形にすることで、複数動作が可能ではないかと考えています。

|名前|概要|k8s ストレージタイプ|Pod数上限|disableEditor|
|:--|:--|:--|:--:|:--:|
|フローエディタ|Node-REDのフローを書くエディタ。|ReadWriteOnce|1|false|
|実行環境|Node-REDフローを実行する環境。|ReadOnlyMany|無限|true|

# まとめ
もっともっとフローエディタが複数人でつついたらどうなるかとか、
実証実験の結果をもっと充実したいとかいろいろ考えているうちに時間ばかりが経過してしまいました。
今回はこういう考えでクラスタ環境できそうだよ。という１つのアイデアにとどまっていますが、今後もNode-REDをガツガツ使う環境にも提案していきたいと思うので、このあたりの知識を増やせていければと考えています。

造形がまだ浅く、PoCとか運用ツールでとか、Mockとかで使うことがほとんどなので、
こんなコト考えなくても実際に運用できているよ。などご意見いただければ幸いです。

後日このあたりをもっと詳しく試験した結果をフィードできればと思います。
deck.glを使ってみる

# 作ったもの
<img width="1440" alt="スクリーンショット 2017-07-05 17.31.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/103755/91d06e26-7e07-aebd-7552-cf2e113c6d8f.png">
https://weatherbox.github.io/amedas/stats/

コード https://github.com/weatherbox/amedas/tree/master/stats


# deck.gl
Uber製のデータ可視化ツール
https://uber.github.io/deck.gl/#/examples/core-layers/hexagon-layer

ドキュメントとサンプルコードを読んで、降水量を表示できるように拡張しました。
https://github.com/uber/deck.gl/tree/4.0-release/examples/3d-heatmap


# データ
[最新の気象データCSV](http://www.data.jma.go.jp/obd/stats/data/mdrr/docs/csv_dl_readme.html)を利用しています。
systemd-nspawnの--private-usersオプションについて

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


systemd-nspawnで最初にはまる罠（？）として--private-usersオプションがあります。
これどういうことかというとファイルのuid,gidをホスト側とぶつからないように、再マッピングしてくれる機能です。

例として、以下のような状態を想定します。

uid=1000(yamasita) gid=1000(yamasita) というユーザがホスト側に
uid=1000(cuser) gid=1000(cuser) というユーザがコンテナ側にあったとします

```bash
# /home/yamasitaとコンテナ側の/mntをつなげて起動
systemd-nspawn -D container/ --bind /home/yamasita:/mnt
# cuserになる
su - cuser
# 自由にディレクト触れてしまう
touch /mnt/hogehoge
```

コンテナ側のユーザもuid=1000番なので、cuserはホスト側の世界だとyamasitaユーザとしての権限を持ってしまいディレクトリに書き込めるというわけです

この挙動を意図していない場合は--private-users=pickという引数を使います

```bash
# /home/yamasitaとコンテナ側の/mntをつなげて起動
 systemd-nspawn --private-users=pick -D container/ --bind /home/yamasita:/mnt
# cuserになる
su - cuser
# エラーになる
touch /mnt/hogehoge
# touch: cannot touch '/mnt/hogehoge': Permission denied
```

今度はエラーになりました。
これは、コンテナ内のユーザがホストに存在するユーザと重ならないように調整され、ホスト側から見ると違うユーザとして動いているからです。
（コンテナ側から見ると同じ1000番になっています。）
このオプションは暗黙的に--private-users-chownというオプションもONにして、ファイルの所有者も全部変更されますので、起動に若干時間がかかります。
ちなみに以下のようにすると、変わってしまった所有者情報を戻すことができます

```bash
systemd-nspawn --private-users=0 --private-users-chown -D container/ 
```


という感じでした。
これはこれでセキュアな環境を作るには良いんですが、気軽にやってしまうと思わぬbindを使ったホスト側とのファイル共有でトラブルを招くので注意してください
英語初心者向けのリーディング教材

[プログラマのための英語・外国語 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lingo) も18日目になりました。

これまでは英語のリスニングについて書いてきました。

[[ネタバレ注意]アニメで始める英語リスニング](https://qiita.com/akiraak/items/04e678bfffd851b31c8f)
[聞き取れない英語のセリフを何回も聞きまくる方法](https://qiita.com/akiraak/items/184a4111e46b959de9f2)

今回はリーディングの教材を紹介したいと思います。それも初心者用です。

英語を読むのは苦手ですか？もちろん僕は苦手です。エラーメッセージすら目をそらしたくなります。でも英語を読めるようになるには英語を読むしかありません。

でも世の中にあふれている英文は英語初心者には難しいものばかりです。よく英語のリーディングは９割分かり残りの１割分からない英文を読むことが効率良いと言われています。そして、できれば読んでて飽きないというか面白い英文を読みたいところです。そこでアメリカの本屋でよいものがないか探してみました。児童書コーナーになら読みやすいのがないかなと探してみたんですが、とても難しすぎて理解できません。ハリーポッターなんて全く理解できません。

なぜなのか？

簡単な話で、ネイティブ児童（小学生）のTOEICスコアって900なんですね。つまり僕ら初心者に必用なのは児童用ではなくて幼児用なんです。そこで幼児コーナーを探してみると絵本しかありません。1000円払って20文章くらいしか載ってないものはちょっとコスパが悪すぎます。

あれこれ探してみたところ、「東進ブックス レベル別問題集シリーズ」と「ラダーシリーズ」が幼児レベルかつ内容とお値段も良かったので紹介します。どちらも中学英語がわかるTOEIC300くらいから読める内容になっています。

# 東進ブックス レベル別問題集シリーズ レベル1

[<img src="https://images-na.ssl-images-amazon.com/images/I/51Ji3urypcL._SX359_BO1,204,203,200_.jpg" width="160">
英語長文レベル別問題集 1超基礎編 (東進ブックス レベル別問題集シリーズ)](https://www.amazon.co.jp/dp/4890853944)

これは受験向けの教材なんでしょか？正直なところ学校では英語の勉強を一切やっていなし受験もしたことないし、ただゲームを遊んだり作ってりしていただけなのでよくしらない世界だったのですが、こんなに簡単な英文が大量に書かれている本があったんですね！すばらしい。

![IMG_E2842.JPG](https://qiita-image-store.s3.amazonaws.com/0/33704/a83d5bea-8cd9-2c11-c3fb-b35b4e9930c4.jpeg)

レベル１はTOEIC200からの難易度です。超簡単です。文章の一部を見てみましょう。

![IMG_2841.jpg](https://qiita-image-store.s3.amazonaws.com/0/33704/b6ff16e0-ae61-5f80-4558-b5b6ad00b27e.jpeg)

これは「オタクは危険だと思われているけどもっと優しくしようね」っていうポエムです。

```
A lot of people thought otaku were strange and dangerous.
```

dangerous って、、、もっと優しくしてください。

英文には問題が付いています。解いてみて点数が高いとうれしくなれます。

![IMG_2840.jpg](https://qiita-image-store.s3.amazonaws.com/0/33704/3ce72cbf-440e-9621-4d79-de46e39eb2a4.jpeg)

あと、構文解析と日本語訳と主な単語熟語の訳が載ってます。

![IMG_2839.jpg](https://qiita-image-store.s3.amazonaws.com/0/33704/5f8afef8-a5a1-b99c-e0f0-a48e2c040e42.jpeg)

同じ文章を何回も読んでると、どんどん読む速度が上がっていきます。CDもついてるのでリスニングの練習もできます。

![IMG_E2843.JPG](https://qiita-image-store.s3.amazonaws.com/0/33704/cb256f15-bb21-4ec9-7f9e-a11407c38f67.jpeg)

順番にやっていけば東大に入れるようです。

英語とは関係ないけど、息抜きにこの前 Switch で発売されたドラゴンファングZやってます。トルネコやシレンやチョコボダンジョンみたいなやつです。

# ラダーシリーズ

次はラダーシリーズです。

ラダーシリーズは多読を目的に作られている本で、クラッシック、現代文学、ノンフィクション、ビジネスと本の内容がいろいろあるので自分の好きなジャンルのものを選べます。
[ラダーシリーズとは: IBCパブリッシング](http://www.ibcpub.co.jp/ladder/)

こちらもレベル別に別れていて、レベル1はTOEIC300を対象にしています。

読んだ本の中でもアインシュタインとエジソンが僕のお気に入りです。エジソンのをちょっと見てみましょう。

[<img src="https://images-na.ssl-images-amazon.com/images/I/41Y1GULKbqL._SX309_BO1,204,203,200_.jpg" width="160">
エジソン・ストーリー The Thomas Edison Story (ラダーシリーズ Level 1)](https://www.amazon.co.jp/dp/4794601042)

<img width="768" alt="IMG_0015.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/33704/97abc50c-0718-8b70-1d2b-3937682951d1.jpeg">

これはエジソン(DC)とテスラ(AC)の電流戦争のときの記述ですね。はっきりいってエジソン狂ってます。この争いに勝つために電気椅子を作ったようです。でもテスラに負けました。

英語とはまったく関係ないけですが、興味がある人用にリンク置いておきますね。
[電流戦争 - Wikipedia](https://ja.wikipedia.org/wiki/%E9%9B%BB%E6%B5%81%E6%88%A6%E4%BA%89)

# おわりに

「わたしが知らないスゴ本は、きっとあなたが読んでいる」と思いますので、他にもよいものがあったら教えてくだちぃ。

それでは今日も元気に少しでも英語に触れていきましょう。ではでは。
QtWebService の画像対応

# はじめに

昨日は @task_jp さんによる [Qt の値型のクラスで使われている Implicit Sharing 技術の紹介と実装](https://qiita.com/task_jp/items/7de9385313db6746aafc) でした。

今日は勉強会中に参加する予定だったのですが、家族一同体調がわるくてキャンセルしてしまいました。。。

# QtWebService とは？

[qtwebservice.io](http://qtwebservice.io/) が公式サイトです。
概要は [Qt Advent Calendar 2017](https://qiita.com/advent-calendar/2017/qt) ５日目の [QtWebService の紹介](https://qiita.com/task_jp/items/74b67bd85dc0e92a40e6) をご覧ください。

# QtWebService の画像対応

これまで様々な **テキスト形式** のデータを QML で記述することを目指してきた QtWebService ですが、諸事情により画像の動的生成に対応しました。

```qml:hello.qml
import QtWebService.Image 1.0

Image {
    id: root
    width: 100
    height: 100
    contentType: 'image/png'
    source: './qt-logo.png'

    Text {
        y: 70
        text: 'Hello World'
    }
}
```
こんな QML を書くと以下の画像が生成されます。

![Hello World](http://qtwebservice.io/examples/image.qml)

## 注意点

QtWebService の画像の生成機能を使うためには QtGui モジュールが必要です。
```QT = webservice
QT += gui
```

それから、`QCoreApplication` の代わりに `QGuiApplication` を使う必要があります。

また、QtQuick モジュールの Image や Text と同じ名前ではありますが、一切関係ないエレメントです。そのうち同じようなプロパティを整備する予定ですが、いまは最低限の機能しか用意していません。 

## なにがうれしいの？

画像を生成することができます。昔懐かしの画像のアクセスカウンターを以下のような感じで作ることも可能です。

```qml:counter.qml
import QtWebService.Image 1.0
import QtWebService.Cache 1.0
import QtQml 2.2

Image {
    id: root
    width: 100
    height: 30
    contentType: 'image/png'

    Cache { id: cache }
    Text {
        id: text
        y: 20
        x: root.width - text.width
    }

    Component.onCompleted: {
        var counter = cache.fetch('counter')
        counter = counter ? counter + 1 : 1
        cache.add('counter', counter)
        text.text = counter
    }
}
```

実行結果：
![アクセスカウンター](https://qiita-image-store.s3.amazonaws.com/0/13867/bea48ce3-2fe7-53c0-cfef-77a75555fd32.png)

## なんで作ったの？

[Google の Static Maps API](https://developers.google.com/maps/documentation/static-maps/?hl=ja) で、地図上に画像マーカーを指定する際に、様々な画像を用意するのが面倒だったので、QtWebService で提供した画像を表示するようにしています。

https://maps.googleapis.com/maps/api/staticmap?center=Tokyo&zoom=13&size=600x300&maptype=roadmap&markers=anchor:center|icon:http://qtwebservice.io/examples/marker.qml|35.6992897,139.6759042|35.6700093,139.7146997

![地図](https://maps.googleapis.com/maps/api/staticmap?center=Tokyo&zoom=13&size=600x300&maptype=roadmap&markers=anchor:center|icon:http://qtwebservice.io/examples/marker.qml|35.6992897,139.6759042|35.6700093,139.7146997)

以下のような marker.png を用いて、

![http://qtwebservice.io/examples/marker.png](http://qtwebservice.io/examples/marker.png)

以下のようなコードで画像を生成します。

```qml:marker.qml
import QtWebService.Image 1.0

Image {
    id: root
    width: 32
    height: 32
    contentType: 'image/png'
    source: './marker.png'

    Text {
        x: (root.width - width) / 2
        y: 22
        text: (new Date).getSeconds()
    }
}
```

これを表示すると以下のようになります。

![http://qtwebservice.io/examples/marker.qml](http://qtwebservice.io/examples/marker.qml)


実際に運用している（秘密の）サービスでは、画像の qml にパラメータを渡して、少し高度な画像の生成を行っています。

# おわりに

Qt を使うとウェブサービスでの動的な画像の生成も簡単ですね。
アイディア次第で本当に色々な事ができるので、様々なことに活用してみてください。

明日は @argama147 さんによる「[今更聞けないシグナル・スロット総整理](https://qiita.com/argama147/items/30da69e4c1088917d522)」です。お楽しみに！
systemd-nspawnをansibleで一発設定する

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

[この記事](https://qiita.com/yaasita/items/3e46d7d8efc40aa09e3c)のホスト側の設定部分を書いてみた。

https://github.com/yaasita/ansible-systemd-nspawn

# 使い方

```bash
apt install -y ansible git
git clone https://github.com/yaasita/ansible-systemd-nspawn.git
cd ansible-systemd-nspawn
ansible-playbook -i localhost, -c local site.yml
# 再起動で反映
shutdown -r now
```
量子プログラミングはHaskellで

##  [量子コンピューターにはモナドがよく似合う](https://qiita.com/kyamaz/items/67ec5c7d39e62c1de91d)

Haskellと量子コンピュータのAdvent Calendar 2017のクロス投稿です。（ほんとはダメみたいです。）

私には「量子の世界感はモナドで記述するのが良く似合う」という思いがあり、今回の記事を書かせて頂きました。[Advent Calendar 2017 Haskell (その2)](https://qiita.com/advent-calendar/2017/haskell2)に「[量子コンピューターにはモナドがよく似合う](https://qiita.com/kyamaz/items/67ec5c7d39e62c1de91d)」と題して投稿しました。

Advent Calendar 2017 のイベントに、Haskellのテーマで参加表明したのちに、[量子コンピュータ](https://qiita.com/advent-calendar/2017/quantum)のテーマが作られました。ただ、量子コンピュータの参加者は少なく、寂しい状況です。[元記事](https://qiita.com/kyamaz/items/67ec5c7d39e62c1de91d)は、Haskellカレンダー用に書きましたが、両方の領域に関わるため、量子コンピュータのカレンダへのエントリ記事として、このリンク先だけの記事を投稿をさせて頂きます。
Blenderの使い始めの前準備

## 初めに

はじめまして!! 
香川大学工学部3年のK.Okumuraです。配属先の研究室の関係上BlenderとUnityを多用するのですが、いかんせん全く講義には出てこないものなので全然使い方など分からないです。なのでここでは特にBlenderに着目してとりあえず使ってみようと思います。あとこの記事がQiitaデビュー作です(笑)、なので不備があればどんどん改善します。

## Blenderとは

まずBlenderとは何ぞやということで調べたことをまとめると、3DCGアニメーションを作成するための統合環境アプリケーションであり、オープンソースのフリーウェアだそうです。

## ダウンロードとインストール
Blenderがどんなものなのかざっくりと分かったところでまずダウンロードをしたいと思います。方法はとても簡単で、(https://www.blender.org/download/) に飛んでから「Download Blender」をクリックするだけです!!!

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224244/d7fd2b59-a184-9cdf-beab-9776b5720125.png)

ダウンロードが終わったらインストーラを起動して、任意の場所にインストールします。(デフォルトではC:\Program Files\Blender Foundation\Blenderに保存されます)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224244/ca0a1f4b-9131-2f82-05ee-b7df2358c3cb.png)
↑↑↑こんな感じのインストーラです。
## Blenderの起動

任意の場所に保存したblender.exeを実行することで起動が行われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224244/48ccc7a7-d9a7-a52d-4dec-84a51e2deaad.png)

## 起動すると

起動するとこんな画面になります。第一印象「うわぁ～、めんどくさそ～、あと誰だこのおっさん(笑)」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224244/5d5b99af-edbb-2844-42f5-deabdd6d558f.png)

## デフォルト画面の説明

デフォルト画面の説明ということで色分けして部分ごとに見ていきたいと思います。ものすごい雑な説明ですけど、おいおい使う際に説明するということで勘弁してくださいm(__)m

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224244/b2d5ffae-1d01-3bce-bad6-7153dee3c61e.png)

Info -> 基本的なBlenderの操作を行うためのプルダウンメニュー
3D view -> 作業画面で3DCGが表示される、左側にはツールシェルフ、下には専用のヘッダがある
Timeline -> アニメーションの制御を行う
outliner -> 要素の階層表示を行う
properties -> プロパティの設定を行う

##　まとめ
とりあえず使い始めの前準備という感じで締めたいと思います。次は何か実際に作ってみようと思います。最後に、今回の記事作成、午前3時前にすることじゃねえな(笑)