OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OS XのHomebrewでアップデート(brew update)に失敗するときの対処

久しぶりに作業しようとしたら、こんなアラートが出て失敗してしまった。

# brew update時のエラー

```zsh
$ brew update
error: Your local changes to the following files would be overwritten by merge:
	Library/Aliases/actor-framework
.
.
.
error: The following untracked working tree files would be overwritten by merge:
	Library/.rubocop.yml
.
.
.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master
```

# 対処方法

こんなワンライナーで対応出来た。

```zsh
$ cd `brew --prefix`; git checkout -f origin/master; git checkout -f master; git reset --hard origin/master; brew update
```

## 参考資料
- [Older Homebrew Fails to Update #33746](https://github.com/Homebrew/homebrew/issues/33746)
13日の金曜日を返すプログラム

#13日の金曜日を返すプログラム
今年2015年は「13日の金曜日」が3回もありジェイソンさんが
忙しいというのをどこかでみたので、ツェラーの公式を使って作ってみました。
##ソースコード

```jason.rb
# coding: utf-8

def yearSplit(year)
	array = []
	str = year.to_s
	array.push(str.slice!(0,2).to_i)
	array.push(str.to_i)
	return array
end

def getDayOfWeek(year, month, day)
	case month
	when 3..12
		y = yearSplit(year)
		m = month
	else
		y = yearSplit(year-1)
		m = month+12
	end
	d = day
	h = ( y[1] + (y[1]/4).floor + (y[0]/4).floor - 2*y[0] + (13*(m+1)/5).floor + d ) % 7
	return h==0 ? 7 : h
end

puts "Please input the year."
year = gets.to_i
for month in 1..12
	if getDayOfWeek(year, month, 13) == 6
		print "#{month}/13\t"
	end
end
puts
```

##実行結果
```
$ ruby jason.rb
Please input the year.
2015
2/13	3/13	11/13
```
ADLのトンデモ挙動と対策のお話

ADL(実引数依存の名前探索) とは、関数のオーバーロード解決の際に引数の名前空間を探索するというものです。
驚くかもしれませんが、以下のコードは問題なくコンパイルできます。

```
namespace test
{
struct test_t {};
void func( test_t ); // bla bla
}
int main()
{
  func( test::test_t() );
}
```

この悪名高いADLですが、実際はないと困る機能なのです。例えば以下のコード、ADLがなければ `operator==`をかっちり書いてやらなければならなくなってしまいます。

```
std::string str1( "abc" );
std::string str2( "abcd" );
if( str1 == str2 ) { ... } // if ADL is disabled, no operator==() is found.
if( std::operator==( str1, str2 ) { ... } // ok
```

対策ですが、ADLは引数の名前空間を探索するものなのですから、関数と引数とで名前空間を分けてしまえばいいのです。

```
namespace test
{
namespace _test_t
{
struct test_t {};
}
using namespace _test_t;
void func( _test_t::test_t );
}

int main()
{
  func( test::test_t() ); // func not found
}
```

名前空間で区切ったあとusingディレクティブで名前空間の壁を取っ払っていますが、ADLの探索条件から外れるのでこれで問題解決になります。
では、ADLが問題になりうるケースをいくつか紹介しておしまいにしようと思います。

１. 基底クラスの名前空間が探索の対象になる

```
namespace test
{
struct test_t {};
void func( test_t );
}
struct super_test_t : test::test_t {}; // public inheritance


int main()
{
  func( super_test_t() ); // ok!
}
```

２. テンプレート引数の名前空間が探索の対象になる

```
namespace test
{
struct test_t {};
template < class Ty >
void func( Ty );
}

template < class Ty >
struct template_t {};

int main()
{
  func( template_t < test::test_t >() ); // ok!
}
```

~~これらを組み合わさって複数の関数がADLによって見つかると、曖昧な呼び出しとして怒られます。~~
怒られない環境もあるようですね。恐ろしいことです。

```
namespace testA
{
struct test_t {};
template < class Ty >
void print( Ty ) { std::cout << "testA::print" << std::endl; }
}
namespace testB
{
template < class Ty >
struct template_t {};
template < class Ty >
void print( Ty ) { std::cout << "testB::print" << std::endl; }
}

int main()
{
  print( testB::template_t < testA::test_t >() ); // ambiguous
}
```
Rubyのメソッド引数

ちょっと調べたので書いとく

```
% ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
```

**普通**

```rb
class Sample
  def hoge
    p "hoge"
  end
end

sample = Sample.new
sample.hoge
```

```
"hoge"
```

**引数のデフォルト**

```rb
class Sample
  def hoge(a, b=1)
    p "a:#{a}, b:#{b}"
  end
end

sample = Sample.new
sample.hoge(1, 2)
sample.hoge(1)
sample.hoge
```
```
"a:1, b:2"
"a:1, b:1"
`hoge': wrong number of arguments (0 for 1..2) (ArgumentError)
```

**可変長引数**

```rb
class Sample
  def hoge(*args)
    p args.join(",")
  end
end

sample = Sample.new
sample.hoge
sample.hoge(1, "hoge", {a: 100})
```
```
""
"1,hoge,{:a=>100}"
```

**キーワード引数**

```rb
class Sample
  def hoge(a: "aaa", b: "bbb")
    p "a:#{a}, b:#{b}"
  end
end

sample = Sample.new
sample.hoge
sample.hoge(a: "1", b: "2")
sample.hoge(b: "1", a: "2")
sample.hoge(b: "100")
```
```
a:aaa, b:bbb"
"a:1, b:2"
"a:2, b:1"
"a:aaa, b:100"
```

**同名メソッド**

```rb
class Sample
  def hoge
    p "hoge"
  end

  def hoge(i)
    p "hoge #{i}"
  end
end

ample = Sample.new
sample.hoge
sample.hoge(5)
```
```
`hoge': wrong number of arguments (0 for 1) (ArgumentError)
```
シンプルな方法で一回きりdelegateをcallbackに

巷は結構Swift化したようですが、C++と連携したい非UI部分はどうしてもObjective-C++のままもうしばらく残ると予想しています。Objective-Cのdelegateパターンが苦手だったのでC++の単なるcallback (block)形式に持ち込む方法を考えました。ポイントは**2重callbackにすること**と、**意図的に循環参照に持ち込んでオブジェクトを保持し、callbackで循環を断ち切る**こと。割とシンプルだと思います。

AVAudioPlayerを使う例で紹介します。もちろん任意のdelegateを使ったクラスに使える仕組みだと思います。

# やりたいこと
単純に以下の関数形式でオーディオファイルを再生できるようになりたいです。これならC++クラスからでもすんなり呼べるくらいに内情を完全に隠蔽できています。本来のdelegate方式だとAVAudioPlayerDelegateの継承が必要なのでC++クラスからは事実上呼べません。

```objc++
#include <functional>

using AudioPlayCallback = std::function<void(bool successfully)>;
void playAudio(NSString* absPath, AudioPlayCallback callback);
```

# blockを使ってdelegateを隠蔽するクラスを作る
以下のようにdelegateをコールバックに変換する受け皿を用意します。

-  delegateであるaudioPlayerDidFinishPlayingの中身で普通のcallbackを呼び直します。
-  この手のコードを書くとき、循環参照になってオブジェクトが死ななくなるミスを起こしがちなので、deallocメソッドをoverrideしてbreakを貼れるようにしておくとデバッグが容易になります。
-  regainメソッドについては下で説明します。

```objc++
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import "audioplay.h" // 上のプロトタイプ宣言が書いてある

@interface AVAudioPlayerBlocks : NSObject<AVAudioPlayerDelegate>
@end

@implementation AVAudioPlayerBlocks{
    AVAudioPlayer *_player;
    AudioPlayCallback _callback;
}

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    _callback((bool)flag);
    _player = nil;
}

-(bool)playAudio: (NSString*) absPath callback:(AudioPlayCallback) callback{
    _callback = callback;
    NSError *error = nil;
    NSURL *url = [[NSURL alloc] initFileURLWithPath:absPath];
    
    _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    
    if ( error != nil ){
        NSLog(@"Error %@", [error localizedDescription]);
        return nil;
    } else {
        [_player setDelegate: self];
        [_player play];
        return _player;
    }
}

- (AudioPlayCallback) regain{
    auto callback = _callback;
    _callback = nil;
    return callback;
}

- (void)dealloc{
    //ここにbreakを貼ればdeleteタイミングが分かる
}
@end
```

# オブジェクトの寿命をコントロールしながらcallbackする
上で作ったAVAudioPlayerBlocksをうまく使ってplayAudio関数を実装します。

-  安直にAVAudioPlayerBlocksを関数ローカルに作ると、関数終了後にオブジェクトがすぐ死んでしまい、callbackまで待てません。そこでAVAudioPlayerBlocksに渡すcallbackをC++のlambdaで作る際にオブジェクトをキャプチャしておきます。
-  lambdaで一時オブジェクトblockをキャプチャして延命しましたが、この後lambda自体がblockの_callbackメンバ変数にセットするので見事に循環参照が出来上がってます。そこで、lambda関数の最後で自身をblockから取り返すregainメソッドを呼んでおきます。これで無事にメモリ解放されるようになりました。

```objc++
void playAudio(NSString* absPath, AudioPlayCallback callback){
    AVAudioPlayerBlocks *block = [[AVAudioPlayerBlocks alloc] init];

    // blockをキャプチャして生き残らせる(ただしこのstd::functionをblockに持たせるので循環参照になる)
    auto callback_local = [block, callback](bool flag) -> void{
        callback(flag);
        auto _ = [block regain]; // 渡したstd::functionを回収して循環参照を断ち切る(捨てるだけだとこの関数実行中に自身が消滅するので、受け取るのは必須)
    };

    [block playAudio:absPath callback:callback_local];
}
```
CircleCIでgithubに置かれた依存Goプロジェクトの特定ブランチをビルドする

Goプロジェクトをビルドする場合、依存するプロジェクトを `go get` しておくわけなんですが、GOプロジェクトの場合 master ブランチを取得してきます。
普通はこれで問題ないんですが、自分用にフォークして変更したものを `go get` したい場合これでは困ります。
そこで検索したところ、以下の情報を見つけました。
 
- [go getでgithubに置かれた特定ブランチをインストールする - Qiita](http://qiita.com/hash/items/6b57265f3440d4fef670)

あとは CircleCI 上で GOPATH が分かればできそうです。
ssh でログインしたところ GOPATH は `~/.go_workspace` だったので、以下のようにしてあげたところ目的のブランチをビルドできました。

```yaml:circle.yml
machine:
  timezone:
    Asia/Tokyo
test:
  override:
    - exit 0
deployment:
  release:
    branch: master
    commands:
      - go get github.com/toruuetani/ghr
      - cd ~/.go_workspace/src/github.com/toruuetani/ghr
      - git checkout feature-add-commitish-support
      - go install
      - ...
```
スイッチサイエンスのイーグレットにUSBシリアル変換モジュールを付けてEdisonにシリアル接続する。


以前スイッチサイエンスのイーグレットを購入したのですが、
シリアル接続するためには自分でハンダ付けをしなければなりませんでした。
Wifi経由のssh接続でもいいかなとは思っていたのですが
やはり有線で繋げる方法は作っておきたいと思い、USBシリアル変換モジュールを付けて有線でシリアル接続できるようにしてみました。
　
スイッチサイエンス版Eaglet （MFTバージョン）
https://www.switch-science.com/catalog/2070/

USBシリアル変換モジュール
http://akizukidenshi.com/catalog/g/gM-08461/

電子工作なんてまったく経験がないのでうまくいくか心配でしたがなんとかうまくいきました。

![IMG_1629.png](https://qiita-image-store.s3.amazonaws.com/0/11776/32668fc7-2696-6e57-9f37-7a1690067b87.png)

これをソケット使ってハンダ付けします。
![IMG_1631.JPG](https://qiita-image-store.s3.amazonaws.com/0/11776/6e5c6276-bb63-a806-440e-2cf233b3a2f8.jpeg)

これでちゃんとシリアルコンソールからログインすることができました。
USBシリアル変換モジュールの5vはいまんとこ使う予定ないので放置。
ハンダ付けに慣れてないので今後はうまくやっていきたいですね。
UnityのStartCoroutine ~処理を分割~

#描画はフレームごとに行われる
　まず、下記スクリプトを実行します。おそらくUnityがGameモードで固まります。。。

```csharp
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {	
	void Update () {
		while (true) {
			Debug.Log ("Update");
		}
	}
}
```

　そもそもこのコードはフレームごとに実行されるUpdateがwhileで延々に周り続けているので、フレームが更新されないので描画ができません。
　一応、理解していただきたいのは**画面描画はフレームごとにされる**ということです。　

# 処理を分割
　擬似Update文を作成してみました。
[フレームレートを調節してみる](http://qiita.com/okuhiiro/items/b865bd63c52c4a5b7b9a)とMyUpdateがUpdateと同じような動作をしているようにはっきりわかると思います。

```csharp:NewBehaviourScript.cs
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

	void Start () {
		StartCoroutine (MyUpdate());
		Debug.Log ("Start");
	}

	private IEnumerator MyUpdate() {
		while (true) {
			Debug.Log ("MyUpdate");
			yield return null;
		}
	}
}
```

　Updateでできるものなんで書いてみたかというと、ここで理解できることがあります。MyUpdateは**フレームごとに実行されている**ということです。
もっと細かくいうとyield return区切りでフレームが実行されているということになります。
「MyUpdateが呼ばれる → whileに入る → yield returnで1フレームまつ(**描画される**) → whileにはいる」
のループが実行される感じかと思われます。

　これを実装するとフレームごとに実行される処理をUpdateとは別の場所で記述できるようになります。(あんまりやりませんが...)
Rubyのfloat型を小数で標準出力する

Aizu Online Judgeの問題で割り算していたらハマったので備忘録。

OS X Yosemite, Ruby 2.1.3p242です。

入力例

```
2 100000009
```

を受け取って前者割る後者を浮動小数点数で計算したものを返す問題です

```hoge.rb
a = gets.split.map(&:to_f)
puts "%.8f" % "#{a[0]/a[1]}"
```

でうまく行きました。

計算結果

```
0.00000002
```
タスクリストの画面サムネイルを制御する

HC以降、タスクリストに画面のサムネイルが表示される。

![thumbnail.png](https://qiita-image-store.s3.amazonaws.com/0/56966/37c19d7e-5dbf-8c4e-4d19-35e2f0918636.png)

このサムネイルをアプリ側でカスタマイズできないか試してみた。

## onCreateThumbnail()のoverride

先に結果から言うと、カスタマイズできないっぽい。

Activityに以下のメソッドが定義されている。

```java
public boolean onCreateThumbnail (Bitmap outBitmap, Canvas canvas)
```

onPause()の前で、Thumbnailが作成されるタイミングでCallされるそうだが、ほとんどの機種でサポートされていないらしい。(Xperia GだとCallされなかった)

## FLAG_SECUREを指定

WindowにFLAG_SECUREを指定する。

```java
public class MainActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
        
        setContentView(R.layout.main);
    }
}
```

これはアプリの画面をscreenshot機能で撮影できなくする手法として知られるが、タスクリスト上でも画面サムネイルを**黒表示**にすることができる。

## タスクリストから除外する

Activityのプロパティに以下を指定する。

```xml
android:excludeFromRecents="true"
```

これによりActivityがタスクリストに表示されなくなる。(黒画面サムネイルとは違い、表示すらされないので注意する)
Unityのフレームレートを調節

「Edit」-「Project Settings」-「Quality」
にあるVSync Countを「Don't Sync」にし下記のようなスクリプトで調整できます。

```csharp
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

	void Start () {
		Application.targetFrameRate = 1;
	}

   void Update () {
        Debug.Log ("hogehoge");
   }
}
```

　実行するとUpdateが1秒に1回しか実行されていないのがわかると思います。 

　実際ゲームではあんまり「Don't Sync」するメリットはないので、テスト用な使い方が多いです。
Bootcamp削除しようとしたら失敗した時の対処法

bootcampにWindowsを突っ込んでゲームしたり、動作確認したりしてたけど、最近めっきり使わなくなったので、削除しようとしたら途中で失敗して、Mac本体のHDDに謎の空間領域が出来てしまった現象に陥りました。
やり方はいろいろあるみたいなんですが、自分なりにこれが一番手っ取り早い、かつ、楽かもしれないという方法をまとめてみます。

## まず原因

こうなった原因はそもそもbootcampで使ってるパーティーションもフォーマットが原因だったみたい。
多分FATとかになってると思うので、これをMacOS拡張のフォーマットにしてあげてから、bootcampアシスタントで削除してればあっさりうまくいったかもしれません。もう後の祭りですけど。
（キャプチャあるとわかりやすかったかもしれないんですが、取れませんでした…ごめんなさい。）

## まぁとりあえず落ち着いてバックアップから取って行きましょう。

方法はなんでもいいとお思いますが、TimeMachineとか持ってるなら、今すぐバックアップメニューでバックアップ開始しておくと直近の状態で復元出来ると思います。
そこまで必要ないけど、大事なデータだけという人は人力で設定ファイルとかをDropboxとかにサルベージしておくのがいいと思います。

## 謎の空白領域を消すにはOS再インストールしかない。
のですが、ここで一つ問題です。
通常であれば、option押しながら起動して復旧ディスクからインストール可能なんですが、その前に、HDDを消去しないと空白領域を消えてくれません、残念ながら。

本体のHDDを消去するには本体からではなく、別のストレージのOSから起動しないと消去できない……。
ここで、インストールディスクというものが必要になってきます。
私は使ってるお絵描きソフトの都合でまだYosemiteさんにするのは抵抗があるので、Marveriksさんをインストールしたいです。
そのための手順は以下の通り。
* AppStoreを開きMarveriksをダウンロードします。
* ダウンロードしたインストーラーをターミナルからコマンド使ってUSBストレージにコピーします。

### コマンド

```
sudo /Applications/Install\ OS\ X\ Mavericks.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume --applicationpath /Applications/Install\ OS\ X\ Mavericks.app

```

`--volume /Volumes/MyVolume`でコピーするストレージを指定します。`MyVolume`のところを任意のディスクの名前にしてください。

`--applicationpath /Applications/Install\ OS\ X\ Mavericks.app`はコピーするインストーラーのパスを指定してるっぽい……のかな。私も初心者なのでよくわからんのですが、実際はこのままでいけたので特に書き換える必要は無いです。


参考
> https://support.apple.com/ja-jp/HT201372


ストレージは、詳しい容量はわかってないんですが、せめて64GBとかあると安心かもしれません。容量たりないと容赦なく「faild」っていわれます。悲しい。

しばしコピーが終わるまでそばでも食べて待ちます。おそば美味しいです。

completedの文字が出てきたらインストールディスクの出来上がりです。
option押しながら起動して、作成したインストールディスクを選択して起動します。

あとはディスクユーティリティを使って、本体のHDDを消去すれば、すんなり空白域がなくなり綺麗な状態のHDDがマウントされます。

若干ターミナルのコマンドを使うので、黒い画面に慣れてない人は抵抗があるかもしれませんが、そんなに難しいことはしてないので、ぜひ試してみてください。
Metalsmith(静的サイトジェネレーター)のススメ

#Metalsmith
Nodejs製の静的サイトジェネレーター(static site generator)の[Metalsmith](http://www.metalsmith.io/)。
githubのリポジトリ：https://github.com/segmentio/metalsmith

公式サイトはMetalsmithで生成されている。
公式サイトのリポジトリ：https://github.com/segmentio/metalsmith.io。

合言葉は、**EVERYTHING IS A PLUGIN.**

すべてがプラグイン、という思想の元に作られた静的サイトジェネレーター。
#静的サイトジェネレーター選び
[StaticGen](https://www.staticgen.com/)を見るのが一番良い。
基本的には、上位に位置する静的サイトジェネレーターのなかから、自分に合うものを探す。

以下、いくつか紹介する。
## Jekyll
静的サイトジェネレーターのド定番。Ruby。
ドキュメントや事例の多さ、テンプレートの多さが売り。
ビルド速度やRuby関連のバージョン管理が苦痛でやめていく人は見る。
Windowsユーザーは、導入の時点でRuby周り、Bundler周りで苦労してそう。
テンプレートエンジンはLiquid。

## Octopress
Jekyllがベース。ブログに特化する拡張がされている。
ブログ特化なので、少し変わったことをやろうとすると、窮屈。
逆にブログとして利用するだけなら、ドキュメントも豊富で楽そう。
テンプレートエンジンはJekyllと同じなのでLiquid。

## Middleman
Ruby。Sinatraベース。
公式サイトが日本語に翻訳されてたりして、そういう意味で親しみやすい。
Jekyllより後発ということで、テンプレートエンジンの選択肢など広がっているイメージ。
テンプレートエンジンは、ERBやHamlやTiltなどなど。

## Pelican
Python。ドキュメントも多い気がする。
Pythonでやりたいなら、これほぼ一択？Cactusもアリか。
テンプレートエンジンがJinja2。

## Hugo
今一番、勢いがあると思う。
JekyllやOctopress、MiddlemanなどのRubyの静的サイトジェネレーターを使っていた人が
かなり移行しているイメージ。言語はGo。
導入が容易く、ビルドが他に追随を許さないぐらい速い。
簡単に、そして毎日気軽にブログ記事など投稿したい人は、今これが良いのでは。
テンプレートエンジンはGo Templates。

## Metalsmith
最後にMetalsmish。JavaScript。
Hugoよりビルドは遅いし、Jekyllなどよりドキュメントなど少ない。
Starの数も増加傾向も、他の上位に比べれば少ない。
公式のexampleが古いようで、git cloneしてもすぐに動かない。
でも、**とにかく縛りがない**。
テンプレートエンジンプラグインの定番は、[consolidate.js](https://github.com/tj/consolidate.js)のwrapperなので、
handlebars,mustache,haml,underscore,Liquid,ejs,eco,reactive...etcが使える。
Markdownプラグインも、[marked](https://github.com/chjj/marked)や[markdown-it](https://github.com/markdown-it/markdown-it)のwrapperなどから選べる。

ディレクトリ構成をJekyllライクにしたりも可能。
プラグインの自作もそこそこ簡単そう。

# Metalsmithが合う人
静的サイトジェネレーターに縛られたくない人や、ちょっと変わったことをやりたい人は合うはず。
今後、やりたいコトが増えるかも、という予感や野望がある人もMetalsmithで良いんじゃないか。

導入コストはドキュメント不足などのせいで、若干高いものの、
それ自体はCommunityが活発になればかなり改善されると思っている。
PFObjectをSwiftでサブクラス化したる


半年前にリジェクトされたまま放置していたアプリを、Swiftでつくりなおすことにした。
このアプリは[Parse](https://parse.com/)を使用してるので、忘れやすそうなやつをメモしたった。

###SDKバージョン
v1.6.4

##サブクラス化？
[これ](https://parse.com/docs/ios_guide#subclasses/iOS)なんだけど、サブクラス化すると下記みたいに使いやすくなったりする。

こんなやつを

```objectivec:PFObject
var shield = PFObject(className:"Armor")
shield["displayName"] = "Wooden Shield"
shield["fireProof"] = false
shield["rupees"] = 50
```

こんな感じに使えるようにする

```objectivec:Subclass
var shield = Armor()
shield.displayName = "Wooden Shield"
shield.fireProof = false
shield.rupees = 50
```

他にもクエリをこのサブクラス内に書くといいかも。

##サブクラスにするには

こんな感じでクラスをつくりまーす

```objectivec:Hoge.swift
import Parse

class Hoge : PFObject, PFSubclassing {

  @NSManaged var foo: String

  override class func initialize() {
    var onceToken : dispatch_once_t = 0;
    dispatch_once(&onceToken) {
      self.registerSubclass()
    }
  }

  class func parseClassName() -> String! {
    return "Hoge"
  }
}
```

initializeを呼んだりまーす

```objectivec:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

  // 省略
  
  Hoge.initialize()
  
  // 省略
}
```

これで準備はokokです

##じゃあ、使うか

たとえば、Hogeテーブルのfooを全てって時は、こんな感じかな

```objectivec:FugaViewController.swift
let query = Hoge.query()
query.fromLocalDatastore()
query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
  if error == nil {
    for hage in objects {
      println((hage as Hoge).foo)
    }
  }
}
```

おしまい
Andriod projectがCircle CIでコケるとき

Andriod projectがCircle CIでコケるときは、OOMの可能性があります。

[Your build hit the 4G memory limit - CircleCI](https://circleci.com/docs/oom)

Gradleでビルドしている場合は、`JAVA_OPTS: -Xms256m -Xmx512m` を指定してやると良さそうです。

実例はこちら https://github.com/gfx/Android-Helium/blob/master/circle.yml
UnityのStartCoroutine ~待機~

　まず間違いなく使用される機能などなので、なんとなく理解していたけど適当に使っていたけど、しっかり仕組みを理解して最適な使い方をしたい！！ということで調べてみました。


まずはいつも通り最小形

```csharp:NewBehaviourScript.cs
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {
	void Start () {
		StartCoroutine (Sample());
	}

	private IEnumerator Sample () {

		yield return null;
	}
}
```

特に説明不要だと思いますが、Startから始まって、Sampleが呼ばれて、終了してStartに戻る普通のプログラム。

# 待機
次にWaitForSecondsを入れてみる。

```csharp:NewBehaviourScript.cs
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

	void Start () {
		StartCoroutine (Sample());
		Debug.Log ("Start");
	}

	private IEnumerator Sample () {
		yield return new WaitForSeconds(1.0f);
		Debug.Log ("Sample");
	}
}
```

実行結果
![StartCoroutine1.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/d5119c1e-dbaa-bbbe-a49a-fa252da38ba3.png)

　Startから始まって、Sampleが呼ばれて、Startに戻る。ここでStartは処理を再開され、Sampleは1秒待ってから処理が再開される。
isEmptyを使いたい


MagicalRecordのWhere文を作るとき、isEmptyが予想してた動きをしてくれなかったのでやったことまとめます。

## nilを考慮しないWhere生成処理
Where文で利用できるようにTitleとAuthをAndで連結させるメソッドです。  

```swift
    func getWhere(strTitle:String,strAuth:String) -> String{
        var whereList:[String] = []
        if(!strTitle.isEmpty){whereList.append("title = '" + strTitle + "'")}
        if(!strAuth.isEmpty){whereList.append("auth = '" + strAuth + "'")}
        return join(" AND ", whereList)
    }

```

#### OKパターン
```swift
    func getWhereTest(){
        println(self.getWhere("TitleTest", strAuth: "AuthTest"))
        // 結果：title = 'TitleTest' AND auth = 'AuthTest'
        println(self.getWhere("TitleTest", strAuth: ""))
        // 結果：title = 'TitleTest'
        println(self.getWhere("", strAuth: ""))
        // 結果：＜なし＞
    }
```

#### NGパターン
引数がOptionalではないためコンパイルエラーになる。

```swift
    func getWhereTest(){
        println(self.getWhere(nil, strAuth: ""))
    }
```

## nil許可させたい
単純に以下のように引数をOptionalにした場合、isEmptyが使えなくて困る。

```swift
func getWhere2(strTitle:String?,strAuth:String?) -> String{
```


nilも空文字も渡されることを想定したisEmpty相当の判定メソッドを用意してあげる。  
（結局こういうの用意しないとダメなのかね。。。）

```swift
    func strEmpty(strText:String?) -> Bool{
        if(strText == nil){
            return true
        }else{
            if(strText! == ""){
                return true
            }
        }
        return false
    }
```

## nilを考慮したWhere生成処理


```swift 
    func getWhere(strTitle:String?,strAuth:String?) -> String{
        var whereList:[String] = []
        if(!commonUtils.strEmpty(strTitle)){whereList.append("title = '" + strTitle! + "'")}
        if(!commonUtils.strEmpty(strAuth)){whereList.append("auth = '" + strAuth! + "'")}
        return join(" AND ", whereList)
    }
```

引数に空文字を入れたパターンと、nilを入れたパターンを試してみる。

```swift 
    func getWhereTest(){
        println(self.getWhere("TitleTest", strAuth: "AuthTest"))
        // 結果：title = 'TitleTest' AND auth = 'AuthTest'
        println(self.getWhere("TitleTest", strAuth: ""))
        // 結果：title = 'TitleTest'
        println(self.getWhere("TitleTest", strAuth: nil))
        // 結果：title = 'TitleTest'
    }
```

ほんとOptionalで突然ウワってなるな。。。。
【Rails】ActiveJob/DelayedJobを使いこなす【基本】

# Job, Active Job, Delayed Jobとは
### Job
メールの送信、データのインポート/エクスポートなどの**時間のかかる処理を**、**適した方法で**バックエンドで行うためのコンセプト。
### Active Job
Sidekiq, Resque, Delayed Jobといった実際にバックグラウンドでジョブを実行するgemの差分をほぼ意識しないでジョブを扱えるようにするための、ジョブのインフラ。
### Delayed Job
上記のバックエンド処理を行うために使われるメジャーなgemの一つ。(他のgemとの比較記事: http://qa.atmarkit.co.jp/q/2406)
# 具体例から見るメリット
### 例: メール送信  
####◯ Jobを使わずに、メール送信(deliver)を行う場合  

```app/controller/email_controller.rb
  ...
  def deliver
    @email = Email.find(params[:id])
    @email.deliver #deliverというインスタンスメソッドで送信できるとする。
    redirect_to complete_email_url
  end
  ...
```
こんな感じで、redirectするまでに、メールがdelverされるのを待つ必要がある。

####◯ Delayed Jobを使う

```app/controller/email_controller.rb
  # Controller(その場)で実行
  @email.deliver
  
  # Job(バックエンド)に委託する
  @email.delay.deliver
```

この一部分を上記のように、変更すると、controller上では、バックエンドに委託したら先にいけるので、サクッと次のredirectの処理までいける！userを待たせなくて良い！という。Delayed Jobを使うと書き方もシンプルで便利っすね〜。

####◯ Active Jobと連携して使う  
As I mentioned, Active Jobは、実はgemたちの後から、Railsに導入されたgemごとの操作方法を統一できるJobのインフラ。ここでは、その統一された方法で、Delayed Jobを扱うこと方法を考える。

1. アプリ側で時間のかかる処理を、それぞれのJob Classを定義してそちらに移行。
2. アプリ側から、そのJob Classを呼び出す。

```app/jobs/email_deliver_job.rb
# Job Classの定義
class EmailDeliverJob < ActiveJob::Base
  queue_as :default

  def perform(email_id)
    # controller(アプリ側)で行っていた処理(以下)が移動された
    Email.find(email_id).deliver
  end

end
```

```app/controllers/email_controller.rb
  # controller(アプリ側)でEmailDeliverJob(定義したJobClass)を呼び出す
  ...
  def deliver
    EmailDeliverJob.perform_later(params[:id])
    redirect_to complete_email_url
  end
  ..
```

これで、先ほど同様、バックエンドに重い処理任せてcontrollerは先に進めるというわけですね。

これまで見てきた、重い処理をJobに委託することを、**"Jobを登録する(enqueue)**"という。
***
###### Active Jobと連携するときにしなくてはいけない細かい設定たち
1. どのgemを使うのかアプリに教える

```config/apprication.rb
  ...
    config.active_job.queue_adapter = :delayed_job
  ...
```


2. Jobの作成  
以下のコマンドでJob作成。

```
  rails g job EmailDeliver
```
作成されるapp/jobs/email_deliver_job.rbが先ほど出てきたJob Classの記述を持つ。


***


# 使い方 3ステップ  

## 1. DelayedJob(gem)のインストール

```
  # Gemfileに。
  gem 'delayed_job_active_record'
```

```
  # で、インストール
  bundle install
```

Jobを管理するテーブルを作成する。

```
  rails g delayed_job:active_record
```

```
  rake db:migrate
```

## 2.ジョブを登録する(enqueue)

"具体例からみるメリット"を参照。

## 3.Jobを実行する(workerの起動)
rake taskでworkerを起動し、Jobを処理する。これが起動されるまでは、**Jobは処理されない**ので要注意。委託業者を起動させる感じだね。

```
rake jobs:work
```
(本番時は、daemonsというgemでworkerを走らせる。https://github.com/ghazel/daemons)


# 応用
+ コールバックを使う(http://railsguides.jp/active_job_basics.html)
  Jobのenqueue前後、perform前後などに行うlogicを指定できる。
+ その他もありそう。参照先をよく読むとありそう。

***
###### 参照先
+ http://qiita.com/ryohashimoto/items/2f8fd685920a5318def4#%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E5%AE%9F%E8%A1%8C
+ http://railsguides.jp/active_job_basics.htmlhttp://railsguides.jp/active_job_basics.html
+ https://github.com/collectiveidea/delayed_job
+ http://ruby-rails.hatenadiary.com/entry/20150304/1425396671
+ http://qa.atmarkit.co.jp/q/2406
+ https://github.com/ghazel/daemons
JavaScriptでクロージャー

#クロージャーってなに？
「関数宣言の中に別の関数宣言を書けること（入れ子の関数宣言）」や「ローカル変数を参照している関数内変数」と言われます。
これだけだとどういうことかわかりませんね・・・
自分自身理解できなかったので、自分が納得したことを踏まえてクロージャーについて説明していきます。

#クロージャーを書くために理解しておきたいこと
###1. JavaScriptでは現在の関数の外側で定義された変数を参照できる
```js
function func() {
  var name = 'taro';
  function greeting() {
    return 'My name is ' + name;
  }
  return greeting();
}

func();  // My name is taro
```

###2. 関数は、その外側の関数がリターンした後になっても、まだ外側の関数内で定義された変数を参照できる
```js
function func() {
  var lastName = 'suzuki';
  function greeting(firstName) {
    return 'My name is ' + lastName + ' ' + firstName;
  }
  return greeting;
}

var f = func();
f('taro');    // My name is suzuki taro
f('hanako');  // My name is suzuki hanako
```

###3. クロージャは外側の変数を更新できる
```js
function box() {
  var val = undefined;
  return {
    set: function(newVal){
      val = newVal;
    },
    get: function(){
      return val;
    },
    type: function(){
      return typeof val;
    }
  };
}

var b = box();
b.type();    // undefined
b.set(10);
b.get();     // 10
b.type();    // "number"
```

#カウントアップをしていくクロージャ
よくあるサンプルを書いていきます

```js
function counter() {
  var count = 0;
  return function() {
    return ++count;
  }
}

var count = counter();
count();  // 1
count();  // 2
```
#クロージャの使い所
ここまでで一応簡単なコードを書くことができるようになったかと思います。
しかし、実際クロージャってどんなところで使うかわからない・・・
そこで私なりに考えたクロージャのメリット
・クロージャ内の変数をクロージャ外からアクセス出来ない
・クロージャ内の変数を保持することができる

これらを踏まえて以下の様なコードがあるとします。

```js
function createClicked() {
  var isClicked = false;
  return function() {
    if (isClicked) {
      return 'すでにClickしています';
    }
    isClicked = true;
    return 'Clickしました';
  }
}

var click = createClicked();
click();  // Clickしました
click();  // すでにClickしています
```

一回しかクリックできないようにするコードです
二重に処理させないようにするためにとかといった場面で有効かもですね・・・
CentOS7のOpenJDK7をOracleJDK8に変更して、javaのパスを通す

Oracleサイトからjdk-8u40-linux-x64.rpmをダウンロード

``yum -ivh jdk-8u40-linux-x64.rpm ``

インストールしただけだと古いjavaが認識されるまま

```
$java -version
$java version "1.7.0_XX"
```

alternativesコマンドでjavaコマンドの優先度を切り替える

``sudo alternatives --config java``

```
[me@localhost download]$ sudo alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/bin/java
   2           /usr/java/jdk1.8.0_40/jre/bin/java
```

2を押してEnterで切り替わる

javacも同様に切り替え


```
[me@localhost Nico]$  sudo alternatives --config javac

2 プログラムがあり 'javac' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/bin/javac
   2           /usr/java/jdk1.8.0_40/bin/javac

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
```
Jestのテスト実行時に”Cannot read property 'pipe' of undefined”エラー


# 発生した問題

Jestを使って書いたテストコードを実行するために、`npm test`を実行すると以下のエラーが発生した。

```
/Users/Foo/Projects/Bar/node_modules/jest-cli/node_modules/harmonize/harmonize.js:31
        node.stdout.pipe(process.stdout);
                   ^
TypeError: Cannot read property 'pipe' of undefined
    at module.exports (/Users/Foo/Projects/Bar/node_modules/jest-cli/node_modules/harmonize/harmonize.js:31:20)
    at Object.<anonymous> (/Users/Foo/Projects/Bar/node_modules/jest-cli/bin/jest.js:39:1)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3
npm ERR! Test failed.  See above for more details.
```

# 原因
事項環境にインストールされていたNode.jsのバージョンが`0.12.x`系で、Jestがまだ対応できていないバージョンだった。（2015/3/7現在）

# 解決
Node.jsのバージョンを`0.10.x`系に変更し、`npm install`からやり直すことで解決。無事にテストが実行できた。

ちなみに、`0.11.x`系のバージョンの最新版ではうまく動かなかった。それ以上は調べてない。
【超簡単】【たった一行】UINavigationBarをスワイプで表示/非表示させる方法

##この記事について

UINavigationBarを消す方法を調べていたところ、scrollViewにdelegateを設定する方法や、ライブラリを使う方法などがありましたが、新しい方法を見つけましたので共有します。

iOS8からUINavigationControllerに便利なプロパティが追加されたようです。

##方法

```
navigationController?.hidesBarsOnSwipe = true
```

これだけ

##詳細

他にも色々な挙動でUINavigationBarを制御できるようです

- hidesBarsOnTap

```swift

/// When the user taps, the navigation controller's navigationBar & toolbar will be hidden or shown, depending on the hidden state of the navigationBar. The toolbar will only be shown if it has items to display.
@available(iOS 8.0, *)
public var hidesBarsOnTap: Bool
```

- hidesBarsOnSwipe

```swift
/// When the user swipes, the navigation controller's navigationBar & toolbar will be hidden (on a swipe up) or shown (on a swipe down). The toolbar only participates if it has items.
@available(iOS 8.0, *)
public var hidesBarsOnSwipe: Bool
```

- hidesBarsWhenVerticallyCompact

```swift
/// When the UINavigationController's vertical size class is compact, hide the UINavigationBar and UIToolbar. Unhandled taps in the regions that would normally be occupied by these bars will reveal the bars.
@available(iOS 8.0, *)
public var hidesBarsWhenVerticallyCompact: Bool
```

- hidesBarsWhenKeyboardAppears

```swift
/// When the keyboard appears, the navigation controller's navigationBar toolbar will be hidden. The bars will remain hidden when the keyboard dismisses, but a tap in the content area will show them.
@available(iOS 8.0, *)
public var hidesBarsWhenKeyboardAppears: Bool
```

- navigationBarHidden

```swift
public var navigationBarHidden: Bool
```

- barHideOnTapGestureRecognizer

```swift
/// The gesture recognizer used to recognize if the bars will hide or show due to a tap in content. Do not change the delegate or attempt to replace this gesture by overriding this method.
@available(iOS 8.0, *)
unowned(unsafe) public var barHideOnTapGestureRecognizer: UITapGestureRecognizer { get }
```

- barHideOnSwipeGestureRecognizer

```swift
/// The gesture recognizer that triggers if the bars will hide or show due to a swipe. Do not change the delegate or attempt to replace this gesture by overriding this method.
@available(iOS 8.0, *)
public var barHideOnSwipeGestureRecognizer: UIPanGestureRecognizer { get }
```

[Hiding the Navigation Bar @ Apple公式ドキュメント - UINavigationController Class Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/#//apple_ref/doc/uid/TP40006934-CH3-SW36)
dash.vimの使い方まとめ


## Dashとは
プログラミング言語や各種フレームワークのドキュメント/リファレンスを串刺しで検索できるMac用アプリ。スニペット機能もある。ドキュメントは必要な物を随時追加でとうろくしていける。

[Dash for Mac - Documentation Browser, Snippet Manager - Kapeli](http://kapeli.com/dash)

VimからDashに登録されているドキュメントを検索する、dash.vimというVimプラグインがあったので、使い方をメモ。

## :Dash[!]

### コマンドの文法
```
:dash[!] [TERM] [KEYWORD]
```

### 現在のファイルタイプにもとづいて、カーソル位置の単語で検索する
例えば、Rubyのソースコードを開いている時にコマンドを実行した場合、Dashに登録されているRubyのドキュメントを対象にした検索が実行される。

```
:Dash
```

### 現在のファイルタイプにもとづいて、任意の単語で検索する
```
:Dash printf
```

### ファイルタイプを指定して、任意の単語で検索する

```
:Dash printf ruby
```

### ファイルタイプ関係なく、カーソル下の単語を検索する
Dashに登録されている全ドキュメント（Docset）を対象に検索が実行される。

```
:Dash!
```

### ファイルタイプ関係なく、任意の単語で検索する
```
:Dash! printf
```


## Mapping

上記コマンドをいちいち入力しなくてもいいように、以下のマッピングが定義sれている

### 現在のファイルタイプにもとづいて、カーソル下の単語を検索する

```
<Plug>DashSearch
```

### ファイルタイプ関係なく、カーソル下の単語を検索する
```
<Plug>DashGlobalSearch
```

### 設定例
```.vimrc
nmap <silent> <leader>d <Plug>DashSearch
```

## ファイルタイプとdocsetの関連付け

ファイルタイプごとに検索対象となるdocsetの種類をを設定できる。例えば、デフォルトでは、Javaは以下のdocsetを検索するように設定されている。

* java
* javafx
* grails
* groovy
* playjava
* spring
* cvj
* processing
* javadoc

Androidのdocsetも検索対象に含めたい場合は、.vimrcに以下の設定を記述する。

```.vimrc
let g:dash_map = {
    \ 'java' : 'android'
    \ }
```
Mac のワイヤレス診断


OS X Mountain Lion v10.8.4 以降に付属している「ワイヤレス診断」アプリを使ってみました。
※ 試した環境は MacOS X Yosemite です。

* Wi-Fi 接続の詳細情報
* 周辺の AP の情報

などが簡単に確認できます。


より細かい説明が以下のリンクにありますので、この文書はもっと簡潔なメモぐらいに思ってください。

ワイヤレス診断について
https://support.apple.com/ja-jp/HT202663

# 「ワイヤレス診断」の起動方法
Option キーを押しながら、Wi-Fi メニュー extra ![WiFi extra.png](https://qiita-image-store.s3.amazonaws.com/0/30578/1b854bd1-4088-ba91-f24f-d8851660efb8.png "WiFi extra.png")
を開きます。

そうすると普段と違った Wi-Fi メニューが開きます。
 ここで、青枠で示す 「"ワイヤレス診断" を開く...」を選択します。
※下の方に現在接続中の Wi-Fi に関する詳細も出ています。

 
  ![WiFiメニューOption.png](https://qiita-image-store.s3.amazonaws.com/0/30578/f743ac42-25ed-994a-6131-c54eaa92e984.png "WiFiメニューOption.png")




# ワイヤレス診断

以下のような画面が表示されます。
今回は、"概要" を選択します。

![ワイヤレス診断.png](https://qiita-image-store.s3.amazonaws.com/0/30578/ad3aad96-f5b9-29ce-4d32-9d451b06c8c4.png "ワイヤレス診断.png")

特に問題がないと、最終的に以下のような画面になります。

![概要.png](https://qiita-image-store.s3.amazonaws.com/0/30578/36525dce-16b9-b3b1-7e52-ff9eb67e7db7.png "概要.png")


## ベストプラクティス

それでは、"i" マークをクリックして、ベストプラクティスとやらを確認してみましょう。
関連説明は、以下のリンクからも参照できます。

iOS and OS X：Wi-Fi ルーターおよび Wi-Fi アクセスポイントの推奨設定
https://support.apple.com/ja-jp/HT202068


![ベストプラクティス.png](https://qiita-image-store.s3.amazonaws.com/0/30578/5abf3232-f61b-80e5-83ac-54d2ddb99d21.png "ベストプラクティス.png")
![ベストプラクティス２.png](https://qiita-image-store.s3.amazonaws.com/0/30578/0b4110b8-e64e-6efc-8b8c-95b9aa07910d.png "ベストプラクティス２.png")

皆さんの設定はどうでしょうか？
私は特に変える必要はありませんでした。
セキュリティ的に意味が無いし、かえって問題になりやすいのでネットワーク名を非公開にするのはやめましょうとかはあまり聞かないのではないでしょうか。




# ウィンドウメニューに見る他の機能

ウィンドウメニューを開くと、他にも使えそうないくつかの機能が確認できます。
主だったものを使ってみます。

![ウィンドウメニュー.png](https://qiita-image-store.s3.amazonaws.com/0/30578/d2e385cf-5c20-9918-ec02-7b84bb13a3ac.png "ウィンドウメニュー.png")

## 情報

現在の接続に関する詳細が見られます。
こんなはずじゃないのにとかあったら、AP なり Mac なりの設定を見直してみてはどうでしょうか。

![情報.png](https://qiita-image-store.s3.amazonaws.com/0/30578/92714592-f13b-8e29-8c56-3369ab6e064b.png "情報.png")

## スキャン

周辺にある接続先一覧が見えます。
黒く塗りつぶしてあるところが、 "BSSID" (Basic Service Set Identifier) と呼ばれるもので、AP の MAC アドレスです。
この値の上位4オクテットあたりの類似を見て、同一 AP を推測したりします。 



自宅含めて周囲にはまだ ac が無いです、、。
自宅を含めて AP は6台で、5GHz帯を使っているのは2台でした。
左側に、お勧めのチャンネルが出ていますので、参考になるかと思います。

この例では、同じメーカーの AP を使っているところと、自宅のチャンネルがダブっているのですが、AP のチャンネル設定を "自動" にしているから、自動でダブらないようになるんじゃないかという疑問が、、、。そんなに賢くないのか、そもそもこの一覧がバグっているのか？

![スキャン.png](https://qiita-image-store.s3.amazonaws.com/0/30578/07061316-f874-61a2-6846-ab4f4bf0d59d.png "スキャン.png")

## パフォーマンス

1番上のグラフが転送レートです。150 Mbpsです。

真ん中のグラフが通信品質です。 SN比 がデシベル（dBm：1mWを0dBとして、電力の大きさをdBで表したもの）で表示されています。
SN比 が高ければ伝送における雑音の影響が小さいということで、グラフの山が高いほどよいです。

1番下のグラフは RSSI（受信信号強度）とノイズです。
グラフの左軸がマイナスの値になっていることを確認してください。
RSSI（緑色）は大きいほどよいので、グラフの山が高いほどよいです。
ノイズ（青色）は小さいほどよいのでグラフが低いほどよいです。
あわせてみた場合、緑と青が開いているほどよいということになります。

無線環境が安定するRSSI強度はどの程度ですか？
http://faq.buffalo.jp/app/answers/detail/a_id/1838

![パフォーマンス.png](https://qiita-image-store.s3.amazonaws.com/0/30578/22d051e0-0b02-e3fb-0930-d4bd526d28b6.png "パフォーマンス.png")
GWT2.6でのrequestAnimationFrame()の使い方


#GWT2.6の場合
``AnimationScheduler.get().requestAnimationFrame(AnimationCallback)``を使うといい

requestAnimationFrame()を使うメリットについては、Canvasの描画とか多分速くなる。

CanvasやWebGLを使ったJavaScriptを移植する際、Timer()より、こっちを使うほうが楽。

***ただし、不具合(issue)があるかどうかは検証中***
関連issue - [GWT-7759](https://code.google.com/p/google-web-toolkit/issues/detail?id=7759)

**注意事項**
GWT2.7とか追いきれていないので、最新のやり方は変わっているかもしれない。

##コンソールに表示される警告
###Chrome 41 windows7-64bit
```
'webkitRequestAnimationFrame' is vendor-specific. Please use the standard 'requestAnimationFrame' instead.
'webkitCancelRequestAnimationFrame' is vendor-specific. Please use the standard 'cancelAnimationFrame' instead.
```

###Firefox 28 windows7-64bit
``getUserData() と setUserData() の使用は推奨されません。代わりに WeakMap と element.dataset を使用してください。``

###IE11 windows7-64bit
何もなし

##その他
ElementalのBrowser.getWindow().webkitRequestAnimationFrame(this);を使う方法もあるようだけど
機種依存解決できない。

##コード
```
package com.akjava.gwt26.client;

import com.google.gwt.animation.client.AnimationScheduler;
import com.google.gwt.animation.client.AnimationScheduler.AnimationCallback;
import com.google.gwt.animation.client.AnimationScheduler.AnimationHandle;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Timer;

public class GWT2_6test implements EntryPoint ,AnimationCallback {
	private AnimationHandle handler;

/**
 * request animation test
 * 
 * warning
 * 
 * Chrome
 *'webkitRequestAnimationFrame' is vendor-specific. Please use the standard 'requestAnimationFrame' instead.
 *'webkitCancelRequestAnimationFrame' is vendor-specific. Please use the standard 'cancelAnimationFrame' instead.
 */
	@Override
	public void onModuleLoad() {
		handler = AnimationScheduler.get().requestAnimationFrame(this);
		
		//cancel
		new Timer(){
			@Override
			public void run() {
				handler.cancel();
			}}.schedule(1000);
		
			
	}

	public static final native void log(String object)/*-{
	if(console){
	console.log(object);
	}
}-*/;
	
	@Override
	public void execute(double timestamp) {
		handler=AnimationScheduler.get().requestAnimationFrame(this);
		log(""+timestamp);
	}
}
```
PHPで配列の要素アクセスをフックする


※ @mpywさんに指摘いただきましたので、継承させずにインタフェースを使った方法も投稿しました
[ArrayAccess,IteratorAggregateインタフェースで配列操作可能なオブジェクトを作成する](http://qiita.com/metheglin/items/87e25bbdf37fbe0cd6e2)

# Goal

* 配列の添字にアクセスしたときに特定のロジックを実行させたい
* `$array->get(0)`ではなく`$array[0]`と書きたい
* foreachもサポートしたい
* 具体的な利用例としては、ActiveRecordの遅延評価みたいなことをやりたい

# Code

PHPの配列はオブジェクトではないので、配列の要素がアクセスされたことを検知することができない.
配列と同じインタフェースで配列をオブジェクトとして扱えるArrayObjectというライブラリがあるので、これを継承すると、配列操作をフックすることができる.
http://php.net/manual/ja/class.arrayobject.php

```php
<?php

class PersonList extends ArrayObject {
  public function offsetGet($index) {
    echo "Hello!!";
    return parent::offsetGet($index);
  }
}

$persons = new PersonList(['Newton', 'Gauss', 'Boltzmann']);
echo $persons[0] . PHP_EOL;
  // Hello!!Newton
```

`$persons[0]`のように要素にアクセスすると、`offsetGet`メソッドがよばれるのでこのメソッドをオーバーライドして実行したい処理を追加する.

```php
<?php

class PersonList extends ArrayObject {
  private function load() {
    if ( ! $this->offsetExists(0) ) {
      foreach (['Newton', 'Gauss', 'Boltzmann'] as $v) {
        $this->append($v);
      }
    }
  }

  public function getIterator() {
    $this->load();
    return parent::getIterator();
  }

  public function offsetGet($index) {
    $this->load();
    return parent::offsetGet($index);
  }
}

$persons = new PersonList();
// 添字アクセス
echo $persons[0] . PHP_EOL;
foreach ( $persons as $person ) {
  // foreachアクセス
  echo $person . PHP_EOL;
}

// ■ 添字アクセス結果
// Newton
// ■ foreachアクセス結果
// Newton
// Gauss
// Boltzmann
```

上記の例では、配列添字アクセスがあったときと、foreachでの配列走査が実行されたタイミングで動的にデータをロードして要素を追加している.
foreachで配列走査が開始されるときには`getIterator `メソッドがよばれるのでこのメソッドをオーバーライドして実行したい処理を追加する.
`offsetExists`メソッドで要素の存在をチェックできるので、要素が0件であればデータをロードする仕組みを作っている.

# Environment

```
$ uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

$ /usr/local/php-5.5.4/bin/php -v
PHP 5.5.4 (cli) (built: Mar 11 2014 11:06:57)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

$ /usr/local/php-5.6.0/bin/php -v
PHP 5.6.0 (cli) (built: Aug 29 2014 06:35:44)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
```
Githubの任意のブランチにPushしたら、そのブランチをJenkinsで自動的にビルドする方法

# この稿で説明すること

Githubの任意のブランチにPushしたら、GithubからJenkinsに通知が走って
Jenkinsがそのブランチを自動的にビルドする仕組みの構築手順。

# 前提
- GithubはEnterprise版ではない。
- JenkinsサーバにはIPアドレスが割り当てられていて、外部からアクセスすることができる。
- Jenkinsサーバには、Githubのリポジトリからプロジェクトをフェッチしてビルドできるジョブを作成済み。

# 1. Jenkins側の設定

## 1.1. Githubプラグインのインストール

Jenkinsの管理 -> プラグインの管理 から、Githubプラグインをインストールする。
Jenkinsの案内に従って操作すれば、特に難しいことはない。

## 1.2. Jobの設定

Jobの設定ページの"ビルド・トリガ"という項目で
"リモートからビルド (例: スクリプトから)"
という項目にチェックを入れ、"認証トークン"欄に任意の文字列を入力する。

![spec-build-trigger.png](https://qiita-image-store.s3.amazonaws.com/0/39426/d205442c-cc09-9631-38df-71a34146e1b0.png)

# 2. Github側の設定

## 2.1. Webhookの登録

プロジェクトの設定ページで "Webhooks & Services" を選択。
"Webhooks" 欄の "Add webhook" というボタンをクリックする。

![add-webhook.png](https://qiita-image-store.s3.amazonaws.com/0/39426/c01b83b0-a815-94aa-984e-5cad8eb118d9.png)

"Add webhook" 欄に、以下のイメージのように入力して一番下の"Add webhook"ボタンをクリックする。

![spec-webhook.png](https://qiita-image-store.s3.amazonaws.com/0/39426/9df464d7-cba2-f622-536c-55458dd00c05.png)

※Payload URLの書式は以下の通り（なぜか、初期値にはログインアカウントのメールアドレスが入力されているがw）。
`http://[JenkinsのドメインまたはIP]/job/[ジョブ名]/build?token=[認証トークン]`
※"Secret"欄は初期値のまま

前のページに戻り、"Webhooks" 欄の下に今、設定したPayload URLが表示され、その左に緑色のチェックマークが表示されていれば正しく設定されている。

Jenkinsのジョブを確認すると、Webhookを設定した時刻にビルドが走っているはず。

![result-of-spec-webhook.png](https://qiita-image-store.s3.amazonaws.com/0/39426/f6c97584-f9b3-aba7-15d3-94a6f1f8cf87.png)

# 備考

JenkinsサーバにBasic認証をかけている場合、Payload URLを以下のように設定する。
`http://[Basic認証のユーザー名]:[Basic認証のパスワード]@[JenkinsのドメインまたはIP]/job/[ジョブ名]/build?token=[認証トークン]`

今回構築した仕組みは、JenkinsのGithubプラグインの"Manual mode"を使用している模様（よく分かってません(汗）。
https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin#GitHubPlugin-TriggerabuildwhenachangeispushedtoGitHub

"Automatic Mode"を使えばこれらの設定を自動で登録してくれるようなので、追々調査したい。
JSXで書かれたコードをESLintで解析する


## 前提
* ESLint 0.12.0以上がインストールされていること

（参考）[ESLint 0.12.0 released - ESLint](http://eslint.org/blog/2015/01/eslint-0.12.0-released/)

## 設定ファイルの編集

ESLintの設定ファイル`.eslintrc`に以下を記述する。

```json:.eslintrc
{
  "ecmaFeatures": {
    "jsx": true
  }
}
```

これで、JSXの構文を含むソースコードも適切に解析されるようになる。
設定ファイルをおいたディレクトリ配下すべてのソースコードが対象、（サブディレクトリ含む）

（参考）http://eslint.org/docs/configuring/
商品画像一括アップロードAPIの書き方を教えてください。

bizarchさんの「Yahoo!ショッピング 商品画像アップロードAPIでInternalServerError(500)になる」と同じになりますが、どうしてもエラーの原因がわからないので教えてください。

bizarchさんの問合せ
http://qiita.com/bizarch/items/d6bf9771c011bf8f4865

商品画像をまとめたZIPファイルを作り転送しようと考えています。
PHP内で画像をZIP圧縮するところまでは問題なくできています。
できたZIPファイルをストアクリエータProで送信したところ、問題なく商品に画像がつきました。

しかし商品画像一括アップロードAPI で送信したところ、InternalServerError(500)になったり、OKが出るが画像はならない状態となります。

【InternalServerError(500)になるとき】
<pre>
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;Error&gt;
  &lt;Message&gt;&lt;![CDATA[システムエラーが発生しました。]]&gt;&lt;/Message&gt;
  &lt;Detail&gt;&lt;/Detail&gt;
  &lt;Code&gt;ed-00001&lt;/Code&gt;
&lt;/Error&gt;
</pre>

【正常に終わるが、画像は変わらないとき】
<pre>
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;ResultSet&gt;
    &lt;Result&gt;
        &lt;Status&gt;OK&lt;/Status&gt;
    &lt;/Result&gt;
&lt;/ResultSet&gt;
</pre>

この2つの違いは、画像が増えたか減ったかです。

PHPでは次のように書いています。
<pre>
$url = 'https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/uploadItemImagePack';

$boundary = '---------------------------'.time();
$contentType = "Content-Type: multipart/form-data; boundary=" . $boundary;
$src = '';
$src .= "--$boundary" . "\r\n";
$src .= sprintf('Content-Disposition: form-data; name="file"; filename="%s"%s', basename($zfn), "\r\n");
$src .= 'Content-Type: application/octet-stream'. "\r\n";
$src .= 'Content-Transfer-Encoding: binary'. "\r\n";
$src .= file_get_contents(ZIPファイルのパス) . "\r\n";
$src .= "--$boundary--" . "\r\n";

$seller_id = ストアID;

$url = $url . '?seller_id=' . $seller_id;

$headers = array(
    $contentType,
    'Authorization: Bearer ' . $token['access_token'],
    'Content-Length: '.strlen($src),
);

$options = array('http' => array(
    'method'        => 'POST',
    'content'       => $src,
    'header'        => implode("\r\n", $headers),
    'ignore_errors' => true,
));

$contents = file_get_contents($url , false, stream_context_create($options));
</pre>

なぜエラーになったりOKになったりするのでしょう？
またOKになっても、ストアクリエータProで確認すると画像管理には登録されません。

画像はどこにとんでいったのでしょう？

因みに「?seller_id=」を外したり、パラメータ名「file」を「zip」などに返るとそれなりのエラーが返ってきます。

よろしくお願い致します。
TemplateDoesNotExist at とか言われたら

なんかよくわかってないけど、Djangoでタイトルのエラーが出た。
**簡単な話**なんだろうけど備忘録的に。

 `Django tried loading these templates, in this order:
 Using loader django.template.loaders.filesystem.Loader:
 Using loader django.template.loaders.app_directories.Loader:
 C:\Python34\lib\site-packages\django\contrib\admin\templates\cms\book_list.html (File does not exist)
 C:\Python34\lib\site-packages\django\contrib\auth\templates\cms\book_list.html (File does not exist)
 C:\Python34\lib\site-packages\bootstrapform\templates\cms\book_list.html (File does not exist)`


*色々探したけれど見つからないの、ゴメンね。と言われた。*

settings.pyに
`　TEMPLATE_DIRS = (
  　  os.path.join('mybook', 'templates'),
　)
`
※mybookはアプリ名、templatesはアプリフォルダ配下のテンプレートが置いてあるフォルダ。

そしたらLoaderが見つけてくれましたとさ。

settings.pyのある場所の配下で探すみたいなので↓を追加したほうがスマートらしい。
`
 SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__)) 
 TEMPLATE_DIRS = ( 
  　  os.path.join(SETTINGS_PATH, 'templates'), 
   )
`
なんかこんな感じ。
ES6でstatic properties

# static methodsがあるなら当然…え？
ES6を使ってみようと[Babel](https://babeljs.io/)を弄ってたんだけど、

```ts
class Foo {
    static bar: baz; // not work
    // static bar = baz; <- syntax error
}
```

と書いてみたら思った通りに動かず、調べてみたらstatic methodsしかサポートしてなさそうだった。

# とはいえ、道具は揃っているので

static methodsとGettersがあれば、

```ts
class Foo {
    static get bar() {
        return baz;
    }
}

var qux = Foo.bar; // qux == baz

```

とりあえずやりたいことは出来た。
RailsでES6を使う


RailsでJSファイルごとの依存関係の管理やJS,CSSのminifyを担当しているSprocketsですが、[最近ES6のサポートをfeatureとして取り込んできました。](https://github.com/sstephenson/sprockets/pull/682)

まだfeatureブランチで作業している最中なのでそのまま使うことはできないのですが、別のgem([josh/sprockets-es6](https://github.com/josh/sprockets-es6))を使うことで、現状でもRailsでES6を試すことができます。

ES6へのtranscompilerには[babel](https://github.com/babel/babel)(ex 6to5)を使っているようです。

試しに使ってみたので、その方法をまとめておきます。


まずは普通にRailsプロジェクトを立ち上げます

```
$ rails -v
Rails 4.2.0

$ rails new es6 --skip-bundle --skip-test-unit 
       exist
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/assets/javascripts/application.js
      create  app/assets/stylesheets/application.css
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/views/layouts/application.html.erb
      create  app/assets/images/.keep
	  ~~~~
      create  vendor/assets/stylesheets
      create  vendor/assets/stylesheets/.keep
```


次に`Gemfile`に以下を追記します。

```ruby:Gemfile
gem 'sprockets', '~> 3.0.0.beta.8'
gem 'sprockets-es6', require: 'sprockets/es6'
```


これで`bundle install`を実行すれば準備完了です。


さて、es6で書くファイルは全て `.es6` という拡張子にする必要があります。

```javascript:app/assets/javascripts/greeting.es6
class Greeting {
  	constructor(name) {
  		this.name = name;
  	}
	say() {
		return `Hello ${this.name} !!`;
	}
}

console.log(new Greeting("John").say()); // Hello John!!

```


楽しいですね。


[`.js`ファイルを `.es6` ファイルからrequire出来なかったり](https://github.com/sstephenson/sprockets/issues/708)、まだまだproductionで使えるものではないと思いますが、今後に期待していきたいですね。
AB=A+B なら AB=BA

学習院の田崎晴明先生の
（半永久的に）執筆中の数学の教科書「数学：物理を学び楽しむために」
に出ていた以下の問題をやってみました。

A, B をd × d 行列とする。AB = A + B ならば、AB = BA となることを証明せよ。

http://www.gakushuin.ac.jp/~881791/mathbook/index.html
MB150208.pdf p.380 (PDFの394頁) 問6.5.1.a

もしかすると有名な問題なのかも知れないけど、ページ下部のヒントが面白いので見てみてください。

[わたしの回答](http://qiita.com/kuh96/private/9127b05e1d13dfd9efa0)
Amazon VPC 入門

## 導入の利点
- セキュリティの担保（無駄なEC2への接続をシャットアウト）
- VPC外からVPC内へのリソース（EC2等）移動は大変らしい
- （最近のAWS構成では初めからEC2構築時にVPCに属している気もしているが違うのかな...）
- 導入費はVPCへの接続通信費のみ


## 導入方法
### Key Pair の作成
EC2 Management Console > Key Pairs > Create Key Pair


### VPC のセットアップ
VPC Management Console > Start VPC Wizard
VPC with a Single Public Subnet - Select


### Security Group の作成
VPC Management Console > Security Groups > Create Security Group

vpc-XXX-bastion: 
- inbound: 22(EC2のsshポートを20022に変更後、削除）, 20022

vpc-XXX-web: 
- inbound: 80

vpc-XXX-db: 
- inbound: XX


### Subnet の作成
VPC Management Console > Subnets > Create Subnet

Public Subnet:(Default)
- 10.0.0.0/24

Private Subnet:
- 10.0.64.0/24


### EC2(bastion) の作成
EC2 Management Console > Launch Instance


### EIP のアサイン
EC2 Management Console > Elastic IPs > Allowcate New Address
- E2(bastion) にアサインする


### AWS構成
![AWS_VPC_Design.png](https://qiita-image-store.s3.amazonaws.com/0/64827/f9e3b4e4-e33a-e8f3-5d28-8c3901cc3e76.png)


## 参考
http://whiskers.nukos.kitchen/2014/11/13/aws-vpc-wordpress.html
http://dev.classmethod.jp/cloud/aws/vpc-knowhow-2014-04/#note-1-1
http://dev.classmethod.jp/cloud/aws/bastion-host-on-amazon-vpc/
http://blog.cloudpack.jp/2013/02/25/aws-news-vpc-cidr-az/
AB=A+B なら AB=BA、のわたしの回答

[AB=A+B なら AB=BA](http://qiita.com/kuh96/items/9d9913f87ca3072bd2fb) の証明

------
(1)「受験数学の回路」より XXX * YYY = I である。ヒント：因数分解みたいなもの !?
実際、単位行列を $I$ とすると　$(I-A)(I-B) =I$

(2) 一般に、d × d 行列 F, G が $GF = I$ を満たすなら $FG = I$ である 

(3) よって $(I-B)(I-A) =I$ より $B + A = BA = AB$

------

## (2) の証明

行列 F のゼロ空間 $N(F) = \\{ x | Fx=0 \\}$ の任意の元を $x$ とすると、
$GFx = 0$ だから $GF = I$ より $x = 0$
したがってゼロ空間の次元は 0 なので、F は正則。すなわち G は F  の逆行列である。

## 補足

(2) は「この問題が本のこの部分で出題されている」ことを使えばほぼ明らか。
実際この数ページ前に「逆行列の一意性」が示されている。


## 蛇足

会社の同僚もほぼ一発で解けたそうである。
パスルみたいで面白かったけど、逆にほぼ一発だったので楽しめなかった、とのこと。

なおわたしは、最初はわざとヒントを無視してやってみたが、途中で行き詰ってしまった。
やはり「最初の一手」を間違えると手間どってしまう。

この問題は「受験数学の回路」で (1) を見つけないとえらく難しいのかもしれない。。。。
配列を比較する

ちょちょいっと比較したかったのでググってみたが
簡単な手が見つからなかったのでこういうのはどうだろうか

* 仕様

1. モジュールは使わない（List::Compareとかまさにそれっぽいけれど）
2. ２つの配列、要素の順番はそれぞれ異なる場合があるものとする
3. 引数として渡した配列の順番は変更しても構わない

```pl
#!/usr/bin/perl
use strict;
use warnings;

my @ary1 = (1,2,3,4);
my @ary2 = (2,3,4,1);

print "ary1=@ary1\n";
print "ary2=@ary2\n";

print compare_array(\@ary1, \@ary2) ? "OK\n" : "NG\n";

print "ary1=@ary1\n";
print "ary2=@ary2\n";

sub compare_array {
  my ($ary1, $ary2) = @_;
  @$ary1 = sort @$ary1;
  @$ary2 = sort @$ary2;
  return ("@$ary1" eq "@$ary2") ? 1 : 0;
}
__END__
ary1=1 2 3 4
ary2=2 3 4 1
OK
ary1=1 2 3 4
ary2=1 2 3 4
```

# 参考

[perl] 一次元配列同士の比較のいろいろなやり方 - harupiyoの日記
http://d.hatena.ne.jp/harupiyo/20090201