OmniAICreator/Qiita-1.07M huggingface dataset:
iPadのモーダルビューでQuickDialogを使うとキーボードが閉じない問題を回避

設定画面などを少ない記述で作ることのできるライブラリ [QuickDialog](http://escoz.com/open-source/quickdialog) ですが、iPadのモーダルビューだとキーボードやピッカーが閉じてくれない問題が発生します（Version 0.8）。

```objc:AppDelegate.m
QRootElement *root = [[QRootElement alloc] init];

NSArray *component = @[@"A", @"B"];
QPickerElement *simplePickerEl = [[QPickerElement alloc] initWithTitle:@"Key" items:@[component] value:@"B"];
    
__weak QPickerElement *_simplePickerEl = simplePickerEl;
simplePickerEl.onValueChanged = ^(QRootElement *el){
    NSLog(@"Selected indexes: %@", [_simplePickerEl.selectedIndexes componentsJoinedByString:@","]);
};
    
QSection *simplePickerSection = [[QSection alloc] initWithTitle:@"Picker element"];
[simplePickerSection addElement:simplePickerEl];
[root addSection:simplePickerSection];

UINavigationController *navi = [QuickDialogController controllerWithNavigationForRoot:root];
self.window.rootViewController = navi;
```

これはモーダルになっていないので普通に使えます。
画面下部にピッカーが表示されて、閉じることができます。

下記は QuickDialogをモーダル表示しています。
こちらはピッカーを閉じることができません。

```objc:AppDelegate.m
UINavigationController *navi = [QuickDialogController controllerWithNavigationForRoot:root];

navi.modalPresentationStyle = UIModalPresentationFormSheet;
navi.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.window.rootViewController presentModalViewController:navi animated:YES];
```

対処法としてはこちらになります。
[≫UINavigationController resignFirstResponderでキーボードが閉じない場合の対処法](http://qiita.com/yusuga_/items/d3097956026553ef9869)

```objc:UIViewController+KeyboardDismiss.h
#import <Foundation/Foundation.h>
@interface UIViewController(KeyboardDismiss)
@end
```

```objc:UIViewController+KeyboardDismiss.m
#import "UIViewController+KeyboardDismiss.h"

@implementation UIViewController(KeyboardDismiss)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}
#pragma clang diagnostic pop
@end
```

「#pragma」を記載しているのは、余計なアラートを非表示にするためです。

それを Supporting Filesの {プロジェクト名}-Prefix.pch で import すればＯＫです。

```objc:{プロジェクト名}-Prefix.pch
#ifdef __OBJC__
    #import "UIViewController+KeyboardDismiss.h"
    #import "QuickDialog.h"
#endif
```

まだしっかりテストしていないのでどこかで不具合が発生するかもしれません。
不具合を見付けた方は教えていただけると嬉しいです。
WebKit.framework の callWebScriptMethod:withArguments: で連想配列を渡すには

OSX アプリケーション内に WebView を埋め込んだとき、その中で動作している JavaScript 環境とは WebScriptObject を介してやりとりを行う。

JavaScript の関数を呼び出すには evaluateScript: か callWebScriptMethod:withArguments: を利用する。
後者の場合、引数の配列には NSNumber, NSString, NSArray 等を渡すことができるが、NSDictionary を渡すことはできない。
ちなみにこの仕様についてはリファレンスには記載されていないが、WebScriptObject.h を見ると確認することができる。

連想配列を渡すには、WebScriptObject にすればいいようなので、次のように実装してみた。

```objc:WebScriptObject+Convenience.h
#import <WebKit/WebKit.h>

@interface WebScriptObject (Convenience)

// TODO: Method Swizzling で callWebScriptMethod: をオーバライドしたい
- (id)callMethod:(NSString*)name args:(NSArray*)args;

@end
```

```objc:WebScriptObject+Convenience.m
#import "WebScriptObject+Convenience.h"

#define TEMP_VARNAME @"__wso_temp"

@implementation WebScriptObject (Convenience)

- (id)webScriptObjectFromDictionary:(NSDictionary*)dict
{
    // NOTE: 連想配列に対する WebScriptObject の生成は evaluateWebScript: でやるしかなく,
    // 適当な変数に入れておかないと参照数が 0 になってしまう
    // 生成した連想配列は TEMP_VARNAME に一時保管する
    NSError* error = nil;
    NSData* json = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
    NSString* script = [NSString stringWithFormat:
                        TEMP_VARNAME @".push(%@);"
                        TEMP_VARNAME @"[" TEMP_VARNAME ".length - 1];",
                        [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding]];
    //NSLog(@"script=%@", script);
    return [self evaluateWebScript:script];
}

- (id)callMethod:(NSString*)name args:(NSArray*)args_
{
    [self evaluateWebScript:TEMP_VARNAME @" = [];"];
    
    // WebScriptObject は NSDictionary を連想配列に変換してくれないため, 自力で行う
    NSMutableArray* args = [NSMutableArray array];
    for (id arg in args_) {
        if ([arg isKindOfClass:[NSDictionary class]]) {
            [args addObject:[self webScriptObjectFromDictionary:arg]];
        } else {
            [args addObject:arg];
        }
    }

    id result = [self callWebScriptMethod:name withArguments:args];
    
    [self removeWebScriptKey:TEMP_VARNAME];
    
    return result;
}

@end
```

ポイントは以下のとおり。

* WebScriptObject の生成は evaluateScript: を使う。
* evaluateScript: に渡せるよう、NSJSONSerialization で NSDictionary を JSON にする。
* evaluateScript: の戻り値の参照数が 0 にならないよう、一時変数に参照を持たせておく。

JSON にしている時点で効率が悪いので、callWebScriptMethod: は使わずいっそ全て evaluateScript: でやった方がシンプルかもね...

OSX 10.9 からは JavaScriptCore.framework が使いやすくなるようなので、こんなまわりくどいことはやらなくて良くなるかもしれない。
Rails4で「You should not use the `match` method〜」のRuntimeError

```rb:config/routes.rb
Railbook::Application.routes.draw do
  match ':controller(/:action(/:id(.:format)))'
end
```

以下のようなRuntimeErrorが表示される。

>You should not use the \`match\` method in your router without specifying an HTTP method. If you want to expose your action to both GET and POST, add \`via: [:get, :post]\` option. If you want to expose your action to GET, use \`get\` in the router: Instead of: match "controller#action" Do: get "controller#action"

以下のように`routes.rb`を修正

```rb:config/routes.rb
Railbook::Application.routes.draw do
  get ':controller(/:action(/:id(.:format)))'
end
```

###参考
http://railscasts.com/episodes/415-upgrading-to-rails-4?language=ja&view=asciicast
第13回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント : http://atnd.org/events/41603
をやります。

とはいえ（これを書いている時点では）満席ですすいません。
補欠登録すると参加可能になるかもしれません。

で。

これまで同様参考問題を出しました。
「増やす減らす二倍する」という名前で、
http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思います。
とはいえ、これよりは若干簡単にすると思います。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますのでできればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
Mongoid で devise を使う

Gemfile を修正

    gem 'devise'
    gem 'mongoid'
    # rails4 を使う場合は以下
    # gem 'mongoid',  git: 'https://github.com/mongoid/mongoid.git'

この状態で rails g devise:install を実行すると、Devise は mongoid を使うようになっている。

あとから mongoid を追加した場合は、config/initializers/devise.rb を修正して、mongoid を使うようにする必要がある。

```rb:
    #require 'devise/orm/active_record'
    require 'devise/orm/mongoid'
```
フレームバッファをテクスチャへ取り込む方法

```cpp:
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, width, height, 0);
```

とかするだけなんだけど、 **その前にテクスチャのパラメタを設定しておかないと動かない** 。既にあるテクスチャへ取り込む場合はglCopyTexSubImage2Dを使う。テクスチャメモリを確保する必要がない分だけ速いし。ちなみにサイズが2冪である必要はOpenGLの版依存だけどイマドキの版では必要なさそう。遅いらしいけど。
最低限のフラグメントシェーダ

```glsl:
uniform sampler2D buffer;
void main(void){
	vec4 dc = gl_TexCoord[0];
	gl_FragColor = texture2DProj(buffer, dc);
}
```

これもテクスチャだけを使う場合。頂点シェーダで色を設定しててgl_FrontColorに値が入っている場合はtexture2D(Proj)で取り出した値にかけるのが簡単。色のFrontとBackてのはポリゴンの表裏。

色をフラグメントシェーダで作るには頂点シェーダから法線情報を貰ったりパラメタとして照明情報を取る必要がある。具体的なところはそのうち調べるかもしれないけど今の所は必要ないので知らね。例はいっぱい転がってるのでそっちを調べてくれ。

それとテクスチャの変数名がbufferなのはフレームバッファを取り込んだものだからであって深い意味はない。
頂点シェーダで作る必要があるもの

というか最低限の頂点シェーダのコード

```glsl:
void main(void){
	gl_Position = ftransform();
	gl_TexCoord[0] = gl_MultiTexCoord0;
}
```

これはテクスチャだけを使う場合。色だけの例はその辺にいっぱい転がってるが、反射とかの色を使いたければgl_FrontColorも設定する必要がある。その辺はgl_FrontMaterialとかその型のgl_MaterialParametersを調べるとわかる。

あと、gl_LightProducts型のgl_FrontLightProductsとかいう予めmaterialとlightを掛けておいてくれてる便利変数があるのでこれにそれぞれ方向によるレートをかけて(diffuseなら法線と光線の向きとの内積)、最後に全部足してやれば色を作れる。
Sublime TextのAPI、EventListenerクラスのon_query_contextについてのメモ

Sublime Textのプラグインを作るとき、キーバインド設定用ファイルで下記のような設定を可能にするEventLisitenerクラスのon_query_contextの書き方について不明な点が多かったので覚書を残します。
ただあまり使いこなしてるわけではないのでおおむね適当です。

```JSON:
{ "keys": ["ctrl+XXX"], "command": "hoge",  
　　　"context":[　
　　　　　　{ "key": "fuga", "operator": "equal", "operand": true },
　　　]
}
```

　


#書き方

```py:
class HogeFugaHoge(sublime_plugin.EventListener):

	def on_query_context(self, view, key, operator, operand, match_all) :

		if key == "fuga":
			if operator == sublime.OP_EQUAL:

				if Foo :
					return True
```

基本的な書き方は上記の通り。
TextCommandと違ってクラス名はどうでもいいっぽいです。

重要なのは`if key==･･･`あたりの部分と`if Foo:`以下の部分。
大雑把に言うと、`if key==･･･`ではキーバインドの設定に関する記述、`if Foo:`以下の部分はそのキーバインドを使用可能にするスイッチとなるような条件を記述します。
最終的に`return`を使って`True`や`False`を返せば、キーバインドの書き方にもよりますが、スイッチが入ったり、入らなかったりするという感じです。

上記の例ではキーバインドのほうで`operator`で`equal`、`operand`で`true`と記述してあるので、`Foo`の条件を満たし`True`を返すことでキーバインドが使用可能となります。もし`if Foo:`を設定せず常に`True`が返るようにすれば、常にスイッチオンの状態になるはず（たぶん）。

`key`はコードとキーバインド設定で使用したものが共通であればどういう名前でもいいです。
`operator`はいろいろと設定できるようなのですがよくわかってません。この例が一番単純な形かな･･･？（´・ω・｀）
また`Foo`に書く条件は何でもいいです。
例えば僕の場合ですと、他のコマンドで作成したリストをグローバル変数を用いて参照して、何か入ってれば'True'を、空であれば'False'を返すというような記述にしました。

以上です。

　
どこにも書き方が載ってなかったので、動作確認しながら書き方を探るのは結構手間がかかりました･･･_(´ㅅ`_)⌒)_
VagrantをMacで使ってみる


Vagrantが便利そうなので、使ってみましたメモ

## インストール

*事前にVirtualBoxはインストールしておくこと

まずは下記サイトからvagrantをダウンロードする
http://www.vagrantup.com/

この記事を書いている時点で最新のv1.2.7（Vagrant-1.2.7.dmg）をダウンロード
ダウンロードが終わったら、dmgをクリックしていつものようにインストール

インストールが完了したらTerminalを開いて

```
$ vagrant -v
Vagrant version 1.2.7
```
となればインストールは完了

## boxファイルをダウンロード

vagrantでサーバーを立てるには、boxファイルというのが必要になる

下記サイトにたくさんboxがホスティングされているので、欲しいもののURLをコピーしてくる
http://www.vagrantbox.es/

今回は
CentOS 6.4 x86_64 Minimal (VirtualBox Guest Additions 4.2.12, Chef 11.4.4, Puppet 3.1.1)
にします。

#### boxを追加

```
$ vagrant box add centos_64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
```
URLを指定すると毎回ダウンロードされるので、事前にダウンロードしておいて、そのファイルパスを指定しても良い

## サーバーを起動

```
$ mkdir centos_64
$ cd centos_64
$ vagrant init centos_64
$ vagrant up
```
これでサーバーが起動します

```
$ vagrant ssh
```

とすると、サーバーに接続できます

## その他コマンド

#### 仮想マシンをシャットダウンする

```
$ vagrant halt
```


#### 仮想マシンをサスペンド

```
$ vagrant suspend
```

#### 仮想マシンをレジューム（サスペンドを復帰）

```
$ vagrant resume
```


#### 仮想マシンを削除する

```
$ vagrant destroy
```

#### boxのリストを表示

```
$ vagrant box list
centos_64    (virtualbox)
```

#### boxを削除

```
$ vagrant box remove centos_64
```

#### box付きでvagrant init

```
vagrant init centos_64
```

#### 仮想マシンをエクスポート（box化）

```
vagrant package
```

※VMWareFusionのプロバイダーはサポートされていないので、
VirtualBoxのプロバイダーの場合のみ可能

## VMWare版も使ってみる

VMWare（有料）でも使用できるそうなので、やってみました。


#### VMWare Fusion Providerを購入する

VMWareで使用するには、VMWare Fusion Providerの
ライセンスを購入する必要があります（$79）

http://www.vagrantup.com/vmware

にアクセスして、購入しましょう。
購入してしばらくするとlicense.licというファイルをダウンロードできる
ダウンロードしてどっかにおいておきます

#### VMWare Fusion Providerのインストール＆ライセンス認証

http://docs.vagrantup.com/v2/vmware/installation.html

を参考に

```
$ vagrant plugin install vagrant-vmware-fusion
$ vagrant plugin license vagrant-vmware-fusion license.lic
```
*license.licでダウンロードしたライセンスファイルを指定してください

とすると、VMWare Fusion Providerが使用できるようになります

#### VMWareのboxをダウンロード＆起動

ここからはあまり変わらないですが、一応

再度下記サイトから、VMWare用のboxのURLをコピーします
http://www.vagrantbox.es/

CentOS 6.4 x86_64 Minimal VMware Fusion (VMware Tools, Chef 11.4.0, Puppet 3.1.1)
にしました

```
$ vagrant box add centos_64_vmware https://dl.dropbox.com/u/5721940/vagrant-boxes/vagrant-centos-6.4-x86_64-vmware_fusion.box
```

## サーバーを起動

providerにvmware_fusionを指定しましょう

```
$ mkdir centos_64_vmware
$ cd centos_64_vmware
$ vagrant init centos_64_vmware
$ vagrant up --provider=vmware_fusion
```

```
$ vagrant ssh
```

これで完了です
[Ansible] 開発中のバージョン1.3をgithubからインストールする

https://twitter.com/r_rudi/status/368727202587631616 という話を聞いたので開発中のバージョン1.3をgithubからインストールしてみます。

公式ドキュメントのMake Installの手順でインストールできました。

```shell-session:
$ git clone git://github.com/ansible/ansible.git
$ cd ./ansible
$ sudo make install
```

2014-05-24追記 ソースからのインストール手順は現在は変わっていました。
[Running From Source](http://docs.ansible.com/intro_installation.html#running-from-source)を参照してください。
iOSアプリをビルドしてTestFlightに送り込むMakefile

[iPhoneアプリのテスト用ビルドをTestFlightに簡単に登録する](http://hakobe932.hatenablog.com/entry/2012/01/21/142726)の記事を参考にして、iOSアプリをTestFlightに送り込むMakefileを書きました。

オリジナルのblog記事との違い：
* provisioning profileは1つしか使ってないのでデフォルトで
* uploadしても自動配布はしない。
* dSYMも一緒にuploadする
  * dSYMはbuild時に生成されるので、build時の成果物がout/の下に行くように変更

```mf:Makefile
# http://hakobe932.hatenablog.com/entry/2012/01/21/142726#fn1
             
.PHONY: all build archive testflight 
PROJECT ?= PAMEventBoard.xcworkspace
SCHEME ?= PAMEventBoard
SIGN ?= iOS Developer
DSYM = $(PWD)/out/build/PAMEventBoard.app.dSYM

all: archive

out:
    mkdir -p $@

build: out
    xcodebuild -workspace '$(PROJECT)' -scheme '$(SCHEME)' -sdk iphoneos7.0 install DSTROOT=out CONFIGURATION_BUILD_DIR=$(PWD)/out/build

archive: build
    xcrun -sdk iphoneos7.0 PackageApplication 'out/Applications/$(SCHEME).app' -o $(PWD)/out/$(SCHEME).ipa'

zip-dsym: build
    zip -r $(PWD)/out/$(SCHEME).dSYM.zip $(DSYM)

testflight: archive zip-dsym
    curl 'http://testflightapp.com/api/builds.json' \
      -F 'file=@$(PWD)/out/$(SCHEME).ipa' \
      -F 'dsym=@$(PWD)/out/$(SCHEME).dSYM.zip' \
      -F 'api_token=<YOUR API TOKEN>' \
      -F 'team_token=<YOUR TERM TOKEN>' \
      -F 'notes=This build was uploaded via the upload API' \
      -v

clean:
    rm -rf ./out
```
eclipseで補完が出なくなった

eclipseでvim使いたくてバージョンあげたら補完が効かなくなった・・・
補完効かないならターミナルでやるのと大差ないなーって思って色々調べてみたら
方法はやっぱりありました！

```
cd workspace
ack content_assist_disabled_computers
.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs1
```

上記のファイルが引っ掛かりました。（ackはコマンドですがインストールしてないと使えません）
上記ファイルをviで開いて「content_assist_disabled_computers」が書いてある行を#でコメントアウト

そして、eclipseの環境設定から
Java → Editor → ContentAssist → Advancedより
Java Proposalsにチェックを入れる。

![スクリーンショット 2013-08-17 22.06.04.png](https://qiita-image-store.s3.amazonaws.com/0/10010/03548fa8-e581-baa6-96ff-1ce0d8685d89.png)

eclipseを再起動して完成
PHPでfputcsv使いたいけど一時ファイル作りたくない時のアレ

　毎回良く忘れて、毎回ググる。

　要は内部バッファ取ってから標準出力に吐き出してって感じ。

~~~~php:
//generate csv
ob_start();

foreach ($csv as $fields)
{
    fputcsv(fopen('php://output', 'w'), $fields);
}
$str = ob_get_clean();
$str = mb_convert_encoding($str,"sjis","utf8");
return $str;
~~~~

まぁCSVと来たらExcelなので基本はSJISエンコード。ob_周りの使い方もいっつも忘れるんよねぇ。消すとか返すとかいろいろややこしくて…

追記(08/19):色々とツッコミを頂きました。なんでもSJISってのはまずいですね…コメント欄参照してください。
シンプルなトグル構造


ちょっとびっくりしたけどシンプルなトグル構造

~~~~php:
function toggle($value){
    return 1-$value;
}
~~~~

入力0に対して1が、1に対して0が返ってくる。
bool値でほしければキャストすればOK

こういうちょっとしたアレをいろいろ知ってる人は尊敬する。やっぱ経験の差か…
Ansible CentOS5で出るImportError: No module named simplejson の対処

CentOS5 で チュートリアルを適当に進めようとすると多分、以下のエラーでハマる
https://github.com/ansible/ansible/issues/1529

ansible all -m ping

```json:
FAILED >> {
"failed": true,
"msg": "Traceback (most recent call last):\r\n\n File \"/home/adminn/.ansible/tmp/ansible-1352204366.62-260359853897483/ping\", line 63, in ?\r\n\n import simplejson as json\r\n\nImportError: No module named simplejson\r\n",
"parsed": false
}
```

ansibleの各種モジュールの実行にはpython-simplejsonが必要なようである。
ansibleを使うために各サーバーにpython-simplejsonを入れて手動で回る必要があるのかという
そんなことはない。
実はrawモジュールはsimplejsonが不要なようなので、それを使うとよい。

```bash:
ansible  all  -i production -m raw -a "yum install -y python-simplejson"
```
最初にこれを実行すればあとは普通にほとんどのモジュールが利用出来る。
ansibleでansibleをいれるplaybookを作る

https://github.com/masahide/ansible-ansible
ansibleでansibleを入れるためのplaybookを作った。
踏み台サーバー等に入れるときに使うつもり。

```yaml:roles/ansible/tasks/main.yml
- name: install python (CentOS 6)
  yum: name={{item}} enablerepo=epel state=installed
  with_items:
    - PyYAML
    - python-paramiko
    - python-jinja2
  when: ansible_os_family == 'RedHat' and ansible_distribution_version.split('.')[0]|int == 6
  tags: python

- name: install python26 (CentOS 5)
  yum: name={{item}} enablerepo=epel state=installed
  with_items:
    - python26
    - python26-PyYAML
    - python26-paramiko
    - python26-jinja2
  when: ansible_os_family == 'RedHat' and ansible_distribution_version.split('.')[0]|int == 5
  tags: python
    
- name: git clone ansible 
  git: repo=git://github.com/ansible/ansible.git
       dest={{ ansible_cache_dir }}/ansible
       version=v1.3.1
  register: git_result

- name: install ansible (CentOS 6)
  shell: |
    make install
    chdir={{ ansible_cache_dir }}/ansible creates=/usr/bin/ansible
  when: git_result.changed and ansible_os_family == 'RedHat' and ansible_distribution_version.split('.')[0]|int == 6
  tags: ansible

- name: install ansible (CentOS 5)
  shell: |
    sed -i 's/^PYTHON=.*/PYTHON=python26/' Makefile  &&
    make install
    chdir={{ ansible_cache_dir }}/ansible creates=/usr/bin/ansible
  when: git_result.changed and ansible_os_family == 'RedHat' and ansible_distribution_version.split('.')[0]|int == 5
  tags: ansible
```
HomebrewをMac OS X Mountain Lionにインストールする


Rubyが入っていることを確認する。多分デフォルトで入っています。

```
noguchiwataru-no-MacBook-Air:~ noguchiwataru$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
```

homebrewをインストール。

```
noguchiwataru-no-MacBook-Air:~ noguchiwataru$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
/usr/local/share/man/man1/brew.1

Press ENTER to continue or any other key to abort
==> /usr/bin/sudo /bin/mkdir /usr/local

WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

To proceed, enter your password, or type Ctrl-C to abort.

Password:
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local
==> Downloading and Installing Homebrew...
Warning: Install the "Command Line Tools for Xcode": http://connect.apple.com
==> Installation successful!
You should run `brew doctor' *before* you install anything.
Now type: brew help
```

警告が出て、homebrewでインストールする前に `brew doctor` しなさいと言われます。

```
noguchiwataru-no-MacBook-Air:~ noguchiwataru$ brew doctor
You must: brew install git
Warning: An outdated version of Git was detected in your PATH.
Git 1.7.10 or newer is required to perform checkouts over HTTPS from GitHub.
Please upgrade: brew upgrade git
You must: brew install git

Warning: No developer tools installed
You should install the Command Line Tools:
  https://developer.apple.com/downloads/
noguchiwataru-no-MacBook-Air:~ noguchiwataru$ 
```

ここで指摘されているのは

- Gitのバージョンが古い
- Xcodeのコマンドラインツールが入っていない

ということです。

## Command Line Toolsのインストール

その前に **Xcodeを入れた気がするのですが** 、失念しました。

https://developer.apple.com/downloads/

にアクセスしてログイン。
Apple IDがない場合は作成します。
けっこう面倒です。

`xcode` と検索して出てきた以下の画像にあるzipをダウンロードして、指示に従ってインストールします。

![xcode_command_line.png](https://qiita-image-store.s3.amazonaws.com/0/8511/c7b54421-2bf1-21ec-ab82-8ca67874a61e.png "xcode_command_line.png")

これでCommand Line Toolsは入ったので端末を立ち上げ直して

```
noguchiwataru-no-MacBook-Air:~ noguchiwataru$ brew doctor
Your system is ready to brew.
```

となればOKです。

## 最新のgitをインストール

Macにバンドルされてるバージョンのgitのバージョンが古いので、日本語ファイル名の扱いに問題が生じます。
この段階でバージョンアップしておきます。
そもそもこの段階で `which git` にヒットしないので、git自体がインストールされているかどうか怪しいのですが・・・。

```
brew install git
```

このままだとhomebrewでインストールされたバイナリが読み込まれないので、

```bash:~/.bash_profile
export PATH="/usr/local/bin:$PATH"
```

な感じに設定して `source ~/.bash_profile` するか端末を立ち上げ直します。

## 参考サイト

- [Homebrew — MacPorts driving you to drink? Try Homebrew!](http://brew.sh/)
- [homebrew - How to properly update git on mac? - Ask Different](http://apple.stackexchange.com/questions/93002/how-to-properly-update-git-on-mac)
[Mac] zsh のgitコマンド等での補完を強力にする 



## 何が嬉しい?

git コマンドで言うと

- git [タブ・キー] って押すと補完候補がでるよ!
- git config [タブ・キー]押しても候補がでるよ!
- もちろん補完もする


##  zsh-completions をインストール

homebrewの場合

```
brew install zsh-completions
```

.zshrc に以下を追加

```
fpath=(/usr/local/share/zsh-completions $fpath)
```

zcompdump を強制リビルド

```
rm -f ~/.zcompdump; compinit
```

"zsh compinit: insecure directories"というwarningが出たら

```
chmod go-w /usr/local/share
```

## ユーザ作成の補完を設定

zsh-users の補完を入れる?

上記の brew install zsh-completions で入っているらしい!

以下のコマンドとかやらなくていいよ!

```
git clone https://github.com/zsh-users/zsh-completions.git
```

理由は、以下から(英語)
<a href="https://github.com/zsh-users/zsh-completions">zsh-users/zsh-completions</a>

## 参考

日本の場合以下より!

<a href="http://d.hatena.ne.jp/guyon/20120116/1326725427">zshの補完をさらに強力にするzsh-completionsの設定 - Guyon Diary</a>
Emacsで句読点を全角カンマ、全角ピリオドに統一するマイナーモード


https://gist.github.com/hayamiz/6255793

入力メソッドに合わせて色々といじるのが面倒になってきたので、Emacsの文字入力コマンドにフックしてユーザが入力した句読点「、」「。」は全部置き換えるようにするマイナーモード `punch-mode` を書いた。
現状では「、」→「，」、「。」→「．」の変換で決め打ち。

誰もが再発明していそうな機能なので、もっといいマイナーモードがあったら教えて下さい。

<script src="https://gist.github.com/hayamiz/6255793.js"></script>
git bisectとApache Bench使って性能を下げる原因になったコミットを探す

最近何かレスポンス遅くね？って言う時、

```rb:ab_bisect.rb
require 'systemu'
 
systemu 'bundle'
systemu 'bundle exec rails s -d'
sleep 5
 
# abコマンドでベンチマーク
status, stdout, stderr = systemu "ab -n 10 -c 10 'http://0.0.0.0:3000/'"
Process.kill 'KILL', `cat tmp/pids/server.pid`.to_i
sleep 3
 
# Requests per secondを抽出
stdout =~ /Requests per second:\s+([0-9\.]+)/
request_per_second = $1.to_f
puts "request_per_second: #{request_per_second}"
 
if request_per_second < 1.0 # ここの条件は環境によって調整する
  puts 'bad'
  exit 1
end
 
puts 'good'
exit 0
```

こんな感じのスクリプトを書いて、`git bisect`を実行

```shell-session:
$ git bisect start HEAD [正常だったときのコミットハッシュ値]
$ git bisect run ruby ab_bisect.rb
```

あとはコーヒーを飲みながら待つだけ
よりよいView helperであるActiveDecoratorの使い方

ActiveDecoratorを導入したきっかけ

- Helperにグローバル関数っぽいメソッドを追加するのが嫌だ
- Modelに表示に関するメソッドを増やすのが嫌だ

#ActiveDecoratorのGemをいれる

`gem 'active_decorator'`

amatsuda/active_decorator
https://github.com/amatsuda/active_decorator

# Decoratorファイルを作る

普通に作ってもいいですがgeneratorが用意されています。
`rails g decorator user`

`/app/decorator/user.rb`というファイルが作られます。このモジュールは自動でUserモデルにMix-inされます。（しかもViewのコンテキストの時だけ！）

# 例

公式にもあるサンプルです。姓と名を繋げてフルネームにするとか、linkのメソッドを追加したりしていますね。

```
# app/decorators/user_decorator.rb
module UserDecorator
  def full_name
    "#{first_name} #{last_name}"
  end

  def link
    link_to full_name, website
  end
end
```
git-rebaseのexecを使ってstashした内容を履歴に埋め込む

あなたはgitリポジトリでコードを書いています。

で、コミットをするとき「このコードはさっきのコミットと一緒にした方がいいな」と思った場合どうしますか？

```bash:
% git commit -a --amend -C HEAD
```

ですね？（HEADのコミットメッセージから変更がない場合）

では「このコードは2個前のコミットと一緒にした方がいいな」と思った場合どうしますか？一旦コミットして、あとから `git-rebase` しますか？

手っ取り早く済ませるには `git-stash` を使うといいでしょう。

```bash:
% git stash
% git rebase -i HEAD~2
```

するとこんな感じの画面が表示されます。

```bash:git-rebase後に表示される画面
pick 45acd16 このコミットにいれたい
pick 45f6df0 一つ前のコミット
```

これを

```bash:execを挿入
pick 45acd16 このコミットにいれたい
exec git stash pop; git commit -a --amend -C HEAD
pick 45f6df0 一つ前のコミット
```

こんな感じに変更してエディタを閉じれば完了します。 この `exec` は後続する文字列をシェルで実行しろ、という意味です。なのでやってることは実質的に

```bash:git-rebase後に表示される画面
edit 45acd16 このコミットにいれたい
pick 45f6df0 一つ前のコミット
```

して `edit` 箇所で止まってから

```bash
% git stash pop; git commit -a --amend -C HEAD
```

するのと同じです。ちなみに今回の場合 `exec` 以降を `;` で区切って二行にすると諸事情により意図した通りに動かないので注意が必要です。

```bash:これだとダメ
pick 45acd16 このコミットにいれたい
exec git stash pop
exec git commit -a --amend -C HEAD
pick 45f6df0 一つ前のコミット
```
Xcode Developer Preview 入れてて brew doctor に Xcode とコンパイラのバージョンが合ってないと言われたら


```
$ brew doctor
Warning: Your compilers are different from the standard versions for your Xcode.
If you have Xcode 4.3 or newer, you should install the Command Line Tools for
Xcode from within Xcode's Download preferences.
Otherwise, you should reinstall Xcode.
```

いやいや Command Line Tools 入れてるし、と思ったら Xcode Developer Preview があやしい。

```
$ xcode-select --print-path
/Applications/Xcode5-DP.app/Contents/Developer
```

やはり！コマンドラインで Developer Preview の方を参照するようになっていたのでした。

普通の Xcode を参照するにようします。

```
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
$ brew doctor
Your system is ready to brew.
```

Developer Preview の方でいきたい人は、そっちの Command Line Tools を入れるといいのでしょうが、それでいろんなもののビルドがうまくいくかは謎ですね。
ansible でzabbixのplaybookを作る

https://github.com/masahide/ansible-zabbix 
サーバーのインストールはmysqlが入っている前提で書いたけど、こんな感じ
MySQL-pythonを入れているのは、 ansible のmysql_userモジュールなどで必要なため


```yaml:ansible-zabbix/roles/server/tasks/main.yml
- name: get zabbix-repos rpm RHEL5
  get_url: dest={{ ansible_cache_dir }}/zabbix-release-2.0-1.noarch.rpm  url=http://repo.zabbix.com/zabbix/2.0/rhel/5/x86_64/zabbix-release-2.0-1.el5.noarch.rpm
  when: ansible_os_family == 'RedHat' and ansible_distribution_version.split('.')[0]|int == 5
  tags: zabbix-common

- name: get zabbix-repo rpm RHEL6
  get_url: dest={{ ansible_cache_dir }}/zabbix-release-2.0-1.noarch.rpm  url=http://repo.zabbix.com/zabbix/2.0/rhel/6/x86_64/zabbix-release-2.0-1.el6.noarch.rpm
  when: ansible_os_family == 'RedHat' and ansible_distribution_version.split('.')[0]|int == 6
  tags: zabbix-common

- name: get http://repo.zabbix.com/RPM-GPG-KEY-ZABBIX
  get_url: dest={{ ansible_cache_dir }}/RPM-GPG-KEY-ZABBIX  url=http://repo.zabbix.com/RPM-GPG-KEY-ZABBIX
  when: ansible_os_family == 'RedHat' and ansible_distribution_version.split('.')[0]|int == 6
  tags: zabbix-common
  register: get_key_result

- name: import ZABBIX key
  command: /bin/rpm --import {{ ansible_cache_dir }}/RPM-GPG-KEY-ZABBIX
  when: get_key_result.changed
  tags: zabbix-common

- name: install zabbix-repos 
  yum: pkg={{ ansible_cache_dir }}/zabbix-release-2.0-1.noarch.rpm state=installed disable_gpg_check=yes
  tags: zabbix-common

- name: install zabbix-server
  yum: name={{item}} enablerepo=epel state=installed
  with_items:
    - zabbix-server-mysql 
    - zabbix-web-mysql 
    - zabbix-web-japanese 
    - zabbix-get
    - MySQL-python
  tags: zabbix-server

- name: add zabbix dbuser
  mysql_user: login_host=localhost login_user={{ dbroot }} login_password={{ dbpass }} name=zabbix password={{ zabbix_db_pass }} priv=zabbix.*:ALL 
  tags: zabbix-server

- name: add database
  mysql_db:   login_host=localhost login_user={{ dbroot }} login_password={{ dbpass }} name=zabbix encoding=utf8
  tags: zabbix-server

- name: check tables 
  shell: mysql -u{{ dbroot }} -p{{ dbpass }} zabbix -e"show tables"
  register: show_tables
  tags: zabbix-server

- name: create tables
  shell: |
    mysql -u{{ dbroot }} -p{{ dbpass }} zabbix < /usr/share/doc/zabbix-server-mysql-2.0.?/schema.sql &&
    mysql -u{{ dbroot }} -p{{ dbpass }} zabbix < /usr/share/doc/zabbix-server-mysql-2.0.?/images.sql &&
    mysql -u{{ dbroot }} -p{{ dbpass }} zabbix < /usr/share/doc/zabbix-server-mysql-2.0.?/data.sql 
  when: show_tables.stdout.find("user_history") == -1
  tags: zabbix-server

- name: start zabbix-server 
  service: name=zabbix-server state=started enabled=yes


- name: set DBPassword 
  lineinfile: dest=/etc/zabbix/zabbix_server.conf regexp="^DBPassword=" insertafter="^# DBPassword=" line=DBPassword={{ zabbix_db_pass }}
  tags: zabbix-server
```
Booのusing


C#のusing（importみたいなのじゃなくて、Streamを勝手に閉じてくれるほう）のように、
Booでもusingみたいなものはないかと探していたら、普通に、usingマクロが定義されているようです。
（Booのマクロは構文を追加できる感じで面白そうなんだけど、
情報が少なすぎるので手がだせない…orz）

使い方は以下。

```boo:Boo
import System.IO

using expected = FileStream(filename, FileMode.Open):
    // 処理
```

C#と同じ感じで使えて便利。
Hash Rocketを1.9記法に置換するelisp

Rubyの古いHash記法 ```{ :foo => 'bar' }``` を1.9以降の記法 ```{ foo: 'bar' }``` に置換するelispです。

```el:
(defun ruby-anti-hash-rocket ()
  (interactive)
  (beginning-of-line)
  (setq current-line (count-lines (point-min) (point)))
  (setq replaced (replace-regexp-in-string ":\\([a-z0-9_]+\\)\s*=>" "\\1:" (buffer-string)))
  (erase-buffer)
  (insert replaced)
  (goto-line (+ 1 current-line))
  (beginning-of-line)
  )
```
ある名前の heroku アプリが作成可能かどうか調べる

```bash:can-create-heroku-app-with-the-name-of
#!/bin/bash

curl -I $1.herokuapp.com 2> /dev/null | grep 'HTTP/1.1 404' > /dev/null
```

## 使い方

```bash
if ./can-create-heroku-app-with-the-name-of kaosf-env-var
then
  echo 'ok'
else
  echo 'already exist!'
fi
```

出力: `already exist!`

確かにこの名前のアプリは存在します． http://kaosf-env-var.herokuapp.com

```bash
if ./can-create-heroku-app-with-the-name-of zettaisonzaisinaitoomou
then
  echo 'ok'
else
  echo 'already exist!'
fi
```

出力: `ok`

現時点ではこの名前のアプリは存在しませんね． http://zettaisonzaisinaitoomou.herokuapp.com

誰か意地悪な人が作っちゃったらこのサンプルは結果が変わります＞＜　ご了承下さい．

Heroku のアプリ作成を動的にやらないといけないときにお使い下さい．
*nix で cd での 移動をジャンプで効率化! z を 使おう!


# ナニコレ?

cd での移動ディレクトリを履歴保存して、ジャンプできて移動の効率化!

- autojump-zsh が 要Python (今回は触れない)
- z.sh がシェルスクリプト(?)
 注意) zsh ではなく、 z.sh です。

<a href="http://blog.glidenote.com/blog/2012/02/29/autojump-zsh/">zsh使いなら効率改善のため知っておきたいAUTOJUMP - Glide Note - グライドノート</a>

## インストール

```
% brew install z
```

## 設定

.bashrc or .zshrc に以下を設定

```
  . `brew --prefix`/etc/profile.d/z.sh
```

z が押しにくいので j に変えている方もいるようです。

## 使い方

- コマンドプロンプトで z の後に行きたいディレクトリ名の頭だけ入れてタブキーを押す
- もう一度タブキーを押すと、ディレクトリの候補のリストが出る



## forkバージョン

knu/z
https://github.com/knu/z


## 参考


- <a href="http://d.hatena.ne.jp/sugyan/20130319/1363689394">z.shを使ってみる - すぎゃーんメモ</a>
- <a href="http://d.hatena.ne.jp/naoya/20130108/1357630895">近頃の開発環境 : Mosh、z、tmux、Emacs、Perl について - naoyaのはてなダイアリー</a>
blogの更新を監視して結果をtwitterに投げたり、interviewsの回答を催促したり


はい。
twiiterでの活動・発言とblog更新が連動して無い方をこっそりと更新を見逃さないようという目的で

```python:kanshi.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import urllib2
import lxml.html
from urllib import urlencode
from oauth2 import Client, Consumer, Token
import oat
#from prettyprint import pp, pp_str
#import re


blog = 'http://hoge.com'
# IE8のフリをする
user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)'
req = urllib2.Request(blog, None, {'User-Agent': user_agent})
res = urllib2.urlopen(req)
#対象サイトのaタグ要素を取り出す
html = lxml.html.fromstring(res.read())
title = html.xpath('//a')[1].text.encode('utf-8')

#サイトの構成によって最新記事の表示位置が異なるのでチェック用
#    for i in title:
#        print i.text
# 

read = open('/xxxx/xxx.txt')
log = read.read()
read.close

if title != log:
    twit = "@hoge 何か更新があったようです。" + title
    oat.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': twit}))
    f = open('/xxxx/xxx.txt', 'w')
    f.write(title)
    f.close
else:
    pass
```

はい。
まぁ、わざわざこんなのよりも更新チェックするアプリとか世にあふれていると思うんですがアレでアレ。
しかも以前にinterviewsの回答状況監視のを大分使い回しになりました。
更新監視の対象が増えたらsqlite3とかでログを残すようにしたほうがいいのかな。
かなり大雑把なのでアレです。

###インタビューズ
インタビューズの回答をtwitterで催促するbot

```python:saisoku.py
#!/usr/bin/python
# -*- coding:UTF-8 -*-

import urllib2
import lxml.html
import sys
import string
from urllib import urlencode
from oauth2 import Client, Consumer, Token


consumer_key = "xxxx"
consumer_secret = "xxxxxx"
user_key = "xxx-xxxx"
user_secret = "xxxxx"
client = Client(Consumer(consumer_key,consumer_secret), Token(user_key,user_secret))

# urlを指定する
url = 'http://theinterviews.jp/催促したいユーザー'
# IE8のフリをする
user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)'

req = urllib2.Request(url, None, {'User-Agent':user_agent})
res = urllib2.urlopen(req)

html = lxml.html.fromstring(res.read().decode('utf-8'))
check = html.text_content().count(u'回答率: 100.00%')


twit =  "@hoge どうやら回答率が100%ではないようです。いますぐ回答しに行きましょう！！ " 

if check == 0:
    client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status':twit}))
else:
    pass

```

html取得に関してはこちらから情報を頂きました。有難うございます。
[http://d.hatena.ne.jp/stog/20100607/1275926301](http://d.hatena.ne.jp/stog/20100607/1275926301)

注
私が書いた部分はまだまだ動けばいいんだよ状態です。
メイン？のユーザーとメンバーとで"回答率"と":"の間に半角スペースのアリナシの違いをついて非常に簡易に回答率の状況を判定してます。
回答率100%未満の際に催促だけして100%でも褒めたりすることはしません。
cronでぶん回すなどの話は省略になります。
[PHP] composer と spl_autoload の設定


前提: composer と spl_autoload を理解している


## どのように指定して、自動でファイルを読み込むか?

ファイルの置き場所: /User/hogeo/my_app/composer.json
composer.json の中に以下の設定がある場合

```json
"autoload": {
    "psr-0": {"AppName": "src/"}
}
```

/User/hogeo/my_app/src/AppName/ 以下がnamespace 

```php
namespace AppName\Controller;

class IndexController 
{
}
```

上記のファイル場合、以下にあること

/User/hogeo/my_app/src/AppName/Controller/IndexController.php


## 注意点

composer.json を変更したらアップデートしよう

```
php composer.phar update
```

上記を行うと以下のファイルが更新される
vendor/composer/autoload_namespaces.php
上記ファイルを見ると、どこを autoload するかがわかる

```
<?php

// autoload_namespaces.php generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Twig_' => array($vendorDir . '/twig/twig/lib'),
    'AppName' => array($baseDir . '/src'),
);
```

## その他の autoload 方法

以下のように読み込むこともできるらしい

```php
$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
```

## 何が登録されているか?の確認方法

```php
$autoload_list_array = spl_autoload_functions();
print_r($autoload_list_array);
```

## バックスペース問題

app/Model/User.php に以下のネームスペースがあると

```php
namespace AppName;
```

spl_autoload_register(__DIR__ . 'app//Model/'*.php');
すると

ネームスペースありで



## Tips

spl_autoload_register() の第三引数に true を入れると、スタックの一番上に入れてくれるので、よく使われるものはスタックの上の方に登録



## 参考にしたURL

- Composerでの読み方の回答
<a href="http://stackoverflow.com/questions/12818690/using-composers-autoload">php - Using Composers Autoload - Stack Overflow</a>
- PSR-0 に従ってファイルを配置しないと読まないよ
<a href="http://www.infiniteloop.co.jp/docs/psr/psr-0.html">PSR-0（日本語）</a>
- 仕様(英語)
<a href="http://getcomposer.org/doc/04-schema.md#autoload">Composer</a>
MacOSX上のVirtualBoxにMacOSXをインストール

ネットワークの実験で、ゲストにWindows使うのがたるかったので構築。

USBブートの準備してたら、VirtualBoxではUSBブートできなかったので、CDイメージつくってそこから読む。

- 参考 : http://ritalin.github.io/2012/12-17/hentai-advent-2012/
gitBREAKのprivateリポジトリをcloneする方法

# gitBREAKのprivateリポジトリをcloneする方法

普段からgitを使ってる人は気づくのかもしれないけど、これは気づかなかった。

gitBREAKでPrivateなリポジトリを作成して、URL欄のURLをそのままcloneしてもclone出来なかった。

```
$ git clone https://git.codebreak.com/<ユーザー名>/<リポジトリ名>.git
Initialized empty Git repository in <なんかのパス>
error: The requested URL returned error: 401 Unauthorized while accessing https://git.codebreak.com/<ユーザ名>/<リポジトリ名>.git/info/refs

fatal: HTTP request failed

```

これの解消方法

```
$ git clone https://<ユーザ名>@git.codebreak.com/<ユーザ名>/<リポジトリ名>.git
```

これで解決した。

URL欄に完全に騙された件。

Privateリポジトリの時だけURL欄変更するようにしてくれないかな。
XImageのイメージをテクスチャに取り込む

そんな大層なものじゃないけどちょっとした処理の流れ。

```cpp:
	glBindTexture(GL_TEXTURE_2D, tID);
	glPixelStorei(GL_PACK_ALIGNMENT, 4);
	glTexImage2D(
		GL_TEXTURE_2D, 0, GL_RGB, w, h, 0,
		GL_BGRA, GL_UNSIGNED_BYTE, (*wImage).data);
```

こんな感じにテクスチャをbindして、アラインを指定して(GL_UNPACK_ALIGNMENT, 1でもおｋ)、格納先フォーマットをGL_RGB、取り込むフォーマットをGL_BGRAにしとくというだけの話。ZPixmapのXImageは画面が24bitsモードだと32bitsパックドなのでGL_BGRAにしてアルファ付きにしとく。あと、XImageでは並びがRGBじゃなくてBGRAらしい。

ちなみに、私ゃテクスチャのバインドを忘れてしばらく混乱してたよ。

それと、これはサイズが2のn乗ってのは考慮してない。考慮するなら...

```cpp:
	const int w(1024); //試験用の値なので固定値になってる。実際にはサイズ以上の2^n値を計算する
	const int h(1024); //同上
	wImage = XCreateImage(
		xDisplay,
		DefaultVisual(xDisplay,0),
		DefaultDepth(xDisplay,0),
		ZPixmap,0,0,w,h,32,0);
	(*wImage).data = (char*)malloc(w * h * 4);
	assert(wImage);
	XGetSubImage(
		xDisplay,
		wID,
		0, 0,
		width, height,
		AllPlanes,
		ZPixmap,
		wImage,
		0, 0);
```

...みたいに一旦XImage構造を作ってからXGetSubImageで部分書き換えするといい。
Xの窓をキャプチャする方法

こんなことCompositeなWindowManagerでも作らなきゃしないだろうけど、そういうのを作ってるのでメモ。

###まず窓のバッキングストアを使うようにする。
窓作ったらすぐやっとくといい。あるいは起動したら根窓に対してやっとく。

```cpp:
XCompositeRedirectSubwindows(xDisplay, rootWindowID, CompositeRedirectManual);
```

こんな塩梅。わかるだろうけどxDisplayはDisplay*ね。これは既に開いているものもこれから開くものも全て含めてrootWindowIDの子に全部適用されるので、特定の窓だけに適用したければ

```cpp:
XCompositeRedirectWindow(xDisplay, windowID, CompositeRedirectAutomatic);
```

みたいにする。最後の引数のCompositeRedirectManualは描画したものを実際の窓には(自動では)描画しない設定。CompositeRedirectAutomaticを指定すると描画したものが実際の窓にも反映される。素の窓を表示したくなければManual一択。普通にキャプチャしたければAutomatic。

逆に(あまりやらないだろうけど)これらの指定を解除することもできる。詳しくはmanすれ。

###で、キャプチャする。

```cpp:
XGetImage(xDisplay, windowID, 0, 0, width, height, AllPlanes, ZPixmap);
```

とかすればキャプチャされたXImage型のポインタが返ってくる。引数の0,0はキャプチャする左上。ZPixmapはイマドキXYPixmapとか指定しないだろうからそのままでいい(XYPixmapはプレーン型、ZPixmapはパックドピクセル)。AllPlanesはプレーンのマスク指定(全部有効)で普通はこれを使う。それと、これには部分キャプチャ用のバリアントがあるけど例によってmanすれ。

ただし、これは窓がマップされたあとにすること。マップ前の窓にやってもnullが返ってくるだけだ。

XImageを廃棄するときはXDestroyImageにくべてやればいいが、こいつはXImageの中のdataメンバの先まで開放する。このdataメンバはXCreateImageとかでXImage構造を作るときはmallocしてやらなければならないのにXDestroyImageでは勝手に解放されるので注意だ。

###...というのは間違い。
上のXGetImageを使う方法はXCompositeは使ってないのでその関係の設定は不要。いちいちメインメモリ経由で転送されるので遅いけど。

###XCompositeを使う方法
XCompositeを使う方法だとXCompositeNameWindowPixmapでpixmapのIDを取得し、それをglXBindTexImageEXTでテクスチャとしてbindして、そのままOpenGLのポリゴンを描画するといちいちメインメモリに取り出さずに描画できるらしい...が、詳細は調査中。
DeferredオブジェクトのNullオブジェクトを作る


jQueryでDeferredオブジェクトをゴリゴリ作ってると、時々DeferredのNullオブジェクトが欲しくなる。
JavaScriptはダックタイピングな言語なので、単純にDeferredオブジェクトのインターフェース持ったオブジェクト作ればいいと思う。

```JavaScript
$.extend({
	nullDeferred: (function(){
		function returnThis(){ return this; }

		var promise = {};

		// 基本はメソッドチェーンできるメソッドなので、自身を返すメソッドを生やす
		for(var n in $.Deferred().promise()){
			promise[n] = returnThis;
		}
		// 例外的にその他オブジェクトを返すメソッドを決め打ちで生やす
		$.extend(promise, {
			state: function(){ return ''; },
			then: function(){ return promise; },
			promise: function(){ return promise; }
		});

		var deferred = {};

		for(var n in $.Deferred()){
			deferred[n] = returnThis;
		}
		// deferred にも例外のメソッドを生やす
		$.extend(deferred, promise);

		return function(){ return deferred; };
	}())
});
```

バージョンアップでAPI変わったらどうしようかな。。。

なにはともあれ、これでメソッドチェーンを切らずに不要なコールバックを虚空の彼方へ飛ばせる。

```JavaScript
$.nullDeferred()
	.done(function(){ console.log('アリアハンへ ようこそ!'); });
	.resolve(); // へんじがない、ただの Null オブジェクトのようだ。
```

ちなみに、`$.when`の引数にこのNullオブジェクトが含まれていると、成功時のコールバックが呼ばれなくなるので要注意。
emacsでバイナリファイルを編集する

以下のコマンドを入力する。
M-x hexl-find-file
コマンド入力後、編集するファイルを選択する。

参考
[バイナリファイルを編集するには](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/124editbinary.html)
FabookGroup を作成できる GraphAPI 調査メモ


FacebookGraphAPIのドキュメントに「[App and Game Groups](https://developers.facebook.com/docs/reference/api/app-game-groups/)」という項目があり、「これでアプリからグループ作成ができる！」と思って調査しました。  

# 結論
## グループ作成APIは使えません！

# 以下、調査記録

### 1. 適当なFacebookアプリを作成
[アプリ管理画面](https://developers.facebook.com/apps)から新規アプリを作成します。  

### 2. Graph API Explorerで検証
[Graph API Explorer](https://developers.facebook.com/tools/explorer)の「アクセストークン」にアプリ用アクセストークンを入力します。
アプリ用アクセストークンはAPP IDとApp Secretをパイプ(|)でつないだものになります。  

```
{App ID}|{App Secret}
```

グループ作成は
POSTメソッドで、

```
{APP ID}/groups
```

に対して
nameパラメータを渡すことで作成可能です。
（他にもsecret、description、adminというパラメータを追加することができます）

しかし、

```
{
  "error": "Request failed"
}
```

というレスポンスが返ってきてグループを作成することができません。

ドキュメントにも

```
App and Game Groups is currently in Beta
```
とあるのでこちらのAPIは使えないようです。

残念。

## 補足情報

過去に作成したFacebookアプリで試してみたところ、
1つのみですがグループを作成することができました。
2つ目以降を作成しようとすると

```
{
  "error": "Request failed"
}
```

となってしまいます。
というわけでやはりAPI経由でグループ作成をするのは現実的でないようです。


## 参考
* [App and Game Groups](https://developers.facebook.com/docs/reference/api/app-game-groups/)
RailsのDeviseでログイン関係のlayoutを変更する


How To: Create custom layouts
https://github.com/plataformatec/devise/wiki/How-To:-Create-custom-layouts

に書いてある。
いくつか方法があり`devise_controller?`というメソッドを使ってコントローラのフィルターにする方法が最初に掲載されているが、なんか気持ち悪いのでconfigで変更する方法を使った。

```Ruby
config.to_prepare do
  Devise::SessionsController.layout "devise"
  Devise::RegistrationsController.layout proc{ |controller| user_signed_in? ? "application" : "devise" }
  Devise::ConfirmationsController.layout "devise"
  Devise::UnlocksController.layout "devise"            
  Devise::PasswordsController.layout "devise"        
end
```
TwitterStream/eventmachineでエラー

[TwitterStream](https://github.com/tweetstream/tweetstream)を使おうと思ったらエラーになった。
遭遇した出力は以下の通り。

```
terminate called after throwing an instance of 'std::runtime_error'
  what():  Encryption not available on this event-machine
```
ググったらそこそこ引っかかったので何か特殊な問題かと思ったが、何のことはなく。
eventmachineのinstall時にSSLが有効にならなかったせいだった模様。

一旦eventmachineをuninstall後、OS側でlibssl-devパッケージをインストール。
再度eventmachineをinstallすることで回避完了。
普段あまり使ってない環境だと起こるかも？

と、せっかくなのでとりあえずなんか書いてみた。
IntelliJの正規表現書きが捗る機能

IntelliJでは、コード中に書いてある正規表現がどんな文字列にマッチするのか、エディタ内で簡単に動作確認することができます。

## Javaの場合

Javaのコードで例を示します。

```java:
Pattern pattern = Pattern.compile("\\d{2}-\\d{4}-\\d{4}");
```

例えば、こんな感じの電話番号っぽい文字列にマッチしたい正規表現を書くとします。
そして、IntelliJのエディタ内で正規表現部分にカーソルを合わせ、Alt + Enterを押すと以下のようなメニューが出てきます。

![Screenshot from 2013-08-16 15:55:02.png](https://qiita-image-store.s3.amazonaws.com/0/1784/2a1bfa21-31eb-0001-7725-290c50a8f20a.png)

この "Check Regexp" を選択すると、このようなダイアログが表示されます。

![Screenshot from 2013-08-16 15:58:08.png](https://qiita-image-store.s3.amazonaws.com/0/1784/5ddd8af7-9bc8-9a08-b621-47ef098baf8e.png)

この中で、正規表現でマッチさせたい文字列を "Sample" の中に入力することで、先程の正規表現にマッチするかどうかを色で示してくれるのです。
今は、 "Samlple" に何も入力していないので赤( =失敗 )です。

では、ここに "03-3333-3333" を入力してみます。

![Screenshot from 2013-08-16 15:59:59.png](https://qiita-image-store.s3.amazonaws.com/0/1784/129295c4-4da1-931e-cf6e-c2d319dc5d6d.png)

そうすると、入力欄がグリーンになりました！
これで、この文字列にマッチするという事がわかります。

## JavaScriptの場合

JavaScriptでも全く同様です(IntelliJの有償版で確認しました。多分WebStormも同じです)。

![Screenshot from 2013-08-16 16:57:33.png](https://qiita-image-store.s3.amazonaws.com/0/1784/d33aa8fb-ffdc-b9a2-62bd-78be4214eb3f.png)

## 正規表現として扱う箇所の設定

コード中のどの部分を正規表現として扱うのかは、Settings > Language Injections の Language が RegExp になっている箇所を見るとなんとなく分かるかと思います。
ここではある特定のメソッドやアノテーションに渡されている文字列は正規表現として解釈するように設定することが可能です。

## まとめ

IntelliJではコード中の正規表現がどんな文字列にマッチするか、簡単に確認することができます。
今回はJavaとJavaScriptでしか確認してませんが、是非お試しあれ！
xyzzyの  beginning-of-virtual-line や end-of-virtual-line をEmacsで使いたい

Emacsで物理行じゃなくて見せかけの倫理行で移動を行いたかったので調べたけど
virtual-lineで検索しても何も出てこなくて困ってたら
Emacsでは virtual-line じゃなくて visual-line を使うらしい。見た目が似てるのでややこしい。

### 追記
global-set-key だと行末移動がおかしかったので質問したら
`global-visual-line-mode`を使うといいと教えてもらった。ありがとうDanielさん。

```el:~/.emacs.d/inits/00-keybind.el
;; Use visual-line-mode
(setq visual-line-fringe-indicators '(left-curly-arrow right-curly-arrow))
(global-visual-line-mode 1)
```

※ `visual-line-fringe-indicators`がないと折り返し行の横の矢印が表示されない。
chefspecを使いbundle exec rspec cookbook実行後にエラーが起きた場合の対処

# chefspecを使おうと思ったのだけど...

[chefspec](https://github.com/acrmp/chefspec)を使おうと思ったのだけど、
```bundle exec rspec cookbooks``` ができない...
テストがコケるというレベルじゃなく、実行ができない。ツライ。

```csh:
> bundle exec rspec invite-goraku-bu
/Users/futoase/yuruyuri/vendor/bundle/ruby/2.0.0/gems/chef-11.4.4/l
ib/chef/provider/package/rubygems.rb:34:in `require': cannot load such file -- r
ubygems/format (LoadError)
```

ぐぐってみたら以下のエントリがでてきた。
Ruby 2.0.0リリース時にgem周り変わったのか。

[Ruby2.0でchefを動かそうとするとkernel_require.rb:45:in `require': cannot load such file -- rubygems/format](http://d.hatena.ne.jp/ria10/20130517/1368804129)

# 問題の対策

Ruby 2.0.0は使いたい。chefspecのために1.9.3に切り替えるとか面倒くさい。

この問題の対処方法として、
[rubygems-format-dummy](https://github.com/ataka/rubygems-format-dummy)をインストールして凌ぐ方法がある。

[README.md](https://github.com/ataka/rubygems-format-dummy/blob/6df735248b1d1775e3edd8091257a5d0750510a6/README.md)にあるように、gemに以下の行を追記して、
インストールすれば良い。

```rb:Gemfile
gem 'rubygems-format-dummy', :git => 'git://github.com/ataka/rubygems-format-dummy.git'
```

インストールすれば怒られることも無くなる。
chef周り、こういうのあるけど早く時代に追いついてくれないものか...

# 他

enchantMOON良い
xmlで定義した要素の上にaddViewで挿入するには

````````
layout.addView(view, index);
````````

xmlで定義済みの要素に0,1,2...と番号が振られているっぽいので
そこにindexを指定して突っ込む.

ref: [ViewManager | Android Developers](http://developer.android.com/reference/android/view/ViewManager.html#addView(android.view.View,%20android.view.ViewGroup.LayoutParams))
gitの特定のディレクトリをブランチ毎別リポジトリにする方法

baseprojectという名前のリポジトリの中にあるsubprojectというディレクトリを、別のリポジトリとして分離する方法です。
その際、必要なブランチも全部移行します。

まず新しく作るリポジトリ用のディレクトリを作ります。

```
mkdir ~/subproject
```

新しく作ったディレクトリに元のプロジェクトをcloneしてやります。

```
cd ~/
git clone baseproject subproject
```

git filter-branch --subdirectory-filterを使えば指定したディレクトリに関する情報だけ抽出されます。
-- --allをつけると全てのブランチ情報も一緒に抽出されます。

```
cd ~/subproject/
git filter-branch --subdirectory-filter subproject -- --all
```

元のブランチがリモートブランチとして移行できたかを確認します。

```
git branch -a
```

移行する必要があるブランチをあらかじめcheckoutしておきます。

```
git checkout -b origin/feature001
git checkout -b origin/feature002
```

あとは全部pushするだけ！

```
git remote rm origin
git remote add origin git@github.com:hoge/subproject.git
git push --all
```
EngineYard で動く Rails アプリで Bower を使う


## 環境等

* EngineYard (stable-v4)
* Ruby 2.0.0
* Rails 4.0
* Bower 1.1.0

## package.json

EngineYard は node.js アプリもサポートしているので、package.json があると自動的にそれに従ってインストールが走るようです。

package.json は RAILS_ROOT に置いておきます。

```javascript:RAILS_ROOT/package.json
{
  "name": "app_name",
  "version": "0.0.1",
  "dependencies": {
    "bower": "1.1.0"
  }
}
```

たんに npm install をしているだけなので、通常と同じように RAILS_ROOT の `node_modules` ディレクトリにインストールされます。

## deploy/before_compile_assets.rb

bower でのインストールは assets precompile の前までには終わらせておきたいので、EngineYard の deploy フックのうち、before_compile_assets というものを使います。

```ruby:RAILS_ROOT/deploy/before_compile_assets.rb
run! './node_modules/.bin/bower install'
```

あとは .bowerrc / bower.json 等々に従ってよしなにやってくれるでしょう。
simple_form で text や textarea の入力フィールドへの入力文字数を表示する

simple_form で text や textarea の入力フィールドへの入力文字数を表示する例をつくってみました。

![014_idea_form_edit_1.png](https://qiita-image-store.s3.amazonaws.com/0/14958/dcc752d3-7d60-cfb8-c4b8-9b92aa342088.png)

コード全体は以下に。
https://github.com/katoy/rails3-associations

方法の概要：
* simple_form の input タグで :help => "_" を指定して、help 表示領域をつくる。
 * input エリアでの　keydown, keyup, keypress, change イベントを捕まえて、ヘルプ領域へ文字列長さを表示する。

* 関連するファイルは３つ。
   1. view: (simple_form での入力画面)   app/views/idea/_form.html.erb
   2. この画面についての javascript        app/assets/javascripts/idea.js.coffee
   3. 処理本体を定義した javascript        app/assets/javascripts/counter.js.coffee

- 1. view: (simple_form での入力画面) app/views/idea/_form.html.erb
    $ cat app/views/ideas/_form.html.erb 
    <%= simple_form_for(@idea, :html => {:class => 'form-horizontal' }) do |f| %>
      <%= f.hidden_field :lock_version %>
      <%= f.input :name, :required => true, :hint => "" %>
      <%= f.input :description, input_html: { class: 'span8', rows: 3 }, :required => true, :hint => "" %>
      <%= f.input :picture %>
      <div class="controls">
        <%= f.button :submit %>
        <%= link_to I18n.t(:cancel, scope: :"views.buttons"), :back, class: :btn %>
      </div>
    <% end %>

- 2. この画面についての javascript        app/assets/javascripts/idea.js.coffee

    $ cat app/assets/javascripts/ideas.js.coffee 
    $ ->
      if $("#idea_name").val() != undefined 
        counter_bind('#idea_name', 32)
        counter_bind('#idea_description', 4000)

- 3. 処理本体を定義した javascript        app/assets/javascripts/counter.js.coffee

    $ cat app/assets/javascripts/counter.js.coffee 
    ＃ 入力文字列数を表示する。
    ＃ id                 入力フォーム (text, textarea) の id
    ＃ maxLen             最大文字列数
    ＃ couter_selecto     カウンタを表示する selector. default = id + " ~ .help-block:nth-of-type(1)  (simple_form の  help 領域)
    ＃ preffix            カウンタ数の前に付加する文字列.  defaule = ""
    ＃ postfix            カウンタ数の後に付加する文字列.  default = " / maxLen chars"
    @counter_bind = (id, maxLen, counter_selector = id + " ~ .help-block:nth-of-type(1)", prefix = "", postfix = " / #{maxLen} chars") ->
    
      if $(id) and $(id).val() != `undefined`
        $(counter_selector).html "#{prefix}#{$(id).val().length}#{postfix}"
    
      $(id).bind "keydown keyup keypress change", ->
        $(counter_selector).html "#{prefix}#{$(this).val().length}#{postfix}"
addObserverをクラスメソッドの中で行う場合


ちょっとハマったのでメモ。

クラスメソッドの中でaddObserverしたら、selectorもクラスメソッドでないといけないみたい。そりゃそうか、インスタンスが無い中でインスタンスメソッドをselectorで指定できるのもおかしいか。
Rails.env.test?みたいなやつを普通の文字列でもヤりたい


```ruby
a= 'hoge'
a.hoge? # NoMethodError: undefined method `hoge?' for "hoge":String
a = ActiveSupport::StringInquirer.new('hoge')
a.hoge? # => true
```

アホ毛がtrueに！

[ActiveSupportのStringInquirer](http://api.rubyonrails.org/classes/ActiveSupport/StringInquirer.html)というClassの機能みたいです。

[@udzura](http://twitter.com/udzura) 先生が教えてくれました。ありがとうございます！
「Code Sign error : Command /usr/bin/codesign failed with exit code 1」を解決しました…

# 概要

日頃チームでiOS開発をしているのですが、AppStoreへの申請は社内の1つのMacから行うようにしています。
そんなMacに悲劇が。
AppStore申請用のビルドができない！！

エラーはざっくり書くとこんな感じ。

```
Code Sign error : Command /usr/bin/codesign failed with exit code 1
```

# トラブルシューティング

## 証明書を疑う

いろいろ調べたところ新しい証明書と古い証明書が混在している場合に起こる、
など、とにかく証明書に問題がある場合に発生するということがわかった。

キーチェーンアクセスを開いてみると、
AppStore申請用の証明書自体は最新のものになっているが、

「この証明書は不明な機関によって署名されています」

と表示されている。


またいろいろ調べたところ、どうも中間認証局の役割を果たす
「Apple Worldwide Developer Relations Certification Authority」
という証明書が存在していないと信頼できる証明書とみなされないらしい。

cf.
*キーチェーンの開発用証明書や配布用証明書は、Apple Worldwide Developer Relations Certification Authorityの証明書がなければ有効になりません。*
[iOS開発ガイド: iOS開発におけるトラブルシューティング](https://developer.apple.com/jp/devcenter/ios/library/documentation/Xcode/Conceptual/ios_development_workflow/190-iOS_Development_Troubleshooting_Guide/ios_development_troubleshooting.html#//apple_ref/doc/uid/TP40007959-CH25-SW7 "iOS開発ガイド: iOS開発におけるトラブルシューティング")

というわけでなぜかこの証明書が存在していなかったので、
開発で使っている別のMacから持ってきてやりました。

これで無事「この証明書は有効です」と表示されました。

## キーチェーンアクセスを疑う

しかし、今回の場合さらに罠が…
上記だけでは解決せず、もう一つ問題がありました。

とある理由でキーチェーンに保存されているパスワードを確認しようとしたところ、

「この項目へのアクセスは制限されています」

と表示され確認できない…

こんなことも未経験だったので調べてみたところ、
ログ速が検索に引っかかる。

```
11 ： 名称未設定[sage] 投稿日：2009/03/29(日) 10:18:21 ID:rLl/pMwt0 [1/1回(PC)]
>>7 
一週間くらいまえ、突然ブラウザのオートフィルが効かなくなった。 
Keychain Access.appでパスワードを確認しようとしたら、キーチェーンのパスを入れても 
「この項目へのアクセスが制限されています」とか出てパスワードは表示されず。 
しばらく血の気が引いた。キーチェーン自体のロック／アンロックを繰り返したら直ったけど。 

ちなみにFirstAidでもディスクユーティリティーのアクセス権修復でも異常は検出されなかった。 
なんだったんだろうあれ。
```

[キーチェーンにはまって、時間を無駄にした人→ | ログ速](http://www.logsoku.com/r/mac/1238236074/ "キーチェーンにはまって、時間を無駄にした人→ | ログ速")


まさにこれ！！！！！！！
まさかログ速が役立つとは思いませんでした。

上記のようにロック→アンロックしてみました。
おお、本当に問題が解決した。

## キーチェーンアクセスのバグ

あれ、もしかしてこれキーチェーンアクセスがバグってたんじゃね…
と勘ぐってこのタイミングで再度ビルド。

通った━━━━(ﾟ∀ﾟ)━━━━!!


というわけで非常にレアケースだとは思うのですが、
こんなこともあるよーというお話…
sshの秘密鍵と公開鍵のセットが正しいか確認する方法

すぐ忘れそうなのでメモ。

```
% ssh-keygent -y -f <private_key>
```

これで公開鍵が再度出力されるので、これと見比べる

再作成したいなら

```
% ssh-keygen -e -f <private_key> [-m <key_format>]
```