OmniAICreator/Qiita-1.07M huggingface dataset:
PHP BLT に参加してきました in Tokyo

# 詳細と雰囲気について

http://phpblt.connpass.com/event/35070/
> 「PHP BLT」 とは参加者全員が Tips を発表(Lightning Talk)する というコンセプトの PHP 周辺エンジニア・Web/サーバーサイド全般の勉強会です

らしいです。　以下写真。

イケメンエンジニアが主催で悔しいいいいい！
![13843525_1034592399942596_93487509_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/114382/3913e7b9-fb5a-e8dd-5089-ea4c57a961bf.jpeg)

会場はGMOさん！キラキラ社員さんが受付してくれてまたもや悔しいいいい思い！
![13838570_1034593096609193_1549410669_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/114382/7482164a-7008-e052-d496-03f8802f52e3.jpeg)

豪華なお食事が支給され
![13833336_1034593086609194_1014517058_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/114382/562ee550-3fb1-463b-561b-2b2fdaa5ecfc.jpeg)

アルコールも選り取り見取り！
![13838478_1034592726609230_854180201_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/114382/fc9d0e1a-2cdc-a1ae-4c24-b3b2cea75e41.jpeg)


はい、最高な環境と雰囲気で楽しかったです。
気になった方は次回、是非行ってみてください！（ここまでで記事書く力を使い果たした）


## 勉強会について（頑張って書く）
- 参加してよかった点
 - 外部のエンジニアがどんなことに課題を抱え解決しているのかがわかった
 - 新しい技術、初心者・玄人向け、ネタや尖ったプレゼン等で飽きない
 - 自分は新人エンジニアで、しかもPerlプログラマーなのでキャッチアップできるか心配だったが、ついていけない時は逆にもっと教えてくださいと話しかけるチャンス☆
 


- 心に残ったプレゼンや言葉
 - YDD = 嫁 ドリブン ディベロップメント # 嫁と技術への接し方
 - 社内課題その1 = 画像ファイルを別サーバーに移し替えた話
 - 社内課題その2 = レガシーコードあるある
 - 自作モジュール 自作ライブラリ

僕も久々にPHP触りたいなと思いまいたとさ。
それにしてもいっぱいメモ取ったのに一切公開していなくて勿体無いので、次回時間があればじっくりアウトプットします。

### ライブラリー
![13621323_1034592929942543_930576107_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/114382/4db03aa0-58bd-30df-cab6-31d890017e9d.jpeg)

![13662526_1034592769942559_1781610850_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/114382/8bfaab4d-691c-2fb2-d206-a60f9fafa221.jpeg)

![13833367_1034592889942547_2096949527_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/114382/f2fa454a-56ca-8d57-bf94-0ade96bc08f0.jpeg)
try(:each)

Object#tryメソッドがすごく便利。
オブジェクトがエラーを吐くのを防いでくれる。

例えば、instance.name でinstanceのnameを参照しようとする場合、
instanceがnilであれば、オブジェクトがないよとエラーを吐いてしまう。

```
NoMethodError: undefined method `XXXXX' for nil:NilClass
```

 エラーを吐いた場合の処理も書く必要があって記述が面倒。

instance.try(:name)でinstanceが存在する場合にのみ、instanceのnameを参照することができるので、エラーが起こらずスッキリ書ける。

他にも、instance.try(:each) do|| ~ end などとも使用できる。
メソッド名が標準に従っていなかっただけで、SwiftとObjcのブリッジングエラーでハマった話

## 問題

Objective-C で定義した protocol を、Swiftで書いた class で継承してみたら`does not conform to protocol...`エラーが出てしまった。

required method が実装されていないときのエラーなのだが、XCodeの補完に従って全てを定義したので、何が問題なのかさっぱりわからなかった。

問題の protocol

```objc
@protocol HogeDelegate <NSObject>
- (void) hogeAction:(Hoge*)hoge Error:(NSError*)error;
@end
```

問題の implementation

```swift
extension FugaViewController: HogeDelegate {
    func hogeAction(hoge: Hoge!, error: NSError!) {
        // nothing is implemented
    }
}
```

## 原因・解決策

こう整理すると「おや」と気づくかもしれないが・・・Objective-Cで定義した protocol の命名が一般的な規則からはずれており**Error**の先頭が大文字になっているのが原因。

XCodeが変換したメソッドはerrorが小文字になっているから、名前解決ができなかった模様。
標準的な下記の様な命名に直したらすんなりうまくいった。

```objc
@protocol HogeDelegate <NSObject>
- (void) hogeActionFailed:(Hoge*)hoge withError:(NSError*)error;
@end
```

## 結論

命名、大事
WebRTCを試すときにオッサンが映り続ける問題に対処する

# はじめに
WebRTCを使ったアプリを作る際に、切っても切れないのがカメラ映像の取得です。ノート型のPCで作業したりすると、延々と自分の顔を見続けなければなりません。そこで、自分の顔の替わりに好きな動画をメディアストリームとして流すサンプルを作って見ました。

# 仕組み

## 動画ファイルの変換

* ユーザにローカルの動画ファイルを指定してもらう（ファイル選択 or ドラッグ＆ドロップ）
* FileオブジェクトからURLを生成 (window.URL.createObjectURLを利用）
* それをVideoタグで再生
* 継続的にCanvasタグに転写 (window.requestAnimationFrameを利用）
* CanvasタグからMediaStreamを取り出す (Canvas.captureStreamを利用）
![video_to_stream.png](https://qiita-image-store.s3.amazonaws.com/0/19403/70661237-8b34-58ba-e3e4-b11defd76623.png)

## 音声ファイルの変換

* ユーザにローカルの音声ファイルを指定してもらう（ファイル選択 or ドラッグ＆ドロップ）
* FileReaderでファイルを読み込む
* WebAudio API デコード、再生
* WebAudio API の createMediaStreamDestination でMediaStreamを取り出す
![audio_to_stream.png](https://qiita-image-store.s3.amazonaws.com/0/19403/4cf049a6-90d5-45d3-80b3-5876b7e96ddd.png)

## 動画と音声の結合

* 新しく MediaStreamのオブジェクトを用意
* 動画ファイルを変換した MediaStream から Video Trackを取り出し、新しいMediaStreamに渡す
* 音声ファイルを変換した MediaStream から Audio Trackを取り出し、新しいMediaStreamに渡す
![combine_video_audio.png](https://qiita-image-store.s3.amazonaws.com/0/19403/80327376-1d49-bca0-09fc-cf754090840a.png)

```js:combine
    convertedStream = new MediaStream();
    convertedStream.addTrack(duplicateStream.getVideoTracks()[0]);
    convertedStream.addTrack(audioOutputStream.getAudioTracks()[0]);
```

# やってみよう

実際にローカルの動画ファイル/音声ファイルからメディアストリームを取り出すサンプルを作ってみました。ChromeかFirefoxでご利用ください。

* GitHub Pages で試す [file_to_stream.html](http://mganeko.github.io/webrtcexpjp/tool/file_to_stream.html)
* GitHub でコードを見る [file_to_stream.html](https://github.com/mganeko/webrtcexpjp/blob/master/tool/file_to_stream.html)　(※リンク先修正 2016.07.28)

ローカルに映像ファイルと、音声ファイルをご用意の上、こちらの手順で試してください。（音声だけや、映像だけの変換もできます）

![file_to_stream_operation.png](https://qiita-image-store.s3.amazonaws.com/0/19403/45fff998-f91e-6b9d-a521-4ad41c8ea8b6.png)

※今回はこちらの[NHKクリエイティブライブラリ](http://www1.nhk.or.jp/creative/)の素材を使わせていただきました。

変換したメディアストリームは、こちらにセットしてあるので、あとは焼くなり煮るなりRTCPeerConnectionで通信するなり、好きにご利用ください。

```js:
let convertedStream;
```

# 注意点

* requestAnimationFrame()は、該当のタブ/ウィンドウが隠れてしまうと全く呼び出されません。変換を行っているタブ/ウィンドウが一部でも表示されている状態にしてください
* Chrome 52の場合は変換に使っているCanvasのスタイルを display:none; にすると変換後の動画が停止してしまいます
* Firefox 47の場合、Canvasの描画や変換後の映像がチラつく場合があります。その時は変換に使っているCanvasのスタイルを visibility:hidden; や display:none; に変更すると改善します
* Firefox 47の場合に変換後の convertedStream を RTCPeerConnetionに追加(addStream)しようとするとエラーになります
    * NotSupportedError: track in constructed stream not yet supported (see Bug 1259236) )
    * 現在の制約として new RTCPeerConnectionで生成したオブジェクトにトラックを追加すると通信には使えないようです
    * Canvasから取り出した映像だけのメディアストリームは通信に使うことができました
* ローカルの動画ファイルの代わりに他のサーバーの動画ファイルを指定しての変換もできそうですが、そうではないようです
    * Canvasへの複写までは可能です
    * メディアストリームを取り出すことは出来ませんでした
    * ドメインが異なると禁止されているのかもしれません（詳しい方がいたら教えてください）

# おわりに
ローカルファイルをメディアストリームに変換する方法をご紹介しました。まだブラウザごとに細かい挙動が違ったりするところもありますが、あらかじめ用意したメディアを配信する用途に使えるのではないでしょうか。
※既存の動画/音声ファイルを使う場合には、その利用条件は尊重してご利用ください。よろしくお願いします。

[HTMLExperts.jp](https://html5experts.jp/) というサイトで[「WebRTC入門2016」](https://html5experts.jp/series/webrtc2016/)という記事も書いているので、WebRTCにご興味を持たれた方はそちらもご覧いただけると嬉しいです。
RubyでJava風ストリーム出力


ファイルの出力のとき、CSV, GZIP, File書き出し、といったように複数の処理を経ることがあります。これらを個別に行うとメモリを大量に消費しますが、ストリーム処理にすれば少しずつ処理されるので省メモリで済みます。また、処理がオブジェクトでカプセル化されるので、インスタンスを取り回したり、さらにラップしたりできます。

欠点は1パスで出力するので途中で戻って最初の方の内容を書き直したりできない点と、begin rescue end のブロックが増える点です。

Rubyではほとんどのサンプルコードがブロックで書かれていますが、実はJavaのようにストリーム処理が可能です。この記事では出力ストリームをJava風に書いてみます。

■ちなみに入力ストリームについては
[RubyでJava風ストリーム入力](http://qiita.com/nogayama/items/c06a4e076122425f1948)
に書いていますのでご参考ください。

```rb
require 'tempfile'
require 'csv'
require 'zlib'

file_path = Tempfile.new().path
table = [
  ['a', 'b'],
  ['c', 'd']
]

#######################
puts "Java 風に  FileWriter"
writer = File.new(file_path, 'w')
begin
  table.each do |row|
    row.each do |elem|
      writer.write(elem)
      writer.write(',')
    end
    writer.write($/)
  end
ensure
  writer.close
end
puts File.open(file_path).read

#######################
puts "Java 風に  GzipWriter -> Writer"
writer = File.new(file_path, 'w')
writer = Zlib::GzipWriter.new(writer)
begin
  table.each do |row|
    row.each do |elem|
      writer.write(elem)
      writer.write(',')
    end
    writer.write($/)
  end
ensure
  writer.close
end
puts Zlib::GzipReader.new(File.open(file_path)).read

#######################
puts "Java 風に  CSVWriter -> Writer"
writer = File.new(file_path, 'w')
csv_writer = CSV.new(writer, {col_sep: ',', row_sep: $/});
begin
  table.each do |row|
    csv_writer.puts(row)
  end
ensure
  csv_writer.close
end
puts File.open(file_path).read

#######################
puts "Java 風に  CSVWriter -> GzipWriter -> Writer"
writer = File.new(file_path, 'w')
writer = Zlib::GzipWriter.new(writer)
csv_writer = CSV.new(writer, {col_sep: ',', row_sep: $/});
begin
  table.each do |row|
    csv_writer.puts(row)
  end
ensure
  csv_writer.close
end
puts Zlib::GzipReader.new(File.open(file_path)).read

```
【iOS】UIButtonのタップ領域だけを拡大する

アプリ開発をしていると、実機でデバッグした時にボタンのタップ領域が狭くて押しづらいと思うことがよくあります。
ボタンのサイズを大きくすることで解決することはできますが、アプリの見た目が不格好になってしまうため、デザイナーさんからのOKは貰いないかと思います。

この記事ではボタンのサイズを大きくすることなく、ボタンのタップ領域だけを拡大する方法を紹介したいと思います。

# 実装
まずは __UIButton__ を継承した __ExpansionButton__ クラスを作ります。

```ExpansionButton.swift
class ExpansionButton: UIButton {
}
```
拡大するタップ領域の範囲を保持するプロパティ __insets__ を追加します。

```ExpansionButton.swift
class ExpansionButton: UIButton {
	var insets = UIEdgeInsetsMake(0, 0, 0, 0)
}
```

次にUIButtonのタップ領域を拡大するの処理を記載しますが、まずはタップイベントが発火するまでの流れを簡単に説明したいと思います。

画面上のどこかをタップした時、UIViewの`hitTest:withEvent:`メソッドが呼び出されます。
このメソッドの中でさらに`pointInside:withEvent:`メソッドが呼ばれ、`true`が返された場合にそのViewのタップイベントが発火します。
つまり、`pointInside:withEvent:`メソッドの中でViewのサイズを偽造してしまえば、Viewの領域外からでもタップイベントを発火させることができるのです。

上記の説明を踏まえ、 __ExpansionButton__ クラスの実装は最終的に以下のようになります。

```ExpansionButton.swift
class ExpansionButton: UIButton {
    
	var insets = UIEdgeInsetsMake(0, 0, 0, 0)
    
	override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
		var rect = bounds
		rect.origin.x -= insets.left
		rect.origin.y -= insets.top
		rect.size.width += insets.left + insets.right
		rect.size.height += insets.top + insets.bottom
		
		// 拡大したViewサイズがタップ領域に含まれているかどうかを返します
		return CGRectContainsPoint(rect, point)
	}
}
```

使い方は以下のようになります。

```ViewController.swift
class ViewController: UIViewController {
    
	@IBOutlet weak var button: ExpansionButton!
    
	override func viewDidLoad() {
		super.viewDidLoad()
		button.insets = UIEdgeInsetsMake(50, 50, 50, 50)
	}
	
	...
}
```

# おわりに
この記事ではUIButtonを例に記載しましたが、UIViewを継承していれば `pointInside:withEvent:`メソッドが呼ばれるので、他のViewでもタップ領域を拡大することができます。
cakephp3 で clone を使う。

# CakePHP3 の query の挙動で困った。  
※追記あり

CakePHP3 を使っていて、困ったことがあった。
以下、例。

```php
$university = ['A大学', 'B大学', 'C大学'];

// 使いまわしたいquery
$query = $this->Models->find()->where(['Models.id >=' => 10]);

foreach ($universies as $university) {
    // query を使い回す
    $array = $query
        ->where(['Models.university' => $university])
        ->toArray();
    //何かしらの処理
    ・
    ・
    ・
}
```

この処理を実行すると、うまく望み通りの処理ができない。
理由は、 `where句` がオブジェクトそのものを書き換えてしまうから。

つまり。。。

```php
1周目
->where(['Models.university' => 'A大学'])

2周目
->where(['Models.university' => 'A大学'])
->where(['Models.university' => 'B大学'])

3周目
->where(['Models.university' => 'A大学'])
->where(['Models.university' => 'B大学'])
->where(['Models.university' => 'C大学'])

```
になるということだ。
これでは不便で使えない。
困っていたら、隣の人に答えを教えてもらった。

その答えとは。。。

# clone

PHP の機能で、 `clone` というものがある(ということを今日知った。)
[オブジェクトのクローン作成](http://php.net/manual/ja/language.oop5.cloning.php)
コメント欄に、`11 years ago`のものがあるので、超昔からある機能らしい。
が、知らなかった。
というか、初心者の人はこんなの知らないはずだ。

ということで、使い方を書く。

```php
$university = ['A大学', 'B大学', 'C大学'];

// 使いまわしたいquery
$query = $this->Models->find()->where(['Models.id >=' => 10]);

foreach ($universies as $university) {
    // query を使い回す
    $searchQuery = clone $query;
    $array = $searchQuery
        ->where(['Models.university' => $university])
        ->toArray();
    //何かしらの処理
    ・
    ・
    ・
}
```

という風に、一行足すだけ。
超簡単だ。

ということで、どんどんForeach を回して SQL を発行しまくろうと思う。

## 追記

この記事を公開した所、社内から非常に有益な情報をいただいた。  
それは、 `cleanCopy()` というメソッドがあるという情報だ。  
[CakePHP3 公式 cleanCopy](http://api.cakephp.org/3.1/class-Cake.ORM.Query.html#_cleanCopy)  

上記で書いた、`clone` を使った `query` のコピーと一緒(内部の挙動までは終えていないが)のことが
単にメソッドを生やすだけでできるので超簡単だ！

是非、試してみてください！
RailsのModel名を効率よく決める方法

## 概要：手順を思いついた背景
伊藤さんのブログを読んで命名の優先順位は「可算名詞 > 不可算名詞　> 動詞」であれば良いという法則に気付いた。  
それなら、手順に沿って効率よく命名を決められるのではないかと考えたので僕なりの手順を共有したいと思います。  
出来る限り開発スピードを速めるためにも悩まず効率良くModel名を決定したい。  
参考記事：[モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう](http://qiita.com/jnchito/items/459d58ba652bf4763820)

## 命名決定までの流れ
- [http://ejje.weblio.jp/](http://ejje.weblio.jp/)で思いついた名詞を検索し、「動詞」でページ内検索する。見つからなければ名詞なので採用。
- ページ内検索によって動詞としての使用用途があることが確認出来れば`「～」の派生語`の箇所を見て、名詞として派生している英単語がないか探す。  
その動詞の名詞版の英単語が見つかれば採用。  
※「pay」で検索すれば`「pay」の派生語`と書かれた箇所に「payment(名詞)」が載っている
- 名詞版の英単語が見つからなければ「可算」でページ内検索し、不可算名詞なのか可算名詞なのかを調べる。  
不可算名詞であれば、他の可算名詞になりそうな単語を`「～」の意味に関連した用語`の箇所から探す。  
※例えば「work」で検索した時に`「work」の意味に関連した用語`の箇所に「仕事」というリンクが見つかる。これをクリックすれば「job」という別の言い回しが見つかる。

## まとめ：時間がかかりそうな作業が発生したら出来る限り手順にして効率化を図りたい
僕は今プログラムのマニュアルなどを英語で読めるように少しずつ勉強を進めています。  
英語を習得するまでは、出来る限りweblioや翻訳サイトなどを使って調べるようにして単語を覚えていけるようにしたいです。  
最終的には、調べなくても以前調べた知識で進められるのが理想です、がんばります！！
[PHP] PowerShell で Composer のインストールから実行まで全自動で出来るスクリプトを作りました

PHP も PowerShell もそこそこ使うというユーザーがどのくらい居るかわかりませんが, そんな方々のための便利ツールを作りました.
Composer のインストールから実行までこのファイル 1 個だけで完結するお手軽スクリプトです.

ダウンロードはこちらから.
https://gist.github.com/trashtoy/6d6054d39293df1df3ff473765a6d1b4

## デモ
- スクリプトを `C:\hoge\fuga\composer.ps1` に配置
- カレントディレクトリは `C:\foo\bar\baz` (中身は空っぽ)

という前提でこのスクリプトを実行した場合の出力サンプルです.

```
C:\foo\bar\baz> C:\hoge\fuga\composer.ps1 --version
Downloading composer installer ...
Installing composer.phar ...
Composer version 1.2.0 2016-07-19 01:28:52

C:\foo\bar\baz> C:\hoge\fuga\composer.ps1 --version
Composer version 1.2.0 2016-07-19 01:28:52

C:\foo\bar\baz>
```

初回実行時は composer.phar のダウンロードとインストールの処理が走るので若干時間がかかります. (`C:\hoge\fuga\composer.phar` というパスで Composer がインストールされます)
2 度目以降の実行では Composer のダウンロードと初期化が既に終わった状態なので, 通常の composer のコマンドと同じ要領でお使いいただけます.

## インストール
1. `Get-ExecutionPolicy` の実行結果が `Unrestricted` となっていることを確認してください.
2. PHP のインストールディレクトリに PATH を通してください (もしくは以下のバッチファイルを `php.bat` というファイル名で作成して PATH の通るところに置くのもオススメです)
3. composer.ps1 を好きな場所に配置します (Composer をグローバルインストールしたい場合は PATH の通る場所に置いてください)
4. composer.ps1 を実行します.

上記「2.」で書いた php.bat はこんな感じ

```bat:php.bat
@echo off
C:\php\7.0.9\php.exe %*
```

以上です.
手元の Windows 10 でしか動作確認をしていないため, 何かエラーなど不具合がありましたらコメントをいただけると幸いです.
Bluemix上にテスト用のLinux環境(仮想サーバー)を作ってみた

# はじめに
IBM BluemixはWebアプリやデータ分析などの開発環境/実行環境がクラウド上で利用できるサービスです(トライアル期間は無料で使えます)。
BluemixはWebアプリやデータ分析などPaaSとしての利用が注目されていると思いますが、仮想サーバー(VM)のサービスも利用できようです。
ここでは、Bluemix上にLinuxのサーバーを立ててみたときの手順を示します。
Linux(CentOS)のサーバーを作って、Windows環境からteratermで接続するところまでやってみました。

# 事前準備
Bluemixにログインします。
仮想サーバーのサービスを利用するには、「英国」の地域を選択する必要があります。
別の地域を選択していると、以下のようなメッセージが表示されて仮想サーバーの作成ができません。

*「米国南部地域の仮想サーバー・ベータは、この時点では新規ユーザーに対してクローズされています。仮想サーバー・ベータに参加する場合には、英国地域を使用する必要があります。」*

右上のアカウントをクリックし、地域から「英国」を選択します。
![image01.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/27c284c9-bfd7-4f87-a5d2-f0d1de41a1de.jpeg)

# 仮想サーバーの作成
メニューから「計算」-「仮想サーバー」を選択し、「今すぐ始めましょう」というメッセージの上の「+」アイコンをクリックします。
![image02.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/102ee5fe-206b-6a73-a851-7a6f2496a731.jpeg)

ロケーション: IBM Cloud Public (これしか選べません)
既存を選択
イメージの選択: ここではcentos_7.1-20150401-x86_64を選択
![image03.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/42480477-a69c-8501-83de-e13e8234a0eb.jpeg)

以下のような設定画面が表示されます。
![image04.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/009fbe2b-c54f-7226-39d0-f3677b42885b.jpeg)

「セキュリティー鍵」の右側の「鍵の追加」をクリックして鍵ペアを作成します。
任意の鍵ペア名を指定します。
![image05.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/11eab019-f13c-9995-dff7-94a1ec1150a4.jpeg)　![image06.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/baf2def6-b8cb-2fae-641c-6b011bcbd62a.jpeg)

鍵ペアが作成され、秘密鍵をダウンロードすることができます。
作成された秘密鍵(id_rsa01.pem)は適当なフォルダに保存しておきます。
![image07.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/8f06438c-67a4-f545-4dc6-67544019cfdb.jpeg)

その他適宜設定を変更し、右下の「作成」ボタンをクリックします。
サーバーが構成されて起動されます。
![image08.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/f79b7ef6-1642-d395-0309-9bbd288e0b38.jpeg)

これで仮想サーバーの作成、起動が完了しました。
簡単ですねー！

# teratermからのSSH接続
画面の上にパブリックIPがアサインされているので(上の画面キャプチャではマスクしてますが)、そこに対してSSH接続してみます。(ポートはデフォルトの22番)
認証情報としては、デフォルトのibmcloudを指定し、認証方式として「RSA/DSA鍵を使う」を選択して秘密鍵に先ほど生成して入手した秘密鍵のファイル(id_rsa01.pem)を指定します。
パスフレーズは不要です。
![image09.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/075b1fcf-ecd9-8a5a-b77f-c95a3a840484.jpeg)

無事sshでログインできました！
![image10.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/76bf284f-1705-f62f-6d3b-af1965f67554.jpeg)

これで、`sudo yum install xxx` などでパッケージのインストールもできましたし、`sudo su - ` コマンドでrootユーザーにスイッチすることもできました。

# 参考
[クラウドサービスIBM Bluemixを無料で使うノウハウまとめ](http://qiita.com/zuhito/items/86e7ad47d14937d3e9b6)
[Bluemix仮想サーバーのセキュリティーグループ管理](http://qiita.com/tomotagwork/items/8867d96024fc705e4d35)
vimでRuby書くと重いときに試す価値あること



## 対象
- ruby書くときvimが遅くていらいらする
- [【Vim】Ruby書くときにVimが重くてつらいときは](http://qiita.com/izumin5210/items/7e0ad2f86d0686d8b376) にあてはまらない（foldしてない）
- :setf text とかすると急に速くなる

## 設定
```bash:.vimrc
set re=1 # ←追記
```
以上。速くなった。

## 原因
~~vimのバージョンが7.396以前のバージョンの場合はregexエンジンが古いらしく、そいつが悪さしてるってstackoverflowにかいてあった~~ 
(追記)vimのバージョンが7.396以降だと新しいregexエンジンを使う模様。この新regexエンジンがわるさしているとこのと。上記設定すると古いregexエンジンを使うようになるらしい。(http://stackoverflow.com/questions/16902317/vim-slow-with-ruby-syntax-highlighting)。 実際速くなったのでそうなのかもしれない。
Swiftでメソッドチェーンを実装する


パラメータを渡すといい感じに処理してくれるようなコードを書こうとすると、結構な数のパラメータが必要な場合があるかと思います。

単純に必要な数だけ引数を用意してもいいのですが、一度にすべての引数を使わない場合や、ライブラリとして公開する場合などは、もう少しスマートに対応したいところです。

そんな場合の対応方法のひとつとして、メソッドチェーンにて設定できるようにする方法があるかと思います。


##サンプル
UIViewを作成するサンプルです。

####呼び出し側のコード

```
ViewBuilder(parent: view)
    .setFrame(CGRect(x: 50, y: 50, width: 100, height: 100))
    .setBackgroundColor(UIColor.green())
    .setBorderColor(UIColor.lightGray())
    .setBorderWidth(4.0)
    .setCornerRadius(14.0)
    .build()
```

実行するとこうなります。

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/15905/16070502-6b28-9f13-41dc-24cdcb4d6e75.png "screen.png")


---

####実装側のコード

```
import UIKit

public class ViewBuilder {
    private var parentView: UIView
    private var frameRect: CGRect?
    private var backgroundColor: UIColor?
    private var borderColor: UIColor?
    private var borderWidth: CGFloat?
    private var cornerRadius: CGFloat?
    
    public init(parent: UIView) {
        self.parentView = parent
    }
    
    public func setFrame(_ frameRect: CGRect) -> Self {
        self.frameRect = frameRect
        return self
    }
    
    public func setBackgroundColor(_ backgroundColor: UIColor) -> Self {
        self.backgroundColor = backgroundColor
        return self
    }
    
    public func setBorderColor(_ borderColor: UIColor) -> Self {
        self.borderColor = borderColor
        return self
    }
    
    public func setBorderWidth(_ borderWidth: CGFloat) -> Self {
        self.borderWidth = borderWidth
        return self
    }
    
    public func setCornerRadius(_ cornerRadius: CGFloat) -> Self {
        self.cornerRadius = cornerRadius
        return self
    }
    
    public func build() {
        let view = UIView()
        
        if let frameRect = frameRect {
            view.frame = frameRect
        }
        
        if let backgroundColor = backgroundColor {
            view.backgroundColor = backgroundColor
        }
        
        if let borderColor = borderColor {
            view.layer.borderColor = borderColor.cgColor
        }
        
        if let borderWidth = borderWidth {
            view.layer.borderWidth = borderWidth
        }
        
        if let cornerRadius = cornerRadius {
            view.layer.cornerRadius = cornerRadius
        }
        
        parentView.addSubview(view)
    }
}
```

- 設定値を保持するプロパティを用意
- 設定値を受け取るメソッドを用意
- チェーンできるように設定値を保持しつつ、自身を返却
- 終端メソッドにて、存在するパラメータを設定

みたいに実装すれば良いかと！
1つのSassで複数のcssファイルを出力する方法

もっといい方法ないかなぁと探しています。。

##やりたいこと
gulpやsassを使って複数のCSSを出力する

>style.sass
>↓コンパイル
>css01.css
>css02.css
>css03.css

三つのファイルの違いは、例えばメインカラーが違う。メインのイメージ画像が違うなど
一部のみ違う場合がほとんど。


##sassのif文を使う
```sass:sass

//ここに3パターンのどれかをセット
$design: 3;


@if $design == 1 {

  $main-color: red;

} @else if $design == 2 {

  $main-color: blue;

} @else if $design == 3 {

  $main-color: black;

}
```

上記のような感じで、3回コンパイルしているけど、もろ非効率な感じ；
facebookのoauthを使ってみる（emailも取得）

#facebookのoauthとは
よくfacebookでログインというボタンを見ますが仕組み的にはfacebookが用意しているoauthのAPIを使用して実現しています。
このAPIは他にも色々情報をとれるので、今回はユーザID以外にメールアドレスも取得してみます。

##アカウントの作成
まずfacebookアカウントを作成します。
アカウントにAPIが紐づくのでサイト専用のアカウントを用意した方がいいかもしれません。

##アカウントにアプリを紐づけます
下記サイトよりアプリまたはサイトをアカウントに紐づけます。
https://developers.facebook.com/

「マイアプリ」を押下して「新しいアプリを追加」よりアプリを登録します。
Product Setupで質問されるので「Facebookログイン」を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/b8dd94c9-a970-702d-a2fa-79bc187be46e.png)

##アプリの設定
登録後、幾つかをデフォルトから変更しておきます。
「詳細設定」の「ソーシャルチャンネル」をいいえに。
「詳細設定」のサーバーIPホワイトリストにAPPシークレットを投げる可能性のあるサーバーIPを追加
「詳細設定」の「アプリ設定へのAPIアクセスを許可」をいいえに。
「Facebookログイン」のクライアントOAuth設定で下記のように。
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/e2dccbb9-c45a-a919-fe0c-124e82dfd323.png)

##PHPの実装
何故かfacebookが提供しているphpだと正常に動作せず、オーバーヘッドが大変多いので
http://memories.zal.jp/WP/blog/20150704_2598.html
を参考して作成。
ログインとcallbackは分けたかったので
sample02.phpのレスポンスとリクエストで別ファイルにしました。
また、下記URLのようにAPIのバージョンアップによって表示時にもfieldsが必要になったのでParamsGraphUserクラスにpermissionを追加してfieldsで必要なパラメータを配列で渡すようにしました。

**APIのバージョンが変わったせいで表示時にもパーミッションの設定が必要になります。**
http://paiza.hatenablog.com/entry/2015/07/22/2015%E5%B9%B47%E6%9C%889%E6%97%A5%E4%BB%A5%E9%99%8D%E3%81%ABFacebook%E8%AA%8D%E8%A8%BC%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%8C%E5%8F%96%E3%82%8C%E3%81%AA%E3%81%84

`https://graph.facebook.com`
へのパラメータにfieldsが必要になるので注意が必要です。

**2017/04/05　追記**
返り値がjsonになったのか、このままでは使えません。アクセストークンをセットできないようです。
下記の通り修正しました。

```lang:fb_api_oauth_access_token.php
  public function setResponse($val){
    if($this->isJson($val)){
      $arrVal = json_decode($val , true);
      if(array_key_exists('error' , $arrVal)){
        $this->error = $arrVal['error'];
        $this->isError = true;
      }
↓↓↓↓↓

  public function setResponse($val){
    if($this->isJson($val)){
      $arrVal = json_decode($val , true);
      if(array_key_exists('error' , $arrVal)){
        $this->error = $arrVal['error'];
        $this->isError = true;
      } else {
          $this->accessToken = $arrVal['access_token'];
          $this->expires = $arrVal['expires_in'];
      }
```

##公開
最後にfacebookのアプリ設定ページのアプリレビューページで公開をOnにします。
これをしないと開発本人しか使用できません。

##備考
パーミッションを増やしたい場合、
https://developers.facebook.com/docs/facebook-login/permissions/
を参考にする。

APIのリクエスト、レスポンスの試験では
https://developers.facebook.com/tools/explorer/145634995501895/?method=GET&path=me
が便利です。
返り値の名前などを把握できます。
Google Cardboard について

今回は、Google Cardboard について紹介いたします。

Google Cardboard とは、Googleが2014年に発表したヘッドマウントディスプレイです。
（サイトは<strong><a href="https://vr.google.com/cardboard/" target="_blank">こちら</a></strong>）
この Cardboard の一番の特徴は、オープンソースであるということ。

ヘットマウントディスプレイといえば、Oculus Rift とか PlayStation VR などが有名なところですが、これらはしっかりした作りにしなければならないので、お値段もしっかりとしたものになっています。
ですが、Cardboard の場合は、段ボールで作成することを想定し、この設計書も公開されています。
そのため、数百円で作ることができます。また、組み立てキットも発売されていますが、これも千円程度で購入することができます。
この、組み立てたものに自分が持っているスマホをセットすることでヘッドマウントディスプレイになります。

早速、<strong><a href="http://www.amazon.co.jp/dp/B0196BLLLK" target="_blank">こちら</a></strong>の商品を購入し、組み立ててみました。

![Cardboard1.jpg](https://qiita-image-store.s3.amazonaws.com/0/134810/4362b1a3-67c0-9f7d-abd4-9dd86ea4d973.jpeg)

![Cardboard2.jpg](https://qiita-image-store.s3.amazonaws.com/0/134810/2a7627ed-aedb-0303-63e2-2cb160114dce.jpeg)

iPhone 5s をセットし、Cardboardアプリを動かしています。
外からの光がほとんど入ってきませんので、仮想の世界にちゃんと入り込めます。

<strong><a href="https://vr.google.com/intl/ja_jp/cardboard/developers/" target="_blank">こちら</a></strong>に、Cardboard用のアプリを作成するSDKも用意されていますので、自分でアプリを作ることも可能です。
次回は、このSDKを使ったアプリ作成について紹介したいと思います。
AWS CLIでAssumeRoleを使う小さなサンプル

# 概要
同じアカウント内でAssumeRoleだけ出来るIAMユーザを払い出す。
AssumeRoleだけ許可されたIAMユーザクレデンシャルを保持するユーザがAssumeRoleを行い、関連付けられたIAMロールでリソースを触れるようにする

# イメージ図
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/08aceb54-b553-c97c-eb9e-736d00c654b1.png)

# 手順例

## IAM関連リソース作成
### IAMユーザ作成
- ARN
    - arn:aws:iam::xxxxx:user/assume-test-user
- アクセス許可のポリシー
    - 作成予定のRoleのみにAssueRoleを許可

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::xxxxxx:role/assume-role-test"
            ]
        }
    ]
}
```

### IAMロール作成
- ロールARN
    - arn:aws:iam::xxxxx:role/assume-role-test
- アクセス許可のポリシー
    - 任意だがとりあえずPowerUser
- 信頼関係
    - プリンシパルには上記のIAMユーザを指定
    
```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::xxxxxx:user/assume-test-user"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

## 使い方
### 前提
- IAMユーザのクレデンシャルを登録済の環境であること

### 手順

```
# aws sts assume-role --role-arn arn:aws:iam::xxxxx:role/assume-role-test --role-session-name zzzzz(任意)
★アクセスキー、シークレットアクセスキー、セッショントークンを控える
# export AWS_ACCESS_KEY_ID = xxxx
# export AWS_SECRET_ACCESS_KEY= xxxx
# export AWS_SESSION_TOKEN= xxx
★あとはExpireするまで自由に
# aws ec2 describe-instances
```

# 参考
AWS CLIでAssumeRole http://www.slideshare.net/tetsunorinishizawa/aws-cliassume-role
総称型と型パラメータ

```java



class Hoge<T>{
	private T var;
	public void setVar(T arg){var = arg;}
	public T getVar(){return var;}
}
//の様なクラスを
public class Test{
	public static void main(String[] args){
		Hoge<String> obj = new Hoge<String>();
	}
}
//の様にインスタンス化すると
class Hoge{
	private String var;
	public void setVar(String arg){var = arg;}
	public String getVar(){return var;}
}
//の様な内容で生成されるし
public class Test{
	public static void main(String[] args){
		Hoge<Integer> obj = new Hoge<Integer>();
	}
}
//の様にインスタンス化すると
class Hoge{
	private Integer var;
	public void setVar(Integer arg){var = arg;}
	public Integer getVar(){return var;}
}
//の様な内容で生成される。



```
Edisonでcustomized kernelをビルドする(2016/7月版)

#はじめに
Edisonがリリースされてそろそろ2年となるようです。結構な月日が経ったなぁ。と感慨なのですが、最近のIntelのSDKでEdisonのイメージ(yocto-linuxベースです)をビルドしたので、その際の情報をまとめておきます。

#環境について
ここではdockerの上にUbuntuを走らせ、その上で構築します。もちろん通常のUbuntuの方でも大丈夫です。docker特有の手順についてはその旨を付記することにします。

#手順概要
手順としては以下のようになります。

- 作業ディレクトリの作成
- (dockerのみ)dockerイメージのDownload,コンテナの起動
- 必要なソフトのインストール
- (dockerのみ)ユーザーの作成, /dev/consoleの修正
- Intel SDKのダウンロード、展開
- SDKの設定
- ビルド(1回目)
- カーネルコンフィグの変更
- ビルド(2回目)
- イメージの作成

また作業ディレクトリとして"~/edison"を作成し、使用します。dockerのみ、作業用ユーザとしてedisonを作成します。

#作業手順
##作業ディレクトリの作成
まず作業用のディレクトリを作成します。ディレクトリにEdisonに必要なファイルがコピーされ、またソフトのビルドも行なわれます。ですので40G程度の容量が必要です。 
```
$ mkdir ~/edison
```

##(dockerのみ)dockerイメージのDownload,コンテナの起動
```
$ docker pull ubuntu
$ docker run -i -t -v ~/edison:/work:rw --privileged ubuntu /bin/bash
```

##必要なソフトのインストール
```
$ apt-get update
$ apt-get install build-essential git diffstat gawk chrpath texinfo libtool gcc-multilib u-boot-tools unzip python wget cpio
```

##(dockerのみ)ユーザーの作成, /dev/consoleの修正
non-rootのユーザーでビルドする必要があるのでdockerの際には別のユーザーを作成します。またそのユーザーから/dev/consoleにアクセスする必要があるのでその設定を修正します。

```
$ chmod 777 /work
$ chmod 777 /dev/console
$ useradd -m edison
$ su edison
```

##Intel SDKのダウンロード、展開、設定
以下のURLに最新版のSDKがありますので、それをディレクトリに保存して下さい。
Https://software.intel.com/en-us/iot/hardware/edison/downloads

2017/7時点では"iot-devkit-yp-poky-edison-20160606.zip"が最新版のようです。

以下のコマンドで保存したファイルを展開し、ビルドの設定を行ないます。

```
$ unzip iot-devkit-yp-poky-edison-20160606.zip
$ cd iot-devkit-yp-poky-edison-20160606/poky/
$ source oe-init-build-env ../build_edison/
```

"./conf/local.conf" の中の "BB_NUMBER_THREADS" と "PARALLEL_MAKE"の値をCPUコアの値よりやや多めにすることでビルド時間が短縮できま

##ビルド(1回目)
最初にイメージのビルドを行ないます。最初のビルドはかなり時間がかかります。
```
$ bitbake edison-image
```

##カーネルコンフィグの変更
以下のコマンドでカーネルコンフィグの設定を変更します。
```
$ bitbake virtual/kernel -c menuconfig
```

##ビルド(2回目)
その後再度イメージのビルドを行ないます。
```
$ bitbake edison-image
```

##イメージの作成
以下のコマンドでEdison実機向けのイメージを作成します。
```
$ ../poky/meta-intel-edison/utils/flash/postBuild.sh .
```

以下のコマンドでEdison実機にイメージを焼くことが可能です。
```
$ sudo ./flushall.sh
```
Spline Trail Rendererを使ってみた(Unity X Vive)

Viveのお絵かきアプリ「Tilt Brush」のブラシのように、Viveのコントローラーの動きに合わせて軌道が残る演出ってかっこいいですよね。
UnityにはもともとTrail Rendererというコンポーネントが用意されており、これを使えば簡単に似たような演出をすることができます。
しかし、Trail Rendererコンポーネントでは、荒っぽさが目立ったりして綺麗な表現をすることが難しいです（使いこなせばきっときれいにできるんだろうけど・・・）

Asset Storeで代用できるようなAssetがないか探したところ、Spline Trail Renderer（有料20ドル）を見つけました。
https://www.assetstore.unity3d.com/jp/#!/content/10236
DEMOもいい感じ＋レビューも33件 平均星５個と高評価だったので、Spline　Trail　Rendererを使ってどんなことができるか試してみたいと思います。
![Spline Trail Renderer - アセットストア - Google Chrome 2016-07-26 17.18.46.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/9e92b71f-763a-9525-0e8f-3c988a9bc910.jpeg)


Spline Trail Rendererを使えばこんな感じの表現ができるそうだ
![Spline Trail Renderer - アセットストア - Google Chrome 2016-07-26 17.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/67575/0cd20655-a73d-15a0-2301-403deeba8f73.png)


＊主にOnline　Documentの翻訳/解説になるかと思います。
Online　Documentはここ
http://splinetrailrenderer.blogspot.jp/

ちなみにTrailには
「引きずった跡，通った跡，痕跡(こんせき); 船跡，航跡.用例the trail of a slug ナメクジのはった跡.b(獣の)臭跡; (捜索などの)手がかり」等の意味があるそうだ
http://ejje.weblio.jp/content/trail


##最新バージョン
最新バージョンは1.3とのこと（2016/7/26現在）
1.3からUnity５に完全対応した。

1.3の変更点はこちら
- ScriptとShaderをUnity5で100％コンパイルできるようにしたよ
- 2つのカラーを混ぜて表現できるカスタムShaderを追加したよ
- まれに発生していたOut of range exceptionsエラーを直したよ


更新日はTuesday, August 11, 2015だからちょいと古い気がするけど、十分に動作するならば問題はないか

##使い方（基礎）

1. 空のGameObjectを作成しよう
2. そいつにSplineTrailRendererコンポーネントをつけよう
3. そいつにMeshFilterとMeshRendererコンポーネントもつけよう
4. Mesh RendererコンポーネントのMaterialsにSplineTrailRenderer/Samples/MaterialsにあるFadeTrailMaterialマテリアルを設定しよう
5. SplineTrailRendererコンポーネントのパラメータを調整しよう（下の画像を参考に）

![inspector.png](https://qiita-image-store.s3.amazonaws.com/0/67575/07535334-2c96-e733-40c2-a630f3875da0.png)
（この画像はOnline Documentに貼ってある画像です）

これでGameObjectを動かすと、スムースなTrailが自動的に作成されるよ！

##実際にViveのコントローラーにつけてみた
![Animation-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/b4e3caab-216d-48d4-5e11-6e80b6800f2b.gif)

SplineTrailRendererのInspectorはこれ
![Unity (64bit) - testLighting.unity - ViveFirstTest - PC, Mac & Linux Standalone_ _DX11_ 2016-07-31 20.20.24.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/c9086329-15dd-ef57-df9e-08f6e67f4cf4.jpeg)

###ポイント　パラメータは小さい値を入れる
Viveのコントローラーが３D世界だとものすごく小さいので
`Emission Distance`や`Height`や`Width`を小さくしている。
Heightが小さすぎるとカメラとTrailの向きによっては、Trail自体がカメラに映らない場合があるのでちょっとだけ大きめにしている。
値が小さすぎるのか数回 `IndexOutOfRangeExceptionエラー`が発生する。

###ポイント　Dynamic Normal updateには必ずチェックを入れる
これにチェックを入れないと、Trailがカメラに映らない

###問題点
レンダリングがコントローラーから0.1離れた場所までしか実行されないようになっている。
RenderMesh関数の
`float length = Mathf.Max (spline.Length () - 0.1f, 0);`
`length = Mathf.Max (spline.Length () - 0.1f, 0);`
この二行に書いてある0.1fを0.01fくらいにするといい感じにコントローラー付近までレンダリングしてくれる。
twitterのoauthを使ってみる（emailも取得）

#twitterのoauthとは
よくtwitterでログインというボタンを見ますが仕組み的にはtwitterが用意しているoauthのAPIを使用して実現しています。
このAPIは他にも色々情報をとれるので、今回はユーザID、ユーザ名、ツイート情報以外にメールアドレスも取得してみます。

##twitterアカウントの用意
当たり前ですが、アカウントを用意します。
また、APIを使用する際は自分が作成した物をサイトやアプリを登録する必要があります。
登録時には電話番号を設定したアカウントでないと登録できないので電話番号を登録します。
尚、電話番号は前ゼロをとってください。

https://twitter.com/settings/devices

例）
`090-****-****`
なら
`90-****-****`
と登録します。

##APIキーの発行
デベロッパー用のサイトが
https://apps.twitter.com/
になります。ここでアプリ、サイトの登録を行います。
「Create New App」ボタンを選択し登録します。

アプリ名や説明、またwebsite、また認証後に戻るURLなどを記載します。
一旦登録し、編集にて
「Privacy Policy URL」や「Terms of Service URL」の設定をSettingsから行います。
また、Permissionsでは今回はtwitterの書き込みなどが不要なのでAccessをRead onlyにしています。
APIキーや
APIシークレットは「Keys and Access Tokens」から参照することができます。

##メールのパーミッション設定について
メールのパーミッションは通常では設定することができません。
そのため、問い合わせてホワイトリストにいれてもらう必要あります。
https://dev.twitter.com/rest/reference/get/account/verify_credentials
ここに説明がありますが、ここの中の
「please use this form.」のリンクをたどって問い合わせください。

内容的には
「特別な権限へのアクセスが必要です」を選んで
アプリケーション名など全て記載し、「権限がリクエストされました」の項目に「email address」と記載すればよいと思います。私はそれで許可がおりました。
許可には2、3日かかり、メールにて連絡があります。

許可が降りると以下のように項目が増えていますのでチェックを付けて反映します。
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/5e5f9549-f222-acc1-bb1f-0061b62650b4.png)

##phpからの使用方法について
https://twitteroauth.com/
上記のライブラリを使用します。

使用方法は下記を参考にしました。
http://qiita.com/sofpyon/items/982fe3a9ccebd8702867

ただ、上記例のmypage.php中のTwitterOAuthをトークンとシークレットキーを使ってインスタンス化した後の部分で、
下記のようにemailを含む、ツイート不要などのオプションを使用しました。

```lang:
//ユーザー情報をGET
$user = $connection->get("account/verify_credentials", ['include_entities'=> 'false', 'include_email'=> 'true']);
```

上記でemailaddrも取得する事ができます。

以上。
TableHeaderViewの高さ変更は簡単じゃない！？！？


## UITableView.tableHeaderViewの高さを変更する

```swift:hoge.swift
tableView.tableHeaderView.frame.size.height = 0
```

では、ダメ

```swift:hoge.swift
if let tableHeaderView = tableView.tableHeaderView {
    var frame = tableView.frame
    // 新しいサイズを指定する(今回は高さなし)
    frame.size.height = 0
    tableHeaderView.frame = frame
    tableView.tableHeaderView = tableHeaderView
}
```

こんな感じにすることでいけました。
IntelliJ IDEAからSonarQubeを使う(SonarLint)



以前、プログラム品質管理ツール[SonarQube](http://www.sonarqube.org/)に関する記事を[投稿しました](http://qiita.com/ot-aoyagi/items/d97b2431fefbf5635e93)。
今回はその関連です。


# 概要
SonarQubeの開発を行っているSonarSource社は、各種IDE向けの[SonarLint](http://www.sonarlint.org/)というツールも開発しています。これらはプラグイン形式で提供されており、SonarQubeのソース静的解析(Analyze)機能と同等のことをIDE上から利用できるようになっています。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/131679/09c70cd8-da94-2169-731e-3a3daa21a1ea.png)

2016年7月現在、Eclipse、IntelliJ IDEA、Visual Studio向けのプラグインと、SonarLint for Command Lineというコマンドラインツールが提供されているようです。

今回はIntelliJ IDEAのプラグインを試してみます。

# 前提
* IntelliJ IDEA ULTIMATE 14.1.3
* SonarLint 2.2
* SonarQube 5.6

# セットアップから利用まで
## セットアップ

* 公式サイトからIntelliJ IDEA用プラグインをダウンロードします。
    * http://www.sonarlint.org/

* IntelliJ IDEAで`Settings -> Plugins`を表示します。
* `Install Plugin from disk`からダウンロードしたzipファイルを選択します。
* これでプラグインとして追加されました。OKで再起動を促されます。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/131679/ad72ce40-1008-7962-25a9-c4bab9b18669.png)

セットアップはこれだけです。

## 検証
* 対象のソースをエディタで開き、コンテキストメニューから`Analyize this file with SonarLint`を選択します。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/131679/112d57f1-8fa2-7b65-c9b5-31f3f62efbc3.png)
* SonarLintタブに検証結果が表示されます。
![007.png](https://qiita-image-store.s3.amazonaws.com/0/131679/09bdf48b-8f6b-0f25-47fe-5bcbaac7805d.png)
* 指摘事項を修正後ソースを保存すると即座に再解析され、SonarLintタブの指摘一覧に反映されます。
* エディタで新たにファイルを開く度に解析が行われています。(logタブ)
![008.png](https://qiita-image-store.s3.amazonaws.com/0/131679/f5144500-4eaa-a60f-e5f9-6a66c29085f9.png)

## SonarQubeとの連携 (Connected Mode)
* SonarQubeサーバーへの接続情報を設定することで、SonarQubeサーバーで解析を行うこともできます。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/131679/494d915b-faa4-0c53-fa09-2f5efffb84ba.png)

# まとめ
ある程度の規模かつ複数人での開発の場合は、SonarQubeサーバー一箇所で解析・チェック内容を定義したうえで、IDEからConnected Modeで利用するという運用が良さそうに思います。

今回は載せていませんが、IntelliJ IDEAのPHPプラグイン上でも静的解析が行われることが確認できました。
Ubuntu 14.04で休止状態（hibernate）ができない

備忘録: 理由の説明とかはあまり書いていません。

バッテリー残量が不足するとクラッシュするので困っていた。hibernateができないというのは、具体的には以下のことができない。困った。

1. ``sudo pm-hibernate``を実行するとクラッシュする
2. ``システム設定 > 電源 > 電力がひどく低下した時の動作``で``ハイバーネート``を選択できない
3. 復帰後の画面がロックされてない

# ハイバーネートに失敗する
まず``pm-hibernate``コマンドできちんとハイバーネートが機能するか確認する。自分の場合クラッシュして、起動時に"System problem detected"のメッセージが表示された。

ハードウェアやスワップ、その他諸々の都合で、（そのままでは）機能しないことがある模様。RAMの内容を退避するswapが足りないというのがありがちらしいが、``free``でRAMとswapの容量を確認したところ、問題ない。

自分の場合、問題は``/sys/power/image_size``にあった。これは退避イメージサイズの上限を規定するのだが、恐らくこれが小さかったようだ。値を0にすると最適～みたいなよくある仕組みなので、どこかのタイミング（``/etc/rc.local``など）で``echo 0 > /sys/power/image_size``を実行する。上手くいった。

# ハイバーネートを有効にしたい
問題なければ、機能としてハイバーネートを有効にすると、いろいろな所でハイバーネートができるようになる。
有効にするには``/var/lib/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla``を作成し、以下の内容を書き込む。``/var/lib``でだめな場合は``/etc``にという情報もある。詳しくは理解していないのでググろう（沢山出てくる）。

```
[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate
ResultActive=yes
```


# ハイバーネート復帰後にロックスクリーンを表示したい
[こちら](http://askubuntu.com/questions/148690)のmzzzzb氏の回答を参考にして、``/etc/acpi/hibernate.sh``を作成し、以下の内容を書き込んだ。

```
if [ x$LOCK_SCREEN = xtrue ]; then
    if pidof xscreensaver > /dev/null; then
    for x in /tmp/.X11-unix/*; do
        displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
        getXuser;
        if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
        . /usr/share/acpi-support/screenblank
        fi
    done
    fi
fi
```
Laravel5でflashを使ってリダイレクト後にメッセージを表示するメモ


要するに`PRGパターン`で遷移後にメッセージを出したい。
そんなときは（他のフレームワーク同様）`flash`を使う。

```
public function create(Request $request){
  //登録処理
  
  $request->session()->flash('message', '登録したでござる');
  return redirect('index');
}
```

```
@if(Session::has('message'))
  メッセージ：{{ session('message') }}
@endif
```


こんな感じ。


追記
------

コメントいただいたように

```
$request->session()->flash('message', '登録したでござる');
```

ではなく

```
return redirect('index')->with('message', '登録したでござる');
```

でもできた。
はじめにこのやりかたでダメだったので諦めたのだが、取り出すときには

```
@if(Session::has('message'))
  メッセージ：{{ session('message') }}
@endif
```

こうしないとだめみたい。
Windows7 > ペイントブラシで画像が保存できない状況 > システムキャッシュ

```txt:動作環境
Windows 7 English
```

ペイントブラシで画像をファイルとして保存しようとした時に
「paintbrush cannot save the file」というエラーが出た。

直前にした作業としては、システムキャッシュの保存先を別のドライブに変更した。
その保存先のドライブレターを変更した。
（これにより、システムキャッシュの保存先をOSが見失った状態になった)。

ドライブレターを元に戻したらペイントブラシで保存できるようになった。

以下のような状況の時に、追加ディスクにシステムキャッシュ保存先を作っていると問題が生じる。
http://qiita.com/7of9/items/b557b6b53ad8634fe859

システムキャッシュ保存先を変更する時は要検討。
[Linux][kernel module] 簡単なローダブルカーネルモジュールのビルドとロード

kernel module のビルドとロードをやってみたメモ
`dump_stack()` でstacktraceが取得できます。

# ソース

```c:testmod.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

MODULE_LICENSE("MIT");

static int testmod_init(void)
{
	printk(KERN_INFO "driver loaded\n");
	dump_stack();
	return 0;
}

static void testmod_exit(void)
{
	printk(KERN_INFO "driver unloaded\n");
}

module_init(testmod_init);
module_exit(testmod_exit);
```

```mf:Makefile
KERNELSRCDIR = /lib/modules/$(shell uname -r)/build
ARCH=x86
#ARCH=arm
#CROSS_COMPILE=arm-none-linux-gnueabi-
VERBOSE = 0

obj-m := testmod.o

all:
	make -C $(KERNELSRCDIR) \
		M=$(PWD) \
		KBUILD_VERBOSE=$(VERBOSE) \
		ARCH=$(ARCH) \
		CROSS_COMPILE=$(CROSS_COMPILE) \
		modules

clean:
	make -C $(KERNELSRCDIR) M=$(PWD) KBUILD_VERBOSE=$(VERBOSE) ARCH=$(ARCH) clean
```

注意点：

+ `makefile` ではなく `Makefile` と先頭を大文字にすること
+ Makefile内はタブ文字でインデントとすること（GNU makeの文法として空白文字でインデントするとエラーになる）

# 実行例

```console:insmodして動作を確認
$ make
$ sudo insmod testmod.ko
$ sudo rmmod testmod
$ dmesg
[20487.308696] testmod: module license 'MIT' taints kernel.
[20487.308709] Disabling lock debugging due to kernel taint
[20487.310110] driver loaded
[20487.310116] Pid: 32263, comm: insmod Tainted: P           O XXXXX.x86_64 #1
[20487.310121] Call Trace:
[20487.310130]  [<ffffffffa00f8000>] ? 0xffffffffa00f7fff
[20487.310138]  [<ffffffffa00f801c>] testmod_init+0x1c/0x20 [testmod]
[20487.310146]  [<ffffffff8100212a>] do_one_initcall+0x12a/0x180
[20487.310213]  [<ffffffff810b60a6>] sys_init_module+0x10f6/0x20b0
[20487.310220]  [<ffffffff815f38e9>] system_call_fastpath+0x16/0x1b
[20487.383930] driver unloaded
```

# 関連

[カーネルモジュールの情報を確認する方法まとめ - Qiita](http://qiita.com/koara-local/items/309aec36352f113d4519)
[[Linux][kernel module] ローダブルカーネルモジュールのロード時に引数でパラメータを渡す方法 - Qiita](http://qiita.com/koara-local/items/a3d8dc438f630c295456)
[[Linux][kernel module] カーネルモジュール内でkthreadを作成する - Qiita](http://qiita.com/koara-local/items/8c46826ac02cff6d4be6)

# 参考
[Compiling Kernel Modules](http://www.tldp.org/LDP/lkmpg/2.6/html/x181.html)
[ARM用Linuxのカーネルモジュールを作成する - ひまじめ](http://www.oidon.net/linux/build-arm-linux-kernel-module)
[makefile - Cross compiling a kernel module - Stack Overflow](http://stackoverflow.com/questions/3467850/cross-compiling-a-kernel-module)
Groovyのちょっとしたこと「Eclipse STS Gradle(3.8.0)ではGradle2.14.1のToolingCustomModelは扱えない」

Gradleの内部クラスであるEclipseModelBuilderクラスのコンストラクタの引数の数が変更されていることにより、Initializeに失敗する。

spring-projects/eclipse-integration-gradle - version 3.8.0
[StsEclipseProjectModelBuilder](https://github.com/spring-projects/eclipse-integration-gradle/blob/3.8.0.RELEASE/toolingapi/plugin/src/main/java/io/pivotal/tooling/plugin/eclipse/StsEclipseProjectModelBuilder.java#L58)

gradle/gradle version 2.14.1
[EclipseModelBuilder](https://github.com/gradle/gradle/blob/REL_2.14.1/subprojects/ide/src/main/groovy/org/gradle/plugins/ide/internal/tooling/EclipseModelBuilder.java#L70)

Issueは報告した。

追伸)
中の人「起きん。動く。一旦、クローズする」
俺「あ、設定でUse Custom Tooling Modelチェックしたときだけ起きます」

というやり取り中。タイトルを修正しました。

なお、Neon以降ではEclipseの方でGradleをサポートする仕組みを出すようになっているので、そちらを使うことが推奨されている。
https://github.com/eclipse/buildship/wiki/Migration-guide-from-STS-Gradle-to-Buildship
http://projects.eclipse.org/projects/tools.buildship
http://qiita.com/grachro/items/d1ebad3857a794895426

移行に際しての注意点がいくつかあるが、最初に「うっ」となったのは、必ずGradleのルートプロジェクトの位置にEclipseのプロジェクトのルートがないといけない縛りになったことです。
ViveController トリガーの引き具合に合わせてコントローラーを振動させる

トリガーに合わせてコントローラーを振動させる、という仕様はよくあると思うので作ってみました。

```
using UnityEngine;
using System.Collections;

public class ControllerViblate : MonoBehaviour
{

	public SteamVR_TrackedObject trackedObject;
	public int maxPulse = 3999;
	// Use this for initialization
	void Start ()
	{
	
	}
	
	// Update is called once per frame
	void Update ()
	{
		var device = SteamVR_Controller.Input ((int)trackedObject.index);
		ushort remapValue = (ushort)Remap (device.GetAxis (Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger).x, 0, 1, 0, maxPulse);
		//Debug.Log (remapValue);
		device.TriggerHapticPulse (remapValue);

	}

	float Remap (float s, float a1, float a2, float b1, float b2)
	{
		return b1 + (s - a1) * (b2 - b1) / (a2 - a1);
	}
}

```

Remap関数を使って、トリガーの引き具合を0~1の範囲に直し（そもそも0~1だけど）、0~maxPulseの範囲と比較したときにどの値になるか計算しています。

maxPulseはViveコントローラーの振動強度がMax3999なので初期値に3999の値を入れています。
ただ3999だと強すぎる感じがするので1500くらいがよいのかも。

device.TriggerHapticPulse関数で実際にコントローラーを振動させています。
Viveのゲームでコントローラーを振動させている作品は多いけど、
device.TriggerHapticPulse関数で振動させた振動具合と各作品の振動具合が若干違う気がする。。。
device.TriggerHapticPulse関数だと振動時に「ぶぃーーーーん！！」って鳴るし、振動もあまり心地よくない。
他に振動させる方法を探してみたけど見つからずちょっと疑問が残った。
Slackの絵文字登録数ランキングを表示する

Slackのカスタム絵文字をたくさん登録しているユーザを炙りだす方法です

**追記**
絵文字数が500を越えると絵文字一覧画面がページ分割されるようになったので、絵文字ジャンキーがいるチームだとこの方法は使えなくなりました :cry: 

## 動作確認環境
OS X 10.11.4

## 手順

1. ターミナルに以下のコマンドを入力する（実行はしない）
 - `pbpaste |tail -n +10|grep -v -e '^\s*$'|sort|uniq -c|sort -r|head`

1. 絵文字登録画面をブラウザで表示
    - `https://[チーム名].slack.com/customize/emoji`

1. 画面をすべて選択して、コピー
    - `⌘A``⌘C` でコピーすればOKです

1. 1で入力しておいたコマンドを実行する

## 結果

|,,╹﹏╹,,) さっそく仕事もせずに絵文字登録して遊んでる社員を炙り出してみましょう

![ranking.png](https://qiita-image-store.s3.amazonaws.com/0/19724/fc854f3f-212c-20da-5c58-5d44b5f6bbf3.png)

|,,'﹏`,,) 💦 :majikayo:
Embulk java plugin を オレオレ rubygems にリリースする方法

# はじめに
最近いろんな場所でEmbulkが使われ始め、そろそろ社外に出せない java plugin を各会社で書き始めている頃ではないでしょうか（え）
この記事では、そんなEmbulk の java plugin を 社内の オレオレrubygems に対してリリースする方法を書きます。

# やり方

やり方は非常に簡単で `build.gradle` の `gemPush` task を少し変更するだけです。

defaultだと以下のようになっています。

```build.gradle
task gemPush(type: JRubyExec, dependsOn: ["gem"]) {
    jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "push"
    script "pkg/${project.name}-${project.version}.gem"
}
```

これを以下のように変更します。( `https://myrubygems.jp` にはオレオレrubygems のURLを入れる。)

```build.gradle
task gemPush(type: JRubyExec, dependsOn: ["gem"]) {
    jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "push", "--host", "https://myrubygems.jp"
    script "pkg/${project.name}-${project.version}.gem"
}
```

やっていることは、 `gem push` 時に `--host` オプションを指定しているだけです。

# 以上

オレオレrubygems が社内で管理されているような会社で java plugin が書かれることは殆ど無いと思うけども。

# 参考
- [jruby-gradle-plugin](http://jruby-gradle.org/base/)
- [geminabox](https://github.com/geminabox/geminabox)
各種サイトのスマホページのダウンロードサイズを調べてみた

## 前提
- 測定は2016/7/26に行いました
- ChromeでiPhone6のユーザーエージェントに偽装して測定
- サイズはChromeのDevToolにあるネットワークタブに表示されてものを単位揃えて適当に丸めてます。
- 特に補足がない場合はトップページで測定しています
- ファーストビューの表示でダウンロードしたサイズです。スクロールしないとダウンロードされないコンテンツの分は含みません
- 補足のない場合は各サービスのログイン状態で測定しています。

## 結果
| サイト       |       サイズ |  補足 |
|:-----------------|------------------:|:------------|
| Youtube          |        920KB   | |
| Qiita            |       1020KB  | |
| はてな            |       5120KB  |ユーザが投稿したものと思われる2.9MBのpngが足を引っ張ってた　|
| Amazon.co.jp(ログイン状態)     |      1130KB | |
| 楽天              |     3070KB | 未ログイン状態 |
| ニコニコ動画           |     940KB ||
| Git Hub |         80KB |Exploreページで測定|
| Pixiv |       2560KB | |
| Yahoo | 1840KB | |
| www.google.co.jp | 240KB |
| Google News | 590KB | |
| Stack Overflow | 260KB | |
| DMM.com | 2360KB | |
| ANA | 2970KB | スマホ向けのチケット予約サイトで測定。未ログイン状態 |
| ITmedia |            1130KB| |
| 4Gamer | 2250KB | |

これを見ると、たまたまなのかそういう設計にしているからなのかはわかりませんが、どうしてもサイズが大きくなるサイトでは3MB、それ以外は1MB前後に集中している感じがあります。
自分でサイトを作る場合もこれくらいを目標にして作るといいかもしれません。
「夏真っ盛り！Spark + Python + Data Science祭り」行ってきた。

http://connpass.com/event/34680/

例によって途中参加だったので1つ目の発表は途中から＆macbook忘れてiPhoneでメモ取ったので日本語不自由な感じになっています。

Ibis: すごいpandas 大規模データ分析もらっくらく
===

Cloudera社 有賀康顕氏 ( @chezou )

http://www.slideshare.net/Cloudera_jp/ibis-pandas-summerds

Jupyter notebookでデモ

教師データを作ってからscikit-learnが出てくる

PySparkと比べて
---

* 設定が簡単
* 速い
    * 参考値としては基盤にしているCloudera ImpalaがPySparkよりも7倍速い

spark-sklearn

pip install ibis-framework
でインストールできる

Impala使いたければClouderaのdirectorを使うと良いとのこと。


Amebaにおけるレコメンデーションシステムの紹介
===

サイバーエージェント社 内藤遥氏

レコメンデーションシステム概要
---

Amebaで使っているレコメンデーションシステムは以下の3種

* A.J.A. recommend
* phoenix ⇦今日はこれ  
強調フィルタリング  
Sparkを利用
* バトルrecommend

レコメンデーションシステムの利用
---

* 関連ハッシュタグ
* グルっぽ
* 読書の時間


### 概要

1. アクティビティログをhadoopへ
1. 推薦結果をhbaseへ
    * キーにソルトとしてハッシュの頭1文字（分散のため
1. 推薦結果のimp/clkなどをフィードバック
    * バンデットアルゴリズムでCTRを元にリランキング

### Item to Item collaborative filtering

#### ユーザーベースの協調フィルタリング

距離の近いユーザの評価を元にする

#### アイテムベース

アイテム間の距離を元にユーザの評価を元にする
アイテムの評価が少なくても精度が出せる

##### コサイン類似度

共起数（重複ユーザ数）を要素の平方根を積算した値で割る

### ケースごとの工夫

#### シンプルにする

ブロードキャスト変数を使って各ワーカーに割り振る。
こうすると複雑なjoinが不要になる

#### 推薦結果を鮮度の新しいものだけにしたい

事前にアイテムセット（フィルター）を作っておいて結果をフィルターする


Sparkを活用したレコメンドエンジンのパフォーマンスチューニング＆自動化
===

DMM.comラボ社 加嵜長門氏

作ったあとの運用の話

Spark活用システムの概要
---

2015年2月からSpark活用。

エンジニア3人で13件から168件
自動化してたから対応できた

リソースは1.5倍くらい
230CPUs / 580GB から 360CPUs / 900GB

時間は3hから4hへ

導入自動化
---

サービスが多いので新サービスでの利用開始を容易にしている

### サービス追加したい時

1. レシピを書く
1. レシピに従ってテストを流す jenkins
    * テスト環境で動作確認
1. ステージングで性能
1. 本番にリリース

サービスによってユーザ数とアイテム数の比率が大きく違うのでチューニングも個別に必要

スケール感はユーザ数100万人とか商品数400万点とか

全サービス横断のアイテムマトリクスを用意している
→サービス間のレコメンデーションも可能になる

ランキング
---

アルゴリズムは2種使い分けている

* ユーザーTOアイテム
* アイテムTOアイテム

1. Hiveでデータ整形
2. Sparkではレコメンド計算だけ
    * シンプルさを維持するため
3. SqoopでDBに出力

レシピはhive,spark,sqoopのパラメタ設定をJSONで定義している

精度チューニングは実際に投入してA/Bテストする（学術的な評価式もあるが、試さないとわからなところもある）
パフォーマンスはわかりやすく問題になるので事前にチューニング

1. ボトルネックを探して
1. データの偏りを解消する

20:80の法則によりデータの分割に失敗する時がある（分割しても偏っているケースが多い）
うまく分割できれば3時間→3分に短縮とか

---

（以下編集中）

LT枠

spark初心者がレコメンドでハマった

15分ごとにsubmitするとディスク枯渇
jarがコピーされる
クラスタを作り直しながらsubmitする

BigQueryからのロード時にパーティション数が少ない
executorが使い切れない
リパーティション大事

レコメンドされない
ユーザ多すぎて直積とれない
ユーザ集合にまとめて処理した


Sparkを使ったレコメンドエンジンのパフォーマンスチューニング

dag visualizationみよう

分散してなかったら分散させる
大量データでシャッフルさせるとダメ

複数回使うrddはキャッシュする

cpuボトルネックの時はシリアライズしない選択肢

KryoSerializer2倍速くなった
Sublime Text 3 ：インストール後に設定したこと

# Sublime Text 3 インストール後の設定
いつの間にかβ版じゃなくなっていたので満を持してインストール。
やっぱり設定が面倒なので、自分用にメモ。

###  パッケージコントローラーをインストール  
[パッケージ管理プラグイン:Package Control](https://packagecontrol.io/installation#st3)

###  パッケージインストール
上記のPackageControlプラグインから以下をインストール。

#### 基本
 * IMESupport : 日本語入力をインライン化
 * EncodingHelper : エンコーディングの変換と表示
 * TrailingSpaces : 日本語の全角スペースの見える化用

他、[PackageControlのパッケージはこちらにたくさんあります](https://packagecontrol.io/)

### デフォルト設定の変更

```json:Preferences_Setting-User
{
	"default_line_ending": "unix",
	"draw_white_space": "all",
	"ignored_packages":
	[
		"Vintage"
	],
	"show_encoding": true,
	"show_line_endings": true,
	"translate_tabs_to_spaces": true,
}
```


### Trailing Spaces の設定
正規表現に全角スペースを追加

```json:Preferences_Package-Settings_Trailing-Spaces_Setting-User
{
    "trailing_spaces_regexp": "[　]|[ \t]+",
    "trailing_spaces_highlight_color" : "comment",    // invalid|error|comment
}
```
設定後はSublimeTextを再起動しましょう。  

-----
gitlabでリポジトリ作ろうとしたら、「Unable to save project: Cannot allocate memory 」と言われた

gitlabでリポジトリを作ろうとしたら、

```
Unable to save project: Cannot allocate memory - フォルダのパス
```

と出て、リポジトリが作られなかった。

調べたところ、gitlabを再起動させれば治ることがあるらしい。

なので、gitlabを再起動させたら、治った。

自分はdockerでgitlabを動かしていて、
sameersbnさんの https://github.com/sameersbn/docker-gitlab 
を使用していたため、以下のように再起動させた。

```
/etc/init.d/gitlab restart
```
[RubyOnRails] 複数のRailsのバージョンを管理する方法 ~ 0から始めるRails編 ~ 

# 複数のRailsのバージョンを管理する方法 ~ 0から始めるRails編 ~ 

１つのRubyのバージョンで複数のRailsのバージョンを使用する機会があったためご紹介します。

## 環境
1. rvm

## 導入
1. gemsetの作成

バージョン名の部分は適当な名前でもいいのですが,
わかりやすくするためバージョン名にすることをお勧めします。

```
rvm gemset create バージョン名
```

2. 作成したgemsetへ変更

```
rvm gemset use バージョン名
```

3. Railsインストール

```
gem install rails -v 'バージョン'
```

もし, デフォルトで設定したい場合は次のように設定する必要があります。

```
rvm --default gemset use バージョン名
```

以上で紹介終わります。
形態素解析器で使われる日本語品詞体系

日本語テキストを扱う時はよく形態素解析器を利用しています。
特に品詞情報を利用して機能語を排除したりするフィルタリング作業を前処理の段階ですることが多いです。

どのような品詞を使ってどのような品詞は使わないのかを決めるためには形態素解析器に使われている品詞体系を知る必要があります。
一般的に使われているJuman, Chansen, MeCabは下記のような品詞体系を使っています。

| 形態素解析器 | 品詞体系 |
|:-----------|:------------|
| Juman  | 益岡・窪田文法を拡張したもの |
| Chasen | IPA |
| MeCab | IPA |

具体的な内容に関しては下記のサイトによく纏められていますので、ご参考になると思います。
http://www.unixuser.org/~euske/doc/postag/#chasen