OmniAICreator/Qiita-1.07M huggingface dataset:
[serverspec]Circular dependency detectedエラーが出てしまう

serverspecの初期設定をし

```　
bash-3.2$ bundle exec serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: y
Auto-configure Vagrant from Vagrantfile? y/n: y
 + spec/
 + spec/default/
 + spec/default/sample_spec.rb
 + spec/spec_helper.rb
 + Rakefile
 + .rspec

```
serverspecを実行すると下記エラーがでる

``` language:ruby
bash-3.2$ bundle exec rake spec
rake aborted!
Circular dependency detected: TOP => spec => spec:all => spec:default => spec:all

Tasks: TOP => spec => spec:all => spec:default
(See full trace by running task with --trace)
bash-3.2$ bundle exec rake spec --trace
** Invoke spec (first_time)
** Invoke spec:all (first_time)
** Invoke spec:default (first_time)
rake aborted!
````

https://saintaardvarkthecarpeted.com/blog/archive/2014/10/_Circular_dependency_detected__error_in_ServerSpec.html

によると、バグではないが仕様のようであるとのこと。

すでに修正ブランチができていて、マージ済みのようですね
https://github.com/serverspec/serverspec/pull/487

暫定でなおすにはRakefileで下記のコメントあうと

```language:ruby

namespace :spec do
  targets = []
  Dir.glob('./spec/*').each do |dir|
next unless File.directory?(dir)
targets << File.basename(dir)
  end

  task :all     => targets
  # task :default => :all #ここをコメントアウト
```
をしてあげれば実行できることが確認できた。
ただ、影響範囲がわからいので、とりあえず勉強のために動かすようの処置ってことで・・・
RedmineのREST APIのGET /issues/[id].xmlで取得した結果

メモです。

```xml
<issue>
  <id>15</id>
  <project id="1" name="Test1"/>
  <tracker id="1" name="バグ"/>
  <status id="2" name="進行中"/>
  <priority id="2" name="通常"/>
  <author id="5" name="Redmine Ayweak"/>
  <assigned_to id="6" name="Redmine User1"/>
  <category id="1" name="カテゴリA"/>
  <fixed_version id="1" name="1.0.0"/>
  <subject>test</subject>
  <description>テスト
ABC
abc</description>
  <start_date>2014-11-04</start_date>
  <due_date/>
  <done_ratio>20</done_ratio>
  <is_private>false</is_private>
  <estimated_hours/>
  <spent_hours>0.0</spent_hours>
  <custom_fields type="array">
    <custom_field id="1" name="カスタムフィールド">
      <value>ABCabc</value>
    </custom_field>
    <custom_field id="2" name="かすたむふぃーるど">
      <value>https://www.google.com/</value>
    </custom_field>
  </custom_fields>
  <created_on>2014-11-03T16:42:49Z</created_on>
  <updated_on>2014-11-09T13:46:39Z</updated_on>
  <closed_on/>
</issue>
```

下記、公式 Wiki にある出力例は、カスタムフィールドのところの `value` 要素が抜けてたりします。

http://www.redmine.org/projects/redmine/wiki/Rest_Issues

* * *

そもそもの生成処理がどうなっているか探してみました。以下で生成しているっぽいです。

http://www.redmine.org/projects/redmine/repository/entry/tags/2.6.0/app/views/issues/show.api.rsb

以下のやりとりやテストデータを参考に、なんとなく生成方法が分かるような分からないような。

"api and file type rsb - Redmine"
http://www.redmine.org/boards/4/topics/31907
http://www.redmine.org/projects/redmine/repository/entry/trunk/test/unit/lib/redmine/views/builders/xml_test.rb
script要素src属性の値がハッシュで始まる場合の挙動



知らなかったので、メモ。

例えば http://example.com/index.html に以下のタグが含まれていたとして、このURLにWebブラウザからアクセスした場合、１回のアクセスにつき、合計２回のHTTPリクエストがWebブラウザから送信される。 

```html
<script src="#"></script>
```

1回目のHTTPリクエストは通常のアクセスによるもの。2回目のアクセスは`script`要素が`src`属性に指定されたリソースを読みこみにいこうとして発生したもの。


当たり前かもしれないけど、以下のように`src`属性の値が空の場合は、2回目のアクセスは発生しない。

```html
<script src=""></script>
```

以下のブラウザで同じ挙動が発生した。

* Google Chrome 36.0.2125.111
* Firefox 33.0.3
* Safari 8.0
さくらのクラウドにCentOS7をISOイメージからインストール(ネットワーク設定での注意点など)

さくらのクラウドを使ったことがなかったので、CentOS7をインストールしてみた。
デフォルトで進めていったらネットワーク設定で詰まったが、しょうもない理由だったのでメモとして残しておく。
cf) リリースのニュース。7月には使えるようになっていた。
http://www.sakura.ad.jp/news/sakurainfo/newsentry.php?id=974
http://cloud-news.sakura.ad.jp/20107/17/public-archives-and-iso-images-update/

## サーバー作成まで
cf)[『さくらのクラウド』使ってみました。](http://techblog.clara.jp/2014/11/sakura_cloud/)
基本セットにCentOS7はないので、ISOで入れるしかない。

コア:1、メモリ:1GB、ディスクプラン:SSDのデフォルト設定
↓
「ディスクリソース」でブランク(空のディスク)を選択
↓
ISOイメージでCentOS7を選択
↓
サーバーの名前とかは適当に入れる。
下部の作成ボタンを押して、サーバ追加されるまで待つ。　

## インストール
Install CentOS 7 を選択してenter
↓
日本語を選択して、次へ。
↓
「ネットワークとホスト名」アイコンをクリック

## 自動接続設定
この接続が利用可能になったときは自動的に接続するをチェック
![auto.png](https://qiita-image-store.s3.amazonaws.com/0/7902/1484fead-c4a2-5cdd-ceca-9396de2d42af.png)
cf) [CentOS 7 をインストールしてみた](http://server-setting.info/centos/centos-7-install.html)

## IPv4のセッティング
### 各パラメータ入力
アドレス、ネットマスク、ゲートウェイは「NIC」タブに書いてあるものを入力すれば良い。
DNSはGoogle Public DNSの 8.8.8.8 を入力。
cf)https://developers.google.com/speed/public-dns/docs/using

※下図は参考なので、各パラメータは各自の値に変更する。 
![ipv4.png](https://qiita-image-store.s3.amazonaws.com/0/7902/04494c4a-2418-91af-1c88-348fa546081d.png)
cf) [CentOS 7.0 - インストール！](http://www.mk-mode.com/nanoc/2014/08/04/centos-7-0-installation/)
 
### ネットワーク設定で詰まったしょうもない理由
ネットマスクを255.255.255.0 で入力していたため、保存ボタンが押せない状態になっていた。
ネットマスクは24と入力すればよい。

## IPv6の無効化
IPv6 を使用しないので「IPv6 のセッティング」の「方式」を「無視する」に設定する。
![ipv6.png](https://qiita-image-store.s3.amazonaws.com/0/7902/da90872e-3761-641a-43c3-d5f2e4b76a1f.png)
cf) [CentOS 7.0 - インストール！](http://www.mk-mode.com/nanoc/2014/08/04/centos-7-0-installation/)


## 残りの設定
あとは、画面の手順通り進めて行けばOK。
↓
次画面でrootのパスワードを設定するよう促されるので入力。
↓
最後に再起動を促されるのでボタンを押す。
再起動が完了すれば、rootログイン出来る。
この時点で設定したIPアドレス(XXX.XXX.XXX.XXX)でssh接続できるようになっているはず。

```bash
$ ssh root@XXX.XXX.XXX.XXX
```

DNSも設定してあるので、yum も使えるようになっているはず。

## 補足(セキュリティなど)
デフォルトの設定のままだとセキュリティ的に非常に危険なので、
ssh鍵認証のみ有効にしてPWログインを無効にする、rootログインを無効にするなどを行ったほうが良いと思います。
使わないならサーバーを落としておいた方がいいかも。
どの程度のセキュリティ対策をすればよいのか、知りたい。。
Atomチートシート

# Atomチートシート
* 注意
 * チョロっと触り始めた段階なのでそもそも情報量少ないです
 * あくまでメモです（誤りもあるかも）

# 環境
* Windows7
* インストールは行わないでZipをダウンロードしてexeを起動する形で利用
 * 推奨はchocolateyによるインストール・管理らしい
* [ダウンロード元(atom.io)](https://atom.io/)


# コマンド
* **markdownプレビューのオープン**
`ctrl + shift + M`
    * .md拡張子のファイルはmarkdownとして扱われる
    * atom上でプレビューできるのはおいしい
    * プレビュー上で右クリックからHTMLとして保存とかも一応可能

* **コマンドパレット表示**
`ctrl + shift + P`
    * パレット上でinstall package と入力すれば、Atomのセッティング画面が開いてパッケージを検索、インストールできるようになる

* **プロジェクトツリーのトグル**
`ctrl + \`
    * 上記コマンドで、Atomの左側に、ツリーを開いたり閉じたりできる
* **セッティング画面表示**
`ctrl + ,`
    * セッティング画面が別タブで開く
* **行ジャンプ**
`ctrl + G`
    * カーソルを指定行に移動
    * このコマンドもそうだけど、他のエディタと同じコマンドが結構使える

# 便利パッケージ
* **Ask Stack**
    * [Stack overflow](http://stackoverflow.com/)からお手軽に情報を検索できる
    * 情報を検索のプログラミング言語の選択と、検索キーワードの指定が可能
    * 起動コマンド `alt + shift + A`

* **Atom Runner**
    * JSやRubyなどのscript系言語に対応
    * 上記ファイルを開いた状態で本パッケージを実行する
    * と、その内容を実行できる
    * 起動コマンド `alt + R `

* **Regex Railroad Diagram**
    * 記述した正規表現の可視化
    * ![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/40160/9afa05ed-e0b6-70c0-beaa-40f7e9db49e6.png)
    * 正規表現を記述した箇所にカーソルを合わせるだけでAtomの下段に可視化される
    * 専用の起動コマンド不要（というかない？）

# Emacs的なキーバインド
* Emacsのカーソル移動のキーバインドをAtomに設定する
* セッティング画面上のKeybindingsで今の設定が確認可能
* 個人用の設定はyour keymap fileから専用の設定ファイルを開いてメンテナンスする

* ![無題.png](https://qiita-image-store.s3.amazonaws.com/0/40160/d118ec48-2afb-d378-0a01-d16231ef1fb5.png)

* `ctrl + ﾁｮﾒ`で設定する事によって上書きしてしまったコマンドは`ctrl + shift + ﾁｮﾒ`で復活させる方針で設定した

```js:keymap.cson

'.platform-win32':
  'ctrl-f':'core:move-right'
  'ctrl-b':'core:move-left'
  'ctrl-n':'core:move-down'
  'ctrl-p':'core:move-up'
  'ctrl-shift-f':'find-and-replace:show'
  'ctrl-alt-shift-f':'project-find:show'
'.editor':
  'ctrl-a':'editor:move-to-beginning-of-line'
'.platform-win32 .editor':
  'ctrl-e':'editor:move-to-end-of-line'
'atom-workspace atom-text-editor':
  'ctrl-shift-a':'core:select-all'

```

| コマンド | 意味 |
|:-----------|:------------|
|ctrl + f|カーソルを右に移動（→） |
|ctrl + b|カーソルを左に移動（←）|
|ctrl + n|カーソルを下に移動（↓）|
|ctrl + p|カーソルを上に移動（↑）|
|ctrl + a|行先頭に移動|
|ctrl + e|行末尾に移動|
|ctrl + shift + a|ファイル内全選択|
|ctrl + shift + f|ファイル内検索|
|ctrl + shift + alt + f|プロジェクト内検索|

# 参考
* [アプギガ(基本情報)](http://plus.appgiga.jp/masatolan/2014/10/31/54305/?utm_content=buffer03013&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
* [qiita(基本情報)](http://qiita.com/blue_goheimochi/items/90f2901f053fff2b50d6)
* [qiita(キーバインディング)](http://qiita.com/umaisoba/items/3c2101f7804751a297af)
RubyでJSのURIエンコードを

元タイトル：JavaScriptのencodeURIComponentはRubyだとどう書く
（'14/11/22大幅変更）
#String クラスにメソッドを作るモンキーパッチ
JavaScript の encodeURIComponent と encodeURI と同じエンコードするメソッドを String クラスに作りましょう。

```rb
class String
  def encodeURIComponent
    unescaped_form = /([#{Regexp.escape(';/?:@&=+$,<>#%"{}|\\^[]`' + (0x0..0x1f).map{|c| c.chr }.join + "\x7f" + (0x80..0xff).map{|c| c.chr }.join)}])/n
    self.force_encoding("ASCII-8BIT").gsub(unescaped_form){ "%%%02X" % $1.ord } 
  end
  
  def encodeURI
    unescaped = /([#{Regexp.escape('<>#%"{}|\\^[]`' + (0x0..0x1f).map{|c| c.chr }.join + "\x7f" + (0x80..0xff).map{|c| c.chr }.join)}])/n
    self.force_encoding("ASCII-8BIT").gsub(unescaped){ "%%%02X" % $1.ord } 
  end
end
```
#文字列を引数を取るメソッド
encodeURIComponent() と encodeURI() と同じく文字列を引数に取るメソッドも作りましょう。

```rb
def encodeURIComponent(str)
  unescaped_form = /([#{Regexp.escape(';/?:@&=+$,<>#%"{}|\\^[]`' + (0x0..0x1f).map{|c| c.chr }.join + "\x7f" + (0x80..0xff).map{|c| c.chr }.join)}])/n
  str.force_encoding("ASCII-8BIT").gsub(unescaped_form){ "%%%02X" % $1.ord } 
end

def encodeURI(str)
  unescaped = /([#{Regexp.escape('<>#%"{}|\\^[]`' + (0x0..0x1f).map{|c| c.chr }.join + "\x7f" + (0x80..0xff).map{|c| c.chr }.join)}])/n
  str.force_encoding("ASCII-8BIT").gsub(unescaped){ "%%%02X" % $1.ord } 
end
```
#メソッド名
本当は `encode_uri_component` `encode_uri` にすべきかも知れませんが由来のわかりやすさ優先で。

#参考
- [URLエンコード/エスケープに使うメソッドごとの違い - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20131025/p1)
- [RubyでJSのURIエンコードを - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20141109/ruby_method_as_encodeURIComponent_in_javascript) （この記事のオリジナル）
- [ruby/httputils.rb at master · ruby/ruby | GitHub](https://github.com/ruby/ruby/blob/master/lib/webrick/httputils.rb)
[java8] 4回目：ラムダ式とStreamAPI

[前回：PermGenの廃止]
(http://qiita.com/yuusuke_s/items/16a63e6a311a3cde9fb6)

さて、StreamAPIとは何でしょう？どこかの説明を引用すると、
>StreamAPIとは、コレクションなどの集合体に対し、集計や処理を行うことを目的としている。

そうです。
とりあえず、サンプルを作って動かしてみましょう。

## StreamAPI
### 対象データの集計とソートを行う

``` java
	/**
	sで始まる名前を抽出し、降順にソートするサンプル
	*/
	public static void ramdaSampleFilterSort() {
		final String[] data = {"shimizu", "tanaka", "sasaki", "suzaki"};
		final List<String> list = Arrays.asList(data);

		// 1.7までの書き方
		List<String> ar1 = new ArrayList<>();
		for(String a : list) {
			if(a.startsWith("s")) {
				ar1.add(a);
			}
		}
		Collections.sort(ar1, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o2.compareTo(o1);
			}
		});
		System.out.println(ar1);

		// 1.8での書き方
		// Listからstreamを生成できる
		List<String> ar2 = list.stream()
				.filter(e -> e.startsWith("s"))
				.sorted((e1, e2) -> e2.compareTo(e1))
				.collect(Collectors.toList());
		System.out.println(ar2);
	}
```
結果
>[suzaki, shimizu, sasaki]
[suzaki, shimizu, sasaki]

* Listインタフェースに追加されたstream()から、streamを取得できます
* filter()メソッドで、sで始まる名前のみを抽出しています。
    * 引数は関数型インタフェースのため、ラムダ式を使います。
* sorted()メソッドでソートを行います。
    * 引数は関数型インタフェースのため、ラムダ式を使います。
* 最後、collect()で、StreamからListに変換しています。
* コード例のように、メソッドチェーンで書けます。


### 最大値を取得する

``` java
	public static void ramdaSampleFilterMax() {
		final Integer[] data = {111, 10, 34, 99, 1092, 3};

		// 配列からもstreamを生成できる
		Integer max = Arrays.stream(data)
			.max((e1, e2) -> e1.compareTo(e2))
			.get();

		System.out.println("max value is " + max);

		final Integer[] data2 = {10000, 345};

		// 二つのstreamを結合することもできる
		max = Stream.concat(Arrays.stream(data), Arrays.stream(data2))
			.max((e1, e2) -> e1.compareTo(e2))
			.get();

		System.out.println("max value is " + max);
	}
```

結果
>max value is 1092
max value is 10000


## 最後に

何となく雰囲気はつかめたのではないでしょうか？
シンプルなコードになることが分かりますね。

次回も引き続き、StreamAPIについて、別のサンプルを見てみたいと思います。
Vim初心者がVimを使って次のステップに行くのに役立つ10のこと


最初はクソ使いにくかったVimが、ようやく普通に編集するレベルならVimを使えるようになってきました。

そこで最初のころに困ったり、不便さを感じるであろうことをまとめました。

# 編集系

## ヤンクした内容が消えないようにする
ヤンクをした後に、`d`とか`x`を使って文字を消すと、ヤンクした内容が直前で消した内容で上書かれてしまいます。
こんな時は慌てずに`"0p`とするとヤンクした内容が復活します。

これをいちいち打つのは面倒ですし、覚えにくいので、キーマッピングを設定します。

```.vimrc
noremap PP "0p
```


### <おまけ>レジスタについて
ヤンクした内容はレジスタに保存されます。
特に何も指定しない場合は無名レジスタに保存されるのですが、ヤンクした場合はヤンクレジスタという別の場所にも保存されます。

`p`で貼付けをする時は通常無名レジスタを見ますが、レジスタの場所を指定することができるので、`"0p`でヤンクレジスタから貼付ける、っていうことになります。

ヤンクレジスタはヤンクしない限り上書きされることはないです。


## 複数行が連続してインデントできない！

ビジュアルモードで選択して > を入力するとインデントができます。
が、ビジュアルモードが解除されてしまうため連続して入力することができません。

そこで以下の設定を`.vimrc`に追加

```.vimrc
vnoremap > >gv
vnoremap < <gv
```

## 他のエディタはやってくれるのに閉じ括弧を補完してくない

各種括弧を入力したときに、自動で括弧を閉じるようにしたいです。

Enterキーを押したときだけ補完をするようにしたいので下記のようにします。


```.vimrc
inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap [<Enter> []<Left><CR><ESC><S-o>
inoremap (<Enter> ()<Left><CR><ESC><S-o>
```

ちなみにautocloseっていうプラグインがあるからそっちをいれてもいいかも
https://github.com/Townk/vim-autoclose


## 対応する括弧を素早く移動したい
括弧の上で`%`を実行すると、括弧の開始位置と終了位置を行き来できます。

# ファイル操作系

## 別のファイルを開きたい

以外とvim使い始めはこの辺でつまずく、というか不便さを感じてしまうのでは、、、と思っています。

vimで他のファイルを開く時は、

 * そのまま開く
 * 画面を分割して開く
 * タブで開く

の3種類あります。
`:`入力後のコマンドモードでファイルを指定します。

個人的にはある程度横に分割していって、タブで開くみたいな感じでやってます。

### そのまま開く
```
:e <ファイルパス> 
```

### 画面を分割して開く

縦に分割

```
:vs <ファイルパス>
```

横に分割

```
:sp <ファイルパス>
```

ウィンドウ間の移動

```
<Ctrl>-ww
```

### タブで開く

```
:tabnew <ファイルパス>
```

タブ間の移動

```
gt
```

### 開いたウィンドウを全部閉じる

```
:qa
```

## ファイルを開くのをもう少しスムーズにやりたい

コマンドモードで`%:h`とすると現在開いているファイルのパスが表示されます。
vimから他のファイルを開きたいときに重宝するので、こちらもキーマッピングします。

`%%`と入力することで、`%:h`と入力したときと同じ動作になります。

```.vimrc
cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h') . '/' : '%%'
```

# 検索系

## 単語として検索をマッチさせたい

```sample.txt
aaa

aaabbb

aaa
bbb
```

上記のようなテキストが合った時に単純にaaaで検索するとaaabbbもヒットしてしまいます。
ここをヒットさせずに単語としてaaaのみを検索するようにするには、

コマンドモードで

```
/\v<aaa>
```

とします。
\vを使うことで`<>`に特殊な意味を持たせることができます。

詳しくはvery magicとかで検索してみてください


## 検索結果のハイライトを消したい
```
:noh
```

no highlight　の略かな

ESCキーにマッピングしてもいいですね


## ビジュアルモードで選択中に開始位置がずれていた！ってとき
ビジュアルモードで`o`でカーソル位置が選択開始位置に移動します。
もう一度oを押すとカーソルが選択終了位置に移動します。

この辺使いこなすときっと解決します。


## ビジュアルモードで選択した範囲を検索したい
単語にカーソルを合わせて`*`を入力すると、その単語で検索します。
これと同じようにビジュアルモードで選択して`*`を押したときに選択した内容で検索をできるようにします。

ここはプラグインを使います。

https://github.com/nelstrom/vim-visual-star-search

```.vimrc
NeoBundle 'nelstrom/vim-visual-star-search'
```


## 番外編：キーリピートを高速化

Mac限定の設定ですが、カーソル移動を速くすることでVimでの作業が断然スムーズになります。

システム環境設定 > キーボード で
キーのリピートとリピート入力認識までの時間を設定しましょう！

![スクリーンショット 2014-11-09 19.52.32.png](https://qiita-image-store.s3.amazonaws.com/0/6808/5ffe2ce5-d790-2b10-7bcb-dee6089a6920.png "スクリーンショット 2014-11-09 19.52.32.png")

## 最後に
Vimは使えば使う程奥が深く、なんかvimをカスタマイズすることが目的になってないか？というような設定も多々見かけるんですが、その気持ちを少しずつわかってきました。

あんまりやりたくないのですが、、、

こんだけ書くなら晒せ！、っていわれそうなので一応vimrcを晒します。

https://github.com/ykyk1218/php_vim/blob/master/.vimrc

php_vimってなってますが、phpはあんまり関係ないです。
指定したパスのファイルがソケットファイルかどうか判定する


GoでCのS_ISSOCK的なことがやりたかったので、調べた。`os.FileInfo`の`Mode()`で判定すれば良さそうなんだけど、もうちょっと綺麗に書けないものか。

```go:is_socket.go
package main
         
import ( 
        "fmt"
        "os"
)        
         
func main() {
        // socket path
        sockPath := "/tmp/unix.sock"
         
        // check socket path
        fi, err := os.Lstat(sockPath)
        if err != nil {
                fmt.Println(err)
                return
        }
         
        // check if socket
        if (fi.Mode() & os.ModeSocket) == os.ModeSocket {
                fmt.Println(fmt.Sprintf("%s is a socket file", sockPath))
        } else {
                fmt.Println(fmt.Sprintf("%s is not a socket file", sockPath))
        }
}
```
一覧:開発関連

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/11/09/list_dev/)のほうで更新します。

ページが増えてきましたので、まとめてみました。
※5/1の分まで整理して記載してあります。

# iOSアプリ開発

* [画像追加](http://qiita.com/pgcmg00/items/1e946793e12e3e3d6c5a)
* [リポジトリにファイル追加](http://qiita.com/pgcmg00/items/ca1fe7bfbd93404d2c3e)
* [リポジトリにコミット出来ない](http://qiita.com/pgcmg00/items/0b94986290e8ae3a3b7e)
* [配列について](http://qiita.com/pgcmg00/items/1bc04ae3b07ad03c5f3a)
* [半透明の画像を表示](http://qiita.com/pgcmg00/items/efc8f39b503ff771454d)
* [エラー対策(Received memory warning.)](http://qiita.com/pgcmg00/items/626919c20ee2c56b8ced)
* [サスペンド時のEXC_BAD_ACCESS](http://qiita.com/pgcmg00/items/4620ff2edc97a70357aa)
* [OpenALで音連続再生時にエラー発生](http://qiita.com/pgcmg00/items/b981eb43605a031b801f)
* [プロジェクトで使うリソースファイルが読み込めない](http://qiita.com/pgcmg00/items/05d42fb3922900510a0a)
* [OpenGLで使う画像](http://qiita.com/pgcmg00/items/693665c4df4cb49e4add)
* [環境移行(Xcode4.6から7.2へ)](http://qiita.com/pgcmg00/items/3f70144d7844ba6051c4)
* [Apple審査提出](http://qiita.com/pgcmg00/items/1a0c0207efb04eaec016)

# Unity開発

* [プログラマの初めてのUnity](http://qiita.com/pgcmg00/items/79237ffb090b64b91710)

# PSM開発

* [データ保存、読込](http://qiita.com/pgcmg00/items/515e7ac0c9084b38ec93)

# Unixコマンド

* [よく使うもの一覧](http://qiita.com/pgcmg00/items/eaae4d2c8233f8ca977a)
FluentdでRuby DSLを使う


## Ruby DSLとは？
fluentdの設定のRuby DSL的な記法。

--use-v1-configでRubyのコードを設定に書くことが出来ますが、さらに柔軟な記法が可能になる。

以前調べていたことがあるので、まとめてみる。

## 実行方法

設定ファイルの拡張子がrbであればDSLモードで起動する

```bash
$ fluentd -c fluent.rb
```

## どう書く？
これが、

```fluent.conf
<match {foo,bar}.**>
  type stdout
</match>

<match hoge.**>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type file
    path /tmp/hoge.txt
  </store>
</match>

<source>
  type forward
</source>

```

こうなる。

```ruby:fluent.rb
match ('{foo,bar}.**') {
  type :stdout
}

match ('hoge.**') {
  type :copy
  store {
    type :stdout
  }
  store {
    type :file
    path "/tmp/hoge.txt"
  }
}

source {
  type :forward
}

```

## eachを使う

これだけだとちょっとメリットがわかりづらいので。

もうちょっとわかりやすく。

これが、

```fluent.conf
<match foo1.**>
  type stdout
</match>

<match foo2.**>
  type stdout
</match>

<match foo3.**>
  type stdout
</match>

<match foo4.**>
  type stdout
</match>
```

こうなる。

```ruby:fluent.rb
(1..4).each do |i|
  match ("foo#{i}.**") {
    type :stdout
  }
end
```

## ifで分岐

web系のサーバではtailするとか

```ruby:fluent.rb
source {
  type :forward
}

hostname = ruby.open('|hostname').read.strip

if hostname.include?('web')
  source {
      type :tail
      path "/var/log/httpd/access_log.ltsv"
      format 'ltsv'
      time_key 'time'
      time_format "%d/%b/%Y:%H:%M:%S %z"
      pos_file "/tmp/access.pos"
      tag "hogehoge.batch"
  }
end
```

三項演算子とか

```ruby
hostname = ruby.open('|hostname').read.strip
match ('hoge.**') {
  type :file
  path hostname.include?('web') ? "/tmp/web.txt" : "/tmp/batch.txt"
}
```


## 外部ライブラリ読み込む

dotenv使ってHIPCHATのtokenを隠蔽するとか

```ruby:fluent.rb

ruby.require 'dotenv'
Dotenv.load!
ruby.puts ENV['HIPCHAT_API_TOKEN']

match ('hipchat.**') do
  type :hipchat
  default_room '000000'
  api_token ENV['HIPCHAT_API_TOKEN']
  default_from 'fluentd'
  default_color 'red'
  default_notify 0
  default_format 'html'
end

```

openとかputsとかrequireなどのrubyの処理を記述する際は、prefixに`ruby`をつける必要がある。


## pluginのパラメータにArrayやHashを使う

plugin側が対応している必要があるが、ArrayやHashも使える。

```ruby:fluent.rb
name = 'user3'
match ('hoge.**') do
  type :hoge
  tags [ "java", "ruby" ]
  user  id: 3, name: name
  users [
    { id: 1, name: 'user1' },
    { id: 2, name: 'user2' }
  ]
end
```

* 上記の例ではtagsはArray、userはHash。
* usersの例のように改行して記述できる。(v1記法でも可能)


## td-agentで使う場合
/usr/sbin/td-agentを書き換える

```diff:/usr/sbin/td-agent
-ENV["FLUENT_CONF"]="/etc/td-agent/td-agent.conf"
+ENV["FLUENT_CONF"]="/etc/td-agent/td-agent.rb"
```
* 拡張子が.rbだったらdslで設定が読み込まれる。([参考](https://github.com/fluent/fluentd/blob/master/lib/fluent/config.rb#L23))


## 備考
* includeは現状は使えないが、[ここ](https://github.com/fluent/fluentd/issues/360)にissueが上がっている。
  * rubyなのでevalでゴニョゴニョやれば出来るかもしれない。。(未確認)
Intel EdisonにUbuntuで接続する。

#Breakout Boardに乗ったEdisonをUbuntu12.04からつなぐ
USBを両方つないでからシリアル接続で繋げばいける。PCはFTDIな方に挿す。
USB OTG側だけだとログインはできない。（ttyACM0と認識はされる。）※USBストレージとしては認識されるのでしばらく困る。またしょっちゅう切れて不安定。

以下コマンド
```
screen /dev/ttyUSB0 115200 -L
```

screenはCtrl+a Ctrl+dで抜けられる。

あとはこっちを参照
http://qiita.com/shrhdk/items/4e6ec9816e6d83c5a0d2

内部を見たらusb0というネットワークが作成されていて
そっちを見ていたので消す必要がある。
Rails 4.1 で bootstrap3-datetimepicker-rails を使う


Bootstrap 3 系に対応した日付入力の js ライブラリを Rails に導入する bootstrap3-datetimepicker-rails を試してみた。

TrevorS/bootstrap3-datetimepicker-rails
https://github.com/TrevorS/bootstrap3-datetimepicker-rails

## 環境

```shell-session
% bundle exec rake about
About your application's environment
Ruby version              2.1.3-p242 (x86_64-linux)
RubyGems version          2.2.2
Rack version              1.5
Rails version             4.1.6
JavaScript Runtime        Node.js (V8)
Active Record version     4.1.6
Action Pack version       4.1.6
Action View version       4.1.6
Action Mailer version     4.1.6
Active Support version    4.1.6
```

## 使ってみる

Gemfile に以下を追記して `bundle install`。

```ruby:Gemfile
gem 'momentjs-rails'
gem 'bootstrap3-datetimepicker-rails'
```

application.js.coffee に以下追記。

```coffee:application.js.coffee
#= require moment
#= require bootstrap-datetimepicker
```

application.css.scss に以下追記。

```scss:application.css.scss 
@import 'bootstrap-datetimepicker';
```

view で日付入力を使いたい text field に以下のように設定を行う。

- data-date-format 属性で入力時の日付時刻のフォーマットを指定
- bootstrap3-datetimepicker を有効にするため class に `datetimepicker` を指定

```erb:app/views/posts/_form.html.erb
<div class="controls">
  <%= f.text_field :published_at, data: { :date_format => 'YYYY/MM/DD hh:mm' }, :class => 'form-control datetimepicker', placeholder: 'YYYY/MM/DD hh:mm:ss' %>
</div>
```

class `datetimepicker` な要素に対して datetimepicker を有効にする。

```coffee:app/assets/javascripts/posts.js.coffee
$ ->
  $(".datetimepicker").datetimepicker()
```

これで text field をクリックすると以下のように日付選択用のポップアップが表示されるようになる。

![WS000076.jpg](https://qiita-image-store.s3.amazonaws.com/0/4048/030ba884-0f71-012b-e412-53fd9d89a9b0.jpeg "WS000076.jpg")

## 参考

jQuery - RailsにDateTimePickerを導入する - Qiita
http://qiita.com/kidachi_/items/9f76a27890d96b9f5838

コピペで動く bootstrap-datetimepicker - Qiita
http://qiita.com/tkosuga@github/items/3fcac7d176ad8cf5af1e

datetime pickerの導入 - JunxBoxWiki
http://www.wicurio.com/junkbox/index.php?datetime%20picker%E3%81%AE%E5%B0%8E%E5%85%A5

Bootstrap datetimepicker
http://eonasdan.github.io/bootstrap-datetimepicker/

[Rails]日付と時間の入力フォームにDateTimePickerを使う(bootstrap3-datetimepicker-rails) | hello-world.jp.net
http://blog.hello-world.jp.net/javascript/1762/
hubot環境構築


##hubotとは
github社が作成したオープンソースのbotフレームワーク。
Botなので定期的、自動的、トリガーによるプログラムの実行を行える。

例えばhipchatと連携してhubotに対して特定のキーワードによる処理実行などが行える（深夜の飯テロなどｗｗ）

hubotはNode.jsとcoffeescriptで作成されている。
なのでhubotを使いたい場合この2つは必須となる。
インストール事態はnpm(node package manager)を利用することで可能。


##インストール
hubotはcoffeescriptを利用しているのでとりあえず"coffeescript"をインストールしてやる。(node.jsに関しては既に環境構築済み version:0.10.24を利用)

```
npm install -g coffee-script
```

これでcoffeescriptのインストールができたので、実際にhubotをインストールしていく。
ネットで調べた所

```
npm install -g hubot
hubot -c hubot
```
とすればhubotの作成が出来るという記事を多く見つけたが、[hubot --c]は**非推奨**の様子。
yoman generatorを利用しろと言われてしまった。
というわけで"yoman"をインストールし、"generator-hubot"のインストールをしてやる。

```
npm install -g yo
npm install -g yo generator-hubot
```

問題なくインストールが成功したら

```
yo hubot -c [bot名]
```
でhobutの実行ファイルができる。
場所は[./bin/hubot]これを実行してやればhubotが実行される。
実行するといろいろな文字が表示された後に止まるのでエンターなどのキーを押してやるとコンソールに

```
Hubot>
```
と表示されhubotと対話できる状態になる。
ただ、初期の状態で実行しても何も反応してくれないので[scripts]ディレクトリ以下にスクリプトを追加してやる。

```hello.coffee
module.exports = (robot) ->
	robot.hear /hello/i, (msg) ->
		msg.send "hello"


	robot.respond /hoge/i, (msg) ->
		msg.send "fuga"
```
スクリプトの作成が終わったら、[cirl-c]でhubotを一度終了させ再度実行。
hubotが立ち上がったら

```
Hubot> hello		#自分の入力
Hubot> hello 		#hubotの反応
Hubot> Hubot hoge	#自分の入力
Hubot> fuga		 	#hubotの反応
```
となればscriptの実行に問題ない。


##サンプルスクリプトの入手？
他にもhubot関連のgeneratorを試しに入手して試してみたところスクリプトのサンプルになりそうなものがあったので一応記載

```
npm install -g yo generator-hubot-bot
yo hubot-bot
```
でプロジェクトを作成したあと
[./node_modules/hubot-scripts/src/]以下に何やらスクリプトがあったのでサンプルとして利用できそう。
(hubot-botの実際の利用用途してはわからなかったのでとりあえずはサンプル入手として利用しよう)

##補足
hubot関連のプロジェクトを指定して生成していたが、yoman側で管理しているので

```
yo
```
と入力すればインストールされているgenerator一覧が出てくれるので、そこから生成する方法でも問題ない。
Python で Twitter から情報収集 (MeCab による形態素解析編) 

# 形態素解析について
様々なユーザーの Tweet を収集して利用するパターンで最も多いのは、
Tweet 中に含まれる特定の単語を抽出して利用するパターンである。

今回は形態素解析器の MeCab を利用して、単語単位に分割して名詞、動詞、形容詞を抽出する。

* Python で Twitter からの情報収集 (環境構築編)
    * 環境構築等は[こちら](http://qiita.com/Salinger/items/081754e9e211135fa6d1)

# MeCabの出力形式
出力形式はオプションにより変わる。
* 'mecabrc': (デフォルト)
* '-Ochasen': (ChaSen 互換形式)
* '-Owakati': (分かち書きのみを出力)
* '-Oyomi': (読みのみを出力)

デフォルトだと
`表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音`
という出力になる。

# サンプルコード
ある文を単語単位(表層形そのまま)に分割して、

* 全単語
* 名詞のみ
* 動詞のみ
* 形容詞のみ

の4通りを取り出すプログラム。

```
#!/usr/bin/env python                                                                                                                                             
# -*- coding:utf-8 -*-                                                                                                                                            

import MeCab

### Constants                                                                                                                                                     
MECAB_MODE = 'mecabrc'
PARSE_TEXT_ENCODING = 'utf-8'

### Functions                                                                                                                                                     
def main():
    sample_u = u"ライ麦畑のつかまえ役、そういったものに僕はなりたいんだよ。馬鹿げてることは知ってるよ。でも、ほんとうになりたいものといったらそれしかないね。"
    words_dict = parse(sample_u)
    print "All:", ",".join(words_dict['all'])
    print "Nouns:", ",".join(words_dict['nouns'])
    print "Verbs:", ",".join(words_dict['verbs'])
    print "Adjs:", ",".join(words_dict['adjs'])
    return


def parse(unicode_string):
    tagger = MeCab.Tagger(MECAB_MODE)
    # str 型じゃないと動作がおかしくなるので str 型に変換
    text = unicode_string.encode(PARSE_TEXT_ENCODING)
    node = tagger.parseToNode(text)

    words = []
    nouns = []
    verbs = []
    adjs = []
    while node:
        pos = node.feature.split(",")[0]
        # unicode 型に戻す
        word = node.surface.decode("utf-8")
        if pos == "名詞":
            nouns.append(word)
        elif pos == "動詞":
            verbs.append(word)
        elif pos == "形容詞":
            adjs.append(word)
        words.append(word)
        node = node.next
    parsed_words_dict = {
        "all": words[1:-1], # 最初と最後には空文字列が入るので除去                                                                                                
        "nouns": nouns,
        "verbs": verbs,
        "adjs": adjs
        }
    return parsed_words_dict

### Execute                                                                                                                                                       
if __name__ == "__main__":
    main()

```

# 出力結果

```
(twi-py)$ python tweet_parser.py
All: ライ麦,畑,の,つかまえ,役,、,そういった,もの,に,僕,は,なり,たい,ん,だ,よ,。,馬鹿げ,てる,こと,は,知っ,てる,よ,。,でも,、,ほんとう,に,なり,たい,もの,と,いっ,たら,それ,しか,ない,ね,。
Nouns: ライ麦,畑,役,もの,僕,ん,こと,ほんとう,もの,それ
Verbs: つかまえ,なり,馬鹿げ,てる,知っ,てる,なり,いっ
Adjs: ない
```

# 最後に
これで parse() に取得した Tweet を食わせれば、単語の抽出ができる。

今回のサンプルコードは node.surface に入っている表層形の方を使ったが、
動詞などの語尾が変化する語を正規化したいなら、
node.feature の方に入っている原形の方を使えばよい。
グローバルIPをcurlで確認

## 概要
サーバのグローバルIPをcurlコマンドで確認する方法について

## curlコマンド
以下URLどれでもOK

* httpbin.org/ip

```bash
$ curl httpbin.org/ip
{
  "origin": "121.102.14.91"
}
```

* inet-ip.info

```bash
$ curl inet-ip.info
121.102.14.91
```

* ifconfig.me

```bash
$ curl ifconfig.me   #実行に時間かかる
121.102.14.91
```

## curlコマンドでサーバとのやり取りを表示したい時 
`-v, --verbose`オプションを付ける

```bash
$ curl -v httpbin.org/ip
*   Trying 23.23.223.197...
* Connected to httpbin.org (23.23.223.197) port 80 (#0)
> GET /ip HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< Server: gunicorn/19.7.1
< Date: Fri, 21 Apr 2017 05:38:49 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Content-Length: 32
< Via: 1.1 vegur
<
{
  "origin": "121.102.14.91"
}
* Connection #0 to host httpbin.org left intact
```

cf) [curlの使い方](http://sitearo.com/cocoa/0800_internet/curl/)

>
curlがサーバにどういうリクエストを送信して、サーバからどういうレスポンスが返ってきているかを見たいことがあります。この場合、「 -v 」オプションを付けておくと、このやり取りを表示することができます。
$ curl -v http://www.hoge.com/
>

## curlコマンドでサーバとのやり取りのヘッダー情報だけ表示したい時

-v, --verboseオプションを付けて、標準出力を`/dev/null`に捨てる

```bash
$ curl -v httpbin.org/ip > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 54.243.85.55...
* Connected to httpbin.org (54.243.85.55) port 80 (#0)
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0> GET /ip HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< Server: gunicorn/19.7.1
< Date: Fri, 21 Apr 2017 05:40:49 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Content-Length: 32
< Via: 1.1 vegur
<
{ [32 bytes data]
100    32  100    32    0     0     79      0 --:--:-- --:--:-- --:--:--    79
* Connection #0 to host httpbin.org left intact
```

cf) [curlでヘッダを見る方法いろいろ](http://qiita.com/takc923/items/1b508bb370c78b7a9d44)

>
--verboseオプションをつけるとリクエストヘッダ、レスポンスヘッダ、httpsならTLS handshakeの様子等が出力されるようになります。なので、--verboseをつけるとヘッダが見れます。
また、この"verboseな"情報は標準エラー出力に出力されるので、ヘッダだけ見たい、と言う時は標準出力は/dev/nullに捨てちゃうといい感じに見やすくなります。
>

## 参考リンク
* http request の レスポンスを JSON で返してくれるサイト
[httpbin(1): HTTP Client Testing Service](http://httpbin.org/) 

* プライベートIPとグローバルIPの説明など
[34.私のハッキングはなぜバレるのか。whoisコマンド。nslookupコマンド。ifconfigコマンド。]
(http://www.garunimo.com/program/linux/linux34.xhtml)
npmで6to5をインストールしようと思ってちょっとだけ詰まったのでメモ。


jasmineでのAngularのテストをes6で書きたいという話がチームで上がったので6to5を試してみることに。

```

npm install -g 6to5

npm ERR! 404 Not Found
npm ERR! 404 
npm ERR! 404 'acorn-ast-types' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of '6to5'
npm ERR! 404 
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.

npm install -g acorn

npm ERR! 404 Not Found
npm ERR! 404 
npm ERR! 404 'acorn-recast' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of '6to5'
npm ERR! 404 
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.

```

動かない。仕方ないので直接cloneしてきてmake buildとかして見るとこんなエラーに。
上記のもpromiseが見つからなかったせいかと思ってpromiseを先に-gでインストールしたら6to5も入った。

```
Error: Cannot find module 'promise' from '/Users/aizawa/dev/playground/6to5/node_modules/regenerator-6to5'
    at module.exports.cb (/~/6to5/node_modules/browserify/node_modules/resolve/lib/async.js:50:17)
    at process (/~/6to5/node_modules/browserify/node_modules/resolve/lib/async.js:119:43)
    at module.exports (/~/6to5/node_modules/browserify/node_modules/resolve/lib/async.js:128:21)
    at load (/~/6to5/node_modules/browserify/node_modules/resolve/lib/async.js:60:43)
    at module.exports.cb (/~/6to5/node_modules/browserify/node_modules/resolve/lib/async.js:66:22)
    at module.exports.isFile (/~/6to5/node_modules/browserify/node_modules/resolve/lib/async.js:21:47)
    at Object.oncomplete (fs.js:297:15)
make: *** [build] Error 1


npm install -g promise

npm install -g 6to5

```

試しに、

```
$ vi es6.js                                                                                   

let hoge = '123';
const hoge = '123';
```

で、コンパイルすると以下の出力。

```
$ 6to5 es6.js

"use strict";

var fuga = 111;
var hoge = 222;
```

block scopingとかどうなってるんだろうとか、_つけてるだけだったり。

```
"use strict";

var fuga = 111;
var hoge = 222;

if (true) {
  var _fuga = 333;
}

console.log(fuga);

```

CLIで動くREPLあるし、その他色々試したけどわりと問題なく解釈してくれる（moduleとかにも対応してるんだっけ）。
これだったらAltJS使わなくてもいいじゃないか。
とりあえずテストに関してはgulp-6to5を組み込んで運用してみる。
mac に rbenv 導入


# 状況

手持ちの mac(まだ 10.8.5/Mountain Lion…) に brew で入れていた ruby の version がコレ。

```bash
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin12.0]
```

ちょいちょい ruby の version を切り替えたい状況が生じたので、これを機に `rbenv` で管理するようにした記録。

# 作業ログ

一旦 ruby 消す。

```bash
$ brew uninstall ruby
```

`rbenv`, `ruby-build` を入れる。

```bash
$ brew install rbenv ruby-build 
```

`.zshrc` に追加。

```bash
$ echo 'eval "$(rbenv init -)"' >> ~/.zshrc
```

`.zshrc` を再読み込みする。

```bash
$ . ~/.zshrc
```

軽く動作確認。問題無し。

```bash
$ type rbenv
rbenv is a shell function
```

試した時点で最新安定版だった、`2.1.4` を入れておくことにします。

```bash
$ rbenv install 2.1.4
```

インストールが終わったら、`2.1.4` を global に設定。
global は、全ユーザが default で使う version って認識。

```bash
$ rbenv global 2.1.4
```

version 確認。OK。

```bash
$ . ~/.zshrc
$ ruby -v
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-darwin12.0]
```

以降、ruby 関連で変更が入ったときは都度 `$ rbenv reash` してあげる。
…んですが、`rbenv-gem-rehash` で自動化できるよ、って教えてもらったので、これ入れて忘れます。

```bash
$ brew install rbenv-gem-rehash
```
AndroidStudioで.gradle内のファイルが見つからないなどのエラー対処

AndroidStudioを起動した状態でPCが強制終了してしまい、
以降AndroidStudioを起動すると
.gradle内のcache.propertiesが見つからない(FileNotFoundException)といったエラーが起きてビルドができなくなってしまった。
※詳しいエラー内容をコピっておけばよかった
試しにリビルドしても復活せず。

対処法がAndroidStudio固有で、知らないとわからないのでメモ。

### 環境
Windows7 pro
Android Studio 0.8.14

### 対処

http://stackoverflow.com/questions/21066598/android-studio-0-4-2-gradle-project-sync-failed-error

の対処が参考になった。

1. File-> Invalidate caches / Restart　で invalidateを選択
2. AndroidStudioを終了
3. ユーザのホームディレクトリにある.gradleフォルダを削除かフォルダ名変更する
4. AndroidStudioを起動する。すると自動的に必要なファイルのダウンロードがはじまる
5. Gradleビルド成功
6. プロジェクトをリビルド
C言語におけるinclude文とgcc -Iオプションの関係

C言語のincludeまわりがよくわかっていなかったので調査してまとめました。
間違いなどありましたら指摘いただけると幸いです。

## `#include <stdio.h>`のstdio.hファイルはどこにあるのか？

答え：`/usr/include/stdio.h`

解説:

`#include <hoge.h>`
 と書くと、`/usr/include/`内からヘッダーファイル`hoge.h`が探索されて、存在すればそのヘッダーファイルの中身がinclude文のところに置き換えられる。
存在しなければコンパイルエラーになる。

## 任意の場所にあるヘッダーファイルを読み込みたいときはどうすればよいか？

### 方法その１:絶対パスで書けばよい。
例えば、`/opt/json-c/include/json-c/json.h` というヘッダーファイルを読み込みたいときは、

`#include /opt/json-c/include/json-c/json.h` 
と書けばよい。

ただ、Cのソースコード中にこのような絶対パスをハードコーディングしてしまうのは、環境依存の観点から好ましくないのは明らかである。(人や環境によってライブラリの所在場所は異なるので)

### 方法その２: コンパイラの-Iオプションを使う

cc(gcc)の-Iオプションで、ヘッダーファイルのあるディレクトリを指定することができる。
`gcc -I /opt/json-c/include/json-c hello.c`
こうすると、hello.cの中では
`#include <json.h>`
と書くことができる。

-Iオプションとinclude文は連結されて１つのパスを構成するので、下記のようにもできる。

`gcc -I /opt/json-c/include hello.c`
`#include <json-c/json.h>`

とか

`gcc -I /opt/json-c hello.c`
`#include <include/json-c/json.h>`

とか。

includeの探索の優先度は、

* -I オプションで命名されたディレクトリ
* /usr/include ディレクトリ

となっている。

なお、gccの場合は環境変数で探索ディレクトリを追加することもできる。
https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html#Environment-Variables

## #include "hoge.h"と<hoge.h>の違いは?

"hoge.h"のようにダブルクオーテーションでくくった場合は、そのソースファイルと同じディレクトリが、inclue最優先探索先として追加される。
yo angularした際にboostrapを読み込まないとデザインが崩れる

yo angularしたらデザインが崩れてしまいました(^_^;)

# angularアプリの生成

```bash:angularアプリの生成
yo angular
```
BootstrapのincludeオプションにNoを選択します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/62d2fe95-851d-0f04-8c9f-5abf94716533.png" width="340" />

grunt serveを起動します。--forceをつけています。

```bash:
grunt serve --force
```
ブラウザを見てみます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/880dd611-6124-6720-f9c2-23c07685a2fb.png" width="340" />

スタイルが崩れています＼(^o^)／。

一旦grunt serveを抜けます。

# bootstrapを追加

index.htmlのソースをみたら、bootstrapのクラスが当てられているようです。

bootstrapを読み込むことで対応できるかと思いました。
bower.jsonにbootstrapを追加します。

```json:bower.json
  "dependencies": {
    "angular": "1.2.16",
    "json3": "~3.3.1", 
    "bootstrap": "~3.2.0", // 追加
    "es5-shim": "~3.1.0"
  },
```
dependenciesにbootstrapを追加しました。

bower installでbootstrapをインストールします。

```bash:
bower install
```
bower_componentsディレクトリ以下にbootstrapが読み込まれているので、index.htmlにbootstrap.cssのパスを追加します。

```html:bowerコメントの間にcssのパスを追加
<!-- bower:css -->
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css">
<!-- endbower -->
```
bower:cssとendbowerというHTMLコメントがindex.htmlにあるので、このコメントの間にbootstrap.cssへのパスを追加します。

# 動作を確認

再びgrunt serveします。

```bash:
grunt serve --force
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/201b7009-0aa1-12d6-d4da-54d5d37ee9f6.png" width="340" />
いつもの画面が表示されました(☝ ՞ਊ ՞)

# 感想
yo angularでbootstrapを選択しないとデザインが崩れるんですね＼(^o^)／
勉強会運営の当日作業一覧

#はじめに
IT界隈では有志のIT勉強会がよく開かれます。
IT勉強会の代表的な形式がセミナー型で、技術に関する知見を発表しあい、質問・意見を共有するものです。
（また、勉強会の後にはパーティー形式や飲み会形式の懇親会が行われます）
皆様のIT勉強会に参加したいので、当日作業の一覧を書いていきます。
（なお、懇親会は、会場企業様から飲酒の許可を貰いパーティー形式で行う事を前提としています）

#会場設営
* 勉強会の1時間前に入場する。
  * 会場到着前に会場企業様へ連絡を入れる。
  * 会場設営を手伝ってくれる方がいる場合は一緒に入場する。
* 机・椅子を配置する。  
　* 配置を別の方へお願いする時は、配置方法を説明する。  
　　（ex.長机を10行3列で並べ、各机に椅子を3席ずつ入れて下さい）
* 参加受付の机を用意する。
  * 参加者一覧とボールペンを置く。
  * 参加受付を別の方へお願いする時は、参加受付の方法を説明する。  
　　（ex.来場者の方の行に丸を書いて下さい。又、来場者が懇親会に参加される場合は丸の中にチェックを入れ、懇親会の参加費を受け取って下さい）
  * 可能であれば、参加受付の窓口は複数用意する。
* プロジェクターの動作・WiFiの接続を確認する。
* 発表者・参加者向けの電源タップを用意する。
* お菓子・飲み物を用意した場合は、会場後ろに配置する。又、ゴミ袋を用意する。
* 会場へ案内する看板を置く。

#参加受付
* 登録アカウント名を聞き、参加費や名刺を受け取る。
  * 名刺を受け取る必要がある場合で参加者が持っていない時の対応は、会場企業様に聞く。
* 懇親会の参加・不参加を確認する。
  * 懇親会の参加をその場で決められない参加者がいる時は、後で懇親会の参加者を再募集をする。
* 名札を渡し、名前や関心事を書いて貰う。
* 必要に応じて、付箋紙やメモ用紙、ボールペンを渡す。

#開幕の挨拶
* 会場利用の注意を会場企業様の社員の方にお願いする。  
　（ex.トイレ・喫煙所・避難口の場所。WiFiのSSIDとパスワード、暗号化方式）
* 会の概要を説明する。  
　（ex.主催者の自己紹介、理念・コンセプト、取り扱い技術の範囲、運営方法、注意事項）
* お菓子・飲み物を用意した場合は、その旨を伝える。

#発表
* 発表者の方に発表準備（ex.プロジェクター接続等）をお願いする。
  * 発表準備に2・3分かかるので、その間にする作業を決めておく。  
   （ex.休憩、挙手による会場アンケート）
* 略語や分かりにくい箇所がある時は、その場で主催者が発表者へ質問する。
* 発表が延長しても良いように、休憩時間は長めに取る。
* 発表者が欠席しても良いように、代案を考えておく。
* 発表終了時点で、大声で質問を求める。
* 質問が終わった時点で、発表者へ感謝の言葉と共に拍手を贈る。

#アンカンファレンス（会議）
* アンカンファレンス司会者に２・3分程度のテーマ説明をして貰う。
* 複数のアンカンファレンスを同時に行う場合は、主催者・スタッフは参加者の少ない会に参加する。
* 最後に、アンカンファレンスのまとめを司会者に行って貰う。

#買い出し
* 懇親会参加の最終確認をする。
* 勉強会終了の30分以上前に、スタッフの方にお酒・つまみの買い出しをお願いする。

#閉幕の挨拶
* 一般参加者の方へ来場の感謝を伝える。
* スタッフ参加者や会場提供企業様へ感謝を伝える。
* ブログやSNSで、感想やまとめを書いて欲しい旨を伝える。
* 次回の予定が決まっている場合は、日程を伝える。
* 次回の発表者・アンカンファレンス司会者を募る。

#懇親会準備
* 電源タップを回収し箱や袋に入れて貰う。
* 机を配置して貰う。  
　（ex.長机を会場の中央に4個くっつけて並べ、それ以外の椅子や机は脇に寄せて下さい）
* お酒・つまみの配置して貰う。

#懇親会
* 乾杯の挨拶をする。

#懇親会片付け
* 片付けの合図をする。
* 飲み残しはトイレに捨てて貰う。
* 缶・瓶・燃えるゴミを分別して、ゴミ袋に入れて貰う。
* 長机を拭いて貰う。
* 床が汚れている場合は掃いて貰う。
* 来場の感謝を伝え、帰って貰う。

#後作業
* 会計報告する。
* まとめ記事や感想記事をブログやSNSで紹介する。
* 次回の勉強会をブログやSNSで告知する。
* 発表者やアンカンファレンス司会者に感謝のメッセージを贈る。

#関連ページ
　* [勉強会運営で用意する物品の一覧](http://qiita.com/nezuq/items/d92df588dedb9b228938)
　* [勉強会運営の事前作業一覧](http://qiita.com/nezuq/items/2baca138da93ede60186)

#備考
思いつき次第、加筆・修正していきます。

#感想
勉強会運営ハンドブックを誰かGithubで公開してくれー。
そして、みんなで育てるのです！

#本記事のライセンス
![by.png](https://qiita-image-store.s3.amazonaws.com/0/38787/6e02538c-ae34-ca12-fedc-989c840edaa7.png)
Can't exec "aclocal": No such file or directoryの対処法

OSXでjson-cをビルドしようとしたらエラーが出ました。

```
$  json-c [master] ./autogen.sh
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal  --output=aclocal.m4t
Can't exec "aclocal": No such file or directory at /usr/local/Cellar/autoconf/2.69/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory
```

"aclocal"というのは、"automake"パッケージに含まれているそうです。
なのでautomakeをインストールすればOKです。

```
brew instal automake
```
UnityのMecanim animationでフレームの時間を指定したい場合

むかしのAnimationクラスの場合

```
animation["Walk"].normalizedTime = 0.5F;
```

こんなふうに指定していたのをMecanimを使ったAnimatorから行いたい場合は

```
animator.ForceStateNormalizedTime(1.0f);
```

こんな感じ。
RomoSDKをSwiftで使う。【導入編】

#この記事について 

RomoSDKをSwiftで使う。【必ずハマるエラーとその解決法】も合わせてお読みください。
http://qiita.com/ken0nek/items/36ed1c9fa8d410bb3145

ソースコードはこちら。
https://github.com/ken0nek/RomoSwift

#まずRomoとは

Romoを作っている[Romotive社](http://www.romotive.jp/)のホームページにはこう書いてあります。

```
Romo（ロモ）はiPhoneなどで動く「体感型のエデュケーショナルロボット」で、誰でも動かすことが可能です。iPhoneアプリが頭脳の役割になり、様々な感情や動きを表現することができます。楽しみながら子どもの論理的思考や創造力、思考力を育むことができ、遊びや学びの幅がさらにひろがる可能性を秘めています。
```

#RomoSDKの導入方法1

まずはここからRomoSDKをダウンロード

http://www.romotive.com/developers/

ダウンロードし終わったら、解凍しましょう。

#RomoSDKの導入方法2

公式ホームページのQuickStartの"Setting up a project"[各種frameworkの追加・Info.plistの編集]までを終わらせてください。
http://www.romotive.com/developers-quickstart/

Objective-Cで書かれているRomoSDKをimportするためにBridging-Headerを作ります。

[【写真付きで簡単！】Xcode6でBridging-Headerを作る方法](http://qiita.com/ken0nek/items/da4f0d3ae2b8b639ab09)を参考にして、Bridging-Headerを作ってください。

#RomoSDKをimportする

先ほど作ったBridging-Headerに

```
#import <RMCharacter/RMCharacter.h>
#import <RMCore/RMCore.h>
```

と書き加えます。

#RomoSDKの導入完了！

これでプロジェクト内でRomoSDKを使えるようになりました。

RMCharacterだけを使う際は問題なくコンパイルできるのですが、RMCoreを使うときは現時点でコンパイルエラーが出ます。

エラーの解決法は、[RomoSDKをSwiftで使う。【必ずハマるエラーとその解決法】](http://qiita.com/ken0nek/items/36ed1c9fa8d410bb3145)を参考にしてください。

##第2回Romoハッカソンで"池澤あやか賞"をいただきました

食事中に笑顔になると、Romoが位置・大きさを調節して、自動的に写真を撮ってくれるアプリを作りました。

合わせてこちらもお読みください。

ハッカソン報告記事
http://www.romotive.jp/event/20141106/index.html

Swiftで笑顔認識をやってみた
http://qiita.com/ken0nek/items/4504a13bf58eb78c2538
RomoSDKをSwiftで使う。【必ずハマるエラーとその解決法】

#概要

RomoSDKをXcode6で使うとき、RMCharacterは問題なく使えるのですが、RMCoreをimportしてビルドするとエラーがでます。

ここではそのエラーの解決法を紹介したいと思います。

導入編はこちら
http://qiita.com/ken0nek/items/ccdfefe274bd00203957

#エラー状況

RMCoreをBridging-HeaderでimportしてからビルドするとRMCoreControllerPID.h内で以下の様なエラーが出ます

![Screen Shot 2014-11-09 at 14.05.25.png](https://qiita-image-store.s3.amazonaws.com/0/58141/a88014a2-ada2-af40-63df-80b49acbe425.png)

とにかく、"I"がいけないようです。

#エラーの解決方法

Bridging-Header内のRomoSDKをimportする前に

```
#undef I
```

と書き、Bridging-Header内を以下のようにするとビルドできる様になります。

```
#undef I

#import <RMCharacter/RMCharacter.h>
#import <RMCore/RMCore.h>
```

#確認

Bridging-Headerを書き換えてから、実行すると

![Screen Shot 2014-11-09 at 14.29.50.png](https://qiita-image-store.s3.amazonaws.com/0/58141/4166611c-a07f-a9e3-e0a1-444b0480bae8.png)

できました！

#参考

Romo Developer Community
https://www.facebook.com/groups/1429438217333021/

https://www.facebook.com/groups/1429438217333021/permalink/1493856084224567/
Macでペースト上のjavascript code をそのままcoffee script にして、ローカルファイルとして保存する。

=========


> 小ネタ。僕は便利と思ってます。


インストール

~~~$
npm install js2coffee -g
~~~


やり方

~~~$
pbpaste | js2coffee > instant.coffee
~~~

> 簡単！便利！

というか

~~~$
pbpaste | js2coffee | pbcopy
~~~

これだけで、コピペコンパイルできるし・・・

あとはautometerでショートカット作っておけば、いいっすね。
【写真付きで簡単！】Xcode6でBridging-Headerを作る方法

#Bridging-Headerの作り方

##Project Navigatorの適当なところで右クリック

![howtomakebridgingheader.png](https://qiita-image-store.s3.amazonaws.com/0/58141/c5864f03-3330-0b06-5ad1-f7ec71cad9f0.png)

##iOS -> Source -> Objective-C File を選択

![Screen_Shot_2014-11-08_at_14_29_50.png](https://qiita-image-store.s3.amazonaws.com/0/58141/7c262465-4192-e37c-09d8-44e19e34d652.png)

##適当な名前を入れる

![Screen_Shot_2014-11-08_at_14_30_16.png](https://qiita-image-store.s3.amazonaws.com/0/58141/55af79e6-934a-8ba3-96cd-5a4df0b0cad4.png)

##Bridging-Headerを作りますか？ -> YES!

![Screen_Shot_2014-11-08_at_13_40_52.png](https://qiita-image-store.s3.amazonaws.com/0/58141/a37ae1d6-6293-fa39-0169-cf66dbdf32a3.png)

とすると、プロジェクト内にBridging-Headerができると思います。

##完了

あとは、Bridging-Headerの中に、呼び出したいObjective-Cのヘッダーファイルを書けば、Swift側で使うことができます。

この手順で生成されたhoge.mは消去しても大丈夫です。
Elixir Choose Dictionary Type #elixir

# Elixir Choose Dictionary Type #elixir

## 概要
Elixir の Dictionary Type の選択について。

## Distionary の選択指針

|Type|指針|
|:--|:--|
|Keyword List|1つのキーを複数登録。例えば CLI のオプションで複数の値を取る場合など|
|Keyword List|順序を保証したい場合|
|Map|キーによるパターンマッチングを行いたい場合|
|HashDict|大量のデータを扱う場合|

## Keyword
http://elixir-lang.org/docs/stable/elixir/Keyword.html

~~~
kl = [key1: :value1_1, key2: :value2, key1: :value1_2]
# key に対応する value を全て取得。1 key に複数 vlaue 取得の例
IO.inspect Keyword.take(kl, [:key1])

kl |> Enum.each(&(IO.inspect &1))
~~~

* 出力

~~~
[key1: :value1_1, key1: :value1_2]
{:key1, :value1_1}
{:key2, :value2}
{:key1, :value1_2}
~~~

## Map
http://elixir-lang.org/docs/stable/elixir/Map.html

Map とパターンマッチの利用例

~~~
defmodule PersonDivide do
  def person(%{name: name, age: age}) when name == "tanaka" do
    "tanaka (#{age})"
  end

  def person(%{name: name, age: age}) when age <= 19 do
    "成年 #{name} (#{age})"
  end

  def person(%{name: name, age: age}) when age > 19 do
    "未成年 #{name} (#{age})"
  end

  def person(_e) do
    "invalid"
  end
end

people = [
  %{ name: "tanaka", age: 19 },
  %{ name: "tanaka", age: 20 },
  %{ name: "suzuki", age: 19 },
  %{ name: "suzuki", age: 20 },
  %{ name: "sato" }
]

people |> Enum.map(&(PersonDivide.person(&1))) |> Enum.each(&(IO.inspect(&1)))
~~~

* 出力

~~~
"tanaka (19)"
"tanaka (20)"
"成年 suzuki (19)"
"未成年 suzuki (20)"
"invalid"
:ok
~~~
Java入門：第9回 オブジェクト指向行く前へ

これまで9回にわたり、Javaの基本について説明してきました。この後はオブジェクト指向の話に進みますが、その前にここまでのチェックリストを掲載します。自分の理解度を確認してみましょう。

###【文法関係】

1. Javaプログラムを作成し実行できる
2. 左インデントを適切にとることができる
3. 変数を定義し利用できる
4. 繰り返しと条件分岐を利用できる
5. 配列を利用できる
6. メソッドを定義し利用できる
7. 引数と戻り値について理解している

###【エラー処理関係】

1. ソースコードに赤波線がでたり、右側に赤ばつがでた場合はエラーメッセージを確認し簡単なものは修正できる
2. 実行時にもエラーが起こることを理解している
3. 実行時のエラーは例外と呼ばれ、コンソール等に出力されることを理解している
4. 例外が発生したとき、コンソールから○○Exceptionと表示されることを理解している
5. ○○Exceptionを検索エンジンで検索することでどのような例外が発生したか調べることができる

###【Eclipseの利用法】

1. 赤波線が表示された場合、赤波線上にマウスカーソルを乗せ、エラーメッセージを確認し、クイックフィックスがある場合は適切なものを選択することができる。
2. Ctl+Spaceで表示される入力補助を利用できる
3. Ctl+Shift+Fでコードフォーマットをかけることができる
4. Ctl+Shift+Pで｛｝の対応を確認することができる
cakephpで画像アップロード：UploadPack導入とハマったところ



##cakeの画像アップロードプラグイン
cakeで画像アップ機能を入れる場合、
プラグインが断然便利らしい

調べたところ、
・Upload
・UploadPack
あたりが手軽でよさそう。

参考：http://hideharaaws.hatenablog.com/entry/2013/12/27/163403

UploadPackの方がヘルパーも含まれている上に、
カラム1行追加で導入できるってことで、君に決めた！

※ちなみに私の環境はこちら
　cakephp2.5.4
　CentOS-6.5-x86_64

##UploadPackプラグインの導入

シンプルに紹介してくれている記事があるので、基本沿うだけ
http://blog.livedoor.jp/spyder_5615/archives/25844290.html

【CentOSに直接ダウンロードするときメモ】
任意のフォルダに移動してwgetでダウンロード
`wget https://github.com/szajbus/uploadpack/archive/master.zip`
`unzip master.zip`
`cp -r uploadpack-master /var/www/html/(サービス名)/app/Plugin/uploadpack`
解凍して、uploadpackとフォルダ名を変え、Plugin直下にコピー

wgetやunzipが入ってなければ
`sudo yum install wget`
`sudo yum install unzip`
でインストールしてしまいましょー

ここまでやれば、ブログ同様にbootstrap.phpでロードすればOK
このまま無事に完了できる・・はずだった・・

##ハマりポイント：画像がアップされない！！

ブログ記事より
>【アップロードをやってみる】
完成した登録フォームから画像アップロードしてみる。
アップロード後に、app/webroot の下に
uploadっていうフォルダが出来ているはずです。

で・・できない・・なぜw
エラーも出ず、DBにはしっかりパスが入っているのだけど画像アップだけ無視。

調べてみると、
・php.iniの設定のせい(http://futuremix.org/2008/08/php-file-upload-problem)
・パーミッションのせい
大体そのへんらしい

私の場合はphp.ini確認したけど問題なかったので、どうやらパーミッション
ググって出てきたwordpressで画像アップできないって記事によると、
画像がアップされるフォルダは全部757にしろ！という指示があったので、
webrootのパーミッションを757に変更してみた

`sudo chmod 757 app/webroot`
`ls app/ -l`
↓
`drwxr-xrwx  7 vagrant vagrant 4096 Nov  8 08:08 webroot`

変更後、もう一度画像アップを試してみるとエラーが出た！

```
Error: Call to undefined function imagecreatefromjpeg()
File: /var/www/html/seedpod/app/Plugin/UploadPack/Model/Behavior/UploadBehavior.php	
Line: 269
```

ぬぬ？なにゃこれ
ググってみると解決策を発見！
http://ameblo.jp/vermillion71717/entry-10832449228.html
画像を操作するphp-gdなるものが必要らしい

コマンドとしてはこの２つ
`$ sudo yum -y install php-gd`
`$ sudo /etc/init.d/httpd restart`

もう一度画像アップをしてみる
エラーでない！！そしてフォルダできてるーーー！！！わーい／

無事解決しました！なにか問題ありそうだったらご指摘もらえると嬉しいです〜


###追記：helperによる出力方法

おそらくバージョンの問題だと思いますが、わたしの環境では記述されているものと異なっていました。
　× $this->Upload->image($user, User.img);
　○ $this->Upload->uploadImage($user, User.img);

この記載方法がなかなか見つからなかったので少しハマりました。
ご参考までに！
動的にSegmentedControlの数を変える方法


###目的:
 読み込むデータの種類によってどうしてもSegmentedControlの数をかえたかったので方法をいろいろ調べてきました。もっと簡単な方法があったら教えてください

###方法:
####①セグメントに表示するwordをあらかじめ準備する
あらかじめ表示するセグメントtitleを入れておくArrayを準備しておきます。今回は以下のようなArrayを準備しました。

```swift:ViewController.swift
let floorTags:[String] = ["B1F","1F","2F","3F","4F/5F"]
```

私が開発しているアプリ上、文字列で準備していますが、数字でも問題ないです。ただtitleはStringにする必要があるのでどこかでキャスティングが必要になるので注意です。
試したことはないですがiPhoneはセグメント数がMaxで5とのことなので要素が6だとどうなるかはテストしていないです。

####②セグメント数をtriggerとして受け取りobjectを生成
次にセグメント数を引数として先に定義したfloorTagsから必要数の要素を引っ張りだして新たにtitle用Arrayを生成します。

```swift:ViewController.swift
var segment:UISegmentedControl!

func floorSegmentView(floorNum:Int){
	let floors:[String] = [String](floorTags[0...floorNum])
	let segment = UISegmentedControl(items: floors)
}
```

簡単な説明です。segmentを選択したときのActionを設定する必要があるので先にsegmentを宣言しておきます。関数はfloorNumを引数にとり必要なsegment数を指定します。その後関数内で必要な要素数だけとりだしてfloorsを生成します。ここではまったのが単純にfloorTags[0...floorNum]だけだとArray要素として取り出されるので[String]でキャストしています。

####③addViewではりつけ
segmentedControlのobjectが生成できたので次はViewにaddViewします。要素数に応じて位置ずれを防ぐために以下のような計算を入れてframeのwidthを計算しています。

```swift:ViewController.swift
var viewWidth = self.view.frame.width
var segmentFrameWidth = Int(viewWidth)-20
        
segment.frame = CGRect(x: 0, y: 0, width:segmentFrameWidth, height: 30)
segment.selectedSegmentIndex = 0
segment.frame.offset(dx: 10, dy: 480)
segment.tag = 1
        
self.view.addSubview(segment)
```

これで動的にsegment数を変えることができます。

###今後:
Proto試作なのでべた書きで書いてしまったので、できればUISegmentedControlのextentionとかで書き直した方が汎用性がありそうです。