OmniAICreator/Qiita-1.07M huggingface dataset:
CodeClimateでtslintを試す

## CodeClimate

lintとかに引っかかると自動でコードレビューみたいな感じにできる。
![example-tslint-in-codeclimate_index_ts_at_master_·_nju33_example-tslint-in-codeclimate.png](https://qiita-image-store.s3.amazonaws.com/0/84144/26a2f36e-e563-4d40-4c6a-b1aaf8d85023.png)

## `tslint.json`を適当に作る

```json:tslist.json
{
  "defaultSeverity": "error",
  "extends": ["tslint:recommended"],
  "jsRules": {},
  "rules": {
    "quotemark": [true,"single",],
    "comment-format": false,
    "indent": [true, "spaces", 2]
  },
  "rulesDirectory": []
}
```

## 適当にlintに引っかかる`.ts`ファイルを作る

```ts
class A {
  something(): void {
    console.log('test');
  }
}

const a = new A();
const something: string = a.something();

```

## `.codeclimate.yml`をプロジェクトルートに置く

```yaml:.codeclimate.yml
---
engines:
  tslint:
    channel: beta
    config: tslint.json
    enabled: true
exclude_paths:
  - node_modules
ratings:
  paths:
    - "**.ts"

```
## CodeClimateのページから対処のリポジトリを「Add Repo」する

![Code_Climate.png](https://qiita-image-store.s3.amazonaws.com/0/84144/63bf9a8a-c4d5-a47d-9a54-602b901256fd.png)

## プッシュしたら走った！

![nju33_example-tslint-in-codeclimate_-_Code_Climate.png](https://qiita-image-store.s3.amazonaws.com/0/84144/e5d7196c-0840-2f15-13f3-665333e1a431.png)

![Issues_-_nju33_example-tslint-in-codeclimate_-_Code_Climate.png](https://qiita-image-store.s3.amazonaws.com/0/84144/14bf6c87-27e2-2574-6d42-073e4385b172.png)

## 思ったこと

まだ`tslint-config-xxx`が使えなかったり、既にあるプロジェクトに入れてみたら

```
codeclimate validate-config
error: (NoMethodError) undefined method `keys' for "tslint.json":String
```

と言われたり（ローカルではこんなエラー起きずに終わるし、結局直し方分からなかった）するので、Typescriptで使うのは厳しいと思った。

---

追記
なんか色々勘違いしてるけど気にしないで‥
C# Entity SCOPE_IDENTITY()をExecuteSqlCommandで取得する方法


#C# Entity ExecuteSqlCommandでSCOPE_IDENTITY()を取得する

##課題
SQLServerでIDなどIdentityを設定してあるテーブルに、Insert時に採番されるIDをInsertと同時に取得しようとすると、SCOPE_IDENTITY()を使用すると思いますが、
ExecuteScalar()などを利用すると、戻り値で採番されたIDを受け取れるがEntityのExecuteSqlCommandだと戻り値では受け取れない。

##パラメータでの受け取り
ExecuteSqlCommandにパラメータを渡し受け取る方法だと実現が可能。

##サンプル
```c#:sample.cs
string sql = "Insert ・・・・・・・・
values
・・・・・・・・);
Select SCOPE_IDENTITY()";

var a = Database.ExecuteSqlCommand(sql);
```

この時のaに**SCOPE_IDENTITYが入ってこない**。ま～当たり前なんですが・・・

これを、Parameterで受け取るようにすると、

```c#:sample.cs
string sql = "Insert ・・・・・・・・
values
・・・・・・・・);
Select @MyID = SCOPE_IDENTITY()";

SqlParameter parm = new SqlParameter() {
 ParameterName = "@MyID",
 SqlDbType = System.Data.SqlDbType.int,
 Direction = System.Data.ParameterDirection.Output
};

Database.ExecuteSqlCommand(sql, param);
int IdentityID = (int)param.Value;
```

これで取得することができます。
サンプルとして。
GitHub のリポジトリに飛ぶための Chrome 拡張機能をつくりました。Octojump

ただ GitHub のリポジトリに飛びたい。

# つくった理由

仕事で、いろんなプロジェクトの GitHub のリポジトリにいく必要がありました。リポジトリに飛ぶためには、主に以下の方法がありました。

1. ブックマークしておく
2. chrome のアドレスバーの検索履歴から飛ぶ
3. Alfred Powerpack を使う

最初は、ブックマークにいれておくという地味なことをしていました、数がおおくなってくるとブックマークから探すのが大変になりました。
続いて、検索履歴から飛ぶ方法でやっていました。多くの人はこの方法かと思っております。が、これだと、ちょっと思った履歴がでてきてくれないシーンがあってちょっとつらかったです。

そして、3の方法は一番クールな方法だと思います。ぼくの隣にいらっしゃるCTOとかはこれを普通につかっています。料金は、£19 です。これをつかえば、当記事の拡張機能 Octojump よりも優れていると思いますので、とてもおすすめです。

**でも、お盆休みだし、JSの勉強にもなるし、£19を入金するのもめんどうだし。お盆休みの自由研究としてつくってみようと思いました。**

# つくった拡張機能のイメージ

![octojump.gif](https://qiita-image-store.s3.amazonaws.com/0/45822/25a5e6df-c3f9-cd00-f433-773184521358.gif)


# 機能について

- 「拡張機能マークをクリックする」 or 「Ctrl + K」 で、検索ポップアップがでます。
- インクリメンタルサーチで、リポジトリを検索できます。
- ユーザー名とリポジトリ名の間は、半角スペース、または、スラッシュ `/` で区切って検索できます。
- Enter を押すことで、フォーカスされているリポジトリに飛びます。
- 初回の使用時には、GitHub の access token が求められます。([こちら](https://github.com/settings/tokens)から取得可能）

# オープンソースです

![octojump-128.png](https://qiita-image-store.s3.amazonaws.com/0/45822/9f42dc95-8c95-dc30-f17b-9359a6bbe1be.png)

GitHub
https://github.com/mochizukikotaro/octojump/

Chrome 拡張機能
https://chrome.google.com/webstore/detail/octojump/ipddbipniemmmklkjabimbmnaejmnngn

# バグ & まだ無い機能

1. Down で下に進んでいき画面から外れるときに、スクロールがついてこない
2. ctrl + P / N で 上下移動をさせたい
3. Down / Up の長押しに対応したい
4. よく使うリポジトリを上位表示させたい
5. リファクタリングもできるところは沢山あると思います


# これから

社内や、Qiita などで、公開して、もしかしたら誰かが使ってくれたりしたら嬉しいです。Issue や PullRequest とかがもらえるように、頑張りたいと思います！


ありがとうございました。☘️
とっとるびー第27回で実施するハンズオン「Ruby on Rails 5.1 + Vue 2.4」で使用するDockerコンテナの準備方法

簡単なチャットを作ります。

## Dockerのインストール

* まずはDockerをインストールしてください。
* 下記はmacOSでのDockerのインストール方法の例です。

```bash
$ brew cask install docker
```

## Dockerイメージの取得

* 今回のハンズオンで使えそうなDockerイメージをすずむらさんがハケーンして下さいましたのでこれを使います。
* 下記のコマンドでDockerイメージを取得します。

```bash
$ docker pull sweorg/xenial-ruby2.2.2-node6.9.1-yarn0.22.0:v1
```

## Dockerコンテナの作成と起動

* 下記のコマンドでイメージ一覧を表示して上記で取得したイメージのIDを確認します。
* この例では `c265f8fbaaba` が確認できます。

```bash
$ docker images                         
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
sweorg/xenial-ruby2.2.2-node6.9.1-yarn0.22.0   v1                  c265f8fbaaba        7 weeks ago         1.04GB
```

* 下記のコマンドでローカルに今回のハンズオンで使用するディレクトリ `hands-on-with-rails-and-vue` を作成してください。このディレクトリをDockerコンテナにマウントしてソースコードの編集を行います。
* 以下の例では `/Users/masayuki/hands-on-with-rails-and-vue` にディレクトリを作成しています。

```bash
$ cd
$ mkdir hands-on-with-rails-and-vue
$ cd $_
$ pwd
/Users/masayuki/hands-on-with-rails-and-vue
```

* イメージからコンテナを作成して起動します。
* `-p` オプションによるポート3000と8080のフォワーディング設定は、それぞれrails serverとbin/webpack-dev-serverがlistenするので必要です。
* `-v` オプションによるディレクトリのバインドも必要です。ローカルで編集してDockerコンテナでRailsを動作させるためです。
* コンテナの `/home/circle/` はイメージが提供しているデフォルトの設定なので変えないでください。

```bash
$ docker run -itd -p 3000:3000 -p 8080:8080 -v ~/hands-on-with-rails-and-vue:/home/circle/hands-on-with-rails-and-vue c265f8fbaaba
```

## Dockerコンテナへの接続

* コンテナ一覧を表示して上記で作成したコンテナのIDを確認します。下記の例では `86360d2bc784` です。

```bash
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
86360d2bc784        c265f8fbaaba        "/bin/bash"         4 seconds ago       Up 3 seconds        0.0.0.0:3000->3000/tcp, 0.0.0.0:8080->8080/tcp   heuristic_swartz
```

* コンテナIDを指定して端末をコンテナに接続します。

```bash
docker attach 86360d2bc784
```

## Dockerコンテナ上での作業

* ここから先は接続したDockerコンテナで作業します。

必要なRubyライブラリのインストール

```bash
$ gem install bundler rails
```

Railsプロジェクトの作成

```bash
$ cd hands-on-with-rails-and-vue
$ rails new . --skip-turbolinks --webpack=vue
$ yarn add vue-i18n vue-router vuex axios es6-promise bootstrap-vue
```

Railsサーバの起動とJavaScriptのビルドサーバの起動

* 後ろに `&` を付けるとそれぞれのコマンドをバックグラウンドで動作するジョブとして実行します。
* `jobs` でバックグラウンドで動作しているジョブIDの一覧を表示できます。
* `fg ジョブID`でジョブをフォアグラウンドに変更できます。

```bash
$ bundle exec rails server &
$ bundle exec bin/webpack-dev-server &
```

* 今回のハンズオンで使うモデルやらの作成とマイグレーションを実行します。

```bash
$ bundle exec rails g scaffold Message content:text
$ bundle exec rails db:migrate
```

* app/views/layouts/application.html.erb の `<head>` 〜 `</head>` に以下を追加します。

```erb
<%= javascript_pack_tag 'hello_vue' %>
<%= stylesheet_pack_tag 'hello_vue' %>
```

* ここまできたらホストマシンで `http://localhost:3000/messages` にアクセスします。
* 以下のような画面が表示されれば環境構築はひとまず完成です。

![Kobito.9LmkkK.png](https://qiita-image-store.s3.amazonaws.com/0/32894/00f09675-6f0c-0f5c-3465-e3e5a5134d29.png "Kobito.9LmkkK.png")
国に関するデータ

## 国と言語のマッピング

http://download.geonames.org/export/dump/countryInfo.txt

## 国と座標

### 中心座標

https://developers.google.com/public-data/docs/canonical/countries_csv

### 首都の座標

http://www.amano-tec.com/data/world.html

### 国と各種コード

ISOコード（alpha-3）、IOCコード、FIFAコード
https://en.wikipedia.org/wiki/Comparison_of_alphabetic_country_codes
【プログラマーのための統計学】事象とは

## 目次
[プログラマーのための統計学 - 目次](http://qiita.com/Esfahan/items/bd9e52837bbaeb168b9f)

## 概要
「事象」に付いての言葉の定義のメモです。

## 事象
事象とは、試行の結果起こる事柄のことです。
例えば、サイコロを投げて何の目が出るかという実験（試行）の結果のことを事象と言います。

## 全事象
起こりうる全ての事象。
オメガで表すことが多い。

例）サイコロを投げた場合の全事象

```math
\Omega = \{1, 2, 3, 4, 5, 6\}
```

## 複合事象
分解が可能な事象

例）サイコロを振って偶数が出る事象
これはまだ2,4,6に分解できるため、複合事象になります。

```math
G = \{2, 4, 6\}
```

## 根元事象
これ以上分解することのできない事象

例）サイコロの場合、1〜6の目それぞれが根元事象となる

## 余事象
「ある場合以外」の事象

例）サイコロを振って偶数が出る事象をAとした時、以下のように奇数の目が余事象となる

```math
A^c = \{1, 3, 5\}
```

余事象と複合事象を足すと全事象になる

```math
\Omega = A + A^c = {1, 2, 3, 4, 5, 6}
```

## 空事象
存在しない事象のこと。
サイコロで言えば、7の目が出るとか。

## 排反事象
同時には起こり得ない事象。奇数の目と偶数の目が同時にできるとか。

## 和事象
2つの事象AとBのうち、 `AまたはB` が起こる事象

式で書くと以下になります。
AまたはB

```math
A ∪ B
```

`∪` は「カップ」と呼びます。

例）サイコロで偶数もしくは3で割ることのできる目が出る事象

```math
G = {2, 3, 4, 6}
```

## 積事象
2つの事象AとBのうちAとBが同時に起こる事象

式で書くと以下になります。
AかつB

```math
A ∩ B
```

`∩` はハットと呼びます。

例）サイコロで偶数かつ3で割ることのできる目が出る事象

```math
G = {6}
```

## 参考
- [事象とは](https://bellcurve.jp/statistics/course/6195.html)
SQL クエリログを取得する

```php
<?php
use Illuminate\Support\Facades\DB;

// …

DB::connection()->enableQueryLog();

// SQL 実行を伴う操作

$queries = DB::getQueryLog();
```

5.0 の頃のドキュメントには載ってたんだけど 5.4 だと見当たらなくて、そのうち見失いそうなのでメモ。5.4 でも tinker で試して動いた。

ひとつの Eloquent Builder に対しては `->toSql()` `->getBindings()` を使うという方法もある。以下引用。

```php:stackoverflow.com/a/32373344/4821980
$query = User::first()->jobs();

dd($query->toSql(), $query->getBindings());
```

常にクエリログを出力したいような用途の場合は ServiceProvider 辺りでゴニョしてファイルに吐いたり Debugbar 使ってブラウザで見たりしたほうがいいですよ。

参考
====

https://laravel.com/docs/5.0/database#query-logging
https://stackoverflow.com/a/32373344/4821980
pythonのsorted関数で使われるlambdaとは何なのか

初投稿です。この記事ではpythonのsorted関数で使われている「lambda」について紹介していきます。

## 辞書やリストをsortedするときによく見るアレ
辞書やリストをsortする機会は多いと思いますが、その時に

```python:test.py
sorted(d.items(), key=lambda x: x[1])
```
のような書き方を見たことはありませんか？　私はよく見かけます。
上の例では辞書のvalueを元にソートを実行することになります。

自分でもソートしたい時によく使うのですが、意味もわからず使っていました。
このままではまずいと思うので、調査してみました。

## そもそもlambdaって何なの？
lambdaは、無名関数と呼ばれており、
その名のとおり、名前の無い関数を作成する際に使います。

例えば以下の例では、lambda式を使って「引数を2乗して返す無名の関数」を変数aに代入しています。

```python:lambda.py
a = lambda x : x*x
print(a(4)) #16
```

ここでは「名前の無い関数を作るもの」くらいのイメージを抑えておくだけでよいでしょう。

## sorted関数に立ち返ってみる
lambda式が使われているsorted関数を見返してみます。

```python:lambda.py
dictionary = [['なら',3], ['かながわ',4], ['とうきょう',1], ['おおさか',2]]

print(dictionary) # [['なら', 3], ['かながわ', 4], ['とうきょう', 1], ['おおさか', 2]]

sortedDict = sorted(dictionary, key=lambda x: x[1])

print(sortedDict) # [['とうきょう', 1], ['おおさか', 2], ['なら', 3], ['かながわ', 4]]
```
上記の例ではリストの2番目の要素を元にソートが実施されています。

これはsorted関数のkeyに

「要素xを受け取り、x[1]を返す」

というlambda式を指定したからです。
これにより、sorted関数は、リストの2番目の要素をkeyとしてソートを行うようになったのです。

今度はリストの1番目の要素をkeyとしてソートすることを考えます。
1番目をkeyにしたい場合、lambda式で、リストの一番目を返すような関数を定義してやればよいので、以下のように書き換えればよいです。

```python:lambda.py
dictionary = [['なら',3], ['かながわ',4], ['とうきょう',1], ['おおさか',2]]

print(dictionary) # [['なら', 3], ['かながわ', 4], ['とうきょう', 1], ['おおさか', 2]]

sortedDict = sorted(dictionary, key=lambda x: x[0])# <- x[0]に変更

print(sortedDict) # [['おおさか', 2], ['かながわ', 4], ['とうきょう', 1], ['なら', 3]]
```
ちゃんと1番目の要素でソートされるようになりましたね。

## まとめ：sorted関数におけるlambda式とは

lambda式自体は奥が深いものですが、sorted関数内ではほとんど公式的な使い方しかされません。
なので以下のように丸暗記しておけばよいでしょう。
#### **sorted(【リストor辞書】, key=lambda x: 【keyにしたい要素】)**
Windows 10 IoT EnterpriseでUWPアプリをサイドロードしようとした話

# はじめに
アイ・オー・データ社のWindows 10 IoT Enterpriseが入ったCLIP PC(CLPC-32WE1)というデジタルサイネージ用のスティックPCが入手できたので、手元にあるUWPアプリをサイドロードしようとしてみたけど見事にはまってしまった経緯をまとめておきます。そもそもWindows 10 IoT EnterpriseはWindows 10 Enterpriseと同じという話を聞いていたので、普通のWindows 10相当くらいかなと思ってたんですがいろいろ違ったので、そんなにニーズはないかもしれないですが書き留めておこうかと。かなり緩い感じで書いてるので、間違いがあれば指摘していただけると嬉しいです。

ちなみに今回使ったCLIP CPというのはこれです。
http://www.iodata.jp/product/lcd/option/clpc-32we1/index.htm

# Windows 10 IoT Enterpriseって何？
Windows 10 IoTといえば、ラズパイなんかで使うWindows 10 IoT Coreが有名ですが、これよりももっとWindows 10っぽい組み込み用のOS。昔のWindows CEとかWindows Embeddedに近い。

なので、Windows 10ベースでWindows 10 Enterpriseと互換性あるよとあちらこちらに書かれてるけど、いわゆるWindows 10というよりもWindows 10 EnterpriseのLTSB版だとのこと。去年Anniversary UpdateくらいからCBBベースのイメージも出たらしいですが、それまではLTSB版しかなかったらしく、結論としてはこれがいろいろはまってしまった原因。

上記のアイ・オー・データの製品に入っているのもこれ。Windowsのバージョン情報のところには「Windows 10 Enterprise 2016 LTSB」と書かれてる。ちなみに、ここには「IoT」の文字はない。

# Windows 10 EnterpriseのLTSB版って何？
じゃ、Windows 10 EnterpriseのLTSB版っていうのは何？となるんですが、Windows 10になってMicrosoftはWindows as a Serviceという形で継続的にアップデートを提供し続けることを宣言してます。ただ、企業ユーザーとしては、彼らに必要のないアップデートをバンバン入れられてもうれしくないし、それで既存の業務ソフトが動かなくなるのも困るわけで、必要最低限のアップデートのみに絞ってるのがLTSB版。そういう背景があるのでLTSB版というのはそもそも２～３年に1回程度しかバージョンアップしないという話もあります。

# アイ・オー・データ製CLIP PCにUWPアプリをサイドロードしてみた
というわけで、前置きはこれくらいにしてCLIP PC上でUWPのサイドロードにトライ。
手順はざっくりこんな感じ。

1. Windows 10の「設定」-「更新とセキュリティ」-「開発者向け」のところでモードを「開発者モード」に変更
2. UWPアプリのバイナリーをCLIP PCに転送
3. .ps1ファイルをPowerShellで実行

これでOK。ここは通常の手順と同じですね。ちなみに、通常だと、最初に証明書をインストールした後なら.appxbundleのダブルクリックでインストールもできるようになるんですが、LTSB版のWindows 10にはWindowsストアアプリがないのでこれもできません。毎回.ps1ファイルでインストールです。

# 結局インストールに失敗
で、この手順で手元のUWPアプリをインストールしようとしてみたんですけど、見事に失敗。原因不明といわれてしまいます。で、よくよく考えると、手元のUWPはCreators Update、つまり1703ベースで開発されてます。CLIP PCは1607ベースのLTSB版。このあたりが多分ダメなんだろうなと思いつつ、別のUWPアプリをインストールしたら案の定成功。

ということで結論としては、Windows 10 IoT EnterpriseはWindows 10 EnterpriseのLTSBベースなので、最新の機能を使ったUWPアプリは使えないことがありますよ、ということでした。
早く1703ベースのLTSB版が提供されないですかね。。
iOS アプリを Jenkins で CI していたらディスクが一杯になった

## 環境

- ハードウェア: mac mini, HDD 1TB
- CI: Jenkins

fastlane で PR 毎にアプリを配信 & 毎晩ナイトリービルドを行っています.

## 起こったこと

何やらテストが動かない...

サーバーを見てみたら `ディスクの容量が不足しています` との警告が表示されていました.

何が食ってるのか色々探して最終的に以下の場所にたどり着きました.

```shell-session
covelline-0:Xcode covelline-0$ pwd
/Users/covelline-0/Library/Developer/Xcode

covelline-0:Xcode covelline-0$ du -d1 -h
701G	./Archives
5.0G	./DerivedData
520K	./iOS Device Logs
644K	./Products
258M	./UserData
706G	.
```

どうやら xcarchive ファイルがずっと残ってて容量を食っていたようです.

700GB ってなかなか見ない数字ですね... 2016年の分からずっと残っていました...

## まとめ

- CI サーバーの xcarchive 消そう
- 容量がでかすぎて消すにも時間がかかるときは qiita を書こう
MacBookのマウスポインタが暴走する場合の対策

# MacBookのマウスポインタが暴走する！

Appleにとって デザイン＞熱暴走　なのか、数年使用したMac製品は埃を吸い続け、熱を溜めやすくなります。

自宅で使用しているMacBookのマウスポインタが、夏になると熱暴走の為か勝手に上下に激しく動き出し、場合によってはブラウザなどのウィンドウを勝手に拡大縮小する等の暴挙に出るようになりました。

この現象が出た場合は対処は一つ。一旦パソコンを使用するのを止めて別の事をする事です。
切羽詰った（どうしてもMacBookを使用したい）場合に冷蔵庫に突っ込んだ事もありました。
**※結露する為個人責任で実施して下さい**

この問題を解決したのは職場の人間と話していて　「もし修理をするとしたら何処を修理するか」という話題に至った時でした。

勿論トラックパッドを交換します。

気づいた私は電気店に直行し、一番安いワイヤレスマウスを購入しました。

マウスをMacBookに接続後、下記のアクセシビリティ設定でトラックパッドを無効化。

![Accesibility.png](https://qiita-image-store.s3.amazonaws.com/0/192988/a0090ad7-2d8d-31ed-a1d0-09e38663c791.png)

これで全くマウスポインタが暴走しなくなりました。

こんな簡単な事に気づかず時間を無駄にしているとは！
人に悩みを打ち明ける事の重要さを知ってしまいました。

その後　勢いに乗ってInkScape用にワコム製のペンタブも購入してしまいましたが、こちらは未だに活躍していません…。

※故障部分の切り分けには良いです。
Ethereum1.6.x以降のSolidityコンパイル

Ethereumを学習しているときに躓いたところと解決策について備忘録的に書き残していきます。

1. Solidityソースのコンパイル
2. web3.jsでSolidityソースのコンパイル

#環境

- Geth 1.6.7
- Go　1.8.3
- Solidity 0.4.15
- mac OS X 10.12.6

# Solidityソースコンパイル
1.5以前はGethから次のコマンドで実行ができました。

```
> eth.compile.solidity(source)
```

しかし、1.6以降はGethからcompileメソッドが削除されたため、ターミナルからsolcコマンドを使ってコンパイルする必要が生じました。
ターミナルから次のコマンドで実行することでsolidityソースをコンパイルすることができます。

```
$ solc -bin -abi hoge.solc
```

# web3.jsでSolidityソースコンパイルをコンパイル

1.5以前にあったGethでのコンパイルができなくなったため、プログラム上でコンパイル及びデプロイを行う場合はexecを使う必要が生じました。
ソースは次のようになります。

```compile.js
var fs = require('fs');
var exec = require('child_process').execSync;

exec(`solc --bin --abi --optimize -o bin contract.sol`);

var abi = fs.readFileSync('bin/contract.sol:Contract.abi');
var compiled = '0x' + fs.readFileSync("bin/Contract.bin");
```

この時、依存関係を解決するためにnpmでfsとchild_processをインストールしてください。

もう一つはbrowser-solcを使用してコンパイルする方法です

[browser-solc](https://github.com/ericxtang/browser-solc)
このソースのbrowser-solc.min.jsを加え、次のソースでコンパイルができます。

```compiler.js
//Get a list of all possibile solc versions
BrowserSolc.getVersions(function(soljsonSources, soljsonReleases) {
  console.log(soljsonSources);
  console.log(soljsonReleases);
});

//Load a specific compiler version
BrowserSolc.loadVersion("バージョン", function(compiler) {
  source = 'ソースコード';
  optimize = 1;
  result = compiler.compile(source, optimize);
  console.log(result);
});
```
このあとresultから値を取り出せばコピペせずにスマートコントラクトをデプロイできると思います。

[追記]
他にも、npmパッケージのsolcをインストールするとコンパイルできます。

```compile.js
#!/usr/bin/env node

// 必要なパッケージをインポート
const fs = require("fs");
const solc = require('solc');
const Web3 = require('web3');

// web3の初期化
web3 = new Web3();
// プライベートネットワークと接続
if (!web3.currentProvider) {
    web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));
}else{
    console.log("error");
    exit;
}
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
web3.eth.defaultAccount=web3.eth.accounts[0];
let source = "contract TestContract {uint data;function set(uint x) {data = x;} function get() constant returns (uint){return data;}}";
let compiledContract = solc.compile(source, 1);
console.log(compiledContract);
```

#最後に

初めて自分で解決させた点を共有する事となるのですが、今後自分と同じ箇所で躓いた人の助けになればと思います。
0からのAngular④

[前回](http://qiita.com/hiyoko/items/86e6982e5b3382c9ee02)の続き
今回は、大きくなってしまったAppComponentをサブコンポーネントに分けて、コンポーネントの役割をきちんと分ける。

## サブコンポーネントを定義
まずは、AppComponentのサブコンポーネントとなる`HeroDetailComponent`を`./src/app/hero-detail.component.ts`を作成し、定義する。

```js
import { Component } from '@angular/core';

@Component({
  selector: 'hero-detail',
})

export class HeroDetailComponent {
  
}
```

ここで、いくつかポイントがある。

- コンポーネントを定義するためには、1行目のようにComponentシンボルをimportする
- `~Component`となるようにクラス名をつける
- @ComponentのselectorはHTML上でのコンポーネントのタグ名になる
- コンポーネントクラスは常にexportする

## サブコンポーネントにテンプレートを用意
サブコンポーネントがビューに表示するテンプレートを用意する。
AppComponentから以下と同じ箇所をカットし、hero-detail.component.tsに移動する。

```js
@Component({
  selector: 'hero-detail',
  template: `
    <div *ngIf="hero">
      <h2>{{selectedHero.name}} details!</h2>
      <div><label>id: </label>{{selectedHero.id}}</div>
      <div>
        <label>name: </label>
        <input [(ngModel)]="selectedHero.name" placeholder="name">
      </div>
    </div>
  `
})
```

このとき、`*ngIf`部分を`selectedHero`から`hero`に変更する。
そうする理由は、サブコンポーネントでは、HeroDetailComponentクラスに`hero`を定義し、こちらにバインドさせるから。
ということで、HeroDetailComponentクラスに`hero`を定義する。

```js
export class HeroDetailComponent {
  hero: Hero;
}
```

## Heroクラスを切り出す。
hero-detail.component.tsでもHeroクラスを参照することになったので、Heroクラスがapp.component.tsに定義されたままだと不都合。
Heroクラスを./src/app/hero.tsというファイルを作成し、こちらに移動させる。

```js
export class Hero {
  constructor(
    public id: number,
    public name: string,
    ) {  }
}
```

クラスを切り出したので、app.component.tsとhero-detail.component.tsでHeroクラスをimportする。

```js
import { Hero } from './hero';
```

## 子コンポーネントに値を渡す
app.component.tsからhero-detail.component.tsに値を渡す。
AppComponentのselectedHeroをHeroDetailComponentの`hero`に受け渡す。

まずは、hero-detail.component.tsに@angular/coreに定義されている`Input`をimportする。
Inputをimportしたことで、@Inportデコレータが使えるようになる。

```js
import { Component, Input } from '@angular/core';
```

HeroDetailComponentのheroは外部から渡される変数なので、`@Input`デコレータをつける。

```js
@Input() hero: Hero;
```

## AppModuleにHeroDetailComponentを宣言する
すべてのコンポーネントは、[NgModule](https://angular.io/guide/ngmodule)に宣言されるべき。
ということで、`app.module.ts`を開き、HeroDetailComponentをimportする。

```js
import { HeroDetailComponent } from './hero-detail.component';
```

加えて、modulesの中の`declarations`にも追加する。

```js
declarations: [
  AppComponent,
  HeroDetailComponent
],
```

declarations配列は、モジュールに属するコンポーネントやパイプ（こいつは一体？？）やディレクティブを含める。
他のコンポーネントがモジュールを参照できるようになる前に、コンポーネントはmoduleに宣言されるべき。

## hero-detailセレクタを呼び出す
HeroDetailComponentをAppModuleに宣言したことで、app.component.tsでも使用できるようになった。
なので、templateでhero-detailセレクタを使用する。

```js
<hero-detail [hero]="selectedHero"></hero-detail>
```

hero変数を`[]`で囲み、=の右辺に渡したい値を記述することで、HeroDetailComponentのheroに値を渡すことができる。

## 終わりに
動作は[前回](http://qiita.com/hiyoko/items/86e6982e5b3382c9ee02)と同じだが、サブコンポーネントとクラスに切り出したことでだいぶAppComponentがすっきりした。
まだまだリファクタリングの余地があるということで、次回でもリファクタリングを行うらしい。
[MCMC] pystanでWAICを計算する

# はじめに
最近ベイズ統計の勉強を始めてMCMCライブラリとして[Stan](http://mc-stan.org/)を使おうと思ったのですが、みんなRと組み合わせてやろうみたいな教科書ばかりでpython関連の情報が少なかったので久しぶりに投稿しました。

# 環境
+ Ubuntu 16.10 64bit
+ Anaconda 4.4.0
+ python 2.7.13
+ pystan 2.14.0.0

# pystanのインストール
公式のドキュメントによれば
`conda install pystan`
で終わりなのだが、自分の場合はこれだけだとモデルをコンパイルする際に
`undefined symbol: _ZTVNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE`
エラーが出たので追加でgccもインストールした。
`conda install gcc`

# テスト用のモデルとデータの作成
[豊田秀樹『実践ベイズモデリング』](https://www.asakura.co.jp/books/isbn/978-4-254-12220-6/)から拝借

```py
import pystan
import numpy as np

model_code = '''
data{
    int<lower=0> N;
    vector[N] x;
    vector[N] y;
}
parameters{
    real b;
    real a;
    real<lower=0> sigma;
}
transformed parameters{
    real mu[N];
    for(i in 1:N){
        mu[i] = b + a*x[i];
    }
}
model{
    for(i in 1:N){
        y[i] ~ normal(mu[i], sigma);
    }
}
generated quantities{
    vector[N] log_lik;
    for(i in 1:N){
        log_lik[i] = normal_lpdf(y[i] | mu[i], sigma);
    }
}
'''

sm = pystan.StanModel(model_code=model_code)

x = [150.5,160.2,148,177.1,162,148.2,163.8,166.9,164.9,154.3,176.1,162.7,150.5,131.4,171.5,157.5,157.8,169.3,167.9,165.1,
169,167.4,158.9,134.1,165.4,157.3,156.1,140.4,152.3,163,174.3,156.8,162.7,157.4,141.5,153,153.3,157.3,171.2,167.2,
156,155,166.4,164.7,149.7,149.5,162.4,167.2,156.7,168.6,162.8,150.7,162.1,144.4,175.2,181.8,153.6,145.5,164.8,156.4,
186.8,157.5,166.3,158.3,149.1,160.3,136.3,175.6,159.8,184.1,163.7,149.5,165.3,146.8,143,161.5,152.7,158,158.9,150.9,
151.2,156.4,172.1,139.7,165.1,162,170.8,154.3,162.4,161.2,151.5,172.5,171.9,166.4,177,164.7,142.7,151.1,143.3,152.3]
y = [158.7,163.3,156.6,164.1,158.4,175.4,168,169.4,165.7,174.8,158.5,159.8,173,158.4,161.5,160.3,160.8,161,166.5,161.8,
159.5,172.4,161.5,161.7,162.3,168,162.5,162.7,158.2,160.7,163.4,158.9,166.7,152.4,165.1,152.2,160.9,159.3,158.4,162.6,
149.6,171.2,151.3,159.8,155.2,157.7,177.6,163.1,154,151.5,166.2,162.9,160.8,156.5,152.6,155.5,170,158.7,153.3,176.1,
166,161.3,170.4,169.2,158.7,178.4,161.2,153,162,164.5,179.2,163.7,166.2,162.5,160.7,162.8,168.5,177.5,170.2,171.5,
154.4,169.9,164.5,152.7,166.6,161.9,173.3,157.6,160,156.5,161.8,165.8,157.9,168.8,154.5,155.7,173.1,155.9,165.9,160.3]
data = {'N':100, 'x':x, 'y':y}

fit = sm.sampling(data=data, iter=2000, chains=4)
```
# WAIC の計算
WAICとはWidely Applicable information criterion (Watanabe, 2010)の略でベイジアンモデルにおいて用いられる情報量基準の１つである。計算式は

```math
WAIC = -2lppd_{waic} + 2p_{waic} \\
lppd_{waic} \approx \sum_{i = 0}^{N}log \bigl\{ \frac{1}{T} \sum_{t=1}^{T}f(x_{i} | \theta^{(t)}) \bigr\} \\
p_{waic} = \sum_{i=1}^N V_i [log f(x_i | \theta^{(t)})]
```

よって以下のような関数を定義する

```py
def waic(fit):
    log_lik = fit.extract()['log_lik']
    lppd = np.log(np.exp(log_lik).mean(axis=0)).sum()
    p_waic = np.var(log_lik, axis=0).sum()
    waic = -2*lppd + 2*p_waic
    return round(waic, 3)
```

これを使うことで

```py
waic(fit)
>>>669.028
```
WAICが計算できた！
Lispを始めるきっかけになった情報をまとめる

Lispに入門した

最初はLispの馴れ初めなのでなんではじめたん？まで飛ばしてもOK

## たしかすべてはHow to become a hackerから始まった
私がプログラミングを学び始める前か少し経ったあとかはもう思い出せないが[How to become a hacker](http://cruel.org/freeware/hacker.html)という情報をインターネットで目にした。当時の自分は分不相応にもハッカーを目指していたからである。
[How to become a hacker](http://cruel.org/freeware/hacker.html)で推奨されているおすすめプログラミング言語はC言語, Java言語, Perl, Python, Lispだった。(ちなみに私はこれを見てRubyを始めた。PythonとRubyはできることが似ていると感じたことと日本語情報の多さが決め手になった)
これらの言語の中でLispだけは現実的な推奨理由は書かれていなくただ『それをものにしたときの悟りの体験のためにLispを学びなさい』と書かれていて中二心をくすぐられたが調べてみて無理だと感じた。
それが僕のLispのファーストタッチだった。

## 動物さんシリーズのRuby入門書を読んだらLispがでてきた
何だこれって感じである。Rubyを学んでいたらLispの話が出てきたのだ。
MatzさんやYuguiさんがLispから影響を受けたことを直接的、あるいは間接的に文章で伝えてくる感じが強くしたのでLispやるかなと思っていたがやはり((((((挫折した))) 読めない) 読みたくない))

## なんではじめたん？
5年くらい調べる => 拒絶反応を繰り返した。
そして今になってようやくLispを学び始めた。
始めた理由は仕事でプログラミングをするようになって5年かけて積み上げた自分の技術がなんの役にも立たないくらい低レベルなものだと知ったから。会社にはすごいエンジニアがたくさんいて自分だけの強みが必要だと強く感じたから。みんなオブジェクト指向の達人。ならば僕は関数型プログラミングを極めてやる！くらいの気持ちだった。

## Lispというアイデア
[これを読んだときに感じたこと](http://postd.cc/the-idea-of-lisp/)
言語自体をプログラミングできる言語。という発想に感動した。(Rubyもその思想を強く受けてるが。)Lispをもっと知りたいと強く思った記事で純粋なLispと言うのは関数5つの基本関数と2種のデータを組み合わせて機能を追加してきたというシンプルの極みなのでできることは無限という発想がすごい。Lispの前に世界初の高級言語FORTRANが18年の歳月を経て作られているがLispは一人の科学者が作ったという点もまじかよって感じがする。ただし当初の高層では(((())))だらけの言語にする気はなかったそうだ。気がついたら()だらけで広まってたそうな。
Lispの出自は人工知能研究所からということなので進化していけるというところが重要だったのかもしれない。何れにせよこのグレートなアイデアに触れて自分の方も進化したいと思った

## 副作用滅殺計画
手続き型、オブジェクト指向型と学んできた自分には副作用が何かというのはよくわからなかった。なぜなら副作用のない世界を知らなかったので副作用とはごく日常的なものだったから。Lispを始めて衝撃を受けたことは自分の知っていたことが副作用で成り立っていたということだ。衝撃だった。
Lispを学ぶために買った本には副作用はコードにバグを挟み込むものだから抹殺すべき！という話が書かれていてLispという言語は副作用を出させないような実装しかできないようにしようぜ！という感じがプンプンした。ガムのポイ捨てが多いならガムを販売しない！とか不法駐車が多いなら車を買わせない！とか過激なアプローチを想像した。実際には清濁併せて扱える感じで変数への代入も再代入？もできるからそこまで極端じゃない。実装者の強い意志で副作用を減らそうくらいのもの。関数型だから副作用０ってわけじゃないことを忘れないで副作用を減らすコードを書くことにこだわろう。

## シンプル故に読みにくい
よく考えたらシンタックスに;とか[]とか{}が無いってすごいシンプルですよね。覚えることって()をいつ使うかだけ（それも小学校で教わる算数で出てくる使い方と同じだから考えなくても良い感じ）
でも()だらけ。だから読みにくい。でもこれって慣れるっぽいです。すでに僕は慣れ始めています。最近のエディタは良く出来てるから()も自動的に差し込んでくれるしね

## イライラする
> 定期的に書かないとイライラしてくる
> ネタだと思ってるでしょうけれど、半分ぐらい本当です。
> とても形容しがたいんですが、丸括弧だけで囲まれた空間に１つのアルゴリズムを押し込められた時が快感なんです。
> 中毒性が高い言語かもしれません。

[ソースはここに](http://qiita.com/Tamamu/items/33375dceb33b51716064#%E5%AE%9A%E6%9C%9F%E7%9A%84%E3%81%AB%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%E3%81%A8%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%A9%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8B)

最初は嘘だろ？ネタだろう？冗談だろ？って思っていた。でも実際に書き始めたらこれは真実でとても中毒性の高い言語だった。イライラするというか不安になる？今はそんな感じ

## 今困っていること
SLIMEという素晴らしいツールが存在するらしい。Emacsにはとても簡単に導入することができるのだが使い方がわからないので困ってます。もっとちゃんと調べないといけない感じか...
2017-08-25 Python2 > datetime > 開始時分秒まで待つ

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

自動ロギング機能をRPiに担ってもらうため、開始時刻までの待ち処理が必要。


以下のように実装した。

```test_wait_170825.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
import serial
import datetime

# SET start time
start_time = datetime.time(13,45,0)

start_str = start_time.strftime("%H:%M:%S")

while True:
    now_time = datetime.datetime.now()
    if start_str == now_time.strftime("%H:%M:%S"):
        break
    time.sleep(0.1)  # [sec]

print('hello')
print(datetime.datetime.now())

```

```txt:run
$ python test_wait_170825.py 
hello
2017-08-25 13:45:00.074149
```

time.sleep()のポーリング間隔はもう少し長くしてもいいだろう (0.3とか)。

こういう処理はcrontabを使う方法もあるが、Pythonコードでまとめて管理したい理由からPython実装した。


### import用

```util_wait_170825.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
import datetime

def wait_until(HH, MM, SS):
    start_time = datetime.time(HH, MM, SS)
    start_str = start_time.strftime("%H:%M:%S")

    while True:
        now_time = datetime.datetime.now()
        if start_str == now_time.strftime("%H:%M:%S"):
            break
        time.sleep(0.1)  # [sec]

if __name__ == '__main__':
    print('start waiting')
    wait_until(13, 58, 30)  # HH, MM, SS

    print('hello')
    print(datetime.datetime.now())

```

### import用 > v0.2

@shiracamus さんの実装方法を使わせていただきました。
情報感謝です。

```util_wait_170825.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
import datetime


def wait_until(HH, MM, SS):
    now = datetime.datetime.now()
    start = datetime.datetime(now.year, now.month, now.day, HH, MM, SS)
    wait_sec = (start - now).total_seconds()
    if wait_sec < 0:
        wait_sec += datetime.timedelta(days=1).total_seconds()
    time.sleep(wait_sec)


if __name__ == '__main__':
    print('start waiting')
    wait_until(14, 33, 30)  # HH, MM, SS

    print('hello')
    print(datetime.datetime.now())

```
bluemixコマンドの導入

# Bluemixコマンドの導入

Bluemixを使用するに当たって、2017年8月25日現在 全体の


https://console.bluemix.net/docs/cli/reference/bluemix_cli/index.html#getting-started
には、オンライン・インストールと証して下記のコマンドが紹介されていますが、（下記はLinux用）

```
　sh <(curl -fsSL https://clis.ng.bluemix.net/install/linux)
```

https://clis.ng.bluemix.net/install/linux
を叩いて返って来た結果の　bash ソースで参照する　public.dhe.ibm.com　というFQDNに到達できない為、下記のエラーが起こります。
```
　curl: (7) Failed connect to public.dhe.ibm.com:80; ホストへの経路がありません
```
ネットワークの問題なのか等々の切り分けも面倒なので素直に
ダウンロードして　導入した方が速いでしょう。

ダウンロードは　https://console.bluemix.net/docs/cli/index.html#downloads　です。
Swift:Swiftのバージョンを調べる

macOS Sierra(10.12.6)
Xcode 8.3.3
Swift version 3.1
を使用しております。

上記のように書こうとしたり
たまにドキュメントを書く時に使っているSwiftのバージョンを記載しておこうと思ったら
Swiftのバージョンがわからなかった。

Macは「**このMacについて**」、Xcodeは「**About Xcode**」でバージョンを調べられますが
Swiftはそんなものはなく、調べるとターミナルで
```swift -v```
と、入力すると表示されると書いてあり

```
xxxxxx:~ xxxx$ swift -v
Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
Target: x86_64-apple-macosx10.9
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb "--repl=-enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -color-diagnostics"
Welcome to Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42). Type :help for assistance.
```
のように表示され、最後に

```
xxxxxx:~ xxxx$ swift -v
Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
Target: x86_64-apple-macosx10.9
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb "--repl=-enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -color-diagnostics"
Welcome to Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42). Type :help for assistance.
  1>
```
**1>**
と、なって入力待ちに。
ここで、
**:exit**
とタイピングして終了させます。

ですが、
**\:q**
でも終了できます。

何か面倒。バージョンだけ調べたいのであれば
```swift -version```
で、OK。

```
xxxxxx:~ xxxx$ swift -version
Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
Target: x86_64-apple-macosx10.9
xxxxxx:~ xxxx$
```
先程のように最後に入力して終了させるとか必要なくバージョン表示されます。
[Emacs] emacsclient を快適に使うための設定

emacsclient ってなに？
どんなことができるの？
と思った人はグーグル先生に教えてもらうといい。
ここではそれを使いやすくするために個人的に使用している設定を書く。

**この設定はターミナルで emacs を使用していることを前提とする。**

以下のものを ~/.zshrc に追加するべし。

.bashrc でも動く気がする。

## 起動関数

emacs daemon が起動していなければホームディレクトリで `emacs --daemon` を実行する。

```zsh
function estart() {
  if ! emacsclient -e 0 > /dev/null 2>&1; then
    cd > /dev/null 2>&1
    emacs --daemon
    cd - > /dev/null 2>&1
  fi
}
```

## シェルを立ち上げる時に自動で daemon 起動

.zshrc の最後の行にこれを追加する。

```zsh
estart
```

## エイリアス定義

使いやすくするエイリアスを追加。

ファイルを開く。

```zsh
alias e='emacsclient -nw'
```

daemon を止める。

```zsh
alias ekill="emacsclient -e '(kill-emacs)'"
```

daemon 再起動。

```zsh
alias erestart="emacsclient -e '(kill-emacs)' && estart"
```

## EDITOR 変数設定

デフォルトのエディタを emacsclient に変更する。

```zsh
export EDITOR='emacsclient -nw'
```

## git でも使用する

`git commit` で立ち上がるエディタも変更。
.gitconfig に追加。

```
[core]
  editor = emacsclient -nw
```
script タグを動的に削除しても、スクリプトは動作するのだろうか

気になったので、確かめてみました。
script タグを動的に削除しても、スクリプトは動作し続けるのだろうか、と。

結論から言うと、スクリプトは動作します。タグを削除しても、メモリ上にあるオブジェクトや関数は削除されるわけではないので、当たり前といえば当たり前です。

以下、動作確認用の HTML です。

```html
<html>
<body>
<button id="button1" type="button">test1</button>
<button id="button2" type="button" onclick="handler()">test2</button>
<script id="jquery" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
	jQuery("#button1").click(handler);
});

function handler(){
	alert(jQuery("script").length);
	jQuery("script").remove();
}
</script>
</body>
</html>
```

ボタンが２つありますが、いずれをクリックしても、呼び出される関数```handler()``` は同じです。動作は同じですが、関数の紐づけ方が異なり、片方は jQuery でイベントハンドラを登録し、片方は onclick 属性を使用しています。

関数では、script タグの数をダイアログで表示した後、script タグを全て削除しています。

２つのボタン、どちらをクリックしても、動作し続けます。最初の１回目だけ 2 とダイアログに表示され、後は 0 です。初回で script タグは削除されてしまうからです。
名前 > ユニークなファイル名 > 英数字は何文字必要なのだろうか > 178文字?

画像ファイル名に178文字ほどの英数字を使用するサービスを見かけて、「ユニークな名前をつけるために必要な英数字の数はどれくらいか」という疑問を持った。

以下のようなものがあるようだ。

### UUID 
https://en.wikipedia.org/wiki/Universally_unique_identifier

### GitHubコミットのハッシュタグ

gitのコミットのハッシュタグはどうだったか。
自分のコミットの例として`commit eb97f17685ac2477e6a3a7321159d6463f736dd2`

http://naoyashiga.hatenablog.com/entry/2013/11/22/013406

> しかし参考ページを読んでみると、かぶる心配はしなくても良さそう。
> > SHA-1 ダイジェストの大きさは 20 バイト (160 ビット) です。ランダムなハッシュ値がつけられた中で、たった一つの衝突が 50% の確率で発生するために必要なオブジェクトの数は約 2^80 となります (衝突の可能性の計算式は p = (n(n-1)/2) * (1/2^160) です)。2^80 は、ほぼ 1.2 x 10^24 、つまり一兆二千億のそのまた一兆倍です。これは、地球上にあるすべての砂粒の数の千二百倍にあたります。

### 178文字?

冒頭のファイル名については、念には念を入れて、かつJust in caseな場合を考えて178文字程度の英数にしたのだろうか。

問題は出ないのだろか。
(少なくとも「扱いにくい」という感想は持つ)。
インフラ初学者による複数azを跨いだAWSネットワーク構成

# 注意事項
この記事は普段インフラ構築とかをやらない人間が書いています。
間違えている点などがありましたら生暖かい目で指摘してください。

# 構成図

![Untitled Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/198723/6d85fa5a-28b1-91b1-66a2-5097ff7ee7d0.png)



※費用の関係上bastionとnatサーバを同一インスタンスにしています。

# 気を付けたこと
- webサーバはprivate subnet内に設置する。
    - webサーバに直接アクセスできる状態を避ける
    - ユーザーはpublicサブネットに紐づいたELBを経由してprivateのwebサーバからの返答を得る
    - 開発者はpublicに設置されたbastionサーバを踏み台にしてwebサーバへssh接続をする
    - webサーバから外部へ出ていく通信(update)などはNATサーバを経由するようにする。
- 複数AZの使用
    - 障害耐性の向上など(auto scalingと組み合わせられるとなおよかった)

# 引っかかったこととその原因
- webサーバから yum updateなどができなかった
    - 原因
      - NACLの設定が間違っていた(NACLのアウトバウンドの許可をnatインスタンスに向けていた)
      - 同一サブネット内にnatインスタンスがないためprivateサブネット内でリクエストが迷子になっていた
    - 解消
      - natインスタンスのアウトバウンドを0.0.0.0/0に対して許可した
    - 理由
      - privateに割り当てているルートテーブルで0.0.0.0/0に対してnatインスタンスを割り当てているので、0.0.0.0/0にリクエストすれば自動的にnatインスタンス経由でリクエストを送ることができる
- bastionサーバに nat機能を持たせようとして時間を想定以上にとられた
    - 原因
      - AMIを知らなかった
    - 解消
      - natインスタンスのAMIを使用しnatを立てて、そこにbastionの役割を持たせた。
    - 理由
      - AMIがあるのでそれを使ったほうが楽。使えるものは使うべき。
Android Facebook SDK で Support Library を exclude する

Facebook SDK が Support Library のバージョンを固定しているので、自前のものと衝突した。

Support Library は、この記事を書いている時点だと２５系の最新が `25.4.0` でこれを使いたい。ところが Facebook SDK は `25.3.1` 固定となっている。

https://github.com/facebook/facebook-android-sdk/blob/master/facebook/build.gradle

```
compile 'com.android.support:support-v4:25.3.1'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support:customtabs:25.3.1'
```

gradleの依存関係で明示的に Support Library を使いつつ

```
dependencies {
    compile "com.android.support:support-v4:25.4.0"
    compile "com.android.support:support-compat:25.4.0"
    compile 'com.android.support:support-annotations:25.4.0'
    compile "com.android.support:appcompat-v7:25.4.0"
    compile "com.android.support:cardview-v7:25.4.0"
    compile 'com.android.support:customtabs:25.4.0'
    ...
```

Facebookの箇所で該当moduleを除外して使う。

```
compile ('com.facebook.android:facebook-android-sdk:[4,5)') {
    exclude group: 'com.android.support', module: 'support-v7'
    exclude group: 'com.android.support', module: 'appcompat-v7'
    exclude group: 'com.android.support', module: 'customtabs-v7'
    exclude group: 'com.android.support', module: 'cardview-v7'
}
```
Linuxサーバーのユーザー認証の現状を調べてみた

Linuxサーバーのユーザー認証を見直そうと、ふと思い立ったので現状を調べてみる。

とはいえ泣く子も黙るような有名ディストリビューションしか調べてない。

# CentOS 7

CentOSはこれからSSSDを使う方向の模様。ドキュメントでもSSSD推し々々である。

[システムレベルの認証ガイド](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system-level_authentication_guide/)

nslcdとかnscdとかの記載はない。廃止したいのかもしれない。まぁあれ開発されているのか怪しいしな……。

よって、authconfigでPAMを設定して、あとはsssd.confがあればOK。
まぁ正直pam.dとnslcdとncsdとsshd_configとnsswitch.confと、って多すぎだろ分かりにくすぎてこれもうシステムとして脆弱だろって気分。

sshdの鍵認証設定については、SSSDが代替スクリプトを提供している。これをsshd_configの鍵認証スクリプトに設定すればよい。

```
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
```
[SSSD+LDAP+SSH連携の設定](http://blog.father.gedow.net/2015/09/29/sssd-ldap-ssh/)

流石は天下のRedhat様やで。

[CHAPTER 53. DEPRECATED FUNCTIONALITY](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.4_Release_Notes/chap-Red_Hat_Enterprise_Linux-7.4_Release_Notes-Deprecated_Functionality.html)

authconfigは非推奨入りして、authselectというのを使うのがよいらしい。

https://fedoraproject.org/wiki/Changes/Authselect

使い心地は良さそう。

ってか、しれっと**openldap-serverもDeprecated入りしてる**んですが、マジですか。でも確かにあれ遅々として開発されてないような気はするよね！サブスリプション買っている人はちゃんとサポートのあるIdMを使えるらしい。389ベースなのかしらん？

# Ubuntu 16.04

なにせドキュメントがないので、想像だけれど、Ubuntuは相変わらず古き良きnslcd・nscd兄弟の使用が基本線のようで、SSSDはRedhat系だから宗教上の理由で興味のない振りをしている様子。

なお、そう想像したWikiの最終更新は**2013年**である。(https://wiki.ubuntu.com/Enterprise)

~~はっきり言って、実はエンプラ系の仕事やる気ないのでは……。~~

# もう認証とかなんかそういう古い考えはやめよう

と考えるとUbuntuの冷たさは一理ある。

SSHでも二段階認証とかワンタイムとかSSO的なのとか、ナウい未来を考えるとやはりnslcdとnscdでは辛いかなぁ。ってかこいつらまだ開発されているのだろうか……。

基本的にはサーバーレスアーキテクチャを考えるとか？LocalでSAM君飼えるみたいだし、中規模くらいまでならイケる気はするなぁ。
[AWS SAM Local（ベータ版） – サーバーレスアプリケーションをローカルに構築してテストする](https://aws.amazon.com/jp/blogs/news/new-aws-sam-local-beta-build-and-test-serverless-applications-locally/)

ログなんか外に飛ばして集約するだろうし、メトリクスも外に飛ば(ryだし、コンテナ時代に至っては壊れても気にしない（暴言）し、もうログイン時のアカウント・パスワードなんて考える時代ではないのかもしれないが、そういうシステムを開発して管理するであろう我々インフラーにはやはりSSHが必要なのだ。
Bashで引数で使うワイルドカード展開を抑制する

シェルスクリプトで aws の s3 sync について --exclude にワイルドカードを指定するのに、うまく指定できなくて調べた結果をまとめておく。ちゃんと指定しないとクオートやエスケープの文字自体も受け渡されてしまって --exclude が意図したとおりに指定できなかった。

## 直接使う場合

Bashでワイルドカード展開を抑制する方法はいくつかあります。

[bash - Stop shell wildcard character expansion? - Stack Overflow](https://stackoverflow.com/questions/11456403/stop-shell-wildcard-character-expansion) より

```bash
$ # quote it
$ foo '*'

$ # or escape it
$ foo \*

$ # or disable the glob (noglob)
$ set -f
$ foo *
```

## 変数で使う場合

変数にワイルドカード文字を代入すると、とたんに難しくなります。

### 文字列だけ

[sh での変数とワイルドカードの落とし穴|てくめも@ecoop.net](https://www.ecoop.net/memo/archives/2006-02-02-1.html)

のように、"$A" でダブルクオートで括れば展開されないが、空白で区切られた複数のオプションを含む場合にコマンド引数で使用しようとすると不具合が出る。空白も含めて1つの文字列として受け渡されてしまいます。

### 引数で使う場合

今のところ、以下の2つで解決できるようです。

* eval を使う
* set -f を使う

#### eval を使う

[aws s3 syncするシェルスクリプトでワイルドカードでexcludeしたときのメモ](http://qiita.com/ikeisuke/items/87438ef5755aa61a9510)

## 実験

### 環境

```bash
$ ll
合計 1024
-rw-r--r--+ 1 xxx Users   0 8月  24 18:27 1.txt
-rw-r--r--+ 1 xxx Users   0 8月  24 18:27 2.txt
-rw-r--r--+ 1 xxx Users   0 8月  24 18:27 3.txt
-rwxr-xr-x+ 1 xxx Users 269 8月  24 19:10 sample.sh*
```

```bash:sample.sh
#!/bin/bash

subject1="--exclude '*' --include '*.txt'"
subject2="--exclude * --include *.txt"
subject3='--exclude \* --include \*.txt'

set -x
#
:
echo ${subject1}
:
echo "${subject2}"
:
eval "echo ${subject1}"
:
set -f
echo ${subject2}
set +f
:
echo ${subject3}
:
#
```

### 結果

ワイルドカード文字が * だけになっていると良い。

``` bash
$ ./sample.sh
+ :
+ echo --exclude ''\''*'\''' --include ''\''*.txt'\'''
--exclude '*' --include '*.txt'
+ :
+ echo '--exclude * --include *.txt'
--exclude * --include *.txt
+ :
+ eval 'echo --exclude '\''*'\'' --include '\''*.txt'\'''
++ echo --exclude '*' --include '*.txt'
--exclude * --include *.txt
+ :
+ set -f
+ echo --exclude '*' --include '*.txt'
--exclude * --include *.txt
+ set +f
+ :
+ echo --exclude '\*' --include '\*.txt'
--exclude \* --include \*.txt
+ :
```
1番目は、展開後なのに引数の文字列としてシングルクオートが含まれてしまっている。
2番目は、一見うまく展開されているようだけど、`'--exclude * --include *.txt'`と1つの文字列としてシングルクオートで括られている。
3番目は、OK。
4番目は、OK。
5番目は、エスケープ文字が含まれているので駄目。
flexは2ページ目以降印刷プレビューに表示されない

flexのバグの私的メモ
バグに出会ったら追加していきます。

##2ページ目以降印刷プレビューに表示されない。
2017年08月25日に発見。
IEとFirefox（55.0.2）だと印刷プレビューに表示されない。

###解決方法
印刷時はflex以外を使用する。

###参考（Firefoxについてしか書かれていません）
https://github.com/yoshiko-pg/your-name/issues/6
fish shell とBSD sed とタブ文字の入力

fish shell 、便利なんだけど時々落とし穴があったりするのでBash に戻ろうかと思っている今日この頃。

## やりたいこと

行末にタブのついたちょっと**キモい**TSVファイル（タブ区切りのテキストファイル）があり、この行末のタブを除去したい。

## 問題点

macOSに標準搭載されている`sed`で行末のタブを取り除きたい。しかし、このBSD版の`sed`は`\t`という入力に対応していない。  

残念なことに、fish shell 環境ではBashと同じようにCtrl+vを押した後に「TAB」キーを押してTABそのものを入力するという方法は使えない。

## 対応

拡張正規表現（`-E`オプション）でタブに限らず行末のホワイトスペース文字を除去すればいいのかもしれないが、GitHubのバグトラッカーに解決策があったのでその通りにする。

[How to insert a literal tab character? · Issue #2478 · fish-shell/fish-shell · GitHub](https://github.com/fish-shell/fish-shell/issues/2478)

どうするかというと、タブの前後で区切ってクォートする。何を言っているのかわからないと思うが、fish shell では動く。

```
> sed -i -e  's/'\t'$//' uggly.tsv
```
`>` はプロンプト記号。  

タブが展開され、かつシングルクォートも展開されてちゃんと一つの文字列として`sed`に渡されている模様。

もちろん別の解決策としてGNU sed をインストールしてもいいと思う。

おしまい。
UbuntuのChromeでスクロール時にちらつきが出る問題のFix

##Chromeに限らずブラウザでスクロールしたり、動画を見るとちらつく問題

Thinkpad X1 Carbon 2017にUbuntu MATE 17.04を入れて悩まされた問題。
英語では情報があったけれど、日本語のものが見つからなかった。

原因はIntel GPUを使っている場合の問題らしい。

##対処法
Rootとして/usr/share/X11/xorg.conf.d/20-intel.confを以下の内容で作成する。
`sudo nano /usr/share/X11/xorg.conf.d/20-intel.conf`

```/usr/share/X11/xorg.conf.d/20-intel.conf
Section "Device"
    Identifier "Intel Graphics"
    Driver "intel"
    Option "AccelMethod" "sna"
    Option "TearFree" "true"
    Option "DRI" "3"
EndSection
```

##参考
https://askubuntu.com/questions/752743/ubuntu-16-04-skylake-6th-generation-screen-flickering
一番上のbasicdaysさんの回答がわかりやすい。Skylakeとなっているが、Kabylakeでも問題は発生した。

ちなみにUbuntu MATEだと、なんの設定もせずにThinkpad X1 Carbonのタッチパッド、トラックポイント、カメラ、Bluetooth、その他諸々動くのでおすすめ。
でも指紋認証はだめです。
import 'babel-polyfill' と書くとESLintに叱られる件について

babelで `async`/`await` を使いたい場合などに、
コードの冒頭に`import 'babel-polyfill'` と書くと思いますが、
そうするとESLintで[no-unresolved](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unresolved.md)に引っかかり、叱られてしまいました。

`no-unresolved`を有効にしたまま、上記のようなモジュールのimportでエラーを出さないようにするには
[eslint-import-resolver-babel-module](https://github.com/tleunen/eslint-import-resolver-babel-module)をインストールして
`.eslintrc`の設定に `settings`として追記すればOKです。

```json
{
  // ...（略)
  "settings": {
    "import/resolver": {
      "babel-module": {}
    }
  },
  "rules": {
    // ...(略)
  }
}
```

YAMLの場合はこんな感じ。
YAMLのオブジェクト、空っぽのときだけは `{}` って書くんですね。

```yaml
# ...(略)
settings:
  import/resolver:
    babel-module: {}
rules:
  # ...(略)
```

ちなみに検索では`eslint-import-resolver-babel-module-alias`と言う名前ばかり見つかるんだけど、
モジュール名が途中で変わって`alias`が取れたのかな？

こちらのQiita記事を参考にさせていただきました。
[importを絶対パスで書く](http://qiita.com/maaz118/items/e09c14b94e2cedba1d9b)

ではでは〜。
R の httpd server , Rook について調査

# 概要

R の Rook というパッケージには、127.0.0.1でしか動かないと書いてあったので、なぜだか調べた。

docker の中でサーバーをタテたいので、できれば、この制限を解除したい。
可能かを調べる

# まとめ

Rookでは、
`startDynamicHelp`
を、呼び出している。
この `startDynamicHelp` の中で、127.0.0.1 に固定されているようだ。

## ポートを使用するタイミング

参考情報の最初のものをみると、newしたあと、s$start()が呼ばれていない。
理由をしらべてみたところ、
以下が実行された時点で、ポートの使用がはじまっているようだ。

```
status <- .Call(tools:::C_startHTTPD, myInterface, myPort)
```

この状況で、start() を呼ぶと


# 参考情報

* [Jeffrey Horner - Deploy Rook Apps: Part II](http://jeffreyhorner.tumblr.com/post/33814488298/deploy-rook-apps-part-ii)
* [Deployed R app with Shiny crash with 'could not find function "httpdPort"' - Stack Overflow](https://stackoverflow.com/questions/36401466/deployed-r-app-with-shiny-crash-with-could-not-find-function-httpdport)

* [Shiny - RjpWiki](http://www.okadajp.org/RWiki/?Shiny)
 * ここをみても、やはりR内部にサーバがあるようだ


# 製作中

Rookをフォークして、`0.0.0.0` でも受けられるようにした。
オリジナルバージョンと合わせるには、まだ少し調整が必要だとおもう。

* [manabuishii/Rook: A web server interface for R](https://github.com/manabuishii/Rook)
pythonでRのjoyplotっぽいプロットをする

# 1.joyplotとは
joyplotとは，少し前にtwitterで話題になっていたこんな感じのプロットです．
<img src="https://qiita-image-store.s3.amazonaws.com/0/164264/43c943cc-a358-d6af-2459-8d1705424b12.jpeg" width=50%>

これは，Rの[ggjoy](https://cran.r-project.org/web/packages/ggjoy/vignettes/introduction.html)というパッケージで簡単にプロットできるようです．pythonにはそれと同様のものはなさそうでした．

ちなみになぜjoyplotというかというと，Joy DivisionというバンドのUnknown Pleasuresというアルバムの表紙が下のような感じだったからjoy plotというらしいです．
![pulsar_detail.jpg](https://qiita-image-store.s3.amazonaws.com/0/164264/54aa3a16-b3aa-a1a5-2110-4a706190dae6.jpeg "pulsar_detail.jpg")

なので，このjoyplotを使うときは，[これ](https://www.youtube.com/watch?v=wVvoQIdD80U)を聞きながらプロットするのが礼儀になっているようです．（嘘です）

# 2.環境
- Python 3.6.0
- matplotlib (2.0.0)

# 3.データの生成
このプロットをみて，ベイズ更新やスペクトログラムのプロットに便利そうだなと思ったので，今回はとりあえずスペクトログラムのプロットを試します．
scipyのspectrogramの[example](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.spectrogram.html)をそのまま使います．

```python
from scipy import signal
import matplotlib.pyplot as plt
fs = 10e3
N = 1e5
amp = 2 * np.sqrt(2)
noise_power = 0.01 * fs / 2
time = np.arange(N) / float(fs)
mod = 500*np.cos(2*np.pi*0.25*time)
carrier = amp * np.sin(2*np.pi*3e3*time + mod)
noise = np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
noise *= np.exp(-time/5)
data = carrier + noise

f, t, Sxx = signal.spectrogram(data, fs, nperseg=1000, noverlap=900)
```

# 4.プロット

[stackoverflowのここ](https://stackoverflow.com/questions/29883344/how-can-i-make-waterfall-plots-in-matplotlib-and-python-2-7)を参考にしています．

```python

y = Sxx.T

# 数が多いのでスライスする．
y_subset_num = 10
x_subset_num = 20
y = y[0:y_subset_num, 0:x_subset_num]
ny, nx = y.shape 
x = f[0:x_subset_num]

y_delta = (y.max() - y.min()) / ny # このy=deltaずつずらしてプロットする．
yticks = [] # yticksの位置を保存する用 

fig = plt.figure()
ax = fig.add_subplot(111)

for iy in np.arange(ny):
    offset = (ny-iy) * y_delta # 上から順にプロットする
    y_value = y[iy] + offset # offset分だけずらす．
    ax.plot(x, y_value, color='w', lw=1, zorder=iy)
    ax.fill_between(x=x, y1=y_value, y2=offset, alpha=0.5, lw=0, zorder=iy, color="red")
    # y_valueの線をプロットし，その下を塗っていく．
    yticks.append(offset)

# プロットの上の方が若いので逆順にする．
yticks = yticks[::-1]
ytickslabel = np.arange(len(yticks))[::-1]

ax.set_yticks(yticks)
ax.set_yticklabels(ytickslabel)

ax.set_xlabel("Frequency [Hz]")
plt.show()
```

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/164264/949d96d8-7664-f430-469b-686050a0318b.png "figure_1.png")

こんな感じになります．
綺麗に見せるためには，割と調節芸が必要で．上記コードの```y_delta```あたりを変える必要があります．

# 5.最後に（2017/8/26追加）
seabornのexampleに先月joyplotが追加されているのを発見してしまった．
https://github.com/mwaskom/seaborn/blob/master/examples/kde_joyplot.py

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/164264/bc3d8704-8c3d-8e9f-efec-444c0bc7ba7b.png "figure_1.png")

さらに，[joypy](https://github.com/sbebo/joypy)も発見した．
![temperatures.png](https://qiita-image-store.s3.amazonaws.com/0/164264/46f15682-c559-a21f-9a21-bfd3f2af5d5c.png "temperatures.png")

この二つのいずれかを使うのがいいだろう．
Switch購入をNightmare.jsで半自動化する

Nightmare.js を見かけて、調べてみたら思いのほか簡単に扱えそうだったため、Switchの購入を自動化できないか試してみました。

---

[Nightmareがv2(Electronベース)になり、使いやすく感動したのでLIGブログのPV/UUデータ取得を自動化してみた。](http://qiita.com/n0bisuke/items/8a7a52321380e5cf0379)

---

以下は、2分毎にカートに入っているか確認し、カートに入っていた場合は 「ご注文手続きへ」ボタンを押下させるスクリプトです。

**CART_URL** には、任意のSwitchをカートに入れた後のURLを設定する必要あり。

```js:app.js
var Nightmare = require('nightmare');
var vo = require('vo');
var nightmare = Nightmare({ show: true });

// カートに入れた後のURLを設定
// 以下は「赤・黒・青・黒」のカラーリングのSwitchと、ゼルダのパッケージ版。
var CART_URL = "https://store.nintendo.co.jp/cart_index.html?request=insert&cx24base=HAC_S_KAYAA&cx24set1=KA&cx24set2=KA&cx24set3=BA&&cx24set4=PA&item_cd_list=HAC_P_AAAAA";

// カートにアイテムが入ったかを確認
// 商品リスト部分のHTMLに「HAC_S_KAYAA」(Switchの商品コード)が含まれているかを確認
// indexOfの結果を返す
function checkItem(nightmare) {
  return nightmare
    .goto(CART_URL)
    .evaluate(function () {
      return document.querySelector('.item_area').innerHTML.indexOf("HAC_S_KAYAA");
    });
}

// 「ご注文手続きへ」ボタンを押下する
function addToCart(nightmare) {
  return nightmare
    .click('#cartFlow .buttonarea .add')
}

// 商品リストチェックのループ用関数
// チェック結果次第で、ループするか、進むかを分岐
function* run() {
  // カートを開く
  yield nightmare
    .goto(CART_URL);

  // カートに入ったかを確認
  let match = yield checkItem(nightmare);

  if(match<1) {
    // 商品リストにSwitchが含まれていなかった場合
    // 2分待ってリロードし、再度チェック
    yield nightmare
      .wait(120000)
      .refresh();
    vo(run)(function(err, result) {
        if (err) throw err;
        console.log(result);
    });

  } else {
    // 商品リストにSwitchが含まれていた場合
    // 次のページへ進む！
    yield addToCart(nightmare);
  }

  return match;
}

// チェック開始！
vo(run)(function(err, result) {
    if (err) throw err;
    console.log(result);
});
```

チェックに成功すると、ログイン画面で待機状態になります。
ログインだとかはややこしそうなので省きました。
業務システムにおける例外の種類

# これは何？
* Java言語を利用した業務システムの例外についての考えをまとめたもの
 * 0から考え出した、というより見聞きした結果をまとめたもの
 * メモなのであまり丁寧に書かない。

# Javaの例外

* チェック例外
* 非チェック例外

どちらを使っても良いが、業務ロジックの中であらゆる例外を try-catch しているとめんどくさいので、非チェック例外でやった方が楽ちんな気がしている。（コード量が減る、関心のある例外のみハンドリングすれば良い。が、ハンドリングしたい例外を明示したい（強制させたい事情が絶対的にある）場合は、チェック例外とすべき場合もある？）
というものの、チェック例外・非チェック例外をどうするか論争は色々あるので、ここでは踏み込まず、必要であれば設計時に注意することにする。（提供側の視点、利用する側の視点・アプリの要件などのバランスで考える）

# 業務観点の例外

* 業務が継続できる（何かやり方を変えることで業務ができるようになる（入力値を直すなど）エラー。利用者はなにか回避しようがあるケース。）
 * 単純な例外送出：　普通の throw XxxxException 的なやつ。
 * 警告の類いの例外：　「○○ができてないけど本当に登録していいの？」みたいな警告を出すだけで、業務フローは継続できるようにしたいといった場合に対応する例外。
 * 一気にたくさん出す例外：　「入力」→「確認」→「修正」ごとに逐一例外出されてはうざいので、「言いたいことは全部言って欲しい！」といった場合、例外を一気に出したい場合がある。こういうケースに対応する例外。
* 業務が継続できない例外（DBに繋がらないとか、相手先システムに繋がらないとか、そもそもシステムを動かすことができなくなるエラー。利用者は何もしようがないケース。）

これらの例外をチェック例外・非チェック例外どっちで実現するかを考える。
[メモ]OpenAIでアルゴリズムトレードのgym環境を構築しているリポジトリ

元ブログ記事は[こちら](http://tono-n-chi.com/blog/2017/08/open-ai-algorism-trade-repository/)。

[ここ](https://discuss.openai.com/t/gym-and-agent-for-algorithmic-stock-and-cryptocurrency-trading/519/14)でよく議論されている。

## gymのリポジトリ

上記スレッドで見つけたのは下記4つ

[https://github.com/deependersingla/deep_trader](https://github.com/deependersingla/deep_trader)

[https://github.com/hackthemarket/gym-trading](https://github.com/hackthemarket/gym-trading)

[https://github.com/Henry-bee/gym_trading](https://github.com/Henry-bee/gym_trading)

[https://github.com/AdrianP-/gym_trading](https://github.com/AdrianP-/gym_trading)


あと検索で見つけたのがこちら

[https://github.com/harveybc/gym-forex](https://github.com/harveybc/gym-forex)

あとで読んでみよう。