OmniAICreator/Qiita-1.07M huggingface dataset:
Java言語におけるクラスとは(1/?)

# 自己紹介
初めまして。しがない大学院生をやっております。またたびです。
多くの漬物石に囲まれた研究室でネットワークについての研究を行っています。
ブログを書くのが初めてなため、量、質共に拙くはなると思いますが、これからよろしくお願いします。

# 今回の記事を書くにあたって
今年IT業界就職した知人からJavaの基礎を教えてと言われたので、記事を書くことにしました。
同じような境遇の方の参考になれば幸いです。
また、僕がJavaを学習していく上で非常にお世話になった本をページ下の参考文献に記載しておくので、ぜひ読んでみてください。

# 対象読者
- 他言語について理解があるが、Javaはあまりわからない方
- Javaを勉強していたが途中で詰まり諦めた方


# 内容
今回はJavaを理解する上で欠かせない、オブジェクト指向の一部であるクラスの一部について触れていきます。
これから数日かけてクラスについて書いていくのでよろしくお願いします。

## クラスとは
クラスはC言語をご存知なら、構造体に毛の生えたものくらいの認識でいいと思います。
C言語: waする、dataを
Java: dataに、waさせる
Java言語には、クラスとメソッドというものがあります。
メソッドを束ねているものがクラスになります。
今後の記事で書いていきますが、インスタンスやカプセル化といったものを用いて初めてクラスを有効活用できます。
今回の記事ではひとまずクラスが何なのかを掴んでいただければ幸いです。
クラスを用いることのメリットとして、コードの管理が容易になりやすく、可読性も上がりやすくなります。
では実際に、C言語とJava言語で作成した四則演算プログラムを比較して、クラスを用いることでコードの管理や可読性が上がることを説明していきます。

```c:左半分C言語、右半分Java
#include <stdio.h>
#include <stdlib.h>

typedef struct calculate {                         public class Calculate {
    int a, b;                                          int a, b;
} *Calculate;

Calculate new_Calculate(int a, int b) {            Calculate(int a, int b) {
    Calculate this = malloc(sizeof(*this));  
    this->a = a;                                       this.a = a;
    this->b = b;                                       this.b = b;
    return this;                              
}                                                  }

int add(Calculate this) {                          int add() {
    return this->a + this->b;                          return this.a + this.b; 
}                                                  }                           

int main(int argc, char *argv[]) {                 public static void main(String[] args) {
    Calculate data = new_Calculate(123, 456);          Calculate data = new Calculate(123, 456);
    printf("%d\n", add(data));                         System.out.printf("%d\n", data.add());
}                                                     }
                                                  }
```

C言語は四則演算を関数としてばらばらに定義していますが、Java言語ではkeisanという1つのクラスにまとめて記述することができます。
ここに商の余りを求めるプログラムを記述したい場合、C言語では更に関数を追加しなければなりません。
しかしJava言語では、keisanクラスに追記すればよいのです。
このようにクラスを用いることで、どこにどのようなプログラムがあるのかがわかりやすくなります。
つまり、コードの管理がしやすくなり、可読性があがることに繋がります。
大規模で複雑なプログラムになればなるほど、この差は顕著に表れてくることになります。
Javaプログラムに記述してある、publicやstaticについては今後の記事で書いていきます。今は読み流しておいてください。

# 終わりに
初めてブログを書いてみましたがとても大変。。。
慣れてどんどん分量と質を上げていこうな！！！
ということで目標はGW中毎日記事を上げることです。頑張ります。
今回の記事に対して間違いがあればご指摘頂けると幸いです。
明日は別クラスの呼び出しについて記述していこうと思います。
もしよければ明日もお付き合いください。
ここまで読んでくださり、ありがとうございました。

# 参考文献
 [スッキリわかるJava入門 第2版 (スッキリシリーズ) ](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC/dp/484433638X/ref=zg_bs_515820_1?_encoding=UTF8&psc=1&refRID=JGCC33P1VGV3V5VKQGQR)
Nuxt.jsでロゴ等をアニメーションさせる Web Animations API編


Nuxt.jsをチュートリアル通りに進めるとCSSアニメーションの
緑の三角形が動くアニメーションが表示される。
CSSアニメーションが苦手というだけの理由で
Web Animationsでアニメーションさせてみる

手順
1. CDNでpolyfillライブラリを読み込む
2. 画像追加してtemplate書く
3. javascriptで動かす

---
① Web AnimationsがまだPolyfillなのでライブラリをCDNで参照する

`nuxt.config.js`

``` javascript
  head: {
    title: pkg.name,
    // scriptにを追記
    script: [{src: "https://cdnjs.cloudflare.com/ajax/libs/web-animations/2.3.1/web-animations-next.min.js"}],
```
---
②templateにアニメーションさせたい対象を追加
 
今回は画像(logo.png)をassetsに置いて`Logo.vue`をそのまま修正

```vuejs

<template>
  <img id="logo" src="~/assets/logo.png">
</template>

<style>
#logo {
  width: 120px;
}
</style>
```

---
③index.vueにアニメーションの処理を追加

ページ表示時にアニメーションを開始させるようにする
elementに直接アクセスするような処理はcreatedではなくmountedで行う。

```vuejs

<template>
  <section class="container">
    <div>
      <h1 id="title">animation</h1>
      <logo/>
    </div>
  </section>
</template>

<script>
import Logo from "~/components/Logo.vue";
// アニメーションの内容 繰り返し動き続けるパターン
const ANIMATIONS = {
  LOGO: {
    keyframes: [
      { opacity: 0.5, height: "119px", marginTop: "0px" },
      { opacity: 0.55, height: "119px", marginTop: "0px" },
      { opacity: 0.9, height: "110px", marginTop: "10px" },
      { opacity: 1, height: "105px", marginTop: "15px" }
    ],
    options: {
      duration: 2000,
      iterations: Infinity,
      direction: "alternate",
      fill: "forwards"
    }
  },
  LOGOTEXT: {
    keyframes: [{ opacity: 0.8 }, { opacity: 0.5 }],
    options: {
      duration: 1000,
      iterations: Infinity,
      direction: "alternate",
      fill: "forwards"
    }
  }
};

// 特定のDOMを動かす
const anim = (t, p) => {
  return new Animation(
    new KeyframeEffect(document.querySelector(t), p.keyframes, p.options),
    document.timeline
  ).play();
};

export default {
  /* 追記ここから */
  mounted() {
    this.$nextTick(() => {
      anim("#logo", ANIMATIONS.LOGO);
      anim("#title", ANIMATIONS.LOGOTEXT);
    });
  },
  /* 追記ここまで */
  components: {
    Logo
  }
};
</script>

<style>
.container {
  margin: 0 auto;
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
}

#title {
  display: block;
  font-weight: 300;
  font-size: 30px;
  color: #35495e;
  letter-spacing: 1px;
}

</style>

```

とりあえず完成。
もっとNuxt.jsに寄り添った感じにしたい

![gamen_test1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143795/7ebcf61c-7782-ec1f-c49c-19853e5770d0.gif)
１から学ぶJWT

# JWT 概要説明
現在勤務している、開発会社でJWTを扱う機会があり色々と調べたので。まとめたいと思います。  
**想定読者はCookieとSessionの前提知識が既にある人です。**

# JWTはなんの略？
JWTは"Jason Web Token"の略になります。

# JWTの発音は？
最初は``` ジェーダブルティー ```とドヤ顔で言っていたのですが正式には"Jot"と発音します。
日本語では「ジョット」と発音します。

[公式サイト](https://tools.ietf.org/html/rfc7519#section-1)

``` 
   The suggested pronunciation of JWT is the same as the English word
   "jot".
```

# JWTとはそもそも何？
JWTとはJSONデータ構造で表現したトークンで、認証サービスなどに利用される。

# JWTの認証フロー
<img width="733" alt="スクリーンショット 2019-04-13 18.31.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/877f5458-4caa-cfd9-252f-b029ae15d3c0.png">
[画像参考サイト](https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec)

### 1. 認証サーバへのサインイン
まずユーザーはユーザー名、パスワードなどを入力し認証サーバーへサインインします。

### 2.　認証サーバーからユーザへJWTを渡す
認証が完了すれば。認証サーバーで作成されたJWTがユーザーに渡されます。  
JWT情報の保存先はLocalStorageかCookieを選択出来ます。


### 3. APIを叩く時にJWTも一緒に渡す
ユーザーがAPIコールする時と同時にJWTをアプリケーションサーバーに渡します。

（JWTはHTTPリクエストのAuthorizationヘッダーのBearerスキームに設定します）  


### 4. JWTの内容を確認し、問題なければAPIコールを返す
アプリケーションサーバーは受け取ったJWTが内容改善されていないことを確認します。


# CookieとSessionと何が違うの？

Cookie & sessionもJWTも同じ認証システムですが、Cookieはサーバー側でsession情報を保存しており、リクエストの度にひもづくサーバー側のsessionデータを参照しています。

一方、JWTはクライアント側で認証に成功したという情報をもつだけでサーバー側で何か情報を持ちません。

ここが大きな違いだと思います。

# JWTの構成
JWTは**①header  ②payload  ③signature**の３つのパートで構成されています。

## header
headerでは署名検証を行うための情報を確認するためのパートです。

```
サンプル例

{
  "alg": "HS256",
  "type": "JWT"
}
```
alg -> 署名アルゴリズムを示しています。このトークンにはHS256が利用されていることが理解できます。

type -> トークンタイプを表します。”JWT”の文字列からJwtトークンタイプであることが理解できます。

## payload
やりとりに必要な情報が格納されているパートです。API連携に必要な情報がここのパート見れば内容把握することができます。

```
サンプル例

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
```

sub -> JWT発行社から発行された、ユーザー識別子
name -> ユーザの名前
iat -> 発行日時

ここで注意なのはクレームデータについては、予約済のクレーム名が存在しています。
これらはすでに役割が定義されております。上記の例でいうと```sub```と```iat```が予約済にクレーム名になります。

**予約語例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/fc84b0a2-4b3d-50a7-938e-07a607df3508.png)


## signature

```
サンプル例

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  
your-256-bit-secret

) secret base64 encoded

```

署名情報は内容改ざんのチェックにしか使われないので、開発者（プログラマー）は特に何も意識せずに実装することができます。

# JWTのメリット
上記でも述べたようにCookie & sessionを利用したユーザー認証システムだと、サーバー側でユーザーの認証情報を管理する必要があります。よって、ユーザー数が増えてきたりすると、ロードバランサーで分散管理するなどの処置が必要で管理が大変です。

一方JWTは送られてきたトークンを検証するだけなので、Cookie & sessionと違って並行分散処理が簡単でサービスをスケールしやすいというメリットがあります。


# JWTのデメリット
JWTの中身はBase64でエンコードされただけなので、デコードすると簡単に中身を確認することができます。
つまり、個人情報などの流失した時に問題になりそうな情報を含めることは出来ません。
（厳密にいうと、含めることはできるがオススメはしない）
SwiftのCGRectについて

apple の　DeveloperをGoogle翻訳にコピペしたところによると
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
概要
デフォルトのCore Graphics座標空間では、原点は長方形の左下隅にあり、長方形は右上隅に向かって延びています。 コンテキストに反転座標スペースがある場合（iOSの場合が多い）、原点は左上隅にあり、長方形は右下隅に向かって延びています。
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Creating Rectangle Values (四角形の値を作成する)
・init(**origin**: CGPoint, **size**: CGSize)
//指定された原点とサイズで長方形を作成します。
・init(x: Double, y: Double, width: Double, height: Double)
//座標と寸法を浮動小数点値として指定して矩形を作成します。
・init(x: Int, y: Int, width: Int, height: Int)
//座標と寸法を整数値として指定して矩形を作成します。
・init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)
座標と寸法をCGFloat値として指定して矩形を作成します。
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Special Values （特別な価値）

・static let **infinite**：CGRect
//無限の広がりを持つ四角形。
・static let **null**：CGRect
//無効な値を表すnullの四角形。
・static var **zero**：CGRect
//原点とサイズが両方ともゼロの矩形。
・init（）
//原点（0,0）、サイズ（0,0）の長方形を作成します。
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Basic Geometric Properties (基本的な幾何学的プロパティ)

・var **origin**：CGPoint
//四角形の原点の座標を指定する点。
・var **size**：CGSize
//四角形の高さと幅を指定するサイズ。
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Calculated Geometric Properties (計算された幾何学的性質)

var **height**：CGFloat
//四角形の高さを返します。
var **width**：CGFloat
//四角形の幅を返します。
var **minX**：CGFloat
//四角形のx座標の最小値を返します。
var **midX**：CGFloat
//四角形の中心を確立するx座標を返します。
var **maxX**：CGFloat
//四角形のx座標の最大値を返します。
var **minY**：CGFloat
//矩形のy座標の最小値を返します。
var **midY**：CGFloat
//四角形の中心を確立するy座標を返します。
var **maxY**：CGFloat
//四角形のy座標の最大値を返します。
–––––––––––––––––––––––––––––––––––––––––––––––––めんどくさいので省略–––––
See Also(参照)
Geometric Data Types（幾何データ型）

struct **CGFloat**
Core Graphicsおよび関連フレームワークにおける浮動小数点スカラー値の基本型。
struct **CGPoint**
二次元座標系で点を含む構造体。
struct **CGSize**
幅と高さの値を含む構造体。
struct **CGVector**
二次元ベクトルを含む構造体。
struct **CGAffineTransform**
2Dグラフィックスの描画に使用するためのアフィン変換行列。

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
コピペしまくったら何かわかるかと思いましたが、浅はかでした。さっぱりです。
Docker + Bootstrap で「Autoprefixer doesn’t support Node v4.8.2. Update it.」というエラーに遭遇

こんにちは、けんぞうです。
Dockerで環境構築をして、Bootstrapを使おうとしたところ、`Autoprefixer doesn’t support Node v4.8.2. Update it.`というエラーが出ました。こちらの対処法を書きます。


##解消法： Dockerfileにsetupを記述

**▼変更前**

```docker:Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
```

**▼変更後**

```docker:Dockerfile
FROM ruby:2.5
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
```

`curl -sL https://deb.nodesource.com/setup_10.x | bash -`を実行するようにしました。僕の場合はこの記述を追加して、再ビルドすれば直りました。


Dockerを使っていない場合、[stackoverflowの記事](https://stackoverflow.com/questions/52708521/autoprefixer-doesn-t-support-node-v4-8-2-update-it)を参照すると以下のコマンドで解消するそうです。
やっていることは上記の`Dockerfile`の記述と同じです。

```
$sudo apt remove nodejs
$curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
$sudo apt-get install -y nodejs
```

短いですが以上です。
ひっまやなぁ GW中にREST APIをお手軽に実装できる言語とフレームワークとかないよなぁ

ITTL勉強会1日目の記事です。
# あるよ
```golang
package main

import "github.com/kataras/iris"

func main() {
    app := iris.Default()
    app.Get("/ittl", func(ctx iris.Context) {
        ctx.JSON(iris.Map{
            "message ": "GWはirisとgo",
        })
    })
    app.Run(iris.Addr(":8080"))
}
```

## どーせありきたりなスクリプト言語やろ
それではこちらを、ご覧ください。
![ベンチマーク](https://github.com/kataras/iris/raw/master/_benchmarks/benchmarks_graph_22_october_2018_gray.png "ベンチマーク")
https://github.com/kataras/iris より引用

そう、Go言語はありきたりなスクリプト言語じゃない。軽量×お手軽×ハイパフォーマンスを描いた最高の言語なんだよ！
コンパイル言語だからバイナリを配布するだけで、実行可能！勉強しない方がおかしいねw
さぁみんなも乗り遅れないで！Golangで検索ゥー！

# Go言語とは
Windows、macOS、Linux用でコンパイル可能なプログラミング言語。OSSで開発されており、Googleの中の人によって設計されました。ver1.11からWebAssemblyのサポートも開始。

## irisとは
Go言語のWebフレームワーク。今回はこちらのフレームワークを利用し、解説を行います。

## マイナー言語？
A. メジャー言語
動画配信サイトのAbemaTVでも採用するほどハイパフォーマンス。
https://speakerdeck.com/miyukki/the-background-of-video-distribution-in-abematv-during-one-year?slide=15

# Go言語の基礎
[こちらの記事](https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7)に綺麗にまとまっていたので、参考にしてください。
特に宣言の「:=ってなんやねん、=とちゃうんか！」ってなると思うのでここだけ引用しておきます。

```golang
// 宣言した後、値を代入パターン
var msg string
msg = "hello world"

// 宣言と代入を一緒にするパターン

var msg string = "Hello World"

// 宣言と代入を一緒にするパターン (型省略可能)
var msg = "Hello Hello"

// 宣言と代入を一緒にするパターン (var省略)
msg := "Super Hello"
```

# DBと接続
MongoDBと接続するコードです。
小技として、import文をかっこで囲うと一括でimportしてくれます。

```golang
package main

import (
    "github.com/kataras/iris"
     mgo "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type Human struct {
    NAME string `json:"name"`
    PLANS Plan[] `json:"plans"`
}

type Plan struct {
    PLAN_NAME stirng `json:plan_name`
}

func main() {
    // Webサーバ立ち上げ
    app := iris.Default()

    // DB接続
    session, _ := mgo.Dial("mongodb://localhost/test")
    // Webサーバ終了時にセッション破棄
    defer session.Close()
    // セッション確立
    db := session.DB("test")

    app.Get("/schedule", func(ctx iris.Context) {
        // DBからの戻りを買う脳する変数
        schedules := []Human{}
        // DBに問い合わせ
        err := db.C("card").Find(bson.M{}).All(&schedules)
        if err != nil {
            // err発生
        }
        // JSONに詰め込みクライアントに返却
        ctx.JSON(cardInfo)
    }

    app.Run(iris.Addr(":8080"))
}
```

# 最後に
Go言語は少し癖がありますが、慣れてしまえば今まで以上に高速にWeb開発ができると思います。今回はREST APIでしたが、View部も実装することは可能です。ぜひこの機会にGo言語を習得してみてはいかがでしょうか。急ぎ足で解説したので、疑問点があればお問い合わせください。
rubocopのエラーをCircleCIのTestSummaryに表示する

# 目的

タイトル通りですが、CircleCIでrubocopがこけた時TestSummaryにいい感じに表示して下までスクロールしなくても結果を見られるようにします。

https://github.com/mikian/rubocop-junit-formatter

というのがあったのですが、既にreadonlyになっていて試してみたけど動きませんでした。これを参考に作ろうかな？と思ったけど、[rspecでrubocopやっちゃったら？](https://gist.github.com/djburdick/5104d15f612c15dde65f)みたいな話を見かけてそっちの方が手っ取り早そうだったので試してみました。

# rspceでrubocopを動かす

どこでもいいですけど上記記事を真似して`spec/lint/rubocop_spec.rb`に作りました。

```rb
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'bundle exec rubocop', rubocop: true do
  it '違反はないはず' do
    @report = `bundle exec rubocop --config .rubocop.yml`
    expect(@report.match('Offenses')).to be_nil, "Rubocop offenses found.\n#{@report}"
  end
end
```

`rubocop: true`とタグをつけてるのはCircleCI上で動かすときrspecとは別に動かしたかったからです。タグをつけておくと除外して実行可能です。

# circleci/config.yml

関係ないところははしょります。

```yml
    - run:
        name: rubocop
        command: |
          mkdir /tmp/test-results

          bundle exec rspec  \
            --format progress \
            --format RspecJunitFormatter \
            --out /tmp/test-results/rubocop.xml \
            spec/lint/rubocop_spec.rb

    - run:
        name: rspec
        command: |
          bundle exec rspec \
            --format progress \
            --format RspecJunitFormatter \
            --out /tmp/test-results/rspec.xml \
            --tag ~rubocop

    # collect reports
    - store_test_results:
        path: /tmp/test-results
    - store_artifacts:
        path: /tmp/test-results
        destination: test-results
```

ちょっと強引ですが目的は達成できました。

`rubocop --tag ~rubocop`と`~`をつけると除外できるようです。

ローカルでrpsecを実行したときいちいちタグをつけないとrubocopのやつも動いてしまうのがちょっと微妙ですが、circleciつかってると余り全部のテストをローカルで動かすこともないですよね？
投稿テストと今後の予定

研究でMATLAB/Simulinkを使うことになるも、あれをしたい、これをしたいが
中々できず、悪戦苦闘しているので、備忘録も兼ねて出来たことを投稿しようと
思っています。
まずは、M-Functionと呼ばれる、Simulink上で使える自作のMATLAB関数の
使い方をGW中に書く予定です。
WSL(Ubuntu)にMariaDBをインストール

WSL(Ubuntu)にMariaDBをインストールしようとレポジトリを追加するとエラーになりました。

```shell
$ cat /etc/issue
Ubuntu 18.04.2 LTS \n \l

$ sudo curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
[info] Repository file successfully written to /etc/apt/sources.list.d/mariadb.list
[info] Adding trusted package signing keys...
Executing: /tmp/apt-key-gpghome.yCodU0VFQC/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0x8167EE24 0xE3C94F49 0xcbcb082a1bb943db 0xF1656F24C74CD1D8 0x135659e928c12247
gpg: connecting dirmngr at '/tmp/apt-key-gpghome.yCodU0VFQC/S.dirmngr' failed: IPC connect呼び出しに失敗しました
gpg: 鍵サーバからの受信に失敗しました: dirmngrがありません
[error] Failed to add trusted package signing keys.
```
dirmngrを入れても変わりませんでした。
原因はWSLのバグとのことでWin10のアップデート(1809)で解消するとのことのようですが、まだ(2019/04/27)エラーが出ています。

- - -
[【期間限定】WSLのUbuntu 18.04でapt-keyコマンドを実行した時に「IPC connect call failed」のエラーになった時のワークアラウンド][1]
- - -

上記リンク先に詳しくやり方が書いてありますが、公開鍵を手動でダウンロードすれば解決します。

レポジトリーのURLは最初のcurlコマンドで作成されているので、apt update すればGPGエラーが出ます。おそらく３種類あるので、その３種類の鍵を直接追加します。

```shell
$ sudo apt update
...
W: GPG エラー: http://downloads.mariadb.com/MariaDB/mariadb-10.3/repo/ubuntu bionic InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY F1656F24C74CD1D8
W: GPG エラー: http://downloads.mariadb.com/Tools/ubuntu bionic InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY CE1A3DD5E3C94F49
W: GPG エラー: http://downloads.mariadb.com/MaxScale/2.3/ubuntu bionic Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 135659E928C12247
```

```shell
sudo curl -sL "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xF1656F24C74CD1D8" | sudo apt-key add
sudo curl -sL "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xCE1A3DD5E3C94F49" | sudo apt-key add
sudo curl -sL "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x135659E928C12247" | sudo apt-key add
```

あとはaptでインストールできるはずです。

[1]:https://blog.fieldnotes.jp/entry/workaround-wsl-1804-apt-key-bug
JavaScript入門5~オブジェクト~

#オブジェクトとは#
複数のプロパティを持つデータのまとまり.

#オブジェクトの作り方#

`var 変数名 = {};`
`var 変数名 = {プロパティ名1:データ,プロパティ名2:データ,... ,プロパティ名x:データ}`

###例###
`var 変数名 = {title:｀JavaScript入門｀, price: 2500, stock: 3};`

##プロパティ##
|プロパティの書式|プロパティ名:データ|
|:-----------------|--------------------------------:|
| プロパティのデータを読み取る①|オブジェクト名.プロパティ名|
|プロパティのデータを読み取る②|オブジェクト名[｀プロパティ名｀]|
【Java令和対応記念】生まれてから今までどれくらい経ったか表示する

##背景
Javaが令和に対応した記念に作成しました
最新版のJavaを用いれば~~2019年5月1日には令和表記の日付が表示できるはず！~~
　→Java12.0.1で無事「令和」表記ができることを確認しました！(2019.5.1)


ついでにLocalDateTimeやPeriod、Durationの使い方もマスターできるはず！

##ソースコード

```Reiwa.java
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.chrono.JapaneseChronology;
import java.time.format.DateTimeFormatter;

/*
 * 生まれてから今までの期間を表示する
 */

public class Reiwa{
	public static void main(String[] args){
		
		// 日付の表記の仕方
		DateTimeFormatter formatter = DateTimeFormatter
				.ofPattern("Gyy年MM月dd日HH時mm分")
				.withChronology(JapaneseChronology.INSTANCE);
		
		System.out.println("●●さん"); // 対象となる人の名前を入れましょう
		
		// 誕生日を入れてください(例 2000年1月2日3時4分生まれ)
		LocalDateTime birthday = LocalDateTime.of(2000,1,2,3,4);
		System.out.println("誕生：" + formatter.format(birthday));

		LocalDateTime today = LocalDateTime.now();
		System.out.println("現在：" + formatter.format(today));
		
		// 生まれてから今日までの年月日
		LocalDate from = birthday.toLocalDate();
		LocalDate to = today.toLocalDate();
		Period period = Period.between(from, to);
		String yearMonthDay = period.getYears() + "年" + period.getMonths() + "カ月" + period.getDays() + "日";
		
		// 生まれてからの時間・分
		Duration duration = Duration.between(birthday, today);
		String hourMinutes = duration.toHoursPart() + "時間" + duration.toMinutesPart() + "分";
		
		System.out.print("★生まれてから" + yearMonthDay + hourMinutes);
	}
}
```

##ポイント
生まれてから今まで何年何カ月何日経ったかを知るためにはPeriod
何時間何分経ったかを知るためにはDurationを使う必要がありました
ちょっと二度手間...

引数はPeriodではLocalDate、DurationではLocalDateTimeを使うのもねぇ...

もう少しきれいに書く方法ご存知の方はコメントください！

##実行結果
2019年4月27日20時33分に実行したところ以下のようになりました。

```
●●さん
誕生：平成12年01月02日03時04分
現在：平成31年04月27日20時33分
★生まれてから19年3カ月25日17時間29分
```

New!!
2019年5月1日16時55分に実行したところ以下のようになりました。

```
●●さん
誕生：平成12年01月02日03時04分
現在：令和01年05月01日16時55分
★生まれてから19年3カ月29日13時間51分
```
VirtualBoxをダウンロードできない場合の対処法

# 環境
OS:MacOS Mojave バージョン10.14.3
ブラウザ:Chrome

# きっかけ
Oracleの公式サイトからVirtualBoxをダウンロードしようとしてもできない問題が発生した。原因としては、<b>ブラウザの証明書エラーが表示されていた。</b>
追記:どうやらURLのFQDN「<b>download.virtualbox.org</b>」と、SSL証明書に記載されたコモンネーム「<b>download.oracle.com</b>」が一致していないことがダメらしい。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378243/3d53bff8-b7b2-fcea-14d7-0819874fe458.png)


# 簡単な流れ
ブラウザでOracleのVirtualBoxのページにアクセスし
黒い丸で囲まれた部分をクリックする
![path895.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378243/47153e09-18c5-7f36-7302-75a2b9a67ee2.png)

# An unauthorized request.と表示されダウンロードできない
<img width="1195" alt="スクリーンショット 2019-04-27 20.29.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378243/39c79d3b-c721-d3fb-f8aa-d5e7634ad220.png">

## 解決方法
URLを自分で編集して、
<b>https</b>ではなく、<b>http</b>を使ってダウンロードする
× https://download.virtualbox.org/virtualbox/6.0.6(略)
↓
◯ http://download.virtualbox.org/virtualbox/6.0.6(略)

# VirtualBoxの完全性を、ハッシュ値で確認する
httpでダウンロードしたため、ファイルの完全性に不安が多少ある。
一応、ハッシュ値で確認する。

OracleのVirtualBoxのページの下にある、<b>SHA256</b>のリンクをクリックする
![image1510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378243/d6109985-41d0-bf67-055c-c5fff0455497.png)

記載されているVirtualBox-6.0.6-130049-OSX.dmgのハッシュ値は以下の通り

```
　e7fea3a51d7be7e00b7d0115e33eb62dc5e4cbd10542fd7b0b83de904666b6bf
```

ターミナルで、ダウンロードしたVirtualBoxのインストールファイルに対して、以下のコマンドを実行すると、ハッシュが生成される。

```
 shasum -a 256 VirtualBox-6.0.6-130049-OSX.dmg
e7fea3a51d7be7e00b7d0115e33eb62dc5e4cbd10542fd7b0b83de904666b6bf  
```

testコマンドで、文字列を比較する
test 'サイトに表示されていたハッシュ値' = 'こちらで生成したハッシュ値'

```
test 'e7fea3a51d7be7e00b7d0115e33eb62dc5e4cbd10542fd7b0b83de904666b6bf' ='e7fea3a51d7be7e00b7d0115e33eb62dc5e4cbd10542fd7b0b83de904666b6bf'
```

何も表示されなければ、完全性が保証されてダウンロードされたことが分かる。

# あとがき
ダウンロード後、インストールまで無事に完了。

#参考
[macでsha256のハッシュを生成する](https://qiita.com/akameco/items/c249e19ecc7c7bc974a2)

[文字列1と文字列2は等しいか？](https://shellscript.sunone.me/if_and_test.html#%E6%96%87%E5%AD%97%E5%88%971%E3%81%A8%E6%96%87%E5%AD%97%E5%88%972%E3%81%AF%E7%AD%89%E3%81%97%E3%81%84%E3%81%8B)
dokkuをつかってみた  #GWアドベントカレンダー2日目


 #GWアドベントカレンダー[「使いたかったもの使ってみたカレンダー（1人アドベントカレンダー）」](https://gw-advent.9wick.com/calendars/1)の2日目、28日記事です。


# dokkuをつかってみた

専門ではないため、サーバーのことあまり考えたくなく、普段はHerokuを愛用しています。
必要最低限のタイミングだけ起動して無料時間を節約しながら何アプリも作っています。

しかし、ちょっとアプリ数が多くなりすぎて、難しくなってきました。
なにかいい方法ないかなと探していたら、OpenPaaSという分野があるようです。
つまり、オープンソースなHerokuですね

OpenPaasの一例

- [dokku](http://dokku.viewdocs.io/dokku/)
- [flynn](https://flynn.io/)
- OpenShift
- Deis


これを使えば自分の立てたVPS内にHerokuもどきが作れる！ということで使ってみました。

使ってみたアドベントカレンダーなので、どう使ったか、所感として良さそうだったか／微妙だったか　って観点で書いていきたいと思います。構築の仕方とかはたくさん書いてくれているブログがあるので、省略します。

## 何に使ったか

 [GWアドベントカレンダー](https://gw-advent.9wick.com)のシステムを作るのに使いました。

![スクリーンショット 2019-04-26 23.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/9b831676-ee1e-bf6d-2d96-ad94cb57914e.png)

他に、

- [自分のブログ](https://blog.9wick.com)  ※更新頻度低め
- ちょっとしたテストアプリ

を入れています。

基本機能しか入れていません

## 入れ方

今回は初めてconohaを使ってみました。

- 新しく[conoha]のVPSを借りる
- サーバー立ち上げ時にDokkuを指定する
- DNSの設定をする

これだけで終わりました。

こちらの記事が大変参考になりました
[ConoHa + DokkuでプライベートPaaS構築](https://qiita.com/hiconyan/items/e4c6de6c2466bd3880c4)


## 良さそうなところ/面白かったところ

herokuの機能がだいたい使える！というところがまずデカかったです

**heroku互換で嬉しかったところ**

- git pushでデプロイできる
- buildpackが使える
- Procfileも使える
- 実行エンジン(nodeのバージョンとか）も指定できる
- スタティックページもホスティングできる
- ゼロダウンタイム更新ができる
- インスタンス増やしてスケールも簡単
- DBも使える

**dokku独自で嬉しかったところ**

 - <font color="red">**時間経過で落ちない**</font>
 - SSLもLet's Encryptの取得＆自動更新ができる
 - SSL入れるとhttpにアクセスすると自動リダイレクトでhttpsに行く
 - DBのポートが外向きに公開されないのでよりセキュリティが高い



VPSを自分でSSL対応しようとするとめんどくさいイメージなので、そこのサポートまで入ってたのは嬉しいです。

## あんまりイケてないところ

ちょっと残念だったのが1点。

- herokuと違ってUIがないので、全てSSHではいらないといけないのがめんどくさいです。サーバーの設定の問題か、sshログイン後に上矢印キーを押しても前回コマンドの履歴が出てこないので、ときどきいらっとしながら使ってます。




## 総合評価

イケてないところがあるものの、全然許容できるレベルで、
活用させてもらってます。

もうheroku使わないかも知れません。
【裏技】ElasticBeansTalkのアプリケーションサーバのRubyバージョンを上げる方法

Elasticbeanstalkのアプリケーションサーバの変更ってGUI上では限定されたものしか出来ずに困ったりしたことはないでしょうか？
私もRuby2.5に合ったものにしたかったのに2019年4月現在Puma/Passenger＋Ruby2.3しか選択できなくて困っていました。
AWS-CLIを使う方法で変更できることがわかったのでお知らせします。
AWS-CLIに関してはこれを参照ください。
【初心者向け】MacユーザがAWS CLIを最速で試す方法
https://dev.classmethod.jp/cloud/aws/mac-aws-cli/

![スクリーンショット 2019-04-27 18.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/24ee10b7-7679-9e66-e1dd-775617f5bb67.png)

この設定の部分です。
![スクリーンショット 2019-04-27 18.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/d323d324-359b-9146-5d68-baec442a080b.png)

こんな風に変更できます。AWS-CLIがインストールされている前提で以下のコマンドを打ちます。
ちなみに選択できるアプリケーションサーバはこちらからご確認ください。
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/platforms/platforms-supported.html

```
$ aws elasticbeanstalk update-environment --environment-name oooo-staging \
 --solution-stack-name "64bit Amazon Linux 2018.03 v2.9.2 running Ruby 2.5 (Passenger Standalone)" \
--region ap-northeast-1

True	oooo	oooo-staging.ap-northeast-1.elasticbeanstalk.com
2016-09-07T00:22:14.784Z	2019-04-27T07:48:25.529Z
Staging server of oooo	awseb-e-a-AWSEBLoa-1RFIYNOOU2G87-12345.ap-northeast-1.elb.amazonaws.com
arn:aws:elasticbeanstalk:ap-northeast-1:98765:environment/oooo/oooo-staging	e-a3yh9ap3c3	oooo-staging	Grey
arn:aws:elasticbeanstalk:ap-northeast-1::platform/Passenger with Ruby 2.3 running on 64bit Amazon Linux/2.9.2	64bit Amazon Linux 2018.03 v2.9.2 running Ruby 2.3 (Passenger Standalone)	Updating	app-c2d0-190427_014155
TIER	WebServer	Standard	1.0
```
CustomCellTableViewCell を追加し、Cellにボタンを配置　Cell内のボタンをタプしたらTableViewに検知実装

◆OptionButtonsDelegate作成

```swift

protocol OptionButtonsDelegate{
    func closeFriendsTapped(buttonname: String,at index:Int)
}
```

◆delegate変数をCustomCellTableViewCellに作成

```swift

class CustomCellTableViewCell: UITableViewCell {

    var delegate:OptionButtonsDelegate!
    
    @IBAction func btnButtonClick(_ sender: Any) {
    	self.delegate?.closeFriendsTapped(buttonname:"report",at: (sender as! UIButton).tag)
    }
    
```
    

◆ViewControllerでOptionButtonsDelegate を実装

```swift
class ViewController: UIViewController,OptionButtonsDelegate{

関数実装
func closeFriendsTapped(buttonname: String,at index: Int) {
	print("cell内のButtonがタプされました")	
}

```

◆delegate変数にself設定

```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
	        let cell: CustomCellTableViewCell = tableView.dequeueReusableCell(withIdentifier: "mycell", for: indexPath) as! CustomCellTableViewCell
	        cell.delegate = self
```
GraphvizでExecutableNotFound（~systems' PATH）エラーが出るときの対処法

##問題
オライリーの良書『Pythonではじめる機械学習』の決定木のあたりをやっていたら、突如『ExecutableNotFound: failed to execute ['dot', '-Tpng', '-O', 'tmp'], make sure the Graphviz executables are on your systems' PATH』とパスが通ってないっぽいエラーが出たので、対処法を書きます。
※Jupyter Notebook使用を想定
##対処法
1. Anaconda Promptで『conda install python-graphviz』を実行
2. 環境変数Pathに『C:\Users\●●●●（ユーザ名）\Anaconda3\pkgs\graphviz-2.38-hfd603c8_2\Library\bin\graphviz』を追加
3. PC再起動

<br>
これでいけるはず。

[参考サイト](http://spacegomi.hatenablog.com/entry/2018/01/26/170721)
mac 初期設定 - homebrew, anyenv, node.jsインストール編

macbookを一度初期化したため、その際真っ先に行ったことメモで残します。
掲題の通り、homebrew、anyenv、node.jsのインストールを実施しています。

**※この後のインストール等は全てターミナル.appにて実施しています。**

## homebrewインストール
[homebrewの公式サイト](https://brew.sh/index_ja)のスクリプトを実行するとインストールが始まります。

```sh

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```


### homebrew cask（拡張ツール）のインストール

homebrewをインストールしたことで基本的なCUIはインストール可能です。
ただし、GUIツールなどはインストールできないため、下記のコマンドでcaskという拡張ツールをインストールします。
このツールにより、例えばグーグルクロームやvs codeなどがインストールできます。

```sh

brew install cask
```

#### google chromeのインストール

試しにGoogle Chromeをインストールしてみます。
先ほどインストールしたcaskを使用したいのですが、cask上でどのような表記でchromeが存在するのか不明なので、まずはその表記を確認してみます。


確認方法は、`brew search`です。
このまま実行するとインストール可能なツールが全て表示されるため、`brew search ツール名`で条件検索ができます。

google chromeの場合は、`brew search chrome`ですね。

以下、実行結果です。

```sh


brew search chrome

==> Formulae
chrome-cli                               chrome-export

==> Casks
chrome-devtools
chrome-remote-desktop-host
chromedriver
dmm-player-for-chrome
epichrome
google-chrome
mkchromecast
homebrew/cask-versions/google-chrome-beta
homebrew/cask-versions/google-chrome-canary
homebrew/cask-versions/google-chrome-dev
```

すると出力結果の中に、`google-chrome`を確認できました。
これをインストールするとgoogle chromeが使用可能です。

```sh

brew cask install google-chrome
```


## anyenvのインストール

anyenvは、様々な言語のバージョン管理ツールです。

| 言語名       |
|:-----------------|
| rbenv(ruby)             |
| pyenv(python)             |
| nodenv(node.js)             |
| goenv(go)             |
| jenv(java)             |

上記を一括して管理できるのが、anyenvです。


まず、以下のコマンドでファイルをダウンロードします。
ダウンロード先として、ホームディレクトリに「anyenv」という隠しファイルを作成しました。

```sh

git clone https://github.com/anyenv/anyenv.git ~/.anyenv
```

この状態で実行しても何も起こらないため（以下参照）、PATHを通します。

```sh

anyenv: command not found
```

anyenvがどこにあるかを示すため、bash_profileに追記します。
※bash_profileがない場合は、作成します。

```sh
touch ~/.bash_profile
```

以下のコマンドを実行します。

```sh
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
```

zshをご使用の場合などは、githubのreadmeの内容を参考に実行してください。
https://github.com/anyenv/anyenv


最後にもう一つコマンドを実行してセットアップは完了です。
「anyenv init」を実行するよう設定します。

```sh
echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
```

上記諸々が完了した後、ターミナルを再起動するとanyenvが使用可能になります。


万一「ANYENV_DEFINITION_ROOT」などのエラーが出た場合は、以下を実行してください。

```sh
anyenv install --init
```

### nodenvインストール

以下のコマンドでインストール可能な***envを一覧表示できます。

```sh
anyenv install --list
```

今回は、nodenvをインストールするため、以下のコマンドでインストールします。

```sh

anyenv install nodenv
```

インストール完了後は、ターミナルを再起動してください。
その後、nodenvが利用できます。


### node.jsのインストール

nodenvでインストール可能なnode.jsのバージョンは、以下のコマンドで一覧表示できます。

```sh
nodenv install --list
```

公式では、「10.15.3」が推奨バージョンとして提供されているので、このバージョンをインストールします。
[> node.js 公式](https://nodejs.org/ja/)


以下コマンドで、「10.15.3」をインストールします。

```sh

 nodenv install 10.15.3
```

グローバルで有効化するため、以下のコマンドを実行する。

```sh

nodenv global 10.15.3
```

有効化されているバージョンを確認します。

```sh

node -v
v10.15.3
```

これで完了です。
ノンデザイナーがAdobe Illustratorで写真をイラスト風に加工して遊ぶ

# はじめに
- [Adobe学生版](https://www.adobe.com/jp/creativecloud/buy/students.html)を購入したので、勉強のためにいろいろいじってみる。
- どこかで使えるスキルになったらいいなあ。

# 参考資料
Adobe製品は入門教材が充実しているので、学習に困ることはなさそう。
今回はAdobe Illustrator Tutorial的な位置づけの下記教材の内容にチャレンジ。
[IllustratorことはじめStep3：実践「印刷物の作成」](https://helpx.adobe.com/jp/illustrator/how-to/beginners-tutorial-3.html?playlist=/jp/ja/ccx/v1/collection/product/illustrator/segment/designer/explevel/beginner/applaunch/orientation/collection.ccx.js) 

## その他
[Adobe Blogs](https://blogs.adobe.com/japan/) 
Adobe関連の最新情報が手に入る公式ブログ。眺めているだけでなんだか楽しい。

[Creative Cloud 道場](https://blogs.adobe.com/creativestation/category/ccdojo) 
Creative Cloud エバンジェリストの仲尾毅が様々な最新情報をライブストリーミングで紹介してくれる番組。毎週木曜日 夜20時から。Twitterで特定のハッシュタグをつけてツイートすると、抽選でプレゼントがもらえたりして楽しい。

# 楽しい方法をいくつか紹介
前のインターン先で撮影してもらったこの写真をいじっていく。
SNSのアカウントの画像をすべてこの写真にしているぐらいにはお気に入りの一枚である。

![アセット 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209511/c846bf94-04be-046e-edcc-8b4c47f8d3ab.png)


## 写真をイラスト風に加工したい。
最近ではスマホアプリでもできるようになったこの加工。Illustratorだとこうなる。
写真の精度を下げる（少ない色で表現する（？））ことによりイラスト感が出るらしい

### 手順
- プロパティ > 画像トレース >  写真（低精度）
（数秒時間がかかる。お茶でも飲んで待とう。）

![アセット 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209511/2ff0fbe1-9a56-bb28-54e1-7745164935dd.png)

できたのがこちら。どことなくアメコミ風。

## イラスト風写真をいろいろ加工したい。
上記でイラスト風に加工した写真でさらに遊びたい。そんなときは写真を「パス」に変換しよう。
※ 「パス」が分からない人は[こちら](https://liginc.co.jp/web/design/illustrator/81319)

### 手順
- プロパティ > 拡張

![スクリーンショット 2019-04-27 19.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209511/5f5432ec-faf3-4370-ea48-b43f63713211.png)
さながら地図の等高線。これでパワーポイントの図形を操作するように写真を編集することができる。


![スクリーンショット 2019-04-27 17.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209511/96fcf9b5-9c11-9f4d-422e-928a10ba3b4c.png)
こちらは左目の部分。パスを編集すれば目の形を変えられる。


![アセット 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209511/891dceb4-b1ce-3e43-c837-b7b88678aa4e.png)

いろいろいじった結果がこちら。
何に活きるかはわからないけど、可能性を感じました。


## 所感
- デザインは、楽しい。（まだデザインとは言えないかもしれないが....）
MacからWindowsへ移行 > VMwareのファイルvmdkファイルが読めない > 原因: 日本語vmdkファイル名の不整合

```txt:動作環境A
Macbook Air 2013 June モデル (MD760J/A)
VMware Fusion 8.5.2
```

```txt:動作環境B
Lenovo Thinkpad W541
Windows 10 Professional v1809
VMware Workstation 15 Pro
```

### MacからWindowsへの移行時のハマり

- VMwareファイルを移行 (Windows 8.1 Pro)
- Macから関連ファイルすべてをWindowsへコピー
- vmxファイルを起動した時に下記のエラーが発生
    - > `ファイルが見つかりません: 仮想ディスク.vmdk`

一見したところ

- `仮想ディスク.vmdk`ファイルはある

### 対処

- vmdkのファイル名を変更
    - 変更前: `仮想ディスク.vmdk`
    - 変更後: `virtualDisk.vmdk`
- vmxファイルの記載を変更
    - 変更前: `仮想ディスク.vmdk`
    - 変更後: `virtualDisk.vmdk`

上記により起動したところ、Windows側でVMイメージを起動できた。

### ファイル名の気になったところ

vmxファイルの記載に関して「`仮想ディスク.vmx`」の部分が「`仮想デ○ィスク.vmx`」のように文字化けを起こしていた。
(実際にはデの濁点が○の右側に来ていた）

MacOSXとWindows間で文字の整合性がないのだろうか。

### 予防策

MacOSX側において仮想イメージを作る時、漢字を避けた方がいいかもしれない。

### 備考

スナップショットがある場合、vmdkファイルの参照がより複雑になり、単純なvmx編集では対応できないようだ。
移行前はスナップショットを消しておくのが良い。

また、スナップショット自体、VMイメージのパフォーマンスを下げるため、一時的な作業終了後にはスナップショットを削除することをおすすめする。
canvasを使うときは、CSSは使わないでください！

#Abstract
ブログなどでcanvas APIの仕様を誤解し、ハマっている人々をちらほら見かけたので、ここにcanvas使用上の簡単な注意を記す。

※この記事ではcanvas API周りの概念の説明を旨としており、実際の使い方やコード、例などは記さない。

#canvas APIは、HTML、JavaScriptによりアクセスする
canvas APIとは、drawing contextを取得して、動的な描画を実現するJavaScript用のAPIである。

drawing contextとは、getContext()メソッドにより返される、描画をするためのオブジェクトである。

canvas要素が、「キャンバスそのもの（＋額縁が混ざったもの）」に相当し、
drawing contextが「キャンバスに設置された画用紙（＋筆や絵の具などの絵を描くための道具オブジェクト）」に相当する、と考えるとよい。


**canvas APIは、HTML、JavaScriptによりアクセスする。**

canvas要素のプロパティ(canvasのサイズや縁など)の設定をHTMLで、
canvasに描画するというメインの仕事をJavaScriptで、
それぞれ行う。

#ちらほら見かけた失敗話
「CSSでcanvas要素のサイズを変えるようにスタイルを指定したら、canvasの中に描かれた中身の画像や絵そのものが引き延ばされてしまった」
といったケースがちらほら見られた。


「CSSの役割は、あくまでHTML要素の装飾であり、canvas APIの機能にアクセスすることはできない」
という点に注意すべきである。
CSSは、「canvas要素というHTML要素の静的な操作」はできても、
canvas APIへのアクセス手段はないのである。
これが、スクリプトが上記のような期待しない挙動を示してしまった要因である。

また、このような勘違いを減らすためには、
「公式・準公式のマニュアルやチュートリアルを確認する」
のが大切である。

以下canvas APIについて書かれた、有用なマニュアルやチュートリアルのサイト（公式・準公式混在）を記す：

【公式】
https://www.w3.org/TR/2dcontext/
W3C公式文書
【準公式】
http://bucephalus.org/text/CanvasHandbook/CanvasHandbook.html#official-standards
仕様についてもわかりやすく解説している優秀なcanvasチュートリアルサイト

https://html.spec.whatwg.org/multipage/canvas.html#implementation-notes
canvas API説明サイト

https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API
簡単な使用法の説明はここで

###訂正
不適切な説明があったため、記事を大幅に改変した
Leetcode #144: Binary Tree Preorder Traversal

Preorder traversal: root -> left -> right

recursive solution:

```swift
func preorderTraversal(_ root: TreeNode?) -> [Int] {
    if let node = root {
        return [node.value] + preorderTraversal(node.left) + preorderTraversal(node.right)
    } else {
        return []
    }
}
```

iterative solution:

```swift
func preorderTraversal(_ root: TreeNode?) -> [Int] {
    if let node = root {
        var nodeStack = [node]
        var answer = [Int]()
        while(!nodeStack.isEmpty) {
            let current = nodeStack.popLast()!
            if let rightNode = current.right {
                nodeStack.append(rightNode)
            }
            if let leftNode = current.left {
                nodeStack.append(leftNode)
            }
            answer += [current.val]
        }
        return answer
    } else {
        return []
    }
}
```
create-react-appを理解する

# create-react-appを理解する

## はじめに

なんかブラウザアプリ作ってみたい +
 仕事で少しjavascript触ったことある +
  Reactいいよみたいな話聞いた記憶があるので
初めてのReactでなんか作ろうと思います。  
備忘録とあわよくばフィードバックもらえると嬉しいなという気持ちでQiitaにアップしていきます。

今回は初めてのReactでなんか作る(create-react-app編)

## Reactプロジェクトを作る

[公式ドキュメント](https://reactjs.org/tutorial/tutorial.html)を参考にして

```sh
npm install -g create-react-app
npx create-react-app my-app
```

でReactプロジェクトが作られます。  
中身がわからないままでは気持ち悪いので、作られたものを見ていきます。

### フォルダ構成

```sh
my-app/  
  ├─.git/  
  ├─node_modules/  
  ├─public/  
  ├─src/  
  ├─.gitignore  
  ├─package.json  
  ├─package-lock.json  
  └─README.md  
```

### git

自動的にgit管理されるようになっています。
gitのlogを見ると  
masterブランチに"Initial commit from Create React App"というコミットメッセージでコミットされています。

.gitignoreも自動生成されており、/node_modulesや/buildなど色々ignoreされるように設定されています。  
(/.pnpと.pnp.jsって何だろう？
ググるとSharePointが出てくるけどもいまいちわからん。)

### package.json

[1]:https://docs.npmjs.com/files/package.json

#### private

[npm Documentation][1]によると、
`"private": "true"`とすることでnpmで(事故って)公開されることを防止してくれるそうです。

#### dependencies

- react
- react-DOM
- react-scripts

の３つのパッケージのみ

#### scripts

- `"start": "react-scripts start"`
- `"build": "react-scripts build"`
- `"test": "react-scripts test"`
- `"eject": "react-scripts eject"`

の４つのスクリプトが定義されています。

#### eslintConfig

react形式の書き方に対応するように設定を追加しています。

#### browserslist

production環境では
[browserl.list](https://browserl.ist/)上で0.2%以上のShareを持つものから

- deadステータスのもの
  - ちなみにこれによってIE9がターゲットから外されています
- opera mini
  - [browserslist](https://github.com/browserslist/browserslist)のREADMEに、
  opera miniにはアフリカに１０万人のユーザがいてEdgeよりも世界的にはPopularなんだから
  理由なく除くなよ的なことが書いてあります。なんで除かれているんでしょう？

の二つを抜いたものをターゲットにビルドされるように設定されています。

dev環境ではChrome, firefox, safariの最新バージョンがターゲットに設定されています。

### public/ & src/

サンプルアプリの、ソースコードが入っています。  
public/ には
ベースとなるhtmlファイルとmanifest.jsonとreactのiconが、
src/ にはjsファイルとcssファイルが入っています。

## あとがき

- .gitignoreとかpackage.jsonをちゃんと読むと色々調べるきっかけになってよいですね。

- 飽きっぽいのでこれで終わりになってしまうかもしれません。
Python3 初心者　タプル

#タプル
タプルとはイミュータブルであり、要素を追加、削除、変換などをすることが出来ない。だからリストより使われる頻度は少ない
##()によるタプルの作成

```py
sports=('soccer', 'baseball', 'basketball')
sports
('soccer', 'baseball', 'basketball')
1, 2, 3=sports
1
'soccer'
```

##tuple()はデータ構造をタプルに変更できる。
```py
sport1=['baseball', 'basketball', 'soccer']
turple(sport1)
('baseball', 'basketball', 'soccer')
```

#タプルとリストの違いについて
タプルは作成時に書き換えることが出来ないため要素の追加や削除などは出来ない。だけどなぜタプルが存在するのでしょうか。まず一番は消費スペースの少なさである。消費スペースが少ないとその分早くなる。自分は要素の編集とか出来ないんだったらパスワードを入れる用としてタプルを使うのがいいと思う。
#（番外編）コピーと代入について
コピーと代入の違いについて説明します。
コピーというのは要素をそのままコピーするという意味でもしコピーする前の値を変更したとしても値をコピーしているため要素は変更前の値が出てくる。逆に代入は要素をいくら変えてもその変えた要素が出てくる。

```py
a=[1, 2, 3]
b=a.copy()
b
[1, 2, 3]
a[1]=1.5
a
[1, 1.5, 3]
b
[1, 2, 3]
```
と変更しても結果は変わることはない。
10Arduinoで簡単に距離センサーＧＰ２Ｙ０Ｅ０３からI2Cで値を取得する

##距離センサーについて
距離センサーといってもいくつか種類があります。
-光学式
-超音波
-レーザー　　など

今回使用してみたいセンサーは、PSD(position sensitive detector)という素子を利用する赤外線光学センサーで、対象物との距離を反射光の入射角度によって読み取る方式です。

この方式で有名？個人的に昔から使っていたのが、シャープの[ＧＰ２Ｙ０Ａ２１ＹＫ](http://akizukidenshi.com/catalog/g/gI-02551/)です。このセンサーは対象物との距離をアナログ出力してきます。マイコンなどのA/D変換機能を用いると簡単に読み取ることが出来ますが、出力値が線形で無い（非線形）となり補正を必要とするなど、扱いにくい点もあります。

今回は新たに[GP2Y0E03](http://akizukidenshi.com/catalog/g/gI-07547/)以下E03を利用することにしました。
また、今回アナログポートを利用せずにI2Cで値を取得することで、PINの節約もしたいと考えました。

ArduinoのI2C（アイスクエアシー）については、[Arduinoを30分でI2C通信する](https://qiita.com/MergeCells/items/20c3c1a0adfb222a19cd)にてご説明頂いておりますので、ありがたく紹介させていただきます。

##シャープ製光学距離センサーＧＰ２Ｙ０Ｅ０３について
引用[GP2Y0E03](http://akizukidenshi.com/catalog/g/gI-07547/)　秋月電子通商
■特徴
・信号処理回路内蔵
・ＣＭＯＳイメージセンサ
 ・赤外ＬＥＤ採用
・小型（１６．７×１１×５．２　ｍｍ）
・高精度
・デジタル（Ｉ２Ｃ）／アナログ電圧出力

■主な仕様
・出力：Ｉ２Ｃおよびアナログ出力
・電源電圧（ＶＤＤ）：２．７～５．５Ｖ
・測距範囲：４～５０ｃｍ
 　Ｌ＝５０ｃｍにおいて
　　ＶＯＵＴ（Ａ）１＝０．３～０．８Ｖ
 　　Ｄ１＝４５～５０ｃｍ
 　Ｌ＝４ｃｍにおいて
　　ＶＯＵＴ（Ａ）３＝２．１～２．３Ｖ
 　　Ｄ３＝３～５ｃｍ
・サイズ：１８．９ｘ８．０ｘ５．２ｍｍ

となっています。
小さいこと、アナログ、I2Cどちらにも対応している点がうれしいです。
測定距離ですが、実感として60cm程度までが範囲かなと思います。
30cm程度の近距離は精度も安定しています。

##I2C接続
###GP2Y0E03単独でArduinoと接続
![＿距離センサー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/debd3873-dcdf-04f6-36fb-52b70c9aa1d9.png)
ArduinoのSCL(A5)とSDA（A4) をそれぞれ接続し、プルアップすればよいのですが、E03の電源電圧が3.3Vなので５V系のディバイスと接続する場合は、レベル変換を行う必要があります。
今回は[ＰＣＡ９３０６](http://akizukidenshi.com/catalog/g/gM-05452/)を使いました。
販売されている基板では、プルアップ抵抗が取付済みですので、改めて取り付ける必要はありません。

また、E03はI2C通信を行う場合GPIO1をHレベルにする必要があります。Lレベルのままだとスタンバイとなります。

###複数ﾃﾞｨﾊﾞｲｽでArduinoと接続
![加速度センサー＿距離センサー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/3145c792-fc97-ed5f-5ded-4507a3838db7.png)
スレーブアドレスが異なるディバイスをバス上に接続する数場合の結線図です。
試に加速度センサー[ＡＤＸＬ３４５](http://akizukidenshi.com/catalog/g/gM-06724/)を組み込みました。

##通信プログラム
```cpp:Robot19
#include <Wire.h>

// デバイスアドレス(スレーブ)
uint8_t E03_DEVICE_ADDRESS 0x40
uint8_t DISTANCE_ADDRESS 0x5E



void loop(){
  uint8_t dis[2];
  uint16_t  distance;

  Wire.beginTransmission(E03_DEVICE_ADDRESS);
  Wire.write(DISTANCE_ADDRESS );
  Wire.endTransmission();

  Wire.requestFrom(E03_DEVICE_ADDRESS, 2);
  for (i=0; i< 2; i++){
    while (Wire.available() == 0 ){}
    dis[i] = Wire.read();
  }
  
  distance = dis[0]<<4;
  distance |= dis[1];
  distance = (distance / 16) / 4;
  Serial.print(dis[0]);
  Serial.print("  ");
  Serial.print(dis[1]);
  Serial.print("  ");
  Serial.println(distance);
}
```
設定については全てDefaultです。いじってません。

距離の値は12バイト長となっており、
E03のアドレス0x5eにDistance[11:4]　0x5fにDistance[3:0]か格納されています。
従って、2バイとに分けられてデータが受信されます。
上位を4ビット左シフトし、下位の4ビットとORすることで12ビットのデータを生成できます。
distance = (distance / 16) / 4;　にて[cm]に変換しています。
実測で確認しましたが、式が間違っていたらごめんさい。
![出力値_距離センサー２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/a85bb37e-4bae-fa9d-e3cf-8d7739ba9493.png)
最後にシリアルモニターで確認します。
①0x5e_Distance[11:4]の値(上位)
②0x5f_Distance[3:0]の値(下位)
③距離[cm]


##最後に
3.3V系のディバイスでは、非常に便利です。
しきい値など細かい設定が出来ます。さらに用途に応じた設定が出来ると思います。
今年の言語はRust その３９

# 今年の言語はRust その３９

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 13. 関数型言語の機能: イテレータとクロージャ

### 13.4 パフォーマンス比較

オーディオデコーダのでコードアルゴリズムを参考に見てみる。

以下のサンプルでは、あるバッファ値と係数を内積して、右にビットシフトさせている。

このようなコードはパフォーマンスに重きを置かれる。


```rust
let buffer: &mut [i32];
let coefficients: [i64; 12];
let qlp_shift: i16;

for i in 12..buffer.len() {
    let prediction = coefficients.iter()
                                 .zip(&buffer[i-12, i])
                                 .map(|(&c, &s)| c*s as i64)
                                 .sum::<i64>() >> qlp_shift;

    let delta = buffer[i];
    buffer[i] = prediction as i32 + delta;
}
```

驚くことにRustでは、手作業で書いたものと同じ機械語にコンパイルされる！！！！！！！！

つまり、クロージャやイテレータを使っても、コンパイラによってオーバヘッドをなくした実装がされている！


なんてことだ！

> イテレータとクロージャを恐れなしに使用することができますね！それらのおかげでコードは、高レベルだけれども、 そうすることに対して実行時のパフォーマンスを犠牲にしないようになります

__低レベルのパフォーマンスで、高レベルの考えを明確に実現する__ というRustの能力

惚れ直した


イエス！
Android Studio 3.3 で Android Instant Apps に簡単に対応させる

https://developer.android.com/topic/google-play-instant/getting-started/instant-enabled-app-bundle

大体↑の内容のかいつまみです。間違い等あればご指摘いただけると助かります…

## Android Instant Apps とは

https://developer.android.com/topic/instant-apps/overview?hl=ja

Android Developer に詳しく書かれているので詳細は省略させていただきますが、短く言えば

**ストアの「今すぐ試す」ボタンからインストールせずに体験してもらえるアプリ**

です。

インストールせずに使ってもらえるので、ユーザーに触ってもらいやすくなるなどのメリットがあります。

## 過去の Android Instant Apps

これまでの Android Instant Apps の実装は楽とは言えない実装でした。

モジュール分割・App Links 対応など、既存のアプリをあとから対応させるには手間がかかり、対応を後回しにし続けた結果、対応せずに放っておかれてしまった…などの経験もあるかと思います。

## Android Studio 3.3 からは

App Bundle を使用している場合に限り、より簡単に Android Instant Apps 対応ができるようになりました。
今回は単一モジュールの場合について書いていきます。複数モジュールの場合はまた今度…

### その際に必要なもの

- Android Studio 3.3 以上
- Google Play Instant Development SDK
    - なければ メニューの [Tool]→[SDK Manager]→[SDK Tools]からインストールできます。
- Android 5.0(API Level 21)以上のデバイス(エミュレータでもOK)
    - Android Instant Apps のテスト動作に Android 5.0 以上が必要なため

その際の制限は以下です。

- モジュールの容量は10MB以下。(リソースを含めて)
- 使用できるパーミッションは以下のみ。
    - ACCESS_COARSE_LOCATION
    - ACCESS_FINE_LOCATION
    - ACCESS_NETWORK_STATE
    - BILLING
    - CAMERA
    - INSTANT_APP_FOREGROUND_SERVICE
        - Android 8.0(API Level 26) 以上限定
    - INTERNET
    - READ_PHONE_NUMBERS
        - Android 8.0(API Level 26) 以上限定
    - RECORD_AUDIO
    - VIBRATE
    - WAKE_LOCK

### 手順

1. Instant Apps をサポートしたいモジュールの `AndroidManifest.xml` を開き、

```xml
<manifest
    (略)
    xmlns:dist="http://schemas.android.com/apk/distribution">

    <dist:module dist:instant="true" />

</manifest>
```

のように `xmlns:dist` で始まる行を追加し、そのタグの中に `<dist:module dist:instant="true" />` の一文を追加する。

これだけでできてしまうようになりました。

過去に Instant Apps 対応していた人からすれば、かなり簡単になっているかと思います。また、リソース含めた容量も 10MB となっているので、簡単なツールのアプリなら、すぐに対応できるかもしれません。

### 確認手順

[Run/Debug Configurations](!https://developer.android.com/studio/run/rundebugconfig)のダイアログを開き、`Deploy as instant app` のチェックを付けてデバッグ・実行すれば Instant Apps で実行されたものとしてデバッグできます。上記のパーミッション関連で挙動が変化してしまうこともあるので、しっかり確認して手を入れる必要がある場所があれば手を入れましょう。

### コード内で Instant Apps で実行されているかを確認する方法

```kotlin
InstantApps.isInstantApp(applicationContext)
```

以上の式で確認できます。1, 2か所動作を変える必要がある場合など、うまく活用しましょう。
入力フォームのバリデーションチェックについてわかりやすく解説！

# この記事で分かること
- バリデーション（入力チェック）とは何か
- バリデーション（入力チェック）の役割
- 入力フォームで入力する項目に合わせたバリデーションの書き方

# バリデーション（入力チェック）とは
- 入力内容が要件を満たしているかを確認すること
 - （例）入力必須項目に未入力がないかを確認する　

<img width="650" alt="スクリーンショット 2019-04-27 17.27.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/f3d9105a-058f-9de1-d642-6da148a7353a.png">

## バリデーション（入力チェック）の役割
- フォームに入力して欲しい項目が正しい形式で入力されているかを確認し、入力ミスを防ぐ役割があります

## （例）バリデーション（入力チェック）が無効になっている場合
バリデーション（入力チェック）の役割について、もう少しわかりやすく説明します。
以下のようなお問い合わせフォームがあるとします。


<img width="671" alt="スクリーンショット 2019-04-27 16.57.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/6886e59e-0efc-67be-7c70-549d21d3d9f1.png">

### 間違った内容が送られてしまう

ユーザーが入力項目に以下のように入力したとします。


<img width="698" alt="スクリーンショット 2019-04-27 17.01.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/56668501-e3cf-0bc0-d70e-a50bffd8d425.png">

「メールアドレス」の項目に間違えて「名前」を入力してしまいました。
バリデーション（入力チェック）がないとこのまま入力内容が送られてしまいます。

### 入力ミスを防ぐ
なので、以下のようにフォームに入力して欲しい項目が正しい形式で入力されているかを確認し、事前に入力ミスを防ぐ役割があります

<img width="684" alt="スクリーンショット 2019-04-27 17.07.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/e3848f6b-0f35-02f3-d90d-f9d97e1f92d4.png">

# 入力フォームで入力する項目に合わせたバリデーションの書き方
バリデーションは、入力項目によって入力される値が異なるので、入力項目に合わせたバリデーションを実装する必要があります。

ここでは、よく使うバリデーションを3つ紹介します。

## 1.必須項目のチェック
- 必須項目に未入力がないかをチェックします

### コード例
- （例）名前の項目を未入力チェックしたい場合

```php:index.php
<?php

  if (empty($_POST["name"])) {
    	echo "この項目は入力必須です";
	}
?>
```

### 解説
- `empty関数`を使って「`$_POST["name"]`に値が入っている場合は」という条件を与えています。
- 未入力（値が入っていない）場合は未入力なのでエラーになります。

## 2.最大値のチェック
- 文字数の最大値をチェックします

### コード例
- （例）名前の最大値を10文字以内でチェックしたい場合

```php:index.php
<?php

if (mb_strlen($_POST["name"]) > 10) {
    	echo "10文字以内で入力してください";
	}
?>
```

### 解説
- `mb_strlen関数`を使って`「$_POST["name"]`の文字列の長さを取得します。
- 10文字以上の場合はエラーになります。

### 3.メールアドレスの形式チェック
- メールアドレスが正しい形式で入力されているかチェックします

### コード例
- （例）メールアドレス形式で入力されているかチェックしたい場合

```php:index.php
<?php

if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\?\*\[|\]%'=~^\{\}\/\+!#&\$\._-])*@([a-zA-Z0-9_-])+\.([a-zA-Z0-9\._-]+)+$/", $_POST["email"])) {
	echo "メールアドレスの形式で入力してください";
}

?>
```

### 解説
- `preg_match関数`を使って`$_POST["email"]`の文字列がメールアドレスの正規表現にマッチするか検索します。
- メールアドレスの正規表現にマッチしない場合はエラーになります。

### 【補足】正規表現とは
- 様々な文字列を一つの文字列で表現する記述方法です

※文字の記述方法のルールやパターンを一つに表現するイメージです。
わらりづらいと思うので、以下でもう少しわかりやすく説明します

#### （例）メールアドレスの正規表現の場合
次のようにメールアドレスの記述方法にはルールやパターンがあります
`例：waka@e2info.com`
`例：waka3@gmail.com`
`例：wakawaka@icloud.com`


- メールアドレスは文字列の途中で必ず「@」が入るというルールがあります。また、「@」の前に英数字や記号。「@」の後にドメイン（e2info.com）が入ります。
- これらのメールアドレスの様々な文字列のルールを、以下のように一つの文字列で表現したものが正規表現です。

```php:メールアドレスの正規表現
/^([a-zA-Z0-9])+([a-zA-Z0-9\?\*\[|\]%'=~^\{\}\/\+!#&\$\._-])*@([a-zA-Z0-9_-])+\.([a-zA-Z0-9\._-]+)+$/
```

### 【補足】preg_match関数とは
- 正規表現にマッチするか検索を行う関数
OpenCV 画像の二値化

# 概要
OpenCVを使った画像の二値化について書きます。

## 画像の二値化（自分で閾値を設定）
画像は有名なLenaを使います。
グレースケールで読み込むので、cv2.imreadの第二引数に"0"を書きます。
二値化はcv2.thresholdで行います。
cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値,  二値化の方法)
閾値と、二値化された画像を返すので、変数を二つ用意（retとimg_thresh）。



```python:画像の読み込みと表示.py
import cv2

# 画像の読み込み
img = cv2.imread("./data/Lena.jpg", 0)

# 閾値の設定
threshold = 100

# 二値化(閾値100を超えた画素を255にする。)
ret, img_thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)

# 二値化画像の表示
cv2.imshow("img_th", img_thresh)
cv2.waitKey()
cv2.destroyAllWindows()
```
![lena_th_bi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339647/c14430b6-eb16-1ac0-6129-894b1024a7f2.jpeg)
ちょっと白く飛びすぎ？


## 閾値を自動で設定
上記は閾値を自分で設定したが、画像に応じて自動で決定してくれる便利なものもある。
cv2.thresholdcv2.THRESH_OTSUを使う

```python:change_windowsize.py
ret2, img_otsu = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)

#閾値がいくつになったか確認
print("ret2: {}".format(ret2))

#画像の確認
cv2.imshow("otsu", img_otsu)
cv2.waitKey()
cv2.destroyAllWindows()

```
ret2: 117.0

![lena_th_otsu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339647/06adb8bd-2322-3d6e-5835-bd13d426f683.jpeg)

自動では閾値は117になり、
より自然な画像となった。



## まとめ
とりあえず二値化について２つの方法を書いてみた。
他にも種類があるのでまた試したい。