OmniAICreator/Qiita-1.07M huggingface dataset:
iOS8.1ではフォトストリーム上のALAssetをassetForURLでは読み込めない

http://stackoverflow.com/questions/26480526/alassetslibrary-assetforurl-always-returning-nil-for-photos-in-my-photo-stream
ここに書いてある内容そのままなのですが、

iOS8.1以前では、

iCloudのフォトストリーム上の画像をALAssetLibraryのassetForURLで読み込むことができましたが、
iOS8.1は、その方法ではnilを返すようになってしまいました。

```objc:new_code
[assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
    if (asset)
    {
        // フォトストリーム以外のALAssetを取得成功
    }
    else 
    {
        [assetLibrary enumerateGroupsWithTypes:ALAssetsGroupPhotoStream usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
            [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                if ([result.defaultRepresentation.url isEqual:url])
                    // フォトストリームのALAsset取得成功
                    *stop = YES;
                }
            }];
        } failureBlock:^(NSError *error) {
            // フォトストリームのALAsset取得失敗
        }];
    }
} failureBlock:^(NSError *error) {
    // フォトストリーム以外のALAsset取得失敗
}];
```

これでたぶんOS依存はなくなったのです。

しかし、ネストが深くなってしまいました。

もっと一発で取得するベターな方法があれば情報共有お願いします。
< Vim > 全てのテキスト、ファイルディレクトリ名を置換


ファイル内テキストの置換
---

```
:argadd **/*
:argdo %s/old/new/gc
```
g ・・・ 全体指定
c ・・・ 確認

これを実行した際、writeされていなかったので
下記を実行して全ファイル上書きした。

```
:bufdo w
```

または、

```
:bufdo %s/old/new/g | w
```

####推奨
下記コマンドで変更があったファイルのみ上書きされる ( Layzie様よりご指摘頂きました ) 。

```
:argdo %s/old/new/gc | up
```

ディレクトリ名、ファイル名の置換
---

`\find . -name *old* | vim -`

```
:%s/.*/\="mv -i ".submatch(0)." ".substitute(submatch(0), "old", "new", "g")/g
```

`:w !sh`
 
[詳しくはこちら](http://vim.wikia.com/wiki/Bulk_rename_files_with_Vim)
  
注意: .git/ も入ってるので削除してから`:w !sh`をしないと大変なことなります。
  

###備考
cオプションをつけたか分からないが、下記のように出た際、矢印キーを下かenter押し続けないと進まなかった・・・
`-- More --`
pepperめも_01:ペッパーを箱から出す前に読むめも

#ペッパーを部屋によぼう！
ついにペッパーの先行レンタルが開始されました！
あたった人もこれから購入する人も、箱から出すときの参考にしてください！
※随時追記していきます

![写真 2014-11-11 10 21 40.jpg](https://qiita-image-store.s3.amazonaws.com/0/40994/cd338961-d848-4e47-96c9-496935b08584.jpeg)

#事前に準備するもの
事前に準備するもの、注意点などをまとめました。
箱を開け始めてから、起動して設定が終わるまで、1時間位かかるとおもいます。

##箱を置く場所
ペッパーのはいっている箱はとにかく大きいです！冷蔵庫くらいあるので置き場所を確保しましょう！
取り出した後もたためないし、捨てられないので保存場所が必要です！
丈夫な厚紙みたいな感じだし、穴が開いてるのでそのままベランダに放置とかはキツイと思います。

##ロボットの名前を考えよう！
ペッパーの名前を予め決めておきましょう。英語小文字と数字だけみたいです。
（大文字はダメでした。記号は試してないです。）
この名前をペッパーがしゃべったり、開発の時に接続に使ったりするので、結構大事ですよ！

##アルデバランIDを用意しよう！
アルデバランに登録しているメールアドレスとパスワードが必要です。
まだ作ってない人は用意しておきましょう！
接続に失敗することがあるので、そのばあいは何回も挑戦しましょう。

##wifiを用意しよう！
起動時のセットアップにはwifiが必要です。

##コンセントを用意しよう！
充電用のコンセントを用意しましょう。
差込口は、アース付きの3口のやつじゃないとだめなので注意！

##マニュアルの最新版
> お願いとご注意など、すべての説明書は次のURLからご確認ください

同封の紙には、上記の文言が書いてありますが、
pepperのマニュアルは置いてないです。（2014年11月11日現在）
https://community.aldebaran.com/en/resources/documents
ソフトバンクのマニュアルの最新版を見たほうがいいでしょう。
（追記は更新されてないです。2014年11月11日現在）
http://www.softbank.jp/robot/developer/support/tech/

#箱から出すときの注意事項
##とびらの内側の手順をよく読もう！
とびらの内側に手順が書いてあるのでよく読んでまねしましょう！

##ロック解除キーをちゃんとはずそう！
手順にしたがって、２箇所のロック解除キーをかならずはずしましょう！
１個はプラスチックですが、ゴミと間違えないように注意！
ちゃんと外しておかないと、電源を入れた時などに倒れる原因になります。

#起動時の注意事項
マニュアル通りにやっても日本語設定がうまくいかないです。(2014年11月11日現在）

##設定画面の言語設定
最初に聞かれる表示言語設定は、設定画面の言語設定です。これは日本語が選べます。
![写真 2014-11-11 11 58 03.jpg](https://qiita-image-store.s3.amazonaws.com/0/40994/078491d8-7375-cf23-17cd-1a20bd3eeef1.jpeg)


##ペッパー本体の設定１
ペッパー本体の日本語設定は、初期状態では選べません。
ペッパーのアップデートをした後、選べるようになります。
![写真 2014-11-11 12 08 22.jpg](https://qiita-image-store.s3.amazonaws.com/0/40994/e62b770c-d230-af89-7c87-453723df1294.jpeg)
※Pepper β版 取扱説明書_補足.pdf にも書いてあります。(2014年11月10日にメールが来た）

##ペッパー本体の設定２
この状態で、ペッパーは日本語をしゃべるのですが、日本語を聞き取ることが出来ません（Speech Recoが失敗する）。公式ではありませんが、以下の方法でなおりました。(2014年11月11日現在）
・ペッパーを再起動
・言語設定を英語にする
・ペッパーを再起動
・言語設定を日本語にする

#ペッパーの付属品
##ロック解除キー
青いキーホルダーがカワイイ、ブレーキ解除キー（腰用）ですが追加販売はしてないとのことです。
なくさないように注意しましょう！腰にさすプラスチック製のブレーキ解除キーも同様です。
##ドライバー
なんに使うかわからないドライバーがついてきます。これもなくさないようにしましょう。

＃おしまい
以上、ペッパーを箱から出すときのメモでした！
自分流プレゼン資料の作り方

[見やすいプレゼン資料の作り方 - リニューアル増量版](http://www.slideshare.net/yutamorishige50/ss-41321443)を見て。なるほどほほーと思ったので、自分なりのプレゼン資料作成ルールを書いてみます。

# 基本的なプレゼン資料作成方針

自分のプレゼン資料作成方針は、以下の通りです。

* プレゼン資料は自分が「暴走しないためのもの」。話さなければいけないキーワードは資料に書く
* 文字サイズは基本的に30pt以上。それ以下の文字は読めない可能性を十分考慮する
* 極端に小さい文字(14pt未満)は、そもそも使わない
* SmartArtは基本的に多めに使う
* そのほか、ネタはちょくちょく
* 自己紹介は遊ぶ

自分がプレゼンテーションをするのは、大抵IT系勉強会や地域教室、地域のオープンスピーチなど。とにかく「楽しんでもらうこと」が主であると考えています。その上で、しっかり身になる内容をお話しすることで、はじめて分かってもらえるかな と。とはいえIT勉強会以外ではそこまでゆっくりできないので、こちらの基本方針は勉強会限定の内容になっています。

## プレゼン資料は自分が「暴走しないためのもの」。話さなければいけないキーワードは資料に書く

プレゼン資料を作成するときは、大体イベント(勉強会は講習など)の数日前なので、じっくり練習するほどの時間がないこと。しっかり覚えてから発表すると、失敗したときかえってテンパってしまうのが理由です。

自分の発表は、7割くらいがアドリブです。プレゼンにはどうしても話さなければならないことや、そのキーワードを書き、そこに肉付けしながら話しています。

ただ、そのままだと本番でうっかり話しに詰まってしまうこともあるので、1回だけ最後まで読み上げ、それを言ったら話が止ってしまうというような、いわゆるNGワードがあれば、本番で口にしないように覚えておきます。

## 文字サイズは基本的に30pt以上。それ以下の文字は読めない可能性を十分考慮する

会場の大きさが分からないことも多いので、後ろの人にも見えるよう、文字サイズは30pt以上に設定しています(最初にスライドマスタを開いて、全てのフォントサイズを8ptほど大きくする)。

また、PowerPointでは文字が多くなると自動的にフォントサイズが小さくなることがありますが、そこまでいったら「書きすぎ」なので、単語や接続詞を削ったり、言い換え可能な単語を言い換えたりして適当に短くします。

## 極端に小さい文字(14pt未満)は、そもそも使わない

とくに見せる気のない文字について。

タグクラウドなどで使いたくなるときもあるかもしれませんが、こういう文字はなるべく使わないようにします。とくに勉強会慣れしていない人向けのイベントになると、「読ませる気のない文字」でも「相手が読もうとしてしまう」ので、気が散ってしまいます。小さい文字はページ番号以外は書かない方がいいです。

## SmartArtは基本的に多めに使う

SmartArtは、上記の記事にあるレイアウトの原則をしっかり守って作られているものが多く、使える時は使っています。配色設定は、表現したいものにあわせてなるべく色を変えます。単色は地味に見えるので避ける。

写真が入れられるタイプのSmartArtについて。入れられるものはなるべく状況に即した写真やイラストを入れたいところですが、どうしても一部だけ用意できないなどというときは、クリップアートなどを挿入できますので、それを使います。

### クリップアートがなくなっちゃったよ！
PowerPoint2016が出たあたりから、PowerPointからクリップアートがなくなってしまいました。まあ、なんということでしょう！

そういうときのために、いちおう代替のサイトを紹介しておきます。

* [OpenClipArt](https://openclipart.org/):パブリックドメインのクリップアートがたくさんあります。ただし、英語サイトですので検索に英語しか使えません(でもだいたいそれでも十分)。
* [いらすとや](http://www.irasutoya.com/):営利活動でなければ無料で使えるイラストがたくさんあります（営利活動についてはサイトをご確認ください）。ただし一部で異様に認知度が高いサイトなので、あまり不用意に使うとどこのイラストかすぐバレてしまい面白くない という問題があります。

## そのほか、ネタはちょくちょく

プレゼンテーションは「存在を覚えてもらうこと、楽しんでもらうこと」が第一だと思っていますので、なるべくであれば適度に笑いどころを入れておきます。

しかし自分の場合、深夜アニメなどをまったく見ない人が相手の場合も少なくなく、深夜アニメネタは通用しない場合が多いです。また、自分自身もそんなにたくさん見ている方ではないので、ネタを入れても滑ってしまう場合が多く、あまり深夜アニメネタは使っていません。あくまで「わかってる人はクスッとできるかも(わからない人はそのままでいい)」程度にとどめておきます。

円グラフを箇条書きに使う(べつやくメソッド？)なども時々使っています。、自己紹介スライドはただの箇条書きでなく、SmartArtや円グラフなどを使って、印象づけます。

## 自己紹介は遊ぶ
相手が「前回も見た人たち」であることが分かっている場合を除き、自己紹介は大抵入れてます。
自己紹介はプレゼンの最初でもあるので、できるだけ遊びを入れています。最近はSmartArtやべつやくメソッドを使うことが多いです。ここだけは唯一同じ内容のことを何度も話しているので、練習が不要ですし。


元々が「プレゼンはアドリブでやる」という原則でやってるので、いろいろ好きにやれることが多いです。とくに地域教室などは途中で質疑応答に入ることも多いですし。

たぶん状況によって変えた方が良いものもあると思うので、ご参考程度に。
typescriptをjsdocでドキュメント化する

[#272 Documenting TypeScript
][ref1]にあるようにクラスプロパティ，メソッドをドキュメント化するには下記のようにプロパティ名やメソッド名を完全修飾名で記述する必要がある．


```ts
/**
 * @class
 */
class Klass{
  /**
   * @member Klass.member
   */
  private member: string;

  /**
   * @method Klass#method
   */
  method: (): void {}
}
```
記述の手間がかかりすぎりので実用的ではないかも．

yuidocなら生成できる(?) > [TypeScriptのAPIドキュメントをyuidocjsで自動生成][ref2]

[ref1]:https://github.com/jsdoc3/jsdoc/issues/272

[ref2]:http://straitwalk.hatenablog.com/entry/2013/06/22/022909
サイズの大きなmysqlのdumpファイルをレンタルサーバへインポートする。

#phpMyAdminでインポートするとき、phpのMemoryAllocateの制限に引っかかる
サイズの大きなmysqlのdumpファイルを、レンタルサーバーデフォルトのphpMyAdminでインポートしようとすると、phpのMemoryAllocateに引っかかったりしますよね。
シェルが触れるサーバーならコマンドラインからやればいいのですが、
そうじゃないと、テーブルごとに分割してインポートとかやってみますが。。。。どのテーブルまでインポートできたのかわからなくなってしまいます（私が実際に遭遇しました。。。。確実性が全くない）。もうお手上げです。

#BigDumpを利用する
そこで、大きなdumpデータを複数行に分割して自動的にインポートできる、PHPのプログラム

BigDump
http://www.ozerov.de/bigdump/

を利用します。

#手順
##mysqldumpデータの準備
BigDumpでは行ごとに自動分割してインポートし、1回のインポート時に必要なメモリ容量を抑えることで、メモリの利用制限がかかっている環境でも大きなファイルのインポートが可能になります。

ですので、dumpデータを取得する際には、1行のInsert文で複数レコードをinsertするいわゆる拡張insert文を利用しないようにします。

###phpMyAdminの場合
![mysqldump.jpg](https://qiita-image-store.s3.amazonaws.com/0/59131/cb487d6d-5f0a-5957-893a-067d5763d9fe.jpeg)


Data creation optionsで画像のように

- すべての INSERT 文にカラム名を含める 
- 上のどちらでもない

のどちらかを選んでください。（すべての INSERT 文を複数行挿入で行うを選ばない）
あとは必要に応じてオプションをいれてdumpファイルをエクスポートして下さい。

###コマンドラインの場合
--skip-extended-insert

オプションを利用して、1行で1レコードのinsertするダンプファイルを作成します。

```
mysqldump --skip-extended-insert > dump.sql

```

##BigDumpのインストール
インストールといっても、webサーバーでアクセスできるところに、設定を書き込んだファイルを配置するだけです。

###ダウンロード
http://www.ozerov.de/bigdump/
からダウンロード

###設定を変更
41行名から始まるDBの設定を適切に変更します。

```php

// Database configuration

$db_server   = 'localhost'; //適切なホスト名を
$db_name     = 'db_1'; //DB名を
$db_username = 'dbuser'; //ユーザー名
$db_password = 'password'; //パスワード

```

また、56行目あたりの、OPTIONAL SETTINGで1度にインポートを実行する行数,インポートの間隔を設定します。
メモリの利用制限にかからないように適切に設定してください。

```php
// OPTIONAL SETTINGS 

$filename           = '';     // Specify the dump filename to suppress the file selection dialog
$ajax               = true;   // AJAX mode: import will be done without refreshing the website
$linespersession    = 3000;   // Lines to be executed per one import session
$delaypersession    = 0;      // You can specify a sleep time in milliseconds after each session
                              // Works only if JavaScript is activated. Use to reduce server overrun
```

###webサーバーからアクセスできる場所へ配置
あとでdumpファイルも同一ディレクトリへアップロードするので、適当なディレクトリを作成して配置します。

例えば、

DocumentRoot/dump/
へ
bigdump.php

をアップロードします。

##mysqldumpファイルの配置

先ほどとったmysqldumpファイルを配置します。

前述のbigdump.phpと同じ場所

DocumentRoot/dump/

へ配置することにします。

##BigDumpの実行
###BigDumpへアクセス
配置したBigDumpへアクセスします。

http://example.jp/dump/bigdump.php

###対象のdumpファイルを選択し、実行
BigDumpへアクセスすると同ディレクトリにあるdumpファイルが選択肢に表示されます。
対象のdumpファイルを選択し、「start import」をクリックします。

##終了
後はBigDumpが自動でインポートしてくれます。インポート状況も表示されるので、インポートが100%になったら終了です。

###後処理
ちゃんとインポートされていることが確認できたら、bigdump.phpとdumpファイルを削除してください。



#参考サイト
大きいサイズのSQLをインポートしてくれる「BigDump」 | 日々の覚書…日常のことも少しだけ
http://www.tailtension.com/usefultool/1498/

mysqldumpで一行ずつのINSERT文を吐き出したい - 屑プログラマの憂鬱
http://artisan.hatenablog.com/entry/20110922/1316670746
Matlabコンソールでclassをクリアする

## Matlabの仕組み
Matlabではキャッシュを取っているようで、
クラスファイルを更新しても反映されないことが多々あります。

## クラス更新できない問題

```matlabsession
clear all;
```
とかやっても同じ。
クラスの更新ができません。

##正解
調べたところ、

```matlabsession
rehash;
```
が正解のようです。これで、Matlabが
勝手に作っているキャッシュを削除することができます。

なので、各スクリプトファイルの冒頭には

```matlabsession
rehash; clear all; close all;
```
等と書いておけば大抵うまく行きます。


・・・それでもクラスが更新されないときがあるので、
そうなったら、、MatlabConsoleを再起動しましょう…
GLViewにcreateが無くなった(cocos2d-x v3.3 rc0)

AppDelegateのapplicationDidiFinishLaunching()にて、
GLViewをcreateして〜設定をゴニョゴニョして〜とすることが多いかと思いますが、
cocos2d-x v3.3から、GLViewにてcreateが無くなってしまっていて、v3.2系以前で作っていたソースだとエラーが出るのでメモ
（一応、この記事を書いた時点ではv3.3RC0版です）

たぶん今まではこんな感じで書いてるはず

```cpp:sample
bool AppDelegate::applicationDidFinishLaunching() 
{
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();

    if(!glview) {
        glview = GLView::create("hogehoge");
        director->setOpenGLView(glview);
    }

    //~~~以下省略~~~~

    return true;
}
```

ただ、それだと、GLView::create("hogehoge");でエラーが出るので、
こんな感じにします。

```cpp:sample
bool AppDelegate::applicationDidFinishLaunching() {

    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::create("My Game");
        director->setOpenGLView(glview);
    }

    //~~~以下省略~~~~

    return true;
}
```


GLViewImplになったんですね。

githubを見るとコメントを添えて直してるのがわかります。
https://github.com/cocos2d/cocos2d-x/issues/8546

まーちょいと調べりゃ分かるもんですけどとりあえずメモメモ
CakePHPのセッション周りの設定


```lang:AppController
function beforeFilter() {
	CakeSession::$requestCountdown = 1;
}
```

```lang:core.php
Configure::write('Session', array(
		'defaults' => 'php',
		'timeout' => 1440,
        'autoRegenerate' => true,
        'ini' => array(
            'session.cookie_lifetime' => 0,
            'session.gc_maxlifetime' => 86400,
            'session.gc_probability' => 1,
            'session.gc_divisor' => 100
        )
	));
```

 参考：http://hibiki30nen.blogspot.jp/2012/10/cakephp.html
参考：http://artisanedge.jp/blog/2012/11/21/223145.html
AWSのELBにSSL証明書をインストールする方法

※追記
これはALB/NLBが使えるようになる前に書いたものです。
現在はHTTPSの接続でCLBを使うケースのほうが少ないと思うのと、当時と違いACMが使えるようになっているのでACMを使う方法をご検討ください。

参考
ACMで証明書を発行する場合
https://qiita.com/NaokiIshimura/items/014a163c60feebec570b
※書いてあるのはDNS検証のパターンです

外部証明書の場合
https://dev.classmethod.jp/cloud/aws/manual-for-updating-external-certificate/

---
ほとんどメモだけど発行したSSL証明書をAWS上のELBにコンソールからインストールする方法。インストール時に「あれ？どれがどれだっけ？」となったときのために。

環境はApache+OpenSSLを想定。

1. 適当なサーバ((実際には、使用するELBにぶら下げているサーバ？))でCSR証明書を発行
2. 証明書の申し込み
3. ELBへのインストール

# 適当なサーバでCSR証明書を発行
こちらを参考に。
http://valuessl.net/support/csr/apache1.php

新規発行の場合はそれっぽく適当に入れればいいと思いますが、更新の場合ディスティングイッシュネーム情報は書いてあるとおり前回と同じにしましょう。
前回のものは、現在使われているものであれば、該当のページにブラウザでアクセスし、アドレスバーの鍵マーク（Chromeの場合）を右クリックすると、情報が確認できます。当たり前ですが、httpsでアクセスしないと鍵マークは出てきません。

ここで作成した秘密鍵とCSR証明書は必ずバックアップを取ること。
秘密鍵作成時にはパスフレーズを設定しないこと。
（パスフレーズ設定時に何も入力せずにエンター、でOK）
秘密鍵をなくすとインストールできません…。

# 証明書の申し込み
申し込み方自体はValueSSL等SSL証明書の申し込みサイトを参考に。
サイトの流れのとおりに申し込みましょう。  

# ELBへのインストール

こちらを参考に。
http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/US_UpdatingLoadBalancerSSL.html

コンソールからのインストールを想定。
Certificate Nameに適当な名前を入力する。

Private Keyには<b>CSR証明書作成の時に作った秘密鍵</b>の中身を記載する。
Public Key Certificateには、SSL証明書申し込みサイトに申し込んで発行された
SSL証明書（RapidSSLの場合は「サーバ証明書」）の中身を記載する。
Certificate Chainには中間CA証明書の中身を記載する。

これでSaveを押せばインストール完了。
実際にhttpsアクセスするなどしてみて、問題なくページが表示されればOK。
GradleでScala2.11のコンパイルをするには

Gradleを2.xにしないと、ワケワカなエラーが出ます。

```
/tmp/sbt_234ad403/CompilerInterface.scala:240: error: recursive method rootLoader needs result type
			override def rootLoader = if(resident) newPackageLoaderCompat(rootLoader)(compiler.classPath) else super.rootLoader
                                                                                      ^
/tmp/sbt_234ad403/CompilerInterface.scala:240: error: value rootLoader is not a member of scala.tools.nsc.backend.JavaPlatform
			override def rootLoader = if(resident) newPackageLoaderCompat(rootLoader)(compiler.classPath) else super.rootLoader
                                                                                                                                 ^
/tmp/sbt_234ad403/CompilerInterface.scala:261: error: value RootClass is not a member of object xsbt.CachedCompiler0.compiler.definitions
							reSyncCompat(definitions.RootClass, Some(classPath), Some(oldEntry), Some(newEntry))
                                                                                 ^
/tmp/sbt_234ad403/CompilerInterface.scala:337: error: value RootClass is not a member of object xsbt.CachedCompiler0.compiler.definitions
			pkg == definitions.RootClass ||
                                           ^
/tmp/sbt_234ad403/CompilerInterface.scala:286: error: value EmptyPackageClass is not a member of object xsbt.CachedCompiler0.compiler.definitions
					invalidateOrRemove(definitions.EmptyPackageClass.asInstanceOf[ClassSymbol])

```
プログラミングに関する原則、法則など

何かとこの辺を伝える機会が多いので、
自分への備忘録の意味も込めて。

---

■ DRY( Don't repeat yourself )
・重複を防ぐ考え方。

   Wikipedia
   http://ja.wikipedia.org/wiki/Don't_repeat_yourself

■ YAGNI( You ain't gonna need it )
・機能は実際に必要となるまでは追加しないのがよいとする考え方。

   Wikipedia
   http://ja.wikipedia.org/wiki/YAGNI

■ KISSの原則( Keep it simple, stupid )
・設計の単純性（簡潔性）は成功への鍵だということと、
   不必要な複雑性は避けるべきだということであるという考え方。

   Wikipedia
   http://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87

■ SOLID原則
・単一責任の原則(SRP : The Single Responsibility Principle)
-> クラスを変更する理由は1つであるべき。

・ オープン・クローズドの原則(OCP : The Open Closed Principle)
-> クラスの振る舞いを変更せずに継承できるべき。

・リスコフの置換原則(LSP : The Liskov Substitution Principle)
-> 継承クラスは基底クラスの代わりになれないといけない。

・インターフェース分離の原則(ISP : The Interface Segregation Principle)
-> インターフェースはクライアントごとに細かく作る。 (クライアントが利用しないメソッドを持った太った
インターフェースは作ってはいけない)

・依存性逆転の原則(DIP : The Dependency Inversion Principle)
-> 実装に依存せず、抽象に依存しなくてはいけない。

   Wikipedia
   http://wiki.prvten.com/SOLID%E5%8E%9F%E5%89%87

■ デメテルの法則
・最小知識の原則
・基本的な考え方は、任意のオブジェクトが自分以外（サブコンポーネント含む）の構造やプロパティに対して持っている仮定を最小限にすべきであるという点

　http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%A1%E3%83%86%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87

■ 驚き最小の原則
・ユーザインタフェースやプログラミング言語の設計および人間工学において、インタフェースの2つの要素が互いに矛盾あるいは不明瞭だったときに、その動作としては人間のユーザやプログラマが最も自然に思える（驚きが少ない）ものを選択すべきだとする考え方である。

　http://ja.wikipedia.org/wiki/%E9%A9%9A%E3%81%8D%E6%9C%80%E5%B0%8F%E3%81%AE%E5%8E%9F%E5%89%87

■ ボーイスカウトの規則
アメリカのボーイスカウトは「自分のいた場所は、そこを出て行くとき、来た時よりもきれいにしなければならない」というもの。
プログラミングに当てはめると、チェックアウト（ソースコードを落とす）したときより、
チェックイン（ソースコードを反映）する時に綺麗にする。

　http://d.hatena.ne.jp/asakichy/20100706/1278377244

■ プログラマの心得
     http://beginner-programer.hateblo.jp/entry/2013/10/27/062841

　・臆する事なかれ！
　・全力でサボれ！
　・知る事を楽しむ！
　・伝える事を楽しむ！
　・何がやりたいかをしっかり考える！
　・失敗は気にしない！	

　・言い訳をしない。
　-> 関わった所は責任感を持つ。

　・新しい物に捕われない
　-> 様々な改善

・良きプログラミングの条件
　http://homepage1.nifty.com/x6/language/C/knowledge.htm

   [ 製品の価値を高める ]
　・操作性
　・デザイン性
　・安全性
　・信頼性
　・長時間動作する
　・精度、性能が高い

   [ 経費を抑える ]
　・コストパフォーマンス
　・開発効率（短い時間開発出来る）
　・保守性

■ エクストリーム・プログラミング
・軽量開発手法あるいはアジャイルソフトウェア開発手法と呼ばれる、
　同種の開発手法のなかで代表的なものである。
　柔軟性の高い開発手法であるが、古典的には開発が進むにつれ変更コストは大きくなると言うことを前提に開発手法が構築されているのに対して、自動テストを導入するなど様々な対策をすることにより開発が進んでも変更コストが大きくならないような工夫を持ち込むことにより、変更に対する柔軟性を実現している

何かのときにすっと出したい、プログラミングに関する法則・原則一覧
http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=f58b219600-Qiita_newsletter_115_30_7_2014&utm_medium=email&utm_term=0_e44feaa081-f58b219600-32850825
yosemiteにアップデートしてhosterが立ち上がらなくなった時の解決方法

yosemiteにアップデートするとhosterが立ち上がらなくなりました。
hostsのアクセス権限を変更すると復活します。

```
cd /private/etc
sudo chgrp admin hosts
sudo chmod 664 hosts
```

## 参考にしたサイト

http://www.ideaxidea.com/archives/2012/05/how_to_recover_hoster.html
Ｃ言語　問題・解答まとめ

##九九を表示するプログラムを作成せよ

```hello.c
#include <stdio.h>
int main(void){
  int i, j;
  for(i = 1; i < 10; i++){
    for(j = 1; j != 10; j++){
      printf("%3d", i * j);
    }
  printf("\n");
  }

}

=>  #出力
  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81
```

##5 人の受験者の得点を受け取り,60 点以上の合格者の番号と得点を表示させる

```hello.c
#include <stdio.h>

int main(void){
  int student[5];
  int i;

  for(i = 0; i < 5; i++){
    printf("受験番号%d 番の得点 :",i + 1);
    scanf("%d", &student[i]);
  }
  for(i = 0; i < 5; i++){
    if(student[i] > 60){
      printf("受験番号%d番%d点で合格\n", i+1, student[i]);
    }
  }
}

=> #出力

受験番号1 番の得点 :81
受験番号2 番の得点 :26
受験番号3 番の得点 :48
受験番号4 番の得点 :10
受験番号5 番の得点 :27
受験番号1番81点で合格

```

##足し算を入力するプログラム

```hello.c
#include <stdio.h>

int Plus(int x, int y){
  int result;
  result = x + y;
  return result;
}

int main(void){
  int hoge, piyo;
  int n;

  printf("数字を入力して下さい\n");
  printf("１つ目: "); scanf("%d", &hoge);
  printf("２つ目: "); scanf("%d", &piyo);
  n = Plus(hoge, piyo);
  printf("足し算の結果は%dです", n);

}

=> 
数字を入力して下さい
１つ目: 1
２つ目: 4
足し算の結果は5です
```

##べき乗を求めるプログラム

```hello.c
#include <stdio.h>

int Power(int x, int y){
    int i, result;
    for(i = 1, result = 1; i <= y; i++){
      result *= x;
    }
  return result;
}

int main(void){
  int xi, yi;

  printf("整数を入力して下さい");
  scanf("%d", &xi);
  printf("何乗にしますか:");
  scanf("%d", &yi);

  printf("%dの%d乗は%dです\n",xi,yi, Power(xi,yi));
  return 0;
}

=> #出力

整数を入力して下さい4
何乗にしますか:2
4の2乗は16です
```
PC・スマホ両対応の動画配信サーバーメモ

掲題のシステムを構築する仕事があったので、備忘録がわりに。

# 動画ファイルの形式について

mp4を使うとPC・スマホとも簡単に配信できる感じ。
細かい制御をしたい場合は、PC向けにはRTMPを使ったflv配信、スマホ向けにはHLSによる配信が良さそう。

## flv

Flash Video。iPhoneやAndroidの場合、標準では再生できない場合が多い（アプリを導入すれば再生できる）。

## mp4

PCブラウザ・スマホ両方で再生できる（Firefoxはバージョン21.0から対応）。

## m3u8

HTTP Live Streaming(HLS)形式。PCブラウザではSafariを除いて基本的に未対応。

# ストリーミングサーバーについて

## Adobe Flash Media Server (FMS)

flv, HLSなどの配信ができる。115,500円。YouTubeやmixiなどで採用されているらしい。

## Red5

https://github.com/Red5
フリーのストリーミングサーバー。Java製。mixiやニコニコ動画などで採用されているらしい。

## C++ RTMP Server

http://www.rtmpd.com/
未検証。

## Wowza

http://www.wowza.com/
未検証。

## 擬似ストリーミング

http://server-setting.info/centos/apache-pseudo-streaming.html
apache でPseudo streaming（疑似ストリーミング）で動画配信を行ってみる（ mod_flvx,mod_h264_streaming モジュールを使ってみた）

http://server-setting.info/centos/nginx-pseudo-streaming.html
nginx でPseudo streaming（疑似ストリーミング）で動画配信を行ってみる（flv、mp4ディレクティブを使ってみた）

シークが少しもたつく場合があるが、非常に簡単に使うことができる。
aptでnginxをインストールして「mp4;」と一行書くだけ。

## nginx-rtmp-module

https://github.com/arut/nginx-rtmp-module
nginxのRTMPモジュール。HLSの配信もできる。

# おまけ nginx-rtmp-moduleを組み込んだdebパッケージ作成

適当なワークディレクトリ内で行ってください。

## ソース展開に必要なパッケージをインストール

```
apt install dpkg-dev
```

## nginxの最新版ソースを取得する

```
add-apt-repository -s ppa:nginx/development
apt update
apt-get source nginx
cd nginx-1.7.7/
```

## nginx-rtmp-moduleをクローンする

```
cd debian/modules/
git clone https://github.com/arut/nginx-rtmp-module.git
cd ../..
```

## ビルドオプションにnginx-rtmp-moduleを追加。

debian/rulesのextras_configure_flagsに以下を追加。その前行に\を入れるのを忘れずに。

```
--add-module=$(MODULESDIR)/nginx-rtmp-module
```

## ソースパッケージをコンパイルする為に必要なパッケージのインストール

```
apt-get build-dep nginx-extras
```

## パッケージのビルド

ひとつ上のディレクトリにパッケージ(.deb)が生成される。

```
dpkg-buildpackage -b
```

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

```
cd ..
dpkg -i nginx-common_1.7.7-1+trusty0_all.deb nginx-extras_1.7.7-1+trusty0_amd64.deb
```

## モジュールの確認

```
nginx -V
```
MySQLで指定されたカラム名を持つテーブルを検索する

調べることになったので備忘録

MySQLにログインし、以下のSQLを実行する

```sql
select table_name, column_name from information_schema.columns where column_name = '検索したいカラム名' and table_schema = '検索対象のデータベース名';
```
Androidで標準ギャラリーのように動画も写真も取得する


Androidでは写真や動画、音楽などのファイルをアプリ間で共有する仕組みとしてMediaStoreが用意されています。
MediaStoreはContentProviderで公開されていてURIを知っていればContentResolver経由で取得したり追加したりすることができます。

取得できる種類は色いろあるのですが、
http://android.roof-balcony.com/shori/content-provider/getcontent-3/
ここにあるような

	MediaStore.Images.Media.EXTERNAL_CONTENT_URI
	MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
	MediaStore.Video.Media.EXTERNAL_CONTENT_URI
	
くらいしかつかっていませんでした。

# 標準ギャラリーのように動画と写真を一緒に取得したい

こんな時困りました。
普通にURIから

	// 同期
	Cursor cursor = getContentResolver().query(URI,...);
	// 非同期
	CursorLoader cursorLoader = new CursorLoader(callback,URI,...);
	
のようにCursorを取得すると思いますが、上記のMediaStore.Imagesは写真のみ、MediaStore.Videoは動画のみしか取得できません。

しかし、ファイル一般が全部取得できるURIがあったんですね、知りませんでした。

	MediaStore.Files.getContentUri("external");
	
ちょっと定数がなくて不便な気もしますが、こちらでいろんなファイルが取得出来ました。
ちょっと調べても日本語のサイトが無かったんですが、常識だったんですね、すみません。

- http://stackoverflow.com/questions/17664826/access-ordered-images-and-video-in-same-cursor
- http://developer.android.com/reference/android/provider/MediaStore.Files.html

上記参考URLにありますが、MediaStore.Files.FilesColumnsにMEDIA_TYPEというのがあってそれを判別することで動画と写真だけを取り出せました。

	
	String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
         + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE 
         + " OR "
         + MediaStore.Files.FileColumns.MEDIA_TYPE + "="
         + MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO;

	Uri queryUri = MediaStore.Files.getContentUri("external");

	CursorLoader cursorLoader = new CursorLoader(
    	this,
    	queryUri,
    	projection,
    	selection,
    	null, // Selection args (none).
    	MediaStore.Files.FileColumns.DATE_ADDED + " DESC" // Sort order.);

	Cursor cursor = cursorLoader.loadInBackground();
	

# 注意点
中身はcontent://media/external/fileとかなので、ContentObserverで登録しても

	MediaStore.Images.Media.EXTERNAL_CONTENT_URI="content://media/external/images/media"
	
などの変更は通知されてきません。
なのでCursorAdapterとかでFLAG_REGISTER_CONTENT_OBSERVERをセットしても通知されずに困りました。
個別にURIを監視するしか無いかもしれません。

また、MediaStore.Files自体はAPI 11から追加されてるみたいなので、古い場合は組み合わせで取得するしか無いみたいですね。
今頃2.3系使ってる人もいるかと思ったのですが、アプリによってはまだ1/4以上シェアがあったりします。。
defer と log.Fatal について

log.Fatal は os.Exit() を呼び出すので、deferは if文の下で良さそう

```go
file, err := os.Open('hoge.txt')
if err != nil {
  log.Fatal(err)
}
defer file.Close()
```
[参考]
[os.Exit()とdefer](http://qiita.com/umisama/items/7be04949d670d8cdb99c)
[Package log](http://golang.org/pkg/log/)
Objective-cプロジェクトをswiftで書き直すことに①


##前提

自分へのメモ代わりに投稿しておく。

新しいプロジェクトで一からswiftを書くのが一番楽なんだけど、
そうすると、バージョンアップという形が取れない。ソースだけなら可能なんだろうけど、
CoreDataを内部で使っているため、たぶんだめ。データベース？がマイグレーション扱いに
なってしまう気がする。ここあんまり調べてないので、ご存知の方いたら教えてくださいw

よって、とてつもないめんどーな方法をとるしかなかった。


##Objective-cプロジェクトで、swiftを使えるように。

ここでつまる。ネットを見ると、新規にobjective-cのファイルを作成した時に、

「XXXXXX-Bridging-Header.hを作りますか？」

とXcodeが聞いてきて、自動で作成されるみたな記事がいっぱいあるんだけど、
一向に聞いてこない。手動で追加する方法も調べましたが、納得いかず。

試行錯誤した結果、なんとも単純でした。

```
Objective-cのプロジェクトで、swiftファイルを新規作成すると、
「XXXXXX-Bridging-Header.hを作りますか？」
と聞いてきて、自動生成されます
```

で、ここにswift側で使いたいobjective-cのライブラリなんかをつらつらと
書いていくことで、swift側でimportなしで使えるようになります。
**（importしようとしてエラーになり、はまりましたw）**
こんな感じ。


```objc:XXXXXX-Bridging-Header.h
#import "BButton.h"
#import "JGActionSheet.h"
```

はい、これで環境構築完了と。
envdir みたいなのを JSON でできる envjson 作った

daemontools の [envdir](http://cr.yp.to/daemontools/envdir.html) は便利ですよね。
でも環境変数をたくさん用意しないとき、その数だけのファイルをいちいち作るのは大変ですよね。
あと、環境によって動的に環境変数を切り替えたいときとか...

というわけでファイルじゃなくて JSON で環境変数をセットできるヤツを作りました。

# [envjson](https://github.com/yuya-takeyama/envjson)

## インストール

go get するだけです。

```
$ go get github.com/yuya-takeyama/envjson
```

## 使い方

今のところ JSON はパイプからのみ読み込めます。

```
$ echo '{"FOO":"BAR"}' | envjson ruby -e 'p ENV["FOO"]'
"BAR"
```

## envdir と比べた利点

### JSON ファイルひとつだけ作ればいい

envdir では環境変数の数だけファイルを作る必要がありましたが、envjson では JSON ファイルひとつだけでいくつもの環境変数をセットできます。

### 環境変数を動的にセットできる

JSON はパイプから読み込むので、何らかのスクリプトで動的に JSON を生成して envjson すれば、動的に環境変数をセットできるようになります。

例えば以下のように JSON 生成スクリプトを用意します。

```rb
require 'json'

if ENV['RACK_ENV'] == 'development'
  DATABASE_URL = 'mysql://user:password@localhost/development'
else
  DATABASE_URL = 'mysql://user:password@production-db/production'
end

puts {"DATABASE_URL" => DATABASE_URL}.to_json
```

そして以下のように実行します。

```
$ RACK_ENV="development" ruby env.json.rb | envjson ruby app.rb
```

実際これを使うケースがあるかはよく考えるとあんまりない気もしますが...

まぁそれなりに便利なので、よかったら使ってみてください。
set -uしてるときに変数が定義されてるかチェックする

いつもシェルスクリプトを書くときは未定義だろうが気にせず使って空文字かどうかで判定してたので、`set -u`な環境下でスクリプトを書いてるときに嵌った。

## 対処

[Bash Reference Manual: Bash Conditional Expressions](http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html)にちゃんと書いてあった。

> <dl><dt><code>-v <var>varname</var></code>
> <dd>True if the shell variable <var>varname</var> is set (has been assigned a value).

なるほど。

## サンプルコード

### だめ

```bash:error.sh
#!/bin/bash

set -x # デバッグ用に冗長に出力する
set -u # 未定義変数をエラーにする

if [[ $FOO ]]; then echo y; else echo n; fi
```

```
+ set -u
./error.sh: line 6: FOO: unbound variable
```

いつもだとこれで動くんだけどなあ… と、良くない習慣。

### よい

```bash:correct.sh
#!/bin/bash

set -x # デバッグ用に冗長に出力する
set -u # 未定義変数をエラーにする

# 未定義なのでnを通る
if [[ -v FOO ]]; then echo y; else echo n; fi

# 定義する
FOO="foo"

# 定義されてるのでyを通る
if [[ -v FOO ]]; then echo y; else echo n; fi
```

```
+ set -u
+ [[ -v FOO ]]
+ echo n
n
+ FOO=foo
+ [[ -v FOO ]]
+ echo y
y
```

超いい感じですね。当然だけど `set -u` してないときもちゃんと動くよ。

## 具体例

```bash
# Jenkins実行時以外に実行したい初期化処理を書く
if [[ ! -v JENKINS_HOME ]]
then
  ...
fi
```

よかったよかった。

## 読むがよい

* [Bash Reference Manual: Top](http://www.gnu.org/software/bash/manual/html_node/index.html)
  * [Bash Reference Manual: Bash Conditional Expressions](http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html)
  * [Bash Reference Manual: The Set Builtin](http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html)

よく使ふツールのマニュアルはよく読んでおけってことですね(教訓)
yo angular のtodoチュートリアルのエラー修正メモ


やりたかったこと：
http://yeoman.io/codelab.html#toc
http://angularjsninja.com/blog/2014/09/02/video-angularjs-app-with-yeoman/


yo angular ってかなーーーり情報でてるのに、エラーありすぎて鬱でした。"angular": "1.2.16"です。やったぶん面白い技術が知れたっぽいです。
エラー修正のメモだけです。おそらく次にyo angular使うときも出ると思うので、、、


エラー直し一覧
----------

~~~Gruntfile.js
    uglify: {
      options: {mangle: false},
      dist: {
        files: {
          '<%= yeoman.dist %>/scripts/scripts.js': [
            '<%= yeoman.dist %>/scripts/scripts.js'
          ]
        }
      }
    },
~~~

mangle options をfalse にすることで、grunt serve:dist の uglify で起こる unknown provider a 問題を解決。
unknown provider a 問題は、localStorageを導入してから起きた。

~~~contorollers/main.js
angular.module('mytodoApp')
  .controller('MainCtrl', ['$scope', 'localStorageService', function ($scope, localStorageService) {

...

~~~

上のような際の問題がおきる部分を、名前が分かりやすいように書き換える。必要かどうかは不明だが、こっちのほうがいい。

~~~scripts/app.js
angular
  .module('mytodoApp', [
    'ngCookies',
    'ngResource',
    'ngRoute',
    'ngSanitize',
    'ui.sortable',
    'LocalStorageModule'
  ])

...

~~~

yo で最初に指定し忘れたモジュールは、「bower install --save @@@@@@@」で追加した後に、app.js を書き換えればおk。


~~~index.html
<div ng-include="'views/main.html'"></div>
~~~

コントローラーがここに指定されていたが、main.html内部に書き換える。

~~~main.html
<div class="container" ng-controller="MainCtrl">

...

~~~

こうすることで、共有されなかったスコープの問題を解決。

~~~main.html

	  <p class="input-group" ng-repeat="todo in todos track by $index" style="padding:5px 10px; cursor: move;">
	    <input type="text" ng-model="todo" class="form-control" >
	    <span class="input-group-btn">
	      <button class="btn btn-danger" ng-click="removeTodo($index)" aria-label="Remove">X</button>
	    </span>
	  </p>

~~~

todo in todos track by $index とする必要があった(hazu)。
なかったら、form から関数で追加しようとするときに、同一 id のエラーみたいなのでたから困った(hazu)。
複数の動画を画面n分割で同期した動画をつくるのに ffmpeg, opencv, ruby でやってみた ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

最近はやりのユーチューバーの皆さん。モンストで遊んだ動画 :movie_camera: をYouTubeにたくさん投稿されてます :tv: とても全部は見切れないので有名な :facepunch: 人気動画配信者のものだけざざっと観るだけです。

モンストのガチャの動画は結構好き :+1: で、リアクションを見てると :smile: 楽しい。そこで、↓こんな感じで画面四分割した同期した動画をつくれないかなーとやってみました :movie_camera: 

[モンストガチャを四分割で同期した動画](https://www.youtube.com/watch?v=46TK7aRHjL4)
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/56465/5e6d3953-faf3-108b-2d08-cc906a98b1a7.png)

# 実現に向けてやること

 - タイミングを合わせる :watch: のが重要です。
 - そのために各動画のガチャのタイミングが一致するフレーム番号 :1234: を見つける必要があります。

## さっそくやってみますので下準備

### 動画 :tv: から画像ファイル :file_folder: を取り出す

ffmpeg を使って↓下のようにしてフレームを画像にしてしまいます。その前に下準備でfpsを20fpsとかに揃えておくのが良いかもしれません。それにしても画像処理はPCを熱く :fire: してくれます。

```bash
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
```

### 特徴となるタイミングの画像を準備

今回うまくいくかわかりませんが、モンストのガチャで顔 :smiley: がぐるぐる回ったときの270度ぐらい回ったタイミングを使ってみます。

![gacha.png](https://qiita-image-store.s3.amazonaws.com/0/56465/9b7d74f7-c81d-f090-f62b-c1fa0be74c88.png)

各動画で↑上の画像が出てくるタイミングさえ揃えられれば、その前がどうであれ、

**ガチャ→光演出→モンスターゲット**

の流れが綺麗にそろうはずです。それにしてもなかなか金の卵 :egg: が出ませんね。

**最近イベントでやってる青いガチャやゴジラガチャは対応できません！ :anger: とほほ**

## opencv を使って、テンプレートマッチングをする

rubyを使っているので opencv をインストールした後に ruby-opencv というgemを入れた環境を準備しました。両方ともインストールにてこずりました。メモを取っていたらqiitaの記事に書けたのに :cry:

ruby-opencv の使い方は↓下の記事を参考にしました。とても分かりやすいです :+1: テンプレートマッチングはテンプレートの特徴量に近い対象画像の部分を捜査して、最もマッチする場所を教えてくれる機能で、opencvにはすぐに使えるものが実装されています。

http://qiita.com/okitan/items/9f277d7fc0479c9f4ca4

テンプレートマッチングは画像処理・検索の基本のきなので、最近はやりのディープラーニング :pencil: なんかと比べると大したことない感じもしますが、使い道によっては超強力です :penguin: 

いくつかの動画で実験して、うまくいきそうなので、この方法で進めるよ。テンプレートマッチングの結果で得られる結果の数値はあくまで相対的なものだから、はずれのフレームから得られる結果と当たりのフレームから得られる結果に明らかな差が出ているようなら、それを採用してOKと考えるよ。グラフ :bar_chart: にしてみると一目瞭然だったりします。

## フーレム番号がわかったら前後を程度にトリミング

動画のトリミング :scissors:  は ffmpeg を使います。みんなが大好き -filter_complex を使っていくよ。**trim**を使おう。単純だから -vf でもいいんだけど :wink: 

```bash
ffmpeg -i src1.mp4 -filter_complex "[0:v]trim=start_frame=10:end_frame=401" dst1.mp4
```

これで、フレームの10番目から400番目までが入った動画ができるよ :smile: 簡単だね :musical_note: 例えばもう一つの動画は70フレームがずれてたら、↓下の感じになるかもね。簡単すぎてやばいね :scream: 

```bash
ffmpeg -i src2.mp4 -filter_complex "[0:v]trim=start_frame=80:end_frame=481" dst2.mp4
```

この二つだけでも横に並べれば比較動画ができるね :hammer: 

## 四分割動画の作成

これも ffmpeg を使うとあっという間にできちゃいます。dst1.mp4 みたいな感じで、動画が4つあったとすると :oden: **overlay** 使って簡単に。元の動画サイズを 1280x720 と仮定して、それらを 640x360 に縮小しつつ四分割のモザイク動画にするよ :monkey: 

**※このコマンドライン実は検証してないから間違ってるかも :hear_no_evil: 

```bash
ffmpeg -i dst1.mp4 -i dst2.mp4 -i dst3.mp4 -i dst4.mp4 -filter_complex "nullsrc=size=1280x720 [base];[0:v]scale=640:360[scaled0];[1:v]scale=640:360[scaled1];[2:v]scale=640:360[scaled2];[3:v]scale=640:360[scaled3];[base][scaled0]overlay=x=0:y=0[out0];[out0][scaled1]overlay=x=640:y=0[out1];[out1][scaled2]overlay=x=0:y=360[out2];[out2][scaled3]overlay=x=640:y=360" comp.mp4
```

よくわからなかったらここを見て :dolphin: 
https://trac.ffmpeg.org/wiki/Create%20a%20mosaic%20out%20of%20several%20input%20videos

:cry: 書いてたら眠くなってきたのでこの辺で
firewallがあってproxyを挟むネットワークでapmをinstallする設定

```~/.atom/.apmrc
https-proxy = https://your.proxy/
http-proxy = http://your.proxy/
strict-ssl = false
```

* https://github.com/atom/apm#behind-a-firewall

Windows では ```%USERPROFILE%\.atom\.apmrc```

なんだけど、どうも git の proxy 設定には反映されないようで install に git を利用する apm は入んなーい。
WindowsでAtom-Lintが入らないの…というときはたぶんgitが足りない

タイトルで説明が終わってしまった。Atom-Lint に限らず lint / hint plugin に install 失敗するものが多くて、エラーメッセージをチラ見すると NT Platform とかなんとか見えて「node module が Windows をサポートしてないのかなー」とか思ったのですが、きちんとメッセージを読むと単に git コマンドがないせいだった。

* https://atom.io/packages/atom-lint
* http://msysgit.github.io/

しかしここでまた Windows に git を install する際には Mac / Linux で見慣れない選択肢がモリモリ出てくるのですよ。
私は Windows PowerShell から git を使うこともあるかもなと、 "Use Git from the Windows Command Prompt", "Checkout Windows-style, commit Unix-style line endings" を選んでおきました。
DjangoでつくったものをJenkinsでCIするまで


Djangoでテストを書いて、テストレポート・カバレッジレポートを出力し、Jenkinsにテスト結果を出力するまでのメモ
以下の記事を参考にさせてもらいました。
[Django でのテスト](http://qiita.com/seizans/items/2f78f2a263c63c36b267)

## 前提
BitbacketとJenkinsを連携済み。
ローカル環境からBitbacketへpushすると、自動でJenkinsのビルドが走り、テストが実行されるようになっている状態。
これらの環境構築については以下のブログを参照のこと。

[Bitbucketのprivate repositoryとJenkinsの連携について](http://yuizho.hatenablog.com/entry/2013/11/24/172246)

## Djangoでのテスト環境の構築
### モジュールのインストール
pipでdjango-noseとcoverageをインストール。
以前、unittest-xml-reportingを使って同じような環境を作ったことがあったけど、django-noseの方が色々すんなりいった気がする。

```
$ pip install django-nose coverage
```

### テスト用settingsファイルの設定
テスト用のsettingsファイルにテスト用の設定を記述。

```python
# settings_test.py

# -*- coding:utf-8 -*-
from mysite.settings import *
import os

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
#カバレッジレポート(html)を出力するフォルダを指定
COVERAGE_REPORT_HTML_OUTPUT_DIR = '.cover'

# テスト実行時の引数の設定(noseの引数)
NOSE_ARGS = [
    '--with-xunit',
    '--with-coverage',
    '--cover-xml',
    '--cover-html',
    '--cover-package=app', #テストを行うapp名を指定
]

#テスト用のB環境の設定(settings.pyのDB環境と分けている)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'test.db'),
    }
}

```

### テスト実行
テストコードをapp配下に作成(app/tests.py)して、以下のようにsettings_testを設定ファイルに指定してテストを実行する。

```
$ python manage.py test app --settings=mysite.settings_test
```

mysite/coverにカバレッジレポート(html)が出力され、mysite直下にnosetests.xml、coverage.xmlが出力されていれば成功。
これでJenkinsでCIする準備完了。

## Jenkinsでテストレポートを表示
対象プロジェクトの設定画面にて、テストレポートの出力設定を行う。
### テストを実行するコマンドを記述
ビルドのシェルの実行を選択し、シェルスクリプトテキストエリアに以下のようなテストを実行するコマンドを記述する。
Jenkinsのビルドが実行された際に、記述したコマンドが実行される。

```
# virtualenvを実行(あらかじめ任意の場所に環境を構築しておく)
source /var/www/django/mysite/venv/bin/activate
# テストを実行
python manage.py test app --settings=mysite.settings_test
```


### テストレポート(xmlファイル)の指定
ビルド後の処理のCobertura XMLレポートパターン、JUnit結果の集計にそれぞれ出力されたxmlファイル名を入力する。
今回はmysite直下にxmlを出力しているので、そのままファイル名を入力すればよい。
![スクリーンショット 2014-11-11 1.15.54.png](https://qiita-image-store.s3.amazonaws.com/0/12603/a737ea41-746b-1fd9-7cce-4471912387be.png "スクリーンショット 2014-11-11 1.15.54.png")

以上の設定を行うことにより、ビルド実行時にJenkinsにテストレポートが表示されるようになった。

![スクリーンショット 2014-11-11 1.29.31.png](https://qiita-image-store.s3.amazonaws.com/0/12603/a512e3c8-4c2d-b1c2-7f7f-757bcb8d5083.png "スクリーンショット 2014-11-11 1.29.31.png")
HybridAuthを利用したOAuth認証（Facebook編）

背景
--------------------

お客様依頼にて、HybridAuthを利用してOAuth認証を実現したいという要望があり、実現方法を調査した。


環境
--------------------

### サーバー環境

* OS：CentOS6.5
* クラウド：AWS
* PHP5.6
    * Composerを利用


実装
--------------------

基本的には以下のページを読み進めて行けば実現可能だが、 **(1)英語であること** 、 **(2)OAuthの仕組み（流れ）がややこしく、実装経験がないと詰まりやすい** という点に注意。

<a href="http://hybridauth.sourceforge.net/userguide/IDProvider_info_Facebook.html">Facebook Authentication - HybridAuth</a>


### Facebook Developers上の設定

<a href="https://developers.facebook.com/">Facebook Developers</a> にアクセスし、ブラウザからアプリケーションの設定を実施する必要がある。

設定の流れは大きく以下のとおり。

1. アプリケーションの登録を行う
2. 実際にOAuth認証機能を設置するサーバーのURLを設定する
3. 登録後、**App ID**、**App Secret**を取得する
4. **App ID**、**App Secret**は後の手順で利用するために、必ず控えておくこと


![](https://lh4.googleusercontent.com/EgPHVXKCU4c8_a_BJsva9YmaaRygWbomxOsjTjnB5qDUnf0LXVbiv240RY3mVAsDuDKUU-P8gckjFRpD3MyU=w960-h960-rw)


### Hybridauthのインストール

<a href="https://getcomposer.org/">Composer</a>を利用してセットアップするのが楽ちん。

以下の作業はドキュメントルートで実施。

#### 1.**Composer**のサイトから **composer.phar**をダウンロードしてくる。

#### 2.**composer.json**というファイルを用意し、以下の内容を記述する。

```php
{
    "name": "genzouw/hybridauth_example",
    "authors": [
        {
            "name": "genzouw",
            "email": "genzouw@gmail.com"
        }
    ],
    "require": {
        "hybridauth/hybridauth": "2.2.2"
    }
}
```

#### 3.コマンドラインから、以下のコマンドを実行する。

```sh
$ php composer.phar install
```

といろいろ書いたが、ドキュメントルートに以下のファイルを展開したものを配置するだけでも良い。

* http://goo.gl/yNAmjG

#### 4.最後に**index.php**、**auth.php**というファイルを作成し、以下の内容を記述する。

ここでの注意は、**#Server IP#**には自分のサーバーのIPアドレス（もちろんドメインでもOK)、#App ID#, #App Secret#**には先程のFacebookページで設定した最後のページに表示されている値をセットすること。

```php
<?php

require_once __DIR__ . '/vendor/autoload.php';

$config = array(
    "base_url" => "http://#Server IP#/auth.php",
    "providers" => array (
        "Facebook" => array (
            "enabled" => true,
            "keys"    => array ( "id" => "#App ID#", "secret" => "#App Secret#" ),
            "scope"   => "email, user_about_me, user_birthday, user_hometown", // optional
            // "display" => "popup" // optional
        )));

use hybridauth\Hybrid\Auth;

$hybridAuth = new Hybrid_Auth( $config );

$adapter = $hybridAuth->authenticate( "Facebook" );

$userProfile = $adapter->getUserProfile();

echo '<pre>'; var_dump($userProfile); echo '</pre>';
```

**auth.php**については、もうこういうおまじないだと思ってつくったらOK。

```php
<?php

require_once __DIR__ . '/vendor/autoload.php';

require_once "vendor/hybridauth/hybridauth/hybridauth/index.php";
```


#### 5.index.phpにアクセスすると、Facebookの認証が行われる。

認証が成功すれば、ユーザー情報が出力されるはずです。


あとがき
--------------------

Twitter OAuthで躓く人は少ないですが、Facebook OAuthで躓く方はちらほらいらっしゃいます。
僕も何度もつまづきました。

Facebook Graph APIで取得できる情報がTwitterよりも多いということも要因の一つであり、認証が強固になっているのだと思います。
特定文字を指定文字数目に挿入したい

表題の処理をしたい（例えば、'20141110'の4文字目にハイフンを入れて'2014-1110'にしたいとか）ケースがあったが、簡単に実施する方法がよく分からなかったので、以下のような関数にしてみたが、どうなんだろう。。

```php:insert.php
<?php

/**
 * 
 * @param type $text1 元の文字列
 * @param type $num 挿入先の文字数目
 * @param type $text2 挿入文字
 */
function insertStr($text1, $num, $text2){
    return substr($text1, 0, $num).$text2.substr($text1, $num, strlen($text1));
}

echo insertStr("20141110", 4,  "-");//string(2014-1110)
```
MyBatisのログ整形

MyBatisで出力されるログの整形ツールを作りました。
…ツール本当にいるのかな…設定でなんとかなったりしたらすみません。

# 環境

* MyBatis3.2.3
* Oracle11g

# 使い方
こんな感じのSQLとパラメータが連続する2行をコピーして

```:ログサンプル
[DEBUG:selectByPrimaryKey] ==>  Preparing: select USER_ID, START_DATE, MST_USER_ID, USERNM_SEI, USERNM_MEI, PASSWORD, MST_DEPT_ID, ROLE_ID, END_DATE, VERSION_NO from SADB.MST_USER where USER_ID = ? and START_DATE = ? 
[DEBUG:selectByPrimaryKey] ==> Parameters: 1(String), 2014-11-10(Date)
```
以下URLにアクセスして
http://jsfiddle.net/ko_aoki/tuqaxunk/3/embedded/result/

![mybatisFormat.png](https://qiita-image-store.s3.amazonaws.com/0/51210/640e5902-57e3-a90e-c915-4ff736d02009.png)

上部テキストエリアにペーストして「format」を押下。

かなりざっくりなので、整形できないSQLもあるかもですが。。
UI BootstrapのModalをネストさせてもbackdrop（背景）は1つしか作られない

[ドキュメント](http://angular-ui.github.io/bootstrap/index.html#modal)には特に書いてありませんが、backdropClassオプションの指定は最上位の階層のModalを作成する際にしか効きません。

なんでかというと、ネストした際にはbackdropは作られないのでした（ハマった）

1回しか作られないぞー
---------------------------------

* [modal#openされると$modalStackに積まれる](https://github.com/angular-ui/bootstrap/blob/master/src/modal/modal.js#L385)
* [backdropは一番最初に必要になった時にのみ作られる](https://github.com/angular-ui/bootstrap/blob/master/src/modal/modal.js#L247)

Modalを作るたびにz-indexが上がっていくぞー
----------------------------------

* [templateにz-indexが指定されているぞー](https://github.com/angular-ui/bootstrap/blob/master/template/modal/backdrop.html)
* [z-indexに使われるbackdropIndexは$watchにより反映されるぞー](https://github.com/angular-ui/bootstrap/blob/master/src/modal/modal.js#L154)

ちなみにbackdropを作成したくない場合、`{backdrop: false}`オプションを指定すればOKで、こちらはネストした場合でも効きます。

はー、なるほどよく出来てるなぁ・・・！
でもドキュメントだけじゃわからないことがかなり多いのよなぁ。。。
xargsとseqを組み合わせて楽をする

※覚え書きです。便利なのに忘れそうで。

# たとえばこんな時に

vm1, vm2, vm3, ... にscpでファイルtest1.txt, test2.txt, test3.txt, ...をそれぞれ転送する。

# こう使う

```
seq 1 5 | xargs -i scp test{}.txt vm{}:/tmp
```

## こう書くのと同じ

```
scp test1.txt vm1:/tmp
scp test2.txt vm2:/tmp
scp test3.txt vm3:/tmp
scp test4.txt vm4:/tmp
scp test5.txt vm5:/tmp
```

# 解説

## seq

seqは開始と終了の数値を指定して数列(sequence)を生成する。

## xargs

xargsは"-i"オプションを利用すると、{}に受け取った数値を代入して引数のコマンドを実行する。

なお、xargsは入力した値ごとにコマンドを実行する。

# 補足

seqは開始と終了の間に刻み幅を指定できる。

```
# 4 7 10という数列を作る場合
seq 4 3 10
```
Ubuntu14.10へのGTX750ドライバインストール

設定画面の追加のドライバでビデオカードが認識されず、知識も無くて色々詰んだので。
自分用のメモ程度に。

```
sudo apt-add-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nvidia-343
sudo reboot
```

でうまくいった。
今後の事は知らない。
Ruboty | Ruboty Handler Plugin 作成時に公開するための Markdown 形式の技術エントリ テンプレートジェネレータ ruboty-articlegen #ruboty

# Ruboty | Ruboty Handler Plugin 作成時に公開するための Markdown 形式の技術エントリ テンプレートジェネレータ ruboty-articlegen を作成した #ruboty
## 概要
Ruboty Handler Plugin 作成時に公開するための Markdown 形式の技術エントリ テンプレートジェネレータ ruboty-articlegen を作成した

## 前提
出力フォーマットは Qiita Markdown を前提にしています。

## 用途
Ruboty の Handler Plugin を作成した場合、周りに周知する意味で
Qiitaなどの技術エントリやブログのエントリを作成する方は多いと思います。

Ruboty の Plugin などは人によっては何度も作成するため、
記事の作成行為の中に WET (write every thing) な作業があるはずです。
そういった作業を DRY にするために、このジェネレータを利用します。

## 設定
内部DSL ( Rubotyarticlegen ) によって設定を行います。

|key|value|example|
|:--|:--|:--|
|user_name user name|tbpgr|
|gem_name|gem 名|ume|
|title|タイトル文字列|チャットを空メッセージ or 任意のメッセージで埋める ruboty-ume を作成しました|
|purpose|用途|ruboty google_image で妙な画像を引き当ててしまった。<br>そんなときに限って、偉い人が近づいてくる。<br>急いでチャット画面から画像を追い出すんだ。<br><br>内緒のメッセージのやりとり。<br>そんなときに限って、内緒のやりとりがばれるとまずい相手が近づいてくる。<br>急いでチャット画面から画像を追い出すんだ。<br>そんな時に空行を大量に追加してメッセージを画面外に追い出します。|
|env/name|環境変数|DEFAULT_UME_TEXT|
|env/description|環境変数の説明|default ume text|
|dependencies/name|依存先名称|Ume API|
|dependencies/description|依存先説明|Ume API の説明やURL|
|commands/command name|Ruboty::Handler.on の name に設定する内容 ※件数分|ume|
|commands/command pattern|Ruboty::Handler.on の pattern に設定する内容 ※件数分|/ume (?<count>.*?)\z/  |
|commands/command description|Ruboty::Handler.on  の description に設定する内容 ※件数分|output empty message N lines (<count> times)|
|commands/command example|実行例|※コンソールでの実行例|

## 設定例

~~~
# encoding: utf-8
user_name "tbpgr"

gem_name "ume"

title "チャットを空メッセージ or 任意のメッセージで埋める ruboty-ume を作成しました"
purpose <<-PURPOSE
ruboty google_image で妙な画像を引き当ててしまった。
そんなときに限って、偉い人が近づいてくる。
急いでチャット画面から画像を追い出すんだ。

内緒のメッセージのやりとり。
そんなときに限って、内緒のやりとりがばれるとまずい相手が近づいてくる。
急いでチャット画面から画像を追い出すんだ。

そんな時に空行を大量に追加してメッセージを画面外に追い出します。
PURPOSE

env do |e|
  e.name "ENV1"
  e.description "ENV1 desc"
end

env do |e|
  e.name "ENV2"
  e.description "ENV2 desc"
end

dependency do |d|
  d.name "dependency1"
  d.description "dependency1 description"
end

dependency do |d|
  d.name "dependency2"
  d.description "dependency2 description"
end

command do |c|
  c.name "ume"
  c.pattern "/ume (?<count>.*?)\z/"
  c.description "output empty message N lines (<count> times)"
  c.example <<-EXAMPLE
>ruboty command1
>result1
  EXAMPLE
end

command do |c|
  c.name "umec"
  c.pattern "/umec (?<text>.+?) (?<count>.*?)\z/"
  c.description "output <text> message N lines (<count> times)"
  c.example <<-EXAMPLE
>ruboty command2
>result2
  EXAMPLE
end
~~~

## 出力例
[sample output Markdown](https://github.com/tbpgr/ruboty-articlegen/blob/master/sample/ruboty-ume.md)

## 参照
[ruboty-articlegen GitHub](https://github.com/tbpgr/ruboty-articlegen)
[ruboty-articlegen RubyGems](http://rubygems.org/gems/ruboty-articlegen)
[Ruboty関連記事](http://qiita.com/tbpgr/items/f16c506c4a2636e95d34)
[Ruboty | Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen を作成した #ruboty](http://qiita.com/tbpgr/items/33ccf5709cb553b2095f)
sangoの使い方 -- C#編

sangoの使い方 -- C\#編
======================

これまでppatiernoさんが開発していたMQTTライブラリ
[m2mqtt](http://m2mqtt.wordpress.com/) がpahoに寄贈されました。

<http://www.eclipse.org/paho/clients/dotnet/>

このライブラリは以下の.Netプラットフォームに対応しています。

-   .Net Framework (4.5まで)
-   .Net Compact Framework 3.5 & 3.9 (for Windows Embedded Compact 7 /
    2013)
-   .Net Micro Framework 4.2 & 4.3
-   Mono (for Linux O.S.)
-   WinRT platforms (Windows 8.1 and Windows Phone 8.1)

ただし、現時点ではMQTT 3.1.1には対応していません。(sangoは3.1にも対応
しています)

確認していませんが、このライブラリを使えばUnityでもMQTTが使えるかもしれませんね。

1. ライブラリのダウンロード
---------------------------

<http://www.eclipse.org/paho/clients/dotnet/>

からダウンロードできます。

ただし、 codeplexがNuGetで配布しておりますので、NuGetからダウンロード し
たほうが簡単かと思います。(m2mqttで検索)

2. クライアントの実装
---------------------

### Connect

``` {.sourceCode .csharp}
class MQTT
{
    private MqttClient client;

    public void Connect(string brokerHostname, int brokerPort,
    string userName, string password)
    {
        // SSL使用時はtrue、CAを指定
        client = new MqttClient(brokerHostname, brokerPort, false,
        null);
        // clientidを生成
        string clientId = Guid.NewGuid().ToString();
        client.Connect(clientId, userName, password);
    }
```

uPLibrary.Networking.M2Mqtt.MqttClientをnewして、Connectします。
MqttClientでは、ホスト名だけを指定するなどのオーバーロードがあります。

### Subscribe

``` {.sourceCode .csharp}
// メッセージ到着時に呼び出されるメソッド
private void onReceive(object sender,
uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e)
{
    Console.WriteLine(e.Topic);
    string msg = Encoding.UTF8.GetString(e.Message);
    Console.WriteLine(msg);
}

public void Subscribe(string topic){
    // callbackを登録
    client.MqttMsgPublishReceived += this.onReceive;
    client.Subscribe(new string[] { topic }, new byte[] {
    MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
}
```

`client.MqttMsgPublishReceived` にメソッドを追加しておき、 `Subscribe`
します。

### Publish

``` {.sourceCode .csharp}
public void Publish(string topic, string msg)
{
    client.Publish(
        topic, Encoding.UTF8.GetBytes(msg),
        MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); // retainが
        false
}
```

`Publish` をするだけです。

参照
----

M2Mqtt Client

:   <http://m2mqtt.wordpress.com/m2mqtt_doc/>
Elixir Map の更新 #elixir

# Elixir Map の更新

## 概要
Elixir の Map の更新について

Elixir の Map は immutable です。
そのため、 Map の更新結果は新たな Map です。

## 更

~~~
old_map = %{five: 5, four: 4, six: 6}
IO.inspect old_map
# 要素の更新のみ可能な文法。新規要素は追加できない
IO.inspect  %{ old_map | five: 7 }

# 追加要素が存在しなければ、要素の追加
IO.inspect Map.put(old_map, :seven, 7)
# 追加要素が存在すれば、要素の更新
IO.inspect Map.put(old_map, :five, 7)
~~~

* 出力

~~~
%{five: 5, four: 4, six: 6}
%{five: 7, four: 4, six: 6}
%{five: 5, four: 4, seven: 7, six: 6}
%{five: 7, four: 4, six: 6}
~~~
IntelliJ IDEAで開いているファイルやディレクトリをtmuxや任意のエディタ・コマンドに渡す


普段仕事でIntelliJで主にPHPを書いていますが、IntelliJ上でやりたくない作業がちょくちょく出てくるので不便してました。

- 解析とかせずにファイルをリネームしたい
- 適当なエディタのAlignやMulti Cursorでコードを整理したい
- ディレクトリ以下をシェルでgrepしたい ...etc

みたいなことが起きたときに頑張ってシェルから移動して操作をしていたのをどうにかしました。
プラグイン入れなくても標準の機能だけでできたので簡単でした。

Preferences > Tools > External Tools から + を押して以下のように入力します。

![スクリーンショット 2014-11-04 17.40.49.png](https://qiita-image-store.s3.amazonaws.com/0/32836/f2fc4f1c-0176-99cf-654f-56450fa66e22.png "スクリーンショット 2014-11-04 17.40.49.png")

tmuxのパスやエディタなどは適当に書き換えてください。
これで作成した後、Project Windowからファイルを右クリック > External Tools > vim などすると現在アクティブなtmuxのPaneでvimでファイルが開きます。

同様にディレクトリをtmuxで開くものとダイアログ入力からgrepするものを作成しました。

![スクリーンショット 2014-11-04 17.40.19.png](https://qiita-image-store.s3.amazonaws.com/0/32836/ca1a4549-6328-54b1-1777-5bfaef50b8fc.png "スクリーンショット 2014-11-04 17.40.19.png")


![スクリーンショット 2014-11-04 18.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/32836/75bf508c-3091-4d18-943d-b18e23d00ee6.png "スクリーンショット 2014-11-04 18.02.11.png")
Capybaraのメソッドメモ


自分が日本語で検索したときに、情報が拾えなくって困ったので、
使ったものや必要なものをメモとして残しておきます。
随時更新していきます。
参考：[Class: Capybara::Session — Documentation for jnicklas/capybara (master)](http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Session)

## 情報表示
### body
htmlと同じ
### html => String
現状のDOMのスナップショットを返す(JSで変更されたかもしれない)
### source
htmlと同じ

### current_url => String
現状のページのURLを返す
### current_host => String
現状のページのhostを返す
### current_path => 

## ブラウザ動作
### execute_script(script) => Object
JavaScriptを実行して値を返す

### evaluate_script(scripr) => Object
JavaScriptを実行する

### visit(url) => Object
URLへ移動する

```
session.visit('/foo')
session.visit('http://google.com')
```

### go_back => Object
ブラウザの履歴を戻る

### go_forward => Object
ブラウザの履歴を進む

## 未分類

### within

within(:xpath, '//div[@id="delivery-address"]') do
  fill_in('Street', :with => '12 Main Street')
end

### within_fieldset

### within_table

### within_frame

### current_window => Capybara::Window

### windows => Array<Capybara::Window>

開いている全てのWindowを取得。
順番は定義されていない。

### open_new_window

### switch_to_window
Windowの切り替え

```ruby
switch_to_window(&block) => Capybara::Window
switch_to_window(window) => Capybara::Window
```

```ruby
window = switch_to_window { title == 'Page title' }
```
### within_window
### window_opened_by

### save_page(path = nil) => String
スクリーンショットの保存

### save_and_open_page

### save_screenshot

### save_and_open_screenshot

### reset_session!

### response_headers

### status_code => Integer
HTTP のステータスコード

### current_scope