OmniAICreator/Qiita-1.07M huggingface dataset:
多次元配列のソート

```php
$array = [
    array(
        'id'        => 0,
        'track_num' => 7,
        'title'     => 'ベィスドロップ・フリークス',
        'artist'    => 'かめりあ feat. ななひら'
    ),
    array(
        'id'        => 1,
        'track_num' => 1,
        'title'     => 'CHRONO DIVER -NORNIR-',
        'artist'    =>  'L.E.D.'
    ),  
    array(
        'id'        => 2,
        'track_num' => 3,
        'title'     => 'illuminate',
        'artist'    => 'Sota Fujimori'
    ), ];
    
array_multisort(array_column($array, 'track_num'), SORT_ASC, $array);
```

参照元
http://qiita.com/shy_azusa/items/54dadc55e3e71cde1445
ほぼノンプログラミング＆完全無料でWebサービスを作ってみた

この記事は[個人開発者 Advent Calendar 2016]()の6日目の記事です。
趣味で作った（ほぼ）ノンプログラミングWebサービス「ブンゴウメール」を紹介します。

## ブンゴウメールとは？
![bungomail.png](https://qiita-image-store.s3.amazonaws.com/0/11704/4064765e-32bd-4eff-f9f1-ba95b1850656.png)

http://bungomail.notsobad.jp/

ブンゴウメールは、青空文庫の5~10分くらいで読める短編作品をだいたい毎朝メールで送ってくれる、忙しい人にぴったりの読書サービスです。

ユーザー的にはメアド登録すると毎日メールが届くっていうだけなので、ただのメルマガと言ってしまえばただのメルマガ。

- しかしメルマガの手動運用は続かなくなることが目に見えていたので、裏側の仕組みを極力自動化したい
- あと作ったサービスのメンテナンスもたぶんできない（飽きっぽい）ので、極力コードやサーバーのメンテをせずにすむようにしたい
- さらにいうと、趣味サービスなのでもちろん完全無料で運用したい

ということを考えた結果、ピタゴラスイッチみたいなサービス構成になった事例です。


## 構成
![ブンゴウメール構成.png](https://qiita-image-store.s3.amazonaws.com/0/11704/51c1dc57-1e77-2a6f-a3e2-1c006bcc299b.png)

### 処理の流れ
- Admin（わたしです）が青空文庫のサイトを訪問し、いい感じの短編があったらそのページでChrome拡張の「[Evernote WebClipper](https://evernote.com/intl/jp/webclipper/)」をポチる
- ポチったページの内容はEvernoteで専用ノートに保存される
- Evernoteで専用ノートにメモが追加されると、[Zapier](https://zapier.com/)のタスクが起動して内容をスプレッドシートに転記する
- スプレッドシートに行が追加されると、[GoogleAppScript](https://developers.google.com/apps-script/)が起動してその内容を[MailChimpBeamer](https://mailchimp.com/features/email-beamer/)の専用アドレスにメールする
- MailChimpBeamerがメールを受信すると、メルマガを下書きの状態で作成して、管理者のアドレスに確認メールを投げる
- 確認メールが届くとZapierのタスクが起動し、自動で「send!」と返信する
- 「send!」メールを受け取ると、Mailchimpが配信リストに登録されている人たちにメールを配信する

GoogleAppScript使ってる時点でノンプログラミングじゃねーだろという。。
言い訳すると、ここもZapierでできなくはないけど、無料枠を超えないように自粛しているのです（小声）。

### お世話になったサービス
#### Zapier
https://zapier.com/

Webサービス同士を連携させるサービス。
この分野だと[IFTTT](https://ifttt.com/)が有名ですが、Zapierのほうが細かくタスクを設定できて、痒いところに手が届きます。

#### MailChimp
https://mailchimp.com/

いけてるメール配信サービス。
今回特にお世話になったのは、「埋め込みフォーム」と「Mailchimp Beamer」の機能。

「埋め込みフォーム」は、静的なHTMLにコードをコピペするだけでメアド登録フォームができちゃうので、本体のサイトはペライチで作ってGithubPageに置くだけでOK。

「Mailchimp Beamer」は、発行される専用のメールアドレスにメールを送ると、その内容でメール配信を下書き状態で準備してくれるという便利なやつ。
さらに準備ができると確認メールが届き、そのメールに「send」って返信すると配信までやってくれるのが超便利。

## こだわりポイント
- メールの送信者名に作家の名前をセットしてるので、受信箱に文豪の名前が並んでたのしい感じになる
- 作品の文字数からざっくり計算した読了時間をメールの最初に表示してくれる

## もうひとがんばりなところ
- 最初のトリガーとして、自分で青空文庫を巡回してクリップしないといけないので、結局ここがボトルネックになって弾切れしがち。やはりクローラーで短編ストックしておくしかないかも。
- 「send」って自動返信するためだけにzapier使ってるのがもったいない。Gmailの機能でうまいことやりたかったけど、「フィルタ＋返信定型文」がなぜか発火せず。FromとReplyToが別だとだめなのか。。


## まとめ
というわけで実際に毎日短編を読んでみると、10分くらいの分量でもメールでは相当な長文に見えて、けっこう読む気が失せることがわかりました。むずかしい。
〜AWSと介護現場〜API Gateway＋Lambda＋DynamoDB＋SNSで作るナースコール

はじめまして。BRIGHT VIEでサーバサイドのエンジニアをしている @lemonade14 です。

今年弊社として初めてAdvent Calendarに参加しており、
[BRIGHT VIE エンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/brightvie)の2日目の記事となります。


今回は、弊社の案件でナースコールシステムを介護現場に導入した際に
AWSのAPI Gateway＋Lambda＋DynamoDB＋SNSを利用して構築したお話を簡単にさせて頂きます。


# 介護現場とナースコール

今回担当させて頂いた介護の現場では、ナースコールが呼ばれるとPHSで受信し、
その連絡を受けて各担当者が利用者様のもとへ急行している状況でした。

そのため、いつだれがどのような場所でナースコールを利用されているのかのなどのログを介護記録として残すことが出来ず、
記載をすることが出来たとしても現場の方々が落ち着いたタイミングで記録するような現状がありました。

また、人材配置や利用者様の巡回の最適化、引き継ぎ資料としての記録なども行えておらず、
現場方々の知見により運用でカバーされている状況であり、
少しでもそれらの負担を軽減できる仕組みとして導入したいとの思いがありました。


# iPadの導入とナースコールのPush通知化

今回、ある施設のナースコールや介護システムのリニューアル化に伴い
通常のナースコール処理に加えて、ナースコール受信時に外部APIへ送信するように調整頂き、
また介護現場にiPadの導入もされたことから、
AWSを利用したナースコールシステム基盤の構築を行いました。

AWSにナースコールのログを蓄積し、「いつ」「誰が」「どこから」「どのような要件」で呼ばれたのかを自動連携し、
今後のデータを活用した現場改善最適化のための基盤の構築に取り組みました。


# API Gateway -> Lambda -> DynamoDB -> SNSを利用した基盤づくり

2015年の年末に取り掛かったシステムであるため
当時話題となっていた「サーバレスアーキテクチャー」を採用しました。

常に稼働しておく必要はないが、リクエスト数に応じたスケールが必要なシステムであったため
Lambdaの採用が最適であると感じました。

またDBに関しては色々な情報を扱うにあたって、NoSQLの採用を検討していたため、
「Lambda×DynamoDB」の組み合わせで実施することにしました。


要件としては、

* ナースコールの通知ログを保存する
* 各利用者様の担当者にPush通知を送信する
    * 受信したナースコールの呼び出し元などから各利用者様の担当を特定する
* ナースコールが「対応開始前」なのか「対応完了後」なのかをログとして閲覧できるようにする

図にすると下記のような形です。

![図1_CDCナースコールアーキテクチャー.png](https://qiita-image-store.s3.amazonaws.com/0/123897/3280bc6f-a107-101b-c6ee-a4a2f36c3a22.png)


# システム構築で困ったこと

## API Gateway編
* SSL/TLS通信において、「Extension: server_name」の指定がないと接続エラーになる
    * server_nameは、SSL/TLS通信において、バーチャルホストの機能を実現するための拡張機能
    * API Gatewayは、SNI（Server Name Indication）を利用したサーバ証明書を使用（AWS サポート問い合わせより）
        * IPアドレスが複数のユーザのエンドポイント名として設定されている
    * そのためクライアントから送信される、「SSL Client Hello」 メッセージの中に 「Extenstion: server_name」 として接続先のホスト名が明記されている必要がある

* POST送信時の「Content-Type:application/x-www-form-urlencoded」問題
    * API Gatewayは、「Content-Type: application/json」が基本
    * 連携システム上どうしても上記のContent-Typeで送る必要があった
    * 参考
        * [AWS API GatewayでContent-Type:application/x-www-form-urlencoded のPOSTデータを受け取り JSONに変換する](http://qiita.com/durosasaki/items/83af014aa85a0448770e)
        * [Lessons learned the hard way from trying to make a simple Slack bot using AWS Lambda](http://codeshal.tumblr.com/post/135337259118/lessons-learned-the-hard-way-from-trying-to-make-a)

## Lambda
* 特になし、便利だ！
    * API Gatewayでは悩んだけどLambdaでは特に...
    * Nodejsで記載したが、必要なモジュールを入れてZip圧縮してアップロードすれば楽
    * ローカルの開発環境が整えられればスムーズな気がするが環境構築が少しネック

## DynamoDB
* 定期的なログの退避
    * ある一定数のログが貯まるとデータが取得できなくなるため定期的に過去ログを退避させている
        * 期間をインデックスとして貼れていないので、インデックス設計が大きな問題
        * データを取得する処理で工夫しているが退避も並行して実施中...

* インデックスの概念の把握
    * ハッシュ値とレンジ値、プライマリキーとセカンダリインデックスが理解できれば比較的難易度は引い
    * データ管理として複数データをキーとしてデータを特定する場合命名でカバーする必要があった
        * 一意にデータを特定するキーが定まっていれば便利かも
        * 複数条件で検索したい要件が出てきた場合のために、インデックスの値を検索しやすいように
    * DynamoDBでの最適なデータ設計が難しい...

## SNS
* 特になしだが、設定は複雑
   * Pub/Subの仕組みがようやく理解できたので良かった
   * ユニット単位でPush通知を送信するが、そのユニット単位にサブスクライブさせれば良いのでPushの設定は楽


# 最後に

AWSでナースコールの基盤を導入することでいつ誰がどのくらいナースコールが呼ばれているかを可視化することが出来ました。
既存の仕組みにアドオンする形で今回対応させて頂きましたが、
まだまだ運用における課題も多く、最適化までは取り掛かれていないので
今後も情報集約、情報の活用を中心に基盤を構築し、現場改善の力になれればと思っております。
ハフマン符号について勉強してみる - 理論編

[アルゴリズムの勉強をしてみる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/algorithm) 6日目の投稿です。

# ハフマン符号とは

from [Wikipedia: ハフマン符号](https://ja.wikipedia.org/wiki/ハフマン符号)
>ハフマン符号（ハフマンふごう、Huffman coding）とは、1952年にデビット・ハフマン（英語版）によって開発された符号で、文字列をはじめとす>るデータの可逆圧縮などに使用される。
>ほかのエントロピー符号と同様、よく出現する文字には短いビット列を、あまり出現しない文字には長いビット列を割り当てることで、メッセージ>全体の符号化に使われるデータ量を削減することを狙っている。

ハフマン符号とは、データを圧縮するためのアルゴリズムで、JPEG, ZIP, LZH等で使われています。
よく出てくる文字には短いビット列、あまり出ない文字には長いビット列を割り当てることでサイズを削減します。
ということで、このアルゴリズムの中心は文字の出現頻度からビット列を生成する部分になります。

# 簡単な例

```
This is a pen.
```
上記文字列(最近流行りのアレを狙ったわけではありません)をハフマン符号で圧縮してみます。
~~出現する各文字について、出現する回数とハフマン符号のアルゴリズムで求まるビット列を下表に示します。~~

※ この部分に、すべての文字に対して0, 10, 110, ..., 11...0, 11...1という形式の符号が割り当てられている表を掲載していましたが、[@le_panda_noir](http://qiita.com/le_panda_noir)さんのご指摘の通りこれは完全な誤りなので、一旦削除させていただきます。
後日修正いたします。



# アルゴリズム

1. 元の文字列に出現するすべての文字に対応するノードをつくります。
   ノードの値として、その文字及び出現回数を持たせておきます。
2. すべての親を持たないノードのうち、出現回数が最も小さいものから順に2つ選びます。
3. 2. で選んだ2つを子要素とする親ノードを作成します。このノードの出現回数は2つの子要素の出現回数の合計とします。
4. 親ノードを持たないノードの個数が1個になるまで、これらの操作を続けます。

このようにして作られた木をハフマン木とよびます。以下、ハフマン木からどのようにしてビット列を構成するかについて述べます。

1. まず木の頂点要素から見ていきます。空のバッファを用意しておきます。
2. 子要素を辿っていきます。1つ目の要素をたどるときは0を、2つめの要素をたどるときは1をバッファに追加していきます。
3. 以上の処理を、文字ノードにたどり着くまで繰り返します。
4. 文字ノードにたどり着いた時、その文字に対応するビット列がバッファの内容になります。

# 次回

ハフマン符号について勉強してみる - 実装編 に続く(かも)
Rails 5.1のフロントエンド事情

ちょっと気が早いですが、Rails 5.1でフロントエンド周りが大きく変わるらしいので、備忘録として、それ関連の記事をいくつかまとめました。

### 主なgithubでのやり取り
+ [DHHのjQuery捨てようぜ発言](https://github.com/rails/rails/issues/25208)
+ [DHHのwebpack入れようと思ってるんだけど発言](https://github.com/rails/rails/pull/26836#issuecomment-264237397)
+ [パッケージマネージャーはyarnでという提案](https://github.com/rails/rails/pull/26836)
+ [jQuery依存を取り除いたよというPull Request](https://github.com/rails/rails/pull/27113)

### 個人的に思うこと

+ 5系のrailsはこれまでの良くも悪くもRailsらしかった部分(sprockets / assets pipelineとか)を捨て、なんとか今っぽいフレームワークになろうとしている

+ 一方で、**そもそもそこまでrails関与しなくていいよという説**と、**やるにしてはちょっと、遅いなーという説** がある気が。
   + **そもそもそこまでrails関与しなくていいよという説**に関して
      + Railsの思想として、MVC全部関与する！みたいなポリシーがあるのかも。
   + **やるにしてはちょっと、遅いなーという説**に関して
      + プロダクトとして、一定枯れた技術を入れてくというのは判断としてあるのかも。
      + そもそも5.1のリリースの時にフロント周りは一体どうなってるんだ。
      + ちなみ [5.1のマイルストーンは現在52%](https://github.com/rails/rails/milestone/49)

+ このへんの変更について[rebuild](http://rebuild.fm/)の人たちの意見を聞いてみたいw


### その他
+ [Rails 5.1: upcoming features by Claudio B.](https://speakerdeck.com/claudiob/rails-5-dot-1-upcoming-features)
grepの際に便利な正規表現のメタ文字

[1分で実現できる有用な技術 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/one-minute)が空いていたので、飛び入り参加しました。

システム開発にあたって、真にプログラムを書いている時間と匹敵するぐらいに、「あれはどう書いたかな」と探す作業が発生します。そんな場面できっと役に立つ、正規表現のメタ文字を紹介します。

## grepで引っかかる邪魔者

プロジェクトディレクトリ全体で「何か探しものをしたい」といえば、たいていgrepの出番ですが、単なる文字一致で検索しても意図しないものが大量に引っかかってしまいます。たとえば、`sign_in`で検索すれば`sign_in_and_redirect`にもヒットしてしまいます。とはいえ、「うまくヒットする条件」を考え出すと、そっちのほうが手間になります。

## お手軽な区切り文字

そんなときに、`\b`というメタ文字が役に立ちます。これは、「単語の端っこ」という**位置**にヒットする（文字と対応しない）メタ文字です。`\bsign_in\b`として検索すれば、「`sign_in`の前後で単語が切れているもの」というような検索になります。GNU grepでは`-E`なしですら使えるなど、多くの正規表現実装が対応しています。

## 注意点
「人間がgrepするときにノイズを減らす」という用途を考えればあまり問題ないですが、この正規表現にはいくつか注意すべき点があります。

* 「単語」を構成する文字は（ASCIIの範囲内では）通常「英数字とアンダーバー」です。HTMLやCSSのクラスに入るハイフン、言語によっては変数名に使える`$`など、「切れ目」と認識されるために除ききれないものもあります。
* 全角文字については[Ruby内ですらエンコードによって異なる](https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html)など、ASCII外でどの文字を「単語」の要素とするかは実装によってまちまちです。もっとも、大半のプログラムでは識別子にASCIIの文字列しかほぼ使わないでしょうし、本稿のような用途では実用上問題ないと思います。
macOS SierraでWeMos(CH34x)を使う

## 状況

中華系の低価格Arduino([WeMos D1 mini](https://www.wemos.cc))等で使われているCH34系のチップですが、macOS Sierra (10.12)を再インストールしたら、ボードをUSBに刺すだけでKernel Pacnicが起きて再起動するようになってしまいました。

## 結論

最終的には下記のサイトにたどり着きました。

https://tzapu.com/ch340-ch341-serial-adapters-macos-sierra/

「usb.kext」は自分の環境にはインストールされていない状態でしたが、「Using the adapter」の項目にあるドライバーを適用すると無事フリーズせずに動作するようになりました！

[Winchiphead signed drivers for CH340-CH341, OS X 10.9 to macOS 10.12](http://blog.sengotta.net/wp-content/uploads/2015/11/CH34x_Install_V1.3.zip)

これで「/dev/cu.wchusbserial****」として使うことができるようになりました。めでたしめでたし。

![スクリーンショット 2016-12-06 21.48.39.png](https://qiita-image-store.s3.amazonaws.com/0/14768/3987b2e2-9fc0-9794-2027-cd8c8284fc3b.png "スクリーンショット 2016-12-06 21.48.39.png")

## ごにょごにょ

新しいのはUSBチップがCP2104になっているようですね。その場合はこのような問題は無いのかな...。
Command Line Toolsのインストール方法

# Command Line Toolsとは
Mac向けに提供されているコマンドツールである

# インストール方法
1. https://developer.apple.com/download/more/ にアクセスし、AppleIDとパスワードを入力する
2. 左上の検索のところで`Command`で検索すると、`Command Line Tools`が色々出てくるので、自分にあったバージョンをダウンロードする
3. `.dmg`をダウンロードしたら、クリックしてインストールする
4. 以下のコマンドを打ってライセンスが表示されたら正常にインストール完了  

```
$ sudo xcodebuild -license
```
オフラインリアルタイムどう書く E10 「塗って繋ぐ」をRubyで塗る

当日は時間内に書きあがりませんでした。
その後同じアイディアで動くものを書いたのですが、時間がかかりすぎですべての問題を解く前に Ctrl+C 。
で。あくまで塗るというアイディアはそのままにできるだけ早いコードを探しました。三日ほどさまよいました。

結果、私の Mac でおよそ 10 秒で全問解き終わるぐらいのコードになりました。
そのうち解説を、描きたい。

問題はこちら http://mtsmfm.github.io/2016/12/03/doukaku-e10.html
みなさんの解答はこちら http://qiita.com/mtsmfm/items/8a78b895910a89e3012d

```ruby:orde10.rb
require 'benchmark'
require 'set'

PATTERNS = {
  'X' => [[1, 0], [0, 1], [2, 1], [1, 2]],
  'O' => [[0, 0], [2, 0], [1, 1], [0, 2], [2, 2]]
}

def filled_area_count(size, blocks)
  block_set = blocks.map {|x, y| y * size + x }.to_set
  sentinel_index = size ** 2
  board = Array.new(sentinel_index) { sentinel_index }

  transform_table = {}

  next_index = 1
  sentinel_index.times do |i|
    next if block_set.include?(i)
    left_index  = (i % size == 0) ? sentinel_index : board[i - 1]
    upper_index = (i / size == 0) ? sentinel_index : board[i - size]

    if (left_index == sentinel_index) && (upper_index == sentinel_index)
      board[i] = next_index
      next_index += 1
    elsif left_index == upper_index
      board[i] = left_index
    else
      actual_index, alias_index = (left_index < upper_index) ? [left_index, upper_index] : [upper_index, left_index]
      transform_table[alias_index] = actual_index
      board[i] = actual_index
    end
  end

  filled_indices = board.flatten.to_set.delete(sentinel_index)

  transform_table.sort.reverse.each do |alias_index, actual_index|
    filled_indices.delete(alias_index)
    filled_indices.add(actual_index)
  end

  filled_indices.size
end

def solve(input)
  size = 
  blacks = input.chars.reduce([[0, 0]]) {|blacks, c|
    blacks.map {|cell|
      PATTERNS[c].map {|x, y| [cell[0] * 3 + x, cell[1] * 3 + y] }
    }.flatten(1)
  }

  filled_area_count(3 ** input.length, blacks).to_s
end

def test(input, expected)
  actual = solve(input)
  if actual == expected
    print "\x1b[1m\x1b[32m.\x1b[0m"
  else
    puts(<<~EOS)
      \x1b[1m\x1b[31m
      input:    #{input}
      expected: #{expected}
      actual:   #{actual}\x1b[0m
    EOS
  end
end

def test_all(data)
  data.each do |line|
    input, expected = line.split
    test(input, expected)
  end

  puts
end

time = Benchmark.realtime { test_all(DATA) }

puts format('%8.3f sec', time)

__END__
X 5
O 4
XX 5
OX 10
XO 9
XOO 17
OXX 21
OXO 18
OOOX 130
OXXO 29
XXOX 81
XOXXO 89
OOOOX 630
OXOOO 66
OXOXOX 2001
OXOXXO 417
OXXOXX 1601
XXXOXOO 345
OOOOOXO 3258
OXXOXXX 6401
```
第二種電気工事士の資格を節約して取得する方法

## 概要
* 電気工事士の記事がランキングに入っていたので、私も体験談を書いてみます。  
    * 見た記事：http://qiita.com/rukihena/items/a30f07f93ca1718dff8e
* 私は2年ほど前、ビルメンになるために第二種電気工事士の資格を取得しました。
* 電気工事士は取得にお金がかかる資格ですが、私は最大限節約しました。

## 当時の自分のスペック
* 高卒（定時制）
* プログラマという世界とは一切無縁

## 筆記は問題集一冊のみ
この一冊をやれば十分でした。
さすがに問題集は買いました。何も知らない状態だと、ネットではどれが良い解説なのかすらわからないので。
![](http://i.imgur.com/3MuWrBO.png)

## 技能は、工具は最小限で、セット系のものは買わない
* 電気工事士資格セット　みたいのは基本割高ですので買わないようにしましょう
* 工具でちゃんとしたものはこの2つだけでよいです。あとはすべて100均でそろえましょう。  
<img src="http://i.imgur.com/DDODtm4.png" width="50%">
* 練習材料も同じです。セットでは買わずにひとつひとつ注文しましょう。  
* めんどくさいですが、この作業のために知識がちょっとついたりします。  
* ちなみにここの楽天ショップで購入しました。  
http://www.rakuten.co.jp/ik21/index.html
* 送料込みで4000円ぐらいでそろえれました。  
<img src="http://i.imgur.com/wZ1DQlN.jpg" width="50%">


## 技能はyoutubeに公開されている解説動画を見る
* 技能は参考書などは買いません。
* YOUTUBEにメーカーなり個人なりが解説動画を出しているので、それで十分です。
* 単線図？みたいな書き方も解説されてた気がします。
* 私はDIYに縁のない人生を送ってきましたが、講習など受けなくても合格できました。

## 工具は試験が終わったら売る
* 材料は売れませんが、工具はその後ヤフオクで売りました。特に使わなかったので。
    
    
## 最後に
正直私は、あまりDIYに熱意がないので今のところ資格を使った作業の経験はありません。
ビルメンは4か月ぐらいでやめて、未経験からIT業界に転職しました。
今の時代、未経験からでも容易にIT業界入れるのが良いですね。
state_machinesとaasmを比較したメモ

# 概要
ステートマシンを実装するためのgemを調査するのに結構時間使ったので自分用メモ。

# 比較表
注：データは2016/12/06時点

| 比較項目 | state_machines | aasm |
|:---:|:----:|:----:|
| レポジトリのURL | https://github.com/state-machines/state_machines | https://github.com/aasm/aasm |
| スター数 | 268 | 2607 |
| 直近のコミット |　１ヶ月前 | ２日前　|
| isitmaintained.comによるイシューの解決状況 | 良い(http://isitmaintained.com/project/state-machines/state_machines) | あまり良くない(http://isitmaintained.com/project/aasm/aasm) |
| 提供する機能 |　初期値・コールバック・ネームスペース・aasmと同じシンタックスのサポート・条件付きトランジション・ActiveRecord連携（公式外部gem）・変更ログ（公式外部gem） | 初期値・コールバック・条件付きトランジション・ActiveRecord連携（Enum含む）・クラス内での複数ステートマシンのサポート・定数の自動生成・イベントのインスペクション・RSpec用マッチャー |
| 基本シンタックス | `state_machine :state { state :stopped }` | `aasm { state :stopped }` |
| stateシンタックス | `state :stopped { def speed; 0; end }` | `state :stopped` |
| eventシンタックス | `event :start { transition stopped: :started }` | `event :start { transitions :from => :stopped, :to => :started }` |

# 備考
`state_machines`はソースコードを残してレポジトリを再構築している（最初のコミットが"Initial import"であり、旧`state_machine`のソースコードをコピーしたと思われる）ため、コミット数が非常に少ない（２桁）。

# 雑感
あまり違いがわからない。
`aasm`のRSpecサポートは個人的には大きいが、一方で`state_machines`のステート変更ログ機能は重要になるケースがあると思われる（そもそも、ステートマシンを導入する時点でそこにはある程度重要なビジネスロジックが含まれる可能性が高いので、その記録も必要になる可能性は高い）。どちらも自分で実装できるといえばできるけど。
シンタックスは明確に`state_machines`のほうが優れているし、互換性のある書き方もできるのはうれしい。逆に言うと、`aasm`から`state_machines`への乗り換えは逆より簡単であると思われる。
Pythonで音声認識

# はじめに
私は常々プログラミングやCG制作などの敷居を下げたいと考えているのだけれど、Mayaも音声認識で動かしたいのでコツコツ調査してます。

この記事ではMayaを操作するところまで達成してません。

Windowsに標準で入っている、Microsoft Speech APIの単なるテストです。

# 手順

Windows10
Python 2.7.12
pywin32==220

1. ```python -m virtualenv venv```
1. ```venv\Scripts\activate.bat```
1. [win32com](http://www.lfd.uci.edu/~gohlke/pythonlibs/#pywin32)をインストール
1. もしかしたら[SpeechSDK](https://www.microsoft.com/en-us/download/details.aspx?id=10121)をインストールしないといけないかも
1. ```python  venv\Lib\site-packages\win32com\client\makepy.py```でMicrosoft Speech Object Library 5.4をpythonコードに変換

以下のプログラムを実行すると、「準備完了」というメッセージとともに音声入力待ちとなり、「ワン」「ツー」「スリー」「フォー」「こんにちわ」という声に反応して標準出力に文字列が出力されます。

```py:main.py
#!/usr/bin/env python
# coding=utf-8

from __future__ import absolute_import, division, print_function

from win32com.client import constants
import win32com.client
import pythoncom


class ContextEvents(win32com.client.getevents("SAPI.SpSharedRecoContext")):
    u"""フレーズが認識された際に呼び出されるコールバッククラス

    予め単語を登録しておく。
    """
    def OnRecognition(self, StreamNumber, StreamPosition, RecognitionType, Result):
        newResult = win32com.client.Dispatch(Result)
        print(u"You said: {0}".format(newResult.PhraseInfo.GetText()))


class SpeechRecognition(object):
    def __init__(self, wordsToAdd):
        u"""各種初期化"""
        self.speaker = win32com.client.Dispatch("SAPI.SpVoice")

        self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
        self.context = self.listener.CreateRecoContext()
        self.grammar = self.context.CreateGrammar()
        self.grammar.DictationSetState(0)

        self.wordsRule = self.grammar.Rules.Add(
            "wordsRule",
            constants.SRATopLevel + constants.SRADynamic, 0)
        self.wordsRule.Clear()
        for word in wordsToAdd:
            self.wordsRule.InitialState.AddWordTransition(None, word)
        self.grammar.Rules.Commit()
        self.grammar.CmdSetRuleState("wordsRule", 1)
        self.grammar.Rules.Commit()
        self.eventHandler = ContextEvents(self.context)

        self.say(u"じゅんびかんりょう")

    def say(self, phrase):
        u"""しゃべらせる"""
        self.speaker.Speak(phrase)


if __name__ == '__main__':
    wordsToAdd = ["One", "Two", "Three", "Four", u"こんにちわ"]
    speechReco = SpeechRecognition(wordsToAdd)
    while True:
        pythoncom.PumpWaitingMessages()

```


Maya関係なくてすいません。

# 参考

[Python + pywin32 で COM 叩いてしゃべらせる。](https://mimumimu.net/blog/2011/07/02/python-pywin32-%E3%81%A7-com-%E5%8F%A9%E3%81%84%E3%81%A6%E3%81%97%E3%82%83%E3%81%B9%E3%82%89%E3%81%9B%E3%82%8B%E3%80%82/)
[Python: win32com.client.getevents(“SAPI.SpSharedRecoContext”) returns None](http://stackoverflow.com/questions/15879802/python-win32com-client-geteventssapi-spsharedrecocontext-returns-none)
いまさら聞けないマイクロサービスの基本

Helloworld代わりに初めて書きました。
気に入れば、今後こちらに書いていくかも？！

挨拶代わりに拙著へのリンク
[【連載】いまさら聞けないマイクロサービスの基本](https://news.mynavi.jp/itsearch/article/devsoft/1594)
LaravelでCompassを使う

## 概要
Laravelのプロジェクトにデザインを反映する際に、先にSassとCompassでレイアウトを組んでいたので、LaravelでもCompassを使えるようにした。忘れないようにメモ。

## やったこと

### 0. Vagrantを使っていたので、そちらにsassとcompassをインストール

```
gem install sass
gem install compass
```


### 1. Laravelにcompassを利用するためのプラグインをインストール

* 今回利用したのは、[laravel-elixir-sass-compass](https://github.com/JoeCianflone/laravel-elixir-sass-compass)
* Laravelプロジェクトのホームディレクトリで↓

```
npm install laravel-elixir-sass-compass
```

### 2. gulpfile.js(Laravel Elixir)の設定
* gulpのインストールや基本設定は、[Laravel Elixir](https://readouble.com/laravel/5.2/ja/elixir.html)を参照して実施
* gulpfile.jsの設定(gulpfile.jsはホームディレクトリにある)
 * compassのconfig.rbに書いてたオプションを{}内に記述

```js:gulpfile.js
var elixir = require('laravel-elixir');

require('laravel-elixir-sass-compass');

elixir(function(mix) {
	
    mix.compass(['app.scss'], 'resources/assets/css', {
	    style: "expanded",
	    sass: "resources/assets/sass",
	    font: "public/assets/fonts",
	    image: "public/assets/images",
	    javascript: "public/assets/js",
	    sourcemap: true,
	    comments: false,
	    relative: true
	});

	mix.styles('app.css', 'public/assets/css/app.css');
});
```

### 3. Elixirの実行

```
// 全タスク実行
$ gulp
```

```
// --productionつけるとminifyしてくれる
$ gulp --production
```

以上。
Rubyで整数かどうか判定する（正規表現、integer?、to_i、Integer()）

**※本投稿のコメントにも有用なコメントをいくつか頂きましたので、そちらも合わせてご確認ください。**

---

Rubyである文字列が正の整数かどうか判定する方法を調べていたところ、なかなか出てこなくて苦労したので、ここにメモしておきます。参考になったらうれしいです。

私は、ある文字列（ここではinputとします）が整数かどうか判別して、整数の場合はその文字列をto_iで数値化し使用、整数以外である場合は、エラーを出すというプログラムを書こうと思っておりました。（gets.chompで取得した文字列をinputに代入していました。）


## integer?　→失敗
```ruby
input.integer?
```
文字列に対して使えるメソッドではないので、あっさり失敗。


## to_iとinteger?ではどうだ！　→失敗
```ruby
input.to_i.integer?
```
ならば、inputを数値化して、整数かどうか判定すればいいのでは？と思いついたものの、to_iがimputを強制的に整数にしてしまい、失敗。



## Integer()ならいけるでしょ　→失敗
```ruby
Integer(input)
```
inputが整数でないときに、エラーが出てしまい、どうすればいいのかわからず断念。


## 正規表現という手法があった！　→成功
```ruby
input =~ /^[0-9]+$/
```
これでうまくいきました。

意味合いとしては、

//：挟まれたところが正規表現
^：始まりの言葉
[0-9]：0から9までの数字
+：を1回以上繰り返す
$：終わりの言葉

ということらしいです。正規表現はサルでもわかるようなので、詳しくはこちらのサイトを参考にしてください。

[サルにもわかる正規表現入門](http://www.mnet.ne.jp/~nakama/)

以上です。

※他にもこんな方法があるよ！などあればコメントいただけると幸いです。
本当は怖いstr_replace(array, array, '...')

PHPで単純な文字列置換をするときには、`str_replace()`という関数を使うのが定番ですが、実はこの`str_replace()`には配列を指定して複数パターンを一括指定することができます。

```php
$pattern = [
	'pattern1' => 'replacement1',
	'pattern2' => 'replacement2',
	'pattern3' => 'replacement3',
];

$str = str_replace(array_keys($pattern), array_values($pattern), '...');
```
ちょっとわかりづらいですが、第一引数にパターンの配列を、第二引数に置換後文字の配列を渡します。

同じような関数として`strtr()`という関数があります。
第2引数にパターンの配列を指定すると、複数パターンの一括置換ができます。

```php
$pattern = [
	'pattern1' => 'replacement1',
	'pattern2' => 'replacement2',
	'pattern3' => 'replacement3',
];

$str = strtr('...', $pattern);
```

# さて
これら処理は等価でしょうか？
次の例を見てみましょう。

```php
$pattern = [
	'a' => 'b',
	'b' => 'c'
];

echo "str_replace(): " . str_replace(array_keys($pattern), array_values($pattern), 'ab') . "\n";
echo "strtr()      : " . strtr('ab', $pattern) . "\n";
```

```bash:結果
str_replace(): cc
strtr()      : bc

```

結果が異なりました。

`str_replace()`はパターンを順番に適用していくため、

```php
$pattern = [
	'a' => 'b',
	'b' => 'c'
];

$str = 'ab';
foreach($pattern as $pattern => $replacement){
	$str = str_replace($pattern, $replacement, $str);
}
```

と等価な結果になります。（おそらく内部実装もそうなっていると思われます。）
その為、`ab` → `bb` → `cc`と置換されたことになります。

`strtr()`の場合は、置換済みの部分が再置換されることはありません。
内部実装としては文字列を先頭文字から順番にパターンマッチングして、マッチしたらその部分を置換していく処理になっているものと思われます。

# まとめ
 - 文字列全体に置換パターンを適用したい場合 → `str_replace()`
 - 文字列に1回だけ置換パターンを適用したい場合 → `strtr()`

ただ、`str_replace(array, array, '...')`はわかりづらいので

```php
foreach($pattern as $pattern => $replacement){
	$str = str_replace($pattern, $replacement, $str);
}
```

と書いたほうが無難だと思います。
すべてがFになる

これは[Nextremer Advent Calendar 2016](http://qiita.com/advent-calendar/2016/nextremer)の第6日目の記事です。

# TL;DR
ReactとFlexboxの相性が超いい

# はじめに
タイトルは適当。最近(　ﾟ∀ﾟ)o彡°Flexbox！Flexbox!ってなってて、どのWebサイト見ても「Flexbox使ってどうやってレイアウトするか」を考えてしまうようになっているので、ちょっと言ってみたかっただけです。

ReactとかFlexboxの説明は割愛。この辺参考にすればいいと思うよ。

React: http://qiita.com/yeaney/items/9d5227ff49c0377c3ef4
Flexbox: http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html

最近ずっとReact書いてるけど、レイアウト組むにあたってFlexboxとの相性が超いいなーと思ったのでざっと紹介だけ。

# React with Flexbox
Flexboxは、親要素（Flexコンテナ）と子要素（Flexアイテム）から構成されていて、コンテナ内のアイテムの並びを指定するイメージでレイアウトを組み立てていく。各アイテムはそれ自身がまたコンテナとなり、更にアイテムを内包する。

あれ？ReactのComponent分割とFlexboxのコンテナってイメージ似てね？
Flexboxを勉強しはじめて最初に感じたのが↑だった。

似てるって言うと語弊があるかもしれないけど、ぱっとWebページを見たときに頭の中で考えたReactでのComponentの分割と、Flexboxのコンテナ・アイテムの粒度がほぼ一緒になるという感じ。

ちょうどReactでCSS Modulesも導入してたし、Flexbox使うと超きれいにいい感じにCSSが書けるんじゃないかと。

## "Component = Flexコンテナ"
ということで、早速導入してみた。といっても何も特別なことはしてないけど

```
1. ComponentのRootCSSに`display:flex;`を追加
2. RootCSS内で子Componentの並びを指定（`flex-direction`とか`flex-wrap`とか）
3. 子ComponentのRootCSSにそのComponentのFlexアイテムプロパティを追加（`basis`とか`grow`とか）
4. 更に子ComponentのRootCSSに`display:flex;`を追加（孫要素用）
5. 1.〜4.を繰り返し
```

これだけで、レイアウト部分のCSSが出来上がる。(・∀・)ｲｲﾈ!!

と喜び勇んで全てのComponentに導入していったのだが、１つ問題が起こった。

## 問題点と解決策
### 問題点：レイアウト部分のCSSの見通しが悪くなる
要するに「この部分のレイアウトどうなってるんだっけ？」ってときに、親と子全てのComponentのCSSファイルを見ないとレイアウトの全容がつかめないという問題が発生した。

別に全部のファイルを並べればいいだけだし、問題というほどでも無いことなんだけど
規模が大きくなってくるとどうしても鬱陶しくなり、**レイアウトに関するCSSは1箇所で見たい**欲が湧いてくる。

### 解決策：レイアウト部分のCSSは親Componentでまとめてしまおう
Component毎にCSSが分かれているせいで、コンテナと各アイテムのCSSがバラけてしまって見通しが悪いんだ。ということで、親Componentにコンテナと各アイテムのCSS（レイアウトに関する部分のみ）をまとめてしまえと改修してみた。
これも（多分）普通にみんなやってることだと思うけど（汗）

#### Componentの分割方法

といっても超単純で

```
<ParentComponent>
  <ChildAComponent />
  <ChildBComponent />
</ParentComponent>
```
としていたのを

```
<ParentComponent>
  <div className="child-a"><ChildAComponent /></div>
  <div className="child-b"><ChildBComponent /></div>
</ParentComponent>
```
というふうに変更したというだけ。

#### CSS
これも

```
/* parent.css */
.parent { display:flex; flex-wrap: wrap; justify-content: space-between; }

/* childA.css */
.child-a { flex-basis: 120px; ... }

/* childB.css */
.child-b { flex: 1; ... }
```

を

```
/* parent.css */
.parent { display:flex; flex-wrap: wrap; justify-content: space-between; }
.child-a { flex-basis: 120px; }
.child-b { flex: 1; }

/* childA.css */
.child-a { ... }

/* childB.css */
.child-b { ... }
```

というふうに親ComponentのCSSにレイアウト部分を移動しただけ。

これだけで、親ComponentのJS,CSSを見ればレイアウトの仕様がひと目で分かるようになりましたとさ。

# さいごに
CSS情強の人たちには当たり前だと思うんですが、ReactとFlexboxを併用するとこんなに綺麗にまとまるということに色々と感動したので、紹介がてら書いてみました。
deviseのcontrollerのテストで `NoMethodError: undefined method `name' for nil:NilClass` が出るとき

# 起こったこと
- deviseの `registrations#new` をテストしたい
- `registrations#new` には管理者のみアクセス可能にして、それ以外のユーザーはルートにリダイレクトしたい
- しかし、下記のエラーが出てうまく行かない

```
NoMethodError: undefined method `name' for nil:NilClass
from <hoge_hoge>/vendor/bundle/ruby/2.3.0/gems/devise-4.2.0/app/controllers/devise_controller.rb:42:in `resource_name'
```

- テストコード

```ruby:registrations_controller_spec.rb
require 'rails_helper'

RSpec.describe Admin::Devises::RegistrationsController, type: :controller do
  describe 'GET #new' do
    let (:response) { get :new }

    context '管理者の場合' do
      login_admin
      it 'ステータス 200 になる' do
        expect(response).to be_success
      end
    end

    context '管理者以外の場合' do
      login_writer
      it 'ステータス 300番台でホーム画面にリダイレクト' do
        expect(response).to be_redirect
        expect(response).to redirect_to root_path
      end
    end
  end
end
```

# エラーの原因

- まずエラーが起きている場所は下記のソース

```ruby:devise_controller.rb
  # Proxy to devise map name
  def resource_name
    devise_mapping.name
  end
```

- `devise_mapping.name` が `nil` なのでどこかで設定をミスっている

- deviseの [wiki](https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29#mappings) にヒントがあった

> Every time you want to unit test a devise controller, you need to tell Devise which mapping to use. We need that because ActionController::TestCase and spec/controllers bypass the router and it is the router that tells Devise which resource is currently being accessed, you can do that with:

- `devise_controller.rb` をユニットテストするたびに使用するマッピングを `Devise` に伝える必要がある
- その設定は [wiki](https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29#controller-specs) の通りに `controller_macros.rb` に書いて上記の `registrations_controller_spec.rb` で呼んでいる

```ruby:controller_macros.rb
module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      sign_in FactoryGirl.create(:admin)
    end
  end

  def login_writer
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      sign_in FactoryGirl.create(:writer)
    end
  end
end
```

- `Devise.mappings[:admin]` でマッピングするシンボルは `registrations#new` のルーティングが `namespace` などで変更されている場合、それに合わせて書き換えないといけない
- 自分に場合、下記のようなルーティングにしていた

```ruby:routes.rb
<省略>
  namespace :admin do
    devise_for :users, controllers: {
      sessions:      'admin/devises/sessions',
      registrations: 'admin/devises/registrations',
      passwords:     'admin/devises/passwords',
    }

<省略>
```

- `namespace :admin` でマッピングするシンボルが変わるので、正しくは下記のような `controller_macros.rb` になる

``````ruby:controller_macros.rb
<省略>
      @request.env["devise.mapping"] = Devise.mappings[:admin_user]
<省略>
      @request.env["devise.mapping"] = Devise.mappings[:admin_user]
<省略>
```

- とても長い時間ハマっていたので、誰かのお役に立てば良い

# 参考記事というか、deviseのwiki
- https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29#mappings
- https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29#controller-specs
「Hadoop+Hive」のローカル開発環境の構築を自動化する

# はじめに

<img src="https://qiita-image-store.s3.amazonaws.com/0/15523/2dbc36cc-50d6-33a8-79b6-a78b8903e945.jpeg" width="20%" align="right" />

[Hadoop](http://hadoop.apache.org/)+[Hive](https://hive.apache.org/) を使って大量データの分析基盤を構築することがあります。  
[Hadoop](http://hadoop.apache.org/)+[Spark](http://spark.apache.org/) を使うケースも増えています。

# 課題

以下のような理由で、 **Hadoop+Hive** / **Hadoop+Spark** のいずれもローカル開発環境の構築が非常に大変です。


# なぜローカル開発環境の構築が大変なの？

## 理由1：構成するアプリケーション数が多い


<img src="https://qiita-image-store.s3.amazonaws.com/0/15523/fed66476-0af8-3ef3-508d-0e8d21c600dc.jpeg" width="30%" align="right" />

Hadoop+Hive の場合を例に取ると、以下のようなアプリケーションのインストールが必要です。

* hadoop
* hadoop-client
* hadoop-conf-pseudo
* hadoop-hdfs
* hadoop-hdfs-datanode
* hadoop-hdfs-namenode
* hadoop-hdfs-secondarynamenode
* hadoop-mapreduce
* hadoop-mapreduce-historyserver
* hadoop-yarn
* hadoop-yarn-nodemanager
* hadoop-yarn-resourcemanager

これらをイチからインストールするのは非常に大変です。


## 理由2：設定項目が非常に多い

アプリケーション数が多いことに加えて、設定項目が非常に多いです。
誤った設定により環境が故障してしまうこともあります。

そのため、設定変更によるチューニングに足踏みしてしまうわけです。


# 解決策はないの？

<img src="https://qiita-image-store.s3.amazonaws.com/0/15523/b5ba6701-4bb4-670d-ea88-827b446034da.jpeg" width="30%" align="right" />

ローカル開発環境の構築を用意にするために、 [Vagrant](https://www.vagrantup.com/) がよい解決策となります。
[Docker](https://www.docker.com/) という方法もありますが、Windows/Linux/Macのいずれの環境での動作実績が豊富さ、ネット上での情報の集めやすさは **Vagrant** に軍配があがります。


# 作ってみました

**作っては壊す** ができるように、 `vagrant up` コマンドを実行した際に自動的に **Hadoop+Hive** 環境が出来上がるような仕組みを作ってみました。

Vagrantfile と プロビジョン時に実行されるコマンド をまとめ、Githugに公開しました。

* [genzouw/hive-pseudo-distributed](https://github.com/genzouw/hive-pseudo-distributed)


## 使い方

以下のコマンドを実行するだけです。

```bash
$ git clone git@github.com:genzouw/hive-pseudo-distributed.git; cd hive-pseudo-distributed/

$ vagrant up
```


# 最後に

*Hadoop+Spark* の組み合わせについても、上記のVagrantfile+setup.shを拡張して実現できると思います。

大小にかかわらず、フィードバッグをお待ちしております！
サーバーレスなWP向けサービス"Shifter"について

Qiita Advent Calendar Serverless(2) 7日目です。

サーバーレスという観点で何か面白いものはないかと思い、サーバーレスアーキテクチャを用いたサービス"Shifter"について調べてみました。

##Shifterとは
Shifter
https://getshifter.io/

一言で言えばWordpressで構築されたサイトを手軽に静的HTMLに変換できるサービスです。

##何が便利か

###1.動的ページで起こりうる事象に悩まされない。
静的ページなので動的サイトで懸念される課題に就いて悩まされないという点。
メンテナンス、スケーラビリティ、セキュリティ等。

###2.過去生成したページの管理が出来る
静的ページを生成するとオンライン上に過去生成した日付毎にアーカイブされ、保存することが出来る。
また、保存した静的ページを元に動的ページを再生成する事が可能。

###3.学習コストが低い
学習時間をほとんどかけることなく導入が可能。
新規サイトを立ち上げるだけであればShifter内の管理画面ですぐに起動できます。
wordpressでサイト構築を行っている方であれば、作成したオリジナルテンプレートの適用も簡単にできると思います。
https://github.com/getshifter/go-create-shifter-package/wiki/How-To-Use-(JP)


###参考

Official Site
https://getshifter.io/

Github
https://github.com/getshifter

Speakerdeck
https://speakerdeck.com/digitalcube/wordpress-goes-serverless-serverlessdebian-waruwebsaitogou-zhu-number-serverlessosaka
https://speakerdeck.com/digitalcube/serverlessconf-tokyo-2016-shifter

Kickstarter
https://www.kickstarter.com/projects/225627578/shifter-serverless-hosting-for-wordpress
ScriptableObjectを試してみた

必要に迫られたのでScriptableObjectを作成することに。
忘備録として記事に書き留めておく。

```C#
using UnityEngine;
using UnityEditor;
using System.Collections;

public class LocalGameSetting : ScriptableObject {
    //設定したい値
    public bool UseLocalData = false;
    public string PlayerName = "";

    //UnityのツールバーにScriptableObjectをAsset化するメニューを追加
    [MenuItem ("Assets/Create/LocalGameSetting")]

    //ScriptableObjectをAsset化する
    static void CreateLocalGameSetting ()
    {
        LocalGameSetting localGameSetting = CreateInstance<LocalGameSetting> (); 
        //第２引数のパスにAsset化したをScriptableObjectを作成
        AssetDatabase.CreateAsset(localGameSetting,"Resources/ScriptableObject/LocalGameSetting.asset");
        AssetDatabase.Refresh ();
	}
}
```

注意点としては

```C#
AssetDatabase.CreateAsset(localGameSetting,"Resources/ScriptableObject/LocalGameSetting.asset");
```

の行で第２引数のパスに「.asset」を付け忘れないこと。
今回はScriptableObjectを「Resources」配下に作成したので下記のようにロードして使用した。

```C#
LocalGameSetting setting = Resources.Load<LocalGameSetting>("ScriptableObject/LocalGameSetting");
```

とりあえずこれで事なきを得た。。。
【iOS】R.swiftでColorを扱う


## iOS その3 Advent Calendar 6日目

遅れましたが、6日目書かせていただきます。

みんな大好き(だと信じたい)**R.swift**でカラーコードを扱う方法を紹介します。

以下のところにも書いてありますが、ちょっと手間取ったのでメモがてらに。

[R.swift/Colors.md at master · mac-cain13/R.swift · GitHub](https://github.com/mac-cain13/R.swift/blob/master/Documentation/Colors.md)

できればすべてのリソースを**R.swift**で扱いたい気持ちです。

では本題です。

## R.swiftのインストール

ここら辺は割愛しようと思います。

他の記事を参考にしてもらえれば大丈夫かと。

というより**Github**を見ながら**CocoaPods**で行けると思います。

[GitHub - mac-cain13/R.swift: Get strong typed, autocompleted resources like images, fonts and segues in Swift projects](https://github.com/mac-cain13/R.swift)


## Xcodeでパレットを作成する

適当に作ってみます。

![test-color.gif](https://qiita-image-store.s3.amazonaws.com/0/47302/f53f7208-85da-b4ad-f8b9-9540b17fa79c.gif "test-color.gif")


Testというカラーパレットを作成してみました。

色は適当にグレーっぽいやつを入れてみました。

これを**R.swift**を含んでいるプロジェクトのターゲットに含めます。

## カラーパレットの居場所

以下のところにあります。

```sh
> ~/Library/Colors/Test.clr
```

今回はパレット名を`Test`にしたので`Test.clr`になります。

こいつをプロジェクトに突っ込みます。

## スクリプトの作成

直(`~/Library/Colors/Test.clr`)で入れるとGit管理に置けなかったり他の人が参照できなかったりなので、常にプロジェクトにコピーできるようにスクリプト作ります。

```sh:copy_clr.sh
rm Test.clr
cp ~/Libarary/Colors/Test.clr Test.clr
```

僕はこのスクリプトを実行する時は`Test.clr`があるディレクトリでやるようにしてます。

他はうまくやってください。

あとはこいつをターゲットに含めます。

## ターゲットに追加

追加したいグループで右クリック > "Add To ..." で以下のようにやります。

![スクリーンショット 2016-12-06 20.17.00.png](https://qiita-image-store.s3.amazonaws.com/0/47302/60c2e37b-bfa5-6f42-5e2e-c2ea2fbb9bad.png "スクリーンショット 2016-12-06 20.17.00.png")
。

**Copy items if needed**のチェックは外してください。

そして追加できたらビルドします。

`R.generated.swift`の`color`に無事追加されていると思います。

## 使い方

以下のように使います。

```swift:
R.color.#{パレット名}.#{色名}
```

なので、先ほど作ったパレットに合わせて使うとすると

```swift:
R.color.test.gray()
```

となります。

もし追加されていない場合は

- プロジェクトに追加できていない
- コピーできていない

あたりが怪しいと思います。

## 終わりに

これのおかげで、アプリ内の色の調整がとても楽にできるようになりました。

**Assets**周りの扱いもスッキリするのでぜひ**R.swift**を使用するのをお勧めします。

以上です。
Chainerで畳み込みニューラルネットワークを試す際の注意点

Chainerを使って畳込みニューラルネットワークを勉強したいと思った時に，「理論はまだわかっていないけどサンプル的なものを動かしてみたい！」
と思うことがあると思われる．

そんな時，このお二方の記事にたどり着くと思います．

PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1)
http://hi-king.hatenablog.com/entry/2015/06/11/021144

ChainerのNINで自分の画像セットを深層学習させて認識させる
http://d.hatena.ne.jp/shi3z/20150709/1436397615

その際，これらの記事通りにやると引っかかるであろう点を挙げておきます．

ちなみに，GPUを使わず，CPUで試そうとした場合です．

#cPickle.UnpicklingError: invalid load key

http://qiita.com/shota_hayashi/items/4a488931ab88f45cfa55

こちらの記事のとおりです．

mean.npyを非Pickle化して読み込む際にエラーが起きてしまうので，NumPy配列として読み込むようにしてあげれば通ります．

```train_imagenet.py
# Prepare dataset
train_list = load_image_list(args.train)
val_list = load_image_list(args.val)
# mean_image = pickle.load(open(args.mean, 'rb'))
mean_image = np.load(args.mean)
```

しかし，エラーの具体的な原因がわかっていないので要調査です．

#remove_split=False is not supported anymore

chainer1.18.0以前のことはわかっていませんが，1.18.0現在では，DotNodeクラスのbuild_computational_graphメソッドの第二引数でremove_splitが常にtrueでなければいけなくなりました．

http://docs.chainer.org/en/stable/_modules/chainer/computational_graph.html

変更前

```train_imagenet.py
with open('graph.dot', 'w') as o:
     o.write(c.build_computational_graph((loss,), False).dump())
```

変更後

```train_imagenet.py
with open('graph.dot', 'w') as o:
     o.write(c.build_computational_graph((loss,)).dump())
```

デフォルトがtrueなので，282行目のbuild_computational_graphの第二引数を削除しました．

応急処置ですが，これで動きます．
メモ書きとして．

#参考

PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1)
http://hi-king.hatenablog.com/entry/2015/06/11/021144

ChainerのNINで自分の画像セットを深層学習させて認識させる
http://d.hatena.ne.jp/shi3z/20150709/1436397615

Source code for chainer.computational_graph
http://docs.chainer.org/en/stable/_modules/chainer/computational_graph.html

ChainerでcPickle.UnpicklingError
http://qiita.com/shota_hayashi/items/4a488931ab88f45cfa55
Terraformインストール(Windows版)

# インストール手順
1. 次のダウンロードサイトから、環境に合わせてファイルをダウンロード
   - [Terraformダウンロードサイト](https://www.terraform.io/downloads.html) 
2. ダウンロードしたterraform.exeをPATHの通っているフォルダに配置
   - 管理者権限が必要ですが、DefaultでPATHの通っているC:\Windows 配下に置いたりします。
   - 確認のためにコマンドプロンプトを立ち上げて、`terraform`と入力してみましょ。

        ![Terraform_vol01.png](https://qiita-image-store.s3.amazonaws.com/0/109620/68df84aa-6056-693d-a335-9c66524b3037.png)


これでインストール完了。
かーーーんたん。
nginxのLTSV形式ログから1秒以上掛かっているアクセスを抽出する

## ワンライナー

```
$ tail -qf access.*.log | ruby -e 'loop { line=STDIN.readline; time=line.scan(/reqtime:([0-9.]+)/)[0][0].to_f; puts line if time >= 1 }'

time:30/Nov/2016:00:55:08 +0900 host:xxx.xxx.xxx.xxx    forwardedfor:-  req:GET /v1/xxx HTTP/1.1     status:200      size:4968       referer:-       ua:Java/1.6.0_31        reqtime:2.532   apptime:2.532   vhost:api.example.com
time:30/Nov/2016:00:56:37 +0900 host:xxx.xxx.xxx.xxx    forwardedfor:-  req:GET /v1/yyy HTTP/1.1     status:200      size:412        referer:-       ua:Java/1.6.0_17        reqtime:3.580   apptime:3.580   vhost:api.example.com
```

### 補足

ログの設定は下記の通り。

```
log_format  ltsv  "time:$time_local"
                  "\thost:$remote_addr"
                  "\tforwardedfor:$http_x_forwarded_for"
                  "\treq:$request"
                  "\tstatus:$status"
                  "\tsize:$body_bytes_sent"
                  "\treferer:$http_referer"
                  "\tua:$http_user_agent"
                  "\treqtime:$request_time"
                  "\tapptime:$upstream_response_time"
                  "\tvhost:$host";
```

* $request_time: クライアントからのリクエスト受信を開始してから、レスポンスを送信しきるまでの時間。
* \$upstream_response_time: upstreamサーバ、例えばproxy_passしてる先のサーバからレスポンスを受け取るまでの時間（$request_timeと比べて説明が曖昧）

### 参考

* [Module ngx_http_log_module](http://nginx.org/en/docs/http/ngx_http_log_module.html)
* [Module ngx_http_upstream_module](http://nginx.org/en/docs/http/ngx_http_upstream_module.html)
いろいろ未経験の文系大学生がプロダクトオーナーをやったら大変なことになった

こんにちは、こんばんは、おはようございます。
Youtubeの動画のようなタイトルで失礼します。
[TABICA](https://tabica.jp/)というサービスでPO（プロダクトオーナー）をやっている岩永です。

エンジニアではないのですが、 [Gaiax Advent Calender](http://qiita.com/advent-calendar/2016/gaiax)のお誘いを受けたので、Qiitaのノリとかよくわからないのですが、簡単な自己紹介とTABICAのPOをやってみて思ったことについてつらつらと書けたらなと思っています。

##自己紹介
今年の2月にGaiaxにTABICAのインターンとして入社し、入社当初は企画・営業をしていました。TABICAは地域ならではの体験（自然体験とかワークショップとか）を扱うプラットフォームなのですが、当然ほいほいと自然体験を提供したいですなんて方が現れるわけもなく、営業することで体験提供者を獲得し、企画を考えて掲載していました。
その後、5月ごろからマーケティングを担当するようになり、体験参加者を獲得していました。
そして、7月ごろからPOに任命され、マーケティングと並行して担当しており、
今はPOの仕事に徹しています。
徹していますといっても、大学4年の後期にもかかわらず、あと12単位＋卒論4単位が残っているので、週5で大学に通っていますが・・・。

##POをやってみて
5が月ほどPOをやってみて思ったことは、ノリでやっているとミスがすぐにバレるなということでした。
これまで、いろいろな業務をノリでやってきて、ミスがバレたりバレなかったりしたのですが、要件定義をミスるとマジですぐにバレます。
だいたい平均して1週程度でバレます。
（または下手こいたことに自分で気づきます。）

以下が僕がPOになった当初に作成した要件定義の内容です。
これを作成したとき、TABICAの体験の予約締切は前日の17時の固定でした。

*「体験毎に予約締切時間を設定できるように」
受け入れ基準
・体験作成ページで予約締め切り時間が設定できる。
・以下の2項目が選択できる
　　・当日・前日・２日前・３日前
　　・0時～24時
・バリデーションは考慮しない
・体験詳細ページで、「●●の●時まで予約可能です。」と表示されること。*

当時は素敵な新機能だなんて思いながら作っていたのですが、今見返すと恐ろしいです。
既にある体験にどう反映させるかや、キャンセル料金発生日時との兼ね合い、1度設定したあとに変更したい場合の対応などなど、無視されていることが多すぎます。
（後に、それらを改修するハメに・・・）

##改善策として
要件定義時に確認するチェックリストというものを作るようにしました。
具体的には以下のようなことを漏れなく確認していきます。
・要素追加するとき記入を必須・任意のどちらにするのか
・スマホ・タブレットでの表示は問題ないか
・その機能の利用頻度はどの程度か
・要素を削除する場合、過去のデータをどう扱うのか
などなど、こういった項目が50ほどあります。
これらをミスしたタイミングで、その都度追加・更新していきます。
そうすることで、漏れの少ない要件定義ができるようになります。



なんて語っていますが、まだまだ修行の身で、滝に打たれ足りておらず、
日々滝行のサポートをしてくださっている方々に、この場を借りてお礼申し上げます。 

おしまい
Outlook 2013 > 保存先フォルダ / 「開始しています」から進まない。の対処

```txt:動作環境
Windows 8.1 pro (64bit)
Outlook 2013
```

### 症状

Outlookを起動すると「開始しています」から進まない。

### 試したこと

以下を試した。

- コントロールパネル > プログラムと機能 > 変更 > クイック修復
  - 効果なし
- コントロールパネル > プログラムと機能 > 変更 > オンライン修復
  - 1回だけOutlookが起動した
  - 2回目以降「開始しています」から進まない
- pstファイルの修復
  - Scanpst.exeを実行した [link](https://support.office.com/ja-jp/article/Outlook-%E3%83%87%E3%83%BC%E3%82%BF-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-pst-%E3%81%8A%E3%82%88%E3%81%B3-ost-%E3%82%92%E4%BF%AE%E5%BE%A9%E3%81%99%E3%82%8B-25663bc3-11ec-4412-86c4-60458afc5253)
  - 効果なし

### 保存先フォルダ

pstファイルなど関連ファイルが壊れているのだろうか。

~~pstファイル~~(ostファイル)の場所は自分の環境(OS: Windows 8.1 pro(64bit))では以下に見つかった。
>  <ドライブ>:¥Users¥<ユーザー名>¥AppData¥Local¥Microsoft¥Outlook

参考: [Outlook データ ファイル (.pst) を別のフォルダーに移動する](https://support.office.com/ja-jp/article/Outlook-%E3%83%87%E3%83%BC%E3%82%BF-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-pst-%E3%82%92%E5%88%A5%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AB%E7%A7%BB%E5%8B%95%E3%81%99%E3%82%8B-3e177f58-bc29-420e-ab21-61e6e3589088?CorrelationId=07642c2c-12d7-422c-ba73-e3a8216c144f&ui=ja-JP&rs=ja-JP&ad=JP&ocmsassetID=HA010378229)

### 対処と効果

- 上記のOutlookフォルダを「xxxOutlook」として名前変更した
- Outlookを起動した
   - 「プロファイリングを読込んでいます」と表示された状態になった
   - 10分後にOutlookのメール一覧が表示されるようになった
- Outlookを終了して、2回目、3回目、起動に問題ないか確認した
   - 問題なく起動した

メールはサーバーから取り直す環境のため、上記の対応で済んだ。
メールをローカルに残した環境ではもっとややこしいことになりそう。

### 再発した模様

問題が再発した模様。

Officeのクリーンインストールなど対処方法を検討している。

(追記 2016/12/09)
上記の対策を再度実行してから2日、問題は発生しなくなっている。
Raspberry Piの壊し方

※この記事は[UEQareer Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ueqareer) 7日目の記事です。

# はじめに

昨今は、IoTプロダクトを作るために、プログラマーの方が試行錯誤しながらRaspberry Piとブレッドボード上の回路を作っているというケースは非常に多いかと思います。

タイトルは半分釣りで「Raspberry Piの壊し方」としましたが、
Raspberry Piなどの回路デバイスを最低限壊さないために気を付けた方が良い事を書きます。

# Raspberry Piの壊し方

## 電源をショートさせる

言わずもがなではありますが、電源をショートさせると壊れます。"rm -rf /"並の破壊力です。
ブレッドボードとRasPiを接続する際は、電源とGNDのジャンパ線は一番最後に、細心の注意を払って接続するようにしましょう。

#### 追記(2019/08/14)
電源ラインとGNDラインがショートしていないことを確認するために、
テスターの抵抗レンジ（導通チェックレンジ）を使用することもあるかと思います。
ただしこの確認方法は、電源-GND間にテスターのピンを当てた直後はコンデンサの充電電流が流れることによって正しく測定が出来ないので注意が必要です。
（ショートはしていないのに導通を示すビープ音が鳴ってしまいます）

## 過電圧をかける

Raspberry Piが壊れる原因として最も多いのは、限界を超えた電圧をかけてしまうことかと思われます。

Raspberry Piの内部にも何らかの保護回路は入っているかと思われますが、
基本的には安全を期して、外部回路のほうで対策を施します。

例えば、5Vで動くセンサをRasPiに接続する場合。
RasPiの内部は基本的に3.3Vで動いていますので、5Vで動くセンサなどを直接接続してしまうと、過電圧を入力してしまいます。
（電源電圧よりも高い電圧の入力を可能とするトレラント機能というものもありますが、ここでは無視します。）

この問題に対する回路は主に「レベルシフト回路」と呼ばれていて、様々な種類がありますが手持ちの部品などと相談して決めます。
以下のブログ記事にて様々な方法が紹介されています。
[レベルシフト　第二回：分圧型と入力レベル](http://gomisai.blog75.fc2.com/blog-entry-32.html)

RasPiと他の部品を接続する際には、そこにかかる電圧をきちんとチェックすることを心がけましょう。

## 電流を流しすぎる

過電圧に並ぶメジャーな壊し方として、「過電流を流す」という方法があります。

例えばモーターを回そうと思ったとき、
その大きさにもよりますが、時には1A以上の電流が必要になります。
RasPiのGPIOが出力可能な最大電流が50mAという事を考えると、1Aというのはかなり大きな電流で、一瞬でパイが焼きあがってしまいます。
（参考までに、よく見る砲弾型のLEDはだいたい10mAも流せば結構明るく光ります。）

こういった電流をたくさん消費する部品を使う際には、「ドライバ回路」と呼ばれるものを使います。
LEDなら「LEDドライバ」、モーターなら「モータードライバ」です。
これらのワードで検索すれば回路図はたくさん出てきますので、ここでは例を省略します。

### 追記
RasPiの場合は電源をACアダプタから供給していることがほとんどだと思うので大丈夫なのですが、
PCから電源を供給することが可能なArduino等では、USBポートの電源供給能力にも気を配る必要があります。
機種にもよりますがUSBポートの最大出力電流は500mA程度で、モーターを複数繋いだりすると案外すぐに超えてしまいます。
もし限界を超えた電流を流してしまうと、最悪USBポートが焼けてしまい、そのポートが使えなくなってしまいます。
PCからの電源供給は100mA程度までにしておくのが無難です。
もっと言えば、モーターなど消費電流の大きなものを使う際には別の電源を用意して使うのが無難です。

# さいごに

インターネット上では様々な回路図が見つかりますが、
要所をわかりやすく伝えるために保護回路が省略されていることも多々あります。
サンプルコードでエラーハンドラが省略されているようなものです。

そのような危険な回路を見つけるのは初心者には難しいのですが、
上2つの過電圧・過電流に気を付けていれば、危険な回路というのがわかるようになってきます。
安全に電子工作を楽しみましょう。
Rubyでhttps・Basic認証・GET/POST・JSONなWeb APIを呼ぶ

Ruby 2.3.3で
(net/httpsは「このライブラリは Ruby 1.9.2 で net/http にマージされました。 そちらを使ってください。」になっていた)

```ruby
require 'net/http'
require 'uri'
require 'json'

# get access_token
# (https GET with basic auth)
uri = URI('https://～')
req = Net::HTTP::Get.new(uri)
req.basic_auth('user', 'password')
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') { |http|
  http.request(req)
}
if res.is_a?(Net::HTTPSuccess)
  access_token = JSON.parse(res.body)['access_token']
else
  abort "get access_token failed: body=" + res.body
end

# call api
# (https POST with access_token)
post_body_hash = { ～ }
post_body_json = JSON.pretty_generate(post_body_hash)
uri = URI('https://～')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = req['Accept'] = 'application/json'
req['Authorization'] = 'bearer ' + access_token
req.body = post_body_json
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') { |http|
  http.request(req)
}
if res.is_a?(Net::HTTPSuccess)
  puts JSON.pretty_generate(JSON.parse(res.body))
else
  abort "call api failed: body=" + res.body
end
```
MacOSX上でphp-buildするときの苦労が減った話

「[Mac OS X El CapitanからOpenSSLのヘッダファイルが消えた話](http://qiita.com/hnw/items/ac83e3ac8f9aa930b934)」に書いたように、最近のMacOSXでは標準で提供されているOpenSSLがライブラリのみでヘッダファイル無しという嫌がらせ的な状況になっているため、PHPをソースからビルドしようとするとコンパイルエラーが出る状況でした。

[php-build](https://github.com/php-build/php-build)でPHPをビルドする場合も状況は同じで、configureオプションでゴニョゴニョしてやらないとビルドできないという不幸な状況が続いていました。ゴニョゴニョの内容は「[Mac OS X El Capitan上でphp\-buildするメモ](http://qiita.com/hnw/items/62380e713d318906f0cd)」で紹介していますが、こんなことを毎回人間様がやるのは間違ってると思ったので[勝手にconfigureオプションをつけるPull Requestを投げた](https://github.com/php-build/php-build/pull/414)ところ、無事mergeされました。

ただしHomebrew版のopensslとlibxml2が必須です。両方が見つかった場合のみ、よしなにconfigureオプションを書き換えてくれます。

```
$ sw_vers -productVersion
10.11.6
$ brew install openssl libxml2
（略）
$ PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 7.1.0
（略）
[Success]: Built 7.1.0 successfully.
$
```

そんなわけで、ようやくMacOSXユーザーの方々が気軽にphp-buildできるようになりました。やったね！

筆者はEl Capitanしか確認環境がないのですが、もし問題のある環境があれば教えてください。

（独り言：`-j4`の指定も何とかしたいとは思っていますが、どうしたもんか…）
Kotlinを導入してやばかったところ

この記事は、[Android Advent Calendar 2016](http://qiita.com/advent-calendar/2016/android)の6日目の記事です。

---

はじめまして、[Holiday](https://haveagood.holiday)というサービスのAndroidアプリ開発を行っている [@r_ralph_h](https://twitter.com/r_ralph_h) です。

立ち上げ時から現在まで、ほぼ一人でこのアプリを作っていますが、今年はじめのDroidKaigiでKotlin導入を決め、9月にやっと全書き換えを済ますことができました。

Kotlin導入事例の記事は結構溢れ始めてきているので、せっかくなので導入中に置きたいろいろな事件について書いていきたいと思います。

## <i class="fa fa-pencil" aria-hidden="true"></i> 書き換えまでの推移

（開発主要メンバーが一人＆フルコミットではないので、だいぶスピードは遅めです）

2016/04 Kotlinをプロジェクトに導入、モデル部分やUtil系クラスなどの端っこの部分の書き換えを行う
2016/06 FragmentやAdapterなどを書き換え始める
2016/06 apt部分をkaptに置き換える -> 開発中のブランチでビルドが通らなくなる （バグ1）
2016/07 バグ1解決
2016/09 全クラスのKotlin化完了
2016/09 またKotlinのバグを踏む(バグ2)

## <i class="fa fa-bug" aria-hidden="true"></i> 踏んだバグたち

Stableバージョンになり、比較的安定しているKotlinですが、案外いろいろなところにバグが潜んでおり、上のタイムラインにあるとおり、2つのバグを踏みました。

### <i class="fa fa-bug" aria-hidden="true"></i> バグ1

https://youtrack.jetbrains.com/issue/KT-12694

kaptを有効にし、generateStubsを有効にした際、enumに何かしらの引数を取るコンストラクタがある場合にコンパイルが通らなくなるという問題です

```kotlin:source.kt
enum class Hoge(val value: Int){
	E1(1), E2(2);
}
```

この問題は、Kotlin 1.0.3 で修正されました 👏

この問題に関するコミットは[こちら](https://github.com/jetbrains/kotlin/commit/99f4c7b6e712d9e529269888a53f65d77bfd083d)です

（これを書いている時に初めて知りましたが、ケースごとにプロジェクトを作って、それでテストしているんですね・・）

### <i class="fa fa-bug" aria-hidden="true"></i> バグ2

https://youtrack.jetbrains.com/issue/KT-9630

ジェネリクスに対して複数の制約をかける際、Kotlinではwhere句を使って制限することができます。

```kotlin:source.kt
// TはComparableでかつSerializableでないといけない
fun <T> hoge() where T: Comparable, T: Serializable
```

しかし、この関数をTの拡張関数のように

```kotlin:source.kt
fun <T> T.hoge() where T: Comparable, T: Serializable
```

とするとコンパイルできなくなります。

この問題は、1.1で解決予定だそうです。

## <i class="fa fa-commenting-o" aria-hidden="true"></i> 言いたかったこと

Kotlinは確かに便利ですが、まだまだバグもたくさんあります。

事前の技術調査では見つけにくい物もあるので、出会った時にうまく回避するか、お祈りをしながら開発をしましょう。

## <i class="fa fa-thumbs-o-up" aria-hidden="true"></i> よかったところ

もちろんそれ以上のメリットは受け取れています。

何より、ぬるぽがほぼ完全に消えました。

また、拡張関数のおかげで、通信が終わったらSwipeRefreshのインジケータを消すであったり、ダイアログを消すといった作業などの、Rx周りでのチェーンが書きやすくなりました。

他にもKotlinを入れたことで得られたメリットは数多くあります。

## <i class="fa fa-cubes" style="font-size:1em;"></i> まとめ

バグにさえ出会わなければ非常に便利