OmniAICreator/Qiita-1.07M huggingface dataset:
gem update で SSL エラー (Windows)

例によって Firefox のアップデートで Selenium Webdriver 周りでエラーが出るようになったので、gem update を久しぶりにしようとしたところ表題のエラーが発生していました。

```sh

>gem update
Updating installed gems
ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
    SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

>gem --version
2.4.1 ※Windows だと 2.4 以上はバグがあるらしいのでそのうち対応せねば…
```

証明書をひとつ入れればよいようなので、下記手順にしたがって解決。

[Workaround RubyGems' SSL errors on Ruby for Windows (RubyInstaller)](
https://gist.github.com/luislavena/f064211759ee0f806c88)
便利系ワンライナー

たまに使うけど忘れがちなワンライナーをメモ代わりに残しておく。
随時更新。

[実行環境]
・Linux
・bash
・awk

## 圧縮されたログの合計サイズを出力する

```bash
$ du -s ./access_log-*.gz | awk '{total+=$1} END {print total}'
```

## ログの特定カラムの桁数TOP10を出す

ログをRDBのテーブルに突っ込みたいけど桁数が読めない、という場合に便利

```bash
# 5番目のカラムの桁数が知りたい場合(ファイルは空白orタブ区切りの前提)
$ cat access_log | awk '{len=length($5);print len}' | sort -nr | head -10
```

## MySQLのセッションのコマンド別件数（Query,Sleepなど）を知る

QueryはStateによって状態が大きく違うので、別々に集計する。

```bash
$ mysql -uroot -p -B -N -e 'show processlist' | awk -F "\t" '{if($5=="Query") {print "Query:"$7} else {print $5}}'| sort | uniq -c
```
VirtualBoxをGUI無しで起動するコマンド

個人的な小規模アプリ開発のJenkinsにEC2やさくらVPS借りるのってもったいないですよね。
私はMacbookProのVirtualBoxでJenkinsを走らせてます。
Jenkinsはhttp://:8080やsshでつながるのでウィンドウって必要ない感じですね。
こうした時表示される邪魔なVirtualBoxのウィンドウを消す方法です。

VM_NAMEを指定して起動`VBoxManage startvm YOUR_VM_NAME --type headless`
ちなみに起動可能なVM＿NAMEを一覧するには`VBoxManage list vms`
Windowsに python 2.x を インストールせずに使う

[![CC-BY-SA-4.0](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 2015-03-03 by matobaa+qiita@gmail.com

Windows用の python は "just for me"でインストールしたフォルダをファイルサーバにコピーしておけば、インストールしてない人でも python.exe に .py をドロップすれば使えちゃうのがけっこう便利。

管理者権限がないところでも展開するだけで動く。便利。

いろいろ入ったpythonをUSBで持ち運ぶなら、こっちで ⇒ http://portablepython.com/
jQuery Event Delegation の代替えを考える


## jQuery Event Delegationとは？

```js
$('body').on('click', 'button', handleButtonClicks)

function handleButtonClicks(event) {
    console.log(event.target.id, 'button clicked!')
}
```

みたいなやつです。
[動くサンプル](http://jsfiddle.net/cvt43or2/)

親要素へのイベントハンドラで、子要素のイベントが拾えます。

### 何が嬉しいのか？
例えば、Todoリストのdoneチェックボックスを考えてみましょう。

#### DOM要素それぞれにイベントハンドラを設定すると
Todoの項目を追加して、DOM要素を増やすと
DOM要素を増やすたびにイベントハンドラを設定します。

#### Event Delegationを使うと
最初に一回だけ親要素にイベントハンドラを設定します。
子要素が増えても同じイベントハンドラで対応します。

詳しいことは[Understanding Event Delegation | jQuery Learning Center](http://learn.jquery.com/events/event-delegation/)を読んでください。

## jQueryに代わるもの
[Finacial Times](http://www.ft.com/)の[FT Labs](http://labs.ft.com/)製の
[ftlabs/ftdomdelegate](https://github.com/ftlabs/ftdomdelegate)というライブラリがあります。

こんな風に使います

```html
<script src="http://wzrd.in/standalone/dom-delegate@latest"></script>
<script>
    document.addEventListener("DOMContentLoaded", main)
    
    function main() {
        domDelegate(document.body).on('click', 'button', handleButtonClicks)
        document.body.innerHTML = '<button>ボタン</button>'
    }

    function handleButtonClicks(event) {
        console.log('click', event)
    }
</script>
```

[動くサンプル](http://jsfiddle.net/rpLL9xup/)

## Event Delegationを実現する仕組み
[ソース](https://github.com/ftlabs/ftdomdelegate/blob/master/lib/delegate.js#L371)を見ると[Element.matches API](https://developer.mozilla.org/en-US/docs/Web/API/Element/matches)を使っています。

matchesの具体的な使い方は、以下のブログが詳しいです。
[Selectors APIのmatchesSelectorと、動的なページでのイベント処理 - 素人がプログラミングを勉強していたブログ](http://javascripter.hatenablog.com/entry/20091018/1255889085)
[Objective-C] UIScrollView／UITableViewのcontentOffsetがずれるときがある



iOS7から、`UIScrollView`を継承したViewをViewControllerのviewの最初のviewに設定しているとviewのinsetsを操作して自動的に位置を補正するようになりました。

これは、iOS7からナビゲーションバーの下も表示領域として確保され、実質フルスクリーンが表示領域となるための措置です。

ただこの補正が自動的に行われるため、実装内容によっては意図した挙動にならず混乱することがあります。


## scrollView.contentOffsetを使わない

今回色々実装していて、`UIScrollView`の`contentOffset`を使って、スクロール位置に応じてごにょごにょ実装していたのですが、これだとバックグラウンドから復帰した際などに自動的に補正されて意図した値が取れないことがありました。

最初は`NSNotificationCenter`の`UIApplicationWillEnterForeGroundNotification`や`UIApplicationDidEnterBackgroundNotification`を使って対処しようとしたんですが、色々変化して難しかったのでやめました。

**結論としては `scrollView.contentOffset` を使わず `bounds.origin.y + contentInset.top` を使う、です。**

ログを出力してみて気づいたのが、`UIScrollView`が画面上端にある場合は`bounds.origin.y`が`-64`、`contentInset.top`が`64`に設定されていていました。

`contentOffset.y`は通常時は`-64`ですが、`contentOffset.y`が少しでもずれているときにバックグラウンド→フォアグラウンドと遷移すると、自動的に位置が補正されるようです。
おそらく、自動的にinsetsを補正する機能が動いているためと思われます。

一方で、`bounds.origin.y + contentInset.top`の値は、`UIScrollView`が画面上部にある場合は常に`0`となります。
なので、この値をスクロール位置として利用することでどんな状態でも適切に値を参照することができるようになりました。


## console出力

実際に出力したconsoleのログを参考のため載せておきます。


### 通常時

```console
po self.tableView

<TableView: 0x14887c00; baseClass = UITableView; frame = (0 0; 320 519); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x14513740>; layer = <CALayer: 0x145d1b00>; contentOffset: {0, -64}>

---------------------

po self.tableView.contentInset

 (top = 64, left = 0, bottom = 0, right = 0)

-----------------------------

po (CGRect)[self.tableView bounds]

origin=(x=0, y=-64) size=(width=320, height=519)
 {
  (x=0, y=-64)
 {
    0
    -64
  }
  (width=320, height=519)
 {
    320
    519
  }
}
```

### ずれた状態

```console
po self.tableView

<TableView: 0x14887c00; baseClass = UITableView; frame = (0 0; 320 519); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x14513740>; layer = <CALayer: 0x145d1b00>; contentOffset: {0, 0}>

------------------------------------------------------------------

po self.tableView.contentInset

 (top = 0, left = 0, bottom = 0, right = 0)

------------------------------------------------------------------

po (CGRect)[self.tableView bounds]

origin=(x=0, y=0) size=(width=320, height=519)
 {
  (x=0, y=0)
 {
    0
    0
  }
  (width=320, height=519)
 {
    320
    519
  }
}
```
React.js + ES6 で超簡単なサンプルを作った

React.js 最近良く名前を見るので始めた。

React.js v0.13RC では，[ECMAScript6風のclass文などに対応した](http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html)ので，ES6の構文を使った簡単なサンプルを作成．

## 作成したサンプル
`Count Up!`ボタンを押すと上の数値が増えるだけ
![counter.gif](https://qiita-image-store.s3.amazonaws.com/0/10713/df1c95e1-eaae-3f57-8886-d4f96694e2e1.gif)

作成したファイルは__2つだけ__

- index.html
- app.jsx

## index.html
- React.js本体と、JSX変換スクリプトを読み込む
- ES6風記述を有効にするために`type="text/jsx;harmony=true"`とする

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <!-- React.js, JSX変換, アプリの3つを読み込む -->
    <script src="http://fb.me/react-0.13.0-rc1.min.js"></script>
    <script src="http://fb.me/JSXTransformer-0.13.0-rc1.js"></script>
    <script src="app.jsx" type="text/jsx;harmony=true"></script>
</head>
<body>

<div id="app-container"></div>

</body>
</html>
```

## app.jsx
- ES6の`class`構文を利用してComponentを作る
- 状態はすべて`this.state`に閉じ込める。変更するときは直接ではなく、`this.setState`を使う
- `onClick`などのDOMイベントからメソッドを呼び出すときは最後に`.bind(this)`をつける


```js
class Counter extends React.Component {
    constructor() {
        this.state = {
            count: 0
        };
    }

    onClick() {
        this.setState({
            count: this.state.count + 1
        });
    }

    render() {
        return (
            <div>
                <h1>{this.state.count}</h1>
                <button onClick={this.onClick.bind(this)}>Count Up!</button>
            </div>
        )
    }
}

React.render(
    <Counter />,
    document.getElementById('app-container')
);
```
Analog input goes to processing graph.

analog input to serial

```
const int SENSOR = A0;
const int LED = 13;

int val = 0;
int max = 0;

void setup() {
  Serial.begin(9600);
  pinMode(SENSOR, INPUT);
  pinMode(LED, OUTPUT);
}

void loop() {
  val = analogRead(SENSOR);

  if (val > max) {
    max = val;
  }
  
  String space = " ";

  Serial.println(val);

  if (val > 1) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
  
  delay(10);

}
```

serial input to graph

```


import processing.serial.*;

Serial myPort;

int xPos = 1;
float max = 0;
float cur = 0;

void setup() {
  size(720, 240);
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[2], 9600);
  myPort.bufferUntil('\n');
  background(58,179,254);
}

void draw() {
}

void serialEvent(Serial myPort) {
  String inString = myPort.readStringUntil('\n');
  if (inString != null) {
    inString = trim(inString);
    float inByte = float(inString);
    inByte = map(inByte, 0, 50, 0, height);
    
    stroke(13,0,192);
    line(xPos, height, xPos, height - inByte);
    
    if (xPos >= width) {
      xPos = 0;
      max = 0;
      background(58,179,254);
    } else {
      xPos++;
    }
    
    if (inByte > max) {
      stroke(58,179,254);
      line(0, height - max, width, height - max);
      max = inByte;
      cur = height - inByte;
      stroke(13,0,192);
      line(0, cur, width, cur);
    } 
  }
}
```
boot2dockerでボリューム(-v)使用時に注意すべき事があった

# 環境の説明

FuelPHPで日本語ファイル名の取り扱いがあって、boot2dockerでPHPのコンテナを立てて-vオプションを利用してFuelプロジェクトをマウントしていた。

ちなみに自分は/Usersとは別のマウントポイントを使っていて

```
$ boot2docker up
$ boot2docker ssh "sudo mkdir /docker-volumes"
$ boot2docker ssh "sudo mount -t vboxsf -o uid=33,gid=33, docker-volumes /docker-volumes"
```

こんな感じ

docker-composeからはこのように利用中

```
app:
    build: app/.
    ports:
     - "80"
    environment:
       SERVICE_80_NAME: http
       SERVICE_NAME: XXXXXXX
       SERVICE_TAGS: development
    volumes:
     - "/docker-volumes/XXXXXXXXXX:/var/www/fuelphp"
```

ベースコンテナがUbuntuばかりなのでwww-data(uid,gid=33)さんなマウントポイントを使いたかっただけ。

# この環境で起こったこと

日本語のファイル名(UTF-8)でファイルを書き込み、そのファイルを読もうとしたところ、ファイルが無いと言われる。

おかしいな？と思い、docker execでコンテナ内に入ってマウントしているプロジェクトを見てみると、なんとファイルが無い。

そんな馬鹿な？！とホスト(Mac)からそのディレクトリを見てみると、文字化けしている状況でファイルが発見された。

* コンテナ内からは日本語ファイル名は見えない
* ホストからは文字化けたファイルが見える
* コンテナ内のマウント範囲外では日本語ファイル名に問題が無い
* ホストのマウント元でtouchした日本語ファイル名にも問題が無い
* コンテナ内のマウント範囲で日本語ファイル名でtouchすると消えた

おや？

# 答え：iocharset=utf8

```
boot2docker ssh "sudo umount /docker-volumes"
boot2docker ssh "sudo mount -t vboxsf -o uid=33,gid=33,iocharset=utf8 docker-volumes /docker-volumes"
```

このようにマウントし直して、問題は解決した。

なかなか気づきにくい所攻めてきてくれたなぁ
２時間ほど悩んでしまったよ。 トホホ。
Macの複数フォルダを一気にリソースフォーク付きでzipする


ワンライナー。
```find . -mindepth 1 -maxdepth 1 -type d -exec ditto -c -k --sequesterRsrc --keepParent "{}" "{}.zip" \;```


解説。
① ditto はMacの固有コマンドで、ファイルのコピーやアーカイブの作成・展開などをするコマンド。
右クリックの「圧縮」でzipするのと同じ操作をコマンドでやるならば

```ditto -c -k --sequesterRsrc --keepParent src_directory archive.zip```

[This manual page is for Mac OS X version 10.9](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ditto.1.html)

② findコマンドは -exec オプションで、後ろに書いたコマンドを実行できる。検索結果は {} に渡る。
```find . -mindepth 1 -maxdepth 1 -type d -exec echo {} \;``` 

この2つを組み合わせる。

----
-exec は 複数書いてもいいので、zipした後元フォルダを削除するならば、

```find . -mindepth 1 -maxdepth 1 -type d -exec ditto -c -k --sequesterRsrc --keepParent "{}" "{}.zip" \; -exec rm -rf "{}" \;```
という風にすればできる。
「 JS のメソッドの貸し借り (apply 使うやつ ) 」を Python でやるには

## 前提、 JavaScript では

JavaScript では、 ```apply``` を通して、 function 内の ```this``` の文脈を変更することができることは有名。

言うなれば、他のクラスのメソッドを実行時に利用することができる。

ぐぐってみたところ、英語では borrowing method などと呼ばれてるようだ。文字通り「借りる」ということか。

```js:例
function A () {
  this.value = 1;
}


function B () {
  this.value = 2;
}


B.prototype.show = function show () {
  console.log(this.value);
};


var a = A();
B.prototype.show.apply(a);  // まるで「 B のメソッドである show を a が借りて使ってる」よう
```

```text:実行結果
1
```

## 本題、 Python で

今日、久しぶりにあった人と食事をしながら、「これを Python で同じことができるか？」という話になった。
Python だと ```self``` を実行時に変えたい。結論から言うと「できる」。
その場では説明できなかったので、 Qiita に書くことにした。

```py3:Pythonで
class A(object):

    def __init__(self):
        self.value = 1


class B(object):

    def __init__(self):
        self.value = 2

    def show(self):
        print(self.value)


a = A()
B.__dict__['show'](a)
```

```text:実行結果
1
```

## まとめ

Python では ```__dict__``` を通していろいろ参照できるという話でした。

ただ、これを使いすぎると黒魔術になるので、普段使いはやめましょう。
FactoryBot (旧FactoryGirl) の sequence と .next

だいたい

```ruby
sequence(:name){|n| "name_#{n}"}
```
っていう形のサンプルコードが多いんだけど、実はこれは

```ruby
sequence(:name, "name_1")
```
と書ける。ブロックを渡さずに第二引数を渡すと、 ```.next``` が呼ばれるようになっているのだ。
そして、(これは ruby 自体の機能だが) String#next には以下のように末尾の数値を増やす機能があるのだ。

```ruby
> "name_1".next
 => "name_2"
> "name_9".next
 => "name_10"
```

これは便利！と日本語で使おうとすると、

```ruby
> 'テスト_1'.next
 => "テスト_2"
> 'テスト_9'.next
 => "テスド_0"
```
残念。うまくいかないのだった。「ト」の次で「ド」になってるのが健気でかわいい。
どうやら、 **英字 + 記号 + 数字** が、数字だけインクリメントの発動ルールのようだ。
記号はスペースもアリで、複数文字でも良い。最初の英字は無しでもいけるけど、英字以外があると駄目みたい。
('#9'.next == '#10' だったのでもしや？と思ったが、 'テスト#9' だとやはり駄目でがっかり。)

もちろん、末尾の数字にこだわらず、ユニークならなんでもいいぜ！という豪快なアナタは

```ruby
sequence(:name, "太郎")
```
とでもすれば、太郎に続いて "太郏" "太郐" "太郑" "太郒" と、一見太郎っぽいけどよく見ると違う名前に次々出会うことが出来る。
漢字はさすがにアレなので、

```ruby
sequence(:name, "ゆりあ")
```
あたりにしておくと、10個に1つくらいの高頻度で名前らしい名前に出会えていいかもしれない。


``.next`` に対応してれば何でもいいので、``Date.today`` もイケる。

```ruby
sequence(:reserve_on, Date.today)
```
こうすれば、今日、明日、明後日、という感じで順に生成される。

あとちょっと面白いのは ```cycle``` を使って

```ruby
sequence(:color, %w[red green blue].cycle)
```
とすると、 red green blue がこの順番で延々繰り返される。

```ruby
sequence(:color){ %w[red green blue].sample }
```
てのがわりとよくやる手だけど、cycle だと出方が均等になるので便利なことも。

ところで、 **cycle の sequence 便利じゃん、といってテストじゃない本体のほうで使うと production 環境で死ぬ** ので気をつけましょう。
しかも ```FiberError: fiber called across threads``` という見慣れないエラーだし development では再現しないので知らないと本当にハマる。
(より具体的には unicorn や passenger のようなマルチスレッド系のサーバで問題が起きます)
このエラーなんなのかというと、cycle が返す Iterator インスタンスを FactoryGirl が内部に保持していて、 Iterator は Fiber で実装されていて、 ruby はスレッドを跨いで Fiber を使用することを禁じているから。いやあ、いい勉強になりました。
wordpressでアップロード画像サイズを制限する方法

ダッシュボードの「設定」ー＞「メディア」で設定したサムネイルのサイズより小さい画像をアップしようとするとエラーメッセージを吐いて、アップロードをキャンセルさせたいときに使える。マルチアップロードの時でもOK.

キモは、WPにビルトインされているWP_Image_Editor_GDクラスを画像のサイズ判定に使うのと、wp_handle_upload_prefilter フックを使うこと。

以下のコードをfunctions.phpあたりに実装すればOK。


```php:functions.php

require_once ABSPATH . WPINC . "/class-wp-image-editor.php";
require_once ABSPATH . WPINC . "/class-wp-image-editor-gd.php";

add_filter("wp_handle_upload_prefilter", "cancel_upload_for_small_image");
function cancel_upload_for_small_image($file){ 
  $opt_thumbnail= array(
    "width"=> intval(get_option('thumbnail_size_w')),
    "height"=> intval(get_option('thumbnail_size_h'))
  );
  if(!preg_match("/^image\/png|jpe?g|gif$/", $file["type"])){
    //画像でないのでエラーメッセージを吐く
    $file["error"]= "this is not an image. png, or jpeg, or gif is available.";
  }
  
  $gd= new WP_Image_Editor_GD($file["tmp_name"]);
  $gd->load();
  $size= $gd->get_size();
  if($size["width"] < $opt_thumbnail["width"]|| $size["height"] < $opt_thumbnail["height"]){
    //ファイルサイズが小さいのでエラーメッセージを吐く
    $file["error"]= "Image must larger than {$opt_thumbnail["width"]} x {$opt_thumbnail["height"]}";
  }

  return $file;
}
```
[UIView beginAnimations:context]でcontextに任意のオブジェクトを指定してユーザ情報をやり取りする方法


(良いタイトルが思い浮かばなかったので、長くなりました。。)

UIViewのAnimation処理でbeginAnimations:contextを使う方法で、
contextに任意のユーザ情報を渡すやり方です。

実際にbeginAnimations:contextは

```objc
+ (void)beginAnimations:(NSString *)animationID context:(void *)context
```

とcontextはvoid*型になっているので何でも渡せるようになっています。
以下は、contextを用いてユーザ情報を渡すSampleです。


```objc
// beginAnimations:context sample

- (void)animationStart {
	NSDictionary *userInfo = @{@"key":@"val"};
    
    [UIView beginAnimations:@"animation" context:(__bridge_retained void*)(userInfo)];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.27f];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    /* animation処理 */
    [UIView commitAnimations];
}
```

次にAnimationが終了した際に呼ばれるメソッドの中身で、実際にcontextを受け取り解釈します。

```objc
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
	NSDictionary *contextObj = (__bridge_transfer NSDictionary*)context;
	NSLog(@"%@", contextObj[@"key"]);
}
```

実行結果

```
val
```

勘違いし易いのが(私も最初はそうでした)、beginAnimationsはグラフィックスコンテキストではありません。
上述の通り、アニメーションのデリゲートメソッドで受け取り、その後の条件判定用にユーザが好きに指定するものです。

間違ってる点等あれば、こちらでご指摘か、同じ記事を[管理blog](http://project-unknown.hatenablog.com/entry/2015/03/03/013033)にも載せてますので、そちらにお願い致します。
MacでApache+PHPの環境を構築する。


# 構築する！
基本的にこちら[MacでApache+PHPの環境を構築する](http://qiita.com/is0me/items/72fcb5d8ac2c8f1c6247)を参考に構築していきます。

## 注意点　OSX 10.10 Apache 2.4の場合
バーチャルホストの設定に注意してください。
以下のように書きましょう。

```
<Directory "/Users/username/Sites/">
AllowOverride All
Options Indexes MultiViews FollowSymLinks
Require all granted
</Directory>

```

AllowOverride All
Options Indexes MultiViews FollowSymLinks
の順番を逆にしていてハマりました。
インストール済みで利用可能なロケールを確認する。

# やり方
```
$ locale -a
C
en_US.utf8
POSIX
```

以上。

# 補足

localeの設定が微妙だとperl実行する時こうなったりするじゃないですか

```
$ perl --version
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "ja_JP.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi
略
```

ここらへん調べると大体、ロケールをインストールして環境変数にロケール文字列を入れてexportすればおｋ。みたいなのは出てくるのに、現状使えるロケールが何か調べるやり方が分からなかったんですよ。で、さんざんぐぐって見つからなかったけど`man locale`したら書いてあったっていうね。

そのインストールの仕方の方を知りたかったらぐぐればいっぱい出てくると思います。
Hound.ciさんに怒られすぎて辛いので、push前になんとかする

コーディングスタイルチェッカーなCIのHound.ciさん導入したら、
毎回毎回とても怒られる。つらい。


# rubocop 使おう

使おう

Hound.ciとかが内部で使ってるから、これで通せばいいはず。
以下railsと想定

### インストール

```rb:Gemfile
gem 'rubocop' #追加する
```

```console
$ bundle install
$ rbenv rehash #必要なら。
```

Hound.ciが使っているスタイル定義ファイル( https://houndci.com/configuration から取ってこれる)

```console
$ wget https://raw.githubusercontent.com/thoughtbot/hound/master/config/style_guides/ruby.yml
```

### 使う

```console
$ rubocop -c ruby.yml app/*
```

-c でスタイル定義ファイル読ませる


### 自動訂正とかもある

ある程度自明なスタイル違反を修正してくれる。

```console
$ rubocop -c ruby.yml -a app/*
```

ただし、gitとかで管理してないと、戻せなくなって悲しみが訪れる
python ProjectEulerを30問解いて学んだこと

ときはじめの俺のレベル
---
if文、for文、while文を知っていた。
リスト内包表記というものがあるらしい(辞書、ジェネレータについては不知）
属性？なんすか、俺はマゾ属性＋メガネっ娘属性ですが？

python的に学んだこと
---
リスト内包表記
http://docs.python.jp/2/tutorial/datastructures.html
例:
Project Euler 29
http://qiita.com/cof/items/b39c28e8770fc60b074d

辞書内包表記(Python 2.6?くらい以降)
？(感覚で)
例:
Project Euler 23
http://qiita.com/cof/items/3e02bca57b6a6dc1578a

リスト内包表記、辞書内包表記、ジェネレータの違い、記法(by shiracamusさん)
下記のコメント参照
http://qiita.com/cof/items/b39c28e8770fc60b074d

if文の分岐を辞書化でコードを単純化できる？（俺理解）(by shiracamusさん)
下記のコメント参照
http://qiita.com/cof/items/567dbc499fbf6d4aefb1

map()関数
http://docs.python.jp/2/library/functions.html#map
例:
Project Euler 20
http://qiita.com/cof/items/400ae6793819850ce68a

reduce()関数
http://docs.python.jp/2/library/functions.html#reduce
例:
Project Euler 22
http://qiita.com/cof/items/40519ba5d3d59db079de

lambda
http://www.lifewithpython.com/2013/01/python-anonymous-function-lambda.html

time 特にtime.time()を適当に
http://docs.python.jp/2/library/time.html

timit()関数
http://docs.python.jp/2/library/timeit.html
使い方
http://qiita.com/cof/items/ddac98e31a5a4bf16ec7#comment-e9bb24a7450c6b0d74fd

file->リスト化
例:
Project Euler 22
http://qiita.com/cof/items/40519ba5d3d59db079de

定数は大文字で書くとわかりやすい。

range()を多重ループで用いると速度が遅くなりやすいので、ループの前に予め変数に入れておくとよさげ。


アルゴリズム的に学んだこと
---
リスト内包表記は（概ね）速い
http://qiita.com/cof/items/ddac98e31a5a4bf16ec7#comment-e9bb24a7450c6b0d74fd

in xxxで参照するときは辞書、setsを使え。
http://www.peignot.net/python-speed

なんか作るときは、現在のステータスから次回のステータスを作成するような関数を作成すると簡単
例:
Project Euler 28
http://qiita.com/cof/items/567dbc499fbf6d4aefb1
Project Euler 19
http://qiita.com/cof/items/44b380466e560de99e25

扱うべきデータに対する考察を加えてアルゴリズムを改良すると、処理をスムースに行いうる。
例:
Project Euler 24
http://qiita.com/cof/items/874ddf45e86d94f817bf
Project Euler 26
http://qiita.com/cof/items/567dbc499fbf6d4aefb1
Project Euler 10
http://qiita.com/cof/items/13dd1b3c29b43452cdc0

既存のアルゴリズムの改変で効率的な処理を行える場合がある（※既存のアルゴリズムがなぜ効率よいかを理解する必要が有り
例：
Project Euler 21
http://qiita.com/cof/items/e86d6e6db090dd54b006
例2:
Project Euler 12
http://qiita.com/cof/items/222d51c09b043da974af

再帰を使うときは最終的な（初期の）パラメータを設定することが重要。(but 俺の実装では遅い)
例；
Project Euler 15
http://qiita.com/cof/items/e97797aa692d569164e3
Project Euler 18
http://qiita.com/cof/items/ccee79fbf84a93d21c1b

計算結果の記憶で高速化が測りうる。
例:
Project Euler 14
http://qiita.com/cof/items/ddc4d797ff2979f1a3be
Project Euler 9
http://qiita.com/cof/items/ef35068f3e63ede66eaf

アプローチはいろいろ考えられるが、必ずしも早くなるとは限らない。
例:
Project Euler 4
http://qiita.com/cof/items/96fed868672ec1e0c404
Project Euler 5
http://qiita.com/cof/items/5c9670c4ac3f7988ae14

高速化は高速化で得られるメリットとそれに費やすコストとの比較が重要
例:
Project Euler 2 2.21マイクロ秒の節約のために15分費やす男
http://qiita.com/cof/items/2591c15c6f63c89f304c

Project Eulerの難易度(1問目~30問目)
---
答えを求めるだけなら概ね優しい。

総合
---
振り返ってみると結構いろいろ学べた。
GMPを利用した多倍長計算

GNU Multi-Precision Library（GMP）を利用した多倍長計算のサンプルを数回に分けて掲載していきたいと思います。


GNU Multi-Precision Library（GMP）は、多倍長整数など任意の精度の算術ライブラリで、符号付き整数、有理数、浮動小数点数を扱います。
事実上、動作中のハードウェアが持つメモリ容量以外には精度は制限されません。

例えば、GMPを利用した123^45を計算するコードは以下のようになります。

```c:sample.c
#include <gmp.h>

int main(int argc, const char * argv[])
{
    mpz_t n;
    mpz_init(n);

    mpz_ui_pow_ui(n, 123, 45);
    gmp_printf("%Zd\n", n);

    return 0;
}
```

OS Xを使っている人はHomebrewでインストールすることができます。

`$ brew install gmp`

コンパイル方法と実行方法は以下のとおりです。

```
$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
$ gcc sample.c -lgmp
$ ./a.out 
11110408185131956285910790587176451918559153212268021823629073199866111001242743283966127048043
```
Xcodeで作成したプロジェクトをGitで管理する

***
【目的】
標題通り、Xcodeで作成していたプロジェクトを後からGit管理する。
***
####**Bitbucketを使用する**
　Bitbucketは、無料でプライベートリポジトリが作成できるので使用しています。
###**Bitbucketでリボジトリを作成する**
　Xcodeでは、リポジトリの作成できないのでBitbucketから作成します。
メニューから「作成」を選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/09d483cb-7af1-27a1-152e-0b3ac6920238.png" width="300"/>
・Name：任意のリポジトリ名
・説明：任意
・アクセスレベル：ON（プライベートで使用する為）
・リポジトリタイプ：Git
・プログラミング言語：Objective-C

###**Xcodeから新しいプロジェウトを作成する**
　作成時にCreate Git repository on 「MyMac」にチェックを入れているとRemoteへの設定が楽にできます。

###**Remoteの設定を行う**
「Source Control」から「Configure XXXX」を選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/2088feb3-9519-adf3-46cc-ce5a88bfe50f.png" width="200"/>

「Remote」を選択して左下の「＋」から「Add Remote...」を選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/047d183a-ed4e-10d5-febb-966b8fd7201c.png" width="200"/>

Bitbucket画面に戻って、左の「・・・」から「クローン」選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/34c8e31a-67dc-4867-9d55-06150652d5d3.png" width="200"/>

https以降のURLをコピーする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/b4d08470-97fc-fc2f-7c53-ff93a1173ea9.png" width="200"/>

Xcodeに戻って、「Address」にペーストして、「Add Remote」をクリックする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/ced5fdb3-8da4-de65-d8fd-92f19d72b379.png" width="200"/>

追加されたのを確認して「Done」をクリックする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/998b9e80-916b-f53b-87fa-471a7d7e0265.png" width="200"/>

あとは、「Source Control」から「Push」をするとRemoteにソースがアップされます。

***
【結果】
あとは、ソースを触ったら「Commit」「Push」をすればいい。
***
【岩井さん勉強会#2】簡単なアプリをつくろう

#1.Xcodeをインストールする
iOSアプリ開発なのでXcodeというアプリを使います。
XcodeはApple社が作ったDeveloper用のアプリです。

詳しくは[こちら](http://developer.apple.com/jp/xcode/)

インストール手順はこちらがわかりやすかったです。
→[Xcode](https://developer.apple.com/jp/xcode/)
　


リンク先にありますが、Command Line Toolsもインストールしましょう。
なんだか、gccというコンパイラが使えるようになるらしいんだけど、
難しい話はよくわかりません(笑)
　

コンパイラってなんだ？っと思って調べてみたら、
プログラムのソースコード（原始コード）を、機械語、ないしバイトコードなどの
中間言語によるオブジェクトコード（目的コード）に翻訳(変換)するプログラムらしい。

うむ。要するに便利なやつだｗ


#2.早速アプリを作ってみよう

ということで、作ってみました。
「◯✕ゲーム」。
こちらを参考にして（コピペをたくさんして←）
[Swiftで初めてiPhoneゲーム開発する人向チュートリアル（マルバツゲームを例にStep by Step解説）](http://xavier.hateblo.jp/entry/2014/09/07/144059)
![スクリーンショット 2015-03-03 0.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/68268/510596e0-90e5-036e-f34a-bc7724b9763a.png)


なんだか思ってたより簡単で（プログラミングをバンバンするかと思ってた）
アクションとコードを紐付けたり、画像を紐付けたりって作業が多かったです。

　
でもエラーが出た瞬間たちまちわからなくなって、岩井さんにヘルプｗ

か、かんたんではないですね。
Swiftのコードとかコードの構成とか仕組みが全くわかってないので、そこですね。
そこわかるようになって、また記事書きます！

　
すかさずamazonでこの本買いました。
[Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】](http://urx.nu/hMOR)


#3.まとめ
1.Xcodeのインストール
2.簡単なアプリ作成
　
　
　
まずは開発環境！
モノを準備してから、取り掛かると。

アプリを初めて作りましたが、iosシミュレーターで実際に動作するとけっこう感動します。
簡単なアプリから作っていくといいかも。

####宿題
□Gitについて予習→説明する
□スクーに登録→アプリに関する授業を見る
□アプリ作ってみる→説明する
rebarのdepsを更新するスクリプト

# rebarのdepsを更新するスクリプト
単純な場合は`rebar update-deps`とかで更新できる. だが, rebarはそこまで賢くないので上手くいかない場合もある.

### update-depsがうまくいかない場合

```
- App A
   - App B
      - App C (version 2)
   - App C (version 1)
```

といった, 親と子で同じアプリケーションを使用する場合に上手くいかない.
なので, git限定で最新のものを参照するスクリプトを書いた

### スクリプト

```bash:update-deps
# !/bin/bash

# rebarのパスを設定
REBAR=./rebar

# for inで改行単位でループを回す
IFS=$'\n'
APP=""
COMMIT=""

git_check() {
    cd deps/$1
    # commit時刻を比較して新しい方を取る
    if [ `git show $2 --quiet --pretty=format:%at | tail -n 1` -ge `git show $3 --quiet --pretty=format:%at | tail -n 1` ]; then
        COMMIT=$2
    else
        COMMIT=$3
    fi
    cd ../../
}

# 依存ライブラリの一覧をソートして同じライブラリの参照が連続するようにする. 
# 最後に余分に1回ループを回す為に" "をつけている.
for l in `$REBAR list-deps | grep -v "==>" | sort` " "
do
    # Application名 TAG バージョンタグ git://.... のようになっているので, その1番目と3番目を取得
    APP2=`echo $l | cut -d " " -f 1`
    COMMIT2=`echo $l | cut -d " " -f 3`

    # 前回と同じであればどちらが新しいかを比較
    if [ "$APP" == "$APP2" ]; then
        git_check $APP $COMMIT $COMMIT2
    else
        # 前回と違うアプリケーションになったら, その前のアプリケーションのバージョンは確定するので, checkout
        if [ "$COMMIT" != "" ]; then
            cd deps/$APP
            git checkout $COMMIT
            cd ../../
        fi
        cd deps/$APP2
        git fetch
        cd ../../

        APP=$APP2
        COMMIT=$COMMIT2
    fi
done
```

まぁ, 大分汚いですが勘弁してください＾＾；

### 使用しているコマンド
#### rebar.configに記載されている依存ライブラリとそのバージョンの一覧を取得する.
依存ライブラリの依存ライブラリも取得できます.
但し, 不要な情報も存在する為, 上記スクリプトでは`grep`でそれを取り除いています.

```bash
$ rebar list-deps
```

#### gitの指定したコミットのコミット時間を取得する
signatureが入っているcommitやtagに関しては他の情報も出力される為, 最後の1行だけを取っています
(よいやり方があれば...)

```bash
$ git show $2 --quiet --pretty=format:%at | tail -n 1
```


### 注意点
- commitの新しさはcommit時刻を参照するので, 必ずしも正しくならない場合があります
- deps以下に依存ライブラリを配置している前提でのスクリプトです. 状況に応じて好きに修正してください


-----

rebarがもう少し賢ければなぁ...
chef の execute で bundle exec 実行する

execute の user を指定しても、HOME と USER 環境変数は更新されず、chef 実行ユーザの環境変数のままとなる。それだとおかしいことになるのできちんと設定してあげると良い.

```rb
execute 'test' do
  user 'sonots'
  cwd  '/home/sonots/app_name'
  command '/home/sonots/.rbenv/versions/2.2.0/bin/bundle exec env > /tmp/env'
  environment(
    'HOME' => '/home/sonots',
    'USER' => 'sonots',
  )
end
```

あとは、chef-solo を bundle exec 付きで実行しないこと。bundler の環境変数が設定されて、`execute` リソースでコマンドを fork + exec した場合に、環境変数が残ってしまい、command で指定した bundle exec が利かなくなる。

通常の ruby スクリプトであれば、`Bundler.with_clean_env` ブロックで囲んであげれば良いのだが、chef の execute リソースの場合、別のスコープで実行されるので利かない。
AWSにおける共有コンテンツ参照方式を検討する（"S3をマウントしたい"から始まった議論の一部始終）



#1.背景

S3の可用性や耐障害性って魅力的！
ただし、NFSマウントできないので、扱う側がS3のAPIで会話しないといけない。

現行では、複数台あるWebサーバがそれぞれファイルサーバへNFSマウントして共有コンテンツを参照していたんですが、S3だとこの構成がとれない。。。

なんとかならないか？そんな理由で始まった検討経緯を共有します。


#2.方式案

思いついたのは、大きく以下の4方式。早速各方式について検討開始しました。

>①：S3コマンドで会話するよう、アプリケーション修正（AWS推奨）
②：何らかの形でS3のバケットをNFSマウントする（S3fsとか）
③：インスタンス側にデータを同期する（S3 syncとか）
④：EC2でファイルサーバを構築する（最終手段）


#3.検討の流れ

やはり`最初は教科書通りにやろうとはしましたが、アプリケーション側の修正が大きいので非現実的`でした。

ということで、まずはS3をマウントできないか調べました。
S3fsがヒットしたので、早速試してみることに。
、、、結果。`S3fsは遅いし不安定。`
ファイルを書き込んだ直後にlsコマンドでリストするとエラーになったり、
一括でファイル書込みしようとするとエラーが発生したりしました。
しかもAWS公式ではないツール。。。AWSとしても使ってくれるな、ということだったので、却下。
（あくまでも、今回の要件には見合わなかった、という意味です。S3fs自体を否定するつもりはありません）

はい、次。

AWS公式でできる手段は何だ？という観点で、S3 syncを発見。。試す。
公式CLIのコマンドだけあって早い。マルチパートで送受信する仕組みはさすがといったところ。
、、、しかし、`S3 syncでデータ同期するためには、明示的にコマンドを叩いてあげないといけないので、cronなどで仕込みが必要（＝タイムラグが発生してしまう）`
コンテンツ更新のリアルタイム性が求められるシステムだったため、採用できず。。。

、、、手詰まり。



#4.結論
<font color=red><b>
`S3の可用性・耐障害性の恩恵を受けつつ、リアルタイム同期しながらコンテンツ共有することはできない`
</font></b>
という結論に達しました。

S3がNFSできたり、ひとつのEBSを複数のインスタンスでアタッチできれば問題なかったのに。。。
（AzureではFilesがPreviewされているので、AWSも必ずリリースしてくれると信じています！）

結局、EC2上にCRUSTERPROで冗長化したファイルサーバを構築しました。
そこでも色々ありましたので、よかったら下の記事も読んでみてください。
[DX経由でアクセスされるAWS上のファイルサーバの冗長化方法(Failover方式)を考える](http://qiita.com/kaojiri/items/cf404d09a8a40a38ee16)

#5.まとめ
最後に、比較検討で書いた観点を表に纏めておきます。



|方式　　　　         | メリット     | デメリット                          | 評価結果                         |
|:-------------------|:---------------------|:----------------|:----------------|
| S3コマンドで制御するようAP修正 | ・AWS推奨<br>・EC2に追加EBS不要       | ・修正コスト大<br>・AP改修リスク        | AP側の修正負担やスケジュールが<br>間に合うのならアリ |
| S3fsによるマウント | ・現行構成を流用可能  | ・EC2に追加EBSが必要<br>・パフォーマンス遅<br>・エラー発生、不安定 |Enterprise利用には厳しい|
| S3 syncによる同期 | ・現行構成を流用可能 <br>・AWS公認の手段 | ・EC2に追加EBSが必要<br>・定期実行必須（＝タイムラグ発生） |ライムラグ許容できるのであればアリ|
| EC2でファイルサーバ構築 | ・現行構成を流用可能<br>・現行と同じメンテナンス性<br>・パフォーマンス期待  | AWS利用コスト大 |オンプレミスと同じ感覚（要件）を求めるのであれば<br>これを採用せざるを得ない。。。|





CMS入れろよ！！！というツッコミは無しでお願いします　笑
.Net Framework 非同期処理を振り返って

最近は、タスクベースの非同期パターン（TAP）というもので、非同期処理を実装していきます。
でも過去は違いました。
考え方が違うというところ。これにやられました。

そんなところで、振り返ってみました。


###[.Net Framework 1.1 非同期呼び出しの組み込み](https://msdn.microsoft.com/ja-jp/library/aa719598(v=vs.71).aspx)
デリゲートを使って、非同期に実行することができた。

###[.Net Framework 2.0 イベント ベースの非同期パターンを使用したマルチスレッド プログラミング](https://msdn.microsoft.com/ja-jp/library/hkasytyf(v=vs.80).aspx)
非同期処理をデリゲートで実現するとどうしても、処理の流れが見えにくかった。
それを問題を解決してくれたのが、これだと思ってます。
このときから、.Netのスレッドモデルが変わって、ネイティブのスレッドを見ちゃいけないぞーってなった。変わりにマネージスレッドというものを扱うように。これは、非同期の処理でスレッドプールなるものが、自動的にうまいことやるから、気にしなくていいっていうものだった。

###[.Net Framework 2.0 BackgroundWorker クラス](https://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(v=vs.80).aspx)
デザイナから、上記イベントベースの非同期パターンを実装するコンポーネントとして貼り付けられた。もちろん4.5でも残ってる。
「ながい処理」の後に「終わったよーっていう通知をUIで表現する」ケースだとぴったり。
でも、小刻みな処理や、複数のバックグラウンドの処理を同時に実行させると最終的な同期の問題とか。要するに上記のようなケース以外だと何かしら、手を加える必要があった。


###[.Net Framework 4.0 の並列プログラミング](https://msdn.microsoft.com/ja-jp/library/dd460693(v=vs.100).aspx)
まさに、小刻みな処理を非同期化するために生まれてきた感じがした。
パソコンもマルチコアが当たり前だった。
ここからは、非同期で実装するというよりも、並列に処理するっていうところが違う。
タスクという一つのメソッド・・・クロージャ、プロシージャ・・・デリゲートのインスタンスをうまいことやってくれる。


###[.Net Framework 4.5 非同期プログラミングのパターン](https://msdn.microsoft.com/ja-jp/library/jj152938(v=vs.110).aspx)
そして、改めて今までの実装方法が整理された様子。

非同期プログラミング モデル (APM) 
イベント ベースの非同期パターン (EAP) 
タスク ベースの非同期パターン (TAP) 


###[Async および Await を使用した非同期プログラミング ](https://msdn.microsoft.com/ja-jp/library/hh191443(v=vs.120).aspx)

言語レベルで非同期になりました。
Asyncなイベントハンドラを作って、MSILに逆アセンブルしてみると中身が面白いです。
コードは、一本なのに実体は非同期です。


###まとめ
過去のことをその時代ほど知る必要はなくとも
それぞれのモデル・パターンを知っておかないと、
いつの間にかぐちゃぐちゃになってしまったりするので、その助けになれば幸いです。

// EAPで実装されたものに、TAPで追加実装したりすると
// 大変なことになって結局書き直すか、あきらめるかの選択を迫られることになったり・・・ｗ
MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.02

# Vagrant インストール編

MacOS X Yosemite で Heroku にアプリを公開するまでの環境構築を何回かに分けて書きます。

まずは vol.01 の [Virtual BOX インストール編](http://qiita.com/hirolog/items/560ce489dce08f555876) を先に見てください。

## Vagrant を取ってくる

[Vagrant公式サイト ダウンロード先](https://www.vagrantup.com/downloads.html)

Vagrantは以前は

```
gem install vagrant ※注：昔のやり方
```

といったコマンドで gem からインストールしていたようなのですが、今は dmg ファイルを落としてインストールする形になっています。なので、gemインストールしている記事が誤っているわけではなく、昔のやり方と思って良さそうです。
上記ダウンロード先から、MacOS用の最新版を落としてきてください。

90MB弱ぐらいはあるので、高速回線推奨。

### すでに gem install しちゃったよ、という人は

先に gem で入れたVagrantをアンインストールしてから、dmgファイルによるインストールをした方が良いと思います。

## Vagrant をインストール、起動確認

ダウンロードした Vagrant の.dmgをファイルを起動し、以下のようなダイアログが表示されたら指示に従い 1 の Vagrant.pkg をダブルクリック。

![Vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/57389/a09d3360-598a-9292-9547-3cdd7ef91180.png)

インストールが問題なく進めば完了ですが、アプリケーションフォルダ や Launchpad 内にアイコンなどができるわけではありません。

インストールされたか不安になるかもしれませんが、**ターミナル** を立ち上げて、以下のコマンドを入力してみてください。

```
vagrant -v
```

次のようなバージョン情報が表示されれば、インストール完了です。
2015/03/01現在、1.7.2が最新版のようです。

```
Vagrant 1.7.2
```

なお、Vagrantをインストールしただけではまだ仮想OSは起動できません。
何かしらBOXと呼ばれる仮想OSのイメージを取ってこないといけないのですが、それは次回。

### キーワード

* MacOS X
* VirtualBox
* Vagrant
* CentOS
* Ruby on Rails
* RVM (Ruby Version Manager)
* Heroku
CloudFormationでMulti-AZなRDSを構築する際の一工夫

自分への備忘録を兼ねて。

# はじめに

AWSでEC2+RDS(MySQL)なインフラを構築する際に、可用性を考慮してRDSをMulti-AZ配置にすることはよくあると思います。
この際に注意したいのがAZをまたぐことによるレイテンシです。
Multi-AZ配置にした場合、EC2とRDSのAZが異なる場合にはレイテンシが大きくなるため、なるべくならEC2とRDSのプライマリは同じAZにしたいものです。
しかし、CloudFormationでRDSの環境を構築する際にMulti-AZを有効にしようとすると、AZを指定することができません。
また、RDSインスタンスを複数利用しようとすると、RDSインスタンスのプライマリAZがばらけることもあるため、[こちら](http://dev.classmethod.jp/cloud/aws/multi-az-changed-active-standby/)にあるようにEC2のAZをRDSに合わせるということも難しくなります。
そこで、ある工夫をすることでMulti-AZなRDSのプライマリAZを指定する方法を試してみました。

# 方法

簡単に言うと、CloudFormationのRDS設定ではMulti-AZをfalseにした上で、EC2のUserData側でRDSのMulti-AZを有効にします。
UserDataの中ではAWS CLIを利用してRDSの設定を変更するため、EC2インスタンスで[jq](http://stedolan.github.io/jq/)を利用できる必要があります。
（jq以外でも条件指定で要素の抽出ができるようなJSONパーサで代用ができるかも知れません）

## RDSの記述

RDSに関する設定では、下記のようにプライマリにしたいAZを指定した上でMulti-AZはfalseに設定します。

```
    "MyDB" : {
      "Type" : "AWS::RDS::DBInstance",
      "Properties" : {
        (中略)
        "AvailabilityZone" : "指定したいAZ",
        (中略)
        "MultiAZ" : "false",
        (中略)
      }
    }
```

## EC2の記述

EC2では、EC2インスタンスを配置するサブネットの設定で、RDSインスタンスに指定したAZに属するサブネットを指定します。
その上で、DependsOnにサブネットとRDSを指定した上で、UserDataの中でRDSのEndpoint.AddressからDBInstanceIdentifierを取得し、RDSのMulti-AZを有効にします。

```
    "EC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "DependsOn" : "MyDB",
      "Properties" : {
        (中略)
        "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
          (中略)
          "aws rds modify-db-instance --db-instance-identifier `aws rds describe-db-instances | /path/to/jq '.DBInstances[]' | /path/to/jq -r 'select(.Endpoint[\"Address\"]==\"", { "Fn::GetAtt": [ "MyDB", "Endpoint.Address" ] }, "\") | .DBInstanceIdentifier'` --multi-az --apply-immediately\n"
        ] ] } }
      },
      (中略)
    }
```

## 補足

* DBInstanceIdentifierを明示的に指定している場合はEndpoint.AddressからDBInstanceIdentifierを取得などせず、modify-db-instanceのパラメタに直接指定するだけなのでJSONのパースなども不要です
* CloudFormationのイベントとしては、RDSインスタンス構築後、EC2インスタンスの構築時にRDSに対するmodifyと再起動が発生することとなります

# まとめ

CloudFormationのタイプごとの記述だけで全てを管理しなくても良い場合は、こういう合わせ技を用いることでやりたいことを満たせる可能性があります。
AWS CLIでできることを把握しておくと、CloudFormationだけでは難しいことも実現できるかも知れません。

# 参考

* [AWS::RDS::DBInstance](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html)
* [AWS CLIドキュメント:rds](http://docs.aws.amazon.com/cli/latest/reference/rds/index.html)
* [運用してわかった Amazon RDS のパフォーマンスを上げる 3 つのコツ](http://blog.manabusakai.com/2014/09/rds-performance-improvement/)
* [ELB+EC2+RDS(Multi-AZ)構成をあえてActive-Standbyにする](http://dev.classmethod.jp/cloud/aws/multi-az-changed-active-standby/)
* [AZ間のレイテンシについて](http://xoxo-infra.hatenablog.com/entry/2013/05/02/032918)
phpenv インストール

どうもマイクラ好きの見習いサーバーエンジニアです。

今回は自分用にメモ書きとしてphp5.5インストール手順をメモしとこうと思います。

なぜならさくらインターネットさんのVPSスケールアップで何度もやる羽目になりそうだから。。。

それはさておき、ここからメモしていきます。
余計なメモもありますがお気になさらず！

#### **事前に入れてあるもの**
・git

#### **今回インストールしていくもの**
・phpenv(複数バージョン管理できるから)

#### **次回入れたいもの(今後の記事)**
・php-build(phpのインストールとか楽そうだから！)
・php5.5(新しいの入れたい！)
・[Laravel](http://laravel.com/)(ここを目指してます)
・[Munin](http://success.tracpath.com/blog/2014/02/05/munin%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%9B%A3%E8%A6%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8Bcentos-6-5/)(自分のサーバ負荷みてみたい！)
・[Minecraft](https://minecraft.net/)のMOD配布できるWEBサイトを作りたい！(最終目標)

#### **メモ知識**
・phpenv
phpのバージョンを簡単に切り替えることが可能だそうです！
コマンド一つで切り替えられるとかイイネ！

・php-build
コマンドでソースのダウンロードとかインストールとかコンパイルとか色々してくれる
らしいです！


#### **実践！**
では早速やりましょう！

念のため現在のバージョンチェック！
`# php -v`

![SnapCrab_NoName_2015-3-22_23-2-1_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/6f8e4ccc-e97c-7d4d-6e56-4de994e5782f.png)

あ、僕はphpインストールしていなかったのでそんなものありません！

じゃ次にphpenvのインストールのためにgitから必要なものをcloneしましょう！
`# git clone https://github.com/CHH/phpenv.git`

インストールが終わったら
このディレクトリに移動しましょう！
`# cd phpenv/bin`

この中にあるshファイルを実行するとphpenvインストール開始するよ！
`# sh phpenv-install.sh`
![SnapCrab_NoName_2015-3-22_23-40-6_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/ba938e58-3246-9742-5788-940df236ef30.png)

おお
インストール無事完了みたいです。
あとは画像にも書いてありますが、bahsrcにパスを追加します！

```lang:.bashrc
export PHPENV_ROOT="/$HOME/.phpenv"
export PATH="$PATH:$PHPENV_ROOT/bin"
eval "$(phpenv init -)"
```

書いたら反映！
`# source ~/.bashrc`

あ、zshの人は.zshrcファイルに記述です！

今日はもう眠いのでここまでで。。。。
JetBrainsのエディターでSublime Textと同じことをしたいので調べてみた


**注意**：タイトルでJetBrainsのエディター言っていますが実際には、 **RubyMine** と **IntelliJ** でしか試していないので全てのエディターに当てはまらないことがあるかもしれません。何かお気付きになりましたらコメントお願いいたします。またこのドキュメントは随時更新していきます。

## 背景

もともとSublime Textを使っていたのですが、最近Javaなどのサーバサイド言語を書くようになりその辺の言語を書くのにJetBrainsのエディターが便利らしいと聞いたのでそれを使おうと決めました。そこでSublime Textと同じようなことができるか調べてみました。

## 複数ものを同時に選択して編集

Sublime Textだと `⌘ + D` で複数選択ができると思うのですがこれをRubyMineでもやりたかったので方法を調べました。

RubyMineでは`Alt`キーを押しながらカーソルで選択することで複数選択することができるようになります。

_[RubyMineでの選択の方法について詳しく読む](http://blog.jetbrains.com/ruby/2014/03/whats-mining-multiple-cursors-and-selection/)_

##
MetalとSwiftで２Dのスプライトを動かす

個人メモ
週末の２日を全部潰してMetalの練習をしました。大いなる無駄だったと思うけど、知識は増えました。

##スタート地点
http://www.raywenderlich.com/77488/ios-8-metal-tutorial-swift-getting-started
このページにあるHelloMetal

##私の個人的結論から
2Dのスプライトを動かすだけならほとんどの場合、SpriteKitで大丈夫です。
###確かにメタルは速い
確かにメタルは速いです。iPone6 iPad2の両方で２００個のスプライトを描いてもフレーム速度は６０FPSを維持します。とにかく高速だけを求めるならメタルはスプライトキットの敵ではありません。

###3D用のフレームワーク
それでも、３D用のフレームワークです

##HelloMetalから、２Dのスプライトを動かすための基本部分を次に抜き書きします。これは先のHelloMetalを少しだけ拡張してまとめたものです

Metalのコードをまとめてみました。自家製の部分は自家製のスプライト作成コードがありますので、無視してください。

#ハマった点
##メモリーリーク
元のコードのままでは、メモリーリークが発生します。描画が終わらないうちに、次のバッファの処理を始めるからです。それを防ぐためにコンプリーションハンドラを使ってセマフォーで処理終了まで次の処理に入らないようにしました。
##シェーダー
別の記事にソースコードを記載しています。
http://qiita.com/Kumaa/items/e4cf44e9221f70a0c13c

#結論
むだにエネルギーを使ったなあというのが感想です。Metalは速度がクリティカルな3D用のフレームワークです。もう少し2Dでも使いやすいと良いです。

ここに書いていない処理で必要なのは、テクスチャを頂点配列に貼り付ける作業です。XCASSETに画像を入れてUIImageのnamedでとってくれば簡単にできると思います。

私の感想としては、現在の処理方法でもスプライトキットの５倍の処理速度だとおもいます。でもたった５倍という話もあります。エンコードしたバッファの再利用は現時点ではしていません。エンコードしたバッファを再利用することで、さらに処理速度が上がるということです。速度の向上は可能のようです。
gitの初期設定


[git-config]:http://git-scm.com/docs/git-config

homebrewでgitをインストールした場合の初期設定について。
以下のコマンドにより最低限の設定をしておくと良い。

特にpushのデフォルト設定をしないと `brew file update` でwarningが出るので設定しておくのが良い。

```bash:
$ git config --global user.name <username>
$ git config --global user.email <mailaddress>
$ git config --global color.ui auto
$ git config --global push.default simple
```

`push.default` の設定値は以下。
他の設定なども確認したい場合は[本家][git-config]へ。

```text:抜粋
push.default
Defines the action git push should take if no refspec is explicitly given. Different values are well-suited for specific workflows; for instance, in a purely central workflow (i.e. the fetch source is equal to the push destination), upstream is probably what you want. Possible values are:

nothing - do not push anything (error out) unless a refspec is explicitly given. This is primarily meant for people who want to avoid mistakes by always being explicit.

current - push the current branch to update a branch with the same name on the receiving end. Works in both central and non-central workflows.

upstream - push the current branch back to the branch whose changes are usually integrated into the current branch (which is called @{upstream}). This mode only makes sense if you are pushing to the same repository you would normally pull from (i.e. central workflow).

simple - in centralized workflow, work like upstream with an added safety to refuse to push if the upstream branch’s name is different from the local one.

When pushing to a remote that is different from the remote you normally pull from, work as current. This is the safest option and is suited for beginners.

This mode has become the default in Git 2.0.

matching - push all branches having the same name on both ends. This makes the repository you are pushing to remember the set of branches that will be pushed out (e.g. if you always push maint and master there and no other branches, the repository you push to will have these two branches, and your local maint and master will be pushed there).

To use this mode effectively, you have to make sure all the branches you would push out are ready to be pushed out before running git push, as the whole point of this mode is to allow you to push all of the branches in one go. If you usually finish work on only one branch and push out the result, while other branches are unfinished, this mode is not for you. Also this mode is not suitable for pushing into a shared central repository, as other people may add new branches there, or update the tip of existing branches outside your control.

This used to be the default, but not since Git 2.0 (simple is the new default).
```
初めてJAWSに参加しました(JAWS DAYS 2015)

#イベント概要

3月22日(日)10時〜19時
ベルサール新宿グランド
東京都新宿区西新宿8丁目17番3号
参加費：1000円

http://jawsdays2015.jaws-ug.jp/

ベルサール新宿グランド
![alt](http://photo.satohiroyuki.info/20150322/DSC01472.jpg)
入口前
![alt](http://photo.satohiroyuki.info/20150322/DSC01477.jpg)

#参加の経緯

AWSは直近1年間程度、常に触っていたが、
外部ではどのような構築方法を実装しているのかが気になり参加しました。

コミュニティが主催するセミナー等には参加したことありますが、
身内のりが激しかったりすると次回から行きたくなくなる人なので、そこも記載しておきます。

#ブース

![alt](http://photo.satohiroyuki.info/20150322/DSC01511.jpg)

・質問ブース
AWSの方に直接質問ができる素晴らしいブース。

・セッションブース
ビッグトラック
AWS Technical Deep Dive & ACEに聞け！
テクニカルトラック
DevOpsトラック
モバイルビッグデータIoT
HackDay
初心者ハンズオン
Meet the SA

#聞いてきたセッション

AWS User Group – Japan主催するコミュニティイベントに初めて行き、
今回は4セッションを聞いてきました。

##クラウドとコミュニティのこれまでとこれから
JAWSの成り立ちとこれからについての説明。
現在は50以上のコミュニティなって稼働している。
JAWSコミュニティが大きくなったのは以下の3つのことが重要と説明していた。
・適切なリーダが複数必要
・フォロワーの存在、賛同してくれる方
・集まれる場の継続

![alt](http://photo.satohiroyuki.info/20150322/DSC01482.jpg)


##金融クラウド最新動向　～AWSで金融イノベーション

6月にFISC安全対策基準改訂版が発行され、さらにAWSが使いやすくなるようです。
金融系のコミュニティも設立予定とのこと、Fin-JAWS。
後は、FINTECHは宣伝が強かったので、AWSのことを聞きたかった。


##MMO RPG on AWS
Nexsonがサービス提供を予定しているDurangoの開発についてのお話。
MMOを開発するためのポイントを4つの課題に分けて説明していた。
・膨大な数のメッセージハンドリング
・ゲームサーバのロードバランス
・データ同期の最小化
・低レイテンシで大量のIO
AWS上での低レイテンシーで行うこと、同期処理を減らす方法
データベースの選定と検索の方法に何を利用したかを把握することができるセッションでした。

![alt](http://photo.satohiroyuki.info/20150322/DSC01488.jpg)


##東急ハンズのクラウドデザインパターン
AWSをフル活用して基幹システムを移行するお話。
すべてをS3に置いている「謎テクノロジー」を使って運用していました。
現在はまだ移行中ですが、今後すべてAWSになるとのことでした。


##Aurora
前半はAuroraの作り方の説明。
後半のプレゼンの方がまとまっているのでお勧めです。
しかし、Limited Previewでベンチ結果が話せないようでしたのでちょっと物足りない感があります。

![alt](http://photo.satohiroyuki.info/20150322/DSC01507.jpg)


#最後に
今回はJAWSのに1人でいきましたが、色々なセッションが聞けて面白かったです。
ちなみに、ランチはお弁当が出ましたので美味しく頂きました。

難しい話題を行うセッションもありましたが、
初心者向けのセッションも開催されていて好印象でした。

残念だったところは、会場の問題で隣のセッションの音が入ってしまい、
セッションが聞きにくかったことぐらいです。

注意点、コミュニティ特有の身内ノリが嫌いな方は最後のLT前にご帰宅を～
それでは、次回のJAWSも楽しみにしております。
よく見る「&:upcase」を整理した



```:ruby
["a","b","c"].map(&:upcase) # => ["A", "B", "C"]
```

よくあるこれ → &:upcase

&について調べるとドキュメントにこうあった（抜粋）
> &をProcオブジェクト付けて渡すとブロックとして渡される。
> to_procメソッドをもつオブジェクトならば&を付けて渡すことができる。

とある。

そして

:update
これはSymbol（のように見える）オブジェクト。
明らかにProcオブジェクトではない。

そうなると、「to_procメソッドをもつオブジェクトならば&を付けて渡すことができる。」が適用される。

改めてSymbolクラスのドキュメントをみる。
Symbol#to_proc -> Proc
ありますね。そしてProcを返してますね。

という事は、
「&をProcオブジェクト付けて渡すとブロックとして渡される。」
にもあてはまりますね。

ここでmapのリファレンスを見てみる。
Enumerable#map {|item| ... }

mapが期待しているのはブロック。

おおー。辻褄が合う。
Rails controller内でのcallbackの順番

# callback一覧
Railsのcallbackといえば`before_action`(`before_filter`)等を思い浮かべると思うが、
以下の9つが利用可能らしい

- `before_action`(`before_filter`)
- `around_action`(`around_filter`)
- `after_action`(`after_filter`)
- `prepend_before_action`(`prepend_before_filter`)
- `prepend_around_action`(`prepend_around_filter`)
- `prepend_after_action`(`prepend_after_filter`)
- `append_before_action`(`append_before_filter`)
- `append_around_action`(`append_around_filter`)
- `append_after_action`(`append_after_filter`)

# 検証
検証は[こちら](https://github.com/fortissimo1997/rails_callback)のリポジトリで行った

## コード(概要)
```rb
  before_action :before
  around_action :around
  after_action :after
  append_before_action :append_before
  append_around_action :append_around
  append_after_action :append_after
  prepend_before_action :prepend_before
  prepend_around_action :prepend_around
  prepend_after_action :prepend_after

  def callback_method
    @array ||= []
    @array << method_name
  end
```

## 結果
```rb
@array == %w(prepend_around prepend_before before around append_before append_around append_after after prepend_after)
```

# 考察
`before`,`around`,`after`は別々に管理されているのかと思っていたが、
`process_action`というcallbackで同列に管理されているようだ
実際にコードを覗いてみると、[`AbstractController::Callbacks`](https://github.com/rails/rails/blob/v4.2.0/actionpack/lib/abstract_controller/callbacks.rb)で定義されているようだ

## 参考
[検証用リポジトリ](https://github.com/fortissimo1997/rails_callback)
[`AbstractController::Callbacks`](https://github.com/rails/rails/blob/v4.2.0/actionpack/lib/abstract_controller/callbacks.rb)
[`ActiveSupport::Callbacks`](https://github.com/rails/rails/blob/v4.2.0/activesupport/lib/active_support/callbacks.rb)
MySQLでカラムに使える文字種


普段アルファベットや_ぐらいしか使用してなかったので知らなかったのですが, MySQLのカラム名には日本語でも半角スペース含んでいてもバックスラッシュなどの記号でも使用できるようです.

例えば, こんな感じに...


| # | Column Name |
|---|-------------|
| 1 | id |
| 2 | SELECT * FROM test WHERE id = 1; |
| 3 | 　※ 全角スペース |
| 4 | 日本語 |
| 5 | `` |
| 6 | \n |

ここまでなんでもOKだとは思わず驚きました.
自分たちで何らかの命名規則を決めておかないと後々面倒なことになりそうですね.
CONCATでの文字列連結時にひとつでもNULLな項目があると「NULL」扱いになってしまう


例えばこんな状態のテーブルがあるとします.

| id | column_a | column_b | column_c |
|----|----------|----------|----------|
| 1  | a        | b        | c        |
| 2  | a        | b        | NULL     |
| 3  | a        | NULL     | c        |


で, こんなqueryを実行すると...

```
SELECT id, CONCAT(column_a, column_b, column_c) AS column_abc FROM `test_201503`;
```
こうなってしまいます.


| id | column_abc |
|----|------------|
| 1  | abc        |
| 2  | NULL       |
| 3  | NULL       |


id 2の行も3の行も値が入ってるのにNULL扱いに...
これを避けるにはIFNULLを使用します.

```
SELECT id, CONCAT(IFNULL(column_a, ""), IFNULL(column_b, ""), IFNULL(column_c,"")) AS column_abc FROM `test_201503`;
```

すると, 期待していた値が表示されます.


| id | column_abc |
|----|------------|
| 1  | abc        |
| 2  | ab         |
| 3  | ac         |


そもそも文字列型のカラムだとNULLでなく空文字が入ってることが多いので再現少なくて気づきにくいんですよね.


参考:
http://www.happyquality.com/2009/03/16/877.htm
UNSIGNEDなカラムの演算でマイナス値になるとエラーになる


普段MySQL使っていても意外と忘れるのでこちらに備忘録として残します.

例えば, こんな感じのtestテーブルがあるとします.

| # | Column Name     | 種別  | 属性      |
|---|-----------------|------|----------|
| 1 | id              | int  |          |
| 2 | signed_column   | int  |          |
| 3 | unsigned_column | int  | unsigned |

ここに signed_column: 1, unsigned_column: 1としてデータを挿入します.

| id | signed_column | unsigned_column |
|----|---------------|-----------------|
| 1  | 1             | 1               |

2つのカラムを合算するようなqueryを実行します.

```
SELECT id, `signed_column` + `unsigned_column` AS sum FROM `test`;
```

当然このqueryの結果は, 下記のようになります.


| id | sum |
|----|-----|
| 1  | 2   |

次に同様に, signed_column:-2, unsigned_column: 1としてデータを挿入します.


| id | signed_column | unsigned_column |
|----|---------------|-----------------|
| 1  | 1             | 1               |
| 2  | -2            | 1               |

先ほどと同じqueryを実行します.

```
SELECT id, `signed_column` + `unsigned_column` AS sum FROM `test`
```

すると, 下記のようなエラーになってしまいます...

```
#1690 - BIGINT UNSIGNED value is out of range in '(`test`.`signed_column` + `test`.`unsigned_column`)';
```

このエラーを防ぐにはUNSIGNEDなカラムをCASTしてから計算すると良いです.


```
SELECT id, `signed_column` + CAST(`unsigned_column` AS SIGNED) AS sum FROM `test`;
```

これで求めていた結果が算出できるようになります.


| id | sum |
|----|-----|
| 1  | 2   |
| 2  | -1  |

両方がINT型だと思って単純に計算しようとしてもこういった意外なところでエラーになるので気をつけたいですね.


参考: 
http://d.hatena.ne.jp/bs_outcast/20110820/1313829684
SKAction.followPath におけるCGPath の使い方

SKAction.followPath でのCGPathの使い方を理解したので振り返りつつメモ


```lang:example

// CGPath の宣言
let path:CGMutablePath = CGPathCreateMutable()
// 始点を決定
CGPathMoveToPoint(path, nil, -130.0, 300.0)
// ラインを追加
CGPathAddLineToPoint(path, nil, 130.0, 300.0)
CGPathAddLineToPoint(path, nil, -130.0, 300.0)
// CGPath を閉じる
CGPathCloseSubpath(path)

let sequenceLeft = SKAction.followPath(path, asOffset: false,orientToPath: false, duration: 5.0)
self.moveBall?.runAction(SKAction.repeatActionForever(sequenceLeft))

```

CGPath は生成した後にラインを追加して、閉じてやらないといけないようだ。
その辺を理解せずに動かそうとするとCGPathMoveToPoint()を複数回呼んで、結果全く動かないなんてことが起こる

参考
[follow path for SKAction not working](http://stackoverflow.com/questions/20545839/follow-path-for-skaction-not-working)