OmniAICreator/Qiita-1.07M huggingface dataset:
【参考】ELB暖気(Pre-Warming)申請フォーマット

# ELB暖気(Pre-Warming)申請フォーマット

## 対象
以下の項目に該当する場合は、申請をおすすめします。

- ELB配下にEC2インスタンスがある構成での負荷試験実施しようとしている
- リリース直前
- メディアに掲載されることが決まった

## AWSサポートの方、ありがとう

> 申請が初めてなのでどのような内容を記載すべきか分かりませんので、項目を教えて頂けますか？

と正直に書いたら丁寧にサポートの方が教えてくれました。

**!!!!!注意!!!!!**
ELB暖気(Pre-Warming)申請ができるのは、AWSサポートプランがビジネス以上です。
申請前にプラン変更しておく必要があります。


## テンプレート
```
・ELB名・リージョン、またはFQDN： 
・予測されるリクエスト数 （リクエスト/秒）：
・予想されるピーク時のスループット (bit/秒)：
・Pre-warmingが必要となる期間（日本時間）：
・HTTPSの利用有無、利用する場合にはHTTPとHTTPSの割合（有／無、％）：
・利用するAZ（アベイラビリティ・ゾーン）の数： 
・バックエンドインスタンスでの Keep-alive の設定可否：
・バックエンド EC2 インスタンスの台数：
・ユースケース：
```

## 解説
### ELB名・リージョン、またはFQDN
今回申請対象のELB名、使用リージョン、FQDNを記入

### 予測されるリクエスト数 （リクエスト/秒）
最もアクセスがある時間帯での最大数

### 予想されるピーク時のスループット (bit/秒)
システム全体で予想される最大値をご教示ください。

### Pre-warmingが必要となる期間（日本時間）
Pre-Warmingが必要な時間。あまり短い期間じゃなくて余裕をもって。

### HTTPSの利用有無、利用する場合にはHTTPとHTTPSの割合（有／無、％）
有の場合は％で記入 

### 利用するAZ（アベイラビリティ・ゾーン）の数
Multi-AZでご利用の場合は"2"

### バックエンドインスタンスでの Keep-alive の設定可否
Webサーバなどのバックエンドインスタンスで、 Keep-alive 設定の有無を回答

#### ※補足
ELBはバックエンドWebサーバの Keep-Alive有効化によってパフォーマンスが向上しますので、有効化することをおすすめいたします。

### バックエンド EC2 インスタンスの台数
#### ※補足
当日までに想定するスループットに対応するインスタンスをご用意頂く必要がある

### ユースケース
今回の申請が必要な背景について可能な範囲で記入


## 算出方法
以下の項目の算出方法について

- 予測されるピーク時のリクエスト数 (requests/秒)
- 予測想されるピーク時の1リクエストあたりの平均リクエストサイズ+レスポンスサイズ(bytes), または想定スループット(bit/秒)


(例： 1ページが20KBのHTML、30KBのCSS、10枚の15KBの画像で構成されるケースを考える。このとき、1リクエストあたりの平均レスポンスサイズは、およそ16.66KB(=200KB/12リクエスト)と計算される。また、このケースでの平均的なHTTPリクエスト文字列長を1KBと仮定する。これらより、1リクエストあたりの平均リクエストサイズ+レスポンスサイズは、16.7 + 1 = 17.7[KB/req]と推定できる。)
AnimatorControllerのSpriteを一括で変換する



AnimatorController内のSpriteを一括で変換するツールを作りました

スプライトでパラパラ漫画アニメーションするキャラクタに、
見た目のバリエーションを増やしたいときとかに便利ではないかと！


## SpriteChanger

https://github.com/fuqunaga/SpriteChanger

![screenshot](https://raw.githubusercontent.com/fuqunaga/fuqunaga.github.io/master/SpriteChanger/window.png)


注意点としては、
新規AnimatorControllerとして保存する際、既存のAnimationClipを上書きするのはよろしくないので、
**[AnimatorController名]AnimationClips**というフォルダを生成してその中に新しいAnimationClipを生成してます
MacにDrupal8をインストールする

調査のため Mac に Drupal 8 をインストールしました。
apache は設定が面倒そうなんで利用しません。php が標準で持っている web サーバを利用します。また Yosemite だと、標準で php 5.5.20 がインストールされていました。

# mariadb のインストール

brew でインストールしたあと、接続確認をします。

```
$ brew install mariadb
$ mysql.server start
$ mysql -u root -p
Welcome to the MariaDB monitor.  Commands end with ; or \g.
```

# DBとユーザの作成

d8というデータベースを作成し、drupalというユーザで接続できるようにします。

```
$ mysql -u root -p
create database d8;
grant all privileges on d8.* to 'drupal'@'localhost' identified by 'qiitaa';
exit
```

# php.ini の編集

socket の位置を設定しないと、接続できないです。

```
$ sudo cp /etc/php.ini.default /etc/php.ini
$ grep -n "\.default_socket\s*=$" /etc/php.ini
977:pdo_mysql.default_socket=
1126:mysql.default_socket =
1185:mysqli.default_socket =
$ sudo vi /etc/php.ini
$ grep -n "\.default_socket\s*=$" /etc/php.ini
/etc/php.ini:977:pdo_mysql.default_socket=/tmp/mysql.sock
/etc/php.ini:1126:mysql.default_socket = /tmp/mysql.sock
/etc/php.ini:1185:mysqli.default_socket = /tmp/mysql.sock
```

# Drupal 8 のダウンロード

https://www.drupal.org/node/3060/release
にブラウザでアクセスをします。
赤枠のリンクをクリックしてダウンロードします。

![スクリーンショット 2015-05-28 21.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/5675/50744368-d9bb-c22b-4b7d-c8b5c11b0a32.png)

# 展開と起動

自分のホームディレクトリに app/drupal8 というディレクトリで展開します。このディレクトリは、自信の好きな名前にしてください。php のウェブサーバをポート8882で起動します。ポート番号は、空いている番号を指定してください。8882 は趣味です。

```
$ cd ~/app/drupal8/
$ tar zxvf ~/Downloads/drupal-8.0.0-beta11.tar.gz
$ cd drupal-8.0.0-beta11/
$ php -S 0.0.0.0:8882
```

# Drupalのセットアップ

## ブラウザでアクセス

http://localhost:8882 にアクセスすると、インストール画面が出ます。

![スクリーンショット 2015-05-28 21.44.06.png](https://qiita-image-store.s3.amazonaws.com/0/5675/51aec6cc-f510-a053-72c5-eb9166296f03.png)

言語が日本語になっているのを確認して、「Save and continue」をクリックします。
この言語は、ブラウザの言語を見て自動選択しているようです。

![スクリーンショット 2015-05-28 21.46.56.png](https://qiita-image-store.s3.amazonaws.com/0/5675/ada8e92b-f58e-f99a-9581-32791d4b24cd.png)

「標準」が選択されているのを確認して「保存して次へ」をクリックします。


![スクリーンショット 2015-05-28 21.48.59.png](https://qiita-image-store.s3.amazonaws.com/0/5675/aaf186bd-8353-923d-7613-f8040e856b25.png)

以下のように情報を設定して、「保存して次へ」をクリックします。

| フィールド名 | 設定値 |
|:-----------|:-----------:|
| データベース | d8 |  
| データベースのユーザ名 | drupal | 
| データベースのパスワード | qiitaa |
| ホスト  | localhost | 
| Port number | 3306 |

データベースに接続できれば、インストールが進みます。

![スクリーンショット 2015-05-28 23.41.19.png](https://qiita-image-store.s3.amazonaws.com/0/5675/9d82f11c-d1e5-337c-086f-12e26cbdaef1.png)

あとは、サイトの環境設定 を設定して終了です。問題なければ、トップ画面に遷移します。

![スクリーンショット 2015-05-28 23.46.40.png](https://qiita-image-store.s3.amazonaws.com/0/5675/da620930-f526-6df3-a21f-78f33214ca59.png)
セッション管理の要注意点

Webアプリを開発するに当たって、「自分でセッションを書きたい」なんて思う人はおそらく1%もいないでしょう。とはいえ、標準で備わっているセッション機能に問題や機能不足があって、手を入れざるを得なくなる、という場面も多々存在してしまいます。ここでは、セッションまわりでよく問題になる部分について触れてみましょう。

# そもそも、セッションとは
Webアプリにおけるセッションは、

1. 接続ごとに固有の識別子（セッションID）を割り当て、その接続を使った通信のたびにセッションIDを送受信する
2. セッションIDと紐付ける形でデータを持って、アクセスごとに値を読み出す。
3. データが書き変われば、書き戻す。

というような流れで、「接続ごとにデータを保存する」ということを実現しています。

# セッションとCookie
上の1にあるような「通信のたびにセッションIDを送受信する」ために使われるのがCookieです。ただ、CookieはHTTPヘッダに含まれるもので、いくつか取得するための経路が存在してしまいます。それを防ぐために、

* Cookieの`secure`属性とSSL（盗聴を防ぐため、HTTPS上での通信でしかCookieをやり取りしない）
* Cookieの`httponly`属性（JavaScriptから読み書きさせない）

などのような防御策が存在しています。

## セッションデータのCookie保管
Railsのデフォルトなどのように、セッションIDだけでなくてセッションの値までCookieに詰め込んでしまう、という実装も存在します。サーバ側でデータ保管しなくていいという意味では楽なのですが、

* ユーザー側にデータそのものが送信されるので、（暗号化や認証があるとはいえ）中身の盗聴や改竄の危険がある。
* Cookieは4キロバイト制限があるので、そんなにデータを入れられない
* Cookieは通信のたびにクライアントとサーバの間を行き来するので、データを増やすと負荷になる
* Cookieのデータを保存しておくと、同じセッションを復元できてしまう（サーバ側から無効化する術がない）

というような問題があるので、ログインが必要になる、あるいは買い物するようなサイトではおすすめできないものです。どうしても使う場合は、最低限

* Cookie内のセッションデータを暗号化する
* Cookie内のデータとして最終更新日時やユーザーエージェントのようなものを持たせて、明らかに異常値なら即座に破棄する

といった処置が必要でしょう。

# セッションデータを別置きにする場合
CookieにはセッションIDだけを保存して、実データはRDBやKVSなどに格納しておくという場合、容量制限などの問題は発生しませんが、それでもいろいろと考えることは多いです。

## セッション固定攻撃とIDの更新
「セッション固定攻撃」といって、攻撃者が適当なセッションIDを取得して、仕込みを行った上で、ターゲットに同じセッションIDを使わせることでセッションを乗っ取るという攻撃手法が存在しますが、PHPでは5.5以前で[でたらめなセッションIDでも受け入れてしまう](http://gihyo.jp/dev/serial/01/php-security/0025)というような問題があります。

それはともかく、このようなセッション固定攻撃、そしてセッションIDが盗まれることへの改善策として、「セッションが続いていてもIDをときどき更新する」ということがあります。このときに、新しいIDを発行した直後に古いIDを無効としてしまうと、Ajaxや画像などでほぼ同時にリクエストが発生した場合に、

1. リソースAへのアクセスが発生（旧セッションID）
2. リソースBへのアクセスが発生（旧セッションID）
3. リソースAへのアクセスがサーバに到着（新セッションIDに切り替え）
4. リソースBへのアクセスがサーバに到着（旧セッションIDはすでに無効化されていてエラー）

というような流れで、セッションが切れてしまうことがあります。さらに一定時間は旧セッションでも受け入れて新セッションに変換するようにしましょう。

## セッションデータのGC
きちっとログアウトすればサーバ側のセッションデータも破棄されますが、ブラウザを閉じる前にすべてのサイトからログアウトする人はそう多くないでしょうし、ログアウト状態でもセッションを発行するようなサイトでは、通常消す方法は用意されていません。

そんな訳で、途中で切れたセッションのデータが残り続けることになってしまいますので、何かしらの方法でGCをかける必要があります。もっとも、Redisではデータ自体に有効期間を指定できるので、正しく使えば期限切れで自動的に消えていきます。RailsのActiveRecordSessionでは残り続けるようです。
Backbone.js1.2 + FuelPHP1.7 + JSONPを使ってみた備忘録


backbone.js(dev1.localhost)からfuelphp+mongodbでつくったrestAPI(dev2.localhost)にリクエストし、jsonpレスポンスをconsole.logに吐き出すサンプルソース
---


## HTML(Backbone.js)

```
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta charset="UTF-8">
 <title>BackboneJS</title>
 <script src="./jquery.js"></script>
 <script src="./underscore.js"></script>
 <script src="./backbone.js"></script>
 <script>
  var MyModel = Backbone.Model.extend({
      // jsonpへのリクエスト ?callback=と書いてfuelphpのjsonpが返すresponse関数を指定する
      urlRoot: 'http://dev2.localhost/example/example.jsonp?callback=response', 
     // jsonpする場合
   sync: function(method, model, options) {
    var params = _.extend({
      type:         'GET',
      dataType:     'jsonp',
      url:   model.url() + '&example=' + model.get('example'),
      processData:  false
    }, options);

    return $.ajax(params);
   },
   parse: function(response) {
    if (response) {
     if (response.success) {
      return {data: response};
     }
    }
   }
  });

  var myModel = new MyModel({example: "123222222"});
  myModel
      .fetch()
      .success(function(response) {
          console.log(response);
      });
 </script>
</head>
<body>

</body>
</html>
```

## fuelphp

```fuel/app/class/controller/example.php
<?php
class Controller_Example extends Controller_Rest
{
  public function get_example()
  {
    $example = Input::get('example');
    $test = 'test';

    $this->response(array(
          'example' => $example,
          'test' => $test,
          ));
  }
}
```

仮に１年後に使うことになっても思い出せるようメモメモ^^;
[小ネタ]ref 付き引数2つのReferenceEquals

#どーいうことか
例えば、以下のようなメソッドがあったとして

```csharp
public static bool Test(ref int x, ref int y)
{
	return ReferenceEquals(x, y);
}
```

こいつをこんな風に呼び出した

```csharp

		static void Main(string[] args)
		{
			var a = 42;
			Console.WriteLine(Test(ref a, ref a));
		}
```

コレが結果どうなるかなってお話。

#結論
は、Falseになる。
値型のReferenceEqualsはFalseに成るのは当たり前と思う反面、例えば、こんな風にしたとして

```csharp

public static bool Test(ref int x, ref int y)
{
	x = 45;
	Console.WriteLine(y);
	Console.WriteLine();
	return ReferenceEquals(x, y);
}

```

ReferenceEqualsがFalseなのに、xの値を変えたら、yも45になっていてちょいと腑に落ちない結果が出てくる。

#何でこーなるのか
理由は、基本に忠実になれば簡単で、ReferenceEquals呼び出すとき、ReferenceEqualsの引数はSystem.Objectなので、当然のことながら、Boxingが発生する。
だと、引数の、”x”も”y”も、デリファレンスされて値をBoxingされることになるので、ReferenceEqualsは不一致、だけど、引数は参照渡しになっていて、しかも、今回の場合、”x”も”y”も同じ変数を参照してるので、“x”の値を変えれば、“y”も一緒に変化する。

以上、重箱の隅をつつくようなTopicでしたｗ
テキストエディタで括弧のブロック範囲を表示（TextMate）

こんにちは。
テキストエディタ [TextMate](https://macromates.com/) (2.0-beta.7.1) を使ってみました。括弧によるブロック範囲を表示する方法を探してみました（２種類）。

- 範囲内にマウスカーソルを置き、コマンドメニューから Edit > Select > Enclosing Typing Pairs を選ぶ。
- 対象範囲（例 ```2{10000001}2```）に対して、括弧の脇の 1 の位置、次に 2 の位置をマウスクリックすると、対の括弧が blink する（黄色）。

なお、テキストエディタではブロック範囲の選択（表示）を行う頻度が高いと思います（下記は [mi](http://www.mimikaki.net) での例）。ユーザインターフェース的には、括弧をマウスでダブルクリックすると選択されるという方法の方が操作が容易と思います。

![mi.jpg](https://qiita-image-store.s3.amazonaws.com/0/54617/7e64b0ac-1be5-478d-f729-b0244971f687.jpeg)
flexboxでflex-wrapを使用する際のマイナーな注意点

flexコンテナの中にflexアイテムを複数行で表示する場合に指定する`flex-wrap: wrap;`ですが、**Android 4.4未満の標準ブラウザでは実装がされていない**ので注意が必要です。
[Can I use / Flexible Box Layout Module](http://caniuse.com/#search=flex)

また、[Modernizrの現行バージョン（現時点で2.8.3）](http://modernizr.com/)でのflexboxの判定はflex-wrapを使用しているようです。
なので、上記のブラウザでは、flexbox自体には対応しているものの、扱いとしてはno-flexbox扱いになります。  
[次期バージョンのModernizr](http://v3.modernizr.com/)ではflexwrapとして項目が独立するようです。
円グラフの描画

# はじめに

Swiftで円グラフの描画をします。
わかりやすいように半円を描画してみます。
重要なのは、開始と終了の角度を指定することです。
開始の角度を0.0、終了の角度をPI(3.14)とします。

```swift:example1.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
                
        let pi = CGFloat(M_PI)
        let start:CGFloat = 0.0 // 開始の角度
        let end :CGFloat = pi // 終了の角度
        
        let path: UIBezierPath = UIBezierPath();
        path.moveToPoint(CGPointMake(self.view.frame.width/2, self.view.frame.height/2))
        path.addArcWithCenter(CGPointMake(self.view.frame.width/2, self.view.frame.height/2), radius: 100, startAngle: start, endAngle: end, clockwise: true) // 円弧
        
        let layer = CAShapeLayer()
        layer.fillColor = UIColor.orangeColor().CGColor
        layer.path = path.CGPath
        
        self.view.layer.addSublayer(layer)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```

実行結果は以下のようになります。

![半円](https://qiita-image-store.s3.amazonaws.com/0/3862/651145e7-460b-f4ef-ab41-0a6edc0714de.jpeg)

`let end :CGFloat = pi * 2.0` にすると円になります。

![円](https://qiita-image-store.s3.amazonaws.com/0/3862/d379a6f2-e5ff-e5fc-fca2-66585170498e.jpeg)

`let end :CGFloat = pi * 2.0` を `let end :CGFloat = 1.0 * pi * 2.0` と考えると、`1.0` を変更すれば角度が変更できることがわかります。
`let end :CGFloat = 0.25 * pi * 2.0` とすると1/4の円を描画できます。

![1/4の円](https://qiita-image-store.s3.amazonaws.com/0/3862/0fac7694-c74f-5b80-dd31-a1dd7d0ef6fb.jpeg)

# 円の描画開始位置を調整する

円の描画開始位置を調整するために、開始と終了の角度からそれぞれ`pi / 2.0`を引きます。

```swift:example2.swift
let start:CGFloat = -1 * pi / 2.0
let end:CGFloat = 0.25 * pi * 2.0 - (pi / 2.0)
```

実行結果は以下のようになります。

![位置調整](https://qiita-image-store.s3.amazonaws.com/0/3862/c7d31fea-5207-ed99-bafb-42c599dcf80c.jpeg)


# 応用

複数の円を組み合わせると、ヘルスケア・フィットネスアプリで見かけるグラフも描画することができます。

![応用](https://qiita-image-store.s3.amazonaws.com/0/3862/24b7cc77-def2-3b16-7df1-eb91586ac07a.jpeg)
ただの16進数と2進数の対応テーブル

|10進数 | 16進数 | 8進数 | 2進数|
|-------|-------|-------|------|
|0 |0x0|000|0b0000|
|1 |0x1|001|0b0001|
|2 |0x2|002|0b0010|
|3 |0x3|003|0b0011|
|4 |0x4|004|0b0100|
|5 |0x5|005|0b0101|
|6 |0x6|006|0b0110|
|7 |0x7|007|0b0111|
|8 |0x8|010|0b1000|
|9 |0x9|011|0b1001|
|10|0xA|012|0b1010|
|11|0xB|013|0b1011|
|12|0xC|014|0b1100|
|13|0xD|015|0b1101|
|14|0xE|016|0b1110|
|15|0xF|017|0b1111|
MongoDBで検索する時にindexを強制する


## やりかた

ヘルパーメソッドの`help()`を使う場合はこう。

```mongo
db.users.find().hint( { age: 1 } )
```

`$hint`オペレータを使う場合はこう。

```mongo
db.users.find()._addSpecial( "$hint", { age : 1 } )
db.users.find( { $query: {}, $hint: { age : 1 } } )
```

上記は、`users`コレクションのすべてのドキュメントを`age`フィールドをindexにして検索するという意味。

`{ age: 1 }`の`1`は昇順という意味、降順にしたい場合は`-1`にすればよいです。

### 本当にそうなっているのか調べたい時

例えば`$explain`オペレータを使って以下のように書けばOK。

```mongo
db.users.find( { $query: {}, $hint: { age : 1 }, $explain: 1 } )
```

## 参考
* [MongoDB Reference: hint()](http://docs.mongodb.org/manual/reference/method/cursor.hint/)
* [MongoDB Reference: $hint](http://docs.mongodb.org/manual/reference/operator/meta/hint/)
MySQLで桁が足りない分を０で埋める


## やり方
lpadという関数を使えばOK。

> [LPAD(str,len,padstr)](https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_lpad)


## 試してみる

```mysql

### テーブルを作る。
mysql> create table demo(id serial primary key, n integer not null);
Query OK, 0 rows affected (0.02 sec)


### とりあえず３件データを挿入。
mysql> insert into demo(n) values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into demo(n) values(2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into demo(n) values(300);
Query OK, 1 row affected (0.00 sec)


### 3桁 0埋め
mysql> select lpad(n, 3, '0') from demo;
+-----------------+
| lpad(n, 3, '0') |
+-----------------+
| 001             |
| 002             |
| 300             |
+-----------------+
3 rows in set (0.00 sec)


### 3桁 'A'埋め
mysql> SELECT lpad(n, 3, 'A') from demo;
+-----------------+
| lpad(n, 3, 'A') |
+-----------------+
| AA1             |
| AA2             |
| 300             |
+-----------------+
3 rows in set (0.00 sec)

```

確かになりました。


## 注意点

文字列が指定した桁より長かったらどうなるのか、、、

ちゃんとこう書いてありました。

> Returns the string str, left-padded with the string padstr to a length of len characters. If str is longer than len, the return value is shortened to len characters.

> ```mysql
> mysql> SELECT LPAD('hi',4,'??');
>         -> '??hi'
> mysql> SELECT LPAD('hi',1,'??');
>         -> 'h'
> ```

やってみましょう。

```mysql
mysql> select lpad(n, 2, 0) from demo;
+---------------+
| lpad(n, 2, 0) |
+---------------+
| 01            |
| 02            |
| 30            |
+---------------+
3 rows in set (0.00 sec)
```

ほんとだ。

## 参考
* [MySQL Reference: LPAD(str,len,padstr)](https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_lpad)
MongoDBのindexの使われ方


コレクションにフィールド `a`, `b`, `c` があるとして、`{ a: 1, b: 1, c: 1 }` と `{ a: 1 }`, `{ b: 1 }`, `{ c: 1 }` というindexがある場合...

```mongo
> db.c1.getIndexes();
[
	{
		"v" : 1,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "test.c1"
	},
	{
		"v" : 1,
		"key" : {
			"a" : 1,
			"b" : 1,
			"c" : 1
		},
		"name" : "a_1_b_1_c_1",
		"ns" : "test.c1"
	},
	{
		"v" : 1,
		"key" : {
			"a" : 1
		},
		"name" : "a_1",
		"ns" : "test.c1"
	},
	{
		"v" : 1,
		"key" : {
			"b" : 1
		},
		"name" : "b_1",
		"ns" : "test.c1"
	},
	{
		"v" : 1,
		"key" : {
			"c" : 1
		},
		"name" : "c_1",
		"ns" : "test.c1"
	}
]
```

## いろんなパターンで試してみる

### find( { a: 1 } ) した場合

```mongo
> db.c1.find( { a: 1 } ).explain();
{
	"cursor" : "BtreeCursor a_1_b_1_c_1",
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 2,
	"nscannedAllPlans" : 2,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 10,
	"indexBounds" : {
		"a" : [
			[
				1,
				1
			]
		],
		"b" : [
			[
				{
					"$minElement" : 1
				},
				{
					"$maxElement" : 1
				}
			]
		],
		"c" : [
			[
				{
					"$minElement" : 1
				},
				{
					"$maxElement" : 1
				}
			]
		]
	},
	"server" : "pellinore.local:27017",
	"filterSet" : false
}
```

`{ a: 1, b: 1, c: 1 }`が使われました。

あ、`{ a: 1 }`じゃなくてそっちなんですね。

### find( { b: 1 } ) した場合

```mongo
> db.c1.find( { b: 1 } ).explain();
{
	"cursor" : "BtreeCursor b_1",
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 1,
	"nscannedAllPlans" : 1,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"b" : [
			[
				1,
				1
			]
		]
	},
	"server" : "pellinore.local:27017",
	"filterSet" : false
}
```

`{ b: 1 }`が使われました。
そんな気がしていました。

### find( { a: 1, b: 1 } ) した場合

```
> db.c1.find( { a: 1, b: 1 } ).explain();
{
	"cursor" : "BtreeCursor b_1",
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 3,
	"nscannedAllPlans" : 3,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"b" : [
			[
				1,
				1
			]
		]
	},
	"server" : "pellinore.local:27017",
	"filterSet" : false
}
```

`{ b: 1 }`が使われました。
`{ a: 1, b: 1, c: 1 }`を使うのかと思っていました。

### find( { b: 1, a: 1 } ) した場合

`{ b: 1 }`が使われました。

### find( { a: 1, c: 1 } ) した場合

`{ c: 1 }`が使われました。

### find( { b: 1, c: 1 } ) した場合

`{ c: 1 }`が使われました。
ぴったり一致するのがないので`{ b: 1 }`か`{ c: 1 }`のどちらかなんでしょう。

### find( { a: 1, b: 1, c: 1 } ) した場合

`{ c: 1 }`が使われました。
な、なぜ！？

### find( { a: 1, c: 1, b: 1 } ) した場合

`{ c: 1 }`が使われました。
う、うーん、、、

### find( { a: 1, b: 1 } ).sort( { c: 1 } ) した場合

`{ a: 1, b: 1, c: 1 }`が使われました。

### find( { b: 1, c: 1 } ).sort( { a: 1 } ) した場合

`{ a: 1, b: 1, c: 1 }`が使われました。

## まとめ

* `{ a: 1 }`は一度も使われていないところを見ると、`{ a: 1 }`より`{ a: 1, b: 1, c: 1 }`のほうが優先されるみたい。
* `{ a: 1, b: 1, c: 1 }`のようにぴったり一致するindexがあっても使ってくれない場合があるみたい。

ちょっとよくわからないので、ドキュメントを読んでから追記予定。

## 参考
MariaDBの環境構築(CentOS7)

# mariadbの環境構築
※centos7を前提としています。
## インストール
<pre>
<code>$sudo yum install -y mariadb-server</code>
</pre>

## サービスの自動起動設定
mariadb-serverパッケージをインストールした時点では、セキュリティを考慮して自動的に起動されるようにはなっていません。mariadbサービスを自動的に開始したい場合には、自動起動の設定を行ってください。
<pre>
<code>$sudo systemctl enable mariadb</code>
</pre>

## 起動
<pre>
<code>$sudo systemctl start mariadb</code>
</pre>


## 初期セットアップ
<pre>
<code>$mysql_secure_installation</code>

最初の質問では、初期パスワードはないので、Enterを押す。次にパスワードは任意のモノを設定。他の質問項目は全てYで大丈夫
</pre>

## ログイン確認

<pre>
<code>mysql -u root -p</code>
</pre>

## 補足：文字コードの変更
<pre>MariaDB[(none)]> ¥s </pre>
¥sと入力して現在の文字コードを確認する
文字コードがlatin1となっているならUTF-8に変更
<pre>server.cnfに文字コードの設定を追加して再起動<br>
<code>character-set-server=utf8</code><br>
を追記</pre>

## 補足：MariaDBサービスの公開
MariaDBサーバを公開するには外部からのMariaDBに関連する通信を許可する必要がある。パケットフィルタリングを設定する。
### ftpを許可
<pre>
<code>#firewall-cmd --permanent --add-service=mysql</code>
</pre>
### 設定を反映
<pre>
<code>#firewall-cmd --reload</code>
</pre>

※データベースはインターネットから直接アクセスできるような環境に設置すべきではないです。プライベートネットワークにしましょう。
SourceTreeで「Couldn't load this key」という画面が出たら


![upload3.png](https://qiita-image-store.s3.amazonaws.com/0/57635/1be42a89-ba06-4b47-00ac-0f14568f3767.png)

WindowsでSourceTreeを使っている時にこんな画面が出る時がある。
**「SourceTree Couldn't load this key」**
とググって英語のページばかり出てきてがっかりした人も少なからずいることだろう。

冷静になって、英語を読めばその通り、何かしらのkeyが読み込めていない。
という訳で、読み込みを行う。

#読み込むには

## Pageantを起動

Pageantの開き方は人それぞれあるが、Windowsの画面右下にある▲マークを一覧の中にPageantのアイコンが出てくるのでそこをクリックするというやり方が一つある。

## keyを追加
![upload5.png](https://qiita-image-store.s3.amazonaws.com/0/57635/bccec38d-b223-42a1-cc3a-54919fc98fc9.png)  

Pageantを開いたら左側の「Add key」があるのでそこでkeyを指定して読み込ませ、「close」
次こそは「SourceTree Couldn't load this key」と表示されないはず。

# 起動時に毎回出るんだけどどうすればいいの？

![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/57635/d8f72714-8955-d04e-361c-68a66ce8c785.png)

どっかのタイミングでkeyの場所を変えたりした可能性がある。
SourceTree画面左上の「ツール」→「オプション」を開くと「全般」タブにこのような画面がある。
ここでkeyの場所を指定すれば次の起動時はその場所を見に行くので次こそは出てこないはず。
CentOS7 SELinux 有効下でのsambaの設定

SELinux有効のままsambaによる書き込み（＝共有先からの読み書き）をONになるよう
設定した時のメモ

①samba をインストール
②smb.confを編集
③SELinuxの設定を変更
`setsebool -P allow_smbd_anon_write=on`
`setsebool -P samba_enable_home_dirs=on`
`setsebool -P samba_share_nfs=on`
`setsebool -P samba_export_all_rw=on`
④ラベル設定
`chcon -R -t public_content_rw_t /home/.../....` < dirは環境に合わせて

これで共有先（私の場合はWindows7 Pro）から読み書き可能になりました。
Git で特定のブランチに直接された変更を調べたいとき

友人に相談されたので。

```
git log --oneline --no-merges --first-parent
```

ただし、普段から merge を上手くやっておかないと、 first-parent が狙い通りの結果を返してくれなくなるので注意が必要。

### オプションの簡単な説明

**oneline**

1行1コミットで表示。見易さのため。

**no-merges**

マージコミットを除外。邪魔なので。

**first-parent**

特定のトピックブランチのコミットを見るためのオプション。
マージの際には複数の親がある状態になるので、マージの手順を間違えると first-parent が想定と異なる親コミットになるため、注意が必要となる。
zsh で git のサブコマンドを一括で alias 登録する


## 概要
例えば `git add` を `gadd` のように alias している人も多いのではないでしょうか。しかし、たくさんあるサブコマンドを alias に登録するのはちょっと面倒です。そこで、自動でやらせてみました。

## ソース
`.zshrc` にコピペしてご利用下さい。どちらか片方でも両方でも良いですが、両方入れておくと便利だと思います。

下記ソースでは、`g` を prefix としてサブコマンドが続く alias を登録しています。例えば、以下のような感じです。

- `gadd` → `git add`
- `gpush` → `git push`
- `gst` → `git st` (`.gitconfig` で `st` の alias が登録されている場合)

prefix を変えたい場合は `alias g` となっている辺りを編集して下さい。

## デフォルトのサブコマンド用
```zsh
if [[ -d $(git --exec-path) ]]; then
  foreach file ($(git --exec-path)/git-*)
    eval "alias g${file/*git-/}='git ${file/*git-/}'"
  end
fi
```

## .gitconfig で alias したサブコマンド用
```zsh
if [[ -f "$HOME/.gitconfig" ]]; then
  eval `\
    sed -e 's/;.*$//' \
        -e 's/[[:space:]]*$//' -e 's/^[[:space:]]*//' < "$HOME/.gitconfig" | \
    sed -n -e "/^\[alias\]/,/^\s*\[/{/^[^;].*\=.*/p;}" | \
    sed -e 's/\([^ =]\+\).*/alias g\1="git \1"/g' \
  `
fi
```

## 参考
- [Linux - bashでiniファイルを読む - Qiita](http://qiita.com/srea/items/28073bc90d65eed0856d)
  - シェルスクリプトから ini 形式の特定セクションを読み込む方法を利用させて頂きました
kibanaのクエリのメモ


kibana4で、
Visualizationで用意されているもの以外で結果を絞りたい時のクエリをメモメモ

* どっかのフィールドの値で絞りたい(name=hoge)
	* name:"hoge"

* andとかorとか使いたい
	* name:"hoge" AND pagenum:1
	* name:"hoge" OR name:"hage"

* wildcard使いたい
	* name:*hoge*
		* 上記は`name`フィールドだけにあたってくれない事もあった
		* 詳細は未調査

* フィールドがあるかないかで絞りたい
	* \_exists_:name
 	* \_missing_:name

* ほにゃほにゃ以上
	* pagenum:>1


詳細はこのへんにのってた
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax
GitHub で Graphviz を使う

GitHub は素で対応してないので、外部サービスを使います。

`![](http://g.gravizo.com/g?` と書いて、Graphviz のコードを続けるだけ。最後に `)` で閉じます。

具体的には、次の Markdown で、下記の図が生成されます。

```
![](http://g.gravizo.com/g?
  digraph G {
    CoreData [shape=box]
    FLMAssetFetchService [shape=box]
    AppDelegate -> FLMAssetFetchService [label="1.start"]
    FLMAssetFetchService -> FLMAssetFetchOperation [label="2.Kick"]
    FLMAssetFetchOperation -> FLMAssetFetchService [label="3.NSNotification(FetchedAsset)"]
    FLMAssetFetchOperation -> FLMFetchedAssetTransformer [label="ALAsset or PHAsset"]
    FLMFetchedAssetTransformer -> FLMAssetFetchOperation [label=FLMFetchedAsset]
    FLMAssetFetchService -> "FLMAssetStoreOperation" [label="4.FetchedAsset"]
    "FLMAssetStoreOperation" -> CoreData [label="5.Commit FLMPhoto, FLMAlbum"]
    "FLMAssetStoreOperation" -> App [label="6.Notify via NSNotification"]
  }
)
```

![](http://g.gravizo.com/g?
  digraph G {
    CoreData [shape=box]
    FLMAssetFetchService [shape=box]
    AppDelegate -> FLMAssetFetchService [label="1.start"]
    FLMAssetFetchService -> FLMAssetFetchOperation [label="2.Kick"]
    FLMAssetFetchOperation -> FLMAssetFetchService [label="3.NSNotification(FetchedAsset)"]
    FLMAssetFetchOperation -> FLMFetchedAssetTransformer [label="ALAsset or PHAsset"]
    FLMFetchedAssetTransformer -> FLMAssetFetchOperation [label=FLMFetchedAsset]
    FLMAssetFetchService -> "FLMAssetStoreOperation" [label="4.FetchedAsset"]
    "FLMAssetStoreOperation" -> CoreData [label="5.Commit FLMPhoto, FLMAlbum"]
    "FLMAssetStoreOperation" -> App [label="6.Notify via NSNotification"]
  }
)

ドキュメント書くときにすごく便利です（\*´ω｀\*）
超シンプルなコマンドラインタイマーを作った

ほぼtirだけど、もっとずっと簡単な、秒数計算して通知センターにテキスト出すだけのやつ。

iTunesを呼ばないで、とも言う。

* [Mac - Mavericks コマンドラインキッチンタイマー「ゴージャスラーメン」オプション - Qiita](http://qiita.com/kaz-utashiro/items/72f9e4c089c46210dec4)

## シェルスクリプト

```timer
#!/bin/bash
# @(#)Commandline timer with notification center
# @(#)Usage: $0 [-h] <time h/m/s>
readonly SCRIPTNAME="$(basename "$0")"
export sec=0
for arg in "$@"; do
  if [[ "$arg" =~ ([0-9]+)([hms]) ]];then
    num=${BASH_REMATCH[1]}
    unit=${BASH_REMATCH[2]}
    case "$unit" in
      h)
        sec=$((sec += num * 3600))
        ;;
      m)
        sec=$((sec += num * 60))
        ;;
      s)
        sec=$((sec += num))
        ;;
    esac
  fi
done
echo "$SCRIPTNAME: After $sec sec"
sleep "$sec"
osascript -e "display notification \"$sec sec elapsed.\" with title \"$SCRIPTNAME\""
```

`timer 1h 10m 30s`のように使う。
15分の3回分を計算できないほど疲れ切っているときは、`timer 15m 15m 15m`で45分カウントできる。

## 常にバックグラウンドで実行するためのラッパースクリプト
* 毎回`timer 10m &`とかやるのかったるいのでシェル関数化。
	 * 別に全部関数で書いてもいいんだけどね。
* 実行ファイルより関数が優先されるので、名前は同じでいい。
* `nohup`で、ターミナルエミュレータのタブを閉じても動くようにした。

```~/.bashrc
timer () { 
 command nohup timer "$*" & 
}
```

### 参考
* [ShellScript - bashでラッパースクリプトを覚えたい - Qiita](http://qiita.com/catfist/items/57327b7352940b1fd4ec)
* [タブを閉じてもログアウトしても実行し続けるジョブにしておく - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20141216/nohup_disown_job)
bashでラッパースクリプトを覚えたい


## ラッパースクリプトとは
あまりズバッと解説したページが見当たらないが。

* [コマンドをラップして使う - いますぐ実践! Linuxシステム管理 / Vol.109](http://www.usupi.org/sysad/109.html)
* [Homebrew-fileのwrapperをスクリプトから関数に変更](http://rcmdnk.github.io/blog/2014/11/15/computer-mac-homebrew-2/)

要するに、**あるシェルコマンドを上書き／置換し、その動作を任意に変更する**ためのスクリプトのことだと思えばよさそう。

これを利用すれば、何らかの理由でコード自体の書き換えができないコマンドの動作を、簡単に変更することができる。

今回は、findコマンドに、~/.gitignoreを利用して特定のパターンを無視するオプションを追加してみたい。

* [Mac - findコマンドで無視リストを利用する - Qiita](http://qiita.com/catfist/items/ef5b6496f5ce7b0abcc2)

## コマンドの種類と優先順位
bashで利用できるコマンドには、以下の5種類がある。

1. エイリアス
1. 予約語
1. 関数
1. シェル組み込みコマンド
1. ファイル

あるコマンドの種類がどれであるかは、`type コマンド名`で判別できる。

また、**コマンドの優先順位**は上記の通りになっている。つまり、同名異種のコマンドが存在する場合、上にあるコマンドが優先して実行される。

また、ファイルに限っては同名同種のコマンドが存在しうる（パスが通った複数のディレクトリに同名の実行可能ファイルが存在する場合）。この場合は環境変数PATHで左側に書かれているディレクトリに存在するファイルが優先される。つまり、左から順番にファイルの存在チェックが行われ、見付かった時点でそれが実行される。

以上より、ラッパースクリプトを作成するには、以下の二つの方法が考えられる。

1. 元となるコマンド名を変更し、同名のラッパースクリプトを作成する
    * 予約語やシェル組み込みコマンドは名称変更できないので、基本的に対ファイルのラッパーでのみ使える方法だと思って良い
2. より優先される同名のラッパースクリプトを作成する
    * 予約語および組み込みコマンドはユーザー側で作成できない

今回の場合、元となるfindコマンドはファイルなので、エイリアス・関数・ファイルのいずれでも置き換えることができる。今回は、ファイルで置き換える。

```bash
$ type find
find is /usr/bin/find
```

前提として、PATH内での優先順位を設定しておく必要がある。以下のようにすると、~/bin/findは、/usr/bin/findより優先して実行される。

```~/.bash_profile
export PATH="$HOME/bin:$PATH"
```

以下のような~/bin/findを作成する。

```find
#!/bin/bash
command find $* $(printf "! -name %s " $(cat ~/.gitignore))
```

オプションを追加するとか言ったがスマンあれは嘘だ。めどいからやめた。

## 参考
* [lsコマンドでフルパス表示をする方法 \| 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2014/10/ls%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e3%83%95%e3%83%ab%e3%83%91%e3%82%b9%e8%a1%a8%e7%a4%ba%e3%82%92%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/)
bundlerのVersionを固定して、実行する



# 問題

他の人が作ったライブラリーのspecを実行したときに、下記のエラーがでて困った。


```
$ bundle install
```

出力結果

```
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/..
Resolving dependencies...
Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
    bundler (~> 1.6.2) ruby

  Current Bundler version:
    bundler (1.9.9)
This Gemfile requires a different version of Bundler.
Perhaps you need to update Bundler by running `gem install bundler`?
Could not find gem 'bundler (~> 1.6.2) ruby in any of the sources
```

# 解決

```
$ gem install bundler -v '1.6.2'
$ bundle _1.6.2_ install
```


## Rspec

```
$ bundle _1.6.2_  exec rspec ./spec
```
Slackと連携させたHubotに毎朝今日の予定をお知らせしてもらう

現在研究室内でSlackを使用しており、せっかくなのでHubotを導入して遊んでいる。
また、研究室内で予定の共有のため、Googleカレンダーで研究室カレンダーを作成し、運用している。

しかしながら、Googleカレンダーに複数のカレンダーを表示させると見辛かったり、そもそもGoogleカレンダーを確認しない等の理由から｢今日ミーティングあったっけ？｣など予定を把握できていないメンバーが発生する。

そこでHubotに毎朝予定を教えてもらうようにした。

# 使用イメージ
- 画像の用に毎朝9:00にHubot(miku)が今日の予定を教えてくれる
- 時間設定があるとき
 - HH:MM:SSにXXX
- ないとき
 - XXX
- これらを\n区切りでつなげた文字列を発言させている
 ![スクリーンショット 2015-05-28 20.16.26.png](https://qiita-image-store.s3.amazonaws.com/0/23755/8058790b-7816-d7b1-b1a2-9af5d05fc58c.png)


# hubot
導入については

- http://qiita.com/misopeso/items/1f418dd02e89234499b3
- http://qiita.com/n0bisuke/items/2448010c0dfaf8a20167

などの記事を参考にした。

また、foreverを使用して常駐させている。
参考: http://qiita.com/n_morioka/items/837967c0e2711198bd74

# Google Calendar API
公式: https://console.developers.google.com/flows/enableapi?apiid=calendar

## 認証情報の取得
- https://console.developers.google.com/start/api?id=calendar
より、アプリケーションを登録する
- ｢新しいクライアントIDを作成｣
 - インストールされてるアプリケーションを選択 → サービス名を入力 → その他を選択
 - 作成後JSONをダウンロードする

ダウンロードしたJSONはこんな感じ

```json
{"installed":{
	"auth_uri":"https://accounts.google.com/o/oauth2/auth",
	"client_secret":"YOUR CLIENT SECRET",
	"token_uri":"https://accounts.google.com/o/oauth2/token",
	"client_email":"",
	"redirect_uris":["urn:ietf:wg:oauth:2.0:oob",
	"oob"],
	"client_x509_cert_url":"",
	"client_id":"YOUR CLIENT ID",
	"auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs"}}
```


## パッケージのインストール
```
$ npm install googleapis --save
$ npm install google-auth-library --save
```

- ついでに時間指定発言のためにcron、タイムゾーン指定のためにtimeもいれます

```
$ npm install cron time --save
```

## CoffeeScript
ソース: https://gist.github.com/tk3fftk/42966c00eeeabf164e4e

- したこと
 - Google公式のNode.js用サンプルをCoffeeScriptにした(それ以外は認証まわりほぼそのまま)。
 - JSONファイルから読み込んでいた認証情報をハードコードした(.coffeeだけで完結させたかったため)。
 - 既存関数の引数にHubot発言用の変数を追加して、カレンダーからの予定取得とともに発言させるようにした。
 - moment.jsを使用するようにしました
- **初回実行時のみ、使いたいカレンダーを持っているGoogleアカウントでログインしてブラウザ上で認証し、トークンを生成する必要があります。**
PHPでHTML中の特定の部分の表示をオン・オフする方法

PHPは主にHTMLの内容を動的に変更するために使われます。

```php
<?php
  $name = 'Taro'; // ここを変えると、HTMLのメッセージが変わる
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
  <h1>Hello <?php echo $name; ?>!</h1>
</body>
</html>
```

```php
<?php 
    $show = 2; // ここを1,2,3と変えると、HTMLの表示が変わる
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <?php if ($show == 1) { ?>
        <h1>Hello One!</h1>
    <?php } ?>
    
    <?php if ($show == 2) { ?>
        <h1>Hello Two!!</h1>
    <?php } ?>
    
    <?php if ($show == 3) { ?>
        <h1>Hello Three!!!</h1>
    <?php } ?>
</body>
</html>
```
mysql コマンドメモ

普段、mysql使わないけど、たまに使う時に全く思い出せないのでメモ。

まずはmysqlにログイン

```
$ mysql
```

必要に応じてidやパスワードも。

```
$ mysql -u root -p
```

終わる時。

```
mysql> quit
```

ヘルプを見る。

```
mysql> help
```

データベース一覧を見る。

```
mysql> show dbs;
```

データベースを選ぶ。

```
mysql> use db_name;
```

テーブル一覧を見る。

```
mysql> show tables;
```

grant構文の権限を持たないユーザーの生成

```
mysql> grant all privileges on DB_NAME.* to USER_NAME@localhost identified by 'PASSWORD';
```

データベースを新しく作る

```
mysql> create database DB_NAME;
```

ユーザーに権限を与える。

```
mysql> grant all on DB_NAME.* to USER_NAME@localhost;
```

ユーザーを確認する。

```
mysql> select user, password from mysql.user;
```
SQLで参加者から一人選ぶくじ引きを行う

# TL;DR

* **手続き型言語には頼りません**
* SQLで参加者からランダムに一人を抽出します。ええそうです、SQLです。

# 環境

今回利用したOracleデータベースのバージョン

```sql:データベースバージョン
SELECT * FROM V$VERSION;

> Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
> PL/SQL Release 11.2.0.4.0 - Production
```

# データ準備

「LIST」という名称のテーブルに参加者を登録します。
今回の登録データは某有名バンドから拝借しました。

```sql:参加者登録.sql
CREATE TABLE LIST AS
	SELECT '川上' AS NM FROM DUAL
	UNION ALL
	SELECT '磯辺' AS NM FROM DUAL
	UNION ALL
	SELECT '白井' AS NM FROM DUAL
	UNION ALL
	SELECT '庄村' AS NM FROM DUAL
;
```

# 実行

ランダムな数を取得する必要があるため`dbms_random.random()`ファンクションを用いて実装します。
また、`ROWNUM`とかバリバリOracle依存してます

```sql:くじ引きSQL本体.sql
SELECT
	LST.NM
FROM
	(	SELECT
			NM
		,	ROWNUM	AS NUM
		FROM
			LIST
	) LST
, (
	SELECT
		TO_NUMBER(ABS(MOD(dbms_random.random(), (SELECT COUNT(*) FROM LIST)))) + 1	AS NUM
	FROM
		DUAL
	WHERE
		ROWNUM = 1
	) RDM
WHERE 1 = 1
AND LST.NUM = RDM.NUM
;
```

検索結果（実行時依存で値が変わります）

|NM|
|--------|
|白井|


# 検証

何となくランダムに動いてくれていそうな気がしますが
ちゃんと散らばっているかどうか検証しましょう。

本来の検証としては悪手な気がしますが、
ランダムな値を生成する処理をconnect byに書き換えて値が散らばっているか確認します。
今回は100万回動かしてみます。

```sql:検証SQL
SELECT
	LST.NM
,	COUNT(*)	AS CNT
FROM
	(	SELECT
			NM
		,	ROWNUM	AS NUM
		FROM
			LIST
	) LST
, (
	SELECT
		TO_NUMBER(ABS(MOD(dbms_random.random(), (SELECT COUNT(*) FROM LIST)))) + 1	AS NUM
	FROM
		DUAL
	CONNECT BY
		LEVEL < 1000000
	) RDM
WHERE 1 = 1
AND LST.NUM = RDM.NUM
GROUP BY
	LST.NM
;
```

* 結果
そこそこ散らばっている気がしますね！

| NM   | CNT    |
|------|--------|
| 川上 | 250266 |
| 白井 | 249057 |
| 庄村 | 250712 |
| 磯辺 | 249964 |


# まとめ

* SQLでもちゃんとくじ引きが出来ました！作ってみればお手軽に実行できるので便利です。
* よいSQLライフを！
rails save! create! update!のバリデーション例外を捕捉する


# Goal

`save!` / `create!` / `update!`メソッドでバリデーションエラー・コールバックエラーを例外ハンドリングできるようにして、なおかつエラー内容を知りたい.
以下のコードはpersonが作られる前に例外発生するため機能しない.

```ruby
##
## 機能しません!!!
##
def create
  @person = Person.create!({ name: "Isaac Newton", age: 35 })
rescue ActiveRecord::RecordInvalid
  pp @person.errors # personに値が代入される前にcreate!は例外を投げるためpersonは空になってしまう
end
```

# Code

validationエラー時に投げられるActiveRecord::RecordInvalidオブジェクトがバリデーションエラー情報を持っているのでこれを使えばいい.
http://api.rubyonrails.org/classes/ActiveRecord/RecordInvalid.html#method-c-new

```ruby
def create
  @person = Person.create!({ name: "Isaac Newton", age: 35 })
rescue ActiveRecord::RecordInvalid => e
  pp e.record.errors
end
```

`save!` / `create!` / `update!`はモデル層のエラーを例外として返し、`save` / `create` / `update`は返り値falseで返す.
モデル層のエラーとはvalidationとcallback. その他のSQLエラーやDB通信エラーなどインフラ層と考えられるエラーは!ありでもなしでも例外として投げられる.
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save-21

||save,create,update|save!,create!,update!|
|:-----------|:------------|:-------------|
|ActiveRecord::RecordInvalid(validation系)                       |return false|例外|
|ActiveRecord::RecordNotSaved(callback系)                        |return false|例外|
|ActiveRecord::RecordNotUnique,ActiveRecord::StatementInvalidなど|例外         |例外|

# Environment

```
% bundle exec rails -v
Rails 4.1.9
```
1時間以内に解けなければプログラマ失格となってしまう5つの問題（5）

ちょっと前に話題になっていた[こちら](https://blog.svpino.com/2015/05/07/five-programming-problems-every-software-engineer-should-be-able-to-solve-in-less-than-1-hour)の問題5をPHPでやってみた。

>Write a program that outputs all possibilities to put + or - or nothing between the numbers 1, 2, ..., 9 (in this order) such that the result is always 100. For example: 1 + 2 + 34 – 5 + 67 – 8 + 9 = 100.

1, 2, ..., 9の順で並んだ数字の間に"＋"か"ー"か"何もナシ"かを入れて、合計が100になる組み合わせを列挙せよ、という問題。

書いてみたコードはこんな感じ

```php
<?php
define('TARGET_SUM',100);
$numbers = array(1,2,3,4,5,6,7,8,9);

function culc($numbers, $siki=""){
    $siki .= array_shift($numbers);
    if(!empty($numbers)){
       culc($numbers, $siki."+");
       culc($numbers, $siki."-");
       culc($numbers, $siki);
    }else{
        eval('$sum='.$siki.';');
        if($sum == TARGET_SUM){
            echo $siki."=".$sum."\n";
        }
    }
}

culc($numbers);
```

再起ですべての式を列挙してevalで評価してます。
関数名が適当なのはご愛嬌ということで。

ちなみに結果はこんな感じ。

```
$ php toi5.php
1+2+3-4+5+6+78+9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12+3-4+5+67+8+9=100
12-3-4+5-6+7+89=100
123+4-5+67-89=100
123+45-67+8-9=100
123-4-5-6-7+8-9=100
123-45-67+89=100
```
odoo8メモ

# CentOS7に素でインストールする手順

## 参考

* [Install Odoo 8 (OpenERP) in CentOS & Red Hat Enterprise Linux - Tech Journey](https://techjourney.net/install-odoo-8-openerp-in-centos-red-hat-enterprise-linux/)

## timezone設定

```bash:
timedatectl set-timezone Asia/Tokyo
```

## パッケージインストール

### odoo8パッケージインストール

```bash:
yum install -y epel-release
```

```bash:
yum install -y wget mailx mutt telnet netstat screen vim logwatch etckeeper git tig
```

```bash:
wget -O /etc/yum.repos.d/odoo.repo \
  https://nightly.odoo.com/8.0/nightly/rpm/odoo.repo
yum install -y odoo ipa-*-fonts
yum install -y http://downloads.sourceforge.net/wkhtmltopdf/wkhtmltox-0.12.2.1_linux-centos7-amd64.rpm
```

```bash:
systemctl enable odoo
systemctl start odoo
```

### postgres設定

```bash:postgres
yum install -y \
  postgresql postgresql-server postgresql-libs
postgresql-setup initdb
systemctl enable postgresql
systemctl start postgresql
```

```bash:
# su - postgres
$ psql
postgres=# CREATE DATABASE odoo;
postgres=# CREATE ROLE odoo WITH CREATEDB;
postgres=# ALTER ROLE odoo WITH LOGIN;
postgres=# ALTER ROLE odoo WITH PASSWORD 'odoo';
postgres=# \q
$ exit
```

```diff:/var/lib/pgsql/data/pg_hba.conf
- host    all             all             127.0.0.1/32            ident
+ host    all             all             127.0.0.1/32            md5
```

```bash:
systemctl restart postgresql
```

## 接続設定

```bash:/etc/odoo/openerp-server.conf
admin_passwd = admin
db_host = localhost
db_port = 5432
db_user = odoo
db_password = odoo
```

## ログの見方

```bash:
journalctl -u odoo -f
```

## この状態でのログインID/pass

http://server-ip:8069/web/login にて以下でログインができる。

* email: admin
* pass: odoo

# postfix

```bash:
yum install -y postfix
systemctl start postfix
systemctl enable postfix
```

# 8069を80番に転送

```apache:/etc/httpd/conf.d/odoo8.conf
<VirtualHost *:80>
	ServerName localhost.localdomain
	ServerAdmin admin@localhost.localdomain
	ProxyPreserveHost On
	ProxyPass / http://127.0.0.1:8069/
	ProxyPassReverse / http://127.0.0.1:8069/
	TransferLog /var/log/httpd/odoo8.log

        <Location /web/login>
                Require host 127.0.0.1
        </Location>
</VirtualHost>
```

* /web/login には 80番からのアクセスでは閲覧できないようにした。

# メール送受信

![連絡先 - Odoo - Mozilla Firefox_009.png](https://qiita-image-store.s3.amazonaws.com/0/25728/28425f51-a378-3852-1231-70d8bdce9f3c.png)


# DBのバックアップ

http://localhost:8069/web/database/manager

# dockerで起動

```bash:
docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo --name db postgres
docker run -p 127.0.0.1:8069:8069 --name odoo --link db:db -t odoo
```


# admin以外で連絡先作成ができない場合

> The requested operation cannot be completed due to security restrictions. 
> Please contact your system administrator.
> (Document type: Partner, Operation: create)

* 設定＞ユーザ＞その他＞ポータルのチェックを外す
* 設定＞ユーザ＞その他＞公開のチェックを外す

これで作成ができる。
Homebrewで永らく `brew update` ができていないのを解決した

## 不具合
今まで `brew update` をすると `/usr/local/share/doc/homebrew` 以下の
ファイルが `unlink` ができないよ！というエラーメッセージが出て
アップデートできてなかった。

## 一時的解決
[前のエントリ](http://qiita.com/marmot1123/items/dc9733b386c89b2862c8)参照。

## 原因
`/usr/local/share/doc/homebrew` のオーナーが `root` になっていた。
ユーザーが違うため `unlink` ができなかったっぽい。

## 根本的解決
`sudo chown <ユーザー名> /usr/local/share/doc/homebrew`

これで直った、はず。とりあえず直後の `brew update` は通った。

## Homebrewの一般的なトラブルシューティング

1. `brew update && brew upgrade`
2. `brew doctor`
3. [HomebrewのTroubleshooting](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Troubleshooting.md)
4. [HomebrewのCommon Issues](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Common-Issues.md)
CSSでfixedなどを使った時、ページスクロールがガタガタするときの対応

よく忘れるのでメモ。


CSS TransformsでCSS Animation/Transitionと組み合わせて、要素を移動させたり、拡大縮小させるとちらつくことがあるらしい。
ちらつく現象はiOSのSafariの専売特許ではなく、PCやスマホに関係なく発生するらしい。

`position: fixed;`を指定したスタイルに以下を追加する。

```
  -webkit-backface-visibility:hidden;
  backface-visibility:hidden;
```

それでも解消されない場合は、

```
  -webkit-backface-visibility:hidden;
  backface-visibility:hidden;
  overflow:hidden
```


ちなみに、`backface-visibility`は全てのブラウザには対応していない。
https://developer.mozilla.org/ja/docs/Web/CSS/backface-visibility
scandirの注意点

phpのscandirは、結果に`.`や`..`が含まれる。
ディレクトリをコピーした後、正しくコピーされたかをコピー元とコピー先の内容のサイズ比較によって確認する場合、`.`や`..`を除いて比較する必要がある。

```php
function getSizeArray($somepath) {
  $sizeArray = array();

  // ディレクトリ内のファイル一覧を入手。.も..もあるよ
  $files = scandir($somepath);
  
  // キー：ファイル名、値：ファイルサイズ
  foreach ($files as $file) {
    $sizeArray[$file] = filesize($somepath.$file);
  }
}
```

```php
.
.
$srcDirSizeArray  = getSizeArray($srcDirpath);
$destDirSizeArray = getSizeArray($destDirpath);

// ダメな例
foreach ($destDirSizeArray as $key => $size) {
  if ($srcDirSizeArray[$key] !== $size) {
    return false;
  }
}
.
.
```

コピー先ディレクトリの親ディレクトリ`..`がコピー元の親ディレクトリと完全に同じにならないならば、ここのサイズがいずれずれることは必然。
こうやって運用環境でしか起こらないバグが生まれていくのか。。
`.`や`..`を含まない`ls -A`相当のscandirはないのかね。

http://php.net/manual/ja/function.scandir.php
Xamarin.AndroidでIOnClickListener.OnClickが呼ばれない

Xamarin.AndroidでボタンなどのClickイベントは基本的にイベントハンドラを渡せばいいのですが、どうしても```SetOnClickListener```を使わなければいけないとき ( ex. ToolBarの```SetNavigationOnClickListener``` ) 、IOnClickListenerを実装したクラスを渡してもOnClickが呼ばれないことがあります。

このときは下記のようにIOnClickListenerのほかにJava.Lang.Objectを継承してあげるとOnClickが呼ばれるようになります。

```csharp
public class HogeHogeClickListener : Java.Lang.Object, View.IOnClickListener
{
    public void OnClick(View v)
    {
        DoSomething();
    }
}
```
とりあえずPostfixでさくっとメール受信したいだけのメモ。と迷惑メールがうっさいのでドメイン拒否するときのメモ,自分備忘録

# さくっとメール受信したいだけのメモ
立て続けにSSL証明書を取る必要があって認証メール受信したいだけなのに、結局色々とMTAの設定＆調整しちゃいそうで調べた自分の備忘録。しかも３回目は、変なとこでドはまりしたのでそいつもメモしときます。調査結果ね。

# ちなみにAWSの場合、送信申請が必要らしい
そりゃたしかにそーだわな。って思います。amazonすげー

> [SESが使いものにならないのでAWS上にPostfixでメールサーバーを構築してみる](http://qiita.com/takahirono7/items/0e1a1dce69e7d38d3cf8)

## 過去にがんばってた自分めも
なんだか頑張っていた自分がいた（笑）。いまうざいメール多いので止めてますけどｗ

> [Postfixの設定の巻](http://www.sea-bird.org/pukiwiki/index.php?Postfix%A4%CE%C0%DF%C4%EA%A4%CE%B4%AC)

## さくっと受信
DNSあたりは、ちゃんと整備してあることが前提ということはおいておきます。
下記サイトの設定方法がシンプルでわかりやすいですｗ

> [AWS上のpostfixでメールを受信してみる](https://github.com/mechamogera/MyTips/wiki/AWS%E4%B8%8A%E3%81%AEpostfix%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E5%8F%97%E4%BF%A1%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)

## すこしはまるあたり
タイポしたりなんだか少しはまると出るやつの対処法

> [25番ポートに接続しようとして"Connection refused"の対処法](http://dqn.sakusakutto.jp/2014/10/posftix_smtp_25_connection_refused.html)
> [postfix： 自ドメイン宛てにメールを送信した時に「cannot open file: Is a directory」とエラーメールが返ってきた場合の対応](http://ctrltf.com/postfix-send-error-correspondence-167.html)
> [No.6846　postfixで転送メールサーバのエラーについて](http://www.aconus.com/~oyaji/bbs/past/0011/B0006846.html)

## postmaster でメールが受信できない
あれ？なぜ、postmaster でメールが受信できないと思ったらalias でしたｗ

> [infoユーザー宛のメールが受信できない](http://qiita.com/is0me/items/b466d44b67a5a1c665a5)

## うざいメールの対応

> [Postfixで送信者が特定のドメインのメールをサーバーで拒否する](http://www.ipentec.com/document/document.aspx?page=linux-postfix-reject-mail-by-sender-domain)
> [特定のドメインのみ受信しそれ以外は別アドレスに転送する](http://infraref.blogspot.jp/2011/06/postfix.html)
dockerでmysqlを使う

この記事はもう随分古いので注意してください。
mysql8.0のdocker-comose.ymlを作成したので新しいmysqlを使う方はそちらを参照してください。

[dockerでmysql8を使う](https://qiita.com/astrsk_hori/items/63e9f2c5d4bdb57515c8)

### ### ここから古いです。 ### ###

公式のmysqlを使えるようにするのにハマったのでメモ。
※Dockerのインストールが古かったので新しいリンクに変更しました。

## Docker for mac install

http://qiita.com/astrsk_hori/items/a8bc8f3883d5b76c51d3

## 公式のmysqlイメージを使う

https://github.com/docker-library/docs/tree/master/mysql

```bash
docker pull mysql
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

# 接続確認 passwordはmysqlになります。
mysql -h $(boot2docker ip) -uroot -p
```

上記でいきなり使える。

### コンテナに接続したい場合。

CONTAINER IDを確認

```bash
docker ps
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                    NAMES
e5edc5732d78        mysql:latest         "/entrypoint.sh mysq   49 minutes ago      Up 33 minutes       0.0.0.0:3306->3306/tcp   mysql

```

`docker exec` コマンドで接続。

```bash
$ docker exec -it e5edc5732d78 bash

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

## 公式のmysqlを永続化して使う

### まず先ほど作成したコンテナの破棄。

```bash
$ docker ps
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                    NAMES
e5edc5732d78        mysql:latest         "/entrypoint.sh mysq   49 minutes ago      Up 33 minutes       0.0.0.0:3306->3306/tcp   mysql

# 停止
docker stop e5edc5732d78

# 削除
docker rm e5edc5732d78
```


### データボリュームコンテナの作成

```bash
docker pull busybox

# 永続化のためのデータ領域を作成
docker run -v /var/lib/mysql --name mysql_data busybox
```

### マウントして起動。

```bash
docker run --volumes-from mysql_data --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
```

以上で永続化終わり。簡単。だけどハマった。。。

### 永続化確認

1. database 作成
2. docker stop CONTAINER_ID #mysqlのコンテナID
3. docker rm CONTAINER_ID #mysqlのコンテナID
4. もう一回docker run
5. docker exec -it CONTAINER_ID bash #再作成したmysqlのコンテナID
6. mysqlアクセスして最初に作成したDBがあればOK

## おまけ

### アプリ用のコンテナから先ほど作成したmysqlコンテナに接続する。

```bash
docker run --name NAME -h HOSTNAME --volumes-from mysql_data --link mysql:ALIAS_MYSQL -i -t -d HOGE_APP
```

今、立ち上げたコンテナからmysqlコンテナに繋ぐには以下。

```bash
mysql -h ALIAS_MYSQL -uroot -p
```

大文字の箇所を適宜変更してください。

### docker commands

`docker build` イメージを作成。
`docker run` コンテナを作成。
`docker start` コンテナを起動。
`docker stop` コンテナを停止。
`docker rm` コンテナを削除。
`docker rmi` イメージを削除。
`docker ps` コンテナの確認。
Fluxの概念図を分かりやすくしてみた

以下は、Fluxの説明で頻繁に引用される図です。

<a href="https://www.flickr.com/photos/128994071@N07/18164101311" title="flux-diagram by Yuki Sov, on Flickr"><img src="https://c1.staticflickr.com/9/8786/18164101311_7cbd1d9670_z.jpg" width="640" height="319" alt="flux-diagram"></a>

データの流れが一方向になっているのは分かりますが、それぞれのオブジェクトの関係がちょっと分かりづらいと思います。
そこで、各オブジェクトの関係がどうなっているか分かるように書き直してみました。以下の図です。

<a href="https://www.flickr.com/photos/128994071@N07/18216799205" title="flux-diagram-custom-006 by Yuki Sov, on Flickr"><img src="https://c1.staticflickr.com/9/8790/18216799205_fdf5b3d922_z.jpg" width="640" height="544" alt="flux-diagram-custom-006"></a>

\* Web API と Web API Utils は省略しています。
\* Store と View はChangeEvent経由でいろいろつながってますが、実際は関連するものだけつながっています。

これから Fluxを理解しようとしている方は、この図を見ながら勉強すると分かりやすいんじゃないでしょうか。


こちらではもう少し説明を加えています。→ [Fluxアーキテクチャのメモ](http://www.pupha.net/archives/3218/)
ChefのService Resourceで起動スクリプトのstatusコマンドに返り値が無くてうまく動かない時の対処法

# 説明
## 概要
ChefのService Resourceでは、冪等性を担保するために`/sbin/service <service-name> status`みたいなコマンドを使って現在のServiceの状態を取得する場合があります。[^1]

具体的には、コマンドの終了コードが`0`だと起動、それ以外だと未起動と判定されます。

となると、ここでその`status`コマンドが終了コードを返さなかったり、おかしなコードを返すことがうまく動かないということになるのですが、そういったケースはたまにあります。特にRHELファミリー。。。[^2]

## 具体的にどういった時に起きうるのか
デフォルトでは、起動中のプロセスの中から指定されたサービス名を探して判定されますが、以下の様な記述をしていると`status`コマンドが使用されます。

```rb
service "hoge" do
  supports :status => true
end
```

Webのサンプルコードなんかでも指定しているものが散見されるので、特に意識せず指定しちゃっている場合もあるかもしれません。

ただし、RHELファミリーに限ってはデフォルトで`:status => true`になっています（なんでや！）[^3]

# 対処法
## 終了コードはちゃんと返すよう起動スクリプトを修正する
一番真っ当な対処法ですね。
ですが、パッケージインストールしたものだったりすると、パッチや修正依頼を送って待つにも時間かかるし
面倒だしで現実的ではないこともあります。

## `status`コマンドを使わせない
以下のように書きましょう。

```rb
service "hoge" do
  supports :status => false
end
```

## 起動確認用のコマンドを置き換える
例えば、デフォルトの挙動だとサービス名が含まれるプロセスが別にあったりする[^4]とうまく動かないことが予想されます。そういった場合に、起動確認用のコマンドを置き換えることができます。

```rb
service "hoge" do
  status_command 'hoge piyo'
end
```

# 最後に
この件に関しては、対処法もそうなんですが、そもそもとして以下を気をつけたほうが良いと思います。

- `suports`を指定する場合、本当にそれが使えるコマンドか確認する
- RHELファミリーに限ってはデフォルトで`:status => true`

ということで、久々にけっこうハマったので書き留めておきました。


[^1]: https://github.com/chef/chef/blob/master/lib/chef/provider/service/simple.rb の`determine_current_status`メソッド参照
[^2]: RedHatとかCentOSとかAmazon Linuxとか
[^3]: https://docs.chef.io/resource_service.html （Attribute -> supportsの最後の方に「Default value: { :restart => false, :reload => false, :status => false } for all platforms (except for the Red Hat platform family, which defaults to { :restart => false, :reload => false, :status => true }.)」って書いてる・・・）
[^4]: マッチに使用するservice_nameを厳密に指定するという方法もあります
Meteor で作った iOS アプリで src="gap://ready" の iframe タグが大量発生する


[Meteor](https://www.meteor.com/) 最新版の 1.1.0.2 (2015/5/28現在) で作ったiOSアプリをデバッグしているときに、以下の iframe タグが大量発生しているのを発見しました。

```html
<iframe src="gap://ready" style="display: none;">...</iframe>
```

こんな感じです↓

![meteor-cordova-ios-bug.png](https://qiita-image-store.s3.amazonaws.com/0/24450/12cde37c-8880-e6bc-0245-c288141118c3.png "meteor-cordova-ios-bug.png")


いろいろ調べた結果、これは Meteor 1.1.0.2 の内部で使用している [Cordova iOS](https://github.com/apache/cordova-ios) 3.7.0 のバグのようです。

- 参考:[[CB-8002] Creating a new div for every Js -> Native exec() call - ASF JIRA](https://issues.apache.org/jira/browse/CB-8002)

このバグは Cordova iOS 3.8.0 で修正されているようなので、Meteor 側で Cordova iOS がバージョンアップされるのを待ちましょう。

# 参考

- [CB-8002] Creating a new div for every Js -> Native exec() call - ASF JIRA<br>https://issues.apache.org/jira/browse/CB-8002