OmniAICreator/Qiita-1.07M huggingface dataset:
デフォルトでincludeする関連を指定する[Specify Default Included Resource(s)]

[issue](https://github.com/cerebris/jsonapi-resources/issues/251)によると今後サポートされそうだが、今から使いたいと思うのでやり方を記しておきます。

# 簡単な流れ

jsonapi-resourcesの作りでは `acts_as_resource_controller` をincludeしたコントローラーは `append_before_filter` で `setup_request` を差し込みます。
`setup_request` でparamsなどの情報を集めてリクエストを解釈する準備をして、その後の `process_request_operation` で利用しています。

jsonapi-resourceにおいて関連モデルを一緒に取得したいときはクエリパラメタ `include` にカンマ区切りでモデル名を書いていきます。

# つまり

`setup_request` をオーバーライドして `params` をいじってやればいいわけです。

```rb
class MyController < ApplicationController
  include JSONAPI::ActsAsResourceController

  def setup_request
    params['include'] = 'user,commentable' unless params['include']
    super
  end
end

```

# どういうときに役立つのか

`ember/data` と併用しているときに `mode.get('relationships')` するときに発生する通信にクエリパラメタが付与できないので、これでどうにかできる。

---

# Resourceで宣言したい

api/v1/hoge_resource.rb

```rb
class Api::V1::HogeResource < JSONAPI::Resource
  def self.default_included
    %(saba miso ni)
  end
end
```

api/v1/base_controller.rb

```rb

def setup_request
  resource_name = params[:controller].split('/').map(&:classify).tap { |names|
    names[-1] += 'Resource'
  }.join('::')
  resource = Object.const_get(resource_name)

  if resource.respond_to?(:default_inclusions)
    splitted = (params[:include] || '').split(',')
    splitted.concat(resource.default_included)
    params[:include] = splitted.join(',')
  end
  super
end

```
Redmineを活用するためのtips

一人で案件を回すことになったため、RedmineとGitHub周りの機能を試しながら使い倒して気づいたことのメモ。（他のプロジェクトであまりRedmineが活用されていなくて、ただひとりのヘビーユーザになってしまった...）

## 1.バージョンを切ろう
どんな仕事にも〆切があるはず。なくても暫定の〆切をつくって、そこまでの作業をバージョンして区切れば、そのときまでやるべきことがはっきりする。

## 2.タスクが見えたらチケット化しよう
作業・タスクはどんどんチケットにする。やるべきこと、やったことが見える化される。見える化されてないものがたくさんあると、何で時間がかかっているのか、問題があるのかわからなくなってしまう。

## 3. チケットに担当者を割り当てる
どのタスクが、誰がボールを握っているのかをはっきりする。野球の「お見合い」みたいなことでタスクをとりこぼすことを防げる。個々人の負荷や進捗率も見える化される。

## 4. チケットの予定終了日をいれる
暫定でもいいので、終了日をいれよう。進捗の遅れなどの問題を発見する足がかりになる。

## 5.予定工数をいれよう
ざっくりでもいいので、工数を見積もっていれよう。予実管理ができるようになる。

## 6.作業時間をいれよう
かかった時間はいれる。見積もりとの差異が見えるようになる。負荷になっていないか、ボトルネックになっていないかを気づくきっかけにもなる。

#### 時間計測をするサービス

Redmineのプラグインにも同様のものがある。
作業自体に集中するには、こういうのを使うと便利。

* [toggle](https://www.toggl.com) 

## 7.タスクをまとめるチケットをつくろう(親子チケット)
大きなタスクを扱うチケットも必要になる。その場合は、サブタスクをその子チケットとして登録する。自動で、子チケットの進捗の総和が、親チケットの進捗率となる。サブタスクに分割にすることによって、作業内容がわかりやすくなるし、分担もしやすくなる。

## 8.チケットを終了するルールを決めよう
なあなあでチケットを終わらせないと、今やるべきことが埋もれてしまう。関係者と相談して、終わらせるルールを事前でも途中でもいいから、決める。チケットごとに関係者と終了してよいかも随時やりとりして、都度終了させていく。

## 9.チケットを見直してちゃんと終了させよう
バージョンの終了日前後で見直して、残っているチケットを終了させていくか、次に持ち越すかに振り分けていく。今のバージョンのすべきことが消化しきるようにする。

## 10.ひとつのチケットではひとつの話題のみ
例えば、テストの実行とテスト仕様書の修正をひとつのチケットでやりとりすると、扱う量も多くなるし、違う話題が混ざってとりこぼしが起きやすい。やたらやりとりが多いお化けチケット、God object的なチケットになってしまう。

タスクの切り分けを習慣づけるためにも、違う話題と感じたら、別チケットに切り出してそちらに議論を移す。

## 11.コミット（リビジョン）とチケットは関連づけよう
GitHubとRedmineを連携させ、コミットメッセージにはチケット番号を必ずつける。
そうすれば、改修・実装漏れが起きにくくなり、ソースの意図がチケットから読み取れるようになる。

## 12.設計や仕様はwikiで共有しよう
wordなどにまとめるよりも、差分を追えるRedmineのwikiに書く方が、変更がおきても対応しやすく、その経過をおいやすい。

## 13.進捗管理など、間接業務の時間をいれるチケットを用意
開発そのものでない作業や、細切れの曖昧な作業につけるためのチケットを用意しておくと、開発作業にかかる時間とそれ以外を区別できるようになる。

### 参考サイト

#### アンチパターン

http://www.slideshare.net/hidehisamatsutani/redmine10

http://www.slideshare.net/akipii.oga/redminefaq

http://dqn.sakusakutto.jp/2011/07/post-45.html

http://forza.cocolog-nifty.com/blog/2011/07/wftidd-tidd-0ba.html

http://sakaba.cocolog-nifty.com/sakaba/2014/02/tidd-56b5.html

#### 活用事例など

http://slides.redmine.jp/slides/case/

http://blog.yuyat.jp/archives/1202

http://www.slideshare.net/g_maeda/redminerxtstudy-201503

http://www.slideshare.net/akipii.oga/sea-west-ogawa201309open

http://daipresents.com/2011/redmine%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A9%A6%E8%A1%8C%E9%8C%AF%E8%AA%A4%E3%81%97%E3%81%9F10%E3%81%AE%E3%81%93%E3%81%A8/
Macはサーバになりますか？

素朴な疑問です。

サーバーって僕達が使ってるコンピュータのことですか？
手元のMacをサーバーにしてデータベース置くこと出来ますか？
手元のMacのデータベースに外部アプリなどからアクセスは出来ますか？

ネットワーク初心者です。このような素朴な疑問を解決するような，
勉強はどのように行えば良いのでしょうか？
GitHub Issues の Search Syntax を使いこなして必要な情報にフォーカスする

GitHub を中心に日々の開発を行うようになったので、いかに GitHub を使いこなすか、について考え中です。
GitHub をよりよく使うためのツールや SaaS はいろいろとあるし、API もいろいろ提供されているのでそれで何か作ることも考えましたが、検索機能が思いの外便利で、とりあえずはこれだけでもかなりよくなりました。

# 前提条件

* 開発は GitHub 上で行われている
    * 多分 GitHub Enterprise 上でもできるけど使ったことないのでわからない
    * 両方併用している場合は一元管理できないので若干辛いかもしれない
* リポジトリは単一の Organization に集約されている
    * フリーランスの方など、複数の Organization にまたがっている場合は難しいかも
* リポジトリは Public でも Private でも問題なし

# できたもの

以下は Organization が hogehoge-co でユーザ ID が yuya-takeyama であるという前提です。

## 自分が関わっている Issue 一覧

なんらかの形で自分が関わっている Issue を更新日時順に一覧化します。
Close 済みのものは除外されます。
各 Issue に対して適切な行動・コメント等を行い、Close に向かうことに集中するためのリストです。

「自分が関わっている」というのは以下のいずれかに当てはまるものです。

* 自分が作成した
* 自分が assign されている
* 自分の ID が言及されている
* 自分がコメントを書いている

`is:open is:issue involves:yuya-takeyama user:hogehoge-co -repo:hogehoge-co/nippoh sort:updated-desc`
https://github.com/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+involves%3Ayuya-takeyama+user%3Ahogehoge-co+-repo%3Ahogehoge-co%2Fnippoh+sort%3Aupdated-desc

|クエリ|説明|
|-----|----|
|is:open|状態が open であること。既にクローズされているものは必死に追う必要はないので見ない|
|is:issue|Pull Request は除外して Issue だけに絞り込む。Pull Request は全く別の条件で一覧化したいので除外する|
|involves:yuya-takeyama|自信を巻き込んでる Issue だけに絞り込む|
|user:hogehoge-co|User または Organization が hogehoge-co のリポジトリの Issue だけに絞り込む|
|-repo:hogehoge-co/nippoh|日報を書くのに使っているリポジトリの Issue は除外する|
|sort:updated-desc|更新日時で降順にソートする|

クエリの戦闘に `-` (ハイフン) をつけると否定条件になるのも便利ですね。

## 自分が assign されている Issue 一覧

「自分が関わっている Issue」はちょっと言及されたとかちょっとコメントでチャチャ入れした程度のものも含まれるので、対象が少し多くなります。
明確に自分が assign されているものであれば、そちらの方が優先度は高いはずなので、その一覧も作ります。

`is:open is:issue assignee:yuya-takeyama user:hogehoge-co sort:updated-desc`
https://github.com/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+assignee%3Ayuya-takeyama+user%3Ahogehoge-co+sort%3Aupdated-desc

|クエリ|説明|
|-----|----|
|assignee:yuya-takeyama|自分が assign されているものだけに絞り込む|
osx で gem mysql2 のインストールに失敗する際の解消方法


#注意

**自分は以下の方法でインストールが成功するようになったという記事です**

**場合によってはDBなどに問題が発生する可能性があります**

**非常に無責任な記事なので、問題がある場合はコメントで指摘をいただけたらと思います。**

**本記事を参考に操作を行い問題が発生したとしても自己責任でお願い致します**

#記事の対象読者

* osxでhomebrewを使っている方
* brewコマンドでmysqlを入れた方
* gem の mysql2 が上手くインストール出来ない方

#エラーメッセージ抜粋

```
Installing mysql2 0.4.1 with native extensions                                                                                                                                                           

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```

#解決方法

## 環境の確認

brew でインストールしたmysqlをバージョンアップにより複数存在させていないか以下で確認する

```
ls /usr/local/Cellar/mysql
```

## 複数存在しない場合

今回の記事の対象者ではないので、別の記事を参照してください。


##複数バージョン存在していた場合

以下のコマンドでmysqlを最新にアップデートし、複数バージョン存在するmysqlを1つにするのが問題の解決方法です。

**以下の点に注意してください**

* **現在使っているmysqlのバージョンを上げてしまいます**
* **現在使っているDBのデータはアップデート後もおそらく使えますが、使えなくなる可能性もあると思います。**

以上の点を踏まえたうえで、問題ない方は以下を叩いてください。

```
brew upgrade mysql # mysqlを最新版にする
# 最新版にしておかないと警告が出る
# Warning: Skipping mysql: most recent version 5.6.XX not installeda
brew cleanup mysql # 古いのを消す
```
(怖いもの知らずの方は)mysqlをアップデートせずに強引に```rm -rf```をしても良いのかもしれないが、怖いので```brew cleanup```を使う。

もしくはosxを開発環境として使わず、VMを立てて開発しましょう。

# 補足

## 筆者の環境

* OSX 10.10.5
* brew でインストールした mysqlを利用している
* rbenv を利用した ruby 2.2.3

## 筆者の環境での問題発生

```
rails new project -d msqyl
```

以上を叩いた際に[エラー](#エラーメッセージ抜粋)が出て```mysql2```がインストール出来なかった

##問題点

```rails new```の際に、```bundle install```が実行され、つまり```gem install mysql2```がエラーになるという話。

##調査

ググるとインストールされているmysqlの設定がおかしい！と言うのが出てくる。

なんとなくしっくりこない。

調査中にbrewでインストルしたmysqlが複数バージョン存在しているのに気づき、それが原因ではないかと疑った。

##mysqlが複数バージョン存在している理由

以前、何も考えずに```brew upgrade```を叩いた影響だと推測できる。

```brew upgrade``` は前のバージョンを残しつつ、いい感じにアップデートしてくれるみたいなので気付かなかった。

(無意識の内にバージョンが上がっていたので、ほんとうに「いい感じ」なのかは保証しかねます。)

##なぜmysqlが複数存在するのが問題だったのか?

未調査なので、もし分かる方がいたら編集リクエストをいただけたらと思います。
Haskellでフィボナッチ数列、究極

```hs:
fibs@(_ : tfibs) = 0 : 1 : zipWith (+) fibs tfibs
```

構文的な美しさではこれが究極かと思う。しかし意味論的にはすこし美しくない部分がある。

```hs:
fibs, tfibs :: Integral n => [n]
```

のようにはできない。

```hs:
fibs :: Integral n => [n]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
```

ならできる。しかし、この場合、キャッシュが効かなくなるのでO(2^n)となる。

型が一般的なほうが意味論的には美しいのだがメモ化されなくなってしまう。学問的にはどうなっているのだろう。コンパイルの段階でどうにかできそうな気がするが何か問題があるのだろうか。

「フィボナッチ数列の全体」ではなく「フィボナッチ数列のn番目」を求めるにはO(log n)のアルゴリズムがある(SICPより)。そっちの説明もあとで書こう。
Kafka Consumer for Fluentd


[treasure-data/kafka-fluentd-consumer](https://github.com/treasure-data/kafka-fluentd-consumer)

[Kafka](http://kafka.apache.org/)からデータを取り出して[Fluentd](fluentd.org)に転送するJava実装のKafka Consumerを書きました．基本的なことはREADMEに書いてるんですが，一応日本語でも書いておきます．

## 背景

1トピック1パーティションであれば，すでに公開されている[fluent-plugin-kafka](https://github.com/htgc/fluent-plugin-kafka)が使えます．ですが，複数トピックだったりをConsumer Groupを使って処理しようとすると，現状fluent-plugin-kafkaが依存しているPoseidonに機能がたりないという問題があります(output側は問題ありません)．

海外だとデータ量が多い会社も多く，それに伴いKafkaを使っている会社が少しずつ増えてます．その影響もあり，FluentdとKafkaを連携させたいという要望がちょくちょく出てきたので，Java実装のConsumerを作ったという流れになります．
これで，Fluentdの色々なプラグインも再利用できるようになります．

## 実装

Kafkaが提供している[High Level Consumer API](http://kafka.apache.org/documentation.html#highlevelconsumerapi)を使っています．現在リリースしているv0.1.0だと以下の機能があります．

- Kafkaに入っているJSONのイベントをFluentdに転送
  - tagは固定と，`prefix + topic`の二つを指定可能
- 複数トピックをJavaの正規表現を使って指定可能
- ログはlog4jを利用

みたいな感じで基本的なConsumer実装になります．fluentdにforwardプロトコルを使って転送するので，fluentd側に`in_forward`の設定が必要です．

## 使い方

ビルドはgradleを使っているのでソースを落として来てビルドするか，githubの[リリースページ](https://github.com/treasure-data/kafka-fluentd-consumer/releases)でjarも配布しているので，それをダウンロードします．その後は，javaでjarを指定し，第一引数にpropertiesの設定ファイルを渡すだけです．
設定ファイルのサンプルはリポジトリの[configディレクトリにある](https://github.com/treasure-data/kafka-fluentd-consumer/tree/master/config)ので，これを利用すると早いです．

```sh
$ java -Dlog4j.configuration=file://path/to/log4j.properties -jar build/libs/kafka-fluentd-consumer-0.1.0-all.jar /path/to/fluentd-consumer.properties
```

あるユーザさんは`in_exec`を使ってfluentdから呼び出してるようです．

```sh
<source>
  @type forward
</source>
<source>
  @type exec
  tag dummy
  command java -Dlog4j.configuration=file:///path/to/log4j.properties -jar /path/to/kafka-fluentd-consumer-0.1.0-all.jar /path/to/fluentd-consumer.properties
  format json
</source>
<match kafka.**>
  @type stdout
</match>
```

## まとめ

もしKafkaを使っているのであれば，是非試してフィードバックを貰えればなぁという感じです．いくつかのTODOは[READMEに書いてます](https://github.com/treasure-data/kafka-fluentd-consumer#todo)が，これらはおいおい実装します．あと，今はTreasure Dataリポジトリの下にありますが，別にTD向けの機能とかないので，いずれfluentに移す予定です．

あと，久しぶりにJavaとか書いたので「こう書いた方がいい」みたいなものがあれば，PRしてもらえると助かります．
JavaのIntegerクラスを使って辛かったところ


Javaでコンパイラを作成していたところ，Integerクラスの値が生成される部分があった．

Intergerクラスの値の比較演算子の記述する際に辛いことが発生したので書いておく

[サンプル](https://ideone.com/bXUv7a)


```Java:Tsurami.java
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		Integer a = new Integer(1);
		Integer b = new Integer(1);
		
		System.out.println(a + b); // 2
		System.out.println(a < b); // false
		System.out.println(a <= b); // true
		
		System.out.println(a == b); // false はっ？
		System.out.println(a != b); // true はっ？
		
		System.out.println(a == a); //true あ，もしかして
		System.out.println(a != a); //false それっぽい
		
		System.out.println(a.intValue() == b.intValue()); // true こうして
		System.out.println(a.intValue() != b.intValue()); // false こうか
		
	}
}
```

Integerクラスのインスタンスの値の比較を行う際，比較演算子を利用した．

比較演算子はうまく動くのに，等価演算子，非等価演算子が思わぬ結果を返した．

等価演算子と非等価演算子はIntegerのインスタンス自体を比較しているようでインスタンス自体が違えばfalseになる様子．

Integerクラスの中身はintValue()メソッドで取らないと等価比較はできないみたい．

美しい書き方あればコメントおねがします．

---
2015-10-09 追記

```java:compareTo.java
a.compareTo(b)
```
を使うのが一番安全そうですね．

引数の値よりも小さい場合は-1、大きい場合は1、同じ場合は0を返す というのはちょっと煩わしいですが

そもそもなぜ大小比較だけ動くようにしているのか不思議なぐらいです．

コメントありがとうございました．
Go言語の開発環境セットアップ


※このドキュメントは、[Go速習会](http://wantedly.connpass.com/event/21314/)で、事前にGolangを動かせる環境を用意してもらうために書いたものです。

## ここでやること 

- Goのインストール
- GOPATHの設定
- エディタ(Atom)の設定
- とりあえず`"Hello world!"`が出来るか確認
- もっと準備したい人のための情報


## Goのインストール

https://golang.org/doc/install

に各OS用のインストール方法がまとまってます。

Macなら、[Homebrew](http://brew.sh/index_ja.html)を使い、

```
brew install go
```

でいけます。



## GOPATHの設定

Goを使うためには、GOPATHを設定する必要があります。ほぼ必須です。
ここにimportする外部のライブラリが入りますし、僕はこのGOPATH以下で開発しています。

### GOPATH以下のディレクトリ構成

GOPATHをどこにするか決める上でも、GOPATH以下に作成されるディレクトリ構成を知っておくと良いです。

>
```
GOPATH=/home/user/gocode
>
/home/user/gocode/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)
```
>
>https://golang.org/cmd/go/#hdr-GOPATH_environment_variable


### GOPATHは何処がいいか

大きく以下2つの選択肢があり、それぞれメリット・デメリットあります。

1. ルートディレクトリ `GOPATH=~`
2. home以下のgoディレクトリ `GOPATH=~/go`
 - ディレクトリ名としては、`go`, `.go`, `gocode` が主流

これからはじめる人は、既存のディレクトリ構造の移行とか諸々面倒だと思うので、2で`go`でやることをオススメします。
`gocode`は本家の例でいくつか使われていますが、個人的には長い必要がないと思います。`.go`は自分のコードの開発をこのディレクトリ以下でやらない派の人にはいいかもしれません。

ちなみに、自分はパソコンを買い変えたタイミングで1の設定で運用しています。
そうすると自分がいじるすべての言語のコードを置く場所が`~/src/github.com/<ユーザー名>/<レポジトリ名>`になるので迷いがなくなるし、
レポジトリを移動するコマンド[cr](http://qiita.com/spesnova/items/f90b14973120f19bcda1)や、go以外のコードも`go get`の用に取ってくるコマンド[ghq](https://github.com/motemen/ghq)を使うことで全言語のソースコード管理が楽になります。
デメリットとして、`goimports`が遅くなりますが、まぁ`gofmt`があるし、`goimports`あんまり使わないという手があるのであまり困っていないです。


### 環境変数への設定方法

`.bash_profile`, `.zshenv` に

```bash:.bash_profile
export GOPATH=/Users/your-user-name/go  # GOPATHにすると決めた場所
export PATH=$GOPATH/bin:$PATH
```

と設定します。

## エディタの設定 - [Atom](https://atom.io/)

ここでは、Atomでやる場合を解説します。
go-plus のパッケージを入れましょう。以下の機能がまとめて入ります。

- コード補完 (gocode)
- コード整形 (goformats, goimports)
- 静的エラー解析 (golint, go vet)
- ビルドとテスト (go build, go test)

![go-plus.png](https://qiita-image-store.s3.amazonaws.com/0/6664/fc21e994-f0d1-a3c9-e888-a97e93879d1a.png "go-plus.png")

あとは、Settingsに行って、GOPATHとか必要な設定をすると良いです。
これだけで基本は十分なはずです。

## 簡単なコードが動くか確認

どこかのディレクトリに`main.go`を作って、

```go:main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello world!")
}
```

と書いて保存します。

```bash
$ go run main.go
Hello world!
```

と出力されればOKです。


## おまけ

### 公式サイトでの導入

普通、公式のドキュメントを読んでGoをはじめようと思ったら以下のドキュメントを読むはずです。
ここで書いたことや、テストをどう書くかまでまとまっているので目を通しておくと良いかもしれません。

[How to write go code](https://golang.org/doc/code.html) ([日本語訳](https://gist.github.com/shkumagai/6069017))


### 基本文法を知るには

速習会では、APIサーバーを作るのをゴールにするため、基本的な文法(if文や、ループの仕方や構造体どう作るのか等)は使ったタイミングで軽く触れる以上のことはしないつもりです。
これを知るには、以下のTour of Goというのがその場で実行できるSandbox付きでめちゃくちゃ良いので、"Basics"の部分までで良いので事前に見ておくことをおすすめします。ただやるのは必須ではないです。

https://tour.golang.org/list


### 他に知っておくと便利なツール

- [godep](https://github.com/tools/godep)
 - 依存解決ツール。依存するライブラリを自分ディレクトリ以下に取ってくる
 - goでは主流、と言うか必須になってきている
- [ghq](https://github.com/motemen/ghq)
 - 便利な`go get`を`ghq get`コマンドとして提供
Raspberry PiにF#の実行環境をインストールする


今回試してみた環境は次の通り。

[ハードウェア]
・Raspberry Pi Model A+

[ソフトウェア]
・Raspbian Wheezy (Release date:2015-05-05)
・Mono 3.2.8
・F# 4.0.0.3

# 概要
Monoはapt-getで、F#は自分でビルドしてインストールする。
ただし、F#はRaspberry Pi上でビルドしようとしてもエラーが発生するので、PC上でビルドしてからRaspberry Piにコピーしてインストールする。

# Monoのインストール
Raspberry Piでapt-getを使ってMonoをインストールする。

    # @Raspberry Pi
    $ sudo apt-get install mono-complete

# F#のインストール
F#はapt-getからインストールできないのでビルドする必要があるけど、概要で言ったようにRaspberry Pi上ではビルドできないので、PCの仮想マシン(Ubuntu)上でビルドして、生成されたファイルを使ってRaspberry Pi上でインストールする。

このときUbuntuとRaspberry Piで作業ディレクトリのパスを一致させる必要があるので、"/tmp/build/"を作業ディレクトリとする。

## UbuntuでF#をビルド
まずはビルドにautomakeが必要なのでインストールする。

    # @Ubuntu
    $ sudo apt-get install automake
    
あとはF#のリポジトリに書いてある手順でビルドする。ただし、"sudo make install"は**せずに**その直前のmakeまでやる。

[fsharp/fsharp](https://github.com/fsharp/fsharp)

    # @Ubuntu
    $ mkdir /tmp/build/
    $ cd /tmp/build/
    $ git clone https://github.com/fsharp/fsharp
    $ cd fsharp
    $ git checkout 4.0.0.3
    $ ./autogen.sh --prefix=/usr
    $ make -j4

## Raspberry Piに転送
Ubuntuの"/tmp/build/fsharp"をまるごとRaspberry Piに転送する。

    # @Ubuntu
    $ cd /tmp/build/
    $ scp -r /tmp/build/fsharp/ pi@[Raspberry PiのIPアドレス]:/tmp/bulid/

## Raspberry Piでインストール実行
Raspberry Piでインストールを実行する。

    # @Raspberry Pi
    $ cd /tmp/build/fsharp/
    $ sudo make install

# 確認
monoとfsharpcのバージョンを表示してインストールできたか確認する。

    # @Raspberry Pi
    $ mono -V
    Mono JIT compiler version 3.2.8 (Debian 3.2.8+dfsg-4+rpi1)
    Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    ...
    $ fsharpc --help
    F# Compiler for F# 4.0 (Open Source Edition)
    Freely distributed under the Apache 2.0 Open Source License
    ...
Emmetいいよ、Emmet「<li>になにか入れたい時」

Emmetいいよ、Emmet
最近はまってる。

>[読んでないけど読むと幸せになる記事：<br>HTML/CSSを爆速コーディング Emmet入門 第1回 Emmetを薦める理由](https://blogs.adobe.com/creativestation/web-learning-emmet-why-emmet)



**liが7個で中にbrをいれたいとき**

```lang:Emmetの省略記法を用いた記述
`li*7>br`
```

```lang:Emmetにより展開されたコード
<li><br></li>
<li><br></li>
<li><br></li>
<li><br></li>
<li><br></li>
<li><br></li>
<li><br></li>
```

**liが2個で中に文章を入れてついでにbrもいれたいとき**

```lang:Emmetの省略記法を用いた記述
　`li*2>{入れたい文章<br>}`
```

```lang:Emmetにより展開されたコード
<li>入れたい文章<br></li>
<li>入れたい文章<br></li>
```

ちょっとづつわかった記述を書いていきます( ˘ω˘)
MacとX1turboのシリアル接続

シリアルケーブルで接続して、データの送受信を試してみます。
# ケーブルを用意
以下の２つが必要です。

- シリアルUSB変換ケーブル
- D-sub9ピンと25ピンのクロスケーブル

Macにはシリアル端子がありませんので、シリアルUSB変換が可能なケーブルとして、RiteUpのシリアルUSB変換ケーブル RUUSRL1 を使用します。
なお、このケーブルのシリアル端子はD-sub9ピンですが、X1turboはD-sub25ピンです。
なので、9ピンと25ピンのクロスケーブルを探す必要があります。規格があっていれば何でもいいはずですが、ここではサンワサプライのKR-XD2を使います。

# シリアルUSB変換ケーブルの認識

USB変換に使われているチップのメーカーによって必要なドライバが異なるようですが、RUUSRL1は何もせずとも認識されました。（OS X Mavericks,Yosemite で確認）
認識されているかどうかはこれで確認できます。

```ターミナル
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   18,   0  9 21 07:58 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   18,   2  9 21 07:58 /dev/tty.Bluetooth-Modem
crw-rw-rw-  1 root  wheel   18,   4 10  8 21:36 /dev/tty.usbserial-142
```

名前からして tty.usbserial-142 がシリアルUSB変換ケーブルでしょう。

# シリアルコンソール

screenコマンドを使用します。

```ターミナル
$ screen /dev/tty.usbserial-142 9600
```

末尾の9600はボーレートです。X1turboのBASICで指定できる最大値に合わせています。
実行すると、ターミナルの表示内容が消えます。
これでMac側の準備は完了です。

なお、screenを終了させるには、Ctrl-a Ctrl-\ を押します。
するとこのようなプロンプトが出るので、y を押せば終了できます。

```
Really quit and kill all your windows [y/n]
```

# X1turboからMacへ送信
BASICのプログラムを送信してみます。

まず、X1turboで適当なBASICプログラムを入力します。

```X1turbo
10 PRINT "hello from x1"
20 END
```

送信するにはSAVEコマンドで行います。
SAVEはプログラムを保存するコマンドですが、デバイスに COM: を指定すれば、シリアルポートへ送信するようになります。

```X1turbo
SAVE "COM:6N83NNLCND"
```

これで、MacのシリアルコンソールにBASICのソースが表示されれば、正常に送信できたことになります。
なお、COM: の後ろの呪文は通信パラメータで、以下の意味になります。
わりと適当ですが、なんとかなります。

|文字位置|パラメータ|指定値|意味|
|:--|:--|:--|:--|
|1|ボーレート|6|9600ボー|
|2|パリティ|N|パリティチェックなし|
|3|データビット長|8|8ビット|
|4|ストップビット長|3|2ビット|
|5|通信制御指定|N|フロー制御なし|
|6|カナの表現方法|N|7ビットモードでカナの送受信不可|
|7|CR,LFコードの送信処理|L|送信改行コードはCRLF|
|8|CR,LFコードの受信処理|C|CR受信で復帰＋改行コードとして処理|
|9|日本語文字列の表現方法|N|シフトJIS|
|10|エンドコード|D|Ctrl-D(&H04)で終了|

# MacからX1turboへの送信
逆にMacからBASICのプログラムを送信します。

まず、X1turboで受信の準備をします。
先ほどのSAVEとは逆のLOADコマンドを使用します。通信パラメータは同じです。

```X1turbo
LOAD "COM:6N83NNLCND"
```

次に、Macでプログラムを入力し、最後に Ctrl-D を押します。

```Mac
10 PRINT "hello from mac"
20 END
```

すると、X1turboではLOADコマンドが終了しているはずです。
LISTコマンドでソースを表示して確認します。

```X1turbo
LIST
10 PRINT "hello from mac"
20 END
```

通信パラメータは、少なくとも以下の２つは正しく設定しないと正常に受信できませんでした。

|文字位置|パラメータ|指定値|注意点|
|:--|:--|:--|:--|
|8|CR,LFコードの受信処理|C|これでないと正しく改行されない|
|10|エンドコード|D|Macでこれを入力しないと、X1turboのLOADコマンドが終了しない|

というわけで、以外に簡単に送受信ができました。
cloud9のあんちょこ



#cloud9でterminalからeditor(ace)で開くコマンド

```bash
$ c9 /path
```

これでマウスをさわらなくていいね！！

#簡易サーバ立ち上げ(rails)

```
$ rails s -p $PORT -b $IP
```

#キーバインド変更
Cloud9⇒Open your keymap　
今の設定(ちょっとemacs風）

```js:keybinding.settings
[
    { "command": "backspace", "keys": ["Ctrl-H", "backspace"] },
    { "command": "gotoright", "keys": ["Ctrl-F", "right"] },
    { "command": "gotoleft", "keys": ["Ctrl-B", "left"] },
    { "command": "find", "keys": ["alt-F"] },
    { "command": "replace", "keys": ["alt-shift-F"] },
    { "command": "build", "keys": ["alt-shift-f5"] }
]
```
##上手くいかない設定
エンター(改行）をC-Mに設定することができない・・・。

```js
{ "command": "\n", "keys": ["Ctrl-M", "enter"] },
```

ではダメsplittoLinesもsplitlineもちがうっぽい
git hubでみると、emacsでのC-Mのために、

```js
"Return|C-m": {command: "insertstring", args: "\n"}, // "newline"
```

とあるがこれが再現できない。。
全てemacsやvimやsublineでいいよ！って人は
setting⇒keybindingから一括変更できます。


##注意！！

- 既定のキーバインドを変更しないとバグります。(衝突時に既存の設定が優先される）。
- keybindings.settingsを書き換えても、変更は保存されます。（設定をカラにしないと消えないという意味）
- setteingからresetするともれなく設定が消えます！！

#メモリーがオーバして警告がでる
メモリーやCPUのバーグラフをクリックして
Restarを選択すれば大分減ります。
（作業内容によっては禁じ手かもしれませんが）


#参考
基本的な設定
http://nelog.jp/rails-on-cloud9
aceについてのstackflow
http://stackoverflow.com/questions/28028178/cloud-9-how-to-open-a-file-in-the-c9-editor-from-c9-terminal
aceのgithub
https://github.com/ajaxorg/ace/blob/master/lib/ace/keyboard/emacs.js
SVMについて整理してみた。

・SVM(サポートベクターマシン)について
・また最後に、個人的な趣味でコンピュータ将棋における活用を
まとめてみました。


#１．SVMの概要

SVM：Understanding Support Vector Machine algorithm from examples (along with code)
http://www.analyticsvidhya.com/blog/2015/10/understaing-support-vector-machine-example-code/?utm_content=buffer4951f&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

英語記事ですが、入りとしてはこちらが個人的なおすすめです。
数式での説明なしで、グラフィカルにSVMの概念を説明がしっかりとされていて、
非常にとっつきやすいと思います。

・境界面を引くことで分類を行う
・平均や分散を用いないため、データを挿入したり変更したりしても、
　全体的な再計算の手間が生じない
ことが分かります。


#２．SVMという手法について
PRML(パターン認識と機械学習)をまとめている
素晴らしい記事がすでにあるので、そちらを参照。

##1). 線形SVM
http://aidiary.hatenablog.com/entry/20100501/1272712699

上記事では、境界面の引き方を厳密に定義していませんが、
マージン（分類境界と訓練データ間の最短距離）を最大化する最適化問題で、
凸計画問題の双対問題を解けばいいことがわかります。


##2). 非線形SVM
http://aidiary.hatenablog.com/entry/20100502/1272804952

マージンを非線形関数にすることで、より複雑な分類が可能になりました。
しかし、これでも重なりがある場合分類は難しい。


##3). ソフトマージンSVM
http://aidiary.hatenablog.com/entry/20100503/1272889097

ここまでは、ハードマージンSVMといわれている、
入力空間xでデータを完全に分離できることを仮定してきた手法でした。

一方、ソフトマージンSVMは、上記のように重なりがある場合の分類を克服するために、
誤分類に対してペナルティを与える手法です。

誤分類が多いほど、最小化の妨げとなるようにペナルティを加えます。
結果、最小化しようとするとなるべく誤分類が少なくなるように
パラメータを調整しようとするようになります。

ペナルティを大きくするほど、正確な分類が可能となります。
分類境界がどんなに細かくなってしまいますが…



#３．コンピュータ将棋でのSVMの活用

SVMによる詰み予測とその応用
三輪誠氏　東京大学大学院新領域創成科学研究科基盤情報学専攻(当時)
http://repository.dl.itc.u-tokyo.ac.jp/dspace/bitstream/2261/187/1/K-00177.pdf

将棋における詰みを予測するために、SVMが用いられています。

将棋において、詰みの有無を判断することはとても重要なのですが、
"SVMを用いた詰み予測を用いることで、探索時間を62%まで削減することができた。"
というのが、こちらの論文の主旨です。

コンピュータ将棋に対して、
・評価関数への機械学習の適用
・局面を探索する探索アルゴリズム
について詳しく書かれていますので、非常に勉強になるかと思います。

"２．SVMという手法について" において、段階を踏んで解説をしましたが、
実用的には、計算コストや簡易性から、おおよそ１．の線形SVMで十分だと思います。

非線形SVMを当てはめる研究もありますが、これは逆効果だと個人的には思います。
かかる計算コストに対して、得られる精度はわずかですので。

----

補足：コンピュータ将棋・囲碁における機械学習活用 
http://www.slideshare.net/TakashiKato2/ss-57966067

自分が上げたものですが、コンピュータ将棋における機械学習の活用方法は、こちらを参照。
【AWS】IAMによる権限管理 【基礎】

#はじめに

こんにちは。
今回は、**IAMアカウント作成**をやってみます。

下記サイトを参考にしました。
[AWS アカウント内での IAM ユーザーの作成](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html)

#それでは早速作っていきます

まずは、ユーザーの作成から行います！

**AWSマネージメントコンソールから[IAM]を選択。**
![①.png](https://qiita-image-store.s3.amazonaws.com/0/95380/ef9c9849-91d4-126c-1b10-1861b2ea01ca.png)

**[ユーザー]-[新規ユーザーの作成] を選択。**
![スクリーンショット 2015-10-05 22.07.19.png](https://qiita-image-store.s3.amazonaws.com/0/95380/0d1224d2-68bb-b90b-e29f-55dbcbb7a1a0.png)

**ユーザー名を入力。**
![③.png](https://qiita-image-store.s3.amazonaws.com/0/95380/4c4ca2ca-ec48-e32e-66e1-b44c8aa002d1.png)

**ユーザーが作成されていることを確認。**
![⑤.png](https://qiita-image-store.s3.amazonaws.com/0/95380/e2c0dff4-0857-5ffc-e0aa-0f76338c6961.png)


とりあえず、簡単にIAMユーザーの作成まではいきました。
この状態では、このアカウントに何の権限がないので、ポリシーを付与する必要があるようです。


ポリシーを確認すると大量のポリシーが。。。

![⑦.png](https://qiita-image-store.s3.amazonaws.com/0/95380/f86da278-e4dd-dcdf-a02b-095c2de409d8.png)

調べてみるといくつか代表的な権限があるようです。
その中のAdministratorAccessには全権限があり、
PowerUserAccessは全権限からIAM操作権のみを
抜いたポリシーのようです。
今回はテストとして、PowerUserAccessを適用します。

**適用するポリシーを選択し、適用するユーザーにチェック。[アタッチ]を選択。**
![⑨.png](https://qiita-image-store.s3.amazonaws.com/0/95380/b91d72b5-9e83-a8a7-12ba-e0398ab0b188.png)

ポリシーの作成などもあるようですが、今回は割愛します。　
時間があれば、いずれポリシーの作成もやってみます。



ポリシーをアタッチしてひとまず完了かと思ったのですが、
パスワードの設定も必要なようです。

まず、パスワードポリシーを設定します。

**[アカウント設定]-[パスワードポリシーの適用]を選択。**
![スクリーンショット 2015-10-05 22.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/95380/0ff14b34-ad73-b0e4-5cf6-79adad68d339.png)

次に、実際のユーザーのパスワードを設定します。

**[ユーザー]-[パスワードの管理]を選択。**

![スクリーンショット 2015-10-06 22.28.32.png](https://qiita-image-store.s3.amazonaws.com/0/95380/07631559-7e79-b01f-dadd-29f796ce8004.png)

パスワードを設定して、やっと完成です。

**ダッシュボードの接続URLを確認。**
![13.png](https://qiita-image-store.s3.amazonaws.com/0/95380/de60b1a6-5d36-3bae-79bd-3b70447a9fbe.png)

**テスト**

確認したURLで接続し、作成したユーザーでログイン。
IAMを確認すると、権限エラーが表示されるので設定はうまくいってるようです。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/95380/6041e6b2-4388-8e2a-24e6-8f56dda26a78.png)

それでは、失礼します。
XCTest+OCMock+OHHTTPStubsでHTTP通信のスタブ化


WebAPIのユニットテストにスタブを使いたくて調べてみた。

## 概要

HTTP通信をスタブ化するライブラリは次の２つが見つかった。

* [luisobo/Nocilla](https://github.com/luisobo/Nocilla)
* [AliSoftware/OHHTTPStubs](https://github.com/AliSoftware/OHHTTPStubs)

Nocillaが簡潔に書けて良いと思ったが、ドキュメントにある`stubRequest(@"GET", @"http://www.google.com").andReturn(404);`の`andReturn`の部分でコンパイルが通らない。どうやら、OCMockが定義している`andReturn`のマクロとネームスペースが重複しているらしく、同じソース内で利用することはできないようだった。

参考: [objective c - Are OCMock and Nocilla incompatible? - Stack Overflow](http://stackoverflow.com/questions/26362151/are-ocmock-and-nocilla-incompatible)

OHHTTPStubsはNocillaに比べて記述量は多いが、OCMockと共存して使用できたためこちらを使うことにした。

## 環境

* Xcode 7
* OCMock 3.1.2
* OHHTTPStubs 4.3.0
* Nocilla 0.10.0

## 実装

```Objective-C
@try {
  // スタブを登録
  [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
      // 戻り値をtrueにするとリクエストがスタブ対象になる
      // ここではパスが`/v1/first/second`に一致するリクエストをスタブ化している
      return [request.URL.path isEqualToString:@"/v1/first/second"];
  } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
      // スタブのレスポンスを定義する
      // ここではHTTPステータス500のレスポンスを定義している
      NSData *data = [@"{}" dataUsingEncoding:NSUTF8StringEncoding];
      return [OHHTTPStubsResponse responseWithData:data statusCode:500 headers:@{@"Content-Type":@"application/json"}];
  }];

  // HTTP通信を伴う処理のテスト
  // ...
}
@finally {
  // 非同期処理が終了するのを待つ
  // 例: BFTask
  // [task waitUntilFinished];
  
  // スタブを削除
  // (setUp/tearDownでやるほうがいいかもしれない)
  [OHHTTPStubs removeAllStubs];
}
```
swiftでtableViewの高さを変更する


UITableView.rowHeightを使う

```swift
  myTableView = UITableView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
  myTableView.rowHeight = 200
```
これだけ。
swift 2.0
xcode 7.0.1
Sencha の build で「'parsebox': can't modify frozen Array」のエラーが出てビルドできなくなった

### 開発環境を別のマシンに移したら sencha の build が通らなくなった
***
開発環境をまるまる別のマシンに移行しなければならなくなり
結構ハマったので備忘録として初投稿

環境は大雑把に書くと

- Mac OS Yosemite
- rbenv (by Homebrew)
- ruby 2.1.2
- sencha v5.1.0.26


### build 実行
***
build の実行は```$ sencha app build```と```$sencha app watch -e testing```

でしばらく build が進むと下記のエラーで build に失敗する

```
error XXXX-example.scss (/Users/user/projects/xxxx/public/javascripts/ext/packages/ext-theme-base/sass/utils.rb:30:in `parsebox': can't modify frozen Array) 
```
もしかすると下記の場合もあるかもしれないです
```
..../rubygems/dependency.rb:298:in 'to_specs': Could not find 'compass' (>= 0) among 14 total gem(s) (Gem::LoadError)  
```
でも旧環境で同じソースの build は問題なく通る。。。

rbenv を入れなおしたら解決したと教えてもらったので
全部消して、何度も rbenv を最初から入れなおして見たけど全然変わらず。。。

### いろいろ比較してみた
***
両方の sencha の debug build log を比較してみたり（15万行以上あった・・）
```gem list```の比較をしてみたりしても原因がわからずでしたが、
~/.rbenv の中身を比較してみたら

- 旧環境： git で rbenv をインストール
- 新環境： Homebrew で rbenv をインストール

### 解決した
***
git から rbenv をインストールしたら build が通るようになった！

なぜ？と違いを調べていたら[「rbenv + ruby-build はどうやって動いているのか」](http://takatoshiono.hatenablog.com/entry/2015/01/09/012040)という記事を
書かれている方がいらっしゃいました。
こんなに違うのかー！と勉強不足を痛感しました。。。

何か詳しい原因をご存知の方いらっしゃいましたらご教授を！
ワンライナーのコマンドでwebからDL & installできるのすごい

[chocolatey](https://chocolatey.org/)というwindows向けのパッケージ管理ソフトが下のコマンド一発で超Easy Installを実現しててすごく興味深い。

```bat
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```

これ一行で

* ウェブ上からパワーシェルでできたインストール用スクリプトをDL
* インストール用スクリプトを実行

してるみたい。面白い。（セキュリティ的にはどうなんだろう？）
なんかに使えないかなーこれ[^1]

[^1]: 社内用のちょっとしたツールの配布とか?


----

ところで、コマンドプロンプトで以下のコマンドを実行することで、ファイルをダウンロードできます。wgetっぽいことがwindowsでできちゃいますね。

```bat
> powershell -NoProfile -ExecutionPolicy Bypass -Command "(new-object net.webclient).DownloadFile('URL', 'ファイル名')" 
```

なんかに使えないかなー(再
AMIMOTOのDBをAmazon Auroraにする

ついに来ましたね、Amazon Aurora東京リージョン。
MySQL互換ですのでAMIMOTO AMIで立ち上がったWordPressをAmazon Auroraに接続してみましょう。

## １：Amazon Auroraをセットアップ
マネージコンソールからRDSを選択し、「今すぐ始める」をクリックします。
![RDS_·_AWS_Console.png](https://qiita-image-store.s3.amazonaws.com/0/23936/35604539-bcb5-34da-1e17-15a256e7b488.png "RDS_·_AWS_Console.png")

RDSエンジンを選択できるので、Amazon Auroraを選びます。(*
最近
昨日からRDSでMariaDBも使えるようになったみたいです）
![RDS_·_AWS_Console.png](https://qiita-image-store.s3.amazonaws.com/0/23936/2147469e-c9f9-6f8a-8bf8-8bae06c58ad3.png "RDS_·_AWS_Console.png")
インスタンスサイズはそこそこ大きいサイズから選ぶ様子。
個人ブログや小規模サイトに使うにはオーバースペックですね。
![スクリーンショット 2015-10-08 19.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/23936/0e52ce78-120e-8f7b-50e2-903b867dd76e.png "スクリーンショット 2015-10-08 19.24.17.png")

DBの設定情報を入力して立ち上げます。
![スクリーンショット 2015-10-08 19.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/23936/0624c4b9-5631-5b44-b1f1-925b90b05ab8.png "スクリーンショット 2015-10-08 19.29.37.png")
詳細設定でVPCやサブネットを選択します。
VPCを選択する場合はAMIMOTOが稼働するEC2が存在するVPCを選びましょう。
VPC外にインスタンスがある場合などは「パブリックアクセス可能」をはいにしておくといいかなと思います。
*AutoScaleしない場合などはセキュリティグループでmysqlのインバウンドIPをEC2のEIPだけにしておくと良いと思います。
![RDS_·_AWS_Console.png](https://qiita-image-store.s3.amazonaws.com/0/23936/7130471a-fee7-7658-6315-26b78295ef42.png "RDS_·_AWS_Console.png")

作成ボタンをクリックすれば以下のようにセットアップ中という表示になります。

![スクリーンショット_2015-10-08_19_33_33.png](https://qiita-image-store.s3.amazonaws.com/0/23936/7ecf015b-d367-2a81-bdde-52fa85ca10b9.png "スクリーンショット_2015-10-08_19_33_33.png")
作成終わるまで数分時間がかかるので、その間にAMIMOTOでWordPressを立ち上げておきましょう。


## ２：AMIMOTOでWordPressを立ち上げる
すでにAMIMOTO AMIでインスタンスが立ち上がっていれば、wp-setupコマンドで一発です。

	$ ssh example.com
	Last login: Wed Oct  7 18:28:04 2015 from XXX.XXX.XXX

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

	https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
	$ sudo su -
	# wp-setup aws-aurora.examle.com
	
## ３：DBをAmazon Auroraに変える
DBの接続情報を書き換えてAmazon AuroraにDBを作るようにしましょう

	# cd /var/www/vhosts/aws-aurora.examle.com/
	# vim wp-config.php
wp-config.phpはこんな感じに設定します。

	if ( !$db_data ) {
        $db_data = array(
                'database' => 'DB名',
                'username' => 'マスターユーザーの名前',
                'password' => 'マスターパスワード',
                'host'     => 'クラスターエンドポイント',
        );
	}
![root_ip-10-189-36-169__var_www_vhosts_aws-aurora_web-sample_org_—_ssh_—_151×52.png](https://qiita-image-store.s3.amazonaws.com/0/23936/532c55bf-b8f6-6cc3-b0e0-cbd38d781d30.png "root_ip-10-189-36-169__var_www_vhosts_aws-aurora_web-sample_org_—_ssh_—_151×52.png")

あとはいつも通りWordPressのインストール処理を行えばOKです。
![WordPress_›_Installation.png](https://qiita-image-store.s3.amazonaws.com/0/23936/7d3a0253-2418-e363-07ac-b6f2180ba5a7.png "WordPress_›_Installation.png")

すでに運用中のWordPressのDBをAuroraに変えたいとかであれば、WP-CLIのwp db export/importを使えば良いかなと思います。
Railsでよく使うDebug

Rails で object の中身をログに出力したいときがある。
覚えたと思っても、使いたいときには大抵忘れている。

ということで、Railsでよく使うものの自分用メモ。

# object の中身をログに出力

オブジェクトをそのまま渡すとこんな出力になってしまう。

```rb
logger.debug @users
#<User::ActiveRecord_Relation:0x007fd25d4aca40>
```

これでは困る。
そこで、inspect でわかりやすく出力。

```rb
logger.debug @users.inspect
#<ActiveRecord::Relation [#<User id: 1, name: "hogehoge", ... 
```

見やすさ重視なら、yaml フォーマットで出力。

```rb
logger.debug @seekers.to_yaml
```

```text
---
- !ruby/object:User
  attributes:
    id: 1
    name: hogehoge
```

# logger.debug が使えないところでは

```rb
Rails.logger.debug "hogehoge"
```
FirefoxやChromeでOMSAへ接続するとSSLエラーになるとき

FirefoxやGoogle ChromeでOpen Manage Server Administrator(以降OMSA)のWebUIへ接続すると次のようなエラーが発生する。
> "SSL received a weak ephemeral Diffie-Hellman key in Server Key Exchange handshake message. (Error code: ssl_error_weak_server_ephemeral_dh_key)
>
> The page you are trying to view cannot be shown because the authenticity of the received data could not be verified. Please contact the website owners to inform them of this problem."

これはブラウザ側に[Logjam Attack](https://en.wikipedia.org/wiki/Logjam_(computer_security))対策が施されたことによるものである。OMSA接続時にFirefoxでいうabout:configのsecurity.ssl3.dhe_rsa_aes_128_shaやsecurity.ssl3.dhe_rsa_aes_256_shaをいちいちfalseするのは面倒なので避けたい。

OMSA側の設定変更箇所を以下に示す。

```diff
--- /opt/dell/srvadmin/lib64/openmanage/apache-tomcat/conf/server.xml.orig      2015-09-18 18:05:56.066644648 +0900
+++ /opt/dell/srvadmin/lib64/openmanage/apache-tomcat/conf/server.xml   2015-09-18 19:55:29.844098111 +0900
@@ -80,7 +80,7 @@
                maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                clientAuth="false" sslProtocol="TLS" />
     -->
-    <Connector SSLEnabled="true" ciphers="SSL_RSA_WITH_RC4_128_SHA,SSL_RSA_WITH_RC4_128_MD5,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA" clientAuth="false" compression="force" keyPass="${key_password}" keystoreFile="conf/keystore.db" keystorePass="${keystore_password}" maxPostSize="6291456" maxThreads="150" port="1311" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"/>
+    <Connector SSLEnabled="true" ciphers="SSL_RSA_WITH_RC4_128_SHA,SSL_RSA_WITH_RC4_128_MD5,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA" clientAuth="false" compression="force" keyPass="${key_password}" keystoreFile="conf/keystore.db" keystorePass="${keystore_password}" maxPostSize="6291456" maxThreads="150" port="1311" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"/>

     <!-- Define an AJP 1.3 Connector on port 8009 -->
     <!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>-->
```
Cipherリストの前から4番目のTLS_DHE_RSA_WITH_AES_128_CBC_SHAを除ている。自分の環境にあったリストに書き換えるとよい。
編集が済んだらWebサーバを再起動して反映させる。

```shell-session
# systemctl restart dsm_om_connsvc.service
```
【AdobeAIR/iOS】ビルド番号(CFBundleVersion)のみを変更する方法

ちょっと詰まったのでここに書いておきます。

**動作環境**
Adobe AIR SDK18以降
http://labs.adobe.com/downloads/air.html

***
AdobeAIR SDK18以前のバージョンでは、iOS向けにipaを作成すると、**application.xmlのversionNumberの値がCFBundleVersion(ビルド番号)とCFBundleShortVersionString(表記バージョン)両方に指定されていました。**

そのためビルド番号だけ変更したい場合(例えばリジェクトされたり生成したデータにエラーがあったり)にはいちいちunzipして書き換えて再署名…といった手間がかかっていたのですが、SDK 18からはversionLabelとversionNumberを記述することにより個別に指定できるようになりました。

```lang:application.xml
  <!-- CFBundleShortVersionString -->
  <versionLabel>1.0</versionLabel>
  <!-- CFBundleVersion -->
  <versionNumber>1.0.1</versionNumber>
```
joinの際に任意のキー「同士」で結合したい時には、primary_keyとforeign_keyを使う

下のようなテーブルとモデルがあったとする

```:articles
- id
- title
- content
```

```:article_plots
- id
- article_id
- plot_content
```

```:article_histories
- id
- article_id
- article_state
```

```ruby:article.rb
  has_many :article_histories
  has_many :article_plots
```


```ruby:article_plots.rb
  has_many :article_histories, foreign_key: :article_id, primary_key: :article_id
```


```ruby:article_history.rb
  belongs_to :article
```

この時article_plotsとarticle_historyをAR経由でarticle_idを結合キーとしてjoinするには

```ruby:article_plots.rb
  has_many :article_histories, foreign_key: :article_id, primary_key: :article_id
```
こういうふうに設定を足せば互いのarticle_idを見てjoinしてくれる

foreign_keyは自身の何を外部キーとするか、primary_keyは、相手の何を外部キーとするかを設定している。

下みたいなことをする必要はない...

```
joins('INNER JOIN article_histories ON article_histories.article_id = article_plots.article_id')
```
PHPの低品質なコードをコミット前に自動的に検査する


# 出発点：コード汚すぎ問題を解決したい
したい（したい）。ツールに頼れるとこは頼りたい。
## 解決策
- PHPのコーディング規約を強制的にPSR-2基準にしたい。
  - [PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer)を使ってコード整形をしよう！
- 複雑すぎるコードを事前に見つけたい。
  - [PHPMD](http://phpmd.org/)を使って循環的複雑度が高すぎないかとか検査しよう！

phpmdやphp-cs-fixerなどのツールをcomposerでグローバルにインストールしてやって、手動で毎回コードチェックのコマンドを叩けば問題をクリアできます。

```
composer global require "fabpot/php-cs-fixer"
composer global require "phpmd/phpmd"
```

# コミット前に`php-cs-fixer`とか打つのめんどいし忘れる
ツールを手動でかけるだけだと↑のような問題が起きます。自動化したい。する。
具体的にはGitのpre-commitというコミット時のフックを利用します。

## 自動化の手順
以下のmanatenさんの記事を参考に導入します。

- [gitのpre-commit hookを使って、綺麗なPHPファイルしかコミットできないようにする - MANA-DOT](http://blog.manaten.net/entry/645)

# GitHub Desktopとかつかいたくない？
ここまでで殆どの人は満足できる結果になるかもしれません。manatenさんありがとうございます。
わたしの運用だと以下の問題がおきたので、これを解決していきます。

1. `git add -p`が意味を成さない
2.  GitHub Desktopが使えなくなる

これらの点を反映したスクリプトは[Gistで公開しています](https://gist.github.com/kadoyau/ca1fa65bec7defe96815)。PHPMDのルールは[公式ページのリファレンス](http://phpmd.org/rules/index.html)を見ながら適宜変更してください。

## 1を解決：`git add -p`を使えるようにpre-commitを改変する
上のエントリで紹介されているpre-commitのスクリプトは、php-cs-fixerをかけた後に自動的に`git add`されるので便利です。しかし、`git add -p`でコミットを切り分けることができなくなるのでこのコマンドを使う場合には不便です。なので、以下の要件を満たすように一部変更します。

- php-cs-fixerで修正が必要だった場合、コードの修正を自動で行うが`git add`を自動的には行わずにコミットを中断する

### 副作用（利用上の注意）
-  コミットにフックしたphp-cs-fixerでコードが修正されてコミットが中断された場合、手動で`git add`しないと、当該コミットにphp-cs-fixerで修正されたものが入らない。
  -  後述のGitHub Desktopを使うと自動でaddされるので不便さはありません。

## 2を解決： GitHub Desktop[^1]を使えるようにする
ここまで設定した状態でGitHub Desktopを使うと、`phpmd`やらのコマンドが見つからないというエラーになります。Stack Overflowに同じ問題を解決している方がいました[^2]。

デフォルトでは`~/.composer/vendor/bin`に配置されているので、このpathをpre-commitの先頭に書き込みます。これでGitHub Desktopがそのコマンドを利用することができます。

```pre-commit
PATH=$PATH:/Users/YOUR_NAME/.composer/vendor/bin/
```
[^1]: [GitHub Desktop](https://desktop.github.com/)はGUI上で`git add -p`ができたりする便利ソフト。GitHub謹製。
[^2]: [Git pre-commit hook failing in GitHub for mac (works on command line) - Stack Overflow](http://stackoverflow.com/questions/12881975/git-pre-commit-hook-failing-in-github-for-mac-works-on-command-line)
brew seach で GitHub API rate limit にあたった場合

雑に ```brew search xxxx ``` とかで検索を連続ですると下記のようなエラーになる時がある

```shell-session

Error: GitHub API rate limit exceeded for xxx.yyy.zzz.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)
Try again in 46 minutes 58 seconds, or create an personal access token:
  https://github.com/settings/tokens
and then set the token as: HOMEBREW_GITHUB_API_TOKEN

```
解決方法は、メッセージにある通り、時間をおいて再度実行するか、homebrew 用のaccess token を生成して環境変数にセットする
GitLabで新しいユーザーをメールによる認証なしで登録したい

# GitLab のユーザーをサクッと作りたいが……
　社内に GitLab サーバーを立てました。開発メンバーの登録を一括で行ってしまいたい。しかし、GitLab でユーザー登録を行うにはメールによる認証が必須。すぐに使えるメールサーバーも無い。さてどうするか。

　結論から言うと、GitLab ではメールによる認証が必須なので不可能。そういう設定は用意されていない。

# 対処策
　でもあきらめるにはまだ早い。コードを書き換えることで回避が可能だ。

```ruby:/opt/gitlab/embedded/service/gitlab-rails/app/modules/user.rb
default_value_for :confirmed_at, Time.now
```
　上記のコードを追加してあげることで、登録と同時にメール認証が済んだことになる（ファイルパスは RPM をインストールしたときのものなので、インストール形式によっては適宜読み替えてください）。
スロークエリモニタ Anemometerのインストール


AnemometerはBox, inc.がオープンソースで公開しているスロークエリモニタリングツール。
https://github.com/box/Anemometer

仕組みとしては、pt-query-digestの利用が前提になっていて、
pt-query-digestで解析したスローログレポートを見るための、WebUIを提供するツールといった雰囲気。


![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/4350/0e581882-211d-e2d3-67f5-7c5740f5bb46.png "スクリーンショット 2015-10-08 午後5.59.54.png")

### 前提

MySQL及び、Percona Toolkitはインストールは済であるとして進める

なお、ここでの環境はUbuntu 14.04, MySQL 5.6, Percona Toolkit 2.2

### インストール

Anemometerはphpで動いているのでphpの動作環境を用意

```bash
$ sudo apt-get install -y apache2 php5 php5-mysql libapache2-mod-php5
```

AnemometerのリポジトリをcloneしてDBセットアップ、apacheへの配置

```bash
$ git clone git://github.com/box/Anemometer.git anemometer
$ cd anemometer		

$ mysql -uroot < install.sql
$ mysql -uroot -e "grant ALL ON slow_query_log.* to 'anemometer'@'%' IDENTIFIED BY 'superSecurePass';"

$ cp conf/sample.config.inc.php conf/config.inc.php 
$ # 必要に応じてconfig.inc.phpの内容を編集

$ sudo ln -s `pwd` /var/www/html/
$ sudo service apache2 restart
```

あとはpt-query-digestで解析したスローログのレポートをDBに入れる

```bash
$ pt-query-digest --user=anemometer --password=superSecurePass \
                  --review h=localhost,D=slow_query_log,t=global_query_review \
                  --history h=localhost,D=slow_query_log,t=global_query_review_history \
                  --no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\"" /path/to/slow.log
```

http://<span></span>yourhost:port/anemometer/を開く
UbuntuにPercona Toolkitインストール


pt-query-digestなど便利ツールが入っているPercona Toolkitのインストール。
Ubuntu 14.04にて。

```bash
$ wget percona.com/get/percona-toolkit.deb

$ sudo apt-get install libio-socket-ssl-perl libnet-ssleay-perl libterm-readkey-perl

$ sudo dpkg -i percona-toolkit.deb

$ dpkg -s percona-toolkit 
Package: percona-toolkit
Status: install ok installed
...
```
mysqldumpslowでslowログの集計と、slowログの手動ローテート


MySQL5.6にて。

mysqldumpslowは、MySQL付属のスロークエリログ集計ツール

```bash
$ mysqldumpslow -s ORDER slow.log
```

ORDERには

* c: 出現回数
* l: ロックタイム
* r: 送信行数
* t: クエリ時間

やそれぞれの平均など色々選べる。
詳しくはヘルプ参照


ちなみにslowログは下記のような感じで手動ローテートできる。

```bash
$ mv slow.log{,.`date '+%Y%m%d%H%M%S'`}
$ mysql -uroot -e 'FLUSH SLOW LOGS'
```
apt-get updateで、There is no public key available と出た時の対処。

debianサーバで`apt-get update`を実施すると`There is no public key available for the following key IDs`と警告が出た時の対処の備忘録です。

## 警告：There is no public key available

しばらく管理放置されていたDebianサーバで更新を行う事になり、apt-get updateを実施したところ、下記のような警告が出ました。

```bash
$ sudo apt-get update
<--snip-->
Fetched 18.1 MB in 10s (1,729 kB/s)                                                                                            
Reading package lists... Done
W: There is no public key available for the following key IDs:
9D6D8F6BC857C906
W: There is no public key available for the following key IDs:
7638D0442B90D010
W: There is no public key available for the following key IDs:
7638D0442B90D010
W: There is no public key available for the following key IDs:
7638D0442B90D010
```

## 対処方法

* Debian開発者のGnuPG鍵とGnuPGアーカイブ鍵をインストール

```bash
$ sudo apt-get install debian-keyring debian-archive-keyring
```

## 参考情報

[debian-keyring](https://packages.debian.org/wheezy/debian-keyring)
[debian-archive-keyring](https://packages.debian.org/wheezy/debian-archive-keyring)
rspecでAPIを連鎖させる

タイトルがわかりづらい

要するに、APIが２つA,BとあってAのレスポンスをBで使いたい場合どうすればいいのかということです。

```rb
describe "テスト" do
  describe "create" do
    let(:path) { '/v1/sample' }
    before do
      json_post path
    end
    it "ユーザーの作成", autodoc: true do
      @token = json["token"]
    end
  end

  describe "show" do
    let(:path) { '/v1/users' }
    let(:params) {token: @token}
    before do
      json_get path, params
    end
    it "参照", autodoc: true do
      p Jon
    end
  end
end
```
上記は僕の間違え例です。
createで取得したtokenをshowのパラメータとして使おうとしています。
一見するとうまくいきそうですが、describeは終了すると破棄されるので@tokenはnilになってしまいます。

```rb
describe "テスト" do
  describe "create" do
    let(:path) { '/v1/sample' }
    before do
      json_post path
    end
    it "ユーザーの作成", autodoc: true do
      @token = json["token"]
    end

    it "参照", autodoc: true do
      json_get path, {token:@token}
      p json
    end
  end
end
```

なので、itは同じdescribe上に書く必要があります。
SSH認証キーをGitLabに登録・設定手順 覚書（バージョン：7.13.5）

# SSH認証キーをGitLabに登録・設定手順 覚書

GitlabのバージョンアップでUIが結構変わってしまったので、新規でバージョン7.13.5用をつくました。
基本的なセットアップは同じです。（クリックする場所が変わっただけです）

過去バージョンの方は以下の記事を参考にしてみてください。

* [SSH認証キーをGitLabに登録・設定手順 覚書](http://qiita.com/redamoon/items/07e445d1fce360cb5fa3 "SSH認証キーをGitLabに登録・設定手順 覚書")

Git・Gitlabを案件で使う頻度が多くなってきたので、整理していきたい思いましたので、設定手順をまとめていきます。

SSH認証キーをGitlabに登録するまでの手順をざっくりまとめました。

随時、更新していきたいと思います。

## SSH認証の公開鍵と秘密鍵を作成

ターミナルでssh keyを作成

```
* アドレス@example.comの部分に自分のメアドを登録
* 途中でパスフレーズ（passphrase）を求められますが、Enterを押すだけ
```

ターミナルでSSH Keyを作成するコマンド

```Terminal
cd ~/.ssh
ssh-keygen -t rsa -C アドレス@example.com
```

```Terminal
Generating public/private rsa key pair.
Enter file in which to save the key (/home/.ssh/id_rsa):    ← なにも入力せずに［Enter］
Enter passphrase (empty for no passphrase):    ← 好きなパスワードを入力
Enter same passphrase again:        ← 確認のためにもう一度入力
Your identification has been saved in /home/.ssh/id_rsa.
Your public key has been saved in /home/.ssh/id_rsa.pub.
The key fingerprint is:
e8:ae:60:8f:38:c2:98:1d:6d:84:60:8c:9e:dd:47:81 foo@hoge.com
```

鍵の生成が完了したら2つのファイルが生成

```Terminal
id_rsa: 秘密鍵、他人には見られないようにする
id_rsa.pub: 公開鍵、Bitbucket/GitHub/GitLabに渡す
```

※ 秘密の鍵のセキュリティを強化するために以下のコマンドを実行

```Terminal
chmod 600 id_rsa
```

## クライアント側へのSSHキーの設定

鍵の管理を簡単にするために、~/.ssh/configに設定を追加

```Terminal
vim ~/.ssh/config
```

~/.ssh/configのファイル以下を追加

```
Host gitlab.example.com
  User git
  Port 指定のポート番号
  HostName gitlab.example.com
  TCPKeepAlive yes
  identitiesonly yes
  identityFile ~/.ssh/sshのkey格納場所
```

## GitLabへ公開鍵の登録

1. 右カラム（ユーザボタン）もしくはヘッダーのアイコンを選択
2. 左カラムのSSH Keysをクリック
3. Add SSH Keyをクリック
4. id_rsa.pubの文字列をKeyの中にいれます（Titleは任意）

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/34020/ed86d82e-c0ef-d318-529f-af861af58f21.jpeg)

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/34020/d6141c34-9bda-49cb-daa3-76b69c76c178.jpeg)

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/34020/d9bab160-48e2-476d-56e6-2a7aae838936.jpeg)

```
pbcopy < ~/.ssh/github/id_rsa.pub
```

クリップボードにsshキーの中身がコピーされます。

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/34020/fd45c3d8-4a09-3034-772e-5c53c898bdde.jpeg)


コマンドでクリップボードに保存したKeyをKey入力枠へペースト

Add Keyを押して、GitLabへの登録は完了になります。
NIFTY Cloud mbaas js SDK 2.0.0 on Node.js (Server)


NIFTY Cloud mobile backend の Javascript 版SDK が 2.0.0 でだいぶ変わっていますが、Node.js ベースになったとの事。
非ブラウザで Node.js で書き始めると色々とハマったので一番最初を書きます。

    var NCMB = NCMB || require("../lib/ncmb");
    var ncmb = new NCMB("your_apikey", "your_clientkey");

package.json を使ってアプリのフォルダの node_modules 配下にインストールした時に、これではパスの解決をしてくれなくて

    var NCMB = NCMB || require("ncmb/lib/ncmb");

とパスを指定したらすんなりロードしてくれました。

1.X 系の例を見たり、ブラウザ版の例を見たり、一頻り頭を悩ませた後に動いてみたら github の README のとおりという orz.


----
〜〜以下蛇足〜〜

試してみたけどダメだったのが、プロキシ認証ありのプロキシを通過できない。
ブラウザじゃなくてサーバーとしてNode.jsを起動したときに、プロキシの設定を見てくれていなかったり、getaddrinfo のエラーが出てるのでプロキシ前提じゃない処理が混じっているのか？


プロキシ認証なしはどうかというと、こちらもうまくいかない。
nodejs の起動スクリプト (Visual Studio が作るのは、デフォルトで `server.js`) の先頭の方で

    process.env.HTTP_PROXY = process.env.HTTP_PROXY || "http://proxy.your.domain:8080";


のように、環境変数にプロキシの設定をします。(実際の環境変数に設定していない人)


次に sdk をいじって、ncmb/lib/request.js の先頭の方に `+` マークの一行を追加

          var request = require("superagent");
    +     require("superagent-proxy")(request);

それから 110行あたりにも `+` マークの行を追加

       return new Promise(function(resolve, reject){
         var _callback = function(err, res){
           if(err) return (callback && callback(err, null)) || reject(err);
           if(res.statusCode >= 400 || res.status >= 400) return reject(res.error || new Error(res.text));
           return (callback && callback(null, res.text)) || resolve(res.text, res);
         };
         var r = request[method.toLowerCase()](url);
    +    r.proxy(proxy);
         Object.keys(headers).forEach(function(key){
           r.set(key, headers[key]);
         });

でも 403 でエラーになっちゃうんですよね。
OTAファイルを使ってNexus7(2013)をAndroid6.0にアップデートする

#はじめに
Nexus7(2013)はまだまだ現役。
残念ながらNexus7(2012)はLollipop(5.x)でアップデートが終わってしまったけど。
システムをいじっている人はOTAできないので、[Factory Image](https://developers.google.com/android/nexus/images)を素直に焼きましょう。

#準備
対応デバイスのファイルは[こちら](http://androidlover.net/android-6-0-ota-update-files)から。
Nexus7(2013)なら「6.0 MRA58K」と書いてあるリンクから。

#インストール方法
adb sideloadで導入する。
[こちら](http://androidlover.net/android-os/android-5-0-lollipop/nexus-update-lollipop-adb-sideload.html)に丁寧に方法が載っているので、これを参考にする。
adbが利用できない場合には、Android Studioをダウンロードして、Android ADB Interfaceのドライバを取得する。

##キャプチャ
うまくアップデートできた。成功。
![Screenshot_20151008-190548.png](https://qiita-image-store.s3.amazonaws.com/0/95484/49a50876-2ece-78ce-4b4e-74a9475a78af.png)
恒等関数とOption

- 恒等関数  

```scala
scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

// 恒等関数
scala> l flatMap identity[Option[String]]
res1: List[String] = List(Hello, World)
```

- おまけ  

```scala
for(x <- l; y <- x) yield y
```
"else if"を読み解く～なぜelifでもelsifでもelseifでもないのか～

elsifじゃなくてelse ifなんやでってだけの話なんですごめんなさい。

----

```ruby
if 式
  文
elsif 式
  文
else
  文
end
```

```c
if (式) {
  文
} else if (式) {
  文
} else {
  文
}
```

この **elsif** と **else if** の違いってなんじゃらほいってだけの話なんですごめんなさい。

elsif
====
**elseif** **elsif** **elif**
言語によって異なりますが、**if**条件に対して「ちがうそうじゃない～のときにー」ってやつです。
不思議でもなんでもないですごめんなさい。
ただ以下に示す通り、**if**と**else**がちゃんと実装されていればわざわざ**elsif**とか用意する必要あるのかな、文字1こ2この節約ってそんなに大事なのかな、それともこのほうが実装が簡単なのかな、って思っただけなんですごめんなさい。

else if
====
既にご存知の方はご存知の通り、知らない人は知ってもあまり美味しくありませんが、**else if**はこういう構文とかでも糖衣構文でもなんでもないです。ただの**else**と**if**です。
つまり、

```c
if (式)
{
    文
}
else
{                    // ←ここから
    if (式)
    {
        文
    }
    else
    {
        文
    }
}                    // ←ここまでの文って1命令だから、{ }が省略できる
```
ので、

```c
if (式)
{
    文
}
else if (式)
{
    文
}
else
{
    文
}
```
って書けるよねって話なんです。それだけなんですごめんなさい。

----

こんなどうでもいいことに貴重な時間を割いていただいてほんとごめんなさい。