OmniAICreator/Qiita-1.07M huggingface dataset:
nuxt.js(v2)の作業ディレクトリを整理

![before-after.png](https://qiita-image-store.s3.amazonaws.com/0/217743/00a9e64b-d110-d823-2fd6-1ba0c801438e.png)

■更新履歴

- 2020/2/5 nuxt.js(2.11.0)/create-nuxt-app(v2.12.0)で動作を確認。言い回しを修正。
- 2019/3/6 Nuxt.js(v2.4.3)にて他フレームワークとの影響を確認。一部文言修正。

---

Nuxt.jsは、インストール`npx create-nuxt-app`時に、サーバーサイドやUI、また、テスト用のフレームワークを選んで追加インストールします。

便利ですばらしいのですが…

ディレクトリ数が増えるため、疲れてくると軽微なミス（ファイル格納場所間違いなど）が発生しやすくなります。また、初学者は知らないディレクトリが並んでいることに拒否反応が起きることもあるので、基本作業ファイルを一つのディレクトリ(srcディレクトリ）にまとめます。
規模が大きくなってからの対応が厳しいので、プロジェクトスタート時の変更をお勧めします。

### 1.nuxt.config.jsに作業ファイルの変更内容を追記

```js
module.exports = {
  srcDir: 'src/', // <-追加
  //...
```

### 2.作業フォルダをまとめる

ルートディレクトリに```src```ディレクトリを作成して、Nuxt.js指定フォルダを移動```src``` ディレクトリ内に移動

Tips:[公式ドキュメント](https://ja.nuxtjs.org/api/configuration-srcdir)ではclientディレクトリにまとめていますが、プロパティ名`srcDir`に合わせて「src」ディレクトリにまとめます。

```
$ mkdir src
$ mv assets components layouts pages plugins static store middleware src/
```

### 3.動作確認

```
$ npm run dev
```

---

ドキュメント：https://nuxtjs.org/api/configuration-srcdir

## おまけ

ふぅ、スッキリ。

よりシンプルになりました。
javascriptで指定の整数から、Nで割り切れない値の個数を求めてみる

for文で回して、i % Nが0以外になったもの……でもいいんですが、
整数 - 割り切れる値の個数で計算してみた方が計算処理的にも楽なので、そっちで実装してみます。


##実装例
```js
const calc = (num, divide) => num - Math.floor(num / divide);

const divide = 5;
console.log([
  calc(1, divide),
  calc(2, divide),
  calc(3, divide),
  calc(4, divide),
  calc(5, divide),
]);
```

もっと短く書きたい！


# 最後に
[株式会社ネコカリ](https://www.nekokari.co.jp/)では猫の手も借りたい🔥炎上中🔥なお仕事を募集しています！
一緒に働くメンバーも募集していますので、よかったら是非！
QiitaにおけるGoogleアナリティクス設定 初心者向けTips：検索キーワードは収集できません

# はじめに
qiita始めて2週間たちました。
社内でConfluenceを利用しており、GOogleアナリティクス+Data Studioで同じように分析できるかな？と思い、Google Analyticsの設定をしてみました。

でも、qiitaだからこそ (自分たちがサイト管理者ではないからこそ )できないことがあります。
qiitaで、「qiita アナリティクス organic」「qiita アナリティクス 検索キーワード」などで調べても何もヒットしません。
私と同じようにqiita始めて、アナリティス設定して「あれ？これどうやるんだろ？」と、ハマらないようにまとめておきます。

**もし、「こうすればできるよ！」とかがあれば教えてください。**

# 環境

- [qiita:QiitaでGoogleアナリティクスを利用する手順](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11) の手順に従い、Googleアナリティクスを設定できるようにします。
- [Google Data Studio](https://datastudio.google.com/navigation/reporting?hl=ja)にて可視化しています。

# できないこと

**どうやって検索され自分のページに到達したのかは、qiitaのサイト内検索、 organic検索、共に知る術はありません。**

見れるのは、参照元のドメインと organicl/referral/email という分類くらい。
完全なるreferer (url) はわかりません。

### サイト内検索
例えば、下記のように、「みんな何を知りたいのかな？何をよく見ようとしてるのかな？」って気になりますよね。
で、自社サイトなら下記のように、キーワード情報収集して分析することができるでしょう。
でも、自分たちが設定されているAnalytics IDは、自分たちのページだけなんです。なので、サイト内検索のキーワードを拾う事は出来なさそうです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/cf3d793f-6a29-664e-0520-19acdd37186f.png)


### Organic 検索
検索キーワードを取得することはできません。
qiita始めて間もないですが、Analyticsのデータを見てみると、「ん？google / organic が多いなぁー」っていうのが分かりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/1c538d68-4b76-c6e4-2a20-f0dc5540b66a.png)

で、そこでサイト内検索と同じ話で「何で検索してヒットしたんだろう？」と思うわけなんですよね。
でも、自分たちはqiitaのサイト管理者ではないので・・・ [Search Console](https://www.google.com/webmasters/tools/home?hl=ja) を設定することができないので検索キーワードを拾う事が出来ないと・・・。

もうちょっと深掘りして書いておこうかな、とか色々参考になりそうな情報ではあると思うんですけどね。
ちょっと残念です。

**余談**
下記のように、作った記憶が無い、ページに対してのアクセスがあったので、なんだろう？と思ったら、 `translate_c` は、google 翻訳でのアクセスですね。どんな言葉で検索したのか知りたいですよね。まぁ1viewだけですけどねｗ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/50efaf0c-7eda-d091-2eab-9526ffc0e3e6.png)
powershell　共有フォルダ（ネットワークドライブ）の接続の仕方

#1.概要
powershellでネットワークドライブに接続する方法。
自分用の覚書なので悪しからず。
#2.環境
powershell : 5.1
#3.コード
```net_use.ps1
net use ドライブ名 /delete #ネットワークドライブの接続を切断
net use ドライブ名 \\コンピュータ名\共有名 パスワード /user:コンピュータ名\ユーザー名 #接続
```
#4.コード補足説明
**ネットワークドライブは接続済みの場合、正しく挙動しない場合があるので一旦切断している**
Deploygateで自動Deployする方法

## Deploygateで自動Deplopyする

CIツールを使ってDeployが理想だけど都合上そうもいかないしローカル環境でなんとかしたいという方向けです。  
もっと良いやり方があると思いますのでコメントいただければ幸いです。  

## 前提条件
  
* iOSアプリの配布(Androidも参考程度にはなるかも...)
* gitを利用している  
* Fastlaneを利用している  
* Deploygateを利用している  

## やりかた

PCにログインしたときに自動でデプロイするシェルスクリプト実行できるようにするだけです。  

### FastfileにDeploygateに配布する用のlaneを記述

こちらはFastlaneを利用している前提ですので導入の仕方など細かな説明は省きます。  
詳しく知りたい方は[fastlane公式ドキュメント](https://docs.fastlane.tools/)を参照ください  

```rb:Fastfile
  desc "Deploygateにアップロード"
  lane :dg do
    gym(
      workspace: 'xxxxxxxx.xcworkspace',
      scheme: 'スキーム名',
      configuration: 'コンフィグレーション名',
      export_method: "ad-hoc",
      clean: true
    )
    deploygate(
      api_token: 'API Keyを記述',
      user: 'ユーザ名',
      message: last_git_commit[:message]
    )
  end

```

### Automatorアプリケーションでの設定

1.**Automator** を起動します  

<img width="1280" alt="スクリーンショット 2018-07-25 8.16.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/127713/fac898be-7db9-c00c-8899-655d0ed6ffad.png">


2. 書類の種類は**アプリケーション**を選択します。  
3. 左側のタブに検索窓があるので**シェルスクリプト**と検索します  
4. **シェルスクリプトを実行**が出てくると思うので右側のウインドにドラッグ&ドロップします。  

  
以下のシェルスクリプトを記述して保存します  

```sh
#!/bin/bash

# リモートのmasterブランチとローカルのmasterブランチの差分があったらpullしてきてdeployします

cd [プロジェクトまでのパス]
diff=$(git diff origin/master master)

if [ -n "$diff" ]; then
  git pull origin master master
  bundle exec fastlane dg
fi
```

保存することで上記のシェルスクリプトをアプリケーション化できます。  
アプリケーション化をすることはできたのでダブルクリックするとDeploy自体は用意にできるようにはなりました。  

### ログイン時に自動でDeployする設定

1. macの **システム環境設定** を開きます。  
2. **ユーザとグループ** を選択します  
3. **ログイン項目** を選択します  
4. **+** ボタンから先ほどAutomatorで作成し保存したアプリケーションを追加します  

以上で設定は完了です。

## あとがき

シェルスクリプトでbundlerを利用しているのですが、
rbenvでrubyバージョンを管理している方はbundlerのパスが通っていないよと怒られるかもしれません。
その際はシェルスクリプトの方でパスを通してあげる必要があると思います。
各自bash_profileなどで設定しているパスを通してあげてください。

シェルの実行トリガーをログイン時ではなくリモートブランチと差分が生まれた瞬間pullしてdeployしてほしかったのですが、うまい方法が見つけられませんでした。
UbuntuにVS Code導入と監視ファイル制限の拡張

下記サイトから.debファイルを選択

https://code.visualstudio.com/


イメージをローカルにダウンロードしたら
ダブルクリックしてインストールガイドを起動


Linux mintを利用してますが、問題なくインストール完了。


プロジェクトのフォルダを追加したところで下記のメッセージが

```
Visual Studio Code はこの大規模なワークスペース内のファイル変更を監視できません。
この問題を解決するには、リンクの手順に従ってください。
```

```
Visual Studio Code is unable to watch for file changes in this large workspace
```

こちらで初期設定の最大watch数を確認

```
cat /proc/sys/fs/inotify/max_user_watches
>> 8192 
```

上限を広げて

```shell:/etc/sysctl.conf
fs.inotify.max_user_watches=524288  // この一行を追加
```

設定を反映

```
sudo sysctl -p
```

ちなみにwatch設定の上いっぱいいっぱいが**524288**らしく
ひとファイルの監視に割く容量が540bytes(32-bit) or 1kB(64-bit)なので
この設定でもメモリ使用量の最大は256MB (32-bit) or 512MB (64-bit)になるそうです。


**VS Code起動時に毎回表示されていたエラーが消えていると思うので無事、監視最大容量の拡張に成功です!!**


無駄なファイル監視を避けるために下記の設定も導入してみると良さそうです！
https://code.visualstudio.com/docs/getstarted/settings

node_modulesとか除外しても良さそうですよね〜
以上です！
PHPとform。$_POSTと配列が絡むとき

#PHP初学者の気づき

HTML CSSの学習から約2週間経ってPHPの学習を始めました。初めての印象は、「なんだ、HTMLも使えるしJAVAみたいな表記の仕方もある。それにしても<?php?>ってかわいいし、ベトナム語みたいだ。」といったものでした。

##PHPとは   
WEB開発やWEBアプリを開発するものです。
特徴的なのはWEBサーバ上でPHPは作動するため、WEBサーバーにPHPがインストールされた状態でないと動かないとのことです。

##難しかったところ
今回はPHPのprogateを通しての学習において苦戦した「form」についての気づきを共有したいです。特に$_POSTのところと配列が絡むところに苦戦しました。

##form
Formとは、見てもらった人に名前とかを書いて送信ボタンを押してもらうという、誰しも経験があるのではないかといえるものです。

###formと$_POST
ここでのポイントは、fromでメソッドと送信先を指定し、nameで属性を指定するという作業になります。
例えば、index.phpというファイルにおいて
```    <div class="form-item">数字</div>
<select name="number">
 <option value="未選択">選んでください</option>
          <?php 
            for($i=1;$i<=100;$i++){
              echo "<option value='{$i}'>$i</option>";
            }
          ?>
        </select>
```
と書き、select.phpというところで
``` 
  <div class="form-item">■ 数字</div>
      <?php echo $_POST['number'] ?>
``` 
と書くことによって、選んだ数字（ここでは1から100）がselect.phpに送られたことになります。select name="number"というところで、index.phpとselect.phpが繋がります。それで、データを引き渡すことができるのですね。

###formと配列
index.phpにおいて
``` <div class="form-item">好きな食べ物</div>
        <?php 
          $types = array('ラーメン', 'カレー', '味噌汁', '牛乳', 'あんぱん', 'その他');
         ?>
        <select name="food">
          <option value="未選択">選択してください</option>
          <?php
           foreach($types as $type){
        echo  "<option value='{$type}'>{$type}</option>";
        }
        ?>
        </select>
``` 
とすることで、選択枝を選べるようになっています。配列に格納してから、表示するという流れに少し戸惑ってしまいましたが、勉強したarrayやforeachがここで使えるのかということで面白かったポイントです。

##まとめ
PHPを勉強するまで存在を恐れていましたが、勉強を始めると色んなことができるのだとわかりワクワクしています。echoというのがかっこいいですし。引き続きPHPの学習を進めていきます。

**参考文献**
[Progate PHP学習コースⅠ](https://prog-8.com/lessons/php/study/1)
php artisan serveを停止させる方法

# 基本

`Control` + `c`

でストップする

# もし終了せずにターミナルを閉じてしまった時

```
$ ps 
```
でプロセスを見る

```
  PID TTY           TIME CMD
  358 ttys000    0:00.03 -bash
 1734 ttys002    0:00.22 /bin/bash -l
 1900 ttys002    0:00.38 php artisan serve
 1904 ttys002    0:00.09 /usr/bin/php -S 127.0.0.1:8000 /Users/teogi/works/test-laravel/server.php
 1906 ttys003    0:00.02 /bin/bash -l
 1720 ttys005    0:00.02 /bin/bash -l
```
該当するプロセスを`kill`する

```
kill -9 1904
```
※ `-9` は強制終了オプション

すると、プロセスが`kill`される

```
  PID TTY           TIME CMD
  358 ttys000    0:00.03 -bash
 1734 ttys002    0:00.22 /bin/bash -l
 1906 ttys003    0:00.03 /bin/bash -l
 1720 ttys005    0:00.02 /bin/bash -l
```
楕円曲線暗号の概要

RSAを置き換える次世代の暗号と呼ばれる楕円曲線暗号について、鍵交換と暗号化に応用する概念を簡単ににまとめてみました。

#### 基本理論

* 有限体上の楕円曲線（ $y^2 = x^3 + ax + b$ ）上の点 $G$ について、そのスカラー倍 $n \cdot G$ は同じ楕円曲線上の点になる。
* ここで $n$、$G$、$n \cdot G$ について、$n$ と $G$ から $n \cdot G$ を求めることは容易だが、$G$ と $n \cdot G$ から $n$ を求めることは現実的な時間ではできない。（楕円離散対数問題）

#### 共通鍵生成方法

楕円曲線暗号を使った鍵交換と暗号化は、2組の公開鍵・秘密鍵から同じ共通鍵を作ることができる性質を利用している。

0. 楕円曲線のパラメータ $a$、$b$ とその楕円曲線上の点（ベースポイント）$G$ を事前に共有しておく。
1. Aliceがランダムな整数 $a$ を作り、$a$ を秘密鍵、$a \cdot G$ を公開鍵として公開する。
2. Bobも同様に秘密鍵 $b$ と、$b \cdot G$ を公開鍵として公開する。
3. AliceとBobは自分の秘密鍵と相手の公開鍵を乗算することで共通鍵 $a \cdot b \cdot G \ (= b \cdot a \cdot G)$ を手に入れることができる。（楕円離散対数問題により公開鍵 $a \cdot G$ 、$b \cdot G$ から 秘密鍵 $a$、$b$ を求めることは困難となる。）

##### 参考

- http://www.atmarkit.co.jp/ait/articles/1507/28/news002_2.html
- http://gaiax-blockchain.com/elliptic-curve-cryptography

#### 代表的なアルゴリズム

* 鍵共有
  * Elliptic Curve Diffie-Hellman Key Agreement (ECDH)
* 署名
  * Elliptic Curve Digital Signature Algorithm (ECDSA)
* 暗号化
  * Elliptic Curve Integrated Encryption Scheme (ECIES)

##### 参考

* https://www.cryptopp.com/wiki/Elliptic_Curve_Cryptography
赤と青

<img width="233" alt="1B3D1E81-1B9B-40D5-B854-0B466309E28B.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/271873/a9ebd13d-4b82-1f7c-6876-d43719fe8d73.jpeg">

青が飛び出して、赤が後ろに見えない？
PHPによるMySQLへの接続とクエリ処理

# データベース接続
現在、データベース接続は PDO が主流。
あらかじめ config ファイルを作っておくと使い回せて楽。
DSN は Data Source Name の略でデータベースシステムに応じて接続するための文字列。

```config.php
<?php

ini_set('display_errors', 1);

define('DSN', 'mysql:host=localhost;dbname=databasename');
define('DB_USERNAME', 'username');
define('DB_PASSWORD', 'password');
```

PDO クラスのインスタンスを 作ってデータベースに接続する。
setAttribute でエラー時に PDOException という例外を出すように設定する。

```php
try {
    $db = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo $e->getMessage();
    exit;
}
```

#クエリ処理
## exec
結果を返す必要が無く、自分で完全に安全だと分かっている SQL ステートメントに使う。
結果を返さないのでメモリや CPU の節約が可能。

```php
$db->exec("select * from users");
```

参考：http://php.net/manual/ja/pdo.exec.php#refsect1-pdo.exec-description

## query
結果を返す必要があり、　自分で完全に安全だと分かっている SQL ステートメントに使う。
特に、変数の割り当てが必要なく固定の SQL ステートメントである場合や、一回だけ実行する SLEECT 文で使うことが多い。
PDO オブジェクトが返ってくる。

```php
$stmt = $db->query("select * from users");
$users = $stmt->fetchAll(データ形式(PDO::FETCH_OBJなど));
```

参考：http://php.net/manual/ja/pdo.query.php
## prepare
結果を返し、安全対策が必要で、複数回実行する　SQL ステートメントに使う。
特に、SQL ステートメント内で変数を割り当てたい場合に使うことが多い。
あらかじめ構文を固定化することで与えられた変数を変数としてのみ評価するので高速に実行できるメリットがある（プリペアードステートメント）。
SQL インジェクション対策を施せ、PDO オブジェクトが返ってくる。

```php
$stmt = $db->prepare("insert into users (name) values (:name)");
$stmt->execute([':name'] => username);
```

参考：http://php.net/manual/ja/pdo.prepare.php
Swiftでの関数名出力なども添えたデバッグログ関数


何度も煎じられた話かと思います。
が、Swift経験の浅い身には戸惑う事も多かったため、自分用にまとめておきます。

```Log.swift
import Foundation

func debugLog(_ message: String = "", function: String = #function, file: String = #file, line: Int = #line) {
    #if DEBUG
        let fileName = URL(string: file)!.lastPathComponent
        NSLog("\(fileName) #\(line) \(function): \(message)")
    #endif
}
```

```Example.swift
func testDebugLog(){
    let world = "https://swift.org"
    debugLog("hello, \(world)")
    let optWorld = URL(string: "https://swift.org")
    debugLog("hello, \(String(describing: optWorld))")
}
```


```Output
2018-07-24 23:36:51.553728+0900 DemoDebugLog[10270:2333830] main.swift #30 testDebugLog(): hello, https://swift.org
2018-07-24 23:36:51.556192+0900 DemoDebugLog[10270:2333830] main.swift #33 testDebugLog(): hello, Optional(https://swift.org)
```

## 簡単な解説

* `__FUNCTION__` で取得していたのは昔の話です。Swift2.2での仕様改定により `#file` `#function` `#line` などのリテラルに置き換えられました。これらのリテラルは、引数のデフォルト値として設定した場合に特殊な扱いとなり、関数を呼び出した箇所に基づく値が設定されます。

* ログを出力したソースコード箇所を特定可能とするために `#file` と `#line` の値を出力します。`#file`の値はビルド環境における絶対パスです。このままではログ出力として長すぎるため`lastPathComponent`によりファイル名を抽出します。

* 上述のコードでは`NSLog()`でログ出力していますが、あとはお好みで `print()` や `os_log()` に置き換えてください。

* この記事はSwift4.1時点の情報に基づきます。

## 参考リンク
Swift > Language Reference > Expressions > Literal Expression
https://docs.swift.org/swift-book/ReferenceManual/Expressions.html

Documentation > Swift > Swift Standard Library > Debugging and Reflection
https://developer.apple.com/documentation/swift/swift_standard_library/debugging_and_reflection

swiftでデバッグログ
https://qiita.com/sasho/items/d19ba6d835b9ea9d9e81
Swiftでクラス名や関数名等をログ出力する
https://qiita.com/shtnkgm/items/de9cf3d85ccd0cef0a81
「Swiftの自前ログクラス」のSwift3対応版
https://qiita.com/hirocueki2/items/643c05819039a4120c68#_reference-de88920dc6f524d73829
Swift 2.2 で変わったところ
https://qiita.com/es_kumagai/items/df8cf82ec621558d653c#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%83%85%E5%A0%B1
マジレスすると『Optional(2018)年』を恐れる必要はない
https://qiita.com/koher/items/6c855ddbda8797af4605
Swift: print() vs println() vs NSLog()
https://stackoverflow.com/questions/25951195/swift-print-vs-println-vs-nslog/25951564
[iOS 10] os_logを使ったLoggerを作ってみた
https://dev.classmethod.jp/smartphone/iphone/ios-10-os-log-logger/
Angular 6 で、日付や時刻との双方向データバインディング

Angular 始めましたなので、メモ書きです。

## 普通のやつ

**HTML**

```html
<input type="text" [(ngModel)]="myText" />
<!-- これでもおｋ <input type="text" [ngModel]="myText" (ngModelChange)="myText=$event" /> -->

<label>{{myText}}</label>
```
**TypeScript**

```typescript
export class Main
Component {
  public myText: string = "hoge";
}
```

**結果**

![Untitled5.gif](https://qiita-image-store.s3.amazonaws.com/0/8227/608e5bba-30e3-b872-052a-a3e14600d698.gif)

``[(ngModel)]="myText"`` は ``[ngModel]="myText" (ngModelChange)="myText=$event"`` の短縮表記に過ぎないことを知りました。

## 日付の ``<input>`` と 時刻の ``<input>`` と ``Date`` 型プロパティ

**HTML**

```html
<input type="date" 
  [ngModel]="myDate | date: 'y-MM-dd'" 
  (ngModelChange)="myDateChange($event)" />
  
<input type="time" 
  [ngModel]="myDate | date: 'HH:mm'" 
  (ngModelChange)="myTimeChange($event)" />

<label>{{myDate}}</label>
```

**TypeScript**

```typescript
public myDate: Date = new Date(2018, 6, 20, 15, 56); // 2018/7/20 15:56

public myDateChange(text: string) {
  // インスタンス変えた方がいいと思うんだ
  const newDate = new Date(this.myDate);

  // 新しいインスタンスに年月日をコピー(時刻は維持)
  const parsed = new Date(text);
  newDate.setFullYear(
    parsed.getFullYear(),
    parsed.getMonth(),
    parsed.getDate());    

    this.myDate = newDate;
}

public myTimeChange(text: string) {
  // インスタンス変えた方がいいと思うんだ
  const newDate = new Date(this.myDate);

  // 新しいインスタンスに時刻をコピー(年月日は維持)
  const buf = text.split(':');
  if (buf.length === 2) {
    newDate.setHours(parseInt(buf[0], 10), parseInt(buf[1], 10));
    this.myDate = newDate;
  }
}
```

**結果**

![Untitled6.gif](https://qiita-image-store.s3.amazonaws.com/0/8227/0d775891-0964-5545-1c43-c0c65c313a79.gif)


パイプ(``| date:``) のところの意味が未だわかってません。
Azure Portal ダッシュボードの権限覚書

#はじめに
Azure portalのDashbordの権限周りで色々あったのでメモ。

#DashBordを操作したい
**負荷テストのモニタリング用ダッシュボードを編集して新しいサーバの情報を追加したい**
と開発チームから依頼がきたので、権限付与して対応してもらうことに。

ダッシュボードに操作権限を付与したい場合は2パターン方法がある。

1. サブスクリプションに権限を付与する
2. dashbordのResourceGroupに権限を付与する

弊社では、AzureADと連携して個人アカウント/チーム単位で必要なリソースに対してのみ権限を付与していく運用をしていたため、
2の*ResourceGroupに権限を付与する*方法を取った。

##ちょっとした盲点
早速*dashbord*というResourceGroupに**共同作成者**としてアカウントを追加。
DashBordの編集ボタンを押せるようになったものの、問題が2つ発生していた。
言われてみればそうだよね、という内容だが忘れないようにメモ。

###問題１　既にDashBordに追加していたメトリクスが見えない
DashBordに追加済みだったメトリクスの内、**閲覧権限以上をつけていないリソース**のメトリクスが「No Access」となり閲覧できない状態になっていた。
確かに。
リソースそのものに権限がないから、ダッシュボードの操作権限を持っていても
中身が見えないのは言われてみれば当たり前。

###問題２　新しいサーバのメトリクスがDashbordに追加できない
新しいサーバにも権限を付与していなかったため、Dashbordにメトリクスが追加できない状態になっていた。
確かに。確かに。
上記１の問題が起きるなら、そもそも権限がないリソースの情報を取得できるはずがない。

##結局DashBordを操作するのに必要なこと
- DashBordそのものの操作権限
- DashBordに追加するリソースの閲覧権限以上の権限
- 既にDashBordに追加済みのリソースの閲覧権限以上の権限

#反省
一通り操作してみると、確かにサブスクリプションに権限を付けてしまった方が圧倒的に楽だし煩雑にならない。
ドキュメントを見ていてもサブスクリプションに権限付けましょうねと書いてあるのはこういった理由からのようだった。
運用を今後どう改善していくか考える必要がありそう。

そもそも権限周りの運用にルールを明確に決めていないのでその場その場で適当な対応になっているのも問題。
また、リソース数もかなり多くなってきているのでタグを付けたりResourceGroupをまとめ直したり、
まずは整理から始めるのもありかもしれない。
micro:bitとMi:powerボードの組み立て方！【micro:bit】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# はじめに
この記事では、[micro:bit](http://microbit.org/ja/)と[Mi:power](https://www.kitronik.co.uk/5610-mipower-board-for-the-bbc-microbit.html)ボードの組み立て方についての記事です。

\>>気をつけるべきポイント
- `0, 3V, GND`で繋ぐこと
- ナットを下側にする（上側でも動くが、下側の方が接触がいいため）

\>>完成図
<img width="300" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/f753e9d0-40a5-2287-f6dc-e76292f320e0.png">

#用意するもの
- micro:bit
- Mi:powerボード
- ドライバー
- ねじ、ナット、白い挟むもの(それぞれ3つずつ)
- ボタン電池
- ペンチ（もしあれば）

<img width="300" alt="prepare.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/8d1a73ac-6e69-4111-37c2-db600e474aad.png">

#組み立て方
### 1. ボタン電池を入れる。

<img width="300" alt="prepare.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/9acf5a20-a519-d8e8-cc04-b3344908832f.jpeg">

### 2. micro:bitの裏側に白い部品をつけ、ネジで止める。

<img width="300" alt="prepare.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/0b28558c-f996-1499-954d-1815c607ffe5.jpeg">

### 3. `0, 3V, GND`の3ヶ所も同様に止める。

<img width="300" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/70fb73e6-19a4-b282-6ce2-fe89e3a9c0c6.jpeg">

### 4. 裏側をナットで固定する。

<img width="300" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/fbe0b45a-904c-e033-a417-70740f027028.jpeg">

### 5. 完成。

<img width="300" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/f753e9d0-40a5-2287-f6dc-e76292f320e0.png">

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
# 参考文献

http://microbit.org/ja/

https://www.kitronik.co.uk/5610-mipower-board-for-the-bbc-microbit.html
【Swift4】UICollectionViewにHeaderとFooterをつける

UICollectionView作成時に、ヘッダとフッタがなかなか表示されなかったので、改めてサンプルを作成し手順を整理しました。

##手順1: StoryBoard上でUICollectionViewとヘッダ、フッタの追加
まず、下記の図のように、UICollectionViewをViewControllerに追加し、インスペクター（画面右）内のAccessoriesの”Section　Header”、”Section　Footer”を追加します。（①）
追加すると②の下線部のようにCollectionReusableViewが追加されます。
![手順１.png](https://qiita-image-store.s3.amazonaws.com/0/261934/7124ddee-2f64-a63b-d0a9-22c6b9dc9d00.png)

その後、各cellにIDをつけます。
■ヘッダ
![headerID.png](https://qiita-image-store.s3.amazonaws.com/0/261934/c9a9b075-12a7-d06b-7a6f-4d8e6d0f3f37.png)
■セル
![cellID.png](https://qiita-image-store.s3.amazonaws.com/0/261934/64fc2066-4e8c-3c1f-f3a0-ecb38af265c7.png)
■フッタ
![footerID.png](https://qiita-image-store.s3.amazonaws.com/0/261934/53a8a5be-ce9c-acfc-8ef8-1d839a3e5a56.png)

##手順２：　ViewController.swiftの設定
下記のコードを参照してください。

```swift:ViewController.swift

import UIKit

//　①UICollectionViewDelegateとUICollectionViewDataSourceの継承
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    
    // ②StoryBoardのUICollectionViewと紐づけ
    @IBOutlet weak var testCollectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ③UICollectionViewのdelegateとdataSourceの設定
        testCollectionView.delegate = self
        testCollectionView.dataSource = self
    }
    
    // ④セクション内のセルの数を返すメソッド　（今回は５個を設定）
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 5
    }
    
    // ⑤実際にセルを設定するメソッド
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = testCollectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        return cell
    }
    
    // ⑥ヘッダ、フッタを設定するメソッド
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        
        if (kind == "UICollectionElementKindSectionHeader") {
            //ヘッダーの場合
            let testSection = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "header", for: indexPath)
            
            return testSection
            
            
        } else {
            //フッターの場合
            let testSection = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "footer", for: indexPath)
            
            return testSection
            
        }
    }

}
```

## 表示結果
下記、図のようにヘッダとフッタを表示させることができました。
![完成図.png](https://qiita-image-store.s3.amazonaws.com/0/261934/2f5310fc-eeef-11c6-aab5-e05d9fcc09fb.png)
Karabiner-Elementsで 左右option で英かなにする

#経緯
左commandキーを英のキーに割り当てると、command+Sとかが勝手に動作してしまうことが多発した。

#解決策①（上級者向け）
`~/.config/karabiner/assets/complex_modifications/1111111111.json`に以下の文字を入れる
数字はなんでも良いっぽい。

```~/.config/karabiner/assets/complex_modifications/1111111111.json
{
    "title": "For Japanese",
    "rules": [{
        "description": "左optionが英数、右option gaがかなキーを送信する。",
        "manipulators": [
            {
                "type": "basic",
                "from": {
                    "key_code": "left_option",
                    "modifiers": {
                        "optional": [
                            "any"
                        ]
                    }
                },
                "to": [
                    {
                        "key_code": "left_option",
                        "lazy": true
                    }
                ],
                "to_if_alone": [
                    {
                        "key_code": "japanese_eisuu"
                    }
                ]
            },
            {
                "type": "basic",
                "from": {
                    "key_code": "right_option",
                    "modifiers": {
                        "optional": [
                            "any"
                        ]
                    }
                },
                "to": [
                    {
                        "key_code": "right_option",
                        "lazy": true
                    }
                ],
                "to_if_alone": [
                    {
                        "key_code": "japanese_kana"
                    }
                ]
            }
        ]
    }]
}
```

#解決策②（とりあえず向け）
terminalに以下の文章を打ち込んだらできます。

```bash:bash
echo -e '{\n"title": "For Japanese",\n"rules": [{\n"description": "左optionが英数、右option gaがかなキーを送信する。",\n"manipulators": [\n{\n"type": "basic",\n"from": {\n"key_code": "left_option",\n"modifiers": {\n"optional": [\n"any"\n]\n}\n},\n"to": [\n{\n"key_code": "left_option",\n"lazy": true\n}\n],\n"to_if_alone": [\n{\n"key_code": "japanese_eisuu"\n}\n]\n},\n{\n"type": "basic",\n"from": {\n"key_code": "right_option",\n"modifiers": {\n"optional": [\n"any"\n]\n}\n},\n"to": [\n{\n"key_code": "right_option",\n"lazy": true\n}\n],\n"to_if_alone": [\n{\n"key_code": "japanese_kana"\n}
                ]\n}\n]\n}]\n}' >~/.config/karabiner/assets/complex_modifications/1111111111.json
```

#参考記事
[参考記事](https://qiita.com/s-show/items/a1fd228b04801477729c)
【Python】ツイキャスWebAPI用ライブラリ作った【PyTwitcasting】

[ツイキャス](https://twitcasting.tv/)WebAPIのPythonライブラリがなかったので作ろうと思いました！！！！

ライブラリを作るのは初めてで、作ることで知識の幅も広がりそうだったため、挑戦してみました。作成時に得た知識はブログかなんかでメモしておきたいと思います。

作ったときに学んだこと

- `setattr`と`getattr`による動的な属性追加・取得
- classmethod
- Sphinxでのドキュメント生成
- docstringの書き方
- Pipenvのdev-package
- 
などいろいろ知れたような気がします。

## PyTwitcasting

ツイキャスの[WebAPI](http://apiv2-doc.twitcasting.tv/)にアクセスするためのPythonライブラリの[PyTwitcasting](https://github.com/tamago324/PyTwitcasting)を作ってみました。これが使われたツイキャスのツールやアプリが作られるといいなと思ったりしてます。

初めて[PyPI](https://pypi.org/project/pytwitcasting/)に登録もしてみました。よかったらpipでインストールしてみてください。

[ドキュメント](http://pytwitcasting.readthedocs.io/ja/latest/index.html)も作成しましたが、サンプルコードが少ないため、使い方がわかりにくいかもしれないです。今後載せていく行く予定です。

このライブラリはPython3.3以上で動きます。

## インストール

```sh
pipenv install pytwitcasting
```

　　or

```sh
pip install pytwitcasting
```

　　or

```sh
git clone https://github.com/tamago324/PyTwitcasting.git
cd PyTwitcasting
python setup.py install
```


## 簡単な使い方

まず、 https://twitcasting.tv/developernewapp.php でアプリの作成を行う。ツイッターのアカウントがあれば、３分でできます。

作成できたら、以下のコードを実行。

BASIC認証を使ったアプリケーション単位でのアクセスでユーザー情報を取得するサンプルコード。

※`client_id`と`client_secret`には作成したアプリの値を代入してください。

```python
from pytwitcasting.auth import TwitcastingApplicationBasis
from pytwitcasting.api import API

client_id = 'ClientID'
client_secret = 'ClientSecret'
app_basis = TwitcastingApplicationBasis(client_id=client_id,
                                        client_secret=client_secret)

api = API(application_basis=app_basis)

print(api.get_user_info('twitcasting_jp').name)
# ツイキャス公式
```

他にもコメント取得とかライブ情報取得とかできます。詳しくはドキュメントの[APIs](http://pytwitcasting.readthedocs.io/ja/latest/apis.html)を見てください。

簡単な説明だけでしたが、いろんな事ができると思うので、ぜひ使ってみてください！！！

また、まだ実装してない(というか実装の仕方がわからない)機能があったりするので、プルリクエストやアドバイスなどあればお願いします！！！

エラー処理について、よくわかってないです。`None`を返すのか、`raise`するのかとか...

---

これを作るにあたって、参考にしたライブラリ

- [PyGithub](https://github.com/PyGithub/PyGithub)
- [tweepy](https://github.com/tweepy/tweepy)
- [spotipy](https://github.com/plamere/spotipy)
アクセス修飾子【Java】

# アクセス修飾子
クラスやそのメンバの宣言時にはアクセス修飾子が付けられ、どこからアクセスできるかを指定することができます。

アクセス修飾子には「public」、「protected」、「なし」、「private」の4種類があります。
今回はそれぞれのアクセス修飾子のアクセス可能性を表にまとめました。
# アクセス修飾子とアクセス可能性
||自クラス|同一パッケージ|サブクラス|他パッケージ|
|:---:|:---:|:---:|:---:|:---:|
|**public**|〇|〇|〇|〇|
|**protected**|〇|〇|〇|×|
|**なし**|〇|〇|×|×|
|**private**|〇|×|×|×|
表の見方をprotected修飾子を例に挙げて説明します。

"protected修飾子が付いている場合は、自クラスと同一パッケージ内とサブクラスからアクセスすることができます。しかし他パッケージからはアクセスできません。"

という意味です。
# 終わりに
個人的には「protected」と「なし」、「同一パッケージ」と「サブクラス」がややこしいです。
どんな場面でprotectedやパッケージが有用であるのか、はっきりと理解できていないためであると思うので勉強します。
【Androidアプリ】通知チャンネルの通知設定を取得する

[前回の記事](https://qiita.com/PET_HAL/items/5a39e410fbda027c688b)で「端末でアプリの通知をオフに設定してもダイアログが表示されてしまう」から、「通知設定を取得してオンの場合のみ、ダイアログを表示するように」した、と書きました。
ただし、Android Oreoで通知チャンネルを2つ以上つくった場合、通知チャンネルの通知設定で判定する必要があります。

# 通知チャンネルの通知設定を取得する
「通知チャンネル オン オフ 取得」でググったところ、下記の記事がヒット。
\#DroidKaigi 2018で「開発者が知っておきたい通知の歴史」という内容で講演しました - kobakei's blog [http://kobakei.hatenadiary.jp/entry/2018/02/09/223057](http://kobakei.hatenadiary.jp/entry/2018/02/09/223057)

確かに[公式ドキュメント](https://developer.android.com/reference/android/app/NotificationChannel#getImportance())を読んでみるとそんな感じのことが英語で書いてありました。

ということで、上記の公式ドキュメントを参考に実装したのが下記になります。

> 2018/07/26 追記
> アプリの通知設定がオフ、通知チャンネルの通知設定がオンの場合にダイアログが表示されてしまったのでコードを修正しました

> 2018/09/06 追記
> notificationManager.getNotificationChannel(CHANNEL_ID)
> ↑ 通知チャンネル作成できてないとぬるぽになります

```sample.java
boolean isPermitNotification;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationManager notificationManager = getSystemService(NotificationManager.class);
    final String CHANNEL_ID = getString(R.string.channel_id);
    isPermitNotification = notificationManagerCompat.areNotificationsEnabled()
        && NotificationManager.IMPORTANCE_NONE != notificationManager.getNotificationChannel(CHANNEL_ID).getImportance();

} else {
    isPermitNotification = notificationManagerCompat.areNotificationsEnabled();

}
```

通知チャンネル、ようやくちょっと分かってきた気がします。ユーザ側で通知が色々設定できていいですね。
クロージャの便利なところを簡潔に記す



###基本、内部の無名関数を返す

```javascript:hello.js

function outMethod () {

    return function () {
        console.log('hello');
    };
}

var fc = outMethod();
fc(); // hello
```


次のサンプルの内容はとても便利。いろいろ使いみちがありそう。
変数の中身を保持してくれるところが便利。
リロードするまで値を保持してくれる

###変数の中身を保持して使える
```javascript:count.js
function outMethod() {
    var x = 1;

    return function () {
        console.log(x);
        x = x + 1
    };
}

var fc = outMethod();
fc(); // 1
fc(); // 2
fc(); // 3
```
###メモ
無名関数には、セミコロンをつける。
単純なものだとつけなくてもエラーにならないが、ネストするとどこまでが無名関数か分からずエラーになるらしい。



大変参考になりました。ありがとうございました。

[[JavaScript]　猿でもわかるクロージャ超入門　５　クロージャを作る]
(http://dqn.sakusakutto.jp/2009/01/javascript_4.html)

[中上級者になるためのJavaScript【知識編】]
(https://qiita.com/kenju/items/c7fad62a12cc2809b507)
学会発表での顔関連の動向を調査中

顔関係のデータベース・国際学会発表は進展を続けている。


## [VGGFace2 Dataset](http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/)

### [Training and Test Data](http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/data_infor.html)

その論文 [VGGFace2: A dataset for recognising faces across pose and age](http://www.robots.ox.ac.uk/~vgg/publications/2018/Cao18/cao18.pdf)

を見てみると

[Labeled Faces in the Wild](http://vis-www.cs.umass.edu/lfw/)よりも顔向きの多様性などがあがっているようだ。

ちなみにこのデータベースは
[a Creative Commons Attribution-ShareAlike 4.0 International License. ](https://creativecommons.org/licenses/by-sa/4.0/)
で商用利用可能になっている。

> We introduce a new large-scale face dataset named VGGFace2. The dataset contains 3.31 million images of 9131 subjects (identities), with an average of 362.6 images for each subject. Images are downloaded from Google Image Search and have large variations in pose, age, illumination, ethnicity and profession (e.g. actors, athletes, politicians). 

より多様性を増大させたデータセットになっています。Google Image　search　を利用して画像を集めているということで、機械学習が機械学習を強化するのに使われている状況です。

paper [VGGFace2: A dataset for recognising faces across pose and age](https://arxiv.org/pdf/1710.08092.pdf)

![vggface2_table1.png](https://qiita-image-store.s3.amazonaws.com/0/83761/0422c03f-8b48-efd4-6b01-a11956e872dc.png)

その論文の中では近年公開された顔関係のデータベースを紹介しています。


LFWは実際のところ、正面顔が多く選ばれています。それに比べるとVGGFace2は横顔も多く含んでおり難易度がたかくなっています。


このVGGFace2を用いたface recognitionのpre-trainedのモデルが公開されています。

https://github.com/davidsandberg/facenet
この中でPre-trained models　の１つとして含まれています。



## 顔関連のIEEEの学会が中国で開催されています。


[13 th IEEE International Conference on Automatic Face and Gesture Recognition 2018](https://fg2018.cse.sc.edu/FG2018-booklet.pdf)

reviewerの中の日本人らしい名前がとても少ないことが気になります。


[CVPR 2018に44本の論文が採択](https://www.sensetime.jp/single-post/2018/05/15/CVPR-2018%E3%81%AB44%E6%9C%AC%E3%81%AE%E8%AB%96%E6%96%87%E3%81%8C%E6%8E%A1%E6%8A%9E)

会場の一角には企業の展示ブースがあり、BaiduやSenseTimeなどが積極的に活動していることがわかります。

---
CVPR2018から

[Learning Face Age Progression: A Pyramid Architecture of GANs](https://arxiv.org/pdf/1711.10352.pdf)
https://tech-blog.abeja.asia/entry/cvpr2018-oral

>歳を取った場合に顔がどのように変化するかを提示。
生成画像において人物は変化しないようにしつつ年齢だけ変化させることが課題。
生成画像に対して、人物がキープされるようにするロスと、年齢識別ロスを用いた。


[Total Capture: A 3D Deformation Model for Tracking Faces, Hands, and Bodies](http://www.cs.cmu.edu/~hanbyulj/totalbody/totalcapture.pdf)

>表情を含む人の動き、姿勢、ジェスチャーをキャプチャするためのモデルの提案。
人の細かな部位までをモデル化する取り組みは無い。モデル化する際に疎なデータから全体を復元することが難しい。
詳細な部位までをモデル化するためのFrankensteinモデル・Adamモデルを提案、姿勢のキーポイントと不完全な点群から、体のメッシュを生成。


[Learning from Millions of 3D Scans for Large-scale 3D Face Recognition](http://openaccess.thecvf.com/content_cvpr_2018/papers/Gilani_Learning_From_Millions_CVPR_2018_paper.pdf)


SenseTime [CVPR 2018に44本の論文が採択](https://www.sensetime.jp/single-post/2018/05/15/CVPR-2018%E3%81%AB44%E6%9C%AC%E3%81%AE%E8%AB%96%E6%96%87%E3%81%8C%E6%8E%A1%E6%8A%9E)

以下のようにさらに人材を集める努力をしていることがわかる。
[展示会
CVPR 2018参加者向け懇親会「SenseTime PartyTime」を開催します](https://www.sensetime.jp/single-post/2018/06/07/news180607)
C#でパス操作。相対パス化など。

C#で絶対パスから相対パスに変換するときに、Uriクラスを使って

```csharp
var dir = new Uri(@"C:\aaa\bbb\");
string absPath = @"C:\aaa\bbb\ccc\a.txt";
string rel = dir.MakeRelativeUri(new Uri(absPath)).ToString();
// rel = ccc/a.txt
```

というようなことをよくやるのですが、気になったことがあったので確認してみました:

- 大文字小文字の区別
- 正規化

(動作確認環境: Windows 10 .NET Framework 4.7.1)

#### 大文字小文字の区別
```csharp
var dir = new Uri(@"C:\Aaa\bbb\");
string absPath = @"C:\aaa\bbb\ccc\a.txt";
```
結果はccc/a.txtを変化ありませんでした。
Windowsということで、大文字小文字の区別はしないということでしょうか。

#### 正規化
```csharp
var dir = new Uri(@"C:\Aaa\bbb\..\bbb\");
string absPath = @"C:\aaa\bbb\ccc\a.txt";
System.Console.WriteLine(dir.ToString());
// file:///C:/aaa/bbb/
System.Console.WriteLine(
    dir.MakeRelativeUri(new Uri(absPath)).ToString());
// ccc/a.txt
```
Uriを生成した時点で正規化されるようです。
すでにコミットしてしまったファイルを無視する方法

2回目の投稿です(｡_｡)ﾍﾟｺｯ
今回はSourceTreeを使った.gitignoreの使い方をメモ程度に記載します。
使用するPCはmacです。

# すでにコミットしてしまったファイルを無視する方法
すでにGithubにはTest.txtがあるとします。
![スクリーンショット 2018-08-13 23.11.07.png](https://qiita-image-store.s3.amazonaws.com/0/227026/392eb6a0-36b7-a022-8d2f-135a9191d214.png)


これを.gitignoreで無視する(バージョン管理しない)ようにします。
sourceTree右上の「設定」>「高度な設定」>「編集」で.gitignoreに以下のように記述します。
![スクリーンショット 2018-08-13 23.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/227026/dd0adf49-0c79-0037-63a6-9ba1de08b288.png)
これでコミットし、プッシュします。

githubをみて見ると.......
![スクリーンショット 2018-08-13 23.19.08.png](https://qiita-image-store.s3.amazonaws.com/0/227026/8b7c437d-6674-87cf-1202-229c6d52720e.png)

消えていません。これは当たり前で、すでにコミットしてしまっているので無視することができないのです。

そこで、すでにコミットしてしまっている場合は、以下の二つの作業を行うことが必要です。
1.　追尾をやめる
2. 「.gitignore」に追加する

具体的な処理は以下に記述します。
まず、「ファイルステータス」>「保留中のファイルを表示,パス名順」>「すべてのファイル」を選択する。
![スクリーンショット 2018-08-13 23.27.38.png](https://qiita-image-store.s3.amazonaws.com/0/227026/ad58df34-c78c-35ca-9ae2-9340c57a7dfd.png)

「作業ツリーのファイル」内にある除外したいファイル(Test.txt)を右クリックし、「追尾を停止する」を選択する。
![スクリーンショット 2018-08-13 23.31.46.png](https://qiita-image-store.s3.amazonaws.com/0/227026/fe577335-daf7-3af9-a4ef-1df502faaf43.png)

そうすると、「indexにステージングしたファイル」にTest.txtが移動します。コミットメッセージを記述し、コミット、プッシュするれば完了です。
すでに.gitignoreにはTest.txtを記述してあるので、コミットする必要はないですが、もし無視するファイル(コミット済み)などが他にある場合は、.gitignoreに記述しコミットすれば完了です。
↓しっかり消えています。
![スクリーンショット 2018-08-13 23.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/227026/766d048c-e7ad-97a9-a77e-ed5ec06220b8.png)

#  参考文献
[わかばちゃんと学ぶGit使い方入門](https://www.amazon.co.jp/%E3%82%8F%E3%81%8B%E3%81%B0%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E5%AD%A6%E3%81%B6-Git%E4%BD%BF%E3%81%84%E6%96%B9%E5%85%A5%E9%96%80%E3%80%88GitHub%E3%80%81Bitbucket%E3%80%81SourceTree%E3%80%89-%E6%B9%8A%E5%B7%9D-%E3%81%82%E3%81%84/dp/4863542178)
ムームードメインで購入した独自ドメインをHeroku上で設定し、ついでにSSLの設定もする方法

# この記事の目的

こんにちは、あつくり(@atukuri2)です。
「初めてアプリを作ってデプロイした！このサービスを本格的にグロースしていきたい」という人が必ず通らなければならないのは**独自ドメインの取得&サーバーへの適用**です。
本記事ではHerokuでドメインを変更する&&ついでにSSLの設定（簡単にいうとセキュリティの強化）をする方法を紹介していきます。

ちなみに本記事ではHeroku上にアプリをデプロイしていて
**[ムームードメイン](https://muumuu-domain.com/)**というドメイン販売サイトで購入していることを前提としております。


# アプリのSSLを設定する

「アプリのSSL設定って難しそう・・・」そう思う方もいるかもしれませんが、毎月7$払えば一瞬で出来ます。
そう、Herokuならね笑

まずはDynoを有料プランにします
「Dynoって何？」っていう方もいると思いますが割愛して簡単にメリットだけ説明します

・Herokuの無料Dynoは30分間アクセスがないとAppがフリーズする仕様を回避できる。
・Hobby以上の有料プランであればhttpsで始まる独自URLも無料で設定することができる

詳しくはこちらの記事が参考になります
https://qiita.com/RYT/items/77b77e3b0e4f88774ef3

1.Herokuにアクセスして、自分のプロダクトのページへ行き「Resouces」の項目を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237010/a44ae789-c0d5-6649-ae42-831319b3ed54.png)

2.すると「changes」というボタンがあるので選択すると、以下のような画面に映ります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237010/03025683-cfc1-3206-1abd-7c79bc3d76c8.png)

3.ここでHobbyという項目を選択するだけでDynoの設定は完了です。

4.次にSSLの設定を行います。「Settings」→「Domains and certificates」→「Configure SSL」を選択。

5.「Automatically」を選択して「Continue」をクリック。

6.SSL設定をおこなったので、今後DNSを設定をおこなう場合は「アプリの名前.herokudns.com」の形式を利用するように促されます。「I’ve done this」を選択して完了です。

一瞬でしたね！

# Heroku側で独自ドメインを設定する

1.ターミナルから下記のコマンドを実行。


```
heroku domains:add www.独自ドメイン名
```

これだけです笑

# ムームードメイン側での設定
あとはムームードメインの管理画面にアクセスして、独自ドメインの設定をするだけで完了です。

1.「ドメイン管理」→「ムームーDNS」→設定したい独自ドメインの「変更」を選択。

2.ここでハマりポイントですが、「カスタム設定のセットアップ方法はこちら」というボタンを押さないと設定できません笑

3.ボタンを押すと、設定2が現れるので、そこのサブドメインを「www」、種別を[CNAME]、内容を[www.アプリの名前.herokudns.com]にします

4.「セットアップ情報変更」を押したら完了です。

5.あとは待つのみ！24~48時間ほどで適用されます。僕の場合は１日半ぐらいかかりました。

# 最後に

以上でHerokuでのドメイン設定&SSL設定は終了です。ここまで簡単に設定できてしまうHerokuおそるべし・・・
自分のアプリに独自ドメインが設定されるとめっちゃテンション上がるのでぜひ試してみてください笑
bitcoindの起動やbitcoin-cliが効かない。

# 環境
arch linux
bitcoind v0.16

# どうした
以下のようなエラーでbitcoindが起動できない。

```shell-session:Console
~/bitcoin> bitcoind
bitcoind: error while loading shared libraries: libboost_system.so.1.66.0: cannot open shared object file: No such file or directory
```
`libboost`がないようです。
[boost](https://www.boost.org)はC++のライブラリです。

# なぜ
今まで起動できていたので、バージョンがずれてしまったことが考えられます。

```terminal:Console
# pacman -Qs boost
local/boost 1.67.0-5
    Free peer-reviewed portable C++ source libraries - development headers
local/boost-libs 1.67.0-5
    Free peer-reviewed portable C++ source libraries - runtime libraries
```
それぞれ1.67が入っています。
しかし、原因はバージョンではない模様。[^1]
原因究明はまたいつか。
一時的な対応策は以下

# こうした！
とりあえずそれぞれダウングレードします。
なにか他の方法があるかもしれませんが、C++わからずとりあえずダウングレード...。
arch packageのダウングレードには[downgrade](https://aur.archlinux.org/packages/downgrade/)を使用しました。
`$ downgrade boost boost-libs`

無事なおりました。

# もっとくわしく！
[downgrade](https://aur.archlinux.org/packages/downgrade/)
[arch linuxでパッケージをダウングレードする](https://qiita.com/kanna/items/fc70d127ea91c40bed98)

[^1]: [two boost version issues in ubuntu](https://github.com/bitcoin/bitcoin/issues/13089)
リーダーマクロとSLIME

自分用のリーダーマクロや[cl-annot](https://github.com/m2ym/cl-annot)等のライブラリを使う際に、SLIMEとの連携で多少つまづいたのでメモ。

## リーダーマクロを含むコードをSLIMEで評価する
例えばcl-annotを使うとすると、ファイルの書き出しはこんな風になるでしょう[^1]。

```common-lisp
;; 必要なら
(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload :cl-annot))

(defpackage #:annot-test
  (:use :cl))
(in-package #:annot-test)
(annot:enable-annot-syntax)

@export
(defun add (x y)
  (+ x y))
```
`(annot:enable-annot-syntax)`以降はアノテーションが有効になりますが、SLIME上では`@export (defun...`の部分を`C-c C-c slime-compile-defun`すると

```
The variable @EXPORT is unbound.
   [Condition of type UNBOUND-VARIABLE]
```

というエラーがでます（環境にもよるかもしれません）。これはEmacs側で`(require 'slime-annot)`としておいても解決しません。

SLIMEと正しく連携できるようにするためには[cl-syntax](https://github.com/m2ym/cl-syntax)を使うと良いようです。cl-annotはcl-syntaxの中の１モジュール（`cl-syntax-annot`）として利用できます。

```common-lisp
(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload :cl-syntax-annot))

(defpackage #:annot-test
  (:use :cl))
(in-package #:annot-test)
(syntax:use-syntax :annot)

@export
(defun add (x y)
  (+ x y))
```
`(annot:enable-annot-syntax)`が`(syntax:use-syntax :annot)`に置き換わっただけです。今度は`C-c C-c`で問題なく`@export (defun...`全体が評価されるようになりました。

## リーダーマクロを含むコードをSLIMEで展開する
しかし、問題はまだあります。例えば`annot:defannotation`で新しいアノテーションを導入する時など、リーダーマクロの展開がどうなっているかSLIME上で確かめながら書きたいことがあります。通常のケースでは`C-c C-m slime-expand-1`でマクロ展開を表示して、同時にリーダーマクロの展開も確認すれば十分なわけですが、この場合は`@export...`の位置で`C-c C-m`しても正しく展開されません[^2]。

これは実践的には、トップレベルフォームをマクロ展開するコマンドがあれば解決になっていると思われます。~/.emacs.d/init.elなどに、以下を定義しましょう（あるいはslime.elを書き換えても良い）。

```emacs-lisp
(defun slime-eval-macroexpand-toplevel (expander)
  (let ((string (slime-defun-at-point)))
    (setq slime-eval-macroexpand-expression `(,expander ,string))
    (slime-eval-async slime-eval-macroexpand-expression
      #'slime-initialize-macroexpansion-buffer)))

(defun slime-expand-1-toplevel (&optional repeatedly)
  "Display the macro expansion of the current toplevel form.
See `slime-expand-1'."
  (interactive "P")
  (slime-eval-macroexpand-toplevel
   (if repeatedly
       'swank:swank-expand
     'swank:swank-expand-1)))

(defun my-slime-mode-hooks ()
  (define-key slime-mode-map "\C-\M-m" #'slime-expand-1-toplevel))
(add-hook 'slime-mode-hook 'my-slime-mode-hooks)
```
先ほどの`@export (defun...`の中で`C-M-m slime-expand-1-toplevel`を実行すると、別バッファに

```common-lisp
(PROGN (EXPORT 'ADD) (DEFUN ADD (X Y) (+ X Y)))
```
と展開されるようになりました。リーダーマクロに絡んだケース以外でも役には立つコマンドかと思います。

[^1]: [defpackageと分散されたエクスポート宣言の相性の問題](https://g000001.cddddr.org/3632891604)については、ひとまず考えないことにします。
[^2]: cl-syntaxの導入によって(slime-defun-at-point)は正しく動作するようになりますが、(slime-sexp-at-point)は依然としてうまく動かないのが原因のようです。
Kubernetes に入門するときに勉強になった読み物

Kubernetes を勉強中なのですが、個人的に非常にためになった読み物を紹介させていただきます。

既に Kubernetes が利用できる環境上で実機確認できる読み物が多めになっています。Kubernetes の環境構築技術は対象外です。また、個人の日曜技術検証用に GCP(GoogleCloudPlatform) を使っているため、GCP 成分が多めになっています。

# 公式ドキュメントの Basic チュートリアル

Kubernetes を利用する上でポイントとなる知識がコンパクトにまとまっています。

* Kubernetes の特徴（コンテナオーケストレーション、ノードへのスケジューリング、セルフヒーリングなど）
* Pod、Deployment、Service といった主要な Kubernetes オブジェクト
* kubectl コマンドの使い方
* 水平スケール（スケールアウト、スケールイン）
* ローリングアップデート、ロールアウト


また、オンラインの minikube 環境でブラウザ上でターミナル操作しながら動きを確認できます。ブラウザさえあれば試せるので手軽です。

https://kubernetes.io/docs/tutorials/kubernetes-basics/

# Katacoda

Kubernetes の様々なチュートリアルがあるサイトです。ブラウザ上でターミナルを操作しながら Kubernetes に関する様々な知識を学びながら、実際にオペレーションして試すことができます。

https://www.katacoda.com/courses/kubernetes


# GKE(Google Kubernetes Engine) 上で試すチュートリアル

**書籍『[プログラマのためのGoogleCloudPlatform入門](https://www.shoeisha.co.jp/book/detail/9784798137148)』**

この本は GitHub 上でサンプルコードを公開してくれており、読者はこのコードを利用して GCP 上で実際に触りながら動きを確認できます。

https://github.com/GoogleCloudPlatform/gke-gobang-app-example

以下の一連の流れを学ぶことができます。

* Kubernetes クラスタの作成
* コンテナのビルド
* Container Registry へのイメージアップロード
* Deployment により、指定レプリカ数で Pod を稼働させる
* Service により、ロードバランサからのトラフィックを Pod に転送する
* マイクロサービスのメリットを体感（ユーザに影響を与えずに、バックエンドをローリングアップデート）

# Google Kubernetes Engine のドキュメント

Kubernetes の概要、特徴をざっくり知るのに有用な資料です。Kubernetes Engine は GCP のプロダクトなので、GCP 固有のことも結構書かれているのでロックイン気味ではあるのですが、環境構築の手間を省きたい場合はクラウドのマネージドサービスが便利です。

* [Kubernetes Engineの概要](https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview)
* [コンテナクラスタ](https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture)
* [ポッドとは](https://cloud.google.com/kubernetes-engine/docs/concepts/pod)
* [Deploymentとは](https://cloud.google.com/kubernetes-engine/docs/concepts/deployment)

なお、[Spinnaker を使ったチュートリアル](https://cloud.google.com/solutions/continuous-delivery-spinnaker-kubernetes-engine?hl=ja)もあります。Cloud Source Repository、Cloud Build、Container Registry を活用しつつ、継続的デリバリーパイプラインを構築する内容になっています。

# GCP のエコシステムにおける利用

Google の方による動画、スライドがあります。開発のライフサイクルをどう構築するかであったり、セキュリティ、課金、GPU、耐障害性、スケーラビリティ、ログ収集など体系的にまとめられています。

https://cloudplatform-jp.googleblog.com/2018/08/Cloud-OnAir-20180802-deep-dive-google-kubernetes.html

# Kubernetes Meetup Tokyo のスライド

登壇者の方たちがスライドを公開してくださっています。先進的かつ実体験に基づく知見が多く、ただただ学びを得られる資料です。

https://k8sjp.connpass.com/presentation/
機械学習への一歩　〜分類編〜


#はじめに
この記事ではpythonのライブラリであるsickit-learnを使用して、機械学習の分類問題の実装を説明します。機械学習初心者の方に機械学習の流れを掴んでいただくことを目的とします。(ぼくも初心者)

#分類問題とは
機械学習は大きく分けて下記の２種類あります。
- 教師あり学習：正解データを与えて予測する方法
- 教師なし学習：正解データを与えないで予測をする方法

さらに、教師あり学習にもいくつかの種類があります。
- 分類：定性的データを予測する
- 回帰：定量的データを予測する

定性的データというのは、すこしイメージがしにくいかと思いますが、ABCなどのランク分けといったグループ分けするようなものです。
定量的データは、値段や偏差値等の数値などのことを示します。

#環境
- python 3.6.5

#流れ

今回使用するテーマは「ワイン」です。機械学習の分類問題に置ける最も有名なテーマの１つです。
あらゆるワインのデータをインプットとして、そのワインがどのランクのワインかを分類する問題です。

データは下記のURLよりダウンロードしてください。
https://archive.ics.uci.edu/ml/datasets/Wine

下記の流れにそって説明していきたいと思います。

1．データの分割
2．データの標準化
3．学習
4．テスト

#1.データの分割
機械学習は学習用データとテスト用データの２種類に分けます。
テスト用のデータは学習してできたモデルの評価を行なうために作成します。
評価の際は未知のデータである必要があるためテスト用データとして学習前からデータを分けておきます。

データの分割にはおもに以下の２つの手法があります。
- ホールドアウト法
- K分割交差検証

この２つそれぞれの手法の詳しい説明は省きますが、
データ量が多い時：ホールドアウト法
データ量が少ない、データに偏りがる時：K分割交差検証
と覚えておいてください。

※「データに偏りがある」とは、
たとえばAとBの正解データがあるとした時、Aのデータは10000個あるが、Bのデータは１００個
しかない状態を「データに偏りがある」と言います。

実際に使用するときは以下のようになります。

```python:ホールドアウト法
#ライブラリをインポート
from sklearn.model_selection import train_test_split

#分割
X_train , X_test , y_train , y_test = train_test_split(X,y,test_size=0.2)

```

```python:K分割交差検証
#ライブラリをインポート
from sklearn.model_selection import StratifiedKFold

#インスタンスを生成
kfold = StratifiedKFold(n_splits=5)
```

#２.データの標準化

定量的なデータには大小が存在するため、標準化というものを行います。
標準化を行うことでデータ同士の重みを整えることができます。

言葉で説明するとわかりにくいですが、
例えば、以下の様に2つのワインに甘さと酸味で違いがあったとき、

||甘さ  |酸味  |
|---|---|---|
|*ワイン１* |100  |2  |
|*ワイン２* |200  |3  |

このまま数値的に考えると甘さの絶対値が大きいので、重要度が上がってしまいます。
このような事態を防ぐために、標準化を行います。

```python:標準化
#ライブラリをインポート
from sklearn.preprocessing import StandardScaler

#インスタンスを生成
sc.fit(df.iloc[:,:-1])

#標準化
sc_df = pd.DataFrame(sc.transform(df.iloc[:,:-1]))
```


以上のようにデータを分割し整えたあとに、機械学習を行います。

#3.学習
今回は学習にscikit-learnにある分類問題のライブラリのうち、
　**ロジスティック回帰**
を使用します。

ロジスティック回帰は回帰と書いてあるがれっきとした分類問題における予測モデルです。
scikit-learnのライブラリにありますので、難しいことは考えずに以下のようにインスタンスを
作成することで、ロジスティック回帰を使う準備はできます。

モデル作成の手順は以下の通りです。
・インスタンスの生成
・モデルの作成(学習開始)

```python:モデル作成
#ライブラリをインポート
from sklearn.linear_model import LogisticRegression

#インスタンスを生成
clf_lr = LogisticRegression(penalty='l1',C=10000)

#学習モデル作成
clf_lr.fit(X=X_train,y=y_train)
```

今回使用するくらいのデータ数ですと一瞬で終了しますが、これがランダムフォレストなど、
比較的計算量の多い予測モデルを使用すると処理時間は長くなります。

モデルの作成後はそのモデルの精度を確かめます。
精度を確かめるときに使うデータは学習データであるので、
精度が高いことは当たり前といえます。

```python:評価：学習データ
#モデルを学習データに適用
clf_lr.score(X=X_train,y=y_train)
>>> 0.8023683135973867
```

#4.テスト
そのモデルが本当に良いモデルなのを確かめるのに、
テスト用データを使用します。(おまちかね！)

```python:評価：テストデータ
#モデルを学習データに適用
clf_lr.score(X=X_test,y=y_test)
>>> 0.8048182931808902
```


これで結果はでましたね。良い結果ですね。

以上で今回は終わりますが、次回以降は回帰問題の説明をしようかなと考えてます。
お読みいただきありがとうございました。





*See You Later*
ゼロから作るDeepLearning2をKerasで強くてニューゲームする<ch1>

[ゼロから作るDeep Learning (2)
――自然言語処理編](https://www.oreilly.co.jp/books/9784873118369/)をkerasで再現してみた。

書籍で使用しているソースコードは[こちら](https://github.com/oreilly-japan/deep-learning-from-scratch-2)で公開されています。
numpyでごりごり実装しているので、比較してみると面白いかも。
中身の詳細な説明は本を見てください。

なお、ここでは、google colabで実装していく。

# 1章 ニューラルネットワークの復習
## 1.4.3 学習用のソースコード

なるべく使いまわしで、モデル周りをkerasに書き換えてみる。
kerasだと、モデル内の構造を記述する必要があるが、割とシンプルに収まる。
学習曲線と決定境界がほぼほぼ再現できたので、動作に関しても問題なしかと。

```python:train_custome_loop.ipynb
# kerasはデフォルトで入っていないので、install
!pip install keras

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

# spiral.pyをcolab上でimportするのが手間なので、べた書き
def spiral_load_data(seed=1984):
    np.random.seed(seed)
    N = 100  # クラスごとのサンプル数
    DIM = 2  # データの要素数
    CLS_NUM = 3  # クラス数

    x = np.zeros((N*CLS_NUM, DIM))
    t = np.zeros((N*CLS_NUM, CLS_NUM), dtype=np.int)

    for j in range(CLS_NUM):
        for i in range(N):#N*j, N*(j+1)):
            rate = i / N
            radius = 1.0*rate
            theta = j*4.0 + 4.0*rate + np.random.randn()*0.2

            ix = N*j + i
            x[ix] = np.array([radius*np.sin(theta),
                              radius*np.cos(theta)]).flatten()
            t[ix, j] = 1

    return x, t

# ハイパーパラメータの設定
max_epoch = 300
batch_size = 30
hidden_size = 10
learning_rate = 1.0

x, y = spiral_load_data()

## ↓ 大きな変更点 ↓
# モデルの宣言
model = Sequential()
model.add(Dense(hidden_size, activation='sigmoid', input_dim=x.shape[1]))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(optimizer=SGD(lr=learning_rate), loss='categorical_crossentropy')

hist = model.fit(x, y, epochs=max_epoch, batch_size=batch_size)
## ↑ 大きな変更点 ↑

# 学習結果のプロット
loss_list = hist.history['loss']
plt.plot(np.arange(len(loss_list)), loss_list, label='train')
plt.xlabel('iterations')
plt.ylabel('loss')
plt.show()

# 境界領域のプロット
h = 0.001
x_min, x_max = x[:, 0].min() - .1, x[:, 0].max() + .1
y_min, y_max = x[:, 1].min() - .1, x[:, 1].max() + .1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
X = np.c_[xx.ravel(), yy.ravel()]
score = model.predict(X)
predict_cls = np.argmax(score, axis=1)
Z = predict_cls.reshape(xx.shape)
plt.contourf(xx, yy, Z)
plt.axis('off')

# データ点のプロット
N = 100
CLS_NUM = 3
markers = ['o', 'x', '^']
for i in range(CLS_NUM):
    plt.scatter(x[i*N:(i+1)*N, 0], x[i*N:(i+1)*N, 1], s=40, marker=markers[i])
plt.show()
```

![gakushukyokusen.png](https://qiita-image-store.s3.amazonaws.com/0/221698/c62dc0d0-4b19-f6f6-9419-afe22e3f3606.png "学習曲線")

![ketteikyokai.png](https://qiita-image-store.s3.amazonaws.com/0/221698/a7c48335-886a-9548-158c-0d8ea0d29ef9.png "決定境界")

~~なんでcolabで描くとこんな禍々しい色合いになるんだ・・・~~