OmniAICreator/Qiita-1.07M huggingface dataset:
指定サイズのファイルを作成するスクリプト作った

### コード
---

```js
var fs = require('fs');

var size = 1024;

var list = [];
for (var i = 0; i < size; i++) {
  list[i] = 0;
}

fs.writeFileSync('out.txt', list.join(''));
```

見たまんまかと思いますが、sizeが指定容量で一旦配列にぶっこんでから、書き込んでいます。（引数で指定できるようにしてくれとか、言われそうではありますが。。）

このやり方だと、使えるメインメモリのサイズしか作れないので注意です。また、Node.jsは最大メモリサイズとかデフォルト値があるので、デフォを超える容量で作成したい場合、`--max-old-space-size=4096` などと指定して確保量を上げてください。

本当はメモリに確保せず、都度書き込んでいけば良いじゃんという話もあるのですが、そんなに巨大なサイズ自分は要らないかなぁとか、若干コーディング面倒だなぁということで、諦めたエデュションとなっています。なんかリクエストが多かったら確保しない、諦めなかったエデュション用意しても良いかもですね(・∀・)

### 作った理由
---

Androidのスマホを使っているのですが、普通に初期化するとファイル自体は残ってしまう仕様らしいです（iphoneはちゃんとやってくれるのですが。。）

そこで、「暗号化してからリセットする」というのが定石となっているのですが、空き領域まで暗号化してくれるのかどうか？が、わからず、仮に削除したファイルが暗号化されないと、結果残っているのと一緒になります。（僕の使っているHTCだとファイル使用量が多いと暗号化に時間が掛ると書いてあったので、空き領域を暗号化していない可能性が高いです。）

なので、空き領域全部にファイルを書き込んでから暗号化したら完璧と思い作った次第です。
プロダクト視点からのAngular/Ionicのバージョニングの魅力

この記事は、[Angular Advent Calendar 2017](https://qiita.com/advent-calendar/2017/angular)の記事でした。公開日に間に合わず、枠をキャンセルしましたので一般記事として公開します（関係者の皆さん大変ご迷惑おかけしました）

---

とても魅力的なAngular/Ionicのバージョニングが残念な論調で語られるのを聞いたので、プロダクト採用という視点で改めてバージョニングについて見直したいと思います。

# Angular/Ionicのバージョニング
Angular/IonicはSemantic Versioning(SemVer)を採用しており、Angularは今後のバージョンアップは6ヶ月毎のサイクルでメジャーバージョンを更新することを宣言しています。Ionicが利用している `ionic-angular` もAngularに依存しているので、Angularほど厳格ではないものの、ほぼそれに伴ったメジャーバージョンの更新を行っています。

| 時期 | バージョン |
|:-----------|:------------|
| 2017/09 | Angular 5 |
| 2018/03 | Angular 6 |
| 2018/09 | Angular 7 |
| 2019/03 | Angular 8 |

まぁ、Angular 5がリリースされたのが11月（2ヶ月遅れ）なので、そこまで厳密なものではありませんが。一応は、最新版に追随しつづけようとすると、6ヶ月に1回は新APIがきて、1年毎に破壊的変更がくる可能性が高いわけです。

# バージョニングの背景
AngularJSの反省によるものです。後方互換を気にしすぎたために、フロントエンドの最新技術を取り込むことができずに、リリース当時先進的だったAngularJSは、Components指向の開発、npmによる共通リソースを活用などの時代の変化をキャッチアップできず、徐々に時代遅れになっていきました。

Angular 2が発表された時に、「これはAngularシリーズなのか？！」「全く別物だ」「アップグレード無理じゃない？」「ng-upgradeつらみしかなさそう」とざわめいたのはまだ記憶に新しいのではないでしょうか。

そこで、Angularチームは「安定性が重要」といいながらも、新たに生まれる技術をキャッチアップするために「予測できる形で新技術を導入しつづける」ために、このバージョニングを採用しました。

参考： http://angularjs.blogspot.jp/2016/10/versioning-and-releasing-angular.html

## これまでのバージョニングの恩恵
実際にこのバージョニングの変更によって、現在私は以下のような恩恵を受けています。すべては書ききれないので、思いついたものだけご紹介します。

### TypeScriptのバージョンアップ
dependencyにあるTypeScriptのバージョンが1から2にアップデート。このことにより、サポートされている文法が増えました。

TypeScript 2 のモダンな書き方
https://qiita.com/karak/items/ef69aa71c19932fa5c1b

### コンパイルのサイズ縮小
ビルドサイズが最大60%削減されました（公式発表）。実際にウェブサイトの表示が高速化された実感はあります。

参考
http://angularjs.blogspot.jp/2017/03/angular-400-now-available.html

Angular2 AoTコンパイルでTechFeedを高速化した話
https://medium.com/@techfeed/angular2-aot%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A7techfeed%E3%82%92%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%97%E3%81%9F%E8%A9%B1-55efa68189a5

### Lazy Loading
Lazy Loadingが実装されました。これにより、JSファイルを分割して、必要なものだけを先にダウンロードしてもらうことが可能になりました。コンパイルサイズの縮小とあわせて、アプリの規模によっては数秒単位での高速化が実現します。

![tutorial_loading.png](https://qiita-image-store.s3.amazonaws.com/0/100460/d35e393d-308f-86e9-3973-7976f660c295.png)

### HttpClientModule
Angular 2ではHttpModuleがデフォルトだったのですが、Angular 4.3でHttpClientModuleが追加されました。まだAngular 2がでたばかりではAPI活用はjson以外も散見されたのですが、最近ではjsonがほとんどなのでjsonデフォルトに変更されています。
また、型付けがやりやすくなっており、ミドルウェア的にHttp通信をハックできる `Interceptor` という機能も新設されています。

HttpModuleからHttpClientModuleに乗り換えたら、実装がとても快適になりました。

# プロダクト視点からのAngular/Ionicのバージョニングの魅力
「安心感」の一言につきます。プロダクトのテクニカルな寿命は、依存するフレームワークと開発者の最新技術のキャッチアップに依存する部分が大きいと思っています。ですので、AngularJSを採用しているプロダクトはキャッチアップすることができず、改善しようと思うと「フレームワークを乗り換えて、すべて書き直す」必要さえありました。

一方、Angular/Ionicは最新バージョンの追随さえすれば、一定のキャッチアップは保証されています。それは破壊的APIがくること以上に大きなメリットであり、プロダクト寿命を延ばすことにつながります。

そういう意味だと、短期的なアプリーー受託して納品して終えるような手をいれつづけないものにはこのバージョニングはメリットはないかと思います。逆に「開発中にバージョンあがった！！」というのは混乱を起こすこともありえて、敬遠する開発者がいることもわかります。おそらくこういったシチュエーションを指して「変更が激しい」みたいな話になるのだと思います。

しかし、長期運用前提の場合だとそれは当てはまりません。実際にIonicを採用した私が開発してるアプリは、手をいれる時間がなくバージョンをあげているだけのものも、ユーザには「改善されていってる」と評価をいただいています。ルーティングから、Http通信まわり、コンパイルまでが総合的に最新技術をキャッチアップしてバージョンアップされている恩恵は、長期運用するアプリにとってはとてもメリットが大きいことを実感しています。

# おわりに
ぜひ本稿が、「フレームワークの破壊的変更は悪」という思い込みをすてる一助になりましたら幸いです。

それでは、また。
ElmのSPAへの第一歩のNavigation

　Elmはシンプルで素晴らしんだけど、ドキュメントが弱い気がします。このブログでは、初心者の私がいろいろなソースを見つけて備忘録を付けています。そこで他のJavaScriptライブラリのようにRouterを使いたいと思い、とりあえずNavigationにたどり着きました。
http://package.elm-lang.org/packages/elm-lang/navigation/latest/Navigation

　通常のHtmlではリンク(aタグ)をクリックしたときに、通常のように別ページを読み込むためのリクエストをサーバに送り、別ページに遷移します。Navigationはこの動作を、Msgを発行してupdate関数を呼ぶように変更します。以下がサンプルです。
https://github.com/elm-lang/navigation/tree/master/examples


```elm:
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Navigation


main =
  Navigation.program UrlChange
    { init = init
    , view = view
    , update = update
    , subscriptions = (\_ -> Sub.none)
    }


-- MODEL
type alias Model =
  { history : List Navigation.Location
  }


init : Navigation.Location -> ( Model, Cmd Msg )
init location =
  ( Model [ location ]
  , Cmd.none
  )


-- UPDATE
type Msg
  = UrlChange Navigation.Location

{- We are just storing the location in our history in this example, but
normally, you would use a package like evancz/url-parser to parse the path
or hash into nicely structured Elm values.

    <http://package.elm-lang.org/packages/evancz/url-parser/latest>

-}
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    UrlChange location ->
      ( { model | history = location :: model.history }
      , Cmd.none
      )


-- VIEW
view : Model -> Html msg
view model =
  div []
    [ h1 [] [ text "Pages" ]
    , ul [] (List.map viewLink [ "bears", "cats", "dogs", "elephants", "fish" ])
    , h1 [] [ text "History" ]
    , ul [] (List.map viewLocation model.history)
    ]

viewLink : String -> Html msg
viewLink name =
  li [] [ a [ href ("#" ++ name) ] [ text name ] ]


viewLocation : Navigation.Location -> Html msg
viewLocation location =
  li [] [ text (location.pathname ++ location.hash) ]
```

　まず次の宣言ですが、これで画面上でURLリンクをクリックしたときに UrlChange Navigation.Location のMsgを発行してくれるようになります。

```elm:
main =
  Navigation.program UrlChange
    { init = init
    , view = view
    , update = update
    , subscriptions = (\_ -> Sub.none)
    }
```

念のためにprogram関数の型をあげておきます。

```elm:
program
    :  (Location -> msg)
    -> { init : Location -> (model, Cmd msg), update : msg -> model -> (model, Cmd msg), view : model -> Html msg, subscriptions : model -> Sub msg }
    -> Program Never model msg
```

　Msgを受け取ったupdateはmodelのリストにlocationを追加します。追加のコードは以下です。

```elm:
 { model | history = location :: model.history }
```


　これは見易いようにカッコを付けると以下のようになります。

```elm:
 { model | history = (location :: model.history) }
```


　このプログラムを実行すると"bears", "cats", "dogs"などのリンクが表示されますので、それらをクリックすると、以下のようにlocation.pathname ++ location.hashを表示するものです。例えば、path="/examples/Example.elm"、hash="#dogs"となっています。

```
History
/examples/Example.elm#dogs
/examples/Example.elm#cats
/examples/Example.elm#bears
/examples/Example.elm
```

　プログラム中のコメントは次のように言っています。つまり、ここではlocationはただ単にそのままリストに蓄えていっているけれども、普通はpathnameやhashの文字列をparseして、Elmの構造化された値に変換します。evancz/url-parserというElm作者の作ったパッケージが使われます。
ディープラーニングのことが何となくわかった（読後メモ：人工知能は人間を超えるか）

タイトルを変更して加筆・修正しました＠2017-12-30
旧題：ディープラーニングも学べる名著「人工知能は人間を超えるか」がAmazonで300円を切ってるので宣伝します。

#どんな本？
書籍情報：
　　タイトル -- 人工知能は人間超えるか ～ディープラーニングの先にあるもの～
　　著者　　-- 松尾豊（東京大学准教授）
　　出版年　　　　-- 2015/3/10
　　紙の本の長さ　 -- 242 ページ
　　ファイルサイズ-- 14.5 MB
　　出版社　　　　 -- KADOKAWA / 中経出版
　　[Amazonのページ](https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E8%A7%92%E5%B7%9D%EF%BC%A5%EF%BC%B0%EF%BC%B5%EF%BC%A2%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A-ebook/dp/B00UAAK07S/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1514583479&sr=1-1&keywords=%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B)

想定読者：「人工知能に興味はあるが詳しいことは知らない人」
　　おおむね一般向けと言っていいと思います。
　　あとがきによれば、経済産業省のお役人さんに頼まれて
　　「素人にも人工知能のすごさがわかるように説明したプレゼン」
　　が元になっているそうです。

著者について
　　「日本トップクラスの研究者」（あらすじより）
　　東京大学 特任准教授
　　日本人工知能学会倫理委員長（2014/12～）



#おすすめ：☆５
人工知能に興味があるシロウトの入門書としては最適でしょう。
実績のある研究者が人工知能研究の歴史から将来予測までを平易な言葉で解説してくれています。
特に出版当時話題だったディープラーニングについては１章を割いてじっくり説明しています。

僕自身は初読時に「ディープラーニングって話題になってるけど、どういうことなのか全然わからん」という状態でしたが、読み終えた後は「大体こういうことらしいな」というところまでは行きました。最新技術の本って「何とか最後まで読んだけど結局何だったのか全然わからん」ってこともよくあるので、かなりよい本なのではないかと思います。

ただ、僕自身は知識こそなかったものの、人工知能というものにそれなりの興味があったため、ディープラーニングの解説が始まる第５章までそれなりに熱心に楽しく読めましたが、そこに至るまで100ページ以上はあるので、人によってはキツイのかもしれません。たとえ話をたくさん交えてくれたり、「ざっくり言うとこういうこと」のようなまとめを入れてくれたり、冒頭で「この章は大体こんな話」と述べてくれたりと、様々な工夫がこなされていますので、読みやすいとは思いますが。

##ディープラーニングのことはどのくらいわかった？
主成分分析についてある程度理解していたため、機械学習が大雑把には主成分分析に近いことをしていて、ディープラーニングは「主成分分析を非線形にし、多段にした上で、各主成分の頑健性を高める工夫をするもの」である、と言われれば、「はえーなるほど、そうなんか」ってなりました。わかった（わかったとは言ってない）くらいのもんで、実際にディープラーニング使って何かをする、みたいなことは遥か彼方にあるわけですが、、、


#面白かったところをピックアップ
##で、人工知能は人間を超えるの？
A. 超える（というか、一部ではすでに超えている）
本書でも将棋でコンピューターが名人を破った例が挙げられています。「人間そのもの」のような人工知能が出現するにはまだまだ相当な時間がかかるのでしょうが、知性とされるものの一分野においては既に追いつき、追い越していると言えるでしょう。
CPUの処理能力が一定水準を超えた現在、肉体疲労というバッドステータスが存在しないコンピューターに対し、人間が勝つのはもはや困難なのでは、と思います。2015年4月の電王戦のようにプログラムのバグをついて勝つ、というのも状況によってはありうるんでしょうけど、バグは克服されますし。

##人工知能ブームに乗り切れない人工知能研究者たち
現在のディープラーニングとビッグデータによる人工知能の流行は第三次AIブームと位置付けることができ、第一次（60年代）、第二次（80年代）のAIブームも存在しました。それぞれのブームの後には「やっぱり人工知能なんてできないじゃないか」となり、人工知能研究者はかなり冷遇されたため、それなりの年齢の研究者たちは今回のブームにおいても慎重に見定めようとしているそうです。

##AlphaGoについて
本書の出版年は2015年3月ですが、囲碁については「将棋よりもさらに盤面の組み合わせが膨大になるので、人工知能が人間に追いつくのはもうしばらく先になりそうだ」とあります。実際には二年後には世界チャンプを倒し、人類の理解できない領域に到達してしまったわけで、改めてAlphaGoについて興味がわいてきました。

##「人工知能が人類を支配するなんて滑稽」
全体を通して「人工知能研究の推移を予測するのは専門家でも困難」という慎重な論調なのに、人工知能脅威論に関してはかなり強く否定しています。これは筆者さんの立場（日本人工知能学会倫理委員会委員長）があるからじゃないかなーと想像します。倫理委員会の人が「まぁ、どうなるかはわかりませんけど、そんなことになったら面白いですよね」とは言えないでしょうし。

##人工知能は人類の知性とはかけ離れたものになるかも
人間の知性は肉体のセンサーによる入力（視覚、聴覚、触覚、嗅覚、味覚）を元に形成されるわけで、異なるセンサーを持つコンピューターが形成する知性が人間と全く同じものになる方がおかしい、というようなことが述べられていました。これは言われてみれば尤もなことで、ますます人工知能の魅力が増すな、と感じました。人類のコピーではなく、全く異なる知性体を創り出せるというのは、とても興味深く価値のあることです。
「車より速く走れなくても、ウサイン・ボルトが偉大であるように、コンピューターが人間より賢くなろうとも、人間の知性の価値が損なわれることはない」というようなことをどこかで読んだ記憶がありますが、人工知能が進歩していった結果、単に人間の上位互換ではなく、異なるハードウェアに基づく異なる知性体系を持った隣人となり、お互いに尊重しあえるとしたら、それこそ人類史上最大の発明と言えるんだろうなーと
アニメ顔を半自動で抽出するスクリプトを作ってみた

# はじめに

趣味でアニメキャラの自動識別をやってみたのですが、学習用に元画像から顔を切り抜く作業が大変で
人力でやると時間がかかるし、かと言って自動識別だと誤検出があるので、
その中間をとって、自動識別のアシストのもと半自動で行うものを作ったので公開します。

Github に上げているので、気に入った方は煮るなり焼くなりして自由に弄って下さい。
ガバガバ英語の説明つきです。
https://github.com/YankeeDeltaBravo225/AnimeFaceExtractHelper

たぶん、既にどこかの誰かがやっている気がしますが、詳しい使い方まで書いたのは多分自分だけのはず・・・

以下のような画像から
![InputImages.png](https://qiita-image-store.s3.amazonaws.com/0/199141/b885c7e0-20b7-b295-42b7-3077e7c1cab5.png)

このように顔部分だけを切り出します。
![ExtractedImages.png](https://qiita-image-store.s3.amazonaws.com/0/199141/57d18cfe-fe13-efea-9099-0ca70cd2ff86.png)

説明用の画像は全て girlysozai.com さんの素材をお借りしました。

# 準備

以下のものが必要です。

## Python3
Anacondaを使うのが無難だと思います。
参考：
[Anaconda で Python 環境をインストールする](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)

## Open CV
参考：
[[Python]PythonでOpenCVを使う (基本編)](https://qiita.com/supersaiakujin/items/54a4671142d80ca962ec)

## lbpcascade_animeface
https://github.com/nagadomi/lbpcascade_animeface
ダウンロード後、私のスクリプトと同じディレクトリに置きます。
![FileLocation.png](https://qiita-image-store.s3.amazonaws.com/0/199141/6a39517f-5289-e929-05c2-64dfd1c16de3.png)

# 使い方

第1引数が元画像の入ったディレクトリ、第2引数が出力先のディレクトリです。
出力先ディレクトリは無かった場合、作ります。
既にあった場合、ファイルが上書きされるので注意。

```shell
python AnimeFaceExtractHelper.py <input directory> <output directory>
```

こちらを実行すると、元画像ディレクトリにある画像一枚一枚に対して、
lbpcascade_animeface で顔検出を行い、結果を白枠で表示します。
![SelectionWindow_0.png](https://qiita-image-store.s3.amazonaws.com/0/199141/e57b15d2-a36a-1163-99a6-d21c4edc5b93.png)

青枠になっている所は現在選択されている箇所で、他のところを選択したい場合、キーボードの右キーか左キーで切り替わります。
![SelectionWindow_1.png](https://qiita-image-store.s3.amazonaws.com/0/199141/3d3be2ab-edb2-9f1b-50b6-cc63c4056a30.png)

Enterキーで青枠の領域を切り抜いて保存し、次の画像に進みます。
ESCキーを押した場合、保存せずに次の画像に進みます。

なお、キーコード定義は以下ですが、環境によって異なると思いますので適宜調整してください。

```py3
KEY_ENTER   = 0xD
KEY_ESC     = 0x1B
KEY_L_ARROW = 0x250000
KEY_R_ARROW = 0x270000
```

lbpcascade_animefaceでの検出に失敗した場合、以下の様に上記で説明した白と青の枠は出ません。
![SelectionWindow_2.png](https://qiita-image-store.s3.amazonaws.com/0/199141/393678d8-2812-6032-0d4a-85560df016d6.png)

その際は、マウス入力で選択してください。
なお、検出成功時もマウス入力で範囲を変えることができます。

入力範囲が正方形でない場合、枠は赤く表示され、この状態でEnterを押しても保存されません。
![SelectionWindow_3.png](https://qiita-image-store.s3.amazonaws.com/0/199141/0e926164-dabf-8f8a-4f64-f5e4e5144552.png)

正方形になるよう領域を調整すると、枠が青色に変化します。
![SelectionWindow_4.png](https://qiita-image-store.s3.amazonaws.com/0/199141/e8fceb43-2a71-aa0b-95a9-b64f87ab7b43.png)

この状態であれば、Enterを押した際に青枠内が保存されます。

# 参考文献

以下を参考にさせていただきました。

[【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale)](https://qiita.com/FukuharaYohei/items/ec6dce7cc5ea21a51a82)
[OpenCV3とPython3を使った物体追跡（マウスで指定した特徴点をLucas-Kanade法で追跡する）](https://qiita.com/hitomatagi/items/3d8973f855e963c9d999)
IrfanViewがいつの間にか4.50アップデート

簡単な画像加工ができる海外のIrfanViewが4.50にアップデートされたようです。
https://www.fosshub.com/IrfanView.html/irfanview_plugins_450_setup.exe

私は4.44（64bit）を使っていましたが、
問題なく上書きでアップードされて日本語も表示されています。（英語で使えばいいのですがやはり日本語表示の方が楽です…）
しかも何故か私の環境では使えなかったペイントツールが復活したという…。


日本語化の有志の方が引退なされましたが、
4.50用のDLLを配布している方がどうやらいらっしゃるようです。
https://kzstock.blogspot.jp/2017/10/irfanview-450.html

http://hokanko.mond.jp/wordpress341/irfanview%E3%82%92ver-4-50%E3%81%AB%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%82%89%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A1%A8%E7%A4%BA%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F
kotlin書き換え時の「エラー: パッケージxxxは存在しません」「エラー: シンボルを見つけられません」対処メモ

Javaで書かれたテストコードをkotlinと共存しながら、書き換えをおこなっていた際にエラーが出たのでメモ。

## 内容

エラーメッセージは以下。

```
/Users/nakayama/StudioProjects/ChatMessageView/example/src/androidTest/java/com/github/bassaer/example/MessengerActivityTest.java:13: エラー: パッケージcom.github.bassaer.example.matcherは存在しません
import com.github.bassaer.example.matcher.MessageListMatcher;
                                         ^
/Users/nakayama/StudioProjects/ChatMessageView/example/src/androidTest/java/com/github/bassaer/example/MessengerActivityTest.java:146: エラー: シンボルを見つけられません
        onView(withId(R.id.message_view)).check(matches(MessageListMatcher.withListSize(0)));

```

java配下のMessagngerActivityTest.javaからkotlin配下のMessageListMatcher.ktを呼び出す処理を書いていたらビルドは通るが、実行すると上記のエラーが発生。

```
├── androidTest
│   ├── java
│   │   └── com
│   │       └── github
│   │           └── bassaer
│   │               └── example
│   │                   ├── MainActivityTest.java
│   │                   ├── MessengerActivityTest.java
│   │                   ├── matchers
│   │                   │   ├── DrawableMatcher.java
│   │                   │   ├── ImageViewDrawableMatcher.java
│   │                   │   └── TextColorMatcher.java
│   │                   └── util
│   │                       └── ElapsedTimeIdlingResource.java
│   └── kotlin
│       └── com
│           └── github
│               └── bassaer
│                   └── example
│                       ├── matcher
│                       │   ├── ColorMatcher.kt
│                       │   └── MessageListMatcher.kt
│                       └── util
└── main

```
sourceSetsでkotlinフォルダも読み込むようにしているが、エラーが発生する。

```
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
    androidTest.java.srcDirs += 'src/androidTest/kotlin'
    test.java.srcDirs += 'src/test/kotlin'
}
```

## 結論

これを書くのを忘れていました。

```
apply plugin: 'kotlin-android'
```

以上。
スタッキングクラシファイア- MLXTEND 

この手法は、過度に似ていない複数の優れたモデルがある場合に最も効果的です。

- トレーニングセットを2つの互いに素なセットに分割する。
- 最初の部分にいくつかの基礎学習者を訓練する
- 第2部の基礎学習者をテストします。
- 予測を入力として使用し、正しい応答を出力として使用して、より高いレベルの学習者を養成します。

基本的に、レベル1の分類器は、同じ目標関数を近似するために分類器（レベル0分類器）から出てくることを（レベル1分類器）把握させます。 結合機構。

![stacking.png](https://qiita-image-store.s3.amazonaws.com/0/190498/a204f771-6170-cfb6-41a5-ccdd897654a0.png)

*Source: https://rasbt.github.io/mlxtend/user_guide/classifier/StackingClassifier/*


## ワインデータを読み込む

```python3
from sklearn.datasets import load_wine

x, y = load_wine(return_X_y=True)

```

## 3つの基本分類子と1つのメタ分類子を定義する

```py3
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier 


extra = ExtraTreesClassifier()
log = LogisticRegression()
knn = KNeighborsClassifier()

rf_metaclassifier = RandomForestClassifier()

```

## スタッキングモデルをトレーニング/テストするためにmlxtendライブラリを使用する

```py3
from mlxtend.classifier import StackingClassifier
from sklearn.model_selection import cross_val_score


sclf = StackingClassifier(classifiers=[extra, log, knn], meta_classifier= rf)

classifiersList = [mlp, log, knn, sclf]
labelsList = ['Extra Trees', 'Logistic', 'KNN', 'StackingClassifier']


for clf, label in zip(classifiersList, labelsList):
    scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
    print("Accuracy: {} [{}]".format(scores.mean(),label))
```
```shell
Accuracy: 0.967543859649 [Extra Trees]
Accuracy: 0.956432748538 [Logistic]
Accuracy: 0.675773993808 [KNN]
Accuracy: 0.977777777778 [StackingClassifier]
```
Google App Maker ー Application 実行アカウントについて

App Maker はサーバースクリプト（GAS）を次のどちらのアカウントで実行するかを選択します。

* User's account
* Developer's account

デフォルトは`User's account`になっており、大体の場合はそのままで大丈夫です。
ただし`Developer's account`を使ったほうが良い場合もあります。
本記事は2つの Application 実行アカウントの違いを理解し、使い分けが出来るようになることが目的です。


## 用途による使い分け
次のようにどちらのアカウントで実行するかで変わってきます。
同じメール送信でも送信元が変わってくるということです。

### User's account
* ユーザーからメールを送信したい
* ユーザーのカレンダーに予定を登録したい

### Developer's account
* 開発者からメールを送信したい
* ユーザーに共有していないスプレッドシートのデータを読み書きしたい



## Quota 消費による使い分け
[Quota](https://developers.google.com/apps-script/guides/services/quotas)の消費アカウントが変わってきます。
たとえば GmailApp でのメール送信には `1500受信者/日` という Quota があります。
※ App Maker の裏側は GAS なので GAS と同じ Quota が消費されます。

それぞれのアカウントで見ていきます。

### User's account
`User's account`の場合、App Maker にアクセスしたユーザーの Quota を使います。
アクセスしたユーザーの Quota が消費されるので Quota 消費がバラけます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/492a9045-a369-044c-f5e1-69e1f01853e9.png)

### Developer's account
`Developer's account`の場合、App Maker にアクセスしたユーザーの Quota を使います。
アプリケーションを公開したユーザーの Quota が消費されるので Quota 消費が集中します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/c033c1df-3346-9c88-a31b-c5745f131b25.png)

`Developer's account`の利点はユーザーの Quota を消費しないため、仮にユーザーのQuotaが使い切られていてもアプリケーションとして維持が可能なことです。

## Quota 一覧
一覧化されているので確認しておきましょう。
特に`URL Fetch calls`なんかは別のサービスとつなぐために使うので注意する必要があります。

[Quotas for Google Services  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/services/quotas)
ちょっとPyCharmを使ってみたい！

#はじめに
Pythonを勉強しはじめ、ちょっと背のびしたくなり、Pythonの統合開発環境を使いたくなった。
インストールしてみてちょっと使ってみるだけのtipsです。
#PyCharm概要
・PyCharmは、JetBrains社が開発したPython用の統合開発環境
・Pythonのための便利機能を提供している
##主な機能
1.Git操作
2.venv環境の作製
3.テスト静的コード解析の実行
etc...

#環境
![スクリーンショット 2017-12-24 16.55.58.png](https://qiita-image-store.s3.amazonaws.com/0/182799/4fa048f8-6349-f80d-e12b-44794c6770da.png)

#PyCharmのインストール
https://www.jetbrains.com/pycharm/

![スクリーンショット 2017-12-24 16.58.00.png](https://qiita-image-store.s3.amazonaws.com/0/182799/c5372734-045f-d8da-9577-9f735ea365b1.png)

![スクリーンショット 2017-12-24 16.59.12.png](https://qiita-image-store.s3.amazonaws.com/0/182799/139172b5-8cb8-5aee-bb96-3b4b52c0fe24.png)
今回は、Community版をダウンロード。

ダウンドードしたらインストーラーを機動。
![スクリーンショット 2017-12-24 17.02.23.png](https://qiita-image-store.s3.amazonaws.com/0/182799/016bcdb8-a23f-1cda-4347-66cf1ef811f3.png)

インストーラーに従ってインストールする作業を進める。
![スクリーンショット 2017-12-24 17.04.57.png](https://qiita-image-store.s3.amazonaws.com/0/182799/9e176304-7e25-c6ef-df05-3f2fa28ef422.png)

![スクリーンショット 2017-12-24 17.05.09.png](https://qiita-image-store.s3.amazonaws.com/0/182799/fcd5f887-ab22-525b-3295-f5ce2b010c8c.png)

![スクリーンショット 2017-12-24 17.05.19.png](https://qiita-image-store.s3.amazonaws.com/0/182799/7c45dc56-6577-184c-d0cc-491e97abc890.png)

![スクリーンショット 2017-12-24 17.05.28.png](https://qiita-image-store.s3.amazonaws.com/0/182799/09061d1e-9cb7-b7dd-9a45-65cdeaab5eb1.png)

![スクリーンショット 2017-12-24 17.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/182799/c1ac505b-589e-85d4-7ac8-b8cf8850285a.png)

「Welcome to PyCharm」と表示されればインストール完了。

#Pythonを動かしてみる
「Create New Project」をクリック。
「New Project」画面の「Create」をクリック。

![スクリーンショット 2017-12-24 17.11.02.png](https://qiita-image-store.s3.amazonaws.com/0/182799/7899b45c-c3ea-d332-c7eb-6d5f57007a51.png)

![スクリーンショット 2017-12-24 17.15.30.png](https://qiita-image-store.s3.amazonaws.com/0/182799/b258c1ab-d89f-750e-724c-5aeb3d0284ca.png)

Pythonファイルを作成するには、「untitled」を右クリックし「New」→「Python File」を選択。

![スクリーンショット 2017-12-24 17.16.58.png](https://qiita-image-store.s3.amazonaws.com/0/182799/fe973748-82c9-224a-59eb-2e7526e2ba3c.png)
「Name」を入力しOKボタンをクリック
![スクリーンショット 2017-12-24 17.18.35.png](https://qiita-image-store.s3.amazonaws.com/0/182799/84158636-96a2-dfa5-bef7-2ed21f925b67.png)

#ちょっと使ってみる
![スクリーンショット 2017-12-24 17.22.40.png](https://qiita-image-store.s3.amazonaws.com/0/182799/2d10ea1d-2d3c-d225-d974-1a7d8f4c8e08.png)
#感想
便利な機能が多いみたいなので、使い倒していきたい🤓
CentOS 7 on VirtualBox　構築手順メモ


> VirtualBox 5.2.4
> CentOS 7.4 64bit

# CentOS7インストーラの入手
ギガバイト級のダウンロードが発生するので、寝る前とか、お出かけ前にやると吉

1. https://www.centos.org/download/ にアクセス
2. 「DVD ISO」をクリック
3. 「Actual Country -」欄の好きなリンクをクリックしてダウンロード開始
4. 寝る


# 仮想マシンの作成
一番雑な方法
1. VirtualBoxを起動
2. 「新規」をクリック
3. 「名前」：好きな名前を入力
4. タイプ：「Linux」を選択
5. バージョン：「Red Hat (64bit)」を選択
6. あとはデフォルト設定のまま進んでいけばOK

# ネットワーク設定（マシン側）

## Virtual Box
ホストオンリーアダプター（TeraTermから接続する用のアダプター）の設定

1. 「Global Tools」をクリック
2. 「VirtualBox Host-Only Ethernet Adapter」をクリック
3. 「アダプター」タブを選択
4. 「Configure Adapter Manually」にチェック
5. IPv4アドレス：xxx.xxx.xxx.1 （例：192.168.100.1）
6. IPv4ネットマスク：255.255.255.0
7. 「DHCPサーバ」タブを選択
8. 「サーバーを有効化」のチェックを外す

## 仮想マシン

1. 作成した仮想マシンを右クリック
2. 「設定」をクリック
3. 「ネットワーク」をクリック
4. 「アダプター 1」タブを選択
5. 「ネットワークアダプターを有効化」にチェック（デフォルト入っているはず）
6. 割り当て：NAT（デフォルトでNATになっているはず）

7. 「アダプター 2」タブを選択
8. 「ネットワークアダプターを有効化」にチェック
9. 割り当て：ホストオンリーアダプターを選択
10. 名前：VirtualBox Host-Only Ethernet Adapterを選択
（あとはデフォルトのままでいいはず）

# 仮想マシンにCentOS7をインストール
## Boot
1. 作成した仮想マシンを選択して「起動」
2. ダウンロードしたISOファイルを選択して「起動」
3. 「Install CentOS 7」を選択してENTER

## 言語設定
「日本語」を選択して「続行」

## 各種設定

### インストール先
1. 「インストール先」をクリック
2. 「ATA VBOX HARDDISK」にチェックを入れて「完了」

### ネットワーク設定
1. 「ネットワークとホスト名」をクリック
1. 「イーサネット（enp0s3）」を選択し、画面右端のスイッチを「オン」
1. 「イーサネット（enp0s8）」を選択し、「設定」をクリック
1. 「IPv4のセッティング」タブを選択
1. 方式：手動
1. アドレス：ホストオンリーアダプターと同じネットワークで、アダプターと被らないIPを設定（例：192.168.100.10）
1. ネットマスク：24
1. 「保存」
1. 画面右端のスイッチを「オン」
1. 「完了」

## インストール
1. 「インストールの開始」
1. 「ROOTパスワード」をクリック
1. rootユーザのパスワードを設定して「完了」
1. （インストールには数分かかるのでお茶でも飲んで待つ）
1. 「再起動」

これでインストールは完了
ルートアカウントでログインできればOK

# ネットワーク設定（CentOS側）
1. $ nmtuiを実行
1. 「Edit a connection」を選択
1. 「hostonly」を選択
1. 「Automatically connet」のチェックをONにする
1. 「OK」
1. 「BACK」
1. 「Activate a connection」を選択
1. 「hostonly」をDeactivateしてからもう一度Activate
1. nmtuiを終了

$ ip aで enp0s8にIPアドレスが振られたことを確認


# リモートからアクセス
1. TeraTermを起動
2. 以下の設定で接続

```
ホスト：（hostonlyのIPアドレス）
ポート：22
サービス：SSH
SSHバージョン：SSH2
```

接続できればOK
失敗したらCent側のネットワーク設定が死んでるので確認

# yum update
古いバージョンのパッケージは脆弱性の問題とかあるから、とっとと最新版にバージョンアップする
通信回線によっては数十分かかるのでご飯の用意をしておくと吉

1. rootユーザでログイン
2. $ yum -y update を実行
3. ご飯食べる
4. うまい！

あとはユーザ作るなり、Webサーバ立ち上げるなり、`rm -rf /*` 実行するなり
重複する要素を除去するにはset関数を使おう

重複している要素が存在するリストから重複要素を取り除くにはset関数が便利です。

[set関数]:https://docs.python.jp/3/library/functions.html#func-set

# [set関数]
どう便利かと言うと例えば重複を含むデータに対して

```py3:対象データ
names = ["Suzuki", "Tanaka", "Kato", "Suzuki", "Kato"]
```
以下のようにset関数に渡してあげると、重複なしのsetオブジェクトを生成することができます。

```py3:set使用例
set_names = set(names)

print(set_names)

"""
{'Suzuki', 'Tanaka', 'Kato'}
"""
```

#　参考
 - ライブラリーリファレンス
  - [set関数](https://docs.python.jp/3/library/functions.html#func-set)
  - [setクラス](https://docs.python.jp/3/library/stdtypes.html#types-set)
PHPStormでEmmet

### 書式

`親タグ>(兄弟タグ1#ID.クラス[属性名=属性値]{テキスト}+兄弟タグ2+...)*繰り返し数`

1個の "\$" は連番、n個の "\$" は前ゼロ付きn桁固定長の連番。


### 例
PHPStormのエディタで以下のように入力する。

```text
table#q_tbl>(tr#q$$>((td.number1>span)+(td.op>span)+(td.number2>span)+(td.answer>input[type=text][name=answer$$][value=])+(td>button{解答})+(td.result>span)))*2
```

入力の末尾にカーソルがある状態でTabを押すと以下のようなHTMLに変換される。

```html
<table id="q_tbl">
  <tr id="q01">
    <td class="number1"><span></span></td>
    <td class="op"><span></span></td>
    <td class="number2"><span></span></td>
    <td class="answer"><input type="text" name="answer01" value=""></td>
    <td>
      <button>解答</button>
    </td>
    <td class="result"><span></span></td>
  </tr>
  <tr id="q02">
    <td class="number1"><span></span></td>
    <td class="op"><span></span></td>
    <td class="number2"><span></span></td>
    <td class="answer"><input type="text" name="answer02" value=""></td>
    <td>
      <button>解答</button>
    </td>
    <td class="result"><span></span></td>
  </tr>
</table>
```
Design Requirements



```
■ プロジェクトの作成
cd /var/opt/data
rails new DesignRequirements -d mysql


■ RGDsモデルの作成
rails g model RequirementTicket title:string requester:string reqGroup:string SID:string appteam:string
rails db:migrate
```

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :requirement_tickets do
    collection do
      get 'search'
    end
  end

  get 'requirement_tickets/new', to: 'requirement_tickets#new'

  resources :requirements do
    #get 'search', :on => :collection
    collection do
      get 'search'
    end
  end

  post "requirements/new" => "requirements#create"

end
```
gitのワークフロー（簡易版）の手順書

# はじめに
git-flowみたいな本格的なワークフローをやりたいけど、
でもその学習コストは時間がないし、かといって、gitもちゃんと運用したいし…
みたいな、　簡単にチーム開発のgit運用をしたいというチーム向けの手法です。

僕自身は別に経験があるエンジニアではないので、これが適切かどうかは判断しかねますが、
短期間でとりあえずリリースするだけみたいなチームには向いていると思います。
（数週間とかの単発プロジェクトとか）

# 全体像
![IMG_5894.JPG](https://qiita-image-store.s3.amazonaws.com/0/224815/af015082-0c75-faf0-6b2d-6210a219ca05.jpeg)

# 手順
### 元になるプロジェクトファイルをリモート上に作成

チーム開発の起点になる元のファイルを最初に作成し、

リモートレポジトリに予めpushしておきます。

### 自分の開発用リモートブランチを切る

リモート上にプッシュするブランチは、masterではなく、自分専用のブランチです。

ここでは、masterからdev_omoriを作成しておきます。

### ローカルをgit管理する

後ろのステップでgit cloneコマンドを最初に使うので、git管理を先立ってしておく必要があります。

自分の作業ディレクトリに進んで、

```bash
git init
```

をしてください。

### git pullで元になるプロジェクトファイルをローカルにコピー

元になるファイルをリモートレポジトリ（GitHub, bitbucketなど）に置いている前提です。

```
git remote add origin url
git pull origin master
```
でそのレポジトリをローカル（のmasterブランチ）にコピーしてきます。

※訂正171226
当初、pullではなくcolneで書いていましたが、cloneすると別プロジェクトということになってしまうので、ｐullに訂正しました。


###ローカルでもmasterから自分の開発用ブランチを切る

リモートと同様、自分の開発用ブランチを別で作ります。

```bash
cd testApp # クローンしたプロジェクトのフォルダに移動
git checkout -b dev_omori
```

以上で、リモートのmasterと同じファイルが、

- リモートのdev_omoriブランチ
- ローカルのmasterブランチ
- ローカルのdev_omoriブランチ

の三箇所に作成されている状況になります。

### 自分の開発用ブランチで開発を進める

キリの良いところまで開発したら、できるだけこまめにコミットします。

```bash
git status # 変更されたファイルを確認。必要ならgit diffも
git add .
git commit -m "コミットメッセージ"
```

皆と共有出来るまで開発が進めば、次に進みます。

### 自分のリモート開発用ブランチにpushする

ローカルで開発を進めた内容は、一旦リモートの自分の開発用ブランチにpushします。

```bash
git push origin dev_omori # 誤ってmasterにpushする恐れがあるので、追跡ブランチの設定をオススメします。
```

### プルリクエストを投げる

チーム開発の体制にもよりますが、通常はコードレビューをしてもらうため、

masterへのマージの前に、誰かにプルリクエストを投げて校閲をします。

bitbucketでは、以下の通りです。

![Pasted image at 2017_12_24 04_47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/224815/71ed369d-a95a-bea6-5005-7e2442e4012d.png)

![Pasted image at 2017_12_24 04_50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/224815/f3cbf659-6b28-aab6-85de-b7d2843bd61a.png)


### レビュワーがプルリクエストを承認

レビュワーに指定された人は、サイドバーでプルリクエストを選択した画面で、

リクエストの一覧が見られます。

クリックして詳細を確認し、内容に問題がなければ、承認の上、マージを行います。

（詳細は割愛）

### ローカルのmasterブランチに最新状態をpull

プルリクエストの承認が降りれば、自分の開発した部分および、他のチームメンバーの開発部分も含めた最新の状態がリモートのmasterに反映されています。

この最新状態から開発を進めるため、自分のローカルのmasterブランチに反映させます。

```Bash
git checkout master # マージ先はmasterブランチです。
git fetch origin master
git merge origin/master # git pull origin masterでfetchとmergeを同時に実行できますが、一般的には分ける方が良いみたいです。
```

### 開発ブランチにも最新状態を反映する

masterに反映された最新の状態を、開発用ブランチにも反映します。

```bash
git checkout dev_omori
git merge master
```

問題がなければ、これで完了です。

後は、開発して、リモート開発用ブランチにpushして…と繰り返しになります。
JavaScriptのオブジェクト指向部分のまとめ

仕事上、Javascriptは触りはしますが、しっかりとは勉強してこなかったので
基礎から学習したことを纏めていきます。
今回は、JSのオブジェクト指向周りをまとめていきます。
今ではES2015にてclass構文が追加されていますが、今回は基礎と言う事で、
class構文を使わない旧構文を対象とします。

#プロトタイプベースのオブジェクト指向
JavaやC#等の他のオブジェクト指向言語と根本的に異なる点として、JSはプロトタイプベースのオブジェクト指向言語である点が挙げられます。

とりあえず、プロトタイプベースのオブジェクト指向言語の、クラスベースのオブジェクト指向言語と比較しての特徴を挙げると、
・インスタンス化の概念が存在する(こちらはクラスベース同様)
・クラスの概念が存在しない
・プロトタイプの概念が存在する

プロトタイプとは「あるオブジェクトの元となるオブジェクト」であり、JSでは、このプロトタイプを利用して新たなオブジェクトを生成するそう。

#JSのクラス宣言
JSは、関数(Functionオブジェクト)にクラスとしての役割を与えており、この関数を便宜的にクラスと呼んでいたりするようです。(そのためJSでいうクラスと、Java等のクラスは完全に同義ではないとか)
他の言語と同様、大文字で始めるのが一般的みたいです。

```Javascript
var User = function() {};

function Book() {};
```

インスタンス化は、Java等と同様new構文で行います。
new構文なしでも呼び出せるが、その場合関数として呼び出されるので、
下記のコンストラクタ周りで問題が発生します。(詳細は後述します)

```Javascript
var bob = new User();
var dictoinary = new Book();

var jack = User();	// 関数としての呼び出しで、インスタンス化されていない。
```

#コンストラクタの宣言
コンストラクタの宣言方法には、下記のようなものがあります。

```Javascript
// 宣言方法A
function User(name,age) {
	this.name = name;
	this.age = age;
	this.beOld = function() {
		return ++this.age;
	}
};

// 宣言方法B
function Book(title,page) {
	this.title = title;
	this.page = page;
};
Book.prototype = {
	getTitle : function() {
		return this.title;
	}
};
```
宣言方法Aは、コンストラクタの中にプロパティ(Javaでいうフィールド)とメソッド(値が関数であるプロパティ。役割的にはJavaのメソッドと同様)を宣言しています。
宣言方法Bはコンストラクタ内でプロパティを宣言し、メソッドはprototypeプロパティを利用してプロトタイプオブジェクトに対して追加しています。
宣言方法Bの方がメモリ効率的に良いので推奨されているようです(prototypeプロパティについては後ほど)。

##コンストラクタにおけるthis
コンストラクタ内でのthisは、基本的に生成されるインスタンス自身を指します(Java等のthisと同様)
ただし、メソッド内で関数を宣言した場合、関数内のthisは他の関数同様グローバルオブジェクトを指します。

```Javascript
Book.prototype = {
	addVolume : function(volume) {
		// ここのthisはインスタンス自身を指すので正常に通ります
		var newTitle = this.title + " : " + volume;

		function check(result) {
			// ここのthisはグローバルオブジェクトを指すので、存在しないプロパティを指していると言う事でエラーになります。
			if(newTitle.equals(this.title)) {
				this.title = newTitle;
			}
			return this.title;
		}
		return check();
	}
};
```

ちなみに、new構文無しでコンストラクタを呼び出した場合、コンストラクタは関数として呼び出されるため、コンストラクタ内のthisは
グローバルオブジェクトを指します。

```Javascript
function User(name){
	this.name = name;	
}

var jack = User("jack");
console.log(jack);	// インスタンス -> undefined
console.log(name);	// グローバル変数 -> jack
console.log(jack.name);	// インスタンスのプロパティ -> Uncaught TypeError: Cannot read property 'name' of undefined
```

#動的なメソッドの追加
JSでは、生成したインスタンスに対して個別に後からメソッドを追加することができます。

```Javascript
function User(name) {
	this.name = name;
}

var bob = new User("bob");
bob.getName = function() {
	return this.name;
}
console.log(bob.getName());	// "bob"が出力される

var jack = new User("jack");
console.log(jack.getName()); // Uncaught TypeError: jack.getName is not a function
```

とりあえずここまで。
segue遷移時の値受け渡しを便利にするで🤜🤛

まだObjective-Cなんかやってんのかよーという声も聞こえてきそうですが、
Objective-CでSegueを使って遷移する時に超便利なカテゴリーを今回は紹介します！



```objc:UIViewController+SegueBlock.h
#import <UIKit/UIKit.h>

typedef void (^SegueBlock) (UIStoryboardSegue *segue);


@interface UIViewController (SegueBlock)

- (void)performSegueWithIdentifier:(NSString *)segue sender:(id)sender block:(SegueBlock)block;

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender NS_REQUIRES_SUPER;

@end

```
```objc:UIViewController+SegueBlock.m
#import "UIViewController+SegueBlock.h"
#import <objc/runtime.h>


@implementation UIViewController (SegueBlock)

- (void)performSegueWithIdentifier:(NSString *)segue sender:(id)sender block:(SegueBlock)block
{
    objc_setAssociatedObject(self, _cmd, block, OBJC_ASSOCIATION_RETAIN);
    [self performSegueWithIdentifier:segue sender:sender];
}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender NS_REQUIRES_SUPER

{
    if ([self segueBlock]) {
        [self segueBlock] (segue);
    }
    
    objc_setAssociatedObject(self, @selector(performSegueWithIdentifier:sender:block:), nil, OBJC_ASSOCIATION_RETAIN);
}
#pragma clang diagnostic pop

- (SegueBlock)segueBlock
{
    return objc_getAssociatedObject(self, @selector(performSegueWithIdentifier:sender:block:));
}

@end
```


使用例

```objc:ViewController.m
- (IBAction)showSecondViewControllerButton:(UIButton *)sender {
    [self performSegueWithIdentifier:@"showSecondViewControler" sender:nil block:^(UIStoryboardSegue *segue) {
        SecondViewController *secondViewController =segue.destinationViewController;
        secondViewController.labelText = @"segueのブロックで値渡し";
    }];
}

// 以下のメソッドを実装する場合は Super でメソッドを呼ぶ
//- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
//{
//    [super prepareForSegue:segue sender:sender];
//}

@end

```

ブロックでdestinationViewControllerを取得できるので
次のViewControllerに値やオブジェクトを渡す時にかなり便利になります！


Githubにソースコードを上げてます。
[SegueSample-GitHub](https://github.com/ShinTanaka/SegueSample)
JavaScriptを有効にしないとHTMLを見れなくする簡単なコード

#はじめに
多くのサイトで公開しているコードでは、div等の要素に入れないと、その部分を見れなくすることができませんが、このコードではhead要素に入れるだけでとても簡単にすべてのHTMLを見れなくすることができます。


```HTML
<head>
	<style>#load~*{display:none;}</style>
	<div id="load"></div>
</head>
```
このHTMLは外部CSSにしないで下さい。

```JavaScript
document.getElementById(String.fromCharCode(108,111,97,100)).parentNode.removeChild(D.getElementById(String.fromCharCode(108,111,97,100)));
````

ちなみに、108,111,97,100 はそれぞれ文字コードで　load になります。
内訳とコスト、そして生活の質からお給料を考えてみる

IT屋お給料リレー Advent Calendar 2017

に参加

給与の内訳（基本給・諸手当・賞与など）と、それにともなうコスト（拘束時間・生活費）
いわばコスパ（コスプレパーティーじゃないぞ）
そして、環境から生じる生活の質まで踏まえて書くことにしました。

# 要約すると

20代後半の頃から、給料はあまり変わらないけど環境は大きく変わった。
だが、生活の質はよくなった。髪の毛以外は若返ったかも（笑）

##　給与支給パターンの類型


だいたいこの3種類になるかな？

1. 【ベンチャー型】基本給高め（ただしみなし残業含む）＋（決算）賞与
2. 【中小企業型】基本給＋残業代＋賞与２回（割合低め）
3. 【老舗大企業型】低めの基本給＋いろいろな手当＋賞与２回（割合高め）

# 私の場合

昭和50年代半ば生まれ。大学院（博士前期）修了。
独身。嫁は画面の中に（略
東京都心部までドアtoドアで2時間くらいのあたり出身。
転職回数6回。合計７社経験。フリー経験はありません。
Web業界嫌だと思って逃げていたが、一周してまた戻ってきた感じ。

## ベンチャー型の場合

30代前半の頃。イグジット後の非IT系ベンチャー。
基本給35万（みなし残業込み）　＋　決算賞与（基本給の0～1.5か月程度）、
残業時間は15~35時間くらい。
仕事内容は、WordPress使ったWebサイトの運営、キントーンで業務システムの構築など。

ITやWebの活用方法や、事業の

## 中小企業型の場合

30歳くらいの頃。SES系の会社。ほぼほぼ受託開発。
基本給24万＋諸手当(0～2万)＋残業手当（5~7万）　＋　賞与。
残業時間は30~40時間くらい。賞与年2回。合計支給額は基本給×２くらい。

仕事内容は詳細設計～実装～検証など。下流工程がメイン。

### 受託系の会社は、割り切れる所が良い？

しばしばあまり良く言われないSES系ですが、メリットもありんす。
身も蓋もないけど、携わっている仕事に愛着が感じられなくとも仕事は仕事として割り切れるところはメリット。
あと、この会社がたまたま残業代をしっかり払う会社だったことも良かった。

## 老舗大企業型の場合

20代後半の頃（※新卒ではありません。中途です）
基本給21万+諸手当 +　賞与。で、初年度で450万超えたのにはびっくり。
賞与の金額が大きく、総額では年2回で基本給の6~7か月分くらい（！）しかも初年度で。
サービス業で、休日はシフト制。残業時間は45~60時間＋当直など。

仕事内容は基幹システムの保守開発（ほぼ完全内製）、ネットワーク管理など。

###　コスパは良いようで、割に合わない

額面の給与は良い。しかも実家から通えて通勤地獄とは無縁！
転勤の可能性もほぼない。

一件コスパ最高！に見えるけど…。
拘束時間から時間あたりの給与を考えるとあまり良くない。

加えて、10年以上先まで考えたキャリアの展望も描けないことも問題だった。
定年まで耐えよう。なんてことは考えられなかった。

## 現在

拡大を始めたベンチャー企業で、BtoB向けクラウドサービスの開発・運営。

具体的な金額に関しては差し控えますが、１の形式です。
主にサーバサイドを担当しています。

#　コスパを考えてみる

生きるためのコストとパフォーマンスについても触れます。

## コストが見合うなら、一人暮らしもして良い

独身かつ、実家暮らしと一人暮らしが選べる人向け。

1. 実家の近くで、割の合わない仕事をする。
2. 一人暮らしをして、給与の良い仕事をする。

個人的には、採算がとれるのであればやった方が良いと思う。
目安としては、一人暮らしをした場合に…。

月々のキャッシュフローの部分
現在の手取り月収の最低額－固定的な支出　が黒字なら、
検討の価値があると思う。

## 私の例では

上記で取り上げたSES系の会社で働いていた頃の話。
家賃7万弱、光熱・通信費が計2万など～と基礎的な費用は12万円くらい。
当時の手取りが、月20万円なので、まぁ成り立つ。プラス賞与なのでなおさら。


## 一人暮らしで得られたもの

通勤時間を片道1時間、往復2時間を短縮できたのはちょっとしたメリット。
電車の中で座っていくことができなくなったのが問題。
終バスをあまり考えなくてよい事は大きい。夜遊びしやすくなった（笑）
その分家事の負担は増えましたが。

##　生きるためのコス（ト）をが満たされれば、（パ）フォーマンスも満たそう

コストコストと切り詰める考え方も、時としては必要ですが
そこから得られる生活の質も大事。
預金通帳の残高が増えていっても、仕事と寝るだけの往復みたいな生活は辛い。

# 「経験を買う」という生き方

現在のBtoBメインのクラウドサービスの開発、運営の仕事を選んだのは、

- 事象そのものの企画、ポジションが良い。
- 1->10に拡大する段階で、システムの改良、新規作成もできそうなこと。
- チームビルディングができそうなこと。

これらのメリットが非常に大きかった。


# 余談：「フリーランス」はどうなんだろう？

2019年現在、ITエンジニア界隈はフリーランスを進める風潮がありますが…
実際のところどうなんでしょう？

フリーランスを名乗るのなら、敷居は低い。

## 意外と、法人化のメリットが出やすくなるハードルは低い。

法人化して割に合うくらいの収入があるのならOKかなと思ったが、
そこまでの売り上げを出す自信がなかったので断念（30歳くらいの頃）。

個人事業主が法人成りを考え始める目安となる事業所得はどのくらい？（freee）

https://www.freee.co.jp/kb/kb-launch/incorporation-income/

によると、事業所得が500万円を超えるあたりから法人化を考えると良いとのこと。
交通費やらなんやらを経費に計上しても、達成しやすそう。
月額50~60万を超えるくらいなら、法人化を検討するのもよいかも。

### 不動産運用などとの相性はよさそう？でも信用スコア下がるから注意！！

フリーランスというか法人化のメリットですが、
不動産投資をしている人で、「すでにいくつか物件を持っている場合」との相性は良さそうです。
反面、金融機関からのスコアリングは低下しやすいので注意！！

# 余談2 人生や生存戦略も踏まえる

給料の事を考える時には、上位概念に人生や生存戦略を踏まえると良いかも。
私の場合…。

- 人生を通して、キャッシュが途切れる事を防ぎたい
- できる限り、IT系のシステム開発、運営は続けていきたい
- その中でとんがっていくなら、システムなどの体系化もいいのかなと思ったり
- 現在独身だが、結婚や家庭を持っても良いかなと思う


こんな要望がある。

## 成熟していても良い。

結果的だけどPHPとjs/jQuery Vue.jsなどを軸にすることになりそう。
何だかんだ言って世の中にはPHP使っているシステムが多いのと、
クライアントサイドでの処理は引き続き需要がありそうだから。

あとはスクリプトRubyやPython。
Promiseのcatchは第一引数が必要

Promiseのcatchに引数を与えなければ勝手にエラーを吸収してくれると思っていたが、そうではなかったのでメモしておく。
そもそもなぜcatchに引数を与えなかったかというと、次のように例外を投げることをテストしたかったからだ。
ただ、このコードだとテスト対象の関数が例外を投げてもテストは失敗する。というのも、catchにちゃんと関数を渡してあげないと、catchはなにもしてくれないからだ。

```javascript
it("throws an error", () => {
  return functionThatThrowsAnError()
    .then( () => { fail() })
    .catch() 
})
```

実際、以下のコードを走らせると`UnhandledPromiseRejectionWarning`という警告が出る。Promiseのrejectionを処理していませんよっていうこと。

```javascript
Promise.resolve()
  .then(() => {
    throw new Error()
  })
  .then(() => {
    console.log('hello')
  })
  .catch() // ←ここ
```

エラーを吸収するだけだとしても、ちゃんと空の関数を渡してあげないといけない。

```javascript
Promise.resolve()
  .then(() => {
    throw new Error()
  })
  .then(() => {
    console.log('hello')
  })
  .catch(() => {}) // ←ここ
```
Juliaで自作のCompositeTypeとprint/println

自分でtypeしたComposite Typeのprint/printlnについて、以下のような実装をしている。参考にした情報はだいぶ古い。一応Julia v0.5.0(2016-09-19-18:14 UTC)とv0.6.0(2017-06-19 13:05 UTC)で動いた。何を実装するのが一番いい感じのやり方なのか知りたい。

- There is no documentation for custom printing of user-defined types #9458 https://github.com/JuliaLang/julia/issues/9458

```julia
# 宣言
type MyInterval
  s::Int64
  e::Int64
end

function Base.show(io::IO, itv::MyInterval)
  print(io, "[$(itv.s),$(itv.e)]")
end

# 実行
julia> itv = MyInterval(1, 10)
[1, 10]

julia> println(itv)
[1, 10]
```
自分のgithub情報をいい感じに表示してくれる github-profile-summary


## はじめに

アドベントカレンダーのネタを探すべく、何の気なしに `github trend` を眺めていたら、面白そうなやつを見つけたので紹介します。

## github-profile-summary

- [Github](https://github.com/tipsy/github-profile-summary)
- [WebSite](https://github-profile-summary.com/)

このツールを使うと、githubの情報を可視化できます！

![スクリーンショット 2017-12-24 16.45.21.png](https://qiita-image-store.s3.amazonaws.com/0/55672/9f48ce1b-7ee3-194c-5310-dc5fa02433f8.png)

こんな感じ。

## 使い方

1. [Github](https://github.com/tipsy/github-profile-summary) に行き、 `star` をつける。
    - ※これをしないとあとで、 `スターつけてないぞ！` って言われます。言われたい方はこれをスキップするといいかも。 
2. [WebSite](https://github-profile-summary.com/) にログインして、ユーザ名入力

以上！簡単でいいですね。

## 最後に

PrivateRepositoryの情報はもちろん計算されていません。
githubでstarつけてないだろ！ってアラートめっちゃいいですね。
参考になります。
iOSのWebViewでファイルアップロードダイアログを呼び出せなかった話

デフォルトのファイルダイアログは格好悪いので、画像などを代替として、クリックした際のイベントでファイル選択のダイアログを出したいという時はよくありますよね。

例えばこんな感じのコードで。

```html
<img class="camera-icon select-photo" src="camera.png" />
<input type="file" id="cameraImageFile" />

<script>
document.querySelector('.select-photo').addEventListener('click', (e) => {
  document.querySelector('#cameraImageFile').click();
});
</script>
```

PCのブラウザであれば動くのですが、iOSではなぜかダイアログが開かず…。

```javascript
document.querySelector('.select-photo').addEventListener('click', (e) => {
  alert(true);
  document.querySelector('#cameraImageFile').click();
});
```

とやったりすると、アラートが出た後にファイル選択が出るという…。HTML側のスタイルを変えたり、JavaScriptの書き方を変えたりと色々やったのですが結局うまくいく方法がこれ。

```javascript
document.querySelector('.select-photo').addEventListener('click', (e) => {
  e.target.click();
  document.querySelector('#cameraImageFile').click();
});
```

元々の画像を2回クリックしたことにすると、その後の処理もちゃんと呼ばれると。なぜかが分かっていないので微妙な気持ちですが…。

なお、Androidはちゃんと動くので、iOSかどうかの判定も追加しておく必要があります。
Pythonライクなスマートコントラクト言語Vyperについて



この記事は [BlockChain Advent Calendar 2017](https://qiita.com/advent-calendar/2017/blockchain2017) の22日目の記事です。


前回[Pythonのスマートコントラクト開発フレームワークPopulusで新言語Viperを使ってみる](https://qiita.com/naoki_maeda/items/25fd28777d04e144aea4)という記事を書きました。

Pythonライクに書けるスマートコントラクト開発言語Vyperをもう少し深く掘り下げていきたいのと日本語の記事がまだ少なく、英語を読むのが辛いので見返しやすいようにドキュメントを追って、つらつらと書いていきたいと思います。

まだまだ開発途上なので、順次アップデートしていく予定です。

環境構築などは前回の記事を参照してください。
vyperのバージョンは 0.0.2


## Solidityとの違い

- modifyが使えない（関数をあとから修飾したりする機能）
- クラスの継承ができない

## 拡張子

- v.pyもしくは.vyでもOK。エディタの設定を活かすためにv.pyが推奨されている。

## 状態変数

```
storedData ： num
```

pythonでは見慣れないですが、型を宣言するために状態変数は先に宣言します。
この状態変数を関数内で利用する場合はself.storedDataのようにしてデータを格納することができます。

## 関数

```
@public
def Function(): // Function
  // ...
}
```

関数は宣言時に@publicもしくは@privateでデコレートする必要があります。


## イベント

```
Payment: __log__({amount: num, arg2: indexed(address)})

total_paid: num

@public
def pay():
    self.total_paid += msg.value
    log.Payment(msg.value, msg.sender)

```

イベントは効率的に検索できるようにインデックスで紐付けすることができます。
イベントは、グローバル宣言と関数定義の前に宣言する必要があります。

サンプルコードの紹介やViperについてもっと詳しく書きたかったのですが、体調と時間の関係でここまでとさせて頂きます。申し訳ありません。
この記事は随時アップデートしていきます。

- 2/4追記(Viper -> Vyperに変更)
Android関連の最新情報にキャッチアップしていくためのリンク集(2017版)


2018/02/23: [Android Dagashi](#android-dagashi)について追記。

当初は「アプリの大規模リファクタリングをした時に考えたこと」について書く予定でしたが、ちょっと内容がうまくまとまりそうにないので予定変更です。
書き上がったらこちらでも報告しようと思います。

今回は私が常日頃どのようにしてAndroid関連の技術情報を仕入れているか、について書いていきます。  
基本的には様々なリンクの紹介です。

## ウェブサイト

### コミュニティ

#### [Developing Android Apps](https://www.reddit.com/r/androiddev/)

世界的な巨大掲示板、redditのAndroid関連の技術情報が集まるsubredditです。  
基本的にはこのsubredditを追っていれば大体の情報は集まります。

最新情報だけでなく、掲示板なので界隈の反応を見ることもできるのでありがたいです。

#### [Trending repositories on GitHub](https://github.com/trending)

言わずと知れたGitHubのTrending repositories.  
Android用のカテゴリはありませんが、[Java](https://github.com/trending/java)と[Kotlin](https://github.com/trending/kotlin)を見れば大体カバーできます


#### [Android Arsenal](https://android-arsenal.com/)

Android向けライブラリ/ツールの紹介サイトです。  
登録制なのですべてのライブラリが網羅されているわけではありませんが、毎日いくつもの新しいライブラリが追加されていってます。  
SNSでも更新情報を流しているので、Twitter等でフォローしているだけで最新ライブラリ情報を入手できます。

### ブログ

#### [Android Developers Blog](http://android-developers.blogspot.com/)

#### [Google Developers - Medium](https://medium.com/google-developers)

Googleの開発者たちによるブログ

#### [Kotlin Blog](http://blog.jetbrains.com/kotlin)

#### [Material Design](http://www.materialdoc.com/)

#### [Medium](https://medium.com)

Mediumでまとめてしまうのもアレな気はします(個別で取り上げてるサイトもありますし)が、[Android](https://medium.com/tag/android)とか[AndroidDev](https://medium.com/tag/androiddev)で検索するといろいろな記事が見つかります。ここから自分の気に入ったブログをフォローするとよさそうです。

#### [ProAndroidDev](https://proandroiddev.com)

Android開発者とGoogle Developer Expertsによるブログ

#### [Realm](https://realm.io/news/)

#### [The CommonsBlog](https://commonsware.com/blog/)

GreenDAOとかObjectBoxとか作ってるCommonsWareのブログ

#### [The Corner](http://corner.squareup.com)

Square!

#### [The Labs | Novoda](https://www.novoda.com/blog/)

### [Yalantis Blog](https://yalantis.com/blog/)



## メールマガジン

週一のペースで発行されています。  
reddit等を巡回していると知っている情報ばかりになってしまいますが、それでも週のまとめとしてメールマガジンはよいです。

#### [Android Authority Developer Weekly](https://www.androidauthority.com/newsletter/)

#### [#AndroidDev Digest](https://www.androiddevdigest.com/)

#### [Android Weekly](http://androidweekly.net/)

#### [Kotlin Weekly](http://kotlinweekly.net/)

#### [Android Dagashi](https://twitter.com/androiddagashi)

日本語でAndroid界隈のニュース/reddit等を週一でざっくりまとめるやつ。
メルマガに記載するべきか悩みましたが、とりあえず。


## ポッドキャスト

通勤通学時に最適。

#### [Android Developers Backstage](http://androidbackstage.blogspot.jp/)

hosted by developers from Android engineering team.

#### [Android Snacks](http://androidsnacks.com/)

hosted by Mike Scamell

#### [dex.fm](http://dex.fm/)

hosted by hotchemi and hydrakecat.
日本語のポッドキャスト。

#### [Fragmented](http://www.fragmentedpodcast.com/)

hosted by Donn Felker and Kaushik Gopal.

#### [Neapolitan](https://soundcloud.com/user-779456994)

hosted by Sufei Zhao and David Morant.

#### [The Context](https://github.com/artem-zinnatullin/TheContext-Podcast)

hosted by Artem Zinnatullin, Hannes Dorfmann and Artur Dryomov.



---

以上です。

その他にもTwitterでAndroid開発者たちをフォローしていくのは鉄板ですし、jCenterで提供されているライブラリはbintrayでwatchすると更新時にメールが飛んできたりして重宝します。

他にも素敵なサイトをご存知でしたら教えていただけるとありがたいです。
WioLTE で 温度センサーデータを SORACOM harvest に上げる

[続き](https://qiita.com/tkeydll/items/3e997cd524bbbfc4c791)。

スケッチ例の soracom-harvest を見ると、温度センサ DHT11 の情報を送信する処理が組み込まれている。
次はこれを使って温度センサ情報を送信してみる。

### スケッチの変更

7行目のコメントアウトを解除。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64309/8cf0f628-9b05-0767-2d39-935f6033e225.png)

親切な事に SENSOR_PIN の定義があれば温度と湿度を送信するようになっているので、コンパイルして WioLTE に転送。

### センサーの接続

コードは `#define SENSOR_PIN    (WIOLTE_D38)` と書いているので、WioLTE の D38 ポートに Grove の温湿度センサ DHT11 を接続。

![2017-12-24_15h59_10.png](https://qiita-image-store.s3.amazonaws.com/0/64309/36348742-ddc3-b060-7b22-f6ae13fa67c6.png)

あっさり。
VSCodeでキーボードショートカットの認識が変なとき

## 問題
VSCodeを使用していて、
自分では`⌘+Shift+]`を入力しているのに実際は`⌘+Shift+[`が認識される、
`⌘+Shift+[`と入力したら`⌘+Shift+@`が認識されるという謎現象が起こりました



私はJIS配列のMacBookProにUS配列のキーボードを接続して使用しています

よくよく見てみるとUS配列で該当キーの位置にあるJIS配列におけるキーが入力されているようです


## 解決

あまりにも謎だったのですが、他でこんなこと起こらないのでVSCodeを調べていたらそれっぽい設定がありました

```javascript:ユーザ設定
  // `keydown.code` (推奨) または `keydown.keyCode` のいずれかを使用するキー操作のディスパッチ ロジックを制御します。
  "keyboard.dispatch": "code",
```

これを、

```javascript:変更後
  "keyboard.dispatch": "keyCode"
```

こう変更したらきちんとUS配列のキーボードから正しくショートカットを入力できるようになりました
Kerasを使うときに一緒にあると便利なライブラリ

# Kerasを使うときに一緒にあると便利なライブラリ
Kerasを使うときによく一緒に使うライブラリを紹介します。
私個人の意見ですので、他に便利なものをご存じの方は教えてください。

## 開発環境
### Jupyter Notebook
開発環境は人によると思いますが、個人的にはJupyter Notebookを使っています。
http://jupyter.org/

入手方法はいろいろありますが、Anacondaで一気に入手するのが楽だと思います。
https://www.anaconda.com/download/

### Tensorboard
KerasのバックエンドはデフォルトでTensorflowを使いますので、一緒にTensorboardも使うことができます。
https://www.tensorflow.org/get_started/summaries_and_tensorboard

しかも最近はJupyterにTensorboardを統合するJupyter-tensorboardというツールもあり、便利です。
https://pypi.python.org/pypi/jupyter-tensorboard/0.1.3

入手方法は`pip install jupyter-tensorboard`です。

## データ処理
### numpy
これがないと始まらない。

### scikit-learn
言わずと知れたPythonの機械学習ライブラリです。
Kerasで提供されないデータ処理のうち、Numpyで書くのが面倒なもの（学習データとテストデータの分割とか、ROC AUCの計算とか・・・）はscikit-learnを使えば簡単にできます。
http://scikit-learn.org/stable/

またはパラメータ最適化のためにGridSearchCVにお世話になることも多いです。

## 画像処理
### matplotlib, seaborn, plotly, holoviews
Pythonのグラフや画像表示系ライブラリで一番シンプルな選択だと思います。
https://matplotlib.org/

matplotlib以外にもseabornやplotlyがありますので、好みで選ぶと良いでしょう。
https://seaborn.pydata.org/
https://plot.ly/

むしろHoloViewsでまとめるのが一番？
http://holoviews.org/
https://qiita.com/driller/items/53be86cea3c3201e7e0f

### opencv
言わずと知れた画像処理ライブラリです。
https://opencv.org/
インストールは` conda install -c http://conda.binstar.org/menpo opencv`です。

## 自然言語処理
### mecab
日本語形態素解析のライブラリです。
http://taku910.github.io/mecab/

これはインストールでハマることが多い気がします。
https://qiita.com/grachro/items/4fbc9bf8174c5abb7bdd
https://qiita.com/piruty/items/5ae2c2ba660796112207
https://qiita.com/cvusk/items/2f076d775d095d3a183a

### gensim
トピックモデリングのライブラリです。
wordd2vecをやるときはお世話になります。
インストールは`pip install gensim`です。こっちは素直にインストールできます。
https://qiita.com/u6k/items/5170b8d8e3f41531f08a
https://radimrehurek.com/gensim/

## 最適化
### gpyopt
ベイズ最適化でパラメータチューニングする場合に使います。
https://sheffieldml.github.io/GPyOpt/

### deap
遺伝アルゴリズムのライブラリです。これもパラメータチューニングする場合に使います。
http://deap.readthedocs.io/en/master/index.html

### hyperopt
こっちはSMBO TPEです。同上。
https://github.com/hyperopt/hyperopt

## 推論
### Keras.js
ブラウザでKerasの学習済みモデルを実行できるライブラリです。
https://transcranial.github.io/keras-js-docs/
https://github.com/transcranial/keras-js
WioLTE に SORACOM SIM を載せて通信する

[この前](https://qiita.com/tkeydll/items/b486b85c7f2711e37107)の続き。
眠っているだけだった SORACOM SIM にようやく出番が。
WioLTE に差して通信してみる。

### WioLTE に SIM をマウント

接点面を基盤側に向けて完全に埋まるまで挿入します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64309/baa292f7-9669-eb60-6d43-aabe91be80ad.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64309/c9240db6-eedc-bcf9-1fb2-6f0cf017dabf.png)


### SORACOM harvest に接続

[公式ドキュメント](https://dev.soracom.io/jp/start/harvest/#enable)にしたがって harvest を有効化します。。
※[SORACOM harvest](https://soracom.jp/services/harvest/)は、IoTデバイスからのデータを収集、蓄積するサービス。

次に Arduino IDE を開き、スケッチ例にある soracom-harvest を WioLTE に書き込み。

![2017-12-24_15h42_47.png](https://qiita-image-store.s3.amazonaws.com/0/64309/49a8abb0-6a8f-3433-6e7d-df5154aa2992.png)

これだけで接続は完了。
セッション状態がオンラインになっている事と、何かしらのデータが送られている事が確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64309/aaed8e19-bf88-9021-d4ec-5cbd6604f946.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64309/6bff1e8d-fcc2-7adf-f117-9a3268c02211.png)


エッジ側の知識が全くなくても、ものの数分で完了。簡単すぎて引く。