OmniAICreator/Qiita-1.07M huggingface dataset:
Jupyter Notebook でプログレスバーを出す

大量のデータの処理をしていると、作業がどのくらい進んだのかわからなくて辛いことがよくあります。そんな時の tqdm!

# tqdm 何ができるの？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/5bd71a8a-b238-07c4-4b09-108a70e7a6e8.png)

イテレーションのコードにすこし加えるだけで、プログレスバーを出せます。

# 使いたい！
## 準備
jupyter を実行するサーバーで以下のコマンドを打ってください。
tqdm のインストールと、 js の widget を有効化するぽいことをやります。

```zsh
pip install tqdm
jupyter nbextension enable --py --sys-prefix widgetsnbextension
```

## コード
for に与えるリスト的な場所に `tqdm()` をかぶせるだけです。

```py3
from tqdm import tqdm_notebook as tqdm

for i in tqdm(range(100000000)):
    i * i - i
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/bba68305-1690-e464-9d0b-f0cf91472ca1.png)

import で tqdm_notebook とかやることで jupyter 上で使えるようになります。
tqdm は元々コマンドラインでプログレスバーを出すやつですが。
OnScrollListener#onScrolled()のコールバックでエラーになる

## はじめに
RecyclerViewを使って何らかのデータをリスト表示する時にリストの最後尾を表示したタイミングで新しくデータをロードしたいことがあります。そういった場合RecyclerViewにOnScrollListenerをセットしてコールバック処理を実装します。このコールバック処理内で `RecyclerView.Adapter#notifyDataSetChanged` をすると次のような警告がでます。

```logcat
Cannot call this method in a scroll callback. Scroll callbacks mightbe run during a measure & layout pass where you cannot change theRecyclerView data. Any method call that might change the structureof the RecyclerView or the adapter contents should be postponed tothe next frame.
java.lang.IllegalStateException: 
    at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2625)
    at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:4974)
    at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11423)
    at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:6680)
...
```

## 警告がでる例
レイアウトは次のようなイメージ。

```xml:activity_main.xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</LinearLayout>
```

実装は次のようなイメージ。

```java:MainActivity.java
private SomeAdapter adapter;

public void initializeRecyclerView() {
	RecyclerView recyclerView = getActivity().findViewById(R.id.recyclerView);
	recyclerView.setLayoutManager(new LinearLayoutManager());
	recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
	    @Override
	    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
	        super.onScrolled(recyclerView, dx, dy);
	        // loading...
	        adapter.notifyDataSetChanged();
	    }
	});
}
```

## 対策
コールバック部分を抜粋する。コールバック内で直接 `notifyDataSetChanged` をするのではなく一旦postすることで回避できます。

```java:MainActivity.java
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);
    // loading...
    recyclerView.post(new Runnable() {
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
        }
    });
}
```

## 参考
- [Cannot call this method in a scroll callback. · Issue #27 · captain-miao/RecyclerViewUtils](https://github.com/captain-miao/RecyclerViewUtils/issues/27)
a needle in a haystack（引数どっちだっけ？）

PHPの[strpos関数](http://php.net/manual/ja/function.strpos.php)などで、

```php
strpos($haystack, $needle)
```
あれ、この引数どっちがどっちだっけ…？と時々なるので、単語の意味をググりました。

> needle = 針
> haystack = 干し草

ふむ。
これは元々イディオムから来ているようで、

”**a needle in a haystack**”
=「**干し草の中の一本の針**」
⇒ "look for ～"で「望みのない捜し物をする、むだ骨を折る」というニュアンスになるようです。

なるほど～。
語彙力が問われる命名ですねぇ。
でもこれで覚えた！

（参考）
[A NEEDLE IN A HAYSTACKは何て意味？【イディオムを覚えよう】](http://www.icacaonline.org/a-needle-in-a-haystack-5784)
[strstr 関数の haystack と needle](http://dev.ariel-networks.com/Members/matsuyama/haystack-and-needle/)
Ubuntu 16.04 で Flask アプリケーションを動かすまでにやることまとめ

Ubuntu 16.04 で Systemd + Nginx + uWSGI + Flask が動くようにやっていく。

**[2018/04 追記]** Ubuntu 18.04 と Flask 1.0 がリリースされたので動かしてみたところ、同じやり方で普通に動かせた。

## Setup
とりあえずやるやつ。

```
# apt update
# apt upgrade
```

## Python 3 + pip を入れる
Ubuntu 16.04 だと Python 3.5 は既に入っているが、pip が入っていないので入れる。

``` console
# apt install python3-pip
```

Flask を使うので入れておく。

```
# pip3 install flask
```

## アプリケーションを設置
場所はどこでも良いけど今回は `~/app` に置くことにする。

アプリケーションの本体はこんな感じ。

``` python:~/app/hello.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
```

これだけでも `$ python3 hello.py` でサーバを起動できるはず。

## uWSGI
`apt` でも入れれるけど、要らん init スクリプトが入ったりちょっとバージョンが古かったりするので `pip` で入れたほうが良い。

``` console
# pip3 install uwsgi
```


``` ~/app/uwsgi.ini
[uwsgi]
socket = /tmp/uwsgi.sock
chmod-socket = 666
chdir = %d
module = hello:app
master = 1
processes = 4
```

HTTP ではなく Unix ドメインソケットを作るようにしている。
Nginx から触れる用に `chmod-socket = 666` も設定する。

`%d` は「この設定ファイルがあるディレクトリパス」を表す特殊な変数[^magic_var]で、これにより Systemd から起動したときでも「設定ファイルのあるディレクトリに移動 (chdir) して、モジュール `hello` から `app` を読み込んで起動する」という設定になる。
uWSGI の設定ファイル内にアプリケーションのディレクトリパスを記述する必要がなくなるので便利。

[^magic_var]: [Configuring uWSGI — uWSGI 2.0 documentation](http://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#magic-variables)

`processes = 4` を指定して 4 プロセス起動するようにしているが、このあたりは CPU のコア数などに応じて変える。

## Systemd
続いては Systemd で uWSGI プロセスを管理できるようにする。

[uWSGI 公式の Systemd 対応ドキュメント](http://uwsgi-docs.readthedocs.io/en/latest/Systemd.html)はなぜか Emperor を使う設定しか書いてないけど、単一アプリを動かすだけなら別に Emperor を使わなくてもいい。

``` ini:/etc/systemd/system/uwsgi.service
[Unit]
Description = uwsgi

[Service]
Restart = always
ExecStart = /usr/local/bin/uwsgi --ini=/home/ubuntu/app/uwsgi.ini
ExecReload = /bin/kill -s HUP ${MAINPID}
KillSignal = QUIT

[Install]
WantedBy = multi-user.target
```

- uWSGI は SIGTERM を送ると reload するので、サービスを止めるときは SIGQUIT を送るように明示的に設定しておく必要がある
- `ExecReload` で SIGHUP を送るようにしておくと Graceful Restart できるので便利

詳しくは： [Managing the uWSGI server — uWSGI 2.0 documentation](http://uwsgi-docs.readthedocs.io/en/latest/Management.html#signals-for-controlling-uwsgi)

uWSGI の自動起動設定をする。

``` console
# systemctl enable uwsgi
```

## Nginx
Nginx で HTTP リクエストを受け取って uWSGI プロセスに流すように設定する。

``` console
# apt install nginx
```

デフォルトの設定は削除して、以下の設定ファイルを追加する。

``` console
# rm /etc/nginx/sites-enabled/default
```

``` nginx:/etc/nginx/conf.d/hello.conf
server {
  listen 80 default_server;
  server_name _;

  location / {
    include uwsgi_params;
    uwsgi_pass unix:///tmp/uwsgi.sock;
  }
}
```

既に `ngx_http_uwsgi_module` というモジュールが入っていて、`uwsgi_pass` というディレクティブで Unix ドメインソケットに流すことができる。

Nginx の自動起動設定をしておく。

``` console
# systemctl enable nginx
```

## サービス起動
```
# systemctl start uwsgi
# systemctl start nginx
```

ブラウザからサーバにアクセスすれば `Hello World!` と表示されるはず。
C++ Builder XE4, 10.2 Tokyo > ModalResult > Close時はmrCancel

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

Form1からForm2をShowModal()で開いている場合を考える。
Form2を閉じた時の戻り値はModalResultの値になると認識している。

Form2でClose()した場合にModalResultの値はどうなるか疑問に思った。

### 関連

[モーダルなフォームのOnShowイベントでそのフォームを閉じる](http://owlsperspective.blogspot.jp/2011/02/close-modalform-in-onshow-event.html) by Owl's perspectiveさん

情報感謝です。

### Close()した時のModalResult値

上記リンク先ではDelphi2007のForms.pasにて`ModalResult`への代入例がある。

XE4の場合は、`Vcl.Forms.pas`が該当しそう。

TCustomForm.Closeにおいて以下の実装が見つかった。

```delphi:Vcl.Forms.pas
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    ...
    end;
end;
```

実際にClose()で閉じた場合はmrCancelになることを確認した。

フォームを開いた時にModalResultの値をmrNoneにする例などを見たことがあるが、Close()をした場合には上記の例ではmrCancelになる。
10月3週のGoogle Watch

# 今週のGoogle速報です。

<img width="994" alt="adobestock.png" src="https://qiita-image-store.s3.amazonaws.com/0/204517/fddbed6a-eeb7-906c-9f26-0d659d03c419.png">

(Adobe Stock)

今週は興奮するようなニュースが多かった・・・。

## マシン
96 vCPU + 624G Memory
https://cloudplatform.googleblog.com/2017/10/new-compute-engine-machine-types.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+ClPlBl+(Cloud+Platform+Blog)
すごい!これを自分で用意したら大変そうだ。
ただ、使い道を教えて!

## 開発
Managed SSLサービスを提供
https://cloudplatform-jp.googleblog.com/2017/10/introducing-managed-SSL-for-Google-App-Engine.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+GoogleCloudPlatformJapanBlog+(Google+Cloud+Platform+Japan+Blog)
今まで何度SSL証明書をケチったサービスを見てきたことか・・・
これで楽になり、そういうサービスが減るといいですね。
GCPなら追加料金なしって書いてある!!!

Googleのエンジニアに初めて作ったプログラムを聞いてみた
https://docs.google.com/spreadsheets/d/11LdzbIlhm5oRm5qFnFexVIiy_HVzT7icmMyfgdNLF2E/edit?ts=59b6dd98#gid=0
BASIC多いですね。プログラムの30%がGOTO文。熱い!

## オープンソース Protobuf / Golang / Kubernetes
今週なし

## 機械学習
Faster GPU
https://cloudplatform.googleblog.com/2017/09/introducing-faster-GPUs-for-Google-Compute-Engine.html
GCPのGPUが速くなりました。NVIDIA Tesla P100 and K80が使えます。

# 論文引用
Resilient Multicloud MapReduce
http://ieeexplore.ieee.org/abstract/document/8065997/?reload=true
MapReduceを安定化する方法の研究。
MapReduce書かなくなって久しいけど、今更こんな研究の分野があるのか・・・。

## イベント

第2回 Google Cloud INSIDE Games & Apps 
開催は 2017 年 11 月 22 日!!

[参考]第1回 メルカリ & アイドルマスター (Go言語の活用事例)
https://goo.gl/pPkj3H

[要約]RDBのスケールインが大変だという課題があった。
AppEngine(Datastore)を使うようになって、スケールインが楽になった。

ただし、RDB風味にラッピングされてるだけなので、データ設計が変わってくる。
チャットなど、複数ユーザーを同時に扱うのはむずいとのこと。
【sql】重複レコードの1部分に対する優先順位をつけて、一番高いレコードを取得する

#やりたかったこと
- sqlコマンドだけで、重複レコードの1部分に対する優先順位をつけて、一番高いレコードを取得する

##ハマったポイント
- 優先順位をつけるロジック
- 重複しているグループの中で優先順位をつけて、一番高いレコードだけを取得する

##状況
- idがレコード内の都道府県の数だけ重複してしまっていた
- こちらで定めた優先順位で、一番優先順位が高い1レコードを取得しないければならない

##考え方

###■優先順位をつけるロジック
- 単純に、各都道府県に対して優先順位番号を1,2,3...とつけていく

###■こちらで定めた優先順位で、一番優先順位が高い1レコードを取得しないければならない
- 取得時、最小の優先順位番号を持つレコードを取得


##やったこと
1.優先順位番号カラムを追加し、地道に優先順位を打ち込み
2. sql文の最後に、以下を入力

```ruby:qiita.rb
group by id having MIN(priorityNumber)
```

##学んだこと
```ruby:qiita.rb
group by id
```
はただの集計関数だと思ってたけど、勝手にグルーピングしてその中のレコード(上で言う重複したidのレコード達)たちに対しての処理もしてくれるっていうこと
VulsRepoのここが変わった！

この資料は、[Vuls祭り#3(2017/10/19)](https://vuls-jp.connpass.com/event/67996/)で発表した資料です。

---
# Who？

Ushida Takayuki　@usiusi360

- VulsRepo作者

- SoftwareDesign執筆
    - 第2章：Vuls導入チュートリアル
    - 第3章：Vulsとさまざまなプロダクトとの外部連携
        - <img src="https://qiita-image-store.s3.amazonaws.com/0/54952/17d1b7ff-0b79-2c2a-6594-e26b409b5aa1.jpeg" width=20%>
        - 質問等あったら随時どーぞ！！

---
# VulsRepoとは？
- **Vulsでスキャンした結果ファイル（JSON）を元に可視化するWebビューア**

## 出来ること
- ピボットテーブル的にグリグリ項目を入れ替えて分析できる
<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/83e6715d-fed2-9ec5-fb9b-989953d02cdf.png" width=80%>

- グラフで可視化
<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/ab42aade-0718-00bb-2e52-f2df155e947b.png" width=80%>

- 脆弱性（CVE-ID）の詳細を一覧化
<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/de616434-4a6c-1042-53b1-9efebc8ea608.png" width=80%>

- changelogもWebUIから閲覧可
<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/7682a9a7-c87f-8a79-ac84-4179e99c0205.png" width=80%>

---
# Vuls v0.4.0の公開に合わせてVulsRepoもバージョンアップしました。その変更点をまとめます。

---
# 変更点①　インストールが簡単に！
- Apache等のWebサーバが不要に
- 実行ファイルをダウンロードしてバイナリを実行するだけ！
- **たったの３ステップ**

---
# 変更点②　NVD、JVNのタブを廃止して一画面に集約
- NVD、JVN、Vuls v0.4.0で追加されたRedHatなどの「OVAL」のデータを一つの画面で比較できる。
- 一つの画面で比較することで、NVD、JVN、とRedHatとのスコアの差が明確に！
<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/ebbccca9-4818-a229-5039-4b165edc376e.png" width=70%>

---
# 変更点③　CVSS基本値をレーダーチャート表示に
- JVNの表示　⇒ぱっと見じゃ分かりずらい
    - <img src="https://qiita-image-store.s3.amazonaws.com/0/54952/84335191-545a-977f-bf7b-4ef2b14c64a7.png" width=40%>
- NVDの表示　⇒そうとう訓練されていないと難しい
        - <img src="https://qiita-image-store.s3.amazonaws.com/0/54952/769ee781-b1b0-9156-fa0c-17ea1cd7e491.png" width=40%>

- VulsRepo　⇒深刻度の大小が一目でわかる！
        - <img src="https://qiita-image-store.s3.amazonaws.com/0/54952/24aa1f5c-21aa-5d25-afd9-712a77673a63.png" width=40%>

---
# 変更点④　RedHat（CVSSv3）の表示
<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/6236d5a3-a977-b865-94eb-2edfa7481531.png" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/8b47b6ce-961b-e5da-f675-5204cd765cb9.png" width=40%>

---
# 変更点⑤　RebootRequiredの表示
- インストールされているカーネルバージョンと動作中のカーネルバージョンが異なる場合に表示
- 一覧にすると凄く目立つ！！　リブート忘れのサーバのチェックに！
<img src="https://qiita-image-store.s3.amazonaws.com/0/54952/aab35448-c58b-a8c9-3c23-996836a2f7a5.png" width=80%>

---
# 変更点⑥　NewPackageVer、NotFixYetの表示
- NewPackageVer
    - リポジトリ上の最新パッケージバージョン
- NotFixYet
    - 脆弱性修正済みのパッケージが存在しないもの
    - VulsRepoのピボット機能で簡単にフィルタ・集計が可能

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54952/720ec211-b980-d07a-ae90-2d25e58cafb4.png)

---
# その他
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54952/522c0a13-b7ac-4130-5e02-0a20315dcf34.png)

- 外人に目が潰れるとディスられた
- 外国語の先生にも「目に優しくない」と言われた・・・

- ⇒原色系の色を抑えました・・・

---

# 要望等はSlackのvulsjpでもお気軽にどうぞ
Terminal から Slack にメッセージを投げる


よくビルド中に携帯で暇つぶしをするので、ビルドが終わったら携帯の Slack に通知をしてほしい。そんな事をするメモ。

[Incoming Webhooks](https://api.slack.com/incoming-webhooks) というのを使えば出来るらしい。

* https://my.slack.com/services/new/incoming-webhook/ のページでどのチャンネルにポストするか選択する。とりあえず自分にメッセージを送る。
* Webhook URL というのが出てくるのでそれを使ってメッセージを送る。
    例: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

たとえ例の Webhook URL の場合。

    curl -X POST -H 'Content-type: application/json' --data '{"text":"Done!"}'  https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

で良いはず。やってみたら Slack に投稿されるのだが、iOS の通知機能は動かなかった。なぜか分かったら追記します。

## 参考

* [Slack notifications via curl](http://blog.pragbits.com/it/2015/02/09/slack-notifications-via-curl/)
* [Building Slack apps](https://api.slack.com/slack-apps): 一般的な Slack アプリの作り方説明
Kinect for Windows v2 on VisualStudio 2017 Community：C++で動くOpenCV環境でKinect v2 のプログラミング~初めてのプロジェクト作成のセットアップ~ 

C++で動くOpenCV環境でKinect for Windows v2 を VisualStudio 2017 Community で動かしたので、その初めてのプロジェクト作成方法を載せておきます。

#手順
まずVisualStudio 2017 を開き、プロジェクトを新規作成します。


![vs2017kinect01.png](https://qiita-image-store.s3.amazonaws.com/0/207074/399cb602-0ea9-ea13-e1a3-780ef87bd82d.png)

その際に、「Windows デスクトップウィザード」を選択します。
プロジェクト名や保存先などを入力し終えたら、「OK」をクリックします。


![vs2017kinect02.png](https://qiita-image-store.s3.amazonaws.com/0/207074/93d2f0ae-c5a2-9c7a-2d31-2b78b7e69978.png)

すると、このような画面がでてくるので、追加のオプションの「空のプロジェクト」にチェックを入れ、「OK」をクリックし、プロジェクトを作成します。


![vs2017kinect03.png](https://qiita-image-store.s3.amazonaws.com/0/207074/0df67cec-6085-a5ef-61f2-9615876c5a04.png)

VisualStudio のウィンドウ上部のメニューバーに、コンパイルオプションを指定するウィンドウがありますので構成を「x64」に変更します。


![vs2017kinect05.png](https://qiita-image-store.s3.amazonaws.com/0/207074/2adf97b6-6ccc-db2e-c29d-0ad165c9686b.png)

プロパティマネージャーを選択し、(作成したプロジェクト名) ↳ Debug|x64 ↳ Microsoft.Cpp.x64.user をクリックします。


![vs2017kinect06.png](https://qiita-image-store.s3.amazonaws.com/0/207074/6431a8c7-d92f-8648-e034-bb70c6f9ced5.png)

共通プロパティ ↳ C/C++ ↳ 全般 の「追加のインクルードディレクトリ」を編集します。


![vs2017kinect07.png](https://qiita-image-store.s3.amazonaws.com/0/207074/398f6233-a14d-e4ad-d236-6d7dbe2422ee.png)

この部分に、
"C\ProgramFiles\Microsoft SDKs\Kinect\v2.0_1409\inc"
"C\opencv\build\install\include"
の絶対パスを入力し、「OK」をクリックします。

同様に、共通プロパティ ↳ リンカー ↳ 全般 の「追加のライブラリディレクトリ」を編集します。

![vs2017kinect09.png](https://qiita-image-store.s3.amazonaws.com/0/207074/a70c0ca3-4a6b-1d3b-c741-6f9023766ed4.png)

この部分に、
"C\opencv\build\x64\vc14\lib"
"C\ProgramFiles\Microsoft SDKs\Kinect\v2.0_1409￥Lib\x64"
”C\opencv\build\install\x64\vc15\lib”
の絶対パスを入力し、「OK」をクリックします。

同様に、共通プロパティ ↳ リンカー ↳ 入力 の「追加の依存ファイル」を編集します。

![vs2017kinect11.png](https://qiita-image-store.s3.amazonaws.com/0/207074/04bc73cf-dca5-5ef1-5288-f015aa75905b.png)

この部分に、
"opencv_world330d.lib"
"Kinect20.lib"
を追加し、「OK」をクリックします。

プロパティページの設定が完了したら、「適用」をクリックし、「OK」をクリックすることで反映され、このウィンドウが閉じられます。


次に、プログラムを書くソースファイルを作ります。

![vs2017kinect12.png](https://qiita-image-store.s3.amazonaws.com/0/207074/8b0d1eaf-3cb6-875b-fac0-a7089e887287.png)

ソリューションエクスプローラのタブを選択し、(作成したプロジェクト名) ↳ ソースファイル 上で右クリックをし、「追加」↳「新しい項目」をクリックします。


![vs2017kinect13.png](https://qiita-image-store.s3.amazonaws.com/0/207074/c7f3ee47-dcfb-e085-3f0a-99860e9941fc.png)

「C++ファイル」を選択し、名前を例えばMain.cppなどのように変更したら、「追加」ボタンをクリックしすることで、C++で動くOpenCV環境でKinect v2 のプログラミングができます。
Angular material のバージョンアップで出会ったいくつかのエラーと解決方法

Angular cli をつかって、Angular material と組み合わせてアプリを作ったが、私の環境で動いてたもの (Mac) が他の人の環境 (PC) で全く動かなかったので、何をしたかをメモしておく。

# Cannot read property 'length' of undefined

`npm install` 後、 `ng serve` で発生。

```
ng serve
Cannot read property 'length' of undefined
```

これから全く想像がつかないが、`src/enviornments/environment.ts` に問題がある。無いばあいは、ちゃんと作らないとこのエラーが出る。

* [ERROR in Cannot read property 'length' of undefined #5053](https://github.com/angular/angular-cli/issues/5053)


# @angular/material/material"' has no exported member 'MdButtonModule'.

こちらは、angular material がアップデートされて、`MdXXXX` 系が使えなくなったため、`MatXXX` に切り替える必要があった。ts ファイルと、html の修正の必要性ありだが基本的に置換で可能。

* [Build Error: `@angular/material/material"' has no exported member` #7692](https://github.com/angular/material2/issues/7692)

```ts
import {
  MdMenuModule,
  MdToolbarModule,
  MdIconModule,
  MdTabsModule,
  :
```
を

```ts
import {
  MatMenuModule,
  MatToolbarModule,
  MatIconModule,
  MatTabsModule,
```
に変える。これだけではなくて、html　も

```html
<md-grid-list cols="2" rowHeight="1:1">
    <md-grid-tile>
            <md-card class="example-card">
                    <md-card-header>
                      <div mat-card-avatar class="example-header-image"></div>
                      <md-card-title>{{car.name}}</md-card-title>
                      <md-card-subtitle>{{car.company}}</md-card-subtitle>
                    </md-card-header>
```

```html
<mat-grid-list cols="2" rowHeight="1:1">
    <mat-grid-tile>
            <mat-card class="example-card">
                    <mat-card-header>
                      <div mat-card-avatar class="example-header-image"></div>
                      <mat-card-title>{{car.name}}</mat-card-title>
                      <mat-card-subtitle>{{car.company}}</mat-card-subtitle>
                    </mat-card-header>
```

基本的に `md-` を `mat-` の一括置換でオッケー。これの置換を逃れたものとして

```html
<textarea mdInput
```

などを

```html

<textarea matInput
```

にする必要があった。

# GET http://localhost:4200/sockjs-node/info?t=1508392326937 net::ERR_CONNECTION_REFUSED

![error.png](https://qiita-image-store.s3.amazonaws.com/0/3470/4464c022-fa6a-3c0b-6034-c8678e6676da.png)


これは、Angular CLI （というか、webpack)のバグっぽい。修正できないが回避策はある。`ng serve` してブラウザで開くときに、`localhost` ではなく、`127.0.0.1` を使う。この回避策は、問題が起きたときのみで良いみたい。

* [sockjs-node ERR_CONNECTION_REFUSED when accessing from network #416](https://github.com/webpack/webpack-dev-server/issues/416)

# おわりに

そんなわけで、ちょっとバージョンアップしたらいろいろ修正の必要があったが、なんとかちゃんと動くようになった。
[Ansible]追加Diskマウント

## 使用したモジュール
- filesystem
 - http://docs.ansible.com/ansible/latest/filesystem_module.html
- file
 - http://docs.ansible.com/ansible/latest/file_module.html
- mount
 - http://docs.ansible.com/ansible/latest/mount_module.html

## RHEL 7 の場合

```yaml
- name: make file system (xfs)
  filesystem: fstype=xfs dev={{ devicename }}

- name: make mount point
  file: path={{ mountpoint }} state=directory

- name: mount disk
  mount: src={{ devicename }} fstype=xfs path={{ mountpoint }} opts=defaults state=mounted
```

## Amazon Linux の場合

```yaml
- name: make file system (ext4)
  filesystem: fstype=ext4 dev={{ devicename }}

- name: make mount point
  file: path={{ mountpoint }} state=directory

- name: mount disk
  mount: src={{ devicename }} fstype=ext4 path={{ mountpoint }} opts=defaults state=mounted
```
python3でslackbotの作成(その2:python実行編)

#前回
[その1:slack準備編](https://qiita.com/thimi0412/items/0473e0cce51dff42ab6e)
前回はslackのbotの登録からチェンネルの招待までを行いました。
今回はpythonのコードを書いて行きます。

#ライブラリのインストール
pythonにはslackのbotのライブラリがあるので以下のコマンドでインストールしましょう。

```
sudo pip3 install slackbot
```

#ディレクトリの構成とプログラム
ディレクトリの構成は以下の通り
slack_bot/
　├ run.py
　└ slackbot_settings.py

```python3:run.py
# -*- coding:utf-8 -*-
from slackbot.bot import Bot
def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    print('slack start')
    main()
```
```python3:slackbot_settings.py
# -*- coding:utf-8 -*-
API_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

default_reply = 'ナニイッテルカワワケワカラン'
```
API_TOKENには[前回]((https://qiita.com/thimi0412/items/0473e0cce51dff42ab6e))取得したAPI TOKENを記述しましょう。
default_replyは何かしらのリプを送った場合返すメッセージなのでなんでもいいです。

#実行
以下のコマンドで実行しましょう

```
python3 run.py
```

メッセージを送ってみましょう。
<img width="391" alt="スクリーンショット 2017-10-19 15.11.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/10ec5434-dffe-33e7-b69d-2c48a0e5b5d8.png">
ちゃんとメッセージが返ってきましたね(ムカつきますが...)
※pythonコマンドが実行中のみメッセージを返してくるので実行されていない場合は返答はありません(常駐化は後ほど)
#今回はここまで
次回はプラグインを入れて特定のワードがきたら特定のワードを返すように設定して行きます。
ブロードキャストアドレスについて

# ブロードキャストアドレスとは
ブロードキャストを行うためのIPアドレス。
リミテッドブロードキャストアドレスとディレクテッドブロードキャストアドレスの2つがある。

# ブロードキャストとは
ネットワーク上の複数のコンピュータにいっせいにデータを送信するために利用されるアドレス。RIPやARPなど通信相手が誰かわからない状況で利用される。

# リミテッドブロードキャストアドレス
すべてを1bitしたアドレス(255.255.255.255)のこと。このアドレスに対してブロードキャスト送信すると、そのネットワークセグメント全体に対してパケット(データ)が送られるが、ルータを介して接続されている他セグメントへの送信は行われない。

# ディレクティッドブロードキャストアドレス
ホストアドレス部だけをオール1bitしたアドレスのこと。
たとえば192.168.1.0/255.255.255.0というネットワークに参加しているすべてのコンピュータを探索するディレクディッドブロードキャストアドレスは192.168.1.255となる。
このアドレスに対してブロードキャスト送信すると、その192.168.1.0/255.255.255.0に参加するネットワークアドレスを持つすべてのコンピュータに対してパケット(データ)が送られる。そのネットワークアドレスが割り当てられたコンピュータがルータの先にも存在した場合は、ルータを介してデータ送信が行われる。

# 参考
+ wikipedia
https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9

+ @it
http://www.atmarkit.co.jp/ait/articles/0701/06/news015.html
AWS Route53とWAFのGeolocation機能を検証

WAFに地域を制限する新機能がでました。geolocationについて検証しました。ついでにroute53のgeolocationも検証しました。


#1.route53のgeolocation検証
##検証
アクセスをUS（アメリカ）だけに限定して、あらゆる方法で日本からのアクセスどこまで防いでくれるか検証

##検証環境
・route53にて[test.example.com]と登録後geolocaionをUSに設定する。（ドメインは例です。）
・EC2静的webホストのインスタンスを作成
・EC2にEIPを付与
・Applicattion load blanceでインスタンスを紐付け

ALBのヘルスチェックを通して検証

##結果（左アクセス方法と右結果）
ドメインアクセス--------------------------拒否(ドメインが見つかりませんでした。)
EC2のパブリックドメイン-----------------アクセスできた
EC2のEIP------------------------------------アクセスできた
ALBのドメイン-----------------------------アクセスできた
ALBのネットワークインターフェース----アクセスできた

##感想
当たり前ですがRoute53を通らない方法でやると通る。


#2.WAFのGeoMatch検証
##検証
US以外のアクセスすべて拒否設定で日本からアクセス検証
（上記のroute53で設定した。geolocationはもとに戻しています。）

##検証環境
・EC2静的webホストのインスタンスを作成
・EC2にEIPを付与
・Applicattion load blanceでインスタンスを紐付け
・WAFGeoMatchをUS(アメリカ)以外全部拒否設定

##結果（左アクセス方法と右結果）
ドメインアクセス--------------------------拒否(HTTPStatus:403)
EC2のパブリックドメイン-----------------アクセスできた
EC2のEIP------------------------------------アクセスできた
ALBのドメイン-----------------------------拒否(HTTPStatus:403)
ALBのネットワークインターフェース----拒否(HTTPStatus:403)

##感想
通常のアクセスする順番が「クライアント⇒route53⇒ALB(WAFアタッチ)⇒EC2」なので、WAFで拒否してくれるが、EC2に直接アクセスするとALBは通らないのでアクセス可能になってしまう。
本来であれば、WEBインスタンスを作るときにEC2に直接EIPとパブリックドメインはつけることがないので問題ないと思います。
地域のアクセス制限するのならWAFのほうが良い。
Eclipseでファイルを開くエディタを好みのエディタに設定する

1 Preferences > 

2 General > 

3 Editors > 

4 File Associations > 

5 File Types(対象にしたいファイル拡張子を選択) > 

6 Associated editors > 

7 [Add...] > 

8 使用したいエディタ選択 > 

9 Associated editorsのリストに追加されたらクリックして洗濯した状態で[Default]　


以上で設定完了。
Sublime Text 3でHayakuを使っているとSCSSのスニペットが使えない問題

Sublime TextでSassコーディングするときは[Hayaku](https://github.com/hayaku/hayaku)を使っています。楽すぎてもう手放せません。
でもたまに理想通りに展開してくれなかったり、よく使うmixinなどもスパパッと入力したかったりしたのでスニペットを登録することにしました。

##️ スニペット動かない問題
[ドキュメンテーション](http://docs.sublimetext.info/en/latest/extensibility/snippets.html)に沿ってスニペットを登録しても動作してくれません。ググるとスコープが間違ってるパターンが多いようでしたが今回は当てはまらないようです。
ちなみにスニペットを使いたいソース中で `command+option+P` するとスコープを確認できます。

ダメだった例

```@at-root.sublime-snippet
<snippet>
  <content><![CDATA[
@at-root {
  $1
}
]]></content>
  <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
  <tabTrigger>ar</tabTrigger>
  <!-- Optional: Set a scope to limit where the snippet will trigger -->
  <scope>source.scss</scope>
</snippet>
```

## 解決策
stack overflowで[同様の問題を見つけました](https://stackoverflow.com/questions/16589647/sublime-text-snippet-doesnt-work-in-scss-files)。
それによると**Hayakuとコンフリクトしている**のではないかということでした。なので `tabTrigger` の最後にスラッシュ `/` を付け加えたところ動いてくれました！:tada::clap_tone1:

成功した例

```@at-root.sublime-snippet
<snippet>
  <content><![CDATA[
@at-root {
  $1
}
]]></content>
  <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
  <tabTrigger>ar/</tabTrigger>
  <!-- Optional: Set a scope to limit where the snippet will trigger -->
  <scope>source.scss</scope>
</snippet>
```

これで思う存分スニペットを登録できます。
[SCSS-Snippets](https://github.com/npostulart/SCSS-Snippets)も入れてましたが `@for` のスニペットなど使えてなかったのでこの方法で再登録しました。
dockerを最新バージョンにしたらエラーが出た話：Windows

##宣伝
アプリ作るまでのお話を書きました。
読んでいただけると嬉しです☺️
[【3日で実装・公開】エモいアートな画像生成アプリ開発 - Qiita](https://qiita.com/rantaro/items/fdb7bbd55a57c68db834)

#いきなりまとめ
dockerを最新バージョンにした際にWindowsだとShare Drives のチェックが外れるので
エラーが出たら

**１：クジラマークを右クリック
２：settings をクリック
３：Share Drives でチェックを確認**
![docker_img.jpg](https://qiita-image-store.s3.amazonaws.com/0/199085/420bc634-31f4-3b07-66a1-a5af0f7d14da.jpeg)


で自分は解決できました。

##経緯
dockerの最新バージョンをインストールしたところ
いつものように　docker　を　upしたところ
エラーが出てローカル環境が動かなくなった。

##エラー
###エラー内容
>ERROR: Encountered errors while bringing up the project.

macユーザーの先輩方は普通に最新にできていたのに
唯一のWindowsユーザーの自分はエラーが起きました。

[新人フロントエンジニアがdockerに挑戦してみた](https://qiita.com/ranmaru_genki/items/4425894a4c29e64e50ba)に書いた通りdockerに慣れてないので軽くパニックに…

##解決
自分で変更された設定を追っていくとそもそも
通信できていないことに気づき

設定し直すことで解決しました。

**１：クジラマークを右クリック
２：settings をクリック
３：Share Drives でチェックを確認**
![docker_img.jpg](https://qiita-image-store.s3.amazonaws.com/0/199085/420bc634-31f4-3b07-66a1-a5af0f7d14da.jpeg)


##補足
dockerに詳しい方なら「当たり前やん」で終わりそうな内容です。
もしWindowsの方の少しでも助けになればと思い記事を書いた次第です。

##宣伝
アプリ作るまでのお話を書きました。
読んでいただけると嬉しです☺️
[【3日で実装・公開】エモいアートな画像生成アプリ開発 - Qiita](https://qiita.com/rantaro/items/fdb7bbd55a57c68db834)
JupyterLabのhomeを変更する方法


Macでの話です

```bash:
jupyter notebook --generate-config
```

```shell-session
Writing default config to: /Users/test/.jupyter/jupyter_notebook_config.py
```

```bash:
vi /Users/test/.jupyter/jupyter_notebook_config.py
```

homeにしたいディレクトリを書く

```bash:jupyter_notebook_config.py
c.NotebookApp.notebook_dir = '/Users/test/python_workspace'
```
GPSカー　シュミレータ その8

#概要
GPSで自動走行する、コンテストがある。
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。
大会要項が変更になったため、対応した。
androidアプリの方をリリースした。配布します。

実行環境
android 4.2.2

配布物
[play](https://play.google.com/store/apps/details?id=com.ohisamallc.ohiapp145&hl=ja)

以上
Azureを使うときの注意点

# 概要

いくつかはまるところがあるので、念のためメモしておく

自分で調べたことや、聞いたことなのと、
いろいろなことがよく変わるので、
状況がかわっているかもしれないから、
今現在の状況を、きちんと、その都度、調べること。

過去に似たようなものを書いていた

https://qiita.com/manabuishiirb/items/96c1c33b5bae617567c5

## 料金計算ツール

[料金計算ツール | Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/calculator/)

## 最初にコアのクォータ制限がある

たくさんのマシンを作りたい場合に、コアの制限にひっかかることがある。
クォータの変更を申請する。
ただし、時間がかかることがあるようなので、早めにやっておくとよい

### 無料サブスクリプションだと

コアのクォータを増やすことはできないらしい。
要確認

## クォータ制限の解除に、選択したいシリーズがない。

そういうことは、よくあるようなので、
とりあえず、適当なシリーズのコアの変更を要求する。
メールがくるが、その後、たいてい確認の電話が来るので、そもそも選択できないということを伝える方法もある。
あと、フィードバックに書いてみるという方法もある。

## 使いたいサイズの、仮想マシンが選択できないことがある

使えるようになるまでの手順がわかれば、それを追記する。
もしかすると、最初のコアの制限のせいで、制限以上のものが選べない可能性があるかもしれない。


## portal サイトの挙動がたまにおかしい

サードパーティクッキーをブロックしていると、うごかないのかもしれない。

## マシンをdeallocateしないと、課金対象のまま

コマンドラインからshutdownしただけだと、stopのままの可能性があるので、
長いことつかわないなら、deallocateしておいたほうが良い。

## HDD と SSD について

### HDD

HDDの課金については、使用しているサイズ分だけが課金対象になるようだ
1TBのディスクでも、使っているのが1GBなら、1GBが課金対象。

### SSD

要求した容量分課金される
1TBのディスクを作って、1GBしかつかっていなくても、1TB分の料金がかかる

### SSD一時ディスクについて。

たしか、マシンを消すとなくなるはず。。。
未確認。

## 同じリソースグループ名にすると、グループ作成とか、仮想マシン作成とか遅い

ARMで、何度も作っては消してを繰り返すときに、同じリソースグループで削除して作成をすると、
どうも、消去処理がおそいようなので、
新しいリソースグループを作れるならば、新しいリソースグループを作った方が良い。

## 利用できるマシンサイズの確認

```
azure vm sizes --location japaneast
```


## サブスクリプションIDの確認方法

```
azure account list
```


## 作成してある、リソースグループの確認

```
azure group list
```
## 仮想マシン作成時の Custom Script のログなど waagent

作ったマシンの中の、以下のディレクトリ
もし複数あるならば、おそらく最後の `0` が `1` などになるはず。

一般ユーザの権限ではみれないので、 `sudo` などを使うこと。

```
/var/lib/waagent/custom-script/download/0
```

以下の場所に少しだけディレクトリに関する情報がある。

* [azure-linux-extensions/CustomScript at master · Azure/azure-linux-extensions](https://github.com/Azure/azure-linux-extensions/tree/master/CustomScript#debug)

## pubilc ip のリストを表示する

```
azure network public-ip list
```

特定のリソースグループのものを調べるときは、

```
azure network public-ip list -g リソースグループ名
```

## 仮想マシンのサイズの変更を、ポータルから行う

以下のページにやりかたがでている。

* [VM のサイズ変更について – Japan Azure Technical Support Engineers' Blog](https://blogs.technet.microsoft.com/jpaztech/2016/04/15/vmresize/)

- 対象マシンをクリック
- deallocate
- サイズを変更して
- 起動する
GPSカー　シュミレータ その7

#概要
GPSで自動走行する、コンテストがある。
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。
大会要項が変更されたため、対応した。
再々配布します。


#実行環境
windows .netframework4.0

#配布物
[ダウンロード](http://jsrun.it/assets/K/i/p/D/KipDB_)

#使い方
ZIPです。解凍願います。
bluetoothトングルを挿す。
スタートボタンを押すとCOM14をオープンします。
androidアプリは、ご準備下さい。
eコマンドで、デスクトップに軌跡をlog.jpgで保存します。

以上
OOCSS サンプルコード

[別の記事で OOCSS についての記事を翻訳しました](https://qiita.com/natsu871/items/003db738d18eade46989) が、ここでは実際にサンプルコードを載せたいと思います。

CSSの実装をするときは、普段から基本的に OOCSS の原則である **『構造と見た目の分離』** **『コンテナーとコンテンツの分離』** に従って書くようにしています。

特にフォームまわりでは、同じ要素でも、選択状態にあるかどうかで色が変わったり、削除ボタンなどのアイコンを併置していたりなど、パターン化できるものが多く、OOCSS の考え方が役に立ちました。

前述の記事のようにすべてを `extend` で組み立てることを徹底したりはしていませんが、できるだけモジュールとして切り分けられるところは切り分けて、コードを書いています。

以下に、実際に使っているサンプルコードを載せます。


## <i class="fa fa-pencil" style="font-size:1em;"></i> 実例１：プレイスホルダーで『構造と見た目の分離』

これは、プレイスホルダーのみで『構造と見た目の分離』を実践した例です。（ひとつのクラス名に対して定義しています）

チェックボックスのカラムの形状と、見た目の変化を、別々のプレイスホルダーで定義して `@extend` しています。
（プレイスホルダーに定義しているスタイルの詳細は省略します）

「構造」と「見た目」の役割ごとにプレイスホルダーを使い分けるようにした例です。

![スクリーンショット_2015-08-20_16_27_20.png](https://cdn.kibe.la/imported/ignis/qiita/79336b7b-343e-38d6-1b20-a5e4cc988425.png)


```scss
//*** Checkbox ***//

.form-checkbox {
  > label {
    @extend %form-column;            // カラムの形状（構造）
    @extend %form-column-unchecked;  // カラムが選択されていないときの配色（見た目）
    @extend %form-column-icon;       // チェック枠の形状と配置（構造）
    &:before {
      background-image: image-url('icn_checkbox.png');
    }
  }
  > input[type="checkbox"]:checked + label {
    @extend %form-column-checked;  // カラムが選択中のときの配色（見た目）
    &:before {
      background-position: 0;
    }
  }
}
```

```haml
.form-checkbox
    = f.check_box name, {multiple: true, checked: false}, 0, nil
    = f.label "#{name}_0", 'こだわらない'
```



## <i class="fa fa-pencil" style="font-size:1em;"></i> 実例２：拡張クラスで『構造と見た目の分離』

こちらは、クラスにそれぞれ「構造」と「見た目」の役割を持たせた場合です。


![スクリーンショット_2017-10-19_14_33_50.png](https://qiita-image-store.s3.amazonaws.com/0/12033/e7199fc5-363e-8d8d-fd99-a1ac9b4bd53a.png)


ベースオブジェクトと拡張クラスを定義し、OOCSS の原則である『構造と見た目の分離』を取り入れています。

![スクリーンショット_2015-08-20_15_37_50.png](https://cdn.kibe.la/imported/ignis/qiita/9db63db9-cefd-6790-fe80-85ced84580d3.png)


そして HTML で、このベースオブジェクトと拡張クラスを組み合わせて使います。

![スクリーンショット_2015-08-20_15_31_19.png](https://cdn.kibe.la/imported/ignis/qiita/b3d3a3b3-4706-ff12-db07-1240a925f48c.png)



# <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参考リンク

#### [Sass を利用したオブジェクト指向 CSS を使おう（翻訳）](https://qiita.com/natsu871/items/003db738d18eade46989)

↑ Sass での OOCSS の取り入れ方について書かれた記事を翻訳しました



#### <i class="fa fa-file-text-o" style="font-size:1em;"></i> [FLOCSS](https://github.com/hiloki/flocss)

FLOCSS のリファレンスです。
論理演算子を論理学的に理解する

複雑な論理演算をするときには、いくつか注意することがある。
一つ目は、「演算子の優先順位」で、二つ目は「演算子の入れ替え」。

一つ目は簡単だが、演算子には優先順位がある。詳しくは以下URL。
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html

a && b || c
は、「aかつbが真、またはcが真のとき、真」を意味する。
「aが真かつ、bまたはcが真のとき、真」としたければ、
a && ( b || c )
とする。

二つ目は、上の式を否定したい時などに注意しなければならないことで、
「aかつbが真、またはcが真のとき、偽」としたければ、
! (a && b || c)
でもよいが、これは、
(!a || !b ) && !c
「aまたはbが偽かつ、cが偽のとき、真」と同値である。

具体例を考えれば、この同値関係は納得できるだろうが、プログラムを書いてる間にいちいち考えるのは面倒だ。そこで、論理学の公式を覚えておくと、具体的に考えずに、簡単に書き換えができる。
覚えておくとよい論理学の公式は以下の通りだ。

not not A = A
A and A = A (and の同一律)
A or A = A (orの同一律)
A and B = B and A (and の交換則)
A or B = B or A (or の交換則)
A and B and C = A and (B and C) (and の結合則)
A or B or C = A or (B or C) (or の結合則)
A and True = True and A = A
A and False = False and A = False
A or False = False or A = A
A or True = True or A = True
A or A and B = A and B or A = A
A and (A or B) = A and (B or A) = (A or B) and A = (B or A) and A = A
A and not A = not A and A = False (排中律)
A or not A = not A or A = True (排中律)
A and (B or C) = (B or C) and A = A and B or A and C (分配律)
A or B and C = B and C or A = (A or B) and (A or C) (分配律)
not(A and B) = not A or not B　(ド・モルガン則)
not(A or B) = not A and not B　(ド・モルガン則)

大体の公式は「当たり前」だ。覚えておくのは、最後の４つくらいだろう。これらを使って先ほどの例を考える。

! ( A && B || C)
= !( A && B ) && !C
= ( !A || !B ) && !C

となる。もっとややこしい状態を考える。
「A=Bが真であり、かつC=DまたはC=Eでないとき、ある処理を実行する」を作りたい場合、順番に、

```ruby:sample.rb
if A == B 
 unless C == D || C == E
　　＃処理
 end
end
```

と書いてもいいが、あまり階層を作りたくないので、一つの式で済ませたい。
論理学の公式を使うと、
A=B && !(C=D || C=E)
は、
A=B && (C!=D && C!=E)
とできるので、

```ruby:sample.rb
if A == B && (C != D && C != E)
　＃処理
end
```

みたいにする。プログラムのif文は、「もし〜なら」で理解しておくより、「〜が真ならば」で理解しておいた方が、論理演算子の処理が楽になる。
ロッカーの開閉回数の合計は？Pythonで答えを求める


# テスト問題が気になる
ロッカーの開閉回数の合計は？
http://www.sankei.com/life/news/171018/lif1710180001-n1.html
http://www.itmedia.co.jp/news/articles/1710/19/news049.html
これって要するに、２乗しろって事です。
だから、開いているロッカーは、2乗を並べれば 1,4,9,16,25,36,49,64,81,100,121,144,169,196 となる。
しかし、問題文が、200個のロッカーを100回開け閉めとあるので、100より大きな数値は反対になるので、121,144,169,196以外が開いている事になる。
これで1と3の問題が導き出せる。
2の問題は単なる約数なので、約数を導き出せれば良い。（100より大きな数値は約数を１減らせば、答えが導き出せる）
ただ、それだと面白くないので、プログラムで、この動作を実際にやらせてみて答えを出してみようと思う。（昼休みに）

## Pythonでプログラム
```py
# 変数の初期化
lockers = [False] * 200
count = [0] * 200

# ロッカーを100回開け閉めし、その数をカウントする
for x in range(100):
  for y in range(x, 200, x + 1):
      lockers[y] = not(lockers[y])
      count[y] += 1

'''
for i in range(200):
  print('{0}:{1}:{2}'.format((i + 1),  lockers[i], count[i]))
print
'''

# 1 番号1～10のロッカーで開いているロッカーを表示する
for i in range(10):
  if (lockers[i] == True):
     print('{0}:{1}'.format((i + 1),  lockers[i]))
print

# 2 99、100、101のロッカーの開け閉めの数を表示する
print('{0}:{1}'.format(( 98 + 1), count[ 98]))
print('{0}:{1}'.format(( 99 + 1), count[ 99]))
print('{0}:{1}'.format((100 + 1), count[100]))
print

# 3 開いているロッカーの数を表示する
open = 0
for i in range(200):
  if (lockers[i] == True):
    open += 1
print('{0}'.format(open))
```
## 結果
```text
1:True
4:True
9:True

99:6
100:9
101:1

106
```
## 答え
- 番号1～10までの10個のロッカーのうち、開いているロッカーの番号をすべて書きなさい。
 - 1,4,9のロッカーです。
- 99、100、101のロッカーは、それぞれ何回開閉されましたか。開けた回数と閉めた回数の合計を答えなさい。
 - 99は6回です。
 - 100は9回です。
 - 101は1回です。
- 200個のロッカーのうち、開いているロッカーは何個ありますか。
 - 106個です。
Swiftのif let って、つまり、何？

## 前書き
Objective-CからSwiftいじりはじめて、Xcodeちゃんの補完で「なんじゃこりゃ！？」」って思った。

調べると色々出たけど、「つまり何よ？」ってのをパッと答えてくれるページが見つからなかったので書く。雰囲気だけ掴んで行間は自分で補完できる人のために。

## つまり、何よ？
```swift
// fruitはnil許容型のオブジェクトとする
if let apple = fruit {
    apple.juice()
} else {
    print("There is no fruit...")
}
```
とは、つまり、

```swift
// fruitはnil許容型のオブジェクトとする
if fruit != nil {
    let apple = fruit!
    apple.juice()
} else {
    print("There is no fruit...")
}
```

ってことです。

以下は補足なので、上記を見て「あ、なーるほど」って思える方はここまででOKです。

## なんでif letとかあるの？

Swiftには二種類の型があります。

* `nil`を許容**しない**型（非Optional型）
* `nil`を許容**する**型（Optional型）

そして多くの「`nil`を許容する型」では、その変数を処理する前に、「`nil`を許容しない型」に**変換**してあげる必要があります。

型に対して「nilを許容する」というコーティングを施したままだと使えないので、使う前にコーティングを剥がしてあげましょう、と。（これを**Unwrap**と呼びます。）

上記コードの`let apple = fruit!`がまさしくコーティングを剥がす作業をしている部分です。

で、毎度毎度nilチェックした後にコーティング剥がす1行を入れるのなんて面倒ですし、どこかで`!`をつけ忘れてエラーが発生する、みたいなオチが見えますよね？

そういうのを防ぐために、`if let`があるんですね。

### あとがき
Optionalに関しては雰囲気を掴むための説明なので、詳しくは下記が詳しいです。
[どこよりも分かりやすいSwiftの"?"と"!" - Qiita](https://qiita.com/maiki055/items/b24378a3707bd35a31a8)

ただ、「Optional」とか「Unwrap」とかそこらへんの単語が先に出てきて、せっかちな私は「・・・つまり？」って思っちゃうので、せっかちさん用の説明です。はい。

なんか間違っていたら是非ご指摘頂ければと存じます。
フレッツ光で IPoE による IPv6 を有効にしたとき AirMac Extreme に接続したAndroidがインターネットに繋がらない

## ネットワーク構成

```
FTTH --- [HGW] --- [Yamaha NVR500] --- [AirMac Extreme]
                                            ~~~ iPhone, Android
```

* `[HGW] ホームゲートウェイ` のルーター機能は使わず、NVR500 の WANポートからONUへ接続している
* `[AirMac Extreme]` はブリッジモードで動作、`インターネット` の接続方法は **DHCP** にしている

## 解決

AirMac ユーティリティで、AirMac Extremeの設定を開く。
[インターネット] - [インターネットオプション...]

`IPv6接続共有を使用` のチェックを外し保存、アップデート

## 嵌まったところ

なぜか iPhone は問題なく繋がっていたので、AirMac Extremeに行き着くまで時間がかかってしまった…。Androidの初期化までしたし… orz
Oracle Database 12c の OFFSET / FETCH 句を試す

# SELECT文の途中だけ引き出す
SELECT文の結果を一定の単位ごとに切り出したい場合があります。ホームページで一覧を表示する場合に「次ページ」「前ページ」と表示される画面などに使われます。
ここでは単一のSELECT文の結果を一部分だけ抜き出す処理について検証しています。

## Oracle Database 11gの構文
Oracle Database 11gでは一般的にROW_NUMBER関数を使います。ROW_NUMBER関数は、SELECT文の出力結果に対して番号を出力してくれます。
たとえば以下はemployeesテーブルからの検索結果から、salary列の値の上位3～5番目の値を取得する例です。

```
 SELECT first_name, salary FROM (
      SELECT first_name, salary, 
        ROW_NUMBER() OVER (ORDER BY salary DESC)
               ranking FROM employees
　)
 WHERE ranking BETWEEN 3 AND 5
```

## Oracle Database 12c以降の構文
Oracle Database 12c (12.1) では、より洗練された構文であるOFFSET/FETCH句を利用することができます。SELECT文の先頭からレコードを読み飛ばす場合はOFFSET句を、出力されるレコードを指定するにはFETCH句を使います。

- OFFSET n ROWS
　ROWSはROWでもかまいません。OFFSET句を省略すると全レコードが対象になります。

- FETCH FIRST n ROWS ONLY
 出力されるレコード数を制限します。ROWSはROWでもかまいません。またFIRSTはNEXTと書いても同じ動作になります。

前述の例をOracle Database 12cの構文で書き直すと下記のようになります。ずいぶんシンプルになります。

```
SELECT first_name, salary FROM employees ORDER BY salary DESC
OFFSET 2 ROWS FETCH FIRST 3 ROWS ONLY ;
```

## PERCENT ROWSとWITH TIES
FETCH FIRST n ROWS構文は、出力するレコード数を厳密に指定しますが、FETCH FIRST n PERCENT ROWS ONLY と書くこともできます。PERCENTを追加指定すると、全体から指定した割合のレコードを返します。
FETCH FIRST n ROWS WITH TIESと記述すると、同一値のレコードも出力されるようになります。

## FETCH句の内部
FETCH句を使ったSELECT文の実行計画を確認します。

```
SQL> SELECT first_name, salary FROM employees ORDER BY salary DESC
    	OFFSET 2 ROWS FETCH FIRST 3 ROWS ONLY ;

<<出力省略>>

SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor()) ;

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  g735dd6u6c05q, child number 0
-------------------------------------
SELECT first_name, salary FROM employees ORDER BY salary DESC OFFSET 2
ROWS FETCH FIRST 3 ROWS ONLY

Plan hash value: 2698234872

--------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |           |       |       |     4 (100)|          |
|*  1 |  VIEW                    |           |    11 |   561 |     4  (25)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK|           |    11 |   275 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL     | EMPLOYEES |    11 |   275 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
   1 - filter(("from$_subquery$_002"."rowlimit_$$_rownumber"<=CASE  WHEN
              (2>=0) THEN 2 ELSE 0 END +3 AND "from$_subquery$_002"."rowlimit_$$_rownumber">2))
   2 - filter(ROW_NUMBER() OVER ( ORDER BY INTERNAL_FUNCTION("SALARY") DESC
              )<=CASE  WHEN (2>=0) THEN 2 ELSE 0 END +3)

Note
   - dynamic statistics used: dynamic sampling (level=2)

29 rows selected.
```

OFFSET / FETCH 構文は内部的にはサブクエリーが生成されて ROW_NUMBER 関数を実行して出力レコードを決定していることが分かります。
AZURE Function AppでSendGridを使ってメール送信する

# 準備
* SendGridのアカウントを作り、メール送信権限のあるAPI KEYを作成する
* AZURE Function を作成し、コード形式にjavascriptを指定する
* 以下のコードのAPI KEY部分を書き換えてindex.jsを上書きする

# コード
```javascript:index.js
module.exports = function (context, req) {
    context.log('begin function');

    //アプリケーション設定で設定しておいたSendGridApiKeyを取得する
    var sendgridApiKey = process.env["SendGridApiKey"];

    var param1;

    if (req.query.name) {
        param1 = req.query.name;
    } else if ((req.body && req.body.name)) {
        param1 = req.body.name;
    }

    if (param1) {
        // send mail
        var http = require("https");

        var options = {
          "method": "POST",
          "hostname": "api.sendgrid.com",
          "port": null,
          "path": "/v3/mail/send",
          "headers": {
            "authorization": "Bearer " + sendgridApiKey,
            "content-type": "application/json"
          }
        };

        var req = http.request(options, function (res) {
          var chunks = [];

          res.on("data", function (chunk) {
            chunks.push(chunk);
          });

          res.on("end", function () {
            var body = Buffer.concat(chunks);
            console.log(body.toString());
          });
        });

        req.write(JSON.stringify({ personalizations:
           [ { to: [ { email: param1, name: param1 } ],
               subject: 'Hello, World!' } ],
          from: { email: 'test@example.com', name: 'Test Sender' },
          reply_to: { email: 'test@example.com', name: 'Test Sender' },
          subject: 'Hello, World!',
          content:
           [ { type: 'text/html',
               value: '<html><p>Hello, world!</p></html>' } ] }));
        req.end();

        //make response
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello"
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass an email address on the query string or in the request body"
        };
    }
    context.done();
};
```

# 実行

メッセージボディかクエリ文字列に送信先アドレスを入力して実行する。
`name:TO-MAIL-ADDRESS`
python3でslackbotの作成(その1:slack準備編)

#はじめに
pythonでslackのbotを簡単に作れると聞いたので作ってみました。
そして、botの常駐化もできたのでハマったところなど紹介していきます。

#環境
OS : macOS High Sirrea 10.13
python : 3.6.2

#slack側の設定

とりあえず最初にslackへの登録とグループの作成を行ってください。
※説明は省きます。
権限のあるユーザで以下のリンクを開くとbotの作成画面に行きます。
[botの作成](https://my.slack.com/services/new/bot)
<img width="972" alt="スクリーンショット 2017-10-19 13.05.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/e257f95b-cc65-2bf8-25a1-8fd84cc74bde.png">
usernameに名前を設定したら 'Add bot integrationration'で追加しましょう。
追加したら以下のような画面に遷移します。
<img width="1006" alt="スクリーンショット 2017-10-19 13.23.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/81896cd6-c632-21e4-0a7a-864567bb4d25.png">
API Token : 上の画像では隠しています。プログラムを書く際に必要なのでメモしておきましょう
Customize Name : botの名前
Customize Icon : ファイルからアイコンをアップすることができるのでお好きなものを
以上の項目を設定したら
チャンネルを作成して登録したbotを招待しましょう。
<img width="663" alt="スクリーンショット 2017-10-19 14.17.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/bdaa44ea-a0ac-c762-ed2d-ebe54d2e4ec2.png">

#とりあえず今回はここまで
次回はプログラムを書いて行きます。
WindowsのNetBeansでSass自動ビルド (node-sass)

# TIPS
:point_up:node-sassの実行ファイルの指定は、NetBeansの設定（全プロジェクト共通）になってしまうので、プロジェクト外にインストールした方がよさそうです

# 前準備

nodeインストールまで終わっていて、npmが使える前提です。
　まだの場合先にこちら → [Windowsでnodistを使ってNode環境構築](https://qiita.com/RyutaKojima/items/00c9653a609f739e78c7)

```
npm -v
> 4.0.5
```

# 必要なものをインストール

```
## node-sassをインストールするディレクトリに移動 
cd C:\node-sassインストール先パス

## npmの初期化(すでに終わっているなら必要ないです)
npm init -y

## node-sassをインストール
npm install --save-dev node-sass
```

> カレントディレクトリの`node_modules`以下にファイルが出来ているのを確認する
> node_modules\.bin\node-sass.cmd

# NetBeansの設定

- NetBeansを起動
- ファイル(F) > プロジェクトプロパティ
  - CSSプリプロセッサ
     - Sassタブ

と選択する。

今こんな画面(デフォルト設定)
![c7f1f25f13e8b66ae30e7cda2ae5718b.png](https://qiita-image-store.s3.amazonaws.com/0/87995/a58cb01a-3e45-f0e6-de85-f9ff1619a4e5.png)

- 右上の「実行可能ファイルを構成」ボタンを押すと「オプションダイアログ」が開くので
  - "Sassパス"に、さっきの`node-sass.cmd`ファイルを指定
  - `...node-sassインストール先...\node_modules\.bin\node-sass.cmd`
  - 「OK」で確定

![da72ed7afcce0c0a0d641a4332c9f34e.png](https://qiita-image-store.s3.amazonaws.com/0/87995/20c3427b-9cea-ea4a-5f5e-060076fb2129.png)

- 元のダイアログ(プロジェクト・プロパティ)に戻って
  - 保存時にSassファイルをコンパイル にチェックを入れる
  - 入力・出力に、プロジェクトルートからのパスを入力
  - コンパイラオプションを入力
`--output-style expanded --source-map-contents --source-map-embed`

全部入力が終わった画面
![d28a8a2a900b49e144237be69761eb27.png](https://qiita-image-store.s3.amazonaws.com/0/87995/5e9a589c-87a5-e708-8619-c2dd5eb37b22.png)

「OK」ボタン押してダイアログ閉じると、自動にコンパイラが動いてcssが出力される！ハズ！

node-sassのコンパイラオプションは公式（GitHub)に乗ってます！
[node-sass](https://github.com/sass/node-sass)
Unity | 逆さま(Upside down)に表示されるオブジェクトのMVPを変更(Matrix4x4)

#MVP Matrix

HoloLensアプリ実装の要件の一つが、あるプラグインを使用してホログラムを表示する、というものだった。
Unity Editor上では問題なく表示されたものの、HoloLensにdeployすると逆さまに表示されてしまった。
MVP(Model View Projection)Matrixの算出方法を修正することでこのバグは解消されるようである。

Unity上での座標系(Coordinate System)からくるもので、プラグインなど使用した際にはしばしば起こるもののようだ。

##Ref

- [http://answers.unity3d.com/questions/20337/flipmirror-camera.html](http://answers.unity3d.com/questions/20337/flipmirror-camera.html)
- [http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/](http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/)

```csharp
private Matrix4x4 q1; // identity

    public void Update(Camera cam, Matrix4x4 m)
    {
        /*
        some code...
        */

        // matrix stuff
        Matrix4x4 v = cam.worldToCameraMatrix;
        // added matrix multiplication
        v *= Matrix4x4.Scale(new Vector3(-1.0f, 1.0f, 1.0f));
        
        Matrix4x4 mat = Camera.main.projectionMatrix;
        // added matrix multiplication
        mat *= Matrix4x4.Scale(new Vector3(1.0f, -1.0f, 1.0f));

        Matrix4x4 p = GL.GetGPUProjectionMatrix(mat, false);

        MVP = q1 * p * v * m;

    }
```
Atomのlinter-scss-lintに"you are using an old version of scss-lint"と怒られる

# 現象
linter-scss-lintプラグインがインストールされたAtomで、`scss-lint`のバージョンが古いとのエラーが出て動かない。

```
You are using an old version of scss-lint
```

![スクリーンショット 2017-10-19 10.54.39.png](https://qiita-image-store.s3.amazonaws.com/0/114828/fcdfdb6d-9f10-f97a-5622-db54f42c9895.png)

そこで`scss-lint`をアップデートしようとすると、「最新だよ」と言われてしまう。

```
$ gem list | grep scss-lint
scss-lint (0.38.0)
$ gem update scss-lint
Updating installed gems
Nothing to update
```

#　解決策
`scss-lint`をアンインストールしてから`scss_lint`をインストールするとエラーが消えた。

```
gem uninstall scss-lint
gem uninstall scss_lint 
gem install scss_lint 
```

参考：[Old version off scss-lint error message #160](https://github.com/AtomLinter/linter-scss-lint/issues/160#issuecomment-218813537)

## ハマりポイント
「`scss-lint`のバージョンが古い」というメッセージなのに、インストールするのは`scss_lint`になっている。

ちなみにプラグイン側のReadmeではちゃんと `$ gem install scss_lint` になっているので、rbenvでバージョンを変更した後などにハマりやすそう。
https://atom.io/packages/linter-scss-lint
Matlab作図:　figure内のプロパティを一括で設定 

非常に恥ずかしい話だが、subplot などをする際にAxes や各プロットのプロパティを個々に設定していた。findobjを活用すれば一発でかける。


```
figure;
subplot(1,2,1);
histogram(randn(100), -10:.2:10, 'FaceAlpha', 1, 'FaceColor', 'k')
set(gca, 'FontSize', 12)
subplot(1,2,2)
histogram(randn(100), -10:.2:10, 'FaceAlpha', 1, 'FaceColor', 'k')
set(gca, 'FontSize', 12)

```

```
figure;
subplot(1,2,1);
histogram(randn(100), -10:.2:10)
subplot(1,2,2)
histogram(randn(100), -10:.2:10)

set(findobj(gcf, 'Type', 'Histogram'), 'FaceAlpha', 1, 'FaceColor', 'k')
set(findobj(gcf, 'Type', 'Axes'), 'FontSize', 12)
```
Djangoで画像表示したいんじゃぁぁ！！

Webアプリケーションを作っていると画像を使用したい時が必ず来ます。
しかし、Djangoで作ったWebアプリケーションで画像を使用するにはいくつかの設定を追加してやらないといけません。
そんなに難しくないのですがピンポイントで情報を表示しているところがなかったので記事を書こうと思います。

## settings.pyに設定を追加

```py3:settings.py
MEDIA_URL = '/document/'

MEDIA_ROOT = (
    os.path.join(BASE_DIR, 'document')
)
```

settings.pyに上記のように`MEDIA_ROOT`を追加してやりましょう。
コードを記述する場所は`BASE_DIR`を記述したところより下ならどこでも構いません、分かり易ところに記述してやりましょう。

## urls.pyにも設定を追加

```py3:urls.py
from django.contrib import admin
# 下2行を追加
from django.conf import settings
from django.views.static import serve

urlpatterns = [
    url(r'^admin/', admin.site.urls),
　　　　　　　　# 下1行を追加
    url(r'^document/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]
```

次に`admin`のURLを設定している方の`urls.py`に上記のように追加してやりましょう。

以上の設定で画像が表示されるようになったと思います。

## まとめ
Railsなどと違いDjangoは設定が必要なのでそこが少し不便ですね。
Windowsでnodistを使ってNode環境構築

nodist使ったNode環境構築の手順をまとめました。

:raised_hand:Windows環境だと nvm-windows と nodist どっちがいいんですかね？？

# nodistインストール

[nodistのGitHubリポジトリ](https://github.com/marcelklehr/nodist/releases)から、最新リリースの.exeをダウンロード

- ダウンロード完了後、.exeを実行（インストール）
- インストール終わったら、パソコンを再起動する
- 再起動後、コマンドプロンプトを起動
- nodistの動作確認

```
# バージョン表示
nodist -v

# ヘルプ表示
nodist --help

# 追加済みのバージョンを一覧表示
nodist ls

# 公開されているバージョンを一覧表示
nodist ds
```

# ～使用するNodeバージョンの設定まで

[nodejsのGitHubリポジトリ](https://github.com/nodejs/Release)で、現在のLTSバージョンを確認する（`LTS Status`が`Active` になっているやつ）
> TIPS: LTS(Long-term support) = 長期サポートのこと


```
# LTSのバージョンを追加 (2017-12-25: 6.xだった)
nodist add 6.x

# 利用するバージョンをデフォルトに指定（グローバルに設定したら、毎回設定しなくていいので簡単）
nodist global 6.x
```

``` 
# nodeのバージョン確認
node -v
> v6.12.2
```


# npmを最新にバージョンアップ

```
# バージョン確認
npm -v
> 4.0.5

# npmのバージョンアップ
`npm install -g npm` じゃなくて、これもnodistを使う。
nodist npm global 5.5.1

# バージョン確認
npm -v
> 5.5.1
```

# :v:**終わり**