OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntuに最新のNode.jsを難なくインストールする

この記事は [慶應義塾大学SFC村井&徳田研 Advent Calendar 2015](http://www.adventar.org/calendars/1053) の10日目の記事です。

---
[UbuntuにNode.jsをインストールする方法は数多あれ](http://qiita.com/TsutomuNakamura/items/7a8362efefde6bc3c68b)ど、どれも一筋縄ではいかない。

普通に apt-get すると、バージョンが結構古かったり、node でなく nodejs コマンドで登録されたりする。PPA や NVM を使う手もあるけど、余計な手間がかかる。
もっと簡便なインストール方法はないだろうか？

そこで、以下の [n package](https://github.com/tj/n) を使ったインストール方法をお勧めします。

## 導入手順

まず普通に nodejs, npm をインストールします。

```shell-session
$ sudo apt install -y nodejs npm
```

次に n package を導入します。

```shell-session
$ sudo npm install n -g
```

最後に n package を使って node をインストールします。

```shell-session
$ sudo n stable
```

混乱を避けるべく、最初に入れた古い nodejs, npm は消します。そして再ログイン。

```shell-session
$ sudo apt purge -y nodejs npm
$ exec $SHELL -l
```

ちゃんと最新かどうか、バージョンを確認してみましょう。

```shell-session
$ node -v
v11.8.0
```

## 複数バージョンの管理

n package は複数バージョンの管理もできます。

別のバージョンを入れたいときは、バージョン番号を指定すれば即時に切り替わります。update-alternatives の必要もありません。

```shell-session
$ sudo n 9.11.2
$ node -v
v9.11.2
```

stable, lts などの便利なエイリアスもあります。

```shell-session
$ sudo n lts
$ node -v
v10.15.1
```

## 参考サイト
* [apt - How can I update my nodeJS to the latest version? - Ask Ubuntu](https://askubuntu.com/questions/426750/how-can-i-update-my-nodejs-to-the-latest-version)
* [Nodeの複数バージョン管理のお供にnをどうぞ](http://dekokun.github.io/posts/2014-01-01.html)
連想リストの参照を少しでも楽にしたい

## 連想リストとは

連想リスト (Association List / alist) は `(KEY . DATA)` なペアを要素とするリストのことを指します。Emacs Lisp では次のように書きます。

    (setq editor '((name . "emacs") (version . 24) (options . ("-nw"))))

JSON データを解析するライブラリ `json.el` はデフォルトではオブジェクト要素 `{"KEY": DATA}` を連想リスト `((KEY . DATA))` に変換するため、Web API を叩くコードを書いていると連想リストのデータをよく見かけます。

例えば、Qiita の新着投稿 API から JSON データを取得してバッファにタイトルと URL を列挙するコードはこんな感じで書けます。

```el
(defun json-load (src)
  "ファイルまたはURLからJSONデータを読み込む."
  (with-temp-buffer
    (if (string-match "^https?://" src)
        (url-insert-file-contents src)
      (insert-file-contents src))
    (json-read)))

(defun print-items (items)
  "ITEMSを整形して出力する."
  (cl-loop for item across items
           do (let ((title (cdr (assq 'title item)))
                    (url (cdr (assq 'url item))))
                (princ (format "Title: %s\n" title))
                (princ (format "URL  : %s\n" url))
                (terpri))))

(with-output-to-temp-buffer "*Qiita*"
  (print-items (json-load "https://qiita.com/api/v1/items?per_page=50")))
;;-> *Qiita* バッファに結果が出力される
```

## 問題点

上記のコードのように連想リストを参照する方法は `assoc` (あるいは `assq`) 関数と `car/cdr` を利用するのが一般的ですが、`(cdr (assoc 'title item))` というコードは正直あまり書きやすいとは言えません。他のプログラミング言語 によくある `item.title` といったドット記法でさくっと書けたら楽なのに…と思うことがよくあります。

この辺りの話題は去年の今頃にもスタック・オーバーフローでも質問を投げてみたのですが、残念ながらあまり有効な回答は得られませんでした。 [^1]

[^1]: http://ja.stackoverflow.com/q/2741/2391

ただ、最近になってこの問題を解消してくれるライブラリをいくつか見つけた＆思いの外使い勝手が良かったのでメモがてらに書き残しておきます。

## 解決策その１ let-alist.el

`syntax: (let-alist ALIST &rest BODY)`

let-alist.el は引数に与えられた連想リストを `.KEY` のようなドットで始まるシンボルで参照できるようになるマクロを提供します。

これを利用すると、先ほどのコードの一部は次のように書き直すことができます。

```el
(require 'let-alist)

(defun print-items (items)
  "ITEMSを整形して出力する."
  (cl-loop for item across items
           do (let-alist item 
                (princ (format "Title: %s\n" .title))
                (princ (format "URL  : %s\n" .url))
                (terpri))))
```

少しだけですが見やすくなりました。
`let-alist` は参照するキーの数が多ければ多いほど、面倒なタイプ数を減らすことのできるライブラリともいえます。

特徴は以下のとおり

- ○ elpa (GNU Emacs の標準パッケージリポジトリ) で配布
- ○ Emacs25 からは標準で利用できる（予定らしい）
- ○ リストのネストした参照も可能 (`.foo.bar`)
- ✗ 扱えるキーはシンボルのみ
- ✗ setf による再代入はできない

こんな具合にいくつかの制限はありますが、ほぼ標準なライブラリを使って直感的にコードが書けるという点はその不満を上回るくらいには便利かなと思います。

### 参考リンク

- [New on Elpa and in Emacs 25.1: let-alist](http://endlessparentheses.com/new-on-elpa-and-in-emacs-25-1-let-alist.html)

## 解決策その２ dash.el

`syntax: (-let (((&alist key0 a0 ... keyN aN)) &rest BODY)` [^3]

[^3]: https://github.com/magnars/dash.el#-let-varlist-rest-body

Emacs Lisp の定番ライブラリ dash.el には `-let` という `let` の拡張版マクロが含まれていて、パターンマッチ近いシンボルの束縛ができるようになります。また、連想リストだけでなくハッシュやプロパティリスト(plist)でも利用可能なため、こちらの方が汎用性は高いです。

これを利用すると、先ほどのコードの一部は次のように書き直すことができます。

```el
(require 'dash)

(defun print-items (items)
  "ITEMSを整形して出力する."
  (cl-loop for item across items
           do (-let (((&alist 'title title 'url url) item))
                (princ (format "Title: %s\n" title))
                (princ (format "URL  : %s\n" url))
                (terpri))))
```

`let-alist` よりは若干タイプ数が多くなりますが、こちらも直感的に書けます。
dockerコンテナでnfsサーバーの実験をする

dockerコンテナでnfsサーバーを起動し、ホスト側からマウントしてみる。

# dockerインストール

```bash
# yum install docker
# systemctl enable docker
# systemctl start docker
```

# コンテナを作って作業

```bash
// systemdを使うため(nfsデーモン起動用)
$ docker run --privileged=true -d --name nfstest -p 2049:2049 -i -t centos:centos7 /sbin/init
$ docker exec -i -t nfstest /bin/bash

// xfsのファイルシステムを作って公開
# cd /home
# fallocate -l 1GB xfs.dat
# ls -l
-rw-r--r-- 1 root root 1000000000 Dec 10 10:08 xfs.dat
# yum install xfsprogs
# ll /dev/loop*
brw-rw---- 1 root disk  7,   0 Dec 10 12:42 /dev/loop0
brw-rw---- 1 root disk  7,   1 Dec 10 12:42 /dev/loop1
crw------- 1 root root 10, 237 Dec 10 12:42 /dev/loop-control
# mknod /dev/loop2 b 7 2
# losetup /dev/loop2 xfs.dat
# mkfs -t xfs /dev/loop2
# mkdir /home/xfs
# mount -o inode64 -t xfs /dev/loop2 /home/xfs

// nfs公開(ホスト制限無し　*の後にスペース無しにしないとダメ)
# yum install nfs-utils
# vi /etc/exports.d/xfs.exports
/home/xfs *(rw)
# systemctl start rpcbind
# systemctl start nfs
```

# dockerホスト側

```bash
# ip addr
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
# mount -t nfs 172.17.42.1:/home/xfs /mnt
# df -T
172.17.42.1:/home/xfs nfs4          973184    32896   940288    4% /mnt
```

# 参考

CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する - Qiita
http://qiita.com/yunano/items/9637ee21a71eba197345

Dockerで不要になったコンテナやイメージを削除する - @znz blog
http://blog.n-z.jp/blog/2013-12-24-docker-rm.html

```bash
$ docker rm `docker ps -a -q`
$ docker rmi $(docker images | awk '/^<none>/ { print $3 }')
```

[docker]コンテナ内でsystemdを稼働させながら、ログインもしたい・・ - 『システムノヲニワソト』
http://blog.goo.ne.jp/system-oni800/e/b84f8824f09cd665e0b880709609ece0


コンテナに入りたい？それ docker exec でできるよ - Qiita
http://qiita.com/yosisa/items/a5670e4da3ff22e9411a
docker - Failed to get D-Bus connection: No connection to service manager.の対処 - Qiita
http://qiita.com/tukiyo3/items/b24e4dc62de59d4a7570

つまりはこうする

```bash
// デーモンモードでinitを起動
$ docker run --privileged=true -d --name test -p 2049:2049 -i -t centos:centos7 /sbin/init
// execコマンドでログインする
$ docker exec -i -t test /bin/bash
[root@4130ba7fe6e2 /]# ps awx
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 /sbin/init
   62 ?        Ss     0:00 /usr/lib/systemd/systemd-journald
   84 ?        Ss     0:00 /bin/bash
  103 ?        R+     0:00 ps awx
```

[CentOS] NFSサーバを起動しようとすると「writing fd to kernel failed: errno 111 (Connection refused)」というエラーになる - Life with IT
http://l-w-i.net/t/centos/nfs_100.txt
KotlinでもMinimal Cake Pattern

[Scalaにおける最適なDependency Injectionの方法を考察する 〜なぜドワンゴアカウントシステムの生産性は高いのか〜](http://qiita.com/pab_tech/items/1c0bdbc8a61949891f1f) で紹介されている Minimal Cake Pattern を Kotlin でやってみました。

元記事と同じように `UserRepository` と `UserService` で書きます。比較しやすいように、言葉もほぼ同じものを使っています。

まずは、元記事を読みましょう。

・・・読みましたか？読みましたね？

さて、Kotlin版を書いていきます。

----

インターフェース部分は以下のようになります。

```kotlin
interface UsesUserRepository {
    val userRepository: UserRepository
}

interface UserRepository {
    // メソッドの定義を書く
}
```

こうみると、Kotlin は Scala とかなり似ていますね。
`UserRepository`と、それの対となる`UsesUserRepository`を作りました。
`UsesUserRepository`は、`UserRepository`の依存を表すただひとつのプロパティ(Scalaと違い、Kotlinのvalはフィールドではない)を持ちます。

----

実装部分は以下のようになります。

```kotlin
interface MixInUserRepository : UsesUserRepository {
    override val userRepository: UserRepository
      get() = UserRepositoryImpl
}

object UserRepositoryImpl : UserRepository {
  // 実装を書く
}
```

`UserRepositoryImpl`は（DI用語の）サービスです。
そして、そのサービスと対になる`MixInUserRepository`を作りました。
この`MixInUserRepository`は、`UserRepository`の実装を提供するただ一つのプロパティを実装したモジュールです。

(追記)
`val`でScalaの変数のように書いてますが、実際にはプロパティのGetterをオーバーライドで定義しているだけです。そのため呼び出しごとにGetterメソッドが実行されてしまいます。
現在はinterfaceでプロパティの初期化やDelegated Propertyが定義できないためこのような実装になります。今後Kotlinで上記のような定義ができるようになるのであれば、Scalaと同じ動きになるかと思います。
(追記おわり)

----

利用する部分は以下のようになります。

```kotlin
interface UserService : UsesUserRepository {
    // 実装を書く

    companion object : UserService, MixInUserRepository
}
```

`UserService`インターフェースは（DI用語の）クライアントです。そして`UsesUserRepository`を継承し、インターフェースの`UserRepository`を使っていることを表明しています。
そして、`UserService`インターフェースのコンパニオンオブジェクトは、`UserService`インターフェースと`MixInUserRepository`を継承し、サービスをクライアントにインジェクトしています。


# 具体例

元記事を補足した [Minimal Cake Pattern のお作法](http://qiita.com/tayama0324/items/7f87ee3672b15dd68016)のMixInは複数あってもいいという説明が具体例として分かりやすいと思ったので、そちらもKotlinで書いてみます。

```kotlin
import org.joda.time.DateTime

// 現在時刻を返す君
interface Clock {
    fun now(): DateTime
}

// システムクロックの現在時刻を返す君
object SystemClock : Clock {
    override fun now() = DateTime()
}

// あらかじめ設定した時刻を返し続ける君（ユニットテスト用）
class MockClock() : Clock {
    private var currentTime = DateTime(0)
    fun setCurrentTime(dateTime: DateTime) = {
        currentTime = dateTime
    }

    override fun now() = currentTime
}

interface UsesClock {
    val clock: Clock
}

interface MixInSystemClock : UsesClock {
    override val clock: Clock
        get() = SystemClock
}

interface MixInMockClock : UsesClock {
    override val clock: Clock
        get() = MockClock()
}
``` 

# まとめ

KotlinのDIライブラリにはDelegated Propertyを使ったものが多いようですが、エラーの判明が実行してみないと分からないという、DIコンテナと同じ問題を持ちます。このMinimal Cake PatternだとScala版と同様にコンパイル時に解決するため、その点は解決しているといえます。
Kotlinへの移植を試してみたらすんなり出来てしまったので、実用的かどうかしばらくこのパターンを試してみようかと思っています。
"Value too large for defined data type"エラーの原因

xfsでフォーマットした大容量HDD上のデータを32bitバイナリで読むと
"Value too large for defined data type"エラーになった

```bash
# yum install gcc
# yum install glibc-devel.i686
# gcc -m32 -Wall -o stat32 stat.c
# ./stat32 /data/dummy.dat
stat: Value too large for defined data type

# ll -i /data/dummy.dat
138236415364 -rw-r--r-- 1 nfsnobody nfsnobody 3 Dec 10 15:07 dummy.dat
↑ -i は inode
```

```c:stat.c
// man 2 statより
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
  struct stat sb;

  if (argc != 2) {
    fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  if (stat(argv[1], &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }
  printf("I-node number:            %ld\n", (long) sb.st_ino);
  exit(EXIT_SUCCESS);
}
```

# 原因

inodeが32bitを超えた値なのでオーバーフローしてエラーしているという訳。

- xfsでinode64オプションを使っていると起こる
- _FILE_OFFSET_BITS=64 を付けて再コンパイルする or
- nfsで公開している場合はkernelオプションにnfs.enable_ino64=0を入れる

以下のリンクが詳しい。



大容量XFSパーティションと64ビットiノード - ブログ - ワルブリックス株式会社
http://www.walbrix.com/jp/blog/2013-03-xfs-inode64.html

The 64 bit inode problem
http://www.tcm.phy.cam.ac.uk/sw/inodes64.html

Maximum Filesystem Size? (Page 1) — Software — chumbysphere forum
http://forum.chumby.com/viewtopic.php?id=9482

https://linux.web.cern.ch/linux/centos7/docs/rhel/Red_Hat_Enterprise_Linux-7-Storage_Administration_Guide-en-US.pdf
>
Inode numbers
For file systems above 1T with 256 byte inodes, or above 2T with 512 byte inodes, XFS inode
numbers may exceed 2^32. These large inode numbers will cause 32-bit stat calls to fail with
EOVERFLOW. In general, applications should properly handle these larger inode numbers but, if
necessary XFS may be mounted with -o inode32 to enforce inode nmbers below 2^32.
<

Red Hat Customer Portal
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-storage-xfs.html
ファイルシステムが NFS 経由でエクスポートされ、レガシーの 32 ビット NFS クライアントがそのファイルシステムへのアクセス
を必要としている場合を除いて、マルチテラバイトのファイルシステムには inode64 マウントオプションが強く推奨されます。

EKBO: XFS inode64 オプションの罠
http://ekbo.blogspot.jp/2012/01/xfs-inode64.html

32bit LinuxでXFSを使うとiノード絡みのバグに遭う可能性がある - 旧ID:itiriのブログ
http://ubuntu.hatenablog.jp/entry/20130605/1370438443
PHP7.0がでたので、いまどきの「普通」のPHPの話。

去年のアドベントカレンダーではMongoDBの話をしましたが、今年はPHPの話。

# PHPの「現在位置」

PHPが5から7へのメジャーバージョンアップをついに果たしました。(6が欠番になった経緯などは割愛)
そこで、いまだに5.2とか5.3あたり、またはそれ以前の印象で語ってる人も居そうなので、改めて「PHPの普通」を確認していきましょう。

## そもそもあなたPHPの何を知っていると言うんですか
今年はPHP5.6でフルスクラッチの小物サービスをリリースしましたし、古いバージョン(具体的には言えない)のサービスの保守を今も慎ましやかに続けていたりしています。
それはさておき。

## いつ PHP を書きましたか？バージョンは？

各バージョンのリリース日は以下のとおり。
- 2012/03/01 Version 5.4.0
- 2013/06/20 Version 5.5.0
- 2014/08/28 Version 5.6.0
- 2015/12/03 Version 7.0.0 (new!)

そしてサポート終了は以下
- 2015/09/03 Version 5.4
- 2016/06/10 Version 5.5
- 2017/08/28 Version 5.6
- 2018/12/03 Version 7.0

はい、あと半年でPHP5.5のサポートが切れます。最低限PHP5.6を前提としていない話は「今の」PHPの話としては不適切となります。

## 今のPHPを語るのに不可欠なキーワード

- [PHP Standards Recommendations(PSR)](http://www.php-fig.org/psr/)
- [composer](https://getcomposer.org/)
 - [packagist](https://packagist.org/)
- 5.3の新機能
 - ネームスペース
 - クロージャー
- 5.4の新機能
 - トレイト
 - short array syntax ($a = []; って書き方)
 - ビルトインwebサーバ
- 5.5の新機能
 - ジェネレータ
 - finally節
- 5.6の新機能
 - ... による可変個引数関数
 - 2ギガバイトより大きいサイズのファイルのアップロード
- 7.0の新機能
 - 返り値の型宣言
 - fatal errorの多くがThrowableに

いろいろ変わってるんですよ、ええ。普通にオブジェクト指向できるしかなり安全な言語になってきています。標準関数がアレなのは変わらないですが。

## 本を読んでPHPを勉強したい
[amazonで"PHP プログラミング"と検索した結果](http://www.amazon.co.jp/s/ref=nb_sb_noss_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Dstripbooks&field-keywords=PHP+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0) 色んな本が出てきますが、「今のPHP」を学ぶという意味においては2014年以前の本では不足と言えるでしょう。現時点で決定版といえるものは無いようなので、これからPHP7を前提とした良書が出るのを期待します。

## 古い情報に惑わされないために読んだほうが良いweb上の資料(参考資料)
- [PHP: The Right Way](http://ja.phptherightway.com/)
- [PHPマニュアル](http://www.php.net/manual/ja/)
- [モダンPHPアンチパターン](http://qiita.com/tadsan/items/157969b338fd8b782b21)
- [PHP Advent Calendar 2015](http://qiita.com/advent-calendar/2015/php)

>時代遅れの情報がウェブ上にあふれている。そんな情報を見たPHP初心者は戸惑ってしまうだろう。そして、まずい手法やまずいコードが広まってしまう。 そんなのはもうやめよう。
社内でAPIに対する理解を深めてもらうために始めたこと諸々

[Enterprise APIs Advent Calendar2015](http://qiita.com/advent-calendar/2015/entapihack)への投稿です。

娘の寝かしつけに苦戦し、日付が変わってしまいましたがご容赦を。


EnterpriseなAPIネタならなんでもOKということで、いま私が担当している自社APIのプロモーション活動について書いてみようと思います。

---

弊社は某IT企業で、数十のサービスをお客さまに提供しています。
しかしながらAPIを外部公開しているサービスはほんのわずかで、お客さまにバリバリAPIを活用してもらっているとは言い難い状況です。

なぜこのような状況なのか、、、理由の一つに社内のAPIに対する理解、意識が低すぎるという問題があります。

ということで、最近になって社内に対するAPI推進活動を強化しはじめました。
言い換えると、API意識改革みたいな活動です。

活動の対象はサービス開発部、営業部の２つです。
本当は運用保守を担当している部署にも意識改革をしていく必要があるのですが、まだ手をつけられていません。
今日は、上述した２つの部署に対するAPI意識改革活動の一部をご紹介したいと思います。

# 理想形
理想形といいますか、以下のようなサイクルで社内の関連部署がうまく連携し動いてくれればいいなぁと思っています。

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/104458/61b488d2-0ea3-0fb3-53c9-233e9f013426.jpeg)


1. APIの拡充
サービスのAPIラインアップを増やす。
増やしたAPIやユースケースなどを営業部へインプット。

2. お客さまへの提案・ヒヤリング
インプットされた情報をもとにお客さまへ提案。

3. フィードバック
お客さまへの提案活動から得たコメントをサービス開発部へフィードバック。
サービス開発部でAPIの改善、また新たなAPIの開発へとつながる。

ちなみに現状どうなっているかというと、理想形の真逆、悪循環な状態が続いています。

* サービス開発部「お客さまからAPIに対するニーズがあがっていないので開発予定なし」
* 営業部「そもそも提案できそうなAPIがない」

これはどうにかしなくてはいけません！！
どちらか一方の意識改革をするだけではダメで、同時並行でサービス開発部、営業部へ意識改革を進めていく必要があります。

# サービス開発部に対しては「APIファーストなサービス開発の推奨」

ということで、まずはサービス開発部に対するAPI推進活動ですが、APIファーストでサービス開発を進めるメリットを社内勉強会などで訴えかけています。
個人的に考えるAPIファーストのメリットは以下の通りです。

1. 収益アップ、ブランド価値向上
TwitterやFaceboookなど世界的に成功しているサービスのほとんどはAPIを提供しており、かつAPI関連の収入がExpediaなんかですと90%を超える勢いで伸びているそうです。BtoBの世界でも2016年には50%がWeb API経由になるというデータもあったりします。


2. エコシステムの形成
自社で全てを対応する時代ではない。企業間が連携し互いが協調し足りない部分を補完しながらビジネスを展開していく、この連携でキーとなるのがAPIであると思います。

3. オープンイノベーション
APIを公開することで第三者のアイデアを活用しながら新たなビジネスを展開することもできます。

4. マルチデバイス・マルチプラットフォーム
APIファーストなアーキテクチャは、バックエンドにAPIを整備し、フロントエンド(UI)はAPIを通じてバックエンドとやりとりするモデルとなるため、マルチデバイス・マルチプラットフォーム対応も簡単にできてしまいます。


5. 開発効率化
フロントエンドとバックエンドでチームを分けて開発に集中できます。テスト時の役割分担も明確化できますね。


6. メンテナンス性の向上
フロントエンドとバックエンドの疎結合化により、フロントエンド側の改修がバックエンドに影響を及ぼさないなどメンテナンス性の向上も期待できます。



「ソフトウェアの未来はAPIが支配する」
これは[Intel CEO Brian Krzanichの発言](http://jp.techcrunch.com/2015/09/28/20150927the-future-of-coding-is-here-and-threatens-to-wipe-out-everything-in-its-path/
)ですが、今後SDx化が進んでいく中でAPIはその中心となるものであり、いずれAPI化が必須になるわけだから対応するのは今でしょ！（少し古いか）なんてことをサービス開発部に訴えかけています。


# 営業部に対しては「APIで実現できることをキーワード化」

APIは技術的要素が強いため、営業部に対するAPI推進活動はより一層困難に思えますが、技術的な内容を全て理解してもらう必要はなく、APIを使って何ができるのかを理解してもらうことが重要かと思います。

APIはあくまでお客さまのニーズや課題を解決するための手段の一つであるということ。
私も過去は法人営業部署にいたことがあるので痛いほどよく分かりますが、APIを全面に打ち出すような技術オリエンテッドな提案はお客さまに全く響ません。
お客さまのニーズや課題の中にあるキーワードからAPIを連想し、解決手段としてAPIをお客さまへ提案できるようになれば目的達成です。
そのためには、APIを使って何ができるかをキーワードレベルでリスト化し、営業担当者の心の引き出しに植え付けてあげることができればよいかなと思ったりしてます。
あとは社外事例ですね。最近だとFintechが熱いのでこの辺りの実例を紹介するなどして具体的な提案イメージを理解してもらうことも重要です。

# 最後に・・・
色々書きましたが、本当はAPI推進活動を各組織に働きかけていくのではなく、関係者に当事者意識をもって活動してもらうこと一番の近道だったりします。
企業規模が大きくなればなるほど組織間の壁や関係者の利害関係が柵となって、調整に時間ばかりかかって上手くいかないケースが多いです。
ということで、今後は組織横断のAPI Teamなるものを作って、関係者一丸となって自社のAPIを盛り上げていく活動ができればと目論んでおります。（まぁ、体制を作ることが一番労力を伴う話だったりしますが・・・がんばります）
jQuery Easing Plugin の関数を使ってcanvasアニメーションをする

canvasでアニメーション書くとき、イージングかけたりしようと思うと自分で1から実装するの結構しんどい。 jQuery.easing Pluginに含まれる関数を使い回すと瞬殺出来て楽しい。

```js
var ctx;// canvasの内容を適宜
var width,height;// canvasの縦と横

var draw = function(){
    var time = (getMilliseconds() - startTime);

    ctx.fillStyle="white";
    ctx.fillRect(0, 0, width, height);

    var loop_duration = 3000.0;
    if( time > loop_duration ){
      time = loop_duration - 1;
    }
    var test_t = time % loop_duration;

    var radius = 100 * jQuery.easing.easeInOutElastic(test_t/loop_duration, test_t, 0, 1, loop_duration, 2.0);
    if(radius > 0){
      ctx.fillStyle="red";
      ctx.beginPath();
      ctx.arc(400, 300, radius, 0, 2*Math.PI, true);
      ctx.fill();
    }

    requestAnimationFrame(draw);
  };

  requestAnimationFrame(draw);
```

簡単に共有まで。細かい所はご自分で適宜手を入れて上手く利用して頂ければ幸いです！
IntelliJ IDEA 15 にPlayFrameworkのプロジェクトをインポートする。


## 前提条件
* OS : MacOS X
* brewインストール済み
* Scala : version 2.11.x
* PlayFrameworkのプロジェクト作成済み [→参照](http://qiita.com/gungnir_odin/items/ab28eac673cebba67c0a)


## 1. IntelliJ IDEAをダウンロード＆インストール
https://www.jetbrains.com/idea/download/ からダウンロードして、インストールして下さい。

## 2. インポート
IntelliJ IDEAを起動して[Import Project]を選択します。
![Welcome_to_IntelliJ_IDEA.png](https://qiita-image-store.s3.amazonaws.com/0/11476/5a4ae1df-dfeb-dece-39e8-120703e8d179.png "Welcome_to_IntelliJ_IDEA.png")

作成してあるPlayFrameworkプロジェクトの[build.sbt]を選択して、[OK]をクリック。
![Select_File_or_Directory_to_Import.png](https://qiita-image-store.s3.amazonaws.com/0/11476/ac2ebb0d-1991-1ddf-8c65-d97604f220ff.png "Select_File_or_Directory_to_Import.png")

一先ず[OK]にしちゃいます。
![Import_Project_from_SBT.png](https://qiita-image-store.s3.amazonaws.com/0/11476/95d7fd0f-0a00-f5d8-3a3f-8be49c3dcd1d.png "Import_Project_from_SBT.png")

ここも[OK]にしちゃいます。
![SBT_Project_Data_To_Import.png](https://qiita-image-store.s3.amazonaws.com/0/11476/0f3a4b14-7323-abd8-ef16-98232cf32d87.png "SBT_Project_Data_To_Import.png")

ほい。できた。
![play-hello-world_-____IdeaProjects_play-hello-world_.png](https://qiita-image-store.s3.amazonaws.com/0/11476/7db2387a-4fbe-8ab1-fb63-9dae8623f8fe.png "play-hello-world_-____IdeaProjects_play-hello-world_.png")


## まとめ
コンソールで作成したPlayFrameworkプロジェクトを、IntelliJ IDEAにインポートしました。
次は、デバックでブレークポイントを置けるようになるとこまで書きます。


Prev: [Scala で Play Frameworkプロジェクトを作成する](http://qiita.com/gungnir_odin/items/ab28eac673cebba67c0a)
Next: [IntelliJ で PlayFramework プロジェクトをデバックモードで起動する。](http://qiita.com/gungnir_odin/items/b6c40e3c6f08b1513eea)
ImageMagickでepsファイルを作成


普段、epsファイルを作成するときにImageMagicを利用している。
jpgファイルをepsファイルに変換したときにファイルサイズが膨れ上がってしまったので、その対策を備忘録として。

## <i class="fa fa-cog"></i> ImageMagickのインストール
これは簡単に。
ubuntuなら、

```bash
apt-get install imagemagick
```

OSXなら、

```bash
brew install imagemagick
```
[公式サイト](http://www.imagemagick.org/script/index.php)からソースをダウンロードしてインストールしてもOK

~~ま、テキトーにインストールしてください~~


## <i class="fa fa-picture-o"></i> epsへの変換
ImageMagickがインストールされていれば、convertコマンドが使えるのでそれで変換。

```bash
convert sample.jpg sample.eps
```

これでjpgファイルからepsファイルへの変換ができる。

> convertコマンドにはいろいろとオプションがあって、様々な処理ができますが、それはこの記事の対象外なので省略（そのうちまとめたい...）

で、ここで問題が...
epsのファイルサイズが異様に大きくなってる...！！！

```bash
ls -lh
-rw-r--r--  1 tdrk  staff   181K 12 11 00:19 sample.eps
-rw-------@ 1 tdrk  staff    16K 12 11 00:17 sample.jpg
```

ファイルサイズが10倍とか、いろいろマズいじゃん...
別のファイルを変換してみたところ、10倍とは甘いものでもっと肥大化したファイルができあがる場合も...

## <i class="fa fa-search"></i> convertコマンドのhelpから...
というわけで、何か対処法がないかと探してみた。

convertコマンドのhelpを見てみると、最後にこんなことが書いてある。

```bash
convert -help
```

> By default, the image format of `file' is determined by its magic
number.  To specify a particular image format, precede the filename
with an image format name and a colon (i.e. ps:image) or specify the
image type as the filename suffix (i.e. image.ps).

- ファイル名の前にフォーマットとコロンをつける
- ファイル名の接尾辞で指定

このどちらかでフォーマットを指定してあげればいいのかな。
ただ、後者はすでにやってるので前者を試してみる。

```bash
convert sample.jpg eps:sample2.eps
```

```bash
la -lh
-rw-r--r--  1 tdrk  staff   181K 12 11 00:19 sample.eps
-rw-------@ 1 tdrk  staff    16K 12 11 00:17 sample.jpg
-rw-r--r--  1 tdrk  staff   181K 12 11 00:29 sample2.eps
```

んー、うまくいかない。

## <i class="fa fa-leaf"></i> ファイル肥大化への対処法
調べてみたら先人がいた -> [こちらの記事](http://fatsumiyoshi.hatenablog.com/entry/2012/10/01/174354)

セミコロンの前に書くの、`eps`じゃなくて`eps2`だったのか...！
というわけで、次のように変換するとファイルサイズの肥大化が防げます。

```bash
convert sample.jpg eps2:sample2.eps
```

```bash
ls -lh
-rw-r--r--  1 tdrk  staff   181K 12 11 00:19 sample.eps
-rw-------@ 1 tdrk  staff    16K 12 11 00:17 sample.jpg
-rw-r--r--  1 tdrk  staff    19K 12 11 00:29 sample2.eps
```

ここまで変わるのは驚きでした。


<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
Triviaでlambda-list パターンを実装 したら destructuring-bind より早くなった話

拙作 [Trivia](https://github.com/guicho271828/trivia/) は、 [m2ym氏作のOptima](http://qiita.com/m2ym/items/a2e00c79984750958e8a)を書き直したコピーライブラリです。

インターフェースはOptima完全互換、テストコードもほぼ同じでそのまま通ります。
なぜこうしたかというと、

1. Optimaも元はfare-matcher の構文を採用。この構文ももとからよく出来たもの。
2. 速度比較をするなら同じ構文にしたほうがやりやすい。
3. もうすでにOptimaはlispの中でも有名ライブラリという形になっていて、移行コストがちょっとでもあったらユーザーは得られないだろうなと思ったから。タダでさえ狭いlispコミュニティで…。
4. だいたいパターンマッチでそんなにいくつも構文があったらこまるでしょうに。

コピーとはいえ、改善点がいくつかあります。

+ optimaより速いです。Optimaで実験するとマッチ中になぜかConsingが発生しますが、Triviaでは発生しません。
+ lispがメインの自分と違って、m2ymさんは元はMLが中心の方。ライブラリの更新も最低限にされているようです。
+ Optimaには既存の構文を拡張するためのdefpatternがありますが、 **defpatternだけでは基礎的なパターンを定義できません。**

今回やったのは、このTriviaのなんでもパターンにできる特性を用いて、lambda-list パターンを定義した、というものです。

# はじまり

はじまりは akssri 氏 (インド出身っぽい) からのpullreqでした。一部自分には読めない文字で書いてありましたが、とにかくこの人がlambda-list パターンの原型を作ってくれました。

lambda-list とは、 関数の引数とか、destructuring-bindに書けるあのあれです。

```cl
(lambda (a b c &optional (d "default" default-supplied-p))
  (format t "~a ~a ~a ~a should all die" a b c d))

(destructuring-bind (&rest rest &key key1
                                     (key2 :default)
                                     ((:key3 k3) :default key3-supplied-p)
                                &allow-other-keys)
   (print :アババババ))

(defmacro crap-macro (&whole whole a (&key b c) &aux (d "d"))
   `(,a ,b ,c ,d))
````

これを、Triviaのパターンマッチャで書けるようにしました。他の普通のパターンと混ぜてかけます:

```cl
(match '(1 #(1 2 3) 4)
  ((lambda-list a (vector 1 _ b) c
                &optional ((string #\d #\e #\f _ _ d _) "default"))
   (list a b c d)))

;; --> (1 3 4 #\l)
```

どうやら動くので、ロジックが正しいということはわかりましたから、単体テストまで書いてもらって、そのあとリファクタリングしました。

# 結果

destructuring-bind も同じようなことが出来ますので、速度比較を行ってみました。というか、akssri さんがやってくれました。

```cl:テストコード
(let ((lst '(1 :b 2)) (tmp 0))
     (time (dotimes (_ 1000)
         (match lst
           ((λlist a &key b) (incf tmp b)))))
     (time (dotimes (_ 1000)
         (destructuring-bind (a &key b) lst
           (incf tmp b)))))
```

```:結果
Evaluation took:
  0.000 seconds of real time
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
  100.00% CPU
  11,484 processor cycles
  0 bytes consed

Evaluation took:
  0.000 seconds of real time
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
  100.00% CPU
  58,386 processor cycles
  0 bytes consed
```

プロセッササイクルで考えると6倍ぐらい早くなりました。
めでたしめでたし。
宇宙船演算子という名前にそそられて、仕様を確認してみた


##はじめに
二項演算子とも言うけど、そんな退屈な名前で呼びたくない。
なんてったって、"宇宙船演算子"の方が響きがかっこいい！笑

##ふるまい

~~~
<?php

function spaceShipOperatorTest($param1, $param2) {
    // <=> が宇宙船演算子！
    return ($param1 <=> $param2) . PHP_EOL;
}

echo spaceShipOperatorTest(NULL, NULL);   // 0
echo spaceShipOperatorTest('', '');       // 0

echo spaceShipOperatorTest(1, 1);         // 0
echo spaceShipOperatorTest(1, 0);         // 1
echo spaceShipOperatorTest(0, 1);         // -1
echo spaceShipOperatorTest(0, 0);         // 0

echo spaceShipOperatorTest(1, 1.0);       // 0
echo spaceShipOperatorTest(1.0, 1);       // 0
echo spaceShipOperatorTest(1.1, 1);       // 1

echo spaceShipOperatorTest(TRUE, TRUE);   // 0
echo spaceShipOperatorTest(TRUE, FALSE);  // 1
echo spaceShipOperatorTest(FALSE, TRUE);  // -1
echo spaceShipOperatorTest(FALSE, FALSE); // 0
~~~

要は、A <=> B の場合
- Aの方が大きければ、1
- Bの方が大きければ、-1
- 同じであれば、０
を返す。

Javaで言うcompareToのシンプル版みたいなものですね。
JIRA Softwareでバーンダウンをいい感じに描く

## JIRA Softwareのバーンダウンチャート

JIRA Software（少し前までJIRA Agileと呼ばれていました）では、デフォルトで用意されているレポート機能でバーンダウンチャートを表示できます。ここでは、サンプルではなく私が関わっている実際のプロジェクトから出力したバーンダウンを晒して、JIRA Softwareのレポート機能（特にバーンダウン）を紹介したいと思います。

![BD1.png](https://qiita-image-store.s3.amazonaws.com/0/30318/5fd9ef81-c77e-a056-9845-34c8259a8518.png)

アジャイルの解説書なんかでよく見かけるあの「バーンダウンチャート」です。進捗状況報告に使いますよね。ちなみにこれは今実施中のバーンダウンです（ついさっき報告に使ったもの）。

でも、"いい感じ"に右肩下がりのバーンダウンを描くのって、実は結構ハードルが高いんです。

<img width="382" alt="BD2.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/bfb79abb-aae6-fac2-6254-4875a764d864.png">

あれ、バーンダウンって上がっていいんだっけ？

<img width="393" alt="BD3.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/8bfb0c30-1d57-f2a4-f703-e7978c46bc1d.png">

これ株価か何か？

残念ながら適当にJIRAにタスクを登録して消化するだけだと、たとえ実装がバリバリ進んでバックログを順調に消化できたとしても、バーンダウンが右肩下がりに描かれる保証はありません。

では、どのあたりに気をつければいい感じに描けるのか、私なりにいつも気をつけていることをシェアさせていただきます。（あ、もちろんバックログ自体はきちんと消化することが前提です。。）

ちなみに、JIRA Softwareのプロジェクトタイプは「Scrum software development」に設定した場合の例です（カンバンなどのタイプではまた違った観点が必要かもしれません）。

## ストーリーは「事前に」計画しておく

バーンダウンのスタート地点は、"事前に"積み上げたストーリーの合計値で決まります。JIRAでバーンダウンチャートを右肩下がりに描く大前提として、スプリント開始前にストーリーをできるだけ全て出しておく必要があるということです。

スプリントが始まってから、あれもやらなきゃこれもやらなきゃと、思いつきでストーリーを追加すると、バーンダウンチャートの前半が右肩上がりになったりガタガタになったりします。

<img width="390" alt="BD4.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/7e466e44-e6ef-4a9b-eef9-e8dfec9d34af.png">

よく、アジャイルだから事前に計画する必要ないんじゃないかと思われがちですが、（特にScrumにおいては）直近スプリントはきっちりストーリーを計画してから消化していくのが原則です。通常、スプリントは2週間くらいですから、せめてそれくらいは計画しましょうよということですね。

## ストーリーポイントを登録する

せっかくストーリーを出してもストーリーポイントが設定されていない例を多くみます。ストーリーポイントが登録されていなければ予定数にも消化数にも反映されません。そしてバーンダウンには何も記録されません。

<img width="392" alt="BD5.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/69a71750-4625-399d-7424-cdaf3de6cd96.png">

JIRAのストーリーには、優先度や担当者などいろいろな属性がありますが、バーンダウンを描くために必要な属性は「ストーリーポイント」です。ちなみに課題タイプを「ストーリー」にすることも忘れずに（「タスク」にしているケースが多いので）。

![SP1.png](https://qiita-image-store.s3.amazonaws.com/0/30318/10cc6229-84bc-64e4-9abe-38ef80b03430.png)

## ストーリーは適度な大きさで

ストーリーの大きさにも注意が必要です。
ストーリーが大きすぎると、消化するのにスプリント期間のほぼ全てを使ってしまいます。そうなると、バーンダウンはだいたいこんな形になるでしょう（後半に急降下）。

<img width="385" alt="BD6.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/2c9b9862-4972-e385-f091-be85283f1336.png">

これでは、スプリント中に日々の進捗を把握することができません。実はこのパターンが非常に多く、スプリント後半でバタバタしてしまう要因にもなってしまいます。

1ストーリーをだいたい1日から3日くらいで終わるような大きさにするよう調整すると、このパターンは避けられるようになり、一定のリズムでスプリントを過ごせるようになります。
ストーリーの大きさが揃ってくると見積もり精度も上がるので、チームのベロシティが評価しやすくなっていくというメリットもありますね。

## あとは消化するのみ

ここまで準備ができたら「スプリントの開始」を実行して、ストーリーを消化していくだけです。ふりかえりではきっと"いい感じ"のバーンダウンを見られることでしょう。

<img width="389" alt="BD7.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/d02792f1-0e5f-486d-7547-aefe48c27ffa.png">

## JIRA Softwareのさまざまなレポート

バーンダウンの形が安定したチームでスプリントを何回かこなしていくと、JIRA Softwareにある他のレポートが勝手にどんどん育っていきます。

<img width="758" alt="VG.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/3ad102ad-8566-557f-3037-99dfee351931.png">

<img width="763" alt="M.png" src="https://qiita-image-store.s3.amazonaws.com/0/30318/6a4e4717-7ca1-a31a-a60c-d30e28a0a795.png">

ここまでレポートが充実してきたら、上司やPMOに自慢しましょう！
「何だ、アジャイル開発って結構ちゃんとしてるじゃないか」と言われて面倒な政治問題からめでたく解放されるかもしれません。
スペースリークと代数的構造

## 関数適用によるスタックとサンク

正格な言語でプログラミングすることを考えましょう。
関数適用の際にスタックが積まれ、深くなっていきます。この際のスタックはもっとも深い時にどの程度になるでしょうか。
言語やドメインによるかもしれないですが、バグを除けば100積むこともそんなにないのではないでしょうか。

Haskellを考えます。関数適用の際にはスタックではなく、代わりにサンクが積まれていきます。先と同様に考えれば、サンクの大きさは高々100程度に収まるはずです。その程度のスペースリークが問題になるでしょうか。そこが問題でないとするならば、スペースリークが発生する状況はそれなりに特徴づけられるはずです。その特徴をもう少し探ってみましょう。


## <b>非</b>再帰関数とスペースリーク

スペースリークは再帰関数に発生しやすい、と以前のエントリで書きました。それは再帰関数ならば、関数適用が数十どころか数百数千発生することも珍しくないためです。

Haskellでは再帰関数でないのにやたら使われる関数が存在します。Bind`(>>=)`です。
`(>>=)`はもちろんMonadクラスのメソッドですが、`do`構文に隠れて見えないことがしばしばあります。しかしもちろん使われているし、その度にサンクは生成され潰されています。
よって、`(>>=)`の実装が問題でスペースリークが発生することは大きな問題になってしまいます。


## モノイドとスペースリーク

モノイドは単位元と結合律を満たす閉じた二項演算からなる概念です。モノイドは非常に便利であるわけですが、その便利さはどこから来るのでしょうか。

```hs
class Monoid a where
	mempty :: a
	mappend :: a -> a -> a
```

`mappend`に注目します。二つの引数に対して同じ型の値を返します。同じ型を返すということは、得られた結果に対してまた`mappend`を適用出来るということです。

```hs
monoid_chain :: Monoid a => a -> a -> a -> a -> a
monoid_chain mon1 mon2 mon3 mon4 =
    mon1 `mappend` mon2 `mappend` mon3 `mappend` mon4
```

`mappend`はもちろん関数であるため、`monoid_chain`は引数を与えても評価されるまでサンクのままです。<b>モノイドは同じ型を返すからこそ、どこまでもスケールし、どこまでもサンクが大きくなり得るのです。</b>


## 閉じた演算とスペースリーク

一般化します。モノイドは閉じた二項演算の積を持ちますが、「閉じた演算」であることが便利さの元であり、スペースリークの原因であると言えるでしょう。

閉じた演算とは、たとえば自然数(0を含む)に対して和算`(+)`は閉じている演算ですが、減算`(-)`は閉じていません。自然数と自然数を足すと必ず自然数になりますが、自然数と自然数を引いても自然数になるとは限らないためです（負数になる可能性がある）。

そしてモノイドなどの様に二項演算でなくとも同様に便利であるし、スペースリークの原因にもなると言えるでしょう。
たとえば

```hs
succ :: Enum a => a -> a
negate :: Num a => a -> a
```
などが挙げられます。これらは単純なのでそこまで大きなサンクになることは稀でしょうけど。

先の記事で扱ったData.Map.Strictを考えましょう。

```hs
import Data.Map.Strict

insert :: Ord k => k -> a -> Map k a -> Map k a
update :: Ord k => (a -> Maybe a) -> k -> Map k a -> Map k a
delete :: Ord k => k -> Map k a -> Map k a
```

Haskellの関数はカリー化されているため、部分適用できるようになっています。そこでいくつか引数を与えると、`a -> a`の構造が見えてくることが分かります:

```hs
-- Ordは省く
insert key val :: Map k a -> Map k a
update f key   :: Map k a -> Map k a
delete key     :: Map k a -> Map k a
```

先の記事ではこれらの関数は「偏った入力に対してスペースリークが発生する」という形で紹介しましたが、こちらの方が本質を捉えていると思われます。つまり、<b>閉じた演算に対してスペースリークが発生する</b>ということです。
代数を利用することで僕たちは設計上の単純さや動作上のスケーラビリティを手に入れることができますが、同時に遅延評価の言語ではスペースリークの原因になりうるということですね。


ところでOOPLユーザにとっては上記`insert`, `update`, `delete`の引数の順番に違和感を覚えるかもしれませんが、これは部分適用ができるHaskell上での利便性のためです。他にもOOPLではオプショナルな引数を最後に持ってくることが多いかもしれませんが、Haskellでは第一引数に持ってくること等も良くあります。
一般に、部分適用の利便性のために、引数順序が逆に見えることが良くあるということです。


## 代数データ型とスペースリーク

代数データ型(ADT)は言うまでもなく代数的構造です。`List`に代表される再帰データ型は、知らず知らずの内に大きな構造となりスペースリークの原因となる可能性があるのも、代数的構造の利点であり、遅延言語の特徴でしょう。

大きなADTをfoldする際などにはListのfoldと同様にリークに注意しましょう。


## モナドは自己関手の圏におけるモノイド対象だよ

モナドはモノイドなので同様にスペースリークを警戒しましょう。まあモノイドのリークパターンとは質が少し異なる気もしますが。


## 終わりに

スペースリークの特徴がまたシンプルにまとまったように思います。

* 再帰関数
* 代数的構造に対する演算
dynamicを引数に含むメソッドの戻り値

#どー言うことか
例えば、下記のようなメソッドが有ったとする。

```csharp
public static string HogeMoge(dynamic obj) => obj?.ToString() ?? "NULL";
```

こいつを呼び出したとき、返却値の型が変化するから注意しようね。てこと。

#何がおきるのか？
例えば下記のように書いたとする。


```csharp
	internal class Program
	{
		public static string HogeMoge(dynamic obj) => obj?.ToString() ?? "NULL";

		private static void Main(string[] args)
		{
			var arg = "hello";
			var ret = HogeMoge(arg);
			...

		}

	}
```

この場合、retは *System.String* になる。
他方、下記のような呼び出しにした場合、

```csharp

	internal class Program
	{
		public static string HogeMoge(dynamic obj) => obj?.ToString() ?? "NULL";

		private static void Main(string[] args)
		{
			dynamic arg = "hello";
			var ret = HogeMoge(arg);
			...

		}

	}
```

retは*dynamic*となる。

#何でこんなことに？（まとめ）

当初面食らったけど、Twitterにて、[＠haxe](https://twitter.com/haxe/status/674968689855172608)先生と、[＠ufcpp](https://twitter.com/ufcpp/status/674970022352064512)先生から、左記のリンクのような理由を教えていただき、経緯が理解できた。

自分なりにまとめると、dynamicは実行時バインドが信条なので、実行時の環境で、例えば他のオーバーロードが存在する可能性がある。なので、コンパイル時に返却値が一意に決まらないと言うことなのだろうと思う。

尚、仕様的側面は、言語仕様の7.2.3あたりに記載がありますので興味のある方は是非。
Singletonパターンに触れてみる

# 今日の目標
JavaのSingletonパターンとはどういったものなのかを知る

# 使うもの
* [Java言語で学ぶデザインパターン入門](http://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1449322953&sr=8-1&keywords=java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80)

# ではスタート

## はじめに
まずはおなじみWikipediaでSingletonを調べてみる。

>Singleton パターン（シングルトン・パターン）とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。 ロケールやLook&Feelなど、絶対にアプリケーション全体で統一しなければならない仕組みの実装に使用される。

たまに見かけるパターンですね。
インスタンスを外部から生成できないようにし、お呼ばれしたときに必ず同じインスタンスを返す（インスタンスを1つだけ生成する）ようなパターンをSingletonパターンと言うみたいです。

## 本のサンプルを参考にしてみる

```Singleton.java
package single;

public class Singleton {

	private static Singleton instance = new Singleton();

	private Singleton() {
		System.out.println("シングルトンインスタンスを生成");
	}

	public static Singleton getInstance() {
		return instance;
	}
}
```

```Main.java
package single;

public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Singleton singleton1 = Singleton.getInstance();
		Singleton singleton2 = Singleton.getInstance();


		if(singleton1==singleton2) {
			System.out.println("インスタンスが同じです");
		} else {
			System.out.println("インスタンスが異なります");
		}
	}

}
```

これだけです。
Singletonクラスのコンストラクタはprivateなので、Singletonクラスの中でしかnewができないようになっています。また、ほかのクラスに渡すinstanceはstaticとして定義しています。まあ、これだと確かに1つしかinstanceが生成されないですね。
ちなみにmainの結果はこれ。

```
シングルトンインスタンスを生成
インスタンスが同じです
```

singleton1、singleton2は同じインスタンスということがわかります。
newをしようとすると、エラーになります。もちろん。
![singleton1.png](https://qiita-image-store.s3.amazonaws.com/0/97937/e22af3f1-26ec-e40e-1e64-333be7fae44e.png)

インスタンスの数を管理したい！制限したい！という場合には、Singletonパターンを使うんですね。具体的に使うところはあまり見えないですが、こういったパターンがある、ということを覚えておけばいざというときにきっと役に立つ。
アニメの雰囲気をVRに持ってくる方法

この記事は[Oculus Rift Advent Calendar 2015](http://qiita.com/advent-calendar/2015/oculus-rift)の11日目の記事です。

# はじめに

「VRでアニメの中に入りたい！」

と思う人は多いんじゃないでしょうか。
そこで今回は[前回解説](http://qiita.com/MuRo_CG/items/c417ef6d6cbeed3dd42b)を行った３Dアニメ表現を踏まえつつ、**アニメの雰囲気を保ったまま**VRにするための解説や思案を紹介します。
つまり**VRアニメ**表現です。
まだまだ試行錯誤中なので改善の余地は多々ありますがご了承ください。

# 映像とVRでの表現の違い
[前回解説](http://qiita.com/MuRo_CG/items/c417ef6d6cbeed3dd42b)をした3Dアニメ表現を使用して単純にVR化した場合、いくつか問題が発生します。（問題というより違和感と言ったほうが良いです）
具体的には、
・立体的に見えすぎて2Dっぽい雰囲気が弱まる。
・フレアなどのカメラに対して入れていた処理をどう入れればよいのか。
・動きが滑らかすぎてリミテッドアニメの雰囲気が弱まる。

これらの問題点や違和感を調整してVRに落とし込んでいきます。

## 立体感の調整
2Dの雰囲気を出すために**あえて立体的に感じる部分**を削っていきます。
VRは**手間にあるもの**ほど立体的に感じます。頭を動かした時にステージ上の装飾が立体的な動きをするので、それが違和感として感じてしまいます。
なのでレイアウト調整して立体感の調整を行います。
![VR版解説_レイアウト01.jpg](https://qiita-image-store.s3.amazonaws.com/0/100182/85cf0dd5-081e-b877-6887-fce1653f0373.jpeg)
![VR版解説_レイアウト02.jpg](https://qiita-image-store.s3.amazonaws.com/0/100182/789384a1-7215-1686-4394-80bec69ab675.jpeg)
今回は手前にあるオブジェクトを除外するような形で作りましたが、形状やテクスチャをVRアニメ用にきちんと調整すれば手前に置くことも可能だと思います。
意外とカキワリのように配置したほうがマッチするかも。

## 撮影処理の入れ方
カメラ対してフレアなどの処理を入れるとVRではおかしい表現になってしまいます（目の前に絵が貼り付いているように見える）
なので、カメラに貼り付けるように配置するのでは無く、**自分を基点に空間に配置**していくようにして光を作っていきます。

![VR版解説_フレア_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/100182/08a33b7d-aba8-9f42-c9f0-5fb016680dbd.jpeg)
↑今までの作り方（カメラに対して配置したフレア）

![VR版解説_フレア_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/100182/bad674e0-69ce-0140-ed3c-09113e6ad73d.jpeg)
↑自分を中心に360°に配置したフレア（自分を中心に見渡しても違和感のないように配置する）

![VR版解説_フレア_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/100182/7b45aa54-ca4e-237a-79e1-0fdc0b15b1cd.jpeg)
**右の画像**が一通り配置した状態です。（画像だとわからないですが見上げると光に包まれているよう感じます）
今回はユーザーが動き回れるので、ステージのふちより内側に配置しませんでしたが、動かないのであればもっと近くまで配置して調整できると思います。

## 動きの調整
目指したところは**[リミテッドアニメーション](http://https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%9F%E3%83%86%E3%83%83%E3%83%89%E3%83%BB%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)**の雰囲気です。
なので、あえて動きを**コマ抜き**をします。
![Limited.gif](https://media.giphy.com/media/26tPohIP5sCbfxN0Q/giphy.gif)
75fpsだと**滑らかすぎる**ので、24fpsの動きのようにコマ抜きします。

Oculus Rift DK2では**75fpsを維持する**必要があるので全体のfpsを落とすでは無く、**動きをコマ抜きする**ことでリミテッドアニメーションの雰囲気を作ります。
なのでヘッドトラッキングは75fpsを維持しているので滑らかに動けます。
（アニメ調ということもあって意外とコマ抜きしていても気にならないものです。）

今回は単純にコマを抜いた動きになっていますが、きちんと**緩急**を付けた動きを作ればもっと良くなるはずです。


## 終わりに
今回は主に雰囲気までの調整となっていますが、これらの要素に加えて**動きの緩急**やアニメ独特の**パース表現**を加えていけば見応えが出てくると思います。
さらに、「◯◯に会った！」とか「◯◯に触れ合えた！」など**VRだからこそ出来ること**や、リアルタイムレンダリングだからこそ出来る**インタラクション**などを加える事で、今までのアニメとは違った**VRアニメ**として新しいことが出来るんじゃないかと思っています！
<br>
<div><img src="http://unity-chan.com/images/imageLicenseLogo.png" alt="ユニティちゃんライセンス"><p>このコンテンツは、『<a href="http://unity-chan.com/contents/license_jp/" target="_blank">ユニティちゃんライセンス</a>』で提供されています</p></div>

明日は[hecomi](https://twitter.com/hecomi?lang=ja)さんの「Ovrvision Pro のこと書きます」です。
今回はどんな凹みマジックが出るのか楽しみですね！！
IEでツイートボタン押した先でURLしか残ってない怪現象対策


オリジナルツイートボタンとか作るじゃないですか。

Chromeとかで押すとちゃんとデフォルトテキスト入ってるんですよ。

しかしIE10とかで押したら、、、何故かURLだけになってしまうんです。

コワイですよねぇ。。。

```こんなやつ.html
<a class="twBtn" href="//twitter.com/intent/tweet?url=//hoge.com&text=こわいこわい&hashtags=じゅんじ" target="_blank">つぶやく</a>
```

これって、テキストをエンコードしてないからなんですってよぉぉぉぉ。

つまり

```大丈夫なやつ.html
<a class="twBtn" href="//twitter.com/intent/tweet%3Furl%3D//hoge.com%26text%3D%u3053%u308F%u3044%u3053%u308F%u3044%26hashtags%3D%u3058%u3085%u3093%u3058" target="_blank">つぶやく</a>
```

こんな感じにしておけば。ちゃんとつぶやいてもらえるはずなのです。

めでたしめでたし。
Cabochaインストール時エラーメモ

# [Cabocha](https://taku910.github.io/cabocha/)
+ 係り受け解析器
+ [nlp100](http://www.cl.ecei.tohoku.ac.jp/nlp100/)で使うのでローカルに入れた．

# 環境
+ Ubuntu 14.04
+ MeCab 0.996
+ CRF++ 0.58
+ Cabocha 0.69

# (よくない)前提
+ MeCabはnlp100の前段階で入れていた
+ IPAのutf-8の辞書を(参考:[MeCab公式](http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html?sess=3f6a4f9896295ef2480fa2482de521f6))入れていた
+ コマンドオプションで  
  `mecab -d /var/lib/mecab/dic/ipadic-utf8`  
  として(.zshrcでaliasかけて)済ませていた．

# インストール
- CRF++のインストール  

```
  $ tar xvfz CRF++-0.58.tar.gz
  $ cd CRF++-0.58  
  $ ./configure  
  $ make  
  $ sudo make install  
```

- Cabochaのインストール

```
   $ ./configure --with-charset=UTF8 --enable-utf8-only  
   $ make  
   $ sudo make install
```  

- エラった  

```
  $ cabocha  
  morph.cpp(187) [charset() == decode_charset(dinfo->charset)] Incompatible charset: MeCab charset is euc-jp, Your charset is UTF8
```

+ 最初，Cabochaがeuc-jpになっているのかと思ってそっち方面で調べていた．
+ よく見たらMeCabやん！ということで，
  1. .zshrcでの暫定措置をやめる  
    <del>`alias mecab='mecab -d /var/lib/mecab/dic/ipadic-utf8'`</del>
  2. /etc/mecabrcを編集  
    `dicdir = /var/lib/mecab/dic/ipadic-utf8`
  3. .cabocharcを作成
    ([参考](http://d.hatena.ne.jp/ta_maru/20090602/1243946079))  
    `mecabrc = /etc/mecabrc`

これで無事に，MeCab，Cabocha共に動くようになった．

# 教訓
エラーは流し読みしない
Swift 2.0でWKWebViewを使ってみた

# WKWebViewを使った理由

ロジックで作成したHTML文字列をそのまま表示したかった。
UIWebViewだと一時ファイルを作成して、そのファイルを読み込む必要があったため。

# WKWebViewの特徴

* Storyboardから設定できない
* コード上で定義してaddSubViewする必要あり
* AutoLayoutもコード上から定義する必要あり

# やりたき事

* 画面いっぱいにWKWebViewを表示
* 上記を実現する制約を追加

# 実装

Webのいろんな情報を参考にしてこんな実装になりました。
やりたい事がまとまった情報があまりなかった。
(WKWebViewはiOS 8以降対応のため、まだそれほど使われていない?)

```swift
  private var webView: WKWebView!

  required init?(coder aDecoder: NSCoder)
  {
    super.init(nibName: nil, bundle: nil)
    webView = WKWebView()
  }

  override func viewDidLoad()
  {
    super.viewDidLoad()
    setupSubViews()

    if let htmlString = htmlString {
      webView.loadHTMLString(htmlString, baseURL: nil)
    }
  }

  private func setupSubViews()
  {
    webView.navigationDelegate = self
    webView.scrollView.delegate = self
    webView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(webView)
    var viewBindingsDict = [String: AnyObject]()
    viewBindingsDict["webView"] = webView
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[webView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewBindingsDict))
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[webView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewBindingsDict))
  }
```

# ちなみに

このような実装でも良いようです。シンプルですね。
http://qiita.com/hanamiche/items/b0e576b7d3c87ca9cb99
より一部抜粋

```swift
    var _webkitview: WKWebView? 

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //3.WebKitのインスタンス作成!
        self._webkitview = WKWebView()

        //4.ここでWebKitをviewに紐付け
        self.view = self._webkitview!

        //5.URL作って、表示させる！
        var url = NSURL(string:"http://www.yahoo.co.jp/")
        var req = NSURLRequest(URL:url)
        self._webkitview!.loadRequest(req)
    }
```

#その他参考情報

* http://qiita.com/ShingoFukuyama/items/eede79a284c3669846e9
* http://techblog.yahoo.co.jp/ios/let-uiwebview-as-wkwebview/
【Photoshop】QuickTimePlayerで撮ったMacの画面動画を、Qiita投稿用にPhotoshopでGIFアニメにする

画面のキャプチャー動画をQiitaの記事に貼りたいなと思ったのですが、GIFアニメにする必要があり、「どうしたらいいのかな？」と思ったら、Photoshopで出来たのでまた必要が出来た時のためにメモしておこうと思います。

#前提条件の環境
・使用パソコンはMac
・画面の動画はQuickTimePlayerで撮影
・Adobe Photoshop CCを使用

#手順
【１】QuickTimePlayerの「ファイル」＞「新規画面収録」で撮ったMacの画面動画を、Photoshopで開く。

【２】Photoshopの「ファイル」＞「書き出し」＞「Web用に保存（従来）…」で、GIF形式を選択して、保存。

単純にそのままGIFアニメにするだけなら、これで完了です。

無限ループさせたい場合には、書き出しの最に「アニメーション」の「ループオプション」を「無限」に変更します。

#容量を軽くしたり、画像のサイズを変更するには？
画像のサイズは、通常の静止画を編集するのと同じ容量で変更できます。
「イメージ」＞「画像解像度」や、「イメージ」＞「キャンバスサイズ」で、任意の画像サイズを指定すればOKです。

GIF画像の書き出しの最にも、サイズの変更は出来ます。

GIF画像の書き出しの最に色数を減らせば、その分容量は小さくなっていきます。
劣化もしていくので、プレビュー画像を見ながらほどよいところを探ります。
（プレビュー画像の下に現在の設定での容量が出てますので、そこを確認しながら妥協ラインを探します。）

#感想
Photoshop使用の時点で、かなり環境に制限がかかった方法ではありますが、簡単に動画→GIFアニメ変換が出来たので、持っている方はぜひ。

通常の画像を作成するのと同じような容量で、レイヤーを足して字幕なども簡単に付け足す事もできます。
Rails error tracking サービス 5 選

# 概要

Rails / Javascript で構成されているサービスで発生しているエラーをトラックし、統計的に対処すべきエラーの優先度をつけたり、その原因を追い込んだりするためにおすすめの Error Tracking サービスを 5 種類ほどピックアップしました。

# ピックアップしてみました。

タイトルをクリックすると該当するサイトに飛べます。

## [Airbrake.io] (https://airbrake.io/)
定番であり、かつ、UI が優れています。Javascript error も tracking できますし、対応言語も iOS なども含む 18 言語と多め。$39〜

## [HoneyBadger] (https://www.honeybadger.io/)
Airbrake と並ぶ人気。Javascript error も tracking できて $29〜。有料プランでも過去のエラーを遡れる期限がわりと制限かかっているので注意すべきか。対応言語数は Ruby、Javascript、Elixir、Go、NodeJS、Java。
かなり制限がかかりますが、一応 free plan も存在するのが特徴ですね。

> Yep! Just try one of our normal plans free for 15 days. If you don't sign up, you'll be downgraded to a free plan. It includes 1 user, 1 project and a 3 error per minute limit.

## [Bugsnag] (https://bugsnag.com/)
Javascript モニター可能。Cocoa 等も含む 12 種類のライブラリを備えていて $29〜。一番安い有料プランでも 3 ヶ月過去に遡れるので、この点重視したい人はよいかもしれません。

## [New Relic](http://newrelic.com/)

定評のある New Relic APM にて、アプリケーションのパフォーマンス計測から、エラー統計・トラッキングまで管理できます。Javascript の Error tracking 対応がなさそうですが、より低レイヤーのサーバのリソース監視などをひとつのコントロールパネルで統合的に見れるのは魅力的ですね。$149〜と Pricing は Error tracking だけで使うにはちょっとお高めでしょうか。

## [Errbit](http://errbit.github.io/errbit/)

Airbrake の API に互換している OSS のエラートラッキングソフトウェア。自分で設置する必要があるので例外編ということで。Ruby 2.1.0 / Mongo DB 2.6.0 が動作する環境を用意する必要があるので、サーバリソースはあるが、なるべくコストかけないで試したいという時にはおすすめかも知れません。Javascript の Error Tracking も可能です。
JavaFX アプリケーションに隠し Control を搭載する

この記事は [JavaFX Advent Calendar 2015](http://qiita.com/advent-calendar/2015/javafx) の 11日目の記事です。
昨日の10日目は kokuzawa さんの [JavaFXのUIをJUnit形式でテストする](http://kokuzawa.github.io/blog/2015/12/10/testfx/) です。明日の12日目は skrb さんです。

### 概要
この記事では、 JavaFX に隠し Control を搭載する方法を紹介します(予告からタイトル変えました)。

### スクリーンショット
まず、どういうことをやるのかを画像でお見せします。

![app_widget1.png](https://qiita-image-store.s3.amazonaws.com/0/102004/cc7fe57f-641d-37af-1fe0-31526aa09e5c.png)

アプリケーションを起動すると、こんな感じで TextField を持つ App Widgetが表示されます。キーワードの入力を受け付け、Web 検索の結果を WebView で表示する、という簡単なアプリケーションです。起動直後は WebView を隠してあります。

![app_widget2.png](https://qiita-image-store.s3.amazonaws.com/0/102004/ee80d53a-423d-09cf-a2d2-162fbe2f86ac.png)

では何か適当なキーワードを入れて検索してみましょう。

![app_widget3.png](https://qiita-image-store.s3.amazonaws.com/0/102004/2d0ec889-4dda-54f0-a8e4-3b517a1c5346.png)

すると、App Widget のサイズが拡張され、 Yahoo!Japan の検索結果が WebView で表示されます。

![app_widget4.png](https://qiita-image-store.s3.amazonaws.com/0/102004/b4358fea-8a76-4c32-a4f6-bc8574f86c56.png)

WebView なのでリンクをクリックすれば別のページに移動できます。

![app_widget5.png](https://qiita-image-store.s3.amazonaws.com/0/102004/883effc7-e47a-4f2a-45e5-1f91928f6001.png)

下の列に配置されている「hide」という Buttonを押してみると

![app_widget6.png](https://qiita-image-store.s3.amazonaws.com/0/102004/503f5f00-c9e3-3d2b-6e24-4c8cc6395e45.png)

WebView が隠されて、元のサイズに戻ります。

### 実装する
#### FXML に隠し Component を用意する
[FXML 全体](https://github.com/toastkidjp/search_app_widget/blob/7ffbc5bb2245aa582956eb5388e429b66807d88e/res/scenes/Main.fxml)

まず、隠しておきたい Control を Container でラップし、Container に「managed="false"」の属性を追加します。

    <HBox fx:id="browserArea" alignment="CENTER" managed="false" prefHeight="559.0" prefWidth="900.0" spacing="5.0">
         <children>
            <WebView fx:id="webView" nodeOrientation="INHERIT" prefHeight="400.0" prefWidth="600.0" />
         </children>
    </HBox>

FXML 側の準備はこれだけです。

#### Controller クラスに表示/非表示のメソッドを実装
続いて、Controller クラスに Container の状態を操作するメソッドを用意します。setManaged メソッドを使って表示/非表示の切り替えが可能です。

##### 表示メソッド
    @FXML
    protected void showBrowser() {
        browserArea.visibleProperty().setValue(true);
        browserArea.setManaged(true);
    }

##### 非表示メソッド
    @FXML
    protected void hideBrowser() {
        browserArea.visibleProperty().setValue(false);
        browserArea.setManaged(false);
    }

実際のコードでは Stage のサイズも併せて変更しています。

### 何ができるか？
Dialog で表示するのではなく、同じ Stage 上で見せたい、けど通常は非表示にしておきたい Control (コンソール、スクリプト入力等)をアプリケーションに搭載したい時に使えるかと考えました。

### 改良点
1. デザイン調整
2. アニメーション追加

### 参考
1. [JavaFXとアナログ時計](http://www.torutk.com/projects/swe/wiki/JavaFXとアナログ時計)……StageStyle.TRANSPARENT 時のドラッグ移動の方法を使わせていただきました。

### GitHub repository
[search_app_widget](https://github.com/toastkidjp/search_app_widget/tree/7ffbc5bb2245aa582956eb5388e429b66807d88e)
ChromeブラウザでTwilioClientがマイクにアクセスできなくなる

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

この記事は、Twilio Advent Calendar 11日目の記事です。
9日目は、satoshi0212さんの「[Twilioサーバーレス化作業記録 - RequestURLもサーバーレス化](http://qiita.com/satoshi0212/items/57127dc500fc090b9cd2)」でした。

## はじめに
この記事は、直接Twilioとは関係ないのですが、TwilioClientのJavaScripts版を利用していて、今月に入ってからChromeブラウザでエラーが発生するようになったため、その原因と解決方法を記事にしたものです。
[TwilioClient](https://jp.twilio.com/docs/quickstart/php/client)とは、パソコンのブラウザを使って電話ができるという、TwilioのVoIP機能です。

## 現象
Chromeブラウザを使って、TwilioClient（JS版）で通話をしようとすると、ある日から突然以下のメッセージがでてエラーになる、もしくはマイクへのアクセス許可ダイアログが表示されずに接続できなくなります。Safariなど、別のブラウザでは今までどおり動作します。

**Error: User denied access to microphone, or the web browser did not allow microphone access at this address.**

## 原因の推測
エラーメッセージから推測するに、どうやらマイクへのアクセスができないよとのことらしい。念のためChromeのデベロッパーツールを確認すると、以下のWarningが出ている。

```lang:Console
static.twilio.com/libs/twiliojs/refs/6359b40/twilio.min.js:113 getUserMedia() no longer works on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details.
```

要は、httpsでアクセスしてないので、セキュリティ上マイクへのアクセスはそのうちにできなくなるから気を付けてねということらしい。で、そのうちがやってきたというわけです(Chromeのバージョン47からかな）。
ということなので、解決策はSSL/TLSでアクセスすれば良いわけですが、テスト環境などにもいちいち証明書を用意するのは大変ですよね、奥さん。

## 対策１　セキュリティチェックをバイパスする
他の方法はないかと先ほどのWarningメッセージにあったURLを見てみると、どうやら起動オプションを指定することで、セキュリティチェックをバイパスできるらしいっす。
さっそく試しにやってみる。
まずは、Chromeを完全に閉じる。
Macのターミナルから以下のコマンドを入力する（あらやだ、あなたWindowsなの？そんなOS、知らないですわよ）。

```
open -a "/Applications/Google Chrome.app" --args \
--unsafely-treat-insecure-origin-as-secure="http://www.hoge.com" \
--user-data-dir=/tmp/foo
```
*www.hoge.comのところはアクセスしたいURLに書き換えてください。*

うまくコマンドが通れば、Chromeが起動してきます。
Chromeをインストールした直後のような動作になるけど、確かにこれだとアクセスしたいURLでちゃんとマイクの許可ダイアログが表示されるようになります。
まぁしかし、長期的に考えるとSSL/TLS対応するのがベストですよね。

## 対策２　無料で証明書を準備する
今までだと、証明書を取得するには年間数千円から数万円の費用がかかるので、テスト環境のドメインでは準備するのが大変でした。しかし、[Let's Encrypt](https://letsencrypt.org/)の登場により状況は一変しました。

###Let's Encryptとは
Let's Encrypt は、認証局（CA）として「SSL/TLSサーバ証明書」を**無料で、しかも簡単に**発行してくれるサービスです。
なぜ無料かというと、無料にすることでTLS や HTTPSを普及させ、安全なネットの世界を作りたいという、非常に素晴らしい志があるからです。運営は、非営利団体の ISRG（Internet Security Research Group）で、シスコ（Cisco Systems）、Akamai、電子フロンティア財団（Electronic Frontier Foundation）、モジラ財団（Mozilla Foundation）などの大手企業・団体が、ISRG のスポンサーとして Let's Encrypt を支援しています。
今まではクローズドβだったのですが、2015年12月4日からオープンβプログラムに移行したため、誰でもが利用できるようになっています。
詳しい説明は、以下のページをご覧ください（日本語で導入方法が書かれています）。

[Let's Encryptの使い方](https://letsencrypt.jp/usage/)

注意点だけ書いておくと、
- 証明書を利用するサイト上でLet's Encryptsソフトウェアを実行すること
- ドメイン認証のみのサポートなので、企業認証やS/MIMEなどでの利用はできない
- 現時点では、Windows環境ではLet’s Encryptsソフトウェアが動作しない
といったところでしょうか。

僕も実際にAWS上のEC2で試してみましたが、無事に取得できました。
で、この記事の主題でもある、TwilioClientは、SSL/TLS対応することにより、正常に動作することを確認しました。