OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby][Rails]テキスト内のURLをaタグに書き換える


RailsでWebページ上にテキストを表示するときにときに
自動でテキスト内のURLをaタグに書き換えてくれたら楽だなーと思って調べてみた。

```application_helper.rb

require "uri"

def text_url_to_link text

  URI.extract(text, ['http']).uniq.each do |url|
    sub_text = ""
    sub_text << "<a href=" << url << " target=\"_blank\">" << url << "</a>"

    text.gsub!(url, sub_text)
  end

  return text
end
```

これでいいみたい。

１．URIというライブラリを使ってテキスト内からURLを取得する。

```application_helper.rb
require "uri"
```

```application_helper.rb
URI.extract(text)
```

（追記 2014/4/18）
KitaitiMakotoさんにコメントいただきました。

```application_helper.rb
URI.extract(text)
```
だと`mailto`や`ftp`などのスキームも抜き出してしまうようです。
なので、第二引数を追加

```application_helper.rb
URI.extract(text, ['http'])
```


２．取得したURL（同じのを一気にやるためユニークにする）を書き換える

```application_helper.rb
URI.extract(text, ['http']).uniq.each do |url|
    sub_text = ""
    sub_text << "<a href=" << url << " target=\"_blank\">" << url << "</a>"

    text.gsub!(url, sub_text)
  end
```

sub_textっていうのが書き換え後のテキスト。
aタグ作って今回は全て別のタブで開くために `target="_blank"` を追加

３．書き換えたテキストを戻り値として返す

```application_helper.rb
return text
```


４．Viewから読み出す

```url.html.erb

<%= text_url_to_link(h(@text)).html_safe %>

```

これで`@text`に含まれるURLをaタグに自動で書き換えてHTMLで表示することができる。
h()とか、.html_safeとかなんだよってひとはこちら。

[[Rails]ERBのエスケープを自在に扱おうぜ](http://qiita.com/stkn_bb/items/7bcdb59eae82776375f9)
[Rails]ERBのエスケープを自在に扱おうぜ

## コメントにてご指摘をいただきました

> HTMLタグを動的に生成する必要がある場合も、content_tagや（aタグでは）link_toなど、Railsの用意しているヘルパーを使えば、HTMLとして出力するかエスケープするかを適宜判断してくれます（自分でhやhtml_safeしなくて問題ありません）。

```using_helper.rb
def return_url2(text)
  link_to text, 'http://google.com/'
end
```

>純粋な文字列リテラルを.html_safeするのはありかもしれませんが、どこから来るかわからない入力で、テキストからHTMLを生成するのは、（ユーザーからHTMLを受け付けることが本当に必要な場合など）よほどの場合をのぞいて避けるべきでしょう。

##Rails3からはHTMLタグが自動エスケープする
Rails3からの機能らしいんですが、
ERBで

```
<%= @text %>
```
とかやって`@text`内の文字列をHTMLに変換するときにHTMLタグ等を自動でエスケープするようになってます。

これはユーザーに任意で文字列を入力してもらうときのセキュリティ対策として必須です。

けどHTMLタグをHelperとかで作成したい場合とか困ります。

```application_helper.rb
def return_url
  return "<a href="http://google.com">http://google.com</a>"
end
```

``` test.html.erb
<%= return_url %>
```
↓こうHTML出力される

```
<a href="http://google.com">http://google.com</a>
```

##html_safeメソッドを使おう
そんなときは `html_safe`メソッドを使う

```
<%= return_url.html_safe %>
```

とすると、http://google.com がこちらで意図したとおりaタグで出力されます。

##けどセキュリティ的に心配
さっきのHelperメソッドレベルであればhtml_safeメソッドを使うだけで問題ないんですが、ユーザーが任意で入力できるテキストにこちらが意図してHTMLタグを埋め込みたい場合に困ります。

例えばメッセージ等の中にURLが組み込まれている場合、それをaタグで囲ってブラウザ上でクリックできる状態（＝有効化）にしたい。。
けどメッセージはユーザーが任意で入力できるため、ユーザーが入力したHTMLタグ等はエスケープ（＝無効化）したい。。

という割とよくある？ケースにはこうしたほうが良いです。

```test.html.erb
<%= return_url2(h(@test_text)).html_safe %>
```

ちょっとわかりづらいので順を追って。。

１．controllerから取得したテキストをhメソッドでエスケープ（無効化）します。

```test.html.erb
h(@test_text)
```
２．エスケープした後の`@test_text`をHelperメソッドの`return_url2`に渡します。
（`return_url2`メソッドは任意）

```test.html.erb
return_url2(h(@test_text))
```

３．`return_url2`メソッドの結果をhtml_safeにする
（こちらが意図して付けたHTMLタグは有効化する）

```test.html.erb
return_url2(h(@test_text)).html_safe
```

４．完成。

```test.html.erb
<%= return_url2(h(@test_text)).html_safe %>
```


##まとめ
html_safeメソッド（HTMLタグの有効化）とhメソッド（HTMLタグのエスケープ＝無効化）をきちんと使い分ければHTMLタグエスケープもあなたのもの！

※もうちょっといい書き方あるよってひとは是非教えて下さい！！
Rails でリソース ID にドットを含めつつフォーマットを指定する

地味にハマったのでメモ。

Rails でリソース ID にドットを含めたい場合、

```routes.rb
resources :users, id: %r{[^/]+} do
  ...
end
```

と書くと、フォーマットも ID に含まれてしまう。
例えば、`/users/bob.dylan.json` にアクセスすると、`id: bob.dylan.json`, `format: html` なんてことになる。

これを回避するには、以下のように書けば良かった。

```routes.rb
resources :users, id: %r{[^/]+?}, format: /json|csv|xml|html/ do
  ...
end
```
Mac（OS X 10.9.2）でRuby On Railsの環境構築


##XcodeとCommand Line Toolsをインストール
まず、XcodeとCommand Line Toolsをインストール。
XcodeはAppStoreから。Command Line Toolsは以下の方法でインストール。

###Command Line Toolsインストール手順
1.メニューからXcode > Open Developer Tool > More Developer Tools。

2.Downloads for Apple Developerページが開くので、リストから”Command Line Tools(OS X Mavericks) for Xcode”をダウンロードしてインストール。


##Homebrew（パッケージマネージャ）をインストール
続いて、Homebrewのインストール。
[Homebrewについてはココを読んでください。](http://brew.sh/index_ja.html)

ターミナルを立ち上げて以下のコマンドを入力。

```bash:
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
```

` $ brew doctor `と入力して、「Your system is ready to brew.」と表示さればOK。

##Rubyのインストール
まずはターミナルで以下のコマンドを入力。

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

続いて、以下のコマンドを入力し、プロファイルに eval "$(rbenv init -)" を追加する。

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

` $ echo $PATH `と入力して、Pathを確認。
以下のようになっていればOK。
` /Users/****/.rbenv/shims:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin `



Pathが通ったら、ターミナルで以下のコマンドを入力すると、インストール可能なバージョンのリストが表示されます。

```bash:
$ rbenv install -l
```

以下のコマンドを入力し、2.1.1をインストールします。

```bash:
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.1.1
```

インストールが完了したら、元々インストールされているRubyと切り替えます。以下のコマンドを入力。

```bash:
$ rbenv global 2.1.1
$ rbenv rehash
```
` $ ruby -v `を入力して、バージョンを確認。

##Railsをインストール
ターミナルで以下のコマンドを入力し、Railsをインストール。

```bash:
$ gem install rails
```

インストールが完了したら` $ rails -v `と入力して確認。
Macで"cdf v2 document, corrupt: can't expand summary_info"

簡単なファイルアップロード機能ですが、Macでの開発環境である.docファイルはアップロードできない。

#１．現象：

>The filetype you are attempting to upload is not allowed.

mimes.php

```php
'doc' => 'application/msword'
```

upload.php

```php
$config ['allowed_types'] = 'doc|docx';

var_dump($_FILES);

var_dump($this->upload->data());

```

`$_FILES`の`type`は確かに`application/msword`になっていますが、`$this->upload->data()`の`file_type`は
cdf v2 document, corrupt: can't expand summary_infoになっています。

# ２．（多分の）原因

ファイルのContentTypeを推測する時がエラーになったらしいです。

CIのソースをDEBUGすると、問題は下記の箇所にありそうです。

```php
// Fall back to the deprecated mime_content_type(), if available (still better than $_FILES[$field]['type'])
if (function_exists('mime_content_type'))
{
  $this->file_type = @mime_content_type($file['tmp_name']);
  if (strlen($this->file_type) > 0) // It's possible that mime_content_type() returns FALSE or an empty string
  {
    return;
  }
}
```

この処理の直前`finfo_file`を利用しContentTypeを取得する処理があったんですが、前年ながら取得できなかったんです。

#３．解決方法

自分も変だと思いますが

```php
'doc'	=>	array('application/msword',"cdf v2 document, corrupt: can't expand summary_info"),
'docx'	=>	array("cdf v2 document, corrupt: can't expand summary_info",
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    'application/zip'),
```

`mimes.php`ファイルに"cdf v2 document, corrupt: can't expand summary_info"をContentTypeとして追加しました。
Railsを本番稼働させるときはnginxとsession storeの設定に注意


これ、今後リリースするアプリは毎回注意しなきゃなと思いました。

## 背景

本番稼働させたアプリが予期せぬ502や、Railsのエラーが出るようになってしまいました。
何かと思って調べたら以下の２つのエラーが出ていました。

### nginx

    upstream sent too big header while reading response header from upstream

### rails

    ActionDispatch::Cookies::CookieOverflow

それぞれ上限値を越えてしまったために、出たエラーです。

回避する設定は以下。

※追記（2014/04/15 21:00）
そもそもnginxでheaderがデカイって怒られている原因はcookieに一杯値が入っていただけで、その原因はsessionに値をたくさん突っ込むようなことをしていたからなので、そもそもその時点で問題があります。

今回は一度nginxのエラーを解消しなければcookieの問題も気が付かなかったのですが、session storeをcookie以外にした時点でnginxのproxy bufferの設定は不要かなと思いました。

ということで、nginxの設定については蛇足ですね。

## nginxのproxy bufferの設定

[参考](http://stackoverflow.com/questions/13894386/upstream-too-big-nginx-codeigniter)

参考URLの用に`nginx.conf`の`http{}`の中に以下の設定を追加するだけで直りました。
デフォルトのproxy bufferのサイズを超えていたようです。

```nginx.conf
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
```

暫定ですが、上記の値にしました。

## session storeをcookieからactiverecordに変更

必ずしもactiverecordでなくてもいいです。memcachedやredisでもいいと思います。とにかくcookie以外で。

[参考](http://o.inchiki.jp/obbr/154)

Rails4からはgemを入れないとだめだそうです。

```diff:Gemfile
+gem 'activerecord-session_store'
```

session storeを変更します。

```diff:config/initializers/session_store.rb
-YourAppName::Application.config.session_store :cookie_store, key: '_your_app_name_session'
+YourAppName::Application.config.session_store :active_record_store, key: '_your_app_name_session'
```

```
$ bundle install
$ rails g active_record:session_migration
$ rake db:migrate
※本番リリース時はRAILS_ENV=productionをつける
```

あとは再起動して終了です。

懸念としては、

- 現在ログインしているユーザーはログアウトしてしまう
- sessionに一時的に値を保存するような処理中だとエラーが発生する（何かの登録処理など）

大規模になってしまってからはやりづらいので最初から行っておきたいですね。
Rubyで外部コマンド実行結果を一行づつ受け取る


こういうRubyのコードがあって

```ruby:target.rb
10.times do |i|
  sleep 0.1
  puts i
end
```

別のRubyのプログラムから上記スクリプトを実行して、結果を一行づつ取得したい。Ruby弱なので1時間くらい調べた。。

`IO.popen`を使う。

```ruby:script.rb
IO.popen('ruby target.rb').each do |line|
  puts line.chomp
end
```

ただしこのままだと対象のRubyスクリプトが出力をバッファリンスするので、`target.rb`の実行が終わるまで結果が渡ってこない。

`target.rb`に以下の行を足すとバッファリングしないようにできる。

```ruby:target.rb
STDOUT.sync = true
```

標準エラーも取得したいときは`IO.popen`のオプションで標準エラーをリダイレクトするように指定する。

```ruby:target.rb
STDOUT.sync = true

10.times do |i|
  sleep 0.1
  puts "stdout: #{i}"
  warn "stderr: #{i}"
end
```

```ruby:script.rb
IO.popen('ruby target.rb', :err => [:child, :out]).each do |line|
  puts line.chomp
end
```

[Ruby 2.1.0 リファレンスマニュアル | class IO](http://docs.ruby-lang.org/ja/2.1.0/class/IO.html#S_POPEN)
第一回 オフラインリアルタイムどう書く の回答

http://nabetani.sakura.ne.jp/hena/1/ の回答
### コンパイル方法と実行方法
> $ gcc main.m -framework Foundation
> $ ./a.out < input.txt

### ソースコードとインプットファイル

```objc:main.m
#import <Foundation/Foundation.h>
NSString* ox(int i) {
    return (i == 0)? @"o" : @"x";
}

NSString* playgame(NSString *str) {
    int b[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
    const char* cstr = [str UTF8String];
    for(int i = 0; i < 9; i++) {
        int p = i % 2;
        int s = cstr[i] - '0' - 1;
        if(b[s] != 0) return [[NSString alloc] initWithFormat:@"Foul : %@ won.", ox((i + 1) % 2)];
        else b[s] = p + 1;
        
        if((b[0] & b[1] & b[2]) ||
           (b[3] & b[4] & b[5]) ||
           (b[6] & b[7] & b[8]) ||
           (b[0] & b[3] & b[6]) ||
           (b[1] & b[4] & b[7]) ||
           (b[2] & b[5] & b[8]) ||
           (b[0] & b[4] & b[8]) ||
           (b[2] & b[4] & b[6])) return [[NSString alloc] initWithFormat:@"%@ won.", ox(p)];
    }
    return @"Draw game.";
}
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSString *str = [[NSString alloc]
                         initWithData:[NSData
                                       dataWithData:[[NSFileHandle fileHandleWithStandardInput]
                                                      readDataToEndOfFile]]
                         encoding:NSUTF8StringEncoding];
        NSArray *lines = [str componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
        NSError *error = nil;
        NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"([0-9]+) +(.*)" options:0 error: &error];
        if(error == nil) {
            for(NSString* line in lines) {
                NSTextCheckingResult * match = [regex firstMatchInString:line options:0 range:NSMakeRange(0, line.length)];
                if([match numberOfRanges] == 3) {
                    NSString *result = playgame([line substringWithRange:[match rangeAtIndex: 1]]);
                    if([result compare:[line substringWithRange:[match rangeAtIndex: 2]]] != 0) {
                        NSLog(@"input:%@", [line substringWithRange:[match rangeAtIndex: 1]]);
                        NSLog(@"actual  :'%@'", result);
                        NSLog(@"expected:'%@'", [line substringWithRange:[match rangeAtIndex: 2]]);
                    }
                }
            }
        }
        
    }
    return 0;
}
```

```text:input.txt
79538246    x won.
35497162193 x won.
61978543    x won.
254961323121    x won.
6134278187  x won.
4319581     Foul : x won.
9625663381  Foul : x won.
7975662     Foul : x won.
2368799597  Foul : x won.
18652368566 Foul : x won.
965715      o won.
38745796    o won.
371929      o won.
758698769   o won.
42683953    o won.
618843927   Foul : o won.
36535224    Foul : o won.
882973      Foul : o won.
653675681   Foul : o won.
9729934662  Foul : o won.
972651483927    Draw game.
5439126787  Draw game.
142583697   Draw game.
42198637563 Draw game.
657391482   Draw game.
```
CakePHP dev-3 + Windows7 + IIS + MySQLの環境構築

### 前提条件
- composerインストール済み（composerパス設定済み）
- php5.4.19以上インストール済み
- MySQLインストール済み

### CakePHP dev3.0のインストール

[GitHubのリポジトリ](https://github.com/cakephp/cakephp/tree/3.0.0-dev2)にはcomposerからインストールできると書いてある（と思う）がうまくいかないので、[app skeleton](https://github.com/cakephp/app)からgit cloneする方法でインストールする。

```bat:cmd
rem composer自身のアップデート
composer self-update

rem cakephp/appパッケージから[app_name]のプロジェクトを作成
composer create-project -s dev cakephp/app [app_name]

rem [app_name]に移動
cd [app_name]/vendor/cakephp/cakephp

rem cakephpリポジトリをクローン
git clone git://github.com/cakephp/cakephp.git

rem cakephp 3.0ブランチをチェックアウト
git checkout -t -b 3.0 origin/3.0
```

### ディレクトリ構成

```
[app_name]
  |
  |-App
  | ...
  |-Plugin
  |-Test
  |-tmp
  |-vendor
  |   |-bin
  |   |  |...
  |   |-cakephp
  |   |  |-cakephp
  |   |  |    |-src  //Cake Core
  |   |  |    |-tests
  |   |  |...
  |   |-composer
  |   |  |...
  |   |-d11wtq
  |   |  |...
  |   |-autoload.php
  |   |-empty
  |-webroot
      |...
```

### web.configの設定

[URL Rewrites on IIS7 (Windows hosts)](http://book.cakephp.org/2.0/en/installation/url-rewriting.html#url-rewrites-on-iis7-windows-hosts)をそのままコピーして[app_name]直下に配置

### [app_name]/index.phpの追加
下記を追記したindex.phpを[app_name]直下に配置

```php:[app_name]/index.php
require 'webroot' . DIRECTORY_SEPARATOR . 'index.php';
```

### app.phpの設定（データベース設定）

```php
'Datasources' => [
	'default' => [
		'className' => 'Cake\Database\Connection',
		'driver' => 'Cake\Database\Driver\Mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'my_app',
		'password' => 'secret',
		'database' => 'my_app',
		'prefix' => false,
		'encoding' => 'utf8',
		'timezone' => 'UTC'
	],

	/**
	 * The test connection is used during the test suite.
	 */
	// 'test' => [
	// 	'className' => 'Cake\Database\Connection',
	// 	'driver' => 'Cake\Database\Driver\Mysql',
	// 	'persistent' => false,
	// 	'host' => 'localhost',
	// 	'login' => 'my_app',
	// 	'password' => 'secret',
	// 	'database' => 'my_app',
	// 	'prefix' => false,
	// 	'encoding' => 'utf8',
	// 	'timezone' => 'UTC'
	// ],
	],
...
```

### プラグインの追加
推奨プラグインであるDebugKitとlocalizedをcomposer.jsに追加

```json:composer.json
...
"require": {
...
    "cakephp/debug_kit": "2.2.*",
    "cakephp/localized": "2.1.*"
}
...
```

composer実行

```bash:cmd
cd [app_name]
composer update
```

### 確認
`http://localhost/[app_name]`にアクセスして、下記画面がでればOK!

![SnapCrab_NoName_2014-4-14_16-40-6_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/41052/f0323539-5257-64ed-420a-36fcc4988a69.jpeg)
[CakePHP 2.x] phpで拡張子取得方法、ファイルを使う際の便利関数 pathinfo

cakephp3日目。
拡張子取得したついでに、pathinfoの使い方を学びましたよ。
cakeというかphpですね。。

```php
$ext = pathinfo($file, PATHINFO_EXTENSION);
```

もしくは

```php
$pathinfo = pathinfo($file);
$ext = $pathinfo['extention']
```

な感じです。

pathinfoでは他にもこんな使い道も。

```php
$file = "/hoge/fuga/index.php";
---
// 親ディレクトリのパス ⇒ ”/hoge/fuga”
$dirName = pathinfo($file, PATHINFO_DIRNAME);
// ファイル名 ⇒ ”index.php”
$baseName = pathinfo($file, PATHINFO_BASENAME);
// 拡張子無しファイル名 ⇒ "index"
$fileName = pathinfo($file, PATHINFO_FILENAME);
// 拡張子 ⇒ ”php”
$extension = pathinfo($file, PATHINFO_EXTENSION);
```

# 参考

http://www.php.net/manual/ja/function.pathinfo.php
Android Studio ショートカットキーリスト for Mac

Android Studio を使用するにあたって、知っておくと楽になるであろうショートカットキーを Mac 向けにまとめてみました。**キーバインドの設定は Mac OS X** のものになります。
英語の CheatSheet は Android Studio から参照できます。（Help → Default Keymap Reference）

バージョンによっては、デフォルトで設定されているショートカットキーが異なる（設定されていない）ケースがあるようなので注意です。

ショートカットキーの設定は、Preferences（`⌘ + ,`） の Keymap で確認できます。また、キーバインドの変更もここで可能です。    
デフォルトでは未割り当てのコマンドもあるので、便利なものには割り振りましょう。

##### 特殊キー

|記号|意味|
|---|---|
|⌃|control|
|⌘|command|
|⌥|alt/option|
|⇧|shift|

##### 入力系

|Action|　　　　key　　　　|説明
|-------|:-----------------:|---|
|Code Completion|⌃ + space|コード補完|
|Reformat Code|⌃ + ⌥ + l|ソースコードのフォーマット|
|Optimize Imports…|⌃ + ⌥ + o|インポート文の最適化|
|Rename|⇧+ F6|リネーム|
|Extract Variable|⌃ + ⌥ + v|左辺をローカル変数として宣言|
|Extract Field|⌃ + ⌥ + f|左辺をメンバ変数として宣言|
|Extract Parameter|⌃ + ⌥ + p|左辺をメソッドのパラメータとして宣言|
|Override Methods|⌘ + o|オーバーライドメソッド一覧を表示。  オーバーライドメソッドのインサートができる。|
|Duplicate Line or Block|⌘ + d|(複数)行複製|
|Delete Line|⌘ + y|行削除|
|Move Line Up|(⌥ or ⌘) + ⇧ + ↑|行移動（↑）|
|Move Line Down|(⌥ or ⌘) + ⇧ + ↓|行移動（↓）|
|Go to Line|⌘ + g|入力した行番号に移動|
|Code generate|⌃ + n|コード生成メニュー(constructor,getter/setter etc…)を表示|
|Comment with Line Comment |⌘ + /|コメントアウト|
|Comment with Block Comment |⌘ + ⇧ + /|ブロック形式のコメントアウト|
|Auto-Generating JavaDoc stubs |対象の前で/**を入力してEnter|Javadocコメント|
|Start new line|⇧ + Enter|新しい行を作成し移動|
|Complete Current Statement|⌘ + ⇧ + Enter|ステートメント補完。セミコロンや括弧などを補完。|
|Project quick fix|⌥ + Enter|クイックフィックス|
|Select Word at Caret|⌘ + w|構造選択。単語単位の選択から始まり繰り返すと選択範囲が広がる|
|Unselect Word at Caret|⌘ + ⇧ + w|構造選択。繰り返すと選択範囲が狭まる|
|Move Caret to Line Start|home(fn + ←)|行の先頭に移動|
|Move Caret to Line End|end(fn + →)|行の末尾に移動|
|Move Caret to Line Start with Selection|⇧ + home(fn + ←)|範囲選択しつつ行の先頭に移動|
|Move Caret to Line End with Selection|⇧ + end(fn + →)|範囲選択しつつ行の末尾に移動|
|Toggle Case|⌘ + ⇧ + u|大文字小文字の切り替え|
|Next/previous highlighted error|F2 , ⇧ +F2 |ハイライトされているエラーに移動|

##### コード表示系

|Action|key|説明|
|---|-------------------------|---|
||⌘ + b|キャレットがあたっているクラス、メソッドの内容を表示|
|File structure popup|⌘ + F12|変数、メソッド一覧をポップアップで表示|
|Type Hierarchy|⌃ + h|クラスの階層を表示。選択したクラスに飛ぶことできる|
|Method Hierarchy|⌘ + ⇧ + h|メソッドの階層を表示。選択したメソッドに飛ぶことできる|
|Quick Documentation|^ + j|Javadocを表示|
|Select Next(Previous) Tab|⌥ + →（←）|エディター内の表示ファイルを←→で変更|
|Select Next(Previous) Tab in multi-editor file|⇧ + ⌃ + →（←）|レイアウトエディターのDesign、Text表示を←→で切り替え|
|Select Next(Previous) Tab|⌥ + →（←）|エディター内の表示ファイルを←→で変更|
|Close|⌘ + F4|エディタータブを閉じる|
|Close Others|未割り当て|アクティブではない他のエディタータブを閉じる|

##### 検索系
|Action|　　　　key　　　　　|説明|
|---|:-------------------------:|---|
|Navigate Class…|⌘ + n |クラスを検索する|
|Navigate File…|⌘ + ⇧ + n |ファイルを検索する|
|Find|⌘ + f ||
|Find in Path|^ + ⇧ + f ||
|Replace|⌘ + r ||

##### ビルド、実行系

|Action|　　　　key　　　　　|説明|
|---|:-------------------------:|---|
|Make Project|⌘ + F9 |ビルド|
|Rebuild Project|未割り当て|リビルド|
|Clean Project|未割り当て|クリーン|
|Run|⇧ + F10|実行|
|Debug|⇧ + F9|デバッグ実行|
|Sync Project with Gradle Files|未割り当て|gradleの記述内容とプロジェクトを同期します|
Devise で送信するメールのローカライズ


[Devise](https://github.com/plataformatec/devise)を使って送信されるメールのローカライズしたい。
けど、多言語化ファイル（config/locales以下のファイル）を使ったローカライズだと自由度が効かない。

**要するに言語ごとにメールのテンプレートを分けたい！**

という方のための方法。

## Devise の helper を上書き

結論から言うと、テンプレートファイルを呼び出す順番を書き換える。
以下を `config/initializers/devise.rb` に追記する。

```ruby:config/initializers/devise.rb
module Devise
  module Mailers
    module Helpers
    protected
      def template_paths
        template_path = _prefixes.dup
        template_path.unshift "#{@devise_mapping.scoped_path}/mailer" if self.class.scoped_views?
        template_path.unshift "#{@devise_mapping.scoped_path}/mailer/#{I18n.default_locale}" if self.class.scoped_views?
        template_path
      end
    end
  end
end
```

ポイントは、`template_path` の先頭にロケール情報を含んだパスを追加する。

例えば、`rails generate devise User` で `users` というスコープを作成していて、
標準ロケールを日本語に設定している場合（`config.i18n.default_locale = :ja`）

```ruby:追記前
template_paths # => ['users/mailer', 'devise/mailer']
```

```ruby:追記後
template_paths # => ['users/mailer/ja', 'users/mailer', 'devise/mailer']
```

になる。
これで、Devise がメールを送る場合に探し出すテンプレートファイルの順番が

1. app/views/users/mailer/ja
2. app/views/users/mailer
3. devise/mailer

に変わるので、ja ファイルの下に日本語で書かれたテンプレートファイルを置く。

これで、言語ごとにテンプレートファイルを分けることができる。
Nginxを使ってファイルアップロードを高速化する方法


## 問題

Webアプリケーションで、大きなファイルのアップロードを受け付けると、リクエストベース（イベントベースじゃない）で作られたWebApplicationでは、 **プロセスがその処理にロックされて、他の処理が遅延しパフォーマンスがでなくなります** 。


## 解決策

**ファイルを受け取る** 部分をNginxに任せることが出います。
Nginx(イベントベース)のプロセスにファイルのアップロードを担当させて、アップロードしたファイルをApplicationに渡すことができます。ファイルの情報は、ヘッダーで受け取ります。


### Before
```
Client(ファイルをアップロード)
↓
Nginx ()
↓
App   (ファイルを受け取って、保存)
```

### After
```
Client(ファイルをアップロード)
↓
Nginx (ファイルを受け取って、保存)
↓
App   (保存されたファイルパスとリクエストを受け取る)
```

## 設定

NginxにFileUplodaを行うlocationを指定し、保存先を決めます。
さらに、そのリクエストをproxy_passでbackendのApplicationサーバに送ります。

```nginx
  location /nignxupload {
          limit_except POST          { deny all; }

          client_body_temp_path      /tmp/;
          client_body_in_file_only   on;
          client_body_buffer_size    128K;
          client_max_body_size       1000M;

          proxy_set_header           X-FILE $request_body_file;
          proxy_pass                 http://app_upstream/file/;
  }
```

この設定で、app_upstremにX-FILEヘッダーにてPATHが指定されたリクエストが送られます。

ApplicationをRailsの場合以下のようにします。

```rb:controller

class ApplicationController < ActionController::Base
  def status
    render :text => 'YES'
  end

  def file
    render :text => request.headers['X-File']
  end

  def app_upload
    render :text => params[:file].original_filename
  end
end
```

```rb:config/routes.rb
Rails.application.routes.draw do
  match '/status' => 'application#status', via: [:get, :post]
  match '/file' => 'application#file', via: [:get, :post]
  match '/appupload' => 'application#app_upload', via: [:get, :post]
end
```


## 機能評価


### 条件

```
Haproxy -> Nginx -> App
```
apache benchで一定の負荷をかけながら、threadで同時にファイルをアップロードします。
`Nginx Upload` を叩くURLと`App Upload` を叩くURLを用意して比較しました。

```
## 一定の負荷を常にかける
$ab -n 100 -n 1000000 'http://www.example.com/status'

## スレッドでfileをUploadする
$ruby upload_via.rb nignxupload
$ruby upload_via.rb appupload
```

```rb:upload_via.rb
100.times do
  Thread.new do
    system("curl -H "X-FILE: vagrant" -F file=@README.rdoc  -s -D - http://www.example.com/#{ARGV.first}")
  end
end
```

の構成で、Newrelicを使って調べてみた。

### 結果

App Uploadを使った場合は、プロセスがうめられHaproxyで待たされます(Request Queuing)。プロセスが埋まってしまったため、スループットは出なくなります。
一方Nginx Uploadを使った場合は、NginxがUploadの処理をするためAppプロセスは埋まらずに返信し続けれます。

![スクリーンショット_2014-04-14_14_53_26.png](https://qiita-image-store.s3.amazonaws.com/0/1232/66b8920f-ca63-63ae-5f3c-ed013e3e4d8f.png)


`Nginx Upload`
![スクリーンショット 2014-04-14 14.53.58.png](https://qiita-image-store.s3.amazonaws.com/0/1232/1424ed75-2653-a9d2-5a1f-0d5017178b0a.png)
![](http://i.gyazo.com/bafb79ff15cf9cd1b7c85919f5b3a867.png)

`App Upload`
![スクリーンショット 2014-04-14 14.54.07.png](https://qiita-image-store.s3.amazonaws.com/0/1232/49c8807c-5cde-745e-ca08-cb078fdcd846.png)
![](http://i.gyazo.com/2ab7286c468f46f6d07c53c6837377fe.png)


## セキュリティについて

- Railsでいうと、`protect_from_forgery`をOffにして、nginxからのアクセスについて、何かしらの制限をかける必要がある(ex: internal制限をする)
- uploadされまくらないように、何かしらの制限を考える必要ある(ex: basic auth)


## 参考
https://coderwall.com/p/swgfvw
phpのaddRecordメソッドの有無について

http://www.amazon.co.jp/CakePHP-1-3%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E2%80%95%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798026646

上の本使ってCakeを勉強しているんですが、DB管理の部分で「レコードの追加」をする際に、addRecordメソッドを紹介していました。

そこで実際に

```php 
class BoardsController extends AppController{

	public $name = 'Boards';

	function index(){
		$data = $this->Board -> find('all');
		$this->set('data',$data);
	}

	function addRecord(){
		if (!empty($this->data)) {
			$this->Board -> save($this->data);
		}
		$this -> redirect('.');
	}
}
```

で記述してみたところ、

ブラウザ上で、エラーが起きました。
どうやらaddがないから登録して！って言われているのですが、もうこのaddRecordメソッドって使われていいないのでしょうか？
PHPのバージョンは5.5です。

エラーで出ていた通りに
```php
function add(){}
```

に置き換えたらエラーなく、レコードの追加の動作ができました。

メソッドに関してはControllerでfunciton定義すればいけそうなのですが、PHPの最新のメソッドをまとめたものってどこかにあるのだろうか？
http://oki2a24.com/2013/11/28/cakephp2-non-action-error/
官能検査の概要

# 官能検査とは

人の感覚器官を利用して物の品質や特性を評価する方法を官能評価、その検査を官能検査と言います。官能評価において検査によって得られたデータは統計的に解析する必要があります。そこでよく使われる統計学的に有効な手法としては主に次のようなものがあります。

* 二項検定
* カイ二乗検定
* ｔ検定
* 分散分析
* 回帰分析
* 主成分分析
* ノンパラメトリック検定

などなど……。今までの統計学の話でも登場した手法がちらほらとうかがえることがわかります。

特に最初の二項検定は官能検査では基本的な検定であり、その種類として 2 点識別法、 2 点嗜好法といったものが挙げられます。

## 2 点識別法と 2 点嗜好法のちがい

A と B の試料を比較、感覚によって両者の間に順位を付けるのが 2 点識別法です。ただし A と B には客観的な基準による順位が存在している必要があります。したがって人の感覚によって判断した順位が正しいか誤答であるか、明確に判定できることになります。

このことから 2 点識別法で利用されるのは片側検定です。

これに対し 2 点嗜好法では A と B に客観的順位が存在しない状況を想定します。したがって両側検定をすることになり、これが 2 点識別法と嗜好法の大きな違いです。

ちなみに、片側検定と両側検定の違いについては[このあたり](http://homepage2.nifty.com/nandemoarchive/toukei_hosoku/ryougawa_katagawa.htm)が参考になります。

2 点識別法は、ユーザーが A と B を識別する能力を持つか、また A と B の間に有意な差があるかをテストする場合など、幅広く適用されます。

## その他の官能評価手法

#### フェリスの 2 点嗜好法

2 点嗜好法では試料 A B のうちどちらが好みであるか明示します。これに対し A B のいずれも等しく好む人の割合を推定したい場合があります。これを考慮したのがフェリスの 2 点嗜好法です。

#### 1 点識別法

ランダムに存在する A 及び B の試料から 1 個ずつサンプルを抽出、これがいずれであるか判定するのが 1 点識別法です。このとき、試料がすべて A であるかもしれないし、あるいは A が 1 つも含まれていない可能性もあります。また総数がいくつであるかも通常は開示されません。

#### 1 点嗜好法

ある品物に対する消費者の嗜好を調べるためにそれを 1 つだけ提示して「美味しい」「まずい」のように 2 項で判定させるのが 1 点嗜好法です。

#### 3 点識別法

試料 A と B が識別可能かを調べるために AAB のように 3 個の試料を用意、このうちどれとどれが同じで異なっているものはどれかというふうにテストするのが 3 点識別法です。
2 点識別法では A と B の差が明らかである必要があったのに対し、こちらはどういう性質の差があるのか不明であっても適用できるという利点があります。

#### 3 点嗜好法

AAB のように試料を用意、ひとつだけ異なる試料を選出したのちに、残りと比較してどちらが良いかをテストする方法が 3 点嗜好法です。

他にもたくさんの手法があるのですが掲載しきれないほどなのでこのあたりにしておきましょう。

## まとめ

官能検査における統計的な評価方法についてまずは手法を列挙しました。次回はその代表である二項検定について統計計算の過程を説明していきます。

## 参考

統計的官能検査法
http://www.amazon.co.jp/dp/4817190116
Unicode正規化とMySQLとPHPとMac OS X


#背景
Macでファイルパスをindex用にMySQL(innodb)に格納して

```
select * from hoge where `path` like ?
```

みたいなことをしたら濁点とかを含むひらがな、カタカナ（ex. アンパンマン）とかを入力しても引っかからない。recordから取得した文字を直接コピペすると引っかかる。みたいな不思議な現象、対策を考えた


#原因
Unicodeの正規化方法が異なっているのが原因。世の中のほとんどはNFCで正規化されているがMacのファイル・ディレクトリ名はNFDで正規化されている

#対策
どこかで正規化方法を統一できればよい

##MySQLで正規化
MySQLで正規化してくれると一番簡単なのですがデフォルトだとそのような機能は備わっていないもよう。utf8_general_ciとかでもダメ。プラグインを入れるとできるらしいが面倒なので他の方法をとることにした

##MySQLを使用するアプリケーション側で最適化
今回はクライアントがPHPなのでPHPで正規化した。mbstringあたりでやってくれると便利なのだがそういった機能はなかった

###PHP intlのインストール
ICUのラッパーらしいが名前が酷い。今回はhomebrewとjosegonzalez/homebrew-phpでPHPをインストールしていたので

```
install php55-intl
````

でインストールした。

###ファイルパスをNFC正規化してからinsertするようにする
http://php.net/manual/ja/class.normalizer.php

```php
$path = Normalizer::normalize($path, Normalizer::FORM_C);

// insert path to DB
```

#感想
Unicode正規化とMacのファイルシステムの話を知っていたのですぐに気付けたが、知らないとすごくハマりそうな問題である。
Unicode正規化ライブラリは主要な処理系(Java, .NET, Ruby, ...)にはあるがマイナーな処理系とかだとない場合もあってそういう時は大変そう。
Linuxオンリーとかで開発するとこの問題は発生しないので、対策が面倒であればMacを投げ捨てるのも一考である。
Mechanizeでsecure.nicovideo.jpに繋ぐ

ニコ動関連の小さなツールを作ってたんだけど、Ruby 2.0に上げてから動かなくなって放置していたのを久しぶりに調べてみた。

https://bugs.ruby-lang.org/issues/8590
パッチを見ると、net/httpの@ssl_sessionをnilにできればなんとかなりそう。
取り込まれていない理由は、ssl力が足らなくて議論の内容をちゃんと把握できてないのだけど、もっとちゃんとした方法の修正があるのだと思う。

で、とりあえずworkaroundが出来たので貼っておく。Mechanizeとnet/httpの間にはもう一個、net-http-persistentというgemが挟まっているので、それに対してRuby 2.xのModule#prependを使ってモンキーパッチしている。

```rb
require 'mechanize'
require 'logger'

class Net::HTTP::Persistent
  module DisableSslReuse
    def connection_for(uri)
      connection = super
      connection.instance_variable_set(:@ssl_session, nil)
      return connection
    end
  end

  prepend DisableSslReuse   # この行を外すとタイムアウトする
end

agent = Mechanize.new
agent.ssl_version = 'TLSv1'
agent.log = Logger.new(STDOUT)
p @agent.get('https://secure.nicovideo.jp')
```

Module#prependを使うと、本来のconnection_forより前にモンキーパッチのconnection_forが呼ばれるようになる。パッチ内ではsuperを使うことでもとのメソッドを呼び出せる。
第一回 オフラインリアルタイムどう書く の回答


http://nabetani.sakura.ne.jp/hena/1/ の回答


### 実行方法
>$php main.php < input.txt
>

### スクリプトとインプットファイル

```php:main.php
<?php
function ox($i) {
  return ($i == 0)? "o" : "x";
}
function play_game($str) {
  $board = array_fill(0, 9, 0);
  for($i = 0; $i < 9; $i++) {
    $p = $i % 2;
    $v = intval($str[$i]) - 1;
    if($board[$v] != 0) return sprintf("Foul : %s won.", ox(($i + 1) % 2));
    else                $board[$v] = $p + 1;
    if(($board[0] & $board[1] & $board[2]) ||
       ($board[3] & $board[4] & $board[5]) ||
       ($board[6] & $board[7] & $board[8]) ||
       ($board[0] & $board[3] & $board[6]) ||
       ($board[1] & $board[4] & $board[7]) ||
       ($board[2] & $board[5] & $board[8]) ||
       ($board[0] & $board[4] & $board[8]) ||
       ($board[2] & $board[4] & $board[6]))
       return sprintf("%s won.", ox($p));
  }
	return "Draw game.";
}
while(preg_match('/(\d+)\s*(.*)/',fgets(STDIN), $m)) {
	$res = play_game(strval($m[1]));
	if($res != chop($m[2])) {
	  printf("input:%s\n", $m[1]); 
	  printf("result = %s\n", $res);
	  printf("actual = %s\n", chop($m[2]));
	}
}
```

インプットファイル。
```text:input.txt
79538246	x won.
35497162193	x won.
61978543	x won.
254961323121	x won.
6134278187	x won.
4319581		Foul : x won.
9625663381	Foul : x won.
7975662		Foul : x won.
2368799597	Foul : x won.
18652368566	Foul : x won.
965715		o won.
38745796	o won.
371929		o won.
758698769	o won.
42683953	o won.
618843927	Foul : o won.
36535224	Foul : o won.
882973		Foul : o won.
653675681	Foul : o won.
9729934662	Foul : o won.
972651483927	Draw game.
5439126787	Draw game.
142583697	Draw game.
42198637563	Draw game.
657391482	Draw game.
```
デコレータ内でメソッドが定義されたクラス名を取得する

メソッドの実行時間をロギングする際に、クラス名が取得できずに苦労した時のメモ

#やりたいこと
    どのメソッドが何時実行されているか調査するために、デコレートしたメソッドでロギングする際に、クラス名とメソッド名を表示したい

##try1
### 実施内容
    普通にデコレートしてみる

```py
def deco(func):
    def inner(self, *args, **kwargs):
        result = func(self, *args, **kwargs)
        print 'class: %s, method: %s' % (
            func.im_class.__name__,
            func.__name__)
        # ロギング処理
        return result
    return inner
```

###結果: error
    funcが関数として渡されており、im_classを持っていなかった。
    このため、メソッド名は取れたが、クラス名が取れなかった。

##try2
###実施内容
    selfからクラス名を取得する。

```py
def deco(func):
    def inner(self, *args, **kwargs):
        result = func(self, *args, **kwargs)
        print 'class: %s, method: %s' % (
            self.__class__.__name__,
            func.__name__)
        # ロギング処理
        return result
    return inner
````

###結果: error?
    継承した際にサブクラス名が返ってきてしまうためNG

##try3
###実施内容
    クラスをデコレートする。

```py
def deco_cls(cls):
    def deco_method(func):
        def inner(self, *args, **kwargs):
            result = func(self, *args, **kwargs)
            print 'class: %s, method: %s' % (
                cls.__name__,
                func.__name__)
            # ロギング処理
            return result
        return inner

    for name, method in cls.__dict__.items():
        if name == 'target_func':
            setattr(cls, name, deco_method(method))
    return cls
```

###結果: OK
    target_funcとして比較していますが、実際に使用したバージョンでは対象とするメソッド名をタプルで用意して比較しました。明確に対象とするメソッドを指定したい場合は、さらに以下のような方法も可能です。

```py
def deco_cls(cls):
    def deco_method(func):
        def inner(self, *args, **kwargs):
            result = func(self, *args, **kwargs)
            print 'class: %s, method: %s' % (
                cls.__name__,
                func.__name__)
            # ロギング処理
            return result
        return inner

    for name, method in cls.__dict__.items():
        if hasattr(method, 'set_logger'):
            setattr(cls, name, deco_method(method))
    return cls

def set_logger_wrapper(func):
    func.set_logger = True
    return func
```
Jenkinsのグローバルセキュリティ設定でbacklogのアカウントを利用する


[前回](http://qiita.com/bisque33/items/0efa9a6df09a600a1294)は、Jenkinsからbacklogのリポジトリを監視できるようにしました。

今回は、同プラグインを利用して、backlogのアカウントでJenkinsにログインできるようにします。

## 設定方法

Jenkinsの管理＞グローバルセキュリティ設定で以下のとおり設定します。
管理権限でいきなり「ログイン済みユーザに許可」に設定してしまうと、Backlog URLなどが誤っていてログインできなくなった時、Jenkinsのグローバルセキュリティ設定をリセットする必要があるので、まずは「全員に許可」にしてログインできることを確認することをおすすめします。

![kobito.1397448044.949884.png](https://qiita-image-store.s3.amazonaws.com/0/32701/92cc1c24-3e64-2dc1-6bc8-f3e3835fc755.png "kobito.1397448044.949884.png")


## ログインできなくなった時の対処法
https://wiki.jenkins-ci.org/display/JA/Disable+security

上記を参照して、/var/lib/jenkins/config.xml を修正する。
Rails4 初期設定


## 前提

- Rspec使う
- FactoryGirl使う
- sass使う
- haml使う

### Bundlerのひな形ファイルを生成

```
$ mkdir blogapp
$ cd blogapp
$ bundle init
```

### Gemfileをほしい形に直す

```Gemfile
source "https://rubygems.org"

gem 'rails', '4.0.0'
gem 'turbolinks'
# Use ActiveModel has_secure_password
gem 'bcrypt-ruby', '~> 3.0.0'
#gem 'jbuilder', '~> 1.2'
gem "twitter-bootstrap-rails", "~> 2.2.8"
gem 'bootstrap-sass', '2.3.2.0'
gem 'jquery-rails'


group :assets do
  gem 'sass-rails', '~> 4.0.0'
  # Use Uglifier as compressor for JavaScript assets
  gem 'uglifier', '>= 1.3.0'
  # Use CoffeeScript for .js.coffee assets and views
  gem 'coffee-rails', '~> 4.0.0'
  gem 'haml-rails'
end

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

group :development do
  gem 'erb2haml'
  gem 'capistrano'
  gem 'annotate', '2.5.0'
  # deploy settings
  gem 'capistrano'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
end

group :development, :test do
  gem 'sqlite3'
  gem "rspec-rails", "~> 2.14.0"
  gem "factory_girl_rails", "~> 4.2.1"
  gem 'pry-rails'
  gem 'pry-doc'
end

group :test do
  gem "faker", "~> 1.1.2"
  gem "capybara", "~> 2.1.0"
  gem "database_cleaner", "~> 1.0.1"
  gem "launchy", "~> 2.3.0"
  gem "selenium-webdriver", "~> 2.35.1"
end

group :production do
  gem 'pg', '0.12.2'
  gem 'unicorn'
end
```

### おもむろにbundle install

忘れずにpath指定！暫し待つ。。

```cmd
$ bundle install --path vendor/bundle
```

### Rails初期化
bundlerでのもろもろインストールが無事終わったら、この状態でRailsアプリを作成

さっき作ったアプリ名のディレクトリ内に居るはずなので、アプリ名は指定しないで.でOK
Rspecを使いたいのでデフォルトのtest::unitが組み込まれないように-Tも付ける。

```cmd
$ bundle exec rails new . -T
```

### Rspec使えるようにする

```cmd
$ bundle exec rails g rspec:install
```

#### .rspecの設定を付け加える
```.rspec
--format documentation
```


### Rspecで自動生成させる対象を指定する
Rspec初心者なので、modelとcontrollerのテストだけ自動生成させるようにする。
FactoryGirl使う設定も忘れずに。

```config/application.rb
config.generators do |g|
  # Rspec settings
  g.test_framework :rspec,
    fixtures: true,
    view_specs: false,
    helper_specs: false,
    routing_specs: false,
    controller_specs: true,
    request_specs: false
  g.fixture_replacement :factory_girl, dir: "spec/factories"
end
```

### 設定続き
hamlとsass使いたいのでその設定もする。

```config/application.rb
config.generators do |g|
  g.template_engine :haml
end

config.sass.preferrd_syntax = :sass
config.sass.syntax = :sass
```

### Hamlの設定

既存のerbをhamlに変換

```cmd
$ bundle exec rake haml:convert_erbs
```

作ったばかりなので、app/views/layoutsの下にerbがあるだけ。
hamlになったので、いらない方消しとく。

```cmd
$ rm app/views/layouts/application.html.erb
```

### git

うぎゃーとなる前にvendor/bundle以下がリポジトリにはいらないようにしておく。

```.gitignore
/vendor/bundle
```

```cmd
$ git init
$ git add .
$ git commit -m "Initial commit"
```

### 確かめる

ちゃんと思った通りに設定されているか、scaffoldしてみる。

```
$ bundle exec rails g scaffold Page name:string content:text
```

ふう。やっと始められる。。
簡易ブログ作ってみよう。

- - -
参考書 : [Everyday Rails… Aaron Sumnerによる et al. [Leanpub PDF/iPad/Kindle]](https://leanpub.com/everydayrailsrspec-jp?utm_campaign=everydayrailsrspec-jp&utm_medium=embed&utm_source=blog.jnito.com)

とっても良い本。勉強中。。
RubyのArrayを理解する


RubyでArrayを複製するときにハマったのでメモしておきます。


## 変数

Arrayについて理解する前に、まずは変数について確認します。

変数が保持しているのはオブジェクトへの参照です。次の例のように、update1で渡された引数に新しいオブジェクトを代入する場合、元のオブジェクトが変更されることはありませんが、update2で渡された引数の参照に対して変更する場合、元の変数も変更されてしまいます。

```ruby
def update1(var)
  p var.object_id # => 1
  var = "adc"
  # ローカル変数varに新しいオブジェクト"abc"が代入される
  p var.object_id # => 2
end

def update2(var)
  p var.object_id # => 1
  var[1] = "d"
  # ローカル変数varが参照しているオブジェクトに"d"が代入される
  p var.object_id # => 1
end

str = "abc"
p str.object_id # => 1
p str # => "abc"
update1(str)
p str # => "abc"
update2(str)
p str # => "adc"

# object_idは分かりやすくするために一桁にしています。
```

このように元の変数が変更されてしまうのを防ぐには、オブジェクトを複製（.dup）してから利用します。

```ruby
def update1(var)
  p var.object_id # => 1
  # ローカル変数varに新しいオブジェクト"abc"
  var = "adc"
  p var.object_id # => 2
end

def update2(var)
  p var.object_id # => 1

  # オブジェクトを複製する
  var = var.dup
  p var.object_id # => 3

  # ローカル変数varが参照しているエリアに"d"が代入される
  var[1] = "d"
  p var.object_id # => 3
end

str = "abc"
p str.object_id # => 1
p str # => "abc"
update1(str)
p str # => "abc"
update2(str)
p str # => "abc"

# object_idは分かりやすくするために一桁にしています。
```

## 配列

配列が保持しているのは、変数と同じくオブジェクトへの参照です。元の配列の参照に対して更新する場合は、変数と同様にオブジェクトを複製（.dup）する必要があります。

```ruby
def update1(ary)
  p ary.object_id # => 1
  # ローカル変数varに新しいオブジェクト"abc"
  ary = [1, 2, 3, 4]
  p ary.object_id # => 2
end

def update2(ary)
  p ary.object_id # => 1

  # オブジェクトを複製する
  ary = ary.dup
  p ary.object_id # => 3

  ary[3] = 4
  p ary.object_id # => 3
end

str = [1, 2, 3]
p str.object_id # => 1
p str # => [1, 2, 3]
update1(str)
p str # => [1, 2, 3]
update2(str)
p str # => [1, 2, 3]

# object_idは分かりやすくするために一桁にしています。
```

## 多次元配列

多次元配列を複製する場合、オブジェクトそのものを複製すると別のオブジェクトが作成されますが、中の配列オブジェクトは同じものが複製されます。

```ruby
ary.object_id
ary.each{|i| p i.object_id}
ary = ary.dup
ary.object_id # 1行目と違う結果
ary.each{|i| p i.object_id} # 2行目と同じ結果
```

なので、配列の中身を複製します。

```ruby
ary.object_id
ary.each{|i| p i.object_id}
ary = ary.map{|i| i = i.dup }
ary.object_id # 1行目と違う結果
ary.each{|i| p i.object_id} # 2行目と違う結果
```

また、その他の方法として、中の要素１つ１つを複製するのではなく、Marshal.load(Marshal.dump())を使うのも有効な方法です。

```ruby
# ary = ary.map{|i| i = i.dup } # これの代わりに以下の書き方もできる
ary = Marshal.load(Marshal.dump(ary))
```
Deferred挫折したけど非同期をスマートに書きたい人へ

=============================================

簡単&低機能なものを作りました。

使い方
-----
chain()とnextだけ覚えて下さい

```
var img,img2;

chain( function( next ){
    img = new Image();
    img.onload = next;
    img.src = "http://dummyimage.com/600x400/000/fff";
})
.chain( function( next ){
    img2 = new Image();
    img2.onload = next;
    img2.src =  "http://dummyimage.com/600x400/000/fff";
})
.chain( function( next ){
    setTimeout( next, 1000 );
})
.chain( function( next ){
    console.log( "img,img2が読み込まれて１秒たった" );
});
```


ライブラリ
-----
```
(function(){ 
    // TODO 綺麗にする
    var Chain = function(){
        this._func = arguments.length==1? arguments[0]: arguments[1];
        this._next = function(){};
        this._parent = arguments.length==1? null: arguments[0];
        if( this._parent ) return;
        setTimeout((function(){
            this._exec();
        }).bind(this),0);
    };
    Chain.prototype = {
        _exec: function(){
            this._func( (function(){ this._next(); }).bind(this) );
        },
        chain: function( func ){
            var chain = new Chain( this, func );
            this._next = function(){ chain._exec(); };
            return chain;
        }
    };
    window.chain = function( func ){ return new Chain(func); }
})();
```
Chromeの画像要素をドラッグしている最中は、マウスイベントが発生しない？

Chrome34ですが、HTML内の`<img>`要素をマウスでつまむと、勝手にマウスの近くにその画像の半透明なものがくっついてきて、しくみによってはその動作を利用できます。
ただ、その間は、マウスイベントが発生しないようです。

![WS000360.JPG](https://qiita-image-store.s3.amazonaws.com/0/1642/4587430f-122e-000d-0635-a987b120b298.jpeg)

上の図では、`<img>`要素にonmousedownを設定し、右側のマスにonmouseupを設定し、キャラをマスに置こうとしたのですが、マウスアップしてもonmouseupが発生しませんでした。
同様に、ゲーム画面全体にjQueryObject.onmouseleaveを設定していたのですが、つまんだ状態では、onmouseleaveイベントは発生しませんでした。
画面外でつまんでいるのを離すと、その瞬間にonmouseleaveイベントが発生しました。
ドラッグ状態の時は、マウスイベントが発生しない、と解釈するべきのような気がします。

上記の仕様は、`<img>`要素の上に、画像ではない要素`<span>`などを重ね、その要素にイベントを登録すれば、実現できると思われます。
FuelPHP開発入門_05


第三回でまとめてconfigファイルを書きましたが、
あとからormパッケージを入れるかもしれません。
リアルタイムで書いてるとこういうことが起こる(´＠ω＠｀)

Controller_Templateの実装に入っていきます。
前回までのおさらいはこちら
 - [FuelPHP開発入門_01](http://qiita.com/yumura_shiho/items/4f669ca10438342fb830)
 - [FuelPHP開発入門_02](http://qiita.com/yumura_shiho/items/eb07f130270cee27717c)
 - [FuelPHP開発入門_03](http://qiita.com/yumura_shiho/items/6650054e9f2911724e27)
 - [FuelPHP開発入門_04](http://qiita.com/yumura_shiho/items/397fcfb3b62b545494d8)

## Controller_Templateとは
第四回でも書いたとおり、ビューテンプレートを利用することのできるコントローラークラスです。
HTMLの&lt;head&gt;部分や&lt;body&gt;内の&lt;header&gt;&lt;footer&gt;などを複数作成せず、
その内側のcontent部分だけを動的に差し替えて表示することができます。

## 実装

実際の書き方の基本はこう。

```view/layouts/template.php
<html>
	<head>
		<title><?php echo $title ?></title>
	</head>
	<body>
		<?php echo $content ?>
	</body>
</html>
```

$titleと$contentが動的に変更される部分です。
コントローラー側からは

```welcome.php
public function action_index()
{
	$this->template->title="ようこそ";
	$this->template->content = View::forge('welcome/index');
}
```

のように記述します。

例えば「メール送信画面からメール送信後、特に動作はないが送信完了画面を出したい」という
ことを実装しようとした場合は以下

```mail.php
	if(メール送信完了){
		$this->template->title="送信完了";
		$this->template->content = View::forge('mail/complate');
		return;
	}
	$this->template->title="ようこそ";
	$this->template->content = View::forge('mail/delivery');
```

ビューだけ切り替えてやればリダイレクト等書かなくて済みますし、
例えば送信先アドレスや送信内容の表示も引数の受け渡しなしで行えます。

## レイアウトの読み込み
デフォルトではtemplate.phpの名前で書くテンプレートですが、
別名で作ることもできます。例えばuser.phpとadmin.phpとか。
その場合はviews/layoutsの下にファイルを設置し、コントローラー側で

``` user.php
class Controller_User extends Controller_Template
{
	public $template = 'layouts/user';
...
}
```

この形で指定してあげれば表示されます。

## 注意点

~~CakePHPではできることですが、FuelPHPではメソッド毎のレイアウト切り替えができません。
できないってことはないだろうと思っていろいろ試したのですが、どうやら本当にできません。
adminコントローラー内のログイン前とログイン後でレイアウト変えたかったのに(´＠ω＠｀)~~

追記
## コメント欄にてご指摘を頂きました！

メソッド事のレイアウト切り替え、できるそうです！
上司にできないって言ってしまった……orz

> メソッド毎のレイアウト切り替えの方法は以下にあります。

> [Controller_Templateのaction内で、$this->templateを変更する](http://qiita.com/youkaiantena/items/d5d1b39f871758eee933)

ご指摘ありがとうございました(´@ω@｀)
object名から対応するobjectを返すリフレクションプログラミング例

オブジェクト名(String)に対応するオブジェクトを特定して返すリフレクションプログラミングサンプルです。Scala2.10で導入されたリフレクションAPIを使用しています。
メジャーな使いどころはファクトリメソッドの実装部分だろうと思います。これによりインスタンス数分のif文分岐を無くすことが出来ます。

###対象のobjectたち

```scala
trait SomeUtils {
  def someMethod: String
}

object FooUtils extends SomeUtils {
  def someMethod: String = "foo!"
}

object BarUtils extends SomeUtils {
  def someMethod: String = "bar!"
}
```

### リフレクションAPIによる取得コード

```scala
def get(objectName: String): SomeUtils = {
  val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader)
  val module = runtimeMirror.staticModule(objectName)
  val obj = runtimeMirror.reflectModule(module)
  obj.instance.asInstanceOf[SomeUtils]
}
```

classをリフレクションAPIで生成する例はよく見かけたのですがobjectの例はなかなか見つからなかったので。
【スライドショー】Markdownで書けるスライドショーアプリを作ってみた【PlayFramework】


https://github.com/takudo/md_slideshow

[このあたり](http://qiita.com/futoase/items/4a341f452c4a9c9b1bbb)とか参考にしてます。

社内の勉強会用に、[Markdown](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)形式で書けるスライドショーアプリを[作ってみました。](https://github.com/takudo/md_slideshow)
利用している技術は下記です。

* Scala PlayFramework(2.2.2)
* [bespoke.js](http://markdalgleish.com/projects/bespoke.js/)

# サンプルの起動方法

* PlayFramework 2.2.2 を入れて下さい。
* アプリをclone して下さい

```

$ git clone https://github.com/takudo/md_slideshow.git

```

* トップディレクトリにcdし、play runして下さい。

```

$ cd /path/to/md_slideshow
$ play run

```

* http://localhost:9000/sample にアクセスすると、resources/sample.mdのテキストの内容がスライドショーで表示されます。

# 使い方

## 新規スライドショー
* 新しいスライドショーを作る場合は、resources/のなかに、***.mdというファイルを追加し、http://localhost:9000/*** でアクセスして下さい。
* 例：resources/new-slideshow.md → http://localhost:9000/new-slideshow

## 操作
* キーボードの矢印キーでスライドを進めて下さい。

## Markdownの文法

* ---の前後を改行で区切ると、スライドの切れ目になります。
* * で列挙すると、現在bulletsプラグインが入っているので矢印キーで1項目ずつ表示することができます。



# 今後の課題

* bespoke.jsのスライドショーの形式（カルーセルとか）が選べない。
* bespoke.jsのテーマが選べない。
* その他諸々、bespoke.jsの設定が出来るように。
* *.mdファイルの中に、HTMLをそのまま記載できない。
* その他ご意見ありましたら真摯に受け止めます（笑）のでコメント下さい…
指定コマンドしか実行できない鍵の設定

webサーバのバックでsshさせて結果を出力すると便利。

# grepしかできない公開鍵設定の例

```bash:myserver:~/.ssh/authorized_keys
from="11.22.33.44",command="/bin/grep ${SSH_ORIGINAL_COMMAND} /var/log/maillog.1 /var/log/maillog",no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa 〜SSHの公開鍵〜
```

* from=で接続元IPアドレスの制限
* command=の${SSH_ORIGINAL_COMMAND}にはsshの引数が入る。

## 引数を指定する

```bash:
$ ssh myserver -i ~/.ssh/myserver_grep_only/id_rsa \
  test@live.com
```

とすると、${SSH_ORIGINAL_COMMAND}に`test@live.com`が入る。

## 確認方法

~/.ssh/authorized_keysに`command="env"`としておけば見れます。
Amazon Linux を使って AWS SDK for Ruby を使おう

Amazon Linux は AWS が用意しているだけあって repository に色々入っています。とりあえず使ってみるには最適。

Access Key ID と Secret Access Key を書くようにしてますけど、IAM role 使うとか色々方法あると思うんでよしなに。

# aws-sdk

```shell-session
$ ruby -v
ruby 2.0.0p451 (2014-02-24 revision 45167) [x86_64-linux]
```

Amazon Linux 2014.03 だと /usr/bin/ruby は version 2.0 ですね。一方どんな SDK パッケージが用意されているかというと?

```shell-session
$ yum list | grep ruby | grep sdk
rubygem18-aws-sdk.noarch               1.37.0-0.14.amzn1            amzn-main
rubygem18-aws-sdk-doc.noarch           1.37.0-0.14.amzn1            amzn-main
rubygem20-aws-sdk.noarch               1.37.0-0.14.amzn1            amzn-main
rubygem20-aws-sdk-doc.noarch           1.37.0-0.14.amzn1            amzn-main
```

ということで rubygem20-aws-sdk をインストールしてみます。

```shell-session
$ sudo yum -y install rubygem20-aws-sdk
(snip)
完了しました!
$ rpm -qa | grep aws-sdk
rubygem20-aws-sdk-1.37.0-0.14.amzn1.noarch
```

完了してしまいました。1.37 が入りました。

```rb:cw_listMetrics.rb
require 'rubygems'
require 'aws-sdk'

cw = AWS::CloudWatch.new(
    :region => 'us-west-2',
    :access_key_id => 'YOUR ACCESS KEY ID',
    :secret_access_key => 'YOUR SECRET ACCESS KEY',
  )
metrics = cw.client.list_metrics()
p metrics[:metrics][0]
```

これを実行するとこんな感じです

```shell-session
$ ruby cw.rb
{:dimensions=>[], :metric_name=>"NetworkIn", :namespace=>"AWS/EC2"}
```

logging 設定に関しては http://ruby.awsblog.com/post/Tx3NGT0543C4DOX/Logging-HTTP-Wire-Traces を眺めつつ

```rb
cw = AWS::CloudWatch.new(
    :region => 'us-west-2',
    :access_key_id => 'YOUR ACCESS KEY ID',
    :secret_access_key => 'YOUR SECRET ACCESS KEY',
    :http_wire_trace => true, # <- これ!!
  )
```

と一つ引数を足してあげれば request/response が見れます。続きは[ドキュメント](http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html)で。

# aws-sdk-core

Ruby 用 SDK は version 2 も準備中だそうですが、まだ `gem` などで直接インストールしてやる必要があります。

```shell-session
$ sudo gem install aws-sdk-core --pre
Fetching: aws-sdk-core-2.0.0.rc6.gem (100%)
Successfully installed aws-sdk-core-2.0.0.rc6
Parsing documentation for aws-sdk-core-2.0.0.rc6
Installing ri documentation for aws-sdk-core-2.0.0.rc6
Done installing documentation for aws-sdk-core after 4 seconds
1 gem installed
```

素の `gem` 使うなよ、という声も聞こえてきますが、進んじゃいます。

```rb:cw_listMetrics2.rb
require 'rubygems'
require 'aws-sdk-core'

cw = Aws::CloudWatch.new(
  :region => 'us-west-2',
  :access_key_id => 'YOUR ACCESS KEY ID',
  :secret_access_key => 'YOUR SECRET ACCESS KEY',

p cw.list_metrics[:metrics][0]
```

似たようなファイルを作ったら、ゲットできました。

```shell-session
$ ruby cw_listMetrics2.rb
#<struct namespace="AWS/EC2", metric_name="NetworkOut", dimensions=[]>
```

`:http_wire_trace => true` も同様に動きました。クライアント作成時のその他の引数含めて、続きは[ドキュメント](http://docs.aws.amazon.com/sdkforruby/api/Aws.html)をご参照下さい。

# まとめ

**"Version 2 offers a wide range of enhancements over version 1"** って書いてあるので、aws-sdk-core を使っていってみたい気分になりますね!!
Wantedlyエンジニア新人研修（設計）



## 概要

設計力に関しては経験によるところが大きいので、実践＋コードレビューでまかなえるところが大きいが、ある程度網羅的でやった感の出るものとしてデザインパターンを使って学習する。

- [増補改訂版Java言語で学ぶデザインパターン入門](http://www.amazon.co.jp/dp/4797327030)を利用

- デザインパターン自体は、C++/Java用だったりして古いので、そのパターンが必要な背景を元に、Ruby(/ObjectiveC)で書き直してそれを使うべきか自分たちで再評価する。
- またRuby, Railsその他有名なライブラリでそのパターンが使われている部分を探す。

実際に本を読んだりネット上を調べる際の、具体的なチェックポイントとしては、以下の5つを用いる。

1. どういう時に使うか
2. メリット (+ デメリット)
3. そのパターンを使わないとどうなるか
4. Rubyではどう書くか（同じものがある/似たものがある/必要ない）
5. Ruby/Rails/Gemで実際に使われている場面

## 実践

学習するたびに、以下のJava言語で学ぶデザインパターン入門の目次にリンクを足していく。

やる順番としては基本的には本の掲載順にやる予定。

>
デザインパターンに慣れる
>
 - 第1章 [Iterator ― 1つ1つ数え上げる](http://qiita.com/awakia/items/b1d1f1bf364fc16c99da)
 - 第2章 Adapter ― 一皮かぶせて再利用
>
サブクラスにまかせる
>
 - 第3章 Template Method ― 具体的な処理をサブクラスにまかせる
 - 第4章 FactoryMethod ― インスタンス作成をサブクラスにまかせる
>
インスタンスを作る
>
 - 第5章 Singleton ― たった1つのインスタンス
 - 第6章 Prototype ― コピーしてインスタンスを作る
 - 第7章 Builder ― 複雑なインスタンスを組み立てる
 - 第8章 Abstract Factory ― 関連する部品を組み合わせて製品を作る
>
分けて考える
>
 - 第9章 Bridge ― 機能の階層と実装の階層を分ける
 - 第10章 Strategy ― アルゴリズムをごっそり切り替える
>
同一視
>
 - 第11章 Composite ― 容器と中身の同一視
 - 第12章 Decorator－飾り枠と中身の同一視
>
構造を渡り歩く
>
 - 第13章 Visitor ― 構造を渡り歩きながら仕事をする
 - 第14章 Chain of Responsibility ― 責任のたらい回し
>
シンプルにする
>
 - 第15章 Facade ― シンプルな窓口
 - 第16章 Mediator ― 相手は相談役1人だけ
>
状態を管理する
>
 - 第17章 Observer ― 状態の変化を通知する
 - 第18章 Memento ― 状態を保存する
 - 第19章 State ― 状態をクラスとして表現する
>
無駄をなくす
>
 - 第20章 Flyweight ― 同じものを共有して無駄をなくす
 - 第21章 Proxy ― 必要になってから作る
>
クラスで表現する
>
 - 第22章 Command ― 命令をクラスにする
 - 第23章 Interpreter ― 文法規則をクラスで表現する
iOSの通信状態を確認する方法


iOSの通信状態を確認する方法は、「Reachability」を使用する方法が一般的です。

以下のリンク先からApple公式の「Reachability」を取得し、アプリのソースに組み込みます。

https://developer.apple.com/Library/ios/samplecode/Reachability/Introduction/Intro.html

※非公式のARC対応「Reachability」を薦めているサイトがありますが、上記公式の「Reachability」を使用することをお薦めします。

現時点最新の「Reachability」は、ダウンロードした「Reachability.h」「Reachability.m」を自分のアプリにコピーするだけで使用できます。

実装方法はダウンロードした「Reachability」のViewControllerを参考にするとよいです。
ちなみに私は「Reachability」から通信状態を取得する「ReachabilityController」クラスを実装し、AppDelegateのdidFinishLaunchingWithOptionsで生成しています。

そして、AppDelegateに「ReachabilityController」クラスから通信状態を取得するメソッドを実装し、必要に応じて通信状態を取得するようにしました。

このようにすると、通信状態が変更になる都度、「ReachabilityController」インスタンスが通信状態を保持してくれるので、通信状態を確認するメソッドはAppDelegateのメソッドを呼び出すだけで済みます。
北九州でゆるふわ勉強会開催するのに心がけたこと


私藤崎は毎月１回JAWS-UG北九州として「もくもく会（といいつつ初心者が初心者に教えるハンズオン的なもの）」を開催しています。

で、大体こんな感じのこと考えながらやってます。

 - 堅苦しいのぬき
 - 参加者ほんとに意味で参加できる
 - 教わる場ではなく、学ぶきっかけを掴む場にする
 - 技術をテーマに馬鹿話をする

小倉、秘密基地という場を得たことでやっとこ実現ができてきたなーと思っております。

みんなもおいでよJAWS−UG北九州&秘密基地！！
一緒に楽しみましょう。

http://jaws-ug.jp/bc/kitaq/

http://秘密基地.net