OmniAICreator/Qiita-1.07M huggingface dataset:
GitLabのイベント(Push等)をSlackへ通知する手順

# 作業手順
1. Slackの設定画面から**[Incoming WebHooks]**の作成
2. GitLabのプロジェクト設定から**[Slack notifications]**を設定

手順としてはこれだけですが、検索して出てきた手順では設定が上手くいかず、
結構手間取ってしまったので、誰かのお役に立てればと思い投稿することにしました。
さっそく具体的な画面を見ながら設定していきましょう。

# 1. Slackの設定画面から[Incoming WebHooks]の作成
https://api.slack.com/ へアクセスします。
![Screenshot-image01.png](https://qiita-image-store.s3.amazonaws.com/0/177029/81f824c8-a497-37a1-79e1-ffc92f6e9e9d.png)

下の方へスクロールして**[App features]**にある**[Incoming webhooks]**をクリックしてください。
![InkedScreenshot-image02.jpg](https://qiita-image-store.s3.amazonaws.com/0/177029/078e57f5-d5c7-e4bd-b935-673d4d2598b4.jpeg)

Incoming Webhooksの説明があります。
**[incoming webhook integration]**をクリックして、Webhooksの作成画面へ移動しましょう。

![InkedScreenshot-image03.jpg](https://qiita-image-store.s3.amazonaws.com/0/177029/a6ba75ba-ba8b-cdc9-545d-ed6d549df4ef.jpeg)

**[Post to Channel]**でGitLabのイベントがあったときに通知したいチャンネルかダイレクトメッセージの宛先を選んでください。
<img width="721" alt="Screenshot-image04.png" src="https://qiita-image-store.s3.amazonaws.com/0/177029/9d12a1be-e5bc-b0a1-7714-97979932310e.png">
宛先を選んで、**[Add Incoming Webhooks Integration]**ボタンをクリックするとWebhookの作成は完了です。

次にWebhookの設定をしましょう。
GitLabへ登録するWebhookのURLはどこかへコピーしておいてください。

![InkedScreenshot-image05.jpg](https://qiita-image-store.s3.amazonaws.com/0/177029/d5b54caf-34bd-6b9a-da69-6e1bdc690c07.jpeg)

Slackへ通知するときの画像や名前を設定します。
GitLabの通知だとわかるように今回はこんな感じで設定しました。

 - Customize Name：GitLab
 - Customize Icon：GitLabのアイコン

![Screenshot-image06.png](https://qiita-image-store.s3.amazonaws.com/0/177029/cb3382be-589c-6c19-37c0-8bad2ee9554f.png)

これでSlack側の設定は完了です。

# 2. GitLabのプロジェクト設定から**[Slack notifications]**を設定

Slackへ通知させたいプロジェクトの**[Setting]**から**[Integrations]**を選択します。
![InkedScreenshot-image07.jpg](https://qiita-image-store.s3.amazonaws.com/0/177029/5a689ea1-b84b-c7a2-30bb-ecc0159f4f7c.jpeg)

下のほうへスクロールすると**[Project services]**に**[Slack notifications]**があるのでクリックします。
![Screenshot-image08.png](https://qiita-image-store.s3.amazonaws.com/0/177029/a50ca635-f14b-02eb-7733-5a8de59af4e4.png)


Slack通知の設定画面へ移動するので、通知させたいイベントを選びます。

■通知できるイベントの一覧

 - Push 
 - Issue 
 - Confidential issue 
 - Merge request 
 - Note 
 - Tag push 
 - Pipeline 
 - Wiki page 


Webhookの入力欄へSlackで設定したWebhookのURLを入力します。

最後に**[Test settings and save changes]**をしたときに、設定したチャンネルへ通知されれば完了です。
セマフォを調べてみた(Linuxカーネル勉強会第二回[2017年11月])

### [説明]
●セマフォって？
コンピュータには共有の資源(CPU、メモリ、ディスクなど）があり、それらの資源を複数のプログラムが同時に利用する時に、順番に使用させることがセマフォの役割（排他制御）
セマフォは整数で、その値は決して0未満になることは許されません。

### [セマフォの種類について]
2進セマフォとカウント用セマフォの2種類）

- 2進セマフォ（バイナリセマフォ）は**「0」**と**「1」**のどちらかの値をとらない。
- カウント用セマフォは負以外の任意の値をとることができます。

### [セマフォの操作と動きについて]
- セマフォ値を 1 増やす (sem_post)
- セマフォ値を 1 減らす (sem_wait)
- セマフォの値がすでに0の場合、セマフォ値が0より大きくなるまで操作は停止する。

### [セマフォの動き]
1. セマフォのフラグは初期化によって最初1はセットされる。 → 値は1
2. プロセスが処理を開始時にsemwaitを呼ぶ(−1)。→ 値は0
3. その後、処理の終了と共にsempostを呼ぶ(+1)。→ 値は1

### [バイナリセマフォでは...]
0か1しかない為、他のプロセスが同時に処理しようとすると、フラグが0になっているためにデクリメントに失敗して処理がブロックされる。

### [カウンティングセマフォ]
一つのセマフォの中に、複数個分のの実行許可を持つもの。

　例) １０個の鍵付きの空き室が有るとし、その鍵は玄関に設置されている。
空室を使うときには、玄関にある鍵を取り使い終わったらすぐに返すというルールになっています。
空室を使いたい人は多いのですが、鍵をとれなかった人は鍵が返されるまで待つということになります。
この鍵置き場と鍵がカウンティングセマフォに相当。

利用できる資源が一つではないが一定数以下しかない場合に、鍵置き場と鍵(カウンティングセマフォ)を利用して、資源を利用できる者を管理するという仕組み。

### [ではSourceを確認]
```./include/linux/semaphore.h
// セマフォの構造体
/* Please don't access any members of this structure directly */
struct semaphore {
        raw_spinlock_t          lock;
        unsigned int            count;
        struct list_head        wait_list;
};
```

```./kernel/locking/semaphore.c
// セマフォデクリメント
void down(struct semaphore *sem)
{
        unsigned long flags;

        raw_spin_lock_irqsave(&sem->lock, flags);
        if (likely(sem->count > 0))
                sem->count--;
        else
                __down(sem);
        raw_spin_unlock_irqrestore(&sem->lock, flags);
}

// セマフォインクリメント
void up(struct semaphore *sem)
{
        unsigned long flags;

        raw_spin_lock_irqsave(&sem->lock, flags);
        if (likely(list_empty(&sem->wait_list)))
                sem->count++;
        else
                __up(sem);
        raw_spin_unlock_irqrestore(&sem->lock, flags);
}
```
Niigata.NET 3.0に参加してきました

# はじめに
Niigata.NET 3.0に参加してきましたので、感想をまとめます。
https://ngtnet.connpass.com/event/69634/

# プログラミング初級講座 C#編 - 反復 by @AILight 
@AILight によるc#プログラム初級講座

## 前回までの復習
- 変数は命名が大事
- 分岐は分岐を嫌うことが大事
	- 単純なswitch文は、配列のインデックスで代用すべし

## 反復
- forの使用例
- whileの使用例
- foreachの使用例
	- LinqのSelect()でインデックスを取得する話
		- https://msdn.microsoft.com/ja-jp/library/bb534869(v=vs.110).aspx

# アプリ開発ハンズオン by @masaru_b_cl 
@masaru_b_cl によるじゃんけんバトルアプリ開発ハンズオン

## ハンズオン
仕様書(完成図)を見ながらハンズオン。
## 解説
著者による解説

# 感想
今回も楽しかったです。また参加したいです。
まず、c#講座ですが、普段は意識しないのですが、forと比べると
foreachはブラックボックス多いと改めて感じました。

foreachにおける、対象集合に対するループの開始位置や終了位置。
ループの順序や増分など、今度整理したいです。
例えば、下に書いてあることとかです。
http://ufcpp.net/study/csharp/sp_foreach.html

次に、ハンズオンですが、やってみるととても新鮮でした。
解説のソースレビュー会も楽しかったです。

楽しかったで終わらせずに、プログラムの基礎スキル向上を目的とするためには、成果物(ソース)の評価やフィードバック(レビュー)が
あった方が、なお良いかなと思いました。
過程だけでも、少なからず効果はあると思いますが。

お悩み相談室は時間の都合で中止になりました。
もしあったら、以下のようなことを聞きたかったです。

- .NetクラスタにおけるAIは？
- 新規Webアプリ開発の構成指針
	- 昨今でもASP.Net MVCがファーストチョイス？AngularやReact+WebAPIとかは？

最後に、地方で大変貴重な勉強会を企画、開催してくださっている
主催者様には毎回頭が下がります。
ありがとうございました。

# 2017/11/20追記

いくつか漏れていたので追記します。

- @AILight 8＊8マスをulongで扱った話
- @AILight VSのパフォーマンス分析の話
- @masaru_b_cl 一品モノのSIer界隈だと、保守性が評価されにくい話
    - 確かにその通りだと思いました。
    - 自社開発だと、例えばお客様へプロダクトを届ける作業など、プログラム開発以外のタスクも多くて、そもそも、プログラム自体が評価されにくいという傾向もあったりなかったり。

# フォローアップしたいこと

- VSのパフォーマンス分析
    - [パフォーマンス プロファイラーを使ってみる](https://qiita.com/y_ohr/items/ef24cff3df074b2803f1) 書きました
- foreachの仕組み
    - [C#のforeachの仕組み(1) 言語仕様の確認](https://qiita.com/y_ohr/items/05e20ad14edef16c73d5#_reference-8fbc9c353be00c13f140) 書きました
    - [C#のforeachの仕組み(2) forとの比較コード](https://qiita.com/y_ohr/items/a8f50b15657b8b256caf) 書きました
    - [C#のforeachの仕組み(3) IEnumeratorの独自実装コード](https://qiita.com/y_ohr/items/90870acfa9564e87c123) 書きました
    - [C#のforeachの仕組み(4) ILにおけるforとの比較](https://qiita.com/y_ohr/items/1224eb74dbc82722faa0#_reference-5a2640548881c287fcbb) 書きました
    - [C#のforeachの仕組み(5) ILにおけるforとの比較 int[]編](https://qiita.com/y_ohr/items/cdc3bed3e21e2849a530#_reference-002d36980e0f6c3b7fed) 書きました

以上
styled-components でもカスタムデータ属性を使うと綺麗にかけて便利


styled-components には props を受け取るコア機能があり、大変便利です。

ですが、条件分岐(三項演算子など)の記述はきれいに書けるとは思えません。正直、書いててクソ面倒です。

# Props 分岐の例

公式の例です。

[styled\-components: Basics](https://www.styled-components.com/docs/basics#adapting-based-on-props)
https://www.styled-components.com/docs/basics#adapting-based-on-props



```js
const Button = styled.button`
	background: ${props => props.primary ? 'palevioletred' : 'white'};
	color: ${props => props.primary ? 'white' : 'palevioletred'};

	font-size: 1em;
	margin: 1em;
	padding: 0.25em 1em;
	border: 2px solid palevioletred;
	border-radius: 3px;
`;

```

```html
<div>
	<Button>Normal</Button>
	<Button primary>Primary</Button>
</div>
```


![styled-components__Basics.png](https://qiita-image-store.s3.amazonaws.com/0/40717/7209b701-c0a7-4ec1-439c-956ba32e6722.png)

# 解決案 - カスタムデータ属性

そこで**カスタムデータ属性(custom data type)**を使用する場合以下のように書けます。


```js
const Button = styled.button`
	background: white;
	color: palevioletred;

	font-size: 1em;
	margin: 1em;
	padding: 0.25em 1em;
	border: 2px solid palevioletred;
	border-radius: 3px;

	&[data-primary='true'] {
		background: palevioletred;
		color: white;
	}
`
```

```html
<div>
	<Button>Normal</Button>
	<Button data-primary>Primary</Button>
</div>
```

読みやすくもなりました。

もう一つ例を示しておきます。
value が boolean でない例です。

```js
const Button = styled.button`
	background: white;
	color: gray;

	font-size: 1em;
	margin: 1em;
	padding: 0.25em 1em;
	border: 3px solid gray;
	border-radius: 3px;

	&[data-level='success'] {
		color: #3c763d;
		background-color: #dff0d8;
		border-color: #d6e9c6;
	}

	&[data-level='info'] {
		color: #31708f;
		background-color: #d9edf7;
		border-color: #bce8f1;
	}

	&[data-level='warning'] {
		color: #8a6d3b;
		background-color: #fcf8e3;
		border-color: #faebcc;
	}

	&[data-level='danger'] {
		color: #a94442;
		background-color: #f2dede;
		border-color: #ebccd1;
	}
`
```

```html
<div>
	<Button>Normal</Button>
	<Button data-level="success">Success</Button>
	<Button data-level="info">Info</Button>
	<Button data-level="warning">Warning</Button>
	<Button data-level="danger">Danger</Button>
</div>

```


![Dentime.png](https://qiita-image-store.s3.amazonaws.com/0/40717/8fd84d2f-d5a3-2f3e-3d22-b4dfd15ee17c.png)

関連記事

* [CSS設計の類はもっとカスタムデータ属性を活用するべきでは \- Qiita](https://qiita.com/trkbt10/items/ae33dfd579c9cea7f056)
* [idやclassを使ってテストを書くのは、もはやアンチパターンである \- Qiita](https://qiita.com/akameco/items/519f7e4d5442b2a9d2da)
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part 5-3,4

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part5-3 photosコントローラー

#自己課題
- photos コントローラーを作成
- routesを設定。createとdestroyのみ。
- 配布されたviewファイルを貼り付け。

#part5-4 dropzoneの導入
画像をドロップしてアップロードできるようにするシステムを追加したい。

[ここ](https://github.com/ncuesta/dropzonejs-rails)を参照。

#自己課題
- dropzoneの追加。上を参照しながら。
- cssの追加。

#part5-5-1 turobolinkの不具合を解決
[turbolink](https://gist.github.com/saboyutaka/8727377)についてはこちら。

    data: {"turbolinks" => false}

を追加することでturbolinkをオフにできる。

#自己課題
- turbolinkを写真バーに追加。

#part5-5-2 dropzoneのコードを解説

あとで見直し。

#part6-1 githubの導入

[githubでsshキーの設定](https://help.github.com/articles/connecting-to-github-with-ssh/)に沿ってやる。

#自己課題
- sshキーの設定。（やらなくていい。）

#part6-2 fugaroの導入

guthubにアップロードしたら、重要な情報がアップロードされてしまう。

[figaro](https://github.com/laserlemon/figaro)を導入することで個人情報をあげないようにできる。

#自己課題
- figatoの導入。
- facebook　IDとシークレットキーをfigaroを使って保護。

#part6-3 github レポジトリ作成

#自己課題
- githubの指示に沿って

#part6-4 herokuにデプロイ

[heroku toolbelt](https://devcenter.heroku.com/articles/heroku-cli#macos)をいうherokuをコマンドライン上で操作できるようになるものを入れる。

##設定

    heroku login
    heroku keys:add

gemfileの追記

    group :production do
      gem "pg"
      gem "rails_12factor"
    end

    group :development, :test do
      gem 'sqlite3'
    end

    bundle install --without production
    heroku create

##gitにあげる。

    git status #状況を確認
    git add .  #追加
    git commit -m 'Add gem for heroku' #メッセージ付きでコミットする。
    git push #pushする。
    git push heroku master #herokuにもあげる。
    heroku run rake db:migrate
    heroku open

#自己課題
- herokuにあげる。

part7-1-1 トップページの画像の不具合を解消

[問題はこれ](https://qiita.com/tomomomo1217/items/fa8dfa094cc4c0e4e350)みたいだ。

しかし、heroku上に画像は表示されなかった。

#自己課題
- 上記の変更。
- herokuに変更を反映

part7-1-2 amazon s3の導入

画像をアップロードした時にheroku上だと限界があるためamazon s3を使う。

[paperclip](https://github.com/thoughtbot/paperclip)のページからアマゾンs3との連携をする。

#自己課題
- レポジトリの作成

#part7-1-3 herokuにamazon s3の設定
[この記事を参考に](https://www.udemy.com/ruby-on-rails-g/learn/v4/t/lecture/5843600?start=0)herokuとawsを連携する。

#自己課題
- 記事に沿って連携。

#part7-1-4 localにamazon s3の設定

development環境にawsを適用させる。
【CentOS7】サーバの初期設定

## はじめに
サーバを作成後に毎回行っている作業です。
### 前提
- [IDCFクラウド](https://www.idcf.jp/)で仮想マシンを作成
- CentOS7

## 作業ユーザを作成
```
# adduser [username]
```

## 作業ユーザをsudoersに追加
```
# visudo
```
```file:/etc/sudoers
## Same thing without a password
%[username]  ALL=(ALL)   NOPASSWD: ALL
```

## 作業ユーザに公開鍵を設置
公開鍵はrootユーザのものを流用する

```
# su - [username]
$ mkdir .ssh
$ chmod 700 .ssh/
$ sudo cp /root/.ssh/authorized_keys .ssh/
$ sudo chown [username]:[username] .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys 
```

## rootユーザのログインを制限
ログインを制限する前に作業ユーザでログインできるか確認する

```
# vim /etc/ssh/sshd_config
```
```file:/etc/ssh/sshd_config
#PermitRootLogin yes  ->  PermitRootLogin no
```

変更を反映させるためsshdを再起動する

```
# systemctl restart sshd.service
```
基本情報技術者試験受けてみた感想

10月15日に基本情報技術者試験を受けました。11月15日に合否の発表があり、受かっていたのでどんな勉強をしてきたのかをまとめてみました。

## やったこと
### 午前
- 過去問を解く(過去10回分を2回)
- 間違えた問題は調べて理解する

午前は[基本情報技術者試験ドットコム](http://www.fe-siken.com/)の過去問道場をしていました。

***

### 午後
- 問題集を解く
- 間違えた問題は解説を読んで理解する
- 過去問を解く(過去5回分を1回)
- 間違えた問題は調べて理解する

午後は午前とは違い1問解くのに時間がかかる為、数をこなすのが困難です。その為、1問1問しっかりと理解することが大事です。問題集は[インフォテック・サーブ](https://www.infotech-s.co.jp/)の基本情報技術者午後問題集を買いました。とても分かりやすい解説がついているのでオススメです。

***

僕は午前免除~~(甘え受験)~~で受けました。当日は午後だけに集中できるので楽でした。私は学生の為、授業を受けていれば午前免除試験を受けることができました。ですが、社会人の方などは午前免除試験を受ける為にとても面倒な手続きをしなければなりません。また、お金も試験とは別にかかってしまいます。正直なところ午前免除で受けなくても、これだけ勉強していればほとんどの場合受かります。迷っている方はやめた方がいいと思います。それでも受けたい方は[こちら](https://www.jitec.ipa.go.jp/1_80tokurei/summary_fe_menjo.pdf)を参考にしてください。
次は応用情報技術者試験を受けようと思います。範囲がとても多いので、早めに勉強を始めようと思います。
開発中のAlexaスキルを実機テストする方法

#※2017/12/4 追記分
Amazon Echo などの Alexa 対応デバイスを使用してテストするには Amazon 開発者ポータルで登録した
開発者アカウントと同じメールアドレスを使用して端末をセットアップする必要があります。
この際、開発者アカウントが、amazon.com の方のアカウントに紐付いてしまっていると
Alexa アプリ(alexa.amazon.co.jp)に開発中のスキルが表示されず、結果的にテストできない状態のようです。
amazon.co.jp に紐付けができていれば、ベータテストを行わずとも自端末でのテストは問題なく実施できます。
こちらの記事を参照させていただきました。

**開発したAlexa Skillが日本語版に出てこない場合**
https://qiita.com/sparkgene/items/c15e81cd6a5a40f7189d

以降ではベータテストを使用したテスト方法についてご紹介しています。
AWS Lambda 関数および開発者ポータルでのスキル登録は事前に実施しておく必要があります。
追記おわり。

#以下初回投稿分
ついに我が家にもAmazon Echoが届きました！
そこで開発中の日本語スキルを起動してみようとしたところ、上手くいきませんでした。
結論としてはスキルのベータテストを利用すれば起動できました。


#あれ、実機でスキルが起動できない？
アレクサ、XXXXを開いて
「すみません、上手くいきませんでした。」
以前英語で動作確認していたときは、公開申請しなくても自分のアカウントでは
使用できていたのですが上手くいきません。

AlexaのWebサイトやアプリから自アカウントで有効になっているスキルを確認できるのですが、
.comの方では開発中のスキルが表示されます。
https://alexa.amazon.com/spa/index.html#skills/your-skills/?ref-suffix=ysa_gw


![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/62b43583-8dff-79ba-edef-2adc00f04d8e.png)

一方.co.jpの方では作成中のスキルが表示されません。
https://alexa.amazon.co.jp/spa/index.html#skills/your-skills/?ref-suffix=ysa_gw

どうやら日本語環境ではそのままでは実機でテストできないようです。

#スキルのベータテスト
ひと手間かかりますが、スキルのベータテストを有効化することで
実機での動作確認を行うことができます(90日間)

https://developer.amazon.com/ja/docs/custom-skills/skills-beta-testing-for-alexa-skills.html

ベータテストを有効化するには
公開情報、プライバシーとコンプライアンスを含むすべての設定を入力する必要があります。
入力する前の段階では、利用ができない状態になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/8384980a-9780-f70a-dad9-4754556604d2.png)

##公開情報
スキルを公開するために必要なカテゴリの設定、起動方法等の情報を入力します。
ベータテストを行うだけであれば、申請は必要ないので、仮で構いません。
必要項目を入力し、保存すると、チェックマークがつきます。

スキル用の画像は、小(108×108ピクセル)、大(512×512ピクセル)の2種類が必要になりますので
事前に用意しておきます。

##プライバシーとコンプライアンス
確認事項を入力し、保存するとスキルのベータテストを開始できるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/dab1a17f-b1da-6165-99ff-b55c32e4b2b8.png)

##ベータテストの開始
ベータテストに招待するAmazonアカウントのアドレスを入力します。(最大500)
ここでは自分のアカウントのみ追加し、テストを開始します。
管理者のメールアドレスやテスターは後から管理画面で追加できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/0652849f-009d-47d7-d736-b4c9c84aeceb.png)

ベータテストがアクティブになると、入力したアドレス宛に以下のようなメールか届くので
リンクからベータテストスキルを有効化します。日本だけリンクが分かれているので注意してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/f722bd66-a8ae-2dff-af28-f6458d98923a.png)

利用規約に同意すると利用可能になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/5518dffa-5c5c-2231-8260-fae36db69c16.png)

.co.jpの方でも開発中のスキルが表示されるようになります。
https://alexa.amazon.co.jp/spa/index.html#skills/your-skills/?ref-suffix=ysa_gw

参加直後はベータテストスキルは無効化されていますので、個別に有効化する必要があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/cdf633b9-994f-d5f8-e791-025a316fe732.png)


ひと手間かかりましたが、この状態でAlexaに話しかけると実機での動作確認を行うことができました。
参考になれば幸いです。
Riot.jsのタグオブジェクトを探す

ページ全体をRiotで作っている場合はあまり問題にならないかもしれませんが、「HTMLの中にRiotタグが散在している」かつ「Riotのマウントと別な箇所でタグを使った処理をしたい」というような状況下では、「あとからページにセットしたRiotタグのオブジェクトを取得したい」という場面が生じてきます。

これは、Riotのデータ構造をたどることで実現可能です。

# Riotのデータ構造

グローバルにある状況であればグローバルの`riot`、`const riot = require('riot');`としている場合はその`riot`を使えますが、`riot.util.vdom`に、ページへマウントしたタグオブジェクトが配列となって入っています。

そして、タグオブジェクト自体（で、今回のテーマに関係するもの）には、以下のプロパティがあります。

* `tag.root`…対応するDOMノード
* `tag.tags[子タグ名]`…このタグの中に存在する別のRiotタグ。1個ならタグオブジェクトがそのまま入っていて、複数なら配列となっている。

ということで、`riot.util.vdom`から`tags`を再帰的にたどれば目的のことをできそうです。

# 実際に書いてみた

```get_riot_tag.js

// WeakMapがある場合はキャッシュさせる

let cache = null;
if(window.WeakMap){
  cache = new WeakMap;
}


function getRiotTag(elem, current = riot.util.vdom) {
  if(typeof elem === 'string') {
    // セレクタで回せるように
    elem = document.querySelector(elem);
  }
  if(cache) {
    const cached = cache.get(elem);
    if(cached) return cached;
  }
  let ret = null;
  if(Array.isArray(current)) {
    // 最初のvdom、あるいはtagsが配列だった時
    current.some(item => {
      ret = getRiotTag(elem, item);
      return ret;
    });
  } else {
    // currentがタグの場合
    // キャッシュに入れる
    if(cache) cache.set(current.root, current);
    // 自分自身をチェック
    if(current.root === elem) return current;
    for(const key in current.tags) {
      ret = getRiotTag(elem, current.tags[key]);
      if(ret) return ret;
    }
  }
  return ret;
}
```

なお、「何度も走査するのを避ける」のと「DOMがなくなればキャッシュも確実に破棄させる」ために、`WeakMap`でキャッシュさせています。
PHPのarray_map, foreach, foreachで参照渡しを使う場合の比較

配列の各要素に処理を施す方法として、array_mapとforeachがあると思いますが、ふとしたきっかけでforeachで参照渡しを使う方法を知ったのでメモ。
array_mapよりforeachを使った方が高速らしい。

#array_map()

```php
$arr = array(1,2,3,4);

$arr_mapped = array_map(function($value){
    //ここでreturnした値が配列の各要素に格納される
    return $value * 2;
},$arr);

dd($arr_mapped);

//array:4 [
//  0 => 2
//  1 => 4
//  2 => 6
//  3 => 8
//]
```


#foreach

```php
$arr = array(1,2,3,4);
//参照ではないため、元の$arrの値は変わらない
//中で別変数を定義してそこに格納する
foreach($arr as $value){
   $arr_mapped[] = $value * 2;
}

dd($arr_mapped);

//array:4 [
//  0 => 2
//  1 => 4
//  2 => 6
//  3 => 8
//]

```

#foreach参照渡し

```php
$arr = array(1,2,3,4);
//$arrの各要素への参照に各要素の2倍を入れる形になる
//元の$arrの値が変わる
foreach($arr as &$value){
    $value = $value * 2;
}
//$valueへの参照が残っているためここで解除しておく
unset($value);

dd($arr);

//array:4 [
//  0 => 2
//  1 => 4
//  2 => 6
//  3 => 8
//]
```

個人的には参照渡しの場合は最後に`unset()`しないといけないので、`foreach`内で変数宣言するやり方が分かりやすくていいかなーと思いました。
でも新しい変数定義するってことはその分メモリ食うってことだから３番目のやり方の方が早いのかな。。
時間があれば計測してみようと思います。
PythonでMattermostに投稿

# やりたいこと

- SlackのCloneアプリ、MattermostからPythonで投稿したい
- Pythonでスクリプトを実行した結果を、matterpostの特定のChannelからポスト

# 準備する情報

- mattermostのURL：例）mattermost.hogehoge.com
- mattermostで投稿したいChannelのID
- 自分のログインID
- 自分のパスワード

# 手順

詳細はこちらを読んでください。

Python MattermostからAPIをたたいて投稿する方法
https://review-of-my-life.blogspot.jp/2017/11/python-mattermost-api-post.html
Unityで製作したゲームをWebGLで書き出しunityroomへ投稿する

#せっかく作ったなら見てほしい・プレイしてほしい
ですよね！

私はかなりの初心者だったので2時間ぐらいかけてなんとかunityroomさんに投稿できたので私のような人が少なからずいるんじゃないかなぁということで書いておこうと思います

#unityroomとは？

以下のサイトがunityroomとなります
【[unityroom](https://unityroom.com/)】
Unityで作ったゲームを無料で投稿できて、無料で遊ぶこともできるサイトとなっていて、【[1週間ゲームジャム](https://unityroom.com/unity1weeks)】などの企画も開催されています(^o^)
ゲームを製作しない方も無料で遊べるゲームをあそんでみてもいいかもしれません

#WebGL書き出し
UnityでwebGLで書き出すのはそれほど難しくありません
File>Build Settingを選びます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/5fefe384-9dff-dc97-1d6e-a3af40192cdc.png)

すると以下の画面が出てくるので、一番上に必要なシーンがはいっていることを確認しBuild And Runを選びます(テストプレイが必要ではないと感じるならBuildのみでも構いません)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/43e5b700-92e3-8bb1-e1c9-fbc6409ab169.png)

するとフォルダを選ぶ画面が出てくるのでそちらで保存したい場所を選んで"フォルダを選択"を選べばそこにBuildしてくれます
空のフォルダに作るほうが後々わかりやすいと思います

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/25d8c680-c519-6c6a-9c47-05cea0fbfd2a.png)

するとBuildが行われ，以下のようなファイルができます(Unity 2017 2.0f-3の場合)
htmlファイルを実行するとWebブラウザ上でプレイできるようになっています

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/11ebe573-d60d-2116-d3fc-9b8ff741776d.png)

##unityroomへの投稿
アカウント作成については詳しく申しませんが，アカウントを作って、新しいゲームを登録するを選びます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/70d44471-d925-bf1d-22ea-d3b213c58d64.png)

さまざまな設定項目がありますが，私がつまづいたのはWebGLアップロードですね

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/72773b89-b48a-9e54-be48-eae05281373f.png)

上記の画像のファイルを一つずつアップロードする必要がありますがどこにあるか私はわかりませんでした(；´∀｀)
以下のフォルダのBuildの中にあります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/5866cdde-7ad7-d8fa-6fcb-bdd5d2565a82.png)

このとき、Buildの中にあるものが上記の選択すべきファイルじゃない時がありますが，それは投稿用のUnityのバージョンと自分でつかっているUnityのバージョンが一致していないからです（私もやらかしました)

WebGL設定を開き以下のバージョンの部分でお使いのUnityのバージョンを選び更新すればファイルが見つかるはずです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103256/e1cb2cbd-270d-e10c-0cb6-27ac6d634201.png)

他の設定はそこまで難しくないので割愛します

せっかく作ったなら公開して遊んでもらってフィードバックをもらいたいと思った人が，ここで躓くのはもったいないとおもったのでかきました

およみくださってありがとうございました
MATLAB: repmat(inpx, [1 3]) > Numpy: np.tile(inpx, (1,3))

```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)
```

### MATLAB

https://jp.mathworks.com/help/matlab/ref/repmat.html?lang=en

```matlab
>> inpx = [ 3 1 4; 1 5 9;]

inpx =

     3     1     4
     1     5     9

>> repmat(inpx, [1 3])

ans =

     3     1     4     3     1     4     3     1     4
     1     5     9     1     5     9     1     5     9

>> 
```

上記はrepmat(inps, 1, 3)と同じ意味になる。

> B = repmat(A,r1,...,rN) specifies a list of scalars, r1,..,rN, that describes how copies of A are arranged in each dimension. 


関連
https://jp.mathworks.com/help/matlab/learn_matlab/array-indexing.html?lang=en

### Numpy

Numpyでどう実装するか。

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.repeat.html
というのはある。
試したが、思うようには処理できなかった。

[[Python]繰り返しパターンの行列を作る方法(repmat/tile)](https://qiita.com/supersaiakujin/items/e4085b410da0c16f09ed)
にて方法が掲載されている。

情報感謝です。

```test_repmat_171119.py
import numpy as np

inpx = [[3,1,4],[1,5,9]]
print(inpx)

print("---case1---")
wrkx = np.repeat(inpx, 3, axis=0)
print(wrkx)

print("---case2a---")
wrkx = np.repeat(inpx, [3,3,3], axis=1)
print(wrkx)

print("---case2b---")
wrkx = np.tile(inpx, (1,3))
print(wrkx)

```

```txt:run
$ python3 test_repmat_171119.py 
[[3, 1, 4], [1, 5, 9]]
---case1---
[[3 1 4]
 [3 1 4]
 [3 1 4]
 [1 5 9]
 [1 5 9]
 [1 5 9]]
---case2a---
[[3 3 3 1 1 1 4 4 4]
 [1 1 1 5 5 5 9 9 9]]
---case2b---
[[3 1 4 3 1 4 3 1 4]
 [1 5 9 1 5 9 1 5 9]]
```

np.tile()を使うことで、MATLABのrepmatと同じ結果が得られました。

numpy.matlib.repmatの方は"No module named numpy.matlab"となったため、環境構築が必要になりそうです（今回は使いません）。
MATLAB > rdivide > arrayと一変数での右除算 | arrayと列ベクトルでの右除算 | sum(A.^2, 2)

```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)
```

https://jp.mathworks.com/help/fixedpoint/ref/rdivide.html?lang=en

rdivide()を試してみた。

### arrayと一変数での右除算

```matlab
>> A = [ 1 2 3; 4 5 6;];
>> B = 2

B =

     2

>> rdivide(A,B)

ans =

    0.5000    1.0000    1.5000
    2.0000    2.5000    3.0000
```

### arrayと列ベクトルでの右除算

```matlab
>> A = [ 1 2 3; 4 5 6;];
>> B = sqrt(sum(A.^2, 2))

B =

    3.7417
    8.7750
>> rdivide(A,B)

ans =

    0.2673    0.5345    0.8018
    0.4558    0.5698    0.6838
```

sum()の処理にて列ベクトルが生成され、それを使った右除算をしている。
ブロックチェーンイーサリアムチュートリアル


# Dockerでgethをインストール

#### 1. コンテナを作成

```
docker run -it --name "eth" ethereum/client-go:v1.7.2
```

#### 2. 必要なパッケージをインストール

```
apk --update add vim git
```

#### 3. Defining the private genesis state (genesis.jsonファイルを下記のように作成)

```
$ cat /root/genesis.json

{
"nonce": "0x0000000000000000",
"timestamp": "0x00",
"difficulty": "0x10A",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00",
"alloc": {},
"gasLimit": "0x47E7C4",
"config": {
        "homesteadBlock": 0
      }
}

$ geth init /root/genesis.json
```

#### 4. イーサリアムnodeを作成し、起動する

```
$ mkdir -p /root/gethdata

$ geth --datadir /root/gethdata --networkid 10 --nodiscover --dev --nodiscover console

説明：
- datadir: ブロックチェーンとアカウント情報が保存される場所
- dev: デバッグ用のDeveloper mode
- nodiscover: 他のネットワークに繋げないようにする
```

##### 5. 対話型のコンソールでetherの操作を確認
参考：https://book.ethereum-jp.net/first_use/mining_ether.html

```
# アカウント作成
> personal.newAccount("hogehoge1")    ← hogehoge1はパスワードです。
"0xddf401a8396966c00dc55cd97fca979829e0107c"

> personal.newAccount("hogehoge2")
"0x7c8e10566e2581664de9183afa8cb3be83786ea0"

# アカウント一覧を確認
> eth.accounts
["0xddf401a8396966c00dc55cd97fca979829e0107c", "0x7c8e10566e2581664de9183afa8cb3be83786ea0"]

# etherbaseを確認　（etherbaseとは、各ノードで採掘を行う際にその報酬を紐づけるEOAのアドレスを示します）
> eth.coinbase
"0xddf401a8396966c00dc55cd97fca979829e0107c"

# etherbaseはデフォルトではプライマリーのアカウント（eth.accounts[0]コマンドを実行して表示されるアドレスのEOA）が設定されますが、下記のようにminer.setEtherbase(new_adress)コマンドで変更することも可能です。

> miner.setEtherbase(eth.accounts[1])
> eth.coinbase
'0x7c8e10566e2581664de9183afa8cb3be83786ea0'

# etherの採掘
> miner.start()
true

> miner.stop()
true

# 採掘状況の確認
> eth.blockNumber
145

# 報酬の確認
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
'515'

```
MATLAB > rdivide > right array divisionとは | Right-array division > rdivide(A,B) > Bによる除算 | 二つのAPIを用意する欠点と利点

```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)
```

https://jp.mathworks.com/help/fixedpoint/ref/rdivide.html?lang=en
> rdivide
> Right-array division (./)

「Right-array」とは何なのか?

https://jp.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.html?lang=en

上記リンクの「Matrix Operations」の直前のTableに説明がある。その説明を箇条書きで抜粋する。

- `./`
    - Right array division
    - `A./B` is the matrix with elements A(i,j)/B(i,j).
    - rdivide
- `.\` (円マークでなく、バックスラッシュ)
    - Left array division
    - `A.\B` is the matrix with elements B(i,j)/A(i,j).
        - 補足: (円マークでなく、バックスラッシュ)
    - ldivide

rdivide(A,B)とした時、Bのことを「Right-array」と定義しているのだろう。

### API

rdivide()とldivide()の２つのAPIを用意する利点と欠点が考えられる。

- 欠点
    - ２つのAPIにすることで、ユーザは「Right-Array」と「Left-Array」の定義を知らないといけない
- 利点
    - rdivide()のソースコードを簡単にldivide()に変更できる

引数を交換すれば良いだけにも思うが、欠点を補うほどの利点があるのだろうか。
新Python生活四日目(振返り)【PyQ/7章】※不明点あり

前回の不明点が残ったままですが、、
ここも少し内容量が増えてきて、自分的に若干メモリ不足気味･･･。
はじめの一歩段階なので頑張ります。

#with open : ファイルの読込み
```py3
with open('ファイル名(パス)', encoding='utf-8') as f: #ファイル名をutf-8(文字コード)で開いてfに代入するよ
    for row in f: #fを1行ずつ出力するよ
    print(row)
```
```text:出力結果
りんご, 100

ばなな, 200

みかん, 350
```

#rstrip : 行末の改行を削除
```py3
with open('ファイル名(パス)', encoding='utf-8') as f:
    for row in f:
    F1 = row.rstrip() #行末にある改行を削除するよ
    print(F1)
```
```text:出力結果
りんご, 100
ばなな, 200
みかん, 350
```

#split : 文字列の分割
```py3
with open('ファイル名(パス)', encoding='utf-8') as f:
    for row in f:
    F1 = row.rstrip().split(',') #1行ずつ出力したfをカンマごとで区切って表示
    print(F1)
```
```text:出力結果
['りんご', '100']
['ばなな', '200']
['みかん', '350']
```

#集計して表示
区切ったものを個別に代入

inputディレクトリ の L1.csvファイル に以下の様なデータが入っているとする。

```text:好きな飲み物
TARO,コーヒー
JIRO,カフェオレ
SABU,水
--以下略--
```
このデータを読み込んで集計するよ。

```py3
favorite = {} #favoriteって名前の空の辞書を作成

with open('input/L1.csv', encoding='utf-8') as f: #ファイルを開いてfって変数に代入するよ。
    for row in f: #データを代入されてるfを1行ごと表示するよ
        columns = row.rstrip().split(',') #一行ごとに出力したものをカンマで区切って変数columnsに代入
        name = columns[0] #カンマで区切った1つ目をnameって名前で指定する
        drink = columns[1] #区切った2つ目をdrinkって名前で指定する

        if drink in favorite: #辞書の中にドリンクがあれば
            favorite[drink] += 1 #そのドリンクに+1する
        else:
            favorite[drink] = 1 #なければそのままにする

for f_drink, count in favorite.items(): #辞書の中の全てからカウントしたものを変数に代入
    print(f_drink + ':' + str(count))
```

```text:出力結果
コーヒー:3
カフェオレ:2
水:1
--以下略--
```
**<font color="Red">★分からんポイント
①if文:elseの時に1って指定しているのがイマイチピンとこない。。
②最後のfor文:for ～ in ～って構文で覚えていたけど、今回のはカンマが入っている。
　あとinの後の辞書名の後のitems。コレは調べると「全てのキー:keys,値:valuesを～」って書いていたけど、これもイマイチピンとこない。。</font>**
JavaScript webpack+babel windows環境設定

# はじめに

webpack + babel 環境をwindowsで作りました。

元にしたのはこちらの記事です。

[webpack+babel環境でフロントエンドもES6開発 - Qiita](https://qiita.com/HayneRyo/items/74892d3a37ee96a5df60)
元記事では、mac環境だったようなので、少し変更することでwindows環境で動かせました。

# フォルダ構成 

これにしたがって、フォルダを作成して、ファイルを配置していきます。
ファイルは webpack.config.js の修正以外は、元記事の通りです。

```
  sample (フォルダ)
    source (フォルダ)
      es2015 (フォルダ)
        application.js
        person.js
    distribution (フォルダ)
      index.html
      javascript (フォルダ)
    package.json
    webpack.config.js
    node_modules (フォルダ)
```

# インストール
webpack + babel のインストール方法は元記事の通りで、次のコマンドを使います。
少しオプションを変えました。

```
 > npm init -y
 > npm install --save webpack babel-core babel-loader babel-preset-react babel-preset-es2015
```

webpack.config.js のloader部分に変更が必要なようでした。
パスを通してないからかもしれません。

```webpack.config.js
module.exports = {
  context: __dirname + '/source',
  entry: {
    'application': './es2015/application',
  },
  output: {
    path: __dirname + '/distribution/javascript',
    filename: '[name].js'
  },
  module: {
    loaders: [
      { 
        test: /\.js$/, 
        exclude: /node_modules/, 
        //loader: "babel", //エラーになる
        loader: "babel-loader",	//こちらはうまくいく
        query:{
          presets: ['react', 'es2015']
        }
      }
    ]
  }
};
```

webpack.config.js が loader: "babel"のままだと、次のエラーがでました。

```
> .\node_modules\.bin\webpack

Hash: xxxx
Version: webpack 3.8.1
Time: 35ms

ERROR in Entry module not found: Error: Can't resolve 'babel' in 'xxx/sample/source'
BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders.
                 You need to specify 'babel-loader' instead of 'babel',
                 see https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed
```


# ディレクトリ作成

sampleフォルダから、次のコマンドでフォルダが作れます。macとはオプション指定が違うみたいです。
コマンドじゃなくてGUIで作成しても問題ないです。

```cmd.exe
> mkdir source\es2015 distribution\javascript
```

# コンパイル(トランスパイル)を行う

macのような、`｀npm bin｀`/webpack は動かないので、次のようにします。

```cmd.exe
> .\node_modules\.bin\webpack
```

-----
MATLAB > ./ > rdivideを使うと良い > ソースリーディングの観点から | リンク: 省略表記 | ドキュメント和訳

```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)
```

https://jp.mathworks.com/help/fixedpoint/ref/rdivide.html

「"./" MATLAB」で[google検索しても](https://www.google.co.jp/search?q=%22.%2F%22+MATLAB&oq=%22.%2F%22+MATLAB&aqs=chrome..69i57j0l5.311j0j7&sourceid=chrome&ie=UTF-8)関係情報には辿り着けそうにない。
（運が良い人はたどりつけるかもというレベル）。

Mathworksではきちんと対応されている。
https://jp.mathworks.com/help/search.html?submitsearch=&qdoc=.%2F
https://jp.mathworks.com/help/search.html?submitsearch=&qdoc=%22.%2F%22

> 検索文字列 ./ の解析中にエラーが発生しました。
検索文字列は、少なくとも 1 つの文字または数値を含まなければなりません。
検索文字列を変更して再度実行してください。

一文字の変数名と同様、「記載は楽」だけど「検索は困難」な表記は、ソースリーディングでの時間を膨大にする。
(C#のNullableを簡易表記するコード例を見た時にも感じた)。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/nullable-types/
> 構文 `T?` は、`Nullable<T>` の省略表現です。

入門者を遠ざける理由にもなると思われる。

将来の検索のことを考えて、rdivide()を使おうと思う。

### リンク: 省略表記

その他の省略表記に出くわした場合は以下を参考にして、右側の関数を使うコードにするのが良いだろう。
https://jp.mathworks.com/help/matlab/matlab_prog/matlab-operators-and-special-characters.html

### ドキュメント和訳

ドキュメントの和訳は適切ではない。
https://jp.mathworks.com/help/fixedpoint/ref/rdivide.html
> c = rdivide(a,b) と c = a./b は、a の各要素を b の対応する要素で除算して配列の右除算を行います。

https://jp.mathworks.com/help/fixedpoint/ref/rdivide.html?lang=en
> c = rdivide(a,b) and c = a./b perform right-array division by dividing each element of a by the corresponding element of b. 

二回除算するようにも取れる訳として記載されているが、正しくは以下のようなものだろう。

「c = rdivide(a,b) と c = a./b は、a の各要素を b の対応する要素で除算することにより配列の右除算を行います。」

現在の公式の和訳だけ読むと処理の内容に関して「？」となる。
MindMup > bug | UI > PUBLISHが表示されない > ブラウザの横幅のサイズが小さい時に表示されない > たびたび遭遇する設計の不具合

https://www.mindmup.com/

マインドマップを公開する時に使う右上にある[PUBLISH]のボタンがある。

PUBLISHボタンが表示される時と表示されない時があり、使い勝手が悪かった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c2d2b28a-38cd-277d-74ff-d60c625a6dc7.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c3dd8c64-2efa-9754-af89-3e7fc45d7283.png)

ブラウザの横幅のサイズが小さい時に表示されない、ということがわかった。

### 備考

最近のサイトは横幅のサイズをあるサイズ以上でないときちんと見れないように設計されるものが多い。
1920の横幅を二分割にして表示した場合、その設計サイズ未満になることが度々あり、使い勝手が悪くなる。

UIを設計する設計者はそういう点を考慮しているのだろうか？

あるサイズ未満で動作しない設計である場合、小さいサイズで動作しようとした時に「XXXサイズでのみ正常動作します」のようなエラーメッセージを表示すると、ユーザの混乱は減ると思う。
spherepts > Delaunay > ScipyのDelaunayに置き換えても同じ結果になる (適用する問題によるのだろう)

```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)
```

### 概要

[Scipy > API > Delaunay試してみた > QhullオプションがMATLABとは異なる](https://qiita.com/7of9/items/a4e6da3fec68c6764903)

上記で気になっていたのがMATLABのdelaunay()とScipyのDelaunay()の結果の違い。
QhullのオプションをQzなしで実行しようとしても、扱っている問題がcosphericalなポイントセットであるため、QzなしではScipyでエラーがでる。
また、Qz以外の理由によっても両者に違いが出ていると推測される。

I have a hunch that...
Scipyの結果をMATLABに読込ませて最終結果に違いがあるか確認することにした。

### 処理手順

1. MATLABの処理において　delaunay(x)のxをファイル出力する
    - 出力ファイル: delaunay_input_171118.txt
2. Scipyでファイルを読込みDelaunay()の結果をファイル出力する
    - 出力ファイル: out_delaunay_171119.txt
3. MATLABの処理において、手順2のファイルを読込み、続きの処理を行う


手順１ではsave()を使う。手順３でload()を使う。

手順2のコードは下記。

```delaunay_save_171119.py
import numpy as np
from scipy.spatial import Delaunay

'''
v0.2 Nov. 19, 2017
  - add convert_to_matlab_index()
v0.1 Nov. 19, 2017
  - add delaunay_save()
'''


def convert_to_matlab_index(dln):
    return (dln + 1)


def delaunay_save(xyz):
    dln = Delaunay(xyz).simplices
    dln = convert_to_matlab(dln)
    np.savetxt('out_delaunay_171119.txt', dln, fmt='%.0f')
    return dln


if __name__ == '__main__':
    IN_FILE = 'delaunay_input_171118.txt'
    xyz = np.genfromtxt(IN_FILE, delimiter='  ')
    print("---xyz---")
    print(xyz)

    print("---dln---")
    dln = delaunay_save(xyz)

    print(dln)

```

### 実行

@ozwk さんに[教えていただいた](https://qiita.com/7of9/items/b3cad8affdcd386e1760)isequal()を使いました。

情報感謝です。

```matlab
>> [x0,tri0] = getIcosNodes(4,0);
>> [x1,tri1] = getIcosNodes_load(4,0);
>> isequal(x0,x1)

ans =

  logical

   1
```

同じになっている。
両者を図で目視しても違和感は感じない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ff702637-3886-58ad-11f8-6e80d783b80d.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cc4573b1-3569-24d4-ffa8-1005939df96a.png)

MATLABとScipyのDelaunay()の違いについては、僕が対象としている問題では最終結果に影響しないように思われる。

**他の問題によっては最終結果に影響するかもしれない**

### 補足資料

```delaunay_input_171118.txt
   0.0000000e+00   8.5065081e-01   5.2573111e-01
   0.0000000e+00  -8.5065081e-01   5.2573111e-01
   0.0000000e+00   8.5065081e-01  -5.2573111e-01
   0.0000000e+00  -8.5065081e-01  -5.2573111e-01
   5.2573111e-01   0.0000000e+00   8.5065081e-01
  -5.2573111e-01   0.0000000e+00   8.5065081e-01
   5.2573111e-01   0.0000000e+00  -8.5065081e-01
  -5.2573111e-01   0.0000000e+00  -8.5065081e-01
   8.5065081e-01   5.2573111e-01   0.0000000e+00
  -8.5065081e-01   5.2573111e-01   0.0000000e+00
   8.5065081e-01  -5.2573111e-01   0.0000000e+00
  -8.5065081e-01  -5.2573111e-01   0.0000000e+00
```

```out_delaunay_171119.txt
8 12 6 2
8 11 4 2
8 1 6 5
8 3 7 9
8 11 5 2
8 6 5 2
8 1 6 10
8 12 4 2
8 11 4 7
8 12 6 10
8 1 3 9
8 11 5 9
8 11 7 9
8 1 3 10
8 1 5 9
```
読書メモ：意味のわかる統計学（第1章）

　お疲れ様です、Fortranです。
　今回は読書メモというか、勉強メモになります。

#はじめに
##なぜ統計学？

　統計学を理解したいと思った理由は、下記が主となります。

- 統計モデルや機械学習等を使って、インフラ周りの色んな予測を立てているが、そのバックヤードについては理解しておらず、説明に窮する場面があるので、しっかり理解をしておきたい。
- 統計検定に興味が湧いてきたため、まずは2級の合格を目指したい。

##統計検定とは？

　http://www.toukei-kentei.jp/
　統計検定とは、日本統計学会が公式で認定している統計学に関する検定のことで、１級、準１級、２級、３級、４級があります。今回私がターゲットにしている２級は、大学１年・２年で習得するレベルに達しているか、を測る試験です。
　大学で統計学を勉強してこなかった私にとっては、まずは統計学って何だっけ？からスタートすることになります。

##目指したいレベル
- 部署内に「統計学とは」というタイトルで勉強会できるレベルになりたい
- 統計検定２級をまずは合格したい

#読書メモ
##第１章
###平均、分散、標準偏差
- 平均（mean）
 - 平均の求め方は次の式で記述される。
 - 変量とは、資料の各々の値のこと。
 - $X$をサンプルとすると、変数は$E(X)$で表現される。

```math
平均＝\frac{資料の変量の総和}{資料の個数}
```

- 分散(variance)
 - 偏差は、各々の変量に対して、$変量-平均$としたもの
 - $V(X)$と数式では表される。

```math
分散＝偏差の2乗の平均＝\frac{偏差の2乗の総和}{資料の個数}
```

- 標準偏差
 - 数式では$\sqrt{V(X)}$で表される。

```math
標準偏差=\sqrt{分散}
```

###平均値と分散の特性
- 全体の変量に対して$+a$とした時の平均$E(X+a)$と分散$V(X+a)$は次のようになる。
- 証明は省く。

```math
E(X+a)=E(X)+a , V(X+a)=V(X)
```

- また、全体の変量$X$に対して、$aX$とした場合の平均、分散は次のようになる。

```math
E(aX)=aE(X), V(aX)=a^{2}V(X)
```

###正規分布
- 平均$\mu$、標準偏差$\sigma$が与えられている資料があるとする。

```math
E(X)=\mu, V(X)=\sigma
```

- この$X$を標準化（平均$0$、標準偏差$1$になるよう変数変換する）すると、下記のようになる。
- 標準正規分布$N(0,1^{2})$という。

```math
E \biggl( \frac{X-\mu}{\sigma} \biggl)=0, V\biggl( \frac{X-\mu}{\sigma} \biggl)=1
```

- この正規分布の曲線は、下記の数式であらわされる。

```math
f(x)=\frac{1}{\sqrt{2\pi}}\exp \bigg( -\frac{x^{2}}{2}\bigg)
```

###推定
- 母集団：特性を調べたい思っているデータ
- 標本：母集団の特性を調べるためにランダムに抽出したもの
- 調査について
 - 全件調査：母集団すべてについて調査すること
 - 標本調査：母集団から取り出した標本について調査すること

- 点推定
 - 不偏推定量による推定・・・通常、分散は偏差の2乗の総和を資料の個数で割るところを、資料の個数-1で割る流儀
 - 最尤法による推定・・・変わらず
-区間推定

###検定
 - 部分から特徴の特性を判定する
 - 帰無仮説（$H_{0}$）と対立仮説($H_{1}$)
  - 帰無仮説：最初に立てた仮説 
  - 対立仮説：帰無仮説に対する反対の仮説
 - 検定の手順
  - ステップ①：帰無仮説$H_{0}$と対立仮説$H_{1}$を立てる。
  - ステップ②：帰無仮説$H_{0}$が正しいとして、標本の検定統計量$T$を計算する。
  - ステップ③：ステップ②でえられた値が、統計量Tが従う分布で棄却域にあるか否かを判定する。
  - 棄却域にあれば、帰無仮説$H_{0}$は棄却される。対立仮説$H_{1}$が採択される。
  - 棄却域になければ、帰無仮説$H_{0}$が採択される。

#おわりに
　本日はここまで。復習で色々追記することがあると思います。
　次回は、第2章について勉強していきたいと思います。
〆2017年まとめ → 2018年やること

#〆2017年まとめ
とりあえずやったことを箇条書きしまっす。

**1.Unity基礎勉強**
1月～4月でUnity5の教科書を完走した。
UnityとC#の基礎を学べた。
  
**2.ゲーム開発**
5月～ゲーム制作の開発を進める。
7月辺りから、本業が忙しくなり進捗が悪くなる。
同時にモチベーションの低下。
反省点は多い。

**3.自宅インフラの整備**
CISCOルータとSEIL導入。
ESXiマシンの構築。
ネットワークの見直し、検証セグメントと家庭セグメント分け実施。
CISCO Virlサーバの構築。

**4.仕事**
運用、構築がメイン。
SV構築に関しては前職の経験もあり、スムーズな業務を行えたと思う。
NW構築に関しては、とても勉強になった。
論理図を読むのが早くなった、IPS/IDS、WAF、FWの知見が高まった。
現場でのご作法などは資格の勉強では得られないと再認識した。

運用部分ではスクリプトが全てpythonで書かてれいる為(データ取得)、
まだまだ勉強が必要。
C#の勉強が為になっていて、多少は読めるようになっている。
Zabbixを触る機会が多く設定など沢山学べた。

まだまだ成長できると思う。

**全体を通して**
今年前半に関してはUnityの学習を通して、C#やプログラムの基礎的な部分を学べた事が大きな成果だった。
ゲーム開発に関しては、途中断念と反省点が多かった。

ゼロべ―スでの知識からのスタート、構想は大きく壮大な為、完全な実力不足感を感じた。また、本業が忙しいとは言ってるもの、謎のモチベーション低下が招いた失敗である事は自覚している。

業務ではネットワーク関連の業務も多く、新たに学べた事が多かった。

#〆2018年やること
とりあえず、来年やろうと思ってる事を箇条書きする。

**1.PyQ**
全コンテンツを完走する。

**2. Pythonデータ取得スクリプト**
WEBからのデータ取得をするスクリプトを作る。
とりあえずスクリプト程度が良いと思っている。

**2. 自宅ネットワーク**
NTTのセッション追加 2　→ 5
グローバルIPの取得 4予定
L3入れたい、高速ルーティング
PROXY導入する。

**3. V2V**
AWSで稼働しているZabbixを自宅ESXiに移行する。

**4. CCNP取る**
3科目全てとる。
新人がCCNA頑張ってるので見え張る。

**最後に**
2018年は業務に直結している勉強をすることで、常に勉強をする作戦。
なんだかんだで今やっている業務が好きなんど思う。
MATLAB > TriRep > Error: 入力の三角形分割は、有限の正の値を含まなければなりません。Inf、NaN、0、または、負の入力は許可されません。 > MATLABとScipyのインデックス始まりの違い (1と0)

```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)
```

MATLABの処理においてdelaunayの処理をScipyのDelaunay()の結果に置き換えてみた。
(Scipyの結果をファイル読込みする）。

```matlab
>> [x0,tri0]=getIcosNodes_load(4,0);

tri =

     3     2     7     1
     2     3     6     1
     4     3     6     2
     3    10     6     1
    11     7     2     5
     7     2     5     1
     8    12     6    10
     4    12     6     8
     4     8     6     3
     8    10     6     3
     5     2     6     1
     3    11     9     1
     3     7    11     1
     7     5    11     1
    11     5     9     1
     6    12     4     2
     3     4     7     2
     8     4     7     3
    11     4     2     7
     3     7     9    11


tri =

     7    11     5     1
     7    10     3     1
     7     0     5     4
     7     2     6     8
     7    10     4     1
     7     5     4     1
     7     0     5     9
     7    11     3     1
     7    10     3     6
     7    11     5     9
     7     0     2     8
     7    10     4     8
     7    10     6     8
     7     0     2     9
     7     0     4     8

エラー: TriRep
入力の三角形分割は、有限の正の値を含まなければなりません。Inf、NaN、0、または、負の入力は許可されません。
```

一つ目のtriがMATLABの結果。
二つ目のtriがScipyの結果。

Scipyの結果には０が入るためか、上記のエラーになる。

Scipy(あるいはPython)のインデックスは0始まり。

MATLABは下記を見ると1始まりなのだろう。
https://jp.mathworks.com/help/matlab/math/matrix-indexing.html
> 4 行目の 2 列目の要素にアクセスするには、次のように指定します。
>
A(4,2)
ans =
    14

Scipyの処理においてインデックスに１を足すことでエラーは出なくなった。
Ubuntu MATE 17.10でWindows版LabVIEW２０１７を起動しArduinoと接続する

LinuxからLabVIEWを使いたかったので、Wineを経由して起動し、Arduinoとの接続を確認した。

参考URL : 

https://forum.winehq.org/viewtopic.php?f=2&t=27320 (WineのUSB接続)
https://wiki.winehq.org/Wine_User%27s_Guide#Serial_and_Parallel_Ports (同上)
http://guruguru123.hatenablog.com/entry/2015/06/25/233238 (ArduinoとLabVIEWの接続）

導入手順 :

１．ソフトウエアのインストール

Ubuntu MATE 17.10にWineをインストールする。フォント導入のためwinetricksもインストールする。

`sudo apt install wine-development winetricks`

Wineにフォントをインストールする

`winetricks allfonts`

winecfgを起動し、WindowsのバージョンをWindows10に設定する。

![Screenshot at 2017-11-19 09-12-17.png](https://qiita-image-store.s3.amazonaws.com/0/200022/004cdfc8-3475-8ba5-4ee6-9d015122da0c.png)

ここでLabVIEW2017日本語版（32bit）をダウンロードし、ファイルをダブルクリックするとWine経由でLabVIEWのインストールが始まる。

http://www.ni.com/download/labview-development-system-2017/6682/en/

同様にWine経由でVISAドライバ（Windows版）、 JKI VI Package Manager (VIPM：Windows版)をインストールする。

http://www.ni.com/download/ni-visa-5.0.3/2251/ja/
https://vipm.jki.net/download


２．LabVIEWとArduinoの接続の設定

VIPMを起動し、Digilent LINXを選んでインストールする。

![Screenshot at 2017-11-19 15-51-37.png](https://qiita-image-store.s3.amazonaws.com/0/200022/403725f1-3a19-0295-c1a5-817c5e14b25a.png)

インストール後、LabVIEWを起動する（Ubuntuのアプリケーションメニュー→その他→LabVIEW2017(32ビット）で起動）とライセンスの入力を求められるので、ライセンスキーを入力する。
（ログイン画面に移ろうとするが失敗する）

LabVIEWのトップ画面が現れたら、Ardiuno（Ardiuno Unoを使用した）をPCにUSB接続する。

端末（Ubuntuのアプリケーションメニュー→システムツール→MATE端末）を起動する。
lsusbによりArduinoがUbuntuに認識されていることを確認する。

`lsusb`

また、usbポートがWineのcomポートに割当てられていることを確認する（下図参照）。

`ls -l ~/.wine/dosdrives`

![Screenshot at 2017-11-19 09-16-42.png](https://qiita-image-store.s3.amazonaws.com/0/200022/b04e5828-4996-a314-885d-2197ee1d0767.png)

この図では/dev/ttyUSB0がcomポート33番に割り当てられていることを示している。


３．LabVIEWからArduinoの制御をおこなう

LabVIEWのメニューからツール→MakerHub→LINX→Generate Firmware Librariesを選択し、ファームウエアを生成する。

![Screenshot at 2017-11-19 09-38-35.png](https://qiita-image-store.s3.amazonaws.com/0/200022/f82fed17-8534-7bff-9a0b-7086647d3d96.png)

ArduinoがPCと接続されていることを確認する。

LabVIEWのメニューからツール→MakerHub→LINX→LINX Firmware Widzardを選択し、Arduinoへファームウエアの転送をおこなう。

Wizardの手順に従い、Arduinoの機種名（Unoなど）、comポート番号（２．で調べたもの、図の場合はcom33)などを入力する。
最後にFinishのボタンをクリックするとArduinoにファームウエアが転送される。
（ArduinoのLEDが点滅することを確認すること）

ファームウエアが転送されると回路図と緑のボタンのついたフォームが表示される。
回路図のとおりにArduinoにLEDを接続するか、テスターであたるなどして、
フォームのボタンをクリックしたときArduinoの指定のピンでLEDが点灯（5Vが出力される）することを確認する。

![Screenshot at 2017-11-19 08-08-36.png](https://qiita-image-store.s3.amazonaws.com/0/200022/41bc1452-4807-616f-02c5-9f914afd3f52.png)


4.トラブルシューティング

.NETのインストールが失敗するときは、winetricksから.NETをインストールし、再度LabVIEWをインストールする。

`winetricks dotnet462`

ArduinoがLabVIEWから制御できないときは、Ubuntuでログインしているユーザーの所属グループを確認する。USB（シリアルポート）の制御のためには、ユーザーがsysかdialoutグループに所属していることが必要である。

また、USBttyがcomと繋がっていない場合はシンボリックリンクをはる。
（LabVIEWが起動していることを確認すること）

`ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com33`

Wine上のLabVIEWは動作が緩慢なので、処理が止まって見えたり、画面が真っ黒になってもしばらく待って様子を見ること。

VISAのインストールに失敗するときはwinecfgでWindowsのバージョンをWindowsXPにする。

.NETのインストールで、

”ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path.”

とエラーが出て失敗するときは、sambaとwinbindをインストールするとよい。
MATLAB > fileIO > load() > save()の結果と同じ書式でなくても読込むことができる

```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)
```

変数の値をファイルから読む時に使うload()。
https://jp.mathworks.com/help/matlab/ref/load.html

```test_data_171119.txt
1 1 1
2 2 2
3 3 3
```

```matlab
>> tri = load('test_data_171119.txt')

tri =

     1     1     1
     2     2     2
     3     3     3
```

[save()](https://jp.mathworks.com/help/matlab/ref/save.html)で出力されるファイルと同じ書式でなくとも読込めるようだ。


### 関連

[MATLAB > 変数の内容をファイルに保存する > save('pi.txt', 'X', '-ascii')](https://qiita.com/7of9/items/a3d9f4fd8375ae5de427)

[Numpy > fileIO > MATLAB saveコマンドによるasciiファイルを読込む > genfromtxt()使用](https://qiita.com/7of9/items/27de9582e19bb55c751b)
Scipy > Delaunay > cocircular > 定義 | cospherical

```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)
```

### データ

https://github.com/gradywright/spherepts
の[getIcosNode.m](https://github.com/gradywright/spherepts/blob/master/code/getIcosNodes.m)を用いて`[x0, tri0] = getIcosNodes(4,0)`とした時に、`tri = delaunay(x)`で使われるxが以下となる。

```delaunay_input_171118.txt
   0.0000000e+00   8.5065081e-01   5.2573111e-01
   0.0000000e+00  -8.5065081e-01   5.2573111e-01
   0.0000000e+00   8.5065081e-01  -5.2573111e-01
   0.0000000e+00  -8.5065081e-01  -5.2573111e-01
   5.2573111e-01   0.0000000e+00   8.5065081e-01
  -5.2573111e-01   0.0000000e+00   8.5065081e-01
   5.2573111e-01   0.0000000e+00  -8.5065081e-01
  -5.2573111e-01   0.0000000e+00  -8.5065081e-01
   8.5065081e-01   5.2573111e-01   0.0000000e+00
  -8.5065081e-01   5.2573111e-01   0.0000000e+00
   8.5065081e-01  -5.2573111e-01   0.0000000e+00
  -8.5065081e-01  -5.2573111e-01   0.0000000e+00

```

### code

上記のxの値をScipyで処理する。

```test_scipy_delaunay_171119.py
import numpy as np
from scipy.spatial import Delaunay


IN_FILE = 'delaunay_input_171118.txt'
xyz = np.genfromtxt(IN_FILE, delimiter='  ')
print("---xyz---")
print(xyz)

print("---dln---")
dln = Delaunay(xyz, qhull_options="Qt Qbb Qc")
#print(dln)

```

```txt:run
$ python3 test_scipy_delaunay_171119.py 
(中略)
Traceback (most recent call last):
  File "test_scipy_delaunay_171119.py", line 11, in <module>
    dln = Delaunay(xyz, qhull_options="Qt Qbb Qc")
  File "scipy/spatial/qhull.pyx", line 1882, in scipy.spatial.qhull.Delaunay.__init__ (scipy/spatial/qhull.c:18174)
  File "scipy/spatial/qhull.pyx", line 434, in scipy.spatial.qhull._Qhull.__init__ (scipy/spatial/qhull.c:5799)
scipy.spatial.qhull.QhullError: QH6019 qhull input error: can not scale last coordinate.  Input is cocircular
   or cospherical.   Use option 'Qz' to add a point at infinity.

While executing:  | qhull d Qt Qc Qbb
Options selected for Qhull 2015.2.r 2016/01/18:
  run-id 18630392  delaunay  Qtriangulate  Qcoplanar-keep  Qbbound-last
  _pre-merge  _zero-centrum  Qinterior-keep  Pgood
```

### 疑問

上記の「Input is cocircular　or cospherical.   Use option 'Qz' to add a point at infinity.」における「cocircular」とは何か。


http://www.iue.tuwien.ac.at/phd/fleischmann/node50.html#def:cocirc
> Definition 5.3 (cocircular point set)   Let $P$ be a finite set of points in three-dimensional space $R^{3}$. More than three coplanar points are said to be cocircular in $R^{3}$ if and only if they are located on the perimeter of a two-dimensional circle $s$ in $R^{3}$ where $s$ defines a disk which contains no other points in $P$.

三次元の点ではあるが、二次元の円の円周上にのみ配置されている時に「cocircular」と呼ばれると理解した。

同様に、三次元の球の球殻上にのみ配置された時に「cospherical」と呼ばれるのだろう。

現在のターゲットは球の積分を効率的に行うための球殻上の点を扱っている。cosphericalなのだろう。
MATLAB > Delaunay > T = delaunay(x, y, {'Qt','Qbb', 'Qc', 'Qz'}) > Error: DELAUNAY では、Qhull 固有のオプションはサポートされなくなったか、不要になりました。

```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)
```

### 参考

http://matlab.izmiran.ru/help/techdoc/ref/delaunay.html

上記のExample 3をMATLAB R2017bで試そうとした。

```matlab
>> x = [-0.5 -0.5 0.5 0.5];
>> y = [-0.5 0.5 0.5 -0.5];
>> T = delaunay(x, y, {'Qt','Qbb', 'Qc', 'Qz'})
エラー: delaunay
DELAUNAY では、Qhull 固有のオプションはサポートされなくなったか、不要になりました。
 DELAUNAY を呼び出すときにこれらのオプションを削除してください。
```

https://jp.mathworks.com/help/matlab/ref/delaunay.html
には確かにオプションがない。

どのバージョンからなくなったかは不明。