OmniAICreator/Qiita-1.07M huggingface dataset:
Nest CLIで始めるnestjs

# Nest CLIとは

nestjsアプリケーションの開発を支援するCLIツール。
アプリケーションのスキャフォールディングが行える。
Angular DevKit(angular-cli)の設計をもとに開発されている。

![スクリーンショット 2018-07-19 8.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/79414/7bf82bf7-14ee-3502-ae50-630465382489.png)


---

# Nest CLIでできること

- アプリケーションの新規作成
- アプリケーションの各種構成要素(controller, service, ...)の作成
- 依存パッケージ(@nestjs)のアップデート

※ 2018/07/19 現在 

---

# それぞれのコマンド紹介

- アプリケーションの新規作成
    - nest new app-name (alias: n)
- アプリケーションの各種構成要素(controller, service, ...)の作成
    - nest generate element-name (alias: g)
- 依存パッケージ(@nestjs)のアップデート
    - nest update package-name (alias: u)

---

# 触ってみる

公式ドキュメントによると、npmからインストールする方法と、Docker HubからCLIインストール済みのイメージを取得する方法が紹介されている。
今回は、npmからインストールする方法を試してみる。

## Nest CLIのインストール

```
$ npm i -g @nestjs/cli
```

```
$ nest --version
5.3.0
```

---

## プリケーションの新規作成

```
$ nest new nestjs-first-app
$ cd nestjs-first-app
$ npm start
```

対話形式でオプションを選択していくと、アプリケーションの雛形が作成される。

![スクリーンショット 2018-07-19 0.43.05.png](https://qiita-image-store.s3.amazonaws.com/0/79414/18eab117-ecce-a017-d605-424506143449.png)

作成されたプロジェクトを見ると、コードフォーマッター(prettier)やテストツール(jest)の設定ファイルなども同時に作成されるため、1から各パッケージをインストールするよりも格段に楽にnestjsを始められそうです。

---

## モジュールの追加

ここでは、例としてUserModuleを追加する。

```
$ nest g mo user
```

すると、`user` というディレクトリと、user.moduleが作成される。

![スクリーンショット 2018-07-19 1.08.12.png](https://qiita-image-store.s3.amazonaws.com/0/79414/ece3eb62-7a70-5744-6330-779ac4d34d11.png)

---

## コントローラーの追加

ここでは、例としてUserControllerを追加する。

```
$ nest g co user
```

`user` ディレクトリ以下にcontrollerのtsとspecが作成され、user.moduleにcontrollerが登録される。

![スクリーンショット 2018-07-19 1.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/79414/6897627d-4905-236e-ea76-bd8e184cb336.png)

---

## サービスの追加

ここでは、例としてUserServiceを追加する。
Controllerのときとは違い、Serviceは実行したディレクトリに対してフラットに作成される仕様らしいので、 `user/` ディレクトリを指定して実行した。

```
$ nest g s user/user
```

`user` ディレクトリ以下にserviceのtsとspecが作成され、user.moduleにの `providers` にserviceが登録される。

![スクリーンショット 2018-07-19 1.15.37.png](https://qiita-image-store.s3.amazonaws.com/0/79414/763be196-02a6-194e-4eef-4018efd602aa.png)

---

## ビルド

ビルドに関するコマンドはNest CLI側では用意されておらず、package.jsonに書かれたnpm scriptを使って行う。
ココらへんは、プロジェクトに応じてtsconfigとかを設定していくことになる。

```
$ npm run prestart:prod
```

![スクリーンショット 2018-07-19 8.24.21.png](https://qiita-image-store.s3.amazonaws.com/0/79414/0fbcb78e-abac-6698-498b-540c7d4851bb.png)

---

## 最後に

nestjsでアプリケーションを作成し始める初動を格段に加速してくれるツールっぽい。
Angular CLIに慣れていると、自然に使い始められる印象。
今後のアップデートに期待。

---

# リンク

[Nest CLI -GitHub](https://github.com/nestjs/nest-cli)
[Nest CLI Overview -Document](https://docs.nestjs.com/cli/overview)
Ruby — 自作 gem の実行コマンドを作る手順

`$ bundle gem yourgem` で作成したディレクトリ内で作業する前提。

```
$ cd /path/to/yourgem
```

## exe ディレクトリに Ruby ファイルを作って実行権限をつける

```
$ mkdir exe
$ touch exe/yourgem
$ chmod +x exe/yourgem
```

実行ファイルを置く場所は `gemspec` の指定に準じる。

```
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
```

## Rubyファイルの中身

バイナリではなくRubyスクリプトをコマンド化させる。

```ruby:/path/to/yourgem/exe/yourgem
#!/usr/bin/env ruby

require 'yourgem'

puts Yourgem.to_s
```

「ユーザーの環境にRubyが入ってなかったらどうするの？」という考えが0.1秒頭をよぎったが、
`gem` 使うユーザーは全員Rubyインストールしてるよね。

なのでRubyスクリプトがコマンドで何の問題もないのだ。

## gemをビルド

gem 専用の rake タスクで build する。

```
$ bundle exec rake build

yourgem 0.1.0 built to pkg/yourgem-0.1.0.gem.
```

## ビルドした gem をインストール

gem の素の環境にインストールする。

```
$ gem install pkg/yourgem-0.1.0.gem
```

( `bundle exec rake install` では素のコマンドは入らない様子 )

## ビルドなしで直接実行する場合

```
bundle exec ruby exe/yourgem
```


## 実行可能なコマンドが爆誕

当たり前だが gem のディレクトリにいるかどうかなど関係ない。

```
$ yourgem
Yourgem
```

ここらへんに入っていたりする。

```
$ which yourgem
/Users/yuma/.rbenv/shims/s2m
```

# 環境

- gem 2.7.6
- Bundler version 1.16.2
- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

# あわせて読みたいと思う魔法をあなたにかけました

- [はじめての Ruby gem 作成が死ぬほど簡単で笑えた件 (失敗談もあるよ) - Qiita](https://qiita.com/YumaInaura/items/90a3d02342486a62da43)
- [rubyプロジェクトのbin/console, bin/setup はバイナリじゃなくスクリプトだった - Qiita](https://qiita.com/hiraokashi/items/645daf877a43fc3b4592)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【SQLServer】今後廃止予定の機能（非推奨機能）が使われていないかチェックする方法

# 前提
Microsoftが以下に述べているように
非推奨だからといって機能がなくなるというのはなかなかないと思います。

[SQL Server 2016 データベース エンジンの非推奨の機能](https://docs.microsoft.com/ja-jp/sql/database-engine/deprecated-database-engine-features-in-sql-server-2016?view=sql-server-2017)
> 非推奨の印が付いている場合、それは次のことを意味します。

> その機能は保守管理状態にあり、それ以外では利用されていません。 新しい変更は行われません。新しい機能との相互運用性に関する変更もありません。
Microsoft は、アップグレードを容易にする目的で、今後のリリースから非推奨機能を外さないように努めます。 ただし、非推奨機能が将来の技術革新を制限してしまう場合、 SQL Server からそれを永久的に外すことをまれに選択することがあります。
新しい開発作業に非推奨機能を使用することはお勧めしません。



ただ、知らないと結局使ってしまうケースもあるので、調査の仕方を調べてみました。

ちなみに、自社製品は2008R2～2016までをサポートしており、
メインの検証は一番低い2008R2で行っています。

# ツール（SSMS）
SSMS（SQLServerManagementStudio）を利用して拡張イベントでチェックします。
開発時やテスト時にイベントが拾ったら確認するという流れを想定しています。


# 手順
## 1. SSMSを起動し、新しいセッションを作成する
「管理 ＞ セッション」で右クリックして作成します。（セッション名は適当に入力します）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124594/75953d9a-d2d1-fbc1-df99-f09083a9390d.png)  
 

## 2. 拡張イベントを登録する
イベントライブラリに「deprecation」と入力してフィルタします。
「deprecation_announcement」と「deprecation_final_support」が表示されるので、右側に移します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124594/9ce2591f-e1c6-fdce-ccaa-8529b0ac8594.png)

* __deprecation_announcement__
 * SQL Server の今後のバージョンで削除される予定があるが、次回のメジャー リリースでは削除される予定がない機能を使用するときに発生します。
* __deprecation_final_support__
 * SQL Server の次回のメジャー リリースで削除される予定の機能を使用するときに発生します。


## 3. セッションを開始する
今回はライブデータの監視を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124594/134245b2-3fce-edd2-68e9-1ed4a77fdc47.png)


## 4. 開発を行う
試しに以下のSQLを実行してみます。

```sql

create database hoge_db
create table hoge
(
	id int
)

--nolockを使用するときはwithヒントが推奨とのこと
select * from hoge(nolock)
```

こんな感じで結果が拾えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124594/de60cff0-c337-1436-5fcd-6cfd58f8f76e.png)


# 今後？
プロファイラでトレースすれば、他のインスタンスに対しても同じSQLが流せるので
各バージョンで拾えるのかなとも思ってたりします。

冒頭でも述べましたが、あくまでチェック観点の1つとして考えています。
if(true === true)って書くのやめろ

## はじめに

コーディングアンチパターンの紹介（~~個人的に嫌いな書き方の紹介~~）

## 例1

```php
<?php
if(true === true){
  echo('条件式はtrueでした');
} else {
  echo('条件式はfalseでした');
}
```

例えば上記のコードの出力結果は何になるでしょうか？
当然「条件式はtrueでした」と出力されます。
こんな条件式を書く人は恐らくいないとは思います。
では次の例はどうでしょうか

## 例2

```php
<?php
$a = 'hoge';
if(isset($a) === true){
  echo('条件式はtrueでした');
} else {
  echo('条件式はfalseでした');
}
```

これも「条件式はtrueでした」と出力されます。
この条件式は見たことある人が結構いるのではないでしょうか？
ハッキリ言いますが僕はこの書き方が大嫌いです。
こういう条件式を書いている人は今すぐやめて以下のようにしてください。

```php
<?php
$a = 'hoge';
if(isset($a)){
  echo('条件式はtrueでした');
} else {
  echo('条件式はfalseでした');
}
```

## 解説

http://php.net/manual/ja/function.isset.php
`isset`のリファレンスを見てみましょう。
返り値はboolで定義されています。
つまりbool値true/falseしか返ってこないのです。
bool値が返ってくるのが分かっているのにわざわざ`=== true`で比較するのは冗長以外のなにものでもありません。

`isset`だけに限った話ではありません。
`empty`とか`is_array`, `is_null`なども同様ですね。
`isset($a) === true`と書くのは`true === true`と書いてるのと同義です。
今すぐやめましょう。

## おまけ

ただし必ずboolが返ってくるわけではないものに関しては`=== true`の記述をした方が良い場合もあります。
例えば`strpos`
http://php.net/manual/ja/function.strpos.php
返り値の欄に注意書きがあるようにfalseを返す時もあるしそれ以外を返す時もあるので`===`演算子で判定しなければなりません。
返り値が必ずboolであるかどうか、で判断してください。
Ansibleの[DEPRECATION WARNING]を解消するのにちょっと引っかかったメモ

序章
===

ある日ansibleを走らせると以下の警告が出た。

```
[DEPRECATION WARNING]: Specifying include variables at the top-level of the task is deprecated.
Please see:
http://docs.ansible.com/ansible/playbooks_roles.html#task-include-files-and-encouraging-reuse
for currently supported syntax regarding included files and variables.
This feature will be removed in version 2.7.
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
```

使用していたplaybookはこんな感じ。

```
# hoge.yml
---
- hosts: all
  become: yes
  roles:
    - role: fuga

# roles/fuga/main.yml
---
  - name: install middleware
    include: install.yml
    vars:
      owner: yoko
      group: chance
  - name: start and enable middleware
    include: start.yml
```

includeのトップレベルで変数指定しちゃだめだよと言っているようだったので、role全てチェックせども該当なし。

調査
===

検索してみるとissueがヒットした。

https://github.com/ansible/ansible/issues/16183
> amenonsen commented on 8 Jun 2016
> ---
> That tag: is the underlying problem. You probably meant tags:,
> but it doesn't recognise tag: and thinks it's a variable.

> JoelFeiner commented on 26 Aug 2017
> ---
> please consider re-opening. The problem isn't just that the user made a syntax error. The problem is that the error message is both incorrect and not helpful. It says that specifying include variables at the top-level is deprecated, but the actual issue is something else.

おやっ？と思いつつ、調べてみるとincludeが非推奨になっている。

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html
> The bare include task (which was used for both Task files and Playbook-level includes) is still available, however it is now considered deprecated.

解決
===

さてはと思いincludeをimport_tasksに置き換える。

```
# hoge.yml
---
- hosts: all
  become: yes
  roles:
    - role: fuga

# roles/fuga/main.yml
---
  - name: install middleware
    import_tasks: install.yml
    vars:
      owner: yoko
      group: chance
  - name: start and enable middleware
    import_tasks: start.yml
```

走らせる。

警告は静まった。
MacとDPT-RP1のbluetooth接続

先日, sonyの電子ペーパーDPT-RP1を購入したが, Macとbluetooth接続するのにいくつかのステップがいるようだったのでメモ. 

手順に書いてある部分は, sonyの方にメールで伺った内容のほぼ転載です. 
(基本的には, 「てにをは」や「ですます」等を変えてる程度)

# 環境
- Mac OSX 10.11.6 El Capitan
- Sony DPR-RP1

## 症状
- MacとDPT-RP1自体のbluetooth接続はできている. 
- しかし, Digital Paper Appを見ると「未接続」のままで, 実際, データのやり取りができない. 
- (余談だが, WIFI接続の場合はできている)

## 手順
### 1. ネットワーク環境の確認
- Macの[システム環境設定]内[ネットワーク]を表示し, 上部の「ネットワーク環境」に「自動」以外の設定があるかをチェック. 
- ネットワークが複数ある場合、「自動」では問題が発生することもあるらしいのでネットワークを指定した場合に改善するかを確認. 

> 私は「自動」になっていたので, 「dptrp1」というネットワークを作りました. しかし, 問題は改善されませんでした. 


### 2. DHCPサーバの確認
- Macの[システム環境設定]内[ネットワーク]画面を表示し, 左側の一覧より「Bluetooth PAN」を選択して、右下の「詳細」から詳細画面を開く. 
- 「TCP/IP」選択時、「IPv4の設定」が「DHCPサーバを使用」以外の設定になっている場合「DHCPサーバを使用」に変更して改善するかを試す. 

> 「DHCPサーバを使用」になっていたのでスルー

### 3. DHCPリースの更新
- 上記「2.」で「IPv4の設定」が「DHCPサーバを使用」となっているにもかかわらず, 「IPv4アドレス」が表示されていない場合, 右側にある「DHCPリースを更新」を押下して、IPアドレスを取得し直す. 

> 「DHCPリースを更新」すると, IPが取得でき, Digital Paper Appと接続できるようになりました. 
> なので, 以下は僕は試していません. 

### 4. ファイアウォール
- 上記「3.」でIPアドレスが取得できない場合, 一度ファイアウォールを切り, 再度設定してみる. 

ファイアウォールの切り方に関しては下記の通り

#### ◆ファイアウォールの切り方

```
環境設定 → セキュリティとプライバシー → 左下鍵マークをクリック → パスワードを入力 → ファイアウォールを切にする
※切った後は, 改めてファイアウォールを入に設定する
```

### 5. IPアドレスの手動設定
- 上記全ての設定を試してみても改善が見られない場合, 手動でIPアドレスを設定する. 
- Digital Paperは、Bluetooth接続時に, 172.25.47.xxx を使用します. 
- 上記「2.」の「Bluetooth PAN」の「詳細」画面で、「IPv4の設定」を「手入力」に変更し, IPアドレス, サブネットマスク, ルータ設定を下記の値で入力し, OKボタンを押す. 

#### ◆ネットワーク設定

```
IPアドレス：172.25.47.xx　※左記「xx」は、他ネットワーク機器と重複しない値のいずれか）
サブネットマスク：255.255.255.0
ルータ：空欄
```

# 終わりに
対応してくださったsonyの方, ありがとうございました. 
僕と同じ症状で困ってる人の解決になれば幸いです.
Laravel5.5こと始め 〜11. Vue.jsとAPIベースのユーザ管理アプリへの認証の追加〜

# 内容
以下の順番にまとめます。
[1. MacへのXAMPP+Laravelインストール](https://qiita.com/sonrisa/items/f08112fe0ec4f51e4bdf)
[2. ユーザログイン機能の追加](https://qiita.com/sonrisa/items/207fd53eced13fc88acf)
[3. MVCとルーティングの説明]
(https://qiita.com/sonrisa/items/809adf872e6fb3657f81)
[4. ユーザリストの表示]
(https://qiita.com/sonrisa/items/929486929ed8d851a24e)
[5. ユーザリストのペジネーション表示]
(https://qiita.com/sonrisa/items/86efb8caebe207ab8fa8)
[6. ユーザ管理APIの追加](https://qiita.com/sonrisa/items/bc4894e6803632089ceb)
[7. Vue.jsとAPIベースのユーザ管理アプリの追加準備](https://qiita.com/sonrisa/items/595f080c6ecf1ed61b93)
[8. Vue.jsとAPIベースのユーザ管理アプリの追加](https://qiita.com/sonrisa/items/48a9a8e73e757c81619a)
[9. Vue.jsとAPIベースのユーザ管理アプリへのペジネーション追加]
(https://qiita.com/sonrisa/items/d58c56b638924d8c6810)
[10. APIへのJWTAuth認証の追加]
(https://qiita.com/sonrisa/items/97c1f3e8491f76dc2ce2)
[11. Vue.jsとAPIベースのユーザ管理アプリへの認証の追加](https://qiita.com/sonrisa/items/1976cbd049cadfec1285) ←いまここ

# 1.
0からDB入門！！MySQLで新規ユーザー作成と権限付与

こんにちは。
fumimi（[@fumimi](https://twitter.com/fumimi_jp)）です。

今回は、MySQLで新規ユーザー作成から権限付与についてMySQLを起動をしたところから解説をします。
MySQLに変更することは初心者の方が苦戦する項目の1つだといえます。
ターミナルを使ってコマンドラインでの操作には慣れるまで時間がかかると思います。
この記事で少しでも皆さんの学習の役に立てば幸いです。

# 対象読者
* **MySQLという言葉は知っているけど使い方がわからない**
* **MySQLの起動の方法がわからない**
* **新規ユーザー作成や権限付与がわからない**

という方を対象にMySQLで新規ユーザー作成と権限付与について解説します。

# 手順

1. MySQL起動
2. コマンドラインツール起動
3. DB（データベース）作成
4. ユーザー作成
5. DBにユーザー権限を付与（クリア）

まずは、MySQLを起動したあとにコマンドラインツールを起動します。次にDBを作成しユーザーを作成します。作成したユーザーに作成したDBの操作権限を付与します。

# 環境
* macOS High Sierra
* MySQL 5.7.21

# MySQL起動
MySQLの起動コマンドをターミナルで実行することによってMySQLを起動します。起動するには以下のコマンドをターミナル上で実行してください。

```shell-session:ターミナル
$ mysql.server start
```

起動コマンドを実行し以下のように表示されれば準備okです。

```shell-session:ターミナル
Starting MySQL
 SUCCESS!
```

# コマンドラインツール起動

MySQLをコマンドラインで操作できるようにまずはコマンドラインツールを起動します。
起動するには以下のコマンドをターミナル上で実行してください。
`[username]` のところにはユーザー名、 `[password]` のところにはパスワードを入力して実行してください。

```shell-session:ターミナル
$ mysql -u [username] -p [password]
```

## MySQLを初期インストールした状態の方

**MySQLを初期インストールした状態では、rootユーザーにパスワードが設定されていません。**
rootユーザーは、MySQLのすべての操作が行うことができますが、パスワードが設定されていないと大変危険です。
もしもこの時点でrootユーザーにパスワードが設定されていなければここで設定をしましょう。

## コマンドラインツール 起動成功

起動コマンドを実行すると以下のように表示されればokです。
この状態になればDBを操作することができます。

```shell-session:ターミナル
mysql>
```

MySQLのコマンドでは文の最後に必ず `;（セミコロン）` をつけるので気をつけてください。

# DB作成

**DBを作成する前にまずは現状どのようなDBが存在するのか確認しておくとコマンドを実行する前と後での違いが明確にわかるのでおすすめです。**

DBの一覧を表示させるには以下のコマンドを実行してください。

```shell-session:ターミナル
mysql> show databases;
```

実行すると以下のように表示されます。
このとき作成したいDBと同じ名前のDBがすでに存在しているとDBを作成するときにエラーが起こりますので注意してください。

```shell-session:ターミナル
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
```

既に存在しているDBを確認したらDBを作成するには以下のコマンドをターミナル上で実行してください。
`[db_name]` の箇所にはDBの名前が入ります。任意の文字列に書き換えてから実行してください。

```shell-session:ターミナル
mysql> creare dababase [db_name];
```

もう一度DB一覧表示のコマンドを実行してcreate文で作成したDB名が表示されていれば成功です。

# ユーザーに権限を付与

最後にユーザーにDBの操作権限を不要します。

今回は特定のユーザーに対してDBの全てのテーブルに全ての権限を与えるコマンドは以下のようになります。
`[db_name]`にはDB名、`[user_name]`にはそれぞれ任意の文字列を指定してコマンドを実行してください。

```shell-session:ターミナル
$ grant all on [db_name].* to '[user_name]'@'localhost';
```

## ホストについて

また、localhostのところはホストといってDBが存在する場所を指定します。
お使いのマシーンの中にあるDBの場合は `localhost` を指定します。
外部ホストの場合はIPアドレスなどを指定します。

# まとめ

いかがでしたでしょうか？？

初心者の方からするとエンジニアはプログラムを書くだけが仕事だと思われていた方も多いと思いますが、データベースの操作はエンジニアには必須のスキルです。

また、データベースに関連した記事はこちらもご覧ください。

[0からDB入門！！RailsのDBをMySQLに変更する方法](https://qiita.com/fumimi/items/4e4b030c1d9687cb2561)

[](
また、MySQLの操作の仕方についてもご覧ください。
)

まずは、MySQLを起動してコマンドラインツールが使えるようになるところから慣れていくとよいと思います。

内容に誤りがある場合はご連絡ください。最後までお読みいただきありがとうございました！！
Paizaスキルチェック　ランタイムエラーが発生した時

Paizaスキルチェックでコード提出時に結果詳細が出るものの、テストケースで失敗した際のヒントが
「出力結果が違います」
「ランタイムエラー発生」
のみで入力例を複数自分で試した時には問題なく動いたコードが、なぜ提出時にエラーを起こすのか確かめようがないので、たまたま突破出来た際に試したこと。

###例外処理を記述
複数箇所にて出力結果が異なるのであれば、条件分岐の記述漏れが可能性として高い。しかし一箇所のみエラーを起こしたのであれば、入力される値の条件が特殊な場合（境界値データ）にて発生した可能性が高い。
そこで

```ruby
begin
#エラーを起こす可能性のあるコード
rescue
#例外処理
end
```
処理が二箇所ある場合は、二箇所とも書いた後に提出。結果が変わらなければ、前者の例外処理記述をコメントアウト、または、後者の例外処理をコメントアウトすることで、エラーが発生した位置を提出時のエラー結果で特定することができる。
この段階でランタイムエラーが「出力結果が違います」に変わったのなら、現在例外処理を記述している部分に問題があると判明しているので、rescue以降の記述を書き換える。（例えば何も入力されなかった場合は0を出力するなど）

それでも出力結果が違うと表示された場合は、rescueに何も記述しないことで例外処理を何もしないように変更。
僕の場合はこれで提出時にエラーが発生しなくなり、突破することが出来ました。

###例外処理の記述で通ったのではなかった・・
ループを回す際の条件式にて、例外が起こる際の場合を考慮せずに記述していたことが原因でした。

```ruby
#不完全なコード
begin
while i < count
x = gets.split(" ").map! {|i| i.to_i}
array << x
i += 1
end
rescue
end
```

```ruby
#正しいコード
if m > 0 && n > 0
m.times do 
x = gets.split(" ").map {|i| i.to_i}
array << x
end
```
与えられた入力値が両方とも0であった際にエラーが起こる場合のコードですが、例外処理を記述した為に突破出来たのはrescueに何も記述していないが為にループが飛ばされ、その後の

```ruby

sum = 0
p sum
```
本来ならばループで回した計算結果を代入するところを、ループそのものが飛ばされた為に、入力値が二つも０であれば０を表示するという結果に繋がっていただけでした。
2重線が重なり合うスタイルを組むには（No 画像, Yes CSS!）

![borders.png](https://qiita-image-store.s3.amazonaws.com/0/143784/e7f4e302-0ad7-2900-0b28-de23a2201b19.png)

この画像のように、2重線が少しズレて重なっている枠線の実装に迫られましたが、
通常の`border`と`box-shadow`を少しずつずらせばcssのみで実現できました。
画像も疑似要素も使用してませんよ!!

htmlはごくシンプル。

```html
<div class="box">ここにテキストが入ります。</div>
```

構造をわかりやすくするために、ここでは枠線の色を3色に塗り替えています。
![borders_2.png](https://qiita-image-store.s3.amazonaws.com/0/143784/640a46af-bdb2-44a7-4e3d-5a9e2da467af.png)

```css
  body {
    background-color: #000;
  }
  .box {
    padding: 30px;
    color: #fff;
    border: 1px solid #caa851; //(1)中央の黄色い枠線
    box-shadow: 
                3px 2px 0 1px #000, //(2)右下の赤線を覆う枠線(背景色)
                3px 2px 0 2px red,  //(2)右下の赤い枠線
                -3px -2px 0 1px #000, //(3)左上の青線を覆う枠線(背景色)
                -3px -2px 0 2px blue; //(3)左上の青い枠線
  }
```
(1)の中央枠線から、(2)右下・(3)左上にそれぞれズラした`box-shadow`でさらに覆うことで2重の枠線っぽく描画しています。

## 参考サイト
[CSSで2重線を付ける方法と注意点](https://monochrome-design.jp/blog/572)
nature cloud apiをswagger codegenで扱おうとして苦労した話

# はじめに

Nature RemoのAPIはswaggerで記述されていて[swagger.yml](http://swagger.nature.global/swagger.yml)も取得できるので、これならクライアント部分は[swagger codegen](https://swagger.io/tools/swagger-codegen/)で作成すれば一発かなと思ったのですが、残念ながらいくつか問題があって一発というわけにはいきませんでした(だいたいは使えましたが)

# 困ったところ

## APIのパスと生成される関数名の問題

生成される関数名はパスの構成要素をcamel capsにしてつなげたものの末尾にHTTPのメソッド名をつける、という規則で生成されるようなのですが、Nature RemoのAPIのパスは全て先頭にバージョン番号をつけて`/1/appliances`のようになっているので、生成される関数名が例えば`1AppliancesGet`となってしまいました。もちろんPHPは数字で始まる関数名はアウトです。

これは`/1`の部分を`basePath`に移動させることで解決しましたが、codegen側でうまいことやって欲しいところです。単純にgetやpostなどのHTTPのメソッド名を末尾ではなく先頭にすればいいような気もしますが、後にする習慣でもあるのでしょうか。

## swagger.ymlと実際のAPIからの返却値の不一致

いくつか定義ファイルと実際の返却値でプロパティの名前が異なっているもの、enumで定義されてない値が返ってくる物がありました。生成されるコードではその辺も機械的に扱われるので値が空になったりエラーになったりします。とりあえず現物合わせでswagger.ymlを修正して対応しました。(本件についてはNature社に報告済みです)

## 一部の値がうまくデシリアライズされず空になる。

`$ref`で参照されたデータの定義がobjectでもenumでもないケースでうまくデシリアライズされずデータが参照できません。なんとなくcodegen側の問題のような気もしますが適当に改造して対応しました。

# おわりに

最終的に出来上がったクライアントが[remo-client](https://github.com/crhg/remo-client)で、これを使ってhomekitからhomebridge経由で操作するためのソフトが[http-thermostat-remo](https://github.com/crhg/http-thermostat-remo)です。

去年はAPIが提供されていなかったのでIRKit互換で使えるという情報を元にとりあえず動かしてましたが、

* リモコンの赤外線信号を温度毎に1つずつ読んで設定ファイルを作るのが大変
* nature remoのサーバを通さずに操作するのでRemoアプリに状態が反映しない

という問題があり、これらが解決して快適です。エアコン操作についてはAppleのホームアプリよりRemoのアプリの方が使いやすいのでアプリで操作するときはRemoアプリを使ってますが、homekitに対応させるのは以下のメリットがあります。

* Siriで音声コントロールできるのがやはり便利
* 朝にタイマーでエアコンをつけるのに、ホームアプリなら「家にいるときのみ」の条件をつけられるので旅行などの時も安心。
YouTube Data Api V3のC#サンプルプログラムを使用し、動画をアップロードする

# 環境
* Windows 10
* VisualStudio 2017

# 参考
.NET コード サンプル 
https://developers.google.com/youtube/v3/code_samples/dotnet?hl=ja
Google API OAuth2.0のトークン取得手順
https://qiita.com/giiko_/items/b0b2ff41dfb0a62d628b

# プロジェクト作成
ファイル→新規作成→プロジェクト
から、C#のコンソールアプリを選択。
ファイル名とプロジェクトの保存場所を入力しOK。

![image](https://qiita-image-store.s3.amazonaws.com/0/163818/dafdd19b-bc1f-dbb2-0cb3-579c81693951.png)

# YouTube Apiの取得
プロジェクト→NuGetパッケージの管理を開き、参照から「Google.Apis.YouTube.v3」を検索し、インストールする。

![image](https://qiita-image-store.s3.amazonaws.com/0/163818/803af984-62a2-368c-1b8c-7e81be2ac7d4.png)

# サンプルコードを持ってくる
https://github.com/youtube/api-samples
上記からファイルをCloneし、dotnet/Google.Apis.YouTube.Samples.UploadにあるUploadVideo.csの中身をコピーし、作成したプロジェクトにコピーする（初期だとProgram.cs）
このまま実行すると、"client_secrets.json"が無いとエラーが出るので、先程ダウンロードしたサンプルのdotnet内にあるclient_secrets.jsonをエラーが出ているパスにコピーする。

# Google Api OAuth2.0の承認情報の取得
https://console.developers.google.com
を開き、「プロジェクトを作成」を選択。
サイドバーから「ライブラリ」を選択し、「YouTube Data Api v3」を検索し、設定を有効にする。

![image](https://qiita-image-store.s3.amazonaws.com/0/163818/db63730b-b533-9ab5-c647-3fd60956ea2a.png)

次にサイドバーの「承認情報」を開き、「承認情報を作成」を選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/163818/f62d3ea0-9a39-57cf-8f40-b71a8ce58ee3.png)

作成すると、「client id」「client secret」「redirect uri」が取得できる。何も入力していない場合は「redirect uri」は"http://localhost"となる。

これらの情報を先程コピーした「client_secrets.json」ファイルに書き込む。

# 動画情報の入力
サンプルプログラムのRun()内にある以下を書き換えることでアップロードする動画の情報を変更できる。

      var video = new Video();
      video.Snippet = new VideoSnippet();
      video.Snippet.Title = "Default Video Title";
      video.Snippet.Description = "Default Video Description";
      video.Snippet.Tags = new string[] { "tag1", "tag2" };
      video.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
      video.Status = new VideoStatus();
      video.Status.PrivacyStatus = "unlisted"; // or "private" or "public"
      var filePath = @"REPLACE_ME.mp4"; // Replace with path to actual movie file.
【Swift4】UISearchBarをNavigation Barに表示させる

# はじめに
表題の通り、UISearchBarをNavigation Barに表示させたときのメモです（Swift4.0対応）。
色々調べましたが、Storyboardのみで実現することは難しいようでした。

<img width="313" alt="スクリーンショット 2018-07-19 16.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/112818/72b5df1d-1651-4fac-acb4-a5aa0727e04b.png">

<img width="314" alt="スクリーンショット 2018-07-19 16.45.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/112818/9ede9595-23fc-9145-56f2-e101abb4087e.png">

上記画像のように、編集中だけキャンセルボタンを表示するように実装します。

# コード
```swift


class SearchViewController: UIViewController, UISearchBarDelegate {

    var searchBar: UISearchBar!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupSearchBar()
    }

    func setupSearchBar() {
        if let navigationBarFrame = navigationController?.navigationBar.bounds {
            let searchBar: UISearchBar = UISearchBar(frame: navigationBarFrame)
            searchBar.delegate = self
            searchBar.placeholder = "タイトルで探す"
            searchBar.tintColor = UIColor.gray
            searchBar.keyboardType = UIKeyboardType.default
            navigationItem.titleView = searchBar
            navigationItem.titleView?.frame = searchBar.frame
            self.searchBar = searchBar
        }
    }

    // MARK: - UISearchBar Delegate methods
    
    // 編集が開始されたら、キャンセルボタンを有効にする
    func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
        searchBar.showsCancelButton = true
        return true
    }
    
    // キャンセルボタンが押されたらキャンセルボタンを無効にしてフォーカスを外す
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searchBar.showsCancelButton = false
        searchBar.resignFirstResponder()
    }

}
```

# もしキーボードが表示されなかったら
シュミレーター上で、SearchBarをタップしてもキーボードが出てこなかったのですが、
メニュー「Hardware」>「Keyboard」>「Connect Hardware Keyboard」のチェックを外すと出てくるようになりました。
（そのかわり、PCのリアルキーボードが使えなくなります）

# 参考
* [UISearchBarをNavigation Barに表示（Swift版）](https://easyramble.com/uisearchbar-in-navigation-bar.html)
* [検索時にキーボードが表示されない - stack overflow](https://ja.stackoverflow.com/questions/7056/%E6%A4%9C%E7%B4%A2%E6%99%82%E3%81%AB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84)
[] を含むURLをGETしようとするとTomcatが400を返す

# 原因

https://tomcat.apache.org/tomcat-8.0-doc/changelog.html の↓これ

>  62273: Implement configuration options to work-around specification non-compliant user agents (including all the major browsers) that do not correctly %nn encode URI paths and query strings as required by RFC 7230 and RFC 3986. (markt)

Tomcatが「みんなちゃんとしようキャンペーン」をはじめたらしい。

# 対策

http://tomcat.apache.org/tomcat-8.0-doc/config/http.html#Standard_Implementation

こちらによると、TomcatのConnectorという設定項目に`relaxedQueryChars`というパラメータをつけたりするといいらしい。
(Tomcatのことよくわかりません)

以上です。よろしくお願いいたします。

## その他

最近ってURLに `[` とか `]` とか含まない人が多いんですかね
Linux から認識されている、すべてのネットワークインターフェイス名だけを取得する

# 序
10年以上前であれば、「このデバイスドライバを使う NIC のデバイス名は xxx0 xxx1 ・・・になる 」と決め打ちできたものでした。しかし、[udev](https://tech.nikkeibp.co.jp/it/article/Keyword/20090703/333190/) の登場+各ディストリビューションがそれぞれ独自に udev 向けネーミングルールを設定し始めたことで、新規にOSをインストールする前の段階で「特定ネットワークデバイス名が最終的にどのような名前になるか」を予測することはほぼ不可能[^1]になりました。それによって10年以上前に作成された、デバイス名を決め打ち+ハードコーディングされていたシェルスクリプトや各種設定ファイルは全滅したわけです(・ω・)
端的に言えば、他の環境での実行も考慮しなければならないスクリプトなり設定ファイルなりを作り込む際には、実行環境下でOSが認識しているネットワークデバイス名を逐次取得する必要が出てきている、というわけですね。


[^1]: 同一構成のハードウェアに同一ディストリビューションを入れる場合や、RaspberryPI など、構成が固定されている組み込み系ハードの場合は予測可能

# ふつーの方法

確認したいだけならば ifconfig とか ip コマンドの出力を見れば良い。
シェルスクリプトの中で使いたい場合はやっぱりワンライナーで。
それは以下の方法で。

# 仮想/物理/論理すべてのデバイス名を取得するとき
Linux から見ればネットワークへの入口/出口でしかない「ネットワークインターフェース」ですが、その実態はループバックやらPPP接続、果ては複数NICを纏めたボンディング、ブリッジなど、マシンに物理的に刺さっているネットワークカードとは関係ないインターフェースも多数存在するわけです。

それらの名前を一覧表示させるコマンドがこちら

```shell-session
[hoge@fuga ~]$ ls /sys/class/net/
eth0  eth1  lo  ppp0
[hoge@fuga ~]$
```
上記の例は Linux ルータ上で実行した結果なので
ループバック、NIC が２枚(eth0/eth1)、PPP デバイスが存在します。


# 実際に接続されているネットワークカードの認識名のみを取得するとき

上に挙げたコマンドを実行すると、ループバックやPPPといった、ソフトウェア的に定義され、MAC アドレスを持たない論理インターフェースも含まれてしまいますが、[MACアドレスを調べたい](https://qiita.com/p_cub/items/b0b4351c52c876aaa095)ときなど、物理的にマシンに刺さっているデバイス名だけがほしい、という状況はままあります。そんなときは次のコマンド。

```shell-session
# ループバックを除外するために grep -v している
[hoge@fuga ~]$ for DEV in `find /sys/devices -name net | grep -v virtual`; do ls $DEV/; done
eth1
eth0
[hoge@fuga ~]$
```

以上
デザイナー向けGoogleMapのスタイル指定方法

GoogleMapのスタイルの指定方法が、ちょっとだけ分かりにくく感じたので、自分なりに解釈してみました。
そのときのメモ :memo:です◯

# 基本的なルール
GoogleMapのスタイルは、

- **featureType** (スタイルをあてる対象)
- **elementType**  (その対象を構成するデザイン要素)
- **stylers** (スタイル)

という3つセットをJSON形式で指定します。↓のような感じです。

```javascript
[
  {
    "featureType": "road",
    "elementType": "geometry.fill", 
    "stylers": [{ 
        "color": "#ff0000"
      }
    ]
  }
]
```
# featureType、elementType、stylersとは
3つセットのうち、stylersはなんとなく想像できますが、 featureType、elementTypeはいまいちピンと来ない方もいるかと思います。
GoogleMapAPIの [Style Reference](https://developers.google.com/maps/documentation/javascript/style-reference?hl=ja)を見た私なりの解釈は以下のような感じです。

- **featureType** (スタイルをあてる対象)
    - 地図上の**どこ**を変えるのか指定するためのもの。
    - 道路、公園、水域など、地図上の地理的特徴(feature)で指定できるのが特徴です◯
- **elementType** (その対象を構成するデザイン要素)
    - 上記で指定したfeatureTypeの**どの部分**を変えるのか指定するためのもの。
    - 塗り、線、テキストカラーなどです。
- **stylers** (スタイル)
    - 上記で指定した、どこのどの部分を**どうするか**を指定するためのもの。
    - 色は赤、色相はこれくらい、彩度は80・・・などです。

具体的にどんな指定ができるかは、[Style Reference](https://developers.google.com/maps/documentation/javascript/style-reference?hl=ja)で詳しく説明してくれています◯

## cssに例えてみると・・・

なんとなくcssに似てるかしらと感じたので、cssに例えて解釈してみました。
というのも、cssも

- **セレクター**(スタイルをあてる対象)
- **プロパティ**(対象を構成するデザイン要素)
- **値**

の3つセットで指定しているところが似ているからです。

例えば、cssで `.road` というclassを持つ要素の塗りを変えるには以下のようになります。

```css
.road { /* セレクター */
    background: #ff0000; /* プロパティ:値; */
}
```
これをGoogleMapAPIで実現するには、↓のような感じです◯

```javascript
[
  {
    "featureType": "road", //featureType
    "elementType": "geometry.fill", //elementType
    "stylers": [{ //stylers
        "color": "#ff0000"
      }
    ]
  }
]
```

まとめると

- featureType → セレクター
- elementType → プロパティ
- stylers → 値

のように捉えると、少し分かりやすいのかなあと。

ただ、cssとGoogleMapは別物なので、上記のような捉え方は少し語弊もあるかもしれません。
あくまで、雰囲気をつかむための解釈の一つと思っていただければと思います◯

ちなみに上記の結果は↓のようになります。

![スクリーンショット 2018-07-19 13.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/48544/00ce3e28-7bd7-a35b-260d-2203bef2b978.png)


道路の塗りが赤になっていますね◯

# もっとスタイルを変えるには
css同様、featureType、elementType、stylersの3つセットを複数書けば、それだけ多くのスタイルを指定できます。

```javascript
[
  {
    "featureType": "road", 
    "elementType": "geometry.fill",
    "stylers": [{ 
        "color": "#ff0000"
      }
    ]
  },{
    "featureType": "water", 
    "elementType": "geometry.fill",
    "stylers": [{ 
        "color": "#3399ff"
      }
    ]
  },
    . . .
]
```
また、featureType、elementTypeを指定しないこともできます。
この場合は、全てのfeatureType、全てのelementTypeがそれぞれ指定されます。

## 参考
- 公式リファレンス
    - [Google Map Style Reference](https://developers.google.com/maps/documentation/javascript/style-reference?hl=ja)
- 簡単にスタイルを変えられる便利なサービス
    - [Styled MapWizard](http://www.dwzone-it.com/StyledMapWizard/StyledMapWizard.asp) 
    - [SNAZZY MAPS](https://snazzymaps.com/)
Ecripse(STS)の設定覚書

私が環境構築時にいじる設定です。
他に何かおすすめなどあれば教えてくださると喜びます。

### 文字コード（文字化けする！）
[ウインドウ]>[設定]>[一般]>[ワークスペース]
\>\>「テキスト・ファイル・エンコード」の「その他」にチェックして「UTF-8」を選択
### フォントサイズ（文字がちっちゃい！）
[ウインドウ]>[設定]>[一般]>[外観]>[色とフォント]
\>\>「テキスト・フォント」をダブルクリックし、サイズを12に変更
### 行番号（ソースの行数が知りたい！）
[ウインドウ]>[設定]>[一般]>[エディター]>[テキスト・エディター]
\>\>「行番号の表示」にチェック
### フォーマッター
[ウインドウ]>[設定]>[Java]>[コード・スタイル]>[フォーマッター]
\>\>「インポート」からフォーマッターを選択
### 保管アクション
[ウインドウ]>[設定]>[Java]>[エディター]>[保管アクション]
\>\>「保管時に選択したアクションを実行」にチェック
\>\>「ソース・コードのフォーマット」にチェック
### パッケージエクスプローラー
パッケージエクスプローラー上部の▽>[パッケージ・プレゼンテーショ]
\>\>「階層」を選択
第13回 Tokyo Jazug Night 参加メモ

## セッション
セッションの動画は後日↓こちらで公開されるそうです。
https://crash.academy/lecturer/jaz.ug
「Xamarin.Forms」「Durable Functions」どちらもライブコーディングを
行いつつのわかりやすいセッションでした。
スライドはすでに公開済みで、connpassのページからたどれます。
https://jazug.connpass.com/event/92253/

### Xamarin.Forms
Mac、Windows、Ubuntuで動くアプリをライブコーディングで作成。
ちょっと試してみたい人には、非常にわかりやすいと思いました。

### Durable Functions
こちらもライブコーディングで Durable Functions に必要なクラスを作成
ちょっと特殊なDurable Functionsの動作を、デバッガで追いながら説明していました。

## LTで気になったもの
・AzureストレージアカウントにStatic Website Hosting 機能が追加されている。
　（ただし、まだパブリックプレビュー）
　Azureストレージにhtmlファイルを置けばサイトを構築できる。
　手順は、公開されているスライドに。
　
　世の中、静的サイトジェネレーターが流行中。
　https://ferret-plus.com/9413
　「VuePress」Vue.js公式の静的サイトジェネレーター

・Bot Builder tools
　Botフレームワーク関連のCLIツール（こちらも、まだプレビュー）
　https://github.com/Microsoft/botbuilder-tools
　Webのコンソールからポチポチやらなくても済むようになる。
Google Cloud Functions で Go を使おう！2

# 注意
今 Google Cloud Functions (GCF) はまだベータで、まだアメリカしか使えなくて、まだNodeJSしか使えませんから、将来にいつかこの方法を使えなくなるかもしれませんが、やってみよう！

# 序説
半年くらい前に、Go で Google の Function as a Service を使うことを書きましたけど、ウェブのトリガーしか使えませんでした。でも、ついに、私の PR が受け取られました！

もし前の記事を読まなかったら、是非この[リンクをクリックして読んできて](https://qiita.com/ssttevee/items/83cfbf43790d814f0484)ください。

さて、すぐコードを見てみよう！

# コード
新しいことはプロジェクト内の `events` のサブパッケージです。

`main.go` でインポートすると Storage Bucket や PubSub Topic のトリガーを使えます。

```go
import "./events"
```

それから、ウェブリクエストのように準備します。

```go
// Storage Bucket のトリガー
http.HandleFunc(nodego.BucketTrigger, events.Handler(func(event events.Event) error {
	obj, err := event.StorageObject()
	if err != nil {
		return err
	}

	nodego.InfoLogger.Printf("%s は最後に %s に更新されました。", obj.Name, obj.Updated)

	return nil
}))

// PubSub Topic のトリガー
http.HandleFunc(nodego.PubSubTrigger, events.Handler(func(event *events.Event) error {
	msg, err := event.PubSubMessage()
	if err != nil {
		return err
	}

	nodego.InfoLogger.Printf("メッセージは: %s", msg.Data)

	return nil
}))

// カスタムのパース方法
http.HandleFunc("/", events.Handler(func(event *events.Event) error {
	// event.Data は `[]byte` から何でもパースできます。

	// 例：
	var obj SomeStruct
	if err := json.Unmarshal(event.Data, &obj); err != nil {
		return err
	}

	// 何とか obj を使う

	return nil
}))
```

完成の例は [examples のフォルダー](https://github.com/GoogleCloudPlatform/cloud-functions-go/blob/master/examples)に入っています。

それで、前の記事のステップ通りにテストやデプロイします。

# まとめ

今、うちの会社は半年以上幾ファンクションも Go で書いて GCF にデプロイされています。コードの速さは確かに NodeJS のほうが速いけど、ランタイムの速さは Go が NodeJS に絶対に負けません。

何か問題があったら、コメントで入れてください。

# 終わり

Thanks for reading!

読んでくれてありがとう！
Swift4.2の新機能メモ

# 目的
Swift4.2で追加された機能を確認できるようにメモ（更新予定）

# 新機能一覧
## Dynamic Member Lookup
Dictionaryを.演算子で参照できる。完全にタイプセーフ。subscriptのSyntaxSuger

```swift
let title = dic["title"]
↓
let title = dic.title
```

将来的に動的型付け言語との相互運用を考えている。
ネクストアクションはPythonのコードをswiftでかけるようにすること。
詳細は下記proposalで。
https://github.com/apple/swift-evolution/blob/master/proposals/0195-dynamic-member-lookup.md

## allSatisfy
リファレンス：https://developer.apple.com/documentation/swift/array/2994715-allsatisfy

全ての値をチェックするメソッド。
今までは下記のようにチェックするしかなかった。

```swift
// every element is 9
!nums.contains { $0 != 9 }
// every element is odd
!nums.contains { !isOdd($0) }
```

しかし、これは可読性が低く、実装者も思いつきにくい。結局forループなどを使ってやってしまう。そのため追加された。

```swift
nums.allSatisfy(isOdd)
```

## MemoryLayout().offset(of:)
値へのポインタとフィールドへのポインタ間のバイト単位の距離を示す
【参照】MemoryLayout()について
https://qiita.com/ysn551/items/3995c782a92517e86903

## CaseIterable
リファレンス: https://developer.apple.com/documentation/swift/caseiterable

列挙型は有限のケースをもっているが、需要に対してそれらの処理がない。
例えば、全てのケースを列挙したり、ケースの数を取得したり、rawValueの最高値を取得したりしたい場合があります。
今回CaseIterableという有限の列挙可能な値の集合を持つことを示すプロトコルを導入した。

```swift
enum Ma: CaseIterable { case 马, 吗, 妈, 码, 骂, 麻, 🐎, 🐴 }

Ma.allCases         // returns some Collection whose Iterator.Element is Ma
Ma.allCases.count   // returns 8
Array(Ma.allCases)  // returns [Ma.马, .吗, .妈, .码, .骂, .麻, .🐎, .🐴]
```

【注意点】
▼ CaseIterableのプロトコルに準拠させるためには以下の条件を満たさなければなりません。
    1. enumはassociated valueを含まないcaseのみで構成されていること。
    2. enumの宣言時に明示的にCaseIterableを適用させること。



▼ C/Obj-Cヘッダーからインポートした列挙型はCaseIterableに準拠できません。
▼ available属性のunavailableを宣言されたcaseはallCasesに含まれません。
▼ extensionではCaseIterableに準拠できません。オリジナルの宣言時に適合してください。
2018 年 Apple iTunes Store 特急申請までの道案内


#はじめに

他の方の記事をいろいろ見ても迷子になったので、自分の防備録がてらメモしておきます。

#Contact us?

この記事からリンクを飛ばしていますが、参考になるサイトを見ていると、「iTunes Connectにログインした際に1番下にあるContact Us」　へ飛ぶ　とこのことですが。
「Contact us」がどこにあるのか･･･と探すと
「連絡先」という文字が･･･！（小さくてぜんぜん見つからなかった）

![connectuAs.JPG](https://qiita-image-store.s3.amazonaws.com/0/200222/200ce6eb-42a9-a58d-4041-3bbb00c6639e.jpeg)

「連絡先」　→　「お問い合わせ」
多分翻訳の統一が出来ていないだけですが、これがContact usですね。

#Appの優先審査までの道

![Apple devpaasge.JPG](https://qiita-image-store.s3.amazonaws.com/0/200222/ea73f381-161b-bf1b-130b-517c3f1f8fbc.jpeg)

画面の中から「App Review」を選択、次へ進みます
(スクリーンショットは古いので「Appの審査」になっています)

![appvreedcae.JPG](https://qiita-image-store.s3.amazonaws.com/0/200222/f7ebe7a6-2ad4-3fa1-9743-8dda25c2edb7.jpeg)


ここで、優先審査のリクエストを選択すると、次の画面へ遷移し

![yuusenn.JPG](https://qiita-image-store.s3.amazonaws.com/0/200222/ff9e40bd-9164-5fc8-8fdd-571e5508943c.jpeg)



#あとはこちらと同じです。
https://qiita.com/tatetate55/items/74beabf57f902625e84a


#が、

少しフォームが違うかもなので、一応スクショ

こちらのフォームを埋めればOKです。

![contctform.JPG](https://qiita-image-store.s3.amazonaws.com/0/200222/7d76105b-4a1f-e17a-6b0e-f573bd7fe1af.jpeg)
AI

ここ数年よく聞くAI
そもそもこの言葉ができたのは62年前と聞いて驚きました
AIはartificial intelligenceの略でartificialは人工的なという意味

人工知能とは、人間の脳が行っている知的な作業をコンピュータで模倣したソフトウェアやシステム。

人工知能にできること
情報収集
認識(文字認識、音声認識、画像認識、動画認識)
記録(情報の解析、分類)
予測(ニーズ予測、動向予測、早期における異常検知、検索意図の予測)
選択(マッチング、提案)
作業プロセスの最適化(効率化)
作業の自動化
自己学習

人工知能にできないこと
憧れや尊敬の対象となるカリスマ性
先頭に立って前に突き進んでいくリーダーシップ
過去に全く存在しない事例への対処
驚きやひらめきによる爆発的な発想
0から1を生み出す

AIの登場により今後20~30%の仕事がなくなるといわれていて、AIは少し怖いイメージがありますが、役に立っている部分もあります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249275/3a38cd9d-7716-900d-4bac-996938e2ef4f.png)
AIが将来自分たちにどう影響を与えるかも調べてまとめたいと思いました
古くて新しいデータ中心の世界

データ中心システム設計 単行本 – 1988/3　堀内 一 (著)
からザクッとデータ中心アプローチについて

#序章
データを制する者は世界を制す！

・人類がここまで進化できた決定的な理由は
　他の生き物とは比べ物にならないほどの情報処理能力
　人間は言葉を得、文字を得、通信を得て、記憶量、記憶時間、記憶範囲を拡大してきた。
・データ（情報）は会社や社会にとって重要な資源
・ＩＴ関係者の最終生産物はシステムではなく情報
・世の中の仕組みが激しく変化しても、データ自体はそれほど変わらない。変わるのはそのデータの扱い方
・DOAは世の中の変化に強いシステムを構築しやすい
・中心アプローチという言葉の意味
　開発成果物が網の目のように関係しあう状態から核を中心に放射状に成果物が存在する形態
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239224/e0942ed6-cb5d-0af5-1bd2-cc584780fdb6.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239224/4ccb87d4-1596-635d-a9c1-650b524aa6d5.png)

・インテグリティコントロール：自由さを制限すること
　なんでもできる言語ほどバグやメンテナンスが大変
・ルールや規則による統制ではなく、制限する仕組みで統制する　⇒　Private属性など
・システム開発・運用における統制のフレームワーク
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239224/2689926c-e6e0-b754-d35b-3eb58c26f6e5.png)
　 参考：P12より引用
　統制機構：システム化のすべての作業とネットワークやデータなどすべての資源を規定
　統制原理：情報システムの開発・運用に関する統制憲法
　監査機構：統制機構を評価する監査基準を持つ

・情報生産活動の最終製品としての情報の多様性を吸収するために、部品としてのデータを標準化し、共有化を図る
・作り方を論ずる前に何を作るべきかを論ずるべき　何＝情報　情報が規定されれば部品が明確になり、最終製品とは独立して部品作りが可能になり分業が進む
・最終製品の仕様が変化しても、その被害を受けるのは組み立て工程のみ
・データインテグリティの確保：DOAはデータと処理をカプセル化
・データ標準化の意味：不特定多数の人間の作業内容を規定するより、作業の対象となるものを規定するほうが早い

・DOAシステムの制御構造
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239224/651e6d86-4f19-006e-edfe-2cd800807650.png)
 参考：P120より引用


#第１章
DOAの達成レベル
・業務規程レベル
　業務用件に従って、データと機能を規定する
　業務が違えば、同じデータでも重複して持つ
　ユーザー要件に振り回される
・資源規定レベル
　データ要件に従って、業務や機能を規定する
　データ要件は不変
・部品中心主義
　ハードウエアの生産方式
　最終製品の多様化を吸収するために部品を標準化し、共有化を図る
　現在のソフトウエア部品化では業務要件の多様化には対応できない
・生産システムの標準化のアプローチ
　→生産活動＝作り方を規定する
　　設計やプログラムの標準化
　　主体が人間　思考に依存　思考を完全に制御できる方法はない
　　成果を測る基準の客観化も困難
　→作るべき対象物を規定
　　作り方を論ずる前に何を作るべきかを論ずるべき
　　作るもの＝情報でしょう！
　　データは外部の実体を表現したもの
　　外部の実体の特性とそれを支配する物理法則を調べることで設計が可能
・部品中心の生産形態では
　部品工程を最終製品と切り離すことが一つの目的になる
　最終製品と無関係に部品は部品として独立に生産可能
　これにより
　分業が可能、最終製品の仕様変更、多様化の影響を最小限に

#第２章
データの標準化
・目的
　データの重複排除
　識別可能性
　認識可能性
　安定性
・体系化
　実体
　属性
　ドメイン
・ＤＤ/ＤＳ
　部品表
・抽象化
　特化
　汎用化
　is-a：継承関係
　part-of：包含関係
・正規化
　第１正規化：繰り返し項目の排除
　第２正規化：従属関係の分離
　第３正規化：導出関係の排除

#第３章
一貫性制約の組み込み
・ＤＬＣＰ
　Data Life Cycle Process
　データの　生成、更新、参照、削除　処理
・カプセル化
　正規化した実体ごとにデータとＤＬＣＰと一貫性制約をカプセル化してデータ部品として共有化
　カプセル化したデータ部品を抽象化機能により継承関係、包含関係で整理・体系化
・トランザクション制御
　カプセル化したデータ部品の組み合わせを制御
　業務依存のトランザクション制御部とデータ部品を分離することで
　業務の変化を吸収
・データ制約のレベル
　ドメイン制約：データごとの単位、日付や長さを表す形式ごとの制約
　データ項目制約：実体ごとの制約
　レコード（リレーション）制約：データ項目間の組み合わせ制約
　ファイル（データベース）制約：ＤＢＭＳの物理的制約
　データ間制約：他のデータの制約によって影響を受ける関連制約

#第４章
ＤＯＡシステム
・業務制御クラス
　対話制御クラスの組み合わせを制御してシステム業務要件を実現する
・対話制御クラス
　トランザクションクラスの組み合わせを制御してＵＩ要件を実現する
・トランザクションクラス
　データ部品の組み合わせを制御してデータ要件を実現する


#参考
<a href="https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E4%B8%AD%E5%BF%83%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88-%E5%A0%80%E5%86%85-%E4%B8%80/dp/4274074056/ref=sr_1_18?s=books&ie=UTF8&qid=1531984024&sr=1-18&refinements=p_27%3A%E5%A0%80%E5%86%85+%E4%B8%80">
データ中心システム設計 単行本 – 1988/3
堀内 一  (著)
</a>
Ωß√∞†π…キーボードで打てますか？MacでOption⌥を使って特殊記号入力

キーボード上にない記号を打たなきゃいけない時ってありますよね。
例えばMacだとバックスラッシュ`\`を`Option⌥+P`で打ったことのある方は多いと思います。
`Option⌥`キーを使って打てる他の特殊文字も気になったので、今回はチートシートにまとめてみました。

# チートシート
![magic-keyboard-jis.jpg](https://qiita-image-store.s3.amazonaws.com/0/171028/b0467193-7b0d-14aa-7cab-68dedd8b2bac.jpeg)
`Option⌥`キーを押しながら各キーを押すと、右上に赤く表示されている文字が打たれます。
ちなみに、右下に❷が付いているキーは二回押さないといけません。例えば`¨`は`Option⌥+UU`で打てます。
…, ∞, πなどの人によっては使いそうなものから、¶, §などなんのために使うのかよくわからない記号まで様々ですね。
# 遊んでみた
せっかくなので特殊文字たちを使って遊んでみました。
前々から`git`の三文字を打つのがめんどくさかったので、これをΩで置き換えてみます。
`.bash_profile`を開き、以下のように追記します。

``` :.bash_profile
alias Ω='git'
```

これを`source`で反映させます。

```bash
$ source ~/.bash_profile
```

成功しているか確かめてみましょう。

```bash
$ Ω version
```

```bash
git version 2.14.3 (Apple Git-98)
```

やりました！これで`Ω commit`や`Ω push`といったコマンドが使えます！
皆さんも是非特殊文字で遊んでみましょう。

(なお、この結果は僕のMacとキーボード(JIS配列)で実験した結果です。全ての端末での結果を保証するものではありません。)
Docker image (Debian) に openjdk8 をインストール

# Dockerイメージに OpenJDK8 を入れようと思って失敗した

node のビルドに使っている docker image で javaのビルドも走らせる必要が出てきた。
ベースは Debian なので、適当にググって以下のように書く。


`Dockerfile`

```dockerfile

FROM node:6-slim
RUN echo "deb http://http.debian.net/debian jessie-backports main" > /etc/apt/sources.list.d/backports.list && \
    apt-get update -y && \
    apt-get install -t jessie-backports openjdk-8-jdk -y
```

しかし、docker build するとエラーとなる。悲しい。

alpine も検討したが、色々使いたいパッケージが入っていなかったりしたので Debian で何とかしたい。

## 解決法

openjdk 入れる前に **`mkdir -p /usr/share/man/man1`** する。

```dockerfile

FROM node:6-slim
RUN mkdir -p /usr/share/man/man1
    echo "deb http://http.debian.net/debian jessie-backports main" > /etc/apt/sources.list.d/backports.list && \
    apt-get update -y && \
    apt-get install -t jessie-backports openjdk-8-jdk -y
```

しかし、色々必要なパッケージを詰め込んだら image のサイズが 1.4GB になってしまった。
まあ開発用の docker image だし、重い docker image 殺すマンも許してくれるはず。


## 参考

["Errors installing OpenJDK due to unexistent man pages directory · Issue #273 · resin-io-library/base-images"](https://github.com/resin-io-library/base-images/issues/273)
raspberry piでフルカラーLEDを扱う IoT編（その１ pigpio）

# はじめに

以前、「raspberry piでフルカラーLEDを扱う」という記事を書きました。
https://qiita.com/kei0425/items/7033cd716f3b818252b4

しかし、インターネットにつながっていなかったため、ちゃんとIoTにしたいと思います。

# 前提条件

ラズパイ

+ raspberry pi 3
+ Raspbianインストール済み
+ jupyter notebook インストール済み（ポートは8888以外に変更）
+ pigpioインストール済み（Raspbianならインストールされているはずです。）

パーツ類

+ フルカラーLED
+ ブレッドボード
+ 抵抗３つ
+ オスメスジャンパーワイヤー5本
+ オスオスジャンパーワイヤー4本

# おさらい Lピカ

まずは、LEDを光らせます。

ラズベリーパイのGPIOは以下になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/13d7a5f0-5077-24d9-8f7c-b7337a859221.png)

## 配線

配線図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/0ab83bc4-f377-e6bf-f0f1-6040e82c2b2f.png)

Tickercadを利用しているため、ラズパイがなく、Arduinoになっています。ごめんなさい。

3.3Vはラズパイの1PIN、GNDはラズパイの6PINと考えてください。

ポイントは以下になります。

+ 最初にブレッドボードの外側の+-にはとりあえず、電源（今回は3.3V、5Vの場合もあり）とGNDを接続する。他のパーツの電源とGNDに接続したい場合にはそこからオスオスジャンパーワイヤーで接続。
+ 配線図の赤丸の部分は順番に刺したり抜いたりして、いろいろな色を光らせてみる。
+ ここで光らない場合は、GPIOで光らせようとしてもきっとうまくいかないので、しっかりはっきり光るまで調整する。

※とはいいながら、面倒だったら3.3Vは直接j2に刺しても問題ありません。

# Lチカ

ちゃんと光ることが確認できたら今度はGPIOを使ってプログラムで制御します。

## 配線

配線図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/882c019b-7921-6459-ce4e-a413034afd14.png)

ここでも、Arduinoですみません。

A2,A3,A4はそれぞれ、GPIO2(3PIN),GPIO3(5PIN),GPIO4(7PIN)と読み替えてください。

ラズベリーパイのGPIOはピンなので、オスメスジャンパーワイヤーに差し換えてください。

## プログラム

まずは、今回はpigpioを利用しているので、デーモンを起動します。
jupyter上では、!でシェルコマンドを実行できるので以下のようにします。

```bash
!sudo pigpiod
```

その後、初期設定を行います。

```python
import pigpio
赤PIN = 2
青PIN = 3
緑PIN = 4

pi = pigpio.pi()
pi.set_mode(赤PIN , pigpio.OUTPUT)
pi.set_mode(青PIN , pigpio.OUTPUT)
pi.set_mode(緑PIN , pigpio.OUTPUT)
```
その後１セルに以下を１つづつ入力して実行してみてください。

```python
pi.write(赤PIN, 0)
```
```python
pi.write(赤PIN, 1)
```
```python
pi.write(青PIN, 0)
```
```python
pi.write(青PIN, 1)
```
```python
pi.write(緑PIN, 0)
```
```python
pi.write(緑PIN, 1)
```
セルの実行毎にLEDの色がついたり消えたりそのままだったりしたと思います。
最後まで実行すると、LEDが消えているはずです。

0を指定すると点灯し、1を指定すると消灯します。

好きなセル実行して、いろいろ試してみましょう。

# PWMで中間色

次はPWMを利用して中間色を出してみます。

```python
from time import sleep

FREQ = 50 # 
RANGE = 100

p = [赤PIN, 青PIN, 緑PIN]

for i in range(3):
    pi.set_PWM_frequency(p[i], FREQ)
    pi.set_PWM_range(p[i], RANGE)
```

FREQは周波数、RANGEはPWMの範囲を表します。

その後、以下を実行すると、赤が薄暗くつきます。

```python
pi.set_PWM_dutycycle(赤PIN, 90)
```

数値をいろいろ変更して実行してみてください。（同じセルで直接修正すると楽です。）

# グラデーション

最後にこちらを実行してください。

```python
d = [0, 0, 0]
r = [3,5,7]
while True:
    sleep(0.1)
    for i in range(3):
        pi.set_PWM_dutycycle(p[i], d[i])
        d[i] += r[i]
        if d[i] >= RANGE or d[i] <= 0:
            r[i] *= -1
            d[i] += r[i]
```

LEDがさまざまな色に変化するのが分かると思います。

firebaseとの接続は次回に続きます。
スマホのブラウザで画像を圧縮してポストする

この記事は
===

* スマホのブラウザで画像を圧縮する手順メモです

したかったこと
===

* スマホでブラウザから画像をアップロードさせたかったです
* 最近の高性能カメラだと画像サイズが大きすぎて非常に重くなってしまいました
* サーバサイドで圧縮する方式だと結局アップロードの通信量は変わらないから効果がありません

対処
===

* ブラウザ上で画像を圧縮して対応することにしました
* [image-comporessor](https://github.com/xkeshi/image-compressor)というJavaScriptライブラリを使います
* 内部的にはCanvasとか使って圧縮をしているみたいです
* 別にスマホじゃなくてもモダンブラウザなら動きます

対処コード
===

* FormDataオブジェクトを生成
    * Ajax送信でのみ利用できる操作しやすいFormオブジェクトみたいなもの
    * FormのDOMを渡して生成する
* ```input　type=file```から画像ファイルオブジェクトを取得して、ImageCompressorに渡して圧縮
  * 圧縮に成功した場合は、FormDataオブジェクト内の画像データを圧縮後のものにすげかえる
  * 圧縮処理は非同期になるので、複数圧縮する場合はPromiseに包んだ上で、Promise.allを使って同期的にする
* 普通にFormDataをajaxでPOSTする

ちなみにここでは、圧縮失敗した場合は元のデータのまま送信させたいので、rejectせずにresolveさせています

```javascript
function postWithFiles(){
  // 画像圧縮処理を行う
  var fd = new FormData($('#form_id').get(0));
  var promises = []
  $('.file-input').each(function(index, input){
    // 画像圧縮のPromiseを画像数だけ生成
    var promise = new Promise(function(resolve, reject) {
      var file = input.files[0]
      if(file){
        const compressor = new ImageCompressor()
        compressor.compress(file, {
          quality: .6,
          width: 640,
          success(result) {
            // 圧縮前の画像データを除去する
            var inputName = $(input).attr('name');
            fd.delete(inputName)
            // 圧縮後の画像データを追加する
            fd.append(inputName, result, result.name)
            // 既存のアップロードinputのDOMも削除する
            input.remove();
            resolve();
          },
          error(e){
            // 圧縮失敗の場合はそのまま圧縮しない
            resolve()
          }
        })
      } else {
        // ファイルが選択されていない場合も一旦resolve
        resolve()
      }
    })
    promises.push(promise)
  })
  // 全てのPromise(=画像圧縮)に成功(resolve)の場合はPOSTする
  Promise.all(promises).then(function(values){
    $.ajax({
        url: "/xxx/create",
        type: "POST",
        data: fd,
        processData: false,
        contentType: false
    })
    .done(function( data ) {
        alert('保存完了！')
    });
  })
}
```

終わりに
===

* ブラウザで画像圧縮なんてできるわけないわーとか思ってたけどできたなー
IBM Watson Assistant 2018-07-10 を Java SDK から呼んでみる。

Watson Assistant 2018-07-10 では、レスポンスのタイプに「Option」などを指定できるようになりました。「Option」は、HTMLでいうラジオボタンのようなもので三択や四択といった選択肢を簡単に作ることができる機能です。

それを Watson API Java SDKから呼ぶとどうなるのか？を試してみました。
結論からいうと執筆時点のSDKでは新しい機能にまだ対応できていないようです。従来は text[] として返ってきたところが、generic として返ってくるようです。
生のJSONをパースしてやる必要がありそうです。

■画像

![assistant01.png](https://qiita-image-store.s3.amazonaws.com/0/110265/9e254208-32b1-4f77-76f5-d97b15b9b0ba.png)

■参照(執筆時現在、ページ下部から「English」を設定しないと読めません)

https://console.bluemix.net/docs/services/conversation/release-notes.html#12July2018

■API Document

https://www.ibm.com/watson/developercloud/assistant/api/v1/curl.html?curl#versioning

■コード

```java

		String version = "2018-07-10";
		String username = "xxx";
		String password = "xxx";

		String workspaceId = "xxx";

		Assistant service = new Assistant(version);
		service.setUsernameAndPassword(username, password);

		InputData input = new InputData.Builder("Hi").build();

		// MessageOptions options = new
		// MessageOptions.Builder(workspaceId).input(input).build();
		MessageOptions options = new MessageOptions.Builder(workspaceId).build();

		// sync
		MessageResponse response = service.message(options).execute();
		System.err.println(response);

		System.err.println("---");

		System.err.println(response.getOutput().getText());


```

■結果

```javascript
{
  "output": {
    "generic": [
      {
        "title": "",
        "options": [
          {
            "label": "Value1",
            "value": {
              "input": {
                "text": "value1"
              }
            }
          },
          {
            "label": "Value2",
            "value": {
              "input": {
                "text": "value2"
              }
            }
          },
          {
            "label": "Value3",
            "value": {
              "input": {
                "text": "value3"
              }
            }
          }
        ],
        "response_type": "option"
      }
    ],
    "text": [],
    "nodes_visited": [
      "ようこそ"
    ],
    "log_messages": []
  },
  "input": {},
  "intents": [],
  "entities": [],
  "context": {
    "conversation_id": "xxx",
    "system": {
      "dialog_stack": [
        {
          "dialog_node": "root"
        }
      ],
      "dialog_turn_counter": 1.0,
      "dialog_request_counter": 1.0,
      "branch_exited": true,
      "branch_exited_reason": "completed"
    }
  }
}
---
[]
```
MacでPythonのローカル開発環境構築のためのAnacondaのインストール

# はじめに

Pythonのローカル環境構築のためにAnacondaをダウンロードします。
2018/7/19現在は、以下のバージョンがインストール可能です。

Anaconda3 5.2.0 MacOSX

# インストール手順

まずは、以下のサイトに移動し、Download Nowをクリックします。
https://www.anaconda.com/distribution/
![スクリーンショット 2018-07-19 15.04.08.png](https://qiita-image-store.s3.amazonaws.com/0/272046/3b5b3a2f-137b-96f6-a2e0-5737c091dbba.png)

Python3.6、Python2.7用のダウンロード画面が表示されます。今回は、Python3.6のインストーラを用いてダウンロードします。「64-Bit Graphical Installer (613 MB) 」をクリックします。
![スクリーンショット 2018-07-19 15.03.34.png](https://qiita-image-store.s3.amazonaws.com/0/272046/1c5bb91a-6e0a-fb68-78bd-c790b928dedd.png)

以下のインストーラをクリックします。
Anaconda3-5.2.0-MacOSX-x86_64.pkg


画面の指示に従って、「続ける」をクリックします。
![スクリーンショット 2018-07-19 15.06.40.png](https://qiita-image-store.s3.amazonaws.com/0/272046/16419702-71f9-0b70-390f-cbefe468fbcd.png)


使用許諾を読み、同意する場合は「同意する」をクリックします
。
![スクリーンショット 2018-07-19 15.07.37.png](https://qiita-image-store.s3.amazonaws.com/0/272046/63c62afb-4ea6-a5d5-b2d7-d7dd4c9dc0e3.png)


インストール先を変更する場合は、「インストール先を変更」をクリックします。「インストール」をクリックするとインストールが始まります。
![スクリーンショット 2018-07-19 15.07.48.png](https://qiita-image-store.s3.amazonaws.com/0/272046/b01da728-8210-390c-a574-937347df5856.png)

数分待ちます。
![スクリーンショット 2018-07-19 15.09.35.png](https://qiita-image-store.s3.amazonaws.com/0/272046/8a5b44cb-2a19-29f7-3c82-3a04d6e9be9d.png)

Microsoft Visual Studio Codeのインストールをする画面が表示されます。インストールの必要がない場合は、「続ける」をクリックします。
![スクリーンショット 2018-07-19 15.14.32.png](https://qiita-image-store.s3.amazonaws.com/0/272046/9a0b6d01-d2a5-8d25-0afa-8872a3df868f.png)

下の画面が出力されたら、インストールが完了します。
![スクリーンショット 2018-07-19 15.15.21.png](https://qiita-image-store.s3.amazonaws.com/0/272046/c017643c-5e2d-1fcd-cb34-a0d0514a3765.png)

# 確認
Anacondaのパッケージを管理するためのAnaconda Navigatorがインストールされていることを確認します。
![スクリーンショット 2018-07-19 15.42.06.png](https://qiita-image-store.s3.amazonaws.com/0/272046/05f37945-3ead-ba5f-21d6-5c2ef5bccc01.png)

ターミナルで以下のコマンドを入力し、Pythonのバージョンなどを確認します。

```
# python --version
Python 3.6.5 :: Anaconda, Inc.
```
```
# which python
/anaconda3/bin/python
```