OmniAICreator/Qiita-1.07M huggingface dataset:
[Objective-C] Swizzling（ランタイムAPI）を使ってDebugをしやすくする


最近、[Effective Objective-C 2.0](http://www.amazon.co.jp/gp/product/4798134198/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4798134198&linkCode=as2&tag=edom18-22)を読んでいます。
色々オススメされる書籍を読めば読むほど、C言語について理解する必要があるなーと思わされます。

今回は、`Swizzling`を使ったDebug方法です。
アスペクト指向とか、そのあたりがキーワードですね。
JavaScriptでも比較的簡単に実装することが出来ますが、Objective-Cでもランタイムを使うことによって実装が可能です。

ざっくり手順。

1. とある実装（メソッド）を置き換えるメソッドを準備する
2. 実行時（ランタイム）にメソッドを入れ替える
3. 置き換えるメソッド内で元々のメソッドも実行する
4. NSStringなどの中が分からないメソッドに対しても機能拡張できる（ログ出力とか）

ということで、実際に`NSString`の`lowwercaseString`メソッドにログ出力機能を付けるサンプルです。

##置き換える実装を準備する

置き換える実装（メソッド）の準備はカテゴリを使います。

```objc
@interface NSString (sample)

- (NSString *)swapLowercaseString;

@end

////////////////////////////////////////

@implementation NSString (sample)

- (NSString *)swapLowercaseString
{
	NSString *lowercase = [self swapLowercaseString];
	NSLog(@"Called. %@", lowercase);
	return lowercase;
}

@end
```


###差し替え部分

ここが要の部分ですね。
`objc/runtime.h`が必要です。
見た通り、ランタイム用の関数が定義されています。

```main.m
#import <objc/runtime.h>
#import "NSString+sample.h"

int main(int argc, char * argv[])
{
	// NSString#lowercaseStringの実装を取り出す
	Method lowercaseString     = class_getInstanceMethod([NSString class], @selector(lowercaseString));

	// カテゴリで追加した`swapLowercaseString｀の実装を取り出す
	Method swapLowercaseString = class_getInstanceMethod([NSString class], @selector(swapLowercaseString));

	// 取り出した実装を入れ替える
	method_exchangeImplementations(lowercaseString, swapLowercaseString);

	@autoreleasepool {
		return UIApplicationMain(argc, argv, nil, NSStringFromClass([SampleAppDelegate class]));
	}
}
```

###使用部分

```objc
NSString *sample1 = @"This is Sample";
NSString *sample2 = [sample1 lowercaseString]; // => "Called. this is sample"

NSLog(@"%@", sample2); // => "this is sample"
```

##簡単に解説

セレクタという名前から想像するに、なにかを選択しているわけですが、なにを選択しているかというと「実装を選択」しているわけです。
だから「セレクタ」っていうわけですね。

Objective-Cはコンパイル後にはCとして動作します。
当然、Cにはクラスという概念がありません。（オブジェクト指向言語ではない）
なので、ランタイムはObjecitve-Cで定義したインスタンスメソッドなどをうまく利用できる仕組みを提供してくれています。
それがセレクタと実装です。これらの対応表をテーブルにまとめておき、実行時にそれをルックアップして実行を決める、というのがざっくりとした説明です。

そして今回のサンプルではこの「実行時のルックアップ」を操作して、セレクタが指し示す実装を切り替えている、というわけです。
Gitコミット時の文字化け(MacでVimによるコミット)


MacでGitコミット時に`-m`を指定せずにVimでメッセージを追加したら
日本語の文字化けした。

```
~/demo/help_project (542) $ git log --oneline
6dff14e aboutB%a%=%C%I$NURLB$rJQ99
66db47d aboutメソッドを追加
ecba42a ファイル名変更
4fa72b6 showメソッドのメッセージを修正
560b964 WhatIsGitにshowメソッドを追加
ac598d0 WhatIsGitクラスを追加
```

原因は、`~/.vimrc`の設定だった。

```
set encoding=utf8
set fenc=utf-8
set fencs=iso-2022-jp,euc-jp,cp932
```

[Mac 環境構築 その6 - vim の文字コード設定 [mac]](http://peacepipe.toshiville.com/2006/04/mac-6-vim-mac.html)
> vim は 'enc' で指定された文字コードをデフォルトとし，ファイルを開く時に 'fencs' で指定された文字コードから順番に 'enc' の文字コードへ変換を試み，成功したところでやめる，全部失敗したら変換せずに 'enc' の文字コードで開く`

なので、`set = fencs=iso-2022...`の部分をコメントアウト

```
set encoding=utf8
set fenc=utf-8
"set fencs=iso-2022-jp,euc-jp,cp932
```

最新のコミットメセージを`git commit --amend`で修正してみると、文字化け解消した。

```git
~/demo/help_project (545) $ git commit --amend
[master 2cad838] aboutメソッドのURLを変更
 1 file changed, 1 insertion(+), 1 deletion(-)
~/demo/help_project (546) $ git log --oneline
2cad838 aboutメソッドのURLを変更
66db47d aboutメソッドを追加
ecba42a ファイル名変更
4fa72b6 showメソッドのメッセージを修正
560b964 WhatIsGitにshowメソッドを追加
ac598d0 WhatIsGitクラスを追加
```
CGI.pm を使った ReadParse 実装。


#概要
cgi-lib.pl の ReadParse() 関数を CGI.pm で実装するサンプルです。

あと Qiita への投稿テスト用として。

## 経緯
今時知っている人の方が少ないだろう cgi-lib.pl の ReadParse を使っている CGI（文字コードはInもOutもEUC-JP前提）をメンテする羽目に。

当然以下の様な要望がわき上がって来ます。

### 新規に追加するソースコードぐらいは UTF-8で書きたい！ 
ってことで、お手軽に実現する定番の方法を採用

```perl:
binmode STDIN,":encoding(eucjp)"
binmode STDOUT,":encoding(eucjp)"
binmode STDERR,":encoding(eucjp)"

use utf8;
```

### cgi-lib.pl 先生の ReadParse のワナ
どうも cgi-lib.pl 先生に ReadParse して貰うとなんか文字化ける。

どうやら ReadParse 先生は QUERY_STRING やらを読み出す時に binmode STDIN/STDOUT を設定してしまう模様（ソース確認してないけど）。

まあ、ReadParse したらもう一回":encoding(eucjp)"を設定すれば回避も出来るのだけど、なんかスマートじゃない。

CGI.pm の param で読み取る場合はこの問題は起きないので、んじゃリハビリがてら CGI.pm で ReadParse を実現しますかーっていう感じです。


## コード


```perl:

=head2 FUNCTION ReadParse( \%parsedParams [,\@keysYouNeed])  CGI.pm を使った ReadParse 実装 + ちょっと拡張 =head3 DESCRIPTION  cgi-lib.pl の ReadParse() 関数を CGI.pm で実装 & ちょっと拡張したサンプルです。=head3 cgi-lib 版との違い - 第二引数でハッシュに読み込むキーを制限することが出来ます。 - チェックボックスなど複数のバリューを持つ場合、配列リファレンスで格納します。

=head3 \%parsedParams CGI.pm の param()メソッドを用いて取得したキー＆バリューを格納します。

=head3 PARAM @keysYouNeed
 このオプションが渡されなかった場合すべてのインプットキーをハッシュ化します。
 cgi-lib.pl 版と異なり、単一キーに複数の値があった場合、リストに展開して
 リファレンスとして格納します。  @keysYouNeed に取得するキーのリストをセットした時はそれらのキーに
 対応する値のみをハッシュに格納します。  ただし、そのキー値がそもそも存在しない場合何もセットしません。
 これは exists や defined による各種判定が有効に
 使えるようにするためです。=head3 MEMO  文字コードを指定してデコード済み（いわゆる flagged utf8 ）の値として扱う場合 コメントアウトをはずして弄れば OK。<　もう少しスマートにかたづけたいけど
また今度。・・・もしかして CGI.pm に用意されていたりして。 =cutsub ReadParse{	my $q 			= new CGI();	my $hashRef		= shift @_ || {};	my $enableKeys	= shift @_;	#	my $encoder = find_encoding('eucjp');		my $parseMethod = sub	{		my $key = shift @_;				my @values = $q->param($key);#		map { $_ = $encoder->decode($_) } @values;				$hashRef->{$key} = scalar(@values)>1?\@values:$values[0];	};		if( 'ARRAY' eq ref $enableKeys)	{		my @keyList = $q->param();		foreach my $key ( @$enableKeys )		{			next if( ! grep{ $key eq $_ } @keyList );						$parseMethod->( $key );		}	}	else	{		foreach my $key ( $q->param() )		{			$parseMethod->( $key );		}	}}```

まあ、今時こんなコードほしがる人いないと思うけど。
ぼくのかんがえたとっても簡単なwordpressプラグインの作り方


先に断っておきます。
IDEとかいらないレベルの **簡単** なプラグイン限定です。
それと少し特殊な状況です()


# Gitが使えない環境下でもGithubにリポジトリを作ってしまう

たまたまその時、サポートの切れているUbuntuをライブ起動していたんです…

Gitはインストールされてないし追加しようにもサポート切れてるのでめんどくさい(apt-getしても時間がかかる、リポジトリの書き換えが必要)からgitは入れたくない。が、そのままGitHubに置いておきたい。そんな状況でした。

あ、それとモバイル環境からは多分無理です。エディタが言うことを聞いてくれません。

----

# 手順
## 1. リポジトリを作る

GitHubに任意の名前でリポジトリを作ってやる。


## 2. プラグインファイルを作る

多分リポジトリを作るとpushするガイドとか出るページになるだろうからそのURLに`master/new`を足してやると新規ファイル作るページが出るはずなのでプラグインファイル名.phpとして名前をつける。

## 3. メタ情報を書き込む

とりあえずcodexとかからテンプレをコピペしてプラグインヘッダーを書く。これが無いとプラグインとして認識してもらえない。

## 4. プラグイン本体を作る

3で書いたヘッダーの後にプラグイン本体を書いていく。

```:ex
function hoge (){ ... } 

add_action('なんとか','hoge');
```

## 5. 保存する
Publishしてやる。

## 6. ZipでDLする

`Download zip`からzipで落とす

## 7. wpにアップロード

wpのプラグイン追加からDLしたZIPをうpする

## 8. 有効化

プラグイン一覧からプラグインを有効化してやる


----

以上でプラグインの作成〜インストールが出来上がりです！


お疲れ様でした。
第3回オフラインリアルタイムどう書くの参考問題　pythonで解く

http://qiita.com/Nabetani/items/ebd8a56b41711ba459f9

```py:BallCount.py
# -*- coding:utf-8 -*-

# ボールカウントディクショナリの定義と初期化
ball_count_dict = {'o':0, 's':0, 'b':0}

def dict_initialize():
    ball_count_dict['o'] = 0
    ball_count_dict['s'] = 0
    ball_count_dict['b'] = 0

# アウトのカウントアップ
def count_up_o():
    if 2 == ball_count_dict.get('o'):
        ball_count_dict['o'] = 0
        ball_count_dict['s'] = 0
        ball_count_dict['b'] = 0
    elif 2 > ball_count_dict.get('o'):
        ball_count_dict['o'] += 1
        ball_count_dict['s'] = 0
        ball_count_dict['b'] = 0

# ストライクのカウントアップ
def count_up_s(pitch_type):
    if 2 == ball_count_dict['s'] and 's' == pitch_type:
        count_up_o()
    elif 2 > ball_count_dict['s']:
        ball_count_dict['s'] += 1

# ボールのカウントアップ
def count_up_b():
    if 3 > ball_count_dict.get('b'):
        ball_count_dict['b'] += 1
    else:
        ball_count_dict['s'] = 0
        ball_count_dict['b'] = 0

# 実行メソッド
def execute(pitch_types):
    count_list = []
    dict_initialize()
    for pitch_type in pitch_types:

        if 's' == pitch_type:
            count_up_s(pitch_type)

        elif 'f' == pitch_type:
            count_up_s(pitch_type)

        elif 'b' == pitch_type:
            count_up_b()
        elif 'p' == pitch_type:
            count_up_o()
        elif 'h' == pitch_type:
            ball_count_dict['s'] = 0
            ball_count_dict['b'] = 0

        count_list.append(str(ball_count_dict.get('o')) + str(ball_count_dict.get('s')) + str(ball_count_dict.get('b')))

    return count_list

# テスト実行メソッド
def test(pitch_types, exp):
    result = execute(pitch_types)
    if exp == ','.join(result):
        print pitch_types + ' => ' + exp + " : OK"

if __name__ == "__main__":
    test('s' , '010')
    test('sss' , '010,020,100')
    test('bbbb' , '001,002,003,000')
    test('ssbbbb' , '010,020,021,022,023,000')
    test('hsbhfhbh' , '000,010,011,000,010,000,001,000')
    test('psbpfpbp' , '100,110,111,200,210,000,001,100')
    test('ppp' , '100,200,000')
    test('ffffs' , '010,020,020,020,100')
    test('ssspfffs' , '010,020,100,200,210,220,220,000')
    test('bbbsfbppp' , '001,002,003,013,023,000,100,200,000')
    test('sssbbbbsbhsbppp' , '010,020,100,101,102,103,100,110,111,100,110,111,200,000,100')
    test('ssffpffssp' , '010,020,020,020,100,110,120,200,210,000')
```
GoにLuaJITをエンベッドするサンプル

[mitchellh/go-mruby](https://github.com/mitchellh/go-mruby)というのも開発中ですが、LuaJITも気になるなーと思ったら既に先人が成功させていました。

* [golang-nuts MLのスレッド](https://groups.google.com/d/msg/golang-nuts/BrSw1bELSdY/ENqtUVfYCrIJ)
* [ソースのgist](https://gist.github.com/benbjohnson/5622779#file-luajit-go)

上のソースのgistをluajit.goという名前で保存してビルドして実行するとあっさり動きました！

```shell-session
$ go build
$ ./go
Hello from the C preamble!
Hello from Lua!
Hello from the C preamble!
```

なお、動作環境は以下の通りです。goは公式バイナリ、LuaJITはhomebrewで入れました。

```shell-session
$ go version
go version go1.2 darwin/amd64
$ luajit -v
LuaJIT 2.0.3 -- Copyright (C) 2005-2014 Mike Pall. http://luajit.org/
```
階層的にデータを取得するには（多重iterate）

#概要
##材料
#####変換前html
```html
<form id="dept" data-wao-action="/dept/list/">
  <input type="hidden" name="parent_id" data-wao-param="get">
  <input type="hidden" name="emp1.name__like" data-wao-param="get">
</form>
<form id="emp1" data-wao-action="/emp/list/">
  <input type="hidden" name="del_flg" value="false" data-wao-param="inner">
</from>
<ul>
  <li data-wao-iterate="dept,3">
    <span data-wao-bindinner="name">部署名</span>
    <ul>
      <li data-wao-iterate="emp1,5">
        <span data-wao-bindinner="name">社員名</span>
      </li>
    </ul>
  </li>
</ul>
<ul>
  <li data-wao-iterate="emp1,20">
    <span data-wao-bindinner="name">社員名</span>
  </li>
</ul>
```

#####アクセスURL
`http://FQDN/dept/list/?parent_id=10&emp1.name__like=n`

#####deptテーブル
|id|parent_id|name|
|--:|--:|:--|
|10|NULL|第一開発本部|
|20|NULL|第一開発本部|
|11|10|第一開発部|
|12|10|第二開発部|
|21|20|第三開発部|
|22|20|第四開発部|

#####empテーブル
|id|fk_dept|name|del_flg|
|--:|--:|:--|:--|
|1|11|Andy|false|
|2|11|Bill|true|
|3|12|Cameron|false|
|4|12|Dave|false|
|5|21|Edgar|false|
|6|22|Frank|false|
|7|22|Gus|false|

##できあがり
#####変換後html
```html
<ul>
  <li>
    <span>第一開発部</span>
    <ul>
      <li>
        <span>Andy</span>
      </li>
    </ul>
  </li>
  <li>
    <span>第二開発部</span>
    <ul>
      <li>
        <span>Cameron</span>
      </li>
      <li>
        <span>Dave</span>
      </li>
    </ul>
  </li>
</ul>
<ul>
  <li>
    <span>Andy</span>
  </li>
  <li>
    <span>Cameron</span>
  </li>
  <li>
    <span>Dave</span>
  </li>
  <li>
    <span>Edgar</span>
  </li>
  <li>
    <span>Frank</span>
  </li>
  <li>
    <span>Gus</span>
  </li>
</ul>
```
[PureData]Pd Tips - コードレスパッチングへの端緒

Pd を使う上で知っておくとパッチングがはかどるかもしれない Tips 集をお送りしています。

####Pdのコマンドラインインターフェースを使う

Pdに対するメッセージ(下図)は、パッチにメッセージを書かずとも送信することができます。

![Screen shot 2014-03-17 at 21.03.28.png](https://qiita-image-store.s3.amazonaws.com/0/8510/27985513-a00e-9d64-6a34-dbb93232a34c.png)

メニューバーの `File > Message..` で表れるウィンドウがそれです(キーボードショートカットは `Cmd + Shift + m`)。

![Screen shot 2014-03-17 at 21.09.48.png](https://qiita-image-store.s3.amazonaws.com/0/8510/6fe187e6-e909-240b-7f13-0d6cf66437bd.png)

`pd dsp 1` と入力してリターン押すと DSP が ON になります。
また、`pd quit`で Pd を終了させることができます(使い途あるのかわかりませんけど...)。

既にこの手のメッセージングに習熟している方々はお気づきかもしれませんが、[receive] オブジェクトに値を送ることもできます。
以下は [receive foo] というオブジェクトに 数字1 を送る例です。

![Screen shot 2014-03-17 at 21.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/8510/191cd02c-481a-22e4-3149-0b914a3d3911.png)

テキストフィールド内で `;` を使うと複数メッセージも送信できます。
![Screen shot 2014-03-17 at 21.20.12.png](https://qiita-image-store.s3.amazonaws.com/0/8510/fc42c110-5e3c-3962-1d85-e26bb3896fe8.png)

再利用しないアドホックなメッセージを送るのに便利かもしれません。

####FUDIプロトコル

このような `;` で始まるメッセージ形式を FUDI プロトコルというらしく、ミラー・パケット氏により開発・提唱されているものだそうです。Pd-vanilla のソース中のコメントにも度々出てくるのですが、あまりちゃんとしたドキュメントが存在していない感じです。

Wikipedia になぜか項目があるのでFUDIの素性ということで引用しつつリンクを紹介しておきます。

> FUDI is a networking protocol used by the Pure Data patching language invented by Miller Puckette. It is a string based protocol in which messages are separated by semicolons. Messages are made up of tokens separated by whitespaces, and numerical tokens are represented as strings. [(FUDI - Wikipedia, the free encyclopedia)](http://en.wikipedia.org/wiki/FUDI)

セミコロンで区切られた英語の平文をネットワーク上に流すとそれはもう FUDI って感じで、なんかプロトコルとしては緩い感じです。

実はこの形式のメッセージ送信は、Cycling'74 Max でもよく使われています。

Max 側のドキュメントを見ても FUDI というキーワードは見えてこないのですが、";" 始まりなので同じプロトコルと言えますね。
> if the message in a message box begins with a semicolon (;) followed by the word max, any message which follows will be sent directly to the Max application itself, just as though there were a receive object named "max".
[Controlling Max with Messages](http://cycling74.com/docs/max5/vignettes/core/messages_to_max.html)

現在ではOSCが広く使われているので日の目を見ませんが、Max と Pd には[netsend][netreceive]というプロセス間通信をやるためのオブジェクトが存在していて、TCP のセッション上で FUDI プロトコルのメッセージを流し合っていました。
AngularJS で ngTouchとngAnimate を導入したメモ


AngularJS 1.2 で対応されたらしい ngTouche と ngAnimate を導入したメモです。
特にモバイルの場合、タッチイベントの最適化やスワイプの対応は必須かなと。
（何もしないと、タッチイベントはダブルタップ判定待ちで 300ms の遅延があるらしい。）

スワイプのデモはこちら ⇒ http://hkusu.github.io/AngularJS_ngTouch_demo/



# 導入手順

※前提として AngularJS本体が 1.2 以降である必要があります。

- [こちらと同じ手順](http://qiita.com/hkusu/items/7d748b55ba73cc8a3675)で、Yeoman で AngularJS の雛形を生成。必須ではないが ui bootstrap も導入しておく。
- 追加で ngTouche と ngAnimate をインストール

```
$ bower install angular-touch --save
$ bower install angular-animate --save
```

- `index.html` からインクルード

```html:index.html
<script src="bower_components/angular-animate/angular-animate.js"></script>
<script src="bower_components/angular-touch/angular-touch.js"></script>
```

- AnguraJSに組み込み。下記のように2行を追記

```javascript:app.js
'use strict';

angular.module('ngTouchTestApp', [
  'ngCookies',
  'ngResource',
  'ngSanitize',
  'ngRoute',
  'ui.bootstrap',
  'ngTouch',       ←追記
  'ngAnimate'      ←追記
  ])
  .config(['$routeProvider', function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      })
      .otherwise({
        redirectTo: '/'
      });
  }]);
```

以上で終わりです。

# 使ってみる

## ngTouch

- 参考URL：http://docs.angularjs.org/api/ngTouch
- ngTouchは上記のようにいれるだけで `ng-click` が高速化（ダブルタップ判定の300msを無視）されるらしい
- ngSwipeLeft と ngSwipeRight は、その名の通り 左スワイプと右スワイプ
- 導入は次のような感じ。

```html:main.html
<div class="container">
    <hr>
    <div ng-show="!showActions" ng-swipe-left="showActions = true">
        この文字列を左にスワイプしてください！
    </div>
    <div ng-show="showActions" ng-swipe-right="showActions = false">
        ボタンが出てきました。隠すには右にスワイプしてください！
        <button class="btn btn-danger" ng-click="">ボタン</button>
    </div>
    <hr>
</div>
```

デモ ⇒ http://hkusu.github.io/AngularJS_ngTouch_demo/

## ngAnimate

- 参考URL
	- http://docs.angularjs.org/api/ngAnimate
	- http://www.nganimate.org
- CSSでアニメーションをつけれるらしいです。今回はあれなので略します(震え声)

# おわりに

上記の[デモ](http://hkusu.github.io/AngularJS_ngTouch_demo/)のように、モバイルではタッチイベントやスワイプは必須だと思うので、うまく活用したいところ！

あと上記で書き忘れましたが、モバイル用に viewport はきちんと設定しておきましょう。

```
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
```

幅を端末幅にあわせ（これに合わせてBootstrapもレスポンシブになり）、ピンチイン/ピンチアウトは禁止にしています。
Scala: Listにインデックスを振りながらmapする方法


```scala
val list = List("a", "a", "a")
list.map("N番目の" + _)
```

ここのN番目をリストのインデックスにしたい!

`zipWithIndex` を使うとインデックスを付番したリストを得ることができる。


```scala
val list = List("a", "a", "a")
list.zipWithIndex.map { case (item, index) => index + "番目の" + item }
```
dyld: Symbol not found: _OBJC_CLASS_$_UICollectionReusableView エラーの原因

iOS5の実機でRunした時にクラッシュし、下記のようなログが出ていました。

```
dyld: Symbol not found: _OBJC_CLASS_$_UICollectionReusableView
  Referenced from: /var/mobile/Applications/yyyyyyyy-aaaa-nnnn-oooo-zzzzzzzzzzzz/Xxxx.app/Xxxx
  Expected in: /System/Library/Frameworks/UIKit.framework/UIKit
```

UICollectionViewを使っていないのになぜ？原因を調べてみました。


以下の記事を見つけて、最近Revealのframeworkを入れたことを思い出しました。

* [Reveal and iOS 5.1 Compatibility](http://jobsismyhomeboy.com/?p=26 "Reveal and iOS 5.1 Compatibility")

iOS5はRevealのサポート外のようです...
(しばらくは使いそうにないのでframeworkを削除しました。)
zipが使えれば大丈夫！ipaのプロビジョニング設定を判別

#はじめに
ipaにしてから、releaseだっけ、adhocだっけと迷ったのです。

#方法
確認の方法は次のいずれかで調べることができます。
（１）codesighコマンド
（２）embedded.mobileprovision

個人的には
（１）で行うことはほとんどなかったりします。
ipaファイルを解凍後に（２）をmiエディタで確認しています。
##codesignコマンド

 1. ipaファイルの拡張子をzipに変更し解凍
 2. Payloadフォルダにappファイルが含まれる形で展開される
 3. 取り出したappファイルをcodesignコマンドで実行

```
$ codesign -d --entitlements :- hogehoge.app
```

###`:-`について
(2015/3/20 追記)
コメントでご指摘をいただいて追記しました。
codesign の *path*に指定しているパラメータは
`:` ("blob")headerに対応。
`-` 標準出力
`:`をつけることで出力時に文字化けて出力されるバイナリを削って出力してくれます。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>application-identifier</key>
	<string>FAEH9523ZZ.jp.co.hoge.tap.2014.ImageViewer</string>
	<key>get-task-allow</key>
	<false/>
	<key>keychain-access-groups</key>
	<array>
		<string>FAEH9523ZZ.jp.co.hoge.tap.2014.ImageViewer</string>
	</array>
</dict>
</plist>

```
###分かること
push通知の設定があればdeveloper用とproduction用の区別

###分からないこと
adhocとreleaseの区別

##embedded.mobileprovision
署名に使ったプロビジョニングファイルがappファイルにそのまま入っています。

 1. ipaファイルの拡張子をzipに変更し解凍
 2. Payloadフォルダにappファイルが含まれる形で展開される
 3. appファイルを右クリックし、"パッケージの内容を表示"を選択
 4. embedded.mobileprovisionを見つけて開く

プロビジョニングファイルそのものです。ファイル名もkeyとしてはいっています。

###分かること
 - push通知の設定
 - デバイス登録されている端末
 - プロビジョニングファイルが生成された日時

などなど

###Appleへの申請用とadhocの違い
デバイス登録されている端末情報（ProvisionsAllDevices）で判断しています。追加されていなければreleaseかなと。

#参考
https://developer.apple.com/library/mac/qa/qa1798/_index.html

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/codesign.1.html

#さいごに
プロビジョニングファイルの指定についてはビルド時とipaとして書き出す時の二回あります。
アーカイブしたときに保存されるXcode Archiveという形式にするときと
Xcode Archiveからipaを作成する場合で、Archive時に指定した別プロビジョニングファイルと差し替えのためでした。
UnityProjectをGitHubで管理する

1. GitHub for Windows をインストールする  
2. リポジトリ作成   Unity_Git_Test  

3. UnityProjectの作成・設定
Project => 2D GitTest
設定  => [Edit] > [Project Settings] > Inspecter上から設定を変える
以下の“Mode”を変更
[Version Control] を “Meta Files”
[Asset Serialization] を “Force Text”  

  
  
  


4. UnityPojectをリポジトリ内に移動
リポジトリの右クリックメニューから [view on github] を選択し、そこにUnityProjectの[2D GitTest]フォルダを丸ごと移動

5. リポジトリに、いらないファイルを無視する設定をする
歯車のアイコン > [Repository Settings...] > [ignore files] で無視するファイルを設定する
以下を最後に追加
Library
Temp
*.pidb
*.unityproj
*.sln
*.userprefs


6. UnityProjectにScriptを追加し、コミットする
右上のアイコンから新しいBranchを作成
変更を行うと、GitHub for Windows が自動検出する
[Show] ボタンを押して検出内容を表示し、コミットする

7. [Publish]ボタンを押してサーバーと同期させる(pull request)

8. pull requestをMergeしたら、[sync]ボタンでMasterブランチに同期させる  
[参考にしたサイト](http://keijiro.github.io/unity-github-tutor/)  
[今回作ったリポジトリ](https://github.com/GoldenDrop/Unity_Git_Test)
input type = 'date' に初期値を設定したいときの日付フォーマット


意外と情報が少なかったのでメモ。

```html
  <input type='date' value='2014-03-18'>
```

YYYY-MM-DDの形式で入れてやるとちゃんと初期値が表示されます。
それ以外の場合は、valueに値を入れても画面に表示されませんでした。
accepts_nested_attributes_forのupdate_onlyについて

日本語で触れている記事が全く無かったので、英語の記事だとすぐに飛ばしちゃうような自分みたいな人の為にメモしておく。
下記のように定義されたモデルがあるとする。

```rb
class User
  has_one :user_profile
  accepts_nested_attributes_for :user_profile
  # email:string
end

class UserProfile
  belongs_to :user
  # name:string
end
```

既に作成済みのUserProfileに、@user.update_attributesメソッドでuser_id無しの更新をかけてみる。

```rb
> User.last.user_profile
=> #<UserProfile id: 1, name: "絢瀬絵里", user_id: 1, created_at: "2014-03-17 08:46:26", updated_at: "2014-03-17 08:47:28">
> User.last.update_attributes({ user_profile_attributes: { name: "賢い、可愛い、エリーチカ" }})
# UPDATEの後にINSERTが実行される
```

ログを見て頂くとわかると思うが、元のUserProfileのuser_idをnilに更新して、新規にUserProfileのデータを作成している。
次にupdate_onlyオプションをつけて、同じように実行してみる。

```rb
class User
  has_one :user_profile
  accepts_nested_attributes_for :user_profile, update_only: true
end
> User.last.update_attributes({ user_profile_attributes: { name: "KKE!KKE!" }})
# UPDATEが実行される
```

このようにパラメータに外部キーが存在しない場合の挙動が変わってくる。
update_onlyはデフォルトtrueでもいいような気がしてるけど、何かあるんですかね。
XcodeでToolbarが突然消えたら見るメモ

Xcode触りたてで、ウィンドウ構成もよくわかっていないときに突然遭遇し、何が起こったのかわからず非常に困ったのでメモ。

##事象
Xcodeを立ち上げると、いつもデフォルトで表示されていたものと比べるととてもシンプルなウィンドウが表示されました。
左のナビゲーションエリア、右のユーティリティエリアがありません。
これらを表示する右上のボタンも消えてしまいました。
![スクリーンショット 2014-03-14 11.37.29.png](https://qiita-image-store.s3.amazonaws.com/0/38863/8b51639f-8083-8907-3445-8309a8654423.png)


##解決方法
1. 「View>Show Toolbar」を選択します
![スクリーンショット 2014-03-14 11.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/38863/682f9824-1279-0726-2097-6821c5dee860.png).

1. Toolbarの右上のボタンで左右の領域を表示します
![スクリーンショット 2014-03-14 11.39.01.png](https://qiita-image-store.s3.amazonaws.com/0/38863/4b7f2cf9-eb4f-14eb-4453-8f4076946372.png).

1. これでもとどおりです。
![スクリーンショット 2014-03-17 17.19.31.png](https://qiita-image-store.s3.amazonaws.com/0/38863/4334f266-3710-aea3-a057-2bed7f897f31.png).


##原因
私のケースでは、前回利用時の終了方法が原因だったようです。

###前回利用時の終了方法
1. 別ウィンドウ表示をしていた
1. メインウィンドウを左上の「×」で閉じた　※(1)
1. 別ウィンドウを左上の「×」で閉じた　※(2)
![スクリーンショット 2014-03-17 17.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/38863/9c6d9660-cad9-b877-5211-a00d23d4f575.png)
CapistranoでのdeployをGoogle SpreadSheetに記録しちゃう

# やりたいこと

あるdeployを機にパフォーマンスやPV/売上が変ることってありますよね。最近のdeployなら追えますが、半年前のdeployってなると記憶も記録もなくて困りませんか？
そんな適当なのはウチだけですか？
deployの記録をSpreadSheetへ記録したくて、こんなもの考えました。

# 準備

## Google Formを作成
Google SpreadSheet & Formで記録しておきたい項目のフォームを作ります。ウチではこんな項目を保存します。

* デバイス
* 変更概要
* 担当者
* リビジョン
* タイムスタンプ（自動で記録される項目）

**フォームの設定で回答は誰でもできるよう**にしておきましょう。
**回答者が記録されるシートを閲覧できないよう**にしておきましょう。


## Google Formから必要な情報をメモ
作成したフォームのHTMLを表示し、次の項目を控えておきます。

* Form action URL
* 各入力項目のname属性

## Capistranoタスクを作成

deploy/配下にこんなファイルを用意します。

```deploy/record_history.rb
namespace :deploy do
  task :record_history do

    prompt = HighLine.new

    this_deploy = {
      description: prompt.ask('deployによる変更概要を入力してね'),
      at: Time.now.strftime("%Y-%m-%dT%H:%M"),
      device: 'PC',
      who: `whoami`,
      memo: current_revision
    }

    uri = URI.parse("https://docs.google.com/a/dongoon.jp/forms/d/[Formによって違います]/formResponse")
    Net::HTTP.start(uri.host, uri.port, use_ssl: true){|http|
      request = Net::HTTP::Post.new(uri.path)
      params = {
        "entry.123400001" => this_deploy[:description],
        "entry.123400002" => this_deploy[:device],
        "entry.123400003" => this_deploy[:who],
        "entry.123400004" => this_deploy[:revision],
      }
      request.set_form_data(params)
      http.request(request)
    }
  end
end
```


```config/deploy/production.rb
load 'config/deploy/record_history'
after "deploy", 'deploy:record_history'
```

以上で本番環境のdeployの時のみ、変更概要を入力するプロンプトが表示され、その内容がSpreadSheetに記録されちゃいます。上の例では、操作するユーザIDとdeployするリビジョンを自動的に登録しています。
Anuglarjsのui-routerでhtml5Modeを使って、ダイレクトに下層ページを表示するには

ホントにただのメモ。
ui-routerのwikiのよくある質問にあがってました。
サーバー側でリライトの設定が必要とのこと。

https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-configure-your-server-to-work-with-html5mode
3/17日のJavaScript学習内容

text:独習JavaScript

本日の内容
P200-P233
・instanceof演算子によるクラスの判定
・constructorプロパティでコンストラクタを判定する
・ダックタイピングによる判定

・メソッドをプロパティとして定義する(thisキーワード)
・プロトタイプ(prototype)
・プロトタイプチューン
・クラスメソッドの定義

・クラスの継承(プロパティ、メソッド)
・hasOwnProperty()メソッド

・スコープ
・名前空間の作成

ようやく６章が全部終わり、テキストも半分以上まできました。
７章からは一層Web作成のために必要となるイベント駆動型プログラミングの勉強です。

ただ、今までの基本がほぼ分かっているかと問われると自信を持てないので、
しばらくは６章までの練習問題を解いていきながら
７章と並行してやっていきたいと思います。

最近の悩みは
メソッドが多すぎて覚えきれないことです・・・
iOS7.1でセルの高さを変更しても中身がはみ出して表示されてしまう場合の対応

# iOS7.1でセルの高さを変更しても中身がはみ出して表示されてしまう場合の対応

```objc
UITableViewCell* cell = ****;
[cell setClipsToBounds:YES];
```
漸近理論とそのシミュレーション (1)

## 大数の法則とは

昨今ビッグデータブームなどと言われて久しいですが、大きなサイズのデータを基にした統計量については一定の法則があります。ここでは大規模なデータの分析において欠かせない漸近理論についてその説明をし、コンピュータ上でプログラムによるシミュレーション実験をします。

漸近理論としてはまず確率の大定理である「[大数の法則](http://ja.wikipedia.org/wiki/%E5%A4%A7%E6%95%B0%E3%81%AE%E6%B3%95%E5%89%87)」があります。これについて考察してみます。

### コイントスを例として考えてみる

表と裏が出る確率がそれぞれ 1/2 であるコインを投げて、その結果を集計します。 (※実際には社会調査や医療診断の結果を集計するわけですが、ここではわかりやすくコイントスで理論を説明します。)

2 種類の事象 (表と裏) のいずれかが生じ、その確率が一定である場合、これを **ベルヌーイ試行 (Bernoulli trial)** と呼びます。

表が出た場合を成功とします。ここでは表を 1 、裏を 0 となる確率変数 Xi を考えてみましょう。 10 回のコイントスで表が出る回数は

```math
r = x_1 + x_2 + ... + x_{10}
```

となります。一般にコイントスの回数を n とするとき r/n は相対頻度となります。期待値は

```math
E(r) = np = 5
```

となります。コイントスをして表が出る確率が 1/2 であることは自明ですから p = 0.5 は真の成功率です。

分散は

```math
V(r) = np(1 - p) = 2.5
```

となります。


では、コイントスを一定回数繰り返して、成功度合いが (= 表が出る回数) が 0.4 〜 0.6 の範囲になる確率はどれくらいでしょうか？

コイントスを 10 回とすると

```math
P(0.4 {\leq} r/10 {\leq} 0.6) = {\sum_{x=4}^{6}}f_{10(x)} = 0.65625
```

となります。これを例えば 100 回に増やすと

```math
P(0.4 {\leq} r/10 {\leq} 0.6) = {\sum_{x=40}^{60}}f_{100(x)} = 0.96780
```

となり、きわめて高い確率 (96% くらい) で 0.4 から 0.6 に収束することがわかります。

すなわち ε がどのように小さい正の整数であっても

```math
P(|r/n - 0.5 | {\leq} {\epsilon}) {\xrightarrow[]{}} 1, (n {\xrightarrow[]{}} {\infty})
```

となることが保証されます。

### 定理式

確率変数 X が正の値をとるとき、次のマルコフ不等式

```math
P(X \geq a) {\leq} \frac{E[X]}{a} (a \gt 0)
```

が成立します。

大数の法則では、一般的に、大標本では、観測された標本平均を母集団の真の平均 (母平均) とみなしてよいとします。

## 中心極限定理とは

[前回](http://qiita.com/ynakayama/items/8671d729687bc1ce066a)も軽く登場した[中心極限定理](http://ja.wikipedia.org/wiki/%E4%B8%AD%E5%BF%83%E6%A5%B5%E9%99%90%E5%AE%9A%E7%90%86)について説明します。この定理は最尤推定量の漸近正統性を証明するときに中心的な役割を果たします。これは大まかに説明すると和 X1 + ... + Xn の確率分布の形は n が大きな値であるときは、大略正規分布と考えて良いということです。

### ダイスを例として考えてみる

2 つの六面体ダイス (サイコロ) を振った時に出る目について考えてみます。たまたま 1 ゾロ (=2) や 6 ゾロ (=12) が出たとしても、何度も試行回数を増やしていくとその平均値の分布が釣鐘型の正規分布に近づいていきます。

### 定理式

定理を示すと n → ∞　のとき

```math
\int_{a}^{b}\frac 1 {\sqrt2{\pi}} e^{-x^2/2}dx
```

となります。

## 二項分布の正規分布による近似

たとえば 40,000 回コイントスをして **20,400** 回以上表が出ることはどれくらい起こりえることでしょうか。

表が出る確率は 1/2 で、単純に考えれば表が出るのは 40,000 回中 20,000 回です。偶然にも 20,400 回も表が出るということは、全体からするとたった 2 パーセントのブレですから、なんとなく偶然起こりそうな気もしてきます。果たしてそうでしょうか？

ここで各回の表、裏を Xi = 1,0 として n 回中の 1 の総回数の確率分布を求めます。

n = 40,000 で、 X は二項分布 Bi(40000, 1/2) に従います。ここで中心極限定理を応用します。

```math
P(19600 \leq X_1 + ... + X_{40000} \leq 20400)\\
= P(-4 \leq (X_1 + ... + X_{40000} - 20000) / 100 \leq 4) \\
= {\phi}(4) - {\phi}(-4) \\
= 0.9999
```

したがって 40,000 回のコイントスで 20,400 回以上表が出る確率は **0.01** パーセント程度ですから、まず起こり得ないと言えることがわかりました。

次回は、実際に計算機上のシミュレーションで大数の法則を実験してみます。

## 参考

統計学入門 (基礎統計学)
http://www.amazon.co.jp/dp/4130420658
日本統計学会公式認定 統計検定1級対応 統計学 [単行本]
http://www.amazon.co.jp/dp/448902150X
automaticallyAdjustsScrollViewInsetsを無効化できないとき

automaticallyAdjustsScrollViewInsetsをNOにしてもなぜか20ptのinsetが入ってしまって悩んでいました。

そのときにこの記事を見て、『直下のviewに対してaddしたview（view.subviews[0]）についても設定が反映される』ということがわかり、親を辿って全部NOに設定したら直りました。
http://qiita.com/yimajo/items/254c7cebab7864678246

	for (UIViewController *controller = self; controller != nil; controller = controller.parentViewController) {
		controller.automaticallyAdjustsScrollViewInsets = NO;
	}

あとカスタムContainerViewControllerで子をViewController hierarchyに追加する前に子のview.frameを修正してviewDidLoadが呼ばれちゃったりしてたのも修正する必要があった。
Scala: 計算結果を親クラスのコンストラクタの引数にする方法


# 方法1: 親クラスの引数の中で計算する

```scala
class InvalidOrderException(order: String) extends RuntimeException("Invalid order: " + order)

throw new InvalidOrderException("foo bar")
```

# 方法2: コンパニオンオブジェクトのファクトリの中で計算する


```scala
class InvalidOrderException(message: String) extends RuntimeException(message)
object InvalidOrderException {
	def apply(orderType: Int) = orderType match {
		case 1 => new InvalidOrderException("Something wrong 1")
		case 2 => new InvalidOrderException("Something wrong 2")
		case _ => new InvalidOrderException("Unknown, but something wrong")
	}
}

throw InvalidOrderException(1)
```

# 方法3: this()でオーバーロードする

```scala
class InvalidOrderException(message: String) extends RuntimeException(message) {
 def this(orderType: Int) = this(orderType match {
		case 1 => "Something wrong 1"
		case 2 => "Something wrong 2"
		case _ => "Unknown, but something wrong"
	})
}

throw new InvalidOrderException(1)  
```
オブジェクト自身を参照する際に、thisと変数名のどちらを使うか

あるオブジェクトのメソッドで自身のプロパティを参照する場合。
run1とrun2のどちらにするか迷う。

```js
var o = {
  prop: 1,
  run1: function(){
    this.prop
  },
  run2: function(){
    o.prop
  }
}
```

世間ではthisを使っている人が多いと感じる。
見やすいので私は変数名を使いたい。

## thisの場合の特徴

1. thisの参照が変わってしまう
2. thisが何を指すか分かりにくい
3. コンストラクター + prototypeに変えやすい
4. オブジェクトの構造を変えやすい
5. 直接実行できる

1, 2の欠点が大きいので、thisは継承以外では使わないように、とどこかで見たような気がするが・・・これしか見つからなかった。しかしこれは特定のコンパイル向けの説明。

> To prevent property flattening from breaking your references to this, only use this within constructors and prototype methods. The meaning of this is unambiguous when you call a constructor with the new keyword, or within a function that is a property of a prototype.

[Understanding the Restrictions Imposed by the Closure Compiler - Closure Tools — Google Developers](https://developers.google.com/closure/compiler/docs/limitations) の一番下

一方で[Google JavaScript Style Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=this#this)では使ってもよいと書いてあったり

<blockquote>
  <p>Because this is so easy to get wrong, limit its use to those places
    where it is required:</p>
  <ul>
    <li>in constructors</li>
    <li><mark>in methods of objects</mark> (including in the creation of closures)</li>
  </ul>
</blockquote>


### 1. thisの参照が変わってしまう

setTimeoutなど。
-> bind, callなどを使う手がある

### 2. thisが何を指すか分かりにくい

コメント書いてほしい!
-> でもコメント書いても実行されるコンテキストで変わってしまう...

### 3. コンストラクター + prototypeに変えやすい

設計段階ではただのオブジェクトで書いて、あとから書き換えるときに。
prototype以下を修正無しでそのまま使える。

```js
function Klass(prop){
  this.prop = prop
}
Klass.prototype.run = function() { //変更不要
  this.prop
}
```

### 4. オブジェクトの構造を変えやすい

- 変数名をoではなくmyObjにリネーム

```js
var myObj = {
  prop: 1,
  run1: function() {
    this.prop // そのままでOK
  },
  run2: function() {
    o.prop // 要変更 => myObj.prop
  }
}
```

- 上位のオブジェクトの中に入れる場合

```js
var parentObj = {
  o: {
    prop: 1,
    run1: function() {
      this.prop // そのままでOK
    },
    run2: function() {
      o.prop // 要変更 => parentObj.o.prop
    }
  }
}
```

読みやすさとリネームの手間のどちらを取るか（リネームは簡単に行えるのけども）。

しかし、こうする手もある。

```js
(function(o) {
  o.run2()
})(parentObj.o) // <- 階層が深いとここが面倒?
```

### 5. 直接実行できる

＊利点なのか疑問

```js
({
  prop: 1,
  run1: function() {
    this.prop
  }
}).run1()
```

## まとめ

5以外は、this/変数名どちらを使ってもそれぞれの問題に対応する術はある。

<b>変数名</b>: わかりやすい
<b>this</b>: 固定する方法があり、汎用性が高い

(´-`).｡oO( 結局どちらにしたら良いのじゃろう。なぜthisを使う人が多いのだろう。 )
Scalaの別名インポートは import package.name.{ClassName => Alias} と書く


例:

```scala
import java.util.{Date => DateTime}
```

余談


import java.util.Date as DateTime

とか

import DateTime <- java.util.Date

とか

import java.util.Date => DateTime

とか、調べる前にいろいろ試行錯誤したが、調べたほうが早かった・・・。
データを画面上に表示するには

#概要

データベース上の値を表示するには `data-wao-bind` 属性を使用します。

##材料

#####変換元html

```html
<!--データ取得-->
<form data-wao-action="/employee/detail/">
  <input type="hidden" name="id" data-wao-param="url">
</form>
<!--データ表示-->
<div data-wao-bind-class="dept_`employee.dept_id`">
  <div data-wao-bindouter="employee.name">Name</div>
</div>
```

#####アクセスURL

`http://FQDN/employee/detail/id/123/`

#####employeeテーブルの中身

|id|dept_id|name|
|--:|--:|--:|
|123|45|John|

##できあがり

#####変換後html 

```html
<div class="dept_45">John</div>
```



#書式

## bindの種類

|属性名|説明|
|:--|:--|
|data-wao-bind- *attribute* | *attribute* で指定された属性の値を上書き更新する|
|data-wao-prepend- *attribute* | *attribute* で指定された属性値の前方に指定された値を追加する|
|data-wao-apend- *attribute* | *attribute* で指定された属性値の後方に指定された値を追加する|
|data-wao-bindouter|属性を持つ親タグを削除して、その箇所に指定された値を出力する|
|data-wao-bindinner|属性を持つ親タグのinnerHtmlを指定された値に書き換える|
|data-wao-prependinner|属性を持つ親タグのinnerHtmlの前方に指定された値を追加する|
|data-wao-apendinner|属性を持つ親タグのinnerHtmlの後方に指定された値を追加する|

##属性値

_DB.table_name.column_name
table_name.column_name
column_name
デフォルト：escape
エスケープさせない場合はカラム名の先頭に＠をつける
＠＠とするとタグだけを削除
|substr(128)
|substr(4,100)
|left(50)
|right(50)

`table_name.column_name|raw|left(50)`
`updated_datetime|DATE(yyyy-MM-dd)`
`total_count|FORMAT(#,##0)`



#付録
##関連項目
[aaa]()
Pandasでデータフレームを条件指定で参照する

Rっぽく条件指定する時に悩んだのでメモ。
ixが今のところ良さそう。

とりあえず、データフレームを作る

```py
>>> df = pd.DataFrame(arange(12).reshape((3, 4)), index=list("ABC"), columns=list("abcd"))
>>> df
   a  b   c   d
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11
```

##スライスで参照する
ixの第1引数に行を指定するスライス。第2引数に列を指定するスライス。
引数の省略は無理みたい。

```py
>>> #行のみ指定
>>> df.ix[ 1: , :]
   a  b   c   d
B  4  5   6   7
C  8  9  10  11
>>>
>>> #列のみ指定
>>> df.ix[ : , 1:3]
   b   c
A  1   2
B  5   6
C  9  10
>>>
>>> #行･列の両方をスライスで指定
>>> df.ix[ 1: , 1:3]
   b   c
B  5   6
C  9  10
```

##インデックス(行番号、列番号)で参照する
抽出するIndex番号をリストで渡してやればいい。インデックスは、名称でもOK。なお、スライスと併用可能な模様。
リストで指定すれば、順番を入れ替えることも可能。

```py
>>> #0行目と2行目、1列目と2列目と3列目を参照する
>>> df.ix[ [0,2], [1,2,3]]
   b   c   d
A  1   2   3
C  9  10  11
>>>
>>> #スライスと併用可
>>> df.ix[[0,2], :]
   a  b   c   d
A  0  1   2   3
C  8  9  10  11
>>> 
>>> #名称で指定
>>> df.ix["B", "b"]
5
>>>
>>> #範囲指定
>>> df.ix["B":"C", "b":"c"]
   b   c
B  5   6
C  9  10
>>>
>>> #名称をリストで指定
>>> df.ix[["A","C"], ["b","a"]]
   b  a
A  1  0
C  9  8
```


##条件式で参照する
ixの行指定か列指定で、条件式を突っ込んでやればいい。
スライスも併用できるので、特定の行全部とか、特定の列全部の場合はスライスで:だけ入れる。

```py
>>> #行の合計が10以上の行だけ抽出
>>> df.ix[df.apply(sum, axis=1) >= 10, :]
   a  b   c   d
B  4  5   6   7
C  8  9  10  11
>>>
>>> #列の最大値が10以上の列だけ抽出
>>> df.ix[ : , df.apply(max, axis=0) >= 10]
    c   d
A   2   3
B   6   7
C  10  11
>>>
>>> #True/Falseでも指定できる
>>> df.ix[ [True,False,True] , [False,False,True,True] ]
    c   d
A   2   3
C  10  11
```
(初心者向け)NSXMLParserでCDATAを解析する

ネットで検索してもStackOverflowにしか情報が無かったので備忘録代わりに投稿しました。

ニュースアプリを製作しているときに引っかかったのが、xmlのCDATAセクションでした。
CDATAセクションとは、以下のサンプルのものを言います。

```xml:CdataSample.xml
<description><![CDATA[<p><img src="http://xxxxxx.jpg" width="640" height="360"/>]]></description>
```

CDATAセクションの中にはHTMLタグも埋め込むことができるので、RSSを配信している側にとっては便利なんですが、XMLパーサーを回避するので、XML解析する側にとっては嫌な存在です。ただ、NSXMLParserにはCDATAを解析するメソッドが用意されています。

```objc:XmlParser.m
-(void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
   // CDATAの中身をUTF-8にエンコーディングする。
   NSString *string = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
}
```

このメソッドはNSXMLParserを使うときにCDATAを扱える唯一の手段なのですが、デメリットとして[elementName isEqualToString:@"item"]のようにタグを検索できないので、私はNSRangeを使って解析しています。面倒ですが、正規表現の練習と思って頑張りましょう。

[引用:Reading CDATA Sections parsing XML in Objective C(StackOverflow)](http://goo.gl/vCM5rT)
Mac OSのキーボード情報を取得する。アクティブなアプリでなくても取得可能。

ブラウザや、アプリがアクティブでなくてもキーボードを取得できる便利なツール！

[jnativehook](https://code.google.com/p/jnativehook/)


## 追記
これとAIをかけあわせれば、

* 普段通りPCを使っているだけで、裏側で常によく入力するキーボード操作を覚えて　→　行動をパターン化。
* サジェスト機能と連携させて、より協力なショートカットに。
* AIが気をきかせすぎてなんでも勝手に実行しすぎてしまう場合の抑制機能も必要
* ルーチンは自動化される。 → 仕事がなくなる（泣）が、クリエイティブな仕事に時間を使うｗ
想像できそうなdig情報を一覧するスクリプト

## はじめに
何らかの原因でDNS情報をもらえない時に毎回思いついたものを「dig A XXXX.domain.co.jp」とかしていたので、まとめておいて一括で探そうよ。いつも検索しているものはなんだっけとかなるし。

## コード

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

@fqdn = ARGV[0]

if @fqdn.nil? 
  print "FQDN or is empty, please write like a \n"
  print "\"ruby popular_record_search.rb sample.co.jp\"\n"
  exit 1
end

def search(fqdn)
  soa = {'soa' => [""]}
  ns  = {'ns'  => [""]}
  mx  = {'mx'  => ["", "mail.", "mx."]}
  a   = {'a'   => ["", "www.", "ftp.", "mail.", "imap.", "pop.", "smtp.", "localhost."]}
  txt = {'txt' => [""]}
  records = [soa, ns, mx, a, txt]

  records.each do |record|
    record.each do |type, hosts|
      puts ";; #{type} record"
      hosts.each do |host|
        answer = `dig #{type} #{host}#{@fqdn} +noall +answer |grep -v ^;`.sub("\n","")
        unless answer == ""
          puts answer
        end
      end
    end
  end
end
  
search(@fqdn)

exit 0
```

あまりに単純なんですが、それぞれのレコードごとに調べるホストをハッシュにしておいて、それらを配列にしてdigするっていうだけです。requireでそれ相応のものとかありそうですが、取り急ぎ感。

## 追記
指摘を頂いたので、resolv のライブラリを使った方法でちょっと書いてみた。入れ子が5段階でちょっとどうなのかなとか思うけれども。

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

require 'resolv'

@domain = ARGV[0]

if @domain.nil?
  print "DOMAIN or is empty, please write like a \n"
  print "\"ruby popular_record_search.rb sample.co.jp\"\n"
  exit 1  
end

def search(fqdn)
  resolv = Resolv::DNS.new(:nameserver =>['8.8.8.8'])

  soa = {'SOA' => [""]}
  ns  = {'NS'  => [""]}
  mx  = {'MX'  => ["", "mail.", "mx."]}
  a   = {'A'   => ["", "www.", "ftp.", "mail.", "imap.", "pop.", "smtp.", "localhost."]}
  txt = {'TXT' => [""]}
  records = [soa, ns, mx, a, txt]

  records.each do |key|
    key.each do |type, hosts|
      puts "; #{type} RECORD"
      hosts.each do |host|
        fqdn = "#{host}#{@domain}"

        case type
        when 'SOA'
          resolv.each_resource(fqdn, Resolv::DNS::Resource::IN::SOA) do |resource|
            puts "TTL is #{resource.ttl}"
            puts "#{fqdn}\tIN\t#{type}\t#{resource.mname}"
          end
        when 'NS'
          resolv.each_resource(fqdn, Resolv::DNS::Resource::IN::NS) do |resource|
            puts "#{fqdn}\tIN\t#{type}\t#{resource.name}"
          end
        when 'MX'
          resolv.each_resource(fqdn, Resolv::DNS::Resource::IN::MX) do |resource|
            puts "#{fqdn}\tIN\t#{type}\t#{resource.preference}\t#{resource.exchange}"
          end  
        when 'A'
          resolv.each_resource(fqdn, Resolv::DNS::Resource::IN::A) do |resource|
            puts "#{fqdn}\tIN\t#{type}\t#{resource.address}"
          end
        when 'TXT'
          resolv.each_resource(fqdn, Resolv::DNS::Resource::IN::TXT) do |resource|
            puts "#{fqdn}\tIN\t#{type}\t#{resource.strings}"
          end
        end
      end
    end
  end
end

search(@domain)

exit 0
```

なんとなくgoogleのDNSを仮指定しています。少し時間つかったのはresourceがどんなメソッドをもっているのかわからなかったので、.methodsで一覧見たりとか。表記は変わってしまったけど、一応名前解決はできるようになった。先の例はレコードが入っている列を抽出していただけだったけども、こっちはIP自体とかTTL自体とかをとれるので、いろいろ他の作業とかでも取り回しが良さそうでナイスです。

## 最後に
調べるホスト名で他も調べたほうが良いとか、よくあるホスト名とかしりたいです。このまま.zoneのファイルにするとかも場合によっては考えるか...です。あんまガンガン用途はなさそうですが。
メソッドの仕様をコード中にドキュメント的に記述する


[StrongTyping](https://github.com/djberg96/strongtyping)を使用することで、Railsアプリのモデルのインターフェイスなどに手軽に強い型付けを導入できる。またその結果、メソッドの仕様をコード中にドキュメント的に記述しておくことができる。

## StrongTypingのインストール

Gemfile に以下を記述して bundle install を実行。

```
gem 'strongtyping'
```

## セットアップ

強い型付けを導入したいクラスに`StrongTyping`モジュールをインクルードしておく。

```ruby
class Person
  include StrongTyping

```

## 引数が期待している型をドキュメント的に記述する

`StrongTyping`をインクルードすることで、`#expect`で引数が期待している型をチェックできるようになる。

```ruby
class Person
  include StrongTyping
  ...

  def name=(name)
    expect(name, String)
    @name = name
  end

  ...

```

こう記述することで、引数`name`に`String`オブジェクト以外が渡された場合に`ArgumentTypeError`が投げられるようになる。

```ruby
> person = Person.new
=> #<Person:0x0000010cd7a980>
> person.name=1
StrongTyping::ArgumentTypeError: Expecting String as argument 1, got Fixnum
> person.name="takkanm"
=> "takkanm"
```

複数の型が渡ってくることを許す場合には、以下のように配列で許容する型のリストを指定することができる。

```ruby
  def foo(a)
    expect(a, [Integer, String])
    ...
```

また、引数が複数ある場合には、以下のような感じで記述する。

```ruby
  def foo(a, b)
    expect(a, String, b, [String, NilClass])
    ...
```

チェックしてくれるのはもちろん、それぞれの引数に何が入ってくることを期待しているかを他の開発者に伝えるときにも便利。

## 参考

* https://github.com/djberg96/strongtyping
rake routesの結果をunite.vimで見る


Railsでルーティング確認するにはrails.vimを使っていると`:Rake routes`するとすぐ確認できて便利。
だけど、Quickfixじゃなくてuntie.vimで見たいなーと思ったので、unite outputにrake routesの結果を流し込んでみた。


```vimrc
nnoremap [unite] :<C-u>Unite<Space>
nmap f [unite]

nnoremap [unite]r :Rc<C-u>Unite output:!bin/rake\ routes -start-insert<CR>
```

uniteに`f`を当てているので、`fr`で起動。
ざざっと絞り込めて便利。


unite.vimのアクションを設定して
- Prefixのyank
- Controller#Actionのopen
とかやるともっと便利かも。
node.jsでWebサイトのスクリーンショットを保存 その2

以前、wkhtmltoimageを用いたWebサイトのスクリーンショットの保存を書いたのですが、バックエンドに[phantom.js](http://phantomjs.org/)を利用してさらにお手軽にできる方法があったのでメモ

node.jsなら[webshot](https://github.com/brenden/node-webshot)というモジュールを入れればいいだけです

```js:screenshot.js
var webshot = require('webshot');

var options = {}; // サイトを参考に色々設定
webshot('<<URL>>', options, function(err, renderStream){
	var chunks = new Array();
	renderStream.on('data', function(data){
		chunks.push(new Buffer(data));
	});
	renderStream.on('error', function(e){
		console.log(e);
	});
	renderStream.on('end', function(){
		var data = Buffer.concat(chunks);
		// この時点でdataにスクリーンショットの画像データがバイナリで入ってる
	});
});

```
例によって、レンダリングまで時間がかかるものもあるのでそこは考慮すること
メモ: Macでpxebootサーバを構築

関連: [Ubuntu16.04にてpxe boot - Qiita](http://qiita.com/tukiyo3/items/4448140b28096c7678a1)

必要なソフト
============

* dhcpd (isc-dhcp)
* tftpd (最初から入っている)
* [syslinux](https://www.kernel.org/pub/linux/utils/boot/syslinux/)から以下取得し`/private/tftproot/`直下に保存
  * gpxelinux.0
  * ldlinux.c32
  * libutil.c32
  * memdisk
  * menu.c32
* 起動させたいisoイメージ

tftpd
=====

```bash:こんなかんじで書く
default menu.c32
default clonezilla
prompt 0

MENU TITLE PXE Menu

# 途中まで起動できるが・・・
LABEL clonezilla
  KERNEL memdisk
  APPEND iso initrd=clonezilla-live-20140114-saucy-i386.iso
```

```bash:tftpd起動
$ sudo launchctl start com.apple.tftpd
```

```bash:動作確認
$ tftp localhost
tftp> get memdisk
Received 26315 bytes in 0.0 seconds
tftp> ^D
```

dhcpd
=====

```bash:インストール
$ brew install isc-dhcp
```

```bash:/usr/local/etc/dhcpd.conf
# Macの有線LANのIPを192.168.254.15に設定しておく。

filename "gpxelinux.0";
#
option subnet-mask 255.255.255.0;
option routers 192.168.254.15;
#
option domain-name-servers 192.168.254.150;

subnet 192.168.254.0 netmask 255.255.255.0 {
  range 192.168.254.20 192.168.254.30;
}

host core2quad_pc {
  hardware ethernet 00:21:70:5c:c9:de;
  fixed-address 192.168.254.31;
}
```

```bash:起動
$ sudo /usr/local/sbin/dhcpd -f -d -cf /usr/local/etc/dhcpd.conf
```

`^C`で終了。

nfsd
=====

macからは利用できたが、なぜかlinuxからは利用できなかった・・・

```bash:
$ /private/tftpboot/ -ro -network 192.168.254.0 -mask 255.255.255.0
$ sudo nfsd restart
$ showmount -e
```
tmux 1.9でもウィンドウ作成時にパスを引き継ぐ

tmuxを1.9aにアップデートしたら、ウィンドウを作成したり分割したときにパスを引き継がなくなってしまった。[ChangeLog](http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/CHANGES)を見てみると、default pathというものを廃止したとのことだった。元の挙動に戻すための設定も書いてあったので、`.tmux.conf`を以下のように修正した。

```conf:.tmux.conf
bind-key    c     new-window -c "#{pane_current_path}"
bind-key    v     split-window -h -c "#{pane_current_path}"
bind-key    C-v   split-window -h -c "#{pane_current_path}"
bind-key    s     split-window -v -c "#{pane_current_path}"
bind-key    C-s   split-window -v -c "#{pane_current_path}"
```

`new-window`や`split-window`のオプションに`-c "#{pane_current_path}"`を付けてあげるとパスを引き継ぐようになった。
Accounts.frameworkを使ってFacebookのアクセストークンとか、メールアドレスを取得する


Facebookログインができるアプリが増えてきましたね。
そんなときに、Facebookのアクセストークンをサーバーに投げてログイン処理を行ったり、メールアドレスのみ取得してログイン処理を行ったり、いろいろあると思います。
今回はその両方のデータの取得をメモします。
（Facebook SDKを使っても同じことはできますが、その場合はSafariが立ち上がったり、Facebookアプリが起動したり画面遷移するのでちょっと微妙です）

## Accounts.frameworkを使う
TwitterでシェアやFacebookでシェアなどはSocial.frameworkを使えば簡単にできますが、今回の用途ではAccounts.frameworkを使います。

```objectivec:
#import <Accounts/Accounts.h>

@property (nonatomic) ACAccountStore *accountStore;
```

FacebookのACAccountTypeを取得します。

```objectivec:
if (self.accountStore == nil) {
	self.accountStore = [ACAccountStore new];
}
	
ACAccountType *accountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];	//  Facebookを指定
```

次にユーザーにFacebookアカウント情報にアクセスしても良いか、という許可をもらいます。

```objectivec:
NSDictionary *options = @{ ACFacebookAppIdKey : YOUR_FACEBOOK_APP_ID,
						   ACFacebookAudienceKey : ACFacebookAudienceOnlyMe,
						   ACFacebookPermissionsKey : @[@"email"] };

```

* ACFacebookAppIdKey … Facebookアプリ設定のApp IDを入れます（NSString）
* ACFacebookAudienceKey … 公開範囲の設定です
	- ACFacebookAudienceEveryone … 全体
	- ACFacebookAudienceFrends … 友達のみ
	- ACFacebookAudienceOnlyMe … 非公開・自分のみ
* ACFacebookPermissionsKey … パーミッション [Permissions with Facebook Login](https://developers.facebook.com/docs/facebook-login/permissions)

```
[self.accountStore 
	requestAccessToAccountsWithType:accountType
							options:options
						completion:^(BOOL granted, NSError *error) {
							dispatch_async(dispatch_get_main_queue(), ^{
								if (granted) {
									// ユーザーがFacebookアカウントへのアクセスを許可した
									NSArray *facebookAccounts = [self.accountStore accountsWithAccountType:accountType];
									if (facebookAccounts.count > 0) {
										ACAccount *facebookAccount = [facebookAccounts lastObject];

										// メールアドレスを取得する
										NSString *email = [[facebookAccount valueForKey:@"properties"] objectForKey:@"ACUIDisplayUsername"];

										// アクセストークンを取得する
										ACAccountCredential *facebookCredential = [facebookAccount credential];
										NSString *accessToken = [facebookCredential oauthToken];

										NSLog(@"email:%@, token:%@", email, accessToken);

										//  ここでログイン処理などをする
									}
								} else {
									if([error code]== ACErrorAccountNotFound){
										//  iOSに登録されているFacebookアカウントがありません。
										NSLog(@"iOSにFacebookアカウントが登録されていません。設定→FacebookからFacebookアカウントを追加してください。");
									} else {
										// ユーザーが許可しない
										// 設定→Facebook→アカウントの使用許可するApp→YOUR_APPをオンにする必要がある
										NSLog(@"Facebookが有効になっていません。");
									}
								}
							});
						}];
```

iOSがビルドインしてくれたおかげで、結構簡単に書くことができます。

## 参考文献
[Facebook APIへのアクセス、投稿画面表示（iOS 6対応）](http://blogios.stack3.net/archives/859)
[ios - Get Facebook access token from Social.framework(iOS6) - Stack Overflow](http://stackoverflow.com/questions/13930371/get-facebook-access-token-from-social-frameworkios6)
[ios - ACAccountStore Error 6 and 8 - Stack Overflow](http://stackoverflow.com/questions/12630066/acaccountstore-error-6-and-8)
SceneKit日和（３）

もう３回目です。
前回と前々回では、低レベルなAPIを通じて、SceneKitの世界へ旅立ちました。
なので今回は高レベルAPIを使って、より大きな世界へ飛躍しようと思います。

今回のチャレンジではSceneKitとAVFoundation、そしてCoreImageテクノロジーを統合します。

続きはこちらでどうぞ
http://wowdev.jp/?p=1120
mavericks にupdateした際にHomebrewが機能しなくなったときの対処




### brew settings backup

```
brew list >  ~/list.txt
brew list | xargs brew info > ~/info.txt
```

#### uninstall homebrew

https://gist.github.com/mxcl/1173223

```
./uninstall_homebrew.sh
```

この時点あらゆるところで、 **Permission Denied** メッセージが出る。

#### chgrp

色々やったけど、これで大丈夫かな。

```
sudo chgrp -R staff /usr/local/opt
```


### setups

+ zsh
+ ruby
+ doxygen


```
brew update
```

<hr>

#### zsh

```
brew install zsh
```

※completion あとで書く

#### ruby

````
brew install openssl
brew install readline
brew install rbenv
brew install ruby-build
````


##### .zshrc

※ 下記、gcc 絡みで export CC=/usr/bin/gcc を、後で追記してみることにしました。

.zshrc

```
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export CC=/usr/bin/gcc
```

再読み込みさせます。

	source ~/.zshrc

上記をインストール済であれば、下記などを実行します。



#### doxygen

	brew install doxygen graphviz



### reference


- http://www.d-wood.com/blog/2013/06/30_4157.html
- http://momijiame.tumblr.com/post/23166110981/doxygen-graphviz
iOS 用 mruby XCode ライブラリ "MRuby.framework" を作る簡単な方法

## ios-ruby-embedded
ios-ruby-embedded というプロジェクトがある。
https://github.com/carsonmcdonald/ios-ruby-embedded
の README の通りにすると良い。

簡単にいえば、mruby を MRuby.framework として rake できるようにするプロジェクト。
submodule を使うことを想定しているが、使わなくても問題なさそう。

## include の書き方

MRuby.framework を読み込む XCode プロジェクトは次のように mruby.h やその他のヘッダファイルを include します。

```c:main.c
#include <MRuby/mruby.h>
#include <Mruby/mruby/proc.h>
```

## やったー！！！
これで iOS 上で ruby が動くぞ！！！
::class はクラスの存在チェックしない

```php
<?php
use Foo\Bar\Unko;  // 未定義のクラス

var_dump(Unko::class);
// string(12) "Foo\Bar\Unko"
```

[PHP: クラスの基礎 - Manual](http://www.php.net/manual/ja/language.oop5.basic.php#language.oop5.basic.class.class)
PHP: iTunes用RSSをSimpleXMLで出力するとき<itunes:iamge>が<image>になってしまうのはXML namespaceを定義していないから


iTunes用のRSSをSimpleXMLで出力したときに、なぜか `<itunes:iamge>` が `<image>` にならないという問題が、[suin/php-rss-writerのissue](https://github.com/suin/php-rss-writer/issues/3)として相談?があったので調べてみた。どうやら、PHPのSimpleXMLの`addChild`メソッドはネームスペースを指定しないとコロン以前(`itunes`の部分)を削り捨ててしまう挙動らしい。

正しく `itunes` の部分を出力するには、`addChild`メソッドの第三引数でネームスペースを指定するといい。

# `<itunes:iamge>`を追加したつもりが`<image>`になってしまうするコード

```php
<?php

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rss />', LIBXML_NOERROR|LIBXML_ERR_NONE|LIBXML_ERR_FATAL);

$itunesImage = $xml->addChild('itunes:image', null);
$itunesImage->addAttribute('url', 'http://example.com/example.png');

$result = $xml->asXML();

echo $result;
```

実行結果

```xml
<?xml version="1.0" encoding="UTF-8"?>
<rss><image url="http://example.com/example.png"/></rss>
```


# `<itunes:iamge>` がちゃんと出力されるコード


```php
<?php

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">', LIBXML_NOERROR|LIBXML_ERR_NONE|LIBXML_ERR_FATAL);

$itunesImage = $xml->addChild('itunes:image', null, 'http://www.itunes.com/dtds/podcast-1.0.dtd');
$itunesImage->addAttribute('url', 'http://example.com/example.png');

$result = $xml->asXML();

echo $result;

```

実行結果

```xml
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><itunes:image url="http://example.com/example.png"/></rss>
```


## ポイント

* XMLのルートノードに `xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"` 属性を定義する
* `addChild` メソッドの第三引数にネームスペースのURLを渡す。