OmniAICreator/Qiita-1.07M huggingface dataset:
スクラム初心者がプロダクトオーナー兼エンジニアとしてスクラム開発を三ヶ月続けてみて


##はじめに
今いるチームでスクラムを導入して三ヶ月経過しました。スクラム開発という文脈で、個人的な気づきと悩んでいることをつらつらとまとめてみました。スクラム開発をしている方の目に止まれば幸いです。

##私は誰?
とあるWEB企業で、とあるBtoBtoC向けサービスの開発に、エンジニアとして関わっています。スクラム導入当初はプロダクトオーナー兼エンジニアをしていましたが、やりたいことが変わり今はエンジニアをしています。

##スクラムという用語との出会い
スクラムという用語を聞いたのは多分4年くらい前です。

当時アジャイルで開発(ウォーターフォールではない、というくらい)をしている自分のところに、同じ社内の他チームがスクラムという開発手法で開発しているらしい、というのを耳にしました。その時は「なんじゃそりゃ？ラグビー関係あるの？」くらいの感想。

その一年後くらいに、自分のチームでアジャイルサムライの本が流行しました。特にストーリーポイント、という概念がチーム内でバズって、実際にチームでストーリーポイントを使って見積もりをしたことがありました。
しかし、その時は僕は、なんでストーリーポイントで見積もってるのか全くわかってませんでした。

極めつけが、当時の同期だったS木君からの「ストーリーポイントって何がいいの？」という純粋な質問。
あー、自分わかってないな、、、当時の自分ダメダメ(・_・;)
見積もっただけで特にストーリーポイントを活用すること無くフェードアウトしていきましたとさ。

##認定スクラムプロダクトオーナー研修への参加
スクラムに関して、よくわからない状態でそのまま時が経過。
今年の二月に今の会社に転職してきて、ふとしたきっかけで認定スクラムプロダクトオーナー研修を受講することに。講師はその世界で有名な、ebackyこと江端さんでした。研修に参加前はスクラムについて全く知らなかったので研修ではちんぷんかんぷんでしたｗ なんというか、江端さんからはマインド的なことを叩きこまれた気がします。研修の中のリーンキャンバスの課題で、街中の人に突撃インタビューしたのはいい思い出です。意外とできるもんでした。

##担当PJでのスクラム導入の機会
2015年9月から担当PJで本格的にスクラムをはじめることになりました。とても業務的な話なので割愛m(_ _)m

##個人的な気づきと悩んでいること
###目標達成に向けてきちんとコミットするにはスクラムは最適
今までの経験で色々な開発をしてきましたが、スクラムはチームのマネージメントがすごい。スクラムマスターやプロダクトオーナー、チーム外のマネージメント層からからするとこれはとても管理しやすい開発手法なんじゃないかなと。チームのタスクの管理がかなりガチガチ。
一方でチームのモチベーションをうまくコントロールすることで、コミットへの意識も強くなりタスクをきちんとこなすという。諸事情により、私はプロダクトオーナーとエンジニアの両観点でスクラムに参加した経験があるので、この辺の事情はよく理解できているつもりです。

###スクラム導入前後で開発効率がどう変わったかはよくわからない
これは私が効果測定の方法をいれていなかったのが致命的だったのですが、開発効率という観点ではスクラム導入してよくなったのかどうかは特に判断できていないです。理論的には、話し合いに時間をさくようにして、その分開発時間は短くなります。話し合いに時間をさいたぶん、手戻りが少なくなりトータルで開発効率が上がるのか。はたまた、開発時間が多いほうが開発効率が上がるのか。頭で考えてもよくわからないですね(´・ω・｀)
やはりはスクラムをいれる目的次第という話に。

###自分達に適したスクラムのやり方は自分たちで見つける必要がある
当たり前かもしれないですが、何かベストプラクティスがあってもそれをそのまま自分たちに応用できることはまれです。なぜなら、会社や担当PJの状況が全く一緒なところなんでどこにもないから。
実際に僕達がやってみても、自分達用にもろもろカスタマイズしています。その都度チームで議論をしています。ものすごい簡単な例だと、チームメンバーがタスクを取っていく際のロジック。
理想としてはスキルに属人化はなく、優先順位が高いものからタスクをとっていくのがよいとされています。
しかし、実際そんな状況にするのは難しい。なので例えば、サーバーサイドエンジニア、フロンドコーダー、iOSアプリエンジニア、などと彼らの得意分野のタスクをとることが多くなります。
とは言え、そのままだと個のスキルが成長しないので不得意な分野に積極的にトライできるなサポート体制も整っています。
例えば私は、CSSがほぼほぼまってくだきなかったですが、最近CSSに積極的にトライさせていただいています。CSS楽しい。

###スクラムで開発する目的がないと、スクラムをやっているだけになってしまう
特に個人的に顕著な所感としてこれがあります。スクラム導入前は色々課題があったので導入をしました。実際に導入してみるとどうでしょう。その課題は解消されてきました。そうするとスクラムを続ける理由が感覚的にはわからなくなってきます。前に課題だったことが課題でなくなってるわけだから、意識しないでスクラムをやってるとそういう思考になってくるのかなと。
また、案件によってはこれってウォーターフォールでやってもいいんじゃない？といった疑問が浮かんでくることも有ります。何でもかんでもスクラムでやろう、とせずに使い分けることが重要なのかなと。そうでないとやはりとりあえずスクラムをやっているだけになってしまいます。
などと自分で書いていながら、今個人的にこの課題にぶちあたっています。なんでスクラムで開発してるんだっけ？という疑問。まずはスクラムをやっている目的を整理するのが吉かなと。

##セミナーでも発表してきました
などなどのような話を社外で発表させていただいた際の資料があるので最後に共有しておきます。
もしスクラムに関して興味がある方がいれば、お気軽にコメントなどいただければ幸いです。
http://www.slideshare.net/tatsuyayokoyama7161/ss-55581976
乱数を再現できるようにSeedRandomを付けよう

RandomIntegerやRandomRealなどの乱数は、Mathematicaのカーネルを起動する度に初期化されます。

毎回違う乱数が出てくれるのはそれはそれで有り難いのですが、

「ランダムで100標本選んでグラフ出力したけど同じ標本を使い回して別のグラフを書きたい」

などの要求が生じたときに困ります。
選んだ標本を保存しておくのも手ですが、標本数が多すぎたり保存しにくいものだったら大変です。

解決策は、ノートブックの冒頭に

```mathematica
SeedRandom[0]
```

と入れるだけです。
（整数なら引数は別に0じゃなくても何でもいいです。）

これで毎回同じシードを元にした同じ乱数が生成されます。
20分で転送電話を実装

##何がしたいのか
固定電話の番号が必要
そこへの着信を携帯電話で受けたい
受けた電話番号をDBに保存したい

##概要
* Twilioで050-XXXX-XXXXの番号を取得
* RailsでTwilioAPIを利用して050にかかってきた電話を任意の携帯090-xxxx-xxxxに転送
* かかってきた電話番号をDBに保存
* 上記をデプロイ（今回はheroku）

##手順1 デプロイ先(heroku)を先に用意しておく
https://www.heroku.com
![スクリーンショット 2015-12-06 22.46.17.png](https://qiita-image-store.s3.amazonaws.com/0/35100/da1836b2-e350-39ef-bcbd-aeca92eae7b4.png)

##手順2 railsアプリケーションを用意

```
rails new callforward
cd callforward
git init
heroku login
heroku git:remote -a callforward1(herokuアプリの名前)
```

##手順3 Twilioにアカウントを作って電話番号を取得
https://jp.twilio.com/try-twilio/kddi-web

必要項目を入力して次に進むと以下のような画面が出るのでSMS/電話を受けれる電話番号を入力
(例)+81 9012345678
最初のゼロは抜いて下さい

認証コードが届くので入力

ログインしたら電話番号タブに行き画面中央のGet a number now をクリック
![スクリーンショット 2015-12-06 22.38.04.png](https://qiita-image-store.s3.amazonaws.com/0/35100/1fe72897-cbbc-2b63-8789-f226dee7637b.png)

最初のTwilio電話番号を取得をクリックしChoose this numberを更にクリック
![スクリーンショット 2015-12-06 22.40.13.png](https://qiita-image-store.s3.amazonaws.com/0/35100/4f145157-5219-9e29-1e82-82620a89c90d.png)

無事電話番号が取得できました
![スクリーンショット 2015-12-06 22.41.34.png](https://qiita-image-store.s3.amazonaws.com/0/35100/03c0c930-d225-9ea9-5b90-7618b47a84e3.png)

電話番号の管理を行うので取得した電話番号をクリック
![スクリーンショット 2015-12-06 22.58.36.png](https://qiita-image-store.s3.amazonaws.com/0/35100/b1347f98-2a86-05ec-5b06-6cc6cf392b79.png)

音声通話のRequest URLにデプロイ先/コントローラ名/アクション名を設定
(例)http://callforward1.herokuapp.com/calls/forward
![スクリーンショット 2015-12-06 23.09.25.png](https://qiita-image-store.s3.amazonaws.com/0/35100/c975603d-0794-adef-7606-90e3418618b6.png)


##手順4 Rails

```
rails g controller calls forward
rails g model call phone_number
```

アクションを実装
callerIdは取得した電話番号
+819012345678は転送先（この場合は090-1234-5678に転送される）

```calls_controller.rb
class CallsController < ApplicationController
  def forward
    render text: "<Response><Dial callerId=\"+815031717046\">+819012345678</Dial></Response>"
    @call = Call.new
    @call.phone_number = params[:Caller]
    @call.save
  end
end
```

ルートを以下のように編集

```routes.rb
post 'calls/forward'
```

CSRF対策を無効にする

```application_controller.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  # protect_from_forgery with: :exception
end

```

GemfileをHeroku用に

```Gemfile
#gem 'sqlite3'
gem 'pg', '0.15.1'
```

##手順5 デプロイ
bundle install

```
bundle
```

addとcommit

```
git add .
git commit -am "first commit"
```

デプロイ

```
git push heroku master
heroku run rake db:migrate
```

##手順6 アップグレード
トライアルで利用できると思っていたのですが、ダメだったのでアップグレード(最低2000円を入金)させます
こちらからアップグレード出来ます
https://jp.twilio.com/user/billing/upgrade

##実験
これで準備は出来たので、登録したTwilio番号に電話をすると設定した転送先に転送されるはずです。

着信番号はDBに保存されているので確認

```
heroku pg:psql
select * from calls;
```

##最後に
電話番号を保存するの部分が無ければ、この出力されるものをxmlファイルもしくは同等の出力機能を持ったサービスを使えばわざわざherokuやらrailsやらでやらなくてもRequestURLにそれを指定すれば良いので数分で終わります。
転送する料金等はTwilioのHPで確認して下さい
最後まで読んで頂いてありがとうございました。
MacにGoを入れて実際に動かしてみるまで

本記事は私が初めてMacにGoを入れて実際にサンプルプログラムを動かしたときにやったことを書いていきます。ささっとGoをMacで試してみたいひとの役に立てれば幸いです。

試してみた際に参考にした公式サイトのURLはこちらです。
https://golang.org/doc/install

# 試した環境
・Mac OS X 10.11.1
・使用したGoは1.5.2

# Goのセットアップ
1. Goダウンロードサイトに行き、「Apple OS X」のダウンロードリンクをクリックしpkgファイルをダウンロード。
https://golang.org/dl/

2. pkgファイルをダブルクリックをして、goをインストール。
3. その後、ターミナル上で`ls /usr/local`と入力して一覧の中に「go」が出て来ればOK.
3. ターミナルのパスを通す。`~/.bash_profile`に「`export PATH =$PATH:/usr/local/go/bin`」を記述して、保存する。そして、ターミナルの再起動。
4. `go`と打ってgoのUsageが出ればOK.

# Goを動かしてみる

1. GOPATHにworkspaceを指定する。`~/.bash_profile`に「`export GOPATH =[workspaceに指定したいフォルダ]`」を記述して、保存する。この時、goがインストールされているフォルダは指定しないこと。
2. workspace内にsrc/helloフォルダを作成。
3. src/helloフォルダ直下にhello.goを作成し、以下のコードを記述。

```go:hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

3. GOPATHフォルダに移動し`go install hello`をターミナル上で入力し、ソースコードをコンパイルする。
4. コンパイルが終わったので`bin/hello`を実行して、「hello, world」と表示されればOK.

これで動作確認まで終了。これをベースにgoでどんなことができるかを試していけばOK.

#動作確認が終わってバリバリコードが書きたい人は
このページをみてください、らしい。Goらしいコードを書くためのヒントが詰まっていると思います。
https://golang.org/doc/code.html
仮想マシンでwordpress開発環境構築

# 仮想マシンでwordpress開発環境構築
## 前提
- php,mysql,apache導入済み

## 方法
- 最新のwordpressをwget

`wget https://ja.wordpress.org/wordpress-4.3.1-ja.zip`

- 解凍

`unzip wordpress-4.3.1-ja.zip`

- 共有フォルダ(/vagrant/)に移動

- apacheを設定

`vi /etc/httpd/conf/httpd.conf`

```
DocumentRoot "/vagrant/wordpress/"
```

- データベースを作成
- 作成したデータベースを使ってwp-config.phpを設定
vagrant上のUbuntuで動いてるMeteorアプリのMongoDBにRobomongoから接続したい（願望）

アドベントカレンダーに参加表明したものの、かなりギリギリになってしまいました…(_ _;)

さて、表題の通り、
会社ではMac、自宅ではWindowsのため、基本的にはすべての作業をVagrant内のUbuntuで完結させたいと思っています。

なので、vagrant上で動いているMeteorアプリのMongoDBに接続しようと試みてみました。

CLI上から接続するのであれば、

```bash
$ cd meteorApp
$ meteor
```

でアプリを起動中に、

```bash
$ sudo meteor mongo
```

でMongoにログインできます。

とはいえ、本格的にチームで開発することを想定したら、GUIクライアントからアクセス出来ないと結構つらい…。

そこで、[Robomongo](http://robomongo.org/)というGUIツールからアクセス出来ないかと試みてみました。

## Robomongoのインストール

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/cf178581-ba8f-b26e-fef6-0d437edbf332.png)

Windowsでのインストールは、インストーラーに従うのだけなので簡単です。
ちなみに、今回の環境はWindows10です。

## VMのセットアップ、Meteorの起動

※[vagrant上のUbuntuでMeteorアプリを動かす](http://qiita.com/bumcru/items/ab212bfd8ed99a9415c8)と同じ手順です。

## Robomongoから接続

- ホストとポートの設定

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/8b492085-fe38-dec6-fcae-a66f9f3c20b9.png)

- SSLはチェックしない

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/e0b60f6b-8e41-5815-45a0-c3df2c43c3fe.png)

- SSHはTeratermで接続する時と同じ

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/400eebdd-22c3-03db-62ac-f91eb22e941c.png)

これで設定ダイアログ左下の「Test」を押してみると...、

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/ec0419f0-e3f0-8984-0775-1be543624f9b.png)

となって、接続はできるが認証に失敗しているっぽい。

そのまま保存して接続してみると、

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/0c73a06c-dce6-bb92-577b-2a3a6d61b768.png)

となって接続できない。

そこで、vagrantのUbuntuにMongoDBをインストールし、Robomongoから繋げられるか試すと、以下のようにポート番号を変えるだけで接続できる。`/etc/mongodb.conf`の設定は特に変更せずにいけるはずです。

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/35b754b3-a0dc-bc41-1573-15f92bd12d0c.png)

テストをするとやっぱり失敗するが、保存して接続すると、上手く接続できるのが確認できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/62143/49447bfa-c760-0bf1-5dd3-5ff664ebbbee.png)

うーん…。
MeteorのDBに繋ぐのは諦めて、MeteorからはVM内のローカルに用意したDBに接続するしか無いのかな…。

やり方をご存知の方がいらっしゃったら、是非教えて下さいm(_ _)m
Elastic beanstalk on Docker on Elastic beanstalk (前半)


Elastic Beanstalk はAWSのサービスを簡単にセットアップできるサービスで、インスタンスをいろいろなプラットフォームを動かすことができます。
今回はElastic BeanstalkでセットアップしたDockerのイメージ上で、Ruby on Railsを動かすために自分がやってみた方法をご紹介します。

間に合わなさそうなので
長くなりそうなので、今回はElastic beanstalk の設定と Docker設定ファイルの取得までです。

まず、ローカルでRailsのプロジェクトを用意します。
Rubyは2.2を使います。

## Elastic beanstalkの環境を作成

<img width="600" alt="create_env_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/18113/0c258371-3351-c385-69b5-687bd8715a01.png">

事前定義はDockerを選びます。

<img width="600" alt="create_env_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/18113/a0f71692-731f-e003-95d9-ddeb6a12eedd.png">

まずはサンプルアプリケーションで作成して、後から書き換えます。

<img width="600" alt="create_env_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/18113/fc2e51f1-8298-2205-0c32-63308335922e.png">

データベースはRDSを利用しますので、チェックをいれて作成します。

<img width="600" alt="create_env_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/18113/5850adad-bdb5-7890-4806-013525dd41ae.png">

EC2のキーペアも作成します。
RDSの設定もあわせて行います。ユーザー名、パスワードを入れて進めます。

<img width="600" alt="create_env_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/18113/29e0e31b-52ed-eea6-6ffa-9259aa741c7a.png">

サービスロール等もウィザードに沿って作ります。
全部できたら「起動」します。

## eb コマンドラインインターフェースのインストール

Elastic beanstalk にコンソールからデプロイするために、ebコマンドラインインターフェースをインストールします。
homebrewからもインストールできますが、最新版を常に使いたい場合は、pip コマンド経由でインストールします。pip コマンドをインストールするには setuptools が必要なので、こちらもあわせてインストールする必要があります。

```
$ curl https://bootstrap.pypa.io/ez_setup.py -o - | python
$ easy_install pip
$ pip install awsebcli
```

Railsのルートで eb init コマンドを実行して、設定を入れます。
ここから eb deploy に進めばよいのですが、いくらか追加の設定が必要です。

## Dockerfile等の設定ファイルの準備

Rails を Docker 上で簡単に動かすために、 passenger-docker のイメージを利用します。
https://github.com/phusion/passenger-docker

いくらか設定が必要なのですが、こちらのスレッドに設定ファイルがまとまっているので、こちらを拝借します。

http://stackoverflow.com/questions/31516527/how-to-deploy-rails-application-on-amazon-elastic-beanstalk-on-a-single-containe

RailsのルートディレクトリにDockerfile, Dockerrun.aws.json, .dockerignore, nginx-env.conf, nginx.confをコピペします。

### 環境設定の設定

Elastic beanstalk は設定画面で環境変数をセットすることができます。必要な環境変数は立ち上がったあとのElastic beanstalkの設定画面からセットしておきます。さらに、nginxがrailsに環境変数を渡せるようにするために、 `nginx-env.conf` に設定を追加する必要があります。

つづく・・
RaspberryPi1 ModelBの初期設定

#概要
自宅で使用しているRaspberryPi1 ModelBの調子が悪くなったので再インストールを行いました。その際に一部うまくいかない個所があったのでメモしておきます。

#環境
- RaspberryPi1 ModelB
- RASPBIAN JESSIE LITE (Release date:2015-11-21)

#SDカード作成
1. 公式サイトの[ダウンロード](https://www.raspberrypi.org/downloads/raspbian/)からRASPBIAN JESSIE LITEのZIPをダウンロードします。
2. SDカードにイメージを書き込みます。（Win32 Disk Imagerを使用）
3. RaspberryPiを起動します。

#raspi-config設定
pi/raspberryでログインし、設定してきます。

1. "raspi-config"画面に入ります。
$ `sudo raspi-config`

2. "1 Expand Filesystem"を実行

3. "2 Change User Password"を実行

4. "5 Internationalisation Options"を実行
"I1 Change Locale"
 - [ ] en_GB.UTF-8 UTF-8
 - [x] ja_JP.UTF-8 UTF-8
-> "ja_JP.UTF-8"

"I2 Change Timezone"
 "Asia" -> "Tokyo"

"I3 Change Keyboard Layout"
 "Generic 101-key PC" ->  "Other" -> "Japanese" -> "Japanese" -> "The default for the keyboard layout" -> "No compose key"
 
5. \<Finish>を選択し、RaspberryPiを再起動します。

#ネットワーク設定
NOOBS 1.4.1 以降(Raspbian 2015-05-05)から設定が変わり、"/etc/network/interfaces"を編集しても固定IPにできません。ここで数時間引っかかってしまいました。
"/etc/network/interfaces"内にも記載されている"/etc/dhcpcd.conf"を編集してeth0を固定IP化します。

$ `sudo vi /etc/dhcpcd.conf`

>interface eth0
>static ip_address=xxx.xxx.xxx.xxx //RaspberryPiのIPアドレス
>static router=xxx.xxx.xxx.xxx //デフォルトゲートウェイ
>static domain_name_server=xxx.xxx.xxx.xxx //DNSサーバのIPアドレス

$ `sudo service dhcpcd reload`

#ホスト名変更
$ `sudo vi /etc/hostname`
$ `sudo vi /etc/hosts`
$ `sudo reboot`

#パッケージ更新
$ `sudo apt-get update`
$ `sudo apt-get upgrade`

#参照先
こちらを参考にさせていただきました。

- [Raspbian初期セットアップの備忘録](http://qiita.com/makoto_kw/items/393e098f214f81449c9f)
- [Raspberry Pi開封から無線LAN経由でSSH接続して初期設定するまでのマイ・ウェイ（モニタ・キーボード無し）](http://qiita.com/morizotter/items/48ad0b17207b0dd66cac)
- [『Raspberry Piで遊ぼう! 改訂第3版』最新情報お知らせページ](http://v7.com/raspi3/?page=3)
MySQLクライアントからLock Tablesでテーブルロックするときの注意

MySQLでクライアントからテーブルロックすることで、一時的に更新を防ぎたいという要望がありました。

```sql
LOCK TABLES yourtable
```

このとき、クライアントのセッションが切れないように注意しましょう。
セッションが切れるとテーブルロックも開放されます。
逆にセッションが切れてもロックが残ってしまう仕様だと大きな問題なので。

あまり機会がないと思いますが参考まで。

MySQLリファレンス
[13.3.5 LOCK TABLES および UNLOCK TABLES 構文](https://dev.mysql.com/doc/refman/5.6/ja/lock-tables.html)
mysql基本操作

# mysqlの基本操作
## 概要
- ユーザを作成し，SequelProから接続できるようにする

## 設定

- root ユーザで入る

`mysql -u root -p`

- ユーザを作成

`CREATE USER user IDENTIFIED BY 'password';`

- SequelProから接続したuserに全ての権限を与える

`grant all privileges on *.* to user@'%' identified by 'password' with grant option;`

## sqlの基本操作 参考
http://sasuke.main.jp/mysql.html
ローカルマシンの処理状況をHubotにPOSTしてSlackに流す

TL;DR
==============================
会社でSlackを使っていてbotにGitのPushなどの情報を流しているけど
もっと気軽にローカルマシンの状況をHubotに報告して欲しい！
例えば、時間の掛かるスクリプト処理が終わったタイミングとか！
（ターミナルを沢山開いていると走らせていたスクリプトが終わっていることに気がつくのが遅れたりするので＾＾；）

※ 会社用Slackに流すとヘンに通知が飛ぶので個人用Slackを別途用意してそこに流すと良いかと。
※ CoffeeScriptはよく知らないので下記コードの作法とかオカシイかも。

準備
------------------------------
### Hubot側

前提として
* HubotをHerokuか何かで動かしている。
* Slackに作成したHubotを招待していて連携出来ている。(@名前: pingでPONGが返るとか)

`Hubotのディレクトリ/scripts`配下に適当なファイル(action.coffeeとか)を作ります。

とりあえず今回の仕様は
* http://HubotのWebアドレス/message にPOST
* POSTする内容は、{ "room":"発言する部屋", "message":"発言内容" }
* roomの指定が無ければ #general、messageの指定が無ければ適当なメッセージを指定

```action.coffee
# Herokuに保存しているアドレスもしくはデバッグ用にローカルアドレス
config =
  baseUrl: process.env.HUBOT_HEROKU_KEEPALIVE_URL ? 'http://localhost:8080'

module.exports = (robot) ->

  # send request message
  # http://Hubotのアドレス/message
  robot.router.post '/message', (req, res) ->
    send_message = (room_name, message) ->
       robot.send {room: room_name}, message
       res.end "send #{room_name} #{message}"

    if not req.body
       send_message("general", "何かエラー" )
       return

    room_name = req.body.room ? "general"
    message   = req.body.message ? "何でもなーい"
    send_message(room_name, message)
```

デバッグとしてはブラウザのRESTクライアントプラグイン(chromeなら[Advanced REST client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo)とか)を利用して
ローカルマシンに対してPOSTしてみると良いかも。

### Ruby側

ちゃっちゃと適当に。

```PostHubot.rb
require 'net/http'
require 'uri'

message = "送信するメッセージ"
room    = "general"

Net::HTTP.post_form(URI.parse("http://HubotのWebアドレス/message"),
                    {'room'=>"#{room}", 'message'=>"#{message}"})
```

用意出来たら実行してみてSlackに発言が反映されるかを確認。
上記は思いっきり簡略化していますが、実際には`ARGV`でroomやmessageのパラメータを受け取ったりしてそれを渡す形になります。

後は
------------------------------
開発で使用するスクリプトや、定期実行のタスクとか色々なものをHubotにPOSTしてSlackに連携しましょう。
DisplayLiFiについて

拙作のDisplayLiFiについて書きます。

https://github.com/ikeyasu/DisplayLiFi

LiFi というのは、可視光通信のことです。一般的には、LEDライトで通信をします。
が、これは、ディスプレイの明滅で通信する、というライブラリになります。
例えば、以下のユースケースを考えています。

1. iPhoneのMobile Safariで、特定のウェブサイトに接続
2. Arduino で組んだ回路の受光部をiPhoneに押し当てる
3. 暫く待つと、iPhone にデータが送られる。

これは、送信側に特別な回路が必要なく、スマートフォンのみで使えるのが強みです。
ただし、通信速度は遅いですし、まだ安定した通信はできません。また、当然ながら、一方行通信です。

回路は、以下のとおりで、フォトダイオードをArduinoに繋ぎます。

![alt](https://github.com/ikeyasu/DisplayLiFi/blob/master/hardware/proto1/DisplayLiFi-proto1_schematic.png?raw=true)

フォトダイオード S9648-100
http://akizukidenshi.com/catalog/g/gI-02426/

JavaScriptのプログラムは以下のようなものです。これを見ると、ディスプレイが明滅し、それで文字列を送れます。（[ポケモンショック](https://ja.wikipedia.org/wiki/%E5%85%89%E9%81%8E%E6%95%8F%E6%80%A7%E7%99%BA%E4%BD%9C)を起こさないように気をつけてください。。）

https://github.com/ikeyasu/DisplayLiFi/tree/master/website

今後、安定度を増して、ユースケースを増やしていきたいと思います。
Delegateってなんやねん(iOS App, Swift)

# Delegateってなんやねん(iOS App, Swift)

iOSアプリ作るにあたってまず引っかかるであろうDelegateという概念

委譲とは言うものの自分の思ってるイメージで正しいんやろかーって

わかっているようでわかっていない状況な人が多いと思うので

踏み入った話になる前の基本的な概念イメージをまとめてみました

## 環境
|OS|Version|
|:-----:|:----:|
|Mac OS|Mac OS X Yosemite|
|Xcode|7.1.1|
|Swift|2.1|
|iOS|9.1|

## 基礎用語

|用語|説明|
|:-----------:|:------------:|
|Delegate(デリゲート)|委譲(今回のメイン題材)|
|Segue(セグエ)|画面遷移手法(昔で言うモーダルとかそういうViewControllerの遷移系をまとめたイメージ)|
|Protocol(プロトコル)|要約するとインターフェースのこと|

## 説明

説明の流れとしては

+ 言葉で軽い説明
+ 図で概念イメージ
+ 実装と結びつけ

って感じ

### 軽い説明

任せたいことを定義しておいて委譲する感じ。

このClassには属する処理やねんけど、ここだけは他のClassにやってもらおう。(委譲)

人にやらせるんやから、やらせ方を定義しておかないと(Protocol)

以下はClassAがClassBに雑用を投げるがBには押印の権限が無いので押印処理だけはAに委譲するストーリー

### 図説

![delegate.png](https://qiita-image-store.s3.amazonaws.com/0/103725/df0d7456-bef1-77b9-7907-6d99736cc6d6.png "delegate.png")

### 簡単な実装イメージ

Class A

```ClassA
import UIKit

/**
 * ここが①
 * 押印は俺にはできひんから任せるでー的な(委譲)
 * protocolという形でいわばインターフェースのようなものを定義
 */
@objc protocol BViewControllerDelegate: NSObjectProtocol {
    func push(sign: String)
}

class BViewController: UIViewController {

    
    weak var delegate: BViewControllerDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
    }

    /**
     * ここが④
     * IBActionである必要は無いけど、例えば雑用の中で押印ボタンが押されたようなイメージ
     */
    @IBAction func signButton(sign: String) {
        delegate?.push(sign)
    }
}

```

Class B

```ClassB
import UIKit

class MainViewController: UIViewController, BViewControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /**
     * ここが② (zatsuyouOshitsukeとperformSegueWithIdentifier)
     * セグエで遷移して雑用を任せようとしてるところ
     */
    @IBAction func zatsuyouOshitsuke(sender: AnyObject) {
        performSegueWithIdentifier("segue",sender: nil)
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "segue") {
            let vc: BViewController = segue.destinationViewController as! BViewController
            vc.delegate = self//③の「あ、困ったら俺呼べよ」の部分
        }
    }
    
    /**
     * ここが⑤
     * 押印の仕方をProtocolに則って実装
     */
    func setKey(sign: String){
        print(sign)
    }
}
```
IntentServiceでToastを使うと消えなくなる問題に対処する

# はじめに
`IntentService`を継承したクラスの`onHandleIntent`メソッドの中で`Toast`を表示させたところ、
`Toast`が消えずに、ずっと表示された状態になりました。

アプリを強制終了すると消えるのですが、これでは困るので対処します。

## 原因
`IntentService`が`Toast`を表示した直後に役目を終えたのが原因でした。

つまり`Toast`を表示したUIスレッドが死んでしまったため、`Toast`を消せなくなったようです。

タイミングによっては、[そもそも`Toast`が表示できない](http://jobo-snippets.blogspot.jp/2012/01/intentservicetoast.html)ケースもあるようです。

## 解決策
`Toast`の表示を`Runnable`に投げることによって回避できました。

まずは`Runnable`を実装した`DisplayToast`をこうします。

```java
public class DisplayToast implements Runnable {
  private final Context mContext;
  String mText;

  public DisplayToast(Context mContext, String text){
    this.mContext = mContext;
    mText = text;
  }

  public void run(){
    Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
  }
}
```

`DisplayToast`は`IntentService`から使えます。
これで`Toast`が消える前に`MyService`が死んでも問題ありません。

```java
public class MyService extends IntentService {
  Handler mHandler;

  public MyService(){
    super("MyService");
    mHandler = new Handler();
  }

  @Override
    protected void onHandleIntent(Intent intent) {
      mHandler.post(new DisplayToast(this, "Hello World!"));

    }   
}
```

このソースコードは[stackoverflow](http://stackoverflow.com/revisions/20690225/1)で見つけたJim G.さんによるものです。深く感謝します。
OpenWRT site2site IPsec 要約



site2siteのIPsec接続でハマった点を記載する。
OpenWRT 15.05, x86版をVirtualBoxで確認

#/etc/init.d/ipsec
[IPsec Basics]https://wiki.openwrt.org/doc/howto/vpn.ipsec.basics
から
\#/etc/init.d/ipsec
をコピペして実行すると下記の表示を出してエラーになる。

```
# /etc/init.d/ipsec start
kmod-crypto-aes missing
echo install with  "opkg install kmod-crypto-aes --nodeps"
```

```
# opkg install kmod-crypto-aes --nodeps
```

を実行してもkmod-crypt-aes がインストールされない。


[Changeset 46483]https://dev.openwrt.org/changeset/46483
によるとaesはモジュールではなく、kernel内部に統合されたので、
/etc/init.d/ipsec は下記修正することで動作するようになった。
※要はaesのモジュールのインストール有無を調べないようにした。

```
--- ipsec.old	2015-12-06 22:44:58.777630000 +0900
+++ ipsec	2015-12-06 22:43:32.149651000 +0900
@@ -194,7 +194,7 @@
     exit
   fi
  
-  for f in aes authenc cbc hmac md5 sha1; do
+  for f in authenc cbc hmac md5 sha1; do
     if [ `opkg list kmod-crypto-$f | wc -l` -eq 0 ]; then
       echo kmod-crypto-$f missing
       echo install with  \"opkg install kmod-crypto-$f --nodeps\"

```
#/etc/config/ipsec

[Strongswan IPsec Configuration]https://wiki.openwrt.org/doc/uci/ipsec
の
Example 1 taken from the IPSec site to site howto. には、

```
config 'ipsec'
  option 'zone' 'vpn'

config 'remote' 'acme'
  option 'enabled' '1'
  option 'gateway' '7.7.7.7'
  option 'authentication_method' 'psk'
  option 'pre_shared_key' 'yourpasswordhere'
  list   'p1_proposal' 'pre_g2_aes_sha1'
  list   'sainfo' 'acme_dmz'
  list   'sainfo' 'acme_lan'

config 'p1_proposal' 'pre_g2_aes_sha1'
  option 'encryption_algorithm' 'aes128'
  option 'hash_algorithm' 'sha1'
  option 'dh_group' 'modp1024'

config 'tunnel' 'acme_lan'
  option 'local_subnet' '192.168.2.64/26'
  option 'remote_subnet' '10.1.2.0/24'
  option 'p2_proposal' 'g2_aes_sha1'

config 'p2_proposal' 'g2_aes_sha1'
  option 'pfs_group' 'modp1024'
  option 'encryption_algorithm' 'aes 128'
  option 'authentication_algorithm' 'sha1'

```

の記載があるが、

```
  list   'sainfo' 'acme_dmz'
  list   'sainfo' 'acme_lan'
```

の記載は誤り

```
  list   'tunnel' 'acme_dmz'
  list   'tunnel' 'acme_lan'
```
の様に'sainfo'ではなく'tunnel'を記載すること。

#luci (web設定)
OpenWRTのweb serverに接続した際にブラウザに下記が表示される事がある

```
/usr/lib/lua/luci/dispatcher.lua:255: No valid theme found
stack traceback:
	[C]: in function 'assert'
	/usr/lib/lua/luci/dispatcher.lua:255: in function 'dispatch'
	/usr/lib/lua/luci/dispatcher.lua:168: in function </usr/lib/lua/luci/dispatcher.lua:167>
```

[ #16775 closed defect (fixed) ]https://dev.openwrt.org/ticket/16775
に従って

```
# opkg remove luci
# opkg remove luci-theme-bootstrap
# opkg install luci
```

を実行したら正常にWebブラウザ表示されるようになった。
クラスタのログディレクトリを変更する

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の6日目です。

Cloudera Manager（以下CM）で管理しているクラスタのログは、デフォルトですべて/var/log以下に出力されますが、要件によっては任意のディレクトリに出力したいということもあるでしょう。本ポストでは変更方法について簡単に説明します。

# CDHの各サービスのログ

各サービスの設定画面から「ログ」カテゴリに移動して変更するだけです。これは、CMのService MonitorやHost Monitorといったプロセスでも同様です。

![alt](https://lh3.googleusercontent.com/XFSWCPUKTwlV1-ig3A6fuwDZ_DaryXJUQ01B9zsY8-sZT4j0hNtjQIaysvP59u4xzPf0quQ8RsgtfqvAUC0NXiLlY7dvLBWdS6eDVOda4mAfxv_l8Rs5EKUDysn4ODaYPftQLbDbX-GGd2pJi2olA1JeR1tjLPldJXWYppHRkirvBmAzAK-t4nldQxkIOvnbfNENLEEiuYa3HE32b-RjPWcWgt1G-TWk6i2n2nP-rFOy4XwYNjGVcWuBAXYXQBoF3JauStynsvNDHRuI7XqZvqyWDRLZcznyPPb6sMcOcrmPQ128_0HNIBXLVNy7BK8Ayo3FXM0hpMfeb0gHYgdCNG9wBSe9ggF9hHTM9SZgiD7_YccYRmY4c5komv5vF7fDhtDl252IMtfZgcEDOqYDs94k5zb4IctR1UTIas-TqndrJJ0uhkVxj77wVSDA2DbjKzdyMmBwqjQoUsaHICtxaUGeR5NPauFDv_z0bn-1rk8j7Vz7Wj7IFH7VO2OFbBEwJKDBB709zBKqwXGkDSIVDcRtd60JVW-NjRhNWRA=w844-h667-no)

# CM Server、Agentのログ

CM Serverのログは`/etc/default/cloudera-scm-server`に`export CMF_VAR=/任意の/ディレクトリ`を追加することで変更可能です。ディレクトリのオーナーは`cloudera-scm`、CM Serverの再起動が必要です。

参考:
Managing the Cloudera Manager Server Log
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_ag_view_server_logs.html

一方、CM Agentのログは`/etc/cloudera-scm-agent/config.ini`の`log_file`プロパティの値を変更します。CM Serverと同様、オーナーを`cloudera-scm`に変更してCM Agentの再起動が必要です。

参考:
Managing Cloudera Manager Agent Logs
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_ag_view_agent_logs.html

以上、今日はTips的な話でした。
vvvウイルスをvvvvと略せば良いという訳ではない理由について


#vvvウイルスとは？
ブラウザから感染し、拡張子を.vvvにし、暗号化がかかり、ファイルが開けなくなるウイルス。

#vvvvとは？
ビジュアルプログラミング言語。
メディアアートなどの領域で使用されている。

#vvvとvvvvの似てるところ
・vは小文字
・vが3個か4個か
・Macでは動かない。windowsのみ。
・広めようと布教活動をしてるところ
・生産性が高い
・謎の挙動をするときがある

#vvvウイルスとvvvvの違い
##拡張子
vvv： .vvv
vvvv： .v4p / xml 

##対象
vvv：ブラウザを使用するすべての人
vvvv：メディアアートが好きな人、プログラミング初心者、ビジュアルプログラミング言語に興味がある玄人など

##広がる速度
vvv：2015.12.5に見つかり、あっという間にTwitterのトレンドになるほど。
vvvv：vvvv Japan Communityは2014.11月頃に発足し、少しずつだが、ユーザーが増えつつある。
知名度は、vvvウイルスの方が高そうです...orz


##他者への被害
vvv：多くの方の大切なファイルを感染させ、多大な迷惑をかけている。
vvvv：他者への迷惑はかけていない。プログラミングの全くの初心者が自己表現のために習得するなど、前向きな様子がみられる。

##vvvvユーザーへの風評被害
ユーザー数が少ないからか、特に報告はありません。
TL上では、vvvvへの心配の声が上がるという現象が起こっておりました。


##つまり・・・
__vvvウイルス__と__vvvv__は異なるもので、
__vvvウイルスをvvvvと略して良い訳ではない__です！

百歩譲ってvvvウイルスは、__vvvV__でお願いします！


#vvvvについて知りたい方
日本のvvvvの参考になるもの
・教本 vvvvook 
http://www.bnn.co.jp/books/6211/

・ビデオチュートリアル
https://m.youtube.com/playlist?list=PLqjkdWFcBMk8gVdbGuSqwi4q1ihr7LcaW

・vvvv Japan Community
http://www.vvvv-jp.tumblr.com

・質問疑問は、Twitterへ
ハッシュタグは「#vvvv_jp」で！ 誰かが答えてくれるかも！
AdventCalendarも引き続きご覧ください！


#結びに
今回の騒動で多くの方が被害を被っている様子が見られ、ウイルスによって失ったものも多い方もいらっしゃり、心中お察しいたします。
そんな中、便乗させていただきましたが、
ここ1年のコミュニティの活動で、vvvvを習得し、多くの新しいチャンスや成長を遂げてる人がたくさんいます。
荒れた1日でしたが、魅力あるvvvvが多くの人に知っていただく、きっかけになったら嬉しく思っております。

今日もコミュニティの仲間や心配してくださるユーザーさん、他のメディアート界隈の人がいるので、安心して便乗しました！笑
この一年で日本語でvvvvと呟かれたのが一番多い日だったと思います！

Advent Calendarは、まだまだ続きますが、来年もvvvvJPをよろしくお願いします！
RubyでBoolClassではなくTrueClass/FalseClassな理由を理解する

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/mattn_jp">@mattn_jp</a> BoolClassを入れるとkind_of?でチェックしたくなってduck typingを阻害するから。</p>&mdash; Yukihiro Matsumoto (@yukihiro_matz) <a href="https://twitter.com/yukihiro_matz/status/672714049528856577">2015, 12月 4</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

30回くらい読みなおしたけど何のことを言っているのか分からなかったので、周りのRubyistに質問して理解を深めたメモ。

まずDuck Typingというのは、Wikipediaによると
> ダック・タイピング（duck typing）とは、Smalltalk、Python、Rubyなどのいくつかの動的型付けオブジェクト指向プログラミング言語に特徴的な型付けの作法のことである。それらの言語ではオブジェクト（変数の値）に何ができるかはオブジェクトそのものが決定する。つまり、オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、たとえそのクラスがそのインタフェースを宣言的に実装していなくとも、オブジェクトはそのインタフェースを実行時に実装しているとみなせる、ということである。それはまた、同じインタフェースを実装するオブジェクト同士が、それぞれがどのような継承階層を持っているのかということと無関係に、相互に交換可能であるという意味でもある。

よく聞くこれです。

> "If it walks like a duck and quacks like a duck, it must be a duck"
> もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである

例えばある変数を考えた時、静的型付け言語では変数の型によって、そのオブジェクトがどのようなふるまいを持つのかを定義します。一方でRubyでは、そのオブジェクトが持つふるまいによってどんなオブジェクトであるのかを表現します。

ですので、以下のように書くのはRubyでは推奨されない。

```rb
def hoge x
  raise "boolean class only!" unless x.kind_of?(BoolClass)
  ...
end
```

BoolClassを用意すると、その変数がBoolClassであるかどうかをチェックしてしまいたくなる。

つまりBoolClassとしてではなく、BoolのようなふるまいをするものとしてTrueClass/FalseClassを用意することで、Duck Typingになりやすいように設計されているという理解です。
Nexus 5Xが自宅のWi-Fiに繋がらないときの解決法

【移行のお知らせ】[プライバシー上の懸念](https://blog.qiita.com/about-user-page-renewal-20200326/)により、Qiitaアカウントの削除を検討しています。
各投稿は個人blog( https://gateau.hatenablog.com/archive/category/Qiita )に移行しました。
今後も参照される方は、ブックマークなど移行をお願い致します。

---

# 現象

SIMフリー版Nexus 5Xが、自宅のWi-Fiに接続出来ませんでした。

- ステルスではないのに、ネットワーク一覧に自分のSSIDだけ出てこない。
- 他の機器では接続出来ている。
- MACアドレス制限はしていない。
- 手動で追加しても無反応。

# 原因

Nexus 5でも同じ問題があったそうで、先人の知恵がありました。
[Nexus 5 が Wi-Fi につながらない場合に確認すること](http://programming.kuribo.info/2014/01/nexus-5-wi-fi-problem.html)
[Google NEXUS5が、PR-400KIの無線LAN(WIFI)につながらない - のねの日記 - human brain programing](http://d.hatena.ne.jp/none53/20131125/1385382884)

- 2.4GHz帯では12,13ch辺り **を** 拾わない。
- 5GHz帯ではW52の36，40，44，48ch **しか** 拾わない。

# 解決法
我が家はMZK-MF300Nという無線LANルータを使用してます。
![スクリーンショット 2015-12-06 16.16.04.png](https://qiita-image-store.s3.amazonaws.com/0/36199/25d7c102-a9bc-1946-cd98-485f3967a67a.png)
管理画面を見たところ、チャンネルが「自動」になっていました。
手動で12,13ch以外にしたところ、無事接続出来ました。

# 罠の理由
Nexusに限らず、アメリカのWi-fiチャンネル規制の都合で海外端末は12,13chには制限をかけていることが多いようです。
![スクリーンショット 2015-12-06 21.46.35.png](https://qiita-image-store.s3.amazonaws.com/0/36199/8623c336-ee80-bdb2-e24a-ce0d8f4e1742.png)
[参照：List of WLAN channels](https://en.wikipedia.org/wiki/List_of_WLAN_channels)
Nexus5Xについては情報は見つかりませんでしたが、概ね日本のSIMカードを挿すとこの制限は無くなるようです。
まだSIMを挿してないので、入手したら試してみます。
→追記：日本のSIM (IIJmio) を刺したところ、12,13chにも接続できるようになりました。

Nexus 5Xの情報はまだ少ないので、救われる人がいたらいいなぁ。
mysql5.6 インストール

# mysql5.6のインストール
## 概要
- mysql5.6のインストール
- yum install では5.1(?)だが，utf8bm4に対応していない

## 参考
http://blog.trippyboy.com/2013/mysql/centos-mysql%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E8%A1%8C%E3%81%86%E3%81%AE%E5%B7%BB%E3%80%80%EF%BD%9Emysql_secure_installatio/

http://qiita.com/icche/items/938290c8fce954c58abf

http://runble1.com/centos-mysql-install-setting/
 
## インストール方法
- 下記を実行

`yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm`

`yum install mysql mysql-devel mysql-server mysql-utilities`

- バージョン確認

`mysqld --version`

```
mysqld  Ver 5.6.27 for Linux on x86_64 (MySQL Community Server (GPL))
```

## 初期設定
- デフォルトでONに

`chkconfig --list mysqld`

```
mysqld         	0:off	1:off	2:off	3:off	4:off	5:off	6:off
```

`chkconfig mysqld on`

`chkconfig --list mysqld`

```
mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

- スタート

`service mysqld start`

- 設定

`/usr/bin/mysql_secure_installation`

```
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):　←デフォルトでは設定されていないはずなのでEnter
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y　←rootパスワードを設定
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y　
... Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y　
... Success!

By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y　
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y　
... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
```
- mysql5.6以降の場合

デフォルトで乱数によるパスワードが設定されているらしいので確認
```
sudo cat /root/.mysql_secret
```
Perl6の Context Forcing Operators

こんばんは :whale2: 
[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の、えっと…6日目ですね。


## String context

 例題・Int型の変数に入った123456789を、Str型の変数に代入したい。

```pl:異常系
use v6;

my Str $string;
my Int $integer = 123456789;

$string = $integer; # エラー
                    # Type check failed in assignment to $string; expected Str but got Int
```


こんな時は、`~`を使ってString contextに変換します。

```pl:正常系
use v6;

my Str $string;
my Int $integer = 123456789;

$string = ~$integer; # force string context

$string.perl.say; #=> "123456789"
```

`.perl`は、Perl5でいうところのData::Dumperの親戚です。(ざっくり)
Str型の変数`$string`に文字列`"123456789"`が代入されました。

## Boolean context

Perlの数値型の評価は`0`がFalseで、それ以外がTrueです。
`?`でBool型の変換、`!`で否定ができます。

```pl
use v6;

my Bool $boolean;
my Real $number = 0.0;

$boolean = ?$number;
$boolean.perl.say;      #=> Bool::False

$boolean = !$number;
$boolean.perl.say;      #=> Bool::True
```

文字列の場合は、`''`(空文字)が`False`で、それ以外が`True`でしたよね。

```pl
use v6;

my Bool $boolean;
my Str  $string = '';

$boolean = ?$string;
$boolean.perl.say;      #=> Bool::False

$boolean = !$string;
$boolean.perl.say;      #=> Bool::True
```


## Numeric Context

文字列型から数値型の変換は`+`や`-`で行います。

```pl
use v6;

my Str $string = '1/3';
my Rat $rational;

$rational = +$string;
$rational.perl.say; #=> <1/3>

$rational = -$string;
$rational.say;      #=> -0.333333
```

## 使い所

```pl
use v6;

my $text = 'hoge0123456789';

# 数値以外の文字列で最初にマッチするもの
my $string = ~($text ~~ /\D+/);

# 大文字小文字区別しないで、先頭にHOGEが含まれているかどうか
my $truth  = ?($text ~~ m:ignorecase/^HOGE/);

# 数字が何文字含まれているのか
my $count  = +($text ~~ m:global/\d/);

$string.say; #=> hoge
$truth.say;  #=> True
$count.say;  #=> 10
```

おわりです。

## おわりに

明日のAdvent Calendar執筆してくださる方募集です。
よろしくおねがいします。

## 参考と注釈

* [Perl6::Overview::Operator](http://search.cpan.org/dist/Perl6-Doc-0.36/lib/Perl6/Doc/Overview/Operator.pod)
* [Context Forcing Operators](https://www.safaribooksonline.com/library/view/perl-6-and/059600737X/ch04s02.html#perl6ess2-CHP-4-SECT-2.7)
man zshを読もう

[zshのmanページを読んで解説しようという企画](http://qiita.com/mollifier/items/b8e5b1eb90e0f9307ea4)の第一回目です。manページを読んで大事なところを紹介したり解説したりします。

今回は一番基本のページ、`man zsh(1)`を読みます。ここにはzshの概要とWebサイトや公式ドキュメントの場所などが書かれています。それでは、実際に中を見て行きましょう。

## OVERVIEW(要約)
まずここで、zshのmanページ一覧と、それぞれ何のページなのかが1行で簡単に書かれています。調べたいことがあってどのmanページを読めばよいのか分からなくなったときは、ここを見るとよいです。

## AVAILABILITY(入手場所)
zshのソースコードをダウンロードするためのFTP、ウェブサイトURLが書いてあります。あと、ソースコード リポジトリが紹介されています。リポジトリは[http://sourceforge.net/projects/zsh/](http://sourceforge.net/projects/zsh/)にあって、CVSとGitで管理されています。ここから開発中の最新のコードや過去の履歴を見れます。

## MAILING LISTS
zsh公式のメーリングリストの紹介です。次の3つがあります。

### zsh-announce@zsh.org
リリースや大きな変更についての連絡用

### zsh-users@zsh.org
zshユーザーがお話したり議論したりする場所

### zsh-workers@zsh.org
開発についての議論やバグ報告、パッチを送るためのメーリングリスト

僕もzsh-workersを購読していて、毎日もりもりメールが届いています。

## THE ZSH FAQ(よくある質問と答え)
zshについてのよくある質問とその答えが[http://www.zsh.org/FAQ/](http://www.zsh.org/FAQ/)にあります。ニュースグループやメーリングリストによく届く質問に答えているようです。

## THE ZSH WEB PAGE(ウェブサイト)
[http://www.zsh.org/](http://www.zsh.org/)にzshの公式ウェブサイトがあります。

## THE ZSH USERGUIDE(利用ガイド)
ユーザーガイドは今作成中のようです。ユーザーガイドは解説を付けてmanページを補完して、manページが抽象的、魔術的で読者を煙に巻くような箇所がある(!)問題を解決する予定です(本当か?)。

現時点の版が[http://zsh.sourceforge.net/Guide/](http://zsh.sourceforge.net/Guide/)から読めます。まだ手つかずの章もありますが、例があったりして確かにmanページより分かりやすいです。

## THE ZSH WIKI(wiki)
[http://www.zshwiki.org/](http://www.zshwiki.org/)にzshのwikiサイトがあります。zshユーザーがおすすめの設定や便利なスクリプトなどを書いているようです。

## STARTUP/SHUTDOWN FILES(起動、終了ファイル)
zshを起動、終了したときにどのファイルが読み込まれるかについて書かれています。わりと大事な章です。

### 起動したとき

zshを起動したときは以下の順番でファイルが読み込まれます。

|順番|ファイル名|条件|
|:---|:---------|:---|
|1   |/etc/zshenv        |すべて|
|2   |$ZDOTDIR/.zshenv   |すべて|
|3   |/etc/zprofile      |ログインシェル|
|4   |$ZDOTDIR/.zprofile |ログインシェル|
|5   |/etc/zshrc         |ログインシェルまたはインタラクティブシェル|
|6   |$ZDOTDIR/.zshrc    |ログインシェルまたはインタラクティブシェル|
|7   |/etc/zlogin        |ログインシェル|
|8   |$ZDOTDIR/.zlogin   |ログインシェル|

一部のファイルは設定によって読み込まないようにもできます。`$ZDOTDIR`が設定されていないときは代わりに`$HOME`が使われます。

### 終了したとき

zshを終了したときは以下の順番でファイルが読み込まれます。

|順番|ファイル名|条件|
|:---|:---------|:---|
|1   |/etc/zlogout      |ログインシェルを終了した|
|2   |$ZDOTDIR/.zlogout |ログインシェルを終了した|

## 最後に
今回はman zshを読みました。参考になる外部のドキュメントが紹介されているので、いろんな資料を読んで自分で調べてみたいという人はこのページを参考にすると良いと思います!
Linux標準教科書読んでみた


http://www.lpi.or.jp/linuxtext/text.shtml

# 1章

## UNIXの誕生

+ AT&T研究所でThomson氏が開発
+ MULTICS研究がなされていたため、その機能が取り入れられている
+ UNIXの利用はAT&T研究所とライセンス契約を結び必要がある
+ Linuxはライセンス契約を結んでいないUNIX互換OSとなる
+ Linus Torvalsが開発しはじめる
+ Licenceに特徴がある(General Public Licence)
	+ プログラム実行
	+ ソースの改変
	+ 配布•再利用
	+ 改良したプログラムの再利用
	+ GPLをベースとしたソースは公開する場合、要求された際はソースを公開する必要がある

## Linuxの特徴
### カーネル
+ オペレーションシステムの中核：ハードウェアとやりとりする

### ユーザランド
+ ファイルシステム、ファイル操作コマンド,シェルなどの基本的なソフトウェア群をユーザランドという

### Linuxを使う
+ 基本的にはコマンドラインから使用する
+ XWindow SystemとGnome,KDE等を使うとGUIも使えるようになる

### シェル
+ コマンドを受け付ける + シェルスクリプトを実行する

### ディストリビューション
+ 様々な団体がインストール手順などを独自に改良したものを提供し始める==> ディストリビューション
+ 代表的なものとして、Red Hat Debian Project Ubuntu

### パッケージとパッケージマネジャー
+ パッケージ：Linuxに対して追加機能を提供するもの
+ パッケージマネジャー：パッケージのインストールやアップデートを簡単にするもの。
	+ 依存関係なども解決してくれる
	+ ディストリビューションには付属している

### 章末

# 2章 Linuxのインストール

# 3章 コマンド操作
## ファイル操作
### ファイルやディレクトリの参照
+ ls(LiSt)コマンド
書式

```
ls [オプション][ディレクトリ]
```

-lオプション long形式での出力

```
ls -lt
```

-tオプション 時間順でソート

```
ls -t
```
Electron x WebSpeechAPIで遊んでみた話



## はじめに

ちょっと前のElectronで作る最強のエディタ戦争やってた時に「音声認識できる議事録用エディタとかできないかなー」とか考えたので、ElectronでもWebSpeechAPIが使えるか試してみました。

## リポジトリ

今回のサンプルコードはこちら
https://github.com/itkrt2y/sample_web_speech_api_in_electron

一部実験的な構成で遊んでたのを流用して書いたので、参考にならないかも・・・

## 音声認識：SpeechRecognition

### 仕様書

公式仕様書はこちら
https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html

以下のように書かれており、Web標準ではないらしいです。

"This specification was published by the Speech API Community Group. It is not a W3C Standard nor is it on the W3C Standards Track."

### サンプルコード

とりあえず以下のように書いてみた。
ES6 + Reactという、純粋にWebSpeechAPIの話をしたいだけならいらない要素も盛り込まれてますが、ご了承を

```javascript:sample.js
import React, { Component } from 'react';

export default class Main extends Component {
  constructor(props) {
    super(props);
    this.recognition = this.initializeSpeechRecognition();
  }

  initializeSpeechRecognition() {
    // 音声入力オブジェクト生成
    let recognition = new webkitSpeechRecognition();

	// 日本語に設定
    recognition.lang = 'ja';

	// 音声認識完了時の処理を登録
    recognition.onresult = (event) => {
      // 音声認識内容をコンソールに表示
      console.log(event.results[0][0].transcript)
    }

    return recognition;
  }

  record() {
  	// 音声認識開始
    this.recognition.start();
  }

  render() {
    return(
      <div className="main">
        <h1>Web Speech API</h1>
        <div>
          <button onClick={ () => this.record() }>Record</button>
        </div>
      </div>
    );
  }
}

```

### 動かしてみた

「あいうえお」って言ってみました

![speech_recognition.gif](https://qiita-image-store.s3.amazonaws.com/0/15402/26295dba-db11-3086-f7bf-164574d431db.gif "speech_recognition.gif")


普通にできました（まあ、ただのChromeなんだからそりゃそうか）

## 音声出力：SpeechSynthesis

「Electronで音声認識できるか？」という目的は果たしましたが、せっかくなので喋らせる方もやってみました。

### サンプルコード

以下のようにすれば喋ってくれます。
ブラウザのコンソールに貼り付けても動くので、興味ある方はどうぞ

```javascript:sample.js
speechSynthesis.speak(new SpeechSynthesisUtterance('Hello World'));
```

さすがに決め打ちの文言では寂しいので、フォーム入力した内容を喋るコードも書いてみました

```javascript:sample.js
import React, { Component } from 'react';

export default class Main extends Component {
  speech() {
    speechSynthesis.speak(
      new SpeechSynthesisUtterance(this.refs.speech.value)
    );
  }

  render() {
    return(
      <div className="main">
        <h1>Web Speech API</h1>

        <div>
          <button onClick={ () => this.speech() }>Speech</button>
          <input type="text" ref="speech"/>
        </div>
      </div>
    );
  }
}

```

これも普通に動きます。思ったより簡単でした。

## まとめ

Electronでも特に難なく音声認識・出力できました。
正直実用に耐えるようなものではありませんが、もっと発展した時に何がしかに利用できたらいいですね

（途中にElectron固有のコードを載せなかったから、全くElectronと関係ない記事になってしまった・・・）

## おまけ

Electronの日本コミュニティの入り口わかりにくい気がしてるので貼っておきます
https://electron-jp-slackin.herokuapp.com
4.0.0でも三点リーダーを表示させたい


androidのlayoutにおいて、文章がとても長いとき

```
elliprize="end
```

をつけるとうまく三点リーダーで文章を省略してくれる。

のですが、4.0.0だと三点リーダーが表示されないところがあるようです。
4.0.0自体が三点リーダーに対応していないわけではなく、

どうやら


```
maxlines="1"
```

こちらが設定されていると表示されない。


```
singleline="true"
```

こちらが設定されていると表示される模様。。。
El CapitanにアップデートしてCocoaPodsがインストールできない

# El CaptianにあげてCocoaPodsが入れられなかった
El CapitanにあげてからCocoaPodsをインストールしようと思ったら
> $ sudo gem install cocoapods
Password:
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /usr/bin/pod

　特に今リリースしているアプリでライブラリを使用していなかったので、放置していたのですが、新しいアプリにどうしても使いたいライブラリがあり、インストールを試みました

# 原因はrootless
これでした
http://applech2.com/archives/45140708.html

つまりはroot権限でも下記等一部のディレクトリへのアクセスに制限があるとのこと

- /usr
- /sbin
- /System

なので/usr/bin/podにインストールしようとしているから怒られると

# 解決するには
上記のリンク内にある通り下記コマンドを実行する
> sudo nvram boot-args=“rootless=0”

ただこれやると新しいセキュリティ機能をまるっと外すことになるので、あまり良いとは思えないので、今回は下記を行いました。

> sudo gem install -n /usr/local/bin cocoa pods

アクセス制限あるならインストールフォルダ変えれば対処できるので、今回は上記で対応しました
vagrant up でのエラーへの対処

# vagrant up で発生したエラーへの対処
(原因などは分かっていない)
## 概要
- vagrant up 時に発生した以下のエラーへの対処法

```エラーメッセージ
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```
## 参考
http://qiita.com/a-suenami/items/3b04151ce6e7d5b72a3e

## 方法
- ssh で入る

`vagrant ssh`

- 下記を実行

`sudo /etc/init.d/vboxadd setup`

- 下記メッセージ

```エラーメッセージ
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-431.3.1.el6.x86_64

Building the main Guest Additions module                   [FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
```

- 下記を実行

`sudo yum install http://vault.centos.org/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm`

## エラーは消えたが理由はいまいち分からない．．．
XSことはじめ



最近はMinillaでXSモジュールの雛形をつくることができます。

```bash
minil new -p XS Acme::MyModuele
```

すると、こんな感じのPerlコードと、

```pl
package Acme::MyModuele;
use 5.008001;
use strict;
use warnings;

our $VERSION = "0.01";

use XSLoader;
XSLoader::load(__PACKAGE__, $VERSION);

1;
```

こんな感じのXSコードが生成されます。

```c
#ifdef __cplusplus
extern "C" {
#endif

#define PERL_NO_GET_CONTEXT /* we want efficiency */
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>

#ifdef __cplusplus
} /* extern "C" */
#endif

#define NEED_newSVpvn_flags
#include "ppport.h"

MODULE = Acme::MyModuele    PACKAGE = Acme::MyModuele

PROTOTYPES: DISABLE

void
hello()
CODE:
{
    ST(0) = newSVpvs_flags("Hello, world!", SVs_TEMP);
}
```

XSはCをベースに独自のマクロを持った言語です。
上のコードでいうところの、 `MODULE` 、 `PACKAGE` 、 `CODE:` などがそれに当たります。
詳しくは、 [perlxs](http://perldoc.jp/docs/perl/5.20.1/perlxs.pod) のドキュメントを読むといいでしょう。

XSの世界で定義したC関数（のように見えるモノ）はXSUBという特殊なC関数に変換され、Perlの世界から呼び出せるようになります。（普通のC関数ではなくなるため、`hello()` という名前でもなくなります。）
上のコードで言うならば、 `void hello()` はXSUBですが `MODULE` と `PACKAGE` より前の行に定義したC関数は普通のC関数になります。

なお、XSの関数はXSUBという特殊なC関数になるわけですが、中のコードは普通のCコードです。PerlのC APIを呼び出すことでPerlのデータ構造に対する操作を行う事ができます。
PerlのC APIは `EXTERN.h` や `perl.h` などで定義されているのでそれがつかえます。
PerlのAPIについては[perlapi] (http://perldoc.jp/docs/perl/5.12.1/perlapi.pod)や[perlguts] (http://perldoc.jp/docs/perl/5.20.1/perlguts.pod)を見るといいです。

また、Perlも歴史を経て新しいバージョンと古いバージョンでC APIのインターフェースが変わっている事があります。
それを吸収してくれるマクロが `ppport.h` です。 
[Devel::PPPort](https://metacpan.org/pod/Devel::PPPort)としてCPANに上がっています。
Minillaを使うと基本的に自動生成してくれるようになっています。
また、[XSUtilを使ってこういう具合に指定しておくと](https://github.com/karupanerura/Geo-Hex-V3-XS/blob/master/minil.toml#L12)各ビルド環境で生成するようにもできます。

Perlのデータ構造も普通のC構造体として定義されているので、普通のCコードから操作することができます。
そのため、Perlに対してAPIを提供する部分はXSUBで、単体として独立可能なコードは普通のCで書くのが個人的には良い書き方だと思います。

# まとめ

XSこわくない！
[CによるPerl拡張入門(α)](http://xsubtut.github.io/)がとても良いので読みましょう。

明日は @songmu さんです！
スプレッドシートでCSV吐き出して小さなDBのテストデータを作ると結構楽だった

テーブル10コぐらいの小さなWebアプリとかを作るとき、そういえばExcelで作って読み込めないかとおもったら、意外と簡単にできたのでメモ。

MySQLでaplicationっていうdb作ってやります。

## テーブル

例えば以下の様なテーブル。

```
create table if not exists users (
    id serial not null primary key,
    email varchar(255) not null,
    name varchar(255) not null,
    password varchar(255) not null,
    created datetime not null default now()
) engine=innodb;
```

## CSV

こんなCSVをエクセルで作ります。
エクセルなら一瞬でできます。

```csv:users.csv
1,test1@example1.com,testname1,password1
2,test2@example2.com,testname2,password2
3,test3@example3.com,testname3,password3
4,test4@example4.com,testname4,password4
```

（passwordはふつうhashですよね）

## insert

```
$ mysql -u root application --local-infile=1
mysql > load data local infile './users.csv' into table users fields terminated by ','
```

`--local-infile=1`がポイント。
これでcsvからデータを読み込めます。

以下の様な、ぶっ壊して作りなおすシェルスクリプトを作っておくと便利で楽しいです。

```bash
#!/bin/bash

mysql -u root --execute="drop database application"
mysql -u root --execute="source schema.sql"


mysql -u root --local-infile=1 application --execute="\
    load data local infile './users.csv' into table users fields terminated by ','
"
```
リーダブルコードで改めて今すぐ気をつけれること


一回は読んだことがあったのだが、新人として業務をこなしていく中で、改めて読むように言われたので二回目読んだときになるほど、と思ったことをメモ。


# 命名規則
* 数値の変数名には単位の情報を含める

```
 delay_secs
 size_mb
 max_kbps
 degrees_cw
```

* 限界値

```
  min max
```


* 範囲

```
  first last  
```

* 包含・排他的範囲

```
begin end
```

* bool値
is,has,can,shouldを接頭辞につけることが多い

  
# コメント
* 質問されそうなところを書く 
* ハマりそうな罠をかいておく
* コードからすぐに抽出できることは書かない（新情報を書くようにする）


# 制御フロー
* 条件式の引数の並び方
```「調査対象」の式。変化する  [条件式] 「比較対象」の式。変化しない```

```example
if(調査対象 < 比較対象)

```


* ネストを浅くする
ネストを浅くするには、早めに失敗ケースをかいて関数から返す。
* 複雑なロジックを書かないためにド・モルガンの法則などを利用する。
そうじゃない部分を実装することで満たせないか？考え方を変えてみる


# コードの再構成
* 関数の中でも同じ種類のタスクはまとめて処置をするようにする。ちらばってると重複もあるし、読みづらい。（countupがあれば、すべての種類のcountupはまとめて書く）


他にもいろいろあるだろうけど、知識として抜けていた部分をメモ。
あとは知っていてもできていない、適用できていない部分が多い気がする。
PHP7で変わる例外処理について


PHPにおける例外処理はPHP5からでPHP4以前には実装されていませんでした。
その頃は自前で対処するしかなく予想外の動作に対応しきれないなどありましたが、TryCatchブロックの実装により改善されつつあります。
しかし、捕捉できないエラーがあるといった問題がまだ残っていました。
今回のPHP7では、そういった問題への対処も行われるようなので、どのように改善されるのか調べてみました。

##既存のエラー種別
エラー種別としては以下。
[こちら](http://php.net/manual/ja/errorfunc.constants.php)だと日本語なので分かりやすいです。

```
// Fatal errors
E_ERROR
E_CORE_ERROR
E_COMPILE_ERROR
E_USER_ERROR

// Recoverable fatal errors
E_RECOVERABLE_ERROR
// Parse error
E_PARSE

// Warnings
E_WARNING
E_CORE_WARNING
E_COMPILE_WARNING
E_USER_WARNING

// Notices etc.
E_DEPRECATED
E_USER_DEPRECATED
E_NOTICE
E_USER_NOTICE
E_STRICT
```

###課題①
上記にある４つのFatal errorsに関してはTryCatchで捕捉できません。直ぐにスクリプト修了処理が走ってしまうためです。
これについては`register_shutdown_function`関数を使うというのが解決法です。

```
register_shutdown_function(function() { var_dump(error_get_last()); });
 
$null = null;
$null->foo();
 
// shutdown function output:
array(4) {
  ["type"]=> int(1)
  ["message"]=> string(47) "Call to a member function foo() on a non-object"
  ["file"]=> ...
  ["line"]=> ...
}
```
しかし、これではfinallyブロックが使えません。
リソースの解放処理など必ず実行したい処理に対応できないという問題があります。

###課題②
Classの__destructも同様に実行されない場合があるため、ロックされたままのリソースが発生してしまいます。

```
class LockManager {
    private $lock;
    public function __construct(Lock $lock) {
        $this->lock = $lock;
        $this->lock->acquire();
    }
    public function __destruct() {
        $this->lock->release();
    }
}
 
function test($lock) {
    $manager = new LockManager($lock); // acquire lock
 
    doSomething();
 
    // automatically release lock via dtor
}
```
この場合なら`doSomething()`でFatalErrorが発生した場合に起こります。

##新たなエラークラス
このような問題を解決するために、PHP7からは```Error```クラスが実装されました。
http://php.net/manual/ja/class.error.php
`Exception`クラスは継承していないとのことなので、こんな感じで使ってみました。

```
try {
    call_method(null); // oops!
} catch (Exception $ex) {
    echo "Exceptionをキャッチ: {$ex->getMessage()}\n";
} catch (Error $er) {
    echo "Errorをキャッチ: {$er->getMessage()}\n";
} finally {
    echo "finally!!\n";
}
```
結果は

```
Errorをキャッチ: Call to undefined function call_method()
finally!!
```
という感じで無事に捕捉できました！

##まとめ
前置きばかりながくなりましたが、以上が例外処理に関して分かったことです。
PHP7へ移行する際に例外処理の範囲を広げるには`catch (Error $er){}`といったブロックを追加していく必要がありそうです。
ただこれによってエラーへの対処方法がやりやすくなりそうですね。
全てのFatalErrorについて確認していないため、どの程度がカバーできるのか分からないので今後も色々調べてみたいと思います。

###謝罪
AdventCalendarの投稿、遅れてしまい申し訳ありませんでした。