OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftのテストフレームワークQuickがXcode 6 Beta2で動かなくなった時の対処法


## 結論

以下のコマンドでXCTest.frameworkのシンボリックリンクを作成。

```
ln -s /Applications/Xcode6-Beta2.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks/XCTest.framework /Applications/Xcode6-Beta2.app/Contents/Developer/Library/Frameworks/
```

## Quickとは？

SwiftのテストがRSpecライクに書けるフレームワークです。
susieyyさんの記事が詳しいです。
[Swift界隈で話題沸騰中のテストフレームワーク Quick とは？ - Qiita](http://qiita.com/susieyy/items/56457922d3d6bbee21ef)


## Xcode 6 Beta => Xcode 6 Beta2 では動かなくなる

 __Xcode 6 Beta2対応の[コミット](https://github.com/modocache/Quick/commit/695a16f722e637f3b0264a3566ffc966e00e423c)が入りましたので、この問題は解決しています。__


Xcode 6 Betaだと動いていたのに！
テストを実行すると、エラーログも出ずにTest Failedになります。

Githubのissue
[\[Quick, Nimble\] Missing XCTest.framework in Xcode 6 Beta 2 · Issue #50 · modocache/Quick](https://github.com/modocache/Quick/issues/50)



## 原因

このライブラリが無いため。

```
/Applications/Xcode6-Beta2.app/Contents/Developer/Library/Frameworks/XCTest.framework
```

## 対処方法

XCTest.frameworkのシンボリックリンクを張るのですが、最初はXcode Betaを参考に以下からのリンクを張って悩んでました。

```
/Applications/Xcode6-Beta2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework
```

正しくはこちらだそうです。（どうやって見つけたんでしょう。すごい。）

```
/Applications/Xcode6-Beta2.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks/XCTest.framework
```


## おまけ

Quickをgit submoduleでプロジェクトに入れている人向け。
submoduleを最新版に更新する方法。<code>git submodule update</code>では更新されない。foreachでgit pull を行う。

```
git submodule foreach 'git pull origin master'
```

いつの間にかローカルで変更していてマージが発生するので、resetしたい場合。

```
git submodule foreach git reset --hard HEAD
```
sudo.vim

# unite.vim を入れた状態で sudo vim した時の問題

unite.vim を使っていて Vim を普通に sudo して使おうとすると以下の様な警告が出る:

```bash
$ sudo vim  # エラーになる
unite.vim disabled:
    "sudo vim" is detected and $HOME is set to your user's home.
    You may want to use the sudo.vim plugin,
    the "-H" option with "sudo" or set always_set_home in /etc/sudoers instead.
 
$ sudo -H vim  # エラーにならないが見に行く .vimrc が /root/.vimrc になってしまう
```

>unite.vim は無効化された: "sudo vim" が検出され、$HOME が貴方のホームディレクトリに設定されている。 「sudo.vim」プラグインを使うか、「-H」オプションを sudo と共に使うか、/etc/sudoers に always_set_home を設定するのが良い。

[このように警告を出している理由も tweet されていた](https://twitter.com/ShougoMatsu/status/249755107011489792)ので参考に貼っておく。

ただ、これに従い sudo -H とすると .vimrc が root のものになってしまうので良くない。しかも -H 付けるのとか忘れそうだ。 ということで sudo.vim というプラグインを導入してみる。これを使うと自分の .vimrc を使いつつ root 権限で読み書きできる。

# NeoBundle を使用して導入

NeoBundle 導入済とする。例によって .vimrc に以下を書けば O.K. NeoBundle すばらしい。

```vim
NeoBundle 'sudo.vim'
```

# 使い方

```bash
$ vi sudo:xxx.txt  # sudo vi xxx.txt の代わりにこう書く
```

```vim
:w sudo:%  " vi xxx.txt で開いた後に xxx.txt が root 権限必要な場合に root で上書き保存
:w sudo:yyy.txt  " root で別名保存
:e sudo:%  " 開いた後に root で開き直す場合
```
AngularJS x Rails - $httpモジュールからの XHR が text/html と認識されちゃう問題

AngularJSの`$resource`でRailsアプリのAPIを呼び出した際、なぜか`request.formats`が `text/html` と認識されちゃう問題の解決策。

コントローラで `respond_to json: xxx` としているのに、なぜかHTMLがレスポンスされるので解決方法を調べた。

# TL;DR
AngularJS側で以下のconfigをするだけ。

```js
$httpProvider.defaults.headers.common["Accept"] = 'application/json';
```


# 原因

AngularJSのAcceptヘッダのデフォルト値と、RailsのMIME Type解決のロジックが組み合わさって起こる。

## AngularJS

[ここ](https://docs.angularjs.org/api/ng/service/$http#setting-http-headers)に書かれている通り、$httpモジュールのAcceptヘッダのデフォルト値は `application/json, text/plain, */*`。
さらに、[`X-Requested-With`ヘッダも送信しない仕様](https://github.com/angular/angular.js/commit/3a75b1124d062f64093a90b26630938558909e8d)になっている。

## Rails
Rails/actionpackのMIME Type解決をしている部分で、Acceptヘッダに`*/*`が含まれるとブラウザからのアクセスとみなされてMIME Typeが強制的に`text/html`に設定される。([このロジックが導入された時のコミットログ](https://github.com/rails/rails/commit/dc5300adb6d46252c26e239ac67e3ca6e5e2d77b#diff-2b8f2fbb113b55ca8e16001c393da8f1)。`*/*`はブラウザしか使わないはずだから、とりあえずHTML送りつけとくぜ、的な。)
また上記の通りAngularJSからは`X-Requested-With`ヘッダも送信されないため、MIME Typeが期待通りに解釈されない。

```rb:actionpack/lib/action_dispatch/http/mime_negotiation.rb#L98-L103
      BROWSER_LIKE_ACCEPTS = /,\s*\*\/\*|\*\/\*\s*,/

      def valid_accept_header
        (xhr? && (accept.present? || content_mime_type)) ||
          (accept.present? && accept !~ BROWSER_LIKE_ACCEPTS)
      end
```

https://github.com/rails/rails/blob/v3.2.18/actionpack/lib/action_dispatch/http/mime_negotiation.rb#L98-L103


# 解決

ということで、AngularJSのデフォルトAcceptヘッダから`*/*`を除外すればMIME Type判別が期待通りに動くようになる。

```js
$httpProvider.defaults.headers.common["Accept"] = 'application/json';
```

もしくは、XHRのヘッダーを付与してもOK。
```js
$httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
```
gnuplot snippet集


## line plotにエラーバーをつける

```
p "data.dat" u 1:2:3 w yerrorlines
```

![yerrorlines_sample.png](https://qiita-image-store.s3.amazonaws.com/0/28792/9a761aac-365e-cf8d-52b4-b88f0323b2ee.png "yerrorlines_sample.png")

## 対数表示

- formatも変更するとラベルがきれいに表示される

```
set logscale x
set format x "10^{%L}"
```
![test.png](https://qiita-image-store.s3.amazonaws.com/0/28792/64eb8b71-a85a-2d83-d636-2c445899fe0f.png "test.png")

## 凡例の表示される場所を座標で指定する

```
set key at 0.5,10
```

このときの座標はグラフのx,yの座標値。凡例の右上隅の座標が指定できる。

## multiplot

複数の図を並べて表示する。この時、縦・横それぞれに並んだグラフ間でx軸・y軸を共有したいとする。

- 方針
    - `set multiplot` コマンドを使って複数の図を描画する。
    - その際に、`set tmargin`, `set lmargin`, `set bmargin`, `set rmargin` でマージンをセットする。
        - 例えば横方向にぴったりとつめて描画したいときは、左のグラフのrmarginを0にし、右のグラフのlmarginを0にする。
        - 縦方向の場合も同様にtmargin, bmarginをそれぞれセットする。
    - x軸、y軸を描画したくないときには、`set format x ""` とすると、軸の数値が表示されなくなる。
        - `unset xtics` を使ってもよいが、その場合は目盛りも表示されなくなる。
    - 左右のプロットで(lmargin+rmargin)の値がそろうようにする。そうしないと、プロットの大きさが左右でそろわなくなる。
        - 左側のプロットのみy軸を表示する場合には、左側のグラフのlmarginを8にセットし、右側はrmarginを大きく取る。
        - 右側に大きめの余白ができてしまうが、epsファイルに書き出した後、BoundingBoxを調整する事により余白を削除できる

![test.png](https://qiita-image-store.s3.amazonaws.com/0/28792/2abaa4ab-0f6a-2b76-595d-cb6eadb67f16.png "test.png")

```
set multiplot layout 2,2

set xrange [0:1]
set yrange [0:1]

unset xlabel
set format x ""             # do not display x-axis
set ylabel "YYY"
set format y "% g"
set tmargin 1
set lmargin 8
set bmargin 2
set rmargin 0
p x

unset xlabel
set format x ""
unset ylabel
set format y ""
set tmargin 1
set lmargin 2
set bmargin 2
set rmargin 6               # (lmargin + rmargin) must be same for all the plots.
p x*x



set tmargin 0
set lmargin 8
set bmargin 3
set rmargin 0
set xlabel "XXX"
set format x "% g"
set ylabel "YYY2"
set format y "% g"
p 1-x

set tmargin 0
set lmargin 2
set bmargin 3
set rmargin 6
set xlabel "XXX"
set format x "% g"
unset ylabel
set format y ""
p 1-x*x

unset multiplot
```
リバースプロキシ(nginx)経由でリクエストを投げるとカスタムヘッダが消えて困った

# なんぞ
nginxを使ったリバースプロキシ経由でリクエストを投げると、カスタムヘッダが消えて困った。
ヘッダはこんな感じ　→　X-Test.Hoge
# 結論
nginxのデフォルトではヘッダ名に英数字とハイフン以外は認めてない。
http://nginx.org/en/docs/http/ngx_http_core_module.html#ignore_invalid_headers

リクエストヘッダをそのままBodyに入れて返すスクリプト書いた。

```text:nginx的に合法なヘッダの場合
$ curl -H 'X-Test-Hoge: hoge' http://hoge.huga.com/
[('X-Forwarded-Server', 'hoge.huga.com'),
 ('X-Real-Ip', 'xxx.xxx.xxx.xxx'),
 ('Connection', 'close'),
 ('Content-Length', ''),
 ('Accept', '*/*'),
 ('User-Agent',
  'curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.5'),
 ('Host', 'hoge.huga.com'),
 ('X-Test-Hoge', 'hoge'),
 ('X-Forwarded-For', 'xxx.xxx.xxx.xxx'),
 ('X-Forwarded-Host', 'hoge.huga.com'),
 ('Content-Type', 'text/plain')]
```

```text:nginx的にに非合法な場合
$ curl -H 'X-Test.Hoge: hoge' http://hoge.huga.com/
[('X-Forwarded-Server', 'hoge.huga.com'),
 ('X-Real-Ip', 'xxx.xxx.xxx.xxx'),
 ('Connection', 'close'),
 ('Content-Length', ''),
 ('Accept', '*/*'),
 ('User-Agent',
  'curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.5'),
 ('Host', 'hoge.huga.com'),
 ('X-Forwarded-For', 'xxx.xxx.xxx.xxx'),
 ('X-Forwarded-Host', 'hoge.huga.com'),
 ('Content-Type', 'text/plain')]
```
# 対応策
httpもしくはserverコンテキストにignore_invalid_headers off; を追加する

```text:example.conf
upstream hoge-huga-com {
  server xxx.xxx.xxx.xxx:yyyy;
}

server {
    listen       80;
    server_name  hoge.huga.com;
    access_log on;
    ignore_invalid_headers off;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://hoge-huga-com;
    }
}
```

```text:ignore_invalid_headersをoffにした後
$ curl -H 'X-Test.Hoge: hoge' http://hoge.huga.com/
[('X-Forwarded-Server', 'hoge.huga.com'),
 ('X-Real-Ip', 'xxx.xxx.xxx.xxx'),
 ('Connection', 'close'),
 ('Content-Length', ''),
 ('Accept', '*/*'),
 ('X-Test.Hoge', 'hoge'),
 ('User-Agent',
  'curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.5'),
 ('Host', 'hoge.huga.com'),
 ('X-Forwarded-For', 'xxx.xxx.xxx.xxx'),
 ('X-Forwarded-Host', 'hoge.huga.com'),
 ('Content-Type', 'text/plain')]
```

# 小ネタ
```text:_は-に直される
$ curl -H 'X-Test_Hoge: hoge' http://hoge.huga.com/
[('X-Forwarded-Server', 'hoge.huga.com'),
 ('X-Real-Ip', 'xxx.xxx.xxx.xxx'),
 ('Connection', 'close'),
 ('Content-Length', ''),
 ('Accept', '*/*'),
 ('User-Agent',
  'curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.5'),
 ('Host', 'hoge.huga.com'),
 ('X-Test-Hoge', 'hoge'),
 ('X-Forwarded-For', 'xxx.xxx.xxx.xxx'),
 ('X-Forwarded-Host', 'hoge.huga.com'),
 ('Content-Type', 'text/plain')]
```
Amazon Kindle の無料サンプルを wget でダウンロードしまくる

これを読んで。
[Kindle本の立ち読み版（サンプル）をブラウザで閲覧するための新ブックマークレット](http://timagawa.hateblo.jp/entry/2014/06/19/013613)

Kindleのサンプルって別に専用アプリが無くても、というかAmazonのアカウントさえ無くても読めると知ったので、さっそく自動ダウンロードのスクリプトを書いてみた。

ダウンロードに必要なものは書籍のASIN番号（Amazonの全ての商品に振られている通し番号）であり、Amazonの商品のページで Ctrl+F [ASIN] とすれば見つかる。ISBNを使いたい場合はISBNからASINに変換する方法があった気がするので知りたい人はggr。

# 小説

``` bash:novel.sh
wget "http://kindleweb.s3.amazonaws.com/content/$1/gz_sample.html" -O $1.gz
gunzip -d $1.gz
mv $1 $1.html
```

使用例: ASIN番号 `B00GJMUKBC` の書籍のサンプルをダウンロードする場合

```
$ ./novel.sh B00GJMUKBC
```

B00GJMUKBC.html というファイル名で1個のHTMLファイルが出力される。


# 漫画

``` bash:comic.sh
for i in `seq 1 1000`
do
  wget http://kindleweb.s3.amazonaws.com/content/$1/images/img$i.jpg
  # ファイルが見つからなければループを抜ける
  if [ "$?" -ne 0 ]
  then
    exit 1
  fi
  # ファイル名の接頭辞にASIN番号を付与
  mv img$i.jpg $1.$i.jpg
done
```

使用例: ASIN番号が `B009KYCHCG` の漫画に対し

```
$ ./comic.sh B009KYCHCG
```

B009KYCHCG.1.jpg から始まる連番JPEGとしてダウンロードされる。

# 解説

ASIN が振られている書籍に対しては、以下のURLにアクセスすればサンプルをHTML形式で閲覧できる。

```
http://kindleweb.s3.amazonaws.com/content/[ASIN]/gz_sample.html
```
例として円城塔「[Self-Reference Engine](http://www.amazon.co.jp/dp/B00GJMUKBC/)」のサンプルは以下のとおり。

http://kindleweb.s3.amazonaws.com/content/B00GJMUKBC/gz_sample.html

このHTMLファイルはgzip圧縮されているため、wgetでダウンロードした後に解凍して拡張子htmlを付与している。

漫画本の場合、このHTMLファイルの中に画像が貼られているが、その画像は（僕の調べた範囲では全て）以下のような連番形式となっている。

```
http://kindleweb.s3.amazonaws.com/content/[ASIN]/images/img1.jpg
```

例として岩明均「[ヒストリエ](http://www.amazon.co.jp/dp/B009KYCHCG/)」1巻の冒頭数ページを以下に示す。

http://kindleweb.s3.amazonaws.com/content/B009KYCHCG/images/img3.jpg
http://kindleweb.s3.amazonaws.com/content/B009KYCHCG/images/img4.jpg
http://kindleweb.s3.amazonaws.com/content/B009KYCHCG/images/img5.jpg
http://kindleweb.s3.amazonaws.com/content/B009KYCHCG/images/img6.jpg

ただしサンプルが何ページあるかは物によって異なるため、403 Error が出た場合はその時点でループを止めるようにしてある。
Qiita内の検索機能が一時停止されてる時の対処法

Google検索のクエリ内に以下を含める

* サイト内検索
```
<検索ワード> site:qiita.com
```

* タグでの絞込
```
<検索ワード> site:qiita.com/tags/<目的のタグ>
```

直るまではこれでしのぎます
jQueryの使用例


# jQueryはGoogleなどが用意しているライブラリを呼び出すだけでも使える


```index.html

<html>
<head>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
</head>
	<body>
		<p><b class="target">Hello!</b></p>
		<button>Animate</button>
		<script>
		$('button').click(function() {
			/* Act on the event */
			$('.target').fadeOut(1000, function() {
				$(this).fadeIn(1000);
			});
		});
		</script>
	</body>
</html>

```
DBファイルが作成されず、困ってたら、ただのミスだった件


##間違い
```objective-c
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
NSString *dir = [_paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[_dir stringByAppendingPathComponent:@"file.db"]];

```

##正解

```objective-c
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [_paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[_dir stringByAppendingPathComponent:@"file.db"]];

```

「NSDocumentDirectory」が「NSDocumentationDirectory」になっていました。
composer 経由で github からインストールする方法

[behat]:http://behat.org/
[behat3]:http://behat.readthedocs.org/en/latest/
[zombie.js]:http://zombie.labnotes.org
[phantomjs]:http://phantomjs.org/
[Behat Custom Helper]:https://github.com/sanpii/behatch-contexts
[composer]:https://getcomposer.org

こういうのも記事にしておかないと忘れる

関連記事:

 * [composer:repositoriesでPEARパッケージをインストール]
[composer:repositoriesでPEARパッケージをインストール]:http://qiita.com/dozo/items/d892cc964bb28d7a95fc

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

PHPUnitがPEARから離脱するなど、
PHPのパッケージ管理はPEARから[composer]に移ったといっても過言ではない。

ただ、オリジナルではなくforkした別のものを使いたい時など、
Packagistに登録されていないものを使おうとすると、
ちょっと困ったことになる。

そこで調べてみるとちゃんとあったので今回はそれを掲載。

------------------- ↑ 余談はここまで ↑-------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

ローカルでの名称を'wouterj/behat'として、
BehatのforkであるWouterJ/Behatをインストールしようとしている。
'formatter_junit_1'ブランチをダウンロードする場合、
composer.jsonは以下のようになる

```composer.json
・・・
    "repositories": [
     {
      "type":"package",
        "package": {
          "name": "wouterj/behat",
          "version":"master",
          "source": {		
            "url": "https://github.com/WouterJ/Behat.git",
            "type": "git",
            "reference":"formatter_junit_1"
          }
        }
      }
    ],
    "require": {
        "wouterj/behat": "*"
    },
・・・
```
SwiftがRubyやUnderscoreライクに書けるExSwiftとDollar.swiftの比較


Swiftを、RubyやUnderscore.js(Lo-Dash)のように書けるExtensions、ExSwiftとDollar.swiftを紹介します。


## Extensionsとは？

Objective-Cで既存のクラス拡張する際に使っていたカテゴリは、SwiftではExtensionsと呼ばれるようになりました。カテゴリと同じようにメソッドのOverrideができます。例えば、Arrayクラスでeachを実装したい場合は、以下のように書いた.swiftファイルをプロジェクト内に配置してください。ファイル名は任意です。

```Array.swift
extension Array {
  func each(f: (Element) -> ()) {
    for e in self {
      f(e)
    }           
  }       
} 

["s", "w", "i", "f", "t", "!"].each { println($0) }
//=> s
//=> w
//=> i
//=> f
//=> t
//=> !
```

もしくは、コマンドラインからswiftを起動させて、上記のコードをコピペすれば、動きます。


## ExSwiftの特徴

Github: [pNre/ExSwift](https://github.com/pNre/ExSwift)

ExSwiftはJavaScript (Lo-Dash, Underscore)とRubyにインスパイアされて開発されたSwift Extensionsです。Swiftの既存クラスをベースに拡張し、functionのOverrideを行う事でRubyやUnderscore.jsライクなメソッドを実装しています。また、OperatorsやSubscriptのOverrideも多く行っています。

Extensionsを導入後は自然にメソッドを呼び出す事ができます。こんな感じ。

ExSwiftの[Wiki](https://github.com/pNre/ExSwift/wiki)より

```swift
5.upTo(7, { println($0) })
/* Prints → */
// → 5
// → 6
// → 7


Int.random(min: 5, max: 10)
// → 6

let array = [5, 1, 0, 10]
array.each { item in println(item) }
/* Prints → */
// 5
// 1
// 0
// 10

let array = ["A", "B", "C", "D"]
array.at(0, 2)
// → ["A", "C"]
```


## Dollar.$wiftの特徴

Github: [ankurp/Dollar.swift](https://github.com/ankurp/Dollar.swift)

Dollar.swift（GithubにはDollar.$wiftとも書いてある）を導入すると、Underscore.js（やLo-Dash）由来のメソッドをSwiftで使えるようになります。ExSwiftが既存クラスへの拡張を大胆に行っていたのと対照的に、 Dollar.swiftは __全て$クラスのfunctionとして実装__されています。Swiftの既存クラスは全く拡張していません。

Dollar.swiftが独自のクラス実装した理由は __Appleの仕様変更によって挙動が変更されることを避けるため__ です。よって、呼び出し方はとても特徴的で、$クラスからクラスメソッドを呼び出します。JQueryみたい。

Dollar.swiftの[README.md](https://github.com/ankurp/Dollar.swift/blob/master/README.md)より

```swift
$.first([1, 2, 3, 4])
=> 1

$.contains([1, 2, 3, 1, 2, 3], value: 2) 
=> true

$.indexOf([3, 4, 5], value: 5) 
=> 2

$.range(4) 
=> [0, 1, 2, 3]

```

## まとめ

- ExSwiftは既存クラスを拡張している。メソッド呼び出しは自然に行える一方で、 __他Extensionsとのコンフリクトの可能性__ がある。
- Dollar.swiftは既存クラスには手を入れず、独自クラスのfunciontで実装している。呼び出しは$を使わなければいけないが、 __他Extensionsとのコンフリクトは無い__。


実際、自分のプロジェクトにExSwiftを導入したのですが、コンフリクトが起こってコンパイルエラーになりました。だいたい、eachやらString[]のsubscriptはみんな拡張するんですよね。なので、ExSwiftを入れるならプロジェクト開始時が良いですね。


今回はExSwiftとDollar.swiftの概要を紹介しました。どちらも盛んに開発されていて、毎日コミットが行われています。ExSwiftのバグをたまたま見つけたのでissueとして登録しましたが、次の日には修正されてました。方針の全く違うExSwiftとDollar.swiftですが、今後どうなるか楽しみです。
unite.vimでUnknown function

macでは普通に動いていたuniteが、何故かcentosで以下のようなエラーをはいた

```lang:エラー内容
Error detected while processing function <SNR>28_call_unite_empty..unite#start..unite#start#standard..unite#view#_init_cursor..unite#view#_set_cursor_line..unite#view#_match_line:
line    2:
E117: Unknown function: matchaddpos
E15: Invalid expression: has('patch7.4.340') ? matchaddpos(a:highlight, [a:line], 10, a:id) : matchadd(a:highlight, '^\%'.a:line.'l.*', 10, a:id)
```

vimのバージョンは7.2

```lang:vimバージョン
[vagrant@vagrant-centos65 ~]$ vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Apr  5 2012 10:17:30)
```

該当箇所のソースはエラーメッセージに有る通り。

```lang:該当箇所
function! unite#view#_match_line(highlight, line, id) "{{{
  return has('patch7.4.340') ?
        \ matchaddpos(a:highlight, [a:line], 10, a:id) :
        \ matchadd(a:highlight, '^\%'.a:line.'l.*', 10, a:id)
endfunction"}}}
```

何故かは分からないが、has('patch7.4.340')がtrueになっているらしい。
それでmatchaddposを使おうとしたけど見つからなくてエラーという感じだろうか。

helpを見た所、patchチェックはバージョンチェックも一緒にやったほうがいいらしい。

```lang:Help
3.  Included patches.  First check |v:version| for the version of Vim.
    Then the "patch123" feature means that patch 123 has been included for
    this version.  Example (checking version 6.2.148 or later): >
        :if v:version > 602 || v:version == 602 && has("patch148")
```

というわけで、以下の用に書き直したらエラーが消えました。

```lang:該当箇所
function! unite#view#_match_line(highlight, line, id) "{{{
  return (v:version >= 704 &&  has('patch7.4.340')) ?
        \ matchaddpos(a:highlight, [a:line], 10, a:id) :
        \ matchadd(a:highlight, '^\%'.a:line.'l.*', 10, a:id)
endfunction"}}}
```

パッチを当てて動作確認してないので、これで正しいかは分かりませんが、とりあえず動いたので満足です。
そのコード、本当に速くなった!? Excelでお手軽t検定

パフォーマンス改善を意図したコーディングにおいて、「 **実行速度を計測した上でものを言え** 」とは耳にタコができるほど言われることです。ではその計測結果、どう評価していますか？

バラツキを抑えるためルーチンを1000回、1万回、100万回と回して計測したとして、どんなにループ回数を増やしたって計測結果は毎回少しずつ違います。それでも誤差が気にならないくらい大差を付けての勝敗が付いたならいいものの、どちらの勝ちか微妙な感じだったら…？

都合の良い測定結果だけ採用するなんて研究不正ですからね。誤差を含んだ測定結果群から結論を導いてこその評価です。

自然科学の世界では **検定** によって測定結果を評価します。われわれエンジニアもこれにならいましょう。

t検定
=====
2群の標本がそれぞれ正規分布に従っていると仮定して、2群の母集団に有意差はあるかを求める手法がt検定です。
t検定の結果は検定統計量という、一種の確率として求まります。
この確率は
「 **二つの母集団が同等だとして、こんなに差が付いてしまう確率** 」
のことだと理解できます。
（前半の「二つの母集団が同等だとして」のことを帰無仮説と呼びます）

「 **二つの母集団が同等だとして、A群がB群にこんなに勝ってしまう確率** 」
を求める場合もあり、これは片側検定と呼びます。最初のは両側検定。

どちらにしろ、一般的にこれらの確率が **5％** を下回るようなら
「そんなことは20回に1回もありえない（＝ **両群間には差があるのだろう** ）」
つまり有意差があると評価します。
勇み足が特に許されない場合は1％を下回って初めて有意差ありとする場合もあります。

Excel先生お願いします
=====================
この検定統計量、計算式はぐぐってみていただくことにして、計算式とその仕組みを知らなくてもExcel先生にかかれば関数ひとつで算出できます。

1. 勝負するルーチン同士の実行時間をそれぞれ複数回計測します。今回は6回ずつ計測してみましょう。
2. A群の結果はA列に、B群の結果はB列に入力します。
3. C列のどこかのセルに`=TTEST(A:A, B:B, 2, 3)`と入力します。
ここで、引数の3つめ、"2"は両側検定を意味します。コード同士の勝負ではやってみるまでどちらが速いかなんてわからないので両側でやるべきですね。
引数の4つめ、"3"は「左右並んだ値同士に特に対応関係はなく、両群のバラツキ具合は違うかもしれない」という意味。<hr/>![ttest.png](https://qiita-image-store.s3.amazonaws.com/0/2852/9dacc162-03fd-73c0-cd8d-093b54a0680d.png)<hr/>
4. その値は0.005678（0.5678％）、強い有意差あり！
日時を、"6時間前", "たった今" など表示用文言に変換

```php:util.php
	/*
	*	日時を、"6時間前", "たった今" など表示用文言に変換
	*/
	static function diffTime($date)
	{
		$time_diff = time() - strtotime($date);
		if ($time_diff < 60) {
			return 'たった今';
		} else if  ($time_diff < 600) {
			return floor($time_diff / 60) . '分前';			// 1～9分前
		} else if  ($time_diff < 3600) {
			return 5 * floor($time_diff / 300) . '分前';	// 10,15,20,25...55分前
		} else if  ($time_diff < 86400) {
			return floor($time_diff / 3600) . '時間前';		// 1～23時間前
		} else if  ($time_diff < 864000) {
			return floor($time_diff / 86400) . '日前';		// 1～9日前
		} else {
			return '10日以上前';
		}
	}
```
NGUIの描画順


いつも忘れるのでメモる

[ゲームは初心者にやさしく: NGUI 描画順について](http://gamesonytablet.blogspot.jp/2012/10/ngui.html)

上記ページより抜粋

* Depth は同一パネルの同一Atrasのウィジェットの描画順を判定するのに使用
* 異なるパネルであれば、パネル自身のZ値で調整(-でカメラ側、+でカメラの向こう側)

上記のように記述されているが、2014/7/15現在確認したところ、

* 異なるパネルの描画順は、パネルのZ値は描画順に影響せず、Panel自体のDepth値(-でカメラ奥、+でカメラ手前）あるいはSortOrder（小さい値:カメラ奥,大きい値:カメラ手前）で制御できる


[「もののけ大戦“陣”」製作事例 - SlideShare](http://www.slideshare.net/RyoheiTokimura/ss-14048278)

![kobito.1403152320.015065.png](https://qiita-image-store.s3.amazonaws.com/0/8219/a68af7b1-6306-b66c-55ca-2903465638e0.png "kobito.1403152320.015065.png")

![kobito.1403152405.347344.png](https://qiita-image-store.s3.amazonaws.com/0/8219/7ea7aaff-c314-7ad8-b26f-ec398928885a.png "kobito.1403152405.347344.png")

![kobito.1403152454.799262.png](https://qiita-image-store.s3.amazonaws.com/0/8219/beb7ee68-ce43-da41-1c89-a13759ef64dc.png "kobito.1403152454.799262.png")

![kobito.1403152494.173804.png](https://qiita-image-store.s3.amazonaws.com/0/8219/b5d60af8-e6db-44bb-6401-c9e0bc5cd020.png "kobito.1403152494.173804.png")


また、NGUIのウィジェットの手前に3Dオブジェクト等を表示したい場合はカメラを別に用意して、カメラのDepthで表示順を制御する。

[Getting 3D Objects to appear in front of NGUI?](http://www.tasharen.com/forum/index.php?topic=1397.0)
PHP の 10 進数の数値判定


これなんて PHP ならではだと思うのだが、「ある変数に入っている文字列が 0 を含む 10 進数の自然数かを判別したい」といったことがよくある。 例えば POST で渡ってきた id が DB の auto increment な primary key (1, 2, ...) として信頼できる値かを判別したい、などだ。

初心者の時大体 is_numeric() を使えなどと教えられるような気がするが全然ダメである。 is_numeric() は「引数が数値であるかを判定する」ものであり、小数点や 16 進数なども通ってしまう:

```php
echo is_numeric(8);  // true
echo is_numeric(1.5);  // true
echo is_numeric('0x18');  // true
echo is_numeric('0x18e5');  // true
 
// 厳密にやるには正規表現を書くしか無いのか...
echo preg_match('/^\d+$/', '0x18');  // false
```

##0 から 9 までのみで構成されているかどうかが知りたいだけなのに

大抵の場合判別したい内容は以下なのであるが、いずれにしても正規表現を書かずに関数一発でできないのが歯がゆい:

* 15 は当然 true
* 0 は数値であり 0 を含む自然数なので true
* -1 は数値であり自然数ではないので false
* '01' は文字列だが自然数 (=1) なので true
* '1.5' は文字列だが小数なので false
* 0x18 は有効な 16 進数だが 10 進数ではないので false

と思ったら CakePHP 2 の Hash::numeric() のソースを見たら ctype_digit なるものを使っていた。 引数に string を渡さないと正しく動作しないのが気になるが、これが一番シンプルか。 **単純に 0 から 9 で構成されているかを検査する** と:

```php
function f($val) {
    // strval してしまうと array を渡された時に Notice エラーが発生するのを指摘頂いた
    // return ctype_digit(strval($val));

    // リクエストパラメータに対応する場合は strval 要らない
    // それでも対応したければ filter_var かければよい
    return ctype_digit(filter_var($val));
}
var_dump(f(15));  // true
var_dump(f(0));  // true
var_dump(f(-1));  // false
var_dump(f('01'));  // true
var_dump(f('1.5'));  // false
var_dump(f('0x18'));  // false
var_dump(f([1]));  // false. strval かけると Notice エラー
```

## 厳密に 0 を含まない自然数のみ通す

……うーん、やっぱり素直に正規表現の方が良いのかも。頭 0 も許可せず **0 も含まない** 完全に自然数のみ取得したい場合は以下か:

```php
function is_natural($val) {
    return (bool) preg_match('/\A[1-9][0-9]*\z/', $val);
}
var_dump(is_natural(15));  // true
var_dump(is_natural(0));  // false
var_dump(is_natural(-1));  // false
var_dump(is_natural('5'));  // true
var_dump(is_natural("5\n"));  // false
var_dump(is_natural('01'));  // false
var_dump(is_natural('1.5'));  // false
var_dump(is_natural('0x18'));  // false
```

## 注釈
`\A` や `\z` の意図は @mpyw 様の[こちらの正規表現の記事](http://qiita.com/mpyw/items/8dd5378cb01c877e1f7b)を参照。

また、自然数は一般的に認知されているのは **0 を含まない正の整数** で primary key の値として求められるのはコレだが、実は自然数の定義としては 0 を含んでも良いようなので自然数に関して言及する際は集合に 0 を含むか否かを明記する必要がある。

そういえば大学の時自然数の集合を **N** とすると **N - {0}** などと明記していた気がする。
使っていないiPhoneにPythonistaをいれてTwitter Botみたいなことができるか調べた

##経緯
機種変更したあとに古いほうのiPhone4Sを売ろうと思っていたら、なんとなく時間がたってしまった。いまさら売るのもめんどくさいし何かに有効活用したいので、セールのときに買っていたPythonistaをインストールしたらいろいろやれると思った。思ったので調べました。

##Pythonista
iPhoneやiPadでpythonスクリプト（Pythonista1.5ではpython2.7系）を実行できる[Pythonista](http://omz-software.com/pythonista/)というアプリがあっていろいろできてたのしいです。有料です。いまは700円でした。

日本語で紹介しているサイト
http://hitoriblog.com/?p=20698
http://kainokikaede.hatenablog.com/entry/2014/01/30/214921

##Pythonistaに含まれていないモジュールをいれる
Pythonistaには標準モジュール以外に[Pythonista用のモジュール](http://omz-software.com/pythonista/docs/ios/index.html)が最初から含まれています。そこにないモジュールは自分でいれる必要があります。Twitterのことをいろいろしたかったのでtweepyをいれます。たぶんpython-twitterでもいい。

Pythonista1.4まではiPhoneのOpen in（Pythonistaで開く）を使ってDropboxのアプリからPythonistaにファイルをもってこれたのですが、なんだかんだあって1.5ではできなくなったようです。

ほかにも[pipista](https://gist.github.com/pudquick/4317095)とかいろいろ方法はあるようですが、てっとりばやくiFunBoxを使ってiPhoneの中を覗き、Pythonista.appの中のDocumentの中のsite-packagesに直接tweepyフォルダをコピーしました。それだけでは動かなかったのでrequests-oauthlibとoauthlibもいれました。import tweepy できました。

##定期実行
PythonistaはURLスキームでスクリプトや引数を指定して起動できるので、iPhoneのほかのランチャーアプリから定期実行みたいなことができるかなと思ったけど、そういうアプリが見つからないのでそういうことはできないのかな。よくわからなかった。なので、定期実行したいときはPythonistaでずっとループさせたり、schedみたいなやつを使うのがいいかもしれない。その場合、Pythonistaがバックグラウンドで止まらないか気になったので

```py
import time

while True:
  print time.time()
  time.sleep(1)
```

を実行してロックしてまた開いたらちゃんと動き続けていたので、なんとなく大丈夫そうだなと思いました。Pythonistaでは同時に2つのスクリプトを実行できたりはしないようです。

##おわりに
iPhoneとPythonistaでTwiiter Botみたいなものがつくれるかもしれないなあということを確認しました。連続稼働させたときどうなるかは試していません。いまは無料のPaaSとかもあるので、わざわざこういうことをやるのはぜんぜん実用的ではないですが、自分は調べていてたのしかったのでよかったです。
POJOの初期化で楽したい

こういうPOJOを引数にしてなんかするアレがある。

```java
OreoreData oreoreData = new OreoreData();
oreoreData.setOreoreDataId(oreoreDataId);
return oreoreDataService.find(oreoreData);
```

せっかくStreamAPIで短く書けるようになったので、こういう変数宣言みたいなのもなくしていきたいと思うわけですね。

----

上の内容は匿名クラスで次のように書くこともできます。

```java
return oreoreDataService.find(new OreoreData(){{setOreoreDataId(oreoreDataId);}});
```

わりとすっきりした気がしますが、整形かけるとインデントとかめんどくさいし、ぱっと見よくわからん。
ScalaのMapみたいなゆるい感じでやりたいわけです。

----

という事でこんな感じでUtilを作ってやったらうれしいだろうか

```java
import static my.PojoUtils.*;
```

```java
return oreoreDataService.find(instance(OreoreData.class, pair("oreoreDataId",oreoreDataId)));
```

`PojoUtils#instance(Class T,PojoUtils.Pair... pairList)` という形で、リフレクションでpairを元に値をセットするイメージ。
ただ、これだとフィールド名を手入力するというクソさが出てきてしまい、かといってEnumやMethodで渡すようにするのも大層な気がして、如何ともしがたさを感じるのです。

そもそもこの手の処理の王道みたいのがあればご教示いただきたく、よろしくお願いいたします。
Windows8をインストールしたら、ホームディレクトリが漢字になってしまった！

# アカウント作成時の注意！
Windows8を新規（または、リカバリ）にインストールする際、ホームディレクトリが漢字で作られてしまったので、メモとして残します。

Windows8のインストール中に、アカウントを作成しますが、そのアカウント作成時に注意が必要です。

Windows8では、アカウント作成時にMicrosoftアカウントを薦めてきます。それはもう、2画面にわたって薦めてきます。ここで、Microsoftアカウントでアカウントを作成してしまうと、ホームディレクトリが名前（しかも漢字やひらがな）で作られてしまいます。

まずは、ローカルアカウントを作成しましょう。ローカルアカウントは後からMicrosoftアカウントと関連付けできます。

参考サイト：[Windows 8 初期設定で要注意！ユーザフォルダ名が漢字になってしまった原因](http://did2memo.net/2013/03/07/windows-8-user-folder-name/)

ディレクトリがマルチバイトだと、開発しているときに思わぬトラブルに見まわれる可能性があるので避けたいですね。
Raspberry Pi で撮影した写真を tweet する bot


#結論
いろいろはまりましたが、作ってみると30行ちょいの小さなスクリプトでできることがわかりました。小さくすんでいるのは tmhOAuth と raspistill のおかげだと思います
作ったファイルは github にも置きました https://github.com/UedaTakeyuki/RaspiTweetBotWithPicture

#きっかけ
Raspberry Pi でヒヨコの監視をしている[この人のツイート]
(https://twitter.com/NJchickens/status/477089992083128320/photo/1)を見て衝撃を受け、同じものをつくって見ようと思ったのがきっかけです。同じようなIoTネタについてもっと[ややこしい構成](https://xively.com)で考えていたのですが、単にツイートで良かったんだと...

#やること
1. raspistill で撮影した写真をupdate_with_media でツイートするスクリプトを作る
2. それを cron に設定する

#準備
以下の準備が必要です
1. カメラモジュールの設定
2. httpd と php の準備（私は nginx の設定でハマりました）
3. tmhOAuth の準備

#この実装のフォルダ構成説明
以下のフォルダ構成を前提とした実装になっております

/usr/share/nginx/www -- nginx のデフォルトのまま
/usr/share/nginx/www/lib/tmhOAuth -- tmhOAuth
/usr/share/nginx/www/lib/140617 -- スクリプト類

#スクリプト

```PHP:twwt.php

<?php
// 参考にした記事
// tbot開発物語: http://blog.okumin.com/archives/twitter-bot-2
// tmhOAuth: http://www.softel.co.jp/blogs/tech/archives/3295

error_reporting(-1);
//error_reporting(0);

require_once '/usr/share/nginx/www/libs/tmhOAuth/tmhOAuth.php'; //sudo apt-get install php5-curl 必要
require_once 'config.php'; // CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET を定義しておく

$image = "/usr/share/nginx/www/140617/test.jpg";
#
# 写真を test.jpg に撮影
$output=shell_exec("raspistill -hf -vf -w 1000 -h 1000 -t 1000 -o $image");
echo "Output = ".$output; // * failed to open vchiq instance と出た時は sudo chmod a+rw /dev/vchiq

# 「tmhOAuth」クラスのインスタンスを作成
$tmhOAuth = new tmhOAuth(array(
			'consumer_key'    => CONSUMER_KEY,
			'consumer_secret' => CONSUMER_SECRET,
			'token'      => ACCESS_TOKEN,
			'secret'     => ACCESS_TOKEN_SECRET));
$code = $tmhOAuth->request('POST', $tmhOAuth->url('1.1/statuses/update_with_media'),
	array(
		'media[]'  => "@{$image}",
		'status'   => "さつまいも水耕栽培 by 水草エアレーション"
	),
	true,
	true
);
if ($code == 200) {
	echo("投稿しました");
} else {
	print_r($tmhOAuth->response['response']);
}
?>

```

```bash:tweet.sh
/usr/bin/php /usr/share/nginx/www/140617/tweet.php
```

```BASH:crontab
# 10分毎にツイート
*/10 * * * * /usr/share/nginx/www/140617/tweet.sh
```

#はまったポイント
1. nginx の php の設定にハマりました
2. ファイルやフォルダの権限設定
3. 実行パス、コマンドライン実行、php で web から実行、cron で実行のそれらで cwd がややこしいです。全部、フルパスで書きました
4. RasPi の起動直後など、/dev/vchiq に権限がないことがあります

#感想
動き出すまではハマりましたが、raspistill と tmhOAuth のおかげで小さいスクリプトで出来ることがわかりました。
 
#参考にした記事
twitter bot をつくったのは初めてだったのですが、以下の記事を参考にさせていただいたおかげですぐに理解できました
http://blog.okumin.com/archives/twitter-bot-2
http://www.softel.co.jp/blogs/tech/archives/3295
Railsでwickedpdfを用いてPDF出力する方法

# はじめに
[wickedpdf](https://github.com/mileszs/wicked_pdf)は、HTMLでレンダリングしたページをそのままpdf化することができるライブラリです。railsで使いやすい感じで設計されている印象を受けました。

デフォルトでは日本語が表示されない仕様となっているので、そこの部分も含め以下で使い方を書いていきます。

## 実行環境
* CentOS 5.6
* Ruby 2.1.0
* Ruby on Rails 4.1.1

# 下準備

## Gemインストール
はじめにGemfileに使用するgemを書いて、bundle installします。

```
~ vim Gemfile
```

```rb:Gemfile
# add 2 lines
gem 'wkhtmltopdf-binary'
gem 'wicked_pdf'
```

```
~ bundle install
```

## パス設定
config/initializersにwicked_pdf.rbというファイルを作成し、パスを記述します。

```rb:wicked_pdf.rb
WickedPdf.config = {
  :exe_path => "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
}
```

以上で下準備は完了です。


# 使い方

## controllerでの設定
基本的にはpdfを使用したいcontrollerにて.pdfでアクセスされた際の処理を書くだけです。また、出力の際の細かいオプションなどについては[こちら](https://github.com/mileszs/wicked_pdf)のAdvanced Usage with all available optionsを参考にしてください。
今回は最小限の設定だけ書きます。

```rb
respond_to do |format|
    format.html
    format.pdf do
        render :pdf      => 'file_name', # 出力される際のファイル名
               :template => 'manuals/show.pdf.erb', # どのViewファイルを使用するか
               :layout   => 'pdf.html.erb', # どのレイアウトファイルを使用するか
               :encoding => 'UTF-8' # 日本語を使う場合は指定してください
    end
end
```

これで必要なViewとレイアウトを作成し、.pdfでアクセスするとPDF形式で表示されるはずです。
なお、ViewやレイアウトではRailsのタグが使用できないため、ここは置き換える必要があります。
主要なタグに関しては以下で詳しく書きます。


## タグについて
wickedpdfではrailsでよく使うタグを使用することができません。出力の際にjs, css, imageを使用する場合は以下のタグで置き換えて記述する必要があります。

```
# js
<%= wicked_pdf_javascript_include_tag "filename" %>

# css
<%= wicked_pdf_stylesheet_link_tag "filename" %>

# image
<%= wicked_pdf_image_tag 'filename' %>
```


# 日本語対応 
このままではおそらく日本語のみ表示がされないかと思います。原因はLinuxに日本語が入っていないことです。日本語フォントをインストールします。

```
~ yum install -y ipa-gothic-fonts
~ yum install -y ipa-mincho-fonts
```

これで日本語も問題なく表示されるようになったかと思います。

# 参考
* https://github.com/mileszs/wicked_pdf
* http://ayaketan.hatenablog.com/entry/2013/11/29/142308
* http://www.rynn.info/2014/03/05/3485/rails-wickedpdf-%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E3%81%BF%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84-linux%E7%92%B0%E5%A2%83/
[javascript]function.prototype.bind vs self(closure)

今のスコープを即時関数とかでも使えるようにするときに、`bind(this)`するのと`var self = this`使うのどっちがええのって話です。
例えばこんな感じのとき。(てきとう)

```js
var prop = {
    a: 100,
    func: function () {
        var test = function () {
            // prop.aにアクセスしたい
        };
    },
};
```

結果から言えば、関数に`bind`する時点で結構重い。

[テスト結果](http://jsperf.com/omatoro-bind-vs-self)

じゃあ、`self.a`と`this.a`どっちが重いの？ってなると、あんまり変わらない。
ループ回数めっちゃ増やすとほとんど差がなくなる。

[テスト結果](http://jsperf.com/omatoro-self-vs-bind)

毎フレ実行しまくる処理とかで使うとオーバーヘッド大きいのでやめた方がよさそう。
NSNotificationの通知を受け取れるパターンと受け取れないパターンについて


NSNotificationでaddObserverする際に、通知の送り手を指定できるのに指定しても動作しなかったのでメモ。

## 通知を受け取れるパターン

### 受け手も送り手も送り手を指定しない

```objectivec
[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:nil]; //誰が送ってこようが気にしない

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:nil]; //誰が送ってるかを指定しない
```

### 受け手も送り手もobjectを互いに指定するパターン

```objectivec
[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:self]; //selfが送ってくるはず

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:self]; //selfが送る
```

### 受け手が誰が送ってくるか指定しないパターン

```objectivec
[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:nil]; //誰が送ってこようが気にしない

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:self]; //selfが送る
```


##通知を受け取れないパターン

### 受け手が指定した送り手が、送ってこない

```objectivec
[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:self]; //送り手をselfに指定

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:nil]; //送り手を指定していない
```

# おまけ

## すべての通知を受け取れるパターン

パラメータのnameをnilにするとスタティックリンクされたビルド済みのライブラリの通知すらも受け取れる

```objectivec
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(method:)
                                             name:nil
                                           object:nil];
```

# さいごに

NSNotificationは強力すぎてコードの複雑度が増すため、自分はNSNotificationを使わないと実現できない場合でしか使わないようにしていたため、今まで上記のことを調べていなかったので、受け手は送り手を指定、送り手は受け手を指定するものだと勘違いしていた。

指定できるのはどちらも送り手で、受け手が送り手を指定した場合は送り手からのNotificationでない場合は受け取れない。受け手側はフィルタを指定するイメージが分かりやすい、とのこと。
AppEngine管理画面から数値IDでGQLを投げる

![gql.jpg](https://qiita-image-store.s3.amazonaws.com/0/25168/ce18a0f7-bb04-0a06-a6f4-2fcd06a5ce48.jpeg)

GoogleAppEngineのDatastoreを管理画面で見る時、
```entity.key.id()```みたいな数値のIDでGQLを投げる方法です

----

Pythonから投げる時は```Model.get_by_id()```を使えば簡単に取れるのですが、
管理画面上で数値のIDを使って
```Select * FROM HogeModel WHERE id = 12345;```
みたいにやろうとしても上手く行きません。


正しいGQLのやり方を探してみた所、以下のやり方が正しいそうです。

```SELECT * FROM HogeModel where __key__ = KEY('HogeModel', 12345)```

___key___というプロパティがKEY型で入っているので、
GQLでもKey型に揃えて検索してあげる必要があるみたいです。
Model名を2回入れなくてならないのがちょっと面倒ですね。

参考:
http://stackoverflow.com/questions/3869858/gql-query-with-numeric-id-in-datastore-viewer
Cent OS で高速パターン検索「ag」コマンドを使えるようにする方法

高速パターン検索ができる「ag - The Silver Searcher」です。

vagrant 環境などで使用するのでメモ代わりに。


```
sudo rpm -lvi http://swiftsignal.com/packages/centos/6/x86_64/the-silver-searcher-0.14-1.el6.x86_64.rpm
```
[github：ag(The Silver Searcher)](https://github.com/ggreer/the_silver_searcher)
GIT_SSH経由で鍵を複数提示する際の一考察

この記事はちょっと奇特な需要に基づいたチラ裏です。万が一理解できたら、ベターなオルターネトについてのカメントをお待ちしております。

# 状況

GitHubへのgit pushで使われる鍵を複数指定します。
ただしconfigファイルは使いません。ssh-agentも使いません。

ある特定の長時間死なないデーモンプロセスが受け取る、複数の異なるGitHubプロジェクトにプッシュするための独立した鍵があるとし、それぞれのGitHubプロジェクトに対応する秘密鍵が一つではない可能性を想定してます。ssh-agent等を使って鍵管理間違えると秘密プロジェクトが他者に漏れますので禁止しているだけです。オンデマンドに指定する方が今は安心という前提に立っています。

適当なアプローチとしてはgit pushが失敗する度に鍵を入れ替えることですが、もうちょっとベターなアプローチが欲しいということです。

* http://qiita.com/kyanny/items/c397370862095c305cbe
* http://stackoverflow.com/questions/7927750/specify-an-ssh-key-for-git-push-without-using-ssh-config

```
OpenSSH_6.0p1 Debian-4+deb7u1, OpenSSL 1.0.1e 11 Feb 2013
git version 1.7.10.4
```

今見て気付きましたがgitがちょっと古いですね……

# 一つのidentityに複数の秘密鍵は置けないようだ

上記のstackoverflowの記事SSH_KEYFILEを入れ替えるのではなく複数の秘密鍵をぶち込む方法を試しましたが2014-06-19時点の環境だと最初の鍵だけ試されて終わりました。

具体的には二つの鍵、嘘と本物を```cat >>```で結合して並び替えると先にあるものだけで公開鍵認証をします。

# そもそも -i は複数書ける

ちょっと困ったな、というところでman sshを見たら。

```
ssh -i $SSH_KEYFILE1 -i $SSH_KEYFILE2 $@
```

これは許されるのか。知らなかった。

というわけでこちらを使います。実にシンプルでした。
IEでpreventDefaultを使うときにはまったこと

IE7～11上で動かすWebシステム上でフォームの入力制限にevent.preventDefault()メソッドを使って形式外入力を受付けないようにしていたのですが、IE10以前？(IE8で確認)だとエラーに。。。
reutrn falseだとie11はスルーだと！？これだからIEは。。。

```js:対処方法
(event.preventDefault) ? event.preventDefault():event.returnValue=false;
```

 * event.preventDefault()
>指定したエレメントで発生するアクションを停止させるメソッド。


 * [stackoverflow参考記事](http://stackoverflow.com/questions/1000597/event-preventdefault-function-not-working-in-ie)
UnityでiOSアプリのアイコンが綺麗に表示されない時

UnityでiOSのアプリをビルドしてみたところ, なんだかアプリのアイコンがiOS上できれいに表示されない, ジャギー（ギザギザ感）があるように感じられる, という時に。

分かってしまえば簡単なのですが, こちらの記事の通りです。
[bad quality icon on iOS](http://answers.unity3d.com/questions/187895/bad-quality-icon-on-ios.html)

アイコン用に読み込む画像ファイルは, Unity内に読み込んだのち
**Texture TypeをGUIに変更する**必要があります。

![Screen_Shot_2014-06-18_at_7_38_11_PM.png](https://qiita-image-store.s3.amazonaws.com/0/20470/1c2a2b44-b932-276c-db65-aefac0e16705.png)

これをやらないとデフォルトではTexture TyepがTextureとなっており, Unity内で画像を使用するときにTextureタイプに則した最適化を行ってしまうようです。タイプをGUIに変えることでこれを回避できるということですね。

知らないとなかなか気づきにくいと思うので, なんだかアイコンの画質が悪いな〜という時に、この記事が検索でひっかかれば幸いです。
AWSとは、をまとめてみた

AWSをさわったことが無い人に、「AWSとは」の前提を説明する資料として自分なりにまとめてみました。

# AWSの概要

主にWEBサービスを構成するためのインフラ系のサービス群を提供するサービス。

AWSを用いてWEBサービスのインフラを構築している個人としては、以下のメリットを感じています。

* 必要な時に必要な分だけのリソースが確保でき、構成変更に柔軟に対応できる。
* スケーラビリティと高可用性のある構成を手軽に構築できる。
* 世界各地にあるデータセンターを手軽に利用できる。
* WEBサービス向けのサービスが充実しており、DBやDNSなどのかなりの部分をAWSに任せられる(運用や構築の大部分を自分たちでしなくて良い)。


# 料金

基本的に使用しただけ請求される従量課金方式。
クレジットカードのドル払いで1ヶ月単位での請求となる。
AWSを開始して1年間は[無料枠](http://aws.amazon.com/jp/free/)もあるため無料で試すことが可能。

# AWSへのアクセス手段

![aws_access.png](https://qiita-image-store.s3.amazonaws.com/0/16768/3c00acc3-16e1-1e48-fd76-b439fa8de69f.png)

以下の3つが存在する(REST APIを使ったCliもあったりする)。

| アクセス手段 | 認証方法     |
|:----------|:------------|
| REST API   | 秘密キー、アクセスキー           |
| SOAP API   | X.509証明書                    |
| [Management Console(WEBベースインターフェース)](http://aws.amazon.com/jp/console/) | ユーザ名、パスワード |

APIアクセス用に様々な言語のAPIが用意されている（[ツール | アマゾン ウェブ サービス（AWS 日本語）](http://aws.amazon.com/jp/tools/)）。

# AWSのアカウント

AWSのサービスの1つとしてAWSのアクセスコントロールが行えるIAMがある。
マスターアカウントとは別に作成したIAMユーザから上記のアクセス手段を利用できる。
マスターアカウントだと全ての権限があるのでIAMユーザなどを使ってAWSにアクセスすることが推奨される。

# AWSのデータセンター

[世界各地にあるデータセンター](https://aws.amazon.com/jp/about-aws/globalinfrastructure/?nc1=h_l2_cc)を利用できる。
[リージョンとアバイラビリティゾーン(AZ)](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)とエッジロケーションが存在する。

## アバイラビリティゾーン(AZ)

それぞれ異なる場所に存在するデータセンター。
AZにまたがってサービスを提供すると1つのAZがトラブルや災害で駄目になっても、もう1つのAZでサービスを継続できる。

## リージョン

近くの地域にあるAZの集合。
1リージョンに2-3のAZが存在する。
アカウント取得時期やリージョンによってAZの数は異なる。

## エッジロケーション

主にサービスの利用者(エンドユーザ)に関係するデータセンター。
AWSのDNSやCDNサービスの提供のために利用される。


# AWSでとった方が良い基本戦略

とった方が良い戦略は、端的に言えば「巨人の肩の上に乗る」。
[AWS-CloudDesignPattern](http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)などを利用し、提供されているサービス群を目的にあわせて適切に活用する。
アンチパターンはEC2で全部自分でやる。
JavaScript 2014

近年、フロントエンドの守備範囲の広がり、学習しなければいけない項目も増えています。
今回はその中でもJavaScriptにフォーカスし、理解してるといいこと・使えるといいライブラリなどをまとめました。

# 言語仕様
- [Prototype](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Error/Prototype)
- [apply](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)
- [call](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
- [クロージャ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Closures)
- [正規表現](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)
- [Canvas](https://developer.mozilla.org/ja/docs/Web/HTML/Canvas)

# Web API インターフェイス
- [pushstate/popstate](https://developer.mozilla.org/ja/docs/Web/API/window.history)

# ライブラリ
- [jQuery](http://jquery.com/)
- [Underscore.js](http://underscorejs.org/)
- [Backbone.js](http://backbonejs.org/)
- [AngularJS](https://angularjs.org/)
- [D3.js](http://d3js.org/)
- [CreateJS](http://www.createjs.com/#!/CreateJS)

# altJS
- [CoffeeScript](http://coffeescript.org/)
- [TypeScript](http://www.typescriptlang.org/)

# npm
- [Browserify](http://browserify.org/)

# タスクランナー
- [Grunt](http://gruntjs.com/)
- [gulp.js](http://gulpjs.com/)

# テストフレームワーク
- [Mocha](http://visionmedia.github.io/mocha/)
- [Jasmine](http://jasmine.github.io/)
- [QUnit](http://qunitjs.com/)
TwitterAPI(GIFについて)

TwitterがGIFに対応していました。
厳密にはGIFのアップロードに対応していて、Twitter側でmp4のムービーファイル形式に変換されて表示されます。
![IMG_6302.PNG](https://qiita-image-store.s3.amazonaws.com/0/24979/08d5d1aa-1c1a-e810-b76e-afafa03befb3.png)
クリックすると再生する。
![IMG_6303.PNG](https://qiita-image-store.s3.amazonaws.com/0/24979/61fb273d-f466-ce8c-28f8-47ad0d3558a3.png)

さて、このmp4ファイルですがTwitterAPIで取れるのでしょうか？

結果は以下の通りです。

*サードパーティAPI
そもそもmeida情報が送られてこない
*twitter for iPhone API
同上

というわけで、APIから直接ファイルURLを取得する事はできないようです。（隠しパラメータはあるかも）

ファイルは
https://pbs.twimg.com/tweet_video/xxxxxxxx.mp4
というURLに存在するようです。
xxxxxxxの部分が動画固有のIDになるようですが、これを取得する方法が分かれば表示出来そうですね。


追記：
ちなみにvineとはまた別の扱いのようです。
vineは
https://mtc.cdn.vine.co/r/videos/x.mp4
にアップロードされる
Codorva、ネイティブコードにJavaScriptの引数を渡す。


## やりたいこと

自作のプラグインで、引数を渡した文字列を使いたいときに、どこに渡せばいいのかわからなかった。

## 解決方法

[ドキュメント](http://docs.phonegap.com/en/3.5.0/guide_hybrid_plugins_index.md.html#Plugin%20Development%20Guide)にもかいてあるけども、個人的にはプラグインを探してきてその中身をみた方がわかりやすかった。

自分が参考にしたのは[CDVPluginTwitter](https://github.com/leecrossley/CDVPluginTwitter)というプラグイン。


[ツイートする部分](https://github.com/leecrossley/CDVPluginTwitter/blob/master/src/ios/CDVPluginTwitter.m#L73)を見つけてきて、そこをどうやってJavaScript側で渡してるんだろうと見つけてくる。（今回だと[ここ](https://github.com/leecrossley/CDVPluginTwitter/blob/master/www/CDVPluginTwitter.js#L121)）

[この部分](https://github.com/leecrossley/CDVPluginTwitter/blob/master/www/CDVPluginTwitter.js#L140)より、渡したい引数を配列で渡して、Obj-C側で、```[command argumentAtIndex: 0]```とかで取り出すようにする。 [こんな感じ](https://github.com/leecrossley/CDVPluginTwitter/blob/master/src/ios/CDVPluginTwitter.m#L75)



## 参考
[PhoneGap API Documentation](http://docs.phonegap.com/en/3.5.0/guide_hybrid_plugins_index.md.html#Plugin%20Development%20Guide)の```Sample Javascript```とか。
Cordova 3.5でiOS用のプラグインを作るときのメモ。


基本的に[こちら](http://qiita.com/sassy_watson/items/c18aada7bd168055b813)を見れば作成できますが、その中でもハマったところのメモ。

## XCodeで始めるときはPluginsディレクトリに指定して作る。

- XCodeのGroup(?)に.h, .mのファイルを追加するようにしないといけない。

## config.xmlに書く。

[こちら](http://qiita.com/sassy_watson/items/c18aada7bd168055b813)の通り作る中で、

```
    <feature name="Hello">
        <param name="ios-package" value="CDVHello"/>
    </feature>
```

をconfig.xmlに記載しないと認識されない。

## 参考

- [PhoneGap plugin for ios returning FAILED pluginJSON - Stack Overflow](http://stackoverflow.com/questions/18059433/phonegap-plugin-for-ios-returning-failed-pluginjson)
Sass(SCSS)のプレースホルダーを使ってDRYなCSSを書く


擬似セレクタを使って、アイコンを左もしくは右に設置するようなボタンを書くときに便利だったのでメモ。

```scss
/*ベースになる機能だけ*/
%base_button {
  background: #3B8B00;
  color: #ffffff;
  text-align: center;
  text-decoration: none;
  border-color: #c9c7d6;
  border-style: solid;
  border-width: 0px 2px 2px 0px;
  font-size: 14px;
  line-height: 21px;
  padding: 4px 10px 4px 10px;
  @mixin hover_and_active {
    background: #6BC42A;
    border: solid #c9c7d6;
  }
  &:hover {
    @include hover_and_active;
    border-width: 0px 2px 2px 0px;
    cursor: pointer;
  }
  &:active {
    @include hover_and_active;
    border-width: 2px 0px 0px 2px;
    position: relative;
    top: 2px;
    left: 2px;
  }
}
/*ボタンの左に要素を追加する*/
.left_icon_button {
  @extend %base_button;
  &:after {
    content: "＜";
    position: relative;
    right: -4px;
  }
}

/*ボタンの右に要素を追加する*/
.right_icon_button {
  @extend %base_button;
  &:after {
    content: "＞";
    position: relative;
    right: -4px;
  }
}
```

ちなみに要素の上書きもできるので、似たようなパーツはうまくまとめるとかなり記述量を減らせると思いました。
テーブル内のtd要素をランダムに表示する

JavaScriptはPHPのshuffle()関数みたいのがないので、下記アルゴリズムに則ってシャッフルしました。
今回はtd要素に対して書いていますけど、他の要素（例えば、li要素でリストをシャッフルとか）でも基本同じです。

配列内ランダム並び換えアルゴリズム
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>テーブル内のtd要素をランダムに表示</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(function(){
  var tdElem = $('table.list td');
  var td_array = [];

  /* td要素を配列に取得 */
  tdElem.each (function() {
    td_array.push($(this).html());
  });

  /* 配列をシャッフルする */
  var n = td_array.length;
  for(var i = n - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var tmp = td_array[i];
    td_array[i] = td_array[j];
    td_array[j] = tmp;
  }

  /* td要素に配列の値を戻す */
  tdElem.each (function(i) {
    $(this).html(td_array[i]);
    i++;
  });
});
</script>
</head>
<body>
<table border="1" class="list">
  <tr>
    <td><strong>1</strong></td>
    <td>2</td>
  </tr>
  <tr>
    <td>3</td>
    <td>4</td>
  </tr>
  <tr>
    <td>5</td>
    <td>6</td>
  </tr>
  <tr>
    <td>7</td>
    <td>8</td>
  </tr>
</table>
</body>
</html>
```
MacでVPN接続のMTU値を自動設定する

VPN接続時のMTU値のデフォルトは1500のため、環境によっては正常にパケットが到達しません。
自動的にMTU値とついでにルーティングが設定されるようにします。

How to
------

1. /etc/ppp/ip-up を作成します。

    ```bash
    $ sudo vi /etc/ppp/ip-up
    $ cat /etc/ppp/ip-up
    #!/bin/bash
    #
    # Script which handles the routing issues as necessary for pppd
    # Only the link to Newman requires this handling.
    #
    # When the ppp link comes up, this script is called with the following
    # parameters
    #       $1      the interface name used by pppd (e.g. ppp3)
    #       $2      the tty device name
    #       $3      the tty device speed
    #       $4      the local IP address for the interface
    #       $5      the remote IP address
    #       $6      the parameter specified by the 'ipparam' option to pppd
    #
    case "$5" in
        <接続先のIPアドレス>)
            /sbin/ifconfig $1 mtu 1300
            /sbin/route -nv add -net 192.168.0.0/24 -interface $1
            ;;
        *)
            ;;
    esac
    exit 0
    # EOF
    ```
    接続先のIPアドレスはVPN接続後にifconfigで確認できます。

2. 実行権限を付けます。

    ```bash
    $ sudo chmod a+x /etc/ppp/ip-up
    ```

後は、VPNに接続すると自動的に設定されます。


---
### 参考
- [A sample /etc/ppp/ip-up script](http://www.tldp.org/HOWTO/PPP-HOWTO/x1455.html)
Pygameでゲーム作成


# PyCon2014でのチュートリアル
[Richard Jones: Introduction to game programming - PyCon 2014 (Youtube)](https://www.youtube.com/watch?v=bMt47wvK6u0&noredirect=1)

![Screen Shot 2014-06-19 at 9.45.47 AM.png](https://qiita-image-store.s3.amazonaws.com/0/43154/016f0727-091f-edea-2876-77962ef8f3c7.png "Screen Shot 2014-06-19 at 9.45.47 AM.png")

三時間弱でマリオ風アクションゲームを一から作成する。
pygameがインストールされているパソコンが必要。
スライドは[ここ](https://bitbucket.org/r1chardj0n3s/pygame-tutorial/src/d27e939a73bd571eb187c5935fe67d297aadf9cd/slides.pdf?at=default)から、ソースコードは[ここ](https://speakerdeck.com/pyconslides/tutorial-introduction-to-pygame-by-richard-jones)から入手できる。


# ライブラリ
* **KezMenu** メニュー画面を簡単に作れる
* **lepton** 爆発などのエフェクト作成(Particle effect)
* **cocos**

# ソフトウェア
* [**Tiled**](http://www.mapeditor.org) タイルマップを作成できる。作成したタイルマップはtmx (xml)形式で保存できる。
* [**sfxr**](http://www.drpetter.se/project_sfxr.html) 効果音作成ツール。[cfxr](http://www.macupdate.com/app/mac/27609/cfxr)というMacバージョンがある。
* [**pyxeledit**](http://pyxeledit.com/index.php) ピクセルエディタ（商用）

# パッケージング
|                          | Windows | OS X | Android |
|:-------------------------|:-------:|:----:|:-------:|
|py2exe                    |x        |      |         |
|py2app                    |         |x     |         |
|pyInstaller               |x        |x     |         |
|Pygame Subset 4 Android   |         |      |x        |
|Kivy / python-for-android |         |      |x        |

# 参考
http://inventwithpython.com Pythonゲームプログラミングの入門書がフリーで読める
Yconnectサンプルでのエラー

非常に基本的な事で申し訳ないのですが、御教授ください。
Yconnectのサンプルコードで、以下の例外が出ます。

javax.servlet.ServletException: サーブレットの実行により例外を投げました
原因

java.lang.NoClassDefFoundError: org/apache/tomcat/util/buf/Base64
	jp.co.yahoo.yconnect.core.oauth2.TokenClient.fetch(TokenClient.java:48)
	jp.co.yahoo.yconnect.YConnectExplicit.requestToken(YConnectExplicit.java:153)
	jp.co.yahoo.sample.YConnectServlet.doGet(YConnectServlet.java:85)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

org/apache/tomcat/util/buf/Base64は、
CATALINA_HOME/server/lib/tomcat-util.jarにあると思いますが、
明示的にCLASSPATHに記載しても同様のエラーとなります。

Yconnectと直接関係ないことで申し訳ないのですが、御教授ください。

tomcat5,JDK1.6