OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのC++【11日目】

#はじめに
ロベールを読み始めた頃は一週間で読み終わるとか言ってたが、全然読み終わる気がしない。
UE4のチュートリアル本をやっているのですが、ブループリントっていってコーディングしないんですよね。もっとコード書いて開発したい。
c++の勉強法の記事を見つけて読んでみると、ロベールの次はポインタの本をやれって書いてあるんですけど、ロベール終わったら、c++でゲームアプリとか作ってみようかなと思います。どんなアプリ作るかは考え中。物理法則とかをたくさん使用したい。
iosアプリはswiftが使われてるみたいけど、C++でもできるみたい。
https://qiita.com/imasaaki/items/9803029225ef17137d4f

あと、動的と静的についてのコメントをいただいて、初心者でもわかりやすく説明している文があったので紹介しておきます。
>実行時まで分からないのが動的で、構文解析時点で解決できるのが静的


##ロベールのC++
###分割コンパイル
```コンパイル``` とは、コンピュータが実行可能な機械語に翻訳すること。
```コンパイラ``` とは、翻訳作業をするプログラム

各ソースファイルごとに完全に独立してコンパイルされるため、一つのソースファイルをコンパイラするときは他のソースファイルの影響を受けない。

あるソースファイルで関数を作り、別のファイルでもその関数を使いたいときは、ヘッダファイルをインクルードする。
ヘッダファイルに関数のプロトタイプなどを書いておく。
また、ヘッダファイルには```const```をつけておくと便利。const定数(constexprのことだと思う)は内部リンケージになる。
ヘッダファイルには必ず二重インクルード防止コードを記述する。
```#ifndef``` ```#define``` ```#endif```を使用する。
これらの#のついた命令を「前処理司令（プリプロセッサディレクティブ）」という。#includeもその一つ。

```Reader.h
#ifndef READER_H
#define READER_H

constexpre int N = 10;

#endif
```

※13と14はメモ書きするほどでもなかったので飛ばします。
###05-14　new & delete 1 of 3
今までは変数を作ってメモリを利用していたがメモリをもっと自由に利用できるとのこと。

```New1.cpp
#include <iostream>

int main()
{
  int *p = new int;//new intはint型を入れることができるメモリを貸す。new charだとchar型になる。

  *p = 0;
  std::cout << *p << std::endl;

  delete p;
}
```
<img width="11" alt="スクリーンショット 2019-03-08 1.10.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/c4025e62-3a43-56de-bba3-62abb4135672.png">

newというのは、メモリを動的に確保するための演算子である。
メモリを動的に確保するとは、「これだけメモリを使いたいんですけど...」と頼むこと。
newで確保できるメモリのことを「フリーストア」という。
そして、借りたメモリは返さなければならない。メモリを返すことを「メモリを開放する」という。
動的に確保したメモリのアドレスをdelateにわたすと、メモリが開放される。

**newで確保したメモリは、不要になれば必ずdelateで開放する（スーパー重要）**

メモリを開放しないままそのアドレスを保持するポインタがなくなってその領域が再利用できないことを**メモリリーク**という.メモリリークは原因箇所を特定するのが難しく、プログラムバグにおいては上位に入る最悪なバグ

もし、newでメモリを借りようしてメモリが借りれなかったらnullが返ってくるのでnull避けは必須である。
さきほどのコードに、

```cpp
if(p != NULL){
  *p = 0;
  std::cout << *p << std::endl;

  delete p;
}
```
という風にかく。
#終わりに
あと、2つでクラスに突入！
明後日はクラスの勉強をはじめるぞ！
S3のバケットを作成する際にリージョンを間違えてはいけない

# S3のバケット作成時のリージョン
ここでリージョンを選択しますが、
![スクリーンショット 2019-03-08 1.17.08.png](https://qiita-image-store.s3.amazonaws.com/0/266334/64766825-f268-3064-338d-cd5df09c36cb.png)
間違えると後から修正できません。

# 間違えるとどうなるか
仕方ないので作り直そうと思いきや、
![スクリーンショット 2019-03-08 1.19.09.png](https://qiita-image-store.s3.amazonaws.com/0/266334/c6988428-21a1-4fe3-718d-00e3545b7ffd.png)
```
A conflicting conditional operation is currently in progress against this resource. Please try again.
```
というエラーが出てすぐには作成できません・・・

1時間ほど待つと再度同名で作成できます。
GCPプロジェクトの全ディスク使用量を確認する

# GCPプロジェクトの全ディスク使用量を確認する

## きっかけ

このプロジェクトのディスクって何GB使ってる？と聞かれて、
あれ？どうやればいいんだっけ？という状態になった。
課金で見るか、Quotaで見るか・・・うーん。っていう感じだったが、`gcloud`でやったほうがかっこよくない？とちょっと思ったからやってみた。

## どうやったか

`gcloud`コマンドでは以下のように出力される

```shell
gcloud compute disks list

NAME   ZONE   SIZE_GB   TYPE   STATUS
```

んで、トータルを出す。

```shell
gcloud compute disks list | grep -v SIZE_GB | awk '{sum += $3} END {print sum}'
200
```

種類ごとに集計する

```shell
$ gcloud compute disks list | grep -v SIZE_GB | awk '{type[$4]+=$3} END {for(name in type){print name " "type[name]}}'
pd-standard 150
pd-ssd 50
```
ド素人が超簡単なwebアプリ作ってみた。


##何するアプリ？
「今日の晩ごはんどうしよう？」って経験は誰しもあるはず。
そんなときポチッとボタン押すと何するか決めてくれるアプリです。

■今日の晩ごはん
https://kyo-no-bangohan.herokuapp.com/

##使用言語とか

■フロントエンド
html
css
javascript

■バックエンド
ruby

■フレームワーク
sinatra

##所感
プログラミングそのものよりも環境構築の方が大変でした。
2週間かけて各言語の基礎やった割にはそこまでコード書かなかったです。
まさかバックエンド部分がこんなに簡単に済むなんて・・・
次はもうちょい手の混んだアプリを作りたい。
チャットボットなんて面白そう。

##おわりに
自分で処理書いてああだこうだするのが一番の上達の秘訣ってのはホントらしい。初学者は簡単なモノ作って「童貞卒業」してみるべし。
ここまで読んで頂きありがとうございました。
Storyboardでレイアウトを組む

実務ではコードでレイアウトを組むことが多いので、Storyboardでレイアウトを組むやり方も忘れないように勉強してみました。

## 公式のドキュメントを読む

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/BuildABasicUI.html#//apple_ref/doc/uid/TP40015214-CH5-SW1

上記にアプリを開発する過程を学べそうなドキュメントがあったので読みながら進めてみました。Storyboardに特化したドキュメントではありませんが、アプリを作りながら学べそうだったので選んでみました。

ただし、ドキュメントの内容がちょっと古いです。説明に使われている画像を見ると「iPhone7」と表示されているので、おそらくSafe Areaなどが出る以前に作成されたものだと思います。

## プレビュー機能

各端末、Portrait、Landscapeなど、シミュレータを起動せずにレイアウトを確認できます。
Assistant Editorを開くと、対応するソースコードが表示されているかと思います。Automaticと表示されている部分（Editor selector bar）をクリックすると一番下にPreviewという表記があるので、それを選択するとStoryboardのレイアウトをプレビューできます。

しかし、IBDesignableを指定したコンポーネントはプレビューの方には表示されませんでした。Editorの方のデバイスサイズを変えることで多端末の確認はできるのですが、かなり処理重かったです。。

## IBDesignable, IBInspectable

コードで組んだレイアウトをStoryboard等に反映させることができます。コードを変更しビルドしても、Storyboardの方に反映されない場合は、メニューの Editor/Refresh All Viewsを選択してみると解決するかもしれません。
IBInspectableは、プロパティの宣言時に型を指定する必要があるみたいですね（推論させると反映されないみたい）。


## ２つのオブジェクト間の制約の付け方

https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithConstraintsinInterfaceBuidler.html#//apple_ref/doc/uid/TP40010853-CH10-SW1

やり方が分からずちょっとの時間考えてしまいましたが、上記に書いてました。なるほど。右クリックで制約付けたいオブジェクトにドラッグするのですね。

## Constrain to margins

viewのもつmarginに制約を合わせることができます。UIViewControllerが持つviewには8ptがデフォルトで付いてますし、UITableViewのleadingとtrailingには20ptが付いてます。UITableViewの余白はscrollIndicatorなどのためでしょうか。

マージン関連は下記に記載がありますが、safeAreaを含めると少し複雑そう。
https://developer.apple.com/documentation/uikit/uiview/positioning_content_within_layout_margins

## まとめ

プレビューは便利ですね。コードだけでは見た目を想像するのが難しいViewもありますし。。あと、AutoLayoutの制約コンフリクトなどもすぐに分かるのは良いですね。
Storyboardの各Inspectorの設定を見るだけで、あまり使ったことのないプロパティなどを目にするので、勉強にもなりそうです。

ただ、使い方などを公式ドキュメントから探すのはちょっと大変だなと感じました。
GCE に ターミナルで SSH 接続を行うシンプルな手順

## 概要
Google Cloud Platform (GCP) の Google Compute Engin (GCE) で立てたサーバに SSH 接続を行う時の手順の備忘録。

GCE のインスタンスは外部公開されているサーバなので、やり方に気をつける必要がある。

### 前提
- ローカルマシン OS： macOS Mojave (v10.14.3)
- 接続ツール： ターミナル（標準搭載ソフト）

## 手順

### 利用者のローカルマシンで鍵生成

利用者のローカルマシンで鍵生成を行う。
鍵生成を行うと、`ユーザディレクトリ/.ssh/` に「id_rsa」「id_rsa.pub」ができる（はず）

必要になるのは「id_rsa.pub」で、以下の様な中身の方のファイル

```text
ssh-rsa xxx/... めっちゃ長い文字列 .../zzz ユーザ名@ローカルマシン名.local
```

### GCP コンソールで SSH 設定

コンソールメニューの「GCE → メタデータ」から「SSH 認証鍵」タブを選択。
もしくは、URL: https://console.cloud.google.com/compute/metadata/sshKeys にアクセス。

「編集」ボタンをクリックして、項目の追加で「id_rsa.pub」ファイルの中身を貼り付ける。


## 確認

ローカルマシンから SSH 接続を行う

```bash
ssh ユーザ名@ドメイン_または_IPアドレス
# または
ssh -l ユーザ名 ドメイン_または_IPアドレス
```

これで接続ができた。
BigQueryでN-gramの検索を再現する方法

`#standardSQL`

全文検索エンジンでよくあるテキストとクエリ(キーワード)の対が与えられたときにN-gramでの検索のフィルター機能をBigQueryで再現する方法

N-gram の箇所はこの記事を参考にさせていただきました
https://qiita.com/shiozaki/items/8cd0bf9301cfddddc81c

```
#standardSQL
CREATE  TEMPORARY FUNCTION NGRAM(str STRING, n INT64)
  RETURNS ARRAY<STRING> AS ((
    SELECT ARRAY(SELECT SUBSTR(str, seq, n) FROM UNNEST(T.seqs) AS seq)
      FROM (
        SELECT str, GENERATE_ARRAY(1, LENGTH(str) - n + 1) AS seqs
              ) AS T
));

CREATE  TEMPORARY FUNCTION
  ALL_MATCH_NGRAM(index STRING, keyword STRING, n INT64)
    RETURNS BOOL AS ((
      SELECT
         match_num = min_length
      FROM (
        SELECT
           count(*) as match_num,
           CASE WHEN LENGTH(index)<LENGTH(keyword) THEN LENGTH(index)-n+1 ELSE LENGTH(keyword)-n+1 END as min_length
        FROM
          (SELECT NGRAM(keyword, n) as keyword_ngram), UNNEST(keyword_ngram) kw, (SELECT NGRAM(index, n) as index_ngram), UNNEST(index_ngram) t_index 
        WHERE
          kw=t_index
    )
    ));

WITH
  index AS (
  SELECT
   "吾輩は猫である。名前はまだない。" as text
  ),
  
  query AS (
  SELECT
   "吾輩は猫" as keyword1
  )
  
SELECT
  text,
  keyword1,
  ALL_MATCH_NGRAM(text, keyword1,2)
 FROM
  index, query
```

`ALL_MATCH_NGRAM` というのがそれ。これであってる（はず）
なんども利用する文字列は事前に別にN-gramにかけておいたほうが計算効率は良いかもしれない。転置インデックスもどきテーブル
DjangoでBootstrapを用いて写真を一覧表示させたい時

DjangoでBootstrapのグリッド機能を用いて写真を横列にある枚数分だけ
一覧表示させたい時がある。

イメージとしてはこんな感じ。
pic  pic  pic
pic  pic  pic
pic  pic  pic

具体的な方法はforloop.counterを用いると解決できる。
ドキュメントにも詳しく書いてある。
http://djangoproject.jp/doc/ja/1.0/ref/templates/builtins.html

ソースの例はこちら

```sample.html
<div class = "container" style = "max-width:80%;">

  {% for post in posts.all %}
    {% if forloop.counter|divisibleby:4 or forloop.first %}
      <div class="row">
    {% endif %}
      <div class="col-md-4">
          <img class="" src="">
      </div>
    {% if forloop.counter|divisibleby:3 %}
    </div>
    {% endif %}
  {% endfor %}

</div>
```
BigQueryでスペース区切りのキーワードの語順を揃える方法

`#standardSQL`

"aa bb" と "bb aa" を同じものとみなしたい
上記のテキストが検索キーワードで、語順を無視して集計したいときとか
(語順がそこまで重要でない検索のログ集計とか)

```
#standardSQL

CREATE TEMPORARY FUNCTION 
  SPLIT_SORT(str STRING)
    RETURNS STRING AS ((
      SELECT ARRAY_TO_STRING(ARRAY_AGG(kw), " ")
          FROM (
            SELECT
              kw 
            FROM 
              UNNEST(SPLIT(str, " ")) AS kw 
             ORDER BY
              kw ASC
                  )
));


WITH
  a AS (
  SELECT
    ["a a", "a aa", "aa a", "a aa aaa"] as aa
  )
  
SELECT
  aaa,
  SPLIT_SORT(aaa) as sort_aaa
 FROM
  a,UNNEST(aa) aaa
```

`SPLIT_SORT` という関数がそれ

この記事を参考にさせていただきました
https://qiita.com/shiozaki/items/11aca34553e5e60abf19
Google Map API　地図がすぐに消えてしまう時の対処法

この時の対処法としてこちらのサイトが非常に参考になりました。
このサイトの方法に従えば上手くできるはずです！

私の場合はAPIの制限が上手く出来ていませんでした。

https://nendeb.com/276
BigQueryでスペース区切りのキーワードで部分一致AND検索をする方法

`#standardSQL` 

"hoge huga" で
"hogehage" は false
"hogehuga" は true
を返すような検索エンジンっぽい挙動をするテキスト一致を実現したい
残念ながらUDFを利用

```
#standardSQL
CREATE  TEMPORARY FUNCTION
  ALL_MATCH(text STRING, keywords ARRAY<STRING>)
    RETURNS BOOL AS ((
    SELECT
      ARRAY_LENGTH(keywords)=SUM(match_flg)
    FROM (
      SELECT
         CAST(STRPOS(text, kw)>0 AS INT64) as match_flg
      FROM
        UNNEST(keywords) kw    
    )
    ));
   
WITH
  a AS (
  SELECT
    ["a a", "a aa", "aa a", "a aa aaa"] as aa
  ),
  
  b AS (
  SELECT
    SPLIT("a aa" ," ") as bb1,
    SPLIT("a a" ," ") as bb2
  )
  
SELECT
  aaa,
  bb1,
  ALL_MATCH(aaa, bb1) as match1,
  bb2,
  ALL_MATCH(aaa, bb2) as match2
 FROM
  a,UNNEST(aa) aaa, b
```

`ALL_MATCH ` という関数がそれ
タグ付ゲームオブジェクトジェクトがColliderにヒットしたらタグのゲームオブジェクトを削除する




```
 private void OnTriggerEnter(Collider collision)
   {
        if (collision.gameObject.tag == "タグ")
        {
            GameObject[] 配列名 = GameObject.FindGameObjectsWithTag("タグ");
            foreach (GameObject 変数 in 配列名)
            {
                Destroy(変数);
            }
        }
    }
```
LightGBMをcondaを用いてwin10にインストールする

#概要
自身の環境にLightGBMを導入しましたので、メモとして残します。
LightGBMの性能の良さや、アルゴリズムの理解に関しては他の記事をご参考ください。

実行環境
windows10
Python 3.6.7 Anaconda 4.3.1 (64-bit)
##1. conda-forgeチャネルを追加する
conda-forgeはcondaからインストール可能なパッケージコレクションです。
もんのすごい数があって、2019/03/07時点でパッケージ数が6000超えてます。
ここからLightGBMをダウンロードしていきます。
[https://conda-forge.org/#about](https://conda-forge.org/#about)

そのため、まずはconda-forgeチャネルを追加します。

```powershell:
> conda config --append channels conda-forge
> conda config --get channels
--add channels 'conda-forge'   # lowest priority
--add channels 'defaults'   # highest priority
```
チャネルを確認し、defaultsが"highest priority"となっていればオーケーです。
これでconda-forgeチャネルの追加は完了です。

試しに調べてみると、lightgbmのパッケージが見つかりました。

```powershell:
> conda search --full-name lightgbm
# Name                       Version           Build  Channel
lightgbm                       2.0.4          py27_0  conda-forge
lightgbm                       2.0.4          py27_1  conda-forge
lightgbm                       2.0.4          py35_0  conda-forge
~
lightgbm                       2.2.2  py27hc56fc5f_0  conda-forge
lightgbm                       2.2.2  py36h6538335_0  conda-forge
lightgbm                       2.2.2  py37h6538335_0  conda-forge
```

##2. conda-forgeチャネルを追加する
追加するには、以下のコマンドを実行するだけです。

```powershell:
> conda install -c conda-forge lightgbm
```
pythonを実行し、無事importができていることを確認します。

```python:
import lightgbm
lightgbm.__version__ 
# '2.2.2' (2019/03/07時点)
```

今回はLightGBMの導入紹介でしたが、conda-forgeに登録されているパッケージなら同様の方法で簡単にインストールが可能です。
まずは探してみてconda, conda-forge内に見つかれば、非常に導入が楽です。
先人、というか今も開発をされている諸先輩方は本当に偉大ですね。


#参考
[LightGBMをAnaconda経由で簡単にインストールする方法](https://qiita.com/i_jp/items/86958b35b49fb835db2f)
[Pythonメモ-44 (conda に conda-forge チャネルを追加)](https://devlights.hatenablog.com/entry/2017/12/09/183715)
[CONDA-FORGE: https://conda-forge.org/#about](https://conda-forge.org/#about)
三項演算子と??（ハテナハテナ）と?:（ハテナ：）

# はじめに
この記事では、三項演算子とnull合体演算子(??),そしてエルビス演算子（？：）についてまとめています。

# それぞれの違い
まずは、実際にコードをみてみます。

```php

$x = null;
$y = 0;
$z = 1;

// 三項演算子
$a = $x ? 'true' : 'false'; // 'false'
$b = $y ? 'true' : 'false'; // 'false'
$c = $z ? 'true' : 'false'; // 'true'
$abc = $xyz ? 'true' : 'false'; // Notice Undefined variable

// エルビス演算子（実は三項演算子）
$a = $x ?: 'false'; // 'false'
$b = $y ?: 'false'; // 'false'
$c = $z ?: 'false'; // 1
$abc = $xyz ?: 'false'; // Notice Undefined variable

// null合体演算子
$a = $x ?? 'false'; // 'false'
$b = $y ?? 'false'; // 'false'
$c = $z ?? 'false'; // 1
$abc = $xyz ?? 'false'; // false

```
エルビス演算子と三項演算子は

## 三項演算子, エルビス演算子
この二つは、条件式が真の場合に評価される値が条件式そのものか、そうでないか、という点で異なっているだけです。
これらは、条件式がtrueかfalseか、が重要です。
条件式がundefinedの場合には、Noticeエラーが発生します。

```
// 三項演算子
【条件式】 ? 【trueの場合に評価される式】 : 【falseの場合に評価される式】

// エルビス演算子（二項演算子）
【条件式(trueの場合に評価される式)】 ?: 【falseの場合に評価される式】
```

## null合体演算子
null合体演算子の場合に重要なのは、条件式がnullであるかどうかです。
undefinedの場合もnullという判定になるのでNoticeエラーが発生せずに値が返ってきます。

``` 


【条件式(nullでない場合に評価される式)】 ?? 【nullの場合に評価される式】

```
Railsで新しいプロジェクトを始めた時に必ずやっておきたい2つの設定

今回はRailsで新しいプロジェクトを始めた時にやっておきたい2つの設定を紹介します。
重要ですので、必ずやっておきましょう。
## Railsで新しいプロジェクトを始めた時にやっておきたい2つの設定
### turbolinksを無効化する
詳しくはこちらの記事で解説していますのでご覧下さい。
[Railsでページ遷移後にJavaScriptが実行されない問題の解消法](https://qiita.com/ToshioAkaneya/items/4580a6b597b8cfe7704e)
これを行わないと、JavaScriptが思うように動作しないことがあります。

### rails consoleが動くようにする
`$ rails console`はとても重要なコマンドですが、最近のバージョンではエラーが発生してしまうことがあります。

```ruby:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rb-readline'
end
```
Gemfileに`gem 'rb-readline'`を追加して、`$ bundle`を実行して下さい。

以上です。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
WSLのUbuntuにRLoginで接続する

一端の技術者としてプライベート用PCにも開発ができる環境を構築しようとしてWSLを入れてみました。
その中でRLoginを使用してUbuntuに接続しようとした際に躓いたので自分用メモとして残しておく。

#環境
* Windows10 HOME
* Ubuntu
* RLogin

#経緯
Windows10でLinuxをなんとなく触りたくなったのでWSLを使ってUbuntuをインストールした
>参考サイト
>[Windows 10でLinuxを使う - Qiita](https://qiita.com/whim0321/items/093fd3bb2dd287a72fba)

上記参考サイトの手順に従ってインストールを進めていきsshのサーバ起動までできたのでとりあえずRLoginを繋いでみるとエラーが出る
![2019-03-07_23h09_21.png](https://qiita-image-store.s3.amazonaws.com/0/270528/640bc491-24f7-4b98-f0cd-c86f54809388.png)

SSH2 user auth failure publickey status=0004で調べたりしてもさっぱり自分の例に当てはまる事例がないので困り果てた(3時間ぐらいハマってた)

#結論
PasswordAuthenticationをyesで設定しておく

```:/etc/ssh/sshd_config
PasswordAuthentication yes
```

>参考サイト
>[windows7からubuntu11.10にsshでアクセスしてみる](http://uubunt.blogspot.com/2012/03/windows7ubuntu1110ssh.html)

sshd_configの設定については早い段階で行き当たっていたけれども参考サイトの記載を鵜呑みにしてnoに設定していたのでハマっていたというわけですね・・・
RLoginからはUserとPW指定して繋いでるのでそりゃあエラー出るわ・・・

#教訓
やっていることとエラー文とコンフィグの設定項目の意味を考えて作業しよう
添付ファイルのサイズ上限がある場合(Evernote等)のファイル分割・結合

Evernoteで添付ファイルも扱いたいが、上限の200Mを超過する場合に、ファイルを分割する際のコマンド。

# 分割

```sh
split -b 200m ファイル名 splited.
```

# 結合

```sh
cat splited.* > file
```
ESP8266にDS18B20を4つつないでAmbientに送る

ESP8266のDeepSleep利用
秋月「Ｗｉ－Ｆｉモジュール　ＥＳＰ－ＷＲＯＯＭ－０２　ＤＩＰ化キット」
エネループ2本でとりあえず動く
5分おき計測・送信でどのくらい持つのか実測予定
DS18B20はAmazonのHiLetgo社防水加工、コード付き5本で1000円くらいを利用
セットの5本にて上下1℃程の差あり

ソース

```C

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ambient.h>

//-----------------------------------------------
const char* ssid = "  ---SSID----  ";
const char* password = "  ----LAN Pass----  ";
unsigned int channelID =  ----Ambient channel id---- ;
const char* writeKey = "  ----Ambient write key----  ";
float temp01;  //センサー4つ
float temp02;
float temp03;
float temp04;


//-----------------------------------------------

//WiFi
WiFiClient client;

//OneWire&DS18B20
#define ONE_WIRE_BUS 4 //センサー接続は4番利用
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//Ambient
Ambient ambient;

//-----------------------------------------------


void setup() {
  
  //Check用。運用時はコメントアウト
  //Serial.begin(115200);
  //Serial.println("");
  //Serial.println("Start");
  
  WiFi.begin(ssid, password);
  ambient.begin(channelID, writeKey, &client);

  sensors.begin();
  
  //センサーのシリアル番号は利用しない。握って温度変化みて特定（原始的）
  sensors.requestTemperatures();
  temp01 = sensors.getTempCByIndex(0);
  temp02 = sensors.getTempCByIndex(1);
  temp03 = sensors.getTempCByIndex(2);
  temp04 = sensors.getTempCByIndex(3);
  
  ambient.set(1,temp01);
  ambient.set(2,temp02);
  ambient.set(3,temp03);
  ambient.set(4,temp04);
  
  ambient.send();
  delay(1000*3);  //このdelayがないとスリープから復帰しない。3秒も必要かどうか不明。理由不明。
  
  //Serial.println(temp01);  //check用。普段コメントアウト
  ESP.deepSleep(5*60*1000*1000);  //μ秒指定　5分
  delay(1000*1);

}

void loop() {
  // DeepSleepから覚めたらsetup()から動くみたいなので、すべてsetup()で完結させた

}

```
G検定概要と対策方法（まとめ）

この度、一人でも多くの方にG検定を知っていただき、受験をして合格していただきたいと思い、G検定の概要と対策方法をまとめました。

#G検定の概要
- 概要：ディープラーニングを事業に活かすための知識を有しているかを検定する
- 受験資格：制限なし
- 試験概要：120分、小問226の知識問題（多肢選択式）、オンライン実施（自宅受験）
- 出題問題：シラバスより出題
- 試験日： 2019/3/9, 7/6, 11/9 2時間
- 受験料： 一般 12,960円 (税込) 学生 5,400円 (税込)
- 申込： G検定受験サイトよりお申し込み（クレジットカード決済またはコンビニ決済）
- 日本ディープラーニング協会サイト：http://www.jdla.org/

合格率は第1回が**57%**（2017/12/16）、第2回が**57%**（2018/6/16）、第3回が**65%**（2018/11/24）と高いですが、専門的な内容のため十分な勉強は必要です。

#出題範囲
- 人工知能（AI）とは（人工知能の定義）
- 人工知能をめぐる動向
- 人工知能分野の問題
- 機械学習の具体的手法
- ディープラーニングの概要
- ディープラーニングの手法
- ディープラーニングの研究分野
- ディープラーニングの応用に向けて

ディープラーニングの手法を中心に、幅広く出題されます。ややディープラーニングの応用の問題が少ないかもしれません。

#勉強法
下記1~4（余裕があれば5まで）をやれば、かなり解けるはず！少なくとも私はこれで9割はスムーズに解けました。

1. [G検定公式テキスト](https://www.amazon.co.jp/exec/obidos/asin/4798157554/ryoukokko-22/)を読んで理解し、**太字の用語を暗記**し、章末問題も解けるようにする。

2. [人工知能は人間を超えるか ディープラーニングの先にあるもの](https://www.amazon.co.jp/exec/obidos/asin/4040800206/ryoukokko-22/)を一読し、**下記の記事の用語や人物は暗記**しておく。
 - https://qiita.com/masamasa/items/eae9ab25c4cdf89374a3
 - https://qiita.com/ryotuxtuki/items/61079d900a85f6c618e5
 - https://qiita.com/m2u/items/548bd59634bbf403cccf

3. [AI白書2019](https://www.amazon.co.jp/exec/obidos/ASIN/4049110148/gcbgarden-22/)の技術動向、利用動向、制度政策動向、AIの社会実装課題と対策を一読する。

4. Study-aiの模擬試験(http://study-ai.com/generalist/) を受け、間違えた問題を復習する（非常に似た問題が出題されるため、1度模擬試験を解いてあまり点数が良くなかった方は、何度か同じ問題を解いてもいいかもしれないです）。 

5. 余裕があれば[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)を読んでディープラーニングの理論を理解する（行列や微分などの数学の知識が必要です）。

#試験のコツ
- **選択問題なので消去法が有効**
 - 例えば、同じ選択肢で4つの設問が続く場合があり、どれか3つの設問の正解がわかっていれば残りの1つの正解も当てられます。また、1つの設問で複数の空欄がある場合も適用できます。設問タイプとして複数選択はほとんどありません。
 
- **時間との勝負（１問約３０秒）**
 - 設問は後から戻れるため、迷った問題はチェックを付ける機能があるのでチェックを付け、後から考えるor検索する方が良いです。

#その他の方々の勉強法（記事）
いろいろなバックグラウンドを持った方がそれぞれの勉強法で合格しているようなので、是非ご参考にされるといいかと思います。
 - https://qiita.com/totti0414/items/7c223e63e31528bdc560
 - https://qiita.com/sarutando/items/4eabe7c5187307473f8c
 - https://qiita.com/kawa_herbata/items/a0349096667c5c339cd9
 - https://qiita.com/calderarie/items/3da1169c6928cd14d6b1
 - https://qiita.com/umeshiso/items/5e2f57ceb574dd064d47
 - https://qiita.com/JuMarun/items/cac80aefb58e750ee7ea
 - https://qiita.com/jinsights/items/003a8a19fd06dddfa1ca 

#推薦図書
日本ディープラーニング協会でも推薦されている図書があるので、さらに余裕のある方は是非いろいろな書籍を読むと、より理解が深まると思います。
https://www.jdla.org/news/detail/20190204001/
pptTeXでパワポにきれいな数式を挿入する

# はじめに
パワーポイントのスライドに数式を挿入したい場面はよくあると思います。
標準機能でも数式エディタは付属していますが，**正直フォントがかっこ悪い・・・**
なので，TeXの数式を貼りたくなりますよね

TeX数式を画像化するツールとしては[TeXclip](https://texclip.marutank.net)がよく知られていますが，画像なので拡大すると粗が目立ってしまいます。
また，パワーポイントとブラウザを行き来するのも面倒です。

そこで，[pptTeX](http://naitaku.github.io/pptTeX/)というアドインが便利です。
pptTeXというタブが表示され，いちいちTeXclip等を開かなくてもパワーポイント内でTeX数式を作って貼れるようになります。
![ppttex.png](https://qiita-image-store.s3.amazonaws.com/0/259761/3c8c99d5-01aa-bcd5-f10d-88ecdbe098f1.png)

# 利点
TeXclipと比較して以下のような利点があります。

- パワーポイント内でTeX数式を作って貼れる
- 一度作成した数式をあとから編集できる
- **ベクター形式で作成されるので拡大してもきれい**

![formula.png](https://qiita-image-store.s3.amazonaws.com/0/259761/b78a6c94-32d9-a71b-3263-4c7c5d462e5d.png)

# 方法

## LaTeX環境のインストール
[TeXインストーラ 3](https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html)等を利用してLaTeX環境一式をインストールします。

## BaKoMa TrueTypeフォントのインストール
[ここ](http://web.sfc.keio.ac.jp/~kogure/soft/tex/tex.html)から`FixBKM.msi`をダウンロードして実行します。

## pptTeXのインストール
[作者様のサイト](http://naitaku.github.io/pptTeX/)からインストーラをダウンロードして実行します。

## 初期設定
インストール後にパワーポイントを起動すると設定画面が出てきます。
（出てこない場合は上部のpptTeXタブ→Configuration→Pathタブ）
![config1.png](https://qiita-image-store.s3.amazonaws.com/0/259761/24976ee9-e913-88b5-bdfa-afca05093c59.png)

上記のように`platex.exe`, `dvips.exe`, `pstoedit.exe`のパスをそれぞれ入力しておきます。
また，AdvancedタブのDefault Preamble欄によく使う数式関係の`\usepackage`や`\newcommand`を書き加えておくと良いと思います。
![config2.png](https://qiita-image-store.s3.amazonaws.com/0/259761/2b740ce9-d2be-1fdc-2b26-13317904aa2e.png)

# 使い方
## 数式を挿入する
pptTeXタブのInsertをクリックすると入力画面が出るので，`\begin{align*}`～`\end{align*}`の間に数式を書き，OKを押します。
コンパイルに成功すると数式が入ります。
![insert.png](https://qiita-image-store.s3.amazonaws.com/0/259761/54af754c-53d4-1ba3-9de4-256c9542f9ad.png)

## 数式を編集する
修正したい数式オブジェクトを選択した状態でEditを押すと編集できます。

# 気づいたこと
数式の編集の際に，先頭の`\begin{document}`の`'\'`が消えてしまっていることがあります。
気づかずコンパイルエラーでハマった事があるので確認したほうが良いと思います。

# 参考
- [pptTeX](http://naitaku.github.io/pptTeX/)
- http://web.sfc.keio.ac.jp/~kogure/soft/tex/tex.html
- [TeXインストーラ 3](https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html)
[ROS Ignite Academy][ROS for Beginners] TF ROS 101

## Introduction
Hello, guys. This is the second article in a series of ROS ignite school review. You can find the previous one in this link!
https://qiita.com/Rowing0914/items/32390d36be745d3e5647

## Reminder: I am not covering about the setting of ROS environment since it is given in the Academy. And I am super bad at writing for sure.

## What you will learn
In this course, you will learn to use TF in ROS. TF is the collection of APIs to deal with converting the local frame of the robot into the world frame so that a robot can understand where it is in the world frame accurately.

For example, The Hokuyo laser sensor at the tip of the robot arm, or TCP, is registering distance readings. But these readings are registered in the LaserFrame. This means that when we need to interpret the data in the world frame, we will have to make some type of conversion. This conversion is based on how ALL the Joints of the robot were in each instance. This is not trivial, but it is very common to have in a robotics environment.

By the end of this course you will be able to

- Published and Subscribe to TF data topics
- Use the tools necessary to visualise TF data
- Publish fixed TF transforms
- Use RobotStatePublisher to generate TF data for robots too complex to publish it manually
- Understand the use of JointStatePublisher and how it relates to RobotMovement Controllers

## 1. TF Basics
### Visualise TF data

```shell
# 1. using view_frame
$ rosrun tf view_frames
$ evince frames.pdf

# 2. using rqt_tf_tree
$ rosrun rqt_tf_tree rqt_tf_tree

# 3. you can specify a number of framees you want to check
$ rostopic echo -n1 /tf
$ rostopic echo -n2 /tf

""" RESULT
transforms:
  -
    header:
      seq: 0
      stamp:
        secs: 1305
        nsecs:  22000000
      frame_id: "/world"
    child_frame_id: "turtle1"
    transform:
      translation:
        x: -12.983426318
        y: -4.69533631892
        z: -1.52217902849e-06
      rotation:
        x: -4.62091684167e-07
        y: 1.45034030844e-06
        z: 0.303573362761
        w: 0.952808067461
---
"""

# 4. RVIZ
$ rosrun rviz rviz
```
Processingのコンソールでデータ落ちする

Processingのコンソール出力(`print()`など)はデバッグ出力などに便利だが、大量に行うと出力データが抜けることがある。

# 再現コード

```java
void draw()
{
  for(int i = 0; i < 100; i++) {
    print(str(i) + ",");
  }
  println("");
}
```

# 結果

一部抜粋

```
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,

```

# 考察

コンソール出力を高速に行うのはやめましょう。
`draw()`の中などで行うと抜けやすい模様。
#Slack でいつの間にか、エンターキーで送信せず、改行だけする設定が追加されていた

# 詳細設定の「送信ボタンを表示する・しない」というような項目だ。

こいつをオンにするとMacアプリではCommand+Enterで送信できる。

ただエンターボタンが横に現れて入力エリアを狭めてしまい、あまり美しくはない。

今まで日本語入力をひやひやとしながら確定させていた独自の緊張感が失われる。

# そもそもはSlack単に文字変換が必要な言語に対応していなかっただけなのだけれど。

今となってはあのひやひや感さえも独特のテンションを生み出して、禅に必要なフロー状態を生み出していたような気もする。

エンターキーを押し間違ってもやり直せるなんて。

そんなぬるい設定は嫌だ。

# 僕はSlackをそんな子に育てたつもりはありません。

いつだってEnterで奈落の底まで誤爆送信できる。

そんな命をかけた戦いが僕らを待っていたじゃないか。

最近のゲームというものも随分とぬるくなったもんだ。

# いや、たぶんこの設定はもう無効に戻したりはしないのだろうけれど。

# Original Text

Slackでいつの間にか、エンターキーで送信せず、改行だけする設定が追加されていた。詳細設定の「送信ボタンを表示する・しない」というような項目だ。こいつをオンにするとMacアプリではCommand+Enterで送信できる。ただエンターボタンが横に現れて入力エリアを狭めてしまい、あまり美しくはない。今まで日本語入力をひやひやとしながら確定させていた独自の緊張感が失われる。そもそもはSlack単に文字変換が必要な言語に対応していなかっただけなのだけれど。今となってはあのひやひや感さえも独特のテンションを生み出して、禅に必要なフロー状態を生み出していたような気もする。エンターキーを押し間違ってもやり直せるなんて。そんなぬるい設定は嫌だ。僕はSlackをそんな子に育てたつもりはありません。いつだってEnterで奈落の底まで誤爆送信できる。そんな命をかけた戦いが僕らを待っていたじゃないか。最近のゲームというものも随分とぬるくなったもんだ。いや、たぶんこの設定はもう無効に戻したりはしないのだろうけれど。

# Links

- [いなうらゆうまはここにいた 2019-03-07](https://github.com/YumaInaura/YumaInaura/issues/656#s1551964375)



# English Translated

Instead of sending by enter key in Slack, setting to only line feed was added. It is an item like "show / do not display send button" of detailed setting. If you turn this on, you can send it with Command + Enter on Mac applications. However, the enter button appears sideways and narrows the input area, it is not very beautiful. The original feeling of tension that had been confirmed while inputting Japanese was hilarious was lost. Originally it was only Slack which did not correspond to the language which needs character conversion. Even such a shabby feeling now creates a distinctive tension, and it seems like it was creating a flow condition necessary for Zen. You can press the Enter key to start over even if you make a mistake. I do not want such a tepid setting. I do not plan to grow Slack like that. You can always send an erroneous explosion to the bottom of Naraku by Enter. The battle that put such a life was waiting for us. Recent games have also become quite tepid. No, perhaps I will not revert this setting to invalid, though.

# Chinese Translated

而不是通過Slack中的enter鍵發送，僅添加了設置為換行符。是詳細的設定的“顯示/不顯示發送按鈕”這樣的項目。如果啟用此選項，則可以使用Mac +應用程序上的Command + Enter發送它。但是，輸入按鈕出現在側面並縮小輸入區域，它不是很漂亮。輸入日語時確認的原始緊張感是熱鬧的。最初只有Slack與需要字符轉換的語言不對應。即使是這種破舊的感覺現在也會產生一種獨特的張力，似乎它創造了禪所需的流動條件。即使出錯，也可以按Enter鍵重新開始。我不想要這麼溫和的環境。我不打算像那樣成長Slack。您總是可以通過Enter向Naraku的底部發送錯誤的爆炸。這場生命的戰鬥正等著我們。最近的比賽也變得非常不溫不火。不，也許我不會將此設置恢復為無效。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/671








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PHPで複数の値をreturnする[備忘]

## やりたい事
- 複数の値を一回の**return**にまとめたい

## 環境
- *PHP 7.2.6*
- *CakePHP 3.6.13*

## サンプルコード
- 生のPHPコードの場合

```php
private function samples()
{
    $fruits1 = 'apple';
    $fruits2 = 'banana';

    return [$fruits1, $fruits2]; // もしくは、array($fruits1, $fruits2);
}

list($fruits1, $fruits2) = $this->samples();

echo $fruits1; // => apple
echo $fruits2; // => banana
```

## 解説
- **samples**アクション
    - **$fruits1**と**$fruits2**を定義
    - returnする時に**配列**にする

- [list](http://php.net/manual/ja/function.list.php)関数
> list — 配列と同様の形式で、複数の変数への代入を行う
引用元：http://php.net/manual/ja/function.list.php


    - list関数を使用し、**samples**アクションの返り値を受け取る

## 所感
- 1回のreturnで済む事は気持ちいい
- functionに切り出す程でもないけど、2つの値をそれぞれ呼び出し元に返したい場合の解消手段になり得る
- 見慣れないせいか、直感的なコードの可読性はそこまで高くない？
- 世間一般的に、こういう手法を使うのだろうか？
知識0からAWS構築までの流れ

はじめに

まずはじめにAWSとは一つのサーバーのことではありません！
↑
これは真面目に自分がはじめにそう思っていたので言っておきます。

AWSとはアマゾンウェブサービスです。つまり、何かWEBアプリや開発を行う際に必要なドメインやらサーバーやら色々なサービスを提供しているサービスなのです。

AWSを使うということは、これら多種多様なサービスを自身の開発したいモノに合わせて効率よく組み合わせていくことなのです。

今回はAWSを使ってホームページを作成して、そのホームページにwebアプリケーションを掲載するために必要な環境（インフラ）を構築していきます。

目次
1_AWSインフラとは
　1_全体像
　2_メリット・デメリット
2_環境設定
　1_アカウント登録
　2_IAM　Identity and Access Management（ユーザー作成・権限付与）
　3_Route53　（ドメイン取得）
3_動的コンテンツ処理
　1_VPC　Virtual Private Cloud（仮想ネットワーク構築）
　2_EC2　Elastic Compute Cloud（webアプリケーションサーバー）
　3_ELB　Elastic Load Balancing（AZが複数ある場合）
　4_RDS　Relational Database Service（データベースサーバー）
4_静的コンテンツ処理
　1_S3　Simple Storage Service（Webサーバー）
　2_CloudFornt
5_もっと効率的に使うために
　1_CLI　Command line interface（AWSをコマンドラインで操作するもの）
　2_Elastic Beanstalk
　3_Cloud9
Visual stdio2017でOpenCV4.0.0とOpencvContribの.libファイルと.dllファイルを生成する

# 概要
opencvをVisual stdioで使う際には、.libファイルと.dllファイルをVisual studioで指定する必要があります。指定するためには、.libファイルと.dllファイルを生成する必要があります。以下では、.libファイルと.dllファイルの生成方法を示します。

# 実行環境
次に実行環境を示します。

| Soft and Hard       |       バージョン | 
|:-----------------:|:------------------:|
| Visual Studio         |              2017 |  
| OpneCV         |              4.0.0 |
| OpenCVContrib         |              4.0.0 |    


# 手順
Visual StudioでOpenCVを使うまでの流れは、他の方がとても分かりやすい記事を書いていただいているので、それらを参考にして下さい。本稿では、あくまでも.libファイルと.dllファイルを生成手順のみ示します。参考までに、次に参考URLを示します。

- [Visual Studio 2017にOpenCV3.2.0とopencv_contribを導入する方法](https://qiita.com/tomochiii/items/fa26404ebc5fcd4481b9)

手順の大まかな流れは以下の通りです。

- OpenCV.slnを開く
- DebugもしくはReleaseをビルドする
- INSTALLをビルドする
- 生成されていることを確認

以下に上記の方法について手順を示します。

## OpenCV.slnを開く
上記に示した参考URLを進めていくと、CMakeで生成したOpencvのBuildディレクトリの直下にOpenCV.slnがあります。このプロジェクトを開きます。開くと次のようなファイル構成が表示されていると思います。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/169342/f4390c53-d917-ccaf-854f-570c20846876.png)

## DebugもしくはReleaseをビルドする
DebugもしくはReleaseをビルドする方法は、参考URLに手順として存在するので、省略します。

## INSTALLをビルドする
DebugもしくはReleaseをビルド完了後、buildディレクトリを見てもInstallディレクトリは存在しません。InstallディレクトリはINSTALLをビルドすることによって生成されます。DebugもしくはReleaseをビルド完了している状態で、ALL_BUILDの下のISTALLを右クリックし、ビルドを選択します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/169342/741d20be-45bb-d959-e9c6-b439fce1474e.png)

ビルドを実行し、実行時間が少し経つと、Buildディレクトリが生成されます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/169342/3c907e2e-db05-743f-e8cd-3ad4f92bed4e.png)

## .libファイルと.dllファイル生成されていることを確認
INSTALLのビルドが完了すると先ほど確認したInstallディレクトリにライブラリファイルとバイナリファイルが生成されています。自分の環境では、"/build/install/x64/vc15/lib"と"/build/install/x64/vc15/bin"にそれぞれ、ライブラリファイルとバイナリファイルが生成されていました。

- .libファイル
![4.png](https://qiita-image-store.s3.amazonaws.com/0/169342/d495d70a-b1e7-f429-585c-6dfc9f8277a6.png)

- .binファイル
![5.png](https://qiita-image-store.s3.amazonaws.com/0/169342/a1cef395-4d3a-a372-c65f-7e61a99a0873.png)

## まとめ
上記に示した参考記事では、.libファイルと.dllファイルを生成方法が明示されていなかったので、補足として書かせて頂きました。ご参考になっていただけたら幸いです。また、間違っているところや、追加したほうがいい、こういう書き方の方がいいよ！という箇所がありましたら、お教え頂けるととても嬉しいです。
winmergeの使いかたメモ

#備忘録です

##Excelファイルに出力した差分を確認したい。その手順

①ダウンロード　64の方

②比較したいファイルをドラッグ＆ドロップ

③エクセルなので、「展開プラグイン」の項目を
　「CompareMSExcelFile.sct」に設定

④「OK」をクリック

以下のURLに書いてあります。
参考：http://bashalog.c-brains.jp/18/04/03-180000.php
jQueryの書き方　〜中級〜

jQueryの書き方について、備忘録としてまとめておきます。
誰かの役にたったなら幸いです〜♪( ´▽｀)

# 要素の取得（eqメソッド）
jQueryオブジェクトは、取得した要素が配列の「ような形」で入っています。

```html
<ul>
 <li>リスト1</li>
 <li>リスト2</li>
 <li>リスト3</li>
</ul>
```
```javascript
$(li)
//[<li>リスト1</li>,<li>リスト2</li>,<li>リスト3</li>]
```
この配列の「ような」ものにはindexが0からついています。
そのため以下のようにして書くことができます。

```javascript
$(li).eq(1).css('color', 'red')
//リスト2のcssを変更できる
```

eq()の引数指定で便利なめメソッドにindex()があリます。
index($(this))でイベントが実行された要素のindex番号を取得することができます。

# カスタムデータ属性

jQueryで要素や属性等を取得する方法はいくつかありますが、
その一つに属性を指定して、その値を取得することもあります。
属性はsrcやidなど標準で用意されているもの以外に、自分で作ることができます。
この自分で作った属性を、カスタムデータ属性と呼びます。
その場合、「data-」から始めます。

```html
<img src="#">
//srcが属性

<div data-option="hoge">...</div>
//data-optionがカスタムデータ属性
```
テストの心得　〜備忘録〜


初心者プログラマーはとりあえずテストを任せられることがよくあります。
やる気溢るる初心者プログラマーにとっては、「実装じゃなくてテストかよ〜」と落胆してしまうことも少なくないかと思います。（←私がそうでした）
そういう人たちにテストの重要性を説いても、正直あまり響かないんですよね。
だってテスターじゃなくてプログラマになりたいとしか思っていないから。
声を大にして言いたい、凄腕プログラマーが作成するテストは素晴らしいんです！
周りの凄腕プログラマーが実際にそうだから。

今回はテストの考え方、作り方について、自分の備忘録もかねて記録します。

# テストの考え方
テストの種類って、いろんな分け方ができます。
ブラックボックス・ホワイトボックスとか、単体テスト・結合テストとか、この分け方はよくネットに転がっていると思います。
あまり記事でクローズアップされない分け方として、
システムの動きが正しいかを確認するためのテスト・バグを発見するためのテスト、という分け方もあります。
これはテストの目的によって分けており、目的によって検証項目も異なってきます。

# テストケースの作り方

### 1. 仕様書を把握する
正直ここがキモになります。
仕様書から、このシステムのあるべき姿を理解した上で、テストケースを作っていきます。
あるべき姿を勘違いしていると、せっかく作るテストケースも意味のないものになってしまいます。

### 2. 実際にざっくりシステムを動かしてみる
 テストケースを作成する前に、システムの「感じ」を掴むためにざっくり触ってみます。
 仕様書での把握だけではなく実際に触ってみることで、よりユーザー目線でのテストケースを作成できるようになります。

### 3. 対応端末、対応ブラウザを確認
このシステムがスマホ対応なのか（このご時世スマホ対応は当たり前かと思いますが・・・）、ChromeやIEでもレイアウトが崩れないか、等はテストケースとして必要です。

### 4. システムが利用されるフローを列挙する
つまり業務フローです。
このシステムが利用される時のフローを整理して、そのフローの中で、各手順が正しく動くかのテストケースを作成するためのネタを集められるようにします。

### 5. ブラックボックステストを作成
4.で作成したフローを手順として分けて、各手順の中でブラックボックステストを作成します。

#####1.同値分割
有効値と無効値でそれぞれテストケースを作成。
たとえば1~30が有効値だとすると、無効値は31とか-1とか0とか1.5の場合で作成してみると良いでしょう。
文字なら、半角・全角、特殊文字、html（\<h1>とか） も良いですね。

#####2. 境界値分析
範囲の境界の値でテストケースを作成。
たとえば、1~30が有効値だとすると、31・30・1・0が境界値です。

#####3. 画像やcsvファイル等のバリデーション
拡張子チェックや容量、csvファイルのフォーマットでテストケースを作成します。

#### 6. ホワイトボックステストを作成
######1. ブラックボックステストで作成したテストケースの、ホワイトボックス版を作成
ホワイトボックステストなので、実際にコードを見ながら作成します。

######2. 例外の実装箇所を確認
ユーザーが、開発者の意図とは異なるオペレーションをすることはざらにあります。
というかあるのが普通です。
そういった場合の例外処理が実装されているかと思いますが、
例外実装が甘かったりすると、画面にシステムエラーが表示されたりします。

######3. トランザクション
複数ユーザーが利用するシステムの場合、ちゃんとトランザクション処理が実装されているのか確認する必要があります。
実際に複数端末で操作してみましょう。


かなりざっくりではありますが、テストケースの作り方について記録しました。
テストは実行幅がピンキリなので、ここに記述した内容だけでは不十分なことももちろんあります。
この備忘録が、誰かの役に少しでもたてば幸いです。
【Go】初めてのFizzBuzz

# 初めてのFizzBuzz

Goを今日から始める。
まずは簡単なFizzBuzzから。

フォーマットギュっとなってる。

```go:FizzBuzz

import "fmt"

func main() {
  fizz := 3
  buzz := 5
  fizzbuzz := 15

  for i := 1; i <= 100; i++ {
    if i%fizzbuzz == 0 {
      fmt.Println("FizzBuzz")
    } else if i%buzz == 0 {
      fmt.Println("Buzz")
    } else if i%fizz == 0 {
      fmt.Println("Fizz")
    } else {
      fmt.Println(i)
    }
  }
}
```
Raspberry Pi ssh接続

##モチベーション
ラズパイ用に液晶を使いたくなく、win10 pcからリモートでアクセスしたい。

##環境
RaspberryPi3B+
Raspbian 9.8

##SSH接続を有効にする

``` raspberrypi.
$ sudo raspi-config
```
- 5 Interface Options
- P2 SSH
- 「Would you like the SSH server to be enabled」→はい

再起動後IPを確認→wlan0:192.168.0.11

win10からsshアクセス

```win10.
$ ssh pi@192.168.0.11
pi@192.168.0.11's password:
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Mar  6 23:56:25 2019 from 192.168.0.13
```
入れました。
初めてPHPを使ってサービスを作った話。

サービスってもんはな、ユーザーがいないと忘れるもんだよ....。

#はじめに
ではまず最初に、なんで僕がこのサービスを作ろうと思ったのかということですが、このサービスを作る前にLINEのAPIで遊んでいて、その続きでTwitterAPIを触っていて、どうせならTwitterAPI使って何か作るかと思って作りました。
(需要ないとかいうのやめて((()

#どういうサービス？
~~**最後にツイートしたツイートの情報が見れるサービス**です。~~
~~キャッチコピーは`あなたが一番最後にツイートした内容はなんだったのか、ツイ廃の人はわかってるかもしれません。でも普通の人ならあまり覚えていないはず....。
このサービスは直前のツイート一件の情報を取得して表示します。あなたは最後に何をツイートしたのでしょうか？`~~

~~僕自身なんでこんな文が思いついたのかわかりません(おい~~

~~まぁ、なんか作りたかったからとりあえずこれにしようって思ってたら結局このままになりました。~~

**Qiita途中まで書いてたんですけど、下書きのまま放置してたら忘れちゃってその間に色々サービス変わってました。**
これが今のキャッチコピー？です↓
`このサービスは最新のツイートから100ツイート遡ったツイート一件の情報を取得して表示します。`

LastTweetViewerは[ここ](https://last-tweet-viewer.herokuapp.com)からどうぞ。
あ、言っとくとこの間のリニューアルでバグ発生して表示されなくなったので無意味です。



#使ってるサービスとかツールとか
- GitHub
- Heroku
- TwitterAPI
- IntelliJ IDEA
- Postman

まあいたって普通の構成ですね。

#苦労したとこ
PHPをまず触ったことがなかったので、これが本当に一番最初。
だからバグばっか

#よかったところ
一般公開した時は結構ユーザー来てくれた

#その他
[公開した時のツイート](https://twitter.com/0505Keitan/status/1090892862751879169)


詳しいのは暇あったら書きます。はい ←~~また忘れるやつ(((~~
誰でもわかりやすいGitのコミットメッセージが書けるジェネレーターを作りました

## 前置き

個人開発でもチーム開発でも、Gitは開発者にとって、ほぼ必要不可欠なツールです。

僕も当然Gitを使っていますが、コミット時のメッセージを書くときにどう書いていいかわからなくて、毎回頭を抱えてしまいます。

そこでジェネレーターを作ることにしました。

## 出来上がったもの

### [Git Commenter](http://git-commenter.com/)

![git-commenter-template.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250476/10bcc12e-f714-cee9-1cb6-5c33f2f92216.gif)


## 追記(2019/03/16)

electronを使ってデスクトップアプリにしました！

[こちら](https://github.com/Akatsuki-py/git-commenter/releases/tag/v1.0)からダウンロードすることができます。

[web版はこちら](http://git-commenter.com/)

## Gitのコミットメッセージについて

僕が調べたところGitのコミットメッセージには、統一された書き方は存在しませんでしたが

メッセージ自体の可読性、コミット内容のわかりやすさや、Gitの仕様を考慮して

```
コミット内容の要約 // 英語では V + O (+M) と書くのが一般的

コミット内容の具体的な理由や内容
```

という書き方が一般的でした。

また、ここ最近ではコミット内容の把握を簡単にしたりlogやGithubのレポジトリがオシャレになるという理由で、コミット内容のカテゴリを表現する絵文字をコミット内容の要約にprefixとしてつけるのが流行っているようです。(Qiitaにもいくつか絵文字コミットについて言及している記事があります)

このジェネレーターでは、絵文字もサポートして

```
絵文字 : コミット内容の要約

コミット内容の具体的な理由や内容
```

という形式のコミットメッセージを生成するようにしました。(もちろん絵文字もない、コミット内容の具体的な理由もない要約だけのコミットメッセージもここでは作れます)

要約については、Githubのファイル欄に表示されたりするためここは日本語英語が入り混じっていると汚いなと思ったので英語統一にしました

コミット内容の具体的な理由については英語が望ましいですが、

- 具体的な理由を書く必要がある (要約より、英語力が必要であり内容が様々であるためテンプレートもあまり機能しない)
- Githubのファイル欄や、git log --onelineコマンドで表示されない

以上の理由から日本語でも問題ないのかなと思います。

## 具体的な使い方

基本的には上記のgifのように実際に使っていただければわかると思います。

まずフォームについて簡単に説明すると

- Emoji: コミットカテゴリを絵文字で表したもの
- Verb: コミットの具体的な操作内容 (例: 何かを追加した => Add、何かを更新した => Update)
- Object: コミットの対象 (例: README.mdを更新した => (Update) README.md)
- Modifier: コミット文を修飾するもの (例: sample.txtをAからBに移動した => (Move sample.txt) from A to B)
- Body: コミット内容の具体的な理由や内容
- Git Comment: 入力から生成されたコミットメッセージが入ります

## テンプレート

Verb及びObjectの左のセレクトボックスで「テンプレ」を選択すると、コミットメッセージでよく使われる英単語のテンプレート一覧、およびその日本語訳が一覧で出てきます。

テンプレの英単語は簡単なものが多く、コミットメッセージ中でよく使われているため、テンプレの英単語でコミット内容を表せる場合は、これらを使ったメッセージのほうが読みやすいメッセージになると思います。[参考にしたQiita記事](https://qiita.com/shikichee/items/a5f922a3ef3aa58a1839)

また、デフォルトのテンプレート以外に個人がよく使う単語やフレーズは、右下の歯車アイコンを押すと表示される設定画面からユーザーテンプレートとして登録することができます。

登録した単語やフレーズはフォームのテンプレ一覧に表示されるようになります。

## 開発

<a href="https://github.com/Akatsuki-py/git-commenter"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250476/b501c387-9e5d-4041-b56c-c9dea5c5fb21.jpeg" height="120px" width="400px"></a>


このデスクトップアプリは、react(+redux)とelectronを使って開発しました。 Reactはクライアント制作ではよく使うので特に苦労することなくすんなりできました。
(しいて言えば、クリップボードへのコピーがReactの仮想DOMだと難しいです。結局[専用のライブラリ](https://www.npmjs.com/package/react-copy-to-clipboard)を使いました。)


## 補足

このWebアプリ開発の前準備のときに調べていて初めて知ったのですが、Gitにはtemplate機能があります。([こちらのQiita記事とかに詳しく載っています](https://qiita.com/kasaharu/items/cdb587d4d27d7608b063))

ですが、僕が普段使っているVSCodeのGitツールではこのテンプレート機能が利用できず、ターミナルをぽちぽちしたり、自分でわかりづらいコミットメッセージを考えたりしなくてはいけなかったため、今回このようなWebアプリをつくりました。

## 感想

しっかり~~Googleで~~調べましたがGitについてはあまり理解しているとはいえないので、間違っているところやこの機能使えばもっと便利でいいよってところがあったら教えてくださると助かります。

利用した感想とかもあると嬉しいです。
GitHubからさくらのレンタルサーバに自動デプロイ

2019/08/12追記
この記事みたいな古典的な方法じゃなくて、Jenkinsや、Circle CI、Azure PipelinesなどのCIツール使うのがベスト。

# はじめに
GitHubからさくらのレンタルサーバーに自動デプロイしたいな、と思って調べたら記事が何個かあった。しかし少し変わった部分があったので再まとめ的な感じ。
参考記事は最後に貼っておく。

## gitの導入
SSHログイン  

```
ssh アカウント名@アカウントのドメイン.sakura.ne.jp
```

Bashに変更

```
bash
```

## curl-develのインストール

こいつが無いと、httpsでのcloneができなかった。

[curl Download](https://curl.haxx.se/download.html)より。
ここでは`7.64.0`

作業ディレクトリは`$HOME/local/src`。インストール先は`$HOME/local`。

```
mkdir -p $HOME/local/src
cd $HOME/local/src
wget https://curl.haxx.se/download/curl-7.64.0.tar.gz
$ tar zxvf curl-7.64.0.tar.gz
$ cd curl-7.64.0.
$ ./configure -prefix=$HOME/local
$ make
$ make install
```

## gitのインストール

まず[Google Code Archive git-core](https://code.google.com/archive/p/git-core/downloads)にてgitのソースコードの確認。ここでは`1.9.0`を使用する。


`./configure`にオプションを少々追加する。

```
cd $HOME/local/src
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/git-core/git-1.9.0.tar.gz
tar zxvf git-1.9.0.tar.gz
cd git-1.9.0
./configure -prefix=$HOME/local -with-curl=$HOME/local --enable-pthreads=-pthread
gmake all
gmake install
```

## パスの追加
別のディレクトリにインストールしたらスルー。

```
cd ~/
vim .shrc
```

pathに追記。

```
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/local/bin $HOME/bin )
```


## GitHubからcloneする
cloneするディレクトリは`$HOME/www/test/`

```
cd ~/www/test
git clone https://github.com/*******/*******.git
```

## デプロイ用php作成

`master`ブランチを`pull`する場合。


```:deploy.php
<?
exec('git -C /home/アカウント名/www/test pull origin master', $op);
echo "<pre>";
var_dump($op);
echo "</pre>";
?>
```

## webhook設定
GitHubのリポジトリ設定にて
`URL`に作成したphpファイルのURLを指定。

![SnapCrab_NoName_2019-3-7_22-26-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/1803086b-9da6-7cd3-71d3-c3051bda963f.png)


## trigger設定
今回は`Releases`のみにチェックを入れた。
みなさんのお好みで。

![SnapCrab_NoName_2019-3-7_22-27-49_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/990eadd1-4d09-6bfc-eb13-40ec13e1a41e.png)

[ここ](https://qiita.com/prex-uchida/items/f8bc05eb91b944b6214e)にも書いてあるけど、セキュリティには気をつけなければ…



## 参考
- [【超簡易的】githubにpushで、さくらサーバーに自動デプロイ](https://qiita.com/prex-uchida/items/f8bc05eb91b944b6214e)
- [さくらインターネットのレンタルサーバに git のリモートリポジトリを作成する](https://mattintosh.blog.so-net.ne.jp/2012-09-14)
- [さくらのレンタルサーバにgitを入れる : pthread_create 云々](https://g-taki.com/wordpress/web/6812.html)
- [レンタルサーバでgitを使う（その2）「fatal: Unable to find remote helper for ‘https’」の解決](http://www.linux-tech.info/%E3%83%84%E3%83%BC%E3%83%AB/entry-57.html)
Webでの画像のLazy Loadライブラリ Tada.js

# 概要

WebでのLazy Loadのライブラリは色々ありますが、その中の一つTada.js (https://github.com/fallroot/tada) を使ってみました。

"TADA"ってSlackで「🎉」を打つときにも使われてるから、何かと思ったら

> ジャジャーン！◆楽器のファンファーレの音をまねた擬音語。注目に値する物を人に披露する時などに用いられる。
> https://eow.alc.co.jp/search?q=tada

なるほど。

# コード

公式READMEにはTada.addでできるって書いてあるけど、実際に読み込まれた`Tada`オブジェクトには`add`とかのプロパティがなく、`default`というプロパティに入ってた。
`Tada`がコンストラクタなのかと思ったけどそうでもなかった。

```hoge.js
window.addEventListener("load", function() {
  Tada.default.setup({
    threshold: '1000px',
  });
  Tada.default.add('.lazy-image');
});
```

`hoge.jpg`が実際に表示したい画像。
`placeholder.jpg`はロードされる前に表示してる画像。 1px * 1pxの画像とかで良さそう。

```hoge.html

<head>
  <!-- 適当な環境だったのでレポジトリからzipでDLしてbuild/tada.jsを自分のレポジトリに入れた -->
  <script src="./js/tada.js"></script>
</head>

<img class="lazy-image" src="./image/placeholder.jpg" data-src="hoge.jpg">

<!-- imgタグ以外に使うとbackground-imageに。 -->
<div class="lazy-image" data-src="./images/hoge.jpg"></div>
```

簡単、特に問題なし。
React Hooksでたどる、stateからreducerまで

はじめてReduxの流れを見たときに、複雑さで戸惑いましたが、Reactの状態遷移でいろいろやっていった結果、より基礎的なところから組み立てたほうが、Reducerという世界観を理解できる気がしてきました。

なお、後述の事情により、React Hooksで進めています。また、説明のために必要な箇所を除いて、`useCallback`は省略します。

## useStateの基本

### シンプルな値の格納

`React.useState`を使えば、`state`とそれを設定する関数を得ることができます。

```jsx
const [state, setState] = React.useState(0);

<button type="button" onClick={() => setState(1)}>1をセット</button>
```

「値の設定」と「取得」という、状態を記憶させる上で基本となる機能です。

### 前の値を使った更新

将来のReactでは非同期レンダリングが入るとのことで、外側にある`state`を読んで`setState`をかけるという方法は推奨されていません。代わりに、`setState`へ`前の値 => 次の値`という形の関数を渡すことで、前の値を使っての更新が可能です。

```jsx
const [state, setState] = React.useState(0);

<button type="button" onClick={() => setState(x => x + 1)}>インクリメント</button>
```

## オブジェクトを`state`にする

`useState`の基本機能は上述のとおりですが、`state`としていくつもキーがあるオブジェクトを入れて、更新に際しては一部だけ動かす、というようにする場合、関数による更新が必須となります（そうしないと残りのキーが吹き飛んでしまいます）。

```jsx
const [state, setState] = React.useState({text: "hoge", count: 1});

const onChangeText = e => {
  const text = e.target.value;
  setState(oldState => ({...oldState, text}));
}

<input type="text" value={state.text} onChange={ onChangeText } />
```

### `dispatch`関数の抽出

上の`onChangeText`では「更新する値の作成」と「更新の反映」が一体となっていますが、これを切り離すことも可能です。

```jsx
const [state, setState] = React.useState({text: "hoge", count: 1});

const dispatch = React.useCallback(
  updates => setState(oldState => ({...oldState, ...updates})),
  [setState]
);

const onChangeText = e => {
  const text = e.target.value;
  dispatch({text});
}

<input type="text" value={state.text} onChange={ onChangeText } />
```

`React.useCallback`は、「引数として与えられた関数オブジェクトを、2つ目の引数の配列の値が同じである限りキャッシュする」という機能ですが、これを見れば`dispatch`は`setState`にしか依存していないことがわかるかと思います。

そして、この`dispatch`は、そのまま「`state`の中で更新したいデータを入れれば、その更新を行う」という関数として、`state`を引き回さなくても使えるようになります。`Context`に入れて下位コンポーネントまで流すのも便利です。

じつは、クラスコンポーネントの`this.setState`は、標準で「オブジェクトのマージ」を行う、これぐらい複雑な機能（関数更新もあるのでもっと複雑か）を持ったメソッドなのでした。よりシンプルを期すために、`useState`から始めていました。

### `reducer`の抽出

さらに、「従来のオブジェクトと更新内容から新しいオブジェクトを作る」という部分も、これ単体で抽出が可能です。

```jsx

// コンポーネントの外に置いても問題なし
const reducer = (oldState, action) => ({...oldState, ...action});

const [state, setState] = React.useState({text: "hoge", count: 1});

const dispatch = React.useCallback(
  updates => setState(oldState => reducer(oldState, updates)),
  [setState]
);

const onChangeText = e => {
  const text = e.target.value;
  dispatch({text});
}

<input type="text" value={state.text} onChange={ onChangeText } />
```

これだけ見れば、`reducer`関数を切り出すのは過剰にも思えます。ただ、このように分離することで、`reducer`部分は「引数のみに依存する、純粋な関数」として構築できるようになり、コンポーネントの状態管理など無関係に、データの更新へ専念できるようになります。

そして、`action`も単にマージするだけではなく、例えば動作内容を`action.type`で切り分けるというような、Reducer内で複雑な値の操作を行う方向へ発展させることもできます。

一方で、`reducer`から`dispatch`を作るのは定型化していますので、`React.useReducer`というHooksが用意してあります。

```javascript
const [state, dispatch] = React.useReducer(reducer, {text: "hoge", count: 1});
```
公開鍵証明書って何？

# 公開鍵証明書って何？
**認証局(CA)が「この人(サーバ)が発行した公開鍵で間違いないよ」と証明するもの**
なりすまし、改ざんに効果あり!
クライアントがアクセスしたいサーバAが「僕はサーバAだよ!サービスAを提供しているよ!」と声高々に言っていても、本当にサーバAかどうかはわからない。
なぜなら、攻撃者であるサーバBが「僕はサーバAだよ!(本当はサーバB)」とサーバAになりすましている可能性があるから。
そこで、第三者である認証局側で「あなたがサーバAであることを認めます」と証明したものが公開鍵証明書(サーバ証明書、クライアント証明書、ルート証明書の3つがある)

# サーバ証明書作成までの流れ
よくクライアント、サーバ、認証局が三角の形で並んでいる図を見かけると思う。
それを想像しながら書く。
(1)サーバは公開鍵と秘密鍵の鍵ペアを作成する。
(2)サーバは公開鍵を認証局に登録する。(申請書のフォーマットはX.509が良く出てきますね)
　　その際、公開鍵＋コモンネームや、組織情報なども一緒に送る。
(3)認証局側でも公開鍵と秘密鍵のペアを作成しておき、サーバから証明書の発行が来たら、認証局の秘密鍵でサーバの公開鍵とコモンネーム等の諸々の情報からのディジタル署名を作成し、公開鍵にくっつけてサーバ証明書の出来上がり。
(4)クライアントはサーバからサーバ証明書を取得する。
(5)サーバ証明書を取得したら認証局の公開鍵でサーバ証明書の認証局のディジタル署名を復号し、検証する。
(6)公開鍵を使って通信開始。
　　(この後、共通鍵を交換するのも良し!)
※クライアントは通信を行う際、サーバ証明書に格納されているコモンネームを検証します。
　このコモンネームにはサーバの管理しているURL(正確にはFQDN)が登録されており、アクセス先のURLが本当に正しいのかコモンネームと比較を行う。
　 Itecの模試にも出ました。実際にも出てるのかな?

# PKIって何？
よく解説サイト等を見ていますが、私なりの解釈としては「証明書作成、紛失・漏洩時の処理、鍵の管理等を構成しているもの」と考えています。要は公開鍵を効率よく運営するための会社みたいな感じです。
基本的には**サーバ証明書作成までの流れ**で解説していることが主なことだと思います。
そのほかには前述しましたが紛失・漏洩時の処理を行っています。
PKIはビルとかに入ってるわけではないのですぐに作れます。それなら自分だけとか友達同士で!ってレベルで。
その中でも政府が確立しているPKIを**GPKI**と言います。

# CRLって何?
上記、紛失・漏洩時のことです。
証明書の流出は起こり得ます。それがUSBに格納していてUSBを落とした、通信盗聴されててバレちゃったとか様々です。
その時に「そのサーバ証明書利用できないようにして!」と認証局に依頼します。
認証局では証明書が破棄した証明書を一覧化しています。一覧化したリストのことを**証明書破棄リスト(CRL)**と言います。
正確には有効期限内で破棄した証明書のシリアル番号を一覧化したものです。
そのため、有効期限が切れ次第CRLからは除外されます。
CRLは随時更新されるため今持っているサーバ証明書が有効なのか調べることも可能です。
**・OCSPプロトコルによる問い合わせ**
クライアントかサーバが証明書の有効性を調べるために利用するプロトコルです。
OCSPを使って「この証明書まだ使える？？」って問い合わせをします。
ちなみに問い合わせ先は認証局の中の「VA」という機関で、CRLの集中管理を行っている所です。

**・CRLのダウンロード**
有効かどうか問い合わせるのではなくリスト自体をダウンロードするやり方です。
HTTPとかFTPとかでダウンロードするみたいですね。

#認証局の公開鍵証明書に証明
サーバの公開鍵を証明しているのが認証局です。
ですが、そのサーバ証明書を認証する認証局の公開鍵は誰が証明するのでしょうか。
攻撃者が認証局になりすましていることだって大いにあり得ますからね。
認証局の公開鍵を認証するのは上位の認証局です。**ルートCA**と言いますよね。
認証局の公開鍵を上位の認証局が認証して、さらにその公開鍵を上位の認証局が認証して・・・と、きりがないため、ルートCAは自分自身で認証を行います。
認証局は階層構造になっており、頂点をルートCA、中間に存在する認証局を**中間認証局**と言います。

# プライベート認証局とパブリック認証局
パブリック認証局は公的な第三者機関のことで、プライベート認証局は社内とか組織内とか自身で作成した認証局のことです。
パブリック認証局は厳密な審査を突破したCAです。そのため利用者側から見ても信頼できますよね。しかし証明書を登録する際にお金がかかります。
プライベートCAは自社内で完結するもので自分を自分自身で証明しています。そのため自社内で信頼できる認証機関としておけば自社内から自社内のサーバとかだったらパブリック認証局と大差ありません。
しかし利用者側から見ると、ただ「俺が俺だぁ」といっているにすぎませんのでアクセスする際は警告画面等が出てしまいます。パブリック認証局に認証されたところは警告が出ません。
利用者側から見るとプライベート認証局はパブリック認証局に利便性、信頼性の面で劣りるのではないでしょうか。ただ自社内だけでの利用という点であればプライベート認証局を利用するのは有りです。