OmniAICreator/Qiita-1.07M huggingface dataset:
不良解析のデータベースを作る

とある商品開発部門にいる

測定結果を吐き出す装置から、2種類のデータが出てくる

ひとつは直流抵抗を測るもの　→　サンプルのバーコード、G/NGモードなどの結果　→　CSV

もうひとつはSパラメータ　→　サンプルのバーコード、G/NGモード、Sパラ波形（数値データ）→　csv



処理としてはSパラメータはグラフ化するためのアプリをワンクッションかます・・・　jpgの吐き出し



次にバーコードでデータベースに挿入する。

このとき、データベースは都合上、ｍｙｓｑｌにする。


ｍｙｓｑｌへの書き込み手法としては、

１）WEBアプリ立ち上げ
２）html+phpでデータを読み込む
３）phpでmysqlに書き込む
４）データベースへの問い合わせも、もちろんPHPで

・・・でも、PHP使ったことがない

将来的には、ruby＋rail、django＋python、javaなんてのもありうる。。。

どれが一番簡単に開発ができるか思案して、
結局xamppを入れようかなと思っている。

しかしPHPのデバッグはどうやってやるんだろう？
どっちかというと、pythonのようにスクリプトで開発したい気もする。

phpって、スクリプト言語なのかな？

# AI comment

不良解析のデータベースを構築するプロジェクト、頑張ってください。

PHPは、スクリプト言語であり、HTMLやCSSと連携してWebアプリケーションを開発するのに適しています。デバッグは、phpinfo()関数を使って、変数の中身やエラーメッセージを確認することができます。また、Xdebugという拡張モジュールを使えば、ステップ実行やブレークポイントの設定など、より高度なデバッグが可能になります。

PHPでスクリプトを開発するには、いくつかの方法があります。

コマンドラインからphpを実行して、スクリプトを実行する
Webブラウザからスクリプトを実行する
テキストエディタでスクリプトを作成し、サーバーにアップロードする
Webアプリケーションを開発する場合は、Webサーバー上にPHPをインストールする必要があります。XAMPPは、PHPやMySQL、ApacheなどのWeb開発に必要なソフトウェアをパッケージ化したもので、簡単にWebアプリケーションを開発することができます。

貴ブログで紹介されているデータベースへの書き込み手法は、一般的なものだと思います。HTMLとPHPを組み合わせて、フォームやボタンなどのUI要素を作成して、ユーザーからデータを入力してもらいます。入力されたデータは、PHPのコードを使ってMySQLに書き込まれます。

Sパラメータのグラフ化については、SVGやPDFなどの画像形式で出力すると、ブラウザで表示したり、印刷したりすることができます。

以下に、具体的なアドバイスをいくつか挙げます。

データベースの設計は、データの整合性や運用のしやすさを考慮して、慎重に行う必要があります。
データの入力画面は、ユーザーが入力しやすいように、わかりやすく設計しましょう。
データベースへの書き込みは、エラーが起きないように、適切なチェックを行う必要があります。
貴ブログで紹介されているプロジェクトが、成功することを願っています。
Layoutをいじっただけor今まで動いてたのにClassCastExceptionが出て困っている方々へ

何気ない、Androidではよく書くこんな記述。

        _checkbutton = (CheckBox) findViewById(R.id.checkbutton);
        _checkbutton.setChecked(true);

自分の場合は、CheckBoxだけじゃなくLinerLayoutのVisibleを変更させるだけのためにキャストなど
動いていたものが突然ClassCastExceptionを吐いて動かなくパターンなのですが
しかもonCreate()で・・

こういうパターンでClassCastExceptionを吐くなら

        LinearLayout mLinearLayout_main = (LinearLayout) findViewById(R.id.linearLayout_main);
        mLinearLayout_main.setVisibility(View.VISIBLE);

Castしなきゃいんだろ！と怒りながら

        findViewById(R.id.linearLayout_main).setVisibility(View.VISIBLE);

と書き換えますが、
CheckBoxのsetCheckedとかはCastしてからじゃないと扱えない・・

ちまちまLayoutをいじってると治ったり、
1dpなLinerLayoutを挿入して騙し騙し動かしてたのですが、
それでもまた動かなくなることが有って散々悩んでいた・・・
ふとおもって対応したのが以下のようなコード

        findViewById(R.id.checkbutton).post(new Runnable() {
            @Override
            public void run() {
                _checkbutton = (CheckBox) findViewById(R.id.checkbutton);
                _checkbutton.setChecked(true);
            }
        });

俗に言うUIスレッド云々かもですね
今のところこういう書き方にした所ClassCastExceptionは吐かなくなってます
悩んでる方お試しを・・


つーか、キャスト連発させるのって何なんでしょうね？
高度な継承

#abstractの考え方
例えば「人間」というクラス（食べる、歩く、寝る）から、「スポーツマン」・「読書家」というクラスを作る時、「スポーツマン」・「読書家」クラス毎に、継承元である人間クラスの（食べる、寝る）の量がそれぞれ違う。（スポーツマンは読書家よりたくさん食べ、読書家は夜更かしして、疲れてよく寝るスポーツマンより寝る量が少ないという事にして下さい　笑）
この場合、人間クラスでは（食べる、寝る）について詳細を定義出来ない。
しかし、人間は「スポーツマン」「読書家」に関わらず、必ず（食べる、歩く、寝る）という行為をする。
オブジェクト指向で考えれば、人間クラスで行う事は人間クラスに必ず記載しなければならない。
そのための機能。

##曖昧なメソッドを定義する方法①

上記例でいう、（食べる、寝る） は、詳細が定義出来ないメソッドのため、メソッド作成時に`abstract`をつける事で、不完全なメソッドである事を定義出来る。

```java
//メソッドの定義
アクセス修飾子 abstract 戻り値　メソッド名（引数）；
```
`abstracrt`でメソッドを宣言する事で曖昧なクラスのメソッドを定義し、以下の効果を得られる。

###効果
・オーバーライドして、実装しないとエラーが発生するため、オーバーライドし忘れを防ぐ※曖昧なままインスタンス化されない
・定義出来ないのか、「何もしない」という定義なのか区別がつく

##曖昧なクラスを定義する方法②

同じ様に上記の「人間」クラスの様に、曖昧なメソッドを持つクラスを定義する方法は、以下の通り。

```java
//クラスの定義
アクセス修飾子 abstract class 戻り値　クラス名（引数）；
```
###ルール
１つでも、曖昧なメソッドをもつクラスは必ず`abstract`をつける必要がある。

###効果
・インスタンスとして生成出来ないため、誤ってインスタンス化されることを防ぐ

#インターフェースについて

##ルール
・全てのメソッドが`abstract`を使用した抽象メソッド

##作成方法

```java
アクセス修飾子 interface インターフェース名（引数）；
```
##継承方法
```java
アクセス修飾子 class クラス名 implements 親インターフェース名{
}
```
imprement = 実装するという意味

##インターフェースを使用するメリット
インターフェースをimplementする事で、メソッドの実装が強制され、少なくともそのインターフェースを持っているメンバは保有する事が保証される。

##特徴
・インターフェースのメソッドは自動的に**public abstract**が付く
・インターフェースのフィールドは必ず**public static final**が付く
・多重継承が可能※詳細は下記に記載
　
##多重継承について
　ーーーーーーーーーーーーーーーーー（困った例）ーーーーーーーーーーーーーーー
・人間クラス
「移動メソッド」歩いて移動

・悪魔クラス
「移動メソッド」飛んで移動
　
↓多重継承して、デビルマンを生成！

・デビルマンクラス
![hqdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/229025/344a95b1-d1ab-766d-bace-9790b9f501b7.jpeg)

「移動メソッド」どっちを継承すれば・・・？？？
　
　ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


　ーーーーーーーーーーーーー　（インターフェースなら）ーーーーーーーーーーーーー
・人間インターフェース
「移動メソッド」未実装
・デビルインターフェース
「移動メソッド」未実装

↓多重継承して、デビルマンを生成！

・デビルマンクラス
![story_img_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/229025/6d486a82-c300-3e22-40f8-fe058470e7d7.jpeg)


「移動メソッド」実装：飛んで移動

　ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

要するに、、、`移動`の様なメソッドはいろんなクラスが持つ可能性があるため、実装が衝突してしまう恐れがある。
しかし、インターフェースの場合、実装されていないため、メソッドが被っても子インターフェースで実装するため衝突しない。そのため、**インターフェースは多重継承が可能。**

##多重継承の方法

```java
アクセス修飾子 class クラス名 implements 親インターフェース名1,親インターフェース名2・・・{
}
```
##extend implementsを同時に使う場合
```java
アクセス修飾子 class クラス名 extends 親クラス名 implements 親インターフェース名1,親インターフェース名2・・・{
}

```



#extend implementsの使い方まとめ
| 継承元 　　　　　　　　　　　| 継承先 　　　　　　　| 継承に使用するワード    | 継承元の数 　　|
|:----------------|:-------------------|:---------------------|:---------------------|
|クラス|クラス|extend|1|
|インターフェース|クラス|implement|1つ以上|
|インターフェース|インターフェース|extend|1つ以上|
OCRAを使ってRubyスクリプトを実行ファイル（.exe）に変換して配布する

RubyスクリプトをWindowsの実行ファイル（バイナリ）として配布することが簡単にできました！

せっかく作ったプログラムをみんなに使ってもらいたいですよね？
大好きなRubyで作ったプログラムは、これまでRubyインタプリタをセットアップしている人にしか使ってもらうことができませんでした。これは非常に残念なことです。

Ruby1.8以前は[Exerb](http://exerb.osdn.jp/)による実行ファイル（.exe）生成が主流でしたが、Ruby1.9以降Exerbは動作しなくなりました。


そこで登場したのが今回の[OCRA（One-Click Ruby Application）](https://github.com/larsch/ocra)です。本当に簡単に実行ファイルを生成することができました！ご紹介します。

OCRAはRubyスクリプトからWindows実行ファイルを生成します。生成された実行ファイルは、Rubyインタプリタ、ソースコード、その他に必要なRubyライブラリやDLLを含む自己解凍型の自己実行型の実行可能ファイルです。

OCRAは実行時にRubyインタプリタとスクリプトを一時ディレクトリに展開します。アプリケーションのソースファイルは 'src'サブディレクトリに置かれます。コードが見られる可能性があることは覚えておきましょう。



余談ですが、最近は[Neri](https://github.com/nodai2hITC/neri)というのがあるようで今後こちらのほうが主流になっていくのかもしれません。


###前提
* Windows 10 Enterprise
* Ruby 2.3.3p222 （[RailsInstaller](http://railsinstaller.org/en)でインストール）
* Ocra 1.3.10 （Ruby 1.8.7, 1.9.3, 2.0.0、および2.1.5をサポート）

サポート外のRuby2.3.3を使っているのはご愛敬。


##手順

Rubyにパスの通ったコマンドプロンプト（Command Prompt with Ruby and Rails）を起動します。

###インストール

ocraのgemをインストールします。ocraコマンドが使えるようになります。

```shell
gem install ocra -r
```

私の環境ではPROXYサーバを指定しないとインターネット通信ができないため、次のようにPROXyをしてしました。

```shell
gem install ocra -r -p http://my-proxy.local:8080
```

OCRAは、1ファイルのRubyスクリプトです。[ocrasa.rb](https://github.com/larsch/ocra/releases)を入手して使うことも可能です。

gemインストールが完了したら、ocraコマンドの実行を確認しましょう。

```shell
ocra --version
```

###実行ファイル生成

では、いよいよ、Rubyスクリプトから実行ファイルを生成します。
Rubyスクリプトを引数に指定してocraコマンドを実行するだけです。本当に簡単。

注意すべきは、OCRAはRubyスクリプトを静的に解析するのではなく、OCRAはまず、実行時に読み込まれて使用されるファイルを検出するために、対象のRubyスクリプトを実行します。実行による副作用が発生します。外部にアクセスするとかファイルを更新するとか。

次の例では、check.exeが生成されます。

```shell
ocra check.rb
```

ウィンドウアプリケーション（GUIアプリケーション）の場合にコンソールウィンドウがポップアップせずにアプリケーションが起動するようにするには、" --windows "オプションを使用します。

```shell
ocra --windows check.rb
```

実行結果

```shell
=== Loading script to check dependencies
=== Attempting to trigger autoload of Gem::ConfigFile
=== Attempting to trigger autoload of Gem::DependencyList
=== Attempting to trigger autoload of Gem::DependencyResolver
=== Attempting to trigger autoload of Gem::Installer
=== Attempting to trigger autoload of Gem::Licenses
=== Attempting to trigger autoload of Gem::RequestSet
=== Attempting to trigger autoload of Gem::Source
=== Attempting to trigger autoload of Gem::SourceList
=== Attempting to trigger autoload of Gem::SpecFetcher
=== Attempting to trigger autoload of CGI::HtmlExtension
=== Detected gem did_you_mean-1.0.0 (loaded, files)
===     14 files, 32442 bytes
=== Detected gem io-console-0.4.5 (loaded, files)
=== WARNING: Gem io-console-0.4.5 root folder was not found, skipping
=== Including 56 encoding support files (3467776 bytes, use --no-enc to exclude)
```

生成されたcheck.exeは2.75MBでした。


###その他

スクリプトの実行時にKernel＃requireを使用してロードされたコードは、OCRA実行可能ファイルに含まれます。OCRAがスクリプトを呼び出すときにコードが実際に実行されない限り、条件付きでロードされるコードはロードされず、実行可能ファイルに含まれません。

RubyGemsは特別に扱われます。Gemのファイルが検出されるたびに、OCRAはその特定のGemのすべての必要なファイルをインクルードしようとします。この動作は、-gem- *オプションを使用して制御できます。


###参考
* [ocraによるexe化](http://mirichi.github.io/dxruby-doc/tips/ocra.html)
ブラウザのデベロッパーツールみたいにDOMElementのシンボル名を取得したい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/89f48990-9a4a-ee5e-508c-98df06aea994.png)

こういう``<tagName>["#"+id][["."+className][...]]``のようなシンボル名を取得するにはどうしたらいいのか？
結局ググってもわかりませんでした。

```javascript:デバッグ用シンボルID取得関数
function debug_getSymID(obj) {
    if(obj instanceof HTMLElement){
        return obj.tagName.toLowerCase()
        +(obj.id ? "#"+obj.id : "")
        +(obj.className ? obj.className.replace(/^|\s+/g, ".") : "")
    }
    return typeof obj
}
```

うーん。こんな方法で作るしか無いのかな

追記：
＠hoo-chan様　ソースコードについての修正依頼ありがとうございます！
SARファイルをダブルクリックで展開できるようにする。

# はじめに

**注意：本エントリはWindowsレジストリに手を入れます。適用は自己責任でお願いします。**

SAP製品のBASISと呼ばれる領域の仕事をしていると`.SAR`という形式のアーカイブファイルに出会います。
これは`.TAR`ファイル等と同様で複数のファイルを一つのファイルに固めたものになります。

作成、展開は`SAPCAR`というSAP社作成のアーカイブツールを利用します。

その為、「ローカルPCで`.SAR`ファイルを展開したい」となったら

1. コマンドプロンプトを立ち上げる
2. コマンド「SAPCAR -xvf <path_to_sar> -R <path_to_unpackdir>」実行

という手順を行う必要があり、非常に面倒です。

これを`.ZIP`ファイルを展開するかのように、ダブルクリックで展開で来たらうれしいと考え検証しました。

# 環境

```powershell
PS> [System.Environment]::OSVersion

Platform ServicePack Version      VersionString
-------- ----------- -------      -------------
 Win32NT             10.0.14393.0 Microsoft Windows NT 10.0.14393.0
```

# 前提
- ローカルPCに`SAPCAR`が格納されていること。（以下の例では`C:\Windows\System32`に格納しています。）
- レジストリを修正する権限があること。

# 方法

以下のようなレジストリエントリを追加します。

```:sapcarexe.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.SAR]
@="SAR ファイル"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.SAR\shell]
@="open"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.SAR\shell\open]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.SAR\shell\open\command]
@="C:\\Windows\\System32\\SAPCAR.EXE -xvf \"%1\" -R unpack"
```

# 結果
以下のような`HOGE.SAR`ファイルをダブルクリックするとカレントディレクトリに`unpack`というサブディレクトリが作成され、その中にSARファイルの中身が展開されます。

- SARファイル

```
> SAPCAR -tf HOGE.SAR
SAPCAR: processing archive HOGE.SAR (version 2.01)
-rw-------       21527    10 Oct 2017 17:52 hoge.exe
-rw-------        4871    10 Oct 2017 18:48 fuga.exe
```

- 展開結果

| 階層1             | 階層2   | 階層3  |
|:-----------------:|:------:|:------:|
|<任意のディレクトリ>\|HOGE.SAR|        |
|                   |unpack\ |hoge.exe|
|                   |        |fuga.exe|
Cognos で値のプロンプトの背景色・前景色を指定する手順

#概要
Cognos Analytics & BI で値のプロンプトは良く使いますが、無味乾燥な白いデフォルトの見栄えでなく、背景色を付けたいと思った時、普通にやるとうまく行かず、手間取る事があります。
必要になる事は多いと思いますので、手順を投稿しておきます。

**完成イメージ**
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/f1f391b4-eac1-623b-cd24-ce398f530be3.jpeg)

#手順
はじめに。普通はこうやるよね、という手順で、値のプロンプトを選択してプロパティから背景色を変更してみます。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/937527c9-9409-50ff-ceb1-39b8cb1ef01f.jpeg)

レポート実行するとこんな感じ。そんなところ変更したくないよ、という感じです。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/35c0a61a-4019-1e1d-8a78-77b8d312de4a.jpeg)

ではどうするかですが、Cognos Analyticsの場合は、「完全な双方向性で実行」を「いいえ」に指定する必要があります。
その上で、赤枠の「クラス」を選択します。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/79720762-5b3e-79ff-3930-e83337bb16ca.jpeg)

この様な画面になりますので、「プロンプト・コントロールの値ボックス」を選択し、プロパティの「背景色」を指定します。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d506d43b-be61-2b39-6dc2-d98dff4e176f.jpeg)

実行するとできました。ここの色を変えて欲しいのが普通ですよね。
前景色が黒だと見難いので、白に変える場合。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/91f39697-6b19-7e50-1563-2ec32690cfba.jpeg)

なぜか先ほどの「クラス」ではなく、レポートページの方の「値のプロンプト」のプロパティから前景色を指定します。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/b1fda147-c22f-ddd8-1161-315724d3a717.jpeg)

完成です！
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/b69fbe91-59df-ff67-bc63-2f739aaf419e.jpeg)

ご活用下さい。

#参考
**Cognos Styling Prompts**
ftp://public.dhe.ibm.com/software/dw/dm/cognos/reporting/prompts_and_filters/styling_prompts.pdf
WindowsのファイルGrepはサクラエディタを使うと簡単だった

```bash
cd "C:\Program Files (x86)\sakura"
.\sakura.exe -GREPMODE -GFOLDER=R:\bktxt -GKEY="hoge:[1-9]+," -GOPT=SRP
```

正規表現で一致したものを表示するコマンドラインとなっている。

オプションについて詳しくは、[サクラエディタのコマンドラインオプション](http://sakura-editor.sourceforge.net/htmlhelp/HLP000109.html)をみてほしい。

batファイルにでもすれば、ダブルクリックで一気にGrep検索できる。LinuxやMacならこんな苦労は無いのだが、WindowsだとCygwin入れるのもなぁとか思いながら調べたら出来た。

余談だが、個人的にサクラエディタは「魂のエディタ（そうるえでぃたー）」だと思っている。これからもずっと使うと思う（開発的にはVSCODEのほうが良いとか思わなくはないよ。）
Mac に Atom を入れて日本語化する

## インストール
1. [公式サイト](https://atom.io/) に行くと、左側に `Download For Mac` というボタンがあるのでクリックする。<img width="802" alt="スクリーンショット 2018-02-28 17.54.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/71497/52104b45-2ca4-a353-21e1-cbfd0aaf2d23.png">
2. zip ファイルのダウンロードが始まる。
3. ダウンロードが終わったらダブルクリックすると、そのファイルと同じところに `Atom.app` ができてる。
4. アプリケーションフォルダに移動しておく。

## 日本語化
1. アプリを立ち上げる。
2. 警告が出るけどそのまま実行する。
3. ウェルカムガイドが表示される。<img width="1020" alt="スクリーンショット 2018-02-28 18.03.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/71497/742f92d5-65a2-10e1-7b30-a1067f62efc0.png">
4. 右側の `Install a Package` をクリックすると下に広がるので、新たに出て来た `Open Installer` をクリックする。
5. 左側が切り替わる。<img width="464" alt="スクリーンショット 2018-02-28 18.06.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/71497/9f750dfb-93eb-e818-548f-e88e69cdf8f7.png">
6. 入力エリアに `japanese`　と入れて、 `Packages` を押すと検索が始まる。<img width="296" alt="スクリーンショット 2018-02-28 18.09.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/71497/e694b68d-f88a-93e9-0fc9-121894d568ac.png">
7. `japanese-menu` を探し出し、　`Install` をクリックする。
8. 程なくすると完了し、自動的にメニューが日本語になる。<img width="549" alt="スクリーンショット 2018-02-28 18.11.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/71497/8fe1caae-eb5f-60b4-fcd6-fe43356f295f.png">

## 参考
+ https://eng-entrance.com/atom-editor
macOSのターミナルでゼロ埋めの連番ファイルを作る

アルゴリズム演習をやっていて、001.phpから014.phpまでの連番ファイルが欲しかったのですが、ググったら「ブレース使え」ってのが出てきました。

```shell:bash
$ touch {001..9}.php
```

なるほど、超いーじゃん、と思いましたが・・・

```shell:bash
$ ls
1.php	2.php	3.php	4.php	5.php	6.php	7.php	8.php	9.php
```
は？
ゼロ埋めできてない。
ブレースはだめだ。

そういえば`seq`ってあったなと思いました。
`man`しました。
`-f`ってオプションがありました。

```shell:bash
$ for i in `seq -f %03g 1 9`; do touch $i.php; done
```

はい。

```shell:bash
$ ls
001.php	002.php	003.php	004.php	005.php	006.php	007.php	008.php	009.php
```

できました。

以上です。

追記

```shell:bash
$ echo $SHELL
/bin/bash
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Copyright (C) 2007 Free Software Foundation, Inc.
```
HDウォレットについて少し整理

## HDウォレットとは
- Hierarchy Deterministic wallet. 
- マスターキーからハッシュ関数で秘密鍵を生成。
- その秘密鍵をまたハッシュして秘密鍵を生成、というように階層的に秘密鍵を作成できる
- 最も古い祖先()であるマスターキーがあればすべての秘密鍵を導ける
- ウォレットは、たくさんのutxoをかき集めて合計の残高を表示する

## メリット

- アドレスを使い捨てにできるのでプライバシーがある程度保てる
- マスターキーを管理さえすればいい（諸刃のなんとか）

## デメリット

- シードが流出したら子秘密鍵が第三者が秘密鍵を全部導けてしまうので終了する（2of3とかのマルチシグにして管理できないのかな？）

## 参考

- [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
- [【ビットコイン】ウォレットの概要とHDウォレットの仕組み](http://blockchain.gunosy.io/entry/2017/12/21/165314#Hierarchy-Deterministic%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88-%E9%9A%8E%E5%B1%A4%E7%9A%84%E6%B1%BA%E5%AE%9A%E6%80%A7%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88-%E3%81%A8%E3%81%AF)
FLOYDの価格 2018.2.28版

## 背景
ディープラーニングを勉強中、cyfer10をCNNで学習させたらすごい待機時間になったので検索！からのサポートに問い合わせしてました。ディープラーニングはGPUの並列処理をした方が格段に時間を短縮出来ます。

[なぜディープラーニングにはGPUが必要なのか](https://news.mynavi.jp/article/20160506-nvidia_deeplearning2016/)

でも、GPUついてるMACって高いよね。買おうかな。外付けにしようかな。どうしようかなってところでFLOYDです。


## FLOYDって？
[FLOYD](https://www.floydhub.com/)

FLOYDはGPUのheroku的サービス。秒単位で使用できるとか。Beginner登録なら基本料金無料で、オプションで使用時間に合わせて料金が必要という仕組みです。
![SnapCrab_NoName_2018-2-28_17-36-54_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/217831/af063d1e-0908-6ef3-1ff7-43f7a600165a.png)

本当に無料で使えるの？ってところなんですが、固定費は確かに無料からです。Sign up時に2時間のGPUトライアルがついてきます。以前は100時間無料のキャンペーンを行っていたそうですが、2018年2月28日現在は2時間のトライアルです。こちらのフリートライアルは14日間の期限付きなので、使用する時にSign upしましょう。

では、それ以上使いたい場合はいくらかかるの？というと、これくらいです。10時間単位で購入出来て12USD～。試しにやってみるのにいいかもしれませんね。いきなりGPU買うよりも。

![SnapCrab_NoName_2018-2-28_17-39-49_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/217831/6fb79f8c-294a-63bb-1fc8-ce6d6c307c36.png)

こちらのオプションですが、購入から1年間繰り越せるそうです。試しに買ってみたはいいけど、今月10時間使わなかったわ。6時間余ってる…って場合も1年間はその残りの6時間を使用できるそうです。

さらに時間短縮のために複数の学習を同時にさせたい！って場合はData Science Planに入って、複数のGPU稼働ですかね。その場合は使用時間*GPU数なので御注意を。
bash > set -eu > diffの実行から下の処理が実行されない > diffのexit codeが異なるため | no_exit_diff()関数を用意する

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

### 概要

bashで指定する`set -eu`。エラー動作の観点からつけておくことが良いと思われる。

- @tukiyo3 さんに[コメントいただいた](https://qiita.com/7of9/items/39a8d2eb8eb88f9a67b2#comment-7ecc9cc39a90205b3545)
- [シェルスクリプトを書くときはset -euしておく](https://qiita.com/youcune/items/fcfb4ad3d7c1edf9dc96)

diffの実行から下の処理が実行されない症状に出会った。

### データ

```bash
$ cat dat1.txt 
LON 135.0
LAT 35.0
$ cat dat2.txt 
LON 135.0
LAT 34.0
$ cat new_lon.txt 
LON 136.0
LAT 35.0
```

## code

### `set -eu`あり

```bash:patch_lon_180228_exec
#!/usr/bin/env bash
set -eu

diff dat1.txt new_lon.txt > diff_lon

for elem in $(ls)
do
  echo $elem
done
```

```bash
$ bash patch_lon_180228_exec
```

lsの処理が実行されない。

### `set -eu`なし

```bash:patch_lon_180228_exec
#!/usr/bin/env bash
#set -eu

diff dat1.txt new_lon.txt > diff_lon

for elem in $(ls)
do
  echo $elem
done
```

```bash
$ bash patch_lon_180228_exec 
dat1.txt
dat2.txt
diff_lon
new_lon.txt
patch_lon_180228_exec
```

lsの処理が実行される。

### diffのexit codeが異なるため

@tukiyo3 さんの[コメント](https://qiita.com/7of9/items/67a2556ca3f942bf005c#comment-c1dc3971b29320065aea)にてdiffのexit codeが異なるために上記となっていることを知りました。

情報感謝です。

さらに追加でいただいた[情報](https://qiita.com/7of9/items/67a2556ca3f942bf005c/#comment-a3700509ba7b7e22b7f7)を参考にno_exit_diff()関数を用意する案を考えました。
Automation Anywhereでpythonの実行結果を取得する（VBScriptを利用して外部プログラムの応答結果を処理する例）


pythonプログラムをRPAから呼び出し、その実行結果を次のステップで利用したいケースがあります。
pythonによる画像検索や機械学習の実行結果を取得できたら、RPAによる自動化の適用範囲がずいぶんと広がるように思います。
そこでVBScriptからpythonを実行し、処理結果を受け取る方法を調べてみました。

【前提】
python 3.x
IBM RPA 10.6

【解説】
はじめにpythonのコードです。ここではファイル名をhello.pyとします。
printの出力内容を戻すことにします。

```
def message():
    print("hello rpa")

if __name__ == '__main__':
    message()
```

つづいて、pythonを呼び出すVBScriptのコードです。ここではファイル名をexecutePgm.vbsとします。


```
Option Explicit

Dim exeFile,pgmFile,returnMessage
Dim ShellObj,ShellExec

' 引数の処理
if WScript.Arguments.Count = 0 then
    returnMessage = -1
    WScript.StdOut.Writeline returnMessage ' Run Scriptに戻り値を渡す
    WScript.Quit(returnMessage)
end If

exeFile = WScript.Arguments(0) 'ex:python.exe
pgmFile = WScript.Arguments(1) 'ex:hello.py

Set ShellObj = WScript.CreateObject("WScript.Shell")
Set ShellExec = ShellObj.Exec(exeFile + " "+ pgmFile)

Do Until ShellExec.StdOut.AtEndOfStream '最後までループ
    returnMessage = returnMessage & ShellExec.StdOut.ReadLine 'pythonのprint出力行を読み取る
Loop

WScript.StdOut.Writeline returnMessage ' Run Scriptに戻り値を渡す
WScript.Quit(0)
```

VBScriptの実行結果をRun Scriptに戻すためには、WScript.StdOut.Writelineを利用します。WScript.Quitでは戻り値を設定できないため、注意してください。


```vbnet
WScript.StdOut.Writeline returnMessage ' Run Scriptに戻り値を渡す
```

最後に、vbsを呼び出すIBM RPA (Automation Anywhere)のコードです。
IBM RPAではRun Scriptコマンドを利用してVBScriptを呼び出すことができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/228422/afbcd9ac-7922-33d9-df66-a5105cae352d.png)
executePgm.vbsの引数としてhello.pyを渡します。
その出力結果を returnMessage 変数に設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/228422/b93e6749-5163-d4d8-1829-b3bd464e328f.png)

実行結果です。
![image](https://qiita-image-store.s3.amazonaws.com/0/228422/2a991e65-ba55-759c-6530-2944c710749c.png)

【リンク】
https://github.com/daikanmurata/rpa_vbs_python.git

pythonをonewayで呼び出す方法はこちらを参照ください。[Automation Anywhere から PowerShell やPython などの外部プログラムを呼び出す](https://qiita.com/RPAbot/items/8824bef6e6f33588b591)

最後までお読みいただきましてありがとうございました。
jqコマンドをShellの中で再帰的に実行する。


絶対忘れるのでメモ。

```
#!/bin/bash -e
set -x

retry_file="main.retry"
host_list="hosts.jq"


while read x; do

  cat ${host_list} | jq  -r "sort_by(.fqdn) |.[] | if .fqdn == \"$x\" then .fqdn, .is_compute_host else empty end"

done < ${retry_file}
```

`\"$x\"` のやり方をよく忘れます。
新Google Adwords(ベータ版)で地域を日本に絞ると広告が出ない

久々にiOSアプリをリリースしたので、Google Adwordsのキャンペーンを作成し
テキスト広告(ユニバーサルアプリ)を出しました。
アプリを英語/日本語の2言語対応させていたので
キャンペーンも英語用/日本語用の2つを作成。

| 　　項目       | 英語用　　　　　|         日本語用    |
|:-----------------|------------------:|:------------------:|
| 地域             |   すべての国と地域 |        日本        |
| 言語           |            英語　|       日本語       |
| キャンペーンの最適化             |  インストール数/すべてのユーザ |        インストール数/すべてのユーザ        |
| 単価設定           |            \30.00 |       \30.00       |
| 予算(一日あたり)           |            \1500 |       \1500       |
| 開始日と終了日     |    開始日～指定なし |  開始日～指定なし  |
| ターゲット地域の設定(ターゲット)    |  ターゲット地域にいるユーザと、ターゲット地域に関心を示しているユーザ |       ターゲット地域にいるユーザ       |
| ターゲット地域の設定(除外)    | 除外地域にいるユーザと、除外地域に関心をしめしているユーザ  | 除外地域にいるユーザと、除外地域に関心をしめしているユーザ       |

# なぜか日本にだけ広告が出ない
上記の設定で2つのキャンペーン広告を出したところ、英語用の方は
世界のいろいろな地域で広告が表示され始めました。
(ただ、なぜか中東(パキスタン、イラン等)が多く表示されている)
しかし、日本用のキャンペーンとして作成した広告の表示数は2～3日経過しても0のままだったので
「地域」を「すべての国と地域」に変更してみる(言語は日本語のまま)と、ポツポツ表示され始めたものの
地域を確認する限り、ベトナム、中国、タイ等のアジア圏の地域で、日本は含まれていませんでした。

# Google サポートに電話してみる
よくわからないので、サポートに電話したところ
なんだかそわそわした感じの女性スタッフが対応してくれたのですが結論としては
「キャンペーンの最適化」を**「インストール数」**に設定している場合は
**「予算(一日あたり)」の価格が「単価設定」の価格の50倍**になっていることを推奨するとのことだったので
上記の\30と\1500にしました。
現在、その後半日が経過しましたが広告の表示数に変化はなく0のままです。

##テキスト広告に設定している文言がダメ？##
テキスト広告の広告アセットとして、文言を設定すると「最良」「良」「低」「調整中」といった
評価がされていたので、「低」のものをいろいろ変更し「良」になるよう調整しましたが
とくに広告の表示に影響は見られませんでした。

広告の常識を把握していないので、設定している単価が大幅に間違っているのか
Adwords側の問題なのか、今のところ不明ですがひとまず待ってみようと思います。
Safariで「自動再生をしない」を設定した場合、どこまでブロックされるのか

# はじめに

Safariの自動再生のポリシーの変更により、デフォルトではユーザーがクリックしないと音声付きの動画を自動再生を許可しなくなりました。

ところが、独自に構築したコントロールボタンをクリックしても再生が開始しないという問題に突き当たったため、どういう条件で「自動再生」とみなされるのか、整理してみました。

# 検証
## 環境

再生コンテンツの条件はシンプルに

- MP4/H.264
- 暗号化なし

検証環境は

- Mac OSX El Capitan 10.11.6
- Safari 11.0.3

です。

## パターン1: videoタグの属性にautoplayを指定

一番シンプルにHTML5のvideoタグに対してautoplay属性を指定したパターンです。

```html
<video id="id-video" src="sample.mp4" controls autoplay></video>
```

これはもちろんブロックされます。

## パターン2: ページの読み込み時にJavaScriptから命令

次に、ページの読み込み完了時にJavaScriptでvideoタグの再生開始play()を呼び出すパターン。

```html
<video id="id-video" src="sample.mp4" controls></video>
<script>
    window.onload = function() {
        document.getElementById('id-video').play();
    };
</script>
```

ユーザーが意図しない勝手な再生開始を防ぐごとが目的ですので、このパターンも当然、自動再生のブロック対象です。

## パターン3: ユーザーがクリックしたら同期処理

次にボタンを用意してユーザーのクリックイベントの中で再生開始するパターン。

```html
<video id="id-video" src="sample.mp4" controls></video>
<button id="id-button-play">Play</button>
<script>
    document.getElementById('id-button-play').onclick = function () {
        document.getElementById('id-video').play();
    };
</script>
```

これは想定通り、ブロックされずに再生が開始されます。

## パターン4: ユーザーがクリック時に非同期処理(Callback)

ここからがハマったポイントです。まず、Callbackで非同期に再生開始するパターン。

```html
<video id="id-video" src="sample.mp4" controls></video>
<button id="id-button-play">Play</button>
<script>
    document.getElementById('id-button-play').onclick = function () {
        setTimeout(function () {
            document.getElementById('id-video').play();
        ,10000};
    };
</script>
```

このサンプルだと、play()を呼んだ瞬間に下記のような **エラーが発生して再生開始に失敗します** 。

>Unhandled Promise Rejection: NotAllowedError (DOM Exception 35): The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

これが非常に厄介。この実装をしていると、ユーザーがクリックしているにもかかわらず、再生が開始できなくなってしまいます。
XMLHttpRequestのonloadなどのイベントハンドラでも同様に再生開始できず。

## パターン5: ユーザーがクリック時に非同期処理(Promise)

気になるので、Promiseのthenの中で呼びだすパターンも試してみました。

```html
<video id="id-video" src="sample.mp4" controls></video>
<button id="id-button-play">Play</button>
<script>
    document.getElementById('id-button-play').onclick = function () {
        createPromise2().then(function () {
            document.getElementById('id-video').play();
        }).catch(function (err) {
            console.log("promise catch:" + err);
        });
    };

    function createPromise() {
        return new Promise(function (resolve, reject) {
            // 何か処理を入れる
            resolve("resolved");
        });
    }
</script>
```

なんとこのパターンだとちゃんと再生が開始しました。同じ非同期でもなぜPromiseはOKなのか

# まとめ

Safariの自動再生ポリシーは、Callbackに要注意ということになります。
例えば再生開始前に何かAPIを叩いて、成功したら再生開始・・・みたいなことをしたい場合、シーケンスをよく考える必要があります。

何か回避方法をご存じでしたら教えていただきたい・・・。
Java+PDFBox.jarでPDFをページ分割する


JavaプログラムでPDFをページ毎に分割したいときがありますよね。
そのようなときに使うコードです。

```java

public class PdfPageSplit {

	/**
	 * PDFページをPDFのまま分割できるか？
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		// https://pdfbox.apache.org/download.cgi
		// pdfbox-2.0.8
		// fontbox-2.0.8.jar

		String filepath = "file/pdf_ja_multipages.pdf";
		File pdfFile = new File(filepath);
		try {
			PDDocument pdDoc = PDDocument.load(pdfFile);
			int numberOfPages = pdDoc.getNumberOfPages();
			System.err.println("pdDoc.getNumberOfPages():" + numberOfPages);
			for (int n = 1; n <= numberOfPages; n++) {
				System.err.println("n:" + n);
				PDDocument doc = new PDDocument();
				PDPage page = (PDPage) pdDoc.getPage(n - 1);
				doc.addPage(page);
				File tempFile = File.createTempFile("test", "_" + n + ".pdf");
				System.err.println("tempFile:" + tempFile.getAbsolutePath());
				doc.save(tempFile);
				doc.close();
				System.err.println("saved!");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

```
Inside Wine; system32 を元に戻す

[目次] (https://qiita.com/Yutaka_Aoki/items/9d38ea98406f4096435b)

# Inside Wine; system32 を元に戻す

## やり方

~/.wine/drive_c/windows/system32/

の中がめちゃくちゃになってしまったような時、

$ cd ~

$ mkdir ./wine-new

$ WINEPREFIX=~/.wine-new winecfg

とすると、

~/.wine-new/drive_c/windows/system32/

にデフォルトの *.dll などのファイル一式が戻ってるので、それを、

~/.wine/drive_c/windows/system32/

の方にコピーします。

この状態で、デフォルト状態で起動できるアプリは起動できるようになっているはずです。なっていなければ、別の問題です。

さて、このままだと、mfc の dll なども消えているので、それを

winetricks

を使って戻します。


MSDN など、HTML HELP を深く使うアプリを使っていた場合には、Windows 本家の
hhctrl.ocx
のコピーと、regsvr32 hhctrl.ocx の実行も忘れずに行います。


## 参考サイト :

[参考サイト] (https://askubuntu.com/questions/482033/where-can-i-get-fresh-new-wine-dlls)
JavaのBigDecimalをtoStringしたときに指数表記(E)が出ないようにする


## 環境
Java 8
SpringBoot 1.5.10
Jackson Core 2.8.10

## 現象
BigDecimal型を使っているときに`toString`を呼ぶと指数表記(E)が出現することがあります。
手元の環境で試してみたところ、0.1からはじめて0.000001(10のマイナス6乗)まではそのままの形ですが、0.0000001(10のマイナス7乗)からは指数表記(E)が出現しました。

```java
BigDecimal fieldA = new BigDecimal("0.000001"); // .toString()したら 0.000001
BigDecimal fieldB = new BigDecimal("0.0000001"); // .toString()したら 1E-7
```

指数表記(E)が出現する基準については[BigDecimal.toStringのドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html#toString--)に詳しく書いてありますので、そちらを参照してください。

## 対応

toStringのかわりにtoPlainStringを使えばいくつであってもそのままの形で吐いてくれます。

```java
BigDecimal fieldA = new BigDecimal("0.0000001"); 
System.out.println(fieldA.toString()); // -> 1E-7
System.out.println(fieldA.toPlainString()); // -> 0.0000001
```

## Jacksonを使っているときにtoPlainStringしてほしい
Jacksonを使ってJavaのオブジェクトをJSONに変換している場合、デフォルトの挙動では、toStringが呼ばれるため、数によっては指数表記(E)が登場してしまいます。
これを防ぐために、内部で`toString`の代わりに`toPlainString`が呼ばれるようにする[WRITE_BIGDECIMAL_AS_PLAINという設定](https://static.javadoc.io/com.fasterxml.jackson.core/jackson-core/2.8.0/com/fasterxml/jackson/core/JsonGenerator.Feature.html#WRITE_BIGDECIMAL_AS_PLAIN)があります。(Jacksonの2.3から)

Spring Bootの場合は、`application.yml`に下記の設定を書けばokです。

```yaml
spring:
  jackson:
    generator:
      write_bigdecimal_as_plain: true
```

## 余談
 jqを使っていると指数を使う形式に変換されるので注意です。
動作確認時に、ターミナルからcurlしてjqでフォーマットして確認していたので、少しハマりました。


```bash
# jq使うとeが出現する
$ curl localhost:8081 | jq
{
  "fieldA": 1e-53,
  "fieldB": 9e-15
}

# jq使わないとeが出現しない
$ curl localhost:8081     
{"fieldA":0.000001,"fieldB":0.0000001}
```
RailsでreCAPTCHA対応

RailsでGoogleのreCAPTCHA対応します

## reCAPTCHAって？
こういうの
<img width="309" alt="スクリーンショット 2018-02-28 16.55.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/16629/17ced1ae-55fd-cb97-70f6-3b15673afa86.png">

## reCAPTCHAの登録
[ここ](https://www.google.com/recaptcha/intro/)からGoogleアカウントで登録
**Choose the type of reCAPTCHA**は**reCAPTCHA v2**を選ぶ
あとreCAPTCHAを仕込むページのドメインを登録する（開発でも使う場合は`localhost`も登録しておく）

## Railsに組み込む
Rails用の[reCAPTCHA Gem](https://github.com/ambethia/recaptcha)を利用
ほぼほぼREADME.md通りにやればOK

ちなみに今回はRailsのユーザ管理として[Devise](https://github.com/plataformatec/devise)を利用しているので、Deviseの登録画面にreCAPTCHAを組み込む
DeviseにreCAPTCHAを組み込む方法は[Deviseのwiki](https://github.com/plataformatec/devise/wiki/how-to:-use-recaptcha-with-devise)に記載されているのでそれ通りにやればOK

### 1. インストール
```diff:Gemfile
+ gem 'recaptcha', require: "recaptcha/rails"
```
で

```bash
bundle install
```

### 2. site_keyとsecret_keyの追加
以下のファイルを追加

```ruby:config/initializers/recaptcha.rb
Recaptcha.configure do |config|
  config.site_key = ENV['RECAPTCHA_PUBLIC_KEY']
  config.secret_key = ENV['RECAPTCHA_PRIVATE_KEY']
end
```

### 3. Deviseの登録画面に組み込む
`app/views/devise/registrations/new.html.erb`の登録フォームの任意の場所に以下のタグを追加

```ruby:app/views/devise/registrations/new.html.erb
  <%= recaptcha_tags %>
```

`app/views/devise/registrations/new.html.erb`がない場合は、[こちら](https://github.com/plataformatec/devise#configuring-views)を参考にDeviseのViewを追加しておく。

### 4. Deviseの登録時にreCAPTCHAバリデーションを組み込む
[こちら](https://github.com/plataformatec/devise#configuring-controllers)を参考にDeviseのRegistrationsControllerを継承したコントローラを追加し、`create`メソッドにreCAPTCHAバリデーションを仕込む。

```ruby:app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  prepend_before_action :check_captcha, only: [:create]
  prepend_before_action :customize_sign_up_params, only: [:create]

  private
  def customize_sign_up_params
    devise_parameter_sanitizer.permit :sign_up, keys: [:username, :email, :password, :password_confirmation, :remember_me]
  end

  def check_captcha
    self.resource = resource_class.new sign_up_params
    resource.validate
    unless verify_recaptcha(model: resource)
      respond_with_navigational(resource) { render :new }
    end
  end
end
```

公式のサンプルだと、`flash[:recaptcha_error]`でエラーメッセージを表示するようになっていたが、DeviseのエラーにreCAPTCHAエラーも組み込みたかったので少し変更している。
`verify_recaptcha`に`model`を渡してやるとそのモデルの`errors`にreCAPTCHAエラーを追加する仕様になっているので、それを利用してDeviseエラーに組み込んだ。

あと何故か`check_captcha`を実行したタイミングでは`sign_up_params`への`devise_parameter_sanitizer.permit`の設定が効いてなかったので、`prepend_before_action`で`check_captcha`の前に`customize_sign_up_params`を呼ぶようにしている。

### 5. reCAPTCHAのエラーメッセージのi18n対応
これも[公式](https://github.com/ambethia/recaptcha#i18n-support)に書いてあるとおりにする。

```diff:config/locales/ja.yml
+   recaptcha: 
+     errors: 
+       verification_failed: 'reCAPTCHA認証に失敗しました。' 
```

おわり。
Project Euler 41「パンデジタル素数」

itertoolsとも仲良くしていきたいですね。

# Problem 41 「パンデジタル素数」
n桁パンデジタルであるとは, 1からnまでの数を各桁に1つずつ持つこととする.
例えば2143は4桁パンデジタル数であり, かつ素数である. n桁（この問題の定義では9桁以下）パンデジタルな素数の中で最大の数を答えよ.

```python
from itertools import permutations

def hoge(num):
    # 大きい桁数から
    for n in range(num, 0, -1):
        d = '123456789'[:n]
        # パンデジタル数を大きい順に
        perm = sorted(permutations(d), reverse=True)
        for p in perm:
            i = int(''.join(p))
            if is_prime(i): return i

def is_prime(n):
    if n < 2: return False
    if n == 2: return True
    if n % 2 == 0: return False
    return all(n % i != 0 for i in range(3, int(n ** 0.5) + 1, 2))

print(hoge(9))
```

python3とpython2.7で実行速度にかなりの差が出る。


```console
xxx@xxx:~$ time python3 pe41.py
7652413
real    0m1.005s
user    0m0.956s
sys     0m0.048s
xxx@xxx:~$ time python pe41.py
7652413
real    0m23.992s
user    0m23.960s
sys     0m0.028s
```
循環的複雑度を下げたい

最近循環的複雑度を下げる対応しているのでメモを残し
先人の記事をいろいろ参考にしました 感謝

# 循環的複雑度

[循環的複雑度の指標](https://qiita.com/su-kun1899/items/cb2664d825d40f88b164)
循環的複雑度は10以下が良いとのことなのでこれ以下になるように目指す

[ソフトウェアのメトリクスの基本的なところ](https://blog.cles.jp/item/3271)
> 直感的な数え方としては分岐数( if や for など )＋1 で求められる。

つまり一つのメソッド内にあるifやforの数をなんとかすれば循環的複雑度が下がる？

# 下げる方法
### 1.メソッドに切り分ける
循環的複雑度が高いコードは一つのメソッドにいろんな処理を詰め込みがちなので、機能単位で切り出す

### 2.分岐の条件を見直す
ifに不必要な条件が付いていたり、条件を簡略化できるなら修正する

# めも
循環的複雑度を下げる対応というより普段のコーディングで意識して行くべきなんだろうなと

[経路の総数、ネストの深さ、循環的複雑度の特徴](http://minor.hatenablog.com/entry/20110212/1297509041)
ネスト下げるは循環的複雑度には関係ないのね
まぁネストが浅いほうが読みやすいのでついでに直せるなら直してしまいたい
CloudSearch ノウハウ

# CloudSearch ノウハウ

## 前処理
ここで言う前処理は検索やインデックス時の前に行う処理でCloudSearchでは対応できていない前処理になります.

### 表記揺れ

#### 文字コード
Unicode正規化 NFKC を使えば以下の様な対応ができる.

- `ウ゛ェネチア` => `ヴェネチア`

#### 旧字
- `慶應大学` => `慶応大学`

#### 踊り字
- `々`
  - `刻々` => `刻刻`
  - `複々々線` => `複複複線`
  - `部分々々` => `部分部分` 
- `ゞ`
  - `いすゞ自動車` => `いすず自動車`

## Analysis Schemes
CloudSearchの機能である程度カスタマイズができるところがある.

### Synonym

#### Aliases
ある単語のエイリアスを登録する仕組みです.

- `ヴェネツィア`
  - `ベネチア`
  - `ヴェネチア`
  - `ヴェニス`
  - `ベニス`

### Group
ある単語のグループを登録する仕組みです.

- `煙草`
- `タバコ`
- `たばこ`
numpyとsympyのsqrt関数(平方根の計算)の違い


#numpyのsqrt関数
√(2)=1.414・・・
のように、無限小数を返す。
√(4) = 2.0
√(8) = 2.828・・・
√(-8) = nan
ルートの中身がマイナスの値をとると　nan　が返される

```python
>>> import numpy
>>> numpy.sqrt(2)
1.4142135623730951
>>> numpy.sqrt(4)
2.0
>>> numpy.sqrt(8)
2.8284271247461903
>>> numpy.sqrt(-8)
nan
```

#sympyのsqrt関数
√(2) ⇒　そのまま
√(4) = 2
√(8) = 2√(2)

```python
>>> import sympy
>>> sympy.sqrt(2)
sqrt(2)
>>> sympy.sqrt(4)
2
>>> sympy.sqrt(8)
2*sqrt(2)
```

## 加法　減法
特記事項なし
√(2)+5√(2)-√(8)+√(3) = √(3) + 2 + 4√(2)

```python
>>> sympy.sqrt(2)+5*sympy.sqrt(2)+2-sympy.sqrt(8)+sympy.sqrt(3)
sqrt(3) + 2 + 4*sqrt(2)
```

## 乗法

単項式の乗法は通常通り

```python
>>> sympy.sqrt(5)*sympy.sqrt(10)
5*sqrt(2)
>>> sympy.sqrt(3)**2
3
```

分配法則（無理数は分配してくれない）
(1+√(3))×5 = 5+5√(3)
(1+√(3))×√(3) ⇒そのまま

```python
>>> (1+sympy.sqrt(3))*5
5 + 5*sqrt(3)
>>> (1+sympy.sqrt(3))*sympy.sqrt(3)
sqrt(3)*(1 + sqrt(3))
```

多項式の乗法（展開）はしてくれない。

```python
>>> (1+sympy.sqrt(3))*(1-sympy.sqrt(3))
(1 + sqrt(3))*(-sqrt(3) + 1)
>>> (1+sympy.sqrt(3))*(1+sympy.sqrt(3))
(1 + sqrt(3))**2
>>> (1+sympy.sqrt(3))**2
(1 + sqrt(3))**2
```

expand関数を使えば展開可能

```python
>>> sympy.expand((1+sympy.sqrt(3))*sympy.sqrt(3))
sqrt(3) + 3
>>> sympy.expand((1+sympy.sqrt(3))*(1-sympy.sqrt(3)))
-2
>>> sympy.expand((1+sympy.sqrt(3))**2)
2*sqrt(3) + 4
```



## 除法・有理化
√(2/5)は先に分数計算がなされたあとに、平方根をとるので無限小数で表される。
√(2)/√(5)は有理化されて、分数表記になる。

```python
>>> sympy.sqrt(2/5)
0.632455532033676
>>> sympy.sqrt(2)/sympy.sqrt(5)
sqrt(10)/5
```

分母が無理数のみの場合、有理化してくれる。
1/√(2) = √(2)/2

分母が（有理数＋無理数）の場合は有理化されない。
2/(√(3)-1)　⇒　2/(-1+√(3))

```python

>>> 1/sympy.sqrt(2)
sqrt(2)/2
>>> 2/(sympy.sqrt(3)-1)
2/(-1 + sqrt(3))
```

simplify()関数を使えば分母が（有理数＋無理数）の場合も有理化される。

```python
>>> sympy.simplify(2/(sympy.sqrt(3)-1))
1 + sqrt(3)
```

（余談：simplify()関数は二重根号を外してくれない）

```python
>>> A1=sympy.sqrt(2*sympy.sqrt(3) + 4)
>>> sympy.simplify(A1)
sqrt(2*sqrt(3) + 4)
```

## 複素数
ルートの中がマイナスの場合、虚数単位が表示される。

```python
>>> sympy.sqrt(-1)
I
>>> sympy.sqrt(-8)
2*sqrt(2)*I
```
Firebase JobDispatcher の Job 確認方法

[Firebase JobDispatcher](https://github.com/firebase/firebase-jobdispatcher-android) は、Androidアプリでバックグラウンドジョブをスケジュールするためのライブラリです。 Google Play　Services　がインストールされているすべての最新バージョンのAndroid（APIレベル9以上）で動作するAPIレベル21のJobScheduler互換APIを提供しています。

Firebase JobDispatcherは、Google Play Services のスケジュールコンポーネントに依存しています。そのため、Google Play Servicesがインストールされていない環境では動作しません。

**Firebase JobDispatcherは、APIレベル21以上のAndroidで実行された場合、Frameworkの[JobScheduler](https://developer.android.com/reference/android/app/job/JobScheduler.html) を使用しているわけではありません。Google Play Servicesに依存してます。**

その為、以下のコマンドを実行しても、Firebase JobDispatcher で、スケジュールされたJobの確認することはできません。
`adb shell dumpsys jobscheduler`

以下のコマンドを実行する必要があります。
`adb shell dumpsys activity service GcmService`

スケジュールされていると、Pending:のセグメントに追加されています。

```
    Pending:
    ~
    (scheduled) net.granoeste.jobdispatchersample/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="MainFirebaseSimpleJobService" trigger=window{start=0s,end=60s,earliest=-3s,latest=56s} requirements=[NET_CONNECTED] attributes=[PERSISTED,RECURRING] scheduled=-3s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
    Not yet run.
```

実行中は、Active tasks:に表示されます。

```
   Active tasks:
       net.granoeste.jobdispatchersample/com.firebase.jobdispatcher.GooglePlayReceiver, u0 running: 00:05
```

終了すると、Past executions:に追加され、次のスケジュールがPending:のセグメントに登録されていることが確認できます。

```
    Pending:
    ~
    (scheduled) net.granoeste.jobdispatchersample/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="MainFirebaseSimpleJobService" trigger=window{start=0s,end=60s,earliest=57s,latest=117s} requirements=[NET_CONNECTED] attributes=[PERSISTED,RECURRING] scheduled=57s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
    Not yet run.

    Past executions:
    ~
    (finished) [net.granoeste.jobdispatchersample/com.firebase.jobdispatcher.GooglePlayReceiver:MainFirebaseSimpleJobService,u0]
    successes: 2 reschedules: 0 failures: 0 timeouts: 0 invalid_service: 0 total_runtime_millis: 60195
```



参考）

- [android \- Is the Firebase JobDispatcher using the JobScheduler? \- Stack Overflow](https://stackoverflow.com/questions/38853882/is-the-firebase-jobdispatcher-using-the-jobscheduler)
WRF | bash > ncdumpによりXLATとXLONGをテキスト出力する | Matplotlibで表示する

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS、およびWRFの後続処理のF***T関連。

WRF実行後のwrfout***ファイルから緯度経度情報を取得する。

- ncdumpを使う
- 取得サイズは対象範囲のサイズ 75 x 75

### code 

```bash:CODE_171116/extract_XLAT_XLONG_180228_exec
#!/usr/bin/env bash
set -eu  # just in case

# 5625 = 75 x 75 (west_east * south_north)

WRF_D02=$1

ncdump -v XLAT $WRF_D02 | grep -A 2000 "XLAT =" | tr ", " "\n" | grep "\." | head -n 5625 > dat.XLAT
ncdump -v XLONG $WRF_D02 | grep -A 2000 "XLONG =" | tr ", " "\n" | grep "\." | head -n 5625 > dat.XLONG
```

```bash
$ bash CODE_171116/extract_XLAT_XLONG_180228_exec wrfout_d02_2017-11-01_00\:00\:00 
[dat.XLAT] is created
[dat.XLONG] is created
```

- 1行に6個程度のカンマ付き数値列からtrで改行している
- grep -A 2000の2000は5625/6を超える任意の数値でいい

### 出力ファイル

以下のような5625行のファイルが出力される。

```bash
$ head dat.XLAT 
30.58262
30.58724
30.59171
30.59607
30.60028
30.60435
30.6083
30.61209
30.61576
30.61929
```

## Matplotlibでの表示

上記のファイルをJupyter + MatplotlibをセットアップしたUbuntuへコピーした。

```txt:動作環境
Ubuntu 16.04.3 LTS desktop amd64
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
tmux 2.1-3build1
Python 2.7.12
Python 3.5.2
```

関連: [Jupyter | Matplotlib > 2次元データの可視化 > imshow() | scatter()](https://qiita.com/7of9/items/208e55caa6a9713030aa)

### code v0.1

```py:mapLatitudeLongitude_WRF_180228.ipynb
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

lat = np.genfromtxt('dat.XLAT')
lon = np.genfromtxt('dat.XLONG')
print(lat)
print(lon)

plt.scatter(lon, lat)

```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/14716873-fa96-0961-5feb-9332cb57e8c6.png)

### code v0.2 > 参照地点の追加

```py:mapLatitudeLongitude_WRF_180228.ipynb
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
#import matplotlib.cm as cm

lat = np.genfromtxt('dat.XLAT')
lon = np.genfromtxt('dat.XLONG')
print(lat)
print(lon)

plt.scatter(lon, lat, color='blue')

regx = np.array([135.0, 135.0, 135.0, 135.0])
regy = np.array([30.0, 31.0, 32.0, 33.0])
plt.scatter(regx, regy, color='red')

```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a774251d-2ba4-075b-e880-e358e2ad5ffc.png)

### code v0.3

コードは未掲載とするが、以下の処理を追加した。

- calc_region()という関数を追加
    - regx[]とregy[]に`F***T`の4隅の緯度経度を計算し、tupleで返す

この処理にて`F***T`の範囲がWRFのデータ範囲に収まらないことが可視化できるようになった。
Lambertでのprojectionにより、緯度経度の範囲が収まらないようになったのかもしれない。


### 可視化は大切

データが範囲内にあるかどうかは数値だけ見ても把握しにくい。
将来同じような処理を行う場合、短時間で失敗が分かる仕組みを作っておく方がよいと思う。

### 関連

- [WRF > 後続処理 > 処理の緯度経度が半ピクセル分ずれる](https://qiita.com/7of9/items/4ff20e2381c2b0817a36)
#Quantopian Algorithm で order_percent

## order_percent

[order_percent](https://www.quantopian.com/help#api-order-percent "Quantopian Help")は，現在のポートフォリオ価値の〜％分注文する関数です．現在のポートフォリオ価値とは，ポジションの評価額と現金の合計です．

`order_percent(asset, amount, style=OrderType)`

> asset: Equity/Future オブジェクト
amount: 割合．0.5であれば現在のポートフォリオ価値の50％分をLong．-0.5であれば50％分をShort．
style: 注文方法（指定方法は[order_percent](https://www.quantopian.com/help#api-order-percent "Quantopian Help")の説明を参照）



## アルゴリズム例

（オーダー方法以外は，[#Quantopian Algorithm で order - Qiita](https://qiita.com/shinseitaro/items/4e88c0b05c3452a86fbc#%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E4%BE%8B "#Quantopian Algorithm で order - Qiita")にコメントで説明していますのでご参照下さい）

```python

def initialize(context):
    context.security = sid(24)
    schedule_function(rebalance, 
                      date_rule=date_rules.every_day(),
                      time_rule=time_rules.market_close(minutes = 1))

def rebalance(context, data):
    price_history = data.history(
        context.security,
        fields='price',
        bar_count=5,
        frequency='1d'
    )
    average_price = price_history.mean()
    current_price = data.current(context.security, 'price') 
    if data.can_trade(context.security):
        if current_price > (1.01 * average_price):
            # 成り行きで現在のポートフォリオ価格に対して100％分のアップル株を買う
            order_percent(context.security, 1.0)
            log.info("Buying %s" % (context.security.symbol))
        elif current_price < average_price:
            order_target(context.security, 0)
            log.info("Selling %s" % (context.security.symbol))
    
    record(current_price=current_price, average_price=average_price)

```
現在価格が，過去5日の平均より１％大きければ，今のポートフォリオの価値分AAPLを買うという（かなりアグレッシブな）アルゴリズムです．

1000ドルからスタートすると，このようになります．一日目に6株買い，次の日も6株買っていますね．

![Screenshot from 2018-02-28 13-13-36.png](https://qiita-image-store.s3.amazonaws.com/0/14019/acb47e57-f04a-e23c-2e52-7258f8887f16.png)

条件にあえば，ポートフォリオ価値分買い足すので，このような取引履歴になります．

## メモ

注意していただきたいのは，ここでいうポートフォリオ価値というのは，自分が持っている株の評価額+現金です．上のTransaction Detailsを見るとわかるように，たとえば二日目の６株買い増しは，最初の自己資金１０００ドルだけでは買えません．つまり借金してでも買い増すというアルゴリズムです．ポートフォリオ価値というのは，評価額+現金であって，評価額+現金-借金ではないというところに注意してください．

それでは困るよ，というのが普通（？）かとおもいます．
そういう時に使える，[order_target](https://www.quantopian.com/help#api-order-target "order_target") / [order_target_value](https://www.quantopian.com/help#api-order-target-value "order_target_value") / [order_target_percent](https://www.quantopian.com/help#api-order-target-percent "order_target_percent") という取引関数がありますので，次回はその説明をします．




## 他のオーダー方法
[#Quantopian Algorithm で order](https://qiita.com/shinseitaro/items/4e88c0b05c3452a86fbc "#Quantopian Algorithm で order - Qiita")
[#Quantopian Algorithm で order_value](https://qiita.com/shinseitaro/items/16f0f12ad65f428c2f4b "#Quantopian Algorithm で order_value - Qiita")
[#Quantopian Algorithm で order_target](https://qiita.com/shinseitaro/items/f1ea0245bba1e7ccc82d "#Quantopian Algorithm で order_target - Qiita")
Cloud Monitor について

#概要
AlibabaCloudのCloudMonitorの機能を少し見てみました。

## ECSの詳細
https://qiita.com/hato_hato123/items/9c5b2b40d2a93f158d45
の続きになります。
CPU、インターネット送受信、システムディスク、ディスクを自動的に監視してくれています。
![CloudMonitor_管理コンソール.png](https://qiita-image-store.s3.amazonaws.com/0/234379/27d86edc-d7c1-03c3-ecc4-0b312f02eadf.png)

アラームタスク履歴も見ることができます。いいですね。
![CloudMonitor_管理コンソール 2.png](https://qiita-image-store.s3.amazonaws.com/0/234379/6bc3873f-5d58-9117-0af5-126f7b782150.png)

ECSのモニタリングも出来るのですが、この３つのインスタンス全部過去消したのに残ってる。。。しかも消せない。コンソールに削除機能追加してほしい
![CloudMonitor_管理コンソール 3.png](https://qiita-image-store.s3.amazonaws.com/0/234379/787b1867-d494-8987-39e5-a3567702f263.png)

##最後に
各サービスの状況はCloudMonitorからすべて見ることが出来るので便利です。
が、コンソール自体重いので全然使いたくない。これは中国コンソール、インターナショナルコンソールどこも重い。
UIの処理早くなるといいですね。（API使いましょう)
[Zabbix] 特定の時間帯に特定のトリガーのみ無効にする方法

バッチの実行時間帯など、特定の時間帯のみCPU使用率のトリガー通知を止めたい場合があります。
Zabbixの**メンテナンス機能**でトリガー通知を止めることはできますが、**ホスト単位**での設定となってしまいます。

# 1. 実現したいこと
* 特定のホストのみトリガー通知を止める
* 特定の時間帯のみトリガー通知を止める
* 特定のトリガーのみ通知を止める

# 2. 前提条件
* Zabbixのバージョンは、2.2.3
* トリガーはテンプレートで設定している

# 3. 実現方法
通知を止めたいトリガーに**時間の条件**を追加することで実現できます。
## 3-1. トリガーの複製
テンプレートのトリガーの場合、個別に条件の変更(追加)はできません。個別に編集ができるようにトリガーの複製を行います。
```
設定->ホスト->トリガーで対象のトリガーを選択
```
![zabbix_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/34875/b360019c-b97f-3ead-b49c-1a82f39957f7.png)

プルダウンから**'選択をコピー'**を選択して実行します。対象のホストを選択してトリガーをコピーします。
![zabbix_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/34875/7b0c7a16-c546-c3f9-71f7-33df3bdf8dc3.png)

## 3-2. トリガーの編集
コピーしたトリガーの条件を修正します。条件式に通知時間の条件を追加します。以下の例では、次のような条件としています。

* CPUアイドル値の5分間平均が5未満
　かつ
* (時間が5時より前、または8時より後)

```
{XXXX:system.cpu.util[,idle].avg(5m)}<5 &
 ({XXXX:system.cpu.util[,idle].time(0)}<050000 |
 {XXXX:system.cpu.util[,idle].time(0)}>080000)
```

![zabbix_03.PNG](https://qiita-image-store.s3.amazonaws.com/0/34875/cf95b0ae-5cb9-3758-6789-8fb2655d4d46.png)

条件式ビルダーでは、このようになります。
![zabbix_04.PNG](https://qiita-image-store.s3.amazonaws.com/0/34875/a6a341c0-d2eb-d42f-bea4-6c16ea65a3fb.png)

条件の追加が完了したら、元からあったテンプレートから引き継いだトリガーを無効化しておきます。

以上で設定は完了です。

---
※ブログに記載済みの記事をQiitaに転載しています。元の記事は[こちら](https://410gone.click/blog/2018/02/28/zabbix-%E7%89%B9%E5%AE%9A%E3%81%AE%E6%99%82%E9%96%93%E5%B8%AF%E3%81%AB%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%81%AE%E3%81%BF%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B/)
cakephp 2.x model 作成・書き方

cakephp 2.xでModelの書き方が忘れがちなので記載しておきます。
あくまでも私のやりかた。

１．Modelフォルダにphpファイルを作成する。
任意の名前で使用できるので、わかりやすい名前にしています。
SQL上のテーブル名はxxxxx_usersという名前だった場合、cakephpではusersだけで問題ないならUsers.phpを作成する。

２．Users.phpの中身

```Users.php
<?php
class Users extends AppModel {

»-public $useTable = "xxxxx_users";
»-public $primaryKey = 'no';

}
```

classはファイル名、class名がSQLのテーブル名と同じ場合は下記設定はいらない。
useTable　→　割り当てるテーブル名
primaryKey　→　プライマリキー

プライマリキーは設定しておかないと、検索時に失敗します。

３．Contollerに記載する。

```UsersContller.php
<?php
App::uses('AppController', 'Controller');

class UsersController extends AppController {
  public $uses = array(
    'Users'
  );
```

function indexの中身を書く前に上記のpublicを追加する。
array内にこのコントローラー内に使用したいテーブル名を追記していく。
Auto Scalingの設定

#概要
ECSを立て跡のAuto Scalingの設定方法

##ECSを立てる
事前準備
- VPC
- ServerLoadBalancer

VPCは以下のようにで作成していきます。
![VPC_Manage_Console_2.png](https://qiita-image-store.s3.amazonaws.com/0/234379/8d375530-185e-7102-7350-ed2e784ae572.png)
![VPC_Manage_Console 3.png](https://qiita-image-store.s3.amazonaws.com/0/234379/81c056bf-715b-1dc0-ffed-68cc2dc2248d.png)

SLBは以下参照
![Server_Load_Balancer_の有効化.png](https://qiita-image-store.s3.amazonaws.com/0/234379/73650ae2-b28f-4bce-269c-eeb5233a3b6a.png)

ECSを適当に見繕って買いましょう。
![Alibaba_Cloud_Elastic_コンピューティング.png](https://qiita-image-store.s3.amazonaws.com/0/234379/79aee0b8-bd92-ecd7-56b0-a748fda97686.png)
この跡の設定で必要になるのでカスタムイメージを作成しておきます。※因みに最低でも5分ぐらいはかかるみたいです。
![ECS_管理コンソール.png](https://qiita-image-store.s3.amazonaws.com/0/234379/8c75b644-e739-d50d-d271-6b68c5ce68ab.png)

##AutoScaling
オートスケールの設定です。
- スケーリンググループ作成
- スケーリングルール作成
- アラームタスク作成

VPCとSLBは事前準備で作成したものを使用してください。
![Auto_Scaling管理コンソール.png](https://qiita-image-store.s3.amazonaws.com/0/234379/e5a43e14-15b3-604e-148d-6152d196a081.png)

事前準備したECSインスタンスとセキュリティグループとカスタムイメージを使用します。筆者はカスタムイメージを作成し忘れたので出戻りが発生しました。
![Auto_Scaling管理コンソール 2.png](https://qiita-image-store.s3.amazonaws.com/0/234379/f0baab75-8f0f-618b-f119-060b8f83d2f5.png)

成功するとこの画面になります。

![Auto_Scaling管理コンソール 3.png](https://qiita-image-store.s3.amazonaws.com/0/234379/98f73710-f9fc-3e87-27a8-09b722cde334.png)

ルールの設定は増加、減少の2つ作成することになります。スケーリンググループには５つまで作成することが出来るので色々作成しておくといいかもしれませんね。
![Auto_Scaling管理コンソール 4.png](https://qiita-image-store.s3.amazonaws.com/0/234379/dc8c2641-d7eb-ae64-a29f-3de5cb5bbd1b.png)

アラームタスク作成時に一つ前のステップで作成したスケーリングルールを指定します。![Auto_Scaling管理コンソール 5.png](https://qiita-image-store.s3.amazonaws.com/0/234379/a09717f0-b365-69f6-6a02-9858cf000d61.png)

##最後に
これでCPUの負荷に応じでインスタンスが増減するようになります。
コンソールからこの設定するのは大変です。。。