OmniAICreator/Qiita-1.07M huggingface dataset:
QiitaAPIでCRUD with Python3

# 概要
Qiita APIをPythonからリクエストして記事の作成・読込・更新・削除をするソースを記載

## 実行した環境
OS　:　CentOS7
Version　:　Python3.6
API　:　QiitaAPI v2

## 必要なPythonライブラリ
requestsのみ。以下でインストール。
> pip install requests

## 事前準備
Qiitaのアクセストークン取得する必要あり
### Qiitaアクセストークン取得の手順
１．右上のアイコンー＞設定ー＞アプリケーションー＞新しくトークンを発行するを選択
２．read_qiitaとwrite_qiitaにチェックを入れる
３．発行後に表示されるアクセストークンを保存する
**（※注意：アクセストークンの再表示不可）**

## CRUDの各ソースコード
※取得したアクセストークンをxxxxxxxxxxxxxxxxxxxxxxxの部分に記載する

### 実行方法
各ソースに対して```python ***.py```と実行する

### 1.投稿作成
```python:create.py
import requests
import json
url = 'https://qiita.com/api/v2/items'
token = 'xxxxxxxxxxxxxxxxxxxxxxx'
headers = {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/json'
}
title = 'test Title'
body = 'test Text'
tag = [{'name': 'test'}]
post_data = {
    'body': body,
    'title': title,
    'tags': tag,
}
r = requests.post(url, headers=headers, data=json.dumps(post_data))
print(r)
print(r.text)
```
### 2.投稿取得
```python:get.py
import requests
import json
url = 'https://qiita.com/api/v2/items?page=1&per_page=100&query=created%3A%3E2018-02-26'
token = 'xxxxxxxxxxxxxxxxxxxxxxx'
headers = {
      'Authorization': 'Bearer ' + token,
}
r = requests.get(url, headers=headers)
ans = json.loads(r.text)
maxArrayLength = len(ans)
for j in range(0,maxArrayLength):
   print( str(ans[j]["id"])  +  ":" + str(ans[j]["user"]["organization"]))
```
※投稿は1ページ当たり（per_page）100件が限界。101件目を見たい場合、page=2にする
※queryで抽出条件を記載することが可能
### 3.投稿更新（POSTではなくPATCH)
```python:update.py
import requests
import json
qid = 'yyyyyyyyyyyy'
url = 'https://qiita.com/api/v2/items/{}'.format(qid)
token = 'xxxxxxxxxxxxxxxxxxxxxxx'
headers = {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/json'
}
title = 'update Title'
body = 'update Text'
tag = [{'name': 'test'}]
post_data = {
    'body': body,
    'title': title,
    'tags': tag,
}
r = requests.patch(url, headers=headers, data=json.dumps(post_data))
print(r)
print(r.text)
```
※yyyyyyyyyyyyは、更新したい記事ID（URLの最後に記載されている英数字）を入力

### 4.投稿削除
```python:delete.py
import requests
import json
qid = 'yyyyyyyyyyyy'
url = 'https://qiita.com/api/v2/items/{}'.format(qid)
token = 'xxxxxxxxxxxxxxxxxxxxxxx'
headers = {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/json'
}

r = requests.delete(url, headers=headers)
print(r)
print(r.text)
```
※yyyyyyyyyyyyは、削除したい記事ID（URLの最後に記載されている英数字）を入力

## （参考）QiitaAPIの公式ドキュメント
https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF

## ※Python3の文字コード問題

CentOSで実行すると以下のメッセージが表示されることがある
> UnicodeEncodeError: 'ascii' codec can't encode character

・対応方法
まず以下のコマンドで文字コードを確認
```
 echo $LANG
```
Cと返ってくる場合、言語設定をja_JP.utf8に修正する必要がある
```
localectl set-locale LANG=ja_JP.utf8
```
上記コマンドを実行して言語設定をja_JP.utf8に変更して一度再起動

※参考：https://qiita.com/toshihikoyanase/items/47407551d8f3d4e8c39a
WebPackを手に入れて効率の良いプログラミングを!! 文系学生がインストールしてみた!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。

「WebPackのインストールの仕方わかる?」
「? わからないです」
「じゃあ、インストールしといて」
(わからん言うとるやんけ…)


##WebPackとは
まぁ、わからないといったところで先に進むわけじゃないし、とりあえず調べてみるか。
[フロントエンドエンジニア必見！JavaScript開発現場で人気の「Webpack」とは？](https://ferret-plus.com/6337)によると、

>画像などのファイルをまとめることでファイル間の移動を少なくし、ページの読み込み速度を上げる

とのこと。

もう少し詳しく説明すると、画像などのファイルを**モジュール**として扱い、**バンドル**という1つのファイルとして変換してくれる仕組みを持っているらしい。

プログラミングにも直接影響があるんだろうけれど、どちらかと言えば、システムを提供するときに大きな影響を与えるんだろうな。

とりあえずインストールしていくか!!

##WebPackのインストール
[ferretの記事](https://ferret-plus.com/6337)にもインストールの仕方は書いてあるけれど、社員さんに紹介して貰った[現場で使えるwebpack 4入門 – JS開発のモジュールバンドラ](https://ics.media/entry/12140#webpack-setup)の方が詳しそうだし、こっちで進めていくか。

WebPackをインストールするためには、`Node.js`と`npm`を導入しておく必要があるみたい。
まだしていない人は、[こちら](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)をどうぞ。

###インストール
まずは作業用のファイル作るか。

```
mkdir sample
cd sample
```


続いて、`package.json`の作成。、

```
npm init -y

```

これで情報がある程度書かれたファイルが作れる。

さてさて、webpackのインストールしますか。

```
npm i -D webpack webpack-cli
```

###package.json
続いて、`package.json`の変更。

```
{
  "scripts": {
    "build": "webpack",
    "start": "webpack-dev-server"
  },
  "devDependencies": {
    "webpack": "^4.0.0",
    "webpack-cli": "^2.0.9",
    "webpack-dev-server": "^3.0.0"
  }
}
```

`devDependencies`以下はインストールした時によって変わるのでご注意を。

###webpack.config.js
`webpack.config.js`を作成し、このような設定をする。

```
module.exports = 
  mode: 'development',
  devServer: {
    contentBase: 'dist',
    open: true
  }
};
```

###サーバーの立ち上げ
ここまでこれたらあとは、

```
npm run start
```

```
npx webpack-dev-server
```

のどちらかを打ち込む。
そうすることで、自動的にブラウザが立ち上がり、コーディングと現状の確認ができるようになるらしい。

##まとめ
今回はWebPackの導入をしました!!
少しずつ使い方を覚えていって、効率良くプログラムをかけるようにしていこう!!

##参考サイト
[ferretの記事](https://ferret-plus.com/6337)-https://ferret-plus.com/6337
[現場で使えるwebpack 4入門 – JS開発のモジュールバンドラ](https://ics.media/entry/12140#webpack-setup)-https://ics.media/entry/12140#webpack-setup
[webpack 4 入門](https://qiita.com/soarflat/items/28bf799f7e0335b68186)-https://qiita.com/soarflat/items/28bf799f7e0335b68186
[step by stepで始めるwebpack](https://qiita.com/howdy39/items/48d85c430f90a21075cd)-https://qiita.com/howdy39/items/48d85c430f90a21075cd
人工知能（機械学習）で、第６感の可視化に挑戦 その③

第６感をAIで可視化できないか？という試みの　第３弾です。
全体のお話はこちら
[人工知能（機械学習）で、第６感の可視化に挑戦](https://qiita.com/nanako_ut/items/44ecdb4f76d13dc276d6)

# はじめに
今回の範囲はこちらになります。
画像を問い合わせたら、AIの判定結果が戻ってくるような機能を作成することが今回のゴールです。
自分が作りやすいという理由で、Webアプリで実現します。

![gaiyou_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/170139/96c3dab4-24cc-a7c9-94b6-8baeab78c319.jpeg)

# Webアプリ
pythonのWEBフレームワークも使ってみたいですが、その学習はいったん後回し。
とりあえず慣れているHTML/JavaScript/bootstrap/PHPでWebアプリを作成します。

## 開発環境
xammpを使います。
https://www.apachefriends.org/jp/index.html

## Webアプリの構成
クライアント側は、HTML/JavaScript/bootstrapで。
サーバ側は、PHPからpythonを呼出す構成にします。
（本来であれば、Webサーバと、pythonが動くサーバは別々にするのでしょうが、、、今回はトイプログラムなので、、簡易版構成です）

![kousei.jpg](https://qiita-image-store.s3.amazonaws.com/0/170139/995c17f6-b4b3-3161-af92-40e848efb583.jpeg)

## Webアプリの動き
http://www.amikano.net/index.html

# ソース解説
ポイントを説明していきたいと思います。

## HTML

ファイル選択フォームを定義します

```html:index.html
<div class="card-body">
    <form>
        <div class="form-group">
	    <label for="exampleFormControlFile1">写真を選択してください</label>
	        <input type="file"  name="userfile" class="form-control-file" id="user_file">
	</div>
    </form>
</div>
```

## JavaScript

「判定」ボタンが押された時のイベントを定義します。
選択されたファイルを取得し、PHPへファイルをPOSTします。

最近はajaxの書き方がスマートになったようです。こちらを参考にさせて頂きました。
[おじさんが若い時はね$.ajax()のオプションでsuccessとかerrorとか指定していたんだよ](https://qiita.com/tonkotsuboy_com/items/0722ad92f370ab0c411b)

```javascript:dl.js
// 画像判定
$('#dudge_image').on('click',function(){
    var fd = new FormData();
    // HTMLの「name="userfile"」から選択された画像の情報を取得します
    fd.append( "file", $("input[name='userfile']").prop("files")[0] );

    // 画像判定処理呼び出し
    $.ajax({
        type :  "POST",
        url : "judgeImage.php", // 画像判定処理（PHP）を呼び出します
        dataType : "json",
        data : fd, // 選択された画像をphpにPOSTします
        processData : false,
        contentType : false
    }).done(function( msg ) {
        // 結果を表示
	show_result(msg)
    }).fail(function() {
        show_result("error")
    });
});
```

## PHP
**Jquery⇒PHP**
JqueryからPOSTした画像ファイルのパスを受け取ります。

```php:judgeImage.php
$file_path = $_FILES["file"]["tmp_name"];
```

**PHP⇔python連携**
外部コマンドを起動するexcec関数を使います。
画像判定処理「judgeImage.py」に、画像ファイルのパスを渡して実行します。
そして、pythonからの戻り値を受け取ります。

```php:judgeImage.php
$cmd = "python judgeImage.py ".$file_path;
$result = exec($cmd);
```

**PHP⇒Jquery**

pythoの実行結果を、json形式でJavaScript側へ返します。
pythonの実行結果を、javaScript側で扱いやすいように形式を変えています。

```php:judgeImage.php
$result = str_replace(array("(","[",")","]"),"",$result);
$list  = explode(',',$result);

$arr = array('t'=>substr($list[1]*100, 0, 2),'y'=>substr($list[3]*100, 0, 2));
print(json_encode($arr));
```

# まとめ
実行ソースはこちらにアップしております。[github](https://github.com/nanako-ut/keras-vgg16/tree/master/htdocs)

# 次回
[環境構築](https://qiita.com/nanako_ut/items/e6b077e6562ca3c37206)
人工知能（機械学習）で、第６感の可視化に挑戦~画像判定webアプリ作成～

# はじめに
唐突ですが、中日ドラゴンズファンです。
ドラフトやFAで選手が入替る度に、何となく「あ、この選手中日っぽいな」「あ、この選手中日っぽくない雰囲気」と感じていました。

この『っぽい』という感覚。
この第６感。
「こういう特徴を人は『っぽい』と感じている」と、AIで人の感覚可視化できないものか。
ということで、やってみましょう。

# 仮説とゴール
## 仮説

選手の顔には、球団をグループ化できる特徴があると仮定する。
~~カリスマ⇔いぶし銀度だったら、中日ドラゴンズの選手はいぶし銀のグループが多そうなイメージ、とか。。。~~

![kasetu.jpg](https://qiita-image-store.s3.amazonaws.com/0/170139/d3b98f58-0d68-8160-3bdd-0ea7412bd292.jpeg)

このグループ化できるよな「何がしかの特徴」が『っぽい』感を醸し出している特徴であると考える。

## ゴール
AIで、球団別の選手の顔の特徴を抽出したい。（「何がしか」の特徴が何なのか、を可視化したい）
けれども、、、そのような大量データは持ち得ていないので、、、まずは中日ドラゴンズの投手と野手で何がしかの特徴が得られないか？試してみたいと思います。

イメージはこんな感じです。
![gaiyou.jpg](https://qiita-image-store.s3.amazonaws.com/0/170139/c4436dcb-486b-0a60-6c64-4d0e1899c0d5.jpeg)

# 結果

学習させたAIでのテスト結果は以下です。
学習を重ねても正解率（オレンジの線）が全く上がってきません。。。誤解答（青色の線）も下がっていきません。。。
<img width="303" alt="dra_judge_graph.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/26226dd5-df98-35fa-d0ec-f9ffe342037d.png">

残念ながら、、、**「投手と野手をグループ化できるような特徴 =『っぽい』特徴」 は得られていない。。。**という結果に。

# 考察と今後の方針
## 考察
- データの問題？
    - 画像の解像度？（50ピクセル×50ピクセルで学習させた。解像度が低すぎ？）
    - 画像の量が少なすぎた？（学習画像40枚（元画像20枚＋水増し20枚）では、やはり足りない？）

- そもそも論（仮説に対して）
    - 投手と野手という分類では、『っぽい』特徴はそれほど見られない？
    - 球団別（そもそもの目的ではありますが…）であれば、何がしか特徴が見られる？

- そもそも論（手段）
    - 今回は深層学習のモデルを利用しましたが、他にベターな手段（主成分分析とか？？）がある？？？

## 今後
1. 仮説は成立する、という強い気持ちで、「データの問題」を解決すべくもう少し模索していきたい
2. そもそものゴールに近づくべく、球団別の特徴可視化を模索してみたい。

# やったこと
## ドラゴンズ顔判定Webアプリ作成
最初に、中日ドラゴンズの投手と野手を学ばせた、投手・野手判定モデルを作成します。
せっかくなので、投手・野手判定モデルをWebアプリで試せるようにしてみます。

**公開したＷｅｂアプリ**
http://www.amikano.net/index.html

**ソースはこちら**
[github](https://github.com/nanako-ut/keras-vgg16)

**作業内容詳細**

| No  | 作業内容 | 利用技術・環境等 |
|:---:|:--------|:---------------:|
| 1   | [データ収集、加工、水増し](https://qiita.com/nanako_ut/items/1ca21e02e1e01cd6935d)| openCV |
| 2   | [投手と野手学習モデルを作成](https://qiita.com/nanako_ut/items/d35d74b7d692659b1e03)| keras(VGG16)|
| 3   | [Webアプリ作成](https://qiita.com/nanako_ut/items/b6d8f28046ab68812636)| HTML5/JQuery/PHP |
| 4   | 開発環境構築 |
| 5   | [本番環境構築](https://qiita.com/nanako_ut/items/e6b077e6562ca3c37206) | さくらVPS(CentOS7) |
| 6   | Webアプリリリース | - |

## 学習したドラゴンズ顔の可視化
次に、『っぽい』を可視化してみます。
（今回は、上記の「結果」からも明らかになったように『っぽい』特徴は得られませんでしたが、、、）

学習時のパラメータを可視化した結果です。
もはや、人の目では何が何だか分かりません、、、
![stitched_filters_3x3.png](https://qiita-image-store.s3.amazonaws.com/0/170139/3720d66b-869b-1c3c-5268-f42d395c0f95.png)


## 作業期間
3週間（うち半分は開発環境構築(Docker)の模索…）

# おまけ（自分語り）
仕事でJava/C#/PHPを使った開発の経験はありましたが、機械学習や人工知能に関する知識は、「ゼロから作るDeep Learning」を読んでみた、という程度（内容サッパリ分からず）という状態でした。
[2017年12月には、DeepLearning検定受けてみて見事落ちたくらいですし。。。](https://qiita.com/nanako_ut/items/7c73e5106641b4dc2029)

今年に入ってから本腰を入れて勉強を始め、3ヶ月を過ぎました。

機械学習の素人でも、3ヶ月くらいあればとりあえず形になるものができあがるのだなと思いました。
（Webアプリ作成に関しては、環境構築の方が苦労したという・・・残念なお話・・・）
ライブラリのリンク方法をきっちり区別しよう

# 初めに

ライブラリのリンク方法は３種類に分けられます。
「動的ライブラリ」や「動的リンク」といったキーワードでネット検索すると、３種類全てを説明しているサイトがかなり少ない印象を受けます。
そこで「ライブラリのリンク方法」、という切り口で整理してみます。
OSの対象は、WindowsとLinuxとmacOSです。~~macOSは調べていませんが、恐らくライブラリに関しては、Linuxと同様の見方で大丈夫です。~~（フォーマットの違い等、細かいことは、本記事では対象外です）
※コンパイルオプション等の説明は原則C/C++をイメージして記述しています。
<font color="Orange">
<-- 2020/09/10 追記 start -->
読んでいただきありがとうございます。
macOSの内容を追記しました。
ライブラリ作成時に必要なオプションと、ライブラリ使用時に必要なオプションをごちゃごちゃにしていた為整理しました。
「動的ライブラリに対する補足」と「最後に」を追加しました。
<-- 2020/09/10 追記 end -->
</font>


# ３種類のリンク方法
|No|リンク方法|対象ライブラリ|Windowsにおける拡張子|Linuxにおける拡張子|macOSにおける拡張子|リンクタイミング|
|:---------|:---------|:---------|:---------|:---------|:---------|:---------|
|1|静的リンク |静的ライブラリ（スタティックライブラリ）|lib(a)|a|a|ビルド時|
|2|動的リンク |動的ライブラリ（ダイナミックライブラリ、共有ライブラリ）|dll|so|dylib(so)|実行ファイルを実行する時|
|3|動的ロード |動的ライブラリ（ダイナミックライブラリ、共有ライブラリ、バンドル）|dll|so|bundle(so)|プログラムが任意にライブラリをロードした時|

拡張子「dll」は**D**ynamic **L**ink **L**ibraryの略、拡張子「so」は**S**hared **O**bjectです。
あれ、共有ライブラリ＝Shared Libraryならslでは？というつっこみはなしの方向で。。。

静的ライブラリと動的ライブラリを区別できる人は多いと思いますが、２と３を区別できる人は少ないのではないでしょうか。
１と２、または、１と３の組み合わせのみを解説しているサイトがやたらと多いです。。。
## 動的リンク
２の「動的リンク」は、Makefileに「-l」でライブラリ名を指定してビルドすると、実行ファイルを実行する時に、OSが指定したライブラリを決められた検索順番でディレクトリを検索し、ライブラリが見つかるとリンクします。
全ての検索パスを検索して見つからない時は、実行エラーになります。
## 動的ロード
３の「動的ロード」は、Windows（MinGW、MSVC）ならLoadLibrary()関数、Linux系（Cygwin、Ubuntu、macOS）ならdlopen()関数でライブラリをロードした時に、初めてライブラリの内容がメモリにロードされます。Makefileに「-l」で指定する必要はありません。
動的ロードする為のデフォルトのルールには、クラスのインスタンスを作成して読み出す、というAPIはありません。
従って、クラスのインスタンスを作成して読み出す為には、extern C{}で括った領域に、クラスをnewしてインスタンスを返すような関数をプログラマが独自に定義する必要があります。
この「独自に定義」する部分のルールを、よりしっかり作ったものが「プラグイン」と呼ばれるものです。
WebブラウザやIDEのプラグインのように、後から機能を追加できる仕組みです。
プラグインは動的ロードの１種といってよいと思います。

## 動的ライブラリに対する補足
動的リンクと動的ロード、どちらも動的ライブラリを作成しリンクするビルド方法は同じです。ソースコード的には、C言語レベルであれば同じコードが使用できます。C++の場合は上記に記述した通り、LoadLibrary()関数/dlopen()関数等の使用有無の違いがあります。
ライブラリ作成時に必要なコンパイルオプションはWindowsとLinuxは-shared、macOSは-dynamiclibです。（macOSはLinuxのライブラリも許容する関係か-sharedも使用できる）-fPICは必須ではありませんが、基本的に付けたほうがよいオプションです。（macOSでは明示的に記述しなくてもデフォルトで-fPICが付いています）
尚、macOSでは動的リンクの動的ライブラリを共有ライブラリ、動的ロードの動的ライブラリをバンドルと呼び分けています。

## 最後に
ライブラリの情報は各プラットフォーム毎に個別で扱われることが多く、各プラットフォームを横断的に見ることができるサイトはなかなか見つかりません。そこで、GCCコンパイラ限定ではありますが、Cygwin(Windows)、MinGW（Windows）、Ubuntu、macOSでそれぞれどのようにライブラリを作ったり、使ったりするのかを技術同人誌としてまとめてみました。[BOOTH](https://eugo.booth.pm/items/2368447)で頒布していますので、よかったら参考にしてみてください。

## おまけ情報

「ライブラリを作ろう」本に入れられなかったライブラリとライブラリをリンクする話を
[実行ファイル→動的ライブラリA→動的ライブラリBのリンク構成で、実行ファイルは動的ライブラリBに依存しないか](https://qiita.com/argama147/items/c8564ef215fced28656a)
にまとめました。よかったら参考にしてください。
【Android】assetsフォルダのファイルをローカルストレージにコピーする

# 00. はじめに
設定などをファイルに外だししたい場面がある。
そういう場合では外だししたファイルを別で入れるより、assetsに入れてコピーした方がいい※1。
（apkのファイルサイズが大きくなりすぎる場合は、諦めるしかないが...）

# 01. ぱーみっしょん
ストレージに書き込むのでパーミッションを設定する必要がある。

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest ～>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ←追加

    <application ～>
    </application>
</manifest>
```

# 02. こーど

```java
// ファイルセパレータ
public static final String SEPARATOR = File.separator;

// コピー対象のファイル名
private static final String FILE_NAME = "hoge.txt"

// コピー先のディレクトリパス
private static final String BASE_PATH = Environment.getExternalStorageDirectory().getPath() + SEPARATOR + "HogeFile";

private boolean copyAssetsFile() {
    // コピー先のディレクトリ
    File dir = new File(BASE_PATH);

    // コピー先のディレクトリが存在しない場合は生成
    if (!dir.exists()) {
        // ディレクトリの生成に失敗したら終了
        if (!dir.mkdirs()) {
            return false;
        }
    }

    // こぴーしょり
    try {
        InputStream inputStream = getAssets().open(FILE_NAME);
        FileOutputStream fileOutputStream = new FileOutputStream(new File(BASE_PATH + SEPARATOR + FILE_NAME), false);

        byte[] buffer = new byte[1024];
        int length = 0;
        while ((length = inputStream.read(buffer)) >= 0) {
            fileOutputStream.write(buffer, 0, length);
        }

        fileOutputStream.close();
        inputStream.close();
    } catch (IOException e) {
        // 何かテキトーに
        return false;
    }
    return true;
}
```

# 03. 注意事項
* root直下とか、どこでもコピーを置けるわけではなかったはず<br>
（下回りのcのソースをいじればコピーを置けるように出来たはず※2だけど、アプリ層での開発では関係ない話）

# 04. 注釈
※1 ... ファイルの入れ忘れを防ぐため。
※2 ... cをあまり触らない人間なので、仕事でやった際のしんどかった記憶しかない。

# 98. 参考
Androidでassetsのファイルをローカルストレージにコピー | http://nirasan.hatenablog.com/entry/2013/04/24/134018

# 99. 更新履歴
|日付|内容|
|:--|:--|
|2018/03/27|投稿|
IntellijIDEA + Scalaでテストのリモートデバッグ



探した感じ、巷に溢れている記事はsbtを通さないものしかなく、マルチプロジェクトだと動かなかったりするので汎用的にうごかせる設定(コマンドで立ち上げたsbtのtestに対してリモートデバッグする)をまとめました。


## 概要

Inttelijのリモートデバッガはシンプルな構成だとサクッと動くのですが、
マルチプロジェクトを使ってたり、テストフレームワークが混在していたり等々があると期待通り動かすのに一手間かかります。

### runは問題ない

手元で動作確認をする時、runして状態を見たい際は以下のようなコマンドで実行してます。

```
sbt 'project $pjName' -jvm-debug $port -Dconfig.file=$file run
```


### testの場合

`sbt (test|testOnly)`時は-jvm-debugだけではうまく動いてくれず、毎回以下の設定をtestタスクのjavaOptionに指定してdebugしたり 

```
javaOptions in Test ++= Seq("-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9999")
```

IntellijIDEA上でテストにたいして一つ一つdebug confを作って、-Dconfig~などのテストに必要な設定を与えたりしていました。

これだと面倒なので、Intellij上とは別のteminalで立ち上げたsbt shellから実行したテストをデバッグできるようにしました。

これならtestOption等で指定したデフォルトオプションも読み込め、汎用的に使えて幸せ


## jdwp
Java TM Debug Wire Protocol (JDWP) の略で、debuggerと、JVM との間の通信に使用するプロトコルです。詳しくは↓
https://docs.oracle.com/javase/jp/6/technotes/guides/jpda/jdwp-spec.html


以下2つの構成を取ることが出来ます。

- JVM(sbt) = Server, Debugger(Intellij) = Client
- JVM(sbt) = Client, Debugger(Inttelij) = Server 

どっちでもよいのですが、JVMがサーバーのパターンだとDebugger起動忘れてsuspendしっぱなしが起こり得るのでDebugger側をサーバーにした手順を記します。(簡単に変えられるのでお好みでどうぞ)


## debugタスク追加

↓のConfigの作り方を参考にうちのsbtにremote debugger用オプションを組み込んだConfigを追加しました。
https://www.scala-sbt.org/0.13/docs/Testing.html#Additional+test+configurations+with+shared+sources

ミニマムだと↓のような感じ

```
  lazy val debugTest = config("debug") extend Test

  lazy val root = (project in file("./"))
   .configs(debugTest)
   .settings(      
     fork in DebugTest := true,
     javaOptions in DebugTest ++= Seq("-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=41230"
   )
   .settings(inConfig(DebugTest)(Defaults.testTasks))
```

※javaOption in Testでもいいんじゃないのと思うかもですが、CIのときにdebuggerがないと
JVMがClientの場合=コケる or JVMがServerの場合=debugger接続待ちのまま止まる)ので別Configを用意する必要がありました。


## 導入手順

1. 右上のデバッグメニューから `Edit Configurations` をクリック
![Screenshot 2018-03-24 02.24.47.png](https://qiita-image-store.s3.amazonaws.com/0/27459/d234e24e-9050-61bc-2c58-ab2e0fcff88e.png "Screenshot 2018-03-24 02.24.47.png")


2. 左上の`+`->remoteをクリック
![Screenshot 2018-03-24 02.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/27459/6ca9e22d-7b93-324e-a6fe-40e13717b66b.png "Screenshot 2018-03-24 02.27.48.png")


3. Name->好きな名前, Debugger Mode->Listen, Port->41230に設定し、`OK`をクリック 
![Screenshot 2018-03-24 02.30.25.png](https://qiita-image-store.s3.amazonaws.com/0/27459/37ae038a-37f9-b83f-9f6e-f0720c15c860.png "Screenshot 2018-03-24 02.30.25.png")


4. 右上のデバッグメニューから作成した設定を選択し、`🐞`アイコンをクリック
![Screenshot 2018-03-24 02.33.12.png](https://qiita-image-store.s3.amazonaws.com/0/27459/aac41d2f-ca17-47cd-9b37-5b120ce08987.png "Screenshot 2018-03-24 02.33.12.png")


5. 緑色に点滅している状態で、breakpointを貼ってターミナルを立ち上げ、お好きに`debug:test`なり`debug:testOnly *Hogehoge`行う。
※1度の実行(debug:test等)が終わると、Debuggerが停止するので再度実行したい場合は4,5の手順を繰り返し行う


## おまけ: JVMをサーバーにしたいときの注意点

Intellijのdebuggerは接続のタイミングがシビアなのか、debuggerが接続するまで待機する`suspend=y`を指定しないとつながらなかったので注意
【Zabbix】history_logのログをホスト/アイテムごとにログ出力

###【作成した背景と機能】
監視システム更改直後、エラーが多発していた際に、
インフラ/開発/運用で手分けしてエラーへの対応をしなければ
なりませんでしたが、ZabbixWebGUIを確認できる端末数は
限られていたため、外部にエラーログを出力する必要性が生じました。

理想としては、以下の機能が欲しいとぼんやり考えていました。

　・ホスト名かつアイテムごとにログファイルを出力
　・ファイル名を見ただけでどのサーバのどのログかわかる
　・期間指定可能(※ログ保存期間が許す限り)

Zabbixは下記種類のログをhistory_logテーブルへ
格納しているので、ここから上手く一括出力できないか思案しました。

　・/var/log/messagesのアイテムで設定したエラーログ
　・OracleやMySQL、SQL ServerなどのDB各種ログ
　・WindowsのAPP/SYS/SECURITYログ
　・その他、設定しているならあらゆるログデータ

###【検証環境】
　●Zabbixサーバ
　・CentOS 7.4
　・Zabbix 3.4.3(3.0.9でも大丈夫)
　・MySQL 5.7.20

###【利用するツールの紹介】
設定ファイルと本ツールの2つを使用して一括出力します。

◆logexport.txt
取得するヒストリログのリストをシェル内で作成し、
その結果を出力するテキストがこのファイルです。
中は以下のような感じです。

```logexport.txt
28603   Zabbixs01       SNMP_Trap_fallback
28604   タスクPC       SNMP_Trap_linkDown
```
左から、アイテムID、ホスト名、アイテム名を
格納し、後ほど引数として利用します。
シェル内でこのテキストファイルは自動作成しますので、
用意しなくて大丈夫です。

◆dump_historylog.sh
本ツールです。実装した機能は上述したので省略します。

###【dump_historylog.sh】
以下がシェルの内容です。

```BASH:dump_historylog.sh
#!/bin/bash

###初期設定
OUT_DIR=/home/ToolAdmin/log
CUR_DIR=`dirname $0`

###MySQL設定
MY_CONF=/home/ToolAdmin/mysql.conf

###取得期間の設定
STIME=`date +%s -d '90 days ago'`
ETIME=`date +%s`

CON_FILE=logexport.txt

###取得ヒストリログリストを作成
mysql --defaults-extra-file=${MY_CONF} << _EOSQL_ | sort | uniq -c | sed -e 's/      1 //g' -e '/itemid/d' > $CUR_DIR/$CON_FILE
SELECT distinct
 i.itemid,
 h.host,
 i.name
FROM history_log hl
INNER JOIN items i ON hl.itemid = i.itemid
INNER JOIN hosts h ON i.hostid = h.hostid
_EOSQL_

###出力不可になる特殊文字列の排除
sed -i -e "s/[\|/|:|*|?|\"|<|>|\|]/-/g" "$CUR_DIR/$CON_FILE"

###history_log取得
while read LINE
do
ITEMID=`echo $LINE | awk '{print $1}'`
HOSTNAME=`echo $LINE | awk '{print $2}'`
INAME=`echo $LINE | awk '{print $3}'`
OUT_FILE=${HOSTNAME}_${INAME}_`date +%Y%m%d%H%M%S`.log
mysql --defaults-extra-file=${MY_CONF} << _EOSQL_ >> $OUT_DIR/$OUT_FILE
SELECT
 i.itemid 'アイテムID',
 h.name 'ホスト名',
 FROM_UNIXTIME(hl.clock) '日時',
 hl.severity 'Win深刻度',
 hl.source 'Winソース',
 hl.logeventid 'WinEVT_ID',
 hl.value 'エラー内容'
FROM history_log hl
INNER JOIN items i ON hl.itemid = i.itemid
INNER JOIN hosts h ON i.hostid = h.hostid
WHERE hl.clock BETWEEN ${STIME} AND ${ETIME}
ORDER BY hl.clock;
_EOSQL_
done < $CUR_DIR/$CON_FILE
```
実行すると下記のようなログが出てきます。
ホストかつアイテムごとにファイルが出力されるので、
大量のファイルが出力されます。あらかじめご注意ください。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/198785/e7e4ff4c-835e-56cc-5360-a84c7f1929b9.png)

私の検証環境はしょぼいのでSNMPTrapのテストログしか出てきません！

あとはダウンロードして確認すれば終わりです。
もし全てのログをマージしたければ以下のコマンドを打てば良いかと思います。
※見出し行だけ消えてしまいますが。

```BASH:command.
cat *.log | sed -e '/^アイテムID*/d' > AllMerge.log
```

###【注意点や反省点】

・特殊文字処理について
　スクリプトの途中で特殊文字を削除している処理があります。
　これはアイテム名に特殊文字が入っていると出力エラーとなり失敗することを
　防ぐためです。しかしここが一点制限があり、アイテム名に空欄がある場合は
　一単語目までしかファイル名に反映してくれません。

　ここは直したいですがいい案が浮かばないので、とりあえずこれで。

・出力ファイルの区切り文字について
　今回はスペースで出力しています。
　カンマでもタブも考えましたが、ログ内カンマがある可能性もあるため、
　そのまま出力しています。


簡易に作成しましたのでカスタマイズしやすいと思います。
特定のアイテムだけ欲しいとか、見出しの名前がセンス悪いから変えるとか、
色々できると思いますので、ご活用頂ければ幸いです。

なにかありましたらコメントでお待ちしております。
※前の記事で編集リクエスト送ってくれた方ありがとうございました。

以上です。
micro:bitで踏切を作ってみる（micro:bitの光センサーとサーボモーター制御のお試し）

##概要
[Railway crossing](https://makecode.microbit.org/projects/railway-crossing)
を見て
・サーボモーターの制御
・micro:bitの光センサー
のお試しに良さそうなので実施してみました。

詳細は上記リンク先のページを読んで頂きたいのですが、ポイントは
**micro:bitのLEDの部分が光センサーを兼ねている事**
です。本当、よく出来たパッケージです。

##動作イメージ
・プラレールを走らせたかったのですが、お試しということで置くだけに留めました
![microbit_rail.gif](https://qiita-image-store.s3.amazonaws.com/0/181708/5602f03b-fed1-a291-385b-423108c4caa0.gif)

##使用したもの
・micro:bit
・サーボモーターSG90

##コード
https://makecode.microbit.org/_XKza5cA6H9RK
![MCB - コピー.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/e4c9d721-948d-6873-98f5-ae6d004b99f4.jpeg)



##苦労したこと
・乾電池２つではサーボモータが動かなかった
　→USBも繋げて（電池２＋USB給電）何とか動くようになった
・光センサーの閾値
  →どれくらいの値をセットしたら良いか分かりにくい
　　→LEDで明るさを表示させてチェック

##参考にしたサイト
[Railway crossing](https://makecode.microbit.org/projects/railway-crossing)
[【micro:bit】サーボモーターをコントロールする](https://studio.beatnix.co.jp/kids-it/hardware/chibi-bit/microbit-servomotor/)
「アプリが動作しない」とリジェクトされたときの小噺

先日App Storeに申請したアプリがリジェクトされた際の顛末が何とも言えない感じでした．

## リジェクト理由
**Guideline 2.1 - Performance - App Completeness**
「IPv6ネットワーク環境下でログインできない」ことを理由にリジェクトされました

## 原因の調査
その際のアップデート内容はログインや通信処理に関わるものではなく「何故？」と思ったのですが，
ひとつずつ原因の仮説を検証していくことにしました．

### 仮説1: アプリ実装の問題
まずはAppleの指摘にある通り，IPv6環境での動作を確認しました．

- 動作確認の参考にしたページ
  - [Technical Note TN2431: App Testing Guide](https://developer.apple.com/library/content/technotes/tn2431/_index.html)
  - [iOS9 以降で必要な IPv6 only Network への対応](https://qiita.com/shao1555/items/4433803419dfc72bf80b)

#### 結果
残念(?)ながら問題なく動作．

### 仮説2: テストアカウントの問題
「ログインできない」との指摘だったので，テストアカウントが無効になっている，またはアカウント情報が間違っている可能性が考えられます．
そこで，iTunes Connectに登録してあるテストアカウントでログインを試みました．

#### 結果
こちらも問題なし．

### 仮説3: サーバの問題
アプリ側に問題はなさそうなので，審査時間帯におけるサーバ側の問題かと思い，ログを確認しました．

#### 結果
例によって問題なし

## その他の原因の可能性
調査の結果，アプリ・テストアカウント・サーバいずれも問題はありませんでした．
そこで再度問題解決センターの情報を確認したところ

![attachment.png](https://qiita-image-store.s3.amazonaws.com/0/124121/b30f2e3b-8ae7-2443-eb6f-33c1816da43f.png)

**スクショにWi-Fiのアイコンがない…**

## 最終的に採った対応
考えられる仮説はいずれも棄却されましたが，審査時の通信状態に問題がありそうなので，
端末の通信状態を確認のうえ再度審査を行ってもらうよう，問題解決センターで返信しました．

- バイナリでのリジェクトではありましたが，リジェクト時のメッセージには「我々(Apple)が誤解している場合には問題解決センターにて返信」するよう記載されていたので、返信のみの対応としました．
- また，レビュー時に指摘された問題はなかったことを示すため，IPv6環境で動作確認したこと(およびその時のスクリーンショット)も合わせて返信しています．

## 結果
翌日，何事もなかったかのように審査に通過しました :tada: 

## まとめと教訓
レビュアからは原因についての回答はありませんでしたが，どうやら端末の通信状態の問題で間違いないかと思います．
極めて初歩的なことなので天下のAppleがまさか…とは思いましたが，人が審査をしている以上，起こりうることは起こるということでしょう．

- ただし，考えられる可能性(今回で言えばアプリ・テストアカウント・サーバの問題)をすべて取り除いておくことは重要かと思います．
DirectX11のワールド変換行列から各成分を抽出

DirectX::XMMATRIXで定義されたワールド変換行列から、スケーリング、回転、オフセットの各成分を取り出します。
(参考 → 知っていると便利？ワールド変換行列から情報を抜き出そうhttp://marupeke296.com/DXG_No39_WorldMatrixInformation.html)

ワールド変換行列が Scaling×Rotation×Offset の順になっていることが前提ですが、それは標準なのかな

```
using namespace DirectX;
XMMATRIX ExtractOffset(const XMMATRIX& mWorld) {
	return XMMatrixTranslation(mWorld.r[3].m128_f32[0], mWorld.r[3].m128_f32[1], mWorld.r[3].m128_f32[2]);
}
XMMATRIX ExtractScaling(const XMMATRIX& mWorld) {
	return XMMatrixScaling(
		XMVector3Length(XMVECTOR{ mWorld.r[0].m128_f32[0],mWorld.r[0].m128_f32[1],mWorld.r[0].m128_f32[2] }).m128_f32[0],
		XMVector3Length(XMVECTOR{ mWorld.r[1].m128_f32[0],mWorld.r[1].m128_f32[1],mWorld.r[1].m128_f32[2] }).m128_f32[0],
		XMVector3Length(XMVECTOR{ mWorld.r[2].m128_f32[0],mWorld.r[2].m128_f32[1],mWorld.r[2].m128_f32[2] }).m128_f32[0]
	);
}
// ワールド行列から回転成分のみを抽出する
XMMATRIX ExtractRotation(const XMMATRIX&  mWorld) {
	XMMATRIX mOffset = ExtractOffset(mWorld);
	XMMATRIX mScaling = ExtractScaling(mWorld);

	XMVECTOR det;
	// 左からScaling、右からOffsetの逆行列をそれぞれかける。
	return XMMatrixInverse(&det, mScaling) * mWorld * XMMatrixInverse(&det, mOffset);
}
```
コンピュータ将棋開発失敗メモ(1)終盤でKKPT(KPPを含まない)を試してみたがダメだった話

# 注意事項

[KPPTからKKPT型評価関数へ](http://yaneuraou.yaneu.com/2016/11/04/kppt%E3%81%8B%E3%82%89kkpt%E5%9E%8B%E8%A9%95%E4%BE%A1%E9%96%A2%E6%95%B0%E3%81%B8/)ではKKPTという用語はKKPT+KPPと定義されていますが本稿ではKKPTのみの評価関数を指すものとします。

# 概要

将棋の終盤において、既存のKPPT型の評価関数より軽量な評価関数であるKKPT型の評価関数を用いて深く読んだ方が強い可能性があると考えて実験してみたがKPPTが優れているとの結論を得た。

# 本実験の動機

ゲームAIの探索において評価関数による評価はよく行われているが囲碁の死活、将棋の詰不詰など結局深く探索しないと結論が出せないケースはよくある。
将棋の終盤において評価関数の良さよりも読みの深さの方が重要な可能性があると考えた

#実験概要

KPPT型評価関数と表現力は弱いが高速なKKPT型評価関数を搭載したソフトを対戦させる。できる限りオープンソースで手に入るものを利用し、必要に応じて改変した。

# KKPT型探索エンジンの作成

やねうら王[^1]のKKPT+KPP型評価関数のコードを流用してKKPTのみ計算するように書き換えた

# KKPT評価関数の作成

上記で作ったエンジンのlearnコマンドと110億局面教師データ[^2]を用いて評価関数ファイルを作成した

## 対戦概要
|        | KPPT        | KKPT        |
|:-----------------|------------------:|:------------------:|
| 探索エンジン             |              やねうら王 |やねうら王を改変        |
| 評価関数           |            elmo_sdt5[^3] |110億局面で学習したKKPT型評価関数|


|対戦条件        |         |
|:-----------------|------------------:|
| 対戦数           |            100|
 対戦開始局面           |            floodgate2017互角局面集（100手目、評価値±100以内）[^4]|
| 思考時間           |            秒読み1秒(btime=1000)|
| CPU           |            Ryzen 7 1700|
| スレッド           |            1スレッド|
（やねうら王のソースコード内のengine_invoker1.pyを利用して対戦した。各種パラメータはこちらのソースコード参照。）

# 結果
97勝3敗でKPPT型評価関数の勝利であった。

##感想
本当はもうちょっと条件を変えてやってみるつもりだったがあまりの差にやる気を失った。
「攻め駒への利き」「挟撃形」「攻め駒と受け駒の関係」などをより正確に評価できるKPPの利点がKKPTの深さの利点をはるかに上回るのだろう。

###ちょっと気になってる点
やねうら王の探索パラメータ（改変せずにそのまま使用）がKKPTにマッチしていない可能性
(でもこの差が埋まることはないだろう....)


[^1]: https://github.com/yaneurao/YaneuraOu commit 4ed0bbbc94153747f8dd3df52edfb92e392b97c7
[^2]: [depth10で作った110億局面の教師データ、期間限定で公開します](http://yaneuraou.yaneu.com/2017/11/21/depth10%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F110%E5%84%84%E5%B1%80%E9%9D%A2%E3%81%AE%E6%95%99%E5%B8%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%80%81%E6%9C%9F%E9%96%93%E9%99%90%E5%AE%9A%E3%81%A7%E5%85%AC%E9%96%8B/)
[^3]: [コンピュータ将棋ソフト「elmo」](https://mk-takizawa.github.io/elmo/)
[^4]: [tttak/ShogiGokakuKyokumen · GitHub](https://github.com/tttak/ShogiGokakuKyokumen/tree/master/2017%E5%B9%B4/floodgate2017%E4%BA%92%E8%A7%92%E5%B1%80%E9%9D%A2%E9%9B%86)
botkitでデータ保存

# 背景
slackから投稿したものをbotに記憶させて、任意のタイミングで取り出したい。
それにより例えば、slackからbotを設置したサーバ管理ができるようになる（たぶん


# botkit
bot作る際のフレームワークでデファクトスタンダードだったりするのかな。
とにかく簡単にbotが作れるみたいです。

# 今回用意するbotさんのお仕事内容
- slackからsetの問い合わせがあればデータをjsonに保存する
- slackからgetの問い合わせがあれば指定されたデータを返す


# 実装の流れ
① Slackにてbotを新規追加
② botアプリをbotkitでコーディング
③ ①のアクセストークンを②に付与する



# ① Slackにてbotを新規追加

これはSlackの管理画面（/apps/manage）で設定できます
[こちら参考にさせていただきました](https://qiita.com/yaaah93/items/fab80ca25a39f59ae741)


# ② botアプリをbotkitでコーディング

※nodejs、npmがインストール済みの環境で

- 作業ディレクトリに移動
- `npm init`でpakage.jsonを作成
- `npm i -S botkit`でbotkitをインストール
- `touch index.js`でindex.jsを作成しと実行コードをコーディング（別にファイル名はなんでもいいです）


# ソースコード
package.json

```json

{
  "name": "google_analytics_api",
  "version": "1.0.0",
  "description": "",
  "dependencies": {
    "botkit": "^0.6.12"
  }
}
```
botkitだけです。


index.js

```javascript:index.js

if (!process.env.token) {
    console.log('Error: Specify token in environment.');
    process.exit(1);
}
var Botkit = require('botkit');
var controller = Botkit.slackbot({
    json_file_store: 'storage_bot_db'
});
var bot = controller.spawn({
    token: process.env.token
}).startRTM(function(err, bot, payload) {
    if (err) {
        process.exit(1);
        console.log('Error: Cannot to Slack');
    }
});

var strage_file_name = "setting";

controller.hears(['set (.*)'], 'ambient', function(bot, message) {
    controller.storage.channels.get(strage_file_name, function(err, data) {
        var argument = message.match[1];
        var argument_split = argument.split(" ");
        if (!data) {
            data = {id: strage_file_name};
        }
        data[argument_split[0]] = argument_split[1];
 
        controller.storage.channels.save(data, function(err, id) {
            bot.reply(message, 'Got it. I set key "' + argument_split[0] + '" to ' + argument_split[1]);
        });
    });
});

controller.hears(['get (.*)'], 'ambient ', function(bot, message) {
    var argument = message.match[1];
    var argument_split = argument.split(" ");
    controller.storage.channels.get(strage_file_name, function(err, data) {
        if (data && data[argument_split[0]]) {
            bot.reply(message, argument_split[0] + ' is ' + data[argument_split[0]]);
        } else {
            bot.reply(message, 'ummm...."' + argument_split[0] + '" is undefined');
        }
    });
});

```

botの監視対象をambient（全投稿）にしておくとメンションつけなくていいから楽

# botの起動方法
```
token=${your-api-token} node index.js
```
${your-api-token}はSlackでbot作成したときに表示されたものをセットしてください
これで、botが起動し、Slack上でも在籍になります。


# 上記コードによるbotの動き
## set
- 「set name John」と投稿
  - setting.jsonに{"name":"John"}をセットする
- 「set birthday 0327」と投稿
  - setting.jsonに{"birthday":"0327"}をセットする
- 「set name Jamas」と投稿
  - setting.jsonの{"name":"John"}に上書きで{"name":"Jamas"}をセットする

## get
- 「get name」と投稿
  - "name is Jamas"が返ってくる
- 「get birthday 」と投稿
  - "birthday is 0327"が返ってくる

# 総評
設定ファイルなどに対してのアクションを紐づけておけば（良いか悪いかはおいておいて）
サーバ管理をslack経由でやることも簡単そうですね。
基本的には運用上支障の出ないデータ集計や、調査系のコマンドに紐づけておいてもいいかも。

# 参考サイト
[さすがBotkit……！Slack botにデータを持たせる方法 – Storage –](https://clickan.click/botkit-storage/)
競馬予想ＡＩ作成～もくじ～

# **この投稿について**
業務命令でディープラーニングについて調べさせられている私（ヨギーエンジニア）が
どうせなら金儲けしたいと、競馬予想ＡＩをpythonで作る過程を示すものです。
月一くらいでホソボソと投稿して半年で形にしたいと思います。

有名な下記のコンテンツを参考に作成します。

>**本**
1. ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
2. ゼロから作るDeep Learning② 自然言語処理編
**ウェブ**
1. courseraのmachine learning by Andrew Ng
2. tensorflow公式サイト(https://www.tensorflow.org/)

:eye:ちなみにやる気を出すために過去の競馬結果のデータセットを購入しました。
:eye:ヨギーエンジニアとはヨガを極めたエンジニアのことをいいます。
# **ロードマップ**
[**第1回：線形回帰とロジスティック回帰**](https://qiita.com/gusaku/items/2841c6bb612f3924f6ae)
⇒やはり原理を分かっていないとブラックボックスのまま動かして終わってしまうので。。。

[**第2回：ニューラルネットワーク概要①**](https://qiita.com/gusaku/items/b7db937140f8f954e80f)
⇒機械学習における学習を定義し、ニューラルネットワークでの学習を学びます。

[**第3回：ニューラルネットワーク概要②**](https://qiita.com/gusaku/items/4f3983f2eb951b1bde61)
⇒ニューラルネットワークの仕組みを丁寧に解説します。実装への架け橋です。

**第4回：ニューラルネットワーク実装**
⇒なにやってんだ？行列とベクトルの操作がわけわからん人にもわかりやすく実装できるようにします。

**第5回：TensorFlow**
⇒the ブラックボックス！TensorFlowに慣れます

**第6回：競馬予想ＡＩの設計**
⇒インタフェースとかデータ構造とか。遡って変更される可能性大

**第7回：競馬予想ＡＩの製造**
⇒IDEはeclipseを利用する。理由としてはみんな経験あるだろうしとっつきやすいであろうため

**第8回：競馬予想ＡＩの改良**
⇒実際に動かして改良していく。いろんな改良アプローチを試す
# **理念**
ディープラーニングは英語文献が多く、日本語で分かりやすく書かれたまとめがなくて
困ったのでそんな人たちのためになるものが投稿できればいいなあと思っています。
なるべく行間を省かずにまとめていきたいと思います。どうぞよろしく。

追記：
第3回記事を投稿しました。
第4回は9/15投稿予定
Alibaba Cloud の Elastic IP について


## 概要
- ECS に Elastic IP を割り当て、インターネットとの通信ができる
- Elastic IP は柔軟に解除・割当が出来る
- 従量課金となる
  - ネットワークトラフィック使用量に応じて、時間ごとに請求される
- 利用可能な帯域幅 1〜200Mbps


購入画面

<img width="936" alt="スクリーンショット 2018-03-27 20.49.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/e47b816d-0954-1eb7-5cef-2cc275eb483d.png">

## 料金計算方法

```
合計料金 = (Elastic IP アドレス保持料金)　+　(トラフィック料金)
```

- Alibaba Cloud の Elastic IP は保持料金が発生する
- AWS の EIP は EC2 へ割り当てていれば保持料金は発生しないが、Alibaba Cloud の場合は発生するので注意。
- 保持料金は東京リージョンで 0.48円/時間 （2018.3.27現在）
  - 0.48*24*30 = 345.6円/月
SQL Server ストアドプロシージャの書き方

# SQL Server ストアドプロシージャの書き方

DBの値を加工するロジックについて、webアプリとデスクトップアプリの両方で必要となった。それぞれのプログラムで実装するよりも、一つのロジックを利用する方が保守性がよいため、ストアドプロシージャを使うことにした。
ストアドプロシージャは特殊な用途において強力な反面、使う機会が少ないため書き方をすぐに忘れてしまう。
そこで、書き方のポイントを記事にしておく。
## 環境
WIndow 10 64bit
SQL Server 2016(SP1)
SQL Server 2016 Management Studio
##ストアドの作成方法
SQL Server Management Studioのオブジェクトエクスプローラーからデータベースを選択してから「新しいクエリ」をクリックし、入力ウィンドウを開く。以下のような空のCREATE文を書き、Testという名前のプロシージャを作る。

```SQLQuery1.sql
CREATE PROCEDURE [dbo].[Test]


AS

RETURN
```

メニュー -> クエリ -> 実行 でストアドプロシージャが作成され、データベースに登録される。
## ストアドの修正方法
メニュー -> データベース -> プログラミング -> ストアドプロシージャ から既存のストアドを探して右クリック -> 変更をクリックする。見付からない場合は、右クリック -> 最新の情報に更新 をクリックするか、F5キーを押す。
![sutoado3PNG.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/9471c68c-f4ef-11b8-3a69-feec23334dfb.png)

変更をクリックすると、以下のようにALTER文が開かれる。修正を加えたら、メニュー -> クエリ -> 実行 でALTER文が実行され、ストアドの内容が更新される。

```SQLQuery1.sql
USE [ProductMng]
GO
/****** Object:  StoredProcedure [dbo].[Test]    Script Date: 2018/03/27 17:40:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Test]
	@INPUT_STR VARCHAR,
	@INPUT_INT INT
AS
DECLARE @TMP_DATE DATETIME
DECLARE @TMP_INT INT

SET @TMP_INT = @INPUT_INT + 1
	
SELECT @TMP_DATE, @TMP_INT, TestData FROM TestTable;
```

## パラメタの渡し方
ALTER文の下の2行がパラメタ。一つ目はINPUT_STRがパラメタ名で、VARCHARは可変長文字列型であることを表している。二つ目はINPUT_INTがパラメタ名で、INTは数値型を表す。もっと増やしたいときは、カンマで区切って行を追加するとよい。AS句以降でアットマーク+パラメタ名で変数として使える。
## 変数の使い方
DECLARE文の下の2行で宣言しているのが変数。一つ目はTMP_DATEが変数名で、DATETIMEは日付型を示す。二つ目はTMP_INTが変数名で、INTは数値型を示す。その下のSET文のように、値を代入できる。
## プログラムからの呼び出し方
### Transact-SQL
Management Studio からSQLを使って呼び出すには、「新しいクエリ」を開き、データベースを選択してから以下のようにEXEC文、半角スペース、一つ目のパラメタ、カンマ、二つ目のパラメタ というふうに書いて実行する。

```SQLQuery1.sql
EXEC Test 'mojiretsu', 26
```


実行結果はこんな感じ。
![sutoado4.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/3aae3689-c769-3a17-ca47-8caf4a6ae5f7.png)
取得できた行の値のうち、一番目の列はNULLとなった。これは変数に値を入れていないため。二番目の列は、パラメタとして渡した26に、ストアドによって+1された値が返された。三番目はデータベースに格納されていたTestDataというデータの値。
### Python
言語にかかわらず、上記と同様の命令文を呼び出す側のプログラムで書けばよい。例としてPythonでは以下のように実装する。

```test.py
import pyodbc

def GetTestData(str_param = "mojiretsu", int_param = 26):
    cnxn = pyodbc.connect(connectionString)
    cursor = cnxn.cursor()
    qry = "EXEC Test '" + str_param + "', " + str(int_param)
    cursor.execute(qry)
    row = cursor.fetchone()

```

## ストアドをステップ実行する方法

SQL Server Management Studioでステップ実行してデバッグができる。方法は以下を参照。

[Qiita SQLServerでスクリプトのデバッグを行う](https://qiita.com/mima_ita/items/a8f8dc3c5d212f2f3b31)
[VirtualBox] Windowsから、UbuntuにSSH接続する方法

## やりたいこと
Windows 10 の VirtualBox 上で Ubuntu Server を動かし ssh で接続したい。
<font color="Red">
(以下はポートフォワーディングを行う場合です。
VMのネットワークアダプタに、デフォルトのNATとは別にもう一つ、Host-only Adapterを追加設定することにより、ポートフォワーディングせずにホストからゲストへ直接接続することもできます。)
[参考 : VirtualBox上のUbuntuにSSHで接続するための設定](http://smys0515.hatenablog.com/entry/2016/02/29/080000)
</font>
## 前提
Ubuntu 側の SSL の設定が完了している。(openssh-serverなど)
Windows側で SSL が使用できる。(Tera Termなど)


## 設定
VirtualBox Manager から対象のVMを選択し、
メニューの [Settings -> Network] を選択すると、
NATが選択されているアダプタが見つかる。
[Advaned] のメニューに [Port Forwading] ボタンがあるので、
押下し、以下のような設定を追加する。

```Name : ssh
Protocol: TCP
Host port : 3022
Guest port : 22
```
![qiita-vm-settingpng.png](https://qiita-image-store.s3.amazonaws.com/0/169765/d80b2baf-3fb5-a0e0-e75b-83c22d13a6c0.png)


## 接続
Tera Termなどのソフト、または、コマンドでポートを指定し、ホストに接続する。

```コマンド例
ssh -p 3022 user名@127.0.0.1 
```
![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/169765/75842976-f58b-aa89-4af4-a8c7102c6d3e.png)

以上。


## 参考
[How to SSH to a VirtualBox guest externally through a host?
](https://stackoverflow.com/questions/5906441/how-to-ssh-to-a-virtualbox-guest-externally-through-a-host)
Alibaba Cloud ECS のパブリックIPについて

ECS インスタンスがインターネットへ接続したい場合、以下のいずれかの構成を取る必要がある

- インスタンスがパブリック IP を持つ
- インスタンスがパブリック IP を持たない場合、インスタンスへ Elastic IP を割り当てる
- インスタンスがパブリック IP を持たない場合、NAT Gateway を使用する


## パブリック IP の割り当て方法
- インスタンスへのパブリック IP の割り当ては、インスタンスを作成時に指定する
<img width="1243" alt="スクリーンショット 2018-03-27 14.43.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/a1b8faab-f991-a4c7-bfed-155829cdb5c4.png">


- この 5 Mbps の帯域幅とは、アウトバウンドの速度が 5 Mbps であることを意味する
- アウトバウンド帯域幅
  - 最高速度は 100 Mbps
  - e.g. ECS インスタンスからダウンロード
  - チケットを起票し、200 Mbps に引き上げ可能
- インバウンド帯域幅
  - 最高速度は 200 Mbps
  - e.g. ECS インスタンスへアップロード
  - 帯域引き上げ不可


## 料金について
- パブリックネットワークトラフィックは課金対象になる
- Alibaba Cloud が料金を請求するのは、アウトバウンドトラフィック使用量に対してのみ
- トラフィック量の突発的な急増による高額請求を回避するために、インスタンスを作成するときにアウトバウンド帯域幅のピーク値を設定することができる
Ionic3に入門してみる～その2 ドキュメント②～

# ドキュメント
本記事ではざっくりドキュメントを読みます。

## コンポーネント
コンポーネント=構成要素
要するに画面を構成する部品のこと。
ドキュメントでは下記について記載されています。
ものすごく多いですが、スマホやパソコンを使っていれば初見のコンポーネントというのはほぼないと思います。
また元ページを開くとイメージが横に出るので、参考にしてみてください。
https://ionicframework.com/docs/components/
cordovaだとCSSでどうにかしないといけない部分なので、だいぶ楽になりそうです。

* アクションシート
* アラート
* バッジ
* ボタン
* カード
* チェックボックス
* datetime(日付時刻)
* FAB(浮動アクションボタン)
* ジェスチャー
* グリッド
* アイコン
* 入力
* リスト
* 読み込み中
* メニュー
* モーダル(modal window)
* ナビゲーション
* ポップオーバー
* ラジオ
* range(範囲)
* 検索バー
* セグメント
* select(セレクト)
* スライド
* タブ
* トースト
* トグル
* ツールバー

## APIリファレンス
2018年3月27日現在の最新は3.9.2
https://ionicframework.com/docs/api/
上記のコンポーネントの詳細もこちらで確認できる。

## ネイティブ
cordovaで言うところのプラグインの部分。
IonicでもCLIからプラグイン追加を行って追加する。
例えばカメラ機能はこれ。
https://ionicframework.com/docs/native/camera/
有料、もしくは有料になるかもしれない機能は有料と表示されるようです。

## ストレージ
SQLiteを内部的に使用しているので、CordovaのSQLiteプラグインは必須のようです。
Cordovaだと自分でストレージの方法を決められたような気もしますが、Ionic上では勝手に優先順位を決めてくれるそうです。

下記ページなども参照。
https://qiita.com/noanoamn/items/ca849856de341bb3b8a6
http://ionic.keicode.com/native/storage-1.php

## Sassってなんぞや
https://ionicframework.com/docs/developer-resources/what-is/#sass
SassはCSSと似ていますが、変数、ミックスイン、forループなどの追加機能があります。
細かい書き方はドキュメントを参照すべきですが、CSSさえ書けるのであればそれほど面倒な書き方ではなさそうです。

## アイコン
どう発音するんだかわからないんですがionicで使用できるアイコンのことです。
https://ionicframework.com/docs/ionicons/
イオンアイコンズ？

## CLIコマンドリスト
https://ionicframework.com/docs/cli/commands.html
もちろんionic --helpでも見ることはできるが、ドキュメント曰く「ヘルプコマンドから見るよりも、整理された正確なコマンド」らしい。

CLI自体の設定を変更することもできる。
その場合はこちら。
https://ionicframework.com/docs/cli/configuring.html

## WKWebView
Androidの人は関係なし。以下ざっくりと解説。
https://ionicframework.com/docs/wkwebview/
iOSではUIWebViewとWKWebViewの2つのWebviewが数年前からある。
IonicアプリはUIWebViewを使用していましたが、WKWebviewをデフォルトで使用するようになりました。
WKWebviewはUIWebViewよりも多くの機能を備えているため、最高の選択肢だと思っています。

* JITコードをJSコードからマシンコードに変換します。これは高速に動作します。
* レンダリングパフォーマンスの改善
* 少ないメモリ消費量
* Web標準へのより良い準拠
* 信頼できるスクロールイベント（仮想リストにとって重要）

以上でドキュメント斜め読み終わり。
Bitbucket Pipelines を使ってリポジトリのマージ済みブランチを定期削除

## 前提

### Bitbucket Pipelines とは

Bitbucket 向けの CI/CD のための機能。

https://ja.atlassian.com/software/bitbucket/features/pipelines

リポジトリへのコードの push などをトリガとして、docker コンテナ上でスクリプトを実行できる。

### マージ済みリモートブランチを一括削除するコマンド

```bash
git branch -r --merged origin/master | grep -v master | grep -v release | sed -e "s% *origin/%%" | xargs --no-run-if-empty -Ibranch git push origin :branch
```

※`grep -v` のところは各プロジェクトに合わせて、削除したくないブランチを指定すること

参考：[Gitでリモートのマージ済みのブランチを一括削除する@fukayatsu](https://qiita.com/fukayatsu/items/b1a5e1c0b98acaa6261d)

## 設定手順

### Pipelines 用の SSH 鍵を設定

リポジトリのページの `設定 > PIPELINES > SSH Keys` から秘密鍵・公開鍵のペアを登録。

![add-ssh-keys.png](https://qiita-image-store.s3.amazonaws.com/0/49690/d1ab379e-6a11-f068-d921-f8c1271846ae.png)

「Generate keys」で作成した鍵ペアの公開鍵をチームに登録できればベスト。

それができなければ自分のアカウントに登録する（自分のアカウントでの操作になるので注意）。

### Pipeline を登録

アプリケーションルートに `bitbucket-piepelines.yml` というファイルを以下の内容で作成（すでに存在する場合は編集して設定を追加）。

```yaml:bitbucket-pipelines.yml
pipelines:
  custom:
    prune-branches: # 自由に設定可（表示用の名前）
      - step:
          image: alpine/git
          script:
            - git fetch
            - git branch -r --merged origin/master | grep -v master | grep -v release | sed -e "s% *origin/%%" | xargs --no-run-if-empty -Ibranch git push origin :branch
        
```

ここまでで、手動実行ができるようになる。

ブランチの「Run pipeline for a branch」またはコミットの「Run pipeline」からをクリックすると以下のようなモーダルウィンドウが開くので、「Run」をクリックすると Pipeline が実行開始される。

![run-pipeline.png](https://qiita-image-store.s3.amazonaws.com/0/49690/81524ba2-cc44-ca64-79d3-2fbbc780dc9e.png)

![pipeline-result.png](https://qiita-image-store.s3.amazonaws.com/0/49690/726ed710-91ff-c0f1-0e86-ef22cade0858.png)

### Pipeline 実行スケジュール設定

下記ページ（公式ドキュメント）の「2. Create a schedule」に従って設定。

https://confluence.atlassian.com/bitbucket/scheduled-pipelines-933078702.html


リポジトリのページの「Pipelines」より`Schedules > New schedule`を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49690/e247997a-7498-63c1-a019-bbce27014049.png)

ブランチ（※）と、先程登録した Pipeline、実行時間を選択して「Create」をクリックすれば登録完了。

※今回の Pipeline は実行内容がブランチに依存しないので、どれでもよい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49690/2b89306f-14fa-e109-f931-1481575775da.png)

登録済みのものは画面上で確認することができる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49690/a99636d8-0a9d-4400-d608-fcb35cabe87d.png)
Supreme 購入ページのブックマークレット

最近実店舗では物騒な話が多く、徹夜で並ぶのも厳しいです。
Webサイトでは毎週土曜日の11時に新アイテムが並びますが、サイト自体も過負荷で重たくなり、欲しいアイテムをカートに入れて、住所を入れている間に sold out となってしまいます。

そこで購入ページの入力を迅速に済ますためブックマークレットを作成しました。

``` javascript
javascript:(function(){
  document.getElementById("credit_card_last_name").value = "[苗字]";
  document.getElementById("credit_card_first_name").value = "[名前]";
  document.getElementById("order_email").value = "[Eメール]";
  document.getElementById("order_tel").value = "[電話番号]";
  document.getElementById("order_billing_state").value = " 山形県";
  document.getElementById("order_billing_city").value = " 山形県";
  document.getElementById("order_billing_address").value = " 山形県";
  document.getElementById("order_billing_zip").value = "000-0000";
  document.getElementById("credit_card_type").value = "american_express";
  document.getElementById("cnb").value = "1234 5678 9012 3456";
  document.getElementById("credit_card_month").value = "09";
  document.getElementById("credit_card_year").value = "2020";
  document.getElementById("vval").value = "222";
  document.getElementById("order_terms").checked = true ;
})();
```
欲しいアイテムをカートに入れて、購入手続きボタンをクリックするところまでは自力で頑張ります。サイトではjqueryも読み込まれていましたが、Vanilla JS を利用しています。

選択式の項目（order_billing_state, credit_card_type）は以下から指定します。

### order_billing_state
最初に何故か半角スペースが入ってました。

" 北海道"," 青森県"," 岩手県"," 宮城県"," 秋田県"," 山形県"," 福島県"," 茨城県"," 栃木県"," 群馬県"," 埼玉県"," 千葉県"," 東京都"," 神奈川県"," 新潟県"," 富山県"," 石川県"," 福井県"," 山梨県"," 長野県"," 岐阜県"," 静岡県"," 愛知県"," 三重県"," 滋賀県"," 京都府"," 大阪府"," 兵庫県"," 奈良県"," 和歌山県"," 鳥取県"," 島根県"," 岡山県"," 広島県"," 山口県"," 徳島県"," 香川県"," 愛媛県"," 高知県"," 福岡県"," 佐賀県"," 長崎県"," 熊本県"," 大分県"," 宮崎県"," 鹿児島県"," 沖縄県",

### credit_card_type
以下の4種類から指定が可能です。

visa, american_express, master, jcb, cod

### ブックマークに登録

自分の情報に差し替えたら、以下の様に余計改行を消します。

``` javascript
javascript:(function(){document.getElementById("credit_card_last_name").value = "[苗字]";document.getElementById("credit_card_first_name").value = "[名前]";document.getElementById("order_email").value = "[Eメール]";document.getElementById("order_tel").value = "[電話番号]";document.getElementById("order_billing_state").value = " 山形県";document.getElementById("order_billing_city").value = " 山形県";document.getElementById("order_billing_address").value = " 山形県";document.getElementById("order_billing_zip").value = "000-0000";document.getElementById("credit_card_type").value = "american_express";document.getElementById("cnb").value = "1234 5678 9012 3456";document.getElementById("credit_card_month").value = "09";document.getElementById("credit_card_year").value = "2020";document.getElementById("vval").value = "222";document.getElementById("order_terms").checked = true ;})();
```

これをブックマークにセット（chromeならブックマークマネージャーから）して、購入ページでブックマークをクリックすれば情報が一瞬で入力されます。

そろそろシーズン終わりで、サイト上のShopはクローズとなりますが、予定がある方は試してみてください。

ただし、ご利用は自己責任でお願いします:bow:
Amazone linux にwgetでinstallしたcertbot-auto が動かなくなったときの対応

# なにがおきたの？

Amazone linux にwgetでinstallしたcertbot-auto が以下のようなエラーを発生するようになってました

```
$ certbot-auto --help
Requesting to rerun /usr/local/bin/certbot-auto with root privileges...
Upgrading certbot-auto 0.22.0 to 0.22.2...
Replacing certbot-auto...
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Traceback (most recent call last):
  File "/opt/eff.org/certbot/venv/bin/letsencrypt", line 7, in <module>
    from certbot.main import main
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/certbot/main.py", line 10, in <module>
    import josepy as jose
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/__init__.py", line 41, in <module>
    from josepy.interfaces import JSONDeSerializable
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/interfaces.py", line 8, in <module>
    from josepy import errors, util
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/util.py", line 4, in <module>
    import OpenSSL
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/rand.py", line 12, in <module>
    from OpenSSL._util import (
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/_util.py", line 6, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
ImportError: No module named cryptography.hazmat.bindings.openssl.binding

```

# TL;DR;

cryptographyも必要だけど、すなおにpipで入れなおしましょう


# 環境


```
$ cat /etc/system-release
Amazon Linux AMI release 2016.03
```

wgetで `/usr/local/bin/` に `certbot-auto` をインストールしてました


# やったこと

```
sudo rm /usr/local/bin/certbot-auto
sudo /usr/local/bin/pip install cryptography
sudo /usr/local/bin/pip install certbot
```
おわり

# 参考

https://github.com/certbot/certbot/issues/1680#issuecomment-358728515
RapidSSL の SSL 証明書を再発行してみる

# ０．はじめに

「そろそろ SSL 証明書更新しないと、ブラウザに怒られちゃうぞ。」
と、色んなところから言われ始めたのでやります。

# １．CSR の作成

こちらのツールを使います。

* [Rapid\-SSL\.jp 秘密鍵＆CSR\(証明書署名要求\)作成ツール2048ビット対応版](https://securitycenter.rapid-ssl.jp/tools/makePkeyCsr2048SHA2.php)
    * 以下の記載がありましたので、ご注意を。
        * <font color="red">IISサーバ及び一部サーバ管理業者様によっては以下のツールで生成された秘密鍵及びCSRが使用できません。
外部で作成した秘密鍵・CSRが使用できることをご確認の上ご利用下さい</font>
    * ということなので、ツールを使わない場合は、以下のページが参考になるかと。
        * [OnlineSSL CSRの生成方法（No\.2）](https://www.onlinessl.jp/support/starterssl_csr.html)

1. 以下の項目を設定し、「作成」ボタンを押下します。
    * 秘密鍵のパスワード : ※任意
    * コモンネーム(Common Name) : ※任意 (EX:*.kusokamayarou.com)
    * 正式英語組織名(Organization Name) : ※任意 (ex:KUSOKAMAYAROU. CO., LTD.)
    * 部門名(Organizational Unit) : ※任意 (ex:SSL)
    * 市区町村名(Locality) : ※任意 (ex:Kagoshima)
    * 都道府県名(State or Province) : ※任意 (ex:Kagoshima)
    * 国名(Country) : 日本
<br><br>
    * ![0001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/59a8581a-91bd-30fb-864b-f15db6ee241d.png)
<br><br>
1. 作成された「秘密鍵」と「CSR」をコピーして、保存します。
    * ![0002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c9114436-e1a4-001f-e73c-745fa07e3eee.png)

# ２．SSL 証明書の再発行

1. 以下のページを開き、以下の項目を設定し、「ステータス確認」ボタンを押下します。
    * [SSL サーバ証明書 RapidSSL RapidSSLワイルドカード サポートページ](https://securitycenter.rapid-ssl.jp/rapidssl-support/ssl-support.htm)
<br><br>
    * お申込番号
    * パスワード
<br><br>
    * ![1001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/bf63a416-aab4-8da3-d55c-5b8ed51ffd12.png)
<br><br>
1. 証明書ステータスのページが表示されるので、「再発行(Reissue)」ボタンを押下します。
    * ![1002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/e3d0372f-4ee5-7157-ab53-8250a6a8b66f.png)
<br><br>
1. 再発行のページが表示されるので、新しい CSR を貼り付けて、「CSR内容確認」ボタンを押下します。
    * ![1003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/5a015e60-b3e9-20b0-4ef4-8264f0db4c00.png)
<br><br>
1. CSR の内容確認のページが表示されるので、内容を確認し、「上記内容で再発行する」ボタンを押下します。
    * ![1004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c1fa4219-02ee-66b4-00b3-cd519e2beeae.png)
<br><br>
1. しばらくすると、「あなたのドメインの所有権を確認してください」のメールが送られてくるので、記載されている通りに承認のリンクをクリックします。
    * ![2001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/b29c67a6-29ab-b956-2125-c216912191f2.png)
<br><br>
1. 証明書の発行要求の承認ページが表示されるので、内容を確認し、「承認する」ボタンを押下します。
    * ![2002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/4995e98e-ffa4-842f-45a1-fb6d1651a697.png)
<br><br>
1. 証明書の発行要求の承認確認ページが表示されるので、ページを閉じます。
    * ![2003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/15fdb53d-4fb2-d4a5-b0eb-158627214c09.png)
<br><br>
1. しばらくすると、「【通知】 SSL サーバ証明書発行完了のお知らせ」のメールが送られ、証明書が再発行されます。
    * ![2004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/de9e3777-1d7a-6d62-d756-f907f62a70df.png)

# ９９．ハマりポイント

* 特にハマったところは無かったです。ただ、画像編集がなかなか面倒でした…。

# ＸＸ．まとめ

* ※おまけ
    * [【SSL】秘密鍵のパスフレーズを解除する at softelメモ](https://www.softel.co.jp/blogs/tech/archives/5056)
    * [Check SSL Certificate \| Test SSL Certificate: Site24x7 Tools](https://www.site24x7.com/ssl-certificate.html)