OmniAICreator/Qiita-1.07M huggingface dataset:
任意の文字集合から成るM桁のN進数をジェネレータで生成する

# はじめに

- [1時間以内に解けなければプログラマ失格となってしまう5つの問題をPHPで解く](http://qiita.com/mpyw/items/bc58e20eee7d6caea704)

ここの解答5にて、3進数8桁を生成する解法を使いました。しかし例えばこれがもし**62進数10桁**のような膨大なスケールになったと仮定すると、以下のような問題が発生します。

- この解法を使うと整数がオーバーフローする。かといってこれのためにわざわざGMP数やBCMath関数を使うかというと悩みどころ。
- 再帰させて配列にする方法だと配列生成処理が終わらないあるいはメモリ制限をオーバーする。時間がかかるにしても逐次処理させていきたい。

そこで…PHP5.5で導入されたジェネレータの出番なんです。

# 実装


**※ ジェネレータ内で`return`出来るようになったのはPHP7以降のようであり、それより古い環境に対応させるために`return`を使わずに済む条件分岐に書き換えました。**

## ジェネレータ定義

- 長さが2以上のとき、現コールスタックから見た最大桁を生成し、そのそれぞれについて、残りの全ての桁が結合されたものを再帰呼び出しによって生成します。これらを結合して返します。
- 長さが2未満1以上のとき、1桁だけを生成して返します。
- 長さが1未満のとき、生成を即座に終了します。実際に再帰でこの呼び出しが行われることはありません。

```php
function generate(array $chars, $length) {
    if ($length >= 2) {
        foreach ($chars as $char) {
            foreach (generate($chars, $length - 1) as $string) {
                yield $char . $string;
            }
        }
    } elseif ($length >= 1) {
        foreach ($chars as $char) {
            yield $char;
        }
    }
}
```

```php:(参考)&#32;ジェネレータの代わりに配列を生成する場合のコード
function collect(array $chars, $length) {
    if ($length >= 2) {
        $strings = [];
        foreach ($chars as $char) {
            foreach (collect($chars, $length - 1) as $string) {
                $strings[] = $char . $string;
            }
        }
        return $strings;
    } elseif ($length >= 1) {
        return $chars;
    } else {
        return [];
    }
}
```

## 使用例

```php
// 半角英数字とアンダースコア
$chars = array_merge(
    range(0, 9),
    range('a', 'z'),
    range('A', 'Z'),
    ['_']
);

// 3桁で出力
foreach (generate($chars, 3) as $string) {
    echo $string . PHP_EOL;
}

/*
000
001
002
003
004
...
__W
__X
__Y
__Z
___
*/
```
UIImagePickerControllerをStoryBoardで表現することがiOS8で出来なくなった。


#前置き
来週にはiOS9も来るというのに、いまさらながら気づいた問題があったので備忘録です。
間違った内容があったら、ご指摘してください。

iOS7まではStoryBoard上でUIImagePickerControllerを指定することが可能でした。
UIViewControllerを配置して、インスペクター上のCustom ClassでUIImagePickerControllerを指定することで簡単に遷移状態を表現することが可能でした。
UIImagePickerControllerはサブクラス作れないので、細かい設定は呼び出し元のprepareForSegueで指定する必要があったりはするんですが。

ところがiOS8からはUIImagePickerControllerはNSOperationQueue内でpresentViewController等コールする必要ができた。
しかし、通常のStoryBoardのsegueでは表示方法はStoryBoard任せになるので、NSOperationQueue内に記述することができない。

いろいろ検討してみる余地はあるんですが、一番コスト低いのは結局UIImagePickerControllerの呼び出しを無理にStoryBoardで表現せずにハードコーディングすることでした。

#実装

```
- (void)doImagePickerController
{
  UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
  imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  imagePicker.allowsEditing = NO;
  imagePicker.delegate = self;
  
  [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self presentViewController:imagePicker animated:YES completion:nil];
  }];
}

#pragma mark <UIImagePickerControllerDelegate>

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
  [self dismissViewControllerAnimated:YES completion:nil];
  //TODO:

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
  [self dismissViewControllerAnimated:YES completion:nil];
}

```

#検討
カスタムSegueを実装してみることも考えたんですが、ハードコーディングすれば上記のコード量で済むので、おそらくこれが最小コストだろうということで辞めました。

#参考記事
http://iphone-app-developer.seesaa.net/article/405948027.html
[Objective-C] スクロール量から現在のスクロール速度を求める



スクロール速度などを計測して処理をする、というときとかに使う感じのやつ。
（ちなみに `previous` 系は全部 `0` で初期化しておきます）

```objc
// 毎フレームここが呼ばれる想定
- (void)updateVelocity:(NSInteger)position

    // 初期位置が設定されていなかったら設定だけする
    if (self.previousPosition == 0) {
        self.previousTime     = [[NSDate date] timeIntervalSince1970];
        self.previousPosition = position;
        return;
    }

    // 離散時間
    const NSTimeInterval now       = [[NSDate date] timeIntervalSince1970];
    const NSTimeInterval deltaTime = now - self.previousTime;

    // 位置の差分
    const NSInteger deltaPosition = position - self.previousPosition;

    // 前回差分からの速度を計算
    CGFloat velocity = (CGFloat)deltaPosition / deltaTime;

    // 速度の差分を計算
    const CGFloat deltaVelocity = velocity - self.previousVelocity;

    // 加速度を加算
    const CGFloat acceleration = deltaVelocity / deltaTime;

    // 加速度の差分を計算
    const CGFloat deltaAcceleration = acceleration - self.previousAcceleration;

    // 加速度を更新
    self.acceleration += deltaAcceleration;

    // 求めた加速度から現在の速度を計算
    self.velocity += self.acceleration * deltaTime;

    NSLog(@"VELOCITY    : %10.2f", self.velocity);
    NSLog(@"ACCELERATION: %10.2f", self.acceleration);

    // 計算したものを次のフレームのために「前回データ」として保持しておく
    self.previousTime         = now;
    self.previousPosition     = position;
    self.previousVelocity     = velocity;
    self.previousAcceleration = acceleration;
}
```

## 解説

離散で位置と速度を扱うため、まず前回との差分時間を出す。いわゆる $⊿t$ 。
そしてその時間を単位として計算をしていく。

### 位置から速度を算出

まずは前回位置からの差分で速度を算出する。
差分位置 ÷ 離散時間で求まる。

### 速度から加速度を計算

位置と同じように速度も同様にして「前回の速度から今回の速度」の差分を取り、それを離散時間で割り、加速度を求める。

### 加速度の差分を計算

さらに、加速度も同様にして前回からの変化量を計算する。

つまり結論として、 **位置、速度、加速度すべてで該当フレーム時間での微分** を行っているイメージ。
（加速度の微分はなんていうのか知らないけど）

### 加速度から速度を計算

最後に求めた加速度の変化量を現在の加速度に足し込む。
その計算結果が現時点での実際の加速度となる。

そして今まで利用してきた離散時間当たりの速度を求める。
計算としては今まさに計算が終わった現時点の加速度に離散時間をかけることで、その瞬間の実際の速度の変化が計算できる。
そしてそれを現在の速度に足すことにより、最終的に「今の速度」を求めることができる。

あとはこの速度を元にやりたい処理を行えばいい。（例えば慣性だったり、速度に応じた演出だったり）
npmでfluctがインストールできなかった


MacOS X Yosemite に nodebrewを使ってnode/npmをインストール。
そのあと、fluctをインストールしようとしたら失敗して困った件


## nodebrewのインストール
Homebrewが入っているとして、nodebrewのインストール。

```
brew install nodebrew
```

nodebrewのバージョンをチェック

```
$ nodebrew -v
$ nodebrew 0.8.1
```

## nodeのインストール

```
nodebrew install-binary stable
```

node/npmのバージョンチェック

```
$ node -v
$ v4.0.0

$ npm -v
$ 2.12.1
```

## npmでfluctインストール(失敗)

```
$ npm install fluct -g
```

と叩いてもエラーがでる。
エラーの内容を残してなかったけど、checksumが不正と。
↓な感じ（違うモジュールのエラーだけど内容的にはこれ）

```
npm ERR! registry error parsing json
npm ERR! Darwin 14.5.0
npm ERR! argv "/Users/Zee/.nvm/versions/io.js/v2.5.0/bin/iojs" "/Users/Zee/.nvm/versions/io.js/v2.5.0/bin/npm" "install"
npm ERR! node v2.5.0
npm ERR! npm  v2.13.2

npm ERR! shasum check failed for /var/folders/yg/bz8zpb3n7p778blpqjrd54hc0000gn/T/npm-99355-5be3067f/registry.npmjs.org/modernizr/-/modernizr-3.0.0.tgz
npm ERR! Expected: c8f2db9ebcf97e68244b767269e54140dfaec5db
npm ERR! Actual:   da39a3ee5e6b4b0d3255bfef95601890afd80709
npm ERR! From:     https://registry.npmjs.org/modernizr/-/modernizr-3.0.0.tgz
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>
```

で、いろいろ調べたけ結果[workaround](https://github.com/npm/npm/issues/9574#issuecomment-139940172)発見

DNSを設定すると。

## DNSの設定
ということで、YosemiteのDNSの設定。

```
$ sudo cp /private/etc/hosts /private/etc/hosts.bak
$ sudo vi /private/etc/hosts
```

で、hostsファイルを編集。

```
23.235.39.162   registry.npmjs.com
23.235.39.162   registry.npmjs.org
```

の２行を追加して、viを閉じる。
で、DNSのcacheをクリアします

```
$ dscacheutil -flushcache
```

これで、準備が完了です

## fluctのインストール（成功！）

```
% npm install fluct -g
/usr/local/bin/fluct -> /usr/local/lib/node_modules/fluct/bin/fluct
fluct@0.3.3 /usr/local/lib/node_modules/fluct
├── open@0.0.5
├── config@1.16.0
├── ejs@2.3.4
├── yazl@2.2.2 (buffer-crc32@0.2.5)
├── commander@2.8.1 (graceful-readlink@1.0.1)
├── mkdirp@0.5.1 (minimist@0.0.8)
├── glob@5.0.14 (path-is-absolute@1.0.0, inherits@2.0.1, once@1.3.2, inflight@1.0.4, minimatch@2.0.10)
├── node-aws-lambda@0.1.6 (async@1.4.2, https-proxy-agent@1.0.0)
├── moment@2.10.6
├── express@4.13.3 (escape-html@1.0.2, merge-descriptors@1.0.0, array-flatten@1.1.1, cookie@0.1.3, utils-merge@1.0.0, cookie-signature@1.0.6, methods@1.1.1, fresh@0.3.0, range-parser@1.0.2, vary@1.0.1, path-to-regexp@0.1.7, etag@1.7.0, content-type@1.0.1, parseurl@1.3.0, content-disposition@0.5.0, serve-static@1.10.0, depd@1.0.1, qs@4.0.0, finalhandler@0.4.0, on-finished@2.3.0, debug@2.2.0, proxy-addr@1.0.8, send@0.13.0, accepts@1.2.13, type-is@1.6.8)
├── amazon-api-gateway-client@0.1.3 (stackable-fetcher-aws-signer-v4@0.0.1, stackable-fetcher@0.3.0)
└── aws-sdk@2.2.1 (xmlbuilder@0.4.2, xml2js@0.2.8, sax@0.5.3)
```
Linux(Ubuntu)で、RaspberryPiのSDカードをインストールする方法

##概要
公式ページの通りにすれば、そのままSDカードを作成できます。
本稿は、日本語で解説になります。
[INSTALLING OPERATING SYSTEM IMAGES ON LINUX](https://www.raspberrypi.org/documentation/installation/installing-images/linux.md)

##SDカードのデバイス名を調べる
`df -h`コマンドをSDカードをリーダーへ挿入する前と挿入した後の２回コマンドを実行します。

```
$ df -h
```
コマンド結果の差分を見て、マウントされたSDカードのデバイス名を調べます。
おそらく`/dev/sdb`みたいな名前になっていると思います。
もしくは、`/dev/sdb1` `/dev/sdb2`のようにパーティションが別れて複数マウントされているかも知れません。

##アンマウントする
書き込みをする前に、SDカードをアンマウントする必要があります。

```
$ umount /dev/sdb1
$ umount /dev/sdb2
```

##OSのイメージファイルをダウンロードする
zip圧縮されていますので、解凍します。
[Raspbian Download](https://www.raspberrypi.org/downloads/)

##書き込みを行う
パーティションの番号を指定せずに、DDコマンドで、書き込みを行います。
公式ページにも書いてありますが、長時間コマンドの戻りが無い状態が続きますので、気長に待ちます。
プログレス表示される方法についての説明もありますが、よく理解できませんでしたw

```
$ sudo dd bs=4M if=2015-05-05-raspbian-wheezy.img of=/dev/sdb
```

##SDカードをアンマウントする
`sync`コマンドで、キャッシュを同期させてからSDカードをリーダーから抜きます。

```
$ sync
```
コンストラクタの実行順

## コンストラクタの役割
- インスタンス生成時、そのインスタンスが他の場所で使われる前に初期化処理をしてくれる

## コンストラクタのルール
- コンストラクタ名はクラス名と同じ
- 戻り値は指定できない
- 呼び出されるタイミングはインスタンス生成時のみ

## デフォルトコンストラクタ
- コンストラクタがないとインスタンスの初期化処理ができない。よって、明示的にコンストラクタを定義していない場合（コードを書いていない）、コンパイラが自動的に引数のないコンストラクタを生成してくれる

## コンストラクタのオーバーロード
- 引数ありのコンストラクタを記述することができる
- その場合、引数なしコンストラクタからthis()を使って、呼び出すことが可能
- this()はデフォルトコンストラク内の１行目に記述しなければならない

# スーパークラス・サブクラスのコンストラクタの実行のタイミング
継承関係のスーパークラスとサブクラスがあるとき、サブクラスのインスタンスを生成すると、両クラスのコンストラクタが実行される。（＊この仕組みはコンストラクタチェーンという）
＜実行順序＞
1.サブクラスのコンストラクタが呼び出される
2.スーパークラスのコンストラクタが呼び出される
3.スーパークラスのコンストラクタが実行される
4.サブクラスのコンストラクタが実行される

    public class Child extends Parent {
        public Child() {
            super();
        }
    }

上のコードのようにコンパイル時にサブクラスのコンストラクタの1行目でスーパークラスのコンストラクタ呼び出しが行われる。
OS X に Microsoft Edge テスト環境を作る（VirtualBox）


Windows 10 / Edge 環境を用意する手順。


## VirtualBox と vagrant をインストールする

環境がなければ `brew` でインストールします。

```
% brew install Caskroom/cask/virtualbox
% brew install Caskroom/cask/virtualbox-extension-pack
% brew install Caskroom/cask/vagrant

% vagrant --version
Vagrant 2.0.4
% VirtualBox --help
Oracle VM VirtualBox Manager 5.2.10
    :
```


## イメージファイルをダウンロードする

~~またアドレスが変わってますね。:confounded:~~
Microsoft のサイトからダウンロードします。

> [Free Virtual Machines from IE8 to MS Edge - Microsoft Edge Development](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)


選択肢はこんな形。

![スクリーンショット 2015-09-16 21.41.11.png](https://qiita-image-store.s3.amazonaws.com/0/19223/87e14f37-be35-c562-f378-3a4508141b44.png "セレクトボックスから、ダウンロード可能なVMリストを探す")

.zip ファイルをダウンロードします。
気長に待ちましょう。


## .ova を VirtualBox に登録する

ダウンロードしたファイルを `unzip` します。

```
% unzip ~/Downloads/MSEdge.Win10.VirtualBox.zip -d ~/Downloads
```

次に VirtualBox を起動し、「ファイル ＞ 仮想アプライアンスのインポート」メニューから、.ova を登録します。
上記であれば `~/Downloads` 以下にあります。


## スナップショットの作成と起動

VirtualBox の GUI から「マシンツール ＞ スナップショット」を選択します。
カメラアイコンをクリックし、分かりやすい名前を付けます。

![2015_09_16_23_54.png](https://qiita-image-store.s3.amazonaws.com/0/19223/8afddd4e-edbd-00c3-a3c1-5cc54efc9f96.png "カメラアイコンをクリックする")

起動してみましょう。

![2015_09_17_0_01.png](https://qiita-image-store.s3.amazonaws.com/0/19223/b65e936d-912f-cbe1-43a4-d289ad55ddca.png "googleを表示する")

起動が確認できたらイメージファイルは不要になりますので、`~/Downloads/MSEdge.Win10.VirtualBox.zip` と `~/Downloads/MSEdge - Win10.ova` は削除しましょう。


## ログインパスワード

View installation instructions からダウンロードできるインストールの手引き（PDF）に記載されています。

- ID: `IEUser`
- Password: `Passw0rd!`


## 日本語フォントを設定する

このままの状態では日本語フォントが正しく表示されません。

before
![edge1.png](https://qiita-image-store.s3.amazonaws.com/0/19223/e5b4619d-019f-da96-3a8f-f790686dfcaf.png)


左下の「ウィンドウメニュー ＞ Settings」から設定を行います。
「Time & language」を選択します。

![edge2.png](https://qiita-image-store.s3.amazonaws.com/0/19223/a25b58f3-61a3-12c2-280c-bd47908980cf.png)

「Country or region ＞ Japan」を選択します。
また「Languages ＞ Add a language」から「日本語」を選択します。
あわせて右クリックからディフォルト設定します。

![edge3.png](https://qiita-image-store.s3.amazonaws.com/0/19223/7c9b0298-a584-4600-3d08-4296d66fcb40.png)

以上で日本語フォントがキレイに表示されました。

after
![edge4.png](https://qiita-image-store.s3.amazonaws.com/0/19223/3796ef75-ad63-8573-006a-db65e9b2c45b.png)


## 参考

* [MacにIEテスト環境を作る（VirtualBox 編） | deadwood](http://www.d-wood.com/blog/2014/01/27_5343.html)
elasticsearchでtemplateをconfigファイルで管理する方法


通常上記のtemplateをelasticsearchに登録する場合は、以下のようなhttpリクエストを送って行います。

```
curl -XPUT localhost:9200/_template/template1 -d `cat template1.json`'
```

しかし、ansibleなどを使った場合、curlでtemplateを登録しようとすると「まだelasticsearchがready状態じゃないからリクエストを受け付けてくれない」場合があるので、ファイルでtemplateを管理する方法を記載します。

## elasticsearchのtemplateとは
elasticsearchでは、template（データベースでいうschema）を定義できます。
urlなどを保存する場合、elasticsearchが勝手にurlを解析して、protocol,domainなどに分けてしまい、解析に支障が出る場合があります。
その際は、urlフィールドが勝手に解析されないよう、以下のようなtemplateを定義することになると思います。

```:template1.json
{
  "template":"{{ index名 }}-*",
  "mappings":{
    "{{ タイプ名 }}":{
      "_source": { "compress": true },
      "properties":{
        "url":{"type":"multi_field",
          "fields":{
            "url":{"type":"string","index":"analyzed"},
            "full":"type":"string","index":"not_analyzed"}
          }
        }
      }
    }
  }
}
```

## templateをconfigファイルで管理する方法
1.```/etc/elasticsearch/elasticsearch.yml```にて、path.confを定義します。

```elasticsearch.yml
# Path to directory containing configuration (this file and logging.yml):
# ↓アンコメント
path.conf: /usr/share/elasticsearch/config

```

2.```/usr/share/elasticsearch/config/templates```に先ほどの```template1.json```ファイルをおきます
MacのGenymotion(無料版)で簡単にスクリーンショットを撮る方法


1.シェルスクリプトを書く

```shell:adb_screen.sh
FILENAME="screenshot_`date \"+%Y%m%d%H%M%S\"`.png"
while getopts n: opt
do
    if test $opt = "n"
    then
        FILENAME=${OPTARG}
    fi
done
adb shell screencap -p /sdcard/$FILENAME
adb pull /sdcard/$FILENAME $(cd $(dirname $0) && pwd)/screenshots/$FILENAME
adb shell rm /sdcard/$FILENAME
```

普通にテキストエディタとかにコピペして"XXX.sh"で保存してください。
<br>

2.パーミッションの変更
"XXX.sh"（ここではadb_screen.sh）のあるフォルダに移動してから

```
chmod 755 adb_screen.sh
```
<br>

3.スクリプトの実行とオプション
後は下のコマンドでスクリーンショットが撮影されます。

```
adb_screen.sh
```

撮影された画像は、スクリプトフォルダ内の "screenshots" ディレクトリに保存されます。
ファイル名は"screenshot_20150916222704.png"の様に "screenshot_年+月+日+時+分+秒.png" となります。
<br>

__オプション__

```
XXX.sh -n yyyy.png
```
とすれば、yyyy.pngというファイル名で保存されます。
YQLを使ってYahoo! Financeから為替レートを取得する

意外に日本では知られていないのですが、[Yahoo! Inc.](https://www.yahoo.com/)の便利な[YQL](https://developer.yahoo.com/yql)を使うと、WebサイトのスクレイピングやWebサービスをSQL風なシンタックスでクエリすることができます。

## YQL

[YQL](https://developer.yahoo.com/yql)はYahoo! Query Languageのab略語になります。YQLを使うとWebを通してデータのクエリやフィルター、結合などを1つのインタフェースから行うことができます。SQL風なシンタックスなので、開発者に馴染みがあり、データを正確に抽出したい場合に適しています。

## 為替レートを取得する

YQLから[Yahoo! Finance](http://finance.yahoo.com/)の[yahoo.finance.xchange](https://github.com/yql/yql-tables/blob/master/yahoo/finance/yahoo.finance.xchange.xml)テーブルを使います。

以下のURLをHTTP GETするとJSON形式で為替レートを取得することができます。URIエンコードしています。

https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22USDJPY,EURJPY,JPYJPY%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys

この例では、USD/JPY、EUR/JPY、JPY/JPYの為替レートを取得しています。それぞれ1ドル、1ユーロ、1円が何円になるかのデータになります。1円は当然ながら1円です。


取得したJSON

```json
{"query":{"count":3,"created":"2015-09-16T14:10:33Z","lang":"ja","results":{"rate":[{"id":"USDJPY","Name":"USD/JPY","Rate":"120.4465","Date":"9/16/2015","Time":"3:10pm","Ask":"120.4490","Bid":"120.4465"},{"id":"EURJPY","Name":"EUR/JPY","Rate":"136.0700","Date":"9/16/2015","Time":"3:10pm","Ask":"136.0800","Bid":"136.0600"},{"id":"JPYJPY","Name":"JPY/JPY","Rate":"1.0000","Date":"9/16/2015","Time":"3:10pm","Ask":"1.0000","Bid":"1.0000"}]}}}
```
select(プルダウン) の文字を左右中央揃えにしたいときのCSSメモ


![cap_ 2015-09-16 22.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/48396/6c3772fa-cca2-c362-7c63-345c056e5356.png)


## select に `text-align:center`は効かない

`select` タグのテキストを左右中央にしたいのですが、
`text-align: center;` が効かず、
`text-indent`を%指定したりすればインデントされるのですが、
文字数が不確定の場合はうまいこといきません。


無理矢理な方法ですが、
selectの文字自体は透明にしておき、selectと同じ幅の `p` なりに同じテキストを入れて、これに`text-align:center` をするのはどうか、というサンプルです。

## サンプルデモ
Codepen
http://codepen.io/skwbr/pen/JYGQLv


## コード

```html:html
<div class="btn-select">
<p class="label">選択してください</p>
<select class='select'>
  <option value=''>選択してください</option>
  <option value='1'>選択肢1</option>
  <option value='2'>選択肢2</option>
  <option value='3'>選択肢3</option>
</select>
</label>
</div>
```

はじめ p をselectの上に乗せて、`pointer-events: none;` でクリックを背面(select)に送っていたのですが、IE10以前で `pointer-events` が効かないようなので、`select` をopacityで透明にして、クリックは受け付けつつ背面のpが見えるように、という感じにしています。

```css:css
body {
  text-align: center;
}

.btn-select {
  width: 300px;
  margin: 20px auto;
  position: relative;
  background: #333;
  border-radius: 6px;
  cursor: pointer; /* IEでcursorがチラついたので */
}

.label {
  color: #fff;
  position: absolute;
  width: 100%;
  z-index: 1;
}

.select {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  display: block;
  cursor: pointer;
  width: 100%;
  border: none;
  padding: 20px;
  opacity: 0;
  position: relative;
  z-index: 2;
}

/* IE10以上で矢印を消す */
.select::-ms-expand {
  display: none; 
}

/* フォーカス時 */
.select:focus {
  z-index: -1;
  opacity: 1;
}
```

ラベルの変わらないボタン的に使う場合は、JSは不要ですが、
selectと同じようにonchangeでラベルを変えたいときはやはりJSを用います。

```js:js
// selectと同じようにonchangeでラベルを変えたいときはJSを用いる
$('.select').on('change', function(){
  
  var $this = $(this)
  var $option = $this.find('option:selected');
  $('.label').text($option.text());
  
  // onchange後にフォーカスしてるのが嫌な場合
  $this.blur();
  
});
```

Webアクセシビリティ的な問題もありそうですが、
ひとつの一例として紹介でした。


## 出典/参考

"CSS pointer-events (for HTML) | Can I use..."
http://caniuse.com/#feat=pointer-events

"CSSだけで\<select>をカスタマイズする - Qiita"
http://qiita.com/hiloki@github/items/844726db4128ebb0fdd8
「アジャイルサムライ読書会 廣島道場　２−８」に参加したよ

https://sukusuku-scrum-hiroshima.doorkeeper.jp/events/31212

今日は間に合いました。だいぶ空いてしまいました。

## 第8章　現実と向き合う

![20150916_samurai_8.png](https://qiita-image-store.s3.amazonaws.com/0/53620/216b86b4-1c4c-cb8f-6aad-3c590e09bcb0.png)

バーンダウンチャートとバーンアップチャートのどちらが好きかの話が面白かったです。

* 終わりがわかるバーンダウンチャート。
* 増えた作業がわかるバーンアップチャート。
* 両方を組み合わせたチャート。

どちらも使ってないので、それぞれ使っている人の感想が聞けて面白かったです。

ぼくは、redmine の backlogs プラグインの「バックログ」「かんばん」を使っています。
直近で何をしないといけないか、長期的に何をする必要があるかは見えるようになっていると思います。

backlogs プラグインにもバーンダウンチャートを表示する機能もありますが、見たこと／見たいと思ったことはありません。（プラグインを入れたばかりのころ見たかな）

バーンダウンチャートとバーンアップチャートを使ってないので、作業のペースを見えるようにできてないかもしれません。

今のプロジェクトでバーンダウンチャートとバーンアップチャートを使わないことで問題が起きてないか、使った方が良い点があるか、考えてみたいっと思います。
Chromeデベロッパーツールの使い方・見方

Webの検証やデバッグをするのに欠かせないツールです。
その概要について。

##Elementsパネル
###左側（ブラウザがHTMLを読み込んだツリー上のオブジェクト。）
要素の編集や位置変更（ドラッグアンドドロップ）、削除が可能。　

###右側（スタイルがどのように適用されているか）

##Networkパネル
このパネルでは、どのタイミングでファイルが読み込まれたかというのを教えてくれます。
###Timeline
読み込まれたファイルが早いものが、左側にあります。
右側にある青い線はツリー上のオブジェクトが構成された状態です。
赤い線は画像などのファイルが全て読み込まれた状態です。

##デベロッパーツールのショートカット

###開くだけ
Ctrl+Shift+i(Win)
Command+Shift+I(Mac)

###要素の検証
Ctrl+Shift+C(Win,Linux)
Command+Shift+C(Mac)

###Consoleタブが開いた状態で開く
Ctrl+Shift+J(Win,Linux)
Command+Shift+J(Mac)

###名前が開いているファイルを開きたい
デベロッパーツールが開いている状態で
Ctrl+O（検索）
Android Lintでチェックしてくれる内容

## Android Lintがチェックしてくれる内容

[ここ](!http://tools.android.com/tips/lint)に何をチェックしてくれるか載っている。

ざっくり意訳すると

- 翻訳が誤ってないか、使ってない翻訳がないか
- レイアウトのパフォーマンス問題
- 使ってないリソースがあるか
- 画像のサイズは適切か
- ハードコーディングしてないか
- アイコン画像に問題ないか。(サイズとか重複とか)
- マニフェストファイルのエラー

## Android Studioでの実行方法

```Analyze → Inspect Code```で実行できます。
英語が嫌いな人の為のChrome拡張機能

# 英語が嫌いだ

私のことですね。
Web上のドキュメントを見ていたりすると、日本語と期待して開いたのにずらっと英語が出てきて目の前が真っ暗になることが多々有ります。
私はまるっきり英語が読めませんので、いちいち翻訳サイトに行くことになります:persevere:

わからない単語・文章が出るたびに新しいタブを開き、「ほにゃく」と打つ。
(なぜか毎回ほんやくと打てない。タイピングマスターになりたい。)

でも、いちいちタブを切り替えたりいったりきたりするのも面倒だ！
英語の為になぜここまでしなきゃいけないんだ:pensive:！

ということで、そんな時の為のChromeの拡張機能をご紹介します。

# どこでも翻訳 Translate Anywhere

![スクリーンショット 2015-09-16 22.23.33.png](https://qiita-image-store.s3.amazonaws.com/0/53734/e48012da-c826-755c-36f6-1abcf5ba91c6.png)

この子をChromeに追加するだけで、翻訳ツールがツールバーに常駐してくれます。
勿論英語だけではなく、中国語や韓国語、フランス語など様々な言語に対応しています。

また、「英語じゃないことはわかるけど…何語かわからない…」なんて時も、

![スクリーンショット 2015-09-16 22.29.15.png](https://qiita-image-store.s3.amazonaws.com/0/53734/154dcf9f-d2a4-b9d2-f7cd-0dc62a857123.png)

ちゃんと自動検知して翻訳してくれます！
だから私は日本語以外出来ないんですね！

上記画像の音声マークをクリックすれば、どう発音するのかも聞くことができます。

翻訳エンジンはExcite翻訳かGoogle翻訳の二択です。

英語が苦手で、毎回翻訳サイトを使用している方はぜひ使用してみてください :blush:
Rakeタスクのテストの仕方

ここんとこ、バッチ処理周りをRakeタスクで解決することが多くなってきた。

実のところRakeタスク自体のUnitTestは書いてなくて、Rakeタスク叩いての「いきなり結合テスト」での検証にとどまっていた。

より高い安心感を求めてUnitTestするためにRakeタスクのUnitTestに取り組んでみる。

### Goal
- rspec コードから rake タスクの呼び出す

### 前提
- rspec


### 何はともあれ、Rakeタスクの準備
```lib/tasks/csv.rake
namespace :csv
  desc 'CSVのexport'
  task export: :environment do |t|
    puts t.name
  end

  desc 'CSVのimport'
  task import: :environment do |t|
    puts t.name
  end
end
```

○実行確認

```shell-session
$ bundle exec rake csv:import
(in /Users/kawakubox/workspace/rails-labo)
csv:import

$ bundle exec rake csv:export
(in /Users/kawakubox/workspace/rails-labo)
csv:export
```

### specコードの作成
modelやcontrollerに倣って、spec/lib/tasks/csv_spec.rb を作成

```spec/lib/tasks/csv_spec.rb
require 'rails_helper'
require 'rake'

describe 'rake task csv' do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake
    Rake.application.rake_require 'tasks/csv' # Point 1
    Rake::Task.define_task(:environment)
  end

  before(:each) do
    @rake[task].reenable  # Point 2
  end

  describe 'csv:import' do
    let(:task) { 'csv:import' }
    it 'is succeed.' do
      expect(@rake[task].invoke).to be_truthy
    end
  end
end
```

○テスト実行

```shell-session
$ bundle exec rspec
csv:import
.

Finished in 0.00301 seconds (files took 3.27 seconds to load)
1 example, 0 failures
```

#### Point 1
`Rake.application.rake_require 'tasks/csv'` でloadする.rakeファイルを指定するが、参考にした[サンプル](http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_rspec_rake_test/)通りに記述したら、csv.rakeがロードできないと怒られた。

```shell-session

  1) rake task csv csv:import 
     Failure/Error: Rake.application.rake_require 'csv'
     LoadError:
       Can't find csv
     # ./spec/lib/tasks/csv_spec.rb:8:in `block (2 levels) in <top (required)>'
```

`Rake.application.rake_require 'tasks/csv'`直前に`binding.pry`を差し込んで `$LOAD_PATH` を確認したところ、lib/ まで通っていたので、`tasks/csv` としたら無事ロードされた。

config/application.rb の設定次第で適宜変えればよいかな。

#### Point 2
`@rake[task].reenable` spec内で同一タスクを2回以上実行しないのであれば不要。

### 参考
[[Ruby on Rails]RSpecによるRakeのテスト ｜ Developers.IO](http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_rspec_rake_test/)
[Rake タスクをテストコードの中で複数回実行する](http://qiita.com/morygonzalez/items/699749c631f66e62637b)
機械学習に必要と言われるので偏微分を勉強します.

# 偏微分

## 参考文献
1. 海野 裕也  (著)，岡野原 大輔  (著)，得居 誠也  (著)，徳永 拓之  (著):『[オンライン機械学習 (機械学習プロフェッショナルシリーズ)](http://amzn.to/2ekqQmB)』講談社，2015．  
1. [線形代数学とは by.大学の物理学](https://youtu.be/3Dpu4EruDno)

***
偏微分の記号　$∂$
del,partial d,rounded d と読まれることが多い.

偏微分とは,多変数関数を,注目している変数以外は定数だとみなして微分すること.
$ \frac{\partial}{\partial x} $は $x$について偏微分する = $x$だけを変数と思い微分せよ = $x$以外は定数と見なせ
***
関数 $f(x,y)$を$x$で偏微分したものを,次式のように書く.

$$ \frac{\partial f(x,y)}{\partial x} =\frac{\partial}{\partial x}f(x,y)=\left(\frac{\partial f}{\partial x}\right)_{y}=\frac{\partial f}{\partial x}$$

$$ = f_{x}={\partial}_{x}f $$ # 続けて書けなかったので2段になっていますが,すべて同じ意味です. 

オーソドックスな書き方 $$ =\frac{\partial}{\partial x}f(x,y) $$

$y$は係数とみなした書き方$$  =\left(\frac{\partial f}{\partial x}\right)_{y}$$

右下を省略した書き方$$ =\frac{\partial f}{\partial x}$$

$f$を$x$について偏微分した書き方$$ = f_{x}={\partial}_{x}f$$

***
# 例
$x^{3}y^{2}$を$x$について偏微分するとする
$$ \frac{\partial}{\partial x}(x^{3}y^{2}) = 3x^{2}y^{2}$$
$x^{3}$は微分し, $3x^{2}$になり, $y^{2}$は定数とみなしている.

$x^{3}y^{2}$を$y$について偏微分するとする
$$ \frac{\partial}{\partial y}(x^{3}y^{2}) = 2x^{3}y$$
$y^{2}$は微分し, $2y$になり, $x^{3}$は定数とみなしている.

$x^{3}y^{2}$を$z$について偏微分するとする
$$ \frac{\partial}{\partial z}(x^{3}y^{2}) = 0$$
$z$で微分し, $x^{3}y^{2}$は定数とみなしている.
***
例えば, $ f(x,y) = 2x + xy + y $という関数があった場合, これを$x$や$y$で偏微分すると,次式のように計算できる.

$$ \frac{\partial f(x,y)}{\partial x} = 2 + y $$

$$\frac{\partial f(x,y)}{\partial y} = x + 1 $$
***
## 二階偏微分
偏微分した式をもう一度偏微分したもの　　
$$ \frac{\partial^{2} f}{\partial x^{2}} = \frac{\partial}{\partial x} (\frac{\partial f}{\partial x})= f_{xx} = {\partial}_{x}^{2}f $$

偏微分は $ f(x) = x^{2} $ のとき
$$ \frac{\partial f}{\partial x} = 2x $$

二階偏微分は $ f(x) = x^{2} $ のとき
$$ \frac{\partial^{2} f}{\partial x^{2}} =2 $$
SLComposeViewController

# SLComposeViewController
iPhoneにデフォルトで組み込まれているサービスのアカウントを使ってコンテンツを共有するためのVC

## ドキュメント
[SLComposeViewController](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Reference/SLComposeViewController_Class/)

## 対応サービス
2015/09/16時点では、Twitter, Facebook, SinaWeibo, TencentWeibo, LinkedInの5つに対応している
[Service Type Constants](https://developer.apple.com/library/mac/documentation/Social/Reference/SLRequest_Class/#//apple_ref/doc/constant_group/Service_Type_Constants)

## 利用方法
* ターゲットのBuild SettingsからSocial.frameworkを追加
![image](https://qiita-image-store.s3.amazonaws.com/0/18486/a3b1e7f6-6653-592c-549d-9d78ba218568.png)

* importして
![image](https://qiita-image-store.s3.amazonaws.com/0/18486/3e66bcac-97ae-dc31-1d7b-ce50ab3dffe7.png)


* SLComposeViewControllerに対象サービスを指定してインスタンスを生成
![image](https://qiita-image-store.s3.amazonaws.com/0/18486/18a66bdd-b64e-847a-4a16-d9a718f552d4.png)

* シンプルな投稿UIが出てくる
![image](https://qiita-image-store.s3.amazonaws.com/0/18486/65e1f340-7fa0-4811-e046-b0bc6e5b60f0.png)

## 対象サービスに共有可能かの判断
[isAvailableForServiceType](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Reference/SLComposeViewController_Class/#//apple_ref/occ/clm/SLComposeViewController/isAvailableForServiceType:) を使用して該当サービスに共有が可能か判断できる。

サービスごとに若干挙動が違う模様(検証端末iOS8.1.3)


### Facebook

| iPhoneのアカウント設定有無 | アプリの状態 | 共有可否 | 
|---|---|---|
|無|未インストール | 不可「Facebookアカウントがありません」というアラートが表示される|
|有|未インストール | 可能 |
|無|未ログイン | 不可「ログインしてください」というアラートが表示される|
|有|未ログイン | 不可「ログインしてください」というアラートが表示される|
|無|ログイン済 | 可能 |
|有|ログイン済 | 可能 |

### Twitter
| iPhoneのアカウント設定有無 | アプリの状態 | 共有不可 | 
|---|---|---|
|無|未インストール | 不可「Twitterアカウントがありません」というアラートが表示される |
|有|未インストール | 可能 |
|無|未ログイン | 不可「Twitterアカウントがありません」というアラートが表示される |
|有|未ログイン | 可能 |
|無|ログイン済 | 不可「Twitterアカウントがありません」というアラートが表示される |
|有|ログイン済 | 可能 | 


その他は未検証なので不明
es6でrefluxjsするときのmixin方法

babelを使ってES6でRefluxJSを使ってみたところReactのmixinを使ってリスナーを指定する部分ができなくて困ってしまったのでメモ。

classではなくfunctionをexportするようにして、function内でclass作成する。
classを作成したらreact-mixinというライブラリを使ってmixinする。
なんかもっといい方法ありそうな気はする。

```js:my_component.js
import React from "react";
import ReactMixin from 'react-mixin';

export default function CreateMyComponent(store) {
  class MyComponent extends React.Component {
    render: { ... }
  }
  ReactMixin(MyComponent.prototype, Reflux.listenTo(store, "onValueChange"));
  return MyComponent;
}
```
Ruby で super を呼んだ時の呼ばれる順番

気になったので調べた。

この順番で呼ばれる

- 特異メソッド
- extended module のメソッド 
- class構文に書かれたメソッド
- included module のメソッド
- 親クラスのメソッド

include、extend の位置は関係なくこの順番。

include, extend される module で同名のメソッドがあった場合は、最後に include, extend された順番になる。

親クラスですでに include されている module は、子クラスで再度 include されても順番は親クラスの位置。

```rb
("A".."H").each do |name|
  eval <<-MODULE
    module #{name}
      def hoge
        "#{name} -> " + super
      end
    end
  MODULE
end

class Base
  def hoge
    "Base"
  end
end

class TestClass < Base
  include A
  include B
  def hoge
    "TestClass -> " + super
  end
  include C
  include D
end

t = TestClass.new
t.extend E
t.extend F
def t.hoge
  "t -> " + super
end
t.extend G
t.extend H

p t.hoge #=> "t -> H -> G -> F -> E -> TestClass -> D -> C -> B -> A -> Base"

class TestClass2 < TestClass
  include A
  include B
  def hoge
    "TestClass2 -> " + super
  end
  include C
  include D
end

t = TestClass2.new
p t.hoge #=> "TestClass2 -> TestClass -> D -> C -> B -> A -> Base"
```
SendGrid の bounce や invalid に入ったメールアドレスを PHP アプリケーションから削除する


# 課題

SendGrid API を扱う公式ライブラリとして [sendgrid/sendgrid](https://github.com/sendgrid/sendgrid-php) や [sendgrid/smtpapi](https://github.com/sendgrid/smtpapi-php) があるが、いずれも [Web API](https://sendgrid.com/docs/API_Reference/Web_API/index.html) の各種 Endpoint に対応していない.

# 前提

[sendgrid-php v3.2.0](https://github.com/sendgrid/sendgrid-php/tree/v3.2.0) で確認.

# 解決策

`SendGrid` のインスタンスメソッド `postRequest()` が public に叩けるので、ここに任意の Web API エンドポイントを直接指定してやれば良い.

## bounceリストに入ったアドレスを削除

```
$endpoint = "/api/bounces.delete.json";
$sg = new SendGrid("<api_user>", "<api_key>");

$form = [
    "api_user" => "<api_user>",
    "api_key" => "<api_key>",
    "email" => "<bounceから削除したいメールアドレス>"
];
$sg->postRequest($endpoint, $form)
```

## invalidリストに入ったアドレスを削除

`$endpoint` を `/api/invalidemails.delete.json` にすれば OK.

# 別解

* [SendGrid PHP Library](https://github.com/alonbendavid/SendGrid-PHP-Library)なるものもあったが、試してない.
* リクエスト自体はわりと単純なので、この用途だけなら、あえて `SendGrid` インスタンスを介さなくても良いくらいかも.

# 参考

* [SendGrid Web API](https://sendgrid.com/docs/API_Reference/Web_API/index.html)

# 補足(おまけ)

習作として、composer install できるライブラリにしてみた.

[cu/sendgrid](https://packagist.org/packages/cu/sendgrid)
railsでコネクションプールを使ってredisに接続する

railsはActiveRecordがデータベース周りの処理をすべて面倒見てくれて便利です。けれどもRDMS以外を使うと、少し自分でやらないといけないことが増えます。redisを使うときにコネクションプールを利用する方法のメモです。


# gemファイル

redisのクライアントは[redis](https://github.com/redis/redis-rb)、コネクションプールは[connection_pool](https://github.com/mperham/connection_pool)を使います。

```
gem 'redis'
gem 'connection_pool'
```

## redisの設定ファイル

redisで情報を保存する設定ファイルを用意します。設定ファイルはconfig/redis.ymlで、次のように記述します。

```yaml
default: &default
  host: localhost
  port: 6379

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  host: redis-server
```

## redisのインスタンス化

config/initializers/redis.rb で初期化します。

```rb
# Load the redis.yml configuration file
redis_config = YAML.load_file(Rails.root + 'config/redis.yml')[Rails.env]

Redis.current = ConnectionPool.new(size: 10, timeout: 5) do
  Redis.new host: redis_config['host'], port: redis_config['port']
end
```
最初にredis.ymlを読み込んで、稼働中の環境のredisの設定を読み込んでいます。
次にRedis.currentにコネクションプールのオブジェクトをセットしています。これだけです。


## redisの利用

最後にredisの利用方法です。コントローラなどから次のように使います。


```rb
Redis.current.with do |redis|
  redis.sadd 'foo', 1
end
```

本当にコネクションプールが使われているかどうかは未確認ですが、ライブラリを信用しましょう。

## おわりに

簡単にコネクションプールを利用できるようになりました。次回はActive Job + sidekiq + redisのメモです。
Unicornの監視

監視っつってもいろいろあるが、まずは最低限として、メモリ使用量を。
ついでにワーカープロセス数も同じ手順でできるのでこれも。

ここではmuninを利用してる前提とする。他の監視ツール使ってるところは・・・がんばって。

## 手順

https://github.com/munin-monitoring/contrib/tree/master/plugins/unicorn

こいつを使うので、clone

```bash:user$
sudo su
```

```bash:root#
cd
git clone --depth 1 https://github.com/munin-monitoring/contrib.git munin-contrib
```

unicornのプラグインは2セットあって、

- `unicorn_`
	- `ps | grep unicorn`って感じで計測するので、複数アプリが1サーバに相乗りしてる場合は合計になる
- `unicorn_memory_status`と`unicorn_status`
	- ちとめんどいけど、アプリごとに集計できる

今回は後者使う。複数アプリ相乗り前提で。

インストール。

```bash:root#
cp munin-contrib/plugins/unicorn/unicorn_{memory_,}status /usr/share/munin/plugins/
```

有効化。ここでは`myapp`という名前のアプリのつもりでコマンド書くので、適宜書き換えを。

```bash:root#
cd /etc/munin/plugins
ln -s /usr/share/munin/plugins/unicorn_memory_status unicorn_memory_status_myapp
ln -s /usr/share/munin/plugins/unicorn_status unicorn_status_myapp
```

設定。

```bash:root#
vi /etc/munin/prugin-conf.d/unicorn
```

```text:/etc/munin/prugin-conf.d/unicorn
[unicorn_memory_status_myapp]
  env.rails_root /path/to/myapp/current
[unicorn_status_myapp]
  env.rails_root /path/to/myapp/current
```

もちろん各自のアプリケーションのパスを書くこと。Capistrano使ってるなら`current`まで下る。

再起動。munin設定のあるある罠（再起動忘れ）はきちんと回避。

```bash:root#
systemctl restart munin-node
```

## あとがき

CPUの監視だれか
【Facebook】GoogleカレンダーをFacebookページに組み込む

意外と情報を検索するのに苦労したので、覚書です。

※Facebookの仕様はコロコロ変わるので、2015/09/16現在ということで読み進めてください。

やりたいことは、↓こういうこと。
![スクリーンショット 2015-09-16 20.25.43.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f794a9e0-1d73-2154-cb54-754b0c8ecd51.png)

では、面倒くさい説明は抜きにして、やり方の説明です。

（１）複数のFacebookページを管理していても、ログインしている個人アカウントで、以下のサイトへアクセス
![スクリーンショット 2015-09-16 20.27.36.png](https://qiita-image-store.s3.amazonaws.com/0/60538/9c5a7212-81e4-b5f3-4030-b343b6e724a1.png)
Facebookページに似たような名前で同じマークが存在しますが、「アプリ」にある"Static HTML:iframe tabs"を選択します。

（２）アプリの水色ボタンをクリック
![スクリーンショット 2015-09-16 20.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/60538/9753ccd8-afe5-a6bd-1917-e68febe5cf8e.png)

（３）管理しているFacebookページを選択
![スクリーンショット 2015-09-16 20.30.00.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ca4a7dc7-fa4f-8691-7371-eaed320df2f4.png)

（４）Edit tabをクリック
![スクリーンショット 2015-09-16 20.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/60538/53d7942b-e76a-2e03-6e62-acc19a866435.png)
ちなみに、このアプリでは、複数ページ作成できます。

（５）Googleカレンダーの「設定」＞「カレンダー」で追加するカレンダーを選択し、サイズなどをカスタマイズしてhtmlをコピー
![スクリーンショット 2015-09-16 20.34.36.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ec49dd94-9eb0-1028-7c44-7be69de0055f.png)

このとき、サイズは810×520がちょうどいいそうです。

（６）（４）のFacebookのstatic HTML設定画面に戻り、index.htmlの編集エリアに（５）でコピーしたhtmlタグをペースト
![スクリーンショット 2015-09-16 20.37.26.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b7a962b5-60e1-e2aa-e34a-a49d3d929b43.png)

（７）Previewボタンで確認して問題なければ、Save & Publishボタンで保存し、右上にある"View on Facebook"をクリックしてFacebookページに追加されたかどうかを確認
![スクリーンショット 2015-09-16 20.40.57.png](https://qiita-image-store.s3.amazonaws.com/0/60538/a6eb0381-1a20-9441-3bc3-8bf843df08e0.png)
Welcomeと出ているところが、static HTMLアプリで追加したページです。
これだと何のページかわからないので、タイトルや順番を修正します。

（８）まずは、位置決めで、一つ左に動かします。
![スクリーンショット 2015-09-16 20.42.12.png](https://qiita-image-store.s3.amazonaws.com/0/60538/78a77876-b676-136d-9c36-2de6073f7d00.png)
「タブを管理」をクリックし、タブの順番を動かします。

![スクリーンショット 2015-09-16 20.42.44.png](https://qiita-image-store.s3.amazonaws.com/0/60538/3c77a9ef-62f2-6c3c-d2b9-ba7092a053bf.png)
↓
![スクリーンショット 2015-09-16 20.42.52.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ff5d3336-bcdf-ef73-9c10-4e565a098d75.png)
ここで一旦保存します。

左に行きましたね。
![スクリーンショット 2015-09-16 20.45.44.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f8d32d78-011b-5c0b-31ce-504127a4255a.png)


（９）次に、タイトルの変更です。「もっと見る」から、タブの管理を表示し、「タブの追加・削除」をクリック
![スクリーンショット 2015-09-16 20.46.28.png](https://qiita-image-store.s3.amazonaws.com/0/60538/e62f6204-86fc-201c-0ff6-9af10fc8d19d.png)

アプリの一覧にstatic HTMLが表示されるので、「設定を編集」をクリック
![スクリーンショット 2015-09-16 20.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6e4b9038-922d-9cd4-4722-b79f95df88d3.png)

カスタムタブ名を編集し、「保存」ボタン、「OK」ボタンで保存
![スクリーンショット 2015-09-16 20.47.00.png](https://qiita-image-store.s3.amazonaws.com/0/60538/425af7db-989b-a168-bcb7-2ecad804b768.png)

タブの名前が変更されました。
![スクリーンショット 2015-09-16 20.49.38.png](https://qiita-image-store.s3.amazonaws.com/0/60538/c5c4204a-a051-887f-9881-564b1668a5c3.png)


この後は、Googleカレンダーに予定を追加していくと、このFacebookのページにも反映されます。
ぜひ！！
Ruby-Processing 回転する矩形の中に点があるか


点(マウスカーソル)が、回転する矩形の中にあるかを判定するプログラムを Ruby-Processing で書いてみました。

![point-in-rotate-rect.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/9d6ae28e-e3f1-660c-c52a-68cd7638f38c.gif "point-in-rotate-rect.gif")

```ruby:point-in-rotate-rect.rb
load_library :vecmath

# XY 軸に平行ではない矩形に点が含まれるかを判定するサンプル
# Y 軸上方向を正とする(描画時に符号反転させる)

# a ----- d
# |       |
# |       |
# b ----- c

def setup
  size 400, 400

  # 長方形を構成する 4 つのベクトル
  @a = Vec2D.new(-100, 50)
  @b = Vec2D.new(-100, -50)
  @c = Vec2D.new(100, -50)
  @d = Vec2D.new(100, 50)
end

def draw
  background 255

  translate width/2, height/2

  # XY 軸
  stroke 0xE0, 0xE0, 0xE0
  line -width, 0, width, 0
  line 0, -height, 0, height
  stroke 0

  p = Vec2D.new(mouse_x - width/2, -(mouse_y - height/2))
  if point_in_rectangle?(p, @a, @b, @c, @d)
    fill 100
  else
    no_fill
  end
  draw_rectangle @a, @b, @c, @d

  # 矩形を回転させる
  t = 1.radians * 0.6
  @a.rotate! t
  @b.rotate! t
  @c.rotate! t
  @d.rotate! t
end

# 長方形を描く
def draw_rectangle(a, b, c, d)
  begin_shape
  vertex a.x, -a.y
  vertex b.x, -b.y
  vertex c.x, -c.y  
  vertex d.x, -d.y
  end_shape CLOSE
end

# ベクトル a とベクトル b のなす角度を求める
# 0 ~ 2pi の範囲で返す
def calc_angle(a, b)
  angle = Math.atan2(b.x * a.y - a.x * b.y, a.x * b.x + a.y * b.y)
  angle += 2 * PI if angle < 0
  angle
end

# 点 p が長方形(点 a, b, c, d)の中にあるか
def point_in_rectangle?(p, a, b, c, d)
  # 角 abr と、角 cdr がいずれも 90 度以下であれば、点は長方形の内部にある  
  ba = a - b # ベクトル ba
  bp = p - b

  dc = c - d
  dp = p - d

  angle1 = calc_angle(ba, bp)
  angle2 = calc_angle(dc, dp)
  angle1.degrees <= 90 && angle2.degrees <= 90
end
```

コマンドラインから次のように実行します。

```
$ rp5 run point-in-rotate-rect.rb
```

## 参考

- [ベクトルのなす角度を求める](https://spphire9.wordpress.com/2013/12/27/%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E3%81%AA%E3%81%99%E8%A7%92%E5%BA%A6%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B/)
- [レーザーを作ってみよう](http://dixq.net/rp/34.html)
Model/Validationのテストがボイラープレートすぎてダルいので頑張ってみた

マクロ化してみる。

```ruby:spec/supports/model_macros.rb
module ModelMacros
  def it_is_expected_to_be_invalid_with(attr_name, value)
    value_for_display = value
    value_for_display = 'nil' if value.nil?
    value_for_display = 'empty' if value.is_a?(String) && value.empty?

    context "when #{attr_name} is #{value_for_display}" do
      before { subject.send("#{attr_name}=", value) }

      it 'has an error' do
        expect(subject).not_to be_valid
        expect(subject.errors[attr_name].size).to be >= 1
      end
    end
  end
end

RSpec.configure do |config|
  config.extend ModelMacros, type: :model
end
```

↑こんな感じのを置いとく。

すると、Modelのテストがこうなる↓

```ruby:spec/models/team_spec.rb 
require 'rails_helper'

RSpec.describe Team do
  subject(:team) { create(:team) }

  it { is_expected.to respond_to(:id, :name) }
  it { is_expected.to be_valid }

  it_is_expected_to_be_invalid_with :name, nil
  it_is_expected_to_be_invalid_with :name, ''
  it_is_expected_to_be_invalid_with :name, FFaker::Lorem.characters(33)
end
```

とりあえず試しに書いてみただけなので、意見求む
AtomicをWindowsのVagrantで使おうとしたけど（僕が）ダメで諦めましたorz

# AtomicをWindowsのVagrantで使おうとしたけど（僕が）ダメで諦めました　orz

無意味な記事になってしまった。。。
WindowsのVagrantでAtomic使ってみたかった、ただそれだけのこと。

## とりあえず、Vagrantで動かしてみる流れ

### VagrantのAtomicイメージをダウンロード   

ダウンロードは[ここから](http://www.projectatomic.io/download/)    
Fedora版とCentOS版を選べる。   
今回選択したのは、FedoraのAtomicのVagrantイメージ。

```bash:PowerShell
PS C:\atomic> ls
    ディレクトリ: C:\atomic
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2015/09/16     18:41  441221120 Fedora-Cloud-Atomic-Vagrant-22-20150521.x86_64.vagrant-virtualbox.box
```

### VagrantにダウンロードしたBoxを追加

```bash:PowerShell
PS C:\atomic> vagrant box add .\Fedora-Cloud-Atomic-Vagrant-22-20150521.x86_64.vag
rant-virtualbox.box --name atomic-fedora-22
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'atomic-fedora-22' (v0) for provider:
    box: Unpacking necessary files from: file://C:/atomic/Fedora-Cloud-Atomic-Vagrant-22-20150521.x86_64.vagrant-virtualbox.box
    box: Progress: 100% (Rate: 674M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'atomic-fedora-22' (v0) for 'virtualbox'!
```

確認・・・   

```bash:PowerShell
PS C:\atomic> vagrant box list
atomic-fedora-22 (virtualbox, 0)
chef/centos-7.0  (virtualbox, 1.0.0)
```

追加されました！！！   


### `init`して、Vagrantfileを設定して、`up`   

```bash:PowerShell
PS C:\atomic> vagrant init atomic-fedora-22
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

とりあえずIP。（SSHコマンド入れてないので）

```bash:PowerShell
- # config.vm.network "private_network", ip: "192.168.33.10"
+ config.vm.network "private_network", ip: "192.168.33.22"
```

UP!

```bash:PowerShell
PS C:\atomic> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'atomic-fedora-22'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: atomic_default_1442397632719_88270
"rsync" could not be found on your PATH. Make sure that rsync
is properly installed on your system and available on the PATH.
```

### ダメでした。


https://bugzilla.redhat.com/show_bug.cgi?id=1225198
One option how to bypass this is to actually delete the Vagrantfile coming with the .box file and repackage the box without it. To do so you can just untar the .box file (tar -xf...), delete Vagrantfile and recreate the archive again (tar -cf...). In that case the default sharing method on Windows should be VirtualBox shared folders. We don't include vboxsf since it's not packaged in base Fedora.


・FedoraのAtomicパッケージには、vboxsfを入れていない（Fedoraにもともと入っていないから）
・Box内のVagrantfileでフォルダ同期方法がrsyncになっている

ちなみに、CentOS版も同様にダメでした。

Box内のVagrantfileを書き換えるとできると書いてあるので、
とりあえず、Box内のVagrantfile書き換えてやってみたところ、

ちゃんと動きます。

が、ログインできず、そこで諦めました。

心が折れました。

rsync入れるとか、SSHKeyまわりを調べるとか、
頑張れば出来るんでしょうけど、別にそこまでしてやんなくても、ねぇ？

Dockerなら他の方法でやればいいよねっ！！（ダメだおれ）
Ractive.jsで別のライブラリの関数（たとえばBootstrapのdatepicker）を使う方法

表題の件、Ractive.jsでデータ表示したあと、UI上で変更しても保持しているdataが更新されなくて困ったので。

こんな感じで書いた。

```
var ractive = new Ractive({
		    el: '#element',
		    template: '#template',
		    data: {data: data},
		    decorators: {
			    datepick: function(node){
					var rct = this
					$(node).datepicker({
						format: 'yyyy/mm/dd',
						language: 'ja',
						autoclose: true,
						todayHighlight: true,
				        }).on('changeDate',function(dateValue) {
						rct.updateModel();
					});
				    return{
					    teardown: function(){
						    $(node).datepicker("destroy");
					    }
				    };
			    }
		    },
	    });
```

公式リファレンス
http://docs.ractivejs.org/latest/writing-decorator-plugins

デモ（tooltipの場合）
http://jsfiddle.net/tomByrer/9g3pB/11/


`teardown`っていうメソッド無いとおこられるです。かわいいかとw


※上記ソースのdetepickerのイベント名が違っていたのを修正（2015/11/02）
[Java1.8]  関数オブジェクトのお勉強

Java1.8の新API便利ですね。
いろいろ書き方を試してみるうちにこんな事ができることに、気付きました。

一般的なのかな？
メモメモしておきます。

# 実験

```Java
Stream.iterate(YearMonth.from(today),ym -> ym.plusMonths(1)).limit(10)
	.map( YearMonth::atEndOfMonth ).forEach(System.out::println);
```

興味をもったのは、__`map( YearMonth::atEndOfMonth )`__の部分です。

パラメータをfunction objectの引数に与えるだけでなく、引数自身のfunctionを、function objectによって（Reflectionのように）呼び出せるんですね。

* 引数１個のfunction objectの場合、パラメータは引数にセットされる
* 引数０個のfunction objectの場合、パラメータ自身のfunctionをコールする。

んですね。じゃあ・・・

```Java
IntStream.range(0, 10).reduce( Math::max ).ifPresent(System.out::println);
```
（引数Aと引数B）これはできる。これは？

```Java
IntStream.range(0,10).mapToObj(Int::new).reduce(Int::plus).ifPresent(System.out::println);
```
```Java
class Int{
	public int i;
	public Int(int i){ this.i = i; }
	public Int plus(Int b){ return new Int(this.i+b.i); }
	public String toString(){ return ""+i; }
}
```
（自分自身と引数A）これもできる・・・

# 結論

* 関数オブジェクトで自分自身が未定である場合（インスタンスメソッドがクラス名によって呼ばれている場合）、一つ目のパラメータは自分自身。
２つ目以降は、関数オブジェクトの引数に順番に代入される。
* 関数オブジェクトで自分自身が決定されている場合（クラスメソッドか、もしくはインスタンスメソッドがインスタンス参照で呼ばれている場合）、パラメータは関数オブジェクトの引数に順番に代入される。

ということでしょうか・・・
ActiveRecordでhas_manyのキャッシュをクリアする

#問題

以下のようなhash_manyを使ったモデルが定義されているとき

```rb
class User < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :user
end
```

以下のような挙動をする

```rb

user = User.create()
Article.create(user_id: user.id)

p user.articles.size
# => 1

Article.create(user_id: user.id)

p user.articles.size
# => 1
# ↑2になってほしい
```

# 解決
関連オブジェクトはキャッシュされる。
なので強制的にキャッシュをクリアした状態で取得する。

```rb
user.articles(true)
```
とする。

```rb

user = User.create()
Article.create(user_id: user.id)

p user.articles.size
# => 1

Article.create(user_id: user.id)

p user.articles(true).size
# => 2
```
CentOS6にEmacs24をソースからインストールした

### 謝辞
本記事を投稿するに当たって以下の記事を参考にさせて頂きました。

http://qiita.com/ironsand/items/fc755449b0e754ab1dd0
http://closeworld.exblog.jp/19273797/

### 経緯

CentOS6でEmacs環境を整えようと思ったらEmacs23だったので、MELPAの設定とかが面倒だった。だったらEmacs24を入れてしまえと、やってみたら結構すんなり入ったのでメモを残しておく。

### 準備
CentOS 6.7をミニマムインストールしてyum updateをかけておく。ついでにwgetもいれておく。
時間の節約のため、fastestmirrorで.jpを指定している。

```
# echo "include_only=.jp" >> /etc/yum/pluginconf.d/fastestmirror.conf
# yum update -y && yum upgrade -y
# yum install -y wget
```

以下、この状態でVirtualBox内で動作確認をしてある。

### Emacs24の入手

Emacsのソースを入手する。執筆時の最新安定版は24.5。
http://gnu.org/s/emacs からミラーはJAISTを選んだ。

```
# mkdir ~/src && cd ~/src
# wget http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-24.5.tar.gz
# tar zxvf emacs-24.5.tar.gz
```

### インストール

あとは大体この記事
http://qiita.com/ironsand/items/fc755449b0e754ab1dd0
の通りにインストールすればよいのだけど、./configure --without-xのとこで

```
configure: error: The required function `tputs' was not found in any library.
The following libraries were tried (in order):
  libtinfo, libncurses, libterminfo, libtermcap, libcurses
Please try installing whichever of these libraries is most appropriate
for your system, together with its header files.
For example, a libncurses-dev(el) or similar package.
```

という風にコケてしまうので、yumでncurses-develを入れる。

という訳で実行するコマンドは以下。
(autoconfの入手先はJAISTに変えてある)

```
# yum groupinstall -y "Development Tools"
# wget http://ftp.jaist.ac.jp/pub/GNU/autoconf/autoconf-2.69.tar.gz
# tar zxvf autoconf-2.69.tar.gz
# cd autoconf-2.69
# ./configure ; make ; make install
# yum install -y texinfo libXpm-devel giflib-devel libtiff-devel libotf-devel ncurses-devel
# cd ~/src/emacs-24.5
# ./autogen.sh
# ./configure --without-x
# make bootstrap
# make install
```
(追記)
最後にバージョン確認をする。

```
$ emacs --version
GNU Emacs 24.5.1
Copyright (C) 2015 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
```

(追記ここまで)

以上。
tumblrで一覧画像の解像度を高くする方法

#この記事
**ポートフォリオ**とかをtumblrでつくろうとすると、**画像をずらっと並べたくなりますよね。**
そういうテーマはよくあるんですけど、ちょっと画像が荒かったり。**一覧でも画像を綺麗に出したい！**というとき、よくありますよね。


#そんなときにはこれ

**`{PhotoURL-＊＊＊}`**
これです。
**＊＊＊で指定した横幅の解像度**で画像を読み込みます。表示サイズはそれぞれの場所の設定で。

##＊＊＊の中身は

**500, 400, 250, 100, 75sq, HighRes**の中から選んでね。HighResは高解像度。
横幅が1280より大きい時は**1280**もいけるっぽい。

##使い方

画像一覧の場合は`<img src="{PhotoUrl-＊＊＊}" alt="{PhotoAlt}"/>`と使います。

##幸せ

before
![スクリーンショット 2015-09-16 19.31.47.png](https://qiita-image-store.s3.amazonaws.com/0/77925/59ebf996-97c9-41d4-7c13-4ca72af571ce.png)

after
![スクリーンショット 2015-09-16 19.32.00.png](https://qiita-image-store.s3.amazonaws.com/0/77925/c83e90e7-7f0d-51b5-1bde-2cb9aa02afd1.png)

あらきれい！

テーマのHTMLの中に`{PhotoURL-250}`で書いてあることが多いので、`{PhotoURL-500}`とかにしてしまいましょう。
画像おおすぎたら重いかも。あと表示サイズ小さかったら、解像度大きくする必要別にないかも。




#参考

http://q.hatena.ne.jp/1320850103
https://www.tumblr.com/docs/en/custom_themes

イナフなtumblrライフを
今日のvim: recordingで連番のリスト

**（更新済み：かっこいいやり方を教えていただきました。コメント欄をご覧ください。ありがとうございます）**

vimの話です。

## やりたいこと

こういう連番のリストを作りたい。YAMLとかね。

```
- web1.prod
- web2.prod
- web3.prod
- web4.prod
- web5.prod
- web6.prod
- web7.prod
- web8.prod
- web9.prod
- web10.prod
```

## 手順


### 1. 雛形

ここは手で書け。しょうがない。

```
- web1.prod
```

### 2. レコーディング

さっき書いた行にカーソルが乗っかっている状態で

```
q a y y p Ctrl-a q
```

の順にタイプ。
レコーディング開始 -> 名前を「a」としよう -> ヤンク -> ペースト -> 数字をインクリメント -> レコーディング終了、という意味。(2番目の「a」は任意の文字で良いです)


### 3. レコーディングしたものを再生
```
- web1.prod                                                                                                           - web2.prod
```

今、こうなっててweb2.prodにカーソルが乗っているはず。web10.prodまで作りたいからレコーディングした内容を8回繰り返す。

```
8 @ a
```

8回 aの内容を実行、という意味。


### 4. 出来上がり。

```
- web1.prod                                                                                                           - web2.prod                                                                                                           - web3.prod
- web4.prod                                                                                                           - web5.prod                                                                                                           - web6.prod
- web7.prod                                                                                                           - web8.prod                                                                                                           - web9.prod
- web10.prod
```

注）web01.prodとかゼロから始まる数値だと8進数だと認識されちゃうから注意してくだせえ。

これ前にも書いた気がする。
捗れ。
基本的な開発の流れ

## 問題定義
  1. 課題がチケットとして上がってくる
  (なになにができないからできるようにしてもらいたい)
  2. 本当に問題なのか確認  
    (e.g.  
      1. 課題 : 検索の際にカテゴリーを選べるようにしたい。
      2. ヒアリング : 本当の課題は業務効率の改善
      3. 案だし : 自動で職種を選択されている機能を作るといった、案を出してレビューを受ける(そのままやる場合もレビューはする(レビュー会等で、))
    )
  3. テスト内容を考えるどういう問題についてどういうレビューをもらうべきなのかを考えテストケース作成。  
    シナリオテスト(通常の業務のシナリオで動くかテスト)をする  
    (ちなみに、レビュー会については、業務レベルの、設計レベルのレビューをする。)  

## 実装
  1. 機能の動きを考える
  2. テスト内容も一緒に考える
  3. 実装をする  
    -> 細かいテストについてここで考える。テストケース作成。  
    1~3を、サイクルで回すイメージ  
    ものすごい細かいところ if文 nullチェック(基本的に業務で起こりえないけど安全のためのコード)は、実際に試せないのでホワイトボックステスト。  
    コードを変えるなりして、一時的にテストできるようにしてチェック。

## テスト
  1. 単体テスト  
    (e.g.  
      ログインの有無、両方でチェック。  
      クリックする動きは全てチェック。  
      入力した値チェック(if文が、30で分岐なら 29, 30, 31すべてチェック)  
      表示されるソースコードのチェック  
    )
  2. 機能テスト
    単体テストのあとに、pushしてシナリオテストの前日のテストの日に、  
    チケット全てに対して機能毎にテストをする。(全ケースを担保している。試せない細かいものは除く)  
    2.の段階で、だれが確認してもできるテストケースを作成しておくこと。   
  3. 全体テスト  
    シナリオテスト  
    1.の段階で作成しておくこと。

## リリース