OmniAICreator/Qiita-1.07M huggingface dataset:
Bluetooth SIGメンバーシップへの登録

# はじめに
Bluetoothでの通信機能を持ったハードウェアを販売する場合、避けて通れないのが、Bluetooth SIGへの加入と販売する製品のプロダクト登録です。

スマホやマウスなど、様々な製品で使われているBluetoothですが、Bluetooth SIGへの登録方法などは調べてもあまり出てきません。代行業者？の懇切丁寧かつ小難しいサイトは出てきて、大変参考になりますが、これってそんなに大変な作業なの？というのが、このネタの発端です。

今回はまず、Bluetooth SIGへのメンバー登録についてざっと書いていこうと思います。

# メンバーシップのレベル
Bluetooth SIGへ加入する際にまず、加入するメンバーシップのレベルを決めることになります。レベルは2つ、

* アダプター
* アソシエイト

があり、それぞれの違いについては[本家の日本語の解説](https://www.bluetooth.com/ja-jp/membership-working-groups/membership-types-levels)で把握出来ます。

年にいくつもBluetooth機能を搭載した製品をリリースする予定もないので、アダプターメンバーシップに登録してみます。

# 登録に必要なもの
さて、メンバーシップ登録を進めるに当たり、必要なものを事前に準備する必要があります。
今回の場合、私が所属している[有限会社山本製作所](http://made-in-yamamoto.com)で登録を行います。こちらのサイトだと、「ん？？どこにBluetoothが必要？！」と思われるでしょう。そんな方は[こちら](http://atelier.tkrworks.net)にどうぞ。

ちょっと横道に逸れましたが、本題の準備するもの。今回、必要になったのは

* 登記簿謄本（履歴事項全部証明書、日本語のものをPDF化でOK）
* 委任状（英文のもの、社長のサイン有り）

の2つでした。登記簿謄本は最寄りの法務局で取得できます。また、委任状ですが、これは私が有限会社山本製作所を代表して、Bluetooth SIGメンバーシップ登録の手続きを行う事を認め、メンバーシップの同意書に署名する権限を与えるという内容の書類になります。オフィシャルにテンプレートがあるわけではなく、オンラインでの手続きでは不要でしたが、メンバー登録を進める過程で、Bluetooth SIGの中の人からメールで提出を求められたため、作成して提出、受理されました。

参考までに、私が作ったものの雛形を[こちら](http://cloud.tkrworks.net/index.php/s/7cGAUxCkNog06bQ)に上げておきます。

# いざ登録手続き
とは言っても、基本的には[ここ](https://apps.bluetooth.com/registration#/adopterapply)から国とメールアドレスを入力し、「Start Membership Application」をクリックします。これ以降はオンラインで必要事項を入力していくだけです。

最初に会社情報、次に申請者の情報、会社の所在地など、最後にメンバーシップの規約への同意チェックと署名になります。

最初のCompany InformationのCompany's Legal Nameは登記簿謄本に載っている通りの名称を書きます。Company's Formation Documentsでは用意した登記簿謄本をスキャンしてPDF化したものを添付します。

委任状は、オンラインでの手続き完了後、Bluetooth SIGから提出を求められた場合に提出すれば良いでしょう。

あとは申請が受理されるのを待ち、受理された旨はメールにて担当者から連絡が来ます。内容に不備があった場合にも、担当者から連絡が来ますので、それに従って、委任状など、必要な書類を用意し、提出します。

# イノベーション奨励プログラム（2018年2月14日追記）
今回の記事ではプロダクト登録まで行いませんが、1製品のプロダクト登録にかかる費用は8,000ドルと高額です・・・。スタートアップや、小ロットで少しずつやっていこうとする場合のコスト面で大きな足枷となります。こういった企業のための救済措置的にBluetooth SIGでは[イノベーション奨励プログラム](https://apps.bluetooth.com/innovation-incentive-program/index.html?_ga=2.64696106.480161385.1518568614-1246846730.1518568614#)というものが用意されています。

詳細はリンク先を見て欲しいですが、ざっくり言うと直近の収益が100万ドル以下で、今までにプロダクト登録をしたことがない企業に限り、通常8,000ドルの登録費用を2製品に限り、2,500ドルにするという内容です。
このプログラムに承認を得るために、提出するものとして、Bluetooth SIGのページには

* 合計年間収益を示す税務書類
* 年間損益報告書/計算書—公認会計士によって確認され署名されていること
* 合計年間収益が 100 万米ドル未満であることを確認する報告書または書簡—会計事務所のレターヘッドのある便せんで提示され、公認会計士によって確認され署名され、会計事務所のウェブサイトの公式リンクを含むこと
* 公開年次報告書

とあります。で、何を出せば良いのか？英訳は必要？とよく分からなかったので、試しに弊社の前期の決算報告書をスキャンし、PDF化した日本語のそのままのものを送ってみました。決算報告書の内容ですが、弊社の場合は

* 貸借対照表
* 損益計算書
* 販売費及び一般管理費
* 製造原価報告書
* 株主資本等変動計算書

となっています。
英訳が必要になるかなと思いましたが、これだけで特に中の人とのやりとりもなく、審査に通り、承認されました。

注意点としては、このプログラムには有効期限があり、承認されてから18ヶ月以内となっています。その期限が過ぎると、1製品8,000ドルの費用がかかるようになってしまいます。製品登録を行わずに18ヶ月経過後、再度このプログラムに申請することが可能か分からないため、製品のリリース予定がないのに申請を行うのは避けた方が良いと思います。

# まとめ
以上が、Bluetooth SIGへのメンバー登録の大まかな流れになります。Bluetooth製品を世に出したい！と思っている方の手助けになれば幸いです。

# 余談
今回は必要ありませんでしたが、会社がある地域の商工会議所から、「日本法人証明書」というものを発行してもらうことが出来ます。もし必要な場合は商工会議所に相談してみると良いでしょう。ちなみに、弊社が会員になっている埼玉県上尾市の上尾商工会議所の場合、日本法人証明を取得するためには、商工会議所への貿易登録が事前に必要になります。弊社の場合、すでに商工会議所の会員でしたので、無料で貿易登録が行えました。ただし、貿易登録のために、

* 登記簿謄本（履歴事項全部証明書）
* 印鑑証明書（法人）

が必要になり、貿易登録が受理されるまでに2～3日かかりました。
concrete5 8.3系で使えるGeoロケーション機能。これを活用した地図アドオンを公開予定

2017年12月にリリースされた[concrete5 バージョン8.3](https://concrete5-japan.org/news/concrete5-830/) で、Geoロケーション機能が追加されたので、使ってみたメモです。

## Geoロケーション機能
concrete5 の管理画面の【システムと設定　＞　サーバー設定一覧　＞　ジオロケーション】 index.php/dashboard/system/environment/geolocation と進むと、下記のような画面が表示されます。
![geoplugin.png](https://qiita-image-store.s3.amazonaws.com/0/31643/3257cdca-6277-673b-66f1-091ef6e2d52c.png)

【テスト】ボタンを押すと、IPアドレスの情報から緯度経度の情報を取得できます。
![geolocation.png](https://qiita-image-store.s3.amazonaws.com/0/31643/dca39d45-429d-6e96-1173-2627242858cd.png)

## どう使うのか
記事作成時点（2018年2月2日）では、Geoロケーション機能のユーザー向けドキュメントは公開されていないので、ソースコードから調べてみます。

### concrete5 のコアで使っている部分を探す
concrete5 のフォーム(問い合わせ等を作る)に、address(住所)という項目があります。addressでは、ユーザー(ホームページ閲覧者)のIPアドレスから、国や地域などを取得しています。 concrete/attributes/address/controller.phpを見ると、

```php
                $geolocated = $this->app->make(GeolocationResult::class);
                $this->set('country', $geolocated->getCountryCode());
                $this->set('postal_code', $geolocated->getPostalCode());
                $this->set('state_province', $geolocated->getStateProvinceCode());
                $this->set('city', $geolocated->getCityName());
```

というコードがありました。concrete5本体でGeoロケーション機能を実行し、その結果をGeolocationResultクラスを使って活用できるようです。concrete5 はソースコードが公開されている CMS なので、このように調べる作業が楽ですね。

### APIドキュメントを読む
開発者向けAPIドキュメントは公開されている(おそらく自動生成プログラムで作成されている)ので、[GeolocationResult](http://documentation.concrete5.org/api/8.3.2/Concrete/Core/Geolocator/GeolocationResult.html)クラスのドキュメントを見てみます。
そうすると、getLatitude、getLongitudeというメソッドがあることが分かります。これらを使えば、緯度経度が取得できそうです。

## 書いてみたコード

```php
    $geolocated = $this->app->make(\Concrete\Core\Geolocator\GeolocationResult::class);
    if ($geolocated) { //　ジオロケーションが有効な場合
        $data_lat = $geolocated->getLatitude();
        $data_lng = $geolocated->getLongitude();
    } else { // ジオロケーションが無効な場合は、愛知県名古屋市中区栄2-2-1の緯度経度
        $data_lat = 35.16809895181293;
        $data_lng = 136.89892888069156;
    }
```

### 活用シーン
現在、オープンストリートマップの地図を表示するアドオンを作成しています。このアドオンでは、地図を新規追加するときに編集画面に地図を表示します。このときの初期位置の指定に、ジオロケーション機能を活用しています。
ジオロケーション機能を活用することで、地図の初期位置が、自分のいる位置の近辺になります。
地図を表示したい人が居る場所の近辺が、ホームページ上に表示したい地図の領域に近い場合に、地図を動かす作業が少なくて済みます。

## アドオンは公開準備中
concrete5 のアドオンとして、公式サイトで公開に向けて準備中です。しばらくお待ちください。
アドオンの実際の活用例は、[伏見駅から名古屋広小路伏見中駒ビルへの道のり](https://rescuework.nagoya/blog/fushimi4)です。
Pingendo というBootstrap 4 ベースのプロトタイピングツールが良い


![image](https://qiita-image-store.s3.amazonaws.com/0/89911/2c0962e1-0a06-eebc-811a-f1c56cbc11a0.png)

https://pingendo.com/

- 動作環境
    - Windows(筆者環境), MacOS, Linux

社内でアプリ開発がありプロトタイプ作成のため色々ツールを探していたのですが、同僚が教えてくれたBootstrap 4 ベースのPingendoが良かったので紹介します。Pingendoのオススメポイントは主に以下の3つです！

- ドラッグ & ドロップでUIパーツを配置
- Bootstrap 4 ベースの豊富なUIパーツ
- アプリ内での高いカスタマイズ性

以下詳細を見ていきましょう。

## ドラッグ&ドロップでUIパーツを配置

Pingendoの画面構成は以下のとおり。

![image](https://qiita-image-store.s3.amazonaws.com/0/89911/913d68a8-621b-2f99-84bd-f7cd5abc85ec.png)

画面左にUIパーツ、中央にプレビュー、画面下にコード（デフォルトでは最小化）、画面右はテーマという配置です。レイアウトは洗練されているので使う時は迷うことないかと思います。

私が感動したのは左のメニューからコンポーネントを配置する際の手軽さです。動画で見ればすぐ解るかと思います。

![pingendo-dandd.gif](https://qiita-image-store.s3.amazonaws.com/0/89911/b8878342-e4bc-7f19-ab6a-38825c8802d6.gif)

こういった具合にポンポンと好きなコンポーネントを配置できます。何より素晴らしいのはメニューを表示すると縮小化されたサンプルが一覧で見れる点です。

## Bootstrap 4 ベースの豊富なUIパーツ

Pingendoには Bootstrap 4 のCSSクラスを使ったコンポーネントが豊富に用意されています。

![pingendo-parts.gif](https://qiita-image-store.s3.amazonaws.com/0/89911/c9c2ce27-d508-dd67-7334-09e796bd8d79.gif)

大まかに以下のカテゴリに分けられています。

- SECTIONS セクション
- GRID グリッド
- TEXT テキスト
- BUTTONS ボタン
- NAVS ナビゲーション
- MEDIA メディア
- LISTS リスト
- CARDS カード
- FORMS フォーム
- OTHERS その他

SECTIONS をはじめ、それぞれ Bootstrap のパーツを組み合わせて既に利用しやすいテンプレートに仕立て上げられているので、組み合わせるだけでランディングページなどは爆速で作ることができます。

## アプリ内での高いカスタマイズ性

用意されたコンポーネントも豊富なのですが、Pingendo はコンポーネントを画面に配置したタイミングでHTMLも同時に生成してくれます。

![pingendo-html.gif](https://qiita-image-store.s3.amazonaws.com/0/89911/dd9f6aa5-d147-b36b-ea18-b9b2e0ac11d1.gif)

もちろんここからHTMLを直接編集してカスタマイズすることも可能です。

そして Bootstrap を利用していてよく言われる「Bootstrap臭さ」ですが、これは画面右端の THEME を編集することでスタイルをオリジナルのものに修正することもできます。下記の動画でボタンのスタイルがリアルタイムで変更されるのが確認できます。

![pingendo-theme.gif](https://qiita-image-store.s3.amazonaws.com/0/89911/6ee2202b-738f-8850-557e-147bf64ea8a6.gif)

## Pingendo 無料版の制限

便利で素晴らしいPingendoですが、無料版と有料版があり、無料版では以下の制約が存在します。

- 月5日間のアプリ利用制限
- Pingendoアプリ内でのロゴの表示

実質的な機能制限は現在ではほぼゼロなので、とりあえず使ってみて気に入ったら買ってみるのも手です。有料版はサブスクリプションで1ライセンス月$12、年払いなら月$9。

https://pingendo.com/
会社で少し盛り上がった Project Euler をやってみる 015

# Problem 015

> 2×2 のマス目の左上からスタートした場合, 引き返しなしで右下にいくルートは 6 つある.
> (↑「田」みたいな図形で左上の格子点から右下の格子点までのルート)
> では, 20×20 のマス目ではいくつのルートがあるか.

https://projecteuler.net/problem=15

---

# Answer 015 (Python)

```python3
import sys


class Problem15:

    def main(self, n):
        tensor = [list(range(n + 1)) for i in range(n + 1)]
        for i in range(n + 1):
            for j in range(n + 1):
                if i > 0 and j > 0:
                    tensor[i][j] = tensor[i-1][j] + tensor[i][j-1]
                elif i > 0:
                    tensor[i][j] = tensor[i-1][j]
                elif j > 0:
                    tensor[i][j] = tensor[i][j-1]
                else:
                    tensor[i][j] = 1
        print(tensor[n][n])


if __name__ == '__main__':
    num = 20
    if len(sys.argv) == 2:
        num = sys.argv[1]
    p = Problem15()
    p.main(int(num))
```
---

# (参考) Project Euler とは

[Project Euler](https://projecteuler.net/) はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。

サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。

また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
libTooling でソースコード（トークン）を文字列として取り出す

そんなに難しくないですが、よく忘れるのでメモです。

clang::FunctionDecl など、clang::NamedDecl のサブクラスであれば、次のメンバ関数が使えます。

- getNameAsString()
- getQualifiedNameAsString()

ただしこれらはシンボルとしての名前なので、例えば関数が定義されている付近のソースコードを文字列として取り出したいときはもう少し低いレベルのクラスたちを使います。

前提条件
----------

- clang 5.0.0
- RecursiveASTVisitor や DeclVisitor を使ってソースコードを解析するケースを想定しています。

登場人物
----------
### SourceLocation
翻訳単位 (TranslationUnit) 内での文字の位置を表すクラスです。
入力ソースファイルから引っ張られるヘッダファイルなどを全て結合した超巨大な文字列のインデックスのようなものです。
（内部的にはもっと効率良くメモリを使うためのIDですが）

### SourceRange
SourceLocation 2つをメンバ変数として持ち、範囲(begin - end)を表すクラスです。

### SourceManager
翻訳単位に関係するすべてのファイルを管理しているクラスです。
SourceLocation の位置と合わせて使うと、その場所の文字が得られる、という感じです。

### LangOptions
字句解析のための設定クラスです。
純粋なC言語として解析するか？MSVCとの互換性を持たせるか？といった情報を持ちます。

### Lexer
SourceRange, SourceManager, LangOptions を使って文字列をトークンに分割します。

SourceManager を得る
----------
実体は CompilerInstance クラスが持っています。
ただ、それ以外にも参照を持っているクラスがたくさんいるので、アクセスしやすいところから選んでも良いです。

- clang::CompilerInstance::getSourceManager()
- clang::ASTContext::getSourceManager()
- clang::Preprocessor::getSourceManager()

例えば CompilerInstance のインスタンスは ASTConsumer のコンストラクタへ渡されてきます。

SourceLocation や SourceRange を得る
----------
Token や Decl、MacroInfo など、何らかの定義を表すクラスは大抵 SourceRange を取得するメンバ関数を持っています。
関数名が統一されていないので注意が必要ですが、以下のような名前になっているのでエディタの入力補間などを利用しつつ探せると思います。

- getLocation()
- getLoc()
- getBeginLoc()
- getBegin()
- getLocStart()
- getEndLoc()
- getRange()
- getSourceRange()
- getDifinitionLoc()

文字列を取得する
----------
Lexer クラスを使います。
指定された位置の字句を解析し、識別子や演算子といったトークンとして正しい範囲を文字列として返してくれます。

```cpp
CompilerInstance& ci = /* ASTConsumer のコンストラクタなどから持ってくる */;
SourceManager& sm = ci.getSourceManager();

StringRef stringRef = Lexer::getSourceText(
    CharSourceRange::getTokenRange(/* SourceLocation または SourceRange */),
    ci.getSourceManager(),
    ci.getLangOpts());

std::string str = stringRef.str();
```

マクロは展開してくれないようです。内部的にはトークンがマクロであるかをチェックするような処理があるけど・・・。https://github.com/llvm-mirror/clang/blob/master/lib/Lex/Lexer.cpp#L882-L883
Preprocessor を使うのかな？未調査。

[おまけ] SourceLocation のファイル名・行番号・列番号・オフセットを取得する
----------
```cpp
auto ploc = sm.getPresumedLoc(/* SourceLocation */);
auto eloc = sm.getDecomposedExpansionLoc(/* SourceLocation */);

/* ファイル名 */ = ploc.getFilename();
/* 行番号 */ = ploc.getLine();
/* 列番号 */ = ploc.getColumn();
/* ファイル先頭からのオフセット */ = eloc.second;
```
【Swift】inputAccessoryViewがiPhoneXのホームボタンエリアに被る件を解決しようとする(XibでViewを作成した場合)

[コードでViewを作成した場合](https://qiita.com/sztk1209/items/0dd53237fe85473b925f)

チャットアプリなどでよく見かける
画面の下にずっと出ている入力欄を実装するとき
```inputAccessaryView```を使うと楽に実装できますが、
iPhoneXだとこの入力欄がホームボタンのエリアにかぶります。

<img width="30%" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/0388015c-4d31-f4d8-64b1-8885b46408ad.png">

これを解決する方法を探していました。
コードでViewを作成した場合はうまくいったのですが、
XibでCustomViewを作成した場合に色々模索した結果、
１つ方法を見つけたので記録として残しておきます。

まず下記のサイトを参考にしました。
https://medium.com/code-with-rohit/inputaccessoryview-and-iphonex-7b5547fe98da

##### 1. UseSafeAreaにチェックを付ける
![1.png](https://qiita-image-store.s3.amazonaws.com/0/219965/24f6dda1-be40-87c6-a62c-5ebcf03bd442.png)

##### 2. ViewのSafeAreaLayoutGuideのチェックを外す
![2.png](https://qiita-image-store.s3.amazonaws.com/0/219965/a1b60ae3-26cf-c2b0-018f-744103e33f6c.png)

##### 3. ContainerViewのSafeAreaLayoutGuideにチェックを付ける
![5.png](https://qiita-image-store.s3.amazonaws.com/0/219965/bc176b00-d267-c596-d9e1-78afda54577f.png)

#### 4. TextViewのbottom制約をSafeLayoutに変更する
![4.png](https://qiita-image-store.s3.amazonaws.com/0/219965/3f7aa220-dd65-53b8-43f2-0e1d9d0272d5.png)

結果がこうなりました。
<img width="30%" alt="1.1.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/792024b1-b34e-9245-732a-efb62de78c58.png">


色々試行錯誤してみましたがうまく行っていません。

最終的にCustomViewのコードを以下のようにすると、

```InputAccessaryView.swift

import UIKit

class InputAccessaryView: UIView {

    @IBOutlet weak var textView: UITextView!

    //!!!!!!!!!!BottomAnchorを調整!!!!!!!!!!!!!
    override func didMoveToWindow() {
        super.didMoveToWindow()
        if #available(iOS 11.0, *) {
            if let window = self.window {
                self.bottomAnchor.constraintLessThanOrEqualToSystemSpacingBelow(
                    window.safeAreaLayoutGuide.bottomAnchor, multiplier: 1.0).isActive = true
                
                self.backgroundColor = .lightGray
            }
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    
    func setup() {
        let view = Bundle.main.loadNibNamed("InputAccessaryView", owner: self, options: nil)?.first as! UIView
        view.frame = self.bounds
        self.addSubview(view)
    }
}
```

結果こうなりました。

<img width="30%" alt="1.3.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/bb7b7dd0-4894-0875-11b5-f140466a4bce.png">

参考サイト
https://stackoverflow.com/questions/46282987/iphone-x-how-to-handle-view-controller-inputaccessoryview
http://ahbou.org/post/165762292157/iphone-x-inputaccessoryview-fix

かぶる現象は解決しましたが、

・[LayoutConstraints] Unable to simultaneously satisfy constraints.がコンソールに出力される
・ホームボタンエリアの背景色が変わらない。(ViewControllerの背景色を変えることで変更は可能)


という問題がまだ残っています。

何か解決方法をご存知の方いらっしゃいましたら
教えていただけましたらうれしいです:bow_tone1:
bitFlyerのMACDを算出する

#概要
注文アルゴリズムの指標としてMACDを使いたかったが、該当するリクエストが無かったので直接算出してみた。

#参考にさせていただいたページ
- bitFlyerの価格情報の取得
  - [PythonでbitFlyerのBTCFXのローソク足を取得してみた](http://www.bitbityen.com/entry/2017/11/22/080000)

- EMAの計算
  - [Moving Averages - Simple and Exponential](http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages)

- numpyでのema配列の作成とmatplotlibでの描画
  - [PythonでMACDを計算する](http://utisam.hateblo.jp/entry/2015/06/21/170006)


#ソースコード

```python3:macd.py
# -*- coding: utf-8 -*-

#http://www.bitbityen.com/entry/2017/11/22/080000

import json
import requests
import datetime

if __name__ == "__main__":
    #ローソク足の時間(秒)を指定
    periods = ["60"]

    prices = [[] for i in range(len(periods))]
    dates = [[] for i in range(len(periods))]

    #クエリパラメータを指定
    query = {"periods":','.join(periods)}

    #ローソク足取得
    res = json.loads(requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params=query).text)["result"]

    #表示[UNIX timestamp, 始値, 高値, 安値, 終値, 出来高]
    i = 0
    for period in periods:
        print("period = "+period)
        row = res[period]
        length = len(row)
        for column in row[:length-100:-1]:
            column[0] = datetime.datetime.fromtimestamp(column[0]).strftime( '%Y-%m-%d %H:%M:%S' )
            prices[i].insert(0,column[4])
            dates[i].insert(0,column[0])
            print (column)
        i += 1

import numpy as np
from matplotlib import pyplot as plt

#http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages
def ema_m(prices,minutes):
    results = []
    mul = 2/(minutes+1)
    sma = sum(prices[0:minutes])/minutes
    for i in range(len(prices)-minutes-1):
        if i == 0:
            ema = (prices[i+minutes+1] - sma)*mul + sma
        else:
            ema = (prices[i+minutes+1] - ema)*mul + ema
        results.insert(0,ema)
    #要素数[サンプル数-分足数]のEMAを0から新しい順に格納
    return results

#http://utisam.hateblo.jp/entry/2015/06/21/170006

if __name__ == "__main__":
    macd = []
    ema10 = np.array(ema_m(prices[0], 10))#90
    ema26 = np.array(ema_m(prices[0], 26))#74
    for i in range(len(ema26)):
        macd.append(ema10[i]-ema26[i])#74
    x = np.arange(0, len(dates[0]))
    plt.figure(figsize=(10, 4)) # サイズは適当に調整
    plt.xticks(x[0:len(signal)])
    #plt.plot(x[:len(signal)], ema10[len(signal)-1::-1])
    #plt.plot(x[:len(signal)], ema26[len(signal)-1::-1])
    plt.plot(x[:len(macd)], macd[::-1])
    plt.show()
```

#備考
シグナルラインもemac(macd,9)で算出できるはずなので実装したかったが、上手くいかなかったので保留した。
DistributionNotFoundと言われた時のpip, distribute更新の注意点


[DistributionNotFoundエラーの対処方法](https://qiita.com/saicologic/items/90667c36f780cf6e2bb1)という記事にもあるように、pipを用いたpythonパッケージのインストールで次のようなエラーが返ってくることがある。

```
Traceback (most recent call last):

:  :  :  :  :  

  File "c:\python27\lib\site-packages\distribute-（バージョン）-py2.7.egg\pkg_resources.py", line 2655, in <module>
    working_set.require(__requires__)
  File "c:\python27\lib\site-packages\distribute-（バージョン）-py2.7.egg\pkg_resources.py", line 648, in require
    needed = self.resolve(parse_requirements(requirements))
  File "c:\python27\lib\site-packages\distribute-（バージョン）-py2.7.egg\pkg_resources.py", line 546, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: （見つからないパッケージ名）
```

エラーを見てみるに、distributeパッケージ(?)で欲しいパッケージが登録されていない、みたいな感じだと読み取れる。

上記の記事では、pip自体をupgradeして解決しているが、自分の場合は解決しなかった。
つまり、最新版のpipをインストールしているのにダメだった。

ただ、よくよく調べてみると（例えば[この記事](https://stackoverflow.com/questions/11098280/error-on-pip-install-upgrade-distribute)）、setuptoolsというパッケージがより上位にあり、これを最新版としないとpipやdistributeが最新版とならない。これで自分のケースは解決。

結論として、まず、上のエラー文にあるようなバージョンを確認する（←他のエラー時もバージョン情報により注意を向ける癖をつけるべきと感じた）。
それが、最新じゃなさそうな（同じパッケージ名でググってなんかもっと新しいバージョンのやつがある）とき、インストール関連のパッケージの更新を試みる。
その際、まずはsetuptoolsを更新。

```
pip install --upgrade setuptools
```

そして、distributeやpipを更新。

```
pip install --upgrade distribute
pip install --upgrade pip
```
Alibaba Cloudのアカウントをつくってみた

Alibaba Cloudのコミュニティーが[爆誕](https://alibabacloud.connpass.com/event/77066/)したようですが、とりあえずアカウントをつくってみました。

# アカウント登録
以下の情報を登録します。

* メール
* 携帯電話
* 氏名・住所・郵便番号
* クレジットカード
    * 免許証等の登録

クレジットカードの有効化のために、免許証等の写真をアップロードする必要があります。
ベストエフォートだとは思いますが、朝の3時半にアップロードしたら5時には有効化してもらえました。


# ECSを作成してみる

AWSでいうところの、EC2です。
[ECS クイックスタート (Linux)](https://jp.alibabacloud.com/help/doc-detail/25422.htm)を参考にECSを作成してみます。

## 1. キーペアの作成

インスタンスを作成する前に、東京リージョンにキーペアを作成します。

1. [Elastic Compute Service] - [キーペア管理] を選択
2. [Asia Pacific NE1 (Japan)]を選択
3. [キーペア作成]をクリック
4. [キーペア名]を指定
5. pemファイルが自動でダウンロードされる

## 2. インスタンスの作成

エキスパート向けで設定します。

|項目|設定値|
|:-----------------|------------------:|
|価格モデル|従量課金|
|データセンターとリージョン|アジア東北１（東京）ゾーンA|
|インスタンスタイプ|コンパクトタイプ ecs.xn4.small 1-core 1GB|
|ネットワークタイプ|VPC|
|ネットワーク帯域幅ピーク|1Mbps|
|OS|CentOS|
|ストレージ|Ultraクラウドディスク 40GB|
|セキュリティ設定|キーペア|
|インスタンス名|hogehoge|
|台数|1|

1. 上記を指定
2. [今すぐ購入]をクリック
3. [注文を確定する]をクリック

数分でインスタンスが起動します。

## 3. インスタンスへのログイン

```bash
$ ssh -i ダウンロードしたpemファイル root@パブリックIPアドレス
Welcome to Alibaba Cloud Elastic Compute Service !

[root@hogehogehoge ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
```

# 雑感

AWSと比べてよかったところ

- 全体的に、コンソール画面がすっきりしていて見やすい(AWS・Azure・GCPの中ならGCP似？)。
- ECS作成時の画面は1画面で構成が見渡せるところがよい。また構成変更に合わせて、時間単価が表示されるところもよい。
- AWSと名前が似ているので、AWSユーザーなら違和感なく操作できそう。

今後は他サービスもさわってみたいと思います。
さくらVPSのスイッチを利用してローカルネットワークを構成する

さくら VPS のスイッチを用いて L2 接続をして、次のような構成を作る手順メモ。書いておいてアレですが、実際にやるときは[公式のドキュメント](https://help.sakura.ad.jp/hc/ja/articles/206229941--%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEVPS-%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E6%8E%A5%E7%B6%9A%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B)を読んでください。

![68747470733a2f2f35336e696e67656e2e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031382f30312f73616b7572615f7670735f6e6170742e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/56771/b64e94da-079e-2ad3-9cee-ce189cffcfc4.png)


### 1. さくらVPS管理画面上でスイッチを作成する

とても簡単。すぐできる。

<img width="669" alt="68747470733a2f2f35336e696e67656e2e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031382f30312f73616b7572615f7377697463685f6372656174652e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/56771/364635e9-19dc-5958-35e3-f723d8ef0b12.png">


### 2. サーバーを停止する

作業対象サーバー内から shutdown コマンドでサーバーを停止する


### 3. 接続先スイッチ追加

接続先スイッチとして eth1 に先ほど作ったスイッチを指定する

<img width="677" alt="68747470733a2f2f35336e696e67656e2e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031382f30312f73616b7572615f7377697463685f73656c6563742e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/56771/1e845a24-dcfb-e3bb-52b1-e810a32b9f19.png">

### 4. サーバーを起動する

さくらVPS 管理画面からサーバーを起動する


### 5. IP アドレスの設定

次のように IP アドレスを割り当てた

* front01.eth1: 192.168.128.11/24
* back01.eth1: 192.168.128.111/24

### 6. front01 のネットワーク設定

back01 からインターネットに出るときは front01 を経由して外にでるために、front に NAPT 設定を入れる。
firewalld を使う場合以下のような形で設定する。


``` 
# firewall-cmd --get-active-zone
public
interfaces: eth0 eth1

# firewall-cmd --change-interface=eth0 --zone=external --permanent
success

# firewall-cmd --change-interface=eth1 --zone=internal --permanent
success

# firewall-cmd --get-active-zone
internal
  interfaces: eth1
external
  interfaces: eth0

# firewall-cmd --zone=external --add-masquerade --permanent
success
```


### 7. back01 のネットワーク設定

back01 はインターネットに晒したくないサーバーにあたるため、eth0 の自動起動をオフにしてインターフェースを落とす。今回は nmtui 経由でやった。また、このままだと back01 はインターネットに出られないため、gateway として front01 の back側 IP を指定した。諸々設定後、以下で動作確認して無事 global 側の IP アドレスでインターネットに出られていれば、うまく設定できたということになる。

 
<pre class="lang:default decode:true " >curl checkip.amazonaws.com
160.16.144.83 #=&gt; front01 の グローバル側 IP</pre> 

より安全側に倒すならばそもそも back01 の eth0 に作成したスイッチを指定し、 eth1, 2 には何も指定しない状態にしておくと、良さそうですが、インターネットに向いているインターフェースを eth0, 裏側のネットワークに繋がっているインターフェースを eth1 という命名規則にしたかったので、私は仕方なく上記のようにしています。
pandasで歪度(Skewness)と尖度(Kurtosis)を計算

## 歪度(Skewness)と尖度(Kurtosis)
歪度(Skewness) : 分布の非対称性を示す指標。値が正であると分布が右に伸びている。逆に負であると左に伸びている。

尖度(Kurtosis) : 正規分布を基準とした分布の鋭さの指標。正規分布の尖度を0と定義する場合と3と定義する場合がある。基準である正規分布の尖度よりも大きければ分布は尖っており、小さければ緩やかな分布である。

## pandasで歪度(Skewness)と尖度(Kurtosis)を計算
サンプルとしてsklearnのbostonを利用

```python3
import pandas as pd
from sklearn import datasets

boston = datasets.load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
var = 'DIS'

# Calculate Skewness and Kurtosis
print("Skewness :", df[var].skew())
print("Kurtosis :", df[var].kurt())
```

結果

```
Skewness : 1.0117805793009007
Kurtosis : 0.4879411222443908
```
Kerasを使ったCNNモデル(MNIST)

# Kerasを使ったCNNモデル(MNIST)

初投稿なのでDeepLearningチュートリアルでよくやる、MNISTをCNNで認識するモデルを書きました。[Github](https://github.com/iwasaki111/mnist/tree/master/CNN)

## 開発環境
- Python 3.6.4
- Keras 2.1.2
- tensorflow 1.4.1 (backend)

CPUでも十分学習動きます。


## モデル構造

モデルは5層の畳み込みと2層のMaxPoolingとなっています。
特に名前のついたモデルではなくニュアンスで作りました。

```python3:model.py
def prepare_simple_CNN_model(input_shape=(28, 28, 1), class_num=10):
    input = Input(input_shape)
    kernel_size = (3, 3)
    max_pool_size = (2, 2)
    
    cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(input)
    cnn = Dropout(0.1)(cnn)
    cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
    cnn = Dropout(0.1)(cnn)
    cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
    cnn = Dropout(0.1)(cnn)
    cnn = MaxPooling2D(pool_size=max_pool_size, strides=(2, 2))(cnn)
    
    cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
    cnn = Dropout(0.1)(cnn)
    cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
    cnn = Dropout(0.1)(cnn)
    cnn = Conv2D(64, kernel_size, padding='same', activation='relu')(cnn)
    cnn = MaxPooling2D(pool_size=max_pool_size, strides=(2, 2))(cnn)

    fc = Flatten()(cnn)
    fc = Dense(1024, activation='relu')(fc)
    softmax = Dense(class_num, activation='softmax')(fc)
    model = Model(input=input, output=softmax)
    
    return model
```

model.pyを実行するとモデルの構造を画像として保存します。

```
python model.py
```

## 学習
train.pyを実行すると学習が始まります。
バッチサイズやエポック数などをオプションで選択できます。
学習のエポックごとに学習したモデルが保存されます。(デフォルトでは'model/'配下)

```
python train.py
```

## 検証
model_path変数に学習済みモデルを指定し、predict.pyを実行すると認識率が表示されます。

```python3:predict.py
    model_path = 'model/MNIST_test_epoch_01_model.hdf5'
```
2エポック学習させると認識率は98.83%となりました。
適当に作った割には少しの学習でそこそこの認識率になりました。
学習時間はCPUで20分くらい。


## まとめ
DeepLearningのライブラリには必ず入っているMNISTのチュートリアルコードですが
モデルの保存や学習済みモデルでの検証など最初にやってみたくなることを盛り込んだつもりです。
興味あるモデルを気が向いた時に実装しようと思ってます。
最近はドメイン学習やMulti task学習に興味があるのでMNISTでの自己符号化器とクラス分類を組み合わせたモデルを書こうと思っています。→ [書きました](https://qiita.com/maiwa/items/7ea64fa6da1b37ca2a98)
コードや文章の間違い等ありましたらコメントお願いします。

以下、今回作成したモデル
![model.png](https://qiita-image-store.s3.amazonaws.com/0/237299/ddff131e-3e68-aead-eabb-44d6dcd54ac1.png)
cpコマンドを簡略化して表記する

`cp`をする際は、以下のようにソースとターゲットを指定するのが基本です。

`cp a.conf a.conf.bak`

この例のように、ファイル名の末尾に特定の文字を付けてコピーしたい場合には、
以下のように簡単に書くことが出来ます。

`cp a.conf{,.bak}`

`mv`でも同様です。
Alexaで「会話っぽい形」を成立させるためのサンプル発話3分類。

Alexaって「音声コマンド」でしかないのですが、そこなんとか「何となく会話できてる」感を出したい！
というのが人情、というか、クライアントのウケが良い、というか、がありますよね？ね？！

試行錯誤の結果、以下の3分類を念頭において「サンプル発話」を作成するとそれっぽくなりました。
悩んでる方の参考になれば。
一応言っておくと、これが完璧な回答、というわけではないです。

以下、[]がslotになります。

# 名詞を含む系
名詞をフックにしてコマンドを成立させる系。天気とか日の指定も名詞、扱いです。
[製品名]をおしえて
[製品名]の評判は？
明日の[サービス名]のおすすめは？
[昨日]のメニューを教えて
[雨]の日に使えるやつは？
みたいな感じ。
一番多いんだけど、単語の誤認が多いので難しい。
特に数字の発話認識は誤認が起きやすい感じがあるので、slotでの数字の扱いは可能な限り排除したいところ。

# 質問系
使ってる人が大雑把な質問を投げてくるのを想定、したケース。
これへの対応が広いと会話に奥行きが出そうだと思ってる。
ただ、ほぼ文章を丸ごと登録する感じになる。使われやすくするのが難しい。
[何ができるの]
[何を教えてくれるの]
[このスキルって何]
みたいな感じで投げやりな発話を受け止める。

# コマンド系
もうそのまんま。あれやってこれやって、系。
[前]の話に移動
[最初]から
これを含めるとスキルの遷移が複雑になりすぎるのでオススメしない。
sinatra erbファイル分割のすヽめ


sinatraはrubyのwebフレームワークであるが、Railsに比べ資料が少ない。
しかし、簡単なAPIサーバーなどを立てるためには非常に重宝する。
今回はsinatraである程度大きくなってしまったプロジェクトのために、erbファイルの分割について説明する。
renderの使い方を書いているページがなかった...(悲しかった

# テンプレート化
layoutとは名前の通りWebページ全体の共通のlayoutを示す。
layout.erbを作成し、header・footerなどのテンプレートを作成する。
また、@titleなどグローバル変数を引数として渡すことでtitleなども変更できる。

```ruby:app.rb
get '/' do
  @title = 'index'
  erb :index
end
```

```html+erb:index.erb
message
```


- テンプレートのファイル

```html+erb:layout.erb
<html>
<head>
  <title><%= @title %>:page</title>
</head>
<body>
  <header>....</header>
  <%= yield %>
  <footer>...</footer>
</body>
</html>
```
yieldの間の部分にerbファイルの中身が表示されます。

```
<html>
<head>
  <title><%= @title %>:page</title>
</head>
<body>
  <header>....</header>
  message
  <footer>...</footer>
</body>
</html>
```

# ファイル分割
renderを用いることによりファイルを分割し、役割ごとに簡潔に表記できる。
また、次のようなファイル構造の場合index.erbのようにrenderを用いて子供のファイルを呼び出せる。
データの参照関係については[locals](http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables)を用いてグローバルとの関係を分けることができる。
グローバルの値も参照できる。

- index.erb
- index
	- left.erb
	- center.erb
	- right.erb

```ruby:app.rb
get '/room' do
  @title = 'room'
  @list = List.all[0...5]
  erb :index
end
```
- 大枠のファイル

```html+erb:index.erb
<div class="row">
  <div class="col-4"><%= render :erb :'index/left'%></div>
  <div class="col-4"><%= render :erb :'index/center'%></div>
  <div class="col-4"><%= render :erb :'index/right'%></div>
</div>
```
- 分割された子ファイル

```html+erb:left.erb
<div class="menu">
  <ul>
    <% @list.each do |item| %>
      <li><%= item.name %></li>
    <% end %>
  </ul>
</div>
```
Cloud9でrails consoleエラーが出た時の解決までのプロセス

優しいCloud9さんに

```
rails console
```

で唐突に怒られた時に、結構ハマったので、解決までの道のりを記録しました。

# 事象
``` 
＄ rails console
/usr/local/rvm/gems/ruby-2.4.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:287:in `load': /home/ubuntu/.irbrc:5: syntax error, unexpected '^', expecting end-of-input (SyntaxError)
```

# 解決までのプロセス

## 1. お決まりのやつを疑う
- rails server動いてない
- dbをmigrateしてない
- rails testエラーがある
- スペルミスがある  
`rails console`のエラーとは直接関係無いものもありますが、
そもそも・・・みたいなところのおきまりのチェック事項です。

# 2. gemfileを疑う
gemファイルのバージョン指定に誤りが無いか確認してアップデート。

```
$ bundle update
```

## 3. gemfile.lockを疑う
gemfile.lockを削除してから再インストール。

```
$ bundle install
```

## 4. springを疑う

一旦止めてから、

```
$ spring stop
Spring is not running
```

余計な動きをしているpidが無いか確認。

```
$ ps aux | grep spring
ubuntu      4496  0.0  0.0 271692 17・・・
```

killコマンドで停止する。

```
$ kill -9 xxx
```
※Cloud9ではシグナル番号`-9`ではなく、`-15`。xxxにはpidを指定。

# 5. 迷走
ここでCloud9と関係ないローカル上のrvmとか、似たようなrails consoleのエラー（readlineのエラー）とかを疑い出してどハマりしてしまいました。

# 6. `.irbrc`を疑う

これ、そもそも何かgem的なやつだと思っていて`syntax-error`と言われても全然存在を疑っていなかったのですが、どうやらそもそもいらない子だったようなのでいなくなってもらいました。

```
rm /home/ubuntu/.irbrc 
```

これで解決しました。
【補足】
irbrcがいらないのではなく、なんかの拍子に生成してしまったこのirbrcファイルが本来rails consoleで読むべきirbrcファイルの邪魔をしていたので、削除したことによってデフォルトのirbrcファイルが正しく読み込まれて`syntax-error`が解消されたと解釈しています。このあたり詳しい方いらしたら補足コメントいただけると嬉しいです…。

# まとめ
公式リファレンスが大切と何度も納得していたのに、やっぱり日本語検索してしまうわけでして・・・今回も結局、Cloud9はシグナル番号が違うことや、irbcファイルが余計だったことを公式リファレンスで知ることが出来たので、公式リファレンスの検索や英語での検索をまずやってみようと思いました。


# 参照サイト
[Ruby on Rails tutorial - 3.6 高度なセットアップ - コラム 3.4. Unixのプロセス](https://railstutorial.jp/chapters/static_pages?version=5.1#sec-advanced_testing_setup)
[Cloud9 Support - Rails console not starting. Error in .irbrc file?](https://community.c9.io/t/rails-console-not-starting-error-in-irbrc-file/16132)
Alexaのカスタムスロットタイプ設定の単語登録で気をつけたい点。

いくらかハマったところがあるのでメモ。

- 「半角大文字アルファベット」の単語を登録してるが、Lambda側に来る文字列は「半角「小」文字アルファベット」にされてる。
- 全角日本語と半角アルファベット混在の単語「Helloこんにちは」のように登録しても、Lambda側に来るのは「Hello こんにちは」と半角スペース区切りが含まれる。
- 登録してない単語がなぜかスロットに当たったと判定される（基準が謎）
Raspberry PiとopenFrameworksで日本語TrueTypeFont

ofxTrueTypeFontUCを使ってRaspberryPi+openFrameworksで日本語を描画しようとしてみたけどうまく表示されず。

drawString内でconvToUTF32を使ってUTF-8から変換してるところを置き換えたら表示されたから、convToUTF32関数の問題っぽい。

``` C++:ofxTrueTypeFontUC.cpp
void ofxTrueTypeFontUC::drawString(const string &src, float x, float y){
  if (!mImpl->bLoadedOk_) {
    ofLog(OF_LOG_ERROR,"ofxTrueTypeFontUC::drawString - Error : font not allocated -- line %d in %s", __LINE__,__FILE__);
    return;
  }
  
  GLint index	= 0;
  GLfloat X = x;
  GLfloat Y = y;
  
  basic_string<unsigned int> utf32_src;//convToUTF32(src);
  utf32_src += 0x00003042;//あ
  utf32_src += 0x00003042;//あ
  utf32_src += 0x00003042;//あ

  int len = (int)utf32_src.length();
  int c, cy;
    
  while (index < len) {
    (...)

```

convToUTF32で受け取ってる文字列を試しに出力してみたら、なんとShift_JIS。

``` C++:ofxTrueTypeFontUC.cpp
static const basic_string<unsigned int> convToUTF32(const string &utf8_src){
  basic_string<unsigned int> dst;

  
  // convert UTF-8 -> UTF-32 (UCS-4)
  int size = utf8_src.size();
  int index = 0;
  for (int i = 0; i < size; i++) {
	  wchar_t c = (unsigned char)utf8_src[i];
	  printf("convToUTF32,%d: 0x%04x\n", i, c);
  }
  while (index < size) {
    (...)

```

```C++:ofApp.cpp
void ofApp::draw(){
  mainFont.drawString("hogeあぁい", 900, 100);
}
```

``` :出力
convToUTF32,0: 0x0068
convToUTF32,1: 0x006f
convToUTF32,2: 0x0067
convToUTF32,3: 0x0065
convToUTF32,4: 0x0082
convToUTF32,5: 0x00a0
convToUTF32,6: 0x0082
convToUTF32,7: 0x009f
convToUTF32,8: 0x0082
convToUTF32,9: 0x00a2
```

ofApp.cppをUTF-8で保存してあげるとうまくいきました。
Visual Studioでは、「名前を付けて保存」->「上書き保存」の右の小さい三角->「エンコード付きで保存」です。
![スクリーンショット 2018-02-09 01.10.09.png](https://qiita-image-store.s3.amazonaws.com/0/74419/7a17a032-bd86-e5a9-4165-8ede7c4c013b.png)
XenServerにFedora 27 Serverを導入する

# 1.はじめに
前回はwindowsを入れたので今回はFedoraを入れます。
目的はFactorioって言うゲームのマルチプレイ鯖を立てるためなのですが目的に比して導入がえらい戸惑ってしまったので少々覚書をしておきます。
# 2.使用したソフト
- Fedora 27 Server
- XenCenter
- Rufus

# 3.インストール

- ファイル共有をしてisoファイルを転送する方法を取るつもりだったが知力が足りず断念、また今度
 - XenCenterを入れてるPCでWindows共有してみたが￥￥自分のIP￥フォルダー名 でできなかったのはなぜか??
- Rufusを用いてFedoraのインストールディスクをUSBメモリーに作成する
- Fedoraをインストールする
 - ここでソフトウェアを何にも選ばずにインストールするとCUIになってしまうのでGUIが欲しい人はお気をつけて
 - 管理者のアカウントをインストール中に設定しておく
- インストールが終わったらXenCenterから起動し先ほど設定したアカウントでログイン

# 4.最後に

- Windowsのファイル共有を使わなかったのでそれはまた今度
- CentOSでファイル共有したらいいんじゃないかと勘案
- あと後々再編集します...
Puppeteer 1.0.0対応 ヘッドレスChrome逆引きクイックスタート

先日[Puppeteer 1.0.0][Puppeteer]がリリースされ、ちょっと話題になっていた(?)のと、ちょうどHeadlessChromeが気になっていたので、触ってみました。
バージョンアップによってAPIがすでに数ヶ月前のものと相違が出ており、ここで最新版に基づいて使い方をざっくりまとめてみようと思います。
使い始める際に概要を掴むためのクイックスタートに役立てば幸いです。
逆引きはにわかです。お手柔らかにどうぞ。


## レファレンス
[puppeteer API][puppeteer API]
[puppeteer release][puppeteer release]


## インストール
```terminal
mkdir try-puppeteer
cd try-puppeteer
npm i --save puppeteer
```

## テンプレート
読み込みから終了までのだいたいのテンプレートです。

```main.js
const puppeteer = require('puppeteer');

// 非同期処理
(async() => {
  
  // 非同期処理で前後の順番を保つには、awaitをいちいち使う
  const browser = await puppeteer.launch();  // ブラウザをHeadlessで起動
  const page = await browser.newPage();  // このpageに

  // * * *
  // pageに対して操作する
  // * * *

  browser.close();  // ブラウザを閉じる
})();
```
「pageに対して操作する」の前後は起動から終了までのテンプレートだと考えていいと思います。
確認等のためHeadlessモードを解除したい場合は

```js
puppeteer.launch({headless: false});
```
と指定してあげればウィンドウを開いて描画してくれます。
次からは目的別の操作です。

## Page操作

### URLを指定して開く
```javascript
await page.goto('https://twitter.com/qiugits');
```

### キーボード入力する
```javascript
await page.type('input[name="code"]', 'Hello');
```
第一引数はセレクタです。古いバージョンではまずフォーカスしてからtypeしていましたが、1.0.0では一つのコマンドで実行できます。

### クリックする
```javascript
await page.click('input[name="button"]');
```

### 読み込みを待つ
```javascript
await page.waitFor('input');
```
waitForはセレクタ、秒数、スクリプトのいずれかを受け取ることができ、それぞれの個別のメソッドもあります。
この場合、inputタグが現れるまで待つ、ということになります。

#### 複数の読み込みを待つ
```javascript
await page.waitFor('.success, .error');
```
わかってみればなんということないですが、`.success`と`.error`のどちらかが読み込まれるのを期待する場合、このように書くことができます。賢い！
参照：[page.waitFor](https://github.com/GoogleChrome/puppeteer/issues/709)

### セレクタに当てはまる要素の有無を確認
```javascript
if (await page.$('div.errmsg')) { /* do something */ }
```
自分はif分に投げるために使ってました。
複数の場合はドルを二つにします`$$`。

### セレクタに当てはまる複数要素を処理
```javascript
if (await page.$$eval('input', inputs => inputs.length) == 2) { /* do something */ }
```
この場合、inputsが2つあることを確認するのに使えます。

### 要素の内容を文字列として取得
```javascript
const out = await page.evaluate(() => document.querySelector('.errmsg').innerText);
console.log(out);
```
この方法がなかなか見つけ辛くて苦労しました。
`.innerText`と`.textContent`という2通りの方法があります。
前者の方が基本的に読みやすいテキストが帰ってくるのに対して、後者は空白をそのまま返してくるので、適宜使い分けてください。
参照：[page.select](https://github.com/GoogleChrome/puppeteer/issues/489)

### スクリーンショット
```javascript
await page.screenshot({path: './screenshot.png', fullPage: true});
```
スクリーンショットを保存します。
できるだけ絶対パスを投げてあげると良いでしょう。


---
自分が使っていくに従ってアップデートはするつもりですが、含めて欲しい・含んだ方がいいよというもの、あればコメントください。



[Puppeteer]: https://github.com/GoogleChrome/puppeteer
[puppeteer API]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageselectselector-values
[puppeteer release]: https://github.com/GoogleChrome/puppeteer/releases
OpenShiftOnline3 設定

[前回](https://qiita.com/miawak2017/items/a99e3b9d8a3c8cd25b4b) はOpenShift上にNode.js環境を作るだけつくってみましたが、いろいろと設定するところがありそうなのでまた手探りで見ていこうかと思います。

#Applications 設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/db432c75-92a2-5d54-c00c-fbf3fa3ddd45.png)
アプリに関する設定のようです。一つ一つ見てみます

##Deproyments
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/20c5df49-62c4-4019-c503-a0ebbb5ee25b.png)
作成したアプリのデプロイがここでできそうです。

##Stateful Sets
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/d42b2989-f237-4677-1810-280aebbc7b26.png)
この設定については不明で確認が必要です。

##Pods
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/0895dcc8-5423-da1e-5357-3f7c9ea7d43f.png)
Running と表示されています。ここで稼働中、停止中などステータスが確認できます。

##Services
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/10bcf31f-1422-5415-7e31-9b405c32eb3e.png)
サービス提供中のIPアドレスやポートを確認、設定できるようです。

##Routes
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/31c5b66a-ff07-2064-5854-77313dd55c5b.png)
HostName にURLが記載されています。

#Builds 設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/5a289da7-3ccb-8158-bf04-580d0601312c.png)
ビルド設定についてのようです。

##Builds
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/0bc182a0-4b64-4ff9-26c9-963752622b72.png)
build完了のステータスが見えます
ソースとなるGitのURLについての記載があります。

##Pipelines
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/a0ca3c8c-b70a-d2f2-0acb-1ae6bc01df27.png)
？
Jenkins関連のプラグインを定義し使う設定のようです。

##Image Streams
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/60d48c49-0fec-5de6-56f0-45790181319f.png)
Dockerのレポジトリの所在やイメージの保存領域についての情報について表示されているようです。

#Resource 設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/014126db-8c28-b554-9bee-803146f20e76.png)
アプリ動作環境のサーバリソース状況についての設定項目のようです。

##Quota
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/2ceac378-d172-8c42-71ce-3dd69bc3193b.png)
CPU,MEMORYといったリソースの状況が出ています。
すでにLimitに達しているのか注意の表示が出ています。

##Membership
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/f9303c48-078c-c5ea-1c61-4e68060b03ad.png)
アカウント関連の設定のようです。

##Config Maps
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/a1c18bed-86c9-b446-062a-a37af2e06613.png)
設定ファイル作成に関連する設定のようです。

##Secrets
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/4389adaa-a2cf-9afa-703e-21b5a1809cbd.png)
Docckerの設定や各々のトークン設定について表示されています。

##Other Resources
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/ab0154df-1939-555f-0e74-e4337c95eb88.png)
その他のリソース（Job、Network Policyなど）の設定について表示されています。


設定項目について単語レベルでわからないものも多いです。
ところどころに”Learn More”と設定についてマニュアル/ガイダンスへのリンクが備わっています。
ひと通り見たところ表示が基本的に英語というのもあり難解な印象があります。
How to contribute to Bitcoin core

# Intro
* This article is just simple summary of [Bitcoin core contribution guid](https://bitcoincore.org/en/faq/contributing-code/).

# Concept
* Open contributor model ... anyone is welcome to contribute

# Role
* Maintainer ... In charge of merge PR
* Lead Maintainer ... In charge of release cycle

# Workflow
1. Fork
2. Create branch
3. Commit ... should be atomic and easy to read
4. Push to my fork repos
5. Create PR
6. Review
7. Fix review

## Commit message
* 50 chars max
* Blank line
* Details should be separate paragraph
* Be helpful to committer in the future
* Should be use refs #1234, or fixes #4321

## PR
* Use prefix
Consensus: Add new opcode for BIP-XXXX OP_CHECKAWESOMESIG
Net: Automatically create hidden service, listen on Tor
Qt: Add feed bump button
Trivial: Fix typo in main.cpp
* [WIP] or Task List means not to be merged yet.
* Should be contain justification/reasoning in PR body and reference of discussion.

## Before merge
* Ask to maintainer if need to squash or rebase.

# PR Philosophy
* Patch set should be focused, not be mixture.
* Avoid super PR

## Feature(and bug fix)
*  If a new feature would be added, long term maintenance is needed.
* The feature without a maintainer will be removed by Repo Maintainer.

## Refactoring
* Do not mix these three kinds of activities.
    * Code only to move
    * Code to fix style
    * Code to refactor
* Uncontroversial
* Must not change behavior of code
* Uncomplex and easy to verify

# Decision Making process
* Project merge maintainer and lead in charge of PR mergeing.
    * If PR in on line with the general principle of project.
    * If it meet the minimum standard of inclusion.
    * General consensus of contributor.
* Minimum criteria for decision
    * Have a clear use case
    * Be well peer review
    * Have appropriate test
    * Follow code style guideline
    * Not break the existing test
    * Demonstrating the bug and proving the fix, where possible.
* Conversation on mailing list.
* Have a numbered BIP

## Peer review
* Anyone would comment in PR, using follows.
    * ACK means “I have tested the code and I agree it should be merged”
    * NACK means “I disagree this should be merged”
    * utACK means “I have not tested the code, but I have reviewed it and it looks OK, I agree it can be merged”
    * Concept ACK means “I agree in the general principle of this pull request”
    * Nit refers to trivial.
* It may set the high bar, when patch will affect consensus critical code.
* It must be discussed extensively using mailing list or IRC, when patch will change consensus.

# Release Policy
* Project leader is the release maintainer.
ひらがな→カタカナ変換(Swift)

Swiftでひらがな→カタカナ変換するStringのextensionを実装しました。

## 環境

- OS：macOS High Sierra 10.13.1
- Xcode：9.2 (9C40b)
- Swift：4.0.3

## 実装

`applyingTransform(_:reverse:)` メソッドを使います。

```swift:String+Transform.swift
import Foundation

extension String {
    // MARK: Public Methods
    
    // ひらがな→カタカナ
    public func hiraganaToKatakana() -> String {
        return self.transform(transform: .hiraganaToKatakana, reverse: false)
    }
    
    // MARK: Private Methods
    
    private func transform(transform: StringTransform, reverse: Bool) -> String {
        if let string = self.applyingTransform(transform, reverse: reverse) {
            return string
        } else {
            return ""
        }
    }
}
```

続いてテストコードです。

```swift:StringTransformTests.swift
import XCTest

class StringTransformTests: XCTestCase {
    // MARK: Test Methods
    
    // MARK: hiraganaToKatakana
    
    func testHiraganaToKatakanaAll() {
        checkHiraganaToKatakana(
            before: "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゐゆゑよわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽゔぁぃぅぇぉっゃゅょゎ",
            after: "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤヰユヱヨワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴァィゥェォッャュョヮ"
        )
    }

    func testHiraganaToKatakanaHalfwidthKatakanaAll() {
        // なぜか半角ｶﾅが全角カナに変換される
        checkHiraganaToKatakana(
            before: "ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾜｦﾝｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾋﾞﾌﾞﾍﾞﾎﾞﾊﾟﾋﾟﾌﾟﾍﾟﾎﾟｳﾞｧｨｩｪｫｯｬｭｮ",
            after: "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴァィゥェォッャュョ"
        )
    }
    
    func testHiraganaToKatakanaScramble() {
        checkHiraganaToKatakana(
            before: "testテストてすと検証けんしょう",
            after: "testテストテスト検証ケンショウ"
        )
    }

    // MARK: Private Methods
    
    private func checkHiraganaToKatakana(before: String, after: String) {
        XCTAssertEqual(before.hiraganaToKatakana(), after)
    }
}
```

## 備考

`reverse` に `true` を渡すと、カタカナ→ひらがな変換になります。

`transform` の値を変えると、他にも様々な変換ができます。
たとえば `.fullwidthToHalfwidth` を渡すと全角→半角変換になります。

## 参考リンク

- [applyingTransform(_:reverse:) - NSString | Apple Developer Documentation](https://developer.apple.com/documentation/foundation/nsstring/1407787-applyingtransform)
- [iOSで半角から全角へ変換したり、ローマ字からひらがなに変換したりする - 酢ろぐ！](http://blog.ch3cooh.jp/entry/20120619/1340100077)
SSHのX11ポートフォワーディングで日本語入力を有効にする方法

SSHのX11ポートフォワーディングで日本語入力を有効にする方法についてまとめます。

# 前提
サーバー・クライアントともにUbuntuが入ってるとします。

# サーバー側の設定
1. クライアントで用いているインプットメソッドをインストールします。
2. `/etc/ssh/sshd_config`に以下の記述を追加します。
   
    ```/etc/ssh/sshd_config
    AcceptEnv XMODIFIERS
    ```

1. `sudo systemctl restart sshd`コマンドを実行し、sshdを再起動します。

# クライアント側の設定
1. `/etc/ssh/ssh_config`に以下の記述を追加します。
   
    ```/etc/ssh/ssh_config
    SendEnv XMODIFIERS
    ```
Vimの正規表現メモ #1

行頭がdiffで始まっていて行末が .cpp, .c, .h でない行にmatchするVimの正規表現。

```vim
^diff \%(\%(\.\%(cpp\|c\|h\)$\)\@!.\)*$
```

以下help参照。

```vim
:h \@!
```

その他helpは以下参照。

```vim
:h /^
:h /\%(
:h /\.
:h /\|
:h /.
:h /*
:h /$
```
AWS Cognitoでユーザ作成時に手間のかかる承認処理を自動で処理するには

#AWS Cognitoとは
AWSでユーザ管理、フェデレーションなどを簡単に実施可能なとても便利なサービスです。
ID連携とかもできるので、今後も色々利用していきたいです。

#マネジメントコンソールでのユーザ管理
ユーザ作成、インポート、パスワードリセットなど、基本的なことは
AWSのマネジメントコンソールで実施可能です。
但し、使用可能なユーザをすぐに作成するには、少しステップが必要です。

#ユーザの承認
Cognitoのユーザは、以下に記載のとおり、ステータスを持ちます。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/signing-up-users-in-your-app.html

マネジメントコンソールでユーザを作成した場合、ここでいう
"Registered(cannot sign in)"
の状態になります。

Cognitoにサインインできるようにするには、いずれかが必要です。
１．Email／TELによる承認
２．管理者による承認
３．LambdaでPreSignupイベントをトリガーとして承認

はい、ということでタイトルにつながります。
「３」を実施することで、マネジメントコンソールでユーザ作成すると同時に、
サインインが可能とすることができます。

#どういうことか
マネジメントコンソールでユーザが作成されると、"Pre-Signup"イベントが発生します。
そのイベントをトリガーに、Lambdaが実行されるようにします。
（Cognitoのユーザ作成処理をフックするイメージです）

そして、Lambdaでユーザの承認ステータスを変更することで、
Cognitoはユーザが承認されたと判断し、ユーザがすぐ利用できるようになる、ということです。

#Lambdaを作る
では、Lambdaを作ります。
Cognitoで作成されたユーザのイベントデータを変更し、Cognitoに返してやります。

```
var AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
    var confirm = {
        "autoConfirmUser": true,　// 承認ステータス変更
        "autoVerifyEmail": true　 // Emailを検証済みとする
    };
    event.response = confirm;
    context.done(null, event);
};
```

承認ステータスだけでもOKです。
Emailとかも一緒に検証済みにしてしまいたい場合は、一緒にできます。

#Cognitoイベントに設定する
Cognitoのユーザープール内で「トリガー」－「サインアップ前」を確認し、
先ほど作成したLambdaを選択します。


以上でOKです。簡単ですね。
これで、Cognitoのユーザ管理が楽になりました。
Unity(WebGL)から簡単にGyazoAPIを使って画像をアップロードする

# 0.まず
技術的なところは[ここ](https://qiita.com/divideby_zero/items/8109a508afe91fee82ac)に書いたので、それを簡単に使えるように https://github.com/divide-by-zero/GyazoUploader にまとめました。

以下、使い方になります。

**注意：Unity2017.3以降じゃないと動きません**

# 1.GyazoAPIのAccessToken取得
は、 [この通りに](https://qiita.com/divideby_zero/items/8109a508afe91fee82ac#gyazo%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%99%BB%E9%8C%B2accesstoken%E3%82%92%E5%8F%96%E5%BE%97)。　

# 2.Unity側準備
https://github.com/divide-by-zero/GyazoUploader/releases から、GyazoUpload.unitypackageをダウンロードして、使いたいプロジェクトにインポートしてください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37184/0afc4de3-1396-f036-02a1-c2d927308971.png)

適当なシーンにGyazoUploader/Prefabs/GyazoUploadManager を配置
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37184/a696bcfe-ba39-b7d0-e11f-08c9c5f91f0d.png)

**※空のGameObjectを配置して、GyazoUploader/Scripts/GyazoUploadManager.csを自分でアタッチしても良いです**

inspectorの**AccessToken**に、1.で取得したAccessTokenを記入。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37184/c18b9ef4-39dc-434c-15d8-ed23a23fb959.png)

**Is Debug Log Output** はチェックを入れると微妙に通信のログが出力されます。デバッグ時にどうぞ。

# 3.さぁ、画像をアップロードしよう
`GyazoUploader`を使って実際に画像(ScreenShot)をアップロード出来ます。

例えば、画面をクリックした瞬間のスクリーンショットを取得してアップロードそアップロード結果をブラウザで表示するのであれば以下のように書きます。

```csharp
using DivideByZero.Gyazo;
using UnityEngine;

public class GyazoUploadTest : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            var uploader = new GyazoUploader();
            uploader.UploadScreenShotAsync((response, error) => {
                if (string.IsNullOrEmpty(error)) //errorがnullなら正常終了
                {
                    Application.OpenURL(response.url); //とりあえずブラウザで開く
                }
            });
        }
    }
}
```

この`UploadScreenShotAsync`は勝手にスクリーンショットを取得してjpgデータにしてgyazoにアップロードまでしてくれます。**やったね。**
なお、アップロード結果はコールバックの１つ目のresponseに色々と入っています。（詳しくはソースを見てね！！）
また、コールバックの２つめのstringにはエラー内容で、正常時はnullなので成否判定に使ってください。
（例では`string.IsNullOrEmpty`使ってますが、ただのnullチェックでもいいはず）

大体の用途はこれだけで済みそうですが、自分で加工したjpgデータなんかも送リたい場合は`UploadJpegByteDataAsync`で、byte[]を渡せれるようになっているので、そちらを使用してください。


#4.オススメな使い方
上記のコールバック形式でもいいんですが、１つコルーチンで囲う方が直感的(UnityEngine.WWWと同じ使い方）なので、オススメです。

```csharp
using System.Collections;
using DivideByZero.Gyazo;
using UnityEngine;

public class GyazoUploadTest : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            StartCoroutine(UploadIterator());
        }

    }

    private IEnumerator UploadIterator()
    {
        var uploader = GyazoUploadManager.CreateGyazoUploader();    //これでも作れるけど new GyazoUploader()の方が短いって言う・・・
        yield return uploader.UploadScreenShotAsync();  //待機可能

        if (uploader.IsError)
        {
            Debug.Log(uploader.ErrorMessage);   //エラーメッセージ表示
        }
        else
        {
            Application.OpenURL(uploader.Result.url);
        }
    }
}
```

エラー有無は `IsError`プロパティ
エラー内容は `ErrorMessage`プロパティ
成功時の結果は `Result`プロパティ

に格納されます。便利ー。

#ぼやき
これで、gyazo側がtwitterカードに対応してくれたりすればtwitter共有した時なんかにリンクを開かなくても画像が見れて良いんですけどねー。

ではでは。
caesar暗号。１０世紀経てば５行。

### ただシフトするだけ。
```js
const caesar = function(str, amount) {
  const a= (amount < 0)? amount + 26:amount
  ,fc=String.fromCharCode
  ,fn=( d=>((d >= 65) && (d <= 90))?fc(((d - 65 + a) % 26) + 65):fc(((d - 97 + a) % 26) + 97) )
  ;
  return str.split('').map( d=>(d.match(/[a-z]/i) )?fn(d.charCodeAt(0)):d ).join('')
}
;
```
### 日本語やウムラウトはbase64する。
```
fn._btoa =function(str){return btoa( unescape(encodeURIComponent( str )) )}
fn._atob =function(str){return decodeURIComponent( escape(atob( str )) )} 
```

### デモ
```js
let fn={};
fn._btoa =function(str){return btoa( unescape(encodeURIComponent( str )) )}
fn._atob =function(str){return decodeURIComponent( escape(atob( str )) )} 
fn.caesar =function(str, amount) {
  const a= (amount < 0)? amount + 26:amount
  ,fc=String.fromCharCode
  ,fn=( d=>((d >= 65) && (d <= 90))?fc(((d - 65 + a) % 26) + 65):fc(((d - 97 + a) % 26) + 97) )
  ;
  return str.split('').map( d=>(d.match(/[a-z]/i) )?fn(d.charCodeAt(0)):d ).join('')
}
;
fn.ce=(d=>document.createElement(d))
;
let t =fn.ce('textarea')
,r1 =fn.ce('pre')
,r2 =fn.ce('pre')
,s =fn.ce('style')
,sol =(d=>Promise.resolve(d))
;
s.innerHTML=`*{box-sizing:border-box}
body{margin:0;display:flex;width:100vw;height:100vh;flex-direction:column;}
textarea,pre{border:2px solid;width:100%;padding:1rem;flex-grow:1}
textarea,pre{white-space:pre-line;word-wrap: break-word;}`
;[s,t,r1,r2].forEach(d=>document.body.appendChild(d));
t.oninput =on
;
function on(ev){
 let v=this.value;
 sol(v).then((d)=>{ 
    let shift=21,de=fn.caesar( fn._btoa(d) ,shift)
    r1.innerText= de;
    r2.innerText= fn._atob( fn.caesar(de,-1*shift) )
 })
}
```