OmniAICreator/Qiita-1.07M huggingface dataset:
slimをrailsで扱うには

基本的なことのメモです。

インストールするところからは以下のがわかりやすいと思います。そこでも書いておりますが特徴的にコードを書く量が減ります。ただ慣れないと違和感でしかないのと、これに加えて新しい技術絡んだらもう訳わからんって感じでした笑
→　[速習テンプレート](http://qiita.com/yterajima/items/53fd0387279510ff082a)

そんな話はさておき、まずは単にhtmlのviewであるerbを直してみます。
基本的には<>をとるとかでしかないので混乱することはないと思います。
なのでついでにview上でrubyを扱うときの場合（<%= %>,<% >のとき）もやってみましょう。

```
<!DOCTYPE html>
<html>
<head>
  <title>SlimTest</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<header id="header">
  <h1 class="title logo">Slim Test</h1>
</header>

<%= yield %>

</body>
</html>
```
ってのは

```
DOCTYPE
html
  head
    title SlimTest
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true
    = javascript_include_tag 'application', 'data-turbolinks-track' => true
    = csrf_meta_tags

  body

    header#header
      h1.title.logo Slim Test

    == yield

```

と書き直せます。ほとんどがこれで説明できます、ただ他にもちょっと使いたいときとかもあるのでまとめておきます。

まとめると

■<、>、<%、%>などのタグ系は削除し、また閉じタグも全て削除する。
■each、ifなどのロジック部分の先頭に-を記載し、endは要らない。
■<%= ... >は=にする。yieldとrenderのときは、==にする。
■class属性やid属性は、p.fieldsやp#contentsなどにする。タグがdivのときはdivを省略し#contentと記載する。
■コメントは、/ このコメントはHTMLに変換後に表示されないか/! このコメントはHTMLに変換後にコメントになるで記載する。
CentOS 7 に Kyoto Tycoon を入れて遊ぶ。

[Kyoto Tycoon](http://fallabs.com/kyototycoon/)インストールの備忘。

## VMの準備

* Vagrant box の初期化

```
vagrant init chef/centos-7.0
```

* private network の有効化

[ここ](http://qiita.com/zaneli@github/items/e59ea6f2c1499b16b996)とだいたい同じ。(最後の「ホストPCからの接続確認」で指定しているが、IPは192.168.33.12にした。)

VM起動してログインし、以下はVM上での操作。

## Kyoto Cabinet のインストール

* 依存ライブラリのインストール

```
> sudo yum install zlib-devel
> sudo yum install gcc gcc-c++
```

* Kyoto Cabinet ダウンロード・インストール

```
> wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.76.tar.gz
> tar zxf kyotocabinet-1.2.76.tar.gz
> ./configure
> make
> sudo make install
```

## Kyoto Tycoon のインストール

```
> wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.56.tar.gz
> tar zxf kyototycoon-0.9.56.tar.gz
> cd kyototycoon-0.9.56
> ./configure
> make

ktdbext.h:274:29: エラー: ‘getpid’ was not declared in this scope
       uint32_t pid = getpid() & kc::UINT16MAX;
                             ^
ktdbext.h:274:29: 備考: suggested alternative:
In file included from ./ktcommon.h:20:0,
                 from ktdbext.h:19,
                 from ktdbext.cc:16:
/usr/local/include/kcutil.h:879:9: 備考:   ‘kyotocabinet::getpid’
 int64_t getpid();
         ^
make: *** [ktdbext.o] エラー 1
```

いくつか警告が出つつも進んでいたが、エラーが出てしまった。

どうも `ktdbext.h` を手で編集する必要があるようだ。
(しかし、これ Travis CI 上でテスト用のKyoto Tycoonを準備する際には不要だった。
 実行環境に関係しているのかな？)

```
> vi ktdbext.h
(`#include <unistd.h>` を追加)

> make
> sudo make install
```

* 起動

```
> sudo lab/ktservctl start
```

* ホストPCから接続確認

```
> curl -LI http://192.168.33.11:1978/rpc/void -o /dev/null -w '%{http_code}\n' -s
200
```

よさそう。 :+1:
Ruby(Grocer)でiOSアプリにプッシュ通知を送る

## 開発中のアプリに自分のローカルからプッシュ通知を送りたい。

APNSを利用するためのGemをいくつか調べたのですが、Grocerを使って簡単にプッシュ通知を送ることができました。

基本的な使い方はGitHubのドキュメントに従えばOKです。
https://github.com/grocer/grocer

## 1. Grocerをインストール

Grocerのgemをインストールします。

```
$ sudo gem install grocer
```

## 2. cert.pemを作成

プッシュ送出側が保持する証明書を、通例サーバサイドに格納する.p12から.pem形式に変換する必要があります。

```
$ openssl pkcs12 -in exported_certificate.p12 -out cert.pem -nodes -clcerts -des3
```

入力すると2回パスワード入力を求められます。

`Enter Import Password:`

-> 何も入力しなくてOKです。

`Enter PEM pass phrase:`

-> 後述のコードの `passphrase` に入力するパスワードになります。

## 3. プッシュ通知を送るためのコード

```ruby:push.rb
require 'grocer'

pusher = Grocer.pusher(
  certificate: "./cert.pem",      # required
  passphrase:  "<パスフレーズ>",                       # optional
  gateway:     "gateway.sandbox.push.apple.com", # optional
  port:        2195,                     # optional
  retries:     3                         # optional
)

notification = Grocer::Notification.new(
  device_token:      "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  alert:             "Hello from Grocer!",
  badge:             42,
  category:          "a category",         # optional; used for custom notification actions
  sound:             "siren.aiff",         # optional
  expiry:            Time.now + 60*60,     # optional; 0 is default, meaning the message is not stored
  identifier:        1234,                 # optional; must be an integer
  content_available: true                  # optional; any truthy value will set 'content-available' to 1
)

pusher.push(notification) # プッシュを送出
```

## 4. push.rbを実行

```
$ ruby push.rb
```

## 設定に関して気をつけるポイント

### サーバの設定
#### **certificate**
push.rbからpemファイルの相対パスを指定します。
今回のサンプルコードの場合、同じディレクトリに格納すればよいです。

#### **passphrase**
pemファイルを生成した時に入力したパスフレーズを入力します。

#### **gateway**
##### Development の場合
gateway.sandbox.push.apple.com
##### Production の場合
gateway.push.apple.com

### 通知の設定
#### **device_token**
APNSから取得できるデバイストークンを「半角スペース、<>」なしで指定
#### **content-available**
trueにすることで、バックグラウンドでの処理を有効化します。
iOS Simulator での現在位置の設定をすると捗る

位置情報系のアプリをデバックするときには、iOS Simulatorで現在位置を擬似的に設定するとデバックが捗る。

# iOS Simulator Menuでの設定

![simulator_settings.png](https://qiita-image-store.s3.amazonaws.com/0/15000/c16c3412-ba92-83da-a035-4f2203bc4762.png)

iOS Simulator > Debug > Location の一覧から選ぶことができる。

| 名前 | 説明 |
|------|------|
| None | 位置の指定なし |
| Custom Location | 座標をしてして移動(下記図) |
| Apple | アップルの本社の座標 |
| City Bicycle Ride | 自転車にのったようなスピードで徐々に位置を移動 |
| City Run | 走るスピードで徐々に位置を移動 |
| Freeway Drive | 車のスピードで徐々に位置を移動 |

![custom.png](https://qiita-image-store.s3.amazonaws.com/0/15000/05b87224-95a7-bddb-87db-d06898132f7a.png)

# Xcodeからの設定

![running_settings.png](https://qiita-image-store.s3.amazonaws.com/0/15000/c3aa4320-6a6b-7f59-d6d0-7e2c338e35a3.png)

Xcodeのデバックツールバーに表示されるロケーションのボタンを押下すると、現在の位置が変更できる。
デフォルトでは主要都市が設定できるが、追加で任意の[GPXファイル](http://ja.wikipedia.org/wiki/GPX)の設定が出来る。

![gpx_file.png](https://qiita-image-store.s3.amazonaws.com/0/15000/f971a8c5-d7e8-0d1f-f1cc-8b69788a3fd9.png)

サンプルに利用した

- https://code.google.com/p/terrabrowser/downloads/detail?name=sample%20waypoint%20files.zip&can=2&q=
iOSアプリ申請時に「Your account already...」と出た時の確認フロー




## エラー内容

### !Your account already has a valid iOS Distribution certificate


![スクリーンショット 2015-06-11 19.58.27.png](https://qiita-image-store.s3.amazonaws.com/0/15812/4ea418e6-d37a-587d-d0d6-0df3e81fda2b.png "スクリーンショット 2015-06-11 19.58.27.png")


## 原因
使用しているCertificationが失効している


## 解決方法
既存のCertificationをrevokeし、
新規にCertificationを作成する

## 解決するために必要なCertificationの作り方
### 参考記事
下記の記事が大変、わかりやすく纏められています。

http://qiita.com/knife0125/items/97de5c661e484e2c2019

*既にプロビジョニングプロファイルがある人はこれでよいが初期から作る人はプロビジョニングプロファイルまで作る必要がある。
PHPでバブルソート

#PHPでバブルソート

##コード

```php

//$list = array(1,2,3,4,5,7,9,6,0,8);
//$list = array(1,2,3,4,5,6,7,8,9,0);
//$list = array(9,0,1,2,3,4,5,6,7,8);
$list = array(9,8,7,6,5,4,3,2,1,0);
//$list = array(0,1,2,3,4,5,6,7,8,9);
$listCount = count($list);

$sortedCount = 0;

while ($sortedCount < $listCount - 1) {
    $last = $listCount - 1;
    //要素の後ろから見ていく
    for ($index = $listCount - 1; $index > $sortedCount; $index--) {
        if($list[$index - 1] > $list[$index]) {
            //１個前の要素の方が大きい時、自分のと1個前の値を交換する
            $tmp              = $list[$index-1];
            $list[$index - 1] = $list[$index];
            $list[$index]     = $tmp;

            $last = $index;
        }
    }
    //ソート済の個数を記憶
    $sortedCount = $last;
    echo $sortedCount . '個昇順にソート済'; //既にソートされている場合は表示されない
    echo '<br>';
}

echo '<p>ソート完了</p>';
echo '<pre>';
var_dump($list);
echo '</pre>';



```
Spring ライブラリ、APIのインストール

今回はSpringにlombockとApache Commonsを入れてみた。

#lombock

pom.xmlに以下を記述

```
<dependency>
　　　<groupId>org.projectlombok</groupId>
　　　<artifactId>lombok</artifactId>
　　　<version>1.16.4</version>
　　　<scope>provided</scope>
</dependency>
```

そしてmavenのプロジェクトの更新を行い、maven installを実行

#Apache Commons

pom.xmlに以下を記述

```
<dependency>
　　　<groupId>org.apache.commons</groupId>
　　　<artifactId>commons-lang3</artifactId>
　　　<version>3.4</version>
</dependency>
```

そしてmavenのプロジェクトの更新を行い、maven installを実行


ライブラリとAPIはとても便利なので、積極的に使っていきたいですね
出荷・納品

#出荷・納品業務の流れについて

まず、出荷指示書の作成、出荷準備と必要書類の作成、出荷納品、売上伝票の作成、取引の記帳という流れになります。

##受注伝票
まず、受注伝票を元に出荷指示書が発行されます。倉庫、在庫の担当者は出荷指示書に従い、決められた納期まで納品できるように出荷の準備をします。
出荷する商品が、配送中に破損したりしないように、梱包を行います。
商品の形状や配送方法に合わせて、適切な梱包材料を選択します。

その後、商品を取引先に届ける際に必要な書類を作成します。必要な書類は、
・納品書、納品書控え
・受領書などです。

##納品書
納品書とは取引先に商品を引き渡したことを証明するための書類です。
商品とともに取引先に渡します。
取引先は記載された内容と注文した際に作成した注文書の内容通りか確認します
納品書控えは納品書の複写で、自社で管理します。

##受領書
受領書とは納品書と同様に商品を引き渡したことを証明するための書類です。
納品書ともに取引先に渡し、確認印、サインをもらって自社で管理します。

納品書、受領書の主な記載項目は
納品日
・納品番号
・得意先
・商品
・数量
・単位
・単価
・金額
などになります

##引渡し
そして、商品を取引先に引き渡します。引渡しとともに、納品書、納品書控え、受領書を取引先に渡して、確認してもらい、受領書に確認印、サインを貰い
受領書、納品書控えを自社に持ち帰ります。


##売上伝票
在庫担当者は持ち帰った納品書控え、受領書をもとに売り上げ伝票を作成します。
売り上げ伝票は受領書とともに経理担当者へ渡します。
売上伝票の主な項目は
・売り上げ日
・出荷番号
・取引先
・担当者
・商品
・単位
・単価
・数量
・金額などです


##記帳
経理担当者は在庫担当者から売上伝票、受領書を受け取り、売り上げを仕訳として記帳します。
受領書は取引先が商品を受け取ったことを証明する書類として保管します
商品の売り上げを、銀行振込みで受け取る場合は売掛金で記帳します。


###仕訳
一連の取引の流れを仕訳という
① 取引が発生する
② 取引の状態から、資産・負債・資本・費用・収益のどのグループに属する取引かを考える
③ グループが決定したら、そのグループの中のどの勘定科目を使うのか考える
④ 勘定科目が決定したら、金額を計算する

###勘定科目
勘定科目とは、誰が仕訳を行っても同じになるように、性質の類似した取引につけられた名前です。勘定科目のポイントは３点ある。
① 	資産、負債、資本、収益、費用のグループごとに、利用する勘定科目が決まります。
② 	勘定科目を借方に書くか、貸方に書くかで価値（金額）の増減が決まります。
③ 	資産・負債・資本の勘定科目は貸借対照表に対応し、費用・収益の勘定科目は損益計算書に対応します。

###取　引/主要勘定科目
資　産/現金、預金、売掛金、建物など
負　債/買掛金、未払金、預り金、借入金など
資　本/資本金（元入金）
収　益/売上高、雑収入など
費　用/商品仕入高、給料、旅費交通費、消耗品費など
ストレージの空き容量を確認する


参考: [iOS、Androidの空き容量をコードで調べる](http://xoyip.hatenablog.com/entry/2014/04/19/234427)


## Android

```android.cs
public int AvailableStorageMB {
	get {
		var statFs = new AndroidJavaObject ("android.os.StatFs", Application.temporaryCachePath);
		var availableBlocks = statFs.Call<long> ("getAvailableBlocksLong");
		var blockSize = statFs.Call<long> ("getBlockSizeLong");
		var freeBytes = availableBlocks * blockSize;
		return freeBytes / MEGA_BYTES;
	}
}
```

## iOS

※ Android 側で指摘のように `int` だと大きな値になると計算途中の値がオーバーフローする可能性があるので、大きな値を扱える型にする必要があるかもです。**(コメント欄参照)**

```storage.mm
/*
 * ストレージ空き容量の取得
 */
int storageAvailableMb_() {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSDictionary *dict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error:nil];
    
    if (dict) {
        int Mb = 1024 * 1024;
        float free = [[dict objectForKey: NSFileSystemFreeSize] floatValue] / Mb;
        return (int)free;
    }
    
    return 0;
}
```


```storage.cs
	[DllImport("__Internal")]
	private static extern int storageAvailableMb_();

	public static int storageAvailableMb {
		get {
			if (Application.platform == RuntimePlatform.IPhonePlayer) {
				return storageAvailableMb_();
			}
			throw new System.NotSupportedException ();
		}
	}
```
VT-x is disabled in the BIOS. (VERR_VMX_MSR_VMXON_DISABLED).

**環境**
<pre>
Windows7(64bit) + VirtuaxBox 4.3.28(VirtualBox-4.3.28-100309-Win.exe)
</pre>

仮想マシンが起動でエラーになる (="=)
<pre>
仮想マシン"CentOS6"のセッションを開けませんでした。
VT-x is disabled in the BIOS. (VERR_VMX_MSR_VMXON_DISABLED).
終了コード : E_FAIL (0x80004005)
</pre>

この情報を元に
[VirtualBox error “VT-x is disabled in the BIOS. (VERR_VMX_MSR_VMXON_DISABLED)”](https://blindcoder.wordpress.com/2013/12/10/virtualbox-error-vt-x-is-disabled-in-the-bios-verr_vmx_msr_vmxon_disabled/
)

<pre>
>cd C:\Program Files\Oracle\VirtualBox
>VBoxManage list vms
 "CentOS6" {b8a8eb43-c4b0-45a8-aa8f-c453a83bda73}

>VBoxManage modifyvm "CentOS6" --longmode off
</pre>

としても改善されず "Orz

**解決方法**
ASUS B85M-E のBIOS設定変更　無効 ⇒ 有効
![150611202628.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/e29dc82f-170f-b3f0-abb8-8c0892e691a8.jpeg)

エラー時、アクセラレーションタブが無効になってましたが
タブが選べるようになりました。
![image01.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/e43ee7eb-01c6-c0b9-ae52-c635b50b195b.jpeg)

無事起動しました。
![image02.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/474a6958-a48e-39ef-6101-cf46450b2fec.jpeg)
[WebGL] Three.jsのBufferGeometryでオブジェクトを作る


`BufferGeometry`と`BufferAttribute`を使うことで、比較的低レベルなAPIを意識した記述が可能となります。

以下は、`BufferGeometry`を使ってプレーンを描くサンプルコードです。
Three.jsが用意してくれているマテリアルをそのまま使うことができたりするので、ある程度低レベルで操作しながらもThree.jsの恩恵を受けられるのが大きいでしょう。

![動作アニメ](http://i.gyazo.com/a2b212cdb768ce251df7cd93a281a84e.gif)

### サンプルコード

```js
// BufferGeometryを生成
var geometry = new THREE.BufferGeometry();

// 平面用の頂点を定義
// d - c
// |   |
// a - b
var vertexPositions = [
    [-1.0, -1.0, 1.0], // a
    [ 1.0, -1.0, 1.0], // b
    [ 1.0,  1.0, 1.0], // c
    [-1.0,  1.0, 1.0]  // d
];

// Typed Arrayで頂点データを保持
var vertices = new Float32Array(vertexPositions.length * 3);
for (var i = 0; i < vertexPositions.length; i++) {
    vertices[i * 3 + 0] = vertexPositions[i][0];
    vertices[i * 3 + 1] = vertexPositions[i][1];
    vertices[i * 3 + 2] = vertexPositions[i][2];
}

// 頂点インデックスを生成
var indices = new Uint16Array([
    0, 1, 2,
    2, 3, 0
]);

// attributesを追加
geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));
geometry.addAttribute('index',    new THREE.BufferAttribute(indices,  1));

var material = new THREE.MeshLambertMaterial({
    color: 0xff0000
});
var mesh = new THREE.Mesh(geometry, material);
mesh.position.z = -10;

scene.add(mesh);
```

生のWebGLに似た感じで書きつつ、だいぶコード量が減ってるのが分かると思います。
【CakePHP】デフォルトキャッシュ時間の設定


デバッグレベルが本番（0）と本番以外（1,2）ではキャッシュの時間が異なる。
かなりレアなケースだけど、デバッグレベルが本番（0）でキャッシュを短くできないかと調べた記録。

キャッシュの設定は、core.phpで行っている。
この中でデバッグレベルによって、キャッシュ時間を切り替えているので、ここを書き換えれば良い。

```php
$duration = '+999 days';

if (Configure::read('debug') > 0) {
  $duration = '+10 seconds';
}

Cache::config('_cake_core_', array(
  'engine' => $engine,
  'prefix' => $prefix . 'cake_core_',
  'path' => CACHE . 'persistent' . DS,
  'serialize' => ($engine === 'File'),
  'duration' => $duration
));

```

###書き換え例

```php
$duration = '+999 days';

if (Configure::read('debug') > 0) {
  $duration = '+10 seconds';
}

$duration = '+10 seconds';//常にキャッシュは10秒

Cache::config('_cake_core_', array(
  'engine' => $engine,
  'prefix' => $prefix . 'cake_core_',
  'path' => CACHE . 'persistent' . DS,
  'serialize' => ($engine === 'File'),
  'duration' => $duration
));

```
Windowsツール20選


# Windowsに入れておきたいツール

基本的に無料のソフトに限る。

編集中。。。

##通常
特に開発しない場合でも入れておくと便利。

### Everything
http://www.voidtools.com/

### WinMerge (日本語版)
http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html

※プラグインセットなので、Officeファイルの差分比較もOK！



##開発用

### SourceTree
もうGit関連はこれだけで十分かも。

### kobito
とりあえずメモ用。
Windows版が遅れてるので、早くMac版に追いついてほしい。

### RLogin
Windows用ターミナルソフト。
poderosaとかteratermとかputtyとかいろいろ試したけど、しばらくはこれに落ち着いてる。

### WinSCP
ファイル転送用。
これも割と定番。

##おまけ
優先度低め。

### AlterDnD
http://sourceforge.jp/projects/alterdnd/

### Clover
CodeIgniterが食っていたメモリ

CodeIgniterでプログラムを書いていたところ、バッチ処理のところでメモリ不足となって来ました。それ自体は別に驚くべきことでもないのですが、扱うデータ量を考えれば充分すぎる、1GBという多量のメモリを割り当てても解決する兆しがなく、さすがに「これはおかしい」と調べてみることにしました。

# CodeIgniter標準のプロファイリング
CodeIgniterでは、

```php:controller
$this->output->enable_profiler();
```

のように書くことで、標準のプロファイル機能を呼び出すことができます。これには処理にかかった時間やリクエストの詳細、さらには実行したSQLクエリなどが記録されています。

で、このプロファイラの指定は出力ハンドラに対して行うのですが、設定前も含めてクエリの情報がバッチリ取れてしまいます。

# クエリの記録
そんなふうに取得できるようにしようとすれば、プロファイラの動作に関係なく記録を取っておく以外に手段はありません。当然ながら、バッチ処理だろうと容赦なく記録は続くので、大量のクエリを発行すればメモリは食いつぶされてしまいます。

これは、DBクラスの`save_queries`という変数が管理している機能ですが、止める方法は2通りあります。1つは、問題になる箇所だけ`$this -> db -> save_queries = FALSE;`して一時的に止める方法、もう1つは、設定ファイルで

```php:application/config/database.php
$db['database_name']['save_queries'] = FALSE;
```
のように書いておく方法です。とりわけ、本番環境でこれらの情報を記録して有益となるケースは珍しいでしょうから、設定ファイル単位で止めてしまって問題ないでしょう。

# まとめ
フレームワークには多様な機能がありますが、時にはそれがトラブルの原因となります。ブラックボックスにせず、どんな動作をしているかコードを追いかけていくことは、間違いなく有益になります。
サクラのレンサバでlaravelのベーシック認証が効かない

サクラのレンサバ（standard）で、
laravelをインストール後にベーシック認証をかけようと思ったら
少しはまったので共有です。

結論は、
以下を/public/.htaccessに挿入。

`RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]`


まぁ、マニュアルに書いてあったんですけどね（汗

> PHP FastCGIを使用している場合、デフォルトでHTTP基本認証は正しく動作しません。.htaccessファイルに以下の行を追加してください。

ちなみにlaravelの推奨なベーシック認証は、
usersテーブルを利用して、emailとpasswordから引っ張ってくるみたいです。
なんだかTwitterでhogeが話題になっているらしいので自分なりの解釈を述べてみる


## はじめに

Twitterで、関数名にhogeが使われているのに疑問を感じている人がいるというのをSmart Newsで見たので、暇つぶしに私見を述べてみる。

めんどくさい人は[togetter](http://togetter.com/li/47113)でもみれば、こんな駄文は読まずに済みます。

## 意味がないことに意味がある

サンプルコードなどを書くときに、関数名を何か意味のある単語にしたとしましょう。
例えば、sample()という関数があったとします。
そうすると、人によっては何かのデータをサンプリングする関数なんだなと思ってしまうかもしれませんよね。

もし、ただ構文の使い方などを説明したいだけで、関数の動作に特に意味がないときに意味のある関数名をつけると、関数がどんな動作をするのかばかりに気をとられてしまう人がでてくる怖れがあります。
そこで、必要になるのが「この関数の動作は意味がないよー」と示してくれる関数名です。

**それがhogeなのです。**

サンプルコードに出てくる関数がひとつだけのときはhogeだけでいいのですが、複数の関数がないと説明できない場合もあります。
そういうときには、hogeの他にfugaなどもよく使われます。

大事なのは、hogeにしろfugaにしろ

**この関数の動作に意味はない**

ことを表しているということです。
（関数の動作に意味のあるものにはhogeやfugaは使わないようにしたほうが良いでしょう。）

ちなみに、英語圏だと、foo,bar,zotなどが使われるのは有名ですね。これも同じことです。

## 最後に

ぶっちゃけ、今思いついたから書いただけなので、深く気にしてはいけません。
自分はだいたいそういうつもりで書いてるかなぁ……ぐらいです。
Enumerable#mapでマルチコアプロセッサを使い切る


最近のCPUの多くがマルチコアを採用しています。普通にRubyのプログラムを書くとシングルプロセスなので、（ざっくりと）4コアなら25%、8コアなら12.5%が処理速度の限界になります。計算に時間のかかるプログラムを書いていると、フルパワーでやって欲しいと感じます。

というわけで実装してみた。

- レシーバを分割
- 分割したレシーバをforkプロセスに分業させる
- forkプロセス内で得た配列をシリアライズして一時ファイルに保存
- 最後に、デシリアライズして固めて返す

`Kernel::fork`がWindowsでは使えないので、*nix専用です。

```ruby
# x個のforkプロセスでmap処理を実行する
module Enumerable
  def xmap(x = 1, &block)
    unit_size = count / x + 1

    pids = each_slice(unit_size).map.with_index do |pieces, id|
      Kernel::fork{
        a = pieces.map(&block)
        f_save(a, "temp_#{object_id}_#{id}")
      }
    end

    array = []
    pids.each_with_index{|pid, id|
      raise unless Process.waitpid2(pid)[1].success?
      array.concat f_load("temp_#{object_id}_#{id}")
      f_delete("temp_#{object_id}_#{id}")
    }
    array
  end

  private
  def f_save(var, fp) File.open(fp, "wb"){|file| Marshal.dump var, file } end
  def f_load(fp)      File.open(fp, "rb"){|file| Marshal.load file      } end
  def f_delete(fp)    File.delete(fp) end
end
```

```ruby:example.rb
# 通常の無限ループ
10.times{
  loop{rand*10}
}

# forkプロセス4個
10.times.xmap(4){
  loop{rand*10}
}
```

![スクリーンショット 2015-06-11 19.57.57.png](https://qiita-image-store.s3.amazonaws.com/0/29945/ca52f706-e765-30bf-7b22-a60381cd1f43.png)
![スクリーンショット 2015-06-11 19.58.36.png](https://qiita-image-store.s3.amazonaws.com/0/29945/916a5a89-d9cf-1613-6f82-9abff551ee94.png)
Crystal Reports - 各セクションが出力されるタイミングについて

#Crystal Reports Designer - セクション出力のタイミング

「どのタイミングでどの項目を出すか」という制御はCrystalReportデザイナ側から行う。
これがデフォルト画面。
![Reportデザイナ-編集前.PNG](https://qiita-image-store.s3.amazonaws.com/0/50078/339fc9f5-abca-df7a-d57a-62f4caef14c0.png "デフォルト画面")

| 出力順 |     Section    |    いつ出力されるか    |
|:------:|:---------------|:-----------------------|
|    1   | レポートヘッダ | レコード読み込み開始時 |
|    2   | ページヘッダ   | ページ出力開始時       |
|    3   | 詳細           | レコード読み込み毎|
|    4   | レポートフッタ | レコード読み込み終了時 |
|    5   | ページフッタ   | ページ出力終了時       |
しかしイメージが沸かない。ActiveReportと似てるのか？
使ったことないから分からん。

##とりあえず簡単なサンプル帳票で確認してみる。
各セクションにオブジェクトを色々配置して、サンプル帳票っぽいものを作成。
テキスト、罫線、データフィールドとか、ドラッグ&ドロップで色々配置。
それぞれのセクション内に詳しい説明も載っけてみた。
![Reportデザイナ-編集後.PNG](https://qiita-image-store.s3.amazonaws.com/0/50078/78eabd23-42f6-73e7-9083-1e41ca68a6f4.png)
※参照するDataSetのテーブルには25行分のレコードが存在する、という設定。
　DataSetにはこんな感じで無理やりテスト用データを突っ込んでいます。

###上記のレイアウトから出力された帳票
####**1枚目** - レポートヘッダが出力されている。
![セクション解説出力結果-1P.PNG](https://qiita-image-store.s3.amazonaws.com/0/50078/df009ba8-3e9f-9519-eb30-0cfd5f6769dc.png "1枚目")

####**2枚目** - レポートヘッダ/フッタは出力されていない。
![セクション解説出力結果-2P.PNG](https://qiita-image-store.s3.amazonaws.com/0/50078/80e95da6-b4d6-bda5-aa42-eab2de8e0580.png "2枚目")

####**3枚目** - レポートフッタが出力されている。
![セクション解説出力結果-3P.PNG](https://qiita-image-store.s3.amazonaws.com/0/50078/267ea51a-d203-4025-0b04-40fba3bbe41e.png "3枚目")

####**...出力終了**

なんとなくイメージつかめた。

##**まとめ**
- 各セクションで出力タイミングは異なる。
- DataTable、つまり詳細セクションを中心に出力タイミングは制御されている。
gzipコマンドで拡張子.gzのファイルを解凍しました

Macで**拡張子.gz**のファイルを解凍しました。普段はマウスクリックで解凍していたので必要なかったです。

# gzipコマンドで解凍

```bash:gzファイルを解凍
gzip -d ~/Desktop/hoge.sql.gz 
```
gzipに`-d`オプションを付けます。

解凍されたかを確認します。

```bash:解凍されたファイルを確認
ls -al ~/Desktop/

略

-rw-r--r--   1 pugiuser  staff   1927097426  6 11 18:06 hoge.sql
```
ちゃんと解凍されていました(☝ ՞ਊ ՞)
LayerやNodeを継承するときのアレをC++として書き直す

# LayerやNodeを継承するときのアレをC++として書き直す

新しいシーンなどを生成する際にcocos2d::Layerやcocos2d::Nodeを継承し、その後CREATE_FUNC()なるマクロを利用しますがこの部分をC++のテンプレートで書き直してみます。ただそれだけのことです。

書き直した結果がこれ↓

```cpp
template< class T, class S>
class CocosObject {
public:
  static T* create(){
    auto object = new T();
            
    if( object && object->S::init() && object->init() ){
      object->autorelease();
      return object;
    } else {
      delete object;
      return nullptr;
  }
};

class HelloWorldScene : public CocosObject< HelloWorldScene, cocos2d::Layer > {
public:

  // シーンの生成
  static cocos2d::Scene* createScene(){
    auto scene = cocos2d::Scene::create();
    auto layer = create();

    scene->addChild( layer );

    return scene;
  }

  // 初期化
  bool init(){
    // cocos2d::Layer->init();はCocosObjectクラスでするため記述不要

    return bool;
  }
};
```

手元で使ってるはテーマとは関係ない部分もあったので、手で修正しているので過不足があるかもしれません。
シーン特化であればcreateScene()はCocosObject側へ持って行けるのでもっとすっきりと書けますね。

P.S.

```cpp
HelloWorldScene: CocosObject<HelloWorldScene, cocos2d::layer>
```
とかいてる部分の"HelloWorldScene"が二回あるのが冗長で省略したいけど書き方分からないです・・・・
vagrant備忘録

## はじめに
ドットインストールのVagrant入門をみて、Vagrantを覚えた時のメモ。
環境は、mac osX / VirtualBox / Vagrant です。

ドットインストール
http://dotinstall.com/lessons/basic_vagrant

vagrant日本語ドキュメント
http://lab.raqda.com/vagrant/index.html

## インストール
以下のサイトから最新のものをインストールします。
私は、VirtualBox4.3.20、Vagrant1.6.5でした。

・VirtualBox
https://www.virtualbox.org/

・Vagrant
https://www.vagrantup.com/

## boxの取得
box公開サイト
https://vagrantcloud.com/

    $ vagrant box add [box名] [box URL]

## boxの確認

    $ vagrant box list

## 初期化
以降のコマンドは、このディレクトリで実行する。

    $ mkdir hoge
    $ cd hoge
    $ vagrant init [box名]

## 起動等

    $ vagrant status  # ステータス確認
    $ vagrant suspend # 保留状態にする
    $ vagrant resume  # 再開（suspendからの復旧）
    $ vagrant halt    # シャットダウン
    $ vagrant up      # 起動
    $ vagrant reload  # Vagrantfileの修正を反映
    $ vagrant destroy # 削除

## ssh接続
ログインユーザとパスワードは`vagrant`となり、sudo権限がある。
`vagrant up`していること。

    $ vagrant ssh

## 共有ディレクトリ
ホストOSのVagrantfileのあるディレクトリとゲストOSの`/vagrant`は共有ディレクトリになっていて、簡単にファイルをやりとりできる。

## プロビジョニング
VagrantfileにゲストOSの設定や自動実行させたいコマンドを記述できる。

    $ vi Vagrantfile

以下を編集

・ipアドレス

    config.vm.network "private_network", ip: "192.168.33.10"

※自分以外のPCからも利用した場合、publicとする。

    config.vm.network "public_network", ip: "192.168.33.10"

・メモリ

    vb.customize ["modifyvm", :id, "--memory", "1024"]

※vagrant1.7.2のときは、以下のように記述した。

    config.vm.provider "virtualbox" do |vb|
        vb.memory = "1024"
    end

・コマンド実行

    config.vm.provision :shell, :inline => "[コマンド]"

・shell実行

    config.vm.provision :shell, :path => "[実行ファイル]"

実行ファイルの例

    sudo yum -y install httpd
    sudo service httpd start
    sudo chkconfig httpd on

・起動時にプロビジョニングを実行

    $ vagrant up --provision

・プロビジョニング反映

    $ vagrant reload --provision

## box作成
Vagrantfileのある場所で実行。

    $ vagrant package

## プラグイン

    $ vagrant plugin list                   # プラグイン確認
    $ vagrant plugin install [プラグイン名]   # インストール
    $ vagrant plugin uninstall [プラグイン名] # アンインストール

## saharaプラグイン
`sandbox on`した時点からの変更を破棄することができる。

    $ vagrant sandbox status   # sandboxモード確認
    $ vagrant sandbox on       # sandboxモード開始
    $ vagrant sandbox off      # sandboxモード終了
    $ vagrant sandbox commit   # 変更の反映
    $ vagrant sandbox rollback # 変更の破棄

`commit`は起動中に実行すると時間がかかる。
`vagrant suspend`してから実行すると早くなる。

    $ vagrant suspend
    $ vagrant sandbox commit
MySQLで使うコマンドメモ

いっつもググるので自分用メモです。

* dumpして圧縮しつつ目的の転送先サーバに送ってそのままリストアする    
`mysqldump --default-character-set=sjis -uuser_name -ppassword db_name tbl_name | gzip | ssh 転送先 'zcat | mysql -uuser_name db_name -ppassword'`
Eclipse PDOで配列内のオブジェクトをコード補完する


```php:hoge.php
class hoge {

	private $id = NULL;
	
	public function setId( $id ) {
		$this -> id = $id;
	}
	
	public function getId() {
		return $this -> id;
	}
}
```

```php fuga.php
class fuga {
	
	/**
	 * hogeオブジェクト配列
	 * @var array
	 */
	private $hogeArray = array();
	
	public function getHogeArray() {
		return $this -> hogeArray;
	}
	
}
```

という2つのクラスがあり、`fuga`クラスの`$hogeArray`の要素は、全て`hoge`オブジェクトだったとする。

そのような時に、

```php
$fuga = new fuga();

foreach ( $fuga -> getHogeArray() as $hoge ) {
	
	$hoge -> ge
}
```

と入力すれば、`$hoge -> getId()`と補完して欲しいところなんだけど、Eclipse的には`$hogeArray`の要素が`hoge`オブジェクトだとは分からないので、当然、補完してくれない。

そんな時は`fuga`クラスのコメントを以下のようにする。

```php fuga.php
class fuga {
	
	/**
	 * hogeオブジェクト配列
	 * @var array[hoge]
	 */
	private $hogeArray = array();
	
	public function getHogeArray() {
		return $this -> hogeArray;
	}
	
}
```

これで、補完してくれるようになりましたー。
CentOS 7でrrdcachedを使う

CentOS 7でrrdtoolに含まれている、rrdcachedを使う場合、
自動的にsystemd用のファイルを作成してくれないので、
自分で書くことになると思う。

とりあえず、以下の内容で動作させてみた。
何か突っ込みあれば、頂きたく。

[Unit]
Description=RRDTool Cache Daemon

[Service]
ExecStart=/usr/bin/rrdcached -l 0.0.0.0:42217 -w 300 -z 300 -f 600 -b /myhome/rrdfile -p /myhome/run/rrdcached.pid -F -j /myhome/journal
ExecStop=/bin/kill -12 ${MAINPID}
Restart=always
Type=forking

[Install]
WantedBy=multi-user.target

ExecStopで、意図的に-12（SIGUSR2）を渡している。

rrdcachedを一般的なSIGTERMで止めようとすると、なかなか終了してくれない事象にぶつかった。
このなかなか終了してくれない、という状態でshutdown -h nowとか、OSをシャットダウンしようとしても、
rrdcachedの終了に待たされて、OSがシャットダウンしない。

OSのシャットダウン時に、すぐに終了して欲しかったので、SIGUSR2を送り、即終了するようにした。

注意したいのは、起動オプションに、必ず-j パスを渡す必要がある点。

これを渡しておかないと、SIGUSR2ですぐに終了したとき、
まだ実際のファイルに書き込んでいないデータが、すべて消滅する。

-j パスを指定しておくと、rrdcachedは、受け取ったコマンドを
一旦ファイルに保存する。

次回起動時に、-j パスにファイルが存在する場合、
このファイルをいい感じに読み込み、処理を再開できる。
unit testでinputにセットした値をmodelValueに反映してvalidateしなおす


`input`に値をセットしただけではモデルに値が反映されません。`$apply`とかしても効きません。

```
angular.element($('div[inclusion="true"] input')).val('http://example.com/').trigger('input')

$scope.form.expression.$commitViewValue()
$scope.form.expression.$validate()
```

jQueryを使わない場合は [angularjs - Setting view value an input field in a unit test of an angular form directive - Stack Overflow](http://stackoverflow.com/questions/26372729/setting-view-value-an-input-field-in-a-unit-test-of-an-angular-form-directive/26376249#26376249) を参照。
AnsibleでRedisの2.5以降のバージョンをインストールするPlaybook

AnsibleでRedisのインストールを自動化しようとしたのですが、
yumからRedisをインストールする場合、バージョンが2.4までしか取得できません。

しかしバージョン2.8を使いたかったため、面倒ですがソースからRedisをインストールすることにしました。
なおOSはCentOS6.5です。

```playbook.yml
---
- hosts: hostuo
  sudo: yes
  tasks:
    - name: libselinux-python install
      yum: name=libselinux-python state=latest
    - name: gcc install
      yum: name=gcc state=latest
    - name: redis source download
      get_url: >
        url=http://download.redis.io/releases/redis-2.8.19.tar.gz
        dest=/tmp/redis-2.8.19.tar.gz
    - name: redis unarchive
      command: >
        tar zxvf redis-2.8.19.tar.gz
        chdir=/tmp/
    - name: make
      command: >
        make
        chdir=/tmp/redis-2.8.19
    - name: make install
      command: >
        make install
        chdir=/tmp/redis-2.8.19
    - name: deamonize on
      replace: >
        dest=/tmp/redis-2.8.19/redis.conf
        regexp='daemonize no'
        replace='daemonize yes'
    - name: redis.conf copy
      copy: >
        src=/tmp/redis-2.8.19/redis.conf
        dest=/etc/redis.conf
        owner=vagrant
    - name: redis start
      command: >
        redis-server /etc/redis.conf
      sudo: no
```

ansible-playbookを実行します。

```
$ ansible-playbook playbook.yml

PLAY [127.0.0.1] ************************************************************** 
~中略~
PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/username/playbook.retry

127.0.0.1                  : ok=10    changed=10    unreachable=0    failed=0 
```


上手くいけたようでした。

```
$ redis-server -v
Redis server v=2.8.19 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=6456d4b7b0a33b29

$ redis-cli
127.0.0.1:6379> 
```
最近のgitconfig

# 最近のWindows環境でのgitconfig
WindowsでのファイルですがLinuxでもほとんど同じ

```text:~/.gitconfig
[user]
  name = taka
  email = ....@.....
[color]
  status = auto
  diff = auto
  branch = auto
  interactive = auto
[alias]
  a = add
  b = branch -v
  ba = branch -av
  br = branch -rv
  bl = blame
  co = checkout
  ci = commit -v
  dw = diff --color-words
  d = diff
  dc = diff --cached
  st = status
  up = pull --rebase
  pr = pull --rebase
  rp = remote prune
  l = log
  ls = log --stat
  lp = log -p
  graph = log --graph --date=short --pretty=format:'%Cblue%h %cd %Cgreen%cn%creset%s'

[diff "xlsx"]
    binary = true
    textconv = ~/.bin/git-xlsx-textconv.pl
[push]
	default = upstream
[core]
	quotepath = false
```

# 参考サイト
* [git/日本語ファイル名をgit statusなどで表示する方法](http://tobysoft.net/wiki/index.php?git%2F%C6%FC%CB%DC%B8%EC%A5%D5%A5%A1%A5%A4%A5%EB%CC%BE%A4%F2git%20status%A4%CA%A4%C9%A4%C7%C9%BD%BC%A8%A4%B9%A4%EB%CA%FD%CB%A1)
* [xlsx ファイルを git diff しやすくする為の天才的な wrapper script を書いた](http://blog.yappo.jp/yappo/archives/000841.html)
リダイレクトの方法

PCとスマホ両方に対応したサイトを構築するにあたって、

* レスポンシブで対応する(読み込むファイルを分ける)
* PC用・スマホ用でページ(URL)を分ける
* PC用・スマホ用で読み込むソースを分ける(同じファイル内で)
* PCではあるけど、スマホにはないページがある(またはその逆)

のような場合がでてくる。
アクセスされたくないページにアクセスされてしまっても、正しいページに誘導してあげることが必要になる。

上記の場合がメインの内容です。

## metaタグによるリダイレクト

```html
<meta http-equiv="refresh" content="秒数;URL=URL">
```

URLは相対パスでも絶対パスでも可能

ex.5秒後に指定したURLにリダイレクトさせる場合

```html
<meta http-equiv="refresh" content="5;URL=/sp/index.html">
```

## JavaScriptによるリダイレクト

```js
location.href="URL";
```

URLは相対パスでも絶対パスでも可能

### 秒数を指定する場合

```js
setTimeout("redirect()", 5);
function redirect(){
    location.href='/sp/index.html';
}
```

### デバイスごとに切り替える場合

```js
var ua = navigator.userAgent;
var redirectPass = '/sp/index.html';
if(ua.search(/iPhone/) != -1 || ua.search(/iPad/) != -1 || ua.search(/iPod/) != -1 || ua.search(/Android/) != -1){
    location.href = redirectPass;
}
```

### パラメーターなどをつけてリダイレクトする場合

```js
var url = document.URL;
if(url.match(/separate/)){
  if(url.match(/\?/)){
    location.href = url + "&device=sp"
  }else{
    location.href = url + "?device=sp"
  }
}
```

## .htaccessによるリダイレクト(同じホストの場合)

```.htaccess
RewriteEngine On
RewriteBase /
RewriteRule ^$ /sp/ [R=301,L]
```

* ディレクトリ単位でリダイレクトの設定が可能
* サブディレクトリもそのままの階層のままリダイレクトが行われる

### リダイレクトステータス

#### 301
* 恒久的なリダイレクト
* 元に戻すことが無い場合に利用する
* ブラウザが記憶をする為、htaccessの記述を無くしてもリダイレクトし続ける場合がある

#### 302
* 一時的なリダイレクトです。
* メンテナンス中など、一時的な対処に使う

## PHPによるリダイレクト

```php
header('location: /sp/index.html');
exit();
```
has_oneでassociationされたテーブルをまとめて登録・更新するtips

例えば

app/models/user.rb

```rb

class User < ActiveRecord::Base

has_one :user_status, dependent: :destroy

```

app/models/user_status.rb

```rb

class UserStatus < ActiveRecord::Base

belongs_to :user

```

みたいなモデル設計に、ちょこちょこ出くわすかと思います。


そして、これら二つを同時に登録・更新するUIもあるあるです。
そういう時はこのようにすると良い感じにまとめてイケます。

app/models/user.rb

```rb

class User < ActiveRecord::Base

has_one :user_status, dependent: :destroy
accepts_nested_attributes_for :user_status

```

app/views/users/_form.haml

```haml

= for_for @user do |f|

= f.text_field :name

= f.password_field :password

= f.fields_for :user_status, 
@user.user_status || UserStatus.new do |s|

  = s.text_field :emotion


```

この場合、strong_parameterはuser_status_attributes[]となるので注意。
matlabのClass内メソッドの書き方, 実行の仕方

matlabのClassのコンストラクタ以外のmethodsは，C/C++と違って第一引数に対象のオブジェクト情報が来るようです．

```matlab:mlclassmethods.m
classdef hogeclass
  property
    member
  end
  methods
    function hogefunction(this)
      this.member = hoge;
    end
  end
end

```


実行時は以下のコード

```matlab:main.m
inst = hogeclass(); %インスタンスを生成
inst.hogefunction(); %Class定義では引数thisを記述するが，実行時は引数なし.
```
Milkcocoaでソーシャルログインを使うときの設定(Milkcocoa、Auth0、Twitterそれぞれの設定)

# 概要
下記の記事で解説されてるMilkcocoaでソーシャルログインを使う際の設定ですが、各サービスの設定がなにをしているのかイメージしづらかったので自分なりに図でまとめてみました。理解不足により誤った情報を載せてしまうかもしれませんが、その場合はコメント等いただけると幸いです。

[リアルタイムなToDoアプリをMilkcocoaとJavaScriptで作る（認証編）](http://blog.mlkcca.com/frontend/todo-app-2/?utm_source=dlvr.it&utm_medium=twitter)

# 認証の流れの図
![Milkcocoa⇔Auth0⇔Twitter.png](https://qiita-image-store.s3.amazonaws.com/0/30304/44b7079b-27c8-c4f5-970a-ae95967c3612.png)


# まとめ
私はこんな感じにイメージしてますという記事でした。が、milkcocoaへのログイン状態の取得部分の理解が曖昧なのでそこは正しくないかもです(他も違うかもしれない)。なので上記記事などで流れを追いながら、ご自身で認証の流れをまとめてみることをお勧めします。
QtでUNIX時刻から日付表記を得る

##どうしてこんな事を？
なんかよくわかんなかったんですがサンプルコードが欠片も見つけられなくてメソメソ…
サンプルコード無いと書けないマンなのだけれど、できたので、僕みたいな人向けにサンプルコードみたいな感じで書いておきます


```
QDateTime test_time;
test_time.setTime_t(1433984121);
qDebug()<<test_time.toString("yyyy/MM/dd hh:mm:ss");
```

出力は

```
"2015/06/11 09:55:21"
```

`toString()`の引数（上の例では`yyyy/MM/dd hh:mm:ss`）でフォーマットを指定できる。詳しくは[公式のドキュメント](http://doc.qt.io/qt-5/qdatetime.html#toString)読んでください


こうやって見てみるとすんげー単純な話ですね！！！！！！つらさしかない
docker個人的メモ

##環境情報
```bash
[root@docker system]# uname -a
Linux docker 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@docker system]#
[root@docker system]# docker version
Client version: 1.6.0
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 8aae715/1.6.0
OS/Arch (client): linux/amd64
Server version: 1.6.0
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 8aae715/1.6.0
OS/Arch (server): linux/amd64
```

##Docker.service
/usr/lib/systemd/system

```vim
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/docker -d $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
MountFlags=slave

[Install]
WantedBy=multi-user.target
```

##Dockerの設定ファイル
* /etc/sysconfig/docker
* /etc/sysconfig/docker-storage
* /etc/sysconfig/docker-network


####/etc/sysconfig/docker
```vim
#docker daemon実行に関するオプション
OPTIONS='--selinux-enabled'

#Unixソケット＋tcp通信を実現するために
#OPTIONS='--selinux-enabled -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'


#Dockerのセキュリティ関連のファイル格納パス
#DOCKER_CERT_PATH=/etc/docker

#追加するDockerリポジトリのパス
#ADD_REGISTRY='--add-registry registry.access.redhat.com'

#ブロックするDockerリポジトリのパス
#BLOCK_REGISTRY='--block-registry'

#httpsで保護されているが適切な証明書なしでのアクセスを許可するレジストリパス
#INSECURE_REGISTRY='--insecure-registry'

#selinux-enabledオプションを取り除く場合に、有効にする必要があるオプション
#setsebool -P docker_transition_unconfined 1

#Dockerのtmp領域として使用されるディレクトリパス
#DOCKER_TMPDIR=/var/tmp

#cron（/etc/cron.daily/docker-logrotate）の制御
#statusLOGROTATE=false

```

####/etc/sysconfig/docker-storage
```vim
#/var/lib/dockerで使用している領域を変更したい場合に、設定するオプション（以下では、メタデータ領域とデータ領域とを分けて設定している）
#dm.metadatadev ：メタデータ用
#dm.datadev ：実データ用

#DOCKER_STORAGE_OPTIONS = --storage-opt dm.metadatadev=/dev/mylogvol/my-docker-metadata --storage-opt dm.datadev=/dev/mylogvol/my-docker-data


```

####/etc/sysconfig/docker-network
```vim
#用途がわからない
DOCKER_NETWORK_OPTIONS
```
シェルスクリプトでsudoを実行する

仮にApacheの再起動をしたい場合などは、

```sh
echo "パスワード" | sudo -S /etc/rc.d/init.d/httpd restart
```

と書いてやると実行できます。

もちろん、実行ユーザにはvisudoで権限を与えてやって下さい。

全てOKであれば

```:visudo
hoge ALL=(ALL)
```

ApacheとMySQLの操作だけにしたい場合は、

```:visudo
hoge ALL=(ALL) /etc/rc.d/init.d/httpd,/etc/rc.d/init.d/mysqld
```

などなど。
Qiita上にメモを公開する意義


※技術的な内容はまったくないです(汗

一応企業人なのですが、会社でPGと名のつく肩書きを持っているのは私一人しかいません。
その私も未経験採用で入社したので、技術&経験はないに等しいです。
(ちなみに入社当時は上司がいましたが、3ヶ月もしないうちに辞めてしまいました(´;ω;`))

そんな私が頼れるのは目の前の画面とその向こうにいる技術者の皆様のみ。
(書籍ももちろん使えないことはないですが、まず必要なものがわからない^^;)

自分なりに試行錯誤したものを公開するのは、正直めっちゃ悩みます。
こんな当たり前のこと何で知らねーの？
とか
何このダサいコード！！
って思われるのは明白だからですｗ

でも、恥を忍んで公開することで温かいツッコミやご指導をいただけるので、本当に嬉しいです。

まだまだおいそれとプログラマーですとは名乗りがたいですが…今後ともよろしくお願いしますm(._.*)mﾍﾟｺｯ

余談ですが、今度PHPカンファレンスデビュー(@福岡)するので少しは成長できるといいなぁ…
首都圏直下型地震があった場合のサービスの継続性を考える


関東圏でインターネットを利用したサービスを提供（利用）していて、首都圏直下型地震が起こった場合のリスクを考えてみます。
対処（リスクマネジメント/危機管理）については後回しで。
BCP（Business Continuity Plan/事業継続計画）の下地として。
***
大まかな要素としてはこんなものでしょうか。
1. 電気（電力）
2. 回線
3. ISP・iDC
4. サーバー（中のデータとか）

#1. 電気（電力）※一番大事
2015年6月現在、全ての原子力発電所が停止してるので、日本の電力源はほぼ火力発電。
東京湾に集中してる火力発電所が被災した場合、最悪、５割程度の供給が１週間以上継続するとの事。
＋
発電所は震度6弱以上で運転停止するみたいなので、大地震直後に一斉に停電は確定っぽい。
***
* [電気事業連合会　発受電速報　2014年度分（2015年4月13日発表） ](http://www.fepc.or.jp/library/data/hatsujuden/__icsFiles/afieldfile/2015/04/28/hatsuju_s_fy2014_s.pdf)

| 種類　            | 発電量（千kWh) | 割合             |
|:-----------------|------------------:|:-------------:|
| 水力                |       60,606,597 |     8.51%     |
| 火力                |     649,227,902 |    91.14%    |
| 原子力             |                     ０ |     0.00%     |
| 新エネルギー等 |         2,513,248 |      0.35%      |

***
* [首都直下地震の被害想定と対策について（最終報告）](http://www.bousai.go.jp/jishin/syuto/taisaku_wg/pdf/syuto_wg_report.pdf)

>３．ライフライン
（１）電力
湾岸の大部分の火力発電所が被災した場合、最悪、５割程度の供給が１週間以上継続することも想定される。



>４．電力供給の不安定化
・ 概ね震度６弱以上の地域においては火力発電所が運転を停止する。この結果、夏場のピーク時の需要に対して電力の供給能力は５割程度に低下し、発災直後は、需給バランスを起因として広域で停電が発生する。

***
* [ 首都直下地震防災・減災特別プロジェクトにおける震度分布図](http://www.mext.go.jp/b_menu/houdou/24/03/1319353.htm)
* [日本全国の火力発電所一覧地図](http://agora.ex.nii.ac.jp/earthquake/201103-eastjapan/energy/electrical-japan/type/1.html.ja)

↓合体した図
![震度と火力発電所.png](https://qiita-image-store.s3.amazonaws.com/0/82339/990cc9da-e87b-0c0f-6199-b0e4e6a20c4e.png)

#2. 回線
主に回線経路の物理的破損と、収容局の電源設備の問題。
回線を収容している局舎は、停電しても10時間は非常用電源で持つよう設計。
宅内側の回線設備の電源をUPS等で確保すれば、10時間程度は通信可能に。
* [WGにおける検討の 中間報告 - 総務省](http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CCwQFjADahUKEwiwo9r3gYfGAhVMe7wKHSHGAII&url=http%3A%2F%2Fwww.soumu.go.jp%2Fmain_content%2F000135489.pdf&ei=6Cp5VbCPEMz28QWhjIOQCA&usg=AFQjCNFxI3Y7ZXSN9oIa8blFhIkUr1NjrA&bvm=bv.95277229,d.dGc&cad=rja)
> 【現行モデル】
対象局の保守特性に係らず蓄電値の保持時間は10時間で固定

その他、関東主要キャリアの光回線等の主な敷設経路（使ってるキャリアの幹線が切れたら迂回経路で遅延する可能性大）
・NTT（独自網？）
・KDDI（高速道路）
・ソフトバンクテレコム（鉄道）
・東京電力（電柱？）※サービス終了 KDDIに移管

#3. ISP・iDC
プロバイダーもDCに収容されているだろうから、ガスタービンエンジン発電機等で18~24時間連続運転はされるであろう。ビルなら耐震バッチリで倒壊しないだろうし。
* [IDCフロンティア ホーム > データセンター 有明データセンター](http://www.idcf.jp/datacenter/ariake.html)

> 連続18時間運転可能なガスタービン発電機を完備。

* [IDCフロンティア ホーム 東京新宿データセンター](http://www.idcf.jp/datacenter/shinjuku.html)

> 連続24時間運転可能なGTG（ガスタービン発電機）を完備。

#4. サーバー（中のデータとか）
被災地外（西日本とか国外とか）なら、とりあえず動いてるので問題無い。（被災地からはアクセス不能だけど）
被災地で回線経路に破損が無いなら、操作端末を含む設備一式にUPSを付けた上で、10時間以内（局舎の非常用電源設備の保持時間）でバックアップしたり移設なりの対応が可能。

#（現時点でのまとめ）
* 首都圏直下型地震があった場合は、確実に計画停電。
（都内23区の例外はあるかも。ただし回線経路の物理的破損も有り得るので、どこまで使えるのか不明）
* 全体の通信回線の復旧は1週間以上はかかる見込み
* 首都圏のみでサービス展開している場合は、顧客もサービスを利用できない可能性(大)
* 関西、国外のリージョン等で冗長化しといたほうが良い。
※日銀では発災当日中に機能を回復する体制とのこと。良いお手本。

> 首都直下地震の被害想定と対策について （最終報告）
首都直下地震対策検討ワーキンググループ
２．経済中枢機能等
（１）資金決済機能
・ 発災時におけるシステムの継続性を確保するため、日本銀行ではシステムセンターの耐震化、十分な時間稼働させることが可能な非常用発電設備の確保、夜間・休日の発災にも対応できる初動対応職員の確保、都内のシステムに不測の事態が発生した場合の大阪のシステムへの切り換えと重要データの同期等、高い堅牢性が確保されており、**仮にシステムが一旦停止した場合にあっても、発災当日中に機能を回復し、当日中の資金決済を終えられる体制が整えられている。**

継続したサービスを提供できるように備えるべし。
ビルドは通るのに実行しようとするとエラーになったときに取った対処法(Error:Execution failed for task ':app:dexDebug')


```
Error:Execution failed for task ':app:dexDebug'. > finished with non-zero exit value 2
```

この"Error:Execution failed for task ':app:dexDebug'"というエラーはホントによく見る。
だが、これだけでググるといろいろな原因があることが分かって、なかなかこれという原因に行き当たりにくい。

なので、この記事も、あくまでも「今回」「私が」経験した原因に過ぎないので、まあ備忘録程度に記しておく。

#1 エラー詳細を見る

AndroidStudioの環境設定に設定を追加する。

File | Settings | Build, Execution, Deployment | Compiler
のCommand-line Optionsに以下を追加。

```
--debug
```

「OK」のクリックを忘れないように。

#2　実行ボタンを押し、デバッグログを見る。

今回は、以下のように出ていた。

```
com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/analytics/internal/Command$1;
```

GoogleAnalytics関連でクラスが重複しているか何か起きている模様。

#3 build.gradleを確認

上記でググると、GoogleAnalyticsのV3が弾かれるようになったため？という記述をいくつか見つける。
そこで、build.gradleを確認する。

```build.gradle
dependencies {
    compile project(':myUtility')
    compile project(':libJava')
    compile 'com.google.android.gms:play-services-analytics:+'
}
```

※myUtilityは全社で入れるよう要求されている社内共通ライブラリ(Androidライブラリプロジェクト)。
※libJavaはpure javaなライブラリ。
GAはV4が使用されているはずだ。

さんざん悩んで、myUtilityに着目。myUtilityのbuild.gradleを見てみる。

```myUtilityのbuild.gradle
dependencies {
    compile files('libs/myutility.jar')
}
```

myUtilityのlibsフォルダを見てみるが、myutility.jar以外にはない。

#4 libs/jarの中身を見てみる

このjarの中にまさかGAのV3のコードがありやしないか・・・ということで、jarファイルを展開してみてみる。

と、思いっきりGAのクラスを発見！

このAndroidライブラリプロジェクトが配布されたときのプロジェクト(eclipse用)を見てみる。
すると、libsフォルダには以下のようになっていた。

libs
+ myutility.jar
+ gcm.jar
+ libGoogleAnalyticsServices_3_0_1.jar

犯人はこいつらだ！

しかし、AndroidStudio用のlibsフォルダには、myutility.jarしかない。
まさかと思って、この配布状態のプロジェクト内にあるmyutility.jarをまた展開して見てみる。
こちらには、GA/GCMのクラスは含まれていなかった。

ということは、この**AndroidライブラリプロジェクトをAndroidStudioにインポートする際に、jarがすべてひとまとめに固められてしまったのではないか？**という予測が立つ。

#5 jarファイルをオリジナルに置き換える

GA/GCMのクラスを含まない、オリジナルのmyutility.jarを、AndroidStudioプロジェクト内にコピーして置き換えたところ、一応実行できるようになった。

myutility.jar内のGA関連のコードは、アプリからは呼んでいないので、今のところ問題が無いが、もしライブラリ内から自分で呼んでいたら、アウト。

ひとまず、ライブラリの開発チームに、GAのV3はもう使えないよと伝えた。
GCMはどうだろう。こちらも併せて最新版に合わせてもらいたいものだ。
というかAndroidStudioに対応してくれ。
(かくいう自分もAndroidStudioに移行してまだ2ヶ月だが。)

#6(疑問) もしライブラリプロジェクトのビルドにもGooglePlayService関連が必要な場合

myUtilityのビルドにGAが必要な場合、build.gradleを以下のように書くことになるだろう。

```myUtilityのbuild.gradle
dependencies {
    compile files('libs/myutility.jar')
    compile 'com.google.android.gms:play-services-analytics:+'
}
```

んで、本体も`compile 'com.google.android.gms:play-services-analytics:+'`があるだろう。

これはこれで、`Multiple dex files define`エラーにならないのかな？
重複参照だけどこれはうまいことgradleが解決してくれるんかな？
Matlabの関数のテンプレート

戻り値なし

```matlab:FuncName.m
    %return_value : 戻り値
    %FuncName : 関数名，ファイル名
    %args : 引数
    function FuncName(args)
        args;
```

戻り値あり，単一

```matlab:FuncName.m
    %return_value : 戻り値
    %FuncName : 関数名，ファイル名
    %args : 引数
    function return_value = FuncName(args)
        return_value = args;
```

戻り値あり，複数

```matlab:FuncName.m
    %return_value : 戻り値
    %FuncName : 関数名，ファイル名
    %args : 引数
    function [return_value1, return_value2] = FuncName(args1,args2)
        return_value1 = args1;
        return_value2 = args2;
```
Selector XMLを自動生成してくれるSelectorChapekプラグイン

複数の状態を持つボタンなどのリソースを定義する場合、下記のようなselector xmlを作成することがよくあると思います。

```xml:button.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_normal" android:state_focused="false" android:state_pressed="false" android:state_enabled="true"/>
    <item android:drawable="@drawable/button_focused" android:state_focused="true" android:state_pressed="false" android:state_enabled="true"/>
    <item android:drawable="@drawable/button_pressed" android:state_focused="false" android:state_pressed="true" android:state_enabled="true"/>
    <item android:drawable="@drawable/button_disabled" android:state_focused="false" android:state_pressed="false" android:state_enabled="false"/>
</selector>
```

前から思っていましたが、面倒くさいです。
自動生成してくれるツールは無いでしょうか？
ありました。
SelectorChapek for Androidというプラグインです。

## 使い方
各状態に応じた画像ファイルをdrawable-xxx配下に置きます。
ファイル名の表記に揺れがあると駄目です。
たとえば無効時の画像ファイル名はxxx_disable.pngではなくxxx_disabled.pngとします。

![WS000052.JPG](https://qiita-image-store.s3.amazonaws.com/0/38581/b9d176d8-c31a-f5c7-4423-bd36d5f69ef6.jpeg)

ツリー上のdrawableディレクトリを選択して右クリックメニュー[Generate Android Selectors]を選択します。

![WS000053.JPG](https://qiita-image-store.s3.amazonaws.com/0/38581/8959783b-b927-ff75-a27a-673983b7027b.jpeg)

button.xmlができました。
selector xmlはdrawable/配下に自動で生成されます。

![WS000055.JPG](https://qiita-image-store.s3.amazonaws.com/0/38581/b9477d5a-b3c2-6343-7d26-6a5d7ead1056.jpeg)

複数のアイコンを一度に追加したい場合などに非常に便利です。

ただし、この操作を行うとdrawable-xxx配下にあるすべての画像リソースを検査してxmlを生成しようとします。
それが嫌な場合は、作業用のProjectを作成して、そこで実行すると良いと思います。

## リンク
SelectorChapek for Android
https://plugins.jetbrains.com/plugin/7298
iOS9でカスタムURLスキームの遷移に失敗するときの注意点

iOS9からURLスキームの使用に関する変更があり、
従来のopenURLを実行するだけではカスタムURLスキームの遷移が使用できなくなりました。
※Apple公式のURLスキーム（ブラウザを開くなど）は正常に動作します。

状況と対策についてまとめます。

![スクリーンショット 2015-06-11 15.23.58.png](https://qiita-image-store.s3.amazonaws.com/0/34488/4859acef-f9f3-0bfb-1b4b-00a2a56c28e4.png)


#iOS8までは有効なカスタムURLスキームによる遷移

```objc:Objective-C

// Objective-C
NSURL *url = [NSURL URLWithString:@"originalscheme://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
}

```

```swift:Swift
// Swift
let url = NSURL(string: "originalscheme://")!
if (UIApplication.sharedApplication().canOpenURL(url)) {
    UIApplication.sharedApplication().openURL(url)
}

```

#iOS9ではエラーになる
上記のコードをiOS9で実行すると以下のようなエラーログが表示されます。

-canOpenURL: failed for URL: "originalscheme://" - error: "This app is not allowed to query for scheme originalscheme"

また、- canOpenURLは対応するアプリがインストールされていて、
遷移可能な場合でもNOを返します。

#原因
WWDC2015 のセッションの中で以下のように述べています。
Session 703, “Privacy and Your App”
https://developer.apple.com/videos/wwdc/2015/?id=703

ビデオの8:33から、
「ユーザーがインストールしているアプリの情報は丁重に扱われるべきである。」と述べています。
ThirdPartyアプリがcanOpenURLを使用して、ユーザーがインストールしているアプリを調べることへの対策をしているようです。

#対策
ビデオの10:00に記載されているように「URLスキームの内容をinfo.plistに記載する」とこれまで通りに正常に動作するようです。
info.plistに記載が無い場合にエラーになります。

info.plistにLSApplicationQueriesSchemesのkeyと実行したいカスタムURLスキームを記載します。

![スクリーンショット 2015-06-19 1.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/34488/04c08637-a4a6-0a6d-ee10-c1533fd4800b.png)

#まとめ
iOS9でカスタムURLスキームがinfo.plistに記載されていない場合にエラーになります。
ユーザーがインストールしているアプリの情報がAppleのプライバシーモデルの対象となったようです。

#参考
WWDC2015 Session 703, “Privacy and Your App”
https://developer.apple.com/videos/wwdc/2015/?id=703

http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
Salesforce Event（行動）のまとめ

Salesforceの行動オブジェクトの各項目別に関する機能または動作のまとめ

# 任命者(OwnerId)
　行動を実行するユーザ
  
　* 自分以外のユーザを設定した場合
　　→該当の行動の所有権は割り当てたユーザになります。
　　　アクセス権限によっては作成者からは該当の行動を参照できなくなることがある
　　
# 名前(WhoId)
　リード、取引先責任者との関連付け

　* リードを選択した場合
　　→関連先(WhatId)は選択できない　

　* リードオブジェクト参照不可のライセンス(Platformライセンス、force.comライセンス)の場合
　　→選択肢にリードは含まれない

# 関連先(WhatId)
　リード、取引先責任者以外の標準オブジェクト（商談、取引先）、カスタムオブジェクトとの関連付け

　* カスタムオブジェクトを関連先で選択できるようにするには
　　→「カスタムオブジェクトの定義の編集 - 追加の機能「活動を許可」にチェック


# 同行者(EventRelation.RelationId)
　同行者の出欠を管理するためにEventRelationオブジェクトにレコードが生成される
　なお、**EventRelationオブジェクトにはトリガを作成できない**
　また、同行者の返信（参加、不参加）によるEventオブジェクトのトリガも発生しない

##### **追加**
　* リソースを含む場合
 　　→EventRelationオブジェクトに対象数分の新規レコード(Status=Accepted)が作成される

　* ユーザを含む場合
　　→Eventオブジェクトに対象数分の新規レコード(GroupEventType=1、IsGroupEvent=True、IsChild=True、EventId=親EventId)が作成される
　　→EventRelationオブジェクトに対象数分の新規レコード(Status=New)が作成される

　* リソース、ユーザ以外を含む場合
　　→EventRelationオブジェクトに対象数分の新規レコード(Status=New)が作成される

<table>
 <tr>
  <th colspan="2">Event Object</th>
 </tr>
 <tr>
　<th>Subject</th>
　<th></th>
 </tr>
</table> 

##### **削除**
　→関係者全員にメール通知される(メールアドレスが設定されている場合)
　→EventオブジェクトとEventRelationオブジェクトの対象のレコードはすべて削除される

##### **参加(回答後に返事の修正できる)**
　→EventRelationオブジェクトのEventIdとRelationIdが一致するレコードのStatus=Accepted、Response=XXXに更新する

##### **不参加**
　* ユーザを含む場合(回答後に返事の修正できる)
　　→EventRelationオブジェクトのEventIdとRelationIdが一致するレコードのStatus=Declined、Response=XXXに更新する
　　→Eventオブジェクトの該当のレコードは削除される

　* ユーザ以外を含む場合(回答後に返事の修正はできない)
　　→EventRelationオブジェクトのEventIdとRelationIdが一致するレコードのStatus=Declined、Response=XXXに更新する
Rails sorceryでメールを送らずにユーザ作成する


# Goal

* sorceryはemailアクティベーション機能やパスワードリセット機能などをサポートしていて、これを有効にすれば会員登録時などに必要なメールを自動で送信することができる
* 今回はテスト用だったりイレギュラー要件で、本番環境にユーザを作成しつつアクティベーションメールの送信はスキップさせる
* サービスは通常通り稼働させたいので、`config/initializers/sorcery.rb`はさわらず、rails consoleセッションにのみメールスキップの設定を反映させたい

# Background

https://github.com/NoamB/sorcery

sorceryでは以下のような設定で、emailアクティベーション機能やパスワードリセット機能を有効にでき、その際にユーザに送信する必要のあるメール処理をUserSupportMailerクラスに担当させている.

```ruby:config/initializers/sorcery.rb
Rails.application.config.sorcery.submodules = [:user_activation, :reset_password]
Rails.application.config.sorcery.configure do |config|
  # (省略)
  config.user_config do |user|
    # (省略)
    user.user_activation_mailer = ::UserSupportMailer
    user.reset_password_mailer = ::UserSupportMailer
    # (省略)
  end
  # (省略)
```

`Rails.application.config.sorcery.configure`ブロックの直下の設定（`config.session_timeout`, `config.user_class`など）はコントローラ層に対しての設定になり、以下のように設定値をたどることができる.

```ruby
Rails.application.config.sorcery.session_timeout
  # => 25200
```

`Rails.application.config.sorcery.configure`ブロック内にネストしている`user_config`ブロックはモデル層に対しての設定となる(`username_attribute_names`, `password_attribute_name`, ...). これらの設定はsorceryのユーザクラスに指定したクラスのクラスメソッドとして参照できるようになる.

```ruby
User.sorcery_config.class
  # => Sorcery::Model::Config
User.sorcery_config.username_attribute_names
  # => [:email]
```

# Manual

`rails console -e production`してからの手順

```ruby
## 
## sorceryの各種自動メール送信機能をストップする
## - アクティベーション時のメール
## - パスワードリセット時のメール
## - ロック解除時のメール
## 
User.sorcery_config.activation_mailer_disabled     = true
User.sorcery_config.reset_password_mailer_disabled = true
User.sorcery_config.unlock_token_mailer_disabled   = true

user = User.create!({email: 'metheglin@example.com', password: 'test_password'})
  # user_activationを有効にしていればユーザモデル(User)のcreate時にメールが送信されるが、
  # activation_mailer_disabled = trueにより自動ではメール送信されなくなる
user.update!({activation_state: 'active', activation_token: nil})
  # activation_stateはpendingで登録されるので、ユーザをログイン可能にしたければactiveに変更する
```

# Environment

```
sorcery (0.9.1)
rails (4.1.9)
```